├── css └── style.css ├── data ├── simple.json ├── cubes1.json ├── cubes2.json ├── cubes3.json ├── cubes4.json └── noise.json ├── js ├── animationWorker.js ├── scripts.js ├── fibonacci_heap.js └── ebp.js ├── LICENSE ├── README.md └── index.html /css/style.css: -------------------------------------------------------------------------------- 1 | #VizContainer { 2 | width: 100%; 3 | height: 70vh; 4 | padding: 0; 5 | } -------------------------------------------------------------------------------- /data/simple.json: -------------------------------------------------------------------------------- 1 | {"directed": false, "multigraph": false, "graph": {"node_default": {}, "edge_default": {}}, "nodes": [{"x": "0", "y": "0", "id": "0"}, {"x": "10", "y": "15", "id": "1"}, {"x": "25", "y": "25", "id": "2"}, {"x": "40", "y": "15", "id": "3"}, {"x": "50", "y": "0", "id": "4"}, {"x": "50", "y": "-10", "id": "5"}], "links": [{"source": "0", "target": "1"}, {"source": "0", "target": "5"}, {"source": "0", "target": "3"}, {"source": "1", "target": "2"}, {"source": "2", "target": "3"}, {"source": "3", "target": "4"}, {"source": "4", "target": "5"}]} -------------------------------------------------------------------------------- /js/animationWorker.js: -------------------------------------------------------------------------------- 1 | var edges = null; 2 | var bundled = null; 3 | 4 | self.onmessage = function(e) { 5 | 6 | // console.log('test') 7 | // console.log(e.data) 8 | 9 | if (e.data[0] !== null && e.data[1] !== null) { 10 | edges = e.data[0]; 11 | bundled = e.data[1]; 12 | } 13 | var t0 = e.data[2]; 14 | var steps = e.data[3]; 15 | 16 | 17 | 18 | doFrame(t0, steps); 19 | } 20 | 21 | 22 | function doFrame(t0, steps) { 23 | 24 | edges.forEach(edge => { 25 | if (bundled[edge.id]) { 26 | for(var i = 0; i < edge.controlpoints.length; i++) { 27 | edge.anim[i].x -= edge.delta[i].x; 28 | edge.anim[i].y -= edge.delta[i].y; 29 | } 30 | } 31 | 32 | }); 33 | 34 | //console.log('post') 35 | self.postMessage([edges, t0, steps]); 36 | 37 | } -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Begin license text. 2 | 3 | Copyright (c) 2021 Markus Wallinger 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: 6 | 7 | The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. 8 | 9 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 10 | 11 | End license text. -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Edge-Path Bundling 2 | Javascript implementation of the edge-path bundling algorithm. 3 | 4 | The algorithm can be seen in action here: https://mwallinger-tu.github.io/edge-path-bundling/ 5 | 6 | ## Abstract 7 | 8 | Edge bundling techniques cluster edges with similar attributes (i.e. similarity in direction and proximity) together to reduce the visual clutter. All edge bundling techniques to date implicitly or explicitly cluster groups of individual edges, or parts of them, together based on these attributes. These clusters can result in ambiguous connections that do not exist in the data. Confluent drawings of networks do not have these ambiguities, but require the layout to be computed as part of the bundling process. We devise a new bundling method, Edge-Path bundling, to simplify edge clutter while greatly reducing ambiguities compared to previous bundling techniques. Edge-Path bundling takes a layout as input and clusters each edge along a weighted, shortest path to limit its deviation from a straight line. Edge-Path bundling does not incur independent edge ambiguities typically seen in all edge bundling methods, and the level of bundling can be tuned through shortest path distances, Euclidean distances, and combinations of the two. Also, directed edge bundling naturally emerges from the model. Through metric evaluations, we demonstrate the advantages of Edge-Path bundling over other techniques. 9 | 10 | DOI: 10.1109/TVCG.2021.3114795 11 | 12 | https://arxiv.org/abs/2108.05467 13 | 14 | 15 | 16 | ## -------------------------------------------------------------------------------- /js/scripts.js: -------------------------------------------------------------------------------- 1 | 2 | var svg; 3 | var EPB; 4 | var Renderer; 5 | var Offscreen; 6 | var width, height; 7 | 8 | window.onload = function () { 9 | resetInput() 10 | 11 | var container = document.getElementById('VizContainer'); 12 | var canvas = document.getElementById('Canvas'); 13 | 14 | ({ width, height } = container.getBoundingClientRect()); 15 | 16 | canvas.width = width; 17 | canvas.height = height; 18 | 19 | Renderer = new Render('#Canvas'); 20 | 21 | d3.json('./data/simple.json').then(function(data){ 22 | bundled = false; 23 | 24 | nodes = data['nodes']; 25 | links = data['links']; 26 | 27 | EBP = new EdgePathBundling(nodes, links, width, height); 28 | }).then(function(){ 29 | EBP.drawGraphStraight(Renderer); 30 | }); 31 | } 32 | 33 | function resetInput() { 34 | document.getElementById("customRange1").value = 2; 35 | document.getElementById("customRange2").value = 2; 36 | document.getElementById("customRange3").value = 1; 37 | document.getElementById("isInteractive").checked = false; 38 | document.getElementById("isAnimated").checked = false; 39 | 40 | document.getElementById('label1').innerHTML = 'Distortion: 2.0' 41 | document.getElementById('label2').innerHTML = 'Weight factor: 2.0' 42 | document.getElementById('label3').innerHTML = 'Bundle strength: 1' 43 | } 44 | 45 | function clickDatasetButton(path) { 46 | resetInput() 47 | d3.json(path).then(function(data){ 48 | bundled = false; 49 | 50 | nodes = data['nodes']; 51 | links = data['links']; 52 | 53 | EBP = new EdgePathBundling(nodes, links, width, height); 54 | }).then(function(){ 55 | EBP.drawGraphStraight(Renderer); 56 | }); 57 | } 58 | 59 | function clickBundleButton() { 60 | EBP.bundle(); 61 | EBP.subdivision(); 62 | 63 | if(document.getElementById("isAnimated").checked) 64 | EBP.animate(Renderer, 50, 20); 65 | else 66 | EBP.drawGraphBundled(Renderer); 67 | } 68 | 69 | 70 | function clickReset() { 71 | EBP.drawGraphStraight(Renderer); 72 | } 73 | 74 | function bundleStrengthChanged(value) { 75 | 76 | document.getElementById('label3').innerHTML = 'Bundle strength: ' + value 77 | 78 | EBP.setBundlingStrength(value); 79 | EBP.subdivision(); 80 | 81 | if(document.getElementById("isAnimated").checked) 82 | EBP.animate(Renderer, 50, 20); 83 | else 84 | EBP.drawGraphBundled(Renderer); 85 | } 86 | 87 | function distWeightsChanged(value) { 88 | document.getElementById('label2').innerHTML = 'Weight factor: ' + value; 89 | 90 | EBP.setWeight(value); 91 | 92 | if(document.getElementById("isInteractive").checked){ 93 | EBP.bundle(); 94 | EBP.subdivision(); 95 | 96 | if(document.getElementById("isAnimated").checked) 97 | EBP.animate(Renderer, 50, 20); 98 | else 99 | EBP.drawGraphBundled(Renderer); 100 | } 101 | } 102 | 103 | function maxDistortionChanged(value) { 104 | document.getElementById('label1').innerHTML = 'Distortion: ' + value; 105 | EBP.setDistortion(value); 106 | 107 | if(document.getElementById("isInteractive").checked){ 108 | EBP.bundle(); 109 | EBP.subdivision(); 110 | 111 | if(document.getElementById("isAnimated").checked) 112 | EBP.animate(Renderer, 10, 200); 113 | else 114 | EBP.drawGraphBundled(Renderer); 115 | } 116 | } 117 | 118 | 119 | 120 | // function clickDatasetButton(path) { 121 | // loadDataset(path, svg) 122 | // } 123 | 124 | // function clickReset() { 125 | // resetBundling(svg) 126 | // } 127 | 128 | // function bundleStrengthChanged(value) { 129 | // setBundleStrength(value); 130 | // drawBundled(svg); 131 | // } 132 | 133 | // function distWeightsChanged(value) { 134 | // updateWeights(value); 135 | // drawBundled(svg); 136 | // } 137 | 138 | // function maxDistortionChanged(value) { 139 | // setMaxDistortion(value); 140 | // drawBundled(svg); 141 | // } 142 | -------------------------------------------------------------------------------- /index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | Edge-Path Bundling 13 | 14 | 15 | 16 |
17 |
18 |
19 | 20 |
21 |
22 | 23 |
24 |
25 | 26 |
27 |
28 | 29 |
30 |
31 | 32 |
33 |
34 | 35 |
36 |
37 | 38 |
39 |
40 | 41 |
42 |
43 | 44 |
45 |
46 |
47 |
48 | 49 |
50 |
51 |
52 |
53 | 54 |
55 |
56 | 57 |
58 |
59 | 60 | 61 |
62 |
63 | 64 | 65 |
66 |
67 | 68 | 69 |
70 |
71 |
72 | 73 | 74 |
75 |
76 | 77 | 78 |
79 |
80 |
81 |
82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | -------------------------------------------------------------------------------- /data/cubes1.json: -------------------------------------------------------------------------------- 1 | {"directed": false, "multigraph": false, "graph": {"node_default": {}, "edge_default": {}}, "nodes": [{"x": 9.450027007590352, "y": 1.1411106396558013, "id": "0"}, {"x": 32.306008446794785, "y": 8.632971118107575, "id": "25"}, {"x": 0.10986861549933002, "y": 10.124373763363648, "id": "50"}, {"x": 30.136879059367278, "y": 16.852393902368437, "id": "75"}, {"x": 6.627514480239313, "y": 8.864054571326484, "id": "1"}, {"x": 35.916390306547754, "y": 2.915985590419216, "id": "26"}, {"x": 2.711933625200248, "y": 14.708758185274585, "id": "51"}, {"x": 31.182989585534177, "y": 13.685168927196731, "id": "76"}, {"x": 4.313427989376728, "y": 8.046988839305737, "id": "2"}, {"x": 35.9241862934516, "y": 9.29331341614345, "id": "27"}, {"x": 3.6898757424354125, "y": 18.71032857959255, "id": "52"}, {"x": 31.39276991580555, "y": 11.97451556067498, "id": "77"}, {"x": 1.539368916237407, "y": 8.941403073841396, "id": "3"}, {"x": 36.96624336186402, "y": 9.151471655429592, "id": "28"}, {"x": 2.4043803626709357, "y": 18.602306945169296, "id": "53"}, {"x": 39.263044010401984, "y": 16.623225465981694, "id": "78"}, {"x": 3.3625623669613667, "y": 6.012047865623519, "id": "4"}, {"x": 34.45116718666786, "y": 2.6886094048642506, "id": "29"}, {"x": 3.1252048787167706, "y": 15.762374750155232, "id": "54"}, {"x": 34.877771428073615, "y": 10.554202940968345, "id": "79"}, {"x": 3.829841057996075, "y": 9.730156356973485, "id": "5"}, {"x": 34.561396360035346, "y": 7.80325681016079, "id": "30"}, {"x": 5.237085583103109, "y": 12.040976144547486, "id": "55"}, {"x": 33.59314297251602, "y": 18.867136182705117, "id": "80"}, {"x": 7.340193161776586, "y": 9.631376094360458, "id": "6"}, {"x": 39.366667028210585, "y": 0.3386383083091271, "id": "31"}, {"x": 4.595144701114338, "y": 11.498667979109788, "id": "56"}, {"x": 30.794893811315855, "y": 17.009401580474268, "id": "81"}, {"x": 3.3275088564510105, "y": 4.9579948638016615, "id": "7"}, {"x": 30.759555623475258, "y": 0.5147341585134879, "id": "32"}, {"x": 5.173807377392925, "y": 12.016014380873042, "id": "57"}, {"x": 36.79623245958279, "y": 19.536307261227474, "id": "82"}, {"x": 7.169006127957857, "y": 7.804382537723711, "id": "8"}, {"x": 35.757486248973144, "y": 6.337492558574888, "id": "33"}, {"x": 1.0957319697775403, "y": 11.416296672837396, "id": "58"}, {"x": 34.41938840009485, "y": 12.418088921536501, "id": "83"}, {"x": 5.721359867290145, "y": 7.564814849745219, "id": "9"}, {"x": 30.577635210488197, "y": 0.9803129677336508, "id": "34"}, {"x": 9.0197218973669, "y": 18.98334493356233, "id": "59"}, {"x": 33.144264794647526, "y": 13.173429090178452, "id": "84"}, {"x": 6.016724096920303, "y": 3.5298719118873425, "id": "10"}, {"x": 37.35742409811152, "y": 0.7431129431279759, "id": "35"}, {"x": 1.4345951891308495, "y": 18.86394602531329, "id": "60"}, {"x": 37.073167257181936, "y": 15.575897205537915, "id": "85"}, {"x": 8.172981106637195, "y": 9.119097459793249, "id": "11"}, {"x": 39.021706987645615, "y": 5.3276242464808785, "id": "36"}, {"x": 2.14064115531013, "y": 18.82293044441294, "id": "61"}, {"x": 37.169163846739785, "y": 18.255024290816554, "id": "86"}, {"x": 4.317248267914095, "y": 9.855466378142715, "id": "12"}, {"x": 33.36657479578266, "y": 6.815185090995487, "id": "37"}, {"x": 8.675430856928848, "y": 12.017117219133565, "id": "62"}, {"x": 36.823395973302766, "y": 17.54623974049248, "id": "87"}, {"x": 5.677265198124344, "y": 6.21638668313583, "id": "13"}, {"x": 37.450583941915426, "y": 0.6633061134998575, "id": "38"}, {"x": 7.743603338293959, "y": 13.536757265937414, "id": "63"}, {"x": 35.57509597190382, "y": 16.610638763571387, "id": "88"}, {"x": 6.203377967946259, "y": 0.32529551395025447, "id": "14"}, {"x": 37.19866404721251, "y": 5.311430202606735, "id": "39"}, {"x": 1.244794721845368, "y": 15.797113860227224, "id": "64"}, {"x": 34.78181261667471, "y": 14.31687419948678, "id": "89"}, {"x": 8.323499854693056, "y": 4.814065995933369, "id": "15"}, {"x": 36.26156253899293, "y": 6.654089768772621, "id": "40"}, {"x": 3.3288631015478245, "y": 12.350068120254987, "id": "65"}, {"x": 36.560523083279, "y": 12.40080134757352, "id": "90"}, {"x": 9.469039883411126, "y": 9.955491783910661, "id": "16"}, {"x": 36.20682996406935, "y": 1.7584104272062118, "id": "41"}, {"x": 0.1932849608322551, "y": 15.150714153423747, "id": "66"}, {"x": 33.58016328545816, "y": 19.339140914583606, "id": "91"}, {"x": 2.073097692041721, "y": 5.109305910858081, "id": "17"}, {"x": 34.171773677862646, "y": 1.703301892674125, "id": "42"}, {"x": 4.154397811674114, "y": 15.003474083327761, "id": "67"}, {"x": 31.34512812404249, "y": 12.819874781610677, "id": "92"}, {"x": 4.151059367463442, "y": 7.51568196689829, "id": "18"}, {"x": 30.12651184600974, "y": 6.792004344229536, "id": "43"}, {"x": 7.2067319749577905, "y": 12.705392752468526, "id": "68"}, {"x": 30.151834081945776, "y": 11.39555672328751, "id": "93"}, {"x": 8.98670874056288, "y": 0.7281419432976988, "id": "19"}, {"x": 37.74077888047327, "y": 2.302815932219354, "id": "44"}, {"x": 5.457962388956928, "y": 18.782992371482102, "id": "69"}, {"x": 38.55428474001478, "y": 15.398184666020427, "id": "94"}, {"x": 0.28496267895432914, "y": 3.8416125546296764, "id": "20"}, {"x": 38.35179019688033, "y": 2.42224812654966, "id": "45"}, {"x": 1.3298880586645934, "y": 15.81063442832057, "id": "70"}, {"x": 34.593226772199095, "y": 10.677335048049736, "id": "95"}, {"x": 2.36432208699401, "y": 4.694553736785681, "id": "21"}, {"x": 35.9276301041603, "y": 5.001398547274448, "id": "46"}, {"x": 7.970168688885819, "y": 12.795491053987398, "id": "71"}, {"x": 30.407529724892385, "y": 13.076003865370229, "id": "96"}, {"x": 7.062601887587034, "y": 2.591672070294333, "id": "22"}, {"x": 36.307162433847665, "y": 4.37580666159236, "id": "47"}, {"x": 5.958715060070325, "y": 14.593372153706433, "id": "72"}, {"x": 36.4712367521877, "y": 13.592314350290424, "id": "97"}, {"x": 7.9083452877529234, "y": 7.724988249728593, "id": "23"}, {"x": 30.64673601535388, "y": 9.97940238290209, "id": "48"}, {"x": 1.3891257763904374, "y": 15.249765504399852, "id": "73"}, {"x": 34.14067890263181, "y": 15.707450135162162, "id": "98"}, {"x": 8.107910589766153, "y": 2.2412111366736798, "id": "24"}, {"x": 31.439148611462635, "y": 5.076797472732394, "id": "49"}, {"x": 1.686220401651084, "y": 18.669386206774185, "id": "74"}, {"x": 35.19655323093735, "y": 11.88899173795424, "id": "99"}], "links": [{"source": "0", "target": "25"}, {"source": "0", "target": "1"}, {"source": "0", "target": "14"}, {"source": "25", "target": "26"}, {"source": "50", "target": "75"}, {"source": "50", "target": "51"}, {"source": "75", "target": "76"}, {"source": "1", "target": "26"}, {"source": "1", "target": "2"}, {"source": "26", "target": "27"}, {"source": "51", "target": "76"}, {"source": "51", "target": "52"}, {"source": "76", "target": "77"}, {"source": "2", "target": "27"}, {"source": "2", "target": "3"}, {"source": "27", "target": "28"}, {"source": "52", "target": "77"}, {"source": "52", "target": "53"}, {"source": "77", "target": "78"}, {"source": "3", "target": "28"}, {"source": "3", "target": "4"}, {"source": "28", "target": "29"}, {"source": "53", "target": "78"}, {"source": "53", "target": "54"}, {"source": "78", "target": "79"}, {"source": "4", "target": "29"}, {"source": "4", "target": "5"}, {"source": "29", "target": "30"}, {"source": "54", "target": "79"}, {"source": "54", "target": "55"}, {"source": "79", "target": "80"}, {"source": "5", "target": "30"}, {"source": "5", "target": "6"}, {"source": "30", "target": "31"}, {"source": "55", "target": "80"}, {"source": "55", "target": "56"}, {"source": "80", "target": "81"}, {"source": "6", "target": "31"}, {"source": "6", "target": "7"}, {"source": "31", "target": "32"}, {"source": "56", "target": "81"}, {"source": "56", "target": "57"}, {"source": "81", "target": "82"}, {"source": "7", "target": "32"}, {"source": "7", "target": "8"}, {"source": "32", "target": "33"}, {"source": "57", "target": "82"}, {"source": "57", "target": "58"}, {"source": "82", "target": "83"}, {"source": "8", "target": "33"}, {"source": "8", "target": "9"}, {"source": "33", "target": "34"}, {"source": "33", "target": "39"}, {"source": "58", "target": "83"}, {"source": "58", "target": "59"}, {"source": "83", "target": "84"}, {"source": "9", "target": "34"}, {"source": "9", "target": "10"}, {"source": "34", "target": "35"}, {"source": "59", "target": "84"}, {"source": "59", "target": "60"}, {"source": "84", "target": "85"}, {"source": "10", "target": "35"}, {"source": "10", "target": "11"}, {"source": "35", "target": "36"}, {"source": "60", "target": "85"}, {"source": "60", "target": "61"}, {"source": "60", "target": "66"}, {"source": "85", "target": "86"}, {"source": "11", "target": "36"}, {"source": "11", "target": "12"}, {"source": "36", "target": "37"}, {"source": "61", "target": "86"}, {"source": "61", "target": "62"}, {"source": "86", "target": "87"}, {"source": "12", "target": "37"}, {"source": "12", "target": "13"}, {"source": "37", "target": "38"}, {"source": "62", "target": "87"}, {"source": "62", "target": "63"}, {"source": "87", "target": "88"}, {"source": "13", "target": "38"}, {"source": "13", "target": "14"}, {"source": "38", "target": "39"}, {"source": "63", "target": "88"}, {"source": "63", "target": "64"}, {"source": "88", "target": "89"}, {"source": "14", "target": "39"}, {"source": "14", "target": "15"}, {"source": "39", "target": "40"}, {"source": "64", "target": "89"}, {"source": "64", "target": "65"}, {"source": "89", "target": "90"}, {"source": "15", "target": "40"}, {"source": "15", "target": "16"}, {"source": "40", "target": "41"}, {"source": "65", "target": "90"}, {"source": "65", "target": "66"}, {"source": "90", "target": "91"}, {"source": "90", "target": "98"}, {"source": "16", "target": "41"}, {"source": "16", "target": "17"}, {"source": "41", "target": "42"}, {"source": "66", "target": "91"}, {"source": "66", "target": "67"}, {"source": "91", "target": "92"}, {"source": "17", "target": "42"}, {"source": "17", "target": "18"}, {"source": "42", "target": "43"}, {"source": "67", "target": "92"}, {"source": "67", "target": "68"}, {"source": "92", "target": "93"}, {"source": "18", "target": "43"}, {"source": "18", "target": "19"}, {"source": "43", "target": "44"}, {"source": "68", "target": "93"}, {"source": "68", "target": "69"}, {"source": "93", "target": "94"}, {"source": "19", "target": "44"}, {"source": "19", "target": "20"}, {"source": "44", "target": "45"}, {"source": "69", "target": "94"}, {"source": "69", "target": "70"}, {"source": "94", "target": "95"}, {"source": "20", "target": "45"}, {"source": "20", "target": "21"}, {"source": "45", "target": "46"}, {"source": "70", "target": "95"}, {"source": "70", "target": "71"}, {"source": "95", "target": "96"}, {"source": "21", "target": "46"}, {"source": "21", "target": "22"}, {"source": "46", "target": "47"}, {"source": "71", "target": "96"}, {"source": "71", "target": "72"}, {"source": "96", "target": "97"}, {"source": "22", "target": "47"}, {"source": "22", "target": "23"}, {"source": "47", "target": "48"}, {"source": "72", "target": "97"}, {"source": "72", "target": "73"}, {"source": "97", "target": "98"}, {"source": "23", "target": "48"}, {"source": "23", "target": "24"}, {"source": "48", "target": "49"}, {"source": "73", "target": "98"}, {"source": "73", "target": "74"}, {"source": "98", "target": "99"}, {"source": "24", "target": "49"}, {"source": "74", "target": "99"}]} -------------------------------------------------------------------------------- /data/cubes2.json: -------------------------------------------------------------------------------- 1 | {"directed": false, "multigraph": false, "graph": {"node_default": {}, "edge_default": {}}, "nodes": [{"x": 4.846327878880757, "y": 5.931990028368435, "id": "0"}, {"x": 33.42597331719167, "y": 0.3815402934785028, "id": "25"}, {"x": 1.4400213536877338, "y": 9.742571407261561, "id": "50"}, {"x": 39.72405051521559, "y": 11.752271282083003, "id": "75"}, {"x": 7.715550586869805, "y": 6.730499701857163, "id": "1"}, {"x": 37.43051465211523, "y": 2.4761973683328256, "id": "26"}, {"x": 5.83653394334644, "y": 11.845760949498406, "id": "51"}, {"x": 32.858753412583795, "y": 14.344510595958077, "id": "76"}, {"x": 4.372212949345926, "y": 7.733242771687258, "id": "2"}, {"x": 30.684642294476333, "y": 2.0571692279942977, "id": "27"}, {"x": 6.886737786174538, "y": 8.916086112633545, "id": "52"}, {"x": 35.46425064286342, "y": 15.433720546588265, "id": "77"}, {"x": 5.330998517352423, "y": 3.5020130778525527, "id": "3"}, {"x": 30.60772523929138, "y": 3.059001062077169, "id": "28"}, {"x": 8.234733471473799, "y": 11.991720215999491, "id": "53"}, {"x": 35.07957426048541, "y": 11.717646192390042, "id": "78"}, {"x": 0.4529257813104537, "y": 5.1355854816420194, "id": "4"}, {"x": 38.55466195206003, "y": 9.354030377636404, "id": "29"}, {"x": 5.859506737848742, "y": 15.98428394063107, "id": "54"}, {"x": 30.480240829112166, "y": 9.461719013905215, "id": "79"}, {"x": 6.850851014210599, "y": 1.175451183514472, "id": "5"}, {"x": 34.881318853712486, "y": 8.360361285817909, "id": "30"}, {"x": 8.962564121145087, "y": 15.39285269990571, "id": "55"}, {"x": 39.52478942728693, "y": 12.716572577730105, "id": "80"}, {"x": 9.333182362319373, "y": 7.407955654050717, "id": "6"}, {"x": 35.44500051631122, "y": 9.571036282187071, "id": "31"}, {"x": 1.2902779164111022, "y": 16.617722037769802, "id": "56"}, {"x": 36.132916533561556, "y": 13.088844400783739, "id": "81"}, {"x": 2.466268540972645, "y": 9.060621206156052, "id": "7"}, {"x": 32.23939869052253, "y": 1.0250710364057947, "id": "32"}, {"x": 0.40157556012157536, "y": 9.942511559674163, "id": "57"}, {"x": 35.811907633332666, "y": 11.399440231672617, "id": "82"}, {"x": 6.401227054360645, "y": 0.7075905895647372, "id": "8"}, {"x": 38.0452595820816, "y": 1.7817559030715402, "id": "33"}, {"x": 9.349180140301046, "y": 11.36724335931448, "id": "58"}, {"x": 35.45367008817289, "y": 14.057417107210734, "id": "83"}, {"x": 6.194233373478763, "y": 1.6310700560174862, "id": "9"}, {"x": 31.416291170410002, "y": 2.616358139078361, "id": "34"}, {"x": 4.6529224815774315, "y": 9.092250493061083, "id": "59"}, {"x": 38.871799092581284, "y": 8.600160387545523, "id": "84"}, {"x": 3.739881125686524, "y": 5.621713977881983, "id": "10"}, {"x": 32.74385859996699, "y": 2.924158664193497, "id": "35"}, {"x": 2.1465920832555363, "y": 8.506347191543016, "id": "60"}, {"x": 30.928142621206657, "y": 11.374570499463369, "id": "85"}, {"x": 1.4376845571087438, "y": 1.3223906908471295, "id": "11"}, {"x": 39.235262781474496, "y": 7.374155680347805, "id": "36"}, {"x": 9.495373094428784, "y": 9.366981898437384, "id": "61"}, {"x": 38.752305200310786, "y": 11.230011416424844, "id": "86"}, {"x": 8.480776704495964, "y": 8.173750059996229, "id": "12"}, {"x": 36.59168798896201, "y": 3.234309314332795, "id": "37"}, {"x": 9.612603233219607, "y": 11.662745927267133, "id": "62"}, {"x": 39.40626093312935, "y": 8.761127166774639, "id": "87"}, {"x": 8.935249217633977, "y": 5.314983106870468, "id": "13"}, {"x": 38.31657573905434, "y": 1.145957438698093, "id": "38"}, {"x": 8.032883964107585, "y": 12.545588776628287, "id": "63"}, {"x": 39.44528063495696, "y": 14.918807985034878, "id": "88"}, {"x": 1.1244633476285049, "y": 7.093832818264786, "id": "14"}, {"x": 30.10933751686615, "y": 1.5086723915152966, "id": "39"}, {"x": 1.0819308295809338, "y": 10.697973913850246, "id": "64"}, {"x": 35.78488800943264, "y": 11.951612541792343, "id": "89"}, {"x": 6.969302503076498, "y": 3.0607172875166677, "id": "15"}, {"x": 32.70739421547401, "y": 1.9775444918494667, "id": "40"}, {"x": 0.1752337879750776, "y": 8.259123455302852, "id": "65"}, {"x": 36.570925649175784, "y": 14.103750233246169, "id": "90"}, {"x": 2.7008281674341816, "y": 6.688632249064803, "id": "16"}, {"x": 37.43399975281213, "y": 4.07417069135371, "id": "41"}, {"x": 4.350400434287614, "y": 8.863224488585548, "id": "66"}, {"x": 36.089824440702444, "y": 11.416006543150807, "id": "91"}, {"x": 8.387851625516031, "y": 4.594816954646221, "id": "17"}, {"x": 35.14626263670482, "y": 6.782963603166431, "id": "42"}, {"x": 8.390642756626637, "y": 10.909395244656505, "id": "67"}, {"x": 39.746956414278436, "y": 13.513798820828564, "id": "92"}, {"x": 1.9995791530564033, "y": 1.7448827140456091, "id": "18"}, {"x": 33.96735812121115, "y": 3.716881784940992, "id": "43"}, {"x": 7.251063823148717, "y": 14.105432279033462, "id": "68"}, {"x": 32.47322049830323, "y": 10.917202449764451, "id": "93"}, {"x": 1.7072508575701861, "y": 3.9592905017761373, "id": "19"}, {"x": 36.775531053973246, "y": 9.20227421871282, "id": "44"}, {"x": 4.96953498408298, "y": 16.35154308635545, "id": "69"}, {"x": 37.70792305232233, "y": 17.659489192922592, "id": "94"}, {"x": 1.2321395352738473, "y": 9.820705027323912, "id": "20"}, {"x": 36.74756027508928, "y": 9.065462471443718, "id": "45"}, {"x": 2.2954430600471074, "y": 12.83531484710073, "id": "70"}, {"x": 34.03024515803486, "y": 9.96541084475753, "id": "95"}, {"x": 2.169001155727387, "y": 1.1658668308010434, "id": "21"}, {"x": 37.018458388528295, "y": 4.294415793158822, "id": "46"}, {"x": 9.947720148145917, "y": 12.773098952714419, "id": "71"}, {"x": 36.71543166303605, "y": 12.8179829319985, "id": "96"}, {"x": 2.280859577921064, "y": 3.0330168063608944, "id": "22"}, {"x": 37.75872777497091, "y": 7.481000848519921, "id": "47"}, {"x": 4.783562530979472, "y": 14.706212414308412, "id": "72"}, {"x": 37.10792842485325, "y": 14.493889212420598, "id": "97"}, {"x": 0.8828749876125042, "y": 8.07782490309109, "id": "23"}, {"x": 34.77270943035627, "y": 0.2603398727706274, "id": "48"}, {"x": 5.41243631706661, "y": 11.031782837813752, "id": "73"}, {"x": 34.08259557336202, "y": 8.901600145206123, "id": "98"}, {"x": 3.290133133841695, "y": 4.559235314084327, "id": "24"}, {"x": 36.710511478639305, "y": 5.784369731120095, "id": "49"}, {"x": 0.9592023806912531, "y": 10.168052116978473, "id": "74"}, {"x": 35.786505050482056, "y": 15.208291618069822, "id": "99"}], "links": [{"source": "0", "target": "25"}, {"source": "0", "target": "1"}, {"source": "25", "target": "26"}, {"source": "50", "target": "75"}, {"source": "50", "target": "51"}, {"source": "75", "target": "76"}, {"source": "1", "target": "26"}, {"source": "1", "target": "2"}, {"source": "26", "target": "27"}, {"source": "51", "target": "76"}, {"source": "51", "target": "52"}, {"source": "76", "target": "77"}, {"source": "2", "target": "27"}, {"source": "2", "target": "3"}, {"source": "2", "target": "7"}, {"source": "27", "target": "28"}, {"source": "27", "target": "34"}, {"source": "52", "target": "77"}, {"source": "52", "target": "53"}, {"source": "77", "target": "78"}, {"source": "77", "target": "82"}, {"source": "3", "target": "28"}, {"source": "3", "target": "4"}, {"source": "28", "target": "29"}, {"source": "53", "target": "78"}, {"source": "53", "target": "54"}, {"source": "78", "target": "79"}, {"source": "4", "target": "29"}, {"source": "4", "target": "5"}, {"source": "29", "target": "30"}, {"source": "54", "target": "79"}, {"source": "54", "target": "55"}, {"source": "79", "target": "80"}, {"source": "5", "target": "30"}, {"source": "5", "target": "6"}, {"source": "30", "target": "31"}, {"source": "55", "target": "80"}, {"source": "55", "target": "56"}, {"source": "80", "target": "81"}, {"source": "6", "target": "31"}, {"source": "6", "target": "7"}, {"source": "31", "target": "32"}, {"source": "56", "target": "81"}, {"source": "56", "target": "57"}, {"source": "81", "target": "82"}, {"source": "7", "target": "32"}, {"source": "7", "target": "8"}, {"source": "32", "target": "33"}, {"source": "57", "target": "82"}, {"source": "57", "target": "58"}, {"source": "82", "target": "83"}, {"source": "8", "target": "33"}, {"source": "8", "target": "9"}, {"source": "33", "target": "34"}, {"source": "58", "target": "83"}, {"source": "58", "target": "59"}, {"source": "83", "target": "84"}, {"source": "9", "target": "34"}, {"source": "9", "target": "10"}, {"source": "34", "target": "35"}, {"source": "59", "target": "84"}, {"source": "59", "target": "60"}, {"source": "59", "target": "69"}, {"source": "84", "target": "85"}, {"source": "10", "target": "35"}, {"source": "10", "target": "11"}, {"source": "35", "target": "36"}, {"source": "60", "target": "85"}, {"source": "60", "target": "61"}, {"source": "85", "target": "86"}, {"source": "11", "target": "36"}, {"source": "11", "target": "12"}, {"source": "36", "target": "37"}, {"source": "61", "target": "86"}, {"source": "61", "target": "62"}, {"source": "86", "target": "87"}, {"source": "12", "target": "37"}, {"source": "12", "target": "13"}, {"source": "37", "target": "38"}, {"source": "62", "target": "87"}, {"source": "62", "target": "63"}, {"source": "87", "target": "88"}, {"source": "13", "target": "38"}, {"source": "13", "target": "14"}, {"source": "38", "target": "39"}, {"source": "63", "target": "88"}, {"source": "63", "target": "64"}, {"source": "88", "target": "89"}, {"source": "14", "target": "39"}, {"source": "14", "target": "15"}, {"source": "39", "target": "40"}, {"source": "64", "target": "89"}, {"source": "64", "target": "65"}, {"source": "89", "target": "90"}, {"source": "15", "target": "40"}, {"source": "15", "target": "16"}, {"source": "40", "target": "41"}, {"source": "65", "target": "90"}, {"source": "65", "target": "66"}, {"source": "90", "target": "91"}, {"source": "16", "target": "41"}, {"source": "16", "target": "17"}, {"source": "41", "target": "42"}, {"source": "66", "target": "91"}, {"source": "66", "target": "67"}, {"source": "91", "target": "92"}, {"source": "17", "target": "42"}, {"source": "17", "target": "18"}, {"source": "42", "target": "43"}, {"source": "67", "target": "92"}, {"source": "67", "target": "68"}, {"source": "92", "target": "93"}, {"source": "18", "target": "43"}, {"source": "18", "target": "19"}, {"source": "43", "target": "44"}, {"source": "68", "target": "93"}, {"source": "68", "target": "69"}, {"source": "93", "target": "94"}, {"source": "19", "target": "44"}, {"source": "19", "target": "20"}, {"source": "44", "target": "45"}, {"source": "69", "target": "94"}, {"source": "69", "target": "70"}, {"source": "94", "target": "95"}, {"source": "20", "target": "45"}, {"source": "20", "target": "21"}, {"source": "45", "target": "46"}, {"source": "70", "target": "95"}, {"source": "70", "target": "71"}, {"source": "95", "target": "96"}, {"source": "21", "target": "46"}, {"source": "21", "target": "22"}, {"source": "46", "target": "47"}, {"source": "71", "target": "96"}, {"source": "71", "target": "72"}, {"source": "96", "target": "97"}, {"source": "22", "target": "47"}, {"source": "22", "target": "23"}, {"source": "47", "target": "48"}, {"source": "72", "target": "97"}, {"source": "72", "target": "73"}, {"source": "97", "target": "98"}, {"source": "23", "target": "48"}, {"source": "23", "target": "24"}, {"source": "48", "target": "49"}, {"source": "73", "target": "98"}, {"source": "73", "target": "74"}, {"source": "98", "target": "99"}, {"source": "24", "target": "49"}, {"source": "74", "target": "99"}]} -------------------------------------------------------------------------------- /data/cubes3.json: -------------------------------------------------------------------------------- 1 | {"directed": false, "multigraph": false, "graph": {"node_default": {}, "edge_default": {}}, "nodes": [{"x": 7.075814434733888, "y": 0.3615708045639199, "id": "0"}, {"x": 31.948430763982287, "y": 1.9157507017552822, "id": "25"}, {"x": 9.059208257646764, "y": 17.560320338032625, "id": "50"}, {"x": 35.47337149872503, "y": 13.785405491705285, "id": "75"}, {"x": 9.885439520181883, "y": 3.3430860323891998, "id": "1"}, {"x": 34.99341786647161, "y": 7.174132163348518, "id": "26"}, {"x": 9.464183547532937, "y": 15.225384838693591, "id": "51"}, {"x": 37.515078876209444, "y": 14.377737566927639, "id": "76"}, {"x": 3.28518370343583, "y": 5.028646886480282, "id": "2"}, {"x": 38.39131001544028, "y": 3.9318095014405277, "id": "27"}, {"x": 9.845036831653095, "y": 17.2066486818558, "id": "52"}, {"x": 35.44107858140609, "y": 12.46955499973586, "id": "77"}, {"x": 4.663634127277664, "y": 6.897711233320429, "id": "3"}, {"x": 31.791077375844427, "y": 7.5834024582144615, "id": "28"}, {"x": 2.0357549315289503, "y": 20.298651254733635, "id": "53"}, {"x": 33.36225041929235, "y": 19.782423715160853, "id": "78"}, {"x": 2.6537133926920653, "y": 9.949187973787165, "id": "4"}, {"x": 32.170404085673184, "y": 7.61186282897615, "id": "29"}, {"x": 9.092715934143527, "y": 14.64183498614258, "id": "54"}, {"x": 38.31787744889725, "y": 19.937892510956328, "id": "79"}, {"x": 9.269821227205437, "y": 2.9638810751313684, "id": "5"}, {"x": 32.28466465754125, "y": 9.103510170682917, "id": "30"}, {"x": 1.3579949938301528, "y": 17.890835410168528, "id": "55"}, {"x": 38.68931715351704, "y": 13.026422161015024, "id": "80"}, {"x": 8.34458288283223, "y": 0.5097168896557125, "id": "6"}, {"x": 34.50106519664788, "y": 7.8946498487859165, "id": "31"}, {"x": 8.625036236801911, "y": 19.57172985772086, "id": "56"}, {"x": 30.79336444513005, "y": 14.126276697428548, "id": "81"}, {"x": 6.838340780553649, "y": 2.161900728919445, "id": "7"}, {"x": 34.30956623634442, "y": 2.1303486643807377, "id": "32"}, {"x": 9.801981029535566, "y": 12.717636215801715, "id": "57"}, {"x": 37.645093671967615, "y": 12.394676521405843, "id": "82"}, {"x": 0.18087280361040903, "y": 4.046971338398596, "id": "8"}, {"x": 34.97009767521977, "y": 2.0542287265365298, "id": "33"}, {"x": 7.894721228348672, "y": 16.805499709275757, "id": "58"}, {"x": 36.956991407730115, "y": 17.652582634390537, "id": "83"}, {"x": 1.8651461274138414, "y": 1.0718999194543455, "id": "9"}, {"x": 31.456668244394884, "y": 1.234450836395331, "id": "34"}, {"x": 4.700233397825167, "y": 16.81135503815677, "id": "59"}, {"x": 39.564240402596795, "y": 18.055376763746327, "id": "84"}, {"x": 4.365743153063546, "y": 6.806592598454856, "id": "10"}, {"x": 37.90089593251397, "y": 5.540066540056996, "id": "35"}, {"x": 8.111238287583847, "y": 15.756523521643782, "id": "60"}, {"x": 32.6075065698605, "y": 19.05092386782654, "id": "85"}, {"x": 4.727663104431967, "y": 9.817290370838824, "id": "11"}, {"x": 34.2731308446876, "y": 4.372473770081873, "id": "36"}, {"x": 7.27236826882054, "y": 13.579257777514155, "id": "61"}, {"x": 31.156532503872086, "y": 13.585526265876581, "id": "86"}, {"x": 2.0694894031433764, "y": 5.456591520941949, "id": "12"}, {"x": 31.265783638732493, "y": 3.4387013554108092, "id": "37"}, {"x": 4.2163360001348416, "y": 15.622975625783845, "id": "62"}, {"x": 31.846864092083432, "y": 13.669455484346708, "id": "87"}, {"x": 4.54539015003104, "y": 5.251672005028309, "id": "13"}, {"x": 33.22621491603446, "y": 7.41658075228814, "id": "38"}, {"x": 0.9430526968973463, "y": 16.97851740572117, "id": "63"}, {"x": 36.146604156415655, "y": 11.264777046051067, "id": "88"}, {"x": 9.800406172228854, "y": 7.495868755657458, "id": "14"}, {"x": 31.179280576690125, "y": 0.8722760735502433, "id": "39"}, {"x": 0.9096427231270787, "y": 11.186650800844212, "id": "64"}, {"x": 38.786180826008774, "y": 20.356531743903084, "id": "89"}, {"x": 4.838619199421602, "y": 3.8160416729152957, "id": "15"}, {"x": 35.10343919453421, "y": 7.297810265072884, "id": "40"}, {"x": 5.74080827889747, "y": 20.32751663062998, "id": "65"}, {"x": 30.245742749772752, "y": 19.53481589206309, "id": "90"}, {"x": 5.028823161498312, "y": 5.320746898489494, "id": "16"}, {"x": 32.82351104170801, "y": 3.788634105556711, "id": "41"}, {"x": 8.047592904176732, "y": 20.679187057754213, "id": "66"}, {"x": 37.78073273590162, "y": 17.37316194590883, "id": "91"}, {"x": 0.25424462181147245, "y": 6.419501930508533, "id": "17"}, {"x": 34.006267549654275, "y": 4.592562079906706, "id": "42"}, {"x": 8.39990274373147, "y": 12.087808671988853, "id": "67"}, {"x": 31.244774992832745, "y": 15.792470769917422, "id": "92"}, {"x": 6.327655139679599, "y": 6.012249397850348, "id": "18"}, {"x": 30.98571562368318, "y": 9.371077446719072, "id": "43"}, {"x": 8.385973600117877, "y": 18.809087162748128, "id": "68"}, {"x": 32.78175858865941, "y": 18.6245480394898, "id": "93"}, {"x": 2.0816796988005235, "y": 2.863107062330016, "id": "19"}, {"x": 33.172458653689596, "y": 9.223139283047768, "id": "44"}, {"x": 6.841107784413939, "y": 16.513723181180964, "id": "69"}, {"x": 32.48054501965472, "y": 11.363549029965357, "id": "94"}, {"x": 1.7364072064711744, "y": 7.387626815840518, "id": "20"}, {"x": 32.71643907371003, "y": 2.509953829335503, "id": "45"}, {"x": 5.421001459283746, "y": 19.967104335489147, "id": "70"}, {"x": 31.1807814721488, "y": 20.617761148772132, "id": "95"}, {"x": 4.341008546251803, "y": 2.709653128388274, "id": "21"}, {"x": 37.250882064135006, "y": 3.899206698251525, "id": "46"}, {"x": 7.721994557124438, "y": 14.621484974909185, "id": "71"}, {"x": 36.35924717318332, "y": 20.562053853326674, "id": "96"}, {"x": 6.406940324305492, "y": 9.315091382258172, "id": "22"}, {"x": 36.85859742971444, "y": 5.327088137556083, "id": "47"}, {"x": 4.765861347748993, "y": 11.657453988347418, "id": "72"}, {"x": 36.80390377648511, "y": 16.203791130208785, "id": "97"}, {"x": 8.12197311908143, "y": 1.3114609836162516, "id": "23"}, {"x": 39.96909730294284, "y": 9.244942062373822, "id": "48"}, {"x": 0.1758891722801159, "y": 13.549187951093412, "id": "73"}, {"x": 39.536509002624214, "y": 18.210754318542627, "id": "98"}, {"x": 3.053733209029348, "y": 7.170454217133168, "id": "24"}, {"x": 32.72782244682669, "y": 9.527862306251956, "id": "49"}, {"x": 3.0592415331123393, "y": 18.19211425879421, "id": "74"}, {"x": 34.36415161951747, "y": 16.883470447423715, "id": "99"}], "links": [{"source": "0", "target": "25"}, {"source": "0", "target": "1"}, {"source": "25", "target": "26"}, {"source": "50", "target": "75"}, {"source": "50", "target": "51"}, {"source": "75", "target": "76"}, {"source": "75", "target": "86"}, {"source": "1", "target": "26"}, {"source": "1", "target": "2"}, {"source": "26", "target": "27"}, {"source": "51", "target": "76"}, {"source": "51", "target": "52"}, {"source": "76", "target": "77"}, {"source": "2", "target": "27"}, {"source": "2", "target": "3"}, {"source": "27", "target": "28"}, {"source": "52", "target": "77"}, {"source": "52", "target": "53"}, {"source": "77", "target": "78"}, {"source": "3", "target": "28"}, {"source": "3", "target": "4"}, {"source": "28", "target": "29"}, {"source": "53", "target": "78"}, {"source": "53", "target": "54"}, {"source": "78", "target": "79"}, {"source": "4", "target": "29"}, {"source": "4", "target": "5"}, {"source": "29", "target": "30"}, {"source": "54", "target": "79"}, {"source": "54", "target": "55"}, {"source": "79", "target": "80"}, {"source": "5", "target": "30"}, {"source": "5", "target": "6"}, {"source": "30", "target": "31"}, {"source": "55", "target": "80"}, {"source": "55", "target": "56"}, {"source": "80", "target": "81"}, {"source": "6", "target": "31"}, {"source": "6", "target": "7"}, {"source": "31", "target": "32"}, {"source": "56", "target": "81"}, {"source": "56", "target": "57"}, {"source": "81", "target": "82"}, {"source": "7", "target": "32"}, {"source": "7", "target": "8"}, {"source": "32", "target": "33"}, {"source": "57", "target": "82"}, {"source": "57", "target": "58"}, {"source": "82", "target": "83"}, {"source": "8", "target": "33"}, {"source": "8", "target": "9"}, {"source": "33", "target": "34"}, {"source": "58", "target": "83"}, {"source": "58", "target": "59"}, {"source": "83", "target": "84"}, {"source": "9", "target": "34"}, {"source": "9", "target": "10"}, {"source": "34", "target": "35"}, {"source": "34", "target": "39"}, {"source": "59", "target": "84"}, {"source": "59", "target": "60"}, {"source": "84", "target": "85"}, {"source": "10", "target": "35"}, {"source": "10", "target": "11"}, {"source": "35", "target": "36"}, {"source": "60", "target": "85"}, {"source": "60", "target": "61"}, {"source": "85", "target": "86"}, {"source": "11", "target": "36"}, {"source": "11", "target": "12"}, {"source": "36", "target": "37"}, {"source": "61", "target": "86"}, {"source": "61", "target": "62"}, {"source": "86", "target": "87"}, {"source": "12", "target": "37"}, {"source": "12", "target": "13"}, {"source": "37", "target": "38"}, {"source": "62", "target": "87"}, {"source": "62", "target": "63"}, {"source": "87", "target": "88"}, {"source": "13", "target": "38"}, {"source": "13", "target": "14"}, {"source": "13", "target": "21"}, {"source": "38", "target": "39"}, {"source": "63", "target": "88"}, {"source": "63", "target": "64"}, {"source": "88", "target": "89"}, {"source": "14", "target": "39"}, {"source": "14", "target": "15"}, {"source": "39", "target": "40"}, {"source": "64", "target": "89"}, {"source": "64", "target": "65"}, {"source": "89", "target": "90"}, {"source": "15", "target": "40"}, {"source": "15", "target": "16"}, {"source": "40", "target": "41"}, {"source": "65", "target": "90"}, {"source": "65", "target": "66"}, {"source": "90", "target": "91"}, {"source": "16", "target": "41"}, {"source": "16", "target": "17"}, {"source": "41", "target": "42"}, {"source": "66", "target": "91"}, {"source": "66", "target": "67"}, {"source": "91", "target": "92"}, {"source": "17", "target": "42"}, {"source": "17", "target": "18"}, {"source": "42", "target": "43"}, {"source": "67", "target": "92"}, {"source": "67", "target": "68"}, {"source": "67", "target": "72"}, {"source": "92", "target": "93"}, {"source": "18", "target": "43"}, {"source": "18", "target": "19"}, {"source": "43", "target": "44"}, {"source": "68", "target": "93"}, {"source": "68", "target": "69"}, {"source": "93", "target": "94"}, {"source": "19", "target": "44"}, {"source": "19", "target": "20"}, {"source": "44", "target": "45"}, {"source": "69", "target": "94"}, {"source": "69", "target": "70"}, {"source": "94", "target": "95"}, {"source": "20", "target": "45"}, {"source": "20", "target": "21"}, {"source": "45", "target": "46"}, {"source": "70", "target": "95"}, {"source": "70", "target": "71"}, {"source": "95", "target": "96"}, {"source": "21", "target": "46"}, {"source": "21", "target": "22"}, {"source": "46", "target": "47"}, {"source": "71", "target": "96"}, {"source": "71", "target": "72"}, {"source": "96", "target": "97"}, {"source": "22", "target": "47"}, {"source": "22", "target": "23"}, {"source": "47", "target": "48"}, {"source": "72", "target": "97"}, {"source": "72", "target": "73"}, {"source": "97", "target": "98"}, {"source": "23", "target": "48"}, {"source": "23", "target": "24"}, {"source": "48", "target": "49"}, {"source": "73", "target": "98"}, {"source": "73", "target": "74"}, {"source": "98", "target": "99"}, {"source": "24", "target": "49"}, {"source": "74", "target": "99"}]} -------------------------------------------------------------------------------- /data/cubes4.json: -------------------------------------------------------------------------------- 1 | {"directed": false, "multigraph": false, "graph": {"node_default": {}, "edge_default": {}}, "nodes": [{"x": 8.75552889978818, "y": 5.730212784793665, "id": "0"}, {"x": 33.38709823310424, "y": 6.522315981920589, "id": "25"}, {"x": 1.4820158712002929, "y": 14.696721598262844, "id": "50"}, {"x": 33.334169245792545, "y": 13.576947091256063, "id": "75"}, {"x": 8.539480726982301, "y": 7.5684920195156735, "id": "1"}, {"x": 36.190963876603675, "y": 0.9895441537595595, "id": "26"}, {"x": 4.643050747115537, "y": 11.774730044114069, "id": "51"}, {"x": 38.02482016669935, "y": 19.737054373963986, "id": "76"}, {"x": 3.5904823157755605, "y": 9.80073012399653, "id": "2"}, {"x": 30.954774121791427, "y": 4.544603076619042, "id": "27"}, {"x": 9.773107567766868, "y": 18.587930948474625, "id": "52"}, {"x": 36.285230510648475, "y": 17.740391282949982, "id": "77"}, {"x": 0.030215245147914294, "y": 6.756950083399196, "id": "3"}, {"x": 30.20185570474177, "y": 4.501155486334735, "id": "28"}, {"x": 6.7456682297783255, "y": 19.979223418196963, "id": "53"}, {"x": 39.925366643856464, "y": 17.519576246455557, "id": "78"}, {"x": 4.825521054198986, "y": 0.9336788826820241, "id": "4"}, {"x": 38.360638456702034, "y": 9.02452519159546, "id": "29"}, {"x": 6.38383249055561, "y": 13.561263350471958, "id": "54"}, {"x": 31.511134898231546, "y": 13.587783693682201, "id": "79"}, {"x": 3.8447092445797892, "y": 2.327769912872607, "id": "5"}, {"x": 34.48001155356142, "y": 3.481602799678152, "id": "30"}, {"x": 8.787441197789017, "y": 14.548232854120428, "id": "55"}, {"x": 39.06233710691516, "y": 15.727672555758932, "id": "80"}, {"x": 4.026824419733545, "y": 3.0844406819728762, "id": "6"}, {"x": 30.594901217026056, "y": 4.835774563696984, "id": "31"}, {"x": 8.543560906503053, "y": 19.178940275890653, "id": "56"}, {"x": 39.281600220846485, "y": 18.233938184782126, "id": "81"}, {"x": 6.647523641400246, "y": 3.54833515634134, "id": "7"}, {"x": 35.80501923571495, "y": 1.7272818624695252, "id": "32"}, {"x": 5.5060621218977115, "y": 15.829512709818836, "id": "57"}, {"x": 38.56174606689513, "y": 16.841154316298045, "id": "82"}, {"x": 1.959798097646126, "y": 6.6293456051547475, "id": "8"}, {"x": 35.38194895113462, "y": 2.0689240561970976, "id": "33"}, {"x": 9.615816438222133, "y": 12.336349717929265, "id": "58"}, {"x": 35.58787307618213, "y": 12.920413718807078, "id": "83"}, {"x": 5.732375700553778, "y": 5.595793567134528, "id": "9"}, {"x": 31.520154069164906, "y": 1.4636196873507445, "id": "34"}, {"x": 5.3335253359560255, "y": 15.856185264026093, "id": "59"}, {"x": 30.995786446574535, "y": 17.219079031758632, "id": "84"}, {"x": 5.271881551670453, "y": 4.751617846634738, "id": "10"}, {"x": 38.98971002440485, "y": 7.180726409997983, "id": "35"}, {"x": 1.7721416201535656, "y": 15.309655792785865, "id": "60"}, {"x": 34.02146396555179, "y": 18.264380664409977, "id": "85"}, {"x": 4.719084008903803, "y": 1.8678879213134125, "id": "11"}, {"x": 39.81441505276044, "y": 7.416382951131463, "id": "36"}, {"x": 6.572092281196006, "y": 17.134612343490147, "id": "61"}, {"x": 31.608079299316998, "y": 17.43033275756309, "id": "86"}, {"x": 5.842073557777633, "y": 7.434699519426742, "id": "12"}, {"x": 36.55751561121001, "y": 6.493557966804074, "id": "37"}, {"x": 8.642927405029413, "y": 12.355964182335821, "id": "62"}, {"x": 33.21433284487051, "y": 16.835755641323374, "id": "87"}, {"x": 1.5132401823937869, "y": 2.145229872369817, "id": "13"}, {"x": 37.33542101053258, "y": 8.38969827727293, "id": "38"}, {"x": 6.783028491832774, "y": 18.623127923104605, "id": "63"}, {"x": 34.06722955360464, "y": 17.731206281725818, "id": "88"}, {"x": 9.551092970555748, "y": 5.932735219381888, "id": "14"}, {"x": 36.41004756105636, "y": 9.263998859273219, "id": "39"}, {"x": 0.33085108975442257, "y": 11.147087366220845, "id": "64"}, {"x": 39.948303506185326, "y": 13.493708984029118, "id": "89"}, {"x": 4.397871551532745, "y": 8.322080826294815, "id": "15"}, {"x": 35.424356996117886, "y": 6.0298929030793875, "id": "40"}, {"x": 0.09984691796165901, "y": 17.64641058596318, "id": "65"}, {"x": 35.80896496639769, "y": 13.157435190652238, "id": "90"}, {"x": 9.02234738739104, "y": 8.731648509034919, "id": "16"}, {"x": 37.33128389430536, "y": 3.5442778456970037, "id": "41"}, {"x": 4.039845094691409, "y": 13.908034512233098, "id": "66"}, {"x": 33.19922325538235, "y": 18.177264597470607, "id": "91"}, {"x": 0.9987838182591391, "y": 3.3128938952810927, "id": "17"}, {"x": 39.026590417690436, "y": 0.05632614636508326, "id": "42"}, {"x": 3.188796445571054, "y": 18.598948958007746, "id": "67"}, {"x": 39.62078205972571, "y": 16.504976463016416, "id": "92"}, {"x": 4.4588504441764085, "y": 6.589402699024537, "id": "18"}, {"x": 38.71624166180014, "y": 1.858767468674184, "id": "43"}, {"x": 4.843755747490298, "y": 16.696362948275826, "id": "68"}, {"x": 37.54950303289034, "y": 15.956338202749192, "id": "93"}, {"x": 6.9026130647920505, "y": 2.182155351520768, "id": "19"}, {"x": 38.65306263476616, "y": 9.589306388907474, "id": "44"}, {"x": 3.3954275129615286, "y": 11.566414186685314, "id": "69"}, {"x": 38.83990857313865, "y": 19.653881876312305, "id": "94"}, {"x": 3.5285469002395766, "y": 6.665920334106193, "id": "20"}, {"x": 37.4746363771639, "y": 4.92513372739801, "id": "45"}, {"x": 8.405845863428837, "y": 20.53353854185108, "id": "70"}, {"x": 38.30409405006833, "y": 15.044837316519288, "id": "95"}, {"x": 0.6372521336889758, "y": 3.818274596383672, "id": "21"}, {"x": 34.62956080643719, "y": 3.1465196013539054, "id": "46"}, {"x": 5.340413421580951, "y": 20.83964812655406, "id": "71"}, {"x": 32.00815817610156, "y": 17.213055201755893, "id": "96"}, {"x": 5.464028878411269, "y": 8.658971372374268, "id": "22"}, {"x": 37.65375043608174, "y": 8.940671554390029, "id": "47"}, {"x": 5.285996649778503, "y": 20.472221415830052, "id": "72"}, {"x": 39.258233868885156, "y": 12.651305566381332, "id": "97"}, {"x": 0.04295724405129153, "y": 3.2043636951441745, "id": "23"}, {"x": 32.42022854276952, "y": 9.183349872071702, "id": "48"}, {"x": 9.519997627808356, "y": 14.37591447532028, "id": "73"}, {"x": 32.214650217251155, "y": 11.456700006463326, "id": "98"}, {"x": 0.8340484833500594, "y": 0.41612673516077336, "id": "24"}, {"x": 32.58043352326938, "y": 5.8091741765926965, "id": "49"}, {"x": 4.30737826893962, "y": 14.587860339510101, "id": "74"}, {"x": 35.72676060889013, "y": 20.99240936025072, "id": "99"}], "links": [{"source": "0", "target": "75"}, {"source": "0", "target": "1"}, {"source": "25", "target": "50"}, {"source": "25", "target": "26"}, {"source": "50", "target": "51"}, {"source": "75", "target": "76"}, {"source": "1", "target": "76"}, {"source": "1", "target": "2"}, {"source": "26", "target": "51"}, {"source": "26", "target": "27"}, {"source": "51", "target": "52"}, {"source": "76", "target": "77"}, {"source": "2", "target": "77"}, {"source": "2", "target": "3"}, {"source": "27", "target": "52"}, {"source": "27", "target": "28"}, {"source": "52", "target": "53"}, {"source": "77", "target": "78"}, {"source": "3", "target": "78"}, {"source": "3", "target": "4"}, {"source": "3", "target": "14"}, {"source": "28", "target": "53"}, {"source": "28", "target": "29"}, {"source": "53", "target": "54"}, {"source": "78", "target": "79"}, {"source": "4", "target": "79"}, {"source": "4", "target": "5"}, {"source": "29", "target": "54"}, {"source": "29", "target": "30"}, {"source": "54", "target": "55"}, {"source": "79", "target": "80"}, {"source": "5", "target": "80"}, {"source": "5", "target": "6"}, {"source": "30", "target": "55"}, {"source": "30", "target": "31"}, {"source": "30", "target": "49"}, {"source": "55", "target": "56"}, {"source": "80", "target": "81"}, {"source": "6", "target": "81"}, {"source": "6", "target": "7"}, {"source": "31", "target": "56"}, {"source": "31", "target": "32"}, {"source": "56", "target": "57"}, {"source": "81", "target": "82"}, {"source": "7", "target": "82"}, {"source": "7", "target": "8"}, {"source": "32", "target": "57"}, {"source": "32", "target": "33"}, {"source": "57", "target": "58"}, {"source": "82", "target": "83"}, {"source": "8", "target": "83"}, {"source": "8", "target": "9"}, {"source": "33", "target": "58"}, {"source": "33", "target": "34"}, {"source": "58", "target": "59"}, {"source": "58", "target": "69"}, {"source": "83", "target": "84"}, {"source": "9", "target": "84"}, {"source": "9", "target": "10"}, {"source": "34", "target": "59"}, {"source": "34", "target": "35"}, {"source": "59", "target": "60"}, {"source": "84", "target": "85"}, {"source": "10", "target": "85"}, {"source": "10", "target": "11"}, {"source": "35", "target": "60"}, {"source": "35", "target": "36"}, {"source": "60", "target": "61"}, {"source": "85", "target": "86"}, {"source": "11", "target": "86"}, {"source": "11", "target": "12"}, {"source": "36", "target": "61"}, {"source": "36", "target": "37"}, {"source": "61", "target": "62"}, {"source": "86", "target": "87"}, {"source": "12", "target": "87"}, {"source": "12", "target": "13"}, {"source": "37", "target": "62"}, {"source": "37", "target": "38"}, {"source": "62", "target": "63"}, {"source": "87", "target": "88"}, {"source": "13", "target": "88"}, {"source": "13", "target": "14"}, {"source": "38", "target": "63"}, {"source": "38", "target": "39"}, {"source": "63", "target": "64"}, {"source": "88", "target": "89"}, {"source": "14", "target": "89"}, {"source": "14", "target": "15"}, {"source": "39", "target": "64"}, {"source": "39", "target": "40"}, {"source": "64", "target": "65"}, {"source": "89", "target": "90"}, {"source": "89", "target": "97"}, {"source": "15", "target": "90"}, {"source": "15", "target": "16"}, {"source": "40", "target": "65"}, {"source": "40", "target": "41"}, {"source": "65", "target": "66"}, {"source": "90", "target": "91"}, {"source": "16", "target": "91"}, {"source": "16", "target": "17"}, {"source": "41", "target": "66"}, {"source": "41", "target": "42"}, {"source": "66", "target": "67"}, {"source": "91", "target": "92"}, {"source": "17", "target": "92"}, {"source": "17", "target": "18"}, {"source": "42", "target": "67"}, {"source": "42", "target": "43"}, {"source": "67", "target": "68"}, {"source": "92", "target": "93"}, {"source": "18", "target": "93"}, {"source": "18", "target": "19"}, {"source": "43", "target": "68"}, {"source": "43", "target": "44"}, {"source": "68", "target": "69"}, {"source": "93", "target": "94"}, {"source": "19", "target": "94"}, {"source": "19", "target": "20"}, {"source": "44", "target": "69"}, {"source": "44", "target": "45"}, {"source": "69", "target": "70"}, {"source": "94", "target": "95"}, {"source": "20", "target": "95"}, {"source": "20", "target": "21"}, {"source": "45", "target": "70"}, {"source": "45", "target": "46"}, {"source": "70", "target": "71"}, {"source": "95", "target": "96"}, {"source": "21", "target": "96"}, {"source": "21", "target": "22"}, {"source": "46", "target": "71"}, {"source": "46", "target": "47"}, {"source": "71", "target": "72"}, {"source": "96", "target": "97"}, {"source": "22", "target": "97"}, {"source": "22", "target": "23"}, {"source": "47", "target": "72"}, {"source": "47", "target": "48"}, {"source": "72", "target": "73"}, {"source": "97", "target": "98"}, {"source": "23", "target": "98"}, {"source": "23", "target": "24"}, {"source": "48", "target": "73"}, {"source": "48", "target": "49"}, {"source": "73", "target": "74"}, {"source": "98", "target": "99"}, {"source": "24", "target": "99"}, {"source": "49", "target": "74"}]} -------------------------------------------------------------------------------- /js/fibonacci_heap.js: -------------------------------------------------------------------------------- 1 | // The MIT License (MIT) 2 | 3 | // Copyright (c) 2014 Daniel Imms, http://www.growingwiththeweb.com 4 | 5 | // Permission is hereby granted, free of charge, to any person obtaining a copy 6 | // of this software and associated documentation files (the "Software"), to deal 7 | // in the Software without restriction, including without limitation the rights 8 | // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | // copies of the Software, and to permit persons to whom the Software is 10 | // furnished to do so, subject to the following conditions: 11 | 12 | // The above copyright notice and this permission notice shall be included in 13 | // all copies or substantial portions of the Software. 14 | 15 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 21 | // THE SOFTWARE. 22 | 23 | 'use strict'; 24 | 25 | /** 26 | * Creates a Fibonacci heap. 27 | * 28 | * @constructor 29 | * @param {function} customCompare An optional custom node comparison 30 | * function. 31 | */ 32 | var FibonacciHeap = function (customCompare) { 33 | this.minNode = undefined; 34 | this.nodeCount = 0; 35 | 36 | if (customCompare) { 37 | this.compare = customCompare; 38 | } 39 | }; 40 | 41 | /** 42 | * Clears the heap's data, making it an empty heap. 43 | */ 44 | FibonacciHeap.prototype.clear = function () { 45 | this.minNode = undefined; 46 | this.nodeCount = 0; 47 | }; 48 | 49 | /** 50 | * Decreases a key of a node. 51 | * 52 | * @param {Node} node The node to decrease the key of. 53 | * @param {Object} newKey The new key to assign to the node. 54 | */ 55 | FibonacciHeap.prototype.decreaseKey = function (node, newKey) { 56 | if (typeof node === 'undefined') { 57 | throw new Error('Cannot decrease key of non-existent node'); 58 | } 59 | if (this.compare({key: newKey}, {key: node.key}) > 0) { 60 | throw new Error('New key is larger than old key'); 61 | } 62 | 63 | node.key = newKey; 64 | var parent = node.parent; 65 | if (parent && this.compare(node, parent) < 0) { 66 | cut(node, parent, this.minNode, this.compare); 67 | cascadingCut(parent, this.minNode, this.compare); 68 | } 69 | if (this.compare(node, this.minNode) < 0) { 70 | this.minNode = node; 71 | } 72 | }; 73 | 74 | /** 75 | * Deletes a node. 76 | * 77 | * @param {Node} node The node to delete. 78 | */ 79 | FibonacciHeap.prototype.delete = function (node) { 80 | // This is a special implementation of decreaseKey that sets the argument to 81 | // the minimum value. This is necessary to make generic keys work, since there 82 | // is no MIN_VALUE constant for generic types. 83 | var parent = node.parent; 84 | if (parent) { 85 | cut(node, parent, this.minNode, this.compare); 86 | cascadingCut(parent, this.minNode, this.compare); 87 | } 88 | this.minNode = node; 89 | 90 | this.extractMinimum(); 91 | }; 92 | 93 | /** 94 | * Extracts and returns the minimum node from the heap. 95 | * 96 | * @return {Node} node The heap's minimum node or undefined if the heap is 97 | * empty. 98 | */ 99 | FibonacciHeap.prototype.extractMinimum = function () { 100 | var extractedMin = this.minNode; 101 | if (extractedMin) { 102 | // Set parent to undefined for the minimum's children 103 | if (extractedMin.child) { 104 | var child = extractedMin.child; 105 | do { 106 | child.parent = undefined; 107 | child = child.next; 108 | } while (child !== extractedMin.child); 109 | } 110 | 111 | var nextInRootList; 112 | if (extractedMin.next !== extractedMin) { 113 | nextInRootList = extractedMin.next; 114 | } 115 | // Remove min from root list 116 | removeNodeFromList(extractedMin); 117 | this.nodeCount--; 118 | 119 | // Merge the children of the minimum node with the root list 120 | this.minNode = mergeLists(nextInRootList, extractedMin.child, this.compare); 121 | if (this.minNode) { 122 | this.minNode = consolidate(this.minNode, this.compare); 123 | } 124 | } 125 | return extractedMin; 126 | }; 127 | 128 | /** 129 | * Returns the minimum node from the heap. 130 | * 131 | * @return {Node} node The heap's minimum node or undefined if the heap is 132 | * empty. 133 | */ 134 | FibonacciHeap.prototype.findMinimum = function () { 135 | return this.minNode; 136 | }; 137 | 138 | /** 139 | * Inserts a new key-value pair into the heap. 140 | * 141 | * @param {Object} key The key to insert. 142 | * @param {Object} value The value to insert. 143 | * @return {Node} node The inserted node. 144 | */ 145 | FibonacciHeap.prototype.insert = function (key, value) { 146 | var node = new Node(key, value); 147 | this.minNode = mergeLists(this.minNode, node, this.compare); 148 | this.nodeCount++; 149 | return node; 150 | }; 151 | 152 | /** 153 | * @return {boolean} Whether the heap is empty. 154 | */ 155 | FibonacciHeap.prototype.isEmpty = function () { 156 | return this.minNode === undefined; 157 | }; 158 | 159 | /** 160 | * @return {number} The size of the heap. 161 | */ 162 | FibonacciHeap.prototype.size = function () { 163 | if (this.isEmpty()) { 164 | return 0; 165 | } 166 | return getNodeListSize(this.minNode); 167 | }; 168 | 169 | /** 170 | * Joins another heap to this heap. 171 | * 172 | * @param {FibonacciHeap} other The other heap. 173 | */ 174 | FibonacciHeap.prototype.union = function (other) { 175 | this.minNode = mergeLists(this.minNode, other.minNode, this.compare); 176 | this.nodeCount += other.nodeCount; 177 | }; 178 | 179 | /** 180 | * Compares two nodes with each other. 181 | * 182 | * @private 183 | * @param {Object} a The first key to compare. 184 | * @param {Object} b The second key to compare. 185 | * @return {number} -1, 0 or 1 if a < b, a == b or a > b respectively. 186 | */ 187 | FibonacciHeap.prototype.compare = function (a, b) { 188 | if (a.key > b.key) { 189 | return 1; 190 | } 191 | if (a.key < b.key) { 192 | return -1; 193 | } 194 | return 0; 195 | }; 196 | 197 | /** 198 | * Creates an Iterator used to simplify the consolidate() method. It works by 199 | * making a shallow copy of the nodes in the root list and iterating over the 200 | * shallow copy instead of the source as the source will be modified. 201 | * 202 | * @private 203 | * @param {Node} start A node from the root list. 204 | */ 205 | var NodeListIterator = function (start) { 206 | this.index = -1; 207 | this.items = []; 208 | var current = start; 209 | do { 210 | this.items.push(current); 211 | current = current.next; 212 | } while (start !== current); 213 | }; 214 | 215 | /** 216 | * @return {boolean} Whether there is a next node in the iterator. 217 | */ 218 | NodeListIterator.prototype.hasNext = function () { 219 | return this.index < this.items.length - 1; 220 | }; 221 | 222 | /** 223 | * @return {Node} The next node. 224 | */ 225 | NodeListIterator.prototype.next = function () { 226 | return this.items[++this.index]; 227 | }; 228 | 229 | /** 230 | * Cut the link between a node and its parent, moving the node to the root list. 231 | * 232 | * @private 233 | * @param {Node} node The node being cut. 234 | * @param {Node} parent The parent of the node being cut. 235 | * @param {Node} minNode The minimum node in the root list. 236 | * @param {function} compare The node comparison function to use. 237 | * @return {Node} The heap's new minimum node. 238 | */ 239 | function cut(node, parent, minNode, compare) { 240 | node.parent = undefined; 241 | parent.degree--; 242 | if (node.next === node) { 243 | parent.child = undefined; 244 | } else { 245 | parent.child = node.next; 246 | } 247 | removeNodeFromList(node); 248 | minNode = mergeLists(minNode, node, compare); 249 | node.isMarked = false; 250 | return minNode; 251 | } 252 | 253 | /** 254 | * Perform a cascading cut on a node; mark the node if it is not marked, 255 | * otherwise cut the node and perform a cascading cut on its parent. 256 | * 257 | * @private 258 | * @param {Node} node The node being considered to be cut. 259 | * @param {Node} minNode The minimum node in the root list. 260 | * @param {function} compare The node comparison function to use. 261 | * @return {Node} The heap's new minimum node. 262 | */ 263 | function cascadingCut(node, minNode, compare) { 264 | var parent = node.parent; 265 | if (parent) { 266 | if (node.isMarked) { 267 | minNode = cut(node, parent, minNode, compare); 268 | minNode = cascadingCut(parent, minNode, compare); 269 | } else { 270 | node.isMarked = true; 271 | } 272 | } 273 | return minNode; 274 | } 275 | 276 | /** 277 | * Merge all trees of the same order together until there are no two trees of 278 | * the same order. 279 | * 280 | * @private 281 | * @param {Node} minNode The current minimum node. 282 | * @param {function} compare The node comparison function to use. 283 | * @return {Node} The new minimum node. 284 | */ 285 | function consolidate(minNode, compare) { 286 | var aux = []; 287 | var it = new NodeListIterator(minNode); 288 | while (it.hasNext()) { 289 | var current = it.next(); 290 | 291 | // If there exists another node with the same degree, merge them 292 | while (aux[current.degree]) { 293 | if (compare(current, aux[current.degree]) > 0) { 294 | var temp = current; 295 | current = aux[current.degree]; 296 | aux[current.degree] = temp; 297 | } 298 | linkHeaps(aux[current.degree], current, compare); 299 | aux[current.degree] = undefined; 300 | current.degree++; 301 | } 302 | 303 | aux[current.degree] = current; 304 | } 305 | 306 | minNode = undefined; 307 | for (var i = 0; i < aux.length; i++) { 308 | if (aux[i]) { 309 | // Remove siblings before merging 310 | aux[i].next = aux[i]; 311 | aux[i].prev = aux[i]; 312 | minNode = mergeLists(minNode, aux[i], compare); 313 | } 314 | } 315 | return minNode; 316 | } 317 | 318 | /** 319 | * Removes a node from a node list. 320 | * 321 | * @private 322 | * @param {Node} node The node to remove. 323 | */ 324 | function removeNodeFromList(node) { 325 | var prev = node.prev; 326 | var next = node.next; 327 | prev.next = next; 328 | next.prev = prev; 329 | node.next = node; 330 | node.prev = node; 331 | } 332 | 333 | /** 334 | * Links two heaps of the same order together. 335 | * 336 | * @private 337 | * @param {Node} max The heap with the larger root. 338 | * @param {Node} min The heap with the smaller root. 339 | * @param {function} compare The node comparison function to use. 340 | */ 341 | function linkHeaps(max, min, compare) { 342 | removeNodeFromList(max); 343 | min.child = mergeLists(max, min.child, compare); 344 | max.parent = min; 345 | max.isMarked = false; 346 | } 347 | 348 | /** 349 | * Merge two lists of nodes together. 350 | * 351 | * @private 352 | * @param {Node} a The first list to merge. 353 | * @param {Node} b The second list to merge. 354 | * @param {function} compare The node comparison function to use. 355 | * @return {Node} The new minimum node from the two lists. 356 | */ 357 | function mergeLists(a, b, compare) { 358 | if (!a && !b) { 359 | return undefined; 360 | } 361 | if (!a) { 362 | return b; 363 | } 364 | if (!b) { 365 | return a; 366 | } 367 | 368 | var temp = a.next; 369 | a.next = b.next; 370 | a.next.prev = a; 371 | b.next = temp; 372 | b.next.prev = b; 373 | 374 | return compare(a, b) < 0 ? a : b; 375 | } 376 | 377 | /** 378 | * Gets the size of a node list. 379 | * 380 | * @private 381 | * @param {Node} node A node within the node list. 382 | * @return {number} The size of the node list. 383 | */ 384 | function getNodeListSize(node) { 385 | var count = 0; 386 | var current = node; 387 | 388 | do { 389 | count++; 390 | if (current.child) { 391 | count += getNodeListSize(current.child); 392 | } 393 | current = current.next; 394 | } while (current !== node); 395 | 396 | return count; 397 | } 398 | 399 | /** 400 | * Creates a FibonacciHeap node. 401 | * 402 | * @constructor 403 | * @private 404 | */ 405 | function Node(key, value) { 406 | this.key = key; 407 | this.value = value; 408 | this.prev = this; 409 | this.next = this; 410 | this.degree = 0; 411 | 412 | this.parent = undefined; 413 | this.child = undefined; 414 | this.isMarked = undefined; 415 | } 416 | -------------------------------------------------------------------------------- /js/ebp.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Author: Markus Wallinger 3 | * email: mwallinger@tuwien.ac.at 4 | * 5 | * Implementation of the Edge-Path-Bundling algorithm from our publication: Edge-Path Bundling: A Less Ambiguous Edge Bundling Approach (https://arxiv.org/abs/2108.05467) 6 | * 7 | * The following class encapsulates all necessary code to bundle edges and draw on a web canvas. 8 | */ 9 | class EdgePathBundling { 10 | numApproximationPoints = 50; 11 | weightFactor = 2; 12 | maxDistortion = 2; 13 | bundleStrength = 1; 14 | 15 | /** 16 | * The constructor of the class performs the necessary pre-processing to create a bundling. 17 | * 18 | * @param {[Objects]} nodes Nodes of the graph as a list of objects 19 | * @param {[Objects]} edges Edges of the graph as a list of objects 20 | * @param {int} width Width of the canvas (necessary for scaling) 21 | * @param {int} height Height of the canvas (necessary for scaling) 22 | */ 23 | constructor(nodes, edges, width, height) { 24 | var t0 = performance.now() 25 | this.nodes = nodes; 26 | this.edges = edges; 27 | 28 | var n = nodes.length; 29 | 30 | this.n = n; 31 | this.nodeDict = {} 32 | this.adjList = new Map(); 33 | 34 | var minX = 100000, maxX = -100000, minY = 100000, maxY = -100000; 35 | this.nodes.forEach(node => { 36 | node.y = -node.y; //invert y-coordinate 37 | node.x = +node.x; 38 | 39 | minX = minX < node.x ? minX : node.x; 40 | minY = minY < node.y ? minY : node.y; 41 | maxX = maxX > node.x ? maxX : node.x; 42 | maxY = maxY > node.y ? maxY : node.y; 43 | 44 | node.id = parseInt(node.id) 45 | 46 | this.adjList.set(node.id, []); 47 | this.nodeDict[node.id] = node; 48 | }); 49 | 50 | this.minX = minX; 51 | this.minY = minY; 52 | this.maxX = maxX; 53 | this.maxY = maxY; 54 | 55 | //scale the graph to fit the canvas. 56 | this.scale(width, height) 57 | 58 | var t1 = performance.now() 59 | console.log("Preprocessing Nodes took " + (t1 - t0) + " milliseconds.") 60 | t0 = performance.now() 61 | 62 | //create helper matrices to efficiently access edge and weight and adjacency information 63 | this.adj = math.matrix(math.ones([n,n])) 64 | this.adj = math.multiply(this.adj, -1) 65 | this.adj = this.adj._data 66 | 67 | this.weight = math.matrix(math.ones([n,n])) 68 | this.weight = math.multiply(this.weight, -1) 69 | this.weight = this.weight._data 70 | 71 | 72 | var t1 = performance.now() 73 | console.log("Preprocessing Misc took " + (t1 - t0) + " milliseconds.") 74 | t0 = performance.now() 75 | 76 | this.edges.forEach((d, index) => { 77 | d.target = parseInt(d.target); 78 | d.source = parseInt(d.source); 79 | 80 | d.id = index; 81 | 82 | var src = this.nodeDict[d.source]; 83 | var tgt = this.nodeDict[d.target]; 84 | 85 | this.adjList.get(d.source).push(d.target); 86 | this.adjList.get(d.target).push(d.source); 87 | 88 | d['controlpointsStraight'] = this.approximateStraight([src, tgt], this.numApproximationPoints); 89 | d['controlpoints'] = this.approximateStraight([src, tgt], this.numApproximationPoints); 90 | 91 | this.adj[d.target][d.source] = index 92 | this.adj[d.source][d.target] = index 93 | 94 | var l = dist(src, tgt) 95 | 96 | d['color'] = assignColor(src, tgt); 97 | 98 | d['dist'] = l; 99 | d['weight'] = Math.pow(l, this.weightFactor); 100 | 101 | this.weight[d.target][d.source] = d['weight'] 102 | this.weight[d.source][d.target] = d['weight'] 103 | }) 104 | 105 | this.locked = new Array(this.edges.length).fill(false); 106 | this.bundled = new Array(this.edges.length).fill(false); 107 | 108 | var t1 = performance.now() 109 | console.log("Preprocessing Edges took " + (t1 - t0) + " milliseconds.") 110 | 111 | var t0 = performance.now(); 112 | 113 | this.edges.sort(function(a, b) { 114 | return b['dist'] - a['dist']; 115 | }); 116 | 117 | var t1 = performance.now() 118 | console.log("Sorting Edges took " + (t1 - t0) + " milliseconds.") 119 | } 120 | 121 | 122 | bundle() { 123 | var t0 = performance.now() 124 | 125 | /// TODO change back 126 | this.locked = new Array(this.edges.length).fill(false); 127 | this.bundled = new Array(this.edges.length).fill(false); 128 | 129 | this.neighbours = new Array(this.nodes.length) 130 | this.nodes.forEach(element => { 131 | this.neighbours[element.id] = new Set(this.adjList.get(element.id)); 132 | }); 133 | 134 | this.edges.forEach(element => { 135 | //console.log(element); 136 | if (this.locked[element.id]){ 137 | element.controlpoints = element.controlpointsStraight; 138 | return; 139 | } 140 | 141 | var src = element.source; 142 | var tgt = element.target; 143 | 144 | this.neighbours[tgt].delete(src); 145 | this.neighbours[src].delete(tgt); 146 | 147 | var path = this.dijkstra(src, tgt) 148 | //console.log(element, path) 149 | if (path.length > 2) { 150 | var pLen = 0; 151 | var last = this.nodeDict[path[0]]; 152 | 153 | for(var i = 1; i < path.length; i++) { 154 | var next = this.nodeDict[path[i]]; 155 | 156 | pLen += dist(last, next) 157 | last = next 158 | } 159 | 160 | //console.log(element.dist, pLen); 161 | 162 | if (pLen >= this.maxDistortion * element.dist) { 163 | element['controlpoints'] = [this.nodeDict[src], this.nodeDict[tgt]] 164 | 165 | this.neighbours[tgt].add(src); 166 | this.neighbours[src].add(tgt); 167 | } 168 | else 169 | { 170 | var last = this.nodeDict[path.pop()]; 171 | var cp = [last] 172 | while(path.length > 0){ 173 | var next = this.nodeDict[path.pop()]; 174 | 175 | var id = this.adj[last.id][next.id] 176 | this.locked[id] = true; 177 | 178 | cp.push(next) 179 | last = next 180 | } 181 | 182 | this.bundled[element.id] = true; 183 | element.cp = cp; 184 | element['controlpoints'] = this.approximateBezier(cp, this.numApproximationPoints); 185 | } 186 | } else { 187 | element['controlpoints'] = [this.nodeDict[src], this.nodeDict[tgt]] 188 | 189 | this.neighbours[tgt].add(src); 190 | this.neighbours[src].add(tgt); 191 | } 192 | }); 193 | 194 | 195 | var t1 = performance.now() 196 | console.log("Bundling took " + (t1 - t0) + " milliseconds.") 197 | } 198 | 199 | /** 200 | * Dijkstras single-source shortest path with priority heap as datastructure to store the distances. 201 | * 202 | * @param {Object} src 203 | * @param {Object} tgt 204 | * @returns [objects] Returns a list of IDs representing the nodes in the shortest path. 205 | */ 206 | dijkstra(src, tgt) { 207 | var cost, pred; 208 | (cost = []).length = this.n; 209 | cost.fill(+Infinity); 210 | cost[src] = 0; 211 | 212 | (pred = []).length = this.n; 213 | pred.fill(-1); 214 | 215 | var idNodeDict = {} 216 | var queue = new FibonacciHeap(); 217 | var node = queue.insert(0, src); 218 | idNodeDict[src] = node; 219 | 220 | while (!queue.isEmpty()) { 221 | var best = queue.extractMinimum(); 222 | 223 | best = best.value; 224 | //console.log(best) 225 | if(best == tgt) 226 | break; 227 | 228 | this.neighbours[best].forEach(next => { 229 | var c = cost[best] + this.weight[best][next]; 230 | 231 | if (cost[next] > c) { 232 | if(pred[next] < 0) { 233 | var node = queue.insert(c, next); 234 | idNodeDict[next] = node; 235 | } else { 236 | var node = idNodeDict[next]; 237 | queue.decreaseKey(node, c); 238 | } 239 | 240 | pred[next] = best; 241 | cost[next] = c; 242 | } 243 | }); 244 | } 245 | 246 | //return a list of nodes representing the shortest path 247 | var cp = [tgt] 248 | var p = tgt 249 | while(true) { 250 | p = pred[p]; 251 | cp.push(p); 252 | 253 | if (p === src) 254 | return cp 255 | if (p <= 0) 256 | return [] 257 | } 258 | } 259 | 260 | /** 261 | * Scale the vertices of the graph to be in the range ([0,maxX],[0,maxY]) 262 | * 263 | * @param {Int} maxX 264 | * @param {Int} maxY 265 | */ 266 | scale(maxX, maxY) { 267 | var width = this.maxX - this.minX; 268 | var height = this.maxY - this.minY; 269 | 270 | var marginX = maxX * 0.05; 271 | var marginY = maxY * 0.05; 272 | 273 | maxX -= 2 * marginX; 274 | maxY -= 2 * marginY; 275 | 276 | this.nodes.forEach(node => { 277 | node.x = marginX + ((node.x - this.minX) / width) * maxX 278 | node.y = marginY + ((node.y - this.minY) / height) * maxY; 279 | }); 280 | 281 | } 282 | 283 | /** 284 | * Calculate more control points for the Bezier curve by subdividing each edge of the path into two sub edges. 285 | */ 286 | subdivision() { 287 | this.edges.forEach(edge => { 288 | if(this.bundled[edge.id]) { 289 | edge.controlpoints = this.subdivide(edge.cp, this.bundleStrength); 290 | edge.controlpoints = this.approximateBezier(edge.controlpoints, this.numApproximationPoints) 291 | } 292 | }); 293 | } 294 | 295 | 296 | /** 297 | * Given a list of points this function returns a list of points where a new point is inserted between every consecutive pair of points. The parameter s states how often an edge is subdivided. 298 | * 299 | * @param {[object]} points 300 | * @param {int} s 301 | * @returns [objects] 302 | */ 303 | subdivide(points, s) { 304 | for(var i = 1; i < s; i++) { 305 | var newCP = [] 306 | newCP.push(points[0]); 307 | 308 | for(var j = 0; j < points.length - 1; j++) { 309 | var p1 = points[j] 310 | var p2 = points[j + 1] 311 | 312 | var p3 = {}; 313 | p3.x = (p1.x + p2.x) / 2; 314 | p3.y = (p1.y + p2.y) / 2; 315 | 316 | newCP.push(p3); 317 | newCP.push(p2); 318 | } 319 | 320 | points = newCP; 321 | } 322 | 323 | return points; 324 | } 325 | 326 | /** 327 | * Animate the bundling by adding 328 | * 329 | * @param {Renderer} renderer 330 | * @param {int} steps 331 | * @param {float} frameT 332 | */ 333 | animate(renderer, steps, frameT) { 334 | renderer.clear() 335 | 336 | this.edges.forEach(edge => { 337 | if (!this.bundled[edge.id]) 338 | return; 339 | 340 | var delta = [] 341 | var anim = [] 342 | 343 | for(var i = 0; i < edge.controlpoints.length; i++) { 344 | var p = {} 345 | 346 | p.x = (edge.controlpointsStraight[i].x - edge.controlpoints[i].x) / steps; 347 | p.y = (edge.controlpointsStraight[i].y - edge.controlpoints[i].y) / steps; 348 | 349 | delta.push(p) 350 | 351 | var pp = {} 352 | pp.x = edge.controlpointsStraight[i].x 353 | pp.y = edge.controlpointsStraight[i].y 354 | anim.push(pp) 355 | } 356 | 357 | edge.delta = delta; 358 | edge.anim = anim; 359 | }); 360 | 361 | var worker = new Worker('js/animationWorker.js') 362 | 363 | this.doFrame(renderer, this, steps, frameT, worker); 364 | } 365 | 366 | doFrame(renderer, tthis, remaining, frameT, worker) { 367 | var t0 = performance.now() 368 | worker.postMessage([tthis.edges, tthis.bundled, t0, remaining]); 369 | 370 | 371 | 372 | worker.addEventListener('message', function(e) { 373 | var edges = e.data[0]; 374 | var t0 = e.data[1]; 375 | var steps = e.data[2]; 376 | 377 | renderer.clear(); 378 | 379 | edges.forEach(edge => { 380 | if (tthis.bundled[edge.id]) { 381 | renderer.drawLine(edge.anim, edge.color); 382 | //renderer.drawLine(edge.anim, '#fe8a71'); 383 | } 384 | else { 385 | renderer.drawLine(edge.controlpoints, edge.color); 386 | } 387 | }); 388 | 389 | tthis.nodes.forEach(node => { 390 | renderer.drawPoint(node); 391 | }); 392 | 393 | var t1 = performance.now(); 394 | var tPassed = frameT - (t1 - t0); 395 | 396 | renderer.draw(); 397 | //console.log(tPassed, steps) 398 | 399 | if (steps > 0) { 400 | if (tPassed > 0) 401 | setTimeout(function() { 402 | worker.postMessage([null, null, t1, steps-1]); 403 | }, tPassed); 404 | else 405 | //tthis.doFrame(renderer, tthis, steps - 1, frameT, worker); 406 | worker.postMessage([null, null, t1, steps-1]); 407 | } 408 | }); 409 | 410 | // tthis.edges.forEach(edge => { 411 | // if (tthis.bundled[edge.id]) { 412 | // for(var i = 0; i < edge.controlpoints.length; i++) { 413 | // edge.anim[i].x -= edge.delta[i].x; 414 | // edge.anim[i].y -= edge.delta[i].y; 415 | // } 416 | // //renderer.drawLine(edge.anim, edge.color); 417 | // renderer.drawLine(edge.anim, '#fe8a71'); 418 | // } 419 | // else { 420 | // //renderer.drawLine(edge.controlpoints, edge.color); 421 | // if(tthis.locked[edge.id]) 422 | // renderer.drawLine(edge.controlpoints, '#3da4ab'); 423 | // else 424 | // renderer.drawLine(edge.controlpoints, '#000000'); 425 | // } 426 | // }); 427 | 428 | } 429 | 430 | 431 | 432 | drawGraphBundled(renderer) { 433 | var t0 = performance.now() 434 | 435 | renderer.clear(); 436 | 437 | this.edges.forEach(edge => { 438 | renderer.drawLine(edge.controlpoints, edge.color); 439 | }); 440 | 441 | this.nodes.forEach(node => { 442 | renderer.drawPoint(node); 443 | }); 444 | 445 | renderer.draw(); 446 | var t1 = performance.now() 447 | console.log("Rendering took " + (t1 - t0) + " milliseconds.") 448 | } 449 | 450 | drawGraphStraight(renderer) { 451 | var t0 = performance.now() 452 | 453 | renderer.clear(); 454 | 455 | this.edges.forEach(edge => { 456 | //renderer.drawLine(edge.controlpointsStraight, '#000000') 457 | renderer.drawLine(edge.controlpointsStraight, edge.color) 458 | }); 459 | 460 | this.nodes.forEach(node => { 461 | renderer.drawPoint(node); 462 | }); 463 | 464 | var t1 = performance.now() 465 | 466 | renderer.draw(); 467 | console.log("Rendering took " + (t1 - t0) + " milliseconds.") 468 | 469 | } 470 | 471 | 472 | approximateStraight(points, n) { 473 | var p1 = points[0]; 474 | var p2 = points[1]; 475 | 476 | var x = (p2.x - p1.x) / (n); 477 | var y = (p2.y - p1.y) / (n); 478 | 479 | points = []; 480 | 481 | for(var i = 0; i <= n; i++) { 482 | var p = {} 483 | p.x = (p1.x + i * x); 484 | p.y = (p1.y + i * y); 485 | points.push(p); 486 | } 487 | 488 | return points; 489 | } 490 | 491 | approximateBezier(points, n) { 492 | 493 | var bezier = [] 494 | var i = 0; 495 | points.forEach(point => { 496 | point.binom = binomial(points.length - 1, i); 497 | 498 | i += 1; 499 | }); 500 | 501 | for (var t = 0; t <= 1; t += 1/(n)) { 502 | var p = {x:0, y:0} 503 | 504 | var i = 0; 505 | 506 | 507 | points.forEach(point => { 508 | var tpi = Math.pow((1 - t), points.length - 1 - i); 509 | var coeff = tpi * Math.pow(t, i); 510 | 511 | p.x += point.binom * coeff * point.x; 512 | p.y += point.binom * coeff * point.y; 513 | 514 | i += 1; 515 | }); 516 | 517 | bezier.push(p); 518 | } 519 | 520 | bezier.push({x: points[points.length - 1].x, y: points[points.length - 1].y}) 521 | return bezier; 522 | } 523 | 524 | 525 | 526 | /** 527 | * 528 | * Setter for the bundling parameters 529 | * 530 | * 531 | */ 532 | 533 | 534 | /* 535 | Set the weight factor for each edge. 536 | */ 537 | setWeight(factor) { 538 | this.weightFactor = factor; 539 | 540 | this.edges.forEach(edge => { 541 | edge.weight = Math.pow(edge.dist, factor); 542 | 543 | this.weight[edge.target][edge.source] = edge['weight'] 544 | this.weight[edge.source][edge.target] = edge['weight'] 545 | }); 546 | } 547 | 548 | /* 549 | Set the weight factor for each edge. 550 | */ 551 | setDistortion(value) { 552 | this.maxDistortion = value; 553 | } 554 | 555 | /* 556 | Set the bundling strength for each edge 557 | */ 558 | 559 | setBundlingStrength(strength) { 560 | this.bundleStrength = strength; 561 | } 562 | } 563 | 564 | /** 565 | * Class to interface the HTML canvas element 566 | * 567 | */ 568 | class Render { 569 | constructor(selector) { 570 | this.canvas = document.querySelector(selector); 571 | this.drawcontext = this.canvas.getContext('2d'); 572 | 573 | this.offscreen = document.createElement('canvas'); 574 | this.offscreen.width = this.canvas.width; 575 | this.offscreen.height = this.canvas.height; 576 | this.context = this.offscreen.getContext("2d"); 577 | 578 | } 579 | 580 | clear() { 581 | this.context.clearRect(0, 0, this.canvas.width, this.canvas.height); 582 | } 583 | 584 | draw() { 585 | this.drawcontext.putImageData(this.context.getImageData(0,0, this.canvas.width, this.canvas.height), 0, 0); 586 | } 587 | 588 | drawPoint(node) { 589 | this.context.beginPath(); 590 | this.context.fillStyle = '#283347'; 591 | this.context.arc(node.x, node.y, 1, 0, Math.PI * 2, true); 592 | this.context.strokeStyle = '#283347'; 593 | this.context.stroke(); 594 | this.context.fill(); 595 | } 596 | 597 | 598 | drawLine(points, color) { 599 | this.context.beginPath(); 600 | this.context.moveTo(points[0].x, points[0].y) 601 | 602 | for(var i = 0; i < points.length; i++) { 603 | this.context.lineTo(points[i].x, points[i].y); 604 | } 605 | this.context.strokeStyle = color + '55'; 606 | this.context.lineWidth = 2; 607 | this.context.stroke(); 608 | } 609 | 610 | drawBezier(points) { 611 | var p000 = points[0] 612 | var p112 = {}; 613 | var p122 = {}; 614 | p112.x = 2/3 * points[0].x + 1/3 * points[1].x 615 | p112.y = 2/3 * points[0].y + 1/3 * points[1].y 616 | p122.x = 1/3 * points[0].x + 1/3 * points[1].x 617 | p122.y = 1/3 * points[0].y + 1/3 * points[1].y 618 | 619 | this.context.beginPath(); 620 | this.context.moveTo(p000.x, p000.y); 621 | this.context.bezierCurveTo(p112.x, p112.y, p122.x, p122.y, points[1].x, points[1].y); 622 | this.context.stroke(); 623 | 624 | var p223 = {}; 625 | var p233 = {}; 626 | var p222 = {} 627 | 628 | for(var i = 1; i < points.length - 1; i++) { 629 | var p123 = points[i] 630 | var p234 = points[i+1] 631 | p223.x = 2/3*p123.x + 1/3*p234.x 632 | p223.y = 2/3*p123.y + 1/3*p234.y 633 | p233.x = 1/3*p123.x + 2/3*p234.x 634 | p233.y = 1/3*p123.y + 2/3*p234.y 635 | p222.x = .5*p122.x + .5*p223.x 636 | p222.y = .5*p122.y + .5*p223.y 637 | 638 | this.context.beginPath(); 639 | this.context.moveTo(p123.x, p123.y); 640 | this.context.bezierCurveTo(p223.x, p223.y, p233.x, p233.y, p234.x, p234.y); 641 | this.context.stroke(); 642 | 643 | p122 = p233 644 | } 645 | } 646 | } 647 | 648 | /** 649 | * Helper to return the distance between two vertices. 650 | * 651 | * @param {Vertex} src 652 | * @param {Vertex} tgt 653 | * @returns distance 654 | */ 655 | function dist(src, tgt) { 656 | return math.sqrt(math.pow(src.x-tgt.x, 2) + math.pow(src.y-tgt.y, 2)) 657 | } 658 | 659 | /** 660 | * Helper function to assign a color depending on the angle of the edge 661 | * 662 | * @param {Point} p1 663 | * @param {Point} p2 664 | * @returns hex color 665 | */ 666 | function assignColor(p1, p2) { 667 | var dX = p2.x - p1.x; 668 | var dY = p2.y - p1.y; 669 | 670 | var angle = Math.atan2(-dY, dX); 671 | var degrees = 180 * angle / Math.PI; 672 | 673 | if(degrees < 0) 674 | degrees = (360 + Math.round(degrees)) - 180; 675 | 676 | if (degrees < 11.5) 677 | return "#733957" 678 | else if (degrees < 33) 679 | return "#8e4830" 680 | else if (degrees < 55.5) 681 | return "#b58837" 682 | else if (degrees < 78) 683 | return "#d6d389" 684 | else if (degrees < 100.5) 685 | return "#abdbca" 686 | else if (degrees < 123) 687 | return "#5ea6c8" 688 | else if (degrees < 155.5) 689 | return "#55609a" 690 | else if (degrees < 178) 691 | return "#723959" 692 | else 693 | return "#733957" 694 | } 695 | 696 | 697 | function binomial(n, k) { 698 | var coeff = 1; 699 | for (var x = n-k+1; x <= n; x++) coeff *= x; 700 | for (x = 1; x <= k; x++) coeff /= x; 701 | return coeff; 702 | } 703 | 704 | -------------------------------------------------------------------------------- /data/noise.json: -------------------------------------------------------------------------------- 1 | {"directed": false, "multigraph": false, "graph": {"node_default": {}, "edge_default": {}}, "nodes": [{"x": 611.235659907994, "y": 557.6246293685188, "id": "0"}, {"x": 91.02601522859244, "y": 511.68207249691466, "id": "1"}, {"x": 24.588170989107148, "y": 264.1077940120494, "id": "2"}, {"x": 497.5569089120646, "y": 717.2790891890513, "id": "3"}, {"x": 274.472474220382, "y": 788.1150295988289, "id": "4"}, {"x": 415.9687519762224, "y": 430.1672771030356, "id": "5"}, {"x": 141.37704264450778, "y": 431.23547596013856, "id": "6"}, {"x": 514.2123919966915, "y": 427.5791202455864, "id": "7"}, {"x": 346.70688034685116, "y": 502.13520291838563, "id": "8"}, {"x": 223.03407007098176, "y": 649.7493084792221, "id": "9"}, {"x": 671.3288002510116, "y": 910.4850588281951, "id": "10"}, {"x": 123.69940302507598, "y": 798.5883363733907, "id": "11"}, {"x": 814.5379851945856, "y": 502.998346681896, "id": "12"}, {"x": 872.9699419272675, "y": 767.6958846317267, "id": "13"}, {"x": 540.0077216264475, "y": 642.9155123705243, "id": "14"}, {"x": 387.47554551792575, "y": 813.1998869478036, "id": "15"}, {"x": 660.6486793129123, "y": 813.0270342278876, "id": "16"}, {"x": 593.4623767252319, "y": 941.923118051799, "id": "17"}, {"x": 524.1477866191876, "y": 170.75478382174202, "id": "18"}, {"x": 978.1908094549389, "y": 516.1893600993695, "id": "19"}, {"x": 538.5448958412092, "y": 161.11286439775319, "id": "20"}, {"x": 97.24622900173196, "y": 855.7109843636116, "id": "21"}, {"x": 156.59420199549666, "y": 597.0538288993948, "id": "22"}, {"x": 964.2319721062571, "y": 126.01088266096849, "id": "23"}, {"x": 448.5759508167457, "y": 895.6698532895131, "id": "24"}, {"x": 599.9278621045472, "y": 8.393739883329921, "id": "25"}, {"x": 740.3640711008238, "y": 636.3068468178743, "id": "26"}, {"x": 890.9035503948949, "y": 24.03582248732439, "id": "27"}, {"x": 591.0929306774166, "y": 395.125244078764, "id": "28"}, {"x": 691.6626723915463, "y": 324.36353812348216, "id": "29"}, {"x": 385.62835429079877, "y": 518.134136157574, "id": "30"}, {"x": 429.9163738350379, "y": 113.54981203580338, "id": "31"}, {"x": 154.3402719984155, "y": 511.5074235327922, "id": "32"}, {"x": 315.06602490379754, "y": 754.4312805595505, "id": "33"}, {"x": 348.5080034804615, "y": 356.2744714712345, "id": "34"}, {"x": 674.5716890394482, "y": 764.7310313284399, "id": "35"}, {"x": 593.8953978941872, "y": 937.4384503351971, "id": "36"}, {"x": 290.41745606329397, "y": 585.3014861155465, "id": "37"}, {"x": 589.9058455295905, "y": 543.3382720165697, "id": "38"}, {"x": 277.1635522029059, "y": 607.6539917655762, "id": "39"}, {"x": 500.594210694339, "y": 243.40628752728188, "id": "40"}, {"x": 134.179027971984, "y": 19.72189999469487, "id": "41"}, {"x": 685.0350161224843, "y": 755.5306577890346, "id": "42"}, {"x": 966.3530318211994, "y": 668.7277019486746, "id": "43"}, {"x": 472.734497462625, "y": 264.283541139741, "id": "44"}, {"x": 893.0738271301769, "y": 648.2383689877179, "id": "45"}, {"x": 104.36750700561726, "y": 300.4383543686102, "id": "46"}, {"x": 88.36198163258646, "y": 150.30029703291936, "id": "47"}, {"x": 728.4711455159255, "y": 426.27012041009584, "id": "48"}, {"x": 340.47336808697713, "y": 391.14879325622155, "id": "49"}, {"x": 456.75639555209904, "y": 538.8647376566304, "id": "50"}, {"x": 354.86382028407314, "y": 671.3960649844447, "id": "51"}, {"x": 950.9242501915701, "y": 250.3289473360578, "id": "52"}, {"x": 804.606856300779, "y": 203.0850553651987, "id": "53"}, {"x": 983.3456814042898, "y": 603.5135007629176, "id": "54"}, {"x": 992.0997779284193, "y": 128.78882547302538, "id": "55"}, {"x": 595.3240535347082, "y": 895.8731067323016, "id": "56"}, {"x": 441.1084162241613, "y": 63.526184809314934, "id": "57"}, {"x": 233.0557678016839, "y": 227.4596021658529, "id": "58"}, {"x": 697.8240502617098, "y": 412.62675999717555, "id": "59"}, {"x": 12.192020858976637, "y": 474.4476609497963, "id": "60"}, {"x": 839.9608253294065, "y": 461.7834776901829, "id": "61"}, {"x": 838.1560665712528, "y": 22.936339074489, "id": "62"}, {"x": 744.0527306994378, "y": 911.0881462507997, "id": "63"}, {"x": 591.5357808034131, "y": 295.6081184101176, "id": "64"}, {"x": 455.96526238402447, "y": 530.5001740601973, "id": "65"}, {"x": 286.8175615185625, "y": 909.0915343676143, "id": "66"}, {"x": 614.5239510989932, "y": 589.9606375945941, "id": "67"}, {"x": 975.8367264472662, "y": 869.3461120654264, "id": "68"}, {"x": 124.1048419678099, "y": 857.5696814107591, "id": "69"}, {"x": 789.928793922234, "y": 424.1139557296094, "id": "70"}, {"x": 772.8500553428668, "y": 874.7719271422791, "id": "71"}, {"x": 476.24300878142714, "y": 669.1734112962586, "id": "72"}, {"x": 24.961699927125824, "y": 217.0260994135097, "id": "73"}, {"x": 594.4860078820658, "y": 176.56983861409037, "id": "74"}, {"x": 66.29252349461534, "y": 389.4897448439921, "id": "75"}, {"x": 632.6579361324675, "y": 31.01660273582585, "id": "76"}, {"x": 824.0035160173856, "y": 116.92145185040903, "id": "77"}, {"x": 677.865656764053, "y": 164.08438357316646, "id": "78"}, {"x": 450.08762912975044, "y": 791.3169030167288, "id": "79"}, {"x": 632.4002833753202, "y": 819.39306302804, "id": "80"}, {"x": 547.9458153228406, "y": 829.2739098044665, "id": "81"}, {"x": 681.9435956163312, "y": 967.675603173817, "id": "82"}, {"x": 562.0056331298084, "y": 857.3160826784729, "id": "83"}, {"x": 881.1407619660621, "y": 258.47714072747993, "id": "84"}, {"x": 596.8928177683626, "y": 70.030272708135, "id": "85"}, {"x": 628.9615154983644, "y": 557.7887053007119, "id": "86"}, {"x": 594.967619458016, "y": 842.5998581135681, "id": "87"}, {"x": 339.4266129265089, "y": 781.9412659476484, "id": "88"}, {"x": 96.19706121097715, "y": 460.9085441800873, "id": "89"}, {"x": 830.0702495818939, "y": 653.633571939861, "id": "90"}, {"x": 997.2563641524935, "y": 698.7338812945936, "id": "91"}, {"x": 266.7296581185612, "y": 570.4233831001011, "id": "92"}, {"x": 719.3613827848995, "y": 144.9817305271599, "id": "93"}, {"x": 381.71964468061867, "y": 138.4098556170118, "id": "94"}, {"x": 520.6936959603142, "y": 713.3039235292307, "id": "95"}, {"x": 490.0893361144691, "y": 451.1362447703173, "id": "96"}, {"x": 221.71707383321083, "y": 616.1392543092791, "id": "97"}, {"x": 278.11340291866014, "y": 257.4857963464866, "id": "98"}, {"x": 575.5240231944836, "y": 777.8410531007129, "id": "99"}, {"x": 251.31807245177663, "y": 767.1206870550451, "id": "100"}, {"x": 563.2424114720388, "y": 56.94165225078807, "id": "101"}, {"x": 745.3063029046521, "y": 828.6145591288371, "id": "102"}, {"x": 516.8082972219046, "y": 46.30516484981095, "id": "103"}, {"x": 800.6691101265933, "y": 654.7553467791689, "id": "104"}, {"x": 29.203694351653596, "y": 412.1528481876573, "id": "105"}, {"x": 791.2908311578942, "y": 306.62004569647473, "id": "106"}, {"x": 799.4240515018519, "y": 151.86253179585907, "id": "107"}, {"x": 695.1545564607286, "y": 564.5594476688676, "id": "108"}, {"x": 382.9662363064218, "y": 535.6208458664421, "id": "109"}, {"x": 85.31826028681499, "y": 586.9376804839346, "id": "110"}, {"x": 966.8869556882307, "y": 166.7606147669499, "id": "111"}, {"x": 792.599988196088, "y": 14.598159144146305, "id": "112"}, {"x": 679.0985972821478, "y": 370.97368064732564, "id": "113"}, {"x": 775.9533147697887, "y": 706.7094559859352, "id": "114"}, {"x": 431.37396381243167, "y": 445.42321290492634, "id": "115"}, {"x": 713.6807211849061, "y": 264.84545449048056, "id": "116"}, {"x": 202.44070576387008, "y": 842.8212772692114, "id": "117"}, {"x": 493.4056387738969, "y": 265.4371749690929, "id": "118"}, {"x": 328.10016825574206, "y": 686.3546240382777, "id": "119"}, {"x": 154.79025335969365, "y": 940.5805951179957, "id": "120"}, {"x": 690.4849178147786, "y": 899.3482320057308, "id": "121"}, {"x": 388.3293795041067, "y": 189.74046271541468, "id": "122"}, {"x": 78.4234232943276, "y": 642.9752432399143, "id": "123"}, {"x": 578.4880163731509, "y": 600.4698023953765, "id": "124"}, {"x": 803.7263160953847, "y": 551.9058031265134, "id": "125"}, {"x": 211.36573980051566, "y": 614.3452641871901, "id": "126"}, {"x": 214.4383081364366, "y": 246.99744014659709, "id": "127"}, {"x": 935.9323559403372, "y": 488.44615325854426, "id": "128"}, {"x": 846.4851391680484, "y": 37.233740137141424, "id": "129"}, {"x": 736.0452381946909, "y": 862.0583240211566, "id": "130"}, {"x": 159.45182360715083, "y": 42.853469903507914, "id": "131"}, {"x": 568.1622859186766, "y": 33.22237448170839, "id": "132"}, {"x": 923.0519338290032, "y": 253.10120905557966, "id": "133"}, {"x": 27.7665511143087, "y": 588.4949992600284, "id": "134"}, {"x": 725.98107206997, "y": 7.27014270657278, "id": "135"}, {"x": 905.5223731979121, "y": 467.67022590647935, "id": "136"}, {"x": 706.9990675836972, "y": 211.96879099518463, "id": "137"}, {"x": 823.425462682419, "y": 264.3363754139799, "id": "138"}, {"x": 605.8982554870588, "y": 986.800743292363, "id": "139"}, {"x": 240.16860090946324, "y": 381.92126095073553, "id": "140"}, {"x": 560.715753170384, "y": 602.3522009121618, "id": "141"}, {"x": 965.558685228382, "y": 644.6173353454706, "id": "142"}, {"x": 597.1406652588829, "y": 569.7578501881823, "id": "143"}, {"x": 496.0571935579231, "y": 10.775303880728337, "id": "144"}, {"x": 433.9374437832393, "y": 976.6342512749102, "id": "145"}, {"x": 63.386500636901324, "y": 413.84324954617813, "id": "146"}, {"x": 810.8109494893004, "y": 738.1292537210801, "id": "147"}, {"x": 446.06585126654574, "y": 947.7224639437168, "id": "148"}, {"x": 761.7962269306284, "y": 291.63878167485336, "id": "149"}, {"x": 584.6806433172098, "y": 232.96943204246588, "id": "150"}, {"x": 652.0803028718854, "y": 325.94682866086424, "id": "151"}, {"x": 874.3839258738377, "y": 136.09496210381644, "id": "152"}, {"x": 483.16119254677506, "y": 685.2188994902084, "id": "153"}, {"x": 752.4936850326299, "y": 36.29083641302322, "id": "154"}, {"x": 276.87251643557573, "y": 588.8869923125114, "id": "155"}, {"x": 334.66541714994145, "y": 308.753914185662, "id": "156"}, {"x": 928.5338174448716, "y": 517.7031739639258, "id": "157"}, {"x": 438.45861402217366, "y": 381.06699652681453, "id": "158"}, {"x": 459.34937172357326, "y": 772.7941467035898, "id": "159"}, {"x": 925.4260129898086, "y": 759.2893192390445, "id": "160"}, {"x": 140.19702617164253, "y": 765.6565791039218, "id": "161"}, {"x": 701.8468841173668, "y": 472.10595714232915, "id": "162"}, {"x": 839.4395225183758, "y": 448.76081395910614, "id": "163"}, {"x": 570.4828495561972, "y": 884.6421695112941, "id": "164"}, {"x": 710.3644291830062, "y": 907.7485541435947, "id": "165"}, {"x": 90.44893109858599, "y": 501.80309832582503, "id": "166"}, {"x": 429.11204493108545, "y": 468.00160120161416, "id": "167"}, {"x": 244.27311801019025, "y": 300.5402651052077, "id": "168"}, {"x": 42.242355301629345, "y": 138.63751978699278, "id": "169"}, {"x": 330.56673172476815, "y": 113.51449079289944, "id": "170"}, {"x": 555.0939719924781, "y": 149.6014231413324, "id": "171"}, {"x": 509.89110344093615, "y": 993.5706136590294, "id": "172"}, {"x": 743.6277203747034, "y": 654.5269478576929, "id": "173"}, {"x": 399.83795326851134, "y": 611.4788486940645, "id": "174"}, {"x": 842.6604233756508, "y": 778.664916950837, "id": "175"}, {"x": 967.6087988069464, "y": 405.24253757426186, "id": "176"}, {"x": 413.61357764594663, "y": 806.3661531063038, "id": "177"}, {"x": 427.13227546159493, "y": 26.829554233794074, "id": "178"}, {"x": 815.5443092768603, "y": 860.5948719367599, "id": "179"}, {"x": 654.7347665593626, "y": 864.4546073464988, "id": "180"}, {"x": 143.8247691369413, "y": 59.39329552244177, "id": "181"}, {"x": 985.1876853170513, "y": 665.1416445849923, "id": "182"}, {"x": 506.83790355054134, "y": 264.86180677552983, "id": "183"}, {"x": 974.5105575697798, "y": 277.47152484985116, "id": "184"}, {"x": 620.796175438168, "y": 385.17926059048557, "id": "185"}, {"x": 212.42114501481936, "y": 183.59323146669703, "id": "186"}, {"x": 434.7095101102441, "y": 508.77319041446844, "id": "187"}, {"x": 754.731043258694, "y": 528.4281572781123, "id": "188"}, {"x": 316.8922000970342, "y": 374.23387240141136, "id": "189"}, {"x": 932.9942530518933, "y": 66.08158839736822, "id": "190"}, {"x": 196.59228177189146, "y": 518.570231855434, "id": "191"}, {"x": 698.4444826518121, "y": 25.851969641368488, "id": "192"}, {"x": 626.347767598514, "y": 760.2978866052507, "id": "193"}, {"x": 867.0964212072805, "y": 398.9387825315991, "id": "194"}, {"x": 822.4691496440332, "y": 19.492683319871638, "id": "195"}, {"x": 448.7516910912771, "y": 142.90864398578097, "id": "196"}, {"x": 986.6524264340082, "y": 523.3282173899953, "id": "197"}, {"x": 262.1847292039564, "y": 678.7673680442421, "id": "198"}, {"x": 63.323456396458646, "y": 202.91962121490158, "id": "199"}, {"x": 792.7477595843113, "y": 63.19296221263171, "id": "200"}, {"x": 207.6479542319638, "y": 331.29789600437766, "id": "201"}, {"x": 904.6929288823051, "y": 88.93264434086856, "id": "202"}, {"x": 139.65957752964752, "y": 723.5083981033398, "id": "203"}, {"x": 724.5602504706316, "y": 348.05099611119715, "id": "204"}, {"x": 357.5738554254927, "y": 70.04093018526724, "id": "205"}, {"x": 879.6145831533404, "y": 634.9498290677144, "id": "206"}, {"x": 306.08853175879966, "y": 311.42194569529227, "id": "207"}, {"x": 999.3180005894236, "y": 895.6039165882505, "id": "208"}, {"x": 199.8664407718459, "y": 250.67620691811464, "id": "209"}, {"x": 209.35627114666966, "y": 927.3214687217363, "id": "210"}, {"x": 804.32575662623, "y": 760.7772283973335, "id": "211"}, {"x": 888.9854353829824, "y": 626.5419050496527, "id": "212"}, {"x": 698.3991575340341, "y": 8.556086970917253, "id": "213"}, {"x": 620.1250052001225, "y": 190.64954971106397, "id": "214"}, {"x": 660.6453057296144, "y": 101.16775843064995, "id": "215"}, {"x": 185.3940178879817, "y": 756.5693015273056, "id": "216"}, {"x": 168.9451855655024, "y": 839.391879959102, "id": "217"}, {"x": 280.85354197725354, "y": 606.3942228765751, "id": "218"}, {"x": 883.7821139233852, "y": 293.1591874142756, "id": "219"}, {"x": 201.50642647625315, "y": 274.5694998785858, "id": "220"}, {"x": 356.99870502264184, "y": 551.8739731424121, "id": "221"}, {"x": 672.5939380047841, "y": 638.6458544733487, "id": "222"}, {"x": 286.4463783098444, "y": 549.282213188141, "id": "223"}, {"x": 951.445229695907, "y": 929.8060813505426, "id": "224"}, {"x": 164.49300009257527, "y": 52.15880018172447, "id": "225"}, {"x": 127.10132327228618, "y": 382.98225997977767, "id": "226"}, {"x": 590.759732622045, "y": 646.7252360996927, "id": "227"}, {"x": 21.116345868008146, "y": 413.62631510319113, "id": "228"}, {"x": 726.0504712838862, "y": 556.1896745731972, "id": "229"}, {"x": 10.79989122702285, "y": 81.38030412759711, "id": "230"}, {"x": 751.0133219832862, "y": 331.70294298231676, "id": "231"}, {"x": 389.8523554370954, "y": 892.4395492688354, "id": "232"}, {"x": 612.7092100499343, "y": 251.23300190640953, "id": "233"}, {"x": 568.5359440498002, "y": 129.75985565713776, "id": "234"}, {"x": 947.3595329598458, "y": 588.68361790726, "id": "235"}, {"x": 348.77827313313225, "y": 683.8344670669114, "id": "236"}, {"x": 547.6111682975965, "y": 572.7701113358681, "id": "237"}, {"x": 908.0919106949982, "y": 298.3379149870502, "id": "238"}, {"x": 645.4479407556715, "y": 785.2892107523716, "id": "239"}, {"x": 826.8624438097448, "y": 946.7887172753632, "id": "240"}, {"x": 209.6935419831647, "y": 545.9737902208351, "id": "241"}, {"x": 648.8934945953522, "y": 957.1079816288343, "id": "242"}, {"x": 372.75709625369393, "y": 475.8069282573396, "id": "243"}, {"x": 493.09172079084493, "y": 850.6699779771869, "id": "244"}, {"x": 730.5222545225363, "y": 800.2864281245877, "id": "245"}, {"x": 584.6658974705234, "y": 981.6501786365687, "id": "246"}, {"x": 119.87952800381674, "y": 853.9287754741504, "id": "247"}, {"x": 232.32815384657002, "y": 763.9469490316274, "id": "248"}, {"x": 289.7809909992638, "y": 905.1572783539017, "id": "249"}, {"x": 843.5736395049094, "y": 355.0651617970859, "id": "250"}, {"x": 692.5032921121161, "y": 535.5463725243494, "id": "251"}, {"x": 921.2468285574565, "y": 392.60725689678446, "id": "252"}, {"x": 956.0942868936332, "y": 92.16995114104954, "id": "253"}, {"x": 651.5214079729993, "y": 839.1294399731937, "id": "254"}, {"x": 186.57130127669376, "y": 779.5551516973915, "id": "255"}, {"x": 262.5238634010765, "y": 69.16684515948135, "id": "256"}, {"x": 102.20845129381495, "y": 565.1706754455083, "id": "257"}, {"x": 811.5051555164318, "y": 127.67762248764292, "id": "258"}, {"x": 399.20412240719315, "y": 336.42689243215494, "id": "259"}, {"x": 744.5265455088498, "y": 244.6329489071396, "id": "260"}, {"x": 811.5481317194096, "y": 8.686497661680392, "id": "261"}, {"x": 789.3357534093095, "y": 60.59335120621656, "id": "262"}, {"x": 84.43437724955282, "y": 138.15968624179897, "id": "263"}, {"x": 451.69883356396025, "y": 994.2954905391371, "id": "264"}, {"x": 327.06858713759533, "y": 3.9495082809876125, "id": "265"}, {"x": 713.1330008282724, "y": 902.1362515738432, "id": "266"}, {"x": 86.14020502424158, "y": 70.5807016012162, "id": "267"}, {"x": 626.8129151159422, "y": 302.8576327066018, "id": "268"}, {"x": 803.5256783414123, "y": 426.48862856884716, "id": "269"}, {"x": 334.56110478913547, "y": 193.77290685835, "id": "270"}, {"x": 402.8710452226196, "y": 658.1273091963958, "id": "271"}, {"x": 866.7663803306665, "y": 454.7717840599751, "id": "272"}, {"x": 192.1046604642549, "y": 762.3445428587636, "id": "273"}, {"x": 69.20383995459645, "y": 823.4398877881107, "id": "274"}, {"x": 265.83021586961854, "y": 714.6624612040997, "id": "275"}, {"x": 918.9852442203768, "y": 783.1568054875657, "id": "276"}, {"x": 559.7355028061118, "y": 165.3770327586519, "id": "277"}, {"x": 75.4613981714668, "y": 479.8951645856583, "id": "278"}, {"x": 487.30668566109694, "y": 578.19884432514, "id": "279"}, {"x": 483.9974405393097, "y": 377.08963903877367, "id": "280"}, {"x": 115.86166399436782, "y": 982.7395535249219, "id": "281"}, {"x": 348.8304792369373, "y": 927.1548407189387, "id": "282"}, {"x": 399.137538893516, "y": 377.7724807473847, "id": "283"}, {"x": 554.6332825424729, "y": 875.0867392208684, "id": "284"}, {"x": 694.8898286719394, "y": 809.8829427940755, "id": "285"}, {"x": 296.6559468823382, "y": 341.99430127757535, "id": "286"}, {"x": 768.6153739014221, "y": 893.6184126547877, "id": "287"}, {"x": 539.9536722860448, "y": 242.85529132011675, "id": "288"}, {"x": 386.07318079267094, "y": 144.12781050752977, "id": "289"}, {"x": 533.6614308454346, "y": 788.2489538270878, "id": "290"}, {"x": 220.94154534589515, "y": 914.7159700976949, "id": "291"}, {"x": 263.0832479347005, "y": 150.7358487876026, "id": "292"}, {"x": 395.04027052047184, "y": 365.1006869711262, "id": "293"}, {"x": 433.8642499028503, "y": 68.14251100772395, "id": "294"}, {"x": 18.77228066989689, "y": 290.8752076659256, "id": "295"}, {"x": 674.07595580972, "y": 634.1649445391669, "id": "296"}, {"x": 752.410969951634, "y": 864.6583856328393, "id": "297"}, {"x": 529.6735448345888, "y": 487.8638086462925, "id": "298"}, {"x": 722.547324030621, "y": 926.827273591297, "id": "299"}, {"x": 459.4415406071341, "y": 144.47466998198465, "id": "300"}, {"x": 696.5077347185077, "y": 575.9220352572094, "id": "301"}, {"x": 262.86933828353085, "y": 798.6228570095732, "id": "302"}, {"x": 132.2683683395436, "y": 49.00496244435537, "id": "303"}, {"x": 559.1090111082592, "y": 529.2387683422205, "id": "304"}, {"x": 484.93003289987234, "y": 944.4929680267746, "id": "305"}, {"x": 391.17283211593224, "y": 858.8257793918083, "id": "306"}, {"x": 566.4885184442228, "y": 46.94483447464259, "id": "307"}, {"x": 687.9481713603144, "y": 390.8155306856407, "id": "308"}, {"x": 113.95035308654566, "y": 603.0274396352553, "id": "309"}, {"x": 662.5936479582545, "y": 376.78956338981374, "id": "310"}, {"x": 387.6380833185308, "y": 904.656770866793, "id": "311"}, {"x": 473.6636940565533, "y": 84.42936296086533, "id": "312"}, {"x": 739.9716317625056, "y": 420.4020010291882, "id": "313"}, {"x": 196.48897088408336, "y": 936.1293741359574, "id": "314"}, {"x": 262.97006814025934, "y": 938.8702168714734, "id": "315"}, {"x": 927.1012100113669, "y": 299.38957630975426, "id": "316"}, {"x": 781.4426008201998, "y": 661.8364074343389, "id": "317"}, {"x": 854.6659981465405, "y": 351.2179214358806, "id": "318"}, {"x": 915.667755222933, "y": 251.11744140481528, "id": "319"}, {"x": 304.9981546807501, "y": 856.1189653866728, "id": "320"}, {"x": 859.086957494076, "y": 763.1471472906067, "id": "321"}, {"x": 215.11607015011057, "y": 830.1235808227208, "id": "322"}, {"x": 277.98245916883116, "y": 264.11256431704544, "id": "323"}, {"x": 77.47009271608407, "y": 798.0177335984683, "id": "324"}, {"x": 983.7515478811277, "y": 732.1042151578392, "id": "325"}, {"x": 585.8398509344757, "y": 93.75542065909315, "id": "326"}, {"x": 637.6182065944104, "y": 173.58717011130153, "id": "327"}, {"x": 314.999033354403, "y": 907.2588286098859, "id": "328"}, {"x": 965.5451452185142, "y": 443.44436730736527, "id": "329"}, {"x": 238.0312165682178, "y": 22.31720044110763, "id": "330"}, {"x": 702.729525752746, "y": 370.602451468839, "id": "331"}, {"x": 321.75782204648385, "y": 313.33436665884796, "id": "332"}, {"x": 632.1629219801263, "y": 12.235233839849036, "id": "333"}, {"x": 395.6085293188157, "y": 680.5725565585404, "id": "334"}, {"x": 686.3182060077507, "y": 710.6383313140577, "id": "335"}, {"x": 272.9657728087197, "y": 401.94653674924797, "id": "336"}, {"x": 649.1104045673378, "y": 142.5982791657544, "id": "337"}, {"x": 637.8788131818005, "y": 791.1763106774237, "id": "338"}, {"x": 311.8865681832752, "y": 894.2135612303528, "id": "339"}, {"x": 599.1658128982294, "y": 950.8468175442108, "id": "340"}, {"x": 338.0084704199854, "y": 174.91684984017886, "id": "341"}, {"x": 947.0452048552077, "y": 662.7846994864232, "id": "342"}, {"x": 674.8396223307531, "y": 467.69677778961585, "id": "343"}, {"x": 189.82045417400994, "y": 297.6343641415186, "id": "344"}, {"x": 924.0928890491823, "y": 866.1894727694438, "id": "345"}, {"x": 317.3204890106909, "y": 838.2665077586624, "id": "346"}, {"x": 240.4306377237937, "y": 677.2289516586299, "id": "347"}, {"x": 740.4860747504637, "y": 713.5635472879912, "id": "348"}, {"x": 535.8463655937309, "y": 760.077940340288, "id": "349"}, {"x": 893.3682103726052, "y": 532.0873789912779, "id": "350"}, {"x": 548.6152387225156, "y": 48.24802169721454, "id": "351"}, {"x": 755.6322566110581, "y": 533.1950134562056, "id": "352"}, {"x": 444.19887524074045, "y": 541.6694059719972, "id": "353"}, {"x": 232.36502059374843, "y": 831.5036574993035, "id": "354"}, {"x": 687.3667322295378, "y": 804.9580093092909, "id": "355"}, {"x": 469.5839045586238, "y": 192.436637691186, "id": "356"}, {"x": 630.0691168200017, "y": 284.1634303232259, "id": "357"}, {"x": 974.1269615975871, "y": 745.1313005100203, "id": "358"}, {"x": 102.73333763946523, "y": 352.05468343243507, "id": "359"}, {"x": 712.9964628702145, "y": 469.57678086147627, "id": "360"}, {"x": 66.3831373301067, "y": 428.8235312202283, "id": "361"}, {"x": 357.45113671763164, "y": 761.0001219810323, "id": "362"}, {"x": 618.9670244465976, "y": 132.84551258881316, "id": "363"}, {"x": 919.6477910558984, "y": 913.4526615936958, "id": "364"}, {"x": 416.6136108736138, "y": 925.0292381689382, "id": "365"}, {"x": 455.21227146675227, "y": 122.66456682311421, "id": "366"}, {"x": 884.8043263067403, "y": 909.0048901219262, "id": "367"}, {"x": 679.0430150818028, "y": 857.1948468651775, "id": "368"}, {"x": 399.83073905956536, "y": 925.2444916597018, "id": "369"}, {"x": 337.411739567249, "y": 838.12400509409, "id": "370"}, {"x": 545.0692165906468, "y": 876.9534002178774, "id": "371"}, {"x": 486.0598372551634, "y": 369.82486036778585, "id": "372"}, {"x": 129.25847589568852, "y": 181.10923776580336, "id": "373"}, {"x": 423.46369200428836, "y": 512.3454395889986, "id": "374"}, {"x": 827.764731803327, "y": 177.99308840344509, "id": "375"}, {"x": 229.53291640225882, "y": 51.66072370848895, "id": "376"}, {"x": 659.3346032980387, "y": 986.3102871489193, "id": "377"}, {"x": 846.988391793289, "y": 505.3283027226906, "id": "378"}, {"x": 633.3281629844788, "y": 82.44000041246291, "id": "379"}, {"x": 104.21934751852524, "y": 337.0911558014515, "id": "380"}, {"x": 557.805983761672, "y": 196.1938987486873, "id": "381"}, {"x": 956.551889557167, "y": 900.5354334993302, "id": "382"}, {"x": 853.5950903119278, "y": 561.5840603182027, "id": "383"}, {"x": 100.84060848119614, "y": 619.4882564737186, "id": "384"}, {"x": 335.9063441055733, "y": 721.4352630128482, "id": "385"}, {"x": 101.16763414581908, "y": 385.40180625438103, "id": "386"}, {"x": 802.9575923411146, "y": 243.61010626726275, "id": "387"}, {"x": 880.0977089573123, "y": 107.24709937192623, "id": "388"}, {"x": 325.9596621700379, "y": 974.5206207510649, "id": "389"}, {"x": 997.7055424205545, "y": 263.78385526536397, "id": "390"}, {"x": 369.0224157516436, "y": 321.42344439427694, "id": "391"}, {"x": 26.547747249634934, "y": 657.253291328559, "id": "392"}, {"x": 106.74901157963568, "y": 742.4901202755879, "id": "393"}, {"x": 934.283930226044, "y": 310.26746782013316, "id": "394"}, {"x": 994.46263883963, "y": 756.4442801771019, "id": "395"}, {"x": 826.1890766341735, "y": 84.09948313213256, "id": "396"}, {"x": 781.0128752828388, "y": 624.6652291245, "id": "397"}, {"x": 497.975805070504, "y": 203.17080237762985, "id": "398"}, {"x": 985.3378785597614, "y": 963.4435420370384, "id": "399"}, {"x": 846.5361393977834, "y": 243.4622313271091, "id": "400"}, {"x": 174.0079232735625, "y": 905.4447911324279, "id": "401"}, {"x": 700.1957826205962, "y": 485.16361676391637, "id": "402"}, {"x": 823.0382676226039, "y": 456.25169430030587, "id": "403"}, {"x": 129.31949279560985, "y": 27.00998999730009, "id": "404"}, {"x": 600.5432887863097, "y": 979.7527027401193, "id": "405"}, {"x": 267.60704787757663, "y": 568.0770213480913, "id": "406"}, {"x": 28.1662145673236, "y": 346.3436890818928, "id": "407"}, {"x": 104.38139067279828, "y": 398.81541720887736, "id": "408"}, {"x": 370.9154559623253, "y": 308.3704829880276, "id": "409"}, {"x": 800.7826600083254, "y": 603.7543124972664, "id": "410"}, {"x": 433.3539252871678, "y": 772.3371707492895, "id": "411"}, {"x": 732.5223159833431, "y": 823.9287780979904, "id": "412"}, {"x": 955.4937239613703, "y": 553.5902755829378, "id": "413"}, {"x": 183.26702050251032, "y": 23.03496593054044, "id": "414"}, {"x": 705.1896680304133, "y": 596.166692865466, "id": "415"}, {"x": 49.39622337354843, "y": 318.6324091702402, "id": "416"}, {"x": 527.0670213607062, "y": 72.5206694025603, "id": "417"}, {"x": 398.25317190456656, "y": 424.9779556319808, "id": "418"}, {"x": 111.3423730998726, "y": 848.6846304736891, "id": "419"}, {"x": 139.72540445680104, "y": 681.2666822563936, "id": "420"}, {"x": 251.4012303526917, "y": 408.754686683513, "id": "421"}, {"x": 377.9576977010377, "y": 715.4971882414196, "id": "422"}, {"x": 324.86911086053874, "y": 309.9120460600998, "id": "423"}, {"x": 59.809818073798596, "y": 249.3611052793999, "id": "424"}, {"x": 566.8531400390119, "y": 68.81585370226107, "id": "425"}, {"x": 444.84731926045083, "y": 221.047730872037, "id": "426"}, {"x": 170.50412935895875, "y": 989.4305220474397, "id": "427"}, {"x": 430.37322555237654, "y": 711.5269539672238, "id": "428"}, {"x": 175.46824954754726, "y": 269.8334937362098, "id": "429"}, {"x": 911.7143454894258, "y": 898.4075474092134, "id": "430"}, {"x": 867.4758596874192, "y": 763.7203717310324, "id": "431"}, {"x": 63.49636851970075, "y": 848.966379676636, "id": "432"}, {"x": 792.5948301546746, "y": 117.43041898551898, "id": "433"}, {"x": 28.86298296108958, "y": 936.6301944704906, "id": "434"}, {"x": 228.4872967227285, "y": 45.940117569911564, "id": "435"}, {"x": 137.3229471057269, "y": 740.1115244690573, "id": "436"}, {"x": 390.8889901478484, "y": 448.74370587809034, "id": "437"}, {"x": 923.0157968372882, "y": 187.8410950979269, "id": "438"}, {"x": 983.7599524488926, "y": 933.995643796228, "id": "439"}, {"x": 543.3437667132449, "y": 14.458105791922637, "id": "440"}, {"x": 952.7521886863248, "y": 492.89710324910385, "id": "441"}, {"x": 235.54400924185603, "y": 917.5012774857643, "id": "442"}, {"x": 975.8938567848061, "y": 723.7395468440302, "id": "443"}, {"x": 516.5893600478677, "y": 798.4822242405615, "id": "444"}, {"x": 706.6979935102039, "y": 93.54497696456488, "id": "445"}, {"x": 812.178752605584, "y": 414.88233700059817, "id": "446"}, {"x": 187.68374947406207, "y": 979.1258433588234, "id": "447"}, {"x": 775.7609470836221, "y": 133.13345565782907, "id": "448"}, {"x": 348.32735230081124, "y": 842.981920703617, "id": "449"}, {"x": 733.2747425669539, "y": 696.4777529555494, "id": "450"}, {"x": 277.61791646516843, "y": 969.8703217572754, "id": "451"}, {"x": 183.38948940903398, "y": 441.5214911719821, "id": "452"}, {"x": 306.0861469130281, "y": 268.0927024023048, "id": "453"}, {"x": 727.697049601488, "y": 951.7335574503478, "id": "454"}, {"x": 315.8751864645258, "y": 88.50565226746754, "id": "455"}, {"x": 20.007740101581128, "y": 990.0355938896811, "id": "456"}, {"x": 949.7751011933134, "y": 471.2460017670048, "id": "457"}, {"x": 492.4155510776763, "y": 808.9027464188528, "id": "458"}, {"x": 356.54691985098543, "y": 966.8814401401498, "id": "459"}, {"x": 993.6036486334555, "y": 973.2892881073576, "id": "460"}, {"x": 869.4509429227733, "y": 882.8142567881564, "id": "461"}, {"x": 186.6537434580865, "y": 41.396271912893525, "id": "462"}, {"x": 944.1211913779221, "y": 864.805405033417, "id": "463"}, {"x": 871.7148026297033, "y": 58.69635278616381, "id": "464"}, {"x": 718.1434041768478, "y": 432.27288596157956, "id": "465"}, {"x": 697.9594098650376, "y": 632.2622740140946, "id": "466"}, {"x": 580.0444435615456, "y": 154.05225040266058, "id": "467"}, {"x": 84.86244567901124, "y": 536.8049851076496, "id": "468"}, {"x": 576.3693973211476, "y": 478.09348309749157, "id": "469"}, {"x": 237.44573942220626, "y": 952.5851958781863, "id": "470"}, {"x": 24.084072353306453, "y": 855.4236583370255, "id": "471"}, {"x": 785.6674585062877, "y": 669.3489071282355, "id": "472"}, {"x": 512.1521290330079, "y": 937.8008579994228, "id": "473"}, {"x": 789.7140039083201, "y": 684.1308876323806, "id": "474"}, {"x": 895.7120545533908, "y": 187.746358294686, "id": "475"}, {"x": 625.6568377689016, "y": 948.6200836215862, "id": "476"}, {"x": 823.5527676773154, "y": 47.44862640298686, "id": "477"}, {"x": 181.5396072243951, "y": 290.8396006888443, "id": "478"}, {"x": 474.37153468843417, "y": 583.840797813968, "id": "479"}, {"x": 954.9612120884109, "y": 383.9750624117869, "id": "480"}, {"x": 438.40914580408895, "y": 51.516317970862644, "id": "481"}, {"x": 362.12477710703325, "y": 995.255148917421, "id": "482"}, {"x": 230.12126407838585, "y": 499.8104420861997, "id": "483"}, {"x": 901.7026126309943, "y": 875.7206263526401, "id": "484"}, {"x": 96.91567339748353, "y": 607.2461836051193, "id": "485"}, {"x": 252.81870623191494, "y": 798.5012407078171, "id": "486"}, {"x": 124.9697222010826, "y": 399.5632916325553, "id": "487"}, {"x": 639.4722698362876, "y": 397.8832808361061, "id": "488"}, {"x": 727.4744806202619, "y": 183.5675348284187, "id": "489"}, {"x": 266.6162909089601, "y": 354.08605054175337, "id": "490"}, {"x": 363.7008741430221, "y": 511.0707445557409, "id": "491"}, {"x": 469.43601593528837, "y": 626.8334063372233, "id": "492"}, {"x": 281.255687754193, "y": 251.6059884287254, "id": "493"}, {"x": 513.570655421867, "y": 729.9891913783583, "id": "494"}, {"x": 369.865137783979, "y": 442.659005757618, "id": "495"}, {"x": 804.0762734935938, "y": 142.4845756355042, "id": "496"}, {"x": 453.7242169958735, "y": 420.4973449866342, "id": "497"}, {"x": 924.459774082297, "y": 562.3793694660653, "id": "498"}, {"x": 483.99570558965877, "y": 76.04660450695344, "id": "499"}, {"x": 136.2604903527419, "y": 347.26529526746486, "id": "500"}, {"x": 810.943480666752, "y": 712.7790077387428, "id": "501"}, {"x": 758.4391107360007, "y": 903.9551673916138, "id": "502"}, {"x": 613.6892187539976, "y": 734.1872942630821, "id": "503"}, {"x": 201.18442276598182, "y": 983.8978048603663, "id": "504"}, {"x": 548.2077652421059, "y": 885.4009192024286, "id": "505"}, {"x": 234.6810947946042, "y": 254.11966103373175, "id": "506"}, {"x": 30.955329844959856, "y": 721.0235146419466, "id": "507"}, {"x": 506.0950053037591, "y": 170.09598148260375, "id": "508"}, {"x": 717.5135302599074, "y": 492.4489275245485, "id": "509"}, {"x": 930.2569981399008, "y": 126.77690680010033, "id": "510"}, {"x": 457.7072703977425, "y": 830.0952543094874, "id": "511"}, {"x": 304.14619817428803, "y": 671.9907316681204, "id": "512"}, {"x": 122.87376356911817, "y": 218.21391929603416, "id": "513"}, {"x": 896.0020483760246, "y": 551.1336034158968, "id": "514"}, {"x": 656.3087778769193, "y": 354.69991664854984, "id": "515"}, {"x": 581.7221411512144, "y": 930.1887004618224, "id": "516"}, {"x": 62.43452652017145, "y": 500.98337668855663, "id": "517"}, {"x": 34.20591732389433, "y": 28.948598410262427, "id": "518"}, {"x": 423.2819044798809, "y": 744.7935066030985, "id": "519"}, {"x": 936.5718042522365, "y": 655.4341883215707, "id": "520"}, {"x": 750.7904685847805, "y": 772.3431394415666, "id": "521"}, {"x": 991.9672763564704, "y": 36.9964878380572, "id": "522"}, {"x": 695.8427302927473, "y": 948.8100599825416, "id": "523"}, {"x": 923.7349791710817, "y": 581.0429377486927, "id": "524"}, {"x": 430.7006336412024, "y": 775.6528792918502, "id": "525"}, {"x": 666.6737762509317, "y": 677.0126957977161, "id": "526"}, {"x": 635.4651217665895, "y": 803.5334351217334, "id": "527"}, {"x": 490.58038286958515, "y": 399.8538423611222, "id": "528"}, {"x": 873.0187997621823, "y": 328.53624394379966, "id": "529"}, {"x": 619.2608094040943, "y": 295.58692086949236, "id": "530"}, {"x": 972.4058548317947, "y": 944.8797190548773, "id": "531"}, {"x": 194.27268991217994, "y": 930.7484068427019, "id": "532"}, {"x": 391.1124209614727, "y": 268.5031334677954, "id": "533"}, {"x": 556.5358543845952, "y": 121.72194661943159, "id": "534"}, {"x": 261.4913531359863, "y": 587.6963142422533, "id": "535"}, {"x": 164.5664421617169, "y": 371.758584832443, "id": "536"}, {"x": 759.0155092134736, "y": 595.5233442881711, "id": "537"}, {"x": 667.54205866215, "y": 445.64776515048555, "id": "538"}, {"x": 772.1579793131835, "y": 199.3940078056592, "id": "539"}, {"x": 245.33893035490073, "y": 224.89108332252306, "id": "540"}, {"x": 458.8766530151369, "y": 820.2511789566089, "id": "541"}, {"x": 191.43034783188307, "y": 96.23573299044075, "id": "542"}, {"x": 492.7682776673041, "y": 814.563844951686, "id": "543"}, {"x": 758.4985018726205, "y": 415.8970356688951, "id": "544"}, {"x": 304.6398452743628, "y": 440.9580918812527, "id": "545"}, {"x": 297.382886074147, "y": 197.0104259450578, "id": "546"}, {"x": 743.2514693780156, "y": 961.4870660873727, "id": "547"}, {"x": 228.01049374637262, "y": 469.19471401000425, "id": "548"}, {"x": 831.9445331062702, "y": 133.67807560190514, "id": "549"}, {"x": 401.01215841512163, "y": 25.01302608511824, "id": "550"}, {"x": 595.4745193935371, "y": 971.817182541725, "id": "551"}, {"x": 544.4185495403194, "y": 665.7291270507731, "id": "552"}, {"x": 717.3328651159474, "y": 574.9994368307957, "id": "553"}, {"x": 734.1917574958028, "y": 681.4093065107361, "id": "554"}, {"x": 629.9698517910394, "y": 110.26150480666008, "id": "555"}, {"x": 423.5807369640827, "y": 663.2121050127573, "id": "556"}, {"x": 708.768355720334, "y": 703.5793892270459, "id": "557"}, {"x": 260.3819352051242, "y": 689.5891286356464, "id": "558"}, {"x": 488.4123789136977, "y": 540.7765070931881, "id": "559"}, {"x": 71.35750992151668, "y": 444.5087986119517, "id": "560"}, {"x": 600.0892324670968, "y": 382.0822745010757, "id": "561"}, {"x": 280.5653216458718, "y": 758.0509283573901, "id": "562"}, {"x": 536.8784765842984, "y": 77.02949302988249, "id": "563"}, {"x": 216.73588008341727, "y": 987.2472785786834, "id": "564"}, {"x": 155.1056819882367, "y": 163.7743113534621, "id": "565"}, {"x": 105.9199798096444, "y": 833.7572506125131, "id": "566"}, {"x": 522.1854928231991, "y": 340.15819717610583, "id": "567"}, {"x": 873.9116083197732, "y": 667.1791484621638, "id": "568"}, {"x": 97.4894259485738, "y": 258.7586090391394, "id": "569"}, {"x": 685.2911032004307, "y": 961.7297097338661, "id": "570"}, {"x": 259.66757548482065, "y": 535.6308268473421, "id": "571"}, {"x": 189.4329765655488, "y": 261.10124791175946, "id": "572"}, {"x": 839.8937835023288, "y": 826.7698776727156, "id": "573"}, {"x": 790.7325907954952, "y": 483.1607721839506, "id": "574"}, {"x": 980.5310849491243, "y": 201.71982908655372, "id": "575"}, {"x": 491.88526466501656, "y": 192.77174856368285, "id": "576"}, {"x": 917.5542132044379, "y": 703.3243175408767, "id": "577"}, {"x": 485.7551705287686, "y": 764.6167098269274, "id": "578"}, {"x": 538.7983622995807, "y": 515.4732442133432, "id": "579"}, {"x": 164.25386502485784, "y": 786.7150065599347, "id": "580"}, {"x": 558.7159620585891, "y": 466.59015289900464, "id": "581"}, {"x": 315.0892587523394, "y": 167.04764977338837, "id": "582"}, {"x": 770.5519553139637, "y": 330.82196178646717, "id": "583"}, {"x": 388.2120322663073, "y": 167.10651985494295, "id": "584"}, {"x": 532.0400791563785, "y": 134.6238547254218, "id": "585"}, {"x": 159.11040838535163, "y": 195.1921048376446, "id": "586"}, {"x": 630.0045494564766, "y": 115.6985999728104, "id": "587"}, {"x": 68.24071841362856, "y": 89.9067638704687, "id": "588"}, {"x": 969.1675418038963, "y": 235.2331448999333, "id": "589"}, {"x": 713.921573568884, "y": 508.4852200528568, "id": "590"}, {"x": 20.27419237183581, "y": 348.67717036922585, "id": "591"}, {"x": 215.14613540328608, "y": 233.24806639692497, "id": "592"}, {"x": 152.57721168380732, "y": 104.09668502169511, "id": "593"}, {"x": 179.23548467787097, "y": 799.188522432885, "id": "594"}, {"x": 101.7508976457614, "y": 60.843986329446324, "id": "595"}, {"x": 475.4677486624255, "y": 863.6443993660722, "id": "596"}, {"x": 181.01963726268667, "y": 121.66902280432367, "id": "597"}, {"x": 450.2207644948245, "y": 685.6750051360607, "id": "598"}, {"x": 352.1090008362888, "y": 109.51211830179585, "id": "599"}, {"x": 782.6303656505108, "y": 60.7528160887294, "id": "600"}, {"x": 611.5388853674197, "y": 154.54138907921177, "id": "601"}, {"x": 782.4048601717877, "y": 60.23531244994651, "id": "602"}, {"x": 737.0384972326895, "y": 951.2614116566615, "id": "603"}, {"x": 806.0067174060732, "y": 826.9140988321298, "id": "604"}, {"x": 231.0932672005387, "y": 212.99368641637483, "id": "605"}, {"x": 403.6559002805493, "y": 406.36096073508276, "id": "606"}, {"x": 379.9155373465634, "y": 923.7908141033968, "id": "607"}, {"x": 250.5959525272653, "y": 797.8751336046105, "id": "608"}, {"x": 167.1961697005472, "y": 475.92076566924845, "id": "609"}, {"x": 973.9538731434088, "y": 653.6423567901452, "id": "610"}, {"x": 929.4581956931714, "y": 128.66176664462037, "id": "611"}, {"x": 500.47039671069274, "y": 244.13162574867863, "id": "612"}, {"x": 845.9176917463024, "y": 456.6752027518415, "id": "613"}, {"x": 995.2345363687273, "y": 789.1982552659957, "id": "614"}, {"x": 413.14297626155627, "y": 375.68298077180526, "id": "615"}, {"x": 751.2062901908018, "y": 294.5405754856137, "id": "616"}, {"x": 672.9239128447017, "y": 7.323159738079399, "id": "617"}, {"x": 594.9041484206311, "y": 288.8790646898459, "id": "618"}, {"x": 224.57037024520943, "y": 638.1219880647341, "id": "619"}, {"x": 876.8013402778329, "y": 264.82776815599385, "id": "620"}, {"x": 860.267384616295, "y": 130.81957764031816, "id": "621"}, {"x": 255.47770710181373, "y": 366.8954903678466, "id": "622"}, {"x": 488.9302386507011, "y": 263.3501018402994, "id": "623"}, {"x": 977.5480023205305, "y": 561.1540143595987, "id": "624"}, {"x": 382.1480035298638, "y": 638.991224005519, "id": "625"}, {"x": 285.0975304281794, "y": 208.99828697930835, "id": "626"}, {"x": 313.99111628457734, "y": 246.19987563033675, "id": "627"}, {"x": 962.6464516198442, "y": 483.0745839988678, "id": "628"}, {"x": 115.09868908025544, "y": 302.68923060304263, "id": "629"}, {"x": 586.3010962104584, "y": 340.71288836156964, "id": "630"}, {"x": 265.7400143559442, "y": 899.7692958128904, "id": "631"}, {"x": 978.8622042929755, "y": 483.7784516598468, "id": "632"}, {"x": 56.87879529563167, "y": 269.24015098992294, "id": "633"}, {"x": 694.903436494859, "y": 0.9664106404667638, "id": "634"}, {"x": 139.14267445868566, "y": 958.0170422742448, "id": "635"}, {"x": 808.4696984179571, "y": 266.5987922887919, "id": "636"}, {"x": 585.4023519170005, "y": 433.85239304042847, "id": "637"}, {"x": 502.70060781696213, "y": 987.261673520171, "id": "638"}, {"x": 512.9041694996666, "y": 800.0031361274156, "id": "639"}, {"x": 789.5873794671105, "y": 30.59085847169396, "id": "640"}, {"x": 323.62061214424745, "y": 256.7029698503258, "id": "641"}, {"x": 794.522393265221, "y": 965.6895246080005, "id": "642"}, {"x": 645.3839281366347, "y": 223.77590321369124, "id": "643"}, {"x": 701.0889251731307, "y": 824.4294837169301, "id": "644"}, {"x": 595.6428742817383, "y": 975.559878478845, "id": "645"}, {"x": 909.5156051428783, "y": 472.04383997109954, "id": "646"}, {"x": 213.93002570459652, "y": 63.553519299995976, "id": "647"}, {"x": 710.0747746436122, "y": 280.99183237172696, "id": "648"}, {"x": 996.8996914410008, "y": 686.8166678798847, "id": "649"}, {"x": 223.82343192583042, "y": 889.3227931063424, "id": "650"}, {"x": 949.5313551830353, "y": 67.73086843218911, "id": "651"}, {"x": 630.0845606796192, "y": 153.41908730406374, "id": "652"}, {"x": 553.7989353240118, "y": 87.53036710695916, "id": "653"}, {"x": 900.7683096192271, "y": 411.4093986601238, "id": "654"}, {"x": 686.4132523166553, "y": 240.8603179610872, "id": "655"}, {"x": 797.4837023028653, "y": 975.585635720745, "id": "656"}, {"x": 946.375827294117, "y": 270.15975285364505, "id": "657"}, {"x": 603.4501171000321, "y": 519.8998487631719, "id": "658"}, {"x": 540.7087691050662, "y": 162.91074457047083, "id": "659"}, {"x": 580.3902519776308, "y": 738.4285488848608, "id": "660"}, {"x": 376.62800609411386, "y": 979.5607036398951, "id": "661"}, {"x": 502.98945578570874, "y": 656.3190682923257, "id": "662"}, {"x": 372.73033901753985, "y": 358.8476189575842, "id": "663"}, {"x": 70.8704303483092, "y": 48.89936641841119, "id": "664"}, {"x": 1.290309817328139, "y": 775.1555449893277, "id": "665"}, {"x": 311.06728009361984, "y": 742.7959500850205, "id": "666"}, {"x": 314.4444304710492, "y": 507.1268437510711, "id": "667"}, {"x": 292.54614809006983, "y": 845.2977732478896, "id": "668"}, {"x": 508.4928080130575, "y": 476.84495528787704, "id": "669"}, {"x": 108.2383439357878, "y": 407.25854440025364, "id": "670"}, {"x": 624.7459799683786, "y": 541.5379790538109, "id": "671"}, {"x": 344.75752283628634, "y": 508.7120632532333, "id": "672"}, {"x": 572.0230640812417, "y": 893.2403924934179, "id": "673"}, {"x": 218.26795318872348, "y": 93.3562307043886, "id": "674"}, {"x": 133.80360386785128, "y": 517.6892222337054, "id": "675"}, {"x": 546.4323700440528, "y": 277.82057485209685, "id": "676"}, {"x": 2.1412178006015026, "y": 200.8127271448844, "id": "677"}, {"x": 225.93287573975306, "y": 153.53323179035084, "id": "678"}, {"x": 629.082344188516, "y": 641.9231891016624, "id": "679"}, {"x": 941.2629756559437, "y": 509.08273642396784, "id": "680"}, {"x": 872.9262381962491, "y": 92.4792746829326, "id": "681"}, {"x": 847.7492123656889, "y": 440.5593414939383, "id": "682"}, {"x": 889.723141549265, "y": 371.52552298359996, "id": "683"}, {"x": 619.2946132649657, "y": 473.0492500477016, "id": "684"}, {"x": 843.8266897848442, "y": 458.59011261570816, "id": "685"}, {"x": 439.416673217767, "y": 317.8825104772017, "id": "686"}, {"x": 289.6981449492054, "y": 953.7175043955503, "id": "687"}, {"x": 433.56849154856616, "y": 723.9002009190797, "id": "688"}, {"x": 539.7132233689139, "y": 102.06965412413693, "id": "689"}, {"x": 124.05267419743015, "y": 184.450064220831, "id": "690"}, {"x": 414.52844780390143, "y": 311.0143239788674, "id": "691"}, {"x": 97.8456037719404, "y": 978.0718530413693, "id": "692"}, {"x": 479.8974290600222, "y": 338.0568854723083, "id": "693"}, {"x": 589.3967840721596, "y": 330.9205943342194, "id": "694"}, {"x": 208.75303937742873, "y": 56.09320666524831, "id": "695"}, {"x": 824.4842909278087, "y": 751.1221002004781, "id": "696"}, {"x": 690.5464900806566, "y": 93.30100595777768, "id": "697"}, {"x": 941.1310861022887, "y": 724.0048813109701, "id": "698"}, {"x": 456.6556479047038, "y": 548.0360284485872, "id": "699"}, {"x": 774.8425588653668, "y": 684.5240610093334, "id": "700"}, {"x": 752.7239837827632, "y": 872.874709428735, "id": "701"}, {"x": 48.28841976950138, "y": 794.6787634256834, "id": "702"}, {"x": 809.0358711486556, "y": 424.20223640463826, "id": "703"}, {"x": 458.9468688752687, "y": 519.3583132493676, "id": "704"}, {"x": 282.5743013480828, "y": 481.8275382715852, "id": "705"}, {"x": 50.65923938329575, "y": 946.0936692934243, "id": "706"}, {"x": 919.039453340704, "y": 336.22288704403115, "id": "707"}, {"x": 446.93547360963817, "y": 330.0071586608009, "id": "708"}, {"x": 775.9259720056183, "y": 48.89770029165608, "id": "709"}, {"x": 742.2182161692206, "y": 398.81257970714836, "id": "710"}, {"x": 808.8968947882958, "y": 369.4922443617119, "id": "711"}, {"x": 275.4440029380927, "y": 300.66296128655404, "id": "712"}, {"x": 928.1631245714599, "y": 115.28509020135746, "id": "713"}, {"x": 645.2479030994916, "y": 61.74209007236298, "id": "714"}, {"x": 575.848897447355, "y": 785.4994654042915, "id": "715"}, {"x": 80.86860657271045, "y": 798.0774895736453, "id": "716"}, {"x": 74.08474024290778, "y": 370.0518160099775, "id": "717"}, {"x": 446.06020087819064, "y": 531.2374288858412, "id": "718"}, {"x": 33.022718633484935, "y": 872.709635677535, "id": "719"}, {"x": 501.6078791282948, "y": 638.40931439051, "id": "720"}, {"x": 14.743025189441038, "y": 619.4864521404168, "id": "721"}, {"x": 805.3810426438412, "y": 783.6631187722426, "id": "722"}, {"x": 739.1544792507782, "y": 540.6285782975157, "id": "723"}, {"x": 523.7218505695633, "y": 622.7988504341054, "id": "724"}, {"x": 846.581636369835, "y": 619.0210517760677, "id": "725"}, {"x": 916.9331325632894, "y": 881.5765895233093, "id": "726"}, {"x": 61.93792886465055, "y": 321.5638704649169, "id": "727"}, {"x": 933.7848767028199, "y": 672.0763762056399, "id": "728"}, {"x": 740.6968599657873, "y": 218.51871510853528, "id": "729"}, {"x": 686.8436804851833, "y": 320.07490357408994, "id": "730"}, {"x": 686.2454736306574, "y": 706.1186658090597, "id": "731"}, {"x": 218.13454250281816, "y": 768.7478381850595, "id": "732"}, {"x": 567.0345310849473, "y": 535.9191724708508, "id": "733"}, {"x": 665.1361522624396, "y": 994.8900028101685, "id": "734"}, {"x": 556.6539492412768, "y": 971.9802863365653, "id": "735"}, {"x": 125.49697283527217, "y": 530.2303380479904, "id": "736"}, {"x": 858.2630906019936, "y": 89.54287262642946, "id": "737"}, {"x": 978.335530720143, "y": 496.56900573266705, "id": "738"}, {"x": 615.6178714529827, "y": 798.5068919368297, "id": "739"}, {"x": 498.7653685047785, "y": 244.84850604160258, "id": "740"}, {"x": 749.1524782941491, "y": 298.49388173110816, "id": "741"}, {"x": 844.6385081408425, "y": 613.6869050385156, "id": "742"}, {"x": 277.3720108941726, "y": 876.8396359029257, "id": "743"}, {"x": 977.1499471105648, "y": 558.0964168953291, "id": "744"}, {"x": 692.8130341994729, "y": 3.978281798957539, "id": "745"}, {"x": 770.8303224960761, "y": 958.6773036228565, "id": "746"}, {"x": 842.8685908774471, "y": 156.40553656925326, "id": "747"}, {"x": 446.8941827794962, "y": 512.2900529917958, "id": "748"}, {"x": 175.36723649279074, "y": 450.60749148879574, "id": "749"}, {"x": 638.3705002651434, "y": 360.2103013296805, "id": "750"}, {"x": 761.0756465640083, "y": 0.9523093504292257, "id": "751"}, {"x": 481.4097991291492, "y": 433.82218661147, "id": "752"}, {"x": 415.79178846865983, "y": 518.6587734263164, "id": "753"}, {"x": 241.07522031779095, "y": 799.6098400035677, "id": "754"}, {"x": 5.462199418674207, "y": 298.8503966085494, "id": "755"}, {"x": 64.44630167644672, "y": 179.53883511163215, "id": "756"}, {"x": 671.0798402570293, "y": 814.3192519838864, "id": "757"}, {"x": 504.2609913142517, "y": 763.6649719468807, "id": "758"}, {"x": 467.5331874949269, "y": 253.96923326450914, "id": "759"}, {"x": 47.88290646707938, "y": 256.39934743475715, "id": "760"}, {"x": 783.5898503461947, "y": 259.5742403570256, "id": "761"}, {"x": 200.5017945555484, "y": 985.2514848701608, "id": "762"}, {"x": 879.1608994431115, "y": 916.4144319949427, "id": "763"}, {"x": 22.241656706830536, "y": 326.06465764309024, "id": "764"}, {"x": 107.58499790713405, "y": 901.6641432300081, "id": "765"}, {"x": 260.11839804753004, "y": 616.3958143067729, "id": "766"}, {"x": 105.242736696328, "y": 579.8612174627091, "id": "767"}, {"x": 656.7759801110609, "y": 355.53271981152193, "id": "768"}, {"x": 256.99125137530723, "y": 622.3799525207253, "id": "769"}, {"x": 956.7564525563527, "y": 595.4591326178494, "id": "770"}, {"x": 343.5148225422534, "y": 588.1967662514514, "id": "771"}, {"x": 800.1044076139721, "y": 199.20108681260862, "id": "772"}, {"x": 661.2919348142569, "y": 311.3400291745643, "id": "773"}, {"x": 562.2484514006458, "y": 919.6546218435321, "id": "774"}, {"x": 561.5859329490296, "y": 778.4592102937512, "id": "775"}, {"x": 827.5255322131209, "y": 371.0217575155146, "id": "776"}, {"x": 932.7519609800466, "y": 230.01227374068168, "id": "777"}, {"x": 973.8840462377622, "y": 974.6646388261669, "id": "778"}, {"x": 910.4800822915672, "y": 519.3946105128806, "id": "779"}, {"x": 733.4974972093119, "y": 500.2627206425667, "id": "780"}, {"x": 400.5566462180411, "y": 589.366497383202, "id": "781"}, {"x": 516.1708581955845, "y": 655.9340638791483, "id": "782"}, {"x": 67.92831541427202, "y": 330.3145976573425, "id": "783"}, {"x": 956.267369594614, "y": 736.4708078343883, "id": "784"}, {"x": 134.28343182986092, "y": 158.69467047796627, "id": "785"}, {"x": 798.2312754492463, "y": 268.0958889042385, "id": "786"}, {"x": 880.8156577943931, "y": 281.07049076269806, "id": "787"}, {"x": 76.50923404684285, "y": 553.1325561514005, "id": "788"}, {"x": 622.0267430560818, "y": 349.5996169898762, "id": "789"}, {"x": 107.05048727313715, "y": 946.2151368497642, "id": "790"}, {"x": 199.3687903686664, "y": 199.12556958439154, "id": "791"}, {"x": 966.5920111460409, "y": 470.81092599855435, "id": "792"}, {"x": 81.81328868459426, "y": 404.7225329755327, "id": "793"}, {"x": 835.6537539284984, "y": 141.4132691142943, "id": "794"}, {"x": 15.420781097352343, "y": 110.17768446483889, "id": "795"}, {"x": 54.39966451618727, "y": 197.96533430037465, "id": "796"}, {"x": 772.0712598007042, "y": 411.6289126712697, "id": "797"}, {"x": 733.349033926253, "y": 515.6038516851122, "id": "798"}, {"x": 554.9043012303198, "y": 402.0246999132987, "id": "799"}, {"x": 334.85822397265207, "y": 732.2304505466898, "id": "800"}, {"x": 969.8237031402937, "y": 262.9309975709114, "id": "801"}, {"x": 702.3750345627176, "y": 0.960603720339237, "id": "802"}, {"x": 609.9008456310654, "y": 603.9122761174605, "id": "803"}, {"x": 109.42575919478293, "y": 661.5477279033183, "id": "804"}, {"x": 711.9342632080148, "y": 100.21174927672149, "id": "805"}, {"x": 66.53192110779294, "y": 457.73409499068373, "id": "806"}, {"x": 385.9885088581533, "y": 816.5031032341019, "id": "807"}, {"x": 119.03107715564832, "y": 465.942750239517, "id": "808"}, {"x": 563.2788941219313, "y": 405.506778645483, "id": "809"}, {"x": 504.05634448259696, "y": 992.2176998497465, "id": "810"}, {"x": 618.6344981567258, "y": 744.2902691847805, "id": "811"}, {"x": 769.0539231989968, "y": 376.6264291235806, "id": "812"}, {"x": 215.02075711197978, "y": 327.94925934458075, "id": "813"}, {"x": 224.29631455103572, "y": 586.3438150411915, "id": "814"}, {"x": 355.60472673992507, "y": 751.4112804727872, "id": "815"}, {"x": 422.597550582716, "y": 71.99155309625316, "id": "816"}, {"x": 399.40148697573653, "y": 476.0410291240301, "id": "817"}, {"x": 625.8163675053974, "y": 847.4632244917443, "id": "818"}, {"x": 98.83047262521605, "y": 47.30346679207598, "id": "819"}, {"x": 165.78409350558522, "y": 434.4673032558517, "id": "820"}, {"x": 448.9656453741635, "y": 115.33383580618273, "id": "821"}, {"x": 932.0817060507809, "y": 179.42710107132487, "id": "822"}, {"x": 534.4147076485408, "y": 77.12683129935849, "id": "823"}, {"x": 306.102691780455, "y": 949.3290053391926, "id": "824"}, {"x": 625.8370684734319, "y": 103.10965338772316, "id": "825"}, {"x": 745.0486117309613, "y": 713.2325265747736, "id": "826"}, {"x": 373.7545926761254, "y": 633.470410605344, "id": "827"}, {"x": 78.7493170305128, "y": 773.1434748249833, "id": "828"}, {"x": 242.50418087145275, "y": 143.86946639396902, "id": "829"}, {"x": 564.2095157479412, "y": 436.3996330645863, "id": "830"}, {"x": 183.33221362546726, "y": 486.7799314246264, "id": "831"}, {"x": 531.6130579989664, "y": 217.8997430801203, "id": "832"}, {"x": 936.5940642956583, "y": 421.5295057352153, "id": "833"}, {"x": 127.17071813944358, "y": 918.9523375954016, "id": "834"}, {"x": 135.16038788727246, "y": 830.7769354682213, "id": "835"}, {"x": 475.8607960090855, "y": 79.54806421469551, "id": "836"}, {"x": 410.6500176917759, "y": 962.0161597675101, "id": "837"}, {"x": 748.9249689039056, "y": 23.25442986569881, "id": "838"}, {"x": 453.1635988361955, "y": 35.74334224779297, "id": "839"}, {"x": 246.14380201476837, "y": 632.8334453624666, "id": "840"}, {"x": 360.08664143179436, "y": 810.2860467307011, "id": "841"}, {"x": 670.5866240837174, "y": 132.63452986175938, "id": "842"}, {"x": 697.4727653648808, "y": 465.26206363769904, "id": "843"}, {"x": 104.9051902799626, "y": 413.4674747912158, "id": "844"}, {"x": 154.01406561059883, "y": 723.3203652472607, "id": "845"}, {"x": 63.003587432598486, "y": 757.5444423545688, "id": "846"}, {"x": 257.3511426581008, "y": 120.10423312701279, "id": "847"}, {"x": 876.6055475828581, "y": 101.58697082535917, "id": "848"}, {"x": 176.19472046844743, "y": 703.4368952470127, "id": "849"}, {"x": 90.43862349141108, "y": 523.1740677858548, "id": "850"}, {"x": 32.383441782997124, "y": 495.29634425009385, "id": "851"}, {"x": 655.2055167943807, "y": 773.7059273645748, "id": "852"}, {"x": 348.28445457351876, "y": 24.52737508597247, "id": "853"}, {"x": 641.4677931489309, "y": 102.93280046833142, "id": "854"}, {"x": 789.6943733620695, "y": 479.4568337304904, "id": "855"}, {"x": 391.0160501305884, "y": 308.9355724929695, "id": "856"}, {"x": 371.452384096433, "y": 831.8577937861746, "id": "857"}, {"x": 885.5419564948753, "y": 506.00141065314017, "id": "858"}, {"x": 355.0217562707243, "y": 285.56274609027344, "id": "859"}, {"x": 862.9898838663387, "y": 473.4429118868786, "id": "860"}, {"x": 975.4180335130201, "y": 812.190418200939, "id": "861"}, {"x": 500.57537253172404, "y": 465.69149360785235, "id": "862"}, {"x": 970.1908167238639, "y": 756.5609985078033, "id": "863"}, {"x": 775.8143856955111, "y": 263.18702702513997, "id": "864"}, {"x": 449.1495380337602, "y": 932.7087226929316, "id": "865"}, {"x": 923.6247428765072, "y": 979.0391529717257, "id": "866"}, {"x": 879.0596426111317, "y": 711.354038600198, "id": "867"}, {"x": 198.00989662201607, "y": 607.6337885715833, "id": "868"}, {"x": 964.9081971025049, "y": 731.0626957833099, "id": "869"}, {"x": 366.3667058424273, "y": 198.8627056729557, "id": "870"}, {"x": 805.7088448801197, "y": 352.6611395053929, "id": "871"}, {"x": 470.1080003591991, "y": 180.81813939369863, "id": "872"}, {"x": 313.3123954303422, "y": 932.2568496665581, "id": "873"}, {"x": 925.719659528262, "y": 795.7177399233686, "id": "874"}, {"x": 758.6186841518904, "y": 127.93800712167436, "id": "875"}, {"x": 425.0420848480303, "y": 245.95048123639495, "id": "876"}, {"x": 562.7894910471958, "y": 601.1922283549997, "id": "877"}, {"x": 822.6970446052217, "y": 639.9527570474798, "id": "878"}, {"x": 146.88327800267388, "y": 663.7548294715192, "id": "879"}, {"x": 918.3771231880809, "y": 821.396287095177, "id": "880"}, {"x": 103.52224409735112, "y": 643.297725177991, "id": "881"}, {"x": 472.51202584516307, "y": 410.05763526341286, "id": "882"}, {"x": 603.8074161445237, "y": 754.6666969375005, "id": "883"}, {"x": 439.6107049359271, "y": 421.56024170935666, "id": "884"}, {"x": 966.0803868650694, "y": 431.6180623242262, "id": "885"}, {"x": 131.0019936972683, "y": 758.9363656547532, "id": "886"}, {"x": 396.2595793299203, "y": 698.3310661917625, "id": "887"}, {"x": 762.283211726103, "y": 748.9492414735435, "id": "888"}, {"x": 634.0381084179618, "y": 653.4263937549708, "id": "889"}, {"x": 610.7110075788274, "y": 91.28578553340971, "id": "890"}, {"x": 793.6204067900636, "y": 484.4113025561697, "id": "891"}, {"x": 994.2360076719192, "y": 300.7171406899003, "id": "892"}, {"x": 534.6582892124057, "y": 23.71171675163186, "id": "893"}, {"x": 778.8938670119887, "y": 672.2092638291911, "id": "894"}, {"x": 215.82308653933814, "y": 612.5476045977749, "id": "895"}, {"x": 350.306080213982, "y": 944.927243377151, "id": "896"}, {"x": 499.6467718881316, "y": 453.9994588863754, "id": "897"}, {"x": 314.59304207778194, "y": 424.3553680398424, "id": "898"}, {"x": 803.9291337803144, "y": 574.4572785192862, "id": "899"}, {"x": 802.1028116133222, "y": 284.63810387819575, "id": "900"}, {"x": 686.4400403692654, "y": 192.1068627183028, "id": "901"}, {"x": 247.3972519128348, "y": 555.4390299848377, "id": "902"}, {"x": 573.9375468682427, "y": 804.5072783649904, "id": "903"}, {"x": 284.63068268293523, "y": 556.7347655154533, "id": "904"}, {"x": 23.31108810259863, "y": 811.9321200787866, "id": "905"}, {"x": 151.8461681244222, "y": 906.4875950633797, "id": "906"}, {"x": 97.7313222521411, "y": 447.7323415295198, "id": "907"}, {"x": 114.37235009199398, "y": 975.5666541697391, "id": "908"}, {"x": 723.6109980176836, "y": 433.3801637618989, "id": "909"}, {"x": 573.5392430296104, "y": 222.03349080425605, "id": "910"}, {"x": 687.1427741463401, "y": 706.2510430656375, "id": "911"}, {"x": 776.6666263773238, "y": 877.2482723704928, "id": "912"}, {"x": 522.8569958571437, "y": 556.3291600309774, "id": "913"}, {"x": 566.59327491839, "y": 151.42830003051134, "id": "914"}, {"x": 674.0517062041504, "y": 376.9636215416219, "id": "915"}, {"x": 855.1139340143764, "y": 554.0597894916685, "id": "916"}, {"x": 5.27804613030336, "y": 975.0713897903601, "id": "917"}, {"x": 291.66822960830183, "y": 963.8526808875893, "id": "918"}, {"x": 547.7783191652532, "y": 876.0812432780559, "id": "919"}, {"x": 2.9970399556500382, "y": 223.4800218633989, "id": "920"}, {"x": 944.689981615856, "y": 721.8725538445773, "id": "921"}, {"x": 596.91862475428, "y": 511.33207842177865, "id": "922"}, {"x": 531.16367205903, "y": 46.7382229123765, "id": "923"}, {"x": 591.483609168352, "y": 229.4311090949519, "id": "924"}, {"x": 912.8605818180372, "y": 8.120044359208546, "id": "925"}, {"x": 715.9093590381902, "y": 90.72432433923106, "id": "926"}, {"x": 48.302905737150795, "y": 496.6340163044223, "id": "927"}, {"x": 802.7826425977606, "y": 370.553542433825, "id": "928"}, {"x": 832.3796891255223, "y": 725.6165091369951, "id": "929"}, {"x": 831.7274579376998, "y": 603.0170971562609, "id": "930"}, {"x": 734.5291599623357, "y": 740.4955032232481, "id": "931"}, {"x": 229.92096644285076, "y": 981.9498115819206, "id": "932"}, {"x": 705.8937581181481, "y": 82.12523170069275, "id": "933"}, {"x": 428.65840548780056, "y": 926.2725968025402, "id": "934"}, {"x": 733.9481196405238, "y": 469.77607443745126, "id": "935"}, {"x": 218.6780601052575, "y": 588.0925495177461, "id": "936"}, {"x": 577.7331359203957, "y": 318.0447974315829, "id": "937"}, {"x": 492.91822554248955, "y": 755.3316912348412, "id": "938"}, {"x": 508.49834507155765, "y": 158.92569890427032, "id": "939"}, {"x": 429.5070032753443, "y": 4.779796859613272, "id": "940"}, {"x": 237.09746325126113, "y": 256.57791920762776, "id": "941"}, {"x": 847.0426117909001, "y": 533.0637031904422, "id": "942"}, {"x": 38.9576279222702, "y": 965.4730282542392, "id": "943"}, {"x": 937.8159504072377, "y": 324.1149398922312, "id": "944"}, {"x": 680.4214405887705, "y": 321.67383064849685, "id": "945"}, {"x": 288.5025608061601, "y": 376.1470476339555, "id": "946"}, {"x": 285.89941747026637, "y": 213.52643365942924, "id": "947"}, {"x": 882.2039211295445, "y": 869.1957915149703, "id": "948"}, {"x": 955.9210057039828, "y": 160.92235241458542, "id": "949"}, {"x": 700.3881361178597, "y": 720.7611963443309, "id": "950"}, {"x": 261.38495930557946, "y": 730.2671065199202, "id": "951"}, {"x": 404.09380117596015, "y": 958.1126735829656, "id": "952"}, {"x": 130.72062492427105, "y": 126.42643023607936, "id": "953"}, {"x": 137.68759233112314, "y": 454.25875458441976, "id": "954"}, {"x": 981.9018162001914, "y": 209.70303936763446, "id": "955"}, {"x": 687.776052416196, "y": 187.0025045598016, "id": "956"}, {"x": 822.9959773836548, "y": 8.648022441139492, "id": "957"}, {"x": 298.5760969545974, "y": 567.7118787662215, "id": "958"}, {"x": 103.26738776544953, "y": 451.0475590741686, "id": "959"}, {"x": 722.4260187239132, "y": 22.287966986095697, "id": "960"}, {"x": 664.624128005972, "y": 974.6349026147038, "id": "961"}, {"x": 529.8020776438076, "y": 661.1936467808708, "id": "962"}, {"x": 520.2994622200566, "y": 498.5691635866941, "id": "963"}, {"x": 574.5760361930734, "y": 837.8226483876682, "id": "964"}, {"x": 424.9605959222898, "y": 502.134504320649, "id": "965"}, {"x": 157.17982788313068, "y": 492.00834852222044, "id": "966"}, {"x": 543.038885200126, "y": 320.5895552895411, "id": "967"}, {"x": 695.1842695621431, "y": 731.3129088354902, "id": "968"}, {"x": 571.9127481128415, "y": 651.1402694239638, "id": "969"}, {"x": 9.332876035698657, "y": 184.85604535880873, "id": "970"}, {"x": 807.3774179197601, "y": 48.34057654211055, "id": "971"}, {"x": 251.8583474154663, "y": 789.8923218268485, "id": "972"}, {"x": 245.84132881994148, "y": 736.9583356194114, "id": "973"}, {"x": 330.5379866978145, "y": 439.59985483926414, "id": "974"}, {"x": 557.756732093532, "y": 414.4462459079148, "id": "975"}, {"x": 835.8778105637535, "y": 125.00695201728529, "id": "976"}, {"x": 662.4314974027095, "y": 55.34328991143755, "id": "977"}, {"x": 495.22069713851135, "y": 797.5558748239525, "id": "978"}, {"x": 238.50658056818287, "y": 660.0681196136301, "id": "979"}, {"x": 328.9978341691694, "y": 16.6399036869066, "id": "980"}, {"x": 890.8068328383316, "y": 20.799974947180445, "id": "981"}, {"x": 873.4611699164157, "y": 703.7958898375543, "id": "982"}, {"x": 722.853836549192, "y": 50.456237475063894, "id": "983"}, {"x": 49.30548915501065, "y": 229.66442580317502, "id": "984"}, {"x": 301.59186809314195, "y": 389.59392428762254, "id": "985"}, {"x": 588.6760915806683, "y": 805.171116868913, "id": "986"}, {"x": 406.81159291797775, "y": 52.62656865366955, "id": "987"}, {"x": 640.1972360121224, "y": 956.8267858076046, "id": "988"}, {"x": 93.18253691457356, "y": 769.7116649748536, "id": "989"}, {"x": 288.8171394497897, "y": 788.9941437070012, "id": "990"}, {"x": 966.8186212466834, "y": 881.425915518964, "id": "991"}, {"x": 333.38235349610056, "y": 768.3805813489076, "id": "992"}, {"x": 259.70220257353736, "y": 18.59916178697929, "id": "993"}, {"x": 737.4048793625267, "y": 575.7771718486586, "id": "994"}, {"x": 542.3084949619541, "y": 594.7070104706975, "id": "995"}, {"x": 932.1944556232315, "y": 516.8426056706535, "id": "996"}, {"x": 305.1293667908883, "y": 967.060681900689, "id": "997"}, {"x": 358.00743963099535, "y": 889.9944593145669, "id": "998"}, {"x": 979.1451071142517, "y": 637.6175571033416, "id": "999"}], "links": [{"source": "0", "target": "1"}, {"source": "2", "target": "3"}, {"source": "4", "target": "5"}, {"source": "6", "target": "7"}, {"source": "8", "target": "9"}, {"source": "10", "target": "11"}, {"source": "12", "target": "13"}, {"source": "14", "target": "15"}, {"source": "16", "target": "17"}, {"source": "18", "target": "19"}, {"source": "20", "target": "21"}, {"source": "22", "target": "23"}, {"source": "24", "target": "25"}, {"source": "26", "target": "27"}, {"source": "28", "target": "29"}, {"source": "30", "target": "31"}, {"source": "32", "target": "33"}, {"source": "34", "target": "35"}, {"source": "36", "target": "37"}, {"source": "38", "target": "39"}, {"source": "40", "target": "41"}, {"source": "42", "target": "43"}, {"source": "44", "target": "45"}, {"source": "46", "target": "47"}, {"source": "48", "target": "49"}, {"source": "50", "target": "51"}, {"source": "52", "target": "53"}, {"source": "54", "target": "55"}, {"source": "56", "target": "57"}, {"source": "58", "target": "59"}, {"source": "60", "target": "61"}, {"source": "62", "target": "63"}, {"source": "64", "target": "65"}, {"source": "66", "target": "67"}, {"source": "68", "target": "69"}, {"source": "70", "target": "71"}, {"source": "72", "target": "73"}, {"source": "74", "target": "75"}, {"source": "76", "target": "77"}, {"source": "78", "target": "79"}, {"source": "80", "target": "81"}, {"source": "82", "target": "83"}, {"source": "84", "target": "85"}, {"source": "86", "target": "87"}, {"source": "88", "target": "89"}, {"source": "90", "target": "91"}, {"source": "92", "target": "93"}, {"source": "94", "target": "95"}, {"source": "96", "target": "97"}, {"source": "98", "target": "99"}, {"source": "100", "target": "101"}, {"source": "102", "target": "103"}, {"source": "104", "target": "105"}, {"source": "106", "target": "107"}, {"source": "108", "target": "109"}, {"source": "110", "target": "111"}, {"source": "112", "target": "113"}, {"source": "114", "target": "115"}, {"source": "116", "target": "117"}, {"source": "118", "target": "119"}, {"source": "120", "target": "121"}, {"source": "122", "target": "123"}, {"source": "124", "target": "125"}, {"source": "126", "target": "127"}, {"source": "128", "target": "129"}, {"source": "130", "target": "131"}, {"source": "132", "target": "133"}, {"source": "134", "target": "135"}, {"source": "136", "target": "137"}, {"source": "138", "target": "139"}, {"source": "140", "target": "141"}, {"source": "142", "target": "143"}, {"source": "144", "target": "145"}, {"source": "146", "target": "147"}, {"source": "148", "target": "149"}, {"source": "150", "target": "151"}, {"source": "152", "target": "153"}, {"source": "154", "target": "155"}, {"source": "156", "target": "157"}, {"source": "158", "target": "159"}, {"source": "160", "target": "161"}, {"source": "162", "target": "163"}, {"source": "164", "target": "165"}, {"source": "166", "target": "167"}, {"source": "168", "target": "169"}, {"source": "170", "target": "171"}, {"source": "172", "target": "173"}, {"source": "174", "target": "175"}, {"source": "176", "target": "177"}, {"source": "178", "target": "179"}, {"source": "180", "target": "181"}, {"source": "182", "target": "183"}, {"source": "184", "target": "185"}, {"source": "186", "target": "187"}, {"source": "188", "target": "189"}, {"source": "190", "target": "191"}, {"source": "192", "target": "193"}, {"source": "194", "target": "195"}, {"source": "196", "target": "197"}, {"source": "198", "target": "199"}, {"source": "200", "target": "201"}, {"source": "202", "target": "203"}, {"source": "204", "target": "205"}, {"source": "206", "target": "207"}, {"source": "208", "target": "209"}, {"source": "210", "target": "211"}, {"source": "212", "target": "213"}, {"source": "214", "target": "215"}, {"source": "216", "target": "217"}, {"source": "218", "target": "219"}, {"source": "220", "target": "221"}, {"source": "222", "target": "223"}, {"source": "224", "target": "225"}, {"source": "226", "target": "227"}, {"source": "228", "target": "229"}, {"source": "230", "target": "231"}, {"source": "232", "target": "233"}, {"source": "234", "target": "235"}, {"source": "236", "target": "237"}, {"source": "238", "target": "239"}, {"source": "240", "target": "241"}, {"source": "242", "target": "243"}, {"source": "244", "target": "245"}, {"source": "246", "target": "247"}, {"source": "248", "target": "249"}, {"source": "250", "target": "251"}, {"source": "252", "target": "253"}, {"source": "254", "target": "255"}, {"source": "256", "target": "257"}, {"source": "258", "target": "259"}, {"source": "260", "target": "261"}, {"source": "262", "target": "263"}, {"source": "264", "target": "265"}, {"source": "266", "target": "267"}, {"source": "268", "target": "269"}, {"source": "270", "target": "271"}, {"source": "272", "target": "273"}, {"source": "274", "target": "275"}, {"source": "276", "target": "277"}, {"source": "278", "target": "279"}, {"source": "280", "target": "281"}, {"source": "282", "target": "283"}, {"source": "284", "target": "285"}, {"source": "286", "target": "287"}, {"source": "288", "target": "289"}, {"source": "290", "target": "291"}, {"source": "292", "target": "293"}, {"source": "294", "target": "295"}, {"source": "296", "target": "297"}, {"source": "298", "target": "299"}, {"source": "300", "target": "301"}, {"source": "302", "target": "303"}, {"source": "304", "target": "305"}, {"source": "306", "target": "307"}, {"source": "308", "target": "309"}, {"source": "310", "target": "311"}, {"source": "312", "target": "313"}, {"source": "314", "target": "315"}, {"source": "316", "target": "317"}, {"source": "318", "target": "319"}, {"source": "320", "target": "321"}, {"source": "322", "target": "323"}, {"source": "324", "target": "325"}, {"source": "326", "target": "327"}, {"source": "328", "target": "329"}, {"source": "330", "target": "331"}, {"source": "332", "target": "333"}, {"source": "334", "target": "335"}, {"source": "336", "target": "337"}, {"source": "338", "target": "339"}, {"source": "340", "target": "341"}, {"source": "342", "target": "343"}, {"source": "344", "target": "345"}, {"source": "346", "target": "347"}, {"source": "348", "target": "349"}, {"source": "350", "target": "351"}, {"source": "352", "target": "353"}, {"source": "354", "target": "355"}, {"source": "356", "target": "357"}, {"source": "358", "target": "359"}, {"source": "360", "target": "361"}, {"source": "362", "target": "363"}, {"source": "364", "target": "365"}, {"source": "366", "target": "367"}, {"source": "368", "target": "369"}, {"source": "370", "target": "371"}, {"source": "372", "target": "373"}, {"source": "374", "target": "375"}, {"source": "376", "target": "377"}, {"source": "378", "target": "379"}, {"source": "380", "target": "381"}, {"source": "382", "target": "383"}, {"source": "384", "target": "385"}, {"source": "386", "target": "387"}, {"source": "388", "target": "389"}, {"source": "390", "target": "391"}, {"source": "392", "target": "393"}, {"source": "394", "target": "395"}, {"source": "396", "target": "397"}, {"source": "398", "target": "399"}, {"source": "400", "target": "401"}, {"source": "402", "target": "403"}, {"source": "404", "target": "405"}, {"source": "406", "target": "407"}, {"source": "408", "target": "409"}, {"source": "410", "target": "411"}, {"source": "412", "target": "413"}, {"source": "414", "target": "415"}, {"source": "416", "target": "417"}, {"source": "418", "target": "419"}, {"source": "420", "target": "421"}, {"source": "422", "target": "423"}, {"source": "424", "target": "425"}, {"source": "426", "target": "427"}, {"source": "428", "target": "429"}, {"source": "430", "target": "431"}, {"source": "432", "target": "433"}, {"source": "434", "target": "435"}, {"source": "436", "target": "437"}, {"source": "438", "target": "439"}, {"source": "440", "target": "441"}, {"source": "442", "target": "443"}, {"source": "444", "target": "445"}, {"source": "446", "target": "447"}, {"source": "448", "target": "449"}, {"source": "450", "target": "451"}, {"source": "452", "target": "453"}, {"source": "454", "target": "455"}, {"source": "456", "target": "457"}, {"source": "458", "target": "459"}, {"source": "460", "target": "461"}, {"source": "462", "target": "463"}, {"source": "464", "target": "465"}, {"source": "466", "target": "467"}, {"source": "468", "target": "469"}, {"source": "470", "target": "471"}, {"source": "472", "target": "473"}, {"source": "474", "target": "475"}, {"source": "476", "target": "477"}, {"source": "478", "target": "479"}, {"source": "480", "target": "481"}, {"source": "482", "target": "483"}, {"source": "484", "target": "485"}, {"source": "486", "target": "487"}, {"source": "488", "target": "489"}, {"source": "490", "target": "491"}, {"source": "492", "target": "493"}, {"source": "494", "target": "495"}, {"source": "496", "target": "497"}, {"source": "498", "target": "499"}, {"source": "500", "target": "501"}, {"source": "502", "target": "503"}, {"source": "504", "target": "505"}, {"source": "506", "target": "507"}, {"source": "508", "target": "509"}, {"source": "510", "target": "511"}, {"source": "512", "target": "513"}, {"source": "514", "target": "515"}, {"source": "516", "target": "517"}, {"source": "518", "target": "519"}, {"source": "520", "target": "521"}, {"source": "522", "target": "523"}, {"source": "524", "target": "525"}, {"source": "526", "target": "527"}, {"source": "528", "target": "529"}, {"source": "530", "target": "531"}, {"source": "532", "target": "533"}, {"source": "534", "target": "535"}, {"source": "536", "target": "537"}, {"source": "538", "target": "539"}, {"source": "540", "target": "541"}, {"source": "542", "target": "543"}, {"source": "544", "target": "545"}, {"source": "546", "target": "547"}, {"source": "548", "target": "549"}, {"source": "550", "target": "551"}, {"source": "552", "target": "553"}, {"source": "554", "target": "555"}, {"source": "556", "target": "557"}, {"source": "558", "target": "559"}, {"source": "560", "target": "561"}, {"source": "562", "target": "563"}, {"source": "564", "target": "565"}, {"source": "566", "target": "567"}, {"source": "568", "target": "569"}, {"source": "570", "target": "571"}, {"source": "572", "target": "573"}, {"source": "574", "target": "575"}, {"source": "576", "target": "577"}, {"source": "578", "target": "579"}, {"source": "580", "target": "581"}, {"source": "582", "target": "583"}, {"source": "584", "target": "585"}, {"source": "586", "target": "587"}, {"source": "588", "target": "589"}, {"source": "590", "target": "591"}, {"source": "592", "target": "593"}, {"source": "594", "target": "595"}, {"source": "596", "target": "597"}, {"source": "598", "target": "599"}, {"source": "600", "target": "601"}, {"source": "602", "target": "603"}, {"source": "604", "target": "605"}, {"source": "606", "target": "607"}, {"source": "608", "target": "609"}, {"source": "610", "target": "611"}, {"source": "612", "target": "613"}, {"source": "614", "target": "615"}, {"source": "616", "target": "617"}, {"source": "618", "target": "619"}, {"source": "620", "target": "621"}, {"source": "622", "target": "623"}, {"source": "624", "target": "625"}, {"source": "626", "target": "627"}, {"source": "628", "target": "629"}, {"source": "630", "target": "631"}, {"source": "632", "target": "633"}, {"source": "634", "target": "635"}, {"source": "636", "target": "637"}, {"source": "638", "target": "639"}, {"source": "640", "target": "641"}, {"source": "642", "target": "643"}, {"source": "644", "target": "645"}, {"source": "646", "target": "647"}, {"source": "648", "target": "649"}, {"source": "650", "target": "651"}, {"source": "652", "target": "653"}, {"source": "654", "target": "655"}, {"source": "656", "target": "657"}, {"source": "658", "target": "659"}, {"source": "660", "target": "661"}, {"source": "662", "target": "663"}, {"source": "664", "target": "665"}, {"source": "666", "target": "667"}, {"source": "668", "target": "669"}, {"source": "670", "target": "671"}, {"source": "672", "target": "673"}, {"source": "674", "target": "675"}, {"source": "676", "target": "677"}, {"source": "678", "target": "679"}, {"source": "680", "target": "681"}, {"source": "682", "target": "683"}, {"source": "684", "target": "685"}, {"source": "686", "target": "687"}, {"source": "688", "target": "689"}, {"source": "690", "target": "691"}, {"source": "692", "target": "693"}, {"source": "694", "target": "695"}, {"source": "696", "target": "697"}, {"source": "698", "target": "699"}, {"source": "700", "target": "701"}, {"source": "702", "target": "703"}, {"source": "704", "target": "705"}, {"source": "706", "target": "707"}, {"source": "708", "target": "709"}, {"source": "710", "target": "711"}, {"source": "712", "target": "713"}, {"source": "714", "target": "715"}, {"source": "716", "target": "717"}, {"source": "718", "target": "719"}, {"source": "720", "target": "721"}, {"source": "722", "target": "723"}, {"source": "724", "target": "725"}, {"source": "726", "target": "727"}, {"source": "728", "target": "729"}, {"source": "730", "target": "731"}, {"source": "732", "target": "733"}, {"source": "734", "target": "735"}, {"source": "736", "target": "737"}, {"source": "738", "target": "739"}, {"source": "740", "target": "741"}, {"source": "742", "target": "743"}, {"source": "744", "target": "745"}, {"source": "746", "target": "747"}, {"source": "748", "target": "749"}, {"source": "750", "target": "751"}, {"source": "752", "target": "753"}, {"source": "754", "target": "755"}, {"source": "756", "target": "757"}, {"source": "758", "target": "759"}, {"source": "760", "target": "761"}, {"source": "762", "target": "763"}, {"source": "764", "target": "765"}, {"source": "766", "target": "767"}, {"source": "768", "target": "769"}, {"source": "770", "target": "771"}, {"source": "772", "target": "773"}, {"source": "774", "target": "775"}, {"source": "776", "target": "777"}, {"source": "778", "target": "779"}, {"source": "780", "target": "781"}, {"source": "782", "target": "783"}, {"source": "784", "target": "785"}, {"source": "786", "target": "787"}, {"source": "788", "target": "789"}, {"source": "790", "target": "791"}, {"source": "792", "target": "793"}, {"source": "794", "target": "795"}, {"source": "796", "target": "797"}, {"source": "798", "target": "799"}, {"source": "800", "target": "801"}, {"source": "802", "target": "803"}, {"source": "804", "target": "805"}, {"source": "806", "target": "807"}, {"source": "808", "target": "809"}, {"source": "810", "target": "811"}, {"source": "812", "target": "813"}, {"source": "814", "target": "815"}, {"source": "816", "target": "817"}, {"source": "818", "target": "819"}, {"source": "820", "target": "821"}, {"source": "822", "target": "823"}, {"source": "824", "target": "825"}, {"source": "826", "target": "827"}, {"source": "828", "target": "829"}, {"source": "830", "target": "831"}, {"source": "832", "target": "833"}, {"source": "834", "target": "835"}, {"source": "836", "target": "837"}, {"source": "838", "target": "839"}, {"source": "840", "target": "841"}, {"source": "842", "target": "843"}, {"source": "844", "target": "845"}, {"source": "846", "target": "847"}, {"source": "848", "target": "849"}, {"source": "850", "target": "851"}, {"source": "852", "target": "853"}, {"source": "854", "target": "855"}, {"source": "856", "target": "857"}, {"source": "858", "target": "859"}, {"source": "860", "target": "861"}, {"source": "862", "target": "863"}, {"source": "864", "target": "865"}, {"source": "866", "target": "867"}, {"source": "868", "target": "869"}, {"source": "870", "target": "871"}, {"source": "872", "target": "873"}, {"source": "874", "target": "875"}, {"source": "876", "target": "877"}, {"source": "878", "target": "879"}, {"source": "880", "target": "881"}, {"source": "882", "target": "883"}, {"source": "884", "target": "885"}, {"source": "886", "target": "887"}, {"source": "888", "target": "889"}, {"source": "890", "target": "891"}, {"source": "892", "target": "893"}, {"source": "894", "target": "895"}, {"source": "896", "target": "897"}, {"source": "898", "target": "899"}, {"source": "900", "target": "901"}, {"source": "902", "target": "903"}, {"source": "904", "target": "905"}, {"source": "906", "target": "907"}, {"source": "908", "target": "909"}, {"source": "910", "target": "911"}, {"source": "912", "target": "913"}, {"source": "914", "target": "915"}, {"source": "916", "target": "917"}, {"source": "918", "target": "919"}, {"source": "920", "target": "921"}, {"source": "922", "target": "923"}, {"source": "924", "target": "925"}, {"source": "926", "target": "927"}, {"source": "928", "target": "929"}, {"source": "930", "target": "931"}, {"source": "932", "target": "933"}, {"source": "934", "target": "935"}, {"source": "936", "target": "937"}, {"source": "938", "target": "939"}, {"source": "940", "target": "941"}, {"source": "942", "target": "943"}, {"source": "944", "target": "945"}, {"source": "946", "target": "947"}, {"source": "948", "target": "949"}, {"source": "950", "target": "951"}, {"source": "952", "target": "953"}, {"source": "954", "target": "955"}, {"source": "956", "target": "957"}, {"source": "958", "target": "959"}, {"source": "960", "target": "961"}, {"source": "962", "target": "963"}, {"source": "964", "target": "965"}, {"source": "966", "target": "967"}, {"source": "968", "target": "969"}, {"source": "970", "target": "971"}, {"source": "972", "target": "973"}, {"source": "974", "target": "975"}, {"source": "976", "target": "977"}, {"source": "978", "target": "979"}, {"source": "980", "target": "981"}, {"source": "982", "target": "983"}, {"source": "984", "target": "985"}, {"source": "986", "target": "987"}, {"source": "988", "target": "989"}, {"source": "990", "target": "991"}, {"source": "992", "target": "993"}, {"source": "994", "target": "995"}, {"source": "996", "target": "997"}, {"source": "998", "target": "999"}]} --------------------------------------------------------------------------------