You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@qpid.apache.org by ea...@apache.org on 2018/11/01 19:25:03 UTC

[1/3] qpid-dispatch git commit: DISPATCH-1161 Handle edge routers in console

Repository: qpid-dispatch
Updated Branches:
  refs/heads/master 0d6dbac78 -> 3d79fda11


http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/3d79fda1/console/stand-alone/plugin/html/qdrTopology.html
----------------------------------------------------------------------
diff --git a/console/stand-alone/plugin/html/qdrTopology.html b/console/stand-alone/plugin/html/qdrTopology.html
index b99e2ef..c94eb81 100644
--- a/console/stand-alone/plugin/html/qdrTopology.html
+++ b/console/stand-alone/plugin/html/qdrTopology.html
@@ -196,6 +196,39 @@ table.popupTable tr.header {
 table.popupTable td {
     padding: 0 4px;
 }
+
+.graticule {
+  fill: none;
+  stroke: #777;
+  stroke-width: .5px;
+  stroke-opacity: .5;
+}
+
+g.geo path.land {
+  fill: #dcedf7;
+  stroke: #000;
+  stroke-opacity: 1;
+  stroke-width: 1px;
+}
+
+.boundary {
+  fill: none;
+  stroke: #333;
+  stroke-width: 5px;
+}
+
+.panel-group {
+    margin-bottom: 0;
+}
+
+span.map-label {
+    display: inline-block;
+    width: 4em;
+}
+#main_container {
+     padding-left: 0;
+     padding-right: 0;
+}
 </style>
 <div class="qdrTopology" ng-controller="QDR.TopologyController">
     <div class="legend-container page-menu navbar-collapse collapse">
@@ -251,6 +284,20 @@ table.popupTable td {
             <div uib-accordion-group class="panel-default" is-open="legend.status.legendOpen" heading="Legend">
                 <div id="topo_svg_legend"></div>
             </div>
+            <div uib-accordion-group class="panel-default" is-open="legend.status.mapOpen" heading="Background map">
+                <div id="topo_mapOptions">
+                    <div class="colorPicker">
+                        <ul>
+                            <li>
+                                <label><span class='map-label'>Land</span> <input id="areaColor" name="areaColor" type="color" ng-model="mapOptions.areaColor"/></label>
+                            </li>
+                            <li>
+                                <label><span class='map-label'>Ocean</span> <input id="oceanColor" name="oceanColor" type="color" ng-model="mapOptions.oceanColor"/></label>
+                            </li>
+                        </ul>
+                    </div>
+                </div>
+            </div>
           </uib-accordion>
     </div>
     <div class="diagram">

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/3d79fda1/console/stand-alone/plugin/js/amqp/connection.js
----------------------------------------------------------------------
diff --git a/console/stand-alone/plugin/js/amqp/connection.js b/console/stand-alone/plugin/js/amqp/connection.js
index db21e01..b1eee5a 100644
--- a/console/stand-alone/plugin/js/amqp/connection.js
+++ b/console/stand-alone/plugin/js/amqp/connection.js
@@ -271,8 +271,9 @@ class ConnectionManager {
       this.connection = rhea.connect(c);
     }).bind(this));
   }
