From e0464e1304283a34d94e73fcd169ee4df827bb7c Mon Sep 17 00:00:00 2001 From: Andrei Kashcha Date: Fri, 21 Apr 2017 15:03:04 -0700 Subject: [PATCH 01/49] Update README.md Removing note update performance. It was written long time ago, and I need to re-run performance measurements again. Until then, removing the note to not mislead people --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 7f031f5..5c97cf9 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ VivaGraph [![Build Status](https://travis-ci.org/anvaka/VivaGraphJS.svg)](https://travis-ci.org/anvaka/VivaGraphJS) ================================================== -**VivaGraphJS** is the fastest graph drawing javascript library ([proof](https://www.youtube.com/watch?v=Ax7KSQZ0_hk)). It is designed to be extensible and to support different +**VivaGraphJS** is designed to be extensible and to support different rendering engines and layout algorithms. Underlying modules can be found via [ngraph](https://www.npmjs.com/search?q=ngraph) query. [![Gitter](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/anvaka/VivaGraphJS?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge) From dc8a2b05fdfaed5df0120630763a5e3cf4b4b092 Mon Sep 17 00:00:00 2001 From: Tomasz Cichocinski Date: Sun, 23 Apr 2017 23:31:59 +0200 Subject: [PATCH 02/49] Fire public event on renderer drag action --- src/View/renderer.js | 1 + 1 file changed, 1 insertion(+) diff --git a/src/View/renderer.js b/src/View/renderer.js index 558cb85..9d723f2 100644 --- a/src/View/renderer.js +++ b/src/View/renderer.js @@ -435,6 +435,7 @@ function renderer(graph, settings) { graphics.translateRel(offset.x, offset.y); renderGraph(); + publicEvents.fire('drag', offset); }); } From b9c8ddde88e8b0fdb68cb5f8e0be16850c37cf63 Mon Sep 17 00:00:00 2001 From: Andriy Kashcha Date: Mon, 24 Apr 2017 21:45:09 -0700 Subject: [PATCH 03/49] applying patch --- dist/vivagraph.js | 3325 +++++++++++++++++++++-------------------- dist/vivagraph.min.js | 4 +- 2 files changed, 1665 insertions(+), 1664 deletions(-) diff --git a/dist/vivagraph.js b/dist/vivagraph.js index de13506..29c4caa 100644 --- a/dist/vivagraph.js +++ b/dist/vivagraph.js @@ -112,7 +112,55 @@ Viva.Graph = { module.exports = Viva; -},{"./Algorithms/centrality.js":32,"./Algorithms/operations.js":33,"./Input/domInputManager.js":34,"./Input/dragndrop.js":35,"./Input/webglInputManager.js":36,"./Layout/constant.js":37,"./Utils/backwardCompatibleEvents.js":38,"./Utils/browserInfo.js":39,"./Utils/findElementPosition.js":41,"./Utils/getDimensions.js":42,"./Utils/intersectRect.js":43,"./Utils/rect.js":45,"./Utils/timer.js":46,"./View/renderer.js":48,"./View/svgGraphics.js":49,"./View/webglGraphics.js":50,"./WebGL/parseColor.js":51,"./WebGL/texture.js":52,"./WebGL/webgl.js":53,"./WebGL/webglAtlas.js":54,"./WebGL/webglImage.js":55,"./WebGL/webglImageNodeProgram.js":56,"./WebGL/webglInputEvents.js":57,"./WebGL/webglLine.js":58,"./WebGL/webglLinkProgram.js":59,"./WebGL/webglNodeProgram.js":60,"./WebGL/webglSquare.js":61,"./version.js":62,"gintersect":2,"ngraph.events":6,"ngraph.forcelayout":7,"ngraph.fromjson":21,"ngraph.generators":22,"ngraph.graph":23,"ngraph.merge":24,"ngraph.random":25,"ngraph.tojson":26,"simplesvg":27}],2:[function(require,module,exports){ +},{"./Algorithms/centrality.js":32,"./Algorithms/operations.js":33,"./Input/domInputManager.js":34,"./Input/dragndrop.js":35,"./Input/webglInputManager.js":36,"./Layout/constant.js":37,"./Utils/backwardCompatibleEvents.js":38,"./Utils/browserInfo.js":39,"./Utils/findElementPosition.js":41,"./Utils/getDimensions.js":42,"./Utils/intersectRect.js":43,"./Utils/rect.js":45,"./Utils/timer.js":46,"./View/renderer.js":48,"./View/svgGraphics.js":49,"./View/webglGraphics.js":50,"./WebGL/parseColor.js":51,"./WebGL/texture.js":52,"./WebGL/webgl.js":53,"./WebGL/webglAtlas.js":54,"./WebGL/webglImage.js":55,"./WebGL/webglImageNodeProgram.js":56,"./WebGL/webglInputEvents.js":57,"./WebGL/webglLine.js":58,"./WebGL/webglLinkProgram.js":59,"./WebGL/webglNodeProgram.js":60,"./WebGL/webglSquare.js":61,"./version.js":62,"gintersect":3,"ngraph.events":7,"ngraph.forcelayout":9,"ngraph.fromjson":10,"ngraph.generators":11,"ngraph.graph":12,"ngraph.merge":13,"ngraph.random":26,"ngraph.tojson":27,"simplesvg":28}],2:[function(require,module,exports){ +addEventListener.removeEventListener = removeEventListener +addEventListener.addEventListener = addEventListener + +module.exports = addEventListener + +var Events = null + +function addEventListener(el, eventName, listener, useCapture) { + Events = Events || ( + document.addEventListener ? + {add: stdAttach, rm: stdDetach} : + {add: oldIEAttach, rm: oldIEDetach} + ) + + return Events.add(el, eventName, listener, useCapture) +} + +function removeEventListener(el, eventName, listener, useCapture) { + Events = Events || ( + document.addEventListener ? + {add: stdAttach, rm: stdDetach} : + {add: oldIEAttach, rm: oldIEDetach} + ) + + return Events.rm(el, eventName, listener, useCapture) +} + +function stdAttach(el, eventName, listener, useCapture) { + el.addEventListener(eventName, listener, useCapture) +} + +function stdDetach(el, eventName, listener, useCapture) { + el.removeEventListener(eventName, listener, useCapture) +} + +function oldIEAttach(el, eventName, listener, useCapture) { + if(useCapture) { + throw new Error('cannot useCapture in oldIE') + } + + el.attachEvent('on' + eventName, listener) +} + +function oldIEDetach(el, eventName, listener, useCapture) { + el.detachEvent('on' + eventName, listener) +} + +},{}],3:[function(require,module,exports){ module.exports = intersect; /** @@ -213,11 +261,11 @@ function intersect( return result; } -},{}],3:[function(require,module,exports){ +},{}],4:[function(require,module,exports){ module.exports.degree = require('./src/degree.js'); module.exports.betweenness = require('./src/betweenness.js'); -},{"./src/betweenness.js":4,"./src/degree.js":5}],4:[function(require,module,exports){ +},{"./src/betweenness.js":5,"./src/degree.js":6}],5:[function(require,module,exports){ module.exports = betweennes; /** @@ -329,7 +377,7 @@ function betweennes(graph, oriented) { } } -},{}],5:[function(require,module,exports){ +},{}],6:[function(require,module,exports){ module.exports = degree; /** @@ -390,7 +438,7 @@ function inoutDegreeCalculator(links) { return links.length; } -},{}],6:[function(require,module,exports){ +},{}],7:[function(require,module,exports){ module.exports = function(subject) { validateSubject(subject); @@ -480,7 +528,53 @@ function validateSubject(subject) { } } -},{}],7:[function(require,module,exports){ +},{}],8:[function(require,module,exports){ +module.exports = exposeProperties; + +/** + * Augments `target` object with getter/setter functions, which modify settings + * + * @example + * var target = {}; + * exposeProperties({ age: 42}, target); + * target.age(); // returns 42 + * target.age(24); // make age 24; + * + * var filteredTarget = {}; + * exposeProperties({ age: 42, name: 'John'}, filteredTarget, ['name']); + * filteredTarget.name(); // returns 'John' + * filteredTarget.age === undefined; // true + */ +function exposeProperties(settings, target, filter) { + var needsFilter = Object.prototype.toString.call(filter) === '[object Array]'; + if (needsFilter) { + for (var i = 0; i < filter.length; ++i) { + augment(settings, target, filter[i]); + } + } else { + for (var key in settings) { + augment(settings, target, key); + } + } +} + +function augment(source, target, key) { + if (source.hasOwnProperty(key)) { + if (typeof target[key] === 'function') { + // this accessor is already defined. Ignore it + return; + } + target[key] = function (value) { + if (value !== undefined) { + source[key] = value; + return target; + } + return source[key]; + } + } +} + +},{}],9:[function(require,module,exports){ module.exports = createLayout; module.exports.simulator = require('ngraph.physics.simulator'); @@ -784,1952 +878,1906 @@ function createLayout(graph, physicsSettings) { function noop() { } -},{"ngraph.physics.simulator":8}],8:[function(require,module,exports){ -/** - * Manages a simulation of physical forces acting on bodies and springs. - */ -module.exports = physicsSimulator; +},{"ngraph.physics.simulator":15}],10:[function(require,module,exports){ +module.exports = load; -function physicsSimulator(settings) { - var Spring = require('./lib/spring'); - var expose = require('ngraph.expose'); - var merge = require('ngraph.merge'); +var createGraph = require('ngraph.graph'); - settings = merge(settings, { - /** - * Ideal length for links (springs in physical model). - */ - springLength: 30, +function load(jsonGraph, nodeTransform, linkTransform) { + var stored; + nodeTransform = nodeTransform || id; + linkTransform = linkTransform || id; + if (typeof jsonGraph === 'string') { + stored = JSON.parse(jsonGraph); + } else { + stored = jsonGraph; + } - /** - * Hook's law coefficient. 1 - solid spring. - */ - springCoeff: 0.0008, + var graph = createGraph(), + i; - /** - * Coulomb's law coefficient. It's used to repel nodes thus should be negative - * if you make it positive nodes start attract each other :). - */ - gravity: -1.2, + if (stored.links === undefined || stored.nodes === undefined) { + throw new Error('Cannot load graph without links and nodes'); + } - /** - * Theta coefficient from Barnes Hut simulation. Ranged between (0, 1). - * The closer it's to 1 the more nodes algorithm will have to go through. - * Setting it to one makes Barnes Hut simulation no different from - * brute-force forces calculation (each node is considered). - */ - theta: 0.8, + for (i = 0; i < stored.nodes.length; ++i) { + var parsedNode = nodeTransform(stored.nodes[i]); + if (!parsedNode.hasOwnProperty('id')) { + throw new Error('Graph node format is invalid: Node id is missing'); + } - /** - * Drag force coefficient. Used to slow down system, thus should be less than 1. - * The closer it is to 0 the less tight system will be. - */ - dragCoeff: 0.02, + graph.addNode(parsedNode.id, parsedNode.data); + } - /** - * Default time step (dt) for forces integration - */ - timeStep : 20, + for (i = 0; i < stored.links.length; ++i) { + var link = linkTransform(stored.links[i]); + if (!link.hasOwnProperty('fromId') || !link.hasOwnProperty('toId')) { + throw new Error('Graph link format is invalid. Both fromId and toId are required'); + } - /** - * Maximum movement of the system which can be considered as stabilized - */ - stableThreshold: 0.009 - }); + graph.addLink(link.fromId, link.toId, link.data); + } - // We allow clients to override basic factory methods: - var createQuadTree = settings.createQuadTree || require('ngraph.quadtreebh'); - var createBounds = settings.createBounds || require('./lib/bounds'); - var createDragForce = settings.createDragForce || require('./lib/dragForce'); - var createSpringForce = settings.createSpringForce || require('./lib/springForce'); - var integrate = settings.integrator || require('./lib/eulerIntegrator'); - var createBody = settings.createBody || require('./lib/createBody'); + return graph; +} - var bodies = [], // Bodies in this simulation. - springs = [], // Springs in this simulation. - quadTree = createQuadTree(settings), - bounds = createBounds(bodies, settings), - springForce = createSpringForce(settings), - dragForce = createDragForce(settings); +function id(x) { return x; } - var publicApi = { - /** - * Array of bodies, registered with current simulator - * - * Note: To add new body, use addBody() method. This property is only - * exposed for testing/performance purposes. - */ - bodies: bodies, +},{"ngraph.graph":12}],11:[function(require,module,exports){ +module.exports = { + ladder: ladder, + complete: complete, + completeBipartite: completeBipartite, + balancedBinTree: balancedBinTree, + path: path, + circularLadder: circularLadder, + grid: grid, + grid3: grid3, + noLinks: noLinks, + wattsStrogatz: wattsStrogatz +}; - /** - * Array of springs, registered with current simulator - * - * Note: To add new spring, use addSpring() method. This property is only - * exposed for testing/performance purposes. - */ - springs: springs, +var createGraph = require('ngraph.graph'); - /** - * Returns settings with which current simulator was initialized - */ - settings: settings, +function ladder(n) { +/** + * Ladder graph is a graph in form of ladder + * @param {Number} n Represents number of steps in the ladder + */ + if (!n || n < 0) { + throw new Error("Invalid number of nodes"); + } - /** - * Performs one step of force simulation. - * - * @returns {boolean} true if system is considered stable; False otherwise. - */ - step: function () { - accumulateForces(); - var totalMovement = integrate(bodies, settings.timeStep); + var g = createGraph(), + i; - bounds.update(); + for (i = 0; i < n - 1; ++i) { + g.addLink(i, i + 1); + // first row + g.addLink(n + i, n + i + 1); + // second row + g.addLink(i, n + i); + // ladder's step + } - return totalMovement < settings.stableThreshold; - }, + g.addLink(n - 1, 2 * n - 1); + // last step in the ladder; - /** - * Adds body to the system - * - * @param {ngraph.physics.primitives.Body} body physical body - * - * @returns {ngraph.physics.primitives.Body} added body - */ - addBody: function (body) { - if (!body) { - throw new Error('Body is required'); - } - bodies.push(body); - - return body; - }, - - /** - * Adds body to the system at given position - * - * @param {Object} pos position of a body - * - * @returns {ngraph.physics.primitives.Body} added body - */ - addBodyAt: function (pos) { - if (!pos) { - throw new Error('Body position is required'); - } - var body = createBody(pos); - bodies.push(body); + return g; +} - return body; - }, +function circularLadder(n) { +/** + * Circular ladder with n steps. + * + * @param {Number} n of steps in the ladder. + */ + if (!n || n < 0) { + throw new Error("Invalid number of nodes"); + } - /** - * Removes body from the system - * - * @param {ngraph.physics.primitives.Body} body to remove - * - * @returns {Boolean} true if body found and removed. falsy otherwise; - */ - removeBody: function (body) { - if (!body) { return; } + var g = ladder(n); - var idx = bodies.indexOf(body); - if (idx < 0) { return; } + g.addLink(0, n - 1); + g.addLink(n, 2 * n - 1); + return g; +} - bodies.splice(idx, 1); - if (bodies.length === 0) { - bounds.reset(); - } - return true; - }, +function complete(n) { +/** + * Complete graph Kn. + * + * @param {Number} n represents number of nodes in the complete graph. + */ + if (!n || n < 1) { + throw new Error("At least two nodes are expected for complete graph"); + } - /** - * Adds a spring to this simulation. - * - * @returns {Object} - a handle for a spring. If you want to later remove - * spring pass it to removeSpring() method. - */ - addSpring: function (body1, body2, springLength, springWeight, springCoefficient) { - if (!body1 || !body2) { - throw new Error('Cannot add null spring to force simulator'); - } + var g = createGraph(), + i, + j; - if (typeof springLength !== 'number') { - springLength = -1; // assume global configuration + for (i = 0; i < n; ++i) { + for (j = i + 1; j < n; ++j) { + if (i !== j) { + g.addLink(i, j); } + } + } - var spring = new Spring(body1, body2, springLength, springCoefficient >= 0 ? springCoefficient : -1, springWeight); - springs.push(spring); + return g; +} - // TODO: could mark simulator as dirty. - return spring; - }, +function completeBipartite (n, m) { +/** + * Complete bipartite graph K n,m. Each node in the + * first partition is connected to all nodes in the second partition. + * + * @param {Number} n represents number of nodes in the first graph partition + * @param {Number} m represents number of nodes in the second graph partition + */ + if (!n || !m || n < 0 || m < 0) { + throw new Error("Graph dimensions are invalid. Number of nodes in each partition should be greater than 0"); + } - /** - * Removes spring from the system - * - * @param {Object} spring to remove. Spring is an object returned by addSpring - * - * @returns {Boolean} true if spring found and removed. falsy otherwise; - */ - removeSpring: function (spring) { - if (!spring) { return; } - var idx = springs.indexOf(spring); - if (idx > -1) { - springs.splice(idx, 1); - return true; - } - }, + var g = createGraph(), + i, j; - getBestNewBodyPosition: function (neighbors) { - return bounds.getBestNewPosition(neighbors); - }, + for (i = 0; i < n; ++i) { + for (j = n; j < n + m; ++j) { + g.addLink(i, j); + } + } - /** - * Returns bounding box which covers all bodies - */ - getBBox: function () { - return bounds.box; - }, + return g; +} - gravity: function (value) { - if (value !== undefined) { - settings.gravity = value; - quadTree.options({gravity: value}); - return this; - } else { - return settings.gravity; - } - }, +function path(n) { +/** + * Path graph with n steps. + * + * @param {Number} n number of nodes in the path + */ + if (!n || n < 0) { + throw new Error("Invalid number of nodes"); + } - theta: function (value) { - if (value !== undefined) { - settings.theta = value; - quadTree.options({theta: value}); - return this; - } else { - return settings.theta; - } - } - }; + var g = createGraph(), + i; - // allow settings modification via public API: - expose(settings, publicApi); + g.addNode(0); - return publicApi; + for (i = 1; i < n; ++i) { + g.addLink(i - 1, i); + } - function accumulateForces() { - // Accumulate forces acting on bodies. - var body, - i = bodies.length; + return g; +} - if (i) { - // only add bodies if there the array is not empty: - quadTree.insertBodies(bodies); // performance: O(n * log n) - while (i--) { - body = bodies[i]; - // If body is pinned there is no point updating its forces - it should - // never move: - if (!body.isPinned) { - body.force.reset(); - quadTree.updateBodyForce(body); - dragForce.update(body); - } - } - } +function grid(n, m) { +/** + * Grid graph with n rows and m columns. + * + * @param {Number} n of rows in the graph. + * @param {Number} m of columns in the graph. + */ + if (n < 1 || m < 1) { + throw new Error("Invalid number of nodes in grid graph"); + } + var g = createGraph(), + i, + j; + if (n === 1 && m === 1) { + g.addNode(0); + return g; + } - i = springs.length; - while(i--) { - springForce.update(springs[i]); + for (i = 0; i < n; ++i) { + for (j = 0; j < m; ++j) { + var node = i + j * n; + if (i > 0) { g.addLink(node, i - 1 + j * n); } + if (j > 0) { g.addLink(node, i + (j - 1) * n); } } } -}; - -},{"./lib/bounds":9,"./lib/createBody":10,"./lib/dragForce":11,"./lib/eulerIntegrator":12,"./lib/spring":13,"./lib/springForce":14,"ngraph.expose":15,"ngraph.merge":24,"ngraph.quadtreebh":17}],9:[function(require,module,exports){ -module.exports = function (bodies, settings) { - var random = require('ngraph.random').random(42); - var boundingBox = { x1: 0, y1: 0, x2: 0, y2: 0 }; - - return { - box: boundingBox, - update: updateBoundingBox, + return g; +} - reset : function () { - boundingBox.x1 = boundingBox.y1 = 0; - boundingBox.x2 = boundingBox.y2 = 0; - }, +function grid3(n, m, z) { +/** + * 3D grid with n rows and m columns and z levels. + * + * @param {Number} n of rows in the graph. + * @param {Number} m of columns in the graph. + * @param {Number} z of levels in the graph. + */ + if (n < 1 || m < 1 || z < 1) { + throw new Error("Invalid number of nodes in grid3 graph"); + } + var g = createGraph(), + i, j, k; - getBestNewPosition: function (neighbors) { - var graphRect = boundingBox; + if (n === 1 && m === 1 && z === 1) { + g.addNode(0); + return g; + } - var baseX = 0, baseY = 0; - - if (neighbors.length) { - for (var i = 0; i < neighbors.length; ++i) { - baseX += neighbors[i].pos.x; - baseY += neighbors[i].pos.y; - } - - baseX /= neighbors.length; - baseY /= neighbors.length; - } else { - baseX = (graphRect.x1 + graphRect.x2) / 2; - baseY = (graphRect.y1 + graphRect.y2) / 2; + for (k = 0; k < z; ++k) { + for (i = 0; i < n; ++i) { + for (j = 0; j < m; ++j) { + var level = k * n * m; + var node = i + j * n + level; + if (i > 0) { g.addLink(node, i - 1 + j * n + level); } + if (j > 0) { g.addLink(node, i + (j - 1) * n + level); } + if (k > 0) { g.addLink(node, i + j * n + (k - 1) * n * m ); } } - - var springLength = settings.springLength; - return { - x: baseX + random.next(springLength) - springLength / 2, - y: baseY + random.next(springLength) - springLength / 2 - }; } - }; - - function updateBoundingBox() { - var i = bodies.length; - if (i === 0) { return; } // don't have to wory here. + } - var x1 = Number.MAX_VALUE, - y1 = Number.MAX_VALUE, - x2 = Number.MIN_VALUE, - y2 = Number.MIN_VALUE; + return g; +} - while(i--) { - // this is O(n), could it be done faster with quadtree? - // how about pinned nodes? - var body = bodies[i]; - if (body.isPinned) { - body.pos.x = body.prevPos.x; - body.pos.y = body.prevPos.y; - } else { - body.prevPos.x = body.pos.x; - body.prevPos.y = body.pos.y; - } - if (body.pos.x < x1) { - x1 = body.pos.x; - } - if (body.pos.x > x2) { - x2 = body.pos.x; - } - if (body.pos.y < y1) { - y1 = body.pos.y; - } - if (body.pos.y > y2) { - y2 = body.pos.y; - } - } +function balancedBinTree(n) { +/** + * Balanced binary tree with n levels. + * + * @param {Number} n of levels in the binary tree + */ + if (n < 0) { + throw new Error("Invalid number of nodes in balanced tree"); + } + var g = createGraph(), + count = Math.pow(2, n), + level; - boundingBox.x1 = x1; - boundingBox.x2 = x2; - boundingBox.y1 = y1; - boundingBox.y2 = y2; + if (n === 0) { + g.addNode(1); } -} -},{"ngraph.random":25}],10:[function(require,module,exports){ -var physics = require('ngraph.physics.primitives'); + for (level = 1; level < count; ++level) { + var root = level, + left = root * 2, + right = root * 2 + 1; -module.exports = function(pos) { - return new physics.Body(pos); + g.addLink(root, left); + g.addLink(root, right); + } + + return g; } -},{"ngraph.physics.primitives":16}],11:[function(require,module,exports){ +function noLinks(n) { /** - * Represents drag force, which reduces force value on each step by given - * coefficient. + * Graph with no links * - * @param {Object} options for the drag force - * @param {Number=} options.dragCoeff drag force coefficient. 0.1 by default + * @param {Number} n of nodes in the graph */ -module.exports = function (options) { - var merge = require('ngraph.merge'), - expose = require('ngraph.expose'); - - options = merge(options, { - dragCoeff: 0.02 - }); - - var api = { - update : function (body) { - body.force.x -= options.dragCoeff * body.velocity.x; - body.force.y -= options.dragCoeff * body.velocity.y; - } - }; + if (n < 0) { + throw new Error("Number of nodes shoul be >= 0"); + } - // let easy access to dragCoeff: - expose(options, api, ['dragCoeff']); + var g = createGraph(), i; + for (i = 0; i < n; ++i) { + g.addNode(i); + } - return api; -}; + return g; +} -},{"ngraph.expose":15,"ngraph.merge":24}],12:[function(require,module,exports){ +function wattsStrogatz(n, k, p, seed) { /** - * Performs forces integration, using given timestep. Uses Euler method to solve - * differential equation (http://en.wikipedia.org/wiki/Euler_method ). + * Watts-Strogatz small-world graph. * - * @returns {Number} squared distance of total position updates. - */ + * @param {Number} n The number of nodes + * @param {Number} k Each node is connected to k nearest neighbors in ring topology + * @param {Number} p The probability of rewiring each edge -module.exports = integrate; + * @see https://github.com/networkx/networkx/blob/master/networkx/generators/random_graphs.py + */ + if (k >= n) throw new Error('Choose smaller `k`. It cannot be larger than number of nodes `n`'); -function integrate(bodies, timeStep) { - var dx = 0, tx = 0, - dy = 0, ty = 0, - i, - max = bodies.length; - for (i = 0; i < max; ++i) { - var body = bodies[i], - coeff = timeStep / body.mass; + var random = require('ngraph.random').random(seed || 42); - body.velocity.x += coeff * body.force.x; - body.velocity.y += coeff * body.force.y; - var vx = body.velocity.x, - vy = body.velocity.y, - v = Math.sqrt(vx * vx + vy * vy); + var g = createGraph(), i, to; + for (i = 0; i < n; ++i) { + g.addNode(i); + } - if (v > 1) { - body.velocity.x = vx / v; - body.velocity.y = vy / v; + // connect each node to k/2 neighbors + var neighborsSize = Math.floor(k/2 + 1); + for (var j = 1; j < neighborsSize; ++j) { + for (i = 0; i < n; ++i) { + to = (j + i) % n; + g.addLink(i, to); } + } - dx = timeStep * body.velocity.x; - dy = timeStep * body.velocity.y; - - body.pos.x += dx; - body.pos.y += dy; + // rewire edges from each node + // loop over all nodes in order (label) and neighbors in order (distance) + // no self loops or multiple edges allowed + for (j = 1; j < neighborsSize; ++j) { + for (i = 0; i < n; ++i) { + if (random.nextDouble() < p) { + var from = i; + to = (j + i) % n; - tx += Math.abs(dx); ty += Math.abs(dy); + var newTo = random.next(n); + var needsRewire = (newTo === from || g.hasLink(from, newTo)); + if (needsRewire && g.getLinks(from).length === n - 1) { + // we cannot rewire this node, it has too many links. + continue; + } + // Enforce no self-loops or multiple edges + while (needsRewire) { + newTo = random.next(n); + needsRewire = (newTo === from || g.hasLink(from, newTo)); + } + var link = g.hasLink(from, to); + g.removeLink(link); + g.addLink(from, newTo); + } + } } - return (tx * tx + ty * ty)/bodies.length; + return g; } -},{}],13:[function(require,module,exports){ -module.exports = Spring; +},{"ngraph.graph":12,"ngraph.random":26}],12:[function(require,module,exports){ +/** + * @fileOverview Contains definition of the core graph object. + */ /** - * Represents a physical spring. Spring connects two bodies, has rest length - * stiffness coefficient and optional weight + * @example + * var graph = require('ngraph.graph')(); + * graph.addNode(1); // graph has one node. + * graph.addLink(2, 3); // now graph contains three nodes and one link. + * */ -function Spring(fromBody, toBody, length, coeff, weight) { - this.from = fromBody; - this.to = toBody; - this.length = length; - this.coeff = coeff; +module.exports = createGraph; - this.weight = typeof weight === 'number' ? weight : 1; -}; +var eventify = require('ngraph.events'); -},{}],14:[function(require,module,exports){ /** - * Represents spring force, which updates forces acting on two bodies, conntected - * by a spring. - * - * @param {Object} options for the spring force - * @param {Number=} options.springCoeff spring force coefficient. - * @param {Number=} options.springLength desired length of a spring at rest. + * Creates a new graph */ -module.exports = function (options) { - var merge = require('ngraph.merge'); - var random = require('ngraph.random').random(42); - var expose = require('ngraph.expose'); +function createGraph(options) { + // Graph structure is maintained as dictionary of nodes + // and array of links. Each node has 'links' property which + // hold all links related to that node. And general links + // array is used to speed up all links enumeration. This is inefficient + // in terms of memory, but simplifies coding. + options = options || {}; + if (options.uniqueLinkId === undefined) { + // Request each link id to be unique between same nodes. This negatively + // impacts `addLink()` performance (O(n), where n - number of edges of each + // vertex), but makes operations with multigraphs more accessible. + options.uniqueLinkId = true; + } - options = merge(options, { - springCoeff: 0.0002, - springLength: 80 - }); + var nodes = typeof Object.create === 'function' ? Object.create(null) : {}, + links = [], + // Hash of multi-edges. Used to track ids of edges between same nodes + multiEdges = {}, + nodesCount = 0, + suspendEvents = 0, - var api = { - /** - * Upsates forces acting on a spring - */ - update : function (spring) { - var body1 = spring.from, - body2 = spring.to, - length = spring.length < 0 ? options.springLength : spring.length, - dx = body2.pos.x - body1.pos.x, - dy = body2.pos.y - body1.pos.y, - r = Math.sqrt(dx * dx + dy * dy); - - if (r === 0) { - dx = (random.nextDouble() - 0.5) / 50; - dy = (random.nextDouble() - 0.5) / 50; - r = Math.sqrt(dx * dx + dy * dy); - } - - var d = r - length; - var coeff = ((!spring.coeff || spring.coeff < 0) ? options.springCoeff : spring.coeff) * d / r * spring.weight; - - body1.force.x += coeff * dx; - body1.force.y += coeff * dy; - - body2.force.x -= coeff * dx; - body2.force.y -= coeff * dy; - } - }; - - expose(options, api, ['springCoeff', 'springLength']); - return api; -} - -},{"ngraph.expose":15,"ngraph.merge":24,"ngraph.random":25}],15:[function(require,module,exports){ -module.exports = exposeProperties; - -/** - * Augments `target` object with getter/setter functions, which modify settings - * - * @example - * var target = {}; - * exposeProperties({ age: 42}, target); - * target.age(); // returns 42 - * target.age(24); // make age 24; - * - * var filteredTarget = {}; - * exposeProperties({ age: 42, name: 'John'}, filteredTarget, ['name']); - * filteredTarget.name(); // returns 'John' - * filteredTarget.age === undefined; // true - */ -function exposeProperties(settings, target, filter) { - var needsFilter = Object.prototype.toString.call(filter) === '[object Array]'; - if (needsFilter) { - for (var i = 0; i < filter.length; ++i) { - augment(settings, target, filter[i]); - } - } else { - for (var key in settings) { - augment(settings, target, key); - } - } -} - -function augment(source, target, key) { - if (source.hasOwnProperty(key)) { - if (typeof target[key] === 'function') { - // this accessor is already defined. Ignore it - return; - } - target[key] = function (value) { - if (value !== undefined) { - source[key] = value; - return target; - } - return source[key]; - } - } -} - -},{}],16:[function(require,module,exports){ -module.exports = { - Body: Body, - Vector2d: Vector2d, - Body3d: Body3d, - Vector3d: Vector3d -}; - -function Body(x, y) { - this.pos = new Vector2d(x, y); - this.prevPos = new Vector2d(x, y); - this.force = new Vector2d(); - this.velocity = new Vector2d(); - this.mass = 1; -} - -Body.prototype.setPosition = function (x, y) { - this.prevPos.x = this.pos.x = x; - this.prevPos.y = this.pos.y = y; -}; - -function Vector2d(x, y) { - if (x && typeof x !== 'number') { - // could be another vector - this.x = typeof x.x === 'number' ? x.x : 0; - this.y = typeof x.y === 'number' ? x.y : 0; - } else { - this.x = typeof x === 'number' ? x : 0; - this.y = typeof y === 'number' ? y : 0; - } -} - -Vector2d.prototype.reset = function () { - this.x = this.y = 0; -}; - -function Body3d(x, y, z) { - this.pos = new Vector3d(x, y, z); - this.prevPos = new Vector3d(x, y, z); - this.force = new Vector3d(); - this.velocity = new Vector3d(); - this.mass = 1; -} - -Body3d.prototype.setPosition = function (x, y, z) { - this.prevPos.x = this.pos.x = x; - this.prevPos.y = this.pos.y = y; - this.prevPos.z = this.pos.z = z; -}; - -function Vector3d(x, y, z) { - if (x && typeof x !== 'number') { - // could be another vector - this.x = typeof x.x === 'number' ? x.x : 0; - this.y = typeof x.y === 'number' ? x.y : 0; - this.z = typeof x.z === 'number' ? x.z : 0; - } else { - this.x = typeof x === 'number' ? x : 0; - this.y = typeof y === 'number' ? y : 0; - this.z = typeof z === 'number' ? z : 0; - } -}; + forEachNode = createNodeIterator(), + createLink = options.uniqueLinkId ? createUniqueLink : createSingleLink, -Vector3d.prototype.reset = function () { - this.x = this.y = this.z = 0; -}; + // Our graph API provides means to listen to graph changes. Users can subscribe + // to be notified about changes in the graph by using `on` method. However + // in some cases they don't use it. To avoid unnecessary memory consumption + // we will not record graph changes until we have at least one subscriber. + // Code below supports this optimization. + // + // Accumulates all changes made during graph updates. + // Each change element contains: + // changeType - one of the strings: 'add', 'remove' or 'update'; + // node - if change is related to node this property is set to changed graph's node; + // link - if change is related to link this property is set to changed graph's link; + changes = [], + recordLinkChange = noop, + recordNodeChange = noop, + enterModification = noop, + exitModification = noop; -},{}],17:[function(require,module,exports){ -/** - * This is Barnes Hut simulation algorithm for 2d case. Implementation - * is highly optimized (avoids recusion and gc pressure) - * - * http://www.cs.princeton.edu/courses/archive/fall03/cs126/assignments/barnes-hut.html - */ + // this is our public API: + var graphPart = { + /** + * Adds node to the graph. If node with given id already exists in the graph + * its data is extended with whatever comes in 'data' argument. + * + * @param nodeId the node's identifier. A string or number is preferred. + * note: If you request options.uniqueLinkId, then node id should not + * contain '👉 '. This will break link identifiers + * @param [data] additional data for the node being added. If node already + * exists its data object is augmented with the new one. + * + * @return {node} The newly added node or node with given id if it already exists. + */ + addNode: addNode, -module.exports = function(options) { - options = options || {}; - options.gravity = typeof options.gravity === 'number' ? options.gravity : -1; - options.theta = typeof options.theta === 'number' ? options.theta : 0.8; + /** + * Adds a link to the graph. The function always create a new + * link between two nodes. If one of the nodes does not exists + * a new node is created. + * + * @param fromId link start node id; + * @param toId link end node id; + * @param [data] additional data to be set on the new link; + * + * @return {link} The newly created link + */ + addLink: addLink, - // we require deterministic randomness here - var random = require('ngraph.random').random(1984), - Node = require('./node'), - InsertStack = require('./insertStack'), - isSamePosition = require('./isSamePosition'); + /** + * Removes link from the graph. If link does not exist does nothing. + * + * @param link - object returned by addLink() or getLinks() methods. + * + * @returns true if link was removed; false otherwise. + */ + removeLink: removeLink, - var gravity = options.gravity, - updateQueue = [], - insertStack = new InsertStack(), - theta = options.theta, + /** + * Removes node with given id from the graph. If node does not exist in the graph + * does nothing. + * + * @param nodeId node's identifier passed to addNode() function. + * + * @returns true if node was removed; false otherwise. + */ + removeNode: removeNode, - nodesCache = [], - currentInCache = 0, - newNode = function() { - // To avoid pressure on GC we reuse nodes. - var node = nodesCache[currentInCache]; - if (node) { - node.quad0 = null; - node.quad1 = null; - node.quad2 = null; - node.quad3 = null; - node.body = null; - node.mass = node.massX = node.massY = 0; - node.left = node.right = node.top = node.bottom = 0; - } else { - node = new Node(); - nodesCache[currentInCache] = node; - } + /** + * Gets node with given identifier. If node does not exist undefined value is returned. + * + * @param nodeId requested node identifier; + * + * @return {node} in with requested identifier or undefined if no such node exists. + */ + getNode: getNode, - ++currentInCache; - return node; + /** + * Gets number of nodes in this graph. + * + * @return number of nodes in the graph. + */ + getNodesCount: function() { + return nodesCount; }, - root = newNode(), - - // Inserts body to the tree - insert = function(newBody) { - insertStack.reset(); - insertStack.push(root, newBody); - - while (!insertStack.isEmpty()) { - var stackItem = insertStack.pop(), - node = stackItem.node, - body = stackItem.body; - - if (!node.body) { - // This is internal node. Update the total mass of the node and center-of-mass. - var x = body.pos.x; - var y = body.pos.y; - node.mass = node.mass + body.mass; - node.massX = node.massX + body.mass * x; - node.massY = node.massY + body.mass * y; - - // Recursively insert the body in the appropriate quadrant. - // But first find the appropriate quadrant. - var quadIdx = 0, // Assume we are in the 0's quad. - left = node.left, - right = (node.right + left) / 2, - top = node.top, - bottom = (node.bottom + top) / 2; - - if (x > right) { // somewhere in the eastern part. - quadIdx = quadIdx + 1; - var oldLeft = left; - left = right; - right = right + (right - oldLeft); - } - if (y > bottom) { // and in south. - quadIdx = quadIdx + 2; - var oldTop = top; - top = bottom; - bottom = bottom + (bottom - oldTop); - } - - var child = getChild(node, quadIdx); - if (!child) { - // The node is internal but this quadrant is not taken. Add - // subnode to it. - child = newNode(); - child.left = left; - child.top = top; - child.right = right; - child.bottom = bottom; - child.body = body; - - setChild(node, quadIdx, child); - } else { - // continue searching in this quadrant. - insertStack.push(child, body); - } - } else { - // We are trying to add to the leaf node. - // We have to convert current leaf into internal node - // and continue adding two nodes. - var oldBody = node.body; - node.body = null; // internal nodes do not cary bodies - - if (isSamePosition(oldBody.pos, body.pos)) { - // Prevent infinite subdivision by bumping one node - // anywhere in this quadrant - var retriesCount = 3; - do { - var offset = random.nextDouble(); - var dx = (node.right - node.left) * offset; - var dy = (node.bottom - node.top) * offset; - - oldBody.pos.x = node.left + dx; - oldBody.pos.y = node.top + dy; - retriesCount -= 1; - // Make sure we don't bump it out of the box. If we do, next iteration should fix it - } while (retriesCount > 0 && isSamePosition(oldBody.pos, body.pos)); - - if (retriesCount === 0 && isSamePosition(oldBody.pos, body.pos)) { - // This is very bad, we ran out of precision. - // if we do not return from the method we'll get into - // infinite loop here. So we sacrifice correctness of layout, and keep the app running - // Next layout iteration should get larger bounding box in the first step and fix this - return; - } - } - // Next iteration should subdivide node further. - insertStack.push(node, oldBody); - insertStack.push(node, body); - } - } + /** + * Gets total number of links in the graph. + */ + getLinksCount: function() { + return links.length; }, - update = function(sourceBody) { - var queue = updateQueue, - v, - dx, - dy, - r, fx = 0, - fy = 0, - queueLength = 1, - shiftIdx = 0, - pushIdx = 1; - - queue[0] = root; - - while (queueLength) { - var node = queue[shiftIdx], - body = node.body; - - queueLength -= 1; - shiftIdx += 1; - var differentBody = (body !== sourceBody); - if (body && differentBody) { - // If the current node is a leaf node (and it is not source body), - // calculate the force exerted by the current node on body, and add this - // amount to body's net force. - dx = body.pos.x - sourceBody.pos.x; - dy = body.pos.y - sourceBody.pos.y; - r = Math.sqrt(dx * dx + dy * dy); - - if (r === 0) { - // Poor man's protection against zero distance. - dx = (random.nextDouble() - 0.5) / 50; - dy = (random.nextDouble() - 0.5) / 50; - r = Math.sqrt(dx * dx + dy * dy); - } - - // This is standard gravition force calculation but we divide - // by r^3 to save two operations when normalizing force vector. - v = gravity * body.mass * sourceBody.mass / (r * r * r); - fx += v * dx; - fy += v * dy; - } else if (differentBody) { - // Otherwise, calculate the ratio s / r, where s is the width of the region - // represented by the internal node, and r is the distance between the body - // and the node's center-of-mass - dx = node.massX / node.mass - sourceBody.pos.x; - dy = node.massY / node.mass - sourceBody.pos.y; - r = Math.sqrt(dx * dx + dy * dy); - - if (r === 0) { - // Sorry about code duplucation. I don't want to create many functions - // right away. Just want to see performance first. - dx = (random.nextDouble() - 0.5) / 50; - dy = (random.nextDouble() - 0.5) / 50; - r = Math.sqrt(dx * dx + dy * dy); - } - // If s / r < θ, treat this internal node as a single body, and calculate the - // force it exerts on sourceBody, and add this amount to sourceBody's net force. - if ((node.right - node.left) / r < theta) { - // in the if statement above we consider node's width only - // because the region was squarified during tree creation. - // Thus there is no difference between using width or height. - v = gravity * node.mass * sourceBody.mass / (r * r * r); - fx += v * dx; - fy += v * dy; - } else { - // Otherwise, run the procedure recursively on each of the current node's children. - - // I intentionally unfolded this loop, to save several CPU cycles. - if (node.quad0) { - queue[pushIdx] = node.quad0; - queueLength += 1; - pushIdx += 1; - } - if (node.quad1) { - queue[pushIdx] = node.quad1; - queueLength += 1; - pushIdx += 1; - } - if (node.quad2) { - queue[pushIdx] = node.quad2; - queueLength += 1; - pushIdx += 1; - } - if (node.quad3) { - queue[pushIdx] = node.quad3; - queueLength += 1; - pushIdx += 1; - } - } - } - } - - sourceBody.force.x += fx; - sourceBody.force.y += fy; - }, + /** + * Gets all links (inbound and outbound) from the node with given id. + * If node with given id is not found null is returned. + * + * @param nodeId requested node identifier. + * + * @return Array of links from and to requested node if such node exists; + * otherwise null is returned. + */ + getLinks: getLinks, - insertBodies = function(bodies) { - var x1 = Number.MAX_VALUE, - y1 = Number.MAX_VALUE, - x2 = Number.MIN_VALUE, - y2 = Number.MIN_VALUE, - i, - max = bodies.length; + /** + * Invokes callback on each node of the graph. + * + * @param {Function(node)} callback Function to be invoked. The function + * is passed one argument: visited node. + */ + forEachNode: forEachNode, - // To reduce quad tree depth we are looking for exact bounding box of all particles. - i = max; - while (i--) { - var x = bodies[i].pos.x; - var y = bodies[i].pos.y; - if (x < x1) { - x1 = x; - } - if (x > x2) { - x2 = x; - } - if (y < y1) { - y1 = y; - } - if (y > y2) { - y2 = y; - } - } + /** + * Invokes callback on every linked (adjacent) node to the given one. + * + * @param nodeId Identifier of the requested node. + * @param {Function(node, link)} callback Function to be called on all linked nodes. + * The function is passed two parameters: adjacent node and link object itself. + * @param oriented if true graph treated as oriented. + */ + forEachLinkedNode: forEachLinkedNode, - // Squarify the bounds. - var dx = x2 - x1, - dy = y2 - y1; - if (dx > dy) { - y2 = y1 + dx; - } else { - x2 = x1 + dy; - } + /** + * Enumerates all links in the graph + * + * @param {Function(link)} callback Function to be called on all links in the graph. + * The function is passed one parameter: graph's link object. + * + * Link object contains at least the following fields: + * fromId - node id where link starts; + * toId - node id where link ends, + * data - additional data passed to graph.addLink() method. + */ + forEachLink: forEachLink, - currentInCache = 0; - root = newNode(); - root.left = x1; - root.right = x2; - root.top = y1; - root.bottom = y2; + /** + * Suspend all notifications about graph changes until + * endUpdate is called. + */ + beginUpdate: enterModification, - i = max - 1; - if (i > 0) { - root.body = bodies[i]; - } - while (i--) { - insert(bodies[i], root); - } - }; + /** + * Resumes all notifications about graph changes and fires + * graph 'changed' event in case there are any pending changes. + */ + endUpdate: exitModification, - return { - insertBodies: insertBodies, - updateBodyForce: update, - options: function(newOptions) { - if (newOptions) { - if (typeof newOptions.gravity === 'number') { - gravity = newOptions.gravity; - } - if (typeof newOptions.theta === 'number') { - theta = newOptions.theta; - } + /** + * Removes all nodes and links from the graph. + */ + clear: clear, - return this; - } + /** + * Detects whether there is a link between two nodes. + * Operation complexity is O(n) where n - number of links of a node. + * NOTE: this function is synonim for getLink() + * + * @returns link if there is one. null otherwise. + */ + hasLink: getLink, - return { - gravity: gravity, - theta: theta - }; - } + /** + * Gets an edge between two nodes. + * Operation complexity is O(n) where n - number of links of a node. + * + * @param {string} fromId link start identifier + * @param {string} toId link end identifier + * + * @returns link if there is one. null otherwise. + */ + getLink: getLink }; -}; - -function getChild(node, idx) { - if (idx === 0) return node.quad0; - if (idx === 1) return node.quad1; - if (idx === 2) return node.quad2; - if (idx === 3) return node.quad3; - return null; -} -function setChild(node, idx, child) { - if (idx === 0) node.quad0 = child; - else if (idx === 1) node.quad1 = child; - else if (idx === 2) node.quad2 = child; - else if (idx === 3) node.quad3 = child; -} + // this will add `on()` and `fire()` methods. + eventify(graphPart); -},{"./insertStack":18,"./isSamePosition":19,"./node":20,"ngraph.random":25}],18:[function(require,module,exports){ -module.exports = InsertStack; + monitorSubscribers(); -/** - * Our implmentation of QuadTree is non-recursive to avoid GC hit - * This data structure represent stack of elements - * which we are trying to insert into quad tree. - */ -function InsertStack () { - this.stack = []; - this.popIdx = 0; -} + return graphPart; -InsertStack.prototype = { - isEmpty: function() { - return this.popIdx === 0; - }, - push: function (node, body) { - var item = this.stack[this.popIdx]; - if (!item) { - // we are trying to avoid memory pressue: create new element - // only when absolutely necessary - this.stack[this.popIdx] = new InsertStackElement(node, body); - } else { - item.node = node; - item.body = body; - } - ++this.popIdx; - }, - pop: function () { - if (this.popIdx > 0) { - return this.stack[--this.popIdx]; - } - }, - reset: function () { - this.popIdx = 0; - } -}; + function monitorSubscribers() { + var realOn = graphPart.on; -function InsertStackElement(node, body) { - this.node = node; // QuadTree node - this.body = body; // physical body which needs to be inserted to node -} + // replace real `on` with our temporary on, which will trigger change + // modification monitoring: + graphPart.on = on; -},{}],19:[function(require,module,exports){ -module.exports = function isSamePosition(point1, point2) { - var dx = Math.abs(point1.x - point2.x); - var dy = Math.abs(point1.y - point2.y); + function on() { + // now it's time to start tracking stuff: + graphPart.beginUpdate = enterModification = enterModificationReal; + graphPart.endUpdate = exitModification = exitModificationReal; + recordLinkChange = recordLinkChangeReal; + recordNodeChange = recordNodeChangeReal; - return (dx < 1e-8 && dy < 1e-8); -}; + // this will replace current `on` method with real pub/sub from `eventify`. + graphPart.on = realOn; + // delegate to real `on` handler: + return realOn.apply(graphPart, arguments); + } + } -},{}],20:[function(require,module,exports){ -/** - * Internal data structure to represent 2D QuadTree node - */ -module.exports = function Node() { - // body stored inside this node. In quad tree only leaf nodes (by construction) - // contain boides: - this.body = null; + function recordLinkChangeReal(link, changeType) { + changes.push({ + link: link, + changeType: changeType + }); + } - // Child nodes are stored in quads. Each quad is presented by number: - // 0 | 1 - // ----- - // 2 | 3 - this.quad0 = null; - this.quad1 = null; - this.quad2 = null; - this.quad3 = null; + function recordNodeChangeReal(node, changeType) { + changes.push({ + node: node, + changeType: changeType + }); + } - // Total mass of current node - this.mass = 0; + function addNode(nodeId, data) { + if (nodeId === undefined) { + throw new Error('Invalid node identifier'); + } - // Center of mass coordinates - this.massX = 0; - this.massY = 0; + enterModification(); - // bounding box coordinates - this.left = 0; - this.top = 0; - this.bottom = 0; - this.right = 0; -}; + var node = getNode(nodeId); + if (!node) { + // TODO: Should I check for 👉 here? + node = new Node(nodeId); + nodesCount++; + recordNodeChange(node, 'add'); + } else { + recordNodeChange(node, 'update'); + } -},{}],21:[function(require,module,exports){ -module.exports = load; + node.data = data; -var createGraph = require('ngraph.graph'); + nodes[nodeId] = node; -function load(jsonGraph, nodeTransform, linkTransform) { - var stored; - nodeTransform = nodeTransform || id; - linkTransform = linkTransform || id; - if (typeof jsonGraph === 'string') { - stored = JSON.parse(jsonGraph); - } else { - stored = jsonGraph; + exitModification(); + return node; } - var graph = createGraph(), - i; - - if (stored.links === undefined || stored.nodes === undefined) { - throw new Error('Cannot load graph without links and nodes'); + function getNode(nodeId) { + return nodes[nodeId]; } - for (i = 0; i < stored.nodes.length; ++i) { - var parsedNode = nodeTransform(stored.nodes[i]); - if (!parsedNode.hasOwnProperty('id')) { - throw new Error('Graph node format is invalid: Node id is missing'); + function removeNode(nodeId) { + var node = getNode(nodeId); + if (!node) { + return false; } - graph.addNode(parsedNode.id, parsedNode.data); - } + enterModification(); - for (i = 0; i < stored.links.length; ++i) { - var link = linkTransform(stored.links[i]); - if (!link.hasOwnProperty('fromId') || !link.hasOwnProperty('toId')) { - throw new Error('Graph link format is invalid. Both fromId and toId are required'); + while (node.links.length) { + var link = node.links[0]; + removeLink(link); } - graph.addLink(link.fromId, link.toId, link.data); + delete nodes[nodeId]; + nodesCount--; + + recordNodeChange(node, 'remove'); + + exitModification(); + + return true; } - return graph; -} -function id(x) { return x; } + function addLink(fromId, toId, data) { + enterModification(); -},{"ngraph.graph":23}],22:[function(require,module,exports){ -module.exports = { - ladder: ladder, - complete: complete, - completeBipartite: completeBipartite, - balancedBinTree: balancedBinTree, - path: path, - circularLadder: circularLadder, - grid: grid, - grid3: grid3, - noLinks: noLinks, - wattsStrogatz: wattsStrogatz -}; + var fromNode = getNode(fromId) || addNode(fromId); + var toNode = getNode(toId) || addNode(toId); -var createGraph = require('ngraph.graph'); + var link = createLink(fromId, toId, data); -function ladder(n) { -/** - * Ladder graph is a graph in form of ladder - * @param {Number} n Represents number of steps in the ladder - */ - if (!n || n < 0) { - throw new Error("Invalid number of nodes"); - } + links.push(link); - var g = createGraph(), - i; + // TODO: this is not cool. On large graphs potentially would consume more memory. + fromNode.links.push(link); + if (fromId !== toId) { + // make sure we are not duplicating links for self-loops + toNode.links.push(link); + } - for (i = 0; i < n - 1; ++i) { - g.addLink(i, i + 1); - // first row - g.addLink(n + i, n + i + 1); - // second row - g.addLink(i, n + i); - // ladder's step + recordLinkChange(link, 'add'); + + exitModification(); + + return link; } - g.addLink(n - 1, 2 * n - 1); - // last step in the ladder; + function createSingleLink(fromId, toId, data) { + var linkId = fromId.toString() + toId.toString(); + return new Link(fromId, toId, data, linkId); + } - return g; -} + function createUniqueLink(fromId, toId, data) { + var linkId = fromId.toString() + '👉 ' + toId.toString(); + var isMultiEdge = multiEdges.hasOwnProperty(linkId); + if (isMultiEdge || getLink(fromId, toId)) { + if (!isMultiEdge) { + multiEdges[linkId] = 0; + } + linkId += '@' + (++multiEdges[linkId]); + } -function circularLadder(n) { -/** - * Circular ladder with n steps. - * - * @param {Number} n of steps in the ladder. - */ - if (!n || n < 0) { - throw new Error("Invalid number of nodes"); + return new Link(fromId, toId, data, linkId); + } + + function getLinks(nodeId) { + var node = getNode(nodeId); + return node ? node.links : null; + } + + function removeLink(link) { + if (!link) { + return false; + } + var idx = indexOfElementInArray(link, links); + if (idx < 0) { + return false; } - var g = ladder(n); + enterModification(); - g.addLink(0, n - 1); - g.addLink(n, 2 * n - 1); - return g; -} + links.splice(idx, 1); -function complete(n) { -/** - * Complete graph Kn. - * - * @param {Number} n represents number of nodes in the complete graph. - */ - if (!n || n < 1) { - throw new Error("At least two nodes are expected for complete graph"); - } + var fromNode = getNode(link.fromId); + var toNode = getNode(link.toId); - var g = createGraph(), - i, - j; + if (fromNode) { + idx = indexOfElementInArray(link, fromNode.links); + if (idx >= 0) { + fromNode.links.splice(idx, 1); + } + } - for (i = 0; i < n; ++i) { - for (j = i + 1; j < n; ++j) { - if (i !== j) { - g.addLink(i, j); + if (toNode) { + idx = indexOfElementInArray(link, toNode.links); + if (idx >= 0) { + toNode.links.splice(idx, 1); } } - } - return g; -} + recordLinkChange(link, 'remove'); -function completeBipartite (n, m) { -/** - * Complete bipartite graph K n,m. Each node in the - * first partition is connected to all nodes in the second partition. - * - * @param {Number} n represents number of nodes in the first graph partition - * @param {Number} m represents number of nodes in the second graph partition - */ - if (!n || !m || n < 0 || m < 0) { - throw new Error("Graph dimensions are invalid. Number of nodes in each partition should be greater than 0"); + exitModification(); + + return true; } - var g = createGraph(), - i, j; + function getLink(fromNodeId, toNodeId) { + // TODO: Use sorted links to speed this up + var node = getNode(fromNodeId), + i; + if (!node) { + return null; + } - for (i = 0; i < n; ++i) { - for (j = n; j < n + m; ++j) { - g.addLink(i, j); + for (i = 0; i < node.links.length; ++i) { + var link = node.links[i]; + if (link.fromId === fromNodeId && link.toId === toNodeId) { + return link; + } } + + return null; // no link. } - return g; -} + function clear() { + enterModification(); + forEachNode(function(node) { + removeNode(node.id); + }); + exitModification(); + } -function path(n) { -/** - * Path graph with n steps. - * - * @param {Number} n number of nodes in the path - */ - if (!n || n < 0) { - throw new Error("Invalid number of nodes"); + function forEachLink(callback) { + var i, length; + if (typeof callback === 'function') { + for (i = 0, length = links.length; i < length; ++i) { + callback(links[i]); + } + } } - var g = createGraph(), - i; + function forEachLinkedNode(nodeId, callback, oriented) { + var node = getNode(nodeId); - g.addNode(0); + if (node && node.links && typeof callback === 'function') { + if (oriented) { + return forEachOrientedLink(node.links, nodeId, callback); + } else { + return forEachNonOrientedLink(node.links, nodeId, callback); + } + } + } + + function forEachNonOrientedLink(links, nodeId, callback) { + var quitFast; + for (var i = 0; i < links.length; ++i) { + var link = links[i]; + var linkedNodeId = link.fromId === nodeId ? link.toId : link.fromId; - for (i = 1; i < n; ++i) { - g.addLink(i - 1, i); + quitFast = callback(nodes[linkedNodeId], link); + if (quitFast) { + return true; // Client does not need more iterations. Break now. + } + } } - return g; -} + function forEachOrientedLink(links, nodeId, callback) { + var quitFast; + for (var i = 0; i < links.length; ++i) { + var link = links[i]; + if (link.fromId === nodeId) { + quitFast = callback(nodes[link.toId], link); + if (quitFast) { + return true; // Client does not need more iterations. Break now. + } + } + } + } + // we will not fire anything until users of this library explicitly call `on()` + // method. + function noop() {} -function grid(n, m) { -/** - * Grid graph with n rows and m columns. - * - * @param {Number} n of rows in the graph. - * @param {Number} m of columns in the graph. - */ - if (n < 1 || m < 1) { - throw new Error("Invalid number of nodes in grid graph"); - } - var g = createGraph(), - i, - j; - if (n === 1 && m === 1) { - g.addNode(0); - return g; + // Enter, Exit modification allows bulk graph updates without firing events. + function enterModificationReal() { + suspendEvents += 1; } - for (i = 0; i < n; ++i) { - for (j = 0; j < m; ++j) { - var node = i + j * n; - if (i > 0) { g.addLink(node, i - 1 + j * n); } - if (j > 0) { g.addLink(node, i + (j - 1) * n); } + function exitModificationReal() { + suspendEvents -= 1; + if (suspendEvents === 0 && changes.length > 0) { + graphPart.fire('changed', changes); + changes.length = 0; } } - return g; -} - -function grid3(n, m, z) { -/** - * 3D grid with n rows and m columns and z levels. - * - * @param {Number} n of rows in the graph. - * @param {Number} m of columns in the graph. - * @param {Number} z of levels in the graph. - */ - if (n < 1 || m < 1 || z < 1) { - throw new Error("Invalid number of nodes in grid3 graph"); + function createNodeIterator() { + // Object.keys iterator is 1.3x faster than `for in` loop. + // See `https://github.com/anvaka/ngraph.graph/tree/bench-for-in-vs-obj-keys` + // branch for perf test + return Object.keys ? objectKeysIterator : forInIterator; } - var g = createGraph(), - i, j, k; - if (n === 1 && m === 1 && z === 1) { - g.addNode(0); - return g; - } + function objectKeysIterator(callback) { + if (typeof callback !== 'function') { + return; + } - for (k = 0; k < z; ++k) { - for (i = 0; i < n; ++i) { - for (j = 0; j < m; ++j) { - var level = k * n * m; - var node = i + j * n + level; - if (i > 0) { g.addLink(node, i - 1 + j * n + level); } - if (j > 0) { g.addLink(node, i + (j - 1) * n + level); } - if (k > 0) { g.addLink(node, i + j * n + (k - 1) * n * m ); } + var keys = Object.keys(nodes); + for (var i = 0; i < keys.length; ++i) { + if (callback(nodes[keys[i]])) { + return true; // client doesn't want to proceed. Return. } } } - return g; -} + function forInIterator(callback) { + if (typeof callback !== 'function') { + return; + } + var node; -function balancedBinTree(n) { -/** - * Balanced binary tree with n levels. - * - * @param {Number} n of levels in the binary tree - */ - if (n < 0) { - throw new Error("Invalid number of nodes in balanced tree"); + for (node in nodes) { + if (callback(nodes[node])) { + return true; // client doesn't want to proceed. Return. + } + } } - var g = createGraph(), - count = Math.pow(2, n), - level; +} - if (n === 0) { - g.addNode(1); +// need this for old browsers. Should this be a separate module? +function indexOfElementInArray(element, array) { + if (array.indexOf) { + return array.indexOf(element); } - for (level = 1; level < count; ++level) { - var root = level, - left = root * 2, - right = root * 2 + 1; + var len = array.length, + i; - g.addLink(root, left); - g.addLink(root, right); + for (i = 0; i < len; i += 1) { + if (array[i] === element) { + return i; + } } - return g; + return -1; } -function noLinks(n) { /** - * Graph with no links - * - * @param {Number} n of nodes in the graph + * Internal structure to represent node; */ - if (n < 0) { - throw new Error("Number of nodes shoul be >= 0"); - } +function Node(id) { + this.id = id; + this.links = []; + this.data = null; +} - var g = createGraph(), i; - for (i = 0; i < n; ++i) { - g.addNode(i); - } - return g; +/** + * Internal structure to represent links; + */ +function Link(fromId, toId, data, id) { + this.fromId = fromId; + this.toId = toId; + this.data = data; + this.id = id; } -function wattsStrogatz(n, k, p, seed) { +},{"ngraph.events":7}],13:[function(require,module,exports){ +module.exports = merge; + /** - * Watts-Strogatz small-world graph. + * Augments `target` with properties in `options`. Does not override + * target's properties if they are defined and matches expected type in + * options * - * @param {Number} n The number of nodes - * @param {Number} k Each node is connected to k nearest neighbors in ring topology - * @param {Number} p The probability of rewiring each edge - - * @see https://github.com/networkx/networkx/blob/master/networkx/generators/random_graphs.py + * @returns {Object} merged object */ - if (k >= n) throw new Error('Choose smaller `k`. It cannot be larger than number of nodes `n`'); +function merge(target, options) { + var key; + if (!target) { target = {}; } + if (options) { + for (key in options) { + if (options.hasOwnProperty(key)) { + var targetHasIt = target.hasOwnProperty(key), + optionsValueType = typeof options[key], + shouldReplace = !targetHasIt || (typeof target[key] !== optionsValueType); + if (shouldReplace) { + target[key] = options[key]; + } else if (optionsValueType === 'object') { + // go deep, don't care about loops here, we are simple API!: + target[key] = merge(target[key], options[key]); + } + } + } + } - var random = require('ngraph.random').random(seed || 42); + return target; +} - var g = createGraph(), i, to; - for (i = 0; i < n; ++i) { - g.addNode(i); - } +},{}],14:[function(require,module,exports){ +module.exports = { + Body: Body, + Vector2d: Vector2d, + Body3d: Body3d, + Vector3d: Vector3d +}; - // connect each node to k/2 neighbors - var neighborsSize = Math.floor(k/2 + 1); - for (var j = 1; j < neighborsSize; ++j) { - for (i = 0; i < n; ++i) { - to = (j + i) % n; - g.addLink(i, to); - } - } +function Body(x, y) { + this.pos = new Vector2d(x, y); + this.prevPos = new Vector2d(x, y); + this.force = new Vector2d(); + this.velocity = new Vector2d(); + this.mass = 1; +} - // rewire edges from each node - // loop over all nodes in order (label) and neighbors in order (distance) - // no self loops or multiple edges allowed - for (j = 1; j < neighborsSize; ++j) { - for (i = 0; i < n; ++i) { - if (random.nextDouble() < p) { - var from = i; - to = (j + i) % n; +Body.prototype.setPosition = function (x, y) { + this.prevPos.x = this.pos.x = x; + this.prevPos.y = this.pos.y = y; +}; - var newTo = random.next(n); - var needsRewire = (newTo === from || g.hasLink(from, newTo)); - if (needsRewire && g.getLinks(from).length === n - 1) { - // we cannot rewire this node, it has too many links. - continue; - } - // Enforce no self-loops or multiple edges - while (needsRewire) { - newTo = random.next(n); - needsRewire = (newTo === from || g.hasLink(from, newTo)); - } - var link = g.hasLink(from, to); - g.removeLink(link); - g.addLink(from, newTo); - } - } +function Vector2d(x, y) { + if (x && typeof x !== 'number') { + // could be another vector + this.x = typeof x.x === 'number' ? x.x : 0; + this.y = typeof x.y === 'number' ? x.y : 0; + } else { + this.x = typeof x === 'number' ? x : 0; + this.y = typeof y === 'number' ? y : 0; } +} - return g; +Vector2d.prototype.reset = function () { + this.x = this.y = 0; +}; + +function Body3d(x, y, z) { + this.pos = new Vector3d(x, y, z); + this.prevPos = new Vector3d(x, y, z); + this.force = new Vector3d(); + this.velocity = new Vector3d(); + this.mass = 1; } -},{"ngraph.graph":23,"ngraph.random":25}],23:[function(require,module,exports){ -/** - * @fileOverview Contains definition of the core graph object. - */ +Body3d.prototype.setPosition = function (x, y, z) { + this.prevPos.x = this.pos.x = x; + this.prevPos.y = this.pos.y = y; + this.prevPos.z = this.pos.z = z; +}; -/** - * @example - * var graph = require('ngraph.graph')(); - * graph.addNode(1); // graph has one node. - * graph.addLink(2, 3); // now graph contains three nodes and one link. - * - */ -module.exports = createGraph; +function Vector3d(x, y, z) { + if (x && typeof x !== 'number') { + // could be another vector + this.x = typeof x.x === 'number' ? x.x : 0; + this.y = typeof x.y === 'number' ? x.y : 0; + this.z = typeof x.z === 'number' ? x.z : 0; + } else { + this.x = typeof x === 'number' ? x : 0; + this.y = typeof y === 'number' ? y : 0; + this.z = typeof z === 'number' ? z : 0; + } +}; -var eventify = require('ngraph.events'); +Vector3d.prototype.reset = function () { + this.x = this.y = this.z = 0; +}; +},{}],15:[function(require,module,exports){ /** - * Creates a new graph + * Manages a simulation of physical forces acting on bodies and springs. */ -function createGraph(options) { - // Graph structure is maintained as dictionary of nodes - // and array of links. Each node has 'links' property which - // hold all links related to that node. And general links - // array is used to speed up all links enumeration. This is inefficient - // in terms of memory, but simplifies coding. - options = options || {}; - if (options.uniqueLinkId === undefined) { - // Request each link id to be unique between same nodes. This negatively - // impacts `addLink()` performance (O(n), where n - number of edges of each - // vertex), but makes operations with multigraphs more accessible. - options.uniqueLinkId = true; - } +module.exports = physicsSimulator; - var nodes = typeof Object.create === 'function' ? Object.create(null) : {}, - links = [], - // Hash of multi-edges. Used to track ids of edges between same nodes - multiEdges = {}, - nodesCount = 0, - suspendEvents = 0, +function physicsSimulator(settings) { + var Spring = require('./lib/spring'); + var expose = require('ngraph.expose'); + var merge = require('ngraph.merge'); - forEachNode = createNodeIterator(), - createLink = options.uniqueLinkId ? createUniqueLink : createSingleLink, + settings = merge(settings, { + /** + * Ideal length for links (springs in physical model). + */ + springLength: 30, - // Our graph API provides means to listen to graph changes. Users can subscribe - // to be notified about changes in the graph by using `on` method. However - // in some cases they don't use it. To avoid unnecessary memory consumption - // we will not record graph changes until we have at least one subscriber. - // Code below supports this optimization. - // - // Accumulates all changes made during graph updates. - // Each change element contains: - // changeType - one of the strings: 'add', 'remove' or 'update'; - // node - if change is related to node this property is set to changed graph's node; - // link - if change is related to link this property is set to changed graph's link; - changes = [], - recordLinkChange = noop, - recordNodeChange = noop, - enterModification = noop, - exitModification = noop; + /** + * Hook's law coefficient. 1 - solid spring. + */ + springCoeff: 0.0008, - // this is our public API: - var graphPart = { - /** - * Adds node to the graph. If node with given id already exists in the graph - * its data is extended with whatever comes in 'data' argument. - * - * @param nodeId the node's identifier. A string or number is preferred. - * note: If you request options.uniqueLinkId, then node id should not - * contain '👉 '. This will break link identifiers - * @param [data] additional data for the node being added. If node already - * exists its data object is augmented with the new one. - * - * @return {node} The newly added node or node with given id if it already exists. - */ - addNode: addNode, + /** + * Coulomb's law coefficient. It's used to repel nodes thus should be negative + * if you make it positive nodes start attract each other :). + */ + gravity: -1.2, - /** - * Adds a link to the graph. The function always create a new - * link between two nodes. If one of the nodes does not exists - * a new node is created. - * - * @param fromId link start node id; - * @param toId link end node id; - * @param [data] additional data to be set on the new link; - * - * @return {link} The newly created link - */ - addLink: addLink, + /** + * Theta coefficient from Barnes Hut simulation. Ranged between (0, 1). + * The closer it's to 1 the more nodes algorithm will have to go through. + * Setting it to one makes Barnes Hut simulation no different from + * brute-force forces calculation (each node is considered). + */ + theta: 0.8, + + /** + * Drag force coefficient. Used to slow down system, thus should be less than 1. + * The closer it is to 0 the less tight system will be. + */ + dragCoeff: 0.02, + + /** + * Default time step (dt) for forces integration + */ + timeStep : 20, + + /** + * Maximum movement of the system which can be considered as stabilized + */ + stableThreshold: 0.009 + }); + // We allow clients to override basic factory methods: + var createQuadTree = settings.createQuadTree || require('ngraph.quadtreebh'); + var createBounds = settings.createBounds || require('./lib/bounds'); + var createDragForce = settings.createDragForce || require('./lib/dragForce'); + var createSpringForce = settings.createSpringForce || require('./lib/springForce'); + var integrate = settings.integrator || require('./lib/eulerIntegrator'); + var createBody = settings.createBody || require('./lib/createBody'); + + var bodies = [], // Bodies in this simulation. + springs = [], // Springs in this simulation. + quadTree = createQuadTree(settings), + bounds = createBounds(bodies, settings), + springForce = createSpringForce(settings), + dragForce = createDragForce(settings); + + var publicApi = { /** - * Removes link from the graph. If link does not exist does nothing. - * - * @param link - object returned by addLink() or getLinks() methods. + * Array of bodies, registered with current simulator * - * @returns true if link was removed; false otherwise. + * Note: To add new body, use addBody() method. This property is only + * exposed for testing/performance purposes. */ - removeLink: removeLink, + bodies: bodies, /** - * Removes node with given id from the graph. If node does not exist in the graph - * does nothing. - * - * @param nodeId node's identifier passed to addNode() function. + * Array of springs, registered with current simulator * - * @returns true if node was removed; false otherwise. + * Note: To add new spring, use addSpring() method. This property is only + * exposed for testing/performance purposes. */ - removeNode: removeNode, + springs: springs, /** - * Gets node with given identifier. If node does not exist undefined value is returned. - * - * @param nodeId requested node identifier; - * - * @return {node} in with requested identifier or undefined if no such node exists. + * Returns settings with which current simulator was initialized */ - getNode: getNode, + settings: settings, /** - * Gets number of nodes in this graph. + * Performs one step of force simulation. * - * @return number of nodes in the graph. + * @returns {boolean} true if system is considered stable; False otherwise. */ - getNodesCount: function() { - return nodesCount; - }, + step: function () { + accumulateForces(); + var totalMovement = integrate(bodies, settings.timeStep); - /** - * Gets total number of links in the graph. - */ - getLinksCount: function() { - return links.length; + bounds.update(); + + return totalMovement < settings.stableThreshold; }, /** - * Gets all links (inbound and outbound) from the node with given id. - * If node with given id is not found null is returned. + * Adds body to the system * - * @param nodeId requested node identifier. + * @param {ngraph.physics.primitives.Body} body physical body * - * @return Array of links from and to requested node if such node exists; - * otherwise null is returned. + * @returns {ngraph.physics.primitives.Body} added body */ - getLinks: getLinks, + addBody: function (body) { + if (!body) { + throw new Error('Body is required'); + } + bodies.push(body); - /** - * Invokes callback on each node of the graph. - * - * @param {Function(node)} callback Function to be invoked. The function - * is passed one argument: visited node. - */ - forEachNode: forEachNode, + return body; + }, /** - * Invokes callback on every linked (adjacent) node to the given one. + * Adds body to the system at given position * - * @param nodeId Identifier of the requested node. - * @param {Function(node, link)} callback Function to be called on all linked nodes. - * The function is passed two parameters: adjacent node and link object itself. - * @param oriented if true graph treated as oriented. + * @param {Object} pos position of a body + * + * @returns {ngraph.physics.primitives.Body} added body */ - forEachLinkedNode: forEachLinkedNode, + addBodyAt: function (pos) { + if (!pos) { + throw new Error('Body position is required'); + } + var body = createBody(pos); + bodies.push(body); + + return body; + }, /** - * Enumerates all links in the graph + * Removes body from the system * - * @param {Function(link)} callback Function to be called on all links in the graph. - * The function is passed one parameter: graph's link object. + * @param {ngraph.physics.primitives.Body} body to remove * - * Link object contains at least the following fields: - * fromId - node id where link starts; - * toId - node id where link ends, - * data - additional data passed to graph.addLink() method. + * @returns {Boolean} true if body found and removed. falsy otherwise; */ - forEachLink: forEachLink, + removeBody: function (body) { + if (!body) { return; } - /** - * Suspend all notifications about graph changes until - * endUpdate is called. - */ - beginUpdate: enterModification, + var idx = bodies.indexOf(body); + if (idx < 0) { return; } - /** - * Resumes all notifications about graph changes and fires - * graph 'changed' event in case there are any pending changes. - */ - endUpdate: exitModification, + bodies.splice(idx, 1); + if (bodies.length === 0) { + bounds.reset(); + } + return true; + }, /** - * Removes all nodes and links from the graph. + * Adds a spring to this simulation. + * + * @returns {Object} - a handle for a spring. If you want to later remove + * spring pass it to removeSpring() method. */ - clear: clear, + addSpring: function (body1, body2, springLength, springWeight, springCoefficient) { + if (!body1 || !body2) { + throw new Error('Cannot add null spring to force simulator'); + } + + if (typeof springLength !== 'number') { + springLength = -1; // assume global configuration + } + + var spring = new Spring(body1, body2, springLength, springCoefficient >= 0 ? springCoefficient : -1, springWeight); + springs.push(spring); + + // TODO: could mark simulator as dirty. + return spring; + }, /** - * Detects whether there is a link between two nodes. - * Operation complexity is O(n) where n - number of links of a node. - * NOTE: this function is synonim for getLink() + * Removes spring from the system * - * @returns link if there is one. null otherwise. + * @param {Object} spring to remove. Spring is an object returned by addSpring + * + * @returns {Boolean} true if spring found and removed. falsy otherwise; */ - hasLink: getLink, + removeSpring: function (spring) { + if (!spring) { return; } + var idx = springs.indexOf(spring); + if (idx > -1) { + springs.splice(idx, 1); + return true; + } + }, + + getBestNewBodyPosition: function (neighbors) { + return bounds.getBestNewPosition(neighbors); + }, /** - * Gets an edge between two nodes. - * Operation complexity is O(n) where n - number of links of a node. - * - * @param {string} fromId link start identifier - * @param {string} toId link end identifier - * - * @returns link if there is one. null otherwise. + * Returns bounding box which covers all bodies */ - getLink: getLink - }; + getBBox: function () { + return bounds.box; + }, - // this will add `on()` and `fire()` methods. - eventify(graphPart); + gravity: function (value) { + if (value !== undefined) { + settings.gravity = value; + quadTree.options({gravity: value}); + return this; + } else { + return settings.gravity; + } + }, - monitorSubscribers(); + theta: function (value) { + if (value !== undefined) { + settings.theta = value; + quadTree.options({theta: value}); + return this; + } else { + return settings.theta; + } + } + }; - return graphPart; + // allow settings modification via public API: + expose(settings, publicApi); - function monitorSubscribers() { - var realOn = graphPart.on; + return publicApi; - // replace real `on` with our temporary on, which will trigger change - // modification monitoring: - graphPart.on = on; + function accumulateForces() { + // Accumulate forces acting on bodies. + var body, + i = bodies.length; - function on() { - // now it's time to start tracking stuff: - graphPart.beginUpdate = enterModification = enterModificationReal; - graphPart.endUpdate = exitModification = exitModificationReal; - recordLinkChange = recordLinkChangeReal; - recordNodeChange = recordNodeChangeReal; + if (i) { + // only add bodies if there the array is not empty: + quadTree.insertBodies(bodies); // performance: O(n * log n) + while (i--) { + body = bodies[i]; + // If body is pinned there is no point updating its forces - it should + // never move: + if (!body.isPinned) { + body.force.reset(); - // this will replace current `on` method with real pub/sub from `eventify`. - graphPart.on = realOn; - // delegate to real `on` handler: - return realOn.apply(graphPart, arguments); + quadTree.updateBodyForce(body); + dragForce.update(body); + } + } + } + + i = springs.length; + while(i--) { + springForce.update(springs[i]); } } +}; - function recordLinkChangeReal(link, changeType) { - changes.push({ - link: link, - changeType: changeType - }); +},{"./lib/bounds":16,"./lib/createBody":17,"./lib/dragForce":18,"./lib/eulerIntegrator":19,"./lib/spring":20,"./lib/springForce":21,"ngraph.expose":8,"ngraph.merge":13,"ngraph.quadtreebh":22}],16:[function(require,module,exports){ +module.exports = function (bodies, settings) { + var random = require('ngraph.random').random(42); + var boundingBox = { x1: 0, y1: 0, x2: 0, y2: 0 }; + + return { + box: boundingBox, + + update: updateBoundingBox, + + reset : function () { + boundingBox.x1 = boundingBox.y1 = 0; + boundingBox.x2 = boundingBox.y2 = 0; + }, + + getBestNewPosition: function (neighbors) { + var graphRect = boundingBox; + + var baseX = 0, baseY = 0; + + if (neighbors.length) { + for (var i = 0; i < neighbors.length; ++i) { + baseX += neighbors[i].pos.x; + baseY += neighbors[i].pos.y; + } + + baseX /= neighbors.length; + baseY /= neighbors.length; + } else { + baseX = (graphRect.x1 + graphRect.x2) / 2; + baseY = (graphRect.y1 + graphRect.y2) / 2; + } + + var springLength = settings.springLength; + return { + x: baseX + random.next(springLength) - springLength / 2, + y: baseY + random.next(springLength) - springLength / 2 + }; + } + }; + + function updateBoundingBox() { + var i = bodies.length; + if (i === 0) { return; } // don't have to wory here. + + var x1 = Number.MAX_VALUE, + y1 = Number.MAX_VALUE, + x2 = Number.MIN_VALUE, + y2 = Number.MIN_VALUE; + + while(i--) { + // this is O(n), could it be done faster with quadtree? + // how about pinned nodes? + var body = bodies[i]; + if (body.isPinned) { + body.pos.x = body.prevPos.x; + body.pos.y = body.prevPos.y; + } else { + body.prevPos.x = body.pos.x; + body.prevPos.y = body.pos.y; + } + if (body.pos.x < x1) { + x1 = body.pos.x; + } + if (body.pos.x > x2) { + x2 = body.pos.x; + } + if (body.pos.y < y1) { + y1 = body.pos.y; + } + if (body.pos.y > y2) { + y2 = body.pos.y; + } + } + + boundingBox.x1 = x1; + boundingBox.x2 = x2; + boundingBox.y1 = y1; + boundingBox.y2 = y2; } +} + +},{"ngraph.random":26}],17:[function(require,module,exports){ +var physics = require('ngraph.physics.primitives'); + +module.exports = function(pos) { + return new physics.Body(pos); +} + +},{"ngraph.physics.primitives":14}],18:[function(require,module,exports){ +/** + * Represents drag force, which reduces force value on each step by given + * coefficient. + * + * @param {Object} options for the drag force + * @param {Number=} options.dragCoeff drag force coefficient. 0.1 by default + */ +module.exports = function (options) { + var merge = require('ngraph.merge'), + expose = require('ngraph.expose'); - function recordNodeChangeReal(node, changeType) { - changes.push({ - node: node, - changeType: changeType - }); - } + options = merge(options, { + dragCoeff: 0.02 + }); - function addNode(nodeId, data) { - if (nodeId === undefined) { - throw new Error('Invalid node identifier'); + var api = { + update : function (body) { + body.force.x -= options.dragCoeff * body.velocity.x; + body.force.y -= options.dragCoeff * body.velocity.y; } + }; - enterModification(); + // let easy access to dragCoeff: + expose(options, api, ['dragCoeff']); - var node = getNode(nodeId); - if (!node) { - // TODO: Should I check for 👉 here? - node = new Node(nodeId); - nodesCount++; - recordNodeChange(node, 'add'); - } else { - recordNodeChange(node, 'update'); - } + return api; +}; - node.data = data; +},{"ngraph.expose":8,"ngraph.merge":13}],19:[function(require,module,exports){ +/** + * Performs forces integration, using given timestep. Uses Euler method to solve + * differential equation (http://en.wikipedia.org/wiki/Euler_method ). + * + * @returns {Number} squared distance of total position updates. + */ - nodes[nodeId] = node; +module.exports = integrate; - exitModification(); - return node; - } +function integrate(bodies, timeStep) { + var dx = 0, tx = 0, + dy = 0, ty = 0, + i, + max = bodies.length; - function getNode(nodeId) { - return nodes[nodeId]; - } + for (i = 0; i < max; ++i) { + var body = bodies[i], + coeff = timeStep / body.mass; - function removeNode(nodeId) { - var node = getNode(nodeId); - if (!node) { - return false; + body.velocity.x += coeff * body.force.x; + body.velocity.y += coeff * body.force.y; + var vx = body.velocity.x, + vy = body.velocity.y, + v = Math.sqrt(vx * vx + vy * vy); + + if (v > 1) { + body.velocity.x = vx / v; + body.velocity.y = vy / v; } - enterModification(); + dx = timeStep * body.velocity.x; + dy = timeStep * body.velocity.y; - while (node.links.length) { - var link = node.links[0]; - removeLink(link); - } + body.pos.x += dx; + body.pos.y += dy; - delete nodes[nodeId]; - nodesCount--; + tx += Math.abs(dx); ty += Math.abs(dy); + } - recordNodeChange(node, 'remove'); + return (tx * tx + ty * ty)/bodies.length; +} - exitModification(); +},{}],20:[function(require,module,exports){ +module.exports = Spring; - return true; - } +/** + * Represents a physical spring. Spring connects two bodies, has rest length + * stiffness coefficient and optional weight + */ +function Spring(fromBody, toBody, length, coeff, weight) { + this.from = fromBody; + this.to = toBody; + this.length = length; + this.coeff = coeff; + this.weight = typeof weight === 'number' ? weight : 1; +}; - function addLink(fromId, toId, data) { - enterModification(); +},{}],21:[function(require,module,exports){ +/** + * Represents spring force, which updates forces acting on two bodies, conntected + * by a spring. + * + * @param {Object} options for the spring force + * @param {Number=} options.springCoeff spring force coefficient. + * @param {Number=} options.springLength desired length of a spring at rest. + */ +module.exports = function (options) { + var merge = require('ngraph.merge'); + var random = require('ngraph.random').random(42); + var expose = require('ngraph.expose'); - var fromNode = getNode(fromId) || addNode(fromId); - var toNode = getNode(toId) || addNode(toId); + options = merge(options, { + springCoeff: 0.0002, + springLength: 80 + }); - var link = createLink(fromId, toId, data); + var api = { + /** + * Upsates forces acting on a spring + */ + update : function (spring) { + var body1 = spring.from, + body2 = spring.to, + length = spring.length < 0 ? options.springLength : spring.length, + dx = body2.pos.x - body1.pos.x, + dy = body2.pos.y - body1.pos.y, + r = Math.sqrt(dx * dx + dy * dy); - links.push(link); + if (r === 0) { + dx = (random.nextDouble() - 0.5) / 50; + dy = (random.nextDouble() - 0.5) / 50; + r = Math.sqrt(dx * dx + dy * dy); + } - // TODO: this is not cool. On large graphs potentially would consume more memory. - fromNode.links.push(link); - if (fromId !== toId) { - // make sure we are not duplicating links for self-loops - toNode.links.push(link); + var d = r - length; + var coeff = ((!spring.coeff || spring.coeff < 0) ? options.springCoeff : spring.coeff) * d / r * spring.weight; + + body1.force.x += coeff * dx; + body1.force.y += coeff * dy; + + body2.force.x -= coeff * dx; + body2.force.y -= coeff * dy; } + }; - recordLinkChange(link, 'add'); + expose(options, api, ['springCoeff', 'springLength']); + return api; +} - exitModification(); +},{"ngraph.expose":8,"ngraph.merge":13,"ngraph.random":26}],22:[function(require,module,exports){ +/** + * This is Barnes Hut simulation algorithm for 2d case. Implementation + * is highly optimized (avoids recusion and gc pressure) + * + * http://www.cs.princeton.edu/courses/archive/fall03/cs126/assignments/barnes-hut.html + */ - return link; - } +module.exports = function(options) { + options = options || {}; + options.gravity = typeof options.gravity === 'number' ? options.gravity : -1; + options.theta = typeof options.theta === 'number' ? options.theta : 0.8; - function createSingleLink(fromId, toId, data) { - var linkId = fromId.toString() + toId.toString(); - return new Link(fromId, toId, data, linkId); - } + // we require deterministic randomness here + var random = require('ngraph.random').random(1984), + Node = require('./node'), + InsertStack = require('./insertStack'), + isSamePosition = require('./isSamePosition'); - function createUniqueLink(fromId, toId, data) { - var linkId = fromId.toString() + '👉 ' + toId.toString(); - var isMultiEdge = multiEdges.hasOwnProperty(linkId); - if (isMultiEdge || getLink(fromId, toId)) { - if (!isMultiEdge) { - multiEdges[linkId] = 0; - } - linkId += '@' + (++multiEdges[linkId]); - } + var gravity = options.gravity, + updateQueue = [], + insertStack = new InsertStack(), + theta = options.theta, - return new Link(fromId, toId, data, linkId); - } + nodesCache = [], + currentInCache = 0, + newNode = function() { + // To avoid pressure on GC we reuse nodes. + var node = nodesCache[currentInCache]; + if (node) { + node.quad0 = null; + node.quad1 = null; + node.quad2 = null; + node.quad3 = null; + node.body = null; + node.mass = node.massX = node.massY = 0; + node.left = node.right = node.top = node.bottom = 0; + } else { + node = new Node(); + nodesCache[currentInCache] = node; + } - function getLinks(nodeId) { - var node = getNode(nodeId); - return node ? node.links : null; - } + ++currentInCache; + return node; + }, - function removeLink(link) { - if (!link) { - return false; - } - var idx = indexOfElementInArray(link, links); - if (idx < 0) { - return false; - } + root = newNode(), - enterModification(); + // Inserts body to the tree + insert = function(newBody) { + insertStack.reset(); + insertStack.push(root, newBody); - links.splice(idx, 1); + while (!insertStack.isEmpty()) { + var stackItem = insertStack.pop(), + node = stackItem.node, + body = stackItem.body; - var fromNode = getNode(link.fromId); - var toNode = getNode(link.toId); + if (!node.body) { + // This is internal node. Update the total mass of the node and center-of-mass. + var x = body.pos.x; + var y = body.pos.y; + node.mass = node.mass + body.mass; + node.massX = node.massX + body.mass * x; + node.massY = node.massY + body.mass * y; - if (fromNode) { - idx = indexOfElementInArray(link, fromNode.links); - if (idx >= 0) { - fromNode.links.splice(idx, 1); - } - } + // Recursively insert the body in the appropriate quadrant. + // But first find the appropriate quadrant. + var quadIdx = 0, // Assume we are in the 0's quad. + left = node.left, + right = (node.right + left) / 2, + top = node.top, + bottom = (node.bottom + top) / 2; - if (toNode) { - idx = indexOfElementInArray(link, toNode.links); - if (idx >= 0) { - toNode.links.splice(idx, 1); - } - } + if (x > right) { // somewhere in the eastern part. + quadIdx = quadIdx + 1; + var oldLeft = left; + left = right; + right = right + (right - oldLeft); + } + if (y > bottom) { // and in south. + quadIdx = quadIdx + 2; + var oldTop = top; + top = bottom; + bottom = bottom + (bottom - oldTop); + } - recordLinkChange(link, 'remove'); + var child = getChild(node, quadIdx); + if (!child) { + // The node is internal but this quadrant is not taken. Add + // subnode to it. + child = newNode(); + child.left = left; + child.top = top; + child.right = right; + child.bottom = bottom; + child.body = body; - exitModification(); + setChild(node, quadIdx, child); + } else { + // continue searching in this quadrant. + insertStack.push(child, body); + } + } else { + // We are trying to add to the leaf node. + // We have to convert current leaf into internal node + // and continue adding two nodes. + var oldBody = node.body; + node.body = null; // internal nodes do not cary bodies - return true; - } + if (isSamePosition(oldBody.pos, body.pos)) { + // Prevent infinite subdivision by bumping one node + // anywhere in this quadrant + var retriesCount = 3; + do { + var offset = random.nextDouble(); + var dx = (node.right - node.left) * offset; + var dy = (node.bottom - node.top) * offset; - function getLink(fromNodeId, toNodeId) { - // TODO: Use sorted links to speed this up - var node = getNode(fromNodeId), - i; - if (!node) { - return null; - } + oldBody.pos.x = node.left + dx; + oldBody.pos.y = node.top + dy; + retriesCount -= 1; + // Make sure we don't bump it out of the box. If we do, next iteration should fix it + } while (retriesCount > 0 && isSamePosition(oldBody.pos, body.pos)); - for (i = 0; i < node.links.length; ++i) { - var link = node.links[i]; - if (link.fromId === fromNodeId && link.toId === toNodeId) { - return link; + if (retriesCount === 0 && isSamePosition(oldBody.pos, body.pos)) { + // This is very bad, we ran out of precision. + // if we do not return from the method we'll get into + // infinite loop here. So we sacrifice correctness of layout, and keep the app running + // Next layout iteration should get larger bounding box in the first step and fix this + return; + } + } + // Next iteration should subdivide node further. + insertStack.push(node, oldBody); + insertStack.push(node, body); + } } - } + }, - return null; // no link. - } + update = function(sourceBody) { + var queue = updateQueue, + v, + dx, + dy, + r, fx = 0, + fy = 0, + queueLength = 1, + shiftIdx = 0, + pushIdx = 1; - function clear() { - enterModification(); - forEachNode(function(node) { - removeNode(node.id); - }); - exitModification(); - } + queue[0] = root; - function forEachLink(callback) { - var i, length; - if (typeof callback === 'function') { - for (i = 0, length = links.length; i < length; ++i) { - callback(links[i]); - } - } - } + while (queueLength) { + var node = queue[shiftIdx], + body = node.body; - function forEachLinkedNode(nodeId, callback, oriented) { - var node = getNode(nodeId); + queueLength -= 1; + shiftIdx += 1; + var differentBody = (body !== sourceBody); + if (body && differentBody) { + // If the current node is a leaf node (and it is not source body), + // calculate the force exerted by the current node on body, and add this + // amount to body's net force. + dx = body.pos.x - sourceBody.pos.x; + dy = body.pos.y - sourceBody.pos.y; + r = Math.sqrt(dx * dx + dy * dy); - if (node && node.links && typeof callback === 'function') { - if (oriented) { - return forEachOrientedLink(node.links, nodeId, callback); - } else { - return forEachNonOrientedLink(node.links, nodeId, callback); - } - } - } + if (r === 0) { + // Poor man's protection against zero distance. + dx = (random.nextDouble() - 0.5) / 50; + dy = (random.nextDouble() - 0.5) / 50; + r = Math.sqrt(dx * dx + dy * dy); + } - function forEachNonOrientedLink(links, nodeId, callback) { - var quitFast; - for (var i = 0; i < links.length; ++i) { - var link = links[i]; - var linkedNodeId = link.fromId === nodeId ? link.toId : link.fromId; + // This is standard gravition force calculation but we divide + // by r^3 to save two operations when normalizing force vector. + v = gravity * body.mass * sourceBody.mass / (r * r * r); + fx += v * dx; + fy += v * dy; + } else if (differentBody) { + // Otherwise, calculate the ratio s / r, where s is the width of the region + // represented by the internal node, and r is the distance between the body + // and the node's center-of-mass + dx = node.massX / node.mass - sourceBody.pos.x; + dy = node.massY / node.mass - sourceBody.pos.y; + r = Math.sqrt(dx * dx + dy * dy); - quitFast = callback(nodes[linkedNodeId], link); - if (quitFast) { - return true; // Client does not need more iterations. Break now. - } - } - } + if (r === 0) { + // Sorry about code duplucation. I don't want to create many functions + // right away. Just want to see performance first. + dx = (random.nextDouble() - 0.5) / 50; + dy = (random.nextDouble() - 0.5) / 50; + r = Math.sqrt(dx * dx + dy * dy); + } + // If s / r < θ, treat this internal node as a single body, and calculate the + // force it exerts on sourceBody, and add this amount to sourceBody's net force. + if ((node.right - node.left) / r < theta) { + // in the if statement above we consider node's width only + // because the region was squarified during tree creation. + // Thus there is no difference between using width or height. + v = gravity * node.mass * sourceBody.mass / (r * r * r); + fx += v * dx; + fy += v * dy; + } else { + // Otherwise, run the procedure recursively on each of the current node's children. - function forEachOrientedLink(links, nodeId, callback) { - var quitFast; - for (var i = 0; i < links.length; ++i) { - var link = links[i]; - if (link.fromId === nodeId) { - quitFast = callback(nodes[link.toId], link); - if (quitFast) { - return true; // Client does not need more iterations. Break now. + // I intentionally unfolded this loop, to save several CPU cycles. + if (node.quad0) { + queue[pushIdx] = node.quad0; + queueLength += 1; + pushIdx += 1; + } + if (node.quad1) { + queue[pushIdx] = node.quad1; + queueLength += 1; + pushIdx += 1; + } + if (node.quad2) { + queue[pushIdx] = node.quad2; + queueLength += 1; + pushIdx += 1; + } + if (node.quad3) { + queue[pushIdx] = node.quad3; + queueLength += 1; + pushIdx += 1; + } + } } } - } - } - - // we will not fire anything until users of this library explicitly call `on()` - // method. - function noop() {} - - // Enter, Exit modification allows bulk graph updates without firing events. - function enterModificationReal() { - suspendEvents += 1; - } - function exitModificationReal() { - suspendEvents -= 1; - if (suspendEvents === 0 && changes.length > 0) { - graphPart.fire('changed', changes); - changes.length = 0; - } - } + sourceBody.force.x += fx; + sourceBody.force.y += fy; + }, - function createNodeIterator() { - // Object.keys iterator is 1.3x faster than `for in` loop. - // See `https://github.com/anvaka/ngraph.graph/tree/bench-for-in-vs-obj-keys` - // branch for perf test - return Object.keys ? objectKeysIterator : forInIterator; - } + insertBodies = function(bodies) { + var x1 = Number.MAX_VALUE, + y1 = Number.MAX_VALUE, + x2 = Number.MIN_VALUE, + y2 = Number.MIN_VALUE, + i, + max = bodies.length; - function objectKeysIterator(callback) { - if (typeof callback !== 'function') { - return; - } + // To reduce quad tree depth we are looking for exact bounding box of all particles. + i = max; + while (i--) { + var x = bodies[i].pos.x; + var y = bodies[i].pos.y; + if (x < x1) { + x1 = x; + } + if (x > x2) { + x2 = x; + } + if (y < y1) { + y1 = y; + } + if (y > y2) { + y2 = y; + } + } - var keys = Object.keys(nodes); - for (var i = 0; i < keys.length; ++i) { - if (callback(nodes[keys[i]])) { - return true; // client doesn't want to proceed. Return. + // Squarify the bounds. + var dx = x2 - x1, + dy = y2 - y1; + if (dx > dy) { + y2 = y1 + dx; + } else { + x2 = x1 + dy; } - } - } - function forInIterator(callback) { - if (typeof callback !== 'function') { - return; - } - var node; + currentInCache = 0; + root = newNode(); + root.left = x1; + root.right = x2; + root.top = y1; + root.bottom = y2; - for (node in nodes) { - if (callback(nodes[node])) { - return true; // client doesn't want to proceed. Return. + i = max - 1; + if (i > 0) { + root.body = bodies[i]; } - } - } -} + while (i--) { + insert(bodies[i], root); + } + }; -// need this for old browsers. Should this be a separate module? -function indexOfElementInArray(element, array) { - if (array.indexOf) { - return array.indexOf(element); - } + return { + insertBodies: insertBodies, + updateBodyForce: update, + options: function(newOptions) { + if (newOptions) { + if (typeof newOptions.gravity === 'number') { + gravity = newOptions.gravity; + } + if (typeof newOptions.theta === 'number') { + theta = newOptions.theta; + } - var len = array.length, - i; + return this; + } - for (i = 0; i < len; i += 1) { - if (array[i] === element) { - return i; + return { + gravity: gravity, + theta: theta + }; } - } + }; +}; - return -1; +function getChild(node, idx) { + if (idx === 0) return node.quad0; + if (idx === 1) return node.quad1; + if (idx === 2) return node.quad2; + if (idx === 3) return node.quad3; + return null; } -/** - * Internal structure to represent node; - */ -function Node(id) { - this.id = id; - this.links = []; - this.data = null; +function setChild(node, idx, child) { + if (idx === 0) node.quad0 = child; + else if (idx === 1) node.quad1 = child; + else if (idx === 2) node.quad2 = child; + else if (idx === 3) node.quad3 = child; } +},{"./insertStack":23,"./isSamePosition":24,"./node":25,"ngraph.random":26}],23:[function(require,module,exports){ +module.exports = InsertStack; /** - * Internal structure to represent links; + * Our implmentation of QuadTree is non-recursive to avoid GC hit + * This data structure represent stack of elements + * which we are trying to insert into quad tree. */ -function Link(fromId, toId, data, id) { - this.fromId = fromId; - this.toId = toId; - this.data = data; - this.id = id; +function InsertStack () { + this.stack = []; + this.popIdx = 0; } -},{"ngraph.events":6}],24:[function(require,module,exports){ -module.exports = merge; - -/** - * Augments `target` with properties in `options`. Does not override - * target's properties if they are defined and matches expected type in - * options - * - * @returns {Object} merged object - */ -function merge(target, options) { - var key; - if (!target) { target = {}; } - if (options) { - for (key in options) { - if (options.hasOwnProperty(key)) { - var targetHasIt = target.hasOwnProperty(key), - optionsValueType = typeof options[key], - shouldReplace = !targetHasIt || (typeof target[key] !== optionsValueType); - - if (shouldReplace) { - target[key] = options[key]; - } else if (optionsValueType === 'object') { - // go deep, don't care about loops here, we are simple API!: - target[key] = merge(target[key], options[key]); +InsertStack.prototype = { + isEmpty: function() { + return this.popIdx === 0; + }, + push: function (node, body) { + var item = this.stack[this.popIdx]; + if (!item) { + // we are trying to avoid memory pressue: create new element + // only when absolutely necessary + this.stack[this.popIdx] = new InsertStackElement(node, body); + } else { + item.node = node; + item.body = body; } - } + ++this.popIdx; + }, + pop: function () { + if (this.popIdx > 0) { + return this.stack[--this.popIdx]; + } + }, + reset: function () { + this.popIdx = 0; } - } +}; - return target; +function InsertStackElement(node, body) { + this.node = node; // QuadTree node + this.body = body; // physical body which needs to be inserted to node } +},{}],24:[function(require,module,exports){ +module.exports = function isSamePosition(point1, point2) { + var dx = Math.abs(point1.x - point2.x); + var dy = Math.abs(point1.y - point2.y); + + return (dx < 1e-8 && dy < 1e-8); +}; + },{}],25:[function(require,module,exports){ +/** + * Internal data structure to represent 2D QuadTree node + */ +module.exports = function Node() { + // body stored inside this node. In quad tree only leaf nodes (by construction) + // contain boides: + this.body = null; + + // Child nodes are stored in quads. Each quad is presented by number: + // 0 | 1 + // ----- + // 2 | 3 + this.quad0 = null; + this.quad1 = null; + this.quad2 = null; + this.quad3 = null; + + // Total mass of current node + this.mass = 0; + + // Center of mass coordinates + this.massX = 0; + this.massY = 0; + + // bounding box coordinates + this.left = 0; + this.top = 0; + this.bottom = 0; + this.right = 0; +}; + +},{}],26:[function(require,module,exports){ module.exports = { random: random, randomIterator: randomIterator @@ -2816,7 +2864,7 @@ function randomIterator(array, customRandom) { }; } -},{}],26:[function(require,module,exports){ +},{}],27:[function(require,module,exports){ module.exports = save; function save(graph, customNodeTransform, customLinkTransform) { @@ -2872,7 +2920,7 @@ function save(graph, customNodeTransform, customLinkTransform) { } } -},{}],27:[function(require,module,exports){ +},{}],28:[function(require,module,exports){ module.exports = svg; svg.compile = require('./lib/compile'); @@ -2985,7 +3033,7 @@ function augment(element) { } } -},{"./lib/compile":28,"./lib/compile_template":29,"add-event-listener":31}],28:[function(require,module,exports){ +},{"./lib/compile":29,"./lib/compile_template":30,"add-event-listener":2}],29:[function(require,module,exports){ var parser = require('./domparser.js'); var svg = require('../'); @@ -3013,7 +3061,7 @@ function addNamespaces(text) { } } -},{"../":27,"./domparser.js":30}],29:[function(require,module,exports){ +},{"../":28,"./domparser.js":31}],30:[function(require,module,exports){ module.exports = template; var BINDING_EXPR = /{{(.+?)}}/; @@ -3107,7 +3155,7 @@ function bindTextContent(element, allBindings) { } } -},{}],30:[function(require,module,exports){ +},{}],31:[function(require,module,exports){ module.exports = createDomparser(); function createDomparser() { @@ -3123,54 +3171,6 @@ function fail() { throw new Error('DOMParser is not supported by this platform. Please open issue here https://github.com/anvaka/simplesvg'); } -},{}],31:[function(require,module,exports){ -addEventListener.removeEventListener = removeEventListener -addEventListener.addEventListener = addEventListener - -module.exports = addEventListener - -var Events = null - -function addEventListener(el, eventName, listener, useCapture) { - Events = Events || ( - document.addEventListener ? - {add: stdAttach, rm: stdDetach} : - {add: oldIEAttach, rm: oldIEDetach} - ) - - return Events.add(el, eventName, listener, useCapture) -} - -function removeEventListener(el, eventName, listener, useCapture) { - Events = Events || ( - document.addEventListener ? - {add: stdAttach, rm: stdDetach} : - {add: oldIEAttach, rm: oldIEDetach} - ) - - return Events.rm(el, eventName, listener, useCapture) -} - -function stdAttach(el, eventName, listener, useCapture) { - el.addEventListener(eventName, listener, useCapture) -} - -function stdDetach(el, eventName, listener, useCapture) { - el.removeEventListener(eventName, listener, useCapture) -} - -function oldIEAttach(el, eventName, listener, useCapture) { - if(useCapture) { - throw new Error('cannot useCapture in oldIE') - } - - el.attachEvent('on' + eventName, listener) -} - -function oldIEDetach(el, eventName, listener, useCapture) { - el.detachEvent('on' + eventName, listener) -} - },{}],32:[function(require,module,exports){ var centrality = require('ngraph.centrality'); @@ -3209,7 +3209,7 @@ function toVivaGraphCentralityFormat(centrality) { } } -},{"ngraph.centrality":3}],33:[function(require,module,exports){ +},{"ngraph.centrality":4}],33:[function(require,module,exports){ /** * @fileOverview Contains collection of primitive operations under graph. * @@ -3846,7 +3846,7 @@ function constant(graph, userSettings) { } } -},{"../Utils/rect.js":45,"ngraph.merge":24,"ngraph.random":25}],38:[function(require,module,exports){ +},{"../Utils/rect.js":45,"ngraph.merge":13,"ngraph.random":26}],38:[function(require,module,exports){ /** * This module provides compatibility layer with 0.6.x library. It will be * removed in the next version @@ -3891,7 +3891,7 @@ function backwardCompatibleEvents(g) { } } -},{"ngraph.events":6}],39:[function(require,module,exports){ +},{"ngraph.events":7}],39:[function(require,module,exports){ module.exports = browserInfo(); function browserInfo() { @@ -3997,7 +3997,7 @@ function intersectRect(left, top, right, bottom, x1, y1, x2, y2) { intersect(right, top, left, top, x1, y1, x2, y2); } -},{"gintersect":2}],44:[function(require,module,exports){ +},{"gintersect":3}],44:[function(require,module,exports){ module.exports = createNullEvents(); function createNullEvents() { @@ -4582,6 +4582,7 @@ function renderer(graph, settings) { graphics.translateRel(offset.x, offset.y); renderGraph(); + publicEvents.fire('drag', offset); }); } @@ -4624,7 +4625,7 @@ function renderer(graph, settings) { } } -},{"../Input/domInputManager.js":34,"../Input/dragndrop.js":35,"../Utils/getDimensions.js":42,"../Utils/timer.js":46,"../Utils/windowEvents.js":47,"./svgGraphics.js":49,"ngraph.events":6,"ngraph.forcelayout":7}],49:[function(require,module,exports){ +},{"../Input/domInputManager.js":34,"../Input/dragndrop.js":35,"../Utils/getDimensions.js":42,"../Utils/timer.js":46,"../Utils/windowEvents.js":47,"./svgGraphics.js":49,"ngraph.events":7,"ngraph.forcelayout":9}],49:[function(require,module,exports){ /** * @fileOverview Defines a graph renderer that uses SVG based drawings. * @@ -4982,7 +4983,7 @@ function svgGraphics() { } } -},{"../Input/domInputManager.js":34,"ngraph.events":6,"simplesvg":27}],50:[function(require,module,exports){ +},{"../Input/domInputManager.js":34,"ngraph.events":7,"simplesvg":28}],50:[function(require,module,exports){ /** * @fileOverview Defines a graph renderer that uses WebGL based drawings. * @@ -5564,7 +5565,7 @@ function webglGraphics(options) { return graphics; } -},{"../Input/webglInputManager.js":36,"../WebGL/webglLine.js":58,"../WebGL/webglLinkProgram.js":59,"../WebGL/webglNodeProgram.js":60,"../WebGL/webglSquare.js":61,"ngraph.events":6,"ngraph.merge":24}],51:[function(require,module,exports){ +},{"../Input/webglInputManager.js":36,"../WebGL/webglLine.js":58,"../WebGL/webglLinkProgram.js":59,"../WebGL/webglNodeProgram.js":60,"../WebGL/webglSquare.js":61,"ngraph.events":7,"ngraph.merge":13}],51:[function(require,module,exports){ module.exports = parseColor; function parseColor(color) { diff --git a/dist/vivagraph.min.js b/dist/vivagraph.min.js index ee186a0..b926426 100644 --- a/dist/vivagraph.min.js +++ b/dist/vivagraph.min.js @@ -1,2 +1,2 @@ -!function(e){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=e();else if("function"==typeof define&&define.amd)define([],e);else{var n;"undefined"!=typeof window?n=window:"undefined"!=typeof global?n=global:"undefined"!=typeof self&&(n=self),n.Viva=e()}}(function(){return function e(n,t,r){function o(a,u){if(!t[a]){if(!n[a]){var s="function"==typeof require&&require;if(!u&&s)return s(a,!0);if(i)return i(a,!0);var f=new Error("Cannot find module '"+a+"'");throw f.code="MODULE_NOT_FOUND",f}var c=t[a]={exports:{}};n[a][0].call(c.exports,function(e){var t=n[a][1][e];return o(t?t:e)},c,c.exports,e,n,t,r)}return t[a].exports}for(var i="function"==typeof require&&require,a=0;a=0==m>=4?null:(f=u-i,d=o-a,p=a*i-o*u,v=f*e+d*n+p,g=f*t+d*r+p,0!==v&&0!==g&&v>=0==g>=0?null:(y=s*d-f*c,0===y?null:(x=0>y?-y/2:y/2,x=0,w=c*p-d*l,b.x=(0>w?w-x:w+x)/y,w=f*l-s*p,b.y=(0>w?w-x:w+x)/y,b)))}n.exports=r},{}],3:[function(e,n,t){n.exports.degree=e("./src/degree.js"),n.exports.betweenness=e("./src/betweenness.js")},{"./src/betweenness.js":4,"./src/degree.js":5}],4:[function(e,n,t){function r(e,n){function t(e){g[e]/=2}function r(e){g[e.id]=0}function o(e){s=e.id,u(s),i()}function i(){for(e.forEachNode(a);c.length;){for(var n=c.pop(),t=(1+v[n])/p[n],r=d[n],o=0;o1&&(o=Array.prototype.splice.call(arguments,1));for(var i=0;ir;++r){var o=e.links[r],i=o.fromId!==e.id?w[o.fromId]:w[o.toId];i&&i.pos&&n.push(i)}return n}function v(e){var n=w[e];n.mass=m(e)}function g(e){return e&&(e.isPinned||e.data&&e.data.isPinned)}function h(e){var n=w[e];return n||(f(e),n=w[e]),n}function m(e){return 1+n.getLinks(e).length/3}if(!n)throw new Error("Graph structure cannot be undefined");var y=e("ngraph.physics.simulator"),x=y(t),w="function"==typeof Object.create?Object.create(null):{},b={},E=x.settings.springTransform||o;s(),a();var L={step:function(){return x.step()},getNodePosition:function(e){return h(e).pos},setNodePosition:function(e){var n=h(e);n.setPosition.apply(n,Array.prototype.slice.call(arguments,1))},getLinkPosition:function(e){var n=b[e];return n?{from:n.from.pos,to:n.to.pos}:void 0},getGraphRect:function(){return x.getBBox()},pinNode:function(e,n){var t=h(e.id);t.isPinned=!!n},isNodePinned:function(e){return h(e.id).isPinned},dispose:function(){n.off("changed",u)},getBody:i,getSpring:r,simulator:x};return L}function o(){}n.exports=r,n.exports.simulator=e("ngraph.physics.simulator")},{"ngraph.physics.simulator":8}],8:[function(e,n,t){function r(n){function t(){var e,n=l.length;if(n)for(v.insertBodies(l);n--;)e=l[n],e.isPinned||(e.force.reset(),v.updateBodyForce(e),m.update(e));for(n=p.length;n--;)h.update(p[n])}var r=e("./lib/spring"),o=e("ngraph.expose"),i=e("ngraph.merge");n=i(n,{springLength:30,springCoeff:8e-4,gravity:-1.2,theta:.8,dragCoeff:.02,timeStep:20,stableThreshold:.009});var a=n.createQuadTree||e("ngraph.quadtreebh"),u=n.createBounds||e("./lib/bounds"),s=n.createDragForce||e("./lib/dragForce"),f=n.createSpringForce||e("./lib/springForce"),c=n.integrator||e("./lib/eulerIntegrator"),d=n.createBody||e("./lib/createBody"),l=[],p=[],v=a(n),g=u(l,n),h=f(n),m=s(n),y={bodies:l,springs:p,settings:n,step:function(){t();var e=c(l,n.timeStep);return g.update(),en))return l.splice(n,1),0===l.length&&g.reset(),!0}},addSpring:function(e,n,t,o,i){if(!e||!n)throw new Error("Cannot add null spring to force simulator");"number"!=typeof t&&(t=-1);var a=new r(e,n,t,i>=0?i:-1,o);return p.push(a),a},removeSpring:function(e){if(e){var n=p.indexOf(e);return n>-1?(p.splice(n,1),!0):void 0}},getBestNewBodyPosition:function(e){return g.getBestNewPosition(e)},getBBox:function(){return g.box},gravity:function(e){return void 0!==e?(n.gravity=e,v.options({gravity:e}),this):n.gravity},theta:function(e){return void 0!==e?(n.theta=e,v.options({theta:e}),this):n.theta}};return o(n,y),y}n.exports=r},{"./lib/bounds":9,"./lib/createBody":10,"./lib/dragForce":11,"./lib/eulerIntegrator":12,"./lib/spring":13,"./lib/springForce":14,"ngraph.expose":15,"ngraph.merge":24,"ngraph.quadtreebh":17}],9:[function(e,n,t){n.exports=function(n,t){function r(){var e=n.length;if(0!==e){for(var t=Number.MAX_VALUE,r=Number.MAX_VALUE,o=Number.MIN_VALUE,a=Number.MIN_VALUE;e--;){var u=n[e];u.isPinned?(u.pos.x=u.prevPos.x,u.pos.y=u.prevPos.y):(u.prevPos.x=u.pos.x,u.prevPos.y=u.pos.y),u.pos.xo&&(o=u.pos.x),u.pos.ya&&(a=u.pos.y)}i.x1=t,i.x2=o,i.y1=r,i.y2=a}}var o=e("ngraph.random").random(42),i={x1:0,y1:0,x2:0,y2:0};return{box:i,update:r,reset:function(){i.x1=i.y1=0,i.x2=i.y2=0},getBestNewPosition:function(e){var n=i,r=0,a=0;if(e.length){for(var u=0;ut;++t){var s=e[t],f=n/s.mass;s.velocity.x+=f*s.force.x,s.velocity.y+=f*s.force.y;var c=s.velocity.x,d=s.velocity.y,l=Math.sqrt(c*c+d*d);l>1&&(s.velocity.x=c/l,s.velocity.y=d/l),r=n*s.velocity.x,i=n*s.velocity.y,s.pos.x+=r,s.pos.y+=i,o+=Math.abs(r),a+=Math.abs(i)}return(o*o+a*a)/e.length}n.exports=r},{}],13:[function(e,n,t){function r(e,n,t,r,o){this.from=e,this.to=n,this.length=t,this.coeff=r,this.weight="number"==typeof o?o:1}n.exports=r},{}],14:[function(e,n,t){n.exports=function(n){var t=e("ngraph.merge"),r=e("ngraph.random").random(42),o=e("ngraph.expose");n=t(n,{springCoeff:2e-4,springLength:80});var i={update:function(e){var t=e.from,o=e.to,i=e.length<0?n.springLength:e.length,a=o.pos.x-t.pos.x,u=o.pos.y-t.pos.y,s=Math.sqrt(a*a+u*u);0===s&&(a=(r.nextDouble()-.5)/50,u=(r.nextDouble()-.5)/50,s=Math.sqrt(a*a+u*u));var f=s-i,c=(!e.coeff||e.coeff<0?n.springCoeff:e.coeff)*f/s*e.weight;t.force.x+=c*a,t.force.y+=c*u,o.force.x-=c*a,o.force.y-=c*u}};return o(n,i,["springCoeff","springLength"]),i}},{"ngraph.expose":15,"ngraph.merge":24,"ngraph.random":25}],15:[function(e,n,t){function r(e,n,t){var r="[object Array]"===Object.prototype.toString.call(t);if(r)for(var i=0;i0&&u(s.pos,a.pos));if(0===f&&u(s.pos,a.pos))return}c.push(i,s),c.push(i,a)}else{var h=a.pos.x,m=a.pos.y;i.mass=i.mass+a.mass,i.massX=i.massX+a.mass*h,i.massY=i.massY+a.mass*m;var y=0,x=i.left,w=(i.right+x)/2,b=i.top,E=(i.bottom+b)/2;if(h>w){y+=1;var L=x;x=w,w+=w-L}if(m>E){y+=2;var P=b;b=E,E+=E-P}var N=r(i,y);N?c.push(N,a):(N=v(),N.left=x,N.top=b,N.right=w,N.bottom=E,N.body=a,o(i,y,N))}}},m=function(e){var n,r,o,i,a=f,u=0,c=0,l=1,p=0,v=1;for(a[0]=g;l;){var h=a[p],m=h.body;l-=1,p+=1;var y=m!==e;m&&y?(r=m.pos.x-e.pos.x,o=m.pos.y-e.pos.y,i=Math.sqrt(r*r+o*o),0===i&&(r=(t.nextDouble()-.5)/50,o=(t.nextDouble()-.5)/50,i=Math.sqrt(r*r+o*o)),n=s*m.mass*e.mass/(i*i*i),u+=n*r,c+=n*o):y&&(r=h.massX/h.mass-e.pos.x,o=h.massY/h.mass-e.pos.y,i=Math.sqrt(r*r+o*o),0===i&&(r=(t.nextDouble()-.5)/50,o=(t.nextDouble()-.5)/50,i=Math.sqrt(r*r+o*o)),(h.right-h.left)/iu&&(t=u),u>o&&(o=u),r>s&&(r=s),s>i&&(i=s)}var f=o-t,c=i-r;for(f>c?i=r+f:o=t+c,p=0,g=v(),g.left=t,g.right=o,g.top=r,g.bottom=i,n=a-1,n>0&&(g.body=e[n]);n--;)h(e[n],g)};return{insertBodies:y,updateBodyForce:m,options:function(e){return e?("number"==typeof e.gravity&&(s=e.gravity),"number"==typeof e.theta&&(d=e.theta),this):{gravity:s,theta:d}}}}},{"./insertStack":18,"./isSamePosition":19,"./node":20,"ngraph.random":25}],18:[function(e,n,t){function r(){this.stack=[],this.popIdx=0}function o(e,n){this.node=e,this.body=n}n.exports=r,r.prototype={isEmpty:function(){return 0===this.popIdx},push:function(e,n){var t=this.stack[this.popIdx];t?(t.node=e,t.body=n):this.stack[this.popIdx]=new o(e,n),++this.popIdx},pop:function(){return this.popIdx>0?this.stack[--this.popIdx]:void 0},reset:function(){this.popIdx=0}}},{}],19:[function(e,n,t){n.exports=function(e,n){var t=Math.abs(e.x-n.x),r=Math.abs(e.y-n.y);return 1e-8>t&&1e-8>r}},{}],20:[function(e,n,t){n.exports=function(){this.body=null,this.quad0=null,this.quad1=null,this.quad2=null,this.quad3=null,this.mass=0,this.massX=0,this.massY=0,this.left=0,this.top=0,this.bottom=0,this.right=0}},{}],21:[function(e,n,t){function r(e,n,t){var r;n=n||o,t=t||o,r="string"==typeof e?JSON.parse(e):e;var a,u=i();if(void 0===r.links||void 0===r.nodes)throw new Error("Cannot load graph without links and nodes");for(a=0;ae)throw new Error("Invalid number of nodes");var n,t=p();for(n=0;e-1>n;++n)t.addLink(n,n+1),t.addLink(e+n,e+n+1),t.addLink(n,e+n);return t.addLink(e-1,2*e-1),t}function o(e){if(!e||0>e)throw new Error("Invalid number of nodes");var n=r(e);return n.addLink(0,e-1),n.addLink(e,2*e-1),n}function i(e){if(!e||1>e)throw new Error("At least two nodes are expected for complete graph");var n,t,r=p();for(n=0;e>n;++n)for(t=n+1;e>t;++t)n!==t&&r.addLink(n,t);return r}function a(e,n){if(!e||!n||0>e||0>n)throw new Error("Graph dimensions are invalid. Number of nodes in each partition should be greater than 0");var t,r,o=p();for(t=0;e>t;++t)for(r=e;e+n>r;++r)o.addLink(t,r);return o}function u(e){if(!e||0>e)throw new Error("Invalid number of nodes");var n,t=p();for(t.addNode(0),n=1;e>n;++n)t.addLink(n-1,n);return t}function s(e,n){if(1>e||1>n)throw new Error("Invalid number of nodes in grid graph");var t,r,o=p();if(1===e&&1===n)return o.addNode(0),o;for(t=0;e>t;++t)for(r=0;n>r;++r){var i=t+r*e;t>0&&o.addLink(i,t-1+r*e),r>0&&o.addLink(i,t+(r-1)*e)}return o}function f(e,n,t){if(1>e||1>n||1>t)throw new Error("Invalid number of nodes in grid3 graph");var r,o,i,a=p();if(1===e&&1===n&&1===t)return a.addNode(0),a;for(i=0;t>i;++i)for(r=0;e>r;++r)for(o=0;n>o;++o){var u=i*e*n,s=r+o*e+u;r>0&&a.addLink(s,r-1+o*e+u),o>0&&a.addLink(s,r+(o-1)*e+u),i>0&&a.addLink(s,r+o*e+(i-1)*e*n)}return a}function c(e){if(0>e)throw new Error("Invalid number of nodes in balanced tree");var n,t=p(),r=Math.pow(2,e);for(0===e&&t.addNode(1),n=1;r>n;++n){var o=n,i=2*o,a=2*o+1;t.addLink(o,i),t.addLink(o,a)}return t}function d(e){if(0>e)throw new Error("Number of nodes shoul be >= 0");var n,t=p();for(n=0;e>n;++n)t.addNode(n);return t}function l(n,t,r,o){if(t>=n)throw new Error("Choose smaller `k`. It cannot be larger than number of nodes `n`");var i,a,u=e("ngraph.random").random(o||42),s=p();for(i=0;n>i;++i)s.addNode(i);for(var f=Math.floor(t/2+1),c=1;f>c;++c)for(i=0;n>i;++i)a=(c+i)%n,s.addLink(i,a);for(c=1;f>c;++c)for(i=0;n>i;++i)if(u.nextDouble()n)return!1;B(),_.splice(n,1);var t=f(e.fromId),r=f(e.toId);return t&&(n=o(e,t.links),n>=0&&t.links.splice(n,1)),r&&(n=o(e,r.links),n>=0&&r.links.splice(n,1)),U(e,"remove"),F(),!0}function h(e,n){var t,r=f(e);if(!r)return null;for(t=0;tn;++n)e(_[n])}function x(e,n,t){var r=f(e);return r&&r.links&&"function"==typeof n?t?b(r.links,e,n):w(r.links,e,n):void 0}function w(e,n,t){for(var r,o=0;o0&&(O.fire("changed",M),M.length=0)}function N(){return Object.keys?k:A}function k(e){if("function"==typeof e)for(var n=Object.keys(j),t=0;tt;t+=1)if(n[t]===e)return t;return-1}function i(e){this.id=e,this.links=[],this.data=null}function a(e,n,t,r){this.fromId=e,this.toId=n,this.data=t,this.id=r}n.exports=r;var u=e("ngraph.events")},{"ngraph.events":6}],24:[function(e,n,t){function r(e,n){var t;if(e||(e={}),n)for(t in n)if(n.hasOwnProperty(t)){var o=e.hasOwnProperty(t),i=typeof n[t],a=!o||typeof e[t]!==i;a?e[t]=n[t]:"object"===i&&(e[t]=r(e[t],n[t]))}return e}n.exports=r},{}],25:[function(e,n,t){function r(e){var n="number"==typeof e?e:+new Date,t=function(){return n=n+2127912214+(n<<12)&4294967295,n=4294967295&(3345072700^n^n>>>19),n=n+374761393+(n<<5)&4294967295,n=4294967295&(n+3550635116^n<<9),n=n+4251993797+(n<<3)&4294967295,n=4294967295&(3042594569^n^n>>>16),(268435455&n)/268435456};return{next:function(e){return Math.floor(t()*e)},nextDouble:function(){return t()}}}function o(e,n){var t=n||r();if("function"!=typeof t.next)throw new Error("customRandom does not match expected API: next() function is missing");return{forEach:function(n){var r,o,i;for(r=e.length-1;r>0;--r)o=t.next(r+1),i=e[o],e[o]=e[r],e[r]=i,n(i);e.length&&n(e[0])},shuffle:function(){var n,r,o;for(n=e.length-1;n>0;--n)r=t.next(n+1),o=e[r],e[r]=e[n],e[n]=o;return e}}}n.exports={random:r,randomIterator:o}},{}],26:[function(e,n,t){function r(e,n,t){function r(e){u.nodes.push(s(e))}function o(e){u.links.push(f(e))}function i(e){var n={id:e.id};return void 0!==e.data&&(n.data=e.data),n}function a(e){var n={fromId:e.fromId,toId:e.toId};return void 0!==e.data&&(n.data=e.data),n}var u={nodes:[],links:[]},s=n||i,f=t||a;return e.forEachNode(r),e.forEachLink(o),JSON.stringify(u)}n.exports=r},{}],27:[function(e,n,t){function r(e,n){var t=o(e);if(void 0===n)return t;for(var r=Object.keys(n),i=0;it?r=-1:t>v&&(r=1),u(e,r,{x:e.touches[0].clientX,y:e.touches[0].clientY}),v=t,m(e),y(e)}},A=function(e){p=!1,o.off("touchmove",k),o.off("touchend",A),o.off("touchcancel",A),c=null,r&&r(e)},j=function(e,t){m(e),y(e),d=t.clientX,l=t.clientY,c=e.target||e.srcElement,n&&n(e,{x:d,y:l}),p||(p=!0,o.on("touchmove",k),o.on("touchend",A),o.on("touchcancel",A))},_=function(e){return 1===e.touches.length?j(e,e.touches[0]):void(2===e.touches.length&&(m(e),y(e),v=N(e.touches[0],e.touches[1])))};return e.addEventListener("mousedown",b),e.addEventListener("touchstart",_),{onStart:function(e){return n=e,this},onDrag:function(e){return t=e,this},onStop:function(e){return r=e,this},onScroll:function(e){return P(e),this},release:function(){e.removeEventListener("mousedown",b), -e.removeEventListener("touchstart",_),o.off("mousemove",w),o.off("mouseup",E),o.off("touchmove",k),o.off("touchend",A),o.off("touchcancel",A),P(null)}}}n.exports=r;var o=e("../Utils/documentEvents.js"),i=e("../Utils/browserInfo.js"),a=e("../Utils/findElementPosition.js")},{"../Utils/browserInfo.js":39,"../Utils/documentEvents.js":40,"../Utils/findElementPosition.js":41}],36:[function(e,n,t){function r(e,n){var t=o(n),r=null,i={},a={x:0,y:0};return t.mouseDown(function(e,n){r=e,a.x=n.clientX,a.y=n.clientY,t.mouseCapture(r);var o=i[e.id];return o&&o.onStart&&o.onStart(n,a),!0}).mouseUp(function(e){t.releaseMouseCapture(r),r=null;var n=i[e.id];return n&&n.onStop&&n.onStop(),!0}).mouseMove(function(e,n){if(r){var t=i[r.id];return t&&t.onDrag&&t.onDrag(n,{x:n.clientX-a.x,y:n.clientY-a.y}),a.x=n.clientX,a.y=n.clientY,!0}}),{bindDragNDrop:function(e,n){i[e.id]=n,n||delete i[e.id]}}}n.exports=r;var o=e("../WebGL/webglInputEvents.js")},{"../WebGL/webglInputEvents.js":57}],37:[function(e,n,t){function r(e,n){function t(e){return d[e]}n=o(n,{maxX:1024,maxY:1024,seed:"Deterministic randomness made me do this"});var r=i(n.seed),u=new a(Number.MAX_VALUE,Number.MAX_VALUE,Number.MIN_VALUE,Number.MIN_VALUE),s={},f=function(e){return{x:r.next(n.maxX),y:r.next(n.maxY)}},c=function(e,n){e.xn.x2&&(n.x2=e.x),e.yn.y2&&(n.y2=e.y)},d="function"==typeof Object.create?Object.create(null):{},l=function(e){d[e.id]=f(e),c(d[e.id],u)},p=function(){0!==e.getNodesCount()&&(u.x1=Number.MAX_VALUE,u.y1=Number.MAX_VALUE,u.x2=Number.MIN_VALUE,u.y2=Number.MIN_VALUE,e.forEachNode(l))},v=function(e){s[e.id]=e},g=function(e){for(var n=0;n=0:"boolean"==typeof z?z:!0}function r(){G=G||window.document.body,F=F||i(e,{springLength:80,springCoeff:2e-4}),O=O||a(e,{container:G}),n.hasOwnProperty("renderLinks")||(n.renderLinks=!0),n.prerender=n.prerender||0,U=(O.inputManager||s)(e,O)}function l(){O.beginRender(),n.renderLinks&&O.renderLinks(),O.renderNodes(),O.endRender()}function p(){return W=F.step()&&!H,l(),!W}function v(e){return R?void(V+=e):void(e?(V+=e,R=f(function(){return p()},M)):(X=0,V=0,R=f(p,M)))}function g(){J||(W=!1,R.restart())}function h(){if("number"==typeof n.prerender&&n.prerender>0)for(var e=0;en,t)})),e.forEachNode(E),T(),e.on("changed",j)}function D(){q=!1,T(),I(),u.off("resize",_),K.off(),R.stop(),e.forEachLink(function(e){n.renderLinks&&b(e)}),e.forEachNode(function(e){L(e),x(e)}),F.dispose(),N()}var M=30;n=n||{};var U,R,B,F=n.layout,O=n.graphics,G=n.container,z=void 0!==n.interactive?n.interactive:!0,q=!1,Y=!0,X=0,V=0,W=!1,H=!1,J=!1,$={offsetX:0,offsetY:0,scale:1},K=o({});return{run:function(e){return q||(r(),h(),P(),m(),S(),q=!0),v(e),this},reset:function(){O.resetScale(),m(),$.scale=1},pause:function(){J=!0,R.stop()},resume:function(){J=!1,R.restart()},rerender:function(){return l(),this},zoomOut:function(){return C(!0)},zoomIn:function(){return C(!1)},moveTo:function(e,n){O.graphCenterChanged($.offsetX-e*$.scale,$.offsetY-n*$.scale),l()},getGraphics:function(){return O},dispose:function(){D()},on:function(e,n){return K.on(e,n),this},off:function(e,n){return K.off(e,n),this}}}n.exports=r;var o=e("ngraph.events"),i=e("ngraph.forcelayout"),a=e("./svgGraphics.js"),u=e("../Utils/windowEvents.js"),s=e("../Input/domInputManager.js"),f=e("../Utils/timer.js"),c=e("../Utils/getDimensions.js"),d=e("../Input/dragndrop.js")},{"../Input/domInputManager.js":34,"../Input/dragndrop.js":35,"../Utils/getDimensions.js":42,"../Utils/timer.js":46,"../Utils/windowEvents.js":47,"./svgGraphics.js":49,"ngraph.events":6,"ngraph.forcelayout":7}],49:[function(e,n,t){function r(){function e(){var e=o("svg");return n=o("g").attr("buffered-rendering","dynamic"),e.appendChild(n),e}var n,t,r,u=0,s=0,f=1,c={},d={},l=function(e){return o("rect").attr("width",10).attr("height",10).attr("fill","#00a2e8")},p=function(e,n){e.attr("x",n.x-5).attr("y",n.y-5)},v=function(e){return o("line").attr("stroke","#999")},g=function(e,n,t){e.attr("x1",n.x).attr("y1",n.y).attr("x2",t.x).attr("y2",t.y)},h=function(e){e.fire("rescaled")},m={x:0,y:0},y={x:0,y:0},x={x:0,y:0},w=function(){if(n){var e="matrix("+f+", 0, 0,"+f+","+u+","+s+")";n.attr("transform",e)}};t=e();var b={getNodeUI:function(e){return c[e]},getLinkUI:function(e){return d[e]},node:function(e){return"function"==typeof e?(l=e,this):void 0},link:function(e){return"function"==typeof e?(v=e,this):void 0},placeNode:function(e){return p=e,this},placeLink:function(e){return g=e,this},beginRender:function(){},endRender:function(){},graphCenterChanged:function(e,n){u=e,s=n,w()},inputManager:a,translateRel:function(e,r){var o=t.createSVGPoint(),i=n.getCTM(),a=t.createSVGPoint().matrixTransform(i.inverse());o.x=e,o.y=r,o=o.matrixTransform(i.inverse()),o.x=(o.x-a.x)*i.a,o.y=(o.y-a.y)*i.d,i.e+=o.x,i.f+=o.y;var u="matrix("+i.a+", 0, 0,"+i.d+","+i.e+","+i.f+")";n.attr("transform",u)},scale:function(e,r){var o=t.createSVGPoint();o.x=r.x,o.y=r.y,o=o.matrixTransform(n.getCTM().inverse());var i=t.createSVGMatrix().translate(o.x,o.y).scale(e).translate(-o.x,-o.y),a=n.getCTM().multiply(i);f=a.a,u=a.e,s=a.f;var c="matrix("+a.a+", 0, 0,"+a.d+","+a.e+","+a.f+")";return n.attr("transform",c),h(this),f},resetScale:function(){f=1;var e="matrix(1, 0, 0, 1, 0, 0)";return n.attr("transform",e),h(this),this},init:function(e){e.appendChild(t),w(),"function"==typeof r&&r(t)},release:function(e){t&&e&&e.removeChild(t)},addLink:function(e,t){var r=v(e);if(r)return r.position=t,r.link=e,d[e.id]=r,n.childElementCount>0?n.insertBefore(r,n.firstChild):n.appendChild(r),r},releaseLink:function(e){var t=d[e.id];t&&(n.removeChild(t),delete d[e.id])},addNode:function(e,t){var r=l(e);if(r)return r.position=t,r.node=e,c[e.id]=r,n.appendChild(r),r},releaseNode:function(e){var t=c[e.id];t&&(n.removeChild(t),delete c[e.id])},renderNodes:function(){for(var e in c)if(c.hasOwnProperty(e)){var n=c[e];m.x=n.position.x,m.y=n.position.y,p(n,m,n.node)}},renderLinks:function(){for(var e in d)if(d.hasOwnProperty(e)){var n=d[e];y.x=n.position.from.x,y.y=n.position.from.y,x.x=n.position.to.x,x.y=n.position.to.y,g(n,y,x,n.link)}},getGraphicsRoot:function(e){return"function"==typeof e&&(t?e(t):r=e),t},getSvgRoot:function(){return t}};return i(b),b}n.exports=r;var o=e("simplesvg"),i=e("ngraph.events"),a=e("../Input/domInputManager.js")},{"../Input/domInputManager.js":34,"ngraph.events":6,simplesvg:27}],50:[function(e,n,t){function r(e){e=c(e,{enableBlending:!0,preserveDrawingBuffer:!1,clearColor:!1,clearColorValue:{r:1,g:1,b:1,a:1}});var n,t,r,d,l,p,v,g,h=0,m=0,y=[1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1],x=[],w=[],b={},E={},L=i(),P=a(),N=function(e){return u()},k=function(e){return s(3014898687)},A=function(){L.updateTransform(y),P.updateTransform(y)},j=function(){y=[1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1]},_=function(){n&&t&&(d=t.width=Math.max(n.offsetWidth,1),l=t.height=Math.max(n.offsetHeight,1),r&&r.viewport(0,0,d,l),L&&L.updateSize(d/2,l/2),P&&P.updateSize(d/2,l/2))},I=function(e){e.fire("rescaled")};t=window.document.createElement("canvas");var T={getLinkUI:function(e){return E[e]},getNodeUI:function(e){return b[e]},node:function(e){return"function"==typeof e?(N=e,this):void 0},link:function(e){return"function"==typeof e?(k=e,this):void 0},placeNode:function(e){return p=e,this},placeLink:function(e){return v=e,this},inputManager:o,beginRender:function(){},endRender:function(){m>0&&L.render(),h>0&&P.render()},bringLinkToFront:function(e){var n,t,r=L.getFrontLinkId();L.bringToFront(e),r>e.id&&(n=e.id,t=w[r],w[r]=w[n],w[r].id=r,w[n]=t,w[n].id=n)},graphCenterChanged:function(e,n){y[12]=2*e/d-1,y[13]=1-2*n/l,A()},addLink:function(e,n){var t=m++,r=k(e);return r.id=t,r.pos=n,L.createLink(r),w[t]=r,E[e.id]=r,r},addNode:function(e,n){var t=h++,r=N(e);return r.id=t,r.position=n,r.node=e,P.createNode(r),x[t]=r,b[e.id]=r,r},translateRel:function(e,n){y[12]+=2*y[0]*e/d/y[0],y[13]-=2*y[5]*n/l/y[5],A()},scale:function(e,n){var t=2*n.x/d-1,r=1-2*n.y/l;return t-=y[12],r-=y[13],y[12]+=t*(1-e),y[13]+=r*(1-e),y[0]*=e,y[5]*=e,A(),I(this),y[0]},resetScale:function(){return j(),r&&(_(),A()),this},init:function(o){var i={};if(e.preserveDrawingBuffer&&(i.preserveDrawingBuffer=!0),n=o,_(),j(),n.appendChild(t),r=t.getContext("experimental-webgl",i),!r){var a="Could not initialize WebGL. Seems like the browser doesn't support it.";throw window.alert(a),a}if(e.enableBlending&&(r.blendFunc(r.SRC_ALPHA,r.ONE_MINUS_SRC_ALPHA),r.enable(r.BLEND)),e.clearColor){var u=e.clearColorValue;r.clearColor(u.r,u.g,u.b,u.a),this.beginRender=function(){r.clear(r.COLOR_BUFFER_BIT)}}L.load(r),L.updateSize(d/2,l/2),P.load(r),P.updateSize(d/2,l/2),A(),"function"==typeof g&&g(t)},release:function(e){t&&e&&e.removeChild(t)},isSupported:function(){var e=window.document.createElement("canvas"),n=e&&e.getContext&&e.getContext("experimental-webgl");return n},releaseLink:function(e){m>0&&(m-=1);var n=E[e.id];delete E[e.id],L.removeLink(n);var t=n.id;if(m>t){if(0===m||m===t)return;var r=w[m];w[t]=r,r.id=t}},releaseNode:function(e){h>0&&(h-=1);var n=b[e.id];delete b[e.id],P.removeNode(n);var t=n.id;if(h>t){if(0===h||h===t)return;var r=x[h];x[t]=r,r.id=t,P.replaceProperties(n,r)}},renderNodes:function(){for(var e={x:0,y:0},n=0;h>n;++n){var t=x[n];e.x=t.position.x,e.y=t.position.y,p&&p(t,e),P.position(t,e)}},renderLinks:function(){if(!this.omitLinksRendering)for(var e={x:0,y:0},n={x:0,y:0},t=0;m>t;++t){var r=w[t],o=r.pos.from;n.x=o.x,n.y=-o.y,o=r.pos.to,e.x=o.x,e.y=-o.y,v&&v(r,n,e),L.position(r,n,e)}},getGraphicsRoot:function(e){return"function"==typeof e&&(t?e(t):g=e),t},setNodeProgram:function(e){if(!r&&e)P=e;else if(e)throw"Not implemented. Cannot swap shader on the fly... Yet."},setLinkProgram:function(e){if(!r&&e)L=e;else if(e)throw"Not implemented. Cannot swap shader on the fly... Yet."},transformClientToGraphCoordinates:function(e){return e.x=2*e.x/d-1,e.y=1-2*e.y/l,e.x=(e.x-y[12])/y[0],e.y=(e.y-y[13])/y[5],e.x=e.x*(d/2),e.y=e.y*(-l/2),e},transformGraphToClientCoordinates:function(e){return e.x=e.x/(d/2),e.y=e.y/(-l/2),e.x=e.x*y[0]+y[12],e.y=e.y*y[5]+y[13],e.x=(e.x+1)*d/2,e.y=(1-e.y)*l/2,e},getNodeAtClientPos:function(e,n){if("function"!=typeof n)return null;this.transformClientToGraphCoordinates(e);for(var t=0;h>t;++t)if(n(x[t],e.x,e.y))return x[t].node;return null}};return f(T),T}n.exports=r;var o=e("../Input/webglInputManager.js"),i=e("../WebGL/webglLinkProgram.js"),a=e("../WebGL/webglNodeProgram.js"),u=e("../WebGL/webglSquare.js"),s=e("../WebGL/webglLine.js"),f=e("ngraph.events"),c=e("ngraph.merge")},{"../Input/webglInputManager.js":36,"../WebGL/webglLine.js":58,"../WebGL/webglLinkProgram.js":59,"../WebGL/webglNodeProgram.js":60,"../WebGL/webglSquare.js":61,"ngraph.events":6,"ngraph.merge":24}],51:[function(e,n,t){function r(e){var n=10414335;if("string"==typeof e&&e)if(4===e.length&&(e=e.replace(/([^#])/g,"$1$1")),9===e.length)n=parseInt(e.substr(1),16);else{if(7!==e.length)throw'Color expected in hex format with preceding "#". E.g. #00ff00. Got value: '+e;n=parseInt(e.substr(1),16)<<8|255}else"number"==typeof e&&(n=e);return n}n.exports=r},{}],52:[function(e,n,t){function r(e){this.canvas=window.document.createElement("canvas"),this.ctx=this.canvas.getContext("2d"),this.isDirty=!1,this.canvas.width=this.canvas.height=e}n.exports=r},{}],53:[function(e,n,t){function r(e){function n(n,t){var r=e.createShader(t);if(e.shaderSource(r,n),e.compileShader(r),!e.getShaderParameter(r,e.COMPILE_STATUS)){var o=e.getShaderInfoLog(r);throw window.alert(o),o}return r}function t(t,r){var o=e.createProgram(),i=n(t,e.VERTEX_SHADER),a=n(r,e.FRAGMENT_SHADER);if(e.attachShader(o,i),e.attachShader(o,a),e.linkProgram(o),!e.getProgramParameter(o,e.LINK_STATUS)){var u=e.getShaderInfoLog(o);throw window.alert(u),u}return o}function r(e,n,t){if((n+1)*t>e.length){var r=new Float32Array(e.length*t*2);return r.set(e),r}return e}function a(n,t){for(var r={},o=0;oo;++o)e[n+o]=e[t+o]}function i(e,n,t,r){for(var o=0;r>o;++o){var i=e[n+o];e[n+o]=e[t+o],e[t+o]=i}}n.exports=r},{}],54:[function(e,n,t){function r(e){function n(){var e;for(E.isDirty=!1,e=0;e=w.length&&s();var i=w[r.textureNumber];i.ctx.drawImage(n,r.col*h,r.row*h,h,h),b[e]=n.src,y[n.src]=o,i.isDirty=!0,t(o)}function c(n){var t=n/e<<0,r=n%e,o=r/g<<0,i=r%g;return{textureNumber:t,row:o,col:i}}function d(){E.isDirty=!0,x=0,v=null}function l(){v&&(window.clearTimeout(v),x+=1,v=null),x>10?d():v=window.setTimeout(d,400)}function p(e,n){var t=w[e.textureNumber].canvas,r=w[n.textureNumber].ctx,o=n.col*h,i=n.row*h;r.drawImage(t,e.col*h,e.row*h,h,h,o,i,h,h),w[e.textureNumber].isDirty=!0,w[n.textureNumber].isDirty=!0}var v,g=Math.sqrt(e||1024)<<0,h=g,m=1,y={},x=0,w=[],b=[];if(!o(e))throw"Tiles per texture should be power of two.";var E={isDirty:!1,clearDirty:n,remove:t,getTextures:r,getCoordinates:a,load:u};return E}function o(e){return 0===(e&e-1)}var i=e("./texture.js");n.exports=r},{"./texture.js":52}],55:[function(e,n,t){function r(e,n){return{_texture:0,_offset:0,size:"number"==typeof e?e:32,src:n}}n.exports=r},{}],56:[function(e,n,t){function r(){function e(e,n){e.nativeObject&&h.deleteTexture(e.nativeObject);var t=h.createTexture();h.activeTexture(h["TEXTURE"+n]),h.bindTexture(h.TEXTURE_2D,t),h.texImage2D(h.TEXTURE_2D,0,h.RGBA,h.RGBA,h.UNSIGNED_BYTE,e.canvas),h.texParameteri(h.TEXTURE_2D,h.TEXTURE_MAG_FILTER,h.LINEAR),h.texParameteri(h.TEXTURE_2D,h.TEXTURE_MIN_FILTER,h.LINEAR_MIPMAP_NEAREST),h.generateMipmap(h.TEXTURE_2D),h.uniform1i(x["sampler"+n],n),e.nativeObject=t}function n(){if(v.isDirty){var n,t=v.getTextures();for(n=0;n0&&(j-=1),e.id0&&(e.src&&v.remove(e.src),y.copyArrayPart(_,e.id*P,j*P,P))}function c(e,n){n._offset=e._offset}function d(e){L=!0,E=e}function l(e,n){w=e,b=n,L=!0}function p(){h.useProgram(g),h.bindBuffer(h.ARRAY_BUFFER,m),h.bufferData(h.ARRAY_BUFFER,_,h.DYNAMIC_DRAW),L&&(L=!1,h.uniformMatrix4fv(x.transform,!1,E),h.uniform2f(x.screenSize,w,b)),h.vertexAttribPointer(x.vertexPos,2,h.FLOAT,!1,3*Float32Array.BYTES_PER_ELEMENT,0),h.vertexAttribPointer(x.customAttributes,1,h.FLOAT,!1,3*Float32Array.BYTES_PER_ELEMENT,8),n(),h.drawArrays(h.TRIANGLES,0,6*j)}var v,g,h,m,y,x,w,b,E,L,P=18,N=o(),k=i(),A=1024,j=0,_=new Float32Array(64);return{load:t,position:r,createNode:s,removeNode:f,replaceProperties:c,updateTransform:d,updateSize:l,render:p}}function o(){return["precision mediump float;","varying vec4 color;","varying vec3 vTextureCoord;","uniform sampler2D u_sampler0;","uniform sampler2D u_sampler1;","uniform sampler2D u_sampler2;","uniform sampler2D u_sampler3;","void main(void) {"," if (vTextureCoord.z == 0.) {"," gl_FragColor = texture2D(u_sampler0, vTextureCoord.xy);"," } else if (vTextureCoord.z == 1.) {"," gl_FragColor = texture2D(u_sampler1, vTextureCoord.xy);"," } else if (vTextureCoord.z == 2.) {"," gl_FragColor = texture2D(u_sampler2, vTextureCoord.xy);"," } else if (vTextureCoord.z == 3.) {"," gl_FragColor = texture2D(u_sampler3, vTextureCoord.xy);"," } else { gl_FragColor = vec4(0, 1, 0, 1); }","}"].join("\n")}function i(){return["attribute vec2 a_vertexPos;","attribute float a_customAttributes;","uniform vec2 u_screenSize;","uniform mat4 u_transform;","uniform float u_tilesPerTexture;","varying vec3 vTextureCoord;","void main(void) {"," gl_Position = u_transform * vec4(a_vertexPos/u_screenSize, 0, 1);","float corner = mod(a_customAttributes, 4.);","float tileIndex = mod(floor(a_customAttributes / 4.), u_tilesPerTexture);","float tilesPerRow = sqrt(u_tilesPerTexture);","float tileSize = 1./tilesPerRow;","float tileColumn = mod(tileIndex, tilesPerRow);","float tileRow = floor(tileIndex/tilesPerRow);","if(corner == 0.0) {"," vTextureCoord.xy = vec2(0, 1);","} else if(corner == 1.0) {"," vTextureCoord.xy = vec2(1, 1);","} else if(corner == 2.0) {"," vTextureCoord.xy = vec2(0, 0);","} else {"," vTextureCoord.xy = vec2(1, 0);","}","vTextureCoord *= tileSize;","vTextureCoord.x += tileColumn * tileSize;","vTextureCoord.y += tileRow * tileSize;","vTextureCoord.z = floor(floor(a_customAttributes / 4.)/u_tilesPerTexture);","}"].join("\n")}var a=e("./webglAtlas.js"),u=e("./webgl.js");n.exports=r},{"./webgl.js":53,"./webglAtlas.js":54}],57:[function(e,n,t){function r(e){function n(){x=null}function t(e){x=e}function r(e){return"function"==typeof e&&k.push(e),j}function i(e){return"function"==typeof e&&N.push(e),j}function a(e){return"function"==typeof e&&P.push(e),j}function u(e){return"function"==typeof e&&L.push(e),j}function s(e){return"function"==typeof e&&E.push(e),j}function f(e){return"function"==typeof e&&b.push(e),j}function c(e){return"function"==typeof e&&w.push(e),j}function d(e,n,t){if(e&&e.size){var r=e.position,o=e.size;return r.x-oo-i&&u?g(k,r):g(N,r),i=o,g(L,r)&&p(e))})}if(e.webglInputEvents)return e.webglInputEvents;var m,y,x=null,w=[],b=[],E=[],L=[],P=[],N=[],k=[],A=e.getGraphicsRoot();h(A);var j={mouseEnter:c,mouseLeave:f,mouseDown:s,mouseUp:u,mouseMove:a,click:i,dblClick:r,mouseCapture:t,releaseMouseCapture:n};return e.webglInputEvents=j,j}var o=e("../Utils/documentEvents.js");n.exports=r},{"../Utils/documentEvents.js":40}],58:[function(e,n,t){function r(e){return{color:o(e)}}var o=e("./parseColor.js");n.exports=r},{"./parseColor.js":51}],59:[function(e,n,t){function r(){var e,n,t,r,i,a,u,s,f,c,d=6,l=2*(2*Float32Array.BYTES_PER_ELEMENT+Uint32Array.BYTES_PER_ELEMENT),p=["precision mediump float;","varying vec4 color;","void main(void) {"," gl_FragColor = color;","}"].join("\n"),v=["attribute vec2 a_vertexPos;","attribute vec4 a_color;","uniform vec2 u_screenSize;","uniform mat4 u_transform;","varying vec4 color;","void main(void) {"," gl_Position = u_transform * vec4(a_vertexPos/u_screenSize, 0.0, 1.0);"," color = a_color.abgr;","}"].join("\n"),g=0,h=new ArrayBuffer(16*l),m=new Float32Array(h),y=new Uint32Array(h),x=function(){if((g+1)*l>h.byteLength){var e=new ArrayBuffer(2*h.byteLength),n=new Float32Array(e),t=new Uint32Array(e);t.set(y),m=n,y=t,h=e}};return{load:function(a){n=a,r=o(a),e=r.createProgram(v,p),n.useProgram(e),i=r.getLocations(e,["a_vertexPos","a_color","u_screenSize","u_transform"]),n.enableVertexAttribArray(i.vertexPos),n.enableVertexAttribArray(i.color),t=n.createBuffer()},position:function(e,n,t){var r=e.id,o=r*d;m[o]=n.x,m[o+1]=n.y,y[o+2]=e.color,m[o+3]=t.x,m[o+4]=t.y,y[o+5]=e.color},createLink:function(e){x(),g+=1,a=e.id},removeLink:function(e){g>0&&(g-=1),e.id0&&r.copyArrayPart(y,e.id*d,g*d,d)},updateTransform:function(e){c=!0,f=e},updateSize:function(e,n){u=e,s=n,c=!0},render:function(){n.useProgram(e),n.bindBuffer(n.ARRAY_BUFFER,t),n.bufferData(n.ARRAY_BUFFER,h,n.DYNAMIC_DRAW),c&&(c=!1,n.uniformMatrix4fv(i.transform,!1,f),n.uniform2f(i.screenSize,u,s)),n.vertexAttribPointer(i.vertexPos,2,n.FLOAT,!1,3*Float32Array.BYTES_PER_ELEMENT,0),n.vertexAttribPointer(i.color,4,n.UNSIGNED_BYTE,!0,3*Float32Array.BYTES_PER_ELEMENT,8),n.drawArrays(n.LINES,0,2*g),a=g-1},bringToFront:function(e){a>e.id&&r.swapArrayPart(m,e.id*d,a*d,d),a>0&&(a-=1)},getFrontLinkId:function(){return a}}}var o=e("./webgl.js");n.exports=r},{"./webgl.js":53}],60:[function(e,n,t){function r(){function e(){if((k+1)*w>=L.byteLength){var e=new ArrayBuffer(2*L.byteLength),n=new Float32Array(e),t=new Uint32Array(e);t.set(N),P=n,N=t,L=e}}function n(e){d=e,v=o(e),c=v.createProgram(E,b),d.useProgram(c),p=v.getLocations(c,["a_vertexPos","a_color","u_screenSize","u_transform"]),d.enableVertexAttribArray(p.vertexPos),d.enableVertexAttribArray(p.color),l=d.createBuffer()}function t(e,n){var t=e.id;P[t*x]=n.x,P[t*x+1]=-n.y,P[t*x+2]=e.size,N[t*x+3]=e.color}function r(e){y=!0,m=e}function i(e,n){g=e,h=n,y=!0}function a(e){k>0&&(k-=1),e.id0&&v.copyArrayPart(N,e.id*x,k*x,x)}function u(){e(),k+=1}function s(){}function f(){d.useProgram(c),d.bindBuffer(d.ARRAY_BUFFER,l),d.bufferData(d.ARRAY_BUFFER,L,d.DYNAMIC_DRAW),y&&(y=!1,d.uniformMatrix4fv(p.transform,!1,m),d.uniform2f(p.screenSize,g,h)),d.vertexAttribPointer(p.vertexPos,3,d.FLOAT,!1,x*Float32Array.BYTES_PER_ELEMENT,0),d.vertexAttribPointer(p.color,4,d.UNSIGNED_BYTE,!0,x*Float32Array.BYTES_PER_ELEMENT,12),d.drawArrays(d.POINTS,0,k)}var c,d,l,p,v,g,h,m,y,x=4,w=3*Float32Array.BYTES_PER_ELEMENT+Uint32Array.BYTES_PER_ELEMENT,b=["precision mediump float;","varying vec4 color;","void main(void) {"," gl_FragColor = color;","}"].join("\n"),E=["attribute vec3 a_vertexPos;","attribute vec4 a_color;","uniform vec2 u_screenSize;","uniform mat4 u_transform;","varying vec4 color;","void main(void) {"," gl_Position = u_transform * vec4(a_vertexPos.xy/u_screenSize, 0, 1);"," gl_PointSize = a_vertexPos.z * u_transform[0][0];"," color = a_color.abgr;","}"].join("\n"),L=new ArrayBuffer(16*w),P=new Float32Array(L),N=new Uint32Array(L),k=0;return{load:n,position:t,updateTransform:r,updateSize:i,removeNode:a,createNode:u,replaceProperties:s,render:f}}var o=e("./webgl.js");n.exports=r},{"./webgl.js":53}],61:[function(e,n,t){function r(e,n){return{size:"number"==typeof e?e:10,color:o(n)}}var o=e("./parseColor.js");n.exports=r},{"./parseColor.js":51}],62:[function(e,n,t){n.exports="0.8.1"},{}]},{},[1])(1)}); \ No newline at end of file +!function(e){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=e();else if("function"==typeof define&&define.amd)define([],e);else{var n;"undefined"!=typeof window?n=window:"undefined"!=typeof global?n=global:"undefined"!=typeof self&&(n=self),n.Viva=e()}}(function(){return function e(n,t,r){function o(a,u){if(!t[a]){if(!n[a]){var s="function"==typeof require&&require;if(!u&&s)return s(a,!0);if(i)return i(a,!0);var f=new Error("Cannot find module '"+a+"'");throw f.code="MODULE_NOT_FOUND",f}var c=t[a]={exports:{}};n[a][0].call(c.exports,function(e){var t=n[a][1][e];return o(t?t:e)},c,c.exports,e,n,t,r)}return t[a].exports}for(var i="function"==typeof require&&require,a=0;a=0==m>=4?null:(f=u-i,d=o-a,p=a*i-o*u,v=f*e+d*n+p,h=f*t+d*r+p,0!==v&&0!==h&&v>=0==h>=0?null:(y=s*d-f*c,0===y?null:(x=y<0?-y/2:y/2,x=0,w=c*p-d*l,b.x=(w<0?w-x:w+x)/y,w=f*l-s*p,b.y=(w<0?w-x:w+x)/y,b)))}n.exports=r},{}],4:[function(e,n,t){n.exports.degree=e("./src/degree.js"),n.exports.betweenness=e("./src/betweenness.js")},{"./src/betweenness.js":5,"./src/degree.js":6}],5:[function(e,n,t){function r(e,n){function t(e){h[e]/=2}function r(e){h[e.id]=0}function o(e){s=e.id,u(s),i()}function i(){for(e.forEachNode(a);c.length;){for(var n=c.pop(),t=(1+v[n])/p[n],r=d[n],o=0;o1&&(o=Array.prototype.splice.call(arguments,1));for(var i=0;i0&&o.addLink(i,t-1+r*e),r>0&&o.addLink(i,t+(r-1)*e)}return o}function f(e,n,t){if(e<1||n<1||t<1)throw new Error("Invalid number of nodes in grid3 graph");var r,o,i,a=p();if(1===e&&1===n&&1===t)return a.addNode(0),a;for(i=0;i0&&a.addLink(s,r-1+o*e+u),o>0&&a.addLink(s,r+(o-1)*e+u),i>0&&a.addLink(s,r+o*e+(i-1)*e*n)}return a}function c(e){if(e<0)throw new Error("Invalid number of nodes in balanced tree");var n,t=p(),r=Math.pow(2,e);for(0===e&&t.addNode(1),n=1;n= 0");var n,t=p();for(n=0;n=n)throw new Error("Choose smaller `k`. It cannot be larger than number of nodes `n`");var i,a,u=e("ngraph.random").random(o||42),s=p();for(i=0;i=0&&t.links.splice(n,1)),r&&(n=o(e,r.links),n>=0&&r.links.splice(n,1)),U(e,"remove"),F(),!0}function g(e,n){var t,r=f(e);if(!r)return null;for(t=0;t0&&(O.fire("changed",M),M.length=0)}function P(){return Object.keys?k:A}function k(e){if("function"==typeof e)for(var n=Object.keys(j),t=0;t=0?i:-1,o);return p.push(a),a},removeSpring:function(e){if(e){var n=p.indexOf(e);return n>-1?(p.splice(n,1),!0):void 0}},getBestNewBodyPosition:function(e){return h.getBestNewPosition(e)},getBBox:function(){return h.box},gravity:function(e){return void 0!==e?(n.gravity=e,v.options({gravity:e}),this):n.gravity},theta:function(e){return void 0!==e?(n.theta=e,v.options({theta:e}),this):n.theta}};return o(n,y),y}n.exports=r},{"./lib/bounds":16,"./lib/createBody":17,"./lib/dragForce":18,"./lib/eulerIntegrator":19,"./lib/spring":20,"./lib/springForce":21,"ngraph.expose":8,"ngraph.merge":13,"ngraph.quadtreebh":22}],16:[function(e,n,t){n.exports=function(n,t){function r(){var e=n.length;if(0!==e){for(var t=Number.MAX_VALUE,r=Number.MAX_VALUE,o=Number.MIN_VALUE,a=Number.MIN_VALUE;e--;){var u=n[e];u.isPinned?(u.pos.x=u.prevPos.x,u.pos.y=u.prevPos.y):(u.prevPos.x=u.pos.x,u.prevPos.y=u.pos.y),u.pos.xo&&(o=u.pos.x),u.pos.ya&&(a=u.pos.y)}i.x1=t,i.x2=o,i.y1=r,i.y2=a}}var o=e("ngraph.random").random(42),i={x1:0,y1:0,x2:0,y2:0};return{box:i,update:r,reset:function(){i.x1=i.y1=0,i.x2=i.y2=0},getBestNewPosition:function(e){var n=i,r=0,a=0;if(e.length){for(var u=0;u1&&(s.velocity.x=c/l,s.velocity.y=d/l),r=n*s.velocity.x,i=n*s.velocity.y,s.pos.x+=r,s.pos.y+=i,o+=Math.abs(r),a+=Math.abs(i)}return(o*o+a*a)/e.length}n.exports=r},{}],20:[function(e,n,t){function r(e,n,t,r,o){this.from=e,this.to=n,this.length=t,this.coeff=r,this.weight="number"==typeof o?o:1}n.exports=r},{}],21:[function(e,n,t){n.exports=function(n){var t=e("ngraph.merge"),r=e("ngraph.random").random(42),o=e("ngraph.expose");n=t(n,{springCoeff:2e-4,springLength:80});var i={update:function(e){var t=e.from,o=e.to,i=e.length<0?n.springLength:e.length,a=o.pos.x-t.pos.x,u=o.pos.y-t.pos.y,s=Math.sqrt(a*a+u*u);0===s&&(a=(r.nextDouble()-.5)/50,u=(r.nextDouble()-.5)/50,s=Math.sqrt(a*a+u*u));var f=s-i,c=(!e.coeff||e.coeff<0?n.springCoeff:e.coeff)*f/s*e.weight;t.force.x+=c*a,t.force.y+=c*u,o.force.x-=c*a,o.force.y-=c*u}};return o(n,i,["springCoeff","springLength"]),i}},{"ngraph.expose":8,"ngraph.merge":13,"ngraph.random":26}],22:[function(e,n,t){function r(e,n){return 0===n?e.quad0:1===n?e.quad1:2===n?e.quad2:3===n?e.quad3:null}function o(e,n,t){0===n?e.quad0=t:1===n?e.quad1=t:2===n?e.quad2=t:3===n&&(e.quad3=t)}n.exports=function(n){n=n||{},n.gravity="number"==typeof n.gravity?n.gravity:-1,n.theta="number"==typeof n.theta?n.theta:.8;var t=e("ngraph.random").random(1984),i=e("./node"),a=e("./insertStack"),u=e("./isSamePosition"),s=n.gravity,f=[],c=new a,d=n.theta,l=[],p=0,v=function(){var e=l[p];return e?(e.quad0=null,e.quad1=null,e.quad2=null,e.quad3=null,e.body=null,e.mass=e.massX=e.massY=0,e.left=e.right=e.top=e.bottom=0):(e=new i,l[p]=e),++p,e},h=v(),g=function(e){for(c.reset(),c.push(h,e);!c.isEmpty();){var n=c.pop(),i=n.node,a=n.body;if(i.body){var s=i.body;if(i.body=null,u(s.pos,a.pos)){var f=3;do{var d=t.nextDouble(),l=(i.right-i.left)*d,p=(i.bottom-i.top)*d;s.pos.x=i.left+l,s.pos.y=i.top+p,f-=1}while(f>0&&u(s.pos,a.pos));if(0===f&&u(s.pos,a.pos))return}c.push(i,s),c.push(i,a)}else{var g=a.pos.x,m=a.pos.y;i.mass=i.mass+a.mass,i.massX=i.massX+a.mass*g,i.massY=i.massY+a.mass*m;var y=0,x=i.left,w=(i.right+x)/2,b=i.top,E=(i.bottom+b)/2;if(g>w){y+=1;var L=x;x=w,w+=w-L}if(m>E){y+=2;var N=b;b=E,E+=E-N}var P=r(i,y);P?c.push(P,a):(P=v(),P.left=x,P.top=b,P.right=w,P.bottom=E,P.body=a,o(i,y,P))}}},m=function(e){var n,r,o,i,a=f,u=0,c=0,l=1,p=0,v=1;for(a[0]=h;l;){var g=a[p],m=g.body;l-=1,p+=1;var y=m!==e;m&&y?(r=m.pos.x-e.pos.x,o=m.pos.y-e.pos.y,i=Math.sqrt(r*r+o*o),0===i&&(r=(t.nextDouble()-.5)/50,o=(t.nextDouble()-.5)/50,i=Math.sqrt(r*r+o*o)),n=s*m.mass*e.mass/(i*i*i),u+=n*r,c+=n*o):y&&(r=g.massX/g.mass-e.pos.x,o=g.massY/g.mass-e.pos.y,i=Math.sqrt(r*r+o*o),0===i&&(r=(t.nextDouble()-.5)/50,o=(t.nextDouble()-.5)/50,i=Math.sqrt(r*r+o*o)),(g.right-g.left)/io&&(o=u),si&&(i=s)}var f=o-t,c=i-r;for(f>c?i=r+f:o=t+c,p=0,h=v(),h.left=t,h.right=o,h.top=r,h.bottom=i,n=a-1,n>0&&(h.body=e[n]);n--;)g(e[n],h)};return{insertBodies:y,updateBodyForce:m,options:function(e){return e?("number"==typeof e.gravity&&(s=e.gravity),"number"==typeof e.theta&&(d=e.theta),this):{gravity:s,theta:d}}}}},{"./insertStack":23,"./isSamePosition":24,"./node":25,"ngraph.random":26}],23:[function(e,n,t){function r(){this.stack=[],this.popIdx=0}function o(e,n){this.node=e,this.body=n}n.exports=r,r.prototype={isEmpty:function(){return 0===this.popIdx},push:function(e,n){var t=this.stack[this.popIdx];t?(t.node=e,t.body=n):this.stack[this.popIdx]=new o(e,n),++this.popIdx},pop:function(){if(this.popIdx>0)return this.stack[--this.popIdx]},reset:function(){this.popIdx=0}}},{}],24:[function(e,n,t){n.exports=function(e,n){var t=Math.abs(e.x-n.x),r=Math.abs(e.y-n.y);return t<1e-8&&r<1e-8}},{}],25:[function(e,n,t){n.exports=function(){this.body=null,this.quad0=null,this.quad1=null,this.quad2=null,this.quad3=null,this.mass=0,this.massX=0,this.massY=0,this.left=0,this.top=0,this.bottom=0,this.right=0}},{}],26:[function(e,n,t){function r(e){var n="number"==typeof e?e:+new Date,t=function(){return n=n+2127912214+(n<<12)&4294967295,n=4294967295&(3345072700^n^n>>>19),n=n+374761393+(n<<5)&4294967295,n=4294967295&(n+3550635116^n<<9),n=n+4251993797+(n<<3)&4294967295,n=4294967295&(3042594569^n^n>>>16),(268435455&n)/268435456};return{next:function(e){return Math.floor(t()*e)},nextDouble:function(){return t()}}}function o(e,n){var t=n||r();if("function"!=typeof t.next)throw new Error("customRandom does not match expected API: next() function is missing");return{forEach:function(n){var r,o,i;for(r=e.length-1;r>0;--r)o=t.next(r+1),i=e[o],e[o]=e[r],e[r]=i,n(i);e.length&&n(e[0])},shuffle:function(){var n,r,o;for(n=e.length-1;n>0;--n)r=t.next(n+1),o=e[r],e[r]=e[n],e[n]=o;return e}}}n.exports={random:r,randomIterator:o}},{}],27:[function(e,n,t){function r(e,n,t){function r(e){u.nodes.push(s(e))}function o(e){u.links.push(f(e))}function i(e){var n={id:e.id};return void 0!==e.data&&(n.data=e.data),n}function a(e){var n={fromId:e.fromId,toId:e.toId};return void 0!==e.data&&(n.data=e.data),n}var u={nodes:[],links:[]},s=n||i,f=t||a;return e.forEachNode(r),e.forEachLink(o),JSON.stringify(u)}n.exports=r},{}],28:[function(e,n,t){function r(e,n){var t=o(e);if(void 0===n)return t;for(var r=Object.keys(n),i=0;iv&&(r=1),u(e,r,{x:e.touches[0].clientX,y:e.touches[0].clientY}),v=t,m(e),y(e)}},A=function(e){p=!1,o.off("touchmove",k),o.off("touchend",A),o.off("touchcancel",A),c=null,r&&r(e)},j=function(e,t){m(e),y(e),d=t.clientX,l=t.clientY,c=e.target||e.srcElement,n&&n(e,{x:d,y:l}),p||(p=!0,o.on("touchmove",k),o.on("touchend",A),o.on("touchcancel",A))},_=function(e){return 1===e.touches.length?j(e,e.touches[0]):void(2===e.touches.length&&(m(e),y(e),v=P(e.touches[0],e.touches[1])))};return e.addEventListener("mousedown",b),e.addEventListener("touchstart",_),{onStart:function(e){return n=e,this},onDrag:function(e){return t=e,this},onStop:function(e){return r=e,this},onScroll:function(e){return N(e),this},release:function(){e.removeEventListener("mousedown",b),e.removeEventListener("touchstart",_), +o.off("mousemove",w),o.off("mouseup",E),o.off("touchmove",k),o.off("touchend",A),o.off("touchcancel",A),N(null)}}}n.exports=r;var o=e("../Utils/documentEvents.js"),i=e("../Utils/browserInfo.js"),a=e("../Utils/findElementPosition.js")},{"../Utils/browserInfo.js":39,"../Utils/documentEvents.js":40,"../Utils/findElementPosition.js":41}],36:[function(e,n,t){function r(e,n){var t=o(n),r=null,i={},a={x:0,y:0};return t.mouseDown(function(e,n){r=e,a.x=n.clientX,a.y=n.clientY,t.mouseCapture(r);var o=i[e.id];return o&&o.onStart&&o.onStart(n,a),!0}).mouseUp(function(e){t.releaseMouseCapture(r),r=null;var n=i[e.id];return n&&n.onStop&&n.onStop(),!0}).mouseMove(function(e,n){if(r){var t=i[r.id];return t&&t.onDrag&&t.onDrag(n,{x:n.clientX-a.x,y:n.clientY-a.y}),a.x=n.clientX,a.y=n.clientY,!0}}),{bindDragNDrop:function(e,n){i[e.id]=n,n||delete i[e.id]}}}n.exports=r;var o=e("../WebGL/webglInputEvents.js")},{"../WebGL/webglInputEvents.js":57}],37:[function(e,n,t){function r(e,n){function t(e){return d[e]}n=o(n,{maxX:1024,maxY:1024,seed:"Deterministic randomness made me do this"});var r=i(n.seed),u=new a(Number.MAX_VALUE,Number.MAX_VALUE,Number.MIN_VALUE,Number.MIN_VALUE),s={},f=function(e){return{x:r.next(n.maxX),y:r.next(n.maxY)}},c=function(e,n){e.xn.x2&&(n.x2=e.x),e.yn.y2&&(n.y2=e.y)},d="function"==typeof Object.create?Object.create(null):{},l=function(e){d[e.id]=f(e),c(d[e.id],u)},p=function(){0!==e.getNodesCount()&&(u.x1=Number.MAX_VALUE,u.y1=Number.MAX_VALUE,u.x2=Number.MIN_VALUE,u.y2=Number.MIN_VALUE,e.forEachNode(l))},v=function(e){s[e.id]=e},h=function(e){for(var n=0;n=0:"boolean"!=typeof z||z}function r(){G=G||window.document.body,F=F||i(e,{springLength:80,springCoeff:2e-4}),O=O||a(e,{container:G}),n.hasOwnProperty("renderLinks")||(n.renderLinks=!0),n.prerender=n.prerender||0,U=(O.inputManager||s)(e,O)}function l(){O.beginRender(),n.renderLinks&&O.renderLinks(),O.renderNodes(),O.endRender()}function p(){return W=F.step()&&!H,l(),!W}function v(e){return R?void(V+=e):void(e?(V+=e,R=f(function(){return p()},M)):(X=0,V=0,R=f(p,M)))}function h(){J||(W=!1,R.restart())}function g(){if("number"==typeof n.prerender&&n.prerender>0)for(var e=0;e0?n.insertBefore(r,n.firstChild):n.appendChild(r),r},releaseLink:function(e){var t=d[e.id];t&&(n.removeChild(t),delete d[e.id])},addNode:function(e,t){var r=l(e);if(r)return r.position=t,r.node=e,c[e.id]=r,n.appendChild(r),r},releaseNode:function(e){var t=c[e.id];t&&(n.removeChild(t),delete c[e.id])},renderNodes:function(){for(var e in c)if(c.hasOwnProperty(e)){var n=c[e];m.x=n.position.x,m.y=n.position.y,p(n,m,n.node)}},renderLinks:function(){for(var e in d)if(d.hasOwnProperty(e)){var n=d[e];y.x=n.position.from.x,y.y=n.position.from.y,x.x=n.position.to.x,x.y=n.position.to.y,h(n,y,x,n.link)}},getGraphicsRoot:function(e){return"function"==typeof e&&(t?e(t):r=e),t},getSvgRoot:function(){return t}};return i(b),b}n.exports=r;var o=e("simplesvg"),i=e("ngraph.events"),a=e("../Input/domInputManager.js")},{"../Input/domInputManager.js":34,"ngraph.events":7,simplesvg:28}],50:[function(e,n,t){function r(e){e=c(e,{enableBlending:!0,preserveDrawingBuffer:!1,clearColor:!1,clearColorValue:{r:1,g:1,b:1,a:1}});var n,t,r,d,l,p,v,h,g=0,m=0,y=[1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1],x=[],w=[],b={},E={},L=i(),N=a(),P=function(e){return u()},k=function(e){return s(3014898687)},A=function(){L.updateTransform(y),N.updateTransform(y)},j=function(){y=[1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1]},_=function(){n&&t&&(d=t.width=Math.max(n.offsetWidth,1),l=t.height=Math.max(n.offsetHeight,1),r&&r.viewport(0,0,d,l),L&&L.updateSize(d/2,l/2),N&&N.updateSize(d/2,l/2))},I=function(e){e.fire("rescaled")};t=window.document.createElement("canvas");var T={getLinkUI:function(e){return E[e]},getNodeUI:function(e){return b[e]},node:function(e){if("function"==typeof e)return P=e,this},link:function(e){if("function"==typeof e)return k=e,this},placeNode:function(e){return p=e,this},placeLink:function(e){return v=e,this},inputManager:o,beginRender:function(){},endRender:function(){m>0&&L.render(),g>0&&N.render()},bringLinkToFront:function(e){var n,t,r=L.getFrontLinkId();L.bringToFront(e),r>e.id&&(n=e.id,t=w[r],w[r]=w[n],w[r].id=r,w[n]=t,w[n].id=n)},graphCenterChanged:function(e,n){y[12]=2*e/d-1,y[13]=1-2*n/l,A()},addLink:function(e,n){var t=m++,r=k(e);return r.id=t,r.pos=n,L.createLink(r),w[t]=r,E[e.id]=r,r},addNode:function(e,n){var t=g++,r=P(e);return r.id=t,r.position=n,r.node=e,N.createNode(r),x[t]=r,b[e.id]=r,r},translateRel:function(e,n){y[12]+=2*y[0]*e/d/y[0],y[13]-=2*y[5]*n/l/y[5],A()},scale:function(e,n){var t=2*n.x/d-1,r=1-2*n.y/l;return t-=y[12],r-=y[13],y[12]+=t*(1-e),y[13]+=r*(1-e),y[0]*=e,y[5]*=e,A(),I(this),y[0]},resetScale:function(){return j(),r&&(_(),A()),this},init:function(o){var i={};if(e.preserveDrawingBuffer&&(i.preserveDrawingBuffer=!0),n=o,_(),j(),n.appendChild(t),r=t.getContext("experimental-webgl",i),!r){var a="Could not initialize WebGL. Seems like the browser doesn't support it.";throw window.alert(a),a}if(e.enableBlending&&(r.blendFunc(r.SRC_ALPHA,r.ONE_MINUS_SRC_ALPHA),r.enable(r.BLEND)),e.clearColor){var u=e.clearColorValue;r.clearColor(u.r,u.g,u.b,u.a),this.beginRender=function(){r.clear(r.COLOR_BUFFER_BIT)}}L.load(r),L.updateSize(d/2,l/2),N.load(r),N.updateSize(d/2,l/2),A(),"function"==typeof h&&h(t)},release:function(e){t&&e&&e.removeChild(t)},isSupported:function(){var e=window.document.createElement("canvas"),n=e&&e.getContext&&e.getContext("experimental-webgl");return n},releaseLink:function(e){m>0&&(m-=1);var n=E[e.id];delete E[e.id],L.removeLink(n);var t=n.id;if(t0&&(g-=1);var n=b[e.id];delete b[e.id],N.removeNode(n);var t=n.id;if(te.length){var r=new Float32Array(e.length*t*2);return r.set(e),r}return e}function a(n,t){for(var r={},o=0;o=w.length&&s();var i=w[r.textureNumber];i.ctx.drawImage(n,r.col*g,r.row*g,g,g),b[e]=n.src,y[n.src]=o,i.isDirty=!0,t(o)}function c(n){var t=n/e<<0,r=n%e,o=r/h<<0,i=r%h;return{textureNumber:t,row:o,col:i}}function d(){E.isDirty=!0,x=0,v=null}function l(){v&&(window.clearTimeout(v),x+=1,v=null),x>10?d():v=window.setTimeout(d,400)}function p(e,n){var t=w[e.textureNumber].canvas,r=w[n.textureNumber].ctx,o=n.col*g,i=n.row*g;r.drawImage(t,e.col*g,e.row*g,g,g,o,i,g,g),w[e.textureNumber].isDirty=!0,w[n.textureNumber].isDirty=!0}var v,h=Math.sqrt(e||1024)<<0,g=h,m=1,y={},x=0,w=[],b=[];if(!o(e))throw"Tiles per texture should be power of two.";var E={isDirty:!1,clearDirty:n,remove:t,getTextures:r,getCoordinates:a,load:u};return E}function o(e){return 0===(e&e-1)}var i=e("./texture.js");n.exports=r},{"./texture.js":52}],55:[function(e,n,t){function r(e,n){return{_texture:0,_offset:0,size:"number"==typeof e?e:32,src:n}}n.exports=r},{}],56:[function(e,n,t){function r(){function e(e,n){e.nativeObject&&g.deleteTexture(e.nativeObject);var t=g.createTexture();g.activeTexture(g["TEXTURE"+n]),g.bindTexture(g.TEXTURE_2D,t),g.texImage2D(g.TEXTURE_2D,0,g.RGBA,g.RGBA,g.UNSIGNED_BYTE,e.canvas),g.texParameteri(g.TEXTURE_2D,g.TEXTURE_MAG_FILTER,g.LINEAR),g.texParameteri(g.TEXTURE_2D,g.TEXTURE_MIN_FILTER,g.LINEAR_MIPMAP_NEAREST),g.generateMipmap(g.TEXTURE_2D),g.uniform1i(x["sampler"+n],n),e.nativeObject=t}function n(){if(v.isDirty){var n,t=v.getTextures();for(n=0;n0&&(j-=1),e.id0&&(e.src&&v.remove(e.src),y.copyArrayPart(_,e.id*N,j*N,N))}function c(e,n){n._offset=e._offset}function d(e){L=!0,E=e}function l(e,n){w=e,b=n,L=!0}function p(){g.useProgram(h),g.bindBuffer(g.ARRAY_BUFFER,m),g.bufferData(g.ARRAY_BUFFER,_,g.DYNAMIC_DRAW),L&&(L=!1,g.uniformMatrix4fv(x.transform,!1,E),g.uniform2f(x.screenSize,w,b)),g.vertexAttribPointer(x.vertexPos,2,g.FLOAT,!1,3*Float32Array.BYTES_PER_ELEMENT,0),g.vertexAttribPointer(x.customAttributes,1,g.FLOAT,!1,3*Float32Array.BYTES_PER_ELEMENT,8),n(),g.drawArrays(g.TRIANGLES,0,6*j)}var v,h,g,m,y,x,w,b,E,L,N=18,P=o(),k=i(),A=1024,j=0,_=new Float32Array(64);return{load:t,position:r,createNode:s,removeNode:f,replaceProperties:c,updateTransform:d,updateSize:l,render:p}}function o(){return["precision mediump float;","varying vec4 color;","varying vec3 vTextureCoord;","uniform sampler2D u_sampler0;","uniform sampler2D u_sampler1;","uniform sampler2D u_sampler2;","uniform sampler2D u_sampler3;","void main(void) {"," if (vTextureCoord.z == 0.) {"," gl_FragColor = texture2D(u_sampler0, vTextureCoord.xy);"," } else if (vTextureCoord.z == 1.) {"," gl_FragColor = texture2D(u_sampler1, vTextureCoord.xy);"," } else if (vTextureCoord.z == 2.) {"," gl_FragColor = texture2D(u_sampler2, vTextureCoord.xy);"," } else if (vTextureCoord.z == 3.) {"," gl_FragColor = texture2D(u_sampler3, vTextureCoord.xy);"," } else { gl_FragColor = vec4(0, 1, 0, 1); }","}"].join("\n")}function i(){return["attribute vec2 a_vertexPos;","attribute float a_customAttributes;","uniform vec2 u_screenSize;","uniform mat4 u_transform;","uniform float u_tilesPerTexture;","varying vec3 vTextureCoord;","void main(void) {"," gl_Position = u_transform * vec4(a_vertexPos/u_screenSize, 0, 1);","float corner = mod(a_customAttributes, 4.);","float tileIndex = mod(floor(a_customAttributes / 4.), u_tilesPerTexture);","float tilesPerRow = sqrt(u_tilesPerTexture);","float tileSize = 1./tilesPerRow;","float tileColumn = mod(tileIndex, tilesPerRow);","float tileRow = floor(tileIndex/tilesPerRow);","if(corner == 0.0) {"," vTextureCoord.xy = vec2(0, 1);","} else if(corner == 1.0) {"," vTextureCoord.xy = vec2(1, 1);","} else if(corner == 2.0) {"," vTextureCoord.xy = vec2(0, 0);","} else {"," vTextureCoord.xy = vec2(1, 0);","}","vTextureCoord *= tileSize;","vTextureCoord.x += tileColumn * tileSize;","vTextureCoord.y += tileRow * tileSize;","vTextureCoord.z = floor(floor(a_customAttributes / 4.)/u_tilesPerTexture);","}"].join("\n")}var a=e("./webglAtlas.js"),u=e("./webgl.js");n.exports=r},{"./webgl.js":53,"./webglAtlas.js":54}],57:[function(e,n,t){function r(e){function n(){x=null}function t(e){x=e}function r(e){return"function"==typeof e&&k.push(e),j}function i(e){return"function"==typeof e&&P.push(e),j}function a(e){return"function"==typeof e&&N.push(e),j}function u(e){return"function"==typeof e&&L.push(e),j}function s(e){return"function"==typeof e&&E.push(e),j}function f(e){return"function"==typeof e&&b.push(e),j}function c(e){return"function"==typeof e&&w.push(e),j}function d(e,n,t){if(e&&e.size){var r=e.position,o=e.size;return r.x-og.byteLength){var e=new ArrayBuffer(2*g.byteLength),n=new Float32Array(e),t=new Uint32Array(e);t.set(y),m=n,y=t,g=e}};return{load:function(a){n=a,r=o(a),e=r.createProgram(v,p),n.useProgram(e),i=r.getLocations(e,["a_vertexPos","a_color","u_screenSize","u_transform"]),n.enableVertexAttribArray(i.vertexPos),n.enableVertexAttribArray(i.color),t=n.createBuffer()},position:function(e,n,t){var r=e.id,o=r*d;m[o]=n.x,m[o+1]=n.y,y[o+2]=e.color,m[o+3]=t.x,m[o+4]=t.y,y[o+5]=e.color},createLink:function(e){x(),h+=1,a=e.id},removeLink:function(e){h>0&&(h-=1),e.id0&&r.copyArrayPart(y,e.id*d,h*d,d)},updateTransform:function(e){c=!0,f=e},updateSize:function(e,n){u=e,s=n,c=!0},render:function(){n.useProgram(e),n.bindBuffer(n.ARRAY_BUFFER,t),n.bufferData(n.ARRAY_BUFFER,g,n.DYNAMIC_DRAW),c&&(c=!1,n.uniformMatrix4fv(i.transform,!1,f),n.uniform2f(i.screenSize,u,s)),n.vertexAttribPointer(i.vertexPos,2,n.FLOAT,!1,3*Float32Array.BYTES_PER_ELEMENT,0),n.vertexAttribPointer(i.color,4,n.UNSIGNED_BYTE,!0,3*Float32Array.BYTES_PER_ELEMENT,8),n.drawArrays(n.LINES,0,2*h),a=h-1},bringToFront:function(e){a>e.id&&r.swapArrayPart(m,e.id*d,a*d,d),a>0&&(a-=1)},getFrontLinkId:function(){return a}}}var o=e("./webgl.js");n.exports=r},{"./webgl.js":53}],60:[function(e,n,t){function r(){function e(){if((k+1)*w>=L.byteLength){var e=new ArrayBuffer(2*L.byteLength),n=new Float32Array(e),t=new Uint32Array(e);t.set(P),N=n,P=t,L=e}}function n(e){d=e,v=o(e),c=v.createProgram(E,b),d.useProgram(c),p=v.getLocations(c,["a_vertexPos","a_color","u_screenSize","u_transform"]),d.enableVertexAttribArray(p.vertexPos),d.enableVertexAttribArray(p.color),l=d.createBuffer()}function t(e,n){var t=e.id;N[t*x]=n.x,N[t*x+1]=-n.y,N[t*x+2]=e.size,P[t*x+3]=e.color}function r(e){y=!0,m=e}function i(e,n){h=e,g=n,y=!0}function a(e){k>0&&(k-=1),e.id0&&v.copyArrayPart(P,e.id*x,k*x,x)}function u(){e(),k+=1}function s(){}function f(){d.useProgram(c),d.bindBuffer(d.ARRAY_BUFFER,l),d.bufferData(d.ARRAY_BUFFER,L,d.DYNAMIC_DRAW),y&&(y=!1,d.uniformMatrix4fv(p.transform,!1,m),d.uniform2f(p.screenSize,h,g)),d.vertexAttribPointer(p.vertexPos,3,d.FLOAT,!1,x*Float32Array.BYTES_PER_ELEMENT,0),d.vertexAttribPointer(p.color,4,d.UNSIGNED_BYTE,!0,x*Float32Array.BYTES_PER_ELEMENT,12),d.drawArrays(d.POINTS,0,k)}var c,d,l,p,v,h,g,m,y,x=4,w=3*Float32Array.BYTES_PER_ELEMENT+Uint32Array.BYTES_PER_ELEMENT,b=["precision mediump float;","varying vec4 color;","void main(void) {"," gl_FragColor = color;","}"].join("\n"),E=["attribute vec3 a_vertexPos;","attribute vec4 a_color;","uniform vec2 u_screenSize;","uniform mat4 u_transform;","varying vec4 color;","void main(void) {"," gl_Position = u_transform * vec4(a_vertexPos.xy/u_screenSize, 0, 1);"," gl_PointSize = a_vertexPos.z * u_transform[0][0];"," color = a_color.abgr;","}"].join("\n"),L=new ArrayBuffer(16*w),N=new Float32Array(L),P=new Uint32Array(L),k=0;return{load:n,position:t,updateTransform:r,updateSize:i,removeNode:a,createNode:u,replaceProperties:s,render:f}}var o=e("./webgl.js");n.exports=r},{"./webgl.js":53}],61:[function(e,n,t){function r(e,n){return{size:"number"==typeof e?e:10,color:o(n)}}var o=e("./parseColor.js");n.exports=r},{"./parseColor.js":51}],62:[function(e,n,t){n.exports="0.8.1"},{}]},{},[1])(1)}); \ No newline at end of file From c4ef0520183435255a960c31ea31fedeb104d74f Mon Sep 17 00:00:00 2001 From: Andriy Kashcha Date: Mon, 24 Apr 2017 21:45:30 -0700 Subject: [PATCH 04/49] 0.8.3 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 4cfe071..9b7ccd6 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "vivagraphjs", - "version": "0.8.2", + "version": "0.8.3", "description": "Graph Drawing Library", "main": "src/viva", "directories": { From a0c80779635ea423fef032423f4b2acb117675c8 Mon Sep 17 00:00:00 2001 From: josephrocca Date: Mon, 1 May 2017 17:18:45 +0800 Subject: [PATCH 05/49] A bit in the readme on live tuning? --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index 5c97cf9..44f8de9 100644 --- a/README.md +++ b/README.md @@ -163,6 +163,8 @@ Now the result is much better: ![Grid 3x3](https://github.com/anvaka/VivaGraphJS/raw/master/packages/Images/gridGood.png) +You can tune values during simulation with `layout.simulation.springLength(newValue)`, `layout.simulation.springCoeff(newValue)`, etc. + Tuning layout algorithm is definitely one of the hardest part of using this library. It has to be improved in future to simplify usage. Each of the force directed algorithm parameters are described in the source code. From c69725bf512ce634d2aec54c821b951b7380a374 Mon Sep 17 00:00:00 2001 From: Alex Burner Date: Mon, 1 May 2017 13:37:28 -0700 Subject: [PATCH 06/49] Add direct link to ngraph repo in readme As a new user, I was confused about the `ngraph` family until I ran across the main repo page. It did not show up on the first page of results when I viewed the https://www.npmjs.com/search?q=ngraph link. I failed to understand that the core layout algorithms are decoupled from VivaGraphJS. This commit adds a link to the main repo in the readme and tries to specify that it contains the layout algorithms. --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 5c97cf9..5b6ac97 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ VivaGraph [![Build Status](https://travis-ci.org/anvaka/VivaGraphJS.svg)](https://travis-ci.org/anvaka/VivaGraphJS) ================================================== **VivaGraphJS** is designed to be extensible and to support different -rendering engines and layout algorithms. Underlying modules can be found via [ngraph](https://www.npmjs.com/search?q=ngraph) query. +rendering engines and layout algorithms. Underlying algorithms have been broken out into [ngraph](https://github.com/anvaka/ngraph). The larger family of modules can be found by [querying npm for "ngraph"](https://www.npmjs.com/search?q=ngraph). [![Gitter](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/anvaka/VivaGraphJS?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge) From 7330a58329098be66df4222a474a5e41e85beb45 Mon Sep 17 00:00:00 2001 From: Alex Burner Date: Tue, 2 May 2017 18:53:21 -0700 Subject: [PATCH 07/49] Newline for npm query --- README.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 5b6ac97..6ad8c98 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,9 @@ VivaGraph [![Build Status](https://travis-ci.org/anvaka/VivaGraphJS.svg)](https://travis-ci.org/anvaka/VivaGraphJS) ================================================== **VivaGraphJS** is designed to be extensible and to support different -rendering engines and layout algorithms. Underlying algorithms have been broken out into [ngraph](https://github.com/anvaka/ngraph). The larger family of modules can be found by [querying npm for "ngraph"](https://www.npmjs.com/search?q=ngraph). +rendering engines and layout algorithms. Underlying algorithms have been broken out into [ngraph](https://github.com/anvaka/ngraph). + +The larger family of modules can be found by [querying npm for "ngraph"](https://www.npmjs.com/search?q=ngraph). [![Gitter](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/anvaka/VivaGraphJS?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge) From cc07eaa31be1f1f33f41839b9d4aadcf04e06412 Mon Sep 17 00:00:00 2001 From: josephrocca Date: Wed, 3 May 2017 15:25:16 +0800 Subject: [PATCH 08/49] Updated dynamic tuning details in readme --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 44f8de9..bed591e 100644 --- a/README.md +++ b/README.md @@ -163,7 +163,7 @@ Now the result is much better: ![Grid 3x3](https://github.com/anvaka/VivaGraphJS/raw/master/packages/Images/gridGood.png) -You can tune values during simulation with `layout.simulation.springLength(newValue)`, `layout.simulation.springCoeff(newValue)`, etc. +You can tune values during simulation with `layout.simulator.springLength(newValue)`, `layout.simulator.springCoeff(newValue)`, etc. See all the values that you can tune in [this source file](https://github.com/anvaka/ngraph.physics.simulator/blob/master/index.js#L12). Tuning layout algorithm is definitely one of the hardest part of using this library. It has to be improved in future to simplify usage. Each of the force directed From 17d02727fa7cc46f127f5e7d21223a14d2a59521 Mon Sep 17 00:00:00 2001 From: Andriy Kashcha Date: Mon, 8 May 2017 22:35:41 -0700 Subject: [PATCH 09/49] Updated to latest ngraph.forcelayout --- dist/vivagraph.js | 628 ++++++++++++++++++++++++------------------ dist/vivagraph.min.js | 4 +- package.json | 3 +- 3 files changed, 358 insertions(+), 277 deletions(-) diff --git a/dist/vivagraph.js b/dist/vivagraph.js index 29c4caa..0a7e067 100644 --- a/dist/vivagraph.js +++ b/dist/vivagraph.js @@ -578,8 +578,11 @@ function augment(source, target, key) { module.exports = createLayout; module.exports.simulator = require('ngraph.physics.simulator'); +var eventify = require('ngraph.events'); + /** * Creates force based layout for a given graph. + * * @param {ngraph.graph} graph which needs to be laid out * @param {object} physicsSettings if you need custom settings * for physics simulator you can pass your own settings here. If it's not passed @@ -593,21 +596,46 @@ function createLayout(graph, physicsSettings) { var createSimulator = require('ngraph.physics.simulator'); var physicsSimulator = createSimulator(physicsSettings); - var nodeBodies = typeof Object.create === 'function' ? Object.create(null) : {}; + var nodeBodies = Object.create(null); var springs = {}; + var bodiesCount = 0; var springTransform = physicsSimulator.settings.springTransform || noop; - // Initialize physical objects according to what we have in the graph: + // Initialize physics with what we have in the graph: initPhysics(); - listenToGraphEvents(); + listenToEvents(); + + var wasStable = false; var api = { /** * Performs one step of iterative layout algorithm + * + * @returns {boolean} true if the system should be considered stable; Flase otherwise. + * The system is stable if no further call to `step()` can improve the layout. */ step: function() { - return physicsSimulator.step(); + if (bodiesCount === 0) return true; // TODO: This will never fire 'stable' + + var lastMove = physicsSimulator.step(); + + // Save the movement in case if someone wants to query it in the step + // callback. + api.lastMove = lastMove; + + // Allow listeners to perform low-level actions after nodes are updated. + api.fire('step'); + + var ratio = lastMove/bodiesCount; + var isStableNow = ratio <= 0.01; // TODO: The number is somewhat arbitrary... + + if (wasStable !== isStableNow) { + wasStable = isStableNow; + onStableChanged(isStableNow); + } + + return isStableNow; }, /** @@ -653,6 +681,11 @@ function createLayout(graph, physicsSettings) { return physicsSimulator.getBBox(); }, + /** + * Iterates over each body in the layout simulator and performs a callback(body, nodeId) + */ + forEachBody: forEachBody, + /* * Requests layout algorithm to pin/unpin node to its current position * Pinned nodes should not be affected by layout algorithm and always @@ -675,6 +708,7 @@ function createLayout(graph, physicsSettings) { */ dispose: function() { graph.off('changed', onGraphChanged); + api.fire('disposed'); }, /** @@ -696,15 +730,33 @@ function createLayout(graph, physicsSettings) { /** * [Read only] Gets current physics simulator */ - simulator: physicsSimulator + simulator: physicsSimulator, + + /** + * Gets the graph that was used for layout + */ + graph: graph, + + /** + * Gets amount of movement performed during last step opeartion + */ + lastMove: 0 }; + eventify(api); + return api; + function forEachBody(cb) { + Object.keys(nodeBodies).forEach(function(bodyId) { + cb(nodeBodies[bodyId], bodyId); + }); + } + function getSpring(fromId, toId) { var linkId; if (toId === undefined) { - if (typeof fromId === 'string') { + if (typeof fromId !== 'object') { // assume fromId as a linkId: linkId = fromId; } else { @@ -725,10 +777,14 @@ function createLayout(graph, physicsSettings) { return nodeBodies[nodeId]; } - function listenToGraphEvents() { + function listenToEvents() { graph.on('changed', onGraphChanged); } + function onStableChanged(isStable) { + api.fire('stable', isStable); + } + function onGraphChanged(changes) { for (var i = 0; i < changes.length; ++i) { var change = changes[i]; @@ -748,12 +804,17 @@ function createLayout(graph, physicsSettings) { } } } + bodiesCount = graph.getNodesCount(); } function initPhysics() { + bodiesCount = 0; + graph.forEachNode(function (node) { initBody(node.id); + bodiesCount += 1; }); + graph.forEachLink(initLink); } @@ -772,6 +833,7 @@ function createLayout(graph, physicsSettings) { } body = physicsSimulator.addBodyAt(pos); + body.id = nodeId; nodeBodies[nodeId] = body; updateBodyMass(nodeId); @@ -872,13 +934,15 @@ function createLayout(graph, physicsSettings) { * @returns {Number} recommended mass of the body; */ function nodeMass(nodeId) { - return 1 + graph.getLinks(nodeId).length / 3.0; + var links = graph.getLinks(nodeId); + if (!links) return 1; + return 1 + links.length / 3.0; } } function noop() { } -},{"ngraph.physics.simulator":15}],10:[function(require,module,exports){ +},{"ngraph.events":7,"ngraph.physics.simulator":15}],10:[function(require,module,exports){ module.exports = load; var createGraph = require('ngraph.graph'); @@ -1888,6 +1952,7 @@ function physicsSimulator(settings) { var Spring = require('./lib/spring'); var expose = require('ngraph.expose'); var merge = require('ngraph.merge'); + var eventify = require('ngraph.events'); settings = merge(settings, { /** @@ -1924,11 +1989,6 @@ function physicsSimulator(settings) { * Default time step (dt) for forces integration */ timeStep : 20, - - /** - * Maximum movement of the system which can be considered as stabilized - */ - stableThreshold: 0.009 }); // We allow clients to override basic factory methods: @@ -1946,6 +2006,8 @@ function physicsSimulator(settings) { springForce = createSpringForce(settings), dragForce = createDragForce(settings); + var totalMovement = 0; // how much movement we made on last step + var publicApi = { /** * Array of bodies, registered with current simulator @@ -1955,6 +2017,8 @@ function physicsSimulator(settings) { */ bodies: bodies, + quadTree: quadTree, + /** * Array of springs, registered with current simulator * @@ -1975,11 +2039,11 @@ function physicsSimulator(settings) { */ step: function () { accumulateForces(); - var totalMovement = integrate(bodies, settings.timeStep); + var movement = integrate(bodies, settings.timeStep); bounds.update(); - return totalMovement < settings.stableThreshold; + return movement; }, /** @@ -2057,6 +2121,13 @@ function physicsSimulator(settings) { return spring; }, + /** + * Returns amount of movement performed on last step() call + */ + getTotalMovement: function () { + return totalMovement; + }, + /** * Removes spring from the system * @@ -2108,6 +2179,8 @@ function physicsSimulator(settings) { // allow settings modification via public API: expose(settings, publicApi); + eventify(publicApi); + return publicApi; function accumulateForces() { @@ -2138,7 +2211,7 @@ function physicsSimulator(settings) { } }; -},{"./lib/bounds":16,"./lib/createBody":17,"./lib/dragForce":18,"./lib/eulerIntegrator":19,"./lib/spring":20,"./lib/springForce":21,"ngraph.expose":8,"ngraph.merge":13,"ngraph.quadtreebh":22}],16:[function(require,module,exports){ +},{"./lib/bounds":16,"./lib/createBody":17,"./lib/dragForce":18,"./lib/eulerIntegrator":19,"./lib/spring":20,"./lib/springForce":21,"ngraph.events":7,"ngraph.expose":8,"ngraph.merge":13,"ngraph.quadtreebh":22}],16:[function(require,module,exports){ module.exports = function (bodies, settings) { var random = require('ngraph.random').random(42); var boundingBox = { x1: 0, y1: 0, x2: 0, y2: 0 }; @@ -2272,6 +2345,10 @@ function integrate(bodies, timeStep) { i, max = bodies.length; + if (max === 0) { + return 0; + } + for (i = 0; i < max; ++i) { var body = bodies[i], coeff = timeStep / body.mass; @@ -2296,7 +2373,7 @@ function integrate(bodies, timeStep) { tx += Math.abs(dx); ty += Math.abs(dy); } - return (tx * tx + ty * ty)/bodies.length; + return (tx * tx + ty * ty)/max; } },{}],20:[function(require,module,exports){ @@ -2393,289 +2470,292 @@ module.exports = function(options) { nodesCache = [], currentInCache = 0, - newNode = function() { - // To avoid pressure on GC we reuse nodes. - var node = nodesCache[currentInCache]; - if (node) { - node.quad0 = null; - node.quad1 = null; - node.quad2 = null; - node.quad3 = null; - node.body = null; - node.mass = node.massX = node.massY = 0; - node.left = node.right = node.top = node.bottom = 0; - } else { - node = new Node(); - nodesCache[currentInCache] = node; - } + root = newNode(); - ++currentInCache; - return node; + return { + insertBodies: insertBodies, + /** + * Gets root node if its present + */ + getRoot: function() { + return root; }, - - root = newNode(), - - // Inserts body to the tree - insert = function(newBody) { - insertStack.reset(); - insertStack.push(root, newBody); - - while (!insertStack.isEmpty()) { - var stackItem = insertStack.pop(), - node = stackItem.node, - body = stackItem.body; - - if (!node.body) { - // This is internal node. Update the total mass of the node and center-of-mass. - var x = body.pos.x; - var y = body.pos.y; - node.mass = node.mass + body.mass; - node.massX = node.massX + body.mass * x; - node.massY = node.massY + body.mass * y; - - // Recursively insert the body in the appropriate quadrant. - // But first find the appropriate quadrant. - var quadIdx = 0, // Assume we are in the 0's quad. - left = node.left, - right = (node.right + left) / 2, - top = node.top, - bottom = (node.bottom + top) / 2; - - if (x > right) { // somewhere in the eastern part. - quadIdx = quadIdx + 1; - var oldLeft = left; - left = right; - right = right + (right - oldLeft); - } - if (y > bottom) { // and in south. - quadIdx = quadIdx + 2; - var oldTop = top; - top = bottom; - bottom = bottom + (bottom - oldTop); - } - - var child = getChild(node, quadIdx); - if (!child) { - // The node is internal but this quadrant is not taken. Add - // subnode to it. - child = newNode(); - child.left = left; - child.top = top; - child.right = right; - child.bottom = bottom; - child.body = body; - - setChild(node, quadIdx, child); - } else { - // continue searching in this quadrant. - insertStack.push(child, body); - } - } else { - // We are trying to add to the leaf node. - // We have to convert current leaf into internal node - // and continue adding two nodes. - var oldBody = node.body; - node.body = null; // internal nodes do not cary bodies - - if (isSamePosition(oldBody.pos, body.pos)) { - // Prevent infinite subdivision by bumping one node - // anywhere in this quadrant - var retriesCount = 3; - do { - var offset = random.nextDouble(); - var dx = (node.right - node.left) * offset; - var dy = (node.bottom - node.top) * offset; - - oldBody.pos.x = node.left + dx; - oldBody.pos.y = node.top + dy; - retriesCount -= 1; - // Make sure we don't bump it out of the box. If we do, next iteration should fix it - } while (retriesCount > 0 && isSamePosition(oldBody.pos, body.pos)); - - if (retriesCount === 0 && isSamePosition(oldBody.pos, body.pos)) { - // This is very bad, we ran out of precision. - // if we do not return from the method we'll get into - // infinite loop here. So we sacrifice correctness of layout, and keep the app running - // Next layout iteration should get larger bounding box in the first step and fix this - return; - } - } - // Next iteration should subdivide node further. - insertStack.push(node, oldBody); - insertStack.push(node, body); + updateBodyForce: update, + options: function(newOptions) { + if (newOptions) { + if (typeof newOptions.gravity === 'number') { + gravity = newOptions.gravity; } + if (typeof newOptions.theta === 'number') { + theta = newOptions.theta; + } + + return this; } - }, - update = function(sourceBody) { - var queue = updateQueue, - v, - dx, - dy, - r, fx = 0, - fy = 0, - queueLength = 1, - shiftIdx = 0, - pushIdx = 1; - - queue[0] = root; - - while (queueLength) { - var node = queue[shiftIdx], - body = node.body; - - queueLength -= 1; - shiftIdx += 1; - var differentBody = (body !== sourceBody); - if (body && differentBody) { - // If the current node is a leaf node (and it is not source body), - // calculate the force exerted by the current node on body, and add this - // amount to body's net force. - dx = body.pos.x - sourceBody.pos.x; - dy = body.pos.y - sourceBody.pos.y; - r = Math.sqrt(dx * dx + dy * dy); + return { + gravity: gravity, + theta: theta + }; + } + }; - if (r === 0) { - // Poor man's protection against zero distance. - dx = (random.nextDouble() - 0.5) / 50; - dy = (random.nextDouble() - 0.5) / 50; - r = Math.sqrt(dx * dx + dy * dy); - } + function newNode() { + // To avoid pressure on GC we reuse nodes. + var node = nodesCache[currentInCache]; + if (node) { + node.quad0 = null; + node.quad1 = null; + node.quad2 = null; + node.quad3 = null; + node.body = null; + node.mass = node.massX = node.massY = 0; + node.left = node.right = node.top = node.bottom = 0; + } else { + node = new Node(); + nodesCache[currentInCache] = node; + } + + ++currentInCache; + return node; + } + + function update(sourceBody) { + var queue = updateQueue, + v, + dx, + dy, + r, fx = 0, + fy = 0, + queueLength = 1, + shiftIdx = 0, + pushIdx = 1; + + queue[0] = root; + + while (queueLength) { + var node = queue[shiftIdx], + body = node.body; + + queueLength -= 1; + shiftIdx += 1; + var differentBody = (body !== sourceBody); + if (body && differentBody) { + // If the current node is a leaf node (and it is not source body), + // calculate the force exerted by the current node on body, and add this + // amount to body's net force. + dx = body.pos.x - sourceBody.pos.x; + dy = body.pos.y - sourceBody.pos.y; + r = Math.sqrt(dx * dx + dy * dy); + + if (r === 0) { + // Poor man's protection against zero distance. + dx = (random.nextDouble() - 0.5) / 50; + dy = (random.nextDouble() - 0.5) / 50; + r = Math.sqrt(dx * dx + dy * dy); + } - // This is standard gravition force calculation but we divide - // by r^3 to save two operations when normalizing force vector. - v = gravity * body.mass * sourceBody.mass / (r * r * r); + // This is standard gravition force calculation but we divide + // by r^3 to save two operations when normalizing force vector. + v = gravity * body.mass * sourceBody.mass / (r * r * r); + fx += v * dx; + fy += v * dy; + } else if (differentBody) { + // Otherwise, calculate the ratio s / r, where s is the width of the region + // represented by the internal node, and r is the distance between the body + // and the node's center-of-mass + dx = node.massX / node.mass - sourceBody.pos.x; + dy = node.massY / node.mass - sourceBody.pos.y; + r = Math.sqrt(dx * dx + dy * dy); + + if (r === 0) { + // Sorry about code duplucation. I don't want to create many functions + // right away. Just want to see performance first. + dx = (random.nextDouble() - 0.5) / 50; + dy = (random.nextDouble() - 0.5) / 50; + r = Math.sqrt(dx * dx + dy * dy); + } + // If s / r < θ, treat this internal node as a single body, and calculate the + // force it exerts on sourceBody, and add this amount to sourceBody's net force. + if ((node.right - node.left) / r < theta) { + // in the if statement above we consider node's width only + // because the region was squarified during tree creation. + // Thus there is no difference between using width or height. + v = gravity * node.mass * sourceBody.mass / (r * r * r); fx += v * dx; fy += v * dy; - } else if (differentBody) { - // Otherwise, calculate the ratio s / r, where s is the width of the region - // represented by the internal node, and r is the distance between the body - // and the node's center-of-mass - dx = node.massX / node.mass - sourceBody.pos.x; - dy = node.massY / node.mass - sourceBody.pos.y; - r = Math.sqrt(dx * dx + dy * dy); + } else { + // Otherwise, run the procedure recursively on each of the current node's children. - if (r === 0) { - // Sorry about code duplucation. I don't want to create many functions - // right away. Just want to see performance first. - dx = (random.nextDouble() - 0.5) / 50; - dy = (random.nextDouble() - 0.5) / 50; - r = Math.sqrt(dx * dx + dy * dy); + // I intentionally unfolded this loop, to save several CPU cycles. + if (node.quad0) { + queue[pushIdx] = node.quad0; + queueLength += 1; + pushIdx += 1; } - // If s / r < θ, treat this internal node as a single body, and calculate the - // force it exerts on sourceBody, and add this amount to sourceBody's net force. - if ((node.right - node.left) / r < theta) { - // in the if statement above we consider node's width only - // because the region was squarified during tree creation. - // Thus there is no difference between using width or height. - v = gravity * node.mass * sourceBody.mass / (r * r * r); - fx += v * dx; - fy += v * dy; - } else { - // Otherwise, run the procedure recursively on each of the current node's children. - - // I intentionally unfolded this loop, to save several CPU cycles. - if (node.quad0) { - queue[pushIdx] = node.quad0; - queueLength += 1; - pushIdx += 1; - } - if (node.quad1) { - queue[pushIdx] = node.quad1; - queueLength += 1; - pushIdx += 1; - } - if (node.quad2) { - queue[pushIdx] = node.quad2; - queueLength += 1; - pushIdx += 1; - } - if (node.quad3) { - queue[pushIdx] = node.quad3; - queueLength += 1; - pushIdx += 1; - } + if (node.quad1) { + queue[pushIdx] = node.quad1; + queueLength += 1; + pushIdx += 1; + } + if (node.quad2) { + queue[pushIdx] = node.quad2; + queueLength += 1; + pushIdx += 1; + } + if (node.quad3) { + queue[pushIdx] = node.quad3; + queueLength += 1; + pushIdx += 1; } } } + } - sourceBody.force.x += fx; - sourceBody.force.y += fy; - }, + sourceBody.force.x += fx; + sourceBody.force.y += fy; + } - insertBodies = function(bodies) { - var x1 = Number.MAX_VALUE, - y1 = Number.MAX_VALUE, - x2 = Number.MIN_VALUE, - y2 = Number.MIN_VALUE, - i, - max = bodies.length; + function insertBodies(bodies) { + var x1 = Number.MAX_VALUE, + y1 = Number.MAX_VALUE, + x2 = Number.MIN_VALUE, + y2 = Number.MIN_VALUE, + i, + max = bodies.length; - // To reduce quad tree depth we are looking for exact bounding box of all particles. - i = max; - while (i--) { - var x = bodies[i].pos.x; - var y = bodies[i].pos.y; - if (x < x1) { - x1 = x; - } - if (x > x2) { - x2 = x; - } - if (y < y1) { - y1 = y; - } - if (y > y2) { - y2 = y; - } + // To reduce quad tree depth we are looking for exact bounding box of all particles. + i = max; + while (i--) { + var x = bodies[i].pos.x; + var y = bodies[i].pos.y; + if (x < x1) { + x1 = x; } - - // Squarify the bounds. - var dx = x2 - x1, - dy = y2 - y1; - if (dx > dy) { - y2 = y1 + dx; - } else { - x2 = x1 + dy; + if (x > x2) { + x2 = x; } - - currentInCache = 0; - root = newNode(); - root.left = x1; - root.right = x2; - root.top = y1; - root.bottom = y2; - - i = max - 1; - if (i > 0) { - root.body = bodies[i]; + if (y < y1) { + y1 = y; } - while (i--) { - insert(bodies[i], root); + if (y > y2) { + y2 = y; } - }; + } - return { - insertBodies: insertBodies, - updateBodyForce: update, - options: function(newOptions) { - if (newOptions) { - if (typeof newOptions.gravity === 'number') { - gravity = newOptions.gravity; + // Squarify the bounds. + var dx = x2 - x1, + dy = y2 - y1; + if (dx > dy) { + y2 = y1 + dx; + } else { + x2 = x1 + dy; + } + + currentInCache = 0; + root = newNode(); + root.left = x1; + root.right = x2; + root.top = y1; + root.bottom = y2; + + i = max - 1; + if (i >= 0) { + root.body = bodies[i]; + } + while (i--) { + insert(bodies[i], root); + } + } + + function insert(newBody) { + insertStack.reset(); + insertStack.push(root, newBody); + + while (!insertStack.isEmpty()) { + var stackItem = insertStack.pop(), + node = stackItem.node, + body = stackItem.body; + + if (!node.body) { + // This is internal node. Update the total mass of the node and center-of-mass. + var x = body.pos.x; + var y = body.pos.y; + node.mass = node.mass + body.mass; + node.massX = node.massX + body.mass * x; + node.massY = node.massY + body.mass * y; + + // Recursively insert the body in the appropriate quadrant. + // But first find the appropriate quadrant. + var quadIdx = 0, // Assume we are in the 0's quad. + left = node.left, + right = (node.right + left) / 2, + top = node.top, + bottom = (node.bottom + top) / 2; + + if (x > right) { // somewhere in the eastern part. + quadIdx = quadIdx + 1; + left = right; + right = node.right; } - if (typeof newOptions.theta === 'number') { - theta = newOptions.theta; + if (y > bottom) { // and in south. + quadIdx = quadIdx + 2; + top = bottom; + bottom = node.bottom; } - return this; + var child = getChild(node, quadIdx); + if (!child) { + // The node is internal but this quadrant is not taken. Add + // subnode to it. + child = newNode(); + child.left = left; + child.top = top; + child.right = right; + child.bottom = bottom; + child.body = body; + + setChild(node, quadIdx, child); + } else { + // continue searching in this quadrant. + insertStack.push(child, body); + } + } else { + // We are trying to add to the leaf node. + // We have to convert current leaf into internal node + // and continue adding two nodes. + var oldBody = node.body; + node.body = null; // internal nodes do not cary bodies + + if (isSamePosition(oldBody.pos, body.pos)) { + // Prevent infinite subdivision by bumping one node + // anywhere in this quadrant + var retriesCount = 3; + do { + var offset = random.nextDouble(); + var dx = (node.right - node.left) * offset; + var dy = (node.bottom - node.top) * offset; + + oldBody.pos.x = node.left + dx; + oldBody.pos.y = node.top + dy; + retriesCount -= 1; + // Make sure we don't bump it out of the box. If we do, next iteration should fix it + } while (retriesCount > 0 && isSamePosition(oldBody.pos, body.pos)); + + if (retriesCount === 0 && isSamePosition(oldBody.pos, body.pos)) { + // This is very bad, we ran out of precision. + // if we do not return from the method we'll get into + // infinite loop here. So we sacrifice correctness of layout, and keep the app running + // Next layout iteration should get larger bounding box in the first step and fix this + return; + } + } + // Next iteration should subdivide node further. + insertStack.push(node, oldBody); + insertStack.push(node, body); } - - return { - gravity: gravity, - theta: theta - }; } - }; + } }; function getChild(node, idx) { diff --git a/dist/vivagraph.min.js b/dist/vivagraph.min.js index b926426..c84b0b7 100644 --- a/dist/vivagraph.min.js +++ b/dist/vivagraph.min.js @@ -1,2 +1,2 @@ -!function(e){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=e();else if("function"==typeof define&&define.amd)define([],e);else{var n;"undefined"!=typeof window?n=window:"undefined"!=typeof global?n=global:"undefined"!=typeof self&&(n=self),n.Viva=e()}}(function(){return function e(n,t,r){function o(a,u){if(!t[a]){if(!n[a]){var s="function"==typeof require&&require;if(!u&&s)return s(a,!0);if(i)return i(a,!0);var f=new Error("Cannot find module '"+a+"'");throw f.code="MODULE_NOT_FOUND",f}var c=t[a]={exports:{}};n[a][0].call(c.exports,function(e){var t=n[a][1][e];return o(t?t:e)},c,c.exports,e,n,t,r)}return t[a].exports}for(var i="function"==typeof require&&require,a=0;a=0==m>=4?null:(f=u-i,d=o-a,p=a*i-o*u,v=f*e+d*n+p,h=f*t+d*r+p,0!==v&&0!==h&&v>=0==h>=0?null:(y=s*d-f*c,0===y?null:(x=y<0?-y/2:y/2,x=0,w=c*p-d*l,b.x=(w<0?w-x:w+x)/y,w=f*l-s*p,b.y=(w<0?w-x:w+x)/y,b)))}n.exports=r},{}],4:[function(e,n,t){n.exports.degree=e("./src/degree.js"),n.exports.betweenness=e("./src/betweenness.js")},{"./src/betweenness.js":5,"./src/degree.js":6}],5:[function(e,n,t){function r(e,n){function t(e){h[e]/=2}function r(e){h[e.id]=0}function o(e){s=e.id,u(s),i()}function i(){for(e.forEachNode(a);c.length;){for(var n=c.pop(),t=(1+v[n])/p[n],r=d[n],o=0;o1&&(o=Array.prototype.splice.call(arguments,1));for(var i=0;i0&&o.addLink(i,t-1+r*e),r>0&&o.addLink(i,t+(r-1)*e)}return o}function f(e,n,t){if(e<1||n<1||t<1)throw new Error("Invalid number of nodes in grid3 graph");var r,o,i,a=p();if(1===e&&1===n&&1===t)return a.addNode(0),a;for(i=0;i0&&a.addLink(s,r-1+o*e+u),o>0&&a.addLink(s,r+(o-1)*e+u),i>0&&a.addLink(s,r+o*e+(i-1)*e*n)}return a}function c(e){if(e<0)throw new Error("Invalid number of nodes in balanced tree");var n,t=p(),r=Math.pow(2,e);for(0===e&&t.addNode(1),n=1;n= 0");var n,t=p();for(n=0;n=n)throw new Error("Choose smaller `k`. It cannot be larger than number of nodes `n`");var i,a,u=e("ngraph.random").random(o||42),s=p();for(i=0;i=0&&t.links.splice(n,1)),r&&(n=o(e,r.links),n>=0&&r.links.splice(n,1)),U(e,"remove"),F(),!0}function g(e,n){var t,r=f(e);if(!r)return null;for(t=0;t0&&(O.fire("changed",M),M.length=0)}function P(){return Object.keys?k:A}function k(e){if("function"==typeof e)for(var n=Object.keys(j),t=0;t=0?i:-1,o);return p.push(a),a},removeSpring:function(e){if(e){var n=p.indexOf(e);return n>-1?(p.splice(n,1),!0):void 0}},getBestNewBodyPosition:function(e){return h.getBestNewPosition(e)},getBBox:function(){return h.box},gravity:function(e){return void 0!==e?(n.gravity=e,v.options({gravity:e}),this):n.gravity},theta:function(e){return void 0!==e?(n.theta=e,v.options({theta:e}),this):n.theta}};return o(n,y),y}n.exports=r},{"./lib/bounds":16,"./lib/createBody":17,"./lib/dragForce":18,"./lib/eulerIntegrator":19,"./lib/spring":20,"./lib/springForce":21,"ngraph.expose":8,"ngraph.merge":13,"ngraph.quadtreebh":22}],16:[function(e,n,t){n.exports=function(n,t){function r(){var e=n.length;if(0!==e){for(var t=Number.MAX_VALUE,r=Number.MAX_VALUE,o=Number.MIN_VALUE,a=Number.MIN_VALUE;e--;){var u=n[e];u.isPinned?(u.pos.x=u.prevPos.x,u.pos.y=u.prevPos.y):(u.prevPos.x=u.pos.x,u.prevPos.y=u.pos.y),u.pos.xo&&(o=u.pos.x),u.pos.ya&&(a=u.pos.y)}i.x1=t,i.x2=o,i.y1=r,i.y2=a}}var o=e("ngraph.random").random(42),i={x1:0,y1:0,x2:0,y2:0};return{box:i,update:r,reset:function(){i.x1=i.y1=0,i.x2=i.y2=0},getBestNewPosition:function(e){var n=i,r=0,a=0;if(e.length){for(var u=0;u1&&(s.velocity.x=c/l,s.velocity.y=d/l),r=n*s.velocity.x,i=n*s.velocity.y,s.pos.x+=r,s.pos.y+=i,o+=Math.abs(r),a+=Math.abs(i)}return(o*o+a*a)/e.length}n.exports=r},{}],20:[function(e,n,t){function r(e,n,t,r,o){this.from=e,this.to=n,this.length=t,this.coeff=r,this.weight="number"==typeof o?o:1}n.exports=r},{}],21:[function(e,n,t){n.exports=function(n){var t=e("ngraph.merge"),r=e("ngraph.random").random(42),o=e("ngraph.expose");n=t(n,{springCoeff:2e-4,springLength:80});var i={update:function(e){var t=e.from,o=e.to,i=e.length<0?n.springLength:e.length,a=o.pos.x-t.pos.x,u=o.pos.y-t.pos.y,s=Math.sqrt(a*a+u*u);0===s&&(a=(r.nextDouble()-.5)/50,u=(r.nextDouble()-.5)/50,s=Math.sqrt(a*a+u*u));var f=s-i,c=(!e.coeff||e.coeff<0?n.springCoeff:e.coeff)*f/s*e.weight;t.force.x+=c*a,t.force.y+=c*u,o.force.x-=c*a,o.force.y-=c*u}};return o(n,i,["springCoeff","springLength"]),i}},{"ngraph.expose":8,"ngraph.merge":13,"ngraph.random":26}],22:[function(e,n,t){function r(e,n){return 0===n?e.quad0:1===n?e.quad1:2===n?e.quad2:3===n?e.quad3:null}function o(e,n,t){0===n?e.quad0=t:1===n?e.quad1=t:2===n?e.quad2=t:3===n&&(e.quad3=t)}n.exports=function(n){n=n||{},n.gravity="number"==typeof n.gravity?n.gravity:-1,n.theta="number"==typeof n.theta?n.theta:.8;var t=e("ngraph.random").random(1984),i=e("./node"),a=e("./insertStack"),u=e("./isSamePosition"),s=n.gravity,f=[],c=new a,d=n.theta,l=[],p=0,v=function(){var e=l[p];return e?(e.quad0=null,e.quad1=null,e.quad2=null,e.quad3=null,e.body=null,e.mass=e.massX=e.massY=0,e.left=e.right=e.top=e.bottom=0):(e=new i,l[p]=e),++p,e},h=v(),g=function(e){for(c.reset(),c.push(h,e);!c.isEmpty();){var n=c.pop(),i=n.node,a=n.body;if(i.body){var s=i.body;if(i.body=null,u(s.pos,a.pos)){var f=3;do{var d=t.nextDouble(),l=(i.right-i.left)*d,p=(i.bottom-i.top)*d;s.pos.x=i.left+l,s.pos.y=i.top+p,f-=1}while(f>0&&u(s.pos,a.pos));if(0===f&&u(s.pos,a.pos))return}c.push(i,s),c.push(i,a)}else{var g=a.pos.x,m=a.pos.y;i.mass=i.mass+a.mass,i.massX=i.massX+a.mass*g,i.massY=i.massY+a.mass*m;var y=0,x=i.left,w=(i.right+x)/2,b=i.top,E=(i.bottom+b)/2;if(g>w){y+=1;var L=x;x=w,w+=w-L}if(m>E){y+=2;var N=b;b=E,E+=E-N}var P=r(i,y);P?c.push(P,a):(P=v(),P.left=x,P.top=b,P.right=w,P.bottom=E,P.body=a,o(i,y,P))}}},m=function(e){var n,r,o,i,a=f,u=0,c=0,l=1,p=0,v=1;for(a[0]=h;l;){var g=a[p],m=g.body;l-=1,p+=1;var y=m!==e;m&&y?(r=m.pos.x-e.pos.x,o=m.pos.y-e.pos.y,i=Math.sqrt(r*r+o*o),0===i&&(r=(t.nextDouble()-.5)/50,o=(t.nextDouble()-.5)/50,i=Math.sqrt(r*r+o*o)),n=s*m.mass*e.mass/(i*i*i),u+=n*r,c+=n*o):y&&(r=g.massX/g.mass-e.pos.x,o=g.massY/g.mass-e.pos.y,i=Math.sqrt(r*r+o*o),0===i&&(r=(t.nextDouble()-.5)/50,o=(t.nextDouble()-.5)/50,i=Math.sqrt(r*r+o*o)),(g.right-g.left)/io&&(o=u),si&&(i=s)}var f=o-t,c=i-r;for(f>c?i=r+f:o=t+c,p=0,h=v(),h.left=t,h.right=o,h.top=r,h.bottom=i,n=a-1,n>0&&(h.body=e[n]);n--;)g(e[n],h)};return{insertBodies:y,updateBodyForce:m,options:function(e){return e?("number"==typeof e.gravity&&(s=e.gravity),"number"==typeof e.theta&&(d=e.theta),this):{gravity:s,theta:d}}}}},{"./insertStack":23,"./isSamePosition":24,"./node":25,"ngraph.random":26}],23:[function(e,n,t){function r(){this.stack=[],this.popIdx=0}function o(e,n){this.node=e,this.body=n}n.exports=r,r.prototype={isEmpty:function(){return 0===this.popIdx},push:function(e,n){var t=this.stack[this.popIdx];t?(t.node=e,t.body=n):this.stack[this.popIdx]=new o(e,n),++this.popIdx},pop:function(){if(this.popIdx>0)return this.stack[--this.popIdx]},reset:function(){this.popIdx=0}}},{}],24:[function(e,n,t){n.exports=function(e,n){var t=Math.abs(e.x-n.x),r=Math.abs(e.y-n.y);return t<1e-8&&r<1e-8}},{}],25:[function(e,n,t){n.exports=function(){this.body=null,this.quad0=null,this.quad1=null,this.quad2=null,this.quad3=null,this.mass=0,this.massX=0,this.massY=0,this.left=0,this.top=0,this.bottom=0,this.right=0}},{}],26:[function(e,n,t){function r(e){var n="number"==typeof e?e:+new Date,t=function(){return n=n+2127912214+(n<<12)&4294967295,n=4294967295&(3345072700^n^n>>>19),n=n+374761393+(n<<5)&4294967295,n=4294967295&(n+3550635116^n<<9),n=n+4251993797+(n<<3)&4294967295,n=4294967295&(3042594569^n^n>>>16),(268435455&n)/268435456};return{next:function(e){return Math.floor(t()*e)},nextDouble:function(){return t()}}}function o(e,n){var t=n||r();if("function"!=typeof t.next)throw new Error("customRandom does not match expected API: next() function is missing");return{forEach:function(n){var r,o,i;for(r=e.length-1;r>0;--r)o=t.next(r+1),i=e[o],e[o]=e[r],e[r]=i,n(i);e.length&&n(e[0])},shuffle:function(){var n,r,o;for(n=e.length-1;n>0;--n)r=t.next(n+1),o=e[r],e[r]=e[n],e[n]=o;return e}}}n.exports={random:r,randomIterator:o}},{}],27:[function(e,n,t){function r(e,n,t){function r(e){u.nodes.push(s(e))}function o(e){u.links.push(f(e))}function i(e){var n={id:e.id};return void 0!==e.data&&(n.data=e.data),n}function a(e){var n={fromId:e.fromId,toId:e.toId};return void 0!==e.data&&(n.data=e.data),n}var u={nodes:[],links:[]},s=n||i,f=t||a;return e.forEachNode(r),e.forEachLink(o),JSON.stringify(u)}n.exports=r},{}],28:[function(e,n,t){function r(e,n){var t=o(e);if(void 0===n)return t;for(var r=Object.keys(n),i=0;iv&&(r=1),u(e,r,{x:e.touches[0].clientX,y:e.touches[0].clientY}),v=t,m(e),y(e)}},A=function(e){p=!1,o.off("touchmove",k),o.off("touchend",A),o.off("touchcancel",A),c=null,r&&r(e)},j=function(e,t){m(e),y(e),d=t.clientX,l=t.clientY,c=e.target||e.srcElement,n&&n(e,{x:d,y:l}),p||(p=!0,o.on("touchmove",k),o.on("touchend",A),o.on("touchcancel",A))},_=function(e){return 1===e.touches.length?j(e,e.touches[0]):void(2===e.touches.length&&(m(e),y(e),v=P(e.touches[0],e.touches[1])))};return e.addEventListener("mousedown",b),e.addEventListener("touchstart",_),{onStart:function(e){return n=e,this},onDrag:function(e){return t=e,this},onStop:function(e){return r=e,this},onScroll:function(e){return N(e),this},release:function(){e.removeEventListener("mousedown",b),e.removeEventListener("touchstart",_), -o.off("mousemove",w),o.off("mouseup",E),o.off("touchmove",k),o.off("touchend",A),o.off("touchcancel",A),N(null)}}}n.exports=r;var o=e("../Utils/documentEvents.js"),i=e("../Utils/browserInfo.js"),a=e("../Utils/findElementPosition.js")},{"../Utils/browserInfo.js":39,"../Utils/documentEvents.js":40,"../Utils/findElementPosition.js":41}],36:[function(e,n,t){function r(e,n){var t=o(n),r=null,i={},a={x:0,y:0};return t.mouseDown(function(e,n){r=e,a.x=n.clientX,a.y=n.clientY,t.mouseCapture(r);var o=i[e.id];return o&&o.onStart&&o.onStart(n,a),!0}).mouseUp(function(e){t.releaseMouseCapture(r),r=null;var n=i[e.id];return n&&n.onStop&&n.onStop(),!0}).mouseMove(function(e,n){if(r){var t=i[r.id];return t&&t.onDrag&&t.onDrag(n,{x:n.clientX-a.x,y:n.clientY-a.y}),a.x=n.clientX,a.y=n.clientY,!0}}),{bindDragNDrop:function(e,n){i[e.id]=n,n||delete i[e.id]}}}n.exports=r;var o=e("../WebGL/webglInputEvents.js")},{"../WebGL/webglInputEvents.js":57}],37:[function(e,n,t){function r(e,n){function t(e){return d[e]}n=o(n,{maxX:1024,maxY:1024,seed:"Deterministic randomness made me do this"});var r=i(n.seed),u=new a(Number.MAX_VALUE,Number.MAX_VALUE,Number.MIN_VALUE,Number.MIN_VALUE),s={},f=function(e){return{x:r.next(n.maxX),y:r.next(n.maxY)}},c=function(e,n){e.xn.x2&&(n.x2=e.x),e.yn.y2&&(n.y2=e.y)},d="function"==typeof Object.create?Object.create(null):{},l=function(e){d[e.id]=f(e),c(d[e.id],u)},p=function(){0!==e.getNodesCount()&&(u.x1=Number.MAX_VALUE,u.y1=Number.MAX_VALUE,u.x2=Number.MIN_VALUE,u.y2=Number.MIN_VALUE,e.forEachNode(l))},v=function(e){s[e.id]=e},h=function(e){for(var n=0;n=0:"boolean"!=typeof z||z}function r(){G=G||window.document.body,F=F||i(e,{springLength:80,springCoeff:2e-4}),O=O||a(e,{container:G}),n.hasOwnProperty("renderLinks")||(n.renderLinks=!0),n.prerender=n.prerender||0,U=(O.inputManager||s)(e,O)}function l(){O.beginRender(),n.renderLinks&&O.renderLinks(),O.renderNodes(),O.endRender()}function p(){return W=F.step()&&!H,l(),!W}function v(e){return R?void(V+=e):void(e?(V+=e,R=f(function(){return p()},M)):(X=0,V=0,R=f(p,M)))}function h(){J||(W=!1,R.restart())}function g(){if("number"==typeof n.prerender&&n.prerender>0)for(var e=0;e0?n.insertBefore(r,n.firstChild):n.appendChild(r),r},releaseLink:function(e){var t=d[e.id];t&&(n.removeChild(t),delete d[e.id])},addNode:function(e,t){var r=l(e);if(r)return r.position=t,r.node=e,c[e.id]=r,n.appendChild(r),r},releaseNode:function(e){var t=c[e.id];t&&(n.removeChild(t),delete c[e.id])},renderNodes:function(){for(var e in c)if(c.hasOwnProperty(e)){var n=c[e];m.x=n.position.x,m.y=n.position.y,p(n,m,n.node)}},renderLinks:function(){for(var e in d)if(d.hasOwnProperty(e)){var n=d[e];y.x=n.position.from.x,y.y=n.position.from.y,x.x=n.position.to.x,x.y=n.position.to.y,h(n,y,x,n.link)}},getGraphicsRoot:function(e){return"function"==typeof e&&(t?e(t):r=e),t},getSvgRoot:function(){return t}};return i(b),b}n.exports=r;var o=e("simplesvg"),i=e("ngraph.events"),a=e("../Input/domInputManager.js")},{"../Input/domInputManager.js":34,"ngraph.events":7,simplesvg:28}],50:[function(e,n,t){function r(e){e=c(e,{enableBlending:!0,preserveDrawingBuffer:!1,clearColor:!1,clearColorValue:{r:1,g:1,b:1,a:1}});var n,t,r,d,l,p,v,h,g=0,m=0,y=[1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1],x=[],w=[],b={},E={},L=i(),N=a(),P=function(e){return u()},k=function(e){return s(3014898687)},A=function(){L.updateTransform(y),N.updateTransform(y)},j=function(){y=[1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1]},_=function(){n&&t&&(d=t.width=Math.max(n.offsetWidth,1),l=t.height=Math.max(n.offsetHeight,1),r&&r.viewport(0,0,d,l),L&&L.updateSize(d/2,l/2),N&&N.updateSize(d/2,l/2))},I=function(e){e.fire("rescaled")};t=window.document.createElement("canvas");var T={getLinkUI:function(e){return E[e]},getNodeUI:function(e){return b[e]},node:function(e){if("function"==typeof e)return P=e,this},link:function(e){if("function"==typeof e)return k=e,this},placeNode:function(e){return p=e,this},placeLink:function(e){return v=e,this},inputManager:o,beginRender:function(){},endRender:function(){m>0&&L.render(),g>0&&N.render()},bringLinkToFront:function(e){var n,t,r=L.getFrontLinkId();L.bringToFront(e),r>e.id&&(n=e.id,t=w[r],w[r]=w[n],w[r].id=r,w[n]=t,w[n].id=n)},graphCenterChanged:function(e,n){y[12]=2*e/d-1,y[13]=1-2*n/l,A()},addLink:function(e,n){var t=m++,r=k(e);return r.id=t,r.pos=n,L.createLink(r),w[t]=r,E[e.id]=r,r},addNode:function(e,n){var t=g++,r=P(e);return r.id=t,r.position=n,r.node=e,N.createNode(r),x[t]=r,b[e.id]=r,r},translateRel:function(e,n){y[12]+=2*y[0]*e/d/y[0],y[13]-=2*y[5]*n/l/y[5],A()},scale:function(e,n){var t=2*n.x/d-1,r=1-2*n.y/l;return t-=y[12],r-=y[13],y[12]+=t*(1-e),y[13]+=r*(1-e),y[0]*=e,y[5]*=e,A(),I(this),y[0]},resetScale:function(){return j(),r&&(_(),A()),this},init:function(o){var i={};if(e.preserveDrawingBuffer&&(i.preserveDrawingBuffer=!0),n=o,_(),j(),n.appendChild(t),r=t.getContext("experimental-webgl",i),!r){var a="Could not initialize WebGL. Seems like the browser doesn't support it.";throw window.alert(a),a}if(e.enableBlending&&(r.blendFunc(r.SRC_ALPHA,r.ONE_MINUS_SRC_ALPHA),r.enable(r.BLEND)),e.clearColor){var u=e.clearColorValue;r.clearColor(u.r,u.g,u.b,u.a),this.beginRender=function(){r.clear(r.COLOR_BUFFER_BIT)}}L.load(r),L.updateSize(d/2,l/2),N.load(r),N.updateSize(d/2,l/2),A(),"function"==typeof h&&h(t)},release:function(e){t&&e&&e.removeChild(t)},isSupported:function(){var e=window.document.createElement("canvas"),n=e&&e.getContext&&e.getContext("experimental-webgl");return n},releaseLink:function(e){m>0&&(m-=1);var n=E[e.id];delete E[e.id],L.removeLink(n);var t=n.id;if(t0&&(g-=1);var n=b[e.id];delete b[e.id],N.removeNode(n);var t=n.id;if(te.length){var r=new Float32Array(e.length*t*2);return r.set(e),r}return e}function a(n,t){for(var r={},o=0;o=w.length&&s();var i=w[r.textureNumber];i.ctx.drawImage(n,r.col*g,r.row*g,g,g),b[e]=n.src,y[n.src]=o,i.isDirty=!0,t(o)}function c(n){var t=n/e<<0,r=n%e,o=r/h<<0,i=r%h;return{textureNumber:t,row:o,col:i}}function d(){E.isDirty=!0,x=0,v=null}function l(){v&&(window.clearTimeout(v),x+=1,v=null),x>10?d():v=window.setTimeout(d,400)}function p(e,n){var t=w[e.textureNumber].canvas,r=w[n.textureNumber].ctx,o=n.col*g,i=n.row*g;r.drawImage(t,e.col*g,e.row*g,g,g,o,i,g,g),w[e.textureNumber].isDirty=!0,w[n.textureNumber].isDirty=!0}var v,h=Math.sqrt(e||1024)<<0,g=h,m=1,y={},x=0,w=[],b=[];if(!o(e))throw"Tiles per texture should be power of two.";var E={isDirty:!1,clearDirty:n,remove:t,getTextures:r,getCoordinates:a,load:u};return E}function o(e){return 0===(e&e-1)}var i=e("./texture.js");n.exports=r},{"./texture.js":52}],55:[function(e,n,t){function r(e,n){return{_texture:0,_offset:0,size:"number"==typeof e?e:32,src:n}}n.exports=r},{}],56:[function(e,n,t){function r(){function e(e,n){e.nativeObject&&g.deleteTexture(e.nativeObject);var t=g.createTexture();g.activeTexture(g["TEXTURE"+n]),g.bindTexture(g.TEXTURE_2D,t),g.texImage2D(g.TEXTURE_2D,0,g.RGBA,g.RGBA,g.UNSIGNED_BYTE,e.canvas),g.texParameteri(g.TEXTURE_2D,g.TEXTURE_MAG_FILTER,g.LINEAR),g.texParameteri(g.TEXTURE_2D,g.TEXTURE_MIN_FILTER,g.LINEAR_MIPMAP_NEAREST),g.generateMipmap(g.TEXTURE_2D),g.uniform1i(x["sampler"+n],n),e.nativeObject=t}function n(){if(v.isDirty){var n,t=v.getTextures();for(n=0;n0&&(j-=1),e.id0&&(e.src&&v.remove(e.src),y.copyArrayPart(_,e.id*N,j*N,N))}function c(e,n){n._offset=e._offset}function d(e){L=!0,E=e}function l(e,n){w=e,b=n,L=!0}function p(){g.useProgram(h),g.bindBuffer(g.ARRAY_BUFFER,m),g.bufferData(g.ARRAY_BUFFER,_,g.DYNAMIC_DRAW),L&&(L=!1,g.uniformMatrix4fv(x.transform,!1,E),g.uniform2f(x.screenSize,w,b)),g.vertexAttribPointer(x.vertexPos,2,g.FLOAT,!1,3*Float32Array.BYTES_PER_ELEMENT,0),g.vertexAttribPointer(x.customAttributes,1,g.FLOAT,!1,3*Float32Array.BYTES_PER_ELEMENT,8),n(),g.drawArrays(g.TRIANGLES,0,6*j)}var v,h,g,m,y,x,w,b,E,L,N=18,P=o(),k=i(),A=1024,j=0,_=new Float32Array(64);return{load:t,position:r,createNode:s,removeNode:f,replaceProperties:c,updateTransform:d,updateSize:l,render:p}}function o(){return["precision mediump float;","varying vec4 color;","varying vec3 vTextureCoord;","uniform sampler2D u_sampler0;","uniform sampler2D u_sampler1;","uniform sampler2D u_sampler2;","uniform sampler2D u_sampler3;","void main(void) {"," if (vTextureCoord.z == 0.) {"," gl_FragColor = texture2D(u_sampler0, vTextureCoord.xy);"," } else if (vTextureCoord.z == 1.) {"," gl_FragColor = texture2D(u_sampler1, vTextureCoord.xy);"," } else if (vTextureCoord.z == 2.) {"," gl_FragColor = texture2D(u_sampler2, vTextureCoord.xy);"," } else if (vTextureCoord.z == 3.) {"," gl_FragColor = texture2D(u_sampler3, vTextureCoord.xy);"," } else { gl_FragColor = vec4(0, 1, 0, 1); }","}"].join("\n")}function i(){return["attribute vec2 a_vertexPos;","attribute float a_customAttributes;","uniform vec2 u_screenSize;","uniform mat4 u_transform;","uniform float u_tilesPerTexture;","varying vec3 vTextureCoord;","void main(void) {"," gl_Position = u_transform * vec4(a_vertexPos/u_screenSize, 0, 1);","float corner = mod(a_customAttributes, 4.);","float tileIndex = mod(floor(a_customAttributes / 4.), u_tilesPerTexture);","float tilesPerRow = sqrt(u_tilesPerTexture);","float tileSize = 1./tilesPerRow;","float tileColumn = mod(tileIndex, tilesPerRow);","float tileRow = floor(tileIndex/tilesPerRow);","if(corner == 0.0) {"," vTextureCoord.xy = vec2(0, 1);","} else if(corner == 1.0) {"," vTextureCoord.xy = vec2(1, 1);","} else if(corner == 2.0) {"," vTextureCoord.xy = vec2(0, 0);","} else {"," vTextureCoord.xy = vec2(1, 0);","}","vTextureCoord *= tileSize;","vTextureCoord.x += tileColumn * tileSize;","vTextureCoord.y += tileRow * tileSize;","vTextureCoord.z = floor(floor(a_customAttributes / 4.)/u_tilesPerTexture);","}"].join("\n")}var a=e("./webglAtlas.js"),u=e("./webgl.js");n.exports=r},{"./webgl.js":53,"./webglAtlas.js":54}],57:[function(e,n,t){function r(e){function n(){x=null}function t(e){x=e}function r(e){return"function"==typeof e&&k.push(e),j}function i(e){return"function"==typeof e&&P.push(e),j}function a(e){return"function"==typeof e&&N.push(e),j}function u(e){return"function"==typeof e&&L.push(e),j}function s(e){return"function"==typeof e&&E.push(e),j}function f(e){return"function"==typeof e&&b.push(e),j}function c(e){return"function"==typeof e&&w.push(e),j}function d(e,n,t){if(e&&e.size){var r=e.position,o=e.size;return r.x-og.byteLength){var e=new ArrayBuffer(2*g.byteLength),n=new Float32Array(e),t=new Uint32Array(e);t.set(y),m=n,y=t,g=e}};return{load:function(a){n=a,r=o(a),e=r.createProgram(v,p),n.useProgram(e),i=r.getLocations(e,["a_vertexPos","a_color","u_screenSize","u_transform"]),n.enableVertexAttribArray(i.vertexPos),n.enableVertexAttribArray(i.color),t=n.createBuffer()},position:function(e,n,t){var r=e.id,o=r*d;m[o]=n.x,m[o+1]=n.y,y[o+2]=e.color,m[o+3]=t.x,m[o+4]=t.y,y[o+5]=e.color},createLink:function(e){x(),h+=1,a=e.id},removeLink:function(e){h>0&&(h-=1),e.id0&&r.copyArrayPart(y,e.id*d,h*d,d)},updateTransform:function(e){c=!0,f=e},updateSize:function(e,n){u=e,s=n,c=!0},render:function(){n.useProgram(e),n.bindBuffer(n.ARRAY_BUFFER,t),n.bufferData(n.ARRAY_BUFFER,g,n.DYNAMIC_DRAW),c&&(c=!1,n.uniformMatrix4fv(i.transform,!1,f),n.uniform2f(i.screenSize,u,s)),n.vertexAttribPointer(i.vertexPos,2,n.FLOAT,!1,3*Float32Array.BYTES_PER_ELEMENT,0),n.vertexAttribPointer(i.color,4,n.UNSIGNED_BYTE,!0,3*Float32Array.BYTES_PER_ELEMENT,8),n.drawArrays(n.LINES,0,2*h),a=h-1},bringToFront:function(e){a>e.id&&r.swapArrayPart(m,e.id*d,a*d,d),a>0&&(a-=1)},getFrontLinkId:function(){return a}}}var o=e("./webgl.js");n.exports=r},{"./webgl.js":53}],60:[function(e,n,t){function r(){function e(){if((k+1)*w>=L.byteLength){var e=new ArrayBuffer(2*L.byteLength),n=new Float32Array(e),t=new Uint32Array(e);t.set(P),N=n,P=t,L=e}}function n(e){d=e,v=o(e),c=v.createProgram(E,b),d.useProgram(c),p=v.getLocations(c,["a_vertexPos","a_color","u_screenSize","u_transform"]),d.enableVertexAttribArray(p.vertexPos),d.enableVertexAttribArray(p.color),l=d.createBuffer()}function t(e,n){var t=e.id;N[t*x]=n.x,N[t*x+1]=-n.y,N[t*x+2]=e.size,P[t*x+3]=e.color}function r(e){y=!0,m=e}function i(e,n){h=e,g=n,y=!0}function a(e){k>0&&(k-=1),e.id0&&v.copyArrayPart(P,e.id*x,k*x,x)}function u(){e(),k+=1}function s(){}function f(){d.useProgram(c),d.bindBuffer(d.ARRAY_BUFFER,l),d.bufferData(d.ARRAY_BUFFER,L,d.DYNAMIC_DRAW),y&&(y=!1,d.uniformMatrix4fv(p.transform,!1,m),d.uniform2f(p.screenSize,h,g)),d.vertexAttribPointer(p.vertexPos,3,d.FLOAT,!1,x*Float32Array.BYTES_PER_ELEMENT,0),d.vertexAttribPointer(p.color,4,d.UNSIGNED_BYTE,!0,x*Float32Array.BYTES_PER_ELEMENT,12),d.drawArrays(d.POINTS,0,k)}var c,d,l,p,v,h,g,m,y,x=4,w=3*Float32Array.BYTES_PER_ELEMENT+Uint32Array.BYTES_PER_ELEMENT,b=["precision mediump float;","varying vec4 color;","void main(void) {"," gl_FragColor = color;","}"].join("\n"),E=["attribute vec3 a_vertexPos;","attribute vec4 a_color;","uniform vec2 u_screenSize;","uniform mat4 u_transform;","varying vec4 color;","void main(void) {"," gl_Position = u_transform * vec4(a_vertexPos.xy/u_screenSize, 0, 1);"," gl_PointSize = a_vertexPos.z * u_transform[0][0];"," color = a_color.abgr;","}"].join("\n"),L=new ArrayBuffer(16*w),N=new Float32Array(L),P=new Uint32Array(L),k=0;return{load:n,position:t,updateTransform:r,updateSize:i,removeNode:a,createNode:u,replaceProperties:s,render:f}}var o=e("./webgl.js");n.exports=r},{"./webgl.js":53}],61:[function(e,n,t){function r(e,n){return{size:"number"==typeof e?e:10,color:o(n)}}var o=e("./parseColor.js");n.exports=r},{"./parseColor.js":51}],62:[function(e,n,t){n.exports="0.8.1"},{}]},{},[1])(1)}); \ No newline at end of file +!function(e){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=e();else if("function"==typeof define&&define.amd)define([],e);else{var n;"undefined"!=typeof window?n=window:"undefined"!=typeof global?n=global:"undefined"!=typeof self&&(n=self),n.Viva=e()}}(function(){return function e(n,t,r){function o(a,u){if(!t[a]){if(!n[a]){var s="function"==typeof require&&require;if(!u&&s)return s(a,!0);if(i)return i(a,!0);var f=new Error("Cannot find module '"+a+"'");throw f.code="MODULE_NOT_FOUND",f}var c=t[a]={exports:{}};n[a][0].call(c.exports,function(e){var t=n[a][1][e];return o(t?t:e)},c,c.exports,e,n,t,r)}return t[a].exports}for(var i="function"==typeof require&&require,a=0;a=0==m>=4?null:(f=u-i,d=o-a,p=a*i-o*u,v=f*e+d*n+p,g=f*t+d*r+p,0!==v&&0!==g&&v>=0==g>=0?null:(y=s*d-f*c,0===y?null:(x=y<0?-y/2:y/2,x=0,w=c*p-d*l,b.x=(w<0?w-x:w+x)/y,w=f*l-s*p,b.y=(w<0?w-x:w+x)/y,b)))}n.exports=r},{}],4:[function(e,n,t){n.exports.degree=e("./src/degree.js"),n.exports.betweenness=e("./src/betweenness.js")},{"./src/betweenness.js":5,"./src/degree.js":6}],5:[function(e,n,t){function r(e,n){function t(e){g[e]/=2}function r(e){g[e.id]=0}function o(e){s=e.id,u(s),i()}function i(){for(e.forEachNode(a);c.length;){for(var n=c.pop(),t=(1+v[n])/p[n],r=d[n],o=0;o1&&(o=Array.prototype.splice.call(arguments,1));for(var i=0;i0&&o.addLink(i,t-1+r*e),r>0&&o.addLink(i,t+(r-1)*e)}return o}function f(e,n,t){if(e<1||n<1||t<1)throw new Error("Invalid number of nodes in grid3 graph");var r,o,i,a=p();if(1===e&&1===n&&1===t)return a.addNode(0),a;for(i=0;i0&&a.addLink(s,r-1+o*e+u),o>0&&a.addLink(s,r+(o-1)*e+u),i>0&&a.addLink(s,r+o*e+(i-1)*e*n)}return a}function c(e){if(e<0)throw new Error("Invalid number of nodes in balanced tree");var n,t=p(),r=Math.pow(2,e);for(0===e&&t.addNode(1),n=1;n= 0");var n,t=p();for(n=0;n=n)throw new Error("Choose smaller `k`. It cannot be larger than number of nodes `n`");var i,a,u=e("ngraph.random").random(o||42),s=p();for(i=0;i=0&&t.links.splice(n,1)),r&&(n=o(e,r.links),n>=0&&r.links.splice(n,1)),U(e,"remove"),F(),!0}function h(e,n){var t,r=f(e);if(!r)return null;for(t=0;t0&&(O.fire("changed",M),M.length=0)}function P(){return Object.keys?k:j}function k(e){if("function"==typeof e)for(var n=Object.keys(A),t=0;t=0?i:-1,o);return v.push(a),a},getTotalMovement:function(){return x},removeSpring:function(e){if(e){var n=v.indexOf(e);return n>-1?(v.splice(n,1),!0):void 0}},getBestNewBodyPosition:function(e){return h.getBestNewPosition(e)},getBBox:function(){return h.box},gravity:function(e){return void 0!==e?(n.gravity=e,g.options({gravity:e}),this):n.gravity},theta:function(e){return void 0!==e?(n.theta=e,g.options({theta:e}),this):n.theta}};return o(n,w),a(w),w}n.exports=r},{"./lib/bounds":16,"./lib/createBody":17,"./lib/dragForce":18,"./lib/eulerIntegrator":19,"./lib/spring":20,"./lib/springForce":21,"ngraph.events":7,"ngraph.expose":8,"ngraph.merge":13,"ngraph.quadtreebh":22}],16:[function(e,n,t){n.exports=function(n,t){function r(){var e=n.length;if(0!==e){for(var t=Number.MAX_VALUE,r=Number.MAX_VALUE,o=Number.MIN_VALUE,a=Number.MIN_VALUE;e--;){var u=n[e];u.isPinned?(u.pos.x=u.prevPos.x,u.pos.y=u.prevPos.y):(u.prevPos.x=u.pos.x,u.prevPos.y=u.pos.y),u.pos.xo&&(o=u.pos.x),u.pos.ya&&(a=u.pos.y)}i.x1=t,i.x2=o,i.y1=r,i.y2=a}}var o=e("ngraph.random").random(42),i={x1:0,y1:0,x2:0,y2:0};return{box:i,update:r,reset:function(){i.x1=i.y1=0,i.x2=i.y2=0},getBestNewPosition:function(e){var n=i,r=0,a=0;if(e.length){for(var u=0;u1&&(s.velocity.x=c/l,s.velocity.y=d/l),r=n*s.velocity.x,i=n*s.velocity.y,s.pos.x+=r,s.pos.y+=i,o+=Math.abs(r),a+=Math.abs(i)}return(o*o+a*a)/u}n.exports=r},{}],20:[function(e,n,t){function r(e,n,t,r,o){this.from=e,this.to=n,this.length=t,this.coeff=r,this.weight="number"==typeof o?o:1}n.exports=r},{}],21:[function(e,n,t){n.exports=function(n){var t=e("ngraph.merge"),r=e("ngraph.random").random(42),o=e("ngraph.expose");n=t(n,{springCoeff:2e-4,springLength:80});var i={update:function(e){var t=e.from,o=e.to,i=e.length<0?n.springLength:e.length,a=o.pos.x-t.pos.x,u=o.pos.y-t.pos.y,s=Math.sqrt(a*a+u*u);0===s&&(a=(r.nextDouble()-.5)/50,u=(r.nextDouble()-.5)/50,s=Math.sqrt(a*a+u*u));var f=s-i,c=(!e.coeff||e.coeff<0?n.springCoeff:e.coeff)*f/s*e.weight;t.force.x+=c*a,t.force.y+=c*u,o.force.x-=c*a,o.force.y-=c*u}};return o(n,i,["springCoeff","springLength"]),i}},{"ngraph.expose":8,"ngraph.merge":13,"ngraph.random":26}],22:[function(e,n,t){function r(e,n){return 0===n?e.quad0:1===n?e.quad1:2===n?e.quad2:3===n?e.quad3:null}function o(e,n,t){0===n?e.quad0=t:1===n?e.quad1=t:2===n?e.quad2=t:3===n&&(e.quad3=t)}n.exports=function(n){function t(){var e=h[m];return e?(e.quad0=null,e.quad1=null,e.quad2=null,e.quad3=null,e.body=null,e.mass=e.massX=e.massY=0,e.left=e.right=e.top=e.bottom=0):(e=new f,h[m]=e),++m,e}function i(e){var n,t,r,o,i=p,a=0,u=0,f=1,c=0,d=1;for(i[0]=y;f;){var v=i[c],h=v.body;f-=1,c+=1;var m=h!==e;h&&m?(t=h.pos.x-e.pos.x,r=h.pos.y-e.pos.y,o=Math.sqrt(t*t+r*r),0===o&&(t=(s.nextDouble()-.5)/50,r=(s.nextDouble()-.5)/50,o=Math.sqrt(t*t+r*r)),n=l*h.mass*e.mass/(o*o*o),a+=n*t,u+=n*r):m&&(t=v.massX/v.mass-e.pos.x,r=v.massY/v.mass-e.pos.y,o=Math.sqrt(t*t+r*r),0===o&&(t=(s.nextDouble()-.5)/50,r=(s.nextDouble()-.5)/50,o=Math.sqrt(t*t+r*r)),(v.right-v.left)/oi&&(i=f),ca&&(a=c)}var d=i-r,l=a-o;for(d>l?a=o+d:i=r+l,m=0,y=t(),y.left=r,y.right=i,y.top=o,y.bottom=a,n=s-1,n>=0&&(y.body=e[n]);n--;)u(e[n],y)}function u(e){for(v.reset(),v.push(y,e);!v.isEmpty();){var n=v.pop(),i=n.node,a=n.body;if(i.body){var u=i.body;if(i.body=null,d(u.pos,a.pos)){var f=3;do{var c=s.nextDouble(),l=(i.right-i.left)*c,p=(i.bottom-i.top)*c;u.pos.x=i.left+l,u.pos.y=i.top+p,f-=1}while(f>0&&d(u.pos,a.pos));if(0===f&&d(u.pos,a.pos))return}v.push(i,u),v.push(i,a)}else{var g=a.pos.x,h=a.pos.y;i.mass=i.mass+a.mass,i.massX=i.massX+a.mass*g,i.massY=i.massY+a.mass*h;var m=0,x=i.left,w=(i.right+x)/2,b=i.top,E=(i.bottom+b)/2;g>w&&(m+=1,x=w,w=i.right),h>E&&(m+=2,b=E,E=i.bottom);var L=r(i,m);L?v.push(L,a):(L=t(),L.left=x,L.top=b,L.right=w,L.bottom=E,L.body=a,o(i,m,L))}}}n=n||{},n.gravity="number"==typeof n.gravity?n.gravity:-1,n.theta="number"==typeof n.theta?n.theta:.8;var s=e("ngraph.random").random(1984),f=e("./node"),c=e("./insertStack"),d=e("./isSamePosition"),l=n.gravity,p=[],v=new c,g=n.theta,h=[],m=0,y=t();return{insertBodies:a,getRoot:function(){return y},updateBodyForce:i,options:function(e){return e?("number"==typeof e.gravity&&(l=e.gravity),"number"==typeof e.theta&&(g=e.theta),this):{gravity:l,theta:g}}}}},{"./insertStack":23,"./isSamePosition":24,"./node":25,"ngraph.random":26}],23:[function(e,n,t){function r(){this.stack=[],this.popIdx=0}function o(e,n){this.node=e,this.body=n}n.exports=r,r.prototype={isEmpty:function(){return 0===this.popIdx},push:function(e,n){var t=this.stack[this.popIdx];t?(t.node=e,t.body=n):this.stack[this.popIdx]=new o(e,n),++this.popIdx},pop:function(){if(this.popIdx>0)return this.stack[--this.popIdx]},reset:function(){this.popIdx=0}}},{}],24:[function(e,n,t){n.exports=function(e,n){var t=Math.abs(e.x-n.x),r=Math.abs(e.y-n.y);return t<1e-8&&r<1e-8}},{}],25:[function(e,n,t){n.exports=function(){this.body=null,this.quad0=null,this.quad1=null,this.quad2=null,this.quad3=null,this.mass=0,this.massX=0,this.massY=0,this.left=0,this.top=0,this.bottom=0,this.right=0}},{}],26:[function(e,n,t){function r(e){var n="number"==typeof e?e:+new Date,t=function(){return n=n+2127912214+(n<<12)&4294967295,n=4294967295&(3345072700^n^n>>>19),n=n+374761393+(n<<5)&4294967295,n=4294967295&(n+3550635116^n<<9),n=n+4251993797+(n<<3)&4294967295,n=4294967295&(3042594569^n^n>>>16),(268435455&n)/268435456};return{next:function(e){return Math.floor(t()*e)},nextDouble:function(){return t()}}}function o(e,n){var t=n||r();if("function"!=typeof t.next)throw new Error("customRandom does not match expected API: next() function is missing");return{forEach:function(n){var r,o,i;for(r=e.length-1;r>0;--r)o=t.next(r+1),i=e[o],e[o]=e[r],e[r]=i,n(i);e.length&&n(e[0])},shuffle:function(){var n,r,o;for(n=e.length-1;n>0;--n)r=t.next(n+1),o=e[r],e[r]=e[n],e[n]=o;return e}}}n.exports={random:r,randomIterator:o}},{}],27:[function(e,n,t){function r(e,n,t){function r(e){u.nodes.push(s(e))}function o(e){u.links.push(f(e))}function i(e){var n={id:e.id};return void 0!==e.data&&(n.data=e.data),n}function a(e){var n={fromId:e.fromId,toId:e.toId};return void 0!==e.data&&(n.data=e.data),n}var u={nodes:[],links:[]},s=n||i,f=t||a;return e.forEachNode(r),e.forEachLink(o),JSON.stringify(u)}n.exports=r},{}],28:[function(e,n,t){function r(e,n){var t=o(e);if(void 0===n)return t;for(var r=Object.keys(n),i=0;iv&&(r=1),u(e,r,{x:e.touches[0].clientX,y:e.touches[0].clientY}),v=t,m(e),y(e)}},j=function(e){p=!1,o.off("touchmove",k),o.off("touchend",j),o.off("touchcancel",j),c=null,r&&r(e)},A=function(e,t){m(e),y(e),d=t.clientX,l=t.clientY,c=e.target||e.srcElement,n&&n(e,{x:d,y:l}),p||(p=!0,o.on("touchmove",k),o.on("touchend",j),o.on("touchcancel",j))},_=function(e){return 1===e.touches.length?A(e,e.touches[0]):void(2===e.touches.length&&(m(e), +y(e),v=P(e.touches[0],e.touches[1])))};return e.addEventListener("mousedown",b),e.addEventListener("touchstart",_),{onStart:function(e){return n=e,this},onDrag:function(e){return t=e,this},onStop:function(e){return r=e,this},onScroll:function(e){return N(e),this},release:function(){e.removeEventListener("mousedown",b),e.removeEventListener("touchstart",_),o.off("mousemove",w),o.off("mouseup",E),o.off("touchmove",k),o.off("touchend",j),o.off("touchcancel",j),N(null)}}}n.exports=r;var o=e("../Utils/documentEvents.js"),i=e("../Utils/browserInfo.js"),a=e("../Utils/findElementPosition.js")},{"../Utils/browserInfo.js":39,"../Utils/documentEvents.js":40,"../Utils/findElementPosition.js":41}],36:[function(e,n,t){function r(e,n){var t=o(n),r=null,i={},a={x:0,y:0};return t.mouseDown(function(e,n){r=e,a.x=n.clientX,a.y=n.clientY,t.mouseCapture(r);var o=i[e.id];return o&&o.onStart&&o.onStart(n,a),!0}).mouseUp(function(e){t.releaseMouseCapture(r),r=null;var n=i[e.id];return n&&n.onStop&&n.onStop(),!0}).mouseMove(function(e,n){if(r){var t=i[r.id];return t&&t.onDrag&&t.onDrag(n,{x:n.clientX-a.x,y:n.clientY-a.y}),a.x=n.clientX,a.y=n.clientY,!0}}),{bindDragNDrop:function(e,n){i[e.id]=n,n||delete i[e.id]}}}n.exports=r;var o=e("../WebGL/webglInputEvents.js")},{"../WebGL/webglInputEvents.js":57}],37:[function(e,n,t){function r(e,n){function t(e){return d[e]}n=o(n,{maxX:1024,maxY:1024,seed:"Deterministic randomness made me do this"});var r=i(n.seed),u=new a(Number.MAX_VALUE,Number.MAX_VALUE,Number.MIN_VALUE,Number.MIN_VALUE),s={},f=function(e){return{x:r.next(n.maxX),y:r.next(n.maxY)}},c=function(e,n){e.xn.x2&&(n.x2=e.x),e.yn.y2&&(n.y2=e.y)},d="function"==typeof Object.create?Object.create(null):{},l=function(e){d[e.id]=f(e),c(d[e.id],u)},p=function(){0!==e.getNodesCount()&&(u.x1=Number.MAX_VALUE,u.y1=Number.MAX_VALUE,u.x2=Number.MIN_VALUE,u.y2=Number.MIN_VALUE,e.forEachNode(l))},v=function(e){s[e.id]=e},g=function(e){for(var n=0;n=0:"boolean"!=typeof z||z}function r(){G=G||window.document.body,F=F||i(e,{springLength:80,springCoeff:2e-4}),O=O||a(e,{container:G}),n.hasOwnProperty("renderLinks")||(n.renderLinks=!0),n.prerender=n.prerender||0,U=(O.inputManager||s)(e,O)}function l(){O.beginRender(),n.renderLinks&&O.renderLinks(),O.renderNodes(),O.endRender()}function p(){return W=F.step()&&!H,l(),!W}function v(e){return R?void(V+=e):void(e?(V+=e,R=f(function(){return p()},M)):(X=0,V=0,R=f(p,M)))}function g(){J||(W=!1,R.restart())}function h(){if("number"==typeof n.prerender&&n.prerender>0)for(var e=0;e0?n.insertBefore(r,n.firstChild):n.appendChild(r),r},releaseLink:function(e){var t=d[e.id];t&&(n.removeChild(t),delete d[e.id])},addNode:function(e,t){var r=l(e);if(r)return r.position=t,r.node=e,c[e.id]=r,n.appendChild(r),r},releaseNode:function(e){var t=c[e.id];t&&(n.removeChild(t),delete c[e.id])},renderNodes:function(){for(var e in c)if(c.hasOwnProperty(e)){var n=c[e];m.x=n.position.x,m.y=n.position.y,p(n,m,n.node)}},renderLinks:function(){for(var e in d)if(d.hasOwnProperty(e)){var n=d[e];y.x=n.position.from.x,y.y=n.position.from.y,x.x=n.position.to.x,x.y=n.position.to.y,g(n,y,x,n.link)}},getGraphicsRoot:function(e){return"function"==typeof e&&(t?e(t):r=e),t},getSvgRoot:function(){return t}};return i(b),b}n.exports=r;var o=e("simplesvg"),i=e("ngraph.events"),a=e("../Input/domInputManager.js")},{"../Input/domInputManager.js":34,"ngraph.events":7,simplesvg:28}],50:[function(e,n,t){function r(e){e=c(e,{enableBlending:!0,preserveDrawingBuffer:!1,clearColor:!1,clearColorValue:{r:1,g:1,b:1,a:1}});var n,t,r,d,l,p,v,g,h=0,m=0,y=[1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1],x=[],w=[],b={},E={},L=i(),N=a(),P=function(e){return u()},k=function(e){return s(3014898687)},j=function(){L.updateTransform(y),N.updateTransform(y)},A=function(){y=[1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1]},_=function(){n&&t&&(d=t.width=Math.max(n.offsetWidth,1),l=t.height=Math.max(n.offsetHeight,1),r&&r.viewport(0,0,d,l),L&&L.updateSize(d/2,l/2),N&&N.updateSize(d/2,l/2))},I=function(e){e.fire("rescaled")};t=window.document.createElement("canvas");var T={getLinkUI:function(e){return E[e]},getNodeUI:function(e){return b[e]},node:function(e){if("function"==typeof e)return P=e,this},link:function(e){if("function"==typeof e)return k=e,this},placeNode:function(e){return p=e,this},placeLink:function(e){return v=e,this},inputManager:o,beginRender:function(){},endRender:function(){m>0&&L.render(),h>0&&N.render()},bringLinkToFront:function(e){var n,t,r=L.getFrontLinkId();L.bringToFront(e),r>e.id&&(n=e.id,t=w[r],w[r]=w[n],w[r].id=r,w[n]=t,w[n].id=n)},graphCenterChanged:function(e,n){y[12]=2*e/d-1,y[13]=1-2*n/l,j()},addLink:function(e,n){var t=m++,r=k(e);return r.id=t,r.pos=n,L.createLink(r),w[t]=r,E[e.id]=r,r},addNode:function(e,n){var t=h++,r=P(e);return r.id=t,r.position=n,r.node=e,N.createNode(r),x[t]=r,b[e.id]=r,r},translateRel:function(e,n){y[12]+=2*y[0]*e/d/y[0],y[13]-=2*y[5]*n/l/y[5],j()},scale:function(e,n){var t=2*n.x/d-1,r=1-2*n.y/l;return t-=y[12],r-=y[13],y[12]+=t*(1-e),y[13]+=r*(1-e),y[0]*=e,y[5]*=e,j(),I(this),y[0]},resetScale:function(){return A(),r&&(_(),j()),this},init:function(o){var i={};if(e.preserveDrawingBuffer&&(i.preserveDrawingBuffer=!0),n=o,_(),A(),n.appendChild(t),r=t.getContext("experimental-webgl",i),!r){var a="Could not initialize WebGL. Seems like the browser doesn't support it.";throw window.alert(a),a}if(e.enableBlending&&(r.blendFunc(r.SRC_ALPHA,r.ONE_MINUS_SRC_ALPHA),r.enable(r.BLEND)),e.clearColor){var u=e.clearColorValue;r.clearColor(u.r,u.g,u.b,u.a),this.beginRender=function(){r.clear(r.COLOR_BUFFER_BIT)}}L.load(r),L.updateSize(d/2,l/2),N.load(r),N.updateSize(d/2,l/2),j(),"function"==typeof g&&g(t)},release:function(e){t&&e&&e.removeChild(t)},isSupported:function(){var e=window.document.createElement("canvas"),n=e&&e.getContext&&e.getContext("experimental-webgl");return n},releaseLink:function(e){m>0&&(m-=1);var n=E[e.id];delete E[e.id],L.removeLink(n);var t=n.id;if(t0&&(h-=1);var n=b[e.id];delete b[e.id],N.removeNode(n);var t=n.id;if(te.length){var r=new Float32Array(e.length*t*2);return r.set(e),r}return e}function a(n,t){for(var r={},o=0;o=w.length&&s();var i=w[r.textureNumber];i.ctx.drawImage(n,r.col*h,r.row*h,h,h),b[e]=n.src,y[n.src]=o,i.isDirty=!0,t(o)}function c(n){var t=n/e<<0,r=n%e,o=r/g<<0,i=r%g;return{textureNumber:t,row:o,col:i}}function d(){E.isDirty=!0,x=0,v=null}function l(){v&&(window.clearTimeout(v),x+=1,v=null),x>10?d():v=window.setTimeout(d,400)}function p(e,n){var t=w[e.textureNumber].canvas,r=w[n.textureNumber].ctx,o=n.col*h,i=n.row*h;r.drawImage(t,e.col*h,e.row*h,h,h,o,i,h,h),w[e.textureNumber].isDirty=!0,w[n.textureNumber].isDirty=!0}var v,g=Math.sqrt(e||1024)<<0,h=g,m=1,y={},x=0,w=[],b=[];if(!o(e))throw"Tiles per texture should be power of two.";var E={isDirty:!1,clearDirty:n,remove:t,getTextures:r,getCoordinates:a,load:u};return E}function o(e){return 0===(e&e-1)}var i=e("./texture.js");n.exports=r},{"./texture.js":52}],55:[function(e,n,t){function r(e,n){return{_texture:0,_offset:0,size:"number"==typeof e?e:32,src:n}}n.exports=r},{}],56:[function(e,n,t){function r(){function e(e,n){e.nativeObject&&h.deleteTexture(e.nativeObject);var t=h.createTexture();h.activeTexture(h["TEXTURE"+n]),h.bindTexture(h.TEXTURE_2D,t),h.texImage2D(h.TEXTURE_2D,0,h.RGBA,h.RGBA,h.UNSIGNED_BYTE,e.canvas),h.texParameteri(h.TEXTURE_2D,h.TEXTURE_MAG_FILTER,h.LINEAR),h.texParameteri(h.TEXTURE_2D,h.TEXTURE_MIN_FILTER,h.LINEAR_MIPMAP_NEAREST),h.generateMipmap(h.TEXTURE_2D),h.uniform1i(x["sampler"+n],n),e.nativeObject=t}function n(){if(v.isDirty){var n,t=v.getTextures();for(n=0;n0&&(A-=1),e.id0&&(e.src&&v.remove(e.src),y.copyArrayPart(_,e.id*N,A*N,N))}function c(e,n){n._offset=e._offset}function d(e){L=!0,E=e}function l(e,n){w=e,b=n,L=!0}function p(){h.useProgram(g),h.bindBuffer(h.ARRAY_BUFFER,m),h.bufferData(h.ARRAY_BUFFER,_,h.DYNAMIC_DRAW),L&&(L=!1,h.uniformMatrix4fv(x.transform,!1,E),h.uniform2f(x.screenSize,w,b)),h.vertexAttribPointer(x.vertexPos,2,h.FLOAT,!1,3*Float32Array.BYTES_PER_ELEMENT,0),h.vertexAttribPointer(x.customAttributes,1,h.FLOAT,!1,3*Float32Array.BYTES_PER_ELEMENT,8),n(),h.drawArrays(h.TRIANGLES,0,6*A)}var v,g,h,m,y,x,w,b,E,L,N=18,P=o(),k=i(),j=1024,A=0,_=new Float32Array(64);return{load:t,position:r,createNode:s,removeNode:f,replaceProperties:c,updateTransform:d,updateSize:l,render:p}}function o(){return["precision mediump float;","varying vec4 color;","varying vec3 vTextureCoord;","uniform sampler2D u_sampler0;","uniform sampler2D u_sampler1;","uniform sampler2D u_sampler2;","uniform sampler2D u_sampler3;","void main(void) {"," if (vTextureCoord.z == 0.) {"," gl_FragColor = texture2D(u_sampler0, vTextureCoord.xy);"," } else if (vTextureCoord.z == 1.) {"," gl_FragColor = texture2D(u_sampler1, vTextureCoord.xy);"," } else if (vTextureCoord.z == 2.) {"," gl_FragColor = texture2D(u_sampler2, vTextureCoord.xy);"," } else if (vTextureCoord.z == 3.) {"," gl_FragColor = texture2D(u_sampler3, vTextureCoord.xy);"," } else { gl_FragColor = vec4(0, 1, 0, 1); }","}"].join("\n")}function i(){return["attribute vec2 a_vertexPos;","attribute float a_customAttributes;","uniform vec2 u_screenSize;","uniform mat4 u_transform;","uniform float u_tilesPerTexture;","varying vec3 vTextureCoord;","void main(void) {"," gl_Position = u_transform * vec4(a_vertexPos/u_screenSize, 0, 1);","float corner = mod(a_customAttributes, 4.);","float tileIndex = mod(floor(a_customAttributes / 4.), u_tilesPerTexture);","float tilesPerRow = sqrt(u_tilesPerTexture);","float tileSize = 1./tilesPerRow;","float tileColumn = mod(tileIndex, tilesPerRow);","float tileRow = floor(tileIndex/tilesPerRow);","if(corner == 0.0) {"," vTextureCoord.xy = vec2(0, 1);","} else if(corner == 1.0) {"," vTextureCoord.xy = vec2(1, 1);","} else if(corner == 2.0) {"," vTextureCoord.xy = vec2(0, 0);","} else {"," vTextureCoord.xy = vec2(1, 0);","}","vTextureCoord *= tileSize;","vTextureCoord.x += tileColumn * tileSize;","vTextureCoord.y += tileRow * tileSize;","vTextureCoord.z = floor(floor(a_customAttributes / 4.)/u_tilesPerTexture);","}"].join("\n")}var a=e("./webglAtlas.js"),u=e("./webgl.js");n.exports=r},{"./webgl.js":53,"./webglAtlas.js":54}],57:[function(e,n,t){function r(e){function n(){x=null}function t(e){x=e}function r(e){return"function"==typeof e&&k.push(e),A}function i(e){return"function"==typeof e&&P.push(e),A}function a(e){return"function"==typeof e&&N.push(e),A}function u(e){return"function"==typeof e&&L.push(e),A}function s(e){return"function"==typeof e&&E.push(e),A}function f(e){return"function"==typeof e&&b.push(e),A}function c(e){return"function"==typeof e&&w.push(e),A}function d(e,n,t){if(e&&e.size){var r=e.position,o=e.size;return r.x-oh.byteLength){var e=new ArrayBuffer(2*h.byteLength),n=new Float32Array(e),t=new Uint32Array(e);t.set(y),m=n,y=t,h=e}};return{load:function(a){n=a,r=o(a),e=r.createProgram(v,p),n.useProgram(e),i=r.getLocations(e,["a_vertexPos","a_color","u_screenSize","u_transform"]),n.enableVertexAttribArray(i.vertexPos),n.enableVertexAttribArray(i.color),t=n.createBuffer()},position:function(e,n,t){var r=e.id,o=r*d;m[o]=n.x,m[o+1]=n.y,y[o+2]=e.color,m[o+3]=t.x,m[o+4]=t.y,y[o+5]=e.color},createLink:function(e){x(),g+=1,a=e.id},removeLink:function(e){g>0&&(g-=1),e.id0&&r.copyArrayPart(y,e.id*d,g*d,d)},updateTransform:function(e){c=!0,f=e},updateSize:function(e,n){u=e,s=n,c=!0},render:function(){n.useProgram(e),n.bindBuffer(n.ARRAY_BUFFER,t),n.bufferData(n.ARRAY_BUFFER,h,n.DYNAMIC_DRAW),c&&(c=!1,n.uniformMatrix4fv(i.transform,!1,f),n.uniform2f(i.screenSize,u,s)),n.vertexAttribPointer(i.vertexPos,2,n.FLOAT,!1,3*Float32Array.BYTES_PER_ELEMENT,0),n.vertexAttribPointer(i.color,4,n.UNSIGNED_BYTE,!0,3*Float32Array.BYTES_PER_ELEMENT,8),n.drawArrays(n.LINES,0,2*g),a=g-1},bringToFront:function(e){a>e.id&&r.swapArrayPart(m,e.id*d,a*d,d),a>0&&(a-=1)},getFrontLinkId:function(){return a}}}var o=e("./webgl.js");n.exports=r},{"./webgl.js":53}],60:[function(e,n,t){function r(){function e(){if((k+1)*w>=L.byteLength){var e=new ArrayBuffer(2*L.byteLength),n=new Float32Array(e),t=new Uint32Array(e);t.set(P),N=n,P=t,L=e}}function n(e){d=e,v=o(e),c=v.createProgram(E,b),d.useProgram(c),p=v.getLocations(c,["a_vertexPos","a_color","u_screenSize","u_transform"]),d.enableVertexAttribArray(p.vertexPos),d.enableVertexAttribArray(p.color),l=d.createBuffer()}function t(e,n){var t=e.id;N[t*x]=n.x,N[t*x+1]=-n.y,N[t*x+2]=e.size,P[t*x+3]=e.color}function r(e){y=!0,m=e}function i(e,n){g=e,h=n,y=!0}function a(e){k>0&&(k-=1),e.id0&&v.copyArrayPart(P,e.id*x,k*x,x)}function u(){e(),k+=1}function s(){}function f(){d.useProgram(c),d.bindBuffer(d.ARRAY_BUFFER,l),d.bufferData(d.ARRAY_BUFFER,L,d.DYNAMIC_DRAW),y&&(y=!1,d.uniformMatrix4fv(p.transform,!1,m),d.uniform2f(p.screenSize,g,h)),d.vertexAttribPointer(p.vertexPos,3,d.FLOAT,!1,x*Float32Array.BYTES_PER_ELEMENT,0),d.vertexAttribPointer(p.color,4,d.UNSIGNED_BYTE,!0,x*Float32Array.BYTES_PER_ELEMENT,12),d.drawArrays(d.POINTS,0,k)}var c,d,l,p,v,g,h,m,y,x=4,w=3*Float32Array.BYTES_PER_ELEMENT+Uint32Array.BYTES_PER_ELEMENT,b=["precision mediump float;","varying vec4 color;","void main(void) {"," gl_FragColor = color;","}"].join("\n"),E=["attribute vec3 a_vertexPos;","attribute vec4 a_color;","uniform vec2 u_screenSize;","uniform mat4 u_transform;","varying vec4 color;","void main(void) {"," gl_Position = u_transform * vec4(a_vertexPos.xy/u_screenSize, 0, 1);"," gl_PointSize = a_vertexPos.z * u_transform[0][0];"," color = a_color.abgr;","}"].join("\n"),L=new ArrayBuffer(16*w),N=new Float32Array(L),P=new Uint32Array(L),k=0;return{load:n,position:t,updateTransform:r,updateSize:i,removeNode:a,createNode:u,replaceProperties:s,render:f}}var o=e("./webgl.js");n.exports=r},{"./webgl.js":53}],61:[function(e,n,t){function r(e,n){return{size:"number"==typeof e?e:10,color:o(n)}}var o=e("./parseColor.js");n.exports=r},{"./parseColor.js":51}],62:[function(e,n,t){n.exports="0.8.1"},{}]},{},[1])(1)}); \ No newline at end of file diff --git a/package.json b/package.json index 9b7ccd6..72a80ca 100644 --- a/package.json +++ b/package.json @@ -28,6 +28,7 @@ "gulp-run": "^1.6.5", "gulp-uglify": "^1.0.2", "gulp-util": "^3.0.2", + "ngraph.remove-overlaps": "^1.0.0", "tap": "^0.4.13", "vinyl-buffer": "^1.0.0", "vinyl-source-stream": "^1.0.0" @@ -36,7 +37,7 @@ "gintersect": "0.1.0", "ngraph.centrality": "0.1.3", "ngraph.events": "0.0.3", - "ngraph.forcelayout": "0.0.21", + "ngraph.forcelayout": "0.1.2", "ngraph.fromjson": "0.1.7", "ngraph.generators": "0.0.15", "ngraph.graph": "0.0.11", From 00ff3e247153bf5f8aa827b5c362668814156c27 Mon Sep 17 00:00:00 2001 From: Andriy Kashcha Date: Mon, 8 May 2017 22:36:06 -0700 Subject: [PATCH 10/49] 0.9.0 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 72a80ca..38ab72a 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "vivagraphjs", - "version": "0.8.3", + "version": "0.9.0", "description": "Graph Drawing Library", "main": "src/viva", "directories": { From 00036a76c4d1b180056afed2950e881750e3c0ea Mon Sep 17 00:00:00 2001 From: Antti Kaikkonen Date: Fri, 12 May 2017 19:53:51 +0300 Subject: [PATCH 11/49] Update webglImageNodeProgram.js https://github.com/anvaka/VivaGraphJS/issues/34#issuecomment-253107796 --- src/WebGL/webglImageNodeProgram.js | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/WebGL/webglImageNodeProgram.js b/src/WebGL/webglImageNodeProgram.js index fc52020..f9f7ec1 100644 --- a/src/WebGL/webglImageNodeProgram.js +++ b/src/WebGL/webglImageNodeProgram.js @@ -110,27 +110,27 @@ function webglImageNodeProgram() { function position(nodeUI, pos) { var idx = nodeUI.id * ATTRIBUTES_PER_PRIMITIVE; nodes[idx] = pos.x - nodeUI.size; - nodes[idx + 1] = pos.y - nodeUI.size; + nodes[idx + 1] = -pos.y - nodeUI.size; nodes[idx + 2] = nodeUI._offset * 4; nodes[idx + 3] = pos.x + nodeUI.size; - nodes[idx + 4] = pos.y - nodeUI.size; + nodes[idx + 4] = -pos.y - nodeUI.size; nodes[idx + 5] = nodeUI._offset * 4 + 1; nodes[idx + 6] = pos.x - nodeUI.size; - nodes[idx + 7] = pos.y + nodeUI.size; + nodes[idx + 7] = -pos.y + nodeUI.size; nodes[idx + 8] = nodeUI._offset * 4 + 2; nodes[idx + 9] = pos.x - nodeUI.size; - nodes[idx + 10] = pos.y + nodeUI.size; + nodes[idx + 10] = -pos.y + nodeUI.size; nodes[idx + 11] = nodeUI._offset * 4 + 2; nodes[idx + 12] = pos.x + nodeUI.size; - nodes[idx + 13] = pos.y - nodeUI.size; + nodes[idx + 13] = -pos.y - nodeUI.size; nodes[idx + 14] = nodeUI._offset * 4 + 1; nodes[idx + 15] = pos.x + nodeUI.size; - nodes[idx + 16] = pos.y + nodeUI.size; + nodes[idx + 16] = -pos.y + nodeUI.size; nodes[idx + 17] = nodeUI._offset * 4 + 3; } From f89dcb869b8eae18eef6bd9da527e6a05a6281b2 Mon Sep 17 00:00:00 2001 From: jlazar Date: Mon, 7 Aug 2017 14:55:17 -0400 Subject: [PATCH 12/49] exposing updateSize function to graphics object --- dist/vivagraph.js | 4048 +++++++++++++++++++------------------ dist/vivagraph.min.js | 2 +- package-lock.json | 3681 +++++++++++++++++++++++++++++++++ src/View/webglGraphics.js | 6 + 4 files changed, 5715 insertions(+), 2022 deletions(-) create mode 100644 package-lock.json diff --git a/dist/vivagraph.js b/dist/vivagraph.js index 0a7e067..0ecff26 100644 --- a/dist/vivagraph.js +++ b/dist/vivagraph.js @@ -3252,42 +3252,42 @@ function fail() { } },{}],32:[function(require,module,exports){ -var centrality = require('ngraph.centrality'); - -module.exports = centralityWrapper; - -function centralityWrapper() { - // TODO: This should not be a function - return { - betweennessCentrality: betweennessCentrality, - degreeCentrality: degreeCentrality - }; -} - -function betweennessCentrality(g) { - var betweenness = centrality.betweenness(g); - return toVivaGraphCentralityFormat(betweenness); -} - -function degreeCentrality(g, kind) { - var degree = centrality.degree(g, kind); - return toVivaGraphCentralityFormat(degree); -} - -function toVivaGraphCentralityFormat(centrality) { - return Object.keys(centrality).sort(byValue).map(toKeyValue); - - function byValue(x, y) { - return centrality[y] - centrality[x]; - } - - function toKeyValue(key) { - return { - key: key, - value: centrality[key] - }; - } -} +var centrality = require('ngraph.centrality'); + +module.exports = centralityWrapper; + +function centralityWrapper() { + // TODO: This should not be a function + return { + betweennessCentrality: betweennessCentrality, + degreeCentrality: degreeCentrality + }; +} + +function betweennessCentrality(g) { + var betweenness = centrality.betweenness(g); + return toVivaGraphCentralityFormat(betweenness); +} + +function degreeCentrality(g, kind) { + var degree = centrality.degree(g, kind); + return toVivaGraphCentralityFormat(degree); +} + +function toVivaGraphCentralityFormat(centrality) { + return Object.keys(centrality).sort(byValue).map(toKeyValue); + + function byValue(x, y) { + return centrality[y] - centrality[x]; + } + + function toKeyValue(key) { + return { + key: key, + value: centrality[key] + }; + } +} },{"ngraph.centrality":4}],33:[function(require,module,exports){ /** @@ -3325,651 +3325,651 @@ function operations() { }; },{}],34:[function(require,module,exports){ -/** - * @author Andrei Kashcha (aka anvaka) / https://github.com/anvaka - */ - -module.exports = domInputManager; - -var dragndrop = require('./dragndrop.js'); - -function domInputManager(graph, graphics) { - var nodeEvents = {}; - return { - /** - * Called by renderer to listen to drag-n-drop events from node. E.g. for SVG - * graphics we may listen to DOM events, whereas for WebGL the graphics - * should provide custom eventing mechanism. - * - * @param node - to be monitored. - * @param handlers - object with set of three callbacks: - * onStart: function(), - * onDrag: function(e, offset), - * onStop: function() - */ - bindDragNDrop: bindDragNDrop - }; - - function bindDragNDrop(node, handlers) { - var events; - if (handlers) { - var nodeUI = graphics.getNodeUI(node.id); - events = dragndrop(nodeUI); - if (typeof handlers.onStart === 'function') { - events.onStart(handlers.onStart); - } - if (typeof handlers.onDrag === 'function') { - events.onDrag(handlers.onDrag); - } - if (typeof handlers.onStop === 'function') { - events.onStop(handlers.onStop); - } - - nodeEvents[node.id] = events; - } else if ((events = nodeEvents[node.id])) { - events.release(); - delete nodeEvents[node.id]; - } - } -} +/** + * @author Andrei Kashcha (aka anvaka) / https://github.com/anvaka + */ + +module.exports = domInputManager; + +var dragndrop = require('./dragndrop.js'); + +function domInputManager(graph, graphics) { + var nodeEvents = {}; + return { + /** + * Called by renderer to listen to drag-n-drop events from node. E.g. for SVG + * graphics we may listen to DOM events, whereas for WebGL the graphics + * should provide custom eventing mechanism. + * + * @param node - to be monitored. + * @param handlers - object with set of three callbacks: + * onStart: function(), + * onDrag: function(e, offset), + * onStop: function() + */ + bindDragNDrop: bindDragNDrop + }; + + function bindDragNDrop(node, handlers) { + var events; + if (handlers) { + var nodeUI = graphics.getNodeUI(node.id); + events = dragndrop(nodeUI); + if (typeof handlers.onStart === 'function') { + events.onStart(handlers.onStart); + } + if (typeof handlers.onDrag === 'function') { + events.onDrag(handlers.onDrag); + } + if (typeof handlers.onStop === 'function') { + events.onStop(handlers.onStop); + } + + nodeEvents[node.id] = events; + } else if ((events = nodeEvents[node.id])) { + events.release(); + delete nodeEvents[node.id]; + } + } +} },{"./dragndrop.js":35}],35:[function(require,module,exports){ -/** - * @author Andrei Kashcha (aka anvaka) / https://github.com/anvaka - */ - -module.exports = dragndrop; - -var documentEvents = require('../Utils/documentEvents.js'); -var browserInfo = require('../Utils/browserInfo.js'); -var findElementPosition = require('../Utils/findElementPosition.js'); - -// TODO: Move to input namespace -// TODO: Methods should be extracted into the prototype. This class -// does not need to consume so much memory for every tracked element -function dragndrop(element) { - var start, - drag, - end, - scroll, - prevSelectStart, - prevDragStart, - - startX = 0, - startY = 0, - dragObject, - touchInProgress = false, - pinchZoomLength = 0, - - getMousePos = function (e) { - var posx = 0, - posy = 0; - - e = e || window.event; - - if (e.pageX || e.pageY) { - posx = e.pageX; - posy = e.pageY; - } else if (e.clientX || e.clientY) { - posx = e.clientX + window.document.body.scrollLeft + window.document.documentElement.scrollLeft; - posy = e.clientY + window.document.body.scrollTop + window.document.documentElement.scrollTop; - } - - return [posx, posy]; - }, - - move = function (e, clientX, clientY) { - if (drag) { - drag(e, {x : clientX - startX, y : clientY - startY }); - } - - startX = clientX; - startY = clientY; - }, - - stopPropagation = function (e) { - if (e.stopPropagation) { e.stopPropagation(); } else { e.cancelBubble = true; } - }, - preventDefault = function (e) { - if (e.preventDefault) { e.preventDefault(); } - }, - - handleDisabledEvent = function (e) { - stopPropagation(e); - return false; - }, - - handleMouseMove = function (e) { - e = e || window.event; - - move(e, e.clientX, e.clientY); - }, - - handleMouseDown = function (e) { - e = e || window.event; - if (touchInProgress) { - // modern browsers will fire mousedown for touch events too - // we do not want this, since touch is handled separately. - stopPropagation(e); - return false; - } - // for IE, left click == 1 - // for Firefox, left click == 0 - var isLeftButton = ((e.button === 1 && window.event !== null) || e.button === 0); - - if (isLeftButton) { - startX = e.clientX; - startY = e.clientY; - - // TODO: bump zIndex? - dragObject = e.target || e.srcElement; - - if (start) { start(e, {x: startX, y : startY}); } - - documentEvents.on('mousemove', handleMouseMove); - documentEvents.on('mouseup', handleMouseUp); - - - stopPropagation(e); - // TODO: What if event already there? Not bullet proof: - prevSelectStart = window.document.onselectstart; - prevDragStart = window.document.ondragstart; - - window.document.onselectstart = handleDisabledEvent; - dragObject.ondragstart = handleDisabledEvent; - - // prevent text selection (except IE) - return false; - } - }, - - handleMouseUp = function (e) { - e = e || window.event; - - documentEvents.off('mousemove', handleMouseMove); - documentEvents.off('mouseup', handleMouseUp); - - window.document.onselectstart = prevSelectStart; - dragObject.ondragstart = prevDragStart; - dragObject = null; - if (end) { end(e); } - }, - - handleMouseWheel = function (e) { - if (typeof scroll !== 'function') { - return; - } - - e = e || window.event; - if (e.preventDefault) { - e.preventDefault(); - } - - e.returnValue = false; - var delta, - mousePos = getMousePos(e), - elementOffset = findElementPosition(element), - relMousePos = { - x: mousePos[0] - elementOffset[0], - y: mousePos[1] - elementOffset[1] - }; - - if (e.wheelDelta) { - delta = e.wheelDelta / 360; // Chrome/Safari - } else { - delta = e.detail / -9; // Mozilla - } - - scroll(e, delta, relMousePos); - }, - - updateScrollEvents = function (scrollCallback) { - if (!scroll && scrollCallback) { - // client is interested in scrolling. Start listening to events: - if (browserInfo.browser === 'webkit') { - element.addEventListener('mousewheel', handleMouseWheel, false); // Chrome/Safari - } else { - element.addEventListener('DOMMouseScroll', handleMouseWheel, false); // Others - } - } else if (scroll && !scrollCallback) { - if (browserInfo.browser === 'webkit') { - element.removeEventListener('mousewheel', handleMouseWheel, false); // Chrome/Safari - } else { - element.removeEventListener('DOMMouseScroll', handleMouseWheel, false); // Others - } - } - - scroll = scrollCallback; - }, - - getPinchZoomLength = function(finger1, finger2) { - return (finger1.clientX - finger2.clientX) * (finger1.clientX - finger2.clientX) + - (finger1.clientY - finger2.clientY) * (finger1.clientY - finger2.clientY); - }, - - handleTouchMove = function (e) { - if (e.touches.length === 1) { - stopPropagation(e); - - var touch = e.touches[0]; - move(e, touch.clientX, touch.clientY); - } else if (e.touches.length === 2) { - // it's a zoom: - var currentPinchLength = getPinchZoomLength(e.touches[0], e.touches[1]); - var delta = 0; - if (currentPinchLength < pinchZoomLength) { - delta = -1; - } else if (currentPinchLength > pinchZoomLength) { - delta = 1; - } - scroll(e, delta, {x: e.touches[0].clientX, y: e.touches[0].clientY}); - pinchZoomLength = currentPinchLength; - stopPropagation(e); - preventDefault(e); - } - }, - - handleTouchEnd = function (e) { - touchInProgress = false; - documentEvents.off('touchmove', handleTouchMove); - documentEvents.off('touchend', handleTouchEnd); - documentEvents.off('touchcancel', handleTouchEnd); - dragObject = null; - if (end) { end(e); } - }, - - handleSignleFingerTouch = function (e, touch) { - stopPropagation(e); - preventDefault(e); - - startX = touch.clientX; - startY = touch.clientY; - - dragObject = e.target || e.srcElement; - - if (start) { start(e, {x: startX, y : startY}); } - // TODO: can I enter into the state when touch is in progress - // but it's still a single finger touch? - if (!touchInProgress) { - touchInProgress = true; - documentEvents.on('touchmove', handleTouchMove); - documentEvents.on('touchend', handleTouchEnd); - documentEvents.on('touchcancel', handleTouchEnd); - } - }, - - handleTouchStart = function (e) { - if (e.touches.length === 1) { - return handleSignleFingerTouch(e, e.touches[0]); - } else if (e.touches.length === 2) { - // handleTouchMove() will care about pinch zoom. - stopPropagation(e); - preventDefault(e); - - pinchZoomLength = getPinchZoomLength(e.touches[0], e.touches[1]); - - } - // don't care about the rest. - }; - - - element.addEventListener('mousedown', handleMouseDown); - element.addEventListener('touchstart', handleTouchStart); - - return { - onStart : function (callback) { - start = callback; - return this; - }, - - onDrag : function (callback) { - drag = callback; - return this; - }, - - onStop : function (callback) { - end = callback; - return this; - }, - - /** - * Occurs when mouse wheel event happens. callback = function(e, scrollDelta, scrollPoint); - */ - onScroll : function (callback) { - updateScrollEvents(callback); - return this; - }, - - release : function () { - // TODO: could be unsafe. We might wanna release dragObject, etc. - element.removeEventListener('mousedown', handleMouseDown); - element.removeEventListener('touchstart', handleTouchStart); - - documentEvents.off('mousemove', handleMouseMove); - documentEvents.off('mouseup', handleMouseUp); - documentEvents.off('touchmove', handleTouchMove); - documentEvents.off('touchend', handleTouchEnd); - documentEvents.off('touchcancel', handleTouchEnd); - - updateScrollEvents(null); - } - }; -} +/** + * @author Andrei Kashcha (aka anvaka) / https://github.com/anvaka + */ + +module.exports = dragndrop; + +var documentEvents = require('../Utils/documentEvents.js'); +var browserInfo = require('../Utils/browserInfo.js'); +var findElementPosition = require('../Utils/findElementPosition.js'); + +// TODO: Move to input namespace +// TODO: Methods should be extracted into the prototype. This class +// does not need to consume so much memory for every tracked element +function dragndrop(element) { + var start, + drag, + end, + scroll, + prevSelectStart, + prevDragStart, + + startX = 0, + startY = 0, + dragObject, + touchInProgress = false, + pinchZoomLength = 0, + + getMousePos = function (e) { + var posx = 0, + posy = 0; + + e = e || window.event; + + if (e.pageX || e.pageY) { + posx = e.pageX; + posy = e.pageY; + } else if (e.clientX || e.clientY) { + posx = e.clientX + window.document.body.scrollLeft + window.document.documentElement.scrollLeft; + posy = e.clientY + window.document.body.scrollTop + window.document.documentElement.scrollTop; + } + + return [posx, posy]; + }, + + move = function (e, clientX, clientY) { + if (drag) { + drag(e, {x : clientX - startX, y : clientY - startY }); + } + + startX = clientX; + startY = clientY; + }, + + stopPropagation = function (e) { + if (e.stopPropagation) { e.stopPropagation(); } else { e.cancelBubble = true; } + }, + preventDefault = function (e) { + if (e.preventDefault) { e.preventDefault(); } + }, + + handleDisabledEvent = function (e) { + stopPropagation(e); + return false; + }, + + handleMouseMove = function (e) { + e = e || window.event; + + move(e, e.clientX, e.clientY); + }, + + handleMouseDown = function (e) { + e = e || window.event; + if (touchInProgress) { + // modern browsers will fire mousedown for touch events too + // we do not want this, since touch is handled separately. + stopPropagation(e); + return false; + } + // for IE, left click == 1 + // for Firefox, left click == 0 + var isLeftButton = ((e.button === 1 && window.event !== null) || e.button === 0); + + if (isLeftButton) { + startX = e.clientX; + startY = e.clientY; + + // TODO: bump zIndex? + dragObject = e.target || e.srcElement; + + if (start) { start(e, {x: startX, y : startY}); } + + documentEvents.on('mousemove', handleMouseMove); + documentEvents.on('mouseup', handleMouseUp); + + + stopPropagation(e); + // TODO: What if event already there? Not bullet proof: + prevSelectStart = window.document.onselectstart; + prevDragStart = window.document.ondragstart; + + window.document.onselectstart = handleDisabledEvent; + dragObject.ondragstart = handleDisabledEvent; + + // prevent text selection (except IE) + return false; + } + }, + + handleMouseUp = function (e) { + e = e || window.event; + + documentEvents.off('mousemove', handleMouseMove); + documentEvents.off('mouseup', handleMouseUp); + + window.document.onselectstart = prevSelectStart; + dragObject.ondragstart = prevDragStart; + dragObject = null; + if (end) { end(e); } + }, + + handleMouseWheel = function (e) { + if (typeof scroll !== 'function') { + return; + } + + e = e || window.event; + if (e.preventDefault) { + e.preventDefault(); + } + + e.returnValue = false; + var delta, + mousePos = getMousePos(e), + elementOffset = findElementPosition(element), + relMousePos = { + x: mousePos[0] - elementOffset[0], + y: mousePos[1] - elementOffset[1] + }; + + if (e.wheelDelta) { + delta = e.wheelDelta / 360; // Chrome/Safari + } else { + delta = e.detail / -9; // Mozilla + } + + scroll(e, delta, relMousePos); + }, + + updateScrollEvents = function (scrollCallback) { + if (!scroll && scrollCallback) { + // client is interested in scrolling. Start listening to events: + if (browserInfo.browser === 'webkit') { + element.addEventListener('mousewheel', handleMouseWheel, false); // Chrome/Safari + } else { + element.addEventListener('DOMMouseScroll', handleMouseWheel, false); // Others + } + } else if (scroll && !scrollCallback) { + if (browserInfo.browser === 'webkit') { + element.removeEventListener('mousewheel', handleMouseWheel, false); // Chrome/Safari + } else { + element.removeEventListener('DOMMouseScroll', handleMouseWheel, false); // Others + } + } + + scroll = scrollCallback; + }, + + getPinchZoomLength = function(finger1, finger2) { + return (finger1.clientX - finger2.clientX) * (finger1.clientX - finger2.clientX) + + (finger1.clientY - finger2.clientY) * (finger1.clientY - finger2.clientY); + }, + + handleTouchMove = function (e) { + if (e.touches.length === 1) { + stopPropagation(e); + + var touch = e.touches[0]; + move(e, touch.clientX, touch.clientY); + } else if (e.touches.length === 2) { + // it's a zoom: + var currentPinchLength = getPinchZoomLength(e.touches[0], e.touches[1]); + var delta = 0; + if (currentPinchLength < pinchZoomLength) { + delta = -1; + } else if (currentPinchLength > pinchZoomLength) { + delta = 1; + } + scroll(e, delta, {x: e.touches[0].clientX, y: e.touches[0].clientY}); + pinchZoomLength = currentPinchLength; + stopPropagation(e); + preventDefault(e); + } + }, + + handleTouchEnd = function (e) { + touchInProgress = false; + documentEvents.off('touchmove', handleTouchMove); + documentEvents.off('touchend', handleTouchEnd); + documentEvents.off('touchcancel', handleTouchEnd); + dragObject = null; + if (end) { end(e); } + }, + + handleSignleFingerTouch = function (e, touch) { + stopPropagation(e); + preventDefault(e); + + startX = touch.clientX; + startY = touch.clientY; + + dragObject = e.target || e.srcElement; + + if (start) { start(e, {x: startX, y : startY}); } + // TODO: can I enter into the state when touch is in progress + // but it's still a single finger touch? + if (!touchInProgress) { + touchInProgress = true; + documentEvents.on('touchmove', handleTouchMove); + documentEvents.on('touchend', handleTouchEnd); + documentEvents.on('touchcancel', handleTouchEnd); + } + }, + + handleTouchStart = function (e) { + if (e.touches.length === 1) { + return handleSignleFingerTouch(e, e.touches[0]); + } else if (e.touches.length === 2) { + // handleTouchMove() will care about pinch zoom. + stopPropagation(e); + preventDefault(e); + + pinchZoomLength = getPinchZoomLength(e.touches[0], e.touches[1]); + + } + // don't care about the rest. + }; + + + element.addEventListener('mousedown', handleMouseDown); + element.addEventListener('touchstart', handleTouchStart); + + return { + onStart : function (callback) { + start = callback; + return this; + }, + + onDrag : function (callback) { + drag = callback; + return this; + }, + + onStop : function (callback) { + end = callback; + return this; + }, + + /** + * Occurs when mouse wheel event happens. callback = function(e, scrollDelta, scrollPoint); + */ + onScroll : function (callback) { + updateScrollEvents(callback); + return this; + }, + + release : function () { + // TODO: could be unsafe. We might wanna release dragObject, etc. + element.removeEventListener('mousedown', handleMouseDown); + element.removeEventListener('touchstart', handleTouchStart); + + documentEvents.off('mousemove', handleMouseMove); + documentEvents.off('mouseup', handleMouseUp); + documentEvents.off('touchmove', handleTouchMove); + documentEvents.off('touchend', handleTouchEnd); + documentEvents.off('touchcancel', handleTouchEnd); + + updateScrollEvents(null); + } + }; +} },{"../Utils/browserInfo.js":39,"../Utils/documentEvents.js":40,"../Utils/findElementPosition.js":41}],36:[function(require,module,exports){ -/** - * @author Andrei Kashcha (aka anvaka) / https://github.com/anvaka - */ - -module.exports = webglInputManager; - -var createInputEvents = require('../WebGL/webglInputEvents.js'); - -function webglInputManager(graph, graphics) { - var inputEvents = createInputEvents(graphics), - draggedNode = null, - internalHandlers = {}, - pos = {x : 0, y : 0}; - - inputEvents.mouseDown(function (node, e) { - draggedNode = node; - pos.x = e.clientX; - pos.y = e.clientY; - - inputEvents.mouseCapture(draggedNode); - - var handlers = internalHandlers[node.id]; - if (handlers && handlers.onStart) { - handlers.onStart(e, pos); - } - - return true; - }).mouseUp(function (node) { - inputEvents.releaseMouseCapture(draggedNode); - - draggedNode = null; - var handlers = internalHandlers[node.id]; - if (handlers && handlers.onStop) { - handlers.onStop(); - } - return true; - }).mouseMove(function (node, e) { - if (draggedNode) { - var handlers = internalHandlers[draggedNode.id]; - if (handlers && handlers.onDrag) { - handlers.onDrag(e, {x : e.clientX - pos.x, y : e.clientY - pos.y }); - } - - pos.x = e.clientX; - pos.y = e.clientY; - return true; - } - }); - - return { - /** - * Called by renderer to listen to drag-n-drop events from node. E.g. for SVG - * graphics we may listen to DOM events, whereas for WebGL we graphics - * should provide custom eventing mechanism. - * - * @param node - to be monitored. - * @param handlers - object with set of three callbacks: - * onStart: function(), - * onDrag: function(e, offset), - * onStop: function() - */ - bindDragNDrop : function (node, handlers) { - internalHandlers[node.id] = handlers; - if (!handlers) { - delete internalHandlers[node.id]; - } - } - }; -} +/** + * @author Andrei Kashcha (aka anvaka) / https://github.com/anvaka + */ + +module.exports = webglInputManager; + +var createInputEvents = require('../WebGL/webglInputEvents.js'); + +function webglInputManager(graph, graphics) { + var inputEvents = createInputEvents(graphics), + draggedNode = null, + internalHandlers = {}, + pos = {x : 0, y : 0}; + + inputEvents.mouseDown(function (node, e) { + draggedNode = node; + pos.x = e.clientX; + pos.y = e.clientY; + + inputEvents.mouseCapture(draggedNode); + + var handlers = internalHandlers[node.id]; + if (handlers && handlers.onStart) { + handlers.onStart(e, pos); + } + + return true; + }).mouseUp(function (node) { + inputEvents.releaseMouseCapture(draggedNode); + + draggedNode = null; + var handlers = internalHandlers[node.id]; + if (handlers && handlers.onStop) { + handlers.onStop(); + } + return true; + }).mouseMove(function (node, e) { + if (draggedNode) { + var handlers = internalHandlers[draggedNode.id]; + if (handlers && handlers.onDrag) { + handlers.onDrag(e, {x : e.clientX - pos.x, y : e.clientY - pos.y }); + } + + pos.x = e.clientX; + pos.y = e.clientY; + return true; + } + }); + + return { + /** + * Called by renderer to listen to drag-n-drop events from node. E.g. for SVG + * graphics we may listen to DOM events, whereas for WebGL we graphics + * should provide custom eventing mechanism. + * + * @param node - to be monitored. + * @param handlers - object with set of three callbacks: + * onStart: function(), + * onDrag: function(e, offset), + * onStop: function() + */ + bindDragNDrop : function (node, handlers) { + internalHandlers[node.id] = handlers; + if (!handlers) { + delete internalHandlers[node.id]; + } + } + }; +} },{"../WebGL/webglInputEvents.js":57}],37:[function(require,module,exports){ -module.exports = constant; - -var merge = require('ngraph.merge'); -var random = require('ngraph.random').random; -var Rect = require('../Utils/rect.js'); - -/** - * Does not really perform any layouting algorithm but is compliant - * with renderer interface. Allowing clients to provide specific positioning - * callback and get static layout of the graph - * - * @param {Viva.Graph.graph} graph to layout - * @param {Object} userSettings - */ -function constant(graph, userSettings) { - userSettings = merge(userSettings, { - maxX : 1024, - maxY : 1024, - seed : 'Deterministic randomness made me do this' - }); - // This class simply follows API, it does not use some of the arguments: - /*jshint unused: false */ - var rand = random(userSettings.seed), - graphRect = new Rect(Number.MAX_VALUE, Number.MAX_VALUE, Number.MIN_VALUE, Number.MIN_VALUE), - layoutLinks = {}, - - placeNodeCallback = function (node) { - return { - x: rand.next(userSettings.maxX), - y: rand.next(userSettings.maxY) - }; - }, - - updateGraphRect = function (position, graphRect) { - if (position.x < graphRect.x1) { graphRect.x1 = position.x; } - if (position.x > graphRect.x2) { graphRect.x2 = position.x; } - if (position.y < graphRect.y1) { graphRect.y1 = position.y; } - if (position.y > graphRect.y2) { graphRect.y2 = position.y; } - }, - - layoutNodes = typeof Object.create === 'function' ? Object.create(null) : {}, - - ensureNodeInitialized = function (node) { - layoutNodes[node.id] = placeNodeCallback(node); - updateGraphRect(layoutNodes[node.id], graphRect); - }, - - updateNodePositions = function () { - if (graph.getNodesCount() === 0) { return; } - - graphRect.x1 = Number.MAX_VALUE; - graphRect.y1 = Number.MAX_VALUE; - graphRect.x2 = Number.MIN_VALUE; - graphRect.y2 = Number.MIN_VALUE; - - graph.forEachNode(ensureNodeInitialized); - }, - - ensureLinkInitialized = function (link) { - layoutLinks[link.id] = link; - }, - - onGraphChanged = function(changes) { - for (var i = 0; i < changes.length; ++i) { - var change = changes[i]; - if (change.node) { - if (change.changeType === 'add') { - ensureNodeInitialized(change.node); - } else { - delete layoutNodes[change.node.id]; - } - } if (change.link) { - if (change.changeType === 'add') { - ensureLinkInitialized(change.link); - } else { - delete layoutLinks[change.link.id]; - } - } - } - }; - - graph.forEachNode(ensureNodeInitialized); - graph.forEachLink(ensureLinkInitialized); - graph.on('changed', onGraphChanged); - - return { - /** - * Attempts to layout graph within given number of iterations. - * - * @param {integer} [iterationsCount] number of algorithm's iterations. - * The constant layout ignores this parameter. - */ - run : function (iterationsCount) { - this.step(); - }, - - /** - * One step of layout algorithm. - */ - step : function () { - updateNodePositions(); - - return true; // no need to continue. - }, - - /** - * Returns rectangle structure {x1, y1, x2, y2}, which represents - * current space occupied by graph. - */ - getGraphRect : function () { - return graphRect; - }, - - /** - * Request to release all resources - */ - dispose : function () { - graph.off('change', onGraphChanged); - }, - - /* - * Checks whether given node is pinned; all nodes in this layout are pinned. - */ - isNodePinned: function (node) { - return true; - }, - - /* - * Requests layout algorithm to pin/unpin node to its current position - * Pinned nodes should not be affected by layout algorithm and always - * remain at their position - */ - pinNode: function (node, isPinned) { - // noop - }, - - /* - * Gets position of a node by its id. If node was not seen by this - * layout algorithm undefined value is returned; - */ - getNodePosition: getNodePosition, - - /** - * Returns {from, to} position of a link. - */ - getLinkPosition: function (linkId) { - var link = layoutLinks[linkId]; - return { - from : getNodePosition(link.fromId), - to : getNodePosition(link.toId) - }; - }, - - /** - * Sets position of a node to a given coordinates - */ - setNodePosition: function (nodeId, x, y) { - var pos = layoutNodes[nodeId]; - if (pos) { - pos.x = x; - pos.y = y; - } - }, - - // Layout specific methods: - - /** - * Based on argument either update default node placement callback or - * attempts to place given node using current placement callback. - * Setting new node callback triggers position update for all nodes. - * - * @param {Object} newPlaceNodeCallbackOrNode - if it is a function then - * default node placement callback is replaced with new one. Node placement - * callback has a form of function (node) {}, and is expected to return an - * object with x and y properties set to numbers. - * - * Otherwise if it's not a function the argument is treated as graph node - * and current node placement callback will be used to place it. - */ - placeNode : function (newPlaceNodeCallbackOrNode) { - if (typeof newPlaceNodeCallbackOrNode === 'function') { - placeNodeCallback = newPlaceNodeCallbackOrNode; - updateNodePositions(); - return this; - } - - // it is not a request to update placeNodeCallback, trying to place - // a node using current callback: - return placeNodeCallback(newPlaceNodeCallbackOrNode); - } - - }; - - function getNodePosition(nodeId) { - return layoutNodes[nodeId]; - } -} +module.exports = constant; + +var merge = require('ngraph.merge'); +var random = require('ngraph.random').random; +var Rect = require('../Utils/rect.js'); + +/** + * Does not really perform any layouting algorithm but is compliant + * with renderer interface. Allowing clients to provide specific positioning + * callback and get static layout of the graph + * + * @param {Viva.Graph.graph} graph to layout + * @param {Object} userSettings + */ +function constant(graph, userSettings) { + userSettings = merge(userSettings, { + maxX : 1024, + maxY : 1024, + seed : 'Deterministic randomness made me do this' + }); + // This class simply follows API, it does not use some of the arguments: + /*jshint unused: false */ + var rand = random(userSettings.seed), + graphRect = new Rect(Number.MAX_VALUE, Number.MAX_VALUE, Number.MIN_VALUE, Number.MIN_VALUE), + layoutLinks = {}, + + placeNodeCallback = function (node) { + return { + x: rand.next(userSettings.maxX), + y: rand.next(userSettings.maxY) + }; + }, + + updateGraphRect = function (position, graphRect) { + if (position.x < graphRect.x1) { graphRect.x1 = position.x; } + if (position.x > graphRect.x2) { graphRect.x2 = position.x; } + if (position.y < graphRect.y1) { graphRect.y1 = position.y; } + if (position.y > graphRect.y2) { graphRect.y2 = position.y; } + }, + + layoutNodes = typeof Object.create === 'function' ? Object.create(null) : {}, + + ensureNodeInitialized = function (node) { + layoutNodes[node.id] = placeNodeCallback(node); + updateGraphRect(layoutNodes[node.id], graphRect); + }, + + updateNodePositions = function () { + if (graph.getNodesCount() === 0) { return; } + + graphRect.x1 = Number.MAX_VALUE; + graphRect.y1 = Number.MAX_VALUE; + graphRect.x2 = Number.MIN_VALUE; + graphRect.y2 = Number.MIN_VALUE; + + graph.forEachNode(ensureNodeInitialized); + }, + + ensureLinkInitialized = function (link) { + layoutLinks[link.id] = link; + }, + + onGraphChanged = function(changes) { + for (var i = 0; i < changes.length; ++i) { + var change = changes[i]; + if (change.node) { + if (change.changeType === 'add') { + ensureNodeInitialized(change.node); + } else { + delete layoutNodes[change.node.id]; + } + } if (change.link) { + if (change.changeType === 'add') { + ensureLinkInitialized(change.link); + } else { + delete layoutLinks[change.link.id]; + } + } + } + }; + + graph.forEachNode(ensureNodeInitialized); + graph.forEachLink(ensureLinkInitialized); + graph.on('changed', onGraphChanged); + + return { + /** + * Attempts to layout graph within given number of iterations. + * + * @param {integer} [iterationsCount] number of algorithm's iterations. + * The constant layout ignores this parameter. + */ + run : function (iterationsCount) { + this.step(); + }, + + /** + * One step of layout algorithm. + */ + step : function () { + updateNodePositions(); + + return true; // no need to continue. + }, + + /** + * Returns rectangle structure {x1, y1, x2, y2}, which represents + * current space occupied by graph. + */ + getGraphRect : function () { + return graphRect; + }, + + /** + * Request to release all resources + */ + dispose : function () { + graph.off('change', onGraphChanged); + }, + + /* + * Checks whether given node is pinned; all nodes in this layout are pinned. + */ + isNodePinned: function (node) { + return true; + }, + + /* + * Requests layout algorithm to pin/unpin node to its current position + * Pinned nodes should not be affected by layout algorithm and always + * remain at their position + */ + pinNode: function (node, isPinned) { + // noop + }, + + /* + * Gets position of a node by its id. If node was not seen by this + * layout algorithm undefined value is returned; + */ + getNodePosition: getNodePosition, + + /** + * Returns {from, to} position of a link. + */ + getLinkPosition: function (linkId) { + var link = layoutLinks[linkId]; + return { + from : getNodePosition(link.fromId), + to : getNodePosition(link.toId) + }; + }, + + /** + * Sets position of a node to a given coordinates + */ + setNodePosition: function (nodeId, x, y) { + var pos = layoutNodes[nodeId]; + if (pos) { + pos.x = x; + pos.y = y; + } + }, + + // Layout specific methods: + + /** + * Based on argument either update default node placement callback or + * attempts to place given node using current placement callback. + * Setting new node callback triggers position update for all nodes. + * + * @param {Object} newPlaceNodeCallbackOrNode - if it is a function then + * default node placement callback is replaced with new one. Node placement + * callback has a form of function (node) {}, and is expected to return an + * object with x and y properties set to numbers. + * + * Otherwise if it's not a function the argument is treated as graph node + * and current node placement callback will be used to place it. + */ + placeNode : function (newPlaceNodeCallbackOrNode) { + if (typeof newPlaceNodeCallbackOrNode === 'function') { + placeNodeCallback = newPlaceNodeCallbackOrNode; + updateNodePositions(); + return this; + } + + // it is not a request to update placeNodeCallback, trying to place + // a node using current callback: + return placeNodeCallback(newPlaceNodeCallbackOrNode); + } + + }; + + function getNodePosition(nodeId) { + return layoutNodes[nodeId]; + } +} },{"../Utils/rect.js":45,"ngraph.merge":13,"ngraph.random":26}],38:[function(require,module,exports){ -/** - * This module provides compatibility layer with 0.6.x library. It will be - * removed in the next version - */ - -var events = require('ngraph.events'); - -module.exports = backwardCompatibleEvents; - -function backwardCompatibleEvents(g) { - console.log("This method is deprecated. Please use Viva.events() instead"); - - if (!g) { - return g; - } - - var eventsDefined = (g.on !== undefined) || - (g.off !== undefined) || - (g.fire !== undefined); - - if (eventsDefined) { - // events already defined, ignore - return { - extend: function() { - return g; - }, - on: g.on, - stop: g.off - }; - } - - return { - extend: extend, - on: g.on, - stop: g.off - }; - - function extend() { - var backwardCompatible = events(g); - backwardCompatible.addEventListener = backwardCompatible.on; - return backwardCompatible; - } -} +/** + * This module provides compatibility layer with 0.6.x library. It will be + * removed in the next version + */ + +var events = require('ngraph.events'); + +module.exports = backwardCompatibleEvents; + +function backwardCompatibleEvents(g) { + console.log("This method is deprecated. Please use Viva.events() instead"); + + if (!g) { + return g; + } + + var eventsDefined = (g.on !== undefined) || + (g.off !== undefined) || + (g.fire !== undefined); + + if (eventsDefined) { + // events already defined, ignore + return { + extend: function() { + return g; + }, + on: g.on, + stop: g.off + }; + } + + return { + extend: extend, + on: g.on, + stop: g.off + }; + + function extend() { + var backwardCompatible = events(g); + backwardCompatible.addEventListener = backwardCompatible.on; + return backwardCompatible; + } +} },{"ngraph.events":7}],39:[function(require,module,exports){ module.exports = browserInfo(); @@ -4001,47 +4001,47 @@ function browserInfo() { } },{}],40:[function(require,module,exports){ -var nullEvents = require('./nullEvents.js'); - -module.exports = createDocumentEvents(); - -function createDocumentEvents() { - if (typeof document === undefined) { - return nullEvents; - } - - return { - on: on, - off: off - }; -} - -function on(eventName, handler) { - document.addEventListener(eventName, handler); -} - -function off(eventName, handler) { - document.removeEventListener(eventName, handler); -} +var nullEvents = require('./nullEvents.js'); + +module.exports = createDocumentEvents(); + +function createDocumentEvents() { + if (typeof document === undefined) { + return nullEvents; + } + + return { + on: on, + off: off + }; +} + +function on(eventName, handler) { + document.addEventListener(eventName, handler); +} + +function off(eventName, handler) { + document.removeEventListener(eventName, handler); +} },{"./nullEvents.js":44}],41:[function(require,module,exports){ -/** - * Finds the absolute position of an element on a page - */ -module.exports = findElementPosition; - -function findElementPosition(obj) { - var curleft = 0, - curtop = 0; - if (obj.offsetParent) { - do { - curleft += obj.offsetLeft; - curtop += obj.offsetTop; - } while ((obj = obj.offsetParent) !== null); - } - - return [curleft, curtop]; -} +/** + * Finds the absolute position of an element on a page + */ +module.exports = findElementPosition; + +function findElementPosition(obj) { + var curleft = 0, + curtop = 0; + if (obj.offsetParent) { + do { + curleft += obj.offsetLeft; + curtop += obj.offsetTop; + } while ((obj = obj.offsetParent) !== null); + } + + return [curleft, curtop]; +} },{}],42:[function(require,module,exports){ module.exports = getDimension; @@ -4066,42 +4066,42 @@ function getDimension(container) { } },{}],43:[function(require,module,exports){ -var intersect = require('gintersect'); - -module.exports = intersectRect; - -function intersectRect(left, top, right, bottom, x1, y1, x2, y2) { - return intersect(left, top, left, bottom, x1, y1, x2, y2) || - intersect(left, bottom, right, bottom, x1, y1, x2, y2) || - intersect(right, bottom, right, top, x1, y1, x2, y2) || - intersect(right, top, left, top, x1, y1, x2, y2); -} +var intersect = require('gintersect'); + +module.exports = intersectRect; + +function intersectRect(left, top, right, bottom, x1, y1, x2, y2) { + return intersect(left, top, left, bottom, x1, y1, x2, y2) || + intersect(left, bottom, right, bottom, x1, y1, x2, y2) || + intersect(right, bottom, right, top, x1, y1, x2, y2) || + intersect(right, top, left, top, x1, y1, x2, y2); +} },{"gintersect":3}],44:[function(require,module,exports){ -module.exports = createNullEvents(); - -function createNullEvents() { - return { - on: noop, - off: noop, - stop: noop - }; -} - -function noop() { } +module.exports = createNullEvents(); + +function createNullEvents() { + return { + on: noop, + off: noop, + stop: noop + }; +} + +function noop() { } },{}],45:[function(require,module,exports){ -module.exports = Rect; - -/** - * Very generic rectangle. - */ -function Rect (x1, y1, x2, y2) { - this.x1 = x1 || 0; - this.y1 = y1 || 0; - this.x2 = x2 || 0; - this.y2 = y2 || 0; -} +module.exports = Rect; + +/** + * Very generic rectangle. + */ +function Rect (x1, y1, x2, y2) { + this.x1 = x1 || 0; + this.y1 = y1 || 0; + this.x2 = x2 || 0; + this.y2 = y2 || 0; +} },{}],46:[function(require,module,exports){ (function (global){ @@ -4200,29 +4200,29 @@ function noop() {} }).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) },{}],47:[function(require,module,exports){ -var nullEvents = require('./nullEvents.js'); - -module.exports = createDocumentEvents(); - -function createDocumentEvents() { - if (typeof window === 'undefined') { - return nullEvents; - } - - return { - on: on, - off: off - }; -} - -function on(eventName, handler) { - window.addEventListener(eventName, handler); -} - -function off(eventName, handler) { - window.removeEventListener(eventName, handler); -} - +var nullEvents = require('./nullEvents.js'); + +module.exports = createDocumentEvents(); + +function createDocumentEvents() { + if (typeof window === 'undefined') { + return nullEvents; + } + + return { + on: on, + off: off + }; +} + +function on(eventName, handler) { + window.addEventListener(eventName, handler); +} + +function off(eventName, handler) { + window.removeEventListener(eventName, handler); +} + },{"./nullEvents.js":44}],48:[function(require,module,exports){ /** @@ -5356,6 +5356,12 @@ function webglGraphics(options) { return this; }, + /** + * Resizes the graphic without resetting the scale. + * Useful with viva graph in a dynamic container + */ + updateSize: updateSize, + /** * Called by Viva.Graph.View.renderer to let concrete graphic output * provider prepare to render. @@ -5646,1282 +5652,1282 @@ function webglGraphics(options) { } },{"../Input/webglInputManager.js":36,"../WebGL/webglLine.js":58,"../WebGL/webglLinkProgram.js":59,"../WebGL/webglNodeProgram.js":60,"../WebGL/webglSquare.js":61,"ngraph.events":7,"ngraph.merge":13}],51:[function(require,module,exports){ -module.exports = parseColor; - -function parseColor(color) { - var parsedColor = 0x009ee8ff; - - if (typeof color === 'string' && color) { - if (color.length === 4) { // #rgb - color = color.replace(/([^#])/g, '$1$1'); // duplicate each letter except first #. - } - if (color.length === 9) { // #rrggbbaa - parsedColor = parseInt(color.substr(1), 16); - } else if (color.length === 7) { // or #rrggbb. - parsedColor = (parseInt(color.substr(1), 16) << 8) | 0xff; - } else { - throw 'Color expected in hex format with preceding "#". E.g. #00ff00. Got value: ' + color; - } - } else if (typeof color === 'number') { - parsedColor = color; - } - - return parsedColor; -} +module.exports = parseColor; + +function parseColor(color) { + var parsedColor = 0x009ee8ff; + + if (typeof color === 'string' && color) { + if (color.length === 4) { // #rgb + color = color.replace(/([^#])/g, '$1$1'); // duplicate each letter except first #. + } + if (color.length === 9) { // #rrggbbaa + parsedColor = parseInt(color.substr(1), 16); + } else if (color.length === 7) { // or #rrggbb. + parsedColor = (parseInt(color.substr(1), 16) << 8) | 0xff; + } else { + throw 'Color expected in hex format with preceding "#". E.g. #00ff00. Got value: ' + color; + } + } else if (typeof color === 'number') { + parsedColor = color; + } + + return parsedColor; +} },{}],52:[function(require,module,exports){ -module.exports = Texture; - -/** - * Single texture in the webglAtlas. - */ -function Texture(size) { - this.canvas = window.document.createElement("canvas"); - this.ctx = this.canvas.getContext("2d"); - this.isDirty = false; - this.canvas.width = this.canvas.height = size; -} +module.exports = Texture; + +/** + * Single texture in the webglAtlas. + */ +function Texture(size) { + this.canvas = window.document.createElement("canvas"); + this.ctx = this.canvas.getContext("2d"); + this.isDirty = false; + this.canvas.width = this.canvas.height = size; +} },{}],53:[function(require,module,exports){ -/** - * @fileOverview Utility functions for webgl rendering. - * - * @author Andrei Kashcha (aka anvaka) / http://anvaka.blogspot.com - */ - -module.exports = webgl; - -function webgl(gl) { - - return { - createProgram: createProgram, - extendArray: extendArray, - copyArrayPart: copyArrayPart, - swapArrayPart: swapArrayPart, - getLocations: getLocations, - context: gl - }; - - function createShader(shaderText, type) { - var shader = gl.createShader(type); - gl.shaderSource(shader, shaderText); - gl.compileShader(shader); - - if (!gl.getShaderParameter(shader, gl.COMPILE_STATUS)) { - var msg = gl.getShaderInfoLog(shader); - window.alert(msg); - throw msg; - } - - return shader; - } - - function createProgram(vertexShaderSrc, fragmentShaderSrc) { - var program = gl.createProgram(); - var vs = createShader(vertexShaderSrc, gl.VERTEX_SHADER); - var fs = createShader(fragmentShaderSrc, gl.FRAGMENT_SHADER); - - gl.attachShader(program, vs); - gl.attachShader(program, fs); - gl.linkProgram(program); - - if (!gl.getProgramParameter(program, gl.LINK_STATUS)) { - var msg = gl.getShaderInfoLog(program); - window.alert(msg); - throw msg; - } - - return program; - } - - function extendArray(buffer, itemsInBuffer, elementsPerItem) { - if ((itemsInBuffer + 1) * elementsPerItem > buffer.length) { - // Every time we run out of space create new array twice bigger. - // TODO: it seems buffer size is limited. Consider using multiple arrays for huge graphs - var extendedArray = new Float32Array(buffer.length * elementsPerItem * 2); - extendedArray.set(buffer); - - return extendedArray; - } - - return buffer; - } - - function getLocations(program, uniformOrAttributeNames) { - var foundLocations = {}; - for (var i = 0; i < uniformOrAttributeNames.length; ++i) { - var name = uniformOrAttributeNames[i]; - var location = -1; - if (name[0] === 'a' && name[1] === '_') { - location = gl.getAttribLocation(program, name); - if (location === -1) { - throw new Error("Program doesn't have required attribute: " + name); - } - - foundLocations[name.slice(2)] = location; - } else if (name[0] === 'u' && name[1] === '_') { - location = gl.getUniformLocation(program, name); - if (location === null) { - throw new Error("Program doesn't have required uniform: " + name); - } - - foundLocations[name.slice(2)] = location; - } else { - throw new Error("Couldn't figure out your intent. All uniforms should start with 'u_' prefix, and attributes with 'a_'"); - } - } - - return foundLocations; - } -} - -function copyArrayPart(array, to, from, elementsCount) { - for (var i = 0; i < elementsCount; ++i) { - array[to + i] = array[from + i]; - } -} - -function swapArrayPart(array, from, to, elementsCount) { - for (var i = 0; i < elementsCount; ++i) { - var tmp = array[from + i]; - array[from + i] = array[to + i]; - array[to + i] = tmp; - } -} +/** + * @fileOverview Utility functions for webgl rendering. + * + * @author Andrei Kashcha (aka anvaka) / http://anvaka.blogspot.com + */ + +module.exports = webgl; + +function webgl(gl) { + + return { + createProgram: createProgram, + extendArray: extendArray, + copyArrayPart: copyArrayPart, + swapArrayPart: swapArrayPart, + getLocations: getLocations, + context: gl + }; + + function createShader(shaderText, type) { + var shader = gl.createShader(type); + gl.shaderSource(shader, shaderText); + gl.compileShader(shader); + + if (!gl.getShaderParameter(shader, gl.COMPILE_STATUS)) { + var msg = gl.getShaderInfoLog(shader); + window.alert(msg); + throw msg; + } + + return shader; + } + + function createProgram(vertexShaderSrc, fragmentShaderSrc) { + var program = gl.createProgram(); + var vs = createShader(vertexShaderSrc, gl.VERTEX_SHADER); + var fs = createShader(fragmentShaderSrc, gl.FRAGMENT_SHADER); + + gl.attachShader(program, vs); + gl.attachShader(program, fs); + gl.linkProgram(program); + + if (!gl.getProgramParameter(program, gl.LINK_STATUS)) { + var msg = gl.getShaderInfoLog(program); + window.alert(msg); + throw msg; + } + + return program; + } + + function extendArray(buffer, itemsInBuffer, elementsPerItem) { + if ((itemsInBuffer + 1) * elementsPerItem > buffer.length) { + // Every time we run out of space create new array twice bigger. + // TODO: it seems buffer size is limited. Consider using multiple arrays for huge graphs + var extendedArray = new Float32Array(buffer.length * elementsPerItem * 2); + extendedArray.set(buffer); + + return extendedArray; + } + + return buffer; + } + + function getLocations(program, uniformOrAttributeNames) { + var foundLocations = {}; + for (var i = 0; i < uniformOrAttributeNames.length; ++i) { + var name = uniformOrAttributeNames[i]; + var location = -1; + if (name[0] === 'a' && name[1] === '_') { + location = gl.getAttribLocation(program, name); + if (location === -1) { + throw new Error("Program doesn't have required attribute: " + name); + } + + foundLocations[name.slice(2)] = location; + } else if (name[0] === 'u' && name[1] === '_') { + location = gl.getUniformLocation(program, name); + if (location === null) { + throw new Error("Program doesn't have required uniform: " + name); + } + + foundLocations[name.slice(2)] = location; + } else { + throw new Error("Couldn't figure out your intent. All uniforms should start with 'u_' prefix, and attributes with 'a_'"); + } + } + + return foundLocations; + } +} + +function copyArrayPart(array, to, from, elementsCount) { + for (var i = 0; i < elementsCount; ++i) { + array[to + i] = array[from + i]; + } +} + +function swapArrayPart(array, from, to, elementsCount) { + for (var i = 0; i < elementsCount; ++i) { + var tmp = array[from + i]; + array[from + i] = array[to + i]; + array[to + i] = tmp; + } +} },{}],54:[function(require,module,exports){ -var Texture = require('./texture.js'); - -module.exports = webglAtlas; - -/** - * My naive implementation of textures atlas. It allows clients to load - * multiple images into atlas and get canvas representing all of them. - * - * @param tilesPerTexture - indicates how many images can be loaded to one - * texture of the atlas. If number of loaded images exceeds this - * parameter a new canvas will be created. - */ -function webglAtlas(tilesPerTexture) { - var tilesPerRow = Math.sqrt(tilesPerTexture || 1024) << 0, - tileSize = tilesPerRow, - lastLoadedIdx = 1, - loadedImages = {}, - dirtyTimeoutId, - skipedDirty = 0, - textures = [], - trackedUrls = []; - - if (!isPowerOf2(tilesPerTexture)) { - throw "Tiles per texture should be power of two."; - } - - // this is the return object - var api = { - /** - * indicates whether atlas has changed texture in it. If true then - * some of the textures has isDirty flag set as well. - */ - isDirty: false, - - /** - * Clears any signs of atlas changes. - */ - clearDirty: clearDirty, - - /** - * Removes given url from collection of tiles in the atlas. - */ - remove: remove, - - /** - * Gets all textures in the atlas. - */ - getTextures: getTextures, - - /** - * Gets coordinates of the given image in the atlas. Coordinates is an object: - * {offset : int } - where offset is an absolute position of the image in the - * atlas. - * - * Absolute means it can be larger than tilesPerTexture parameter, and in that - * case clients should get next texture in getTextures() collection. - */ - getCoordinates: getCoordinates, - - /** - * Asynchronously Loads the image to the atlas. Cross-domain security - * limitation applies. - */ - load: load - }; - - return api; - - function clearDirty() { - var i; - api.isDirty = false; - for (i = 0; i < textures.length; ++i) { - textures[i].isDirty = false; - } - } - - function remove(imgUrl) { - var coordinates = loadedImages[imgUrl]; - if (!coordinates) { - return false; - } - delete loadedImages[imgUrl]; - lastLoadedIdx -= 1; - - - if (lastLoadedIdx === coordinates.offset) { - return true; // Ignore if it's last image in the whole set. - } - - var tileToRemove = getTileCoordinates(coordinates.offset), - lastTileInSet = getTileCoordinates(lastLoadedIdx); - - copy(lastTileInSet, tileToRemove); - - var replacedOffset = loadedImages[trackedUrls[lastLoadedIdx]]; - replacedOffset.offset = coordinates.offset; - trackedUrls[coordinates.offset] = trackedUrls[lastLoadedIdx]; - - markDirty(); - return true; - } - - function getTextures() { - return textures; // I trust you... - } - - function getCoordinates(imgUrl) { - return loadedImages[imgUrl]; - } - - function load(imgUrl, callback) { - if (loadedImages.hasOwnProperty(imgUrl)) { - callback(loadedImages[imgUrl]); - } else { - var img = new window.Image(), - imgId = lastLoadedIdx; - - lastLoadedIdx += 1; - img.crossOrigin = "anonymous"; - img.onload = function() { - markDirty(); - drawAt(imgId, img, callback); - }; - - img.src = imgUrl; - } - } - - function createTexture() { - var texture = new Texture(tilesPerRow * tileSize); - textures.push(texture); - } - - function drawAt(tileNumber, img, callback) { - var tilePosition = getTileCoordinates(tileNumber), - coordinates = { - offset: tileNumber - }; - - if (tilePosition.textureNumber >= textures.length) { - createTexture(); - } - var currentTexture = textures[tilePosition.textureNumber]; - - currentTexture.ctx.drawImage(img, tilePosition.col * tileSize, tilePosition.row * tileSize, tileSize, tileSize); - trackedUrls[tileNumber] = img.src; - - loadedImages[img.src] = coordinates; - currentTexture.isDirty = true; - - callback(coordinates); - } - - function getTileCoordinates(absolutePosition) { - var textureNumber = (absolutePosition / tilesPerTexture) << 0, - localTileNumber = (absolutePosition % tilesPerTexture), - row = (localTileNumber / tilesPerRow) << 0, - col = (localTileNumber % tilesPerRow); - - return { - textureNumber: textureNumber, - row: row, - col: col - }; - } - - function markDirtyNow() { - api.isDirty = true; - skipedDirty = 0; - dirtyTimeoutId = null; - } - - function markDirty() { - // delay this call, since it results in texture reload - if (dirtyTimeoutId) { - window.clearTimeout(dirtyTimeoutId); - skipedDirty += 1; - dirtyTimeoutId = null; - } - - if (skipedDirty > 10) { - markDirtyNow(); - } else { - dirtyTimeoutId = window.setTimeout(markDirtyNow, 400); - } - } - - function copy(from, to) { - var fromCanvas = textures[from.textureNumber].canvas, - toCtx = textures[to.textureNumber].ctx, - x = to.col * tileSize, - y = to.row * tileSize; - - toCtx.drawImage(fromCanvas, from.col * tileSize, from.row * tileSize, tileSize, tileSize, x, y, tileSize, tileSize); - textures[from.textureNumber].isDirty = true; - textures[to.textureNumber].isDirty = true; - } -} - -function isPowerOf2(n) { - return (n & (n - 1)) === 0; -} +var Texture = require('./texture.js'); + +module.exports = webglAtlas; + +/** + * My naive implementation of textures atlas. It allows clients to load + * multiple images into atlas and get canvas representing all of them. + * + * @param tilesPerTexture - indicates how many images can be loaded to one + * texture of the atlas. If number of loaded images exceeds this + * parameter a new canvas will be created. + */ +function webglAtlas(tilesPerTexture) { + var tilesPerRow = Math.sqrt(tilesPerTexture || 1024) << 0, + tileSize = tilesPerRow, + lastLoadedIdx = 1, + loadedImages = {}, + dirtyTimeoutId, + skipedDirty = 0, + textures = [], + trackedUrls = []; + + if (!isPowerOf2(tilesPerTexture)) { + throw "Tiles per texture should be power of two."; + } + + // this is the return object + var api = { + /** + * indicates whether atlas has changed texture in it. If true then + * some of the textures has isDirty flag set as well. + */ + isDirty: false, + + /** + * Clears any signs of atlas changes. + */ + clearDirty: clearDirty, + + /** + * Removes given url from collection of tiles in the atlas. + */ + remove: remove, + + /** + * Gets all textures in the atlas. + */ + getTextures: getTextures, + + /** + * Gets coordinates of the given image in the atlas. Coordinates is an object: + * {offset : int } - where offset is an absolute position of the image in the + * atlas. + * + * Absolute means it can be larger than tilesPerTexture parameter, and in that + * case clients should get next texture in getTextures() collection. + */ + getCoordinates: getCoordinates, + + /** + * Asynchronously Loads the image to the atlas. Cross-domain security + * limitation applies. + */ + load: load + }; + + return api; + + function clearDirty() { + var i; + api.isDirty = false; + for (i = 0; i < textures.length; ++i) { + textures[i].isDirty = false; + } + } + + function remove(imgUrl) { + var coordinates = loadedImages[imgUrl]; + if (!coordinates) { + return false; + } + delete loadedImages[imgUrl]; + lastLoadedIdx -= 1; + + + if (lastLoadedIdx === coordinates.offset) { + return true; // Ignore if it's last image in the whole set. + } + + var tileToRemove = getTileCoordinates(coordinates.offset), + lastTileInSet = getTileCoordinates(lastLoadedIdx); + + copy(lastTileInSet, tileToRemove); + + var replacedOffset = loadedImages[trackedUrls[lastLoadedIdx]]; + replacedOffset.offset = coordinates.offset; + trackedUrls[coordinates.offset] = trackedUrls[lastLoadedIdx]; + + markDirty(); + return true; + } + + function getTextures() { + return textures; // I trust you... + } + + function getCoordinates(imgUrl) { + return loadedImages[imgUrl]; + } + + function load(imgUrl, callback) { + if (loadedImages.hasOwnProperty(imgUrl)) { + callback(loadedImages[imgUrl]); + } else { + var img = new window.Image(), + imgId = lastLoadedIdx; + + lastLoadedIdx += 1; + img.crossOrigin = "anonymous"; + img.onload = function() { + markDirty(); + drawAt(imgId, img, callback); + }; + + img.src = imgUrl; + } + } + + function createTexture() { + var texture = new Texture(tilesPerRow * tileSize); + textures.push(texture); + } + + function drawAt(tileNumber, img, callback) { + var tilePosition = getTileCoordinates(tileNumber), + coordinates = { + offset: tileNumber + }; + + if (tilePosition.textureNumber >= textures.length) { + createTexture(); + } + var currentTexture = textures[tilePosition.textureNumber]; + + currentTexture.ctx.drawImage(img, tilePosition.col * tileSize, tilePosition.row * tileSize, tileSize, tileSize); + trackedUrls[tileNumber] = img.src; + + loadedImages[img.src] = coordinates; + currentTexture.isDirty = true; + + callback(coordinates); + } + + function getTileCoordinates(absolutePosition) { + var textureNumber = (absolutePosition / tilesPerTexture) << 0, + localTileNumber = (absolutePosition % tilesPerTexture), + row = (localTileNumber / tilesPerRow) << 0, + col = (localTileNumber % tilesPerRow); + + return { + textureNumber: textureNumber, + row: row, + col: col + }; + } + + function markDirtyNow() { + api.isDirty = true; + skipedDirty = 0; + dirtyTimeoutId = null; + } + + function markDirty() { + // delay this call, since it results in texture reload + if (dirtyTimeoutId) { + window.clearTimeout(dirtyTimeoutId); + skipedDirty += 1; + dirtyTimeoutId = null; + } + + if (skipedDirty > 10) { + markDirtyNow(); + } else { + dirtyTimeoutId = window.setTimeout(markDirtyNow, 400); + } + } + + function copy(from, to) { + var fromCanvas = textures[from.textureNumber].canvas, + toCtx = textures[to.textureNumber].ctx, + x = to.col * tileSize, + y = to.row * tileSize; + + toCtx.drawImage(fromCanvas, from.col * tileSize, from.row * tileSize, tileSize, tileSize, x, y, tileSize, tileSize); + textures[from.textureNumber].isDirty = true; + textures[to.textureNumber].isDirty = true; + } +} + +function isPowerOf2(n) { + return (n & (n - 1)) === 0; +} },{"./texture.js":52}],55:[function(require,module,exports){ -module.exports = webglImage; - -/** - * Represents a model for image. - */ -function webglImage(size, src) { - return { - /** - * Gets texture index where current image is placed. - */ - _texture : 0, - - /** - * Gets offset in the texture where current image is placed. - */ - _offset : 0, - - /** - * Gets size of the square with the image. - */ - size : typeof size === 'number' ? size : 32, - - /** - * Source of the image. If image is coming not from your domain - * certain origin restrictions applies. - * See http://www.khronos.org/registry/webgl/specs/latest/#4.2 for more details. - */ - src : src - }; -} +module.exports = webglImage; + +/** + * Represents a model for image. + */ +function webglImage(size, src) { + return { + /** + * Gets texture index where current image is placed. + */ + _texture : 0, + + /** + * Gets offset in the texture where current image is placed. + */ + _offset : 0, + + /** + * Gets size of the square with the image. + */ + size : typeof size === 'number' ? size : 32, + + /** + * Source of the image. If image is coming not from your domain + * certain origin restrictions applies. + * See http://www.khronos.org/registry/webgl/specs/latest/#4.2 for more details. + */ + src : src + }; +} },{}],56:[function(require,module,exports){ -/** - * @fileOverview Defines an image nodes for webglGraphics class. - * Shape of nodes is square. - * - * @author Andrei Kashcha (aka anvaka) / http://anvaka.blogspot.com - */ - -var WebglAtlas = require('./webglAtlas.js'); -var glUtils = require('./webgl.js'); - -module.exports = webglImageNodeProgram; - -/** - * Defines simple UI for nodes in webgl renderer. Each node is rendered as an image. - */ -function webglImageNodeProgram() { - // WebGL is gian state machine, we store some properties of the state here: - var ATTRIBUTES_PER_PRIMITIVE = 18; - var nodesFS = createNodeFragmentShader(); - var nodesVS = createNodeVertexShader(); - var tilesPerTexture = 1024; // TODO: Get based on max texture size - var atlas; - var program; - var gl; - var buffer; - var utils; - var locations; - var nodesCount = 0; - var nodes = new Float32Array(64); - var width; - var height; - var transform; - var sizeDirty; - - - return { - load: load, - - /** - * Updates position of current node in the buffer of nodes. - * - * @param idx - index of current node. - * @param pos - new position of the node. - */ - position: position, - - createNode: createNode, - - removeNode: removeNode, - - replaceProperties: replaceProperties, - - updateTransform: updateTransform, - - updateSize: updateSize, - - render: render - }; - - function refreshTexture(texture, idx) { - if (texture.nativeObject) { - gl.deleteTexture(texture.nativeObject); - } - - var nativeObject = gl.createTexture(); - gl.activeTexture(gl["TEXTURE" + idx]); - gl.bindTexture(gl.TEXTURE_2D, nativeObject); - gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, texture.canvas); - gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); - gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR_MIPMAP_NEAREST); - - gl.generateMipmap(gl.TEXTURE_2D); - gl.uniform1i(locations["sampler" + idx], idx); - - texture.nativeObject = nativeObject; - } - - function ensureAtlasTextureUpdated() { - if (atlas.isDirty) { - var textures = atlas.getTextures(), - i; - for (i = 0; i < textures.length; ++i) { - if (textures[i].isDirty || !textures[i].nativeObject) { - refreshTexture(textures[i], i); - } - } - - atlas.clearDirty(); - } - } - - function load(glContext) { - gl = glContext; - utils = glUtils(glContext); - - atlas = new WebglAtlas(tilesPerTexture); - - program = utils.createProgram(nodesVS, nodesFS); - gl.useProgram(program); - locations = utils.getLocations(program, ["a_vertexPos", "a_customAttributes", "u_screenSize", "u_transform", "u_sampler0", "u_sampler1", "u_sampler2", "u_sampler3", "u_tilesPerTexture"]); - - gl.uniform1f(locations.tilesPerTexture, tilesPerTexture); - - gl.enableVertexAttribArray(locations.vertexPos); - gl.enableVertexAttribArray(locations.customAttributes); - - buffer = gl.createBuffer(); - } - - function position(nodeUI, pos) { - var idx = nodeUI.id * ATTRIBUTES_PER_PRIMITIVE; - nodes[idx] = pos.x - nodeUI.size; - nodes[idx + 1] = pos.y - nodeUI.size; - nodes[idx + 2] = nodeUI._offset * 4; - - nodes[idx + 3] = pos.x + nodeUI.size; - nodes[idx + 4] = pos.y - nodeUI.size; - nodes[idx + 5] = nodeUI._offset * 4 + 1; - - nodes[idx + 6] = pos.x - nodeUI.size; - nodes[idx + 7] = pos.y + nodeUI.size; - nodes[idx + 8] = nodeUI._offset * 4 + 2; - - nodes[idx + 9] = pos.x - nodeUI.size; - nodes[idx + 10] = pos.y + nodeUI.size; - nodes[idx + 11] = nodeUI._offset * 4 + 2; - - nodes[idx + 12] = pos.x + nodeUI.size; - nodes[idx + 13] = pos.y - nodeUI.size; - nodes[idx + 14] = nodeUI._offset * 4 + 1; - - nodes[idx + 15] = pos.x + nodeUI.size; - nodes[idx + 16] = pos.y + nodeUI.size; - nodes[idx + 17] = nodeUI._offset * 4 + 3; - } - - function createNode(ui) { - nodes = utils.extendArray(nodes, nodesCount, ATTRIBUTES_PER_PRIMITIVE); - nodesCount += 1; - - var coordinates = atlas.getCoordinates(ui.src); - if (coordinates) { - ui._offset = coordinates.offset; - } else { - ui._offset = 0; - // Image is not yet loaded into the atlas. Reload it: - atlas.load(ui.src, function(coordinates) { - ui._offset = coordinates.offset; - }); - } - } - - function removeNode(nodeUI) { - if (nodesCount > 0) { - nodesCount -= 1; - } - - if (nodeUI.id < nodesCount && nodesCount > 0) { - if (nodeUI.src) { - atlas.remove(nodeUI.src); - } - - utils.copyArrayPart(nodes, nodeUI.id * ATTRIBUTES_PER_PRIMITIVE, nodesCount * ATTRIBUTES_PER_PRIMITIVE, ATTRIBUTES_PER_PRIMITIVE); - } - } - - function replaceProperties(replacedNode, newNode) { - newNode._offset = replacedNode._offset; - } - - function updateTransform(newTransform) { - sizeDirty = true; - transform = newTransform; - } - - function updateSize(w, h) { - width = w; - height = h; - sizeDirty = true; - } - - function render() { - gl.useProgram(program); - gl.bindBuffer(gl.ARRAY_BUFFER, buffer); - gl.bufferData(gl.ARRAY_BUFFER, nodes, gl.DYNAMIC_DRAW); - - if (sizeDirty) { - sizeDirty = false; - gl.uniformMatrix4fv(locations.transform, false, transform); - gl.uniform2f(locations.screenSize, width, height); - } - - gl.vertexAttribPointer(locations.vertexPos, 2, gl.FLOAT, false, 3 * Float32Array.BYTES_PER_ELEMENT, 0); - gl.vertexAttribPointer(locations.customAttributes, 1, gl.FLOAT, false, 3 * Float32Array.BYTES_PER_ELEMENT, 2 * 4); - - ensureAtlasTextureUpdated(); - - gl.drawArrays(gl.TRIANGLES, 0, nodesCount * 6); - } -} - -// TODO: Use glslify for shaders -function createNodeFragmentShader() { - return [ - "precision mediump float;", - "varying vec4 color;", - "varying vec3 vTextureCoord;", - "uniform sampler2D u_sampler0;", - "uniform sampler2D u_sampler1;", - "uniform sampler2D u_sampler2;", - "uniform sampler2D u_sampler3;", - - "void main(void) {", - " if (vTextureCoord.z == 0.) {", - " gl_FragColor = texture2D(u_sampler0, vTextureCoord.xy);", - " } else if (vTextureCoord.z == 1.) {", - " gl_FragColor = texture2D(u_sampler1, vTextureCoord.xy);", - " } else if (vTextureCoord.z == 2.) {", - " gl_FragColor = texture2D(u_sampler2, vTextureCoord.xy);", - " } else if (vTextureCoord.z == 3.) {", - " gl_FragColor = texture2D(u_sampler3, vTextureCoord.xy);", - " } else { gl_FragColor = vec4(0, 1, 0, 1); }", - "}" - ].join("\n"); -} - -function createNodeVertexShader() { - return [ - "attribute vec2 a_vertexPos;", - - "attribute float a_customAttributes;", - "uniform vec2 u_screenSize;", - "uniform mat4 u_transform;", - "uniform float u_tilesPerTexture;", - "varying vec3 vTextureCoord;", - - "void main(void) {", - " gl_Position = u_transform * vec4(a_vertexPos/u_screenSize, 0, 1);", - "float corner = mod(a_customAttributes, 4.);", - "float tileIndex = mod(floor(a_customAttributes / 4.), u_tilesPerTexture);", - "float tilesPerRow = sqrt(u_tilesPerTexture);", - "float tileSize = 1./tilesPerRow;", - "float tileColumn = mod(tileIndex, tilesPerRow);", - "float tileRow = floor(tileIndex/tilesPerRow);", - - "if(corner == 0.0) {", - " vTextureCoord.xy = vec2(0, 1);", - "} else if(corner == 1.0) {", - " vTextureCoord.xy = vec2(1, 1);", - "} else if(corner == 2.0) {", - " vTextureCoord.xy = vec2(0, 0);", - "} else {", - " vTextureCoord.xy = vec2(1, 0);", - "}", - - "vTextureCoord *= tileSize;", - "vTextureCoord.x += tileColumn * tileSize;", - "vTextureCoord.y += tileRow * tileSize;", - "vTextureCoord.z = floor(floor(a_customAttributes / 4.)/u_tilesPerTexture);", - "}" - ].join("\n"); -} +/** + * @fileOverview Defines an image nodes for webglGraphics class. + * Shape of nodes is square. + * + * @author Andrei Kashcha (aka anvaka) / http://anvaka.blogspot.com + */ + +var WebglAtlas = require('./webglAtlas.js'); +var glUtils = require('./webgl.js'); + +module.exports = webglImageNodeProgram; + +/** + * Defines simple UI for nodes in webgl renderer. Each node is rendered as an image. + */ +function webglImageNodeProgram() { + // WebGL is gian state machine, we store some properties of the state here: + var ATTRIBUTES_PER_PRIMITIVE = 18; + var nodesFS = createNodeFragmentShader(); + var nodesVS = createNodeVertexShader(); + var tilesPerTexture = 1024; // TODO: Get based on max texture size + var atlas; + var program; + var gl; + var buffer; + var utils; + var locations; + var nodesCount = 0; + var nodes = new Float32Array(64); + var width; + var height; + var transform; + var sizeDirty; + + + return { + load: load, + + /** + * Updates position of current node in the buffer of nodes. + * + * @param idx - index of current node. + * @param pos - new position of the node. + */ + position: position, + + createNode: createNode, + + removeNode: removeNode, + + replaceProperties: replaceProperties, + + updateTransform: updateTransform, + + updateSize: updateSize, + + render: render + }; + + function refreshTexture(texture, idx) { + if (texture.nativeObject) { + gl.deleteTexture(texture.nativeObject); + } + + var nativeObject = gl.createTexture(); + gl.activeTexture(gl["TEXTURE" + idx]); + gl.bindTexture(gl.TEXTURE_2D, nativeObject); + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, texture.canvas); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR_MIPMAP_NEAREST); + + gl.generateMipmap(gl.TEXTURE_2D); + gl.uniform1i(locations["sampler" + idx], idx); + + texture.nativeObject = nativeObject; + } + + function ensureAtlasTextureUpdated() { + if (atlas.isDirty) { + var textures = atlas.getTextures(), + i; + for (i = 0; i < textures.length; ++i) { + if (textures[i].isDirty || !textures[i].nativeObject) { + refreshTexture(textures[i], i); + } + } + + atlas.clearDirty(); + } + } + + function load(glContext) { + gl = glContext; + utils = glUtils(glContext); + + atlas = new WebglAtlas(tilesPerTexture); + + program = utils.createProgram(nodesVS, nodesFS); + gl.useProgram(program); + locations = utils.getLocations(program, ["a_vertexPos", "a_customAttributes", "u_screenSize", "u_transform", "u_sampler0", "u_sampler1", "u_sampler2", "u_sampler3", "u_tilesPerTexture"]); + + gl.uniform1f(locations.tilesPerTexture, tilesPerTexture); + + gl.enableVertexAttribArray(locations.vertexPos); + gl.enableVertexAttribArray(locations.customAttributes); + + buffer = gl.createBuffer(); + } + + function position(nodeUI, pos) { + var idx = nodeUI.id * ATTRIBUTES_PER_PRIMITIVE; + nodes[idx] = pos.x - nodeUI.size; + nodes[idx + 1] = pos.y - nodeUI.size; + nodes[idx + 2] = nodeUI._offset * 4; + + nodes[idx + 3] = pos.x + nodeUI.size; + nodes[idx + 4] = pos.y - nodeUI.size; + nodes[idx + 5] = nodeUI._offset * 4 + 1; + + nodes[idx + 6] = pos.x - nodeUI.size; + nodes[idx + 7] = pos.y + nodeUI.size; + nodes[idx + 8] = nodeUI._offset * 4 + 2; + + nodes[idx + 9] = pos.x - nodeUI.size; + nodes[idx + 10] = pos.y + nodeUI.size; + nodes[idx + 11] = nodeUI._offset * 4 + 2; + + nodes[idx + 12] = pos.x + nodeUI.size; + nodes[idx + 13] = pos.y - nodeUI.size; + nodes[idx + 14] = nodeUI._offset * 4 + 1; + + nodes[idx + 15] = pos.x + nodeUI.size; + nodes[idx + 16] = pos.y + nodeUI.size; + nodes[idx + 17] = nodeUI._offset * 4 + 3; + } + + function createNode(ui) { + nodes = utils.extendArray(nodes, nodesCount, ATTRIBUTES_PER_PRIMITIVE); + nodesCount += 1; + + var coordinates = atlas.getCoordinates(ui.src); + if (coordinates) { + ui._offset = coordinates.offset; + } else { + ui._offset = 0; + // Image is not yet loaded into the atlas. Reload it: + atlas.load(ui.src, function(coordinates) { + ui._offset = coordinates.offset; + }); + } + } + + function removeNode(nodeUI) { + if (nodesCount > 0) { + nodesCount -= 1; + } + + if (nodeUI.id < nodesCount && nodesCount > 0) { + if (nodeUI.src) { + atlas.remove(nodeUI.src); + } + + utils.copyArrayPart(nodes, nodeUI.id * ATTRIBUTES_PER_PRIMITIVE, nodesCount * ATTRIBUTES_PER_PRIMITIVE, ATTRIBUTES_PER_PRIMITIVE); + } + } + + function replaceProperties(replacedNode, newNode) { + newNode._offset = replacedNode._offset; + } + + function updateTransform(newTransform) { + sizeDirty = true; + transform = newTransform; + } + + function updateSize(w, h) { + width = w; + height = h; + sizeDirty = true; + } + + function render() { + gl.useProgram(program); + gl.bindBuffer(gl.ARRAY_BUFFER, buffer); + gl.bufferData(gl.ARRAY_BUFFER, nodes, gl.DYNAMIC_DRAW); + + if (sizeDirty) { + sizeDirty = false; + gl.uniformMatrix4fv(locations.transform, false, transform); + gl.uniform2f(locations.screenSize, width, height); + } + + gl.vertexAttribPointer(locations.vertexPos, 2, gl.FLOAT, false, 3 * Float32Array.BYTES_PER_ELEMENT, 0); + gl.vertexAttribPointer(locations.customAttributes, 1, gl.FLOAT, false, 3 * Float32Array.BYTES_PER_ELEMENT, 2 * 4); + + ensureAtlasTextureUpdated(); + + gl.drawArrays(gl.TRIANGLES, 0, nodesCount * 6); + } +} + +// TODO: Use glslify for shaders +function createNodeFragmentShader() { + return [ + "precision mediump float;", + "varying vec4 color;", + "varying vec3 vTextureCoord;", + "uniform sampler2D u_sampler0;", + "uniform sampler2D u_sampler1;", + "uniform sampler2D u_sampler2;", + "uniform sampler2D u_sampler3;", + + "void main(void) {", + " if (vTextureCoord.z == 0.) {", + " gl_FragColor = texture2D(u_sampler0, vTextureCoord.xy);", + " } else if (vTextureCoord.z == 1.) {", + " gl_FragColor = texture2D(u_sampler1, vTextureCoord.xy);", + " } else if (vTextureCoord.z == 2.) {", + " gl_FragColor = texture2D(u_sampler2, vTextureCoord.xy);", + " } else if (vTextureCoord.z == 3.) {", + " gl_FragColor = texture2D(u_sampler3, vTextureCoord.xy);", + " } else { gl_FragColor = vec4(0, 1, 0, 1); }", + "}" + ].join("\n"); +} + +function createNodeVertexShader() { + return [ + "attribute vec2 a_vertexPos;", + + "attribute float a_customAttributes;", + "uniform vec2 u_screenSize;", + "uniform mat4 u_transform;", + "uniform float u_tilesPerTexture;", + "varying vec3 vTextureCoord;", + + "void main(void) {", + " gl_Position = u_transform * vec4(a_vertexPos/u_screenSize, 0, 1);", + "float corner = mod(a_customAttributes, 4.);", + "float tileIndex = mod(floor(a_customAttributes / 4.), u_tilesPerTexture);", + "float tilesPerRow = sqrt(u_tilesPerTexture);", + "float tileSize = 1./tilesPerRow;", + "float tileColumn = mod(tileIndex, tilesPerRow);", + "float tileRow = floor(tileIndex/tilesPerRow);", + + "if(corner == 0.0) {", + " vTextureCoord.xy = vec2(0, 1);", + "} else if(corner == 1.0) {", + " vTextureCoord.xy = vec2(1, 1);", + "} else if(corner == 2.0) {", + " vTextureCoord.xy = vec2(0, 0);", + "} else {", + " vTextureCoord.xy = vec2(1, 0);", + "}", + + "vTextureCoord *= tileSize;", + "vTextureCoord.x += tileColumn * tileSize;", + "vTextureCoord.y += tileRow * tileSize;", + "vTextureCoord.z = floor(floor(a_customAttributes / 4.)/u_tilesPerTexture);", + "}" + ].join("\n"); +} },{"./webgl.js":53,"./webglAtlas.js":54}],57:[function(require,module,exports){ -var documentEvents = require('../Utils/documentEvents.js'); - -module.exports = webglInputEvents; - -/** - * Monitors graph-related mouse input in webgl graphics and notifies subscribers. - * - * @param {Viva.Graph.View.webglGraphics} webglGraphics - */ -function webglInputEvents(webglGraphics) { - if (webglGraphics.webglInputEvents) { - // Don't listen twice, if we are already attached to this graphics: - return webglGraphics.webglInputEvents; - } - - var mouseCapturedNode = null, - mouseEnterCallback = [], - mouseLeaveCallback = [], - mouseDownCallback = [], - mouseUpCallback = [], - mouseMoveCallback = [], - clickCallback = [], - dblClickCallback = [], - prevSelectStart, - boundRect; - - var root = webglGraphics.getGraphicsRoot(); - startListen(root); - - var api = { - mouseEnter: mouseEnter, - mouseLeave: mouseLeave, - mouseDown: mouseDown, - mouseUp: mouseUp, - mouseMove: mouseMove, - click: click, - dblClick: dblClick, - mouseCapture: mouseCapture, - releaseMouseCapture: releaseMouseCapture - }; - - // TODO I don't remember why this is needed: - webglGraphics.webglInputEvents = api; - - return api; - - function releaseMouseCapture() { - mouseCapturedNode = null; - } - - function mouseCapture(node) { - mouseCapturedNode = node; - } - - function dblClick(callback) { - if (typeof callback === 'function') { - dblClickCallback.push(callback); - } - return api; - } - - function click(callback) { - if (typeof callback === 'function') { - clickCallback.push(callback); - } - return api; - } - - function mouseMove(callback) { - if (typeof callback === 'function') { - mouseMoveCallback.push(callback); - } - return api; - } - - function mouseUp(callback) { - if (typeof callback === 'function') { - mouseUpCallback.push(callback); - } - return api; - } - - function mouseDown(callback) { - if (typeof callback === 'function') { - mouseDownCallback.push(callback); - } - return api; - } - - function mouseLeave(callback) { - if (typeof callback === 'function') { - mouseLeaveCallback.push(callback); - } - return api; - } - - function mouseEnter(callback) { - if (typeof callback === 'function') { - mouseEnterCallback.push(callback); - } - return api; - } - - function preciseCheck(nodeUI, x, y) { - if (nodeUI && nodeUI.size) { - var pos = nodeUI.position, - half = nodeUI.size; - - return pos.x - half < x && x < pos.x + half && - pos.y - half < y && y < pos.y + half; - } - - return true; - } - - function getNodeAtClientPos(pos) { - return webglGraphics.getNodeAtClientPos(pos, preciseCheck); - } - - function stopPropagation(e) { - if (e.stopPropagation) { - e.stopPropagation(); - } else { - e.cancelBubble = true; - } - } - - function handleDisabledEvent(e) { - stopPropagation(e); - return false; - } - - function invoke(callbacksChain, args) { - var i, stopPropagation; - for (i = 0; i < callbacksChain.length; i += 1) { - stopPropagation = callbacksChain[i].apply(undefined, args); - if (stopPropagation) { - return true; - } - } - } - - function startListen(root) { - var pos = { - x: 0, - y: 0 - }, - lastFound = null, - lastUpdate = 1, - lastClickTime = +new Date(), - - handleMouseMove = function(e) { - invoke(mouseMoveCallback, [lastFound, e]); - pos.x = e.clientX; - pos.y = e.clientY; - }, - - handleMouseUp = function() { - documentEvents.off('mousemove', handleMouseMove); - documentEvents.off('mouseup', handleMouseUp); - }, - - updateBoundRect = function() { - boundRect = root.getBoundingClientRect(); - }; - - window.addEventListener('resize', updateBoundRect); - updateBoundRect(); - - // mouse move inside container serves only to track mouse enter/leave events. - root.addEventListener('mousemove', - function(e) { - if (mouseCapturedNode) { - return; - } - if (lastUpdate++ % 7 === 0) { - // since there is no bullet proof method to detect resize - // event, we preemptively update the bounding rectangle - updateBoundRect(); - lastUpdate = 1; - } - var cancelBubble = false, - node; - - pos.x = e.clientX - boundRect.left; - pos.y = e.clientY - boundRect.top; - - node = getNodeAtClientPos(pos); - - if (node && lastFound !== node) { - lastFound = node; - cancelBubble = cancelBubble || invoke(mouseEnterCallback, [lastFound]); - } else if (node === null && lastFound !== node) { - cancelBubble = cancelBubble || invoke(mouseLeaveCallback, [lastFound]); - lastFound = null; - } - - if (cancelBubble) { - stopPropagation(e); - } - }); - - root.addEventListener('mousedown', - function(e) { - var cancelBubble = false, - args; - updateBoundRect(); - pos.x = e.clientX - boundRect.left; - pos.y = e.clientY - boundRect.top; - - args = [getNodeAtClientPos(pos), e]; - if (args[0]) { - cancelBubble = invoke(mouseDownCallback, args); - // we clicked on a node. Following drag should be handled on document events: - documentEvents.on('mousemove', handleMouseMove); - documentEvents.on('mouseup', handleMouseUp); - - prevSelectStart = window.document.onselectstart; - - window.document.onselectstart = handleDisabledEvent; - - lastFound = args[0]; - } else { - lastFound = null; - } - if (cancelBubble) { - stopPropagation(e); - } - }); - - root.addEventListener('mouseup', - function(e) { - var clickTime = +new Date(), - args; - - pos.x = e.clientX - boundRect.left; - pos.y = e.clientY - boundRect.top; - - var nodeAtClientPos = getNodeAtClientPos(pos); - var sameNode = nodeAtClientPos === lastFound; - args = [nodeAtClientPos || lastFound, e]; - if (args[0]) { - window.document.onselectstart = prevSelectStart; - - if (clickTime - lastClickTime < 400 && sameNode) { - invoke(dblClickCallback, args); - } else { - invoke(clickCallback, args); - } - lastClickTime = clickTime; - - if (invoke(mouseUpCallback, args)) { - stopPropagation(e); - } - } - }); - } -} +var documentEvents = require('../Utils/documentEvents.js'); + +module.exports = webglInputEvents; + +/** + * Monitors graph-related mouse input in webgl graphics and notifies subscribers. + * + * @param {Viva.Graph.View.webglGraphics} webglGraphics + */ +function webglInputEvents(webglGraphics) { + if (webglGraphics.webglInputEvents) { + // Don't listen twice, if we are already attached to this graphics: + return webglGraphics.webglInputEvents; + } + + var mouseCapturedNode = null, + mouseEnterCallback = [], + mouseLeaveCallback = [], + mouseDownCallback = [], + mouseUpCallback = [], + mouseMoveCallback = [], + clickCallback = [], + dblClickCallback = [], + prevSelectStart, + boundRect; + + var root = webglGraphics.getGraphicsRoot(); + startListen(root); + + var api = { + mouseEnter: mouseEnter, + mouseLeave: mouseLeave, + mouseDown: mouseDown, + mouseUp: mouseUp, + mouseMove: mouseMove, + click: click, + dblClick: dblClick, + mouseCapture: mouseCapture, + releaseMouseCapture: releaseMouseCapture + }; + + // TODO I don't remember why this is needed: + webglGraphics.webglInputEvents = api; + + return api; + + function releaseMouseCapture() { + mouseCapturedNode = null; + } + + function mouseCapture(node) { + mouseCapturedNode = node; + } + + function dblClick(callback) { + if (typeof callback === 'function') { + dblClickCallback.push(callback); + } + return api; + } + + function click(callback) { + if (typeof callback === 'function') { + clickCallback.push(callback); + } + return api; + } + + function mouseMove(callback) { + if (typeof callback === 'function') { + mouseMoveCallback.push(callback); + } + return api; + } + + function mouseUp(callback) { + if (typeof callback === 'function') { + mouseUpCallback.push(callback); + } + return api; + } + + function mouseDown(callback) { + if (typeof callback === 'function') { + mouseDownCallback.push(callback); + } + return api; + } + + function mouseLeave(callback) { + if (typeof callback === 'function') { + mouseLeaveCallback.push(callback); + } + return api; + } + + function mouseEnter(callback) { + if (typeof callback === 'function') { + mouseEnterCallback.push(callback); + } + return api; + } + + function preciseCheck(nodeUI, x, y) { + if (nodeUI && nodeUI.size) { + var pos = nodeUI.position, + half = nodeUI.size; + + return pos.x - half < x && x < pos.x + half && + pos.y - half < y && y < pos.y + half; + } + + return true; + } + + function getNodeAtClientPos(pos) { + return webglGraphics.getNodeAtClientPos(pos, preciseCheck); + } + + function stopPropagation(e) { + if (e.stopPropagation) { + e.stopPropagation(); + } else { + e.cancelBubble = true; + } + } + + function handleDisabledEvent(e) { + stopPropagation(e); + return false; + } + + function invoke(callbacksChain, args) { + var i, stopPropagation; + for (i = 0; i < callbacksChain.length; i += 1) { + stopPropagation = callbacksChain[i].apply(undefined, args); + if (stopPropagation) { + return true; + } + } + } + + function startListen(root) { + var pos = { + x: 0, + y: 0 + }, + lastFound = null, + lastUpdate = 1, + lastClickTime = +new Date(), + + handleMouseMove = function(e) { + invoke(mouseMoveCallback, [lastFound, e]); + pos.x = e.clientX; + pos.y = e.clientY; + }, + + handleMouseUp = function() { + documentEvents.off('mousemove', handleMouseMove); + documentEvents.off('mouseup', handleMouseUp); + }, + + updateBoundRect = function() { + boundRect = root.getBoundingClientRect(); + }; + + window.addEventListener('resize', updateBoundRect); + updateBoundRect(); + + // mouse move inside container serves only to track mouse enter/leave events. + root.addEventListener('mousemove', + function(e) { + if (mouseCapturedNode) { + return; + } + if (lastUpdate++ % 7 === 0) { + // since there is no bullet proof method to detect resize + // event, we preemptively update the bounding rectangle + updateBoundRect(); + lastUpdate = 1; + } + var cancelBubble = false, + node; + + pos.x = e.clientX - boundRect.left; + pos.y = e.clientY - boundRect.top; + + node = getNodeAtClientPos(pos); + + if (node && lastFound !== node) { + lastFound = node; + cancelBubble = cancelBubble || invoke(mouseEnterCallback, [lastFound]); + } else if (node === null && lastFound !== node) { + cancelBubble = cancelBubble || invoke(mouseLeaveCallback, [lastFound]); + lastFound = null; + } + + if (cancelBubble) { + stopPropagation(e); + } + }); + + root.addEventListener('mousedown', + function(e) { + var cancelBubble = false, + args; + updateBoundRect(); + pos.x = e.clientX - boundRect.left; + pos.y = e.clientY - boundRect.top; + + args = [getNodeAtClientPos(pos), e]; + if (args[0]) { + cancelBubble = invoke(mouseDownCallback, args); + // we clicked on a node. Following drag should be handled on document events: + documentEvents.on('mousemove', handleMouseMove); + documentEvents.on('mouseup', handleMouseUp); + + prevSelectStart = window.document.onselectstart; + + window.document.onselectstart = handleDisabledEvent; + + lastFound = args[0]; + } else { + lastFound = null; + } + if (cancelBubble) { + stopPropagation(e); + } + }); + + root.addEventListener('mouseup', + function(e) { + var clickTime = +new Date(), + args; + + pos.x = e.clientX - boundRect.left; + pos.y = e.clientY - boundRect.top; + + var nodeAtClientPos = getNodeAtClientPos(pos); + var sameNode = nodeAtClientPos === lastFound; + args = [nodeAtClientPos || lastFound, e]; + if (args[0]) { + window.document.onselectstart = prevSelectStart; + + if (clickTime - lastClickTime < 400 && sameNode) { + invoke(dblClickCallback, args); + } else { + invoke(clickCallback, args); + } + lastClickTime = clickTime; + + if (invoke(mouseUpCallback, args)) { + stopPropagation(e); + } + } + }); + } +} },{"../Utils/documentEvents.js":40}],58:[function(require,module,exports){ -var parseColor = require('./parseColor.js'); - -module.exports = webglLine; - -/** - * Defines a webgl line. This class has no rendering logic at all, - * it's just passed to corresponding shader and the shader should - * figure out how to render it. - * - */ -function webglLine(color) { - return { - /** - * Gets or sets color of the line. If you set this property externally - * make sure it always come as integer of 0xRRGGBBAA format - */ - color: parseColor(color) - }; -} +var parseColor = require('./parseColor.js'); + +module.exports = webglLine; + +/** + * Defines a webgl line. This class has no rendering logic at all, + * it's just passed to corresponding shader and the shader should + * figure out how to render it. + * + */ +function webglLine(color) { + return { + /** + * Gets or sets color of the line. If you set this property externally + * make sure it always come as integer of 0xRRGGBBAA format + */ + color: parseColor(color) + }; +} },{"./parseColor.js":51}],59:[function(require,module,exports){ -/** - * @fileOverview Defines a naive form of links for webglGraphics class. - * This form allows to change color of links. - **/ - -var glUtils = require('./webgl.js'); - -module.exports = webglLinkProgram; - -/** - * Defines UI for links in webgl renderer. - */ -function webglLinkProgram() { - var ATTRIBUTES_PER_PRIMITIVE = 6, // primitive is Line with two points. Each has x,y and color = 3 * 2 attributes. - BYTES_PER_LINK = 2 * (2 * Float32Array.BYTES_PER_ELEMENT + Uint32Array.BYTES_PER_ELEMENT), // two nodes * (x, y + color) - linksFS = [ - 'precision mediump float;', - 'varying vec4 color;', - 'void main(void) {', - ' gl_FragColor = color;', - '}' - ].join('\n'), - - linksVS = [ - 'attribute vec2 a_vertexPos;', - 'attribute vec4 a_color;', - - 'uniform vec2 u_screenSize;', - 'uniform mat4 u_transform;', - - 'varying vec4 color;', - - 'void main(void) {', - ' gl_Position = u_transform * vec4(a_vertexPos/u_screenSize, 0.0, 1.0);', - ' color = a_color.abgr;', - '}' - ].join('\n'), - - program, - gl, - buffer, - utils, - locations, - linksCount = 0, - frontLinkId, // used to track z-index of links. - storage = new ArrayBuffer(16 * BYTES_PER_LINK), - positions = new Float32Array(storage), - colors = new Uint32Array(storage), - width, - height, - transform, - sizeDirty, - - ensureEnoughStorage = function () { - // TODO: this is a duplicate of webglNodeProgram code. Extract it to webgl.js - if ((linksCount+1)*BYTES_PER_LINK > storage.byteLength) { - // Every time we run out of space create new array twice bigger. - // TODO: it seems buffer size is limited. Consider using multiple arrays for huge graphs - var extendedStorage = new ArrayBuffer(storage.byteLength * 2), - extendedPositions = new Float32Array(extendedStorage), - extendedColors = new Uint32Array(extendedStorage); - - extendedColors.set(colors); // should be enough to copy just one view. - positions = extendedPositions; - colors = extendedColors; - storage = extendedStorage; - } - }; - - return { - load : function (glContext) { - gl = glContext; - utils = glUtils(glContext); - - program = utils.createProgram(linksVS, linksFS); - gl.useProgram(program); - locations = utils.getLocations(program, ['a_vertexPos', 'a_color', 'u_screenSize', 'u_transform']); - - gl.enableVertexAttribArray(locations.vertexPos); - gl.enableVertexAttribArray(locations.color); - - buffer = gl.createBuffer(); - }, - - position: function (linkUi, fromPos, toPos) { - var linkIdx = linkUi.id, - offset = linkIdx * ATTRIBUTES_PER_PRIMITIVE; - positions[offset] = fromPos.x; - positions[offset + 1] = fromPos.y; - colors[offset + 2] = linkUi.color; - - positions[offset + 3] = toPos.x; - positions[offset + 4] = toPos.y; - colors[offset + 5] = linkUi.color; - }, - - createLink : function (ui) { - ensureEnoughStorage(); - - linksCount += 1; - frontLinkId = ui.id; - }, - - removeLink : function (ui) { - if (linksCount > 0) { linksCount -= 1; } - // swap removed link with the last link. This will give us O(1) performance for links removal: - if (ui.id < linksCount && linksCount > 0) { - // using colors as a view to array buffer is okay here. - utils.copyArrayPart(colors, ui.id * ATTRIBUTES_PER_PRIMITIVE, linksCount * ATTRIBUTES_PER_PRIMITIVE, ATTRIBUTES_PER_PRIMITIVE); - } - }, - - updateTransform : function (newTransform) { - sizeDirty = true; - transform = newTransform; - }, - - updateSize : function (w, h) { - width = w; - height = h; - sizeDirty = true; - }, - - render : function () { - gl.useProgram(program); - gl.bindBuffer(gl.ARRAY_BUFFER, buffer); - gl.bufferData(gl.ARRAY_BUFFER, storage, gl.DYNAMIC_DRAW); - - if (sizeDirty) { - sizeDirty = false; - gl.uniformMatrix4fv(locations.transform, false, transform); - gl.uniform2f(locations.screenSize, width, height); - } - - gl.vertexAttribPointer(locations.vertexPos, 2, gl.FLOAT, false, 3 * Float32Array.BYTES_PER_ELEMENT, 0); - gl.vertexAttribPointer(locations.color, 4, gl.UNSIGNED_BYTE, true, 3 * Float32Array.BYTES_PER_ELEMENT, 2 * 4); - - gl.drawArrays(gl.LINES, 0, linksCount * 2); - - frontLinkId = linksCount - 1; - }, - - bringToFront : function (link) { - if (frontLinkId > link.id) { - utils.swapArrayPart(positions, link.id * ATTRIBUTES_PER_PRIMITIVE, frontLinkId * ATTRIBUTES_PER_PRIMITIVE, ATTRIBUTES_PER_PRIMITIVE); - } - if (frontLinkId > 0) { - frontLinkId -= 1; - } - }, - - getFrontLinkId : function () { - return frontLinkId; - } - }; -} +/** + * @fileOverview Defines a naive form of links for webglGraphics class. + * This form allows to change color of links. + **/ + +var glUtils = require('./webgl.js'); + +module.exports = webglLinkProgram; + +/** + * Defines UI for links in webgl renderer. + */ +function webglLinkProgram() { + var ATTRIBUTES_PER_PRIMITIVE = 6, // primitive is Line with two points. Each has x,y and color = 3 * 2 attributes. + BYTES_PER_LINK = 2 * (2 * Float32Array.BYTES_PER_ELEMENT + Uint32Array.BYTES_PER_ELEMENT), // two nodes * (x, y + color) + linksFS = [ + 'precision mediump float;', + 'varying vec4 color;', + 'void main(void) {', + ' gl_FragColor = color;', + '}' + ].join('\n'), + + linksVS = [ + 'attribute vec2 a_vertexPos;', + 'attribute vec4 a_color;', + + 'uniform vec2 u_screenSize;', + 'uniform mat4 u_transform;', + + 'varying vec4 color;', + + 'void main(void) {', + ' gl_Position = u_transform * vec4(a_vertexPos/u_screenSize, 0.0, 1.0);', + ' color = a_color.abgr;', + '}' + ].join('\n'), + + program, + gl, + buffer, + utils, + locations, + linksCount = 0, + frontLinkId, // used to track z-index of links. + storage = new ArrayBuffer(16 * BYTES_PER_LINK), + positions = new Float32Array(storage), + colors = new Uint32Array(storage), + width, + height, + transform, + sizeDirty, + + ensureEnoughStorage = function () { + // TODO: this is a duplicate of webglNodeProgram code. Extract it to webgl.js + if ((linksCount+1)*BYTES_PER_LINK > storage.byteLength) { + // Every time we run out of space create new array twice bigger. + // TODO: it seems buffer size is limited. Consider using multiple arrays for huge graphs + var extendedStorage = new ArrayBuffer(storage.byteLength * 2), + extendedPositions = new Float32Array(extendedStorage), + extendedColors = new Uint32Array(extendedStorage); + + extendedColors.set(colors); // should be enough to copy just one view. + positions = extendedPositions; + colors = extendedColors; + storage = extendedStorage; + } + }; + + return { + load : function (glContext) { + gl = glContext; + utils = glUtils(glContext); + + program = utils.createProgram(linksVS, linksFS); + gl.useProgram(program); + locations = utils.getLocations(program, ['a_vertexPos', 'a_color', 'u_screenSize', 'u_transform']); + + gl.enableVertexAttribArray(locations.vertexPos); + gl.enableVertexAttribArray(locations.color); + + buffer = gl.createBuffer(); + }, + + position: function (linkUi, fromPos, toPos) { + var linkIdx = linkUi.id, + offset = linkIdx * ATTRIBUTES_PER_PRIMITIVE; + positions[offset] = fromPos.x; + positions[offset + 1] = fromPos.y; + colors[offset + 2] = linkUi.color; + + positions[offset + 3] = toPos.x; + positions[offset + 4] = toPos.y; + colors[offset + 5] = linkUi.color; + }, + + createLink : function (ui) { + ensureEnoughStorage(); + + linksCount += 1; + frontLinkId = ui.id; + }, + + removeLink : function (ui) { + if (linksCount > 0) { linksCount -= 1; } + // swap removed link with the last link. This will give us O(1) performance for links removal: + if (ui.id < linksCount && linksCount > 0) { + // using colors as a view to array buffer is okay here. + utils.copyArrayPart(colors, ui.id * ATTRIBUTES_PER_PRIMITIVE, linksCount * ATTRIBUTES_PER_PRIMITIVE, ATTRIBUTES_PER_PRIMITIVE); + } + }, + + updateTransform : function (newTransform) { + sizeDirty = true; + transform = newTransform; + }, + + updateSize : function (w, h) { + width = w; + height = h; + sizeDirty = true; + }, + + render : function () { + gl.useProgram(program); + gl.bindBuffer(gl.ARRAY_BUFFER, buffer); + gl.bufferData(gl.ARRAY_BUFFER, storage, gl.DYNAMIC_DRAW); + + if (sizeDirty) { + sizeDirty = false; + gl.uniformMatrix4fv(locations.transform, false, transform); + gl.uniform2f(locations.screenSize, width, height); + } + + gl.vertexAttribPointer(locations.vertexPos, 2, gl.FLOAT, false, 3 * Float32Array.BYTES_PER_ELEMENT, 0); + gl.vertexAttribPointer(locations.color, 4, gl.UNSIGNED_BYTE, true, 3 * Float32Array.BYTES_PER_ELEMENT, 2 * 4); + + gl.drawArrays(gl.LINES, 0, linksCount * 2); + + frontLinkId = linksCount - 1; + }, + + bringToFront : function (link) { + if (frontLinkId > link.id) { + utils.swapArrayPart(positions, link.id * ATTRIBUTES_PER_PRIMITIVE, frontLinkId * ATTRIBUTES_PER_PRIMITIVE, ATTRIBUTES_PER_PRIMITIVE); + } + if (frontLinkId > 0) { + frontLinkId -= 1; + } + }, + + getFrontLinkId : function () { + return frontLinkId; + } + }; +} },{"./webgl.js":53}],60:[function(require,module,exports){ -/** - * @fileOverview Defines a naive form of nodes for webglGraphics class. - * This form allows to change color of node. Shape of nodes is rectangular. - * - * @author Andrei Kashcha (aka anvaka) / https://github.com/anvaka - */ - -var glUtils = require('./webgl.js'); - -module.exports = webglNodeProgram; - -/** - * Defines simple UI for nodes in webgl renderer. Each node is rendered as square. Color and size can be changed. - */ -function webglNodeProgram() { - var ATTRIBUTES_PER_PRIMITIVE = 4; // Primitive is point, x, y, size, color - // x, y, z - floats, color = uint. - var BYTES_PER_NODE = 3 * Float32Array.BYTES_PER_ELEMENT + Uint32Array.BYTES_PER_ELEMENT; - var nodesFS = [ - 'precision mediump float;', - 'varying vec4 color;', - - 'void main(void) {', - ' gl_FragColor = color;', - '}' - ].join('\n'); - var nodesVS = [ - 'attribute vec3 a_vertexPos;', - 'attribute vec4 a_color;', - 'uniform vec2 u_screenSize;', - 'uniform mat4 u_transform;', - 'varying vec4 color;', - - 'void main(void) {', - ' gl_Position = u_transform * vec4(a_vertexPos.xy/u_screenSize, 0, 1);', - ' gl_PointSize = a_vertexPos.z * u_transform[0][0];', - ' color = a_color.abgr;', - '}' - ].join('\n'); - - var program; - var gl; - var buffer; - var locations; - var utils; - var storage = new ArrayBuffer(16 * BYTES_PER_NODE); - var positions = new Float32Array(storage); - var colors = new Uint32Array(storage); - var nodesCount = 0; - var width; - var height; - var transform; - var sizeDirty; - - return { - load: load, - - /** - * Updates position of node in the buffer of nodes. - * - * @param idx - index of current node. - * @param pos - new position of the node. - */ - position: position, - - updateTransform: updateTransform, - - updateSize: updateSize, - - removeNode: removeNode, - - createNode: createNode, - - replaceProperties: replaceProperties, - - render: render - }; - - function ensureEnoughStorage() { - if ((nodesCount + 1) * BYTES_PER_NODE >= storage.byteLength) { - // Every time we run out of space create new array twice bigger. - // TODO: it seems buffer size is limited. Consider using multiple arrays for huge graphs - var extendedStorage = new ArrayBuffer(storage.byteLength * 2), - extendedPositions = new Float32Array(extendedStorage), - extendedColors = new Uint32Array(extendedStorage); - - extendedColors.set(colors); // should be enough to copy just one view. - positions = extendedPositions; - colors = extendedColors; - storage = extendedStorage; - } - } - - function load(glContext) { - gl = glContext; - utils = glUtils(glContext); - - program = utils.createProgram(nodesVS, nodesFS); - gl.useProgram(program); - locations = utils.getLocations(program, ['a_vertexPos', 'a_color', 'u_screenSize', 'u_transform']); - - gl.enableVertexAttribArray(locations.vertexPos); - gl.enableVertexAttribArray(locations.color); - - buffer = gl.createBuffer(); - } - - function position(nodeUI, pos) { - var idx = nodeUI.id; - - positions[idx * ATTRIBUTES_PER_PRIMITIVE] = pos.x; - positions[idx * ATTRIBUTES_PER_PRIMITIVE + 1] = -pos.y; - positions[idx * ATTRIBUTES_PER_PRIMITIVE + 2] = nodeUI.size; - - colors[idx * ATTRIBUTES_PER_PRIMITIVE + 3] = nodeUI.color; - } - - function updateTransform(newTransform) { - sizeDirty = true; - transform = newTransform; - } - - function updateSize(w, h) { - width = w; - height = h; - sizeDirty = true; - } - - function removeNode(node) { - if (nodesCount > 0) { - nodesCount -= 1; - } - - if (node.id < nodesCount && nodesCount > 0) { - // we can use colors as a 'view' into array array buffer. - utils.copyArrayPart(colors, node.id * ATTRIBUTES_PER_PRIMITIVE, nodesCount * ATTRIBUTES_PER_PRIMITIVE, ATTRIBUTES_PER_PRIMITIVE); - } - } - - function createNode() { - ensureEnoughStorage(); - nodesCount += 1; - } - - function replaceProperties(/* replacedNode, newNode */) {} - - function render() { - gl.useProgram(program); - gl.bindBuffer(gl.ARRAY_BUFFER, buffer); - gl.bufferData(gl.ARRAY_BUFFER, storage, gl.DYNAMIC_DRAW); - - if (sizeDirty) { - sizeDirty = false; - gl.uniformMatrix4fv(locations.transform, false, transform); - gl.uniform2f(locations.screenSize, width, height); - } - - gl.vertexAttribPointer(locations.vertexPos, 3, gl.FLOAT, false, ATTRIBUTES_PER_PRIMITIVE * Float32Array.BYTES_PER_ELEMENT, 0); - gl.vertexAttribPointer(locations.color, 4, gl.UNSIGNED_BYTE, true, ATTRIBUTES_PER_PRIMITIVE * Float32Array.BYTES_PER_ELEMENT, 3 * 4); - - gl.drawArrays(gl.POINTS, 0, nodesCount); - } -} +/** + * @fileOverview Defines a naive form of nodes for webglGraphics class. + * This form allows to change color of node. Shape of nodes is rectangular. + * + * @author Andrei Kashcha (aka anvaka) / https://github.com/anvaka + */ + +var glUtils = require('./webgl.js'); + +module.exports = webglNodeProgram; + +/** + * Defines simple UI for nodes in webgl renderer. Each node is rendered as square. Color and size can be changed. + */ +function webglNodeProgram() { + var ATTRIBUTES_PER_PRIMITIVE = 4; // Primitive is point, x, y, size, color + // x, y, z - floats, color = uint. + var BYTES_PER_NODE = 3 * Float32Array.BYTES_PER_ELEMENT + Uint32Array.BYTES_PER_ELEMENT; + var nodesFS = [ + 'precision mediump float;', + 'varying vec4 color;', + + 'void main(void) {', + ' gl_FragColor = color;', + '}' + ].join('\n'); + var nodesVS = [ + 'attribute vec3 a_vertexPos;', + 'attribute vec4 a_color;', + 'uniform vec2 u_screenSize;', + 'uniform mat4 u_transform;', + 'varying vec4 color;', + + 'void main(void) {', + ' gl_Position = u_transform * vec4(a_vertexPos.xy/u_screenSize, 0, 1);', + ' gl_PointSize = a_vertexPos.z * u_transform[0][0];', + ' color = a_color.abgr;', + '}' + ].join('\n'); + + var program; + var gl; + var buffer; + var locations; + var utils; + var storage = new ArrayBuffer(16 * BYTES_PER_NODE); + var positions = new Float32Array(storage); + var colors = new Uint32Array(storage); + var nodesCount = 0; + var width; + var height; + var transform; + var sizeDirty; + + return { + load: load, + + /** + * Updates position of node in the buffer of nodes. + * + * @param idx - index of current node. + * @param pos - new position of the node. + */ + position: position, + + updateTransform: updateTransform, + + updateSize: updateSize, + + removeNode: removeNode, + + createNode: createNode, + + replaceProperties: replaceProperties, + + render: render + }; + + function ensureEnoughStorage() { + if ((nodesCount + 1) * BYTES_PER_NODE >= storage.byteLength) { + // Every time we run out of space create new array twice bigger. + // TODO: it seems buffer size is limited. Consider using multiple arrays for huge graphs + var extendedStorage = new ArrayBuffer(storage.byteLength * 2), + extendedPositions = new Float32Array(extendedStorage), + extendedColors = new Uint32Array(extendedStorage); + + extendedColors.set(colors); // should be enough to copy just one view. + positions = extendedPositions; + colors = extendedColors; + storage = extendedStorage; + } + } + + function load(glContext) { + gl = glContext; + utils = glUtils(glContext); + + program = utils.createProgram(nodesVS, nodesFS); + gl.useProgram(program); + locations = utils.getLocations(program, ['a_vertexPos', 'a_color', 'u_screenSize', 'u_transform']); + + gl.enableVertexAttribArray(locations.vertexPos); + gl.enableVertexAttribArray(locations.color); + + buffer = gl.createBuffer(); + } + + function position(nodeUI, pos) { + var idx = nodeUI.id; + + positions[idx * ATTRIBUTES_PER_PRIMITIVE] = pos.x; + positions[idx * ATTRIBUTES_PER_PRIMITIVE + 1] = -pos.y; + positions[idx * ATTRIBUTES_PER_PRIMITIVE + 2] = nodeUI.size; + + colors[idx * ATTRIBUTES_PER_PRIMITIVE + 3] = nodeUI.color; + } + + function updateTransform(newTransform) { + sizeDirty = true; + transform = newTransform; + } + + function updateSize(w, h) { + width = w; + height = h; + sizeDirty = true; + } + + function removeNode(node) { + if (nodesCount > 0) { + nodesCount -= 1; + } + + if (node.id < nodesCount && nodesCount > 0) { + // we can use colors as a 'view' into array array buffer. + utils.copyArrayPart(colors, node.id * ATTRIBUTES_PER_PRIMITIVE, nodesCount * ATTRIBUTES_PER_PRIMITIVE, ATTRIBUTES_PER_PRIMITIVE); + } + } + + function createNode() { + ensureEnoughStorage(); + nodesCount += 1; + } + + function replaceProperties(/* replacedNode, newNode */) {} + + function render() { + gl.useProgram(program); + gl.bindBuffer(gl.ARRAY_BUFFER, buffer); + gl.bufferData(gl.ARRAY_BUFFER, storage, gl.DYNAMIC_DRAW); + + if (sizeDirty) { + sizeDirty = false; + gl.uniformMatrix4fv(locations.transform, false, transform); + gl.uniform2f(locations.screenSize, width, height); + } + + gl.vertexAttribPointer(locations.vertexPos, 3, gl.FLOAT, false, ATTRIBUTES_PER_PRIMITIVE * Float32Array.BYTES_PER_ELEMENT, 0); + gl.vertexAttribPointer(locations.color, 4, gl.UNSIGNED_BYTE, true, ATTRIBUTES_PER_PRIMITIVE * Float32Array.BYTES_PER_ELEMENT, 3 * 4); + + gl.drawArrays(gl.POINTS, 0, nodesCount); + } +} },{"./webgl.js":53}],61:[function(require,module,exports){ -var parseColor = require('./parseColor.js'); - -module.exports = webglSquare; - -/** - * Can be used as a callback in the webglGraphics.node() function, to - * create a custom looking node. - * - * @param size - size of the node in pixels. - * @param color - color of the node in '#rrggbbaa' or '#rgb' format. - */ -function webglSquare(size, color) { - return { - /** - * Gets or sets size of the square side. - */ - size: typeof size === 'number' ? size : 10, - - /** - * Gets or sets color of the square. - */ - color: parseColor(color) - }; -} +var parseColor = require('./parseColor.js'); + +module.exports = webglSquare; + +/** + * Can be used as a callback in the webglGraphics.node() function, to + * create a custom looking node. + * + * @param size - size of the node in pixels. + * @param color - color of the node in '#rrggbbaa' or '#rgb' format. + */ +function webglSquare(size, color) { + return { + /** + * Gets or sets size of the square side. + */ + size: typeof size === 'number' ? size : 10, + + /** + * Gets or sets color of the square. + */ + color: parseColor(color) + }; +} },{"./parseColor.js":51}],62:[function(require,module,exports){ -// todo: this should be generated at build time. -module.exports = '0.8.1'; +// todo: this should be generated at build time. +module.exports = '0.8.1'; },{}]},{},[1])(1) }); \ No newline at end of file diff --git a/dist/vivagraph.min.js b/dist/vivagraph.min.js index c84b0b7..bd2b3f4 100644 --- a/dist/vivagraph.min.js +++ b/dist/vivagraph.min.js @@ -1,2 +1,2 @@ !function(e){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=e();else if("function"==typeof define&&define.amd)define([],e);else{var n;"undefined"!=typeof window?n=window:"undefined"!=typeof global?n=global:"undefined"!=typeof self&&(n=self),n.Viva=e()}}(function(){return function e(n,t,r){function o(a,u){if(!t[a]){if(!n[a]){var s="function"==typeof require&&require;if(!u&&s)return s(a,!0);if(i)return i(a,!0);var f=new Error("Cannot find module '"+a+"'");throw f.code="MODULE_NOT_FOUND",f}var c=t[a]={exports:{}};n[a][0].call(c.exports,function(e){var t=n[a][1][e];return o(t?t:e)},c,c.exports,e,n,t,r)}return t[a].exports}for(var i="function"==typeof require&&require,a=0;a=0==m>=4?null:(f=u-i,d=o-a,p=a*i-o*u,v=f*e+d*n+p,g=f*t+d*r+p,0!==v&&0!==g&&v>=0==g>=0?null:(y=s*d-f*c,0===y?null:(x=y<0?-y/2:y/2,x=0,w=c*p-d*l,b.x=(w<0?w-x:w+x)/y,w=f*l-s*p,b.y=(w<0?w-x:w+x)/y,b)))}n.exports=r},{}],4:[function(e,n,t){n.exports.degree=e("./src/degree.js"),n.exports.betweenness=e("./src/betweenness.js")},{"./src/betweenness.js":5,"./src/degree.js":6}],5:[function(e,n,t){function r(e,n){function t(e){g[e]/=2}function r(e){g[e.id]=0}function o(e){s=e.id,u(s),i()}function i(){for(e.forEachNode(a);c.length;){for(var n=c.pop(),t=(1+v[n])/p[n],r=d[n],o=0;o1&&(o=Array.prototype.splice.call(arguments,1));for(var i=0;i0&&o.addLink(i,t-1+r*e),r>0&&o.addLink(i,t+(r-1)*e)}return o}function f(e,n,t){if(e<1||n<1||t<1)throw new Error("Invalid number of nodes in grid3 graph");var r,o,i,a=p();if(1===e&&1===n&&1===t)return a.addNode(0),a;for(i=0;i0&&a.addLink(s,r-1+o*e+u),o>0&&a.addLink(s,r+(o-1)*e+u),i>0&&a.addLink(s,r+o*e+(i-1)*e*n)}return a}function c(e){if(e<0)throw new Error("Invalid number of nodes in balanced tree");var n,t=p(),r=Math.pow(2,e);for(0===e&&t.addNode(1),n=1;n= 0");var n,t=p();for(n=0;n=n)throw new Error("Choose smaller `k`. It cannot be larger than number of nodes `n`");var i,a,u=e("ngraph.random").random(o||42),s=p();for(i=0;i=0&&t.links.splice(n,1)),r&&(n=o(e,r.links),n>=0&&r.links.splice(n,1)),U(e,"remove"),F(),!0}function h(e,n){var t,r=f(e);if(!r)return null;for(t=0;t0&&(O.fire("changed",M),M.length=0)}function P(){return Object.keys?k:j}function k(e){if("function"==typeof e)for(var n=Object.keys(A),t=0;t=0?i:-1,o);return v.push(a),a},getTotalMovement:function(){return x},removeSpring:function(e){if(e){var n=v.indexOf(e);return n>-1?(v.splice(n,1),!0):void 0}},getBestNewBodyPosition:function(e){return h.getBestNewPosition(e)},getBBox:function(){return h.box},gravity:function(e){return void 0!==e?(n.gravity=e,g.options({gravity:e}),this):n.gravity},theta:function(e){return void 0!==e?(n.theta=e,g.options({theta:e}),this):n.theta}};return o(n,w),a(w),w}n.exports=r},{"./lib/bounds":16,"./lib/createBody":17,"./lib/dragForce":18,"./lib/eulerIntegrator":19,"./lib/spring":20,"./lib/springForce":21,"ngraph.events":7,"ngraph.expose":8,"ngraph.merge":13,"ngraph.quadtreebh":22}],16:[function(e,n,t){n.exports=function(n,t){function r(){var e=n.length;if(0!==e){for(var t=Number.MAX_VALUE,r=Number.MAX_VALUE,o=Number.MIN_VALUE,a=Number.MIN_VALUE;e--;){var u=n[e];u.isPinned?(u.pos.x=u.prevPos.x,u.pos.y=u.prevPos.y):(u.prevPos.x=u.pos.x,u.prevPos.y=u.pos.y),u.pos.xo&&(o=u.pos.x),u.pos.ya&&(a=u.pos.y)}i.x1=t,i.x2=o,i.y1=r,i.y2=a}}var o=e("ngraph.random").random(42),i={x1:0,y1:0,x2:0,y2:0};return{box:i,update:r,reset:function(){i.x1=i.y1=0,i.x2=i.y2=0},getBestNewPosition:function(e){var n=i,r=0,a=0;if(e.length){for(var u=0;u1&&(s.velocity.x=c/l,s.velocity.y=d/l),r=n*s.velocity.x,i=n*s.velocity.y,s.pos.x+=r,s.pos.y+=i,o+=Math.abs(r),a+=Math.abs(i)}return(o*o+a*a)/u}n.exports=r},{}],20:[function(e,n,t){function r(e,n,t,r,o){this.from=e,this.to=n,this.length=t,this.coeff=r,this.weight="number"==typeof o?o:1}n.exports=r},{}],21:[function(e,n,t){n.exports=function(n){var t=e("ngraph.merge"),r=e("ngraph.random").random(42),o=e("ngraph.expose");n=t(n,{springCoeff:2e-4,springLength:80});var i={update:function(e){var t=e.from,o=e.to,i=e.length<0?n.springLength:e.length,a=o.pos.x-t.pos.x,u=o.pos.y-t.pos.y,s=Math.sqrt(a*a+u*u);0===s&&(a=(r.nextDouble()-.5)/50,u=(r.nextDouble()-.5)/50,s=Math.sqrt(a*a+u*u));var f=s-i,c=(!e.coeff||e.coeff<0?n.springCoeff:e.coeff)*f/s*e.weight;t.force.x+=c*a,t.force.y+=c*u,o.force.x-=c*a,o.force.y-=c*u}};return o(n,i,["springCoeff","springLength"]),i}},{"ngraph.expose":8,"ngraph.merge":13,"ngraph.random":26}],22:[function(e,n,t){function r(e,n){return 0===n?e.quad0:1===n?e.quad1:2===n?e.quad2:3===n?e.quad3:null}function o(e,n,t){0===n?e.quad0=t:1===n?e.quad1=t:2===n?e.quad2=t:3===n&&(e.quad3=t)}n.exports=function(n){function t(){var e=h[m];return e?(e.quad0=null,e.quad1=null,e.quad2=null,e.quad3=null,e.body=null,e.mass=e.massX=e.massY=0,e.left=e.right=e.top=e.bottom=0):(e=new f,h[m]=e),++m,e}function i(e){var n,t,r,o,i=p,a=0,u=0,f=1,c=0,d=1;for(i[0]=y;f;){var v=i[c],h=v.body;f-=1,c+=1;var m=h!==e;h&&m?(t=h.pos.x-e.pos.x,r=h.pos.y-e.pos.y,o=Math.sqrt(t*t+r*r),0===o&&(t=(s.nextDouble()-.5)/50,r=(s.nextDouble()-.5)/50,o=Math.sqrt(t*t+r*r)),n=l*h.mass*e.mass/(o*o*o),a+=n*t,u+=n*r):m&&(t=v.massX/v.mass-e.pos.x,r=v.massY/v.mass-e.pos.y,o=Math.sqrt(t*t+r*r),0===o&&(t=(s.nextDouble()-.5)/50,r=(s.nextDouble()-.5)/50,o=Math.sqrt(t*t+r*r)),(v.right-v.left)/oi&&(i=f),ca&&(a=c)}var d=i-r,l=a-o;for(d>l?a=o+d:i=r+l,m=0,y=t(),y.left=r,y.right=i,y.top=o,y.bottom=a,n=s-1,n>=0&&(y.body=e[n]);n--;)u(e[n],y)}function u(e){for(v.reset(),v.push(y,e);!v.isEmpty();){var n=v.pop(),i=n.node,a=n.body;if(i.body){var u=i.body;if(i.body=null,d(u.pos,a.pos)){var f=3;do{var c=s.nextDouble(),l=(i.right-i.left)*c,p=(i.bottom-i.top)*c;u.pos.x=i.left+l,u.pos.y=i.top+p,f-=1}while(f>0&&d(u.pos,a.pos));if(0===f&&d(u.pos,a.pos))return}v.push(i,u),v.push(i,a)}else{var g=a.pos.x,h=a.pos.y;i.mass=i.mass+a.mass,i.massX=i.massX+a.mass*g,i.massY=i.massY+a.mass*h;var m=0,x=i.left,w=(i.right+x)/2,b=i.top,E=(i.bottom+b)/2;g>w&&(m+=1,x=w,w=i.right),h>E&&(m+=2,b=E,E=i.bottom);var L=r(i,m);L?v.push(L,a):(L=t(),L.left=x,L.top=b,L.right=w,L.bottom=E,L.body=a,o(i,m,L))}}}n=n||{},n.gravity="number"==typeof n.gravity?n.gravity:-1,n.theta="number"==typeof n.theta?n.theta:.8;var s=e("ngraph.random").random(1984),f=e("./node"),c=e("./insertStack"),d=e("./isSamePosition"),l=n.gravity,p=[],v=new c,g=n.theta,h=[],m=0,y=t();return{insertBodies:a,getRoot:function(){return y},updateBodyForce:i,options:function(e){return e?("number"==typeof e.gravity&&(l=e.gravity),"number"==typeof e.theta&&(g=e.theta),this):{gravity:l,theta:g}}}}},{"./insertStack":23,"./isSamePosition":24,"./node":25,"ngraph.random":26}],23:[function(e,n,t){function r(){this.stack=[],this.popIdx=0}function o(e,n){this.node=e,this.body=n}n.exports=r,r.prototype={isEmpty:function(){return 0===this.popIdx},push:function(e,n){var t=this.stack[this.popIdx];t?(t.node=e,t.body=n):this.stack[this.popIdx]=new o(e,n),++this.popIdx},pop:function(){if(this.popIdx>0)return this.stack[--this.popIdx]},reset:function(){this.popIdx=0}}},{}],24:[function(e,n,t){n.exports=function(e,n){var t=Math.abs(e.x-n.x),r=Math.abs(e.y-n.y);return t<1e-8&&r<1e-8}},{}],25:[function(e,n,t){n.exports=function(){this.body=null,this.quad0=null,this.quad1=null,this.quad2=null,this.quad3=null,this.mass=0,this.massX=0,this.massY=0,this.left=0,this.top=0,this.bottom=0,this.right=0}},{}],26:[function(e,n,t){function r(e){var n="number"==typeof e?e:+new Date,t=function(){return n=n+2127912214+(n<<12)&4294967295,n=4294967295&(3345072700^n^n>>>19),n=n+374761393+(n<<5)&4294967295,n=4294967295&(n+3550635116^n<<9),n=n+4251993797+(n<<3)&4294967295,n=4294967295&(3042594569^n^n>>>16),(268435455&n)/268435456};return{next:function(e){return Math.floor(t()*e)},nextDouble:function(){return t()}}}function o(e,n){var t=n||r();if("function"!=typeof t.next)throw new Error("customRandom does not match expected API: next() function is missing");return{forEach:function(n){var r,o,i;for(r=e.length-1;r>0;--r)o=t.next(r+1),i=e[o],e[o]=e[r],e[r]=i,n(i);e.length&&n(e[0])},shuffle:function(){var n,r,o;for(n=e.length-1;n>0;--n)r=t.next(n+1),o=e[r],e[r]=e[n],e[n]=o;return e}}}n.exports={random:r,randomIterator:o}},{}],27:[function(e,n,t){function r(e,n,t){function r(e){u.nodes.push(s(e))}function o(e){u.links.push(f(e))}function i(e){var n={id:e.id};return void 0!==e.data&&(n.data=e.data),n}function a(e){var n={fromId:e.fromId,toId:e.toId};return void 0!==e.data&&(n.data=e.data),n}var u={nodes:[],links:[]},s=n||i,f=t||a;return e.forEachNode(r),e.forEachLink(o),JSON.stringify(u)}n.exports=r},{}],28:[function(e,n,t){function r(e,n){var t=o(e);if(void 0===n)return t;for(var r=Object.keys(n),i=0;iv&&(r=1),u(e,r,{x:e.touches[0].clientX,y:e.touches[0].clientY}),v=t,m(e),y(e)}},j=function(e){p=!1,o.off("touchmove",k),o.off("touchend",j),o.off("touchcancel",j),c=null,r&&r(e)},A=function(e,t){m(e),y(e),d=t.clientX,l=t.clientY,c=e.target||e.srcElement,n&&n(e,{x:d,y:l}),p||(p=!0,o.on("touchmove",k),o.on("touchend",j),o.on("touchcancel",j))},_=function(e){return 1===e.touches.length?A(e,e.touches[0]):void(2===e.touches.length&&(m(e), -y(e),v=P(e.touches[0],e.touches[1])))};return e.addEventListener("mousedown",b),e.addEventListener("touchstart",_),{onStart:function(e){return n=e,this},onDrag:function(e){return t=e,this},onStop:function(e){return r=e,this},onScroll:function(e){return N(e),this},release:function(){e.removeEventListener("mousedown",b),e.removeEventListener("touchstart",_),o.off("mousemove",w),o.off("mouseup",E),o.off("touchmove",k),o.off("touchend",j),o.off("touchcancel",j),N(null)}}}n.exports=r;var o=e("../Utils/documentEvents.js"),i=e("../Utils/browserInfo.js"),a=e("../Utils/findElementPosition.js")},{"../Utils/browserInfo.js":39,"../Utils/documentEvents.js":40,"../Utils/findElementPosition.js":41}],36:[function(e,n,t){function r(e,n){var t=o(n),r=null,i={},a={x:0,y:0};return t.mouseDown(function(e,n){r=e,a.x=n.clientX,a.y=n.clientY,t.mouseCapture(r);var o=i[e.id];return o&&o.onStart&&o.onStart(n,a),!0}).mouseUp(function(e){t.releaseMouseCapture(r),r=null;var n=i[e.id];return n&&n.onStop&&n.onStop(),!0}).mouseMove(function(e,n){if(r){var t=i[r.id];return t&&t.onDrag&&t.onDrag(n,{x:n.clientX-a.x,y:n.clientY-a.y}),a.x=n.clientX,a.y=n.clientY,!0}}),{bindDragNDrop:function(e,n){i[e.id]=n,n||delete i[e.id]}}}n.exports=r;var o=e("../WebGL/webglInputEvents.js")},{"../WebGL/webglInputEvents.js":57}],37:[function(e,n,t){function r(e,n){function t(e){return d[e]}n=o(n,{maxX:1024,maxY:1024,seed:"Deterministic randomness made me do this"});var r=i(n.seed),u=new a(Number.MAX_VALUE,Number.MAX_VALUE,Number.MIN_VALUE,Number.MIN_VALUE),s={},f=function(e){return{x:r.next(n.maxX),y:r.next(n.maxY)}},c=function(e,n){e.xn.x2&&(n.x2=e.x),e.yn.y2&&(n.y2=e.y)},d="function"==typeof Object.create?Object.create(null):{},l=function(e){d[e.id]=f(e),c(d[e.id],u)},p=function(){0!==e.getNodesCount()&&(u.x1=Number.MAX_VALUE,u.y1=Number.MAX_VALUE,u.x2=Number.MIN_VALUE,u.y2=Number.MIN_VALUE,e.forEachNode(l))},v=function(e){s[e.id]=e},g=function(e){for(var n=0;n=0:"boolean"!=typeof z||z}function r(){G=G||window.document.body,F=F||i(e,{springLength:80,springCoeff:2e-4}),O=O||a(e,{container:G}),n.hasOwnProperty("renderLinks")||(n.renderLinks=!0),n.prerender=n.prerender||0,U=(O.inputManager||s)(e,O)}function l(){O.beginRender(),n.renderLinks&&O.renderLinks(),O.renderNodes(),O.endRender()}function p(){return W=F.step()&&!H,l(),!W}function v(e){return R?void(V+=e):void(e?(V+=e,R=f(function(){return p()},M)):(X=0,V=0,R=f(p,M)))}function g(){J||(W=!1,R.restart())}function h(){if("number"==typeof n.prerender&&n.prerender>0)for(var e=0;e0?n.insertBefore(r,n.firstChild):n.appendChild(r),r},releaseLink:function(e){var t=d[e.id];t&&(n.removeChild(t),delete d[e.id])},addNode:function(e,t){var r=l(e);if(r)return r.position=t,r.node=e,c[e.id]=r,n.appendChild(r),r},releaseNode:function(e){var t=c[e.id];t&&(n.removeChild(t),delete c[e.id])},renderNodes:function(){for(var e in c)if(c.hasOwnProperty(e)){var n=c[e];m.x=n.position.x,m.y=n.position.y,p(n,m,n.node)}},renderLinks:function(){for(var e in d)if(d.hasOwnProperty(e)){var n=d[e];y.x=n.position.from.x,y.y=n.position.from.y,x.x=n.position.to.x,x.y=n.position.to.y,g(n,y,x,n.link)}},getGraphicsRoot:function(e){return"function"==typeof e&&(t?e(t):r=e),t},getSvgRoot:function(){return t}};return i(b),b}n.exports=r;var o=e("simplesvg"),i=e("ngraph.events"),a=e("../Input/domInputManager.js")},{"../Input/domInputManager.js":34,"ngraph.events":7,simplesvg:28}],50:[function(e,n,t){function r(e){e=c(e,{enableBlending:!0,preserveDrawingBuffer:!1,clearColor:!1,clearColorValue:{r:1,g:1,b:1,a:1}});var n,t,r,d,l,p,v,g,h=0,m=0,y=[1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1],x=[],w=[],b={},E={},L=i(),N=a(),P=function(e){return u()},k=function(e){return s(3014898687)},j=function(){L.updateTransform(y),N.updateTransform(y)},A=function(){y=[1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1]},_=function(){n&&t&&(d=t.width=Math.max(n.offsetWidth,1),l=t.height=Math.max(n.offsetHeight,1),r&&r.viewport(0,0,d,l),L&&L.updateSize(d/2,l/2),N&&N.updateSize(d/2,l/2))},I=function(e){e.fire("rescaled")};t=window.document.createElement("canvas");var T={getLinkUI:function(e){return E[e]},getNodeUI:function(e){return b[e]},node:function(e){if("function"==typeof e)return P=e,this},link:function(e){if("function"==typeof e)return k=e,this},placeNode:function(e){return p=e,this},placeLink:function(e){return v=e,this},inputManager:o,beginRender:function(){},endRender:function(){m>0&&L.render(),h>0&&N.render()},bringLinkToFront:function(e){var n,t,r=L.getFrontLinkId();L.bringToFront(e),r>e.id&&(n=e.id,t=w[r],w[r]=w[n],w[r].id=r,w[n]=t,w[n].id=n)},graphCenterChanged:function(e,n){y[12]=2*e/d-1,y[13]=1-2*n/l,j()},addLink:function(e,n){var t=m++,r=k(e);return r.id=t,r.pos=n,L.createLink(r),w[t]=r,E[e.id]=r,r},addNode:function(e,n){var t=h++,r=P(e);return r.id=t,r.position=n,r.node=e,N.createNode(r),x[t]=r,b[e.id]=r,r},translateRel:function(e,n){y[12]+=2*y[0]*e/d/y[0],y[13]-=2*y[5]*n/l/y[5],j()},scale:function(e,n){var t=2*n.x/d-1,r=1-2*n.y/l;return t-=y[12],r-=y[13],y[12]+=t*(1-e),y[13]+=r*(1-e),y[0]*=e,y[5]*=e,j(),I(this),y[0]},resetScale:function(){return A(),r&&(_(),j()),this},init:function(o){var i={};if(e.preserveDrawingBuffer&&(i.preserveDrawingBuffer=!0),n=o,_(),A(),n.appendChild(t),r=t.getContext("experimental-webgl",i),!r){var a="Could not initialize WebGL. Seems like the browser doesn't support it.";throw window.alert(a),a}if(e.enableBlending&&(r.blendFunc(r.SRC_ALPHA,r.ONE_MINUS_SRC_ALPHA),r.enable(r.BLEND)),e.clearColor){var u=e.clearColorValue;r.clearColor(u.r,u.g,u.b,u.a),this.beginRender=function(){r.clear(r.COLOR_BUFFER_BIT)}}L.load(r),L.updateSize(d/2,l/2),N.load(r),N.updateSize(d/2,l/2),j(),"function"==typeof g&&g(t)},release:function(e){t&&e&&e.removeChild(t)},isSupported:function(){var e=window.document.createElement("canvas"),n=e&&e.getContext&&e.getContext("experimental-webgl");return n},releaseLink:function(e){m>0&&(m-=1);var n=E[e.id];delete E[e.id],L.removeLink(n);var t=n.id;if(t0&&(h-=1);var n=b[e.id];delete b[e.id],N.removeNode(n);var t=n.id;if(te.length){var r=new Float32Array(e.length*t*2);return r.set(e),r}return e}function a(n,t){for(var r={},o=0;o=w.length&&s();var i=w[r.textureNumber];i.ctx.drawImage(n,r.col*h,r.row*h,h,h),b[e]=n.src,y[n.src]=o,i.isDirty=!0,t(o)}function c(n){var t=n/e<<0,r=n%e,o=r/g<<0,i=r%g;return{textureNumber:t,row:o,col:i}}function d(){E.isDirty=!0,x=0,v=null}function l(){v&&(window.clearTimeout(v),x+=1,v=null),x>10?d():v=window.setTimeout(d,400)}function p(e,n){var t=w[e.textureNumber].canvas,r=w[n.textureNumber].ctx,o=n.col*h,i=n.row*h;r.drawImage(t,e.col*h,e.row*h,h,h,o,i,h,h),w[e.textureNumber].isDirty=!0,w[n.textureNumber].isDirty=!0}var v,g=Math.sqrt(e||1024)<<0,h=g,m=1,y={},x=0,w=[],b=[];if(!o(e))throw"Tiles per texture should be power of two.";var E={isDirty:!1,clearDirty:n,remove:t,getTextures:r,getCoordinates:a,load:u};return E}function o(e){return 0===(e&e-1)}var i=e("./texture.js");n.exports=r},{"./texture.js":52}],55:[function(e,n,t){function r(e,n){return{_texture:0,_offset:0,size:"number"==typeof e?e:32,src:n}}n.exports=r},{}],56:[function(e,n,t){function r(){function e(e,n){e.nativeObject&&h.deleteTexture(e.nativeObject);var t=h.createTexture();h.activeTexture(h["TEXTURE"+n]),h.bindTexture(h.TEXTURE_2D,t),h.texImage2D(h.TEXTURE_2D,0,h.RGBA,h.RGBA,h.UNSIGNED_BYTE,e.canvas),h.texParameteri(h.TEXTURE_2D,h.TEXTURE_MAG_FILTER,h.LINEAR),h.texParameteri(h.TEXTURE_2D,h.TEXTURE_MIN_FILTER,h.LINEAR_MIPMAP_NEAREST),h.generateMipmap(h.TEXTURE_2D),h.uniform1i(x["sampler"+n],n),e.nativeObject=t}function n(){if(v.isDirty){var n,t=v.getTextures();for(n=0;n0&&(A-=1),e.id0&&(e.src&&v.remove(e.src),y.copyArrayPart(_,e.id*N,A*N,N))}function c(e,n){n._offset=e._offset}function d(e){L=!0,E=e}function l(e,n){w=e,b=n,L=!0}function p(){h.useProgram(g),h.bindBuffer(h.ARRAY_BUFFER,m),h.bufferData(h.ARRAY_BUFFER,_,h.DYNAMIC_DRAW),L&&(L=!1,h.uniformMatrix4fv(x.transform,!1,E),h.uniform2f(x.screenSize,w,b)),h.vertexAttribPointer(x.vertexPos,2,h.FLOAT,!1,3*Float32Array.BYTES_PER_ELEMENT,0),h.vertexAttribPointer(x.customAttributes,1,h.FLOAT,!1,3*Float32Array.BYTES_PER_ELEMENT,8),n(),h.drawArrays(h.TRIANGLES,0,6*A)}var v,g,h,m,y,x,w,b,E,L,N=18,P=o(),k=i(),j=1024,A=0,_=new Float32Array(64);return{load:t,position:r,createNode:s,removeNode:f,replaceProperties:c,updateTransform:d,updateSize:l,render:p}}function o(){return["precision mediump float;","varying vec4 color;","varying vec3 vTextureCoord;","uniform sampler2D u_sampler0;","uniform sampler2D u_sampler1;","uniform sampler2D u_sampler2;","uniform sampler2D u_sampler3;","void main(void) {"," if (vTextureCoord.z == 0.) {"," gl_FragColor = texture2D(u_sampler0, vTextureCoord.xy);"," } else if (vTextureCoord.z == 1.) {"," gl_FragColor = texture2D(u_sampler1, vTextureCoord.xy);"," } else if (vTextureCoord.z == 2.) {"," gl_FragColor = texture2D(u_sampler2, vTextureCoord.xy);"," } else if (vTextureCoord.z == 3.) {"," gl_FragColor = texture2D(u_sampler3, vTextureCoord.xy);"," } else { gl_FragColor = vec4(0, 1, 0, 1); }","}"].join("\n")}function i(){return["attribute vec2 a_vertexPos;","attribute float a_customAttributes;","uniform vec2 u_screenSize;","uniform mat4 u_transform;","uniform float u_tilesPerTexture;","varying vec3 vTextureCoord;","void main(void) {"," gl_Position = u_transform * vec4(a_vertexPos/u_screenSize, 0, 1);","float corner = mod(a_customAttributes, 4.);","float tileIndex = mod(floor(a_customAttributes / 4.), u_tilesPerTexture);","float tilesPerRow = sqrt(u_tilesPerTexture);","float tileSize = 1./tilesPerRow;","float tileColumn = mod(tileIndex, tilesPerRow);","float tileRow = floor(tileIndex/tilesPerRow);","if(corner == 0.0) {"," vTextureCoord.xy = vec2(0, 1);","} else if(corner == 1.0) {"," vTextureCoord.xy = vec2(1, 1);","} else if(corner == 2.0) {"," vTextureCoord.xy = vec2(0, 0);","} else {"," vTextureCoord.xy = vec2(1, 0);","}","vTextureCoord *= tileSize;","vTextureCoord.x += tileColumn * tileSize;","vTextureCoord.y += tileRow * tileSize;","vTextureCoord.z = floor(floor(a_customAttributes / 4.)/u_tilesPerTexture);","}"].join("\n")}var a=e("./webglAtlas.js"),u=e("./webgl.js");n.exports=r},{"./webgl.js":53,"./webglAtlas.js":54}],57:[function(e,n,t){function r(e){function n(){x=null}function t(e){x=e}function r(e){return"function"==typeof e&&k.push(e),A}function i(e){return"function"==typeof e&&P.push(e),A}function a(e){return"function"==typeof e&&N.push(e),A}function u(e){return"function"==typeof e&&L.push(e),A}function s(e){return"function"==typeof e&&E.push(e),A}function f(e){return"function"==typeof e&&b.push(e),A}function c(e){return"function"==typeof e&&w.push(e),A}function d(e,n,t){if(e&&e.size){var r=e.position,o=e.size;return r.x-oh.byteLength){var e=new ArrayBuffer(2*h.byteLength),n=new Float32Array(e),t=new Uint32Array(e);t.set(y),m=n,y=t,h=e}};return{load:function(a){n=a,r=o(a),e=r.createProgram(v,p),n.useProgram(e),i=r.getLocations(e,["a_vertexPos","a_color","u_screenSize","u_transform"]),n.enableVertexAttribArray(i.vertexPos),n.enableVertexAttribArray(i.color),t=n.createBuffer()},position:function(e,n,t){var r=e.id,o=r*d;m[o]=n.x,m[o+1]=n.y,y[o+2]=e.color,m[o+3]=t.x,m[o+4]=t.y,y[o+5]=e.color},createLink:function(e){x(),g+=1,a=e.id},removeLink:function(e){g>0&&(g-=1),e.id0&&r.copyArrayPart(y,e.id*d,g*d,d)},updateTransform:function(e){c=!0,f=e},updateSize:function(e,n){u=e,s=n,c=!0},render:function(){n.useProgram(e),n.bindBuffer(n.ARRAY_BUFFER,t),n.bufferData(n.ARRAY_BUFFER,h,n.DYNAMIC_DRAW),c&&(c=!1,n.uniformMatrix4fv(i.transform,!1,f),n.uniform2f(i.screenSize,u,s)),n.vertexAttribPointer(i.vertexPos,2,n.FLOAT,!1,3*Float32Array.BYTES_PER_ELEMENT,0),n.vertexAttribPointer(i.color,4,n.UNSIGNED_BYTE,!0,3*Float32Array.BYTES_PER_ELEMENT,8),n.drawArrays(n.LINES,0,2*g),a=g-1},bringToFront:function(e){a>e.id&&r.swapArrayPart(m,e.id*d,a*d,d),a>0&&(a-=1)},getFrontLinkId:function(){return a}}}var o=e("./webgl.js");n.exports=r},{"./webgl.js":53}],60:[function(e,n,t){function r(){function e(){if((k+1)*w>=L.byteLength){var e=new ArrayBuffer(2*L.byteLength),n=new Float32Array(e),t=new Uint32Array(e);t.set(P),N=n,P=t,L=e}}function n(e){d=e,v=o(e),c=v.createProgram(E,b),d.useProgram(c),p=v.getLocations(c,["a_vertexPos","a_color","u_screenSize","u_transform"]),d.enableVertexAttribArray(p.vertexPos),d.enableVertexAttribArray(p.color),l=d.createBuffer()}function t(e,n){var t=e.id;N[t*x]=n.x,N[t*x+1]=-n.y,N[t*x+2]=e.size,P[t*x+3]=e.color}function r(e){y=!0,m=e}function i(e,n){g=e,h=n,y=!0}function a(e){k>0&&(k-=1),e.id0&&v.copyArrayPart(P,e.id*x,k*x,x)}function u(){e(),k+=1}function s(){}function f(){d.useProgram(c),d.bindBuffer(d.ARRAY_BUFFER,l),d.bufferData(d.ARRAY_BUFFER,L,d.DYNAMIC_DRAW),y&&(y=!1,d.uniformMatrix4fv(p.transform,!1,m),d.uniform2f(p.screenSize,g,h)),d.vertexAttribPointer(p.vertexPos,3,d.FLOAT,!1,x*Float32Array.BYTES_PER_ELEMENT,0),d.vertexAttribPointer(p.color,4,d.UNSIGNED_BYTE,!0,x*Float32Array.BYTES_PER_ELEMENT,12),d.drawArrays(d.POINTS,0,k)}var c,d,l,p,v,g,h,m,y,x=4,w=3*Float32Array.BYTES_PER_ELEMENT+Uint32Array.BYTES_PER_ELEMENT,b=["precision mediump float;","varying vec4 color;","void main(void) {"," gl_FragColor = color;","}"].join("\n"),E=["attribute vec3 a_vertexPos;","attribute vec4 a_color;","uniform vec2 u_screenSize;","uniform mat4 u_transform;","varying vec4 color;","void main(void) {"," gl_Position = u_transform * vec4(a_vertexPos.xy/u_screenSize, 0, 1);"," gl_PointSize = a_vertexPos.z * u_transform[0][0];"," color = a_color.abgr;","}"].join("\n"),L=new ArrayBuffer(16*w),N=new Float32Array(L),P=new Uint32Array(L),k=0;return{load:n,position:t,updateTransform:r,updateSize:i,removeNode:a,createNode:u,replaceProperties:s,render:f}}var o=e("./webgl.js");n.exports=r},{"./webgl.js":53}],61:[function(e,n,t){function r(e,n){return{size:"number"==typeof e?e:10,color:o(n)}}var o=e("./parseColor.js");n.exports=r},{"./parseColor.js":51}],62:[function(e,n,t){n.exports="0.8.1"},{}]},{},[1])(1)}); \ No newline at end of file +y(e),v=P(e.touches[0],e.touches[1])))};return e.addEventListener("mousedown",b),e.addEventListener("touchstart",_),{onStart:function(e){return n=e,this},onDrag:function(e){return t=e,this},onStop:function(e){return r=e,this},onScroll:function(e){return N(e),this},release:function(){e.removeEventListener("mousedown",b),e.removeEventListener("touchstart",_),o.off("mousemove",w),o.off("mouseup",E),o.off("touchmove",k),o.off("touchend",j),o.off("touchcancel",j),N(null)}}}n.exports=r;var o=e("../Utils/documentEvents.js"),i=e("../Utils/browserInfo.js"),a=e("../Utils/findElementPosition.js")},{"../Utils/browserInfo.js":39,"../Utils/documentEvents.js":40,"../Utils/findElementPosition.js":41}],36:[function(e,n,t){function r(e,n){var t=o(n),r=null,i={},a={x:0,y:0};return t.mouseDown(function(e,n){r=e,a.x=n.clientX,a.y=n.clientY,t.mouseCapture(r);var o=i[e.id];return o&&o.onStart&&o.onStart(n,a),!0}).mouseUp(function(e){t.releaseMouseCapture(r),r=null;var n=i[e.id];return n&&n.onStop&&n.onStop(),!0}).mouseMove(function(e,n){if(r){var t=i[r.id];return t&&t.onDrag&&t.onDrag(n,{x:n.clientX-a.x,y:n.clientY-a.y}),a.x=n.clientX,a.y=n.clientY,!0}}),{bindDragNDrop:function(e,n){i[e.id]=n,n||delete i[e.id]}}}n.exports=r;var o=e("../WebGL/webglInputEvents.js")},{"../WebGL/webglInputEvents.js":57}],37:[function(e,n,t){function r(e,n){function t(e){return d[e]}n=o(n,{maxX:1024,maxY:1024,seed:"Deterministic randomness made me do this"});var r=i(n.seed),u=new a(Number.MAX_VALUE,Number.MAX_VALUE,Number.MIN_VALUE,Number.MIN_VALUE),s={},f=function(e){return{x:r.next(n.maxX),y:r.next(n.maxY)}},c=function(e,n){e.xn.x2&&(n.x2=e.x),e.yn.y2&&(n.y2=e.y)},d="function"==typeof Object.create?Object.create(null):{},l=function(e){d[e.id]=f(e),c(d[e.id],u)},p=function(){0!==e.getNodesCount()&&(u.x1=Number.MAX_VALUE,u.y1=Number.MAX_VALUE,u.x2=Number.MIN_VALUE,u.y2=Number.MIN_VALUE,e.forEachNode(l))},v=function(e){s[e.id]=e},g=function(e){for(var n=0;n=0:"boolean"!=typeof z||z}function r(){G=G||window.document.body,F=F||i(e,{springLength:80,springCoeff:2e-4}),O=O||a(e,{container:G}),n.hasOwnProperty("renderLinks")||(n.renderLinks=!0),n.prerender=n.prerender||0,U=(O.inputManager||s)(e,O)}function l(){O.beginRender(),n.renderLinks&&O.renderLinks(),O.renderNodes(),O.endRender()}function p(){return W=F.step()&&!H,l(),!W}function v(e){return R?void(V+=e):void(e?(V+=e,R=f(function(){return p()},M)):(X=0,V=0,R=f(p,M)))}function g(){J||(W=!1,R.restart())}function h(){if("number"==typeof n.prerender&&n.prerender>0)for(var e=0;e0?n.insertBefore(r,n.firstChild):n.appendChild(r),r},releaseLink:function(e){var t=d[e.id];t&&(n.removeChild(t),delete d[e.id])},addNode:function(e,t){var r=l(e);if(r)return r.position=t,r.node=e,c[e.id]=r,n.appendChild(r),r},releaseNode:function(e){var t=c[e.id];t&&(n.removeChild(t),delete c[e.id])},renderNodes:function(){for(var e in c)if(c.hasOwnProperty(e)){var n=c[e];m.x=n.position.x,m.y=n.position.y,p(n,m,n.node)}},renderLinks:function(){for(var e in d)if(d.hasOwnProperty(e)){var n=d[e];y.x=n.position.from.x,y.y=n.position.from.y,x.x=n.position.to.x,x.y=n.position.to.y,g(n,y,x,n.link)}},getGraphicsRoot:function(e){return"function"==typeof e&&(t?e(t):r=e),t},getSvgRoot:function(){return t}};return i(b),b}n.exports=r;var o=e("simplesvg"),i=e("ngraph.events"),a=e("../Input/domInputManager.js")},{"../Input/domInputManager.js":34,"ngraph.events":7,simplesvg:28}],50:[function(e,n,t){function r(e){e=c(e,{enableBlending:!0,preserveDrawingBuffer:!1,clearColor:!1,clearColorValue:{r:1,g:1,b:1,a:1}});var n,t,r,d,l,p,v,g,h=0,m=0,y=[1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1],x=[],w=[],b={},E={},L=i(),N=a(),P=function(e){return u()},k=function(e){return s(3014898687)},j=function(){L.updateTransform(y),N.updateTransform(y)},A=function(){y=[1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1]},_=function(){n&&t&&(d=t.width=Math.max(n.offsetWidth,1),l=t.height=Math.max(n.offsetHeight,1),r&&r.viewport(0,0,d,l),L&&L.updateSize(d/2,l/2),N&&N.updateSize(d/2,l/2))},I=function(e){e.fire("rescaled")};t=window.document.createElement("canvas");var T={getLinkUI:function(e){return E[e]},getNodeUI:function(e){return b[e]},node:function(e){if("function"==typeof e)return P=e,this},link:function(e){if("function"==typeof e)return k=e,this},placeNode:function(e){return p=e,this},placeLink:function(e){return v=e,this},inputManager:o,beginRender:function(){},endRender:function(){m>0&&L.render(),h>0&&N.render()},bringLinkToFront:function(e){var n,t,r=L.getFrontLinkId();L.bringToFront(e),r>e.id&&(n=e.id,t=w[r],w[r]=w[n],w[r].id=r,w[n]=t,w[n].id=n)},graphCenterChanged:function(e,n){y[12]=2*e/d-1,y[13]=1-2*n/l,j()},addLink:function(e,n){var t=m++,r=k(e);return r.id=t,r.pos=n,L.createLink(r),w[t]=r,E[e.id]=r,r},addNode:function(e,n){var t=h++,r=P(e);return r.id=t,r.position=n,r.node=e,N.createNode(r),x[t]=r,b[e.id]=r,r},translateRel:function(e,n){y[12]+=2*y[0]*e/d/y[0],y[13]-=2*y[5]*n/l/y[5],j()},scale:function(e,n){var t=2*n.x/d-1,r=1-2*n.y/l;return t-=y[12],r-=y[13],y[12]+=t*(1-e),y[13]+=r*(1-e),y[0]*=e,y[5]*=e,j(),I(this),y[0]},resetScale:function(){return A(),r&&(_(),j()),this},updateSize:_,init:function(o){var i={};if(e.preserveDrawingBuffer&&(i.preserveDrawingBuffer=!0),n=o,_(),A(),n.appendChild(t),r=t.getContext("experimental-webgl",i),!r){var a="Could not initialize WebGL. Seems like the browser doesn't support it.";throw window.alert(a),a}if(e.enableBlending&&(r.blendFunc(r.SRC_ALPHA,r.ONE_MINUS_SRC_ALPHA),r.enable(r.BLEND)),e.clearColor){var u=e.clearColorValue;r.clearColor(u.r,u.g,u.b,u.a),this.beginRender=function(){r.clear(r.COLOR_BUFFER_BIT)}}L.load(r),L.updateSize(d/2,l/2),N.load(r),N.updateSize(d/2,l/2),j(),"function"==typeof g&&g(t)},release:function(e){t&&e&&e.removeChild(t)},isSupported:function(){var e=window.document.createElement("canvas"),n=e&&e.getContext&&e.getContext("experimental-webgl");return n},releaseLink:function(e){m>0&&(m-=1);var n=E[e.id];delete E[e.id],L.removeLink(n);var t=n.id;if(t0&&(h-=1);var n=b[e.id];delete b[e.id],N.removeNode(n);var t=n.id;if(te.length){var r=new Float32Array(e.length*t*2);return r.set(e),r}return e}function a(n,t){for(var r={},o=0;o=w.length&&s();var i=w[r.textureNumber];i.ctx.drawImage(n,r.col*h,r.row*h,h,h),b[e]=n.src,y[n.src]=o,i.isDirty=!0,t(o)}function c(n){var t=n/e<<0,r=n%e,o=r/g<<0,i=r%g;return{textureNumber:t,row:o,col:i}}function d(){E.isDirty=!0,x=0,v=null}function l(){v&&(window.clearTimeout(v),x+=1,v=null),x>10?d():v=window.setTimeout(d,400)}function p(e,n){var t=w[e.textureNumber].canvas,r=w[n.textureNumber].ctx,o=n.col*h,i=n.row*h;r.drawImage(t,e.col*h,e.row*h,h,h,o,i,h,h),w[e.textureNumber].isDirty=!0,w[n.textureNumber].isDirty=!0}var v,g=Math.sqrt(e||1024)<<0,h=g,m=1,y={},x=0,w=[],b=[];if(!o(e))throw"Tiles per texture should be power of two.";var E={isDirty:!1,clearDirty:n,remove:t,getTextures:r,getCoordinates:a,load:u};return E}function o(e){return 0===(e&e-1)}var i=e("./texture.js");n.exports=r},{"./texture.js":52}],55:[function(e,n,t){function r(e,n){return{_texture:0,_offset:0,size:"number"==typeof e?e:32,src:n}}n.exports=r},{}],56:[function(e,n,t){function r(){function e(e,n){e.nativeObject&&h.deleteTexture(e.nativeObject);var t=h.createTexture();h.activeTexture(h["TEXTURE"+n]),h.bindTexture(h.TEXTURE_2D,t),h.texImage2D(h.TEXTURE_2D,0,h.RGBA,h.RGBA,h.UNSIGNED_BYTE,e.canvas),h.texParameteri(h.TEXTURE_2D,h.TEXTURE_MAG_FILTER,h.LINEAR),h.texParameteri(h.TEXTURE_2D,h.TEXTURE_MIN_FILTER,h.LINEAR_MIPMAP_NEAREST),h.generateMipmap(h.TEXTURE_2D),h.uniform1i(x["sampler"+n],n),e.nativeObject=t}function n(){if(v.isDirty){var n,t=v.getTextures();for(n=0;n0&&(A-=1),e.id0&&(e.src&&v.remove(e.src),y.copyArrayPart(_,e.id*N,A*N,N))}function c(e,n){n._offset=e._offset}function d(e){L=!0,E=e}function l(e,n){w=e,b=n,L=!0}function p(){h.useProgram(g),h.bindBuffer(h.ARRAY_BUFFER,m),h.bufferData(h.ARRAY_BUFFER,_,h.DYNAMIC_DRAW),L&&(L=!1,h.uniformMatrix4fv(x.transform,!1,E),h.uniform2f(x.screenSize,w,b)),h.vertexAttribPointer(x.vertexPos,2,h.FLOAT,!1,3*Float32Array.BYTES_PER_ELEMENT,0),h.vertexAttribPointer(x.customAttributes,1,h.FLOAT,!1,3*Float32Array.BYTES_PER_ELEMENT,8),n(),h.drawArrays(h.TRIANGLES,0,6*A)}var v,g,h,m,y,x,w,b,E,L,N=18,P=o(),k=i(),j=1024,A=0,_=new Float32Array(64);return{load:t,position:r,createNode:s,removeNode:f,replaceProperties:c,updateTransform:d,updateSize:l,render:p}}function o(){return["precision mediump float;","varying vec4 color;","varying vec3 vTextureCoord;","uniform sampler2D u_sampler0;","uniform sampler2D u_sampler1;","uniform sampler2D u_sampler2;","uniform sampler2D u_sampler3;","void main(void) {"," if (vTextureCoord.z == 0.) {"," gl_FragColor = texture2D(u_sampler0, vTextureCoord.xy);"," } else if (vTextureCoord.z == 1.) {"," gl_FragColor = texture2D(u_sampler1, vTextureCoord.xy);"," } else if (vTextureCoord.z == 2.) {"," gl_FragColor = texture2D(u_sampler2, vTextureCoord.xy);"," } else if (vTextureCoord.z == 3.) {"," gl_FragColor = texture2D(u_sampler3, vTextureCoord.xy);"," } else { gl_FragColor = vec4(0, 1, 0, 1); }","}"].join("\n")}function i(){return["attribute vec2 a_vertexPos;","attribute float a_customAttributes;","uniform vec2 u_screenSize;","uniform mat4 u_transform;","uniform float u_tilesPerTexture;","varying vec3 vTextureCoord;","void main(void) {"," gl_Position = u_transform * vec4(a_vertexPos/u_screenSize, 0, 1);","float corner = mod(a_customAttributes, 4.);","float tileIndex = mod(floor(a_customAttributes / 4.), u_tilesPerTexture);","float tilesPerRow = sqrt(u_tilesPerTexture);","float tileSize = 1./tilesPerRow;","float tileColumn = mod(tileIndex, tilesPerRow);","float tileRow = floor(tileIndex/tilesPerRow);","if(corner == 0.0) {"," vTextureCoord.xy = vec2(0, 1);","} else if(corner == 1.0) {"," vTextureCoord.xy = vec2(1, 1);","} else if(corner == 2.0) {"," vTextureCoord.xy = vec2(0, 0);","} else {"," vTextureCoord.xy = vec2(1, 0);","}","vTextureCoord *= tileSize;","vTextureCoord.x += tileColumn * tileSize;","vTextureCoord.y += tileRow * tileSize;","vTextureCoord.z = floor(floor(a_customAttributes / 4.)/u_tilesPerTexture);","}"].join("\n")}var a=e("./webglAtlas.js"),u=e("./webgl.js");n.exports=r},{"./webgl.js":53,"./webglAtlas.js":54}],57:[function(e,n,t){function r(e){function n(){x=null}function t(e){x=e}function r(e){return"function"==typeof e&&k.push(e),A}function i(e){return"function"==typeof e&&P.push(e),A}function a(e){return"function"==typeof e&&N.push(e),A}function u(e){return"function"==typeof e&&L.push(e),A}function s(e){return"function"==typeof e&&E.push(e),A}function f(e){return"function"==typeof e&&b.push(e),A}function c(e){return"function"==typeof e&&w.push(e),A}function d(e,n,t){if(e&&e.size){var r=e.position,o=e.size;return r.x-oh.byteLength){var e=new ArrayBuffer(2*h.byteLength),n=new Float32Array(e),t=new Uint32Array(e);t.set(y),m=n,y=t,h=e}};return{load:function(a){n=a,r=o(a),e=r.createProgram(v,p),n.useProgram(e),i=r.getLocations(e,["a_vertexPos","a_color","u_screenSize","u_transform"]),n.enableVertexAttribArray(i.vertexPos),n.enableVertexAttribArray(i.color),t=n.createBuffer()},position:function(e,n,t){var r=e.id,o=r*d;m[o]=n.x,m[o+1]=n.y,y[o+2]=e.color,m[o+3]=t.x,m[o+4]=t.y,y[o+5]=e.color},createLink:function(e){x(),g+=1,a=e.id},removeLink:function(e){g>0&&(g-=1),e.id0&&r.copyArrayPart(y,e.id*d,g*d,d)},updateTransform:function(e){c=!0,f=e},updateSize:function(e,n){u=e,s=n,c=!0},render:function(){n.useProgram(e),n.bindBuffer(n.ARRAY_BUFFER,t),n.bufferData(n.ARRAY_BUFFER,h,n.DYNAMIC_DRAW),c&&(c=!1,n.uniformMatrix4fv(i.transform,!1,f),n.uniform2f(i.screenSize,u,s)),n.vertexAttribPointer(i.vertexPos,2,n.FLOAT,!1,3*Float32Array.BYTES_PER_ELEMENT,0),n.vertexAttribPointer(i.color,4,n.UNSIGNED_BYTE,!0,3*Float32Array.BYTES_PER_ELEMENT,8),n.drawArrays(n.LINES,0,2*g),a=g-1},bringToFront:function(e){a>e.id&&r.swapArrayPart(m,e.id*d,a*d,d),a>0&&(a-=1)},getFrontLinkId:function(){return a}}}var o=e("./webgl.js");n.exports=r},{"./webgl.js":53}],60:[function(e,n,t){function r(){function e(){if((k+1)*w>=L.byteLength){var e=new ArrayBuffer(2*L.byteLength),n=new Float32Array(e),t=new Uint32Array(e);t.set(P),N=n,P=t,L=e}}function n(e){d=e,v=o(e),c=v.createProgram(E,b),d.useProgram(c),p=v.getLocations(c,["a_vertexPos","a_color","u_screenSize","u_transform"]),d.enableVertexAttribArray(p.vertexPos),d.enableVertexAttribArray(p.color),l=d.createBuffer()}function t(e,n){var t=e.id;N[t*x]=n.x,N[t*x+1]=-n.y,N[t*x+2]=e.size,P[t*x+3]=e.color}function r(e){y=!0,m=e}function i(e,n){g=e,h=n,y=!0}function a(e){k>0&&(k-=1),e.id0&&v.copyArrayPart(P,e.id*x,k*x,x)}function u(){e(),k+=1}function s(){}function f(){d.useProgram(c),d.bindBuffer(d.ARRAY_BUFFER,l),d.bufferData(d.ARRAY_BUFFER,L,d.DYNAMIC_DRAW),y&&(y=!1,d.uniformMatrix4fv(p.transform,!1,m),d.uniform2f(p.screenSize,g,h)),d.vertexAttribPointer(p.vertexPos,3,d.FLOAT,!1,x*Float32Array.BYTES_PER_ELEMENT,0),d.vertexAttribPointer(p.color,4,d.UNSIGNED_BYTE,!0,x*Float32Array.BYTES_PER_ELEMENT,12),d.drawArrays(d.POINTS,0,k)}var c,d,l,p,v,g,h,m,y,x=4,w=3*Float32Array.BYTES_PER_ELEMENT+Uint32Array.BYTES_PER_ELEMENT,b=["precision mediump float;","varying vec4 color;","void main(void) {"," gl_FragColor = color;","}"].join("\n"),E=["attribute vec3 a_vertexPos;","attribute vec4 a_color;","uniform vec2 u_screenSize;","uniform mat4 u_transform;","varying vec4 color;","void main(void) {"," gl_Position = u_transform * vec4(a_vertexPos.xy/u_screenSize, 0, 1);"," gl_PointSize = a_vertexPos.z * u_transform[0][0];"," color = a_color.abgr;","}"].join("\n"),L=new ArrayBuffer(16*w),N=new Float32Array(L),P=new Uint32Array(L),k=0;return{load:n,position:t,updateTransform:r,updateSize:i,removeNode:a,createNode:u,replaceProperties:s,render:f}}var o=e("./webgl.js");n.exports=r},{"./webgl.js":53}],61:[function(e,n,t){function r(e,n){return{size:"number"==typeof e?e:10,color:o(n)}}var o=e("./parseColor.js");n.exports=r},{"./parseColor.js":51}],62:[function(e,n,t){n.exports="0.8.1"},{}]},{},[1])(1)}); \ No newline at end of file diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..549379a --- /dev/null +++ b/package-lock.json @@ -0,0 +1,3681 @@ +{ + "name": "vivagraphjs", + "version": "0.9.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "abbrev": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.0.tgz", + "integrity": "sha1-0FVMIlZjbi9W58LlrRg/hZQo2B8=", + "dev": true + }, + "acorn": { + "version": "4.0.13", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-4.0.13.tgz", + "integrity": "sha1-EFSVrlNh1pe9GVyCUZLhrX8lN4c=", + "dev": true + }, + "add-event-listener": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/add-event-listener/-/add-event-listener-0.0.1.tgz", + "integrity": "sha1-p2Ip68ZMiu+uIEoWJzovJVq+otA=" + }, + "align-text": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz", + "integrity": "sha1-DNkKVhCT810KmSVsIrcGlDP60Rc=", + "dev": true, + "requires": { + "kind-of": "3.2.2", + "longest": "1.0.1", + "repeat-string": "1.6.1" + } + }, + "amdefine": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz", + "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=", + "dev": true + }, + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "archy": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz", + "integrity": "sha1-+cjBN1fMHde8N5rHeyxipcKGjEA=", + "dev": true + }, + "arr-diff": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", + "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", + "dev": true, + "requires": { + "arr-flatten": "1.1.0" + } + }, + "arr-flatten": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", + "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", + "dev": true + }, + "array-differ": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-differ/-/array-differ-1.0.0.tgz", + "integrity": "sha1-7/UuN1gknTO+QCuLuOVkuytdQDE=", + "dev": true + }, + "array-each": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/array-each/-/array-each-1.0.1.tgz", + "integrity": "sha1-p5SvDAWrF1KEbudTofIRoFugxE8=", + "dev": true + }, + "array-slice": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-slice/-/array-slice-1.0.0.tgz", + "integrity": "sha1-5zA08A3MH0CHYAj9IP6ud71LfC8=", + "dev": true + }, + "array-union": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", + "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", + "dev": true, + "requires": { + "array-uniq": "1.0.3" + } + }, + "array-uniq": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", + "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=", + "dev": true + }, + "array-unique": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", + "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=", + "dev": true + }, + "asn1.js": { + "version": "4.9.1", + "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.9.1.tgz", + "integrity": "sha1-SLokC0WpKA6UdImQull9IWYX/UA=", + "dev": true, + "requires": { + "bn.js": "4.11.7", + "inherits": "2.0.3", + "minimalistic-assert": "1.0.0" + } + }, + "assert": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/assert/-/assert-1.3.0.tgz", + "integrity": "sha1-A5OaYiWCqBLMICMgoLmlbJuBWEk=", + "dev": true, + "requires": { + "util": "0.10.3" + } + }, + "astw": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/astw/-/astw-2.2.0.tgz", + "integrity": "sha1-e9QXhNMkk5h66yOba04cV6hzuRc=", + "dev": true, + "requires": { + "acorn": "4.0.13" + } + }, + "async": { + "version": "0.2.10", + "resolved": "https://registry.npmjs.org/async/-/async-0.2.10.tgz", + "integrity": "sha1-trvgsGdLnXGXCMo43owjfLUmw9E=", + "dev": true + }, + "balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", + "dev": true + }, + "Base64": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/Base64/-/Base64-0.2.1.tgz", + "integrity": "sha1-ujpCMHCOGGcFBl5mur3Uw1z2ACg=", + "dev": true + }, + "base64-js": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-0.0.8.tgz", + "integrity": "sha1-EQHpVE9KdrG8OybUUsqW16NeeXg=", + "dev": true + }, + "beeper": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/beeper/-/beeper-1.1.1.tgz", + "integrity": "sha1-5tXqjF2tABMEpwsiY4RH9pyy+Ak=", + "dev": true + }, + "bl": { + "version": "0.9.5", + "resolved": "https://registry.npmjs.org/bl/-/bl-0.9.5.tgz", + "integrity": "sha1-wGt5evCF6gC8Unr8jvzxHeIjIFQ=", + "dev": true, + "requires": { + "readable-stream": "1.0.34" + }, + "dependencies": { + "readable-stream": { + "version": "1.0.34", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", + "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", + "dev": true, + "requires": { + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "0.0.1", + "string_decoder": "0.10.31" + } + } + } + }, + "bn.js": { + "version": "4.11.7", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.7.tgz", + "integrity": "sha512-LxFiV5mefv0ley0SzqkOPR1bC4EbpPx8LkOz5vMe/Yi15t5hzwgO/G+tc7wOtL4PZTYjwHu8JnEiSLumuSjSfA==", + "dev": true + }, + "brace-expansion": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.8.tgz", + "integrity": "sha1-wHshHHyVLsH479Uad+8NHTmQopI=", + "dev": true, + "requires": { + "balanced-match": "1.0.0", + "concat-map": "0.0.1" + } + }, + "braces": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz", + "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", + "dev": true, + "requires": { + "expand-range": "1.8.2", + "preserve": "0.2.0", + "repeat-element": "1.1.2" + } + }, + "brorand": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", + "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=", + "dev": true + }, + "browser-pack": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/browser-pack/-/browser-pack-3.2.0.tgz", + "integrity": "sha1-+qHLxBSHsazEdH43PhFIrf/Q4tk=", + "dev": true, + "requires": { + "combine-source-map": "0.3.0", + "concat-stream": "1.4.10", + "defined": "0.0.0", + "JSONStream": "0.8.4", + "through2": "0.5.1", + "umd": "2.1.0" + }, + "dependencies": { + "readable-stream": { + "version": "1.0.34", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", + "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", + "dev": true, + "requires": { + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "0.0.1", + "string_decoder": "0.10.31" + } + }, + "through2": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/through2/-/through2-0.5.1.tgz", + "integrity": "sha1-390BLrnHAOIyP9M084rGIqs3Lac=", + "dev": true, + "requires": { + "readable-stream": "1.0.34", + "xtend": "3.0.0" + } + } + } + }, + "browser-resolve": { + "version": "1.11.2", + "resolved": "https://registry.npmjs.org/browser-resolve/-/browser-resolve-1.11.2.tgz", + "integrity": "sha1-j/CbCixCFxihBRwmCzLkj0QpOM4=", + "dev": true, + "requires": { + "resolve": "1.1.7" + }, + "dependencies": { + "resolve": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", + "integrity": "sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=", + "dev": true + } + } + }, + "browserify": { + "version": "8.1.3", + "resolved": "https://registry.npmjs.org/browserify/-/browserify-8.1.3.tgz", + "integrity": "sha1-8zpUmjpsNoIZsHX9z+bfGV4Empo=", + "dev": true, + "requires": { + "assert": "1.3.0", + "browser-pack": "3.2.0", + "browser-resolve": "1.11.2", + "browserify-zlib": "0.1.4", + "buffer": "3.6.0", + "builtins": "0.0.7", + "commondir": "0.0.1", + "concat-stream": "1.4.10", + "console-browserify": "1.1.0", + "constants-browserify": "0.0.1", + "crypto-browserify": "3.11.1", + "deep-equal": "0.2.2", + "defined": "0.0.0", + "deps-sort": "1.3.9", + "domain-browser": "1.1.7", + "duplexer2": "0.0.2", + "events": "1.0.2", + "glob": "4.5.3", + "http-browserify": "1.7.0", + "https-browserify": "0.0.1", + "inherits": "2.0.3", + "insert-module-globals": "6.6.3", + "isarray": "0.0.1", + "JSONStream": "0.8.4", + "labeled-stream-splicer": "1.0.2", + "module-deps": "3.9.1", + "os-browserify": "0.1.2", + "parents": "1.0.1", + "path-browserify": "0.0.0", + "process": "0.10.1", + "punycode": "1.2.4", + "querystring-es3": "0.2.1", + "readable-stream": "1.1.14", + "resolve": "0.7.4", + "shallow-copy": "0.0.1", + "shasum": "1.0.2", + "shell-quote": "0.0.1", + "stream-browserify": "1.0.0", + "string_decoder": "0.10.31", + "subarg": "1.0.0", + "syntax-error": "1.3.0", + "through2": "1.1.1", + "timers-browserify": "1.4.2", + "tty-browserify": "0.0.0", + "umd": "2.1.0", + "url": "0.10.3", + "util": "0.10.3", + "vm-browserify": "0.0.4", + "xtend": "3.0.0" + } + }, + "browserify-aes": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.0.6.tgz", + "integrity": "sha1-Xncl297x/Vkw1OurSFZ85FHEigo=", + "dev": true, + "requires": { + "buffer-xor": "1.0.3", + "cipher-base": "1.0.4", + "create-hash": "1.1.3", + "evp_bytestokey": "1.0.0", + "inherits": "2.0.3" + } + }, + "browserify-cipher": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.0.tgz", + "integrity": "sha1-mYgkSHS/XtTijalWZtzWasj8Njo=", + "dev": true, + "requires": { + "browserify-aes": "1.0.6", + "browserify-des": "1.0.0", + "evp_bytestokey": "1.0.0" + } + }, + "browserify-des": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.0.tgz", + "integrity": "sha1-2qJ3cXRwki7S/hhZQRihdUOXId0=", + "dev": true, + "requires": { + "cipher-base": "1.0.4", + "des.js": "1.0.0", + "inherits": "2.0.3" + } + }, + "browserify-rsa": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz", + "integrity": "sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ=", + "dev": true, + "requires": { + "bn.js": "4.11.7", + "randombytes": "2.0.5" + } + }, + "browserify-sign": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.0.4.tgz", + "integrity": "sha1-qk62jl17ZYuqa/alfmMMvXqT0pg=", + "dev": true, + "requires": { + "bn.js": "4.11.7", + "browserify-rsa": "4.0.1", + "create-hash": "1.1.3", + "create-hmac": "1.1.6", + "elliptic": "6.4.0", + "inherits": "2.0.3", + "parse-asn1": "5.1.0" + } + }, + "browserify-zlib": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.1.4.tgz", + "integrity": "sha1-uzX4pRn2AOD6a4SFJByXnQFB+y0=", + "dev": true, + "requires": { + "pako": "0.2.9" + } + }, + "buffer": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-3.6.0.tgz", + "integrity": "sha1-pyyTb3e5a/UvX357RnGAYoVR3vs=", + "dev": true, + "requires": { + "base64-js": "0.0.8", + "ieee754": "1.1.8", + "isarray": "1.0.0" + }, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + } + } + }, + "buffer-equal": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/buffer-equal/-/buffer-equal-0.0.2.tgz", + "integrity": "sha1-7Lt5D1aNQAmKYkK1SAXHWAXrk48=", + "dev": true + }, + "buffer-xor": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", + "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=", + "dev": true + }, + "builtins": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/builtins/-/builtins-0.0.7.tgz", + "integrity": "sha1-NVIZzWzxjb58Acx/0tznZc/cVJo=", + "dev": true + }, + "bunker": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/bunker/-/bunker-0.1.2.tgz", + "integrity": "sha1-yImSRkqOKm7ehpMDdfkrWAd++Xw=", + "dev": true, + "requires": { + "burrito": "0.2.12" + } + }, + "burrito": { + "version": "0.2.12", + "resolved": "https://registry.npmjs.org/burrito/-/burrito-0.2.12.tgz", + "integrity": "sha1-0NbmrIHV6ZeJxvpKzLCwAx6lT2s=", + "dev": true, + "requires": { + "traverse": "0.5.2", + "uglify-js": "1.1.1" + }, + "dependencies": { + "traverse": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/traverse/-/traverse-0.5.2.tgz", + "integrity": "sha1-4gPFjV9/DjfbbnTArLkpuwm2HYU=", + "dev": true + }, + "uglify-js": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-1.1.1.tgz", + "integrity": "sha1-7nGpfEzv0GoamyBDfzQRiYKqA1s=", + "dev": true + } + } + }, + "callsite": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/callsite/-/callsite-1.0.0.tgz", + "integrity": "sha1-KAOY5dZkvXQDi28JBRU+borxvCA=", + "dev": true + }, + "camelcase": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz", + "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=", + "dev": true + }, + "center-align": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/center-align/-/center-align-0.1.3.tgz", + "integrity": "sha1-qg0yYptu6XIgBBHL1EYckHvCt60=", + "dev": true, + "requires": { + "align-text": "0.1.4", + "lazy-cache": "1.0.4" + } + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "2.2.1", + "escape-string-regexp": "1.0.5", + "has-ansi": "2.0.0", + "strip-ansi": "3.0.1", + "supports-color": "2.0.0" + } + }, + "charm": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/charm/-/charm-0.1.2.tgz", + "integrity": "sha1-BsIe7RobBq62dVPNxT4jJ0usIpY=", + "dev": true + }, + "cipher-base": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", + "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", + "dev": true, + "requires": { + "inherits": "2.0.3", + "safe-buffer": "5.1.1" + } + }, + "cliui": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz", + "integrity": "sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE=", + "dev": true, + "requires": { + "center-align": "0.1.3", + "right-align": "0.1.3", + "wordwrap": "0.0.2" + }, + "dependencies": { + "wordwrap": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz", + "integrity": "sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8=", + "dev": true + } + } + }, + "clone": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.2.tgz", + "integrity": "sha1-Jgt6meux7f4kdTgXX3gyQ8sZ0Uk=", + "dev": true + }, + "clone-stats": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-0.0.1.tgz", + "integrity": "sha1-uI+UqCzzi4eR1YBG6kAprYjKmdE=", + "dev": true + }, + "combine-source-map": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/combine-source-map/-/combine-source-map-0.3.0.tgz", + "integrity": "sha1-2edPWT2c1DgHMSy12EbUUe+qnrc=", + "dev": true, + "requires": { + "convert-source-map": "0.3.5", + "inline-source-map": "0.3.1", + "source-map": "0.1.43" + } + }, + "commondir": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-0.0.1.tgz", + "integrity": "sha1-ifAP3NUbUZxXhzP+xWPmptp/W+I=", + "dev": true + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "dev": true + }, + "concat-stream": { + "version": "1.4.10", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.4.10.tgz", + "integrity": "sha1-rMO79WAsuMyYDGrIQPp9hgPj7zY=", + "dev": true, + "requires": { + "inherits": "2.0.3", + "readable-stream": "1.1.14", + "typedarray": "0.0.6" + } + }, + "console-browserify": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.1.0.tgz", + "integrity": "sha1-8CQcRXMKn8YyOyBtvzjtx0HQuxA=", + "dev": true, + "requires": { + "date-now": "0.1.4" + } + }, + "constants-browserify": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-0.0.1.tgz", + "integrity": "sha1-kld9tSe6bEzwpFaNhLwDH0QeIfI=", + "dev": true + }, + "convert-source-map": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-0.3.5.tgz", + "integrity": "sha1-8dgClQr33SYxof6+BZZVDIarMZA=", + "dev": true + }, + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", + "dev": true + }, + "create-ecdh": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.0.tgz", + "integrity": "sha1-iIxyNZbN92EvZJgjPuvXo1MBc30=", + "dev": true, + "requires": { + "bn.js": "4.11.7", + "elliptic": "6.4.0" + } + }, + "create-hash": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.1.3.tgz", + "integrity": "sha1-YGBCrIuSYnUPSDyt2rD1gZFy2P0=", + "dev": true, + "requires": { + "cipher-base": "1.0.4", + "inherits": "2.0.3", + "ripemd160": "2.0.1", + "sha.js": "2.4.8" + } + }, + "create-hmac": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.6.tgz", + "integrity": "sha1-rLniIaThe9sHbpBlfEK5PjcmzwY=", + "dev": true, + "requires": { + "cipher-base": "1.0.4", + "create-hash": "1.1.3", + "inherits": "2.0.3", + "ripemd160": "2.0.1", + "safe-buffer": "5.1.1", + "sha.js": "2.4.8" + } + }, + "crypto-browserify": { + "version": "3.11.1", + "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.11.1.tgz", + "integrity": "sha512-Na7ZlwCOqoaW5RwUK1WpXws2kv8mNhWdTlzob0UXulk6G9BDbyiJaGTYBIX61Ozn9l1EPPJpICZb4DaOpT9NlQ==", + "dev": true, + "requires": { + "browserify-cipher": "1.0.0", + "browserify-sign": "4.0.4", + "create-ecdh": "4.0.0", + "create-hash": "1.1.3", + "create-hmac": "1.1.6", + "diffie-hellman": "5.0.2", + "inherits": "2.0.3", + "pbkdf2": "3.0.13", + "public-encrypt": "4.0.0", + "randombytes": "2.0.5" + } + }, + "date-now": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/date-now/-/date-now-0.1.4.tgz", + "integrity": "sha1-6vQ5/U1ISK105cx9vvIAZyueNFs=", + "dev": true + }, + "dateformat": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-2.0.0.tgz", + "integrity": "sha1-J0Pjq7XD/CRi5SfcpEXgTp9N7hc=", + "dev": true + }, + "deap": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/deap/-/deap-1.0.0.tgz", + "integrity": "sha1-sUi/gkMKJ2mbdIOgPra2dYW/yIg=", + "dev": true + }, + "decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", + "dev": true + }, + "deep-equal": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-0.2.2.tgz", + "integrity": "sha1-hLdFiW80xoTpjyzg5Cq69Du6AX0=", + "dev": true + }, + "deep-is": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", + "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", + "dev": true + }, + "defaults": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.3.tgz", + "integrity": "sha1-xlYFHpgX2f8I7YgUd/P+QBnz730=", + "dev": true, + "requires": { + "clone": "1.0.2" + } + }, + "defined": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/defined/-/defined-0.0.0.tgz", + "integrity": "sha1-817qfXBekzuvE7LwOz+D2SFAOz4=", + "dev": true + }, + "del": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/del/-/del-1.2.1.tgz", + "integrity": "sha1-rtblvNfLcyXfNPVjEl+iZbLBoBQ=", + "dev": true, + "requires": { + "each-async": "1.1.1", + "globby": "2.1.0", + "is-path-cwd": "1.0.0", + "is-path-in-cwd": "1.0.0", + "object-assign": "3.0.0", + "rimraf": "2.6.1" + } + }, + "deprecated": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/deprecated/-/deprecated-0.0.1.tgz", + "integrity": "sha1-+cmvVGSvoeepcUWKi97yqpTVuxk=", + "dev": true + }, + "deps-sort": { + "version": "1.3.9", + "resolved": "https://registry.npmjs.org/deps-sort/-/deps-sort-1.3.9.tgz", + "integrity": "sha1-Kd//U+F7Nq7K51MK27v2IsLtGnE=", + "dev": true, + "requires": { + "JSONStream": "1.3.1", + "shasum": "1.0.2", + "subarg": "1.0.0", + "through2": "1.1.1" + }, + "dependencies": { + "jsonparse": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", + "integrity": "sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA=", + "dev": true + }, + "JSONStream": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.1.tgz", + "integrity": "sha1-cH92HgHa6eFvG8+TcDt4xwlmV5o=", + "dev": true, + "requires": { + "jsonparse": "1.3.1", + "through": "2.3.8" + } + } + } + }, + "des.js": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.0.tgz", + "integrity": "sha1-wHTS4qpqipoH29YfmhXCzYPsjsw=", + "dev": true, + "requires": { + "inherits": "2.0.3", + "minimalistic-assert": "1.0.0" + } + }, + "detect-file": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/detect-file/-/detect-file-0.1.0.tgz", + "integrity": "sha1-STXe39lIhkjgBrASlWbpOGcR6mM=", + "dev": true, + "requires": { + "fs-exists-sync": "0.1.0" + } + }, + "detective": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/detective/-/detective-4.5.0.tgz", + "integrity": "sha1-blqMaybmx6JUsca210kNmOyR7dE=", + "dev": true, + "requires": { + "acorn": "4.0.13", + "defined": "1.0.0" + }, + "dependencies": { + "defined": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz", + "integrity": "sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM=", + "dev": true + } + } + }, + "diffie-hellman": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.2.tgz", + "integrity": "sha1-tYNXOScM/ias9jIJn97SoH8gnl4=", + "dev": true, + "requires": { + "bn.js": "4.11.7", + "miller-rabin": "4.0.0", + "randombytes": "2.0.5" + } + }, + "difflet": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/difflet/-/difflet-0.2.6.tgz", + "integrity": "sha1-qyOzH1ZJtvqo49KsvTNEZzZcpvo=", + "dev": true, + "requires": { + "charm": "0.1.2", + "deep-is": "0.1.3", + "traverse": "0.6.6" + } + }, + "domain-browser": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.1.7.tgz", + "integrity": "sha1-hnqksJP6oF8d4IwG9NeyH9+GmLw=", + "dev": true + }, + "duplexer2": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.0.2.tgz", + "integrity": "sha1-xhTc9n4vsUmVqRcR5aYX6KYKMds=", + "dev": true, + "requires": { + "readable-stream": "1.1.14" + } + }, + "each-async": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/each-async/-/each-async-1.1.1.tgz", + "integrity": "sha1-3uUim98KtrogEqOV4bhpq/iBNHM=", + "dev": true, + "requires": { + "onetime": "1.1.0", + "set-immediate-shim": "1.0.1" + } + }, + "elliptic": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.4.0.tgz", + "integrity": "sha1-ysmvh2LIWDYYcAPI3+GT5eLq5d8=", + "dev": true, + "requires": { + "bn.js": "4.11.7", + "brorand": "1.1.0", + "hash.js": "1.1.3", + "hmac-drbg": "1.0.1", + "inherits": "2.0.3", + "minimalistic-assert": "1.0.0", + "minimalistic-crypto-utils": "1.0.1" + } + }, + "end-of-stream": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-0.1.5.tgz", + "integrity": "sha1-jhdyBsPICDfYVjLouTWd/osvbq8=", + "dev": true, + "requires": { + "once": "1.3.3" + }, + "dependencies": { + "once": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/once/-/once-1.3.3.tgz", + "integrity": "sha1-suJhVXzkwxTsgwTz+oJmPkKXyiA=", + "dev": true, + "requires": { + "wrappy": "1.0.2" + } + } + } + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true + }, + "events": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/events/-/events-1.0.2.tgz", + "integrity": "sha1-dYSdz+k9EPsFfDAFWv29UdBqjiQ=", + "dev": true + }, + "evp_bytestokey": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.0.tgz", + "integrity": "sha1-SXtmrZ/vZc18CKYYCCS6FHa2blM=", + "dev": true, + "requires": { + "create-hash": "1.1.3" + } + }, + "expand-brackets": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", + "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", + "dev": true, + "requires": { + "is-posix-bracket": "0.1.1" + } + }, + "expand-range": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/expand-range/-/expand-range-1.8.2.tgz", + "integrity": "sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc=", + "dev": true, + "requires": { + "fill-range": "2.2.3" + } + }, + "expand-tilde": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-1.2.2.tgz", + "integrity": "sha1-C4HrqJflo9MdHD0QL48BRB5VlEk=", + "dev": true, + "requires": { + "os-homedir": "1.0.2" + } + }, + "extend": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.1.tgz", + "integrity": "sha1-p1Xqe8Gt/MWjHOfnYtuq3F5jZEQ=", + "dev": true + }, + "extglob": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", + "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", + "dev": true, + "requires": { + "is-extglob": "1.0.0" + } + }, + "fancy-log": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/fancy-log/-/fancy-log-1.3.0.tgz", + "integrity": "sha1-Rb4X0Cu5kX1gzP/UmVyZnmyMmUg=", + "dev": true, + "requires": { + "chalk": "1.1.3", + "time-stamp": "1.1.0" + } + }, + "filename-regex": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/filename-regex/-/filename-regex-2.0.1.tgz", + "integrity": "sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY=", + "dev": true + }, + "fill-range": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.3.tgz", + "integrity": "sha1-ULd9/X5Gm8dJJHCWNpn+eoSFpyM=", + "dev": true, + "requires": { + "is-number": "2.1.0", + "isobject": "2.1.0", + "randomatic": "1.1.7", + "repeat-element": "1.1.2", + "repeat-string": "1.6.1" + } + }, + "find-index": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/find-index/-/find-index-0.1.1.tgz", + "integrity": "sha1-Z101iyyjiS15Whq0cjL4tuLg3eQ=", + "dev": true + }, + "findup-sync": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-0.4.3.tgz", + "integrity": "sha1-QAQ5Kee8YK3wt/SCfExudaDeyhI=", + "dev": true, + "requires": { + "detect-file": "0.1.0", + "is-glob": "2.0.1", + "micromatch": "2.3.11", + "resolve-dir": "0.1.1" + } + }, + "fined": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fined/-/fined-1.1.0.tgz", + "integrity": "sha1-s33IRLdqL15wgeiE98CuNE8VNHY=", + "dev": true, + "requires": { + "expand-tilde": "2.0.2", + "is-plain-object": "2.0.4", + "object.defaults": "1.1.0", + "object.pick": "1.2.0", + "parse-filepath": "1.0.1" + }, + "dependencies": { + "expand-tilde": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz", + "integrity": "sha1-l+gBqgUt8CRU3kawK/YhZCzchQI=", + "dev": true, + "requires": { + "homedir-polyfill": "1.0.1" + } + } + } + }, + "first-chunk-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/first-chunk-stream/-/first-chunk-stream-1.0.0.tgz", + "integrity": "sha1-Wb+1DNkF9g18OUzT2ayqtOatk04=", + "dev": true + }, + "flagged-respawn": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/flagged-respawn/-/flagged-respawn-0.3.2.tgz", + "integrity": "sha1-/xke3c1wiKZ1smEP/8l2vpuAdLU=", + "dev": true + }, + "for-in": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", + "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", + "dev": true + }, + "for-own": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/for-own/-/for-own-0.1.5.tgz", + "integrity": "sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=", + "dev": true, + "requires": { + "for-in": "1.0.2" + } + }, + "fs-exists-sync": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/fs-exists-sync/-/fs-exists-sync-0.1.0.tgz", + "integrity": "sha1-mC1ok6+RjnLQjeyehnP/K1qNat0=", + "dev": true + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "dev": true + }, + "gaze": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/gaze/-/gaze-0.5.2.tgz", + "integrity": "sha1-QLcJU30k0dRXZ9takIaJ3+aaxE8=", + "dev": true, + "requires": { + "globule": "0.1.0" + } + }, + "gintersect": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/gintersect/-/gintersect-0.1.0.tgz", + "integrity": "sha1-moy2qAt9bpVawzUVSVsSEmJ7GBY=" + }, + "glob": { + "version": "4.5.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-4.5.3.tgz", + "integrity": "sha1-xstz0yJsHv7wTePFbQEvAzd+4V8=", + "dev": true, + "requires": { + "inflight": "1.0.6", + "inherits": "2.0.3", + "minimatch": "2.0.10", + "once": "1.4.0" + } + }, + "glob-base": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/glob-base/-/glob-base-0.3.0.tgz", + "integrity": "sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q=", + "dev": true, + "requires": { + "glob-parent": "2.0.0", + "is-glob": "2.0.1" + } + }, + "glob-parent": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz", + "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=", + "dev": true, + "requires": { + "is-glob": "2.0.1" + } + }, + "glob-stream": { + "version": "3.1.18", + "resolved": "https://registry.npmjs.org/glob-stream/-/glob-stream-3.1.18.tgz", + "integrity": "sha1-kXCl8St5Awb9/lmPMT+PeVT9FDs=", + "dev": true, + "requires": { + "glob": "4.5.3", + "glob2base": "0.0.12", + "minimatch": "2.0.10", + "ordered-read-streams": "0.1.0", + "through2": "0.6.5", + "unique-stream": "1.0.0" + }, + "dependencies": { + "readable-stream": { + "version": "1.0.34", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", + "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", + "dev": true, + "requires": { + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "0.0.1", + "string_decoder": "0.10.31" + } + }, + "through2": { + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz", + "integrity": "sha1-QaucZ7KdVyCQcUEOHXp6lozTrUg=", + "dev": true, + "requires": { + "readable-stream": "1.0.34", + "xtend": "4.0.1" + } + }, + "xtend": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", + "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=", + "dev": true + } + } + }, + "glob-watcher": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/glob-watcher/-/glob-watcher-0.0.6.tgz", + "integrity": "sha1-uVtKjfdLOcgymLDAXJeLTZo7cQs=", + "dev": true, + "requires": { + "gaze": "0.5.2" + } + }, + "glob2base": { + "version": "0.0.12", + "resolved": "https://registry.npmjs.org/glob2base/-/glob2base-0.0.12.tgz", + "integrity": "sha1-nUGbPijxLoOjYhZKJ3BVkiycDVY=", + "dev": true, + "requires": { + "find-index": "0.1.1" + } + }, + "global-modules": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-0.2.3.tgz", + "integrity": "sha1-6lo77ULG1s6ZWk+KEmm12uIjgo0=", + "dev": true, + "requires": { + "global-prefix": "0.1.5", + "is-windows": "0.2.0" + } + }, + "global-prefix": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-0.1.5.tgz", + "integrity": "sha1-jTvGuNo8qBEqFg2NSW/wRiv+948=", + "dev": true, + "requires": { + "homedir-polyfill": "1.0.1", + "ini": "1.3.4", + "is-windows": "0.2.0", + "which": "1.3.0" + } + }, + "globby": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-2.1.0.tgz", + "integrity": "sha1-npGSvNM/Srak+JTl5+qLcTITxII=", + "dev": true, + "requires": { + "array-union": "1.0.2", + "async": "1.5.2", + "glob": "5.0.15", + "object-assign": "3.0.0" + }, + "dependencies": { + "async": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", + "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=", + "dev": true + }, + "glob": { + "version": "5.0.15", + "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz", + "integrity": "sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E=", + "dev": true, + "requires": { + "inflight": "1.0.6", + "inherits": "2.0.3", + "minimatch": "2.0.10", + "once": "1.4.0", + "path-is-absolute": "1.0.1" + } + } + } + }, + "globule": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/globule/-/globule-0.1.0.tgz", + "integrity": "sha1-2cjt3h2nnRJaFRt5UzuXhnY0auU=", + "dev": true, + "requires": { + "glob": "3.1.21", + "lodash": "1.0.2", + "minimatch": "0.2.14" + }, + "dependencies": { + "glob": { + "version": "3.1.21", + "resolved": "https://registry.npmjs.org/glob/-/glob-3.1.21.tgz", + "integrity": "sha1-0p4KBV3qUTj00H7UDomC6DwgZs0=", + "dev": true, + "requires": { + "graceful-fs": "1.2.3", + "inherits": "1.0.2", + "minimatch": "0.2.14" + } + }, + "graceful-fs": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-1.2.3.tgz", + "integrity": "sha1-FaSAaldUfLLS2/J/QuiajDRRs2Q=", + "dev": true + }, + "inherits": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-1.0.2.tgz", + "integrity": "sha1-ykMJ2t7mtUzAuNJH6NfHoJdb3Js=", + "dev": true + }, + "minimatch": { + "version": "0.2.14", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-0.2.14.tgz", + "integrity": "sha1-x054BXT2PG+aCQ6Q775u9TpqdWo=", + "dev": true, + "requires": { + "lru-cache": "2.7.3", + "sigmund": "1.0.1" + } + } + } + }, + "glogg": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/glogg/-/glogg-1.0.0.tgz", + "integrity": "sha1-f+DxmfV6yQbPUS/urY+Q7kooT8U=", + "dev": true, + "requires": { + "sparkles": "1.0.0" + } + }, + "graceful-fs": { + "version": "3.0.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-3.0.11.tgz", + "integrity": "sha1-dhPHeKGv6mLyXGMKCG1/Osu92Bg=", + "dev": true, + "requires": { + "natives": "1.1.0" + } + }, + "gulp": { + "version": "3.9.1", + "resolved": "https://registry.npmjs.org/gulp/-/gulp-3.9.1.tgz", + "integrity": "sha1-VxzkWSjdQK9lFPxAEYZgFsE4RbQ=", + "dev": true, + "requires": { + "archy": "1.0.0", + "chalk": "1.1.3", + "deprecated": "0.0.1", + "gulp-util": "3.0.8", + "interpret": "1.0.3", + "liftoff": "2.3.0", + "minimist": "1.2.0", + "orchestrator": "0.3.8", + "pretty-hrtime": "1.0.3", + "semver": "4.3.6", + "tildify": "1.2.0", + "v8flags": "2.1.1", + "vinyl-fs": "0.3.14" + } + }, + "gulp-rename": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/gulp-rename/-/gulp-rename-1.2.2.tgz", + "integrity": "sha1-OtRCh2PwXidk3sHGfYaNsnVoeBc=", + "dev": true + }, + "gulp-run": { + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/gulp-run/-/gulp-run-1.7.1.tgz", + "integrity": "sha1-4XwKy3wwtuKu7iPAREKpbAys7/o=", + "dev": true, + "requires": { + "gulp-util": "3.0.8", + "lodash.defaults": "4.2.0", + "lodash.template": "4.4.0", + "vinyl": "0.4.6" + }, + "dependencies": { + "clone": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/clone/-/clone-0.2.0.tgz", + "integrity": "sha1-xhJqkK1Pctv1rNskPMN3JP6T/B8=", + "dev": true + }, + "lodash.template": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-4.4.0.tgz", + "integrity": "sha1-5zoDhcg1VZF0bgILmWecaQ5o+6A=", + "dev": true, + "requires": { + "lodash._reinterpolate": "3.0.0", + "lodash.templatesettings": "4.1.0" + } + }, + "lodash.templatesettings": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-4.1.0.tgz", + "integrity": "sha1-K01OlbpEDZFf8IvImeRVNmZxMxY=", + "dev": true, + "requires": { + "lodash._reinterpolate": "3.0.0" + } + }, + "vinyl": { + "version": "0.4.6", + "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-0.4.6.tgz", + "integrity": "sha1-LzVsh6VQolVGHza76ypbqL94SEc=", + "dev": true, + "requires": { + "clone": "0.2.0", + "clone-stats": "0.0.1" + } + } + } + }, + "gulp-uglify": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/gulp-uglify/-/gulp-uglify-1.5.4.tgz", + "integrity": "sha1-UkeI2HZm0J+dDCH7IXf5ADmmWMk=", + "dev": true, + "requires": { + "deap": "1.0.0", + "fancy-log": "1.3.0", + "gulp-util": "3.0.8", + "isobject": "2.1.0", + "through2": "2.0.3", + "uglify-js": "2.6.4", + "uglify-save-license": "0.4.1", + "vinyl-sourcemaps-apply": "0.2.1" + }, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "readable-stream": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz", + "integrity": "sha512-m+qzzcn7KUxEmd1gMbchF+Y2eIUbieUaxkWtptyHywrX0rE8QEYqPC07Vuy4Wm32/xE16NcdBctb8S0Xe/5IeQ==", + "dev": true, + "requires": { + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "1.0.0", + "process-nextick-args": "1.0.7", + "safe-buffer": "5.1.1", + "string_decoder": "1.0.3", + "util-deprecate": "1.0.2" + } + }, + "source-map": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz", + "integrity": "sha1-dc449SvwczxafwwRjYEzSiu19BI=", + "dev": true + }, + "string_decoder": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", + "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", + "dev": true, + "requires": { + "safe-buffer": "5.1.1" + } + }, + "through2": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.3.tgz", + "integrity": "sha1-AARWmzfHx0ujnEPzzteNGtlBQL4=", + "dev": true, + "requires": { + "readable-stream": "2.3.3", + "xtend": "4.0.1" + } + }, + "uglify-js": { + "version": "2.6.4", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.6.4.tgz", + "integrity": "sha1-ZeovswWck5RpLxX+2HwrNsFrmt8=", + "dev": true, + "requires": { + "async": "0.2.10", + "source-map": "0.5.6", + "uglify-to-browserify": "1.0.2", + "yargs": "3.10.0" + } + }, + "xtend": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", + "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=", + "dev": true + }, + "yargs": { + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz", + "integrity": "sha1-9+572FfdfB0tOMDnTvvWgdFDH9E=", + "dev": true, + "requires": { + "camelcase": "1.2.1", + "cliui": "2.1.0", + "decamelize": "1.2.0", + "window-size": "0.1.0" + } + } + } + }, + "gulp-util": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/gulp-util/-/gulp-util-3.0.8.tgz", + "integrity": "sha1-AFTh50RQLifATBh8PsxQXdVLu08=", + "dev": true, + "requires": { + "array-differ": "1.0.0", + "array-uniq": "1.0.3", + "beeper": "1.1.1", + "chalk": "1.1.3", + "dateformat": "2.0.0", + "fancy-log": "1.3.0", + "gulplog": "1.0.0", + "has-gulplog": "0.1.0", + "lodash._reescape": "3.0.0", + "lodash._reevaluate": "3.0.0", + "lodash._reinterpolate": "3.0.0", + "lodash.template": "3.6.2", + "minimist": "1.2.0", + "multipipe": "0.1.2", + "object-assign": "3.0.0", + "replace-ext": "0.0.1", + "through2": "2.0.3", + "vinyl": "0.5.3" + }, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "readable-stream": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz", + "integrity": "sha512-m+qzzcn7KUxEmd1gMbchF+Y2eIUbieUaxkWtptyHywrX0rE8QEYqPC07Vuy4Wm32/xE16NcdBctb8S0Xe/5IeQ==", + "dev": true, + "requires": { + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "1.0.0", + "process-nextick-args": "1.0.7", + "safe-buffer": "5.1.1", + "string_decoder": "1.0.3", + "util-deprecate": "1.0.2" + } + }, + "string_decoder": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", + "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", + "dev": true, + "requires": { + "safe-buffer": "5.1.1" + } + }, + "through2": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.3.tgz", + "integrity": "sha1-AARWmzfHx0ujnEPzzteNGtlBQL4=", + "dev": true, + "requires": { + "readable-stream": "2.3.3", + "xtend": "4.0.1" + } + }, + "xtend": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", + "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=", + "dev": true + } + } + }, + "gulplog": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/gulplog/-/gulplog-1.0.0.tgz", + "integrity": "sha1-4oxNRdBey77YGDY86PnFkmIp/+U=", + "dev": true, + "requires": { + "glogg": "1.0.0" + } + }, + "has-ansi": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", + "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", + "dev": true, + "requires": { + "ansi-regex": "2.1.1" + } + }, + "has-gulplog": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/has-gulplog/-/has-gulplog-0.1.0.tgz", + "integrity": "sha1-ZBTIKRNpfaUVkDl9r7EvIpZ4Ec4=", + "dev": true, + "requires": { + "sparkles": "1.0.0" + } + }, + "hash-base": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-2.0.2.tgz", + "integrity": "sha1-ZuodhW206KVHDK32/OI65SRO8uE=", + "dev": true, + "requires": { + "inherits": "2.0.3" + } + }, + "hash.js": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.3.tgz", + "integrity": "sha512-/UETyP0W22QILqS+6HowevwhEFJ3MBJnwTf75Qob9Wz9t0DPuisL8kW8YZMK62dHAKE1c1p+gY1TtOLY+USEHA==", + "dev": true, + "requires": { + "inherits": "2.0.3", + "minimalistic-assert": "1.0.0" + } + }, + "hmac-drbg": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", + "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", + "dev": true, + "requires": { + "hash.js": "1.1.3", + "minimalistic-assert": "1.0.0", + "minimalistic-crypto-utils": "1.0.1" + } + }, + "homedir-polyfill": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.1.tgz", + "integrity": "sha1-TCu8inWJmP7r9e1oWA921GdotLw=", + "dev": true, + "requires": { + "parse-passwd": "1.0.0" + } + }, + "http-browserify": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/http-browserify/-/http-browserify-1.7.0.tgz", + "integrity": "sha1-M3la3nLfiKz7/TZ3PO/tp2RzWyA=", + "dev": true, + "requires": { + "Base64": "0.2.1", + "inherits": "2.0.3" + } + }, + "https-browserify": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-0.0.1.tgz", + "integrity": "sha1-P5E2XKvmC3ftDruiS0VOPgnZWoI=", + "dev": true + }, + "ieee754": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.8.tgz", + "integrity": "sha1-vjPUCsEO8ZJnAfbwii2G+/0a0+Q=", + "dev": true + }, + "indexof": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz", + "integrity": "sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10=", + "dev": true + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dev": true, + "requires": { + "once": "1.4.0", + "wrappy": "1.0.2" + } + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true + }, + "ini": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.4.tgz", + "integrity": "sha1-BTfLedr1m1mhpRff9wbIbsA5Fi4=", + "dev": true + }, + "inline-source-map": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/inline-source-map/-/inline-source-map-0.3.1.tgz", + "integrity": "sha1-pSi1FOaJ/OkNswiehw2S9Sestes=", + "dev": true, + "requires": { + "source-map": "0.3.0" + }, + "dependencies": { + "source-map": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.3.0.tgz", + "integrity": "sha1-hYb7mloAXltQHiHNGLbyG0V60fk=", + "dev": true, + "requires": { + "amdefine": "1.0.1" + } + } + } + }, + "insert-module-globals": { + "version": "6.6.3", + "resolved": "https://registry.npmjs.org/insert-module-globals/-/insert-module-globals-6.6.3.tgz", + "integrity": "sha1-IGOOKaMPntHKLjqCX7wsulJG3fw=", + "dev": true, + "requires": { + "combine-source-map": "0.6.1", + "concat-stream": "1.4.10", + "is-buffer": "1.1.5", + "JSONStream": "1.3.1", + "lexical-scope": "1.2.0", + "process": "0.11.10", + "through2": "1.1.1", + "xtend": "4.0.1" + }, + "dependencies": { + "combine-source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/combine-source-map/-/combine-source-map-0.6.1.tgz", + "integrity": "sha1-m0oJwxYDPXaODxHgKfonMOB5rZY=", + "dev": true, + "requires": { + "convert-source-map": "1.1.3", + "inline-source-map": "0.5.0", + "lodash.memoize": "3.0.4", + "source-map": "0.4.4" + } + }, + "convert-source-map": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.1.3.tgz", + "integrity": "sha1-SCnId+n+SbMWHzvzZziI4gRpmGA=", + "dev": true + }, + "inline-source-map": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/inline-source-map/-/inline-source-map-0.5.0.tgz", + "integrity": "sha1-Skxd2OT7Xps82mDIIt+tyu5m4K8=", + "dev": true, + "requires": { + "source-map": "0.4.4" + } + }, + "jsonparse": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", + "integrity": "sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA=", + "dev": true + }, + "JSONStream": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.1.tgz", + "integrity": "sha1-cH92HgHa6eFvG8+TcDt4xwlmV5o=", + "dev": true, + "requires": { + "jsonparse": "1.3.1", + "through": "2.3.8" + } + }, + "process": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=", + "dev": true + }, + "source-map": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz", + "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=", + "dev": true, + "requires": { + "amdefine": "1.0.1" + } + }, + "xtend": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", + "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=", + "dev": true + } + } + }, + "interpret": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.0.3.tgz", + "integrity": "sha1-y8NcYu7uc/Gat7EKgBURQBr8D5A=", + "dev": true + }, + "is-absolute": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/is-absolute/-/is-absolute-0.2.6.tgz", + "integrity": "sha1-IN5p89uULvLYe5wto28XIjWxtes=", + "dev": true, + "requires": { + "is-relative": "0.2.1", + "is-windows": "0.2.0" + } + }, + "is-buffer": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.5.tgz", + "integrity": "sha1-Hzsm72E7IUuIy8ojzGwB2Hlh7sw=", + "dev": true + }, + "is-dotfile": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-dotfile/-/is-dotfile-1.0.3.tgz", + "integrity": "sha1-pqLzL/0t+wT1yiXs0Pa4PPeYoeE=", + "dev": true + }, + "is-equal-shallow": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz", + "integrity": "sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ=", + "dev": true, + "requires": { + "is-primitive": "2.0.0" + } + }, + "is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", + "dev": true + }, + "is-extglob": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", + "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", + "dev": true + }, + "is-glob": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", + "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", + "dev": true, + "requires": { + "is-extglob": "1.0.0" + } + }, + "is-number": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz", + "integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=", + "dev": true, + "requires": { + "kind-of": "3.2.2" + } + }, + "is-path-cwd": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-1.0.0.tgz", + "integrity": "sha1-0iXsIxMuie3Tj9p2dHLmLmXxEG0=", + "dev": true + }, + "is-path-in-cwd": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-1.0.0.tgz", + "integrity": "sha1-ZHdYK4IU1gI0YJRWcAO+ip6sBNw=", + "dev": true, + "requires": { + "is-path-inside": "1.0.0" + } + }, + "is-path-inside": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.0.tgz", + "integrity": "sha1-/AbloWg/vaE95mev9xe7wQpI838=", + "dev": true, + "requires": { + "path-is-inside": "1.0.2" + } + }, + "is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dev": true, + "requires": { + "isobject": "3.0.1" + }, + "dependencies": { + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + } + } + }, + "is-posix-bracket": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz", + "integrity": "sha1-MzTceXdDaOkvAW5vvAqI9c1ua8Q=", + "dev": true + }, + "is-primitive": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-primitive/-/is-primitive-2.0.0.tgz", + "integrity": "sha1-IHurkWOEmcB7Kt8kCkGochADRXU=", + "dev": true + }, + "is-relative": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-relative/-/is-relative-0.2.1.tgz", + "integrity": "sha1-0n9MfVFtF1+2ENuEu+7yPDvJeqU=", + "dev": true, + "requires": { + "is-unc-path": "0.1.2" + } + }, + "is-unc-path": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/is-unc-path/-/is-unc-path-0.1.2.tgz", + "integrity": "sha1-arBTpyVzwQJQ/0FqOBTDUXivObk=", + "dev": true, + "requires": { + "unc-path-regex": "0.1.2" + } + }, + "is-utf8": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", + "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=", + "dev": true + }, + "is-windows": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-0.2.0.tgz", + "integrity": "sha1-3hqm1j6indJIc3tp8f+LgALSEIw=", + "dev": true + }, + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", + "dev": true + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", + "dev": true + }, + "isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "dev": true, + "requires": { + "isarray": "1.0.0" + }, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + } + } + }, + "json-stable-stringify": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-0.0.1.tgz", + "integrity": "sha1-YRwj6BTbN1Un34URk9tZ3Sryf0U=", + "dev": true, + "requires": { + "jsonify": "0.0.0" + } + }, + "jsonify": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz", + "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=", + "dev": true + }, + "jsonparse": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-0.0.5.tgz", + "integrity": "sha1-MwVCrT8KZUZlt3jz6y2an6UHrGQ=", + "dev": true + }, + "JSONStream": { + "version": "0.8.4", + "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-0.8.4.tgz", + "integrity": "sha1-kWV9/m/4V0gwZhMrRhi2Lo9Ih70=", + "dev": true, + "requires": { + "jsonparse": "0.0.5", + "through": "2.3.8" + } + }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "1.1.5" + } + }, + "labeled-stream-splicer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/labeled-stream-splicer/-/labeled-stream-splicer-1.0.2.tgz", + "integrity": "sha1-RhUzFTd4SYHo/SZOHzpDTE4N3WU=", + "dev": true, + "requires": { + "inherits": "2.0.3", + "isarray": "0.0.1", + "stream-splicer": "1.3.2" + } + }, + "lazy-cache": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz", + "integrity": "sha1-odePw6UEdMuAhF07O24dpJpEbo4=", + "dev": true + }, + "lexical-scope": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/lexical-scope/-/lexical-scope-1.2.0.tgz", + "integrity": "sha1-/Ope3HBKSzqHls3KQZw6CvryLfQ=", + "dev": true, + "requires": { + "astw": "2.2.0" + } + }, + "liftoff": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/liftoff/-/liftoff-2.3.0.tgz", + "integrity": "sha1-qY8v9nGD2Lp8+soQVIvX/wVQs4U=", + "dev": true, + "requires": { + "extend": "3.0.1", + "findup-sync": "0.4.3", + "fined": "1.1.0", + "flagged-respawn": "0.3.2", + "lodash.isplainobject": "4.0.6", + "lodash.isstring": "4.0.1", + "lodash.mapvalues": "4.6.0", + "rechoir": "0.6.2", + "resolve": "1.4.0" + }, + "dependencies": { + "resolve": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.4.0.tgz", + "integrity": "sha512-aW7sVKPufyHqOmyyLzg/J+8606v5nevBgaliIlV7nUpVMsDnoBGV/cbSLNjZAg9q0Cfd/+easKVKQ8vOu8fn1Q==", + "dev": true, + "requires": { + "path-parse": "1.0.5" + } + } + } + }, + "lodash": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-1.0.2.tgz", + "integrity": "sha1-j1dWDIO1n8JwvT1WG2kAQ0MOJVE=", + "dev": true + }, + "lodash._basecopy": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/lodash._basecopy/-/lodash._basecopy-3.0.1.tgz", + "integrity": "sha1-jaDmqHbPNEwK2KVIghEd08XHyjY=", + "dev": true + }, + "lodash._basetostring": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/lodash._basetostring/-/lodash._basetostring-3.0.1.tgz", + "integrity": "sha1-0YYdh3+CSlL2aYMtyvPuFVZqB9U=", + "dev": true + }, + "lodash._basevalues": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lodash._basevalues/-/lodash._basevalues-3.0.0.tgz", + "integrity": "sha1-W3dXYoAr3j0yl1A+JjAIIP32Ybc=", + "dev": true + }, + "lodash._getnative": { + "version": "3.9.1", + "resolved": "https://registry.npmjs.org/lodash._getnative/-/lodash._getnative-3.9.1.tgz", + "integrity": "sha1-VwvH3t5G1hzc3mh9ZdPuy6o6r/U=", + "dev": true + }, + "lodash._isiterateecall": { + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/lodash._isiterateecall/-/lodash._isiterateecall-3.0.9.tgz", + "integrity": "sha1-UgOte6Ql+uhCRg5pbbnPPmqsBXw=", + "dev": true + }, + "lodash._reescape": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lodash._reescape/-/lodash._reescape-3.0.0.tgz", + "integrity": "sha1-Kx1vXf4HyKNVdT5fJ/rH8c3hYWo=", + "dev": true + }, + "lodash._reevaluate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lodash._reevaluate/-/lodash._reevaluate-3.0.0.tgz", + "integrity": "sha1-WLx0xAZklTrgsSTYBpltrKQx4u0=", + "dev": true + }, + "lodash._reinterpolate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz", + "integrity": "sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0=", + "dev": true + }, + "lodash._root": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/lodash._root/-/lodash._root-3.0.1.tgz", + "integrity": "sha1-+6HEUkwZ7ppfgTa0YJ8BfPTe1pI=", + "dev": true + }, + "lodash.defaults": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-4.2.0.tgz", + "integrity": "sha1-0JF4cW/+pN3p5ft7N/bwgCJ0WAw=", + "dev": true + }, + "lodash.escape": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/lodash.escape/-/lodash.escape-3.2.0.tgz", + "integrity": "sha1-mV7g3BjBtIzJLv+ucaEKq1tIdpg=", + "dev": true, + "requires": { + "lodash._root": "3.0.1" + } + }, + "lodash.isarguments": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz", + "integrity": "sha1-L1c9hcaiQon/AGY7SRwdM4/zRYo=", + "dev": true + }, + "lodash.isarray": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/lodash.isarray/-/lodash.isarray-3.0.4.tgz", + "integrity": "sha1-eeTriMNqgSKvhvhEqpvNhRtfu1U=", + "dev": true + }, + "lodash.isplainobject": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", + "integrity": "sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs=", + "dev": true + }, + "lodash.isstring": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz", + "integrity": "sha1-1SfftUVuynzJu5XV2ur4i6VKVFE=", + "dev": true + }, + "lodash.keys": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-3.1.2.tgz", + "integrity": "sha1-TbwEcrFWvlCgsoaFXRvQsMZWCYo=", + "dev": true, + "requires": { + "lodash._getnative": "3.9.1", + "lodash.isarguments": "3.1.0", + "lodash.isarray": "3.0.4" + } + }, + "lodash.mapvalues": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/lodash.mapvalues/-/lodash.mapvalues-4.6.0.tgz", + "integrity": "sha1-G6+lAF3p3W9PJmaMMMo3IwzJaJw=", + "dev": true + }, + "lodash.memoize": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-3.0.4.tgz", + "integrity": "sha1-LcvSwofLwKVcxCMovQxzYVDVPj8=", + "dev": true + }, + "lodash.restparam": { + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/lodash.restparam/-/lodash.restparam-3.6.1.tgz", + "integrity": "sha1-k2pOMJ7zMKdkXtQUWYbIWuWyCAU=", + "dev": true + }, + "lodash.template": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-3.6.2.tgz", + "integrity": "sha1-+M3sxhaaJVvpCYrosMU9N4kx0U8=", + "dev": true, + "requires": { + "lodash._basecopy": "3.0.1", + "lodash._basetostring": "3.0.1", + "lodash._basevalues": "3.0.0", + "lodash._isiterateecall": "3.0.9", + "lodash._reinterpolate": "3.0.0", + "lodash.escape": "3.2.0", + "lodash.keys": "3.1.2", + "lodash.restparam": "3.6.1", + "lodash.templatesettings": "3.1.1" + } + }, + "lodash.templatesettings": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-3.1.1.tgz", + "integrity": "sha1-+zB4RHU7Zrnxr6VOJix0UwfbqOU=", + "dev": true, + "requires": { + "lodash._reinterpolate": "3.0.0", + "lodash.escape": "3.2.0" + } + }, + "longest": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz", + "integrity": "sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc=", + "dev": true + }, + "lru-cache": { + "version": "2.7.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.7.3.tgz", + "integrity": "sha1-bUUk6LlV+V1PW1iFHOId1y+06VI=", + "dev": true + }, + "map-cache": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", + "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", + "dev": true + }, + "micromatch": { + "version": "2.3.11", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", + "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", + "dev": true, + "requires": { + "arr-diff": "2.0.0", + "array-unique": "0.2.1", + "braces": "1.8.5", + "expand-brackets": "0.1.5", + "extglob": "0.3.2", + "filename-regex": "2.0.1", + "is-extglob": "1.0.0", + "is-glob": "2.0.1", + "kind-of": "3.2.2", + "normalize-path": "2.1.1", + "object.omit": "2.0.1", + "parse-glob": "3.0.4", + "regex-cache": "0.4.3" + } + }, + "miller-rabin": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.0.tgz", + "integrity": "sha1-SmL7HUKTPAVYOYL0xxb2+55sbT0=", + "dev": true, + "requires": { + "bn.js": "4.11.7", + "brorand": "1.1.0" + } + }, + "minimalistic-assert": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.0.tgz", + "integrity": "sha1-cCvi3aazf0g2vLP121ZkG2Sh09M=", + "dev": true + }, + "minimalistic-crypto-utils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", + "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=", + "dev": true + }, + "minimatch": { + "version": "2.0.10", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-2.0.10.tgz", + "integrity": "sha1-jQh8OcazjAAbl/ynzm0OHoCvusc=", + "dev": true, + "requires": { + "brace-expansion": "1.1.8" + } + }, + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true + }, + "mkdirp": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "dev": true, + "requires": { + "minimist": "0.0.8" + }, + "dependencies": { + "minimist": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", + "dev": true + } + } + }, + "module-deps": { + "version": "3.9.1", + "resolved": "https://registry.npmjs.org/module-deps/-/module-deps-3.9.1.tgz", + "integrity": "sha1-6nXK+RmQkNJbDVUStaysuW5/h/M=", + "dev": true, + "requires": { + "browser-resolve": "1.11.2", + "concat-stream": "1.4.10", + "defined": "1.0.0", + "detective": "4.5.0", + "duplexer2": "0.0.2", + "inherits": "2.0.3", + "JSONStream": "1.3.1", + "parents": "1.0.1", + "readable-stream": "1.1.14", + "resolve": "1.4.0", + "stream-combiner2": "1.0.2", + "subarg": "1.0.0", + "through2": "1.1.1", + "xtend": "4.0.1" + }, + "dependencies": { + "defined": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz", + "integrity": "sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM=", + "dev": true + }, + "jsonparse": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", + "integrity": "sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA=", + "dev": true + }, + "JSONStream": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.1.tgz", + "integrity": "sha1-cH92HgHa6eFvG8+TcDt4xwlmV5o=", + "dev": true, + "requires": { + "jsonparse": "1.3.1", + "through": "2.3.8" + } + }, + "resolve": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.4.0.tgz", + "integrity": "sha512-aW7sVKPufyHqOmyyLzg/J+8606v5nevBgaliIlV7nUpVMsDnoBGV/cbSLNjZAg9q0Cfd/+easKVKQ8vOu8fn1Q==", + "dev": true, + "requires": { + "path-parse": "1.0.5" + } + }, + "xtend": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", + "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=", + "dev": true + } + } + }, + "multipipe": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/multipipe/-/multipipe-0.1.2.tgz", + "integrity": "sha1-Ko8t33Du1WTf8tV/HhoTfZ8FB4s=", + "dev": true, + "requires": { + "duplexer2": "0.0.2" + } + }, + "natives": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/natives/-/natives-1.1.0.tgz", + "integrity": "sha1-6f+EFBimsux6SV6TmYT3jxY+bjE=", + "dev": true + }, + "ngraph.centrality": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/ngraph.centrality/-/ngraph.centrality-0.1.3.tgz", + "integrity": "sha1-bKB7QXmv8AfYSY7e8lZoizfYdp0=" + }, + "ngraph.events": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/ngraph.events/-/ngraph.events-0.0.3.tgz", + "integrity": "sha1-OPVTFvPSB61jH/lPZiLKjywOh9A=" + }, + "ngraph.expose": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/ngraph.expose/-/ngraph.expose-0.0.0.tgz", + "integrity": "sha1-dGw0kDo4SMRdAzsUvGRhnqhf5ao=" + }, + "ngraph.forcelayout": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/ngraph.forcelayout/-/ngraph.forcelayout-0.1.2.tgz", + "integrity": "sha1-PC4SJ/KRSLqyn8WLweg3SfYdS8U=", + "requires": { + "ngraph.events": "0.0.3", + "ngraph.physics.simulator": "0.1.1" + } + }, + "ngraph.fromjson": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/ngraph.fromjson/-/ngraph.fromjson-0.1.7.tgz", + "integrity": "sha1-VXEnCsj+ED6xaEQUbolIrUIhnHM=", + "requires": { + "ngraph.graph": "0.0.11" + } + }, + "ngraph.generators": { + "version": "0.0.15", + "resolved": "https://registry.npmjs.org/ngraph.generators/-/ngraph.generators-0.0.15.tgz", + "integrity": "sha1-GgnH6S2IPXi8gWwGwvZkC0X0z/I=", + "requires": { + "ngraph.graph": "0.0.11", + "ngraph.random": "0.0.1" + } + }, + "ngraph.graph": { + "version": "0.0.11", + "resolved": "https://registry.npmjs.org/ngraph.graph/-/ngraph.graph-0.0.11.tgz", + "integrity": "sha1-nxCnJn71l3Q5rFB7r8un9O1yhAE=", + "requires": { + "ngraph.events": "0.0.3" + } + }, + "ngraph.merge": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/ngraph.merge/-/ngraph.merge-0.0.1.tgz", + "integrity": "sha1-5OgM43WBo8lrF9VF46Q8hUNLkCU=" + }, + "ngraph.physics.primitives": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/ngraph.physics.primitives/-/ngraph.physics.primitives-0.0.7.tgz", + "integrity": "sha1-Xcnhebofkubex3SwHNaJFBILeVs=" + }, + "ngraph.physics.simulator": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/ngraph.physics.simulator/-/ngraph.physics.simulator-0.1.1.tgz", + "integrity": "sha1-h5RmUATQJbnkIyEV/O/9l7+sCK0=", + "requires": { + "ngraph.events": "0.0.3", + "ngraph.expose": "0.0.0", + "ngraph.merge": "0.0.1", + "ngraph.physics.primitives": "0.0.7", + "ngraph.quadtreebh": "0.0.4", + "ngraph.random": "0.0.1" + } + }, + "ngraph.quadtreebh": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/ngraph.quadtreebh/-/ngraph.quadtreebh-0.0.4.tgz", + "integrity": "sha1-xwDUTm5K8HttBQAbo5h/9eLc1iw=", + "requires": { + "ngraph.random": "0.0.1" + } + }, + "ngraph.random": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/ngraph.random/-/ngraph.random-0.0.1.tgz", + "integrity": "sha1-wAji67/f+vF+0Q5LvJE+VnFmvPg=" + }, + "ngraph.remove-overlaps": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/ngraph.remove-overlaps/-/ngraph.remove-overlaps-1.0.0.tgz", + "integrity": "sha1-tMBjVT6kzx/3gWjnt//2JhfA2fQ=", + "dev": true + }, + "ngraph.tojson": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/ngraph.tojson/-/ngraph.tojson-0.1.3.tgz", + "integrity": "sha1-chUq8zBsABeXu3zJKTDpIbp76zo=" + }, + "nopt": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-2.2.1.tgz", + "integrity": "sha1-KqCbfRdoSHs7ianFqlIzW/8Lrqc=", + "dev": true, + "requires": { + "abbrev": "1.1.0" + } + }, + "normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "dev": true, + "requires": { + "remove-trailing-separator": "1.0.2" + } + }, + "object-assign": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-3.0.0.tgz", + "integrity": "sha1-m+3VygiXlJvKR+f/QIBi1Un1h/I=", + "dev": true + }, + "object.defaults": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/object.defaults/-/object.defaults-1.1.0.tgz", + "integrity": "sha1-On+GgzS0B96gbaFtiNXNKeQ1/s8=", + "dev": true, + "requires": { + "array-each": "1.0.1", + "array-slice": "1.0.0", + "for-own": "1.0.0", + "isobject": "3.0.1" + }, + "dependencies": { + "for-own": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/for-own/-/for-own-1.0.0.tgz", + "integrity": "sha1-xjMy9BXO3EsE2/5wz4NklMU8tEs=", + "dev": true, + "requires": { + "for-in": "1.0.2" + } + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + } + } + }, + "object.omit": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/object.omit/-/object.omit-2.0.1.tgz", + "integrity": "sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo=", + "dev": true, + "requires": { + "for-own": "0.1.5", + "is-extendable": "0.1.1" + } + }, + "object.pick": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.2.0.tgz", + "integrity": "sha1-tTkr7peC2m2ft9avr1OXefEjTCs=", + "dev": true, + "requires": { + "isobject": "2.1.0" + } + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dev": true, + "requires": { + "wrappy": "1.0.2" + } + }, + "onetime": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-1.1.0.tgz", + "integrity": "sha1-ofeDj4MUxRbwXs78vEzP4EtO14k=", + "dev": true + }, + "optimist": { + "version": "0.3.7", + "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.3.7.tgz", + "integrity": "sha1-yQlBrVnkJzMokjB00s8ufLxuwNk=", + "dev": true, + "requires": { + "wordwrap": "0.0.3" + } + }, + "orchestrator": { + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/orchestrator/-/orchestrator-0.3.8.tgz", + "integrity": "sha1-FOfp4nZPcxX7rBhOUGx6pt+UrX4=", + "dev": true, + "requires": { + "end-of-stream": "0.1.5", + "sequencify": "0.0.7", + "stream-consume": "0.1.0" + } + }, + "ordered-read-streams": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/ordered-read-streams/-/ordered-read-streams-0.1.0.tgz", + "integrity": "sha1-/VZamvjrRHO6abbtijQ1LLVS8SY=", + "dev": true + }, + "os-browserify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.1.2.tgz", + "integrity": "sha1-ScoCk+CxlZCl9d4Qx/JlphfY/lQ=", + "dev": true + }, + "os-homedir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", + "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", + "dev": true + }, + "pako": { + "version": "0.2.9", + "resolved": "https://registry.npmjs.org/pako/-/pako-0.2.9.tgz", + "integrity": "sha1-8/dSL073gjSNqBYbrZ7P1Rv4OnU=", + "dev": true + }, + "parents": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parents/-/parents-1.0.1.tgz", + "integrity": "sha1-/t1NK/GTp3dF/nHjcdc8MwfZx1E=", + "dev": true, + "requires": { + "path-platform": "0.11.15" + } + }, + "parse-asn1": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.0.tgz", + "integrity": "sha1-N8T5t+06tlx0gXtfJICTf7+XxxI=", + "dev": true, + "requires": { + "asn1.js": "4.9.1", + "browserify-aes": "1.0.6", + "create-hash": "1.1.3", + "evp_bytestokey": "1.0.0", + "pbkdf2": "3.0.13" + } + }, + "parse-filepath": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parse-filepath/-/parse-filepath-1.0.1.tgz", + "integrity": "sha1-FZ1hVdQ5BNFsEO9piRHaHpGWm3M=", + "dev": true, + "requires": { + "is-absolute": "0.2.6", + "map-cache": "0.2.2", + "path-root": "0.1.1" + } + }, + "parse-glob": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/parse-glob/-/parse-glob-3.0.4.tgz", + "integrity": "sha1-ssN2z7EfNVE7rdFz7wu246OIORw=", + "dev": true, + "requires": { + "glob-base": "0.3.0", + "is-dotfile": "1.0.3", + "is-extglob": "1.0.0", + "is-glob": "2.0.1" + } + }, + "parse-passwd": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz", + "integrity": "sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=", + "dev": true + }, + "path-browserify": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.0.tgz", + "integrity": "sha1-oLhwcpquIUAFt9UDLsLLuw+0RRo=", + "dev": true + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "dev": true + }, + "path-is-inside": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", + "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=", + "dev": true + }, + "path-parse": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.5.tgz", + "integrity": "sha1-PBrfhx6pzWyUMbbqK9dKD/BVxME=", + "dev": true + }, + "path-platform": { + "version": "0.11.15", + "resolved": "https://registry.npmjs.org/path-platform/-/path-platform-0.11.15.tgz", + "integrity": "sha1-6GQhf3TDaFDwhSt43Hv31KVyG/I=", + "dev": true + }, + "path-root": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/path-root/-/path-root-0.1.1.tgz", + "integrity": "sha1-mkpoFMrBwM1zNgqV8yCDyOpHRbc=", + "dev": true, + "requires": { + "path-root-regex": "0.1.2" + } + }, + "path-root-regex": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/path-root-regex/-/path-root-regex-0.1.2.tgz", + "integrity": "sha1-v8zcjfWxLcUsi0PsONGNcsBLqW0=", + "dev": true + }, + "pbkdf2": { + "version": "3.0.13", + "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.0.13.tgz", + "integrity": "sha512-+dCHxDH+djNtjgWmvVC/my3SYBAKpKNqKSjLkp+GtWWYe4XPE+e/PSD2aCanlEZZnqPk2uekTKNC/ccbwd2X2Q==", + "dev": true, + "requires": { + "create-hash": "1.1.3", + "create-hmac": "1.1.6", + "ripemd160": "2.0.1", + "safe-buffer": "5.1.1", + "sha.js": "2.4.8" + } + }, + "preserve": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/preserve/-/preserve-0.2.0.tgz", + "integrity": "sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks=", + "dev": true + }, + "pretty-hrtime": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz", + "integrity": "sha1-t+PqQkNaTJsnWdmeDyAesZWALuE=", + "dev": true + }, + "process": { + "version": "0.10.1", + "resolved": "https://registry.npmjs.org/process/-/process-0.10.1.tgz", + "integrity": "sha1-hCRXzFHP7XLcd1r+6vuMYDQ3JyU=", + "dev": true + }, + "process-nextick-args": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", + "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=", + "dev": true + }, + "public-encrypt": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.0.tgz", + "integrity": "sha1-OfaZ86RlYN1eusvKaTyvfGXBjMY=", + "dev": true, + "requires": { + "bn.js": "4.11.7", + "browserify-rsa": "4.0.1", + "create-hash": "1.1.3", + "parse-asn1": "5.1.0", + "randombytes": "2.0.5" + } + }, + "punycode": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.2.4.tgz", + "integrity": "sha1-VACKyXKux0F13vnLpt9/qdORh0A=", + "dev": true + }, + "querystring": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", + "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=", + "dev": true + }, + "querystring-es3": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", + "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=", + "dev": true + }, + "randomatic": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-1.1.7.tgz", + "integrity": "sha512-D5JUjPyJbaJDkuAazpVnSfVkLlpeO3wDlPROTMLGKG1zMFNFRgrciKo1ltz/AzNTkqE0HzDx655QOL51N06how==", + "dev": true, + "requires": { + "is-number": "3.0.0", + "kind-of": "4.0.0" + }, + "dependencies": { + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "3.2.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "1.1.5" + } + } + } + }, + "kind-of": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", + "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", + "dev": true, + "requires": { + "is-buffer": "1.1.5" + } + } + } + }, + "randombytes": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.0.5.tgz", + "integrity": "sha512-8T7Zn1AhMsQ/HI1SjcCfT/t4ii3eAqco3yOcSzS4mozsOz69lHLsoMXmF9nZgnFanYscnSlUSgs8uZyKzpE6kg==", + "dev": true, + "requires": { + "safe-buffer": "5.1.1" + } + }, + "readable-stream": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", + "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", + "dev": true, + "requires": { + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "0.0.1", + "string_decoder": "0.10.31" + } + }, + "readable-wrap": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/readable-wrap/-/readable-wrap-1.0.0.tgz", + "integrity": "sha1-O1ohHGMeEjA6VJkcgGwX564ga/8=", + "dev": true, + "requires": { + "readable-stream": "1.1.14" + } + }, + "rechoir": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", + "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=", + "dev": true, + "requires": { + "resolve": "1.4.0" + }, + "dependencies": { + "resolve": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.4.0.tgz", + "integrity": "sha512-aW7sVKPufyHqOmyyLzg/J+8606v5nevBgaliIlV7nUpVMsDnoBGV/cbSLNjZAg9q0Cfd/+easKVKQ8vOu8fn1Q==", + "dev": true, + "requires": { + "path-parse": "1.0.5" + } + } + } + }, + "regex-cache": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/regex-cache/-/regex-cache-0.4.3.tgz", + "integrity": "sha1-mxpsNdTQ3871cRrmUejp09cRQUU=", + "dev": true, + "requires": { + "is-equal-shallow": "0.1.3", + "is-primitive": "2.0.0" + } + }, + "remove-trailing-separator": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.0.2.tgz", + "integrity": "sha1-abBi2XhyetFNxrVrpKt3L9jXBRE=", + "dev": true + }, + "repeat-element": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.2.tgz", + "integrity": "sha1-7wiaF40Ug7quTZPrmLT55OEdmQo=", + "dev": true + }, + "repeat-string": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", + "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", + "dev": true + }, + "replace-ext": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-0.0.1.tgz", + "integrity": "sha1-KbvZIHinOfC8zitO5B6DeVNSKSQ=", + "dev": true + }, + "resolve": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-0.7.4.tgz", + "integrity": "sha1-OVqe+ehz+/4SvRRAi9kbuTYAPWk=", + "dev": true + }, + "resolve-dir": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-0.1.1.tgz", + "integrity": "sha1-shklmlYC+sXFxJatiUpujMQwJh4=", + "dev": true, + "requires": { + "expand-tilde": "1.2.2", + "global-modules": "0.2.3" + } + }, + "rfile": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/rfile/-/rfile-1.0.0.tgz", + "integrity": "sha1-WXCM+Qyh50xUw8/Fw2/bmBBDUmE=", + "dev": true, + "requires": { + "callsite": "1.0.0", + "resolve": "0.3.1" + }, + "dependencies": { + "resolve": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-0.3.1.tgz", + "integrity": "sha1-NMY0R8ZkxwWY0cmxJvxDsqJDEKQ=", + "dev": true + } + } + }, + "right-align": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/right-align/-/right-align-0.1.3.tgz", + "integrity": "sha1-YTObci/mo1FWiSENJOFMlhSGE+8=", + "dev": true, + "requires": { + "align-text": "0.1.4" + } + }, + "rimraf": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.1.tgz", + "integrity": "sha1-wjOOxkPfeht/5cVPqG9XQopV8z0=", + "dev": true, + "requires": { + "glob": "7.1.2" + }, + "dependencies": { + "glob": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", + "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", + "dev": true, + "requires": { + "fs.realpath": "1.0.0", + "inflight": "1.0.6", + "inherits": "2.0.3", + "minimatch": "3.0.4", + "once": "1.4.0", + "path-is-absolute": "1.0.1" + } + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dev": true, + "requires": { + "brace-expansion": "1.1.8" + } + } + } + }, + "ripemd160": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.1.tgz", + "integrity": "sha1-D0WEKVxTo2KK9+bXmsohzlfRxuc=", + "dev": true, + "requires": { + "hash-base": "2.0.2", + "inherits": "2.0.3" + } + }, + "ruglify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/ruglify/-/ruglify-1.0.0.tgz", + "integrity": "sha1-3Ikw4qlUSidDAcyZcldMDQmGtnU=", + "dev": true, + "requires": { + "rfile": "1.0.0", + "uglify-js": "2.2.5" + }, + "dependencies": { + "uglify-js": { + "version": "2.2.5", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.2.5.tgz", + "integrity": "sha1-puAqcNg5eSuXgEiLe4sYTAlcmcc=", + "dev": true, + "requires": { + "optimist": "0.3.7", + "source-map": "0.1.43" + } + } + } + }, + "runforcover": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/runforcover/-/runforcover-0.0.2.tgz", + "integrity": "sha1-NE8FfY1F0zrrxsyCIEZ49pxIV8w=", + "dev": true, + "requires": { + "bunker": "0.1.2" + } + }, + "safe-buffer": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", + "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==", + "dev": true + }, + "semver": { + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/semver/-/semver-4.3.6.tgz", + "integrity": "sha1-MAvG4OhjdPe6YQaLWx7NV/xlMto=", + "dev": true + }, + "sequencify": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/sequencify/-/sequencify-0.0.7.tgz", + "integrity": "sha1-kM/xnQLgcCf9dn9erT57ldHnOAw=", + "dev": true + }, + "set-immediate-shim": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz", + "integrity": "sha1-SysbJ+uAip+NzEgaWOXlb1mfP2E=", + "dev": true + }, + "sha.js": { + "version": "2.4.8", + "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.8.tgz", + "integrity": "sha1-NwaMLEdra69ALRSknGf1l5IfY08=", + "dev": true, + "requires": { + "inherits": "2.0.3" + } + }, + "shallow-copy": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/shallow-copy/-/shallow-copy-0.0.1.tgz", + "integrity": "sha1-QV9CcC1z2BAzApLMXuhurhoRoXA=", + "dev": true + }, + "shasum": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/shasum/-/shasum-1.0.2.tgz", + "integrity": "sha1-5wEjENj0F/TetXEhUOVni4euVl8=", + "dev": true, + "requires": { + "json-stable-stringify": "0.0.1", + "sha.js": "2.4.8" + } + }, + "shell-quote": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-0.0.1.tgz", + "integrity": "sha1-GkEZbzwDM8SCMjWT1ohuzxU92YY=", + "dev": true + }, + "sigmund": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.1.tgz", + "integrity": "sha1-P/IfGYytIXX587eBhT/ZTQ0ZtZA=", + "dev": true + }, + "simplesvg": { + "version": "0.0.10", + "resolved": "https://registry.npmjs.org/simplesvg/-/simplesvg-0.0.10.tgz", + "integrity": "sha1-N9LsGN4sFU3Ztp956K0gvx4eX90=", + "requires": { + "add-event-listener": "0.0.1" + } + }, + "slide": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/slide/-/slide-1.1.6.tgz", + "integrity": "sha1-VusCfWW00tzmyy4tMsTUr8nh1wc=", + "dev": true + }, + "source-map": { + "version": "0.1.43", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.1.43.tgz", + "integrity": "sha1-wkvBRspRfBRx9drL4lcbK3+eM0Y=", + "dev": true, + "requires": { + "amdefine": "1.0.1" + } + }, + "sparkles": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/sparkles/-/sparkles-1.0.0.tgz", + "integrity": "sha1-Gsu/tZJDbRC76PeFt8xvgoFQEsM=", + "dev": true + }, + "stream-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-1.0.0.tgz", + "integrity": "sha1-v5tKv7QrJ011FHnkTg/yZWtvEZM=", + "dev": true, + "requires": { + "inherits": "2.0.3", + "readable-stream": "1.1.14" + } + }, + "stream-combiner2": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/stream-combiner2/-/stream-combiner2-1.0.2.tgz", + "integrity": "sha1-unKmtQy/q/qVD8i8h2BL0B62BnE=", + "dev": true, + "requires": { + "duplexer2": "0.0.2", + "through2": "0.5.1" + }, + "dependencies": { + "readable-stream": { + "version": "1.0.34", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", + "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", + "dev": true, + "requires": { + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "0.0.1", + "string_decoder": "0.10.31" + } + }, + "through2": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/through2/-/through2-0.5.1.tgz", + "integrity": "sha1-390BLrnHAOIyP9M084rGIqs3Lac=", + "dev": true, + "requires": { + "readable-stream": "1.0.34", + "xtend": "3.0.0" + } + } + } + }, + "stream-consume": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/stream-consume/-/stream-consume-0.1.0.tgz", + "integrity": "sha1-pB6tGm1ggc63n2WwYZAbbY89HQ8=", + "dev": true + }, + "stream-splicer": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/stream-splicer/-/stream-splicer-1.3.2.tgz", + "integrity": "sha1-PARBvhW5v04iYnXm3IOWR0VUZmE=", + "dev": true, + "requires": { + "indexof": "0.0.1", + "inherits": "2.0.3", + "isarray": "0.0.1", + "readable-stream": "1.1.14", + "readable-wrap": "1.0.0", + "through2": "1.1.1" + } + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", + "dev": true + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "2.1.1" + } + }, + "strip-bom": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-1.0.0.tgz", + "integrity": "sha1-hbiGLzhEtabV7IRnqTWYFzo295Q=", + "dev": true, + "requires": { + "first-chunk-stream": "1.0.0", + "is-utf8": "0.2.1" + } + }, + "subarg": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/subarg/-/subarg-1.0.0.tgz", + "integrity": "sha1-9izxdYHplrSPyWVpn1TAauJouNI=", + "dev": true, + "requires": { + "minimist": "1.2.0" + } + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + }, + "syntax-error": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/syntax-error/-/syntax-error-1.3.0.tgz", + "integrity": "sha1-HtkmbE1AvnXcVb+bsct3Biu5bKE=", + "dev": true, + "requires": { + "acorn": "4.0.13" + } + }, + "tap": { + "version": "0.4.13", + "resolved": "https://registry.npmjs.org/tap/-/tap-0.4.13.tgz", + "integrity": "sha1-OYYTTWdZcn/CIj5hEm7rhyQ6zLw=", + "dev": true, + "requires": { + "buffer-equal": "0.0.2", + "deep-equal": "0.0.0", + "difflet": "0.2.6", + "glob": "3.2.11", + "inherits": "2.0.3", + "mkdirp": "0.5.1", + "nopt": "2.2.1", + "runforcover": "0.0.2", + "slide": "1.1.6", + "yamlish": "0.0.7" + }, + "dependencies": { + "deep-equal": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-0.0.0.tgz", + "integrity": "sha1-mWedO70EcVb81FDT0B7rkGhpHoM=", + "dev": true + }, + "glob": { + "version": "3.2.11", + "resolved": "https://registry.npmjs.org/glob/-/glob-3.2.11.tgz", + "integrity": "sha1-Spc/Y1uRkPcV0QmH1cAP0oFevj0=", + "dev": true, + "requires": { + "inherits": "2.0.3", + "minimatch": "0.3.0" + } + }, + "minimatch": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-0.3.0.tgz", + "integrity": "sha1-J12O2qxPG7MyZHIInnlJyDlGmd0=", + "dev": true, + "requires": { + "lru-cache": "2.7.3", + "sigmund": "1.0.1" + } + } + } + }, + "through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", + "dev": true + }, + "through2": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/through2/-/through2-1.1.1.tgz", + "integrity": "sha1-CEfLxESfNAVXTb3M2buEG4OsNUU=", + "dev": true, + "requires": { + "readable-stream": "1.1.14", + "xtend": "4.0.1" + }, + "dependencies": { + "xtend": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", + "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=", + "dev": true + } + } + }, + "tildify": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/tildify/-/tildify-1.2.0.tgz", + "integrity": "sha1-3OwD9V3Km3qj5bBPIYF+tW5jWIo=", + "dev": true, + "requires": { + "os-homedir": "1.0.2" + } + }, + "time-stamp": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/time-stamp/-/time-stamp-1.1.0.tgz", + "integrity": "sha1-dkpaEa9QVhkhsTPztE5hhofg9cM=", + "dev": true + }, + "timers-browserify": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-1.4.2.tgz", + "integrity": "sha1-ycWLV1voQHN1y14kYtrO50NZ9B0=", + "dev": true, + "requires": { + "process": "0.11.10" + }, + "dependencies": { + "process": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=", + "dev": true + } + } + }, + "traverse": { + "version": "0.6.6", + "resolved": "https://registry.npmjs.org/traverse/-/traverse-0.6.6.tgz", + "integrity": "sha1-y99WD9e5r2MlAv7UD5GMFX6pcTc=", + "dev": true + }, + "tty-browserify": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz", + "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=", + "dev": true + }, + "typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", + "dev": true + }, + "uglify-js": { + "version": "2.4.24", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.4.24.tgz", + "integrity": "sha1-+tV1XB4Vd2WLsG/5q25UjJW+vW4=", + "dev": true, + "requires": { + "async": "0.2.10", + "source-map": "0.1.34", + "uglify-to-browserify": "1.0.2", + "yargs": "3.5.4" + }, + "dependencies": { + "source-map": { + "version": "0.1.34", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.1.34.tgz", + "integrity": "sha1-p8/omux7FoLDsZjQrPtH19CQVms=", + "dev": true, + "requires": { + "amdefine": "1.0.1" + } + } + } + }, + "uglify-save-license": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/uglify-save-license/-/uglify-save-license-0.4.1.tgz", + "integrity": "sha1-lXJsF8xv0XHDYX479NjYKqjEzOE=", + "dev": true + }, + "uglify-to-browserify": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz", + "integrity": "sha1-bgkk1r2mta/jSeOabWMoUKD4grc=", + "dev": true + }, + "umd": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/umd/-/umd-2.1.0.tgz", + "integrity": "sha1-SmMHt2LxfwLSAbX6FU5nM5bCY88=", + "dev": true, + "requires": { + "rfile": "1.0.0", + "ruglify": "1.0.0", + "through": "2.3.8", + "uglify-js": "2.4.24" + } + }, + "unc-path-regex": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/unc-path-regex/-/unc-path-regex-0.1.2.tgz", + "integrity": "sha1-5z3T17DXxe2G+6xrCufYxqadUPo=", + "dev": true + }, + "unique-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unique-stream/-/unique-stream-1.0.0.tgz", + "integrity": "sha1-1ZpKdUJ0R9mqbJHnAmP40mpLEEs=", + "dev": true + }, + "url": { + "version": "0.10.3", + "resolved": "https://registry.npmjs.org/url/-/url-0.10.3.tgz", + "integrity": "sha1-Ah5NnHcF8hu/N9A861h2dAJ3TGQ=", + "dev": true, + "requires": { + "punycode": "1.3.2", + "querystring": "0.2.0" + }, + "dependencies": { + "punycode": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", + "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=", + "dev": true + } + } + }, + "user-home": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/user-home/-/user-home-1.1.1.tgz", + "integrity": "sha1-K1viOjK2Onyd640PKNSFcko98ZA=", + "dev": true + }, + "util": { + "version": "0.10.3", + "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", + "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", + "dev": true, + "requires": { + "inherits": "2.0.1" + }, + "dependencies": { + "inherits": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", + "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=", + "dev": true + } + } + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", + "dev": true + }, + "v8flags": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/v8flags/-/v8flags-2.1.1.tgz", + "integrity": "sha1-qrGh+jDUX4jdMhFIh1rALAtV5bQ=", + "dev": true, + "requires": { + "user-home": "1.1.1" + } + }, + "vinyl": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-0.5.3.tgz", + "integrity": "sha1-sEVbOPxeDPMNQyUTLkYZcMIJHN4=", + "dev": true, + "requires": { + "clone": "1.0.2", + "clone-stats": "0.0.1", + "replace-ext": "0.0.1" + } + }, + "vinyl-buffer": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/vinyl-buffer/-/vinyl-buffer-1.0.0.tgz", + "integrity": "sha1-ygZ+oIQx1QdyKx3lCD9gJhbrwjQ=", + "dev": true, + "requires": { + "bl": "0.9.5", + "through2": "0.6.5" + }, + "dependencies": { + "readable-stream": { + "version": "1.0.34", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", + "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", + "dev": true, + "requires": { + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "0.0.1", + "string_decoder": "0.10.31" + } + }, + "through2": { + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz", + "integrity": "sha1-QaucZ7KdVyCQcUEOHXp6lozTrUg=", + "dev": true, + "requires": { + "readable-stream": "1.0.34", + "xtend": "4.0.1" + } + }, + "xtend": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", + "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=", + "dev": true + } + } + }, + "vinyl-fs": { + "version": "0.3.14", + "resolved": "https://registry.npmjs.org/vinyl-fs/-/vinyl-fs-0.3.14.tgz", + "integrity": "sha1-mmhRzhysHBzqX+hsCTHWIMLPqeY=", + "dev": true, + "requires": { + "defaults": "1.0.3", + "glob-stream": "3.1.18", + "glob-watcher": "0.0.6", + "graceful-fs": "3.0.11", + "mkdirp": "0.5.1", + "strip-bom": "1.0.0", + "through2": "0.6.5", + "vinyl": "0.4.6" + }, + "dependencies": { + "clone": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/clone/-/clone-0.2.0.tgz", + "integrity": "sha1-xhJqkK1Pctv1rNskPMN3JP6T/B8=", + "dev": true + }, + "readable-stream": { + "version": "1.0.34", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", + "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", + "dev": true, + "requires": { + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "0.0.1", + "string_decoder": "0.10.31" + } + }, + "through2": { + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz", + "integrity": "sha1-QaucZ7KdVyCQcUEOHXp6lozTrUg=", + "dev": true, + "requires": { + "readable-stream": "1.0.34", + "xtend": "4.0.1" + } + }, + "vinyl": { + "version": "0.4.6", + "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-0.4.6.tgz", + "integrity": "sha1-LzVsh6VQolVGHza76ypbqL94SEc=", + "dev": true, + "requires": { + "clone": "0.2.0", + "clone-stats": "0.0.1" + } + }, + "xtend": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", + "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=", + "dev": true + } + } + }, + "vinyl-source-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/vinyl-source-stream/-/vinyl-source-stream-1.1.0.tgz", + "integrity": "sha1-RMvlEIIFJ53rDFZTwJSiiHk4sas=", + "dev": true, + "requires": { + "through2": "0.6.5", + "vinyl": "0.4.6" + }, + "dependencies": { + "clone": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/clone/-/clone-0.2.0.tgz", + "integrity": "sha1-xhJqkK1Pctv1rNskPMN3JP6T/B8=", + "dev": true + }, + "readable-stream": { + "version": "1.0.34", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", + "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", + "dev": true, + "requires": { + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "0.0.1", + "string_decoder": "0.10.31" + } + }, + "through2": { + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz", + "integrity": "sha1-QaucZ7KdVyCQcUEOHXp6lozTrUg=", + "dev": true, + "requires": { + "readable-stream": "1.0.34", + "xtend": "4.0.1" + } + }, + "vinyl": { + "version": "0.4.6", + "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-0.4.6.tgz", + "integrity": "sha1-LzVsh6VQolVGHza76ypbqL94SEc=", + "dev": true, + "requires": { + "clone": "0.2.0", + "clone-stats": "0.0.1" + } + }, + "xtend": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", + "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=", + "dev": true + } + } + }, + "vinyl-sourcemaps-apply": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/vinyl-sourcemaps-apply/-/vinyl-sourcemaps-apply-0.2.1.tgz", + "integrity": "sha1-q2VJ1h0XLCsbh75cUI0jnI74dwU=", + "dev": true, + "requires": { + "source-map": "0.5.6" + }, + "dependencies": { + "source-map": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz", + "integrity": "sha1-dc449SvwczxafwwRjYEzSiu19BI=", + "dev": true + } + } + }, + "vm-browserify": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-0.0.4.tgz", + "integrity": "sha1-XX6kW7755Kb/ZflUOOCofDV9WnM=", + "dev": true, + "requires": { + "indexof": "0.0.1" + } + }, + "which": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.0.tgz", + "integrity": "sha512-xcJpopdamTuY5duC/KnTTNBraPK54YwpenP4lzxU8H91GudWpFv38u0CKjclE1Wi2EH2EDz5LRcHcKbCIzqGyg==", + "dev": true, + "requires": { + "isexe": "2.0.0" + } + }, + "window-size": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.0.tgz", + "integrity": "sha1-VDjNLqk7IC76Ohn+iIeu58lPnJ0=", + "dev": true + }, + "wordwrap": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz", + "integrity": "sha1-o9XabNXAvAAI03I0u68b7WMFkQc=", + "dev": true + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "dev": true + }, + "xtend": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-3.0.0.tgz", + "integrity": "sha1-XM50B7r2Qsunvs2laBEcST9ZZlo=", + "dev": true + }, + "yamlish": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/yamlish/-/yamlish-0.0.7.tgz", + "integrity": "sha1-tK+aHcxjYYhzw9bkUewyE8OaV/s=", + "dev": true + }, + "yargs": { + "version": "3.5.4", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.5.4.tgz", + "integrity": "sha1-2K/49mXpTDS9JZvevRv68N3TU2E=", + "dev": true, + "requires": { + "camelcase": "1.2.1", + "decamelize": "1.2.0", + "window-size": "0.1.0", + "wordwrap": "0.0.2" + }, + "dependencies": { + "wordwrap": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz", + "integrity": "sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8=", + "dev": true + } + } + } + } +} diff --git a/src/View/webglGraphics.js b/src/View/webglGraphics.js index 7a2fd4f..7066ef0 100644 --- a/src/View/webglGraphics.js +++ b/src/View/webglGraphics.js @@ -290,6 +290,12 @@ function webglGraphics(options) { return this; }, + /** + * Resizes the graphic without resetting the scale. + * Useful with viva graph in a dynamic container + */ + updateSize: updateSize, + /** * Called by Viva.Graph.View.renderer to let concrete graphic output * provider prepare to render. From 42af85f27d023675fc1b9483dfb153e338bf0f78 Mon Sep 17 00:00:00 2001 From: jlazar Date: Mon, 7 Aug 2017 15:00:35 -0400 Subject: [PATCH 13/49] removing package-lock --- package-lock.json | 3681 --------------------------------------------- 1 file changed, 3681 deletions(-) delete mode 100644 package-lock.json diff --git a/package-lock.json b/package-lock.json deleted file mode 100644 index 549379a..0000000 --- a/package-lock.json +++ /dev/null @@ -1,3681 +0,0 @@ -{ - "name": "vivagraphjs", - "version": "0.9.0", - "lockfileVersion": 1, - "requires": true, - "dependencies": { - "abbrev": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.0.tgz", - "integrity": "sha1-0FVMIlZjbi9W58LlrRg/hZQo2B8=", - "dev": true - }, - "acorn": { - "version": "4.0.13", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-4.0.13.tgz", - "integrity": "sha1-EFSVrlNh1pe9GVyCUZLhrX8lN4c=", - "dev": true - }, - "add-event-listener": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/add-event-listener/-/add-event-listener-0.0.1.tgz", - "integrity": "sha1-p2Ip68ZMiu+uIEoWJzovJVq+otA=" - }, - "align-text": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz", - "integrity": "sha1-DNkKVhCT810KmSVsIrcGlDP60Rc=", - "dev": true, - "requires": { - "kind-of": "3.2.2", - "longest": "1.0.1", - "repeat-string": "1.6.1" - } - }, - "amdefine": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz", - "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=", - "dev": true - }, - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true - }, - "ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", - "dev": true - }, - "archy": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz", - "integrity": "sha1-+cjBN1fMHde8N5rHeyxipcKGjEA=", - "dev": true - }, - "arr-diff": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", - "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", - "dev": true, - "requires": { - "arr-flatten": "1.1.0" - } - }, - "arr-flatten": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", - "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", - "dev": true - }, - "array-differ": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/array-differ/-/array-differ-1.0.0.tgz", - "integrity": "sha1-7/UuN1gknTO+QCuLuOVkuytdQDE=", - "dev": true - }, - "array-each": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/array-each/-/array-each-1.0.1.tgz", - "integrity": "sha1-p5SvDAWrF1KEbudTofIRoFugxE8=", - "dev": true - }, - "array-slice": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/array-slice/-/array-slice-1.0.0.tgz", - "integrity": "sha1-5zA08A3MH0CHYAj9IP6ud71LfC8=", - "dev": true - }, - "array-union": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", - "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", - "dev": true, - "requires": { - "array-uniq": "1.0.3" - } - }, - "array-uniq": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", - "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=", - "dev": true - }, - "array-unique": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", - "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=", - "dev": true - }, - "asn1.js": { - "version": "4.9.1", - "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.9.1.tgz", - "integrity": "sha1-SLokC0WpKA6UdImQull9IWYX/UA=", - "dev": true, - "requires": { - "bn.js": "4.11.7", - "inherits": "2.0.3", - "minimalistic-assert": "1.0.0" - } - }, - "assert": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/assert/-/assert-1.3.0.tgz", - "integrity": "sha1-A5OaYiWCqBLMICMgoLmlbJuBWEk=", - "dev": true, - "requires": { - "util": "0.10.3" - } - }, - "astw": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/astw/-/astw-2.2.0.tgz", - "integrity": "sha1-e9QXhNMkk5h66yOba04cV6hzuRc=", - "dev": true, - "requires": { - "acorn": "4.0.13" - } - }, - "async": { - "version": "0.2.10", - "resolved": "https://registry.npmjs.org/async/-/async-0.2.10.tgz", - "integrity": "sha1-trvgsGdLnXGXCMo43owjfLUmw9E=", - "dev": true - }, - "balanced-match": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", - "dev": true - }, - "Base64": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/Base64/-/Base64-0.2.1.tgz", - "integrity": "sha1-ujpCMHCOGGcFBl5mur3Uw1z2ACg=", - "dev": true - }, - "base64-js": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-0.0.8.tgz", - "integrity": "sha1-EQHpVE9KdrG8OybUUsqW16NeeXg=", - "dev": true - }, - "beeper": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/beeper/-/beeper-1.1.1.tgz", - "integrity": "sha1-5tXqjF2tABMEpwsiY4RH9pyy+Ak=", - "dev": true - }, - "bl": { - "version": "0.9.5", - "resolved": "https://registry.npmjs.org/bl/-/bl-0.9.5.tgz", - "integrity": "sha1-wGt5evCF6gC8Unr8jvzxHeIjIFQ=", - "dev": true, - "requires": { - "readable-stream": "1.0.34" - }, - "dependencies": { - "readable-stream": { - "version": "1.0.34", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", - "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", - "dev": true, - "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.3", - "isarray": "0.0.1", - "string_decoder": "0.10.31" - } - } - } - }, - "bn.js": { - "version": "4.11.7", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.7.tgz", - "integrity": "sha512-LxFiV5mefv0ley0SzqkOPR1bC4EbpPx8LkOz5vMe/Yi15t5hzwgO/G+tc7wOtL4PZTYjwHu8JnEiSLumuSjSfA==", - "dev": true - }, - "brace-expansion": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.8.tgz", - "integrity": "sha1-wHshHHyVLsH479Uad+8NHTmQopI=", - "dev": true, - "requires": { - "balanced-match": "1.0.0", - "concat-map": "0.0.1" - } - }, - "braces": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz", - "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", - "dev": true, - "requires": { - "expand-range": "1.8.2", - "preserve": "0.2.0", - "repeat-element": "1.1.2" - } - }, - "brorand": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", - "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=", - "dev": true - }, - "browser-pack": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/browser-pack/-/browser-pack-3.2.0.tgz", - "integrity": "sha1-+qHLxBSHsazEdH43PhFIrf/Q4tk=", - "dev": true, - "requires": { - "combine-source-map": "0.3.0", - "concat-stream": "1.4.10", - "defined": "0.0.0", - "JSONStream": "0.8.4", - "through2": "0.5.1", - "umd": "2.1.0" - }, - "dependencies": { - "readable-stream": { - "version": "1.0.34", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", - "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", - "dev": true, - "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.3", - "isarray": "0.0.1", - "string_decoder": "0.10.31" - } - }, - "through2": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/through2/-/through2-0.5.1.tgz", - "integrity": "sha1-390BLrnHAOIyP9M084rGIqs3Lac=", - "dev": true, - "requires": { - "readable-stream": "1.0.34", - "xtend": "3.0.0" - } - } - } - }, - "browser-resolve": { - "version": "1.11.2", - "resolved": "https://registry.npmjs.org/browser-resolve/-/browser-resolve-1.11.2.tgz", - "integrity": "sha1-j/CbCixCFxihBRwmCzLkj0QpOM4=", - "dev": true, - "requires": { - "resolve": "1.1.7" - }, - "dependencies": { - "resolve": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", - "integrity": "sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=", - "dev": true - } - } - }, - "browserify": { - "version": "8.1.3", - "resolved": "https://registry.npmjs.org/browserify/-/browserify-8.1.3.tgz", - "integrity": "sha1-8zpUmjpsNoIZsHX9z+bfGV4Empo=", - "dev": true, - "requires": { - "assert": "1.3.0", - "browser-pack": "3.2.0", - "browser-resolve": "1.11.2", - "browserify-zlib": "0.1.4", - "buffer": "3.6.0", - "builtins": "0.0.7", - "commondir": "0.0.1", - "concat-stream": "1.4.10", - "console-browserify": "1.1.0", - "constants-browserify": "0.0.1", - "crypto-browserify": "3.11.1", - "deep-equal": "0.2.2", - "defined": "0.0.0", - "deps-sort": "1.3.9", - "domain-browser": "1.1.7", - "duplexer2": "0.0.2", - "events": "1.0.2", - "glob": "4.5.3", - "http-browserify": "1.7.0", - "https-browserify": "0.0.1", - "inherits": "2.0.3", - "insert-module-globals": "6.6.3", - "isarray": "0.0.1", - "JSONStream": "0.8.4", - "labeled-stream-splicer": "1.0.2", - "module-deps": "3.9.1", - "os-browserify": "0.1.2", - "parents": "1.0.1", - "path-browserify": "0.0.0", - "process": "0.10.1", - "punycode": "1.2.4", - "querystring-es3": "0.2.1", - "readable-stream": "1.1.14", - "resolve": "0.7.4", - "shallow-copy": "0.0.1", - "shasum": "1.0.2", - "shell-quote": "0.0.1", - "stream-browserify": "1.0.0", - "string_decoder": "0.10.31", - "subarg": "1.0.0", - "syntax-error": "1.3.0", - "through2": "1.1.1", - "timers-browserify": "1.4.2", - "tty-browserify": "0.0.0", - "umd": "2.1.0", - "url": "0.10.3", - "util": "0.10.3", - "vm-browserify": "0.0.4", - "xtend": "3.0.0" - } - }, - "browserify-aes": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.0.6.tgz", - "integrity": "sha1-Xncl297x/Vkw1OurSFZ85FHEigo=", - "dev": true, - "requires": { - "buffer-xor": "1.0.3", - "cipher-base": "1.0.4", - "create-hash": "1.1.3", - "evp_bytestokey": "1.0.0", - "inherits": "2.0.3" - } - }, - "browserify-cipher": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.0.tgz", - "integrity": "sha1-mYgkSHS/XtTijalWZtzWasj8Njo=", - "dev": true, - "requires": { - "browserify-aes": "1.0.6", - "browserify-des": "1.0.0", - "evp_bytestokey": "1.0.0" - } - }, - "browserify-des": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.0.tgz", - "integrity": "sha1-2qJ3cXRwki7S/hhZQRihdUOXId0=", - "dev": true, - "requires": { - "cipher-base": "1.0.4", - "des.js": "1.0.0", - "inherits": "2.0.3" - } - }, - "browserify-rsa": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz", - "integrity": "sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ=", - "dev": true, - "requires": { - "bn.js": "4.11.7", - "randombytes": "2.0.5" - } - }, - "browserify-sign": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.0.4.tgz", - "integrity": "sha1-qk62jl17ZYuqa/alfmMMvXqT0pg=", - "dev": true, - "requires": { - "bn.js": "4.11.7", - "browserify-rsa": "4.0.1", - "create-hash": "1.1.3", - "create-hmac": "1.1.6", - "elliptic": "6.4.0", - "inherits": "2.0.3", - "parse-asn1": "5.1.0" - } - }, - "browserify-zlib": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.1.4.tgz", - "integrity": "sha1-uzX4pRn2AOD6a4SFJByXnQFB+y0=", - "dev": true, - "requires": { - "pako": "0.2.9" - } - }, - "buffer": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-3.6.0.tgz", - "integrity": "sha1-pyyTb3e5a/UvX357RnGAYoVR3vs=", - "dev": true, - "requires": { - "base64-js": "0.0.8", - "ieee754": "1.1.8", - "isarray": "1.0.0" - }, - "dependencies": { - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - } - } - }, - "buffer-equal": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/buffer-equal/-/buffer-equal-0.0.2.tgz", - "integrity": "sha1-7Lt5D1aNQAmKYkK1SAXHWAXrk48=", - "dev": true - }, - "buffer-xor": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", - "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=", - "dev": true - }, - "builtins": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/builtins/-/builtins-0.0.7.tgz", - "integrity": "sha1-NVIZzWzxjb58Acx/0tznZc/cVJo=", - "dev": true - }, - "bunker": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/bunker/-/bunker-0.1.2.tgz", - "integrity": "sha1-yImSRkqOKm7ehpMDdfkrWAd++Xw=", - "dev": true, - "requires": { - "burrito": "0.2.12" - } - }, - "burrito": { - "version": "0.2.12", - "resolved": "https://registry.npmjs.org/burrito/-/burrito-0.2.12.tgz", - "integrity": "sha1-0NbmrIHV6ZeJxvpKzLCwAx6lT2s=", - "dev": true, - "requires": { - "traverse": "0.5.2", - "uglify-js": "1.1.1" - }, - "dependencies": { - "traverse": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/traverse/-/traverse-0.5.2.tgz", - "integrity": "sha1-4gPFjV9/DjfbbnTArLkpuwm2HYU=", - "dev": true - }, - "uglify-js": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-1.1.1.tgz", - "integrity": "sha1-7nGpfEzv0GoamyBDfzQRiYKqA1s=", - "dev": true - } - } - }, - "callsite": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/callsite/-/callsite-1.0.0.tgz", - "integrity": "sha1-KAOY5dZkvXQDi28JBRU+borxvCA=", - "dev": true - }, - "camelcase": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz", - "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=", - "dev": true - }, - "center-align": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/center-align/-/center-align-0.1.3.tgz", - "integrity": "sha1-qg0yYptu6XIgBBHL1EYckHvCt60=", - "dev": true, - "requires": { - "align-text": "0.1.4", - "lazy-cache": "1.0.4" - } - }, - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "dev": true, - "requires": { - "ansi-styles": "2.2.1", - "escape-string-regexp": "1.0.5", - "has-ansi": "2.0.0", - "strip-ansi": "3.0.1", - "supports-color": "2.0.0" - } - }, - "charm": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/charm/-/charm-0.1.2.tgz", - "integrity": "sha1-BsIe7RobBq62dVPNxT4jJ0usIpY=", - "dev": true - }, - "cipher-base": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", - "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", - "dev": true, - "requires": { - "inherits": "2.0.3", - "safe-buffer": "5.1.1" - } - }, - "cliui": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz", - "integrity": "sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE=", - "dev": true, - "requires": { - "center-align": "0.1.3", - "right-align": "0.1.3", - "wordwrap": "0.0.2" - }, - "dependencies": { - "wordwrap": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz", - "integrity": "sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8=", - "dev": true - } - } - }, - "clone": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.2.tgz", - "integrity": "sha1-Jgt6meux7f4kdTgXX3gyQ8sZ0Uk=", - "dev": true - }, - "clone-stats": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-0.0.1.tgz", - "integrity": "sha1-uI+UqCzzi4eR1YBG6kAprYjKmdE=", - "dev": true - }, - "combine-source-map": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/combine-source-map/-/combine-source-map-0.3.0.tgz", - "integrity": "sha1-2edPWT2c1DgHMSy12EbUUe+qnrc=", - "dev": true, - "requires": { - "convert-source-map": "0.3.5", - "inline-source-map": "0.3.1", - "source-map": "0.1.43" - } - }, - "commondir": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/commondir/-/commondir-0.0.1.tgz", - "integrity": "sha1-ifAP3NUbUZxXhzP+xWPmptp/W+I=", - "dev": true - }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", - "dev": true - }, - "concat-stream": { - "version": "1.4.10", - "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.4.10.tgz", - "integrity": "sha1-rMO79WAsuMyYDGrIQPp9hgPj7zY=", - "dev": true, - "requires": { - "inherits": "2.0.3", - "readable-stream": "1.1.14", - "typedarray": "0.0.6" - } - }, - "console-browserify": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.1.0.tgz", - "integrity": "sha1-8CQcRXMKn8YyOyBtvzjtx0HQuxA=", - "dev": true, - "requires": { - "date-now": "0.1.4" - } - }, - "constants-browserify": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-0.0.1.tgz", - "integrity": "sha1-kld9tSe6bEzwpFaNhLwDH0QeIfI=", - "dev": true - }, - "convert-source-map": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-0.3.5.tgz", - "integrity": "sha1-8dgClQr33SYxof6+BZZVDIarMZA=", - "dev": true - }, - "core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", - "dev": true - }, - "create-ecdh": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.0.tgz", - "integrity": "sha1-iIxyNZbN92EvZJgjPuvXo1MBc30=", - "dev": true, - "requires": { - "bn.js": "4.11.7", - "elliptic": "6.4.0" - } - }, - "create-hash": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.1.3.tgz", - "integrity": "sha1-YGBCrIuSYnUPSDyt2rD1gZFy2P0=", - "dev": true, - "requires": { - "cipher-base": "1.0.4", - "inherits": "2.0.3", - "ripemd160": "2.0.1", - "sha.js": "2.4.8" - } - }, - "create-hmac": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.6.tgz", - "integrity": "sha1-rLniIaThe9sHbpBlfEK5PjcmzwY=", - "dev": true, - "requires": { - "cipher-base": "1.0.4", - "create-hash": "1.1.3", - "inherits": "2.0.3", - "ripemd160": "2.0.1", - "safe-buffer": "5.1.1", - "sha.js": "2.4.8" - } - }, - "crypto-browserify": { - "version": "3.11.1", - "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.11.1.tgz", - "integrity": "sha512-Na7ZlwCOqoaW5RwUK1WpXws2kv8mNhWdTlzob0UXulk6G9BDbyiJaGTYBIX61Ozn9l1EPPJpICZb4DaOpT9NlQ==", - "dev": true, - "requires": { - "browserify-cipher": "1.0.0", - "browserify-sign": "4.0.4", - "create-ecdh": "4.0.0", - "create-hash": "1.1.3", - "create-hmac": "1.1.6", - "diffie-hellman": "5.0.2", - "inherits": "2.0.3", - "pbkdf2": "3.0.13", - "public-encrypt": "4.0.0", - "randombytes": "2.0.5" - } - }, - "date-now": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/date-now/-/date-now-0.1.4.tgz", - "integrity": "sha1-6vQ5/U1ISK105cx9vvIAZyueNFs=", - "dev": true - }, - "dateformat": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-2.0.0.tgz", - "integrity": "sha1-J0Pjq7XD/CRi5SfcpEXgTp9N7hc=", - "dev": true - }, - "deap": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/deap/-/deap-1.0.0.tgz", - "integrity": "sha1-sUi/gkMKJ2mbdIOgPra2dYW/yIg=", - "dev": true - }, - "decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", - "dev": true - }, - "deep-equal": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-0.2.2.tgz", - "integrity": "sha1-hLdFiW80xoTpjyzg5Cq69Du6AX0=", - "dev": true - }, - "deep-is": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", - "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", - "dev": true - }, - "defaults": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.3.tgz", - "integrity": "sha1-xlYFHpgX2f8I7YgUd/P+QBnz730=", - "dev": true, - "requires": { - "clone": "1.0.2" - } - }, - "defined": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/defined/-/defined-0.0.0.tgz", - "integrity": "sha1-817qfXBekzuvE7LwOz+D2SFAOz4=", - "dev": true - }, - "del": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/del/-/del-1.2.1.tgz", - "integrity": "sha1-rtblvNfLcyXfNPVjEl+iZbLBoBQ=", - "dev": true, - "requires": { - "each-async": "1.1.1", - "globby": "2.1.0", - "is-path-cwd": "1.0.0", - "is-path-in-cwd": "1.0.0", - "object-assign": "3.0.0", - "rimraf": "2.6.1" - } - }, - "deprecated": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/deprecated/-/deprecated-0.0.1.tgz", - "integrity": "sha1-+cmvVGSvoeepcUWKi97yqpTVuxk=", - "dev": true - }, - "deps-sort": { - "version": "1.3.9", - "resolved": "https://registry.npmjs.org/deps-sort/-/deps-sort-1.3.9.tgz", - "integrity": "sha1-Kd//U+F7Nq7K51MK27v2IsLtGnE=", - "dev": true, - "requires": { - "JSONStream": "1.3.1", - "shasum": "1.0.2", - "subarg": "1.0.0", - "through2": "1.1.1" - }, - "dependencies": { - "jsonparse": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", - "integrity": "sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA=", - "dev": true - }, - "JSONStream": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.1.tgz", - "integrity": "sha1-cH92HgHa6eFvG8+TcDt4xwlmV5o=", - "dev": true, - "requires": { - "jsonparse": "1.3.1", - "through": "2.3.8" - } - } - } - }, - "des.js": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.0.tgz", - "integrity": "sha1-wHTS4qpqipoH29YfmhXCzYPsjsw=", - "dev": true, - "requires": { - "inherits": "2.0.3", - "minimalistic-assert": "1.0.0" - } - }, - "detect-file": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/detect-file/-/detect-file-0.1.0.tgz", - "integrity": "sha1-STXe39lIhkjgBrASlWbpOGcR6mM=", - "dev": true, - "requires": { - "fs-exists-sync": "0.1.0" - } - }, - "detective": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/detective/-/detective-4.5.0.tgz", - "integrity": "sha1-blqMaybmx6JUsca210kNmOyR7dE=", - "dev": true, - "requires": { - "acorn": "4.0.13", - "defined": "1.0.0" - }, - "dependencies": { - "defined": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz", - "integrity": "sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM=", - "dev": true - } - } - }, - "diffie-hellman": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.2.tgz", - "integrity": "sha1-tYNXOScM/ias9jIJn97SoH8gnl4=", - "dev": true, - "requires": { - "bn.js": "4.11.7", - "miller-rabin": "4.0.0", - "randombytes": "2.0.5" - } - }, - "difflet": { - "version": "0.2.6", - "resolved": "https://registry.npmjs.org/difflet/-/difflet-0.2.6.tgz", - "integrity": "sha1-qyOzH1ZJtvqo49KsvTNEZzZcpvo=", - "dev": true, - "requires": { - "charm": "0.1.2", - "deep-is": "0.1.3", - "traverse": "0.6.6" - } - }, - "domain-browser": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.1.7.tgz", - "integrity": "sha1-hnqksJP6oF8d4IwG9NeyH9+GmLw=", - "dev": true - }, - "duplexer2": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.0.2.tgz", - "integrity": "sha1-xhTc9n4vsUmVqRcR5aYX6KYKMds=", - "dev": true, - "requires": { - "readable-stream": "1.1.14" - } - }, - "each-async": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/each-async/-/each-async-1.1.1.tgz", - "integrity": "sha1-3uUim98KtrogEqOV4bhpq/iBNHM=", - "dev": true, - "requires": { - "onetime": "1.1.0", - "set-immediate-shim": "1.0.1" - } - }, - "elliptic": { - "version": "6.4.0", - "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.4.0.tgz", - "integrity": "sha1-ysmvh2LIWDYYcAPI3+GT5eLq5d8=", - "dev": true, - "requires": { - "bn.js": "4.11.7", - "brorand": "1.1.0", - "hash.js": "1.1.3", - "hmac-drbg": "1.0.1", - "inherits": "2.0.3", - "minimalistic-assert": "1.0.0", - "minimalistic-crypto-utils": "1.0.1" - } - }, - "end-of-stream": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-0.1.5.tgz", - "integrity": "sha1-jhdyBsPICDfYVjLouTWd/osvbq8=", - "dev": true, - "requires": { - "once": "1.3.3" - }, - "dependencies": { - "once": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/once/-/once-1.3.3.tgz", - "integrity": "sha1-suJhVXzkwxTsgwTz+oJmPkKXyiA=", - "dev": true, - "requires": { - "wrappy": "1.0.2" - } - } - } - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", - "dev": true - }, - "events": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/events/-/events-1.0.2.tgz", - "integrity": "sha1-dYSdz+k9EPsFfDAFWv29UdBqjiQ=", - "dev": true - }, - "evp_bytestokey": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.0.tgz", - "integrity": "sha1-SXtmrZ/vZc18CKYYCCS6FHa2blM=", - "dev": true, - "requires": { - "create-hash": "1.1.3" - } - }, - "expand-brackets": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", - "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", - "dev": true, - "requires": { - "is-posix-bracket": "0.1.1" - } - }, - "expand-range": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/expand-range/-/expand-range-1.8.2.tgz", - "integrity": "sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc=", - "dev": true, - "requires": { - "fill-range": "2.2.3" - } - }, - "expand-tilde": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-1.2.2.tgz", - "integrity": "sha1-C4HrqJflo9MdHD0QL48BRB5VlEk=", - "dev": true, - "requires": { - "os-homedir": "1.0.2" - } - }, - "extend": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.1.tgz", - "integrity": "sha1-p1Xqe8Gt/MWjHOfnYtuq3F5jZEQ=", - "dev": true - }, - "extglob": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", - "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", - "dev": true, - "requires": { - "is-extglob": "1.0.0" - } - }, - "fancy-log": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/fancy-log/-/fancy-log-1.3.0.tgz", - "integrity": "sha1-Rb4X0Cu5kX1gzP/UmVyZnmyMmUg=", - "dev": true, - "requires": { - "chalk": "1.1.3", - "time-stamp": "1.1.0" - } - }, - "filename-regex": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/filename-regex/-/filename-regex-2.0.1.tgz", - "integrity": "sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY=", - "dev": true - }, - "fill-range": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.3.tgz", - "integrity": "sha1-ULd9/X5Gm8dJJHCWNpn+eoSFpyM=", - "dev": true, - "requires": { - "is-number": "2.1.0", - "isobject": "2.1.0", - "randomatic": "1.1.7", - "repeat-element": "1.1.2", - "repeat-string": "1.6.1" - } - }, - "find-index": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/find-index/-/find-index-0.1.1.tgz", - "integrity": "sha1-Z101iyyjiS15Whq0cjL4tuLg3eQ=", - "dev": true - }, - "findup-sync": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-0.4.3.tgz", - "integrity": "sha1-QAQ5Kee8YK3wt/SCfExudaDeyhI=", - "dev": true, - "requires": { - "detect-file": "0.1.0", - "is-glob": "2.0.1", - "micromatch": "2.3.11", - "resolve-dir": "0.1.1" - } - }, - "fined": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/fined/-/fined-1.1.0.tgz", - "integrity": "sha1-s33IRLdqL15wgeiE98CuNE8VNHY=", - "dev": true, - "requires": { - "expand-tilde": "2.0.2", - "is-plain-object": "2.0.4", - "object.defaults": "1.1.0", - "object.pick": "1.2.0", - "parse-filepath": "1.0.1" - }, - "dependencies": { - "expand-tilde": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz", - "integrity": "sha1-l+gBqgUt8CRU3kawK/YhZCzchQI=", - "dev": true, - "requires": { - "homedir-polyfill": "1.0.1" - } - } - } - }, - "first-chunk-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/first-chunk-stream/-/first-chunk-stream-1.0.0.tgz", - "integrity": "sha1-Wb+1DNkF9g18OUzT2ayqtOatk04=", - "dev": true - }, - "flagged-respawn": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/flagged-respawn/-/flagged-respawn-0.3.2.tgz", - "integrity": "sha1-/xke3c1wiKZ1smEP/8l2vpuAdLU=", - "dev": true - }, - "for-in": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", - "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", - "dev": true - }, - "for-own": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/for-own/-/for-own-0.1.5.tgz", - "integrity": "sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=", - "dev": true, - "requires": { - "for-in": "1.0.2" - } - }, - "fs-exists-sync": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/fs-exists-sync/-/fs-exists-sync-0.1.0.tgz", - "integrity": "sha1-mC1ok6+RjnLQjeyehnP/K1qNat0=", - "dev": true - }, - "fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", - "dev": true - }, - "gaze": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/gaze/-/gaze-0.5.2.tgz", - "integrity": "sha1-QLcJU30k0dRXZ9takIaJ3+aaxE8=", - "dev": true, - "requires": { - "globule": "0.1.0" - } - }, - "gintersect": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/gintersect/-/gintersect-0.1.0.tgz", - "integrity": "sha1-moy2qAt9bpVawzUVSVsSEmJ7GBY=" - }, - "glob": { - "version": "4.5.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-4.5.3.tgz", - "integrity": "sha1-xstz0yJsHv7wTePFbQEvAzd+4V8=", - "dev": true, - "requires": { - "inflight": "1.0.6", - "inherits": "2.0.3", - "minimatch": "2.0.10", - "once": "1.4.0" - } - }, - "glob-base": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/glob-base/-/glob-base-0.3.0.tgz", - "integrity": "sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q=", - "dev": true, - "requires": { - "glob-parent": "2.0.0", - "is-glob": "2.0.1" - } - }, - "glob-parent": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz", - "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=", - "dev": true, - "requires": { - "is-glob": "2.0.1" - } - }, - "glob-stream": { - "version": "3.1.18", - "resolved": "https://registry.npmjs.org/glob-stream/-/glob-stream-3.1.18.tgz", - "integrity": "sha1-kXCl8St5Awb9/lmPMT+PeVT9FDs=", - "dev": true, - "requires": { - "glob": "4.5.3", - "glob2base": "0.0.12", - "minimatch": "2.0.10", - "ordered-read-streams": "0.1.0", - "through2": "0.6.5", - "unique-stream": "1.0.0" - }, - "dependencies": { - "readable-stream": { - "version": "1.0.34", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", - "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", - "dev": true, - "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.3", - "isarray": "0.0.1", - "string_decoder": "0.10.31" - } - }, - "through2": { - "version": "0.6.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz", - "integrity": "sha1-QaucZ7KdVyCQcUEOHXp6lozTrUg=", - "dev": true, - "requires": { - "readable-stream": "1.0.34", - "xtend": "4.0.1" - } - }, - "xtend": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", - "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=", - "dev": true - } - } - }, - "glob-watcher": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/glob-watcher/-/glob-watcher-0.0.6.tgz", - "integrity": "sha1-uVtKjfdLOcgymLDAXJeLTZo7cQs=", - "dev": true, - "requires": { - "gaze": "0.5.2" - } - }, - "glob2base": { - "version": "0.0.12", - "resolved": "https://registry.npmjs.org/glob2base/-/glob2base-0.0.12.tgz", - "integrity": "sha1-nUGbPijxLoOjYhZKJ3BVkiycDVY=", - "dev": true, - "requires": { - "find-index": "0.1.1" - } - }, - "global-modules": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-0.2.3.tgz", - "integrity": "sha1-6lo77ULG1s6ZWk+KEmm12uIjgo0=", - "dev": true, - "requires": { - "global-prefix": "0.1.5", - "is-windows": "0.2.0" - } - }, - "global-prefix": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-0.1.5.tgz", - "integrity": "sha1-jTvGuNo8qBEqFg2NSW/wRiv+948=", - "dev": true, - "requires": { - "homedir-polyfill": "1.0.1", - "ini": "1.3.4", - "is-windows": "0.2.0", - "which": "1.3.0" - } - }, - "globby": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-2.1.0.tgz", - "integrity": "sha1-npGSvNM/Srak+JTl5+qLcTITxII=", - "dev": true, - "requires": { - "array-union": "1.0.2", - "async": "1.5.2", - "glob": "5.0.15", - "object-assign": "3.0.0" - }, - "dependencies": { - "async": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", - "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=", - "dev": true - }, - "glob": { - "version": "5.0.15", - "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz", - "integrity": "sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E=", - "dev": true, - "requires": { - "inflight": "1.0.6", - "inherits": "2.0.3", - "minimatch": "2.0.10", - "once": "1.4.0", - "path-is-absolute": "1.0.1" - } - } - } - }, - "globule": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/globule/-/globule-0.1.0.tgz", - "integrity": "sha1-2cjt3h2nnRJaFRt5UzuXhnY0auU=", - "dev": true, - "requires": { - "glob": "3.1.21", - "lodash": "1.0.2", - "minimatch": "0.2.14" - }, - "dependencies": { - "glob": { - "version": "3.1.21", - "resolved": "https://registry.npmjs.org/glob/-/glob-3.1.21.tgz", - "integrity": "sha1-0p4KBV3qUTj00H7UDomC6DwgZs0=", - "dev": true, - "requires": { - "graceful-fs": "1.2.3", - "inherits": "1.0.2", - "minimatch": "0.2.14" - } - }, - "graceful-fs": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-1.2.3.tgz", - "integrity": "sha1-FaSAaldUfLLS2/J/QuiajDRRs2Q=", - "dev": true - }, - "inherits": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-1.0.2.tgz", - "integrity": "sha1-ykMJ2t7mtUzAuNJH6NfHoJdb3Js=", - "dev": true - }, - "minimatch": { - "version": "0.2.14", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-0.2.14.tgz", - "integrity": "sha1-x054BXT2PG+aCQ6Q775u9TpqdWo=", - "dev": true, - "requires": { - "lru-cache": "2.7.3", - "sigmund": "1.0.1" - } - } - } - }, - "glogg": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/glogg/-/glogg-1.0.0.tgz", - "integrity": "sha1-f+DxmfV6yQbPUS/urY+Q7kooT8U=", - "dev": true, - "requires": { - "sparkles": "1.0.0" - } - }, - "graceful-fs": { - "version": "3.0.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-3.0.11.tgz", - "integrity": "sha1-dhPHeKGv6mLyXGMKCG1/Osu92Bg=", - "dev": true, - "requires": { - "natives": "1.1.0" - } - }, - "gulp": { - "version": "3.9.1", - "resolved": "https://registry.npmjs.org/gulp/-/gulp-3.9.1.tgz", - "integrity": "sha1-VxzkWSjdQK9lFPxAEYZgFsE4RbQ=", - "dev": true, - "requires": { - "archy": "1.0.0", - "chalk": "1.1.3", - "deprecated": "0.0.1", - "gulp-util": "3.0.8", - "interpret": "1.0.3", - "liftoff": "2.3.0", - "minimist": "1.2.0", - "orchestrator": "0.3.8", - "pretty-hrtime": "1.0.3", - "semver": "4.3.6", - "tildify": "1.2.0", - "v8flags": "2.1.1", - "vinyl-fs": "0.3.14" - } - }, - "gulp-rename": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/gulp-rename/-/gulp-rename-1.2.2.tgz", - "integrity": "sha1-OtRCh2PwXidk3sHGfYaNsnVoeBc=", - "dev": true - }, - "gulp-run": { - "version": "1.7.1", - "resolved": "https://registry.npmjs.org/gulp-run/-/gulp-run-1.7.1.tgz", - "integrity": "sha1-4XwKy3wwtuKu7iPAREKpbAys7/o=", - "dev": true, - "requires": { - "gulp-util": "3.0.8", - "lodash.defaults": "4.2.0", - "lodash.template": "4.4.0", - "vinyl": "0.4.6" - }, - "dependencies": { - "clone": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/clone/-/clone-0.2.0.tgz", - "integrity": "sha1-xhJqkK1Pctv1rNskPMN3JP6T/B8=", - "dev": true - }, - "lodash.template": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-4.4.0.tgz", - "integrity": "sha1-5zoDhcg1VZF0bgILmWecaQ5o+6A=", - "dev": true, - "requires": { - "lodash._reinterpolate": "3.0.0", - "lodash.templatesettings": "4.1.0" - } - }, - "lodash.templatesettings": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-4.1.0.tgz", - "integrity": "sha1-K01OlbpEDZFf8IvImeRVNmZxMxY=", - "dev": true, - "requires": { - "lodash._reinterpolate": "3.0.0" - } - }, - "vinyl": { - "version": "0.4.6", - "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-0.4.6.tgz", - "integrity": "sha1-LzVsh6VQolVGHza76ypbqL94SEc=", - "dev": true, - "requires": { - "clone": "0.2.0", - "clone-stats": "0.0.1" - } - } - } - }, - "gulp-uglify": { - "version": "1.5.4", - "resolved": "https://registry.npmjs.org/gulp-uglify/-/gulp-uglify-1.5.4.tgz", - "integrity": "sha1-UkeI2HZm0J+dDCH7IXf5ADmmWMk=", - "dev": true, - "requires": { - "deap": "1.0.0", - "fancy-log": "1.3.0", - "gulp-util": "3.0.8", - "isobject": "2.1.0", - "through2": "2.0.3", - "uglify-js": "2.6.4", - "uglify-save-license": "0.4.1", - "vinyl-sourcemaps-apply": "0.2.1" - }, - "dependencies": { - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - }, - "readable-stream": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz", - "integrity": "sha512-m+qzzcn7KUxEmd1gMbchF+Y2eIUbieUaxkWtptyHywrX0rE8QEYqPC07Vuy4Wm32/xE16NcdBctb8S0Xe/5IeQ==", - "dev": true, - "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.3", - "isarray": "1.0.0", - "process-nextick-args": "1.0.7", - "safe-buffer": "5.1.1", - "string_decoder": "1.0.3", - "util-deprecate": "1.0.2" - } - }, - "source-map": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz", - "integrity": "sha1-dc449SvwczxafwwRjYEzSiu19BI=", - "dev": true - }, - "string_decoder": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", - "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", - "dev": true, - "requires": { - "safe-buffer": "5.1.1" - } - }, - "through2": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.3.tgz", - "integrity": "sha1-AARWmzfHx0ujnEPzzteNGtlBQL4=", - "dev": true, - "requires": { - "readable-stream": "2.3.3", - "xtend": "4.0.1" - } - }, - "uglify-js": { - "version": "2.6.4", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.6.4.tgz", - "integrity": "sha1-ZeovswWck5RpLxX+2HwrNsFrmt8=", - "dev": true, - "requires": { - "async": "0.2.10", - "source-map": "0.5.6", - "uglify-to-browserify": "1.0.2", - "yargs": "3.10.0" - } - }, - "xtend": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", - "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=", - "dev": true - }, - "yargs": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz", - "integrity": "sha1-9+572FfdfB0tOMDnTvvWgdFDH9E=", - "dev": true, - "requires": { - "camelcase": "1.2.1", - "cliui": "2.1.0", - "decamelize": "1.2.0", - "window-size": "0.1.0" - } - } - } - }, - "gulp-util": { - "version": "3.0.8", - "resolved": "https://registry.npmjs.org/gulp-util/-/gulp-util-3.0.8.tgz", - "integrity": "sha1-AFTh50RQLifATBh8PsxQXdVLu08=", - "dev": true, - "requires": { - "array-differ": "1.0.0", - "array-uniq": "1.0.3", - "beeper": "1.1.1", - "chalk": "1.1.3", - "dateformat": "2.0.0", - "fancy-log": "1.3.0", - "gulplog": "1.0.0", - "has-gulplog": "0.1.0", - "lodash._reescape": "3.0.0", - "lodash._reevaluate": "3.0.0", - "lodash._reinterpolate": "3.0.0", - "lodash.template": "3.6.2", - "minimist": "1.2.0", - "multipipe": "0.1.2", - "object-assign": "3.0.0", - "replace-ext": "0.0.1", - "through2": "2.0.3", - "vinyl": "0.5.3" - }, - "dependencies": { - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - }, - "readable-stream": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz", - "integrity": "sha512-m+qzzcn7KUxEmd1gMbchF+Y2eIUbieUaxkWtptyHywrX0rE8QEYqPC07Vuy4Wm32/xE16NcdBctb8S0Xe/5IeQ==", - "dev": true, - "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.3", - "isarray": "1.0.0", - "process-nextick-args": "1.0.7", - "safe-buffer": "5.1.1", - "string_decoder": "1.0.3", - "util-deprecate": "1.0.2" - } - }, - "string_decoder": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", - "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", - "dev": true, - "requires": { - "safe-buffer": "5.1.1" - } - }, - "through2": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.3.tgz", - "integrity": "sha1-AARWmzfHx0ujnEPzzteNGtlBQL4=", - "dev": true, - "requires": { - "readable-stream": "2.3.3", - "xtend": "4.0.1" - } - }, - "xtend": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", - "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=", - "dev": true - } - } - }, - "gulplog": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/gulplog/-/gulplog-1.0.0.tgz", - "integrity": "sha1-4oxNRdBey77YGDY86PnFkmIp/+U=", - "dev": true, - "requires": { - "glogg": "1.0.0" - } - }, - "has-ansi": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", - "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", - "dev": true, - "requires": { - "ansi-regex": "2.1.1" - } - }, - "has-gulplog": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/has-gulplog/-/has-gulplog-0.1.0.tgz", - "integrity": "sha1-ZBTIKRNpfaUVkDl9r7EvIpZ4Ec4=", - "dev": true, - "requires": { - "sparkles": "1.0.0" - } - }, - "hash-base": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-2.0.2.tgz", - "integrity": "sha1-ZuodhW206KVHDK32/OI65SRO8uE=", - "dev": true, - "requires": { - "inherits": "2.0.3" - } - }, - "hash.js": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.3.tgz", - "integrity": "sha512-/UETyP0W22QILqS+6HowevwhEFJ3MBJnwTf75Qob9Wz9t0DPuisL8kW8YZMK62dHAKE1c1p+gY1TtOLY+USEHA==", - "dev": true, - "requires": { - "inherits": "2.0.3", - "minimalistic-assert": "1.0.0" - } - }, - "hmac-drbg": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", - "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", - "dev": true, - "requires": { - "hash.js": "1.1.3", - "minimalistic-assert": "1.0.0", - "minimalistic-crypto-utils": "1.0.1" - } - }, - "homedir-polyfill": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.1.tgz", - "integrity": "sha1-TCu8inWJmP7r9e1oWA921GdotLw=", - "dev": true, - "requires": { - "parse-passwd": "1.0.0" - } - }, - "http-browserify": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/http-browserify/-/http-browserify-1.7.0.tgz", - "integrity": "sha1-M3la3nLfiKz7/TZ3PO/tp2RzWyA=", - "dev": true, - "requires": { - "Base64": "0.2.1", - "inherits": "2.0.3" - } - }, - "https-browserify": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-0.0.1.tgz", - "integrity": "sha1-P5E2XKvmC3ftDruiS0VOPgnZWoI=", - "dev": true - }, - "ieee754": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.8.tgz", - "integrity": "sha1-vjPUCsEO8ZJnAfbwii2G+/0a0+Q=", - "dev": true - }, - "indexof": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz", - "integrity": "sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10=", - "dev": true - }, - "inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "dev": true, - "requires": { - "once": "1.4.0", - "wrappy": "1.0.2" - } - }, - "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", - "dev": true - }, - "ini": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.4.tgz", - "integrity": "sha1-BTfLedr1m1mhpRff9wbIbsA5Fi4=", - "dev": true - }, - "inline-source-map": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/inline-source-map/-/inline-source-map-0.3.1.tgz", - "integrity": "sha1-pSi1FOaJ/OkNswiehw2S9Sestes=", - "dev": true, - "requires": { - "source-map": "0.3.0" - }, - "dependencies": { - "source-map": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.3.0.tgz", - "integrity": "sha1-hYb7mloAXltQHiHNGLbyG0V60fk=", - "dev": true, - "requires": { - "amdefine": "1.0.1" - } - } - } - }, - "insert-module-globals": { - "version": "6.6.3", - "resolved": "https://registry.npmjs.org/insert-module-globals/-/insert-module-globals-6.6.3.tgz", - "integrity": "sha1-IGOOKaMPntHKLjqCX7wsulJG3fw=", - "dev": true, - "requires": { - "combine-source-map": "0.6.1", - "concat-stream": "1.4.10", - "is-buffer": "1.1.5", - "JSONStream": "1.3.1", - "lexical-scope": "1.2.0", - "process": "0.11.10", - "through2": "1.1.1", - "xtend": "4.0.1" - }, - "dependencies": { - "combine-source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/combine-source-map/-/combine-source-map-0.6.1.tgz", - "integrity": "sha1-m0oJwxYDPXaODxHgKfonMOB5rZY=", - "dev": true, - "requires": { - "convert-source-map": "1.1.3", - "inline-source-map": "0.5.0", - "lodash.memoize": "3.0.4", - "source-map": "0.4.4" - } - }, - "convert-source-map": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.1.3.tgz", - "integrity": "sha1-SCnId+n+SbMWHzvzZziI4gRpmGA=", - "dev": true - }, - "inline-source-map": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/inline-source-map/-/inline-source-map-0.5.0.tgz", - "integrity": "sha1-Skxd2OT7Xps82mDIIt+tyu5m4K8=", - "dev": true, - "requires": { - "source-map": "0.4.4" - } - }, - "jsonparse": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", - "integrity": "sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA=", - "dev": true - }, - "JSONStream": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.1.tgz", - "integrity": "sha1-cH92HgHa6eFvG8+TcDt4xwlmV5o=", - "dev": true, - "requires": { - "jsonparse": "1.3.1", - "through": "2.3.8" - } - }, - "process": { - "version": "0.11.10", - "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", - "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=", - "dev": true - }, - "source-map": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz", - "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=", - "dev": true, - "requires": { - "amdefine": "1.0.1" - } - }, - "xtend": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", - "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=", - "dev": true - } - } - }, - "interpret": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.0.3.tgz", - "integrity": "sha1-y8NcYu7uc/Gat7EKgBURQBr8D5A=", - "dev": true - }, - "is-absolute": { - "version": "0.2.6", - "resolved": "https://registry.npmjs.org/is-absolute/-/is-absolute-0.2.6.tgz", - "integrity": "sha1-IN5p89uULvLYe5wto28XIjWxtes=", - "dev": true, - "requires": { - "is-relative": "0.2.1", - "is-windows": "0.2.0" - } - }, - "is-buffer": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.5.tgz", - "integrity": "sha1-Hzsm72E7IUuIy8ojzGwB2Hlh7sw=", - "dev": true - }, - "is-dotfile": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/is-dotfile/-/is-dotfile-1.0.3.tgz", - "integrity": "sha1-pqLzL/0t+wT1yiXs0Pa4PPeYoeE=", - "dev": true - }, - "is-equal-shallow": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz", - "integrity": "sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ=", - "dev": true, - "requires": { - "is-primitive": "2.0.0" - } - }, - "is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", - "dev": true - }, - "is-extglob": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", - "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", - "dev": true - }, - "is-glob": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", - "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", - "dev": true, - "requires": { - "is-extglob": "1.0.0" - } - }, - "is-number": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz", - "integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=", - "dev": true, - "requires": { - "kind-of": "3.2.2" - } - }, - "is-path-cwd": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-1.0.0.tgz", - "integrity": "sha1-0iXsIxMuie3Tj9p2dHLmLmXxEG0=", - "dev": true - }, - "is-path-in-cwd": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-1.0.0.tgz", - "integrity": "sha1-ZHdYK4IU1gI0YJRWcAO+ip6sBNw=", - "dev": true, - "requires": { - "is-path-inside": "1.0.0" - } - }, - "is-path-inside": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.0.tgz", - "integrity": "sha1-/AbloWg/vaE95mev9xe7wQpI838=", - "dev": true, - "requires": { - "path-is-inside": "1.0.2" - } - }, - "is-plain-object": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", - "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", - "dev": true, - "requires": { - "isobject": "3.0.1" - }, - "dependencies": { - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "dev": true - } - } - }, - "is-posix-bracket": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz", - "integrity": "sha1-MzTceXdDaOkvAW5vvAqI9c1ua8Q=", - "dev": true - }, - "is-primitive": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-primitive/-/is-primitive-2.0.0.tgz", - "integrity": "sha1-IHurkWOEmcB7Kt8kCkGochADRXU=", - "dev": true - }, - "is-relative": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-relative/-/is-relative-0.2.1.tgz", - "integrity": "sha1-0n9MfVFtF1+2ENuEu+7yPDvJeqU=", - "dev": true, - "requires": { - "is-unc-path": "0.1.2" - } - }, - "is-unc-path": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/is-unc-path/-/is-unc-path-0.1.2.tgz", - "integrity": "sha1-arBTpyVzwQJQ/0FqOBTDUXivObk=", - "dev": true, - "requires": { - "unc-path-regex": "0.1.2" - } - }, - "is-utf8": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", - "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=", - "dev": true - }, - "is-windows": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-0.2.0.tgz", - "integrity": "sha1-3hqm1j6indJIc3tp8f+LgALSEIw=", - "dev": true - }, - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", - "dev": true - }, - "isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", - "dev": true - }, - "isobject": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", - "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", - "dev": true, - "requires": { - "isarray": "1.0.0" - }, - "dependencies": { - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - } - } - }, - "json-stable-stringify": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-0.0.1.tgz", - "integrity": "sha1-YRwj6BTbN1Un34URk9tZ3Sryf0U=", - "dev": true, - "requires": { - "jsonify": "0.0.0" - } - }, - "jsonify": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz", - "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=", - "dev": true - }, - "jsonparse": { - "version": "0.0.5", - "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-0.0.5.tgz", - "integrity": "sha1-MwVCrT8KZUZlt3jz6y2an6UHrGQ=", - "dev": true - }, - "JSONStream": { - "version": "0.8.4", - "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-0.8.4.tgz", - "integrity": "sha1-kWV9/m/4V0gwZhMrRhi2Lo9Ih70=", - "dev": true, - "requires": { - "jsonparse": "0.0.5", - "through": "2.3.8" - } - }, - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "1.1.5" - } - }, - "labeled-stream-splicer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/labeled-stream-splicer/-/labeled-stream-splicer-1.0.2.tgz", - "integrity": "sha1-RhUzFTd4SYHo/SZOHzpDTE4N3WU=", - "dev": true, - "requires": { - "inherits": "2.0.3", - "isarray": "0.0.1", - "stream-splicer": "1.3.2" - } - }, - "lazy-cache": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz", - "integrity": "sha1-odePw6UEdMuAhF07O24dpJpEbo4=", - "dev": true - }, - "lexical-scope": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/lexical-scope/-/lexical-scope-1.2.0.tgz", - "integrity": "sha1-/Ope3HBKSzqHls3KQZw6CvryLfQ=", - "dev": true, - "requires": { - "astw": "2.2.0" - } - }, - "liftoff": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/liftoff/-/liftoff-2.3.0.tgz", - "integrity": "sha1-qY8v9nGD2Lp8+soQVIvX/wVQs4U=", - "dev": true, - "requires": { - "extend": "3.0.1", - "findup-sync": "0.4.3", - "fined": "1.1.0", - "flagged-respawn": "0.3.2", - "lodash.isplainobject": "4.0.6", - "lodash.isstring": "4.0.1", - "lodash.mapvalues": "4.6.0", - "rechoir": "0.6.2", - "resolve": "1.4.0" - }, - "dependencies": { - "resolve": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.4.0.tgz", - "integrity": "sha512-aW7sVKPufyHqOmyyLzg/J+8606v5nevBgaliIlV7nUpVMsDnoBGV/cbSLNjZAg9q0Cfd/+easKVKQ8vOu8fn1Q==", - "dev": true, - "requires": { - "path-parse": "1.0.5" - } - } - } - }, - "lodash": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-1.0.2.tgz", - "integrity": "sha1-j1dWDIO1n8JwvT1WG2kAQ0MOJVE=", - "dev": true - }, - "lodash._basecopy": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/lodash._basecopy/-/lodash._basecopy-3.0.1.tgz", - "integrity": "sha1-jaDmqHbPNEwK2KVIghEd08XHyjY=", - "dev": true - }, - "lodash._basetostring": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/lodash._basetostring/-/lodash._basetostring-3.0.1.tgz", - "integrity": "sha1-0YYdh3+CSlL2aYMtyvPuFVZqB9U=", - "dev": true - }, - "lodash._basevalues": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/lodash._basevalues/-/lodash._basevalues-3.0.0.tgz", - "integrity": "sha1-W3dXYoAr3j0yl1A+JjAIIP32Ybc=", - "dev": true - }, - "lodash._getnative": { - "version": "3.9.1", - "resolved": "https://registry.npmjs.org/lodash._getnative/-/lodash._getnative-3.9.1.tgz", - "integrity": "sha1-VwvH3t5G1hzc3mh9ZdPuy6o6r/U=", - "dev": true - }, - "lodash._isiterateecall": { - "version": "3.0.9", - "resolved": "https://registry.npmjs.org/lodash._isiterateecall/-/lodash._isiterateecall-3.0.9.tgz", - "integrity": "sha1-UgOte6Ql+uhCRg5pbbnPPmqsBXw=", - "dev": true - }, - "lodash._reescape": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/lodash._reescape/-/lodash._reescape-3.0.0.tgz", - "integrity": "sha1-Kx1vXf4HyKNVdT5fJ/rH8c3hYWo=", - "dev": true - }, - "lodash._reevaluate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/lodash._reevaluate/-/lodash._reevaluate-3.0.0.tgz", - "integrity": "sha1-WLx0xAZklTrgsSTYBpltrKQx4u0=", - "dev": true - }, - "lodash._reinterpolate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz", - "integrity": "sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0=", - "dev": true - }, - "lodash._root": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/lodash._root/-/lodash._root-3.0.1.tgz", - "integrity": "sha1-+6HEUkwZ7ppfgTa0YJ8BfPTe1pI=", - "dev": true - }, - "lodash.defaults": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-4.2.0.tgz", - "integrity": "sha1-0JF4cW/+pN3p5ft7N/bwgCJ0WAw=", - "dev": true - }, - "lodash.escape": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/lodash.escape/-/lodash.escape-3.2.0.tgz", - "integrity": "sha1-mV7g3BjBtIzJLv+ucaEKq1tIdpg=", - "dev": true, - "requires": { - "lodash._root": "3.0.1" - } - }, - "lodash.isarguments": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz", - "integrity": "sha1-L1c9hcaiQon/AGY7SRwdM4/zRYo=", - "dev": true - }, - "lodash.isarray": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/lodash.isarray/-/lodash.isarray-3.0.4.tgz", - "integrity": "sha1-eeTriMNqgSKvhvhEqpvNhRtfu1U=", - "dev": true - }, - "lodash.isplainobject": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", - "integrity": "sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs=", - "dev": true - }, - "lodash.isstring": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz", - "integrity": "sha1-1SfftUVuynzJu5XV2ur4i6VKVFE=", - "dev": true - }, - "lodash.keys": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-3.1.2.tgz", - "integrity": "sha1-TbwEcrFWvlCgsoaFXRvQsMZWCYo=", - "dev": true, - "requires": { - "lodash._getnative": "3.9.1", - "lodash.isarguments": "3.1.0", - "lodash.isarray": "3.0.4" - } - }, - "lodash.mapvalues": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/lodash.mapvalues/-/lodash.mapvalues-4.6.0.tgz", - "integrity": "sha1-G6+lAF3p3W9PJmaMMMo3IwzJaJw=", - "dev": true - }, - "lodash.memoize": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-3.0.4.tgz", - "integrity": "sha1-LcvSwofLwKVcxCMovQxzYVDVPj8=", - "dev": true - }, - "lodash.restparam": { - "version": "3.6.1", - "resolved": "https://registry.npmjs.org/lodash.restparam/-/lodash.restparam-3.6.1.tgz", - "integrity": "sha1-k2pOMJ7zMKdkXtQUWYbIWuWyCAU=", - "dev": true - }, - "lodash.template": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-3.6.2.tgz", - "integrity": "sha1-+M3sxhaaJVvpCYrosMU9N4kx0U8=", - "dev": true, - "requires": { - "lodash._basecopy": "3.0.1", - "lodash._basetostring": "3.0.1", - "lodash._basevalues": "3.0.0", - "lodash._isiterateecall": "3.0.9", - "lodash._reinterpolate": "3.0.0", - "lodash.escape": "3.2.0", - "lodash.keys": "3.1.2", - "lodash.restparam": "3.6.1", - "lodash.templatesettings": "3.1.1" - } - }, - "lodash.templatesettings": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-3.1.1.tgz", - "integrity": "sha1-+zB4RHU7Zrnxr6VOJix0UwfbqOU=", - "dev": true, - "requires": { - "lodash._reinterpolate": "3.0.0", - "lodash.escape": "3.2.0" - } - }, - "longest": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz", - "integrity": "sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc=", - "dev": true - }, - "lru-cache": { - "version": "2.7.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.7.3.tgz", - "integrity": "sha1-bUUk6LlV+V1PW1iFHOId1y+06VI=", - "dev": true - }, - "map-cache": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", - "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", - "dev": true - }, - "micromatch": { - "version": "2.3.11", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", - "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", - "dev": true, - "requires": { - "arr-diff": "2.0.0", - "array-unique": "0.2.1", - "braces": "1.8.5", - "expand-brackets": "0.1.5", - "extglob": "0.3.2", - "filename-regex": "2.0.1", - "is-extglob": "1.0.0", - "is-glob": "2.0.1", - "kind-of": "3.2.2", - "normalize-path": "2.1.1", - "object.omit": "2.0.1", - "parse-glob": "3.0.4", - "regex-cache": "0.4.3" - } - }, - "miller-rabin": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.0.tgz", - "integrity": "sha1-SmL7HUKTPAVYOYL0xxb2+55sbT0=", - "dev": true, - "requires": { - "bn.js": "4.11.7", - "brorand": "1.1.0" - } - }, - "minimalistic-assert": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.0.tgz", - "integrity": "sha1-cCvi3aazf0g2vLP121ZkG2Sh09M=", - "dev": true - }, - "minimalistic-crypto-utils": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", - "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=", - "dev": true - }, - "minimatch": { - "version": "2.0.10", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-2.0.10.tgz", - "integrity": "sha1-jQh8OcazjAAbl/ynzm0OHoCvusc=", - "dev": true, - "requires": { - "brace-expansion": "1.1.8" - } - }, - "minimist": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", - "dev": true - }, - "mkdirp": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", - "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", - "dev": true, - "requires": { - "minimist": "0.0.8" - }, - "dependencies": { - "minimist": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", - "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", - "dev": true - } - } - }, - "module-deps": { - "version": "3.9.1", - "resolved": "https://registry.npmjs.org/module-deps/-/module-deps-3.9.1.tgz", - "integrity": "sha1-6nXK+RmQkNJbDVUStaysuW5/h/M=", - "dev": true, - "requires": { - "browser-resolve": "1.11.2", - "concat-stream": "1.4.10", - "defined": "1.0.0", - "detective": "4.5.0", - "duplexer2": "0.0.2", - "inherits": "2.0.3", - "JSONStream": "1.3.1", - "parents": "1.0.1", - "readable-stream": "1.1.14", - "resolve": "1.4.0", - "stream-combiner2": "1.0.2", - "subarg": "1.0.0", - "through2": "1.1.1", - "xtend": "4.0.1" - }, - "dependencies": { - "defined": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz", - "integrity": "sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM=", - "dev": true - }, - "jsonparse": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", - "integrity": "sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA=", - "dev": true - }, - "JSONStream": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.1.tgz", - "integrity": "sha1-cH92HgHa6eFvG8+TcDt4xwlmV5o=", - "dev": true, - "requires": { - "jsonparse": "1.3.1", - "through": "2.3.8" - } - }, - "resolve": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.4.0.tgz", - "integrity": "sha512-aW7sVKPufyHqOmyyLzg/J+8606v5nevBgaliIlV7nUpVMsDnoBGV/cbSLNjZAg9q0Cfd/+easKVKQ8vOu8fn1Q==", - "dev": true, - "requires": { - "path-parse": "1.0.5" - } - }, - "xtend": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", - "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=", - "dev": true - } - } - }, - "multipipe": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/multipipe/-/multipipe-0.1.2.tgz", - "integrity": "sha1-Ko8t33Du1WTf8tV/HhoTfZ8FB4s=", - "dev": true, - "requires": { - "duplexer2": "0.0.2" - } - }, - "natives": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/natives/-/natives-1.1.0.tgz", - "integrity": "sha1-6f+EFBimsux6SV6TmYT3jxY+bjE=", - "dev": true - }, - "ngraph.centrality": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/ngraph.centrality/-/ngraph.centrality-0.1.3.tgz", - "integrity": "sha1-bKB7QXmv8AfYSY7e8lZoizfYdp0=" - }, - "ngraph.events": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/ngraph.events/-/ngraph.events-0.0.3.tgz", - "integrity": "sha1-OPVTFvPSB61jH/lPZiLKjywOh9A=" - }, - "ngraph.expose": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/ngraph.expose/-/ngraph.expose-0.0.0.tgz", - "integrity": "sha1-dGw0kDo4SMRdAzsUvGRhnqhf5ao=" - }, - "ngraph.forcelayout": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/ngraph.forcelayout/-/ngraph.forcelayout-0.1.2.tgz", - "integrity": "sha1-PC4SJ/KRSLqyn8WLweg3SfYdS8U=", - "requires": { - "ngraph.events": "0.0.3", - "ngraph.physics.simulator": "0.1.1" - } - }, - "ngraph.fromjson": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/ngraph.fromjson/-/ngraph.fromjson-0.1.7.tgz", - "integrity": "sha1-VXEnCsj+ED6xaEQUbolIrUIhnHM=", - "requires": { - "ngraph.graph": "0.0.11" - } - }, - "ngraph.generators": { - "version": "0.0.15", - "resolved": "https://registry.npmjs.org/ngraph.generators/-/ngraph.generators-0.0.15.tgz", - "integrity": "sha1-GgnH6S2IPXi8gWwGwvZkC0X0z/I=", - "requires": { - "ngraph.graph": "0.0.11", - "ngraph.random": "0.0.1" - } - }, - "ngraph.graph": { - "version": "0.0.11", - "resolved": "https://registry.npmjs.org/ngraph.graph/-/ngraph.graph-0.0.11.tgz", - "integrity": "sha1-nxCnJn71l3Q5rFB7r8un9O1yhAE=", - "requires": { - "ngraph.events": "0.0.3" - } - }, - "ngraph.merge": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/ngraph.merge/-/ngraph.merge-0.0.1.tgz", - "integrity": "sha1-5OgM43WBo8lrF9VF46Q8hUNLkCU=" - }, - "ngraph.physics.primitives": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/ngraph.physics.primitives/-/ngraph.physics.primitives-0.0.7.tgz", - "integrity": "sha1-Xcnhebofkubex3SwHNaJFBILeVs=" - }, - "ngraph.physics.simulator": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/ngraph.physics.simulator/-/ngraph.physics.simulator-0.1.1.tgz", - "integrity": "sha1-h5RmUATQJbnkIyEV/O/9l7+sCK0=", - "requires": { - "ngraph.events": "0.0.3", - "ngraph.expose": "0.0.0", - "ngraph.merge": "0.0.1", - "ngraph.physics.primitives": "0.0.7", - "ngraph.quadtreebh": "0.0.4", - "ngraph.random": "0.0.1" - } - }, - "ngraph.quadtreebh": { - "version": "0.0.4", - "resolved": "https://registry.npmjs.org/ngraph.quadtreebh/-/ngraph.quadtreebh-0.0.4.tgz", - "integrity": "sha1-xwDUTm5K8HttBQAbo5h/9eLc1iw=", - "requires": { - "ngraph.random": "0.0.1" - } - }, - "ngraph.random": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/ngraph.random/-/ngraph.random-0.0.1.tgz", - "integrity": "sha1-wAji67/f+vF+0Q5LvJE+VnFmvPg=" - }, - "ngraph.remove-overlaps": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/ngraph.remove-overlaps/-/ngraph.remove-overlaps-1.0.0.tgz", - "integrity": "sha1-tMBjVT6kzx/3gWjnt//2JhfA2fQ=", - "dev": true - }, - "ngraph.tojson": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/ngraph.tojson/-/ngraph.tojson-0.1.3.tgz", - "integrity": "sha1-chUq8zBsABeXu3zJKTDpIbp76zo=" - }, - "nopt": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-2.2.1.tgz", - "integrity": "sha1-KqCbfRdoSHs7ianFqlIzW/8Lrqc=", - "dev": true, - "requires": { - "abbrev": "1.1.0" - } - }, - "normalize-path": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", - "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", - "dev": true, - "requires": { - "remove-trailing-separator": "1.0.2" - } - }, - "object-assign": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-3.0.0.tgz", - "integrity": "sha1-m+3VygiXlJvKR+f/QIBi1Un1h/I=", - "dev": true - }, - "object.defaults": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/object.defaults/-/object.defaults-1.1.0.tgz", - "integrity": "sha1-On+GgzS0B96gbaFtiNXNKeQ1/s8=", - "dev": true, - "requires": { - "array-each": "1.0.1", - "array-slice": "1.0.0", - "for-own": "1.0.0", - "isobject": "3.0.1" - }, - "dependencies": { - "for-own": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/for-own/-/for-own-1.0.0.tgz", - "integrity": "sha1-xjMy9BXO3EsE2/5wz4NklMU8tEs=", - "dev": true, - "requires": { - "for-in": "1.0.2" - } - }, - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "dev": true - } - } - }, - "object.omit": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/object.omit/-/object.omit-2.0.1.tgz", - "integrity": "sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo=", - "dev": true, - "requires": { - "for-own": "0.1.5", - "is-extendable": "0.1.1" - } - }, - "object.pick": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.2.0.tgz", - "integrity": "sha1-tTkr7peC2m2ft9avr1OXefEjTCs=", - "dev": true, - "requires": { - "isobject": "2.1.0" - } - }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "dev": true, - "requires": { - "wrappy": "1.0.2" - } - }, - "onetime": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-1.1.0.tgz", - "integrity": "sha1-ofeDj4MUxRbwXs78vEzP4EtO14k=", - "dev": true - }, - "optimist": { - "version": "0.3.7", - "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.3.7.tgz", - "integrity": "sha1-yQlBrVnkJzMokjB00s8ufLxuwNk=", - "dev": true, - "requires": { - "wordwrap": "0.0.3" - } - }, - "orchestrator": { - "version": "0.3.8", - "resolved": "https://registry.npmjs.org/orchestrator/-/orchestrator-0.3.8.tgz", - "integrity": "sha1-FOfp4nZPcxX7rBhOUGx6pt+UrX4=", - "dev": true, - "requires": { - "end-of-stream": "0.1.5", - "sequencify": "0.0.7", - "stream-consume": "0.1.0" - } - }, - "ordered-read-streams": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/ordered-read-streams/-/ordered-read-streams-0.1.0.tgz", - "integrity": "sha1-/VZamvjrRHO6abbtijQ1LLVS8SY=", - "dev": true - }, - "os-browserify": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.1.2.tgz", - "integrity": "sha1-ScoCk+CxlZCl9d4Qx/JlphfY/lQ=", - "dev": true - }, - "os-homedir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", - "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", - "dev": true - }, - "pako": { - "version": "0.2.9", - "resolved": "https://registry.npmjs.org/pako/-/pako-0.2.9.tgz", - "integrity": "sha1-8/dSL073gjSNqBYbrZ7P1Rv4OnU=", - "dev": true - }, - "parents": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parents/-/parents-1.0.1.tgz", - "integrity": "sha1-/t1NK/GTp3dF/nHjcdc8MwfZx1E=", - "dev": true, - "requires": { - "path-platform": "0.11.15" - } - }, - "parse-asn1": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.0.tgz", - "integrity": "sha1-N8T5t+06tlx0gXtfJICTf7+XxxI=", - "dev": true, - "requires": { - "asn1.js": "4.9.1", - "browserify-aes": "1.0.6", - "create-hash": "1.1.3", - "evp_bytestokey": "1.0.0", - "pbkdf2": "3.0.13" - } - }, - "parse-filepath": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parse-filepath/-/parse-filepath-1.0.1.tgz", - "integrity": "sha1-FZ1hVdQ5BNFsEO9piRHaHpGWm3M=", - "dev": true, - "requires": { - "is-absolute": "0.2.6", - "map-cache": "0.2.2", - "path-root": "0.1.1" - } - }, - "parse-glob": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/parse-glob/-/parse-glob-3.0.4.tgz", - "integrity": "sha1-ssN2z7EfNVE7rdFz7wu246OIORw=", - "dev": true, - "requires": { - "glob-base": "0.3.0", - "is-dotfile": "1.0.3", - "is-extglob": "1.0.0", - "is-glob": "2.0.1" - } - }, - "parse-passwd": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz", - "integrity": "sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=", - "dev": true - }, - "path-browserify": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.0.tgz", - "integrity": "sha1-oLhwcpquIUAFt9UDLsLLuw+0RRo=", - "dev": true - }, - "path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", - "dev": true - }, - "path-is-inside": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", - "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=", - "dev": true - }, - "path-parse": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.5.tgz", - "integrity": "sha1-PBrfhx6pzWyUMbbqK9dKD/BVxME=", - "dev": true - }, - "path-platform": { - "version": "0.11.15", - "resolved": "https://registry.npmjs.org/path-platform/-/path-platform-0.11.15.tgz", - "integrity": "sha1-6GQhf3TDaFDwhSt43Hv31KVyG/I=", - "dev": true - }, - "path-root": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/path-root/-/path-root-0.1.1.tgz", - "integrity": "sha1-mkpoFMrBwM1zNgqV8yCDyOpHRbc=", - "dev": true, - "requires": { - "path-root-regex": "0.1.2" - } - }, - "path-root-regex": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/path-root-regex/-/path-root-regex-0.1.2.tgz", - "integrity": "sha1-v8zcjfWxLcUsi0PsONGNcsBLqW0=", - "dev": true - }, - "pbkdf2": { - "version": "3.0.13", - "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.0.13.tgz", - "integrity": "sha512-+dCHxDH+djNtjgWmvVC/my3SYBAKpKNqKSjLkp+GtWWYe4XPE+e/PSD2aCanlEZZnqPk2uekTKNC/ccbwd2X2Q==", - "dev": true, - "requires": { - "create-hash": "1.1.3", - "create-hmac": "1.1.6", - "ripemd160": "2.0.1", - "safe-buffer": "5.1.1", - "sha.js": "2.4.8" - } - }, - "preserve": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/preserve/-/preserve-0.2.0.tgz", - "integrity": "sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks=", - "dev": true - }, - "pretty-hrtime": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz", - "integrity": "sha1-t+PqQkNaTJsnWdmeDyAesZWALuE=", - "dev": true - }, - "process": { - "version": "0.10.1", - "resolved": "https://registry.npmjs.org/process/-/process-0.10.1.tgz", - "integrity": "sha1-hCRXzFHP7XLcd1r+6vuMYDQ3JyU=", - "dev": true - }, - "process-nextick-args": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", - "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=", - "dev": true - }, - "public-encrypt": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.0.tgz", - "integrity": "sha1-OfaZ86RlYN1eusvKaTyvfGXBjMY=", - "dev": true, - "requires": { - "bn.js": "4.11.7", - "browserify-rsa": "4.0.1", - "create-hash": "1.1.3", - "parse-asn1": "5.1.0", - "randombytes": "2.0.5" - } - }, - "punycode": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.2.4.tgz", - "integrity": "sha1-VACKyXKux0F13vnLpt9/qdORh0A=", - "dev": true - }, - "querystring": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", - "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=", - "dev": true - }, - "querystring-es3": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", - "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=", - "dev": true - }, - "randomatic": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-1.1.7.tgz", - "integrity": "sha512-D5JUjPyJbaJDkuAazpVnSfVkLlpeO3wDlPROTMLGKG1zMFNFRgrciKo1ltz/AzNTkqE0HzDx655QOL51N06how==", - "dev": true, - "requires": { - "is-number": "3.0.0", - "kind-of": "4.0.0" - }, - "dependencies": { - "is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "dev": true, - "requires": { - "kind-of": "3.2.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "1.1.5" - } - } - } - }, - "kind-of": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", - "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", - "dev": true, - "requires": { - "is-buffer": "1.1.5" - } - } - } - }, - "randombytes": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.0.5.tgz", - "integrity": "sha512-8T7Zn1AhMsQ/HI1SjcCfT/t4ii3eAqco3yOcSzS4mozsOz69lHLsoMXmF9nZgnFanYscnSlUSgs8uZyKzpE6kg==", - "dev": true, - "requires": { - "safe-buffer": "5.1.1" - } - }, - "readable-stream": { - "version": "1.1.14", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", - "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", - "dev": true, - "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.3", - "isarray": "0.0.1", - "string_decoder": "0.10.31" - } - }, - "readable-wrap": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/readable-wrap/-/readable-wrap-1.0.0.tgz", - "integrity": "sha1-O1ohHGMeEjA6VJkcgGwX564ga/8=", - "dev": true, - "requires": { - "readable-stream": "1.1.14" - } - }, - "rechoir": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", - "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=", - "dev": true, - "requires": { - "resolve": "1.4.0" - }, - "dependencies": { - "resolve": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.4.0.tgz", - "integrity": "sha512-aW7sVKPufyHqOmyyLzg/J+8606v5nevBgaliIlV7nUpVMsDnoBGV/cbSLNjZAg9q0Cfd/+easKVKQ8vOu8fn1Q==", - "dev": true, - "requires": { - "path-parse": "1.0.5" - } - } - } - }, - "regex-cache": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/regex-cache/-/regex-cache-0.4.3.tgz", - "integrity": "sha1-mxpsNdTQ3871cRrmUejp09cRQUU=", - "dev": true, - "requires": { - "is-equal-shallow": "0.1.3", - "is-primitive": "2.0.0" - } - }, - "remove-trailing-separator": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.0.2.tgz", - "integrity": "sha1-abBi2XhyetFNxrVrpKt3L9jXBRE=", - "dev": true - }, - "repeat-element": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.2.tgz", - "integrity": "sha1-7wiaF40Ug7quTZPrmLT55OEdmQo=", - "dev": true - }, - "repeat-string": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", - "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", - "dev": true - }, - "replace-ext": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-0.0.1.tgz", - "integrity": "sha1-KbvZIHinOfC8zitO5B6DeVNSKSQ=", - "dev": true - }, - "resolve": { - "version": "0.7.4", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-0.7.4.tgz", - "integrity": "sha1-OVqe+ehz+/4SvRRAi9kbuTYAPWk=", - "dev": true - }, - "resolve-dir": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-0.1.1.tgz", - "integrity": "sha1-shklmlYC+sXFxJatiUpujMQwJh4=", - "dev": true, - "requires": { - "expand-tilde": "1.2.2", - "global-modules": "0.2.3" - } - }, - "rfile": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/rfile/-/rfile-1.0.0.tgz", - "integrity": "sha1-WXCM+Qyh50xUw8/Fw2/bmBBDUmE=", - "dev": true, - "requires": { - "callsite": "1.0.0", - "resolve": "0.3.1" - }, - "dependencies": { - "resolve": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-0.3.1.tgz", - "integrity": "sha1-NMY0R8ZkxwWY0cmxJvxDsqJDEKQ=", - "dev": true - } - } - }, - "right-align": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/right-align/-/right-align-0.1.3.tgz", - "integrity": "sha1-YTObci/mo1FWiSENJOFMlhSGE+8=", - "dev": true, - "requires": { - "align-text": "0.1.4" - } - }, - "rimraf": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.1.tgz", - "integrity": "sha1-wjOOxkPfeht/5cVPqG9XQopV8z0=", - "dev": true, - "requires": { - "glob": "7.1.2" - }, - "dependencies": { - "glob": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", - "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", - "dev": true, - "requires": { - "fs.realpath": "1.0.0", - "inflight": "1.0.6", - "inherits": "2.0.3", - "minimatch": "3.0.4", - "once": "1.4.0", - "path-is-absolute": "1.0.1" - } - }, - "minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "dev": true, - "requires": { - "brace-expansion": "1.1.8" - } - } - } - }, - "ripemd160": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.1.tgz", - "integrity": "sha1-D0WEKVxTo2KK9+bXmsohzlfRxuc=", - "dev": true, - "requires": { - "hash-base": "2.0.2", - "inherits": "2.0.3" - } - }, - "ruglify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/ruglify/-/ruglify-1.0.0.tgz", - "integrity": "sha1-3Ikw4qlUSidDAcyZcldMDQmGtnU=", - "dev": true, - "requires": { - "rfile": "1.0.0", - "uglify-js": "2.2.5" - }, - "dependencies": { - "uglify-js": { - "version": "2.2.5", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.2.5.tgz", - "integrity": "sha1-puAqcNg5eSuXgEiLe4sYTAlcmcc=", - "dev": true, - "requires": { - "optimist": "0.3.7", - "source-map": "0.1.43" - } - } - } - }, - "runforcover": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/runforcover/-/runforcover-0.0.2.tgz", - "integrity": "sha1-NE8FfY1F0zrrxsyCIEZ49pxIV8w=", - "dev": true, - "requires": { - "bunker": "0.1.2" - } - }, - "safe-buffer": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", - "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==", - "dev": true - }, - "semver": { - "version": "4.3.6", - "resolved": "https://registry.npmjs.org/semver/-/semver-4.3.6.tgz", - "integrity": "sha1-MAvG4OhjdPe6YQaLWx7NV/xlMto=", - "dev": true - }, - "sequencify": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/sequencify/-/sequencify-0.0.7.tgz", - "integrity": "sha1-kM/xnQLgcCf9dn9erT57ldHnOAw=", - "dev": true - }, - "set-immediate-shim": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz", - "integrity": "sha1-SysbJ+uAip+NzEgaWOXlb1mfP2E=", - "dev": true - }, - "sha.js": { - "version": "2.4.8", - "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.8.tgz", - "integrity": "sha1-NwaMLEdra69ALRSknGf1l5IfY08=", - "dev": true, - "requires": { - "inherits": "2.0.3" - } - }, - "shallow-copy": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/shallow-copy/-/shallow-copy-0.0.1.tgz", - "integrity": "sha1-QV9CcC1z2BAzApLMXuhurhoRoXA=", - "dev": true - }, - "shasum": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/shasum/-/shasum-1.0.2.tgz", - "integrity": "sha1-5wEjENj0F/TetXEhUOVni4euVl8=", - "dev": true, - "requires": { - "json-stable-stringify": "0.0.1", - "sha.js": "2.4.8" - } - }, - "shell-quote": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-0.0.1.tgz", - "integrity": "sha1-GkEZbzwDM8SCMjWT1ohuzxU92YY=", - "dev": true - }, - "sigmund": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.1.tgz", - "integrity": "sha1-P/IfGYytIXX587eBhT/ZTQ0ZtZA=", - "dev": true - }, - "simplesvg": { - "version": "0.0.10", - "resolved": "https://registry.npmjs.org/simplesvg/-/simplesvg-0.0.10.tgz", - "integrity": "sha1-N9LsGN4sFU3Ztp956K0gvx4eX90=", - "requires": { - "add-event-listener": "0.0.1" - } - }, - "slide": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/slide/-/slide-1.1.6.tgz", - "integrity": "sha1-VusCfWW00tzmyy4tMsTUr8nh1wc=", - "dev": true - }, - "source-map": { - "version": "0.1.43", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.1.43.tgz", - "integrity": "sha1-wkvBRspRfBRx9drL4lcbK3+eM0Y=", - "dev": true, - "requires": { - "amdefine": "1.0.1" - } - }, - "sparkles": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/sparkles/-/sparkles-1.0.0.tgz", - "integrity": "sha1-Gsu/tZJDbRC76PeFt8xvgoFQEsM=", - "dev": true - }, - "stream-browserify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-1.0.0.tgz", - "integrity": "sha1-v5tKv7QrJ011FHnkTg/yZWtvEZM=", - "dev": true, - "requires": { - "inherits": "2.0.3", - "readable-stream": "1.1.14" - } - }, - "stream-combiner2": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/stream-combiner2/-/stream-combiner2-1.0.2.tgz", - "integrity": "sha1-unKmtQy/q/qVD8i8h2BL0B62BnE=", - "dev": true, - "requires": { - "duplexer2": "0.0.2", - "through2": "0.5.1" - }, - "dependencies": { - "readable-stream": { - "version": "1.0.34", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", - "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", - "dev": true, - "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.3", - "isarray": "0.0.1", - "string_decoder": "0.10.31" - } - }, - "through2": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/through2/-/through2-0.5.1.tgz", - "integrity": "sha1-390BLrnHAOIyP9M084rGIqs3Lac=", - "dev": true, - "requires": { - "readable-stream": "1.0.34", - "xtend": "3.0.0" - } - } - } - }, - "stream-consume": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/stream-consume/-/stream-consume-0.1.0.tgz", - "integrity": "sha1-pB6tGm1ggc63n2WwYZAbbY89HQ8=", - "dev": true - }, - "stream-splicer": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/stream-splicer/-/stream-splicer-1.3.2.tgz", - "integrity": "sha1-PARBvhW5v04iYnXm3IOWR0VUZmE=", - "dev": true, - "requires": { - "indexof": "0.0.1", - "inherits": "2.0.3", - "isarray": "0.0.1", - "readable-stream": "1.1.14", - "readable-wrap": "1.0.0", - "through2": "1.1.1" - } - }, - "string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", - "dev": true - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dev": true, - "requires": { - "ansi-regex": "2.1.1" - } - }, - "strip-bom": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-1.0.0.tgz", - "integrity": "sha1-hbiGLzhEtabV7IRnqTWYFzo295Q=", - "dev": true, - "requires": { - "first-chunk-stream": "1.0.0", - "is-utf8": "0.2.1" - } - }, - "subarg": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/subarg/-/subarg-1.0.0.tgz", - "integrity": "sha1-9izxdYHplrSPyWVpn1TAauJouNI=", - "dev": true, - "requires": { - "minimist": "1.2.0" - } - }, - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", - "dev": true - }, - "syntax-error": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/syntax-error/-/syntax-error-1.3.0.tgz", - "integrity": "sha1-HtkmbE1AvnXcVb+bsct3Biu5bKE=", - "dev": true, - "requires": { - "acorn": "4.0.13" - } - }, - "tap": { - "version": "0.4.13", - "resolved": "https://registry.npmjs.org/tap/-/tap-0.4.13.tgz", - "integrity": "sha1-OYYTTWdZcn/CIj5hEm7rhyQ6zLw=", - "dev": true, - "requires": { - "buffer-equal": "0.0.2", - "deep-equal": "0.0.0", - "difflet": "0.2.6", - "glob": "3.2.11", - "inherits": "2.0.3", - "mkdirp": "0.5.1", - "nopt": "2.2.1", - "runforcover": "0.0.2", - "slide": "1.1.6", - "yamlish": "0.0.7" - }, - "dependencies": { - "deep-equal": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-0.0.0.tgz", - "integrity": "sha1-mWedO70EcVb81FDT0B7rkGhpHoM=", - "dev": true - }, - "glob": { - "version": "3.2.11", - "resolved": "https://registry.npmjs.org/glob/-/glob-3.2.11.tgz", - "integrity": "sha1-Spc/Y1uRkPcV0QmH1cAP0oFevj0=", - "dev": true, - "requires": { - "inherits": "2.0.3", - "minimatch": "0.3.0" - } - }, - "minimatch": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-0.3.0.tgz", - "integrity": "sha1-J12O2qxPG7MyZHIInnlJyDlGmd0=", - "dev": true, - "requires": { - "lru-cache": "2.7.3", - "sigmund": "1.0.1" - } - } - } - }, - "through": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", - "dev": true - }, - "through2": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/through2/-/through2-1.1.1.tgz", - "integrity": "sha1-CEfLxESfNAVXTb3M2buEG4OsNUU=", - "dev": true, - "requires": { - "readable-stream": "1.1.14", - "xtend": "4.0.1" - }, - "dependencies": { - "xtend": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", - "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=", - "dev": true - } - } - }, - "tildify": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/tildify/-/tildify-1.2.0.tgz", - "integrity": "sha1-3OwD9V3Km3qj5bBPIYF+tW5jWIo=", - "dev": true, - "requires": { - "os-homedir": "1.0.2" - } - }, - "time-stamp": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/time-stamp/-/time-stamp-1.1.0.tgz", - "integrity": "sha1-dkpaEa9QVhkhsTPztE5hhofg9cM=", - "dev": true - }, - "timers-browserify": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-1.4.2.tgz", - "integrity": "sha1-ycWLV1voQHN1y14kYtrO50NZ9B0=", - "dev": true, - "requires": { - "process": "0.11.10" - }, - "dependencies": { - "process": { - "version": "0.11.10", - "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", - "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=", - "dev": true - } - } - }, - "traverse": { - "version": "0.6.6", - "resolved": "https://registry.npmjs.org/traverse/-/traverse-0.6.6.tgz", - "integrity": "sha1-y99WD9e5r2MlAv7UD5GMFX6pcTc=", - "dev": true - }, - "tty-browserify": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz", - "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=", - "dev": true - }, - "typedarray": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", - "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", - "dev": true - }, - "uglify-js": { - "version": "2.4.24", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.4.24.tgz", - "integrity": "sha1-+tV1XB4Vd2WLsG/5q25UjJW+vW4=", - "dev": true, - "requires": { - "async": "0.2.10", - "source-map": "0.1.34", - "uglify-to-browserify": "1.0.2", - "yargs": "3.5.4" - }, - "dependencies": { - "source-map": { - "version": "0.1.34", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.1.34.tgz", - "integrity": "sha1-p8/omux7FoLDsZjQrPtH19CQVms=", - "dev": true, - "requires": { - "amdefine": "1.0.1" - } - } - } - }, - "uglify-save-license": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/uglify-save-license/-/uglify-save-license-0.4.1.tgz", - "integrity": "sha1-lXJsF8xv0XHDYX479NjYKqjEzOE=", - "dev": true - }, - "uglify-to-browserify": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz", - "integrity": "sha1-bgkk1r2mta/jSeOabWMoUKD4grc=", - "dev": true - }, - "umd": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/umd/-/umd-2.1.0.tgz", - "integrity": "sha1-SmMHt2LxfwLSAbX6FU5nM5bCY88=", - "dev": true, - "requires": { - "rfile": "1.0.0", - "ruglify": "1.0.0", - "through": "2.3.8", - "uglify-js": "2.4.24" - } - }, - "unc-path-regex": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/unc-path-regex/-/unc-path-regex-0.1.2.tgz", - "integrity": "sha1-5z3T17DXxe2G+6xrCufYxqadUPo=", - "dev": true - }, - "unique-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unique-stream/-/unique-stream-1.0.0.tgz", - "integrity": "sha1-1ZpKdUJ0R9mqbJHnAmP40mpLEEs=", - "dev": true - }, - "url": { - "version": "0.10.3", - "resolved": "https://registry.npmjs.org/url/-/url-0.10.3.tgz", - "integrity": "sha1-Ah5NnHcF8hu/N9A861h2dAJ3TGQ=", - "dev": true, - "requires": { - "punycode": "1.3.2", - "querystring": "0.2.0" - }, - "dependencies": { - "punycode": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", - "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=", - "dev": true - } - } - }, - "user-home": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/user-home/-/user-home-1.1.1.tgz", - "integrity": "sha1-K1viOjK2Onyd640PKNSFcko98ZA=", - "dev": true - }, - "util": { - "version": "0.10.3", - "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", - "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", - "dev": true, - "requires": { - "inherits": "2.0.1" - }, - "dependencies": { - "inherits": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", - "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=", - "dev": true - } - } - }, - "util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", - "dev": true - }, - "v8flags": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/v8flags/-/v8flags-2.1.1.tgz", - "integrity": "sha1-qrGh+jDUX4jdMhFIh1rALAtV5bQ=", - "dev": true, - "requires": { - "user-home": "1.1.1" - } - }, - "vinyl": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-0.5.3.tgz", - "integrity": "sha1-sEVbOPxeDPMNQyUTLkYZcMIJHN4=", - "dev": true, - "requires": { - "clone": "1.0.2", - "clone-stats": "0.0.1", - "replace-ext": "0.0.1" - } - }, - "vinyl-buffer": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/vinyl-buffer/-/vinyl-buffer-1.0.0.tgz", - "integrity": "sha1-ygZ+oIQx1QdyKx3lCD9gJhbrwjQ=", - "dev": true, - "requires": { - "bl": "0.9.5", - "through2": "0.6.5" - }, - "dependencies": { - "readable-stream": { - "version": "1.0.34", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", - "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", - "dev": true, - "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.3", - "isarray": "0.0.1", - "string_decoder": "0.10.31" - } - }, - "through2": { - "version": "0.6.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz", - "integrity": "sha1-QaucZ7KdVyCQcUEOHXp6lozTrUg=", - "dev": true, - "requires": { - "readable-stream": "1.0.34", - "xtend": "4.0.1" - } - }, - "xtend": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", - "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=", - "dev": true - } - } - }, - "vinyl-fs": { - "version": "0.3.14", - "resolved": "https://registry.npmjs.org/vinyl-fs/-/vinyl-fs-0.3.14.tgz", - "integrity": "sha1-mmhRzhysHBzqX+hsCTHWIMLPqeY=", - "dev": true, - "requires": { - "defaults": "1.0.3", - "glob-stream": "3.1.18", - "glob-watcher": "0.0.6", - "graceful-fs": "3.0.11", - "mkdirp": "0.5.1", - "strip-bom": "1.0.0", - "through2": "0.6.5", - "vinyl": "0.4.6" - }, - "dependencies": { - "clone": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/clone/-/clone-0.2.0.tgz", - "integrity": "sha1-xhJqkK1Pctv1rNskPMN3JP6T/B8=", - "dev": true - }, - "readable-stream": { - "version": "1.0.34", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", - "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", - "dev": true, - "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.3", - "isarray": "0.0.1", - "string_decoder": "0.10.31" - } - }, - "through2": { - "version": "0.6.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz", - "integrity": "sha1-QaucZ7KdVyCQcUEOHXp6lozTrUg=", - "dev": true, - "requires": { - "readable-stream": "1.0.34", - "xtend": "4.0.1" - } - }, - "vinyl": { - "version": "0.4.6", - "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-0.4.6.tgz", - "integrity": "sha1-LzVsh6VQolVGHza76ypbqL94SEc=", - "dev": true, - "requires": { - "clone": "0.2.0", - "clone-stats": "0.0.1" - } - }, - "xtend": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", - "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=", - "dev": true - } - } - }, - "vinyl-source-stream": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/vinyl-source-stream/-/vinyl-source-stream-1.1.0.tgz", - "integrity": "sha1-RMvlEIIFJ53rDFZTwJSiiHk4sas=", - "dev": true, - "requires": { - "through2": "0.6.5", - "vinyl": "0.4.6" - }, - "dependencies": { - "clone": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/clone/-/clone-0.2.0.tgz", - "integrity": "sha1-xhJqkK1Pctv1rNskPMN3JP6T/B8=", - "dev": true - }, - "readable-stream": { - "version": "1.0.34", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", - "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", - "dev": true, - "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.3", - "isarray": "0.0.1", - "string_decoder": "0.10.31" - } - }, - "through2": { - "version": "0.6.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz", - "integrity": "sha1-QaucZ7KdVyCQcUEOHXp6lozTrUg=", - "dev": true, - "requires": { - "readable-stream": "1.0.34", - "xtend": "4.0.1" - } - }, - "vinyl": { - "version": "0.4.6", - "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-0.4.6.tgz", - "integrity": "sha1-LzVsh6VQolVGHza76ypbqL94SEc=", - "dev": true, - "requires": { - "clone": "0.2.0", - "clone-stats": "0.0.1" - } - }, - "xtend": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", - "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=", - "dev": true - } - } - }, - "vinyl-sourcemaps-apply": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/vinyl-sourcemaps-apply/-/vinyl-sourcemaps-apply-0.2.1.tgz", - "integrity": "sha1-q2VJ1h0XLCsbh75cUI0jnI74dwU=", - "dev": true, - "requires": { - "source-map": "0.5.6" - }, - "dependencies": { - "source-map": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz", - "integrity": "sha1-dc449SvwczxafwwRjYEzSiu19BI=", - "dev": true - } - } - }, - "vm-browserify": { - "version": "0.0.4", - "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-0.0.4.tgz", - "integrity": "sha1-XX6kW7755Kb/ZflUOOCofDV9WnM=", - "dev": true, - "requires": { - "indexof": "0.0.1" - } - }, - "which": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.0.tgz", - "integrity": "sha512-xcJpopdamTuY5duC/KnTTNBraPK54YwpenP4lzxU8H91GudWpFv38u0CKjclE1Wi2EH2EDz5LRcHcKbCIzqGyg==", - "dev": true, - "requires": { - "isexe": "2.0.0" - } - }, - "window-size": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.0.tgz", - "integrity": "sha1-VDjNLqk7IC76Ohn+iIeu58lPnJ0=", - "dev": true - }, - "wordwrap": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz", - "integrity": "sha1-o9XabNXAvAAI03I0u68b7WMFkQc=", - "dev": true - }, - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", - "dev": true - }, - "xtend": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-3.0.0.tgz", - "integrity": "sha1-XM50B7r2Qsunvs2laBEcST9ZZlo=", - "dev": true - }, - "yamlish": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/yamlish/-/yamlish-0.0.7.tgz", - "integrity": "sha1-tK+aHcxjYYhzw9bkUewyE8OaV/s=", - "dev": true - }, - "yargs": { - "version": "3.5.4", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.5.4.tgz", - "integrity": "sha1-2K/49mXpTDS9JZvevRv68N3TU2E=", - "dev": true, - "requires": { - "camelcase": "1.2.1", - "decamelize": "1.2.0", - "window-size": "0.1.0", - "wordwrap": "0.0.2" - }, - "dependencies": { - "wordwrap": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz", - "integrity": "sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8=", - "dev": true - } - } - } - } -} From c2d3837c386c445c378183470f795ea21e51053c Mon Sep 17 00:00:00 2001 From: Andriy Kashcha Date: Mon, 7 Aug 2017 22:33:15 -0700 Subject: [PATCH 14/49] Rebuild the library locally --- dist/vivagraph.js | 4062 ++++++++++++++++++++++----------------------- 1 file changed, 2031 insertions(+), 2031 deletions(-) diff --git a/dist/vivagraph.js b/dist/vivagraph.js index 0ecff26..4f0fad5 100644 --- a/dist/vivagraph.js +++ b/dist/vivagraph.js @@ -3252,42 +3252,42 @@ function fail() { } },{}],32:[function(require,module,exports){ -var centrality = require('ngraph.centrality'); - -module.exports = centralityWrapper; - -function centralityWrapper() { - // TODO: This should not be a function - return { - betweennessCentrality: betweennessCentrality, - degreeCentrality: degreeCentrality - }; -} - -function betweennessCentrality(g) { - var betweenness = centrality.betweenness(g); - return toVivaGraphCentralityFormat(betweenness); -} - -function degreeCentrality(g, kind) { - var degree = centrality.degree(g, kind); - return toVivaGraphCentralityFormat(degree); -} - -function toVivaGraphCentralityFormat(centrality) { - return Object.keys(centrality).sort(byValue).map(toKeyValue); - - function byValue(x, y) { - return centrality[y] - centrality[x]; - } - - function toKeyValue(key) { - return { - key: key, - value: centrality[key] - }; - } -} +var centrality = require('ngraph.centrality'); + +module.exports = centralityWrapper; + +function centralityWrapper() { + // TODO: This should not be a function + return { + betweennessCentrality: betweennessCentrality, + degreeCentrality: degreeCentrality + }; +} + +function betweennessCentrality(g) { + var betweenness = centrality.betweenness(g); + return toVivaGraphCentralityFormat(betweenness); +} + +function degreeCentrality(g, kind) { + var degree = centrality.degree(g, kind); + return toVivaGraphCentralityFormat(degree); +} + +function toVivaGraphCentralityFormat(centrality) { + return Object.keys(centrality).sort(byValue).map(toKeyValue); + + function byValue(x, y) { + return centrality[y] - centrality[x]; + } + + function toKeyValue(key) { + return { + key: key, + value: centrality[key] + }; + } +} },{"ngraph.centrality":4}],33:[function(require,module,exports){ /** @@ -3325,651 +3325,651 @@ function operations() { }; },{}],34:[function(require,module,exports){ -/** - * @author Andrei Kashcha (aka anvaka) / https://github.com/anvaka - */ - -module.exports = domInputManager; - -var dragndrop = require('./dragndrop.js'); - -function domInputManager(graph, graphics) { - var nodeEvents = {}; - return { - /** - * Called by renderer to listen to drag-n-drop events from node. E.g. for SVG - * graphics we may listen to DOM events, whereas for WebGL the graphics - * should provide custom eventing mechanism. - * - * @param node - to be monitored. - * @param handlers - object with set of three callbacks: - * onStart: function(), - * onDrag: function(e, offset), - * onStop: function() - */ - bindDragNDrop: bindDragNDrop - }; - - function bindDragNDrop(node, handlers) { - var events; - if (handlers) { - var nodeUI = graphics.getNodeUI(node.id); - events = dragndrop(nodeUI); - if (typeof handlers.onStart === 'function') { - events.onStart(handlers.onStart); - } - if (typeof handlers.onDrag === 'function') { - events.onDrag(handlers.onDrag); - } - if (typeof handlers.onStop === 'function') { - events.onStop(handlers.onStop); - } - - nodeEvents[node.id] = events; - } else if ((events = nodeEvents[node.id])) { - events.release(); - delete nodeEvents[node.id]; - } - } -} +/** + * @author Andrei Kashcha (aka anvaka) / https://github.com/anvaka + */ + +module.exports = domInputManager; + +var dragndrop = require('./dragndrop.js'); + +function domInputManager(graph, graphics) { + var nodeEvents = {}; + return { + /** + * Called by renderer to listen to drag-n-drop events from node. E.g. for SVG + * graphics we may listen to DOM events, whereas for WebGL the graphics + * should provide custom eventing mechanism. + * + * @param node - to be monitored. + * @param handlers - object with set of three callbacks: + * onStart: function(), + * onDrag: function(e, offset), + * onStop: function() + */ + bindDragNDrop: bindDragNDrop + }; + + function bindDragNDrop(node, handlers) { + var events; + if (handlers) { + var nodeUI = graphics.getNodeUI(node.id); + events = dragndrop(nodeUI); + if (typeof handlers.onStart === 'function') { + events.onStart(handlers.onStart); + } + if (typeof handlers.onDrag === 'function') { + events.onDrag(handlers.onDrag); + } + if (typeof handlers.onStop === 'function') { + events.onStop(handlers.onStop); + } + + nodeEvents[node.id] = events; + } else if ((events = nodeEvents[node.id])) { + events.release(); + delete nodeEvents[node.id]; + } + } +} },{"./dragndrop.js":35}],35:[function(require,module,exports){ -/** - * @author Andrei Kashcha (aka anvaka) / https://github.com/anvaka - */ - -module.exports = dragndrop; - -var documentEvents = require('../Utils/documentEvents.js'); -var browserInfo = require('../Utils/browserInfo.js'); -var findElementPosition = require('../Utils/findElementPosition.js'); - -// TODO: Move to input namespace -// TODO: Methods should be extracted into the prototype. This class -// does not need to consume so much memory for every tracked element -function dragndrop(element) { - var start, - drag, - end, - scroll, - prevSelectStart, - prevDragStart, - - startX = 0, - startY = 0, - dragObject, - touchInProgress = false, - pinchZoomLength = 0, - - getMousePos = function (e) { - var posx = 0, - posy = 0; - - e = e || window.event; - - if (e.pageX || e.pageY) { - posx = e.pageX; - posy = e.pageY; - } else if (e.clientX || e.clientY) { - posx = e.clientX + window.document.body.scrollLeft + window.document.documentElement.scrollLeft; - posy = e.clientY + window.document.body.scrollTop + window.document.documentElement.scrollTop; - } - - return [posx, posy]; - }, - - move = function (e, clientX, clientY) { - if (drag) { - drag(e, {x : clientX - startX, y : clientY - startY }); - } - - startX = clientX; - startY = clientY; - }, - - stopPropagation = function (e) { - if (e.stopPropagation) { e.stopPropagation(); } else { e.cancelBubble = true; } - }, - preventDefault = function (e) { - if (e.preventDefault) { e.preventDefault(); } - }, - - handleDisabledEvent = function (e) { - stopPropagation(e); - return false; - }, - - handleMouseMove = function (e) { - e = e || window.event; - - move(e, e.clientX, e.clientY); - }, - - handleMouseDown = function (e) { - e = e || window.event; - if (touchInProgress) { - // modern browsers will fire mousedown for touch events too - // we do not want this, since touch is handled separately. - stopPropagation(e); - return false; - } - // for IE, left click == 1 - // for Firefox, left click == 0 - var isLeftButton = ((e.button === 1 && window.event !== null) || e.button === 0); - - if (isLeftButton) { - startX = e.clientX; - startY = e.clientY; - - // TODO: bump zIndex? - dragObject = e.target || e.srcElement; - - if (start) { start(e, {x: startX, y : startY}); } - - documentEvents.on('mousemove', handleMouseMove); - documentEvents.on('mouseup', handleMouseUp); - - - stopPropagation(e); - // TODO: What if event already there? Not bullet proof: - prevSelectStart = window.document.onselectstart; - prevDragStart = window.document.ondragstart; - - window.document.onselectstart = handleDisabledEvent; - dragObject.ondragstart = handleDisabledEvent; - - // prevent text selection (except IE) - return false; - } - }, - - handleMouseUp = function (e) { - e = e || window.event; - - documentEvents.off('mousemove', handleMouseMove); - documentEvents.off('mouseup', handleMouseUp); - - window.document.onselectstart = prevSelectStart; - dragObject.ondragstart = prevDragStart; - dragObject = null; - if (end) { end(e); } - }, - - handleMouseWheel = function (e) { - if (typeof scroll !== 'function') { - return; - } - - e = e || window.event; - if (e.preventDefault) { - e.preventDefault(); - } - - e.returnValue = false; - var delta, - mousePos = getMousePos(e), - elementOffset = findElementPosition(element), - relMousePos = { - x: mousePos[0] - elementOffset[0], - y: mousePos[1] - elementOffset[1] - }; - - if (e.wheelDelta) { - delta = e.wheelDelta / 360; // Chrome/Safari - } else { - delta = e.detail / -9; // Mozilla - } - - scroll(e, delta, relMousePos); - }, - - updateScrollEvents = function (scrollCallback) { - if (!scroll && scrollCallback) { - // client is interested in scrolling. Start listening to events: - if (browserInfo.browser === 'webkit') { - element.addEventListener('mousewheel', handleMouseWheel, false); // Chrome/Safari - } else { - element.addEventListener('DOMMouseScroll', handleMouseWheel, false); // Others - } - } else if (scroll && !scrollCallback) { - if (browserInfo.browser === 'webkit') { - element.removeEventListener('mousewheel', handleMouseWheel, false); // Chrome/Safari - } else { - element.removeEventListener('DOMMouseScroll', handleMouseWheel, false); // Others - } - } - - scroll = scrollCallback; - }, - - getPinchZoomLength = function(finger1, finger2) { - return (finger1.clientX - finger2.clientX) * (finger1.clientX - finger2.clientX) + - (finger1.clientY - finger2.clientY) * (finger1.clientY - finger2.clientY); - }, - - handleTouchMove = function (e) { - if (e.touches.length === 1) { - stopPropagation(e); - - var touch = e.touches[0]; - move(e, touch.clientX, touch.clientY); - } else if (e.touches.length === 2) { - // it's a zoom: - var currentPinchLength = getPinchZoomLength(e.touches[0], e.touches[1]); - var delta = 0; - if (currentPinchLength < pinchZoomLength) { - delta = -1; - } else if (currentPinchLength > pinchZoomLength) { - delta = 1; - } - scroll(e, delta, {x: e.touches[0].clientX, y: e.touches[0].clientY}); - pinchZoomLength = currentPinchLength; - stopPropagation(e); - preventDefault(e); - } - }, - - handleTouchEnd = function (e) { - touchInProgress = false; - documentEvents.off('touchmove', handleTouchMove); - documentEvents.off('touchend', handleTouchEnd); - documentEvents.off('touchcancel', handleTouchEnd); - dragObject = null; - if (end) { end(e); } - }, - - handleSignleFingerTouch = function (e, touch) { - stopPropagation(e); - preventDefault(e); - - startX = touch.clientX; - startY = touch.clientY; - - dragObject = e.target || e.srcElement; - - if (start) { start(e, {x: startX, y : startY}); } - // TODO: can I enter into the state when touch is in progress - // but it's still a single finger touch? - if (!touchInProgress) { - touchInProgress = true; - documentEvents.on('touchmove', handleTouchMove); - documentEvents.on('touchend', handleTouchEnd); - documentEvents.on('touchcancel', handleTouchEnd); - } - }, - - handleTouchStart = function (e) { - if (e.touches.length === 1) { - return handleSignleFingerTouch(e, e.touches[0]); - } else if (e.touches.length === 2) { - // handleTouchMove() will care about pinch zoom. - stopPropagation(e); - preventDefault(e); - - pinchZoomLength = getPinchZoomLength(e.touches[0], e.touches[1]); - - } - // don't care about the rest. - }; - - - element.addEventListener('mousedown', handleMouseDown); - element.addEventListener('touchstart', handleTouchStart); - - return { - onStart : function (callback) { - start = callback; - return this; - }, - - onDrag : function (callback) { - drag = callback; - return this; - }, - - onStop : function (callback) { - end = callback; - return this; - }, - - /** - * Occurs when mouse wheel event happens. callback = function(e, scrollDelta, scrollPoint); - */ - onScroll : function (callback) { - updateScrollEvents(callback); - return this; - }, - - release : function () { - // TODO: could be unsafe. We might wanna release dragObject, etc. - element.removeEventListener('mousedown', handleMouseDown); - element.removeEventListener('touchstart', handleTouchStart); - - documentEvents.off('mousemove', handleMouseMove); - documentEvents.off('mouseup', handleMouseUp); - documentEvents.off('touchmove', handleTouchMove); - documentEvents.off('touchend', handleTouchEnd); - documentEvents.off('touchcancel', handleTouchEnd); - - updateScrollEvents(null); - } - }; -} +/** + * @author Andrei Kashcha (aka anvaka) / https://github.com/anvaka + */ -},{"../Utils/browserInfo.js":39,"../Utils/documentEvents.js":40,"../Utils/findElementPosition.js":41}],36:[function(require,module,exports){ -/** - * @author Andrei Kashcha (aka anvaka) / https://github.com/anvaka - */ - -module.exports = webglInputManager; - -var createInputEvents = require('../WebGL/webglInputEvents.js'); - -function webglInputManager(graph, graphics) { - var inputEvents = createInputEvents(graphics), - draggedNode = null, - internalHandlers = {}, - pos = {x : 0, y : 0}; - - inputEvents.mouseDown(function (node, e) { - draggedNode = node; - pos.x = e.clientX; - pos.y = e.clientY; - - inputEvents.mouseCapture(draggedNode); - - var handlers = internalHandlers[node.id]; - if (handlers && handlers.onStart) { - handlers.onStart(e, pos); - } - - return true; - }).mouseUp(function (node) { - inputEvents.releaseMouseCapture(draggedNode); - - draggedNode = null; - var handlers = internalHandlers[node.id]; - if (handlers && handlers.onStop) { - handlers.onStop(); - } - return true; - }).mouseMove(function (node, e) { - if (draggedNode) { - var handlers = internalHandlers[draggedNode.id]; - if (handlers && handlers.onDrag) { - handlers.onDrag(e, {x : e.clientX - pos.x, y : e.clientY - pos.y }); - } - - pos.x = e.clientX; - pos.y = e.clientY; - return true; - } - }); - - return { - /** - * Called by renderer to listen to drag-n-drop events from node. E.g. for SVG - * graphics we may listen to DOM events, whereas for WebGL we graphics - * should provide custom eventing mechanism. - * - * @param node - to be monitored. - * @param handlers - object with set of three callbacks: - * onStart: function(), - * onDrag: function(e, offset), - * onStop: function() - */ - bindDragNDrop : function (node, handlers) { - internalHandlers[node.id] = handlers; - if (!handlers) { - delete internalHandlers[node.id]; - } - } - }; -} +module.exports = dragndrop; + +var documentEvents = require('../Utils/documentEvents.js'); +var browserInfo = require('../Utils/browserInfo.js'); +var findElementPosition = require('../Utils/findElementPosition.js'); + +// TODO: Move to input namespace +// TODO: Methods should be extracted into the prototype. This class +// does not need to consume so much memory for every tracked element +function dragndrop(element) { + var start, + drag, + end, + scroll, + prevSelectStart, + prevDragStart, + + startX = 0, + startY = 0, + dragObject, + touchInProgress = false, + pinchZoomLength = 0, + + getMousePos = function (e) { + var posx = 0, + posy = 0; + + e = e || window.event; + + if (e.pageX || e.pageY) { + posx = e.pageX; + posy = e.pageY; + } else if (e.clientX || e.clientY) { + posx = e.clientX + window.document.body.scrollLeft + window.document.documentElement.scrollLeft; + posy = e.clientY + window.document.body.scrollTop + window.document.documentElement.scrollTop; + } -},{"../WebGL/webglInputEvents.js":57}],37:[function(require,module,exports){ -module.exports = constant; - -var merge = require('ngraph.merge'); -var random = require('ngraph.random').random; -var Rect = require('../Utils/rect.js'); - -/** - * Does not really perform any layouting algorithm but is compliant - * with renderer interface. Allowing clients to provide specific positioning - * callback and get static layout of the graph - * - * @param {Viva.Graph.graph} graph to layout - * @param {Object} userSettings - */ -function constant(graph, userSettings) { - userSettings = merge(userSettings, { - maxX : 1024, - maxY : 1024, - seed : 'Deterministic randomness made me do this' - }); - // This class simply follows API, it does not use some of the arguments: - /*jshint unused: false */ - var rand = random(userSettings.seed), - graphRect = new Rect(Number.MAX_VALUE, Number.MAX_VALUE, Number.MIN_VALUE, Number.MIN_VALUE), - layoutLinks = {}, - - placeNodeCallback = function (node) { - return { - x: rand.next(userSettings.maxX), - y: rand.next(userSettings.maxY) - }; - }, - - updateGraphRect = function (position, graphRect) { - if (position.x < graphRect.x1) { graphRect.x1 = position.x; } - if (position.x > graphRect.x2) { graphRect.x2 = position.x; } - if (position.y < graphRect.y1) { graphRect.y1 = position.y; } - if (position.y > graphRect.y2) { graphRect.y2 = position.y; } - }, - - layoutNodes = typeof Object.create === 'function' ? Object.create(null) : {}, - - ensureNodeInitialized = function (node) { - layoutNodes[node.id] = placeNodeCallback(node); - updateGraphRect(layoutNodes[node.id], graphRect); - }, - - updateNodePositions = function () { - if (graph.getNodesCount() === 0) { return; } - - graphRect.x1 = Number.MAX_VALUE; - graphRect.y1 = Number.MAX_VALUE; - graphRect.x2 = Number.MIN_VALUE; - graphRect.y2 = Number.MIN_VALUE; - - graph.forEachNode(ensureNodeInitialized); - }, - - ensureLinkInitialized = function (link) { - layoutLinks[link.id] = link; - }, - - onGraphChanged = function(changes) { - for (var i = 0; i < changes.length; ++i) { - var change = changes[i]; - if (change.node) { - if (change.changeType === 'add') { - ensureNodeInitialized(change.node); - } else { - delete layoutNodes[change.node.id]; - } - } if (change.link) { - if (change.changeType === 'add') { - ensureLinkInitialized(change.link); - } else { - delete layoutLinks[change.link.id]; - } - } - } - }; - - graph.forEachNode(ensureNodeInitialized); - graph.forEachLink(ensureLinkInitialized); - graph.on('changed', onGraphChanged); - - return { - /** - * Attempts to layout graph within given number of iterations. - * - * @param {integer} [iterationsCount] number of algorithm's iterations. - * The constant layout ignores this parameter. - */ - run : function (iterationsCount) { - this.step(); - }, - - /** - * One step of layout algorithm. - */ - step : function () { - updateNodePositions(); - - return true; // no need to continue. - }, - - /** - * Returns rectangle structure {x1, y1, x2, y2}, which represents - * current space occupied by graph. - */ - getGraphRect : function () { - return graphRect; - }, - - /** - * Request to release all resources - */ - dispose : function () { - graph.off('change', onGraphChanged); - }, - - /* - * Checks whether given node is pinned; all nodes in this layout are pinned. - */ - isNodePinned: function (node) { - return true; - }, - - /* - * Requests layout algorithm to pin/unpin node to its current position - * Pinned nodes should not be affected by layout algorithm and always - * remain at their position - */ - pinNode: function (node, isPinned) { - // noop - }, - - /* - * Gets position of a node by its id. If node was not seen by this - * layout algorithm undefined value is returned; - */ - getNodePosition: getNodePosition, - - /** - * Returns {from, to} position of a link. - */ - getLinkPosition: function (linkId) { - var link = layoutLinks[linkId]; - return { - from : getNodePosition(link.fromId), - to : getNodePosition(link.toId) - }; - }, - - /** - * Sets position of a node to a given coordinates - */ - setNodePosition: function (nodeId, x, y) { - var pos = layoutNodes[nodeId]; - if (pos) { - pos.x = x; - pos.y = y; - } - }, - - // Layout specific methods: - - /** - * Based on argument either update default node placement callback or - * attempts to place given node using current placement callback. - * Setting new node callback triggers position update for all nodes. - * - * @param {Object} newPlaceNodeCallbackOrNode - if it is a function then - * default node placement callback is replaced with new one. Node placement - * callback has a form of function (node) {}, and is expected to return an - * object with x and y properties set to numbers. - * - * Otherwise if it's not a function the argument is treated as graph node - * and current node placement callback will be used to place it. - */ - placeNode : function (newPlaceNodeCallbackOrNode) { - if (typeof newPlaceNodeCallbackOrNode === 'function') { - placeNodeCallback = newPlaceNodeCallbackOrNode; - updateNodePositions(); - return this; - } - - // it is not a request to update placeNodeCallback, trying to place - // a node using current callback: - return placeNodeCallback(newPlaceNodeCallbackOrNode); - } - - }; - - function getNodePosition(nodeId) { - return layoutNodes[nodeId]; - } -} + return [posx, posy]; + }, + + move = function (e, clientX, clientY) { + if (drag) { + drag(e, {x : clientX - startX, y : clientY - startY }); + } + + startX = clientX; + startY = clientY; + }, + + stopPropagation = function (e) { + if (e.stopPropagation) { e.stopPropagation(); } else { e.cancelBubble = true; } + }, + preventDefault = function (e) { + if (e.preventDefault) { e.preventDefault(); } + }, + + handleDisabledEvent = function (e) { + stopPropagation(e); + return false; + }, + + handleMouseMove = function (e) { + e = e || window.event; + + move(e, e.clientX, e.clientY); + }, + + handleMouseDown = function (e) { + e = e || window.event; + if (touchInProgress) { + // modern browsers will fire mousedown for touch events too + // we do not want this, since touch is handled separately. + stopPropagation(e); + return false; + } + // for IE, left click == 1 + // for Firefox, left click == 0 + var isLeftButton = ((e.button === 1 && window.event !== null) || e.button === 0); + + if (isLeftButton) { + startX = e.clientX; + startY = e.clientY; + + // TODO: bump zIndex? + dragObject = e.target || e.srcElement; + + if (start) { start(e, {x: startX, y : startY}); } + + documentEvents.on('mousemove', handleMouseMove); + documentEvents.on('mouseup', handleMouseUp); + + + stopPropagation(e); + // TODO: What if event already there? Not bullet proof: + prevSelectStart = window.document.onselectstart; + prevDragStart = window.document.ondragstart; + + window.document.onselectstart = handleDisabledEvent; + dragObject.ondragstart = handleDisabledEvent; + + // prevent text selection (except IE) + return false; + } + }, + + handleMouseUp = function (e) { + e = e || window.event; + + documentEvents.off('mousemove', handleMouseMove); + documentEvents.off('mouseup', handleMouseUp); + + window.document.onselectstart = prevSelectStart; + dragObject.ondragstart = prevDragStart; + dragObject = null; + if (end) { end(e); } + }, + + handleMouseWheel = function (e) { + if (typeof scroll !== 'function') { + return; + } + + e = e || window.event; + if (e.preventDefault) { + e.preventDefault(); + } + + e.returnValue = false; + var delta, + mousePos = getMousePos(e), + elementOffset = findElementPosition(element), + relMousePos = { + x: mousePos[0] - elementOffset[0], + y: mousePos[1] - elementOffset[1] + }; + + if (e.wheelDelta) { + delta = e.wheelDelta / 360; // Chrome/Safari + } else { + delta = e.detail / -9; // Mozilla + } + + scroll(e, delta, relMousePos); + }, + + updateScrollEvents = function (scrollCallback) { + if (!scroll && scrollCallback) { + // client is interested in scrolling. Start listening to events: + if (browserInfo.browser === 'webkit') { + element.addEventListener('mousewheel', handleMouseWheel, false); // Chrome/Safari + } else { + element.addEventListener('DOMMouseScroll', handleMouseWheel, false); // Others + } + } else if (scroll && !scrollCallback) { + if (browserInfo.browser === 'webkit') { + element.removeEventListener('mousewheel', handleMouseWheel, false); // Chrome/Safari + } else { + element.removeEventListener('DOMMouseScroll', handleMouseWheel, false); // Others + } + } + + scroll = scrollCallback; + }, + + getPinchZoomLength = function(finger1, finger2) { + return (finger1.clientX - finger2.clientX) * (finger1.clientX - finger2.clientX) + + (finger1.clientY - finger2.clientY) * (finger1.clientY - finger2.clientY); + }, + + handleTouchMove = function (e) { + if (e.touches.length === 1) { + stopPropagation(e); + + var touch = e.touches[0]; + move(e, touch.clientX, touch.clientY); + } else if (e.touches.length === 2) { + // it's a zoom: + var currentPinchLength = getPinchZoomLength(e.touches[0], e.touches[1]); + var delta = 0; + if (currentPinchLength < pinchZoomLength) { + delta = -1; + } else if (currentPinchLength > pinchZoomLength) { + delta = 1; + } + scroll(e, delta, {x: e.touches[0].clientX, y: e.touches[0].clientY}); + pinchZoomLength = currentPinchLength; + stopPropagation(e); + preventDefault(e); + } + }, + + handleTouchEnd = function (e) { + touchInProgress = false; + documentEvents.off('touchmove', handleTouchMove); + documentEvents.off('touchend', handleTouchEnd); + documentEvents.off('touchcancel', handleTouchEnd); + dragObject = null; + if (end) { end(e); } + }, + + handleSignleFingerTouch = function (e, touch) { + stopPropagation(e); + preventDefault(e); + + startX = touch.clientX; + startY = touch.clientY; + + dragObject = e.target || e.srcElement; + + if (start) { start(e, {x: startX, y : startY}); } + // TODO: can I enter into the state when touch is in progress + // but it's still a single finger touch? + if (!touchInProgress) { + touchInProgress = true; + documentEvents.on('touchmove', handleTouchMove); + documentEvents.on('touchend', handleTouchEnd); + documentEvents.on('touchcancel', handleTouchEnd); + } + }, + + handleTouchStart = function (e) { + if (e.touches.length === 1) { + return handleSignleFingerTouch(e, e.touches[0]); + } else if (e.touches.length === 2) { + // handleTouchMove() will care about pinch zoom. + stopPropagation(e); + preventDefault(e); + + pinchZoomLength = getPinchZoomLength(e.touches[0], e.touches[1]); + + } + // don't care about the rest. + }; + + + element.addEventListener('mousedown', handleMouseDown); + element.addEventListener('touchstart', handleTouchStart); + + return { + onStart : function (callback) { + start = callback; + return this; + }, + + onDrag : function (callback) { + drag = callback; + return this; + }, + + onStop : function (callback) { + end = callback; + return this; + }, + + /** + * Occurs when mouse wheel event happens. callback = function(e, scrollDelta, scrollPoint); + */ + onScroll : function (callback) { + updateScrollEvents(callback); + return this; + }, + + release : function () { + // TODO: could be unsafe. We might wanna release dragObject, etc. + element.removeEventListener('mousedown', handleMouseDown); + element.removeEventListener('touchstart', handleTouchStart); + + documentEvents.off('mousemove', handleMouseMove); + documentEvents.off('mouseup', handleMouseUp); + documentEvents.off('touchmove', handleTouchMove); + documentEvents.off('touchend', handleTouchEnd); + documentEvents.off('touchcancel', handleTouchEnd); + + updateScrollEvents(null); + } + }; +} + +},{"../Utils/browserInfo.js":39,"../Utils/documentEvents.js":40,"../Utils/findElementPosition.js":41}],36:[function(require,module,exports){ +/** + * @author Andrei Kashcha (aka anvaka) / https://github.com/anvaka + */ + +module.exports = webglInputManager; + +var createInputEvents = require('../WebGL/webglInputEvents.js'); + +function webglInputManager(graph, graphics) { + var inputEvents = createInputEvents(graphics), + draggedNode = null, + internalHandlers = {}, + pos = {x : 0, y : 0}; + + inputEvents.mouseDown(function (node, e) { + draggedNode = node; + pos.x = e.clientX; + pos.y = e.clientY; + + inputEvents.mouseCapture(draggedNode); + + var handlers = internalHandlers[node.id]; + if (handlers && handlers.onStart) { + handlers.onStart(e, pos); + } + + return true; + }).mouseUp(function (node) { + inputEvents.releaseMouseCapture(draggedNode); + + draggedNode = null; + var handlers = internalHandlers[node.id]; + if (handlers && handlers.onStop) { + handlers.onStop(); + } + return true; + }).mouseMove(function (node, e) { + if (draggedNode) { + var handlers = internalHandlers[draggedNode.id]; + if (handlers && handlers.onDrag) { + handlers.onDrag(e, {x : e.clientX - pos.x, y : e.clientY - pos.y }); + } + + pos.x = e.clientX; + pos.y = e.clientY; + return true; + } + }); + + return { + /** + * Called by renderer to listen to drag-n-drop events from node. E.g. for SVG + * graphics we may listen to DOM events, whereas for WebGL we graphics + * should provide custom eventing mechanism. + * + * @param node - to be monitored. + * @param handlers - object with set of three callbacks: + * onStart: function(), + * onDrag: function(e, offset), + * onStop: function() + */ + bindDragNDrop : function (node, handlers) { + internalHandlers[node.id] = handlers; + if (!handlers) { + delete internalHandlers[node.id]; + } + } + }; +} + +},{"../WebGL/webglInputEvents.js":57}],37:[function(require,module,exports){ +module.exports = constant; + +var merge = require('ngraph.merge'); +var random = require('ngraph.random').random; +var Rect = require('../Utils/rect.js'); + +/** + * Does not really perform any layouting algorithm but is compliant + * with renderer interface. Allowing clients to provide specific positioning + * callback and get static layout of the graph + * + * @param {Viva.Graph.graph} graph to layout + * @param {Object} userSettings + */ +function constant(graph, userSettings) { + userSettings = merge(userSettings, { + maxX : 1024, + maxY : 1024, + seed : 'Deterministic randomness made me do this' + }); + // This class simply follows API, it does not use some of the arguments: + /*jshint unused: false */ + var rand = random(userSettings.seed), + graphRect = new Rect(Number.MAX_VALUE, Number.MAX_VALUE, Number.MIN_VALUE, Number.MIN_VALUE), + layoutLinks = {}, + + placeNodeCallback = function (node) { + return { + x: rand.next(userSettings.maxX), + y: rand.next(userSettings.maxY) + }; + }, + + updateGraphRect = function (position, graphRect) { + if (position.x < graphRect.x1) { graphRect.x1 = position.x; } + if (position.x > graphRect.x2) { graphRect.x2 = position.x; } + if (position.y < graphRect.y1) { graphRect.y1 = position.y; } + if (position.y > graphRect.y2) { graphRect.y2 = position.y; } + }, + + layoutNodes = typeof Object.create === 'function' ? Object.create(null) : {}, + + ensureNodeInitialized = function (node) { + layoutNodes[node.id] = placeNodeCallback(node); + updateGraphRect(layoutNodes[node.id], graphRect); + }, + + updateNodePositions = function () { + if (graph.getNodesCount() === 0) { return; } + + graphRect.x1 = Number.MAX_VALUE; + graphRect.y1 = Number.MAX_VALUE; + graphRect.x2 = Number.MIN_VALUE; + graphRect.y2 = Number.MIN_VALUE; + + graph.forEachNode(ensureNodeInitialized); + }, + + ensureLinkInitialized = function (link) { + layoutLinks[link.id] = link; + }, + + onGraphChanged = function(changes) { + for (var i = 0; i < changes.length; ++i) { + var change = changes[i]; + if (change.node) { + if (change.changeType === 'add') { + ensureNodeInitialized(change.node); + } else { + delete layoutNodes[change.node.id]; + } + } if (change.link) { + if (change.changeType === 'add') { + ensureLinkInitialized(change.link); + } else { + delete layoutLinks[change.link.id]; + } + } + } + }; + + graph.forEachNode(ensureNodeInitialized); + graph.forEachLink(ensureLinkInitialized); + graph.on('changed', onGraphChanged); + + return { + /** + * Attempts to layout graph within given number of iterations. + * + * @param {integer} [iterationsCount] number of algorithm's iterations. + * The constant layout ignores this parameter. + */ + run : function (iterationsCount) { + this.step(); + }, + + /** + * One step of layout algorithm. + */ + step : function () { + updateNodePositions(); + + return true; // no need to continue. + }, + + /** + * Returns rectangle structure {x1, y1, x2, y2}, which represents + * current space occupied by graph. + */ + getGraphRect : function () { + return graphRect; + }, + + /** + * Request to release all resources + */ + dispose : function () { + graph.off('change', onGraphChanged); + }, + + /* + * Checks whether given node is pinned; all nodes in this layout are pinned. + */ + isNodePinned: function (node) { + return true; + }, + + /* + * Requests layout algorithm to pin/unpin node to its current position + * Pinned nodes should not be affected by layout algorithm and always + * remain at their position + */ + pinNode: function (node, isPinned) { + // noop + }, + + /* + * Gets position of a node by its id. If node was not seen by this + * layout algorithm undefined value is returned; + */ + getNodePosition: getNodePosition, + + /** + * Returns {from, to} position of a link. + */ + getLinkPosition: function (linkId) { + var link = layoutLinks[linkId]; + return { + from : getNodePosition(link.fromId), + to : getNodePosition(link.toId) + }; + }, + + /** + * Sets position of a node to a given coordinates + */ + setNodePosition: function (nodeId, x, y) { + var pos = layoutNodes[nodeId]; + if (pos) { + pos.x = x; + pos.y = y; + } + }, + + // Layout specific methods: + + /** + * Based on argument either update default node placement callback or + * attempts to place given node using current placement callback. + * Setting new node callback triggers position update for all nodes. + * + * @param {Object} newPlaceNodeCallbackOrNode - if it is a function then + * default node placement callback is replaced with new one. Node placement + * callback has a form of function (node) {}, and is expected to return an + * object with x and y properties set to numbers. + * + * Otherwise if it's not a function the argument is treated as graph node + * and current node placement callback will be used to place it. + */ + placeNode : function (newPlaceNodeCallbackOrNode) { + if (typeof newPlaceNodeCallbackOrNode === 'function') { + placeNodeCallback = newPlaceNodeCallbackOrNode; + updateNodePositions(); + return this; + } + + // it is not a request to update placeNodeCallback, trying to place + // a node using current callback: + return placeNodeCallback(newPlaceNodeCallbackOrNode); + } + + }; + + function getNodePosition(nodeId) { + return layoutNodes[nodeId]; + } +} },{"../Utils/rect.js":45,"ngraph.merge":13,"ngraph.random":26}],38:[function(require,module,exports){ -/** - * This module provides compatibility layer with 0.6.x library. It will be - * removed in the next version - */ - -var events = require('ngraph.events'); - -module.exports = backwardCompatibleEvents; - -function backwardCompatibleEvents(g) { - console.log("This method is deprecated. Please use Viva.events() instead"); - - if (!g) { - return g; - } - - var eventsDefined = (g.on !== undefined) || - (g.off !== undefined) || - (g.fire !== undefined); - - if (eventsDefined) { - // events already defined, ignore - return { - extend: function() { - return g; - }, - on: g.on, - stop: g.off - }; - } - - return { - extend: extend, - on: g.on, - stop: g.off - }; - - function extend() { - var backwardCompatible = events(g); - backwardCompatible.addEventListener = backwardCompatible.on; - return backwardCompatible; - } -} +/** + * This module provides compatibility layer with 0.6.x library. It will be + * removed in the next version + */ + +var events = require('ngraph.events'); + +module.exports = backwardCompatibleEvents; + +function backwardCompatibleEvents(g) { + console.log("This method is deprecated. Please use Viva.events() instead"); + + if (!g) { + return g; + } + + var eventsDefined = (g.on !== undefined) || + (g.off !== undefined) || + (g.fire !== undefined); + + if (eventsDefined) { + // events already defined, ignore + return { + extend: function() { + return g; + }, + on: g.on, + stop: g.off + }; + } + + return { + extend: extend, + on: g.on, + stop: g.off + }; + + function extend() { + var backwardCompatible = events(g); + backwardCompatible.addEventListener = backwardCompatible.on; + return backwardCompatible; + } +} },{"ngraph.events":7}],39:[function(require,module,exports){ module.exports = browserInfo(); @@ -4001,52 +4001,52 @@ function browserInfo() { } },{}],40:[function(require,module,exports){ -var nullEvents = require('./nullEvents.js'); - -module.exports = createDocumentEvents(); - -function createDocumentEvents() { - if (typeof document === undefined) { - return nullEvents; - } - - return { - on: on, - off: off - }; -} - -function on(eventName, handler) { - document.addEventListener(eventName, handler); -} - -function off(eventName, handler) { - document.removeEventListener(eventName, handler); -} +var nullEvents = require('./nullEvents.js'); -},{"./nullEvents.js":44}],41:[function(require,module,exports){ -/** - * Finds the absolute position of an element on a page - */ -module.exports = findElementPosition; - -function findElementPosition(obj) { - var curleft = 0, - curtop = 0; - if (obj.offsetParent) { - do { - curleft += obj.offsetLeft; - curtop += obj.offsetTop; - } while ((obj = obj.offsetParent) !== null); - } - - return [curleft, curtop]; -} +module.exports = createDocumentEvents(); -},{}],42:[function(require,module,exports){ -module.exports = getDimension; - -function getDimension(container) { +function createDocumentEvents() { + if (typeof document === undefined) { + return nullEvents; + } + + return { + on: on, + off: off + }; +} + +function on(eventName, handler) { + document.addEventListener(eventName, handler); +} + +function off(eventName, handler) { + document.removeEventListener(eventName, handler); +} + +},{"./nullEvents.js":44}],41:[function(require,module,exports){ +/** + * Finds the absolute position of an element on a page + */ +module.exports = findElementPosition; + +function findElementPosition(obj) { + var curleft = 0, + curtop = 0; + if (obj.offsetParent) { + do { + curleft += obj.offsetLeft; + curtop += obj.offsetTop; + } while ((obj = obj.offsetParent) !== null); + } + + return [curleft, curtop]; +} + +},{}],42:[function(require,module,exports){ +module.exports = getDimension; + +function getDimension(container) { if (!container) { throw { message : 'Cannot get dimensions of undefined container' @@ -4066,42 +4066,42 @@ function getDimension(container) { } },{}],43:[function(require,module,exports){ -var intersect = require('gintersect'); - -module.exports = intersectRect; - -function intersectRect(left, top, right, bottom, x1, y1, x2, y2) { - return intersect(left, top, left, bottom, x1, y1, x2, y2) || - intersect(left, bottom, right, bottom, x1, y1, x2, y2) || - intersect(right, bottom, right, top, x1, y1, x2, y2) || - intersect(right, top, left, top, x1, y1, x2, y2); -} +var intersect = require('gintersect'); + +module.exports = intersectRect; + +function intersectRect(left, top, right, bottom, x1, y1, x2, y2) { + return intersect(left, top, left, bottom, x1, y1, x2, y2) || + intersect(left, bottom, right, bottom, x1, y1, x2, y2) || + intersect(right, bottom, right, top, x1, y1, x2, y2) || + intersect(right, top, left, top, x1, y1, x2, y2); +} },{"gintersect":3}],44:[function(require,module,exports){ -module.exports = createNullEvents(); - -function createNullEvents() { - return { - on: noop, - off: noop, - stop: noop - }; -} - -function noop() { } +module.exports = createNullEvents(); + +function createNullEvents() { + return { + on: noop, + off: noop, + stop: noop + }; +} + +function noop() { } },{}],45:[function(require,module,exports){ -module.exports = Rect; - -/** - * Very generic rectangle. - */ -function Rect (x1, y1, x2, y2) { - this.x1 = x1 || 0; - this.y1 = y1 || 0; - this.x2 = x2 || 0; - this.y2 = y2 || 0; -} +module.exports = Rect; + +/** + * Very generic rectangle. + */ +function Rect (x1, y1, x2, y2) { + this.x1 = x1 || 0; + this.y1 = y1 || 0; + this.x2 = x2 || 0; + this.y2 = y2 || 0; +} },{}],46:[function(require,module,exports){ (function (global){ @@ -4200,29 +4200,29 @@ function noop() {} }).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) },{}],47:[function(require,module,exports){ -var nullEvents = require('./nullEvents.js'); - -module.exports = createDocumentEvents(); - -function createDocumentEvents() { - if (typeof window === 'undefined') { - return nullEvents; - } - - return { - on: on, - off: off - }; -} - -function on(eventName, handler) { - window.addEventListener(eventName, handler); -} - -function off(eventName, handler) { - window.removeEventListener(eventName, handler); -} - +var nullEvents = require('./nullEvents.js'); + +module.exports = createDocumentEvents(); + +function createDocumentEvents() { + if (typeof window === 'undefined') { + return nullEvents; + } + + return { + on: on, + off: off + }; +} + +function on(eventName, handler) { + window.addEventListener(eventName, handler); +} + +function off(eventName, handler) { + window.removeEventListener(eventName, handler); +} + },{"./nullEvents.js":44}],48:[function(require,module,exports){ /** @@ -5652,1282 +5652,1282 @@ function webglGraphics(options) { } },{"../Input/webglInputManager.js":36,"../WebGL/webglLine.js":58,"../WebGL/webglLinkProgram.js":59,"../WebGL/webglNodeProgram.js":60,"../WebGL/webglSquare.js":61,"ngraph.events":7,"ngraph.merge":13}],51:[function(require,module,exports){ -module.exports = parseColor; - -function parseColor(color) { - var parsedColor = 0x009ee8ff; - - if (typeof color === 'string' && color) { - if (color.length === 4) { // #rgb - color = color.replace(/([^#])/g, '$1$1'); // duplicate each letter except first #. - } - if (color.length === 9) { // #rrggbbaa - parsedColor = parseInt(color.substr(1), 16); - } else if (color.length === 7) { // or #rrggbb. - parsedColor = (parseInt(color.substr(1), 16) << 8) | 0xff; - } else { - throw 'Color expected in hex format with preceding "#". E.g. #00ff00. Got value: ' + color; - } - } else if (typeof color === 'number') { - parsedColor = color; - } - - return parsedColor; -} +module.exports = parseColor; + +function parseColor(color) { + var parsedColor = 0x009ee8ff; + + if (typeof color === 'string' && color) { + if (color.length === 4) { // #rgb + color = color.replace(/([^#])/g, '$1$1'); // duplicate each letter except first #. + } + if (color.length === 9) { // #rrggbbaa + parsedColor = parseInt(color.substr(1), 16); + } else if (color.length === 7) { // or #rrggbb. + parsedColor = (parseInt(color.substr(1), 16) << 8) | 0xff; + } else { + throw 'Color expected in hex format with preceding "#". E.g. #00ff00. Got value: ' + color; + } + } else if (typeof color === 'number') { + parsedColor = color; + } + + return parsedColor; +} },{}],52:[function(require,module,exports){ -module.exports = Texture; - -/** - * Single texture in the webglAtlas. - */ -function Texture(size) { - this.canvas = window.document.createElement("canvas"); - this.ctx = this.canvas.getContext("2d"); - this.isDirty = false; - this.canvas.width = this.canvas.height = size; -} +module.exports = Texture; + +/** + * Single texture in the webglAtlas. + */ +function Texture(size) { + this.canvas = window.document.createElement("canvas"); + this.ctx = this.canvas.getContext("2d"); + this.isDirty = false; + this.canvas.width = this.canvas.height = size; +} },{}],53:[function(require,module,exports){ -/** - * @fileOverview Utility functions for webgl rendering. - * - * @author Andrei Kashcha (aka anvaka) / http://anvaka.blogspot.com - */ - -module.exports = webgl; - -function webgl(gl) { - - return { - createProgram: createProgram, - extendArray: extendArray, - copyArrayPart: copyArrayPart, - swapArrayPart: swapArrayPart, - getLocations: getLocations, - context: gl - }; - - function createShader(shaderText, type) { - var shader = gl.createShader(type); - gl.shaderSource(shader, shaderText); - gl.compileShader(shader); - - if (!gl.getShaderParameter(shader, gl.COMPILE_STATUS)) { - var msg = gl.getShaderInfoLog(shader); - window.alert(msg); - throw msg; - } - - return shader; - } - - function createProgram(vertexShaderSrc, fragmentShaderSrc) { - var program = gl.createProgram(); - var vs = createShader(vertexShaderSrc, gl.VERTEX_SHADER); - var fs = createShader(fragmentShaderSrc, gl.FRAGMENT_SHADER); - - gl.attachShader(program, vs); - gl.attachShader(program, fs); - gl.linkProgram(program); - - if (!gl.getProgramParameter(program, gl.LINK_STATUS)) { - var msg = gl.getShaderInfoLog(program); - window.alert(msg); - throw msg; - } - - return program; - } - - function extendArray(buffer, itemsInBuffer, elementsPerItem) { - if ((itemsInBuffer + 1) * elementsPerItem > buffer.length) { - // Every time we run out of space create new array twice bigger. - // TODO: it seems buffer size is limited. Consider using multiple arrays for huge graphs - var extendedArray = new Float32Array(buffer.length * elementsPerItem * 2); - extendedArray.set(buffer); - - return extendedArray; - } - - return buffer; - } - - function getLocations(program, uniformOrAttributeNames) { - var foundLocations = {}; - for (var i = 0; i < uniformOrAttributeNames.length; ++i) { - var name = uniformOrAttributeNames[i]; - var location = -1; - if (name[0] === 'a' && name[1] === '_') { - location = gl.getAttribLocation(program, name); - if (location === -1) { - throw new Error("Program doesn't have required attribute: " + name); - } - - foundLocations[name.slice(2)] = location; - } else if (name[0] === 'u' && name[1] === '_') { - location = gl.getUniformLocation(program, name); - if (location === null) { - throw new Error("Program doesn't have required uniform: " + name); - } - - foundLocations[name.slice(2)] = location; - } else { - throw new Error("Couldn't figure out your intent. All uniforms should start with 'u_' prefix, and attributes with 'a_'"); - } - } - - return foundLocations; - } -} - -function copyArrayPart(array, to, from, elementsCount) { - for (var i = 0; i < elementsCount; ++i) { - array[to + i] = array[from + i]; - } -} - -function swapArrayPart(array, from, to, elementsCount) { - for (var i = 0; i < elementsCount; ++i) { - var tmp = array[from + i]; - array[from + i] = array[to + i]; - array[to + i] = tmp; - } -} +/** + * @fileOverview Utility functions for webgl rendering. + * + * @author Andrei Kashcha (aka anvaka) / http://anvaka.blogspot.com + */ -},{}],54:[function(require,module,exports){ -var Texture = require('./texture.js'); - -module.exports = webglAtlas; - -/** - * My naive implementation of textures atlas. It allows clients to load - * multiple images into atlas and get canvas representing all of them. - * - * @param tilesPerTexture - indicates how many images can be loaded to one - * texture of the atlas. If number of loaded images exceeds this - * parameter a new canvas will be created. - */ -function webglAtlas(tilesPerTexture) { - var tilesPerRow = Math.sqrt(tilesPerTexture || 1024) << 0, - tileSize = tilesPerRow, - lastLoadedIdx = 1, - loadedImages = {}, - dirtyTimeoutId, - skipedDirty = 0, - textures = [], - trackedUrls = []; - - if (!isPowerOf2(tilesPerTexture)) { - throw "Tiles per texture should be power of two."; - } - - // this is the return object - var api = { - /** - * indicates whether atlas has changed texture in it. If true then - * some of the textures has isDirty flag set as well. - */ - isDirty: false, - - /** - * Clears any signs of atlas changes. - */ - clearDirty: clearDirty, - - /** - * Removes given url from collection of tiles in the atlas. - */ - remove: remove, - - /** - * Gets all textures in the atlas. - */ - getTextures: getTextures, - - /** - * Gets coordinates of the given image in the atlas. Coordinates is an object: - * {offset : int } - where offset is an absolute position of the image in the - * atlas. - * - * Absolute means it can be larger than tilesPerTexture parameter, and in that - * case clients should get next texture in getTextures() collection. - */ - getCoordinates: getCoordinates, - - /** - * Asynchronously Loads the image to the atlas. Cross-domain security - * limitation applies. - */ - load: load - }; - - return api; - - function clearDirty() { - var i; - api.isDirty = false; - for (i = 0; i < textures.length; ++i) { - textures[i].isDirty = false; - } - } - - function remove(imgUrl) { - var coordinates = loadedImages[imgUrl]; - if (!coordinates) { - return false; - } - delete loadedImages[imgUrl]; - lastLoadedIdx -= 1; - - - if (lastLoadedIdx === coordinates.offset) { - return true; // Ignore if it's last image in the whole set. - } - - var tileToRemove = getTileCoordinates(coordinates.offset), - lastTileInSet = getTileCoordinates(lastLoadedIdx); - - copy(lastTileInSet, tileToRemove); - - var replacedOffset = loadedImages[trackedUrls[lastLoadedIdx]]; - replacedOffset.offset = coordinates.offset; - trackedUrls[coordinates.offset] = trackedUrls[lastLoadedIdx]; - - markDirty(); - return true; - } - - function getTextures() { - return textures; // I trust you... - } - - function getCoordinates(imgUrl) { - return loadedImages[imgUrl]; - } - - function load(imgUrl, callback) { - if (loadedImages.hasOwnProperty(imgUrl)) { - callback(loadedImages[imgUrl]); - } else { - var img = new window.Image(), - imgId = lastLoadedIdx; - - lastLoadedIdx += 1; - img.crossOrigin = "anonymous"; - img.onload = function() { - markDirty(); - drawAt(imgId, img, callback); - }; - - img.src = imgUrl; - } - } - - function createTexture() { - var texture = new Texture(tilesPerRow * tileSize); - textures.push(texture); - } - - function drawAt(tileNumber, img, callback) { - var tilePosition = getTileCoordinates(tileNumber), - coordinates = { - offset: tileNumber - }; - - if (tilePosition.textureNumber >= textures.length) { - createTexture(); - } - var currentTexture = textures[tilePosition.textureNumber]; - - currentTexture.ctx.drawImage(img, tilePosition.col * tileSize, tilePosition.row * tileSize, tileSize, tileSize); - trackedUrls[tileNumber] = img.src; - - loadedImages[img.src] = coordinates; - currentTexture.isDirty = true; - - callback(coordinates); - } - - function getTileCoordinates(absolutePosition) { - var textureNumber = (absolutePosition / tilesPerTexture) << 0, - localTileNumber = (absolutePosition % tilesPerTexture), - row = (localTileNumber / tilesPerRow) << 0, - col = (localTileNumber % tilesPerRow); - - return { - textureNumber: textureNumber, - row: row, - col: col - }; - } - - function markDirtyNow() { - api.isDirty = true; - skipedDirty = 0; - dirtyTimeoutId = null; - } - - function markDirty() { - // delay this call, since it results in texture reload - if (dirtyTimeoutId) { - window.clearTimeout(dirtyTimeoutId); - skipedDirty += 1; - dirtyTimeoutId = null; - } - - if (skipedDirty > 10) { - markDirtyNow(); - } else { - dirtyTimeoutId = window.setTimeout(markDirtyNow, 400); - } - } - - function copy(from, to) { - var fromCanvas = textures[from.textureNumber].canvas, - toCtx = textures[to.textureNumber].ctx, - x = to.col * tileSize, - y = to.row * tileSize; - - toCtx.drawImage(fromCanvas, from.col * tileSize, from.row * tileSize, tileSize, tileSize, x, y, tileSize, tileSize); - textures[from.textureNumber].isDirty = true; - textures[to.textureNumber].isDirty = true; - } -} - -function isPowerOf2(n) { - return (n & (n - 1)) === 0; -} +module.exports = webgl; -},{"./texture.js":52}],55:[function(require,module,exports){ -module.exports = webglImage; - -/** - * Represents a model for image. - */ -function webglImage(size, src) { - return { - /** - * Gets texture index where current image is placed. - */ - _texture : 0, - - /** - * Gets offset in the texture where current image is placed. - */ - _offset : 0, - - /** - * Gets size of the square with the image. - */ - size : typeof size === 'number' ? size : 32, - - /** - * Source of the image. If image is coming not from your domain - * certain origin restrictions applies. - * See http://www.khronos.org/registry/webgl/specs/latest/#4.2 for more details. - */ - src : src - }; -} +function webgl(gl) { -},{}],56:[function(require,module,exports){ -/** - * @fileOverview Defines an image nodes for webglGraphics class. - * Shape of nodes is square. - * - * @author Andrei Kashcha (aka anvaka) / http://anvaka.blogspot.com - */ - -var WebglAtlas = require('./webglAtlas.js'); -var glUtils = require('./webgl.js'); - -module.exports = webglImageNodeProgram; - -/** - * Defines simple UI for nodes in webgl renderer. Each node is rendered as an image. - */ -function webglImageNodeProgram() { - // WebGL is gian state machine, we store some properties of the state here: - var ATTRIBUTES_PER_PRIMITIVE = 18; - var nodesFS = createNodeFragmentShader(); - var nodesVS = createNodeVertexShader(); - var tilesPerTexture = 1024; // TODO: Get based on max texture size - var atlas; - var program; - var gl; - var buffer; - var utils; - var locations; - var nodesCount = 0; - var nodes = new Float32Array(64); - var width; - var height; - var transform; - var sizeDirty; - - - return { - load: load, - - /** - * Updates position of current node in the buffer of nodes. - * - * @param idx - index of current node. - * @param pos - new position of the node. - */ - position: position, - - createNode: createNode, - - removeNode: removeNode, - - replaceProperties: replaceProperties, - - updateTransform: updateTransform, - - updateSize: updateSize, - - render: render - }; - - function refreshTexture(texture, idx) { - if (texture.nativeObject) { - gl.deleteTexture(texture.nativeObject); - } - - var nativeObject = gl.createTexture(); - gl.activeTexture(gl["TEXTURE" + idx]); - gl.bindTexture(gl.TEXTURE_2D, nativeObject); - gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, texture.canvas); - gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); - gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR_MIPMAP_NEAREST); - - gl.generateMipmap(gl.TEXTURE_2D); - gl.uniform1i(locations["sampler" + idx], idx); - - texture.nativeObject = nativeObject; - } - - function ensureAtlasTextureUpdated() { - if (atlas.isDirty) { - var textures = atlas.getTextures(), - i; - for (i = 0; i < textures.length; ++i) { - if (textures[i].isDirty || !textures[i].nativeObject) { - refreshTexture(textures[i], i); - } - } - - atlas.clearDirty(); - } - } - - function load(glContext) { - gl = glContext; - utils = glUtils(glContext); - - atlas = new WebglAtlas(tilesPerTexture); - - program = utils.createProgram(nodesVS, nodesFS); - gl.useProgram(program); - locations = utils.getLocations(program, ["a_vertexPos", "a_customAttributes", "u_screenSize", "u_transform", "u_sampler0", "u_sampler1", "u_sampler2", "u_sampler3", "u_tilesPerTexture"]); - - gl.uniform1f(locations.tilesPerTexture, tilesPerTexture); - - gl.enableVertexAttribArray(locations.vertexPos); - gl.enableVertexAttribArray(locations.customAttributes); - - buffer = gl.createBuffer(); - } - - function position(nodeUI, pos) { - var idx = nodeUI.id * ATTRIBUTES_PER_PRIMITIVE; - nodes[idx] = pos.x - nodeUI.size; - nodes[idx + 1] = pos.y - nodeUI.size; - nodes[idx + 2] = nodeUI._offset * 4; - - nodes[idx + 3] = pos.x + nodeUI.size; - nodes[idx + 4] = pos.y - nodeUI.size; - nodes[idx + 5] = nodeUI._offset * 4 + 1; - - nodes[idx + 6] = pos.x - nodeUI.size; - nodes[idx + 7] = pos.y + nodeUI.size; - nodes[idx + 8] = nodeUI._offset * 4 + 2; - - nodes[idx + 9] = pos.x - nodeUI.size; - nodes[idx + 10] = pos.y + nodeUI.size; - nodes[idx + 11] = nodeUI._offset * 4 + 2; - - nodes[idx + 12] = pos.x + nodeUI.size; - nodes[idx + 13] = pos.y - nodeUI.size; - nodes[idx + 14] = nodeUI._offset * 4 + 1; - - nodes[idx + 15] = pos.x + nodeUI.size; - nodes[idx + 16] = pos.y + nodeUI.size; - nodes[idx + 17] = nodeUI._offset * 4 + 3; - } - - function createNode(ui) { - nodes = utils.extendArray(nodes, nodesCount, ATTRIBUTES_PER_PRIMITIVE); - nodesCount += 1; - - var coordinates = atlas.getCoordinates(ui.src); - if (coordinates) { - ui._offset = coordinates.offset; - } else { - ui._offset = 0; - // Image is not yet loaded into the atlas. Reload it: - atlas.load(ui.src, function(coordinates) { - ui._offset = coordinates.offset; - }); - } - } - - function removeNode(nodeUI) { - if (nodesCount > 0) { - nodesCount -= 1; - } - - if (nodeUI.id < nodesCount && nodesCount > 0) { - if (nodeUI.src) { - atlas.remove(nodeUI.src); - } - - utils.copyArrayPart(nodes, nodeUI.id * ATTRIBUTES_PER_PRIMITIVE, nodesCount * ATTRIBUTES_PER_PRIMITIVE, ATTRIBUTES_PER_PRIMITIVE); - } - } - - function replaceProperties(replacedNode, newNode) { - newNode._offset = replacedNode._offset; - } - - function updateTransform(newTransform) { - sizeDirty = true; - transform = newTransform; - } - - function updateSize(w, h) { - width = w; - height = h; - sizeDirty = true; - } - - function render() { - gl.useProgram(program); - gl.bindBuffer(gl.ARRAY_BUFFER, buffer); - gl.bufferData(gl.ARRAY_BUFFER, nodes, gl.DYNAMIC_DRAW); - - if (sizeDirty) { - sizeDirty = false; - gl.uniformMatrix4fv(locations.transform, false, transform); - gl.uniform2f(locations.screenSize, width, height); - } - - gl.vertexAttribPointer(locations.vertexPos, 2, gl.FLOAT, false, 3 * Float32Array.BYTES_PER_ELEMENT, 0); - gl.vertexAttribPointer(locations.customAttributes, 1, gl.FLOAT, false, 3 * Float32Array.BYTES_PER_ELEMENT, 2 * 4); - - ensureAtlasTextureUpdated(); - - gl.drawArrays(gl.TRIANGLES, 0, nodesCount * 6); - } -} - -// TODO: Use glslify for shaders -function createNodeFragmentShader() { - return [ - "precision mediump float;", - "varying vec4 color;", - "varying vec3 vTextureCoord;", - "uniform sampler2D u_sampler0;", - "uniform sampler2D u_sampler1;", - "uniform sampler2D u_sampler2;", - "uniform sampler2D u_sampler3;", - - "void main(void) {", - " if (vTextureCoord.z == 0.) {", - " gl_FragColor = texture2D(u_sampler0, vTextureCoord.xy);", - " } else if (vTextureCoord.z == 1.) {", - " gl_FragColor = texture2D(u_sampler1, vTextureCoord.xy);", - " } else if (vTextureCoord.z == 2.) {", - " gl_FragColor = texture2D(u_sampler2, vTextureCoord.xy);", - " } else if (vTextureCoord.z == 3.) {", - " gl_FragColor = texture2D(u_sampler3, vTextureCoord.xy);", - " } else { gl_FragColor = vec4(0, 1, 0, 1); }", - "}" - ].join("\n"); -} - -function createNodeVertexShader() { - return [ - "attribute vec2 a_vertexPos;", - - "attribute float a_customAttributes;", - "uniform vec2 u_screenSize;", - "uniform mat4 u_transform;", - "uniform float u_tilesPerTexture;", - "varying vec3 vTextureCoord;", - - "void main(void) {", - " gl_Position = u_transform * vec4(a_vertexPos/u_screenSize, 0, 1);", - "float corner = mod(a_customAttributes, 4.);", - "float tileIndex = mod(floor(a_customAttributes / 4.), u_tilesPerTexture);", - "float tilesPerRow = sqrt(u_tilesPerTexture);", - "float tileSize = 1./tilesPerRow;", - "float tileColumn = mod(tileIndex, tilesPerRow);", - "float tileRow = floor(tileIndex/tilesPerRow);", - - "if(corner == 0.0) {", - " vTextureCoord.xy = vec2(0, 1);", - "} else if(corner == 1.0) {", - " vTextureCoord.xy = vec2(1, 1);", - "} else if(corner == 2.0) {", - " vTextureCoord.xy = vec2(0, 0);", - "} else {", - " vTextureCoord.xy = vec2(1, 0);", - "}", - - "vTextureCoord *= tileSize;", - "vTextureCoord.x += tileColumn * tileSize;", - "vTextureCoord.y += tileRow * tileSize;", - "vTextureCoord.z = floor(floor(a_customAttributes / 4.)/u_tilesPerTexture);", - "}" - ].join("\n"); -} + return { + createProgram: createProgram, + extendArray: extendArray, + copyArrayPart: copyArrayPart, + swapArrayPart: swapArrayPart, + getLocations: getLocations, + context: gl + }; + + function createShader(shaderText, type) { + var shader = gl.createShader(type); + gl.shaderSource(shader, shaderText); + gl.compileShader(shader); + + if (!gl.getShaderParameter(shader, gl.COMPILE_STATUS)) { + var msg = gl.getShaderInfoLog(shader); + window.alert(msg); + throw msg; + } + + return shader; + } + + function createProgram(vertexShaderSrc, fragmentShaderSrc) { + var program = gl.createProgram(); + var vs = createShader(vertexShaderSrc, gl.VERTEX_SHADER); + var fs = createShader(fragmentShaderSrc, gl.FRAGMENT_SHADER); + + gl.attachShader(program, vs); + gl.attachShader(program, fs); + gl.linkProgram(program); + + if (!gl.getProgramParameter(program, gl.LINK_STATUS)) { + var msg = gl.getShaderInfoLog(program); + window.alert(msg); + throw msg; + } + + return program; + } + + function extendArray(buffer, itemsInBuffer, elementsPerItem) { + if ((itemsInBuffer + 1) * elementsPerItem > buffer.length) { + // Every time we run out of space create new array twice bigger. + // TODO: it seems buffer size is limited. Consider using multiple arrays for huge graphs + var extendedArray = new Float32Array(buffer.length * elementsPerItem * 2); + extendedArray.set(buffer); + + return extendedArray; + } + + return buffer; + } + + function getLocations(program, uniformOrAttributeNames) { + var foundLocations = {}; + for (var i = 0; i < uniformOrAttributeNames.length; ++i) { + var name = uniformOrAttributeNames[i]; + var location = -1; + if (name[0] === 'a' && name[1] === '_') { + location = gl.getAttribLocation(program, name); + if (location === -1) { + throw new Error("Program doesn't have required attribute: " + name); + } + + foundLocations[name.slice(2)] = location; + } else if (name[0] === 'u' && name[1] === '_') { + location = gl.getUniformLocation(program, name); + if (location === null) { + throw new Error("Program doesn't have required uniform: " + name); + } + + foundLocations[name.slice(2)] = location; + } else { + throw new Error("Couldn't figure out your intent. All uniforms should start with 'u_' prefix, and attributes with 'a_'"); + } + } + + return foundLocations; + } +} + +function copyArrayPart(array, to, from, elementsCount) { + for (var i = 0; i < elementsCount; ++i) { + array[to + i] = array[from + i]; + } +} + +function swapArrayPart(array, from, to, elementsCount) { + for (var i = 0; i < elementsCount; ++i) { + var tmp = array[from + i]; + array[from + i] = array[to + i]; + array[to + i] = tmp; + } +} + +},{}],54:[function(require,module,exports){ +var Texture = require('./texture.js'); + +module.exports = webglAtlas; + +/** + * My naive implementation of textures atlas. It allows clients to load + * multiple images into atlas and get canvas representing all of them. + * + * @param tilesPerTexture - indicates how many images can be loaded to one + * texture of the atlas. If number of loaded images exceeds this + * parameter a new canvas will be created. + */ +function webglAtlas(tilesPerTexture) { + var tilesPerRow = Math.sqrt(tilesPerTexture || 1024) << 0, + tileSize = tilesPerRow, + lastLoadedIdx = 1, + loadedImages = {}, + dirtyTimeoutId, + skipedDirty = 0, + textures = [], + trackedUrls = []; + + if (!isPowerOf2(tilesPerTexture)) { + throw "Tiles per texture should be power of two."; + } + + // this is the return object + var api = { + /** + * indicates whether atlas has changed texture in it. If true then + * some of the textures has isDirty flag set as well. + */ + isDirty: false, + + /** + * Clears any signs of atlas changes. + */ + clearDirty: clearDirty, + + /** + * Removes given url from collection of tiles in the atlas. + */ + remove: remove, + + /** + * Gets all textures in the atlas. + */ + getTextures: getTextures, + + /** + * Gets coordinates of the given image in the atlas. Coordinates is an object: + * {offset : int } - where offset is an absolute position of the image in the + * atlas. + * + * Absolute means it can be larger than tilesPerTexture parameter, and in that + * case clients should get next texture in getTextures() collection. + */ + getCoordinates: getCoordinates, + + /** + * Asynchronously Loads the image to the atlas. Cross-domain security + * limitation applies. + */ + load: load + }; + + return api; + + function clearDirty() { + var i; + api.isDirty = false; + for (i = 0; i < textures.length; ++i) { + textures[i].isDirty = false; + } + } + + function remove(imgUrl) { + var coordinates = loadedImages[imgUrl]; + if (!coordinates) { + return false; + } + delete loadedImages[imgUrl]; + lastLoadedIdx -= 1; + + + if (lastLoadedIdx === coordinates.offset) { + return true; // Ignore if it's last image in the whole set. + } + + var tileToRemove = getTileCoordinates(coordinates.offset), + lastTileInSet = getTileCoordinates(lastLoadedIdx); + + copy(lastTileInSet, tileToRemove); + + var replacedOffset = loadedImages[trackedUrls[lastLoadedIdx]]; + replacedOffset.offset = coordinates.offset; + trackedUrls[coordinates.offset] = trackedUrls[lastLoadedIdx]; + + markDirty(); + return true; + } + + function getTextures() { + return textures; // I trust you... + } + + function getCoordinates(imgUrl) { + return loadedImages[imgUrl]; + } + + function load(imgUrl, callback) { + if (loadedImages.hasOwnProperty(imgUrl)) { + callback(loadedImages[imgUrl]); + } else { + var img = new window.Image(), + imgId = lastLoadedIdx; + + lastLoadedIdx += 1; + img.crossOrigin = "anonymous"; + img.onload = function() { + markDirty(); + drawAt(imgId, img, callback); + }; + + img.src = imgUrl; + } + } + + function createTexture() { + var texture = new Texture(tilesPerRow * tileSize); + textures.push(texture); + } + + function drawAt(tileNumber, img, callback) { + var tilePosition = getTileCoordinates(tileNumber), + coordinates = { + offset: tileNumber + }; + + if (tilePosition.textureNumber >= textures.length) { + createTexture(); + } + var currentTexture = textures[tilePosition.textureNumber]; + + currentTexture.ctx.drawImage(img, tilePosition.col * tileSize, tilePosition.row * tileSize, tileSize, tileSize); + trackedUrls[tileNumber] = img.src; + + loadedImages[img.src] = coordinates; + currentTexture.isDirty = true; + + callback(coordinates); + } + + function getTileCoordinates(absolutePosition) { + var textureNumber = (absolutePosition / tilesPerTexture) << 0, + localTileNumber = (absolutePosition % tilesPerTexture), + row = (localTileNumber / tilesPerRow) << 0, + col = (localTileNumber % tilesPerRow); + + return { + textureNumber: textureNumber, + row: row, + col: col + }; + } + + function markDirtyNow() { + api.isDirty = true; + skipedDirty = 0; + dirtyTimeoutId = null; + } + + function markDirty() { + // delay this call, since it results in texture reload + if (dirtyTimeoutId) { + window.clearTimeout(dirtyTimeoutId); + skipedDirty += 1; + dirtyTimeoutId = null; + } + + if (skipedDirty > 10) { + markDirtyNow(); + } else { + dirtyTimeoutId = window.setTimeout(markDirtyNow, 400); + } + } + + function copy(from, to) { + var fromCanvas = textures[from.textureNumber].canvas, + toCtx = textures[to.textureNumber].ctx, + x = to.col * tileSize, + y = to.row * tileSize; + + toCtx.drawImage(fromCanvas, from.col * tileSize, from.row * tileSize, tileSize, tileSize, x, y, tileSize, tileSize); + textures[from.textureNumber].isDirty = true; + textures[to.textureNumber].isDirty = true; + } +} + +function isPowerOf2(n) { + return (n & (n - 1)) === 0; +} + +},{"./texture.js":52}],55:[function(require,module,exports){ +module.exports = webglImage; + +/** + * Represents a model for image. + */ +function webglImage(size, src) { + return { + /** + * Gets texture index where current image is placed. + */ + _texture : 0, + + /** + * Gets offset in the texture where current image is placed. + */ + _offset : 0, + + /** + * Gets size of the square with the image. + */ + size : typeof size === 'number' ? size : 32, + + /** + * Source of the image. If image is coming not from your domain + * certain origin restrictions applies. + * See http://www.khronos.org/registry/webgl/specs/latest/#4.2 for more details. + */ + src : src + }; +} + +},{}],56:[function(require,module,exports){ +/** + * @fileOverview Defines an image nodes for webglGraphics class. + * Shape of nodes is square. + * + * @author Andrei Kashcha (aka anvaka) / http://anvaka.blogspot.com + */ + +var WebglAtlas = require('./webglAtlas.js'); +var glUtils = require('./webgl.js'); + +module.exports = webglImageNodeProgram; + +/** + * Defines simple UI for nodes in webgl renderer. Each node is rendered as an image. + */ +function webglImageNodeProgram() { + // WebGL is gian state machine, we store some properties of the state here: + var ATTRIBUTES_PER_PRIMITIVE = 18; + var nodesFS = createNodeFragmentShader(); + var nodesVS = createNodeVertexShader(); + var tilesPerTexture = 1024; // TODO: Get based on max texture size + var atlas; + var program; + var gl; + var buffer; + var utils; + var locations; + var nodesCount = 0; + var nodes = new Float32Array(64); + var width; + var height; + var transform; + var sizeDirty; + + + return { + load: load, + + /** + * Updates position of current node in the buffer of nodes. + * + * @param idx - index of current node. + * @param pos - new position of the node. + */ + position: position, + + createNode: createNode, + + removeNode: removeNode, + + replaceProperties: replaceProperties, + + updateTransform: updateTransform, + + updateSize: updateSize, + + render: render + }; + + function refreshTexture(texture, idx) { + if (texture.nativeObject) { + gl.deleteTexture(texture.nativeObject); + } + + var nativeObject = gl.createTexture(); + gl.activeTexture(gl["TEXTURE" + idx]); + gl.bindTexture(gl.TEXTURE_2D, nativeObject); + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, texture.canvas); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR_MIPMAP_NEAREST); + + gl.generateMipmap(gl.TEXTURE_2D); + gl.uniform1i(locations["sampler" + idx], idx); + + texture.nativeObject = nativeObject; + } + + function ensureAtlasTextureUpdated() { + if (atlas.isDirty) { + var textures = atlas.getTextures(), + i; + for (i = 0; i < textures.length; ++i) { + if (textures[i].isDirty || !textures[i].nativeObject) { + refreshTexture(textures[i], i); + } + } + + atlas.clearDirty(); + } + } + + function load(glContext) { + gl = glContext; + utils = glUtils(glContext); + + atlas = new WebglAtlas(tilesPerTexture); + + program = utils.createProgram(nodesVS, nodesFS); + gl.useProgram(program); + locations = utils.getLocations(program, ["a_vertexPos", "a_customAttributes", "u_screenSize", "u_transform", "u_sampler0", "u_sampler1", "u_sampler2", "u_sampler3", "u_tilesPerTexture"]); + + gl.uniform1f(locations.tilesPerTexture, tilesPerTexture); + + gl.enableVertexAttribArray(locations.vertexPos); + gl.enableVertexAttribArray(locations.customAttributes); + + buffer = gl.createBuffer(); + } + + function position(nodeUI, pos) { + var idx = nodeUI.id * ATTRIBUTES_PER_PRIMITIVE; + nodes[idx] = pos.x - nodeUI.size; + nodes[idx + 1] = pos.y - nodeUI.size; + nodes[idx + 2] = nodeUI._offset * 4; + + nodes[idx + 3] = pos.x + nodeUI.size; + nodes[idx + 4] = pos.y - nodeUI.size; + nodes[idx + 5] = nodeUI._offset * 4 + 1; + + nodes[idx + 6] = pos.x - nodeUI.size; + nodes[idx + 7] = pos.y + nodeUI.size; + nodes[idx + 8] = nodeUI._offset * 4 + 2; + + nodes[idx + 9] = pos.x - nodeUI.size; + nodes[idx + 10] = pos.y + nodeUI.size; + nodes[idx + 11] = nodeUI._offset * 4 + 2; + + nodes[idx + 12] = pos.x + nodeUI.size; + nodes[idx + 13] = pos.y - nodeUI.size; + nodes[idx + 14] = nodeUI._offset * 4 + 1; + + nodes[idx + 15] = pos.x + nodeUI.size; + nodes[idx + 16] = pos.y + nodeUI.size; + nodes[idx + 17] = nodeUI._offset * 4 + 3; + } + + function createNode(ui) { + nodes = utils.extendArray(nodes, nodesCount, ATTRIBUTES_PER_PRIMITIVE); + nodesCount += 1; + + var coordinates = atlas.getCoordinates(ui.src); + if (coordinates) { + ui._offset = coordinates.offset; + } else { + ui._offset = 0; + // Image is not yet loaded into the atlas. Reload it: + atlas.load(ui.src, function(coordinates) { + ui._offset = coordinates.offset; + }); + } + } + + function removeNode(nodeUI) { + if (nodesCount > 0) { + nodesCount -= 1; + } + + if (nodeUI.id < nodesCount && nodesCount > 0) { + if (nodeUI.src) { + atlas.remove(nodeUI.src); + } + + utils.copyArrayPart(nodes, nodeUI.id * ATTRIBUTES_PER_PRIMITIVE, nodesCount * ATTRIBUTES_PER_PRIMITIVE, ATTRIBUTES_PER_PRIMITIVE); + } + } + + function replaceProperties(replacedNode, newNode) { + newNode._offset = replacedNode._offset; + } + + function updateTransform(newTransform) { + sizeDirty = true; + transform = newTransform; + } + + function updateSize(w, h) { + width = w; + height = h; + sizeDirty = true; + } + + function render() { + gl.useProgram(program); + gl.bindBuffer(gl.ARRAY_BUFFER, buffer); + gl.bufferData(gl.ARRAY_BUFFER, nodes, gl.DYNAMIC_DRAW); + + if (sizeDirty) { + sizeDirty = false; + gl.uniformMatrix4fv(locations.transform, false, transform); + gl.uniform2f(locations.screenSize, width, height); + } + + gl.vertexAttribPointer(locations.vertexPos, 2, gl.FLOAT, false, 3 * Float32Array.BYTES_PER_ELEMENT, 0); + gl.vertexAttribPointer(locations.customAttributes, 1, gl.FLOAT, false, 3 * Float32Array.BYTES_PER_ELEMENT, 2 * 4); + + ensureAtlasTextureUpdated(); + + gl.drawArrays(gl.TRIANGLES, 0, nodesCount * 6); + } +} + +// TODO: Use glslify for shaders +function createNodeFragmentShader() { + return [ + "precision mediump float;", + "varying vec4 color;", + "varying vec3 vTextureCoord;", + "uniform sampler2D u_sampler0;", + "uniform sampler2D u_sampler1;", + "uniform sampler2D u_sampler2;", + "uniform sampler2D u_sampler3;", + + "void main(void) {", + " if (vTextureCoord.z == 0.) {", + " gl_FragColor = texture2D(u_sampler0, vTextureCoord.xy);", + " } else if (vTextureCoord.z == 1.) {", + " gl_FragColor = texture2D(u_sampler1, vTextureCoord.xy);", + " } else if (vTextureCoord.z == 2.) {", + " gl_FragColor = texture2D(u_sampler2, vTextureCoord.xy);", + " } else if (vTextureCoord.z == 3.) {", + " gl_FragColor = texture2D(u_sampler3, vTextureCoord.xy);", + " } else { gl_FragColor = vec4(0, 1, 0, 1); }", + "}" + ].join("\n"); +} + +function createNodeVertexShader() { + return [ + "attribute vec2 a_vertexPos;", + + "attribute float a_customAttributes;", + "uniform vec2 u_screenSize;", + "uniform mat4 u_transform;", + "uniform float u_tilesPerTexture;", + "varying vec3 vTextureCoord;", + + "void main(void) {", + " gl_Position = u_transform * vec4(a_vertexPos/u_screenSize, 0, 1);", + "float corner = mod(a_customAttributes, 4.);", + "float tileIndex = mod(floor(a_customAttributes / 4.), u_tilesPerTexture);", + "float tilesPerRow = sqrt(u_tilesPerTexture);", + "float tileSize = 1./tilesPerRow;", + "float tileColumn = mod(tileIndex, tilesPerRow);", + "float tileRow = floor(tileIndex/tilesPerRow);", + + "if(corner == 0.0) {", + " vTextureCoord.xy = vec2(0, 1);", + "} else if(corner == 1.0) {", + " vTextureCoord.xy = vec2(1, 1);", + "} else if(corner == 2.0) {", + " vTextureCoord.xy = vec2(0, 0);", + "} else {", + " vTextureCoord.xy = vec2(1, 0);", + "}", + + "vTextureCoord *= tileSize;", + "vTextureCoord.x += tileColumn * tileSize;", + "vTextureCoord.y += tileRow * tileSize;", + "vTextureCoord.z = floor(floor(a_customAttributes / 4.)/u_tilesPerTexture);", + "}" + ].join("\n"); +} },{"./webgl.js":53,"./webglAtlas.js":54}],57:[function(require,module,exports){ -var documentEvents = require('../Utils/documentEvents.js'); - -module.exports = webglInputEvents; - -/** - * Monitors graph-related mouse input in webgl graphics and notifies subscribers. - * - * @param {Viva.Graph.View.webglGraphics} webglGraphics - */ -function webglInputEvents(webglGraphics) { - if (webglGraphics.webglInputEvents) { - // Don't listen twice, if we are already attached to this graphics: - return webglGraphics.webglInputEvents; - } - - var mouseCapturedNode = null, - mouseEnterCallback = [], - mouseLeaveCallback = [], - mouseDownCallback = [], - mouseUpCallback = [], - mouseMoveCallback = [], - clickCallback = [], - dblClickCallback = [], - prevSelectStart, - boundRect; - - var root = webglGraphics.getGraphicsRoot(); - startListen(root); - - var api = { - mouseEnter: mouseEnter, - mouseLeave: mouseLeave, - mouseDown: mouseDown, - mouseUp: mouseUp, - mouseMove: mouseMove, - click: click, - dblClick: dblClick, - mouseCapture: mouseCapture, - releaseMouseCapture: releaseMouseCapture - }; - - // TODO I don't remember why this is needed: - webglGraphics.webglInputEvents = api; - - return api; - - function releaseMouseCapture() { - mouseCapturedNode = null; - } - - function mouseCapture(node) { - mouseCapturedNode = node; - } - - function dblClick(callback) { - if (typeof callback === 'function') { - dblClickCallback.push(callback); - } - return api; - } - - function click(callback) { - if (typeof callback === 'function') { - clickCallback.push(callback); - } - return api; - } - - function mouseMove(callback) { - if (typeof callback === 'function') { - mouseMoveCallback.push(callback); - } - return api; - } - - function mouseUp(callback) { - if (typeof callback === 'function') { - mouseUpCallback.push(callback); - } - return api; - } - - function mouseDown(callback) { - if (typeof callback === 'function') { - mouseDownCallback.push(callback); - } - return api; - } - - function mouseLeave(callback) { - if (typeof callback === 'function') { - mouseLeaveCallback.push(callback); - } - return api; - } - - function mouseEnter(callback) { - if (typeof callback === 'function') { - mouseEnterCallback.push(callback); - } - return api; - } - - function preciseCheck(nodeUI, x, y) { - if (nodeUI && nodeUI.size) { - var pos = nodeUI.position, - half = nodeUI.size; - - return pos.x - half < x && x < pos.x + half && - pos.y - half < y && y < pos.y + half; - } - - return true; - } - - function getNodeAtClientPos(pos) { - return webglGraphics.getNodeAtClientPos(pos, preciseCheck); - } - - function stopPropagation(e) { - if (e.stopPropagation) { - e.stopPropagation(); - } else { - e.cancelBubble = true; - } - } - - function handleDisabledEvent(e) { - stopPropagation(e); - return false; - } - - function invoke(callbacksChain, args) { - var i, stopPropagation; - for (i = 0; i < callbacksChain.length; i += 1) { - stopPropagation = callbacksChain[i].apply(undefined, args); - if (stopPropagation) { - return true; - } - } - } - - function startListen(root) { - var pos = { - x: 0, - y: 0 - }, - lastFound = null, - lastUpdate = 1, - lastClickTime = +new Date(), - - handleMouseMove = function(e) { - invoke(mouseMoveCallback, [lastFound, e]); - pos.x = e.clientX; - pos.y = e.clientY; - }, - - handleMouseUp = function() { - documentEvents.off('mousemove', handleMouseMove); - documentEvents.off('mouseup', handleMouseUp); - }, - - updateBoundRect = function() { - boundRect = root.getBoundingClientRect(); - }; - - window.addEventListener('resize', updateBoundRect); - updateBoundRect(); - - // mouse move inside container serves only to track mouse enter/leave events. - root.addEventListener('mousemove', - function(e) { - if (mouseCapturedNode) { - return; - } - if (lastUpdate++ % 7 === 0) { - // since there is no bullet proof method to detect resize - // event, we preemptively update the bounding rectangle - updateBoundRect(); - lastUpdate = 1; - } - var cancelBubble = false, - node; - - pos.x = e.clientX - boundRect.left; - pos.y = e.clientY - boundRect.top; - - node = getNodeAtClientPos(pos); - - if (node && lastFound !== node) { - lastFound = node; - cancelBubble = cancelBubble || invoke(mouseEnterCallback, [lastFound]); - } else if (node === null && lastFound !== node) { - cancelBubble = cancelBubble || invoke(mouseLeaveCallback, [lastFound]); - lastFound = null; - } - - if (cancelBubble) { - stopPropagation(e); - } - }); - - root.addEventListener('mousedown', - function(e) { - var cancelBubble = false, - args; - updateBoundRect(); - pos.x = e.clientX - boundRect.left; - pos.y = e.clientY - boundRect.top; - - args = [getNodeAtClientPos(pos), e]; - if (args[0]) { - cancelBubble = invoke(mouseDownCallback, args); - // we clicked on a node. Following drag should be handled on document events: - documentEvents.on('mousemove', handleMouseMove); - documentEvents.on('mouseup', handleMouseUp); - - prevSelectStart = window.document.onselectstart; - - window.document.onselectstart = handleDisabledEvent; - - lastFound = args[0]; - } else { - lastFound = null; - } - if (cancelBubble) { - stopPropagation(e); - } - }); - - root.addEventListener('mouseup', - function(e) { - var clickTime = +new Date(), - args; - - pos.x = e.clientX - boundRect.left; - pos.y = e.clientY - boundRect.top; - - var nodeAtClientPos = getNodeAtClientPos(pos); - var sameNode = nodeAtClientPos === lastFound; - args = [nodeAtClientPos || lastFound, e]; - if (args[0]) { - window.document.onselectstart = prevSelectStart; - - if (clickTime - lastClickTime < 400 && sameNode) { - invoke(dblClickCallback, args); - } else { - invoke(clickCallback, args); - } - lastClickTime = clickTime; - - if (invoke(mouseUpCallback, args)) { - stopPropagation(e); - } - } - }); - } -} +var documentEvents = require('../Utils/documentEvents.js'); + +module.exports = webglInputEvents; + +/** + * Monitors graph-related mouse input in webgl graphics and notifies subscribers. + * + * @param {Viva.Graph.View.webglGraphics} webglGraphics + */ +function webglInputEvents(webglGraphics) { + if (webglGraphics.webglInputEvents) { + // Don't listen twice, if we are already attached to this graphics: + return webglGraphics.webglInputEvents; + } + + var mouseCapturedNode = null, + mouseEnterCallback = [], + mouseLeaveCallback = [], + mouseDownCallback = [], + mouseUpCallback = [], + mouseMoveCallback = [], + clickCallback = [], + dblClickCallback = [], + prevSelectStart, + boundRect; + + var root = webglGraphics.getGraphicsRoot(); + startListen(root); + + var api = { + mouseEnter: mouseEnter, + mouseLeave: mouseLeave, + mouseDown: mouseDown, + mouseUp: mouseUp, + mouseMove: mouseMove, + click: click, + dblClick: dblClick, + mouseCapture: mouseCapture, + releaseMouseCapture: releaseMouseCapture + }; + + // TODO I don't remember why this is needed: + webglGraphics.webglInputEvents = api; + + return api; + + function releaseMouseCapture() { + mouseCapturedNode = null; + } + + function mouseCapture(node) { + mouseCapturedNode = node; + } + + function dblClick(callback) { + if (typeof callback === 'function') { + dblClickCallback.push(callback); + } + return api; + } + + function click(callback) { + if (typeof callback === 'function') { + clickCallback.push(callback); + } + return api; + } + + function mouseMove(callback) { + if (typeof callback === 'function') { + mouseMoveCallback.push(callback); + } + return api; + } + + function mouseUp(callback) { + if (typeof callback === 'function') { + mouseUpCallback.push(callback); + } + return api; + } + + function mouseDown(callback) { + if (typeof callback === 'function') { + mouseDownCallback.push(callback); + } + return api; + } + + function mouseLeave(callback) { + if (typeof callback === 'function') { + mouseLeaveCallback.push(callback); + } + return api; + } + + function mouseEnter(callback) { + if (typeof callback === 'function') { + mouseEnterCallback.push(callback); + } + return api; + } + + function preciseCheck(nodeUI, x, y) { + if (nodeUI && nodeUI.size) { + var pos = nodeUI.position, + half = nodeUI.size; + + return pos.x - half < x && x < pos.x + half && + pos.y - half < y && y < pos.y + half; + } + + return true; + } + + function getNodeAtClientPos(pos) { + return webglGraphics.getNodeAtClientPos(pos, preciseCheck); + } + + function stopPropagation(e) { + if (e.stopPropagation) { + e.stopPropagation(); + } else { + e.cancelBubble = true; + } + } + + function handleDisabledEvent(e) { + stopPropagation(e); + return false; + } + + function invoke(callbacksChain, args) { + var i, stopPropagation; + for (i = 0; i < callbacksChain.length; i += 1) { + stopPropagation = callbacksChain[i].apply(undefined, args); + if (stopPropagation) { + return true; + } + } + } + + function startListen(root) { + var pos = { + x: 0, + y: 0 + }, + lastFound = null, + lastUpdate = 1, + lastClickTime = +new Date(), + + handleMouseMove = function(e) { + invoke(mouseMoveCallback, [lastFound, e]); + pos.x = e.clientX; + pos.y = e.clientY; + }, + + handleMouseUp = function() { + documentEvents.off('mousemove', handleMouseMove); + documentEvents.off('mouseup', handleMouseUp); + }, + + updateBoundRect = function() { + boundRect = root.getBoundingClientRect(); + }; + + window.addEventListener('resize', updateBoundRect); + updateBoundRect(); + + // mouse move inside container serves only to track mouse enter/leave events. + root.addEventListener('mousemove', + function(e) { + if (mouseCapturedNode) { + return; + } + if (lastUpdate++ % 7 === 0) { + // since there is no bullet proof method to detect resize + // event, we preemptively update the bounding rectangle + updateBoundRect(); + lastUpdate = 1; + } + var cancelBubble = false, + node; + + pos.x = e.clientX - boundRect.left; + pos.y = e.clientY - boundRect.top; + + node = getNodeAtClientPos(pos); + + if (node && lastFound !== node) { + lastFound = node; + cancelBubble = cancelBubble || invoke(mouseEnterCallback, [lastFound]); + } else if (node === null && lastFound !== node) { + cancelBubble = cancelBubble || invoke(mouseLeaveCallback, [lastFound]); + lastFound = null; + } + + if (cancelBubble) { + stopPropagation(e); + } + }); + + root.addEventListener('mousedown', + function(e) { + var cancelBubble = false, + args; + updateBoundRect(); + pos.x = e.clientX - boundRect.left; + pos.y = e.clientY - boundRect.top; + + args = [getNodeAtClientPos(pos), e]; + if (args[0]) { + cancelBubble = invoke(mouseDownCallback, args); + // we clicked on a node. Following drag should be handled on document events: + documentEvents.on('mousemove', handleMouseMove); + documentEvents.on('mouseup', handleMouseUp); + + prevSelectStart = window.document.onselectstart; + + window.document.onselectstart = handleDisabledEvent; + + lastFound = args[0]; + } else { + lastFound = null; + } + if (cancelBubble) { + stopPropagation(e); + } + }); + + root.addEventListener('mouseup', + function(e) { + var clickTime = +new Date(), + args; + + pos.x = e.clientX - boundRect.left; + pos.y = e.clientY - boundRect.top; + + var nodeAtClientPos = getNodeAtClientPos(pos); + var sameNode = nodeAtClientPos === lastFound; + args = [nodeAtClientPos || lastFound, e]; + if (args[0]) { + window.document.onselectstart = prevSelectStart; + + if (clickTime - lastClickTime < 400 && sameNode) { + invoke(dblClickCallback, args); + } else { + invoke(clickCallback, args); + } + lastClickTime = clickTime; + + if (invoke(mouseUpCallback, args)) { + stopPropagation(e); + } + } + }); + } +} },{"../Utils/documentEvents.js":40}],58:[function(require,module,exports){ -var parseColor = require('./parseColor.js'); - -module.exports = webglLine; - -/** - * Defines a webgl line. This class has no rendering logic at all, - * it's just passed to corresponding shader and the shader should - * figure out how to render it. - * - */ -function webglLine(color) { - return { - /** - * Gets or sets color of the line. If you set this property externally - * make sure it always come as integer of 0xRRGGBBAA format - */ - color: parseColor(color) - }; -} +var parseColor = require('./parseColor.js'); + +module.exports = webglLine; + +/** + * Defines a webgl line. This class has no rendering logic at all, + * it's just passed to corresponding shader and the shader should + * figure out how to render it. + * + */ +function webglLine(color) { + return { + /** + * Gets or sets color of the line. If you set this property externally + * make sure it always come as integer of 0xRRGGBBAA format + */ + color: parseColor(color) + }; +} },{"./parseColor.js":51}],59:[function(require,module,exports){ -/** - * @fileOverview Defines a naive form of links for webglGraphics class. - * This form allows to change color of links. - **/ - -var glUtils = require('./webgl.js'); - -module.exports = webglLinkProgram; - -/** - * Defines UI for links in webgl renderer. - */ -function webglLinkProgram() { - var ATTRIBUTES_PER_PRIMITIVE = 6, // primitive is Line with two points. Each has x,y and color = 3 * 2 attributes. - BYTES_PER_LINK = 2 * (2 * Float32Array.BYTES_PER_ELEMENT + Uint32Array.BYTES_PER_ELEMENT), // two nodes * (x, y + color) - linksFS = [ - 'precision mediump float;', - 'varying vec4 color;', - 'void main(void) {', - ' gl_FragColor = color;', - '}' - ].join('\n'), - - linksVS = [ - 'attribute vec2 a_vertexPos;', - 'attribute vec4 a_color;', - - 'uniform vec2 u_screenSize;', - 'uniform mat4 u_transform;', - - 'varying vec4 color;', - - 'void main(void) {', - ' gl_Position = u_transform * vec4(a_vertexPos/u_screenSize, 0.0, 1.0);', - ' color = a_color.abgr;', - '}' - ].join('\n'), - - program, - gl, - buffer, - utils, - locations, - linksCount = 0, - frontLinkId, // used to track z-index of links. - storage = new ArrayBuffer(16 * BYTES_PER_LINK), - positions = new Float32Array(storage), - colors = new Uint32Array(storage), - width, - height, - transform, - sizeDirty, - - ensureEnoughStorage = function () { - // TODO: this is a duplicate of webglNodeProgram code. Extract it to webgl.js - if ((linksCount+1)*BYTES_PER_LINK > storage.byteLength) { - // Every time we run out of space create new array twice bigger. - // TODO: it seems buffer size is limited. Consider using multiple arrays for huge graphs - var extendedStorage = new ArrayBuffer(storage.byteLength * 2), - extendedPositions = new Float32Array(extendedStorage), - extendedColors = new Uint32Array(extendedStorage); - - extendedColors.set(colors); // should be enough to copy just one view. - positions = extendedPositions; - colors = extendedColors; - storage = extendedStorage; - } - }; - - return { - load : function (glContext) { - gl = glContext; - utils = glUtils(glContext); - - program = utils.createProgram(linksVS, linksFS); - gl.useProgram(program); - locations = utils.getLocations(program, ['a_vertexPos', 'a_color', 'u_screenSize', 'u_transform']); - - gl.enableVertexAttribArray(locations.vertexPos); - gl.enableVertexAttribArray(locations.color); - - buffer = gl.createBuffer(); - }, - - position: function (linkUi, fromPos, toPos) { - var linkIdx = linkUi.id, - offset = linkIdx * ATTRIBUTES_PER_PRIMITIVE; - positions[offset] = fromPos.x; - positions[offset + 1] = fromPos.y; - colors[offset + 2] = linkUi.color; - - positions[offset + 3] = toPos.x; - positions[offset + 4] = toPos.y; - colors[offset + 5] = linkUi.color; - }, - - createLink : function (ui) { - ensureEnoughStorage(); - - linksCount += 1; - frontLinkId = ui.id; - }, - - removeLink : function (ui) { - if (linksCount > 0) { linksCount -= 1; } - // swap removed link with the last link. This will give us O(1) performance for links removal: - if (ui.id < linksCount && linksCount > 0) { - // using colors as a view to array buffer is okay here. - utils.copyArrayPart(colors, ui.id * ATTRIBUTES_PER_PRIMITIVE, linksCount * ATTRIBUTES_PER_PRIMITIVE, ATTRIBUTES_PER_PRIMITIVE); - } - }, - - updateTransform : function (newTransform) { - sizeDirty = true; - transform = newTransform; - }, - - updateSize : function (w, h) { - width = w; - height = h; - sizeDirty = true; - }, - - render : function () { - gl.useProgram(program); - gl.bindBuffer(gl.ARRAY_BUFFER, buffer); - gl.bufferData(gl.ARRAY_BUFFER, storage, gl.DYNAMIC_DRAW); - - if (sizeDirty) { - sizeDirty = false; - gl.uniformMatrix4fv(locations.transform, false, transform); - gl.uniform2f(locations.screenSize, width, height); - } - - gl.vertexAttribPointer(locations.vertexPos, 2, gl.FLOAT, false, 3 * Float32Array.BYTES_PER_ELEMENT, 0); - gl.vertexAttribPointer(locations.color, 4, gl.UNSIGNED_BYTE, true, 3 * Float32Array.BYTES_PER_ELEMENT, 2 * 4); - - gl.drawArrays(gl.LINES, 0, linksCount * 2); - - frontLinkId = linksCount - 1; - }, - - bringToFront : function (link) { - if (frontLinkId > link.id) { - utils.swapArrayPart(positions, link.id * ATTRIBUTES_PER_PRIMITIVE, frontLinkId * ATTRIBUTES_PER_PRIMITIVE, ATTRIBUTES_PER_PRIMITIVE); - } - if (frontLinkId > 0) { - frontLinkId -= 1; - } - }, - - getFrontLinkId : function () { - return frontLinkId; - } - }; -} +/** + * @fileOverview Defines a naive form of links for webglGraphics class. + * This form allows to change color of links. + **/ + +var glUtils = require('./webgl.js'); + +module.exports = webglLinkProgram; + +/** + * Defines UI for links in webgl renderer. + */ +function webglLinkProgram() { + var ATTRIBUTES_PER_PRIMITIVE = 6, // primitive is Line with two points. Each has x,y and color = 3 * 2 attributes. + BYTES_PER_LINK = 2 * (2 * Float32Array.BYTES_PER_ELEMENT + Uint32Array.BYTES_PER_ELEMENT), // two nodes * (x, y + color) + linksFS = [ + 'precision mediump float;', + 'varying vec4 color;', + 'void main(void) {', + ' gl_FragColor = color;', + '}' + ].join('\n'), + + linksVS = [ + 'attribute vec2 a_vertexPos;', + 'attribute vec4 a_color;', + + 'uniform vec2 u_screenSize;', + 'uniform mat4 u_transform;', + + 'varying vec4 color;', + + 'void main(void) {', + ' gl_Position = u_transform * vec4(a_vertexPos/u_screenSize, 0.0, 1.0);', + ' color = a_color.abgr;', + '}' + ].join('\n'), + + program, + gl, + buffer, + utils, + locations, + linksCount = 0, + frontLinkId, // used to track z-index of links. + storage = new ArrayBuffer(16 * BYTES_PER_LINK), + positions = new Float32Array(storage), + colors = new Uint32Array(storage), + width, + height, + transform, + sizeDirty, + + ensureEnoughStorage = function () { + // TODO: this is a duplicate of webglNodeProgram code. Extract it to webgl.js + if ((linksCount+1)*BYTES_PER_LINK > storage.byteLength) { + // Every time we run out of space create new array twice bigger. + // TODO: it seems buffer size is limited. Consider using multiple arrays for huge graphs + var extendedStorage = new ArrayBuffer(storage.byteLength * 2), + extendedPositions = new Float32Array(extendedStorage), + extendedColors = new Uint32Array(extendedStorage); + + extendedColors.set(colors); // should be enough to copy just one view. + positions = extendedPositions; + colors = extendedColors; + storage = extendedStorage; + } + }; + + return { + load : function (glContext) { + gl = glContext; + utils = glUtils(glContext); + + program = utils.createProgram(linksVS, linksFS); + gl.useProgram(program); + locations = utils.getLocations(program, ['a_vertexPos', 'a_color', 'u_screenSize', 'u_transform']); + + gl.enableVertexAttribArray(locations.vertexPos); + gl.enableVertexAttribArray(locations.color); + + buffer = gl.createBuffer(); + }, + + position: function (linkUi, fromPos, toPos) { + var linkIdx = linkUi.id, + offset = linkIdx * ATTRIBUTES_PER_PRIMITIVE; + positions[offset] = fromPos.x; + positions[offset + 1] = fromPos.y; + colors[offset + 2] = linkUi.color; + + positions[offset + 3] = toPos.x; + positions[offset + 4] = toPos.y; + colors[offset + 5] = linkUi.color; + }, + + createLink : function (ui) { + ensureEnoughStorage(); + + linksCount += 1; + frontLinkId = ui.id; + }, + + removeLink : function (ui) { + if (linksCount > 0) { linksCount -= 1; } + // swap removed link with the last link. This will give us O(1) performance for links removal: + if (ui.id < linksCount && linksCount > 0) { + // using colors as a view to array buffer is okay here. + utils.copyArrayPart(colors, ui.id * ATTRIBUTES_PER_PRIMITIVE, linksCount * ATTRIBUTES_PER_PRIMITIVE, ATTRIBUTES_PER_PRIMITIVE); + } + }, + + updateTransform : function (newTransform) { + sizeDirty = true; + transform = newTransform; + }, + + updateSize : function (w, h) { + width = w; + height = h; + sizeDirty = true; + }, + + render : function () { + gl.useProgram(program); + gl.bindBuffer(gl.ARRAY_BUFFER, buffer); + gl.bufferData(gl.ARRAY_BUFFER, storage, gl.DYNAMIC_DRAW); + + if (sizeDirty) { + sizeDirty = false; + gl.uniformMatrix4fv(locations.transform, false, transform); + gl.uniform2f(locations.screenSize, width, height); + } + + gl.vertexAttribPointer(locations.vertexPos, 2, gl.FLOAT, false, 3 * Float32Array.BYTES_PER_ELEMENT, 0); + gl.vertexAttribPointer(locations.color, 4, gl.UNSIGNED_BYTE, true, 3 * Float32Array.BYTES_PER_ELEMENT, 2 * 4); + + gl.drawArrays(gl.LINES, 0, linksCount * 2); + + frontLinkId = linksCount - 1; + }, + + bringToFront : function (link) { + if (frontLinkId > link.id) { + utils.swapArrayPart(positions, link.id * ATTRIBUTES_PER_PRIMITIVE, frontLinkId * ATTRIBUTES_PER_PRIMITIVE, ATTRIBUTES_PER_PRIMITIVE); + } + if (frontLinkId > 0) { + frontLinkId -= 1; + } + }, + + getFrontLinkId : function () { + return frontLinkId; + } + }; +} },{"./webgl.js":53}],60:[function(require,module,exports){ -/** - * @fileOverview Defines a naive form of nodes for webglGraphics class. - * This form allows to change color of node. Shape of nodes is rectangular. - * - * @author Andrei Kashcha (aka anvaka) / https://github.com/anvaka - */ - -var glUtils = require('./webgl.js'); - -module.exports = webglNodeProgram; - -/** - * Defines simple UI for nodes in webgl renderer. Each node is rendered as square. Color and size can be changed. - */ -function webglNodeProgram() { - var ATTRIBUTES_PER_PRIMITIVE = 4; // Primitive is point, x, y, size, color - // x, y, z - floats, color = uint. - var BYTES_PER_NODE = 3 * Float32Array.BYTES_PER_ELEMENT + Uint32Array.BYTES_PER_ELEMENT; - var nodesFS = [ - 'precision mediump float;', - 'varying vec4 color;', - - 'void main(void) {', - ' gl_FragColor = color;', - '}' - ].join('\n'); - var nodesVS = [ - 'attribute vec3 a_vertexPos;', - 'attribute vec4 a_color;', - 'uniform vec2 u_screenSize;', - 'uniform mat4 u_transform;', - 'varying vec4 color;', - - 'void main(void) {', - ' gl_Position = u_transform * vec4(a_vertexPos.xy/u_screenSize, 0, 1);', - ' gl_PointSize = a_vertexPos.z * u_transform[0][0];', - ' color = a_color.abgr;', - '}' - ].join('\n'); - - var program; - var gl; - var buffer; - var locations; - var utils; - var storage = new ArrayBuffer(16 * BYTES_PER_NODE); - var positions = new Float32Array(storage); - var colors = new Uint32Array(storage); - var nodesCount = 0; - var width; - var height; - var transform; - var sizeDirty; - - return { - load: load, - - /** - * Updates position of node in the buffer of nodes. - * - * @param idx - index of current node. - * @param pos - new position of the node. - */ - position: position, - - updateTransform: updateTransform, - - updateSize: updateSize, - - removeNode: removeNode, - - createNode: createNode, - - replaceProperties: replaceProperties, - - render: render - }; - - function ensureEnoughStorage() { - if ((nodesCount + 1) * BYTES_PER_NODE >= storage.byteLength) { - // Every time we run out of space create new array twice bigger. - // TODO: it seems buffer size is limited. Consider using multiple arrays for huge graphs - var extendedStorage = new ArrayBuffer(storage.byteLength * 2), - extendedPositions = new Float32Array(extendedStorage), - extendedColors = new Uint32Array(extendedStorage); - - extendedColors.set(colors); // should be enough to copy just one view. - positions = extendedPositions; - colors = extendedColors; - storage = extendedStorage; - } - } - - function load(glContext) { - gl = glContext; - utils = glUtils(glContext); - - program = utils.createProgram(nodesVS, nodesFS); - gl.useProgram(program); - locations = utils.getLocations(program, ['a_vertexPos', 'a_color', 'u_screenSize', 'u_transform']); - - gl.enableVertexAttribArray(locations.vertexPos); - gl.enableVertexAttribArray(locations.color); - - buffer = gl.createBuffer(); - } - - function position(nodeUI, pos) { - var idx = nodeUI.id; - - positions[idx * ATTRIBUTES_PER_PRIMITIVE] = pos.x; - positions[idx * ATTRIBUTES_PER_PRIMITIVE + 1] = -pos.y; - positions[idx * ATTRIBUTES_PER_PRIMITIVE + 2] = nodeUI.size; - - colors[idx * ATTRIBUTES_PER_PRIMITIVE + 3] = nodeUI.color; - } - - function updateTransform(newTransform) { - sizeDirty = true; - transform = newTransform; - } - - function updateSize(w, h) { - width = w; - height = h; - sizeDirty = true; - } - - function removeNode(node) { - if (nodesCount > 0) { - nodesCount -= 1; - } - - if (node.id < nodesCount && nodesCount > 0) { - // we can use colors as a 'view' into array array buffer. - utils.copyArrayPart(colors, node.id * ATTRIBUTES_PER_PRIMITIVE, nodesCount * ATTRIBUTES_PER_PRIMITIVE, ATTRIBUTES_PER_PRIMITIVE); - } - } - - function createNode() { - ensureEnoughStorage(); - nodesCount += 1; - } - - function replaceProperties(/* replacedNode, newNode */) {} - - function render() { - gl.useProgram(program); - gl.bindBuffer(gl.ARRAY_BUFFER, buffer); - gl.bufferData(gl.ARRAY_BUFFER, storage, gl.DYNAMIC_DRAW); - - if (sizeDirty) { - sizeDirty = false; - gl.uniformMatrix4fv(locations.transform, false, transform); - gl.uniform2f(locations.screenSize, width, height); - } - - gl.vertexAttribPointer(locations.vertexPos, 3, gl.FLOAT, false, ATTRIBUTES_PER_PRIMITIVE * Float32Array.BYTES_PER_ELEMENT, 0); - gl.vertexAttribPointer(locations.color, 4, gl.UNSIGNED_BYTE, true, ATTRIBUTES_PER_PRIMITIVE * Float32Array.BYTES_PER_ELEMENT, 3 * 4); - - gl.drawArrays(gl.POINTS, 0, nodesCount); - } -} +/** + * @fileOverview Defines a naive form of nodes for webglGraphics class. + * This form allows to change color of node. Shape of nodes is rectangular. + * + * @author Andrei Kashcha (aka anvaka) / https://github.com/anvaka + */ + +var glUtils = require('./webgl.js'); + +module.exports = webglNodeProgram; + +/** + * Defines simple UI for nodes in webgl renderer. Each node is rendered as square. Color and size can be changed. + */ +function webglNodeProgram() { + var ATTRIBUTES_PER_PRIMITIVE = 4; // Primitive is point, x, y, size, color + // x, y, z - floats, color = uint. + var BYTES_PER_NODE = 3 * Float32Array.BYTES_PER_ELEMENT + Uint32Array.BYTES_PER_ELEMENT; + var nodesFS = [ + 'precision mediump float;', + 'varying vec4 color;', + + 'void main(void) {', + ' gl_FragColor = color;', + '}' + ].join('\n'); + var nodesVS = [ + 'attribute vec3 a_vertexPos;', + 'attribute vec4 a_color;', + 'uniform vec2 u_screenSize;', + 'uniform mat4 u_transform;', + 'varying vec4 color;', + + 'void main(void) {', + ' gl_Position = u_transform * vec4(a_vertexPos.xy/u_screenSize, 0, 1);', + ' gl_PointSize = a_vertexPos.z * u_transform[0][0];', + ' color = a_color.abgr;', + '}' + ].join('\n'); + + var program; + var gl; + var buffer; + var locations; + var utils; + var storage = new ArrayBuffer(16 * BYTES_PER_NODE); + var positions = new Float32Array(storage); + var colors = new Uint32Array(storage); + var nodesCount = 0; + var width; + var height; + var transform; + var sizeDirty; + + return { + load: load, + + /** + * Updates position of node in the buffer of nodes. + * + * @param idx - index of current node. + * @param pos - new position of the node. + */ + position: position, + + updateTransform: updateTransform, + + updateSize: updateSize, + + removeNode: removeNode, + + createNode: createNode, + + replaceProperties: replaceProperties, + + render: render + }; + + function ensureEnoughStorage() { + if ((nodesCount + 1) * BYTES_PER_NODE >= storage.byteLength) { + // Every time we run out of space create new array twice bigger. + // TODO: it seems buffer size is limited. Consider using multiple arrays for huge graphs + var extendedStorage = new ArrayBuffer(storage.byteLength * 2), + extendedPositions = new Float32Array(extendedStorage), + extendedColors = new Uint32Array(extendedStorage); + + extendedColors.set(colors); // should be enough to copy just one view. + positions = extendedPositions; + colors = extendedColors; + storage = extendedStorage; + } + } + + function load(glContext) { + gl = glContext; + utils = glUtils(glContext); + + program = utils.createProgram(nodesVS, nodesFS); + gl.useProgram(program); + locations = utils.getLocations(program, ['a_vertexPos', 'a_color', 'u_screenSize', 'u_transform']); + + gl.enableVertexAttribArray(locations.vertexPos); + gl.enableVertexAttribArray(locations.color); + + buffer = gl.createBuffer(); + } + + function position(nodeUI, pos) { + var idx = nodeUI.id; + + positions[idx * ATTRIBUTES_PER_PRIMITIVE] = pos.x; + positions[idx * ATTRIBUTES_PER_PRIMITIVE + 1] = -pos.y; + positions[idx * ATTRIBUTES_PER_PRIMITIVE + 2] = nodeUI.size; + + colors[idx * ATTRIBUTES_PER_PRIMITIVE + 3] = nodeUI.color; + } + + function updateTransform(newTransform) { + sizeDirty = true; + transform = newTransform; + } + + function updateSize(w, h) { + width = w; + height = h; + sizeDirty = true; + } + + function removeNode(node) { + if (nodesCount > 0) { + nodesCount -= 1; + } + + if (node.id < nodesCount && nodesCount > 0) { + // we can use colors as a 'view' into array array buffer. + utils.copyArrayPart(colors, node.id * ATTRIBUTES_PER_PRIMITIVE, nodesCount * ATTRIBUTES_PER_PRIMITIVE, ATTRIBUTES_PER_PRIMITIVE); + } + } + + function createNode() { + ensureEnoughStorage(); + nodesCount += 1; + } + + function replaceProperties(/* replacedNode, newNode */) {} + + function render() { + gl.useProgram(program); + gl.bindBuffer(gl.ARRAY_BUFFER, buffer); + gl.bufferData(gl.ARRAY_BUFFER, storage, gl.DYNAMIC_DRAW); + + if (sizeDirty) { + sizeDirty = false; + gl.uniformMatrix4fv(locations.transform, false, transform); + gl.uniform2f(locations.screenSize, width, height); + } + + gl.vertexAttribPointer(locations.vertexPos, 3, gl.FLOAT, false, ATTRIBUTES_PER_PRIMITIVE * Float32Array.BYTES_PER_ELEMENT, 0); + gl.vertexAttribPointer(locations.color, 4, gl.UNSIGNED_BYTE, true, ATTRIBUTES_PER_PRIMITIVE * Float32Array.BYTES_PER_ELEMENT, 3 * 4); + + gl.drawArrays(gl.POINTS, 0, nodesCount); + } +} },{"./webgl.js":53}],61:[function(require,module,exports){ -var parseColor = require('./parseColor.js'); - -module.exports = webglSquare; - -/** - * Can be used as a callback in the webglGraphics.node() function, to - * create a custom looking node. - * - * @param size - size of the node in pixels. - * @param color - color of the node in '#rrggbbaa' or '#rgb' format. - */ -function webglSquare(size, color) { - return { - /** - * Gets or sets size of the square side. - */ - size: typeof size === 'number' ? size : 10, - - /** - * Gets or sets color of the square. - */ - color: parseColor(color) - }; -} +var parseColor = require('./parseColor.js'); + +module.exports = webglSquare; + +/** + * Can be used as a callback in the webglGraphics.node() function, to + * create a custom looking node. + * + * @param size - size of the node in pixels. + * @param color - color of the node in '#rrggbbaa' or '#rgb' format. + */ +function webglSquare(size, color) { + return { + /** + * Gets or sets size of the square side. + */ + size: typeof size === 'number' ? size : 10, + + /** + * Gets or sets color of the square. + */ + color: parseColor(color) + }; +} },{"./parseColor.js":51}],62:[function(require,module,exports){ -// todo: this should be generated at build time. -module.exports = '0.8.1'; +// todo: this should be generated at build time. +module.exports = '0.8.1'; },{}]},{},[1])(1) }); \ No newline at end of file From e18e39aeba6d234eb4467b1d5940288369c7b324 Mon Sep 17 00:00:00 2001 From: Andriy Kashcha Date: Mon, 7 Aug 2017 22:33:41 -0700 Subject: [PATCH 15/49] 0.10.0 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 38ab72a..260c84e 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "vivagraphjs", - "version": "0.9.0", + "version": "0.10.0", "description": "Graph Drawing Library", "main": "src/viva", "directories": { From 7bd2802643ba0a059164691bafc57ae80ffbad74 Mon Sep 17 00:00:00 2001 From: Andriy Kashcha Date: Thu, 22 Feb 2018 20:57:36 -0800 Subject: [PATCH 16/49] removed old blogspot reference --- dist/vivagraph.js | 3634 ++++++++++++++-------------- src/Utils/timer.js | 2 +- src/View/svgGraphics.js | 2 +- src/WebGL/webgl.js | 2 +- src/WebGL/webglImageNodeProgram.js | 2 +- 5 files changed, 1821 insertions(+), 1821 deletions(-) diff --git a/dist/vivagraph.js b/dist/vivagraph.js index 4f0fad5..0d0cf06 100644 --- a/dist/vivagraph.js +++ b/dist/vivagraph.js @@ -1,116 +1,116 @@ !function(e){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=e();else if("function"==typeof define&&define.amd)define([],e);else{var f;"undefined"!=typeof window?f=window:"undefined"!=typeof global?f=global:"undefined"!=typeof self&&(f=self),f.Viva=e()}}(function(){var define,module,exports;return (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o= 0; - } else if (typeof interactive === 'boolean') { - return interactive; - } - return true; // default setting - } - - function prepareSettings() { - container = container || window.document.body; - layout = layout || forceDirected(graph, { - springLength: 80, - springCoeff: 0.0002, - }); - graphics = graphics || svgGraphics(graph, { - container: container - }); - - if (!settings.hasOwnProperty('renderLinks')) { - settings.renderLinks = true; - } - - settings.prerender = settings.prerender || 0; - inputManager = (graphics.inputManager || domInputManager)(graph, graphics); - } - - function renderGraph() { - graphics.beginRender(); - - // todo: move this check graphics - if (settings.renderLinks) { - graphics.renderLinks(); - } - graphics.renderNodes(); - graphics.endRender(); - } - - function onRenderFrame() { - isStable = layout.step() && !userInteraction; - renderGraph(); - - return !isStable; - } - - function renderIterations(iterationsCount) { - if (animationTimer) { - totalIterationsCount += iterationsCount; - return; - } - - if (iterationsCount) { - totalIterationsCount += iterationsCount; - - animationTimer = timer(function() { - return onRenderFrame(); - }, FRAME_INTERVAL); - } else { - currentStep = 0; - totalIterationsCount = 0; - animationTimer = timer(onRenderFrame, FRAME_INTERVAL); - } - } - - function resetStable() { - if (isPaused) { - return; - } - - isStable = false; - animationTimer.restart(); - } - - function prerender() { - // To get good initial positions for the graph - // perform several prerender steps in background. - if (typeof settings.prerender === 'number' && settings.prerender > 0) { - for (var i = 0; i < settings.prerender; i += 1) { - layout.step(); - } - } - } - - function updateCenter() { - var graphRect = layout.getGraphRect(), - containerSize = getDimension(container); - - var cx = (graphRect.x2 + graphRect.x1) / 2; - var cy = (graphRect.y2 + graphRect.y1) / 2; - transform.offsetX = containerSize.width / 2 - (cx * transform.scale - cx); - transform.offsetY = containerSize.height / 2 - (cy * transform.scale - cy); - graphics.graphCenterChanged(transform.offsetX, transform.offsetY); - - updateCenterRequired = false; - } - - function createNodeUi(node) { - var nodePosition = layout.getNodePosition(node.id); - graphics.addNode(node, nodePosition); - } - - function removeNodeUi(node) { - graphics.releaseNode(node); - } - - function createLinkUi(link) { - var linkPosition = layout.getLinkPosition(link.id); - graphics.addLink(link, linkPosition); - } - - function removeLinkUi(link) { - graphics.releaseLink(link); - } - - function listenNodeEvents(node) { - if (!isInteractive('node')) { - return; - } - - var wasPinned = false; - - // TODO: This may not be memory efficient. Consider reusing handlers object. - inputManager.bindDragNDrop(node, { - onStart: function() { - wasPinned = layout.isNodePinned(node); - layout.pinNode(node, true); - userInteraction = true; - resetStable(); - }, - onDrag: function(e, offset) { - var oldPos = layout.getNodePosition(node.id); - layout.setNodePosition(node.id, - oldPos.x + offset.x / transform.scale, - oldPos.y + offset.y / transform.scale); - - userInteraction = true; - - renderGraph(); - }, - onStop: function() { - layout.pinNode(node, wasPinned); - userInteraction = false; - } - }); - } - - function releaseNodeEvents(node) { - inputManager.bindDragNDrop(node, null); - } - - function initDom() { - graphics.init(container); - - graph.forEachNode(createNodeUi); - - if (settings.renderLinks) { - graph.forEachLink(createLinkUi); - } - } - - function releaseDom() { - graphics.release(container); - } - - function processNodeChange(change) { - var node = change.node; - - if (change.changeType === 'add') { - createNodeUi(node); - listenNodeEvents(node); - if (updateCenterRequired) { - updateCenter(); - } - } else if (change.changeType === 'remove') { - releaseNodeEvents(node); - removeNodeUi(node); - if (graph.getNodesCount() === 0) { - updateCenterRequired = true; // Next time when node is added - center the graph. - } - } else if (change.changeType === 'update') { - releaseNodeEvents(node); - removeNodeUi(node); - - createNodeUi(node); - listenNodeEvents(node); - } - } - - function processLinkChange(change) { - var link = change.link; - if (change.changeType === 'add') { - if (settings.renderLinks) { - createLinkUi(link); - } - } else if (change.changeType === 'remove') { - if (settings.renderLinks) { - removeLinkUi(link); - } - } else if (change.changeType === 'update') { - throw 'Update type is not implemented. TODO: Implement me!'; - } - } - - function onGraphChanged(changes) { - var i, change; - for (i = 0; i < changes.length; i += 1) { - change = changes[i]; - if (change.node) { - processNodeChange(change); - } else if (change.link) { - processLinkChange(change); - } - } - - resetStable(); - } - - function onWindowResized() { - updateCenter(); - onRenderFrame(); - } - - function releaseContainerDragManager() { - if (containerDrag) { - containerDrag.release(); - containerDrag = null; - } - } - - function releaseGraphEvents() { - graph.off('changed', onGraphChanged); - } - - function scale(out, scrollPoint) { - if (!scrollPoint) { - var containerSize = getDimension(container); - scrollPoint = { - x: containerSize.width / 2, - y: containerSize.height / 2 - }; - } - var scaleFactor = Math.pow(1 + 0.4, out ? -0.2 : 0.2); - transform.scale = graphics.scale(scaleFactor, scrollPoint); - - renderGraph(); - publicEvents.fire('scale', transform.scale); - - return transform.scale; - } - - function listenToEvents() { - windowEvents.on('resize', onWindowResized); - - releaseContainerDragManager(); - if (isInteractive('drag')) { - containerDrag = dragndrop(container); - containerDrag.onDrag(function(e, offset) { - graphics.translateRel(offset.x, offset.y); - - renderGraph(); - publicEvents.fire('drag', offset); - }); - } - - if (isInteractive('scroll')) { - if (!containerDrag) { - containerDrag = dragndrop(container); - } - containerDrag.onScroll(function(e, scaleOffset, scrollPoint) { - scale(scaleOffset < 0, scrollPoint); - }); - } - - graph.forEachNode(listenNodeEvents); - - releaseGraphEvents(); - graph.on('changed', onGraphChanged); - } - - function stopListenToEvents() { - rendererInitialized = false; - releaseGraphEvents(); - releaseContainerDragManager(); - windowEvents.off('resize', onWindowResized); - publicEvents.off(); - animationTimer.stop(); - - graph.forEachLink(function(link) { - if (settings.renderLinks) { - removeLinkUi(link); - } - }); - - graph.forEachNode(function(node) { - releaseNodeEvents(node); - removeNodeUi(node); - }); - - layout.dispose(); - releaseDom(); - } -} +/** + * @fileOverview Defines a graph renderer that uses CSS based drawings. + * + * @author Andrei Kashcha (aka anvaka) / https://github.com/anvaka + */ -},{"../Input/domInputManager.js":34,"../Input/dragndrop.js":35,"../Utils/getDimensions.js":42,"../Utils/timer.js":46,"../Utils/windowEvents.js":47,"./svgGraphics.js":49,"ngraph.events":7,"ngraph.forcelayout":9}],49:[function(require,module,exports){ -/** - * @fileOverview Defines a graph renderer that uses SVG based drawings. - * - * @author Andrei Kashcha (aka anvaka) / http://anvaka.blogspot.com - */ - -module.exports = svgGraphics; - -var svg = require('simplesvg'); -var eventify = require('ngraph.events'); -var domInputManager = require('../Input/domInputManager.js'); - -/** - * Performs svg-based graph rendering. This module does not perform - * layout, but only visualizes nodes and edges of the graph. - */ -function svgGraphics() { - var svgContainer, - svgRoot, - offsetX = 0, - offsetY = 0, - initCallback, - actualScale = 1, - allNodes = {}, - allLinks = {}, -/*jshint unused: false */ - nodeBuilder = function (node) { - return svg("rect") - .attr("width", 10) - .attr("height", 10) - .attr("fill", "#00a2e8"); - }, - - nodePositionCallback = function (nodeUI, pos) { - // TODO: Remove magic 5. It should be half of the width or height of the node. - nodeUI.attr("x", pos.x - 5) - .attr("y", pos.y - 5); - }, - - linkBuilder = function (link) { - return svg("line").attr("stroke", "#999"); - }, - - linkPositionCallback = function (linkUI, fromPos, toPos) { - linkUI.attr("x1", fromPos.x) - .attr("y1", fromPos.y) - .attr("x2", toPos.x) - .attr("y2", toPos.y); - }, - - fireRescaled = function (graphics) { - // TODO: maybe we shall copy changes? - graphics.fire("rescaled"); - }, - - cachedPos = {x : 0, y: 0}, - cachedFromPos = {x : 0, y: 0}, - cachedToPos = {x : 0, y: 0}, - - updateTransform = function () { - if (svgContainer) { - var transform = "matrix(" + actualScale + ", 0, 0," + actualScale + "," + offsetX + "," + offsetY + ")"; - svgContainer.attr("transform", transform); - } - }; - - svgRoot = createSvgRoot(); - - var graphics = { - getNodeUI: function (nodeId) { - return allNodes[nodeId]; - }, - - getLinkUI: function (linkId) { - return allLinks[linkId]; - }, - - /** - * Sets the callback that creates node representation. - * - * @param builderCallback a callback function that accepts graph node - * as a parameter and must return an element representing this node. - * - * @returns If builderCallbackOrNode is a valid callback function, instance of this is returned; - * Otherwise undefined value is returned - */ - node : function (builderCallback) { - if (typeof builderCallback !== "function") { - return; // todo: throw? This is not compatible with old versions - } - - nodeBuilder = builderCallback; - - return this; - }, - - /** - * Sets the callback that creates link representation - * - * @param builderCallback a callback function that accepts graph link - * as a parameter and must return an element representing this link. - * - * @returns If builderCallback is a valid callback function, instance of this is returned; - * Otherwise undefined value is returned. - */ - link : function (builderCallback) { - if (typeof builderCallback !== "function") { - return; // todo: throw? This is not compatible with old versions - } - - linkBuilder = builderCallback; - return this; - }, - - /** - * Allows to override default position setter for the node with a new - * function. newPlaceCallback(nodeUI, position, node) is function which - * is used by updateNodePosition(). - */ - placeNode : function (newPlaceCallback) { - nodePositionCallback = newPlaceCallback; - return this; - }, - - placeLink : function (newPlaceLinkCallback) { - linkPositionCallback = newPlaceLinkCallback; - return this; - }, - - /** - * Called every before renderer starts rendering. - */ - beginRender : function () {}, - - /** - * Called every time when renderer finishes one step of rendering. - */ - endRender : function () {}, - - /** - * Sets translate operation that should be applied to all nodes and links. - */ - graphCenterChanged : function (x, y) { - offsetX = x; - offsetY = y; - updateTransform(); - }, - - /** - * Default input manager listens to DOM events to process nodes drag-n-drop - */ - inputManager : domInputManager, - - translateRel : function (dx, dy) { - var p = svgRoot.createSVGPoint(), - t = svgContainer.getCTM(), - origin = svgRoot.createSVGPoint().matrixTransform(t.inverse()); - - p.x = dx; - p.y = dy; - - p = p.matrixTransform(t.inverse()); - p.x = (p.x - origin.x) * t.a; - p.y = (p.y - origin.y) * t.d; - - t.e += p.x; - t.f += p.y; - - var transform = "matrix(" + t.a + ", 0, 0," + t.d + "," + t.e + "," + t.f + ")"; - svgContainer.attr("transform", transform); - }, - - scale : function (scaleFactor, scrollPoint) { - var p = svgRoot.createSVGPoint(); - p.x = scrollPoint.x; - p.y = scrollPoint.y; - - p = p.matrixTransform(svgContainer.getCTM().inverse()); // translate to SVG coordinates - - // Compute new scale matrix in current mouse position - var k = svgRoot.createSVGMatrix().translate(p.x, p.y).scale(scaleFactor).translate(-p.x, -p.y), - t = svgContainer.getCTM().multiply(k); - - actualScale = t.a; - offsetX = t.e; - offsetY = t.f; - var transform = "matrix(" + t.a + ", 0, 0," + t.d + "," + t.e + "," + t.f + ")"; - svgContainer.attr("transform", transform); - - fireRescaled(this); - return actualScale; - }, - - resetScale : function () { - actualScale = 1; - var transform = "matrix(1, 0, 0, 1, 0, 0)"; - svgContainer.attr("transform", transform); - fireRescaled(this); - return this; - }, - - /** - * Called by Viva.Graph.View.renderer to let concrete graphic output - * provider prepare to render. - */ - init : function (container) { - container.appendChild(svgRoot); - updateTransform(); - // Notify the world if someone waited for update. TODO: should send an event - if (typeof initCallback === "function") { - initCallback(svgRoot); - } - }, - - /** - * Called by Viva.Graph.View.renderer to let concrete graphic output - * provider release occupied resources. - */ - release : function (container) { - if (svgRoot && container) { - container.removeChild(svgRoot); - } - }, - - /** - * Called by Viva.Graph.View.renderer to let concrete graphic output - * provider prepare to render given link of the graph - * - * @param link - model of a link - */ - addLink: function (link, pos) { - var linkUI = linkBuilder(link); - if (!linkUI) { return; } - linkUI.position = pos; - linkUI.link = link; - allLinks[link.id] = linkUI; - if (svgContainer.childElementCount > 0) { - svgContainer.insertBefore(linkUI, svgContainer.firstChild); - } else { - svgContainer.appendChild(linkUI); - } - return linkUI; - }, - - /** - * Called by Viva.Graph.View.renderer to let concrete graphic output - * provider remove link from rendering surface. - * - * @param linkUI visual representation of the link created by link() execution. - **/ - releaseLink : function (link) { - var linkUI = allLinks[link.id]; - if (linkUI) { - svgContainer.removeChild(linkUI); - delete allLinks[link.id]; - } - }, - - /** - * Called by Viva.Graph.View.renderer to let concrete graphic output - * provider prepare to render given node of the graph. - * - * @param nodeUI visual representation of the node created by node() execution. - **/ - addNode : function (node, pos) { - var nodeUI = nodeBuilder(node); - if (!nodeUI) { - return; - } - nodeUI.position = pos; - nodeUI.node = node; - allNodes[node.id] = nodeUI; - - svgContainer.appendChild(nodeUI); - - return nodeUI; - }, - - /** - * Called by Viva.Graph.View.renderer to let concrete graphic output - * provider remove node from rendering surface. - * - * @param node graph's node - **/ - releaseNode : function (node) { - var nodeUI = allNodes[node.id]; - if (nodeUI) { - svgContainer.removeChild(nodeUI); - delete allNodes[node.id]; - } - }, - - renderNodes : function () { - for (var key in allNodes) { - if (allNodes.hasOwnProperty(key)) { - var nodeUI = allNodes[key]; - cachedPos.x = nodeUI.position.x; - cachedPos.y = nodeUI.position.y; - nodePositionCallback(nodeUI, cachedPos, nodeUI.node); - } - } - }, - - renderLinks : function () { - for (var key in allLinks) { - if (allLinks.hasOwnProperty(key)) { - var linkUI = allLinks[key]; - cachedFromPos.x = linkUI.position.from.x; - cachedFromPos.y = linkUI.position.from.y; - cachedToPos.x = linkUI.position.to.x; - cachedToPos.y = linkUI.position.to.y; - linkPositionCallback(linkUI, cachedFromPos, cachedToPos, linkUI.link); - } - } - }, - - /** - * Returns root element which hosts graphics. - */ - getGraphicsRoot : function (callbackWhenReady) { - // todo: should fire an event, instead of having this context. - if (typeof callbackWhenReady === "function") { - if (svgRoot) { - callbackWhenReady(svgRoot); - } else { - initCallback = callbackWhenReady; - } - } - return svgRoot; - }, - /** - * Returns root SVG element. - * - * Note: This is internal method specific to this renderer - */ - getSvgRoot : function () { - return svgRoot; - } - }; - - - // Let graphics fire events before we return it to the caller. - eventify(graphics); - - return graphics; - - function createSvgRoot() { - var svgRoot = svg("svg"); - - svgContainer = svg("g") - .attr("buffered-rendering", "dynamic"); - - svgRoot.appendChild(svgContainer); - return svgRoot; - } -} +module.exports = renderer; -},{"../Input/domInputManager.js":34,"ngraph.events":7,"simplesvg":28}],50:[function(require,module,exports){ -/** - * @fileOverview Defines a graph renderer that uses WebGL based drawings. - * - * @author Andrei Kashcha (aka anvaka) / https://github.com/anvaka - */ - -module.exports = webglGraphics; - -var webglInputManager = require('../Input/webglInputManager.js'); -var webglLinkProgram = require('../WebGL/webglLinkProgram.js'); -var webglNodeProgram = require('../WebGL/webglNodeProgram.js'); -var webglSquare = require('../WebGL/webglSquare.js'); -var webglLine = require('../WebGL/webglLine.js'); -var eventify = require('ngraph.events'); -var merge = require('ngraph.merge'); - -/** - * Performs webgl-based graph rendering. This module does not perform - * layout, but only visualizes nodes and edges of the graph. - * - * @param options - to customize graphics behavior. Currently supported parameter - * enableBlending - true by default, allows to use transparency in node/links colors. - * preserveDrawingBuffer - false by default, tells webgl to preserve drawing buffer. - * See https://www.khronos.org/registry/webgl/specs/1.0/#5.2 - */ - -function webglGraphics(options) { - options = merge(options, { - enableBlending : true, - preserveDrawingBuffer : false, - clearColor: false, - clearColorValue : { - r : 1, - g : 1, - b : 1, - a : 1 - } - }); - - var container, - graphicsRoot, - gl, - width, - height, - nodesCount = 0, - linksCount = 0, - transform = [ - 1, 0, 0, 0, - 0, 1, 0, 0, - 0, 0, 1, 0, - 0, 0, 0, 1 - ], - userPlaceNodeCallback, - userPlaceLinkCallback, - nodes = [], - links = [], - initCallback, - - allNodes = {}, - allLinks = {}, - linkProgram = webglLinkProgram(), - nodeProgram = webglNodeProgram(), -/*jshint unused: false */ - nodeUIBuilder = function (node) { - return webglSquare(); // Just make a square, using provided gl context (a nodeProgram); - }, - - linkUIBuilder = function (link) { - return webglLine(0xb3b3b3ff); - }, -/*jshint unused: true */ - updateTransformUniform = function () { - linkProgram.updateTransform(transform); - nodeProgram.updateTransform(transform); - }, - - resetScaleInternal = function () { - transform = [1, 0, 0, 0, - 0, 1, 0, 0, - 0, 0, 1, 0, - 0, 0, 0, 1]; - }, - - updateSize = function () { - if (container && graphicsRoot) { - width = graphicsRoot.width = Math.max(container.offsetWidth, 1); - height = graphicsRoot.height = Math.max(container.offsetHeight, 1); - if (gl) { gl.viewport(0, 0, width, height); } - if (linkProgram) { linkProgram.updateSize(width / 2, height / 2); } - if (nodeProgram) { nodeProgram.updateSize(width / 2, height / 2); } - } - }, - - fireRescaled = function (graphics) { - graphics.fire("rescaled"); - }; - - graphicsRoot = window.document.createElement("canvas"); - - var graphics = { - getLinkUI: function (linkId) { - return allLinks[linkId]; - }, - - getNodeUI: function (nodeId) { - return allNodes[nodeId]; - }, - - /** - * Sets the callback that creates node representation. - * - * @param builderCallback a callback function that accepts graph node - * as a parameter and must return an element representing this node. - * - * @returns If builderCallbackOrNode is a valid callback function, instance of this is returned; - * Otherwise undefined value is returned - */ - node : function (builderCallback) { - if (typeof builderCallback !== "function") { - return; // todo: throw? This is not compatible with old versions - } - - nodeUIBuilder = builderCallback; - - return this; - }, - - /** - * Sets the callback that creates link representation - * - * @param builderCallback a callback function that accepts graph link - * as a parameter and must return an element representing this link. - * - * @returns If builderCallback is a valid callback function, instance of this is returned; - * Otherwise undefined value is returned. - */ - link : function (builderCallback) { - if (typeof builderCallback !== "function") { - return; // todo: throw? This is not compatible with old versions - } - - linkUIBuilder = builderCallback; - return this; - }, - - - /** - * Allows to override default position setter for the node with a new - * function. newPlaceCallback(nodeUI, position) is function which - * is used by updateNodePosition(). - */ - placeNode : function (newPlaceCallback) { - userPlaceNodeCallback = newPlaceCallback; - return this; - }, - - placeLink : function (newPlaceLinkCallback) { - userPlaceLinkCallback = newPlaceLinkCallback; - return this; - }, - - /** - * Custom input manager listens to mouse events to process nodes drag-n-drop inside WebGL canvas - */ - inputManager : webglInputManager, - - /** - * Called every time before renderer starts rendering. - */ - beginRender : function () { - // this function could be replaced by this.init, - // based on user options. - }, - - /** - * Called every time when renderer finishes one step of rendering. - */ - endRender : function () { - if (linksCount > 0) { - linkProgram.render(); - } - if (nodesCount > 0) { - nodeProgram.render(); - } - }, - - bringLinkToFront : function (linkUI) { - var frontLinkId = linkProgram.getFrontLinkId(), - srcLinkId, - temp; - - linkProgram.bringToFront(linkUI); - - if (frontLinkId > linkUI.id) { - srcLinkId = linkUI.id; - - temp = links[frontLinkId]; - links[frontLinkId] = links[srcLinkId]; - links[frontLinkId].id = frontLinkId; - links[srcLinkId] = temp; - links[srcLinkId].id = srcLinkId; - } - }, - - /** - * Sets translate operation that should be applied to all nodes and links. - */ - graphCenterChanged : function (x, y) { - transform[12] = (2 * x / width) - 1; - transform[13] = 1 - (2 * y / height); - updateTransformUniform(); - }, - - /** - * Called by Viva.Graph.View.renderer to let concrete graphic output - * provider prepare to render given link of the graph - * - * @param link - model of a link - */ - addLink: function (link, boundPosition) { - var uiid = linksCount++, - ui = linkUIBuilder(link); - ui.id = uiid; - ui.pos = boundPosition; - - linkProgram.createLink(ui); - - links[uiid] = ui; - allLinks[link.id] = ui; - return ui; - }, - - /** - * Called by Viva.Graph.View.renderer to let concrete graphic output - * provider prepare to render given node of the graph. - * - * @param nodeUI visual representation of the node created by node() execution. - **/ - addNode : function (node, boundPosition) { - var uiid = nodesCount++, - ui = nodeUIBuilder(node); - - ui.id = uiid; - ui.position = boundPosition; - ui.node = node; - - nodeProgram.createNode(ui); - - nodes[uiid] = ui; - allNodes[node.id] = ui; - return ui; - }, - - translateRel : function (dx, dy) { - transform[12] += (2 * transform[0] * dx / width) / transform[0]; - transform[13] -= (2 * transform[5] * dy / height) / transform[5]; - updateTransformUniform(); - }, - - scale : function (scaleFactor, scrollPoint) { - // Transform scroll point to clip-space coordinates: - var cx = 2 * scrollPoint.x / width - 1, - cy = 1 - (2 * scrollPoint.y) / height; - - cx -= transform[12]; - cy -= transform[13]; - - transform[12] += cx * (1 - scaleFactor); - transform[13] += cy * (1 - scaleFactor); - - transform[0] *= scaleFactor; - transform[5] *= scaleFactor; - - updateTransformUniform(); - fireRescaled(this); - - return transform[0]; - }, - - resetScale : function () { - resetScaleInternal(); - - if (gl) { - updateSize(); - // TODO: what is this? - // gl.useProgram(linksProgram); - // gl.uniform2f(linksProgram.screenSize, width, height); - updateTransformUniform(); - } - return this; - }, - - /** - * Resizes the graphic without resetting the scale. - * Useful with viva graph in a dynamic container - */ - updateSize: updateSize, - - /** - * Called by Viva.Graph.View.renderer to let concrete graphic output - * provider prepare to render. - */ - init : function (c) { - var contextParameters = {}; - - if (options.preserveDrawingBuffer) { - contextParameters.preserveDrawingBuffer = true; - } - - container = c; - - updateSize(); - resetScaleInternal(); - container.appendChild(graphicsRoot); - - - gl = graphicsRoot.getContext("experimental-webgl", contextParameters); - if (!gl) { - var msg = "Could not initialize WebGL. Seems like the browser doesn't support it."; - window.alert(msg); - throw msg; - } - if (options.enableBlending) { - gl.blendFunc(gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA); - gl.enable(gl.BLEND); - } - if (options.clearColor) { - var color = options.clearColorValue; - gl.clearColor(color.r, color.g, color.b, color.a); - // TODO: not the best way, really. Should come up with something better - // what if we need more updates inside beginRender, like depth buffer? - this.beginRender = function () { - gl.clear(gl.COLOR_BUFFER_BIT); - }; - } - - linkProgram.load(gl); - linkProgram.updateSize(width / 2, height / 2); - - nodeProgram.load(gl); - nodeProgram.updateSize(width / 2, height / 2); - - updateTransformUniform(); - - // Notify the world if someone waited for update. TODO: should send an event - if (typeof initCallback === "function") { - initCallback(graphicsRoot); - } - }, - - /** - * Called by Viva.Graph.View.renderer to let concrete graphic output - * provider release occupied resources. - */ - release : function (container) { - if (graphicsRoot && container) { - container.removeChild(graphicsRoot); - // TODO: anything else? - } - }, - - /** - * Checks whether webgl is supported by this browser. - */ - isSupported : function () { - var c = window.document.createElement("canvas"), - gl = c && c.getContext && c.getContext("experimental-webgl"); - return gl; - }, - - /** - * Called by Viva.Graph.View.renderer to let concrete graphic output - * provider remove link from rendering surface. - * - * @param linkUI visual representation of the link created by link() execution. - **/ - releaseLink : function (link) { - if (linksCount > 0) { linksCount -= 1; } - var linkUI = allLinks[link.id]; - delete allLinks[link.id]; - - linkProgram.removeLink(linkUI); - - var linkIdToRemove = linkUI.id; - if (linkIdToRemove < linksCount) { - if (linksCount === 0 || linksCount === linkIdToRemove) { - return; // no more links or removed link is the last one. - } - - var lastLinkUI = links[linksCount]; - links[linkIdToRemove] = lastLinkUI; - lastLinkUI.id = linkIdToRemove; - } - }, - - /** - * Called by Viva.Graph.View.renderer to let concrete graphic output - * provider remove node from rendering surface. - * - * @param nodeUI visual representation of the node created by node() execution. - **/ - releaseNode : function (node) { - if (nodesCount > 0) { nodesCount -= 1; } - var nodeUI = allNodes[node.id]; - delete allNodes[node.id]; - - nodeProgram.removeNode(nodeUI); - - var nodeIdToRemove = nodeUI.id; - if (nodeIdToRemove < nodesCount) { - if (nodesCount === 0 || nodesCount === nodeIdToRemove) { - return; // no more nodes or removed node is the last in the list. - } - - var lastNodeUI = nodes[nodesCount]; - - nodes[nodeIdToRemove] = lastNodeUI; - lastNodeUI.id = nodeIdToRemove; - - // Since concrete shaders may cache properties in the UI element - // we are letting them to make this swap (e.g. image node shader - // uses this approach to update node's offset in the atlas) - nodeProgram.replaceProperties(nodeUI, lastNodeUI); - } - }, - - renderNodes: function () { - var pos = {x : 0, y : 0}; - // WebGL coordinate system is different. Would be better - // to have this transform in the shader code, but it would - // require every shader to be updated.. - for (var i = 0; i < nodesCount; ++i) { - var ui = nodes[i]; - pos.x = ui.position.x; - pos.y = ui.position.y; - if (userPlaceNodeCallback) { - userPlaceNodeCallback(ui, pos); - } - - nodeProgram.position(ui, pos); - } - }, - - renderLinks: function () { - if (this.omitLinksRendering) { return; } - - var toPos = {x : 0, y : 0}; - var fromPos = {x : 0, y : 0}; - for (var i = 0; i < linksCount; ++i) { - var ui = links[i]; - var pos = ui.pos.from; - fromPos.x = pos.x; - fromPos.y = -pos.y; - pos = ui.pos.to; - toPos.x = pos.x; - toPos.y = -pos.y; - if (userPlaceLinkCallback) { - userPlaceLinkCallback(ui, fromPos, toPos); - } - - linkProgram.position(ui, fromPos, toPos); - } - }, - - /** - * Returns root element which hosts graphics. - */ - getGraphicsRoot : function (callbackWhenReady) { - // todo: should fire an event, instead of having this context. - if (typeof callbackWhenReady === "function") { - if (graphicsRoot) { - callbackWhenReady(graphicsRoot); - } else { - initCallback = callbackWhenReady; - } - } - return graphicsRoot; - }, - - /** - * Updates default shader which renders nodes - * - * @param newProgram to use for nodes. - */ - setNodeProgram : function (newProgram) { - if (!gl && newProgram) { - // Nothing created yet. Just set shader to the new one - // and let initialization logic take care about the rest. - nodeProgram = newProgram; - } else if (newProgram) { - throw "Not implemented. Cannot swap shader on the fly... Yet."; - // TODO: unload old shader and reinit. - } - }, - - /** - * Updates default shader which renders links - * - * @param newProgram to use for links. - */ - setLinkProgram : function (newProgram) { - if (!gl && newProgram) { - // Nothing created yet. Just set shader to the new one - // and let initialization logic take care about the rest. - linkProgram = newProgram; - } else if (newProgram) { - throw "Not implemented. Cannot swap shader on the fly... Yet."; - // TODO: unload old shader and reinit. - } - }, - - /** - * Transforms client coordinates into layout coordinates. Client coordinates - * are DOM coordinates relative to the rendering container. Layout - * coordinates are those assigned by by layout algorithm to each node. - * - * @param {Object} p - a point object with `x` and `y` attributes. - * This method mutates p. - */ - transformClientToGraphCoordinates: function (p) { - // TODO: could be a problem when container has margins? - // normalize - p.x = ((2 * p.x) / width) - 1; - p.y = 1 - ((2 * p.y) / height); - - // apply transform - p.x = (p.x - transform[12]) / transform[0]; - p.y = (p.y - transform[13]) / transform[5]; - - // transform to graph coordinates - p.x = p.x * (width / 2); - p.y = p.y * (-height / 2); - - return p; - }, - - /** - * Transforms WebGL coordinates into client coordinates. Reverse of - * `transformClientToGraphCoordinates()` - * - * @param {Object} p - a point object with `x` and `y` attributes, which - * represents a layout coordinate. This method mutates p. - */ - transformGraphToClientCoordinates: function (p) { - // TODO: could be a problem when container has margins? - // transform from graph coordinates - p.x = p.x / (width / 2); - p.y = p.y / (-height / 2); - - // apply transform - p.x = (p.x * transform[0]) + transform[12]; - p.y = (p.y * transform[5]) + transform[13]; - - // denormalize - p.x = ((p.x + 1) * width) / 2; - p.y = ((1 - p.y) * height) / 2; - - return p; - }, - - getNodeAtClientPos: function (clientPos, preciseCheck) { - if (typeof preciseCheck !== "function") { - // we don't know anything about your node structure here :( - // potentially this could be delegated to node program, but for - // right now, we are giving up if you don't pass boundary check - // callback. It answers to a question is nodeUI covers (x, y) - return null; - } - // first transform to graph coordinates: - this.transformClientToGraphCoordinates(clientPos); - // now using precise check iterate over each node and find one within box: - // TODO: This is poor O(N) performance. - for (var i = 0; i < nodesCount; ++i) { - if (preciseCheck(nodes[i], clientPos.x, clientPos.y)) { - return nodes[i].node; - } - } - return null; - } - }; - - // Let graphics fire events before we return it to the caller. - eventify(graphics); - - return graphics; -} +var eventify = require('ngraph.events'); +var forceDirected = require('ngraph.forcelayout'); +var svgGraphics = require('./svgGraphics.js'); +var windowEvents = require('../Utils/windowEvents.js'); +var domInputManager = require('../Input/domInputManager.js'); +var timer = require('../Utils/timer.js'); +var getDimension = require('../Utils/getDimensions.js'); +var dragndrop = require('../Input/dragndrop.js'); -},{"../Input/webglInputManager.js":36,"../WebGL/webglLine.js":58,"../WebGL/webglLinkProgram.js":59,"../WebGL/webglNodeProgram.js":60,"../WebGL/webglSquare.js":61,"ngraph.events":7,"ngraph.merge":13}],51:[function(require,module,exports){ -module.exports = parseColor; +/** + * This is heart of the rendering. Class accepts graph to be rendered and rendering settings. + * It monitors graph changes and depicts them accordingly. + * + * @param graph - Viva.Graph.graph() object to be rendered. + * @param settings - rendering settings, composed from the following parts (with their defaults shown): + * settings = { + * // Represents a module that is capable of displaying graph nodes and links. + * // all graphics has to correspond to defined interface and can be later easily + * // replaced for specific needs (e.g. adding WebGL should be piece of cake as long + * // as WebGL has implemented required interface). See svgGraphics for example. + * graphics : Viva.Graph.View.svgGraphics(), + * + * // Where the renderer should draw graph. Container size matters, because + * // renderer will attempt center graph to that size. Also graphics modules + * // might depend on it. + * container : document.body, + * + * // Defines whether graph can respond to use input + * interactive: true, + * + * // Layout algorithm to be used. The algorithm is expected to comply with defined + * // interface and is expected to be iterative. Renderer will use it then to calculate + * // grpaph's layout. For examples of the interface refer to Viva.Graph.Layout.forceDirected() + * layout : Viva.Graph.Layout.forceDirected(), + * + * // Directs renderer to display links. Usually rendering links is the slowest part of this + * // library. So if you don't need to display links, consider settings this property to false. + * renderLinks : true, + * + * // Number of layout iterations to run before displaying the graph. The bigger you set this number + * // the closer to ideal position graph will appear first time. But be careful: for large graphs + * // it can freeze the browser. + * prerender : 0 + * } + */ +function renderer(graph, settings) { + // TODO: This class is getting hard to understand. Consider refactoring. + // TODO: I have a technical debt here: fix scaling/recentering! Currently it's a total mess. + var FRAME_INTERVAL = 30; + + settings = settings || {}; + + var layout = settings.layout, + graphics = settings.graphics, + container = settings.container, + interactive = settings.interactive !== undefined ? settings.interactive : true, + inputManager, + animationTimer, + rendererInitialized = false, + updateCenterRequired = true, + + currentStep = 0, + totalIterationsCount = 0, + isStable = false, + userInteraction = false, + isPaused = false, + + transform = { + offsetX: 0, + offsetY: 0, + scale: 1 + }, -function parseColor(color) { - var parsedColor = 0x009ee8ff; + publicEvents = eventify({}), + containerDrag; - if (typeof color === 'string' && color) { - if (color.length === 4) { // #rgb - color = color.replace(/([^#])/g, '$1$1'); // duplicate each letter except first #. - } - if (color.length === 9) { // #rrggbbaa - parsedColor = parseInt(color.substr(1), 16); - } else if (color.length === 7) { // or #rrggbb. - parsedColor = (parseInt(color.substr(1), 16) << 8) | 0xff; - } else { - throw 'Color expected in hex format with preceding "#". E.g. #00ff00. Got value: ' + color; - } - } else if (typeof color === 'number') { - parsedColor = color; - } + return { + /** + * Performs rendering of the graph. + * + * @param iterationsCount if specified renderer will run only given number of iterations + * and then stop. Otherwise graph rendering is performed infinitely. + * + * Note: if rendering stopped by used started dragging nodes or new nodes were added to the + * graph renderer will give run more iterations to reflect changes. + */ + run: function(iterationsCount) { - return parsedColor; -} + if (!rendererInitialized) { + prepareSettings(); + prerender(); -},{}],52:[function(require,module,exports){ -module.exports = Texture; + initDom(); + updateCenter(); + listenToEvents(); -/** - * Single texture in the webglAtlas. - */ -function Texture(size) { - this.canvas = window.document.createElement("canvas"); - this.ctx = this.canvas.getContext("2d"); - this.isDirty = false; - this.canvas.width = this.canvas.height = size; -} + rendererInitialized = true; + } -},{}],53:[function(require,module,exports){ -/** - * @fileOverview Utility functions for webgl rendering. - * - * @author Andrei Kashcha (aka anvaka) / http://anvaka.blogspot.com - */ + renderIterations(iterationsCount); -module.exports = webgl; + return this; + }, -function webgl(gl) { + reset: function() { + graphics.resetScale(); + updateCenter(); + transform.scale = 1; + }, - return { - createProgram: createProgram, - extendArray: extendArray, - copyArrayPart: copyArrayPart, - swapArrayPart: swapArrayPart, - getLocations: getLocations, - context: gl - }; + pause: function() { + isPaused = true; + animationTimer.stop(); + }, - function createShader(shaderText, type) { - var shader = gl.createShader(type); - gl.shaderSource(shader, shaderText); - gl.compileShader(shader); + resume: function() { + isPaused = false; + animationTimer.restart(); + }, - if (!gl.getShaderParameter(shader, gl.COMPILE_STATUS)) { - var msg = gl.getShaderInfoLog(shader); - window.alert(msg); - throw msg; - } + rerender: function() { + renderGraph(); + return this; + }, - return shader; - } + zoomOut: function() { + return scale(true); + }, - function createProgram(vertexShaderSrc, fragmentShaderSrc) { - var program = gl.createProgram(); - var vs = createShader(vertexShaderSrc, gl.VERTEX_SHADER); - var fs = createShader(fragmentShaderSrc, gl.FRAGMENT_SHADER); + zoomIn: function() { + return scale(false); + }, - gl.attachShader(program, vs); - gl.attachShader(program, fs); - gl.linkProgram(program); + /** + * Centers renderer at x,y graph's coordinates + */ + moveTo: function(x, y) { + graphics.graphCenterChanged(transform.offsetX - x * transform.scale, transform.offsetY - y * transform.scale); + renderGraph(); + }, - if (!gl.getProgramParameter(program, gl.LINK_STATUS)) { - var msg = gl.getShaderInfoLog(program); - window.alert(msg); - throw msg; + /** + * Gets current graphics object + */ + getGraphics: function() { + return graphics; + }, + + /** + * Removes this renderer and deallocates all resources/timers + */ + dispose: function() { + stopListenToEvents(); // I quit! + }, + + on: function(eventName, callback) { + publicEvents.on(eventName, callback); + return this; + }, + + off: function(eventName, callback) { + publicEvents.off(eventName, callback); + return this; } + }; - return program; + /** + * Checks whether given interaction (node/scroll) is enabled + */ + function isInteractive(interactionName) { + if (typeof interactive === 'string') { + return interactive.indexOf(interactionName) >= 0; + } else if (typeof interactive === 'boolean') { + return interactive; + } + return true; // default setting } - function extendArray(buffer, itemsInBuffer, elementsPerItem) { - if ((itemsInBuffer + 1) * elementsPerItem > buffer.length) { - // Every time we run out of space create new array twice bigger. - // TODO: it seems buffer size is limited. Consider using multiple arrays for huge graphs - var extendedArray = new Float32Array(buffer.length * elementsPerItem * 2); - extendedArray.set(buffer); + function prepareSettings() { + container = container || window.document.body; + layout = layout || forceDirected(graph, { + springLength: 80, + springCoeff: 0.0002, + }); + graphics = graphics || svgGraphics(graph, { + container: container + }); - return extendedArray; + if (!settings.hasOwnProperty('renderLinks')) { + settings.renderLinks = true; } - return buffer; + settings.prerender = settings.prerender || 0; + inputManager = (graphics.inputManager || domInputManager)(graph, graphics); } - function getLocations(program, uniformOrAttributeNames) { - var foundLocations = {}; - for (var i = 0; i < uniformOrAttributeNames.length; ++i) { - var name = uniformOrAttributeNames[i]; - var location = -1; - if (name[0] === 'a' && name[1] === '_') { - location = gl.getAttribLocation(program, name); - if (location === -1) { - throw new Error("Program doesn't have required attribute: " + name); - } - - foundLocations[name.slice(2)] = location; - } else if (name[0] === 'u' && name[1] === '_') { - location = gl.getUniformLocation(program, name); - if (location === null) { - throw new Error("Program doesn't have required uniform: " + name); - } + function renderGraph() { + graphics.beginRender(); - foundLocations[name.slice(2)] = location; - } else { - throw new Error("Couldn't figure out your intent. All uniforms should start with 'u_' prefix, and attributes with 'a_'"); - } + // todo: move this check graphics + if (settings.renderLinks) { + graphics.renderLinks(); } - - return foundLocations; + graphics.renderNodes(); + graphics.endRender(); } -} -function copyArrayPart(array, to, from, elementsCount) { - for (var i = 0; i < elementsCount; ++i) { - array[to + i] = array[from + i]; + function onRenderFrame() { + isStable = layout.step() && !userInteraction; + renderGraph(); + + return !isStable; } -} -function swapArrayPart(array, from, to, elementsCount) { - for (var i = 0; i < elementsCount; ++i) { - var tmp = array[from + i]; + function renderIterations(iterationsCount) { + if (animationTimer) { + totalIterationsCount += iterationsCount; + return; + } + + if (iterationsCount) { + totalIterationsCount += iterationsCount; + + animationTimer = timer(function() { + return onRenderFrame(); + }, FRAME_INTERVAL); + } else { + currentStep = 0; + totalIterationsCount = 0; + animationTimer = timer(onRenderFrame, FRAME_INTERVAL); + } + } + + function resetStable() { + if (isPaused) { + return; + } + + isStable = false; + animationTimer.restart(); + } + + function prerender() { + // To get good initial positions for the graph + // perform several prerender steps in background. + if (typeof settings.prerender === 'number' && settings.prerender > 0) { + for (var i = 0; i < settings.prerender; i += 1) { + layout.step(); + } + } + } + + function updateCenter() { + var graphRect = layout.getGraphRect(), + containerSize = getDimension(container); + + var cx = (graphRect.x2 + graphRect.x1) / 2; + var cy = (graphRect.y2 + graphRect.y1) / 2; + transform.offsetX = containerSize.width / 2 - (cx * transform.scale - cx); + transform.offsetY = containerSize.height / 2 - (cy * transform.scale - cy); + graphics.graphCenterChanged(transform.offsetX, transform.offsetY); + + updateCenterRequired = false; + } + + function createNodeUi(node) { + var nodePosition = layout.getNodePosition(node.id); + graphics.addNode(node, nodePosition); + } + + function removeNodeUi(node) { + graphics.releaseNode(node); + } + + function createLinkUi(link) { + var linkPosition = layout.getLinkPosition(link.id); + graphics.addLink(link, linkPosition); + } + + function removeLinkUi(link) { + graphics.releaseLink(link); + } + + function listenNodeEvents(node) { + if (!isInteractive('node')) { + return; + } + + var wasPinned = false; + + // TODO: This may not be memory efficient. Consider reusing handlers object. + inputManager.bindDragNDrop(node, { + onStart: function() { + wasPinned = layout.isNodePinned(node); + layout.pinNode(node, true); + userInteraction = true; + resetStable(); + }, + onDrag: function(e, offset) { + var oldPos = layout.getNodePosition(node.id); + layout.setNodePosition(node.id, + oldPos.x + offset.x / transform.scale, + oldPos.y + offset.y / transform.scale); + + userInteraction = true; + + renderGraph(); + }, + onStop: function() { + layout.pinNode(node, wasPinned); + userInteraction = false; + } + }); + } + + function releaseNodeEvents(node) { + inputManager.bindDragNDrop(node, null); + } + + function initDom() { + graphics.init(container); + + graph.forEachNode(createNodeUi); + + if (settings.renderLinks) { + graph.forEachLink(createLinkUi); + } + } + + function releaseDom() { + graphics.release(container); + } + + function processNodeChange(change) { + var node = change.node; + + if (change.changeType === 'add') { + createNodeUi(node); + listenNodeEvents(node); + if (updateCenterRequired) { + updateCenter(); + } + } else if (change.changeType === 'remove') { + releaseNodeEvents(node); + removeNodeUi(node); + if (graph.getNodesCount() === 0) { + updateCenterRequired = true; // Next time when node is added - center the graph. + } + } else if (change.changeType === 'update') { + releaseNodeEvents(node); + removeNodeUi(node); + + createNodeUi(node); + listenNodeEvents(node); + } + } + + function processLinkChange(change) { + var link = change.link; + if (change.changeType === 'add') { + if (settings.renderLinks) { + createLinkUi(link); + } + } else if (change.changeType === 'remove') { + if (settings.renderLinks) { + removeLinkUi(link); + } + } else if (change.changeType === 'update') { + throw 'Update type is not implemented. TODO: Implement me!'; + } + } + + function onGraphChanged(changes) { + var i, change; + for (i = 0; i < changes.length; i += 1) { + change = changes[i]; + if (change.node) { + processNodeChange(change); + } else if (change.link) { + processLinkChange(change); + } + } + + resetStable(); + } + + function onWindowResized() { + updateCenter(); + onRenderFrame(); + } + + function releaseContainerDragManager() { + if (containerDrag) { + containerDrag.release(); + containerDrag = null; + } + } + + function releaseGraphEvents() { + graph.off('changed', onGraphChanged); + } + + function scale(out, scrollPoint) { + if (!scrollPoint) { + var containerSize = getDimension(container); + scrollPoint = { + x: containerSize.width / 2, + y: containerSize.height / 2 + }; + } + var scaleFactor = Math.pow(1 + 0.4, out ? -0.2 : 0.2); + transform.scale = graphics.scale(scaleFactor, scrollPoint); + + renderGraph(); + publicEvents.fire('scale', transform.scale); + + return transform.scale; + } + + function listenToEvents() { + windowEvents.on('resize', onWindowResized); + + releaseContainerDragManager(); + if (isInteractive('drag')) { + containerDrag = dragndrop(container); + containerDrag.onDrag(function(e, offset) { + graphics.translateRel(offset.x, offset.y); + + renderGraph(); + publicEvents.fire('drag', offset); + }); + } + + if (isInteractive('scroll')) { + if (!containerDrag) { + containerDrag = dragndrop(container); + } + containerDrag.onScroll(function(e, scaleOffset, scrollPoint) { + scale(scaleOffset < 0, scrollPoint); + }); + } + + graph.forEachNode(listenNodeEvents); + + releaseGraphEvents(); + graph.on('changed', onGraphChanged); + } + + function stopListenToEvents() { + rendererInitialized = false; + releaseGraphEvents(); + releaseContainerDragManager(); + windowEvents.off('resize', onWindowResized); + publicEvents.off(); + animationTimer.stop(); + + graph.forEachLink(function(link) { + if (settings.renderLinks) { + removeLinkUi(link); + } + }); + + graph.forEachNode(function(node) { + releaseNodeEvents(node); + removeNodeUi(node); + }); + + layout.dispose(); + releaseDom(); + } +} + +},{"../Input/domInputManager.js":34,"../Input/dragndrop.js":35,"../Utils/getDimensions.js":42,"../Utils/timer.js":46,"../Utils/windowEvents.js":47,"./svgGraphics.js":49,"ngraph.events":7,"ngraph.forcelayout":9}],49:[function(require,module,exports){ +/** + * @fileOverview Defines a graph renderer that uses SVG based drawings. + * + * @author Andrei Kashcha (aka anvaka) / https://github.com/anvaka + */ + +module.exports = svgGraphics; + +var svg = require('simplesvg'); +var eventify = require('ngraph.events'); +var domInputManager = require('../Input/domInputManager.js'); + +/** + * Performs svg-based graph rendering. This module does not perform + * layout, but only visualizes nodes and edges of the graph. + */ +function svgGraphics() { + var svgContainer, + svgRoot, + offsetX = 0, + offsetY = 0, + initCallback, + actualScale = 1, + allNodes = {}, + allLinks = {}, +/*jshint unused: false */ + nodeBuilder = function (node) { + return svg("rect") + .attr("width", 10) + .attr("height", 10) + .attr("fill", "#00a2e8"); + }, + + nodePositionCallback = function (nodeUI, pos) { + // TODO: Remove magic 5. It should be half of the width or height of the node. + nodeUI.attr("x", pos.x - 5) + .attr("y", pos.y - 5); + }, + + linkBuilder = function (link) { + return svg("line").attr("stroke", "#999"); + }, + + linkPositionCallback = function (linkUI, fromPos, toPos) { + linkUI.attr("x1", fromPos.x) + .attr("y1", fromPos.y) + .attr("x2", toPos.x) + .attr("y2", toPos.y); + }, + + fireRescaled = function (graphics) { + // TODO: maybe we shall copy changes? + graphics.fire("rescaled"); + }, + + cachedPos = {x : 0, y: 0}, + cachedFromPos = {x : 0, y: 0}, + cachedToPos = {x : 0, y: 0}, + + updateTransform = function () { + if (svgContainer) { + var transform = "matrix(" + actualScale + ", 0, 0," + actualScale + "," + offsetX + "," + offsetY + ")"; + svgContainer.attr("transform", transform); + } + }; + + svgRoot = createSvgRoot(); + + var graphics = { + getNodeUI: function (nodeId) { + return allNodes[nodeId]; + }, + + getLinkUI: function (linkId) { + return allLinks[linkId]; + }, + + /** + * Sets the callback that creates node representation. + * + * @param builderCallback a callback function that accepts graph node + * as a parameter and must return an element representing this node. + * + * @returns If builderCallbackOrNode is a valid callback function, instance of this is returned; + * Otherwise undefined value is returned + */ + node : function (builderCallback) { + if (typeof builderCallback !== "function") { + return; // todo: throw? This is not compatible with old versions + } + + nodeBuilder = builderCallback; + + return this; + }, + + /** + * Sets the callback that creates link representation + * + * @param builderCallback a callback function that accepts graph link + * as a parameter and must return an element representing this link. + * + * @returns If builderCallback is a valid callback function, instance of this is returned; + * Otherwise undefined value is returned. + */ + link : function (builderCallback) { + if (typeof builderCallback !== "function") { + return; // todo: throw? This is not compatible with old versions + } + + linkBuilder = builderCallback; + return this; + }, + + /** + * Allows to override default position setter for the node with a new + * function. newPlaceCallback(nodeUI, position, node) is function which + * is used by updateNodePosition(). + */ + placeNode : function (newPlaceCallback) { + nodePositionCallback = newPlaceCallback; + return this; + }, + + placeLink : function (newPlaceLinkCallback) { + linkPositionCallback = newPlaceLinkCallback; + return this; + }, + + /** + * Called every before renderer starts rendering. + */ + beginRender : function () {}, + + /** + * Called every time when renderer finishes one step of rendering. + */ + endRender : function () {}, + + /** + * Sets translate operation that should be applied to all nodes and links. + */ + graphCenterChanged : function (x, y) { + offsetX = x; + offsetY = y; + updateTransform(); + }, + + /** + * Default input manager listens to DOM events to process nodes drag-n-drop + */ + inputManager : domInputManager, + + translateRel : function (dx, dy) { + var p = svgRoot.createSVGPoint(), + t = svgContainer.getCTM(), + origin = svgRoot.createSVGPoint().matrixTransform(t.inverse()); + + p.x = dx; + p.y = dy; + + p = p.matrixTransform(t.inverse()); + p.x = (p.x - origin.x) * t.a; + p.y = (p.y - origin.y) * t.d; + + t.e += p.x; + t.f += p.y; + + var transform = "matrix(" + t.a + ", 0, 0," + t.d + "," + t.e + "," + t.f + ")"; + svgContainer.attr("transform", transform); + }, + + scale : function (scaleFactor, scrollPoint) { + var p = svgRoot.createSVGPoint(); + p.x = scrollPoint.x; + p.y = scrollPoint.y; + + p = p.matrixTransform(svgContainer.getCTM().inverse()); // translate to SVG coordinates + + // Compute new scale matrix in current mouse position + var k = svgRoot.createSVGMatrix().translate(p.x, p.y).scale(scaleFactor).translate(-p.x, -p.y), + t = svgContainer.getCTM().multiply(k); + + actualScale = t.a; + offsetX = t.e; + offsetY = t.f; + var transform = "matrix(" + t.a + ", 0, 0," + t.d + "," + t.e + "," + t.f + ")"; + svgContainer.attr("transform", transform); + + fireRescaled(this); + return actualScale; + }, + + resetScale : function () { + actualScale = 1; + var transform = "matrix(1, 0, 0, 1, 0, 0)"; + svgContainer.attr("transform", transform); + fireRescaled(this); + return this; + }, + + /** + * Called by Viva.Graph.View.renderer to let concrete graphic output + * provider prepare to render. + */ + init : function (container) { + container.appendChild(svgRoot); + updateTransform(); + // Notify the world if someone waited for update. TODO: should send an event + if (typeof initCallback === "function") { + initCallback(svgRoot); + } + }, + + /** + * Called by Viva.Graph.View.renderer to let concrete graphic output + * provider release occupied resources. + */ + release : function (container) { + if (svgRoot && container) { + container.removeChild(svgRoot); + } + }, + + /** + * Called by Viva.Graph.View.renderer to let concrete graphic output + * provider prepare to render given link of the graph + * + * @param link - model of a link + */ + addLink: function (link, pos) { + var linkUI = linkBuilder(link); + if (!linkUI) { return; } + linkUI.position = pos; + linkUI.link = link; + allLinks[link.id] = linkUI; + if (svgContainer.childElementCount > 0) { + svgContainer.insertBefore(linkUI, svgContainer.firstChild); + } else { + svgContainer.appendChild(linkUI); + } + return linkUI; + }, + + /** + * Called by Viva.Graph.View.renderer to let concrete graphic output + * provider remove link from rendering surface. + * + * @param linkUI visual representation of the link created by link() execution. + **/ + releaseLink : function (link) { + var linkUI = allLinks[link.id]; + if (linkUI) { + svgContainer.removeChild(linkUI); + delete allLinks[link.id]; + } + }, + + /** + * Called by Viva.Graph.View.renderer to let concrete graphic output + * provider prepare to render given node of the graph. + * + * @param nodeUI visual representation of the node created by node() execution. + **/ + addNode : function (node, pos) { + var nodeUI = nodeBuilder(node); + if (!nodeUI) { + return; + } + nodeUI.position = pos; + nodeUI.node = node; + allNodes[node.id] = nodeUI; + + svgContainer.appendChild(nodeUI); + + return nodeUI; + }, + + /** + * Called by Viva.Graph.View.renderer to let concrete graphic output + * provider remove node from rendering surface. + * + * @param node graph's node + **/ + releaseNode : function (node) { + var nodeUI = allNodes[node.id]; + if (nodeUI) { + svgContainer.removeChild(nodeUI); + delete allNodes[node.id]; + } + }, + + renderNodes : function () { + for (var key in allNodes) { + if (allNodes.hasOwnProperty(key)) { + var nodeUI = allNodes[key]; + cachedPos.x = nodeUI.position.x; + cachedPos.y = nodeUI.position.y; + nodePositionCallback(nodeUI, cachedPos, nodeUI.node); + } + } + }, + + renderLinks : function () { + for (var key in allLinks) { + if (allLinks.hasOwnProperty(key)) { + var linkUI = allLinks[key]; + cachedFromPos.x = linkUI.position.from.x; + cachedFromPos.y = linkUI.position.from.y; + cachedToPos.x = linkUI.position.to.x; + cachedToPos.y = linkUI.position.to.y; + linkPositionCallback(linkUI, cachedFromPos, cachedToPos, linkUI.link); + } + } + }, + + /** + * Returns root element which hosts graphics. + */ + getGraphicsRoot : function (callbackWhenReady) { + // todo: should fire an event, instead of having this context. + if (typeof callbackWhenReady === "function") { + if (svgRoot) { + callbackWhenReady(svgRoot); + } else { + initCallback = callbackWhenReady; + } + } + return svgRoot; + }, + /** + * Returns root SVG element. + * + * Note: This is internal method specific to this renderer + */ + getSvgRoot : function () { + return svgRoot; + } + }; + + + // Let graphics fire events before we return it to the caller. + eventify(graphics); + + return graphics; + + function createSvgRoot() { + var svgRoot = svg("svg"); + + svgContainer = svg("g") + .attr("buffered-rendering", "dynamic"); + + svgRoot.appendChild(svgContainer); + return svgRoot; + } +} + +},{"../Input/domInputManager.js":34,"ngraph.events":7,"simplesvg":28}],50:[function(require,module,exports){ +/** + * @fileOverview Defines a graph renderer that uses WebGL based drawings. + * + * @author Andrei Kashcha (aka anvaka) / https://github.com/anvaka + */ + +module.exports = webglGraphics; + +var webglInputManager = require('../Input/webglInputManager.js'); +var webglLinkProgram = require('../WebGL/webglLinkProgram.js'); +var webglNodeProgram = require('../WebGL/webglNodeProgram.js'); +var webglSquare = require('../WebGL/webglSquare.js'); +var webglLine = require('../WebGL/webglLine.js'); +var eventify = require('ngraph.events'); +var merge = require('ngraph.merge'); + +/** + * Performs webgl-based graph rendering. This module does not perform + * layout, but only visualizes nodes and edges of the graph. + * + * @param options - to customize graphics behavior. Currently supported parameter + * enableBlending - true by default, allows to use transparency in node/links colors. + * preserveDrawingBuffer - false by default, tells webgl to preserve drawing buffer. + * See https://www.khronos.org/registry/webgl/specs/1.0/#5.2 + */ + +function webglGraphics(options) { + options = merge(options, { + enableBlending : true, + preserveDrawingBuffer : false, + clearColor: false, + clearColorValue : { + r : 1, + g : 1, + b : 1, + a : 1 + } + }); + + var container, + graphicsRoot, + gl, + width, + height, + nodesCount = 0, + linksCount = 0, + transform = [ + 1, 0, 0, 0, + 0, 1, 0, 0, + 0, 0, 1, 0, + 0, 0, 0, 1 + ], + userPlaceNodeCallback, + userPlaceLinkCallback, + nodes = [], + links = [], + initCallback, + + allNodes = {}, + allLinks = {}, + linkProgram = webglLinkProgram(), + nodeProgram = webglNodeProgram(), +/*jshint unused: false */ + nodeUIBuilder = function (node) { + return webglSquare(); // Just make a square, using provided gl context (a nodeProgram); + }, + + linkUIBuilder = function (link) { + return webglLine(0xb3b3b3ff); + }, +/*jshint unused: true */ + updateTransformUniform = function () { + linkProgram.updateTransform(transform); + nodeProgram.updateTransform(transform); + }, + + resetScaleInternal = function () { + transform = [1, 0, 0, 0, + 0, 1, 0, 0, + 0, 0, 1, 0, + 0, 0, 0, 1]; + }, + + updateSize = function () { + if (container && graphicsRoot) { + width = graphicsRoot.width = Math.max(container.offsetWidth, 1); + height = graphicsRoot.height = Math.max(container.offsetHeight, 1); + if (gl) { gl.viewport(0, 0, width, height); } + if (linkProgram) { linkProgram.updateSize(width / 2, height / 2); } + if (nodeProgram) { nodeProgram.updateSize(width / 2, height / 2); } + } + }, + + fireRescaled = function (graphics) { + graphics.fire("rescaled"); + }; + + graphicsRoot = window.document.createElement("canvas"); + + var graphics = { + getLinkUI: function (linkId) { + return allLinks[linkId]; + }, + + getNodeUI: function (nodeId) { + return allNodes[nodeId]; + }, + + /** + * Sets the callback that creates node representation. + * + * @param builderCallback a callback function that accepts graph node + * as a parameter and must return an element representing this node. + * + * @returns If builderCallbackOrNode is a valid callback function, instance of this is returned; + * Otherwise undefined value is returned + */ + node : function (builderCallback) { + if (typeof builderCallback !== "function") { + return; // todo: throw? This is not compatible with old versions + } + + nodeUIBuilder = builderCallback; + + return this; + }, + + /** + * Sets the callback that creates link representation + * + * @param builderCallback a callback function that accepts graph link + * as a parameter and must return an element representing this link. + * + * @returns If builderCallback is a valid callback function, instance of this is returned; + * Otherwise undefined value is returned. + */ + link : function (builderCallback) { + if (typeof builderCallback !== "function") { + return; // todo: throw? This is not compatible with old versions + } + + linkUIBuilder = builderCallback; + return this; + }, + + + /** + * Allows to override default position setter for the node with a new + * function. newPlaceCallback(nodeUI, position) is function which + * is used by updateNodePosition(). + */ + placeNode : function (newPlaceCallback) { + userPlaceNodeCallback = newPlaceCallback; + return this; + }, + + placeLink : function (newPlaceLinkCallback) { + userPlaceLinkCallback = newPlaceLinkCallback; + return this; + }, + + /** + * Custom input manager listens to mouse events to process nodes drag-n-drop inside WebGL canvas + */ + inputManager : webglInputManager, + + /** + * Called every time before renderer starts rendering. + */ + beginRender : function () { + // this function could be replaced by this.init, + // based on user options. + }, + + /** + * Called every time when renderer finishes one step of rendering. + */ + endRender : function () { + if (linksCount > 0) { + linkProgram.render(); + } + if (nodesCount > 0) { + nodeProgram.render(); + } + }, + + bringLinkToFront : function (linkUI) { + var frontLinkId = linkProgram.getFrontLinkId(), + srcLinkId, + temp; + + linkProgram.bringToFront(linkUI); + + if (frontLinkId > linkUI.id) { + srcLinkId = linkUI.id; + + temp = links[frontLinkId]; + links[frontLinkId] = links[srcLinkId]; + links[frontLinkId].id = frontLinkId; + links[srcLinkId] = temp; + links[srcLinkId].id = srcLinkId; + } + }, + + /** + * Sets translate operation that should be applied to all nodes and links. + */ + graphCenterChanged : function (x, y) { + transform[12] = (2 * x / width) - 1; + transform[13] = 1 - (2 * y / height); + updateTransformUniform(); + }, + + /** + * Called by Viva.Graph.View.renderer to let concrete graphic output + * provider prepare to render given link of the graph + * + * @param link - model of a link + */ + addLink: function (link, boundPosition) { + var uiid = linksCount++, + ui = linkUIBuilder(link); + ui.id = uiid; + ui.pos = boundPosition; + + linkProgram.createLink(ui); + + links[uiid] = ui; + allLinks[link.id] = ui; + return ui; + }, + + /** + * Called by Viva.Graph.View.renderer to let concrete graphic output + * provider prepare to render given node of the graph. + * + * @param nodeUI visual representation of the node created by node() execution. + **/ + addNode : function (node, boundPosition) { + var uiid = nodesCount++, + ui = nodeUIBuilder(node); + + ui.id = uiid; + ui.position = boundPosition; + ui.node = node; + + nodeProgram.createNode(ui); + + nodes[uiid] = ui; + allNodes[node.id] = ui; + return ui; + }, + + translateRel : function (dx, dy) { + transform[12] += (2 * transform[0] * dx / width) / transform[0]; + transform[13] -= (2 * transform[5] * dy / height) / transform[5]; + updateTransformUniform(); + }, + + scale : function (scaleFactor, scrollPoint) { + // Transform scroll point to clip-space coordinates: + var cx = 2 * scrollPoint.x / width - 1, + cy = 1 - (2 * scrollPoint.y) / height; + + cx -= transform[12]; + cy -= transform[13]; + + transform[12] += cx * (1 - scaleFactor); + transform[13] += cy * (1 - scaleFactor); + + transform[0] *= scaleFactor; + transform[5] *= scaleFactor; + + updateTransformUniform(); + fireRescaled(this); + + return transform[0]; + }, + + resetScale : function () { + resetScaleInternal(); + + if (gl) { + updateSize(); + // TODO: what is this? + // gl.useProgram(linksProgram); + // gl.uniform2f(linksProgram.screenSize, width, height); + updateTransformUniform(); + } + return this; + }, + + /** + * Resizes the graphic without resetting the scale. + * Useful with viva graph in a dynamic container + */ + updateSize: updateSize, + + /** + * Called by Viva.Graph.View.renderer to let concrete graphic output + * provider prepare to render. + */ + init : function (c) { + var contextParameters = {}; + + if (options.preserveDrawingBuffer) { + contextParameters.preserveDrawingBuffer = true; + } + + container = c; + + updateSize(); + resetScaleInternal(); + container.appendChild(graphicsRoot); + + + gl = graphicsRoot.getContext("experimental-webgl", contextParameters); + if (!gl) { + var msg = "Could not initialize WebGL. Seems like the browser doesn't support it."; + window.alert(msg); + throw msg; + } + if (options.enableBlending) { + gl.blendFunc(gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA); + gl.enable(gl.BLEND); + } + if (options.clearColor) { + var color = options.clearColorValue; + gl.clearColor(color.r, color.g, color.b, color.a); + // TODO: not the best way, really. Should come up with something better + // what if we need more updates inside beginRender, like depth buffer? + this.beginRender = function () { + gl.clear(gl.COLOR_BUFFER_BIT); + }; + } + + linkProgram.load(gl); + linkProgram.updateSize(width / 2, height / 2); + + nodeProgram.load(gl); + nodeProgram.updateSize(width / 2, height / 2); + + updateTransformUniform(); + + // Notify the world if someone waited for update. TODO: should send an event + if (typeof initCallback === "function") { + initCallback(graphicsRoot); + } + }, + + /** + * Called by Viva.Graph.View.renderer to let concrete graphic output + * provider release occupied resources. + */ + release : function (container) { + if (graphicsRoot && container) { + container.removeChild(graphicsRoot); + // TODO: anything else? + } + }, + + /** + * Checks whether webgl is supported by this browser. + */ + isSupported : function () { + var c = window.document.createElement("canvas"), + gl = c && c.getContext && c.getContext("experimental-webgl"); + return gl; + }, + + /** + * Called by Viva.Graph.View.renderer to let concrete graphic output + * provider remove link from rendering surface. + * + * @param linkUI visual representation of the link created by link() execution. + **/ + releaseLink : function (link) { + if (linksCount > 0) { linksCount -= 1; } + var linkUI = allLinks[link.id]; + delete allLinks[link.id]; + + linkProgram.removeLink(linkUI); + + var linkIdToRemove = linkUI.id; + if (linkIdToRemove < linksCount) { + if (linksCount === 0 || linksCount === linkIdToRemove) { + return; // no more links or removed link is the last one. + } + + var lastLinkUI = links[linksCount]; + links[linkIdToRemove] = lastLinkUI; + lastLinkUI.id = linkIdToRemove; + } + }, + + /** + * Called by Viva.Graph.View.renderer to let concrete graphic output + * provider remove node from rendering surface. + * + * @param nodeUI visual representation of the node created by node() execution. + **/ + releaseNode : function (node) { + if (nodesCount > 0) { nodesCount -= 1; } + var nodeUI = allNodes[node.id]; + delete allNodes[node.id]; + + nodeProgram.removeNode(nodeUI); + + var nodeIdToRemove = nodeUI.id; + if (nodeIdToRemove < nodesCount) { + if (nodesCount === 0 || nodesCount === nodeIdToRemove) { + return; // no more nodes or removed node is the last in the list. + } + + var lastNodeUI = nodes[nodesCount]; + + nodes[nodeIdToRemove] = lastNodeUI; + lastNodeUI.id = nodeIdToRemove; + + // Since concrete shaders may cache properties in the UI element + // we are letting them to make this swap (e.g. image node shader + // uses this approach to update node's offset in the atlas) + nodeProgram.replaceProperties(nodeUI, lastNodeUI); + } + }, + + renderNodes: function () { + var pos = {x : 0, y : 0}; + // WebGL coordinate system is different. Would be better + // to have this transform in the shader code, but it would + // require every shader to be updated.. + for (var i = 0; i < nodesCount; ++i) { + var ui = nodes[i]; + pos.x = ui.position.x; + pos.y = ui.position.y; + if (userPlaceNodeCallback) { + userPlaceNodeCallback(ui, pos); + } + + nodeProgram.position(ui, pos); + } + }, + + renderLinks: function () { + if (this.omitLinksRendering) { return; } + + var toPos = {x : 0, y : 0}; + var fromPos = {x : 0, y : 0}; + for (var i = 0; i < linksCount; ++i) { + var ui = links[i]; + var pos = ui.pos.from; + fromPos.x = pos.x; + fromPos.y = -pos.y; + pos = ui.pos.to; + toPos.x = pos.x; + toPos.y = -pos.y; + if (userPlaceLinkCallback) { + userPlaceLinkCallback(ui, fromPos, toPos); + } + + linkProgram.position(ui, fromPos, toPos); + } + }, + + /** + * Returns root element which hosts graphics. + */ + getGraphicsRoot : function (callbackWhenReady) { + // todo: should fire an event, instead of having this context. + if (typeof callbackWhenReady === "function") { + if (graphicsRoot) { + callbackWhenReady(graphicsRoot); + } else { + initCallback = callbackWhenReady; + } + } + return graphicsRoot; + }, + + /** + * Updates default shader which renders nodes + * + * @param newProgram to use for nodes. + */ + setNodeProgram : function (newProgram) { + if (!gl && newProgram) { + // Nothing created yet. Just set shader to the new one + // and let initialization logic take care about the rest. + nodeProgram = newProgram; + } else if (newProgram) { + throw "Not implemented. Cannot swap shader on the fly... Yet."; + // TODO: unload old shader and reinit. + } + }, + + /** + * Updates default shader which renders links + * + * @param newProgram to use for links. + */ + setLinkProgram : function (newProgram) { + if (!gl && newProgram) { + // Nothing created yet. Just set shader to the new one + // and let initialization logic take care about the rest. + linkProgram = newProgram; + } else if (newProgram) { + throw "Not implemented. Cannot swap shader on the fly... Yet."; + // TODO: unload old shader and reinit. + } + }, + + /** + * Transforms client coordinates into layout coordinates. Client coordinates + * are DOM coordinates relative to the rendering container. Layout + * coordinates are those assigned by by layout algorithm to each node. + * + * @param {Object} p - a point object with `x` and `y` attributes. + * This method mutates p. + */ + transformClientToGraphCoordinates: function (p) { + // TODO: could be a problem when container has margins? + // normalize + p.x = ((2 * p.x) / width) - 1; + p.y = 1 - ((2 * p.y) / height); + + // apply transform + p.x = (p.x - transform[12]) / transform[0]; + p.y = (p.y - transform[13]) / transform[5]; + + // transform to graph coordinates + p.x = p.x * (width / 2); + p.y = p.y * (-height / 2); + + return p; + }, + + /** + * Transforms WebGL coordinates into client coordinates. Reverse of + * `transformClientToGraphCoordinates()` + * + * @param {Object} p - a point object with `x` and `y` attributes, which + * represents a layout coordinate. This method mutates p. + */ + transformGraphToClientCoordinates: function (p) { + // TODO: could be a problem when container has margins? + // transform from graph coordinates + p.x = p.x / (width / 2); + p.y = p.y / (-height / 2); + + // apply transform + p.x = (p.x * transform[0]) + transform[12]; + p.y = (p.y * transform[5]) + transform[13]; + + // denormalize + p.x = ((p.x + 1) * width) / 2; + p.y = ((1 - p.y) * height) / 2; + + return p; + }, + + getNodeAtClientPos: function (clientPos, preciseCheck) { + if (typeof preciseCheck !== "function") { + // we don't know anything about your node structure here :( + // potentially this could be delegated to node program, but for + // right now, we are giving up if you don't pass boundary check + // callback. It answers to a question is nodeUI covers (x, y) + return null; + } + // first transform to graph coordinates: + this.transformClientToGraphCoordinates(clientPos); + // now using precise check iterate over each node and find one within box: + // TODO: This is poor O(N) performance. + for (var i = 0; i < nodesCount; ++i) { + if (preciseCheck(nodes[i], clientPos.x, clientPos.y)) { + return nodes[i].node; + } + } + return null; + } + }; + + // Let graphics fire events before we return it to the caller. + eventify(graphics); + + return graphics; +} + +},{"../Input/webglInputManager.js":36,"../WebGL/webglLine.js":58,"../WebGL/webglLinkProgram.js":59,"../WebGL/webglNodeProgram.js":60,"../WebGL/webglSquare.js":61,"ngraph.events":7,"ngraph.merge":13}],51:[function(require,module,exports){ +module.exports = parseColor; + +function parseColor(color) { + var parsedColor = 0x009ee8ff; + + if (typeof color === 'string' && color) { + if (color.length === 4) { // #rgb + color = color.replace(/([^#])/g, '$1$1'); // duplicate each letter except first #. + } + if (color.length === 9) { // #rrggbbaa + parsedColor = parseInt(color.substr(1), 16); + } else if (color.length === 7) { // or #rrggbb. + parsedColor = (parseInt(color.substr(1), 16) << 8) | 0xff; + } else { + throw 'Color expected in hex format with preceding "#". E.g. #00ff00. Got value: ' + color; + } + } else if (typeof color === 'number') { + parsedColor = color; + } + + return parsedColor; +} + +},{}],52:[function(require,module,exports){ +module.exports = Texture; + +/** + * Single texture in the webglAtlas. + */ +function Texture(size) { + this.canvas = window.document.createElement("canvas"); + this.ctx = this.canvas.getContext("2d"); + this.isDirty = false; + this.canvas.width = this.canvas.height = size; +} + +},{}],53:[function(require,module,exports){ +/** + * @fileOverview Utility functions for webgl rendering. + * + * @author Andrei Kashcha (aka anvaka) / https://github.com/anvaka + */ + +module.exports = webgl; + +function webgl(gl) { + + return { + createProgram: createProgram, + extendArray: extendArray, + copyArrayPart: copyArrayPart, + swapArrayPart: swapArrayPart, + getLocations: getLocations, + context: gl + }; + + function createShader(shaderText, type) { + var shader = gl.createShader(type); + gl.shaderSource(shader, shaderText); + gl.compileShader(shader); + + if (!gl.getShaderParameter(shader, gl.COMPILE_STATUS)) { + var msg = gl.getShaderInfoLog(shader); + window.alert(msg); + throw msg; + } + + return shader; + } + + function createProgram(vertexShaderSrc, fragmentShaderSrc) { + var program = gl.createProgram(); + var vs = createShader(vertexShaderSrc, gl.VERTEX_SHADER); + var fs = createShader(fragmentShaderSrc, gl.FRAGMENT_SHADER); + + gl.attachShader(program, vs); + gl.attachShader(program, fs); + gl.linkProgram(program); + + if (!gl.getProgramParameter(program, gl.LINK_STATUS)) { + var msg = gl.getShaderInfoLog(program); + window.alert(msg); + throw msg; + } + + return program; + } + + function extendArray(buffer, itemsInBuffer, elementsPerItem) { + if ((itemsInBuffer + 1) * elementsPerItem > buffer.length) { + // Every time we run out of space create new array twice bigger. + // TODO: it seems buffer size is limited. Consider using multiple arrays for huge graphs + var extendedArray = new Float32Array(buffer.length * elementsPerItem * 2); + extendedArray.set(buffer); + + return extendedArray; + } + + return buffer; + } + + function getLocations(program, uniformOrAttributeNames) { + var foundLocations = {}; + for (var i = 0; i < uniformOrAttributeNames.length; ++i) { + var name = uniformOrAttributeNames[i]; + var location = -1; + if (name[0] === 'a' && name[1] === '_') { + location = gl.getAttribLocation(program, name); + if (location === -1) { + throw new Error("Program doesn't have required attribute: " + name); + } + + foundLocations[name.slice(2)] = location; + } else if (name[0] === 'u' && name[1] === '_') { + location = gl.getUniformLocation(program, name); + if (location === null) { + throw new Error("Program doesn't have required uniform: " + name); + } + + foundLocations[name.slice(2)] = location; + } else { + throw new Error("Couldn't figure out your intent. All uniforms should start with 'u_' prefix, and attributes with 'a_'"); + } + } + + return foundLocations; + } +} + +function copyArrayPart(array, to, from, elementsCount) { + for (var i = 0; i < elementsCount; ++i) { + array[to + i] = array[from + i]; + } +} + +function swapArrayPart(array, from, to, elementsCount) { + for (var i = 0; i < elementsCount; ++i) { + var tmp = array[from + i]; array[from + i] = array[to + i]; array[to + i] = tmp; } @@ -6036,7 +6036,7 @@ function webglImage(size, src) { * @fileOverview Defines an image nodes for webglGraphics class. * Shape of nodes is square. * - * @author Andrei Kashcha (aka anvaka) / http://anvaka.blogspot.com + * @author Andrei Kashcha (aka anvaka) / https://github.com/anvaka */ var WebglAtlas = require('./webglAtlas.js'); diff --git a/src/Utils/timer.js b/src/Utils/timer.js index 8e79c42..e4b8399 100644 --- a/src/Utils/timer.js +++ b/src/Utils/timer.js @@ -1,5 +1,5 @@ /** - * @author Andrei Kashcha (aka anvaka) / http://anvaka.blogspot.com + * @author Andrei Kashcha (aka anvaka) / https://github.com/anvaka */ module.exports = createTimer(); diff --git a/src/View/svgGraphics.js b/src/View/svgGraphics.js index df7ad4d..7dd77fc 100644 --- a/src/View/svgGraphics.js +++ b/src/View/svgGraphics.js @@ -1,7 +1,7 @@ /** * @fileOverview Defines a graph renderer that uses SVG based drawings. * - * @author Andrei Kashcha (aka anvaka) / http://anvaka.blogspot.com + * @author Andrei Kashcha (aka anvaka) / https://github.com/anvaka */ module.exports = svgGraphics; diff --git a/src/WebGL/webgl.js b/src/WebGL/webgl.js index 94b8773..b9bea5d 100644 --- a/src/WebGL/webgl.js +++ b/src/WebGL/webgl.js @@ -1,7 +1,7 @@ /** * @fileOverview Utility functions for webgl rendering. * - * @author Andrei Kashcha (aka anvaka) / http://anvaka.blogspot.com + * @author Andrei Kashcha (aka anvaka) / https://github.com/anvaka */ module.exports = webgl; diff --git a/src/WebGL/webglImageNodeProgram.js b/src/WebGL/webglImageNodeProgram.js index fc52020..59450d4 100644 --- a/src/WebGL/webglImageNodeProgram.js +++ b/src/WebGL/webglImageNodeProgram.js @@ -2,7 +2,7 @@ * @fileOverview Defines an image nodes for webglGraphics class. * Shape of nodes is square. * - * @author Andrei Kashcha (aka anvaka) / http://anvaka.blogspot.com + * @author Andrei Kashcha (aka anvaka) / https://github.com/anvaka */ var WebglAtlas = require('./webglAtlas.js'); From 9d2f114046bd9fce4450425cfe6767b14e32c0c2 Mon Sep 17 00:00:00 2001 From: Andriy Kashcha Date: Thu, 1 Mar 2018 21:18:59 -0800 Subject: [PATCH 17/49] Fixed iterations count argument --- src/View/renderer.js | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/src/View/renderer.js b/src/View/renderer.js index 9d723f2..5a6baae 100644 --- a/src/View/renderer.js +++ b/src/View/renderer.js @@ -67,8 +67,6 @@ function renderer(graph, settings) { rendererInitialized = false, updateCenterRequired = true, - currentStep = 0, - totalIterationsCount = 0, isStable = false, userInteraction = false, isPaused = false, @@ -222,19 +220,20 @@ function renderer(graph, settings) { function renderIterations(iterationsCount) { if (animationTimer) { - totalIterationsCount += iterationsCount; return; } - if (iterationsCount) { - totalIterationsCount += iterationsCount; - + if (iterationsCount !== undefined) { animationTimer = timer(function() { + iterationsCount -= 1; + if (iterationsCount < 0) { + var needMoreFrames = false; + return needMoreFrames; + } + return onRenderFrame(); }, FRAME_INTERVAL); } else { - currentStep = 0; - totalIterationsCount = 0; animationTimer = timer(onRenderFrame, FRAME_INTERVAL); } } From 9d7ca9db57100c8a7ae0fff9e4d7c82807e4b430 Mon Sep 17 00:00:00 2001 From: Andriy Kashcha Date: Thu, 1 Mar 2018 21:20:23 -0800 Subject: [PATCH 18/49] Added getTransform Should help with https://github.com/anvaka/VivaGraphJS/issues/84#issuecomment-368608103 --- dist/vivagraph.js | 3418 +++++++++++++++++++++-------------------- dist/vivagraph.min.js | 2 +- src/View/renderer.js | 9 +- 3 files changed, 1721 insertions(+), 1708 deletions(-) diff --git a/dist/vivagraph.js b/dist/vivagraph.js index 0d0cf06..1217d7a 100644 --- a/dist/vivagraph.js +++ b/dist/vivagraph.js @@ -1,116 +1,116 @@ !function(e){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=e();else if("function"==typeof define&&define.amd)define([],e);else{var f;"undefined"!=typeof window?f=window:"undefined"!=typeof global?f=global:"undefined"!=typeof self&&(f=self),f.Viva=e()}}(function(){var define,module,exports;return (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o= 0; - } else if (typeof interactive === 'boolean') { - return interactive; - } - return true; // default setting - } - - function prepareSettings() { - container = container || window.document.body; - layout = layout || forceDirected(graph, { - springLength: 80, - springCoeff: 0.0002, - }); - graphics = graphics || svgGraphics(graph, { - container: container - }); - - if (!settings.hasOwnProperty('renderLinks')) { - settings.renderLinks = true; - } - - settings.prerender = settings.prerender || 0; - inputManager = (graphics.inputManager || domInputManager)(graph, graphics); - } - - function renderGraph() { - graphics.beginRender(); - - // todo: move this check graphics - if (settings.renderLinks) { - graphics.renderLinks(); - } - graphics.renderNodes(); - graphics.endRender(); - } - - function onRenderFrame() { - isStable = layout.step() && !userInteraction; - renderGraph(); - - return !isStable; - } - - function renderIterations(iterationsCount) { - if (animationTimer) { - totalIterationsCount += iterationsCount; - return; - } - - if (iterationsCount) { - totalIterationsCount += iterationsCount; - - animationTimer = timer(function() { - return onRenderFrame(); - }, FRAME_INTERVAL); - } else { - currentStep = 0; - totalIterationsCount = 0; - animationTimer = timer(onRenderFrame, FRAME_INTERVAL); - } - } - - function resetStable() { - if (isPaused) { - return; - } - - isStable = false; - animationTimer.restart(); - } - - function prerender() { - // To get good initial positions for the graph - // perform several prerender steps in background. - if (typeof settings.prerender === 'number' && settings.prerender > 0) { - for (var i = 0; i < settings.prerender; i += 1) { - layout.step(); - } - } - } - - function updateCenter() { - var graphRect = layout.getGraphRect(), - containerSize = getDimension(container); - - var cx = (graphRect.x2 + graphRect.x1) / 2; - var cy = (graphRect.y2 + graphRect.y1) / 2; - transform.offsetX = containerSize.width / 2 - (cx * transform.scale - cx); - transform.offsetY = containerSize.height / 2 - (cy * transform.scale - cy); - graphics.graphCenterChanged(transform.offsetX, transform.offsetY); - - updateCenterRequired = false; - } - - function createNodeUi(node) { - var nodePosition = layout.getNodePosition(node.id); - graphics.addNode(node, nodePosition); - } - - function removeNodeUi(node) { - graphics.releaseNode(node); - } - - function createLinkUi(link) { - var linkPosition = layout.getLinkPosition(link.id); - graphics.addLink(link, linkPosition); - } - - function removeLinkUi(link) { - graphics.releaseLink(link); - } - - function listenNodeEvents(node) { - if (!isInteractive('node')) { - return; - } - - var wasPinned = false; - - // TODO: This may not be memory efficient. Consider reusing handlers object. - inputManager.bindDragNDrop(node, { - onStart: function() { - wasPinned = layout.isNodePinned(node); - layout.pinNode(node, true); - userInteraction = true; - resetStable(); - }, - onDrag: function(e, offset) { - var oldPos = layout.getNodePosition(node.id); - layout.setNodePosition(node.id, - oldPos.x + offset.x / transform.scale, - oldPos.y + offset.y / transform.scale); - - userInteraction = true; - - renderGraph(); - }, - onStop: function() { - layout.pinNode(node, wasPinned); - userInteraction = false; - } - }); - } - - function releaseNodeEvents(node) { - inputManager.bindDragNDrop(node, null); - } - - function initDom() { - graphics.init(container); - - graph.forEachNode(createNodeUi); - - if (settings.renderLinks) { - graph.forEachLink(createLinkUi); - } - } - - function releaseDom() { - graphics.release(container); - } - - function processNodeChange(change) { - var node = change.node; - - if (change.changeType === 'add') { - createNodeUi(node); - listenNodeEvents(node); - if (updateCenterRequired) { - updateCenter(); - } - } else if (change.changeType === 'remove') { - releaseNodeEvents(node); - removeNodeUi(node); - if (graph.getNodesCount() === 0) { - updateCenterRequired = true; // Next time when node is added - center the graph. - } - } else if (change.changeType === 'update') { - releaseNodeEvents(node); - removeNodeUi(node); - - createNodeUi(node); - listenNodeEvents(node); - } - } - - function processLinkChange(change) { - var link = change.link; - if (change.changeType === 'add') { - if (settings.renderLinks) { - createLinkUi(link); - } - } else if (change.changeType === 'remove') { - if (settings.renderLinks) { - removeLinkUi(link); - } - } else if (change.changeType === 'update') { - throw 'Update type is not implemented. TODO: Implement me!'; - } - } +/** + * @fileOverview Defines a graph renderer that uses CSS based drawings. + * + * @author Andrei Kashcha (aka anvaka) / https://github.com/anvaka + */ + +module.exports = renderer; + +var eventify = require('ngraph.events'); +var forceDirected = require('ngraph.forcelayout'); +var svgGraphics = require('./svgGraphics.js'); +var windowEvents = require('../Utils/windowEvents.js'); +var domInputManager = require('../Input/domInputManager.js'); +var timer = require('../Utils/timer.js'); +var getDimension = require('../Utils/getDimensions.js'); +var dragndrop = require('../Input/dragndrop.js'); + +/** + * This is heart of the rendering. Class accepts graph to be rendered and rendering settings. + * It monitors graph changes and depicts them accordingly. + * + * @param graph - Viva.Graph.graph() object to be rendered. + * @param settings - rendering settings, composed from the following parts (with their defaults shown): + * settings = { + * // Represents a module that is capable of displaying graph nodes and links. + * // all graphics has to correspond to defined interface and can be later easily + * // replaced for specific needs (e.g. adding WebGL should be piece of cake as long + * // as WebGL has implemented required interface). See svgGraphics for example. + * graphics : Viva.Graph.View.svgGraphics(), + * + * // Where the renderer should draw graph. Container size matters, because + * // renderer will attempt center graph to that size. Also graphics modules + * // might depend on it. + * container : document.body, + * + * // Defines whether graph can respond to use input + * interactive: true, + * + * // Layout algorithm to be used. The algorithm is expected to comply with defined + * // interface and is expected to be iterative. Renderer will use it then to calculate + * // grpaph's layout. For examples of the interface refer to Viva.Graph.Layout.forceDirected() + * layout : Viva.Graph.Layout.forceDirected(), + * + * // Directs renderer to display links. Usually rendering links is the slowest part of this + * // library. So if you don't need to display links, consider settings this property to false. + * renderLinks : true, + * + * // Number of layout iterations to run before displaying the graph. The bigger you set this number + * // the closer to ideal position graph will appear first time. But be careful: for large graphs + * // it can freeze the browser. + * prerender : 0 + * } + */ +function renderer(graph, settings) { + // TODO: This class is getting hard to understand. Consider refactoring. + // TODO: I have a technical debt here: fix scaling/recentering! Currently it's a total mess. + var FRAME_INTERVAL = 30; + + settings = settings || {}; + + var layout = settings.layout, + graphics = settings.graphics, + container = settings.container, + interactive = settings.interactive !== undefined ? settings.interactive : true, + inputManager, + animationTimer, + rendererInitialized = false, + updateCenterRequired = true, + + isStable = false, + userInteraction = false, + isPaused = false, + + transform = { + offsetX: 0, + offsetY: 0, + scale: 1 + }, + + publicEvents = eventify({}), + containerDrag; + + return { + /** + * Performs rendering of the graph. + * + * @param iterationsCount if specified renderer will run only given number of iterations + * and then stop. Otherwise graph rendering is performed indefinitely. + * + * Note: if rendering stopped by used started dragging nodes or new nodes were added to the + * graph renderer will give run more iterations to reflect changes. + */ + run: function(iterationsCount) { + + if (!rendererInitialized) { + prepareSettings(); + prerender(); + + initDom(); + updateCenter(); + listenToEvents(); + + rendererInitialized = true; + } + + renderIterations(iterationsCount); + + return this; + }, + + reset: function() { + graphics.resetScale(); + updateCenter(); + transform.scale = 1; + }, + + pause: function() { + isPaused = true; + animationTimer.stop(); + }, + + resume: function() { + isPaused = false; + animationTimer.restart(); + }, + + rerender: function() { + renderGraph(); + return this; + }, + + zoomOut: function() { + return scale(true); + }, + + zoomIn: function() { + return scale(false); + }, + + /** + * Returns current transformation matrix. + */ + getTransform: function() { + return transform; + }, + + /** + * Centers renderer at x,y graph's coordinates + */ + moveTo: function(x, y) { + graphics.graphCenterChanged(transform.offsetX - x * transform.scale, transform.offsetY - y * transform.scale); + renderGraph(); + }, + + /** + * Gets current graphics object + */ + getGraphics: function() { + return graphics; + }, + + /** + * Removes this renderer and deallocates all resources/timers + */ + dispose: function() { + stopListenToEvents(); // I quit! + }, + + on: function(eventName, callback) { + publicEvents.on(eventName, callback); + return this; + }, + + off: function(eventName, callback) { + publicEvents.off(eventName, callback); + return this; + } + }; + + /** + * Checks whether given interaction (node/scroll) is enabled + */ + function isInteractive(interactionName) { + if (typeof interactive === 'string') { + return interactive.indexOf(interactionName) >= 0; + } else if (typeof interactive === 'boolean') { + return interactive; + } + return true; // default setting + } + + function prepareSettings() { + container = container || window.document.body; + layout = layout || forceDirected(graph, { + springLength: 80, + springCoeff: 0.0002, + }); + graphics = graphics || svgGraphics(graph, { + container: container + }); + + if (!settings.hasOwnProperty('renderLinks')) { + settings.renderLinks = true; + } + + settings.prerender = settings.prerender || 0; + inputManager = (graphics.inputManager || domInputManager)(graph, graphics); + } + + function renderGraph() { + graphics.beginRender(); + + // todo: move this check graphics + if (settings.renderLinks) { + graphics.renderLinks(); + } + graphics.renderNodes(); + graphics.endRender(); + } + + function onRenderFrame() { + isStable = layout.step() && !userInteraction; + renderGraph(); + + return !isStable; + } + + function renderIterations(iterationsCount) { + if (animationTimer) { + return; + } + + if (iterationsCount !== undefined) { + animationTimer = timer(function() { + iterationsCount -= 1; + if (iterationsCount < 0) { + var needMoreFrames = false; + return needMoreFrames; + } + + return onRenderFrame(); + }, FRAME_INTERVAL); + } else { + animationTimer = timer(onRenderFrame, FRAME_INTERVAL); + } + } + + function resetStable() { + if (isPaused) { + return; + } + + isStable = false; + animationTimer.restart(); + } + + function prerender() { + // To get good initial positions for the graph + // perform several prerender steps in background. + if (typeof settings.prerender === 'number' && settings.prerender > 0) { + for (var i = 0; i < settings.prerender; i += 1) { + layout.step(); + } + } + } + + function updateCenter() { + var graphRect = layout.getGraphRect(), + containerSize = getDimension(container); + + var cx = (graphRect.x2 + graphRect.x1) / 2; + var cy = (graphRect.y2 + graphRect.y1) / 2; + transform.offsetX = containerSize.width / 2 - (cx * transform.scale - cx); + transform.offsetY = containerSize.height / 2 - (cy * transform.scale - cy); + graphics.graphCenterChanged(transform.offsetX, transform.offsetY); + + updateCenterRequired = false; + } + + function createNodeUi(node) { + var nodePosition = layout.getNodePosition(node.id); + graphics.addNode(node, nodePosition); + } + + function removeNodeUi(node) { + graphics.releaseNode(node); + } + + function createLinkUi(link) { + var linkPosition = layout.getLinkPosition(link.id); + graphics.addLink(link, linkPosition); + } + + function removeLinkUi(link) { + graphics.releaseLink(link); + } + + function listenNodeEvents(node) { + if (!isInteractive('node')) { + return; + } + + var wasPinned = false; + + // TODO: This may not be memory efficient. Consider reusing handlers object. + inputManager.bindDragNDrop(node, { + onStart: function() { + wasPinned = layout.isNodePinned(node); + layout.pinNode(node, true); + userInteraction = true; + resetStable(); + }, + onDrag: function(e, offset) { + var oldPos = layout.getNodePosition(node.id); + layout.setNodePosition(node.id, + oldPos.x + offset.x / transform.scale, + oldPos.y + offset.y / transform.scale); + + userInteraction = true; + + renderGraph(); + }, + onStop: function() { + layout.pinNode(node, wasPinned); + userInteraction = false; + } + }); + } + + function releaseNodeEvents(node) { + inputManager.bindDragNDrop(node, null); + } + + function initDom() { + graphics.init(container); + + graph.forEachNode(createNodeUi); + + if (settings.renderLinks) { + graph.forEachLink(createLinkUi); + } + } + + function releaseDom() { + graphics.release(container); + } + + function processNodeChange(change) { + var node = change.node; + + if (change.changeType === 'add') { + createNodeUi(node); + listenNodeEvents(node); + if (updateCenterRequired) { + updateCenter(); + } + } else if (change.changeType === 'remove') { + releaseNodeEvents(node); + removeNodeUi(node); + if (graph.getNodesCount() === 0) { + updateCenterRequired = true; // Next time when node is added - center the graph. + } + } else if (change.changeType === 'update') { + releaseNodeEvents(node); + removeNodeUi(node); + + createNodeUi(node); + listenNodeEvents(node); + } + } + + function processLinkChange(change) { + var link = change.link; + if (change.changeType === 'add') { + if (settings.renderLinks) { + createLinkUi(link); + } + } else if (change.changeType === 'remove') { + if (settings.renderLinks) { + removeLinkUi(link); + } + } else if (change.changeType === 'update') { + throw 'Update type is not implemented. TODO: Implement me!'; + } + } + + function onGraphChanged(changes) { + var i, change; + for (i = 0; i < changes.length; i += 1) { + change = changes[i]; + if (change.node) { + processNodeChange(change); + } else if (change.link) { + processLinkChange(change); + } + } + + resetStable(); + } + + function onWindowResized() { + updateCenter(); + onRenderFrame(); + } + + function releaseContainerDragManager() { + if (containerDrag) { + containerDrag.release(); + containerDrag = null; + } + } + + function releaseGraphEvents() { + graph.off('changed', onGraphChanged); + } + + function scale(out, scrollPoint) { + if (!scrollPoint) { + var containerSize = getDimension(container); + scrollPoint = { + x: containerSize.width / 2, + y: containerSize.height / 2 + }; + } + var scaleFactor = Math.pow(1 + 0.4, out ? -0.2 : 0.2); + transform.scale = graphics.scale(scaleFactor, scrollPoint); + + renderGraph(); + publicEvents.fire('scale', transform.scale); + + return transform.scale; + } + + function listenToEvents() { + windowEvents.on('resize', onWindowResized); + + releaseContainerDragManager(); + if (isInteractive('drag')) { + containerDrag = dragndrop(container); + containerDrag.onDrag(function(e, offset) { + graphics.translateRel(offset.x, offset.y); + + renderGraph(); + publicEvents.fire('drag', offset); + }); + } + + if (isInteractive('scroll')) { + if (!containerDrag) { + containerDrag = dragndrop(container); + } + containerDrag.onScroll(function(e, scaleOffset, scrollPoint) { + scale(scaleOffset < 0, scrollPoint); + }); + } + + graph.forEachNode(listenNodeEvents); + + releaseGraphEvents(); + graph.on('changed', onGraphChanged); + } + + function stopListenToEvents() { + rendererInitialized = false; + releaseGraphEvents(); + releaseContainerDragManager(); + windowEvents.off('resize', onWindowResized); + publicEvents.off(); + animationTimer.stop(); + + graph.forEachLink(function(link) { + if (settings.renderLinks) { + removeLinkUi(link); + } + }); + + graph.forEachNode(function(node) { + releaseNodeEvents(node); + removeNodeUi(node); + }); + + layout.dispose(); + releaseDom(); + } +} - function onGraphChanged(changes) { - var i, change; - for (i = 0; i < changes.length; i += 1) { - change = changes[i]; - if (change.node) { - processNodeChange(change); - } else if (change.link) { - processLinkChange(change); - } - } - - resetStable(); - } - - function onWindowResized() { - updateCenter(); - onRenderFrame(); - } - - function releaseContainerDragManager() { - if (containerDrag) { - containerDrag.release(); - containerDrag = null; - } - } - - function releaseGraphEvents() { - graph.off('changed', onGraphChanged); - } - - function scale(out, scrollPoint) { - if (!scrollPoint) { - var containerSize = getDimension(container); - scrollPoint = { - x: containerSize.width / 2, - y: containerSize.height / 2 - }; - } - var scaleFactor = Math.pow(1 + 0.4, out ? -0.2 : 0.2); - transform.scale = graphics.scale(scaleFactor, scrollPoint); - - renderGraph(); - publicEvents.fire('scale', transform.scale); - - return transform.scale; - } - - function listenToEvents() { - windowEvents.on('resize', onWindowResized); - - releaseContainerDragManager(); - if (isInteractive('drag')) { - containerDrag = dragndrop(container); - containerDrag.onDrag(function(e, offset) { - graphics.translateRel(offset.x, offset.y); - - renderGraph(); - publicEvents.fire('drag', offset); - }); - } - - if (isInteractive('scroll')) { - if (!containerDrag) { - containerDrag = dragndrop(container); - } - containerDrag.onScroll(function(e, scaleOffset, scrollPoint) { - scale(scaleOffset < 0, scrollPoint); - }); - } - - graph.forEachNode(listenNodeEvents); - - releaseGraphEvents(); - graph.on('changed', onGraphChanged); - } - - function stopListenToEvents() { - rendererInitialized = false; - releaseGraphEvents(); - releaseContainerDragManager(); - windowEvents.off('resize', onWindowResized); - publicEvents.off(); - animationTimer.stop(); - - graph.forEachLink(function(link) { - if (settings.renderLinks) { - removeLinkUi(link); - } - }); - - graph.forEachNode(function(node) { - releaseNodeEvents(node); - removeNodeUi(node); - }); - - layout.dispose(); - releaseDom(); - } -} - -},{"../Input/domInputManager.js":34,"../Input/dragndrop.js":35,"../Utils/getDimensions.js":42,"../Utils/timer.js":46,"../Utils/windowEvents.js":47,"./svgGraphics.js":49,"ngraph.events":7,"ngraph.forcelayout":9}],49:[function(require,module,exports){ -/** - * @fileOverview Defines a graph renderer that uses SVG based drawings. - * - * @author Andrei Kashcha (aka anvaka) / https://github.com/anvaka - */ - -module.exports = svgGraphics; - -var svg = require('simplesvg'); -var eventify = require('ngraph.events'); -var domInputManager = require('../Input/domInputManager.js'); - -/** - * Performs svg-based graph rendering. This module does not perform - * layout, but only visualizes nodes and edges of the graph. - */ -function svgGraphics() { - var svgContainer, - svgRoot, - offsetX = 0, - offsetY = 0, - initCallback, - actualScale = 1, - allNodes = {}, - allLinks = {}, -/*jshint unused: false */ - nodeBuilder = function (node) { - return svg("rect") - .attr("width", 10) - .attr("height", 10) - .attr("fill", "#00a2e8"); - }, - - nodePositionCallback = function (nodeUI, pos) { - // TODO: Remove magic 5. It should be half of the width or height of the node. - nodeUI.attr("x", pos.x - 5) - .attr("y", pos.y - 5); - }, - - linkBuilder = function (link) { - return svg("line").attr("stroke", "#999"); - }, - - linkPositionCallback = function (linkUI, fromPos, toPos) { - linkUI.attr("x1", fromPos.x) - .attr("y1", fromPos.y) - .attr("x2", toPos.x) - .attr("y2", toPos.y); - }, - - fireRescaled = function (graphics) { - // TODO: maybe we shall copy changes? - graphics.fire("rescaled"); - }, - - cachedPos = {x : 0, y: 0}, - cachedFromPos = {x : 0, y: 0}, - cachedToPos = {x : 0, y: 0}, - - updateTransform = function () { - if (svgContainer) { - var transform = "matrix(" + actualScale + ", 0, 0," + actualScale + "," + offsetX + "," + offsetY + ")"; - svgContainer.attr("transform", transform); - } - }; - - svgRoot = createSvgRoot(); - - var graphics = { - getNodeUI: function (nodeId) { - return allNodes[nodeId]; - }, - - getLinkUI: function (linkId) { - return allLinks[linkId]; - }, - - /** - * Sets the callback that creates node representation. - * - * @param builderCallback a callback function that accepts graph node - * as a parameter and must return an element representing this node. - * - * @returns If builderCallbackOrNode is a valid callback function, instance of this is returned; - * Otherwise undefined value is returned - */ - node : function (builderCallback) { - if (typeof builderCallback !== "function") { - return; // todo: throw? This is not compatible with old versions - } - - nodeBuilder = builderCallback; - - return this; - }, - - /** - * Sets the callback that creates link representation - * - * @param builderCallback a callback function that accepts graph link - * as a parameter and must return an element representing this link. - * - * @returns If builderCallback is a valid callback function, instance of this is returned; - * Otherwise undefined value is returned. - */ - link : function (builderCallback) { - if (typeof builderCallback !== "function") { - return; // todo: throw? This is not compatible with old versions - } - - linkBuilder = builderCallback; - return this; - }, - - /** - * Allows to override default position setter for the node with a new - * function. newPlaceCallback(nodeUI, position, node) is function which - * is used by updateNodePosition(). - */ - placeNode : function (newPlaceCallback) { - nodePositionCallback = newPlaceCallback; - return this; - }, - - placeLink : function (newPlaceLinkCallback) { - linkPositionCallback = newPlaceLinkCallback; - return this; - }, - - /** - * Called every before renderer starts rendering. - */ - beginRender : function () {}, - - /** - * Called every time when renderer finishes one step of rendering. - */ - endRender : function () {}, - - /** - * Sets translate operation that should be applied to all nodes and links. - */ - graphCenterChanged : function (x, y) { - offsetX = x; - offsetY = y; - updateTransform(); - }, - - /** - * Default input manager listens to DOM events to process nodes drag-n-drop - */ - inputManager : domInputManager, - - translateRel : function (dx, dy) { - var p = svgRoot.createSVGPoint(), - t = svgContainer.getCTM(), - origin = svgRoot.createSVGPoint().matrixTransform(t.inverse()); - - p.x = dx; - p.y = dy; - - p = p.matrixTransform(t.inverse()); - p.x = (p.x - origin.x) * t.a; - p.y = (p.y - origin.y) * t.d; - - t.e += p.x; - t.f += p.y; - - var transform = "matrix(" + t.a + ", 0, 0," + t.d + "," + t.e + "," + t.f + ")"; - svgContainer.attr("transform", transform); - }, - - scale : function (scaleFactor, scrollPoint) { - var p = svgRoot.createSVGPoint(); - p.x = scrollPoint.x; - p.y = scrollPoint.y; - - p = p.matrixTransform(svgContainer.getCTM().inverse()); // translate to SVG coordinates - - // Compute new scale matrix in current mouse position - var k = svgRoot.createSVGMatrix().translate(p.x, p.y).scale(scaleFactor).translate(-p.x, -p.y), - t = svgContainer.getCTM().multiply(k); - - actualScale = t.a; - offsetX = t.e; - offsetY = t.f; - var transform = "matrix(" + t.a + ", 0, 0," + t.d + "," + t.e + "," + t.f + ")"; - svgContainer.attr("transform", transform); - - fireRescaled(this); - return actualScale; - }, - - resetScale : function () { - actualScale = 1; - var transform = "matrix(1, 0, 0, 1, 0, 0)"; - svgContainer.attr("transform", transform); - fireRescaled(this); - return this; - }, - - /** - * Called by Viva.Graph.View.renderer to let concrete graphic output - * provider prepare to render. - */ - init : function (container) { - container.appendChild(svgRoot); - updateTransform(); - // Notify the world if someone waited for update. TODO: should send an event - if (typeof initCallback === "function") { - initCallback(svgRoot); - } - }, - - /** - * Called by Viva.Graph.View.renderer to let concrete graphic output - * provider release occupied resources. - */ - release : function (container) { - if (svgRoot && container) { - container.removeChild(svgRoot); - } - }, - - /** - * Called by Viva.Graph.View.renderer to let concrete graphic output - * provider prepare to render given link of the graph - * - * @param link - model of a link - */ - addLink: function (link, pos) { - var linkUI = linkBuilder(link); - if (!linkUI) { return; } - linkUI.position = pos; - linkUI.link = link; - allLinks[link.id] = linkUI; - if (svgContainer.childElementCount > 0) { - svgContainer.insertBefore(linkUI, svgContainer.firstChild); - } else { - svgContainer.appendChild(linkUI); - } - return linkUI; - }, - - /** - * Called by Viva.Graph.View.renderer to let concrete graphic output - * provider remove link from rendering surface. - * - * @param linkUI visual representation of the link created by link() execution. - **/ - releaseLink : function (link) { - var linkUI = allLinks[link.id]; - if (linkUI) { - svgContainer.removeChild(linkUI); - delete allLinks[link.id]; - } - }, - - /** - * Called by Viva.Graph.View.renderer to let concrete graphic output - * provider prepare to render given node of the graph. - * - * @param nodeUI visual representation of the node created by node() execution. - **/ - addNode : function (node, pos) { - var nodeUI = nodeBuilder(node); - if (!nodeUI) { - return; - } - nodeUI.position = pos; - nodeUI.node = node; - allNodes[node.id] = nodeUI; - - svgContainer.appendChild(nodeUI); - - return nodeUI; - }, - - /** - * Called by Viva.Graph.View.renderer to let concrete graphic output - * provider remove node from rendering surface. - * - * @param node graph's node - **/ - releaseNode : function (node) { - var nodeUI = allNodes[node.id]; - if (nodeUI) { - svgContainer.removeChild(nodeUI); - delete allNodes[node.id]; - } - }, - - renderNodes : function () { - for (var key in allNodes) { - if (allNodes.hasOwnProperty(key)) { - var nodeUI = allNodes[key]; - cachedPos.x = nodeUI.position.x; - cachedPos.y = nodeUI.position.y; - nodePositionCallback(nodeUI, cachedPos, nodeUI.node); - } - } - }, - - renderLinks : function () { - for (var key in allLinks) { - if (allLinks.hasOwnProperty(key)) { - var linkUI = allLinks[key]; - cachedFromPos.x = linkUI.position.from.x; - cachedFromPos.y = linkUI.position.from.y; - cachedToPos.x = linkUI.position.to.x; - cachedToPos.y = linkUI.position.to.y; - linkPositionCallback(linkUI, cachedFromPos, cachedToPos, linkUI.link); - } - } - }, - - /** - * Returns root element which hosts graphics. - */ - getGraphicsRoot : function (callbackWhenReady) { - // todo: should fire an event, instead of having this context. - if (typeof callbackWhenReady === "function") { - if (svgRoot) { - callbackWhenReady(svgRoot); - } else { - initCallback = callbackWhenReady; - } - } - return svgRoot; - }, - /** - * Returns root SVG element. - * - * Note: This is internal method specific to this renderer - */ - getSvgRoot : function () { - return svgRoot; - } - }; - - - // Let graphics fire events before we return it to the caller. - eventify(graphics); - - return graphics; - - function createSvgRoot() { - var svgRoot = svg("svg"); - - svgContainer = svg("g") - .attr("buffered-rendering", "dynamic"); - - svgRoot.appendChild(svgContainer); - return svgRoot; - } -} +},{"../Input/domInputManager.js":34,"../Input/dragndrop.js":35,"../Utils/getDimensions.js":42,"../Utils/timer.js":46,"../Utils/windowEvents.js":47,"./svgGraphics.js":49,"ngraph.events":7,"ngraph.forcelayout":9}],49:[function(require,module,exports){ +/** + * @fileOverview Defines a graph renderer that uses SVG based drawings. + * + * @author Andrei Kashcha (aka anvaka) / https://github.com/anvaka + */ + +module.exports = svgGraphics; + +var svg = require('simplesvg'); +var eventify = require('ngraph.events'); +var domInputManager = require('../Input/domInputManager.js'); + +/** + * Performs svg-based graph rendering. This module does not perform + * layout, but only visualizes nodes and edges of the graph. + */ +function svgGraphics() { + var svgContainer, + svgRoot, + offsetX = 0, + offsetY = 0, + initCallback, + actualScale = 1, + allNodes = {}, + allLinks = {}, +/*jshint unused: false */ + nodeBuilder = function (node) { + return svg("rect") + .attr("width", 10) + .attr("height", 10) + .attr("fill", "#00a2e8"); + }, + + nodePositionCallback = function (nodeUI, pos) { + // TODO: Remove magic 5. It should be half of the width or height of the node. + nodeUI.attr("x", pos.x - 5) + .attr("y", pos.y - 5); + }, + + linkBuilder = function (link) { + return svg("line").attr("stroke", "#999"); + }, + + linkPositionCallback = function (linkUI, fromPos, toPos) { + linkUI.attr("x1", fromPos.x) + .attr("y1", fromPos.y) + .attr("x2", toPos.x) + .attr("y2", toPos.y); + }, + + fireRescaled = function (graphics) { + // TODO: maybe we shall copy changes? + graphics.fire("rescaled"); + }, + + cachedPos = {x : 0, y: 0}, + cachedFromPos = {x : 0, y: 0}, + cachedToPos = {x : 0, y: 0}, + + updateTransform = function () { + if (svgContainer) { + var transform = "matrix(" + actualScale + ", 0, 0," + actualScale + "," + offsetX + "," + offsetY + ")"; + svgContainer.attr("transform", transform); + } + }; + + svgRoot = createSvgRoot(); + + var graphics = { + getNodeUI: function (nodeId) { + return allNodes[nodeId]; + }, + + getLinkUI: function (linkId) { + return allLinks[linkId]; + }, + + /** + * Sets the callback that creates node representation. + * + * @param builderCallback a callback function that accepts graph node + * as a parameter and must return an element representing this node. + * + * @returns If builderCallbackOrNode is a valid callback function, instance of this is returned; + * Otherwise undefined value is returned + */ + node : function (builderCallback) { + if (typeof builderCallback !== "function") { + return; // todo: throw? This is not compatible with old versions + } + + nodeBuilder = builderCallback; + + return this; + }, + + /** + * Sets the callback that creates link representation + * + * @param builderCallback a callback function that accepts graph link + * as a parameter and must return an element representing this link. + * + * @returns If builderCallback is a valid callback function, instance of this is returned; + * Otherwise undefined value is returned. + */ + link : function (builderCallback) { + if (typeof builderCallback !== "function") { + return; // todo: throw? This is not compatible with old versions + } + + linkBuilder = builderCallback; + return this; + }, + + /** + * Allows to override default position setter for the node with a new + * function. newPlaceCallback(nodeUI, position, node) is function which + * is used by updateNodePosition(). + */ + placeNode : function (newPlaceCallback) { + nodePositionCallback = newPlaceCallback; + return this; + }, + + placeLink : function (newPlaceLinkCallback) { + linkPositionCallback = newPlaceLinkCallback; + return this; + }, + + /** + * Called every before renderer starts rendering. + */ + beginRender : function () {}, + + /** + * Called every time when renderer finishes one step of rendering. + */ + endRender : function () {}, + + /** + * Sets translate operation that should be applied to all nodes and links. + */ + graphCenterChanged : function (x, y) { + offsetX = x; + offsetY = y; + updateTransform(); + }, + + /** + * Default input manager listens to DOM events to process nodes drag-n-drop + */ + inputManager : domInputManager, + + translateRel : function (dx, dy) { + var p = svgRoot.createSVGPoint(), + t = svgContainer.getCTM(), + origin = svgRoot.createSVGPoint().matrixTransform(t.inverse()); + + p.x = dx; + p.y = dy; + + p = p.matrixTransform(t.inverse()); + p.x = (p.x - origin.x) * t.a; + p.y = (p.y - origin.y) * t.d; + + t.e += p.x; + t.f += p.y; + + var transform = "matrix(" + t.a + ", 0, 0," + t.d + "," + t.e + "," + t.f + ")"; + svgContainer.attr("transform", transform); + }, + + scale : function (scaleFactor, scrollPoint) { + var p = svgRoot.createSVGPoint(); + p.x = scrollPoint.x; + p.y = scrollPoint.y; + + p = p.matrixTransform(svgContainer.getCTM().inverse()); // translate to SVG coordinates + + // Compute new scale matrix in current mouse position + var k = svgRoot.createSVGMatrix().translate(p.x, p.y).scale(scaleFactor).translate(-p.x, -p.y), + t = svgContainer.getCTM().multiply(k); + + actualScale = t.a; + offsetX = t.e; + offsetY = t.f; + var transform = "matrix(" + t.a + ", 0, 0," + t.d + "," + t.e + "," + t.f + ")"; + svgContainer.attr("transform", transform); + + fireRescaled(this); + return actualScale; + }, + + resetScale : function () { + actualScale = 1; + var transform = "matrix(1, 0, 0, 1, 0, 0)"; + svgContainer.attr("transform", transform); + fireRescaled(this); + return this; + }, + + /** + * Called by Viva.Graph.View.renderer to let concrete graphic output + * provider prepare to render. + */ + init : function (container) { + container.appendChild(svgRoot); + updateTransform(); + // Notify the world if someone waited for update. TODO: should send an event + if (typeof initCallback === "function") { + initCallback(svgRoot); + } + }, + + /** + * Called by Viva.Graph.View.renderer to let concrete graphic output + * provider release occupied resources. + */ + release : function (container) { + if (svgRoot && container) { + container.removeChild(svgRoot); + } + }, + + /** + * Called by Viva.Graph.View.renderer to let concrete graphic output + * provider prepare to render given link of the graph + * + * @param link - model of a link + */ + addLink: function (link, pos) { + var linkUI = linkBuilder(link); + if (!linkUI) { return; } + linkUI.position = pos; + linkUI.link = link; + allLinks[link.id] = linkUI; + if (svgContainer.childElementCount > 0) { + svgContainer.insertBefore(linkUI, svgContainer.firstChild); + } else { + svgContainer.appendChild(linkUI); + } + return linkUI; + }, + + /** + * Called by Viva.Graph.View.renderer to let concrete graphic output + * provider remove link from rendering surface. + * + * @param linkUI visual representation of the link created by link() execution. + **/ + releaseLink : function (link) { + var linkUI = allLinks[link.id]; + if (linkUI) { + svgContainer.removeChild(linkUI); + delete allLinks[link.id]; + } + }, + + /** + * Called by Viva.Graph.View.renderer to let concrete graphic output + * provider prepare to render given node of the graph. + * + * @param nodeUI visual representation of the node created by node() execution. + **/ + addNode : function (node, pos) { + var nodeUI = nodeBuilder(node); + if (!nodeUI) { + return; + } + nodeUI.position = pos; + nodeUI.node = node; + allNodes[node.id] = nodeUI; + + svgContainer.appendChild(nodeUI); + + return nodeUI; + }, + + /** + * Called by Viva.Graph.View.renderer to let concrete graphic output + * provider remove node from rendering surface. + * + * @param node graph's node + **/ + releaseNode : function (node) { + var nodeUI = allNodes[node.id]; + if (nodeUI) { + svgContainer.removeChild(nodeUI); + delete allNodes[node.id]; + } + }, + + renderNodes : function () { + for (var key in allNodes) { + if (allNodes.hasOwnProperty(key)) { + var nodeUI = allNodes[key]; + cachedPos.x = nodeUI.position.x; + cachedPos.y = nodeUI.position.y; + nodePositionCallback(nodeUI, cachedPos, nodeUI.node); + } + } + }, + + renderLinks : function () { + for (var key in allLinks) { + if (allLinks.hasOwnProperty(key)) { + var linkUI = allLinks[key]; + cachedFromPos.x = linkUI.position.from.x; + cachedFromPos.y = linkUI.position.from.y; + cachedToPos.x = linkUI.position.to.x; + cachedToPos.y = linkUI.position.to.y; + linkPositionCallback(linkUI, cachedFromPos, cachedToPos, linkUI.link); + } + } + }, + + /** + * Returns root element which hosts graphics. + */ + getGraphicsRoot : function (callbackWhenReady) { + // todo: should fire an event, instead of having this context. + if (typeof callbackWhenReady === "function") { + if (svgRoot) { + callbackWhenReady(svgRoot); + } else { + initCallback = callbackWhenReady; + } + } + return svgRoot; + }, + /** + * Returns root SVG element. + * + * Note: This is internal method specific to this renderer + */ + getSvgRoot : function () { + return svgRoot; + } + }; + + + // Let graphics fire events before we return it to the caller. + eventify(graphics); + + return graphics; + + function createSvgRoot() { + var svgRoot = svg("svg"); + + svgContainer = svg("g") + .attr("buffered-rendering", "dynamic"); + + svgRoot.appendChild(svgContainer); + return svgRoot; + } +} },{"../Input/domInputManager.js":34,"ngraph.events":7,"simplesvg":28}],50:[function(require,module,exports){ -/** - * @fileOverview Defines a graph renderer that uses WebGL based drawings. - * - * @author Andrei Kashcha (aka anvaka) / https://github.com/anvaka - */ - -module.exports = webglGraphics; - -var webglInputManager = require('../Input/webglInputManager.js'); -var webglLinkProgram = require('../WebGL/webglLinkProgram.js'); -var webglNodeProgram = require('../WebGL/webglNodeProgram.js'); -var webglSquare = require('../WebGL/webglSquare.js'); -var webglLine = require('../WebGL/webglLine.js'); -var eventify = require('ngraph.events'); -var merge = require('ngraph.merge'); - -/** - * Performs webgl-based graph rendering. This module does not perform - * layout, but only visualizes nodes and edges of the graph. - * - * @param options - to customize graphics behavior. Currently supported parameter - * enableBlending - true by default, allows to use transparency in node/links colors. - * preserveDrawingBuffer - false by default, tells webgl to preserve drawing buffer. - * See https://www.khronos.org/registry/webgl/specs/1.0/#5.2 - */ - -function webglGraphics(options) { - options = merge(options, { - enableBlending : true, - preserveDrawingBuffer : false, - clearColor: false, - clearColorValue : { - r : 1, - g : 1, - b : 1, - a : 1 - } - }); - - var container, - graphicsRoot, - gl, - width, - height, - nodesCount = 0, - linksCount = 0, - transform = [ - 1, 0, 0, 0, - 0, 1, 0, 0, - 0, 0, 1, 0, - 0, 0, 0, 1 - ], - userPlaceNodeCallback, - userPlaceLinkCallback, - nodes = [], - links = [], - initCallback, - - allNodes = {}, - allLinks = {}, - linkProgram = webglLinkProgram(), - nodeProgram = webglNodeProgram(), -/*jshint unused: false */ - nodeUIBuilder = function (node) { - return webglSquare(); // Just make a square, using provided gl context (a nodeProgram); - }, - - linkUIBuilder = function (link) { - return webglLine(0xb3b3b3ff); - }, -/*jshint unused: true */ - updateTransformUniform = function () { - linkProgram.updateTransform(transform); - nodeProgram.updateTransform(transform); - }, - - resetScaleInternal = function () { - transform = [1, 0, 0, 0, - 0, 1, 0, 0, - 0, 0, 1, 0, - 0, 0, 0, 1]; - }, - - updateSize = function () { - if (container && graphicsRoot) { - width = graphicsRoot.width = Math.max(container.offsetWidth, 1); - height = graphicsRoot.height = Math.max(container.offsetHeight, 1); - if (gl) { gl.viewport(0, 0, width, height); } - if (linkProgram) { linkProgram.updateSize(width / 2, height / 2); } - if (nodeProgram) { nodeProgram.updateSize(width / 2, height / 2); } - } - }, - - fireRescaled = function (graphics) { - graphics.fire("rescaled"); - }; - - graphicsRoot = window.document.createElement("canvas"); - - var graphics = { - getLinkUI: function (linkId) { - return allLinks[linkId]; - }, - - getNodeUI: function (nodeId) { - return allNodes[nodeId]; - }, - - /** - * Sets the callback that creates node representation. - * - * @param builderCallback a callback function that accepts graph node - * as a parameter and must return an element representing this node. - * - * @returns If builderCallbackOrNode is a valid callback function, instance of this is returned; - * Otherwise undefined value is returned - */ - node : function (builderCallback) { - if (typeof builderCallback !== "function") { - return; // todo: throw? This is not compatible with old versions - } - - nodeUIBuilder = builderCallback; - - return this; - }, - - /** - * Sets the callback that creates link representation - * - * @param builderCallback a callback function that accepts graph link - * as a parameter and must return an element representing this link. - * - * @returns If builderCallback is a valid callback function, instance of this is returned; - * Otherwise undefined value is returned. - */ - link : function (builderCallback) { - if (typeof builderCallback !== "function") { - return; // todo: throw? This is not compatible with old versions - } - - linkUIBuilder = builderCallback; - return this; - }, - - - /** - * Allows to override default position setter for the node with a new - * function. newPlaceCallback(nodeUI, position) is function which - * is used by updateNodePosition(). - */ - placeNode : function (newPlaceCallback) { - userPlaceNodeCallback = newPlaceCallback; - return this; - }, - - placeLink : function (newPlaceLinkCallback) { - userPlaceLinkCallback = newPlaceLinkCallback; - return this; - }, - - /** - * Custom input manager listens to mouse events to process nodes drag-n-drop inside WebGL canvas - */ - inputManager : webglInputManager, - - /** - * Called every time before renderer starts rendering. - */ - beginRender : function () { - // this function could be replaced by this.init, - // based on user options. - }, - - /** - * Called every time when renderer finishes one step of rendering. - */ - endRender : function () { - if (linksCount > 0) { - linkProgram.render(); - } - if (nodesCount > 0) { - nodeProgram.render(); - } - }, - - bringLinkToFront : function (linkUI) { - var frontLinkId = linkProgram.getFrontLinkId(), - srcLinkId, - temp; - - linkProgram.bringToFront(linkUI); - - if (frontLinkId > linkUI.id) { - srcLinkId = linkUI.id; - - temp = links[frontLinkId]; - links[frontLinkId] = links[srcLinkId]; - links[frontLinkId].id = frontLinkId; - links[srcLinkId] = temp; - links[srcLinkId].id = srcLinkId; - } - }, - - /** - * Sets translate operation that should be applied to all nodes and links. - */ - graphCenterChanged : function (x, y) { - transform[12] = (2 * x / width) - 1; - transform[13] = 1 - (2 * y / height); - updateTransformUniform(); - }, - - /** - * Called by Viva.Graph.View.renderer to let concrete graphic output - * provider prepare to render given link of the graph - * - * @param link - model of a link - */ - addLink: function (link, boundPosition) { - var uiid = linksCount++, - ui = linkUIBuilder(link); - ui.id = uiid; - ui.pos = boundPosition; - - linkProgram.createLink(ui); - - links[uiid] = ui; - allLinks[link.id] = ui; - return ui; - }, - - /** - * Called by Viva.Graph.View.renderer to let concrete graphic output - * provider prepare to render given node of the graph. - * - * @param nodeUI visual representation of the node created by node() execution. - **/ - addNode : function (node, boundPosition) { - var uiid = nodesCount++, - ui = nodeUIBuilder(node); - - ui.id = uiid; - ui.position = boundPosition; - ui.node = node; - - nodeProgram.createNode(ui); - - nodes[uiid] = ui; - allNodes[node.id] = ui; - return ui; - }, - - translateRel : function (dx, dy) { - transform[12] += (2 * transform[0] * dx / width) / transform[0]; - transform[13] -= (2 * transform[5] * dy / height) / transform[5]; - updateTransformUniform(); - }, - - scale : function (scaleFactor, scrollPoint) { - // Transform scroll point to clip-space coordinates: - var cx = 2 * scrollPoint.x / width - 1, - cy = 1 - (2 * scrollPoint.y) / height; - - cx -= transform[12]; - cy -= transform[13]; - - transform[12] += cx * (1 - scaleFactor); - transform[13] += cy * (1 - scaleFactor); - - transform[0] *= scaleFactor; - transform[5] *= scaleFactor; - - updateTransformUniform(); - fireRescaled(this); - - return transform[0]; - }, - - resetScale : function () { - resetScaleInternal(); - - if (gl) { - updateSize(); - // TODO: what is this? - // gl.useProgram(linksProgram); - // gl.uniform2f(linksProgram.screenSize, width, height); - updateTransformUniform(); - } - return this; - }, - - /** - * Resizes the graphic without resetting the scale. - * Useful with viva graph in a dynamic container - */ - updateSize: updateSize, - - /** - * Called by Viva.Graph.View.renderer to let concrete graphic output - * provider prepare to render. - */ - init : function (c) { - var contextParameters = {}; - - if (options.preserveDrawingBuffer) { - contextParameters.preserveDrawingBuffer = true; - } - - container = c; - - updateSize(); - resetScaleInternal(); - container.appendChild(graphicsRoot); - - - gl = graphicsRoot.getContext("experimental-webgl", contextParameters); - if (!gl) { - var msg = "Could not initialize WebGL. Seems like the browser doesn't support it."; - window.alert(msg); - throw msg; - } - if (options.enableBlending) { - gl.blendFunc(gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA); - gl.enable(gl.BLEND); - } - if (options.clearColor) { - var color = options.clearColorValue; - gl.clearColor(color.r, color.g, color.b, color.a); - // TODO: not the best way, really. Should come up with something better - // what if we need more updates inside beginRender, like depth buffer? - this.beginRender = function () { - gl.clear(gl.COLOR_BUFFER_BIT); - }; - } - - linkProgram.load(gl); - linkProgram.updateSize(width / 2, height / 2); - - nodeProgram.load(gl); - nodeProgram.updateSize(width / 2, height / 2); - - updateTransformUniform(); - - // Notify the world if someone waited for update. TODO: should send an event - if (typeof initCallback === "function") { - initCallback(graphicsRoot); - } - }, - - /** - * Called by Viva.Graph.View.renderer to let concrete graphic output - * provider release occupied resources. - */ - release : function (container) { - if (graphicsRoot && container) { - container.removeChild(graphicsRoot); - // TODO: anything else? - } - }, - - /** - * Checks whether webgl is supported by this browser. - */ - isSupported : function () { - var c = window.document.createElement("canvas"), - gl = c && c.getContext && c.getContext("experimental-webgl"); - return gl; - }, - - /** - * Called by Viva.Graph.View.renderer to let concrete graphic output - * provider remove link from rendering surface. - * - * @param linkUI visual representation of the link created by link() execution. - **/ - releaseLink : function (link) { - if (linksCount > 0) { linksCount -= 1; } - var linkUI = allLinks[link.id]; - delete allLinks[link.id]; - - linkProgram.removeLink(linkUI); - - var linkIdToRemove = linkUI.id; - if (linkIdToRemove < linksCount) { - if (linksCount === 0 || linksCount === linkIdToRemove) { - return; // no more links or removed link is the last one. - } - - var lastLinkUI = links[linksCount]; - links[linkIdToRemove] = lastLinkUI; - lastLinkUI.id = linkIdToRemove; - } - }, - - /** - * Called by Viva.Graph.View.renderer to let concrete graphic output - * provider remove node from rendering surface. - * - * @param nodeUI visual representation of the node created by node() execution. - **/ - releaseNode : function (node) { - if (nodesCount > 0) { nodesCount -= 1; } - var nodeUI = allNodes[node.id]; - delete allNodes[node.id]; - - nodeProgram.removeNode(nodeUI); - - var nodeIdToRemove = nodeUI.id; - if (nodeIdToRemove < nodesCount) { - if (nodesCount === 0 || nodesCount === nodeIdToRemove) { - return; // no more nodes or removed node is the last in the list. - } - - var lastNodeUI = nodes[nodesCount]; - - nodes[nodeIdToRemove] = lastNodeUI; - lastNodeUI.id = nodeIdToRemove; - - // Since concrete shaders may cache properties in the UI element - // we are letting them to make this swap (e.g. image node shader - // uses this approach to update node's offset in the atlas) - nodeProgram.replaceProperties(nodeUI, lastNodeUI); - } - }, - - renderNodes: function () { - var pos = {x : 0, y : 0}; - // WebGL coordinate system is different. Would be better - // to have this transform in the shader code, but it would - // require every shader to be updated.. - for (var i = 0; i < nodesCount; ++i) { - var ui = nodes[i]; - pos.x = ui.position.x; - pos.y = ui.position.y; - if (userPlaceNodeCallback) { - userPlaceNodeCallback(ui, pos); - } - - nodeProgram.position(ui, pos); - } - }, - - renderLinks: function () { - if (this.omitLinksRendering) { return; } - - var toPos = {x : 0, y : 0}; - var fromPos = {x : 0, y : 0}; - for (var i = 0; i < linksCount; ++i) { - var ui = links[i]; - var pos = ui.pos.from; - fromPos.x = pos.x; - fromPos.y = -pos.y; - pos = ui.pos.to; - toPos.x = pos.x; - toPos.y = -pos.y; - if (userPlaceLinkCallback) { - userPlaceLinkCallback(ui, fromPos, toPos); - } - - linkProgram.position(ui, fromPos, toPos); - } - }, - - /** - * Returns root element which hosts graphics. - */ - getGraphicsRoot : function (callbackWhenReady) { - // todo: should fire an event, instead of having this context. - if (typeof callbackWhenReady === "function") { - if (graphicsRoot) { - callbackWhenReady(graphicsRoot); - } else { - initCallback = callbackWhenReady; - } - } - return graphicsRoot; - }, - - /** - * Updates default shader which renders nodes - * - * @param newProgram to use for nodes. - */ - setNodeProgram : function (newProgram) { - if (!gl && newProgram) { - // Nothing created yet. Just set shader to the new one - // and let initialization logic take care about the rest. - nodeProgram = newProgram; - } else if (newProgram) { - throw "Not implemented. Cannot swap shader on the fly... Yet."; - // TODO: unload old shader and reinit. - } - }, - - /** - * Updates default shader which renders links - * - * @param newProgram to use for links. - */ - setLinkProgram : function (newProgram) { - if (!gl && newProgram) { - // Nothing created yet. Just set shader to the new one - // and let initialization logic take care about the rest. - linkProgram = newProgram; - } else if (newProgram) { - throw "Not implemented. Cannot swap shader on the fly... Yet."; - // TODO: unload old shader and reinit. - } - }, - - /** - * Transforms client coordinates into layout coordinates. Client coordinates - * are DOM coordinates relative to the rendering container. Layout - * coordinates are those assigned by by layout algorithm to each node. - * - * @param {Object} p - a point object with `x` and `y` attributes. - * This method mutates p. - */ - transformClientToGraphCoordinates: function (p) { - // TODO: could be a problem when container has margins? - // normalize - p.x = ((2 * p.x) / width) - 1; - p.y = 1 - ((2 * p.y) / height); - - // apply transform - p.x = (p.x - transform[12]) / transform[0]; - p.y = (p.y - transform[13]) / transform[5]; - - // transform to graph coordinates - p.x = p.x * (width / 2); - p.y = p.y * (-height / 2); - - return p; - }, - - /** - * Transforms WebGL coordinates into client coordinates. Reverse of - * `transformClientToGraphCoordinates()` - * - * @param {Object} p - a point object with `x` and `y` attributes, which - * represents a layout coordinate. This method mutates p. - */ - transformGraphToClientCoordinates: function (p) { - // TODO: could be a problem when container has margins? - // transform from graph coordinates - p.x = p.x / (width / 2); - p.y = p.y / (-height / 2); - - // apply transform - p.x = (p.x * transform[0]) + transform[12]; - p.y = (p.y * transform[5]) + transform[13]; - - // denormalize - p.x = ((p.x + 1) * width) / 2; - p.y = ((1 - p.y) * height) / 2; - - return p; - }, - - getNodeAtClientPos: function (clientPos, preciseCheck) { - if (typeof preciseCheck !== "function") { - // we don't know anything about your node structure here :( - // potentially this could be delegated to node program, but for - // right now, we are giving up if you don't pass boundary check - // callback. It answers to a question is nodeUI covers (x, y) - return null; - } - // first transform to graph coordinates: - this.transformClientToGraphCoordinates(clientPos); - // now using precise check iterate over each node and find one within box: - // TODO: This is poor O(N) performance. - for (var i = 0; i < nodesCount; ++i) { - if (preciseCheck(nodes[i], clientPos.x, clientPos.y)) { - return nodes[i].node; - } - } - return null; - } - }; - - // Let graphics fire events before we return it to the caller. - eventify(graphics); - - return graphics; -} +/** + * @fileOverview Defines a graph renderer that uses WebGL based drawings. + * + * @author Andrei Kashcha (aka anvaka) / https://github.com/anvaka + */ + +module.exports = webglGraphics; + +var webglInputManager = require('../Input/webglInputManager.js'); +var webglLinkProgram = require('../WebGL/webglLinkProgram.js'); +var webglNodeProgram = require('../WebGL/webglNodeProgram.js'); +var webglSquare = require('../WebGL/webglSquare.js'); +var webglLine = require('../WebGL/webglLine.js'); +var eventify = require('ngraph.events'); +var merge = require('ngraph.merge'); + +/** + * Performs webgl-based graph rendering. This module does not perform + * layout, but only visualizes nodes and edges of the graph. + * + * @param options - to customize graphics behavior. Currently supported parameter + * enableBlending - true by default, allows to use transparency in node/links colors. + * preserveDrawingBuffer - false by default, tells webgl to preserve drawing buffer. + * See https://www.khronos.org/registry/webgl/specs/1.0/#5.2 + */ + +function webglGraphics(options) { + options = merge(options, { + enableBlending : true, + preserveDrawingBuffer : false, + clearColor: false, + clearColorValue : { + r : 1, + g : 1, + b : 1, + a : 1 + } + }); + + var container, + graphicsRoot, + gl, + width, + height, + nodesCount = 0, + linksCount = 0, + transform = [ + 1, 0, 0, 0, + 0, 1, 0, 0, + 0, 0, 1, 0, + 0, 0, 0, 1 + ], + userPlaceNodeCallback, + userPlaceLinkCallback, + nodes = [], + links = [], + initCallback, + + allNodes = {}, + allLinks = {}, + linkProgram = webglLinkProgram(), + nodeProgram = webglNodeProgram(), +/*jshint unused: false */ + nodeUIBuilder = function (node) { + return webglSquare(); // Just make a square, using provided gl context (a nodeProgram); + }, + + linkUIBuilder = function (link) { + return webglLine(0xb3b3b3ff); + }, +/*jshint unused: true */ + updateTransformUniform = function () { + linkProgram.updateTransform(transform); + nodeProgram.updateTransform(transform); + }, + + resetScaleInternal = function () { + transform = [1, 0, 0, 0, + 0, 1, 0, 0, + 0, 0, 1, 0, + 0, 0, 0, 1]; + }, + + updateSize = function () { + if (container && graphicsRoot) { + width = graphicsRoot.width = Math.max(container.offsetWidth, 1); + height = graphicsRoot.height = Math.max(container.offsetHeight, 1); + if (gl) { gl.viewport(0, 0, width, height); } + if (linkProgram) { linkProgram.updateSize(width / 2, height / 2); } + if (nodeProgram) { nodeProgram.updateSize(width / 2, height / 2); } + } + }, + + fireRescaled = function (graphics) { + graphics.fire("rescaled"); + }; + + graphicsRoot = window.document.createElement("canvas"); + + var graphics = { + getLinkUI: function (linkId) { + return allLinks[linkId]; + }, + + getNodeUI: function (nodeId) { + return allNodes[nodeId]; + }, + + /** + * Sets the callback that creates node representation. + * + * @param builderCallback a callback function that accepts graph node + * as a parameter and must return an element representing this node. + * + * @returns If builderCallbackOrNode is a valid callback function, instance of this is returned; + * Otherwise undefined value is returned + */ + node : function (builderCallback) { + if (typeof builderCallback !== "function") { + return; // todo: throw? This is not compatible with old versions + } + + nodeUIBuilder = builderCallback; + + return this; + }, + + /** + * Sets the callback that creates link representation + * + * @param builderCallback a callback function that accepts graph link + * as a parameter and must return an element representing this link. + * + * @returns If builderCallback is a valid callback function, instance of this is returned; + * Otherwise undefined value is returned. + */ + link : function (builderCallback) { + if (typeof builderCallback !== "function") { + return; // todo: throw? This is not compatible with old versions + } + + linkUIBuilder = builderCallback; + return this; + }, + + + /** + * Allows to override default position setter for the node with a new + * function. newPlaceCallback(nodeUI, position) is function which + * is used by updateNodePosition(). + */ + placeNode : function (newPlaceCallback) { + userPlaceNodeCallback = newPlaceCallback; + return this; + }, + + placeLink : function (newPlaceLinkCallback) { + userPlaceLinkCallback = newPlaceLinkCallback; + return this; + }, + + /** + * Custom input manager listens to mouse events to process nodes drag-n-drop inside WebGL canvas + */ + inputManager : webglInputManager, + + /** + * Called every time before renderer starts rendering. + */ + beginRender : function () { + // this function could be replaced by this.init, + // based on user options. + }, + + /** + * Called every time when renderer finishes one step of rendering. + */ + endRender : function () { + if (linksCount > 0) { + linkProgram.render(); + } + if (nodesCount > 0) { + nodeProgram.render(); + } + }, + + bringLinkToFront : function (linkUI) { + var frontLinkId = linkProgram.getFrontLinkId(), + srcLinkId, + temp; + + linkProgram.bringToFront(linkUI); + + if (frontLinkId > linkUI.id) { + srcLinkId = linkUI.id; + + temp = links[frontLinkId]; + links[frontLinkId] = links[srcLinkId]; + links[frontLinkId].id = frontLinkId; + links[srcLinkId] = temp; + links[srcLinkId].id = srcLinkId; + } + }, + + /** + * Sets translate operation that should be applied to all nodes and links. + */ + graphCenterChanged : function (x, y) { + transform[12] = (2 * x / width) - 1; + transform[13] = 1 - (2 * y / height); + updateTransformUniform(); + }, + + /** + * Called by Viva.Graph.View.renderer to let concrete graphic output + * provider prepare to render given link of the graph + * + * @param link - model of a link + */ + addLink: function (link, boundPosition) { + var uiid = linksCount++, + ui = linkUIBuilder(link); + ui.id = uiid; + ui.pos = boundPosition; + + linkProgram.createLink(ui); + + links[uiid] = ui; + allLinks[link.id] = ui; + return ui; + }, + + /** + * Called by Viva.Graph.View.renderer to let concrete graphic output + * provider prepare to render given node of the graph. + * + * @param nodeUI visual representation of the node created by node() execution. + **/ + addNode : function (node, boundPosition) { + var uiid = nodesCount++, + ui = nodeUIBuilder(node); + + ui.id = uiid; + ui.position = boundPosition; + ui.node = node; + + nodeProgram.createNode(ui); + + nodes[uiid] = ui; + allNodes[node.id] = ui; + return ui; + }, + + translateRel : function (dx, dy) { + transform[12] += (2 * transform[0] * dx / width) / transform[0]; + transform[13] -= (2 * transform[5] * dy / height) / transform[5]; + updateTransformUniform(); + }, + + scale : function (scaleFactor, scrollPoint) { + // Transform scroll point to clip-space coordinates: + var cx = 2 * scrollPoint.x / width - 1, + cy = 1 - (2 * scrollPoint.y) / height; + + cx -= transform[12]; + cy -= transform[13]; + + transform[12] += cx * (1 - scaleFactor); + transform[13] += cy * (1 - scaleFactor); + + transform[0] *= scaleFactor; + transform[5] *= scaleFactor; + + updateTransformUniform(); + fireRescaled(this); + + return transform[0]; + }, + + resetScale : function () { + resetScaleInternal(); + + if (gl) { + updateSize(); + // TODO: what is this? + // gl.useProgram(linksProgram); + // gl.uniform2f(linksProgram.screenSize, width, height); + updateTransformUniform(); + } + return this; + }, + + /** + * Resizes the graphic without resetting the scale. + * Useful with viva graph in a dynamic container + */ + updateSize: updateSize, + + /** + * Called by Viva.Graph.View.renderer to let concrete graphic output + * provider prepare to render. + */ + init : function (c) { + var contextParameters = {}; + + if (options.preserveDrawingBuffer) { + contextParameters.preserveDrawingBuffer = true; + } + + container = c; + + updateSize(); + resetScaleInternal(); + container.appendChild(graphicsRoot); + + + gl = graphicsRoot.getContext("experimental-webgl", contextParameters); + if (!gl) { + var msg = "Could not initialize WebGL. Seems like the browser doesn't support it."; + window.alert(msg); + throw msg; + } + if (options.enableBlending) { + gl.blendFunc(gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA); + gl.enable(gl.BLEND); + } + if (options.clearColor) { + var color = options.clearColorValue; + gl.clearColor(color.r, color.g, color.b, color.a); + // TODO: not the best way, really. Should come up with something better + // what if we need more updates inside beginRender, like depth buffer? + this.beginRender = function () { + gl.clear(gl.COLOR_BUFFER_BIT); + }; + } + + linkProgram.load(gl); + linkProgram.updateSize(width / 2, height / 2); + + nodeProgram.load(gl); + nodeProgram.updateSize(width / 2, height / 2); + + updateTransformUniform(); + + // Notify the world if someone waited for update. TODO: should send an event + if (typeof initCallback === "function") { + initCallback(graphicsRoot); + } + }, + + /** + * Called by Viva.Graph.View.renderer to let concrete graphic output + * provider release occupied resources. + */ + release : function (container) { + if (graphicsRoot && container) { + container.removeChild(graphicsRoot); + // TODO: anything else? + } + }, + + /** + * Checks whether webgl is supported by this browser. + */ + isSupported : function () { + var c = window.document.createElement("canvas"), + gl = c && c.getContext && c.getContext("experimental-webgl"); + return gl; + }, + + /** + * Called by Viva.Graph.View.renderer to let concrete graphic output + * provider remove link from rendering surface. + * + * @param linkUI visual representation of the link created by link() execution. + **/ + releaseLink : function (link) { + if (linksCount > 0) { linksCount -= 1; } + var linkUI = allLinks[link.id]; + delete allLinks[link.id]; + + linkProgram.removeLink(linkUI); + + var linkIdToRemove = linkUI.id; + if (linkIdToRemove < linksCount) { + if (linksCount === 0 || linksCount === linkIdToRemove) { + return; // no more links or removed link is the last one. + } + + var lastLinkUI = links[linksCount]; + links[linkIdToRemove] = lastLinkUI; + lastLinkUI.id = linkIdToRemove; + } + }, + + /** + * Called by Viva.Graph.View.renderer to let concrete graphic output + * provider remove node from rendering surface. + * + * @param nodeUI visual representation of the node created by node() execution. + **/ + releaseNode : function (node) { + if (nodesCount > 0) { nodesCount -= 1; } + var nodeUI = allNodes[node.id]; + delete allNodes[node.id]; + + nodeProgram.removeNode(nodeUI); + + var nodeIdToRemove = nodeUI.id; + if (nodeIdToRemove < nodesCount) { + if (nodesCount === 0 || nodesCount === nodeIdToRemove) { + return; // no more nodes or removed node is the last in the list. + } + + var lastNodeUI = nodes[nodesCount]; + + nodes[nodeIdToRemove] = lastNodeUI; + lastNodeUI.id = nodeIdToRemove; + + // Since concrete shaders may cache properties in the UI element + // we are letting them to make this swap (e.g. image node shader + // uses this approach to update node's offset in the atlas) + nodeProgram.replaceProperties(nodeUI, lastNodeUI); + } + }, + + renderNodes: function () { + var pos = {x : 0, y : 0}; + // WebGL coordinate system is different. Would be better + // to have this transform in the shader code, but it would + // require every shader to be updated.. + for (var i = 0; i < nodesCount; ++i) { + var ui = nodes[i]; + pos.x = ui.position.x; + pos.y = ui.position.y; + if (userPlaceNodeCallback) { + userPlaceNodeCallback(ui, pos); + } + + nodeProgram.position(ui, pos); + } + }, + + renderLinks: function () { + if (this.omitLinksRendering) { return; } + + var toPos = {x : 0, y : 0}; + var fromPos = {x : 0, y : 0}; + for (var i = 0; i < linksCount; ++i) { + var ui = links[i]; + var pos = ui.pos.from; + fromPos.x = pos.x; + fromPos.y = -pos.y; + pos = ui.pos.to; + toPos.x = pos.x; + toPos.y = -pos.y; + if (userPlaceLinkCallback) { + userPlaceLinkCallback(ui, fromPos, toPos); + } + + linkProgram.position(ui, fromPos, toPos); + } + }, + + /** + * Returns root element which hosts graphics. + */ + getGraphicsRoot : function (callbackWhenReady) { + // todo: should fire an event, instead of having this context. + if (typeof callbackWhenReady === "function") { + if (graphicsRoot) { + callbackWhenReady(graphicsRoot); + } else { + initCallback = callbackWhenReady; + } + } + return graphicsRoot; + }, + + /** + * Updates default shader which renders nodes + * + * @param newProgram to use for nodes. + */ + setNodeProgram : function (newProgram) { + if (!gl && newProgram) { + // Nothing created yet. Just set shader to the new one + // and let initialization logic take care about the rest. + nodeProgram = newProgram; + } else if (newProgram) { + throw "Not implemented. Cannot swap shader on the fly... Yet."; + // TODO: unload old shader and reinit. + } + }, + + /** + * Updates default shader which renders links + * + * @param newProgram to use for links. + */ + setLinkProgram : function (newProgram) { + if (!gl && newProgram) { + // Nothing created yet. Just set shader to the new one + // and let initialization logic take care about the rest. + linkProgram = newProgram; + } else if (newProgram) { + throw "Not implemented. Cannot swap shader on the fly... Yet."; + // TODO: unload old shader and reinit. + } + }, + + /** + * Transforms client coordinates into layout coordinates. Client coordinates + * are DOM coordinates relative to the rendering container. Layout + * coordinates are those assigned by by layout algorithm to each node. + * + * @param {Object} p - a point object with `x` and `y` attributes. + * This method mutates p. + */ + transformClientToGraphCoordinates: function (p) { + // TODO: could be a problem when container has margins? + // normalize + p.x = ((2 * p.x) / width) - 1; + p.y = 1 - ((2 * p.y) / height); + + // apply transform + p.x = (p.x - transform[12]) / transform[0]; + p.y = (p.y - transform[13]) / transform[5]; + + // transform to graph coordinates + p.x = p.x * (width / 2); + p.y = p.y * (-height / 2); + + return p; + }, + + /** + * Transforms WebGL coordinates into client coordinates. Reverse of + * `transformClientToGraphCoordinates()` + * + * @param {Object} p - a point object with `x` and `y` attributes, which + * represents a layout coordinate. This method mutates p. + */ + transformGraphToClientCoordinates: function (p) { + // TODO: could be a problem when container has margins? + // transform from graph coordinates + p.x = p.x / (width / 2); + p.y = p.y / (-height / 2); + + // apply transform + p.x = (p.x * transform[0]) + transform[12]; + p.y = (p.y * transform[5]) + transform[13]; + + // denormalize + p.x = ((p.x + 1) * width) / 2; + p.y = ((1 - p.y) * height) / 2; + + return p; + }, + + getNodeAtClientPos: function (clientPos, preciseCheck) { + if (typeof preciseCheck !== "function") { + // we don't know anything about your node structure here :( + // potentially this could be delegated to node program, but for + // right now, we are giving up if you don't pass boundary check + // callback. It answers to a question is nodeUI covers (x, y) + return null; + } + // first transform to graph coordinates: + this.transformClientToGraphCoordinates(clientPos); + // now using precise check iterate over each node and find one within box: + // TODO: This is poor O(N) performance. + for (var i = 0; i < nodesCount; ++i) { + if (preciseCheck(nodes[i], clientPos.x, clientPos.y)) { + return nodes[i].node; + } + } + return null; + } + }; + + // Let graphics fire events before we return it to the caller. + eventify(graphics); + + return graphics; +} },{"../Input/webglInputManager.js":36,"../WebGL/webglLine.js":58,"../WebGL/webglLinkProgram.js":59,"../WebGL/webglNodeProgram.js":60,"../WebGL/webglSquare.js":61,"ngraph.events":7,"ngraph.merge":13}],51:[function(require,module,exports){ module.exports = parseColor; diff --git a/dist/vivagraph.min.js b/dist/vivagraph.min.js index bd2b3f4..3e2be0b 100644 --- a/dist/vivagraph.min.js +++ b/dist/vivagraph.min.js @@ -1,2 +1,2 @@ !function(e){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=e();else if("function"==typeof define&&define.amd)define([],e);else{var n;"undefined"!=typeof window?n=window:"undefined"!=typeof global?n=global:"undefined"!=typeof self&&(n=self),n.Viva=e()}}(function(){return function e(n,t,r){function o(a,u){if(!t[a]){if(!n[a]){var s="function"==typeof require&&require;if(!u&&s)return s(a,!0);if(i)return i(a,!0);var f=new Error("Cannot find module '"+a+"'");throw f.code="MODULE_NOT_FOUND",f}var c=t[a]={exports:{}};n[a][0].call(c.exports,function(e){var t=n[a][1][e];return o(t?t:e)},c,c.exports,e,n,t,r)}return t[a].exports}for(var i="function"==typeof require&&require,a=0;a=0==m>=4?null:(f=u-i,d=o-a,p=a*i-o*u,v=f*e+d*n+p,g=f*t+d*r+p,0!==v&&0!==g&&v>=0==g>=0?null:(y=s*d-f*c,0===y?null:(x=y<0?-y/2:y/2,x=0,w=c*p-d*l,b.x=(w<0?w-x:w+x)/y,w=f*l-s*p,b.y=(w<0?w-x:w+x)/y,b)))}n.exports=r},{}],4:[function(e,n,t){n.exports.degree=e("./src/degree.js"),n.exports.betweenness=e("./src/betweenness.js")},{"./src/betweenness.js":5,"./src/degree.js":6}],5:[function(e,n,t){function r(e,n){function t(e){g[e]/=2}function r(e){g[e.id]=0}function o(e){s=e.id,u(s),i()}function i(){for(e.forEachNode(a);c.length;){for(var n=c.pop(),t=(1+v[n])/p[n],r=d[n],o=0;o1&&(o=Array.prototype.splice.call(arguments,1));for(var i=0;i0&&o.addLink(i,t-1+r*e),r>0&&o.addLink(i,t+(r-1)*e)}return o}function f(e,n,t){if(e<1||n<1||t<1)throw new Error("Invalid number of nodes in grid3 graph");var r,o,i,a=p();if(1===e&&1===n&&1===t)return a.addNode(0),a;for(i=0;i0&&a.addLink(s,r-1+o*e+u),o>0&&a.addLink(s,r+(o-1)*e+u),i>0&&a.addLink(s,r+o*e+(i-1)*e*n)}return a}function c(e){if(e<0)throw new Error("Invalid number of nodes in balanced tree");var n,t=p(),r=Math.pow(2,e);for(0===e&&t.addNode(1),n=1;n= 0");var n,t=p();for(n=0;n=n)throw new Error("Choose smaller `k`. It cannot be larger than number of nodes `n`");var i,a,u=e("ngraph.random").random(o||42),s=p();for(i=0;i=0&&t.links.splice(n,1)),r&&(n=o(e,r.links),n>=0&&r.links.splice(n,1)),U(e,"remove"),F(),!0}function h(e,n){var t,r=f(e);if(!r)return null;for(t=0;t0&&(O.fire("changed",M),M.length=0)}function P(){return Object.keys?k:j}function k(e){if("function"==typeof e)for(var n=Object.keys(A),t=0;t=0?i:-1,o);return v.push(a),a},getTotalMovement:function(){return x},removeSpring:function(e){if(e){var n=v.indexOf(e);return n>-1?(v.splice(n,1),!0):void 0}},getBestNewBodyPosition:function(e){return h.getBestNewPosition(e)},getBBox:function(){return h.box},gravity:function(e){return void 0!==e?(n.gravity=e,g.options({gravity:e}),this):n.gravity},theta:function(e){return void 0!==e?(n.theta=e,g.options({theta:e}),this):n.theta}};return o(n,w),a(w),w}n.exports=r},{"./lib/bounds":16,"./lib/createBody":17,"./lib/dragForce":18,"./lib/eulerIntegrator":19,"./lib/spring":20,"./lib/springForce":21,"ngraph.events":7,"ngraph.expose":8,"ngraph.merge":13,"ngraph.quadtreebh":22}],16:[function(e,n,t){n.exports=function(n,t){function r(){var e=n.length;if(0!==e){for(var t=Number.MAX_VALUE,r=Number.MAX_VALUE,o=Number.MIN_VALUE,a=Number.MIN_VALUE;e--;){var u=n[e];u.isPinned?(u.pos.x=u.prevPos.x,u.pos.y=u.prevPos.y):(u.prevPos.x=u.pos.x,u.prevPos.y=u.pos.y),u.pos.xo&&(o=u.pos.x),u.pos.ya&&(a=u.pos.y)}i.x1=t,i.x2=o,i.y1=r,i.y2=a}}var o=e("ngraph.random").random(42),i={x1:0,y1:0,x2:0,y2:0};return{box:i,update:r,reset:function(){i.x1=i.y1=0,i.x2=i.y2=0},getBestNewPosition:function(e){var n=i,r=0,a=0;if(e.length){for(var u=0;u1&&(s.velocity.x=c/l,s.velocity.y=d/l),r=n*s.velocity.x,i=n*s.velocity.y,s.pos.x+=r,s.pos.y+=i,o+=Math.abs(r),a+=Math.abs(i)}return(o*o+a*a)/u}n.exports=r},{}],20:[function(e,n,t){function r(e,n,t,r,o){this.from=e,this.to=n,this.length=t,this.coeff=r,this.weight="number"==typeof o?o:1}n.exports=r},{}],21:[function(e,n,t){n.exports=function(n){var t=e("ngraph.merge"),r=e("ngraph.random").random(42),o=e("ngraph.expose");n=t(n,{springCoeff:2e-4,springLength:80});var i={update:function(e){var t=e.from,o=e.to,i=e.length<0?n.springLength:e.length,a=o.pos.x-t.pos.x,u=o.pos.y-t.pos.y,s=Math.sqrt(a*a+u*u);0===s&&(a=(r.nextDouble()-.5)/50,u=(r.nextDouble()-.5)/50,s=Math.sqrt(a*a+u*u));var f=s-i,c=(!e.coeff||e.coeff<0?n.springCoeff:e.coeff)*f/s*e.weight;t.force.x+=c*a,t.force.y+=c*u,o.force.x-=c*a,o.force.y-=c*u}};return o(n,i,["springCoeff","springLength"]),i}},{"ngraph.expose":8,"ngraph.merge":13,"ngraph.random":26}],22:[function(e,n,t){function r(e,n){return 0===n?e.quad0:1===n?e.quad1:2===n?e.quad2:3===n?e.quad3:null}function o(e,n,t){0===n?e.quad0=t:1===n?e.quad1=t:2===n?e.quad2=t:3===n&&(e.quad3=t)}n.exports=function(n){function t(){var e=h[m];return e?(e.quad0=null,e.quad1=null,e.quad2=null,e.quad3=null,e.body=null,e.mass=e.massX=e.massY=0,e.left=e.right=e.top=e.bottom=0):(e=new f,h[m]=e),++m,e}function i(e){var n,t,r,o,i=p,a=0,u=0,f=1,c=0,d=1;for(i[0]=y;f;){var v=i[c],h=v.body;f-=1,c+=1;var m=h!==e;h&&m?(t=h.pos.x-e.pos.x,r=h.pos.y-e.pos.y,o=Math.sqrt(t*t+r*r),0===o&&(t=(s.nextDouble()-.5)/50,r=(s.nextDouble()-.5)/50,o=Math.sqrt(t*t+r*r)),n=l*h.mass*e.mass/(o*o*o),a+=n*t,u+=n*r):m&&(t=v.massX/v.mass-e.pos.x,r=v.massY/v.mass-e.pos.y,o=Math.sqrt(t*t+r*r),0===o&&(t=(s.nextDouble()-.5)/50,r=(s.nextDouble()-.5)/50,o=Math.sqrt(t*t+r*r)),(v.right-v.left)/oi&&(i=f),ca&&(a=c)}var d=i-r,l=a-o;for(d>l?a=o+d:i=r+l,m=0,y=t(),y.left=r,y.right=i,y.top=o,y.bottom=a,n=s-1,n>=0&&(y.body=e[n]);n--;)u(e[n],y)}function u(e){for(v.reset(),v.push(y,e);!v.isEmpty();){var n=v.pop(),i=n.node,a=n.body;if(i.body){var u=i.body;if(i.body=null,d(u.pos,a.pos)){var f=3;do{var c=s.nextDouble(),l=(i.right-i.left)*c,p=(i.bottom-i.top)*c;u.pos.x=i.left+l,u.pos.y=i.top+p,f-=1}while(f>0&&d(u.pos,a.pos));if(0===f&&d(u.pos,a.pos))return}v.push(i,u),v.push(i,a)}else{var g=a.pos.x,h=a.pos.y;i.mass=i.mass+a.mass,i.massX=i.massX+a.mass*g,i.massY=i.massY+a.mass*h;var m=0,x=i.left,w=(i.right+x)/2,b=i.top,E=(i.bottom+b)/2;g>w&&(m+=1,x=w,w=i.right),h>E&&(m+=2,b=E,E=i.bottom);var L=r(i,m);L?v.push(L,a):(L=t(),L.left=x,L.top=b,L.right=w,L.bottom=E,L.body=a,o(i,m,L))}}}n=n||{},n.gravity="number"==typeof n.gravity?n.gravity:-1,n.theta="number"==typeof n.theta?n.theta:.8;var s=e("ngraph.random").random(1984),f=e("./node"),c=e("./insertStack"),d=e("./isSamePosition"),l=n.gravity,p=[],v=new c,g=n.theta,h=[],m=0,y=t();return{insertBodies:a,getRoot:function(){return y},updateBodyForce:i,options:function(e){return e?("number"==typeof e.gravity&&(l=e.gravity),"number"==typeof e.theta&&(g=e.theta),this):{gravity:l,theta:g}}}}},{"./insertStack":23,"./isSamePosition":24,"./node":25,"ngraph.random":26}],23:[function(e,n,t){function r(){this.stack=[],this.popIdx=0}function o(e,n){this.node=e,this.body=n}n.exports=r,r.prototype={isEmpty:function(){return 0===this.popIdx},push:function(e,n){var t=this.stack[this.popIdx];t?(t.node=e,t.body=n):this.stack[this.popIdx]=new o(e,n),++this.popIdx},pop:function(){if(this.popIdx>0)return this.stack[--this.popIdx]},reset:function(){this.popIdx=0}}},{}],24:[function(e,n,t){n.exports=function(e,n){var t=Math.abs(e.x-n.x),r=Math.abs(e.y-n.y);return t<1e-8&&r<1e-8}},{}],25:[function(e,n,t){n.exports=function(){this.body=null,this.quad0=null,this.quad1=null,this.quad2=null,this.quad3=null,this.mass=0,this.massX=0,this.massY=0,this.left=0,this.top=0,this.bottom=0,this.right=0}},{}],26:[function(e,n,t){function r(e){var n="number"==typeof e?e:+new Date,t=function(){return n=n+2127912214+(n<<12)&4294967295,n=4294967295&(3345072700^n^n>>>19),n=n+374761393+(n<<5)&4294967295,n=4294967295&(n+3550635116^n<<9),n=n+4251993797+(n<<3)&4294967295,n=4294967295&(3042594569^n^n>>>16),(268435455&n)/268435456};return{next:function(e){return Math.floor(t()*e)},nextDouble:function(){return t()}}}function o(e,n){var t=n||r();if("function"!=typeof t.next)throw new Error("customRandom does not match expected API: next() function is missing");return{forEach:function(n){var r,o,i;for(r=e.length-1;r>0;--r)o=t.next(r+1),i=e[o],e[o]=e[r],e[r]=i,n(i);e.length&&n(e[0])},shuffle:function(){var n,r,o;for(n=e.length-1;n>0;--n)r=t.next(n+1),o=e[r],e[r]=e[n],e[n]=o;return e}}}n.exports={random:r,randomIterator:o}},{}],27:[function(e,n,t){function r(e,n,t){function r(e){u.nodes.push(s(e))}function o(e){u.links.push(f(e))}function i(e){var n={id:e.id};return void 0!==e.data&&(n.data=e.data),n}function a(e){var n={fromId:e.fromId,toId:e.toId};return void 0!==e.data&&(n.data=e.data),n}var u={nodes:[],links:[]},s=n||i,f=t||a;return e.forEachNode(r),e.forEachLink(o),JSON.stringify(u)}n.exports=r},{}],28:[function(e,n,t){function r(e,n){var t=o(e);if(void 0===n)return t;for(var r=Object.keys(n),i=0;iv&&(r=1),u(e,r,{x:e.touches[0].clientX,y:e.touches[0].clientY}),v=t,m(e),y(e)}},j=function(e){p=!1,o.off("touchmove",k),o.off("touchend",j),o.off("touchcancel",j),c=null,r&&r(e)},A=function(e,t){m(e),y(e),d=t.clientX,l=t.clientY,c=e.target||e.srcElement,n&&n(e,{x:d,y:l}),p||(p=!0,o.on("touchmove",k),o.on("touchend",j),o.on("touchcancel",j))},_=function(e){return 1===e.touches.length?A(e,e.touches[0]):void(2===e.touches.length&&(m(e), -y(e),v=P(e.touches[0],e.touches[1])))};return e.addEventListener("mousedown",b),e.addEventListener("touchstart",_),{onStart:function(e){return n=e,this},onDrag:function(e){return t=e,this},onStop:function(e){return r=e,this},onScroll:function(e){return N(e),this},release:function(){e.removeEventListener("mousedown",b),e.removeEventListener("touchstart",_),o.off("mousemove",w),o.off("mouseup",E),o.off("touchmove",k),o.off("touchend",j),o.off("touchcancel",j),N(null)}}}n.exports=r;var o=e("../Utils/documentEvents.js"),i=e("../Utils/browserInfo.js"),a=e("../Utils/findElementPosition.js")},{"../Utils/browserInfo.js":39,"../Utils/documentEvents.js":40,"../Utils/findElementPosition.js":41}],36:[function(e,n,t){function r(e,n){var t=o(n),r=null,i={},a={x:0,y:0};return t.mouseDown(function(e,n){r=e,a.x=n.clientX,a.y=n.clientY,t.mouseCapture(r);var o=i[e.id];return o&&o.onStart&&o.onStart(n,a),!0}).mouseUp(function(e){t.releaseMouseCapture(r),r=null;var n=i[e.id];return n&&n.onStop&&n.onStop(),!0}).mouseMove(function(e,n){if(r){var t=i[r.id];return t&&t.onDrag&&t.onDrag(n,{x:n.clientX-a.x,y:n.clientY-a.y}),a.x=n.clientX,a.y=n.clientY,!0}}),{bindDragNDrop:function(e,n){i[e.id]=n,n||delete i[e.id]}}}n.exports=r;var o=e("../WebGL/webglInputEvents.js")},{"../WebGL/webglInputEvents.js":57}],37:[function(e,n,t){function r(e,n){function t(e){return d[e]}n=o(n,{maxX:1024,maxY:1024,seed:"Deterministic randomness made me do this"});var r=i(n.seed),u=new a(Number.MAX_VALUE,Number.MAX_VALUE,Number.MIN_VALUE,Number.MIN_VALUE),s={},f=function(e){return{x:r.next(n.maxX),y:r.next(n.maxY)}},c=function(e,n){e.xn.x2&&(n.x2=e.x),e.yn.y2&&(n.y2=e.y)},d="function"==typeof Object.create?Object.create(null):{},l=function(e){d[e.id]=f(e),c(d[e.id],u)},p=function(){0!==e.getNodesCount()&&(u.x1=Number.MAX_VALUE,u.y1=Number.MAX_VALUE,u.x2=Number.MIN_VALUE,u.y2=Number.MIN_VALUE,e.forEachNode(l))},v=function(e){s[e.id]=e},g=function(e){for(var n=0;n=0:"boolean"!=typeof z||z}function r(){G=G||window.document.body,F=F||i(e,{springLength:80,springCoeff:2e-4}),O=O||a(e,{container:G}),n.hasOwnProperty("renderLinks")||(n.renderLinks=!0),n.prerender=n.prerender||0,U=(O.inputManager||s)(e,O)}function l(){O.beginRender(),n.renderLinks&&O.renderLinks(),O.renderNodes(),O.endRender()}function p(){return W=F.step()&&!H,l(),!W}function v(e){return R?void(V+=e):void(e?(V+=e,R=f(function(){return p()},M)):(X=0,V=0,R=f(p,M)))}function g(){J||(W=!1,R.restart())}function h(){if("number"==typeof n.prerender&&n.prerender>0)for(var e=0;e0?n.insertBefore(r,n.firstChild):n.appendChild(r),r},releaseLink:function(e){var t=d[e.id];t&&(n.removeChild(t),delete d[e.id])},addNode:function(e,t){var r=l(e);if(r)return r.position=t,r.node=e,c[e.id]=r,n.appendChild(r),r},releaseNode:function(e){var t=c[e.id];t&&(n.removeChild(t),delete c[e.id])},renderNodes:function(){for(var e in c)if(c.hasOwnProperty(e)){var n=c[e];m.x=n.position.x,m.y=n.position.y,p(n,m,n.node)}},renderLinks:function(){for(var e in d)if(d.hasOwnProperty(e)){var n=d[e];y.x=n.position.from.x,y.y=n.position.from.y,x.x=n.position.to.x,x.y=n.position.to.y,g(n,y,x,n.link)}},getGraphicsRoot:function(e){return"function"==typeof e&&(t?e(t):r=e),t},getSvgRoot:function(){return t}};return i(b),b}n.exports=r;var o=e("simplesvg"),i=e("ngraph.events"),a=e("../Input/domInputManager.js")},{"../Input/domInputManager.js":34,"ngraph.events":7,simplesvg:28}],50:[function(e,n,t){function r(e){e=c(e,{enableBlending:!0,preserveDrawingBuffer:!1,clearColor:!1,clearColorValue:{r:1,g:1,b:1,a:1}});var n,t,r,d,l,p,v,g,h=0,m=0,y=[1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1],x=[],w=[],b={},E={},L=i(),N=a(),P=function(e){return u()},k=function(e){return s(3014898687)},j=function(){L.updateTransform(y),N.updateTransform(y)},A=function(){y=[1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1]},_=function(){n&&t&&(d=t.width=Math.max(n.offsetWidth,1),l=t.height=Math.max(n.offsetHeight,1),r&&r.viewport(0,0,d,l),L&&L.updateSize(d/2,l/2),N&&N.updateSize(d/2,l/2))},I=function(e){e.fire("rescaled")};t=window.document.createElement("canvas");var T={getLinkUI:function(e){return E[e]},getNodeUI:function(e){return b[e]},node:function(e){if("function"==typeof e)return P=e,this},link:function(e){if("function"==typeof e)return k=e,this},placeNode:function(e){return p=e,this},placeLink:function(e){return v=e,this},inputManager:o,beginRender:function(){},endRender:function(){m>0&&L.render(),h>0&&N.render()},bringLinkToFront:function(e){var n,t,r=L.getFrontLinkId();L.bringToFront(e),r>e.id&&(n=e.id,t=w[r],w[r]=w[n],w[r].id=r,w[n]=t,w[n].id=n)},graphCenterChanged:function(e,n){y[12]=2*e/d-1,y[13]=1-2*n/l,j()},addLink:function(e,n){var t=m++,r=k(e);return r.id=t,r.pos=n,L.createLink(r),w[t]=r,E[e.id]=r,r},addNode:function(e,n){var t=h++,r=P(e);return r.id=t,r.position=n,r.node=e,N.createNode(r),x[t]=r,b[e.id]=r,r},translateRel:function(e,n){y[12]+=2*y[0]*e/d/y[0],y[13]-=2*y[5]*n/l/y[5],j()},scale:function(e,n){var t=2*n.x/d-1,r=1-2*n.y/l;return t-=y[12],r-=y[13],y[12]+=t*(1-e),y[13]+=r*(1-e),y[0]*=e,y[5]*=e,j(),I(this),y[0]},resetScale:function(){return A(),r&&(_(),j()),this},updateSize:_,init:function(o){var i={};if(e.preserveDrawingBuffer&&(i.preserveDrawingBuffer=!0),n=o,_(),A(),n.appendChild(t),r=t.getContext("experimental-webgl",i),!r){var a="Could not initialize WebGL. Seems like the browser doesn't support it.";throw window.alert(a),a}if(e.enableBlending&&(r.blendFunc(r.SRC_ALPHA,r.ONE_MINUS_SRC_ALPHA),r.enable(r.BLEND)),e.clearColor){var u=e.clearColorValue;r.clearColor(u.r,u.g,u.b,u.a),this.beginRender=function(){r.clear(r.COLOR_BUFFER_BIT)}}L.load(r),L.updateSize(d/2,l/2),N.load(r),N.updateSize(d/2,l/2),j(),"function"==typeof g&&g(t)},release:function(e){t&&e&&e.removeChild(t)},isSupported:function(){var e=window.document.createElement("canvas"),n=e&&e.getContext&&e.getContext("experimental-webgl");return n},releaseLink:function(e){m>0&&(m-=1);var n=E[e.id];delete E[e.id],L.removeLink(n);var t=n.id;if(t0&&(h-=1);var n=b[e.id];delete b[e.id],N.removeNode(n);var t=n.id;if(te.length){var r=new Float32Array(e.length*t*2);return r.set(e),r}return e}function a(n,t){for(var r={},o=0;o=w.length&&s();var i=w[r.textureNumber];i.ctx.drawImage(n,r.col*h,r.row*h,h,h),b[e]=n.src,y[n.src]=o,i.isDirty=!0,t(o)}function c(n){var t=n/e<<0,r=n%e,o=r/g<<0,i=r%g;return{textureNumber:t,row:o,col:i}}function d(){E.isDirty=!0,x=0,v=null}function l(){v&&(window.clearTimeout(v),x+=1,v=null),x>10?d():v=window.setTimeout(d,400)}function p(e,n){var t=w[e.textureNumber].canvas,r=w[n.textureNumber].ctx,o=n.col*h,i=n.row*h;r.drawImage(t,e.col*h,e.row*h,h,h,o,i,h,h),w[e.textureNumber].isDirty=!0,w[n.textureNumber].isDirty=!0}var v,g=Math.sqrt(e||1024)<<0,h=g,m=1,y={},x=0,w=[],b=[];if(!o(e))throw"Tiles per texture should be power of two.";var E={isDirty:!1,clearDirty:n,remove:t,getTextures:r,getCoordinates:a,load:u};return E}function o(e){return 0===(e&e-1)}var i=e("./texture.js");n.exports=r},{"./texture.js":52}],55:[function(e,n,t){function r(e,n){return{_texture:0,_offset:0,size:"number"==typeof e?e:32,src:n}}n.exports=r},{}],56:[function(e,n,t){function r(){function e(e,n){e.nativeObject&&h.deleteTexture(e.nativeObject);var t=h.createTexture();h.activeTexture(h["TEXTURE"+n]),h.bindTexture(h.TEXTURE_2D,t),h.texImage2D(h.TEXTURE_2D,0,h.RGBA,h.RGBA,h.UNSIGNED_BYTE,e.canvas),h.texParameteri(h.TEXTURE_2D,h.TEXTURE_MAG_FILTER,h.LINEAR),h.texParameteri(h.TEXTURE_2D,h.TEXTURE_MIN_FILTER,h.LINEAR_MIPMAP_NEAREST),h.generateMipmap(h.TEXTURE_2D),h.uniform1i(x["sampler"+n],n),e.nativeObject=t}function n(){if(v.isDirty){var n,t=v.getTextures();for(n=0;n0&&(A-=1),e.id0&&(e.src&&v.remove(e.src),y.copyArrayPart(_,e.id*N,A*N,N))}function c(e,n){n._offset=e._offset}function d(e){L=!0,E=e}function l(e,n){w=e,b=n,L=!0}function p(){h.useProgram(g),h.bindBuffer(h.ARRAY_BUFFER,m),h.bufferData(h.ARRAY_BUFFER,_,h.DYNAMIC_DRAW),L&&(L=!1,h.uniformMatrix4fv(x.transform,!1,E),h.uniform2f(x.screenSize,w,b)),h.vertexAttribPointer(x.vertexPos,2,h.FLOAT,!1,3*Float32Array.BYTES_PER_ELEMENT,0),h.vertexAttribPointer(x.customAttributes,1,h.FLOAT,!1,3*Float32Array.BYTES_PER_ELEMENT,8),n(),h.drawArrays(h.TRIANGLES,0,6*A)}var v,g,h,m,y,x,w,b,E,L,N=18,P=o(),k=i(),j=1024,A=0,_=new Float32Array(64);return{load:t,position:r,createNode:s,removeNode:f,replaceProperties:c,updateTransform:d,updateSize:l,render:p}}function o(){return["precision mediump float;","varying vec4 color;","varying vec3 vTextureCoord;","uniform sampler2D u_sampler0;","uniform sampler2D u_sampler1;","uniform sampler2D u_sampler2;","uniform sampler2D u_sampler3;","void main(void) {"," if (vTextureCoord.z == 0.) {"," gl_FragColor = texture2D(u_sampler0, vTextureCoord.xy);"," } else if (vTextureCoord.z == 1.) {"," gl_FragColor = texture2D(u_sampler1, vTextureCoord.xy);"," } else if (vTextureCoord.z == 2.) {"," gl_FragColor = texture2D(u_sampler2, vTextureCoord.xy);"," } else if (vTextureCoord.z == 3.) {"," gl_FragColor = texture2D(u_sampler3, vTextureCoord.xy);"," } else { gl_FragColor = vec4(0, 1, 0, 1); }","}"].join("\n")}function i(){return["attribute vec2 a_vertexPos;","attribute float a_customAttributes;","uniform vec2 u_screenSize;","uniform mat4 u_transform;","uniform float u_tilesPerTexture;","varying vec3 vTextureCoord;","void main(void) {"," gl_Position = u_transform * vec4(a_vertexPos/u_screenSize, 0, 1);","float corner = mod(a_customAttributes, 4.);","float tileIndex = mod(floor(a_customAttributes / 4.), u_tilesPerTexture);","float tilesPerRow = sqrt(u_tilesPerTexture);","float tileSize = 1./tilesPerRow;","float tileColumn = mod(tileIndex, tilesPerRow);","float tileRow = floor(tileIndex/tilesPerRow);","if(corner == 0.0) {"," vTextureCoord.xy = vec2(0, 1);","} else if(corner == 1.0) {"," vTextureCoord.xy = vec2(1, 1);","} else if(corner == 2.0) {"," vTextureCoord.xy = vec2(0, 0);","} else {"," vTextureCoord.xy = vec2(1, 0);","}","vTextureCoord *= tileSize;","vTextureCoord.x += tileColumn * tileSize;","vTextureCoord.y += tileRow * tileSize;","vTextureCoord.z = floor(floor(a_customAttributes / 4.)/u_tilesPerTexture);","}"].join("\n")}var a=e("./webglAtlas.js"),u=e("./webgl.js");n.exports=r},{"./webgl.js":53,"./webglAtlas.js":54}],57:[function(e,n,t){function r(e){function n(){x=null}function t(e){x=e}function r(e){return"function"==typeof e&&k.push(e),A}function i(e){return"function"==typeof e&&P.push(e),A}function a(e){return"function"==typeof e&&N.push(e),A}function u(e){return"function"==typeof e&&L.push(e),A}function s(e){return"function"==typeof e&&E.push(e),A}function f(e){return"function"==typeof e&&b.push(e),A}function c(e){return"function"==typeof e&&w.push(e),A}function d(e,n,t){if(e&&e.size){var r=e.position,o=e.size;return r.x-oh.byteLength){var e=new ArrayBuffer(2*h.byteLength),n=new Float32Array(e),t=new Uint32Array(e);t.set(y),m=n,y=t,h=e}};return{load:function(a){n=a,r=o(a),e=r.createProgram(v,p),n.useProgram(e),i=r.getLocations(e,["a_vertexPos","a_color","u_screenSize","u_transform"]),n.enableVertexAttribArray(i.vertexPos),n.enableVertexAttribArray(i.color),t=n.createBuffer()},position:function(e,n,t){var r=e.id,o=r*d;m[o]=n.x,m[o+1]=n.y,y[o+2]=e.color,m[o+3]=t.x,m[o+4]=t.y,y[o+5]=e.color},createLink:function(e){x(),g+=1,a=e.id},removeLink:function(e){g>0&&(g-=1),e.id0&&r.copyArrayPart(y,e.id*d,g*d,d)},updateTransform:function(e){c=!0,f=e},updateSize:function(e,n){u=e,s=n,c=!0},render:function(){n.useProgram(e),n.bindBuffer(n.ARRAY_BUFFER,t),n.bufferData(n.ARRAY_BUFFER,h,n.DYNAMIC_DRAW),c&&(c=!1,n.uniformMatrix4fv(i.transform,!1,f),n.uniform2f(i.screenSize,u,s)),n.vertexAttribPointer(i.vertexPos,2,n.FLOAT,!1,3*Float32Array.BYTES_PER_ELEMENT,0),n.vertexAttribPointer(i.color,4,n.UNSIGNED_BYTE,!0,3*Float32Array.BYTES_PER_ELEMENT,8),n.drawArrays(n.LINES,0,2*g),a=g-1},bringToFront:function(e){a>e.id&&r.swapArrayPart(m,e.id*d,a*d,d),a>0&&(a-=1)},getFrontLinkId:function(){return a}}}var o=e("./webgl.js");n.exports=r},{"./webgl.js":53}],60:[function(e,n,t){function r(){function e(){if((k+1)*w>=L.byteLength){var e=new ArrayBuffer(2*L.byteLength),n=new Float32Array(e),t=new Uint32Array(e);t.set(P),N=n,P=t,L=e}}function n(e){d=e,v=o(e),c=v.createProgram(E,b),d.useProgram(c),p=v.getLocations(c,["a_vertexPos","a_color","u_screenSize","u_transform"]),d.enableVertexAttribArray(p.vertexPos),d.enableVertexAttribArray(p.color),l=d.createBuffer()}function t(e,n){var t=e.id;N[t*x]=n.x,N[t*x+1]=-n.y,N[t*x+2]=e.size,P[t*x+3]=e.color}function r(e){y=!0,m=e}function i(e,n){g=e,h=n,y=!0}function a(e){k>0&&(k-=1),e.id0&&v.copyArrayPart(P,e.id*x,k*x,x)}function u(){e(),k+=1}function s(){}function f(){d.useProgram(c),d.bindBuffer(d.ARRAY_BUFFER,l),d.bufferData(d.ARRAY_BUFFER,L,d.DYNAMIC_DRAW),y&&(y=!1,d.uniformMatrix4fv(p.transform,!1,m),d.uniform2f(p.screenSize,g,h)),d.vertexAttribPointer(p.vertexPos,3,d.FLOAT,!1,x*Float32Array.BYTES_PER_ELEMENT,0),d.vertexAttribPointer(p.color,4,d.UNSIGNED_BYTE,!0,x*Float32Array.BYTES_PER_ELEMENT,12),d.drawArrays(d.POINTS,0,k)}var c,d,l,p,v,g,h,m,y,x=4,w=3*Float32Array.BYTES_PER_ELEMENT+Uint32Array.BYTES_PER_ELEMENT,b=["precision mediump float;","varying vec4 color;","void main(void) {"," gl_FragColor = color;","}"].join("\n"),E=["attribute vec3 a_vertexPos;","attribute vec4 a_color;","uniform vec2 u_screenSize;","uniform mat4 u_transform;","varying vec4 color;","void main(void) {"," gl_Position = u_transform * vec4(a_vertexPos.xy/u_screenSize, 0, 1);"," gl_PointSize = a_vertexPos.z * u_transform[0][0];"," color = a_color.abgr;","}"].join("\n"),L=new ArrayBuffer(16*w),N=new Float32Array(L),P=new Uint32Array(L),k=0;return{load:n,position:t,updateTransform:r,updateSize:i,removeNode:a,createNode:u,replaceProperties:s,render:f}}var o=e("./webgl.js");n.exports=r},{"./webgl.js":53}],61:[function(e,n,t){function r(e,n){return{size:"number"==typeof e?e:10,color:o(n)}}var o=e("./parseColor.js");n.exports=r},{"./parseColor.js":51}],62:[function(e,n,t){n.exports="0.8.1"},{}]},{},[1])(1)}); \ No newline at end of file +y(e),v=P(e.touches[0],e.touches[1])))};return e.addEventListener("mousedown",b),e.addEventListener("touchstart",_),{onStart:function(e){return n=e,this},onDrag:function(e){return t=e,this},onStop:function(e){return r=e,this},onScroll:function(e){return N(e),this},release:function(){e.removeEventListener("mousedown",b),e.removeEventListener("touchstart",_),o.off("mousemove",w),o.off("mouseup",E),o.off("touchmove",k),o.off("touchend",j),o.off("touchcancel",j),N(null)}}}n.exports=r;var o=e("../Utils/documentEvents.js"),i=e("../Utils/browserInfo.js"),a=e("../Utils/findElementPosition.js")},{"../Utils/browserInfo.js":39,"../Utils/documentEvents.js":40,"../Utils/findElementPosition.js":41}],36:[function(e,n,t){function r(e,n){var t=o(n),r=null,i={},a={x:0,y:0};return t.mouseDown(function(e,n){r=e,a.x=n.clientX,a.y=n.clientY,t.mouseCapture(r);var o=i[e.id];return o&&o.onStart&&o.onStart(n,a),!0}).mouseUp(function(e){t.releaseMouseCapture(r),r=null;var n=i[e.id];return n&&n.onStop&&n.onStop(),!0}).mouseMove(function(e,n){if(r){var t=i[r.id];return t&&t.onDrag&&t.onDrag(n,{x:n.clientX-a.x,y:n.clientY-a.y}),a.x=n.clientX,a.y=n.clientY,!0}}),{bindDragNDrop:function(e,n){i[e.id]=n,n||delete i[e.id]}}}n.exports=r;var o=e("../WebGL/webglInputEvents.js")},{"../WebGL/webglInputEvents.js":57}],37:[function(e,n,t){function r(e,n){function t(e){return d[e]}n=o(n,{maxX:1024,maxY:1024,seed:"Deterministic randomness made me do this"});var r=i(n.seed),u=new a(Number.MAX_VALUE,Number.MAX_VALUE,Number.MIN_VALUE,Number.MIN_VALUE),s={},f=function(e){return{x:r.next(n.maxX),y:r.next(n.maxY)}},c=function(e,n){e.xn.x2&&(n.x2=e.x),e.yn.y2&&(n.y2=e.y)},d="function"==typeof Object.create?Object.create(null):{},l=function(e){d[e.id]=f(e),c(d[e.id],u)},p=function(){0!==e.getNodesCount()&&(u.x1=Number.MAX_VALUE,u.y1=Number.MAX_VALUE,u.x2=Number.MIN_VALUE,u.y2=Number.MIN_VALUE,e.forEachNode(l))},v=function(e){s[e.id]=e},g=function(e){for(var n=0;n=0:"boolean"!=typeof z||z}function r(){G=G||window.document.body,F=F||i(e,{springLength:80,springCoeff:2e-4}),O=O||a(e,{container:G}),n.hasOwnProperty("renderLinks")||(n.renderLinks=!0),n.prerender=n.prerender||0,U=(O.inputManager||s)(e,O)}function l(){O.beginRender(),n.renderLinks&&O.renderLinks(),O.renderNodes(),O.endRender()}function p(){return X=F.step()&&!V,l(),!X}function v(e){R||(R=void 0!==e?f(function(){if(e-=1,e<0){var n=!1;return n}return p()},M):f(p,M))}function g(){W||(X=!1,R.restart())}function h(){if("number"==typeof n.prerender&&n.prerender>0)for(var e=0;e0?n.insertBefore(r,n.firstChild):n.appendChild(r),r},releaseLink:function(e){var t=d[e.id];t&&(n.removeChild(t),delete d[e.id])},addNode:function(e,t){var r=l(e);if(r)return r.position=t,r.node=e,c[e.id]=r,n.appendChild(r),r},releaseNode:function(e){var t=c[e.id];t&&(n.removeChild(t),delete c[e.id])},renderNodes:function(){for(var e in c)if(c.hasOwnProperty(e)){var n=c[e];m.x=n.position.x,m.y=n.position.y,p(n,m,n.node)}},renderLinks:function(){for(var e in d)if(d.hasOwnProperty(e)){var n=d[e];y.x=n.position.from.x,y.y=n.position.from.y,x.x=n.position.to.x,x.y=n.position.to.y,g(n,y,x,n.link)}},getGraphicsRoot:function(e){return"function"==typeof e&&(t?e(t):r=e),t},getSvgRoot:function(){return t}};return i(b),b}n.exports=r;var o=e("simplesvg"),i=e("ngraph.events"),a=e("../Input/domInputManager.js")},{"../Input/domInputManager.js":34,"ngraph.events":7,simplesvg:28}],50:[function(e,n,t){function r(e){e=c(e,{enableBlending:!0,preserveDrawingBuffer:!1,clearColor:!1,clearColorValue:{r:1,g:1,b:1,a:1}});var n,t,r,d,l,p,v,g,h=0,m=0,y=[1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1],x=[],w=[],b={},E={},L=i(),N=a(),P=function(e){return u()},k=function(e){return s(3014898687)},j=function(){L.updateTransform(y),N.updateTransform(y)},A=function(){y=[1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1]},_=function(){n&&t&&(d=t.width=Math.max(n.offsetWidth,1),l=t.height=Math.max(n.offsetHeight,1),r&&r.viewport(0,0,d,l),L&&L.updateSize(d/2,l/2),N&&N.updateSize(d/2,l/2))},I=function(e){e.fire("rescaled")};t=window.document.createElement("canvas");var T={getLinkUI:function(e){return E[e]},getNodeUI:function(e){return b[e]},node:function(e){if("function"==typeof e)return P=e,this},link:function(e){if("function"==typeof e)return k=e,this},placeNode:function(e){return p=e,this},placeLink:function(e){return v=e,this},inputManager:o,beginRender:function(){},endRender:function(){m>0&&L.render(),h>0&&N.render()},bringLinkToFront:function(e){var n,t,r=L.getFrontLinkId();L.bringToFront(e),r>e.id&&(n=e.id,t=w[r],w[r]=w[n],w[r].id=r,w[n]=t,w[n].id=n)},graphCenterChanged:function(e,n){y[12]=2*e/d-1,y[13]=1-2*n/l,j()},addLink:function(e,n){var t=m++,r=k(e);return r.id=t,r.pos=n,L.createLink(r),w[t]=r,E[e.id]=r,r},addNode:function(e,n){var t=h++,r=P(e);return r.id=t,r.position=n,r.node=e,N.createNode(r),x[t]=r,b[e.id]=r,r},translateRel:function(e,n){y[12]+=2*y[0]*e/d/y[0],y[13]-=2*y[5]*n/l/y[5],j()},scale:function(e,n){var t=2*n.x/d-1,r=1-2*n.y/l;return t-=y[12],r-=y[13],y[12]+=t*(1-e),y[13]+=r*(1-e),y[0]*=e,y[5]*=e,j(),I(this),y[0]},resetScale:function(){return A(),r&&(_(),j()),this},updateSize:_,init:function(o){var i={};if(e.preserveDrawingBuffer&&(i.preserveDrawingBuffer=!0),n=o,_(),A(),n.appendChild(t),r=t.getContext("experimental-webgl",i),!r){var a="Could not initialize WebGL. Seems like the browser doesn't support it.";throw window.alert(a),a}if(e.enableBlending&&(r.blendFunc(r.SRC_ALPHA,r.ONE_MINUS_SRC_ALPHA),r.enable(r.BLEND)),e.clearColor){var u=e.clearColorValue;r.clearColor(u.r,u.g,u.b,u.a),this.beginRender=function(){r.clear(r.COLOR_BUFFER_BIT)}}L.load(r),L.updateSize(d/2,l/2),N.load(r),N.updateSize(d/2,l/2),j(),"function"==typeof g&&g(t)},release:function(e){t&&e&&e.removeChild(t)},isSupported:function(){var e=window.document.createElement("canvas"),n=e&&e.getContext&&e.getContext("experimental-webgl");return n},releaseLink:function(e){m>0&&(m-=1);var n=E[e.id];delete E[e.id],L.removeLink(n);var t=n.id;if(t0&&(h-=1);var n=b[e.id];delete b[e.id],N.removeNode(n);var t=n.id;if(te.length){var r=new Float32Array(e.length*t*2);return r.set(e),r}return e}function a(n,t){for(var r={},o=0;o=w.length&&s();var i=w[r.textureNumber];i.ctx.drawImage(n,r.col*h,r.row*h,h,h),b[e]=n.src,y[n.src]=o,i.isDirty=!0,t(o)}function c(n){var t=n/e<<0,r=n%e,o=r/g<<0,i=r%g;return{textureNumber:t,row:o,col:i}}function d(){E.isDirty=!0,x=0,v=null}function l(){v&&(window.clearTimeout(v),x+=1,v=null),x>10?d():v=window.setTimeout(d,400)}function p(e,n){var t=w[e.textureNumber].canvas,r=w[n.textureNumber].ctx,o=n.col*h,i=n.row*h;r.drawImage(t,e.col*h,e.row*h,h,h,o,i,h,h),w[e.textureNumber].isDirty=!0,w[n.textureNumber].isDirty=!0}var v,g=Math.sqrt(e||1024)<<0,h=g,m=1,y={},x=0,w=[],b=[];if(!o(e))throw"Tiles per texture should be power of two.";var E={isDirty:!1,clearDirty:n,remove:t,getTextures:r,getCoordinates:a,load:u};return E}function o(e){return 0===(e&e-1)}var i=e("./texture.js");n.exports=r},{"./texture.js":52}],55:[function(e,n,t){function r(e,n){return{_texture:0,_offset:0,size:"number"==typeof e?e:32,src:n}}n.exports=r},{}],56:[function(e,n,t){function r(){function e(e,n){e.nativeObject&&h.deleteTexture(e.nativeObject);var t=h.createTexture();h.activeTexture(h["TEXTURE"+n]),h.bindTexture(h.TEXTURE_2D,t),h.texImage2D(h.TEXTURE_2D,0,h.RGBA,h.RGBA,h.UNSIGNED_BYTE,e.canvas),h.texParameteri(h.TEXTURE_2D,h.TEXTURE_MAG_FILTER,h.LINEAR),h.texParameteri(h.TEXTURE_2D,h.TEXTURE_MIN_FILTER,h.LINEAR_MIPMAP_NEAREST),h.generateMipmap(h.TEXTURE_2D),h.uniform1i(x["sampler"+n],n),e.nativeObject=t}function n(){if(v.isDirty){var n,t=v.getTextures();for(n=0;n0&&(A-=1),e.id0&&(e.src&&v.remove(e.src),y.copyArrayPart(_,e.id*N,A*N,N))}function c(e,n){n._offset=e._offset}function d(e){L=!0,E=e}function l(e,n){w=e,b=n,L=!0}function p(){h.useProgram(g),h.bindBuffer(h.ARRAY_BUFFER,m),h.bufferData(h.ARRAY_BUFFER,_,h.DYNAMIC_DRAW),L&&(L=!1,h.uniformMatrix4fv(x.transform,!1,E),h.uniform2f(x.screenSize,w,b)),h.vertexAttribPointer(x.vertexPos,2,h.FLOAT,!1,3*Float32Array.BYTES_PER_ELEMENT,0),h.vertexAttribPointer(x.customAttributes,1,h.FLOAT,!1,3*Float32Array.BYTES_PER_ELEMENT,8),n(),h.drawArrays(h.TRIANGLES,0,6*A)}var v,g,h,m,y,x,w,b,E,L,N=18,P=o(),k=i(),j=1024,A=0,_=new Float32Array(64);return{load:t,position:r,createNode:s,removeNode:f,replaceProperties:c,updateTransform:d,updateSize:l,render:p}}function o(){return["precision mediump float;","varying vec4 color;","varying vec3 vTextureCoord;","uniform sampler2D u_sampler0;","uniform sampler2D u_sampler1;","uniform sampler2D u_sampler2;","uniform sampler2D u_sampler3;","void main(void) {"," if (vTextureCoord.z == 0.) {"," gl_FragColor = texture2D(u_sampler0, vTextureCoord.xy);"," } else if (vTextureCoord.z == 1.) {"," gl_FragColor = texture2D(u_sampler1, vTextureCoord.xy);"," } else if (vTextureCoord.z == 2.) {"," gl_FragColor = texture2D(u_sampler2, vTextureCoord.xy);"," } else if (vTextureCoord.z == 3.) {"," gl_FragColor = texture2D(u_sampler3, vTextureCoord.xy);"," } else { gl_FragColor = vec4(0, 1, 0, 1); }","}"].join("\n")}function i(){return["attribute vec2 a_vertexPos;","attribute float a_customAttributes;","uniform vec2 u_screenSize;","uniform mat4 u_transform;","uniform float u_tilesPerTexture;","varying vec3 vTextureCoord;","void main(void) {"," gl_Position = u_transform * vec4(a_vertexPos/u_screenSize, 0, 1);","float corner = mod(a_customAttributes, 4.);","float tileIndex = mod(floor(a_customAttributes / 4.), u_tilesPerTexture);","float tilesPerRow = sqrt(u_tilesPerTexture);","float tileSize = 1./tilesPerRow;","float tileColumn = mod(tileIndex, tilesPerRow);","float tileRow = floor(tileIndex/tilesPerRow);","if(corner == 0.0) {"," vTextureCoord.xy = vec2(0, 1);","} else if(corner == 1.0) {"," vTextureCoord.xy = vec2(1, 1);","} else if(corner == 2.0) {"," vTextureCoord.xy = vec2(0, 0);","} else {"," vTextureCoord.xy = vec2(1, 0);","}","vTextureCoord *= tileSize;","vTextureCoord.x += tileColumn * tileSize;","vTextureCoord.y += tileRow * tileSize;","vTextureCoord.z = floor(floor(a_customAttributes / 4.)/u_tilesPerTexture);","}"].join("\n")}var a=e("./webglAtlas.js"),u=e("./webgl.js");n.exports=r},{"./webgl.js":53,"./webglAtlas.js":54}],57:[function(e,n,t){function r(e){function n(){x=null}function t(e){x=e}function r(e){return"function"==typeof e&&k.push(e),A}function i(e){return"function"==typeof e&&P.push(e),A}function a(e){return"function"==typeof e&&N.push(e),A}function u(e){return"function"==typeof e&&L.push(e),A}function s(e){return"function"==typeof e&&E.push(e),A}function f(e){return"function"==typeof e&&b.push(e),A}function c(e){return"function"==typeof e&&w.push(e),A}function d(e,n,t){if(e&&e.size){var r=e.position,o=e.size;return r.x-oh.byteLength){var e=new ArrayBuffer(2*h.byteLength),n=new Float32Array(e),t=new Uint32Array(e);t.set(y),m=n,y=t,h=e}};return{load:function(a){n=a,r=o(a),e=r.createProgram(v,p),n.useProgram(e),i=r.getLocations(e,["a_vertexPos","a_color","u_screenSize","u_transform"]),n.enableVertexAttribArray(i.vertexPos),n.enableVertexAttribArray(i.color),t=n.createBuffer()},position:function(e,n,t){var r=e.id,o=r*d;m[o]=n.x,m[o+1]=n.y,y[o+2]=e.color,m[o+3]=t.x,m[o+4]=t.y,y[o+5]=e.color},createLink:function(e){x(),g+=1,a=e.id},removeLink:function(e){g>0&&(g-=1),e.id0&&r.copyArrayPart(y,e.id*d,g*d,d)},updateTransform:function(e){c=!0,f=e},updateSize:function(e,n){u=e,s=n,c=!0},render:function(){n.useProgram(e),n.bindBuffer(n.ARRAY_BUFFER,t),n.bufferData(n.ARRAY_BUFFER,h,n.DYNAMIC_DRAW),c&&(c=!1,n.uniformMatrix4fv(i.transform,!1,f),n.uniform2f(i.screenSize,u,s)),n.vertexAttribPointer(i.vertexPos,2,n.FLOAT,!1,3*Float32Array.BYTES_PER_ELEMENT,0),n.vertexAttribPointer(i.color,4,n.UNSIGNED_BYTE,!0,3*Float32Array.BYTES_PER_ELEMENT,8),n.drawArrays(n.LINES,0,2*g),a=g-1},bringToFront:function(e){a>e.id&&r.swapArrayPart(m,e.id*d,a*d,d),a>0&&(a-=1)},getFrontLinkId:function(){return a}}}var o=e("./webgl.js");n.exports=r},{"./webgl.js":53}],60:[function(e,n,t){function r(){function e(){if((k+1)*w>=L.byteLength){var e=new ArrayBuffer(2*L.byteLength),n=new Float32Array(e),t=new Uint32Array(e);t.set(P),N=n,P=t,L=e}}function n(e){d=e,v=o(e),c=v.createProgram(E,b),d.useProgram(c),p=v.getLocations(c,["a_vertexPos","a_color","u_screenSize","u_transform"]),d.enableVertexAttribArray(p.vertexPos),d.enableVertexAttribArray(p.color),l=d.createBuffer()}function t(e,n){var t=e.id;N[t*x]=n.x,N[t*x+1]=-n.y,N[t*x+2]=e.size,P[t*x+3]=e.color}function r(e){y=!0,m=e}function i(e,n){g=e,h=n,y=!0}function a(e){k>0&&(k-=1),e.id0&&v.copyArrayPart(P,e.id*x,k*x,x)}function u(){e(),k+=1}function s(){}function f(){d.useProgram(c),d.bindBuffer(d.ARRAY_BUFFER,l),d.bufferData(d.ARRAY_BUFFER,L,d.DYNAMIC_DRAW),y&&(y=!1,d.uniformMatrix4fv(p.transform,!1,m),d.uniform2f(p.screenSize,g,h)),d.vertexAttribPointer(p.vertexPos,3,d.FLOAT,!1,x*Float32Array.BYTES_PER_ELEMENT,0),d.vertexAttribPointer(p.color,4,d.UNSIGNED_BYTE,!0,x*Float32Array.BYTES_PER_ELEMENT,12),d.drawArrays(d.POINTS,0,k)}var c,d,l,p,v,g,h,m,y,x=4,w=3*Float32Array.BYTES_PER_ELEMENT+Uint32Array.BYTES_PER_ELEMENT,b=["precision mediump float;","varying vec4 color;","void main(void) {"," gl_FragColor = color;","}"].join("\n"),E=["attribute vec3 a_vertexPos;","attribute vec4 a_color;","uniform vec2 u_screenSize;","uniform mat4 u_transform;","varying vec4 color;","void main(void) {"," gl_Position = u_transform * vec4(a_vertexPos.xy/u_screenSize, 0, 1);"," gl_PointSize = a_vertexPos.z * u_transform[0][0];"," color = a_color.abgr;","}"].join("\n"),L=new ArrayBuffer(16*w),N=new Float32Array(L),P=new Uint32Array(L),k=0;return{load:n,position:t,updateTransform:r,updateSize:i,removeNode:a,createNode:u,replaceProperties:s,render:f}}var o=e("./webgl.js");n.exports=r},{"./webgl.js":53}],61:[function(e,n,t){function r(e,n){return{size:"number"==typeof e?e:10,color:o(n)}}var o=e("./parseColor.js");n.exports=r},{"./parseColor.js":51}],62:[function(e,n,t){n.exports="0.8.1"},{}]},{},[1])(1)}); \ No newline at end of file diff --git a/src/View/renderer.js b/src/View/renderer.js index 5a6baae..a73fab9 100644 --- a/src/View/renderer.js +++ b/src/View/renderer.js @@ -85,7 +85,7 @@ function renderer(graph, settings) { * Performs rendering of the graph. * * @param iterationsCount if specified renderer will run only given number of iterations - * and then stop. Otherwise graph rendering is performed infinitely. + * and then stop. Otherwise graph rendering is performed indefinitely. * * Note: if rendering stopped by used started dragging nodes or new nodes were added to the * graph renderer will give run more iterations to reflect changes. @@ -137,6 +137,13 @@ function renderer(graph, settings) { return scale(false); }, + /** + * Returns current transformation matrix. + */ + getTransform: function() { + return transform; + }, + /** * Centers renderer at x,y graph's coordinates */ From 9b4d1e58a61af123191ea3ad04d0e803cdf9a5d4 Mon Sep 17 00:00:00 2001 From: Andriy Kashcha Date: Thu, 1 Mar 2018 21:21:09 -0800 Subject: [PATCH 19/49] 0.10.1 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 260c84e..5d8ea11 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "vivagraphjs", - "version": "0.10.0", + "version": "0.10.1", "description": "Graph Drawing Library", "main": "src/viva", "directories": { From 6c8506f83daaf3c6486bdd2308741f3b05767af0 Mon Sep 17 00:00:00 2001 From: Andriy Kashcha Date: Tue, 6 Mar 2018 20:53:58 -0800 Subject: [PATCH 20/49] Allow to fetch current layout object --- src/View/renderer.js | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/View/renderer.js b/src/View/renderer.js index a73fab9..16a4eb6 100644 --- a/src/View/renderer.js +++ b/src/View/renderer.js @@ -38,7 +38,7 @@ var dragndrop = require('../Input/dragndrop.js'); * * // Layout algorithm to be used. The algorithm is expected to comply with defined * // interface and is expected to be iterative. Renderer will use it then to calculate - * // grpaph's layout. For examples of the interface refer to Viva.Graph.Layout.forceDirected() + * // graph's layout. For examples of the interface refer to Viva.Graph.Layout.forceDirected() * layout : Viva.Graph.Layout.forceDirected(), * * // Directs renderer to display links. Usually rendering links is the slowest part of this @@ -158,6 +158,13 @@ function renderer(graph, settings) { getGraphics: function() { return graphics; }, + + /** + * Gets current layout. + */ + getLayout: function() { + return layout; + }, /** * Removes this renderer and deallocates all resources/timers From 9fe681191a8453b8dc5cdbcbd3d326a86dcb90c4 Mon Sep 17 00:00:00 2001 From: Andriy Kashcha Date: Tue, 6 Mar 2018 20:54:11 -0800 Subject: [PATCH 21/49] updated dependencies --- dist/vivagraph.js | 1011 ++++++++++++++++++++++++++++------------- dist/vivagraph.min.js | 5 +- package.json | 12 +- 3 files changed, 704 insertions(+), 324 deletions(-) diff --git a/dist/vivagraph.js b/dist/vivagraph.js index 1217d7a..7934f28 100644 --- a/dist/vivagraph.js +++ b/dist/vivagraph.js @@ -112,7 +112,7 @@ Viva.Graph = { module.exports = Viva; -},{"./Algorithms/centrality.js":32,"./Algorithms/operations.js":33,"./Input/domInputManager.js":34,"./Input/dragndrop.js":35,"./Input/webglInputManager.js":36,"./Layout/constant.js":37,"./Utils/backwardCompatibleEvents.js":38,"./Utils/browserInfo.js":39,"./Utils/findElementPosition.js":41,"./Utils/getDimensions.js":42,"./Utils/intersectRect.js":43,"./Utils/rect.js":45,"./Utils/timer.js":46,"./View/renderer.js":48,"./View/svgGraphics.js":49,"./View/webglGraphics.js":50,"./WebGL/parseColor.js":51,"./WebGL/texture.js":52,"./WebGL/webgl.js":53,"./WebGL/webglAtlas.js":54,"./WebGL/webglImage.js":55,"./WebGL/webglImageNodeProgram.js":56,"./WebGL/webglInputEvents.js":57,"./WebGL/webglLine.js":58,"./WebGL/webglLinkProgram.js":59,"./WebGL/webglNodeProgram.js":60,"./WebGL/webglSquare.js":61,"./version.js":62,"gintersect":3,"ngraph.events":7,"ngraph.forcelayout":9,"ngraph.fromjson":10,"ngraph.generators":11,"ngraph.graph":12,"ngraph.merge":13,"ngraph.random":26,"ngraph.tojson":27,"simplesvg":28}],2:[function(require,module,exports){ +},{"./Algorithms/centrality.js":36,"./Algorithms/operations.js":37,"./Input/domInputManager.js":38,"./Input/dragndrop.js":39,"./Input/webglInputManager.js":40,"./Layout/constant.js":41,"./Utils/backwardCompatibleEvents.js":42,"./Utils/browserInfo.js":43,"./Utils/findElementPosition.js":45,"./Utils/getDimensions.js":46,"./Utils/intersectRect.js":47,"./Utils/rect.js":49,"./Utils/timer.js":50,"./View/renderer.js":52,"./View/svgGraphics.js":53,"./View/webglGraphics.js":54,"./WebGL/parseColor.js":55,"./WebGL/texture.js":56,"./WebGL/webgl.js":57,"./WebGL/webglAtlas.js":58,"./WebGL/webglImage.js":59,"./WebGL/webglImageNodeProgram.js":60,"./WebGL/webglInputEvents.js":61,"./WebGL/webglLine.js":62,"./WebGL/webglLinkProgram.js":63,"./WebGL/webglNodeProgram.js":64,"./WebGL/webglSquare.js":65,"./version.js":66,"gintersect":3,"ngraph.events":9,"ngraph.forcelayout":11,"ngraph.fromjson":13,"ngraph.generators":14,"ngraph.graph":16,"ngraph.merge":17,"ngraph.random":30,"ngraph.tojson":31,"simplesvg":32}],2:[function(require,module,exports){ addEventListener.removeEventListener = removeEventListener addEventListener.addEventListener = addEventListener @@ -264,8 +264,10 @@ function intersect( },{}],4:[function(require,module,exports){ module.exports.degree = require('./src/degree.js'); module.exports.betweenness = require('./src/betweenness.js'); +module.exports.closeness = require('./src/closeness.js'); +module.exports.eccentricity = require('./src/eccentricity.js'); -},{"./src/betweenness.js":5,"./src/degree.js":6}],5:[function(require,module,exports){ +},{"./src/betweenness.js":5,"./src/closeness.js":6,"./src/degree.js":7,"./src/eccentricity.js":8}],5:[function(require,module,exports){ module.exports = betweennes; /** @@ -340,7 +342,6 @@ function betweennes(graph, oriented) { while (Q.length) { var v = Q.shift(); - var dedup = Object.create(null); S.push(v); graph.forEachLinkedNode(v, toId, oriented); } @@ -378,6 +379,78 @@ function betweennes(graph, oriented) { } },{}],6:[function(require,module,exports){ +module.exports = closeness; + +/** + * In a connected graph, the normalized closeness centrality of a node is the average + * length of the shortest path between the node and all other nodes in the + * graph. Thus the more central a node is, the closer it is to all other nodes. + */ +function closeness(graph, oriented) { + var Q = []; + // list of predcessors on shortest paths from source + // distance from source + var dist = Object.create(null); + + var currentNode; + var centrality = Object.create(null); + + graph.forEachNode(setCentralityToZero); + graph.forEachNode(calculateCentrality); + + return centrality; + + function setCentralityToZero(node) { + centrality[node.id] = 0; + } + + function calculateCentrality(node) { + currentNode = node.id; + singleSourceShortestPath(currentNode); + accumulate(); + } + + function accumulate() { + // Add all distances for node to array, excluding -1s + var distances = Object.keys(dist).map(function(key) {return dist[key]}).filter(function(val){return val !== -1}); + // Set number of reachable nodes + var reachableNodesTotal = distances.length; + // Compute sum of all distances for node + var totalDistance = distances.reduce(function(a,b) { return a + b }); + if (totalDistance > 0) { + centrality[currentNode] = ((reachableNodesTotal - 1) / totalDistance); + } else { + centrality[currentNode] = 0; + } + } + + function singleSourceShortestPath(source) { + graph.forEachNode(initNode); + dist[source] = 0; + Q.push(source); + + while (Q.length) { + var v = Q.shift(); + graph.forEachLinkedNode(v, processNode, oriented); + } + + function initNode(node) { + var nodeId = node.id; + dist[nodeId] = -1; + } + + function processNode(otherNode) { + var w = otherNode.id + if (dist[w] === -1) { + // Node w is found for the first time + dist[w] = dist[v] + 1; + Q.push(w); + } + } + } +} + +},{}],7:[function(require,module,exports){ module.exports = degree; /** @@ -392,10 +465,8 @@ module.exports = degree; * 'inout' - (default) generic degree centrality is calculated */ function degree(graph, kind) { - var getNodeDegree, - sortedDegrees = [], - result = Object.create(null), - nodeDegree; + var getNodeDegree; + var result = Object.create(null); kind = (kind || 'both').toLowerCase(); if (kind === 'both' || kind === 'inout') { @@ -420,6 +491,8 @@ function degree(graph, kind) { function inDegreeCalculator(links, nodeId) { var total = 0; + if (!links) return total; + for (var i = 0; i < links.length; i += 1) { total += (links[i].toId === nodeId) ? 1 : 0; } @@ -428,6 +501,8 @@ function inDegreeCalculator(links, nodeId) { function outDegreeCalculator(links, nodeId) { var total = 0; + if (!links) return total; + for (var i = 0; i < links.length; i += 1) { total += (links[i].fromId === nodeId) ? 1 : 0; } @@ -435,10 +510,78 @@ function outDegreeCalculator(links, nodeId) { } function inoutDegreeCalculator(links) { + if (!links) return 0; + return links.length; } -},{}],7:[function(require,module,exports){ +},{}],8:[function(require,module,exports){ +module.exports = eccentricity; + +/** + * The eccentricity centrality of a node is the greatest distance between that node and + * any other node in the network. + */ +function eccentricity(graph, oriented) { + var Q = []; + // distance from source + var dist = Object.create(null); + + var currentNode; + var centrality = Object.create(null); + + graph.forEachNode(setCentralityToZero); + graph.forEachNode(calculateCentrality); + + return centrality; + + function setCentralityToZero(node) { + centrality[node.id] = 0; + } + + function calculateCentrality(node) { + currentNode = node.id; + singleSourceShortestPath(currentNode); + accumulate(); + } + + function accumulate() { + var maxDist = 0; + Object.keys(dist).forEach(function (key) { + var val = dist[key]; + if (maxDist < val) maxDist = val; + }); + + centrality[currentNode] = maxDist; + } + + function singleSourceShortestPath(source) { + graph.forEachNode(initNode); + dist[source] = 0; + Q.push(source); + + while (Q.length) { + var v = Q.shift(); + graph.forEachLinkedNode(v, processNode, oriented); + } + + function initNode(node) { + var nodeId = node.id; + dist[nodeId] = -1; + } + + function processNode(otherNode) { + var w = otherNode.id + if (dist[w] === -1) { + // Node w is found for the first time + dist[w] = dist[v] + 1; + Q.push(w); + } + } + } +} + +},{}],9:[function(require,module,exports){ module.exports = function(subject) { validateSubject(subject); @@ -528,7 +671,7 @@ function validateSubject(subject) { } } -},{}],8:[function(require,module,exports){ +},{}],10:[function(require,module,exports){ module.exports = exposeProperties; /** @@ -574,7 +717,7 @@ function augment(source, target, key) { } } -},{}],9:[function(require,module,exports){ +},{}],11:[function(require,module,exports){ module.exports = createLayout; module.exports.simulator = require('ngraph.physics.simulator'); @@ -596,6 +739,11 @@ function createLayout(graph, physicsSettings) { var createSimulator = require('ngraph.physics.simulator'); var physicsSimulator = createSimulator(physicsSettings); + var nodeMass = defaultNodeMass + if (physicsSettings && typeof physicsSettings.nodeMass === 'function') { + nodeMass = physicsSettings.nodeMass + } + var nodeBodies = Object.create(null); var springs = {}; var bodiesCount = 0; @@ -655,6 +803,7 @@ function createLayout(graph, physicsSettings) { setNodePosition: function (nodeId) { var body = getInitializedBody(nodeId); body.setPosition.apply(body, Array.prototype.slice.call(arguments, 1)); + physicsSimulator.invalidateBBox(); }, /** @@ -904,6 +1053,9 @@ function createLayout(graph, physicsSettings) { function updateBodyMass(nodeId) { var body = nodeBodies[nodeId]; body.mass = nodeMass(nodeId); + if (Number.isNaN(body.mass)) { + throw new Error('Node mass should be a number') + } } /** @@ -933,7 +1085,7 @@ function createLayout(graph, physicsSettings) { * @param {String|Number} nodeId identifier of a node, for which body mass needs to be calculated * @returns {Number} recommended mass of the body; */ - function nodeMass(nodeId) { + function defaultNodeMass(nodeId) { var links = graph.getLinks(nodeId); if (!links) return 1; return 1 + links.length / 3.0; @@ -942,7 +1094,9 @@ function createLayout(graph, physicsSettings) { function noop() { } -},{"ngraph.events":7,"ngraph.physics.simulator":15}],10:[function(require,module,exports){ +},{"ngraph.events":12,"ngraph.physics.simulator":19}],12:[function(require,module,exports){ +arguments[4][9][0].apply(exports,arguments) +},{"dup":9}],13:[function(require,module,exports){ module.exports = load; var createGraph = require('ngraph.graph'); @@ -987,312 +1141,479 @@ function load(jsonGraph, nodeTransform, linkTransform) { function id(x) { return x; } -},{"ngraph.graph":12}],11:[function(require,module,exports){ -module.exports = { - ladder: ladder, - complete: complete, - completeBipartite: completeBipartite, - balancedBinTree: balancedBinTree, - path: path, - circularLadder: circularLadder, - grid: grid, - grid3: grid3, - noLinks: noLinks, - wattsStrogatz: wattsStrogatz -}; - +},{"ngraph.graph":16}],14:[function(require,module,exports){ var createGraph = require('ngraph.graph'); -function ladder(n) { -/** - * Ladder graph is a graph in form of ladder - * @param {Number} n Represents number of steps in the ladder - */ - if (!n || n < 0) { - throw new Error("Invalid number of nodes"); - } +module.exports = factory(createGraph); - var g = createGraph(), - i; - - for (i = 0; i < n - 1; ++i) { - g.addLink(i, i + 1); - // first row - g.addLink(n + i, n + i + 1); - // second row - g.addLink(i, n + i); - // ladder's step - } +// Allow other developers have their own createGraph +module.exports.factory = factory; - g.addLink(n - 1, 2 * n - 1); - // last step in the ladder; +function factory(createGraph) { + return { + ladder: ladder, + complete: complete, + completeBipartite: completeBipartite, + balancedBinTree: balancedBinTree, + path: path, + circularLadder: circularLadder, + grid: grid, + grid3: grid3, + noLinks: noLinks, + wattsStrogatz: wattsStrogatz, + cliqueCircle: cliqueCircle + }; - return g; -} -function circularLadder(n) { -/** - * Circular ladder with n steps. - * - * @param {Number} n of steps in the ladder. - */ + function ladder(n) { + /** + * Ladder graph is a graph in form of ladder + * @param {Number} n Represents number of steps in the ladder + */ if (!n || n < 0) { - throw new Error("Invalid number of nodes"); + throw new Error("Invalid number of nodes"); + } + + var g = createGraph(), + i; + + for (i = 0; i < n - 1; ++i) { + g.addLink(i, i + 1); + // first row + g.addLink(n + i, n + i + 1); + // second row + g.addLink(i, n + i); + // ladder's step } - var g = ladder(n); + g.addLink(n - 1, 2 * n - 1); + // last step in the ladder; - g.addLink(0, n - 1); - g.addLink(n, 2 * n - 1); return g; -} + } -function complete(n) { -/** - * Complete graph Kn. - * - * @param {Number} n represents number of nodes in the complete graph. - */ - if (!n || n < 1) { - throw new Error("At least two nodes are expected for complete graph"); + function circularLadder(n) { + /** + * Circular ladder with n steps. + * + * @param {Number} n of steps in the ladder. + */ + if (!n || n < 0) { + throw new Error("Invalid number of nodes"); + } + + var g = ladder(n); + + g.addLink(0, n - 1); + g.addLink(n, 2 * n - 1); + return g; } - var g = createGraph(), - i, - j; + function complete(n) { + /** + * Complete graph Kn. + * + * @param {Number} n represents number of nodes in the complete graph. + */ + if (!n || n < 1) { + throw new Error("At least two nodes are expected for complete graph"); + } - for (i = 0; i < n; ++i) { - for (j = i + 1; j < n; ++j) { - if (i !== j) { - g.addLink(i, j); + var g = createGraph(), + i, + j; + + for (i = 0; i < n; ++i) { + for (j = i + 1; j < n; ++j) { + if (i !== j) { + g.addLink(i, j); + } } } - } - return g; -} - -function completeBipartite (n, m) { -/** - * Complete bipartite graph K n,m. Each node in the - * first partition is connected to all nodes in the second partition. - * - * @param {Number} n represents number of nodes in the first graph partition - * @param {Number} m represents number of nodes in the second graph partition - */ - if (!n || !m || n < 0 || m < 0) { - throw new Error("Graph dimensions are invalid. Number of nodes in each partition should be greater than 0"); + return g; } - var g = createGraph(), - i, j; + function completeBipartite (n, m) { + /** + * Complete bipartite graph K n,m. Each node in the + * first partition is connected to all nodes in the second partition. + * + * @param {Number} n represents number of nodes in the first graph partition + * @param {Number} m represents number of nodes in the second graph partition + */ + if (!n || !m || n < 0 || m < 0) { + throw new Error("Graph dimensions are invalid. Number of nodes in each partition should be greater than 0"); + } + + var g = createGraph(), + i, j; - for (i = 0; i < n; ++i) { - for (j = n; j < n + m; ++j) { - g.addLink(i, j); + for (i = 0; i < n; ++i) { + for (j = n; j < n + m; ++j) { + g.addLink(i, j); + } } + + return g; } - return g; -} + function path(n) { + /** + * Path graph with n steps. + * + * @param {Number} n number of nodes in the path + */ + if (!n || n < 0) { + throw new Error("Invalid number of nodes"); + } -function path(n) { -/** - * Path graph with n steps. - * - * @param {Number} n number of nodes in the path - */ - if (!n || n < 0) { - throw new Error("Invalid number of nodes"); - } + var g = createGraph(), + i; - var g = createGraph(), - i; + g.addNode(0); - g.addNode(0); + for (i = 1; i < n; ++i) { + g.addLink(i - 1, i); + } - for (i = 1; i < n; ++i) { - g.addLink(i - 1, i); + return g; } - return g; -} + function grid(n, m) { + /** + * Grid graph with n rows and m columns. + * + * @param {Number} n of rows in the graph. + * @param {Number} m of columns in the graph. + */ + if (n < 1 || m < 1) { + throw new Error("Invalid number of nodes in grid graph"); + } + var g = createGraph(), + i, + j; + if (n === 1 && m === 1) { + g.addNode(0); + return g; + } + + for (i = 0; i < n; ++i) { + for (j = 0; j < m; ++j) { + var node = i + j * n; + if (i > 0) { g.addLink(node, i - 1 + j * n); } + if (j > 0) { g.addLink(node, i + (j - 1) * n); } + } + } -function grid(n, m) { -/** - * Grid graph with n rows and m columns. - * - * @param {Number} n of rows in the graph. - * @param {Number} m of columns in the graph. - */ - if (n < 1 || m < 1) { - throw new Error("Invalid number of nodes in grid graph"); - } - var g = createGraph(), - i, - j; - if (n === 1 && m === 1) { - g.addNode(0); return g; } - for (i = 0; i < n; ++i) { - for (j = 0; j < m; ++j) { - var node = i + j * n; - if (i > 0) { g.addLink(node, i - 1 + j * n); } - if (j > 0) { g.addLink(node, i + (j - 1) * n); } + function grid3(n, m, z) { + /** + * 3D grid with n rows and m columns and z levels. + * + * @param {Number} n of rows in the graph. + * @param {Number} m of columns in the graph. + * @param {Number} z of levels in the graph. + */ + if (n < 1 || m < 1 || z < 1) { + throw new Error("Invalid number of nodes in grid3 graph"); } - } + var g = createGraph(), + i, j, k; - return g; -} + if (n === 1 && m === 1 && z === 1) { + g.addNode(0); + return g; + } -function grid3(n, m, z) { -/** - * 3D grid with n rows and m columns and z levels. - * - * @param {Number} n of rows in the graph. - * @param {Number} m of columns in the graph. - * @param {Number} z of levels in the graph. - */ - if (n < 1 || m < 1 || z < 1) { - throw new Error("Invalid number of nodes in grid3 graph"); + for (k = 0; k < z; ++k) { + for (i = 0; i < n; ++i) { + for (j = 0; j < m; ++j) { + var level = k * n * m; + var node = i + j * n + level; + if (i > 0) { g.addLink(node, i - 1 + j * n + level); } + if (j > 0) { g.addLink(node, i + (j - 1) * n + level); } + if (k > 0) { g.addLink(node, i + j * n + (k - 1) * n * m ); } + } + } + } + + return g; } - var g = createGraph(), - i, j, k; - if (n === 1 && m === 1 && z === 1) { - g.addNode(0); + function balancedBinTree(n) { + /** + * Balanced binary tree with n levels. + * + * @param {Number} n of levels in the binary tree + */ + if (n < 0) { + throw new Error("Invalid number of nodes in balanced tree"); + } + var g = createGraph(), + count = Math.pow(2, n), + level; + + if (n === 0) { + g.addNode(1); + } + + for (level = 1; level < count; ++level) { + var root = level, + left = root * 2, + right = root * 2 + 1; + + g.addLink(root, left); + g.addLink(root, right); + } + return g; } - for (k = 0; k < z; ++k) { + function noLinks(n) { + /** + * Graph with no links + * + * @param {Number} n of nodes in the graph + */ + if (n < 0) { + throw new Error("Number of nodes should be >= 0"); + } + + var g = createGraph(), i; for (i = 0; i < n; ++i) { - for (j = 0; j < m; ++j) { - var level = k * n * m; - var node = i + j * n + level; - if (i > 0) { g.addLink(node, i - 1 + j * n + level); } - if (j > 0) { g.addLink(node, i + (j - 1) * n + level); } - if (k > 0) { g.addLink(node, i + j * n + (k - 1) * n * m ); } - } + g.addNode(i); } + + return g; } - return g; -} + function cliqueCircle(cliqueCount, cliqueSize) { + /** + * A circular graph with cliques instead of individual nodes + * + * @param {Number} cliqueCount number of cliques inside circle + * @param {Number} cliqueSize number of nodes inside each clique + */ -function balancedBinTree(n) { -/** - * Balanced binary tree with n levels. - * - * @param {Number} n of levels in the binary tree - */ - if (n < 0) { - throw new Error("Invalid number of nodes in balanced tree"); - } - var g = createGraph(), - count = Math.pow(2, n), - level; + if (cliqueCount < 1) throw new Error('Invalid number of cliqueCount in cliqueCircle'); + if (cliqueSize < 1) throw new Error('Invalid number of cliqueSize in cliqueCircle'); - if (n === 0) { - g.addNode(1); - } + var graph = createGraph(); + + for (var i = 0; i < cliqueCount; ++i) { + appendClique(cliqueSize, i * cliqueSize) + + if (i > 0) { + graph.addLink(i * cliqueSize, i * cliqueSize - 1); + } + } + graph.addLink(0, graph.getNodesCount() - 1); - for (level = 1; level < count; ++level) { - var root = level, - left = root * 2, - right = root * 2 + 1; + return graph; - g.addLink(root, left); - g.addLink(root, right); + function appendClique(size, from) { + for (var i = 0; i < size; ++i) { + graph.addNode(i + from) + } + + for (var i = 0; i < size; ++i) { + for (var j = i + 1; j < size; ++j) { + graph.addLink(i + from, j + from) + } + } + } } - return g; + function wattsStrogatz(n, k, p, seed) { + /** + * Watts-Strogatz small-world graph. + * + * @param {Number} n The number of nodes + * @param {Number} k Each node is connected to k nearest neighbors in ring topology + * @param {Number} p The probability of rewiring each edge + + * @see https://github.com/networkx/networkx/blob/master/networkx/generators/random_graphs.py + */ + if (k >= n) throw new Error('Choose smaller `k`. It cannot be larger than number of nodes `n`'); + + + var random = require('ngraph.random').random(seed || 42); + + var g = createGraph(), i, to; + for (i = 0; i < n; ++i) { + g.addNode(i); + } + + // connect each node to k/2 neighbors + var neighborsSize = Math.floor(k/2 + 1); + for (var j = 1; j < neighborsSize; ++j) { + for (i = 0; i < n; ++i) { + to = (j + i) % n; + g.addLink(i, to); + } + } + + // rewire edges from each node + // loop over all nodes in order (label) and neighbors in order (distance) + // no self loops or multiple edges allowed + for (j = 1; j < neighborsSize; ++j) { + for (i = 0; i < n; ++i) { + if (random.nextDouble() < p) { + var from = i; + to = (j + i) % n; + + var newTo = random.next(n); + var needsRewire = (newTo === from || g.hasLink(from, newTo)); + if (needsRewire && g.getLinks(from).length === n - 1) { + // we cannot rewire this node, it has too many links. + continue; + } + // Enforce no self-loops or multiple edges + while (needsRewire) { + newTo = random.next(n); + needsRewire = (newTo === from || g.hasLink(from, newTo)); + } + var link = g.hasLink(from, to); + g.removeLink(link); + g.addLink(from, newTo); + } + } + } + + return g; + } } -function noLinks(n) { +},{"ngraph.graph":16,"ngraph.random":15}],15:[function(require,module,exports){ +module.exports = random; + +// TODO: Deprecate? +module.exports.random = random, +module.exports.randomIterator = randomIterator + /** - * Graph with no links - * - * @param {Number} n of nodes in the graph + * Creates seeded PRNG with two methods: + * next() and nextDouble() */ - if (n < 0) { - throw new Error("Number of nodes shoul be >= 0"); - } - - var g = createGraph(), i; - for (i = 0; i < n; ++i) { - g.addNode(i); - } +function random(inputSeed) { + var seed = typeof inputSeed === 'number' ? inputSeed : (+new Date()); + return new Generator(seed) +} - return g; +function Generator(seed) { + this.seed = seed; } -function wattsStrogatz(n, k, p, seed) { /** - * Watts-Strogatz small-world graph. - * - * @param {Number} n The number of nodes - * @param {Number} k Each node is connected to k nearest neighbors in ring topology - * @param {Number} p The probability of rewiring each edge + * Generates random integer number in the range from 0 (inclusive) to maxValue (exclusive) + * + * @param maxValue Number REQUIRED. Omitting this number will result in NaN values from PRNG. + */ +Generator.prototype.next = next; - * @see https://github.com/networkx/networkx/blob/master/networkx/generators/random_graphs.py +/** + * Generates random double number in the range from 0 (inclusive) to 1 (exclusive) + * This function is the same as Math.random() (except that it could be seeded) + */ +Generator.prototype.nextDouble = nextDouble; + +/** + * Returns a random real number uniformly in [0, 1) */ - if (k >= n) throw new Error('Choose smaller `k`. It cannot be larger than number of nodes `n`'); +Generator.prototype.uniform = nextDouble; +Generator.prototype.gaussian = gaussian; - var random = require('ngraph.random').random(seed || 42); +function gaussian() { + // use the polar form of the Box-Muller transform + // based on https://introcs.cs.princeton.edu/java/23recursion/StdRandom.java + var r, x, y; + do { + x = this.nextDouble() * 2 - 1; + y = this.nextDouble() * 2 - 1; + r = x * x + y * y; + } while (r >= 1 || r === 0); + + return x * Math.sqrt(-2 * Math.log(r)/r); +} + +function nextDouble() { + var seed = this.seed; + // Robert Jenkins' 32 bit integer hash function. + seed = ((seed + 0x7ed55d16) + (seed << 12)) & 0xffffffff; + seed = ((seed ^ 0xc761c23c) ^ (seed >>> 19)) & 0xffffffff; + seed = ((seed + 0x165667b1) + (seed << 5)) & 0xffffffff; + seed = ((seed + 0xd3a2646c) ^ (seed << 9)) & 0xffffffff; + seed = ((seed + 0xfd7046c5) + (seed << 3)) & 0xffffffff; + seed = ((seed ^ 0xb55a4f09) ^ (seed >>> 16)) & 0xffffffff; + this.seed = seed; + return (seed & 0xfffffff) / 0x10000000; +} + +function next(maxValue) { + return Math.floor(this.nextDouble() * maxValue); +} - var g = createGraph(), i, to; - for (i = 0; i < n; ++i) { - g.addNode(i); +/* + * Creates iterator over array, which returns items of array in random order + * Time complexity is guaranteed to be O(n); + */ +function randomIterator(array, customRandom) { + var localRandom = customRandom || random(); + if (typeof localRandom.next !== 'function') { + throw new Error('customRandom does not match expected API: next() function is missing'); } - // connect each node to k/2 neighbors - var neighborsSize = Math.floor(k/2 + 1); - for (var j = 1; j < neighborsSize; ++j) { - for (i = 0; i < n; ++i) { - to = (j + i) % n; - g.addLink(i, to); + return { + forEach: forEach, + + /** + * Shuffles array randomly, in place. + */ + shuffle: shuffle + }; + + function shuffle() { + var i, j, t; + for (i = array.length - 1; i > 0; --i) { + j = localRandom.next(i + 1); // i inclusive + t = array[j]; + array[j] = array[i]; + array[i] = t; } + + return array; } - // rewire edges from each node - // loop over all nodes in order (label) and neighbors in order (distance) - // no self loops or multiple edges allowed - for (j = 1; j < neighborsSize; ++j) { - for (i = 0; i < n; ++i) { - if (random.nextDouble() < p) { - var from = i; - to = (j + i) % n; + function forEach(callback) { + var i, j, t; + for (i = array.length - 1; i > 0; --i) { + j = localRandom.next(i + 1); // i inclusive + t = array[j]; + array[j] = array[i]; + array[i] = t; - var newTo = random.next(n); - var needsRewire = (newTo === from || g.hasLink(from, newTo)); - if (needsRewire && g.getLinks(from).length === n - 1) { - // we cannot rewire this node, it has too many links. - continue; - } - // Enforce no self-loops or multiple edges - while (needsRewire) { - newTo = random.next(n); - needsRewire = (newTo === from || g.hasLink(from, newTo)); - } - var link = g.hasLink(from, to); - g.removeLink(link); - g.addLink(from, newTo); - } + callback(t); } - } - return g; + if (array.length) { + callback(array[0]); + } + } } - -},{"ngraph.graph":12,"ngraph.random":26}],12:[function(require,module,exports){ +},{}],16:[function(require,module,exports){ /** * @fileOverview Contains definition of the core graph object. */ +// TODO: need to change storage layer: +// 1. Be able to get all nodes O(1) +// 2. Be able to get number of links O(1) + /** * @example * var graph = require('ngraph.graph')(); @@ -1314,13 +1635,23 @@ function createGraph(options) { // array is used to speed up all links enumeration. This is inefficient // in terms of memory, but simplifies coding. options = options || {}; - if (options.uniqueLinkId === undefined) { - // Request each link id to be unique between same nodes. This negatively - // impacts `addLink()` performance (O(n), where n - number of edges of each - // vertex), but makes operations with multigraphs more accessible. - options.uniqueLinkId = true; + if ('uniqueLinkId' in options) { + console.warn( + 'ngraph.graph: Starting from version 0.14 `uniqueLinkId` is deprecated.\n' + + 'Use `multigraph` option instead\n', + '\n', + 'Note: there is also change in default behavior: From now own each graph\n'+ + 'is considered to be not a multigraph by default (each edge is unique).' + ); + + options.multigraph = options.uniqueLinkId; } + // Dear reader, the non-multigraphs do not guarantee that there is only + // one link for a given pair of node. When this option is set to false + // we can save some memory and CPU (18% faster for non-multigraph); + if (options.multigraph === undefined) options.multigraph = false; + var nodes = typeof Object.create === 'function' ? Object.create(null) : {}, links = [], // Hash of multi-edges. Used to track ids of edges between same nodes @@ -1329,7 +1660,7 @@ function createGraph(options) { suspendEvents = 0, forEachNode = createNodeIterator(), - createLink = options.uniqueLinkId ? createUniqueLink : createSingleLink, + createLink = options.multigraph ? createUniqueLink : createSingleLink, // Our graph API provides means to listen to graph changes. Users can subscribe // to be notified about changes in the graph by using `on` method. However @@ -1355,8 +1686,6 @@ function createGraph(options) { * its data is extended with whatever comes in 'data' argument. * * @param nodeId the node's identifier. A string or number is preferred. - * note: If you request options.uniqueLinkId, then node id should not - * contain '👉 '. This will break link identifiers * @param [data] additional data for the node being added. If node already * exists its data object is augmented with the new one. * @@ -1410,14 +1739,14 @@ function createGraph(options) { * * @return number of nodes in the graph. */ - getNodesCount: function() { + getNodesCount: function () { return nodesCount; }, /** * Gets total number of links in the graph. */ - getLinksCount: function() { + getLinksCount: function () { return links.length; }, @@ -1489,6 +1818,16 @@ function createGraph(options) { */ hasLink: getLink, + /** + * Detects whether there is a node with given id + * + * Operation complexity is O(1) + * NOTE: this function is synonim for getNode() + * + * @returns node if there is one; Falsy value otherwise. + */ + hasNode: getNode, + /** * Gets an edge between two nodes. * Operation complexity is O(n) where n - number of links of a node. @@ -1552,16 +1891,14 @@ function createGraph(options) { var node = getNode(nodeId); if (!node) { - // TODO: Should I check for 👉 here? - node = new Node(nodeId); + node = new Node(nodeId, data); nodesCount++; recordNodeChange(node, 'add'); } else { + node.data = data; recordNodeChange(node, 'update'); } - node.data = data; - nodes[nodeId] = node; exitModification(); @@ -1580,9 +1917,12 @@ function createGraph(options) { enterModification(); - while (node.links.length) { - var link = node.links[0]; - removeLink(link); + var prevLinks = node.links; + if (prevLinks) { + node.links = null; + for(var i = 0; i < prevLinks.length; ++i) { + removeLink(prevLinks[i]); + } } delete nodes[nodeId]; @@ -1607,10 +1947,10 @@ function createGraph(options) { links.push(link); // TODO: this is not cool. On large graphs potentially would consume more memory. - fromNode.links.push(link); + addLinkToNode(fromNode, link); if (fromId !== toId) { // make sure we are not duplicating links for self-loops - toNode.links.push(link); + addLinkToNode(toNode, link); } recordLinkChange(link, 'add'); @@ -1621,18 +1961,20 @@ function createGraph(options) { } function createSingleLink(fromId, toId, data) { - var linkId = fromId.toString() + toId.toString(); + var linkId = makeLinkId(fromId, toId); return new Link(fromId, toId, data, linkId); } function createUniqueLink(fromId, toId, data) { - var linkId = fromId.toString() + '👉 ' + toId.toString(); + // TODO: Get rid of this method. + var linkId = makeLinkId(fromId, toId); var isMultiEdge = multiEdges.hasOwnProperty(linkId); if (isMultiEdge || getLink(fromId, toId)) { if (!isMultiEdge) { multiEdges[linkId] = 0; } - linkId += '@' + (++multiEdges[linkId]); + var suffix = '@' + (++multiEdges[linkId]); + linkId = makeLinkId(fromId + suffix, toId + suffix); } return new Link(fromId, toId, data, linkId); @@ -1684,7 +2026,7 @@ function createGraph(options) { // TODO: Use sorted links to speed this up var node = getNode(fromNodeId), i; - if (!node) { + if (!node || !node.links) { return null; } @@ -1806,6 +2148,8 @@ function createGraph(options) { // need this for old browsers. Should this be a separate module? function indexOfElementInArray(element, array) { + if (!array) return -1; + if (array.indexOf) { return array.indexOf(element); } @@ -1825,12 +2169,19 @@ function indexOfElementInArray(element, array) { /** * Internal structure to represent node; */ -function Node(id) { +function Node(id, data) { this.id = id; - this.links = []; - this.data = null; + this.links = null; + this.data = data; } +function addLinkToNode(node, link) { + if (node.links) { + node.links.push(link); + } else { + node.links = [link]; + } +} /** * Internal structure to represent links; @@ -1842,7 +2193,22 @@ function Link(fromId, toId, data, id) { this.id = id; } -},{"ngraph.events":7}],13:[function(require,module,exports){ +function hashCode(str) { + var hash = 0, i, chr, len; + if (str.length == 0) return hash; + for (i = 0, len = str.length; i < len; i++) { + chr = str.charCodeAt(i); + hash = ((hash << 5) - hash) + chr; + hash |= 0; // Convert to 32bit integer + } + return hash; +} + +function makeLinkId(fromId, toId) { + return fromId.toString() + '👉 ' + toId.toString(); +} + +},{"ngraph.events":9}],17:[function(require,module,exports){ module.exports = merge; /** @@ -1875,7 +2241,7 @@ function merge(target, options) { return target; } -},{}],14:[function(require,module,exports){ +},{}],18:[function(require,module,exports){ module.exports = { Body: Body, Vector2d: Vector2d, @@ -1942,7 +2308,7 @@ Vector3d.prototype.reset = function () { this.x = this.y = this.z = 0; }; -},{}],15:[function(require,module,exports){ +},{}],19:[function(require,module,exports){ /** * Manages a simulation of physical forces acting on bodies and springs. */ @@ -2006,6 +2372,7 @@ function physicsSimulator(settings) { springForce = createSpringForce(settings), dragForce = createDragForce(settings); + var bboxNeedsUpdate = true; var totalMovement = 0; // how much movement we made on last step var publicApi = { @@ -2152,9 +2519,17 @@ function physicsSimulator(settings) { * Returns bounding box which covers all bodies */ getBBox: function () { + if (bboxNeedsUpdate) { + bounds.update(); + bboxNeedsUpdate = false; + } return bounds.box; }, + invalidateBBox: function () { + bboxNeedsUpdate = true; + }, + gravity: function (value) { if (value !== undefined) { settings.gravity = value; @@ -2211,7 +2586,7 @@ function physicsSimulator(settings) { } }; -},{"./lib/bounds":16,"./lib/createBody":17,"./lib/dragForce":18,"./lib/eulerIntegrator":19,"./lib/spring":20,"./lib/springForce":21,"ngraph.events":7,"ngraph.expose":8,"ngraph.merge":13,"ngraph.quadtreebh":22}],16:[function(require,module,exports){ +},{"./lib/bounds":20,"./lib/createBody":21,"./lib/dragForce":22,"./lib/eulerIntegrator":23,"./lib/spring":24,"./lib/springForce":25,"ngraph.events":9,"ngraph.expose":10,"ngraph.merge":17,"ngraph.quadtreebh":26}],20:[function(require,module,exports){ module.exports = function (bodies, settings) { var random = require('ngraph.random').random(42); var boundingBox = { x1: 0, y1: 0, x2: 0, y2: 0 }; @@ -2293,14 +2668,14 @@ module.exports = function (bodies, settings) { } } -},{"ngraph.random":26}],17:[function(require,module,exports){ +},{"ngraph.random":30}],21:[function(require,module,exports){ var physics = require('ngraph.physics.primitives'); module.exports = function(pos) { return new physics.Body(pos); } -},{"ngraph.physics.primitives":14}],18:[function(require,module,exports){ +},{"ngraph.physics.primitives":18}],22:[function(require,module,exports){ /** * Represents drag force, which reduces force value on each step by given * coefficient. @@ -2329,7 +2704,7 @@ module.exports = function (options) { return api; }; -},{"ngraph.expose":8,"ngraph.merge":13}],19:[function(require,module,exports){ +},{"ngraph.expose":10,"ngraph.merge":17}],23:[function(require,module,exports){ /** * Performs forces integration, using given timestep. Uses Euler method to solve * differential equation (http://en.wikipedia.org/wiki/Euler_method ). @@ -2376,7 +2751,7 @@ function integrate(bodies, timeStep) { return (tx * tx + ty * ty)/max; } -},{}],20:[function(require,module,exports){ +},{}],24:[function(require,module,exports){ module.exports = Spring; /** @@ -2392,7 +2767,7 @@ function Spring(fromBody, toBody, length, coeff, weight) { this.weight = typeof weight === 'number' ? weight : 1; }; -},{}],21:[function(require,module,exports){ +},{}],25:[function(require,module,exports){ /** * Represents spring force, which updates forces acting on two bodies, conntected * by a spring. @@ -2444,7 +2819,7 @@ module.exports = function (options) { return api; } -},{"ngraph.expose":8,"ngraph.merge":13,"ngraph.random":26}],22:[function(require,module,exports){ +},{"ngraph.expose":10,"ngraph.merge":17,"ngraph.random":30}],26:[function(require,module,exports){ /** * This is Barnes Hut simulation algorithm for 2d case. Implementation * is highly optimized (avoids recusion and gc pressure) @@ -2773,7 +3148,7 @@ function setChild(node, idx, child) { else if (idx === 3) node.quad3 = child; } -},{"./insertStack":23,"./isSamePosition":24,"./node":25,"ngraph.random":26}],23:[function(require,module,exports){ +},{"./insertStack":27,"./isSamePosition":28,"./node":29,"ngraph.random":30}],27:[function(require,module,exports){ module.exports = InsertStack; /** @@ -2817,7 +3192,7 @@ function InsertStackElement(node, body) { this.body = body; // physical body which needs to be inserted to node } -},{}],24:[function(require,module,exports){ +},{}],28:[function(require,module,exports){ module.exports = function isSamePosition(point1, point2) { var dx = Math.abs(point1.x - point2.x); var dy = Math.abs(point1.y - point2.y); @@ -2825,7 +3200,7 @@ module.exports = function isSamePosition(point1, point2) { return (dx < 1e-8 && dy < 1e-8); }; -},{}],25:[function(require,module,exports){ +},{}],29:[function(require,module,exports){ /** * Internal data structure to represent 2D QuadTree node */ @@ -2857,7 +3232,7 @@ module.exports = function Node() { this.right = 0; }; -},{}],26:[function(require,module,exports){ +},{}],30:[function(require,module,exports){ module.exports = { random: random, randomIterator: randomIterator @@ -2944,7 +3319,7 @@ function randomIterator(array, customRandom) { }; } -},{}],27:[function(require,module,exports){ +},{}],31:[function(require,module,exports){ module.exports = save; function save(graph, customNodeTransform, customLinkTransform) { @@ -3000,7 +3375,7 @@ function save(graph, customNodeTransform, customLinkTransform) { } } -},{}],28:[function(require,module,exports){ +},{}],32:[function(require,module,exports){ module.exports = svg; svg.compile = require('./lib/compile'); @@ -3113,7 +3488,7 @@ function augment(element) { } } -},{"./lib/compile":29,"./lib/compile_template":30,"add-event-listener":2}],29:[function(require,module,exports){ +},{"./lib/compile":33,"./lib/compile_template":34,"add-event-listener":2}],33:[function(require,module,exports){ var parser = require('./domparser.js'); var svg = require('../'); @@ -3141,7 +3516,7 @@ function addNamespaces(text) { } } -},{"../":28,"./domparser.js":31}],30:[function(require,module,exports){ +},{"../":32,"./domparser.js":35}],34:[function(require,module,exports){ module.exports = template; var BINDING_EXPR = /{{(.+?)}}/; @@ -3235,7 +3610,7 @@ function bindTextContent(element, allBindings) { } } -},{}],31:[function(require,module,exports){ +},{}],35:[function(require,module,exports){ module.exports = createDomparser(); function createDomparser() { @@ -3251,7 +3626,7 @@ function fail() { throw new Error('DOMParser is not supported by this platform. Please open issue here https://github.com/anvaka/simplesvg'); } -},{}],32:[function(require,module,exports){ +},{}],36:[function(require,module,exports){ var centrality = require('ngraph.centrality'); module.exports = centralityWrapper; @@ -3289,7 +3664,7 @@ function toVivaGraphCentralityFormat(centrality) { } } -},{"ngraph.centrality":4}],33:[function(require,module,exports){ +},{"ngraph.centrality":4}],37:[function(require,module,exports){ /** * @fileOverview Contains collection of primitive operations under graph. * @@ -3324,7 +3699,7 @@ function operations() { }; }; -},{}],34:[function(require,module,exports){ +},{}],38:[function(require,module,exports){ /** * @author Andrei Kashcha (aka anvaka) / https://github.com/anvaka */ @@ -3373,7 +3748,7 @@ function domInputManager(graph, graphics) { } } -},{"./dragndrop.js":35}],35:[function(require,module,exports){ +},{"./dragndrop.js":39}],39:[function(require,module,exports){ /** * @author Andrei Kashcha (aka anvaka) / https://github.com/anvaka */ @@ -3656,7 +4031,7 @@ function dragndrop(element) { }; } -},{"../Utils/browserInfo.js":39,"../Utils/documentEvents.js":40,"../Utils/findElementPosition.js":41}],36:[function(require,module,exports){ +},{"../Utils/browserInfo.js":43,"../Utils/documentEvents.js":44,"../Utils/findElementPosition.js":45}],40:[function(require,module,exports){ /** * @author Andrei Kashcha (aka anvaka) / https://github.com/anvaka */ @@ -3727,7 +4102,7 @@ function webglInputManager(graph, graphics) { }; } -},{"../WebGL/webglInputEvents.js":57}],37:[function(require,module,exports){ +},{"../WebGL/webglInputEvents.js":61}],41:[function(require,module,exports){ module.exports = constant; var merge = require('ngraph.merge'); @@ -3926,7 +4301,7 @@ function constant(graph, userSettings) { } } -},{"../Utils/rect.js":45,"ngraph.merge":13,"ngraph.random":26}],38:[function(require,module,exports){ +},{"../Utils/rect.js":49,"ngraph.merge":17,"ngraph.random":30}],42:[function(require,module,exports){ /** * This module provides compatibility layer with 0.6.x library. It will be * removed in the next version @@ -3971,7 +4346,7 @@ function backwardCompatibleEvents(g) { } } -},{"ngraph.events":7}],39:[function(require,module,exports){ +},{"ngraph.events":9}],43:[function(require,module,exports){ module.exports = browserInfo(); function browserInfo() { @@ -4000,7 +4375,7 @@ function browserInfo() { }; } -},{}],40:[function(require,module,exports){ +},{}],44:[function(require,module,exports){ var nullEvents = require('./nullEvents.js'); module.exports = createDocumentEvents(); @@ -4024,7 +4399,7 @@ function off(eventName, handler) { document.removeEventListener(eventName, handler); } -},{"./nullEvents.js":44}],41:[function(require,module,exports){ +},{"./nullEvents.js":48}],45:[function(require,module,exports){ /** * Finds the absolute position of an element on a page */ @@ -4043,7 +4418,7 @@ function findElementPosition(obj) { return [curleft, curtop]; } -},{}],42:[function(require,module,exports){ +},{}],46:[function(require,module,exports){ module.exports = getDimension; function getDimension(container) { @@ -4065,7 +4440,7 @@ function getDimension(container) { }; } -},{}],43:[function(require,module,exports){ +},{}],47:[function(require,module,exports){ var intersect = require('gintersect'); module.exports = intersectRect; @@ -4077,7 +4452,7 @@ function intersectRect(left, top, right, bottom, x1, y1, x2, y2) { intersect(right, top, left, top, x1, y1, x2, y2); } -},{"gintersect":3}],44:[function(require,module,exports){ +},{"gintersect":3}],48:[function(require,module,exports){ module.exports = createNullEvents(); function createNullEvents() { @@ -4090,7 +4465,7 @@ function createNullEvents() { function noop() { } -},{}],45:[function(require,module,exports){ +},{}],49:[function(require,module,exports){ module.exports = Rect; /** @@ -4103,7 +4478,7 @@ function Rect (x1, y1, x2, y2) { this.y2 = y2 || 0; } -},{}],46:[function(require,module,exports){ +},{}],50:[function(require,module,exports){ (function (global){ /** * @author Andrei Kashcha (aka anvaka) / https://github.com/anvaka @@ -4199,7 +4574,7 @@ function createTimer() { function noop() {} }).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) -},{}],47:[function(require,module,exports){ +},{}],51:[function(require,module,exports){ var nullEvents = require('./nullEvents.js'); module.exports = createDocumentEvents(); @@ -4224,7 +4599,7 @@ function off(eventName, handler) { } -},{"./nullEvents.js":44}],48:[function(require,module,exports){ +},{"./nullEvents.js":48}],52:[function(require,module,exports){ /** * @fileOverview Defines a graph renderer that uses CSS based drawings. * @@ -4265,7 +4640,7 @@ var dragndrop = require('../Input/dragndrop.js'); * * // Layout algorithm to be used. The algorithm is expected to comply with defined * // interface and is expected to be iterative. Renderer will use it then to calculate - * // grpaph's layout. For examples of the interface refer to Viva.Graph.Layout.forceDirected() + * // graph's layout. For examples of the interface refer to Viva.Graph.Layout.forceDirected() * layout : Viva.Graph.Layout.forceDirected(), * * // Directs renderer to display links. Usually rendering links is the slowest part of this @@ -4385,6 +4760,10 @@ function renderer(graph, settings) { getGraphics: function() { return graphics; }, + + getLayout: function() { + return layout; + }, /** * Removes this renderer and deallocates all resources/timers @@ -4711,7 +5090,7 @@ function renderer(graph, settings) { } } -},{"../Input/domInputManager.js":34,"../Input/dragndrop.js":35,"../Utils/getDimensions.js":42,"../Utils/timer.js":46,"../Utils/windowEvents.js":47,"./svgGraphics.js":49,"ngraph.events":7,"ngraph.forcelayout":9}],49:[function(require,module,exports){ +},{"../Input/domInputManager.js":38,"../Input/dragndrop.js":39,"../Utils/getDimensions.js":46,"../Utils/timer.js":50,"../Utils/windowEvents.js":51,"./svgGraphics.js":53,"ngraph.events":9,"ngraph.forcelayout":11}],53:[function(require,module,exports){ /** * @fileOverview Defines a graph renderer that uses SVG based drawings. * @@ -5069,7 +5448,7 @@ function svgGraphics() { } } -},{"../Input/domInputManager.js":34,"ngraph.events":7,"simplesvg":28}],50:[function(require,module,exports){ +},{"../Input/domInputManager.js":38,"ngraph.events":9,"simplesvg":32}],54:[function(require,module,exports){ /** * @fileOverview Defines a graph renderer that uses WebGL based drawings. * @@ -5657,7 +6036,7 @@ function webglGraphics(options) { return graphics; } -},{"../Input/webglInputManager.js":36,"../WebGL/webglLine.js":58,"../WebGL/webglLinkProgram.js":59,"../WebGL/webglNodeProgram.js":60,"../WebGL/webglSquare.js":61,"ngraph.events":7,"ngraph.merge":13}],51:[function(require,module,exports){ +},{"../Input/webglInputManager.js":40,"../WebGL/webglLine.js":62,"../WebGL/webglLinkProgram.js":63,"../WebGL/webglNodeProgram.js":64,"../WebGL/webglSquare.js":65,"ngraph.events":9,"ngraph.merge":17}],55:[function(require,module,exports){ module.exports = parseColor; function parseColor(color) { @@ -5681,7 +6060,7 @@ function parseColor(color) { return parsedColor; } -},{}],52:[function(require,module,exports){ +},{}],56:[function(require,module,exports){ module.exports = Texture; /** @@ -5694,7 +6073,7 @@ function Texture(size) { this.canvas.width = this.canvas.height = size; } -},{}],53:[function(require,module,exports){ +},{}],57:[function(require,module,exports){ /** * @fileOverview Utility functions for webgl rendering. * @@ -5801,7 +6180,7 @@ function swapArrayPart(array, from, to, elementsCount) { } } -},{}],54:[function(require,module,exports){ +},{}],58:[function(require,module,exports){ var Texture = require('./texture.js'); module.exports = webglAtlas; @@ -6005,7 +6384,7 @@ function isPowerOf2(n) { return (n & (n - 1)) === 0; } -},{"./texture.js":52}],55:[function(require,module,exports){ +},{"./texture.js":56}],59:[function(require,module,exports){ module.exports = webglImage; /** @@ -6037,7 +6416,7 @@ function webglImage(size, src) { }; } -},{}],56:[function(require,module,exports){ +},{}],60:[function(require,module,exports){ /** * @fileOverview Defines an image nodes for webglGraphics class. * Shape of nodes is square. @@ -6301,7 +6680,7 @@ function createNodeVertexShader() { ].join("\n"); } -},{"./webgl.js":53,"./webglAtlas.js":54}],57:[function(require,module,exports){ +},{"./webgl.js":57,"./webglAtlas.js":58}],61:[function(require,module,exports){ var documentEvents = require('../Utils/documentEvents.js'); module.exports = webglInputEvents; @@ -6561,7 +6940,7 @@ function webglInputEvents(webglGraphics) { } } -},{"../Utils/documentEvents.js":40}],58:[function(require,module,exports){ +},{"../Utils/documentEvents.js":44}],62:[function(require,module,exports){ var parseColor = require('./parseColor.js'); module.exports = webglLine; @@ -6582,7 +6961,7 @@ function webglLine(color) { }; } -},{"./parseColor.js":51}],59:[function(require,module,exports){ +},{"./parseColor.js":55}],63:[function(require,module,exports){ /** * @fileOverview Defines a naive form of links for webglGraphics class. * This form allows to change color of links. @@ -6740,7 +7119,7 @@ function webglLinkProgram() { }; } -},{"./webgl.js":53}],60:[function(require,module,exports){ +},{"./webgl.js":57}],64:[function(require,module,exports){ /** * @fileOverview Defines a naive form of nodes for webglGraphics class. * This form allows to change color of node. Shape of nodes is rectangular. @@ -6905,7 +7284,7 @@ function webglNodeProgram() { } } -},{"./webgl.js":53}],61:[function(require,module,exports){ +},{"./webgl.js":57}],65:[function(require,module,exports){ var parseColor = require('./parseColor.js'); module.exports = webglSquare; @@ -6931,7 +7310,7 @@ function webglSquare(size, color) { }; } -},{"./parseColor.js":51}],62:[function(require,module,exports){ +},{"./parseColor.js":55}],66:[function(require,module,exports){ // todo: this should be generated at build time. module.exports = '0.8.1'; diff --git a/dist/vivagraph.min.js b/dist/vivagraph.min.js index 3e2be0b..84f31bb 100644 --- a/dist/vivagraph.min.js +++ b/dist/vivagraph.min.js @@ -1,2 +1,3 @@ -!function(e){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=e();else if("function"==typeof define&&define.amd)define([],e);else{var n;"undefined"!=typeof window?n=window:"undefined"!=typeof global?n=global:"undefined"!=typeof self&&(n=self),n.Viva=e()}}(function(){return function e(n,t,r){function o(a,u){if(!t[a]){if(!n[a]){var s="function"==typeof require&&require;if(!u&&s)return s(a,!0);if(i)return i(a,!0);var f=new Error("Cannot find module '"+a+"'");throw f.code="MODULE_NOT_FOUND",f}var c=t[a]={exports:{}};n[a][0].call(c.exports,function(e){var t=n[a][1][e];return o(t?t:e)},c,c.exports,e,n,t,r)}return t[a].exports}for(var i="function"==typeof require&&require,a=0;a=0==m>=4?null:(f=u-i,d=o-a,p=a*i-o*u,v=f*e+d*n+p,g=f*t+d*r+p,0!==v&&0!==g&&v>=0==g>=0?null:(y=s*d-f*c,0===y?null:(x=y<0?-y/2:y/2,x=0,w=c*p-d*l,b.x=(w<0?w-x:w+x)/y,w=f*l-s*p,b.y=(w<0?w-x:w+x)/y,b)))}n.exports=r},{}],4:[function(e,n,t){n.exports.degree=e("./src/degree.js"),n.exports.betweenness=e("./src/betweenness.js")},{"./src/betweenness.js":5,"./src/degree.js":6}],5:[function(e,n,t){function r(e,n){function t(e){g[e]/=2}function r(e){g[e.id]=0}function o(e){s=e.id,u(s),i()}function i(){for(e.forEachNode(a);c.length;){for(var n=c.pop(),t=(1+v[n])/p[n],r=d[n],o=0;o1&&(o=Array.prototype.splice.call(arguments,1));for(var i=0;i0&&o.addLink(i,t-1+r*e),r>0&&o.addLink(i,t+(r-1)*e)}return o}function f(e,n,t){if(e<1||n<1||t<1)throw new Error("Invalid number of nodes in grid3 graph");var r,o,i,a=p();if(1===e&&1===n&&1===t)return a.addNode(0),a;for(i=0;i0&&a.addLink(s,r-1+o*e+u),o>0&&a.addLink(s,r+(o-1)*e+u),i>0&&a.addLink(s,r+o*e+(i-1)*e*n)}return a}function c(e){if(e<0)throw new Error("Invalid number of nodes in balanced tree");var n,t=p(),r=Math.pow(2,e);for(0===e&&t.addNode(1),n=1;n= 0");var n,t=p();for(n=0;n=n)throw new Error("Choose smaller `k`. It cannot be larger than number of nodes `n`");var i,a,u=e("ngraph.random").random(o||42),s=p();for(i=0;i=0&&t.links.splice(n,1)),r&&(n=o(e,r.links),n>=0&&r.links.splice(n,1)),U(e,"remove"),F(),!0}function h(e,n){var t,r=f(e);if(!r)return null;for(t=0;t0&&(O.fire("changed",M),M.length=0)}function P(){return Object.keys?k:j}function k(e){if("function"==typeof e)for(var n=Object.keys(A),t=0;t=0?i:-1,o);return v.push(a),a},getTotalMovement:function(){return x},removeSpring:function(e){if(e){var n=v.indexOf(e);return n>-1?(v.splice(n,1),!0):void 0}},getBestNewBodyPosition:function(e){return h.getBestNewPosition(e)},getBBox:function(){return h.box},gravity:function(e){return void 0!==e?(n.gravity=e,g.options({gravity:e}),this):n.gravity},theta:function(e){return void 0!==e?(n.theta=e,g.options({theta:e}),this):n.theta}};return o(n,w),a(w),w}n.exports=r},{"./lib/bounds":16,"./lib/createBody":17,"./lib/dragForce":18,"./lib/eulerIntegrator":19,"./lib/spring":20,"./lib/springForce":21,"ngraph.events":7,"ngraph.expose":8,"ngraph.merge":13,"ngraph.quadtreebh":22}],16:[function(e,n,t){n.exports=function(n,t){function r(){var e=n.length;if(0!==e){for(var t=Number.MAX_VALUE,r=Number.MAX_VALUE,o=Number.MIN_VALUE,a=Number.MIN_VALUE;e--;){var u=n[e];u.isPinned?(u.pos.x=u.prevPos.x,u.pos.y=u.prevPos.y):(u.prevPos.x=u.pos.x,u.prevPos.y=u.pos.y),u.pos.xo&&(o=u.pos.x),u.pos.ya&&(a=u.pos.y)}i.x1=t,i.x2=o,i.y1=r,i.y2=a}}var o=e("ngraph.random").random(42),i={x1:0,y1:0,x2:0,y2:0};return{box:i,update:r,reset:function(){i.x1=i.y1=0,i.x2=i.y2=0},getBestNewPosition:function(e){var n=i,r=0,a=0;if(e.length){for(var u=0;u1&&(s.velocity.x=c/l,s.velocity.y=d/l),r=n*s.velocity.x,i=n*s.velocity.y,s.pos.x+=r,s.pos.y+=i,o+=Math.abs(r),a+=Math.abs(i)}return(o*o+a*a)/u}n.exports=r},{}],20:[function(e,n,t){function r(e,n,t,r,o){this.from=e,this.to=n,this.length=t,this.coeff=r,this.weight="number"==typeof o?o:1}n.exports=r},{}],21:[function(e,n,t){n.exports=function(n){var t=e("ngraph.merge"),r=e("ngraph.random").random(42),o=e("ngraph.expose");n=t(n,{springCoeff:2e-4,springLength:80});var i={update:function(e){var t=e.from,o=e.to,i=e.length<0?n.springLength:e.length,a=o.pos.x-t.pos.x,u=o.pos.y-t.pos.y,s=Math.sqrt(a*a+u*u);0===s&&(a=(r.nextDouble()-.5)/50,u=(r.nextDouble()-.5)/50,s=Math.sqrt(a*a+u*u));var f=s-i,c=(!e.coeff||e.coeff<0?n.springCoeff:e.coeff)*f/s*e.weight;t.force.x+=c*a,t.force.y+=c*u,o.force.x-=c*a,o.force.y-=c*u}};return o(n,i,["springCoeff","springLength"]),i}},{"ngraph.expose":8,"ngraph.merge":13,"ngraph.random":26}],22:[function(e,n,t){function r(e,n){return 0===n?e.quad0:1===n?e.quad1:2===n?e.quad2:3===n?e.quad3:null}function o(e,n,t){0===n?e.quad0=t:1===n?e.quad1=t:2===n?e.quad2=t:3===n&&(e.quad3=t)}n.exports=function(n){function t(){var e=h[m];return e?(e.quad0=null,e.quad1=null,e.quad2=null,e.quad3=null,e.body=null,e.mass=e.massX=e.massY=0,e.left=e.right=e.top=e.bottom=0):(e=new f,h[m]=e),++m,e}function i(e){var n,t,r,o,i=p,a=0,u=0,f=1,c=0,d=1;for(i[0]=y;f;){var v=i[c],h=v.body;f-=1,c+=1;var m=h!==e;h&&m?(t=h.pos.x-e.pos.x,r=h.pos.y-e.pos.y,o=Math.sqrt(t*t+r*r),0===o&&(t=(s.nextDouble()-.5)/50,r=(s.nextDouble()-.5)/50,o=Math.sqrt(t*t+r*r)),n=l*h.mass*e.mass/(o*o*o),a+=n*t,u+=n*r):m&&(t=v.massX/v.mass-e.pos.x,r=v.massY/v.mass-e.pos.y,o=Math.sqrt(t*t+r*r),0===o&&(t=(s.nextDouble()-.5)/50,r=(s.nextDouble()-.5)/50,o=Math.sqrt(t*t+r*r)),(v.right-v.left)/oi&&(i=f),ca&&(a=c)}var d=i-r,l=a-o;for(d>l?a=o+d:i=r+l,m=0,y=t(),y.left=r,y.right=i,y.top=o,y.bottom=a,n=s-1,n>=0&&(y.body=e[n]);n--;)u(e[n],y)}function u(e){for(v.reset(),v.push(y,e);!v.isEmpty();){var n=v.pop(),i=n.node,a=n.body;if(i.body){var u=i.body;if(i.body=null,d(u.pos,a.pos)){var f=3;do{var c=s.nextDouble(),l=(i.right-i.left)*c,p=(i.bottom-i.top)*c;u.pos.x=i.left+l,u.pos.y=i.top+p,f-=1}while(f>0&&d(u.pos,a.pos));if(0===f&&d(u.pos,a.pos))return}v.push(i,u),v.push(i,a)}else{var g=a.pos.x,h=a.pos.y;i.mass=i.mass+a.mass,i.massX=i.massX+a.mass*g,i.massY=i.massY+a.mass*h;var m=0,x=i.left,w=(i.right+x)/2,b=i.top,E=(i.bottom+b)/2;g>w&&(m+=1,x=w,w=i.right),h>E&&(m+=2,b=E,E=i.bottom);var L=r(i,m);L?v.push(L,a):(L=t(),L.left=x,L.top=b,L.right=w,L.bottom=E,L.body=a,o(i,m,L))}}}n=n||{},n.gravity="number"==typeof n.gravity?n.gravity:-1,n.theta="number"==typeof n.theta?n.theta:.8;var s=e("ngraph.random").random(1984),f=e("./node"),c=e("./insertStack"),d=e("./isSamePosition"),l=n.gravity,p=[],v=new c,g=n.theta,h=[],m=0,y=t();return{insertBodies:a,getRoot:function(){return y},updateBodyForce:i,options:function(e){return e?("number"==typeof e.gravity&&(l=e.gravity),"number"==typeof e.theta&&(g=e.theta),this):{gravity:l,theta:g}}}}},{"./insertStack":23,"./isSamePosition":24,"./node":25,"ngraph.random":26}],23:[function(e,n,t){function r(){this.stack=[],this.popIdx=0}function o(e,n){this.node=e,this.body=n}n.exports=r,r.prototype={isEmpty:function(){return 0===this.popIdx},push:function(e,n){var t=this.stack[this.popIdx];t?(t.node=e,t.body=n):this.stack[this.popIdx]=new o(e,n),++this.popIdx},pop:function(){if(this.popIdx>0)return this.stack[--this.popIdx]},reset:function(){this.popIdx=0}}},{}],24:[function(e,n,t){n.exports=function(e,n){var t=Math.abs(e.x-n.x),r=Math.abs(e.y-n.y);return t<1e-8&&r<1e-8}},{}],25:[function(e,n,t){n.exports=function(){this.body=null,this.quad0=null,this.quad1=null,this.quad2=null,this.quad3=null,this.mass=0,this.massX=0,this.massY=0,this.left=0,this.top=0,this.bottom=0,this.right=0}},{}],26:[function(e,n,t){function r(e){var n="number"==typeof e?e:+new Date,t=function(){return n=n+2127912214+(n<<12)&4294967295,n=4294967295&(3345072700^n^n>>>19),n=n+374761393+(n<<5)&4294967295,n=4294967295&(n+3550635116^n<<9),n=n+4251993797+(n<<3)&4294967295,n=4294967295&(3042594569^n^n>>>16),(268435455&n)/268435456};return{next:function(e){return Math.floor(t()*e)},nextDouble:function(){return t()}}}function o(e,n){var t=n||r();if("function"!=typeof t.next)throw new Error("customRandom does not match expected API: next() function is missing");return{forEach:function(n){var r,o,i;for(r=e.length-1;r>0;--r)o=t.next(r+1),i=e[o],e[o]=e[r],e[r]=i,n(i);e.length&&n(e[0])},shuffle:function(){var n,r,o;for(n=e.length-1;n>0;--n)r=t.next(n+1),o=e[r],e[r]=e[n],e[n]=o;return e}}}n.exports={random:r,randomIterator:o}},{}],27:[function(e,n,t){function r(e,n,t){function r(e){u.nodes.push(s(e))}function o(e){u.links.push(f(e))}function i(e){var n={id:e.id};return void 0!==e.data&&(n.data=e.data),n}function a(e){var n={fromId:e.fromId,toId:e.toId};return void 0!==e.data&&(n.data=e.data),n}var u={nodes:[],links:[]},s=n||i,f=t||a;return e.forEachNode(r),e.forEachLink(o),JSON.stringify(u)}n.exports=r},{}],28:[function(e,n,t){function r(e,n){var t=o(e);if(void 0===n)return t;for(var r=Object.keys(n),i=0;iv&&(r=1),u(e,r,{x:e.touches[0].clientX,y:e.touches[0].clientY}),v=t,m(e),y(e)}},j=function(e){p=!1,o.off("touchmove",k),o.off("touchend",j),o.off("touchcancel",j),c=null,r&&r(e)},A=function(e,t){m(e),y(e),d=t.clientX,l=t.clientY,c=e.target||e.srcElement,n&&n(e,{x:d,y:l}),p||(p=!0,o.on("touchmove",k),o.on("touchend",j),o.on("touchcancel",j))},_=function(e){return 1===e.touches.length?A(e,e.touches[0]):void(2===e.touches.length&&(m(e), -y(e),v=P(e.touches[0],e.touches[1])))};return e.addEventListener("mousedown",b),e.addEventListener("touchstart",_),{onStart:function(e){return n=e,this},onDrag:function(e){return t=e,this},onStop:function(e){return r=e,this},onScroll:function(e){return N(e),this},release:function(){e.removeEventListener("mousedown",b),e.removeEventListener("touchstart",_),o.off("mousemove",w),o.off("mouseup",E),o.off("touchmove",k),o.off("touchend",j),o.off("touchcancel",j),N(null)}}}n.exports=r;var o=e("../Utils/documentEvents.js"),i=e("../Utils/browserInfo.js"),a=e("../Utils/findElementPosition.js")},{"../Utils/browserInfo.js":39,"../Utils/documentEvents.js":40,"../Utils/findElementPosition.js":41}],36:[function(e,n,t){function r(e,n){var t=o(n),r=null,i={},a={x:0,y:0};return t.mouseDown(function(e,n){r=e,a.x=n.clientX,a.y=n.clientY,t.mouseCapture(r);var o=i[e.id];return o&&o.onStart&&o.onStart(n,a),!0}).mouseUp(function(e){t.releaseMouseCapture(r),r=null;var n=i[e.id];return n&&n.onStop&&n.onStop(),!0}).mouseMove(function(e,n){if(r){var t=i[r.id];return t&&t.onDrag&&t.onDrag(n,{x:n.clientX-a.x,y:n.clientY-a.y}),a.x=n.clientX,a.y=n.clientY,!0}}),{bindDragNDrop:function(e,n){i[e.id]=n,n||delete i[e.id]}}}n.exports=r;var o=e("../WebGL/webglInputEvents.js")},{"../WebGL/webglInputEvents.js":57}],37:[function(e,n,t){function r(e,n){function t(e){return d[e]}n=o(n,{maxX:1024,maxY:1024,seed:"Deterministic randomness made me do this"});var r=i(n.seed),u=new a(Number.MAX_VALUE,Number.MAX_VALUE,Number.MIN_VALUE,Number.MIN_VALUE),s={},f=function(e){return{x:r.next(n.maxX),y:r.next(n.maxY)}},c=function(e,n){e.xn.x2&&(n.x2=e.x),e.yn.y2&&(n.y2=e.y)},d="function"==typeof Object.create?Object.create(null):{},l=function(e){d[e.id]=f(e),c(d[e.id],u)},p=function(){0!==e.getNodesCount()&&(u.x1=Number.MAX_VALUE,u.y1=Number.MAX_VALUE,u.x2=Number.MIN_VALUE,u.y2=Number.MIN_VALUE,e.forEachNode(l))},v=function(e){s[e.id]=e},g=function(e){for(var n=0;n=0:"boolean"!=typeof z||z}function r(){G=G||window.document.body,F=F||i(e,{springLength:80,springCoeff:2e-4}),O=O||a(e,{container:G}),n.hasOwnProperty("renderLinks")||(n.renderLinks=!0),n.prerender=n.prerender||0,U=(O.inputManager||s)(e,O)}function l(){O.beginRender(),n.renderLinks&&O.renderLinks(),O.renderNodes(),O.endRender()}function p(){return X=F.step()&&!V,l(),!X}function v(e){R||(R=void 0!==e?f(function(){if(e-=1,e<0){var n=!1;return n}return p()},M):f(p,M))}function g(){W||(X=!1,R.restart())}function h(){if("number"==typeof n.prerender&&n.prerender>0)for(var e=0;e0?n.insertBefore(r,n.firstChild):n.appendChild(r),r},releaseLink:function(e){var t=d[e.id];t&&(n.removeChild(t),delete d[e.id])},addNode:function(e,t){var r=l(e);if(r)return r.position=t,r.node=e,c[e.id]=r,n.appendChild(r),r},releaseNode:function(e){var t=c[e.id];t&&(n.removeChild(t),delete c[e.id])},renderNodes:function(){for(var e in c)if(c.hasOwnProperty(e)){var n=c[e];m.x=n.position.x,m.y=n.position.y,p(n,m,n.node)}},renderLinks:function(){for(var e in d)if(d.hasOwnProperty(e)){var n=d[e];y.x=n.position.from.x,y.y=n.position.from.y,x.x=n.position.to.x,x.y=n.position.to.y,g(n,y,x,n.link)}},getGraphicsRoot:function(e){return"function"==typeof e&&(t?e(t):r=e),t},getSvgRoot:function(){return t}};return i(b),b}n.exports=r;var o=e("simplesvg"),i=e("ngraph.events"),a=e("../Input/domInputManager.js")},{"../Input/domInputManager.js":34,"ngraph.events":7,simplesvg:28}],50:[function(e,n,t){function r(e){e=c(e,{enableBlending:!0,preserveDrawingBuffer:!1,clearColor:!1,clearColorValue:{r:1,g:1,b:1,a:1}});var n,t,r,d,l,p,v,g,h=0,m=0,y=[1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1],x=[],w=[],b={},E={},L=i(),N=a(),P=function(e){return u()},k=function(e){return s(3014898687)},j=function(){L.updateTransform(y),N.updateTransform(y)},A=function(){y=[1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1]},_=function(){n&&t&&(d=t.width=Math.max(n.offsetWidth,1),l=t.height=Math.max(n.offsetHeight,1),r&&r.viewport(0,0,d,l),L&&L.updateSize(d/2,l/2),N&&N.updateSize(d/2,l/2))},I=function(e){e.fire("rescaled")};t=window.document.createElement("canvas");var T={getLinkUI:function(e){return E[e]},getNodeUI:function(e){return b[e]},node:function(e){if("function"==typeof e)return P=e,this},link:function(e){if("function"==typeof e)return k=e,this},placeNode:function(e){return p=e,this},placeLink:function(e){return v=e,this},inputManager:o,beginRender:function(){},endRender:function(){m>0&&L.render(),h>0&&N.render()},bringLinkToFront:function(e){var n,t,r=L.getFrontLinkId();L.bringToFront(e),r>e.id&&(n=e.id,t=w[r],w[r]=w[n],w[r].id=r,w[n]=t,w[n].id=n)},graphCenterChanged:function(e,n){y[12]=2*e/d-1,y[13]=1-2*n/l,j()},addLink:function(e,n){var t=m++,r=k(e);return r.id=t,r.pos=n,L.createLink(r),w[t]=r,E[e.id]=r,r},addNode:function(e,n){var t=h++,r=P(e);return r.id=t,r.position=n,r.node=e,N.createNode(r),x[t]=r,b[e.id]=r,r},translateRel:function(e,n){y[12]+=2*y[0]*e/d/y[0],y[13]-=2*y[5]*n/l/y[5],j()},scale:function(e,n){var t=2*n.x/d-1,r=1-2*n.y/l;return t-=y[12],r-=y[13],y[12]+=t*(1-e),y[13]+=r*(1-e),y[0]*=e,y[5]*=e,j(),I(this),y[0]},resetScale:function(){return A(),r&&(_(),j()),this},updateSize:_,init:function(o){var i={};if(e.preserveDrawingBuffer&&(i.preserveDrawingBuffer=!0),n=o,_(),A(),n.appendChild(t),r=t.getContext("experimental-webgl",i),!r){var a="Could not initialize WebGL. Seems like the browser doesn't support it.";throw window.alert(a),a}if(e.enableBlending&&(r.blendFunc(r.SRC_ALPHA,r.ONE_MINUS_SRC_ALPHA),r.enable(r.BLEND)),e.clearColor){var u=e.clearColorValue;r.clearColor(u.r,u.g,u.b,u.a),this.beginRender=function(){r.clear(r.COLOR_BUFFER_BIT)}}L.load(r),L.updateSize(d/2,l/2),N.load(r),N.updateSize(d/2,l/2),j(),"function"==typeof g&&g(t)},release:function(e){t&&e&&e.removeChild(t)},isSupported:function(){var e=window.document.createElement("canvas"),n=e&&e.getContext&&e.getContext("experimental-webgl");return n},releaseLink:function(e){m>0&&(m-=1);var n=E[e.id];delete E[e.id],L.removeLink(n);var t=n.id;if(t0&&(h-=1);var n=b[e.id];delete b[e.id],N.removeNode(n);var t=n.id;if(te.length){var r=new Float32Array(e.length*t*2);return r.set(e),r}return e}function a(n,t){for(var r={},o=0;o=w.length&&s();var i=w[r.textureNumber];i.ctx.drawImage(n,r.col*h,r.row*h,h,h),b[e]=n.src,y[n.src]=o,i.isDirty=!0,t(o)}function c(n){var t=n/e<<0,r=n%e,o=r/g<<0,i=r%g;return{textureNumber:t,row:o,col:i}}function d(){E.isDirty=!0,x=0,v=null}function l(){v&&(window.clearTimeout(v),x+=1,v=null),x>10?d():v=window.setTimeout(d,400)}function p(e,n){var t=w[e.textureNumber].canvas,r=w[n.textureNumber].ctx,o=n.col*h,i=n.row*h;r.drawImage(t,e.col*h,e.row*h,h,h,o,i,h,h),w[e.textureNumber].isDirty=!0,w[n.textureNumber].isDirty=!0}var v,g=Math.sqrt(e||1024)<<0,h=g,m=1,y={},x=0,w=[],b=[];if(!o(e))throw"Tiles per texture should be power of two.";var E={isDirty:!1,clearDirty:n,remove:t,getTextures:r,getCoordinates:a,load:u};return E}function o(e){return 0===(e&e-1)}var i=e("./texture.js");n.exports=r},{"./texture.js":52}],55:[function(e,n,t){function r(e,n){return{_texture:0,_offset:0,size:"number"==typeof e?e:32,src:n}}n.exports=r},{}],56:[function(e,n,t){function r(){function e(e,n){e.nativeObject&&h.deleteTexture(e.nativeObject);var t=h.createTexture();h.activeTexture(h["TEXTURE"+n]),h.bindTexture(h.TEXTURE_2D,t),h.texImage2D(h.TEXTURE_2D,0,h.RGBA,h.RGBA,h.UNSIGNED_BYTE,e.canvas),h.texParameteri(h.TEXTURE_2D,h.TEXTURE_MAG_FILTER,h.LINEAR),h.texParameteri(h.TEXTURE_2D,h.TEXTURE_MIN_FILTER,h.LINEAR_MIPMAP_NEAREST),h.generateMipmap(h.TEXTURE_2D),h.uniform1i(x["sampler"+n],n),e.nativeObject=t}function n(){if(v.isDirty){var n,t=v.getTextures();for(n=0;n0&&(A-=1),e.id0&&(e.src&&v.remove(e.src),y.copyArrayPart(_,e.id*N,A*N,N))}function c(e,n){n._offset=e._offset}function d(e){L=!0,E=e}function l(e,n){w=e,b=n,L=!0}function p(){h.useProgram(g),h.bindBuffer(h.ARRAY_BUFFER,m),h.bufferData(h.ARRAY_BUFFER,_,h.DYNAMIC_DRAW),L&&(L=!1,h.uniformMatrix4fv(x.transform,!1,E),h.uniform2f(x.screenSize,w,b)),h.vertexAttribPointer(x.vertexPos,2,h.FLOAT,!1,3*Float32Array.BYTES_PER_ELEMENT,0),h.vertexAttribPointer(x.customAttributes,1,h.FLOAT,!1,3*Float32Array.BYTES_PER_ELEMENT,8),n(),h.drawArrays(h.TRIANGLES,0,6*A)}var v,g,h,m,y,x,w,b,E,L,N=18,P=o(),k=i(),j=1024,A=0,_=new Float32Array(64);return{load:t,position:r,createNode:s,removeNode:f,replaceProperties:c,updateTransform:d,updateSize:l,render:p}}function o(){return["precision mediump float;","varying vec4 color;","varying vec3 vTextureCoord;","uniform sampler2D u_sampler0;","uniform sampler2D u_sampler1;","uniform sampler2D u_sampler2;","uniform sampler2D u_sampler3;","void main(void) {"," if (vTextureCoord.z == 0.) {"," gl_FragColor = texture2D(u_sampler0, vTextureCoord.xy);"," } else if (vTextureCoord.z == 1.) {"," gl_FragColor = texture2D(u_sampler1, vTextureCoord.xy);"," } else if (vTextureCoord.z == 2.) {"," gl_FragColor = texture2D(u_sampler2, vTextureCoord.xy);"," } else if (vTextureCoord.z == 3.) {"," gl_FragColor = texture2D(u_sampler3, vTextureCoord.xy);"," } else { gl_FragColor = vec4(0, 1, 0, 1); }","}"].join("\n")}function i(){return["attribute vec2 a_vertexPos;","attribute float a_customAttributes;","uniform vec2 u_screenSize;","uniform mat4 u_transform;","uniform float u_tilesPerTexture;","varying vec3 vTextureCoord;","void main(void) {"," gl_Position = u_transform * vec4(a_vertexPos/u_screenSize, 0, 1);","float corner = mod(a_customAttributes, 4.);","float tileIndex = mod(floor(a_customAttributes / 4.), u_tilesPerTexture);","float tilesPerRow = sqrt(u_tilesPerTexture);","float tileSize = 1./tilesPerRow;","float tileColumn = mod(tileIndex, tilesPerRow);","float tileRow = floor(tileIndex/tilesPerRow);","if(corner == 0.0) {"," vTextureCoord.xy = vec2(0, 1);","} else if(corner == 1.0) {"," vTextureCoord.xy = vec2(1, 1);","} else if(corner == 2.0) {"," vTextureCoord.xy = vec2(0, 0);","} else {"," vTextureCoord.xy = vec2(1, 0);","}","vTextureCoord *= tileSize;","vTextureCoord.x += tileColumn * tileSize;","vTextureCoord.y += tileRow * tileSize;","vTextureCoord.z = floor(floor(a_customAttributes / 4.)/u_tilesPerTexture);","}"].join("\n")}var a=e("./webglAtlas.js"),u=e("./webgl.js");n.exports=r},{"./webgl.js":53,"./webglAtlas.js":54}],57:[function(e,n,t){function r(e){function n(){x=null}function t(e){x=e}function r(e){return"function"==typeof e&&k.push(e),A}function i(e){return"function"==typeof e&&P.push(e),A}function a(e){return"function"==typeof e&&N.push(e),A}function u(e){return"function"==typeof e&&L.push(e),A}function s(e){return"function"==typeof e&&E.push(e),A}function f(e){return"function"==typeof e&&b.push(e),A}function c(e){return"function"==typeof e&&w.push(e),A}function d(e,n,t){if(e&&e.size){var r=e.position,o=e.size;return r.x-oh.byteLength){var e=new ArrayBuffer(2*h.byteLength),n=new Float32Array(e),t=new Uint32Array(e);t.set(y),m=n,y=t,h=e}};return{load:function(a){n=a,r=o(a),e=r.createProgram(v,p),n.useProgram(e),i=r.getLocations(e,["a_vertexPos","a_color","u_screenSize","u_transform"]),n.enableVertexAttribArray(i.vertexPos),n.enableVertexAttribArray(i.color),t=n.createBuffer()},position:function(e,n,t){var r=e.id,o=r*d;m[o]=n.x,m[o+1]=n.y,y[o+2]=e.color,m[o+3]=t.x,m[o+4]=t.y,y[o+5]=e.color},createLink:function(e){x(),g+=1,a=e.id},removeLink:function(e){g>0&&(g-=1),e.id0&&r.copyArrayPart(y,e.id*d,g*d,d)},updateTransform:function(e){c=!0,f=e},updateSize:function(e,n){u=e,s=n,c=!0},render:function(){n.useProgram(e),n.bindBuffer(n.ARRAY_BUFFER,t),n.bufferData(n.ARRAY_BUFFER,h,n.DYNAMIC_DRAW),c&&(c=!1,n.uniformMatrix4fv(i.transform,!1,f),n.uniform2f(i.screenSize,u,s)),n.vertexAttribPointer(i.vertexPos,2,n.FLOAT,!1,3*Float32Array.BYTES_PER_ELEMENT,0),n.vertexAttribPointer(i.color,4,n.UNSIGNED_BYTE,!0,3*Float32Array.BYTES_PER_ELEMENT,8),n.drawArrays(n.LINES,0,2*g),a=g-1},bringToFront:function(e){a>e.id&&r.swapArrayPart(m,e.id*d,a*d,d),a>0&&(a-=1)},getFrontLinkId:function(){return a}}}var o=e("./webgl.js");n.exports=r},{"./webgl.js":53}],60:[function(e,n,t){function r(){function e(){if((k+1)*w>=L.byteLength){var e=new ArrayBuffer(2*L.byteLength),n=new Float32Array(e),t=new Uint32Array(e);t.set(P),N=n,P=t,L=e}}function n(e){d=e,v=o(e),c=v.createProgram(E,b),d.useProgram(c),p=v.getLocations(c,["a_vertexPos","a_color","u_screenSize","u_transform"]),d.enableVertexAttribArray(p.vertexPos),d.enableVertexAttribArray(p.color),l=d.createBuffer()}function t(e,n){var t=e.id;N[t*x]=n.x,N[t*x+1]=-n.y,N[t*x+2]=e.size,P[t*x+3]=e.color}function r(e){y=!0,m=e}function i(e,n){g=e,h=n,y=!0}function a(e){k>0&&(k-=1),e.id0&&v.copyArrayPart(P,e.id*x,k*x,x)}function u(){e(),k+=1}function s(){}function f(){d.useProgram(c),d.bindBuffer(d.ARRAY_BUFFER,l),d.bufferData(d.ARRAY_BUFFER,L,d.DYNAMIC_DRAW),y&&(y=!1,d.uniformMatrix4fv(p.transform,!1,m),d.uniform2f(p.screenSize,g,h)),d.vertexAttribPointer(p.vertexPos,3,d.FLOAT,!1,x*Float32Array.BYTES_PER_ELEMENT,0),d.vertexAttribPointer(p.color,4,d.UNSIGNED_BYTE,!0,x*Float32Array.BYTES_PER_ELEMENT,12),d.drawArrays(d.POINTS,0,k)}var c,d,l,p,v,g,h,m,y,x=4,w=3*Float32Array.BYTES_PER_ELEMENT+Uint32Array.BYTES_PER_ELEMENT,b=["precision mediump float;","varying vec4 color;","void main(void) {"," gl_FragColor = color;","}"].join("\n"),E=["attribute vec3 a_vertexPos;","attribute vec4 a_color;","uniform vec2 u_screenSize;","uniform mat4 u_transform;","varying vec4 color;","void main(void) {"," gl_Position = u_transform * vec4(a_vertexPos.xy/u_screenSize, 0, 1);"," gl_PointSize = a_vertexPos.z * u_transform[0][0];"," color = a_color.abgr;","}"].join("\n"),L=new ArrayBuffer(16*w),N=new Float32Array(L),P=new Uint32Array(L),k=0;return{load:n,position:t,updateTransform:r,updateSize:i,removeNode:a,createNode:u,replaceProperties:s,render:f}}var o=e("./webgl.js");n.exports=r},{"./webgl.js":53}],61:[function(e,n,t){function r(e,n){return{size:"number"==typeof e?e:10,color:o(n)}}var o=e("./parseColor.js");n.exports=r},{"./parseColor.js":51}],62:[function(e,n,t){n.exports="0.8.1"},{}]},{},[1])(1)}); \ No newline at end of file +!function(e){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=e();else if("function"==typeof define&&define.amd)define([],e);else{var n;"undefined"!=typeof window?n=window:"undefined"!=typeof global?n=global:"undefined"!=typeof self&&(n=self),n.Viva=e()}}(function(){return function e(n,t,r){function o(a,u){if(!t[a]){if(!n[a]){var s="function"==typeof require&&require;if(!u&&s)return s(a,!0);if(i)return i(a,!0);var f=new Error("Cannot find module '"+a+"'");throw f.code="MODULE_NOT_FOUND",f}var c=t[a]={exports:{}};n[a][0].call(c.exports,function(e){var t=n[a][1][e];return o(t?t:e)},c,c.exports,e,n,t,r)}return t[a].exports}for(var i="function"==typeof require&&require,a=0;a=0==m>=4?null:(f=u-i,d=o-a,p=a*i-o*u,v=f*e+d*n+p,h=f*t+d*r+p,0!==v&&0!==h&&v>=0==h>=0?null:(y=s*d-f*c,0===y?null:(x=y<0?-y/2:y/2,x=0,w=c*p-d*l,b.x=(w<0?w-x:w+x)/y,w=f*l-s*p,b.y=(w<0?w-x:w+x)/y,b)))}n.exports=r},{}],4:[function(e,n,t){n.exports.degree=e("./src/degree.js"),n.exports.betweenness=e("./src/betweenness.js"),n.exports.closeness=e("./src/closeness.js"),n.exports.eccentricity=e("./src/eccentricity.js")},{"./src/betweenness.js":5,"./src/closeness.js":6,"./src/degree.js":7,"./src/eccentricity.js":8}],5:[function(e,n,t){function r(e,n){function t(e){h[e]/=2}function r(e){h[e.id]=0}function o(e){s=e.id,u(s),i()}function i(){for(e.forEachNode(a);c.length;){for(var n=c.pop(),t=(1+v[n])/p[n],r=d[n],o=0;o0?f[a]=(n-1)/t:f[a]=0}function i(t){function r(e){var n=e.id;s[n]=-1}function o(e){var n=e.id;s[n]===-1&&(s[n]=s[i]+1,u.push(n))}for(e.forEachNode(r),s[t]=0,u.push(t);u.length;){var i=u.shift();e.forEachLinkedNode(i,o,n)}}var a,u=[],s=Object.create(null),f=Object.create(null);return e.forEachNode(t),e.forEachNode(r),f}n.exports=r},{}],7:[function(e,n,t){function r(e,n){function t(n){var t=e.getLinks(n.id);u[n.id]=r(t,n.id)}var r,u=Object.create(null);if(n=(n||"both").toLowerCase(),"both"===n||"inout"===n)r=a;else if("in"===n)r=o;else{if("out"!==n)throw new Error("Expected centrality degree kind is: in, out or both");r=i}return e.forEachNode(t),u}function o(e,n){var t=0;if(!e)return t;for(var r=0;r1&&(o=Array.prototype.splice.call(arguments,1));for(var i=0;i0&&i.addLink(a,r-1+o*e),o>0&&i.addLink(a,r+(o-1)*e)}return i}function s(e,t,r){if(e<1||t<1||r<1)throw new Error("Invalid number of nodes in grid3 graph");var o,i,a,u=n();if(1===e&&1===t&&1===r)return u.addNode(0),u;for(a=0;a0&&u.addLink(f,o-1+i*e+s),i>0&&u.addLink(f,o+(i-1)*e+s),a>0&&u.addLink(f,o+i*e+(a-1)*e*t)}return u}function f(e){if(e<0)throw new Error("Invalid number of nodes in balanced tree");var t,r=n(),o=Math.pow(2,e);for(0===e&&r.addNode(1),t=1;t= 0");var t,r=n();for(t=0;t0&&o.addLink(i*t,i*t-1);return o.addLink(0,o.getNodesCount()-1),o}function l(t,r,o,i){if(r>=t)throw new Error("Choose smaller `k`. It cannot be larger than number of nodes `n`");var a,u,s=e("ngraph.random").random(i||42),f=n();for(a=0;a=1||0===e);return n*Math.sqrt(-2*Math.log(e)/e)}function a(){var e=this.seed;return e=e+2127912214+(e<<12)&4294967295,e=4294967295&(3345072700^e^e>>>19),e=e+374761393+(e<<5)&4294967295,e=4294967295&(e+3550635116^e<<9),e=e+4251993797+(e<<3)&4294967295,e=4294967295&(3042594569^e^e>>>16),this.seed=e,(268435455&e)/268435456}function u(e){return Math.floor(this.nextDouble()*e)}function s(e,n){function t(){var n,t,r;for(n=e.length-1;n>0;--n)t=i.next(n+1),r=e[t],e[t]=e[n],e[n]=r;return e}function o(n){var t,r,o;for(t=e.length-1;t>0;--t)r=i.next(t+1),o=e[r],e[r]=e[t],e[t]=o,n(o);e.length&&n(e[0])}var i=n||r();if("function"!=typeof i.next)throw new Error("customRandom does not match expected API: next() function is missing");return{forEach:o,shuffle:t}}n.exports=r,n.exports.random=r,n.exports.randomIterator=s,o.prototype.next=u,o.prototype.nextDouble=a,o.prototype.uniform=a,o.prototype.gaussian=i},{}],16:[function(e,n,t){function r(e){function n(){function e(){return q.beginUpdate=F=k,q.endUpdate=G=P,B=t,O=r,q.on=n,n.apply(q,arguments)}var n=q.on;q.on=e}function t(e,n){R.push({link:e,changeType:n})}function r(e,n){R.push({node:e,changeType:n})}function c(e,n){if(void 0===e)throw new Error("Invalid node identifier");F();var t=d(e);return t?(t.data=n,O(t,"update")):(t=new i(e,n),S++,O(t,"add")),I[e]=t,G(),t}function d(e){return I[e]}function l(e){var n=d(e);if(!n)return!1;F();var t=n.links;if(t){n.links=null;for(var r=0;r=0&&t.links.splice(n,1)),r&&(n=o(e,r.links),n>=0&&r.links.splice(n,1)),B(e,"remove"),G(),!0}function y(e,n){var t,r=d(e);if(!r||!r.links)return null;for(t=0;t0&&(q.fire("changed",R),R.length=0)}function j(){return Object.keys?A:_}function A(e){if("function"==typeof e)for(var n=Object.keys(I),t=0;t=0?i:-1,o);return v.push(a),a},getTotalMovement:function(){return w},removeSpring:function(e){if(e){var n=v.indexOf(e);return n>-1?(v.splice(n,1),!0):void 0}},getBestNewBodyPosition:function(e){return g.getBestNewPosition(e)},getBBox:function(){return x&&(g.update(),x=!1),g.box},invalidateBBox:function(){x=!0},gravity:function(e){return void 0!==e?(n.gravity=e,h.options({gravity:e}),this):n.gravity},theta:function(e){return void 0!==e?(n.theta=e,h.options({theta:e}),this):n.theta}};return o(n,b),a(b),b}n.exports=r},{"./lib/bounds":20,"./lib/createBody":21,"./lib/dragForce":22,"./lib/eulerIntegrator":23,"./lib/spring":24,"./lib/springForce":25,"ngraph.events":9,"ngraph.expose":10,"ngraph.merge":17,"ngraph.quadtreebh":26}],20:[function(e,n,t){n.exports=function(n,t){function r(){var e=n.length;if(0!==e){for(var t=Number.MAX_VALUE,r=Number.MAX_VALUE,o=Number.MIN_VALUE,a=Number.MIN_VALUE;e--;){var u=n[e];u.isPinned?(u.pos.x=u.prevPos.x,u.pos.y=u.prevPos.y):(u.prevPos.x=u.pos.x,u.prevPos.y=u.pos.y),u.pos.xo&&(o=u.pos.x),u.pos.ya&&(a=u.pos.y)}i.x1=t,i.x2=o,i.y1=r,i.y2=a}}var o=e("ngraph.random").random(42),i={x1:0,y1:0,x2:0,y2:0};return{box:i,update:r,reset:function(){i.x1=i.y1=0,i.x2=i.y2=0},getBestNewPosition:function(e){var n=i,r=0,a=0;if(e.length){for(var u=0;u1&&(s.velocity.x=c/l,s.velocity.y=d/l),r=n*s.velocity.x,i=n*s.velocity.y,s.pos.x+=r,s.pos.y+=i,o+=Math.abs(r),a+=Math.abs(i)}return(o*o+a*a)/u}n.exports=r},{}],24:[function(e,n,t){function r(e,n,t,r,o){this.from=e,this.to=n,this.length=t,this.coeff=r,this.weight="number"==typeof o?o:1}n.exports=r},{}],25:[function(e,n,t){n.exports=function(n){var t=e("ngraph.merge"),r=e("ngraph.random").random(42),o=e("ngraph.expose");n=t(n,{springCoeff:2e-4,springLength:80});var i={update:function(e){var t=e.from,o=e.to,i=e.length<0?n.springLength:e.length,a=o.pos.x-t.pos.x,u=o.pos.y-t.pos.y,s=Math.sqrt(a*a+u*u);0===s&&(a=(r.nextDouble()-.5)/50,u=(r.nextDouble()-.5)/50,s=Math.sqrt(a*a+u*u));var f=s-i,c=(!e.coeff||e.coeff<0?n.springCoeff:e.coeff)*f/s*e.weight;t.force.x+=c*a,t.force.y+=c*u,o.force.x-=c*a,o.force.y-=c*u}};return o(n,i,["springCoeff","springLength"]),i}},{"ngraph.expose":10,"ngraph.merge":17,"ngraph.random":30}],26:[function(e,n,t){function r(e,n){return 0===n?e.quad0:1===n?e.quad1:2===n?e.quad2:3===n?e.quad3:null}function o(e,n,t){0===n?e.quad0=t:1===n?e.quad1=t:2===n?e.quad2=t:3===n&&(e.quad3=t)}n.exports=function(n){function t(){var e=g[m];return e?(e.quad0=null,e.quad1=null,e.quad2=null,e.quad3=null,e.body=null,e.mass=e.massX=e.massY=0,e.left=e.right=e.top=e.bottom=0):(e=new f,g[m]=e),++m,e}function i(e){var n,t,r,o,i=p,a=0,u=0,f=1,c=0,d=1;for(i[0]=y;f;){var v=i[c],g=v.body;f-=1,c+=1;var m=g!==e;g&&m?(t=g.pos.x-e.pos.x,r=g.pos.y-e.pos.y,o=Math.sqrt(t*t+r*r),0===o&&(t=(s.nextDouble()-.5)/50,r=(s.nextDouble()-.5)/50,o=Math.sqrt(t*t+r*r)),n=l*g.mass*e.mass/(o*o*o),a+=n*t,u+=n*r):m&&(t=v.massX/v.mass-e.pos.x,r=v.massY/v.mass-e.pos.y,o=Math.sqrt(t*t+r*r),0===o&&(t=(s.nextDouble()-.5)/50,r=(s.nextDouble()-.5)/50,o=Math.sqrt(t*t+r*r)),(v.right-v.left)/oi&&(i=f),ca&&(a=c)}var d=i-r,l=a-o;for(d>l?a=o+d:i=r+l,m=0,y=t(),y.left=r,y.right=i,y.top=o,y.bottom=a,n=s-1,n>=0&&(y.body=e[n]);n--;)u(e[n],y)}function u(e){for(v.reset(),v.push(y,e);!v.isEmpty();){var n=v.pop(),i=n.node,a=n.body;if(i.body){var u=i.body;if(i.body=null,d(u.pos,a.pos)){var f=3;do{var c=s.nextDouble(),l=(i.right-i.left)*c,p=(i.bottom-i.top)*c;u.pos.x=i.left+l,u.pos.y=i.top+p,f-=1}while(f>0&&d(u.pos,a.pos));if(0===f&&d(u.pos,a.pos))return}v.push(i,u),v.push(i,a)}else{var h=a.pos.x,g=a.pos.y;i.mass=i.mass+a.mass,i.massX=i.massX+a.mass*h,i.massY=i.massY+a.mass*g;var m=0,x=i.left,w=(i.right+x)/2,b=i.top,E=(i.bottom+b)/2;h>w&&(m+=1,x=w,w=i.right),g>E&&(m+=2,b=E,E=i.bottom);var L=r(i,m);L?v.push(L,a):(L=t(),L.left=x,L.top=b,L.right=w,L.bottom=E,L.body=a,o(i,m,L))}}}n=n||{},n.gravity="number"==typeof n.gravity?n.gravity:-1,n.theta="number"==typeof n.theta?n.theta:.8;var s=e("ngraph.random").random(1984),f=e("./node"),c=e("./insertStack"),d=e("./isSamePosition"),l=n.gravity,p=[],v=new c,h=n.theta,g=[],m=0,y=t();return{insertBodies:a,getRoot:function(){return y},updateBodyForce:i,options:function(e){return e?("number"==typeof e.gravity&&(l=e.gravity),"number"==typeof e.theta&&(h=e.theta),this):{gravity:l,theta:h}}}}},{"./insertStack":27,"./isSamePosition":28,"./node":29,"ngraph.random":30}],27:[function(e,n,t){function r(){this.stack=[],this.popIdx=0}function o(e,n){this.node=e,this.body=n}n.exports=r,r.prototype={isEmpty:function(){return 0===this.popIdx},push:function(e,n){var t=this.stack[this.popIdx];t?(t.node=e,t.body=n):this.stack[this.popIdx]=new o(e,n),++this.popIdx},pop:function(){if(this.popIdx>0)return this.stack[--this.popIdx]},reset:function(){this.popIdx=0}}},{}],28:[function(e,n,t){n.exports=function(e,n){var t=Math.abs(e.x-n.x),r=Math.abs(e.y-n.y);return t<1e-8&&r<1e-8}},{}],29:[function(e,n,t){n.exports=function(){this.body=null,this.quad0=null,this.quad1=null,this.quad2=null,this.quad3=null,this.mass=0,this.massX=0,this.massY=0,this.left=0,this.top=0,this.bottom=0,this.right=0}},{}],30:[function(e,n,t){function r(e){var n="number"==typeof e?e:+new Date,t=function(){return n=n+2127912214+(n<<12)&4294967295,n=4294967295&(3345072700^n^n>>>19),n=n+374761393+(n<<5)&4294967295,n=4294967295&(n+3550635116^n<<9),n=n+4251993797+(n<<3)&4294967295,n=4294967295&(3042594569^n^n>>>16),(268435455&n)/268435456};return{next:function(e){return Math.floor(t()*e)},nextDouble:function(){return t()}}}function o(e,n){var t=n||r();if("function"!=typeof t.next)throw new Error("customRandom does not match expected API: next() function is missing");return{forEach:function(n){var r,o,i;for(r=e.length-1;r>0;--r)o=t.next(r+1),i=e[o],e[o]=e[r],e[r]=i,n(i);e.length&&n(e[0])},shuffle:function(){var n,r,o;for(n=e.length-1;n>0;--n)r=t.next(n+1),o=e[r],e[r]=e[n],e[n]=o;return e}}}n.exports={random:r,randomIterator:o}},{}],31:[function(e,n,t){function r(e,n,t){function r(e){u.nodes.push(s(e))}function o(e){u.links.push(f(e))}function i(e){var n={id:e.id};return void 0!==e.data&&(n.data=e.data),n}function a(e){var n={fromId:e.fromId,toId:e.toId};return void 0!==e.data&&(n.data=e.data),n}var u={nodes:[],links:[]},s=n||i,f=t||a;return e.forEachNode(r),e.forEachLink(o),JSON.stringify(u)}n.exports=r},{}],32:[function(e,n,t){function r(e,n){var t=o(e);if(void 0===n)return t;for(var r=Object.keys(n),i=0;iv&&(r=1),u(e,r,{x:e.touches[0].clientX,y:e.touches[0].clientY}),v=t,m(e),y(e)}},j=function(e){p=!1,o.off("touchmove",P),o.off("touchend",j),o.off("touchcancel",j),c=null,r&&r(e)},A=function(e,t){m(e),y(e),d=t.clientX,l=t.clientY,c=e.target||e.srcElement,n&&n(e,{x:d,y:l}),p||(p=!0,o.on("touchmove",P),o.on("touchend",j),o.on("touchcancel",j))},_=function(e){return 1===e.touches.length?A(e,e.touches[0]):void(2===e.touches.length&&(m(e),y(e),v=k(e.touches[0],e.touches[1])))};return e.addEventListener("mousedown",b),e.addEventListener("touchstart",_),{onStart:function(e){return n=e,this},onDrag:function(e){return t=e,this},onStop:function(e){return r=e,this},onScroll:function(e){return N(e),this},release:function(){e.removeEventListener("mousedown",b),e.removeEventListener("touchstart",_),o.off("mousemove",w),o.off("mouseup",E),o.off("touchmove",P),o.off("touchend",j),o.off("touchcancel",j),N(null)}}}n.exports=r;var o=e("../Utils/documentEvents.js"),i=e("../Utils/browserInfo.js"),a=e("../Utils/findElementPosition.js")},{"../Utils/browserInfo.js":43,"../Utils/documentEvents.js":44,"../Utils/findElementPosition.js":45}],40:[function(e,n,t){function r(e,n){var t=o(n),r=null,i={},a={x:0,y:0};return t.mouseDown(function(e,n){r=e,a.x=n.clientX,a.y=n.clientY,t.mouseCapture(r);var o=i[e.id];return o&&o.onStart&&o.onStart(n,a),!0}).mouseUp(function(e){t.releaseMouseCapture(r),r=null;var n=i[e.id];return n&&n.onStop&&n.onStop(),!0}).mouseMove(function(e,n){if(r){var t=i[r.id];return t&&t.onDrag&&t.onDrag(n,{x:n.clientX-a.x,y:n.clientY-a.y}),a.x=n.clientX,a.y=n.clientY,!0}}),{bindDragNDrop:function(e,n){i[e.id]=n,n||delete i[e.id]}}}n.exports=r;var o=e("../WebGL/webglInputEvents.js")},{"../WebGL/webglInputEvents.js":61}],41:[function(e,n,t){function r(e,n){function t(e){return d[e]}n=o(n,{maxX:1024,maxY:1024,seed:"Deterministic randomness made me do this"});var r=i(n.seed),u=new a(Number.MAX_VALUE,Number.MAX_VALUE,Number.MIN_VALUE,Number.MIN_VALUE),s={},f=function(e){return{x:r.next(n.maxX),y:r.next(n.maxY)}},c=function(e,n){e.xn.x2&&(n.x2=e.x),e.yn.y2&&(n.y2=e.y)},d="function"==typeof Object.create?Object.create(null):{},l=function(e){d[e.id]=f(e),c(d[e.id],u)},p=function(){0!==e.getNodesCount()&&(u.x1=Number.MAX_VALUE,u.y1=Number.MAX_VALUE,u.x2=Number.MIN_VALUE,u.y2=Number.MIN_VALUE,e.forEachNode(l))},v=function(e){s[e.id]=e},h=function(e){for(var n=0;n=0:"boolean"!=typeof q||q}function r(){G=G||window.document.body,O=O||i(e,{springLength:80,springCoeff:2e-4}),F=F||a(e,{container:G}),n.hasOwnProperty("renderLinks")||(n.renderLinks=!0),n.prerender=n.prerender||0,U=(F.inputManager||s)(e,F)}function l(){F.beginRender(),n.renderLinks&&F.renderLinks(),F.renderNodes(),F.endRender()}function p(){return X=O.step()&&!V,l(),!X}function v(e){R||(R=void 0!==e?f(function(){if(e-=1,e<0){var n=!1;return n}return p()},M):f(p,M))}function h(){W||(X=!1,R.restart())}function g(){if("number"==typeof n.prerender&&n.prerender>0)for(var e=0;e0?n.insertBefore(r,n.firstChild):n.appendChild(r),r},releaseLink:function(e){var t=d[e.id];t&&(n.removeChild(t),delete d[e.id])},addNode:function(e,t){var r=l(e);if(r)return r.position=t,r.node=e,c[e.id]=r,n.appendChild(r),r},releaseNode:function(e){var t=c[e.id];t&&(n.removeChild(t),delete c[e.id])},renderNodes:function(){for(var e in c)if(c.hasOwnProperty(e)){var n=c[e];m.x=n.position.x,m.y=n.position.y,p(n,m,n.node)}},renderLinks:function(){for(var e in d)if(d.hasOwnProperty(e)){var n=d[e];y.x=n.position.from.x,y.y=n.position.from.y,x.x=n.position.to.x,x.y=n.position.to.y,h(n,y,x,n.link)}},getGraphicsRoot:function(e){return"function"==typeof e&&(t?e(t):r=e),t},getSvgRoot:function(){return t}};return i(b),b}n.exports=r;var o=e("simplesvg"),i=e("ngraph.events"),a=e("../Input/domInputManager.js")},{"../Input/domInputManager.js":38,"ngraph.events":9,simplesvg:32}],54:[function(e,n,t){function r(e){e=c(e,{enableBlending:!0,preserveDrawingBuffer:!1,clearColor:!1,clearColorValue:{r:1,g:1,b:1,a:1}});var n,t,r,d,l,p,v,h,g=0,m=0,y=[1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1],x=[],w=[],b={},E={},L=i(),N=a(),k=function(e){return u()},P=function(e){return s(3014898687)},j=function(){L.updateTransform(y),N.updateTransform(y)},A=function(){y=[1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1]},_=function(){n&&t&&(d=t.width=Math.max(n.offsetWidth,1),l=t.height=Math.max(n.offsetHeight,1),r&&r.viewport(0,0,d,l),L&&L.updateSize(d/2,l/2),N&&N.updateSize(d/2,l/2))},I=function(e){e.fire("rescaled")};t=window.document.createElement("canvas");var T={getLinkUI:function(e){return E[e]},getNodeUI:function(e){return b[e]},node:function(e){if("function"==typeof e)return k=e,this},link:function(e){if("function"==typeof e)return P=e,this},placeNode:function(e){return p=e,this},placeLink:function(e){return v=e,this},inputManager:o,beginRender:function(){},endRender:function(){m>0&&L.render(),g>0&&N.render()},bringLinkToFront:function(e){var n,t,r=L.getFrontLinkId();L.bringToFront(e),r>e.id&&(n=e.id,t=w[r],w[r]=w[n],w[r].id=r,w[n]=t,w[n].id=n)},graphCenterChanged:function(e,n){y[12]=2*e/d-1,y[13]=1-2*n/l,j()},addLink:function(e,n){var t=m++,r=P(e);return r.id=t,r.pos=n,L.createLink(r),w[t]=r,E[e.id]=r,r},addNode:function(e,n){var t=g++,r=k(e);return r.id=t,r.position=n,r.node=e,N.createNode(r),x[t]=r,b[e.id]=r,r},translateRel:function(e,n){y[12]+=2*y[0]*e/d/y[0],y[13]-=2*y[5]*n/l/y[5],j()},scale:function(e,n){var t=2*n.x/d-1,r=1-2*n.y/l;return t-=y[12],r-=y[13],y[12]+=t*(1-e),y[13]+=r*(1-e),y[0]*=e,y[5]*=e,j(),I(this),y[0]},resetScale:function(){return A(),r&&(_(),j()),this},updateSize:_,init:function(o){var i={};if(e.preserveDrawingBuffer&&(i.preserveDrawingBuffer=!0),n=o,_(),A(),n.appendChild(t),r=t.getContext("experimental-webgl",i),!r){var a="Could not initialize WebGL. Seems like the browser doesn't support it.";throw window.alert(a),a}if(e.enableBlending&&(r.blendFunc(r.SRC_ALPHA,r.ONE_MINUS_SRC_ALPHA),r.enable(r.BLEND)),e.clearColor){var u=e.clearColorValue;r.clearColor(u.r,u.g,u.b,u.a),this.beginRender=function(){r.clear(r.COLOR_BUFFER_BIT)}}L.load(r),L.updateSize(d/2,l/2),N.load(r),N.updateSize(d/2,l/2),j(),"function"==typeof h&&h(t)},release:function(e){t&&e&&e.removeChild(t)},isSupported:function(){var e=window.document.createElement("canvas"),n=e&&e.getContext&&e.getContext("experimental-webgl");return n},releaseLink:function(e){m>0&&(m-=1);var n=E[e.id];delete E[e.id],L.removeLink(n);var t=n.id;if(t0&&(g-=1);var n=b[e.id];delete b[e.id],N.removeNode(n);var t=n.id;if(te.length){var r=new Float32Array(e.length*t*2);return r.set(e),r}return e}function a(n,t){for(var r={},o=0;o=w.length&&s();var i=w[r.textureNumber];i.ctx.drawImage(n,r.col*g,r.row*g,g,g),b[e]=n.src,y[n.src]=o,i.isDirty=!0,t(o)}function c(n){var t=n/e<<0,r=n%e,o=r/h<<0,i=r%h;return{textureNumber:t,row:o,col:i}}function d(){E.isDirty=!0,x=0,v=null}function l(){v&&(window.clearTimeout(v),x+=1,v=null),x>10?d():v=window.setTimeout(d,400)}function p(e,n){var t=w[e.textureNumber].canvas,r=w[n.textureNumber].ctx,o=n.col*g,i=n.row*g;r.drawImage(t,e.col*g,e.row*g,g,g,o,i,g,g),w[e.textureNumber].isDirty=!0,w[n.textureNumber].isDirty=!0}var v,h=Math.sqrt(e||1024)<<0,g=h,m=1,y={},x=0,w=[],b=[];if(!o(e))throw"Tiles per texture should be power of two.";var E={isDirty:!1,clearDirty:n,remove:t,getTextures:r,getCoordinates:a,load:u};return E}function o(e){return 0===(e&e-1)}var i=e("./texture.js");n.exports=r},{"./texture.js":56}],59:[function(e,n,t){function r(e,n){return{_texture:0,_offset:0,size:"number"==typeof e?e:32,src:n}}n.exports=r},{}],60:[function(e,n,t){function r(){function e(e,n){e.nativeObject&&g.deleteTexture(e.nativeObject);var t=g.createTexture();g.activeTexture(g["TEXTURE"+n]),g.bindTexture(g.TEXTURE_2D,t),g.texImage2D(g.TEXTURE_2D,0,g.RGBA,g.RGBA,g.UNSIGNED_BYTE,e.canvas),g.texParameteri(g.TEXTURE_2D,g.TEXTURE_MAG_FILTER,g.LINEAR),g.texParameteri(g.TEXTURE_2D,g.TEXTURE_MIN_FILTER,g.LINEAR_MIPMAP_NEAREST),g.generateMipmap(g.TEXTURE_2D),g.uniform1i(x["sampler"+n],n),e.nativeObject=t}function n(){if(v.isDirty){var n,t=v.getTextures();for(n=0;n0&&(A-=1),e.id0&&(e.src&&v.remove(e.src),y.copyArrayPart(_,e.id*N,A*N,N))}function c(e,n){n._offset=e._offset}function d(e){L=!0,E=e}function l(e,n){w=e,b=n,L=!0}function p(){g.useProgram(h),g.bindBuffer(g.ARRAY_BUFFER,m),g.bufferData(g.ARRAY_BUFFER,_,g.DYNAMIC_DRAW),L&&(L=!1,g.uniformMatrix4fv(x.transform,!1,E),g.uniform2f(x.screenSize,w,b)),g.vertexAttribPointer(x.vertexPos,2,g.FLOAT,!1,3*Float32Array.BYTES_PER_ELEMENT,0),g.vertexAttribPointer(x.customAttributes,1,g.FLOAT,!1,3*Float32Array.BYTES_PER_ELEMENT,8),n(),g.drawArrays(g.TRIANGLES,0,6*A)}var v,h,g,m,y,x,w,b,E,L,N=18,k=o(),P=i(),j=1024,A=0,_=new Float32Array(64);return{load:t,position:r,createNode:s,removeNode:f,replaceProperties:c,updateTransform:d,updateSize:l,render:p}}function o(){return["precision mediump float;","varying vec4 color;","varying vec3 vTextureCoord;","uniform sampler2D u_sampler0;","uniform sampler2D u_sampler1;","uniform sampler2D u_sampler2;","uniform sampler2D u_sampler3;","void main(void) {"," if (vTextureCoord.z == 0.) {"," gl_FragColor = texture2D(u_sampler0, vTextureCoord.xy);"," } else if (vTextureCoord.z == 1.) {"," gl_FragColor = texture2D(u_sampler1, vTextureCoord.xy);"," } else if (vTextureCoord.z == 2.) {"," gl_FragColor = texture2D(u_sampler2, vTextureCoord.xy);"," } else if (vTextureCoord.z == 3.) {"," gl_FragColor = texture2D(u_sampler3, vTextureCoord.xy);"," } else { gl_FragColor = vec4(0, 1, 0, 1); }","}"].join("\n")}function i(){return["attribute vec2 a_vertexPos;","attribute float a_customAttributes;","uniform vec2 u_screenSize;","uniform mat4 u_transform;","uniform float u_tilesPerTexture;","varying vec3 vTextureCoord;","void main(void) {"," gl_Position = u_transform * vec4(a_vertexPos/u_screenSize, 0, 1);","float corner = mod(a_customAttributes, 4.);","float tileIndex = mod(floor(a_customAttributes / 4.), u_tilesPerTexture);","float tilesPerRow = sqrt(u_tilesPerTexture);","float tileSize = 1./tilesPerRow;","float tileColumn = mod(tileIndex, tilesPerRow);","float tileRow = floor(tileIndex/tilesPerRow);","if(corner == 0.0) {"," vTextureCoord.xy = vec2(0, 1);","} else if(corner == 1.0) {"," vTextureCoord.xy = vec2(1, 1);","} else if(corner == 2.0) {"," vTextureCoord.xy = vec2(0, 0);","} else {"," vTextureCoord.xy = vec2(1, 0);","}","vTextureCoord *= tileSize;","vTextureCoord.x += tileColumn * tileSize;","vTextureCoord.y += tileRow * tileSize;","vTextureCoord.z = floor(floor(a_customAttributes / 4.)/u_tilesPerTexture);","}"].join("\n")}var a=e("./webglAtlas.js"),u=e("./webgl.js");n.exports=r},{"./webgl.js":57,"./webglAtlas.js":58}],61:[function(e,n,t){function r(e){function n(){x=null}function t(e){x=e}function r(e){return"function"==typeof e&&P.push(e),A}function i(e){return"function"==typeof e&&k.push(e),A}function a(e){return"function"==typeof e&&N.push(e),A}function u(e){return"function"==typeof e&&L.push(e),A}function s(e){return"function"==typeof e&&E.push(e),A}function f(e){return"function"==typeof e&&b.push(e),A}function c(e){return"function"==typeof e&&w.push(e),A}function d(e,n,t){if(e&&e.size){var r=e.position,o=e.size;return r.x-og.byteLength){var e=new ArrayBuffer(2*g.byteLength),n=new Float32Array(e),t=new Uint32Array(e);t.set(y),m=n,y=t,g=e}};return{load:function(a){n=a,r=o(a),e=r.createProgram(v,p),n.useProgram(e),i=r.getLocations(e,["a_vertexPos","a_color","u_screenSize","u_transform"]),n.enableVertexAttribArray(i.vertexPos),n.enableVertexAttribArray(i.color),t=n.createBuffer()},position:function(e,n,t){var r=e.id,o=r*d;m[o]=n.x,m[o+1]=n.y,y[o+2]=e.color,m[o+3]=t.x,m[o+4]=t.y,y[o+5]=e.color},createLink:function(e){x(),h+=1,a=e.id},removeLink:function(e){h>0&&(h-=1),e.id0&&r.copyArrayPart(y,e.id*d,h*d,d)},updateTransform:function(e){c=!0,f=e},updateSize:function(e,n){u=e,s=n,c=!0},render:function(){n.useProgram(e),n.bindBuffer(n.ARRAY_BUFFER,t),n.bufferData(n.ARRAY_BUFFER,g,n.DYNAMIC_DRAW),c&&(c=!1,n.uniformMatrix4fv(i.transform,!1,f),n.uniform2f(i.screenSize,u,s)),n.vertexAttribPointer(i.vertexPos,2,n.FLOAT,!1,3*Float32Array.BYTES_PER_ELEMENT,0),n.vertexAttribPointer(i.color,4,n.UNSIGNED_BYTE,!0,3*Float32Array.BYTES_PER_ELEMENT,8),n.drawArrays(n.LINES,0,2*h),a=h-1},bringToFront:function(e){a>e.id&&r.swapArrayPart(m,e.id*d,a*d,d),a>0&&(a-=1)},getFrontLinkId:function(){return a}}}var o=e("./webgl.js");n.exports=r},{"./webgl.js":57}],64:[function(e,n,t){function r(){function e(){if((P+1)*w>=L.byteLength){var e=new ArrayBuffer(2*L.byteLength),n=new Float32Array(e),t=new Uint32Array(e);t.set(k),N=n,k=t,L=e}}function n(e){d=e,v=o(e),c=v.createProgram(E,b),d.useProgram(c),p=v.getLocations(c,["a_vertexPos","a_color","u_screenSize","u_transform"]), +d.enableVertexAttribArray(p.vertexPos),d.enableVertexAttribArray(p.color),l=d.createBuffer()}function t(e,n){var t=e.id;N[t*x]=n.x,N[t*x+1]=-n.y,N[t*x+2]=e.size,k[t*x+3]=e.color}function r(e){y=!0,m=e}function i(e,n){h=e,g=n,y=!0}function a(e){P>0&&(P-=1),e.id0&&v.copyArrayPart(k,e.id*x,P*x,x)}function u(){e(),P+=1}function s(){}function f(){d.useProgram(c),d.bindBuffer(d.ARRAY_BUFFER,l),d.bufferData(d.ARRAY_BUFFER,L,d.DYNAMIC_DRAW),y&&(y=!1,d.uniformMatrix4fv(p.transform,!1,m),d.uniform2f(p.screenSize,h,g)),d.vertexAttribPointer(p.vertexPos,3,d.FLOAT,!1,x*Float32Array.BYTES_PER_ELEMENT,0),d.vertexAttribPointer(p.color,4,d.UNSIGNED_BYTE,!0,x*Float32Array.BYTES_PER_ELEMENT,12),d.drawArrays(d.POINTS,0,P)}var c,d,l,p,v,h,g,m,y,x=4,w=3*Float32Array.BYTES_PER_ELEMENT+Uint32Array.BYTES_PER_ELEMENT,b=["precision mediump float;","varying vec4 color;","void main(void) {"," gl_FragColor = color;","}"].join("\n"),E=["attribute vec3 a_vertexPos;","attribute vec4 a_color;","uniform vec2 u_screenSize;","uniform mat4 u_transform;","varying vec4 color;","void main(void) {"," gl_Position = u_transform * vec4(a_vertexPos.xy/u_screenSize, 0, 1);"," gl_PointSize = a_vertexPos.z * u_transform[0][0];"," color = a_color.abgr;","}"].join("\n"),L=new ArrayBuffer(16*w),N=new Float32Array(L),k=new Uint32Array(L),P=0;return{load:n,position:t,updateTransform:r,updateSize:i,removeNode:a,createNode:u,replaceProperties:s,render:f}}var o=e("./webgl.js");n.exports=r},{"./webgl.js":57}],65:[function(e,n,t){function r(e,n){return{size:"number"==typeof e?e:10,color:o(n)}}var o=e("./parseColor.js");n.exports=r},{"./parseColor.js":55}],66:[function(e,n,t){n.exports="0.8.1"},{}]},{},[1])(1)}); \ No newline at end of file diff --git a/package.json b/package.json index 5d8ea11..9937fbf 100644 --- a/package.json +++ b/package.json @@ -35,15 +35,15 @@ }, "dependencies": { "gintersect": "0.1.0", - "ngraph.centrality": "0.1.3", + "ngraph.centrality": "0.3.0", "ngraph.events": "0.0.3", - "ngraph.forcelayout": "0.1.2", - "ngraph.fromjson": "0.1.7", - "ngraph.generators": "0.0.15", - "ngraph.graph": "0.0.11", + "ngraph.forcelayout": "0.5.0", + "ngraph.fromjson": "0.1.9", + "ngraph.generators": "0.0.19", + "ngraph.graph": "0.0.14", "ngraph.merge": "0.0.1", "ngraph.random": "0.0.1", - "ngraph.tojson": "0.1.3", + "ngraph.tojson": "0.1.4", "simplesvg": "0.0.10" } } From 580bb9af282f2511248e8cd98d7c31d35bd94c31 Mon Sep 17 00:00:00 2001 From: Andriy Kashcha Date: Sun, 25 Mar 2018 18:14:15 -0700 Subject: [PATCH 22/49] Updated travis --- .travis.yml | 2 +- README.md | 3 +-- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/.travis.yml b/.travis.yml index 35048b6..851fb95 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,3 +1,3 @@ language: node_js node_js: -- '0.10' +- node diff --git a/README.md b/README.md index 6f72ee8..605e8ba 100644 --- a/README.md +++ b/README.md @@ -112,8 +112,7 @@ graphics.node(function(node) { nodeUI.attr('x', pos.x - 12).attr('y', pos.y - 12); }); -var renderer = Viva.Graph.View.renderer(graph, - { +var renderer = Viva.Graph.View.renderer(graph, { graphics : graphics }); renderer.run(); From 8a5925cae899acce0e8440e403cdd075aac45031 Mon Sep 17 00:00:00 2001 From: Andriy Kashcha Date: Sun, 22 Apr 2018 15:51:46 -0700 Subject: [PATCH 23/49] updated version --- src/version.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/version.js b/src/version.js index d55dbb2..b977700 100644 --- a/src/version.js +++ b/src/version.js @@ -1,2 +1,2 @@ // todo: this should be generated at build time. -module.exports = '0.8.1'; +module.exports = '0.10.1'; From 265fe924b9a9948e3cb3775650d23aa1968182eb Mon Sep 17 00:00:00 2001 From: Andriy Kashcha Date: Sun, 30 Dec 2018 08:23:06 -0800 Subject: [PATCH 24/49] updated years --- LICENSE | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/LICENSE b/LICENSE index c713177..ed8f60b 100644 --- a/LICENSE +++ b/LICENSE @@ -1,4 +1,4 @@ -Copyright (c) 2011 - 2016, Andrei Kashcha +Copyright (c) 2011 - 2018, Andrei Kashcha All rights reserved. Redistribution and use in source and binary forms, with or without From 1b639d9d7406d3ecad013aff35c64567243e4aa4 Mon Sep 17 00:00:00 2001 From: Andriy Kashcha Date: Sun, 3 Mar 2019 08:58:17 -0800 Subject: [PATCH 25/49] updated years --- LICENSE | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/LICENSE b/LICENSE index ed8f60b..ce35121 100644 --- a/LICENSE +++ b/LICENSE @@ -1,4 +1,4 @@ -Copyright (c) 2011 - 2018, Andrei Kashcha +Copyright (c) 2011 - 2019, Andrei Kashcha All rights reserved. Redistribution and use in source and binary forms, with or without From 8d90f54937178b7953f29f1700a85119c6dbedf9 Mon Sep 17 00:00:00 2001 From: Andriy Kashcha Date: Tue, 22 Oct 2019 20:12:21 -0700 Subject: [PATCH 26/49] rebuild --- dist/vivagraph.js | 17 ++++++++++------- dist/vivagraph.min.js | 4 ++-- 2 files changed, 12 insertions(+), 9 deletions(-) diff --git a/dist/vivagraph.js b/dist/vivagraph.js index 7934f28..2839752 100644 --- a/dist/vivagraph.js +++ b/dist/vivagraph.js @@ -4761,6 +4761,9 @@ function renderer(graph, settings) { return graphics; }, + /** + * Gets current layout. + */ getLayout: function() { return layout; }, @@ -6529,27 +6532,27 @@ function webglImageNodeProgram() { function position(nodeUI, pos) { var idx = nodeUI.id * ATTRIBUTES_PER_PRIMITIVE; nodes[idx] = pos.x - nodeUI.size; - nodes[idx + 1] = pos.y - nodeUI.size; + nodes[idx + 1] = -pos.y - nodeUI.size; nodes[idx + 2] = nodeUI._offset * 4; nodes[idx + 3] = pos.x + nodeUI.size; - nodes[idx + 4] = pos.y - nodeUI.size; + nodes[idx + 4] = -pos.y - nodeUI.size; nodes[idx + 5] = nodeUI._offset * 4 + 1; nodes[idx + 6] = pos.x - nodeUI.size; - nodes[idx + 7] = pos.y + nodeUI.size; + nodes[idx + 7] = -pos.y + nodeUI.size; nodes[idx + 8] = nodeUI._offset * 4 + 2; nodes[idx + 9] = pos.x - nodeUI.size; - nodes[idx + 10] = pos.y + nodeUI.size; + nodes[idx + 10] = -pos.y + nodeUI.size; nodes[idx + 11] = nodeUI._offset * 4 + 2; nodes[idx + 12] = pos.x + nodeUI.size; - nodes[idx + 13] = pos.y - nodeUI.size; + nodes[idx + 13] = -pos.y - nodeUI.size; nodes[idx + 14] = nodeUI._offset * 4 + 1; nodes[idx + 15] = pos.x + nodeUI.size; - nodes[idx + 16] = pos.y + nodeUI.size; + nodes[idx + 16] = -pos.y + nodeUI.size; nodes[idx + 17] = nodeUI._offset * 4 + 3; } @@ -7312,7 +7315,7 @@ function webglSquare(size, color) { },{"./parseColor.js":55}],66:[function(require,module,exports){ // todo: this should be generated at build time. -module.exports = '0.8.1'; +module.exports = '0.10.1'; },{}]},{},[1])(1) }); \ No newline at end of file diff --git a/dist/vivagraph.min.js b/dist/vivagraph.min.js index 84f31bb..5ef7186 100644 --- a/dist/vivagraph.min.js +++ b/dist/vivagraph.min.js @@ -1,3 +1,3 @@ !function(e){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=e();else if("function"==typeof define&&define.amd)define([],e);else{var n;"undefined"!=typeof window?n=window:"undefined"!=typeof global?n=global:"undefined"!=typeof self&&(n=self),n.Viva=e()}}(function(){return function e(n,t,r){function o(a,u){if(!t[a]){if(!n[a]){var s="function"==typeof require&&require;if(!u&&s)return s(a,!0);if(i)return i(a,!0);var f=new Error("Cannot find module '"+a+"'");throw f.code="MODULE_NOT_FOUND",f}var c=t[a]={exports:{}};n[a][0].call(c.exports,function(e){var t=n[a][1][e];return o(t?t:e)},c,c.exports,e,n,t,r)}return t[a].exports}for(var i="function"==typeof require&&require,a=0;a=0==m>=4?null:(f=u-i,d=o-a,p=a*i-o*u,v=f*e+d*n+p,h=f*t+d*r+p,0!==v&&0!==h&&v>=0==h>=0?null:(y=s*d-f*c,0===y?null:(x=y<0?-y/2:y/2,x=0,w=c*p-d*l,b.x=(w<0?w-x:w+x)/y,w=f*l-s*p,b.y=(w<0?w-x:w+x)/y,b)))}n.exports=r},{}],4:[function(e,n,t){n.exports.degree=e("./src/degree.js"),n.exports.betweenness=e("./src/betweenness.js"),n.exports.closeness=e("./src/closeness.js"),n.exports.eccentricity=e("./src/eccentricity.js")},{"./src/betweenness.js":5,"./src/closeness.js":6,"./src/degree.js":7,"./src/eccentricity.js":8}],5:[function(e,n,t){function r(e,n){function t(e){h[e]/=2}function r(e){h[e.id]=0}function o(e){s=e.id,u(s),i()}function i(){for(e.forEachNode(a);c.length;){for(var n=c.pop(),t=(1+v[n])/p[n],r=d[n],o=0;o0?f[a]=(n-1)/t:f[a]=0}function i(t){function r(e){var n=e.id;s[n]=-1}function o(e){var n=e.id;s[n]===-1&&(s[n]=s[i]+1,u.push(n))}for(e.forEachNode(r),s[t]=0,u.push(t);u.length;){var i=u.shift();e.forEachLinkedNode(i,o,n)}}var a,u=[],s=Object.create(null),f=Object.create(null);return e.forEachNode(t),e.forEachNode(r),f}n.exports=r},{}],7:[function(e,n,t){function r(e,n){function t(n){var t=e.getLinks(n.id);u[n.id]=r(t,n.id)}var r,u=Object.create(null);if(n=(n||"both").toLowerCase(),"both"===n||"inout"===n)r=a;else if("in"===n)r=o;else{if("out"!==n)throw new Error("Expected centrality degree kind is: in, out or both");r=i}return e.forEachNode(t),u}function o(e,n){var t=0;if(!e)return t;for(var r=0;r1&&(o=Array.prototype.splice.call(arguments,1));for(var i=0;i0&&i.addLink(a,r-1+o*e),o>0&&i.addLink(a,r+(o-1)*e)}return i}function s(e,t,r){if(e<1||t<1||r<1)throw new Error("Invalid number of nodes in grid3 graph");var o,i,a,u=n();if(1===e&&1===t&&1===r)return u.addNode(0),u;for(a=0;a0&&u.addLink(f,o-1+i*e+s),i>0&&u.addLink(f,o+(i-1)*e+s),a>0&&u.addLink(f,o+i*e+(a-1)*e*t)}return u}function f(e){if(e<0)throw new Error("Invalid number of nodes in balanced tree");var t,r=n(),o=Math.pow(2,e);for(0===e&&r.addNode(1),t=1;t= 0");var t,r=n();for(t=0;t0&&o.addLink(i*t,i*t-1);return o.addLink(0,o.getNodesCount()-1),o}function l(t,r,o,i){if(r>=t)throw new Error("Choose smaller `k`. It cannot be larger than number of nodes `n`");var a,u,s=e("ngraph.random").random(i||42),f=n();for(a=0;a=1||0===e);return n*Math.sqrt(-2*Math.log(e)/e)}function a(){var e=this.seed;return e=e+2127912214+(e<<12)&4294967295,e=4294967295&(3345072700^e^e>>>19),e=e+374761393+(e<<5)&4294967295,e=4294967295&(e+3550635116^e<<9),e=e+4251993797+(e<<3)&4294967295,e=4294967295&(3042594569^e^e>>>16),this.seed=e,(268435455&e)/268435456}function u(e){return Math.floor(this.nextDouble()*e)}function s(e,n){function t(){var n,t,r;for(n=e.length-1;n>0;--n)t=i.next(n+1),r=e[t],e[t]=e[n],e[n]=r;return e}function o(n){var t,r,o;for(t=e.length-1;t>0;--t)r=i.next(t+1),o=e[r],e[r]=e[t],e[t]=o,n(o);e.length&&n(e[0])}var i=n||r();if("function"!=typeof i.next)throw new Error("customRandom does not match expected API: next() function is missing");return{forEach:o,shuffle:t}}n.exports=r,n.exports.random=r,n.exports.randomIterator=s,o.prototype.next=u,o.prototype.nextDouble=a,o.prototype.uniform=a,o.prototype.gaussian=i},{}],16:[function(e,n,t){function r(e){function n(){function e(){return q.beginUpdate=F=k,q.endUpdate=G=P,B=t,O=r,q.on=n,n.apply(q,arguments)}var n=q.on;q.on=e}function t(e,n){R.push({link:e,changeType:n})}function r(e,n){R.push({node:e,changeType:n})}function c(e,n){if(void 0===e)throw new Error("Invalid node identifier");F();var t=d(e);return t?(t.data=n,O(t,"update")):(t=new i(e,n),S++,O(t,"add")),I[e]=t,G(),t}function d(e){return I[e]}function l(e){var n=d(e);if(!n)return!1;F();var t=n.links;if(t){n.links=null;for(var r=0;r=0&&t.links.splice(n,1)),r&&(n=o(e,r.links),n>=0&&r.links.splice(n,1)),B(e,"remove"),G(),!0}function y(e,n){var t,r=d(e);if(!r||!r.links)return null;for(t=0;t0&&(q.fire("changed",R),R.length=0)}function j(){return Object.keys?A:_}function A(e){if("function"==typeof e)for(var n=Object.keys(I),t=0;t=0?i:-1,o);return v.push(a),a},getTotalMovement:function(){return w},removeSpring:function(e){if(e){var n=v.indexOf(e);return n>-1?(v.splice(n,1),!0):void 0}},getBestNewBodyPosition:function(e){return g.getBestNewPosition(e)},getBBox:function(){return x&&(g.update(),x=!1),g.box},invalidateBBox:function(){x=!0},gravity:function(e){return void 0!==e?(n.gravity=e,h.options({gravity:e}),this):n.gravity},theta:function(e){return void 0!==e?(n.theta=e,h.options({theta:e}),this):n.theta}};return o(n,b),a(b),b}n.exports=r},{"./lib/bounds":20,"./lib/createBody":21,"./lib/dragForce":22,"./lib/eulerIntegrator":23,"./lib/spring":24,"./lib/springForce":25,"ngraph.events":9,"ngraph.expose":10,"ngraph.merge":17,"ngraph.quadtreebh":26}],20:[function(e,n,t){n.exports=function(n,t){function r(){var e=n.length;if(0!==e){for(var t=Number.MAX_VALUE,r=Number.MAX_VALUE,o=Number.MIN_VALUE,a=Number.MIN_VALUE;e--;){var u=n[e];u.isPinned?(u.pos.x=u.prevPos.x,u.pos.y=u.prevPos.y):(u.prevPos.x=u.pos.x,u.prevPos.y=u.pos.y),u.pos.xo&&(o=u.pos.x),u.pos.ya&&(a=u.pos.y)}i.x1=t,i.x2=o,i.y1=r,i.y2=a}}var o=e("ngraph.random").random(42),i={x1:0,y1:0,x2:0,y2:0};return{box:i,update:r,reset:function(){i.x1=i.y1=0,i.x2=i.y2=0},getBestNewPosition:function(e){var n=i,r=0,a=0;if(e.length){for(var u=0;u1&&(s.velocity.x=c/l,s.velocity.y=d/l),r=n*s.velocity.x,i=n*s.velocity.y,s.pos.x+=r,s.pos.y+=i,o+=Math.abs(r),a+=Math.abs(i)}return(o*o+a*a)/u}n.exports=r},{}],24:[function(e,n,t){function r(e,n,t,r,o){this.from=e,this.to=n,this.length=t,this.coeff=r,this.weight="number"==typeof o?o:1}n.exports=r},{}],25:[function(e,n,t){n.exports=function(n){var t=e("ngraph.merge"),r=e("ngraph.random").random(42),o=e("ngraph.expose");n=t(n,{springCoeff:2e-4,springLength:80});var i={update:function(e){var t=e.from,o=e.to,i=e.length<0?n.springLength:e.length,a=o.pos.x-t.pos.x,u=o.pos.y-t.pos.y,s=Math.sqrt(a*a+u*u);0===s&&(a=(r.nextDouble()-.5)/50,u=(r.nextDouble()-.5)/50,s=Math.sqrt(a*a+u*u));var f=s-i,c=(!e.coeff||e.coeff<0?n.springCoeff:e.coeff)*f/s*e.weight;t.force.x+=c*a,t.force.y+=c*u,o.force.x-=c*a,o.force.y-=c*u}};return o(n,i,["springCoeff","springLength"]),i}},{"ngraph.expose":10,"ngraph.merge":17,"ngraph.random":30}],26:[function(e,n,t){function r(e,n){return 0===n?e.quad0:1===n?e.quad1:2===n?e.quad2:3===n?e.quad3:null}function o(e,n,t){0===n?e.quad0=t:1===n?e.quad1=t:2===n?e.quad2=t:3===n&&(e.quad3=t)}n.exports=function(n){function t(){var e=g[m];return e?(e.quad0=null,e.quad1=null,e.quad2=null,e.quad3=null,e.body=null,e.mass=e.massX=e.massY=0,e.left=e.right=e.top=e.bottom=0):(e=new f,g[m]=e),++m,e}function i(e){var n,t,r,o,i=p,a=0,u=0,f=1,c=0,d=1;for(i[0]=y;f;){var v=i[c],g=v.body;f-=1,c+=1;var m=g!==e;g&&m?(t=g.pos.x-e.pos.x,r=g.pos.y-e.pos.y,o=Math.sqrt(t*t+r*r),0===o&&(t=(s.nextDouble()-.5)/50,r=(s.nextDouble()-.5)/50,o=Math.sqrt(t*t+r*r)),n=l*g.mass*e.mass/(o*o*o),a+=n*t,u+=n*r):m&&(t=v.massX/v.mass-e.pos.x,r=v.massY/v.mass-e.pos.y,o=Math.sqrt(t*t+r*r),0===o&&(t=(s.nextDouble()-.5)/50,r=(s.nextDouble()-.5)/50,o=Math.sqrt(t*t+r*r)),(v.right-v.left)/oi&&(i=f),ca&&(a=c)}var d=i-r,l=a-o;for(d>l?a=o+d:i=r+l,m=0,y=t(),y.left=r,y.right=i,y.top=o,y.bottom=a,n=s-1,n>=0&&(y.body=e[n]);n--;)u(e[n],y)}function u(e){for(v.reset(),v.push(y,e);!v.isEmpty();){var n=v.pop(),i=n.node,a=n.body;if(i.body){var u=i.body;if(i.body=null,d(u.pos,a.pos)){var f=3;do{var c=s.nextDouble(),l=(i.right-i.left)*c,p=(i.bottom-i.top)*c;u.pos.x=i.left+l,u.pos.y=i.top+p,f-=1}while(f>0&&d(u.pos,a.pos));if(0===f&&d(u.pos,a.pos))return}v.push(i,u),v.push(i,a)}else{var h=a.pos.x,g=a.pos.y;i.mass=i.mass+a.mass,i.massX=i.massX+a.mass*h,i.massY=i.massY+a.mass*g;var m=0,x=i.left,w=(i.right+x)/2,b=i.top,E=(i.bottom+b)/2;h>w&&(m+=1,x=w,w=i.right),g>E&&(m+=2,b=E,E=i.bottom);var L=r(i,m);L?v.push(L,a):(L=t(),L.left=x,L.top=b,L.right=w,L.bottom=E,L.body=a,o(i,m,L))}}}n=n||{},n.gravity="number"==typeof n.gravity?n.gravity:-1,n.theta="number"==typeof n.theta?n.theta:.8;var s=e("ngraph.random").random(1984),f=e("./node"),c=e("./insertStack"),d=e("./isSamePosition"),l=n.gravity,p=[],v=new c,h=n.theta,g=[],m=0,y=t();return{insertBodies:a,getRoot:function(){return y},updateBodyForce:i,options:function(e){return e?("number"==typeof e.gravity&&(l=e.gravity),"number"==typeof e.theta&&(h=e.theta),this):{gravity:l,theta:h}}}}},{"./insertStack":27,"./isSamePosition":28,"./node":29,"ngraph.random":30}],27:[function(e,n,t){function r(){this.stack=[],this.popIdx=0}function o(e,n){this.node=e,this.body=n}n.exports=r,r.prototype={isEmpty:function(){return 0===this.popIdx},push:function(e,n){var t=this.stack[this.popIdx];t?(t.node=e,t.body=n):this.stack[this.popIdx]=new o(e,n),++this.popIdx},pop:function(){if(this.popIdx>0)return this.stack[--this.popIdx]},reset:function(){this.popIdx=0}}},{}],28:[function(e,n,t){n.exports=function(e,n){var t=Math.abs(e.x-n.x),r=Math.abs(e.y-n.y);return t<1e-8&&r<1e-8}},{}],29:[function(e,n,t){n.exports=function(){this.body=null,this.quad0=null,this.quad1=null,this.quad2=null,this.quad3=null,this.mass=0,this.massX=0,this.massY=0,this.left=0,this.top=0,this.bottom=0,this.right=0}},{}],30:[function(e,n,t){function r(e){var n="number"==typeof e?e:+new Date,t=function(){return n=n+2127912214+(n<<12)&4294967295,n=4294967295&(3345072700^n^n>>>19),n=n+374761393+(n<<5)&4294967295,n=4294967295&(n+3550635116^n<<9),n=n+4251993797+(n<<3)&4294967295,n=4294967295&(3042594569^n^n>>>16),(268435455&n)/268435456};return{next:function(e){return Math.floor(t()*e)},nextDouble:function(){return t()}}}function o(e,n){var t=n||r();if("function"!=typeof t.next)throw new Error("customRandom does not match expected API: next() function is missing");return{forEach:function(n){var r,o,i;for(r=e.length-1;r>0;--r)o=t.next(r+1),i=e[o],e[o]=e[r],e[r]=i,n(i);e.length&&n(e[0])},shuffle:function(){var n,r,o;for(n=e.length-1;n>0;--n)r=t.next(n+1),o=e[r],e[r]=e[n],e[n]=o;return e}}}n.exports={random:r,randomIterator:o}},{}],31:[function(e,n,t){function r(e,n,t){function r(e){u.nodes.push(s(e))}function o(e){u.links.push(f(e))}function i(e){var n={id:e.id};return void 0!==e.data&&(n.data=e.data),n}function a(e){var n={fromId:e.fromId,toId:e.toId};return void 0!==e.data&&(n.data=e.data),n}var u={nodes:[],links:[]},s=n||i,f=t||a;return e.forEachNode(r),e.forEachLink(o),JSON.stringify(u)}n.exports=r},{}],32:[function(e,n,t){function r(e,n){var t=o(e);if(void 0===n)return t;for(var r=Object.keys(n),i=0;iv&&(r=1),u(e,r,{x:e.touches[0].clientX,y:e.touches[0].clientY}),v=t,m(e),y(e)}},j=function(e){p=!1,o.off("touchmove",P),o.off("touchend",j),o.off("touchcancel",j),c=null,r&&r(e)},A=function(e,t){m(e),y(e),d=t.clientX,l=t.clientY,c=e.target||e.srcElement,n&&n(e,{x:d,y:l}),p||(p=!0,o.on("touchmove",P),o.on("touchend",j),o.on("touchcancel",j))},_=function(e){return 1===e.touches.length?A(e,e.touches[0]):void(2===e.touches.length&&(m(e),y(e),v=k(e.touches[0],e.touches[1])))};return e.addEventListener("mousedown",b),e.addEventListener("touchstart",_),{onStart:function(e){return n=e,this},onDrag:function(e){return t=e,this},onStop:function(e){return r=e,this},onScroll:function(e){return N(e),this},release:function(){e.removeEventListener("mousedown",b),e.removeEventListener("touchstart",_),o.off("mousemove",w),o.off("mouseup",E),o.off("touchmove",P),o.off("touchend",j),o.off("touchcancel",j),N(null)}}}n.exports=r;var o=e("../Utils/documentEvents.js"),i=e("../Utils/browserInfo.js"),a=e("../Utils/findElementPosition.js")},{"../Utils/browserInfo.js":43,"../Utils/documentEvents.js":44,"../Utils/findElementPosition.js":45}],40:[function(e,n,t){function r(e,n){var t=o(n),r=null,i={},a={x:0,y:0};return t.mouseDown(function(e,n){r=e,a.x=n.clientX,a.y=n.clientY,t.mouseCapture(r);var o=i[e.id];return o&&o.onStart&&o.onStart(n,a),!0}).mouseUp(function(e){t.releaseMouseCapture(r),r=null;var n=i[e.id];return n&&n.onStop&&n.onStop(),!0}).mouseMove(function(e,n){if(r){var t=i[r.id];return t&&t.onDrag&&t.onDrag(n,{x:n.clientX-a.x,y:n.clientY-a.y}),a.x=n.clientX,a.y=n.clientY,!0}}),{bindDragNDrop:function(e,n){i[e.id]=n,n||delete i[e.id]}}}n.exports=r;var o=e("../WebGL/webglInputEvents.js")},{"../WebGL/webglInputEvents.js":61}],41:[function(e,n,t){function r(e,n){function t(e){return d[e]}n=o(n,{maxX:1024,maxY:1024,seed:"Deterministic randomness made me do this"});var r=i(n.seed),u=new a(Number.MAX_VALUE,Number.MAX_VALUE,Number.MIN_VALUE,Number.MIN_VALUE),s={},f=function(e){return{x:r.next(n.maxX),y:r.next(n.maxY)}},c=function(e,n){e.xn.x2&&(n.x2=e.x),e.yn.y2&&(n.y2=e.y)},d="function"==typeof Object.create?Object.create(null):{},l=function(e){d[e.id]=f(e),c(d[e.id],u)},p=function(){0!==e.getNodesCount()&&(u.x1=Number.MAX_VALUE,u.y1=Number.MAX_VALUE,u.x2=Number.MIN_VALUE,u.y2=Number.MIN_VALUE,e.forEachNode(l))},v=function(e){s[e.id]=e},h=function(e){for(var n=0;n=0:"boolean"!=typeof q||q}function r(){G=G||window.document.body,O=O||i(e,{springLength:80,springCoeff:2e-4}),F=F||a(e,{container:G}),n.hasOwnProperty("renderLinks")||(n.renderLinks=!0),n.prerender=n.prerender||0,U=(F.inputManager||s)(e,F)}function l(){F.beginRender(),n.renderLinks&&F.renderLinks(),F.renderNodes(),F.endRender()}function p(){return X=O.step()&&!V,l(),!X}function v(e){R||(R=void 0!==e?f(function(){if(e-=1,e<0){var n=!1;return n}return p()},M):f(p,M))}function h(){W||(X=!1,R.restart())}function g(){if("number"==typeof n.prerender&&n.prerender>0)for(var e=0;e0?n.insertBefore(r,n.firstChild):n.appendChild(r),r},releaseLink:function(e){var t=d[e.id];t&&(n.removeChild(t),delete d[e.id])},addNode:function(e,t){var r=l(e);if(r)return r.position=t,r.node=e,c[e.id]=r,n.appendChild(r),r},releaseNode:function(e){var t=c[e.id];t&&(n.removeChild(t),delete c[e.id])},renderNodes:function(){for(var e in c)if(c.hasOwnProperty(e)){var n=c[e];m.x=n.position.x,m.y=n.position.y,p(n,m,n.node)}},renderLinks:function(){for(var e in d)if(d.hasOwnProperty(e)){var n=d[e];y.x=n.position.from.x,y.y=n.position.from.y,x.x=n.position.to.x,x.y=n.position.to.y,h(n,y,x,n.link)}},getGraphicsRoot:function(e){return"function"==typeof e&&(t?e(t):r=e),t},getSvgRoot:function(){return t}};return i(b),b}n.exports=r;var o=e("simplesvg"),i=e("ngraph.events"),a=e("../Input/domInputManager.js")},{"../Input/domInputManager.js":38,"ngraph.events":9,simplesvg:32}],54:[function(e,n,t){function r(e){e=c(e,{enableBlending:!0,preserveDrawingBuffer:!1,clearColor:!1,clearColorValue:{r:1,g:1,b:1,a:1}});var n,t,r,d,l,p,v,h,g=0,m=0,y=[1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1],x=[],w=[],b={},E={},L=i(),N=a(),k=function(e){return u()},P=function(e){return s(3014898687)},j=function(){L.updateTransform(y),N.updateTransform(y)},A=function(){y=[1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1]},_=function(){n&&t&&(d=t.width=Math.max(n.offsetWidth,1),l=t.height=Math.max(n.offsetHeight,1),r&&r.viewport(0,0,d,l),L&&L.updateSize(d/2,l/2),N&&N.updateSize(d/2,l/2))},I=function(e){e.fire("rescaled")};t=window.document.createElement("canvas");var T={getLinkUI:function(e){return E[e]},getNodeUI:function(e){return b[e]},node:function(e){if("function"==typeof e)return k=e,this},link:function(e){if("function"==typeof e)return P=e,this},placeNode:function(e){return p=e,this},placeLink:function(e){return v=e,this},inputManager:o,beginRender:function(){},endRender:function(){m>0&&L.render(),g>0&&N.render()},bringLinkToFront:function(e){var n,t,r=L.getFrontLinkId();L.bringToFront(e),r>e.id&&(n=e.id,t=w[r],w[r]=w[n],w[r].id=r,w[n]=t,w[n].id=n)},graphCenterChanged:function(e,n){y[12]=2*e/d-1,y[13]=1-2*n/l,j()},addLink:function(e,n){var t=m++,r=P(e);return r.id=t,r.pos=n,L.createLink(r),w[t]=r,E[e.id]=r,r},addNode:function(e,n){var t=g++,r=k(e);return r.id=t,r.position=n,r.node=e,N.createNode(r),x[t]=r,b[e.id]=r,r},translateRel:function(e,n){y[12]+=2*y[0]*e/d/y[0],y[13]-=2*y[5]*n/l/y[5],j()},scale:function(e,n){var t=2*n.x/d-1,r=1-2*n.y/l;return t-=y[12],r-=y[13],y[12]+=t*(1-e),y[13]+=r*(1-e),y[0]*=e,y[5]*=e,j(),I(this),y[0]},resetScale:function(){return A(),r&&(_(),j()),this},updateSize:_,init:function(o){var i={};if(e.preserveDrawingBuffer&&(i.preserveDrawingBuffer=!0),n=o,_(),A(),n.appendChild(t),r=t.getContext("experimental-webgl",i),!r){var a="Could not initialize WebGL. Seems like the browser doesn't support it.";throw window.alert(a),a}if(e.enableBlending&&(r.blendFunc(r.SRC_ALPHA,r.ONE_MINUS_SRC_ALPHA),r.enable(r.BLEND)),e.clearColor){var u=e.clearColorValue;r.clearColor(u.r,u.g,u.b,u.a),this.beginRender=function(){r.clear(r.COLOR_BUFFER_BIT)}}L.load(r),L.updateSize(d/2,l/2),N.load(r),N.updateSize(d/2,l/2),j(),"function"==typeof h&&h(t)},release:function(e){t&&e&&e.removeChild(t)},isSupported:function(){var e=window.document.createElement("canvas"),n=e&&e.getContext&&e.getContext("experimental-webgl");return n},releaseLink:function(e){m>0&&(m-=1);var n=E[e.id];delete E[e.id],L.removeLink(n);var t=n.id;if(t0&&(g-=1);var n=b[e.id];delete b[e.id],N.removeNode(n);var t=n.id;if(te.length){var r=new Float32Array(e.length*t*2);return r.set(e),r}return e}function a(n,t){for(var r={},o=0;o=w.length&&s();var i=w[r.textureNumber];i.ctx.drawImage(n,r.col*g,r.row*g,g,g),b[e]=n.src,y[n.src]=o,i.isDirty=!0,t(o)}function c(n){var t=n/e<<0,r=n%e,o=r/h<<0,i=r%h;return{textureNumber:t,row:o,col:i}}function d(){E.isDirty=!0,x=0,v=null}function l(){v&&(window.clearTimeout(v),x+=1,v=null),x>10?d():v=window.setTimeout(d,400)}function p(e,n){var t=w[e.textureNumber].canvas,r=w[n.textureNumber].ctx,o=n.col*g,i=n.row*g;r.drawImage(t,e.col*g,e.row*g,g,g,o,i,g,g),w[e.textureNumber].isDirty=!0,w[n.textureNumber].isDirty=!0}var v,h=Math.sqrt(e||1024)<<0,g=h,m=1,y={},x=0,w=[],b=[];if(!o(e))throw"Tiles per texture should be power of two.";var E={isDirty:!1,clearDirty:n,remove:t,getTextures:r,getCoordinates:a,load:u};return E}function o(e){return 0===(e&e-1)}var i=e("./texture.js");n.exports=r},{"./texture.js":56}],59:[function(e,n,t){function r(e,n){return{_texture:0,_offset:0,size:"number"==typeof e?e:32,src:n}}n.exports=r},{}],60:[function(e,n,t){function r(){function e(e,n){e.nativeObject&&g.deleteTexture(e.nativeObject);var t=g.createTexture();g.activeTexture(g["TEXTURE"+n]),g.bindTexture(g.TEXTURE_2D,t),g.texImage2D(g.TEXTURE_2D,0,g.RGBA,g.RGBA,g.UNSIGNED_BYTE,e.canvas),g.texParameteri(g.TEXTURE_2D,g.TEXTURE_MAG_FILTER,g.LINEAR),g.texParameteri(g.TEXTURE_2D,g.TEXTURE_MIN_FILTER,g.LINEAR_MIPMAP_NEAREST),g.generateMipmap(g.TEXTURE_2D),g.uniform1i(x["sampler"+n],n),e.nativeObject=t}function n(){if(v.isDirty){var n,t=v.getTextures();for(n=0;n0&&(A-=1),e.id0&&(e.src&&v.remove(e.src),y.copyArrayPart(_,e.id*N,A*N,N))}function c(e,n){n._offset=e._offset}function d(e){L=!0,E=e}function l(e,n){w=e,b=n,L=!0}function p(){g.useProgram(h),g.bindBuffer(g.ARRAY_BUFFER,m),g.bufferData(g.ARRAY_BUFFER,_,g.DYNAMIC_DRAW),L&&(L=!1,g.uniformMatrix4fv(x.transform,!1,E),g.uniform2f(x.screenSize,w,b)),g.vertexAttribPointer(x.vertexPos,2,g.FLOAT,!1,3*Float32Array.BYTES_PER_ELEMENT,0),g.vertexAttribPointer(x.customAttributes,1,g.FLOAT,!1,3*Float32Array.BYTES_PER_ELEMENT,8),n(),g.drawArrays(g.TRIANGLES,0,6*A)}var v,h,g,m,y,x,w,b,E,L,N=18,k=o(),P=i(),j=1024,A=0,_=new Float32Array(64);return{load:t,position:r,createNode:s,removeNode:f,replaceProperties:c,updateTransform:d,updateSize:l,render:p}}function o(){return["precision mediump float;","varying vec4 color;","varying vec3 vTextureCoord;","uniform sampler2D u_sampler0;","uniform sampler2D u_sampler1;","uniform sampler2D u_sampler2;","uniform sampler2D u_sampler3;","void main(void) {"," if (vTextureCoord.z == 0.) {"," gl_FragColor = texture2D(u_sampler0, vTextureCoord.xy);"," } else if (vTextureCoord.z == 1.) {"," gl_FragColor = texture2D(u_sampler1, vTextureCoord.xy);"," } else if (vTextureCoord.z == 2.) {"," gl_FragColor = texture2D(u_sampler2, vTextureCoord.xy);"," } else if (vTextureCoord.z == 3.) {"," gl_FragColor = texture2D(u_sampler3, vTextureCoord.xy);"," } else { gl_FragColor = vec4(0, 1, 0, 1); }","}"].join("\n")}function i(){return["attribute vec2 a_vertexPos;","attribute float a_customAttributes;","uniform vec2 u_screenSize;","uniform mat4 u_transform;","uniform float u_tilesPerTexture;","varying vec3 vTextureCoord;","void main(void) {"," gl_Position = u_transform * vec4(a_vertexPos/u_screenSize, 0, 1);","float corner = mod(a_customAttributes, 4.);","float tileIndex = mod(floor(a_customAttributes / 4.), u_tilesPerTexture);","float tilesPerRow = sqrt(u_tilesPerTexture);","float tileSize = 1./tilesPerRow;","float tileColumn = mod(tileIndex, tilesPerRow);","float tileRow = floor(tileIndex/tilesPerRow);","if(corner == 0.0) {"," vTextureCoord.xy = vec2(0, 1);","} else if(corner == 1.0) {"," vTextureCoord.xy = vec2(1, 1);","} else if(corner == 2.0) {"," vTextureCoord.xy = vec2(0, 0);","} else {"," vTextureCoord.xy = vec2(1, 0);","}","vTextureCoord *= tileSize;","vTextureCoord.x += tileColumn * tileSize;","vTextureCoord.y += tileRow * tileSize;","vTextureCoord.z = floor(floor(a_customAttributes / 4.)/u_tilesPerTexture);","}"].join("\n")}var a=e("./webglAtlas.js"),u=e("./webgl.js");n.exports=r},{"./webgl.js":57,"./webglAtlas.js":58}],61:[function(e,n,t){function r(e){function n(){x=null}function t(e){x=e}function r(e){return"function"==typeof e&&P.push(e),A}function i(e){return"function"==typeof e&&k.push(e),A}function a(e){return"function"==typeof e&&N.push(e),A}function u(e){return"function"==typeof e&&L.push(e),A}function s(e){return"function"==typeof e&&E.push(e),A}function f(e){return"function"==typeof e&&b.push(e),A}function c(e){return"function"==typeof e&&w.push(e),A}function d(e,n,t){if(e&&e.size){var r=e.position,o=e.size;return r.x-og.byteLength){var e=new ArrayBuffer(2*g.byteLength),n=new Float32Array(e),t=new Uint32Array(e);t.set(y),m=n,y=t,g=e}};return{load:function(a){n=a,r=o(a),e=r.createProgram(v,p),n.useProgram(e),i=r.getLocations(e,["a_vertexPos","a_color","u_screenSize","u_transform"]),n.enableVertexAttribArray(i.vertexPos),n.enableVertexAttribArray(i.color),t=n.createBuffer()},position:function(e,n,t){var r=e.id,o=r*d;m[o]=n.x,m[o+1]=n.y,y[o+2]=e.color,m[o+3]=t.x,m[o+4]=t.y,y[o+5]=e.color},createLink:function(e){x(),h+=1,a=e.id},removeLink:function(e){h>0&&(h-=1),e.id0&&r.copyArrayPart(y,e.id*d,h*d,d)},updateTransform:function(e){c=!0,f=e},updateSize:function(e,n){u=e,s=n,c=!0},render:function(){n.useProgram(e),n.bindBuffer(n.ARRAY_BUFFER,t),n.bufferData(n.ARRAY_BUFFER,g,n.DYNAMIC_DRAW),c&&(c=!1,n.uniformMatrix4fv(i.transform,!1,f),n.uniform2f(i.screenSize,u,s)),n.vertexAttribPointer(i.vertexPos,2,n.FLOAT,!1,3*Float32Array.BYTES_PER_ELEMENT,0),n.vertexAttribPointer(i.color,4,n.UNSIGNED_BYTE,!0,3*Float32Array.BYTES_PER_ELEMENT,8),n.drawArrays(n.LINES,0,2*h),a=h-1},bringToFront:function(e){a>e.id&&r.swapArrayPart(m,e.id*d,a*d,d),a>0&&(a-=1)},getFrontLinkId:function(){return a}}}var o=e("./webgl.js");n.exports=r},{"./webgl.js":57}],64:[function(e,n,t){function r(){function e(){if((P+1)*w>=L.byteLength){var e=new ArrayBuffer(2*L.byteLength),n=new Float32Array(e),t=new Uint32Array(e);t.set(k),N=n,k=t,L=e}}function n(e){d=e,v=o(e),c=v.createProgram(E,b),d.useProgram(c),p=v.getLocations(c,["a_vertexPos","a_color","u_screenSize","u_transform"]), -d.enableVertexAttribArray(p.vertexPos),d.enableVertexAttribArray(p.color),l=d.createBuffer()}function t(e,n){var t=e.id;N[t*x]=n.x,N[t*x+1]=-n.y,N[t*x+2]=e.size,k[t*x+3]=e.color}function r(e){y=!0,m=e}function i(e,n){h=e,g=n,y=!0}function a(e){P>0&&(P-=1),e.id0&&v.copyArrayPart(k,e.id*x,P*x,x)}function u(){e(),P+=1}function s(){}function f(){d.useProgram(c),d.bindBuffer(d.ARRAY_BUFFER,l),d.bufferData(d.ARRAY_BUFFER,L,d.DYNAMIC_DRAW),y&&(y=!1,d.uniformMatrix4fv(p.transform,!1,m),d.uniform2f(p.screenSize,h,g)),d.vertexAttribPointer(p.vertexPos,3,d.FLOAT,!1,x*Float32Array.BYTES_PER_ELEMENT,0),d.vertexAttribPointer(p.color,4,d.UNSIGNED_BYTE,!0,x*Float32Array.BYTES_PER_ELEMENT,12),d.drawArrays(d.POINTS,0,P)}var c,d,l,p,v,h,g,m,y,x=4,w=3*Float32Array.BYTES_PER_ELEMENT+Uint32Array.BYTES_PER_ELEMENT,b=["precision mediump float;","varying vec4 color;","void main(void) {"," gl_FragColor = color;","}"].join("\n"),E=["attribute vec3 a_vertexPos;","attribute vec4 a_color;","uniform vec2 u_screenSize;","uniform mat4 u_transform;","varying vec4 color;","void main(void) {"," gl_Position = u_transform * vec4(a_vertexPos.xy/u_screenSize, 0, 1);"," gl_PointSize = a_vertexPos.z * u_transform[0][0];"," color = a_color.abgr;","}"].join("\n"),L=new ArrayBuffer(16*w),N=new Float32Array(L),k=new Uint32Array(L),P=0;return{load:n,position:t,updateTransform:r,updateSize:i,removeNode:a,createNode:u,replaceProperties:s,render:f}}var o=e("./webgl.js");n.exports=r},{"./webgl.js":57}],65:[function(e,n,t){function r(e,n){return{size:"number"==typeof e?e:10,color:o(n)}}var o=e("./parseColor.js");n.exports=r},{"./parseColor.js":55}],66:[function(e,n,t){n.exports="0.8.1"},{}]},{},[1])(1)}); \ No newline at end of file +n[i]);a?a.push(t):a=n[i]=[t]}}}n.exports=r;var u=/{{(.+?)}}/},{}],35:[function(e,n,t){function r(){return"undefined"==typeof DOMParser?{parseFromString:o}:new DOMParser}function o(){throw new Error("DOMParser is not supported by this platform. Please open issue here https://github.com/anvaka/simplesvg")}n.exports=r()},{}],36:[function(e,n,t){function r(){return{betweennessCentrality:o,degreeCentrality:i}}function o(e){var n=u.betweenness(e);return a(n)}function i(e,n){var t=u.degree(e,n);return a(t)}function a(e){function n(n,t){return e[t]-e[n]}function t(n){return{key:n,value:e[n]}}return Object.keys(e).sort(n).map(t)}var u=e("ngraph.centrality");n.exports=r},{"ngraph.centrality":4}],37:[function(e,n,t){function r(){return{density:function(e,n){var t=e.getNodesCount();return 0===t?NaN:n?e.getLinksCount()/(t*(t-1)):2*e.getLinksCount()/(t*(t-1))}}}n.exports=r},{}],38:[function(e,n,t){function r(e,n){function t(e,t){var i;if(t){var a=n.getNodeUI(e.id);i=o(a),"function"==typeof t.onStart&&i.onStart(t.onStart),"function"==typeof t.onDrag&&i.onDrag(t.onDrag),"function"==typeof t.onStop&&i.onStop(t.onStop),r[e.id]=i}else(i=r[e.id])&&(i.release(),delete r[e.id])}var r={};return{bindDragNDrop:t}}n.exports=r;var o=e("./dragndrop.js")},{"./dragndrop.js":39}],39:[function(e,n,t){function r(e){var n,t,r,u,s,f,c,d=0,l=0,p=!1,v=0,h=function(e){var n=0,t=0;return e=e||window.event,e.pageX||e.pageY?(n=e.pageX,t=e.pageY):(e.clientX||e.clientY)&&(n=e.clientX+window.document.body.scrollLeft+window.document.documentElement.scrollLeft,t=e.clientY+window.document.body.scrollTop+window.document.documentElement.scrollTop),[n,t]},g=function(e,n,r){t&&t(e,{x:n-d,y:r-l}),d=n,l=r},m=function(e){e.stopPropagation?e.stopPropagation():e.cancelBubble=!0},y=function(e){e.preventDefault&&e.preventDefault()},x=function(e){return m(e),!1},w=function(e){e=e||window.event,g(e,e.clientX,e.clientY)},b=function(e){if(e=e||window.event,p)return m(e),!1;var t=1===e.button&&null!==window.event||0===e.button;return t?(d=e.clientX,l=e.clientY,c=e.target||e.srcElement,n&&n(e,{x:d,y:l}),o.on("mousemove",w),o.on("mouseup",E),m(e),s=window.document.onselectstart,f=window.document.ondragstart,window.document.onselectstart=x,c.ondragstart=x,!1):void 0},E=function(e){e=e||window.event,o.off("mousemove",w),o.off("mouseup",E),window.document.onselectstart=s,c.ondragstart=f,c=null,r&&r(e)},L=function(n){if("function"==typeof u){n=n||window.event,n.preventDefault&&n.preventDefault(),n.returnValue=!1;var t,r=h(n),o=a(e),i={x:r[0]-o[0],y:r[1]-o[1]};t=n.wheelDelta?n.wheelDelta/360:n.detail/-9,u(n,t,i)}},N=function(n){!u&&n?"webkit"===i.browser?e.addEventListener("mousewheel",L,!1):e.addEventListener("DOMMouseScroll",L,!1):u&&!n&&("webkit"===i.browser?e.removeEventListener("mousewheel",L,!1):e.removeEventListener("DOMMouseScroll",L,!1)),u=n},k=function(e,n){return(e.clientX-n.clientX)*(e.clientX-n.clientX)+(e.clientY-n.clientY)*(e.clientY-n.clientY)},P=function(e){if(1===e.touches.length){m(e);var n=e.touches[0];g(e,n.clientX,n.clientY)}else if(2===e.touches.length){var t=k(e.touches[0],e.touches[1]),r=0;tv&&(r=1),u(e,r,{x:e.touches[0].clientX,y:e.touches[0].clientY}),v=t,m(e),y(e)}},j=function(e){p=!1,o.off("touchmove",P),o.off("touchend",j),o.off("touchcancel",j),c=null,r&&r(e)},A=function(e,t){m(e),y(e),d=t.clientX,l=t.clientY,c=e.target||e.srcElement,n&&n(e,{x:d,y:l}),p||(p=!0,o.on("touchmove",P),o.on("touchend",j),o.on("touchcancel",j))},_=function(e){return 1===e.touches.length?A(e,e.touches[0]):void(2===e.touches.length&&(m(e),y(e),v=k(e.touches[0],e.touches[1])))};return e.addEventListener("mousedown",b),e.addEventListener("touchstart",_),{onStart:function(e){return n=e,this},onDrag:function(e){return t=e,this},onStop:function(e){return r=e,this},onScroll:function(e){return N(e),this},release:function(){e.removeEventListener("mousedown",b),e.removeEventListener("touchstart",_),o.off("mousemove",w),o.off("mouseup",E),o.off("touchmove",P),o.off("touchend",j),o.off("touchcancel",j),N(null)}}}n.exports=r;var o=e("../Utils/documentEvents.js"),i=e("../Utils/browserInfo.js"),a=e("../Utils/findElementPosition.js")},{"../Utils/browserInfo.js":43,"../Utils/documentEvents.js":44,"../Utils/findElementPosition.js":45}],40:[function(e,n,t){function r(e,n){var t=o(n),r=null,i={},a={x:0,y:0};return t.mouseDown(function(e,n){r=e,a.x=n.clientX,a.y=n.clientY,t.mouseCapture(r);var o=i[e.id];return o&&o.onStart&&o.onStart(n,a),!0}).mouseUp(function(e){t.releaseMouseCapture(r),r=null;var n=i[e.id];return n&&n.onStop&&n.onStop(),!0}).mouseMove(function(e,n){if(r){var t=i[r.id];return t&&t.onDrag&&t.onDrag(n,{x:n.clientX-a.x,y:n.clientY-a.y}),a.x=n.clientX,a.y=n.clientY,!0}}),{bindDragNDrop:function(e,n){i[e.id]=n,n||delete i[e.id]}}}n.exports=r;var o=e("../WebGL/webglInputEvents.js")},{"../WebGL/webglInputEvents.js":61}],41:[function(e,n,t){function r(e,n){function t(e){return d[e]}n=o(n,{maxX:1024,maxY:1024,seed:"Deterministic randomness made me do this"});var r=i(n.seed),u=new a(Number.MAX_VALUE,Number.MAX_VALUE,Number.MIN_VALUE,Number.MIN_VALUE),s={},f=function(e){return{x:r.next(n.maxX),y:r.next(n.maxY)}},c=function(e,n){e.xn.x2&&(n.x2=e.x),e.yn.y2&&(n.y2=e.y)},d="function"==typeof Object.create?Object.create(null):{},l=function(e){d[e.id]=f(e),c(d[e.id],u)},p=function(){0!==e.getNodesCount()&&(u.x1=Number.MAX_VALUE,u.y1=Number.MAX_VALUE,u.x2=Number.MIN_VALUE,u.y2=Number.MIN_VALUE,e.forEachNode(l))},v=function(e){s[e.id]=e},h=function(e){for(var n=0;n=0:"boolean"!=typeof q||q}function r(){G=G||window.document.body,O=O||i(e,{springLength:80,springCoeff:2e-4}),F=F||a(e,{container:G}),n.hasOwnProperty("renderLinks")||(n.renderLinks=!0),n.prerender=n.prerender||0,U=(F.inputManager||s)(e,F)}function l(){F.beginRender(),n.renderLinks&&F.renderLinks(),F.renderNodes(),F.endRender()}function p(){return X=O.step()&&!V,l(),!X}function v(e){R||(R=void 0!==e?f(function(){if(e-=1,e<0){var n=!1;return n}return p()},M):f(p,M))}function h(){W||(X=!1,R.restart())}function g(){if("number"==typeof n.prerender&&n.prerender>0)for(var e=0;e0?n.insertBefore(r,n.firstChild):n.appendChild(r),r},releaseLink:function(e){var t=d[e.id];t&&(n.removeChild(t),delete d[e.id])},addNode:function(e,t){var r=l(e);if(r)return r.position=t,r.node=e,c[e.id]=r,n.appendChild(r),r},releaseNode:function(e){var t=c[e.id];t&&(n.removeChild(t),delete c[e.id])},renderNodes:function(){for(var e in c)if(c.hasOwnProperty(e)){var n=c[e];m.x=n.position.x,m.y=n.position.y,p(n,m,n.node)}},renderLinks:function(){for(var e in d)if(d.hasOwnProperty(e)){var n=d[e];y.x=n.position.from.x,y.y=n.position.from.y,x.x=n.position.to.x,x.y=n.position.to.y,h(n,y,x,n.link)}},getGraphicsRoot:function(e){return"function"==typeof e&&(t?e(t):r=e),t},getSvgRoot:function(){return t}};return i(b),b}n.exports=r;var o=e("simplesvg"),i=e("ngraph.events"),a=e("../Input/domInputManager.js")},{"../Input/domInputManager.js":38,"ngraph.events":9,simplesvg:32}],54:[function(e,n,t){function r(e){e=c(e,{enableBlending:!0,preserveDrawingBuffer:!1,clearColor:!1,clearColorValue:{r:1,g:1,b:1,a:1}});var n,t,r,d,l,p,v,h,g=0,m=0,y=[1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1],x=[],w=[],b={},E={},L=i(),N=a(),k=function(e){return u()},P=function(e){return s(3014898687)},j=function(){L.updateTransform(y),N.updateTransform(y)},A=function(){y=[1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1]},_=function(){n&&t&&(d=t.width=Math.max(n.offsetWidth,1),l=t.height=Math.max(n.offsetHeight,1),r&&r.viewport(0,0,d,l),L&&L.updateSize(d/2,l/2),N&&N.updateSize(d/2,l/2))},I=function(e){e.fire("rescaled")};t=window.document.createElement("canvas");var T={getLinkUI:function(e){return E[e]},getNodeUI:function(e){return b[e]},node:function(e){if("function"==typeof e)return k=e,this},link:function(e){if("function"==typeof e)return P=e,this},placeNode:function(e){return p=e,this},placeLink:function(e){return v=e,this},inputManager:o,beginRender:function(){},endRender:function(){m>0&&L.render(),g>0&&N.render()},bringLinkToFront:function(e){var n,t,r=L.getFrontLinkId();L.bringToFront(e),r>e.id&&(n=e.id,t=w[r],w[r]=w[n],w[r].id=r,w[n]=t,w[n].id=n)},graphCenterChanged:function(e,n){y[12]=2*e/d-1,y[13]=1-2*n/l,j()},addLink:function(e,n){var t=m++,r=P(e);return r.id=t,r.pos=n,L.createLink(r),w[t]=r,E[e.id]=r,r},addNode:function(e,n){var t=g++,r=k(e);return r.id=t,r.position=n,r.node=e,N.createNode(r),x[t]=r,b[e.id]=r,r},translateRel:function(e,n){y[12]+=2*y[0]*e/d/y[0],y[13]-=2*y[5]*n/l/y[5],j()},scale:function(e,n){var t=2*n.x/d-1,r=1-2*n.y/l;return t-=y[12],r-=y[13],y[12]+=t*(1-e),y[13]+=r*(1-e),y[0]*=e,y[5]*=e,j(),I(this),y[0]},resetScale:function(){return A(),r&&(_(),j()),this},updateSize:_,init:function(o){var i={};if(e.preserveDrawingBuffer&&(i.preserveDrawingBuffer=!0),n=o,_(),A(),n.appendChild(t),r=t.getContext("experimental-webgl",i),!r){var a="Could not initialize WebGL. Seems like the browser doesn't support it.";throw window.alert(a),a}if(e.enableBlending&&(r.blendFunc(r.SRC_ALPHA,r.ONE_MINUS_SRC_ALPHA),r.enable(r.BLEND)),e.clearColor){var u=e.clearColorValue;r.clearColor(u.r,u.g,u.b,u.a),this.beginRender=function(){r.clear(r.COLOR_BUFFER_BIT)}}L.load(r),L.updateSize(d/2,l/2),N.load(r),N.updateSize(d/2,l/2),j(),"function"==typeof h&&h(t)},release:function(e){t&&e&&e.removeChild(t)},isSupported:function(){var e=window.document.createElement("canvas"),n=e&&e.getContext&&e.getContext("experimental-webgl");return n},releaseLink:function(e){m>0&&(m-=1);var n=E[e.id];delete E[e.id],L.removeLink(n);var t=n.id;if(t0&&(g-=1);var n=b[e.id];delete b[e.id],N.removeNode(n);var t=n.id;if(te.length){var r=new Float32Array(e.length*t*2);return r.set(e),r}return e}function a(n,t){for(var r={},o=0;o=w.length&&s();var i=w[r.textureNumber];i.ctx.drawImage(n,r.col*g,r.row*g,g,g),b[e]=n.src,y[n.src]=o,i.isDirty=!0,t(o)}function c(n){var t=n/e<<0,r=n%e,o=r/h<<0,i=r%h;return{textureNumber:t,row:o,col:i}}function d(){E.isDirty=!0,x=0,v=null}function l(){v&&(window.clearTimeout(v),x+=1,v=null),x>10?d():v=window.setTimeout(d,400)}function p(e,n){var t=w[e.textureNumber].canvas,r=w[n.textureNumber].ctx,o=n.col*g,i=n.row*g;r.drawImage(t,e.col*g,e.row*g,g,g,o,i,g,g),w[e.textureNumber].isDirty=!0,w[n.textureNumber].isDirty=!0}var v,h=Math.sqrt(e||1024)<<0,g=h,m=1,y={},x=0,w=[],b=[];if(!o(e))throw"Tiles per texture should be power of two.";var E={isDirty:!1,clearDirty:n,remove:t,getTextures:r,getCoordinates:a,load:u};return E}function o(e){return 0===(e&e-1)}var i=e("./texture.js");n.exports=r},{"./texture.js":56}],59:[function(e,n,t){function r(e,n){return{_texture:0,_offset:0,size:"number"==typeof e?e:32,src:n}}n.exports=r},{}],60:[function(e,n,t){function r(){function e(e,n){e.nativeObject&&g.deleteTexture(e.nativeObject);var t=g.createTexture();g.activeTexture(g["TEXTURE"+n]),g.bindTexture(g.TEXTURE_2D,t),g.texImage2D(g.TEXTURE_2D,0,g.RGBA,g.RGBA,g.UNSIGNED_BYTE,e.canvas),g.texParameteri(g.TEXTURE_2D,g.TEXTURE_MAG_FILTER,g.LINEAR),g.texParameteri(g.TEXTURE_2D,g.TEXTURE_MIN_FILTER,g.LINEAR_MIPMAP_NEAREST),g.generateMipmap(g.TEXTURE_2D),g.uniform1i(x["sampler"+n],n),e.nativeObject=t}function n(){if(v.isDirty){var n,t=v.getTextures();for(n=0;n0&&(A-=1),e.id0&&(e.src&&v.remove(e.src),y.copyArrayPart(_,e.id*N,A*N,N))}function c(e,n){n._offset=e._offset}function d(e){L=!0,E=e}function l(e,n){w=e,b=n,L=!0}function p(){g.useProgram(h),g.bindBuffer(g.ARRAY_BUFFER,m),g.bufferData(g.ARRAY_BUFFER,_,g.DYNAMIC_DRAW),L&&(L=!1,g.uniformMatrix4fv(x.transform,!1,E),g.uniform2f(x.screenSize,w,b)),g.vertexAttribPointer(x.vertexPos,2,g.FLOAT,!1,3*Float32Array.BYTES_PER_ELEMENT,0),g.vertexAttribPointer(x.customAttributes,1,g.FLOAT,!1,3*Float32Array.BYTES_PER_ELEMENT,8),n(),g.drawArrays(g.TRIANGLES,0,6*A)}var v,h,g,m,y,x,w,b,E,L,N=18,k=o(),P=i(),j=1024,A=0,_=new Float32Array(64);return{load:t,position:r,createNode:s,removeNode:f,replaceProperties:c,updateTransform:d,updateSize:l,render:p}}function o(){return["precision mediump float;","varying vec4 color;","varying vec3 vTextureCoord;","uniform sampler2D u_sampler0;","uniform sampler2D u_sampler1;","uniform sampler2D u_sampler2;","uniform sampler2D u_sampler3;","void main(void) {"," if (vTextureCoord.z == 0.) {"," gl_FragColor = texture2D(u_sampler0, vTextureCoord.xy);"," } else if (vTextureCoord.z == 1.) {"," gl_FragColor = texture2D(u_sampler1, vTextureCoord.xy);"," } else if (vTextureCoord.z == 2.) {"," gl_FragColor = texture2D(u_sampler2, vTextureCoord.xy);"," } else if (vTextureCoord.z == 3.) {"," gl_FragColor = texture2D(u_sampler3, vTextureCoord.xy);"," } else { gl_FragColor = vec4(0, 1, 0, 1); }","}"].join("\n")}function i(){return["attribute vec2 a_vertexPos;","attribute float a_customAttributes;","uniform vec2 u_screenSize;","uniform mat4 u_transform;","uniform float u_tilesPerTexture;","varying vec3 vTextureCoord;","void main(void) {"," gl_Position = u_transform * vec4(a_vertexPos/u_screenSize, 0, 1);","float corner = mod(a_customAttributes, 4.);","float tileIndex = mod(floor(a_customAttributes / 4.), u_tilesPerTexture);","float tilesPerRow = sqrt(u_tilesPerTexture);","float tileSize = 1./tilesPerRow;","float tileColumn = mod(tileIndex, tilesPerRow);","float tileRow = floor(tileIndex/tilesPerRow);","if(corner == 0.0) {"," vTextureCoord.xy = vec2(0, 1);","} else if(corner == 1.0) {"," vTextureCoord.xy = vec2(1, 1);","} else if(corner == 2.0) {"," vTextureCoord.xy = vec2(0, 0);","} else {"," vTextureCoord.xy = vec2(1, 0);","}","vTextureCoord *= tileSize;","vTextureCoord.x += tileColumn * tileSize;","vTextureCoord.y += tileRow * tileSize;","vTextureCoord.z = floor(floor(a_customAttributes / 4.)/u_tilesPerTexture);","}"].join("\n")}var a=e("./webglAtlas.js"),u=e("./webgl.js");n.exports=r},{"./webgl.js":57,"./webglAtlas.js":58}],61:[function(e,n,t){function r(e){function n(){x=null}function t(e){x=e}function r(e){return"function"==typeof e&&P.push(e),A}function i(e){return"function"==typeof e&&k.push(e),A}function a(e){return"function"==typeof e&&N.push(e),A}function u(e){return"function"==typeof e&&L.push(e),A}function s(e){return"function"==typeof e&&E.push(e),A}function f(e){return"function"==typeof e&&b.push(e),A}function c(e){return"function"==typeof e&&w.push(e),A}function d(e,n,t){if(e&&e.size){var r=e.position,o=e.size;return r.x-og.byteLength){var e=new ArrayBuffer(2*g.byteLength),n=new Float32Array(e),t=new Uint32Array(e);t.set(y),m=n,y=t,g=e}};return{load:function(a){n=a,r=o(a),e=r.createProgram(v,p),n.useProgram(e),i=r.getLocations(e,["a_vertexPos","a_color","u_screenSize","u_transform"]),n.enableVertexAttribArray(i.vertexPos),n.enableVertexAttribArray(i.color),t=n.createBuffer()},position:function(e,n,t){var r=e.id,o=r*d;m[o]=n.x,m[o+1]=n.y,y[o+2]=e.color,m[o+3]=t.x,m[o+4]=t.y,y[o+5]=e.color},createLink:function(e){x(),h+=1,a=e.id},removeLink:function(e){h>0&&(h-=1),e.id0&&r.copyArrayPart(y,e.id*d,h*d,d)},updateTransform:function(e){c=!0,f=e},updateSize:function(e,n){u=e,s=n,c=!0},render:function(){n.useProgram(e),n.bindBuffer(n.ARRAY_BUFFER,t),n.bufferData(n.ARRAY_BUFFER,g,n.DYNAMIC_DRAW),c&&(c=!1,n.uniformMatrix4fv(i.transform,!1,f),n.uniform2f(i.screenSize,u,s)),n.vertexAttribPointer(i.vertexPos,2,n.FLOAT,!1,3*Float32Array.BYTES_PER_ELEMENT,0),n.vertexAttribPointer(i.color,4,n.UNSIGNED_BYTE,!0,3*Float32Array.BYTES_PER_ELEMENT,8),n.drawArrays(n.LINES,0,2*h),a=h-1},bringToFront:function(e){a>e.id&&r.swapArrayPart(m,e.id*d,a*d,d),a>0&&(a-=1)},getFrontLinkId:function(){return a}}}var o=e("./webgl.js");n.exports=r},{"./webgl.js":57}],64:[function(e,n,t){function r(){function e(){if((P+1)*w>=L.byteLength){var e=new ArrayBuffer(2*L.byteLength),n=new Float32Array(e),t=new Uint32Array(e);t.set(k),N=n,k=t,L=e}}function n(e){d=e,v=o(e),c=v.createProgram(E,b),d.useProgram(c),p=v.getLocations(c,["a_vertexPos","a_color","u_screenSize","u_transform"]), +d.enableVertexAttribArray(p.vertexPos),d.enableVertexAttribArray(p.color),l=d.createBuffer()}function t(e,n){var t=e.id;N[t*x]=n.x,N[t*x+1]=-n.y,N[t*x+2]=e.size,k[t*x+3]=e.color}function r(e){y=!0,m=e}function i(e,n){h=e,g=n,y=!0}function a(e){P>0&&(P-=1),e.id0&&v.copyArrayPart(k,e.id*x,P*x,x)}function u(){e(),P+=1}function s(){}function f(){d.useProgram(c),d.bindBuffer(d.ARRAY_BUFFER,l),d.bufferData(d.ARRAY_BUFFER,L,d.DYNAMIC_DRAW),y&&(y=!1,d.uniformMatrix4fv(p.transform,!1,m),d.uniform2f(p.screenSize,h,g)),d.vertexAttribPointer(p.vertexPos,3,d.FLOAT,!1,x*Float32Array.BYTES_PER_ELEMENT,0),d.vertexAttribPointer(p.color,4,d.UNSIGNED_BYTE,!0,x*Float32Array.BYTES_PER_ELEMENT,12),d.drawArrays(d.POINTS,0,P)}var c,d,l,p,v,h,g,m,y,x=4,w=3*Float32Array.BYTES_PER_ELEMENT+Uint32Array.BYTES_PER_ELEMENT,b=["precision mediump float;","varying vec4 color;","void main(void) {"," gl_FragColor = color;","}"].join("\n"),E=["attribute vec3 a_vertexPos;","attribute vec4 a_color;","uniform vec2 u_screenSize;","uniform mat4 u_transform;","varying vec4 color;","void main(void) {"," gl_Position = u_transform * vec4(a_vertexPos.xy/u_screenSize, 0, 1);"," gl_PointSize = a_vertexPos.z * u_transform[0][0];"," color = a_color.abgr;","}"].join("\n"),L=new ArrayBuffer(16*w),N=new Float32Array(L),k=new Uint32Array(L),P=0;return{load:n,position:t,updateTransform:r,updateSize:i,removeNode:a,createNode:u,replaceProperties:s,render:f}}var o=e("./webgl.js");n.exports=r},{"./webgl.js":57}],65:[function(e,n,t){function r(e,n){return{size:"number"==typeof e?e:10,color:o(n)}}var o=e("./parseColor.js");n.exports=r},{"./parseColor.js":55}],66:[function(e,n,t){n.exports="0.10.1"},{}]},{},[1])(1)}); \ No newline at end of file From fccdfe9bdb82ea68b5a769206eb55cd12dfa92ef Mon Sep 17 00:00:00 2001 From: Andriy Kashcha Date: Tue, 22 Oct 2019 20:12:37 -0700 Subject: [PATCH 27/49] 0.11.0 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 9937fbf..763d3de 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "vivagraphjs", - "version": "0.10.1", + "version": "0.11.0", "description": "Graph Drawing Library", "main": "src/viva", "directories": { From 8a8f536f69e9d5825e26e941d79f3b7b1389eb74 Mon Sep 17 00:00:00 2001 From: Joaquin Lovera Date: Wed, 23 Oct 2019 17:24:32 +0200 Subject: [PATCH 28/49] Optional parameter "tilesPerTexture" to webglImageNodeProgram() function --- src/WebGL/webglImageNodeProgram.js | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/WebGL/webglImageNodeProgram.js b/src/WebGL/webglImageNodeProgram.js index 68d8547..bb0d53d 100644 --- a/src/WebGL/webglImageNodeProgram.js +++ b/src/WebGL/webglImageNodeProgram.js @@ -12,13 +12,16 @@ module.exports = webglImageNodeProgram; /** * Defines simple UI for nodes in webgl renderer. Each node is rendered as an image. + * + * @param {number} tilesPerTexture + * */ -function webglImageNodeProgram() { +function webglImageNodeProgram(tilesPerTexture) { // WebGL is gian state machine, we store some properties of the state here: var ATTRIBUTES_PER_PRIMITIVE = 18; var nodesFS = createNodeFragmentShader(); var nodesVS = createNodeVertexShader(); - var tilesPerTexture = 1024; // TODO: Get based on max texture size + var tilesPerTexture = tilesPerTexture || 1024; // TODO: Get based on max texture size var atlas; var program; var gl; From c3e91bf819a8142939eb06fe3e961fd57d69916e Mon Sep 17 00:00:00 2001 From: Joaquin Lovera Date: Thu, 24 Oct 2019 13:31:19 +0200 Subject: [PATCH 29/49] Fixed error when two or more nodes are join, mouse leave event don't work right because only emit the mouse leave event of the last node --- src/WebGL/webglInputEvents.js | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/WebGL/webglInputEvents.js b/src/WebGL/webglInputEvents.js index a4654f1..381b80b 100644 --- a/src/WebGL/webglInputEvents.js +++ b/src/WebGL/webglInputEvents.js @@ -188,6 +188,9 @@ function webglInputEvents(webglGraphics) { node = getNodeAtClientPos(pos); if (node && lastFound !== node) { + if(lastFound){ + invoke(mouseLeaveCallback, [lastFound]); + } lastFound = node; cancelBubble = cancelBubble || invoke(mouseEnterCallback, [lastFound]); } else if (node === null && lastFound !== node) { From bce42fc4390e4257aad715a3e1ed702bb80f2228 Mon Sep 17 00:00:00 2001 From: Andriy Kashcha Date: Sun, 27 Oct 2019 14:23:06 -0700 Subject: [PATCH 30/49] rebuilt --- dist/vivagraph.js | 10 +- dist/vivagraph.min.js | 4 +- package-lock.json | 4582 +++++++++++++++++++++++++++++++++++++++++ 3 files changed, 4592 insertions(+), 4 deletions(-) create mode 100644 package-lock.json diff --git a/dist/vivagraph.js b/dist/vivagraph.js index 2839752..8124757 100644 --- a/dist/vivagraph.js +++ b/dist/vivagraph.js @@ -6434,13 +6434,16 @@ module.exports = webglImageNodeProgram; /** * Defines simple UI for nodes in webgl renderer. Each node is rendered as an image. + * + * @param {number} tilesPerTexture + * */ -function webglImageNodeProgram() { +function webglImageNodeProgram(tilesPerTexture) { // WebGL is gian state machine, we store some properties of the state here: var ATTRIBUTES_PER_PRIMITIVE = 18; var nodesFS = createNodeFragmentShader(); var nodesVS = createNodeVertexShader(); - var tilesPerTexture = 1024; // TODO: Get based on max texture size + var tilesPerTexture = tilesPerTexture || 1024; // TODO: Get based on max texture size var atlas; var program; var gl; @@ -6874,6 +6877,9 @@ function webglInputEvents(webglGraphics) { node = getNodeAtClientPos(pos); if (node && lastFound !== node) { + if(lastFound){ + invoke(mouseLeaveCallback, [lastFound]); + } lastFound = node; cancelBubble = cancelBubble || invoke(mouseEnterCallback, [lastFound]); } else if (node === null && lastFound !== node) { diff --git a/dist/vivagraph.min.js b/dist/vivagraph.min.js index 5ef7186..6872ddd 100644 --- a/dist/vivagraph.min.js +++ b/dist/vivagraph.min.js @@ -1,3 +1,3 @@ !function(e){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=e();else if("function"==typeof define&&define.amd)define([],e);else{var n;"undefined"!=typeof window?n=window:"undefined"!=typeof global?n=global:"undefined"!=typeof self&&(n=self),n.Viva=e()}}(function(){return function e(n,t,r){function o(a,u){if(!t[a]){if(!n[a]){var s="function"==typeof require&&require;if(!u&&s)return s(a,!0);if(i)return i(a,!0);var f=new Error("Cannot find module '"+a+"'");throw f.code="MODULE_NOT_FOUND",f}var c=t[a]={exports:{}};n[a][0].call(c.exports,function(e){var t=n[a][1][e];return o(t?t:e)},c,c.exports,e,n,t,r)}return t[a].exports}for(var i="function"==typeof require&&require,a=0;a=0==m>=4?null:(f=u-i,d=o-a,p=a*i-o*u,v=f*e+d*n+p,h=f*t+d*r+p,0!==v&&0!==h&&v>=0==h>=0?null:(y=s*d-f*c,0===y?null:(x=y<0?-y/2:y/2,x=0,w=c*p-d*l,b.x=(w<0?w-x:w+x)/y,w=f*l-s*p,b.y=(w<0?w-x:w+x)/y,b)))}n.exports=r},{}],4:[function(e,n,t){n.exports.degree=e("./src/degree.js"),n.exports.betweenness=e("./src/betweenness.js"),n.exports.closeness=e("./src/closeness.js"),n.exports.eccentricity=e("./src/eccentricity.js")},{"./src/betweenness.js":5,"./src/closeness.js":6,"./src/degree.js":7,"./src/eccentricity.js":8}],5:[function(e,n,t){function r(e,n){function t(e){h[e]/=2}function r(e){h[e.id]=0}function o(e){s=e.id,u(s),i()}function i(){for(e.forEachNode(a);c.length;){for(var n=c.pop(),t=(1+v[n])/p[n],r=d[n],o=0;o0?f[a]=(n-1)/t:f[a]=0}function i(t){function r(e){var n=e.id;s[n]=-1}function o(e){var n=e.id;s[n]===-1&&(s[n]=s[i]+1,u.push(n))}for(e.forEachNode(r),s[t]=0,u.push(t);u.length;){var i=u.shift();e.forEachLinkedNode(i,o,n)}}var a,u=[],s=Object.create(null),f=Object.create(null);return e.forEachNode(t),e.forEachNode(r),f}n.exports=r},{}],7:[function(e,n,t){function r(e,n){function t(n){var t=e.getLinks(n.id);u[n.id]=r(t,n.id)}var r,u=Object.create(null);if(n=(n||"both").toLowerCase(),"both"===n||"inout"===n)r=a;else if("in"===n)r=o;else{if("out"!==n)throw new Error("Expected centrality degree kind is: in, out or both");r=i}return e.forEachNode(t),u}function o(e,n){var t=0;if(!e)return t;for(var r=0;r1&&(o=Array.prototype.splice.call(arguments,1));for(var i=0;i0&&i.addLink(a,r-1+o*e),o>0&&i.addLink(a,r+(o-1)*e)}return i}function s(e,t,r){if(e<1||t<1||r<1)throw new Error("Invalid number of nodes in grid3 graph");var o,i,a,u=n();if(1===e&&1===t&&1===r)return u.addNode(0),u;for(a=0;a0&&u.addLink(f,o-1+i*e+s),i>0&&u.addLink(f,o+(i-1)*e+s),a>0&&u.addLink(f,o+i*e+(a-1)*e*t)}return u}function f(e){if(e<0)throw new Error("Invalid number of nodes in balanced tree");var t,r=n(),o=Math.pow(2,e);for(0===e&&r.addNode(1),t=1;t= 0");var t,r=n();for(t=0;t0&&o.addLink(i*t,i*t-1);return o.addLink(0,o.getNodesCount()-1),o}function l(t,r,o,i){if(r>=t)throw new Error("Choose smaller `k`. It cannot be larger than number of nodes `n`");var a,u,s=e("ngraph.random").random(i||42),f=n();for(a=0;a=1||0===e);return n*Math.sqrt(-2*Math.log(e)/e)}function a(){var e=this.seed;return e=e+2127912214+(e<<12)&4294967295,e=4294967295&(3345072700^e^e>>>19),e=e+374761393+(e<<5)&4294967295,e=4294967295&(e+3550635116^e<<9),e=e+4251993797+(e<<3)&4294967295,e=4294967295&(3042594569^e^e>>>16),this.seed=e,(268435455&e)/268435456}function u(e){return Math.floor(this.nextDouble()*e)}function s(e,n){function t(){var n,t,r;for(n=e.length-1;n>0;--n)t=i.next(n+1),r=e[t],e[t]=e[n],e[n]=r;return e}function o(n){var t,r,o;for(t=e.length-1;t>0;--t)r=i.next(t+1),o=e[r],e[r]=e[t],e[t]=o,n(o);e.length&&n(e[0])}var i=n||r();if("function"!=typeof i.next)throw new Error("customRandom does not match expected API: next() function is missing");return{forEach:o,shuffle:t}}n.exports=r,n.exports.random=r,n.exports.randomIterator=s,o.prototype.next=u,o.prototype.nextDouble=a,o.prototype.uniform=a,o.prototype.gaussian=i},{}],16:[function(e,n,t){function r(e){function n(){function e(){return q.beginUpdate=F=k,q.endUpdate=G=P,B=t,O=r,q.on=n,n.apply(q,arguments)}var n=q.on;q.on=e}function t(e,n){R.push({link:e,changeType:n})}function r(e,n){R.push({node:e,changeType:n})}function c(e,n){if(void 0===e)throw new Error("Invalid node identifier");F();var t=d(e);return t?(t.data=n,O(t,"update")):(t=new i(e,n),S++,O(t,"add")),I[e]=t,G(),t}function d(e){return I[e]}function l(e){var n=d(e);if(!n)return!1;F();var t=n.links;if(t){n.links=null;for(var r=0;r=0&&t.links.splice(n,1)),r&&(n=o(e,r.links),n>=0&&r.links.splice(n,1)),B(e,"remove"),G(),!0}function y(e,n){var t,r=d(e);if(!r||!r.links)return null;for(t=0;t0&&(q.fire("changed",R),R.length=0)}function j(){return Object.keys?A:_}function A(e){if("function"==typeof e)for(var n=Object.keys(I),t=0;t=0?i:-1,o);return v.push(a),a},getTotalMovement:function(){return w},removeSpring:function(e){if(e){var n=v.indexOf(e);return n>-1?(v.splice(n,1),!0):void 0}},getBestNewBodyPosition:function(e){return g.getBestNewPosition(e)},getBBox:function(){return x&&(g.update(),x=!1),g.box},invalidateBBox:function(){x=!0},gravity:function(e){return void 0!==e?(n.gravity=e,h.options({gravity:e}),this):n.gravity},theta:function(e){return void 0!==e?(n.theta=e,h.options({theta:e}),this):n.theta}};return o(n,b),a(b),b}n.exports=r},{"./lib/bounds":20,"./lib/createBody":21,"./lib/dragForce":22,"./lib/eulerIntegrator":23,"./lib/spring":24,"./lib/springForce":25,"ngraph.events":9,"ngraph.expose":10,"ngraph.merge":17,"ngraph.quadtreebh":26}],20:[function(e,n,t){n.exports=function(n,t){function r(){var e=n.length;if(0!==e){for(var t=Number.MAX_VALUE,r=Number.MAX_VALUE,o=Number.MIN_VALUE,a=Number.MIN_VALUE;e--;){var u=n[e];u.isPinned?(u.pos.x=u.prevPos.x,u.pos.y=u.prevPos.y):(u.prevPos.x=u.pos.x,u.prevPos.y=u.pos.y),u.pos.xo&&(o=u.pos.x),u.pos.ya&&(a=u.pos.y)}i.x1=t,i.x2=o,i.y1=r,i.y2=a}}var o=e("ngraph.random").random(42),i={x1:0,y1:0,x2:0,y2:0};return{box:i,update:r,reset:function(){i.x1=i.y1=0,i.x2=i.y2=0},getBestNewPosition:function(e){var n=i,r=0,a=0;if(e.length){for(var u=0;u1&&(s.velocity.x=c/l,s.velocity.y=d/l),r=n*s.velocity.x,i=n*s.velocity.y,s.pos.x+=r,s.pos.y+=i,o+=Math.abs(r),a+=Math.abs(i)}return(o*o+a*a)/u}n.exports=r},{}],24:[function(e,n,t){function r(e,n,t,r,o){this.from=e,this.to=n,this.length=t,this.coeff=r,this.weight="number"==typeof o?o:1}n.exports=r},{}],25:[function(e,n,t){n.exports=function(n){var t=e("ngraph.merge"),r=e("ngraph.random").random(42),o=e("ngraph.expose");n=t(n,{springCoeff:2e-4,springLength:80});var i={update:function(e){var t=e.from,o=e.to,i=e.length<0?n.springLength:e.length,a=o.pos.x-t.pos.x,u=o.pos.y-t.pos.y,s=Math.sqrt(a*a+u*u);0===s&&(a=(r.nextDouble()-.5)/50,u=(r.nextDouble()-.5)/50,s=Math.sqrt(a*a+u*u));var f=s-i,c=(!e.coeff||e.coeff<0?n.springCoeff:e.coeff)*f/s*e.weight;t.force.x+=c*a,t.force.y+=c*u,o.force.x-=c*a,o.force.y-=c*u}};return o(n,i,["springCoeff","springLength"]),i}},{"ngraph.expose":10,"ngraph.merge":17,"ngraph.random":30}],26:[function(e,n,t){function r(e,n){return 0===n?e.quad0:1===n?e.quad1:2===n?e.quad2:3===n?e.quad3:null}function o(e,n,t){0===n?e.quad0=t:1===n?e.quad1=t:2===n?e.quad2=t:3===n&&(e.quad3=t)}n.exports=function(n){function t(){var e=g[m];return e?(e.quad0=null,e.quad1=null,e.quad2=null,e.quad3=null,e.body=null,e.mass=e.massX=e.massY=0,e.left=e.right=e.top=e.bottom=0):(e=new f,g[m]=e),++m,e}function i(e){var n,t,r,o,i=p,a=0,u=0,f=1,c=0,d=1;for(i[0]=y;f;){var v=i[c],g=v.body;f-=1,c+=1;var m=g!==e;g&&m?(t=g.pos.x-e.pos.x,r=g.pos.y-e.pos.y,o=Math.sqrt(t*t+r*r),0===o&&(t=(s.nextDouble()-.5)/50,r=(s.nextDouble()-.5)/50,o=Math.sqrt(t*t+r*r)),n=l*g.mass*e.mass/(o*o*o),a+=n*t,u+=n*r):m&&(t=v.massX/v.mass-e.pos.x,r=v.massY/v.mass-e.pos.y,o=Math.sqrt(t*t+r*r),0===o&&(t=(s.nextDouble()-.5)/50,r=(s.nextDouble()-.5)/50,o=Math.sqrt(t*t+r*r)),(v.right-v.left)/oi&&(i=f),ca&&(a=c)}var d=i-r,l=a-o;for(d>l?a=o+d:i=r+l,m=0,y=t(),y.left=r,y.right=i,y.top=o,y.bottom=a,n=s-1,n>=0&&(y.body=e[n]);n--;)u(e[n],y)}function u(e){for(v.reset(),v.push(y,e);!v.isEmpty();){var n=v.pop(),i=n.node,a=n.body;if(i.body){var u=i.body;if(i.body=null,d(u.pos,a.pos)){var f=3;do{var c=s.nextDouble(),l=(i.right-i.left)*c,p=(i.bottom-i.top)*c;u.pos.x=i.left+l,u.pos.y=i.top+p,f-=1}while(f>0&&d(u.pos,a.pos));if(0===f&&d(u.pos,a.pos))return}v.push(i,u),v.push(i,a)}else{var h=a.pos.x,g=a.pos.y;i.mass=i.mass+a.mass,i.massX=i.massX+a.mass*h,i.massY=i.massY+a.mass*g;var m=0,x=i.left,w=(i.right+x)/2,b=i.top,E=(i.bottom+b)/2;h>w&&(m+=1,x=w,w=i.right),g>E&&(m+=2,b=E,E=i.bottom);var L=r(i,m);L?v.push(L,a):(L=t(),L.left=x,L.top=b,L.right=w,L.bottom=E,L.body=a,o(i,m,L))}}}n=n||{},n.gravity="number"==typeof n.gravity?n.gravity:-1,n.theta="number"==typeof n.theta?n.theta:.8;var s=e("ngraph.random").random(1984),f=e("./node"),c=e("./insertStack"),d=e("./isSamePosition"),l=n.gravity,p=[],v=new c,h=n.theta,g=[],m=0,y=t();return{insertBodies:a,getRoot:function(){return y},updateBodyForce:i,options:function(e){return e?("number"==typeof e.gravity&&(l=e.gravity),"number"==typeof e.theta&&(h=e.theta),this):{gravity:l,theta:h}}}}},{"./insertStack":27,"./isSamePosition":28,"./node":29,"ngraph.random":30}],27:[function(e,n,t){function r(){this.stack=[],this.popIdx=0}function o(e,n){this.node=e,this.body=n}n.exports=r,r.prototype={isEmpty:function(){return 0===this.popIdx},push:function(e,n){var t=this.stack[this.popIdx];t?(t.node=e,t.body=n):this.stack[this.popIdx]=new o(e,n),++this.popIdx},pop:function(){if(this.popIdx>0)return this.stack[--this.popIdx]},reset:function(){this.popIdx=0}}},{}],28:[function(e,n,t){n.exports=function(e,n){var t=Math.abs(e.x-n.x),r=Math.abs(e.y-n.y);return t<1e-8&&r<1e-8}},{}],29:[function(e,n,t){n.exports=function(){this.body=null,this.quad0=null,this.quad1=null,this.quad2=null,this.quad3=null,this.mass=0,this.massX=0,this.massY=0,this.left=0,this.top=0,this.bottom=0,this.right=0}},{}],30:[function(e,n,t){function r(e){var n="number"==typeof e?e:+new Date,t=function(){return n=n+2127912214+(n<<12)&4294967295,n=4294967295&(3345072700^n^n>>>19),n=n+374761393+(n<<5)&4294967295,n=4294967295&(n+3550635116^n<<9),n=n+4251993797+(n<<3)&4294967295,n=4294967295&(3042594569^n^n>>>16),(268435455&n)/268435456};return{next:function(e){return Math.floor(t()*e)},nextDouble:function(){return t()}}}function o(e,n){var t=n||r();if("function"!=typeof t.next)throw new Error("customRandom does not match expected API: next() function is missing");return{forEach:function(n){var r,o,i;for(r=e.length-1;r>0;--r)o=t.next(r+1),i=e[o],e[o]=e[r],e[r]=i,n(i);e.length&&n(e[0])},shuffle:function(){var n,r,o;for(n=e.length-1;n>0;--n)r=t.next(n+1),o=e[r],e[r]=e[n],e[n]=o;return e}}}n.exports={random:r,randomIterator:o}},{}],31:[function(e,n,t){function r(e,n,t){function r(e){u.nodes.push(s(e))}function o(e){u.links.push(f(e))}function i(e){var n={id:e.id};return void 0!==e.data&&(n.data=e.data),n}function a(e){var n={fromId:e.fromId,toId:e.toId};return void 0!==e.data&&(n.data=e.data),n}var u={nodes:[],links:[]},s=n||i,f=t||a;return e.forEachNode(r),e.forEachLink(o),JSON.stringify(u)}n.exports=r},{}],32:[function(e,n,t){function r(e,n){var t=o(e);if(void 0===n)return t;for(var r=Object.keys(n),i=0;iv&&(r=1),u(e,r,{x:e.touches[0].clientX,y:e.touches[0].clientY}),v=t,m(e),y(e)}},j=function(e){p=!1,o.off("touchmove",P),o.off("touchend",j),o.off("touchcancel",j),c=null,r&&r(e)},A=function(e,t){m(e),y(e),d=t.clientX,l=t.clientY,c=e.target||e.srcElement,n&&n(e,{x:d,y:l}),p||(p=!0,o.on("touchmove",P),o.on("touchend",j),o.on("touchcancel",j))},_=function(e){return 1===e.touches.length?A(e,e.touches[0]):void(2===e.touches.length&&(m(e),y(e),v=k(e.touches[0],e.touches[1])))};return e.addEventListener("mousedown",b),e.addEventListener("touchstart",_),{onStart:function(e){return n=e,this},onDrag:function(e){return t=e,this},onStop:function(e){return r=e,this},onScroll:function(e){return N(e),this},release:function(){e.removeEventListener("mousedown",b),e.removeEventListener("touchstart",_),o.off("mousemove",w),o.off("mouseup",E),o.off("touchmove",P),o.off("touchend",j),o.off("touchcancel",j),N(null)}}}n.exports=r;var o=e("../Utils/documentEvents.js"),i=e("../Utils/browserInfo.js"),a=e("../Utils/findElementPosition.js")},{"../Utils/browserInfo.js":43,"../Utils/documentEvents.js":44,"../Utils/findElementPosition.js":45}],40:[function(e,n,t){function r(e,n){var t=o(n),r=null,i={},a={x:0,y:0};return t.mouseDown(function(e,n){r=e,a.x=n.clientX,a.y=n.clientY,t.mouseCapture(r);var o=i[e.id];return o&&o.onStart&&o.onStart(n,a),!0}).mouseUp(function(e){t.releaseMouseCapture(r),r=null;var n=i[e.id];return n&&n.onStop&&n.onStop(),!0}).mouseMove(function(e,n){if(r){var t=i[r.id];return t&&t.onDrag&&t.onDrag(n,{x:n.clientX-a.x,y:n.clientY-a.y}),a.x=n.clientX,a.y=n.clientY,!0}}),{bindDragNDrop:function(e,n){i[e.id]=n,n||delete i[e.id]}}}n.exports=r;var o=e("../WebGL/webglInputEvents.js")},{"../WebGL/webglInputEvents.js":61}],41:[function(e,n,t){function r(e,n){function t(e){return d[e]}n=o(n,{maxX:1024,maxY:1024,seed:"Deterministic randomness made me do this"});var r=i(n.seed),u=new a(Number.MAX_VALUE,Number.MAX_VALUE,Number.MIN_VALUE,Number.MIN_VALUE),s={},f=function(e){return{x:r.next(n.maxX),y:r.next(n.maxY)}},c=function(e,n){e.xn.x2&&(n.x2=e.x),e.yn.y2&&(n.y2=e.y)},d="function"==typeof Object.create?Object.create(null):{},l=function(e){d[e.id]=f(e),c(d[e.id],u)},p=function(){0!==e.getNodesCount()&&(u.x1=Number.MAX_VALUE,u.y1=Number.MAX_VALUE,u.x2=Number.MIN_VALUE,u.y2=Number.MIN_VALUE,e.forEachNode(l))},v=function(e){s[e.id]=e},h=function(e){for(var n=0;n=0:"boolean"!=typeof q||q}function r(){G=G||window.document.body,O=O||i(e,{springLength:80,springCoeff:2e-4}),F=F||a(e,{container:G}),n.hasOwnProperty("renderLinks")||(n.renderLinks=!0),n.prerender=n.prerender||0,U=(F.inputManager||s)(e,F)}function l(){F.beginRender(),n.renderLinks&&F.renderLinks(),F.renderNodes(),F.endRender()}function p(){return X=O.step()&&!V,l(),!X}function v(e){R||(R=void 0!==e?f(function(){if(e-=1,e<0){var n=!1;return n}return p()},M):f(p,M))}function h(){W||(X=!1,R.restart())}function g(){if("number"==typeof n.prerender&&n.prerender>0)for(var e=0;e0?n.insertBefore(r,n.firstChild):n.appendChild(r),r},releaseLink:function(e){var t=d[e.id];t&&(n.removeChild(t),delete d[e.id])},addNode:function(e,t){var r=l(e);if(r)return r.position=t,r.node=e,c[e.id]=r,n.appendChild(r),r},releaseNode:function(e){var t=c[e.id];t&&(n.removeChild(t),delete c[e.id])},renderNodes:function(){for(var e in c)if(c.hasOwnProperty(e)){var n=c[e];m.x=n.position.x,m.y=n.position.y,p(n,m,n.node)}},renderLinks:function(){for(var e in d)if(d.hasOwnProperty(e)){var n=d[e];y.x=n.position.from.x,y.y=n.position.from.y,x.x=n.position.to.x,x.y=n.position.to.y,h(n,y,x,n.link)}},getGraphicsRoot:function(e){return"function"==typeof e&&(t?e(t):r=e),t},getSvgRoot:function(){return t}};return i(b),b}n.exports=r;var o=e("simplesvg"),i=e("ngraph.events"),a=e("../Input/domInputManager.js")},{"../Input/domInputManager.js":38,"ngraph.events":9,simplesvg:32}],54:[function(e,n,t){function r(e){e=c(e,{enableBlending:!0,preserveDrawingBuffer:!1,clearColor:!1,clearColorValue:{r:1,g:1,b:1,a:1}});var n,t,r,d,l,p,v,h,g=0,m=0,y=[1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1],x=[],w=[],b={},E={},L=i(),N=a(),k=function(e){return u()},P=function(e){return s(3014898687)},j=function(){L.updateTransform(y),N.updateTransform(y)},A=function(){y=[1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1]},_=function(){n&&t&&(d=t.width=Math.max(n.offsetWidth,1),l=t.height=Math.max(n.offsetHeight,1),r&&r.viewport(0,0,d,l),L&&L.updateSize(d/2,l/2),N&&N.updateSize(d/2,l/2))},I=function(e){e.fire("rescaled")};t=window.document.createElement("canvas");var T={getLinkUI:function(e){return E[e]},getNodeUI:function(e){return b[e]},node:function(e){if("function"==typeof e)return k=e,this},link:function(e){if("function"==typeof e)return P=e,this},placeNode:function(e){return p=e,this},placeLink:function(e){return v=e,this},inputManager:o,beginRender:function(){},endRender:function(){m>0&&L.render(),g>0&&N.render()},bringLinkToFront:function(e){var n,t,r=L.getFrontLinkId();L.bringToFront(e),r>e.id&&(n=e.id,t=w[r],w[r]=w[n],w[r].id=r,w[n]=t,w[n].id=n)},graphCenterChanged:function(e,n){y[12]=2*e/d-1,y[13]=1-2*n/l,j()},addLink:function(e,n){var t=m++,r=P(e);return r.id=t,r.pos=n,L.createLink(r),w[t]=r,E[e.id]=r,r},addNode:function(e,n){var t=g++,r=k(e);return r.id=t,r.position=n,r.node=e,N.createNode(r),x[t]=r,b[e.id]=r,r},translateRel:function(e,n){y[12]+=2*y[0]*e/d/y[0],y[13]-=2*y[5]*n/l/y[5],j()},scale:function(e,n){var t=2*n.x/d-1,r=1-2*n.y/l;return t-=y[12],r-=y[13],y[12]+=t*(1-e),y[13]+=r*(1-e),y[0]*=e,y[5]*=e,j(),I(this),y[0]},resetScale:function(){return A(),r&&(_(),j()),this},updateSize:_,init:function(o){var i={};if(e.preserveDrawingBuffer&&(i.preserveDrawingBuffer=!0),n=o,_(),A(),n.appendChild(t),r=t.getContext("experimental-webgl",i),!r){var a="Could not initialize WebGL. Seems like the browser doesn't support it.";throw window.alert(a),a}if(e.enableBlending&&(r.blendFunc(r.SRC_ALPHA,r.ONE_MINUS_SRC_ALPHA),r.enable(r.BLEND)),e.clearColor){var u=e.clearColorValue;r.clearColor(u.r,u.g,u.b,u.a),this.beginRender=function(){r.clear(r.COLOR_BUFFER_BIT)}}L.load(r),L.updateSize(d/2,l/2),N.load(r),N.updateSize(d/2,l/2),j(),"function"==typeof h&&h(t)},release:function(e){t&&e&&e.removeChild(t)},isSupported:function(){var e=window.document.createElement("canvas"),n=e&&e.getContext&&e.getContext("experimental-webgl");return n},releaseLink:function(e){m>0&&(m-=1);var n=E[e.id];delete E[e.id],L.removeLink(n);var t=n.id;if(t0&&(g-=1);var n=b[e.id];delete b[e.id],N.removeNode(n);var t=n.id;if(te.length){var r=new Float32Array(e.length*t*2);return r.set(e),r}return e}function a(n,t){for(var r={},o=0;o=w.length&&s();var i=w[r.textureNumber];i.ctx.drawImage(n,r.col*g,r.row*g,g,g),b[e]=n.src,y[n.src]=o,i.isDirty=!0,t(o)}function c(n){var t=n/e<<0,r=n%e,o=r/h<<0,i=r%h;return{textureNumber:t,row:o,col:i}}function d(){E.isDirty=!0,x=0,v=null}function l(){v&&(window.clearTimeout(v),x+=1,v=null),x>10?d():v=window.setTimeout(d,400)}function p(e,n){var t=w[e.textureNumber].canvas,r=w[n.textureNumber].ctx,o=n.col*g,i=n.row*g;r.drawImage(t,e.col*g,e.row*g,g,g,o,i,g,g),w[e.textureNumber].isDirty=!0,w[n.textureNumber].isDirty=!0}var v,h=Math.sqrt(e||1024)<<0,g=h,m=1,y={},x=0,w=[],b=[];if(!o(e))throw"Tiles per texture should be power of two.";var E={isDirty:!1,clearDirty:n,remove:t,getTextures:r,getCoordinates:a,load:u};return E}function o(e){return 0===(e&e-1)}var i=e("./texture.js");n.exports=r},{"./texture.js":56}],59:[function(e,n,t){function r(e,n){return{_texture:0,_offset:0,size:"number"==typeof e?e:32,src:n}}n.exports=r},{}],60:[function(e,n,t){function r(){function e(e,n){e.nativeObject&&g.deleteTexture(e.nativeObject);var t=g.createTexture();g.activeTexture(g["TEXTURE"+n]),g.bindTexture(g.TEXTURE_2D,t),g.texImage2D(g.TEXTURE_2D,0,g.RGBA,g.RGBA,g.UNSIGNED_BYTE,e.canvas),g.texParameteri(g.TEXTURE_2D,g.TEXTURE_MAG_FILTER,g.LINEAR),g.texParameteri(g.TEXTURE_2D,g.TEXTURE_MIN_FILTER,g.LINEAR_MIPMAP_NEAREST),g.generateMipmap(g.TEXTURE_2D),g.uniform1i(x["sampler"+n],n),e.nativeObject=t}function n(){if(v.isDirty){var n,t=v.getTextures();for(n=0;n0&&(A-=1),e.id0&&(e.src&&v.remove(e.src),y.copyArrayPart(_,e.id*N,A*N,N))}function c(e,n){n._offset=e._offset}function d(e){L=!0,E=e}function l(e,n){w=e,b=n,L=!0}function p(){g.useProgram(h),g.bindBuffer(g.ARRAY_BUFFER,m),g.bufferData(g.ARRAY_BUFFER,_,g.DYNAMIC_DRAW),L&&(L=!1,g.uniformMatrix4fv(x.transform,!1,E),g.uniform2f(x.screenSize,w,b)),g.vertexAttribPointer(x.vertexPos,2,g.FLOAT,!1,3*Float32Array.BYTES_PER_ELEMENT,0),g.vertexAttribPointer(x.customAttributes,1,g.FLOAT,!1,3*Float32Array.BYTES_PER_ELEMENT,8),n(),g.drawArrays(g.TRIANGLES,0,6*A)}var v,h,g,m,y,x,w,b,E,L,N=18,k=o(),P=i(),j=1024,A=0,_=new Float32Array(64);return{load:t,position:r,createNode:s,removeNode:f,replaceProperties:c,updateTransform:d,updateSize:l,render:p}}function o(){return["precision mediump float;","varying vec4 color;","varying vec3 vTextureCoord;","uniform sampler2D u_sampler0;","uniform sampler2D u_sampler1;","uniform sampler2D u_sampler2;","uniform sampler2D u_sampler3;","void main(void) {"," if (vTextureCoord.z == 0.) {"," gl_FragColor = texture2D(u_sampler0, vTextureCoord.xy);"," } else if (vTextureCoord.z == 1.) {"," gl_FragColor = texture2D(u_sampler1, vTextureCoord.xy);"," } else if (vTextureCoord.z == 2.) {"," gl_FragColor = texture2D(u_sampler2, vTextureCoord.xy);"," } else if (vTextureCoord.z == 3.) {"," gl_FragColor = texture2D(u_sampler3, vTextureCoord.xy);"," } else { gl_FragColor = vec4(0, 1, 0, 1); }","}"].join("\n")}function i(){return["attribute vec2 a_vertexPos;","attribute float a_customAttributes;","uniform vec2 u_screenSize;","uniform mat4 u_transform;","uniform float u_tilesPerTexture;","varying vec3 vTextureCoord;","void main(void) {"," gl_Position = u_transform * vec4(a_vertexPos/u_screenSize, 0, 1);","float corner = mod(a_customAttributes, 4.);","float tileIndex = mod(floor(a_customAttributes / 4.), u_tilesPerTexture);","float tilesPerRow = sqrt(u_tilesPerTexture);","float tileSize = 1./tilesPerRow;","float tileColumn = mod(tileIndex, tilesPerRow);","float tileRow = floor(tileIndex/tilesPerRow);","if(corner == 0.0) {"," vTextureCoord.xy = vec2(0, 1);","} else if(corner == 1.0) {"," vTextureCoord.xy = vec2(1, 1);","} else if(corner == 2.0) {"," vTextureCoord.xy = vec2(0, 0);","} else {"," vTextureCoord.xy = vec2(1, 0);","}","vTextureCoord *= tileSize;","vTextureCoord.x += tileColumn * tileSize;","vTextureCoord.y += tileRow * tileSize;","vTextureCoord.z = floor(floor(a_customAttributes / 4.)/u_tilesPerTexture);","}"].join("\n")}var a=e("./webglAtlas.js"),u=e("./webgl.js");n.exports=r},{"./webgl.js":57,"./webglAtlas.js":58}],61:[function(e,n,t){function r(e){function n(){x=null}function t(e){x=e}function r(e){return"function"==typeof e&&P.push(e),A}function i(e){return"function"==typeof e&&k.push(e),A}function a(e){return"function"==typeof e&&N.push(e),A}function u(e){return"function"==typeof e&&L.push(e),A}function s(e){return"function"==typeof e&&E.push(e),A}function f(e){return"function"==typeof e&&b.push(e),A}function c(e){return"function"==typeof e&&w.push(e),A}function d(e,n,t){if(e&&e.size){var r=e.position,o=e.size;return r.x-og.byteLength){var e=new ArrayBuffer(2*g.byteLength),n=new Float32Array(e),t=new Uint32Array(e);t.set(y),m=n,y=t,g=e}};return{load:function(a){n=a,r=o(a),e=r.createProgram(v,p),n.useProgram(e),i=r.getLocations(e,["a_vertexPos","a_color","u_screenSize","u_transform"]),n.enableVertexAttribArray(i.vertexPos),n.enableVertexAttribArray(i.color),t=n.createBuffer()},position:function(e,n,t){var r=e.id,o=r*d;m[o]=n.x,m[o+1]=n.y,y[o+2]=e.color,m[o+3]=t.x,m[o+4]=t.y,y[o+5]=e.color},createLink:function(e){x(),h+=1,a=e.id},removeLink:function(e){h>0&&(h-=1),e.id0&&r.copyArrayPart(y,e.id*d,h*d,d)},updateTransform:function(e){c=!0,f=e},updateSize:function(e,n){u=e,s=n,c=!0},render:function(){n.useProgram(e),n.bindBuffer(n.ARRAY_BUFFER,t),n.bufferData(n.ARRAY_BUFFER,g,n.DYNAMIC_DRAW),c&&(c=!1,n.uniformMatrix4fv(i.transform,!1,f),n.uniform2f(i.screenSize,u,s)),n.vertexAttribPointer(i.vertexPos,2,n.FLOAT,!1,3*Float32Array.BYTES_PER_ELEMENT,0),n.vertexAttribPointer(i.color,4,n.UNSIGNED_BYTE,!0,3*Float32Array.BYTES_PER_ELEMENT,8),n.drawArrays(n.LINES,0,2*h),a=h-1},bringToFront:function(e){a>e.id&&r.swapArrayPart(m,e.id*d,a*d,d),a>0&&(a-=1)},getFrontLinkId:function(){return a}}}var o=e("./webgl.js");n.exports=r},{"./webgl.js":57}],64:[function(e,n,t){function r(){function e(){if((P+1)*w>=L.byteLength){var e=new ArrayBuffer(2*L.byteLength),n=new Float32Array(e),t=new Uint32Array(e);t.set(k),N=n,k=t,L=e}}function n(e){d=e,v=o(e),c=v.createProgram(E,b),d.useProgram(c),p=v.getLocations(c,["a_vertexPos","a_color","u_screenSize","u_transform"]), -d.enableVertexAttribArray(p.vertexPos),d.enableVertexAttribArray(p.color),l=d.createBuffer()}function t(e,n){var t=e.id;N[t*x]=n.x,N[t*x+1]=-n.y,N[t*x+2]=e.size,k[t*x+3]=e.color}function r(e){y=!0,m=e}function i(e,n){h=e,g=n,y=!0}function a(e){P>0&&(P-=1),e.id0&&v.copyArrayPart(k,e.id*x,P*x,x)}function u(){e(),P+=1}function s(){}function f(){d.useProgram(c),d.bindBuffer(d.ARRAY_BUFFER,l),d.bufferData(d.ARRAY_BUFFER,L,d.DYNAMIC_DRAW),y&&(y=!1,d.uniformMatrix4fv(p.transform,!1,m),d.uniform2f(p.screenSize,h,g)),d.vertexAttribPointer(p.vertexPos,3,d.FLOAT,!1,x*Float32Array.BYTES_PER_ELEMENT,0),d.vertexAttribPointer(p.color,4,d.UNSIGNED_BYTE,!0,x*Float32Array.BYTES_PER_ELEMENT,12),d.drawArrays(d.POINTS,0,P)}var c,d,l,p,v,h,g,m,y,x=4,w=3*Float32Array.BYTES_PER_ELEMENT+Uint32Array.BYTES_PER_ELEMENT,b=["precision mediump float;","varying vec4 color;","void main(void) {"," gl_FragColor = color;","}"].join("\n"),E=["attribute vec3 a_vertexPos;","attribute vec4 a_color;","uniform vec2 u_screenSize;","uniform mat4 u_transform;","varying vec4 color;","void main(void) {"," gl_Position = u_transform * vec4(a_vertexPos.xy/u_screenSize, 0, 1);"," gl_PointSize = a_vertexPos.z * u_transform[0][0];"," color = a_color.abgr;","}"].join("\n"),L=new ArrayBuffer(16*w),N=new Float32Array(L),k=new Uint32Array(L),P=0;return{load:n,position:t,updateTransform:r,updateSize:i,removeNode:a,createNode:u,replaceProperties:s,render:f}}var o=e("./webgl.js");n.exports=r},{"./webgl.js":57}],65:[function(e,n,t){function r(e,n){return{size:"number"==typeof e?e:10,color:o(n)}}var o=e("./parseColor.js");n.exports=r},{"./parseColor.js":55}],66:[function(e,n,t){n.exports="0.10.1"},{}]},{},[1])(1)}); \ No newline at end of file +n[i]);a?a.push(t):a=n[i]=[t]}}}n.exports=r;var u=/{{(.+?)}}/},{}],35:[function(e,n,t){function r(){return"undefined"==typeof DOMParser?{parseFromString:o}:new DOMParser}function o(){throw new Error("DOMParser is not supported by this platform. Please open issue here https://github.com/anvaka/simplesvg")}n.exports=r()},{}],36:[function(e,n,t){function r(){return{betweennessCentrality:o,degreeCentrality:i}}function o(e){var n=u.betweenness(e);return a(n)}function i(e,n){var t=u.degree(e,n);return a(t)}function a(e){function n(n,t){return e[t]-e[n]}function t(n){return{key:n,value:e[n]}}return Object.keys(e).sort(n).map(t)}var u=e("ngraph.centrality");n.exports=r},{"ngraph.centrality":4}],37:[function(e,n,t){function r(){return{density:function(e,n){var t=e.getNodesCount();return 0===t?NaN:n?e.getLinksCount()/(t*(t-1)):2*e.getLinksCount()/(t*(t-1))}}}n.exports=r},{}],38:[function(e,n,t){function r(e,n){function t(e,t){var i;if(t){var a=n.getNodeUI(e.id);i=o(a),"function"==typeof t.onStart&&i.onStart(t.onStart),"function"==typeof t.onDrag&&i.onDrag(t.onDrag),"function"==typeof t.onStop&&i.onStop(t.onStop),r[e.id]=i}else(i=r[e.id])&&(i.release(),delete r[e.id])}var r={};return{bindDragNDrop:t}}n.exports=r;var o=e("./dragndrop.js")},{"./dragndrop.js":39}],39:[function(e,n,t){function r(e){var n,t,r,u,s,f,c,d=0,l=0,p=!1,v=0,h=function(e){var n=0,t=0;return e=e||window.event,e.pageX||e.pageY?(n=e.pageX,t=e.pageY):(e.clientX||e.clientY)&&(n=e.clientX+window.document.body.scrollLeft+window.document.documentElement.scrollLeft,t=e.clientY+window.document.body.scrollTop+window.document.documentElement.scrollTop),[n,t]},g=function(e,n,r){t&&t(e,{x:n-d,y:r-l}),d=n,l=r},m=function(e){e.stopPropagation?e.stopPropagation():e.cancelBubble=!0},y=function(e){e.preventDefault&&e.preventDefault()},x=function(e){return m(e),!1},w=function(e){e=e||window.event,g(e,e.clientX,e.clientY)},b=function(e){if(e=e||window.event,p)return m(e),!1;var t=1===e.button&&null!==window.event||0===e.button;return t?(d=e.clientX,l=e.clientY,c=e.target||e.srcElement,n&&n(e,{x:d,y:l}),o.on("mousemove",w),o.on("mouseup",E),m(e),s=window.document.onselectstart,f=window.document.ondragstart,window.document.onselectstart=x,c.ondragstart=x,!1):void 0},E=function(e){e=e||window.event,o.off("mousemove",w),o.off("mouseup",E),window.document.onselectstart=s,c.ondragstart=f,c=null,r&&r(e)},L=function(n){if("function"==typeof u){n=n||window.event,n.preventDefault&&n.preventDefault(),n.returnValue=!1;var t,r=h(n),o=a(e),i={x:r[0]-o[0],y:r[1]-o[1]};t=n.wheelDelta?n.wheelDelta/360:n.detail/-9,u(n,t,i)}},N=function(n){!u&&n?"webkit"===i.browser?e.addEventListener("mousewheel",L,!1):e.addEventListener("DOMMouseScroll",L,!1):u&&!n&&("webkit"===i.browser?e.removeEventListener("mousewheel",L,!1):e.removeEventListener("DOMMouseScroll",L,!1)),u=n},k=function(e,n){return(e.clientX-n.clientX)*(e.clientX-n.clientX)+(e.clientY-n.clientY)*(e.clientY-n.clientY)},P=function(e){if(1===e.touches.length){m(e);var n=e.touches[0];g(e,n.clientX,n.clientY)}else if(2===e.touches.length){var t=k(e.touches[0],e.touches[1]),r=0;tv&&(r=1),u(e,r,{x:e.touches[0].clientX,y:e.touches[0].clientY}),v=t,m(e),y(e)}},j=function(e){p=!1,o.off("touchmove",P),o.off("touchend",j),o.off("touchcancel",j),c=null,r&&r(e)},A=function(e,t){m(e),y(e),d=t.clientX,l=t.clientY,c=e.target||e.srcElement,n&&n(e,{x:d,y:l}),p||(p=!0,o.on("touchmove",P),o.on("touchend",j),o.on("touchcancel",j))},_=function(e){return 1===e.touches.length?A(e,e.touches[0]):void(2===e.touches.length&&(m(e),y(e),v=k(e.touches[0],e.touches[1])))};return e.addEventListener("mousedown",b),e.addEventListener("touchstart",_),{onStart:function(e){return n=e,this},onDrag:function(e){return t=e,this},onStop:function(e){return r=e,this},onScroll:function(e){return N(e),this},release:function(){e.removeEventListener("mousedown",b),e.removeEventListener("touchstart",_),o.off("mousemove",w),o.off("mouseup",E),o.off("touchmove",P),o.off("touchend",j),o.off("touchcancel",j),N(null)}}}n.exports=r;var o=e("../Utils/documentEvents.js"),i=e("../Utils/browserInfo.js"),a=e("../Utils/findElementPosition.js")},{"../Utils/browserInfo.js":43,"../Utils/documentEvents.js":44,"../Utils/findElementPosition.js":45}],40:[function(e,n,t){function r(e,n){var t=o(n),r=null,i={},a={x:0,y:0};return t.mouseDown(function(e,n){r=e,a.x=n.clientX,a.y=n.clientY,t.mouseCapture(r);var o=i[e.id];return o&&o.onStart&&o.onStart(n,a),!0}).mouseUp(function(e){t.releaseMouseCapture(r),r=null;var n=i[e.id];return n&&n.onStop&&n.onStop(),!0}).mouseMove(function(e,n){if(r){var t=i[r.id];return t&&t.onDrag&&t.onDrag(n,{x:n.clientX-a.x,y:n.clientY-a.y}),a.x=n.clientX,a.y=n.clientY,!0}}),{bindDragNDrop:function(e,n){i[e.id]=n,n||delete i[e.id]}}}n.exports=r;var o=e("../WebGL/webglInputEvents.js")},{"../WebGL/webglInputEvents.js":61}],41:[function(e,n,t){function r(e,n){function t(e){return d[e]}n=o(n,{maxX:1024,maxY:1024,seed:"Deterministic randomness made me do this"});var r=i(n.seed),u=new a(Number.MAX_VALUE,Number.MAX_VALUE,Number.MIN_VALUE,Number.MIN_VALUE),s={},f=function(e){return{x:r.next(n.maxX),y:r.next(n.maxY)}},c=function(e,n){e.xn.x2&&(n.x2=e.x),e.yn.y2&&(n.y2=e.y)},d="function"==typeof Object.create?Object.create(null):{},l=function(e){d[e.id]=f(e),c(d[e.id],u)},p=function(){0!==e.getNodesCount()&&(u.x1=Number.MAX_VALUE,u.y1=Number.MAX_VALUE,u.x2=Number.MIN_VALUE,u.y2=Number.MIN_VALUE,e.forEachNode(l))},v=function(e){s[e.id]=e},h=function(e){for(var n=0;n=0:"boolean"!=typeof q||q}function r(){G=G||window.document.body,O=O||i(e,{springLength:80,springCoeff:2e-4}),F=F||a(e,{container:G}),n.hasOwnProperty("renderLinks")||(n.renderLinks=!0),n.prerender=n.prerender||0,U=(F.inputManager||s)(e,F)}function l(){F.beginRender(),n.renderLinks&&F.renderLinks(),F.renderNodes(),F.endRender()}function p(){return X=O.step()&&!V,l(),!X}function v(e){R||(R=void 0!==e?f(function(){if(e-=1,e<0){var n=!1;return n}return p()},M):f(p,M))}function h(){W||(X=!1,R.restart())}function g(){if("number"==typeof n.prerender&&n.prerender>0)for(var e=0;e0?n.insertBefore(r,n.firstChild):n.appendChild(r),r},releaseLink:function(e){var t=d[e.id];t&&(n.removeChild(t),delete d[e.id])},addNode:function(e,t){var r=l(e);if(r)return r.position=t,r.node=e,c[e.id]=r,n.appendChild(r),r},releaseNode:function(e){var t=c[e.id];t&&(n.removeChild(t),delete c[e.id])},renderNodes:function(){for(var e in c)if(c.hasOwnProperty(e)){var n=c[e];m.x=n.position.x,m.y=n.position.y,p(n,m,n.node)}},renderLinks:function(){for(var e in d)if(d.hasOwnProperty(e)){var n=d[e];y.x=n.position.from.x,y.y=n.position.from.y,x.x=n.position.to.x,x.y=n.position.to.y,h(n,y,x,n.link)}},getGraphicsRoot:function(e){return"function"==typeof e&&(t?e(t):r=e),t},getSvgRoot:function(){return t}};return i(b),b}n.exports=r;var o=e("simplesvg"),i=e("ngraph.events"),a=e("../Input/domInputManager.js")},{"../Input/domInputManager.js":38,"ngraph.events":9,simplesvg:32}],54:[function(e,n,t){function r(e){e=c(e,{enableBlending:!0,preserveDrawingBuffer:!1,clearColor:!1,clearColorValue:{r:1,g:1,b:1,a:1}});var n,t,r,d,l,p,v,h,g=0,m=0,y=[1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1],x=[],w=[],b={},E={},L=i(),N=a(),k=function(e){return u()},P=function(e){return s(3014898687)},j=function(){L.updateTransform(y),N.updateTransform(y)},A=function(){y=[1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1]},_=function(){n&&t&&(d=t.width=Math.max(n.offsetWidth,1),l=t.height=Math.max(n.offsetHeight,1),r&&r.viewport(0,0,d,l),L&&L.updateSize(d/2,l/2),N&&N.updateSize(d/2,l/2))},I=function(e){e.fire("rescaled")};t=window.document.createElement("canvas");var T={getLinkUI:function(e){return E[e]},getNodeUI:function(e){return b[e]},node:function(e){if("function"==typeof e)return k=e,this},link:function(e){if("function"==typeof e)return P=e,this},placeNode:function(e){return p=e,this},placeLink:function(e){return v=e,this},inputManager:o,beginRender:function(){},endRender:function(){m>0&&L.render(),g>0&&N.render()},bringLinkToFront:function(e){var n,t,r=L.getFrontLinkId();L.bringToFront(e),r>e.id&&(n=e.id,t=w[r],w[r]=w[n],w[r].id=r,w[n]=t,w[n].id=n)},graphCenterChanged:function(e,n){y[12]=2*e/d-1,y[13]=1-2*n/l,j()},addLink:function(e,n){var t=m++,r=P(e);return r.id=t,r.pos=n,L.createLink(r),w[t]=r,E[e.id]=r,r},addNode:function(e,n){var t=g++,r=k(e);return r.id=t,r.position=n,r.node=e,N.createNode(r),x[t]=r,b[e.id]=r,r},translateRel:function(e,n){y[12]+=2*y[0]*e/d/y[0],y[13]-=2*y[5]*n/l/y[5],j()},scale:function(e,n){var t=2*n.x/d-1,r=1-2*n.y/l;return t-=y[12],r-=y[13],y[12]+=t*(1-e),y[13]+=r*(1-e),y[0]*=e,y[5]*=e,j(),I(this),y[0]},resetScale:function(){return A(),r&&(_(),j()),this},updateSize:_,init:function(o){var i={};if(e.preserveDrawingBuffer&&(i.preserveDrawingBuffer=!0),n=o,_(),A(),n.appendChild(t),r=t.getContext("experimental-webgl",i),!r){var a="Could not initialize WebGL. Seems like the browser doesn't support it.";throw window.alert(a),a}if(e.enableBlending&&(r.blendFunc(r.SRC_ALPHA,r.ONE_MINUS_SRC_ALPHA),r.enable(r.BLEND)),e.clearColor){var u=e.clearColorValue;r.clearColor(u.r,u.g,u.b,u.a),this.beginRender=function(){r.clear(r.COLOR_BUFFER_BIT)}}L.load(r),L.updateSize(d/2,l/2),N.load(r),N.updateSize(d/2,l/2),j(),"function"==typeof h&&h(t)},release:function(e){t&&e&&e.removeChild(t)},isSupported:function(){var e=window.document.createElement("canvas"),n=e&&e.getContext&&e.getContext("experimental-webgl");return n},releaseLink:function(e){m>0&&(m-=1);var n=E[e.id];delete E[e.id],L.removeLink(n);var t=n.id;if(t0&&(g-=1);var n=b[e.id];delete b[e.id],N.removeNode(n);var t=n.id;if(te.length){var r=new Float32Array(e.length*t*2);return r.set(e),r}return e}function a(n,t){for(var r={},o=0;o=w.length&&s();var i=w[r.textureNumber];i.ctx.drawImage(n,r.col*g,r.row*g,g,g),b[e]=n.src,y[n.src]=o,i.isDirty=!0,t(o)}function c(n){var t=n/e<<0,r=n%e,o=r/h<<0,i=r%h;return{textureNumber:t,row:o,col:i}}function d(){E.isDirty=!0,x=0,v=null}function l(){v&&(window.clearTimeout(v),x+=1,v=null),x>10?d():v=window.setTimeout(d,400)}function p(e,n){var t=w[e.textureNumber].canvas,r=w[n.textureNumber].ctx,o=n.col*g,i=n.row*g;r.drawImage(t,e.col*g,e.row*g,g,g,o,i,g,g),w[e.textureNumber].isDirty=!0,w[n.textureNumber].isDirty=!0}var v,h=Math.sqrt(e||1024)<<0,g=h,m=1,y={},x=0,w=[],b=[];if(!o(e))throw"Tiles per texture should be power of two.";var E={isDirty:!1,clearDirty:n,remove:t,getTextures:r,getCoordinates:a,load:u};return E}function o(e){return 0===(e&e-1)}var i=e("./texture.js");n.exports=r},{"./texture.js":56}],59:[function(e,n,t){function r(e,n){return{_texture:0,_offset:0,size:"number"==typeof e?e:32,src:n}}n.exports=r},{}],60:[function(e,n,t){function r(e){function n(e,n){e.nativeObject&&m.deleteTexture(e.nativeObject);var t=m.createTexture();m.activeTexture(m["TEXTURE"+n]),m.bindTexture(m.TEXTURE_2D,t),m.texImage2D(m.TEXTURE_2D,0,m.RGBA,m.RGBA,m.UNSIGNED_BYTE,e.canvas),m.texParameteri(m.TEXTURE_2D,m.TEXTURE_MAG_FILTER,m.LINEAR),m.texParameteri(m.TEXTURE_2D,m.TEXTURE_MIN_FILTER,m.LINEAR_MIPMAP_NEAREST),m.generateMipmap(m.TEXTURE_2D),m.uniform1i(w["sampler"+n],n),e.nativeObject=t}function t(){if(h.isDirty){var e,t=h.getTextures();for(e=0;e0&&(A-=1),e.id0&&(e.src&&h.remove(e.src),x.copyArrayPart(_,e.id*k,A*k,k))}function d(e,n){n._offset=e._offset}function l(e){N=!0,L=e}function p(e,n){b=e,E=n,N=!0}function v(){m.useProgram(g),m.bindBuffer(m.ARRAY_BUFFER,y),m.bufferData(m.ARRAY_BUFFER,_,m.DYNAMIC_DRAW),N&&(N=!1,m.uniformMatrix4fv(w.transform,!1,L),m.uniform2f(w.screenSize,b,E)),m.vertexAttribPointer(w.vertexPos,2,m.FLOAT,!1,3*Float32Array.BYTES_PER_ELEMENT,0),m.vertexAttribPointer(w.customAttributes,1,m.FLOAT,!1,3*Float32Array.BYTES_PER_ELEMENT,8),t(),m.drawArrays(m.TRIANGLES,0,6*A)}var h,g,m,y,x,w,b,E,L,N,k=18,P=o(),j=i(),e=e||1024,A=0,_=new Float32Array(64);return{load:r,position:s,createNode:f,removeNode:c,replaceProperties:d,updateTransform:l,updateSize:p,render:v}}function o(){return["precision mediump float;","varying vec4 color;","varying vec3 vTextureCoord;","uniform sampler2D u_sampler0;","uniform sampler2D u_sampler1;","uniform sampler2D u_sampler2;","uniform sampler2D u_sampler3;","void main(void) {"," if (vTextureCoord.z == 0.) {"," gl_FragColor = texture2D(u_sampler0, vTextureCoord.xy);"," } else if (vTextureCoord.z == 1.) {"," gl_FragColor = texture2D(u_sampler1, vTextureCoord.xy);"," } else if (vTextureCoord.z == 2.) {"," gl_FragColor = texture2D(u_sampler2, vTextureCoord.xy);"," } else if (vTextureCoord.z == 3.) {"," gl_FragColor = texture2D(u_sampler3, vTextureCoord.xy);"," } else { gl_FragColor = vec4(0, 1, 0, 1); }","}"].join("\n")}function i(){return["attribute vec2 a_vertexPos;","attribute float a_customAttributes;","uniform vec2 u_screenSize;","uniform mat4 u_transform;","uniform float u_tilesPerTexture;","varying vec3 vTextureCoord;","void main(void) {"," gl_Position = u_transform * vec4(a_vertexPos/u_screenSize, 0, 1);","float corner = mod(a_customAttributes, 4.);","float tileIndex = mod(floor(a_customAttributes / 4.), u_tilesPerTexture);","float tilesPerRow = sqrt(u_tilesPerTexture);","float tileSize = 1./tilesPerRow;","float tileColumn = mod(tileIndex, tilesPerRow);","float tileRow = floor(tileIndex/tilesPerRow);","if(corner == 0.0) {"," vTextureCoord.xy = vec2(0, 1);","} else if(corner == 1.0) {"," vTextureCoord.xy = vec2(1, 1);","} else if(corner == 2.0) {"," vTextureCoord.xy = vec2(0, 0);","} else {"," vTextureCoord.xy = vec2(1, 0);","}","vTextureCoord *= tileSize;","vTextureCoord.x += tileColumn * tileSize;","vTextureCoord.y += tileRow * tileSize;","vTextureCoord.z = floor(floor(a_customAttributes / 4.)/u_tilesPerTexture);","}"].join("\n")}var a=e("./webglAtlas.js"),u=e("./webgl.js");n.exports=r},{"./webgl.js":57,"./webglAtlas.js":58}],61:[function(e,n,t){function r(e){function n(){x=null}function t(e){x=e}function r(e){return"function"==typeof e&&P.push(e),A}function i(e){return"function"==typeof e&&k.push(e),A}function a(e){return"function"==typeof e&&N.push(e),A}function u(e){return"function"==typeof e&&L.push(e),A}function s(e){return"function"==typeof e&&E.push(e),A}function f(e){return"function"==typeof e&&b.push(e),A}function c(e){return"function"==typeof e&&w.push(e),A}function d(e,n,t){if(e&&e.size){var r=e.position,o=e.size;return r.x-og.byteLength){var e=new ArrayBuffer(2*g.byteLength),n=new Float32Array(e),t=new Uint32Array(e);t.set(y),m=n,y=t,g=e}};return{load:function(a){n=a,r=o(a),e=r.createProgram(v,p),n.useProgram(e),i=r.getLocations(e,["a_vertexPos","a_color","u_screenSize","u_transform"]),n.enableVertexAttribArray(i.vertexPos),n.enableVertexAttribArray(i.color),t=n.createBuffer()},position:function(e,n,t){var r=e.id,o=r*d;m[o]=n.x,m[o+1]=n.y,y[o+2]=e.color,m[o+3]=t.x,m[o+4]=t.y,y[o+5]=e.color},createLink:function(e){x(),h+=1,a=e.id},removeLink:function(e){h>0&&(h-=1),e.id0&&r.copyArrayPart(y,e.id*d,h*d,d)},updateTransform:function(e){c=!0,f=e},updateSize:function(e,n){u=e,s=n,c=!0},render:function(){n.useProgram(e),n.bindBuffer(n.ARRAY_BUFFER,t),n.bufferData(n.ARRAY_BUFFER,g,n.DYNAMIC_DRAW),c&&(c=!1,n.uniformMatrix4fv(i.transform,!1,f),n.uniform2f(i.screenSize,u,s)),n.vertexAttribPointer(i.vertexPos,2,n.FLOAT,!1,3*Float32Array.BYTES_PER_ELEMENT,0),n.vertexAttribPointer(i.color,4,n.UNSIGNED_BYTE,!0,3*Float32Array.BYTES_PER_ELEMENT,8),n.drawArrays(n.LINES,0,2*h),a=h-1},bringToFront:function(e){a>e.id&&r.swapArrayPart(m,e.id*d,a*d,d),a>0&&(a-=1)},getFrontLinkId:function(){return a}}}var o=e("./webgl.js");n.exports=r},{"./webgl.js":57}],64:[function(e,n,t){function r(){function e(){if((P+1)*w>=L.byteLength){var e=new ArrayBuffer(2*L.byteLength),n=new Float32Array(e),t=new Uint32Array(e);t.set(k),N=n,k=t,L=e}}function n(e){d=e,v=o(e),c=v.createProgram(E,b),d.useProgram(c), +p=v.getLocations(c,["a_vertexPos","a_color","u_screenSize","u_transform"]),d.enableVertexAttribArray(p.vertexPos),d.enableVertexAttribArray(p.color),l=d.createBuffer()}function t(e,n){var t=e.id;N[t*x]=n.x,N[t*x+1]=-n.y,N[t*x+2]=e.size,k[t*x+3]=e.color}function r(e){y=!0,m=e}function i(e,n){h=e,g=n,y=!0}function a(e){P>0&&(P-=1),e.id0&&v.copyArrayPart(k,e.id*x,P*x,x)}function u(){e(),P+=1}function s(){}function f(){d.useProgram(c),d.bindBuffer(d.ARRAY_BUFFER,l),d.bufferData(d.ARRAY_BUFFER,L,d.DYNAMIC_DRAW),y&&(y=!1,d.uniformMatrix4fv(p.transform,!1,m),d.uniform2f(p.screenSize,h,g)),d.vertexAttribPointer(p.vertexPos,3,d.FLOAT,!1,x*Float32Array.BYTES_PER_ELEMENT,0),d.vertexAttribPointer(p.color,4,d.UNSIGNED_BYTE,!0,x*Float32Array.BYTES_PER_ELEMENT,12),d.drawArrays(d.POINTS,0,P)}var c,d,l,p,v,h,g,m,y,x=4,w=3*Float32Array.BYTES_PER_ELEMENT+Uint32Array.BYTES_PER_ELEMENT,b=["precision mediump float;","varying vec4 color;","void main(void) {"," gl_FragColor = color;","}"].join("\n"),E=["attribute vec3 a_vertexPos;","attribute vec4 a_color;","uniform vec2 u_screenSize;","uniform mat4 u_transform;","varying vec4 color;","void main(void) {"," gl_Position = u_transform * vec4(a_vertexPos.xy/u_screenSize, 0, 1);"," gl_PointSize = a_vertexPos.z * u_transform[0][0];"," color = a_color.abgr;","}"].join("\n"),L=new ArrayBuffer(16*w),N=new Float32Array(L),k=new Uint32Array(L),P=0;return{load:n,position:t,updateTransform:r,updateSize:i,removeNode:a,createNode:u,replaceProperties:s,render:f}}var o=e("./webgl.js");n.exports=r},{"./webgl.js":57}],65:[function(e,n,t){function r(e,n){return{size:"number"==typeof e?e:10,color:o(n)}}var o=e("./parseColor.js");n.exports=r},{"./parseColor.js":55}],66:[function(e,n,t){n.exports="0.10.1"},{}]},{},[1])(1)}); \ No newline at end of file diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..77cb225 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,4582 @@ +{ + "name": "vivagraphjs", + "version": "0.11.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "Base64": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/Base64/-/Base64-0.2.1.tgz", + "integrity": "sha1-ujpCMHCOGGcFBl5mur3Uw1z2ACg=", + "dev": true + }, + "JSONStream": { + "version": "0.8.4", + "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-0.8.4.tgz", + "integrity": "sha1-kWV9/m/4V0gwZhMrRhi2Lo9Ih70=", + "dev": true, + "requires": { + "jsonparse": "0.0.5", + "through": ">=2.2.7 <3" + } + }, + "abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", + "dev": true + }, + "acorn": { + "version": "4.0.13", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-4.0.13.tgz", + "integrity": "sha1-EFSVrlNh1pe9GVyCUZLhrX8lN4c=", + "dev": true + }, + "acorn-node": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/acorn-node/-/acorn-node-1.8.2.tgz", + "integrity": "sha512-8mt+fslDufLYntIoPAaIMUe/lrbrehIiwmR3t2k9LljIzoigEPF27eLk2hy8zSGzmR/ogr7zbRKINMo1u0yh5A==", + "dev": true, + "requires": { + "acorn": "^7.0.0", + "acorn-walk": "^7.0.0", + "xtend": "^4.0.2" + }, + "dependencies": { + "acorn": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.1.0.tgz", + "integrity": "sha512-kL5CuoXA/dgxlBbVrflsflzQ3PAas7RYZB52NOm/6839iVYJgKMJ3cQJD+t2i5+qFa8h3MDpEOJiS64E8JLnSQ==", + "dev": true + }, + "xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "dev": true + } + } + }, + "acorn-walk": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.0.0.tgz", + "integrity": "sha512-7Bv1We7ZGuU79zZbb6rRqcpxo3OY+zrdtloZWoyD8fmGX+FeXRjE+iuGkZjSXLVovLzrsvMGMy0EkwA0E0umxg==", + "dev": true + }, + "add-event-listener": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/add-event-listener/-/add-event-listener-0.0.1.tgz", + "integrity": "sha1-p2Ip68ZMiu+uIEoWJzovJVq+otA=" + }, + "align-text": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz", + "integrity": "sha1-DNkKVhCT810KmSVsIrcGlDP60Rc=", + "dev": true, + "requires": { + "kind-of": "^3.0.2", + "longest": "^1.0.1", + "repeat-string": "^1.5.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "amdefine": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz", + "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=", + "dev": true + }, + "ansi-gray": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/ansi-gray/-/ansi-gray-0.1.1.tgz", + "integrity": "sha1-KWLPVOyXksSFEKPetSRDaGHvclE=", + "dev": true, + "requires": { + "ansi-wrap": "0.1.0" + } + }, + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "ansi-wrap": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/ansi-wrap/-/ansi-wrap-0.1.0.tgz", + "integrity": "sha1-qCJQ3bABXponyoLoLqYDu/pF768=", + "dev": true + }, + "archy": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz", + "integrity": "sha1-+cjBN1fMHde8N5rHeyxipcKGjEA=", + "dev": true + }, + "arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", + "dev": true + }, + "arr-flatten": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", + "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", + "dev": true + }, + "arr-union": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", + "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", + "dev": true + }, + "array-differ": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-differ/-/array-differ-1.0.0.tgz", + "integrity": "sha1-7/UuN1gknTO+QCuLuOVkuytdQDE=", + "dev": true + }, + "array-each": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/array-each/-/array-each-1.0.1.tgz", + "integrity": "sha1-p5SvDAWrF1KEbudTofIRoFugxE8=", + "dev": true + }, + "array-slice": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/array-slice/-/array-slice-1.1.0.tgz", + "integrity": "sha512-B1qMD3RBP7O8o0H2KbrXDyB0IccejMF15+87Lvlor12ONPRHP6gTjXMNkt/d3ZuOGbAe66hFmaCfECI24Ufp6w==", + "dev": true + }, + "array-union": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", + "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", + "dev": true, + "requires": { + "array-uniq": "^1.0.1" + } + }, + "array-uniq": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", + "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=", + "dev": true + }, + "array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", + "dev": true + }, + "asn1.js": { + "version": "4.10.1", + "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.10.1.tgz", + "integrity": "sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw==", + "dev": true, + "requires": { + "bn.js": "^4.0.0", + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0" + } + }, + "assert": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/assert/-/assert-1.3.0.tgz", + "integrity": "sha1-A5OaYiWCqBLMICMgoLmlbJuBWEk=", + "dev": true, + "requires": { + "util": "0.10.3" + }, + "dependencies": { + "inherits": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", + "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=", + "dev": true + }, + "util": { + "version": "0.10.3", + "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", + "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", + "dev": true, + "requires": { + "inherits": "2.0.1" + } + } + } + }, + "assign-symbols": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", + "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=", + "dev": true + }, + "astw": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/astw/-/astw-2.2.0.tgz", + "integrity": "sha1-e9QXhNMkk5h66yOba04cV6hzuRc=", + "dev": true, + "requires": { + "acorn": "^4.0.3" + } + }, + "async": { + "version": "0.2.10", + "resolved": "https://registry.npmjs.org/async/-/async-0.2.10.tgz", + "integrity": "sha1-trvgsGdLnXGXCMo43owjfLUmw9E=", + "dev": true + }, + "atob": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", + "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", + "dev": true + }, + "balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", + "dev": true + }, + "base": { + "version": "0.11.2", + "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", + "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", + "dev": true, + "requires": { + "cache-base": "^1.0.1", + "class-utils": "^0.3.5", + "component-emitter": "^1.2.1", + "define-property": "^1.0.0", + "isobject": "^3.0.1", + "mixin-deep": "^1.2.0", + "pascalcase": "^0.1.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "base64-js": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-0.0.8.tgz", + "integrity": "sha1-EQHpVE9KdrG8OybUUsqW16NeeXg=", + "dev": true + }, + "beeper": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/beeper/-/beeper-1.1.1.tgz", + "integrity": "sha1-5tXqjF2tABMEpwsiY4RH9pyy+Ak=", + "dev": true + }, + "bl": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/bl/-/bl-1.2.2.tgz", + "integrity": "sha512-e8tQYnZodmebYDWGH7KMRvtzKXaJHx3BbilrgZCfvyLUYdKpK1t5PSPmpkny/SgiTSCnjfLW7v5rlONXVFkQEA==", + "dev": true, + "requires": { + "readable-stream": "^2.3.5", + "safe-buffer": "^5.1.1" + }, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "readable-stream": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + }, + "dependencies": { + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + } + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + }, + "dependencies": { + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + } + } + } + } + }, + "bn.js": { + "version": "4.11.8", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz", + "integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==", + "dev": true + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, + "requires": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "brorand": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", + "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=", + "dev": true + }, + "browser-pack": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/browser-pack/-/browser-pack-3.2.0.tgz", + "integrity": "sha1-+qHLxBSHsazEdH43PhFIrf/Q4tk=", + "dev": true, + "requires": { + "JSONStream": "~0.8.4", + "combine-source-map": "~0.3.0", + "concat-stream": "~1.4.1", + "defined": "~0.0.0", + "through2": "~0.5.1", + "umd": "^2.1.0" + }, + "dependencies": { + "readable-stream": { + "version": "1.0.34", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", + "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + }, + "through2": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/through2/-/through2-0.5.1.tgz", + "integrity": "sha1-390BLrnHAOIyP9M084rGIqs3Lac=", + "dev": true, + "requires": { + "readable-stream": "~1.0.17", + "xtend": "~3.0.0" + } + } + } + }, + "browser-resolve": { + "version": "1.11.3", + "resolved": "https://registry.npmjs.org/browser-resolve/-/browser-resolve-1.11.3.tgz", + "integrity": "sha512-exDi1BYWB/6raKHmDTCicQfTkqwN5fioMFV4j8BsfMU4R2DK/QfZfK7kOVkmWCNANf0snkBzqGqAJBao9gZMdQ==", + "dev": true, + "requires": { + "resolve": "1.1.7" + }, + "dependencies": { + "resolve": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", + "integrity": "sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=", + "dev": true + } + } + }, + "browserify": { + "version": "8.1.3", + "resolved": "https://registry.npmjs.org/browserify/-/browserify-8.1.3.tgz", + "integrity": "sha1-8zpUmjpsNoIZsHX9z+bfGV4Empo=", + "dev": true, + "requires": { + "JSONStream": "~0.8.3", + "assert": "~1.3.0", + "browser-pack": "^3.2.0", + "browser-resolve": "^1.3.0", + "browserify-zlib": "~0.1.2", + "buffer": "^3.0.0", + "builtins": "~0.0.3", + "commondir": "0.0.1", + "concat-stream": "~1.4.1", + "console-browserify": "^1.1.0", + "constants-browserify": "~0.0.1", + "crypto-browserify": "^3.0.0", + "deep-equal": "~0.2.1", + "defined": "~0.0.0", + "deps-sort": "^1.3.5", + "domain-browser": "~1.1.0", + "duplexer2": "~0.0.2", + "events": "~1.0.0", + "glob": "^4.0.5", + "http-browserify": "^1.4.0", + "https-browserify": "~0.0.0", + "inherits": "~2.0.1", + "insert-module-globals": "^6.2.0", + "isarray": "0.0.1", + "labeled-stream-splicer": "^1.0.0", + "module-deps": "^3.6.3", + "os-browserify": "~0.1.1", + "parents": "^1.0.1", + "path-browserify": "~0.0.0", + "process": "^0.10.0", + "punycode": "~1.2.3", + "querystring-es3": "~0.2.0", + "readable-stream": "^1.0.33-1", + "resolve": "~0.7.1", + "shallow-copy": "0.0.1", + "shasum": "^1.0.0", + "shell-quote": "~0.0.1", + "stream-browserify": "^1.0.0", + "string_decoder": "~0.10.0", + "subarg": "^1.0.0", + "syntax-error": "^1.1.1", + "through2": "^1.0.0", + "timers-browserify": "^1.0.1", + "tty-browserify": "~0.0.0", + "umd": "~2.1.0", + "url": "~0.10.1", + "util": "~0.10.1", + "vm-browserify": "~0.0.1", + "xtend": "^3.0.0" + } + }, + "browserify-aes": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", + "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", + "dev": true, + "requires": { + "buffer-xor": "^1.0.3", + "cipher-base": "^1.0.0", + "create-hash": "^1.1.0", + "evp_bytestokey": "^1.0.3", + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "browserify-cipher": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz", + "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==", + "dev": true, + "requires": { + "browserify-aes": "^1.0.4", + "browserify-des": "^1.0.0", + "evp_bytestokey": "^1.0.0" + } + }, + "browserify-des": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz", + "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==", + "dev": true, + "requires": { + "cipher-base": "^1.0.1", + "des.js": "^1.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "browserify-rsa": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz", + "integrity": "sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ=", + "dev": true, + "requires": { + "bn.js": "^4.1.0", + "randombytes": "^2.0.1" + } + }, + "browserify-sign": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.0.4.tgz", + "integrity": "sha1-qk62jl17ZYuqa/alfmMMvXqT0pg=", + "dev": true, + "requires": { + "bn.js": "^4.1.1", + "browserify-rsa": "^4.0.0", + "create-hash": "^1.1.0", + "create-hmac": "^1.1.2", + "elliptic": "^6.0.0", + "inherits": "^2.0.1", + "parse-asn1": "^5.0.0" + } + }, + "browserify-zlib": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.1.4.tgz", + "integrity": "sha1-uzX4pRn2AOD6a4SFJByXnQFB+y0=", + "dev": true, + "requires": { + "pako": "~0.2.0" + } + }, + "buffer": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-3.6.0.tgz", + "integrity": "sha1-pyyTb3e5a/UvX357RnGAYoVR3vs=", + "dev": true, + "requires": { + "base64-js": "0.0.8", + "ieee754": "^1.1.4", + "isarray": "^1.0.0" + }, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + } + } + }, + "buffer-equal": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/buffer-equal/-/buffer-equal-0.0.2.tgz", + "integrity": "sha1-7Lt5D1aNQAmKYkK1SAXHWAXrk48=", + "dev": true + }, + "buffer-xor": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", + "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=", + "dev": true + }, + "builtins": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/builtins/-/builtins-0.0.7.tgz", + "integrity": "sha1-NVIZzWzxjb58Acx/0tznZc/cVJo=", + "dev": true + }, + "bunker": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/bunker/-/bunker-0.1.2.tgz", + "integrity": "sha1-yImSRkqOKm7ehpMDdfkrWAd++Xw=", + "dev": true, + "requires": { + "burrito": ">=0.2.5 <0.3" + } + }, + "burrito": { + "version": "0.2.12", + "resolved": "https://registry.npmjs.org/burrito/-/burrito-0.2.12.tgz", + "integrity": "sha1-0NbmrIHV6ZeJxvpKzLCwAx6lT2s=", + "dev": true, + "requires": { + "traverse": "~0.5.1", + "uglify-js": "~1.1.1" + }, + "dependencies": { + "traverse": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/traverse/-/traverse-0.5.2.tgz", + "integrity": "sha1-4gPFjV9/DjfbbnTArLkpuwm2HYU=", + "dev": true + }, + "uglify-js": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-1.1.1.tgz", + "integrity": "sha1-7nGpfEzv0GoamyBDfzQRiYKqA1s=", + "dev": true + } + } + }, + "cache-base": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", + "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", + "dev": true, + "requires": { + "collection-visit": "^1.0.0", + "component-emitter": "^1.2.1", + "get-value": "^2.0.6", + "has-value": "^1.0.0", + "isobject": "^3.0.1", + "set-value": "^2.0.0", + "to-object-path": "^0.3.0", + "union-value": "^1.0.0", + "unset-value": "^1.0.0" + } + }, + "callsite": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/callsite/-/callsite-1.0.0.tgz", + "integrity": "sha1-KAOY5dZkvXQDi28JBRU+borxvCA=", + "dev": true + }, + "camelcase": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz", + "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=", + "dev": true + }, + "center-align": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/center-align/-/center-align-0.1.3.tgz", + "integrity": "sha1-qg0yYptu6XIgBBHL1EYckHvCt60=", + "dev": true, + "requires": { + "align-text": "^0.1.3", + "lazy-cache": "^1.0.3" + } + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + } + }, + "charm": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/charm/-/charm-0.1.2.tgz", + "integrity": "sha1-BsIe7RobBq62dVPNxT4jJ0usIpY=", + "dev": true + }, + "cipher-base": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", + "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "class-utils": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", + "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", + "dev": true, + "requires": { + "arr-union": "^3.1.0", + "define-property": "^0.2.5", + "isobject": "^3.0.0", + "static-extend": "^0.1.1" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + } + } + }, + "cliui": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz", + "integrity": "sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE=", + "dev": true, + "requires": { + "center-align": "^0.1.1", + "right-align": "^0.1.1", + "wordwrap": "0.0.2" + }, + "dependencies": { + "wordwrap": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz", + "integrity": "sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8=", + "dev": true + } + } + }, + "clone": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", + "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4=", + "dev": true + }, + "clone-stats": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-0.0.1.tgz", + "integrity": "sha1-uI+UqCzzi4eR1YBG6kAprYjKmdE=", + "dev": true + }, + "collection-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", + "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", + "dev": true, + "requires": { + "map-visit": "^1.0.0", + "object-visit": "^1.0.0" + } + }, + "color-support": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", + "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", + "dev": true + }, + "combine-source-map": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/combine-source-map/-/combine-source-map-0.3.0.tgz", + "integrity": "sha1-2edPWT2c1DgHMSy12EbUUe+qnrc=", + "dev": true, + "requires": { + "convert-source-map": "~0.3.0", + "inline-source-map": "~0.3.0", + "source-map": "~0.1.31" + } + }, + "commondir": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-0.0.1.tgz", + "integrity": "sha1-ifAP3NUbUZxXhzP+xWPmptp/W+I=", + "dev": true + }, + "component-emitter": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", + "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==", + "dev": true + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "dev": true + }, + "concat-stream": { + "version": "1.4.11", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.4.11.tgz", + "integrity": "sha512-X3JMh8+4je3U1cQpG87+f9lXHDrqcb2MVLg9L7o8b1UZ0DzhRrUpdn65ttzu10PpJPPI3MQNkis+oha6TSA9Mw==", + "dev": true, + "requires": { + "inherits": "~2.0.1", + "readable-stream": "~1.1.9", + "typedarray": "~0.0.5" + } + }, + "console-browserify": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.1.0.tgz", + "integrity": "sha1-8CQcRXMKn8YyOyBtvzjtx0HQuxA=", + "dev": true, + "requires": { + "date-now": "^0.1.4" + } + }, + "constants-browserify": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-0.0.1.tgz", + "integrity": "sha1-kld9tSe6bEzwpFaNhLwDH0QeIfI=", + "dev": true + }, + "convert-source-map": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-0.3.5.tgz", + "integrity": "sha1-8dgClQr33SYxof6+BZZVDIarMZA=", + "dev": true + }, + "copy-descriptor": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", + "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", + "dev": true + }, + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", + "dev": true + }, + "create-ecdh": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.3.tgz", + "integrity": "sha512-GbEHQPMOswGpKXM9kCWVrremUcBmjteUaQ01T9rkKCPDXfUHX0IoP9LpHYo2NPFampa4e+/pFDc3jQdxrxQLaw==", + "dev": true, + "requires": { + "bn.js": "^4.1.0", + "elliptic": "^6.0.0" + } + }, + "create-hash": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", + "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", + "dev": true, + "requires": { + "cipher-base": "^1.0.1", + "inherits": "^2.0.1", + "md5.js": "^1.3.4", + "ripemd160": "^2.0.1", + "sha.js": "^2.4.0" + } + }, + "create-hmac": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", + "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", + "dev": true, + "requires": { + "cipher-base": "^1.0.3", + "create-hash": "^1.1.0", + "inherits": "^2.0.1", + "ripemd160": "^2.0.0", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + } + }, + "crypto-browserify": { + "version": "3.12.0", + "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", + "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", + "dev": true, + "requires": { + "browserify-cipher": "^1.0.0", + "browserify-sign": "^4.0.0", + "create-ecdh": "^4.0.0", + "create-hash": "^1.1.0", + "create-hmac": "^1.1.0", + "diffie-hellman": "^5.0.0", + "inherits": "^2.0.1", + "pbkdf2": "^3.0.3", + "public-encrypt": "^4.0.0", + "randombytes": "^2.0.0", + "randomfill": "^1.0.3" + } + }, + "date-now": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/date-now/-/date-now-0.1.4.tgz", + "integrity": "sha1-6vQ5/U1ISK105cx9vvIAZyueNFs=", + "dev": true + }, + "dateformat": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-2.2.0.tgz", + "integrity": "sha1-QGXiATz5+5Ft39gu+1Bq1MZ2kGI=", + "dev": true + }, + "deap": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/deap/-/deap-1.0.1.tgz", + "integrity": "sha512-k75KYNZMvwAwes2xIPry/QTffXIchjD8QfABvvfTr80P85jv5ZcKqcoDo+vMe71nNnVnXYe8MA28weyqcf/DKw==", + "dev": true + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", + "dev": true + }, + "decode-uri-component": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", + "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", + "dev": true + }, + "deep-equal": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-0.2.2.tgz", + "integrity": "sha1-hLdFiW80xoTpjyzg5Cq69Du6AX0=", + "dev": true + }, + "deep-is": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", + "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", + "dev": true + }, + "defaults": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.3.tgz", + "integrity": "sha1-xlYFHpgX2f8I7YgUd/P+QBnz730=", + "dev": true, + "requires": { + "clone": "^1.0.2" + } + }, + "define-property": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", + "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", + "dev": true, + "requires": { + "is-descriptor": "^1.0.2", + "isobject": "^3.0.1" + }, + "dependencies": { + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "defined": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/defined/-/defined-0.0.0.tgz", + "integrity": "sha1-817qfXBekzuvE7LwOz+D2SFAOz4=", + "dev": true + }, + "del": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/del/-/del-1.2.1.tgz", + "integrity": "sha1-rtblvNfLcyXfNPVjEl+iZbLBoBQ=", + "dev": true, + "requires": { + "each-async": "^1.0.0", + "globby": "^2.0.0", + "is-path-cwd": "^1.0.0", + "is-path-in-cwd": "^1.0.0", + "object-assign": "^3.0.0", + "rimraf": "^2.2.8" + } + }, + "deprecated": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/deprecated/-/deprecated-0.0.1.tgz", + "integrity": "sha1-+cmvVGSvoeepcUWKi97yqpTVuxk=", + "dev": true + }, + "deps-sort": { + "version": "1.3.9", + "resolved": "https://registry.npmjs.org/deps-sort/-/deps-sort-1.3.9.tgz", + "integrity": "sha1-Kd//U+F7Nq7K51MK27v2IsLtGnE=", + "dev": true, + "requires": { + "JSONStream": "^1.0.3", + "shasum": "^1.0.0", + "subarg": "^1.0.0", + "through2": "^1.0.0" + }, + "dependencies": { + "JSONStream": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.5.tgz", + "integrity": "sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==", + "dev": true, + "requires": { + "jsonparse": "^1.2.0", + "through": ">=2.2.7 <3" + } + }, + "jsonparse": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", + "integrity": "sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA=", + "dev": true + } + } + }, + "des.js": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.0.tgz", + "integrity": "sha1-wHTS4qpqipoH29YfmhXCzYPsjsw=", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0" + } + }, + "detect-file": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/detect-file/-/detect-file-1.0.0.tgz", + "integrity": "sha1-8NZtA2cqglyxtzvbP+YjEMjlUrc=", + "dev": true + }, + "detective": { + "version": "4.7.1", + "resolved": "https://registry.npmjs.org/detective/-/detective-4.7.1.tgz", + "integrity": "sha512-H6PmeeUcZloWtdt4DAkFyzFL94arpHr3NOwwmVILFiy+9Qd4JTxxXrzfyGk/lmct2qVGBwTSwSXagqu2BxmWig==", + "dev": true, + "requires": { + "acorn": "^5.2.1", + "defined": "^1.0.0" + }, + "dependencies": { + "acorn": { + "version": "5.7.3", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.3.tgz", + "integrity": "sha512-T/zvzYRfbVojPWahDsE5evJdHb3oJoQfFbsrKM7w5Zcs++Tr257tia3BmMP8XYVjp1S9RZXQMh7gao96BlqZOw==", + "dev": true + }, + "defined": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz", + "integrity": "sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM=", + "dev": true + } + } + }, + "diffie-hellman": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", + "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", + "dev": true, + "requires": { + "bn.js": "^4.1.0", + "miller-rabin": "^4.0.0", + "randombytes": "^2.0.0" + } + }, + "difflet": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/difflet/-/difflet-0.2.6.tgz", + "integrity": "sha1-qyOzH1ZJtvqo49KsvTNEZzZcpvo=", + "dev": true, + "requires": { + "charm": "0.1.x", + "deep-is": "0.1.x", + "traverse": "0.6.x" + } + }, + "domain-browser": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.1.7.tgz", + "integrity": "sha1-hnqksJP6oF8d4IwG9NeyH9+GmLw=", + "dev": true + }, + "duplexer2": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.0.2.tgz", + "integrity": "sha1-xhTc9n4vsUmVqRcR5aYX6KYKMds=", + "dev": true, + "requires": { + "readable-stream": "~1.1.9" + } + }, + "each-async": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/each-async/-/each-async-1.1.1.tgz", + "integrity": "sha1-3uUim98KtrogEqOV4bhpq/iBNHM=", + "dev": true, + "requires": { + "onetime": "^1.0.0", + "set-immediate-shim": "^1.0.0" + } + }, + "elliptic": { + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.1.tgz", + "integrity": "sha512-xvJINNLbTeWQjrl6X+7eQCrIy/YPv5XCpKW6kB5mKvtnGILoLDcySuwomfdzt0BMdLNVnuRNTuzKNHj0bva1Cg==", + "dev": true, + "requires": { + "bn.js": "^4.4.0", + "brorand": "^1.0.1", + "hash.js": "^1.0.0", + "hmac-drbg": "^1.0.0", + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.0" + } + }, + "end-of-stream": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-0.1.5.tgz", + "integrity": "sha1-jhdyBsPICDfYVjLouTWd/osvbq8=", + "dev": true, + "requires": { + "once": "~1.3.0" + }, + "dependencies": { + "once": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/once/-/once-1.3.3.tgz", + "integrity": "sha1-suJhVXzkwxTsgwTz+oJmPkKXyiA=", + "dev": true, + "requires": { + "wrappy": "1" + } + } + } + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true + }, + "events": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/events/-/events-1.0.2.tgz", + "integrity": "sha1-dYSdz+k9EPsFfDAFWv29UdBqjiQ=", + "dev": true + }, + "evp_bytestokey": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", + "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", + "dev": true, + "requires": { + "md5.js": "^1.3.4", + "safe-buffer": "^5.1.1" + } + }, + "expand-brackets": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", + "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", + "dev": true, + "requires": { + "debug": "^2.3.3", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "posix-character-classes": "^0.1.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "expand-tilde": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz", + "integrity": "sha1-l+gBqgUt8CRU3kawK/YhZCzchQI=", + "dev": true, + "requires": { + "homedir-polyfill": "^1.0.1" + } + }, + "extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "dev": true + }, + "extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "dev": true, + "requires": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4" + } + } + } + }, + "extglob": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "dev": true, + "requires": { + "array-unique": "^0.3.2", + "define-property": "^1.0.0", + "expand-brackets": "^2.1.4", + "extend-shallow": "^2.0.1", + "fragment-cache": "^0.2.1", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "fancy-log": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/fancy-log/-/fancy-log-1.3.3.tgz", + "integrity": "sha512-k9oEhlyc0FrVh25qYuSELjr8oxsCoc4/LEZfg2iJJrfEk/tZL9bCoJE47gqAvI2m/AUjluCS4+3I0eTx8n3AEw==", + "dev": true, + "requires": { + "ansi-gray": "^0.1.1", + "color-support": "^1.1.3", + "parse-node-version": "^1.0.0", + "time-stamp": "^1.0.0" + } + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "find-index": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/find-index/-/find-index-0.1.1.tgz", + "integrity": "sha1-Z101iyyjiS15Whq0cjL4tuLg3eQ=", + "dev": true + }, + "findup-sync": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-2.0.0.tgz", + "integrity": "sha1-kyaxSIwi0aYIhlCoaQGy2akKLLw=", + "dev": true, + "requires": { + "detect-file": "^1.0.0", + "is-glob": "^3.1.0", + "micromatch": "^3.0.4", + "resolve-dir": "^1.0.1" + } + }, + "fined": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/fined/-/fined-1.2.0.tgz", + "integrity": "sha512-ZYDqPLGxDkDhDZBjZBb+oD1+j0rA4E0pXY50eplAAOPg2N/gUBSSk5IM1/QhPfyVo19lJ+CvXpqfvk+b2p/8Ng==", + "dev": true, + "requires": { + "expand-tilde": "^2.0.2", + "is-plain-object": "^2.0.3", + "object.defaults": "^1.1.0", + "object.pick": "^1.2.0", + "parse-filepath": "^1.0.1" + } + }, + "first-chunk-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/first-chunk-stream/-/first-chunk-stream-1.0.0.tgz", + "integrity": "sha1-Wb+1DNkF9g18OUzT2ayqtOatk04=", + "dev": true + }, + "flagged-respawn": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/flagged-respawn/-/flagged-respawn-1.0.1.tgz", + "integrity": "sha512-lNaHNVymajmk0OJMBn8fVUAU1BtDeKIqKoVhk4xAALB57aALg6b4W0MfJ/cUE0g9YBXy5XhSlPIpYIJ7HaY/3Q==", + "dev": true + }, + "for-in": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", + "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", + "dev": true + }, + "for-own": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/for-own/-/for-own-1.0.0.tgz", + "integrity": "sha1-xjMy9BXO3EsE2/5wz4NklMU8tEs=", + "dev": true, + "requires": { + "for-in": "^1.0.1" + } + }, + "fragment-cache": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", + "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", + "dev": true, + "requires": { + "map-cache": "^0.2.2" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "dev": true + }, + "gaze": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/gaze/-/gaze-0.5.2.tgz", + "integrity": "sha1-QLcJU30k0dRXZ9takIaJ3+aaxE8=", + "dev": true, + "requires": { + "globule": "~0.1.0" + } + }, + "get-value": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", + "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", + "dev": true + }, + "gintersect": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/gintersect/-/gintersect-0.1.0.tgz", + "integrity": "sha1-moy2qAt9bpVawzUVSVsSEmJ7GBY=" + }, + "glob": { + "version": "4.5.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-4.5.3.tgz", + "integrity": "sha1-xstz0yJsHv7wTePFbQEvAzd+4V8=", + "dev": true, + "requires": { + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^2.0.1", + "once": "^1.3.0" + } + }, + "glob-stream": { + "version": "3.1.18", + "resolved": "https://registry.npmjs.org/glob-stream/-/glob-stream-3.1.18.tgz", + "integrity": "sha1-kXCl8St5Awb9/lmPMT+PeVT9FDs=", + "dev": true, + "requires": { + "glob": "^4.3.1", + "glob2base": "^0.0.12", + "minimatch": "^2.0.1", + "ordered-read-streams": "^0.1.0", + "through2": "^0.6.1", + "unique-stream": "^1.0.0" + }, + "dependencies": { + "readable-stream": { + "version": "1.0.34", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", + "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + }, + "through2": { + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz", + "integrity": "sha1-QaucZ7KdVyCQcUEOHXp6lozTrUg=", + "dev": true, + "requires": { + "readable-stream": ">=1.0.33-1 <1.1.0-0", + "xtend": ">=4.0.0 <4.1.0-0" + } + }, + "xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "dev": true + } + } + }, + "glob-watcher": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/glob-watcher/-/glob-watcher-0.0.6.tgz", + "integrity": "sha1-uVtKjfdLOcgymLDAXJeLTZo7cQs=", + "dev": true, + "requires": { + "gaze": "^0.5.1" + } + }, + "glob2base": { + "version": "0.0.12", + "resolved": "https://registry.npmjs.org/glob2base/-/glob2base-0.0.12.tgz", + "integrity": "sha1-nUGbPijxLoOjYhZKJ3BVkiycDVY=", + "dev": true, + "requires": { + "find-index": "^0.1.1" + } + }, + "global-modules": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz", + "integrity": "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==", + "dev": true, + "requires": { + "global-prefix": "^1.0.1", + "is-windows": "^1.0.1", + "resolve-dir": "^1.0.0" + } + }, + "global-prefix": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz", + "integrity": "sha1-2/dDxsFJklk8ZVVoy2btMsASLr4=", + "dev": true, + "requires": { + "expand-tilde": "^2.0.2", + "homedir-polyfill": "^1.0.1", + "ini": "^1.3.4", + "is-windows": "^1.0.1", + "which": "^1.2.14" + } + }, + "globby": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-2.1.0.tgz", + "integrity": "sha1-npGSvNM/Srak+JTl5+qLcTITxII=", + "dev": true, + "requires": { + "array-union": "^1.0.1", + "async": "^1.2.1", + "glob": "^5.0.3", + "object-assign": "^3.0.0" + }, + "dependencies": { + "async": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", + "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=", + "dev": true + }, + "glob": { + "version": "5.0.15", + "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz", + "integrity": "sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E=", + "dev": true, + "requires": { + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "2 || 3", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + } + } + }, + "globule": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/globule/-/globule-0.1.0.tgz", + "integrity": "sha1-2cjt3h2nnRJaFRt5UzuXhnY0auU=", + "dev": true, + "requires": { + "glob": "~3.1.21", + "lodash": "~1.0.1", + "minimatch": "~0.2.11" + }, + "dependencies": { + "glob": { + "version": "3.1.21", + "resolved": "https://registry.npmjs.org/glob/-/glob-3.1.21.tgz", + "integrity": "sha1-0p4KBV3qUTj00H7UDomC6DwgZs0=", + "dev": true, + "requires": { + "graceful-fs": "~1.2.0", + "inherits": "1", + "minimatch": "~0.2.11" + } + }, + "graceful-fs": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-1.2.3.tgz", + "integrity": "sha1-FaSAaldUfLLS2/J/QuiajDRRs2Q=", + "dev": true + }, + "inherits": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-1.0.2.tgz", + "integrity": "sha1-ykMJ2t7mtUzAuNJH6NfHoJdb3Js=", + "dev": true + }, + "minimatch": { + "version": "0.2.14", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-0.2.14.tgz", + "integrity": "sha1-x054BXT2PG+aCQ6Q775u9TpqdWo=", + "dev": true, + "requires": { + "lru-cache": "2", + "sigmund": "~1.0.0" + } + } + } + }, + "glogg": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/glogg/-/glogg-1.0.2.tgz", + "integrity": "sha512-5mwUoSuBk44Y4EshyiqcH95ZntbDdTQqA3QYSrxmzj28Ai0vXBGMH1ApSANH14j2sIRtqCEyg6PfsuP7ElOEDA==", + "dev": true, + "requires": { + "sparkles": "^1.0.0" + } + }, + "graceful-fs": { + "version": "3.0.12", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-3.0.12.tgz", + "integrity": "sha512-J55gaCS4iTTJfTXIxSVw3EMQckcqkpdRv3IR7gu6sq0+tbC363Zx6KH/SEwXASK9JRbhyZmVjJEVJIOxYsB3Qg==", + "dev": true, + "requires": { + "natives": "^1.1.3" + } + }, + "gulp": { + "version": "3.9.1", + "resolved": "https://registry.npmjs.org/gulp/-/gulp-3.9.1.tgz", + "integrity": "sha1-VxzkWSjdQK9lFPxAEYZgFsE4RbQ=", + "dev": true, + "requires": { + "archy": "^1.0.0", + "chalk": "^1.0.0", + "deprecated": "^0.0.1", + "gulp-util": "^3.0.0", + "interpret": "^1.0.0", + "liftoff": "^2.1.0", + "minimist": "^1.1.0", + "orchestrator": "^0.3.0", + "pretty-hrtime": "^1.0.0", + "semver": "^4.1.0", + "tildify": "^1.0.0", + "v8flags": "^2.0.2", + "vinyl-fs": "^0.3.0" + } + }, + "gulp-rename": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/gulp-rename/-/gulp-rename-1.4.0.tgz", + "integrity": "sha512-swzbIGb/arEoFK89tPY58vg3Ok1bw+d35PfUNwWqdo7KM4jkmuGA78JiDNqR+JeZFaeeHnRg9N7aihX3YPmsyg==", + "dev": true + }, + "gulp-run": { + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/gulp-run/-/gulp-run-1.7.1.tgz", + "integrity": "sha1-4XwKy3wwtuKu7iPAREKpbAys7/o=", + "dev": true, + "requires": { + "gulp-util": "^3.0.0", + "lodash.defaults": "^4.0.1", + "lodash.template": "^4.0.2", + "vinyl": "^0.4.6" + }, + "dependencies": { + "clone": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/clone/-/clone-0.2.0.tgz", + "integrity": "sha1-xhJqkK1Pctv1rNskPMN3JP6T/B8=", + "dev": true + }, + "lodash.template": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-4.5.0.tgz", + "integrity": "sha512-84vYFxIkmidUiFxidA/KjjH9pAycqW+h980j7Fuz5qxRtO9pgB7MDFTdys1N7A5mcucRiDyEq4fusljItR1T/A==", + "dev": true, + "requires": { + "lodash._reinterpolate": "^3.0.0", + "lodash.templatesettings": "^4.0.0" + } + }, + "lodash.templatesettings": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-4.2.0.tgz", + "integrity": "sha512-stgLz+i3Aa9mZgnjr/O+v9ruKZsPsndy7qPZOchbqk2cnTU1ZaldKK+v7m54WoKIyxiuMZTKT2H81F8BeAc3ZQ==", + "dev": true, + "requires": { + "lodash._reinterpolate": "^3.0.0" + } + }, + "vinyl": { + "version": "0.4.6", + "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-0.4.6.tgz", + "integrity": "sha1-LzVsh6VQolVGHza76ypbqL94SEc=", + "dev": true, + "requires": { + "clone": "^0.2.0", + "clone-stats": "^0.0.1" + } + } + } + }, + "gulp-uglify": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/gulp-uglify/-/gulp-uglify-1.5.4.tgz", + "integrity": "sha1-UkeI2HZm0J+dDCH7IXf5ADmmWMk=", + "dev": true, + "requires": { + "deap": "^1.0.0", + "fancy-log": "^1.0.0", + "gulp-util": "^3.0.0", + "isobject": "^2.0.0", + "through2": "^2.0.0", + "uglify-js": "2.6.4", + "uglify-save-license": "^0.4.1", + "vinyl-sourcemaps-apply": "^0.2.0" + }, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "dev": true, + "requires": { + "isarray": "1.0.0" + } + }, + "readable-stream": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "through2": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "dev": true, + "requires": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + } + }, + "uglify-js": { + "version": "2.6.4", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.6.4.tgz", + "integrity": "sha1-ZeovswWck5RpLxX+2HwrNsFrmt8=", + "dev": true, + "requires": { + "async": "~0.2.6", + "source-map": "~0.5.1", + "uglify-to-browserify": "~1.0.0", + "yargs": "~3.10.0" + } + }, + "xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "dev": true + }, + "yargs": { + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz", + "integrity": "sha1-9+572FfdfB0tOMDnTvvWgdFDH9E=", + "dev": true, + "requires": { + "camelcase": "^1.0.2", + "cliui": "^2.1.0", + "decamelize": "^1.0.0", + "window-size": "0.1.0" + } + } + } + }, + "gulp-util": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/gulp-util/-/gulp-util-3.0.8.tgz", + "integrity": "sha1-AFTh50RQLifATBh8PsxQXdVLu08=", + "dev": true, + "requires": { + "array-differ": "^1.0.0", + "array-uniq": "^1.0.2", + "beeper": "^1.0.0", + "chalk": "^1.0.0", + "dateformat": "^2.0.0", + "fancy-log": "^1.1.0", + "gulplog": "^1.0.0", + "has-gulplog": "^0.1.0", + "lodash._reescape": "^3.0.0", + "lodash._reevaluate": "^3.0.0", + "lodash._reinterpolate": "^3.0.0", + "lodash.template": "^3.0.0", + "minimist": "^1.1.0", + "multipipe": "^0.1.2", + "object-assign": "^3.0.0", + "replace-ext": "0.0.1", + "through2": "^2.0.0", + "vinyl": "^0.5.0" + }, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "readable-stream": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "through2": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "dev": true, + "requires": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + } + }, + "xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "dev": true + } + } + }, + "gulplog": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/gulplog/-/gulplog-1.0.0.tgz", + "integrity": "sha1-4oxNRdBey77YGDY86PnFkmIp/+U=", + "dev": true, + "requires": { + "glogg": "^1.0.0" + } + }, + "has-ansi": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", + "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "has-gulplog": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/has-gulplog/-/has-gulplog-0.1.0.tgz", + "integrity": "sha1-ZBTIKRNpfaUVkDl9r7EvIpZ4Ec4=", + "dev": true, + "requires": { + "sparkles": "^1.0.0" + } + }, + "has-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", + "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", + "dev": true, + "requires": { + "get-value": "^2.0.6", + "has-values": "^1.0.0", + "isobject": "^3.0.0" + } + }, + "has-values": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", + "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", + "dev": true, + "requires": { + "is-number": "^3.0.0", + "kind-of": "^4.0.0" + }, + "dependencies": { + "kind-of": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", + "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "hash-base": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.0.4.tgz", + "integrity": "sha1-X8hoaEfs1zSZQDMZprCj8/auSRg=", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "hash.js": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", + "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "minimalistic-assert": "^1.0.1" + } + }, + "hmac-drbg": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", + "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", + "dev": true, + "requires": { + "hash.js": "^1.0.3", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.1" + } + }, + "homedir-polyfill": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz", + "integrity": "sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==", + "dev": true, + "requires": { + "parse-passwd": "^1.0.0" + } + }, + "http-browserify": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/http-browserify/-/http-browserify-1.7.0.tgz", + "integrity": "sha1-M3la3nLfiKz7/TZ3PO/tp2RzWyA=", + "dev": true, + "requires": { + "Base64": "~0.2.0", + "inherits": "~2.0.1" + } + }, + "https-browserify": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-0.0.1.tgz", + "integrity": "sha1-P5E2XKvmC3ftDruiS0VOPgnZWoI=", + "dev": true + }, + "ieee754": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.13.tgz", + "integrity": "sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==", + "dev": true + }, + "indexof": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz", + "integrity": "sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10=", + "dev": true + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dev": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "ini": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", + "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==", + "dev": true + }, + "inline-source-map": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/inline-source-map/-/inline-source-map-0.3.1.tgz", + "integrity": "sha1-pSi1FOaJ/OkNswiehw2S9Sestes=", + "dev": true, + "requires": { + "source-map": "~0.3.0" + }, + "dependencies": { + "source-map": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.3.0.tgz", + "integrity": "sha1-hYb7mloAXltQHiHNGLbyG0V60fk=", + "dev": true, + "requires": { + "amdefine": ">=0.0.4" + } + } + } + }, + "insert-module-globals": { + "version": "6.6.3", + "resolved": "https://registry.npmjs.org/insert-module-globals/-/insert-module-globals-6.6.3.tgz", + "integrity": "sha1-IGOOKaMPntHKLjqCX7wsulJG3fw=", + "dev": true, + "requires": { + "JSONStream": "^1.0.3", + "combine-source-map": "~0.6.1", + "concat-stream": "~1.4.1", + "is-buffer": "^1.1.0", + "lexical-scope": "^1.2.0", + "process": "~0.11.0", + "through2": "^1.0.0", + "xtend": "^4.0.0" + }, + "dependencies": { + "JSONStream": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.5.tgz", + "integrity": "sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==", + "dev": true, + "requires": { + "jsonparse": "^1.2.0", + "through": ">=2.2.7 <3" + } + }, + "combine-source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/combine-source-map/-/combine-source-map-0.6.1.tgz", + "integrity": "sha1-m0oJwxYDPXaODxHgKfonMOB5rZY=", + "dev": true, + "requires": { + "convert-source-map": "~1.1.0", + "inline-source-map": "~0.5.0", + "lodash.memoize": "~3.0.3", + "source-map": "~0.4.2" + } + }, + "convert-source-map": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.1.3.tgz", + "integrity": "sha1-SCnId+n+SbMWHzvzZziI4gRpmGA=", + "dev": true + }, + "inline-source-map": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/inline-source-map/-/inline-source-map-0.5.0.tgz", + "integrity": "sha1-Skxd2OT7Xps82mDIIt+tyu5m4K8=", + "dev": true, + "requires": { + "source-map": "~0.4.0" + } + }, + "jsonparse": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", + "integrity": "sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA=", + "dev": true + }, + "process": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=", + "dev": true + }, + "source-map": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz", + "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=", + "dev": true, + "requires": { + "amdefine": ">=0.0.4" + } + }, + "xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "dev": true + } + } + }, + "interpret": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.2.0.tgz", + "integrity": "sha512-mT34yGKMNceBQUoVn7iCDKDntA7SC6gycMAWzGx1z/CMCTV7b2AAtXlo3nRyHZ1FelRkQbQjprHSYGwzLtkVbw==", + "dev": true + }, + "is-absolute": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-absolute/-/is-absolute-1.0.0.tgz", + "integrity": "sha512-dOWoqflvcydARa360Gvv18DZ/gRuHKi2NU/wU5X1ZFzdYfH29nkiNZsF3mp4OJ3H4yo9Mx8A/uAGNzpzPN3yBA==", + "dev": true, + "requires": { + "is-relative": "^1.0.0", + "is-windows": "^1.0.1" + } + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", + "dev": true + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + }, + "dependencies": { + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + } + } + }, + "is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", + "dev": true + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "dev": true + }, + "is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "dev": true, + "requires": { + "is-extglob": "^2.1.0" + } + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-path-cwd": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-1.0.0.tgz", + "integrity": "sha1-0iXsIxMuie3Tj9p2dHLmLmXxEG0=", + "dev": true + }, + "is-path-in-cwd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-1.0.1.tgz", + "integrity": "sha512-FjV1RTW48E7CWM7eE/J2NJvAEEVektecDBVBE5Hh3nM1Jd0kvhHtX68Pr3xsDf857xt3Y4AkwVULK1Vku62aaQ==", + "dev": true, + "requires": { + "is-path-inside": "^1.0.0" + } + }, + "is-path-inside": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.1.tgz", + "integrity": "sha1-jvW33lBDej/cprToZe96pVy0gDY=", + "dev": true, + "requires": { + "path-is-inside": "^1.0.1" + } + }, + "is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dev": true, + "requires": { + "isobject": "^3.0.1" + } + }, + "is-relative": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-relative/-/is-relative-1.0.0.tgz", + "integrity": "sha512-Kw/ReK0iqwKeu0MITLFuj0jbPAmEiOsIwyIXvvbfa6QfmN9pkD1M+8pdk7Rl/dTKbH34/XBFMbgD4iMJhLQbGA==", + "dev": true, + "requires": { + "is-unc-path": "^1.0.0" + } + }, + "is-unc-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-unc-path/-/is-unc-path-1.0.0.tgz", + "integrity": "sha512-mrGpVd0fs7WWLfVsStvgF6iEJnbjDFZh9/emhRDcGWTduTfNHd9CHeUwH3gYIjdbwo4On6hunkztwOaAw0yllQ==", + "dev": true, + "requires": { + "unc-path-regex": "^0.1.2" + } + }, + "is-utf8": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", + "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=", + "dev": true + }, + "is-windows": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", + "dev": true + }, + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", + "dev": true + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", + "dev": true + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + }, + "json-stable-stringify": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-0.0.1.tgz", + "integrity": "sha1-YRwj6BTbN1Un34URk9tZ3Sryf0U=", + "dev": true, + "requires": { + "jsonify": "~0.0.0" + } + }, + "jsonify": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz", + "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=", + "dev": true + }, + "jsonparse": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-0.0.5.tgz", + "integrity": "sha1-MwVCrT8KZUZlt3jz6y2an6UHrGQ=", + "dev": true + }, + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "dev": true + }, + "labeled-stream-splicer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/labeled-stream-splicer/-/labeled-stream-splicer-1.0.2.tgz", + "integrity": "sha1-RhUzFTd4SYHo/SZOHzpDTE4N3WU=", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "isarray": "~0.0.1", + "stream-splicer": "^1.1.0" + } + }, + "lazy-cache": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz", + "integrity": "sha1-odePw6UEdMuAhF07O24dpJpEbo4=", + "dev": true + }, + "lexical-scope": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/lexical-scope/-/lexical-scope-1.2.0.tgz", + "integrity": "sha1-/Ope3HBKSzqHls3KQZw6CvryLfQ=", + "dev": true, + "requires": { + "astw": "^2.0.0" + } + }, + "liftoff": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/liftoff/-/liftoff-2.5.0.tgz", + "integrity": "sha1-IAkpG7Mc6oYbvxCnwVooyvdcMew=", + "dev": true, + "requires": { + "extend": "^3.0.0", + "findup-sync": "^2.0.0", + "fined": "^1.0.1", + "flagged-respawn": "^1.0.0", + "is-plain-object": "^2.0.4", + "object.map": "^1.0.0", + "rechoir": "^0.6.2", + "resolve": "^1.1.7" + }, + "dependencies": { + "resolve": { + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.12.0.tgz", + "integrity": "sha512-B/dOmuoAik5bKcD6s6nXDCjzUKnaDvdkRyAk6rsmsKLipWj4797iothd7jmmUhWTfinVMU+wc56rYKsit2Qy4w==", + "dev": true, + "requires": { + "path-parse": "^1.0.6" + } + } + } + }, + "lodash": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-1.0.2.tgz", + "integrity": "sha1-j1dWDIO1n8JwvT1WG2kAQ0MOJVE=", + "dev": true + }, + "lodash._basecopy": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/lodash._basecopy/-/lodash._basecopy-3.0.1.tgz", + "integrity": "sha1-jaDmqHbPNEwK2KVIghEd08XHyjY=", + "dev": true + }, + "lodash._basetostring": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/lodash._basetostring/-/lodash._basetostring-3.0.1.tgz", + "integrity": "sha1-0YYdh3+CSlL2aYMtyvPuFVZqB9U=", + "dev": true + }, + "lodash._basevalues": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lodash._basevalues/-/lodash._basevalues-3.0.0.tgz", + "integrity": "sha1-W3dXYoAr3j0yl1A+JjAIIP32Ybc=", + "dev": true + }, + "lodash._getnative": { + "version": "3.9.1", + "resolved": "https://registry.npmjs.org/lodash._getnative/-/lodash._getnative-3.9.1.tgz", + "integrity": "sha1-VwvH3t5G1hzc3mh9ZdPuy6o6r/U=", + "dev": true + }, + "lodash._isiterateecall": { + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/lodash._isiterateecall/-/lodash._isiterateecall-3.0.9.tgz", + "integrity": "sha1-UgOte6Ql+uhCRg5pbbnPPmqsBXw=", + "dev": true + }, + "lodash._reescape": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lodash._reescape/-/lodash._reescape-3.0.0.tgz", + "integrity": "sha1-Kx1vXf4HyKNVdT5fJ/rH8c3hYWo=", + "dev": true + }, + "lodash._reevaluate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lodash._reevaluate/-/lodash._reevaluate-3.0.0.tgz", + "integrity": "sha1-WLx0xAZklTrgsSTYBpltrKQx4u0=", + "dev": true + }, + "lodash._reinterpolate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz", + "integrity": "sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0=", + "dev": true + }, + "lodash._root": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/lodash._root/-/lodash._root-3.0.1.tgz", + "integrity": "sha1-+6HEUkwZ7ppfgTa0YJ8BfPTe1pI=", + "dev": true + }, + "lodash.defaults": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-4.2.0.tgz", + "integrity": "sha1-0JF4cW/+pN3p5ft7N/bwgCJ0WAw=", + "dev": true + }, + "lodash.escape": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/lodash.escape/-/lodash.escape-3.2.0.tgz", + "integrity": "sha1-mV7g3BjBtIzJLv+ucaEKq1tIdpg=", + "dev": true, + "requires": { + "lodash._root": "^3.0.0" + } + }, + "lodash.isarguments": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz", + "integrity": "sha1-L1c9hcaiQon/AGY7SRwdM4/zRYo=", + "dev": true + }, + "lodash.isarray": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/lodash.isarray/-/lodash.isarray-3.0.4.tgz", + "integrity": "sha1-eeTriMNqgSKvhvhEqpvNhRtfu1U=", + "dev": true + }, + "lodash.keys": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-3.1.2.tgz", + "integrity": "sha1-TbwEcrFWvlCgsoaFXRvQsMZWCYo=", + "dev": true, + "requires": { + "lodash._getnative": "^3.0.0", + "lodash.isarguments": "^3.0.0", + "lodash.isarray": "^3.0.0" + } + }, + "lodash.memoize": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-3.0.4.tgz", + "integrity": "sha1-LcvSwofLwKVcxCMovQxzYVDVPj8=", + "dev": true + }, + "lodash.restparam": { + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/lodash.restparam/-/lodash.restparam-3.6.1.tgz", + "integrity": "sha1-k2pOMJ7zMKdkXtQUWYbIWuWyCAU=", + "dev": true + }, + "lodash.template": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-3.6.2.tgz", + "integrity": "sha1-+M3sxhaaJVvpCYrosMU9N4kx0U8=", + "dev": true, + "requires": { + "lodash._basecopy": "^3.0.0", + "lodash._basetostring": "^3.0.0", + "lodash._basevalues": "^3.0.0", + "lodash._isiterateecall": "^3.0.0", + "lodash._reinterpolate": "^3.0.0", + "lodash.escape": "^3.0.0", + "lodash.keys": "^3.0.0", + "lodash.restparam": "^3.0.0", + "lodash.templatesettings": "^3.0.0" + } + }, + "lodash.templatesettings": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-3.1.1.tgz", + "integrity": "sha1-+zB4RHU7Zrnxr6VOJix0UwfbqOU=", + "dev": true, + "requires": { + "lodash._reinterpolate": "^3.0.0", + "lodash.escape": "^3.0.0" + } + }, + "longest": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz", + "integrity": "sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc=", + "dev": true + }, + "lru-cache": { + "version": "2.7.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.7.3.tgz", + "integrity": "sha1-bUUk6LlV+V1PW1iFHOId1y+06VI=", + "dev": true + }, + "make-iterator": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/make-iterator/-/make-iterator-1.0.1.tgz", + "integrity": "sha512-pxiuXh0iVEq7VM7KMIhs5gxsfxCux2URptUQaXo4iZZJxBAzTPOLE2BumO5dbfVYq/hBJFBR/a1mFDmOx5AGmw==", + "dev": true, + "requires": { + "kind-of": "^6.0.2" + } + }, + "map-cache": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", + "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", + "dev": true + }, + "map-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", + "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", + "dev": true, + "requires": { + "object-visit": "^1.0.0" + } + }, + "md5.js": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", + "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", + "dev": true, + "requires": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dev": true, + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + } + }, + "miller-rabin": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", + "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", + "dev": true, + "requires": { + "bn.js": "^4.0.0", + "brorand": "^1.0.1" + } + }, + "minimalistic-assert": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", + "dev": true + }, + "minimalistic-crypto-utils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", + "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=", + "dev": true + }, + "minimatch": { + "version": "2.0.10", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-2.0.10.tgz", + "integrity": "sha1-jQh8OcazjAAbl/ynzm0OHoCvusc=", + "dev": true, + "requires": { + "brace-expansion": "^1.0.0" + } + }, + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true + }, + "mixin-deep": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", + "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", + "dev": true, + "requires": { + "for-in": "^1.0.2", + "is-extendable": "^1.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4" + } + } + } + }, + "mkdirp": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "dev": true, + "requires": { + "minimist": "0.0.8" + }, + "dependencies": { + "minimist": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", + "dev": true + } + } + }, + "module-deps": { + "version": "3.9.1", + "resolved": "https://registry.npmjs.org/module-deps/-/module-deps-3.9.1.tgz", + "integrity": "sha1-6nXK+RmQkNJbDVUStaysuW5/h/M=", + "dev": true, + "requires": { + "JSONStream": "^1.0.3", + "browser-resolve": "^1.7.0", + "concat-stream": "~1.4.5", + "defined": "^1.0.0", + "detective": "^4.0.0", + "duplexer2": "0.0.2", + "inherits": "^2.0.1", + "parents": "^1.0.0", + "readable-stream": "^1.1.13", + "resolve": "^1.1.3", + "stream-combiner2": "~1.0.0", + "subarg": "^1.0.0", + "through2": "^1.0.0", + "xtend": "^4.0.0" + }, + "dependencies": { + "JSONStream": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.5.tgz", + "integrity": "sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==", + "dev": true, + "requires": { + "jsonparse": "^1.2.0", + "through": ">=2.2.7 <3" + } + }, + "defined": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz", + "integrity": "sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM=", + "dev": true + }, + "jsonparse": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", + "integrity": "sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA=", + "dev": true + }, + "resolve": { + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.12.0.tgz", + "integrity": "sha512-B/dOmuoAik5bKcD6s6nXDCjzUKnaDvdkRyAk6rsmsKLipWj4797iothd7jmmUhWTfinVMU+wc56rYKsit2Qy4w==", + "dev": true, + "requires": { + "path-parse": "^1.0.6" + } + }, + "xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "dev": true + } + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "multipipe": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/multipipe/-/multipipe-0.1.2.tgz", + "integrity": "sha1-Ko8t33Du1WTf8tV/HhoTfZ8FB4s=", + "dev": true, + "requires": { + "duplexer2": "0.0.2" + } + }, + "nanomatch": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", + "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", + "dev": true, + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "fragment-cache": "^0.2.1", + "is-windows": "^1.0.2", + "kind-of": "^6.0.2", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + } + }, + "natives": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/natives/-/natives-1.1.6.tgz", + "integrity": "sha512-6+TDFewD4yxY14ptjKaS63GVdtKiES1pTPyxn9Jb0rBqPMZ7VcCiooEhPNsr+mqHtMGxa/5c/HhcC4uPEUw/nA==", + "dev": true + }, + "ngraph.centrality": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/ngraph.centrality/-/ngraph.centrality-0.3.0.tgz", + "integrity": "sha1-jMDsAxnvCjdDV/wQRMFpdbF50J0=" + }, + "ngraph.events": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/ngraph.events/-/ngraph.events-0.0.3.tgz", + "integrity": "sha1-OPVTFvPSB61jH/lPZiLKjywOh9A=" + }, + "ngraph.expose": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/ngraph.expose/-/ngraph.expose-0.0.0.tgz", + "integrity": "sha1-dGw0kDo4SMRdAzsUvGRhnqhf5ao=" + }, + "ngraph.forcelayout": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/ngraph.forcelayout/-/ngraph.forcelayout-0.5.0.tgz", + "integrity": "sha1-UVEcPh20XT1UNtp137HWrwl5FvU=", + "requires": { + "ngraph.events": "0.0.4", + "ngraph.physics.simulator": "^0.3.0" + }, + "dependencies": { + "ngraph.events": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/ngraph.events/-/ngraph.events-0.0.4.tgz", + "integrity": "sha1-css2RIjdD9fwV0WESfajsXpyLZo=" + } + } + }, + "ngraph.fromjson": { + "version": "0.1.9", + "resolved": "https://registry.npmjs.org/ngraph.fromjson/-/ngraph.fromjson-0.1.9.tgz", + "integrity": "sha1-ZpELZkxp+jxQoc553R391bq0b24=", + "requires": { + "ngraph.graph": "0.0.14" + } + }, + "ngraph.generators": { + "version": "0.0.19", + "resolved": "https://registry.npmjs.org/ngraph.generators/-/ngraph.generators-0.0.19.tgz", + "integrity": "sha1-VSwNCH+UK50NKwxsqarENr76dlk=", + "requires": { + "ngraph.graph": "0.0.14", + "ngraph.random": "0.1.0" + }, + "dependencies": { + "ngraph.random": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/ngraph.random/-/ngraph.random-0.1.0.tgz", + "integrity": "sha1-G26Vc1KeCAZ32m/6CYeQ12oJSKk=" + } + } + }, + "ngraph.graph": { + "version": "0.0.14", + "resolved": "https://registry.npmjs.org/ngraph.graph/-/ngraph.graph-0.0.14.tgz", + "integrity": "sha1-1HrJSWfJIKr3aVLYpOczRuHfLbc=", + "requires": { + "ngraph.events": "0.0.3" + } + }, + "ngraph.merge": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/ngraph.merge/-/ngraph.merge-0.0.1.tgz", + "integrity": "sha1-5OgM43WBo8lrF9VF46Q8hUNLkCU=" + }, + "ngraph.physics.primitives": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/ngraph.physics.primitives/-/ngraph.physics.primitives-0.0.7.tgz", + "integrity": "sha1-Xcnhebofkubex3SwHNaJFBILeVs=" + }, + "ngraph.physics.simulator": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/ngraph.physics.simulator/-/ngraph.physics.simulator-0.3.0.tgz", + "integrity": "sha1-fKb8PjYXxz4QgFcuqo4E27d+AQI=", + "requires": { + "ngraph.events": "0.0.3", + "ngraph.expose": "0.0.0", + "ngraph.merge": "0.0.1", + "ngraph.physics.primitives": "0.0.7", + "ngraph.quadtreebh": "0.0.4", + "ngraph.random": "0.0.1" + } + }, + "ngraph.quadtreebh": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/ngraph.quadtreebh/-/ngraph.quadtreebh-0.0.4.tgz", + "integrity": "sha1-xwDUTm5K8HttBQAbo5h/9eLc1iw=", + "requires": { + "ngraph.random": "0.0.1" + } + }, + "ngraph.random": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/ngraph.random/-/ngraph.random-0.0.1.tgz", + "integrity": "sha1-wAji67/f+vF+0Q5LvJE+VnFmvPg=" + }, + "ngraph.remove-overlaps": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/ngraph.remove-overlaps/-/ngraph.remove-overlaps-1.0.0.tgz", + "integrity": "sha1-tMBjVT6kzx/3gWjnt//2JhfA2fQ=", + "dev": true + }, + "ngraph.tojson": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/ngraph.tojson/-/ngraph.tojson-0.1.4.tgz", + "integrity": "sha1-OfAEZYhECt5iLVhzTVideXSgs7w=" + }, + "nopt": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-2.2.1.tgz", + "integrity": "sha1-KqCbfRdoSHs7ianFqlIzW/8Lrqc=", + "dev": true, + "requires": { + "abbrev": "1" + } + }, + "object-assign": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-3.0.0.tgz", + "integrity": "sha1-m+3VygiXlJvKR+f/QIBi1Un1h/I=", + "dev": true + }, + "object-copy": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", + "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", + "dev": true, + "requires": { + "copy-descriptor": "^0.1.0", + "define-property": "^0.2.5", + "kind-of": "^3.0.3" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "object-visit": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", + "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", + "dev": true, + "requires": { + "isobject": "^3.0.0" + } + }, + "object.defaults": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/object.defaults/-/object.defaults-1.1.0.tgz", + "integrity": "sha1-On+GgzS0B96gbaFtiNXNKeQ1/s8=", + "dev": true, + "requires": { + "array-each": "^1.0.1", + "array-slice": "^1.0.0", + "for-own": "^1.0.0", + "isobject": "^3.0.0" + } + }, + "object.map": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object.map/-/object.map-1.0.1.tgz", + "integrity": "sha1-z4Plncj8wK1fQlDh94s7gb2AHTc=", + "dev": true, + "requires": { + "for-own": "^1.0.0", + "make-iterator": "^1.0.0" + } + }, + "object.pick": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", + "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", + "dev": true, + "requires": { + "isobject": "^3.0.1" + } + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dev": true, + "requires": { + "wrappy": "1" + } + }, + "onetime": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-1.1.0.tgz", + "integrity": "sha1-ofeDj4MUxRbwXs78vEzP4EtO14k=", + "dev": true + }, + "optimist": { + "version": "0.3.7", + "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.3.7.tgz", + "integrity": "sha1-yQlBrVnkJzMokjB00s8ufLxuwNk=", + "dev": true, + "requires": { + "wordwrap": "~0.0.2" + } + }, + "orchestrator": { + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/orchestrator/-/orchestrator-0.3.8.tgz", + "integrity": "sha1-FOfp4nZPcxX7rBhOUGx6pt+UrX4=", + "dev": true, + "requires": { + "end-of-stream": "~0.1.5", + "sequencify": "~0.0.7", + "stream-consume": "~0.1.0" + } + }, + "ordered-read-streams": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/ordered-read-streams/-/ordered-read-streams-0.1.0.tgz", + "integrity": "sha1-/VZamvjrRHO6abbtijQ1LLVS8SY=", + "dev": true + }, + "os-browserify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.1.2.tgz", + "integrity": "sha1-ScoCk+CxlZCl9d4Qx/JlphfY/lQ=", + "dev": true + }, + "os-homedir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", + "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", + "dev": true + }, + "pako": { + "version": "0.2.9", + "resolved": "https://registry.npmjs.org/pako/-/pako-0.2.9.tgz", + "integrity": "sha1-8/dSL073gjSNqBYbrZ7P1Rv4OnU=", + "dev": true + }, + "parents": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parents/-/parents-1.0.1.tgz", + "integrity": "sha1-/t1NK/GTp3dF/nHjcdc8MwfZx1E=", + "dev": true, + "requires": { + "path-platform": "~0.11.15" + } + }, + "parse-asn1": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.5.tgz", + "integrity": "sha512-jkMYn1dcJqF6d5CpU689bq7w/b5ALS9ROVSpQDPrZsqqesUJii9qutvoT5ltGedNXMO2e16YUWIghG9KxaViTQ==", + "dev": true, + "requires": { + "asn1.js": "^4.0.0", + "browserify-aes": "^1.0.0", + "create-hash": "^1.1.0", + "evp_bytestokey": "^1.0.0", + "pbkdf2": "^3.0.3", + "safe-buffer": "^5.1.1" + } + }, + "parse-filepath": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/parse-filepath/-/parse-filepath-1.0.2.tgz", + "integrity": "sha1-pjISf1Oq89FYdvWHLz/6x2PWyJE=", + "dev": true, + "requires": { + "is-absolute": "^1.0.0", + "map-cache": "^0.2.0", + "path-root": "^0.1.1" + } + }, + "parse-node-version": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parse-node-version/-/parse-node-version-1.0.1.tgz", + "integrity": "sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA==", + "dev": true + }, + "parse-passwd": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz", + "integrity": "sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=", + "dev": true + }, + "pascalcase": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", + "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=", + "dev": true + }, + "path-browserify": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.1.tgz", + "integrity": "sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ==", + "dev": true + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "dev": true + }, + "path-is-inside": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", + "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=", + "dev": true + }, + "path-parse": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", + "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", + "dev": true + }, + "path-platform": { + "version": "0.11.15", + "resolved": "https://registry.npmjs.org/path-platform/-/path-platform-0.11.15.tgz", + "integrity": "sha1-6GQhf3TDaFDwhSt43Hv31KVyG/I=", + "dev": true + }, + "path-root": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/path-root/-/path-root-0.1.1.tgz", + "integrity": "sha1-mkpoFMrBwM1zNgqV8yCDyOpHRbc=", + "dev": true, + "requires": { + "path-root-regex": "^0.1.0" + } + }, + "path-root-regex": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/path-root-regex/-/path-root-regex-0.1.2.tgz", + "integrity": "sha1-v8zcjfWxLcUsi0PsONGNcsBLqW0=", + "dev": true + }, + "pbkdf2": { + "version": "3.0.17", + "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.0.17.tgz", + "integrity": "sha512-U/il5MsrZp7mGg3mSQfn742na2T+1/vHDCG5/iTI3X9MKUuYUZVLQhyRsg06mCgDBTd57TxzgZt7P+fYfjRLtA==", + "dev": true, + "requires": { + "create-hash": "^1.1.2", + "create-hmac": "^1.1.4", + "ripemd160": "^2.0.1", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + } + }, + "posix-character-classes": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", + "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=", + "dev": true + }, + "pretty-hrtime": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz", + "integrity": "sha1-t+PqQkNaTJsnWdmeDyAesZWALuE=", + "dev": true + }, + "process": { + "version": "0.10.1", + "resolved": "https://registry.npmjs.org/process/-/process-0.10.1.tgz", + "integrity": "sha1-hCRXzFHP7XLcd1r+6vuMYDQ3JyU=", + "dev": true + }, + "process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "dev": true + }, + "public-encrypt": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz", + "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==", + "dev": true, + "requires": { + "bn.js": "^4.1.0", + "browserify-rsa": "^4.0.0", + "create-hash": "^1.1.0", + "parse-asn1": "^5.0.0", + "randombytes": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "punycode": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.2.4.tgz", + "integrity": "sha1-VACKyXKux0F13vnLpt9/qdORh0A=", + "dev": true + }, + "querystring": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", + "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=", + "dev": true + }, + "querystring-es3": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", + "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=", + "dev": true + }, + "randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "dev": true, + "requires": { + "safe-buffer": "^5.1.0" + } + }, + "randomfill": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz", + "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", + "dev": true, + "requires": { + "randombytes": "^2.0.5", + "safe-buffer": "^5.1.0" + } + }, + "readable-stream": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", + "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + }, + "readable-wrap": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/readable-wrap/-/readable-wrap-1.0.0.tgz", + "integrity": "sha1-O1ohHGMeEjA6VJkcgGwX564ga/8=", + "dev": true, + "requires": { + "readable-stream": "^1.1.13-1" + } + }, + "rechoir": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", + "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=", + "dev": true, + "requires": { + "resolve": "^1.1.6" + }, + "dependencies": { + "resolve": { + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.12.0.tgz", + "integrity": "sha512-B/dOmuoAik5bKcD6s6nXDCjzUKnaDvdkRyAk6rsmsKLipWj4797iothd7jmmUhWTfinVMU+wc56rYKsit2Qy4w==", + "dev": true, + "requires": { + "path-parse": "^1.0.6" + } + } + } + }, + "regex-not": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", + "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", + "dev": true, + "requires": { + "extend-shallow": "^3.0.2", + "safe-regex": "^1.1.0" + } + }, + "repeat-element": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz", + "integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==", + "dev": true + }, + "repeat-string": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", + "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", + "dev": true + }, + "replace-ext": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-0.0.1.tgz", + "integrity": "sha1-KbvZIHinOfC8zitO5B6DeVNSKSQ=", + "dev": true + }, + "resolve": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-0.7.4.tgz", + "integrity": "sha1-OVqe+ehz+/4SvRRAi9kbuTYAPWk=", + "dev": true + }, + "resolve-dir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz", + "integrity": "sha1-eaQGRMNivoLybv/nOcm7U4IEb0M=", + "dev": true, + "requires": { + "expand-tilde": "^2.0.0", + "global-modules": "^1.0.0" + } + }, + "resolve-url": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", + "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=", + "dev": true + }, + "ret": { + "version": "0.1.15", + "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", + "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", + "dev": true + }, + "rfile": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/rfile/-/rfile-1.0.0.tgz", + "integrity": "sha1-WXCM+Qyh50xUw8/Fw2/bmBBDUmE=", + "dev": true, + "requires": { + "callsite": "~1.0.0", + "resolve": "~0.3.0" + }, + "dependencies": { + "resolve": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-0.3.1.tgz", + "integrity": "sha1-NMY0R8ZkxwWY0cmxJvxDsqJDEKQ=", + "dev": true + } + } + }, + "right-align": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/right-align/-/right-align-0.1.3.tgz", + "integrity": "sha1-YTObci/mo1FWiSENJOFMlhSGE+8=", + "dev": true, + "requires": { + "align-text": "^0.1.1" + } + }, + "rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dev": true, + "requires": { + "glob": "^7.1.3" + }, + "dependencies": { + "glob": { + "version": "7.1.5", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.5.tgz", + "integrity": "sha512-J9dlskqUXK1OeTOYBEn5s8aMukWMwWfs+rPTn/jn50Ux4MNXVhubL1wu/j2t+H4NVI+cXEcCaYellqaPVGXNqQ==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + } + } + }, + "ripemd160": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", + "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", + "dev": true, + "requires": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1" + } + }, + "ruglify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/ruglify/-/ruglify-1.0.0.tgz", + "integrity": "sha1-3Ikw4qlUSidDAcyZcldMDQmGtnU=", + "dev": true, + "requires": { + "rfile": "~1.0", + "uglify-js": "~2.2" + }, + "dependencies": { + "uglify-js": { + "version": "2.2.5", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.2.5.tgz", + "integrity": "sha1-puAqcNg5eSuXgEiLe4sYTAlcmcc=", + "dev": true, + "requires": { + "optimist": "~0.3.5", + "source-map": "~0.1.7" + } + } + } + }, + "runforcover": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/runforcover/-/runforcover-0.0.2.tgz", + "integrity": "sha1-NE8FfY1F0zrrxsyCIEZ49pxIV8w=", + "dev": true, + "requires": { + "bunker": "0.1.X" + } + }, + "safe-buffer": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.0.tgz", + "integrity": "sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg==", + "dev": true + }, + "safe-regex": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", + "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", + "dev": true, + "requires": { + "ret": "~0.1.10" + } + }, + "semver": { + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/semver/-/semver-4.3.6.tgz", + "integrity": "sha1-MAvG4OhjdPe6YQaLWx7NV/xlMto=", + "dev": true + }, + "sequencify": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/sequencify/-/sequencify-0.0.7.tgz", + "integrity": "sha1-kM/xnQLgcCf9dn9erT57ldHnOAw=", + "dev": true + }, + "set-immediate-shim": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz", + "integrity": "sha1-SysbJ+uAip+NzEgaWOXlb1mfP2E=", + "dev": true + }, + "set-value": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", + "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-extendable": "^0.1.1", + "is-plain-object": "^2.0.3", + "split-string": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "sha.js": { + "version": "2.4.11", + "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", + "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "shallow-copy": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/shallow-copy/-/shallow-copy-0.0.1.tgz", + "integrity": "sha1-QV9CcC1z2BAzApLMXuhurhoRoXA=", + "dev": true + }, + "shasum": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/shasum/-/shasum-1.0.2.tgz", + "integrity": "sha1-5wEjENj0F/TetXEhUOVni4euVl8=", + "dev": true, + "requires": { + "json-stable-stringify": "~0.0.0", + "sha.js": "~2.4.4" + } + }, + "shell-quote": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-0.0.1.tgz", + "integrity": "sha1-GkEZbzwDM8SCMjWT1ohuzxU92YY=", + "dev": true + }, + "sigmund": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.1.tgz", + "integrity": "sha1-P/IfGYytIXX587eBhT/ZTQ0ZtZA=", + "dev": true + }, + "simplesvg": { + "version": "0.0.10", + "resolved": "https://registry.npmjs.org/simplesvg/-/simplesvg-0.0.10.tgz", + "integrity": "sha1-N9LsGN4sFU3Ztp956K0gvx4eX90=", + "requires": { + "add-event-listener": "0.0.1" + } + }, + "slide": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/slide/-/slide-1.1.6.tgz", + "integrity": "sha1-VusCfWW00tzmyy4tMsTUr8nh1wc=", + "dev": true + }, + "snapdragon": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", + "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", + "dev": true, + "requires": { + "base": "^0.11.1", + "debug": "^2.2.0", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "map-cache": "^0.2.2", + "source-map": "^0.5.6", + "source-map-resolve": "^0.5.0", + "use": "^3.1.0" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + } + } + }, + "snapdragon-node": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", + "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", + "dev": true, + "requires": { + "define-property": "^1.0.0", + "isobject": "^3.0.0", + "snapdragon-util": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "snapdragon-util": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", + "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", + "dev": true, + "requires": { + "kind-of": "^3.2.0" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "source-map": { + "version": "0.1.43", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.1.43.tgz", + "integrity": "sha1-wkvBRspRfBRx9drL4lcbK3+eM0Y=", + "dev": true, + "requires": { + "amdefine": ">=0.0.4" + } + }, + "source-map-resolve": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.2.tgz", + "integrity": "sha512-MjqsvNwyz1s0k81Goz/9vRBe9SZdB09Bdw+/zYyO+3CuPk6fouTaxscHkgtE8jKvf01kVfl8riHzERQ/kefaSA==", + "dev": true, + "requires": { + "atob": "^2.1.1", + "decode-uri-component": "^0.2.0", + "resolve-url": "^0.2.1", + "source-map-url": "^0.4.0", + "urix": "^0.1.0" + } + }, + "source-map-url": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz", + "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=", + "dev": true + }, + "sparkles": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/sparkles/-/sparkles-1.0.1.tgz", + "integrity": "sha512-dSO0DDYUahUt/0/pD/Is3VIm5TGJjludZ0HVymmhYF6eNA53PVLhnUk0znSYbH8IYBuJdCE+1luR22jNLMaQdw==", + "dev": true + }, + "split-string": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", + "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", + "dev": true, + "requires": { + "extend-shallow": "^3.0.0" + } + }, + "static-extend": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", + "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", + "dev": true, + "requires": { + "define-property": "^0.2.5", + "object-copy": "^0.1.0" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + } + } + }, + "stream-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-1.0.0.tgz", + "integrity": "sha1-v5tKv7QrJ011FHnkTg/yZWtvEZM=", + "dev": true, + "requires": { + "inherits": "~2.0.1", + "readable-stream": "^1.0.27-1" + } + }, + "stream-combiner2": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/stream-combiner2/-/stream-combiner2-1.0.2.tgz", + "integrity": "sha1-unKmtQy/q/qVD8i8h2BL0B62BnE=", + "dev": true, + "requires": { + "duplexer2": "~0.0.2", + "through2": "~0.5.1" + }, + "dependencies": { + "readable-stream": { + "version": "1.0.34", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", + "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + }, + "through2": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/through2/-/through2-0.5.1.tgz", + "integrity": "sha1-390BLrnHAOIyP9M084rGIqs3Lac=", + "dev": true, + "requires": { + "readable-stream": "~1.0.17", + "xtend": "~3.0.0" + } + } + } + }, + "stream-consume": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/stream-consume/-/stream-consume-0.1.1.tgz", + "integrity": "sha512-tNa3hzgkjEP7XbCkbRXe1jpg+ievoa0O4SCFlMOYEscGSS4JJsckGL8swUyAa/ApGU3Ae4t6Honor4HhL+tRyg==", + "dev": true + }, + "stream-splicer": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/stream-splicer/-/stream-splicer-1.3.2.tgz", + "integrity": "sha1-PARBvhW5v04iYnXm3IOWR0VUZmE=", + "dev": true, + "requires": { + "indexof": "0.0.1", + "inherits": "^2.0.1", + "isarray": "~0.0.1", + "readable-stream": "^1.1.13-1", + "readable-wrap": "^1.0.0", + "through2": "^1.0.0" + } + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", + "dev": true + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "strip-bom": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-1.0.0.tgz", + "integrity": "sha1-hbiGLzhEtabV7IRnqTWYFzo295Q=", + "dev": true, + "requires": { + "first-chunk-stream": "^1.0.0", + "is-utf8": "^0.2.0" + } + }, + "subarg": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/subarg/-/subarg-1.0.0.tgz", + "integrity": "sha1-9izxdYHplrSPyWVpn1TAauJouNI=", + "dev": true, + "requires": { + "minimist": "^1.1.0" + } + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + }, + "syntax-error": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/syntax-error/-/syntax-error-1.4.0.tgz", + "integrity": "sha512-YPPlu67mdnHGTup2A8ff7BC2Pjq0e0Yp/IyTFN03zWO0RcK07uLcbi7C2KpGR2FvWbaB0+bfE27a+sBKebSo7w==", + "dev": true, + "requires": { + "acorn-node": "^1.2.0" + } + }, + "tap": { + "version": "0.4.13", + "resolved": "https://registry.npmjs.org/tap/-/tap-0.4.13.tgz", + "integrity": "sha1-OYYTTWdZcn/CIj5hEm7rhyQ6zLw=", + "dev": true, + "requires": { + "buffer-equal": "~0.0.0", + "deep-equal": "~0.0.0", + "difflet": "~0.2.0", + "glob": "~3.2.1", + "inherits": "*", + "mkdirp": "~0.3 || 0.4 || 0.5", + "nopt": "~2", + "runforcover": "~0.0.2", + "slide": "*", + "yamlish": "*" + }, + "dependencies": { + "deep-equal": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-0.0.0.tgz", + "integrity": "sha1-mWedO70EcVb81FDT0B7rkGhpHoM=", + "dev": true + }, + "glob": { + "version": "3.2.11", + "resolved": "https://registry.npmjs.org/glob/-/glob-3.2.11.tgz", + "integrity": "sha1-Spc/Y1uRkPcV0QmH1cAP0oFevj0=", + "dev": true, + "requires": { + "inherits": "2", + "minimatch": "0.3" + } + }, + "minimatch": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-0.3.0.tgz", + "integrity": "sha1-J12O2qxPG7MyZHIInnlJyDlGmd0=", + "dev": true, + "requires": { + "lru-cache": "2", + "sigmund": "~1.0.0" + } + } + } + }, + "through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", + "dev": true + }, + "through2": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/through2/-/through2-1.1.1.tgz", + "integrity": "sha1-CEfLxESfNAVXTb3M2buEG4OsNUU=", + "dev": true, + "requires": { + "readable-stream": ">=1.1.13-1 <1.2.0-0", + "xtend": ">=4.0.0 <4.1.0-0" + }, + "dependencies": { + "xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "dev": true + } + } + }, + "tildify": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/tildify/-/tildify-1.2.0.tgz", + "integrity": "sha1-3OwD9V3Km3qj5bBPIYF+tW5jWIo=", + "dev": true, + "requires": { + "os-homedir": "^1.0.0" + } + }, + "time-stamp": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/time-stamp/-/time-stamp-1.1.0.tgz", + "integrity": "sha1-dkpaEa9QVhkhsTPztE5hhofg9cM=", + "dev": true + }, + "timers-browserify": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-1.4.2.tgz", + "integrity": "sha1-ycWLV1voQHN1y14kYtrO50NZ9B0=", + "dev": true, + "requires": { + "process": "~0.11.0" + }, + "dependencies": { + "process": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=", + "dev": true + } + } + }, + "to-object-path": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", + "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "to-regex": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", + "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", + "dev": true, + "requires": { + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "regex-not": "^1.0.2", + "safe-regex": "^1.1.0" + } + }, + "to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "dev": true, + "requires": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + } + }, + "traverse": { + "version": "0.6.6", + "resolved": "https://registry.npmjs.org/traverse/-/traverse-0.6.6.tgz", + "integrity": "sha1-y99WD9e5r2MlAv7UD5GMFX6pcTc=", + "dev": true + }, + "tty-browserify": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.1.tgz", + "integrity": "sha512-C3TaO7K81YvjCgQH9Q1S3R3P3BtN3RIM8n+OvX4il1K1zgE8ZhI0op7kClgkxtutIE8hQrcrHBXvIheqKUUCxw==", + "dev": true + }, + "typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", + "dev": true + }, + "uglify-js": { + "version": "2.4.24", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.4.24.tgz", + "integrity": "sha1-+tV1XB4Vd2WLsG/5q25UjJW+vW4=", + "dev": true, + "requires": { + "async": "~0.2.6", + "source-map": "0.1.34", + "uglify-to-browserify": "~1.0.0", + "yargs": "~3.5.4" + }, + "dependencies": { + "source-map": { + "version": "0.1.34", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.1.34.tgz", + "integrity": "sha1-p8/omux7FoLDsZjQrPtH19CQVms=", + "dev": true, + "requires": { + "amdefine": ">=0.0.4" + } + } + } + }, + "uglify-save-license": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/uglify-save-license/-/uglify-save-license-0.4.1.tgz", + "integrity": "sha1-lXJsF8xv0XHDYX479NjYKqjEzOE=", + "dev": true + }, + "uglify-to-browserify": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz", + "integrity": "sha1-bgkk1r2mta/jSeOabWMoUKD4grc=", + "dev": true + }, + "umd": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/umd/-/umd-2.1.0.tgz", + "integrity": "sha1-SmMHt2LxfwLSAbX6FU5nM5bCY88=", + "dev": true, + "requires": { + "rfile": "~1.0.0", + "ruglify": "~1.0.0", + "through": "~2.3.4", + "uglify-js": "~2.4.0" + } + }, + "unc-path-regex": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/unc-path-regex/-/unc-path-regex-0.1.2.tgz", + "integrity": "sha1-5z3T17DXxe2G+6xrCufYxqadUPo=", + "dev": true + }, + "union-value": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", + "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==", + "dev": true, + "requires": { + "arr-union": "^3.1.0", + "get-value": "^2.0.6", + "is-extendable": "^0.1.1", + "set-value": "^2.0.1" + } + }, + "unique-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unique-stream/-/unique-stream-1.0.0.tgz", + "integrity": "sha1-1ZpKdUJ0R9mqbJHnAmP40mpLEEs=", + "dev": true + }, + "unset-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", + "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", + "dev": true, + "requires": { + "has-value": "^0.3.1", + "isobject": "^3.0.0" + }, + "dependencies": { + "has-value": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", + "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", + "dev": true, + "requires": { + "get-value": "^2.0.3", + "has-values": "^0.1.4", + "isobject": "^2.0.0" + }, + "dependencies": { + "isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "dev": true, + "requires": { + "isarray": "1.0.0" + } + } + } + }, + "has-values": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", + "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=", + "dev": true + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + } + } + }, + "urix": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", + "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", + "dev": true + }, + "url": { + "version": "0.10.3", + "resolved": "https://registry.npmjs.org/url/-/url-0.10.3.tgz", + "integrity": "sha1-Ah5NnHcF8hu/N9A861h2dAJ3TGQ=", + "dev": true, + "requires": { + "punycode": "1.3.2", + "querystring": "0.2.0" + }, + "dependencies": { + "punycode": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", + "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=", + "dev": true + } + } + }, + "use": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", + "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", + "dev": true + }, + "user-home": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/user-home/-/user-home-1.1.1.tgz", + "integrity": "sha1-K1viOjK2Onyd640PKNSFcko98ZA=", + "dev": true + }, + "util": { + "version": "0.10.4", + "resolved": "https://registry.npmjs.org/util/-/util-0.10.4.tgz", + "integrity": "sha512-0Pm9hTQ3se5ll1XihRic3FDIku70C+iHUdT/W926rSgHV5QgXsYbKZN8MSC3tJtSkhuROzvsQjAaFENRXr+19A==", + "dev": true, + "requires": { + "inherits": "2.0.3" + }, + "dependencies": { + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true + } + } + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", + "dev": true + }, + "v8flags": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/v8flags/-/v8flags-2.1.1.tgz", + "integrity": "sha1-qrGh+jDUX4jdMhFIh1rALAtV5bQ=", + "dev": true, + "requires": { + "user-home": "^1.1.1" + } + }, + "vinyl": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-0.5.3.tgz", + "integrity": "sha1-sEVbOPxeDPMNQyUTLkYZcMIJHN4=", + "dev": true, + "requires": { + "clone": "^1.0.0", + "clone-stats": "^0.0.1", + "replace-ext": "0.0.1" + } + }, + "vinyl-buffer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/vinyl-buffer/-/vinyl-buffer-1.0.1.tgz", + "integrity": "sha1-lsGjR5uMU5JULGEgKQE7Wyf4i78=", + "dev": true, + "requires": { + "bl": "^1.2.1", + "through2": "^2.0.3" + }, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "readable-stream": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "through2": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "dev": true, + "requires": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + } + }, + "xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "dev": true + } + } + }, + "vinyl-fs": { + "version": "0.3.14", + "resolved": "https://registry.npmjs.org/vinyl-fs/-/vinyl-fs-0.3.14.tgz", + "integrity": "sha1-mmhRzhysHBzqX+hsCTHWIMLPqeY=", + "dev": true, + "requires": { + "defaults": "^1.0.0", + "glob-stream": "^3.1.5", + "glob-watcher": "^0.0.6", + "graceful-fs": "^3.0.0", + "mkdirp": "^0.5.0", + "strip-bom": "^1.0.0", + "through2": "^0.6.1", + "vinyl": "^0.4.0" + }, + "dependencies": { + "clone": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/clone/-/clone-0.2.0.tgz", + "integrity": "sha1-xhJqkK1Pctv1rNskPMN3JP6T/B8=", + "dev": true + }, + "readable-stream": { + "version": "1.0.34", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", + "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + }, + "through2": { + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz", + "integrity": "sha1-QaucZ7KdVyCQcUEOHXp6lozTrUg=", + "dev": true, + "requires": { + "readable-stream": ">=1.0.33-1 <1.1.0-0", + "xtend": ">=4.0.0 <4.1.0-0" + } + }, + "vinyl": { + "version": "0.4.6", + "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-0.4.6.tgz", + "integrity": "sha1-LzVsh6VQolVGHza76ypbqL94SEc=", + "dev": true, + "requires": { + "clone": "^0.2.0", + "clone-stats": "^0.0.1" + } + }, + "xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "dev": true + } + } + }, + "vinyl-source-stream": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vinyl-source-stream/-/vinyl-source-stream-1.1.2.tgz", + "integrity": "sha1-YrU6E1YQqJbpjKlr7jqH8Aio54A=", + "dev": true, + "requires": { + "through2": "^2.0.3", + "vinyl": "^0.4.3" + }, + "dependencies": { + "clone": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/clone/-/clone-0.2.0.tgz", + "integrity": "sha1-xhJqkK1Pctv1rNskPMN3JP6T/B8=", + "dev": true + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "readable-stream": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "through2": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "dev": true, + "requires": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + } + }, + "vinyl": { + "version": "0.4.6", + "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-0.4.6.tgz", + "integrity": "sha1-LzVsh6VQolVGHza76ypbqL94SEc=", + "dev": true, + "requires": { + "clone": "^0.2.0", + "clone-stats": "^0.0.1" + } + }, + "xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "dev": true + } + } + }, + "vinyl-sourcemaps-apply": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/vinyl-sourcemaps-apply/-/vinyl-sourcemaps-apply-0.2.1.tgz", + "integrity": "sha1-q2VJ1h0XLCsbh75cUI0jnI74dwU=", + "dev": true, + "requires": { + "source-map": "^0.5.1" + }, + "dependencies": { + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + } + } + }, + "vm-browserify": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-0.0.4.tgz", + "integrity": "sha1-XX6kW7755Kb/ZflUOOCofDV9WnM=", + "dev": true, + "requires": { + "indexof": "0.0.1" + } + }, + "which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + }, + "window-size": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.0.tgz", + "integrity": "sha1-VDjNLqk7IC76Ohn+iIeu58lPnJ0=", + "dev": true + }, + "wordwrap": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz", + "integrity": "sha1-o9XabNXAvAAI03I0u68b7WMFkQc=", + "dev": true + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "dev": true + }, + "xtend": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-3.0.0.tgz", + "integrity": "sha1-XM50B7r2Qsunvs2laBEcST9ZZlo=", + "dev": true + }, + "yamlish": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/yamlish/-/yamlish-0.0.7.tgz", + "integrity": "sha1-tK+aHcxjYYhzw9bkUewyE8OaV/s=", + "dev": true + }, + "yargs": { + "version": "3.5.4", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.5.4.tgz", + "integrity": "sha1-2K/49mXpTDS9JZvevRv68N3TU2E=", + "dev": true, + "requires": { + "camelcase": "^1.0.2", + "decamelize": "^1.0.0", + "window-size": "0.1.0", + "wordwrap": "0.0.2" + }, + "dependencies": { + "wordwrap": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz", + "integrity": "sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8=", + "dev": true + } + } + } + } +} From f9225471b34d6e5b3d9e2b5203bc19d8a859678e Mon Sep 17 00:00:00 2001 From: Andriy Kashcha Date: Sun, 27 Oct 2019 14:23:20 -0700 Subject: [PATCH 31/49] 0.12.0 --- package-lock.json | 2 +- package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/package-lock.json b/package-lock.json index 77cb225..4f94ec0 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "vivagraphjs", - "version": "0.11.0", + "version": "0.12.0", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index 763d3de..fd9b792 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "vivagraphjs", - "version": "0.11.0", + "version": "0.12.0", "description": "Graph Drawing Library", "main": "src/viva", "directories": { From 1468f40ae8c46fdb5f297fda09aa717bface5833 Mon Sep 17 00:00:00 2001 From: Andriy Kashcha Date: Sun, 12 Jul 2020 09:28:58 -0700 Subject: [PATCH 32/49] updated years --- LICENSE | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/LICENSE b/LICENSE index ce35121..9975ae0 100644 --- a/LICENSE +++ b/LICENSE @@ -1,4 +1,4 @@ -Copyright (c) 2011 - 2019, Andrei Kashcha +Copyright (c) 2011 - 2020, Andrei Kashcha All rights reserved. Redistribution and use in source and binary forms, with or without From 61a765acecf871d5c4c93494ad2af26b634043ef Mon Sep 17 00:00:00 2001 From: Andriy Kashcha Date: Mon, 7 Dec 2020 20:14:15 -0800 Subject: [PATCH 33/49] dropped youtube YouTube's API no longer available, and the project went away. --- README.md | 1 - 1 file changed, 1 deletion(-) diff --git a/README.md b/README.md index 605e8ba..7e2e304 100644 --- a/README.md +++ b/README.md @@ -12,7 +12,6 @@ Enough talking. Show me the demo! Some examples of library usage in the real projects: * [Amazon Visualization](http://www.yasiv.com/amazon#/Search?q=graph%20drawing&category=Books&lang=US) Shows related products on Amazon.com, uses SVG as graph output -* [YouTube Visualization](http://www.yasiv.com/youtube#/Search?q=write%20in%20c) Shows related videos from YouTube. SVG based. * [Graph Viewer](http://www.yasiv.com/graphs#Bai/rw496) visualization of sparse matrices collection of the University of Florida. WebGL based. * [Vkontakte Visualization](http://www.yasiv.com/vk) friendship visualization of the largest social network in Russia [vk.com](https://vk.com). WebGL based. From bb987115d5f1cc8fca0e7ec11f2df058b3915265 Mon Sep 17 00:00:00 2001 From: Andriy Kashcha Date: Sun, 7 Feb 2021 20:26:38 -0800 Subject: [PATCH 34/49] updated years --- LICENSE | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/LICENSE b/LICENSE index 9975ae0..f0cc9c2 100644 --- a/LICENSE +++ b/LICENSE @@ -1,4 +1,4 @@ -Copyright (c) 2011 - 2020, Andrei Kashcha +Copyright (c) 2011 - 2021, Andrei Kashcha All rights reserved. Redistribution and use in source and binary forms, with or without From 1aa5cc41e1c8d1c16ff8e8732e6bc7d3b4949ae0 Mon Sep 17 00:00:00 2001 From: Matt Bray Date: Wed, 24 Feb 2021 10:27:58 +0000 Subject: [PATCH 35/49] fix(input): listen to standard wheel event --- src/Input/dragndrop.js | 20 +++----------------- 1 file changed, 3 insertions(+), 17 deletions(-) diff --git a/src/Input/dragndrop.js b/src/Input/dragndrop.js index abe2af3..087fcaf 100644 --- a/src/Input/dragndrop.js +++ b/src/Input/dragndrop.js @@ -130,7 +130,7 @@ function dragndrop(element) { } e.returnValue = false; - var delta, + var delta = e.deltaY, mousePos = getMousePos(e), elementOffset = findElementPosition(element), relMousePos = { @@ -138,29 +138,15 @@ function dragndrop(element) { y: mousePos[1] - elementOffset[1] }; - if (e.wheelDelta) { - delta = e.wheelDelta / 360; // Chrome/Safari - } else { - delta = e.detail / -9; // Mozilla - } - scroll(e, delta, relMousePos); }, updateScrollEvents = function (scrollCallback) { if (!scroll && scrollCallback) { // client is interested in scrolling. Start listening to events: - if (browserInfo.browser === 'webkit') { - element.addEventListener('mousewheel', handleMouseWheel, false); // Chrome/Safari - } else { - element.addEventListener('DOMMouseScroll', handleMouseWheel, false); // Others - } + element.addEventListener('wheel', handleMouseWheel, false); } else if (scroll && !scrollCallback) { - if (browserInfo.browser === 'webkit') { - element.removeEventListener('mousewheel', handleMouseWheel, false); // Chrome/Safari - } else { - element.removeEventListener('DOMMouseScroll', handleMouseWheel, false); // Others - } + element.removeEventListener('wheel', handleMouseWheel, false); } scroll = scrollCallback; From 9b405a1927c53435835571faef432f5ad5aa7935 Mon Sep 17 00:00:00 2001 From: Andriy Kashcha Date: Fri, 26 Feb 2021 20:03:50 -0800 Subject: [PATCH 36/49] updated gulp to the latest version --- gulpfile.js | 13 +- package-lock.json | 11431 ++++++++++++++++++++++++++++++++++++++++---- package.json | 16 +- 3 files changed, 10416 insertions(+), 1044 deletions(-) diff --git a/gulpfile.js b/gulpfile.js index 6ddbe83..e8b3157 100644 --- a/gulpfile.js +++ b/gulpfile.js @@ -1,5 +1,4 @@ var gulp = require('gulp'); -var gutil = require('gulp-util'); var buffer = require('vinyl-buffer'); var source = require('vinyl-source-stream'); @@ -11,7 +10,7 @@ var run = require('gulp-run'); gulp.task('clean', clean); gulp.task('build', build); gulp.task('test', test); -gulp.task('release', ['clean', 'build'], test); +gulp.task('release', gulp.series('clean', 'build', test)); gulp.task('default', watch); function watch() { @@ -22,11 +21,11 @@ function clean(cb) { del(['dist'], cb); } -function test() { - new run.Command('npm test').exec(); +function test(cb) { + new run.Command('npm test').exec('', cb); } -function build() { +function build(cb) { var bundler = require('browserify')('./src/viva.js', { standalone: 'Viva' }); @@ -40,7 +39,9 @@ function build() { .pipe(uglify()) .pipe(gulp.dest('./dist/')); + bundle.on('end', cb); + function showError(err) { - gutil.log(gutil.colors.red('Failed to browserify'), gutil.colors.yellow(err.message)); + console.log('Failed to browserify', err.message); } } diff --git a/package-lock.json b/package-lock.json index 4f94ec0..1f62af6 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,25 +1,7523 @@ { "name": "vivagraphjs", "version": "0.12.0", - "lockfileVersion": 1, + "lockfileVersion": 2, "requires": true, - "dependencies": { - "Base64": { + "packages": { + "": { + "name": "vivagraphjs", + "version": "0.12.0", + "license": "BSD-3-Clause", + "dependencies": { + "gintersect": "0.1.0", + "ngraph.centrality": "0.3.0", + "ngraph.events": "0.0.3", + "ngraph.forcelayout": "0.5.0", + "ngraph.fromjson": "0.1.9", + "ngraph.generators": "0.0.19", + "ngraph.graph": "0.0.14", + "ngraph.merge": "0.0.1", + "ngraph.random": "0.0.1", + "ngraph.tojson": "0.1.4", + "simplesvg": "0.0.10" + }, + "devDependencies": { + "browserify": "^8.0.3", + "del": "^1.1.1", + "gulp": "^4.0.2", + "gulp-rename": "^2.0.0", + "gulp-run": "^1.7.1", + "gulp-uglify": "^3.0.2", + "ngraph.remove-overlaps": "^1.0.0", + "tap": "^0.4.13", + "vinyl-buffer": "^1.0.1", + "vinyl-source-stream": "^2.0.0" + } + }, + "node_modules/abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", + "dev": true + }, + "node_modules/acorn": { + "version": "4.0.13", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-4.0.13.tgz", + "integrity": "sha1-EFSVrlNh1pe9GVyCUZLhrX8lN4c=", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-node": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/acorn-node/-/acorn-node-1.8.2.tgz", + "integrity": "sha512-8mt+fslDufLYntIoPAaIMUe/lrbrehIiwmR3t2k9LljIzoigEPF27eLk2hy8zSGzmR/ogr7zbRKINMo1u0yh5A==", + "dev": true, + "dependencies": { + "acorn": "^7.0.0", + "acorn-walk": "^7.0.0", + "xtend": "^4.0.2" + } + }, + "node_modules/acorn-node/node_modules/acorn": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-node/node_modules/xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "dev": true, + "engines": { + "node": ">=0.4" + } + }, + "node_modules/acorn-walk": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz", + "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/add-event-listener": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/add-event-listener/-/add-event-listener-0.0.1.tgz", + "integrity": "sha1-p2Ip68ZMiu+uIEoWJzovJVq+otA=" + }, + "node_modules/amdefine": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz", + "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=", + "dev": true, + "engines": { + "node": ">=0.4.2" + } + }, + "node_modules/ansi-colors": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-1.1.0.tgz", + "integrity": "sha512-SFKX67auSNoVR38N3L+nvsPjOE0bybKTYbkf5tRvushrAPQ9V75huw0ZxBkKVeRU9kqH3d6HA4xTckbwZ4ixmA==", + "dev": true, + "dependencies": { + "ansi-wrap": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ansi-gray": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/ansi-gray/-/ansi-gray-0.1.1.tgz", + "integrity": "sha1-KWLPVOyXksSFEKPetSRDaGHvclE=", + "dev": true, + "dependencies": { + "ansi-wrap": "0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ansi-wrap": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/ansi-wrap/-/ansi-wrap-0.1.0.tgz", + "integrity": "sha1-qCJQ3bABXponyoLoLqYDu/pF768=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/anymatch": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", + "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", + "dev": true, + "dependencies": { + "micromatch": "^3.1.4", + "normalize-path": "^2.1.1" + } + }, + "node_modules/anymatch/node_modules/normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "dev": true, + "dependencies": { + "remove-trailing-separator": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/append-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/append-buffer/-/append-buffer-1.0.2.tgz", + "integrity": "sha1-2CIM9GYIFSXv6lBhTz3mUU36WPE=", + "dev": true, + "dependencies": { + "buffer-equal": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/append-buffer/node_modules/buffer-equal": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/buffer-equal/-/buffer-equal-1.0.0.tgz", + "integrity": "sha1-WWFrSYME1Var1GaWayLu2j7KX74=", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/archy": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz", + "integrity": "sha1-+cjBN1fMHde8N5rHeyxipcKGjEA=", + "dev": true + }, + "node_modules/arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/arr-filter": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/arr-filter/-/arr-filter-1.1.2.tgz", + "integrity": "sha1-Q/3d0JHo7xGqTEXZzcGOLf8XEe4=", + "dev": true, + "dependencies": { + "make-iterator": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/arr-flatten": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", + "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/arr-map": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/arr-map/-/arr-map-2.0.2.tgz", + "integrity": "sha1-Onc0X/wc814qkYJWAfnljy4kysQ=", + "dev": true, + "dependencies": { + "make-iterator": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/arr-union": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", + "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/array-differ": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-differ/-/array-differ-1.0.0.tgz", + "integrity": "sha1-7/UuN1gknTO+QCuLuOVkuytdQDE=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/array-each": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/array-each/-/array-each-1.0.1.tgz", + "integrity": "sha1-p5SvDAWrF1KEbudTofIRoFugxE8=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/array-initial": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/array-initial/-/array-initial-1.1.0.tgz", + "integrity": "sha1-L6dLJnOTccOUe9enrcc74zSz15U=", + "dev": true, + "dependencies": { + "array-slice": "^1.0.0", + "is-number": "^4.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/array-initial/node_modules/is-number": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz", + "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/array-last": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/array-last/-/array-last-1.3.0.tgz", + "integrity": "sha512-eOCut5rXlI6aCOS7Z7kCplKRKyiFQ6dHFBem4PwlwKeNFk2/XxTrhRh5T9PyaEWGy/NHTZWbY+nsZlNFJu9rYg==", + "dev": true, + "dependencies": { + "is-number": "^4.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/array-last/node_modules/is-number": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz", + "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/array-slice": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/array-slice/-/array-slice-1.1.0.tgz", + "integrity": "sha512-B1qMD3RBP7O8o0H2KbrXDyB0IccejMF15+87Lvlor12ONPRHP6gTjXMNkt/d3ZuOGbAe66hFmaCfECI24Ufp6w==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/array-sort": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-sort/-/array-sort-1.0.0.tgz", + "integrity": "sha512-ihLeJkonmdiAsD7vpgN3CRcx2J2S0TiYW+IS/5zHBI7mKUq3ySvBdzzBfD236ubDBQFiiyG3SWCPc+msQ9KoYg==", + "dev": true, + "dependencies": { + "default-compare": "^1.0.0", + "get-value": "^2.0.6", + "kind-of": "^5.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/array-union": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", + "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", + "dev": true, + "dependencies": { + "array-uniq": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/array-uniq": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", + "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/asn1.js": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-5.4.1.tgz", + "integrity": "sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA==", + "dev": true, + "dependencies": { + "bn.js": "^4.0.0", + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0", + "safer-buffer": "^2.1.0" + } + }, + "node_modules/asn1.js/node_modules/bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "dev": true + }, + "node_modules/assert": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/assert/-/assert-1.3.0.tgz", + "integrity": "sha1-A5OaYiWCqBLMICMgoLmlbJuBWEk=", + "dev": true, + "dependencies": { + "util": "0.10.3" + } + }, + "node_modules/assert/node_modules/inherits": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", + "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=", + "dev": true + }, + "node_modules/assert/node_modules/util": { + "version": "0.10.3", + "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", + "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", + "dev": true, + "dependencies": { + "inherits": "2.0.1" + } + }, + "node_modules/assign-symbols": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", + "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/astw": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/astw/-/astw-2.2.0.tgz", + "integrity": "sha1-e9QXhNMkk5h66yOba04cV6hzuRc=", + "dev": true, + "dependencies": { + "acorn": "^4.0.3" + } + }, + "node_modules/async": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", + "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=", + "dev": true + }, + "node_modules/async-done": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/async-done/-/async-done-1.3.2.tgz", + "integrity": "sha512-uYkTP8dw2og1tu1nmza1n1CMW0qb8gWWlwqMmLb7MhBVs4BXrFziT6HXUd+/RlRA/i4H9AkofYloUbs1fwMqlw==", + "dev": true, + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.2", + "process-nextick-args": "^2.0.0", + "stream-exhaust": "^1.0.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/async-each": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.3.tgz", + "integrity": "sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ==", + "dev": true + }, + "node_modules/async-settle": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/async-settle/-/async-settle-1.0.0.tgz", + "integrity": "sha1-HQqRS7Aldb7IqPOnTlCA9yssDGs=", + "dev": true, + "dependencies": { + "async-done": "^1.2.2" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/atob": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", + "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", + "dev": true, + "bin": { + "atob": "bin/atob.js" + }, + "engines": { + "node": ">= 4.5.0" + } + }, + "node_modules/bach": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/bach/-/bach-1.2.0.tgz", + "integrity": "sha1-Szzpa/JxNPeaG0FKUcFONMO9mIA=", + "dev": true, + "dependencies": { + "arr-filter": "^1.1.1", + "arr-flatten": "^1.0.1", + "arr-map": "^2.0.0", + "array-each": "^1.0.0", + "array-initial": "^1.0.0", + "array-last": "^1.1.1", + "async-done": "^1.2.2", + "async-settle": "^1.0.0", + "now-and-later": "^2.0.0" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", + "dev": true + }, + "node_modules/base": { + "version": "0.11.2", + "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", + "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", + "dev": true, + "dependencies": { + "cache-base": "^1.0.1", + "class-utils": "^0.3.5", + "component-emitter": "^1.2.1", + "define-property": "^1.0.0", + "isobject": "^3.0.1", + "mixin-deep": "^1.2.0", + "pascalcase": "^0.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/base/node_modules/define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "dependencies": { + "is-descriptor": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/Base64": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/Base64/-/Base64-0.2.1.tgz", + "integrity": "sha1-ujpCMHCOGGcFBl5mur3Uw1z2ACg=", + "dev": true + }, + "node_modules/base64-js": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-0.0.8.tgz", + "integrity": "sha1-EQHpVE9KdrG8OybUUsqW16NeeXg=", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/beeper": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/beeper/-/beeper-1.1.1.tgz", + "integrity": "sha1-5tXqjF2tABMEpwsiY4RH9pyy+Ak=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/binary-extensions": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", + "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/bindings": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", + "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", + "dev": true, + "optional": true, + "dependencies": { + "file-uri-to-path": "1.0.0" + } + }, + "node_modules/bl": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/bl/-/bl-1.2.3.tgz", + "integrity": "sha512-pvcNpa0UU69UT341rO6AYy4FVAIkUHuZXRIWbq+zHnsVcRzDDjIAhGuuYoi0d//cwIwtt4pkpKycWEfjdV+vww==", + "dev": true, + "dependencies": { + "readable-stream": "^2.3.5", + "safe-buffer": "^5.1.1" + } + }, + "node_modules/bl/node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "node_modules/bl/node_modules/readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dev": true, + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/bl/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "node_modules/bl/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/bn.js": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.0.tgz", + "integrity": "sha512-D7iWRBvnZE8ecXiLj/9wbxH7Tk79fAh8IHaTNq1RWRixsS02W+5qS+iE9yq6RYl0asXx5tw0bLhmT5pIfbSquw==", + "dev": true + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, + "dependencies": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/brorand": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", + "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=", + "dev": true + }, + "node_modules/browser-pack": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/browser-pack/-/browser-pack-3.2.0.tgz", + "integrity": "sha1-+qHLxBSHsazEdH43PhFIrf/Q4tk=", + "dev": true, + "dependencies": { + "combine-source-map": "~0.3.0", + "concat-stream": "~1.4.1", + "defined": "~0.0.0", + "JSONStream": "~0.8.4", + "through2": "~0.5.1", + "umd": "^2.1.0" + }, + "bin": { + "browser-pack": "bin/cmd.js" + } + }, + "node_modules/browser-pack/node_modules/readable-stream": { + "version": "1.0.34", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", + "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", + "dev": true, + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + }, + "node_modules/browser-pack/node_modules/through2": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/through2/-/through2-0.5.1.tgz", + "integrity": "sha1-390BLrnHAOIyP9M084rGIqs3Lac=", + "dev": true, + "dependencies": { + "readable-stream": "~1.0.17", + "xtend": "~3.0.0" + } + }, + "node_modules/browser-resolve": { + "version": "1.11.3", + "resolved": "https://registry.npmjs.org/browser-resolve/-/browser-resolve-1.11.3.tgz", + "integrity": "sha512-exDi1BYWB/6raKHmDTCicQfTkqwN5fioMFV4j8BsfMU4R2DK/QfZfK7kOVkmWCNANf0snkBzqGqAJBao9gZMdQ==", + "dev": true, + "dependencies": { + "resolve": "1.1.7" + } + }, + "node_modules/browser-resolve/node_modules/resolve": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", + "integrity": "sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=", + "dev": true + }, + "node_modules/browserify": { + "version": "8.1.3", + "resolved": "https://registry.npmjs.org/browserify/-/browserify-8.1.3.tgz", + "integrity": "sha1-8zpUmjpsNoIZsHX9z+bfGV4Empo=", + "dev": true, + "dependencies": { + "assert": "~1.3.0", + "browser-pack": "^3.2.0", + "browser-resolve": "^1.3.0", + "browserify-zlib": "~0.1.2", + "buffer": "^3.0.0", + "builtins": "~0.0.3", + "commondir": "0.0.1", + "concat-stream": "~1.4.1", + "console-browserify": "^1.1.0", + "constants-browserify": "~0.0.1", + "crypto-browserify": "^3.0.0", + "deep-equal": "~0.2.1", + "defined": "~0.0.0", + "deps-sort": "^1.3.5", + "domain-browser": "~1.1.0", + "duplexer2": "~0.0.2", + "events": "~1.0.0", + "glob": "^4.0.5", + "http-browserify": "^1.4.0", + "https-browserify": "~0.0.0", + "inherits": "~2.0.1", + "insert-module-globals": "^6.2.0", + "isarray": "0.0.1", + "JSONStream": "~0.8.3", + "labeled-stream-splicer": "^1.0.0", + "module-deps": "^3.6.3", + "os-browserify": "~0.1.1", + "parents": "^1.0.1", + "path-browserify": "~0.0.0", + "process": "^0.10.0", + "punycode": "~1.2.3", + "querystring-es3": "~0.2.0", + "readable-stream": "^1.0.33-1", + "resolve": "~0.7.1", + "shallow-copy": "0.0.1", + "shasum": "^1.0.0", + "shell-quote": "~0.0.1", + "stream-browserify": "^1.0.0", + "string_decoder": "~0.10.0", + "subarg": "^1.0.0", + "syntax-error": "^1.1.1", + "through2": "^1.0.0", + "timers-browserify": "^1.0.1", + "tty-browserify": "~0.0.0", + "umd": "~2.1.0", + "url": "~0.10.1", + "util": "~0.10.1", + "vm-browserify": "~0.0.1", + "xtend": "^3.0.0" + }, + "bin": { + "browserify": "bin/cmd.js" + } + }, + "node_modules/browserify-aes": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", + "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", + "dev": true, + "dependencies": { + "buffer-xor": "^1.0.3", + "cipher-base": "^1.0.0", + "create-hash": "^1.1.0", + "evp_bytestokey": "^1.0.3", + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/browserify-cipher": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz", + "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==", + "dev": true, + "dependencies": { + "browserify-aes": "^1.0.4", + "browserify-des": "^1.0.0", + "evp_bytestokey": "^1.0.0" + } + }, + "node_modules/browserify-des": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz", + "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==", + "dev": true, + "dependencies": { + "cipher-base": "^1.0.1", + "des.js": "^1.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "node_modules/browserify-rsa": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.1.0.tgz", + "integrity": "sha512-AdEER0Hkspgno2aR97SAf6vi0y0k8NuOpGnVH3O99rcA5Q6sh8QxcngtHuJ6uXwnfAXNM4Gn1Gb7/MV1+Ymbog==", + "dev": true, + "dependencies": { + "bn.js": "^5.0.0", + "randombytes": "^2.0.1" + } + }, + "node_modules/browserify-sign": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.2.1.tgz", + "integrity": "sha512-/vrA5fguVAKKAVTNJjgSm1tRQDHUU6DbwO9IROu/0WAzC8PKhucDSh18J0RMvVeHAn5puMd+QHC2erPRNf8lmg==", + "dev": true, + "dependencies": { + "bn.js": "^5.1.1", + "browserify-rsa": "^4.0.1", + "create-hash": "^1.2.0", + "create-hmac": "^1.1.7", + "elliptic": "^6.5.3", + "inherits": "^2.0.4", + "parse-asn1": "^5.1.5", + "readable-stream": "^3.6.0", + "safe-buffer": "^5.2.0" + } + }, + "node_modules/browserify-sign/node_modules/readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dev": true, + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/browserify-sign/node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/browserify-zlib": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.1.4.tgz", + "integrity": "sha1-uzX4pRn2AOD6a4SFJByXnQFB+y0=", + "dev": true, + "dependencies": { + "pako": "~0.2.0" + } + }, + "node_modules/buffer": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-3.6.2.tgz", + "integrity": "sha512-c3M77NkHJxS0zx/ErxXhDLr1v3y2MDXPeTJPvLNOaIYJ4ymHBUFQ9EXzt9HYuqAJllMoNb/EZ8hIiulnQFAUuQ==", + "dev": true, + "dependencies": { + "base64-js": "0.0.8", + "ieee754": "^1.1.4", + "isarray": "^1.0.0" + } + }, + "node_modules/buffer-equal": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/buffer-equal/-/buffer-equal-0.0.2.tgz", + "integrity": "sha1-7Lt5D1aNQAmKYkK1SAXHWAXrk48=", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/buffer-from": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", + "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", + "dev": true + }, + "node_modules/buffer-xor": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", + "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=", + "dev": true + }, + "node_modules/buffer/node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "node_modules/builtins": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/builtins/-/builtins-0.0.7.tgz", + "integrity": "sha1-NVIZzWzxjb58Acx/0tznZc/cVJo=", + "dev": true + }, + "node_modules/bunker": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/bunker/-/bunker-0.1.2.tgz", + "integrity": "sha1-yImSRkqOKm7ehpMDdfkrWAd++Xw=", + "dev": true, + "dependencies": { + "burrito": ">=0.2.5 <0.3" + }, + "engines": { + "node": "*" + } + }, + "node_modules/burrito": { + "version": "0.2.12", + "resolved": "https://registry.npmjs.org/burrito/-/burrito-0.2.12.tgz", + "integrity": "sha1-0NbmrIHV6ZeJxvpKzLCwAx6lT2s=", + "dev": true, + "dependencies": { + "traverse": "~0.5.1", + "uglify-js": "~1.1.1" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/burrito/node_modules/traverse": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/traverse/-/traverse-0.5.2.tgz", + "integrity": "sha1-4gPFjV9/DjfbbnTArLkpuwm2HYU=", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/burrito/node_modules/uglify-js": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-1.1.1.tgz", + "integrity": "sha1-7nGpfEzv0GoamyBDfzQRiYKqA1s=", + "dev": true, + "bin": { + "uglifyjs": "bin/uglifyjs" + }, + "engines": { + "node": "*" + } + }, + "node_modules/cache-base": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", + "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", + "dev": true, + "dependencies": { + "collection-visit": "^1.0.0", + "component-emitter": "^1.2.1", + "get-value": "^2.0.6", + "has-value": "^1.0.0", + "isobject": "^3.0.1", + "set-value": "^2.0.0", + "to-object-path": "^0.3.0", + "union-value": "^1.0.0", + "unset-value": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/callsite": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/callsite/-/callsite-1.0.0.tgz", + "integrity": "sha1-KAOY5dZkvXQDi28JBRU+borxvCA=", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/camelcase": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", + "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "dependencies": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/charm": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/charm/-/charm-0.1.2.tgz", + "integrity": "sha1-BsIe7RobBq62dVPNxT4jJ0usIpY=", + "dev": true + }, + "node_modules/chokidar": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", + "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==", + "deprecated": "Chokidar 2 will break on node v14+. Upgrade to chokidar 3 with 15x less dependencies.", + "dev": true, + "dependencies": { + "anymatch": "^2.0.0", + "async-each": "^1.0.1", + "braces": "^2.3.2", + "glob-parent": "^3.1.0", + "inherits": "^2.0.3", + "is-binary-path": "^1.0.0", + "is-glob": "^4.0.0", + "normalize-path": "^3.0.0", + "path-is-absolute": "^1.0.0", + "readdirp": "^2.2.1", + "upath": "^1.1.1" + }, + "optionalDependencies": { + "fsevents": "^1.2.7" + } + }, + "node_modules/cipher-base": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", + "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", + "dev": true, + "dependencies": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/class-utils": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", + "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", + "dev": true, + "dependencies": { + "arr-union": "^3.1.0", + "define-property": "^0.2.5", + "isobject": "^3.0.0", + "static-extend": "^0.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/class-utils/node_modules/define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "dependencies": { + "is-descriptor": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/class-utils/node_modules/is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/class-utils/node_modules/is-accessor-descriptor/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/class-utils/node_modules/is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/class-utils/node_modules/is-data-descriptor/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/class-utils/node_modules/is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "dependencies": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/cliui": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", + "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", + "dev": true, + "dependencies": { + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wrap-ansi": "^2.0.0" + } + }, + "node_modules/clone": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/clone/-/clone-0.2.0.tgz", + "integrity": "sha1-xhJqkK1Pctv1rNskPMN3JP6T/B8=", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/clone-buffer": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/clone-buffer/-/clone-buffer-1.0.0.tgz", + "integrity": "sha1-4+JbIHrE5wGvch4staFnksrD3Fg=", + "dev": true, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/clone-stats": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-0.0.1.tgz", + "integrity": "sha1-uI+UqCzzi4eR1YBG6kAprYjKmdE=", + "dev": true + }, + "node_modules/cloneable-readable": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/cloneable-readable/-/cloneable-readable-1.1.3.tgz", + "integrity": "sha512-2EF8zTQOxYq70Y4XKtorQupqF0m49MBz2/yf5Bj+MHjvpG3Hy7sImifnqD6UA+TKYxeSV+u6qqQPawN5UvnpKQ==", + "dev": true, + "dependencies": { + "inherits": "^2.0.1", + "process-nextick-args": "^2.0.0", + "readable-stream": "^2.3.5" + } + }, + "node_modules/cloneable-readable/node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "node_modules/cloneable-readable/node_modules/readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dev": true, + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/cloneable-readable/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "node_modules/cloneable-readable/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/code-point-at": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", + "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/collection-map": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/collection-map/-/collection-map-1.0.0.tgz", + "integrity": "sha1-rqDwb40mx4DCt1SUOFVEsiVa8Yw=", + "dev": true, + "dependencies": { + "arr-map": "^2.0.2", + "for-own": "^1.0.0", + "make-iterator": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/collection-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", + "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", + "dev": true, + "dependencies": { + "map-visit": "^1.0.0", + "object-visit": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/color-support": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", + "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", + "dev": true, + "bin": { + "color-support": "bin.js" + } + }, + "node_modules/combine-source-map": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/combine-source-map/-/combine-source-map-0.3.0.tgz", + "integrity": "sha1-2edPWT2c1DgHMSy12EbUUe+qnrc=", + "dev": true, + "dependencies": { + "convert-source-map": "~0.3.0", + "inline-source-map": "~0.3.0", + "source-map": "~0.1.31" + } + }, + "node_modules/commondir": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-0.0.1.tgz", + "integrity": "sha1-ifAP3NUbUZxXhzP+xWPmptp/W+I=", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/component-emitter": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", + "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==", + "dev": true + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "dev": true + }, + "node_modules/concat-stream": { + "version": "1.4.11", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.4.11.tgz", + "integrity": "sha512-X3JMh8+4je3U1cQpG87+f9lXHDrqcb2MVLg9L7o8b1UZ0DzhRrUpdn65ttzu10PpJPPI3MQNkis+oha6TSA9Mw==", + "dev": true, + "engines": [ + "node >= 0.8" + ], + "dependencies": { + "inherits": "~2.0.1", + "readable-stream": "~1.1.9", + "typedarray": "~0.0.5" + } + }, + "node_modules/console-browserify": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.2.0.tgz", + "integrity": "sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==", + "dev": true + }, + "node_modules/constants-browserify": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-0.0.1.tgz", + "integrity": "sha1-kld9tSe6bEzwpFaNhLwDH0QeIfI=", + "dev": true + }, + "node_modules/convert-source-map": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-0.3.5.tgz", + "integrity": "sha1-8dgClQr33SYxof6+BZZVDIarMZA=", + "dev": true + }, + "node_modules/copy-descriptor": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", + "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/copy-props": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/copy-props/-/copy-props-2.0.4.tgz", + "integrity": "sha512-7cjuUME+p+S3HZlbllgsn2CDwS+5eCCX16qBgNC4jgSTf49qR1VKy/Zhl400m0IQXl/bPGEVqncgUUMjrr4s8A==", + "dev": true, + "dependencies": { + "each-props": "^1.3.0", + "is-plain-object": "^2.0.1" + } + }, + "node_modules/core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", + "dev": true + }, + "node_modules/create-ecdh": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.4.tgz", + "integrity": "sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A==", + "dev": true, + "dependencies": { + "bn.js": "^4.1.0", + "elliptic": "^6.5.3" + } + }, + "node_modules/create-ecdh/node_modules/bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "dev": true + }, + "node_modules/create-hash": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", + "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", + "dev": true, + "dependencies": { + "cipher-base": "^1.0.1", + "inherits": "^2.0.1", + "md5.js": "^1.3.4", + "ripemd160": "^2.0.1", + "sha.js": "^2.4.0" + } + }, + "node_modules/create-hmac": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", + "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", + "dev": true, + "dependencies": { + "cipher-base": "^1.0.3", + "create-hash": "^1.1.0", + "inherits": "^2.0.1", + "ripemd160": "^2.0.0", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + } + }, + "node_modules/crypto-browserify": { + "version": "3.12.0", + "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", + "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", + "dev": true, + "dependencies": { + "browserify-cipher": "^1.0.0", + "browserify-sign": "^4.0.0", + "create-ecdh": "^4.0.0", + "create-hash": "^1.1.0", + "create-hmac": "^1.1.0", + "diffie-hellman": "^5.0.0", + "inherits": "^2.0.1", + "pbkdf2": "^3.0.3", + "public-encrypt": "^4.0.0", + "randombytes": "^2.0.0", + "randomfill": "^1.0.3" + }, + "engines": { + "node": "*" + } + }, + "node_modules/d": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/d/-/d-1.0.1.tgz", + "integrity": "sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==", + "dev": true, + "dependencies": { + "es5-ext": "^0.10.50", + "type": "^1.0.1" + } + }, + "node_modules/dateformat": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-2.2.0.tgz", + "integrity": "sha1-QGXiATz5+5Ft39gu+1Bq1MZ2kGI=", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/decode-uri-component": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", + "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", + "dev": true, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/deep-equal": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-0.2.2.tgz", + "integrity": "sha1-hLdFiW80xoTpjyzg5Cq69Du6AX0=", + "dev": true + }, + "node_modules/deep-is": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", + "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", + "dev": true + }, + "node_modules/default-compare": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/default-compare/-/default-compare-1.0.0.tgz", + "integrity": "sha512-QWfXlM0EkAbqOCbD/6HjdwT19j7WCkMyiRhWilc4H9/5h/RzTF9gv5LYh1+CmDV5d1rki6KAWLtQale0xt20eQ==", + "dev": true, + "dependencies": { + "kind-of": "^5.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/default-resolution": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/default-resolution/-/default-resolution-2.0.0.tgz", + "integrity": "sha1-vLgrqnKtebQmp2cy8aga1t8m1oQ=", + "dev": true, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/define-properties": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", + "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", + "dev": true, + "dependencies": { + "object-keys": "^1.0.12" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/define-property": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", + "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", + "dev": true, + "dependencies": { + "is-descriptor": "^1.0.2", + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/defined": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/defined/-/defined-0.0.0.tgz", + "integrity": "sha1-817qfXBekzuvE7LwOz+D2SFAOz4=", + "dev": true + }, + "node_modules/del": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/del/-/del-1.2.1.tgz", + "integrity": "sha1-rtblvNfLcyXfNPVjEl+iZbLBoBQ=", + "dev": true, + "dependencies": { + "each-async": "^1.0.0", + "globby": "^2.0.0", + "is-path-cwd": "^1.0.0", + "is-path-in-cwd": "^1.0.0", + "object-assign": "^3.0.0", + "rimraf": "^2.2.8" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/deps-sort": { + "version": "1.3.9", + "resolved": "https://registry.npmjs.org/deps-sort/-/deps-sort-1.3.9.tgz", + "integrity": "sha1-Kd//U+F7Nq7K51MK27v2IsLtGnE=", + "dev": true, + "dependencies": { + "JSONStream": "^1.0.3", + "shasum": "^1.0.0", + "subarg": "^1.0.0", + "through2": "^1.0.0" + }, + "bin": { + "deps-sort": "bin/cmd.js" + } + }, + "node_modules/deps-sort/node_modules/jsonparse": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", + "integrity": "sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA=", + "dev": true, + "engines": [ + "node >= 0.2.0" + ] + }, + "node_modules/deps-sort/node_modules/JSONStream": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.5.tgz", + "integrity": "sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==", + "dev": true, + "dependencies": { + "jsonparse": "^1.2.0", + "through": ">=2.2.7 <3" + }, + "bin": { + "JSONStream": "bin.js" + }, + "engines": { + "node": "*" + } + }, + "node_modules/des.js": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.1.tgz", + "integrity": "sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA==", + "dev": true, + "dependencies": { + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0" + } + }, + "node_modules/detect-file": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/detect-file/-/detect-file-1.0.0.tgz", + "integrity": "sha1-8NZtA2cqglyxtzvbP+YjEMjlUrc=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/detective": { + "version": "4.7.1", + "resolved": "https://registry.npmjs.org/detective/-/detective-4.7.1.tgz", + "integrity": "sha512-H6PmeeUcZloWtdt4DAkFyzFL94arpHr3NOwwmVILFiy+9Qd4JTxxXrzfyGk/lmct2qVGBwTSwSXagqu2BxmWig==", + "dev": true, + "dependencies": { + "acorn": "^5.2.1", + "defined": "^1.0.0" + } + }, + "node_modules/detective/node_modules/acorn": { + "version": "5.7.4", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.4.tgz", + "integrity": "sha512-1D++VG7BhrtvQpNbBzovKNc1FLGGEE/oGe7b9xJm/RFHMBeUaUGpluV9RLjZa47YFdPcDAenEYuq9pQPcMdLJg==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/detective/node_modules/defined": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz", + "integrity": "sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM=", + "dev": true + }, + "node_modules/diffie-hellman": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", + "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", + "dev": true, + "dependencies": { + "bn.js": "^4.1.0", + "miller-rabin": "^4.0.0", + "randombytes": "^2.0.0" + } + }, + "node_modules/diffie-hellman/node_modules/bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "dev": true + }, + "node_modules/difflet": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/difflet/-/difflet-0.2.6.tgz", + "integrity": "sha1-qyOzH1ZJtvqo49KsvTNEZzZcpvo=", + "dev": true, + "dependencies": { + "charm": "0.1.x", + "deep-is": "0.1.x", + "traverse": "0.6.x" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/domain-browser": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.1.7.tgz", + "integrity": "sha1-hnqksJP6oF8d4IwG9NeyH9+GmLw=", + "dev": true, + "engines": { + "node": ">=0.4", + "npm": ">=1.2" + } + }, + "node_modules/duplexer2": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.0.2.tgz", + "integrity": "sha1-xhTc9n4vsUmVqRcR5aYX6KYKMds=", + "dev": true, + "dependencies": { + "readable-stream": "~1.1.9" + } + }, + "node_modules/duplexify": { + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz", + "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==", + "dev": true, + "dependencies": { + "end-of-stream": "^1.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.0.0", + "stream-shift": "^1.0.0" + } + }, + "node_modules/duplexify/node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "node_modules/duplexify/node_modules/readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dev": true, + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/duplexify/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "node_modules/duplexify/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/each-async": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/each-async/-/each-async-1.1.1.tgz", + "integrity": "sha1-3uUim98KtrogEqOV4bhpq/iBNHM=", + "dev": true, + "dependencies": { + "onetime": "^1.0.0", + "set-immediate-shim": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/each-props": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/each-props/-/each-props-1.3.2.tgz", + "integrity": "sha512-vV0Hem3zAGkJAyU7JSjixeU66rwdynTAa1vofCrSA5fEln+m67Az9CcnkVD776/fsN/UjIWmBDoNRS6t6G9RfA==", + "dev": true, + "dependencies": { + "is-plain-object": "^2.0.1", + "object.defaults": "^1.1.0" + } + }, + "node_modules/elliptic": { + "version": "6.5.4", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz", + "integrity": "sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==", + "dev": true, + "dependencies": { + "bn.js": "^4.11.9", + "brorand": "^1.1.0", + "hash.js": "^1.0.0", + "hmac-drbg": "^1.0.1", + "inherits": "^2.0.4", + "minimalistic-assert": "^1.0.1", + "minimalistic-crypto-utils": "^1.0.1" + } + }, + "node_modules/elliptic/node_modules/bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "dev": true + }, + "node_modules/end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "dev": true, + "dependencies": { + "once": "^1.4.0" + } + }, + "node_modules/error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dev": true, + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/es5-ext": { + "version": "0.10.53", + "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.53.tgz", + "integrity": "sha512-Xs2Stw6NiNHWypzRTY1MtaG/uJlwCk8kH81920ma8mvN8Xq1gsfhZvpkImLQArw8AHnv8MT2I45J3c0R8slE+Q==", + "dev": true, + "dependencies": { + "es6-iterator": "~2.0.3", + "es6-symbol": "~3.1.3", + "next-tick": "~1.0.0" + } + }, + "node_modules/es6-iterator": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", + "integrity": "sha1-p96IkUGgWpSwhUQDstCg+/qY87c=", + "dev": true, + "dependencies": { + "d": "1", + "es5-ext": "^0.10.35", + "es6-symbol": "^3.1.1" + } + }, + "node_modules/es6-symbol": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.3.tgz", + "integrity": "sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==", + "dev": true, + "dependencies": { + "d": "^1.0.1", + "ext": "^1.1.2" + } + }, + "node_modules/es6-weak-map": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es6-weak-map/-/es6-weak-map-2.0.3.tgz", + "integrity": "sha512-p5um32HOTO1kP+w7PRnB+5lQ43Z6muuMuIMffvDN8ZB4GcnjLBV6zGStpbASIMk4DCAvEaamhe2zhyCb/QXXsA==", + "dev": true, + "dependencies": { + "d": "1", + "es5-ext": "^0.10.46", + "es6-iterator": "^2.0.3", + "es6-symbol": "^3.1.1" + } + }, + "node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/events": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/events/-/events-1.0.2.tgz", + "integrity": "sha1-dYSdz+k9EPsFfDAFWv29UdBqjiQ=", + "dev": true, + "engines": { + "node": ">=0.4.x" + } + }, + "node_modules/evp_bytestokey": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", + "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", + "dev": true, + "dependencies": { + "md5.js": "^1.3.4", + "safe-buffer": "^5.1.1" + } + }, + "node_modules/expand-brackets": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", + "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", + "dev": true, + "dependencies": { + "debug": "^2.3.3", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "posix-character-classes": "^0.1.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expand-brackets/node_modules/define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "dependencies": { + "is-descriptor": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expand-brackets/node_modules/is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expand-brackets/node_modules/is-accessor-descriptor/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expand-brackets/node_modules/is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expand-brackets/node_modules/is-data-descriptor/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expand-brackets/node_modules/is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "dependencies": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expand-tilde": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz", + "integrity": "sha1-l+gBqgUt8CRU3kawK/YhZCzchQI=", + "dev": true, + "dependencies": { + "homedir-polyfill": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ext": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/ext/-/ext-1.4.0.tgz", + "integrity": "sha512-Key5NIsUxdqKg3vIsdw9dSuXpPCQ297y6wBjL30edxwPgt2E44WcWBZey/ZvUc6sERLTxKdyCu4gZFmUbk1Q7A==", + "dev": true, + "dependencies": { + "type": "^2.0.0" + } + }, + "node_modules/ext/node_modules/type": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/type/-/type-2.3.0.tgz", + "integrity": "sha512-rgPIqOdfK/4J9FhiVrZ3cveAjRRo5rsQBAIhnylX874y1DX/kEKSVdLsnuHB6l1KTjHyU01VjiMBHgU2adejyg==", + "dev": true + }, + "node_modules/extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "dev": true + }, + "node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/extglob": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "dev": true, + "dependencies": { + "array-unique": "^0.3.2", + "define-property": "^1.0.0", + "expand-brackets": "^2.1.4", + "extend-shallow": "^2.0.1", + "fragment-cache": "^0.2.1", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/extglob/node_modules/define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "dependencies": { + "is-descriptor": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fancy-log": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/fancy-log/-/fancy-log-1.3.3.tgz", + "integrity": "sha512-k9oEhlyc0FrVh25qYuSELjr8oxsCoc4/LEZfg2iJJrfEk/tZL9bCoJE47gqAvI2m/AUjluCS4+3I0eTx8n3AEw==", + "dev": true, + "dependencies": { + "ansi-gray": "^0.1.1", + "color-support": "^1.1.3", + "parse-node-version": "^1.0.0", + "time-stamp": "^1.0.0" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/fast-levenshtein": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-1.1.4.tgz", + "integrity": "sha1-5qdUzI8V5YmHqpy9J69m/W9OWvk=", + "dev": true + }, + "node_modules/file-uri-to-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", + "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==", + "dev": true, + "optional": true + }, + "node_modules/fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "dev": true, + "dependencies": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/find-up": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", + "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", + "dev": true, + "dependencies": { + "path-exists": "^2.0.0", + "pinkie-promise": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/findup-sync": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-3.0.0.tgz", + "integrity": "sha512-YbffarhcicEhOrm4CtrwdKBdCuz576RLdhJDsIfvNtxUuhdRet1qZcsMjqbePtAseKdAnDyM/IyXbu7PRPRLYg==", + "dev": true, + "dependencies": { + "detect-file": "^1.0.0", + "is-glob": "^4.0.0", + "micromatch": "^3.0.4", + "resolve-dir": "^1.0.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/fined": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/fined/-/fined-1.2.0.tgz", + "integrity": "sha512-ZYDqPLGxDkDhDZBjZBb+oD1+j0rA4E0pXY50eplAAOPg2N/gUBSSk5IM1/QhPfyVo19lJ+CvXpqfvk+b2p/8Ng==", + "dev": true, + "dependencies": { + "expand-tilde": "^2.0.2", + "is-plain-object": "^2.0.3", + "object.defaults": "^1.1.0", + "object.pick": "^1.2.0", + "parse-filepath": "^1.0.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/flagged-respawn": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/flagged-respawn/-/flagged-respawn-1.0.1.tgz", + "integrity": "sha512-lNaHNVymajmk0OJMBn8fVUAU1BtDeKIqKoVhk4xAALB57aALg6b4W0MfJ/cUE0g9YBXy5XhSlPIpYIJ7HaY/3Q==", + "dev": true, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/flush-write-stream": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.1.1.tgz", + "integrity": "sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w==", + "dev": true, + "dependencies": { + "inherits": "^2.0.3", + "readable-stream": "^2.3.6" + } + }, + "node_modules/flush-write-stream/node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "node_modules/flush-write-stream/node_modules/readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dev": true, + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/flush-write-stream/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "node_modules/flush-write-stream/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/for-in": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", + "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/for-own": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/for-own/-/for-own-1.0.0.tgz", + "integrity": "sha1-xjMy9BXO3EsE2/5wz4NklMU8tEs=", + "dev": true, + "dependencies": { + "for-in": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fragment-cache": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", + "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", + "dev": true, + "dependencies": { + "map-cache": "^0.2.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fs-mkdirp-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs-mkdirp-stream/-/fs-mkdirp-stream-1.0.0.tgz", + "integrity": "sha1-C3gV/DIBxqaeFNuYzgmMFpNSWes=", + "dev": true, + "dependencies": { + "graceful-fs": "^4.1.11", + "through2": "^2.0.3" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/fs-mkdirp-stream/node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "node_modules/fs-mkdirp-stream/node_modules/readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dev": true, + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/fs-mkdirp-stream/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "node_modules/fs-mkdirp-stream/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/fs-mkdirp-stream/node_modules/through2": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "dev": true, + "dependencies": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + } + }, + "node_modules/fs-mkdirp-stream/node_modules/xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "dev": true, + "engines": { + "node": ">=0.4" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "dev": true + }, + "node_modules/fsevents": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz", + "integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==", + "deprecated": "fsevents 1 will break on node v14+ and could be using insecure binaries. Upgrade to fsevents 2.", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "dependencies": { + "bindings": "^1.5.0", + "nan": "^2.12.1" + }, + "engines": { + "node": ">= 4.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, + "node_modules/get-caller-file": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz", + "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==", + "dev": true + }, + "node_modules/get-intrinsic": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", + "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-value": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", + "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/gintersect": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/gintersect/-/gintersect-0.1.0.tgz", + "integrity": "sha1-moy2qAt9bpVawzUVSVsSEmJ7GBY=" + }, + "node_modules/glob": { + "version": "4.5.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-4.5.3.tgz", + "integrity": "sha1-xstz0yJsHv7wTePFbQEvAzd+4V8=", + "dev": true, + "dependencies": { + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^2.0.1", + "once": "^1.3.0" + }, + "engines": { + "node": "*" + } + }, + "node_modules/glob-parent": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", + "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", + "dev": true, + "dependencies": { + "is-glob": "^3.1.0", + "path-dirname": "^1.0.0" + } + }, + "node_modules/glob-parent/node_modules/is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "dev": true, + "dependencies": { + "is-extglob": "^2.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/glob-stream": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/glob-stream/-/glob-stream-6.1.0.tgz", + "integrity": "sha1-cEXJlBOz65SIjYOrRtC0BMx73eQ=", + "dev": true, + "dependencies": { + "extend": "^3.0.0", + "glob": "^7.1.1", + "glob-parent": "^3.1.0", + "is-negated-glob": "^1.0.0", + "ordered-read-streams": "^1.0.0", + "pumpify": "^1.3.5", + "readable-stream": "^2.1.5", + "remove-trailing-separator": "^1.0.1", + "to-absolute-glob": "^2.0.0", + "unique-stream": "^2.0.2" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/glob-stream/node_modules/glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-stream/node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "node_modules/glob-stream/node_modules/minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/glob-stream/node_modules/readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dev": true, + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/glob-stream/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "node_modules/glob-stream/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/glob-watcher": { + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/glob-watcher/-/glob-watcher-5.0.5.tgz", + "integrity": "sha512-zOZgGGEHPklZNjZQaZ9f41i7F2YwE+tS5ZHrDhbBCk3stwahn5vQxnFmBJZHoYdusR6R1bLSXeGUy/BhctwKzw==", + "dev": true, + "dependencies": { + "anymatch": "^2.0.0", + "async-done": "^1.2.0", + "chokidar": "^2.0.0", + "is-negated-glob": "^1.0.0", + "just-debounce": "^1.0.0", + "normalize-path": "^3.0.0", + "object.defaults": "^1.1.0" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/global-modules": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz", + "integrity": "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==", + "dev": true, + "dependencies": { + "global-prefix": "^1.0.1", + "is-windows": "^1.0.1", + "resolve-dir": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/global-prefix": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz", + "integrity": "sha1-2/dDxsFJklk8ZVVoy2btMsASLr4=", + "dev": true, + "dependencies": { + "expand-tilde": "^2.0.2", + "homedir-polyfill": "^1.0.1", + "ini": "^1.3.4", + "is-windows": "^1.0.1", + "which": "^1.2.14" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/globby": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-2.1.0.tgz", + "integrity": "sha1-npGSvNM/Srak+JTl5+qLcTITxII=", + "dev": true, + "dependencies": { + "array-union": "^1.0.1", + "async": "^1.2.1", + "glob": "^5.0.3", + "object-assign": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/globby/node_modules/glob": { + "version": "5.0.15", + "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz", + "integrity": "sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E=", + "dev": true, + "dependencies": { + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "2 || 3", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + } + }, + "node_modules/glogg": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/glogg/-/glogg-1.0.2.tgz", + "integrity": "sha512-5mwUoSuBk44Y4EshyiqcH95ZntbDdTQqA3QYSrxmzj28Ai0vXBGMH1ApSANH14j2sIRtqCEyg6PfsuP7ElOEDA==", + "dev": true, + "dependencies": { + "sparkles": "^1.0.0" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.6", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.6.tgz", + "integrity": "sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ==", + "dev": true + }, + "node_modules/gulp": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/gulp/-/gulp-4.0.2.tgz", + "integrity": "sha512-dvEs27SCZt2ibF29xYgmnwwCYZxdxhQ/+LFWlbAW8y7jt68L/65402Lz3+CKy0Ov4rOs+NERmDq7YlZaDqUIfA==", + "dev": true, + "dependencies": { + "glob-watcher": "^5.0.3", + "gulp-cli": "^2.2.0", + "undertaker": "^1.2.1", + "vinyl-fs": "^3.0.0" + }, + "bin": { + "gulp": "bin/gulp.js" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/gulp-cli": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/gulp-cli/-/gulp-cli-2.3.0.tgz", + "integrity": "sha512-zzGBl5fHo0EKSXsHzjspp3y5CONegCm8ErO5Qh0UzFzk2y4tMvzLWhoDokADbarfZRL2pGpRp7yt6gfJX4ph7A==", + "dev": true, + "dependencies": { + "ansi-colors": "^1.0.1", + "archy": "^1.0.0", + "array-sort": "^1.0.0", + "color-support": "^1.1.3", + "concat-stream": "^1.6.0", + "copy-props": "^2.0.1", + "fancy-log": "^1.3.2", + "gulplog": "^1.0.0", + "interpret": "^1.4.0", + "isobject": "^3.0.1", + "liftoff": "^3.1.0", + "matchdep": "^2.0.0", + "mute-stdout": "^1.0.0", + "pretty-hrtime": "^1.0.0", + "replace-homedir": "^1.0.0", + "semver-greatest-satisfied-range": "^1.1.0", + "v8flags": "^3.2.0", + "yargs": "^7.1.0" + }, + "bin": { + "gulp": "bin/gulp.js" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/gulp-cli/node_modules/concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "dev": true, + "engines": [ + "node >= 0.8" + ], + "dependencies": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + } + }, + "node_modules/gulp-cli/node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "node_modules/gulp-cli/node_modules/readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dev": true, + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/gulp-cli/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "node_modules/gulp-cli/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/gulp-rename": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/gulp-rename/-/gulp-rename-2.0.0.tgz", + "integrity": "sha512-97Vba4KBzbYmR5VBs9mWmK+HwIf5mj+/zioxfZhOKeXtx5ZjBk57KFlePf5nxq9QsTtFl0ejnHE3zTC9MHXqyQ==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/gulp-run": { + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/gulp-run/-/gulp-run-1.7.1.tgz", + "integrity": "sha1-4XwKy3wwtuKu7iPAREKpbAys7/o=", + "dev": true, + "dependencies": { + "gulp-util": "^3.0.0", + "lodash.defaults": "^4.0.1", + "lodash.template": "^4.0.2", + "vinyl": "^0.4.6" + } + }, + "node_modules/gulp-uglify": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/gulp-uglify/-/gulp-uglify-3.0.2.tgz", + "integrity": "sha512-gk1dhB74AkV2kzqPMQBLA3jPoIAPd/nlNzP2XMDSG8XZrqnlCiDGAqC+rZOumzFvB5zOphlFh6yr3lgcAb/OOg==", + "dev": true, + "dependencies": { + "array-each": "^1.0.1", + "extend-shallow": "^3.0.2", + "gulplog": "^1.0.0", + "has-gulplog": "^0.1.0", + "isobject": "^3.0.1", + "make-error-cause": "^1.1.1", + "safe-buffer": "^5.1.2", + "through2": "^2.0.0", + "uglify-js": "^3.0.5", + "vinyl-sourcemaps-apply": "^0.2.0" + } + }, + "node_modules/gulp-uglify/node_modules/extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "dev": true, + "dependencies": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/gulp-uglify/node_modules/is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "dependencies": { + "is-plain-object": "^2.0.4" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/gulp-uglify/node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "node_modules/gulp-uglify/node_modules/readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dev": true, + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/gulp-uglify/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "node_modules/gulp-uglify/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/gulp-uglify/node_modules/through2": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "dev": true, + "dependencies": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + } + }, + "node_modules/gulp-uglify/node_modules/xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "dev": true, + "engines": { + "node": ">=0.4" + } + }, + "node_modules/gulp-util": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/gulp-util/-/gulp-util-3.0.8.tgz", + "integrity": "sha1-AFTh50RQLifATBh8PsxQXdVLu08=", + "deprecated": "gulp-util is deprecated - replace it, following the guidelines at https://medium.com/gulpjs/gulp-util-ca3b1f9f9ac5", + "dev": true, + "dependencies": { + "array-differ": "^1.0.0", + "array-uniq": "^1.0.2", + "beeper": "^1.0.0", + "chalk": "^1.0.0", + "dateformat": "^2.0.0", + "fancy-log": "^1.1.0", + "gulplog": "^1.0.0", + "has-gulplog": "^0.1.0", + "lodash._reescape": "^3.0.0", + "lodash._reevaluate": "^3.0.0", + "lodash._reinterpolate": "^3.0.0", + "lodash.template": "^3.0.0", + "minimist": "^1.1.0", + "multipipe": "^0.1.2", + "object-assign": "^3.0.0", + "replace-ext": "0.0.1", + "through2": "^2.0.0", + "vinyl": "^0.5.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/gulp-util/node_modules/clone": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", + "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4=", + "dev": true, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/gulp-util/node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "node_modules/gulp-util/node_modules/lodash.template": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-3.6.2.tgz", + "integrity": "sha1-+M3sxhaaJVvpCYrosMU9N4kx0U8=", + "dev": true, + "dependencies": { + "lodash._basecopy": "^3.0.0", + "lodash._basetostring": "^3.0.0", + "lodash._basevalues": "^3.0.0", + "lodash._isiterateecall": "^3.0.0", + "lodash._reinterpolate": "^3.0.0", + "lodash.escape": "^3.0.0", + "lodash.keys": "^3.0.0", + "lodash.restparam": "^3.0.0", + "lodash.templatesettings": "^3.0.0" + } + }, + "node_modules/gulp-util/node_modules/lodash.templatesettings": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-3.1.1.tgz", + "integrity": "sha1-+zB4RHU7Zrnxr6VOJix0UwfbqOU=", + "dev": true, + "dependencies": { + "lodash._reinterpolate": "^3.0.0", + "lodash.escape": "^3.0.0" + } + }, + "node_modules/gulp-util/node_modules/readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dev": true, + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/gulp-util/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "node_modules/gulp-util/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/gulp-util/node_modules/through2": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "dev": true, + "dependencies": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + } + }, + "node_modules/gulp-util/node_modules/vinyl": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-0.5.3.tgz", + "integrity": "sha1-sEVbOPxeDPMNQyUTLkYZcMIJHN4=", + "dev": true, + "dependencies": { + "clone": "^1.0.0", + "clone-stats": "^0.0.1", + "replace-ext": "0.0.1" + }, + "engines": { + "node": ">= 0.9" + } + }, + "node_modules/gulp-util/node_modules/xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "dev": true, + "engines": { + "node": ">=0.4" + } + }, + "node_modules/gulplog": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/gulplog/-/gulplog-1.0.0.tgz", + "integrity": "sha1-4oxNRdBey77YGDY86PnFkmIp/+U=", + "dev": true, + "dependencies": { + "glogg": "^1.0.0" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.1" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/has-ansi": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", + "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", + "dev": true, + "dependencies": { + "ansi-regex": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/has-gulplog": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/has-gulplog/-/has-gulplog-0.1.0.tgz", + "integrity": "sha1-ZBTIKRNpfaUVkDl9r7EvIpZ4Ec4=", + "dev": true, + "dependencies": { + "sparkles": "^1.0.0" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/has-symbols": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz", + "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", + "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", + "dev": true, + "dependencies": { + "get-value": "^2.0.6", + "has-values": "^1.0.0", + "isobject": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/has-values": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", + "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", + "dev": true, + "dependencies": { + "is-number": "^3.0.0", + "kind-of": "^4.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/has-values/node_modules/kind-of": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", + "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/hash-base": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.1.0.tgz", + "integrity": "sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==", + "dev": true, + "dependencies": { + "inherits": "^2.0.4", + "readable-stream": "^3.6.0", + "safe-buffer": "^5.2.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/hash-base/node_modules/readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dev": true, + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/hash-base/node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/hash.js": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", + "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", + "dev": true, + "dependencies": { + "inherits": "^2.0.3", + "minimalistic-assert": "^1.0.1" + } + }, + "node_modules/hmac-drbg": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", + "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", + "dev": true, + "dependencies": { + "hash.js": "^1.0.3", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.1" + } + }, + "node_modules/homedir-polyfill": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz", + "integrity": "sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==", + "dev": true, + "dependencies": { + "parse-passwd": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/hosted-git-info": { + "version": "2.8.8", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.8.tgz", + "integrity": "sha512-f/wzC2QaWBs7t9IYqB4T3sR1xviIViXJRJTWBlx2Gf3g0Xi5vI7Yy4koXQ1c9OYDGHN9sBy1DQ2AB8fqZBWhUg==", + "dev": true + }, + "node_modules/http-browserify": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/http-browserify/-/http-browserify-1.7.0.tgz", + "integrity": "sha1-M3la3nLfiKz7/TZ3PO/tp2RzWyA=", + "dev": true, + "dependencies": { + "Base64": "~0.2.0", + "inherits": "~2.0.1" + } + }, + "node_modules/https-browserify": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-0.0.1.tgz", + "integrity": "sha1-P5E2XKvmC3ftDruiS0VOPgnZWoI=", + "dev": true + }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/indexof": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz", + "integrity": "sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10=", + "dev": true + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dev": true, + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "node_modules/ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", + "dev": true + }, + "node_modules/inline-source-map": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/inline-source-map/-/inline-source-map-0.3.1.tgz", + "integrity": "sha1-pSi1FOaJ/OkNswiehw2S9Sestes=", + "dev": true, + "dependencies": { + "source-map": "~0.3.0" + } + }, + "node_modules/inline-source-map/node_modules/source-map": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.3.0.tgz", + "integrity": "sha1-hYb7mloAXltQHiHNGLbyG0V60fk=", + "dev": true, + "dependencies": { + "amdefine": ">=0.0.4" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/insert-module-globals": { + "version": "6.6.3", + "resolved": "https://registry.npmjs.org/insert-module-globals/-/insert-module-globals-6.6.3.tgz", + "integrity": "sha1-IGOOKaMPntHKLjqCX7wsulJG3fw=", + "dev": true, + "dependencies": { + "combine-source-map": "~0.6.1", + "concat-stream": "~1.4.1", + "is-buffer": "^1.1.0", + "JSONStream": "^1.0.3", + "lexical-scope": "^1.2.0", + "process": "~0.11.0", + "through2": "^1.0.0", + "xtend": "^4.0.0" + }, + "bin": { + "insert-module-globals": "bin/cmd.js" + } + }, + "node_modules/insert-module-globals/node_modules/combine-source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/combine-source-map/-/combine-source-map-0.6.1.tgz", + "integrity": "sha1-m0oJwxYDPXaODxHgKfonMOB5rZY=", + "dev": true, + "dependencies": { + "convert-source-map": "~1.1.0", + "inline-source-map": "~0.5.0", + "lodash.memoize": "~3.0.3", + "source-map": "~0.4.2" + } + }, + "node_modules/insert-module-globals/node_modules/convert-source-map": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.1.3.tgz", + "integrity": "sha1-SCnId+n+SbMWHzvzZziI4gRpmGA=", + "dev": true + }, + "node_modules/insert-module-globals/node_modules/inline-source-map": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/inline-source-map/-/inline-source-map-0.5.0.tgz", + "integrity": "sha1-Skxd2OT7Xps82mDIIt+tyu5m4K8=", + "dev": true, + "dependencies": { + "source-map": "~0.4.0" + } + }, + "node_modules/insert-module-globals/node_modules/jsonparse": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", + "integrity": "sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA=", + "dev": true, + "engines": [ + "node >= 0.2.0" + ] + }, + "node_modules/insert-module-globals/node_modules/JSONStream": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.5.tgz", + "integrity": "sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==", + "dev": true, + "dependencies": { + "jsonparse": "^1.2.0", + "through": ">=2.2.7 <3" + }, + "bin": { + "JSONStream": "bin.js" + }, + "engines": { + "node": "*" + } + }, + "node_modules/insert-module-globals/node_modules/process": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=", + "dev": true, + "engines": { + "node": ">= 0.6.0" + } + }, + "node_modules/insert-module-globals/node_modules/source-map": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz", + "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=", + "dev": true, + "dependencies": { + "amdefine": ">=0.0.4" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/insert-module-globals/node_modules/xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "dev": true, + "engines": { + "node": ">=0.4" + } + }, + "node_modules/interpret": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", + "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==", + "dev": true, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/invert-kv": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", + "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-absolute": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-absolute/-/is-absolute-1.0.0.tgz", + "integrity": "sha512-dOWoqflvcydARa360Gvv18DZ/gRuHKi2NU/wU5X1ZFzdYfH29nkiNZsF3mp4OJ3H4yo9Mx8A/uAGNzpzPN3yBA==", + "dev": true, + "dependencies": { + "is-relative": "^1.0.0", + "is-windows": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "dependencies": { + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-accessor-descriptor/node_modules/kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", + "dev": true + }, + "node_modules/is-binary-path": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", + "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", + "dev": true, + "dependencies": { + "binary-extensions": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", + "dev": true + }, + "node_modules/is-core-module": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.2.0.tgz", + "integrity": "sha512-XRAfAdyyY5F5cOXn7hYQDqh2Xmii+DEfIcQGxK/uNwMHhIkPWO0g8msXcbzLe+MpGoR951MlqM/2iIlU4vKDdQ==", + "dev": true, + "dependencies": { + "has": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "dependencies": { + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-data-descriptor/node_modules/kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "dependencies": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-descriptor/node_modules/kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "dev": true, + "dependencies": { + "number-is-nan": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-glob": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", + "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", + "dev": true, + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-negated-glob": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-negated-glob/-/is-negated-glob-1.0.0.tgz", + "integrity": "sha1-aRC8pdqMleeEtXUbl2z1oQ/uNtI=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-number/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-path-cwd": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-1.0.0.tgz", + "integrity": "sha1-0iXsIxMuie3Tj9p2dHLmLmXxEG0=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-path-in-cwd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-1.0.1.tgz", + "integrity": "sha512-FjV1RTW48E7CWM7eE/J2NJvAEEVektecDBVBE5Hh3nM1Jd0kvhHtX68Pr3xsDf857xt3Y4AkwVULK1Vku62aaQ==", + "dev": true, + "dependencies": { + "is-path-inside": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-path-inside": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.1.tgz", + "integrity": "sha1-jvW33lBDej/cprToZe96pVy0gDY=", + "dev": true, + "dependencies": { + "path-is-inside": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dev": true, + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-relative": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-relative/-/is-relative-1.0.0.tgz", + "integrity": "sha512-Kw/ReK0iqwKeu0MITLFuj0jbPAmEiOsIwyIXvvbfa6QfmN9pkD1M+8pdk7Rl/dTKbH34/XBFMbgD4iMJhLQbGA==", + "dev": true, + "dependencies": { + "is-unc-path": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-unc-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-unc-path/-/is-unc-path-1.0.0.tgz", + "integrity": "sha512-mrGpVd0fs7WWLfVsStvgF6iEJnbjDFZh9/emhRDcGWTduTfNHd9CHeUwH3gYIjdbwo4On6hunkztwOaAw0yllQ==", + "dev": true, + "dependencies": { + "unc-path-regex": "^0.1.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-utf8": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", + "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=", + "dev": true + }, + "node_modules/is-valid-glob": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-valid-glob/-/is-valid-glob-1.0.0.tgz", + "integrity": "sha1-Kb8+/3Ab4tTTFdusw5vDn+j2Aao=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-windows": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", + "dev": true + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", + "dev": true + }, + "node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/json-stable-stringify": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-0.0.1.tgz", + "integrity": "sha1-YRwj6BTbN1Un34URk9tZ3Sryf0U=", + "dev": true, + "dependencies": { + "jsonify": "~0.0.0" + } + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", + "dev": true + }, + "node_modules/jsonify": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz", + "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/jsonparse": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-0.0.5.tgz", + "integrity": "sha1-MwVCrT8KZUZlt3jz6y2an6UHrGQ=", + "dev": true, + "engines": [ + "node >= 0.2.0" + ] + }, + "node_modules/JSONStream": { + "version": "0.8.4", + "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-0.8.4.tgz", + "integrity": "sha1-kWV9/m/4V0gwZhMrRhi2Lo9Ih70=", + "dev": true, + "dependencies": { + "jsonparse": "0.0.5", + "through": ">=2.2.7 <3" + }, + "bin": { + "JSONStream": "index.js" + }, + "engines": { + "node": "*" + } + }, + "node_modules/just-debounce": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/just-debounce/-/just-debounce-1.1.0.tgz", + "integrity": "sha512-qpcRocdkUmf+UTNBYx5w6dexX5J31AKK1OmPwH630a83DdVVUIngk55RSAiIGpQyoH0dlr872VHfPjnQnK1qDQ==", + "dev": true + }, + "node_modules/kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/labeled-stream-splicer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/labeled-stream-splicer/-/labeled-stream-splicer-1.0.2.tgz", + "integrity": "sha1-RhUzFTd4SYHo/SZOHzpDTE4N3WU=", + "dev": true, + "dependencies": { + "inherits": "^2.0.1", + "isarray": "~0.0.1", + "stream-splicer": "^1.1.0" + } + }, + "node_modules/last-run": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/last-run/-/last-run-1.1.1.tgz", + "integrity": "sha1-RblpQsF7HHnHchmCWbqUO+v4yls=", + "dev": true, + "dependencies": { + "default-resolution": "^2.0.0", + "es6-weak-map": "^2.0.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/lazystream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.0.tgz", + "integrity": "sha1-9plf4PggOS9hOWvolGJAe7dxaOQ=", + "dev": true, + "dependencies": { + "readable-stream": "^2.0.5" + }, + "engines": { + "node": ">= 0.6.3" + } + }, + "node_modules/lazystream/node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "node_modules/lazystream/node_modules/readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dev": true, + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/lazystream/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "node_modules/lazystream/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/lcid": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", + "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", + "dev": true, + "dependencies": { + "invert-kv": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/lead": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/lead/-/lead-1.0.0.tgz", + "integrity": "sha1-bxT5mje+Op3XhPVJVpDlkDRm7kI=", + "dev": true, + "dependencies": { + "flush-write-stream": "^1.0.2" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/lexical-scope": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/lexical-scope/-/lexical-scope-1.2.0.tgz", + "integrity": "sha1-/Ope3HBKSzqHls3KQZw6CvryLfQ=", + "dev": true, + "dependencies": { + "astw": "^2.0.0" + } + }, + "node_modules/liftoff": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/liftoff/-/liftoff-3.1.0.tgz", + "integrity": "sha512-DlIPlJUkCV0Ips2zf2pJP0unEoT1kwYhiiPUGF3s/jtxTCjziNLoiVVh+jqWOWeFi6mmwQ5fNxvAUyPad4Dfog==", + "dev": true, + "dependencies": { + "extend": "^3.0.0", + "findup-sync": "^3.0.0", + "fined": "^1.0.1", + "flagged-respawn": "^1.0.0", + "is-plain-object": "^2.0.4", + "object.map": "^1.0.0", + "rechoir": "^0.6.2", + "resolve": "^1.1.7" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/liftoff/node_modules/resolve": { + "version": "1.20.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz", + "integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==", + "dev": true, + "dependencies": { + "is-core-module": "^2.2.0", + "path-parse": "^1.0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/load-json-file": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", + "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", + "dev": true, + "dependencies": { + "graceful-fs": "^4.1.2", + "parse-json": "^2.2.0", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0", + "strip-bom": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/lodash._basecopy": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/lodash._basecopy/-/lodash._basecopy-3.0.1.tgz", + "integrity": "sha1-jaDmqHbPNEwK2KVIghEd08XHyjY=", + "dev": true + }, + "node_modules/lodash._basetostring": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/lodash._basetostring/-/lodash._basetostring-3.0.1.tgz", + "integrity": "sha1-0YYdh3+CSlL2aYMtyvPuFVZqB9U=", + "dev": true + }, + "node_modules/lodash._basevalues": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lodash._basevalues/-/lodash._basevalues-3.0.0.tgz", + "integrity": "sha1-W3dXYoAr3j0yl1A+JjAIIP32Ybc=", + "dev": true + }, + "node_modules/lodash._getnative": { + "version": "3.9.1", + "resolved": "https://registry.npmjs.org/lodash._getnative/-/lodash._getnative-3.9.1.tgz", + "integrity": "sha1-VwvH3t5G1hzc3mh9ZdPuy6o6r/U=", + "dev": true + }, + "node_modules/lodash._isiterateecall": { + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/lodash._isiterateecall/-/lodash._isiterateecall-3.0.9.tgz", + "integrity": "sha1-UgOte6Ql+uhCRg5pbbnPPmqsBXw=", + "dev": true + }, + "node_modules/lodash._reescape": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lodash._reescape/-/lodash._reescape-3.0.0.tgz", + "integrity": "sha1-Kx1vXf4HyKNVdT5fJ/rH8c3hYWo=", + "dev": true + }, + "node_modules/lodash._reevaluate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lodash._reevaluate/-/lodash._reevaluate-3.0.0.tgz", + "integrity": "sha1-WLx0xAZklTrgsSTYBpltrKQx4u0=", + "dev": true + }, + "node_modules/lodash._reinterpolate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz", + "integrity": "sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0=", + "dev": true + }, + "node_modules/lodash._root": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/lodash._root/-/lodash._root-3.0.1.tgz", + "integrity": "sha1-+6HEUkwZ7ppfgTa0YJ8BfPTe1pI=", + "dev": true + }, + "node_modules/lodash.defaults": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-4.2.0.tgz", + "integrity": "sha1-0JF4cW/+pN3p5ft7N/bwgCJ0WAw=", + "dev": true + }, + "node_modules/lodash.escape": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/lodash.escape/-/lodash.escape-3.2.0.tgz", + "integrity": "sha1-mV7g3BjBtIzJLv+ucaEKq1tIdpg=", + "dev": true, + "dependencies": { + "lodash._root": "^3.0.0" + } + }, + "node_modules/lodash.isarguments": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz", + "integrity": "sha1-L1c9hcaiQon/AGY7SRwdM4/zRYo=", + "dev": true + }, + "node_modules/lodash.isarray": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/lodash.isarray/-/lodash.isarray-3.0.4.tgz", + "integrity": "sha1-eeTriMNqgSKvhvhEqpvNhRtfu1U=", + "dev": true + }, + "node_modules/lodash.keys": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-3.1.2.tgz", + "integrity": "sha1-TbwEcrFWvlCgsoaFXRvQsMZWCYo=", + "dev": true, + "dependencies": { + "lodash._getnative": "^3.0.0", + "lodash.isarguments": "^3.0.0", + "lodash.isarray": "^3.0.0" + } + }, + "node_modules/lodash.memoize": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-3.0.4.tgz", + "integrity": "sha1-LcvSwofLwKVcxCMovQxzYVDVPj8=", + "dev": true + }, + "node_modules/lodash.restparam": { + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/lodash.restparam/-/lodash.restparam-3.6.1.tgz", + "integrity": "sha1-k2pOMJ7zMKdkXtQUWYbIWuWyCAU=", + "dev": true + }, + "node_modules/lodash.template": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-4.5.0.tgz", + "integrity": "sha512-84vYFxIkmidUiFxidA/KjjH9pAycqW+h980j7Fuz5qxRtO9pgB7MDFTdys1N7A5mcucRiDyEq4fusljItR1T/A==", + "dev": true, + "dependencies": { + "lodash._reinterpolate": "^3.0.0", + "lodash.templatesettings": "^4.0.0" + } + }, + "node_modules/lodash.templatesettings": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-4.2.0.tgz", + "integrity": "sha512-stgLz+i3Aa9mZgnjr/O+v9ruKZsPsndy7qPZOchbqk2cnTU1ZaldKK+v7m54WoKIyxiuMZTKT2H81F8BeAc3ZQ==", + "dev": true, + "dependencies": { + "lodash._reinterpolate": "^3.0.0" + } + }, + "node_modules/lru-cache": { + "version": "2.7.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.7.3.tgz", + "integrity": "sha1-bUUk6LlV+V1PW1iFHOId1y+06VI=", + "dev": true + }, + "node_modules/make-error": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", + "dev": true + }, + "node_modules/make-error-cause": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/make-error-cause/-/make-error-cause-1.2.2.tgz", + "integrity": "sha1-3wOI/NCzeBbf8KX7gQiTl3fcvJ0=", + "dev": true, + "dependencies": { + "make-error": "^1.2.0" + } + }, + "node_modules/make-iterator": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/make-iterator/-/make-iterator-1.0.1.tgz", + "integrity": "sha512-pxiuXh0iVEq7VM7KMIhs5gxsfxCux2URptUQaXo4iZZJxBAzTPOLE2BumO5dbfVYq/hBJFBR/a1mFDmOx5AGmw==", + "dev": true, + "dependencies": { + "kind-of": "^6.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/make-iterator/node_modules/kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/map-cache": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", + "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/map-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", + "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", + "dev": true, + "dependencies": { + "object-visit": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/matchdep": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/matchdep/-/matchdep-2.0.0.tgz", + "integrity": "sha1-xvNINKDY28OzfCfui7yyfHd1WC4=", + "dev": true, + "dependencies": { + "findup-sync": "^2.0.0", + "micromatch": "^3.0.4", + "resolve": "^1.4.0", + "stack-trace": "0.0.10" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/matchdep/node_modules/findup-sync": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-2.0.0.tgz", + "integrity": "sha1-kyaxSIwi0aYIhlCoaQGy2akKLLw=", + "dev": true, + "dependencies": { + "detect-file": "^1.0.0", + "is-glob": "^3.1.0", + "micromatch": "^3.0.4", + "resolve-dir": "^1.0.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/matchdep/node_modules/is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "dev": true, + "dependencies": { + "is-extglob": "^2.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/matchdep/node_modules/resolve": { + "version": "1.20.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz", + "integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==", + "dev": true, + "dependencies": { + "is-core-module": "^2.2.0", + "path-parse": "^1.0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/md5.js": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", + "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", + "dev": true, + "dependencies": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "node_modules/micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dev": true, + "dependencies": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/micromatch/node_modules/extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "dev": true, + "dependencies": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/micromatch/node_modules/is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "dependencies": { + "is-plain-object": "^2.0.4" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/micromatch/node_modules/kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/miller-rabin": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", + "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", + "dev": true, + "dependencies": { + "bn.js": "^4.0.0", + "brorand": "^1.0.1" + }, + "bin": { + "miller-rabin": "bin/miller-rabin" + } + }, + "node_modules/miller-rabin/node_modules/bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "dev": true + }, + "node_modules/minimalistic-assert": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", + "dev": true + }, + "node_modules/minimalistic-crypto-utils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", + "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=", + "dev": true + }, + "node_modules/minimatch": { + "version": "2.0.10", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-2.0.10.tgz", + "integrity": "sha1-jQh8OcazjAAbl/ynzm0OHoCvusc=", + "deprecated": "Please update to minimatch 3.0.2 or higher to avoid a RegExp DoS issue", + "dev": true, + "dependencies": { + "brace-expansion": "^1.0.0" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minimist": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", + "dev": true + }, + "node_modules/mixin-deep": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", + "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", + "dev": true, + "dependencies": { + "for-in": "^1.0.2", + "is-extendable": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/mixin-deep/node_modules/is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "dependencies": { + "is-plain-object": "^2.0.4" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/mkdirp": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", + "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", + "dev": true, + "dependencies": { + "minimist": "^1.2.5" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, + "node_modules/module-deps": { + "version": "3.9.1", + "resolved": "https://registry.npmjs.org/module-deps/-/module-deps-3.9.1.tgz", + "integrity": "sha1-6nXK+RmQkNJbDVUStaysuW5/h/M=", + "dev": true, + "dependencies": { + "browser-resolve": "^1.7.0", + "concat-stream": "~1.4.5", + "defined": "^1.0.0", + "detective": "^4.0.0", + "duplexer2": "0.0.2", + "inherits": "^2.0.1", + "JSONStream": "^1.0.3", + "parents": "^1.0.0", + "readable-stream": "^1.1.13", + "resolve": "^1.1.3", + "stream-combiner2": "~1.0.0", + "subarg": "^1.0.0", + "through2": "^1.0.0", + "xtend": "^4.0.0" + }, + "bin": { + "module-deps": "bin/cmd.js" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/module-deps/node_modules/defined": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz", + "integrity": "sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM=", + "dev": true + }, + "node_modules/module-deps/node_modules/jsonparse": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", + "integrity": "sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA=", + "dev": true, + "engines": [ + "node >= 0.2.0" + ] + }, + "node_modules/module-deps/node_modules/JSONStream": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.5.tgz", + "integrity": "sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==", + "dev": true, + "dependencies": { + "jsonparse": "^1.2.0", + "through": ">=2.2.7 <3" + }, + "bin": { + "JSONStream": "bin.js" + }, + "engines": { + "node": "*" + } + }, + "node_modules/module-deps/node_modules/resolve": { + "version": "1.20.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz", + "integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==", + "dev": true, + "dependencies": { + "is-core-module": "^2.2.0", + "path-parse": "^1.0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/module-deps/node_modules/xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "dev": true, + "engines": { + "node": ">=0.4" + } + }, + "node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "node_modules/multipipe": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/multipipe/-/multipipe-0.1.2.tgz", + "integrity": "sha1-Ko8t33Du1WTf8tV/HhoTfZ8FB4s=", + "dev": true, + "dependencies": { + "duplexer2": "0.0.2" + } + }, + "node_modules/mute-stdout": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/mute-stdout/-/mute-stdout-1.0.1.tgz", + "integrity": "sha512-kDcwXR4PS7caBpuRYYBUz9iVixUk3anO3f5OYFiIPwK/20vCzKCHyKoulbiDY1S53zD2bxUpxN/IJ+TnXjfvxg==", + "dev": true, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/nan": { + "version": "2.14.2", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.2.tgz", + "integrity": "sha512-M2ufzIiINKCuDfBSAUr1vWQ+vuVcA9kqx8JJUsbQi6yf1uGRyb7HfpdfUr5qLXf3B/t8dPvcjhKMmlfnP47EzQ==", + "dev": true, + "optional": true + }, + "node_modules/nanomatch": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", + "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", + "dev": true, + "dependencies": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "fragment-cache": "^0.2.1", + "is-windows": "^1.0.2", + "kind-of": "^6.0.2", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/nanomatch/node_modules/extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "dev": true, + "dependencies": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/nanomatch/node_modules/is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "dependencies": { + "is-plain-object": "^2.0.4" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/nanomatch/node_modules/kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/next-tick": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.0.0.tgz", + "integrity": "sha1-yobR/ogoFpsBICCOPchCS524NCw=", + "dev": true + }, + "node_modules/ngraph.centrality": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/ngraph.centrality/-/ngraph.centrality-0.3.0.tgz", + "integrity": "sha1-jMDsAxnvCjdDV/wQRMFpdbF50J0=" + }, + "node_modules/ngraph.events": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/ngraph.events/-/ngraph.events-0.0.3.tgz", + "integrity": "sha1-OPVTFvPSB61jH/lPZiLKjywOh9A=" + }, + "node_modules/ngraph.expose": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/ngraph.expose/-/ngraph.expose-0.0.0.tgz", + "integrity": "sha1-dGw0kDo4SMRdAzsUvGRhnqhf5ao=" + }, + "node_modules/ngraph.forcelayout": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/ngraph.forcelayout/-/ngraph.forcelayout-0.5.0.tgz", + "integrity": "sha1-UVEcPh20XT1UNtp137HWrwl5FvU=", + "dependencies": { + "ngraph.events": "0.0.4", + "ngraph.physics.simulator": "^0.3.0" + } + }, + "node_modules/ngraph.forcelayout/node_modules/ngraph.events": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/ngraph.events/-/ngraph.events-0.0.4.tgz", + "integrity": "sha1-css2RIjdD9fwV0WESfajsXpyLZo=" + }, + "node_modules/ngraph.fromjson": { + "version": "0.1.9", + "resolved": "https://registry.npmjs.org/ngraph.fromjson/-/ngraph.fromjson-0.1.9.tgz", + "integrity": "sha1-ZpELZkxp+jxQoc553R391bq0b24=", + "dependencies": { + "ngraph.graph": "0.0.14" + } + }, + "node_modules/ngraph.generators": { + "version": "0.0.19", + "resolved": "https://registry.npmjs.org/ngraph.generators/-/ngraph.generators-0.0.19.tgz", + "integrity": "sha1-VSwNCH+UK50NKwxsqarENr76dlk=", + "dependencies": { + "ngraph.graph": "0.0.14", + "ngraph.random": "0.1.0" + } + }, + "node_modules/ngraph.generators/node_modules/ngraph.random": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/ngraph.random/-/ngraph.random-0.1.0.tgz", + "integrity": "sha1-G26Vc1KeCAZ32m/6CYeQ12oJSKk=" + }, + "node_modules/ngraph.graph": { + "version": "0.0.14", + "resolved": "https://registry.npmjs.org/ngraph.graph/-/ngraph.graph-0.0.14.tgz", + "integrity": "sha1-1HrJSWfJIKr3aVLYpOczRuHfLbc=", + "dependencies": { + "ngraph.events": "0.0.3" + } + }, + "node_modules/ngraph.merge": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/ngraph.merge/-/ngraph.merge-0.0.1.tgz", + "integrity": "sha1-5OgM43WBo8lrF9VF46Q8hUNLkCU=" + }, + "node_modules/ngraph.physics.primitives": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/ngraph.physics.primitives/-/ngraph.physics.primitives-0.0.7.tgz", + "integrity": "sha1-Xcnhebofkubex3SwHNaJFBILeVs=" + }, + "node_modules/ngraph.physics.simulator": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/ngraph.physics.simulator/-/ngraph.physics.simulator-0.3.0.tgz", + "integrity": "sha1-fKb8PjYXxz4QgFcuqo4E27d+AQI=", + "dependencies": { + "ngraph.events": "0.0.3", + "ngraph.expose": "0.0.0", + "ngraph.merge": "0.0.1", + "ngraph.physics.primitives": "0.0.7", + "ngraph.quadtreebh": "0.0.4", + "ngraph.random": "0.0.1" + } + }, + "node_modules/ngraph.quadtreebh": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/ngraph.quadtreebh/-/ngraph.quadtreebh-0.0.4.tgz", + "integrity": "sha1-xwDUTm5K8HttBQAbo5h/9eLc1iw=", + "dependencies": { + "ngraph.random": "0.0.1" + } + }, + "node_modules/ngraph.random": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/ngraph.random/-/ngraph.random-0.0.1.tgz", + "integrity": "sha1-wAji67/f+vF+0Q5LvJE+VnFmvPg=" + }, + "node_modules/ngraph.remove-overlaps": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/ngraph.remove-overlaps/-/ngraph.remove-overlaps-1.0.0.tgz", + "integrity": "sha1-tMBjVT6kzx/3gWjnt//2JhfA2fQ=", + "dev": true + }, + "node_modules/ngraph.tojson": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/ngraph.tojson/-/ngraph.tojson-0.1.4.tgz", + "integrity": "sha1-OfAEZYhECt5iLVhzTVideXSgs7w=" + }, + "node_modules/nopt": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-2.2.1.tgz", + "integrity": "sha1-KqCbfRdoSHs7ianFqlIzW/8Lrqc=", + "dev": true, + "dependencies": { + "abbrev": "1" + }, + "bin": { + "nopt": "bin/nopt.js" + } + }, + "node_modules/normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "dev": true, + "dependencies": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, + "node_modules/normalize-package-data/node_modules/resolve": { + "version": "1.20.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz", + "integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==", + "dev": true, + "dependencies": { + "is-core-module": "^2.2.0", + "path-parse": "^1.0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/now-and-later": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/now-and-later/-/now-and-later-2.0.1.tgz", + "integrity": "sha512-KGvQ0cB70AQfg107Xvs/Fbu+dGmZoTRJp2TaPwcwQm3/7PteUyN2BCgk8KBMPGBUXZdVwyWS8fDCGFygBm19UQ==", + "dev": true, + "dependencies": { + "once": "^1.3.2" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/number-is-nan": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", + "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-assign": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-3.0.0.tgz", + "integrity": "sha1-m+3VygiXlJvKR+f/QIBi1Un1h/I=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-copy": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", + "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", + "dev": true, + "dependencies": { + "copy-descriptor": "^0.1.0", + "define-property": "^0.2.5", + "kind-of": "^3.0.3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-copy/node_modules/define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "dependencies": { + "is-descriptor": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-copy/node_modules/is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-copy/node_modules/is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-copy/node_modules/is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "dependencies": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-copy/node_modules/is-descriptor/node_modules/kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-copy/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object-visit": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", + "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", + "dev": true, + "dependencies": { + "isobject": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object.assign": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz", + "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3", + "has-symbols": "^1.0.1", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.defaults": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/object.defaults/-/object.defaults-1.1.0.tgz", + "integrity": "sha1-On+GgzS0B96gbaFtiNXNKeQ1/s8=", + "dev": true, + "dependencies": { + "array-each": "^1.0.1", + "array-slice": "^1.0.0", + "for-own": "^1.0.0", + "isobject": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object.map": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object.map/-/object.map-1.0.1.tgz", + "integrity": "sha1-z4Plncj8wK1fQlDh94s7gb2AHTc=", + "dev": true, + "dependencies": { + "for-own": "^1.0.0", + "make-iterator": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object.pick": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", + "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", + "dev": true, + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object.reduce": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object.reduce/-/object.reduce-1.0.1.tgz", + "integrity": "sha1-b+NI8qx/oPlcpiEiZZkJaCW7A60=", + "dev": true, + "dependencies": { + "for-own": "^1.0.0", + "make-iterator": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dev": true, + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/onetime": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-1.1.0.tgz", + "integrity": "sha1-ofeDj4MUxRbwXs78vEzP4EtO14k=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/optimist": { + "version": "0.3.7", + "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.3.7.tgz", + "integrity": "sha1-yQlBrVnkJzMokjB00s8ufLxuwNk=", + "dev": true, + "dependencies": { + "wordwrap": "~0.0.2" + } + }, + "node_modules/ordered-read-streams": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/ordered-read-streams/-/ordered-read-streams-1.0.1.tgz", + "integrity": "sha1-d8DLN8QVJdZBZtmQ/61+xqDhNj4=", + "dev": true, + "dependencies": { + "readable-stream": "^2.0.1" + } + }, + "node_modules/ordered-read-streams/node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "node_modules/ordered-read-streams/node_modules/readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dev": true, + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/ordered-read-streams/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "node_modules/ordered-read-streams/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/os-browserify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.1.2.tgz", + "integrity": "sha1-ScoCk+CxlZCl9d4Qx/JlphfY/lQ=", + "dev": true + }, + "node_modules/os-locale": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", + "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=", + "dev": true, + "dependencies": { + "lcid": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pako": { + "version": "0.2.9", + "resolved": "https://registry.npmjs.org/pako/-/pako-0.2.9.tgz", + "integrity": "sha1-8/dSL073gjSNqBYbrZ7P1Rv4OnU=", + "dev": true + }, + "node_modules/parents": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parents/-/parents-1.0.1.tgz", + "integrity": "sha1-/t1NK/GTp3dF/nHjcdc8MwfZx1E=", + "dev": true, + "dependencies": { + "path-platform": "~0.11.15" + } + }, + "node_modules/parse-asn1": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.6.tgz", + "integrity": "sha512-RnZRo1EPU6JBnra2vGHj0yhp6ebyjBZpmUCLHWiFhxlzvBCCpAuZ7elsBp1PVAbQN0/04VD/19rfzlBSwLstMw==", + "dev": true, + "dependencies": { + "asn1.js": "^5.2.0", + "browserify-aes": "^1.0.0", + "evp_bytestokey": "^1.0.0", + "pbkdf2": "^3.0.3", + "safe-buffer": "^5.1.1" + } + }, + "node_modules/parse-filepath": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/parse-filepath/-/parse-filepath-1.0.2.tgz", + "integrity": "sha1-pjISf1Oq89FYdvWHLz/6x2PWyJE=", + "dev": true, + "dependencies": { + "is-absolute": "^1.0.0", + "map-cache": "^0.2.0", + "path-root": "^0.1.1" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/parse-json": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", + "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", + "dev": true, + "dependencies": { + "error-ex": "^1.2.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/parse-node-version": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parse-node-version/-/parse-node-version-1.0.1.tgz", + "integrity": "sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA==", + "dev": true, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/parse-passwd": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz", + "integrity": "sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pascalcase": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", + "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-browserify": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.1.tgz", + "integrity": "sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ==", + "dev": true + }, + "node_modules/path-dirname": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", + "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=", + "dev": true + }, + "node_modules/path-exists": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", + "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", + "dev": true, + "dependencies": { + "pinkie-promise": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-is-inside": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", + "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=", + "dev": true + }, + "node_modules/path-parse": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", + "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", + "dev": true + }, + "node_modules/path-platform": { + "version": "0.11.15", + "resolved": "https://registry.npmjs.org/path-platform/-/path-platform-0.11.15.tgz", + "integrity": "sha1-6GQhf3TDaFDwhSt43Hv31KVyG/I=", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/path-root": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/path-root/-/path-root-0.1.1.tgz", + "integrity": "sha1-mkpoFMrBwM1zNgqV8yCDyOpHRbc=", + "dev": true, + "dependencies": { + "path-root-regex": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-root-regex": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/path-root-regex/-/path-root-regex-0.1.2.tgz", + "integrity": "sha1-v8zcjfWxLcUsi0PsONGNcsBLqW0=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-type": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", + "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", + "dev": true, + "dependencies": { + "graceful-fs": "^4.1.2", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pbkdf2": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.1.tgz", + "integrity": "sha512-4Ejy1OPxi9f2tt1rRV7Go7zmfDQ+ZectEQz3VGUQhgq62HtIRPDyG/JtnwIxs6x3uNMwo2V7q1fMvKjb+Tnpqg==", + "dev": true, + "dependencies": { + "create-hash": "^1.1.2", + "create-hmac": "^1.1.4", + "ripemd160": "^2.0.1", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + }, + "engines": { + "node": ">=0.12" + } + }, + "node_modules/pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pinkie": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", + "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pinkie-promise": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", + "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", + "dev": true, + "dependencies": { + "pinkie": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/posix-character-classes": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", + "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pretty-hrtime": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz", + "integrity": "sha1-t+PqQkNaTJsnWdmeDyAesZWALuE=", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/process": { + "version": "0.10.1", + "resolved": "https://registry.npmjs.org/process/-/process-0.10.1.tgz", + "integrity": "sha1-hCRXzFHP7XLcd1r+6vuMYDQ3JyU=", + "dev": true, + "engines": { + "node": ">= 0.6.0" + } + }, + "node_modules/process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "dev": true + }, + "node_modules/public-encrypt": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz", + "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==", + "dev": true, + "dependencies": { + "bn.js": "^4.1.0", + "browserify-rsa": "^4.0.0", + "create-hash": "^1.1.0", + "parse-asn1": "^5.0.0", + "randombytes": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "node_modules/public-encrypt/node_modules/bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "dev": true + }, + "node_modules/pump": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz", + "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==", + "dev": true, + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "node_modules/pumpify": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.5.1.tgz", + "integrity": "sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==", + "dev": true, + "dependencies": { + "duplexify": "^3.6.0", + "inherits": "^2.0.3", + "pump": "^2.0.0" + } + }, + "node_modules/punycode": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.2.4.tgz", + "integrity": "sha1-VACKyXKux0F13vnLpt9/qdORh0A=", + "dev": true, + "engines": [ + "node", + "rhino" + ] + }, + "node_modules/querystring": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", + "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=", + "dev": true, + "engines": { + "node": ">=0.4.x" + } + }, + "node_modules/querystring-es3": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", + "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=", + "dev": true, + "engines": { + "node": ">=0.4.x" + } + }, + "node_modules/randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "dev": true, + "dependencies": { + "safe-buffer": "^5.1.0" + } + }, + "node_modules/randomfill": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz", + "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", + "dev": true, + "dependencies": { + "randombytes": "^2.0.5", + "safe-buffer": "^5.1.0" + } + }, + "node_modules/read-pkg": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", + "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", + "dev": true, + "dependencies": { + "load-json-file": "^1.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/read-pkg-up": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", + "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", + "dev": true, + "dependencies": { + "find-up": "^1.0.0", + "read-pkg": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/readable-stream": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", + "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", + "dev": true, + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + }, + "node_modules/readable-wrap": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/readable-wrap/-/readable-wrap-1.0.0.tgz", + "integrity": "sha1-O1ohHGMeEjA6VJkcgGwX564ga/8=", + "dev": true, + "dependencies": { + "readable-stream": "^1.1.13-1" + } + }, + "node_modules/readdirp": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", + "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.1.11", + "micromatch": "^3.1.10", + "readable-stream": "^2.0.2" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/readdirp/node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "node_modules/readdirp/node_modules/readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dev": true, + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/readdirp/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "node_modules/readdirp/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/rechoir": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", + "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=", + "dev": true, + "dependencies": { + "resolve": "^1.1.6" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/rechoir/node_modules/resolve": { + "version": "1.20.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz", + "integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==", + "dev": true, + "dependencies": { + "is-core-module": "^2.2.0", + "path-parse": "^1.0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/regex-not": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", + "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", + "dev": true, + "dependencies": { + "extend-shallow": "^3.0.2", + "safe-regex": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/regex-not/node_modules/extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "dev": true, + "dependencies": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/regex-not/node_modules/is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "dependencies": { + "is-plain-object": "^2.0.4" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/remove-bom-buffer": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/remove-bom-buffer/-/remove-bom-buffer-3.0.0.tgz", + "integrity": "sha512-8v2rWhaakv18qcvNeli2mZ/TMTL2nEyAKRvzo1WtnZBl15SHyEhrCu2/xKlJyUFKHiHgfXIyuY6g2dObJJycXQ==", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5", + "is-utf8": "^0.2.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/remove-bom-stream": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/remove-bom-stream/-/remove-bom-stream-1.2.0.tgz", + "integrity": "sha1-BfGlk/FuQuH7kOv1nejlaVJflSM=", + "dev": true, + "dependencies": { + "remove-bom-buffer": "^3.0.0", + "safe-buffer": "^5.1.0", + "through2": "^2.0.3" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/remove-bom-stream/node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "node_modules/remove-bom-stream/node_modules/readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dev": true, + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/remove-bom-stream/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "node_modules/remove-bom-stream/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/remove-bom-stream/node_modules/through2": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "dev": true, + "dependencies": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + } + }, + "node_modules/remove-bom-stream/node_modules/xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "dev": true, + "engines": { + "node": ">=0.4" + } + }, + "node_modules/remove-trailing-separator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", + "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=", + "dev": true + }, + "node_modules/repeat-element": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz", + "integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/repeat-string": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", + "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", + "dev": true, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/replace-ext": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-0.0.1.tgz", + "integrity": "sha1-KbvZIHinOfC8zitO5B6DeVNSKSQ=", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/replace-homedir": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/replace-homedir/-/replace-homedir-1.0.0.tgz", + "integrity": "sha1-6H9tUTuSjd6AgmDBK+f+xv9ueYw=", + "dev": true, + "dependencies": { + "homedir-polyfill": "^1.0.1", + "is-absolute": "^1.0.0", + "remove-trailing-separator": "^1.1.0" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/require-main-filename": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", + "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=", + "dev": true + }, + "node_modules/resolve": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-0.7.4.tgz", + "integrity": "sha1-OVqe+ehz+/4SvRRAi9kbuTYAPWk=", + "dev": true + }, + "node_modules/resolve-dir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz", + "integrity": "sha1-eaQGRMNivoLybv/nOcm7U4IEb0M=", + "dev": true, + "dependencies": { + "expand-tilde": "^2.0.0", + "global-modules": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/resolve-options": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/resolve-options/-/resolve-options-1.1.0.tgz", + "integrity": "sha1-MrueOcBtZzONyTeMDW1gdFZq0TE=", + "dev": true, + "dependencies": { + "value-or-function": "^3.0.0" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/resolve-url": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", + "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=", + "deprecated": "https://github.com/lydell/resolve-url#deprecated", + "dev": true + }, + "node_modules/ret": { + "version": "0.1.15", + "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", + "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", + "dev": true, + "engines": { + "node": ">=0.12" + } + }, + "node_modules/rfile": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/rfile/-/rfile-1.0.0.tgz", + "integrity": "sha1-WXCM+Qyh50xUw8/Fw2/bmBBDUmE=", + "dev": true, + "dependencies": { + "callsite": "~1.0.0", + "resolve": "~0.3.0" + } + }, + "node_modules/rfile/node_modules/resolve": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-0.3.1.tgz", + "integrity": "sha1-NMY0R8ZkxwWY0cmxJvxDsqJDEKQ=", + "dev": true + }, + "node_modules/rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + } + }, + "node_modules/rimraf/node_modules/glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/rimraf/node_modules/minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/ripemd160": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", + "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", + "dev": true, + "dependencies": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1" + } + }, + "node_modules/ruglify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/ruglify/-/ruglify-1.0.0.tgz", + "integrity": "sha1-3Ikw4qlUSidDAcyZcldMDQmGtnU=", + "dev": true, + "dependencies": { + "rfile": "~1.0", + "uglify-js": "~2.2" + } + }, + "node_modules/ruglify/node_modules/uglify-js": { + "version": "2.2.5", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.2.5.tgz", + "integrity": "sha1-puAqcNg5eSuXgEiLe4sYTAlcmcc=", + "dev": true, + "dependencies": { + "optimist": "~0.3.5", + "source-map": "~0.1.7" + }, + "bin": { + "uglifyjs": "bin/uglifyjs" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/runforcover": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/runforcover/-/runforcover-0.0.2.tgz", + "integrity": "sha1-NE8FfY1F0zrrxsyCIEZ49pxIV8w=", + "dev": true, + "dependencies": { + "bunker": "0.1.X" + }, + "engines": { + "node": "*" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/safe-regex": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", + "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", + "dev": true, + "dependencies": { + "ret": "~0.1.10" + } + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true + }, + "node_modules/semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true, + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/semver-greatest-satisfied-range": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/semver-greatest-satisfied-range/-/semver-greatest-satisfied-range-1.1.0.tgz", + "integrity": "sha1-E+jCZYq5aRywzXEJMkAoDTb3els=", + "dev": true, + "dependencies": { + "sver-compat": "^1.5.0" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", + "dev": true + }, + "node_modules/set-immediate-shim": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz", + "integrity": "sha1-SysbJ+uAip+NzEgaWOXlb1mfP2E=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/set-value": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", + "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==", + "dev": true, + "dependencies": { + "extend-shallow": "^2.0.1", + "is-extendable": "^0.1.1", + "is-plain-object": "^2.0.3", + "split-string": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sha.js": { + "version": "2.4.11", + "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", + "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", + "dev": true, + "dependencies": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + }, + "bin": { + "sha.js": "bin.js" + } + }, + "node_modules/shallow-copy": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/shallow-copy/-/shallow-copy-0.0.1.tgz", + "integrity": "sha1-QV9CcC1z2BAzApLMXuhurhoRoXA=", + "dev": true + }, + "node_modules/shasum": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/shasum/-/shasum-1.0.2.tgz", + "integrity": "sha1-5wEjENj0F/TetXEhUOVni4euVl8=", + "dev": true, + "dependencies": { + "json-stable-stringify": "~0.0.0", + "sha.js": "~2.4.4" + } + }, + "node_modules/shell-quote": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-0.0.1.tgz", + "integrity": "sha1-GkEZbzwDM8SCMjWT1ohuzxU92YY=", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/sigmund": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.1.tgz", + "integrity": "sha1-P/IfGYytIXX587eBhT/ZTQ0ZtZA=", + "dev": true + }, + "node_modules/simplesvg": { + "version": "0.0.10", + "resolved": "https://registry.npmjs.org/simplesvg/-/simplesvg-0.0.10.tgz", + "integrity": "sha1-N9LsGN4sFU3Ztp956K0gvx4eX90=", + "dependencies": { + "add-event-listener": "0.0.1" + } + }, + "node_modules/slide": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/slide/-/slide-1.1.6.tgz", + "integrity": "sha1-VusCfWW00tzmyy4tMsTUr8nh1wc=", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/snapdragon": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", + "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", + "dev": true, + "dependencies": { + "base": "^0.11.1", + "debug": "^2.2.0", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "map-cache": "^0.2.2", + "source-map": "^0.5.6", + "source-map-resolve": "^0.5.0", + "use": "^3.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon-node": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", + "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", + "dev": true, + "dependencies": { + "define-property": "^1.0.0", + "isobject": "^3.0.0", + "snapdragon-util": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon-node/node_modules/define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "dependencies": { + "is-descriptor": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon-util": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", + "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", + "dev": true, + "dependencies": { + "kind-of": "^3.2.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon-util/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon/node_modules/define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "dependencies": { + "is-descriptor": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon/node_modules/is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon/node_modules/is-accessor-descriptor/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon/node_modules/is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon/node_modules/is-data-descriptor/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon/node_modules/is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "dependencies": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon/node_modules/source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map": { + "version": "0.1.43", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.1.43.tgz", + "integrity": "sha1-wkvBRspRfBRx9drL4lcbK3+eM0Y=", + "dev": true, + "dependencies": { + "amdefine": ">=0.0.4" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/source-map-resolve": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz", + "integrity": "sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==", + "dev": true, + "dependencies": { + "atob": "^2.1.2", + "decode-uri-component": "^0.2.0", + "resolve-url": "^0.2.1", + "source-map-url": "^0.4.0", + "urix": "^0.1.0" + } + }, + "node_modules/source-map-url": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.1.tgz", + "integrity": "sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw==", + "dev": true + }, + "node_modules/sparkles": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/sparkles/-/sparkles-1.0.1.tgz", + "integrity": "sha512-dSO0DDYUahUt/0/pD/Is3VIm5TGJjludZ0HVymmhYF6eNA53PVLhnUk0znSYbH8IYBuJdCE+1luR22jNLMaQdw==", + "dev": true, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/spdx-correct": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", + "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==", + "dev": true, + "dependencies": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-exceptions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", + "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", + "dev": true + }, + "node_modules/spdx-expression-parse": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", + "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", + "dev": true, + "dependencies": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-license-ids": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.7.tgz", + "integrity": "sha512-U+MTEOO0AiDzxwFvoa4JVnMV6mZlJKk2sBLt90s7G0Gd0Mlknc7kxEn3nuDPNZRta7O2uy8oLcZLVT+4sqNZHQ==", + "dev": true + }, + "node_modules/split-string": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", + "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", + "dev": true, + "dependencies": { + "extend-shallow": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/split-string/node_modules/extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "dev": true, + "dependencies": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/split-string/node_modules/is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "dependencies": { + "is-plain-object": "^2.0.4" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/stack-trace": { + "version": "0.0.10", + "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz", + "integrity": "sha1-VHxws0fo0ytOEI6hoqFZ5f3eGcA=", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/static-extend": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", + "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", + "dev": true, + "dependencies": { + "define-property": "^0.2.5", + "object-copy": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/static-extend/node_modules/define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "dependencies": { + "is-descriptor": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/static-extend/node_modules/is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/static-extend/node_modules/is-accessor-descriptor/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/static-extend/node_modules/is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/static-extend/node_modules/is-data-descriptor/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/static-extend/node_modules/is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "dependencies": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/stream-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-1.0.0.tgz", + "integrity": "sha1-v5tKv7QrJ011FHnkTg/yZWtvEZM=", + "dev": true, + "dependencies": { + "inherits": "~2.0.1", + "readable-stream": "^1.0.27-1" + } + }, + "node_modules/stream-combiner2": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/stream-combiner2/-/stream-combiner2-1.0.2.tgz", + "integrity": "sha1-unKmtQy/q/qVD8i8h2BL0B62BnE=", + "dev": true, + "dependencies": { + "duplexer2": "~0.0.2", + "through2": "~0.5.1" + } + }, + "node_modules/stream-combiner2/node_modules/readable-stream": { + "version": "1.0.34", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", + "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", + "dev": true, + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + }, + "node_modules/stream-combiner2/node_modules/through2": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/through2/-/through2-0.5.1.tgz", + "integrity": "sha1-390BLrnHAOIyP9M084rGIqs3Lac=", + "dev": true, + "dependencies": { + "readable-stream": "~1.0.17", + "xtend": "~3.0.0" + } + }, + "node_modules/stream-exhaust": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/stream-exhaust/-/stream-exhaust-1.0.2.tgz", + "integrity": "sha512-b/qaq/GlBK5xaq1yrK9/zFcyRSTNxmcZwFLGSTG0mXgZl/4Z6GgiyYOXOvY7N3eEvFRAG1bkDRz5EPGSvPYQlw==", + "dev": true + }, + "node_modules/stream-shift": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.1.tgz", + "integrity": "sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==", + "dev": true + }, + "node_modules/stream-splicer": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/stream-splicer/-/stream-splicer-1.3.2.tgz", + "integrity": "sha1-PARBvhW5v04iYnXm3IOWR0VUZmE=", + "dev": true, + "dependencies": { + "indexof": "0.0.1", + "inherits": "^2.0.1", + "isarray": "~0.0.1", + "readable-stream": "^1.1.13-1", + "readable-wrap": "^1.0.0", + "through2": "^1.0.0" + } + }, + "node_modules/string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", + "dev": true + }, + "node_modules/string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "dev": true, + "dependencies": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "dependencies": { + "ansi-regex": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/strip-bom": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", + "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", + "dev": true, + "dependencies": { + "is-utf8": "^0.2.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/subarg": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/subarg/-/subarg-1.0.0.tgz", + "integrity": "sha1-9izxdYHplrSPyWVpn1TAauJouNI=", + "dev": true, + "dependencies": { + "minimist": "^1.1.0" + } + }, + "node_modules/supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/sver-compat": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/sver-compat/-/sver-compat-1.5.0.tgz", + "integrity": "sha1-PPh9/rTQe0o/FIJ7wYaz/QxkXNg=", + "dev": true, + "dependencies": { + "es6-iterator": "^2.0.1", + "es6-symbol": "^3.1.1" + } + }, + "node_modules/syntax-error": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/syntax-error/-/syntax-error-1.4.0.tgz", + "integrity": "sha512-YPPlu67mdnHGTup2A8ff7BC2Pjq0e0Yp/IyTFN03zWO0RcK07uLcbi7C2KpGR2FvWbaB0+bfE27a+sBKebSo7w==", + "dev": true, + "dependencies": { + "acorn-node": "^1.2.0" + } + }, + "node_modules/tap": { + "version": "0.4.13", + "resolved": "https://registry.npmjs.org/tap/-/tap-0.4.13.tgz", + "integrity": "sha1-OYYTTWdZcn/CIj5hEm7rhyQ6zLw=", + "dev": true, + "dependencies": { + "buffer-equal": "~0.0.0", + "deep-equal": "~0.0.0", + "difflet": "~0.2.0", + "glob": "~3.2.1", + "inherits": "*", + "mkdirp": "~0.3 || 0.4 || 0.5", + "nopt": "~2", + "runforcover": "~0.0.2", + "slide": "*", + "yamlish": "*" + }, + "bin": { + "tap": "bin/tap.js" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/tap/node_modules/deep-equal": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-0.0.0.tgz", + "integrity": "sha1-mWedO70EcVb81FDT0B7rkGhpHoM=", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/tap/node_modules/glob": { + "version": "3.2.11", + "resolved": "https://registry.npmjs.org/glob/-/glob-3.2.11.tgz", + "integrity": "sha1-Spc/Y1uRkPcV0QmH1cAP0oFevj0=", + "dev": true, + "dependencies": { + "inherits": "2", + "minimatch": "0.3" + }, + "engines": { + "node": "*" + } + }, + "node_modules/tap/node_modules/minimatch": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-0.3.0.tgz", + "integrity": "sha1-J12O2qxPG7MyZHIInnlJyDlGmd0=", + "deprecated": "Please update to minimatch 3.0.2 or higher to avoid a RegExp DoS issue", + "dev": true, + "dependencies": { + "lru-cache": "2", + "sigmund": "~1.0.0" + }, + "engines": { + "node": "*" + } + }, + "node_modules/through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", + "dev": true + }, + "node_modules/through2": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/through2/-/through2-1.1.1.tgz", + "integrity": "sha1-CEfLxESfNAVXTb3M2buEG4OsNUU=", + "dev": true, + "dependencies": { + "readable-stream": ">=1.1.13-1 <1.2.0-0", + "xtend": ">=4.0.0 <4.1.0-0" + } + }, + "node_modules/through2-filter": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/through2-filter/-/through2-filter-3.0.0.tgz", + "integrity": "sha512-jaRjI2WxN3W1V8/FMZ9HKIBXixtiqs3SQSX4/YGIiP3gL6djW48VoZq9tDqeCWs3MT8YY5wb/zli8VW8snY1CA==", + "dev": true, + "dependencies": { + "through2": "~2.0.0", + "xtend": "~4.0.0" + } + }, + "node_modules/through2-filter/node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "node_modules/through2-filter/node_modules/readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dev": true, + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/through2-filter/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "node_modules/through2-filter/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/through2-filter/node_modules/through2": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "dev": true, + "dependencies": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + } + }, + "node_modules/through2-filter/node_modules/xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "dev": true, + "engines": { + "node": ">=0.4" + } + }, + "node_modules/through2/node_modules/xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "dev": true, + "engines": { + "node": ">=0.4" + } + }, + "node_modules/time-stamp": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/time-stamp/-/time-stamp-1.1.0.tgz", + "integrity": "sha1-dkpaEa9QVhkhsTPztE5hhofg9cM=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/timers-browserify": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-1.4.2.tgz", + "integrity": "sha1-ycWLV1voQHN1y14kYtrO50NZ9B0=", + "dev": true, + "dependencies": { + "process": "~0.11.0" + }, + "engines": { + "node": ">=0.6.0" + } + }, + "node_modules/timers-browserify/node_modules/process": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=", + "dev": true, + "engines": { + "node": ">= 0.6.0" + } + }, + "node_modules/to-absolute-glob": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/to-absolute-glob/-/to-absolute-glob-2.0.2.tgz", + "integrity": "sha1-GGX0PZ50sIItufFFt4z/fQ98hJs=", + "dev": true, + "dependencies": { + "is-absolute": "^1.0.0", + "is-negated-glob": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/to-object-path": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", + "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/to-object-path/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/to-regex": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", + "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", + "dev": true, + "dependencies": { + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "regex-not": "^1.0.2", + "safe-regex": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "dev": true, + "dependencies": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/to-regex/node_modules/extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "dev": true, + "dependencies": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/to-regex/node_modules/is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "dependencies": { + "is-plain-object": "^2.0.4" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/to-through": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-through/-/to-through-2.0.0.tgz", + "integrity": "sha1-/JKtq6ByZHvAtn1rA2ZKoZUJOvY=", + "dev": true, + "dependencies": { + "through2": "^2.0.3" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/to-through/node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "node_modules/to-through/node_modules/readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dev": true, + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/to-through/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "node_modules/to-through/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/to-through/node_modules/through2": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "dev": true, + "dependencies": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + } + }, + "node_modules/to-through/node_modules/xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "dev": true, + "engines": { + "node": ">=0.4" + } + }, + "node_modules/traverse": { + "version": "0.6.6", + "resolved": "https://registry.npmjs.org/traverse/-/traverse-0.6.6.tgz", + "integrity": "sha1-y99WD9e5r2MlAv7UD5GMFX6pcTc=", + "dev": true + }, + "node_modules/tty-browserify": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.1.tgz", + "integrity": "sha512-C3TaO7K81YvjCgQH9Q1S3R3P3BtN3RIM8n+OvX4il1K1zgE8ZhI0op7kClgkxtutIE8hQrcrHBXvIheqKUUCxw==", + "dev": true + }, + "node_modules/type": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/type/-/type-1.2.0.tgz", + "integrity": "sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==", + "dev": true + }, + "node_modules/typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", + "dev": true + }, + "node_modules/uglify-js": { + "version": "3.12.8", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.12.8.tgz", + "integrity": "sha512-fvBeuXOsvqjecUtF/l1dwsrrf5y2BCUk9AOJGzGcm6tE7vegku5u/YvqjyDaAGr422PLoLnrxg3EnRvTqsdC1w==", + "dev": true, + "bin": { + "uglifyjs": "bin/uglifyjs" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/uglify-to-browserify": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz", + "integrity": "sha1-bgkk1r2mta/jSeOabWMoUKD4grc=", + "dev": true + }, + "node_modules/umd": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/umd/-/umd-2.1.0.tgz", + "integrity": "sha1-SmMHt2LxfwLSAbX6FU5nM5bCY88=", + "dev": true, + "dependencies": { + "rfile": "~1.0.0", + "ruglify": "~1.0.0", + "through": "~2.3.4", + "uglify-js": "~2.4.0" + }, + "bin": { + "umd": "bin/cli.js" + } + }, + "node_modules/umd/node_modules/async": { + "version": "0.2.10", + "resolved": "https://registry.npmjs.org/async/-/async-0.2.10.tgz", + "integrity": "sha1-trvgsGdLnXGXCMo43owjfLUmw9E=", + "dev": true + }, + "node_modules/umd/node_modules/camelcase": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz", + "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/umd/node_modules/source-map": { + "version": "0.1.34", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.1.34.tgz", + "integrity": "sha1-p8/omux7FoLDsZjQrPtH19CQVms=", + "dev": true, + "dependencies": { + "amdefine": ">=0.0.4" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/umd/node_modules/uglify-js": { + "version": "2.4.24", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.4.24.tgz", + "integrity": "sha1-+tV1XB4Vd2WLsG/5q25UjJW+vW4=", + "dev": true, + "dependencies": { + "async": "~0.2.6", + "source-map": "0.1.34", + "uglify-to-browserify": "~1.0.0", + "yargs": "~3.5.4" + }, + "bin": { + "uglifyjs": "bin/uglifyjs" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/umd/node_modules/wordwrap": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz", + "integrity": "sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8=", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/umd/node_modules/yargs": { + "version": "3.5.4", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.5.4.tgz", + "integrity": "sha1-2K/49mXpTDS9JZvevRv68N3TU2E=", + "dev": true, + "dependencies": { + "camelcase": "^1.0.2", + "decamelize": "^1.0.0", + "window-size": "0.1.0", + "wordwrap": "0.0.2" + } + }, + "node_modules/unc-path-regex": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/unc-path-regex/-/unc-path-regex-0.1.2.tgz", + "integrity": "sha1-5z3T17DXxe2G+6xrCufYxqadUPo=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/undertaker": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/undertaker/-/undertaker-1.3.0.tgz", + "integrity": "sha512-/RXwi5m/Mu3H6IHQGww3GNt1PNXlbeCuclF2QYR14L/2CHPz3DFZkvB5hZ0N/QUkiXWCACML2jXViIQEQc2MLg==", + "dev": true, + "dependencies": { + "arr-flatten": "^1.0.1", + "arr-map": "^2.0.0", + "bach": "^1.0.0", + "collection-map": "^1.0.0", + "es6-weak-map": "^2.0.1", + "fast-levenshtein": "^1.0.0", + "last-run": "^1.1.0", + "object.defaults": "^1.0.0", + "object.reduce": "^1.0.0", + "undertaker-registry": "^1.0.0" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/undertaker-registry": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/undertaker-registry/-/undertaker-registry-1.0.1.tgz", + "integrity": "sha1-XkvaMI5KiirlhPm5pDWaSZglzFA=", + "dev": true, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/union-value": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", + "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==", + "dev": true, + "dependencies": { + "arr-union": "^3.1.0", + "get-value": "^2.0.6", + "is-extendable": "^0.1.1", + "set-value": "^2.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/unique-stream": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/unique-stream/-/unique-stream-2.3.1.tgz", + "integrity": "sha512-2nY4TnBE70yoxHkDli7DMazpWiP7xMdCYqU2nBRO0UB+ZpEkGsSija7MvmvnZFUeC+mrgiUfcHSr3LmRFIg4+A==", + "dev": true, + "dependencies": { + "json-stable-stringify-without-jsonify": "^1.0.1", + "through2-filter": "^3.0.0" + } + }, + "node_modules/unset-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", + "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", + "dev": true, + "dependencies": { + "has-value": "^0.3.1", + "isobject": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/unset-value/node_modules/has-value": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", + "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", + "dev": true, + "dependencies": { + "get-value": "^2.0.3", + "has-values": "^0.1.4", + "isobject": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/unset-value/node_modules/has-value/node_modules/isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "dev": true, + "dependencies": { + "isarray": "1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/unset-value/node_modules/has-values": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", + "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/unset-value/node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "node_modules/upath": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz", + "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==", + "dev": true, + "engines": { + "node": ">=4", + "yarn": "*" + } + }, + "node_modules/urix": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", + "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", + "deprecated": "Please see https://github.com/lydell/urix#deprecated", + "dev": true + }, + "node_modules/url": { + "version": "0.10.3", + "resolved": "https://registry.npmjs.org/url/-/url-0.10.3.tgz", + "integrity": "sha1-Ah5NnHcF8hu/N9A861h2dAJ3TGQ=", + "dev": true, + "dependencies": { + "punycode": "1.3.2", + "querystring": "0.2.0" + } + }, + "node_modules/url/node_modules/punycode": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", + "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=", + "dev": true + }, + "node_modules/use": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", + "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/util": { + "version": "0.10.4", + "resolved": "https://registry.npmjs.org/util/-/util-0.10.4.tgz", + "integrity": "sha512-0Pm9hTQ3se5ll1XihRic3FDIku70C+iHUdT/W926rSgHV5QgXsYbKZN8MSC3tJtSkhuROzvsQjAaFENRXr+19A==", + "dev": true, + "dependencies": { + "inherits": "2.0.3" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", + "dev": true + }, + "node_modules/util/node_modules/inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true + }, + "node_modules/v8flags": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/v8flags/-/v8flags-3.2.0.tgz", + "integrity": "sha512-mH8etigqMfiGWdeXpaaqGfs6BndypxusHHcv2qSHyZkGEznCd/qAXCWWRzeowtL54147cktFOC4P5y+kl8d8Jg==", + "dev": true, + "dependencies": { + "homedir-polyfill": "^1.0.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/validate-npm-package-license": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "dev": true, + "dependencies": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, + "node_modules/value-or-function": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/value-or-function/-/value-or-function-3.0.0.tgz", + "integrity": "sha1-HCQ6ULWVwb5Up1S/7OhWO5/42BM=", + "dev": true, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/vinyl": { + "version": "0.4.6", + "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-0.4.6.tgz", + "integrity": "sha1-LzVsh6VQolVGHza76ypbqL94SEc=", + "dev": true, + "dependencies": { + "clone": "^0.2.0", + "clone-stats": "^0.0.1" + }, + "engines": { + "node": ">= 0.9" + } + }, + "node_modules/vinyl-buffer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/vinyl-buffer/-/vinyl-buffer-1.0.1.tgz", + "integrity": "sha1-lsGjR5uMU5JULGEgKQE7Wyf4i78=", + "dev": true, + "dependencies": { + "bl": "^1.2.1", + "through2": "^2.0.3" + } + }, + "node_modules/vinyl-buffer/node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "node_modules/vinyl-buffer/node_modules/readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dev": true, + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/vinyl-buffer/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "node_modules/vinyl-buffer/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/vinyl-buffer/node_modules/through2": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "dev": true, + "dependencies": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + } + }, + "node_modules/vinyl-buffer/node_modules/xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "dev": true, + "engines": { + "node": ">=0.4" + } + }, + "node_modules/vinyl-fs": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/vinyl-fs/-/vinyl-fs-3.0.3.tgz", + "integrity": "sha512-vIu34EkyNyJxmP0jscNzWBSygh7VWhqun6RmqVfXePrOwi9lhvRs//dOaGOTRUQr4tx7/zd26Tk5WeSVZitgng==", + "dev": true, + "dependencies": { + "fs-mkdirp-stream": "^1.0.0", + "glob-stream": "^6.1.0", + "graceful-fs": "^4.0.0", + "is-valid-glob": "^1.0.0", + "lazystream": "^1.0.0", + "lead": "^1.0.0", + "object.assign": "^4.0.4", + "pumpify": "^1.3.5", + "readable-stream": "^2.3.3", + "remove-bom-buffer": "^3.0.0", + "remove-bom-stream": "^1.2.0", + "resolve-options": "^1.1.0", + "through2": "^2.0.0", + "to-through": "^2.0.0", + "value-or-function": "^3.0.0", + "vinyl": "^2.0.0", + "vinyl-sourcemap": "^1.1.0" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/vinyl-fs/node_modules/clone": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", + "integrity": "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=", + "dev": true, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/vinyl-fs/node_modules/clone-stats": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-1.0.0.tgz", + "integrity": "sha1-s3gt/4u1R04Yuba/D9/ngvh3doA=", + "dev": true + }, + "node_modules/vinyl-fs/node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "node_modules/vinyl-fs/node_modules/readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dev": true, + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/vinyl-fs/node_modules/replace-ext": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-1.0.1.tgz", + "integrity": "sha512-yD5BHCe7quCgBph4rMQ+0KkIRKwWCrHDOX1p1Gp6HwjPM5kVoCdKGNhN7ydqqsX6lJEnQDKZ/tFMiEdQ1dvPEw==", + "dev": true, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/vinyl-fs/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "node_modules/vinyl-fs/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/vinyl-fs/node_modules/through2": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "dev": true, + "dependencies": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + } + }, + "node_modules/vinyl-fs/node_modules/vinyl": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-2.2.1.tgz", + "integrity": "sha512-LII3bXRFBZLlezoG5FfZVcXflZgWP/4dCwKtxd5ky9+LOtM4CS3bIRQsmR1KMnMW07jpE8fqR2lcxPZ+8sJIcw==", + "dev": true, + "dependencies": { + "clone": "^2.1.1", + "clone-buffer": "^1.0.0", + "clone-stats": "^1.0.0", + "cloneable-readable": "^1.0.0", + "remove-trailing-separator": "^1.0.1", + "replace-ext": "^1.0.0" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/vinyl-fs/node_modules/xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "dev": true, + "engines": { + "node": ">=0.4" + } + }, + "node_modules/vinyl-source-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/vinyl-source-stream/-/vinyl-source-stream-2.0.0.tgz", + "integrity": "sha1-84pa+53R6Ttl1VBGmsYYKsT1S44=", + "dev": true, + "dependencies": { + "through2": "^2.0.3", + "vinyl": "^2.1.0" + } + }, + "node_modules/vinyl-source-stream/node_modules/clone": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", + "integrity": "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=", + "dev": true, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/vinyl-source-stream/node_modules/clone-stats": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-1.0.0.tgz", + "integrity": "sha1-s3gt/4u1R04Yuba/D9/ngvh3doA=", + "dev": true + }, + "node_modules/vinyl-source-stream/node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "node_modules/vinyl-source-stream/node_modules/readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dev": true, + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/vinyl-source-stream/node_modules/replace-ext": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-1.0.1.tgz", + "integrity": "sha512-yD5BHCe7quCgBph4rMQ+0KkIRKwWCrHDOX1p1Gp6HwjPM5kVoCdKGNhN7ydqqsX6lJEnQDKZ/tFMiEdQ1dvPEw==", + "dev": true, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/vinyl-source-stream/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "node_modules/vinyl-source-stream/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/vinyl-source-stream/node_modules/through2": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "dev": true, + "dependencies": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + } + }, + "node_modules/vinyl-source-stream/node_modules/vinyl": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-2.2.1.tgz", + "integrity": "sha512-LII3bXRFBZLlezoG5FfZVcXflZgWP/4dCwKtxd5ky9+LOtM4CS3bIRQsmR1KMnMW07jpE8fqR2lcxPZ+8sJIcw==", + "dev": true, + "dependencies": { + "clone": "^2.1.1", + "clone-buffer": "^1.0.0", + "clone-stats": "^1.0.0", + "cloneable-readable": "^1.0.0", + "remove-trailing-separator": "^1.0.1", + "replace-ext": "^1.0.0" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/vinyl-source-stream/node_modules/xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "dev": true, + "engines": { + "node": ">=0.4" + } + }, + "node_modules/vinyl-sourcemap": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/vinyl-sourcemap/-/vinyl-sourcemap-1.1.0.tgz", + "integrity": "sha1-kqgAWTo4cDqM2xHYswCtS+Y7PhY=", + "dev": true, + "dependencies": { + "append-buffer": "^1.0.2", + "convert-source-map": "^1.5.0", + "graceful-fs": "^4.1.6", + "normalize-path": "^2.1.1", + "now-and-later": "^2.0.0", + "remove-bom-buffer": "^3.0.0", + "vinyl": "^2.0.0" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/vinyl-sourcemap/node_modules/clone": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", + "integrity": "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=", + "dev": true, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/vinyl-sourcemap/node_modules/clone-stats": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-1.0.0.tgz", + "integrity": "sha1-s3gt/4u1R04Yuba/D9/ngvh3doA=", + "dev": true + }, + "node_modules/vinyl-sourcemap/node_modules/convert-source-map": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz", + "integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.1.1" + } + }, + "node_modules/vinyl-sourcemap/node_modules/normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "dev": true, + "dependencies": { + "remove-trailing-separator": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/vinyl-sourcemap/node_modules/replace-ext": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-1.0.1.tgz", + "integrity": "sha512-yD5BHCe7quCgBph4rMQ+0KkIRKwWCrHDOX1p1Gp6HwjPM5kVoCdKGNhN7ydqqsX6lJEnQDKZ/tFMiEdQ1dvPEw==", + "dev": true, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/vinyl-sourcemap/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "node_modules/vinyl-sourcemap/node_modules/vinyl": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-2.2.1.tgz", + "integrity": "sha512-LII3bXRFBZLlezoG5FfZVcXflZgWP/4dCwKtxd5ky9+LOtM4CS3bIRQsmR1KMnMW07jpE8fqR2lcxPZ+8sJIcw==", + "dev": true, + "dependencies": { + "clone": "^2.1.1", + "clone-buffer": "^1.0.0", + "clone-stats": "^1.0.0", + "cloneable-readable": "^1.0.0", + "remove-trailing-separator": "^1.0.1", + "replace-ext": "^1.0.0" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/vinyl-sourcemaps-apply": { "version": "0.2.1", - "resolved": "https://registry.npmjs.org/Base64/-/Base64-0.2.1.tgz", - "integrity": "sha1-ujpCMHCOGGcFBl5mur3Uw1z2ACg=", + "resolved": "https://registry.npmjs.org/vinyl-sourcemaps-apply/-/vinyl-sourcemaps-apply-0.2.1.tgz", + "integrity": "sha1-q2VJ1h0XLCsbh75cUI0jnI74dwU=", + "dev": true, + "dependencies": { + "source-map": "^0.5.1" + } + }, + "node_modules/vinyl-sourcemaps-apply/node_modules/source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/vm-browserify": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-0.0.4.tgz", + "integrity": "sha1-XX6kW7755Kb/ZflUOOCofDV9WnM=", + "dev": true, + "dependencies": { + "indexof": "0.0.1" + } + }, + "node_modules/which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" + } + }, + "node_modules/which-module": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-1.0.0.tgz", + "integrity": "sha1-u6Y8qGGUiZT/MHc2CJ47lgJsKk8=", "dev": true }, - "JSONStream": { - "version": "0.8.4", - "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-0.8.4.tgz", - "integrity": "sha1-kWV9/m/4V0gwZhMrRhi2Lo9Ih70=", + "node_modules/window-size": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.0.tgz", + "integrity": "sha1-VDjNLqk7IC76Ohn+iIeu58lPnJ0=", "dev": true, - "requires": { - "jsonparse": "0.0.5", - "through": ">=2.2.7 <3" + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/wordwrap": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz", + "integrity": "sha1-o9XabNXAvAAI03I0u68b7WMFkQc=", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/wrap-ansi": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", + "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", + "dev": true, + "dependencies": { + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "dev": true + }, + "node_modules/xtend": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-3.0.0.tgz", + "integrity": "sha1-XM50B7r2Qsunvs2laBEcST9ZZlo=", + "dev": true, + "engines": { + "node": ">=0.4" } }, + "node_modules/y18n": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.2.tgz", + "integrity": "sha512-uGZHXkHnhF0XeeAPgnKfPv1bgKAYyVvmNL1xlKsPYZPaIHxGti2hHqvOCQv71XMsLxu1QjergkqogUnms5D3YQ==", + "dev": true + }, + "node_modules/yamlish": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/yamlish/-/yamlish-0.0.7.tgz", + "integrity": "sha1-tK+aHcxjYYhzw9bkUewyE8OaV/s=", + "dev": true + }, + "node_modules/yargs": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-7.1.1.tgz", + "integrity": "sha512-huO4Fr1f9PmiJJdll5kwoS2e4GqzGSsMT3PPMpOwoVkOK8ckqAewMTZyA6LXVQWflleb/Z8oPBEvNsMft0XE+g==", + "dev": true, + "dependencies": { + "camelcase": "^3.0.0", + "cliui": "^3.2.0", + "decamelize": "^1.1.1", + "get-caller-file": "^1.0.1", + "os-locale": "^1.4.0", + "read-pkg-up": "^1.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^1.0.1", + "set-blocking": "^2.0.0", + "string-width": "^1.0.2", + "which-module": "^1.0.0", + "y18n": "^3.2.1", + "yargs-parser": "5.0.0-security.0" + } + }, + "node_modules/yargs-parser": { + "version": "5.0.0-security.0", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-5.0.0-security.0.tgz", + "integrity": "sha512-T69y4Ps64LNesYxeYGYPvfoMTt/7y1XtfpIslUeK4um+9Hu7hlGoRtaDLvdXb7+/tfq4opVa2HRY5xGip022rQ==", + "dev": true, + "dependencies": { + "camelcase": "^3.0.0", + "object.assign": "^4.1.0" + } + } + }, + "dependencies": { "abbrev": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", @@ -44,9 +7542,9 @@ }, "dependencies": { "acorn": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.1.0.tgz", - "integrity": "sha512-kL5CuoXA/dgxlBbVrflsflzQ3PAas7RYZB52NOm/6839iVYJgKMJ3cQJD+t2i5+qFa8h3MDpEOJiS64E8JLnSQ==", + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", "dev": true }, "xtend": { @@ -58,9 +7556,9 @@ } }, "acorn-walk": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.0.0.tgz", - "integrity": "sha512-7Bv1We7ZGuU79zZbb6rRqcpxo3OY+zrdtloZWoyD8fmGX+FeXRjE+iuGkZjSXLVovLzrsvMGMy0EkwA0E0umxg==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz", + "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==", "dev": true }, "add-event-listener": { @@ -68,34 +7566,21 @@ "resolved": "https://registry.npmjs.org/add-event-listener/-/add-event-listener-0.0.1.tgz", "integrity": "sha1-p2Ip68ZMiu+uIEoWJzovJVq+otA=" }, - "align-text": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz", - "integrity": "sha1-DNkKVhCT810KmSVsIrcGlDP60Rc=", - "dev": true, - "requires": { - "kind-of": "^3.0.2", - "longest": "^1.0.1", - "repeat-string": "^1.5.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, "amdefine": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz", "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=", "dev": true }, + "ansi-colors": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-1.1.0.tgz", + "integrity": "sha512-SFKX67auSNoVR38N3L+nvsPjOE0bybKTYbkf5tRvushrAPQ9V75huw0ZxBkKVeRU9kqH3d6HA4xTckbwZ4ixmA==", + "dev": true, + "requires": { + "ansi-wrap": "^0.1.0" + } + }, "ansi-gray": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/ansi-gray/-/ansi-gray-0.1.1.tgz", @@ -123,6 +7608,44 @@ "integrity": "sha1-qCJQ3bABXponyoLoLqYDu/pF768=", "dev": true }, + "anymatch": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", + "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", + "dev": true, + "requires": { + "micromatch": "^3.1.4", + "normalize-path": "^2.1.1" + }, + "dependencies": { + "normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "dev": true, + "requires": { + "remove-trailing-separator": "^1.0.1" + } + } + } + }, + "append-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/append-buffer/-/append-buffer-1.0.2.tgz", + "integrity": "sha1-2CIM9GYIFSXv6lBhTz3mUU36WPE=", + "dev": true, + "requires": { + "buffer-equal": "^1.0.0" + }, + "dependencies": { + "buffer-equal": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/buffer-equal/-/buffer-equal-1.0.0.tgz", + "integrity": "sha1-WWFrSYME1Var1GaWayLu2j7KX74=", + "dev": true + } + } + }, "archy": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz", @@ -135,12 +7658,30 @@ "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", "dev": true }, + "arr-filter": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/arr-filter/-/arr-filter-1.1.2.tgz", + "integrity": "sha1-Q/3d0JHo7xGqTEXZzcGOLf8XEe4=", + "dev": true, + "requires": { + "make-iterator": "^1.0.0" + } + }, "arr-flatten": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", "dev": true }, + "arr-map": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/arr-map/-/arr-map-2.0.2.tgz", + "integrity": "sha1-Onc0X/wc814qkYJWAfnljy4kysQ=", + "dev": true, + "requires": { + "make-iterator": "^1.0.0" + } + }, "arr-union": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", @@ -159,12 +7700,58 @@ "integrity": "sha1-p5SvDAWrF1KEbudTofIRoFugxE8=", "dev": true }, + "array-initial": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/array-initial/-/array-initial-1.1.0.tgz", + "integrity": "sha1-L6dLJnOTccOUe9enrcc74zSz15U=", + "dev": true, + "requires": { + "array-slice": "^1.0.0", + "is-number": "^4.0.0" + }, + "dependencies": { + "is-number": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz", + "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==", + "dev": true + } + } + }, + "array-last": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/array-last/-/array-last-1.3.0.tgz", + "integrity": "sha512-eOCut5rXlI6aCOS7Z7kCplKRKyiFQ6dHFBem4PwlwKeNFk2/XxTrhRh5T9PyaEWGy/NHTZWbY+nsZlNFJu9rYg==", + "dev": true, + "requires": { + "is-number": "^4.0.0" + }, + "dependencies": { + "is-number": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz", + "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==", + "dev": true + } + } + }, "array-slice": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/array-slice/-/array-slice-1.1.0.tgz", "integrity": "sha512-B1qMD3RBP7O8o0H2KbrXDyB0IccejMF15+87Lvlor12ONPRHP6gTjXMNkt/d3ZuOGbAe66hFmaCfECI24Ufp6w==", "dev": true }, + "array-sort": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-sort/-/array-sort-1.0.0.tgz", + "integrity": "sha512-ihLeJkonmdiAsD7vpgN3CRcx2J2S0TiYW+IS/5zHBI7mKUq3ySvBdzzBfD236ubDBQFiiyG3SWCPc+msQ9KoYg==", + "dev": true, + "requires": { + "default-compare": "^1.0.0", + "get-value": "^2.0.6", + "kind-of": "^5.0.2" + } + }, "array-union": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", @@ -187,14 +7774,23 @@ "dev": true }, "asn1.js": { - "version": "4.10.1", - "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.10.1.tgz", - "integrity": "sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw==", + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-5.4.1.tgz", + "integrity": "sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA==", "dev": true, "requires": { "bn.js": "^4.0.0", "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0" + "minimalistic-assert": "^1.0.0", + "safer-buffer": "^2.1.0" + }, + "dependencies": { + "bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "dev": true + } } }, "assert": { @@ -239,17 +7835,61 @@ } }, "async": { - "version": "0.2.10", - "resolved": "https://registry.npmjs.org/async/-/async-0.2.10.tgz", - "integrity": "sha1-trvgsGdLnXGXCMo43owjfLUmw9E=", + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", + "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=", + "dev": true + }, + "async-done": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/async-done/-/async-done-1.3.2.tgz", + "integrity": "sha512-uYkTP8dw2og1tu1nmza1n1CMW0qb8gWWlwqMmLb7MhBVs4BXrFziT6HXUd+/RlRA/i4H9AkofYloUbs1fwMqlw==", + "dev": true, + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.2", + "process-nextick-args": "^2.0.0", + "stream-exhaust": "^1.0.1" + } + }, + "async-each": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.3.tgz", + "integrity": "sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ==", "dev": true }, + "async-settle": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/async-settle/-/async-settle-1.0.0.tgz", + "integrity": "sha1-HQqRS7Aldb7IqPOnTlCA9yssDGs=", + "dev": true, + "requires": { + "async-done": "^1.2.2" + } + }, "atob": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", "dev": true }, + "bach": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/bach/-/bach-1.2.0.tgz", + "integrity": "sha1-Szzpa/JxNPeaG0FKUcFONMO9mIA=", + "dev": true, + "requires": { + "arr-filter": "^1.1.1", + "arr-flatten": "^1.0.1", + "arr-map": "^2.0.0", + "array-each": "^1.0.0", + "array-initial": "^1.0.0", + "array-last": "^1.1.1", + "async-done": "^1.2.2", + "async-settle": "^1.0.0", + "now-and-later": "^2.0.0" + } + }, "balanced-match": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", @@ -279,38 +7919,15 @@ "requires": { "is-descriptor": "^1.0.0" } - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } } } }, + "Base64": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/Base64/-/Base64-0.2.1.tgz", + "integrity": "sha1-ujpCMHCOGGcFBl5mur3Uw1z2ACg=", + "dev": true + }, "base64-js": { "version": "0.0.8", "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-0.0.8.tgz", @@ -323,10 +7940,26 @@ "integrity": "sha1-5tXqjF2tABMEpwsiY4RH9pyy+Ak=", "dev": true }, + "binary-extensions": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", + "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==", + "dev": true + }, + "bindings": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", + "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", + "dev": true, + "optional": true, + "requires": { + "file-uri-to-path": "1.0.0" + } + }, "bl": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/bl/-/bl-1.2.2.tgz", - "integrity": "sha512-e8tQYnZodmebYDWGH7KMRvtzKXaJHx3BbilrgZCfvyLUYdKpK1t5PSPmpkny/SgiTSCnjfLW7v5rlONXVFkQEA==", + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/bl/-/bl-1.2.3.tgz", + "integrity": "sha512-pvcNpa0UU69UT341rO6AYy4FVAIkUHuZXRIWbq+zHnsVcRzDDjIAhGuuYoi0d//cwIwtt4pkpKycWEfjdV+vww==", "dev": true, "requires": { "readable-stream": "^2.3.5", @@ -340,9 +7973,9 @@ "dev": true }, "readable-stream": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", "dev": true, "requires": { "core-util-is": "~1.0.0", @@ -352,16 +7985,14 @@ "safe-buffer": "~5.1.1", "string_decoder": "~1.1.1", "util-deprecate": "~1.0.1" - }, - "dependencies": { - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - } } }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, "string_decoder": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", @@ -369,22 +8000,14 @@ "dev": true, "requires": { "safe-buffer": "~5.1.0" - }, - "dependencies": { - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - } } } } }, "bn.js": { - "version": "4.11.8", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz", - "integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.0.tgz", + "integrity": "sha512-D7iWRBvnZE8ecXiLj/9wbxH7Tk79fAh8IHaTNq1RWRixsS02W+5qS+iE9yq6RYl0asXx5tw0bLhmT5pIfbSquw==", "dev": true }, "brace-expansion": { @@ -413,17 +8036,6 @@ "snapdragon-node": "^2.0.1", "split-string": "^3.0.2", "to-regex": "^3.0.1" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } } }, "brorand": { @@ -438,10 +8050,10 @@ "integrity": "sha1-+qHLxBSHsazEdH43PhFIrf/Q4tk=", "dev": true, "requires": { - "JSONStream": "~0.8.4", "combine-source-map": "~0.3.0", "concat-stream": "~1.4.1", "defined": "~0.0.0", + "JSONStream": "~0.8.4", "through2": "~0.5.1", "umd": "^2.1.0" }, @@ -493,7 +8105,6 @@ "integrity": "sha1-8zpUmjpsNoIZsHX9z+bfGV4Empo=", "dev": true, "requires": { - "JSONStream": "~0.8.3", "assert": "~1.3.0", "browser-pack": "^3.2.0", "browser-resolve": "^1.3.0", @@ -517,6 +8128,7 @@ "inherits": "~2.0.1", "insert-module-globals": "^6.2.0", "isarray": "0.0.1", + "JSONStream": "~0.8.3", "labeled-stream-splicer": "^1.0.0", "module-deps": "^3.6.3", "os-browserify": "~0.1.1", @@ -582,28 +8194,52 @@ } }, "browserify-rsa": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz", - "integrity": "sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ=", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.1.0.tgz", + "integrity": "sha512-AdEER0Hkspgno2aR97SAf6vi0y0k8NuOpGnVH3O99rcA5Q6sh8QxcngtHuJ6uXwnfAXNM4Gn1Gb7/MV1+Ymbog==", "dev": true, "requires": { - "bn.js": "^4.1.0", + "bn.js": "^5.0.0", "randombytes": "^2.0.1" } }, "browserify-sign": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.0.4.tgz", - "integrity": "sha1-qk62jl17ZYuqa/alfmMMvXqT0pg=", - "dev": true, - "requires": { - "bn.js": "^4.1.1", - "browserify-rsa": "^4.0.0", - "create-hash": "^1.1.0", - "create-hmac": "^1.1.2", - "elliptic": "^6.0.0", - "inherits": "^2.0.1", - "parse-asn1": "^5.0.0" + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.2.1.tgz", + "integrity": "sha512-/vrA5fguVAKKAVTNJjgSm1tRQDHUU6DbwO9IROu/0WAzC8PKhucDSh18J0RMvVeHAn5puMd+QHC2erPRNf8lmg==", + "dev": true, + "requires": { + "bn.js": "^5.1.1", + "browserify-rsa": "^4.0.1", + "create-hash": "^1.2.0", + "create-hmac": "^1.1.7", + "elliptic": "^6.5.3", + "inherits": "^2.0.4", + "parse-asn1": "^5.1.5", + "readable-stream": "^3.6.0", + "safe-buffer": "^5.2.0" + }, + "dependencies": { + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + }, + "string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dev": true, + "requires": { + "safe-buffer": "~5.2.0" + } + } } }, "browserify-zlib": { @@ -616,9 +8252,9 @@ } }, "buffer": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-3.6.0.tgz", - "integrity": "sha1-pyyTb3e5a/UvX357RnGAYoVR3vs=", + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-3.6.2.tgz", + "integrity": "sha512-c3M77NkHJxS0zx/ErxXhDLr1v3y2MDXPeTJPvLNOaIYJ4ymHBUFQ9EXzt9HYuqAJllMoNb/EZ8hIiulnQFAUuQ==", "dev": true, "requires": { "base64-js": "0.0.8", @@ -640,6 +8276,12 @@ "integrity": "sha1-7Lt5D1aNQAmKYkK1SAXHWAXrk48=", "dev": true }, + "buffer-from": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", + "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", + "dev": true + }, "buffer-xor": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", @@ -702,6 +8344,16 @@ "unset-value": "^1.0.0" } }, + "call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "dev": true, + "requires": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + } + }, "callsite": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/callsite/-/callsite-1.0.0.tgz", @@ -709,21 +8361,11 @@ "dev": true }, "camelcase": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz", - "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", + "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=", "dev": true }, - "center-align": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/center-align/-/center-align-0.1.3.tgz", - "integrity": "sha1-qg0yYptu6XIgBBHL1EYckHvCt60=", - "dev": true, - "requires": { - "align-text": "^0.1.3", - "lazy-cache": "^1.0.3" - } - }, "chalk": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", @@ -743,6 +8385,26 @@ "integrity": "sha1-BsIe7RobBq62dVPNxT4jJ0usIpY=", "dev": true }, + "chokidar": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", + "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==", + "dev": true, + "requires": { + "anymatch": "^2.0.0", + "async-each": "^1.0.1", + "braces": "^2.3.2", + "fsevents": "^1.2.7", + "glob-parent": "^3.1.0", + "inherits": "^2.0.3", + "is-binary-path": "^1.0.0", + "is-glob": "^4.0.0", + "normalize-path": "^3.0.0", + "path-is-absolute": "^1.0.0", + "readdirp": "^2.2.1", + "upath": "^1.1.1" + } + }, "cipher-base": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", @@ -773,32 +8435,81 @@ "requires": { "is-descriptor": "^0.1.0" } + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + } } } }, "cliui": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz", - "integrity": "sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE=", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", + "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", "dev": true, "requires": { - "center-align": "^0.1.1", - "right-align": "^0.1.1", - "wordwrap": "0.0.2" - }, - "dependencies": { - "wordwrap": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz", - "integrity": "sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8=", - "dev": true - } + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wrap-ansi": "^2.0.0" } }, "clone": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", - "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4=", + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/clone/-/clone-0.2.0.tgz", + "integrity": "sha1-xhJqkK1Pctv1rNskPMN3JP6T/B8=", + "dev": true + }, + "clone-buffer": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/clone-buffer/-/clone-buffer-1.0.0.tgz", + "integrity": "sha1-4+JbIHrE5wGvch4staFnksrD3Fg=", "dev": true }, "clone-stats": { @@ -807,6 +8518,72 @@ "integrity": "sha1-uI+UqCzzi4eR1YBG6kAprYjKmdE=", "dev": true }, + "cloneable-readable": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/cloneable-readable/-/cloneable-readable-1.1.3.tgz", + "integrity": "sha512-2EF8zTQOxYq70Y4XKtorQupqF0m49MBz2/yf5Bj+MHjvpG3Hy7sImifnqD6UA+TKYxeSV+u6qqQPawN5UvnpKQ==", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "process-nextick-args": "^2.0.0", + "readable-stream": "^2.3.5" + }, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "code-point-at": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", + "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", + "dev": true + }, + "collection-map": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/collection-map/-/collection-map-1.0.0.tgz", + "integrity": "sha1-rqDwb40mx4DCt1SUOFVEsiVa8Yw=", + "dev": true, + "requires": { + "arr-map": "^2.0.2", + "for-own": "^1.0.0", + "make-iterator": "^1.0.0" + } + }, "collection-visit": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", @@ -864,13 +8641,10 @@ } }, "console-browserify": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.1.0.tgz", - "integrity": "sha1-8CQcRXMKn8YyOyBtvzjtx0HQuxA=", - "dev": true, - "requires": { - "date-now": "^0.1.4" - } + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.2.0.tgz", + "integrity": "sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==", + "dev": true }, "constants-browserify": { "version": "0.0.1", @@ -890,6 +8664,16 @@ "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", "dev": true }, + "copy-props": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/copy-props/-/copy-props-2.0.4.tgz", + "integrity": "sha512-7cjuUME+p+S3HZlbllgsn2CDwS+5eCCX16qBgNC4jgSTf49qR1VKy/Zhl400m0IQXl/bPGEVqncgUUMjrr4s8A==", + "dev": true, + "requires": { + "each-props": "^1.3.0", + "is-plain-object": "^2.0.1" + } + }, "core-util-is": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", @@ -897,13 +8681,21 @@ "dev": true }, "create-ecdh": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.3.tgz", - "integrity": "sha512-GbEHQPMOswGpKXM9kCWVrremUcBmjteUaQ01T9rkKCPDXfUHX0IoP9LpHYo2NPFampa4e+/pFDc3jQdxrxQLaw==", + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.4.tgz", + "integrity": "sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A==", "dev": true, "requires": { "bn.js": "^4.1.0", - "elliptic": "^6.0.0" + "elliptic": "^6.5.3" + }, + "dependencies": { + "bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "dev": true + } } }, "create-hash": { @@ -952,11 +8744,15 @@ "randomfill": "^1.0.3" } }, - "date-now": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/date-now/-/date-now-0.1.4.tgz", - "integrity": "sha1-6vQ5/U1ISK105cx9vvIAZyueNFs=", - "dev": true + "d": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/d/-/d-1.0.1.tgz", + "integrity": "sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==", + "dev": true, + "requires": { + "es5-ext": "^0.10.50", + "type": "^1.0.1" + } }, "dateformat": { "version": "2.2.0", @@ -964,12 +8760,6 @@ "integrity": "sha1-QGXiATz5+5Ft39gu+1Bq1MZ2kGI=", "dev": true }, - "deap": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/deap/-/deap-1.0.1.tgz", - "integrity": "sha512-k75KYNZMvwAwes2xIPry/QTffXIchjD8QfABvvfTr80P85jv5ZcKqcoDo+vMe71nNnVnXYe8MA28weyqcf/DKw==", - "dev": true - }, "debug": { "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", @@ -1003,13 +8793,28 @@ "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", "dev": true }, - "defaults": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.3.tgz", - "integrity": "sha1-xlYFHpgX2f8I7YgUd/P+QBnz730=", + "default-compare": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/default-compare/-/default-compare-1.0.0.tgz", + "integrity": "sha512-QWfXlM0EkAbqOCbD/6HjdwT19j7WCkMyiRhWilc4H9/5h/RzTF9gv5LYh1+CmDV5d1rki6KAWLtQale0xt20eQ==", "dev": true, "requires": { - "clone": "^1.0.2" + "kind-of": "^5.0.2" + } + }, + "default-resolution": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/default-resolution/-/default-resolution-2.0.0.tgz", + "integrity": "sha1-vLgrqnKtebQmp2cy8aga1t8m1oQ=", + "dev": true + }, + "define-properties": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", + "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", + "dev": true, + "requires": { + "object-keys": "^1.0.12" } }, "define-property": { @@ -1020,37 +8825,6 @@ "requires": { "is-descriptor": "^1.0.2", "isobject": "^3.0.1" - }, - "dependencies": { - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - } } }, "defined": { @@ -1073,12 +8847,6 @@ "rimraf": "^2.2.8" } }, - "deprecated": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/deprecated/-/deprecated-0.0.1.tgz", - "integrity": "sha1-+cmvVGSvoeepcUWKi97yqpTVuxk=", - "dev": true - }, "deps-sort": { "version": "1.3.9", "resolved": "https://registry.npmjs.org/deps-sort/-/deps-sort-1.3.9.tgz", @@ -1091,6 +8859,12 @@ "through2": "^1.0.0" }, "dependencies": { + "jsonparse": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", + "integrity": "sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA=", + "dev": true + }, "JSONStream": { "version": "1.3.5", "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.5.tgz", @@ -1100,19 +8874,13 @@ "jsonparse": "^1.2.0", "through": ">=2.2.7 <3" } - }, - "jsonparse": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", - "integrity": "sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA=", - "dev": true } } }, "des.js": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.0.tgz", - "integrity": "sha1-wHTS4qpqipoH29YfmhXCzYPsjsw=", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.1.tgz", + "integrity": "sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA==", "dev": true, "requires": { "inherits": "^2.0.1", @@ -1136,9 +8904,9 @@ }, "dependencies": { "acorn": { - "version": "5.7.3", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.3.tgz", - "integrity": "sha512-T/zvzYRfbVojPWahDsE5evJdHb3oJoQfFbsrKM7w5Zcs++Tr257tia3BmMP8XYVjp1S9RZXQMh7gao96BlqZOw==", + "version": "5.7.4", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.4.tgz", + "integrity": "sha512-1D++VG7BhrtvQpNbBzovKNc1FLGGEE/oGe7b9xJm/RFHMBeUaUGpluV9RLjZa47YFdPcDAenEYuq9pQPcMdLJg==", "dev": true }, "defined": { @@ -1158,6 +8926,14 @@ "bn.js": "^4.1.0", "miller-rabin": "^4.0.0", "randombytes": "^2.0.0" + }, + "dependencies": { + "bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "dev": true + } } }, "difflet": { @@ -1177,58 +8953,168 @@ "integrity": "sha1-hnqksJP6oF8d4IwG9NeyH9+GmLw=", "dev": true }, - "duplexer2": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.0.2.tgz", - "integrity": "sha1-xhTc9n4vsUmVqRcR5aYX6KYKMds=", + "duplexer2": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.0.2.tgz", + "integrity": "sha1-xhTc9n4vsUmVqRcR5aYX6KYKMds=", + "dev": true, + "requires": { + "readable-stream": "~1.1.9" + } + }, + "duplexify": { + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz", + "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==", + "dev": true, + "requires": { + "end-of-stream": "^1.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.0.0", + "stream-shift": "^1.0.0" + }, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "each-async": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/each-async/-/each-async-1.1.1.tgz", + "integrity": "sha1-3uUim98KtrogEqOV4bhpq/iBNHM=", + "dev": true, + "requires": { + "onetime": "^1.0.0", + "set-immediate-shim": "^1.0.0" + } + }, + "each-props": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/each-props/-/each-props-1.3.2.tgz", + "integrity": "sha512-vV0Hem3zAGkJAyU7JSjixeU66rwdynTAa1vofCrSA5fEln+m67Az9CcnkVD776/fsN/UjIWmBDoNRS6t6G9RfA==", + "dev": true, + "requires": { + "is-plain-object": "^2.0.1", + "object.defaults": "^1.1.0" + } + }, + "elliptic": { + "version": "6.5.4", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz", + "integrity": "sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==", + "dev": true, + "requires": { + "bn.js": "^4.11.9", + "brorand": "^1.1.0", + "hash.js": "^1.0.0", + "hmac-drbg": "^1.0.1", + "inherits": "^2.0.4", + "minimalistic-assert": "^1.0.1", + "minimalistic-crypto-utils": "^1.0.1" + }, + "dependencies": { + "bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "dev": true + } + } + }, + "end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "dev": true, + "requires": { + "once": "^1.4.0" + } + }, + "error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", "dev": true, "requires": { - "readable-stream": "~1.1.9" + "is-arrayish": "^0.2.1" } }, - "each-async": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/each-async/-/each-async-1.1.1.tgz", - "integrity": "sha1-3uUim98KtrogEqOV4bhpq/iBNHM=", + "es5-ext": { + "version": "0.10.53", + "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.53.tgz", + "integrity": "sha512-Xs2Stw6NiNHWypzRTY1MtaG/uJlwCk8kH81920ma8mvN8Xq1gsfhZvpkImLQArw8AHnv8MT2I45J3c0R8slE+Q==", "dev": true, "requires": { - "onetime": "^1.0.0", - "set-immediate-shim": "^1.0.0" + "es6-iterator": "~2.0.3", + "es6-symbol": "~3.1.3", + "next-tick": "~1.0.0" } }, - "elliptic": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.1.tgz", - "integrity": "sha512-xvJINNLbTeWQjrl6X+7eQCrIy/YPv5XCpKW6kB5mKvtnGILoLDcySuwomfdzt0BMdLNVnuRNTuzKNHj0bva1Cg==", + "es6-iterator": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", + "integrity": "sha1-p96IkUGgWpSwhUQDstCg+/qY87c=", "dev": true, "requires": { - "bn.js": "^4.4.0", - "brorand": "^1.0.1", - "hash.js": "^1.0.0", - "hmac-drbg": "^1.0.0", - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0", - "minimalistic-crypto-utils": "^1.0.0" + "d": "1", + "es5-ext": "^0.10.35", + "es6-symbol": "^3.1.1" } }, - "end-of-stream": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-0.1.5.tgz", - "integrity": "sha1-jhdyBsPICDfYVjLouTWd/osvbq8=", + "es6-symbol": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.3.tgz", + "integrity": "sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==", "dev": true, "requires": { - "once": "~1.3.0" - }, - "dependencies": { - "once": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/once/-/once-1.3.3.tgz", - "integrity": "sha1-suJhVXzkwxTsgwTz+oJmPkKXyiA=", - "dev": true, - "requires": { - "wrappy": "1" - } - } + "d": "^1.0.1", + "ext": "^1.1.2" + } + }, + "es6-weak-map": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es6-weak-map/-/es6-weak-map-2.0.3.tgz", + "integrity": "sha512-p5um32HOTO1kP+w7PRnB+5lQ43Z6muuMuIMffvDN8ZB4GcnjLBV6zGStpbASIMk4DCAvEaamhe2zhyCb/QXXsA==", + "dev": true, + "requires": { + "d": "1", + "es5-ext": "^0.10.46", + "es6-iterator": "^2.0.3", + "es6-symbol": "^3.1.1" } }, "escape-string-regexp": { @@ -1277,13 +9163,55 @@ "is-descriptor": "^0.1.0" } }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", "dev": true, "requires": { - "is-extendable": "^0.1.0" + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" } } } @@ -1297,6 +9225,23 @@ "homedir-polyfill": "^1.0.1" } }, + "ext": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/ext/-/ext-1.4.0.tgz", + "integrity": "sha512-Key5NIsUxdqKg3vIsdw9dSuXpPCQ297y6wBjL30edxwPgt2E44WcWBZey/ZvUc6sERLTxKdyCu4gZFmUbk1Q7A==", + "dev": true, + "requires": { + "type": "^2.0.0" + }, + "dependencies": { + "type": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/type/-/type-2.3.0.tgz", + "integrity": "sha512-rgPIqOdfK/4J9FhiVrZ3cveAjRRo5rsQBAIhnylX874y1DX/kEKSVdLsnuHB6l1KTjHyU01VjiMBHgU2adejyg==", + "dev": true + } + } + }, "extend": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", @@ -1304,24 +9249,12 @@ "dev": true }, "extend-shallow": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", - "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "dev": true, "requires": { - "assign-symbols": "^1.0.0", - "is-extendable": "^1.0.1" - }, - "dependencies": { - "is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, - "requires": { - "is-plain-object": "^2.0.4" - } - } + "is-extendable": "^0.1.0" } }, "extglob": { @@ -1348,44 +9281,6 @@ "requires": { "is-descriptor": "^1.0.0" } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } } } }, @@ -1401,6 +9296,19 @@ "time-stamp": "^1.0.0" } }, + "fast-levenshtein": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-1.1.4.tgz", + "integrity": "sha1-5qdUzI8V5YmHqpy9J69m/W9OWvk=", + "dev": true + }, + "file-uri-to-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", + "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==", + "dev": true, + "optional": true + }, "fill-range": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", @@ -1411,99 +9319,223 @@ "is-number": "^3.0.0", "repeat-string": "^1.6.1", "to-regex-range": "^2.1.0" + } + }, + "find-up": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", + "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", + "dev": true, + "requires": { + "path-exists": "^2.0.0", + "pinkie-promise": "^2.0.0" + } + }, + "findup-sync": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-3.0.0.tgz", + "integrity": "sha512-YbffarhcicEhOrm4CtrwdKBdCuz576RLdhJDsIfvNtxUuhdRet1qZcsMjqbePtAseKdAnDyM/IyXbu7PRPRLYg==", + "dev": true, + "requires": { + "detect-file": "^1.0.0", + "is-glob": "^4.0.0", + "micromatch": "^3.0.4", + "resolve-dir": "^1.0.1" + } + }, + "fined": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/fined/-/fined-1.2.0.tgz", + "integrity": "sha512-ZYDqPLGxDkDhDZBjZBb+oD1+j0rA4E0pXY50eplAAOPg2N/gUBSSk5IM1/QhPfyVo19lJ+CvXpqfvk+b2p/8Ng==", + "dev": true, + "requires": { + "expand-tilde": "^2.0.2", + "is-plain-object": "^2.0.3", + "object.defaults": "^1.1.0", + "object.pick": "^1.2.0", + "parse-filepath": "^1.0.1" + } + }, + "flagged-respawn": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/flagged-respawn/-/flagged-respawn-1.0.1.tgz", + "integrity": "sha512-lNaHNVymajmk0OJMBn8fVUAU1BtDeKIqKoVhk4xAALB57aALg6b4W0MfJ/cUE0g9YBXy5XhSlPIpYIJ7HaY/3Q==", + "dev": true + }, + "flush-write-stream": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.1.1.tgz", + "integrity": "sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "readable-stream": "^2.3.6" }, "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "for-in": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", + "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", + "dev": true + }, + "for-own": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/for-own/-/for-own-1.0.0.tgz", + "integrity": "sha1-xjMy9BXO3EsE2/5wz4NklMU8tEs=", + "dev": true, + "requires": { + "for-in": "^1.0.1" + } + }, + "fragment-cache": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", + "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", + "dev": true, + "requires": { + "map-cache": "^0.2.2" + } + }, + "fs-mkdirp-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs-mkdirp-stream/-/fs-mkdirp-stream-1.0.0.tgz", + "integrity": "sha1-C3gV/DIBxqaeFNuYzgmMFpNSWes=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.11", + "through2": "^2.0.3" + }, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "through2": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", "dev": true, "requires": { - "is-extendable": "^0.1.0" + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" } + }, + "xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "dev": true } } }, - "find-index": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/find-index/-/find-index-0.1.1.tgz", - "integrity": "sha1-Z101iyyjiS15Whq0cjL4tuLg3eQ=", - "dev": true - }, - "findup-sync": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-2.0.0.tgz", - "integrity": "sha1-kyaxSIwi0aYIhlCoaQGy2akKLLw=", - "dev": true, - "requires": { - "detect-file": "^1.0.0", - "is-glob": "^3.1.0", - "micromatch": "^3.0.4", - "resolve-dir": "^1.0.1" - } - }, - "fined": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/fined/-/fined-1.2.0.tgz", - "integrity": "sha512-ZYDqPLGxDkDhDZBjZBb+oD1+j0rA4E0pXY50eplAAOPg2N/gUBSSk5IM1/QhPfyVo19lJ+CvXpqfvk+b2p/8Ng==", - "dev": true, - "requires": { - "expand-tilde": "^2.0.2", - "is-plain-object": "^2.0.3", - "object.defaults": "^1.1.0", - "object.pick": "^1.2.0", - "parse-filepath": "^1.0.1" - } - }, - "first-chunk-stream": { + "fs.realpath": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/first-chunk-stream/-/first-chunk-stream-1.0.0.tgz", - "integrity": "sha1-Wb+1DNkF9g18OUzT2ayqtOatk04=", - "dev": true - }, - "flagged-respawn": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/flagged-respawn/-/flagged-respawn-1.0.1.tgz", - "integrity": "sha512-lNaHNVymajmk0OJMBn8fVUAU1BtDeKIqKoVhk4xAALB57aALg6b4W0MfJ/cUE0g9YBXy5XhSlPIpYIJ7HaY/3Q==", - "dev": true - }, - "for-in": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", - "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", "dev": true }, - "for-own": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/for-own/-/for-own-1.0.0.tgz", - "integrity": "sha1-xjMy9BXO3EsE2/5wz4NklMU8tEs=", + "fsevents": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz", + "integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==", "dev": true, + "optional": true, "requires": { - "for-in": "^1.0.1" + "bindings": "^1.5.0", + "nan": "^2.12.1" } }, - "fragment-cache": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", - "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", - "dev": true, - "requires": { - "map-cache": "^0.2.2" - } + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true }, - "fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "get-caller-file": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz", + "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==", "dev": true }, - "gaze": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/gaze/-/gaze-0.5.2.tgz", - "integrity": "sha1-QLcJU30k0dRXZ9takIaJ3+aaxE8=", + "get-intrinsic": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", + "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", "dev": true, "requires": { - "globule": "~0.1.0" + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1" } }, "get-value": { @@ -1529,66 +9561,119 @@ "once": "^1.3.0" } }, + "glob-parent": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", + "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", + "dev": true, + "requires": { + "is-glob": "^3.1.0", + "path-dirname": "^1.0.0" + }, + "dependencies": { + "is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "dev": true, + "requires": { + "is-extglob": "^2.1.0" + } + } + } + }, "glob-stream": { - "version": "3.1.18", - "resolved": "https://registry.npmjs.org/glob-stream/-/glob-stream-3.1.18.tgz", - "integrity": "sha1-kXCl8St5Awb9/lmPMT+PeVT9FDs=", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/glob-stream/-/glob-stream-6.1.0.tgz", + "integrity": "sha1-cEXJlBOz65SIjYOrRtC0BMx73eQ=", "dev": true, "requires": { - "glob": "^4.3.1", - "glob2base": "^0.0.12", - "minimatch": "^2.0.1", - "ordered-read-streams": "^0.1.0", - "through2": "^0.6.1", - "unique-stream": "^1.0.0" + "extend": "^3.0.0", + "glob": "^7.1.1", + "glob-parent": "^3.1.0", + "is-negated-glob": "^1.0.0", + "ordered-read-streams": "^1.0.0", + "pumpify": "^1.3.5", + "readable-stream": "^2.1.5", + "remove-trailing-separator": "^1.0.1", + "to-absolute-glob": "^2.0.0", + "unique-stream": "^2.0.2" }, "dependencies": { - "readable-stream": { - "version": "1.0.34", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", - "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", + "glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", "dev": true, "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" } }, - "through2": { - "version": "0.6.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz", - "integrity": "sha1-QaucZ7KdVyCQcUEOHXp6lozTrUg=", + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", "dev": true, "requires": { - "readable-stream": ">=1.0.33-1 <1.1.0-0", - "xtend": ">=4.0.0 <4.1.0-0" + "brace-expansion": "^1.1.7" } }, - "xtend": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", - "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", "dev": true + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } } } }, "glob-watcher": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/glob-watcher/-/glob-watcher-0.0.6.tgz", - "integrity": "sha1-uVtKjfdLOcgymLDAXJeLTZo7cQs=", - "dev": true, - "requires": { - "gaze": "^0.5.1" - } - }, - "glob2base": { - "version": "0.0.12", - "resolved": "https://registry.npmjs.org/glob2base/-/glob2base-0.0.12.tgz", - "integrity": "sha1-nUGbPijxLoOjYhZKJ3BVkiycDVY=", + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/glob-watcher/-/glob-watcher-5.0.5.tgz", + "integrity": "sha512-zOZgGGEHPklZNjZQaZ9f41i7F2YwE+tS5ZHrDhbBCk3stwahn5vQxnFmBJZHoYdusR6R1bLSXeGUy/BhctwKzw==", "dev": true, "requires": { - "find-index": "^0.1.1" + "anymatch": "^2.0.0", + "async-done": "^1.2.0", + "chokidar": "^2.0.0", + "is-negated-glob": "^1.0.0", + "just-debounce": "^1.0.0", + "normalize-path": "^3.0.0", + "object.defaults": "^1.1.0" } }, "global-modules": { @@ -1627,12 +9712,6 @@ "object-assign": "^3.0.0" }, "dependencies": { - "async": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", - "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=", - "dev": true - }, "glob": { "version": "5.0.15", "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz", @@ -1648,52 +9727,6 @@ } } }, - "globule": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/globule/-/globule-0.1.0.tgz", - "integrity": "sha1-2cjt3h2nnRJaFRt5UzuXhnY0auU=", - "dev": true, - "requires": { - "glob": "~3.1.21", - "lodash": "~1.0.1", - "minimatch": "~0.2.11" - }, - "dependencies": { - "glob": { - "version": "3.1.21", - "resolved": "https://registry.npmjs.org/glob/-/glob-3.1.21.tgz", - "integrity": "sha1-0p4KBV3qUTj00H7UDomC6DwgZs0=", - "dev": true, - "requires": { - "graceful-fs": "~1.2.0", - "inherits": "1", - "minimatch": "~0.2.11" - } - }, - "graceful-fs": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-1.2.3.tgz", - "integrity": "sha1-FaSAaldUfLLS2/J/QuiajDRRs2Q=", - "dev": true - }, - "inherits": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-1.0.2.tgz", - "integrity": "sha1-ykMJ2t7mtUzAuNJH6NfHoJdb3Js=", - "dev": true - }, - "minimatch": { - "version": "0.2.14", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-0.2.14.tgz", - "integrity": "sha1-x054BXT2PG+aCQ6Q775u9TpqdWo=", - "dev": true, - "requires": { - "lru-cache": "2", - "sigmund": "~1.0.0" - } - } - } - }, "glogg": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/glogg/-/glogg-1.0.2.tgz", @@ -1704,39 +9737,103 @@ } }, "graceful-fs": { - "version": "3.0.12", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-3.0.12.tgz", - "integrity": "sha512-J55gaCS4iTTJfTXIxSVw3EMQckcqkpdRv3IR7gu6sq0+tbC363Zx6KH/SEwXASK9JRbhyZmVjJEVJIOxYsB3Qg==", + "version": "4.2.6", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.6.tgz", + "integrity": "sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ==", + "dev": true + }, + "gulp": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/gulp/-/gulp-4.0.2.tgz", + "integrity": "sha512-dvEs27SCZt2ibF29xYgmnwwCYZxdxhQ/+LFWlbAW8y7jt68L/65402Lz3+CKy0Ov4rOs+NERmDq7YlZaDqUIfA==", "dev": true, "requires": { - "natives": "^1.1.3" + "glob-watcher": "^5.0.3", + "gulp-cli": "^2.2.0", + "undertaker": "^1.2.1", + "vinyl-fs": "^3.0.0" } }, - "gulp": { - "version": "3.9.1", - "resolved": "https://registry.npmjs.org/gulp/-/gulp-3.9.1.tgz", - "integrity": "sha1-VxzkWSjdQK9lFPxAEYZgFsE4RbQ=", + "gulp-cli": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/gulp-cli/-/gulp-cli-2.3.0.tgz", + "integrity": "sha512-zzGBl5fHo0EKSXsHzjspp3y5CONegCm8ErO5Qh0UzFzk2y4tMvzLWhoDokADbarfZRL2pGpRp7yt6gfJX4ph7A==", "dev": true, "requires": { + "ansi-colors": "^1.0.1", "archy": "^1.0.0", - "chalk": "^1.0.0", - "deprecated": "^0.0.1", - "gulp-util": "^3.0.0", - "interpret": "^1.0.0", - "liftoff": "^2.1.0", - "minimist": "^1.1.0", - "orchestrator": "^0.3.0", + "array-sort": "^1.0.0", + "color-support": "^1.1.3", + "concat-stream": "^1.6.0", + "copy-props": "^2.0.1", + "fancy-log": "^1.3.2", + "gulplog": "^1.0.0", + "interpret": "^1.4.0", + "isobject": "^3.0.1", + "liftoff": "^3.1.0", + "matchdep": "^2.0.0", + "mute-stdout": "^1.0.0", "pretty-hrtime": "^1.0.0", - "semver": "^4.1.0", - "tildify": "^1.0.0", - "v8flags": "^2.0.2", - "vinyl-fs": "^0.3.0" + "replace-homedir": "^1.0.0", + "semver-greatest-satisfied-range": "^1.1.0", + "v8flags": "^3.2.0", + "yargs": "^7.1.0" + }, + "dependencies": { + "concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "dev": true, + "requires": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + } + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + } } }, "gulp-rename": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/gulp-rename/-/gulp-rename-1.4.0.tgz", - "integrity": "sha512-swzbIGb/arEoFK89tPY58vg3Ok1bw+d35PfUNwWqdo7KM4jkmuGA78JiDNqR+JeZFaeeHnRg9N7aihX3YPmsyg==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/gulp-rename/-/gulp-rename-2.0.0.tgz", + "integrity": "sha512-97Vba4KBzbYmR5VBs9mWmK+HwIf5mj+/zioxfZhOKeXtx5ZjBk57KFlePf5nxq9QsTtFl0ejnHE3zTC9MHXqyQ==", "dev": true }, "gulp-run": { @@ -1749,80 +9846,55 @@ "lodash.defaults": "^4.0.1", "lodash.template": "^4.0.2", "vinyl": "^0.4.6" - }, - "dependencies": { - "clone": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/clone/-/clone-0.2.0.tgz", - "integrity": "sha1-xhJqkK1Pctv1rNskPMN3JP6T/B8=", - "dev": true - }, - "lodash.template": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-4.5.0.tgz", - "integrity": "sha512-84vYFxIkmidUiFxidA/KjjH9pAycqW+h980j7Fuz5qxRtO9pgB7MDFTdys1N7A5mcucRiDyEq4fusljItR1T/A==", - "dev": true, - "requires": { - "lodash._reinterpolate": "^3.0.0", - "lodash.templatesettings": "^4.0.0" - } - }, - "lodash.templatesettings": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-4.2.0.tgz", - "integrity": "sha512-stgLz+i3Aa9mZgnjr/O+v9ruKZsPsndy7qPZOchbqk2cnTU1ZaldKK+v7m54WoKIyxiuMZTKT2H81F8BeAc3ZQ==", - "dev": true, - "requires": { - "lodash._reinterpolate": "^3.0.0" - } - }, - "vinyl": { - "version": "0.4.6", - "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-0.4.6.tgz", - "integrity": "sha1-LzVsh6VQolVGHza76ypbqL94SEc=", - "dev": true, - "requires": { - "clone": "^0.2.0", - "clone-stats": "^0.0.1" - } - } } }, "gulp-uglify": { - "version": "1.5.4", - "resolved": "https://registry.npmjs.org/gulp-uglify/-/gulp-uglify-1.5.4.tgz", - "integrity": "sha1-UkeI2HZm0J+dDCH7IXf5ADmmWMk=", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/gulp-uglify/-/gulp-uglify-3.0.2.tgz", + "integrity": "sha512-gk1dhB74AkV2kzqPMQBLA3jPoIAPd/nlNzP2XMDSG8XZrqnlCiDGAqC+rZOumzFvB5zOphlFh6yr3lgcAb/OOg==", "dev": true, "requires": { - "deap": "^1.0.0", - "fancy-log": "^1.0.0", - "gulp-util": "^3.0.0", - "isobject": "^2.0.0", + "array-each": "^1.0.1", + "extend-shallow": "^3.0.2", + "gulplog": "^1.0.0", + "has-gulplog": "^0.1.0", + "isobject": "^3.0.1", + "make-error-cause": "^1.1.1", + "safe-buffer": "^5.1.2", "through2": "^2.0.0", - "uglify-js": "2.6.4", - "uglify-save-license": "^0.4.1", + "uglify-js": "^3.0.5", "vinyl-sourcemaps-apply": "^0.2.0" }, "dependencies": { + "extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "dev": true, + "requires": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + } + }, + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4" + } + }, "isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", "dev": true }, - "isobject": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", - "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", - "dev": true, - "requires": { - "isarray": "1.0.0" - } - }, "readable-stream": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", "dev": true, "requires": { "core-util-is": "~1.0.0", @@ -1840,12 +9912,6 @@ "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", "dev": true }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - }, "string_decoder": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", @@ -1865,35 +9931,11 @@ "xtend": "~4.0.1" } }, - "uglify-js": { - "version": "2.6.4", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.6.4.tgz", - "integrity": "sha1-ZeovswWck5RpLxX+2HwrNsFrmt8=", - "dev": true, - "requires": { - "async": "~0.2.6", - "source-map": "~0.5.1", - "uglify-to-browserify": "~1.0.0", - "yargs": "~3.10.0" - } - }, "xtend": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", "dev": true - }, - "yargs": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz", - "integrity": "sha1-9+572FfdfB0tOMDnTvvWgdFDH9E=", - "dev": true, - "requires": { - "camelcase": "^1.0.2", - "cliui": "^2.1.0", - "decamelize": "^1.0.0", - "window-size": "0.1.0" - } } } }, @@ -1923,16 +9965,49 @@ "vinyl": "^0.5.0" }, "dependencies": { + "clone": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", + "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4=", + "dev": true + }, "isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", "dev": true }, + "lodash.template": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-3.6.2.tgz", + "integrity": "sha1-+M3sxhaaJVvpCYrosMU9N4kx0U8=", + "dev": true, + "requires": { + "lodash._basecopy": "^3.0.0", + "lodash._basetostring": "^3.0.0", + "lodash._basevalues": "^3.0.0", + "lodash._isiterateecall": "^3.0.0", + "lodash._reinterpolate": "^3.0.0", + "lodash.escape": "^3.0.0", + "lodash.keys": "^3.0.0", + "lodash.restparam": "^3.0.0", + "lodash.templatesettings": "^3.0.0" + } + }, + "lodash.templatesettings": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-3.1.1.tgz", + "integrity": "sha1-+zB4RHU7Zrnxr6VOJix0UwfbqOU=", + "dev": true, + "requires": { + "lodash._reinterpolate": "^3.0.0", + "lodash.escape": "^3.0.0" + } + }, "readable-stream": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", "dev": true, "requires": { "core-util-is": "~1.0.0", @@ -1969,6 +10044,17 @@ "xtend": "~4.0.1" } }, + "vinyl": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-0.5.3.tgz", + "integrity": "sha1-sEVbOPxeDPMNQyUTLkYZcMIJHN4=", + "dev": true, + "requires": { + "clone": "^1.0.0", + "clone-stats": "^0.0.1", + "replace-ext": "0.0.1" + } + }, "xtend": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", @@ -1986,6 +10072,15 @@ "glogg": "^1.0.0" } }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, + "requires": { + "function-bind": "^1.1.1" + } + }, "has-ansi": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", @@ -2004,6 +10099,12 @@ "sparkles": "^1.0.0" } }, + "has-symbols": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz", + "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==", + "dev": true + }, "has-value": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", @@ -2037,13 +10138,36 @@ } }, "hash-base": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.0.4.tgz", - "integrity": "sha1-X8hoaEfs1zSZQDMZprCj8/auSRg=", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.1.0.tgz", + "integrity": "sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==", "dev": true, "requires": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" + "inherits": "^2.0.4", + "readable-stream": "^3.6.0", + "safe-buffer": "^5.2.0" + }, + "dependencies": { + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + }, + "string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dev": true, + "requires": { + "safe-buffer": "~5.2.0" + } + } } }, "hash.js": { @@ -2076,6 +10200,12 @@ "parse-passwd": "^1.0.0" } }, + "hosted-git-info": { + "version": "2.8.8", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.8.tgz", + "integrity": "sha512-f/wzC2QaWBs7t9IYqB4T3sR1xviIViXJRJTWBlx2Gf3g0Xi5vI7Yy4koXQ1c9OYDGHN9sBy1DQ2AB8fqZBWhUg==", + "dev": true + }, "http-browserify": { "version": "1.7.0", "resolved": "https://registry.npmjs.org/http-browserify/-/http-browserify-1.7.0.tgz", @@ -2093,9 +10223,9 @@ "dev": true }, "ieee754": { - "version": "1.1.13", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.13.tgz", - "integrity": "sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", "dev": true }, "indexof": { @@ -2121,9 +10251,9 @@ "dev": true }, "ini": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", - "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==", + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", "dev": true }, "inline-source-map": { @@ -2152,26 +10282,16 @@ "integrity": "sha1-IGOOKaMPntHKLjqCX7wsulJG3fw=", "dev": true, "requires": { - "JSONStream": "^1.0.3", "combine-source-map": "~0.6.1", "concat-stream": "~1.4.1", "is-buffer": "^1.1.0", + "JSONStream": "^1.0.3", "lexical-scope": "^1.2.0", "process": "~0.11.0", "through2": "^1.0.0", "xtend": "^4.0.0" }, "dependencies": { - "JSONStream": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.5.tgz", - "integrity": "sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==", - "dev": true, - "requires": { - "jsonparse": "^1.2.0", - "through": ">=2.2.7 <3" - } - }, "combine-source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/combine-source-map/-/combine-source-map-0.6.1.tgz", @@ -2205,6 +10325,16 @@ "integrity": "sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA=", "dev": true }, + "JSONStream": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.5.tgz", + "integrity": "sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==", + "dev": true, + "requires": { + "jsonparse": "^1.2.0", + "through": ">=2.2.7 <3" + } + }, "process": { "version": "0.11.10", "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", @@ -2229,9 +10359,15 @@ } }, "interpret": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.2.0.tgz", - "integrity": "sha512-mT34yGKMNceBQUoVn7iCDKDntA7SC6gycMAWzGx1z/CMCTV7b2AAtXlo3nRyHZ1FelRkQbQjprHSYGwzLtkVbw==", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", + "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==", + "dev": true + }, + "invert-kv": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", + "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=", "dev": true }, "is-absolute": { @@ -2245,66 +10381,84 @@ } }, "is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", "dev": true, "requires": { - "kind-of": "^3.0.2" + "kind-of": "^6.0.0" }, "dependencies": { "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true } } }, + "is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", + "dev": true + }, + "is-binary-path": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", + "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", + "dev": true, + "requires": { + "binary-extensions": "^1.0.0" + } + }, "is-buffer": { "version": "1.1.6", "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", "dev": true }, + "is-core-module": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.2.0.tgz", + "integrity": "sha512-XRAfAdyyY5F5cOXn7hYQDqh2Xmii+DEfIcQGxK/uNwMHhIkPWO0g8msXcbzLe+MpGoR951MlqM/2iIlU4vKDdQ==", + "dev": true, + "requires": { + "has": "^1.0.3" + } + }, "is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", "dev": true, "requires": { - "kind-of": "^3.0.2" + "kind-of": "^6.0.0" }, "dependencies": { "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true } } }, "is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", "dev": true, "requires": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" }, "dependencies": { "kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", "dev": true } } @@ -2321,15 +10475,30 @@ "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", "dev": true }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "dev": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, "is-glob": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", - "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", + "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", "dev": true, "requires": { - "is-extglob": "^2.1.0" + "is-extglob": "^2.1.1" } }, + "is-negated-glob": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-negated-glob/-/is-negated-glob-1.0.0.tgz", + "integrity": "sha1-aRC8pdqMleeEtXUbl2z1oQ/uNtI=", + "dev": true + }, "is-number": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", @@ -2407,6 +10576,12 @@ "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=", "dev": true }, + "is-valid-glob": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-valid-glob/-/is-valid-glob-1.0.0.tgz", + "integrity": "sha1-Kb8+/3Ab4tTTFdusw5vDn+j2Aao=", + "dev": true + }, "is-windows": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", @@ -2431,50 +10606,141 @@ "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", "dev": true }, - "json-stable-stringify": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-0.0.1.tgz", - "integrity": "sha1-YRwj6BTbN1Un34URk9tZ3Sryf0U=", + "json-stable-stringify": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-0.0.1.tgz", + "integrity": "sha1-YRwj6BTbN1Un34URk9tZ3Sryf0U=", + "dev": true, + "requires": { + "jsonify": "~0.0.0" + } + }, + "json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", + "dev": true + }, + "jsonify": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz", + "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=", + "dev": true + }, + "jsonparse": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-0.0.5.tgz", + "integrity": "sha1-MwVCrT8KZUZlt3jz6y2an6UHrGQ=", + "dev": true + }, + "JSONStream": { + "version": "0.8.4", + "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-0.8.4.tgz", + "integrity": "sha1-kWV9/m/4V0gwZhMrRhi2Lo9Ih70=", + "dev": true, + "requires": { + "jsonparse": "0.0.5", + "through": ">=2.2.7 <3" + } + }, + "just-debounce": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/just-debounce/-/just-debounce-1.1.0.tgz", + "integrity": "sha512-qpcRocdkUmf+UTNBYx5w6dexX5J31AKK1OmPwH630a83DdVVUIngk55RSAiIGpQyoH0dlr872VHfPjnQnK1qDQ==", + "dev": true + }, + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + }, + "labeled-stream-splicer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/labeled-stream-splicer/-/labeled-stream-splicer-1.0.2.tgz", + "integrity": "sha1-RhUzFTd4SYHo/SZOHzpDTE4N3WU=", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "isarray": "~0.0.1", + "stream-splicer": "^1.1.0" + } + }, + "last-run": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/last-run/-/last-run-1.1.1.tgz", + "integrity": "sha1-RblpQsF7HHnHchmCWbqUO+v4yls=", + "dev": true, + "requires": { + "default-resolution": "^2.0.0", + "es6-weak-map": "^2.0.1" + } + }, + "lazystream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.0.tgz", + "integrity": "sha1-9plf4PggOS9hOWvolGJAe7dxaOQ=", + "dev": true, + "requires": { + "readable-stream": "^2.0.5" + }, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "lcid": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", + "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", "dev": true, "requires": { - "jsonify": "~0.0.0" + "invert-kv": "^1.0.0" } }, - "jsonify": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz", - "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=", - "dev": true - }, - "jsonparse": { - "version": "0.0.5", - "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-0.0.5.tgz", - "integrity": "sha1-MwVCrT8KZUZlt3jz6y2an6UHrGQ=", - "dev": true - }, - "kind-of": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", - "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", - "dev": true - }, - "labeled-stream-splicer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/labeled-stream-splicer/-/labeled-stream-splicer-1.0.2.tgz", - "integrity": "sha1-RhUzFTd4SYHo/SZOHzpDTE4N3WU=", + "lead": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/lead/-/lead-1.0.0.tgz", + "integrity": "sha1-bxT5mje+Op3XhPVJVpDlkDRm7kI=", "dev": true, "requires": { - "inherits": "^2.0.1", - "isarray": "~0.0.1", - "stream-splicer": "^1.1.0" + "flush-write-stream": "^1.0.2" } }, - "lazy-cache": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz", - "integrity": "sha1-odePw6UEdMuAhF07O24dpJpEbo4=", - "dev": true - }, "lexical-scope": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/lexical-scope/-/lexical-scope-1.2.0.tgz", @@ -2485,13 +10751,13 @@ } }, "liftoff": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/liftoff/-/liftoff-2.5.0.tgz", - "integrity": "sha1-IAkpG7Mc6oYbvxCnwVooyvdcMew=", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/liftoff/-/liftoff-3.1.0.tgz", + "integrity": "sha512-DlIPlJUkCV0Ips2zf2pJP0unEoT1kwYhiiPUGF3s/jtxTCjziNLoiVVh+jqWOWeFi6mmwQ5fNxvAUyPad4Dfog==", "dev": true, "requires": { "extend": "^3.0.0", - "findup-sync": "^2.0.0", + "findup-sync": "^3.0.0", "fined": "^1.0.1", "flagged-respawn": "^1.0.0", "is-plain-object": "^2.0.4", @@ -2501,21 +10767,29 @@ }, "dependencies": { "resolve": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.12.0.tgz", - "integrity": "sha512-B/dOmuoAik5bKcD6s6nXDCjzUKnaDvdkRyAk6rsmsKLipWj4797iothd7jmmUhWTfinVMU+wc56rYKsit2Qy4w==", + "version": "1.20.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz", + "integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==", "dev": true, "requires": { + "is-core-module": "^2.2.0", "path-parse": "^1.0.6" } } } }, - "lodash": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-1.0.2.tgz", - "integrity": "sha1-j1dWDIO1n8JwvT1WG2kAQ0MOJVE=", - "dev": true + "load-json-file": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", + "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "parse-json": "^2.2.0", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0", + "strip-bom": "^2.0.0" + } }, "lodash._basecopy": { "version": "3.0.1", @@ -2622,44 +10896,45 @@ "dev": true }, "lodash.template": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-3.6.2.tgz", - "integrity": "sha1-+M3sxhaaJVvpCYrosMU9N4kx0U8=", + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-4.5.0.tgz", + "integrity": "sha512-84vYFxIkmidUiFxidA/KjjH9pAycqW+h980j7Fuz5qxRtO9pgB7MDFTdys1N7A5mcucRiDyEq4fusljItR1T/A==", "dev": true, "requires": { - "lodash._basecopy": "^3.0.0", - "lodash._basetostring": "^3.0.0", - "lodash._basevalues": "^3.0.0", - "lodash._isiterateecall": "^3.0.0", "lodash._reinterpolate": "^3.0.0", - "lodash.escape": "^3.0.0", - "lodash.keys": "^3.0.0", - "lodash.restparam": "^3.0.0", - "lodash.templatesettings": "^3.0.0" + "lodash.templatesettings": "^4.0.0" } }, "lodash.templatesettings": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-3.1.1.tgz", - "integrity": "sha1-+zB4RHU7Zrnxr6VOJix0UwfbqOU=", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-4.2.0.tgz", + "integrity": "sha512-stgLz+i3Aa9mZgnjr/O+v9ruKZsPsndy7qPZOchbqk2cnTU1ZaldKK+v7m54WoKIyxiuMZTKT2H81F8BeAc3ZQ==", "dev": true, "requires": { - "lodash._reinterpolate": "^3.0.0", - "lodash.escape": "^3.0.0" + "lodash._reinterpolate": "^3.0.0" } }, - "longest": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz", - "integrity": "sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc=", - "dev": true - }, "lru-cache": { "version": "2.7.3", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.7.3.tgz", "integrity": "sha1-bUUk6LlV+V1PW1iFHOId1y+06VI=", "dev": true }, + "make-error": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", + "dev": true + }, + "make-error-cause": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/make-error-cause/-/make-error-cause-1.2.2.tgz", + "integrity": "sha1-3wOI/NCzeBbf8KX7gQiTl3fcvJ0=", + "dev": true, + "requires": { + "make-error": "^1.2.0" + } + }, "make-iterator": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/make-iterator/-/make-iterator-1.0.1.tgz", @@ -2667,6 +10942,14 @@ "dev": true, "requires": { "kind-of": "^6.0.2" + }, + "dependencies": { + "kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true + } } }, "map-cache": { @@ -2684,6 +10967,51 @@ "object-visit": "^1.0.0" } }, + "matchdep": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/matchdep/-/matchdep-2.0.0.tgz", + "integrity": "sha1-xvNINKDY28OzfCfui7yyfHd1WC4=", + "dev": true, + "requires": { + "findup-sync": "^2.0.0", + "micromatch": "^3.0.4", + "resolve": "^1.4.0", + "stack-trace": "0.0.10" + }, + "dependencies": { + "findup-sync": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-2.0.0.tgz", + "integrity": "sha1-kyaxSIwi0aYIhlCoaQGy2akKLLw=", + "dev": true, + "requires": { + "detect-file": "^1.0.0", + "is-glob": "^3.1.0", + "micromatch": "^3.0.4", + "resolve-dir": "^1.0.1" + } + }, + "is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "dev": true, + "requires": { + "is-extglob": "^2.1.0" + } + }, + "resolve": { + "version": "1.20.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz", + "integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==", + "dev": true, + "requires": { + "is-core-module": "^2.2.0", + "path-parse": "^1.0.6" + } + } + } + }, "md5.js": { "version": "1.3.5", "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", @@ -2714,6 +11042,33 @@ "regex-not": "^1.0.0", "snapdragon": "^0.8.1", "to-regex": "^3.0.2" + }, + "dependencies": { + "extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "dev": true, + "requires": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + } + }, + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4" + } + }, + "kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true + } } }, "miller-rabin": { @@ -2724,6 +11079,14 @@ "requires": { "bn.js": "^4.0.0", "brorand": "^1.0.1" + }, + "dependencies": { + "bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "dev": true + } } }, "minimalistic-assert": { @@ -2748,9 +11111,9 @@ } }, "minimist": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", "dev": true }, "mixin-deep": { @@ -2775,20 +11138,12 @@ } }, "mkdirp": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", - "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", + "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", "dev": true, "requires": { - "minimist": "0.0.8" - }, - "dependencies": { - "minimist": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", - "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", - "dev": true - } + "minimist": "^1.2.5" } }, "module-deps": { @@ -2797,13 +11152,13 @@ "integrity": "sha1-6nXK+RmQkNJbDVUStaysuW5/h/M=", "dev": true, "requires": { - "JSONStream": "^1.0.3", "browser-resolve": "^1.7.0", "concat-stream": "~1.4.5", "defined": "^1.0.0", "detective": "^4.0.0", "duplexer2": "0.0.2", "inherits": "^2.0.1", + "JSONStream": "^1.0.3", "parents": "^1.0.0", "readable-stream": "^1.1.13", "resolve": "^1.1.3", @@ -2813,16 +11168,6 @@ "xtend": "^4.0.0" }, "dependencies": { - "JSONStream": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.5.tgz", - "integrity": "sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==", - "dev": true, - "requires": { - "jsonparse": "^1.2.0", - "through": ">=2.2.7 <3" - } - }, "defined": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz", @@ -2835,12 +11180,23 @@ "integrity": "sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA=", "dev": true }, + "JSONStream": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.5.tgz", + "integrity": "sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==", + "dev": true, + "requires": { + "jsonparse": "^1.2.0", + "through": ">=2.2.7 <3" + } + }, "resolve": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.12.0.tgz", - "integrity": "sha512-B/dOmuoAik5bKcD6s6nXDCjzUKnaDvdkRyAk6rsmsKLipWj4797iothd7jmmUhWTfinVMU+wc56rYKsit2Qy4w==", + "version": "1.20.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz", + "integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==", "dev": true, "requires": { + "is-core-module": "^2.2.0", "path-parse": "^1.0.6" } }, @@ -2867,6 +11223,19 @@ "duplexer2": "0.0.2" } }, + "mute-stdout": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/mute-stdout/-/mute-stdout-1.0.1.tgz", + "integrity": "sha512-kDcwXR4PS7caBpuRYYBUz9iVixUk3anO3f5OYFiIPwK/20vCzKCHyKoulbiDY1S53zD2bxUpxN/IJ+TnXjfvxg==", + "dev": true + }, + "nan": { + "version": "2.14.2", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.2.tgz", + "integrity": "sha512-M2ufzIiINKCuDfBSAUr1vWQ+vuVcA9kqx8JJUsbQi6yf1uGRyb7HfpdfUr5qLXf3B/t8dPvcjhKMmlfnP47EzQ==", + "dev": true, + "optional": true + }, "nanomatch": { "version": "1.2.13", "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", @@ -2884,12 +11253,39 @@ "regex-not": "^1.0.0", "snapdragon": "^0.8.1", "to-regex": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "dev": true, + "requires": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + } + }, + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4" + } + }, + "kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true + } } }, - "natives": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/natives/-/natives-1.1.6.tgz", - "integrity": "sha512-6+TDFewD4yxY14ptjKaS63GVdtKiES1pTPyxn9Jb0rBqPMZ7VcCiooEhPNsr+mqHtMGxa/5c/HhcC4uPEUw/nA==", + "next-tick": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.0.0.tgz", + "integrity": "sha1-yobR/ogoFpsBICCOPchCS524NCw=", "dev": true }, "ngraph.centrality": { @@ -3011,6 +11407,51 @@ "abbrev": "1" } }, + "normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "dev": true, + "requires": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + }, + "dependencies": { + "resolve": { + "version": "1.20.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz", + "integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==", + "dev": true, + "requires": { + "is-core-module": "^2.2.0", + "path-parse": "^1.0.6" + } + } + } + }, + "normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true + }, + "now-and-later": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/now-and-later/-/now-and-later-2.0.1.tgz", + "integrity": "sha512-KGvQ0cB70AQfg107Xvs/Fbu+dGmZoTRJp2TaPwcwQm3/7PteUyN2BCgk8KBMPGBUXZdVwyWS8fDCGFygBm19UQ==", + "dev": true, + "requires": { + "once": "^1.3.2" + } + }, + "number-is-nan": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", + "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", + "dev": true + }, "object-assign": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-3.0.0.tgz", @@ -3037,6 +11478,43 @@ "is-descriptor": "^0.1.0" } }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + } + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + }, + "dependencies": { + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + } + } + }, "kind-of": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", @@ -3048,6 +11526,12 @@ } } }, + "object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true + }, "object-visit": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", @@ -3057,6 +11541,18 @@ "isobject": "^3.0.0" } }, + "object.assign": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz", + "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3", + "has-symbols": "^1.0.1", + "object-keys": "^1.1.1" + } + }, "object.defaults": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/object.defaults/-/object.defaults-1.1.0.tgz", @@ -3088,6 +11584,16 @@ "isobject": "^3.0.1" } }, + "object.reduce": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object.reduce/-/object.reduce-1.0.1.tgz", + "integrity": "sha1-b+NI8qx/oPlcpiEiZZkJaCW7A60=", + "dev": true, + "requires": { + "for-own": "^1.0.0", + "make-iterator": "^1.0.0" + } + }, "once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", @@ -3112,34 +11618,67 @@ "wordwrap": "~0.0.2" } }, - "orchestrator": { - "version": "0.3.8", - "resolved": "https://registry.npmjs.org/orchestrator/-/orchestrator-0.3.8.tgz", - "integrity": "sha1-FOfp4nZPcxX7rBhOUGx6pt+UrX4=", + "ordered-read-streams": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/ordered-read-streams/-/ordered-read-streams-1.0.1.tgz", + "integrity": "sha1-d8DLN8QVJdZBZtmQ/61+xqDhNj4=", "dev": true, "requires": { - "end-of-stream": "~0.1.5", - "sequencify": "~0.0.7", - "stream-consume": "~0.1.0" + "readable-stream": "^2.0.1" + }, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + } } }, - "ordered-read-streams": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/ordered-read-streams/-/ordered-read-streams-0.1.0.tgz", - "integrity": "sha1-/VZamvjrRHO6abbtijQ1LLVS8SY=", - "dev": true - }, "os-browserify": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.1.2.tgz", "integrity": "sha1-ScoCk+CxlZCl9d4Qx/JlphfY/lQ=", "dev": true }, - "os-homedir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", - "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", - "dev": true + "os-locale": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", + "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=", + "dev": true, + "requires": { + "lcid": "^1.0.0" + } }, "pako": { "version": "0.2.9", @@ -3157,14 +11696,13 @@ } }, "parse-asn1": { - "version": "5.1.5", - "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.5.tgz", - "integrity": "sha512-jkMYn1dcJqF6d5CpU689bq7w/b5ALS9ROVSpQDPrZsqqesUJii9qutvoT5ltGedNXMO2e16YUWIghG9KxaViTQ==", + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.6.tgz", + "integrity": "sha512-RnZRo1EPU6JBnra2vGHj0yhp6ebyjBZpmUCLHWiFhxlzvBCCpAuZ7elsBp1PVAbQN0/04VD/19rfzlBSwLstMw==", "dev": true, "requires": { - "asn1.js": "^4.0.0", + "asn1.js": "^5.2.0", "browserify-aes": "^1.0.0", - "create-hash": "^1.1.0", "evp_bytestokey": "^1.0.0", "pbkdf2": "^3.0.3", "safe-buffer": "^5.1.1" @@ -3181,6 +11719,15 @@ "path-root": "^0.1.1" } }, + "parse-json": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", + "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", + "dev": true, + "requires": { + "error-ex": "^1.2.0" + } + }, "parse-node-version": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/parse-node-version/-/parse-node-version-1.0.1.tgz", @@ -3205,6 +11752,21 @@ "integrity": "sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ==", "dev": true }, + "path-dirname": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", + "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=", + "dev": true + }, + "path-exists": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", + "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", + "dev": true, + "requires": { + "pinkie-promise": "^2.0.0" + } + }, "path-is-absolute": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", @@ -3244,10 +11806,21 @@ "integrity": "sha1-v8zcjfWxLcUsi0PsONGNcsBLqW0=", "dev": true }, + "path-type": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", + "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" + } + }, "pbkdf2": { - "version": "3.0.17", - "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.0.17.tgz", - "integrity": "sha512-U/il5MsrZp7mGg3mSQfn742na2T+1/vHDCG5/iTI3X9MKUuYUZVLQhyRsg06mCgDBTd57TxzgZt7P+fYfjRLtA==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.1.tgz", + "integrity": "sha512-4Ejy1OPxi9f2tt1rRV7Go7zmfDQ+ZectEQz3VGUQhgq62HtIRPDyG/JtnwIxs6x3uNMwo2V7q1fMvKjb+Tnpqg==", "dev": true, "requires": { "create-hash": "^1.1.2", @@ -3257,6 +11830,27 @@ "sha.js": "^2.4.8" } }, + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + }, + "pinkie": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", + "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", + "dev": true + }, + "pinkie-promise": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", + "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", + "dev": true, + "requires": { + "pinkie": "^2.0.0" + } + }, "posix-character-classes": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", @@ -3293,6 +11887,35 @@ "parse-asn1": "^5.0.0", "randombytes": "^2.0.1", "safe-buffer": "^5.1.2" + }, + "dependencies": { + "bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "dev": true + } + } + }, + "pump": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz", + "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==", + "dev": true, + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "pumpify": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.5.1.tgz", + "integrity": "sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==", + "dev": true, + "requires": { + "duplexify": "^3.6.0", + "inherits": "^2.0.3", + "pump": "^2.0.0" } }, "punycode": { @@ -3332,6 +11955,27 @@ "safe-buffer": "^5.1.0" } }, + "read-pkg": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", + "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", + "dev": true, + "requires": { + "load-json-file": "^1.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^1.0.0" + } + }, + "read-pkg-up": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", + "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", + "dev": true, + "requires": { + "find-up": "^1.0.0", + "read-pkg": "^1.0.0" + } + }, "readable-stream": { "version": "1.1.14", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", @@ -3353,6 +11997,55 @@ "readable-stream": "^1.1.13-1" } }, + "readdirp": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", + "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.11", + "micromatch": "^3.1.10", + "readable-stream": "^2.0.2" + }, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, "rechoir": { "version": "0.6.2", "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", @@ -3363,11 +12056,12 @@ }, "dependencies": { "resolve": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.12.0.tgz", - "integrity": "sha512-B/dOmuoAik5bKcD6s6nXDCjzUKnaDvdkRyAk6rsmsKLipWj4797iothd7jmmUhWTfinVMU+wc56rYKsit2Qy4w==", + "version": "1.20.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz", + "integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==", "dev": true, "requires": { + "is-core-module": "^2.2.0", "path-parse": "^1.0.6" } } @@ -3381,8 +12075,110 @@ "requires": { "extend-shallow": "^3.0.2", "safe-regex": "^1.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "dev": true, + "requires": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + } + }, + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4" + } + } + } + }, + "remove-bom-buffer": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/remove-bom-buffer/-/remove-bom-buffer-3.0.0.tgz", + "integrity": "sha512-8v2rWhaakv18qcvNeli2mZ/TMTL2nEyAKRvzo1WtnZBl15SHyEhrCu2/xKlJyUFKHiHgfXIyuY6g2dObJJycXQ==", + "dev": true, + "requires": { + "is-buffer": "^1.1.5", + "is-utf8": "^0.2.1" + } + }, + "remove-bom-stream": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/remove-bom-stream/-/remove-bom-stream-1.2.0.tgz", + "integrity": "sha1-BfGlk/FuQuH7kOv1nejlaVJflSM=", + "dev": true, + "requires": { + "remove-bom-buffer": "^3.0.0", + "safe-buffer": "^5.1.0", + "through2": "^2.0.3" + }, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "through2": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "dev": true, + "requires": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + } + }, + "xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "dev": true + } } }, + "remove-trailing-separator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", + "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=", + "dev": true + }, "repeat-element": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz", @@ -3401,6 +12197,29 @@ "integrity": "sha1-KbvZIHinOfC8zitO5B6DeVNSKSQ=", "dev": true }, + "replace-homedir": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/replace-homedir/-/replace-homedir-1.0.0.tgz", + "integrity": "sha1-6H9tUTuSjd6AgmDBK+f+xv9ueYw=", + "dev": true, + "requires": { + "homedir-polyfill": "^1.0.1", + "is-absolute": "^1.0.0", + "remove-trailing-separator": "^1.1.0" + } + }, + "require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", + "dev": true + }, + "require-main-filename": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", + "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=", + "dev": true + }, "resolve": { "version": "0.7.4", "resolved": "https://registry.npmjs.org/resolve/-/resolve-0.7.4.tgz", @@ -3417,6 +12236,15 @@ "global-modules": "^1.0.0" } }, + "resolve-options": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/resolve-options/-/resolve-options-1.1.0.tgz", + "integrity": "sha1-MrueOcBtZzONyTeMDW1gdFZq0TE=", + "dev": true, + "requires": { + "value-or-function": "^3.0.0" + } + }, "resolve-url": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", @@ -3447,15 +12275,6 @@ } } }, - "right-align": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/right-align/-/right-align-0.1.3.tgz", - "integrity": "sha1-YTObci/mo1FWiSENJOFMlhSGE+8=", - "dev": true, - "requires": { - "align-text": "^0.1.1" - } - }, "rimraf": { "version": "2.7.1", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", @@ -3466,9 +12285,9 @@ }, "dependencies": { "glob": { - "version": "7.1.5", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.5.tgz", - "integrity": "sha512-J9dlskqUXK1OeTOYBEn5s8aMukWMwWfs+rPTn/jn50Ux4MNXVhubL1wu/j2t+H4NVI+cXEcCaYellqaPVGXNqQ==", + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", "dev": true, "requires": { "fs.realpath": "^1.0.0", @@ -3532,9 +12351,9 @@ } }, "safe-buffer": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.0.tgz", - "integrity": "sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg==", + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", "dev": true }, "safe-regex": { @@ -3546,16 +12365,31 @@ "ret": "~0.1.10" } }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true + }, "semver": { - "version": "4.3.6", - "resolved": "https://registry.npmjs.org/semver/-/semver-4.3.6.tgz", - "integrity": "sha1-MAvG4OhjdPe6YQaLWx7NV/xlMto=", + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", "dev": true }, - "sequencify": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/sequencify/-/sequencify-0.0.7.tgz", - "integrity": "sha1-kM/xnQLgcCf9dn9erT57ldHnOAw=", + "semver-greatest-satisfied-range": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/semver-greatest-satisfied-range/-/semver-greatest-satisfied-range-1.1.0.tgz", + "integrity": "sha1-E+jCZYq5aRywzXEJMkAoDTb3els=", + "dev": true, + "requires": { + "sver-compat": "^1.5.0" + } + }, + "set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", "dev": true }, "set-immediate-shim": { @@ -3574,17 +12408,6 @@ "is-extendable": "^0.1.1", "is-plain-object": "^2.0.3", "split-string": "^3.0.1" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } } }, "sha.js": { @@ -3661,16 +12484,58 @@ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", "dev": true, "requires": { - "is-descriptor": "^0.1.0" + "is-descriptor": "^0.1.0" + } + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } } }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", "dev": true, "requires": { - "is-extendable": "^0.1.0" + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" } }, "source-map": { @@ -3700,35 +12565,6 @@ "requires": { "is-descriptor": "^1.0.0" } - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } } } }, @@ -3762,12 +12598,12 @@ } }, "source-map-resolve": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.2.tgz", - "integrity": "sha512-MjqsvNwyz1s0k81Goz/9vRBe9SZdB09Bdw+/zYyO+3CuPk6fouTaxscHkgtE8jKvf01kVfl8riHzERQ/kefaSA==", + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz", + "integrity": "sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==", "dev": true, "requires": { - "atob": "^2.1.1", + "atob": "^2.1.2", "decode-uri-component": "^0.2.0", "resolve-url": "^0.2.1", "source-map-url": "^0.4.0", @@ -3775,9 +12611,9 @@ } }, "source-map-url": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz", - "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=", + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.1.tgz", + "integrity": "sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw==", "dev": true }, "sparkles": { @@ -3786,6 +12622,38 @@ "integrity": "sha512-dSO0DDYUahUt/0/pD/Is3VIm5TGJjludZ0HVymmhYF6eNA53PVLhnUk0znSYbH8IYBuJdCE+1luR22jNLMaQdw==", "dev": true }, + "spdx-correct": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", + "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==", + "dev": true, + "requires": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-exceptions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", + "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", + "dev": true + }, + "spdx-expression-parse": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", + "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", + "dev": true, + "requires": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-license-ids": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.7.tgz", + "integrity": "sha512-U+MTEOO0AiDzxwFvoa4JVnMV6mZlJKk2sBLt90s7G0Gd0Mlknc7kxEn3nuDPNZRta7O2uy8oLcZLVT+4sqNZHQ==", + "dev": true + }, "split-string": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", @@ -3793,8 +12661,35 @@ "dev": true, "requires": { "extend-shallow": "^3.0.0" + }, + "dependencies": { + "extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "dev": true, + "requires": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + } + }, + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4" + } + } } }, + "stack-trace": { + "version": "0.0.10", + "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz", + "integrity": "sha1-VHxws0fo0ytOEI6hoqFZ5f3eGcA=", + "dev": true + }, "static-extend": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", @@ -3813,6 +12708,57 @@ "requires": { "is-descriptor": "^0.1.0" } + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + } } } }, @@ -3860,10 +12806,16 @@ } } }, - "stream-consume": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/stream-consume/-/stream-consume-0.1.1.tgz", - "integrity": "sha512-tNa3hzgkjEP7XbCkbRXe1jpg+ievoa0O4SCFlMOYEscGSS4JJsckGL8swUyAa/ApGU3Ae4t6Honor4HhL+tRyg==", + "stream-exhaust": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/stream-exhaust/-/stream-exhaust-1.0.2.tgz", + "integrity": "sha512-b/qaq/GlBK5xaq1yrK9/zFcyRSTNxmcZwFLGSTG0mXgZl/4Z6GgiyYOXOvY7N3eEvFRAG1bkDRz5EPGSvPYQlw==", + "dev": true + }, + "stream-shift": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.1.tgz", + "integrity": "sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==", "dev": true }, "stream-splicer": { @@ -3886,6 +12838,17 @@ "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", "dev": true }, + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "dev": true, + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + }, "strip-ansi": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", @@ -3896,12 +12859,11 @@ } }, "strip-bom": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-1.0.0.tgz", - "integrity": "sha1-hbiGLzhEtabV7IRnqTWYFzo295Q=", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", + "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", "dev": true, "requires": { - "first-chunk-stream": "^1.0.0", "is-utf8": "^0.2.0" } }, @@ -3920,6 +12882,16 @@ "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", "dev": true }, + "sver-compat": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/sver-compat/-/sver-compat-1.5.0.tgz", + "integrity": "sha1-PPh9/rTQe0o/FIJ7wYaz/QxkXNg=", + "dev": true, + "requires": { + "es6-iterator": "^2.0.1", + "es6-symbol": "^3.1.1" + } + }, "syntax-error": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/syntax-error/-/syntax-error-1.4.0.tgz", @@ -3999,13 +12971,68 @@ } } }, - "tildify": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/tildify/-/tildify-1.2.0.tgz", - "integrity": "sha1-3OwD9V3Km3qj5bBPIYF+tW5jWIo=", + "through2-filter": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/through2-filter/-/through2-filter-3.0.0.tgz", + "integrity": "sha512-jaRjI2WxN3W1V8/FMZ9HKIBXixtiqs3SQSX4/YGIiP3gL6djW48VoZq9tDqeCWs3MT8YY5wb/zli8VW8snY1CA==", "dev": true, "requires": { - "os-homedir": "^1.0.0" + "through2": "~2.0.0", + "xtend": "~4.0.0" + }, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "through2": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "dev": true, + "requires": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + } + }, + "xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "dev": true + } } }, "time-stamp": { @@ -4031,6 +13058,16 @@ } } }, + "to-absolute-glob": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/to-absolute-glob/-/to-absolute-glob-2.0.2.tgz", + "integrity": "sha1-GGX0PZ50sIItufFFt4z/fQ98hJs=", + "dev": true, + "requires": { + "is-absolute": "^1.0.0", + "is-negated-glob": "^1.0.0" + } + }, "to-object-path": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", @@ -4046,33 +13083,117 @@ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "dev": true, "requires": { - "is-buffer": "^1.1.5" + "is-buffer": "^1.1.5" + } + } + } + }, + "to-regex": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", + "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", + "dev": true, + "requires": { + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "regex-not": "^1.0.2", + "safe-regex": "^1.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "dev": true, + "requires": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + } + }, + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4" + } + } + } + }, + "to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "dev": true, + "requires": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + } + }, + "to-through": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-through/-/to-through-2.0.0.tgz", + "integrity": "sha1-/JKtq6ByZHvAtn1rA2ZKoZUJOvY=", + "dev": true, + "requires": { + "through2": "^2.0.3" + }, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "through2": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "dev": true, + "requires": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" } + }, + "xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "dev": true } } }, - "to-regex": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", - "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", - "dev": true, - "requires": { - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "regex-not": "^1.0.2", - "safe-regex": "^1.1.0" - } - }, - "to-regex-range": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", - "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", - "dev": true, - "requires": { - "is-number": "^3.0.0", - "repeat-string": "^1.6.1" - } - }, "traverse": { "version": "0.6.6", "resolved": "https://registry.npmjs.org/traverse/-/traverse-0.6.6.tgz", @@ -4085,6 +13206,12 @@ "integrity": "sha512-C3TaO7K81YvjCgQH9Q1S3R3P3BtN3RIM8n+OvX4il1K1zgE8ZhI0op7kClgkxtutIE8hQrcrHBXvIheqKUUCxw==", "dev": true }, + "type": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/type/-/type-1.2.0.tgz", + "integrity": "sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==", + "dev": true + }, "typedarray": { "version": "0.0.6", "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", @@ -4092,32 +13219,9 @@ "dev": true }, "uglify-js": { - "version": "2.4.24", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.4.24.tgz", - "integrity": "sha1-+tV1XB4Vd2WLsG/5q25UjJW+vW4=", - "dev": true, - "requires": { - "async": "~0.2.6", - "source-map": "0.1.34", - "uglify-to-browserify": "~1.0.0", - "yargs": "~3.5.4" - }, - "dependencies": { - "source-map": { - "version": "0.1.34", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.1.34.tgz", - "integrity": "sha1-p8/omux7FoLDsZjQrPtH19CQVms=", - "dev": true, - "requires": { - "amdefine": ">=0.0.4" - } - } - } - }, - "uglify-save-license": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/uglify-save-license/-/uglify-save-license-0.4.1.tgz", - "integrity": "sha1-lXJsF8xv0XHDYX479NjYKqjEzOE=", + "version": "3.12.8", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.12.8.tgz", + "integrity": "sha512-fvBeuXOsvqjecUtF/l1dwsrrf5y2BCUk9AOJGzGcm6tE7vegku5u/YvqjyDaAGr422PLoLnrxg3EnRvTqsdC1w==", "dev": true }, "uglify-to-browserify": { @@ -4136,6 +13240,59 @@ "ruglify": "~1.0.0", "through": "~2.3.4", "uglify-js": "~2.4.0" + }, + "dependencies": { + "async": { + "version": "0.2.10", + "resolved": "https://registry.npmjs.org/async/-/async-0.2.10.tgz", + "integrity": "sha1-trvgsGdLnXGXCMo43owjfLUmw9E=", + "dev": true + }, + "camelcase": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz", + "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=", + "dev": true + }, + "source-map": { + "version": "0.1.34", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.1.34.tgz", + "integrity": "sha1-p8/omux7FoLDsZjQrPtH19CQVms=", + "dev": true, + "requires": { + "amdefine": ">=0.0.4" + } + }, + "uglify-js": { + "version": "2.4.24", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.4.24.tgz", + "integrity": "sha1-+tV1XB4Vd2WLsG/5q25UjJW+vW4=", + "dev": true, + "requires": { + "async": "~0.2.6", + "source-map": "0.1.34", + "uglify-to-browserify": "~1.0.0", + "yargs": "~3.5.4" + } + }, + "wordwrap": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz", + "integrity": "sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8=", + "dev": true + }, + "yargs": { + "version": "3.5.4", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.5.4.tgz", + "integrity": "sha1-2K/49mXpTDS9JZvevRv68N3TU2E=", + "dev": true, + "requires": { + "camelcase": "^1.0.2", + "decamelize": "^1.0.0", + "window-size": "0.1.0", + "wordwrap": "0.0.2" + } + } } }, "unc-path-regex": { @@ -4144,6 +13301,30 @@ "integrity": "sha1-5z3T17DXxe2G+6xrCufYxqadUPo=", "dev": true }, + "undertaker": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/undertaker/-/undertaker-1.3.0.tgz", + "integrity": "sha512-/RXwi5m/Mu3H6IHQGww3GNt1PNXlbeCuclF2QYR14L/2CHPz3DFZkvB5hZ0N/QUkiXWCACML2jXViIQEQc2MLg==", + "dev": true, + "requires": { + "arr-flatten": "^1.0.1", + "arr-map": "^2.0.0", + "bach": "^1.0.0", + "collection-map": "^1.0.0", + "es6-weak-map": "^2.0.1", + "fast-levenshtein": "^1.0.0", + "last-run": "^1.1.0", + "object.defaults": "^1.0.0", + "object.reduce": "^1.0.0", + "undertaker-registry": "^1.0.0" + } + }, + "undertaker-registry": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/undertaker-registry/-/undertaker-registry-1.0.1.tgz", + "integrity": "sha1-XkvaMI5KiirlhPm5pDWaSZglzFA=", + "dev": true + }, "union-value": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", @@ -4157,10 +13338,14 @@ } }, "unique-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unique-stream/-/unique-stream-1.0.0.tgz", - "integrity": "sha1-1ZpKdUJ0R9mqbJHnAmP40mpLEEs=", - "dev": true + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/unique-stream/-/unique-stream-2.3.1.tgz", + "integrity": "sha512-2nY4TnBE70yoxHkDli7DMazpWiP7xMdCYqU2nBRO0UB+ZpEkGsSija7MvmvnZFUeC+mrgiUfcHSr3LmRFIg4+A==", + "dev": true, + "requires": { + "json-stable-stringify-without-jsonify": "^1.0.1", + "through2-filter": "^3.0.0" + } }, "unset-value": { "version": "1.0.0", @@ -4208,6 +13393,12 @@ } } }, + "upath": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz", + "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==", + "dev": true + }, "urix": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", @@ -4238,12 +13429,6 @@ "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", "dev": true }, - "user-home": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/user-home/-/user-home-1.1.1.tgz", - "integrity": "sha1-K1viOjK2Onyd640PKNSFcko98ZA=", - "dev": true - }, "util": { "version": "0.10.4", "resolved": "https://registry.npmjs.org/util/-/util-0.10.4.tgz", @@ -4268,23 +13453,38 @@ "dev": true }, "v8flags": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/v8flags/-/v8flags-2.1.1.tgz", - "integrity": "sha1-qrGh+jDUX4jdMhFIh1rALAtV5bQ=", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/v8flags/-/v8flags-3.2.0.tgz", + "integrity": "sha512-mH8etigqMfiGWdeXpaaqGfs6BndypxusHHcv2qSHyZkGEznCd/qAXCWWRzeowtL54147cktFOC4P5y+kl8d8Jg==", + "dev": true, + "requires": { + "homedir-polyfill": "^1.0.1" + } + }, + "validate-npm-package-license": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", "dev": true, "requires": { - "user-home": "^1.1.1" + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" } }, + "value-or-function": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/value-or-function/-/value-or-function-3.0.0.tgz", + "integrity": "sha1-HCQ6ULWVwb5Up1S/7OhWO5/42BM=", + "dev": true + }, "vinyl": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-0.5.3.tgz", - "integrity": "sha1-sEVbOPxeDPMNQyUTLkYZcMIJHN4=", + "version": "0.4.6", + "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-0.4.6.tgz", + "integrity": "sha1-LzVsh6VQolVGHza76ypbqL94SEc=", "dev": true, "requires": { - "clone": "^1.0.0", - "clone-stats": "^0.0.1", - "replace-ext": "0.0.1" + "clone": "^0.2.0", + "clone-stats": "^0.0.1" } }, "vinyl-buffer": { @@ -4304,9 +13504,9 @@ "dev": true }, "readable-stream": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", "dev": true, "requires": { "core-util-is": "~1.0.0", @@ -4352,57 +13552,106 @@ } }, "vinyl-fs": { - "version": "0.3.14", - "resolved": "https://registry.npmjs.org/vinyl-fs/-/vinyl-fs-0.3.14.tgz", - "integrity": "sha1-mmhRzhysHBzqX+hsCTHWIMLPqeY=", - "dev": true, - "requires": { - "defaults": "^1.0.0", - "glob-stream": "^3.1.5", - "glob-watcher": "^0.0.6", - "graceful-fs": "^3.0.0", - "mkdirp": "^0.5.0", - "strip-bom": "^1.0.0", - "through2": "^0.6.1", - "vinyl": "^0.4.0" + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/vinyl-fs/-/vinyl-fs-3.0.3.tgz", + "integrity": "sha512-vIu34EkyNyJxmP0jscNzWBSygh7VWhqun6RmqVfXePrOwi9lhvRs//dOaGOTRUQr4tx7/zd26Tk5WeSVZitgng==", + "dev": true, + "requires": { + "fs-mkdirp-stream": "^1.0.0", + "glob-stream": "^6.1.0", + "graceful-fs": "^4.0.0", + "is-valid-glob": "^1.0.0", + "lazystream": "^1.0.0", + "lead": "^1.0.0", + "object.assign": "^4.0.4", + "pumpify": "^1.3.5", + "readable-stream": "^2.3.3", + "remove-bom-buffer": "^3.0.0", + "remove-bom-stream": "^1.2.0", + "resolve-options": "^1.1.0", + "through2": "^2.0.0", + "to-through": "^2.0.0", + "value-or-function": "^3.0.0", + "vinyl": "^2.0.0", + "vinyl-sourcemap": "^1.1.0" }, "dependencies": { "clone": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/clone/-/clone-0.2.0.tgz", - "integrity": "sha1-xhJqkK1Pctv1rNskPMN3JP6T/B8=", + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", + "integrity": "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=", + "dev": true + }, + "clone-stats": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-1.0.0.tgz", + "integrity": "sha1-s3gt/4u1R04Yuba/D9/ngvh3doA=", + "dev": true + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", "dev": true }, "readable-stream": { - "version": "1.0.34", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", - "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", "dev": true, "requires": { "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "replace-ext": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-1.0.1.tgz", + "integrity": "sha512-yD5BHCe7quCgBph4rMQ+0KkIRKwWCrHDOX1p1Gp6HwjPM5kVoCdKGNhN7ydqqsX6lJEnQDKZ/tFMiEdQ1dvPEw==", + "dev": true + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" } }, "through2": { - "version": "0.6.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz", - "integrity": "sha1-QaucZ7KdVyCQcUEOHXp6lozTrUg=", + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", "dev": true, "requires": { - "readable-stream": ">=1.0.33-1 <1.1.0-0", - "xtend": ">=4.0.0 <4.1.0-0" + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" } }, "vinyl": { - "version": "0.4.6", - "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-0.4.6.tgz", - "integrity": "sha1-LzVsh6VQolVGHza76ypbqL94SEc=", + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-2.2.1.tgz", + "integrity": "sha512-LII3bXRFBZLlezoG5FfZVcXflZgWP/4dCwKtxd5ky9+LOtM4CS3bIRQsmR1KMnMW07jpE8fqR2lcxPZ+8sJIcw==", "dev": true, "requires": { - "clone": "^0.2.0", - "clone-stats": "^0.0.1" + "clone": "^2.1.1", + "clone-buffer": "^1.0.0", + "clone-stats": "^1.0.0", + "cloneable-readable": "^1.0.0", + "remove-trailing-separator": "^1.0.1", + "replace-ext": "^1.0.0" } }, "xtend": { @@ -4414,19 +13663,25 @@ } }, "vinyl-source-stream": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vinyl-source-stream/-/vinyl-source-stream-1.1.2.tgz", - "integrity": "sha1-YrU6E1YQqJbpjKlr7jqH8Aio54A=", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/vinyl-source-stream/-/vinyl-source-stream-2.0.0.tgz", + "integrity": "sha1-84pa+53R6Ttl1VBGmsYYKsT1S44=", "dev": true, "requires": { "through2": "^2.0.3", - "vinyl": "^0.4.3" + "vinyl": "^2.1.0" }, "dependencies": { "clone": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/clone/-/clone-0.2.0.tgz", - "integrity": "sha1-xhJqkK1Pctv1rNskPMN3JP6T/B8=", + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", + "integrity": "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=", + "dev": true + }, + "clone-stats": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-1.0.0.tgz", + "integrity": "sha1-s3gt/4u1R04Yuba/D9/ngvh3doA=", "dev": true }, "isarray": { @@ -4436,9 +13691,9 @@ "dev": true }, "readable-stream": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", "dev": true, "requires": { "core-util-is": "~1.0.0", @@ -4450,6 +13705,12 @@ "util-deprecate": "~1.0.1" } }, + "replace-ext": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-1.0.1.tgz", + "integrity": "sha512-yD5BHCe7quCgBph4rMQ+0KkIRKwWCrHDOX1p1Gp6HwjPM5kVoCdKGNhN7ydqqsX6lJEnQDKZ/tFMiEdQ1dvPEw==", + "dev": true + }, "safe-buffer": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", @@ -4476,13 +13737,17 @@ } }, "vinyl": { - "version": "0.4.6", - "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-0.4.6.tgz", - "integrity": "sha1-LzVsh6VQolVGHza76ypbqL94SEc=", + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-2.2.1.tgz", + "integrity": "sha512-LII3bXRFBZLlezoG5FfZVcXflZgWP/4dCwKtxd5ky9+LOtM4CS3bIRQsmR1KMnMW07jpE8fqR2lcxPZ+8sJIcw==", "dev": true, "requires": { - "clone": "^0.2.0", - "clone-stats": "^0.0.1" + "clone": "^2.1.1", + "clone-buffer": "^1.0.0", + "clone-stats": "^1.0.0", + "cloneable-readable": "^1.0.0", + "remove-trailing-separator": "^1.0.1", + "replace-ext": "^1.0.0" } }, "xtend": { @@ -4493,6 +13758,79 @@ } } }, + "vinyl-sourcemap": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/vinyl-sourcemap/-/vinyl-sourcemap-1.1.0.tgz", + "integrity": "sha1-kqgAWTo4cDqM2xHYswCtS+Y7PhY=", + "dev": true, + "requires": { + "append-buffer": "^1.0.2", + "convert-source-map": "^1.5.0", + "graceful-fs": "^4.1.6", + "normalize-path": "^2.1.1", + "now-and-later": "^2.0.0", + "remove-bom-buffer": "^3.0.0", + "vinyl": "^2.0.0" + }, + "dependencies": { + "clone": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", + "integrity": "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=", + "dev": true + }, + "clone-stats": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-1.0.0.tgz", + "integrity": "sha1-s3gt/4u1R04Yuba/D9/ngvh3doA=", + "dev": true + }, + "convert-source-map": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz", + "integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.1" + } + }, + "normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "dev": true, + "requires": { + "remove-trailing-separator": "^1.0.1" + } + }, + "replace-ext": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-1.0.1.tgz", + "integrity": "sha512-yD5BHCe7quCgBph4rMQ+0KkIRKwWCrHDOX1p1Gp6HwjPM5kVoCdKGNhN7ydqqsX6lJEnQDKZ/tFMiEdQ1dvPEw==", + "dev": true + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "vinyl": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-2.2.1.tgz", + "integrity": "sha512-LII3bXRFBZLlezoG5FfZVcXflZgWP/4dCwKtxd5ky9+LOtM4CS3bIRQsmR1KMnMW07jpE8fqR2lcxPZ+8sJIcw==", + "dev": true, + "requires": { + "clone": "^2.1.1", + "clone-buffer": "^1.0.0", + "clone-stats": "^1.0.0", + "cloneable-readable": "^1.0.0", + "remove-trailing-separator": "^1.0.1", + "replace-ext": "^1.0.0" + } + } + } + }, "vinyl-sourcemaps-apply": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/vinyl-sourcemaps-apply/-/vinyl-sourcemaps-apply-0.2.1.tgz", @@ -4528,6 +13866,12 @@ "isexe": "^2.0.0" } }, + "which-module": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-1.0.0.tgz", + "integrity": "sha1-u6Y8qGGUiZT/MHc2CJ47lgJsKk8=", + "dev": true + }, "window-size": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.0.tgz", @@ -4540,6 +13884,16 @@ "integrity": "sha1-o9XabNXAvAAI03I0u68b7WMFkQc=", "dev": true }, + "wrap-ansi": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", + "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", + "dev": true, + "requires": { + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1" + } + }, "wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", @@ -4552,6 +13906,12 @@ "integrity": "sha1-XM50B7r2Qsunvs2laBEcST9ZZlo=", "dev": true }, + "y18n": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.2.tgz", + "integrity": "sha512-uGZHXkHnhF0XeeAPgnKfPv1bgKAYyVvmNL1xlKsPYZPaIHxGti2hHqvOCQv71XMsLxu1QjergkqogUnms5D3YQ==", + "dev": true + }, "yamlish": { "version": "0.0.7", "resolved": "https://registry.npmjs.org/yamlish/-/yamlish-0.0.7.tgz", @@ -4559,23 +13919,34 @@ "dev": true }, "yargs": { - "version": "3.5.4", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.5.4.tgz", - "integrity": "sha1-2K/49mXpTDS9JZvevRv68N3TU2E=", - "dev": true, - "requires": { - "camelcase": "^1.0.2", - "decamelize": "^1.0.0", - "window-size": "0.1.0", - "wordwrap": "0.0.2" - }, - "dependencies": { - "wordwrap": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz", - "integrity": "sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8=", - "dev": true - } + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-7.1.1.tgz", + "integrity": "sha512-huO4Fr1f9PmiJJdll5kwoS2e4GqzGSsMT3PPMpOwoVkOK8ckqAewMTZyA6LXVQWflleb/Z8oPBEvNsMft0XE+g==", + "dev": true, + "requires": { + "camelcase": "^3.0.0", + "cliui": "^3.2.0", + "decamelize": "^1.1.1", + "get-caller-file": "^1.0.1", + "os-locale": "^1.4.0", + "read-pkg-up": "^1.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^1.0.1", + "set-blocking": "^2.0.0", + "string-width": "^1.0.2", + "which-module": "^1.0.0", + "y18n": "^3.2.1", + "yargs-parser": "5.0.0-security.0" + } + }, + "yargs-parser": { + "version": "5.0.0-security.0", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-5.0.0-security.0.tgz", + "integrity": "sha512-T69y4Ps64LNesYxeYGYPvfoMTt/7y1XtfpIslUeK4um+9Hu7hlGoRtaDLvdXb7+/tfq4opVa2HRY5xGip022rQ==", + "dev": true, + "requires": { + "camelcase": "^3.0.0", + "object.assign": "^4.1.0" } } } diff --git a/package.json b/package.json index fd9b792..b5f1155 100644 --- a/package.json +++ b/package.json @@ -9,7 +9,8 @@ "scripts": { "start": "gulp", "test": "tap test/*.js", - "release": "gulp release" + "release": "gulp release", + "build": "gulp release" }, "repository": { "type": "git", @@ -23,15 +24,14 @@ "devDependencies": { "browserify": "^8.0.3", "del": "^1.1.1", - "gulp": "^3.9.0", - "gulp-rename": "^1.2.0", - "gulp-run": "^1.6.5", - "gulp-uglify": "^1.0.2", - "gulp-util": "^3.0.2", + "gulp": "^4.0.2", + "gulp-rename": "^2.0.0", + "gulp-run": "^1.7.1", + "gulp-uglify": "^3.0.2", "ngraph.remove-overlaps": "^1.0.0", "tap": "^0.4.13", - "vinyl-buffer": "^1.0.0", - "vinyl-source-stream": "^1.0.0" + "vinyl-buffer": "^1.0.1", + "vinyl-source-stream": "^2.0.0" }, "dependencies": { "gintersect": "0.1.0", From 96287ddf3e1371003b50ef1b6f73d40651660ad0 Mon Sep 17 00:00:00 2001 From: Andriy Kashcha Date: Sat, 27 Feb 2021 10:31:23 -0800 Subject: [PATCH 37/49] Reverse the sign It should be negative to match common zooming behavior --- src/Input/dragndrop.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Input/dragndrop.js b/src/Input/dragndrop.js index 087fcaf..b0044b0 100644 --- a/src/Input/dragndrop.js +++ b/src/Input/dragndrop.js @@ -130,7 +130,7 @@ function dragndrop(element) { } e.returnValue = false; - var delta = e.deltaY, + var delta = -e.deltaY, mousePos = getMousePos(e), elementOffset = findElementPosition(element), relMousePos = { From 601c05ca8837e59cd7b037516314732d86c53a55 Mon Sep 17 00:00:00 2001 From: anvaka Date: Sun, 25 Jul 2021 15:28:22 -0700 Subject: [PATCH 38/49] Moved to github actions --- .github/workflows/tests.yaml | 26 ++++++++++++++++++++++++++ .travis.yml | 3 --- README.md | 2 +- 3 files changed, 27 insertions(+), 4 deletions(-) create mode 100644 .github/workflows/tests.yaml delete mode 100644 .travis.yml diff --git a/.github/workflows/tests.yaml b/.github/workflows/tests.yaml new file mode 100644 index 0000000..87a91c6 --- /dev/null +++ b/.github/workflows/tests.yaml @@ -0,0 +1,26 @@ +name: Node.js CI + +on: + push: + branches: [ master ] + pull_request: + branches: [ master ] + +jobs: + build: + + runs-on: ubuntu-latest + + strategy: + matrix: + node-version: [12.x, 14.x, 15.x] + + steps: + - uses: actions/checkout@v2 + - name: Use Node.js ${{ matrix.node-version }} + uses: actions/setup-node@v2 + with: + node-version: ${{ matrix.node-version }} + - run: npm ci + - run: npm run build --if-present + - run: npm test \ No newline at end of file diff --git a/.travis.yml b/.travis.yml deleted file mode 100644 index 851fb95..0000000 --- a/.travis.yml +++ /dev/null @@ -1,3 +0,0 @@ -language: node_js -node_js: -- node diff --git a/README.md b/README.md index 7e2e304..99b481c 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -VivaGraph [![Build Status](https://travis-ci.org/anvaka/VivaGraphJS.svg)](https://travis-ci.org/anvaka/VivaGraphJS) +VivaGraph [![build status](https://github.com/anvaka/VivaGraphJS/actions/workflows/tests.yaml/badge.svg)](https://github.com/anvaka/VivaGraphJS/actions/workflows/tests.yaml) ================================================== **VivaGraphJS** is designed to be extensible and to support different rendering engines and layout algorithms. Underlying algorithms have been broken out into [ngraph](https://github.com/anvaka/ngraph). From 2ce9b403871554c6cb7ca53ac589985179eb4fa2 Mon Sep 17 00:00:00 2001 From: anvaka Date: Sun, 3 Apr 2022 20:23:50 -0700 Subject: [PATCH 39/49] updated years --- LICENSE | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/LICENSE b/LICENSE index f0cc9c2..e690758 100644 --- a/LICENSE +++ b/LICENSE @@ -1,4 +1,4 @@ -Copyright (c) 2011 - 2021, Andrei Kashcha +Copyright (c) 2011 - 2022, Andrei Kashcha All rights reserved. Redistribution and use in source and binary forms, with or without From b479e27a7e225b89d9327ad296a4ae9c2ad393d0 Mon Sep 17 00:00:00 2001 From: anvaka Date: Sun, 18 Jun 2023 14:37:31 -0700 Subject: [PATCH 40/49] updated year --- LICENSE | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/LICENSE b/LICENSE index e690758..a43161f 100644 --- a/LICENSE +++ b/LICENSE @@ -1,4 +1,4 @@ -Copyright (c) 2011 - 2022, Andrei Kashcha +Copyright (c) 2011 - 2023, Andrei Kashcha All rights reserved. Redistribution and use in source and binary forms, with or without From 362ef05bdee6f8cc216602bf167b4379d49418b6 Mon Sep 17 00:00:00 2001 From: anvaka Date: Wed, 13 Dec 2023 19:17:18 -0800 Subject: [PATCH 41/49] npm audit fix --- package-lock.json | 261 +++++++++++++++++++++++++--------------------- 1 file changed, 142 insertions(+), 119 deletions(-) diff --git a/package-lock.json b/package-lock.json index 1f62af6..c77c766 100644 --- a/package-lock.json +++ b/package-lock.json @@ -629,9 +629,9 @@ } }, "node_modules/bn.js": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.0.tgz", - "integrity": "sha512-D7iWRBvnZE8ecXiLj/9wbxH7Tk79fAh8IHaTNq1RWRixsS02W+5qS+iE9yq6RYl0asXx5tw0bLhmT5pIfbSquw==", + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz", + "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==", "dev": true }, "node_modules/brace-expansion": { @@ -674,7 +674,7 @@ "node_modules/browser-pack": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/browser-pack/-/browser-pack-3.2.0.tgz", - "integrity": "sha1-+qHLxBSHsazEdH43PhFIrf/Q4tk=", + "integrity": "sha512-BHla5EbbxjNyLMFUMamVjeTY+q1QwHbrYNXlWOkw71QcBqAQF7maJyNh3OI/V0d5YyNdMYD6tiPhJB9ukBo99Q==", "dev": true, "dependencies": { "combine-source-map": "~0.3.0", @@ -728,7 +728,7 @@ "node_modules/browserify": { "version": "8.1.3", "resolved": "https://registry.npmjs.org/browserify/-/browserify-8.1.3.tgz", - "integrity": "sha1-8zpUmjpsNoIZsHX9z+bfGV4Empo=", + "integrity": "sha512-0KKOkCQXCvP64qm73CtESE92pVnB5MkjA2W/Tmf+S4uPHVY4/SeCwO7wdr4mkke5ySoVyMqsOcMa5zo6uh9c9A==", "dev": true, "dependencies": { "assert": "~1.3.0", @@ -833,26 +833,29 @@ } }, "node_modules/browserify-sign": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.2.1.tgz", - "integrity": "sha512-/vrA5fguVAKKAVTNJjgSm1tRQDHUU6DbwO9IROu/0WAzC8PKhucDSh18J0RMvVeHAn5puMd+QHC2erPRNf8lmg==", + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.2.2.tgz", + "integrity": "sha512-1rudGyeYY42Dk6texmv7c4VcQ0EsvVbLwZkA+AQB7SxvXxmcD93jcHie8bzecJ+ChDlmAm2Qyu0+Ccg5uhZXCg==", "dev": true, "dependencies": { - "bn.js": "^5.1.1", - "browserify-rsa": "^4.0.1", + "bn.js": "^5.2.1", + "browserify-rsa": "^4.1.0", "create-hash": "^1.2.0", "create-hmac": "^1.1.7", - "elliptic": "^6.5.3", + "elliptic": "^6.5.4", "inherits": "^2.0.4", - "parse-asn1": "^5.1.5", - "readable-stream": "^3.6.0", - "safe-buffer": "^5.2.0" + "parse-asn1": "^5.1.6", + "readable-stream": "^3.6.2", + "safe-buffer": "^5.2.1" + }, + "engines": { + "node": ">= 4" } }, "node_modules/browserify-sign/node_modules/readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", "dev": true, "dependencies": { "inherits": "^2.0.3", @@ -928,7 +931,7 @@ "node_modules/bunker": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/bunker/-/bunker-0.1.2.tgz", - "integrity": "sha1-yImSRkqOKm7ehpMDdfkrWAd++Xw=", + "integrity": "sha512-YnahkcXBNT522S46k5LUA9P18lzvgkunbMl0qIJQ8oeRMQ+dAg3YI3k32q5TnO+AAUErFHO6R768To6jslgYmQ==", "dev": true, "dependencies": { "burrito": ">=0.2.5 <0.3" @@ -940,7 +943,7 @@ "node_modules/burrito": { "version": "0.2.12", "resolved": "https://registry.npmjs.org/burrito/-/burrito-0.2.12.tgz", - "integrity": "sha1-0NbmrIHV6ZeJxvpKzLCwAx6lT2s=", + "integrity": "sha512-ZhhT5iVTAgzQ+s8rily7m45Swxe/cU3dVCHTzqmHVWD/cc0Ds3W4Q4MExbkevY+fm0Me3lEwpehIy6TH7p+ehw==", "dev": true, "dependencies": { "traverse": "~0.5.1", @@ -962,7 +965,7 @@ "node_modules/burrito/node_modules/uglify-js": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-1.1.1.tgz", - "integrity": "sha1-7nGpfEzv0GoamyBDfzQRiYKqA1s=", + "integrity": "sha512-YYY9Dle1leC+btgrHnAR05eq0aRdcPJsXlYYD+SYw2lqc5HFuFNHg3wWEW4SNE0iXXEUl0fz43gTQ3r1YK76rg==", "dev": true, "bin": { "uglifyjs": "bin/uglifyjs" @@ -1367,13 +1370,22 @@ } }, "node_modules/copy-props": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/copy-props/-/copy-props-2.0.4.tgz", - "integrity": "sha512-7cjuUME+p+S3HZlbllgsn2CDwS+5eCCX16qBgNC4jgSTf49qR1VKy/Zhl400m0IQXl/bPGEVqncgUUMjrr4s8A==", + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/copy-props/-/copy-props-2.0.5.tgz", + "integrity": "sha512-XBlx8HSqrT0ObQwmSzM7WE5k8FxTV75h1DX1Z3n6NhQ/UYYAvInWYmG06vFt7hQZArE2fuO62aihiWIVQwh1sw==", "dev": true, "dependencies": { - "each-props": "^1.3.0", - "is-plain-object": "^2.0.1" + "each-props": "^1.3.2", + "is-plain-object": "^5.0.0" + } + }, + "node_modules/copy-props/node_modules/is-plain-object": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", + "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==", + "dev": true, + "engines": { + "node": ">=0.10.0" } }, "node_modules/core-util-is": { @@ -1485,9 +1497,9 @@ } }, "node_modules/decode-uri-component": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", - "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.2.tgz", + "integrity": "sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==", "dev": true, "engines": { "node": ">=0.10" @@ -2372,7 +2384,7 @@ "node_modules/glob": { "version": "4.5.3", "resolved": "https://registry.npmjs.org/glob/-/glob-4.5.3.tgz", - "integrity": "sha1-xstz0yJsHv7wTePFbQEvAzd+4V8=", + "integrity": "sha512-I0rTWUKSZKxPSIAIaqhSXTM/DiII6wame+rEC3cFA5Lqmr9YmdL7z6Hj9+bdWtTvoY1Su4/OiMLmb37Y7JzvJQ==", "dev": true, "dependencies": { "inflight": "^1.0.4", @@ -2387,7 +2399,7 @@ "node_modules/glob-parent": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", - "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", + "integrity": "sha512-E8Ak/2+dZY6fnzlR7+ueWvhsH1SjHr4jjss4YS/h4py44jY9MhK/VFdaZJAWDz6BbL21KeteKxFSFpq8OS5gVA==", "dev": true, "dependencies": { "is-glob": "^3.1.0", @@ -2409,7 +2421,7 @@ "node_modules/glob-stream": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/glob-stream/-/glob-stream-6.1.0.tgz", - "integrity": "sha1-cEXJlBOz65SIjYOrRtC0BMx73eQ=", + "integrity": "sha512-uMbLGAP3S2aDOHUDfdoYcdIePUCfysbAd0IAoWVZbeGU/oNQ8asHVSshLDJUPWxfzj8zsCG7/XeHPHTtow0nsw==", "dev": true, "dependencies": { "extend": "^3.0.0", @@ -2454,9 +2466,9 @@ "dev": true }, "node_modules/glob-stream/node_modules/minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, "dependencies": { "brace-expansion": "^1.1.7" @@ -3117,9 +3129,9 @@ } }, "node_modules/hosted-git-info": { - "version": "2.8.8", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.8.tgz", - "integrity": "sha512-f/wzC2QaWBs7t9IYqB4T3sR1xviIViXJRJTWBlx2Gf3g0Xi5vI7Yy4koXQ1c9OYDGHN9sBy1DQ2AB8fqZBWhUg==", + "version": "2.8.9", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", + "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", "dev": true }, "node_modules/http-browserify": { @@ -4190,7 +4202,7 @@ "node_modules/minimatch": { "version": "2.0.10", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-2.0.10.tgz", - "integrity": "sha1-jQh8OcazjAAbl/ynzm0OHoCvusc=", + "integrity": "sha512-jQo6o1qSVLEWaw3l+bwYA2X0uLuK2KjNh2wjgO7Q/9UJnXr1Q3yQKR8BI0/Bt/rPg75e6SMW4hW/6cBHVTZUjA==", "deprecated": "Please update to minimatch 3.0.2 or higher to avoid a RegExp DoS issue", "dev": true, "dependencies": { @@ -4201,10 +4213,13 @@ } }, "node_modules/minimist": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", - "dev": true + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, "node_modules/mixin-deep": { "version": "1.3.2", @@ -4987,9 +5002,9 @@ "dev": true }, "node_modules/path-parse": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", - "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", "dev": true }, "node_modules/path-platform": { @@ -5604,9 +5619,9 @@ } }, "node_modules/rimraf/node_modules/minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, "dependencies": { "brace-expansion": "^1.1.7" @@ -5628,7 +5643,7 @@ "node_modules/ruglify": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/ruglify/-/ruglify-1.0.0.tgz", - "integrity": "sha1-3Ikw4qlUSidDAcyZcldMDQmGtnU=", + "integrity": "sha512-XfRj1YJdm/gnZNvmpQ5L+2YGRHglDGMPgJRbitgCxC3GzKVQF/t+ij1aNcNg2AnEXGtLHJDwoSWrAq3TUm0EVg==", "dev": true, "dependencies": { "rfile": "~1.0", @@ -5638,7 +5653,7 @@ "node_modules/ruglify/node_modules/uglify-js": { "version": "2.2.5", "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.2.5.tgz", - "integrity": "sha1-puAqcNg5eSuXgEiLe4sYTAlcmcc=", + "integrity": "sha512-viLk+/8G0zm2aKt1JJAVcz5J/5ytdiNaIsKgrre3yvSUjwVG6ZUujGH7E2TiPigZUwLYCe7eaIUEP2Zka2VJPA==", "dev": true, "dependencies": { "optimist": "~0.3.5", @@ -5654,7 +5669,7 @@ "node_modules/runforcover": { "version": "0.0.2", "resolved": "https://registry.npmjs.org/runforcover/-/runforcover-0.0.2.tgz", - "integrity": "sha1-NE8FfY1F0zrrxsyCIEZ49pxIV8w=", + "integrity": "sha512-yarCIK2HcAOadqnKW419+FA38qpWDCKcOr5RZU+jnyLL/hn3No9BHZY+YJDEzvQ0k8Oyl7ffLjZv9ZUxvyKoLQ==", "dev": true, "dependencies": { "bunker": "0.1.X" @@ -5699,9 +5714,9 @@ "dev": true }, "node_modules/semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", "dev": true, "bin": { "semver": "bin/semver" @@ -5781,7 +5796,7 @@ "node_modules/shell-quote": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-0.0.1.tgz", - "integrity": "sha1-GkEZbzwDM8SCMjWT1ohuzxU92YY=", + "integrity": "sha512-uEWz7wa9vnCi9w4mvKZMgbHFk3DCKjLQlZcy0tJxUH4NwZjRrPPHXAYIEt2TmJs600Dcgj0Z3fZLZKVPVdGNbQ==", "dev": true, "engines": { "node": "*" @@ -6319,7 +6334,7 @@ "node_modules/tap": { "version": "0.4.13", "resolved": "https://registry.npmjs.org/tap/-/tap-0.4.13.tgz", - "integrity": "sha1-OYYTTWdZcn/CIj5hEm7rhyQ6zLw=", + "integrity": "sha512-DRPT9T2qqeUQ9nC8nwnZPQQnKA+bVhzaNrIDoFETFqWLXGOvil/JMhuWj5uO6XeNzIdvvPKLqPHQzIkJnjNnDQ==", "dev": true, "dependencies": { "buffer-equal": "~0.0.0", @@ -6352,7 +6367,7 @@ "node_modules/tap/node_modules/glob": { "version": "3.2.11", "resolved": "https://registry.npmjs.org/glob/-/glob-3.2.11.tgz", - "integrity": "sha1-Spc/Y1uRkPcV0QmH1cAP0oFevj0=", + "integrity": "sha512-hVb0zwEZwC1FXSKRPFTeOtN7AArJcJlI6ULGLtrstaswKNlrTJqAA+1lYlSUop4vjA423xlBzqfVS3iWGlqJ+g==", "dev": true, "dependencies": { "inherits": "2", @@ -6365,7 +6380,7 @@ "node_modules/tap/node_modules/minimatch": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-0.3.0.tgz", - "integrity": "sha1-J12O2qxPG7MyZHIInnlJyDlGmd0=", + "integrity": "sha512-WFX1jI1AaxNTZVOHLBVazwTWKaQjoykSzCBNXB72vDTCzopQGtyP91tKdFK5cv1+qMwPyiTu1HqUriqplI8pcA==", "deprecated": "Please update to minimatch 3.0.2 or higher to avoid a RegExp DoS issue", "dev": true, "dependencies": { @@ -6698,7 +6713,7 @@ "node_modules/umd": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/umd/-/umd-2.1.0.tgz", - "integrity": "sha1-SmMHt2LxfwLSAbX6FU5nM5bCY88=", + "integrity": "sha512-mEAJeceExHnblcAwN3BQtDPYOrTy4ALeBh6nQ9KW0cUCd0UU714jAfil2jvq09b67IizwJIiTVFOjE+/52Dyvw==", "dev": true, "dependencies": { "rfile": "~1.0.0", @@ -6740,7 +6755,7 @@ "node_modules/umd/node_modules/uglify-js": { "version": "2.4.24", "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.4.24.tgz", - "integrity": "sha1-+tV1XB4Vd2WLsG/5q25UjJW+vW4=", + "integrity": "sha512-tktIjwackfZLd893KGJmXc1hrRHH1vH9Po3xFh1XBjjeGAnN02xJ3SuoA+n1L29/ZaCA18KzCFlckS+vfPugiA==", "dev": true, "dependencies": { "async": "~0.2.6", @@ -8005,9 +8020,9 @@ } }, "bn.js": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.0.tgz", - "integrity": "sha512-D7iWRBvnZE8ecXiLj/9wbxH7Tk79fAh8IHaTNq1RWRixsS02W+5qS+iE9yq6RYl0asXx5tw0bLhmT5pIfbSquw==", + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz", + "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==", "dev": true }, "brace-expansion": { @@ -8047,7 +8062,7 @@ "browser-pack": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/browser-pack/-/browser-pack-3.2.0.tgz", - "integrity": "sha1-+qHLxBSHsazEdH43PhFIrf/Q4tk=", + "integrity": "sha512-BHla5EbbxjNyLMFUMamVjeTY+q1QwHbrYNXlWOkw71QcBqAQF7maJyNh3OI/V0d5YyNdMYD6tiPhJB9ukBo99Q==", "dev": true, "requires": { "combine-source-map": "~0.3.0", @@ -8102,7 +8117,7 @@ "browserify": { "version": "8.1.3", "resolved": "https://registry.npmjs.org/browserify/-/browserify-8.1.3.tgz", - "integrity": "sha1-8zpUmjpsNoIZsHX9z+bfGV4Empo=", + "integrity": "sha512-0KKOkCQXCvP64qm73CtESE92pVnB5MkjA2W/Tmf+S4uPHVY4/SeCwO7wdr4mkke5ySoVyMqsOcMa5zo6uh9c9A==", "dev": true, "requires": { "assert": "~1.3.0", @@ -8204,26 +8219,26 @@ } }, "browserify-sign": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.2.1.tgz", - "integrity": "sha512-/vrA5fguVAKKAVTNJjgSm1tRQDHUU6DbwO9IROu/0WAzC8PKhucDSh18J0RMvVeHAn5puMd+QHC2erPRNf8lmg==", + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.2.2.tgz", + "integrity": "sha512-1rudGyeYY42Dk6texmv7c4VcQ0EsvVbLwZkA+AQB7SxvXxmcD93jcHie8bzecJ+ChDlmAm2Qyu0+Ccg5uhZXCg==", "dev": true, "requires": { - "bn.js": "^5.1.1", - "browserify-rsa": "^4.0.1", + "bn.js": "^5.2.1", + "browserify-rsa": "^4.1.0", "create-hash": "^1.2.0", "create-hmac": "^1.1.7", - "elliptic": "^6.5.3", + "elliptic": "^6.5.4", "inherits": "^2.0.4", - "parse-asn1": "^5.1.5", - "readable-stream": "^3.6.0", - "safe-buffer": "^5.2.0" + "parse-asn1": "^5.1.6", + "readable-stream": "^3.6.2", + "safe-buffer": "^5.2.1" }, "dependencies": { "readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", "dev": true, "requires": { "inherits": "^2.0.3", @@ -8297,7 +8312,7 @@ "bunker": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/bunker/-/bunker-0.1.2.tgz", - "integrity": "sha1-yImSRkqOKm7ehpMDdfkrWAd++Xw=", + "integrity": "sha512-YnahkcXBNT522S46k5LUA9P18lzvgkunbMl0qIJQ8oeRMQ+dAg3YI3k32q5TnO+AAUErFHO6R768To6jslgYmQ==", "dev": true, "requires": { "burrito": ">=0.2.5 <0.3" @@ -8306,7 +8321,7 @@ "burrito": { "version": "0.2.12", "resolved": "https://registry.npmjs.org/burrito/-/burrito-0.2.12.tgz", - "integrity": "sha1-0NbmrIHV6ZeJxvpKzLCwAx6lT2s=", + "integrity": "sha512-ZhhT5iVTAgzQ+s8rily7m45Swxe/cU3dVCHTzqmHVWD/cc0Ds3W4Q4MExbkevY+fm0Me3lEwpehIy6TH7p+ehw==", "dev": true, "requires": { "traverse": "~0.5.1", @@ -8322,7 +8337,7 @@ "uglify-js": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-1.1.1.tgz", - "integrity": "sha1-7nGpfEzv0GoamyBDfzQRiYKqA1s=", + "integrity": "sha512-YYY9Dle1leC+btgrHnAR05eq0aRdcPJsXlYYD+SYw2lqc5HFuFNHg3wWEW4SNE0iXXEUl0fz43gTQ3r1YK76rg==", "dev": true } } @@ -8665,13 +8680,21 @@ "dev": true }, "copy-props": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/copy-props/-/copy-props-2.0.4.tgz", - "integrity": "sha512-7cjuUME+p+S3HZlbllgsn2CDwS+5eCCX16qBgNC4jgSTf49qR1VKy/Zhl400m0IQXl/bPGEVqncgUUMjrr4s8A==", + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/copy-props/-/copy-props-2.0.5.tgz", + "integrity": "sha512-XBlx8HSqrT0ObQwmSzM7WE5k8FxTV75h1DX1Z3n6NhQ/UYYAvInWYmG06vFt7hQZArE2fuO62aihiWIVQwh1sw==", "dev": true, "requires": { - "each-props": "^1.3.0", - "is-plain-object": "^2.0.1" + "each-props": "^1.3.2", + "is-plain-object": "^5.0.0" + }, + "dependencies": { + "is-plain-object": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", + "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==", + "dev": true + } } }, "core-util-is": { @@ -8776,9 +8799,9 @@ "dev": true }, "decode-uri-component": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", - "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.2.tgz", + "integrity": "sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==", "dev": true }, "deep-equal": { @@ -9552,7 +9575,7 @@ "glob": { "version": "4.5.3", "resolved": "https://registry.npmjs.org/glob/-/glob-4.5.3.tgz", - "integrity": "sha1-xstz0yJsHv7wTePFbQEvAzd+4V8=", + "integrity": "sha512-I0rTWUKSZKxPSIAIaqhSXTM/DiII6wame+rEC3cFA5Lqmr9YmdL7z6Hj9+bdWtTvoY1Su4/OiMLmb37Y7JzvJQ==", "dev": true, "requires": { "inflight": "^1.0.4", @@ -9564,7 +9587,7 @@ "glob-parent": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", - "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", + "integrity": "sha512-E8Ak/2+dZY6fnzlR7+ueWvhsH1SjHr4jjss4YS/h4py44jY9MhK/VFdaZJAWDz6BbL21KeteKxFSFpq8OS5gVA==", "dev": true, "requires": { "is-glob": "^3.1.0", @@ -9585,7 +9608,7 @@ "glob-stream": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/glob-stream/-/glob-stream-6.1.0.tgz", - "integrity": "sha1-cEXJlBOz65SIjYOrRtC0BMx73eQ=", + "integrity": "sha512-uMbLGAP3S2aDOHUDfdoYcdIePUCfysbAd0IAoWVZbeGU/oNQ8asHVSshLDJUPWxfzj8zsCG7/XeHPHTtow0nsw==", "dev": true, "requires": { "extend": "^3.0.0", @@ -9621,9 +9644,9 @@ "dev": true }, "minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, "requires": { "brace-expansion": "^1.1.7" @@ -10201,9 +10224,9 @@ } }, "hosted-git-info": { - "version": "2.8.8", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.8.tgz", - "integrity": "sha512-f/wzC2QaWBs7t9IYqB4T3sR1xviIViXJRJTWBlx2Gf3g0Xi5vI7Yy4koXQ1c9OYDGHN9sBy1DQ2AB8fqZBWhUg==", + "version": "2.8.9", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", + "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", "dev": true }, "http-browserify": { @@ -11104,16 +11127,16 @@ "minimatch": { "version": "2.0.10", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-2.0.10.tgz", - "integrity": "sha1-jQh8OcazjAAbl/ynzm0OHoCvusc=", + "integrity": "sha512-jQo6o1qSVLEWaw3l+bwYA2X0uLuK2KjNh2wjgO7Q/9UJnXr1Q3yQKR8BI0/Bt/rPg75e6SMW4hW/6cBHVTZUjA==", "dev": true, "requires": { "brace-expansion": "^1.0.0" } }, "minimist": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", "dev": true }, "mixin-deep": { @@ -11780,9 +11803,9 @@ "dev": true }, "path-parse": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", - "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", "dev": true }, "path-platform": { @@ -12299,9 +12322,9 @@ } }, "minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, "requires": { "brace-expansion": "^1.1.7" @@ -12322,7 +12345,7 @@ "ruglify": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/ruglify/-/ruglify-1.0.0.tgz", - "integrity": "sha1-3Ikw4qlUSidDAcyZcldMDQmGtnU=", + "integrity": "sha512-XfRj1YJdm/gnZNvmpQ5L+2YGRHglDGMPgJRbitgCxC3GzKVQF/t+ij1aNcNg2AnEXGtLHJDwoSWrAq3TUm0EVg==", "dev": true, "requires": { "rfile": "~1.0", @@ -12332,7 +12355,7 @@ "uglify-js": { "version": "2.2.5", "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.2.5.tgz", - "integrity": "sha1-puAqcNg5eSuXgEiLe4sYTAlcmcc=", + "integrity": "sha512-viLk+/8G0zm2aKt1JJAVcz5J/5ytdiNaIsKgrre3yvSUjwVG6ZUujGH7E2TiPigZUwLYCe7eaIUEP2Zka2VJPA==", "dev": true, "requires": { "optimist": "~0.3.5", @@ -12344,7 +12367,7 @@ "runforcover": { "version": "0.0.2", "resolved": "https://registry.npmjs.org/runforcover/-/runforcover-0.0.2.tgz", - "integrity": "sha1-NE8FfY1F0zrrxsyCIEZ49pxIV8w=", + "integrity": "sha512-yarCIK2HcAOadqnKW419+FA38qpWDCKcOr5RZU+jnyLL/hn3No9BHZY+YJDEzvQ0k8Oyl7ffLjZv9ZUxvyKoLQ==", "dev": true, "requires": { "bunker": "0.1.X" @@ -12372,9 +12395,9 @@ "dev": true }, "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", "dev": true }, "semver-greatest-satisfied-range": { @@ -12439,7 +12462,7 @@ "shell-quote": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-0.0.1.tgz", - "integrity": "sha1-GkEZbzwDM8SCMjWT1ohuzxU92YY=", + "integrity": "sha512-uEWz7wa9vnCi9w4mvKZMgbHFk3DCKjLQlZcy0tJxUH4NwZjRrPPHXAYIEt2TmJs600Dcgj0Z3fZLZKVPVdGNbQ==", "dev": true }, "sigmund": { @@ -12904,7 +12927,7 @@ "tap": { "version": "0.4.13", "resolved": "https://registry.npmjs.org/tap/-/tap-0.4.13.tgz", - "integrity": "sha1-OYYTTWdZcn/CIj5hEm7rhyQ6zLw=", + "integrity": "sha512-DRPT9T2qqeUQ9nC8nwnZPQQnKA+bVhzaNrIDoFETFqWLXGOvil/JMhuWj5uO6XeNzIdvvPKLqPHQzIkJnjNnDQ==", "dev": true, "requires": { "buffer-equal": "~0.0.0", @@ -12928,7 +12951,7 @@ "glob": { "version": "3.2.11", "resolved": "https://registry.npmjs.org/glob/-/glob-3.2.11.tgz", - "integrity": "sha1-Spc/Y1uRkPcV0QmH1cAP0oFevj0=", + "integrity": "sha512-hVb0zwEZwC1FXSKRPFTeOtN7AArJcJlI6ULGLtrstaswKNlrTJqAA+1lYlSUop4vjA423xlBzqfVS3iWGlqJ+g==", "dev": true, "requires": { "inherits": "2", @@ -12938,7 +12961,7 @@ "minimatch": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-0.3.0.tgz", - "integrity": "sha1-J12O2qxPG7MyZHIInnlJyDlGmd0=", + "integrity": "sha512-WFX1jI1AaxNTZVOHLBVazwTWKaQjoykSzCBNXB72vDTCzopQGtyP91tKdFK5cv1+qMwPyiTu1HqUriqplI8pcA==", "dev": true, "requires": { "lru-cache": "2", @@ -13233,7 +13256,7 @@ "umd": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/umd/-/umd-2.1.0.tgz", - "integrity": "sha1-SmMHt2LxfwLSAbX6FU5nM5bCY88=", + "integrity": "sha512-mEAJeceExHnblcAwN3BQtDPYOrTy4ALeBh6nQ9KW0cUCd0UU714jAfil2jvq09b67IizwJIiTVFOjE+/52Dyvw==", "dev": true, "requires": { "rfile": "~1.0.0", @@ -13266,7 +13289,7 @@ "uglify-js": { "version": "2.4.24", "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.4.24.tgz", - "integrity": "sha1-+tV1XB4Vd2WLsG/5q25UjJW+vW4=", + "integrity": "sha512-tktIjwackfZLd893KGJmXc1hrRHH1vH9Po3xFh1XBjjeGAnN02xJ3SuoA+n1L29/ZaCA18KzCFlckS+vfPugiA==", "dev": true, "requires": { "async": "~0.2.6", From 0d4d50a48c8e39c3bb4b2d5abbca158c7e158075 Mon Sep 17 00:00:00 2001 From: anvaka Date: Thu, 14 Dec 2023 20:01:35 -0800 Subject: [PATCH 42/49] rebuild --- dist/vivagraph.js | 20 +++----------------- dist/vivagraph.min.js | 4 +--- 2 files changed, 4 insertions(+), 20 deletions(-) diff --git a/dist/vivagraph.js b/dist/vivagraph.js index 8124757..727b7a2 100644 --- a/dist/vivagraph.js +++ b/dist/vivagraph.js @@ -3881,7 +3881,7 @@ function dragndrop(element) { } e.returnValue = false; - var delta, + var delta = -e.deltaY, mousePos = getMousePos(e), elementOffset = findElementPosition(element), relMousePos = { @@ -3889,29 +3889,15 @@ function dragndrop(element) { y: mousePos[1] - elementOffset[1] }; - if (e.wheelDelta) { - delta = e.wheelDelta / 360; // Chrome/Safari - } else { - delta = e.detail / -9; // Mozilla - } - scroll(e, delta, relMousePos); }, updateScrollEvents = function (scrollCallback) { if (!scroll && scrollCallback) { // client is interested in scrolling. Start listening to events: - if (browserInfo.browser === 'webkit') { - element.addEventListener('mousewheel', handleMouseWheel, false); // Chrome/Safari - } else { - element.addEventListener('DOMMouseScroll', handleMouseWheel, false); // Others - } + element.addEventListener('wheel', handleMouseWheel, false); } else if (scroll && !scrollCallback) { - if (browserInfo.browser === 'webkit') { - element.removeEventListener('mousewheel', handleMouseWheel, false); // Chrome/Safari - } else { - element.removeEventListener('DOMMouseScroll', handleMouseWheel, false); // Others - } + element.removeEventListener('wheel', handleMouseWheel, false); } scroll = scrollCallback; diff --git a/dist/vivagraph.min.js b/dist/vivagraph.min.js index 6872ddd..b73a6f0 100644 --- a/dist/vivagraph.min.js +++ b/dist/vivagraph.min.js @@ -1,3 +1 @@ -!function(e){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=e();else if("function"==typeof define&&define.amd)define([],e);else{var n;"undefined"!=typeof window?n=window:"undefined"!=typeof global?n=global:"undefined"!=typeof self&&(n=self),n.Viva=e()}}(function(){return function e(n,t,r){function o(a,u){if(!t[a]){if(!n[a]){var s="function"==typeof require&&require;if(!u&&s)return s(a,!0);if(i)return i(a,!0);var f=new Error("Cannot find module '"+a+"'");throw f.code="MODULE_NOT_FOUND",f}var c=t[a]={exports:{}};n[a][0].call(c.exports,function(e){var t=n[a][1][e];return o(t?t:e)},c,c.exports,e,n,t,r)}return t[a].exports}for(var i="function"==typeof require&&require,a=0;a=0==m>=4?null:(f=u-i,d=o-a,p=a*i-o*u,v=f*e+d*n+p,h=f*t+d*r+p,0!==v&&0!==h&&v>=0==h>=0?null:(y=s*d-f*c,0===y?null:(x=y<0?-y/2:y/2,x=0,w=c*p-d*l,b.x=(w<0?w-x:w+x)/y,w=f*l-s*p,b.y=(w<0?w-x:w+x)/y,b)))}n.exports=r},{}],4:[function(e,n,t){n.exports.degree=e("./src/degree.js"),n.exports.betweenness=e("./src/betweenness.js"),n.exports.closeness=e("./src/closeness.js"),n.exports.eccentricity=e("./src/eccentricity.js")},{"./src/betweenness.js":5,"./src/closeness.js":6,"./src/degree.js":7,"./src/eccentricity.js":8}],5:[function(e,n,t){function r(e,n){function t(e){h[e]/=2}function r(e){h[e.id]=0}function o(e){s=e.id,u(s),i()}function i(){for(e.forEachNode(a);c.length;){for(var n=c.pop(),t=(1+v[n])/p[n],r=d[n],o=0;o0?f[a]=(n-1)/t:f[a]=0}function i(t){function r(e){var n=e.id;s[n]=-1}function o(e){var n=e.id;s[n]===-1&&(s[n]=s[i]+1,u.push(n))}for(e.forEachNode(r),s[t]=0,u.push(t);u.length;){var i=u.shift();e.forEachLinkedNode(i,o,n)}}var a,u=[],s=Object.create(null),f=Object.create(null);return e.forEachNode(t),e.forEachNode(r),f}n.exports=r},{}],7:[function(e,n,t){function r(e,n){function t(n){var t=e.getLinks(n.id);u[n.id]=r(t,n.id)}var r,u=Object.create(null);if(n=(n||"both").toLowerCase(),"both"===n||"inout"===n)r=a;else if("in"===n)r=o;else{if("out"!==n)throw new Error("Expected centrality degree kind is: in, out or both");r=i}return e.forEachNode(t),u}function o(e,n){var t=0;if(!e)return t;for(var r=0;r1&&(o=Array.prototype.splice.call(arguments,1));for(var i=0;i0&&i.addLink(a,r-1+o*e),o>0&&i.addLink(a,r+(o-1)*e)}return i}function s(e,t,r){if(e<1||t<1||r<1)throw new Error("Invalid number of nodes in grid3 graph");var o,i,a,u=n();if(1===e&&1===t&&1===r)return u.addNode(0),u;for(a=0;a0&&u.addLink(f,o-1+i*e+s),i>0&&u.addLink(f,o+(i-1)*e+s),a>0&&u.addLink(f,o+i*e+(a-1)*e*t)}return u}function f(e){if(e<0)throw new Error("Invalid number of nodes in balanced tree");var t,r=n(),o=Math.pow(2,e);for(0===e&&r.addNode(1),t=1;t= 0");var t,r=n();for(t=0;t0&&o.addLink(i*t,i*t-1);return o.addLink(0,o.getNodesCount()-1),o}function l(t,r,o,i){if(r>=t)throw new Error("Choose smaller `k`. It cannot be larger than number of nodes `n`");var a,u,s=e("ngraph.random").random(i||42),f=n();for(a=0;a=1||0===e);return n*Math.sqrt(-2*Math.log(e)/e)}function a(){var e=this.seed;return e=e+2127912214+(e<<12)&4294967295,e=4294967295&(3345072700^e^e>>>19),e=e+374761393+(e<<5)&4294967295,e=4294967295&(e+3550635116^e<<9),e=e+4251993797+(e<<3)&4294967295,e=4294967295&(3042594569^e^e>>>16),this.seed=e,(268435455&e)/268435456}function u(e){return Math.floor(this.nextDouble()*e)}function s(e,n){function t(){var n,t,r;for(n=e.length-1;n>0;--n)t=i.next(n+1),r=e[t],e[t]=e[n],e[n]=r;return e}function o(n){var t,r,o;for(t=e.length-1;t>0;--t)r=i.next(t+1),o=e[r],e[r]=e[t],e[t]=o,n(o);e.length&&n(e[0])}var i=n||r();if("function"!=typeof i.next)throw new Error("customRandom does not match expected API: next() function is missing");return{forEach:o,shuffle:t}}n.exports=r,n.exports.random=r,n.exports.randomIterator=s,o.prototype.next=u,o.prototype.nextDouble=a,o.prototype.uniform=a,o.prototype.gaussian=i},{}],16:[function(e,n,t){function r(e){function n(){function e(){return q.beginUpdate=F=k,q.endUpdate=G=P,B=t,O=r,q.on=n,n.apply(q,arguments)}var n=q.on;q.on=e}function t(e,n){R.push({link:e,changeType:n})}function r(e,n){R.push({node:e,changeType:n})}function c(e,n){if(void 0===e)throw new Error("Invalid node identifier");F();var t=d(e);return t?(t.data=n,O(t,"update")):(t=new i(e,n),S++,O(t,"add")),I[e]=t,G(),t}function d(e){return I[e]}function l(e){var n=d(e);if(!n)return!1;F();var t=n.links;if(t){n.links=null;for(var r=0;r=0&&t.links.splice(n,1)),r&&(n=o(e,r.links),n>=0&&r.links.splice(n,1)),B(e,"remove"),G(),!0}function y(e,n){var t,r=d(e);if(!r||!r.links)return null;for(t=0;t0&&(q.fire("changed",R),R.length=0)}function j(){return Object.keys?A:_}function A(e){if("function"==typeof e)for(var n=Object.keys(I),t=0;t=0?i:-1,o);return v.push(a),a},getTotalMovement:function(){return w},removeSpring:function(e){if(e){var n=v.indexOf(e);return n>-1?(v.splice(n,1),!0):void 0}},getBestNewBodyPosition:function(e){return g.getBestNewPosition(e)},getBBox:function(){return x&&(g.update(),x=!1),g.box},invalidateBBox:function(){x=!0},gravity:function(e){return void 0!==e?(n.gravity=e,h.options({gravity:e}),this):n.gravity},theta:function(e){return void 0!==e?(n.theta=e,h.options({theta:e}),this):n.theta}};return o(n,b),a(b),b}n.exports=r},{"./lib/bounds":20,"./lib/createBody":21,"./lib/dragForce":22,"./lib/eulerIntegrator":23,"./lib/spring":24,"./lib/springForce":25,"ngraph.events":9,"ngraph.expose":10,"ngraph.merge":17,"ngraph.quadtreebh":26}],20:[function(e,n,t){n.exports=function(n,t){function r(){var e=n.length;if(0!==e){for(var t=Number.MAX_VALUE,r=Number.MAX_VALUE,o=Number.MIN_VALUE,a=Number.MIN_VALUE;e--;){var u=n[e];u.isPinned?(u.pos.x=u.prevPos.x,u.pos.y=u.prevPos.y):(u.prevPos.x=u.pos.x,u.prevPos.y=u.pos.y),u.pos.xo&&(o=u.pos.x),u.pos.ya&&(a=u.pos.y)}i.x1=t,i.x2=o,i.y1=r,i.y2=a}}var o=e("ngraph.random").random(42),i={x1:0,y1:0,x2:0,y2:0};return{box:i,update:r,reset:function(){i.x1=i.y1=0,i.x2=i.y2=0},getBestNewPosition:function(e){var n=i,r=0,a=0;if(e.length){for(var u=0;u1&&(s.velocity.x=c/l,s.velocity.y=d/l),r=n*s.velocity.x,i=n*s.velocity.y,s.pos.x+=r,s.pos.y+=i,o+=Math.abs(r),a+=Math.abs(i)}return(o*o+a*a)/u}n.exports=r},{}],24:[function(e,n,t){function r(e,n,t,r,o){this.from=e,this.to=n,this.length=t,this.coeff=r,this.weight="number"==typeof o?o:1}n.exports=r},{}],25:[function(e,n,t){n.exports=function(n){var t=e("ngraph.merge"),r=e("ngraph.random").random(42),o=e("ngraph.expose");n=t(n,{springCoeff:2e-4,springLength:80});var i={update:function(e){var t=e.from,o=e.to,i=e.length<0?n.springLength:e.length,a=o.pos.x-t.pos.x,u=o.pos.y-t.pos.y,s=Math.sqrt(a*a+u*u);0===s&&(a=(r.nextDouble()-.5)/50,u=(r.nextDouble()-.5)/50,s=Math.sqrt(a*a+u*u));var f=s-i,c=(!e.coeff||e.coeff<0?n.springCoeff:e.coeff)*f/s*e.weight;t.force.x+=c*a,t.force.y+=c*u,o.force.x-=c*a,o.force.y-=c*u}};return o(n,i,["springCoeff","springLength"]),i}},{"ngraph.expose":10,"ngraph.merge":17,"ngraph.random":30}],26:[function(e,n,t){function r(e,n){return 0===n?e.quad0:1===n?e.quad1:2===n?e.quad2:3===n?e.quad3:null}function o(e,n,t){0===n?e.quad0=t:1===n?e.quad1=t:2===n?e.quad2=t:3===n&&(e.quad3=t)}n.exports=function(n){function t(){var e=g[m];return e?(e.quad0=null,e.quad1=null,e.quad2=null,e.quad3=null,e.body=null,e.mass=e.massX=e.massY=0,e.left=e.right=e.top=e.bottom=0):(e=new f,g[m]=e),++m,e}function i(e){var n,t,r,o,i=p,a=0,u=0,f=1,c=0,d=1;for(i[0]=y;f;){var v=i[c],g=v.body;f-=1,c+=1;var m=g!==e;g&&m?(t=g.pos.x-e.pos.x,r=g.pos.y-e.pos.y,o=Math.sqrt(t*t+r*r),0===o&&(t=(s.nextDouble()-.5)/50,r=(s.nextDouble()-.5)/50,o=Math.sqrt(t*t+r*r)),n=l*g.mass*e.mass/(o*o*o),a+=n*t,u+=n*r):m&&(t=v.massX/v.mass-e.pos.x,r=v.massY/v.mass-e.pos.y,o=Math.sqrt(t*t+r*r),0===o&&(t=(s.nextDouble()-.5)/50,r=(s.nextDouble()-.5)/50,o=Math.sqrt(t*t+r*r)),(v.right-v.left)/oi&&(i=f),ca&&(a=c)}var d=i-r,l=a-o;for(d>l?a=o+d:i=r+l,m=0,y=t(),y.left=r,y.right=i,y.top=o,y.bottom=a,n=s-1,n>=0&&(y.body=e[n]);n--;)u(e[n],y)}function u(e){for(v.reset(),v.push(y,e);!v.isEmpty();){var n=v.pop(),i=n.node,a=n.body;if(i.body){var u=i.body;if(i.body=null,d(u.pos,a.pos)){var f=3;do{var c=s.nextDouble(),l=(i.right-i.left)*c,p=(i.bottom-i.top)*c;u.pos.x=i.left+l,u.pos.y=i.top+p,f-=1}while(f>0&&d(u.pos,a.pos));if(0===f&&d(u.pos,a.pos))return}v.push(i,u),v.push(i,a)}else{var h=a.pos.x,g=a.pos.y;i.mass=i.mass+a.mass,i.massX=i.massX+a.mass*h,i.massY=i.massY+a.mass*g;var m=0,x=i.left,w=(i.right+x)/2,b=i.top,E=(i.bottom+b)/2;h>w&&(m+=1,x=w,w=i.right),g>E&&(m+=2,b=E,E=i.bottom);var L=r(i,m);L?v.push(L,a):(L=t(),L.left=x,L.top=b,L.right=w,L.bottom=E,L.body=a,o(i,m,L))}}}n=n||{},n.gravity="number"==typeof n.gravity?n.gravity:-1,n.theta="number"==typeof n.theta?n.theta:.8;var s=e("ngraph.random").random(1984),f=e("./node"),c=e("./insertStack"),d=e("./isSamePosition"),l=n.gravity,p=[],v=new c,h=n.theta,g=[],m=0,y=t();return{insertBodies:a,getRoot:function(){return y},updateBodyForce:i,options:function(e){return e?("number"==typeof e.gravity&&(l=e.gravity),"number"==typeof e.theta&&(h=e.theta),this):{gravity:l,theta:h}}}}},{"./insertStack":27,"./isSamePosition":28,"./node":29,"ngraph.random":30}],27:[function(e,n,t){function r(){this.stack=[],this.popIdx=0}function o(e,n){this.node=e,this.body=n}n.exports=r,r.prototype={isEmpty:function(){return 0===this.popIdx},push:function(e,n){var t=this.stack[this.popIdx];t?(t.node=e,t.body=n):this.stack[this.popIdx]=new o(e,n),++this.popIdx},pop:function(){if(this.popIdx>0)return this.stack[--this.popIdx]},reset:function(){this.popIdx=0}}},{}],28:[function(e,n,t){n.exports=function(e,n){var t=Math.abs(e.x-n.x),r=Math.abs(e.y-n.y);return t<1e-8&&r<1e-8}},{}],29:[function(e,n,t){n.exports=function(){this.body=null,this.quad0=null,this.quad1=null,this.quad2=null,this.quad3=null,this.mass=0,this.massX=0,this.massY=0,this.left=0,this.top=0,this.bottom=0,this.right=0}},{}],30:[function(e,n,t){function r(e){var n="number"==typeof e?e:+new Date,t=function(){return n=n+2127912214+(n<<12)&4294967295,n=4294967295&(3345072700^n^n>>>19),n=n+374761393+(n<<5)&4294967295,n=4294967295&(n+3550635116^n<<9),n=n+4251993797+(n<<3)&4294967295,n=4294967295&(3042594569^n^n>>>16),(268435455&n)/268435456};return{next:function(e){return Math.floor(t()*e)},nextDouble:function(){return t()}}}function o(e,n){var t=n||r();if("function"!=typeof t.next)throw new Error("customRandom does not match expected API: next() function is missing");return{forEach:function(n){var r,o,i;for(r=e.length-1;r>0;--r)o=t.next(r+1),i=e[o],e[o]=e[r],e[r]=i,n(i);e.length&&n(e[0])},shuffle:function(){var n,r,o;for(n=e.length-1;n>0;--n)r=t.next(n+1),o=e[r],e[r]=e[n],e[n]=o;return e}}}n.exports={random:r,randomIterator:o}},{}],31:[function(e,n,t){function r(e,n,t){function r(e){u.nodes.push(s(e))}function o(e){u.links.push(f(e))}function i(e){var n={id:e.id};return void 0!==e.data&&(n.data=e.data),n}function a(e){var n={fromId:e.fromId,toId:e.toId};return void 0!==e.data&&(n.data=e.data),n}var u={nodes:[],links:[]},s=n||i,f=t||a;return e.forEachNode(r),e.forEachLink(o),JSON.stringify(u)}n.exports=r},{}],32:[function(e,n,t){function r(e,n){var t=o(e);if(void 0===n)return t;for(var r=Object.keys(n),i=0;iv&&(r=1),u(e,r,{x:e.touches[0].clientX,y:e.touches[0].clientY}),v=t,m(e),y(e)}},j=function(e){p=!1,o.off("touchmove",P),o.off("touchend",j),o.off("touchcancel",j),c=null,r&&r(e)},A=function(e,t){m(e),y(e),d=t.clientX,l=t.clientY,c=e.target||e.srcElement,n&&n(e,{x:d,y:l}),p||(p=!0,o.on("touchmove",P),o.on("touchend",j),o.on("touchcancel",j))},_=function(e){return 1===e.touches.length?A(e,e.touches[0]):void(2===e.touches.length&&(m(e),y(e),v=k(e.touches[0],e.touches[1])))};return e.addEventListener("mousedown",b),e.addEventListener("touchstart",_),{onStart:function(e){return n=e,this},onDrag:function(e){return t=e,this},onStop:function(e){return r=e,this},onScroll:function(e){return N(e),this},release:function(){e.removeEventListener("mousedown",b),e.removeEventListener("touchstart",_),o.off("mousemove",w),o.off("mouseup",E),o.off("touchmove",P),o.off("touchend",j),o.off("touchcancel",j),N(null)}}}n.exports=r;var o=e("../Utils/documentEvents.js"),i=e("../Utils/browserInfo.js"),a=e("../Utils/findElementPosition.js")},{"../Utils/browserInfo.js":43,"../Utils/documentEvents.js":44,"../Utils/findElementPosition.js":45}],40:[function(e,n,t){function r(e,n){var t=o(n),r=null,i={},a={x:0,y:0};return t.mouseDown(function(e,n){r=e,a.x=n.clientX,a.y=n.clientY,t.mouseCapture(r);var o=i[e.id];return o&&o.onStart&&o.onStart(n,a),!0}).mouseUp(function(e){t.releaseMouseCapture(r),r=null;var n=i[e.id];return n&&n.onStop&&n.onStop(),!0}).mouseMove(function(e,n){if(r){var t=i[r.id];return t&&t.onDrag&&t.onDrag(n,{x:n.clientX-a.x,y:n.clientY-a.y}),a.x=n.clientX,a.y=n.clientY,!0}}),{bindDragNDrop:function(e,n){i[e.id]=n,n||delete i[e.id]}}}n.exports=r;var o=e("../WebGL/webglInputEvents.js")},{"../WebGL/webglInputEvents.js":61}],41:[function(e,n,t){function r(e,n){function t(e){return d[e]}n=o(n,{maxX:1024,maxY:1024,seed:"Deterministic randomness made me do this"});var r=i(n.seed),u=new a(Number.MAX_VALUE,Number.MAX_VALUE,Number.MIN_VALUE,Number.MIN_VALUE),s={},f=function(e){return{x:r.next(n.maxX),y:r.next(n.maxY)}},c=function(e,n){e.xn.x2&&(n.x2=e.x),e.yn.y2&&(n.y2=e.y)},d="function"==typeof Object.create?Object.create(null):{},l=function(e){d[e.id]=f(e),c(d[e.id],u)},p=function(){0!==e.getNodesCount()&&(u.x1=Number.MAX_VALUE,u.y1=Number.MAX_VALUE,u.x2=Number.MIN_VALUE,u.y2=Number.MIN_VALUE,e.forEachNode(l))},v=function(e){s[e.id]=e},h=function(e){for(var n=0;n=0:"boolean"!=typeof q||q}function r(){G=G||window.document.body,O=O||i(e,{springLength:80,springCoeff:2e-4}),F=F||a(e,{container:G}),n.hasOwnProperty("renderLinks")||(n.renderLinks=!0),n.prerender=n.prerender||0,U=(F.inputManager||s)(e,F)}function l(){F.beginRender(),n.renderLinks&&F.renderLinks(),F.renderNodes(),F.endRender()}function p(){return X=O.step()&&!V,l(),!X}function v(e){R||(R=void 0!==e?f(function(){if(e-=1,e<0){var n=!1;return n}return p()},M):f(p,M))}function h(){W||(X=!1,R.restart())}function g(){if("number"==typeof n.prerender&&n.prerender>0)for(var e=0;e0?n.insertBefore(r,n.firstChild):n.appendChild(r),r},releaseLink:function(e){var t=d[e.id];t&&(n.removeChild(t),delete d[e.id])},addNode:function(e,t){var r=l(e);if(r)return r.position=t,r.node=e,c[e.id]=r,n.appendChild(r),r},releaseNode:function(e){var t=c[e.id];t&&(n.removeChild(t),delete c[e.id])},renderNodes:function(){for(var e in c)if(c.hasOwnProperty(e)){var n=c[e];m.x=n.position.x,m.y=n.position.y,p(n,m,n.node)}},renderLinks:function(){for(var e in d)if(d.hasOwnProperty(e)){var n=d[e];y.x=n.position.from.x,y.y=n.position.from.y,x.x=n.position.to.x,x.y=n.position.to.y,h(n,y,x,n.link)}},getGraphicsRoot:function(e){return"function"==typeof e&&(t?e(t):r=e),t},getSvgRoot:function(){return t}};return i(b),b}n.exports=r;var o=e("simplesvg"),i=e("ngraph.events"),a=e("../Input/domInputManager.js")},{"../Input/domInputManager.js":38,"ngraph.events":9,simplesvg:32}],54:[function(e,n,t){function r(e){e=c(e,{enableBlending:!0,preserveDrawingBuffer:!1,clearColor:!1,clearColorValue:{r:1,g:1,b:1,a:1}});var n,t,r,d,l,p,v,h,g=0,m=0,y=[1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1],x=[],w=[],b={},E={},L=i(),N=a(),k=function(e){return u()},P=function(e){return s(3014898687)},j=function(){L.updateTransform(y),N.updateTransform(y)},A=function(){y=[1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1]},_=function(){n&&t&&(d=t.width=Math.max(n.offsetWidth,1),l=t.height=Math.max(n.offsetHeight,1),r&&r.viewport(0,0,d,l),L&&L.updateSize(d/2,l/2),N&&N.updateSize(d/2,l/2))},I=function(e){e.fire("rescaled")};t=window.document.createElement("canvas");var T={getLinkUI:function(e){return E[e]},getNodeUI:function(e){return b[e]},node:function(e){if("function"==typeof e)return k=e,this},link:function(e){if("function"==typeof e)return P=e,this},placeNode:function(e){return p=e,this},placeLink:function(e){return v=e,this},inputManager:o,beginRender:function(){},endRender:function(){m>0&&L.render(),g>0&&N.render()},bringLinkToFront:function(e){var n,t,r=L.getFrontLinkId();L.bringToFront(e),r>e.id&&(n=e.id,t=w[r],w[r]=w[n],w[r].id=r,w[n]=t,w[n].id=n)},graphCenterChanged:function(e,n){y[12]=2*e/d-1,y[13]=1-2*n/l,j()},addLink:function(e,n){var t=m++,r=P(e);return r.id=t,r.pos=n,L.createLink(r),w[t]=r,E[e.id]=r,r},addNode:function(e,n){var t=g++,r=k(e);return r.id=t,r.position=n,r.node=e,N.createNode(r),x[t]=r,b[e.id]=r,r},translateRel:function(e,n){y[12]+=2*y[0]*e/d/y[0],y[13]-=2*y[5]*n/l/y[5],j()},scale:function(e,n){var t=2*n.x/d-1,r=1-2*n.y/l;return t-=y[12],r-=y[13],y[12]+=t*(1-e),y[13]+=r*(1-e),y[0]*=e,y[5]*=e,j(),I(this),y[0]},resetScale:function(){return A(),r&&(_(),j()),this},updateSize:_,init:function(o){var i={};if(e.preserveDrawingBuffer&&(i.preserveDrawingBuffer=!0),n=o,_(),A(),n.appendChild(t),r=t.getContext("experimental-webgl",i),!r){var a="Could not initialize WebGL. Seems like the browser doesn't support it.";throw window.alert(a),a}if(e.enableBlending&&(r.blendFunc(r.SRC_ALPHA,r.ONE_MINUS_SRC_ALPHA),r.enable(r.BLEND)),e.clearColor){var u=e.clearColorValue;r.clearColor(u.r,u.g,u.b,u.a),this.beginRender=function(){r.clear(r.COLOR_BUFFER_BIT)}}L.load(r),L.updateSize(d/2,l/2),N.load(r),N.updateSize(d/2,l/2),j(),"function"==typeof h&&h(t)},release:function(e){t&&e&&e.removeChild(t)},isSupported:function(){var e=window.document.createElement("canvas"),n=e&&e.getContext&&e.getContext("experimental-webgl");return n},releaseLink:function(e){m>0&&(m-=1);var n=E[e.id];delete E[e.id],L.removeLink(n);var t=n.id;if(t0&&(g-=1);var n=b[e.id];delete b[e.id],N.removeNode(n);var t=n.id;if(te.length){var r=new Float32Array(e.length*t*2);return r.set(e),r}return e}function a(n,t){for(var r={},o=0;o=w.length&&s();var i=w[r.textureNumber];i.ctx.drawImage(n,r.col*g,r.row*g,g,g),b[e]=n.src,y[n.src]=o,i.isDirty=!0,t(o)}function c(n){var t=n/e<<0,r=n%e,o=r/h<<0,i=r%h;return{textureNumber:t,row:o,col:i}}function d(){E.isDirty=!0,x=0,v=null}function l(){v&&(window.clearTimeout(v),x+=1,v=null),x>10?d():v=window.setTimeout(d,400)}function p(e,n){var t=w[e.textureNumber].canvas,r=w[n.textureNumber].ctx,o=n.col*g,i=n.row*g;r.drawImage(t,e.col*g,e.row*g,g,g,o,i,g,g),w[e.textureNumber].isDirty=!0,w[n.textureNumber].isDirty=!0}var v,h=Math.sqrt(e||1024)<<0,g=h,m=1,y={},x=0,w=[],b=[];if(!o(e))throw"Tiles per texture should be power of two.";var E={isDirty:!1,clearDirty:n,remove:t,getTextures:r,getCoordinates:a,load:u};return E}function o(e){return 0===(e&e-1)}var i=e("./texture.js");n.exports=r},{"./texture.js":56}],59:[function(e,n,t){function r(e,n){return{_texture:0,_offset:0,size:"number"==typeof e?e:32,src:n}}n.exports=r},{}],60:[function(e,n,t){function r(e){function n(e,n){e.nativeObject&&m.deleteTexture(e.nativeObject);var t=m.createTexture();m.activeTexture(m["TEXTURE"+n]),m.bindTexture(m.TEXTURE_2D,t),m.texImage2D(m.TEXTURE_2D,0,m.RGBA,m.RGBA,m.UNSIGNED_BYTE,e.canvas),m.texParameteri(m.TEXTURE_2D,m.TEXTURE_MAG_FILTER,m.LINEAR),m.texParameteri(m.TEXTURE_2D,m.TEXTURE_MIN_FILTER,m.LINEAR_MIPMAP_NEAREST),m.generateMipmap(m.TEXTURE_2D),m.uniform1i(w["sampler"+n],n),e.nativeObject=t}function t(){if(h.isDirty){var e,t=h.getTextures();for(e=0;e0&&(A-=1),e.id0&&(e.src&&h.remove(e.src),x.copyArrayPart(_,e.id*k,A*k,k))}function d(e,n){n._offset=e._offset}function l(e){N=!0,L=e}function p(e,n){b=e,E=n,N=!0}function v(){m.useProgram(g),m.bindBuffer(m.ARRAY_BUFFER,y),m.bufferData(m.ARRAY_BUFFER,_,m.DYNAMIC_DRAW),N&&(N=!1,m.uniformMatrix4fv(w.transform,!1,L),m.uniform2f(w.screenSize,b,E)),m.vertexAttribPointer(w.vertexPos,2,m.FLOAT,!1,3*Float32Array.BYTES_PER_ELEMENT,0),m.vertexAttribPointer(w.customAttributes,1,m.FLOAT,!1,3*Float32Array.BYTES_PER_ELEMENT,8),t(),m.drawArrays(m.TRIANGLES,0,6*A)}var h,g,m,y,x,w,b,E,L,N,k=18,P=o(),j=i(),e=e||1024,A=0,_=new Float32Array(64);return{load:r,position:s,createNode:f,removeNode:c,replaceProperties:d,updateTransform:l,updateSize:p,render:v}}function o(){return["precision mediump float;","varying vec4 color;","varying vec3 vTextureCoord;","uniform sampler2D u_sampler0;","uniform sampler2D u_sampler1;","uniform sampler2D u_sampler2;","uniform sampler2D u_sampler3;","void main(void) {"," if (vTextureCoord.z == 0.) {"," gl_FragColor = texture2D(u_sampler0, vTextureCoord.xy);"," } else if (vTextureCoord.z == 1.) {"," gl_FragColor = texture2D(u_sampler1, vTextureCoord.xy);"," } else if (vTextureCoord.z == 2.) {"," gl_FragColor = texture2D(u_sampler2, vTextureCoord.xy);"," } else if (vTextureCoord.z == 3.) {"," gl_FragColor = texture2D(u_sampler3, vTextureCoord.xy);"," } else { gl_FragColor = vec4(0, 1, 0, 1); }","}"].join("\n")}function i(){return["attribute vec2 a_vertexPos;","attribute float a_customAttributes;","uniform vec2 u_screenSize;","uniform mat4 u_transform;","uniform float u_tilesPerTexture;","varying vec3 vTextureCoord;","void main(void) {"," gl_Position = u_transform * vec4(a_vertexPos/u_screenSize, 0, 1);","float corner = mod(a_customAttributes, 4.);","float tileIndex = mod(floor(a_customAttributes / 4.), u_tilesPerTexture);","float tilesPerRow = sqrt(u_tilesPerTexture);","float tileSize = 1./tilesPerRow;","float tileColumn = mod(tileIndex, tilesPerRow);","float tileRow = floor(tileIndex/tilesPerRow);","if(corner == 0.0) {"," vTextureCoord.xy = vec2(0, 1);","} else if(corner == 1.0) {"," vTextureCoord.xy = vec2(1, 1);","} else if(corner == 2.0) {"," vTextureCoord.xy = vec2(0, 0);","} else {"," vTextureCoord.xy = vec2(1, 0);","}","vTextureCoord *= tileSize;","vTextureCoord.x += tileColumn * tileSize;","vTextureCoord.y += tileRow * tileSize;","vTextureCoord.z = floor(floor(a_customAttributes / 4.)/u_tilesPerTexture);","}"].join("\n")}var a=e("./webglAtlas.js"),u=e("./webgl.js");n.exports=r},{"./webgl.js":57,"./webglAtlas.js":58}],61:[function(e,n,t){function r(e){function n(){x=null}function t(e){x=e}function r(e){return"function"==typeof e&&P.push(e),A}function i(e){return"function"==typeof e&&k.push(e),A}function a(e){return"function"==typeof e&&N.push(e),A}function u(e){return"function"==typeof e&&L.push(e),A}function s(e){return"function"==typeof e&&E.push(e),A}function f(e){return"function"==typeof e&&b.push(e),A}function c(e){return"function"==typeof e&&w.push(e),A}function d(e,n,t){if(e&&e.size){var r=e.position,o=e.size;return r.x-og.byteLength){var e=new ArrayBuffer(2*g.byteLength),n=new Float32Array(e),t=new Uint32Array(e);t.set(y),m=n,y=t,g=e}};return{load:function(a){n=a,r=o(a),e=r.createProgram(v,p),n.useProgram(e),i=r.getLocations(e,["a_vertexPos","a_color","u_screenSize","u_transform"]),n.enableVertexAttribArray(i.vertexPos),n.enableVertexAttribArray(i.color),t=n.createBuffer()},position:function(e,n,t){var r=e.id,o=r*d;m[o]=n.x,m[o+1]=n.y,y[o+2]=e.color,m[o+3]=t.x,m[o+4]=t.y,y[o+5]=e.color},createLink:function(e){x(),h+=1,a=e.id},removeLink:function(e){h>0&&(h-=1),e.id0&&r.copyArrayPart(y,e.id*d,h*d,d)},updateTransform:function(e){c=!0,f=e},updateSize:function(e,n){u=e,s=n,c=!0},render:function(){n.useProgram(e),n.bindBuffer(n.ARRAY_BUFFER,t),n.bufferData(n.ARRAY_BUFFER,g,n.DYNAMIC_DRAW),c&&(c=!1,n.uniformMatrix4fv(i.transform,!1,f),n.uniform2f(i.screenSize,u,s)),n.vertexAttribPointer(i.vertexPos,2,n.FLOAT,!1,3*Float32Array.BYTES_PER_ELEMENT,0),n.vertexAttribPointer(i.color,4,n.UNSIGNED_BYTE,!0,3*Float32Array.BYTES_PER_ELEMENT,8),n.drawArrays(n.LINES,0,2*h),a=h-1},bringToFront:function(e){a>e.id&&r.swapArrayPart(m,e.id*d,a*d,d),a>0&&(a-=1)},getFrontLinkId:function(){return a}}}var o=e("./webgl.js");n.exports=r},{"./webgl.js":57}],64:[function(e,n,t){function r(){function e(){if((P+1)*w>=L.byteLength){var e=new ArrayBuffer(2*L.byteLength),n=new Float32Array(e),t=new Uint32Array(e);t.set(k),N=n,k=t,L=e}}function n(e){d=e,v=o(e),c=v.createProgram(E,b),d.useProgram(c), -p=v.getLocations(c,["a_vertexPos","a_color","u_screenSize","u_transform"]),d.enableVertexAttribArray(p.vertexPos),d.enableVertexAttribArray(p.color),l=d.createBuffer()}function t(e,n){var t=e.id;N[t*x]=n.x,N[t*x+1]=-n.y,N[t*x+2]=e.size,k[t*x+3]=e.color}function r(e){y=!0,m=e}function i(e,n){h=e,g=n,y=!0}function a(e){P>0&&(P-=1),e.id0&&v.copyArrayPart(k,e.id*x,P*x,x)}function u(){e(),P+=1}function s(){}function f(){d.useProgram(c),d.bindBuffer(d.ARRAY_BUFFER,l),d.bufferData(d.ARRAY_BUFFER,L,d.DYNAMIC_DRAW),y&&(y=!1,d.uniformMatrix4fv(p.transform,!1,m),d.uniform2f(p.screenSize,h,g)),d.vertexAttribPointer(p.vertexPos,3,d.FLOAT,!1,x*Float32Array.BYTES_PER_ELEMENT,0),d.vertexAttribPointer(p.color,4,d.UNSIGNED_BYTE,!0,x*Float32Array.BYTES_PER_ELEMENT,12),d.drawArrays(d.POINTS,0,P)}var c,d,l,p,v,h,g,m,y,x=4,w=3*Float32Array.BYTES_PER_ELEMENT+Uint32Array.BYTES_PER_ELEMENT,b=["precision mediump float;","varying vec4 color;","void main(void) {"," gl_FragColor = color;","}"].join("\n"),E=["attribute vec3 a_vertexPos;","attribute vec4 a_color;","uniform vec2 u_screenSize;","uniform mat4 u_transform;","varying vec4 color;","void main(void) {"," gl_Position = u_transform * vec4(a_vertexPos.xy/u_screenSize, 0, 1);"," gl_PointSize = a_vertexPos.z * u_transform[0][0];"," color = a_color.abgr;","}"].join("\n"),L=new ArrayBuffer(16*w),N=new Float32Array(L),k=new Uint32Array(L),P=0;return{load:n,position:t,updateTransform:r,updateSize:i,removeNode:a,createNode:u,replaceProperties:s,render:f}}var o=e("./webgl.js");n.exports=r},{"./webgl.js":57}],65:[function(e,n,t){function r(e,n){return{size:"number"==typeof e?e:10,color:o(n)}}var o=e("./parseColor.js");n.exports=r},{"./parseColor.js":55}],66:[function(e,n,t){n.exports="0.10.1"},{}]},{},[1])(1)}); \ No newline at end of file +!function(e){var n;"object"==typeof exports&&"undefined"!=typeof module?module.exports=e():"function"==typeof define&&define.amd?define([],e):("undefined"!=typeof window?n=window:"undefined"!=typeof global?n=global:"undefined"!=typeof self&&(n=self),n.Viva=e())}(function(){return function r(o,i,a){function u(t,e){if(!i[t]){if(!o[t]){var n="function"==typeof require&&require;if(!e&&n)return n(t,!0);if(s)return s(t,!0);n=new Error("Cannot find module '"+t+"'");throw n.code="MODULE_NOT_FOUND",n}n=i[t]={exports:{}};o[t][0].call(n.exports,function(e){var n=o[t][1][e];return u(n||e)},n,n.exports,r,o,i,a)}return i[t].exports}for(var s="function"==typeof require&&require,e=0;e= 0");var n,t=h();for(n=0;n>>19))+(e<<5)&4294967295)^e<<9))+(e<<3)&4294967295)^e>>>16),(268435455&(this.seed=e))/268435456}n.exports=r,n.exports.random=r,n.exports.randomIterator=function(o,e){var i=e||r();if("function"==typeof i.next)return{forEach:function(e){var n,t,r;for(n=o.length-1;0r&&(r=i.pos.x),i.pos.yo&&(o=i.pos.y)}s.x1=n,s.x2=r,s.y1=t,s.y2=o},reset:function(){s.x1=s.y1=0,s.x2=s.y2=0},getBestNewPosition:function(e){var n=s,t=0,r=0;if(e.length){for(var o=0;o>>19))+374761393+(t<<5)&4294967295)+3550635116^t<<9))+4251993797+(t<<3)&4294967295)^t>>>16)))/268435456}var t="number"==typeof e?e:+new Date;return{next:function(e){return Math.floor(n()*e)},nextDouble:n}}n.exports={random:r,randomIterator:function(o,e){var i=e||r();if("function"==typeof i.next)return{forEach:function(e){for(var n,t,r=o.length-1;0e.x2&&(e.x2=n.x),n.ye.y2&&(e.y2=n.y)}function t(){0!==e.getNodesCount()&&(u.x1=Number.MAX_VALUE,u.y1=Number.MAX_VALUE,u.x2=Number.MIN_VALUE,u.y2=Number.MIN_VALUE,e.forEachNode(r))}function o(e){s[e.id]=e}function i(e){for(var n=0;ne.id&&(n=e.id,e=x[t],x[t]=x[n],x[t].id=t,x[n]=e,x[n].id=n)},graphCenterChanged:function(e,n){m[12]=2*e/c-1,m[13]=1-2*n/d,o()},addLink:function(e,n){var t=v++,r=P(e);return r.id=t,r.pos=n,E.createLink(r),x[t]=r,b[e.id]=r},addNode:function(e,n){var t=g++,r=N(e);return r.id=t,r.position=n,r.node=e,L.createNode(r),y[t]=r,w[e.id]=r},translateRel:function(e,n){m[12]+=2*m[0]*e/c/m[0],m[13]-=2*m[5]*n/d/m[5],o()},scale:function(e,n){var t=2*n.x/c-1,n=1-2*n.y/d;return t-=m[12],n-=m[13],m[12]+=t*(1-e),m[13]+=n*(1-e),m[0]*=e,m[5]*=e,o(),this.fire("rescaled"),m[0]},resetScale:function(){return i(),f&&(a(),o()),this},updateSize:a,init:function(e){var n={};if(r.preserveDrawingBuffer&&(n.preserveDrawingBuffer=!0),u=e,a(),i(),u.appendChild(s),!(f=s.getContext("experimental-webgl",n))){var t="Could not initialize WebGL. Seems like the browser doesn't support it.";throw window.alert(t),t}r.enableBlending&&(f.blendFunc(f.SRC_ALPHA,f.ONE_MINUS_SRC_ALPHA),f.enable(f.BLEND)),r.clearColor&&(t=r.clearColorValue,f.clearColor(t.r,t.g,t.b,t.a),this.beginRender=function(){f.clear(f.COLOR_BUFFER_BIT)}),E.load(f),E.updateSize(c/2,d/2),L.load(f),L.updateSize(c/2,d/2),o(),"function"==typeof h&&h(s)},release:function(e){s&&e&&e.removeChild(s)},isSupported:function(){var e=window.document.createElement("canvas");return e&&e.getContext&&e.getContext("experimental-webgl")},releaseLink:function(e){0e.length){t=new Float32Array(e.length*t*2);return t.set(e),t}return e},copyArrayPart:o,swapArrayPart:i,getLocations:function(e,n){for(var t={},r=0;r=f.length&&function(){var e=new p(a*u);f.push(e)}();var i=f[r.textureNumber];i.ctx.drawImage(n,r.col*u,r.row*u,u,u),c[e]=n.src,s[n.src]=o,i.isDirty=!0,t(o)}(r,t,n)},t.src=e)}}};return r;function d(e){var n=e%t;return{textureNumber:e/t<<0,row:n/a<<0,col:n%a}}function i(){r.isDirty=!0,n=0,e=null}function l(){e&&(window.clearTimeout(e),n+=1,e=null),10g.byteLength&&(n=new ArrayBuffer(2*g.byteLength),t=new Float32Array(n),(r=new Uint32Array(n)).set(m),v=t,m=r,g=n),h+=1,a=e.id},removeLink:function(e){0e.id&&o.swapArrayPart(v,6*e.id,6*a,6),0=p.byteLength&&(e=new ArrayBuffer(2*p.byteLength),n=new Float32Array(e),(t=new Uint32Array(e)).set(g),h=n,g=t,p=e)})(),v+=1},replaceProperties:function(){},render:function(){t.useProgram(n),t.bindBuffer(t.ARRAY_BUFFER,r),t.bufferData(t.ARRAY_BUFFER,p,t.DYNAMIC_DRAW),f&&(f=!1,t.uniformMatrix4fv(o.transform,!1,s),t.uniform2f(o.screenSize,a,u));t.vertexAttribPointer(o.vertexPos,3,t.FLOAT,!1,4*Float32Array.BYTES_PER_ELEMENT,0),t.vertexAttribPointer(o.color,4,t.UNSIGNED_BYTE,!0,4*Float32Array.BYTES_PER_ELEMENT,12),t.drawArrays(t.POINTS,0,v)}}}},{"./webgl.js":57}],65:[function(e,n,t){var r=e("./parseColor.js");n.exports=function(e,n){return{size:"number"==typeof e?e:10,color:r(n)}}},{"./parseColor.js":55}],66:[function(e,n,t){n.exports="0.10.1"},{}]},{},[1])(1)}); \ No newline at end of file From 7b555ac1be9640ec42fa031ae26f03a77f362993 Mon Sep 17 00:00:00 2001 From: anvaka Date: Sat, 20 Jan 2024 11:17:18 -0800 Subject: [PATCH 43/49] updated year --- LICENSE | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/LICENSE b/LICENSE index a43161f..84ac1b1 100644 --- a/LICENSE +++ b/LICENSE @@ -1,4 +1,4 @@ -Copyright (c) 2011 - 2023, Andrei Kashcha +Copyright (c) 2011 - 2024, Andrei Kashcha All rights reserved. Redistribution and use in source and binary forms, with or without From c1a68d3a1080cb530787571a0dbd59da9ea4f7a1 Mon Sep 17 00:00:00 2001 From: anvaka Date: Sun, 19 May 2024 22:24:54 -0700 Subject: [PATCH 44/49] npm audit fix --- package-lock.json | 115 ++++++++++++++++++++++++++++++++++++---------- 1 file changed, 91 insertions(+), 24 deletions(-) diff --git a/package-lock.json b/package-lock.json index c77c766..7b07b40 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1834,14 +1834,19 @@ } }, "node_modules/es5-ext": { - "version": "0.10.53", - "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.53.tgz", - "integrity": "sha512-Xs2Stw6NiNHWypzRTY1MtaG/uJlwCk8kH81920ma8mvN8Xq1gsfhZvpkImLQArw8AHnv8MT2I45J3c0R8slE+Q==", + "version": "0.10.64", + "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.64.tgz", + "integrity": "sha512-p2snDhiLaXe6dahss1LddxqEm+SkuDvV8dnIQG0MWjyHpcMNfXKPE+/Cc0y+PhxJX3A4xGNeFCj5oc0BUh6deg==", "dev": true, + "hasInstallScript": true, "dependencies": { - "es6-iterator": "~2.0.3", - "es6-symbol": "~3.1.3", - "next-tick": "~1.0.0" + "es6-iterator": "^2.0.3", + "es6-symbol": "^3.1.3", + "esniff": "^2.0.1", + "next-tick": "^1.1.0" + }, + "engines": { + "node": ">=0.10" } }, "node_modules/es6-iterator": { @@ -1886,6 +1891,37 @@ "node": ">=0.8.0" } }, + "node_modules/esniff": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/esniff/-/esniff-2.0.1.tgz", + "integrity": "sha512-kTUIGKQ/mDPFoJ0oVfcmyJn4iBDRptjNVIzwIFR7tqWXdVI9xfA2RMwY/gbSpJG3lkdWNEjLap/NqVHZiJsdfg==", + "dev": true, + "dependencies": { + "d": "^1.0.1", + "es5-ext": "^0.10.62", + "event-emitter": "^0.3.5", + "type": "^2.7.2" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esniff/node_modules/type": { + "version": "2.7.2", + "resolved": "https://registry.npmjs.org/type/-/type-2.7.2.tgz", + "integrity": "sha512-dzlvlNlt6AXU7EBSfpAscydQ7gXB+pPGsPnfJnZpiNJBDj7IaJzQlBZYGdEi4R9HmPdBv2XmWJ6YUtoTa7lmCw==", + "dev": true + }, + "node_modules/event-emitter": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz", + "integrity": "sha512-D9rRn9y7kLPnJ+hMq7S/nhvoKwwvVJahBi2BPmx3bvbsEdK3W9ii8cBSGjP+72/LnM4n6fo3+dkCX5FeTQruXA==", + "dev": true, + "dependencies": { + "d": "1", + "es5-ext": "~0.10.14" + } + }, "node_modules/events": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/events/-/events-1.0.2.tgz", @@ -2717,7 +2753,7 @@ "node_modules/gulp-run": { "version": "1.7.1", "resolved": "https://registry.npmjs.org/gulp-run/-/gulp-run-1.7.1.tgz", - "integrity": "sha1-4XwKy3wwtuKu7iPAREKpbAys7/o=", + "integrity": "sha512-4OcXhBE5xpRWmbcKzE0EQWEqpLRAkX3ju6k85qkYLfmnCVGK6nPmu/sbVgDiGg6mjuzsF2b9nHFbImZBZPH3zg==", "dev": true, "dependencies": { "gulp-util": "^3.0.0", @@ -2827,7 +2863,7 @@ "node_modules/gulp-util": { "version": "3.0.8", "resolved": "https://registry.npmjs.org/gulp-util/-/gulp-util-3.0.8.tgz", - "integrity": "sha1-AFTh50RQLifATBh8PsxQXdVLu08=", + "integrity": "sha512-q5oWPc12lwSFS9h/4VIjG+1NuNDlJ48ywV2JKItY4Ycc/n1fXJeYPVQsfu5ZrhQi7FGSDBalwUCLar/GyHXKGw==", "deprecated": "gulp-util is deprecated - replace it, following the guidelines at https://medium.com/gulpjs/gulp-util-ca3b1f9f9ac5", "dev": true, "dependencies": { @@ -2872,7 +2908,7 @@ "node_modules/gulp-util/node_modules/lodash.template": { "version": "3.6.2", "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-3.6.2.tgz", - "integrity": "sha1-+M3sxhaaJVvpCYrosMU9N4kx0U8=", + "integrity": "sha512-0B4Y53I0OgHUJkt+7RmlDFWKjVAI/YUpWNiL9GQz5ORDr4ttgfQGo+phBWKFLJbBdtOwgMuUkdOHOnPg45jKmQ==", "dev": true, "dependencies": { "lodash._basecopy": "^3.0.0", @@ -4427,9 +4463,9 @@ } }, "node_modules/next-tick": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.0.0.tgz", - "integrity": "sha1-yobR/ogoFpsBICCOPchCS524NCw=", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.1.0.tgz", + "integrity": "sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==", "dev": true }, "node_modules/ngraph.centrality": { @@ -9097,14 +9133,15 @@ } }, "es5-ext": { - "version": "0.10.53", - "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.53.tgz", - "integrity": "sha512-Xs2Stw6NiNHWypzRTY1MtaG/uJlwCk8kH81920ma8mvN8Xq1gsfhZvpkImLQArw8AHnv8MT2I45J3c0R8slE+Q==", + "version": "0.10.64", + "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.64.tgz", + "integrity": "sha512-p2snDhiLaXe6dahss1LddxqEm+SkuDvV8dnIQG0MWjyHpcMNfXKPE+/Cc0y+PhxJX3A4xGNeFCj5oc0BUh6deg==", "dev": true, "requires": { - "es6-iterator": "~2.0.3", - "es6-symbol": "~3.1.3", - "next-tick": "~1.0.0" + "es6-iterator": "^2.0.3", + "es6-symbol": "^3.1.3", + "esniff": "^2.0.1", + "next-tick": "^1.1.0" } }, "es6-iterator": { @@ -9146,6 +9183,36 @@ "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", "dev": true }, + "esniff": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/esniff/-/esniff-2.0.1.tgz", + "integrity": "sha512-kTUIGKQ/mDPFoJ0oVfcmyJn4iBDRptjNVIzwIFR7tqWXdVI9xfA2RMwY/gbSpJG3lkdWNEjLap/NqVHZiJsdfg==", + "dev": true, + "requires": { + "d": "^1.0.1", + "es5-ext": "^0.10.62", + "event-emitter": "^0.3.5", + "type": "^2.7.2" + }, + "dependencies": { + "type": { + "version": "2.7.2", + "resolved": "https://registry.npmjs.org/type/-/type-2.7.2.tgz", + "integrity": "sha512-dzlvlNlt6AXU7EBSfpAscydQ7gXB+pPGsPnfJnZpiNJBDj7IaJzQlBZYGdEi4R9HmPdBv2XmWJ6YUtoTa7lmCw==", + "dev": true + } + } + }, + "event-emitter": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz", + "integrity": "sha512-D9rRn9y7kLPnJ+hMq7S/nhvoKwwvVJahBi2BPmx3bvbsEdK3W9ii8cBSGjP+72/LnM4n6fo3+dkCX5FeTQruXA==", + "dev": true, + "requires": { + "d": "1", + "es5-ext": "~0.10.14" + } + }, "events": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/events/-/events-1.0.2.tgz", @@ -9862,7 +9929,7 @@ "gulp-run": { "version": "1.7.1", "resolved": "https://registry.npmjs.org/gulp-run/-/gulp-run-1.7.1.tgz", - "integrity": "sha1-4XwKy3wwtuKu7iPAREKpbAys7/o=", + "integrity": "sha512-4OcXhBE5xpRWmbcKzE0EQWEqpLRAkX3ju6k85qkYLfmnCVGK6nPmu/sbVgDiGg6mjuzsF2b9nHFbImZBZPH3zg==", "dev": true, "requires": { "gulp-util": "^3.0.0", @@ -9965,7 +10032,7 @@ "gulp-util": { "version": "3.0.8", "resolved": "https://registry.npmjs.org/gulp-util/-/gulp-util-3.0.8.tgz", - "integrity": "sha1-AFTh50RQLifATBh8PsxQXdVLu08=", + "integrity": "sha512-q5oWPc12lwSFS9h/4VIjG+1NuNDlJ48ywV2JKItY4Ycc/n1fXJeYPVQsfu5ZrhQi7FGSDBalwUCLar/GyHXKGw==", "dev": true, "requires": { "array-differ": "^1.0.0", @@ -10003,7 +10070,7 @@ "lodash.template": { "version": "3.6.2", "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-3.6.2.tgz", - "integrity": "sha1-+M3sxhaaJVvpCYrosMU9N4kx0U8=", + "integrity": "sha512-0B4Y53I0OgHUJkt+7RmlDFWKjVAI/YUpWNiL9GQz5ORDr4ttgfQGo+phBWKFLJbBdtOwgMuUkdOHOnPg45jKmQ==", "dev": true, "requires": { "lodash._basecopy": "^3.0.0", @@ -11306,9 +11373,9 @@ } }, "next-tick": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.0.0.tgz", - "integrity": "sha1-yobR/ogoFpsBICCOPchCS524NCw=", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.1.0.tgz", + "integrity": "sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==", "dev": true }, "ngraph.centrality": { From c01c28fae14cc504292fcb005c55e71448b2d037 Mon Sep 17 00:00:00 2001 From: anvaka Date: Fri, 12 Jul 2024 22:18:34 -0700 Subject: [PATCH 45/49] npm audit fix --- package-lock.json | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/package-lock.json b/package-lock.json index 7b07b40..0338632 100644 --- a/package-lock.json +++ b/package-lock.json @@ -4083,7 +4083,7 @@ "node_modules/matchdep": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/matchdep/-/matchdep-2.0.0.tgz", - "integrity": "sha1-xvNINKDY28OzfCfui7yyfHd1WC4=", + "integrity": "sha512-LFgVbaHIHMqCRuCZyfCtUOq9/Lnzhi7Z0KFUE2fhD54+JN2jLh3hC02RLkqauJ3U4soU6H1J3tfj/Byk7GoEjA==", "dev": true, "dependencies": { "findup-sync": "^2.0.0", @@ -4098,7 +4098,7 @@ "node_modules/matchdep/node_modules/findup-sync": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-2.0.0.tgz", - "integrity": "sha1-kyaxSIwi0aYIhlCoaQGy2akKLLw=", + "integrity": "sha512-vs+3unmJT45eczmcAZ6zMJtxN3l/QXeccaXQx5cu/MeJMhewVfoWZqibRkOxPnmoR59+Zy5hjabfQc6JLSah4g==", "dev": true, "dependencies": { "detect-file": "^1.0.0", @@ -11060,7 +11060,7 @@ "matchdep": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/matchdep/-/matchdep-2.0.0.tgz", - "integrity": "sha1-xvNINKDY28OzfCfui7yyfHd1WC4=", + "integrity": "sha512-LFgVbaHIHMqCRuCZyfCtUOq9/Lnzhi7Z0KFUE2fhD54+JN2jLh3hC02RLkqauJ3U4soU6H1J3tfj/Byk7GoEjA==", "dev": true, "requires": { "findup-sync": "^2.0.0", @@ -11072,7 +11072,7 @@ "findup-sync": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-2.0.0.tgz", - "integrity": "sha1-kyaxSIwi0aYIhlCoaQGy2akKLLw=", + "integrity": "sha512-vs+3unmJT45eczmcAZ6zMJtxN3l/QXeccaXQx5cu/MeJMhewVfoWZqibRkOxPnmoR59+Zy5hjabfQc6JLSah4g==", "dev": true, "requires": { "detect-file": "^1.0.0", From 6373e7e83f1a878a8bfb9a7f15ed84825f62030b Mon Sep 17 00:00:00 2001 From: anvaka Date: Thu, 29 Aug 2024 20:14:52 -1000 Subject: [PATCH 46/49] updated node engines --- .github/workflows/tests.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/tests.yaml b/.github/workflows/tests.yaml index 87a91c6..8d2f957 100644 --- a/.github/workflows/tests.yaml +++ b/.github/workflows/tests.yaml @@ -13,7 +13,7 @@ jobs: strategy: matrix: - node-version: [12.x, 14.x, 15.x] + node-version: [20.x, 18.x] steps: - uses: actions/checkout@v2 @@ -23,4 +23,4 @@ jobs: node-version: ${{ matrix.node-version }} - run: npm ci - run: npm run build --if-present - - run: npm test \ No newline at end of file + - run: npm test From b9a5238cf871103e9cbec042b075b71e7b8d35f0 Mon Sep 17 00:00:00 2001 From: anvaka Date: Thu, 7 Nov 2024 22:49:39 -0800 Subject: [PATCH 47/49] npm audit fix --- package-lock.json | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/package-lock.json b/package-lock.json index 0338632..f8dbb9e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1795,9 +1795,9 @@ } }, "node_modules/elliptic": { - "version": "6.5.4", - "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz", - "integrity": "sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==", + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.6.0.tgz", + "integrity": "sha512-dpwoQcLc/2WLQvJvLRHKZ+f9FgOdjnq11rurqwekGQygGPsYSK29OMMD2WalatiqQ+XGFDglTNixpPfI+lpaAA==", "dev": true, "dependencies": { "bn.js": "^4.11.9", @@ -9092,9 +9092,9 @@ } }, "elliptic": { - "version": "6.5.4", - "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz", - "integrity": "sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==", + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.6.0.tgz", + "integrity": "sha512-dpwoQcLc/2WLQvJvLRHKZ+f9FgOdjnq11rurqwekGQygGPsYSK29OMMD2WalatiqQ+XGFDglTNixpPfI+lpaAA==", "dev": true, "requires": { "bn.js": "^4.11.9", From 4a02fd479d57fa2e516463cc3bd0ca8be0136d62 Mon Sep 17 00:00:00 2001 From: anvaka Date: Fri, 7 Mar 2025 21:17:36 -0800 Subject: [PATCH 48/49] npm audit fix --- package-lock.json | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/package-lock.json b/package-lock.json index f8dbb9e..71d2c09 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1795,10 +1795,11 @@ } }, "node_modules/elliptic": { - "version": "6.6.0", - "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.6.0.tgz", - "integrity": "sha512-dpwoQcLc/2WLQvJvLRHKZ+f9FgOdjnq11rurqwekGQygGPsYSK29OMMD2WalatiqQ+XGFDglTNixpPfI+lpaAA==", + "version": "6.6.1", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.6.1.tgz", + "integrity": "sha512-RaddvvMatK2LJHqFJ+YA4WysVN5Ita9E35botqIYspQ4TkRAlCicdzKOjlyv/1Za5RyTNn7di//eEV0uTAfe3g==", "dev": true, + "license": "MIT", "dependencies": { "bn.js": "^4.11.9", "brorand": "^1.1.0", @@ -9092,9 +9093,9 @@ } }, "elliptic": { - "version": "6.6.0", - "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.6.0.tgz", - "integrity": "sha512-dpwoQcLc/2WLQvJvLRHKZ+f9FgOdjnq11rurqwekGQygGPsYSK29OMMD2WalatiqQ+XGFDglTNixpPfI+lpaAA==", + "version": "6.6.1", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.6.1.tgz", + "integrity": "sha512-RaddvvMatK2LJHqFJ+YA4WysVN5Ita9E35botqIYspQ4TkRAlCicdzKOjlyv/1Za5RyTNn7di//eEV0uTAfe3g==", "dev": true, "requires": { "bn.js": "^4.11.9", From e67aa5a4b361e91ed00b4970313f9f2a6d949e18 Mon Sep 17 00:00:00 2001 From: anvaka Date: Wed, 23 Apr 2025 20:10:12 -0700 Subject: [PATCH 49/49] updated years --- LICENSE | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/LICENSE b/LICENSE index 84ac1b1..cee6d40 100644 --- a/LICENSE +++ b/LICENSE @@ -1,4 +1,4 @@ -Copyright (c) 2011 - 2024, Andrei Kashcha +Copyright (c) 2011 - 2025, Andrei Kashcha All rights reserved. Redistribution and use in source and binary forms, with or without