-  sendMgmtQuery(operation) {
-    return this.send([], '/$management', operation);
+  sendMgmtQuery(operation, to) {
+    to = to || '/$management';
+    return this.send([], to, operation);
   }
   sendQuery(toAddr, entity, attrs, operation) {
     operation = operation || 'QUERY';

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/3d79fda1/console/stand-alone/plugin/js/amqp/topology.js
----------------------------------------------------------------------
diff --git a/console/stand-alone/plugin/js/amqp/topology.js b/console/stand-alone/plugin/js/amqp/topology.js
index e208a6f..6e806c9 100644
--- a/console/stand-alone/plugin/js/amqp/topology.js
+++ b/console/stand-alone/plugin/js/amqp/topology.js
@@ -74,48 +74,104 @@ class Topology {
   get() {
     return new Promise((function (resolve, reject) {
       this.connection.sendMgmtQuery('GET-MGMT-NODES')
-        .then((function (response) {
-          response = response.response;
+        .then((function (results) {
+          let response = results.response;
           if (Object.prototype.toString.call(response) === '[object Array]') {
-            var workInfo = {};
             // if there is only one node, it will not be returned
             if (response.length === 0) {
               var parts = this.connection.getReceiverAddress().split('/');
               parts[parts.length - 1] = '$management';
               response.push(parts.join('/'));
             }
-            for (var i = 0; i < response.length; ++i) {
-              workInfo[response[i]] = {};
-            }
-            var gotResponse = function (nodeName, entity, response) {
-              workInfo[nodeName][entity] = response;
+            let finish = function (workInfo) {
+              this._nodeInfo = utils.copy(workInfo);
+              this.onDone(this._nodeInfo);
+              resolve(this._nodeInfo);
             };
-            var q = d3.queue(this.connection.availableQeueuDepth());
-            for (var id in workInfo) {
-              for (var entity in this.entityAttribs) {
-                q.defer((this.q_fetchNodeInfo).bind(this), id, entity, this.entityAttribs[entity], q, gotResponse);
-              }
-            }
-            q.await((function () {
-              // filter out nodes that have no connection info
-              if (this.filtering) {
-                for (var id in workInfo) {
-                  if (!(workInfo[id].connection)) {
-                    this.flux = true;
-                    delete workInfo[id];
+            let connectedToEdge = function (response, workInfo) {
+              let routerId = null;
+              if (response.length === 1) {
+                let parts = response[0].split('/');
+                // we are connected to an edge router
+                if (parts[1] === '_edge') {
+                  // find the role:edge connection
+                  let conn = workInfo[response[0]].connection;
+                  if (conn) {
+                    let roleIndex = conn.attributeNames.indexOf('role');
+                    for (let i=0; i<conn.results.length; i++) {
+                      if (conn.results[i][roleIndex] === 'edge') {
+                        let container = utils.valFor(conn.attributeNames, conn.results[i], 'container');
+                        return utils.idFromName(container, '_topo');
+                      }
+                    }
                   }
                 }
               }
-              this._nodeInfo = utils.copy(workInfo);
-              this.onDone(this._nodeInfo);
-              resolve(this._nodeInfo);
-            }).bind(this));
+              return routerId;
+            };
+            this.doget(response)
+              .then( function (workInfo) {
+                // test for edge case
+                let routerId = connectedToEdge(response, workInfo);
+                if (routerId) {
+                  let edgeId = response[0];
+                  this.connection.sendMgmtQuery('GET-MGMT-NODES', routerId)
+                    .then((function (results) {
+                      let response = results.response;
+                      if (Object.prototype.toString.call(response) === '[object Array]') {
+                        // special case of edge case:
+                        // we are connected to an edge router that is connected to
+                        // a router that is not connected to any other interior routers
+                        if (response.length === 0) {
+                          response = [routerId];
+                        }
+                        this.doget(response)
+                          .then( function (workInfo) {
+                            finish.call(this, workInfo);
+                          }.bind(this));
+
+                      }
+                    }).bind(this));
+                } else {
+                  finish.call(this, workInfo);
+                }
+              }.bind(this));
           }
         }).bind(this), function (error) {
           reject(error);
         });
     }).bind(this));
   }
+  doget(ids) {
+    return new Promise((function (resolve) {
+      let workInfo = {};
+      for (var i = 0; i < ids.length; ++i) {
+        workInfo[ids[i]] = {};
+      }
+      var gotResponse = function (nodeName, entity, response) {
+        workInfo[nodeName][entity] = response;
+      };
+      var q = d3.queue(this.connection.availableQeueuDepth());
+      for (var id in workInfo) {
+        for (var entity in this.entityAttribs) {
+          q.defer((this.q_fetchNodeInfo).bind(this), id, entity, this.entityAttribs[entity], q, gotResponse);
+        }
+      }
+      q.await((function () {
+        // filter out nodes that have no connection info
+        if (this.filtering) {
+          for (var id in workInfo) {
+            if (!(workInfo[id].connection)) {
+              this.flux = true;
+              delete workInfo[id];
+            }
+          }
+        }
+        resolve(workInfo);
+      }).bind(this));
+    }).bind(this));
+  }
+
   onDone(result) {
     clearTimeout(this._getTimer);
     if (this.updating)

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/3d79fda1/console/stand-alone/plugin/js/amqp/utilities.js
----------------------------------------------------------------------
diff --git a/console/stand-alone/plugin/js/amqp/utilities.js b/console/stand-alone/plugin/js/amqp/utilities.js
index 7b10c57..c94b498 100644
--- a/console/stand-alone/plugin/js/amqp/utilities.js
+++ b/console/stand-alone/plugin/js/amqp/utilities.js
@@ -103,13 +103,22 @@ var utils = {
   },
   // extract the name of the router from the router id
   nameFromId: function (id) {
-    // the router id looks like 'amqp:/topo/0/routerName/$management'
+    // the router id looks like 'amqp:/_topo/0/routerName/$management'
     var parts = id.split('/');
     // handle cases where the router name contains a /
-    parts.splice(0, 3); // remove amqp, topo, 0
+    parts.splice(0, parts.length - 2); // remove amqp, _topo, 0
     parts.pop(); // remove $management
     return parts.join('/');
   },
+
+  // construct a router id given a router name and type (_topo or _edge)
+  idFromName: function (name, type) {
+    let parts = ['amqp:', type, name, '$management'];
+    if (type === '_topo')
+      parts.splice(2, 0, '0');
+    return parts.join('/');
+  },
+
   // calculate the average rate of change per second for a list of fields on the given obj
   // store the historical raw values in storage[key] for future rate calcs
   // keep 'history' number of historical values

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/3d79fda1/console/stand-alone/plugin/js/chord/data.js
----------------------------------------------------------------------
diff --git a/console/stand-alone/plugin/js/chord/data.js b/console/stand-alone/plugin/js/chord/data.js
index d9625aa..6116436 100644
--- a/console/stand-alone/plugin/js/chord/data.js
+++ b/console/stand-alone/plugin/js/chord/data.js
@@ -114,7 +114,7 @@ class ChordData { // eslint-disable-line no-unused-vars
             if (link.linkType === 'endpoint' && link.linkDir === 'out' && !link.owningAddr.startsWith('Ltemp.')) {
               // keep track of the raw egress values as well as their ingress and egress routers and the address
               for (let j = 0; j < ingressRouters.length; j++) {
-                let messages = link.ingressHistogram[j];
+                let messages = link.ingressHistogram ? link.ingressHistogram[j] : 0;
                 if (messages) {
                   values.push({
                     ingress: ingressRouters[j],

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/3d79fda1/console/stand-alone/plugin/js/topology/links.js
----------------------------------------------------------------------
diff --git a/console/stand-alone/plugin/js/topology/links.js b/console/stand-alone/plugin/js/topology/links.js
index d7f4110..dd722bb 100644
--- a/console/stand-alone/plugin/js/topology/links.js
+++ b/console/stand-alone/plugin/js/topology/links.js
@@ -79,6 +79,8 @@ export class Links {
     let source = 0;
     let client = 1.0;
     for (let id in nodeInfo) {
+      let parts = id.split('/');
+      let routerType = parts[1]; // _topo || _edge
       let onode = nodeInfo[id];
       if (!onode['connection'])
         continue;
@@ -93,81 +95,85 @@ export class Links {
         let properties = connection.properties || {};
         let dir = connection.dir;
         if (role == 'inter-router') {
+          // there are already 2 router nodes, just link them
           let connId = connection.container;
           let target = getContainerIndex(connId, nodeInfo, this.QDRService);
           if (target >= 0) {
             this.getLink(source, target, dir, '', source + '-' + target);
           }
-        } /* else if (role == "normal" || role == "on-demand" || role === "route-container")*/ {
-          // not an connection between routers, but an external connection
-          let name = this.QDRService.utilities.nameFromId(id) + '.' + connection.identity;
+        }
+        // handle external connections
+        let name = this.QDRService.utilities.nameFromId(id) + '.' + connection.identity;
+        // is this connection for a router connected to an edge router
+        if (role == 'edge' && routerType === '_edge') {
+          name = connection.container;
+          role = 'inter-router';
+        }
 
-          // if we have any new clients, animate the force graph to position them
-          let position = localStorage[name] ? JSON.parse(localStorage[name]) : undefined;
-          if ((typeof position == 'undefined')) {
-            animate = true;
-            position = {
-              x: Math.round(nodes.get(source).x + 40 * Math.sin(client / (Math.PI * 2.0))),
-              y: Math.round(nodes.get(source).y + 40 * Math.cos(client / (Math.PI * 2.0))),
-              fixed: false
-            };
-            //QDRLog.debug("new client pos (" + position.x + ", " + position.y + ")")
-          }// else QDRLog.debug("using previous location")
-          if (position.y > height) {
-            position.y = Math.round(nodes.get(source).y + 40 + Math.cos(client / (Math.PI * 2.0)));
+        // if we have any new clients, animate the force graph to position them
+        let position = localStorage[name] ? JSON.parse(localStorage[name]) : undefined;
+        if ((typeof position == 'undefined')) {
+          animate = true;
+          position = {
+            x: Math.round(nodes.get(source).x + 40 * Math.sin(client / (Math.PI * 2.0))),
+            y: Math.round(nodes.get(source).y + 40 * Math.cos(client / (Math.PI * 2.0))),
+            fixed: false
+          };
+        }
+        if (position.y > height) {
+          position.y = Math.round(nodes.get(source).y + 40 + Math.cos(client / (Math.PI * 2.0)));
+        }
+        let existingNodeIndex = nodes.nodeExists(connection.container);
+        let normalInfo = nodes.normalExists(connection.container);
+        let node = nodes.getOrCreateNode(id, name, role, nodeInfo, nodes.getLength(), position.x, position.y, connection.container, j, position.fixed, properties);
+        let nodeType = this.QDRService.utilities.isAConsole(properties, connection.identity, role, node.key) ? 'console' : 'client';
+        let cdir = getLinkDir(id, connection, onode, this.QDRService);
+        if (existingNodeIndex >= 0) {
+          // make a link between the current router (source) and the existing node
+          this.getLink(source, existingNodeIndex, dir, 'small', connection.name);
+        } else if (normalInfo.nodesIndex) {
+          // get node index of node that contained this connection in its normals array
+          let normalSource = this.getLinkSource(normalInfo.nodesIndex);
+          if (normalSource >= 0) {
+            if (cdir === 'unknown')
+              cdir = dir;
+            node.cdir = cdir;
+            nodes.add(node);
+            // create link from original node to the new node
+            this.getLink(this.links[normalSource].source, nodes.getLength()-1, cdir, 'small', connection.name);
+            // create link from this router to the new node
+            this.getLink(source, nodes.getLength()-1, cdir, 'small', connection.name);
+            // remove the old node from the normals list
+            nodes.get(normalInfo.nodesIndex).normals.splice(normalInfo.normalsIndex, 1);
           }
-          let existingNodeIndex = nodes.nodeExists(connection.container);
-          let normalInfo = nodes.normalExists(connection.container);
-          let node = nodes.getOrCreateNode(id, name, role, nodeInfo, nodes.getLength(), position.x, position.y, connection.container, j, position.fixed, properties);
-          let nodeType = this.QDRService.utilities.isAConsole(properties, connection.identity, role, node.key) ? 'console' : 'client';
-          let cdir = getLinkDir(id, connection, onode, this.QDRService);
-          if (existingNodeIndex >= 0) {
-            // make a link between the current router (source) and the existing node
-            this.getLink(source, existingNodeIndex, dir, 'small', connection.name);
-          } else if (normalInfo.nodesIndex) {
-            // get node index of node that contained this connection in its normals array
-            let normalSource = this.getLinkSource(normalInfo.nodesIndex);
-            if (normalSource >= 0) {
-              if (cdir === 'unknown')
-                cdir = dir;
-              node.cdir = cdir;
+        } else if (role === 'normal' || role === 'edge') {
+        // normal nodes can be collapsed into a single node if they are all the same dir
+          if (cdir !== 'unknown') {
+            node.user = connection.user;
+            node.isEncrypted = connection.isEncrypted;
+            node.host = connection.host;
+            node.connectionId = connection.identity;
+            node.cdir = cdir;
+            // determine arrow direction by using the link directions
+            if (!normalsParent[nodeType+cdir]) {
+              normalsParent[nodeType+cdir] = node;
               nodes.add(node);
-              // create link from original node to the new node
-              this.getLink(this.links[normalSource].source, nodes.getLength()-1, cdir, 'small', connection.name);
-              // create link from this router to the new node
-              this.getLink(source, nodes.getLength()-1, cdir, 'small', connection.name);
-              // remove the old node from the normals list
-              nodes.get(normalInfo.nodesIndex).normals.splice(normalInfo.normalsIndex, 1);
-            }
-          } else if (role === 'normal') {
-          // normal nodes can be collapsed into a single node if they are all the same dir
-            if (cdir !== 'unknown') {
-              node.user = connection.user;
-              node.isEncrypted = connection.isEncrypted;
-              node.host = connection.host;
-              node.connectionId = connection.identity;
-              node.cdir = cdir;
-              // determine arrow direction by using the link directions
-              if (!normalsParent[nodeType+cdir]) {
-                normalsParent[nodeType+cdir] = node;
-                nodes.add(node);
-                node.normals = [node];
-                // now add a link
-                this.getLink(source, nodes.getLength() - 1, cdir, 'small', connection.name);
-                client++;
-              } else {
-                normalsParent[nodeType+cdir].normals.push(node);
-              }
+              node.normals = [node];
+              // now add a link
+              this.getLink(source, nodes.getLength() - 1, cdir, 'small', connection.name);
+              client++;
             } else {
-              node.id = nodes.getLength() - 1 + unknowns.length;
-              unknowns.push(node);
+              normalsParent[nodeType+cdir].normals.push(node);
             }
           } else {
-            nodes.add(node);
-            // now add a link
-            this.getLink(source, nodes.getLength() - 1, dir, 'small', connection.name);
-            client++;
+            node.id = nodes.getLength() - 1 + unknowns.length;
+            unknowns.push(node);
           }
+        } else {
+          nodes.add(node);
+          // now add a link
+          this.getLink(source, nodes.getLength() - 1, dir, 'small', connection.name);
+          client++;
         }
       }
       source++;

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/3d79fda1/console/stand-alone/plugin/js/topology/map.js
----------------------------------------------------------------------
diff --git a/console/stand-alone/plugin/js/topology/map.js b/console/stand-alone/plugin/js/topology/map.js
new file mode 100644
index 0000000..9886245
--- /dev/null
+++ b/console/stand-alone/plugin/js/topology/map.js
@@ -0,0 +1,255 @@
+/*
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License.  You may obtain a copy of the License at
+
+  http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied.  See the License for the
+specific language governing permissions and limitations
+under the License.
+*/
+
+/* global angular d3 topojson Promise */
+const maxnorth = 84;
+const maxsouth = 60;
+const MAPOPTIONSKEY = 'QDRMapOptions';
+const MAPPOSITIONKEY = 'QDRMapPosition';
+const defaultLandColor = '#A3D3E0';
+const defaultOceanColor = '#FFFFFF';
+
+export class BackgroundMap { // eslint-disable-line no-unused-vars
+  constructor($scope, notifyFn) {
+    this.$scope = $scope;
+    this.initialized = false;
+    this.notify = notifyFn;
+    $scope.mapOptions = angular.fromJson(localStorage[MAPOPTIONSKEY]) || {areaColor: defaultLandColor, oceanColor: defaultOceanColor};
+    initLast(this);
+  }
+  updateLandColor(color) {
+    localStorage[MAPOPTIONSKEY] = JSON.stringify(this.$scope.mapOptions);
+    d3.select('g.geo path.land')
+      .style('fill', color)
+      .style('stroke', d3.rgb(color).darker());
+  }
+  updateOceanColor(color) {
+    localStorage[MAPOPTIONSKEY] = JSON.stringify(this.$scope.mapOptions);
+    if (!color)
+      color = this.$scope.mapOptions.oceanColor;
+    d3.select('g.geo rect.ocean')
+      .style('fill', color);
+    if (this.$scope.legend.status.mapOpen) {
+      d3.select('#main_container')
+        .style('background-color', color);
+    } else {
+      d3.select('#main_container')
+        .style('background-color', '#FFF');
+    }
+  }
+
+  init($scope, svg, width, height) {
+    return new Promise( (function (resolve, reject) {
+
+      this.svg = svg;
+      this.width = width;
+      this.height = height;
+      // track last translation and scale event we processed
+      this.rotate = 20;
+      this.scaleExtent = [1, 10];
+
+      // handle ui events to change the colors
+      $scope.$watch('mapOptions.areaColor', function (newValue, oldValue) {
+        if (newValue !== oldValue) {
+          this.updateLandColor(newValue);
+        }
+      }.bind(this));
+      $scope.$watch('mapOptions.oceanColor', function (newValue, oldValue) {
+        if (newValue !== oldValue) {
+          this.updateOceanColor(newValue);
+        }
+      }.bind(this));
+
+      // setup the projection with some defaults
+      this.projection = d3.geo.mercator()
+        .rotate([this.rotate,0])
+        .scale(1)
+        .translate([width/2, height/2]);
+
+      // this path will hold the land coordinates once they are loaded
+      this.geoPath = d3.geo.path()
+        .projection(this.projection);
+
+      // set up the scale extent and initial scale for the projection
+      var b = getMapBounds(this.projection, Math.max(maxnorth, maxsouth)),
+        s = width/(b[1][0]-b[0][0]);
+      this.scaleExtent = [s, 15*s];
+
+      this.projection
+        .scale(this.scaleExtent[0]);
+      this.lastProjection = angular.fromJson(localStorage[MAPPOSITIONKEY]) || {rotate: 20, scale: this.scaleExtent[0], translate: [width/2, height/2]};
+
+      this.zoom = d3.behavior.zoom()
+        .scaleExtent(this.scaleExtent)
+        .scale(this.projection.scale())
+        .translate([0,0])               // not linked directly to projection
+        .on('zoom', this.zoomed.bind(this));
+
+      this.geo = svg.append('g')
+        .attr('class', 'geo')
+        .style('opacity', this.$scope.legend.status.mapOpen ? '1': '0');
+
+      this.geo.append('rect')
+        .attr('class', 'ocean')
+        .attr('width', width)
+        .attr('height', height)
+        .attr('fill', '#FFF');
+
+      if (this.$scope.legend.status.mapOpen)
+        this.svg.call(this.zoom)
+          .on('dblclick.zoom', null);
+
+      // async load of data file. calls resolve when this completes to let caller know
+      //d3.json('plugin/data/world-110m.json', function(error, world) {
+      d3.json('plugin/data/countries.json', function(error, world) {
+        if (error) 
+          reject(error);
+
+        this.geo.append('path')
+          .datum(topojson.feature(world, world.objects.countries))
+          .attr('class', 'land')
+          .attr('d', this.geoPath)
+          .style('stroke', d3.rgb(this.$scope.mapOptions.areaColor).darker());
+
+        this.updateLandColor(this.$scope.mapOptions.areaColor);
+        this.updateOceanColor(this.$scope.mapOptions.oceanColor);
+
+        // restore map rotate, scale, translate
+        this.restoreState();
+
+        // draw with current positions
+        this.geo.selectAll('.land')
+          .attr('d', this.geoPath);
+
+        this.initialized = true;
+        resolve();
+      }.bind(this));
+    }.bind(this)));
+  }
+
+  setMapOpacity(opacity) {
+    opacity = opacity ? 1 : 0;
+    if (this.geo)
+      this.geo.style('opacity', opacity);
+  }
+  restoreState() {
+    this.projection.rotate([this.lastProjection.rotate, 0]);
+    this.projection.translate(this.lastProjection.translate);
+    this.projection.scale(this.lastProjection.scale);
+    this.zoom.scale(this.lastProjection.scale);
+    this.zoom.translate(this.lastProjection.translate);
+  }
+
+  // stop responding to pan/zoom events
+  cancelZoom() {
+    this.saveProjection();
+  }
+
+  // tell the svg to respond to mouse pan/zoom events
+  restartZoom() {
+    this.svg.call(this.zoom)
+      .on('dblclick.zoom', null);
+    this.restoreState();
+    this.last.scale = null;
+  }
+
+  getXY(lon, lat) {
+    return this.projection([lon, lat]);
+  }
+  getLonLat(x, y) {
+    return this.projection.invert([x, y]);
+  }
+
+  zoomed() {
+    if (d3.event && !this.$scope.current_node && !this.$scope.mousedown_node && this.$scope.legend.status.mapOpen) { 
+      let scale = d3.event.scale,
+        t = d3.event.translate,
+        dx = t[0]-this.last.translate[0],
+        dy = t[1]-this.last.translate[1],
+        yaw = this.projection.rotate()[0],
+        tp = this.projection.translate();
+      // zoomed
+      if (scale != this.last.scale) {
+        // get the mouse's x,y relative to the svg
+        let top = d3.select('#main_container').node().offsetTop;
+        let left = d3.select('#main_container').node().offsetLeft;
+        let mx = d3.event.sourceEvent.clientX - left;
+        let my = d3.event.sourceEvent.clientY - top - 1;
+
+        // get the lon,lat at the mouse position
+        let lonlat = this.projection.invert([mx, my]);
+
+        // do the requested scale operation
+        this.projection.scale(scale);
+
+        // get the lonlat that is under the mouse after the scale
+        let lonlat1 = this.projection.invert([mx, my]);
+        // calc the distance to rotate based on change in longitude
+        dx = lonlat1[0] - lonlat[0];
+        // calc the distance to translate based on change in lattitude
+        dy = my - this.projection([0, lonlat[1]])[1];
+
+        // rotate the map so that the longitude under the mouse is where it was before the scale
+        this.projection.rotate([yaw+dx ,0, 0]);
+
+        // translate the map so that the lattitude under the mouse is where it was before the scale
+        this.projection.translate([tp[0], tp[1]+dy]);
+      } else {
+        // rotate instead of translate in the x direction
+        this.projection.rotate([yaw+360.0*dx/this.width*this.scaleExtent[0]/scale, 0, 0]);
+        // translate only in the y direction. don't translate beyond the max lattitude north or south
+        var bnorth = getMapBounds(this.projection, maxnorth),
+          bsouth = getMapBounds(this.projection, maxsouth);
+        if (bnorth[0][1] + dy > 0) 
+          dy = -bnorth[0][1];
+        else if (bsouth[1][1] + dy < this.height) 
+          dy = this.height-bsouth[1][1];
+        this.projection.translate([tp[0],tp[1]+dy]);
+      }
+      this.last.scale = scale;
+      this.last.translate = t;
+      this.saveProjection();
+      this.notify();
+    }
+    // update the land path with our current projection
+    this.geo.selectAll('.land')
+      .attr('d', this.geoPath);
+  }
+  saveProjection() {
+    if (this.projection) {
+      this.lastProjection.rotate = this.projection.rotate()[0];
+      this.lastProjection.scale = this.projection.scale();
+      this.lastProjection.translate = this.projection.translate();
+      localStorage[MAPPOSITIONKEY] = JSON.stringify(this.lastProjection);
+    }
+  }
+}
+
+// find the top left and bottom right of current projection
+function getMapBounds(projection, maxlat) {
+  var yaw = projection.rotate()[0],
+    xymax = projection([-yaw+180-1e-6,-maxlat]),
+    xymin = projection([-yaw-180+1e-6, maxlat]);
+  
+  return [xymin,xymax];
+}
+function initLast(map) {
+  map.last = {translate: [0,0], scale: null};
+}
+

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/3d79fda1/console/stand-alone/plugin/js/topology/nodes.js
----------------------------------------------------------------------
diff --git a/console/stand-alone/plugin/js/topology/nodes.js b/console/stand-alone/plugin/js/topology/nodes.js
index 45ef23f..4be7ff7 100644
--- a/console/stand-alone/plugin/js/topology/nodes.js
+++ b/console/stand-alone/plugin/js/topology/nodes.js
@@ -17,8 +17,9 @@ specific language governing permissions and limitations
 under the License.
 */
 
+/* global d3 Promise */
 export class Node {
-  constructor(id, name, nodeType, properties, routerId, x, y, nodeIndex, resultIndex, fixed, connectionContainer) {
+  constructor(QDRService, id, name, nodeType, properties, routerId, x, y, nodeIndex, resultIndex, fixed, connectionContainer) {
     this.key = id;
     this.name = name;
     this.nodeType = nodeType;
@@ -31,8 +32,108 @@ export class Node {
     this.fixed = !!+fixed;
     this.cls = '';
     this.container = connectionContainer;
+    this.isConsole = QDRService.utilities.isConsole(this);
+    this.isArtemis = QDRService.utilities.isArtemis(this);
   }
+  title () {
+    let x = '';
+    if (this.normals && this.normals.length > 1)
+      x = ' x ' + this.normals.length;
+    if (this.isConsole)
+      return 'Dispatch console' + x;
+    else if (this.isArtemis)
+      return 'Broker - Artemis' + x;
+    else if (this.properties.product == 'qpid-cpp')
+      return 'Broker - qpid-cpp' + x;
+    else if (this.nodeType === 'edge')
+      return 'Edge Router';
+    else if (this.cdir === 'in')
+      return 'Sender' + x;
+    else if (this.cdir === 'out')
+      return 'Receiver' + x;
+    else if (this.cdir === 'both')
+      return 'Sender/Receiver' + x;
+    else if (this.nodeType === 'normal')
+      return 'client' + x;
+    else if (this.nodeType === 'on-demand')
+      return 'broker';
+    else if (this.properties.product) {
+      return this.properties.product;
+    }
+    else {
+      return '';
+    }
+  }
+  toolTip (QDRService) {
+    return new Promise( (function (resolve) {
+      if (this.nodeType === 'normal' || this.nodeType === 'edge') {
+        resolve(this.clientTooltip());
+      } else
+        this.routerTooltip(QDRService)
+          .then( function (toolTip) {
+            resolve(toolTip);
+          });
+    }.bind(this)));
+  }
+
+  clientTooltip () {
+    let type = this.title();
+    let title = `<table class="popupTable"><tr><td>Type</td><td>${type}</td></tr>`;
+    if (!this.normals || this.normals.length < 2)
+      title += `<tr><td>Host</td><td>${this.host}</td></tr>`;
+    else {
+      title += `<tr><td>Count</td><td>${this.normals.length}</td></tr>`;
+    }
+    title += '</table>';
+    return title;
+  }
+
+  routerTooltip (QDRService) {
+    return new Promise( (function (resolve) {
+      QDRService.management.topology.ensureEntities(this.key, [
+        {entity: 'listener', attrs: ['role', 'port', 'http']},
+        {entity: 'router', attrs: ['name', 'version', 'hostName']}
+      ], function () {
+        // update all the router title text
+        let nodes = QDRService.management.topology.nodeInfo();
+        let node = nodes[this.key];
+        let listeners = node['listener'];
+        let router = node['router'];
+        let r = QDRService.utilities.flatten(router.attributeNames, router.results[0]);
+        let title = '<table class="popupTable">';
+        title += ('<tr><td>Router</td><td>' + r.name + '</td></tr>');
+        if (r.hostName)
+          title += ('<tr><td>Host Name</td><td>' + r.hostHame + '</td></tr>');
+        title += ('<tr><td>Version</td><td>' + r.version + '</td></tr>');
+        let ports = [];
+        for (let l=0; l<listeners.results.length; l++) {
+          let listener = QDRService.utilities.flatten(listeners.attributeNames, listeners.results[l]);
+          if (listener.role === 'normal') {
+            ports.push(listener.port+'');
+          }
+        }
+        if (ports.length > 0) {
+          title += ('<tr><td>Ports</td><td>' + ports.join(', ') + '</td></tr>');
+        }
+        title += '</table>';
+        resolve(title);
+        return title;
+      }.bind(this));
+    }.bind(this)));
+  }
+
 }
+const nodeProperties = {
+  // router types
+  'inter-router': {radius: 28, linkDistance: [150, 70], charge: [-1800, -900]},
+  '_edge':  {radius: 20, linkDistance: [110, 55], charge: [-1350, -900]},
+  '_topo': {radius: 28, linkDistance: [150, 70], charge: [-1800, -900]},
+  // generated nodes from connections. key is from connection.role
+  'normal':       {radius: 15, linkDistance: [75, 40], charge: [-900, -900]},
+  'on-demand':    {radius: 15, linkDistance: [75, 40], charge: [-900, -900]},
+  'route-container': {radius: 15, linkDistance: [75, 40], charge: [-900, -900]},
+  'edge':  {radius: 20, linkDistance: [110, 55], charge: [-1350, -900]}
+};
 
 export class Nodes {
   constructor(QDRService, logger) {
@@ -40,6 +141,39 @@ export class Nodes {
     this.QDRService = QDRService;
     this.logger = logger;
   }
+  static radius(type) {
+    if (nodeProperties[type].radius)
+      return nodeProperties[type].radius;
+    console.log(`Requested radius for unknown node type: ${type}`);
+    return 15;
+  }
+  static maxRadius() {
+    let max = 0;
+    for (let key in nodeProperties) {
+      max = Math.max(max, nodeProperties[key].radius);
+    }
+    return max;
+  }
+  // vary the following force graph attributes based on nodeCount
+  static forceScale (nodeCount, minmax) {
+    let count = Math.max(Math.min(nodeCount, 80), 6);
+    let x = d3.scale.linear()
+      .domain([6,80])
+      .range(minmax);
+    return x(count);
+  }
+  linkDistance (d, nodeCount) {
+    let range = nodeProperties[d.target.nodeType].linkDistance;
+    return Nodes.forceScale(nodeCount, range);
+  }
+  charge (d, nodeCount) {
+    let charge = nodeProperties[d.nodeType].charge;
+    return Nodes.forceScale(nodeCount, charge);
+  }
+  gravity (d, nodeCount) {
+    return Nodes.forceScale(nodeCount, [0.0001, 0.1]);
+  }
+
   getLength () {
     return this.nodes.length;
   }
@@ -54,6 +188,8 @@ export class Nodes {
     this.nodes.some(function (n) {
       if (n.name === name) {
         n.fixed = b;
+        if (!b)
+          n.lat = n.lon = null;
         return true;
       }
     });
@@ -86,7 +222,12 @@ export class Nodes {
     }
     return normalInfo;
   }
-  savePositions () {
+  savePositions (nodes) {
+    if (!nodes)
+      nodes = this.nodes;
+    if (Object.prototype.toString.call(nodes) !== '[object Array]') {
+      nodes = [nodes];
+    }
     this.nodes.forEach( function (d) {
       localStorage[d.name] = JSON.stringify({
         x: Math.round(d.x),
@@ -95,6 +236,46 @@ export class Nodes {
       });
     });
   }
+  // Convert node's x,y coordinates to longitude, lattitude
+  saveLonLat (backgroundMap, nodes) {
+    if (!backgroundMap)
+      return;
+    // didn't pass nodes, use all nodes
+    if (!nodes)
+      nodes = this.nodes;
+    // passed a single node, wrap it in an array
+    if (Object.prototype.toString.call(nodes) !== '[object Array]') {
+      nodes = [nodes];
+    }
+    for (let i=0; i<nodes.length; i++) {
+      let n = nodes[i];
+      if (n.fixed) {
+        let lonlat = backgroundMap.getLonLat(n.x, n.y);
+        if (lonlat) {
+          n.lon = lonlat[0];
+          n.lat = lonlat[1];
+        }
+      } else {
+        n.lon = n.lat = null;
+      }
+    }
+  }
+  // convert all nodes' longitude,lattitude to x,y coordinates
+  setXY (backgroundMap) {
+    if (!backgroundMap)
+      return;
+    for (let i=0; i<this.nodes.length; i++) {
+      let n = this.nodes[i];
+      if (n.lon && n.lat) {
+        let xy = backgroundMap.getXY(n.lon, n.lat);
+        if (xy) {
+          n.x = n.px = xy[0];
+          n.y = n.py = xy[1];
+        }
+      }
+    }
+  }
+
   find (connectionContainer, properties, name) {
     properties = properties || {};
     for (let i=0; i<this.nodes.length; ++i) {
@@ -114,7 +295,7 @@ export class Nodes {
       return gotNode;
     }
     let routerId = this.QDRService.utilities.nameFromId(id);
-    return new Node(id, name, nodeType, properties, routerId, x, y, 
+    return new Node(this.QDRService, id, name, nodeType, properties, routerId, x, y, 
       nodeIndex, resultIndex, fixed, connectionContainer);
   }
   add (obj) {
@@ -153,10 +334,10 @@ export class Nodes {
         position.y = 200 - yInit;
         yInit *= -1;
       }
-      this.addUsing(id, name, 'inter-router', nodeInfo, this.nodes.length, position.x, position.y, name, undefined, position.fixed, {});
+      let parts = id.split('/');
+      this.addUsing(id, name, parts[1], nodeInfo, this.nodes.length, position.x, position.y, name, undefined, position.fixed, {});
     }
     return animate;
   }
-
 }
 

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/3d79fda1/console/stand-alone/plugin/js/topology/qdrTopology.js
----------------------------------------------------------------------
diff --git a/console/stand-alone/plugin/js/topology/qdrTopology.js b/console/stand-alone/plugin/js/topology/qdrTopology.js
index ed85f74..667f9ed 100644
--- a/console/stand-alone/plugin/js/topology/qdrTopology.js
+++ b/console/stand-alone/plugin/js/topology/qdrTopology.js
@@ -27,6 +27,7 @@ import { separateAddresses } from '../chord/filters.js';
 import { Nodes } from './nodes.js';
 import { Links } from './links.js';
 import { nextHop, connectionPopupHTML } from './topoUtils.js';
+import { BackgroundMap } from './map.js';
 /**
  * @module QDR
  */
@@ -36,25 +37,41 @@ export class TopologyController {
 
     let QDRLog = new QDRLogger($log, 'TopologyController');
     const TOPOOPTIONSKEY = 'topoOptions';
-    const radius = 25;
-    const radiusNormal = 15;
 
     //  - nodes is an array of router/client info. these are the circles
     //  - links is an array of connections between the routers. these are the lines with arrows
     let nodes = new Nodes(QDRService, QDRLog);
     let links = new Links(QDRService, QDRLog);
     let forceData = {nodes: nodes, links: links};
+
+    $scope.legendOptions = angular.fromJson(localStorage[TOPOOPTIONSKEY]) || {showTraffic: false, trafficType: 'dots', mapOpen: false, legendOpen: true};
+    if (typeof $scope.legendOptions.mapOpen == 'undefined')
+      $scope.legendOptions.mapOpen = false;
+    if (typeof $scope.legendOptions.legendOpen == 'undefined')
+      $scope.legendOptions.legendOpen = false;
+    let backgroundMap = new BackgroundMap($scope, 
+      // notify: called each time a pan/zoom is performed
+      function () {
+        if ($scope.legend.status.mapOpen) {
+          // set all the nodes' x,y position based on their saved lon,lat
+          nodes.setXY(backgroundMap);
+          nodes.savePositions();
+          // redraw the nodes in their x,y position and let non-fixed nodes bungie
+          force.start();
+          clearPopups();
+        }
+      });
     // urlPrefix is used when referring to svg:defs
     let urlPrefix = $location.absUrl();
     urlPrefix = urlPrefix.split('#')[0];
 
-    $scope.legendOptions = angular.fromJson(localStorage[TOPOOPTIONSKEY]) || {showTraffic: false, trafficType: 'dots'};
     if (!$scope.legendOptions.trafficType)
       $scope.legendOptions.trafficType = 'dots';
-    $scope.legend = {status: {legendOpen: true, optionsOpen: true}};
+    $scope.legend = {status: {legendOpen: true, optionsOpen: true, mapOpen: false}};
     $scope.legend.status.optionsOpen = $scope.legendOptions.showTraffic;
+    $scope.legend.status.mapOpen = $scope.legendOptions.mapOpen;
     let traffic = new Traffic($scope, $timeout, QDRService, separateAddresses, 
-      radius, forceData, $scope.legendOptions.trafficType, urlPrefix);
+      Nodes.radius('inter-router'), forceData, $scope.legendOptions.trafficType, urlPrefix);
 
     // the showTraaffic checkbox was just toggled (or initialized)
     $scope.$watch('legend.status.optionsOpen', function () {
@@ -72,21 +89,43 @@ export class TopologyController {
       localStorage[TOPOOPTIONSKEY] = JSON.stringify($scope.legendOptions);
       if ($scope.legendOptions.showTraffic) {
         restart();
-        traffic.setAnimationType($scope.legendOptions.trafficType, separateAddresses, radius);
+        traffic.setAnimationType($scope.legendOptions.trafficType, separateAddresses, Nodes.radius('inter-router'));
         traffic.start();
       }
     });
+    $scope.$watch('legend.status.mapOpen', function (newvalue, oldvalue) {
+      $scope.legendOptions.mapOpen = $scope.legend.status.mapOpen;
+      localStorage[TOPOOPTIONSKEY] = JSON.stringify($scope.legendOptions);
+      // map was shown
+      if ($scope.legend.status.mapOpen && backgroundMap.initialized) {
+        // respond to pan/zoom events
+        backgroundMap.restartZoom();
+        // set the main_container div's background color to the ocean color
+        backgroundMap.updateOceanColor();
+        d3.select('g.geo')
+          .style('opacity', 1);
+      } else {
+        if (newvalue !== oldvalue)
+          backgroundMap.cancelZoom();
+        // hide the map and reset the background color
+        d3.select('g.geo')
+          .style('opacity', 0);
+        d3.select('#main_container')
+          .style('background-color', '#FFF');
+      }
+    });
 
     // mouse event vars
     let selected_node = null,
       selected_link = null,
       mousedown_link = null,
-      mousedown_node = null,
       mouseover_node = null,
       mouseup_node = null,
       initial_mouse_down_position = null;
 
     $scope.schema = 'Not connected';
+    $scope.current_node = null,
+    $scope.mousedown_node = null,
 
     $scope.contextNode = null; // node that is associated with the current context menu
     $scope.isRight = function(mode) {
@@ -98,6 +137,7 @@ export class TopologyController {
         $scope.contextNode.fixed = b;
         nodes.setNodesFixed($scope.contextNode.name, b);
         nodes.savePositions();
+        nodes.saveLonLat(backgroundMap, $scope.contextNode);
       }
       restart();
     };
@@ -126,12 +166,6 @@ export class TopologyController {
       $('.contextMenu').fadeOut(200);
     });
 
-    const radii = {
-      'inter-router': 25,
-      'normal': 15,
-      'on-demand': 15,
-      'route-container': 15,
-    };
     let svg, lsvg;  // main svg and legend svg
     let force;
     let animate = false; // should the force graph organize itself when it is displayed
@@ -183,29 +217,6 @@ export class TopologyController {
     if (width <= 0 || height <= 0)
       return;
 
-    // vary the following force graph attributes based on nodeCount
-    // <= 6 routers returns min, >= 80 routers returns max, interpolate linearly
-    var forceScale = function(nodeCount, min, max) {
-      let count = Math.max(Math.min(nodeCount, 80), 6);
-      let x = d3.scale.linear()
-        .domain([6,80])
-        .range([min, max]);
-      //QDRLog.debug("forceScale(" + nodeCount + ", " + min + ", " + max + "  returns " + x(count) + " " + x(nodeCount))
-      return x(count);
-    };
-    var linkDistance = function (d, nodeCount) {
-      if (d.target.nodeType === 'inter-router')
-        return forceScale(nodeCount, 150, 70);
-      return forceScale(nodeCount, 75, 40);
-    };
-    var charge = function (d, nodeCount) {
-      if (d.nodeType === 'inter-router')
-        return forceScale(nodeCount, -1800, -900);
-      return -900;
-    };
-    var gravity = function (d, nodeCount) {
-      return forceScale(nodeCount, 0.0001, 0.1);
-    };
     // initialize the nodes and links array from the QDRService.topology._nodeInfo object
     var initForceGraph = function() {
       forceData.nodes = nodes = new Nodes(QDRService, QDRLog);
@@ -219,7 +230,6 @@ export class TopologyController {
       selected_node = null;
       selected_link = null;
 
-      nodes.savePositions();
       d3.select('#SVG_ID').remove();
       svg = d3.select('#topology')
         .append('svg')
@@ -230,24 +240,38 @@ export class TopologyController {
           clearPopups();
         });
 
+      /*
+      var graticule = d3.geo.graticule();
+      geo.append('path')
+        .datum(graticule)
+        .attr('class', 'graticule')
+        .attr('d', geoPath);
+      */
+
       // the legend
       d3.select('#topo_svg_legend svg').remove();
       lsvg = d3.select('#topo_svg_legend')
         .append('svg')
         .attr('id', 'svglegend');
       lsvg = lsvg.append('svg:g')
-        .attr('transform', `translate( ${(radii['inter-router'] + 2)},${(radii['inter-router'] + 2)})`)
+        .attr('transform', `translate(${Nodes.maxRadius()}, ${Nodes.maxRadius()})`)
         .selectAll('g');
 
       // mouse event vars
       mousedown_link = null;
-      mousedown_node = null;
+      $scope.mousedown_node = null;
       mouseup_node = null;
 
       // initialize the list of nodes
       forceData.nodes = nodes = new Nodes(QDRService, QDRLog);
       animate = nodes.initialize(nodeInfo, localStorage, width, height);
       nodes.savePositions();
+      // read the map data from the data file and build the map layer
+      backgroundMap.init($scope, svg, width, height)
+        .then( function () {
+          nodes.saveLonLat(backgroundMap);
+          backgroundMap.setMapOpacity($scope.legend.status.mapOpen);
+        });
 
       // initialize the list of links
       let unknowns = [];
@@ -261,12 +285,12 @@ export class TopologyController {
         .nodes(nodes.nodes)
         .links(links.links)
         .size([width, height])
-        .linkDistance(function(d) { return linkDistance(d, nodeCount); })
-        .charge(function(d) { return charge(d, nodeCount); })
+        .linkDistance(function(d) { return nodes.linkDistance(d, nodeCount); })
+        .charge(function(d) { return nodes.charge(d, nodeCount); })
         .friction(.10)
-        .gravity(function(d) { return gravity(d, nodeCount); })
+        .gravity(function(d) { return nodes.gravity(d, nodeCount); })
         .on('tick', tick)
-        .on('end', function () {nodes.savePositions();})
+        .on('end', function () {nodes.savePositions(); nodes.saveLonLat(backgroundMap);})
         .start();
 
       // This section adds in the arrows
@@ -301,8 +325,8 @@ export class TopologyController {
       grad.append('stop').attr('offset', '50%').style('stop-color', '#F0F000');
 
       // handles to link and node element groups
-      path = svg.append('svg:g').selectAll('path'),
-      circle = svg.append('svg:g').selectAll('g');
+      path = svg.append('svg:g').attr('class', 'links').selectAll('path'),
+      circle = svg.append('svg:g').attr('class', 'nodes').selectAll('g');
 
       // app starts here
       restart(false);
@@ -339,7 +363,7 @@ export class TopologyController {
           setTimeout(continueForce, 100, extra);
         }
       };
-      continueForce(forceScale(nodeCount, 0, 200));  // give large graphs time to settle down
+      continueForce(Nodes.forceScale(nodeCount, [0, 200]));  // give large graphs time to settle down
     };
 
     // To start up quickly, we only get the connection info for each router.
@@ -367,7 +391,7 @@ export class TopologyController {
     };
 
     function resetMouseVars() {
-      mousedown_node = null;
+      $scope.mousedown_node = null;
       mouseover_node = null;
       mouseup_node = null;
       mousedown_link = null;
@@ -376,24 +400,17 @@ export class TopologyController {
     // update force layout (called automatically each iteration)
     function tick() {
       circle.attr('transform', function(d) {
-        let cradius;
-        if (d.nodeType == 'inter-router') {
-          cradius = d.left ? radius + 8 : radius;
-        } else {
-          cradius = d.left ? radiusNormal + 18 : radiusNormal;
-        }
-        d.x = Math.max(d.x, radiusNormal * 2);
-        d.y = Math.max(d.y, radiusNormal * 2);
-        d.x = Math.max(0, Math.min(width - cradius, d.x));
-        d.y = Math.max(0, Math.min(height - cradius, d.y));
+        let r = Nodes.radius(d.nodeType);
+        d.x = Math.max(Math.min(d.x, width - r), r);
+        d.y = Math.max(Math.min(d.y, height - r), r);
+
         return `translate(${d.x},${d.y})`;
       });
 
-      // draw directed edges with proper padding from node centers
+      // draw lines with arrows with proper padding from node centers
       path.attr('d', function(d) {
-        let sourcePadding, targetPadding, r;
-
-        r = d.target.nodeType === 'inter-router' ? radius : radiusNormal - 18;
+        let sourcePadding, targetPadding;
+        let r = Nodes.radius(d.target.nodeType);
         sourcePadding = targetPadding = 0;
         let dtx = Math.max(targetPadding, Math.min(width - r, d.target.x)),
           dty = Math.max(targetPadding, Math.min(height - r, d.target.y)),
@@ -568,12 +585,14 @@ export class TopologyController {
 
       appendCircle(g)
         .on('mouseover', function(d) {  // mouseover a circle
+          $scope.current_node = d;
           QDRService.management.topology.delUpdatedAction('connectionPopupHTML');
-          if (d.nodeType === 'normal') {
-            showClientTooltip(d, d3.event);
-          } else
-            showRouterTooltip(d, d3.event);
-          if (d === mousedown_node)
+          let e = d3.event;
+          d.toolTip(QDRService)
+            .then( function (toolTip) {
+              showToolTip(toolTip, e);
+            });
+          if (d === $scope.mousedown_node)
             return;
           // enlarge target node
           d3.select(this).attr('transform', 'scale(1.1)');
@@ -590,6 +609,7 @@ export class TopologyController {
           });
         })
         .on('mouseout', function() { // mouse out for a circle
+          $scope.current_node = null;
           // unenlarge target node
           d3.select('#popover-div')
             .style('display', 'none');
@@ -599,15 +619,18 @@ export class TopologyController {
           restart();
         })
         .on('mousedown', function(d) { // mouse down for circle
+          backgroundMap.cancelZoom();
+          $scope.current_node = d;
           if (d3.event.button !== 0) { // ignore all but left button
             return;
           }
-          mousedown_node = d;
+          $scope.mousedown_node = d;
           // mouse position relative to svg
           initial_mouse_down_position = d3.mouse(this.parentNode.parentNode.parentNode).slice();
         })
         .on('mouseup', function(d) {  // mouse up for circle
-          if (!mousedown_node)
+          backgroundMap.restartZoom();
+          if (!$scope.mousedown_node)
             return;
 
           selected_link = null;
@@ -624,25 +647,31 @@ export class TopologyController {
             cur_mouse[1] != initial_mouse_down_position[1]) {
             d.fixed = true;
             nodes.setNodesFixed(d.name, true);
+            nodes.savePositions(d);
+            nodes.saveLonLat(backgroundMap, d);
             resetMouseVars();
             restart();
             return;
           }
 
           // if this node was selected, unselect it
-          if (mousedown_node === selected_node) {
+          if ($scope.mousedown_node === selected_node) {
             selected_node = null;
           } else {
-            if (d.nodeType !== 'normal' && d.nodeType !== 'on-demand')
-              selected_node = mousedown_node;
+            if (d.nodeType !== 'normal' && 
+                d.nodeType !== 'on-demand' && 
+                d.nodeType !== 'edge' &&
+                d.nodeTYpe !== '_edge')
+              selected_node = $scope.mousedown_node;
           }
           clearAllHighlights();
-          mousedown_node = null;
+          $scope.mousedown_node = null;
           if (!$scope.$$phase) $scope.$apply();
           restart(false);
 
         })
         .on('dblclick', function(d) { // circle
+          d3.event.preventDefault();
           if (d.fixed) {
             d.fixed = false;
             nodes.setNodesFixed(d.name, false);
@@ -691,18 +720,19 @@ export class TopologyController {
       let multiples = svg.selectAll('.multiple');
       multiples.each(function(d) {
         let g = d3.select(this);
+        let r = Nodes.radius(d.nodeType);
         g.append('svg:text')
-          .attr('x', radiusNormal + 3)
-          .attr('y', Math.floor(radiusNormal / 2))
+          .attr('x', r + 4)
+          .attr('y', Math.floor((r / 2) - 4))
           .attr('class', 'subtext')
-          .text('x ' + d.normals.length);
+          .text('* ' + d.normals.length);
       });
       // call createLegend in timeout because:
       // If we create the legend right away, then it will be destroyed when the accordian
       // gets initialized as the page loads.
       $timeout(createLegend);
 
-      if (!mousedown_node || !selected_node)
+      if (!$scope.mousedown_node || !selected_node)
         return;
 
       if (!start)
@@ -714,51 +744,54 @@ export class TopologyController {
     }
     let createLegend = function () {
       // dynamically create the legend based on which node types are present
-      // the legend
       d3.select('#topo_svg_legend svg').remove();
       lsvg = d3.select('#topo_svg_legend')
         .append('svg')
         .attr('id', 'svglegend');
       lsvg = lsvg.append('svg:g')
-        .attr('transform', `translate(${(radii['inter-router'] + 2)},${(radii['inter-router'] + 2)})`)
+        .attr('transform', `translate(${Nodes.maxRadius()}, ${Nodes.maxRadius()})`)
         .selectAll('g');
       let legendNodes = new Nodes(QDRService, QDRLog);
       legendNodes.addUsing('Router', '', 'inter-router', '', undefined, 0, 0, 0, 0, false, {});
-
+      if (!svg.selectAll('circle.edge').empty() || !svg.selectAll('circle._edge').empty()) {
+        legendNodes.addUsing('Router', 'Edge', 'edge', '', undefined, 0, 0, 1, 0, false, {});
+      }
       if (!svg.selectAll('circle.console').empty()) {
-        legendNodes.addUsing('Console', 'Console', 'normal', '', undefined, 0, 0, 1, 0, false, {
+        legendNodes.addUsing('Console', 'Console', 'normal', '', undefined, 0, 0, 2, 0, false, {
           console_identifier: 'Dispatch console'
         });
       }
       if (!svg.selectAll('circle.client.in').empty()) {
-        legendNodes.addUsing('Sender', 'Sender', 'normal', '', undefined, 0, 0, 2, 0, false, {}).cdir = 'in';
+        legendNodes.addUsing('Sender', 'Sender', 'normal', '', undefined, 0, 0, 3, 0, false, {}).cdir = 'in';
       }
       if (!svg.selectAll('circle.client.out').empty()) {
-        legendNodes.addUsing('Receiver', 'Receiver', 'normal', '', undefined, 0, 0, 3, 0, false, {}).cdir = 'out';
+        legendNodes.addUsing('Receiver', 'Receiver', 'normal', '', undefined, 0, 0, 4, 0, false, {}).cdir = 'out';
       }
       if (!svg.selectAll('circle.client.inout').empty()) {
-        legendNodes.addUsing('Sender/Receiver', 'Sender/Receiver', 'normal', '', undefined, 0, 0, 4, 0, false, {}).cdir = 'both';
+        legendNodes.addUsing('Sender/Receiver', 'Sender/Receiver', 'normal', '', undefined, 0, 0, 5, 0, false, {}).cdir = 'both';
       }
       if (!svg.selectAll('circle.qpid-cpp').empty()) {
-        legendNodes.addUsing('Qpid broker', 'Qpid broker', 'route-container', '', undefined, 0, 0, 5, 0, false, {
+        legendNodes.addUsing('Qpid broker', 'Qpid broker', 'route-container', '', undefined, 0, 0, 6, 0, false, {
           product: 'qpid-cpp'
         });
       }
       if (!svg.selectAll('circle.artemis').empty()) {
-        legendNodes.addUsing('Artemis broker', 'Artemis broker', 'route-container', '', undefined, 0, 0, 6, 0, false,
+        legendNodes.addUsing('Artemis broker', 'Artemis broker', 'route-container', '', undefined, 0, 0, 7, 0, false,
           {product: 'apache-activemq-artemis'});
       }
       if (!svg.selectAll('circle.route-container').empty()) {
-        legendNodes.addUsing('Service', 'Service', 'route-container', 'external-service', undefined, 0, 0, 7, 0, false,
+        legendNodes.addUsing('Service', 'Service', 'route-container', 'external-service', undefined, 0, 0, 8, 0, false,
           {product: ' External Service'});
       }
       lsvg = lsvg.data(legendNodes.nodes, function(d) {
-        return d.key;
+        return d.key + d.name;
       });
+      let cury = 0;
       let lg = lsvg.enter().append('svg:g')
-        .attr('transform', function(d, i) {
-          // 45px between lines and add 10px space after 1st line
-          return 'translate(0, ' + (45 * i + (i > 0 ? 10 : 0)) + ')';
+        .attr('transform', function(d) {
+          let t = `translate(0, ${cury})`;
+          cury += (Nodes.radius(d.nodeType) * 2 + 10);
+          return t;
         });
 
       appendCircle(lg);
@@ -795,7 +828,7 @@ export class TopologyController {
       return g.append('svg:circle')
         .attr('class', 'node')
         .attr('r', function(d) {
-          return radii[d.nodeType];
+          return Nodes.radius(d.nodeType);
         })
         .attr('fill', function (d) {
           if (d.cdir === 'both' && !QDRService.utilities.isConsole(d)) {
@@ -819,11 +852,14 @@ export class TopologyController {
           return d.cdir == 'both';
         })
         .classed('inter-router', function(d) {
-          return d.nodeType == 'inter-router';
+          return d.nodeType == 'inter-router' || d.nodeType === '_topo';
         })
         .classed('on-demand', function(d) {
           return d.nodeType == 'on-demand';
         })
+        .classed('edge', function(d) {
+          return d.nodeType === 'edge' || d.nodeType === '_edge';
+        })
         .classed('console', function(d) {
           return QDRService.utilities.isConsole(d);
         })
@@ -854,6 +890,8 @@ export class TopologyController {
             y = 4;
           else if (d.nodeType === 'route-container')
             y = 5;
+          else if (d.nodeType === 'edge' || d.nodeType === '_edge')
+            y = 4;
           return y;
         })
         .attr('class', 'id')
@@ -866,6 +904,12 @@ export class TopologyController {
         .classed('on-demand', function(d) {
           return d.nodeType === 'on-demand';
         })
+        .classed('edge', function(d) {
+          return d.nodeType === 'edge';
+        })
+        .classed('edge', function(d) {
+          return d.nodeType === '_edge';
+        })
         .classed('artemis', function(d) {
           return QDRService.utilities.isArtemis(d);
         })
@@ -881,84 +925,20 @@ export class TopologyController {
             return '\ue901';
           } else if (d.nodeType === 'route-container') {
             return d.properties.product ? d.properties.product[0].toUpperCase() : 'S';
-          } else if (d.nodeType === 'normal')
+          } else if (d.nodeType === 'normal') {
             return '\uf109'; // icon-laptop for clients
+          } else if (d.nodeType === 'edge' || d.nodeType === '_edge') {
+            return 'Edge';
+          }
           return d.name.length > 7 ? d.name.substr(0, 6) + '...' : d.name;
         });
     };
     let appendTitle = function(g) {
       g.append('svg:title').text(function(d) {
-        return generateTitle(d);
+        return d.title();
       });
     };
 
-    let generateTitle = function (d) {
-      let x = '';
-      if (d.normals && d.normals.length > 1)
-        x = ' x ' + d.normals.length;
-      if (QDRService.utilities.isConsole(d))
-        return 'Dispatch console' + x;
-      else if (QDRService.utilities.isArtemis(d))
-        return 'Broker - Artemis' + x;
-      else if (d.properties.product == 'qpid-cpp')
-        return 'Broker - qpid-cpp' + x;
-      else if (d.cdir === 'in')
-        return 'Sender' + x;
-      else if (d.cdir === 'out')
-        return 'Receiver' + x;
-      else if (d.cdir === 'both')
-        return 'Sender/Receiver' + x;
-      else if (d.nodeType === 'normal')
-        return 'client' + x;
-      else if (d.nodeType === 'on-demand')
-        return 'broker';
-      else if (d.properties.product) {
-        return d.properties.product;
-      }
-      else {
-        return '';
-      }
-    };
-
-    let showClientTooltip = function (d, event) {
-      let type = generateTitle(d);
-      let title = `<table class="popupTable"><tr><td>Type</td><td>${type}</td></tr>`;
-      if (!d.normals || d.normals.length < 2)
-        title += ('<tr><td>Host</td><td>' + d.host + '</td></tr>');
-      title += '</table>';
-      showToolTip(title, event);
-    };
-
-    let showRouterTooltip = function (d, event) {
-      QDRService.management.topology.ensureEntities(d.key, [
-        {entity: 'listener', attrs: ['role', 'port', 'http']},
-        {entity: 'router', attrs: ['name', 'version', 'hostName']}
-      ], function () {
-        // update all the router title text
-        let nodes = QDRService.management.topology.nodeInfo();
-        let node = nodes[d.key];
-        let listeners = node['listener'];
-        let router = node['router'];
-        let r = QDRService.utilities.flatten(router.attributeNames, router.results[0]);
-        let title = '<table class="popupTable">';
-        title += ('<tr><td>Router</td><td>' + r.name + '</td></tr>');
-        if (r.hostName)
-          title += ('<tr><td>Host Name</td><td>' + r.hostHame + '</td></tr>');
-        title += ('<tr><td>Version</td><td>' + r.version + '</td></tr>');
-        let ports = [];
-        for (let l=0; l<listeners.results.length; l++) {
-          let listener = QDRService.utilities.flatten(listeners.attributeNames, listeners.results[l]);
-          if (listener.role === 'normal') {
-            ports.push(listener.port+'');
-          }
-        }
-        if (ports.length > 0) {
-          title += ('<tr><td>Ports</td><td>' + ports.join(', ') + '</td></tr>');
-        }
-        title += '</table>';
-        showToolTip(title, event);
-      });
-    };
     let showToolTip = function (title, event) {
       // show the tooltip
       $timeout ( function () {
@@ -1027,16 +1007,7 @@ export class TopologyController {
           savedKeys[key] = nodeInfo[key]['connection'].results.length;
       }
     }
-    // we are about to leave the page, save the node positions
-    $rootScope.$on('$locationChangeStart', function() {
-      //QDRLog.debug("locationChangeStart");
-      nodes.savePositions();
-    });
-    // When the DOM element is removed from the page,
-    // AngularJS will trigger the $destroy event on
-    // the scope
-    $scope.$on('$destroy', function() {
-      //QDRLog.debug("scope on destroy");
+    function destroy () {
       nodes.savePositions();
       QDRService.management.topology.setUpdateEntities([]);
       QDRService.management.topology.stopUpdating();
@@ -1047,6 +1018,18 @@ export class TopologyController {
       d3.select('#SVG_ID').remove();
       window.removeEventListener('resize', resize);
       traffic.stop();
+      d3.select('#main_container')
+        .style('background-color', 'white');
+    }
+    // When the DOM element is removed from the page,
+    // AngularJS will trigger the $destroy event on
+    // the scope
+    $scope.$on('$destroy', function() {
+      destroy();
+    });
+    // we are about to leave the page, save the node positions
+    $rootScope.$on('$locationChangeStart', function() {
+      destroy();
     });
 
     function handleInitialUpdate() {

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/3d79fda1/console/stand-alone/vendor-js.txt
----------------------------------------------------------------------
diff --git a/console/stand-alone/vendor-js.txt b/console/stand-alone/vendor-js.txt
index 8fca75b..935d9a4 100644
--- a/console/stand-alone/vendor-js.txt
+++ b/console/stand-alone/vendor-js.txt
@@ -33,10 +33,14 @@ node_modules/angular-ui-bootstrap/dist/ui-bootstrap-tpls.js
 node_modules/angular-bootstrap-checkbox/angular-bootstrap-checkbox.js
 node_modules/bootstrap/dist/js/bootstrap.min.js
 node_modules/d3/d3.min.js
+node_modules/d3-array/dist/d3-array.js
+node_modules/d3-geo/dist/d3-geo.js
+node_modules/d3-geo-projection/dist/d3-geo-projection.js
 node_modules/d3-queue/build/d3-queue.min.js
 node_modules/d3-time/build/d3-time.min.js
 node_modules/d3-time-format/build/d3-time-format.min.js
 node_modules/d3-path/build/d3-path.min.js
+node_modules/topojson-client/dist/topojson-client.js
 node_modules/c3/c3.min.js
 node_modules/notifyjs-browser/dist/notify.js
 node_modules/patternfly/dist/js/patternfly.min.js


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@qpid.apache.org
For additional commands, e-mail: commits-help@qpid.apache.org


[2/3] qpid-dispatch git commit: DISPATCH-1161 Handle edge routers in console

Posted by ea...@apache.org.
http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/3d79fda1/console/stand-alone/plugin/data/countries.json
----------------------------------------------------------------------
diff --git a/console/stand-alone/plugin/data/countries.json b/console/stand-alone/plugin/data/countries.json
new file mode 100644
index 0000000..8b17350
--- /dev/null
+++ b/console/stand-alone/plugin/data/countries.json
@@ -0,0 +1,2 @@
+
+{"type":"Topology","objects":{"countries":{"type":"GeometryCollection","geometries":[{"type":"Polygon","id":"AFG","properties":{"name":"Afghanistan"},"arcs":[[0,1,2,3,4,5]]},{"type":"MultiPolygon","id":"AGO","properties":{"name":"Angola"},"arcs":[[[6,7,8,9]],[[10,11,12]]]},{"type":"Polygon","id":"ALB","properties":{"name":"Albania"},"arcs":[[13,14,15,16,17,18,19,20]]},{"type":"Polygon","id":"ALD","properties":{"name":"Aland"},"arcs":[[21]]},{"type":"Polygon","id":"AND","properties":{"name":"Andorra"},"arcs":[[22,23]]},{"type":"Polygon","id":"ARE","properties":{"name":"United Arab Emirates"},"arcs":[[24,25,26,27,28]]},{"type":"MultiPolygon","id":"ARG","properties":{"name":"Argentina"},"arcs":[[[29,30]],[[31,32,33,34,35,36]]]},{"type":"Polygon","id":"ARM","properties":{"name":"Armenia"},"arcs":[[37,38,39,40,41]]},{"type":"Polygon","id":"ATF","properties":{"name":"Fr. S. Antarctic Lands"},"arcs":[[42]]},{"type":"MultiPolygon","id":"AUS","properties":{"name":"Australia"},"arcs":[[[43]],
 [[44]],[[45]],[[46]],[[47]],[[48]],[[49]],[[50]],[[51]],[[52]],[[53]],[[54]]]},{"type":"Polygon","id":"AUT","properties":{"name":"Austria"},"arcs":[[55,56,57,58,59,60,61,62]]},{"type":"MultiPolygon","id":"AZE","properties":{"name":"Azerbaijan"},"arcs":[[[63,64,-40]],[[65,66,67,-38,68]]]},{"type":"Polygon","id":"BDI","properties":{"name":"Burundi"},"arcs":[[69,70,71,72]]},{"type":"Polygon","id":"BEL","properties":{"name":"Belgium"},"arcs":[[73,74,75,76,77,78,79]]},{"type":"Polygon","id":"BEN","properties":{"name":"Benin"},"arcs":[[80,81,82,83,84]]},{"type":"Polygon","id":"BFA","properties":{"name":"Burkina Faso"},"arcs":[[85,-84,86,87,88,89]]},{"type":"MultiPolygon","id":"BGD","properties":{"name":"Bangladesh"},"arcs":[[[90]],[[91,92,93]]]},{"type":"Polygon","id":"BGR","properties":{"name":"Bulgaria"},"arcs":[[94,95,96,97,98,99]]},{"type":"MultiPolygon","id":"BHS","properties":{"name":"Bahamas"},"arcs":[[[100]],[[101]],[[102]],[[103]]]},{"type":"Polygon","id":"BIH","properties":{"nam
 e":"Bosnia and Herz."},"arcs":[[104,105,106,107]]},{"type":"Polygon","id":"BLR","properties":{"name":"Belarus"},"arcs":[[108,109,110,111,112]]},{"type":"Polygon","id":"BLZ","properties":{"name":"Belize"},"arcs":[[113,114,115]]},{"type":"Polygon","id":"BOL","properties":{"name":"Bolivia"},"arcs":[[116,-37,117,118,119,120,121]]},{"type":"MultiPolygon","id":"BRA","properties":{"name":"Brazil"},"arcs":[[[122]],[[123]],[[124]],[[125]],[[126]],[[127]],[[128]],[[129]],[[130,131,132,133,134,135,-33,136,137,138,-122,139,140,141,142]]]},{"type":"MultiPolygon","id":"BRN","properties":{"name":"Brunei"},"arcs":[[[143,144]],[[145,146]]]},{"type":"Polygon","id":"BTN","properties":{"name":"Bhutan"},"arcs":[[147,148]]},{"type":"Polygon","id":"BWA","properties":{"name":"Botswana"},"arcs":[[149,150,151]]},{"type":"Polygon","id":"CAF","properties":{"name":"Central African Rep."},"arcs":[[152,153,154,155,156,157]]},{"type":"MultiPolygon","id":"CAN","properties":{"name":"Canada"},"arcs":[[[158]],[[159]],
 [[160]],[[161,162,163,164]],[[165]],[[166]],[[167]],[[168]],[[169]],[[170]],[[171]],[[172]],[[173]],[[174]],[[175]],[[176]],[[177]],[[178]],[[179]],[[180]],[[181]],[[182]],[[183]],[[184]],[[185]],[[186]],[[187]],[[188]],[[189]],[[190]],[[191]],[[192]],[[193]],[[194,195,196,197,198,199,200,201,202,203,204,205]],[[206]],[[207]],[[208]],[[209]],[[210]],[[211]],[[212]],[[213]],[[214]],[[215]],[[216]],[[217]],[[218]],[[219]],[[220]],[[221]],[[222]],[[223]],[[224]],[[225]],[[226]],[[227]],[[228]],[[229]],[[230]],[[231]],[[232]],[[233]],[[234]],[[235]],[[236]]]},{"type":"Polygon","id":"CHE","properties":{"name":"Switzerland"},"arcs":[[237,-60,238,239,240,241,242]]},{"type":"MultiPolygon","id":"CHL","properties":{"name":"Chile"},"arcs":[[[243]],[[244]],[[245]],[[246]],[[247]],[[248]],[[249]],[[-30,250]],[[251]],[[252]],[[253]],[[254]],[[255]],[[256]],[[257]],[[258]],[[259]],[[260]],[[261]],[[262]],[[263]],[[264]],[[265]],[[266]],[[267]],[[-36,268,269,-118]]]},{"type":"MultiPolygon","id":"CH
 N","properties":{"name":"China"},"arcs":[[[270]],[[271]],[[272,273,274,275,276,277,278,279,280,281,-149,282,283,284,285,286,-1,287,288,289,290,291,292,293,294]]]},{"type":"Polygon","id":"CIV","properties":{"name":"Côte d'Ivoire"},"arcs":[[-89,295,296,297,298,299]]},{"type":"Polygon","id":"CMR","properties":{"name":"Cameroon"},"arcs":[[300,-157,301,302,303,304,305,306,307]]},{"type":"MultiPolygon","id":"CNM","properties":{"name":"Cyprus U.N. Buffer Zone"},"arcs":[[[308,309]],[[310,311,312,313]]]},{"type":"Polygon","id":"COD","properties":{"name":"Dem. Rep. Congo"},"arcs":[[314,315,316,317,318,319,320,321,322,-72,323,324,325,326,-10,327,-11,328,-155]]},{"type":"Polygon","id":"COG","properties":{"name":"Congo"},"arcs":[[-329,-13,329,330,-302,-156]]},{"type":"Polygon","id":"COL","properties":{"name":"Colombia"},"arcs":[[331,-141,332,333,334,335,336]]},{"type":"Polygon","id":"COM","properties":{"name":"Comoros"},"arcs":[[337]]},{"type":"MultiPolygon","id":"CPV","properties":{"name":"C
 ape Verde"},"arcs":[[[338]],[[339]],[[340]]]},{"type":"Polygon","id":"CRI","properties":{"name":"Costa Rica"},"arcs":[[341,342,343,344]]},{"type":"MultiPolygon","id":"CUB","properties":{"name":"Cuba"},"arcs":[[[345]],[[346]]]},{"type":"Polygon","id":"CYN","properties":{"name":"N. Cyprus"},"arcs":[[347,348,-314,349]]},{"type":"MultiPolygon","id":"CYP","properties":{"name":"Cyprus"},"arcs":[[[350,351,-348]],[[352,353,-310,354,-312]]]},{"type":"Polygon","id":"CZE","properties":{"name":"Czech Rep."},"arcs":[[355,356,-63,357]]},{"type":"MultiPolygon","id":"DEU","properties":{"name":"Germany"},"arcs":[[[358]],[[359,360,-358,-62,361,-243,362,363,-74,364,365,366]]]},{"type":"Polygon","id":"DJI","properties":{"name":"Djibouti"},"arcs":[[367,368,369,370]]},{"type":"Polygon","id":"DMA","properties":{"name":"Dominica"},"arcs":[[371]]},{"type":"MultiPolygon","id":"DNK","properties":{"name":"Denmark"},"arcs":[[[372]],[[373]],[[374]],[[375]],[[-367,376]]]},{"type":"Polygon","id":"DOM","properties"
 :{"name":"Dominican Rep."},"arcs":[[377,378,379,380]]},{"type":"Polygon","id":"DZA","properties":{"name":"Algeria"},"arcs":[[381,382,383,384,385,386,387,388]]},{"type":"MultiPolygon","id":"ECU","properties":{"name":"Ecuador"},"arcs":[[[389]],[[390]],[[391]],[[392]],[[393]],[[394,395,-334]]]},{"type":"Polygon","id":"EGY","properties":{"name":"Egypt"},"arcs":[[396,397,398,399,400,401]]},{"type":"Polygon","id":"ERI","properties":{"name":"Eritrea"},"arcs":[[-370,402,403,404]]},{"type":"Polygon","id":"ESB","properties":{"name":"Dhekelia"},"arcs":[[-352,405,-353,-311,-349]]},{"type":"MultiPolygon","id":"ESP","properties":{"name":"Spain"},"arcs":[[[406]],[[407]],[[408]],[[409]],[[410]],[[411,-23,412,413,414,415]]]},{"type":"MultiPolygon","id":"EST","properties":{"name":"Estonia"},"arcs":[[[416]],[[417,418,419,420,421,422,423]]]},{"type":"Polygon","id":"ETH","properties":{"name":"Ethiopia"},"arcs":[[-369,424,425,426,427,428,-403]]},{"type":"Polygon","id":"FIN","properties":{"name":"Finland"
 },"arcs":[[429,430,431,432]]},{"type":"MultiPolygon","id":"FJI","properties":{"name":"Fiji"},"arcs":[[[433]],[[434]]]},{"type":"MultiPolygon","id":"FLK","properties":{"name":"Falkland Is."},"arcs":[[[435]],[[436]]]},{"type":"MultiPolygon","id":"FRA","properties":{"name":"France"},"arcs":[[[437]],[[-132,438,439]],[[440]],[[441]],[[442]],[[443,-363,-242,444,-240,445,446,-413,-24,-412,447,-76]]]},{"type":"Polygon","id":"GAB","properties":{"name":"Gabon"},"arcs":[[-331,448,449,-303]]},{"type":"MultiPolygon","id":"GBR","properties":{"name":"United Kingdom"},"arcs":[[[450,451]],[[452]],[[453]],[[454]],[[455]],[[456]]]},{"type":"Polygon","id":"GEO","properties":{"name":"Georgia"},"arcs":[[-69,-42,457,458,459]]},{"type":"Polygon","id":"GHA","properties":{"name":"Ghana"},"arcs":[[460,461,-296,-88]]},{"type":"Polygon","id":"GIN","properties":{"name":"Guinea"},"arcs":[[462,-299,463,464,465,466,467]]},{"type":"Polygon","id":"GMB","properties":{"name":"Gambia"},"arcs":[[468,469]]},{"type":"Polyg
 on","id":"GNB","properties":{"name":"Guinea-Bissau"},"arcs":[[470,471,-467]]},{"type":"MultiPolygon","id":"GNQ","properties":{"name":"Eq. Guinea"},"arcs":[[[-450,472,-304]],[[473]]]},{"type":"MultiPolygon","id":"GRC","properties":{"name":"Greece"},"arcs":[[[474]],[[475]],[[476]],[[477]],[[478]],[[479]],[[480]],[[481,-97,482,483,-17,484]]]},{"type":"MultiPolygon","id":"GRL","properties":{"name":"Greenland"},"arcs":[[[485]],[[486]],[[487]],[[488]],[[489]],[[490]],[[491]],[[492]],[[493]],[[494]],[[495]],[[496]]]},{"type":"Polygon","id":"GTM","properties":{"name":"Guatemala"},"arcs":[[-115,497,498,499,500,501]]},{"type":"Polygon","id":"GUY","properties":{"name":"Guyana"},"arcs":[[502,-143,503,504]]},{"type":"Polygon","id":"HKG","properties":{"name":"Hong Kong"},"arcs":[[505,-277]]},{"type":"Polygon","id":"HND","properties":{"name":"Honduras"},"arcs":[[506,507,508,-499,509]]},{"type":"MultiPolygon","id":"HRV","properties":{"name":"Croatia"},"arcs":[[[-106,510,511,512]],[[513,514,515,-108
 ,516,517]]]},{"type":"MultiPolygon","id":"HTI","properties":{"name":"Haiti"},"arcs":[[[518]],[[-380,519,-378,520]]]},{"type":"Polygon","id":"HUN","properties":{"name":"Hungary"},"arcs":[[521,522,523,-514,524,-57,525]]},{"type":"MultiPolygon","id":"IDN","properties":{"name":"Indonesia"},"arcs":[[[526]],[[527]],[[528,529,530,531]],[[532]],[[533]],[[534]],[[535]],[[536]],[[537]],[[538]],[[539]],[[540]],[[541]],[[542]],[[543]],[[544]],[[545]],[[546]],[[547]],[[548]],[[549]],[[550]],[[551]],[[552]],[[553]],[[554]],[[555]],[[556]],[[557]],[[558]],[[559]],[[560]],[[561]],[[562]],[[563]],[[564]],[[565]],[[566]],[[567]],[[568,569]],[[570]],[[571]],[[572]],[[573]],[[574]],[[575]],[[576]],[[577]],[[578]],[[579]],[[580]],[[581]],[[582]],[[583]],[[584]],[[585,586]],[[587]],[[588]]]},{"type":"Polygon","id":"IMN","properties":{"name":"Isle of Man"},"arcs":[[589]]},{"type":"MultiPolygon","id":"IND","properties":{"name":"India"},"arcs":[[[590]],[[591]],[[592]],[[593,-283,-148,-282,594,-94,595,596,59
 7,-285]]]},{"type":"Polygon","id":"IRL","properties":{"name":"Ireland"},"arcs":[[-451,598]]},{"type":"MultiPolygon","id":"IRN","properties":{"name":"Iran"},"arcs":[[[599]],[[-39,-68,600,601,-3,602,603,604,605,-64]]]},{"type":"Polygon","id":"IRQ","properties":{"name":"Iraq"},"arcs":[[-605,606,607,608,609,610,611]]},{"type":"Polygon","id":"ISL","properties":{"name":"Iceland"},"arcs":[[612]]},{"type":"Polygon","id":"ISR","properties":{"name":"Israel"},"arcs":[[613,614,615,616,617,-398,618,619,620,621]]},{"type":"MultiPolygon","id":"ITA","properties":{"name":"Italy"},"arcs":[[[622]],[[623]],[[624,625,-446,-239,-59]]]},{"type":"Polygon","id":"JAM","properties":{"name":"Jamaica"},"arcs":[[626]]},{"type":"Polygon","id":"JOR","properties":{"name":"Jordan"},"arcs":[[627,628,-617,629,630,-614,631,-610]]},{"type":"MultiPolygon","id":"JPN","properties":{"name":"Japan"},"arcs":[[[632]],[[633]],[[634]],[[635]],[[636]],[[637]],[[638]],[[639]]]},{"type":"Polygon","id":"KAB","properties":{"name":"Ba
 ikonur"},"arcs":[[640]]},{"type":"Polygon","id":"KAS","properties":{"name":"Siachen Glacier"},"arcs":[[-598,641,-286]]},{"type":"MultiPolygon","id":"KAZ","properties":{"name":"Kazakhstan"},"arcs":[[[642,643]],[[-290,644,645,646,647,648,649,650],[-641]]]},{"type":"Polygon","id":"KEN","properties":{"name":"Kenya"},"arcs":[[-427,651,652,653,654,655,656]]},{"type":"Polygon","id":"KGZ","properties":{"name":"Kyrgyzstan"},"arcs":[[-289,657,658,-645]]},{"type":"Polygon","id":"KHM","properties":{"name":"Cambodia"},"arcs":[[659,660,661,662]]},{"type":"MultiPolygon","id":"KOR","properties":{"name":"Korea"},"arcs":[[[663]],[[664,665]]]},{"type":"Polygon","id":"KOS","properties":{"name":"Kosovo"},"arcs":[[666,-14,667,668]]},{"type":"MultiPolygon","id":"KWT","properties":{"name":"Kuwait"},"arcs":[[[669]],[[670,-608,671]]]},{"type":"Polygon","id":"LAO","properties":{"name":"Lao PDR"},"arcs":[[672,-662,673,674,-280]]},{"type":"Polygon","id":"LBN","properties":{"name":"Lebanon"},"arcs":[[-621,675,67
 6]]},{"type":"Polygon","id":"LBR","properties":{"name":"Liberia"},"arcs":[[-298,677,678,-464]]},{"type":"Polygon","id":"LBY","properties":{"name":"Libya"},"arcs":[[-401,679,680,681,-383,682,683]]},{"type":"Polygon","id":"LKA","properties":{"name":"Sri Lanka"},"arcs":[[684]]},{"type":"Polygon","id":"LSO","properties":{"name":"Lesotho"},"arcs":[[685]]},{"type":"Polygon","id":"LTU","properties":{"name":"Lithuania"},"arcs":[[-112,686,687,688,689]]},{"type":"Polygon","id":"LUX","properties":{"name":"Luxembourg"},"arcs":[[-364,-444,-75]]},{"type":"Polygon","id":"LVA","properties":{"name":"Latvia"},"arcs":[[690,-113,-690,691,-423]]},{"type":"Polygon","id":"MAR","properties":{"name":"Morocco"},"arcs":[[-388,692,693]]},{"type":"Polygon","id":"MDA","properties":{"name":"Moldova"},"arcs":[[694,695]]},{"type":"Polygon","id":"MDG","properties":{"name":"Madagascar"},"arcs":[[696]]},{"type":"MultiPolygon","id":"MEX","properties":{"name":"Mexico"},"arcs":[[[697]],[[698]],[[699,700,701,702,703,-116,
 -502,704,705],[706]]]},{"type":"Polygon","id":"MKD","properties":{"name":"Macedonia"},"arcs":[[-98,-482,707,-15,-667,708]]},{"type":"Polygon","id":"MLI","properties":{"name":"Mali"},"arcs":[[709,-90,-300,-463,710,711,-385]]},{"type":"MultiPolygon","id":"MMR","properties":{"name":"Myanmar"},"arcs":[[[712]],[[713]],[[-675,714,715,-92,-595,-281]]]},{"type":"Polygon","id":"MNE","properties":{"name":"Montenegro"},"arcs":[[716,-668,-21,717,-19,718,-512,719]]},{"type":"Polygon","id":"MNG","properties":{"name":"Mongolia"},"arcs":[[-294,720,-292,721]]},{"type":"Polygon","id":"MOZ","properties":{"name":"Mozambique"},"arcs":[[722,723,724,725,726,727,728,729,730]]},{"type":"Polygon","id":"MRT","properties":{"name":"Mauritania"},"arcs":[[731,732,733,-386,-712]]},{"type":"Polygon","id":"MUS","properties":{"name":"Mauritius"},"arcs":[[734]]},{"type":"Polygon","id":"MWI","properties":{"name":"Malawi"},"arcs":[[735,-728,736,737]]},{"type":"MultiPolygon","id":"MYS","properties":{"name":"Malaysia"},"a
 rcs":[[[738,739]],[[-587,740,-147,741,-144,742]]]},{"type":"Polygon","id":"NAM","properties":{"name":"Namibia"},"arcs":[[743,-152,744,745,-8]]},{"type":"MultiPolygon","id":"NCL","properties":{"name":"New Caledonia"},"arcs":[[[746]],[[747]],[[748]]]},{"type":"Polygon","id":"NER","properties":{"name":"Niger"},"arcs":[[749,750,-85,-86,-710,-384,-682]]},{"type":"Polygon","id":"NGA","properties":{"name":"Nigeria"},"arcs":[[751,-306,752,-81,-751]]},{"type":"Polygon","id":"NIC","properties":{"name":"Nicaragua"},"arcs":[[753,-345,754,-507]]},{"type":"MultiPolygon","id":"NLD","properties":{"name":"Netherlands"},"arcs":[[[-78,755]],[[756]],[[-365,-80,757],[758]]]},{"type":"MultiPolygon","id":"NOR","properties":{"name":"Norway"},"arcs":[[[759]],[[760]],[[761]],[[762]],[[763]],[[764]],[[765]],[[766]],[[767,-433,768,769]],[[770]],[[771]],[[772]],[[773]],[[774]]]},{"type":"Polygon","id":"NPL","properties":{"name":"Nepal"},"arcs":[[-594,-284]]},{"type":"MultiPolygon","id":"NZL","properties":{"name
 ":"New Zealand"},"arcs":[[[775]],[[776]],[[777]]]},{"type":"MultiPolygon","id":"OMN","properties":{"name":"Oman"},"arcs":[[[778,779,-26,780]],[[-29,781]]]},{"type":"Polygon","id":"PAK","properties":{"name":"Pakistan"},"arcs":[[-642,-597,782,-603,-2,-287]]},{"type":"Polygon","id":"PAN","properties":{"name":"Panama"},"arcs":[[-336,783,-343,784]]},{"type":"Polygon","id":"PER","properties":{"name":"Peru"},"arcs":[[-140,-121,785,-119,-270,786,-395,-333]]},{"type":"MultiPolygon","id":"PHL","properties":{"name":"Philippines"},"arcs":[[[787]],[[788]],[[789]],[[790]],[[791]],[[792]],[[793]],[[794]],[[795]],[[796]],[[797]],[[798]],[[799]],[[800]],[[801]],[[802]],[[803]],[[804]],[[805]],[[806]]]},{"type":"MultiPolygon","id":"PN1","properties":{"name":"Papua New Guinea"},"arcs":[[[807]],[[808]],[[809]],[[810]],[[811]],[[812]],[[813]],[[814]],[[-569,815]],[[816]],[[817]],[[818]]]},{"type":"Polygon","id":"POL","properties":{"name":"Poland"},"arcs":[[819,-687,-111,820,821,-356,-361,822]]},{"type":
 "Polygon","id":"PRI","properties":{"name":"Puerto Rico"},"arcs":[[823]]},{"type":"Polygon","id":"PRK","properties":{"name":"Dem. Rep. Korea"},"arcs":[[824,825,-665,826,-275]]},{"type":"MultiPolygon","id":"PR1","properties":{"name":"Portugal"},"arcs":[[[827]],[[828]],[[829,-415]]]},{"type":"Polygon","id":"PRY","properties":{"name":"Paraguay"},"arcs":[[-139,830,-137,-32,-117]]},{"type":"MultiPolygon","id":"PSX","properties":{"name":"Palestine"},"arcs":[[[-397,831,-619]],[[-631,832,-615]]]},{"type":"Polygon","id":"PYF","properties":{"name":"Fr. Polynesia"},"arcs":[[833]]},{"type":"Polygon","id":"QAT","properties":{"name":"Qatar"},"arcs":[[834,835]]},{"type":"Polygon","id":"ROU","properties":{"name":"Romania"},"arcs":[[836,837,-100,838,-523,839,-695]]},{"type":"MultiPolygon","id":"RUS","properties":{"name":"Russia"},"arcs":[[[840]],[[841]],[[842]],[[843]],[[844]],[[845]],[[846]],[[-820,847,-688]],[[848]],[[849]],[[850]],[],[[851]],[[852]],[[853]],[],[[854]],[[855]],[[856]],[[857]],[[858
 ]],[[859]],[[860]],[[861]],[[862]],[[863]],[[864]],[[865]],[[-825,-274,866,-295,-722,-291,-651,867,-66,-460,868,869,-109,-691,-422,870,-420,871,-418,872,-430,-768,873]],[[874]],[[875]],[[876]],[[877]],[[878]],[[879]],[[880]],[[881]],[[882]],[[883]]]},{"type":"Polygon","id":"RWA","properties":{"name":"Rwanda"},"arcs":[[884,-73,-323,885,-321,886]]},{"type":"Polygon","id":"SAH","properties":{"name":"W. Sahara"},"arcs":[[-387,-734,887,-693]]},{"type":"Polygon","id":"SAU","properties":{"name":"Saudi Arabia"},"arcs":[[-671,888,-835,889,-27,-780,890,891,-628,-609]]},{"type":"Polygon","id":"SDN","properties":{"name":"Sudan"},"arcs":[[892,-404,-429,893,-153,894,-680,-400]]},{"type":"Polygon","id":"SDS","properties":{"name":"S. Sudan"},"arcs":[[-428,-657,895,-315,-154,-894]]},{"type":"Polygon","id":"SEN","properties":{"name":"Senegal"},"arcs":[[-711,-468,-472,896,-470,897,-732]]},{"type":"Polygon","id":"SGS","properties":{"name":"S. Geo. and S. Sandw. Is."},"arcs":[[898]]},{"type":"MultiPolyg
 on","id":"SLB","properties":{"name":"Solomon Is."},"arcs":[[[899]],[[900]],[[901]],[[902]],[[903]],[[904]],[[905]],[[906]],[[907]]]},{"type":"MultiPolygon","id":"SLE","properties":{"name":"Sierra Leone"},"arcs":[[[908]],[[-679,909,-465]]]},{"type":"Polygon","id":"SLV","properties":{"name":"El Salvador"},"arcs":[[-509,910,-500]]},{"type":"Polygon","id":"SOL","properties":{"name":"Somaliland"},"arcs":[[911,-425,-368,912]]},{"type":"Polygon","id":"SOM","properties":{"name":"Somalia"},"arcs":[[-652,-426,-912,913]]},{"type":"Polygon","id":"SRB","properties":{"name":"Serbia"},"arcs":[[-839,-99,-709,-669,-717,914,-515,-524]]},{"type":"Polygon","id":"STP","properties":{"name":"São Tomé and Principe"},"arcs":[[915]]},{"type":"Polygon","id":"SUR","properties":{"name":"Suriname"},"arcs":[[-439,-131,-503,916]]},{"type":"Polygon","id":"SVK","properties":{"name":"Slovakia"},"arcs":[[917,-526,-56,-357,-822]]},{"type":"Polygon","id":"SVN","properties":{"name":"Slovenia"},"arcs":[[-518,918,-62
 5,-58,-525]]},{"type":"MultiPolygon","id":"SWE","properties":{"name":"Sweden"},"arcs":[[[919]],[[920,-769,-432]]]},{"type":"Polygon","id":"SWZ","properties":{"name":"Swaziland"},"arcs":[[-724,921]]},{"type":"Polygon","id":"SYR","properties":{"name":"Syria"},"arcs":[[-611,-632,-622,-677,922,923]]},{"type":"Polygon","id":"TCD","properties":{"name":"Chad"},"arcs":[[-895,-158,-301,924,-307,-752,-750,-681]]},{"type":"Polygon","id":"TGO","properties":{"name":"Togo"},"arcs":[[-83,925,-461,-87]]},{"type":"MultiPolygon","id":"THA","properties":{"name":"Thailand"},"arcs":[[[926]],[[-674,-661,927,-740,928,-715]]]},{"type":"Polygon","id":"TJK","properties":{"name":"Tajikistan"},"arcs":[[-658,-288,-6,929]]},{"type":"Polygon","id":"TKM","properties":{"name":"Turkmenistan"},"arcs":[[-4,-602,930,-649,931,932,933]]},{"type":"MultiPolygon","id":"TLS","properties":{"name":"Timor-Leste"},"arcs":[[[934,-530]],[[-532,935]]]},{"type":"Polygon","id":"TTO","properties":{"name":"Trinidad and Tobago"},"arcs":
 [[936]]},{"type":"MultiPolygon","id":"TUN","properties":{"name":"Tunisia"},"arcs":[[[937]],[[-683,-382,938]]]},{"type":"MultiPolygon","id":"TUR","properties":{"name":"Turkey"},"arcs":[[[939,-483,-96]],[[-458,-41,-65,-606,-612,-924,940]]]},{"type":"Polygon","id":"TWN","properties":{"name":"Taiwan"},"arcs":[[941]]},{"type":"MultiPolygon","id":"TZA","properties":{"name":"Tanzania"},"arcs":[[[942]],[[943]],[[944,-654,945,-730,946,-738,947,948,-70,-885,949]]]},{"type":"Polygon","id":"UGA","properties":{"name":"Uganda"},"arcs":[[950,-950,-887,-320,951,-318,952,-316,-896,-656]]},{"type":"Polygon","id":"UKR","properties":{"name":"Ukraine"},"arcs":[[953,-837,-696,-840,-522,-918,-821,-110,-870],[954]]},{"type":"Polygon","id":"URY","properties":{"name":"Uruguay"},"arcs":[[955,-134,956,-34,-136]]},{"type":"MultiPolygon","id":"USA","properties":{"name":"United States"},"arcs":[[[957]],[[958]],[[959]],[[960]],[[961]],[[962]],[[963]],[[964]],[[965]],[[966,-201,967,-199,968,-197,969,-195,-165,970,-
 163,971,-703,972,-701,973,-706,974,-203]],[[975]],[[976]],[[977]],[[978]],[[979]],[[980]],[[981]],[[982]],[[983]],[[984]],[[985]],[[986]],[[987]],[[988]],[[989]],[[990]],[[991]],[[992]],[[993]],[[-205,994]]]},{"type":"Polygon","id":"UZB","properties":{"name":"Uzbekistan"},"arcs":[[-643,995,-646,-659,-930,-5,-934,996,-932,-648,997]]},{"type":"MultiPolygon","id":"VEN","properties":{"name":"Venezuela"},"arcs":[[[998]],[[-504,-142,-332,999]]]},{"type":"MultiPolygon","id":"VNM","properties":{"name":"Vietnam"},"arcs":[[[1000]],[[1001,-663,-673,-279]]]},{"type":"MultiPolygon","id":"VUT","properties":{"name":"Vanuatu"},"arcs":[[[1002]],[[1003]],[[1004]],[[1005]],[[1006]]]},{"type":"MultiPolygon","id":"WSM","properties":{"name":"Samoa"},"arcs":[[[1007]],[[1008]]]},{"type":"MultiPolygon","id":"YEM","properties":{"name":"Yemen"},"arcs":[[[1009]],[[1010,-891,-779]]]},{"type":"Polygon","id":"ZAF","properties":{"name":"South Africa"},"arcs":[[-725,-922,-723,1011,-745,-151,1012],[-686]]},{"type":"
 Polygon","id":"ZMB","properties":{"name":"Zambia"},"arcs":[[-948,-737,-727,1013,1014,1015,-744,-7,-327,1016,-325,1017]]},{"type":"Polygon","id":"ZWE","properties":{"name":"Zimbabwe"},"arcs":[[-726,-1013,-150,-1016,1018,-1014]]}]},"states":{"type":"GeometryCollection","geometries":[{"type":"Polygon","properties":{"name":"Manitoba"},"arcs":[[1019,1020,1021,1022,1023,1024]]},{"type":"Polygon","properties":{"name":"Saskatchewan"},"arcs":[[1025,1026,1027,1028,-1023]]},{"type":"Polygon","properties":{"name":"Alberta"},"arcs":[[-1028,1029,1030,1031]]},{"type":"MultiPolygon","properties":{"name":"British Columbia"},"arcs":[[[1032]],[[1033]],[[1034]],[[1035]],[[1036]],[[1037]],[[1038]],[[1039]],[[1040]],[[1041]],[[1042]],[[1043]],[[1044]],[[1045]],[[1046]],[[1047]],[[1048]],[[1049]],[[1050]],[[1051]],[[1052]],[[1053]],[[1054]],[[1055,1056,1057,1058,1059,1060,1061,-1031]]]},{"type":"MultiPolygon","properties":{"name":"Nunavut"},"arcs":[[[1062]],[[1063]],[[1064]],[[1065]],[[1066]],[[1067]],[[1
 068]],[[1069]],[[1070]],[[1071]],[[1072]],[[1073]],[[1074]],[[1075]],[[1076]],[[1077]],[[1078]],[[1079]],[[1080]],[[1081]],[[1082]],[[1083]],[[1084]],[[1085]],[[1086]],[[1087]],[[1088]],[[1089]],[[1090]],[[1091]],[[1092]],[[1093]],[[1094]],[[1095]],[[1096]],[[1097]],[[1098]],[[1099]],[[1100]],[[1101]],[[1102]],[[1103]],[[-1024,1104,1105]],[[1106]],[[1107,1108,1109,1110]],[[1111]],[[1112]],[[1113],[1114]],[[1115]],[[1116]],[[1117]],[[1118]],[[1119]],[[1120]],[[1121]],[[1122]],[[1123]],[[1124]],[[1125]],[[1126]],[[1127]],[[1128]],[[1129,1130]],[[1131]],[[1132]],[[1133]],[[1134]],[[1135]],[[1136,1137]],[[1138]],[[1139]],[[1140]],[[1141]],[[1142]],[[1143]]]},{"type":"MultiPolygon","properties":{"name":"Northwest Territories"},"arcs":[[[-1105,-1029,-1032,-1062,1144,1145]],[[1146,-1110]],[[-1108,1147]],[[1148]],[[1149]],[[-1130,1150]],[[1151]],[[1152]],[[1153]],[[1154]],[[-1137,1155]]]},{"type":"Polygon","properties":{"name":"Yukon"},"arcs":[[-1145,-1061,1156,1157]]},{"type":"MultiPolygon
 ","properties":{"name":"Ontario"},"arcs":[[[1158]],[[1159]],[[1160]],[[1161,1162]],[[1163,1164,1165,1166,1167,1168,1169,1170,1171,1172,1173,-1020,1174]]]},{"type":"MultiPolygon","properties":{"name":"Québec"},"arcs":[[[1175]],[[1176]],[[1177,1178,1179,1180,1181,1182]],[[1183]],[[1184,1185,-1164,1186,-1163,1187]]]},{"type":"MultiPolygon","properties":{"name":"New Brunswick"},"arcs":[[[1188]],[[1189,1190,1191,-1178,1192]]]},{"type":"MultiPolygon","properties":{"name":"Nova Scotia"},"arcs":[[[1193]],[[-1190,1194]],[[1195]]]},{"type":"MultiPolygon","properties":{"name":"Newfoundland and Labrador"},"arcs":[[[1196]],[[1197]],[[1198]],[[1199]],[[1200]],[[1201]],[[1202]],[[1203]],[[-1185,1204]]]},{"type":"Polygon","properties":{"name":"Prince Edward Island"},"arcs":[[1205]]},{"type":"MultiPolygon","properties":{"name":"Massachusetts"},"arcs":[[[1206]],[[1207]],[[1208,1209,1210,1211,1212,1213]]]},{"type":"Polygon","properties":{"name":"Minnesota"},"arcs":[[1214,1215,1216,1217,1218,-1021,-
 1174]]},{"type":"Polygon","properties":{"name":"Montana"},"arcs":[[1219,1220,1221,1222,-1056,-1030,-1027]]},{"type":"Polygon","properties":{"name":"North Dakota"},"arcs":[[-1219,1223,-1220,-1026,-1022]]},{"type":"MultiPolygon","properties":{"name":"Hawaii"},"arcs":[[[1224]],[[1225]],[[1226]],[[1227]],[[1228]],[[1229]]]},{"type":"Polygon","properties":{"name":"Idaho"},"arcs":[[-1223,1230,1231,1232,1233,1234,-1057]]},{"type":"MultiPolygon","properties":{"name":"Washington"},"arcs":[[[1235]],[[1236]],[[-1058,-1235,1237,1238]]]},{"type":"Polygon","properties":{"name":"Arizona"},"arcs":[[1239,1240,1241,1242,1243]]},{"type":"MultiPolygon","properties":{"name":"California"},"arcs":[[[1244]],[[1245]],[[-1242,1246,1247,1248]]]},{"type":"Polygon","properties":{"name":"Colorado"},"arcs":[[1249,1250,1251,1252,1253,1254]]},{"type":"Polygon","properties":{"name":"Nevada"},"arcs":[[-1243,-1249,1255,-1233,1256]]},{"type":"Polygon","properties":{"name":"New Mexico"},"arcs":[[1257,1258,-1240,-1252,12
 59]]},{"type":"Polygon","properties":{"name":"Oregon"},"arcs":[[-1238,-1234,-1256,-1248,1260]]},{"type":"Polygon","properties":{"name":"Utah"},"arcs":[[1261,-1253,-1244,-1257,-1232]]},{"type":"Polygon","properties":{"name":"Wyoming"},"arcs":[[1262,-1254,-1262,-1231,-1222,1263]]},{"type":"Polygon","properties":{"name":"Arkansas"},"arcs":[[1264,1265,1266,1267,1268,1269]]},{"type":"Polygon","properties":{"name":"Iowa"},"arcs":[[1270,1271,1272,1273,-1217,1274]]},{"type":"Polygon","properties":{"name":"Kansas"},"arcs":[[1275,-1250,1276,1277]]},{"type":"Polygon","properties":{"name":"Missouri"},"arcs":[[1278,1279,1280,-1270,1281,-1278,1282,-1272]]},{"type":"Polygon","properties":{"name":"Nebraska"},"arcs":[[-1273,-1283,-1277,-1255,-1263,1283]]},{"type":"Polygon","properties":{"name":"Oklahoma"},"arcs":[[-1269,1284,-1260,-1251,-1276,-1282]]},{"type":"Polygon","properties":{"name":"South Dakota"},"arcs":[[-1218,-1274,-1284,-1264,-1221,-1224]]},{"type":"MultiPolygon","properties":{"name":"Lo
 uisiana"},"arcs":[[[1285]],[[1286]],[[1287,1288,-1267,1289]]]},{"type":"Polygon","properties":{"name":"Texas"},"arcs":[[-1268,-1289,1290,-1258,-1285],[1291]]},{"type":"Polygon","properties":{"name":"Connecticut"},"arcs":[[1292,1293,1294,-1211]]},{"type":"Polygon","properties":{"name":"New Hampshire"},"arcs":[[1295,-1214,1296,-1180,1297]]},{"type":"MultiPolygon","properties":{"name":"Rhode Island"},"arcs":[[[1298]],[[1299,-1293,-1210]]]},{"type":"Polygon","properties":{"name":"Vermont"},"arcs":[[-1213,1300,-1181,-1297]]},{"type":"Polygon","properties":{"name":"Alabama"},"arcs":[[1301,1302,1303,1304,1305]]},{"type":"MultiPolygon","properties":{"name":"Florida"},"arcs":[[[1306]],[[1307]],[[1308]],[[1309,-1303,1310]]]},{"type":"Polygon","properties":{"name":"Georgia"},"arcs":[[1311,-1311,-1302,1312,1313,1314]]},{"type":"Polygon","properties":{"name":"Mississippi"},"arcs":[[-1305,1315,-1290,-1266,1316]]},{"type":"Polygon","properties":{"name":"South Carolina"},"arcs":[[1317,-1315,1318]]}
 ,{"type":"Polygon","properties":{"name":"Illinois"},"arcs":[[1319,1320,1321,-1279,-1271,1322]]},{"type":"Polygon","properties":{"name":"Indiana"},"arcs":[[1323,1324,-1321,1325,1326]]},{"type":"Polygon","properties":{"name":"Kentucky"},"arcs":[[1327,1328,1329,-1280,-1322,-1325,1330]]},{"type":"MultiPolygon","properties":{"name":"North Carolina"},"arcs":[[[1331,1332]],[[1333,-1319,-1314,1334,1335],[-1338,-1337]]]},{"type":"Polygon","properties":{"name":"Ohio"},"arcs":[[1338,-1331,-1324,1339,1340,1341]]},{"type":"Polygon","properties":{"name":"Tennessee"},"arcs":[[1342,-1335,-1313,-1306,-1317,-1265,-1281,-1330]]},{"type":"MultiPolygon","properties":{"name":"Virginia"},"arcs":[[[1343]],[[1344,1345]],[[1346,1347]],[[1348,1349,1350,-1332,1351,1337,-1336,-1343,-1329,1352]]]},{"type":"Polygon","properties":{"name":"Wisconsin"},"arcs":[[1353,1354,-1323,-1275,-1216,1355]]},{"type":"Polygon","properties":{"name":"West Virginia"},"arcs":[[1356,-1353,-1328,-1339,1357]]},{"type":"Polygon","proper
 ties":{"name":"Delaware"},"arcs":[[1358,1359,1360,1361]]},{"type":"Polygon","properties":{"name":"District of Columbia"},"arcs":[[1362,-1350,1363]]},{"type":"MultiPolygon","properties":{"name":"Maryland"},"arcs":[[[-1347,1364]],[[1365,1366]],[[-1361,1367,-1345,1368,-1364,-1349,-1357,1369]]]},{"type":"Polygon","properties":{"name":"New Jersey"},"arcs":[[1370,1371,1372]]},{"type":"MultiPolygon","properties":{"name":"New York"},"arcs":[[[1373]],[[1374]],[[-1182,-1301,-1212,-1295,1375,-1372,1376,1377,-1168,1378,-1166]]]},{"type":"Polygon","properties":{"name":"Pennsylvania"},"arcs":[[-1371,1379,-1362,-1370,-1358,-1342,1380,-1377]]},{"type":"MultiPolygon","properties":{"name":"Maine"},"arcs":[[[1381]],[[1382,-1298,-1179,-1192]]]},{"type":"MultiPolygon","properties":{"name":"Michigan"},"arcs":[[[-1170,1383,-1340,-1327,1384]],[[1385]],[[-1172,1386,-1354,1387]],[[1388]]]},{"type":"MultiPolygon","properties":{"name":"Alaska"},"arcs":[[[1389]],[[1390]],[[1391]],[[1392]],[[1393]],[[1394]],[[13
 95]],[[1396]],[[1397]],[[1398]],[[1399]],[[1400]],[[1401]],[[1402]],[[1403]],[[1404]],[[1405]],[[1406]],[[1407]],[[1408]],[[1409]],[[1410]],[[1411]],[[1412]],[[1413]],[[1414]],[[1415]],[[1416]],[[1417]],[[1418]],[[1419]],[[1420]],[[1421]],[[1422]],[[1423]],[[1424]],[[1425]],[[1426]],[[1427]],[[1428]],[[1429]],[[1430]],[[1431]],[[1432]],[[1433]],[[1434]],[[1435]],[[1436]],[[1437]],[[1438]],[[1439]],[[1440]],[[-1157,-1060,1441]]]}]}},"arcs":[[[7082,6666],[-5,5],[-10,-13],[5,-7]],[[7072,6651],[-13,-14],[-12,5],[-30,-6],[-10,-6],[-13,-24],[-3,4],[-13,-29],[5,-7],[7,-29],[-2,-18],[3,-7],[-5,-19],[-10,-19],[-3,-15],[4,-8],[-2,-22],[-5,-6],[-10,-2],[-14,8],[-5,-8],[4,-13],[4,-2],[5,-29],[-8,-13],[-13,-5],[-3,-29],[-6,-18],[2,-35],[-8,-20],[-6,-3],[-3,12],[-5,-4],[-9,7],[-4,-10],[-12,-18],[4,-7],[-11,-9],[-11,8],[-7,-9],[-4,-16],[-5,-4],[-3,-23],[2,-11],[-3,-29],[3,-6],[-4,-9],[-32,-21],[-16,2],[-11,-13],[-14,8],[-30,-6],[-46,32]],[[6691,6136],[27,70],[1,14],[-5,25],[-23,9],[-1,38],[1,16],[
 -7,53],[0,12],[8,28],[-10,7],[0,32],[6,30],[6,9],[4,13],[1,33],[4,25]],[[6703,6550],[8,-12],[13,-2],[8,-20],[4,10],[5,-5],[13,16],[-1,13],[8,17],[25,21],[10,22],[0,12],[5,23],[-1,11],[9,10],[12,1],[4,20],[4,3],[14,-17],[6,2]],[[6849,6675],[14,2],[6,-14],[7,6],[8,-6]],[[6884,6663],[7,-19],[7,6],[1,7],[14,15],[5,-1],[7,-14],[5,9],[-2,15],[5,10],[10,3],[7,-6],[4,12],[-3,17],[8,14],[8,22],[8,-3],[8,-9],[-2,-25],[9,-2],[-3,-24],[-2,-36],[5,-26],[7,0],[12,19],[11,4],[2,12],[15,19],[13,-2],[1,-14],[12,12],[12,-1],[7,-11]],[[5667,3209],[3,-38],[-3,-16],[0,-41],[2,-14],[-5,-29],[4,-15],[-56,0],[0,-98],[0,-130],[4,-27],[6,-9],[12,-35],[6,-10],[6,-17],[5,-8]],[[5651,2722],[-56,-26],[-4,6],[-12,-8],[-13,13],[-8,-3],[-10,4],[-18,1],[-7,6],[-9,26],[-59,0],[-35,0],[-31,-2],[-12,21],[-1,7],[-9,5],[-8,-6],[-9,-14],[-8,0],[-6,6],[-8,-8]],[[5328,2750],[2,56],[-2,49],[7,13],[1,27],[6,35],[2,23],[0,24],[5,18],[0,29],[12,33],[0,12],[7,16],[5,0],[7,25],[5,34],[0,31],[1,17],[-3,33],[-6,19],[0,8],[-9,41],[-
 1,22],[-5,22],[6,20],[5,4],[0,31],[-3,10],[-12,66],[-1,23],[-5,15],[-9,42],[18,12],[7,9]],[[5368,3569],[42,-1],[45,1],[5,-2],[6,-22],[-1,-15],[2,-22],[5,-13],[2,-29],[2,-3],[13,-54],[10,3],[5,-5],[2,8],[33,0],[0,31],[4,7],[1,34],[21,0],[1,6],[8,0],[-3,-26],[36,0],[1,-22],[-2,-31],[2,-9],[3,-26],[-2,-25],[-1,-55],[9,-23],[4,-31],[0,-29],[-4,-6],[3,-22],[7,9],[14,-5],[13,10],[9,-4],[4,11]],[[5365,3657],[-7,-6],[-4,-15],[-7,-9],[3,-8],[-1,-40],[-8,-3]],[[5341,3576],[-2,10],[2,10],[-6,33]],[[5335,3629],[5,19],[4,0],[2,11],[6,3],[7,12],[6,-17]],[[5559,7048],[4,-16],[8,-8],[2,-25]],[[5573,6999],[-3,-39],[5,-17],[2,-13],[6,0]],[[5583,6930],[1,-3],[0,-1],[0,-4]],[[5584,6922],[1,-7],[0,-1],[-5,-16],[-5,-27],[-9,-7],[2,-11],[-6,-14],[-5,4]],[[5557,6843],[0,11],[-4,14],[-13,18],[3,11],[-5,14],[6,22],[-3,14],[4,48],[-6,3]],[[5539,6998],[1,17]],[[5540,7015],[0,17]],[[5540,7032],[9,24],[3,-14],[7,6]],[[5555,8329],[10,-7],[-8,-13],[-7,0],[-3,12],[8,8]],[[5049,7045],[-7,-5],[-1,11]],[[5041,7051],[8
 ,-6]],[[6565,5832],[2,-7],[1,-40]],[[6568,5785],[-8,-17],[-9,8],[1,-37],[5,-18],[-15,-9],[2,-14],[-10,-55],[0,-21]],[[6534,5622],[-2,-6],[-27,8],[-43,14],[-1,2],[-26,81],[-1,12]],[[6434,5733],[6,-1],[1,-17],[14,0],[7,11],[28,-8],[7,1],[15,14],[6,18],[3,22],[10,15],[13,38],[9,12],[6,25]],[[6559,5863],[3,-3],[-1,-26],[4,-2]],[[3094,53],[0,77],[0,77]],[[3094,207],[10,-24],[-7,-10],[2,-13],[10,-3],[3,-19],[19,-32],[15,-14],[8,-16],[18,-13],[19,1],[-5,-20],[-15,1],[-19,-11],[-13,11],[-45,8]],[[3260,2392],[10,-18],[10,-39],[13,-27],[10,-14],[3,-15],[19,-15],[8,1],[16,-25],[3,-10],[15,-20],[16,-12],[13,-17],[6,-20],[-6,-16],[-3,-24],[-8,-19],[-2,-35],[-12,-28],[4,-9],[14,1],[23,-16],[8,5],[4,-7],[6,4],[5,-9],[7,20],[10,-10],[4,8],[0,12],[5,12],[8,3],[7,21],[3,1],[4,33],[-1,15],[2,29]],[[3484,2152],[5,-5],[3,7],[11,-6],[2,-24],[5,-18],[-2,-34],[1,-13],[-4,-21],[-3,1],[-9,-20],[-17,-14],[-4,-15],[-8,-6],[-3,-12],[-10,-11],[-7,-25],[-7,-14],[-3,-20],[-6,-7],[-2,-11],[-11,-32],[-6,-4],[-1,-12]
 ,[-8,-15]],[[3400,1821],[-6,-22],[1,-30],[-3,-24],[-5,-17],[3,-5],[-2,-19],[-3,-2],[-1,-22],[3,-12],[-3,-10]],[[3384,1658],[1,-43],[-6,-2],[-5,-43],[5,-25],[-3,-36],[9,-16],[8,-6],[10,-13],[7,-17],[3,-17],[-5,-17],[-1,-19],[3,-13],[9,-14],[7,-2],[1,-33],[-11,-40],[-13,-33],[-2,-21],[-16,-20],[-25,-18],[-50,-21],[-18,-2],[-14,5],[-4,9],[-6,0],[2,-33],[8,-7],[-3,-33],[-5,-3],[-2,-25],[-3,-6],[7,-27],[-3,-14],[-21,-20],[-19,-1],[-27,24],[-5,9],[-7,-22],[5,-39],[-2,-31],[6,-15],[10,-4],[-3,-12],[13,-1],[-1,16],[10,10],[6,-20],[-1,-29],[-13,-10],[-6,25],[-8,2],[-9,-10],[-2,-9],[19,-17],[-12,-10],[-16,-37],[3,-27],[-2,-14],[2,-9],[-4,-13],[-8,-9],[0,-27],[-15,4],[-8,-6],[-1,-10],[-10,-2],[-13,-27],[-8,-39],[6,-29],[8,-10],[10,-22],[16,-6],[6,2],[6,-10],[1,-22],[-5,-19],[-2,-23],[-4,-3],[-10,-19],[-5,-2],[-13,-18],[-2,-10],[-10,-14],[-5,-19],[4,-3],[-7,-46],[-6,-9],[-23,-18],[-5,-16],[-3,-30],[7,-48],[7,-26],[9,-22],[-3,-3]],[[3099,228],[0,4],[-41,21],[-55,1],[-1,9],[-9,12],[-2,16],[3,18],
 [-2,41],[-13,2],[-11,-9],[-4,35],[-6,9],[2,27],[-3,17],[3,16],[9,0],[4,23],[11,14],[1,24],[8,9],[-2,19],[-5,11],[10,36],[9,17],[-4,10],[2,17],[6,8],[-2,41],[4,11],[-5,16],[1,12],[7,4],[6,16],[-8,23],[-13,5],[0,11],[16,1],[4,-4],[6,19],[-2,7],[-17,2],[-1,21],[5,13],[-4,13],[2,11],[-6,10],[6,19],[-11,14],[0,29],[3,8],[-3,16],[3,9],[8,4],[-5,33],[2,49],[-3,16],[8,27],[-4,10],[5,22],[-2,12],[8,28],[0,29],[15,18],[-3,19],[-1,26],[-5,26],[2,18],[-2,11],[3,14],[-3,19],[4,25],[9,5],[1,11],[9,16],[-1,39],[-4,21],[5,3],[4,42],[5,22],[6,2],[-2,21],[0,21],[3,20],[-6,6],[-3,19],[3,12],[-4,7],[-1,22],[-4,13],[-3,30],[-4,23],[3,32],[3,-1],[4,43],[9,15],[1,13],[-3,3],[1,27],[-3,25],[7,19],[1,33],[3,17],[13,34],[5,35],[6,24],[6,-4],[7,9],[0,12],[-7,23],[0,18],[4,9],[-5,53],[2,18],[5,6],[-6,24],[2,11],[7,17],[25,25],[9,74],[-5,13]],[[3134,2350],[5,22],[7,6],[1,15],[10,7],[4,24],[4,-3],[9,-20],[21,1],[12,-8],[8,-40],[9,55],[32,0],[4,-17]],[[6251,6958],[4,-16],[13,-15],[-6,-14],[4,-17],[13,-15],[-6,-22
 ],[12,-24],[9,-3],[-4,-12],[5,-10],[-3,-9],[1,-17]],[[6293,6784],[-10,-1]],[[6283,6783],[-5,29],[-5,6],[0,14],[-10,-4],[-11,20],[-7,-5]],[[6245,6843],[-9,20],[-11,2],[-9,12],[-5,21],[5,15],[-3,21],[-5,10]],[[6208,6944],[8,0],[13,9],[10,-4],[12,9]],[[6918,483],[6,-23],[14,-13],[10,13],[12,2],[-1,-19],[-13,0],[-5,-12],[13,0],[-5,-13],[-21,10],[-16,-10],[3,20],[-4,27],[7,18]],[[9023,1063],[27,-14],[2,-6],[17,-11],[17,13],[12,-2],[4,12],[6,-4],[5,12],[9,-19],[-2,-58],[-6,-33],[-4,-42],[-8,2],[-7,-8],[-11,-39],[-1,-10],[-6,-1],[-12,10],[-7,-5],[0,17],[-5,2],[-4,17],[-5,7],[-7,25],[0,25],[3,2],[-4,19],[-8,19],[-9,51],[4,19]],[[9112,1136],[10,-18],[0,-19],[-5,-3],[-7,17],[2,23]],[[9004,1112],[-4,-6],[-2,31],[6,6],[2,-27],[-2,-4]],[[8825,1433],[-1,-10],[13,-3],[0,-11],[-8,3],[-9,-15],[-6,8],[-14,-6],[-5,10],[1,11],[21,13],[8,0]],[[9264,2024],[-2,21],[3,1],[-1,-22]],[[8139,2159],[5,-29],[-3,-4],[-3,22],[1,11]],[[9260,2213],[2,-20],[-8,-47],[-3,8],[3,16],[-1,10],[5,12],[-1,15],[3,6]],[[8883,2
 808],[-11,-20],[-5,2],[4,17],[9,5],[3,-4]],[[8800,3007],[2,-12],[-4,-31],[-5,5],[0,27],[7,11]],[[8624,3166],[3,-27],[-8,14],[-1,15],[6,-2]],[[8627,3180],[2,-9],[12,3],[8,12],[4,-4],[3,-16],[-7,-18],[-9,-15],[-13,20],[-4,30],[4,-3]],[[8962,3221],[0,-10],[5,-10],[4,-29],[-2,-7],[2,-26],[9,-10],[-4,-25],[5,-4],[5,-16],[-1,-17],[3,-1],[1,-34],[2,-14],[-2,-16],[4,-19],[3,-28],[5,-7],[14,19],[3,-2],[3,-21],[6,-4],[4,-14],[5,-2],[1,-50],[3,-27],[3,-11],[-2,-27],[13,-43],[8,-43],[-4,-38],[0,-7],[9,-19],[-2,-25],[5,-13],[8,-9],[5,-9],[4,4],[2,-12],[9,1],[6,-31],[11,-3],[6,-7],[0,-8],[9,-6],[7,-13],[-6,-15],[6,-20],[10,-18],[7,-46],[-1,-5],[5,-32],[6,-10],[6,17],[5,-18],[7,-9],[3,14],[5,-11],[2,-16],[-2,-33],[1,-18],[22,-47],[2,6],[7,-17],[6,-29],[8,-9],[7,-36],[7,-3],[1,-15],[-2,-14],[9,-19],[-4,-23],[2,-47],[-2,-27],[5,-12],[5,-24],[-1,-11],[5,-22],[1,-43],[-4,-12],[-3,-21],[-1,-27],[-9,-75],[2,-11],[-4,-42],[-5,-26],[-7,-23],[1,-20],[-9,-15],[-3,-11],[-7,-5],[-12,-47],[-3,-4],[-1,-27],[-10
 ,-27],[0,-19],[-6,-34],[-15,-59],[0,-31],[-7,-44],[3,-21],[-1,-19],[-5,-4],[-9,-17],[-32,-3],[-11,-7],[-9,-11],[-20,-41],[-19,-8],[3,-11],[5,-1],[-2,-15],[-9,22],[-5,-6],[-5,19],[-4,-1],[-4,17],[1,13],[-10,6],[-4,19],[-12,-14],[5,-5],[-2,-9],[-7,-1],[-9,-14],[-6,-14],[-9,-12],[-13,16],[-7,4],[-11,15],[-5,-3],[-8,9],[-8,0],[-3,-11],[-11,22],[-12,4],[-10,14],[-3,15],[-7,13],[-7,22],[-2,17],[5,13],[0,10],[-11,53],[-14,25],[-12,-7],[-10,-2],[-1,8],[8,15],[3,44],[-7,21],[-7,10],[-10,-63],[-7,4],[-7,-8],[-9,-1],[6,25],[11,-1],[2,21],[-2,33],[4,21],[10,25],[-4,19],[6,8],[-3,26],[-13,-25],[-6,-37],[-17,-18],[-7,-12],[-4,-17],[-8,-17],[-3,-24],[-6,0],[-8,14],[2,15],[-4,34],[-11,26],[-1,20],[-3,14],[-12,0],[-6,32],[7,3],[-5,16],[-8,15],[-8,5],[-11,-2],[-10,18],[-6,1],[-10,-7],[-19,31],[-10,9],[-10,-9],[-18,2],[-33,-8],[-27,-28],[-20,-14],[-17,-3],[-14,6],[-8,-7],[-10,-16],[-15,-13],[-8,-12],[-9,-4],[-7,-12],[-5,-32],[-12,-27],[-5,3],[-5,-7],[-2,9],[-21,-4],[-4,-7],[-5,14],[-5,-5],[-8,6],[-27,
 -5],[-4,-6],[-11,3],[-10,-11],[-7,-27],[-5,-5],[-9,6],[-6,-15],[-7,-5],[-2,-13],[-20,-10],[-2,-7],[-7,8],[-20,-2],[-15,16],[-13,28],[-8,9],[-6,-2],[-4,19],[-1,29],[14,6],[7,23],[-3,44],[4,15],[0,38],[-1,20],[-14,59],[-6,44],[-1,40],[1,13],[-4,28],[-7,22],[-1,18],[-11,30],[0,30],[-4,27],[-12,46],[-8,20],[5,14],[5,-27],[5,-1],[2,18],[-6,9],[-7,35],[3,8],[6,-20],[-1,-18],[5,2],[6,-23],[4,43],[-3,4],[-12,48],[-3,28],[-5,14],[0,35],[5,30],[4,9],[0,25],[2,8],[-5,34],[4,17],[8,12],[3,-11],[6,-3],[7,37],[8,11],[14,13],[10,20],[4,13],[7,15],[6,2],[9,15],[4,-7],[7,8],[6,-9],[11,5],[11,21],[6,0],[13,7],[7,20],[4,2],[10,-8],[7,7],[12,5],[20,19],[7,12],[9,29],[3,25],[8,18],[11,23],[1,11],[-5,4],[-1,27],[1,22],[3,12],[5,8],[3,14],[6,2],[-1,11],[4,7],[7,-22],[7,-37],[5,-2],[2,13],[-2,13],[6,0],[-6,24],[2,21],[-2,15],[5,0],[4,-13],[6,5],[3,-9],[5,5],[-1,8],[6,9],[-6,29],[3,16],[6,-1],[-1,16],[7,-6],[2,15],[4,7],[6,-9],[1,10],[-5,6],[-1,15],[3,11],[6,6],[10,-4],[5,3],[-1,9],[4,13],[3,-2],[3,13],[4,3
 ],[2,-14],[7,15],[-2,14],[6,5],[5,-18],[5,5],[9,-20],[4,-13],[11,-24],[-3,-31],[12,27],[15,-9],[5,2],[10,-7],[4,11],[-4,16],[-7,12],[4,23],[6,5],[4,36],[8,4],[3,13],[-3,9],[0,15],[5,3],[1,17],[6,7],[1,13],[6,-4],[5,20],[9,-1],[5,-9],[11,6],[4,-6],[5,7],[6,-2],[5,14],[-1,30],[-6,13],[-8,-6],[-4,20],[7,8],[8,-7],[6,-20],[7,11],[7,-26],[12,-8],[5,8],[4,-14],[3,4],[4,-11],[2,3],[9,-7],[5,9],[2,-13],[6,-10],[10,11],[5,11],[3,-26],[5,12],[4,-22],[6,1],[3,13],[-5,5],[7,18],[7,-24],[5,4],[2,-11],[-6,-7],[-1,-14],[-5,-13],[4,-8],[-6,-19],[-4,4],[-9,-5],[-2,-6],[-1,-20],[4,-14],[-3,-29],[-4,-5],[-10,-32],[2,-17],[22,-34],[0,-9],[14,-25],[6,2],[11,-18],[10,-10],[4,-13],[9,-19],[13,-6],[10,-9],[7,-32],[20,-25],[14,5],[9,13],[7,47],[3,7],[7,46],[-2,9],[3,33],[5,33],[-4,38],[2,30],[-3,9],[1,27],[5,24],[-3,19],[5,11],[1,17],[-6,4],[11,51],[4,34],[1,30],[5,2],[6,14]],[[5472,7483],[-3,-17],[9,-26]],[[5478,7440],[-4,-10],[2,-11],[-13,-6],[1,-13],[-6,-7],[2,-22],[-11,-13]],[[5449,7358],[-4,-9],[-14,-9
 ],[-11,3],[-16,-17],[-22,7]],[[5382,7333],[-13,3],[-23,10],[-7,16],[-1,11],[-10,-7],[-12,1],[-9,-16],[-15,7]],[[5292,7358],[-3,9],[-7,-10],[-7,12],[-7,3],[-2,15],[1,18]],[[5267,7405],[4,2]],[[5271,7407],[7,-2],[10,-15],[3,17],[5,1],[10,-12],[8,1],[10,13],[15,1],[1,6],[15,-1],[7,13],[-7,19],[19,19],[3,15],[5,-5],[3,18]],[[5385,7495],[7,-13],[11,4],[7,-4],[6,12],[2,18],[7,-2],[23,-17],[10,4],[12,-6],[2,-8]],[[6283,6783],[-19,10],[-3,12],[-5,3],[-10,31]],[[6246,6839],[-1,4]],[[6291,7001],[9,-3],[14,-40],[17,-6],[5,18],[9,8],[6,19]],[[6351,6997],[13,-31],[4,-25],[9,-20],[2,-11],[13,-3],[8,-16],[-13,0],[-12,-21],[-1,-26],[-3,-6],[-3,-44],[-6,12],[-3,-23],[0,-31]],[[6359,6752],[-7,-3],[-6,16],[-11,15],[1,9],[7,7],[-5,18],[6,6],[-8,20],[-6,2],[-27,-37],[-10,-21]],[[6251,6958],[7,11],[6,-1],[14,-19],[7,2],[8,-11],[5,16],[-11,17],[-3,11],[7,17]],[[5850,3818],[-4,-18],[0,-15],[11,-13],[0,-17],[-9,-17],[-9,-41],[-4,-14],[-10,-13]],[[5825,3670],[-9,50],[1,26],[-4,5]],[[5813,3751],[0,20],[-6,17]
 ,[0,7]],[[5807,3795],[4,9],[4,-5],[1,-12],[10,1],[6,12],[1,24],[6,-8],[6,9],[5,-7]],[[5168,7637],[10,-27],[-7,-18]],[[5171,7592],[-3,4],[-8,-21],[5,-17],[-3,-8]],[[5162,7550],[-8,-3],[-2,8],[-13,14],[-5,13],[-9,-3],[-7,9],[-5,20],[-8,0],[-7,13],[-6,0],[-3,18],[-10,-4],[-6,9],[-1,18]],[[5072,7662],[23,20]],[[5095,7682],[1,-9],[11,-3],[12,12]],[[5119,7682],[1,0]],[[5120,7682],[14,9],[12,-17],[7,2],[11,-11],[-6,-20],[10,-8]],[[5101,4831],[-3,-22],[7,-20],[0,-21],[3,-16],[-2,-14],[-5,-9],[2,-8],[-4,-23],[-5,-5],[0,-7],[-6,-18],[-1,-22],[-9,-5],[-1,-20],[0,-41],[-1,-23],[1,-7],[2,-55],[-2,-3],[0,-44]],[[5077,4448],[-23,-7],[-8,-4]],[[5046,4437],[5,4],[-6,29],[2,23],[0,72],[-1,76],[-5,16],[-2,23],[-1,29],[-15,26],[0,24],[4,21]],[[5027,4780],[7,21],[3,-2],[4,16],[5,-6],[11,2],[8,18],[3,16]],[[5068,4845],[2,8],[-3,15],[14,13],[18,-41],[2,-9]],[[5008,5062],[-2,-26],[6,-22],[-1,-9],[8,-32],[9,-7],[0,-37],[16,-30],[8,-3],[8,7],[4,-17],[-5,-11],[9,-30]],[[5027,4780],[-12,1],[-18,9]],[[4997,4790
 ],[-4,2],[-6,-12],[-16,2],[-47,-2],[-5,-27],[5,-25],[0,-31],[-1,-8],[3,-17]],[[4926,4672],[-2,-7],[-11,32],[-14,8],[-17,-15],[-2,-9],[-17,21],[0,8],[-4,19],[-9,1],[-3,9]],[[4847,4739],[3,31],[-2,15],[5,5],[3,21],[-3,13],[1,17],[3,8],[10,3],[7,11],[10,48],[-4,22],[7,19],[8,-3],[6,-10],[9,6],[0,27],[10,-1],[-1,11],[3,17],[10,17],[9,-8],[3,3],[2,20],[7,1],[10,16],[9,7],[8,18],[15,0],[13,-11]],[[7524,5582],[-7,33],[2,13],[6,-26],[-1,-20]],[[7573,5570],[0,-35],[-2,-10],[-5,8],[-4,-11],[2,-18]],[[7564,5504],[-6,6],[-2,20],[1,12],[-5,47],[-8,33],[-3,7],[-5,-16],[-8,0],[-5,14],[-7,9],[-1,-13],[3,-29],[-8,-20],[-4,-17],[-8,7],[-6,-11],[-8,-2],[-8,7],[-1,23]],[[7475,5581],[-6,60],[3,15],[-7,4],[1,17],[-5,13],[1,15],[4,5],[0,26],[-7,2],[-9,13],[-4,10],[5,22],[3,-6],[4,22],[13,0],[-4,24],[-7,0],[-12,29],[2,17],[4,4],[5,18],[5,-2],[4,-14],[7,11],[2,-18],[12,-12],[4,14],[4,-16],[-1,-40],[15,-16],[13,-1],[12,4],[6,-5],[15,4],[7,-20],[-4,-36],[-5,-2],[-6,-15],[-10,-5],[-4,-14],[-2,-21],[4,-22],[5,-
 9],[3,-15],[6,9],[-1,13],[5,16],[-1,11],[7,6],[6,-32],[0,-24],[4,-19],[2,-51]],[[5795,7134],[1,-15],[-4,-11],[-8,2],[-8,-29],[0,-21],[-7,-11],[3,-21],[8,-21]],[[5780,7007],[-14,-5],[-7,13],[-20,-12],[-6,-15]],[[5733,6988],[-8,-2],[2,-24],[-16,-3],[-7,-5],[-11,11],[-8,3],[-3,9],[-7,0],[-18,-14],[-9,2],[-10,-4]],[[5638,6961],[3,27],[-5,22],[-9,8],[-5,13]],[[5622,7031],[5,7],[-3,12],[3,21],[6,1],[7,23],[-13,19],[-5,24],[2,14],[8,17]],[[5632,7169],[9,-10],[-3,-19],[11,4],[24,-10],[9,4],[24,-11],[12,6],[10,20],[24,12],[10,-12],[15,-1],[2,-11],[16,-7]],[[2972,5511],[-3,-12],[-14,-6],[-2,8],[9,15],[4,-7],[6,2]],[[2841,5724],[4,7],[2,-26],[-1,-9],[-7,10],[-2,17],[4,1]],[[2831,5799],[10,-34],[1,-16],[-9,-13],[-4,12],[-7,12],[4,7],[5,32]],[[2820,5911],[6,-8],[-10,-9],[-2,6],[6,11]],[[5525,7215],[-3,-18],[8,-10],[-8,-9],[0,-17],[-6,-9],[-4,-40],[-10,0],[1,-40],[9,-22]],[[5512,7050],[-20,23]],[[5492,7073],[-2,3]],[[5490,7076],[0,10],[-38,81],[-3,23],[-9,23],[0,23],[6,4],[9,-15],[4,13],[9,-1],[4
 ,8],[25,-16],[11,6],[11,-4],[6,-16]],[[5783,8025],[4,-7],[9,3],[6,-11],[6,6],[9,-5],[3,-19],[11,10],[17,-2],[12,-28],[-3,-9],[6,-19],[-7,-17],[11,-11],[5,-29],[13,-12],[-2,-19],[10,1],[10,-7],[0,-12],[7,-7],[-8,-18],[-9,-8],[-19,8],[-5,-13],[8,-12],[1,-38],[6,-16]],[[5884,7734],[-23,-2],[-12,-33],[3,-20],[-2,-7],[-11,18],[-15,0],[-8,-8],[-6,18],[-21,-7],[-24,7],[-7,-2],[-2,11],[-9,0],[-30,13],[-16,2],[-22,-5],[-11,-22],[-7,5],[-4,-10]],[[5657,7692],[-2,7],[4,28],[-14,21],[6,16],[13,11],[1,35],[-8,33],[-3,23]],[[5654,7866],[20,1],[5,-4],[13,18],[6,-1],[13,16],[5,16],[2,21],[10,7],[4,13],[8,-2],[6,11],[-10,5],[4,24]],[[5740,7991],[11,11],[17,-2],[9,22],[6,3]],[[2548,5318],[6,-11],[0,-15],[-6,-38],[2,-6],[-2,-23],[2,-16],[-2,-22],[-7,-27],[-3,1],[-7,-22],[0,-7]],[[2531,5132],[-9,0],[2,83],[0,55]],[[2524,5270],[3,14],[5,-8],[7,25],[4,18],[5,-1]],[[3385,2541],[0,25],[-26,38],[-25,-1],[-49,-25],[-5,-33],[-9,-34],[0,-35],[-11,-84]],[[3134,2350],[-10,-5],[-9,4],[1,19],[-4,37],[-3,8],[-3,27]
 ,[0,21],[-6,23],[-4,6],[2,18],[-5,8],[-3,30],[5,3],[1,14],[-4,8],[6,21],[-14,37],[1,6],[-5,52],[-10,45]],[[3070,2732],[-4,16],[6,14],[11,39]],[[3083,2801],[5,6],[7,18],[-7,2],[-4,27],[-7,10],[-3,11]],[[3074,2875],[6,20],[-7,20],[4,26],[10,28],[-3,33],[1,63],[6,15],[2,12],[-25,111]],[[3068,3203],[5,1],[18,-5],[4,-7],[9,9],[5,20],[11,0],[3,15],[7,12],[8,5],[12,25],[22,11],[7,-6],[4,11],[4,-10],[0,-28],[-3,-17],[0,-26],[3,-13],[-3,-11],[3,-26],[6,-17],[2,-18],[6,-2],[9,-17],[2,-14],[13,-6],[3,6],[9,-7],[3,-8],[9,1],[7,-24],[11,-10],[8,-2],[0,-6],[8,-21],[14,2],[12,-4],[12,-17],[2,-14],[-2,-8],[5,-38],[0,-34],[-7,-3],[8,-26],[2,-52],[1,-3],[47,-4],[3,-13],[-4,-13],[3,-42],[10,-16],[6,-4],[2,-21],[5,-25],[-6,-52],[-1,-10],[-9,-49],[7,-18],[-8,-13]],[[3652,1991],[1,28],[4,-2],[-5,-26]],[[3578,3950],[2,-6],[-4,-28],[-14,-30],[-5,2],[3,13],[5,13],[0,15],[5,18],[8,3]],[[3609,3981],[12,-8],[13,7],[9,-2],[12,-6],[-3,-46],[-3,-14],[-5,-9],[0,-16],[-11,-13],[-7,2],[-2,-10],[-7,-6],[-7,8],[-6,-2]
 ,[-4,-7],[-11,29],[2,24],[-1,31],[6,33],[6,7],[7,-2]],[[3587,3968],[-4,5],[2,16],[5,5],[4,-10],[-7,-16]],[[3626,3995],[1,-13],[-7,-2],[2,14],[4,1]],[[3625,4012],[-9,-21],[-4,-5],[-9,5],[-1,15],[7,0],[12,12],[4,-6]],[[3611,4032],[-7,-16],[-1,12],[8,4]],[[3601,4142],[2,-12],[-4,-5],[-1,16],[3,1]],[[3432,4130],[13,-8],[2,15],[-5,21],[3,13],[8,-9],[9,3],[10,11],[4,-10],[5,0],[3,-9]],[[3484,4157],[3,-8],[10,-7],[8,14],[9,-4],[5,7],[11,-12],[7,13],[20,96],[8,24]],[[3565,4280],[4,13],[1,16],[8,-19],[4,-21],[-1,-36],[5,-40],[6,-42],[7,-30],[8,0],[7,-11],[1,-36],[-12,-25],[-13,-47],[-4,-1],[-8,-14],[-6,-31],[-7,-19],[-1,-21],[-6,-10],[0,-11],[-13,-7],[8,-14],[6,3],[6,12],[12,14],[10,7],[2,-23],[4,-26],[8,-13],[11,11],[9,-6],[6,10],[2,-9],[-2,-21],[3,-1],[3,18],[7,25],[5,-1],[9,24],[4,-2],[4,20],[1,18],[6,3],[3,10],[3,-8],[12,9],[2,-8],[11,-7],[10,-16],[10,-4],[7,-16],[5,3],[14,-16],[6,-2],[12,-25],[3,-25],[0,-14],[-6,-22],[-2,-22],[7,4],[2,29],[8,11],[5,-11],[12,1],[1,14],[4,0],[16,-16],[7,-
 14],[13,-4],[5,6],[6,-12],[7,-2],[21,7],[3,3],[14,-4],[7,-13],[10,-12],[20,-35],[4,-3],[11,-32],[9,-17],[5,-15],[8,-6],[4,-16],[8,-2],[3,-8],[7,-5],[15,5],[13,-6],[7,-25],[5,-51],[1,-3],[4,-47],[3,-19],[0,-34],[-3,-13],[3,-7],[-4,-32],[-6,-40],[-4,-20],[-11,-35],[-4,-4],[-5,-24],[-6,-13],[-5,-19],[-4,-3],[-9,-16],[-7,-30],[-4,-6],[-10,-56],[-11,-42],[-8,-21],[-5,-7],[0,22],[-6,7],[0,-19],[-5,-13],[2,-7],[-6,-14],[2,-22],[-2,-19],[3,-5],[-4,-48],[4,-75],[2,-9],[-5,-43],[-5,-52],[2,-37],[-3,-14],[-7,-10],[-3,-13],[-3,-24],[1,-64],[-4,-17],[-5,-8],[-9,-53],[-7,-22],[-4,-3],[-9,-49],[3,-30],[-8,-14],[-12,-10],[-8,-18],[1,-17],[-4,-13],[-29,1],[-12,-10],[-8,13],[-8,-9],[-8,6],[-6,-7],[-2,-13],[-11,-20],[-9,-12],[0,-12],[-12,5],[-6,-5],[-5,-12],[-4,-1],[-16,-21],[-2,-9],[-22,-34],[-3,-22],[-4,-9],[-8,4],[-4,-17],[2,-8],[-5,-30],[1,-9],[-6,-10],[5,-10],[-2,-20],[3,-21],[-2,-46],[3,-15],[-3,-25],[-5,-19],[2,-5],[-16,-27],[-13,-38],[-7,-26],[-7,-47],[-11,-42],[-12,-31],[-3,1],[3,29],[4,-1],[
 2,13],[5,7],[6,34],[-10,1],[-10,9],[1,-15],[-5,-19],[-1,-30],[-6,-12],[-8,-5],[-2,-17],[-5,-13],[-2,-23],[4,-9],[-7,-23],[-7,-44],[-6,-15],[-15,-31]],[[3518,1565],[-4,13]],[[3514,1578],[2,3],[1,26],[5,7],[3,19],[7,-9],[4,5],[4,20],[-4,18],[-12,-24]],[[3524,1643],[-7,7],[-7,16],[-3,21],[-10,10],[-9,17],[-4,15],[-6,2],[-6,12],[-6,3],[-10,27],[-7,-16],[-4,0],[0,20],[-23,50],[-7,0],[-4,-13],[-9,1],[-2,6]],[[3484,2152],[0,11]],[[3484,2163],[6,10],[0,27],[3,14],[1,30],[-1,17]],[[3493,2261],[-10,19],[-9,-12],[-12,-1],[-4,27],[0,27],[-3,16],[0,27],[-6,22],[-9,3],[-7,15],[-11,-16],[-11,8],[-17,3],[-4,8],[2,25],[-1,17],[3,23],[0,28],[-4,8],[0,14],[-5,19]],[[3068,3203],[-11,3],[-9,-11],[-7,9],[-3,-5],[1,83],[2,9],[-4,15],[-14,-30],[-5,-5],[-23,0],[-3,34],[-14,9],[-11,0],[7,23],[-6,27],[-10,25],[-4,25],[-3,5],[2,12],[-8,17],[3,12],[5,5],[-3,15],[2,14],[17,34],[-3,25],[7,27],[3,31],[-1,10],[8,8],[16,30],[8,9],[11,2],[2,5],[9,0],[6,17],[13,-2],[6,-11],[3,7]],[[3057,3686],[6,72],[10,147],[-6,33],[
 -1,16],[-8,14],[-4,13],[1,51],[12,5],[3,6],[4,-7],[6,1],[-4,28],[-16,1],[0,47],[8,4],[6,-3],[26,0],[6,20],[6,-18],[6,4],[5,18],[7,2],[6,-27],[2,-39],[5,4]],[[3143,4078],[13,-30],[7,-5],[11,17],[5,0],[4,-20],[3,16],[3,1],[2,14],[9,11],[3,-2],[9,19],[3,-5],[6,15],[2,22],[6,2],[10,12],[1,19],[-18,4],[1,17],[-6,30],[0,34],[-9,18],[-1,19],[6,3],[6,-5],[2,-13],[18,4],[4,-3],[10,-26],[5,7],[-1,26],[6,1],[5,10],[5,-6],[13,12],[4,0],[3,12],[13,7],[3,13],[8,14],[-4,22]],[[3313,4364],[8,-2],[7,7],[6,-13],[-1,-26],[-3,-15],[13,-10],[-1,-15],[5,-17],[-4,-17],[-4,-6],[0,-18],[-4,-21],[-1,-27],[3,-24],[4,-7],[0,-25],[14,-39],[10,-11],[10,3],[0,13],[5,11],[9,-6],[1,10],[12,4],[6,19],[6,3],[9,-10],[9,5]],[[8200,4343],[3,-20],[2,-23],[-6,5],[-3,32]],[[8196,4337],[4,6]],[[8168,4321],[7,-1],[8,8],[11,22],[1,-8]],[[8195,4342],[-6,-11],[2,-23],[-2,-21],[-5,-8],[-4,17],[-4,1],[-1,15],[-7,9]],[[7547,5985],[-1,-15],[4,-10],[6,4],[3,-12],[-2,-10],[2,-16],[-10,-10],[-9,5],[-5,-5],[-17,-1],[-6,8],[-8,-11],[-8,
 -3],[-13,11],[-7,-2],[-10,23],[4,12]],[[7470,5953],[5,21],[14,38],[8,12],[11,4],[10,-9],[2,-10],[12,-9],[5,9],[10,-13],[0,-11]],[[5703,2711],[-1,-9],[8,-34],[7,-17],[5,-21],[0,-14],[5,-27],[17,-31],[13,-13],[2,-28],[12,-1],[-1,-41],[6,-17],[4,-18],[17,-6],[11,-10],[1,-18],[8,-10]],[[5817,2396],[-9,-3],[-3,-16],[-11,-10],[-5,0],[-12,-27],[-5,-19],[-11,-12],[-9,-18],[-5,-43],[-9,-15],[-3,-13],[-15,-8],[0,-10],[-8,-53],[-5,-9],[-10,1],[-7,-7],[-24,14],[-13,25],[-12,-2],[-5,-12],[-3,-36],[-5,-16],[-8,-10],[-6,-20],[-8,-4],[-2,-13],[-16,0],[-7,4],[-5,-6],[-2,14],[0,19],[6,21],[-1,17],[-6,36],[-6,26],[-11,20]],[[5556,2211],[0,112],[0,86],[28,0],[0,90],[0,72],[0,103],[14,1],[42,20],[9,1],[5,-16],[3,-18],[16,33],[7,5],[2,-8],[13,19],[8,0]],[[5636,4775],[4,-17],[8,-18],[10,-38],[1,-15],[-2,-11],[1,-19],[-6,-19],[5,-20],[16,-3]],[[5673,4615],[2,-9],[-3,-16],[19,-13],[7,-20],[4,-2],[2,-14],[-4,-6],[6,-18],[18,-24],[2,-11],[8,-14],[-2,-19],[6,-13],[0,-12],[17,-19],[4,-16],[1,-25],[4,-9]],[[5764
 ,4355],[-9,9],[-7,-12],[-11,2],[-10,14],[-8,-4],[-7,12],[-5,-2],[-3,-22],[-18,-8],[-4,13],[-15,-21],[-11,-6],[-5,-10],[-6,11],[-7,6],[-10,-42],[-4,-8],[-6,1],[-13,11],[-5,-4],[-9,4],[-10,11],[-7,-3],[-4,9],[-4,17],[-17,26],[-8,0],[-9,-16],[-11,-38],[-5,-5],[3,-24],[-1,-19],[1,-17]],[[5519,4240],[-4,11],[-18,-6],[-1,5],[-10,7],[-3,-7],[-10,-6],[-9,0],[-2,-5],[-3,-45],[-8,-43]],[[5451,4151],[-3,33],[0,12],[-4,17],[-4,1],[-17,46],[-4,20],[2,6],[-3,21],[-8,15],[-3,57],[1,24],[-1,13],[-6,7],[4,12],[5,5],[6,32],[3,6],[5,33],[7,20]],[[5431,4531],[9,-5],[16,16],[5,14],[6,-23],[10,10],[4,9],[12,12],[25,5],[15,45],[-7,13],[6,11],[7,-1],[15,3],[5,7],[10,0],[2,9],[9,11],[5,23],[7,18],[2,-2],[12,32],[-1,17],[12,13],[8,13],[11,-6]],[[2700,7292],[2,-7],[13,10],[4,-9],[5,9],[7,-6],[3,-11],[-7,-16],[-23,19],[-15,7],[2,6],[9,-2]],[[3320,7368],[5,-9],[-3,-43],[15,-7],[1,-18],[-15,-21],[-9,-5],[-17,0],[-6,34],[13,30],[6,24],[7,17],[3,-2]],[[3222,7355],[6,-15],[17,-13],[31,4],[-8,-13],[-5,-24],[-8,0],[-
 4,15],[-7,-3],[-11,6],[-13,23],[-9,10],[5,16],[6,-6]],[[2925,7224],[19,17],[10,14],[3,-1],[4,24],[8,22],[11,9],[15,25],[10,10],[4,-3],[11,9],[21,19],[14,33],[28,54],[23,30],[44,34],[11,6],[18,5],[17,-4],[12,-8],[9,-17],[1,-17],[-4,-15],[-11,-7],[-2,-9],[-14,-13],[-18,13],[-11,-14],[14,-7],[6,-17],[16,13],[6,-13],[-4,-23],[-7,-18],[11,-1],[-2,-14],[5,-15],[0,-15],[6,-17],[15,-4],[4,-21],[9,0],[6,-12],[15,3],[7,-11],[16,20],[0,-13],[8,-7],[4,5],[6,-17],[8,-9],[-3,-7],[-20,-9],[-7,-9],[-34,-25],[-7,-2],[-5,-10],[-9,8],[-7,-1],[-2,-19],[-13,-33],[-23,-24],[-3,12],[-10,6],[-2,26],[4,24],[9,20],[24,30],[14,13],[7,-7],[8,12],[-21,2],[-3,-6],[-6,7],[13,20],[-4,11],[-6,-18],[-15,-11],[-16,-18],[-6,2],[-9,-11],[-17,0],[-3,7]],[[3135,7237],[-9,7],[1,24]],[[3127,7268],[-10,11]],[[3117,7279],[1,14],[-1,77],[-11,22],[-19,-11],[-5,18],[-5,0],[-21,-52],[-2,-21],[-6,-25],[-3,-24],[-8,-12],[-4,-19],[-15,-5],[-4,-16],[-52,-1],[-37,0]],[[3219,7580],[21,-9],[24,-16],[9,-14],[9,-4],[5,-18],[-15,-3],[-24,
 12],[-14,12],[-9,20],[-14,10],[-1,7],[9,3]],[[1448,7646],[19,-18],[20,-10],[10,-2],[19,-10],[7,-28],[8,-14],[3,-19],[23,-17],[3,-16],[12,-28],[-4,-22],[-31,19],[-15,16],[6,11],[-18,1],[-5,21],[-6,1],[-1,13],[-14,-3],[-2,35],[-13,-3],[-10,20],[-8,7],[-16,27],[-2,12],[15,7]],[[3448,7700],[0,-9],[14,6],[-6,-18],[-10,1],[-1,-9],[8,-2],[-3,-19],[-17,-40],[-8,-25],[0,-24],[16,34],[16,-19],[-9,-13],[3,-15],[8,-3],[10,6],[-2,-20],[13,4],[6,15],[8,-11],[6,7],[16,-17],[-12,-29],[5,-22],[13,0],[1,-13],[-20,-19],[8,-6],[-6,-21],[5,-11],[11,33],[6,-6],[-6,-22],[4,-14],[12,23],[2,-17],[-5,-15],[-4,-37],[-7,-11],[-5,7],[-5,-9],[-3,38],[-11,-24],[-4,6],[9,36],[-4,30],[-3,2],[-11,-33],[-9,0],[-7,-13],[-4,-20],[-14,-5],[-6,4],[3,12],[10,5],[6,9],[4,23],[-8,7],[0,-15],[-21,11],[-14,0],[-2,-7],[-36,12],[-29,-10],[-6,4],[-2,19],[25,42],[-9,7],[17,63],[16,52],[4,19],[14,33],[7,31],[23,22]],[[2739,7815],[8,-1],[10,-19],[3,-15],[-10,1],[-29,20],[5,11],[13,3]],[[1339,7817],[-1,-14],[6,-10],[-7,-5],[4,-16],[
 13,-13],[6,-20],[-6,-3],[-11,25],[-7,8],[-16,32],[-2,9],[5,-1],[8,2],[8,6]],[[1427,7810],[3,-22],[-3,-17],[-12,9],[-4,21],[3,20],[13,-11]],[[1382,7840],[10,-12],[-2,-17],[-16,28],[8,1]],[[1395,7847],[12,-22],[-6,-11],[-11,30],[-9,15],[2,6],[12,-18]],[[1381,7872],[-2,-12],[-9,10],[7,8],[4,-6]],[[1305,7883],[20,-4],[16,-11],[-4,-13],[-4,-38],[-6,-1],[-2,-5],[-5,-1],[-3,6],[-4,2],[2,14],[-9,7],[0,15],[-5,9],[4,20]],[[2802,8062],[3,-22],[-12,-34],[-15,1],[15,28],[9,27]],[[3110,8344],[7,-8],[-4,-13],[-13,-2],[5,23],[5,0]],[[3201,8419],[-2,-21],[-17,19],[12,7],[7,-5]],[[2794,8473],[5,-17],[-14,-40],[-12,14],[0,26],[10,19],[11,-2]],[[3034,8506],[17,-18],[-5,-4],[-13,7],[1,15]],[[2720,8515],[7,-3],[-3,-16],[-22,-28],[-11,-10],[-4,6],[-11,-8],[-6,25],[17,32],[5,-6],[10,6],[18,2]],[[2823,8553],[21,-6],[2,-16],[-10,-7],[-17,22],[4,7]],[[2858,8566],[12,-8],[0,-14],[-20,16],[8,6]],[[2626,8719],[8,1],[3,-26],[14,3],[14,-21],[19,-5],[5,-13],[14,-12],[10,-1],[16,-19],[4,-28],[31,-11],[2,-17],[-16,-
 20],[-29,17],[-13,21],[-14,-2],[2,12],[-16,-1],[-3,-24],[-17,-10],[-9,-23],[-19,-13],[-10,8],[0,31],[-29,-1],[-14,-5],[8,24],[19,13],[-6,35],[7,25],[0,25],[4,27],[15,10]],[[2658,8742],[18,-14],[-13,-12],[-5,26]],[[2937,8883],[24,-8],[1,-14],[-28,0],[-10,21],[13,1]],[[2602,8872],[-13,-10],[-5,20],[9,17],[8,-7],[1,-20]],[[2901,8900],[13,-6],[2,-49],[-9,-14],[-14,-7],[-33,1],[-7,31],[17,40],[11,5],[20,-1]],[[2174,8934],[-3,-16],[-12,7],[15,9]],[[2821,8977],[7,-6],[-17,-28],[-16,1],[26,33]],[[2860,8979],[11,-8],[-14,-14],[-6,11],[9,11]],[[2343,8993],[7,-16],[-16,-2],[9,18]],[[2835,8998],[-15,-14],[-5,5],[14,14],[6,-5]],[[2295,8992],[24,-12],[14,-15],[6,-36],[-19,-20],[-27,6],[-8,9],[-39,13],[-12,13],[34,22],[-6,9],[10,25],[9,7],[16,-13],[-2,-8]],[[2925,7224],[-15,-10],[-15,-26]],[[2895,7188],[-4,-7],[-25,-17],[-7,-21],[-14,12],[-41,-15],[-11,-13],[-8,-23],[2,-6],[10,-4],[8,6]],[[2805,7100],[-1,-12]],[[2804,7088],[4,-12],[-7,-4],[-15,-1],[-14,-7],[-8,-14],[-11,6],[-12,-1],[-12,-17],[-3,-
 12],[-5,1],[-13,-19],[-11,0],[-5,6],[1,16],[18,3],[-6,16]],[[2705,7049],[4,6],[2,27]],[[2711,7082],[8,5],[11,21],[0,50],[4,18],[9,20],[0,15],[-9,26],[8,5],[2,-18],[10,-18],[21,-20],[4,16],[-4,9],[8,9],[-7,11],[-1,23],[-5,-4],[-3,16],[-9,25],[-12,0],[-15,13],[-12,1],[-7,5],[-16,-1],[-32,12]],[[2664,7321],[0,13],[-10,-5]],[[2654,7329],[1,35],[-9,3],[5,23],[-12,21],[5,23],[-2,4],[-14,-4],[-12,5],[-6,12],[-6,31],[-4,13],[-8,3],[-16,-3],[-23,17],[-6,-22],[-4,11],[-9,-20],[-11,-9],[-2,-17],[-9,-16]],[[2512,7439],[-11,1],[-5,8],[-17,-1],[-4,9],[-14,-14],[-7,5],[-10,17],[-9,-8],[-8,22],[-17,7],[-14,-8],[-3,8],[-10,2],[-13,11],[-3,35],[-10,5],[0,-27],[-43,0],[-49,0],[-67,0],[-43,0],[-54,0],[-49,0],[-31,0],[-55,0],[-67,0],[-55,0],[-43,0],[-55,0],[-73,0],[-50,0],[-33,0]],[[1590,7511],[-8,0],[-1,0],[-4,10],[-1,34],[-8,-15],[-12,9],[-2,8],[3,14],[-13,-4],[-9,13],[4,20],[-22,19],[-9,-4],[-15,4],[2,26],[-9,-3],[-10,9],[-5,-9],[-14,14],[-7,16],[5,18],[-7,14],[0,17],[19,28],[-1,11],[-16,-14],[-15,9]
 ,[6,26],[-9,5],[-3,23],[-9,12],[-2,13],[-8,10],[-3,-16],[-21,39],[1,15],[-11,14],[2,23],[5,4],[4,20],[-3,6],[6,13],[-5,34],[3,12]],[[1388,8008],[-2,14],[-28,22],[-13,13],[-6,0],[-2,15],[-7,4],[2,12],[-14,34],[-23,65],[-14,24],[-10,8],[-4,15],[-20,26],[2,9],[-13,18],[-21,-12],[-6,-12],[-4,-22],[-6,0],[-16,-17],[-6,23],[-27,37],[-3,10],[-13,13],[2,20],[-15,-1],[-10,-10],[-12,7],[-3,-5],[-13,7],[0,94],[0,126],[0,84],[0,73],[0,95],[0,115],[0,84]],[[1083,8996],[30,-3],[22,-7],[14,-17],[40,-24],[31,-4],[9,12],[-2,18],[19,12],[14,0],[11,15],[17,-20],[12,1],[9,17],[9,-2],[20,10],[12,14],[9,-5],[12,18],[29,-11],[-41,-26],[-25,-7],[-4,-12],[-18,-8],[11,-7],[16,12],[-3,6],[18,7],[10,-8],[15,22],[21,9],[21,-5],[15,17],[10,30],[14,0],[8,-11],[12,-35],[22,-25],[14,-7],[7,10],[-7,10],[9,11],[5,21],[14,8],[-2,-31],[8,-7],[-7,-19],[21,0],[14,9],[7,25],[42,-5],[33,-26],[45,-13],[17,-14],[51,-14],[17,10],[30,-19],[17,-22],[-3,-11],[-23,1],[-10,-9],[2,-24],[35,-8],[40,-1],[3,5],[35,1],[26,18],[11,-21],
 [18,0],[8,-25],[9,4],[13,-11],[-4,-30],[12,-7],[13,23],[-13,22],[3,8],[-11,14],[1,11],[15,14],[26,15],[6,10],[14,2],[-3,16],[-18,-8],[-4,-13],[-13,-5],[-20,4],[0,-11],[-27,7],[15,25],[15,1],[41,19],[14,-3],[12,-37],[20,-8],[3,-15],[32,-1],[29,-21],[37,2],[7,7],[36,-4],[5,-6],[25,7],[22,-15],[12,13],[-16,18],[-13,-11],[-8,17],[12,28],[21,-2],[24,-22],[11,6],[-5,-44],[-8,-9],[10,-9],[26,-7],[-8,25],[-6,5],[6,26],[17,-3],[18,25],[18,14],[-2,28],[-8,2],[-5,-16],[-15,-1],[8,20],[3,22],[-9,22],[-9,-5],[-24,16],[-20,22],[-2,15],[14,21],[-16,16],[5,34],[26,14],[-11,8],[16,8],[3,17],[18,4],[2,-13],[21,-4],[-2,-8],[23,-22],[2,-32],[8,-16],[11,-5],[6,-24],[14,-9],[-21,-20],[0,-15],[13,-11],[10,11],[9,-11],[19,-2],[-17,-19],[16,-24],[-4,-32],[12,-9],[9,15],[5,37],[9,15],[11,-1],[26,-31],[6,-34],[-16,-22],[3,-18],[29,-40],[19,16],[0,17],[18,27],[6,48],[12,0],[3,16],[10,10],[-15,5],[-5,12],[-1,32],[33,7],[16,-11],[30,-2],[13,-21],[-1,-11],[14,2],[12,-9],[-12,-14],[14,-12],[-1,-10],[-30,-20],[0,-1
 3],[9,-4],[-2,-16],[24,-32],[-8,-33],[-12,-2],[-19,-29],[-10,-1],[-19,-25],[-21,12],[-4,-11],[-19,5],[-4,20],[-28,-4],[-10,-6],[5,-8],[21,-11],[-16,-19],[-1,-12],[-26,-29],[-15,0],[-49,44],[-7,-11],[13,-12],[12,-21],[56,-7],[3,-6],[-19,-42],[-5,-3],[-7,-24],[-19,-15],[-11,-1],[-12,8],[-17,-30],[-22,-6],[9,-36],[-22,-21],[-18,6],[-5,-22],[-13,-7],[-6,-25],[-8,-12],[-10,-1],[5,-15],[-16,-19],[4,-9],[-14,-34],[-13,-66],[3,-45],[-3,-22],[11,-21],[19,5],[16,-3],[1,-16],[9,-32],[4,-26],[6,-26],[-3,-18],[9,-6],[33,17],[12,-2],[22,-18],[26,-9],[16,-23],[9,-7],[11,-28],[17,-8],[19,-15],[16,-9],[18,-22],[12,-4],[19,6],[31,-13],[10,0],[7,-22],[-6,-44],[8,-30],[-2,-15],[3,-23],[-5,-22],[20,-37],[5,-24],[11,-9],[11,-21],[6,-26],[18,-16],[1,19],[10,20],[13,-19],[2,15],[-7,11],[13,25],[2,18],[-13,48],[2,12],[-1,26],[-4,26],[3,7],[-14,21],[-3,23],[3,9],[14,7],[16,13],[17,17],[15,23],[16,35],[3,16],[2,35],[-3,35],[-6,29],[-7,21],[-15,22],[-12,8],[-10,18],[-4,19],[20,28],[-2,14],[10,19],[7,4],[-5,30]
 ,[-8,15],[-2,15],[6,9],[-16,7],[10,16],[1,27],[5,11],[-9,6],[-4,14],[-2,29],[18,21],[51,-21],[9,2],[15,-10],[31,21],[17,-21],[12,-5],[1,-12],[10,-5],[19,-22],[-8,-11],[13,-19],[21,-9],[14,2],[2,-15],[11,3],[-5,-26],[6,-31],[-8,-7],[9,-10],[2,-13],[-7,-14],[6,-21],[2,-21],[-9,1],[0,-16],[15,15],[13,2],[12,-10],[1,-14],[12,-7],[9,-19],[25,22],[8,23],[7,-6],[15,19],[-4,9],[8,15],[-3,26],[10,7],[9,38],[12,-7],[-2,-11],[10,-9],[0,-22],[11,-12],[10,-29],[13,-21],[9,-22],[-2,-17],[17,-27],[5,-20],[-8,-11],[10,-6],[-4,-12],[13,-4],[3,-10],[-7,-9],[-10,-28],[7,-13],[11,-7],[1,-14],[10,-12],[17,-8],[-1,-26],[-4,-9],[13,-4],[7,9],[7,-19],[8,10],[19,-32],[10,2],[21,-10],[1,-11],[-8,-9],[-14,-1],[-11,-22],[-24,-16],[-9,1],[-9,-7],[2,-19],[15,5],[18,28],[17,8],[6,13],[18,-7],[7,-29],[-9,-8],[5,-10],[8,17],[14,5],[4,-15],[8,0],[8,-32],[-6,-8],[4,-14],[-6,-6],[1,-17],[7,-1],[-2,-14],[4,-14],[-7,-13],[-20,-20],[-9,-16],[-8,6],[-12,-3],[-15,-14],[-6,3],[-14,-22],[0,-13],[-9,-8],[-15,-28],[-22,-8],[-1
 9,-1],[-12,-7],[-4,9],[-32,6],[-12,-7],[-7,6],[-15,-2],[-6,4],[-12,-4],[-10,4],[-39,-14],[-13,-22],[-3,-26],[-4,-9],[-19,-3],[-15,-18],[-13,-21],[-10,-33],[-8,-13],[-6,-25],[-15,-24],[-7,-23],[-6,-7],[-11,-20],[-10,-5],[-5,2],[-10,-10],[-10,-18],[-11,-7],[-14,-35],[-7,-3],[-8,-14],[2,-9],[-15,-15],[-6,-11]],[[1829,9258],[6,-13],[-1,-23],[28,15],[49,-21],[-9,-24],[13,2],[10,11],[19,-9],[7,21],[-11,3],[3,16],[40,-31],[-1,-15],[14,-29],[-3,-11],[17,-7],[11,15],[-9,7],[-19,81],[7,16],[24,-12],[8,9],[29,-22],[13,-16],[9,-48],[20,-47],[-9,-25],[31,-37],[19,-6],[37,-29],[13,6],[5,-28],[-3,-10],[-20,1],[-10,12],[-15,-8],[2,-13],[13,-5],[8,-21],[-1,-14],[-20,-10],[-23,-5],[-35,5],[-9,13],[-41,10],[2,16],[-7,7],[-21,-34],[-33,-6],[-12,-15],[-18,-7],[-28,-2],[-10,-5],[-45,-2],[-21,5],[-8,15],[2,29],[-23,7],[-22,-4],[-22,4],[-18,12],[0,8],[-17,14],[-5,16],[13,10],[26,7],[51,6],[44,-8],[13,21],[-52,16],[-44,-10],[-18,5],[-37,-3],[-17,17],[-6,13],[69,27],[2,11],[-47,-13],[-9,20],[-33,-1],[0,22],[
 10,15],[15,6],[-12,14],[34,35],[77,34],[11,-6]],[[2095,9259],[-20,-29],[-33,36],[-15,5],[13,16],[39,4],[19,-14],[-3,-18]],[[2769,9291],[25,-9],[36,2],[26,-11],[16,-25],[11,-5],[-2,-20],[-52,6],[-28,-10],[-21,6],[-6,28],[-17,3],[-2,34],[14,1]],[[2596,9298],[41,-3],[4,-11],[-30,-26],[-19,-35],[1,-12],[12,-18],[-6,-14],[9,-29],[18,-20],[15,-7],[-13,-16],[16,-3],[9,23],[-5,15],[-16,-1],[-8,17],[6,36],[-10,16],[1,19],[15,30],[64,30],[36,-1],[11,-34],[14,-6],[0,-17],[11,-14],[-9,-7],[14,-17],[21,0],[15,-10],[9,24],[23,12],[20,-1],[6,-8],[41,-10],[4,-26],[23,-4],[-2,-25],[19,0],[-1,-21],[17,-12],[16,27],[24,-9],[13,-18],[-9,-14],[-17,1],[-8,-15],[11,-6],[18,6],[14,17],[8,-13],[60,-25],[-4,-16],[-15,-14],[10,-14],[13,11],[4,14],[23,-26],[3,-17],[-25,4],[-16,-14],[17,-9],[21,0],[16,-20],[-28,0],[-13,-25],[0,-21],[13,2],[22,-11],[1,-21],[15,0],[2,-9],[29,-2],[4,6],[27,-32],[2,-24],[28,-4],[-7,-18],[42,-2],[13,-24],[-9,-4],[3,-13],[-18,-16],[5,-9],[-13,-3],[-6,-28],[-19,0],[-6,-14],[4,-24],[-4
 ,-7],[-28,10],[-17,23],[-10,24],[3,16],[-14,-2],[-2,11],[-16,10],[-7,20],[-6,1],[-8,-31],[1,-13],[-15,-4],[-7,10],[-7,-7],[12,-19],[17,0],[17,-49],[30,-15],[-3,-19],[17,-5],[-6,-14],[10,-15],[0,-17],[12,-10],[0,-23],[-8,-14],[-4,-36],[-7,-4],[-6,18],[-14,11],[-14,2],[-21,20],[-15,25],[-11,-3],[-17,12],[-3,-8],[19,-35],[14,-4],[14,-20],[4,-12],[10,-3],[5,-12],[14,-18],[-5,-11],[5,-11],[-9,-2],[-30,20],[-34,8],[-13,9],[-15,20],[-1,10],[-17,-3],[-17,10],[-24,20],[-1,15],[9,8],[-3,15],[-9,4],[-13,-6],[-17,28],[1,7],[-16,18],[0,15],[-15,-7],[-3,11],[-17,-21],[-24,14],[-8,-14],[-12,-7],[-23,1],[-24,9],[-5,12],[6,33],[18,11],[0,14],[18,1],[25,-14],[15,3],[3,10],[17,-4],[13,14],[8,-1],[1,18],[-8,6],[-13,21],[28,29],[13,16],[5,19],[13,6],[-7,48],[-9,8],[-2,24],[-18,4],[-51,52],[-3,-9],[-29,-15],[0,24],[28,5],[-2,14],[-19,9],[-14,30],[-22,0],[0,26],[-20,2],[-14,-23],[-22,-3],[-6,9],[-32,9],[-30,-23],[-25,16],[-18,-4],[-46,6],[-12,-3],[-14,9],[-21,25],[-23,-16],[-8,11],[-15,5],[-21,32],[22,10]
 ,[9,-6],[29,3],[-22,15],[-48,8],[-5,9],[5,22],[-8,11],[9,15],[-5,10],[6,25],[12,20],[0,12],[17,27],[26,21],[33,10]],[[2228,9301],[17,-12],[44,12],[19,-12],[-14,-14],[8,-6],[-33,-30],[30,-5],[6,-18],[17,-5],[4,-16],[-12,-9],[7,-12],[-2,-21],[-25,-16],[-15,3],[-6,-18],[-14,-10],[-15,6],[-17,36],[-22,24],[-16,11],[-13,-4],[-8,15],[-18,12],[-4,11],[8,16],[20,-1],[13,-22],[24,1],[11,15],[-14,21],[-28,16],[18,13],[0,14],[30,5]],[[2288,9313],[-13,-14],[-23,-5],[-13,8],[19,9],[30,2]],[[2424,9314],[18,-6],[31,1],[22,-8],[-33,-49],[-13,-27],[-14,-10],[-29,6],[-13,-6],[12,-17],[-18,-29],[-29,-7],[0,36],[-13,17],[-2,74],[12,2],[0,18],[24,9],[31,3],[14,-7]],[[1623,9348],[48,-23],[28,-4],[22,7],[34,-14],[42,-43],[-106,-61],[-5,-21],[-24,-9],[-7,-18],[2,-19],[-8,-15],[-22,-8],[-8,6],[-12,-15],[-27,-12],[-26,44],[-33,17],[-15,1],[1,14],[19,30],[3,21],[13,5],[-10,12],[30,48],[-11,6],[-17,36],[60,8],[29,7]],[[2119,9401],[4,-8],[-17,-12],[-19,8],[6,16],[15,6],[11,-10]],[[2379,9423],[25,-24],[2,-27],[-
 5,-17],[-31,-1],[-17,12],[-30,9],[-2,19],[15,6],[4,16],[25,10],[14,-3]],[[2326,9427],[11,-7],[-30,-12],[-2,8],[21,11]],[[1733,9461],[5,-3],[-13,-25],[-19,-17],[-22,7],[22,23],[27,15]],[[2150,9471],[-6,-13],[-42,-1],[1,10],[47,4]],[[2114,9497],[24,-12],[-8,-9],[-29,-1],[-7,20],[20,2]],[[2267,9500],[21,-13],[2,-45],[-10,-8],[6,-13],[-8,-39],[-45,-4],[-19,3],[-7,30],[15,2],[4,16],[-76,-13],[-2,13],[12,14],[19,3],[-14,22],[1,14],[18,1],[8,-14],[18,-10],[11,13],[-25,16],[20,11],[51,1]],[[2509,9489],[-10,-2],[-14,16],[16,9],[8,-23]],[[1982,9511],[2,-30],[15,-9],[-11,-13],[39,-15],[12,12],[24,-5],[10,-24],[-17,-43],[-28,-9],[-23,6],[-16,-7],[-11,11],[-21,-15],[-58,-26],[-38,-7],[-18,3],[-21,17],[46,22],[34,2],[-3,10],[-112,-13],[-50,16],[8,21],[32,0],[-2,7],[-30,-1],[19,42],[21,6],[7,16],[36,1],[7,-20],[27,6],[18,-18],[25,-13],[6,-23],[20,3],[45,-6],[2,15],[-34,14],[20,15],[-29,14],[32,38],[15,0]],[[2355,9525],[31,-9],[12,2],[17,-21],[46,5],[24,-10],[-2,-7],[37,-12],[-2,-8],[-22,-8],[27,-2
 0],[-2,-11],[19,1],[11,-12],[23,9],[16,-10],[41,7],[39,18],[23,-6],[21,8],[34,-5],[44,-28],[-2,-27],[5,-10],[-23,-8],[2,-10],[-32,-4],[-13,-8],[-48,9],[-21,-5],[-94,-4],[-24,3],[3,19],[-29,-15],[-57,6],[-14,10],[-13,31],[13,28],[-5,21],[-12,9],[-14,25],[-26,-7],[-22,0],[-27,10],[-29,38],[30,10],[15,-4]],[[1775,9558],[19,-9],[-22,-11],[10,-36],[-33,-12],[4,-13],[-12,-6],[-26,22],[-19,-6],[11,-10],[-36,-35],[-31,11],[-46,-1],[-6,17],[12,12],[23,2],[29,23],[35,38],[13,6],[55,-3],[-2,11],[22,0]],[[2492,9569],[17,-12],[-11,-19],[-31,15],[1,15],[24,1]],[[2084,9554],[16,-8],[-1,-11],[-21,1],[-24,41],[16,-1],[14,-22]],[[2351,9580],[50,0],[11,-4],[-9,-19],[-69,1],[-6,16],[23,6]],[[2197,9577],[-42,-1],[1,12],[21,0],[20,-11]],[[1825,9597],[20,-15],[-15,-7],[-27,18],[22,4]],[[1956,9601],[-14,-21],[-3,-20],[-52,-13],[-31,15],[-1,27],[70,14],[31,-2]],[[1934,9650],[25,-12],[5,-17],[-14,-4],[-54,-2],[-11,8],[10,12],[39,15]],[[2309,9646],[58,-24],[-15,-9],[8,-19],[-57,-12],[4,8],[-21,9],[24,6],[-33,
 13],[-10,13],[7,23],[35,-8]],[[2121,9692],[29,-17],[27,-2],[58,-34],[-8,-12],[23,-26],[0,-13],[-25,-8],[-19,6],[-13,24],[-46,13],[-34,-10],[-24,9],[5,16],[32,-6],[3,19],[-19,15],[-42,3],[12,20],[41,3]],[[2238,9747],[21,-10],[-38,-6],[-3,11],[20,5]],[[2424,9834],[57,-44],[2,-10],[82,-11],[3,-17],[27,-38],[29,-5],[18,-20],[-44,-17],[-43,-42],[-14,-3],[-6,-18],[-28,15],[-16,-18],[-35,3],[-28,11],[-46,45],[23,14],[32,-1],[-15,19],[-59,-9],[-22,9],[4,11],[-26,20],[32,20],[-30,16],[12,17],[42,2],[-27,14],[7,15],[58,6],[11,16]],[[3065,9963],[20,-9],[71,-3],[15,-7],[67,-2],[15,-22],[37,-2],[13,-16],[-32,-17],[-53,-20],[-14,-26],[-100,-45],[-30,-26],[-36,-18],[-13,-26],[-57,-18],[-51,-12],[-28,5],[2,-14],[32,0],[8,-15],[-45,6],[11,-16],[27,-4],[-1,-18],[-22,-34],[-36,-15],[-36,4],[12,-26],[-15,-16],[-23,-6],[-46,3],[-22,13],[-8,-16],[51,-8],[16,4],[12,-10],[-10,-13],[18,-3],[22,6],[4,-21],[-43,-27],[-37,-9],[-12,4],[9,14],[-32,5],[-24,-7],[-40,4],[-28,-9],[-32,6],[-34,-5],[-43,6],[-13,12],[3
 ,19],[31,16],[26,4],[6,13],[-27,25],[1,10],[28,8],[27,-8],[22,-28],[18,8],[-14,10],[-11,21],[-15,8],[-35,5],[0,23],[24,26],[38,7],[56,-8],[7,10],[-36,1],[-13,6],[11,11],[-19,31],[-41,11],[2,39],[73,-5],[16,5],[126,18],[-26,19],[-44,-15],[-89,-8],[-47,2],[-56,10],[-35,14],[27,9],[47,1],[5,8],[-91,-8],[-5,17],[-23,16],[25,9],[-21,6],[2,14],[34,2],[19,11],[55,6],[66,15],[45,2],[32,30],[62,13],[89,6],[69,-9],[29,12],[81,1]],[[5257,7416],[0,-1],[10,-10]],[[5292,7358],[-2,-14],[-8,-5],[-4,-17],[-11,-5],[-3,14],[-5,0],[0,-13],[-12,-17],[-11,13],[-10,0],[1,-9],[-8,-15],[-8,5],[-10,-8],[-4,4]],[[5197,7291],[-5,14],[-2,21]],[[5190,7326],[-5,7],[-8,-5],[-3,-11]],[[5174,7317],[-4,13],[10,21],[0,13],[15,21],[1,19],[10,-5],[6,11]],[[5212,7410],[14,-1],[16,15],[7,-9],[8,1]],[[3102,38],[-1,-14],[7,-15],[-3,-9],[-16,10],[-4,9],[-14,-1],[-16,9],[4,6],[41,9],[2,-4]],[[3117,44],[14,-1],[7,-10],[-6,-17],[-22,5],[-3,18],[10,5]],[[3014,111],[14,-9],[-3,-20],[-15,12],[4,17]],[[3004,118],[6,-3],[-3,-21],[-5
 ,-2],[-8,13],[10,13]],[[3045,119],[2,-10],[-14,-8],[-1,20],[11,20],[2,-22]],[[2973,146],[2,4],[15,-14],[6,-12],[-10,-22],[-11,1],[5,17],[-22,7],[-1,13],[16,6]],[[2926,201],[9,-16],[8,0],[0,-11],[-14,13],[-3,14]],[[3094,53],[0,-1],[0,-6],[-12,-5],[-20,12],[-12,-5],[-22,10],[-7,11],[11,23],[15,-6],[7,6],[-3,31],[8,11],[15,10],[0,12],[-25,-8],[-6,11],[4,18],[17,21],[4,19],[4,4],[8,-17],[10,10],[4,-7]],[[2953,224],[-2,-20],[-11,3],[13,17]],[[2939,245],[8,-16],[-5,-4],[-3,20]],[[2932,340],[0,-15],[-7,-7],[-4,15],[11,7]],[[2907,362],[4,-1],[-1,-19],[-6,7],[3,13]],[[2932,363],[3,1],[5,-23],[-5,-3],[-6,13],[3,12]],[[2909,395],[10,-14],[-8,-15],[-2,29]],[[2926,489],[5,0],[2,-43],[-3,-14],[3,-17],[-1,-14],[-8,-8],[-10,14],[-10,38],[13,5],[6,11],[-7,20],[6,10],[4,-2]],[[2907,508],[1,-11],[-7,-7],[-2,16],[8,2]],[[2925,525],[4,-11],[-1,-23],[-9,5],[-3,8],[9,21]],[[2914,533],[8,-3],[0,-14],[-5,-7],[-4,9],[1,15]],[[2908,536],[7,-38],[-4,-8],[-4,23],[-5,-2],[-1,24],[7,1]],[[2922,554],[1,-19],[-13,3
 ],[2,9],[10,7]],[[2925,698],[-1,-13],[-9,-7],[1,16],[9,4]],[[2949,756],[4,-8],[-1,-12],[-6,2],[-7,15],[10,3]],[[2947,783],[-10,-13],[-3,13],[13,0]],[[2975,796],[6,-6],[-4,-13],[-12,-16],[-5,21],[15,14]],[[2946,986],[11,-10],[5,-26],[-8,-5],[-4,-17],[9,-13],[-4,-8],[4,-14],[-6,-3],[1,-17],[-5,-3],[-15,11],[5,17],[3,28],[-2,15],[4,22],[-1,23],[3,0]],[[3099,228],[-19,10],[-8,-3],[-7,-20],[-4,3],[-19,-17],[-8,-2],[0,-17],[-5,-28],[-1,-31],[-9,-5],[-8,4],[-18,18],[-5,12],[5,12],[15,1],[10,7],[5,15],[-1,10],[-19,-16],[-16,-22],[-1,-17],[-19,22],[8,10],[-1,19],[15,2],[0,12],[-7,-1],[-10,-13],[2,-13],[-10,-4],[2,33],[-10,-8],[-2,22],[23,34],[-3,13],[-9,-29],[-8,11],[-2,24],[-7,5],[-1,15],[4,13],[-9,3],[-4,18],[4,4],[-5,28],[-11,20],[2,7],[10,2],[-3,21],[4,19],[-6,11],[-1,22],[2,34],[11,13],[-17,26],[3,7],[21,-5],[-9,18],[-15,0],[-3,5],[11,35],[5,0],[5,11],[-8,20],[-10,1],[-2,-8],[-11,17],[-10,0],[1,-20],[-4,-2],[-4,23],[17,30],[3,-1],[7,18],[1,10],[15,3],[11,-31],[-7,-24],[5,-1],[8,20],[-3,
 23],[3,8],[1,29],[8,12],[-5,19],[18,20],[2,19],[-17,23],[8,29],[-3,22],[10,32],[-3,13],[1,42],[7,16],[-8,9],[7,14],[-10,16],[-7,-22],[-15,3],[-5,56],[6,31],[-2,7],[2,33],[9,13],[4,22],[-1,30],[-7,47],[2,24],[-6,27],[0,25],[13,15],[2,35],[4,-3],[5,32],[1,23],[5,10],[-1,17],[7,24],[4,9],[5,32],[1,36],[11,45],[-4,31],[6,8],[4,45],[-4,13],[2,21],[-5,54],[-1,38],[1,20],[8,14],[3,17],[-1,22],[-2,23],[-3,6],[-1,18],[6,20],[4,22],[1,30],[2,20],[4,3],[-1,33],[4,12],[5,71],[-2,13],[1,21],[6,14],[-1,26],[-3,33],[2,30],[0,23],[3,20],[-6,0],[1,29],[8,13],[4,90],[3,17],[-4,45],[0,32],[2,21],[-1,25],[-4,30],[-2,38],[2,24],[-3,7]],[[3045,2672],[12,7],[5,19],[-2,18],[10,16]],[[8076,5439],[7,-12],[1,-22],[-9,-22],[-6,-50],[-6,-3],[-5,-19],[-8,1],[0,-10],[-5,-4],[-4,7],[-8,-1],[-12,16],[-3,51],[11,28],[4,3],[4,20],[5,-6],[7,12],[8,-4],[4,8],[6,1],[6,-7],[3,13]],[[8389,6251],[-10,5],[-11,18],[3,4],[19,-21],[-1,-6]],[[8692,7228],[-3,14],[-15,6],[-5,-7]],[[8669,7241],[-5,7],[-11,-27],[-14,-8],[4,-12],[5,
 -45],[-2,-38],[3,-10],[-8,-39],[-6,2],[-10,-10],[3,-14]],[[8628,7047],[-8,15],[0,11],[-10,7],[-5,-40],[-13,-4],[-1,-12],[-8,-14],[-24,-2],[0,-8],[7,-21],[-3,-13],[-7,4],[-8,-2],[-15,7],[-5,19],[-9,-10],[-5,-22],[-12,-33],[-6,-1],[-7,-11],[-18,-17],[-14,-28]],[[8457,6872],[-7,-19],[-24,-5],[-24,-26],[-15,-33],[-6,4],[-4,-14],[-9,-6],[1,16],[13,10],[-3,20],[-7,17],[6,4],[0,15],[10,9],[11,37],[-7,17],[-13,7],[-6,7],[-10,-7],[-1,-11],[-9,-15],[-5,-20],[-25,-22],[-6,-13],[-2,-20],[-8,-17],[-11,-3],[-7,-9],[-9,14],[-9,-9],[-5,-34],[5,-18],[10,-17],[13,-5],[8,6],[8,-22],[-4,-17],[0,-24],[14,-11],[9,2],[3,15],[9,11],[3,12],[12,11],[17,-17],[7,-12],[15,4],[11,-12],[-3,-12],[3,-15],[-6,-9],[-8,12],[-24,-23],[-12,-15],[-3,-10],[2,-12],[-10,-8],[1,11],[-8,1],[4,-17],[-5,-9],[-4,-16],[-7,-3],[-6,-18],[-2,-17],[-6,-3],[0,-19],[8,-3],[6,-14],[17,-17],[4,-32],[13,-61],[-1,-25],[15,-20],[2,-20],[10,-12],[3,-14],[-3,-4],[-15,14],[-8,-5],[4,-10],[5,-13],[11,-16],[7,-26],[-15,-11],[-12,-16],[-6,-18],[3
 ,-9],[7,12],[7,-1],[8,-23],[9,-13],[-2,-13],[0,-32],[-8,-1],[1,-19],[-5,-18],[5,-23],[-9,-8],[-6,-1],[-15,-46],[-2,-27],[-7,-6],[-4,-34],[-7,1],[-2,10],[-5,0],[5,-23],[-4,-9],[-3,-22],[4,-4],[-2,-17],[-15,-24],[4,-6],[1,-11],[-9,3],[-7,-27],[1,-7],[-5,-13],[-4,4],[-6,-6],[-3,-20],[-5,-4],[-1,-13],[-17,-19],[-1,-8],[-10,-3],[-3,-23],[-5,-5],[-3,-20],[-5,1],[-6,-9],[-8,-2],[-6,5],[-6,-13],[-4,10],[-13,-17],[-1,14],[-14,-17]],[[8174,5611],[-4,-2]],[[8170,5609],[-5,-3],[-8,32],[-7,-3],[7,-22],[0,-15],[-3,-16],[-6,2],[-2,-10],[-5,1],[-12,-20],[-4,4],[-6,-9],[-1,9],[-16,-22],[-12,1],[-16,-22],[-5,1],[-8,-19],[0,-10],[6,-1],[-1,-11],[6,-14],[-4,-13],[-8,-4],[-3,13],[-5,7],[-2,22],[-3,7],[1,14],[3,17],[-7,10],[-11,-7],[0,15],[-11,4],[-5,11],[-3,-11],[-4,3],[-9,-16]],[[8001,5534],[-4,11],[-14,-3],[-13,27],[-6,2],[0,16],[-4,15],[6,23],[-7,13],[-5,-5],[-8,8],[-4,-5],[-15,30],[-13,-11],[-1,-17],[-13,-17],[-4,10],[-5,-8],[-1,-14],[-10,20],[-3,-16],[-6,15],[-9,-25],[-4,10],[-11,13],[-6,-25],[-3,-
 1]],[[7838,5600],[-11,7],[-6,-19],[3,-19],[4,-11],[-1,-49],[-6,8],[-7,-5],[-3,27]],[[7811,5539],[-1,15],[-7,-6],[-4,-12],[-7,-4],[-14,19],[-1,23],[-3,-2],[-19,10],[6,25],[-1,18],[5,22],[-12,3],[-6,6],[0,31],[-5,13],[0,13],[-5,11],[-9,-1],[-15,-18],[-3,6],[5,13],[-2,23],[-3,-1],[1,22],[6,8],[-2,8],[11,31],[1,16],[6,-3],[5,19],[5,3],[-4,16],[5,38],[0,30],[-2,9],[0,29],[-7,8],[-3,-11],[-6,31],[1,13],[-7,16],[-9,12],[-6,-23]],[[7705,6018],[-6,11],[-4,-3],[-8,19],[-3,16],[-12,40],[-11,-2],[-7,-15],[-8,-3],[-12,5],[-4,11],[-10,-16],[2,-5],[-20,-25],[-5,0],[-8,-13],[-2,-9],[-12,-19],[-1,-14],[-9,-9],[-9,-4],[-9,2]],[[7470,5953],[-4,17],[3,21],[-1,11],[-5,8],[-7,-9],[-7,-2],[0,-7]],[[7449,5992],[-8,4],[-3,-7],[-16,1],[-3,8],[-14,11],[-3,-13],[-12,-2],[-4,20],[-7,6],[-14,5],[2,19],[-7,-3],[-7,5],[-12,21],[-4,25],[-6,3],[-6,-9],[-4,2],[-10,31],[-9,3],[-8,19],[-11,10],[-1,19],[-14,6],[-11,-30],[-6,14]],[[7251,6160],[-7,14],[-13,13],[-12,28],[-7,-1],[-8,13],[-7,22],[-2,-8],[-7,1],[-1,13],[4,7],
 [-4,11],[2,14],[-8,19],[-2,22],[6,3],[8,-16],[5,2],[11,19],[-4,23],[1,15],[-11,10],[-5,17],[-2,38],[7,10],[-1,11],[-18,21],[-8,44],[1,13],[-7,3]],[[7162,6541],[-10,-2],[-18,13]],[[7134,6552],[-6,16],[-11,-5],[-8,21],[4,10],[-1,17],[-5,16],[-11,4],[-2,12],[-22,8]],[[7082,6666],[7,12],[-7,14],[2,12],[-5,23],[-1,31],[-12,11],[-6,0],[-2,-10],[-7,5],[-3,18],[4,10],[-6,18],[1,15]],[[7047,6825],[8,11],[-3,15],[5,18],[10,3],[9,17],[4,13],[10,-6],[11,13],[3,-23],[6,1],[9,9],[6,-1],[9,38],[6,7],[13,-5],[17,4],[8,25],[26,29],[12,7],[3,9],[10,1],[0,12]],[[7229,7022],[2,4],[-4,27],[3,12],[9,8],[-5,9],[11,8],[-4,14],[2,9],[-10,47],[0,39],[-3,12],[-7,-2],[-3,8],[5,8],[22,8],[25,15],[6,-14],[9,6],[8,-3],[1,18],[-9,7],[19,102],[1,18],[4,1],[21,-17],[21,1],[3,-12],[12,15],[8,2],[5,23],[-4,39],[7,35],[11,1],[11,8],[5,12],[-1,21],[5,8],[12,-1]],[[7427,7518],[14,5]],[[7441,7523],[-1,-26],[4,-14],[17,-19],[1,-9],[13,-16],[14,3],[5,-15],[8,4],[9,-16],[3,-25],[10,-23],[6,-30],[-4,-19],[3,-20],[-8,-20],[-2,
 -18],[7,-23],[7,1],[14,-10],[10,2],[13,-6],[8,3],[21,-6],[11,-20],[8,-2],[4,-10],[19,-18],[10,2],[-2,-20],[5,-2],[11,-55],[11,-20],[2,-14],[23,3],[63,-16],[15,8],[34,-10],[11,-1],[11,-24],[29,-13],[18,-18],[22,8],[0,-15],[14,-5],[7,12],[17,17],[25,21],[39,12],[17,-4],[19,4],[6,7],[20,16],[15,37],[18,17],[9,12],[-2,18],[-12,29],[9,45],[8,8],[12,-2],[4,-10],[14,-9],[15,-3],[11,14],[10,19],[4,13],[11,-1],[19,5],[15,19],[1,14],[11,29],[6,5],[14,-2],[2,16],[9,-4],[15,14],[13,-2],[3,5],[15,-10],[10,-2],[6,9],[0,14],[-6,18],[-16,26],[-2,10],[-9,7],[-6,15],[-10,5],[-12,-4]],[[8272,7438],[-7,-14]],[[8265,7424],[-5,-9],[-13,15],[-17,0],[-11,-11],[-8,16],[-1,13],[8,11],[0,19],[24,93]],[[8242,7571],[11,-11],[19,-12],[12,12],[13,20],[12,2],[8,8],[-2,36],[14,35],[10,42],[12,17],[6,16],[-4,16],[3,14],[-9,7],[-10,-3],[-1,12],[7,7],[17,30],[9,0],[31,15],[15,-1],[11,7],[10,-1],[17,-13],[14,-16],[11,4],[14,-11],[16,-38],[9,-27],[-2,-12],[9,-41],[5,-8],[-1,-17],[10,-23],[1,-30],[7,-8],[-2,-28],[9,-17],
 [7,-4],[20,3],[-1,-7],[9,-9],[17,-6],[6,-17],[9,-12],[12,0],[-4,-17],[8,-21],[-4,-21],[10,-26],[11,4],[4,-5],[26,3],[5,17],[11,11],[10,-1],[8,11],[18,10],[9,-9],[-4,-15],[6,-24],[-8,-20],[-9,-13],[-5,-45],[-4,-11],[2,-15],[-6,-9],[-8,-40],[-8,-11],[0,-22],[-8,-5]],[[4926,4672],[1,-15],[-4,-16],[5,-10],[3,-51],[-9,-28],[-3,-17],[-3,-37],[-5,-16],[-1,-16],[8,-72],[5,-3],[1,-29],[-2,-2]],[[4922,4360],[-13,-2],[-19,8],[-35,-8],[-17,-6],[-30,-27],[-15,-23],[-2,1]],[[4791,4303],[-1,2],[0,48],[2,7],[3,32],[-1,18],[-10,10],[-3,21],[-11,3],[-7,17],[6,15],[1,27],[-5,30]],[[4765,4533],[7,-1],[6,46],[-7,5],[0,15],[8,3],[9,-9],[-1,17],[-8,12],[3,45],[-6,0],[-2,12],[-1,27],[6,15]],[[4779,4720],[4,4],[5,16],[5,0],[3,-13],[11,-5],[0,11],[7,0],[1,23],[7,-7],[0,10],[5,2],[2,-18],[-2,-13],[6,-8],[6,17],[8,0]],[[5404,4923],[3,-17],[6,-8],[2,-35],[4,-4],[1,-28],[2,-12],[-3,-25],[1,-28],[6,-35],[7,-16],[-4,-11],[-5,4],[-13,-5],[-8,6],[-8,-2],[-6,-24],[11,-34],[23,-49],[7,-46],[4,-4],[-3,-19]],[[5451,4151
 ],[-3,-19],[2,-17],[-7,4],[-4,8],[-7,5],[-4,-4],[-3,8],[-4,-3],[-7,9],[-2,-3],[-6,10],[-8,-4],[-27,1]],[[5371,4146],[-2,7],[-13,-2],[-12,5],[-16,-2],[-11,2],[-1,-10]],[[5316,4146],[-37,0],[-5,12]],[[5274,4158],[2,39],[2,15],[-1,13],[-8,20],[-1,19],[2,9],[-4,7],[-3,-9],[-12,14],[-2,34],[-11,-3],[2,20]],[[5240,4336],[6,25],[3,33],[-2,16],[4,7],[17,41],[3,2],[2,17],[10,16],[3,-9],[7,0],[3,13],[6,-8],[7,-17],[1,-18],[6,-1],[5,12],[2,19],[9,17],[-5,11],[8,24],[1,14],[4,13],[1,30],[5,8],[-1,7],[8,5],[4,12],[2,39],[9,12],[2,19],[-1,20],[6,5],[3,38],[6,24],[6,19],[5,-3],[12,18],[-1,16],[2,30],[-3,14],[-10,4],[-3,50]],[[5392,4930],[7,0]],[[5399,4930],[5,-7]],[[5907,6518],[1,1],[1,0]],[[5909,6519],[-2,-1]],[[5937,6508],[1,-3]],[[5938,6505],[-6,2],[-2,10],[-7,0],[-10,-7],[-3,9]],[[5910,6519],[0,-1]],[[5910,6518],[4,-7],[15,9],[2,-10],[6,-2]],[[5764,4355],[9,-24],[0,-11],[7,-3],[4,-14],[6,-5],[10,19],[7,-4],[5,-10],[3,2],[5,21],[9,-11],[0,-8],[9,-22],[2,-11],[9,-6],[1,-18],[5,4],[3,-13]],[[5858
 ,4241],[2,-7],[-5,-26],[3,-10],[-4,-31],[5,-9],[3,4],[8,-16]],[[5870,4146],[-10,-19],[-12,-29],[0,-19]],[[5848,4079],[-7,-7],[-2,-17],[-6,-8],[0,-21],[-6,-29],[-1,-14]],[[5826,3983],[-6,-8],[-4,-27],[1,-6],[8,14]],[[5825,3956],[-3,-32],[1,-34]],[[5823,3890],[-6,-8],[-4,-13]],[[5813,3869],[-3,1],[-7,-38],[0,-20]],[[5803,3812],[1,-12],[3,-5]],[[5813,3751],[-4,-51],[5,-6],[-1,-28],[-3,-7],[0,-33],[7,-39],[-1,-16],[-4,-6],[4,-21],[5,-35],[7,-23],[6,-7],[6,-18],[2,-35],[7,-14],[2,-13]],[[5851,3399],[-47,-18]],[[5804,3381],[-15,-43],[-1,-21],[6,-1]],[[5794,3316],[5,-29],[-2,-12],[0,-41],[2,-9],[-4,-12],[-4,-38],[-2,-7],[4,-31],[12,-24],[3,-12],[11,3],[1,6],[9,7],[0,-92],[-5,0],[-1,15],[-11,-15],[-5,3],[-3,16],[-15,51],[-11,6],[-3,8],[-6,-2],[-6,26],[-5,9],[-2,17],[-4,-3],[-1,-19],[-8,-10],[-8,7],[-12,1],[-10,12],[-3,-3],[-4,9],[-2,32],[-16,-9],[-4,-8],[-7,2],[2,21],[-7,6],[-5,12]],[[5368,3569],[-10,2],[-3,-10],[-8,-6],[-6,21]],[[5365,3657],[8,-11],[9,7],[0,16],[7,-2],[12,16],[2,-11],[-3,-
 10],[1,-23],[7,-1],[5,6],[11,34],[7,9],[3,13],[9,7],[9,47],[-1,29],[1,18],[-1,25],[1,11],[8,19],[9,43],[5,13],[8,5],[12,36],[0,23],[6,48],[-2,39],[5,39],[0,43],[9,40],[4,25],[2,5],[1,25]],[[5335,3629],[-6,25],[1,5],[-20,48]],[[5310,3707],[3,18],[7,13],[5,-12],[5,9],[3,18],[-7,9],[3,11],[-4,14],[-2,34],[5,-4],[5,6],[4,-6],[11,6],[-1,23],[4,13],[6,-7],[6,-30],[13,-7],[8,23],[3,-27],[6,0],[4,10],[-2,7],[2,21],[4,3],[2,27],[0,23],[-2,15],[3,28],[-6,14],[-3,-1],[-1,10],[-8,7],[2,11],[-1,18],[5,25],[5,0],[6,27],[-5,17],[-3,16],[-10,4],[-7,-11],[-5,1],[-6,23],[0,21],[4,19]],[[3019,4842],[-17,-14],[-8,-35],[-7,-4],[-12,-48],[-1,-44],[-12,-48],[11,9],[2,-14],[3,3],[4,-35],[8,-23],[1,-16],[-4,-12],[1,-36],[7,-4],[3,-23],[23,-3],[2,-4],[8,7],[9,1],[7,-10],[7,0],[18,-59],[5,-3],[5,10],[12,-6],[20,7],[2,5],[8,-2],[4,-17],[-5,-16],[-1,-24],[-6,-13],[2,-17],[-2,-40],[6,-53],[4,-6],[5,-19],[-15,-38],[6,-6],[9,-24],[3,-5],[9,-77],[0,-8]],[[3057,3686],[-9,29],[-7,-3],[-5,6],[19,77],[-9,16],[-17,21],[
 -7,-10],[-5,-3],[-1,9],[-8,9],[-6,-14],[-12,-9],[-7,8],[-8,-6],[-8,15],[3,10],[-2,20],[-10,9],[1,14],[-4,16],[-17,19],[-4,30],[-7,17],[-16,22],[-1,-5]],[[2910,3983],[-11,13],[-4,0],[-7,20],[-7,7],[-3,-15],[-13,0],[-6,8],[-9,4],[-1,17],[-6,12],[-5,-1],[-7,8],[-13,20],[-7,17]],[[2811,4093],[-5,15],[5,13],[7,-3],[-3,30],[3,15],[7,17],[1,-7],[13,13],[5,25],[5,20],[7,17],[2,14],[-8,16],[3,54],[-3,51],[5,23],[-7,29],[3,8],[1,17],[-10,27],[1,10],[-6,13]],[[2837,4510],[2,18],[13,16],[1,13],[4,3],[-7,38],[1,15]],[[2851,4613],[9,-28],[6,-10],[-2,-12],[5,-3],[-1,34],[-5,10],[8,10],[11,24],[5,24],[13,8],[-1,18],[2,18],[-2,17],[4,9],[0,19],[13,24],[6,14],[9,-10],[-3,-10],[7,-4],[6,40],[9,-4],[15,1],[15,29],[13,13],[4,16],[-1,9],[12,9],[1,8],[13,-10],[3,-17],[-6,-17]],[[6209,3133],[-6,8],[1,31],[3,-2],[-1,-14],[3,-23]],[[4341,5091],[8,-22],[-1,-7],[-8,9],[1,20]],[[4366,5155],[4,-3],[-3,-13],[-4,2],[3,14]],[[4304,5226],[3,-6],[-9,-14],[-1,14],[7,6]],[[2677,4775],[7,-39],[17,-52],[6,-6]],[[2707,467
 8],[-1,-6],[-6,8],[-3,-12],[0,-27],[6,-10],[-6,-12],[2,-9],[-2,-27],[1,-15]],[[2698,4568],[-2,13],[-9,11],[-8,5],[-4,13],[4,15],[-1,15],[-8,18],[-8,12],[-12,9],[-3,27],[-10,15],[-1,-12],[7,-13],[-7,-15],[-4,12],[-10,9],[-4,13],[-3,19],[7,19],[-3,23],[1,11]],[[2620,4787],[3,9],[19,-19],[7,9],[9,-6],[4,-15],[7,-5],[8,7],[0,8]],[[2699,5566],[5,-3],[4,-21],[-8,-11],[-7,2],[3,11],[-3,16],[6,6]],[[2915,5420],[-1,5],[-1,0],[-2,-5],[-8,-1],[-6,5],[-14,3],[-8,-4],[-18,-2],[-14,-6],[2,14],[12,20],[3,12],[-8,18],[-4,-3],[-16,3],[-12,24],[-3,32],[-4,10],[-14,-6],[-8,5],[-20,19],[-7,12],[-13,0],[-11,8],[-12,2],[-8,17],[12,3],[1,7],[-7,8],[-25,1],[0,-5],[-13,-20],[-4,-11],[-15,-1],[-1,-16],[-12,-12],[-3,19],[6,31],[12,19],[14,10],[3,8],[19,4],[10,10],[26,-4],[4,-7],[14,4],[10,-13],[7,2],[9,-14],[5,-15],[8,-12],[15,-1],[17,-20],[5,-15],[10,-8],[1,7],[15,-28],[11,-14],[5,1],[7,-14],[12,1],[3,-7],[-5,-12],[2,-11],[8,4],[18,-9],[7,-19],[8,-3],[2,-9],[-3,-9],[-15,-2],[-8,-10]],[[5946,6510],[-3,0]],[[5
 943,6510],[-6,-2]],[[5910,6518],[4,-1],[2,17],[14,-5],[17,10],[-3,-14],[2,-15]],[[5946,6510],[-3,-8]],[[5943,6502],[0,8]],[[5938,6505],[0,-2]],[[5938,6503],[-3,-10],[-16,-14],[-8,2],[-9,7],[-1,20],[6,10]],[[5909,6519],[1,0]],[[5413,7645],[11,9],[4,-14],[14,-8],[13,-2],[0,-20],[10,-20],[14,21],[12,-9],[0,-11],[7,-10],[19,-4],[8,-29]],[[5525,7548],[-9,-2],[-9,-15],[-3,-13],[-15,-20],[-11,3],[-6,-18]],[[5385,7495],[-6,13],[-6,3],[-10,22],[-6,2],[-12,30],[4,12],[-7,10],[7,24],[26,15],[4,9],[21,12],[4,10],[9,-12]],[[5373,7918],[7,-5],[-1,-17],[-13,-1],[7,23]],[[5264,7929],[13,-1],[6,-22],[18,-12],[8,1],[3,-23],[8,-8],[5,17],[13,3],[11,21],[14,-3],[3,-11],[10,-11],[6,3],[6,-16],[-3,-5],[13,-13]],[[5398,7849],[4,-30],[-2,-17],[-6,-14],[14,-19],[-3,-12],[6,-24],[-4,-20],[4,-21],[6,-4],[2,-16],[-6,-27]],[[5271,7407],[-14,9]],[[5212,7410],[0,37],[5,18],[1,19],[11,25],[-15,5],[-7,10],[-4,-5],[-12,8],[-3,-4],[-6,20],[-4,1]],[[5178,7544],[4,25],[-8,6],[-3,17]],[[5168,7637],[-2,20],[8,26],[-8,30]
 ,[13,2],[18,29],[-2,16],[-8,1],[1,11],[9,2],[4,23],[0,20]],[[5201,7817],[-4,9],[5,21],[20,4],[9,-9],[9,19],[12,2],[-1,18],[-11,14],[12,12],[-9,17],[-1,11]],[[5242,7935],[22,-6]],[[6203,4816],[-9,-35]],[[6194,4781],[-9,6],[-6,-6],[-12,-5],[-5,11],[0,14],[-1,18],[18,67]],[[6179,4886],[4,2],[4,-10],[6,19],[6,6]],[[6199,4903],[6,-16],[2,-17],[-1,-17],[-9,-15],[-8,-6],[0,-11],[10,1],[4,-6]],[[3295,5111],[4,-6],[0,-16],[-3,-6],[-3,20],[2,8]],[[5314,7939],[13,-5],[1,-17],[-8,-1],[-13,11],[7,12]],[[5415,7959],[7,-7],[-2,-10],[-11,8],[6,9]],[[5289,7987],[3,-12],[10,-10],[-2,-17],[-12,-1],[-9,8],[-8,23],[18,9]],[[5344,8024],[8,-6],[0,-24],[-10,-12],[5,-14],[-7,-9],[0,-28],[-6,-10],[-6,13],[4,7],[-7,15],[-11,2],[-5,32],[16,21],[3,-16],[11,27],[5,2]],[[5242,7935],[-1,39],[-9,11],[-3,16],[5,6],[-7,16],[0,31],[17,6],[10,12],[5,14],[-16,-3],[-6,-12],[-6,4],[10,20],[22,3],[15,31],[13,-2],[3,-24],[-7,-23],[2,-25],[17,-8],[-6,-17],[-15,-5],[1,-17],[-18,-35],[3,-12],[-6,-7],[7,-13],[-8,-12]],[[3007,52
 87],[2,19],[-6,13]],[[3003,5319],[-1,3],[-1,5]],[[3001,5327],[4,1],[4,12],[-2,15],[4,16],[-4,36]],[[3007,5407],[3,12],[14,-3],[4,7],[11,-12],[5,0],[4,-8],[11,-2],[1,-15],[7,-24],[16,-8],[8,-1],[11,-22],[-3,-22],[-4,2],[-1,-12],[-6,12],[-11,5],[-8,-3],[-10,5],[-8,-18],[-10,-2],[-4,17],[-10,-21],[-10,-39],[-10,32]],[[5240,6645],[2,-7],[-7,-15],[-5,-58],[3,-13],[-1,-39],[-2,-33],[-11,-17],[-2,-11],[-7,-12],[-1,-14],[6,-32],[2,-17],[9,-9],[6,-18],[2,-24],[19,-31],[13,-132]],[[5266,6163],[-7,-8],[11,-37],[4,-35],[1,-24],[-2,-37],[4,-29],[-5,-41],[2,-27],[3,-6],[-2,-24],[-10,-11],[-2,-17],[15,-52],[2,-39],[5,-7],[5,-20],[9,6],[22,-18],[2,-3],[11,-54]],[[5334,5680],[-25,-37],[-37,-58],[-31,-46],[-32,-49],[-24,-52],[-21,-48],[-3,-3],[-42,-21]],[[5119,5366],[-26,-12],[-5,13],[4,15],[-1,31],[-8,10],[-15,9],[-6,16],[-8,-4],[-7,13],[0,8],[-9,15],[-4,0],[-1,27],[-32,54],[-27,45],[-44,73],[-25,44],[-38,63]],[[4867,5786],[-37,58],[-32,48],[-39,59]],[[4759,5951],[0,27]],[[4759,5978],[0,72],[9,17],[
 21,35],[7,0],[6,9],[10,-5],[2,5],[27,7],[6,-6],[7,26],[11,21],[7,8],[7,16],[20,14],[3,18],[-8,26],[4,5],[1,19],[23,10],[-3,18],[12,6],[35,-3],[1,22],[4,9],[-10,16],[-4,14],[2,9],[-5,13],[2,20],[-4,12],[2,30],[-4,19],[3,8],[-4,8],[2,11],[-11,19],[-1,6]],[[4939,6512],[13,3],[13,18],[2,13],[11,15],[4,-4],[10,14],[6,-9],[7,19],[26,31],[28,6],[8,5],[8,-2],[8,14],[7,-4],[8,2],[10,10],[26,-1],[9,-9],[4,-9],[6,1],[8,12],[13,5],[4,12],[15,-13],[7,2],[4,11],[14,-7],[3,-9],[9,8],[10,-1]],[[2775,3775],[-4,-2],[2,21],[4,5],[2,-8],[-4,-16]],[[2494,3954],[2,-11],[-5,-9],[-5,7],[1,11],[7,2]],[[2460,3972],[2,-14],[-6,-1],[-2,13],[6,2]],[[2479,3980],[6,-10],[-1,-6],[-6,2],[1,14]],[[2464,4001],[3,-12],[1,-14],[6,-15],[0,-13],[5,-10],[-4,-17],[-13,-3],[-3,9],[2,8],[9,15],[-7,19],[-2,20],[3,13]],[[2910,3983],[-6,-11],[6,-20],[-1,-15],[-3,-13],[-4,-42],[-15,-45],[-16,-32],[-33,-29],[-9,-28],[-5,-3],[-1,-26],[-8,-40],[0,-16],[-7,-14],[1,-7],[-5,-12],[-6,4],[-4,11],[-2,20],[-4,6],[-5,-3],[-8,14],[-8,-14],[
 -2,6],[0,29],[5,-1],[4,9],[-3,33],[-2,2]],[[2769,3746],[11,14],[6,46],[-4,5],[-3,-8],[-5,1],[-4,-9],[-10,22],[-8,12],[6,10],[0,14],[-3,21],[3,20],[-5,20],[3,8],[7,4],[4,21],[-2,16],[12,31],[1,36],[-3,13],[2,8],[17,16],[13,7],[4,19]],[[5951,6241],[2,-8]],[[5953,6233],[16,-105],[1,-19]],[[5970,6109],[-4,-13],[-3,-38],[-6,-33],[1,-24],[-5,-12],[-5,-1],[-10,20],[-4,16],[-10,19],[-2,34],[-7,15],[-6,25],[-4,26],[-5,-26],[7,-18],[1,-27],[6,-28],[8,-21],[10,-24],[1,-23],[4,-21],[4,-6],[5,-46],[9,-44],[6,-20],[19,-95],[7,-21],[0,-44],[5,-37],[6,-18],[9,-6],[7,-21],[12,-21],[0,-5]],[[6026,5571],[-39,0],[-32,0],[-32,0],[-54,0],[-49,0],[-33,0],[-54,0],[-38,0]],[[5695,5571],[0,126],[0,105],[0,104],[0,72],[0,109],[-3,21],[-1,30],[-4,18],[6,26],[3,21],[-4,25],[0,17],[8,20]],[[5700,6265],[1,-9],[6,-2],[12,8],[31,-12],[11,-6],[1,-7],[8,-6],[5,4],[1,-9],[14,-2],[18,-18],[13,9],[15,25],[7,3],[2,12],[10,-9],[7,3],[3,13],[12,-12],[9,6],[-2,-18],[6,-3],[4,-11],[6,13],[11,-16],[10,11],[4,-7],[11,1],[15,15
 ]],[[6179,4886],[-7,22],[-5,8],[-7,26],[-14,27],[-10,35],[-12,12],[-9,14],[-5,-3],[-11,10],[-8,-9],[-4,14],[-6,-10],[-12,-6],[-6,19],[-6,3],[-3,12],[-9,-55],[-8,24],[-4,-2],[-2,-10],[-9,3],[-6,-5]],[[6016,5015],[-3,61],[6,24],[1,20],[8,38],[-2,20],[3,17],[0,22],[11,-3],[3,21],[14,16],[6,-2],[7,27],[4,8]],[[6074,5284],[9,-44],[5,-43],[3,-

<TRUNCATED>

---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@qpid.apache.org
For additional commands, e-mail: commits-help@qpid.apache.org


[3/3] qpid-dispatch git commit: DISPATCH-1161 Handle edge routers in console

Posted by ea...@apache.org.
DISPATCH-1161 Handle edge routers in console


Project: http://git-wip-us.apache.org/repos/asf/qpid-dispatch/repo
Commit: http://git-wip-us.apache.org/repos/asf/qpid-dispatch/commit/3d79fda1
Tree: http://git-wip-us.apache.org/repos/asf/qpid-dispatch/tree/3d79fda1
Diff: http://git-wip-us.apache.org/repos/asf/qpid-dispatch/diff/3d79fda1

Branch: refs/heads/master
Commit: 3d79fda11168479eb39de8f7e0fdc23daa851ef7
Parents: 0d6dbac
Author: Ernest Allen <ea...@redhat.com>
Authored: Thu Nov 1 15:24:41 2018 -0400
Committer: Ernest Allen <ea...@redhat.com>
Committed: Thu Nov 1 15:24:41 2018 -0400

----------------------------------------------------------------------
 console/CMakeLists.txt                          |   3 +
 console/stand-alone/package-lock.json           |  34 +-
 console/stand-alone/package.json                |   4 +-
 console/stand-alone/plugin/css/dispatch.css     |   5 +-
 console/stand-alone/plugin/data/countries.json  |   2 +
 .../stand-alone/plugin/html/qdrTopology.html    |  47 +++
 .../stand-alone/plugin/js/amqp/connection.js    |   5 +-
 console/stand-alone/plugin/js/amqp/topology.js  | 106 ++++--
 console/stand-alone/plugin/js/amqp/utilities.js |  13 +-
 console/stand-alone/plugin/js/chord/data.js     |   2 +-
 console/stand-alone/plugin/js/topology/links.js | 132 ++++----
 console/stand-alone/plugin/js/topology/map.js   | 255 +++++++++++++++
 console/stand-alone/plugin/js/topology/nodes.js | 191 ++++++++++-
 .../plugin/js/topology/qdrTopology.js           | 325 +++++++++----------
 console/stand-alone/vendor-js.txt               |   4 +
 15 files changed, 855 insertions(+), 273 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/3d79fda1/console/CMakeLists.txt
----------------------------------------------------------------------
diff --git a/console/CMakeLists.txt b/console/CMakeLists.txt
index 0e7b248..e5eb7fa 100644
--- a/console/CMakeLists.txt
+++ b/console/CMakeLists.txt
@@ -131,6 +131,9 @@ if(CONSOLE_INSTALL)
           install(FILES ${VENDOR_FONTS}
             DESTINATION ${CONSOLE_STAND_ALONE_INSTALL_DIR}/fonts/
           )
+          install(DIRECTORY ${CONSOLE_SOURCE_DIR}/plugin/data/
+            DESTINATION ${CONSOLE_STAND_ALONE_INSTALL_DIR}/plugin/data
+          )
         else(NPX_EXE)
           message(STATUS "Cannot build console, npx not found.")
         endif(NPX_EXE)

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/3d79fda1/console/stand-alone/package-lock.json
----------------------------------------------------------------------
diff --git a/console/stand-alone/package-lock.json b/console/stand-alone/package-lock.json
index e9fe949..4e5e54e 100644
--- a/console/stand-alone/package-lock.json
+++ b/console/stand-alone/package-lock.json
@@ -1805,8 +1805,7 @@
     "commander": {
       "version": "2.15.1",
       "resolved": "https://registry.npmjs.org/commander/-/commander-2.15.1.tgz",
-      "integrity": "sha512-VlfT9F3V0v+jr4yxPc5gg9s62/fIVWsd2Bk2iD435um1NlGMYdVCq+MjcXnhYq2icNOizHr1kK+5TI6H0Hy0ag==",
-      "dev": true
+      "integrity": "sha512-VlfT9F3V0v+jr4yxPc5gg9s62/fIVWsd2Bk2iD435um1NlGMYdVCq+MjcXnhYq2icNOizHr1kK+5TI6H0Hy0ag=="
     },
     "component-emitter": {
       "version": "1.2.1",
@@ -1983,6 +1982,29 @@
       "resolved": "https://registry.npmjs.org/d3/-/d3-3.5.17.tgz",
       "integrity": "sha1-vEZ0gAQ3iyGjYMn8fPUjF5B2L7g="
     },
+    "d3-array": {
+      "version": "1.2.4",
+      "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-1.2.4.tgz",
+      "integrity": "sha512-KHW6M86R+FUPYGb3R5XiYjXPq7VzwxZ22buHhAEVG5ztoEcZZMLov530mmccaqA1GghZArjQV46fuc8kUqhhHw=="
+    },
+    "d3-geo": {
+      "version": "1.11.1",
+      "resolved": "https://registry.npmjs.org/d3-geo/-/d3-geo-1.11.1.tgz",
+      "integrity": "sha512-GsG7x9G9sykseLviOVSJ3h5yjw0ItLopOtuDQKUt1TRklEegCw5WAmnIpYYiCkSH/QgUMleAeE2xZK38Qb+1+Q==",
+      "requires": {
+        "d3-array": "1.2.4"
+      }
+    },
+    "d3-geo-projection": {
+      "version": "2.4.1",
+      "resolved": "https://registry.npmjs.org/d3-geo-projection/-/d3-geo-projection-2.4.1.tgz",
+      "integrity": "sha512-tDoYNK3OPlyeoY0Y6ZQ7v02Y2pGg4PTzh7GoNaHnLksIggInHiwXcbiziGHkjBoLbE2bQp9iL2OPsn+n+ZO/dg==",
+      "requires": {
+        "commander": "2.15.1",
+        "d3-array": "1.2.4",
+        "d3-geo": "1.11.1"
+      }
+    },
     "d3-path": {
       "version": "1.0.5",
       "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-1.0.5.tgz",
@@ -7393,6 +7415,14 @@
         "through2": "2.0.3"
       }
     },
+    "topojson-client": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/topojson-client/-/topojson-client-3.0.0.tgz",
+      "integrity": "sha1-H5kpOnfvQqRI0DKoGqmCtz82DS8=",
+      "requires": {
+        "commander": "2.15.1"
+      }
+    },
     "trim-right": {
       "version": "1.0.1",
       "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz",

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/3d79fda1/console/stand-alone/package.json
----------------------------------------------------------------------
diff --git a/console/stand-alone/package.json b/console/stand-alone/package.json
index 94f1dca..8c57fe1 100644
--- a/console/stand-alone/package.json
+++ b/console/stand-alone/package.json
@@ -36,6 +36,7 @@
     "bootstrap": "^3.3.7",
     "c3": "^0.4.18",
     "d3": "^3.5.14",
+    "d3-geo-projection": "^2.4.1",
     "d3-path": "^1.0.5",
     "d3-queue": "^3.0.7",
     "d3-time-format": "^2.1.1",
@@ -44,7 +45,8 @@
     "jquery.fancytree": "^2.26.0",
     "notifyjs-browser": "^0.4.2",
     "patternfly": "^3.30.0",
-    "rhea": "^0.2.13"
+    "rhea": "^0.2.13",
+    "topojson-client": "^3.0.0"
   },
   "devDependencies": {
     "@types/mocha": "^5.2.2",

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/3d79fda1/console/stand-alone/plugin/css/dispatch.css
----------------------------------------------------------------------
diff --git a/console/stand-alone/plugin/css/dispatch.css b/console/stand-alone/plugin/css/dispatch.css
index 5f26e6e..dc56aa2 100644
--- a/console/stand-alone/plugin/css/dispatch.css
+++ b/console/stand-alone/plugin/css/dispatch.css
@@ -953,7 +953,7 @@ circle.node.route-container {
     fill: orange;
 }
 
-text.console, text.on-demand, text.normal {
+text.console, text.on-demand, text.normal, test.edge {
 	font-family: FontAwesome;
 	font-weight: normal;
 	font-size: 16px;
@@ -1115,6 +1115,9 @@ svg {
   circle.node.normal.out {
       fill: #C0F0C0;
   }
+  circle.node.edge {
+      fill: #C0C0FF;
+  }
   circle.node.on-demand {
       fill: #C0FFC0;
   }


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@qpid.apache.org
For additional commands, e-mail: commits-help@qpid.apache.org