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/05/30 23:35:48 UTC

[01/11] qpid-dispatch git commit: DISPATCH-1001 Removed the deprecated directories

Repository: qpid-dispatch
Updated Branches:
  refs/heads/master e149d5933 -> 91def8472


http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/a5e2307f/console/dispatch-dashboard/dispatch/static/dashboard/dispatch/topology/topology.node-controller.js
----------------------------------------------------------------------
diff --git a/console/dispatch-dashboard/dispatch/static/dashboard/dispatch/topology/topology.node-controller.js b/console/dispatch-dashboard/dispatch/static/dashboard/dispatch/topology/topology.node-controller.js
deleted file mode 100644
index 2f31cca..0000000
--- a/console/dispatch-dashboard/dispatch/static/dashboard/dispatch/topology/topology.node-controller.js
+++ /dev/null
@@ -1,294 +0,0 @@
-/*
-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.
-*/
-/**
- * @module QDR
- */
-var QDR = (function (QDR) {
-  'use strict';
-
-  angular
-    .module('horizon.dashboard.dispatch.topology')
-    .controller('horizon.dashboard.dispatch.topology.TopologyNodeController', TopologyNodeController);
-
-  TopologyNodeController.$inject = [
-    '$scope',
-    'horizon.dashboard.dispatch.comService'
-  ]
-
-  function TopologyNodeController($scope, QDRService, dialog, newname) {
-   		var schema = QDRService.schema;
-   		var myEntities = ['router', 'log', 'listener' ];
-   		var typeMap = {integer: 'number', string: 'text', path: 'text', boolean: 'boolean'};
-		var newLinks = $('path.temp').toArray();    // jquery array of new links for the added router
-		var nodeInfo = QDRService.topology.nodeInfo();
-		var separatedEntities = []; // additional entities required if a link is reversed
-		var myPort = 0, myAddr = '0.0.0.0'; // port and address for new router
-   		$scope.entities = [];
-
-		// find max port number that is used in all the listeners
-		var getMaxPort = function (nodeInfo) {
-			var maxPort = 5674;
-			for (var key in nodeInfo) {
-				var node = nodeInfo[key];
-				var listeners = node['.listener'];
-				var attrs = listeners.attributeNames;
-				for (var i=0; i<listeners.results.length; ++i) {
-					var res = listeners.results[i];
-					var port = QDRService.valFor(attrs, res, 'port');
-					if (parseInt(port, 10) > maxPort)
-						maxPort = parseInt(port, 10);
-				}
-			}
-			return maxPort;
-		}
-		var maxPort = getMaxPort(nodeInfo);
-
-		// construct an object that contains all the info needed for a single tab's fields
-		var entity = function (actualName, tabName, humanName, ent, icon, link) {
-			var nameIndex = -1; // the index into attributes that the name field was placed
-			var index = 0;
-			var info = {
-			    actualName: actualName,
-				tabName:    tabName,
-				humanName:  humanName,
-				description:ent.description,
-				icon:       angular.isDefined(icon) ? icon : '',
-				references: ent.references,
-				link:       link,
-
-   		        attributes: $.map(ent.attributes, function (value, key) {
-					// skip identity and depricated fields
-   		            if (key == 'identity' || value.description.startsWith('Deprecated'))
-   		                return null;
-					var val = value['default'];
-					if (key == 'name')
-						nameIndex = index;
-					index++;
-					return {    name:       key,
-								humanName:  QDRService.humanify(key),
-                                description:value.description,
-                                type:       typeMap[value.type],
-                                rawtype:    value.type,
-                                input:      typeof value.type == 'string' ? value.type == 'boolean' ? 'boolean' : 'input'
-                                                                          : 'select',
-                                selected:   val ? val : undefined,
-                                'default':  value['default'],
-                                value:      val,
-                                required:   value.required,
-                                unique:     value.unique
-                    };
-                })
-			}
-			// move the 'name' attribute to the 1st position
-			if (nameIndex > -1) {
-				var tmp = info.attributes[0];
-				info.attributes[0] = info.attributes[nameIndex];
-				info.attributes[nameIndex] = tmp;
-			}
-			return info;
-		}
-
-		// remove the annotation fields
-		var stripAnnotations = function (entityName, ent, annotations) {
-			if (ent.references) {
-				var newEnt = {attributes: {}};
-				ent.references.forEach( function (annoKey) {
-					if (!annotations[annoKey])
-						annotations[annoKey] = {};
-					annotations[annoKey][entityName] = true;    // create the key/consolidate duplicates
-					var keys = Object.keys(schema.annotations[annoKey].attributes);
-					for (var attrib in ent.attributes) {
-						if (keys.indexOf(attrib) == -1) {
-							newEnt.attributes[attrib] = ent.attributes[attrib];
-						}
-					}
-					// add a field for the reference name
-					newEnt.attributes[annoKey] = {type: 'string',
-							description: 'Name of the ' + annoKey + ' section.',
-							'default': annoKey, required: true};
-				})
-				newEnt.references = ent.references;
-				newEnt.description = ent.description;
-				return newEnt;
-			}
-			return ent;
-		}
-
-		var annotations = {};
-   		myEntities.forEach(function (entityName) {
-   		    var ent = schema.entityTypes[entityName];
-   		    var hName = QDRService.humanify(entityName);
-   		    if (entityName == 'listener')
-   		        hName = "Listener for clients";
-   		    var noAnnotations = stripAnnotations(entityName, ent, annotations);
-			var ediv = entity(entityName, entityName, hName, noAnnotations, undefined);
-			if (ediv.actualName == 'router') {
-				ediv.attributes.filter(function (attr) { return attr.name == 'name'})[0].value = newname;
-				// if we have any new links (connectors), then the router's mode should be interior
-				if (newLinks.length) {
-					var roleAttr = ediv.attributes.filter(function (attr) { return attr.name == 'mode'})[0];
-					roleAttr.value = roleAttr.selected = "interior";
-				}
-			}
-			if (ediv.actualName == 'container') {
-				ediv.attributes.filter(function (attr) { return attr.name == 'containerName'})[0].value = newname + "-container";
-			}
-			if (ediv.actualName == 'listener') {
-				// find max port number that is used in all the listeners
-				ediv.attributes.filter(function (attr) { return attr.name == 'port'})[0].value = ++maxPort;
-			}
-			// special case for required log.module since it doesn't have a default
-			if (ediv.actualName == 'log') {
-				var moduleAttr = ediv.attributes.filter(function (attr) { return attr.name == 'module'})[0];
-				moduleAttr.value = moduleAttr.selected = "DEFAULT";
-			}
-			$scope.entities.push( ediv );
-   		})
-
-		// add a tab for each annotation that was found
-		var annotationEnts = [];
-		for (var key in annotations) {
-			ent = angular.copy(schema.annotations[key]);
-			ent.attributes.name = {type: "string", unique: true, description: "Unique name that is used to refer to this set of attributes."}
-			var ediv = entity(key, key+'tab', QDRService.humanify(key), ent, undefined);
-			ediv.attributes.filter(function (attr) { return attr.name == 'name'})[0].value = key;
-			$scope.entities.push( ediv );
-			annotationEnts.push( ediv );
-		}
-
-		// add an additional listener tab if any links are reversed
-		ent = schema.entityTypes['listener'];
-		newLinks.some(function (link) {
-			if (link.__data__.right) {
-	   		    var noAnnotations = stripAnnotations('listener', ent, annotations);
-				var ediv = entity("listener", "listener0", "Listener (internal)", noAnnotations, undefined);
-				ediv.attributes.filter(function (attr) { return attr.name == 'port'})[0].value = ++maxPort;
-				// connectors from other routers need to connect to this addr:port
-				myPort = maxPort;
-				myAddr = ediv.attributes.filter(function (attr) { return attr.name == 'host'})[0].value
-
-				// override the role. 'normal' is the default, but we want inter-router
-				ediv.attributes.filter(function( attr ) { return attr.name == 'role'})[0].selected = 'inter-router';
-				separatedEntities.push( ediv );
-				return true; // stop looping
-			}
-			return false;   // continue looping
-		})
-
-		// Add connector tabs for each new link on the topology graph
-		ent = schema.entityTypes['connector'];
-		newLinks.forEach(function (link, i) {
-   		    var noAnnotations = stripAnnotations('connector', ent, annotations);
-			var ediv = entity('connector', 'connector' + i, " " + link.__data__.source.name, noAnnotations, link.__data__.right, link)
-
-			// override the connector role. 'normal' is the default, but we want inter-router
-			ediv.attributes.filter(function( attr ) { return attr.name == 'role'})[0].selected = 'inter-router';
-
-			// find the addr:port of the inter-router listener to use
-			var listener = nodeInfo[link.__data__.source.key]['.listener'];
-			var attrs = listener.attributeNames;
-			for (var i=0; i<listener.results.length; ++i) {
-				var res = listener.results[i];
-				var role = QDRService.valFor(attrs, res, 'role');
-				if (role == 'inter-router') {
-					ediv.attributes.filter(function( attr ) { return attr.name == 'host'})[0].value =
-						QDRService.valFor(attrs, res, 'host')
-					ediv.attributes.filter(function( attr ) { return attr.name == 'port'})[0].value =
-						QDRService.valFor(attrs, res, 'port')
-					break;
-				}
-			}
-			if (link.__data__.right) {
-				// connectors from other nodes need to connect to the new router's listener addr:port
-   				ediv.attributes.filter(function (attr) { return attr.name == 'port'})[0].value = myPort;
-   				ediv.attributes.filter(function (attr) { return attr.name == 'host'})[0].value = myAddr;
-
-				separatedEntities.push(ediv)
-			}
-			else
-				$scope.entities.push( ediv );
-		})
-		Array.prototype.push.apply($scope.entities, separatedEntities);
-
-		// update the description on all the annotation tabs
-		annotationEnts.forEach ( function (ent) {
-			var shared = Object.keys(annotations[ent.actualName]);
-			ent.description += " These fields are shared by " + shared.join(" and ") + ".";
-
-		})
-
-		$scope.testPattern = function (attr) {
-			if (attr.rawtype == 'path')
-				return /^(\/)?([^/\0]+(\/)?)+$/;
-				//return /^(.*\/)([^/]*)$/;
-			return /(.*?)/;
-		}
-
-		$scope.attributeDescription = '';
-		$scope.attributeType = '';
-		$scope.attributeRequired = '';
-		$scope.attributeUnique = '';
-		$scope.active = 'router'
-		$scope.fieldsetDivs = "/fieldsetDivs.html"
-		$scope.setActive = function (tabName) {
-			$scope.active = tabName
-		}
-		$scope.isActive = function (tabName) {
-			return $scope.active === tabName
-		}
-		$scope.showDescription = function (attr, e) {
-			$scope.attributeDescription = attr.description;
-			var offset = jQuery(e.currentTarget).offset()
-			jQuery('.attr-description').offset({top: offset.top})
-
-			$scope.attributeType = "Type: " + JSON.stringify(attr.rawtype);
-			$scope.attributeRequired = attr.required ? 'required' : '';
-			$scope.attributeUnique = attr.unique ? 'Must be unique' : '';
-		}
-        // handle the download button click
-        // copy the dialog's values to the original node
-        $scope.download = function () {
-	        dialog.close({entities: $scope.entities, annotations: annotations});
-        }
-        $scope.cancel = function () {
-            dialog.close()
-        };
-
-		$scope.selectAnnotationTab = function (tabName) {
-            var tabs = $( "#tabs" ).tabs();
-            tabs.tabs("select", tabName);
-		}
-
-        var initTabs = function () {
-            var div = angular.element("#tabs");
-            if (!div.width()) {
-                setTimeout(initTabs, 100);
-                return;
-            }
-            $( "#tabs" )
-                .tabs()
-                .addClass('ui-tabs-vertical ui-helper-clearfix');
-        }
-        // start the update loop
-        initTabs();
-
-  };
-
-  return QDR;
-}(QDR || {}));

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/a5e2307f/console/dispatch-dashboard/dispatch/templates/dispatch/base.html
----------------------------------------------------------------------
diff --git a/console/dispatch-dashboard/dispatch/templates/dispatch/base.html b/console/dispatch-dashboard/dispatch/templates/dispatch/base.html
deleted file mode 100644
index 2efc7b6..0000000
--- a/console/dispatch-dashboard/dispatch/templates/dispatch/base.html
+++ /dev/null
@@ -1,29 +0,0 @@
-<!--
- 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
--->
-
-{% extends 'base.html' %}
-
-{% block sidebar %}
-  {% include 'horizon/common/_sidebar.html' %}
-{% endblock %}
-
-{% block main %}
-    {% include "horizon/_messages.html" %}
-    {% block dispatch_main %}{% endblock %}
-{% endblock %}

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/a5e2307f/console/dispatch-dashboard/dispatch/topology/__init__.py
----------------------------------------------------------------------
diff --git a/console/dispatch-dashboard/dispatch/topology/__init__.py b/console/dispatch-dashboard/dispatch/topology/__init__.py
deleted file mode 100644
index ccd4780..0000000
--- a/console/dispatch-dashboard/dispatch/topology/__init__.py
+++ /dev/null
@@ -1,18 +0,0 @@
-#
-# 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
-#
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/a5e2307f/console/dispatch-dashboard/dispatch/topology/panel.py
----------------------------------------------------------------------
diff --git a/console/dispatch-dashboard/dispatch/topology/panel.py b/console/dispatch-dashboard/dispatch/topology/panel.py
deleted file mode 100644
index 6efbeda..0000000
--- a/console/dispatch-dashboard/dispatch/topology/panel.py
+++ /dev/null
@@ -1,20 +0,0 @@
-# Licensed 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.
-
-from django.utils.translation import ugettext_lazy as _
-
-import horizon
-
-
-class Topology(horizon.Panel):
-    name = _("Topology")
-    slug = "topology"

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/a5e2307f/console/dispatch-dashboard/dispatch/topology/templates/topology/index.html
----------------------------------------------------------------------
diff --git a/console/dispatch-dashboard/dispatch/topology/templates/topology/index.html b/console/dispatch-dashboard/dispatch/topology/templates/topology/index.html
deleted file mode 100644
index fa13afe..0000000
--- a/console/dispatch-dashboard/dispatch/topology/templates/topology/index.html
+++ /dev/null
@@ -1,54 +0,0 @@
-<!--
- 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
--->
-
-{% extends 'base.html' %}
-{% load breadcrumb_nav %}
-{% load i18n %}
-{% block title %}{% trans "Topology" %}{% endblock %}
-
-{% block content %}
-<div class='topbar'>
-  {% include "header/_header.html" %}
-</div>
-<div id='main_content' class="topology-container">
-  {% include "horizon/_messages.html" %}
-  {% block sidebar %}
-    {% include 'horizon/common/_sidebar.html' %}
-  {% endblock %}
-  <div id='content_body'>
-    <div class='container-fluid'>
-      <div class="row">
-        <div class="col-xs-12">
-          <div class="page-breadcrumb">
-            {% block breadcrumb_nav %}
-              {% breadcrumb_nav %}
-            {% endblock %}
-          </div>
-
-          {% block page_header %}
-          {% endblock %}
-          {% block main %}
-          <ng-include src="'dispatch/topology.html'"></ng-include>
-          {% endblock %}
-        </div>
-      </div>
-    </div>
-  </div>
-</div>
-{% endblock %}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/a5e2307f/console/dispatch-dashboard/dispatch/topology/tests.py
----------------------------------------------------------------------
diff --git a/console/dispatch-dashboard/dispatch/topology/tests.py b/console/dispatch-dashboard/dispatch/topology/tests.py
deleted file mode 100644
index b321fc1..0000000
--- a/console/dispatch-dashboard/dispatch/topology/tests.py
+++ /dev/null
@@ -1,19 +0,0 @@
-# Licensed 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.
-
-from horizon.test import helpers as test
-
-
-class TopologyTests(test.TestCase):
-    # Unit tests for topology.
-    def test_me(self):
-        self.assertTrue(1 + 1 == 2)

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/a5e2307f/console/dispatch-dashboard/dispatch/topology/urls.py
----------------------------------------------------------------------
diff --git a/console/dispatch-dashboard/dispatch/topology/urls.py b/console/dispatch-dashboard/dispatch/topology/urls.py
deleted file mode 100644
index d8629f9..0000000
--- a/console/dispatch-dashboard/dispatch/topology/urls.py
+++ /dev/null
@@ -1,20 +0,0 @@
-# Licensed 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.
-
-from django.conf.urls import url
-
-from dispatch.topology import views
-
-
-urlpatterns = [
-    url(r'^$', views.IndexView.as_view(), name='index'),
-]

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/a5e2307f/console/dispatch-dashboard/dispatch/topology/views.py
----------------------------------------------------------------------
diff --git a/console/dispatch-dashboard/dispatch/topology/views.py b/console/dispatch-dashboard/dispatch/topology/views.py
deleted file mode 100644
index 03b6012..0000000
--- a/console/dispatch-dashboard/dispatch/topology/views.py
+++ /dev/null
@@ -1,22 +0,0 @@
-# Licensed 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.
-
-from horizon import views
-
-
-class IndexView(views.APIView):
-    # A very simple class-based view...
-    template_name = 'dispatch/topology/index.html'
-
-    def get_data(self, request, context, *args, **kwargs):
-        # Add data to the context here...
-        return context

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/a5e2307f/console/dispatch-dashboard/enabled/_4000_dispatch.py
----------------------------------------------------------------------
diff --git a/console/dispatch-dashboard/enabled/_4000_dispatch.py b/console/dispatch-dashboard/enabled/_4000_dispatch.py
deleted file mode 100644
index 16d3215..0000000
--- a/console/dispatch-dashboard/enabled/_4000_dispatch.py
+++ /dev/null
@@ -1,33 +0,0 @@
-#    Licensed 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.
-
-# The name of the dashboard to be added to HORIZON['dashboards']. Required.
-DASHBOARD = 'dispatch'
-
-DEFAULT = False
-
-ADD_EXCEPTIONS = {}
-
-# If set to True, this dashboard will not be added to the settings.
-DISABLED = False
-
-# A list of applications to be added to INSTALLED_APPS.
-ADD_INSTALLED_APPS = ['dispatch']
-ADD_ANGULAR_MODULES = [
-    'horizon.dashboard.dispatch',
-]
-
-ADD_SCSS_FILES = [
-    'dashboard/dispatch/dispatch.scss',
-]
-
-AUTO_DISCOVER_STATIC_FILES = True

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/a5e2307f/console/dispatch-dashboard/enabled/_4030_dispatch_overv_panel.py
----------------------------------------------------------------------
diff --git a/console/dispatch-dashboard/enabled/_4030_dispatch_overv_panel.py b/console/dispatch-dashboard/enabled/_4030_dispatch_overv_panel.py
deleted file mode 100644
index b5d0446..0000000
--- a/console/dispatch-dashboard/enabled/_4030_dispatch_overv_panel.py
+++ /dev/null
@@ -1,28 +0,0 @@
-#
-# 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
-#
-
-# The slug of the panel to be added to HORIZON_CONFIG. Required.
-PANEL = 'overv'
-# The slug of the dashboard the PANEL associated with. Required.
-PANEL_DASHBOARD = 'dispatch'
-# The slug of the panel group the PANEL is associated with.
-PANEL_GROUP = 'default'
-
-# Python panel class of the PANEL to be added.
-ADD_PANEL = 'dispatch.overv.panel.Overv'

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/a5e2307f/console/dispatch-dashboard/enabled/_4050_dispatch_topology_panel.py
----------------------------------------------------------------------
diff --git a/console/dispatch-dashboard/enabled/_4050_dispatch_topology_panel.py b/console/dispatch-dashboard/enabled/_4050_dispatch_topology_panel.py
deleted file mode 100644
index 37d408f..0000000
--- a/console/dispatch-dashboard/enabled/_4050_dispatch_topology_panel.py
+++ /dev/null
@@ -1,29 +0,0 @@
-#
-# 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
-#
-
-
-# The slug of the panel to be added to HORIZON_CONFIG. Required.
-PANEL = 'topology'
-# The slug of the dashboard the PANEL associated with. Required.
-PANEL_DASHBOARD = 'dispatch'
-# The slug of the panel group the PANEL is associated with.
-PANEL_GROUP = 'default'
-
-# Python panel class of the PANEL to be added.
-ADD_PANEL = 'dispatch.topology.panel.Topology'

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/a5e2307f/console/dispatch-dashboard/setup.py
----------------------------------------------------------------------
diff --git a/console/dispatch-dashboard/setup.py b/console/dispatch-dashboard/setup.py
deleted file mode 100644
index 2678275..0000000
--- a/console/dispatch-dashboard/setup.py
+++ /dev/null
@@ -1,42 +0,0 @@
-#! /usr/bin/env python
-#
-# Licensed 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.
-
-from setuptools import setup, find_packages
-
-setup(
-    name = 'dispatch',
-    version = '0.0.1',
-    description = 'dashboard extension for OpenStack Dashboard',
-    author = 'Apache Qpid',
-    author_email = 'dev@qpid.apache.org',
-    classifiers = [
-        'Environment :: OpenStack',
-        'Framework :: Django',
-        'Intended Audience :: Developers',
-        'Intended Audience :: System Administrators',
-        'License :: OSI Approved :: Apache Software License',
-        'Operating System :: OS Independent',
-        'Operating System :: POSIX :: Linux',
-        'Programming Language :: Python',
-        'Programming Language :: Python :: 2',
-        'Programming Language :: Python :: 2.7',
-        'Topic :: Internet :: WWW/HTTP',
-    ],
-    packages=find_packages(),
-    include_package_data = True,
-)
-
-
-


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


[08/11] qpid-dispatch git commit: DISPATCH-1001 Removed the deprecated directories

Posted by ea...@apache.org.
http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/a5e2307f/console/dispatch-dashboard/dispatch/static/dashboard/dispatch/lib/d3.v3.min.js
----------------------------------------------------------------------
diff --git a/console/dispatch-dashboard/dispatch/static/dashboard/dispatch/lib/d3.v3.min.js b/console/dispatch-dashboard/dispatch/static/dashboard/dispatch/lib/d3.v3.min.js
deleted file mode 100644
index 1664873..0000000
--- a/console/dispatch-dashboard/dispatch/static/dashboard/dispatch/lib/d3.v3.min.js
+++ /dev/null
@@ -1,5 +0,0 @@
-!function(){function n(n){return n&&(n.ownerDocument||n.document||n).documentElement}function t(n){return n&&(n.ownerDocument&&n.ownerDocument.defaultView||n.document&&n||n.defaultView)}function e(n,t){return t>n?-1:n>t?1:n>=t?0:NaN}function r(n){return null===n?NaN:+n}function i(n){return!isNaN(n)}function u(n){return{left:function(t,e,r,i){for(arguments.length<3&&(r=0),arguments.length<4&&(i=t.length);i>r;){var u=r+i>>>1;n(t[u],e)<0?r=u+1:i=u}return r},right:function(t,e,r,i){for(arguments.length<3&&(r=0),arguments.length<4&&(i=t.length);i>r;){var u=r+i>>>1;n(t[u],e)>0?i=u:r=u+1}return r}}}function o(n){return n.length}function a(n){for(var t=1;n*t%1;)t*=10;return t}function l(n,t){for(var e in t)Object.defineProperty(n.prototype,e,{value:t[e],enumerable:!1})}function c(){this._=Object.create(null)}function f(n){return(n+="")===bo||n[0]===_o?_o+n:n}function s(n){return(n+="")[0]===_o?n.slice(1):n}function h(n){return f(n)in this._}function p(n){return(n=f(n))in this._&&delete this
 ._[n]}function g(){var n=[];for(var t in this._)n.push(s(t));return n}function v(){var n=0;for(var t in this._)++n;return n}function d(){for(var n in this._)return!1;return!0}function y(){this._=Object.create(null)}function m(n){return n}function M(n,t,e){return function(){var r=e.apply(t,arguments);return r===t?n:r}}function x(n,t){if(t in n)return t;t=t.charAt(0).toUpperCase()+t.slice(1);for(var e=0,r=wo.length;r>e;++e){var i=wo[e]+t;if(i in n)return i}}function b(){}function _(){}function w(n){function t(){for(var t,r=e,i=-1,u=r.length;++i<u;)(t=r[i].on)&&t.apply(this,arguments);return n}var e=[],r=new c;return t.on=function(t,i){var u,o=r.get(t);return arguments.length<2?o&&o.on:(o&&(o.on=null,e=e.slice(0,u=e.indexOf(o)).concat(e.slice(u+1)),r.remove(t)),i&&e.push(r.set(t,{on:i})),n)},t}function S(){ao.event.preventDefault()}function k(){for(var n,t=ao.event;n=t.sourceEvent;)t=n;return t}function N(n){for(var t=new _,e=0,r=arguments.length;++e<r;)t[arguments[e]]=w(t);return t.of
 =function(e,r){return function(i){try{var u=i.sourceEvent=ao.event;i.target=n,ao.event=i,t[i.type].apply(e,r)}finally{ao.event=u}}},t}function E(n){return ko(n,Co),n}function A(n){return"function"==typeof n?n:function(){return No(n,this)}}function C(n){return"function"==typeof n?n:function(){return Eo(n,this)}}function z(n,t){function e(){this.removeAttribute(n)}function r(){this.removeAttributeNS(n.space,n.local)}function i(){this.setAttribute(n,t)}function u(){this.setAttributeNS(n.space,n.local,t)}function o(){var e=t.apply(this,arguments);null==e?this.removeAttribute(n):this.setAttribute(n,e)}function a(){var e=t.apply(this,arguments);null==e?this.removeAttributeNS(n.space,n.local):this.setAttributeNS(n.space,n.local,e)}return n=ao.ns.qualify(n),null==t?n.local?r:e:"function"==typeof t?n.local?a:o:n.local?u:i}function L(n){return n.trim().replace(/\s+/g," ")}function q(n){return new RegExp("(?:^|\\s+)"+ao.requote(n)+"(?:\\s+|$)","g")}function T(n){return(n+"").trim().split(/^|\s
 +/)}function R(n,t){function e(){for(var e=-1;++e<i;)n[e](this,t)}function r(){for(var e=-1,r=t.apply(this,arguments);++e<i;)n[e](this,r)}n=T(n).map(D);var i=n.length;return"function"==typeof t?r:e}function D(n){var t=q(n);return function(e,r){if(i=e.classList)return r?i.add(n):i.remove(n);var i=e.getAttribute("class")||"";r?(t.lastIndex=0,t.test(i)||e.setAttribute("class",L(i+" "+n))):e.setAttribute("class",L(i.replace(t," ")))}}function P(n,t,e){function r(){this.style.removeProperty(n)}function i(){this.style.setProperty(n,t,e)}function u(){var r=t.apply(this,arguments);null==r?this.style.removeProperty(n):this.style.setProperty(n,r,e)}return null==t?r:"function"==typeof t?u:i}function U(n,t){function e(){delete this[n]}function r(){this[n]=t}function i(){var e=t.apply(this,arguments);null==e?delete this[n]:this[n]=e}return null==t?e:"function"==typeof t?i:r}function j(n){function t(){var t=this.ownerDocument,e=this.namespaceURI;return e===zo&&t.documentElement.namespaceURI===zo?
 t.createElement(n):t.createElementNS(e,n)}function e(){return this.ownerDocument.createElementNS(n.space,n.local)}return"function"==typeof n?n:(n=ao.ns.qualify(n)).local?e:t}function F(){var n=this.parentNode;n&&n.removeChild(this)}function H(n){return{__data__:n}}function O(n){return function(){return Ao(this,n)}}function I(n){return arguments.length||(n=e),function(t,e){return t&&e?n(t.__data__,e.__data__):!t-!e}}function Y(n,t){for(var e=0,r=n.length;r>e;e++)for(var i,u=n[e],o=0,a=u.length;a>o;o++)(i=u[o])&&t(i,o,e);return n}function Z(n){return ko(n,qo),n}function V(n){var t,e;return function(r,i,u){var o,a=n[u].update,l=a.length;for(u!=e&&(e=u,t=0),i>=t&&(t=i+1);!(o=a[t])&&++t<l;);return o}}function X(n,t,e){function r(){var t=this[o];t&&(this.removeEventListener(n,t,t.$),delete this[o])}function i(){var i=l(t,co(arguments));r.call(this),this.addEventListener(n,this[o]=i,i.$=e),i._=t}function u(){var t,e=new RegExp("^__on([^.]+)"+ao.requote(n)+"$");for(var r in this)if(t=r.matc
 h(e)){var i=this[r];this.removeEventListener(t[1],i,i.$),delete this[r]}}var o="__on"+n,a=n.indexOf("."),l=$;a>0&&(n=n.slice(0,a));var c=To.get(n);return c&&(n=c,l=B),a?t?i:r:t?b:u}function $(n,t){return function(e){var r=ao.event;ao.event=e,t[0]=this.__data__;try{n.apply(this,t)}finally{ao.event=r}}}function B(n,t){var e=$(n,t);return function(n){var t=this,r=n.relatedTarget;r&&(r===t||8&r.compareDocumentPosition(t))||e.call(t,n)}}function W(e){var r=".dragsuppress-"+ ++Do,i="click"+r,u=ao.select(t(e)).on("touchmove"+r,S).on("dragstart"+r,S).on("selectstart"+r,S);if(null==Ro&&(Ro="onselectstart"in e?!1:x(e.style,"userSelect")),Ro){var o=n(e).style,a=o[Ro];o[Ro]="none"}return function(n){if(u.on(r,null),Ro&&(o[Ro]=a),n){var t=function(){u.on(i,null)};u.on(i,function(){S(),t()},!0),setTimeout(t,0)}}}function J(n,e){e.changedTouches&&(e=e.changedTouches[0]);var r=n.ownerSVGElement||n;if(r.createSVGPoint){var i=r.createSVGPoint();if(0>Po){var u=t(n);if(u.scrollX||u.scrollY){r=ao.select
 ("body").append("svg").style({position:"absolute",top:0,left:0,margin:0,padding:0,border:"none"},"important");var o=r[0][0].getScreenCTM();Po=!(o.f||o.e),r.remove()}}return Po?(i.x=e.pageX,i.y=e.pageY):(i.x=e.clientX,i.y=e.clientY),i=i.matrixTransform(n.getScreenCTM().inverse()),[i.x,i.y]}var a=n.getBoundingClientRect();return[e.clientX-a.left-n.clientLeft,e.clientY-a.top-n.clientTop]}function G(){return ao.event.changedTouches[0].identifier}function K(n){return n>0?1:0>n?-1:0}function Q(n,t,e){return(t[0]-n[0])*(e[1]-n[1])-(t[1]-n[1])*(e[0]-n[0])}function nn(n){return n>1?0:-1>n?Fo:Math.acos(n)}function tn(n){return n>1?Io:-1>n?-Io:Math.asin(n)}function en(n){return((n=Math.exp(n))-1/n)/2}function rn(n){return((n=Math.exp(n))+1/n)/2}function un(n){return((n=Math.exp(2*n))-1)/(n+1)}function on(n){return(n=Math.sin(n/2))*n}function an(){}function ln(n,t,e){return this instanceof ln?(this.h=+n,this.s=+t,void(this.l=+e)):arguments.length<2?n instanceof ln?new ln(n.h,n.s,n.l):_n(""+n,wn
 ,ln):new ln(n,t,e)}function cn(n,t,e){function r(n){return n>360?n-=360:0>n&&(n+=360),60>n?u+(o-u)*n/60:180>n?o:240>n?u+(o-u)*(240-n)/60:u}function i(n){return Math.round(255*r(n))}var u,o;return n=isNaN(n)?0:(n%=360)<0?n+360:n,t=isNaN(t)?0:0>t?0:t>1?1:t,e=0>e?0:e>1?1:e,o=.5>=e?e*(1+t):e+t-e*t,u=2*e-o,new mn(i(n+120),i(n),i(n-120))}function fn(n,t,e){return this instanceof fn?(this.h=+n,this.c=+t,void(this.l=+e)):arguments.length<2?n instanceof fn?new fn(n.h,n.c,n.l):n instanceof hn?gn(n.l,n.a,n.b):gn((n=Sn((n=ao.rgb(n)).r,n.g,n.b)).l,n.a,n.b):new fn(n,t,e)}function sn(n,t,e){return isNaN(n)&&(n=0),isNaN(t)&&(t=0),new hn(e,Math.cos(n*=Yo)*t,Math.sin(n)*t)}function hn(n,t,e){return this instanceof hn?(this.l=+n,this.a=+t,void(this.b=+e)):arguments.length<2?n instanceof hn?new hn(n.l,n.a,n.b):n instanceof fn?sn(n.h,n.c,n.l):Sn((n=mn(n)).r,n.g,n.b):new hn(n,t,e)}function pn(n,t,e){var r=(n+16)/116,i=r+t/500,u=r-e/200;return i=vn(i)*na,r=vn(r)*ta,u=vn(u)*ea,new mn(yn(3.2404542*i-1.53713
 85*r-.4985314*u),yn(-.969266*i+1.8760108*r+.041556*u),yn(.0556434*i-.2040259*r+1.0572252*u))}function gn(n,t,e){return n>0?new fn(Math.atan2(e,t)*Zo,Math.sqrt(t*t+e*e),n):new fn(NaN,NaN,n)}function vn(n){return n>.206893034?n*n*n:(n-4/29)/7.787037}function dn(n){return n>.008856?Math.pow(n,1/3):7.787037*n+4/29}function yn(n){return Math.round(255*(.00304>=n?12.92*n:1.055*Math.pow(n,1/2.4)-.055))}function mn(n,t,e){return this instanceof mn?(this.r=~~n,this.g=~~t,void(this.b=~~e)):arguments.length<2?n instanceof mn?new mn(n.r,n.g,n.b):_n(""+n,mn,cn):new mn(n,t,e)}function Mn(n){return new mn(n>>16,n>>8&255,255&n)}function xn(n){return Mn(n)+""}function bn(n){return 16>n?"0"+Math.max(0,n).toString(16):Math.min(255,n).toString(16)}function _n(n,t,e){var r,i,u,o=0,a=0,l=0;if(r=/([a-z]+)\((.*)\)/.exec(n=n.toLowerCase()))switch(i=r[2].split(","),r[1]){case"hsl":return e(parseFloat(i[0]),parseFloat(i[1])/100,parseFloat(i[2])/100);case"rgb":return t(Nn(i[0]),Nn(i[1]),Nn(i[2]))}return(u=ua.g
 et(n))?t(u.r,u.g,u.b):(null==n||"#"!==n.charAt(0)||isNaN(u=parseInt(n.slice(1),16))||(4===n.length?(o=(3840&u)>>4,o=o>>4|o,a=240&u,a=a>>4|a,l=15&u,l=l<<4|l):7===n.length&&(o=(16711680&u)>>16,a=(65280&u)>>8,l=255&u)),t(o,a,l))}function wn(n,t,e){var r,i,u=Math.min(n/=255,t/=255,e/=255),o=Math.max(n,t,e),a=o-u,l=(o+u)/2;return a?(i=.5>l?a/(o+u):a/(2-o-u),r=n==o?(t-e)/a+(e>t?6:0):t==o?(e-n)/a+2:(n-t)/a+4,r*=60):(r=NaN,i=l>0&&1>l?0:r),new ln(r,i,l)}function Sn(n,t,e){n=kn(n),t=kn(t),e=kn(e);var r=dn((.4124564*n+.3575761*t+.1804375*e)/na),i=dn((.2126729*n+.7151522*t+.072175*e)/ta),u=dn((.0193339*n+.119192*t+.9503041*e)/ea);return hn(116*i-16,500*(r-i),200*(i-u))}function kn(n){return(n/=255)<=.04045?n/12.92:Math.pow((n+.055)/1.055,2.4)}function Nn(n){var t=parseFloat(n);return"%"===n.charAt(n.length-1)?Math.round(2.55*t):t}function En(n){return"function"==typeof n?n:function(){return n}}function An(n){return function(t,e,r){return 2===arguments.length&&"function"==typeof e&&(r=e,e=null),
 Cn(t,e,n,r)}}function Cn(n,t,e,r){function i(){var n,t=l.status;if(!t&&Ln(l)||t>=200&&300>t||304===t){try{n=e.call(u,l)}catch(r){return void o.error.call(u,r)}o.load.call(u,n)}else o.error.call(u,l)}var u={},o=ao.dispatch("beforesend","progress","load","error"),a={},l=new XMLHttpRequest,c=null;return!this.XDomainRequest||"withCredentials"in l||!/^(http(s)?:)?\/\//.test(n)||(l=new XDomainRequest),"onload"in l?l.onload=l.onerror=i:l.onreadystatechange=function(){l.readyState>3&&i()},l.onprogress=function(n){var t=ao.event;ao.event=n;try{o.progress.call(u,l)}finally{ao.event=t}},u.header=function(n,t){return n=(n+"").toLowerCase(),arguments.length<2?a[n]:(null==t?delete a[n]:a[n]=t+"",u)},u.mimeType=function(n){return arguments.length?(t=null==n?null:n+"",u):t},u.responseType=function(n){return arguments.length?(c=n,u):c},u.response=function(n){return e=n,u},["get","post"].forEach(function(n){u[n]=function(){return u.send.apply(u,[n].concat(co(arguments)))}}),u.send=function(e,r,i){if(
 2===arguments.length&&"function"==typeof r&&(i=r,r=null),l.open(e,n,!0),null==t||"accept"in a||(a.accept=t+",*/*"),l.setRequestHeader)for(var f in a)l.setRequestHeader(f,a[f]);return null!=t&&l.overrideMimeType&&l.overrideMimeType(t),null!=c&&(l.responseType=c),null!=i&&u.on("error",i).on("load",function(n){i(null,n)}),o.beforesend.call(u,l),l.send(null==r?null:r),u},u.abort=function(){return l.abort(),u},ao.rebind(u,o,"on"),null==r?u:u.get(zn(r))}function zn(n){return 1===n.length?function(t,e){n(null==t?e:null)}:n}function Ln(n){var t=n.responseType;return t&&"text"!==t?n.response:n.responseText}function qn(n,t,e){var r=arguments.length;2>r&&(t=0),3>r&&(e=Date.now());var i=e+t,u={c:n,t:i,n:null};return aa?aa.n=u:oa=u,aa=u,la||(ca=clearTimeout(ca),la=1,fa(Tn)),u}function Tn(){var n=Rn(),t=Dn()-n;t>24?(isFinite(t)&&(clearTimeout(ca),ca=setTimeout(Tn,t)),la=0):(la=1,fa(Tn))}function Rn(){for(var n=Date.now(),t=oa;t;)n>=t.t&&t.c(n-t.t)&&(t.c=null),t=t.n;return n}function Dn(){for(var 
 n,t=oa,e=1/0;t;)t.c?(t.t<e&&(e=t.t),t=(n=t).n):t=n?n.n=t.n:oa=t.n;return aa=n,e}function Pn(n,t){return t-(n?Math.ceil(Math.log(n)/Math.LN10):1)}function Un(n,t){var e=Math.pow(10,3*xo(8-t));return{scale:t>8?function(n){return n/e}:function(n){return n*e},symbol:n}}function jn(n){var t=n.decimal,e=n.thousands,r=n.grouping,i=n.currency,u=r&&e?function(n,t){for(var i=n.length,u=[],o=0,a=r[0],l=0;i>0&&a>0&&(l+a+1>t&&(a=Math.max(1,t-l)),u.push(n.substring(i-=a,i+a)),!((l+=a+1)>t));)a=r[o=(o+1)%r.length];return u.reverse().join(e)}:m;return function(n){var e=ha.exec(n),r=e[1]||" ",o=e[2]||">",a=e[3]||"-",l=e[4]||"",c=e[5],f=+e[6],s=e[7],h=e[8],p=e[9],g=1,v="",d="",y=!1,m=!0;switch(h&&(h=+h.substring(1)),(c||"0"===r&&"="===o)&&(c=r="0",o="="),p){case"n":s=!0,p="g";break;case"%":g=100,d="%",p="f";break;case"p":g=100,d="%",p="r";break;case"b":case"o":case"x":case"X":"#"===l&&(v="0"+p.toLowerCase());case"c":m=!1;case"d":y=!0,h=0;break;case"s":g=-1,p="r"}"$"===l&&(v=i[0],d=i[1]),"r"!=p||h||(p
 ="g"),null!=h&&("g"==p?h=Math.max(1,Math.min(21,h)):"e"!=p&&"f"!=p||(h=Math.max(0,Math.min(20,h)))),p=pa.get(p)||Fn;var M=c&&s;return function(n){var e=d;if(y&&n%1)return"";var i=0>n||0===n&&0>1/n?(n=-n,"-"):"-"===a?"":a;if(0>g){var l=ao.formatPrefix(n,h);n=l.scale(n),e=l.symbol+d}else n*=g;n=p(n,h);var x,b,_=n.lastIndexOf(".");if(0>_){var w=m?n.lastIndexOf("e"):-1;0>w?(x=n,b=""):(x=n.substring(0,w),b=n.substring(w))}else x=n.substring(0,_),b=t+n.substring(_+1);!c&&s&&(x=u(x,1/0));var S=v.length+x.length+b.length+(M?0:i.length),k=f>S?new Array(S=f-S+1).join(r):"";return M&&(x=u(k+x,k.length?f-b.length:1/0)),i+=v,n=x+b,("<"===o?i+n+k:">"===o?k+i+n:"^"===o?k.substring(0,S>>=1)+i+n+k.substring(S):i+(M?n:k+n))+e}}}function Fn(n){return n+""}function Hn(){this._=new Date(arguments.length>1?Date.UTC.apply(this,arguments):arguments[0])}function On(n,t,e){function r(t){var e=n(t),r=u(e,1);return r-t>t-e?e:r}function i(e){return t(e=n(new va(e-1)),1),e}function u(n,e){return t(n=new va(+n),e
 ),n}function o(n,r,u){var o=i(n),a=[];if(u>1)for(;r>o;)e(o)%u||a.push(new Date(+o)),t(o,1);else for(;r>o;)a.push(new Date(+o)),t(o,1);return a}function a(n,t,e){try{va=Hn;var r=new Hn;return r._=n,o(r,t,e)}finally{va=Date}}n.floor=n,n.round=r,n.ceil=i,n.offset=u,n.range=o;var l=n.utc=In(n);return l.floor=l,l.round=In(r),l.ceil=In(i),l.offset=In(u),l.range=a,n}function In(n){return function(t,e){try{va=Hn;var r=new Hn;return r._=t,n(r,e)._}finally{va=Date}}}function Yn(n){function t(n){function t(t){for(var e,i,u,o=[],a=-1,l=0;++a<r;)37===n.charCodeAt(a)&&(o.push(n.slice(l,a)),null!=(i=ya[e=n.charAt(++a)])&&(e=n.charAt(++a)),(u=A[e])&&(e=u(t,null==i?"e"===e?" ":"0":i)),o.push(e),l=a+1);return o.push(n.slice(l,a)),o.join("")}var r=n.length;return t.parse=function(t){var r={y:1900,m:0,d:1,H:0,M:0,S:0,L:0,Z:null},i=e(r,n,t,0);if(i!=t.length)return null;"p"in r&&(r.H=r.H%12+12*r.p);var u=null!=r.Z&&va!==Hn,o=new(u?Hn:va);return"j"in r?o.setFullYear(r.y,0,r.j):"W"in r||"U"in r?("w"in r||(
 r.w="W"in r?1:0),o.setFullYear(r.y,0,1),o.setFullYear(r.y,0,"W"in r?(r.w+6)%7+7*r.W-(o.getDay()+5)%7:r.w+7*r.U-(o.getDay()+6)%7)):o.setFullYear(r.y,r.m,r.d),o.setHours(r.H+(r.Z/100|0),r.M+r.Z%100,r.S,r.L),u?o._:o},t.toString=function(){return n},t}function e(n,t,e,r){for(var i,u,o,a=0,l=t.length,c=e.length;l>a;){if(r>=c)return-1;if(i=t.charCodeAt(a++),37===i){if(o=t.charAt(a++),u=C[o in ya?t.charAt(a++):o],!u||(r=u(n,e,r))<0)return-1}else if(i!=e.charCodeAt(r++))return-1}return r}function r(n,t,e){_.lastIndex=0;var r=_.exec(t.slice(e));return r?(n.w=w.get(r[0].toLowerCase()),e+r[0].length):-1}function i(n,t,e){x.lastIndex=0;var r=x.exec(t.slice(e));return r?(n.w=b.get(r[0].toLowerCase()),e+r[0].length):-1}function u(n,t,e){N.lastIndex=0;var r=N.exec(t.slice(e));return r?(n.m=E.get(r[0].toLowerCase()),e+r[0].length):-1}function o(n,t,e){S.lastIndex=0;var r=S.exec(t.slice(e));return r?(n.m=k.get(r[0].toLowerCase()),e+r[0].length):-1}function a(n,t,r){return e(n,A.c.toString(),t,r)}fun
 ction l(n,t,r){return e(n,A.x.toString(),t,r)}function c(n,t,r){return e(n,A.X.toString(),t,r)}function f(n,t,e){var r=M.get(t.slice(e,e+=2).toLowerCase());return null==r?-1:(n.p=r,e)}var s=n.dateTime,h=n.date,p=n.time,g=n.periods,v=n.days,d=n.shortDays,y=n.months,m=n.shortMonths;t.utc=function(n){function e(n){try{va=Hn;var t=new va;return t._=n,r(t)}finally{va=Date}}var r=t(n);return e.parse=function(n){try{va=Hn;var t=r.parse(n);return t&&t._}finally{va=Date}},e.toString=r.toString,e},t.multi=t.utc.multi=ct;var M=ao.map(),x=Vn(v),b=Xn(v),_=Vn(d),w=Xn(d),S=Vn(y),k=Xn(y),N=Vn(m),E=Xn(m);g.forEach(function(n,t){M.set(n.toLowerCase(),t)});var A={a:function(n){return d[n.getDay()]},A:function(n){return v[n.getDay()]},b:function(n){return m[n.getMonth()]},B:function(n){return y[n.getMonth()]},c:t(s),d:function(n,t){return Zn(n.getDate(),t,2)},e:function(n,t){return Zn(n.getDate(),t,2)},H:function(n,t){return Zn(n.getHours(),t,2)},I:function(n,t){return Zn(n.getHours()%12||12,t,2)},j:fu
 nction(n,t){return Zn(1+ga.dayOfYear(n),t,3)},L:function(n,t){return Zn(n.getMilliseconds(),t,3)},m:function(n,t){return Zn(n.getMonth()+1,t,2)},M:function(n,t){return Zn(n.getMinutes(),t,2)},p:function(n){return g[+(n.getHours()>=12)]},S:function(n,t){return Zn(n.getSeconds(),t,2)},U:function(n,t){return Zn(ga.sundayOfYear(n),t,2)},w:function(n){return n.getDay()},W:function(n,t){return Zn(ga.mondayOfYear(n),t,2)},x:t(h),X:t(p),y:function(n,t){return Zn(n.getFullYear()%100,t,2)},Y:function(n,t){return Zn(n.getFullYear()%1e4,t,4)},Z:at,"%":function(){return"%"}},C={a:r,A:i,b:u,B:o,c:a,d:tt,e:tt,H:rt,I:rt,j:et,L:ot,m:nt,M:it,p:f,S:ut,U:Bn,w:$n,W:Wn,x:l,X:c,y:Gn,Y:Jn,Z:Kn,"%":lt};return t}function Zn(n,t,e){var r=0>n?"-":"",i=(r?-n:n)+"",u=i.length;return r+(e>u?new Array(e-u+1).join(t)+i:i)}function Vn(n){return new RegExp("^(?:"+n.map(ao.requote).join("|")+")","i")}function Xn(n){for(var t=new c,e=-1,r=n.length;++e<r;)t.set(n[e].toLowerCase(),e);return t}function $n(n,t,e){ma.lastIn
 dex=0;var r=ma.exec(t.slice(e,e+1));return r?(n.w=+r[0],e+r[0].length):-1}function Bn(n,t,e){ma.lastIndex=0;var r=ma.exec(t.slice(e));return r?(n.U=+r[0],e+r[0].length):-1}function Wn(n,t,e){ma.lastIndex=0;var r=ma.exec(t.slice(e));return r?(n.W=+r[0],e+r[0].length):-1}function Jn(n,t,e){ma.lastIndex=0;var r=ma.exec(t.slice(e,e+4));return r?(n.y=+r[0],e+r[0].length):-1}function Gn(n,t,e){ma.lastIndex=0;var r=ma.exec(t.slice(e,e+2));return r?(n.y=Qn(+r[0]),e+r[0].length):-1}function Kn(n,t,e){return/^[+-]\d{4}$/.test(t=t.slice(e,e+5))?(n.Z=-t,e+5):-1}function Qn(n){return n+(n>68?1900:2e3)}function nt(n,t,e){ma.lastIndex=0;var r=ma.exec(t.slice(e,e+2));return r?(n.m=r[0]-1,e+r[0].length):-1}function tt(n,t,e){ma.lastIndex=0;var r=ma.exec(t.slice(e,e+2));return r?(n.d=+r[0],e+r[0].length):-1}function et(n,t,e){ma.lastIndex=0;var r=ma.exec(t.slice(e,e+3));return r?(n.j=+r[0],e+r[0].length):-1}function rt(n,t,e){ma.lastIndex=0;var r=ma.exec(t.slice(e,e+2));return r?(n.H=+r[0],e+r[0].len
 gth):-1}function it(n,t,e){ma.lastIndex=0;var r=ma.exec(t.slice(e,e+2));return r?(n.M=+r[0],e+r[0].length):-1}function ut(n,t,e){ma.lastIndex=0;var r=ma.exec(t.slice(e,e+2));return r?(n.S=+r[0],e+r[0].length):-1}function ot(n,t,e){ma.lastIndex=0;var r=ma.exec(t.slice(e,e+3));return r?(n.L=+r[0],e+r[0].length):-1}function at(n){var t=n.getTimezoneOffset(),e=t>0?"-":"+",r=xo(t)/60|0,i=xo(t)%60;return e+Zn(r,"0",2)+Zn(i,"0",2)}function lt(n,t,e){Ma.lastIndex=0;var r=Ma.exec(t.slice(e,e+1));return r?e+r[0].length:-1}function ct(n){for(var t=n.length,e=-1;++e<t;)n[e][0]=this(n[e][0]);return function(t){for(var e=0,r=n[e];!r[1](t);)r=n[++e];return r[0](t)}}function ft(){}function st(n,t,e){var r=e.s=n+t,i=r-n,u=r-i;e.t=n-u+(t-i)}function ht(n,t){n&&wa.hasOwnProperty(n.type)&&wa[n.type](n,t)}function pt(n,t,e){var r,i=-1,u=n.length-e;for(t.lineStart();++i<u;)r=n[i],t.point(r[0],r[1],r[2]);t.lineEnd()}function gt(n,t){var e=-1,r=n.length;for(t.polygonStart();++e<r;)pt(n[e],t,1);t.polygonEnd
 ()}function vt(){function n(n,t){n*=Yo,t=t*Yo/2+Fo/4;var e=n-r,o=e>=0?1:-1,a=o*e,l=Math.cos(t),c=Math.sin(t),f=u*c,s=i*l+f*Math.cos(a),h=f*o*Math.sin(a);ka.add(Math.atan2(h,s)),r=n,i=l,u=c}var t,e,r,i,u;Na.point=function(o,a){Na.point=n,r=(t=o)*Yo,i=Math.cos(a=(e=a)*Yo/2+Fo/4),u=Math.sin(a)},Na.lineEnd=function(){n(t,e)}}function dt(n){var t=n[0],e=n[1],r=Math.cos(e);return[r*Math.cos(t),r*Math.sin(t),Math.sin(e)]}function yt(n,t){return n[0]*t[0]+n[1]*t[1]+n[2]*t[2]}function mt(n,t){return[n[1]*t[2]-n[2]*t[1],n[2]*t[0]-n[0]*t[2],n[0]*t[1]-n[1]*t[0]]}function Mt(n,t){n[0]+=t[0],n[1]+=t[1],n[2]+=t[2]}function xt(n,t){return[n[0]*t,n[1]*t,n[2]*t]}function bt(n){var t=Math.sqrt(n[0]*n[0]+n[1]*n[1]+n[2]*n[2]);n[0]/=t,n[1]/=t,n[2]/=t}function _t(n){return[Math.atan2(n[1],n[0]),tn(n[2])]}function wt(n,t){return xo(n[0]-t[0])<Uo&&xo(n[1]-t[1])<Uo}function St(n,t){n*=Yo;var e=Math.cos(t*=Yo);kt(e*Math.cos(n),e*Math.sin(n),Math.sin(t))}function kt(n,t,e){++Ea,Ca+=(n-Ca)/Ea,za+=(t-za)/Ea,La+=
 (e-La)/Ea}function Nt(){function n(n,i){n*=Yo;var u=Math.cos(i*=Yo),o=u*Math.cos(n),a=u*Math.sin(n),l=Math.sin(i),c=Math.atan2(Math.sqrt((c=e*l-r*a)*c+(c=r*o-t*l)*c+(c=t*a-e*o)*c),t*o+e*a+r*l);Aa+=c,qa+=c*(t+(t=o)),Ta+=c*(e+(e=a)),Ra+=c*(r+(r=l)),kt(t,e,r)}var t,e,r;ja.point=function(i,u){i*=Yo;var o=Math.cos(u*=Yo);t=o*Math.cos(i),e=o*Math.sin(i),r=Math.sin(u),ja.point=n,kt(t,e,r)}}function Et(){ja.point=St}function At(){function n(n,t){n*=Yo;var e=Math.cos(t*=Yo),o=e*Math.cos(n),a=e*Math.sin(n),l=Math.sin(t),c=i*l-u*a,f=u*o-r*l,s=r*a-i*o,h=Math.sqrt(c*c+f*f+s*s),p=r*o+i*a+u*l,g=h&&-nn(p)/h,v=Math.atan2(h,p);Da+=g*c,Pa+=g*f,Ua+=g*s,Aa+=v,qa+=v*(r+(r=o)),Ta+=v*(i+(i=a)),Ra+=v*(u+(u=l)),kt(r,i,u)}var t,e,r,i,u;ja.point=function(o,a){t=o,e=a,ja.point=n,o*=Yo;var l=Math.cos(a*=Yo);r=l*Math.cos(o),i=l*Math.sin(o),u=Math.sin(a),kt(r,i,u)},ja.lineEnd=function(){n(t,e),ja.lineEnd=Et,ja.point=St}}function Ct(n,t){function e(e,r){return e=n(e,r),t(e[0],e[1])}return n.invert&&t.invert&&(e.inv
 ert=function(e,r){return e=t.invert(e,r),e&&n.invert(e[0],e[1])}),e}function zt(){return!0}function Lt(n,t,e,r,i){var u=[],o=[];if(n.forEach(function(n){if(!((t=n.length-1)<=0)){var t,e=n[0],r=n[t];if(wt(e,r)){i.lineStart();for(var a=0;t>a;++a)i.point((e=n[a])[0],e[1]);return void i.lineEnd()}var l=new Tt(e,n,null,!0),c=new Tt(e,null,l,!1);l.o=c,u.push(l),o.push(c),l=new Tt(r,n,null,!1),c=new Tt(r,null,l,!0),l.o=c,u.push(l),o.push(c)}}),o.sort(t),qt(u),qt(o),u.length){for(var a=0,l=e,c=o.length;c>a;++a)o[a].e=l=!l;for(var f,s,h=u[0];;){for(var p=h,g=!0;p.v;)if((p=p.n)===h)return;f=p.z,i.lineStart();do{if(p.v=p.o.v=!0,p.e){if(g)for(var a=0,c=f.length;c>a;++a)i.point((s=f[a])[0],s[1]);else r(p.x,p.n.x,1,i);p=p.n}else{if(g){f=p.p.z;for(var a=f.length-1;a>=0;--a)i.point((s=f[a])[0],s[1])}else r(p.x,p.p.x,-1,i);p=p.p}p=p.o,f=p.z,g=!g}while(!p.v);i.lineEnd()}}}function qt(n){if(t=n.length){for(var t,e,r=0,i=n[0];++r<t;)i.n=e=n[r],e.p=i,i=e;i.n=e=n[0],e.p=i}}function Tt(n,t,e,r){this.x=n,t
 his.z=t,this.o=e,this.e=r,this.v=!1,this.n=this.p=null}function Rt(n,t,e,r){return function(i,u){function o(t,e){var r=i(t,e);n(t=r[0],e=r[1])&&u.point(t,e)}function a(n,t){var e=i(n,t);d.point(e[0],e[1])}function l(){m.point=a,d.lineStart()}function c(){m.point=o,d.lineEnd()}function f(n,t){v.push([n,t]);var e=i(n,t);x.point(e[0],e[1])}function s(){x.lineStart(),v=[]}function h(){f(v[0][0],v[0][1]),x.lineEnd();var n,t=x.clean(),e=M.buffer(),r=e.length;if(v.pop(),g.push(v),v=null,r)if(1&t){n=e[0];var i,r=n.length-1,o=-1;if(r>0){for(b||(u.polygonStart(),b=!0),u.lineStart();++o<r;)u.point((i=n[o])[0],i[1]);u.lineEnd()}}else r>1&&2&t&&e.push(e.pop().concat(e.shift())),p.push(e.filter(Dt))}var p,g,v,d=t(u),y=i.invert(r[0],r[1]),m={point:o,lineStart:l,lineEnd:c,polygonStart:function(){m.point=f,m.lineStart=s,m.lineEnd=h,p=[],g=[]},polygonEnd:function(){m.point=o,m.lineStart=l,m.lineEnd=c,p=ao.merge(p);var n=Ot(y,g);p.length?(b||(u.polygonStart(),b=!0),Lt(p,Ut,n,e,u)):n&&(b||(u.polygonSta
 rt(),b=!0),u.lineStart(),e(null,null,1,u),u.lineEnd()),b&&(u.polygonEnd(),b=!1),p=g=null},sphere:function(){u.polygonStart(),u.lineStart(),e(null,null,1,u),u.lineEnd(),u.polygonEnd()}},M=Pt(),x=t(M),b=!1;return m}}function Dt(n){return n.length>1}function Pt(){var n,t=[];return{lineStart:function(){t.push(n=[])},point:function(t,e){n.push([t,e])},lineEnd:b,buffer:function(){var e=t;return t=[],n=null,e},rejoin:function(){t.length>1&&t.push(t.pop().concat(t.shift()))}}}function Ut(n,t){return((n=n.x)[0]<0?n[1]-Io-Uo:Io-n[1])-((t=t.x)[0]<0?t[1]-Io-Uo:Io-t[1])}function jt(n){var t,e=NaN,r=NaN,i=NaN;return{lineStart:function(){n.lineStart(),t=1},point:function(u,o){var a=u>0?Fo:-Fo,l=xo(u-e);xo(l-Fo)<Uo?(n.point(e,r=(r+o)/2>0?Io:-Io),n.point(i,r),n.lineEnd(),n.lineStart(),n.point(a,r),n.point(u,r),t=0):i!==a&&l>=Fo&&(xo(e-i)<Uo&&(e-=i*Uo),xo(u-a)<Uo&&(u-=a*Uo),r=Ft(e,r,u,o),n.point(i,r),n.lineEnd(),n.lineStart(),n.point(a,r),t=0),n.point(e=u,r=o),i=a},lineEnd:function(){n.lineEnd(),e=r=
 NaN},clean:function(){return 2-t}}}function Ft(n,t,e,r){var i,u,o=Math.sin(n-e);return xo(o)>Uo?Math.atan((Math.sin(t)*(u=Math.cos(r))*Math.sin(e)-Math.sin(r)*(i=Math.cos(t))*Math.sin(n))/(i*u*o)):(t+r)/2}function Ht(n,t,e,r){var i;if(null==n)i=e*Io,r.point(-Fo,i),r.point(0,i),r.point(Fo,i),r.point(Fo,0),r.point(Fo,-i),r.point(0,-i),r.point(-Fo,-i),r.point(-Fo,0),r.point(-Fo,i);else if(xo(n[0]-t[0])>Uo){var u=n[0]<t[0]?Fo:-Fo;i=e*u/2,r.point(-u,i),r.point(0,i),r.point(u,i)}else r.point(t[0],t[1])}function Ot(n,t){var e=n[0],r=n[1],i=[Math.sin(e),-Math.cos(e),0],u=0,o=0;ka.reset();for(var a=0,l=t.length;l>a;++a){var c=t[a],f=c.length;if(f)for(var s=c[0],h=s[0],p=s[1]/2+Fo/4,g=Math.sin(p),v=Math.cos(p),d=1;;){d===f&&(d=0),n=c[d];var y=n[0],m=n[1]/2+Fo/4,M=Math.sin(m),x=Math.cos(m),b=y-h,_=b>=0?1:-1,w=_*b,S=w>Fo,k=g*M;if(ka.add(Math.atan2(k*_*Math.sin(w),v*x+k*Math.cos(w))),u+=S?b+_*Ho:b,S^h>=e^y>=e){var N=mt(dt(s),dt(n));bt(N);var E=mt(i,N);bt(E);var A=(S^b>=0?-1:1)*tn(E[2]);(r>A||r==
 =A&&(N[0]||N[1]))&&(o+=S^b>=0?1:-1)}if(!d++)break;h=y,g=M,v=x,s=n}}return(-Uo>u||Uo>u&&-Uo>ka)^1&o}function It(n){function t(n,t){return Math.cos(n)*Math.cos(t)>u}function e(n){var e,u,l,c,f;return{lineStart:function(){c=l=!1,f=1},point:function(s,h){var p,g=[s,h],v=t(s,h),d=o?v?0:i(s,h):v?i(s+(0>s?Fo:-Fo),h):0;if(!e&&(c=l=v)&&n.lineStart(),v!==l&&(p=r(e,g),(wt(e,p)||wt(g,p))&&(g[0]+=Uo,g[1]+=Uo,v=t(g[0],g[1]))),v!==l)f=0,v?(n.lineStart(),p=r(g,e),n.point(p[0],p[1])):(p=r(e,g),n.point(p[0],p[1]),n.lineEnd()),e=p;else if(a&&e&&o^v){var y;d&u||!(y=r(g,e,!0))||(f=0,o?(n.lineStart(),n.point(y[0][0],y[0][1]),n.point(y[1][0],y[1][1]),n.lineEnd()):(n.point(y[1][0],y[1][1]),n.lineEnd(),n.lineStart(),n.point(y[0][0],y[0][1])))}!v||e&&wt(e,g)||n.point(g[0],g[1]),e=g,l=v,u=d},lineEnd:function(){l&&n.lineEnd(),e=null},clean:function(){return f|(c&&l)<<1}}}function r(n,t,e){var r=dt(n),i=dt(t),o=[1,0,0],a=mt(r,i),l=yt(a,a),c=a[0],f=l-c*c;if(!f)return!e&&n;var s=u*l/f,h=-u*c/f,p=mt(o,a),g=xt(o,s)
 ,v=xt(a,h);Mt(g,v);var d=p,y=yt(g,d),m=yt(d,d),M=y*y-m*(yt(g,g)-1);if(!(0>M)){var x=Math.sqrt(M),b=xt(d,(-y-x)/m);if(Mt(b,g),b=_t(b),!e)return b;var _,w=n[0],S=t[0],k=n[1],N=t[1];w>S&&(_=w,w=S,S=_);var E=S-w,A=xo(E-Fo)<Uo,C=A||Uo>E;if(!A&&k>N&&(_=k,k=N,N=_),C?A?k+N>0^b[1]<(xo(b[0]-w)<Uo?k:N):k<=b[1]&&b[1]<=N:E>Fo^(w<=b[0]&&b[0]<=S)){var z=xt(d,(-y+x)/m);return Mt(z,g),[b,_t(z)]}}}function i(t,e){var r=o?n:Fo-n,i=0;return-r>t?i|=1:t>r&&(i|=2),-r>e?i|=4:e>r&&(i|=8),i}var u=Math.cos(n),o=u>0,a=xo(u)>Uo,l=ve(n,6*Yo);return Rt(t,e,l,o?[0,-n]:[-Fo,n-Fo])}function Yt(n,t,e,r){return function(i){var u,o=i.a,a=i.b,l=o.x,c=o.y,f=a.x,s=a.y,h=0,p=1,g=f-l,v=s-c;if(u=n-l,g||!(u>0)){if(u/=g,0>g){if(h>u)return;p>u&&(p=u)}else if(g>0){if(u>p)return;u>h&&(h=u)}if(u=e-l,g||!(0>u)){if(u/=g,0>g){if(u>p)return;u>h&&(h=u)}else if(g>0){if(h>u)return;p>u&&(p=u)}if(u=t-c,v||!(u>0)){if(u/=v,0>v){if(h>u)return;p>u&&(p=u)}else if(v>0){if(u>p)return;u>h&&(h=u)}if(u=r-c,v||!(0>u)){if(u/=v,0>v){if(u>p)return;u>h&&
 (h=u)}else if(v>0){if(h>u)return;p>u&&(p=u)}return h>0&&(i.a={x:l+h*g,y:c+h*v}),1>p&&(i.b={x:l+p*g,y:c+p*v}),i}}}}}}function Zt(n,t,e,r){function i(r,i){return xo(r[0]-n)<Uo?i>0?0:3:xo(r[0]-e)<Uo?i>0?2:1:xo(r[1]-t)<Uo?i>0?1:0:i>0?3:2}function u(n,t){return o(n.x,t.x)}function o(n,t){var e=i(n,1),r=i(t,1);return e!==r?e-r:0===e?t[1]-n[1]:1===e?n[0]-t[0]:2===e?n[1]-t[1]:t[0]-n[0]}return function(a){function l(n){for(var t=0,e=d.length,r=n[1],i=0;e>i;++i)for(var u,o=1,a=d[i],l=a.length,c=a[0];l>o;++o)u=a[o],c[1]<=r?u[1]>r&&Q(c,u,n)>0&&++t:u[1]<=r&&Q(c,u,n)<0&&--t,c=u;return 0!==t}function c(u,a,l,c){var f=0,s=0;if(null==u||(f=i(u,l))!==(s=i(a,l))||o(u,a)<0^l>0){do c.point(0===f||3===f?n:e,f>1?r:t);while((f=(f+l+4)%4)!==s)}else c.point(a[0],a[1])}function f(i,u){return i>=n&&e>=i&&u>=t&&r>=u}function s(n,t){f(n,t)&&a.point(n,t)}function h(){C.point=g,d&&d.push(y=[]),S=!0,w=!1,b=_=NaN}function p(){v&&(g(m,M),x&&w&&E.rejoin(),v.push(E.buffer())),C.point=s,w&&a.lineEnd()}function g(n,t){n=
 Math.max(-Ha,Math.min(Ha,n)),t=Math.max(-Ha,Math.min(Ha,t));var e=f(n,t);if(d&&y.push([n,t]),S)m=n,M=t,x=e,S=!1,e&&(a.lineStart(),a.point(n,t));else if(e&&w)a.point(n,t);else{var r={a:{x:b,y:_},b:{x:n,y:t}};A(r)?(w||(a.lineStart(),a.point(r.a.x,r.a.y)),a.point(r.b.x,r.b.y),e||a.lineEnd(),k=!1):e&&(a.lineStart(),a.point(n,t),k=!1)}b=n,_=t,w=e}var v,d,y,m,M,x,b,_,w,S,k,N=a,E=Pt(),A=Yt(n,t,e,r),C={point:s,lineStart:h,lineEnd:p,polygonStart:function(){a=E,v=[],d=[],k=!0},polygonEnd:function(){a=N,v=ao.merge(v);var t=l([n,r]),e=k&&t,i=v.length;(e||i)&&(a.polygonStart(),e&&(a.lineStart(),c(null,null,1,a),a.lineEnd()),i&&Lt(v,u,t,c,a),a.polygonEnd()),v=d=y=null}};return C}}function Vt(n){var t=0,e=Fo/3,r=ae(n),i=r(t,e);return i.parallels=function(n){return arguments.length?r(t=n[0]*Fo/180,e=n[1]*Fo/180):[t/Fo*180,e/Fo*180]},i}function Xt(n,t){function e(n,t){var e=Math.sqrt(u-2*i*Math.sin(t))/i;return[e*Math.sin(n*=i),o-e*Math.cos(n)]}var r=Math.sin(n),i=(r+Math.sin(t))/2,u=1+r*(2*i-r),o=M
 ath.sqrt(u)/i;return e.invert=function(n,t){var e=o-t;return[Math.atan2(n,e)/i,tn((u-(n*n+e*e)*i*i)/(2*i))]},e}function $t(){function n(n,t){Ia+=i*n-r*t,r=n,i=t}var t,e,r,i;$a.point=function(u,o){$a.point=n,t=r=u,e=i=o},$a.lineEnd=function(){n(t,e)}}function Bt(n,t){Ya>n&&(Ya=n),n>Va&&(Va=n),Za>t&&(Za=t),t>Xa&&(Xa=t)}function Wt(){function n(n,t){o.push("M",n,",",t,u)}function t(n,t){o.push("M",n,",",t),a.point=e}function e(n,t){o.push("L",n,",",t)}function r(){a.point=n}function i(){o.push("Z")}var u=Jt(4.5),o=[],a={point:n,lineStart:function(){a.point=t},lineEnd:r,polygonStart:function(){a.lineEnd=i},polygonEnd:function(){a.lineEnd=r,a.point=n},pointRadius:function(n){return u=Jt(n),a},result:function(){if(o.length){var n=o.join("");return o=[],n}}};return a}function Jt(n){return"m0,"+n+"a"+n+","+n+" 0 1,1 0,"+-2*n+"a"+n+","+n+" 0 1,1 0,"+2*n+"z"}function Gt(n,t){Ca+=n,za+=t,++La}function Kt(){function n(n,r){var i=n-t,u=r-e,o=Math.sqrt(i*i+u*u);qa+=o*(t+n)/2,Ta+=o*(e+r)/2,Ra+=o,G
 t(t=n,e=r)}var t,e;Wa.point=function(r,i){Wa.point=n,Gt(t=r,e=i)}}function Qt(){Wa.point=Gt}function ne(){function n(n,t){var e=n-r,u=t-i,o=Math.sqrt(e*e+u*u);qa+=o*(r+n)/2,Ta+=o*(i+t)/2,Ra+=o,o=i*n-r*t,Da+=o*(r+n),Pa+=o*(i+t),Ua+=3*o,Gt(r=n,i=t)}var t,e,r,i;Wa.point=function(u,o){Wa.point=n,Gt(t=r=u,e=i=o)},Wa.lineEnd=function(){n(t,e)}}function te(n){function t(t,e){n.moveTo(t+o,e),n.arc(t,e,o,0,Ho)}function e(t,e){n.moveTo(t,e),a.point=r}function r(t,e){n.lineTo(t,e)}function i(){a.point=t}function u(){n.closePath()}var o=4.5,a={point:t,lineStart:function(){a.point=e},lineEnd:i,polygonStart:function(){a.lineEnd=u},polygonEnd:function(){a.lineEnd=i,a.point=t},pointRadius:function(n){return o=n,a},result:b};return a}function ee(n){function t(n){return(a?r:e)(n)}function e(t){return ue(t,function(e,r){e=n(e,r),t.point(e[0],e[1])})}function r(t){function e(e,r){e=n(e,r),t.point(e[0],e[1])}function r(){M=NaN,S.point=u,t.lineStart()}function u(e,r){var u=dt([e,r]),o=n(e,r);i(M,x,m,b,_,
 w,M=o[0],x=o[1],m=e,b=u[0],_=u[1],w=u[2],a,t),t.point(M,x)}function o(){S.point=e,t.lineEnd()}function l(){
-r(),S.point=c,S.lineEnd=f}function c(n,t){u(s=n,h=t),p=M,g=x,v=b,d=_,y=w,S.point=u}function f(){i(M,x,m,b,_,w,p,g,s,v,d,y,a,t),S.lineEnd=o,o()}var s,h,p,g,v,d,y,m,M,x,b,_,w,S={point:e,lineStart:r,lineEnd:o,polygonStart:function(){t.polygonStart(),S.lineStart=l},polygonEnd:function(){t.polygonEnd(),S.lineStart=r}};return S}function i(t,e,r,a,l,c,f,s,h,p,g,v,d,y){var m=f-t,M=s-e,x=m*m+M*M;if(x>4*u&&d--){var b=a+p,_=l+g,w=c+v,S=Math.sqrt(b*b+_*_+w*w),k=Math.asin(w/=S),N=xo(xo(w)-1)<Uo||xo(r-h)<Uo?(r+h)/2:Math.atan2(_,b),E=n(N,k),A=E[0],C=E[1],z=A-t,L=C-e,q=M*z-m*L;(q*q/x>u||xo((m*z+M*L)/x-.5)>.3||o>a*p+l*g+c*v)&&(i(t,e,r,a,l,c,A,C,N,b/=S,_/=S,w,d,y),y.point(A,C),i(A,C,N,b,_,w,f,s,h,p,g,v,d,y))}}var u=.5,o=Math.cos(30*Yo),a=16;return t.precision=function(n){return arguments.length?(a=(u=n*n)>0&&16,t):Math.sqrt(u)},t}function re(n){var t=ee(function(t,e){return n([t*Zo,e*Zo])});return function(n){return le(t(n))}}function ie(n){this.stream=n}function ue(n,t){return{point:t,sphere:functio
 n(){n.sphere()},lineStart:function(){n.lineStart()},lineEnd:function(){n.lineEnd()},polygonStart:function(){n.polygonStart()},polygonEnd:function(){n.polygonEnd()}}}function oe(n){return ae(function(){return n})()}function ae(n){function t(n){return n=a(n[0]*Yo,n[1]*Yo),[n[0]*h+l,c-n[1]*h]}function e(n){return n=a.invert((n[0]-l)/h,(c-n[1])/h),n&&[n[0]*Zo,n[1]*Zo]}function r(){a=Ct(o=se(y,M,x),u);var n=u(v,d);return l=p-n[0]*h,c=g+n[1]*h,i()}function i(){return f&&(f.valid=!1,f=null),t}var u,o,a,l,c,f,s=ee(function(n,t){return n=u(n,t),[n[0]*h+l,c-n[1]*h]}),h=150,p=480,g=250,v=0,d=0,y=0,M=0,x=0,b=Fa,_=m,w=null,S=null;return t.stream=function(n){return f&&(f.valid=!1),f=le(b(o,s(_(n)))),f.valid=!0,f},t.clipAngle=function(n){return arguments.length?(b=null==n?(w=n,Fa):It((w=+n)*Yo),i()):w},t.clipExtent=function(n){return arguments.length?(S=n,_=n?Zt(n[0][0],n[0][1],n[1][0],n[1][1]):m,i()):S},t.scale=function(n){return arguments.length?(h=+n,r()):h},t.translate=function(n){return argum
 ents.length?(p=+n[0],g=+n[1],r()):[p,g]},t.center=function(n){return arguments.length?(v=n[0]%360*Yo,d=n[1]%360*Yo,r()):[v*Zo,d*Zo]},t.rotate=function(n){return arguments.length?(y=n[0]%360*Yo,M=n[1]%360*Yo,x=n.length>2?n[2]%360*Yo:0,r()):[y*Zo,M*Zo,x*Zo]},ao.rebind(t,s,"precision"),function(){return u=n.apply(this,arguments),t.invert=u.invert&&e,r()}}function le(n){return ue(n,function(t,e){n.point(t*Yo,e*Yo)})}function ce(n,t){return[n,t]}function fe(n,t){return[n>Fo?n-Ho:-Fo>n?n+Ho:n,t]}function se(n,t,e){return n?t||e?Ct(pe(n),ge(t,e)):pe(n):t||e?ge(t,e):fe}function he(n){return function(t,e){return t+=n,[t>Fo?t-Ho:-Fo>t?t+Ho:t,e]}}function pe(n){var t=he(n);return t.invert=he(-n),t}function ge(n,t){function e(n,t){var e=Math.cos(t),a=Math.cos(n)*e,l=Math.sin(n)*e,c=Math.sin(t),f=c*r+a*i;return[Math.atan2(l*u-f*o,a*r-c*i),tn(f*u+l*o)]}var r=Math.cos(n),i=Math.sin(n),u=Math.cos(t),o=Math.sin(t);return e.invert=function(n,t){var e=Math.cos(t),a=Math.cos(n)*e,l=Math.sin(n)*e,c=Math
 .sin(t),f=c*u-l*o;return[Math.atan2(l*u+c*o,a*r+f*i),tn(f*r-a*i)]},e}function ve(n,t){var e=Math.cos(n),r=Math.sin(n);return function(i,u,o,a){var l=o*t;null!=i?(i=de(e,i),u=de(e,u),(o>0?u>i:i>u)&&(i+=o*Ho)):(i=n+o*Ho,u=n-.5*l);for(var c,f=i;o>0?f>u:u>f;f-=l)a.point((c=_t([e,-r*Math.cos(f),-r*Math.sin(f)]))[0],c[1])}}function de(n,t){var e=dt(t);e[0]-=n,bt(e);var r=nn(-e[1]);return((-e[2]<0?-r:r)+2*Math.PI-Uo)%(2*Math.PI)}function ye(n,t,e){var r=ao.range(n,t-Uo,e).concat(t);return function(n){return r.map(function(t){return[n,t]})}}function me(n,t,e){var r=ao.range(n,t-Uo,e).concat(t);return function(n){return r.map(function(t){return[t,n]})}}function Me(n){return n.source}function xe(n){return n.target}function be(n,t,e,r){var i=Math.cos(t),u=Math.sin(t),o=Math.cos(r),a=Math.sin(r),l=i*Math.cos(n),c=i*Math.sin(n),f=o*Math.cos(e),s=o*Math.sin(e),h=2*Math.asin(Math.sqrt(on(r-t)+i*o*on(e-n))),p=1/Math.sin(h),g=h?function(n){var t=Math.sin(n*=h)*p,e=Math.sin(h-n)*p,r=e*l+t*f,i=e*c+t*s
 ,o=e*u+t*a;return[Math.atan2(i,r)*Zo,Math.atan2(o,Math.sqrt(r*r+i*i))*Zo]}:function(){return[n*Zo,t*Zo]};return g.distance=h,g}function _e(){function n(n,i){var u=Math.sin(i*=Yo),o=Math.cos(i),a=xo((n*=Yo)-t),l=Math.cos(a);Ja+=Math.atan2(Math.sqrt((a=o*Math.sin(a))*a+(a=r*u-e*o*l)*a),e*u+r*o*l),t=n,e=u,r=o}var t,e,r;Ga.point=function(i,u){t=i*Yo,e=Math.sin(u*=Yo),r=Math.cos(u),Ga.point=n},Ga.lineEnd=function(){Ga.point=Ga.lineEnd=b}}function we(n,t){function e(t,e){var r=Math.cos(t),i=Math.cos(e),u=n(r*i);return[u*i*Math.sin(t),u*Math.sin(e)]}return e.invert=function(n,e){var r=Math.sqrt(n*n+e*e),i=t(r),u=Math.sin(i),o=Math.cos(i);return[Math.atan2(n*u,r*o),Math.asin(r&&e*u/r)]},e}function Se(n,t){function e(n,t){o>0?-Io+Uo>t&&(t=-Io+Uo):t>Io-Uo&&(t=Io-Uo);var e=o/Math.pow(i(t),u);return[e*Math.sin(u*n),o-e*Math.cos(u*n)]}var r=Math.cos(n),i=function(n){return Math.tan(Fo/4+n/2)},u=n===t?Math.sin(n):Math.log(r/Math.cos(t))/Math.log(i(t)/i(n)),o=r*Math.pow(i(n),u)/u;return u?(e.inver
 t=function(n,t){var e=o-t,r=K(u)*Math.sqrt(n*n+e*e);return[Math.atan2(n,e)/u,2*Math.atan(Math.pow(o/r,1/u))-Io]},e):Ne}function ke(n,t){function e(n,t){var e=u-t;return[e*Math.sin(i*n),u-e*Math.cos(i*n)]}var r=Math.cos(n),i=n===t?Math.sin(n):(r-Math.cos(t))/(t-n),u=r/i+n;return xo(i)<Uo?ce:(e.invert=function(n,t){var e=u-t;return[Math.atan2(n,e)/i,u-K(i)*Math.sqrt(n*n+e*e)]},e)}function Ne(n,t){return[n,Math.log(Math.tan(Fo/4+t/2))]}function Ee(n){var t,e=oe(n),r=e.scale,i=e.translate,u=e.clipExtent;return e.scale=function(){var n=r.apply(e,arguments);return n===e?t?e.clipExtent(null):e:n},e.translate=function(){var n=i.apply(e,arguments);return n===e?t?e.clipExtent(null):e:n},e.clipExtent=function(n){var o=u.apply(e,arguments);if(o===e){if(t=null==n){var a=Fo*r(),l=i();u([[l[0]-a,l[1]-a],[l[0]+a,l[1]+a]])}}else t&&(o=null);return o},e.clipExtent(null)}function Ae(n,t){return[Math.log(Math.tan(Fo/4+t/2)),-n]}function Ce(n){return n[0]}function ze(n){return n[1]}function Le(n){for(va
 r t=n.length,e=[0,1],r=2,i=2;t>i;i++){for(;r>1&&Q(n[e[r-2]],n[e[r-1]],n[i])<=0;)--r;e[r++]=i}return e.slice(0,r)}function qe(n,t){return n[0]-t[0]||n[1]-t[1]}function Te(n,t,e){return(e[0]-t[0])*(n[1]-t[1])<(e[1]-t[1])*(n[0]-t[0])}function Re(n,t,e,r){var i=n[0],u=e[0],o=t[0]-i,a=r[0]-u,l=n[1],c=e[1],f=t[1]-l,s=r[1]-c,h=(a*(l-c)-s*(i-u))/(s*o-a*f);return[i+h*o,l+h*f]}function De(n){var t=n[0],e=n[n.length-1];return!(t[0]-e[0]||t[1]-e[1])}function Pe(){rr(this),this.edge=this.site=this.circle=null}function Ue(n){var t=cl.pop()||new Pe;return t.site=n,t}function je(n){Be(n),ol.remove(n),cl.push(n),rr(n)}function Fe(n){var t=n.circle,e=t.x,r=t.cy,i={x:e,y:r},u=n.P,o=n.N,a=[n];je(n);for(var l=u;l.circle&&xo(e-l.circle.x)<Uo&&xo(r-l.circle.cy)<Uo;)u=l.P,a.unshift(l),je(l),l=u;a.unshift(l),Be(l);for(var c=o;c.circle&&xo(e-c.circle.x)<Uo&&xo(r-c.circle.cy)<Uo;)o=c.N,a.push(c),je(c),c=o;a.push(c),Be(c);var f,s=a.length;for(f=1;s>f;++f)c=a[f],l=a[f-1],nr(c.edge,l.site,c.site,i);l=a[0],c=a[s-
 1],c.edge=Ke(l.site,c.site,null,i),$e(l),$e(c)}function He(n){for(var t,e,r,i,u=n.x,o=n.y,a=ol._;a;)if(r=Oe(a,o)-u,r>Uo)a=a.L;else{if(i=u-Ie(a,o),!(i>Uo)){r>-Uo?(t=a.P,e=a):i>-Uo?(t=a,e=a.N):t=e=a;break}if(!a.R){t=a;break}a=a.R}var l=Ue(n);if(ol.insert(t,l),t||e){if(t===e)return Be(t),e=Ue(t.site),ol.insert(l,e),l.edge=e.edge=Ke(t.site,l.site),$e(t),void $e(e);if(!e)return void(l.edge=Ke(t.site,l.site));Be(t),Be(e);var c=t.site,f=c.x,s=c.y,h=n.x-f,p=n.y-s,g=e.site,v=g.x-f,d=g.y-s,y=2*(h*d-p*v),m=h*h+p*p,M=v*v+d*d,x={x:(d*m-p*M)/y+f,y:(h*M-v*m)/y+s};nr(e.edge,c,g,x),l.edge=Ke(c,n,null,x),e.edge=Ke(n,g,null,x),$e(t),$e(e)}}function Oe(n,t){var e=n.site,r=e.x,i=e.y,u=i-t;if(!u)return r;var o=n.P;if(!o)return-(1/0);e=o.site;var a=e.x,l=e.y,c=l-t;if(!c)return a;var f=a-r,s=1/u-1/c,h=f/c;return s?(-h+Math.sqrt(h*h-2*s*(f*f/(-2*c)-l+c/2+i-u/2)))/s+r:(r+a)/2}function Ie(n,t){var e=n.N;if(e)return Oe(e,t);var r=n.site;return r.y===t?r.x:1/0}function Ye(n){this.site=n,this.edges=[]}function Z
 e(n){for(var t,e,r,i,u,o,a,l,c,f,s=n[0][0],h=n[1][0],p=n[0][1],g=n[1][1],v=ul,d=v.length;d--;)if(u=v[d],u&&u.prepare())for(a=u.edges,l=a.length,o=0;l>o;)f=a[o].end(),r=f.x,i=f.y,c=a[++o%l].start(),t=c.x,e=c.y,(xo(r-t)>Uo||xo(i-e)>Uo)&&(a.splice(o,0,new tr(Qe(u.site,f,xo(r-s)<Uo&&g-i>Uo?{x:s,y:xo(t-s)<Uo?e:g}:xo(i-g)<Uo&&h-r>Uo?{x:xo(e-g)<Uo?t:h,y:g}:xo(r-h)<Uo&&i-p>Uo?{x:h,y:xo(t-h)<Uo?e:p}:xo(i-p)<Uo&&r-s>Uo?{x:xo(e-p)<Uo?t:s,y:p}:null),u.site,null)),++l)}function Ve(n,t){return t.angle-n.angle}function Xe(){rr(this),this.x=this.y=this.arc=this.site=this.cy=null}function $e(n){var t=n.P,e=n.N;if(t&&e){var r=t.site,i=n.site,u=e.site;if(r!==u){var o=i.x,a=i.y,l=r.x-o,c=r.y-a,f=u.x-o,s=u.y-a,h=2*(l*s-c*f);if(!(h>=-jo)){var p=l*l+c*c,g=f*f+s*s,v=(s*p-c*g)/h,d=(l*g-f*p)/h,s=d+a,y=fl.pop()||new Xe;y.arc=n,y.site=i,y.x=v+o,y.y=s+Math.sqrt(v*v+d*d),y.cy=s,n.circle=y;for(var m=null,M=ll._;M;)if(y.y<M.y||y.y===M.y&&y.x<=M.x){if(!M.L){m=M.P;break}M=M.L}else{if(!M.R){m=M;break}M=M.R}ll.insert(
 m,y),m||(al=y)}}}}function Be(n){var t=n.circle;t&&(t.P||(al=t.N),ll.remove(t),fl.push(t),rr(t),n.circle=null)}function We(n){for(var t,e=il,r=Yt(n[0][0],n[0][1],n[1][0],n[1][1]),i=e.length;i--;)t=e[i],(!Je(t,n)||!r(t)||xo(t.a.x-t.b.x)<Uo&&xo(t.a.y-t.b.y)<Uo)&&(t.a=t.b=null,e.splice(i,1))}function Je(n,t){var e=n.b;if(e)return!0;var r,i,u=n.a,o=t[0][0],a=t[1][0],l=t[0][1],c=t[1][1],f=n.l,s=n.r,h=f.x,p=f.y,g=s.x,v=s.y,d=(h+g)/2,y=(p+v)/2;if(v===p){if(o>d||d>=a)return;if(h>g){if(u){if(u.y>=c)return}else u={x:d,y:l};e={x:d,y:c}}else{if(u){if(u.y<l)return}else u={x:d,y:c};e={x:d,y:l}}}else if(r=(h-g)/(v-p),i=y-r*d,-1>r||r>1)if(h>g){if(u){if(u.y>=c)return}else u={x:(l-i)/r,y:l};e={x:(c-i)/r,y:c}}else{if(u){if(u.y<l)return}else u={x:(c-i)/r,y:c};e={x:(l-i)/r,y:l}}else if(v>p){if(u){if(u.x>=a)return}else u={x:o,y:r*o+i};e={x:a,y:r*a+i}}else{if(u){if(u.x<o)return}else u={x:a,y:r*a+i};e={x:o,y:r*o+i}}return n.a=u,n.b=e,!0}function Ge(n,t){this.l=n,this.r=t,this.a=this.b=null}function Ke(n,t,
 e,r){var i=new Ge(n,t);return il.push(i),e&&nr(i,n,t,e),r&&nr(i,t,n,r),ul[n.i].edges.push(new tr(i,n,t)),ul[t.i].edges.push(new tr(i,t,n)),i}function Qe(n,t,e){var r=new Ge(n,null);return r.a=t,r.b=e,il.push(r),r}function nr(n,t,e,r){n.a||n.b?n.l===e?n.b=r:n.a=r:(n.a=r,n.l=t,n.r=e)}function tr(n,t,e){var r=n.a,i=n.b;this.edge=n,this.site=t,this.angle=e?Math.atan2(e.y-t.y,e.x-t.x):n.l===t?Math.atan2(i.x-r.x,r.y-i.y):Math.atan2(r.x-i.x,i.y-r.y)}function er(){this._=null}function rr(n){n.U=n.C=n.L=n.R=n.P=n.N=null}function ir(n,t){var e=t,r=t.R,i=e.U;i?i.L===e?i.L=r:i.R=r:n._=r,r.U=i,e.U=r,e.R=r.L,e.R&&(e.R.U=e),r.L=e}function ur(n,t){var e=t,r=t.L,i=e.U;i?i.L===e?i.L=r:i.R=r:n._=r,r.U=i,e.U=r,e.L=r.R,e.L&&(e.L.U=e),r.R=e}function or(n){for(;n.L;)n=n.L;return n}function ar(n,t){var e,r,i,u=n.sort(lr).pop();for(il=[],ul=new Array(n.length),ol=new er,ll=new er;;)if(i=al,u&&(!i||u.y<i.y||u.y===i.y&&u.x<i.x))u.x===e&&u.y===r||(ul[u.i]=new Ye(u),He(u),e=u.x,r=u.y),u=n.pop();else{if(!i)break
 ;Fe(i.arc)}t&&(We(t),Ze(t));var o={cells:ul,edges:il};return ol=ll=il=ul=null,o}function lr(n,t){return t.y-n.y||t.x-n.x}function cr(n,t,e){return(n.x-e.x)*(t.y-n.y)-(n.x-t.x)*(e.y-n.y)}function fr(n){return n.x}function sr(n){return n.y}function hr(){return{leaf:!0,nodes:[],point:null,x:null,y:null}}function pr(n,t,e,r,i,u){if(!n(t,e,r,i,u)){var o=.5*(e+i),a=.5*(r+u),l=t.nodes;l[0]&&pr(n,l[0],e,r,o,a),l[1]&&pr(n,l[1],o,r,i,a),l[2]&&pr(n,l[2],e,a,o,u),l[3]&&pr(n,l[3],o,a,i,u)}}function gr(n,t,e,r,i,u,o){var a,l=1/0;return function c(n,f,s,h,p){if(!(f>u||s>o||r>h||i>p)){if(g=n.point){var g,v=t-n.x,d=e-n.y,y=v*v+d*d;if(l>y){var m=Math.sqrt(l=y);r=t-m,i=e-m,u=t+m,o=e+m,a=g}}for(var M=n.nodes,x=.5*(f+h),b=.5*(s+p),_=t>=x,w=e>=b,S=w<<1|_,k=S+4;k>S;++S)if(n=M[3&S])switch(3&S){case 0:c(n,f,s,x,b);break;case 1:c(n,x,s,h,b);break;case 2:c(n,f,b,x,p);break;case 3:c(n,x,b,h,p)}}}(n,r,i,u,o),a}function vr(n,t){n=ao.rgb(n),t=ao.rgb(t);var e=n.r,r=n.g,i=n.b,u=t.r-e,o=t.g-r,a=t.b-i;return function
 (n){return"#"+bn(Math.round(e+u*n))+bn(Math.round(r+o*n))+bn(Math.round(i+a*n))}}function dr(n,t){var e,r={},i={};for(e in n)e in t?r[e]=Mr(n[e],t[e]):i[e]=n[e];for(e in t)e in n||(i[e]=t[e]);return function(n){for(e in r)i[e]=r[e](n);return i}}function yr(n,t){return n=+n,t=+t,function(e){return n*(1-e)+t*e}}function mr(n,t){var e,r,i,u=hl.lastIndex=pl.lastIndex=0,o=-1,a=[],l=[];for(n+="",t+="";(e=hl.exec(n))&&(r=pl.exec(t));)(i=r.index)>u&&(i=t.slice(u,i),a[o]?a[o]+=i:a[++o]=i),(e=e[0])===(r=r[0])?a[o]?a[o]+=r:a[++o]=r:(a[++o]=null,l.push({i:o,x:yr(e,r)})),u=pl.lastIndex;return u<t.length&&(i=t.slice(u),a[o]?a[o]+=i:a[++o]=i),a.length<2?l[0]?(t=l[0].x,function(n){return t(n)+""}):function(){return t}:(t=l.length,function(n){for(var e,r=0;t>r;++r)a[(e=l[r]).i]=e.x(n);return a.join("")})}function Mr(n,t){for(var e,r=ao.interpolators.length;--r>=0&&!(e=ao.interpolators[r](n,t)););return e}function xr(n,t){var e,r=[],i=[],u=n.length,o=t.length,a=Math.min(n.length,t.length);for(e=0;a>e
 ;++e)r.push(Mr(n[e],t[e]));for(;u>e;++e)i[e]=n[e];for(;o>e;++e)i[e]=t[e];return function(n){for(e=0;a>e;++e)i[e]=r[e](n);return i}}function br(n){return function(t){return 0>=t?0:t>=1?1:n(t)}}function _r(n){return function(t){return 1-n(1-t)}}function wr(n){return function(t){return.5*(.5>t?n(2*t):2-n(2-2*t))}}function Sr(n){return n*n}function kr(n){return n*n*n}function Nr(n){if(0>=n)return 0;if(n>=1)return 1;var t=n*n,e=t*n;return 4*(.5>n?e:3*(n-t)+e-.75)}function Er(n){return function(t){return Math.pow(t,n)}}function Ar(n){return 1-Math.cos(n*Io)}function Cr(n){return Math.pow(2,10*(n-1))}function zr(n){return 1-Math.sqrt(1-n*n)}function Lr(n,t){var e;return arguments.length<2&&(t=.45),arguments.length?e=t/Ho*Math.asin(1/n):(n=1,e=t/4),function(r){return 1+n*Math.pow(2,-10*r)*Math.sin((r-e)*Ho/t)}}function qr(n){return n||(n=1.70158),function(t){return t*t*((n+1)*t-n)}}function Tr(n){return 1/2.75>n?7.5625*n*n:2/2.75>n?7.5625*(n-=1.5/2.75)*n+.75:2.5/2.75>n?7.5625*(n-=2.25/2.75)
 *n+.9375:7.5625*(n-=2.625/2.75)*n+.984375}function Rr(n,t){n=ao.hcl(n),t=ao.hcl(t);var e=n.h,r=n.c,i=n.l,u=t.h-e,o=t.c-r,a=t.l-i;return isNaN(o)&&(o=0,r=isNaN(r)?t.c:r),isNaN(u)?(u=0,e=isNaN(e)?t.h:e):u>180?u-=360:-180>u&&(u+=360),function(n){return sn(e+u*n,r+o*n,i+a*n)+""}}function Dr(n,t){n=ao.hsl(n),t=ao.hsl(t);var e=n.h,r=n.s,i=n.l,u=t.h-e,o=t.s-r,a=t.l-i;return isNaN(o)&&(o=0,r=isNaN(r)?t.s:r),isNaN(u)?(u=0,e=isNaN(e)?t.h:e):u>180?u-=360:-180>u&&(u+=360),function(n){return cn(e+u*n,r+o*n,i+a*n)+""}}function Pr(n,t){n=ao.lab(n),t=ao.lab(t);var e=n.l,r=n.a,i=n.b,u=t.l-e,o=t.a-r,a=t.b-i;return function(n){return pn(e+u*n,r+o*n,i+a*n)+""}}function Ur(n,t){return t-=n,function(e){return Math.round(n+t*e)}}function jr(n){var t=[n.a,n.b],e=[n.c,n.d],r=Hr(t),i=Fr(t,e),u=Hr(Or(e,t,-i))||0;t[0]*e[1]<e[0]*t[1]&&(t[0]*=-1,t[1]*=-1,r*=-1,i*=-1),this.rotate=(r?Math.atan2(t[1],t[0]):Math.atan2(-e[0],e[1]))*Zo,this.translate=[n.e,n.f],this.scale=[r,u],this.skew=u?Math.atan2(i,u)*Zo:0}function
  Fr(n,t){return n[0]*t[0]+n[1]*t[1]}function Hr(n){var t=Math.sqrt(Fr(n,n));return t&&(n[0]/=t,n[1]/=t),t}function Or(n,t,e){return n[0]+=e*t[0],n[1]+=e*t[1],n}function Ir(n){return n.length?n.pop()+",":""}function Yr(n,t,e,r){if(n[0]!==t[0]||n[1]!==t[1]){var i=e.push("translate(",null,",",null,")");r.push({i:i-4,x:yr(n[0],t[0])},{i:i-2,x:yr(n[1],t[1])})}else(t[0]||t[1])&&e.push("translate("+t+")")}function Zr(n,t,e,r){n!==t?(n-t>180?t+=360:t-n>180&&(n+=360),r.push({i:e.push(Ir(e)+"rotate(",null,")")-2,x:yr(n,t)})):t&&e.push(Ir(e)+"rotate("+t+")")}function Vr(n,t,e,r){n!==t?r.push({i:e.push(Ir(e)+"skewX(",null,")")-2,x:yr(n,t)}):t&&e.push(Ir(e)+"skewX("+t+")")}function Xr(n,t,e,r){if(n[0]!==t[0]||n[1]!==t[1]){var i=e.push(Ir(e)+"scale(",null,",",null,")");r.push({i:i-4,x:yr(n[0],t[0])},{i:i-2,x:yr(n[1],t[1])})}else 1===t[0]&&1===t[1]||e.push(Ir(e)+"scale("+t+")")}function $r(n,t){var e=[],r=[];return n=ao.transform(n),t=ao.transform(t),Yr(n.translate,t.translate,e,r),Zr(n.rotate,t.r
 otate,e,r),Vr(n.skew,t.skew,e,r),Xr(n.scale,t.scale,e,r),n=t=null,function(n){for(var t,i=-1,u=r.length;++i<u;)e[(t=r[i]).i]=t.x(n);return e.join("")}}function Br(n,t){return t=(t-=n=+n)||1/t,function(e){return(e-n)/t}}function Wr(n,t){return t=(t-=n=+n)||1/t,function(e){return Math.max(0,Math.min(1,(e-n)/t))}}function Jr(n){for(var t=n.source,e=n.target,r=Kr(t,e),i=[t];t!==r;)t=t.parent,i.push(t);for(var u=i.length;e!==r;)i.splice(u,0,e),e=e.parent;return i}function Gr(n){for(var t=[],e=n.parent;null!=e;)t.push(n),n=e,e=e.parent;return t.push(n),t}function Kr(n,t){if(n===t)return n;for(var e=Gr(n),r=Gr(t),i=e.pop(),u=r.pop(),o=null;i===u;)o=i,i=e.pop(),u=r.pop();return o}function Qr(n){n.fixed|=2}function ni(n){n.fixed&=-7}function ti(n){n.fixed|=4,n.px=n.x,n.py=n.y}function ei(n){n.fixed&=-5}function ri(n,t,e){var r=0,i=0;if(n.charge=0,!n.leaf)for(var u,o=n.nodes,a=o.length,l=-1;++l<a;)u=o[l],null!=u&&(ri(u,t,e),n.charge+=u.charge,r+=u.charge*u.cx,i+=u.charge*u.cy);if(n.point){n.l
 eaf||(n.point.x+=Math.random()-.5,n.point.y+=Math.random()-.5);var c=t*e[n.point.index];n.charge+=n.pointCharge=c,r+=c*n.point.x,i+=c*n.point.y}n.cx=r/n.charge,n.cy=i/n.charge}function ii(n,t){return ao.rebind(n,t,"sort","children","value"),n.nodes=n,n.links=fi,n}function ui(n,t){for(var e=[n];null!=(n=e.pop());)if(t(n),(i=n.children)&&(r=i.length))for(var r,i;--r>=0;)e.push(i[r])}function oi(n,t){for(var e=[n],r=[];null!=(n=e.pop());)if(r.push(n),(u=n.children)&&(i=u.length))for(var i,u,o=-1;++o<i;)e.push(u[o]);for(;null!=(n=r.pop());)t(n)}function ai(n){return n.children}function li(n){return n.value}function ci(n,t){return t.value-n.value}function fi(n){return ao.merge(n.map(function(n){return(n.children||[]).map(function(t){return{source:n,target:t}})}))}function si(n){return n.x}function hi(n){return n.y}function pi(n,t,e){n.y0=t,n.y=e}function gi(n){return ao.range(n.length)}function vi(n){for(var t=-1,e=n[0].length,r=[];++t<e;)r[t]=0;return r}function di(n){for(var t,e=1,r=0,
 i=n[0][1],u=n.length;u>e;++e)(t=n[e][1])>i&&(r=e,i=t);return r}function yi(n){return n.reduce(mi,0)}function mi(n,t){return n+t[1]}function Mi(n,t){return xi(n,Math.ceil(Math.log(t.length)/Math.LN2+1))}function xi(n,t){for(var e=-1,r=+n[0],i=(n[1]-r)/t,u=[];++e<=t;)u[e]=i*e+r;return u}function bi(n){return[ao.min(n),ao.max(n)]}function _i(n,t){return n.value-t.value}function wi(n,t){var e=n._pack_next;n._pack_next=t,t._pack_prev=n,t._pack_next=e,e._pack_prev=t}function Si(n,t){n._pack_next=t,t._pack_prev=n}function ki(n,t){var e=t.x-n.x,r=t.y-n.y,i=n.r+t.r;return.999*i*i>e*e+r*r}function Ni(n){function t(n){f=Math.min(n.x-n.r,f),s=Math.max(n.x+n.r,s),h=Math.min(n.y-n.r,h),p=Math.max(n.y+n.r,p)}if((e=n.children)&&(c=e.length)){var e,r,i,u,o,a,l,c,f=1/0,s=-(1/0),h=1/0,p=-(1/0);if(e.forEach(Ei),r=e[0],r.x=-r.r,r.y=0,t(r),c>1&&(i=e[1],i.x=i.r,i.y=0,t(i),c>2))for(u=e[2],zi(r,i,u),t(u),wi(r,u),r._pack_prev=u,wi(u,i),i=r._pack_next,o=3;c>o;o++){zi(r,i,u=e[o]);var g=0,v=1,d=1;for(a=i._pack_
 next;a!==i;a=a._pack_next,v++)if(ki(a,u)){g=1;break}if(1==g)for(l=r._pack_prev;l!==a._pack_prev&&!ki(l,u);l=l._pack_prev,d++);g?(d>v||v==d&&i.r<r.r?Si(r,i=a):Si(r=l,i),o--):(wi(r,u),i=u,t(u))}var y=(f+s)/2,m=(h+p)/2,M=0;for(o=0;c>o;o++)u=e[o],u.x-=y,u.y-=m,M=Math.max(M,u.r+Math.sqrt(u.x*u.x+u.y*u.y));n.r=M,e.forEach(Ai)}}function Ei(n){n._pack_next=n._pack_prev=n}function Ai(n){delete n._pack_next,delete n._pack_prev}function Ci(n,t,e,r){var i=n.children;if(n.x=t+=r*n.x,n.y=e+=r*n.y,n.r*=r,i)for(var u=-1,o=i.length;++u<o;)Ci(i[u],t,e,r)}function zi(n,t,e){var r=n.r+e.r,i=t.x-n.x,u=t.y-n.y;if(r&&(i||u)){var o=t.r+e.r,a=i*i+u*u;o*=o,r*=r;var l=.5+(r-o)/(2*a),c=Math.sqrt(Math.max(0,2*o*(r+a)-(r-=a)*r-o*o))/(2*a);e.x=n.x+l*i+c*u,e.y=n.y+l*u-c*i}else e.x=n.x+r,e.y=n.y}function Li(n,t){return n.parent==t.parent?1:2}function qi(n){var t=n.children;return t.length?t[0]:n.t}function Ti(n){var t,e=n.children;return(t=e.length)?e[t-1]:n.t}function Ri(n,t,e){var r=e/(t.i-n.i);t.c-=r,t.s+=e,n.c+
 =r,t.z+=e,t.m+=e}function Di(n){for(var t,e=0,r=0,i=n.children,u=i.length;--u>=0;)t=i[u],t.z+=e,t.m+=e,e+=t.s+(r+=t.c)}function Pi(n,t,e){return n.a.parent===t.parent?n.a:e}function Ui(n){return 1+ao.max(n,function(n){return n.y})}function ji(n){return n.reduce(function(n,t){return n+t.x},0)/n.length}function Fi(n){var t=n.children;return t&&t.length?Fi(t[0]):n}function Hi(n){var t,e=n.children;return e&&(t=e.length)?Hi(e[t-1]):n}function Oi(n){return{x:n.x,y:n.y,dx:n.dx,dy:n.dy}}function Ii(n,t){var e=n.x+t[3],r=n.y+t[0],i=n.dx-t[1]-t[3],u=n.dy-t[0]-t[2];return 0>i&&(e+=i/2,i=0),0>u&&(r+=u/2,u=0),{x:e,y:r,dx:i,dy:u}}function Yi(n){var t=n[0],e=n[n.length-1];return e>t?[t,e]:[e,t]}function Zi(n){return n.rangeExtent?n.rangeExtent():Yi(n.range())}function Vi(n,t,e,r){var i=e(n[0],n[1]),u=r(t[0],t[1]);return function(n){return u(i(n))}}function Xi(n,t){var e,r=0,i=n.length-1,u=n[r],o=n[i];return u>o&&(e=r,r=i,i=e,e=u,u=o,o=e),n[r]=t.floor(u),n[i]=t.ceil(o),n}function $i(n){return n?{f
 loor:function(t){return Math.floor(t/n)*n},ceil:function(t){return Math.ceil(t/n)*n}}:Sl}function Bi(n,t,e,r){var i=[],u=[],o=0,a=Math.min(n.length,t.length)-1;for(n[a]<n[0]&&(n=n.slice().reverse(),t=t.slice().reverse());++o<=a;)i.push(e(n[o-1],n[o])),u.push(r(t[o-1],t[o]));return function(t){var e=ao.bisect(n,t,1,a)-1;return u[e](i[e](t))}}function Wi(n,t,e,r){function i(){var i=Math.min(n.length,t.length)>2?Bi:Vi,l=r?Wr:Br;return o=i(n,t,l,e),a=i(t,n,l,Mr),u}function u(n){return o(n)}var o,a;return u.invert=function(n){return a(n)},u.domain=function(t){return arguments.length?(n=t.map(Number),i()):n},u.range=function(n){return arguments.length?(t=n,i()):t},u.rangeRound=function(n){return u.range(n).interpolate(Ur)},u.clamp=function(n){return arguments.length?(r=n,i()):r},u.interpolate=function(n){return arguments.length?(e=n,i()):e},u.ticks=function(t){return Qi(n,t)},u.tickFormat=function(t,e){return nu(n,t,e)},u.nice=function(t){return Gi(n,t),i()},u.copy=function(){return Wi(n,
 t,e,r)},i()}function Ji(n,t){return ao.rebind(n,t,"range","rangeRound","interpolate","clamp")}function Gi(n,t){return Xi(n,$i(Ki(n,t)[2])),Xi(n,$i(Ki(n,t)[2])),n}function Ki(n,t){null==t&&(t=10);var e=Yi(n),r=e[1]-e[0],i=Math.pow(10,Math.floor(Math.log(r/t)/Math.LN10)),u=t/r*i;return.15>=u?i*=10:.35>=u?i*=5:.75>=u&&(i*=2),e[0]=Math.ceil(e[0]/i)*i,e[1]=Math.floor(e[1]/i)*i+.5*i,e[2]=i,e}function Qi(n,t){return ao.range.apply(ao,Ki(n,t))}function nu(n,t,e){var r=Ki(n,t);if(e){var i=ha.exec(e);if(i.shift(),"s"===i[8]){var u=ao.formatPrefix(Math.max(xo(r[0]),xo(r[1])));return i[7]||(i[7]="."+tu(u.scale(r[2]))),i[8]="f",e=ao.format(i.join("")),function(n){return e(u.scale(n))+u.symbol}}i[7]||(i[7]="."+eu(i[8],r)),e=i.join("")}else e=",."+tu(r[2])+"f";return ao.format(e)}function tu(n){return-Math.floor(Math.log(n)/Math.LN10+.01)}function eu(n,t){var e=tu(t[2]);return n in kl?Math.abs(e-tu(Math.max(xo(t[0]),xo(t[1]))))+ +("e"!==n):e-2*("%"===n)}function ru(n,t,e,r){function i(n){return(e?
 Math.log(0>n?0:n):-Math.log(n>0?0:-n))/Math.log(t)}function u(n){return e?Math.pow(t,n):-Math.pow(t,-n)}function o(t){return n(i(t))}return o.invert=function(t){return u(n.invert(t))},o.domain=function(t){return arguments.length?(e=t[0]>=0,n.domain((r=t.map(Number)).map(i)),o):r},o.base=function(e){return arguments.length?(t=+e,n.domain(r.map(i)),o):t},o.nice=function(){var t=Xi(r.map(i),e?Math:El);return n.domain(t),r=t.map(u),o},o.ticks=function(){var n=Yi(r),o=[],a=n[0],l=n[1],c=Math.floor(i(a)),f=Math.ceil(i(l)),s=t%1?2:t;if(isFinite(f-c)){if(e){for(;f>c;c++)for(var h=1;s>h;h++)o.push(u(c)*h);o.push(u(c))}else for(o.push(u(c));c++<f;)for(var h=s-1;h>0;h--)o.push(u(c)*h);for(c=0;o[c]<a;c++);for(f=o.length;o[f-1]>l;f--);o=o.slice(c,f)}return o},o.tickFormat=function(n,e){if(!arguments.length)return Nl;arguments.length<2?e=Nl:"function"!=typeof e&&(e=ao.format(e));var r=Math.max(1,t*n/o.ticks().length);return function(n){var o=n/u(Math.round(i(n)));return t-.5>o*t&&(o*=t),r>=o?e(n)
 :""}},o.copy=function(){return ru(n.copy(),t,e,r)},Ji(o,n)}function iu(n,t,e){function r(t){return n(i(t))}var i=uu(t),u=uu(1/t);return r.invert=function(t){return u(n.invert(t))},r.domain=function(t){return arguments.length?(n.domain((e=t.map(Number)).map(i)),r):e},r.ticks=function(n){return Qi(e,n)},r.tickFormat=function(n,t){return nu(e,n,t)},r.nice=function(n){return r.domain(Gi(e,n))},r.exponent=function(o){return arguments.length?(i=uu(t=o),u=uu(1/t),n.domain(e.map(i)),r):t},r.copy=function(){return iu(n.copy(),t,e)},Ji(r,n)}function uu(n){return function(t){return 0>t?-Math.pow(-t,n):Math.pow(t,n)}}function ou(n,t){function e(e){return u[((i.get(e)||("range"===t.t?i.set(e,n.push(e)):NaN))-1)%u.length]}function r(t,e){return ao.range(n.length).map(function(n){return t+e*n})}var i,u,o;return e.domain=function(r){if(!arguments.length)return n;n=[],i=new c;for(var u,o=-1,a=r.length;++o<a;)i.has(u=r[o])||i.set(u,n.push(u));return e[t.t].apply(e,t.a)},e.range=function(n){return arg
 uments.length?(u=n,o=0,t={t:"range",a:arguments},e):u},e.rangePoints=function(i,a){arguments.length<2&&(a=0);var l=i[0],c=i[1],f=n.length<2?(l=(l+c)/2,0):(c-l)/(n.length-1+a);return u=r(l+f*a/2,f),o=0,t={t:"rangePoints",a:arguments},e},e.rangeRoundPoints=function(i,a){arguments.length<2&&(a=0);var l=i[0],c=i[1],f=n.length<2?(l=c=Math.round((l+c)/2),0):(c-l)/(n.length-1+a)|0;return u=r(l+Math.round(f*a/2+(c-l-(n.length-1+a)*f)/2),f),o=0,t={t:"rangeRoundPoints",a:arguments},e},e.rangeBands=function(i,a,l){arguments.length<2&&(a=0),arguments.length<3&&(l=a);var c=i[1]<i[0],f=i[c-0],s=i[1-c],h=(s-f)/(n.length-a+2*l);return u=r(f+h*l,h),c&&u.reverse(),o=h*(1-a),t={t:"rangeBands",a:arguments},e},e.rangeRoundBands=function(i,a,l){arguments.length<2&&(a=0),arguments.length<3&&(l=a);var c=i[1]<i[0],f=i[c-0],s=i[1-c],h=Math.floor((s-f)/(n.length-a+2*l));return u=r(f+Math.round((s-f-(n.length-a)*h)/2),h),c&&u.reverse(),o=Math.round(h*(1-a)),t={t:"rangeRoundBands",a:arguments},e},e.rangeBand=fu
 nction(){return o},e.rangeExtent=function(){return Yi(t.a[0])},e.copy=function(){return ou(n,t)},e.domain(n)}function au(n,t){function u(){var e=0,r=t.length;for(a=[];++e<r;)a[e-1]=ao.quantile(n,e/r);return o}function o(n){return isNaN(n=+n)?void 0:t[ao.bisect(a,n)]}var a;return o.domain=function(t){return arguments.length?(n=t.map(r).filter(i).sort(e),u()):n},o.range=function(n){return arguments.length?(t=n,u()):t},o.quantiles=function(){return a},o.invertExtent=function(e){return e=t.indexOf(e),0>e?[NaN,NaN]:[e>0?a[e-1]:n[0],e<a.length?a[e]:n[n.length-1]]},o.copy=function(){return au(n,t)},u()}function lu(n,t,e){function r(t){return e[Math.max(0,Math.min(o,Math.floor(u*(t-n))))]}function i(){return u=e.length/(t-n),o=e.length-1,r}var u,o;return r.domain=function(e){return arguments.length?(n=+e[0],t=+e[e.length-1],i()):[n,t]},r.range=function(n){return arguments.length?(e=n,i()):e},r.invertExtent=function(t){return t=e.indexOf(t),t=0>t?NaN:t/u+n,[t,t+1/u]},r.copy=function(){return
  lu(n,t,e)},i()}function cu(n,t){function e(e){return e>=e?t[ao.bisect(n,e)]:void 0}return e.domain=function(t){return arguments.length?(n=t,e):n},e.range=function(n){return arguments.length?(t=n,e):t},e.invertExtent=function(e){return e=t.indexOf(e),[n[e-1],n[e]]},e.copy=function(){return cu(n,t)},e}function fu(n){function t(n){return+n}return t.invert=t,t.domain=t.range=function(e){return arguments.length?(n=e.map(t),t):n},t.ticks=function(t){return Qi(n,t)},t.tickFormat=function(t,e){return nu(n,t,e)},t.copy=function(){return fu(n)},t}function su(){return 0}function hu(n){return n.innerRadius}function pu(n){return n.outerRadius}function gu(n){return n.startAngle}function vu(n){return n.endAngle}function du(n){return n&&n.padAngle}function yu(n,t,e,r){return(n-e)*t-(t-r)*n>0?0:1}function mu(n,t,e,r,i){var u=n[0]-t[0],o=n[1]-t[1],a=(i?r:-r)/Math.sqrt(u*u+o*o),l=a*o,c=-a*u,f=n[0]+l,s=n[1]+c,h=t[0]+l,p=t[1]+c,g=(f+h)/2,v=(s+p)/2,d=h-f,y=p-s,m=d*d+y*y,M=e-r,x=f*p-h*s,b=(0>y?-1:1)*Math
 .sqrt(Math.max(0,M*M*m-x*x)),_=(x*y-d*b)/m,w=(-x*d-y*b)/m,S=(x*y+d*b)/m,k=(-x*d+y*b)/m,N=_-g,E=w-v,A=S-g,C=k-v;return N*N+E*E>A*A+C*C&&(_=S,w=k),[[_-l,w-c],[_*e/M,w*e/M]]}function Mu(n){function t(t){function o(){c.push("M",u(n(f),a))}for(var l,c=[],f=[],s=-1,h=t.length,p=En(e),g=En(r);++s<h;)i.call(this,l=t[s],s)?f.push([+p.call(this,l,s),+g.call(this,l,s)]):f.length&&(o(),f=[]);return f.length&&o(),c.length?c.join(""):null}var e=Ce,r=ze,i=zt,u=xu,o=u.key,a=.7;return t.x=function(n){return arguments.length?(e=n,t):e},t.y=function(n){return arguments.length?(r=n,t):r},t.defined=function(n){return arguments.length?(i=n,t):i},t.interpolate=function(n){return arguments.length?(o="function"==typeof n?u=n:(u=Tl.get(n)||xu).key,t):o},t.tension=function(n){return arguments.length?(a=n,t):a},t}function xu(n){return n.length>1?n.join("L"):n+"Z"}function bu(n){return n.join("L")+"Z"}function _u(n){for(var t=0,e=n.length,r=n[0],i=[r[0],",",r[1]];++t<e;)i.push("H",(r[0]+(r=n[t])[0])/2,"V",r[1])
 ;return e>1&&i.push("H",r[0]),i.join("")}function wu(n){for(var t=0,e=n.length,r=n[0],i=[r[0],",",r[1]];++t<e;)i.push("V",(r=n[t])[1],"H",r[0]);return i.join("")}function Su(n){for(var t=0,e=n.length,r=n[0],i=[r[0],",",r[1]];++t<e;)i.push("H",(r=n[t])[0],"V",r[1]);return i.join("")}function ku(n,t){return n.length<4?xu(n):n[1]+Au(n.slice(1,-1),Cu(n,t))}function Nu(n,t){return n.length<3?bu(n):n[0]+Au((n.push(n[0]),n),Cu([n[n.length-2]].concat(n,[n[1]]),t))}function Eu(n,t){return n.length<3?xu(n):n[0]+Au(n,Cu(n,t))}function Au(n,t){if(t.length<1||n.length!=t.length&&n.length!=t.length+2)return xu(n);var e=n.length!=t.length,r="",i=n[0],u=n[1],o=t[0],a=o,l=1;if(e&&(r+="Q"+(u[0]-2*o[0]/3)+","+(u[1]-2*o[1]/3)+","+u[0]+","+u[1],i=n[1],l=2),t.length>1){a=t[1],u=n[l],l++,r+="C"+(i[0]+o[0])+","+(i[1]+o[1])+","+(u[0]-a[0])+","+(u[1]-a[1])+","+u[0]+","+u[1];for(var c=2;c<t.length;c++,l++)u=n[l],a=t[c],r+="S"+(u[0]-a[0])+","+(u[1]-a[1])+","+u[0]+","+u[1]}if(e){var f=n[l];r+="Q"+(u[0]+2*a[0]/3
 )+","+(u[1]+2*a[1]/3)+","+f[0]+","+f[1]}return r}function Cu(n,t){for(var e,r=[],i=(1-t)/2,u=n[0],o=n[1],a=1,l=n.length;++a<l;)e=u,u=o,o=n[a],r.push([i*(o[0]-e[0]),i*(o[1]-e[1])]);return r}function zu(n){if(n.length<3)return xu(n);var t=1,e=n.length,r=n[0],i=r[0],u=r[1],o=[i,i,i,(r=n[1])[0]],a=[u,u,u,r[1]],l=[i,",",u,"L",Ru(Pl,o),",",Ru(Pl,a)];for(n.push(n[e-1]);++t<=e;)r=n[t],o.shift(),o.push(r[0]),a.shift(),a.push(r[1]),Du(l,o,a);return n.pop(),l.push("L",r),l.join("")}function Lu(n){if(n.length<4)return xu(n);for(var t,e=[],r=-1,i=n.length,u=[0],o=[0];++r<3;)t=n[r],u.push(t[0]),o.push(t[1]);for(e.push(Ru(Pl,u)+","+Ru(Pl,o)),--r;++r<i;)t=n[r],u.shift(),u.push(t[0]),o.shift(),o.push(t[1]),Du(e,u,o);return e.join("")}function qu(n){for(var t,e,r=-1,i=n.length,u=i+4,o=[],a=[];++r<4;)e=n[r%i],o.push(e[0]),a.push(e[1]);for(t=[Ru(Pl,o),",",Ru(Pl,a)],--r;++r<u;)e=n[r%i],o.shift(),o.push(e[0]),a.shift(),a.push(e[1]),Du(t,o,a);return t.join("")}function Tu(n,t){var e=n.length-1;if(e)for(va
 r r,i,u=n[0][0],o=n[0][1],a=n[e][0]-u,l=n[e][1]-o,c=-1;++c<=e;)r=n[c],i=c/e,r[0]=t*r[0]+(1-t)*(u+i*a),r[1]=t*r[1]+(1-t)*(o+i*l);return zu(n)}function Ru(n,t){return n[0]*t[0]+n[1]*t[1]+n[2]*t[2]+n[3]*t[3]}function Du(n,t,e){n.push("C",Ru(Rl,t),",",Ru(Rl,e),",",Ru(Dl,t),",",Ru(Dl,e),",",Ru(Pl,t),",",Ru(Pl,e))}function Pu(n,t){return(t[1]-n[1])/(t[0]-n[0])}function Uu(n){for(var t=0,e=n.length-1,r=[],i=n[0],u=n[1],o=r[0]=Pu(i,u);++t<e;)r[t]=(o+(o=Pu(i=u,u=n[t+1])))/2;return r[t]=o,r}function ju(n){for(var t,e,r,i,u=[],o=Uu(n),a=-1,l=n.length-1;++a<l;)t=Pu(n[a],n[a+1]),xo(t)<Uo?o[a]=o[a+1]=0:(e=o[a]/t,r=o[a+1]/t,i=e*e+r*r,i>9&&(i=3*t/Math.sqrt(i),o[a]=i*e,o[a+1]=i*r));for(a=-1;++a<=l;)i=(n[Math.min(l,a+1)][0]-n[Math.max(0,a-1)][0])/(6*(1+o[a]*o[a])),u.push([i||0,o[a]*i||0]);return u}function Fu(n){return n.length<3?xu(n):n[0]+Au(n,ju(n))}function Hu(n){for(var t,e,r,i=-1,u=n.length;++i<u;)t=n[i],e=t[0],r=t[1]-Io,t[0]=e*Math.cos(r),t[1]=e*Math.sin(r);return n}function Ou(n){function t(t
 ){function l(){v.push("M",a(n(y),s),f,c(n(d.reverse()),s),"Z")}for(var h,p,g,v=[],d=[],y=[],m=-1,M=t.length,x=En(e),b=En(i),_=e===r?function(){
-return p}:En(r),w=i===u?function(){return g}:En(u);++m<M;)o.call(this,h=t[m],m)?(d.push([p=+x.call(this,h,m),g=+b.call(this,h,m)]),y.push([+_.call(this,h,m),+w.call(this,h,m)])):d.length&&(l(),d=[],y=[]);return d.length&&l(),v.length?v.join(""):null}var e=Ce,r=Ce,i=0,u=ze,o=zt,a=xu,l=a.key,c=a,f="L",s=.7;return t.x=function(n){return arguments.length?(e=r=n,t):r},t.x0=function(n){return arguments.length?(e=n,t):e},t.x1=function(n){return arguments.length?(r=n,t):r},t.y=function(n){return arguments.length?(i=u=n,t):u},t.y0=function(n){return arguments.length?(i=n,t):i},t.y1=function(n){return arguments.length?(u=n,t):u},t.defined=function(n){return arguments.length?(o=n,t):o},t.interpolate=function(n){return arguments.length?(l="function"==typeof n?a=n:(a=Tl.get(n)||xu).key,c=a.reverse||a,f=a.closed?"M":"L",t):l},t.tension=function(n){return arguments.length?(s=n,t):s},t}function Iu(n){return n.radius}function Yu(n){return[n.x,n.y]}function Zu(n){return function(){var t=n.apply(this,
 arguments),e=t[0],r=t[1]-Io;return[e*Math.cos(r),e*Math.sin(r)]}}function Vu(){return 64}function Xu(){return"circle"}function $u(n){var t=Math.sqrt(n/Fo);return"M0,"+t+"A"+t+","+t+" 0 1,1 0,"+-t+"A"+t+","+t+" 0 1,1 0,"+t+"Z"}function Bu(n){return function(){var t,e,r;(t=this[n])&&(r=t[e=t.active])&&(r.timer.c=null,r.timer.t=NaN,--t.count?delete t[e]:delete this[n],t.active+=.5,r.event&&r.event.interrupt.call(this,this.__data__,r.index))}}function Wu(n,t,e){return ko(n,Yl),n.namespace=t,n.id=e,n}function Ju(n,t,e,r){var i=n.id,u=n.namespace;return Y(n,"function"==typeof e?function(n,o,a){n[u][i].tween.set(t,r(e.call(n,n.__data__,o,a)))}:(e=r(e),function(n){n[u][i].tween.set(t,e)}))}function Gu(n){return null==n&&(n=""),function(){this.textContent=n}}function Ku(n){return null==n?"__transition__":"__transition_"+n+"__"}function Qu(n,t,e,r,i){function u(n){var t=v.delay;return f.t=t+l,n>=t?o(n-t):void(f.c=o)}function o(e){var i=g.active,u=g[i];u&&(u.timer.c=null,u.timer.t=NaN,--g.coun
 t,delete g[i],u.event&&u.event.interrupt.call(n,n.__data__,u.index));for(var o in g)if(r>+o){var c=g[o];c.timer.c=null,c.timer.t=NaN,--g.count,delete g[o]}f.c=a,qn(function(){return f.c&&a(e||1)&&(f.c=null,f.t=NaN),1},0,l),g.active=r,v.event&&v.event.start.call(n,n.__data__,t),p=[],v.tween.forEach(function(e,r){(r=r.call(n,n.__data__,t))&&p.push(r)}),h=v.ease,s=v.duration}function a(i){for(var u=i/s,o=h(u),a=p.length;a>0;)p[--a].call(n,o);return u>=1?(v.event&&v.event.end.call(n,n.__data__,t),--g.count?delete g[r]:delete n[e],1):void 0}var l,f,s,h,p,g=n[e]||(n[e]={active:0,count:0}),v=g[r];v||(l=i.time,f=qn(u,0,l),v=g[r]={tween:new c,time:l,timer:f,delay:i.delay,duration:i.duration,ease:i.ease,index:t},i=null,++g.count)}function no(n,t,e){n.attr("transform",function(n){var r=t(n);return"translate("+(isFinite(r)?r:e(n))+",0)"})}function to(n,t,e){n.attr("transform",function(n){var r=t(n);return"translate(0,"+(isFinite(r)?r:e(n))+")"})}function eo(n){return n.toISOString()}function ro
 (n,t,e){function r(t){return n(t)}function i(n,e){var r=n[1]-n[0],i=r/e,u=ao.bisect(Kl,i);return u==Kl.length?[t.year,Ki(n.map(function(n){return n/31536e6}),e)[2]]:u?t[i/Kl[u-1]<Kl[u]/i?u-1:u]:[tc,Ki(n,e)[2]]}return r.invert=function(t){return io(n.invert(t))},r.domain=function(t){return arguments.length?(n.domain(t),r):n.domain().map(io)},r.nice=function(n,t){function e(e){return!isNaN(e)&&!n.range(e,io(+e+1),t).length}var u=r.domain(),o=Yi(u),a=null==n?i(o,10):"number"==typeof n&&i(o,n);return a&&(n=a[0],t=a[1]),r.domain(Xi(u,t>1?{floor:function(t){for(;e(t=n.floor(t));)t=io(t-1);return t},ceil:function(t){for(;e(t=n.ceil(t));)t=io(+t+1);return t}}:n))},r.ticks=function(n,t){var e=Yi(r.domain()),u=null==n?i(e,10):"number"==typeof n?i(e,n):!n.range&&[{range:n},t];return u&&(n=u[0],t=u[1]),n.range(e[0],io(+e[1]+1),1>t?1:t)},r.tickFormat=function(){return e},r.copy=function(){return ro(n.copy(),t,e)},Ji(r,n)}function io(n){return new Date(n)}function uo(n){return JSON.parse(n.respon
 seText)}function oo(n){var t=fo.createRange();return t.selectNode(fo.body),t.createContextualFragment(n.responseText)}var ao={version:"3.5.17"},lo=[].slice,co=function(n){return lo.call(n)},fo=this.document;if(fo)try{co(fo.documentElement.childNodes)[0].nodeType}catch(so){co=function(n){for(var t=n.length,e=new Array(t);t--;)e[t]=n[t];return e}}if(Date.now||(Date.now=function(){return+new Date}),fo)try{fo.createElement("DIV").style.setProperty("opacity",0,"")}catch(ho){var po=this.Element.prototype,go=po.setAttribute,vo=po.setAttributeNS,yo=this.CSSStyleDeclaration.prototype,mo=yo.setProperty;po.setAttribute=function(n,t){go.call(this,n,t+"")},po.setAttributeNS=function(n,t,e){vo.call(this,n,t,e+"")},yo.setProperty=function(n,t,e){mo.call(this,n,t+"",e)}}ao.ascending=e,ao.descending=function(n,t){return n>t?-1:t>n?1:t>=n?0:NaN},ao.min=function(n,t){var e,r,i=-1,u=n.length;if(1===arguments.length){for(;++i<u;)if(null!=(r=n[i])&&r>=r){e=r;break}for(;++i<u;)null!=(r=n[i])&&e>r&&(e=r)}e
 lse{for(;++i<u;)if(null!=(r=t.call(n,n[i],i))&&r>=r){e=r;break}for(;++i<u;)null!=(r=t.call(n,n[i],i))&&e>r&&(e=r)}return e},ao.max=function(n,t){var e,r,i=-1,u=n.length;if(1===arguments.length){for(;++i<u;)if(null!=(r=n[i])&&r>=r){e=r;break}for(;++i<u;)null!=(r=n[i])&&r>e&&(e=r)}else{for(;++i<u;)if(null!=(r=t.call(n,n[i],i))&&r>=r){e=r;break}for(;++i<u;)null!=(r=t.call(n,n[i],i))&&r>e&&(e=r)}return e},ao.extent=function(n,t){var e,r,i,u=-1,o=n.length;if(1===arguments.length){for(;++u<o;)if(null!=(r=n[u])&&r>=r){e=i=r;break}for(;++u<o;)null!=(r=n[u])&&(e>r&&(e=r),r>i&&(i=r))}else{for(;++u<o;)if(null!=(r=t.call(n,n[u],u))&&r>=r){e=i=r;break}for(;++u<o;)null!=(r=t.call(n,n[u],u))&&(e>r&&(e=r),r>i&&(i=r))}return[e,i]},ao.sum=function(n,t){var e,r=0,u=n.length,o=-1;if(1===arguments.length)for(;++o<u;)i(e=+n[o])&&(r+=e);else for(;++o<u;)i(e=+t.call(n,n[o],o))&&(r+=e);return r},ao.mean=function(n,t){var e,u=0,o=n.length,a=-1,l=o;if(1===arguments.length)for(;++a<o;)i(e=r(n[a]))?u+=e:--l;els
 e for(;++a<o;)i(e=r(t.call(n,n[a],a)))?u+=e:--l;return l?u/l:void 0},ao.quantile=function(n,t){var e=(n.length-1)*t+1,r=Math.floor(e),i=+n[r-1],u=e-r;return u?i+u*(n[r]-i):i},ao.median=function(n,t){var u,o=[],a=n.length,l=-1;if(1===arguments.length)for(;++l<a;)i(u=r(n[l]))&&o.push(u);else for(;++l<a;)i(u=r(t.call(n,n[l],l)))&&o.push(u);return o.length?ao.quantile(o.sort(e),.5):void 0},ao.variance=function(n,t){var e,u,o=n.length,a=0,l=0,c=-1,f=0;if(1===arguments.length)for(;++c<o;)i(e=r(n[c]))&&(u=e-a,a+=u/++f,l+=u*(e-a));else for(;++c<o;)i(e=r(t.call(n,n[c],c)))&&(u=e-a,a+=u/++f,l+=u*(e-a));return f>1?l/(f-1):void 0},ao.deviation=function(){var n=ao.variance.apply(this,arguments);return n?Math.sqrt(n):n};var Mo=u(e);ao.bisectLeft=Mo.left,ao.bisect=ao.bisectRight=Mo.right,ao.bisector=function(n){return u(1===n.length?function(t,r){return e(n(t),r)}:n)},ao.shuffle=function(n,t,e){(u=arguments.length)<3&&(e=n.length,2>u&&(t=0));for(var r,i,u=e-t;u;)i=Math.random()*u--|0,r=n[u+t],n[u+
 t]=n[i+t],n[i+t]=r;return n},ao.permute=function(n,t){for(var e=t.length,r=new Array(e);e--;)r[e]=n[t[e]];return r},ao.pairs=function(n){for(var t,e=0,r=n.length-1,i=n[0],u=new Array(0>r?0:r);r>e;)u[e]=[t=i,i=n[++e]];return u},ao.transpose=function(n){if(!(i=n.length))return[];for(var t=-1,e=ao.min(n,o),r=new Array(e);++t<e;)for(var i,u=-1,a=r[t]=new Array(i);++u<i;)a[u]=n[u][t];return r},ao.zip=function(){return ao.transpose(arguments)},ao.keys=function(n){var t=[];for(var e in n)t.push(e);return t},ao.values=function(n){var t=[];for(var e in n)t.push(n[e]);return t},ao.entries=function(n){var t=[];for(var e in n)t.push({key:e,value:n[e]});return t},ao.merge=function(n){for(var t,e,r,i=n.length,u=-1,o=0;++u<i;)o+=n[u].length;for(e=new Array(o);--i>=0;)for(r=n[i],t=r.length;--t>=0;)e[--o]=r[t];return e};var xo=Math.abs;ao.range=function(n,t,e){if(arguments.length<3&&(e=1,arguments.length<2&&(t=n,n=0)),(t-n)/e===1/0)throw new Error("infinite range");var r,i=[],u=a(xo(e)),o=-1;if(n*=u
 ,t*=u,e*=u,0>e)for(;(r=n+e*++o)>t;)i.push(r/u);else for(;(r=n+e*++o)<t;)i.push(r/u);return i},ao.map=function(n,t){var e=new c;if(n instanceof c)n.forEach(function(n,t){e.set(n,t)});else if(Array.isArray(n)){var r,i=-1,u=n.length;if(1===arguments.length)for(;++i<u;)e.set(i,n[i]);else for(;++i<u;)e.set(t.call(n,r=n[i],i),r)}else for(var o in n)e.set(o,n[o]);return e};var bo="__proto__",_o="\x00";l(c,{has:h,get:function(n){return this._[f(n)]},set:function(n,t){return this._[f(n)]=t},remove:p,keys:g,values:function(){var n=[];for(var t in this._)n.push(this._[t]);return n},entries:function(){var n=[];for(var t in this._)n.push({key:s(t),value:this._[t]});return n},size:v,empty:d,forEach:function(n){for(var t in this._)n.call(this,s(t),this._[t])}}),ao.nest=function(){function n(t,o,a){if(a>=u.length)return r?r.call(i,o):e?o.sort(e):o;for(var l,f,s,h,p=-1,g=o.length,v=u[a++],d=new c;++p<g;)(h=d.get(l=v(f=o[p])))?h.push(f):d.set(l,[f]);return t?(f=t(),s=function(e,r){f.set(e,n(t,r,a))})
 :(f={},s=function(e,r){f[e]=n(t,r,a)}),d.forEach(s),f}function t(n,e){if(e>=u.length)return n;var r=[],i=o[e++];return n.forEach(function(n,i){r.push({key:n,values:t(i,e)})}),i?r.sort(function(n,t){return i(n.key,t.key)}):r}var e,r,i={},u=[],o=[];return i.map=function(t,e){return n(e,t,0)},i.entries=function(e){return t(n(ao.map,e,0),0)},i.key=function(n){return u.push(n),i},i.sortKeys=function(n){return o[u.length-1]=n,i},i.sortValues=function(n){return e=n,i},i.rollup=function(n){return r=n,i},i},ao.set=function(n){var t=new y;if(n)for(var e=0,r=n.length;r>e;++e)t.add(n[e]);return t},l(y,{has:h,add:function(n){return this._[f(n+="")]=!0,n},remove:p,values:g,size:v,empty:d,forEach:function(n){for(var t in this._)n.call(this,s(t))}}),ao.behavior={},ao.rebind=function(n,t){for(var e,r=1,i=arguments.length;++r<i;)n[e=arguments[r]]=M(n,t,t[e]);return n};var wo=["webkit","ms","moz","Moz","o","O"];ao.dispatch=function(){for(var n=new _,t=-1,e=arguments.length;++t<e;)n[arguments[t]]=w(n);
 return n},_.prototype.on=function(n,t){var e=n.indexOf("."),r="";if(e>=0&&(r=n.slice(e+1),n=n.slice(0,e)),n)return arguments.length<2?this[n].on(r):this[n].on(r,t);if(2===arguments.length){if(null==t)for(n in this)this.hasOwnProperty(n)&&this[n].on(r,null);return this}},ao.event=null,ao.requote=function(n){return n.replace(So,"\\$&")};var So=/[\\\^\$\*\+\?\|\[\]\(\)\.\{\}]/g,ko={}.__proto__?function(n,t){n.__proto__=t}:function(n,t){for(var e in t)n[e]=t[e]},No=function(n,t){return t.querySelector(n)},Eo=function(n,t){return t.querySelectorAll(n)},Ao=function(n,t){var e=n.matches||n[x(n,"matchesSelector")];return(Ao=function(n,t){return e.call(n,t)})(n,t)};"function"==typeof Sizzle&&(No=function(n,t){return Sizzle(n,t)[0]||null},Eo=Sizzle,Ao=Sizzle.matchesSelector),ao.selection=function(){return ao.select(fo.documentElement)};var Co=ao.selection.prototype=[];Co.select=function(n){var t,e,r,i,u=[];n=A(n);for(var o=-1,a=this.length;++o<a;){u.push(t=[]),t.parentNode=(r=this[o]).parentN
 ode;for(var l=-1,c=r.length;++l<c;)(i=r[l])?(t.push(e=n.call(i,i.__data__,l,o)),e&&"__data__"in i&&(e.__data__=i.__data__)):t.push(null)}return E(u)},Co.selectAll=function(n){var t,e,r=[];n=C(n);for(var i=-1,u=this.length;++i<u;)for(var o=this[i],a=-1,l=o.length;++a<l;)(e=o[a])&&(r.push(t=co(n.call(e,e.__data__,a,i))),t.parentNode=e);return E(r)};var zo="http://www.w3.org/1999/xhtml",Lo={svg:"http://www.w3.org/2000/svg",xhtml:zo,xlink:"http://www.w3.org/1999/xlink",xml:"http://www.w3.org/XML/1998/namespace",xmlns:"http://www.w3.org/2000/xmlns/"};ao.ns={prefix:Lo,qualify:function(n){var t=n.indexOf(":"),e=n;return t>=0&&"xmlns"!==(e=n.slice(0,t))&&(n=n.slice(t+1)),Lo.hasOwnProperty(e)?{space:Lo[e],local:n}:n}},Co.attr=function(n,t){if(arguments.length<2){if("string"==typeof n){var e=this.node();return n=ao.ns.qualify(n),n.local?e.getAttributeNS(n.space,n.local):e.getAttribute(n)}for(t in n)this.each(z(t,n[t]));return this}return this.each(z(n,t))},Co.classed=function(n,t){if(argument
 s.length<2){if("string"==typeof n){var e=this.node(),r=(n=T(n)).length,i=-1;if(t=e.classList){for(;++i<r;)if(!t.contains(n[i]))return!1}else for(t=e.getAttribute("class");++i<r;)if(!q(n[i]).test(t))return!1;return!0}for(t in n)this.each(R(t,n[t]));return this}return this.each(R(n,t))},Co.style=function(n,e,r){var i=arguments.length;if(3>i){if("string"!=typeof n){2>i&&(e="");for(r in n)this.each(P(r,n[r],e));return this}if(2>i){var u=this.node();return t(u).getComputedStyle(u,null).getPropertyValue(n)}r=""}return this.each(P(n,e,r))},Co.property=function(n,t){if(arguments.length<2){if("string"==typeof n)return this.node()[n];for(t in n)this.each(U(t,n[t]));return this}return this.each(U(n,t))},Co.text=function(n){return arguments.length?this.each("function"==typeof n?function(){var t=n.apply(this,arguments);this.textContent=null==t?"":t}:null==n?function(){this.textContent=""}:function(){this.textContent=n}):this.node().textContent},Co.html=function(n){return arguments.length?this.ea
 ch("function"==typeof n?function(){var t=n.apply(this,arguments);this.innerHTML=null==t?"":t}:null==n?function(){this.innerHTML=""}:function(){this.innerHTML=n}):this.node().innerHTML},Co.append=function(n){return n=j(n),this.select(function(){return this.appendChild(n.apply(this,arguments))})},Co.insert=function(n,t){return n=j(n),t=A(t),this.select(function(){return this.insertBefore(n.apply(this,arguments),t.apply(this,arguments)||null)})},Co.remove=function(){return this.each(F)},Co.data=function(n,t){function e(n,e){var r,i,u,o=n.length,s=e.length,h=Math.min(o,s),p=new Array(s),g=new Array(s),v=new Array(o);if(t){var d,y=new c,m=new Array(o);for(r=-1;++r<o;)(i=n[r])&&(y.has(d=t.call(i,i.__data__,r))?v[r]=i:y.set(d,i),m[r]=d);for(r=-1;++r<s;)(i=y.get(d=t.call(e,u=e[r],r)))?i!==!0&&(p[r]=i,i.__data__=u):g[r]=H(u),y.set(d,!0);for(r=-1;++r<o;)r in m&&y.get(m[r])!==!0&&(v[r]=n[r])}else{for(r=-1;++r<h;)i=n[r],u=e[r],i?(i.__data__=u,p[r]=i):g[r]=H(u);for(;s>r;++r)g[r]=H(e[r]);for(;o>r
 ;++r)v[r]=n[r]}g.update=p,g.parentNode=p.parentNode=v.parentNode=n.parentNode,a.push(g),l.push(p),f.push(v)}var r,i,u=-1,o=this.length;if(!arguments.length){for(n=new Array(o=(r=this[0]).length);++u<o;)(i=r[u])&&(n[u]=i.__data__);return n}var a=Z([]),l=E([]),f=E([]);if("function"==typeof n)for(;++u<o;)e(r=this[u],n.call(r,r.parentNode.__data__,u));else for(;++u<o;)e(r=this[u],n);return l.enter=function(){return a},l.exit=function(){return f},l},Co.datum=function(n){return arguments.length?this.property("__data__",n):this.property("__data__")},Co.filter=function(n){var t,e,r,i=[];"function"!=typeof n&&(n=O(n));for(var u=0,o=this.length;o>u;u++){i.push(t=[]),t.parentNode=(e=this[u]).parentNode;for(var a=0,l=e.length;l>a;a++)(r=e[a])&&n.call(r,r.__data__,a,u)&&t.push(r)}return E(i)},Co.order=function(){for(var n=-1,t=this.length;++n<t;)for(var e,r=this[n],i=r.length-1,u=r[i];--i>=0;)(e=r[i])&&(u&&u!==e.nextSibling&&u.parentNode.insertBefore(e,u),u=e);return this},Co.sort=function(n){n=
 I.apply(this,arguments);for(var t=-1,e=this.length;++t<e;)this[t].sort(n);return this.order()},Co.each=function(n){return Y(this,function(t,e,r){n.call(t,t.__data__,e,r)})},Co.call=function(n){var t=co(arguments);return n.apply(t[0]=this,t),this},Co.empty=function(){return!this.node()},Co.node=function(){for(var n=0,t=this.length;t>n;n++)for(var e=this[n],r=0,i=e.length;i>r;r++){var u=e[r];if(u)return u}return null},Co.size=function(){var n=0;return Y(this,function(){++n}),n};var qo=[];ao.selection.enter=Z,ao.selection.enter.prototype=qo,qo.append=Co.append,qo.empty=Co.empty,qo.node=Co.node,qo.call=Co.call,qo.size=Co.size,qo.select=function(n){for(var t,e,r,i,u,o=[],a=-1,l=this.length;++a<l;){r=(i=this[a]).update,o.push(t=[]),t.parentNode=i.parentNode;for(var c=-1,f=i.length;++c<f;)(u=i[c])?(t.push(r[c]=e=n.call(i.parentNode,u.__data__,c,a)),e.__data__=u.__data__):t.push(null)}return E(o)},qo.insert=function(n,t){return arguments.length<2&&(t=V(this)),Co.insert.call(this,n,t)},ao.se
 lect=function(t){var e;return"string"==typeof t?(e=[No(t,fo)],e.parentNode=fo.documentElement):(e=[t],e.parentNode=n(t)),E([e])},ao.selectAll=function(n){var t;return"string"==typeof n?(t=co(Eo(n,fo)),t.parentNode=fo.documentElement):(t=co(n),t.parentNode=null),E([t])},Co.on=function(n,t,e){var r=arguments.length;if(3>r){if("string"!=typeof n){2>r&&(t=!1);for(e in n)this.each(X(e,n[e],t));return this}if(2>r)return(r=this.node()["__on"+n])&&r._;e=!1}return this.each(X(n,t,e))};var To=ao.map({mouseenter:"mouseover",mouseleave:"mouseout"});fo&&To.forEach(function(n){"on"+n in fo&&To.remove(n)});var Ro,Do=0;ao.mouse=function(n){return J(n,k())};var Po=this.navigator&&/WebKit/.test(this.navigator.userAgent)?-1:0;ao.touch=function(n,t,e){if(arguments.length<3&&(e=t,t=k().changedTouches),t)for(var r,i=0,u=t.length;u>i;++i)if((r=t[i]).identifier===e)return J(n,r)},ao.behavior.drag=function(){function n(){this.on("mousedown.drag",u).on("touchstart.drag",o)}function e(n,t,e,u,o){return functi
 on(){function a(){var n,e,r=t(h,v);r&&(n=r[0]-M[0],e=r[1]-M[1],g|=n|e,M=r,p({type:"drag",x:r[0]+c[0],y:r[1]+c[1],dx:n,dy:e}))}function l(){t(h,v)&&(y.on(u+d,null).on(o+d,null),m(g),p({type:"dragend"}))}var c,f=this,s=ao.event.target.correspondingElement||ao.event.target,h=f.parentNode,p=r.of(f,arguments),g=0,v=n(),d=".drag"+(null==v?"":"-"+v),y=ao.select(e(s)).on(u+d,a).on(o+d,l),m=W(s),M=t(h,v);i?(c=i.apply(f,arguments),c=[c.x-M[0],c.y-M[1]]):c=[0,0],p({type:"dragstart"})}}var r=N(n,"drag","dragstart","dragend"),i=null,u=e(b,ao.mouse,t,"mousemove","mouseup"),o=e(G,ao.touch,m,"touchmove","touchend");return n.origin=function(t){return arguments.length?(i=t,n):i},ao.rebind(n,r,"on")},ao.touches=function(n,t){return arguments.length<2&&(t=k().touches),t?co(t).map(function(t){var e=J(n,t);return e.identifier=t.identifier,e}):[]};var Uo=1e-6,jo=Uo*Uo,Fo=Math.PI,Ho=2*Fo,Oo=Ho-Uo,Io=Fo/2,Yo=Fo/180,Zo=180/Fo,Vo=Math.SQRT2,Xo=2,$o=4;ao.interpolateZoom=function(n,t){var e,r,i=n[0],u=n[1],o=n[
 2],a=t[0],l=t[1],c=t[2],f=a-i,s=l-u,h=f*f+s*s;if(jo>h)r=Math.log(c/o)/Vo,e=function(n){return[i+n*f,u+n*s,o*Math.exp(Vo*n*r)]};else{var p=Math.sqrt(h),g=(c*c-o*o+$o*h)/(2*o*Xo*p),v=(c*c-o*o-$o*h)/(2*c*Xo*p),d=Math.log(Math.sqrt(g*g+1)-g),y=Math.log(Math.sqrt(v*v+1)-v);r=(y-d)/Vo,e=function(n){var t=n*r,e=rn(d),a=o/(Xo*p)*(e*un(Vo*t+d)-en(d));return[i+a*f,u+a*s,o*e/rn(Vo*t+d)]}}return e.duration=1e3*r,e},ao.behavior.zoom=function(){function n(n){n.on(L,s).on(Wo+".zoom",p).on("dblclick.zoom",g).on(R,h)}function e(n){return[(n[0]-k.x)/k.k,(n[1]-k.y)/k.k]}function r(n){return[n[0]*k.k+k.x,n[1]*k.k+k.y]}function i(n){k.k=Math.max(A[0],Math.min(A[1],n))}function u(n,t){t=r(t),k.x+=n[0]-t[0],k.y+=n[1]-t[1]}function o(t,e,r,o){t.__chart__={x:k.x,y:k.y,k:k.k},i(Math.pow(2,o)),u(d=e,r),t=ao.select(t),C>0&&(t=t.transition().duration(C)),t.call(n.event)}function a(){b&&b.domain(x.range().map(function(n){return(n-k.x)/k.k}).map(x.invert)),w&&w.domain(_.range().map(function(n){return(n-k.y)/k.k})
 .map(_.invert))}function l(n){z++||n({type:"zoomstart"})}function c(n){a(),n({type:"zoom",scale:k.k,translate:[k.x,k.y]})}function f(n){--z||(n({type:"zoomend"}),d=null)}function s(){function n(){a=1,u(ao.mouse(i),h),c(o)}function r(){s.on(q,null).on(T,null),p(a),f(o)}var i=this,o=D.of(i,arguments),a=0,s=ao.select(t(i)).on(q,n).on(T,r),h=e(ao.mouse(i)),p=W(i);Il.call(i),l(o)}function h(){function n(){var n=ao.touches(g);return p=k.k,n.forEach(function(n){n.identifier in d&&(d[n.identifier]=e(n))}),n}function t(){var t=ao.event.target;ao.select(t).on(x,r).on(b,a),_.push(t);for(var e=ao.event.changedTouches,i=0,u=e.length;u>i;++i)d[e[i].identifier]=null;var l=n(),c=Date.now();if(1===l.length){if(500>c-M){var f=l[0];o(g,f,d[f.identifier],Math.floor(Math.log(k.k)/Math.LN2)+1),S()}M=c}else if(l.length>1){var f=l[0],s=l[1],h=f[0]-s[0],p=f[1]-s[1];y=h*h+p*p}}function r(){var n,t,e,r,o=ao.touches(g);Il.call(g);for(var a=0,l=o.length;l>a;++a,r=null)if(e=o[a],r=d[e.identifier]){if(t)break;n=e
 ,t=r}if(r){var f=(f=e[0]-n[0])*f+(f=e[1]-n[1])*f,s=y&&Math.sqrt(f/y);n=[(n[0]+e[0])/2,(n[1]+e[1])/2],t=[(t[0]+r[0])/2,(t[1]+r[1])/2],i(s*p)}M=null,u(n,t),c(v)}function a(){if(ao.event.touches.length){for(var t=ao.event.changedTouches,e=0,r=t.length;r>e;++e)delete d[t[e].identifier];for(var i in d)return void n()}ao.selectAll(_).on(m,null),w.on(L,s).on(R,h),N(),f(v)}var p,g=this,v=D.of(g,arguments),d={},y=0,m=".zoom-"+ao.event.changedTouches[0].identifier,x="touchmove"+m,b="touchend"+m,_=[],w=ao.select(g),N=W(g);t(),l(v),w.on(L,null).on(R,t)}function p(){var n=D.of(this,arguments);m?clearTimeout(m):(Il.call(this),v=e(d=y||ao.mouse(this)),l(n)),m=setTimeout(function(){m=null,f(n)},50),S(),i(Math.pow(2,.002*Bo())*k.k),u(d,v),c(n)}function g(){var n=ao.mouse(this),t=Math.log(k.k)/Math.LN2;o(this,n,e(n),ao.event.shiftKey?Math.ceil(t)-1:Math.floor(t)+1)}var v,d,y,m,M,x,b,_,w,k={x:0,y:0,k:1},E=[960,500],A=Jo,C=250,z=0,L="mousedown.zoom",q="mousemove.zoom",T="mouseup.zoom",R="touchstart.zoo
 m",D=N(n,"zoomstart","zoom","zoomend");return Wo||(Wo="onwheel"in fo?(Bo=function(){return-ao.event.deltaY*(ao.event.deltaMode?120:1)},"wheel"):"onmousewheel"in fo?(Bo=function(){return ao.event.wheelDelta},"mousewheel"):(Bo=function(){return-ao.event.detail},"MozMousePixelScroll")),n.event=function(n){n.each(function(){var n=D.of(this,arguments),t=k;Hl?ao.select(this).transition().each("start.zoom",function(){k=this.__chart__||{x:0,y:0,k:1},l(n)}).tween("zoom:zoom",function(){var e=E[0],r=E[1],i=d?d[0]:e/2,u=d?d[1]:r/2,o=ao.interpolateZoom([(i-k.x)/k.k,(u-k.y)/k.k,e/k.k],[(i-t.x)/t.k,(u-t.y)/t.k,e/t.k]);return function(t){var r=o(t),a=e/r[2];this.__chart__=k={x:i-r[0]*a,y:u-r[1]*a,k:a},c(n)}}).each("interrupt.zoom",function(){f(n)}).each("end.zoom",function(){f(n)}):(this.__chart__=k,l(n),c(n),f(n))})},n.translate=function(t){return arguments.length?(k={x:+t[0],y:+t[1],k:k.k},a(),n):[k.x,k.y]},n.scale=function(t){return arguments.length?(k={x:k.x,y:k.y,k:null},i(+t),a(),n):k.k},n.s
 caleExtent=function(t){return arguments.length?(A=null==t?Jo:[+t[0],+t[1]],n):A},n.center=function(t){return arguments.length?(y=t&&[+t[0],+t[1]],n):y},n.size=function(t){return arguments.length?(E=t&&[+t[0],+t[1]],n):E},n.duration=function(t){return arguments.length?(C=+t,n):C},n.x=function(t){return arguments.length?(b=t,x=t.copy(),k={x:0,y:0,k:1},n):b},n.y=function(t){return arguments.length?(w=t,_=t.copy(),k={x:0,y:0,k:1},n):w},ao.rebind(n,D,"on")};var Bo,Wo,Jo=[0,1/0];ao.color=an,an.prototype.toString=function(){return this.rgb()+""},ao.hsl=ln;var Go=ln.prototype=new an;Go.brighter=function(n){return n=Math.pow(.7,arguments.length?n:1),new ln(this.h,this.s,this.l/n)},Go.darker=function(n){return n=Math.pow(.7,arguments.length?n:1),new ln(this.h,this.s,n*this.l)},Go.rgb=function(){return cn(this.h,this.s,this.l)},ao.hcl=fn;var Ko=fn.prototype=new an;Ko.brighter=function(n){return new fn(this.h,this.c,Math.min(100,this.l+Qo*(arguments.length?n:1)))},Ko.darker=function(n){return n
 ew fn(this.h,this.c,Math.max(0,this.l-Qo*(arguments.length?n:1)))},Ko.rgb=function(){return sn(this.h,this.c,this.l).rgb()},ao.lab=hn;var Qo=18,na=.95047,ta=1,ea=1.08883,ra=hn.prototype=new an;ra.brighter=function(n){return new hn(Math.min(100,this.l+Qo*(arguments.length?n:1)),this.a,this.b)},ra.darker=function(n){return new hn(Math.max(0,this.l-Qo*(arguments.length?n:1)),this.a,this.b)},ra.rgb=function(){return pn(this.l,this.a,this.b)},ao.rgb=mn;var ia=mn.prototype=new an;ia.brighter=function(n){n=Math.pow(.7,arguments.length?n:1);var t=this.r,e=this.g,r=this.b,i=30;return t||e||r?(t&&i>t&&(t=i),e&&i>e&&(e=i),r&&i>r&&(r=i),new mn(Math.min(255,t/n),Math.min(255,e/n),Math.min(255,r/n))):new mn(i,i,i)},ia.darker=function(n){return n=Math.pow(.7,arguments.length?n:1),new mn(n*this.r,n*this.g,n*this.b)},ia.hsl=function(){return wn(this.r,this.g,this.b)},ia.toString=function(){return"#"+bn(this.r)+bn(this.g)+bn(this.b)};var ua=ao.map({aliceblue:15792383,antiquewhite:16444375,aqua:65535,
 aquamarine:8388564,azure:15794175,beige:16119260,bisque:16770244,black:0,blanchedalmond:16772045,blue:255,blueviolet:9055202,brown:10824234,burlywood:14596231,cadetblue:6266528,chartreuse:8388352,chocolate:13789470,coral:16744272,cornflowerblue:6591981,cornsilk:16775388,crimson:14423100,cyan:65535,darkblue:139,darkcyan:35723,darkgoldenrod:12092939,darkgray:11119017,darkgreen:25600,darkgrey:11119017,darkkhaki:12433259,darkmagenta:9109643,darkolivegreen:5597999,darkorange:16747520,darkorchid:10040012,darkred:9109504,darksalmon:15308410,darkseagreen:9419919,darkslateblue:4734347,darkslategray:3100495,darkslategrey:3100495,darkturquoise:52945,darkviolet:9699539,deeppink:16716947,deepskyblue:49151,dimgray:6908265,dimgrey:6908265,dodgerblue:2003199,firebrick:11674146,floralwhite:16775920,forestgreen:2263842,fuchsia:16711935,gainsboro:14474460,ghostwhite:16316671,gold:16766720,goldenrod:14329120,gray:8421504,green:32768,greenyellow:11403

<TRUNCATED>

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


[11/11] qpid-dispatch git commit: DISPATCH-1001 Added README for removed console directories.

Posted by ea...@apache.org.
DISPATCH-1001 Added README for removed console directories.


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

Branch: refs/heads/master
Commit: 91def84726054a1680fb4a621c52a99992ded77e
Parents: a5e2307
Author: Ernest Allen <ea...@redhat.com>
Authored: Wed May 30 19:35:31 2018 -0400
Committer: Ernest Allen <ea...@redhat.com>
Committed: Wed May 30 19:35:31 2018 -0400

----------------------------------------------------------------------
 console/README.md | 24 ++++++++++++++++++++++++
 1 file changed, 24 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/91def847/console/README.md
----------------------------------------------------------------------
diff --git a/console/README.md b/console/README.md
new file mode 100644
index 0000000..79d7878
--- /dev/null
+++ b/console/README.md
@@ -0,0 +1,24 @@
+<!---
+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.
+--->
+The console utilities under the config/ and dispatch-dashboard/ directories have been deprecated and moved to separate npm repositories.
+
+To install from npm:
+
+```npm install dispatch-topology```
+```npm install dispatch-dashboard```


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


[03/11] qpid-dispatch git commit: DISPATCH-1001 Removed the deprecated directories

Posted by ea...@apache.org.
http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/a5e2307f/console/dispatch-dashboard/dispatch/static/dashboard/dispatch/qdrChartService.js
----------------------------------------------------------------------
diff --git a/console/dispatch-dashboard/dispatch/static/dashboard/dispatch/qdrChartService.js b/console/dispatch-dashboard/dispatch/static/dashboard/dispatch/qdrChartService.js
deleted file mode 100644
index 992e80d..0000000
--- a/console/dispatch-dashboard/dispatch/static/dashboard/dispatch/qdrChartService.js
+++ /dev/null
@@ -1,1109 +0,0 @@
-/*
-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.
-*/
-/**
- * @module QDR
- */
-var QDR = (function(QDR) {
-  'use strict';
-
-    // The QDR chart service handles periodic gathering data for charts and displaying the charts
-  angular
-    .module('horizon.dashboard.dispatch')
-    .factory('horizon.dashboard.dispatch.chartService', QDRChartService);
-
-  QDRChartService.$inject = [
-    '$rootScope',
-    'horizon.dashboard.dispatch.comService',
-    '$http',
-    '$location'
-  ];
-
-  function QDRChartService(
-    $rootScope,
-    QDRService,
-    $http,
-    $location) {
-      var instance = 0;   // counter for chart instances
-      var bases = [];
-      var findBase = function (name, attr, request) {
-        for (var i=0; i<bases.length; ++i) {
-          var base = bases[i];
-          if (base.equals(name, attr, request))
-            return base;
-        }
-        return null;
-      }
-
-      function ChartBase(name, attr, request) {
-        // the base chart attributes
-        this.name = name;           // the record's "name" field
-        this.attr = attr;           // the record's attr field to chart
-        this.request = request;     // the associated request that fetches the data
-
-        // copy the savable properties to an object
-        this.copyProps = function (o) {
-          o.name = this.name;
-          o.attr = this.attr;
-          this.request.copyProps(o);
-        }
-
-        this.equals = function (name, attr, request) {
-          return (this.name == name && this.attr == attr && this.request.equals(request));
-        }
-      };
-
-      // Object that represents a visible chart
-      // There can be multiple of these per ChartBase (eg. one rate  and one value chart)
-      function Chart(opts, request) { //name, attr, cinstance, request) {
-
-        var base = findBase(opts.name, opts.attr, request);
-        if (!base) {
-            base = new ChartBase(opts.name, opts.attr, request);
-            bases.push(base);
-        }
-        this.base = base;
-        this.instance = angular.isDefined(opts.instance) ? opts.instance : ++instance;
-        this.dashboard = false;     // is this chart on the dashboard page
-        this.hdash = false;         // is this chart on the hawtio dashboard page
-        this.hreq = false;          // has this hdash chart been requested
-        this.type = opts.type ? opts.type: "value";        // value or rate
-        this.rateWindow = opts.rateWindow ? opts.rateWindow : 1000;     // calculate the rate of change over this time interval. higher == smother graph
-        this.areaColor = "#cbe7f3"; // the chart's area color when not an empty string
-        this.lineColor = "#058dc7"; // the chart's line color when not an empty string
-        this.visibleDuration = opts.visibleDuration ? opts.visibleDuration : 10;  // number of minutes of data to show (<= base.duration)
-        this.userTitle = null;      // user title overrides title()
-
-        // generate a unique id for this chart
-        this.id = function () {
-          var name = this.name()
-          var nameparts = name.split('/');
-          if (nameparts.length == 2)
-              name = nameparts[1];
-          var key = (QDRService.nameFromId(this.request().nodeId) || '') + this.request().entity + name + this.attr() + "_" + this.instance + "_" + (this.request().aggregate ? "1" : "0");
-          // remove all characters except letters,numbers, and _
-          return key.replace(/[^\w]/gi, '')
-        }
-        // copy the savable properties to an object
-        this.copyProps = function (o) {
-          o.type = this.type;
-          o.rateWindow = this.rateWindow;
-          o.areaColor = this.areaColor;
-          o.lineColor = this.lineColor;
-          o.visibleDuration = this.visibleDuration;
-          o.userTitle = this.userTitle;
-          o.dashboard = this.dashboard;
-          o.hdash = this.hdash;
-          o.instance = this.instance;
-          this.base.copyProps(o);
-        }
-        this.name = function (_) {
-          if (!arguments.length) return this.base.name;
-          this.base.name = _;
-          return this;
-        }
-        this.attr = function (_) {
-          if (!arguments.length) return this.base.attr;
-          this.base.attr = _;
-          return this;
-        }
-        this.nodeId = function (_) {
-          if (!arguments.length) return this.base.request.nodeId;
-          this.base.request.nodeId = _;
-          return this;
-        }
-        this.entity = function (_) {
-          if (!arguments.length) return this.base.request.entity;
-          this.base.request.entity = _;
-          return this;
-        }
-        this.aggregate = function (_) {
-          if (!arguments.length) return this.base.request.aggregate;
-          this.base.request.aggregate = _;
-          return this;
-        }
-        this.request = function (_) {
-          if (!arguments.length) return this.base.request;
-          this.base.request = _;
-          return this;
-        }
-        this.data = function () {
-          return this.base.request.data(this.base.name, this.base.attr); // refernce to chart's data array
-        }
-        this.interval = function (_) {
-          if (!arguments.length) return this.base.request.interval;
-          this.base.request.interval = _;
-          return this;
-        }
-        this.duration = function (_) {
-          if (!arguments.length) return this.base.request.duration;
-          this.base.request.duration = _;
-          return this;
-        }
-        this.title = function (_) {
-          var name = this.request().aggregate ? 'Aggregate' : (QDRService.nameFromId(this.nodeId()) || this.nodeId());
-          var computed = name +
-             " " + QDRService.humanify(this.attr()) +
-             " - " + this.name()
-          if (!arguments.length) return this.userTitle || computed;
-
-          // don't store computed title in userTitle
-          if (_ === computed)
-            _ = null;
-          this.userTitle = _;
-          return this;
-        }
-        this.title_short = function (_) {
-          if (!arguments.length) return this.userTitle || this.name();
-          return this;
-        }
-        this.copy = function () {
-          var chart = self.registerChart({
-            nodeId: this.nodeId(),
-            entity: this.entity(),
-            name:   this.name(),
-            attr:   this.attr(),
-            interval: this.interval(),
-            forceCreate: true,
-            aggregate: this.aggregate(),
-            hdash: this.hdash
-          })
-          chart.type = this.type;
-          chart.areaColor = this.areaColor;
-          chart.lineColor = this.lineColor;
-          chart.rateWindow = this.rateWindow;
-          chart.visibleDuration = this.visibleDuration;
-          chart.userTitle = this.userTitle;
-          return chart;
-        }
-        // compare to a chart
-        this.equals = function (c) {
-          return (c.instance == this.instance &&
-            c.base.equals(this.base.name, this.base.attr, this.base.request) &&
-            c.type == this.type &&
-            c.rateWindow == this.rateWindow &&
-            c.areaColor == this.areaColor &&
-            c.lineColor == this.lineColor)
-        }
-      }
-
-      // Object that represents the management request to fetch and store data for multiple charts
-      function ChartRequest(opts) { //nodeId, entity, name, attr, interval, aggregate) {
-        this.duration = opts.duration || 10;    // number of minutes to keep the data
-        this.nodeId = opts.nodeId;              // eg amqp:/_topo/0/QDR.A/$management
-        this.entity = opts.entity;              // eg .router.address
-        // sorted since the responses will always be sorted
-        this.aggregate = opts.aggregate;        // list of nodeIds for aggregate charts
-        this.datum = {};                        // object containing array of arrays for each attr
-                                                // like {attr1: [[date,value],[date,value]...], attr2: [[date,value]...]}
-
-        this.interval = opts.interval || 1000;  // number of milliseconds between updates to data
-        this.setTimeoutHandle = null;           // used to cancel the next request
-        // copy the savable properties to an object
-
-        this.data = function (name, attr) {
-          if (this.datum[name] && this.datum[name][attr])
-            return this.datum[name][attr]
-          return null;
-        }
-        this.addAttrName = function (name, attr) {
-          if (Object.keys(this.datum).indexOf(name) == -1) {
-            this.datum[name] = {}
-          }
-          if (Object.keys(this.datum[name]).indexOf(attr) == -1) {
-            this.datum[name][attr] = [];
-          }
-        }
-        this.addAttrName(opts.name, opts.attr)
-
-        this.copyProps = function (o) {
-          o.nodeId = this.nodeId;
-          o.entity = this.entity;
-          o.interval = this.interval;
-          o.aggregate = this.aggregate;
-          o.duration = this.duration;
-        }
-
-        this.removeAttr = function (name, attr) {
-          if (this.datum[name]) {
-            if (this.datum[name][attr]) {
-              delete this.datum[name][attr]
-            }
-          }
-          return this.attrs().length;
-        }
-
-        this.equals = function (r, entity, aggregate) {
-          if (arguments.length == 3) {
-            var o = {nodeId: r, entity: entity, aggregate: aggregate}
-            r = o;
-          }
-          return (this.nodeId === r.nodeId && this.entity === r.entity && this.aggregate == r.aggregate)
-        }
-        this.names = function () {
-          return Object.keys(this.datum)
-        }
-        this.attrs = function () {
-          var attrs = {}
-          Object.keys(this.datum).forEach( function (name) {
-            Object.keys(this.datum[name]).forEach( function (attr) {
-              attrs[attr] = 1;
-            })
-          }, this)
-          return Object.keys(attrs);
-        }
-      };
-
-      // Below here are the properties and methods available on QDRChartService
-      var self = {
-        charts: [],         // list of charts to gather data for
-        chartRequests: [],  // the management request info (multiple charts can be driven off of a single request
-
-        init: function () {
-          self.loadCharts();
-          QDRService.addDisconnectAction( function () {
-            self.charts.forEach( function (chart) {
-             self.unRegisterChart(chart, true)
-            })
-            QDRService.addConnectAction(self.init);
-          })
-        },
-
-        findChartRequest: function (nodeId, entity, aggregate) {
-          var ret = null;
-          self.chartRequests.some( function (request) {
-            if (request.equals(nodeId, entity, aggregate)) {
-              ret = request;
-              return true;
-            }
-          })
-          return ret;
-        },
-
-        findCharts: function (opts) { //name, attr, nodeId, entity, hdash) {
-          if (!opts.hdash)
-              opts.hdash = false; // rather than undefined
-          return self.charts.filter( function (chart) {
-            return (chart.name() == opts.name &&
-              chart.attr() == opts.attr &&
-              chart.nodeId() == opts.nodeId &&
-              chart.entity() == opts.entity &&
-              chart.hdash == opts.hdash)
-          });
-        },
-
-        delChartRequest: function (request) {
-          for (var i=0; i<self.chartRequests.length; ++i) {
-            var r = self.chartRequests[i];
-            if (request.equals(r)) {
-              QDR.log.debug("removed request: " + request.nodeId + " " + request.entity);
-                self.chartRequests.splice(i, 1);
-                self.stopCollecting(request);
-                return;
-            }
-          }
-        },
-
-        delChart: function (chart, skipSave) {
-          var foundBases = 0;
-          for (var i=0; i<self.charts.length; ++i) {
-            var c = self.charts[i];
-            if (c.base === chart.base)
-              ++foundBases;
-              if (c.equals(chart)) {
-                self.charts.splice(i, 1);
-                if (chart.dashboard && !skipSave)
-                  self.saveCharts();
-              }
-          }
-          if (foundBases == 1) {
-            var baseIndex = bases.indexOf(chart.base)
-            bases.splice(baseIndex, 1);
-          }
-        },
-
-        // create a chart that doesn't get saved/loaded and has it's own
-        // request scheduler
-        createRequestAndChart: function (opts) {
-          var request = new ChartRequest(opts)
-          var chart = new Chart(opts, request)
-          return chart
-        },
-
-        // opts are nodeId, entity, name, attr, interval, instance, use_instance,
-        // forceCreate, aggregate, hdash
-        registerChart: function (opts) {
-          var request = self.findChartRequest(opts.nodeId, opts.entity, opts.aggregate);
-          if (request) {
-            // add any new attr or name to the list
-            request.addAttrName(opts.name, opts.attr)
-          } else {
-            // the nodeId/entity did not already exist, so add a new request and chart
-            QDR.log.debug("added new request: " + opts.nodeId + " " + opts.entity);
-            request = new ChartRequest(opts); //nodeId, entity, name, attr, interval, aggregate);
-            self.chartRequests.push(request);
-            self.startCollecting(request);
-          }
-          var charts = self.findCharts(opts); //name, attr, nodeId, entity, hdash);
-          var chart;
-          if (charts.length == 0 || opts.forceCreate) {
-            if (!opts.use_instance && opts.instance)
-              delete opts.instance;
-            chart = new Chart(opts, request) //opts.name, opts.attr, opts.instance, request);
-            self.charts.push(chart);
-          } else {
-            chart = charts[0];
-          }
-          return chart;
-        },
-
-        // remove the chart for name/attr
-        // if all attrs are gone for this request, remove the request
-        unRegisterChart: function (chart, skipSave) {
-          // remove the chart
-
-          // TODO: how do we remove charts that were added to the hawtio dashboard but then removed?
-          // We don't get a notification that they were removed. Instead, we could just stop sending
-          // the request in the background and only send the request when the chart's tick() event is triggered
-          //if (chart.hdash) {
-          //  chart.dashboard = false;
-          //  self.saveCharts();
-          //    return;
-          //}
-
-          for (var i=0; i<self.charts.length; ++i) {
-            var c = self.charts[i];
-            if (chart.equals(c)) {
-              var request = chart.request();
-              self.delChart(chart, skipSave);
-              if (request) {
-                // see if any other charts use this attr
-                for (var i=0; i<self.charts.length; ++i) {
-                  var c = self.charts[i];
-                  if (c.attr() == chart.attr() && c.request().equals(chart.request()))
-                    return;
-                }
-                // no other charts use this attr, so remove it
-                if (request.removeAttr(chart.name(), chart.attr()) == 0) {
-                  self.stopCollecting(request);
-                  self.delChartRequest(request);
-                }
-              }
-            }
-          }
-          if (!skipSave)
-            self.saveCharts();
-        },
-
-        stopCollecting: function (request) {
-          if (request.setTimeoutHandle) {
-            clearTimeout(request.setTimeoutHandle);
-            request.setTimeoutHandle = null;
-          }
-        },
-
-        startCollecting: function (request) {
-          // Using setTimeout instead of setInterval because the response may take longer than interval
-          request.setTimeoutHandle = setTimeout(self.sendChartRequest, request.interval, request);
-        },
-
-        shouldRequest: function (request) {
-          // see if any of the charts associated with this request have either dialog, dashboard, or hreq
-          return self.charts.some( function (chart) {
-            return (chart.dashboard || chart.hreq) || (!chart.dashboard && !chart.hdash);
-          });
-        },
-
-        // send the request
-        sendChartRequest: function (request, once) {
-          if (!once && !self.shouldRequest(request)) {
-            request.setTimeoutHandle = setTimeout(self.sendChartRequest, request.interval, request)
-            return;
-          }
-          // ensure the response has the name field so we can associate the response values with the correct chart
-          var attrs = request.attrs();
-          attrs.push("name");
-
-          // this is called when the response is received
-          var saveResponse = function (nodeId, entity, response) {
-            if (!response || !response.attributeNames)
-              return;
-            //QDR.log.debug("got chart results for " + nodeId + " " + entity);
-            // records is an array that has data for all names
-            var records = response.results;
-            if (!records)
-              return;
-
-            var now = new Date();
-            var cutOff = new Date(now.getTime() - request.duration * 60 * 1000);
-            // index of the "name" attr in the response
-            var nameIndex = response.attributeNames.indexOf("name");
-            if (nameIndex < 0)
-              return;
-
-            var names = request.names();
-            // for each record returned, find the name/attr for this request and save the data with this timestamp
-            for (var i=0; i<records.length; ++i) {
-              var name = records[i][nameIndex];
-              // if we want to store the values for some attrs for this name
-              if (names.indexOf(name) > -1) {
-                attrs.forEach( function (attr) {
-                  var data = request.data(name, attr) // get a reference to the data array
-                  if (data) {
-                    var attrIndex = response.attributeNames.indexOf(attr)
-                    if (request.aggregate) {
-                      data.push([now, response.aggregates[i][attrIndex].sum, response.aggregates[i][attrIndex].detail])
-                    } else {
-                      data.push([now, records[i][attrIndex]])
-                    }
-                    // expire the old data
-                    while (data[0][0] < cutOff) {
-                      data.shift();
-                    }
-                  }
-                })
-              }
-            }
-          }
-          if (request.aggregate) {
-            var nodeList = QDRService.nodeIdList()
-            QDRService.getMultipleNodeInfo(nodeList, request.entity, attrs, saveResponse, request.nodeId);
-          } else {
-            QDRService.getNodeInfo(request.nodeId, request.entity, attrs, saveResponse);
-          }
-          // it is now safe to schedule another request
-          if (once)
-            return;
-          request.setTimeoutHandle = setTimeout(self.sendChartRequest, request.interval, request)
-        },
-
-        numCharts: function () {
-         return self.charts.filter( function (chart) { return chart.dashboard }).length;
-         //return self.charts.length;
-        },
-
-        isAttrCharted: function (nodeId, entity, name, attr) {
-          var charts = self.findCharts({
-            name: name,
-            attr: attr,
-            nodeId: nodeId,
-            entity: entity
-          })
-          // if any of the matching charts are on the dashboard page, return true
-          return charts.some(function (chart) {
-            return (chart.dashboard)
-          });
-        },
-
-        addHDash: function (chart) {
-          chart.hdash = true;
-          self.saveCharts();
-        },
-
-        delHDash: function (chart) {
-          chart.hdash = false;
-          self.saveCharts();
-        },
-
-        addDashboard: function (chart) {
-          chart.dashboard = true;
-          self.saveCharts();
-        },
-
-        delDashboard: function (chart) {
-          chart.dashboard = false;
-          self.saveCharts();
-        },
-
-        // save the charts to local storage
-        saveCharts: function () {
-          var charts = [];
-          var minCharts = [];
-
-          self.charts.forEach(function (chart) {
-            var minChart = {};
-           // don't save chart unless it is on the dashboard
-            if (chart.dashboard || chart.hdash) {
-              chart.copyProps(minChart);
-              minCharts.push(minChart);
-            }
-          })
-          localStorage["QDRCharts"] = angular.toJson(minCharts);
-        },
-
-        loadCharts: function () {
-          var charts = angular.fromJson(localStorage["QDRCharts"]);
-          if (charts) {
-            // get array of known ids
-            var nodeList = QDRService.nodeList().map( function (node) {
-              return node.id;
-            })
-            charts.forEach(function (chart) {
-              // if this chart is not in the current list of nodes, skip
-              if (nodeList.indexOf(chart.nodeId) >= 0) {
-                if (!angular.isDefined(chart.instance)) {
-                  chart.instance = ++instance;
-                }
-                if (chart.instance >= instance)
-                  instance = chart.instance + 1;
-                if (!chart.duration)
-                    chart.duration = 10;
-                if (chart.nodeList)
-                    chart.aggregate = true;
-                if (!chart.hdash)
-                    chart.hdash = false;
-                if (!chart.dashboard)
-                    chart.dashboard = false;
-                if (!chart.hdash && !chart.dashboard)
-                    chart.dashboard = true;
-                if (chart.hdash && chart.dashboard)
-                  chart.dashboard = false;
-                chart.forceCreate = true;
-                chart.use_instance = true;
-                var newChart = self.registerChart(chart); //chart.nodeId, chart.entity, chart.name, chart.attr, chart.interval, true, chart.aggregate);
-                newChart.dashboard = chart.dashboard;
-                newChart.hdash = chart.hdash;
-                newChart.hreq = false;
-                newChart.type = chart.type;
-                newChart.rateWindow = chart.rateWindow;
-                newChart.areaColor = chart.areaColor ? chart.areaColor : "#cbe7f3";
-                newChart.lineColor = chart.lineColor ? chart.lineColor : "#058dc7";
-                newChart.duration(chart.duration);
-                newChart.visibleDuration = chart.visibleDuration ? chart.visibleDuration : 10;
-                if (chart.userTitle)
-                  newChart.title(chart.userTitle);
-              }
-            })
-          }
-        },
-
-        AreaChart: function (chart) {
-          if (!chart)
-            return;
-
-          // if this is an aggregate chart, show it stacked
-          var stacked = chart.request().aggregate;
-          this.chart = chart; // reference to underlying chart
-          this.svgchart = null;
-          this.url = $location.absUrl();
-
-          // callback function. called by svgchart when binding data
-          // the variable 'this' refers to the svg and not the AreaChart,
-          // but since we are still in the scope of the AreaChart we have access to the passed in chart argument
-          this.chartData = function () {
-
-            var now = new Date();
-            var visibleDate = new Date(now.getTime() - chart.visibleDuration * 60 * 1000);
-            var data = chart.data();
-            var nodeList = QDRService.nodeIdList();
-
-            if (chart.type == "rate") {
-              var rateData = [];
-              var datalen = data.length;
-              var k = 0;  // inner loop optimization
-              for (var i=0; i<datalen; ++i) {
-                var d = data[i];
-                if (d[0] >= visibleDate) {
-                  for (var j=k+1; j<datalen; ++j) {
-                    var d1 = data[j];
-                    if (d1[0] - d[0] >= chart.rateWindow) { // rateWindow is the timespan to calculate rates
-                      var elapsed = Math.max((d1[0] - d[0]) / 1000, 1); // number of seconds that elapsed
-                      var rd = [d1[0],(d1[1] - d[1])/elapsed]
-                      k = j; // start here next time
-                      // this is a stacked (aggregate) chart
-                      if (stacked) {
-                        var detail = [];
-                        nodeList.forEach( function (node, nodeIndex) {
-                          if (d1[2][nodeIndex] && d[2][nodeIndex])
-                            detail.push({node: QDRService.nameFromId(node), val: (d1[2][nodeIndex].val- d[2][nodeIndex].val)/elapsed})
-                          })
-                        rd.push(detail)
-                      }
-                      rateData.push(rd);
-                      break;
-                    }
-                  }
-                }
-              }
-              // we need at least a point to chart
-              if (rateData.length == 0) {
-                rateData[0] = [chart.data()[0][0],0,[{node:'',val:0}]];
-              }
-              return rateData;
-            }
-            if (chart.visibleDuration != chart.duration()) {
-              return data.filter(function (d) { return d[0]>=visibleDate});
-            } else
-              return data;
-          }
-
-          this.zoom = function (id, zoom) {
-            if (this.svgchart) {
-              this.svgchart.attr("zoom", zoom)
-              d3.select('#' + id)
-                .data([this.chartData()])
-                .call(this.svgchart)
-            }
-          }
-
-          // called by the controller on the page that displays the chart
-          // called whenever the controller wants to redraw the chart
-          // note: the data is collected independently of how often the chart is redrawn
-          this.tick = function (id) {
-
-            // can't draw charts that don't have data yet
-            if (this.chart.data().length == 0) {
-              return;
-            }
-
-            // if we haven't created the svg yet
-            if (!this.svgchart) {
-
-              // make sure the dom element exists on the page
-              var div = angular.element('#' + id);
-              if (!div)
-                return;
-
-              var width = div.width();
-              var height = div.height();
-
-              // make sure the dom element has a size. otherwise we wouldn't see anything anyway
-              if (!width)
-                return;
-
-              var tooltipGenerator;
-              // stacked charts have a different tooltip
-              if (stacked) {
-                tooltipGenerator = function (d, color, format) {
-                  var html = "<table class='fo-table'><tbody><tr class='fo-title'>"+
-                  "<td align='center' colspan='2' nowrap>Time: "+d[0].toTimeString().substring(0, 8)+"</td></tr>"
-                  d[2].forEach( function (detail) {
-                      html += "<tr class='detail'><td align='right' nowrap>"
-                      + detail.node
-                      + "<div class='fo-table-legend' style='background-color: "+color(detail.node)+"'></div>"
-                      + "</td><td>"+format(detail.val)+"</td></tr>"
-                  })
-                  html += "</tbody></table>"
-                  return html;
-                }
-              } else {
-                tooltipGenerator = function (d, color, format) {
-                  var html = "<table class='fo-table'><tbody><tr class='fo-title'>"+
-                    "<td align='center'>Time</td><td align='center'>Value</td></tr><tr><td>" +
-                        d[0].toTimeString().substring(0, 8) +
-                    "</td><td>" +
-                       format(d[1]) +
-                    "</td></tr></tbody></table>"
-                  return html;
-                }
-              }
-              // create and initialize the chart
-              this.svgchart = self.timeSeriesStackedChart(id, width, height,
-                QDRService.humanify(this.chart.attr()),
-                this.chart.name(),
-                QDRService.nameFromId(this.chart.nodeId()) || '',
-                this.chart.entity(),
-                stacked,
-                this.chart.visibleDuration)
-              .tooltipGenerator(tooltipGenerator);
-            }
-
-            // in case the chart properties have changed, set the new props
-            this.svgchart
-              .attr("type", this.chart.type)
-              .attr("areaColor", this.chart.areaColor)
-              .attr("lineColor", this.chart.lineColor)
-              .attr("url", this.url)
-              .attr("title", this.chart.userTitle);
-
-            // bind the new data and update the chart
-            d3.select('#' + id)         // the div id on the page/dialog
-              .data([this.chartData()])
-              .call(this.svgchart);       // the charting function
-          }
-        },
-
-      timeSeriesStackedChart: function (id, width, height, attrName, name, node, entity, stacked, visibleDuration) {
-        var margin = {top: 20, right: 18, bottom: 10, left: 15}
-        // attrs that can be changed after the chart is created by using
-        // chart.attr(<attrname>, <attrvalue>);
-        var attrs = {
-              attrName: attrName, // like Deliveries to Container. Put at top of chart
-              name: name,         // like router.address/qdrhello  Put at bottom of chart with node
-              node: node,         // put at bottom of chart with name
-              entity: entity,     // like .router.address  Not used atm
-              title: "",          // user title overrides the node and name at the bottom of the chart
-              url: "",            // needed to reference filters and clip because of angular's location service
-              type: "value",      // value or rate
-              areaColor: "",      // can be set for non-stacked charts
-              lineColor: "",      // can be set for non-stacked charts
-              zoom: false,         // should the y-axis range start at 0 or the min data value
-              visibleDuration: visibleDuration
-        }
-        var width = width - margin.left - margin.right,
-          height = height - margin.top - margin.bottom,
-          yAxisTransitionDuration = 0
-
-        var x = d3.time.scale()
-          var y = d3.scale.linear()
-                .rangeRound([height, 0]);
-                // The x-accessor for the path generator; xScale * xValue.
-        var X = function (d) { return x(d[0]) }
-                // The x-accessor for the path generator; yScale * yValue.
-                var Y = function Y(d) { return y(d[1]) }
-
-                var xAxis = d3.svg.axis().scale(x).orient("bottom")
-          .outerTickSize(6)
-          .innerTickSize(-(height-margin.top-margin.bottom))
-                    .tickPadding(2)
-                    .ticks(d3.time.minutes, 2)
-                var yAxis = d3.svg.axis().scale(y).orient("right")
-                    .outerTickSize(8)
-                    .innerTickSize(-(width-margin.left-margin.right))
-                    .tickPadding(10)
-                    .ticks(3)
-                    .tickFormat(function(d) { return formatValue(d)})
-
-        var tooltipGenerator = function (d, color, format) {return ""}; // should be overridden to set an appropriate tooltip
-                var formatValue = d3.format(".2s");
-                var formatPrecise = d3.format(",");
-                var bisectDate = d3.bisector(function(d) { return d[0]; }).left;
-        var line = d3.svg.line();
-
-            var stack = d3.layout.stack()
-                .offset("zero")
-                .values(function (d) { return d.values; })
-                .x(function (d) { return x(d.date); })
-                .y(function (d) { return d.value; });
-
-          var area = d3.svg.area()
-        if (stacked) {
-              area.interpolate("cardinal")
-                .x(function (d) { return x(d.date); })
-                .y0(function (d) { return y(d.y0); })
-                .y1(function (d) { return y(d.y0 + d.y); });
-        } else {
-                    area.interpolate("basis").x(X).y1(Y)
-                    line.x(X).y(Y)
-        }
-        var color = d3.scale.category20();
-
-          var sv = d3.select("#"+id).append("svg")
-                .attr("width",  width  + margin.left + margin.right)
-                .attr("height", height + margin.top  + margin.bottom)
-        var svg = sv
-              .append("g")
-                .attr("transform", "translate(" + margin.left + "," + margin.top + ")");
-
-        sv.append("linearGradient")
-              .attr("id", id) //"temperature-gradient")
-              .attr("gradientUnits", "userSpaceOnUse")
-              .attr("x1", 0).attr("y1", height *.5 )
-              .attr("x2", 0).attr("y2", height * 1.2)
-            .selectAll("stop")
-              .data([
-                {offset: "0%", opacity: 1},
-                {offset: "100%", opacity: 0}
-              ])
-            .enter().append("stop")
-              .attr("offset", function(d) { return d.offset; })
-              .attr("stop-opacity", function(d) { return d.opacity; })
-              .attr("stop-color", function(d) { return "#cbe7f3" });
-/*
-            var clip = svg.append("defs").append("svg:clipPath")
-              .attr("id", "clip")
-              .append("svg:rect")
-              .attr("id", "clip-rect")
-              .attr("x", "0")
-              .attr("y", "0")
-              .attr("width", width)
-              .attr("height", height);
-*/
-        // we want all our areas to appear before the axiis
-        svg.append("g")
-          .attr("class", "section-container")
-
-            svg.append("g")
-                  .attr("class", "x axis")
-
-            svg.append("g")
-                  .attr("class", "y axis")
-
-                svg.append("text").attr("class", "title")
-                        .attr("x", (width / 2) - (margin.left + margin.right) / 2)
-                        .attr("y", 0 - (margin.top / 2))
-                        .attr("text-anchor", "middle")
-                        .text(attrs.attrName);
-
-                svg.append("text").attr("class", "legend")
-                        .attr("x", (width / 2) - (margin.left + margin.right) / 2)
-                        .attr("y", height + (margin.bottom / 2) )
-                        .attr("text-anchor", "middle")
-                        .text(!stacked ? attrs.node + " " + attrs.name : attrs.name);
-
-                var focus = sv.append("g")
-                  .attr("class", "focus")
-                  .style("display", "none");
-
-                focus.append("circle")
-                  .attr("r", 4.5);
-
-                var focusg = focus.append("g");
-                focusg.append("rect")
-                    .attr("class", "mo-guide y")
-                    .attr("width", 1)
-                    .attr("height", height - (margin.top + margin.bottom));
-                focusg.append("rect")
-                    .attr("class", "mo-guide x")
-                    .attr("width", width - (margin.left + margin.right))
-                    .attr("height", 1);
-        focus.append("foreignObject")
-          .attr('class', 'svg-tooltip')
-          .append("xhtml:span");
-/*
-        var transition = d3.select({}).transition()
-            .duration(2000)
-            .ease("linear");
-*/
-                function chart(selection) {
-                    selection.each(function(data) {
-
-          var seriesArr = []
-          if (stacked) {
-            var detailNames = data[0][2].map(function (detail){ return detail.node })
-            var revNames = angular.copy(detailNames).reverse();
-            color.domain(revNames);
-
-                var series = {};
-                detailNames.forEach(function (name) {
-              series[name] = {name: name, values:[]};
-              seriesArr.unshift(series[name]);    // insert at beginning
-                });
-
-                data.forEach(function (d) {
-              detailNames.map(function (name, i) {
-                series[name].values.push({date: d[0], value: d[2][i] ? d[2][i].val : 0});
-              });
-                });
-
-                // this decorates seriesArr with x,y,and y0 properties
-                stack(seriesArr);
-          }
-
-                    var extent = d3.extent(data, function(d) {return d[0];});
-                    //var points = data.length;
-          //var futureDate = new Date(data[points-1][0].getTime() - attrs.visibleDuration * 60 * 1000);
-                    //extent = [futureDate, data[points-1][0]]
-                    x.domain(extent)
-                      .range([0, width - margin.left - margin.right]);
-
-                    // Update the y-scale.
-                    var min = attrs.zoom ? 0 : d3.min(data, function(d) {return d[1]}) *.99;
-                    var max = d3.max(data, function(d) {return d[1]}) * 1.01;
-                    var mean = d3.mean(data, function(d) {return d[1]});
-                    //max = max * 1.01;
-                    var diff = (max - min);
-                    if (diff == 0) {
-                        max = max + 1;
-                        diff = 1;
-                    }
-                    var ratio = mean != 0 ? diff / mean : 1;
-                    if (ratio < .05)
-                        formatValue = d3.format(".3s")
-
-          if (stacked) {
-                      y.domain([min, max])
-                        .range([height - margin.top - margin.bottom, 0]);
-          } else {
-                        y
-                          .domain([min, max])
-                          .range([height - margin.top - margin.bottom, 0]);
-          }
-                        if (attrs.type == "rate") {
-                            area.interpolate("basis");  // rate charts look better smoothed
-                            line.interpolate("basis");
-                        }
-                        else {
-                            area.interpolate("linear"); // don't smooth value charts
-                            line.interpolate("linear");
-                        }
-
-                    // adjust the xaxis based on the range of x values (domain)
-                    var timeSpan = (extent[1] - extent[0]) / (1000 * 60);   // number of minutes
-                    if (timeSpan < 1.5)
-                        xAxis.ticks(d3.time.seconds, 10);
-                    else if (timeSpan < 3)
-                        xAxis.ticks(d3.time.seconds, 30);
-                    else if (timeSpan < 8)
-                        xAxis.ticks(d3.time.minutes, 1);
-                    else
-                        xAxis.ticks(d3.time.minutes, 2);
-
-                    // adjust the number of yaxis ticks based on the range of y values
-                    if (formatValue(min) === formatValue(max))
-                        yAxis.ticks(2);
-
-          var container = svg.select('.section-container');
-          container.selectAll('.series').remove();
-          if (stacked) {
-                      y.domain([Math.min(min, 0), d3.max(seriesArr, function (c) {
-                          return d3.max(c.values, function (d) { return d.y0 + d.y; });
-                        })]);
-
-            // creates a .series g path for each section in the detail
-            // since we don't get more sections this selection is only run once
-                      var series = container.selectAll(".series")
-                        .data(seriesArr)
-
-            series.enter().append("g")
-                          .attr("class", "series")
-                  .append("path")
-              .attr("class", "streamPath")
-              .style("fill", function (d) { return color(d.name); })
-              .style("stroke", "grey");
-
-            series.exit().remove()
-
-            // each time the data is updated, update each section
-            container.selectAll(".series .streamPath").data(seriesArr)
-              .attr("d", function (d) { return area(d.values); })
-          } else {
-                      var series = container.selectAll(".series")
-                        .data([data], function(d) { return d; })
-
-            var g = series.enter().append("g")
-              .attr("class", "series")
-
-                      g.append("path")
-                          .attr("class", "area")
-              .style("fill", "url(" + attrs.url + "#" + id + ") " + attrs.areaColor) //temperature-gradient)")
-                            .attr("d", area.y0(y.range()[0]))
-                            .attr("transform", null);
-
-                      g.append("path")
-                          .attr("class", "line")
-              .style("stroke", attrs.lineColor)
-                            .attr("d", line)
-/*
-debugger;
-            g.transition()
-              .duration(2000)
-                            .attr("transform", "translate(-4)");
-*/
-            series.exit().remove()
-
-            sv.selectAll("stop")
-                  .attr("stop-color", attrs.areaColor)
-
-          }
-                    // Update the x-axis.
-                    svg.select(".x.axis")
-                      .attr("transform", "translate(0," + (height - margin.top - margin.bottom + 1) + ")")
-                      .call(xAxis);
-
-                    svg.select(".y.axis")
-            .transition().duration(yAxisTransitionDuration)  // animate the y axis
-                      .attr("transform", "translate(" + (width - margin.right - margin.left) + ",0)")
-                      .call(yAxis);
-                    yAxisTransitionDuration = 1000  // only do a transition after the chart is 1st drawn
-
-                    // TODO: fix this
-                    // need to recreate this every update... not sure why
-                    var overlay = sv.select(".overlay");
-                    if (!overlay.empty())
-                            overlay.remove();
-                    sv.append("rect")
-                      .attr("class", "overlay")
-                      .attr("width", width)
-                      .attr("height", height)
-                      .on("mouseover", function () {focus.style("display", null)})
-                      .on("mouseout", function () {focus.style("display", "none")})
-                      .on("mousemove", mousemove)
-
-                      function mousemove() {
-                          var x0 = x.invert(d3.mouse(this)[0] - margin.left);
-                          var i = bisectDate(data, x0, 1);
-                          if (i < data.length && i > 0) {
-                              var d0 = data[i - 1];
-                              var d1 = data[i];
-                // set d to the data that is closest to the mouse position
-                              var d = x0 - d0[0] > d1[0] - x0 ? d1 : d0;
-                              focus.attr("transform", "translate(" + (x(d[0]) + margin.left) + "," + (y(d[1]) + margin.top) + ")");
-
-                var tipFormat = formatPrecise;
-                if (attrs.type === "rate")
-                  tipFormat = d3.format(".2n")
-                // set the tooltip html and position it
-                focus.select('.svg-tooltip span')
-                  .html(tooltipGenerator(d, color, tipFormat))
-
-                var foBounds = focus.select('table')[0][0].getBoundingClientRect();
-                              var mx = x(d[0]); // mouse x
-                              var my = y(d[1]); // mouse y
-
-                              // perfer to put the tooltip in the nw corner relative to the focus circle
-                              var foy = -foBounds.height;
-                var fox = -foBounds.width;
-                // off the left side
-                if (mx - foBounds.width - margin.left < 0)
-                  fox = 0;
-                // above the top
-                if (my - foBounds.height - margin.top < 0)
-                  foy = 0;
-                // won't fit above or below, just put it at bottom
-                if (my + foBounds.height > height)
-                  foy = -(foBounds.height - (height - my));
-
-                focus.select('.svg-tooltip')
-                  .attr('x', fox).attr('y', foy);
-
-                // position the guide lines
-                              focus.select(".mo-guide.y")
-                                  .attr("y", -my);
-                              focus.select(".mo-guide.x")
-                                  .attr("x", -mx);
-
-                          } else {
-                              focus.attr("transform", "translate(-10,-10)");
-                          }
-                      }
-
-                    })
-
-
-                }
-        chart.attr = function (attrName, value) {
-          if (arguments.length < 2)
-            return arguments.length == 1 ? attrs[attrName] : chart;
-          if (angular.isDefined(attrs[attrName]))
-            attrs[attrName] = value;
-          return chart;
-        }
-        chart.tooltipGenerator = function (_) {
-          tooltipGenerator = _;
-          return chart;
-        }
-
-        return chart;
-            }
-        }
-        return self;
-  };
-
-  return QDR;
-}(QDR || {}));

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/a5e2307f/console/dispatch-dashboard/dispatch/static/dashboard/dispatch/topology/config-file-header.html
----------------------------------------------------------------------
diff --git a/console/dispatch-dashboard/dispatch/static/dashboard/dispatch/topology/config-file-header.html b/console/dispatch-dashboard/dispatch/static/dashboard/dispatch/topology/config-file-header.html
deleted file mode 100644
index b3cb671..0000000
--- a/console/dispatch-dashboard/dispatch/static/dashboard/dispatch/topology/config-file-header.html
+++ /dev/null
@@ -1,17 +0,0 @@
-## 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
-##

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/a5e2307f/console/dispatch-dashboard/dispatch/static/dashboard/dispatch/topology/download-dialog-template.html
----------------------------------------------------------------------
diff --git a/console/dispatch-dashboard/dispatch/static/dashboard/dispatch/topology/download-dialog-template.html b/console/dispatch-dashboard/dispatch/static/dashboard/dispatch/topology/download-dialog-template.html
deleted file mode 100644
index 9ea8324..0000000
--- a/console/dispatch-dashboard/dispatch/static/dashboard/dispatch/topology/download-dialog-template.html
+++ /dev/null
@@ -1,42 +0,0 @@
-<!--
- 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
--->
-
-<div class="modal-header">
-    <h3 class="modal-title">Configure new router</h3>
-</div>
-<div class="modal-body">
-
-    <label title="Show descriptions and default values in confile files"><input type="checkbox" ng-model="verbose"> Verbose output</label>
-    <div>
-        <button ng-click="download()">Download</button>
-        <button class="btn" zero-clipboard data-clipboard-text="{{output}}" title="Copy to clipboard">
-            <i class="icon-copy"></i>
-        </button> configuration file for {{newRouterName}}
-    </div>
-    <div ng-repeat="part in parts">
-        <button ng-click="downloadPart(part)">Download</button>
-        <button class="btn" zero-clipboard data-clipboard-text="{{part.output}}" title="Copy to clipboard">
-            <i class="icon-copy"></i>
-        </button> connector section for {{part.name}}
-    </div>
-
-</div>
-<div class="modal-footer">
-    <button class="btn btn-primary" type="button" ng-click="done()">Done</button>
-</div>

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/a5e2307f/console/dispatch-dashboard/dispatch/static/dashboard/dispatch/topology/node-config-template.html
----------------------------------------------------------------------
diff --git a/console/dispatch-dashboard/dispatch/static/dashboard/dispatch/topology/node-config-template.html b/console/dispatch-dashboard/dispatch/static/dashboard/dispatch/topology/node-config-template.html
deleted file mode 100644
index 728a101..0000000
--- a/console/dispatch-dashboard/dispatch/static/dashboard/dispatch/topology/node-config-template.html
+++ /dev/null
@@ -1,70 +0,0 @@
-<!--
- 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
--->
-
-<!--
-    This is the template for the node edit dialog that is displayed.
--->
-<div class="modal-header">
-    <h3 class="modal-title">Configure new router</h3>
-</div>
-<div class="modal-body">
-    <form novalidate name="editForm">
-
-        <tabset vertical="true" class="tabs-left">
-            <tab ng-repeat="entity in entities"> <!-- ng-class="{separated: entity.tabName == 'listener0'}" -->
-                <tab-heading>
-                    <i ng-if="entity.icon !== ''" ng-class="entity.icon ? 'ui-icon-arrowthick-1-w' : 'ui-icon-arrowthick-1-e'" class="ui-icon"></i>{{entity.humanName}}
-                </tab-heading>
-                <div class="entity-description">{{entity.description}}</div>
-                <fieldset>
-                    <div ng-mouseenter="showDescription(attribute, $event)" ng-repeat="attribute in entity.attributes">
-                        <label for="{{attribute.name}}">{{attribute.humanName}}</label>
-                        <!-- we can't do <input type="{angular expression}"> because... jquery throws an exception because... -->
-                        <div ng-if="attribute.input == 'input'">
-                            <!-- ng-pattern="testPattern(attribute)" -->
-                            <input ng-if="attribute.type == 'number'" type="number" name="{{attribute.name}}" id="{{attribute.name}}" ng-model="attribute.value" ng-required="attribute.required" class="ui-widget-content ui-corner-all"/>
-                            <input ng-if="attribute.type == 'text'" type="text" name="{{attribute.name}}" id="{{attribute.name}}" ng-model="attribute.value" ng-required="attribute.required" class="ui-widget-content ui-corner-all"/>
-                        </div>
-                        <div ng-if="attribute.input == 'select'">
-                            <select id="{{attribute.name}}" ng-model="attribute.selected" ng-options="item for item in attribute.rawtype"></select>
-                        </div>
-                        <div ng-if="attribute.input == 'boolean'" class="boolean">
-                            <label><input type="radio" ng-model="attribute.value" value="true"> True</label>
-                            <label><input type="radio" ng-model="attribute.value" value="false"> False</label>
-                        </div>
-                    </div>
-                </fieldset>
-                <div class="attr-description">{{attributeDescription}}
-                    <div class="attr-type">{{attributeType}}</div>
-                    <div class="attr-required">{{attributeRequired}}</div>
-                    <div class="attr-unique">{{attributeUnique}}</div>
-                </div>
-                <div class="attr-annotations" ng-repeat="annotation in entity.annotatedBy">
-                    <span>You can also enter the <button ng-click="selectAnnotationTab(annotation)">{{annotation}}</button> values.</span>
-                </div>
-            </tab>
-        </tabset>
-
-
-    </form>
-</div>
-<div class="modal-footer">
-    <button class="btn btn-primary" type="button" ng-click="download()">Download</button>
-    <button class="btn btn-warning" type="button" ng-click="cancel()">Cancel</button>
-</div>


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


[06/11] qpid-dispatch git commit: DISPATCH-1001 Removed the deprecated directories

Posted by ea...@apache.org.
http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/a5e2307f/console/dispatch-dashboard/dispatch/static/dashboard/dispatch/lib/slider.js
----------------------------------------------------------------------
diff --git a/console/dispatch-dashboard/dispatch/static/dashboard/dispatch/lib/slider.js b/console/dispatch-dashboard/dispatch/static/dashboard/dispatch/lib/slider.js
deleted file mode 100644
index 97189ae..0000000
--- a/console/dispatch-dashboard/dispatch/static/dashboard/dispatch/lib/slider.js
+++ /dev/null
@@ -1,233 +0,0 @@
-/*
- jQuery UI Slider plugin wrapper
-*/
-angular.module('ui.slider', []).value('uiSliderConfig',{}).directive('uiSlider', ['uiSliderConfig', '$timeout', function(uiSliderConfig, $timeout) {
-    uiSliderConfig = uiSliderConfig || {};
-    return {
-        require: 'ngModel',
-        compile: function() {
-            var preLink = function (scope, elm, attrs, ngModel) {
-
-                function parseNumber(n, decimals) {
-                    return (decimals) ? parseFloat(n) : parseInt(n, 10);
-                }
-
-                var directiveOptions = angular.copy(scope.$eval(attrs.uiSlider));
-                var options = angular.extend(directiveOptions || {}, uiSliderConfig);
-                // Object holding range values
-                var prevRangeValues = {
-                    min: null,
-                    max: null
-                };
-
-                // convenience properties
-                var properties = ['min', 'max', 'step', 'lowerBound', 'upperBound'];
-                var useDecimals = (!angular.isUndefined(attrs.useDecimals)) ? true : false;
-                var updateOn = (angular.isDefined(options['updateOn'])) ? options['updateOn'] : 'slide'
-
-                var init = function() {
-                    // When ngModel is assigned an array of values then range is expected to be true.
-                    // Warn user and change range to true else an error occurs when trying to drag handle
-                    if (angular.isArray(ngModel.$viewValue) && options.range !== true) {
-                        console.warn('Change your range option of ui-slider. When assigning ngModel an array of values then the range option should be set to true.');
-                        options.range = true;
-                    }
-
-                    // Ensure the convenience properties are passed as options if they're defined
-                    // This avoids init ordering issues where the slider's initial state (eg handle
-                    // position) is calculated using widget defaults
-                    // Note the properties take precedence over any duplicates in options
-                    angular.forEach(properties, function(property) {
-                        if (angular.isDefined(attrs[property])) {
-                            options[property] = parseNumber(attrs[property], useDecimals);
-                        }
-                    });
-
-                    elm.slider(options);
-                    init = angular.noop;
-                };
-
-                // Find out if decimals are to be used for slider
-                angular.forEach(properties, function(property) {
-                    // support {{}} and watch for updates
-                    attrs.$observe(property, function(newVal) {
-                        if (!!newVal) {
-                            init();
-                            options[property] = parseNumber(newVal, useDecimals);
-                            elm.slider('option', property, parseNumber(newVal, useDecimals));
-                            ngModel.$render();
-                        }
-                    });
-                });
-                attrs.$observe('disabled', function(newVal) {
-                    init();
-                    elm.slider('option', 'disabled', !!newVal);
-                });
-
-                // Watch ui-slider (byVal) for changes and update
-                scope.$watch(attrs.uiSlider, function(newVal) {
-                    init();
-                    if(newVal !== undefined) {
-                      elm.slider('option', newVal);
-                    }
-                }, true);
-
-                // Late-bind to prevent compiler clobbering
-                $timeout(init, 0, true);
-
-                // Update model value from slider
-                elm.bind(updateOn, function(event, ui) {
-                    var valuesChanged;
-
-                    if (ui.values) {
-                        var boundedValues = ui.values.slice();
-
-                        if (options.lowerBound && boundedValues[0] < options.lowerBound) {
-                            boundedValues[0] = Math.max(boundedValues[0], options.lowerBound);
-                        }
-                        if (options.upperBound && boundedValues[1] > options.upperBound) {
-                            boundedValues[1] = Math.min(boundedValues[1], options.upperBound);
-                        }
-
-                        if (boundedValues[0] !== ui.values[0] || boundedValues[1] !== ui.values[1]) {
-                            valuesChanged = true;
-                            ui.values = boundedValues;
-                        }
-                    } else {
-                        var boundedValue = ui.value;
-
-                        if (options.lowerBound && boundedValue < options.lowerBound) {
-                            boundedValue = Math.max(boundedValue, options.lowerBound);
-                        }
-                        if (options.upperBound && boundedValue > options.upperBound) {
-                            boundedValue = Math.min(boundedValue, options.upperBound);
-                        }
-
-                        if (boundedValue !== ui.value) {
-                            valuesChanged = true;
-                            ui.value = boundedValue;
-                        }
-                    }
-
-
-                    ngModel.$setViewValue(ui.values || ui.value);
-                    $(ui.handle).find('.ui-slider-tip').text(ui.value);
-                    scope.$apply();
-
-                    if (valuesChanged) {
-                        setTimeout(function() {
-                            elm.slider('value', ui.values || ui.value);
-                        }, 0);
-
-                        return false;
-                    }
-                });
-
-                // Update slider from model value
-                ngModel.$render = function() {
-                    init();
-                    var method = options.range === true ? 'values' : 'value';
-
-                    if (options.range !== true && isNaN(ngModel.$viewValue) && !(ngModel.$viewValue instanceof Array)) {
-                        ngModel.$viewValue = 0;
-                    }
-                    else if (options.range && !angular.isDefined(ngModel.$viewValue)) {
-                            ngModel.$viewValue = [0,0];
-                    }
-
-                    // Do some sanity check of range values
-                    if (options.range === true) {
-                        // previously, the model was a string b/c it was in a text input, need to convert to a array.
-                        // make sure input exists, comma exists once, and it is a string.
-                        if (ngModel.$viewValue && angular.isString(ngModel.$viewValue) && (ngModel.$viewValue.match(/,/g) || []).length === 1) {
-                            // transform string model into array.
-                            var valueArr = ngModel.$viewValue.split(',');
-                            ngModel.$viewValue = [Number(valueArr[0]), Number(valueArr[1])];
-                        }
-                        // Check outer bounds for min and max values
-                        if (angular.isDefined(options.min) && options.min > ngModel.$viewValue[0]) {
-                            ngModel.$viewValue[0] = options.min;
-                        }
-                        if (angular.isDefined(options.max) && options.max < ngModel.$viewValue[1]) {
-                            ngModel.$viewValue[1] = options.max;
-                        }
-
-                        // Check min and max range values
-                        if (ngModel.$viewValue[0] > ngModel.$viewValue[1]) {
-                            // Min value should be less to equal to max value
-                            if (prevRangeValues.min >= ngModel.$viewValue[1]) {
-                                ngModel.$viewValue[1] = prevRangeValues.min;
-                            }
-                            // Max value should be less to equal to min value
-                            if (prevRangeValues.max <= ngModel.$viewValue[0]) {
-                                ngModel.$viewValue[0] = prevRangeValues.max;
-                            }
-                        }
-
-                        // Store values for later user
-                        prevRangeValues.min = ngModel.$viewValue[0];
-                        prevRangeValues.max = ngModel.$viewValue[1];
-
-                    }
-                    elm.slider(method, ngModel.$viewValue);
-                };
-
-                scope.$watch(attrs.ngModel, function() {
-                    if (options.range === true) {
-                        ngModel.$render();
-
-                        $(elm).find('.ui-slider-tip').each(function(i, tipElm) {
-                            $(tipElm).text(ngModel.$viewValue[i]);
-                        });
-                    } else {
-                        $(elm).find('.ui-slider-tip').text(ngModel.$viewValue);
-                    }
-                }, true);
-
-                function destroy() {
-                    if (elm.hasClass('ui-slider')) {
-                        elm.slider('destroy');
-                    }
-                }
-
-                scope.$on("$destroy", destroy);
-                elm.one('$destroy', destroy);
-            };
-
-            var postLink = function (scope, element, attrs, ngModel) {
-                // Add tick marks if 'tick' and 'step' attributes have been setted on element.
-                // Support horizontal slider bar so far. 'tick' and 'step' attributes are required.
-                var options = angular.extend({}, scope.$eval(attrs.uiSlider));
-                var properties = ['min', 'max', 'step', 'tick', 'tip'];
-                angular.forEach(properties, function(property) {
-                    if (angular.isDefined(attrs[property])) {
-                        options[property] = attrs[property];
-                    }
-                });
-                if (angular.isDefined(options['tick']) && angular.isDefined(options['step'])) {
-                    var total = parseInt( (parseInt(options['max']) - parseInt(options['min'])) /parseInt(options['step']));
-                    for (var i = total; i >= 0; i--) {
-                        var left = ((i / total) * 100) + '%';
-                        $("<div/>").addClass("ui-slider-tick").appendTo(element).css({left: left});
-                    };
-                }
-                if(angular.isDefined(options['tip'])) {
-                    $timeout(function(){
-                        var handles = element.find('.ui-slider-handle');
-                        if(handles && handles.length>1 && ngModel.$viewValue && angular.isArray(ngModel.$viewValue)){
-                            $(handles[0]).append('<div class="ui-slider-tip">'+ngModel.$viewValue[0]+'</div>');
-                            $(handles[1]).append('<div class="ui-slider-tip">'+ngModel.$viewValue[1]+'</div>');
-                        }else{
-                            element.find('.ui-slider-handle').append('<div class="ui-slider-tip">'+ngModel.$viewValue+'</div>');
-                        }
-                    },10);
-                }
-            }
-
-            return {
-                pre: preLink,
-                post: postLink
-            };
-        }
-    };
-}]);


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


[05/11] qpid-dispatch git commit: DISPATCH-1001 Removed the deprecated directories

Posted by ea...@apache.org.
http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/a5e2307f/console/dispatch-dashboard/dispatch/static/dashboard/dispatch/lib/ui-grid.js
----------------------------------------------------------------------
diff --git a/console/dispatch-dashboard/dispatch/static/dashboard/dispatch/lib/ui-grid.js b/console/dispatch-dashboard/dispatch/static/dashboard/dispatch/lib/ui-grid.js
deleted file mode 100644
index 545ef70..0000000
--- a/console/dispatch-dashboard/dispatch/static/dashboard/dispatch/lib/ui-grid.js
+++ /dev/null
@@ -1,28540 +0,0 @@
-/*!
- * ui-grid - v3.2.9 - 2016-09-21
- * Copyright (c) 2016 ; License: MIT 
- */
-
-(function () {
-  'use strict';
-  angular.module('ui.grid.i18n', []);
-  angular.module('ui.grid', ['ui.grid.i18n']);
-})();
-(function () {
-  'use strict';
-
-  /**
-   * @ngdoc object
-   * @name ui.grid.service:uiGridConstants
-   * @description Constants for use across many grid features
-   *
-   */
-
-
-  angular.module('ui.grid').constant('uiGridConstants', {
-    LOG_DEBUG_MESSAGES: true,
-    LOG_WARN_MESSAGES: true,
-    LOG_ERROR_MESSAGES: true,
-    CUSTOM_FILTERS: /CUSTOM_FILTERS/g,
-    COL_FIELD: /COL_FIELD/g,
-    MODEL_COL_FIELD: /MODEL_COL_FIELD/g,
-    TOOLTIP: /title=\"TOOLTIP\"/g,
-    DISPLAY_CELL_TEMPLATE: /DISPLAY_CELL_TEMPLATE/g,
-    TEMPLATE_REGEXP: /<.+>/,
-    FUNC_REGEXP: /(\([^)]*\))?$/,
-    DOT_REGEXP: /\./g,
-    APOS_REGEXP: /'/g,
-    BRACKET_REGEXP: /^(.*)((?:\s*\[\s*\d+\s*\]\s*)|(?:\s*\[\s*"(?:[^"\\]|\\.)*"\s*\]\s*)|(?:\s*\[\s*'(?:[^'\\]|\\.)*'\s*\]\s*))(.*)$/,
-    COL_CLASS_PREFIX: 'ui-grid-col',
-    ENTITY_BINDING: '$$this',
-    events: {
-      GRID_SCROLL: 'uiGridScroll',
-      COLUMN_MENU_SHOWN: 'uiGridColMenuShown',
-      ITEM_DRAGGING: 'uiGridItemDragStart', // For any item being dragged
-      COLUMN_HEADER_CLICK: 'uiGridColumnHeaderClick'
-    },
-    // copied from http://www.lsauer.com/2011/08/javascript-keymap-keycodes-in-json.html
-    keymap: {
-      TAB: 9,
-      STRG: 17,
-      CAPSLOCK: 20,
-      CTRL: 17,
-      CTRLRIGHT: 18,
-      CTRLR: 18,
-      SHIFT: 16,
-      RETURN: 13,
-      ENTER: 13,
-      BACKSPACE: 8,
-      BCKSP: 8,
-      ALT: 18,
-      ALTR: 17,
-      ALTRIGHT: 17,
-      SPACE: 32,
-      WIN: 91,
-      MAC: 91,
-      FN: null,
-      PG_UP: 33,
-      PG_DOWN: 34,
-      UP: 38,
-      DOWN: 40,
-      LEFT: 37,
-      RIGHT: 39,
-      ESC: 27,
-      DEL: 46,
-      F1: 112,
-      F2: 113,
-      F3: 114,
-      F4: 115,
-      F5: 116,
-      F6: 117,
-      F7: 118,
-      F8: 119,
-      F9: 120,
-      F10: 121,
-      F11: 122,
-      F12: 123
-    },
-     /**
-     * @ngdoc object
-     * @name ASC
-     * @propertyOf ui.grid.service:uiGridConstants
-     * @description Used in {@link ui.grid.class:GridOptions.columnDef#properties_sort columnDef.sort} and
-     * {@link ui.grid.class:GridOptions.columnDef#properties_sortDirectionCycle columnDef.sortDirectionCycle}
-     * to configure the sorting direction of the column
-     */
-    ASC: 'asc',
-     /**
-     * @ngdoc object
-     * @name DESC
-     * @propertyOf ui.grid.service:uiGridConstants
-     * @description Used in {@link ui.grid.class:GridOptions.columnDef#properties_sort columnDef.sort} and
-     * {@link ui.grid.class:GridOptions.columnDef#properties_sortDirectionCycle columnDef.sortDirectionCycle}
-     * to configure the sorting direction of the column
-     */
-    DESC: 'desc',
-
-
-     /**
-     * @ngdoc object
-     * @name filter
-     * @propertyOf ui.grid.service:uiGridConstants
-     * @description Used in {@link ui.grid.class:GridOptions.columnDef#properties_filter columnDef.filter}
-     * to configure filtering on the column
-     *
-     * `SELECT` and `INPUT` are used with the `type` property of the filter, the rest are used to specify
-     * one of the built-in conditions.
-     *
-     * Available `condition` options are:
-     * - `uiGridConstants.filter.STARTS_WITH`
-     * - `uiGridConstants.filter.ENDS_WITH`
-     * - `uiGridConstants.filter.CONTAINS`
-     * - `uiGridConstants.filter.GREATER_THAN`
-     * - `uiGridConstants.filter.GREATER_THAN_OR_EQUAL`
-     * - `uiGridConstants.filter.LESS_THAN`
-     * - `uiGridConstants.filter.LESS_THAN_OR_EQUAL`
-     * - `uiGridConstants.filter.NOT_EQUAL`
-     * - `uiGridConstants.filter.STARTS_WITH`
-     *
-     *
-     * Available `type` options are:
-     * - `uiGridConstants.filter.SELECT` - use a dropdown box for the cell header filter field
-     * - `uiGridConstants.filter.INPUT` - use a text box for the cell header filter field
-     */
-    filter: {
-      STARTS_WITH: 2,
-      ENDS_WITH: 4,
-      EXACT: 8,
-      CONTAINS: 16,
-      GREATER_THAN: 32,
-      GREATER_THAN_OR_EQUAL: 64,
-      LESS_THAN: 128,
-      LESS_THAN_OR_EQUAL: 256,
-      NOT_EQUAL: 512,
-      SELECT: 'select',
-      INPUT: 'input'
-    },
-
-    /**
-     * @ngdoc object
-     * @name aggregationTypes
-     * @propertyOf ui.grid.service:uiGridConstants
-     * @description Used in {@link ui.grid.class:GridOptions.columnDef#properties_aggregationType columnDef.aggregationType}
-     * to specify the type of built-in aggregation the column should use.
-     *
-     * Available options are:
-     * - `uiGridConstants.aggregationTypes.sum` - add the values in this column to produce the aggregated value
-     * - `uiGridConstants.aggregationTypes.count` - count the number of rows to produce the aggregated value
-     * - `uiGridConstants.aggregationTypes.avg` - average the values in this column to produce the aggregated value
-     * - `uiGridConstants.aggregationTypes.min` - use the minimum value in this column as the aggregated value
-     * - `uiGridConstants.aggregationTypes.max` - use the maximum value in this column as the aggregated value
-     */
-    aggregationTypes: {
-      sum: 2,
-      count: 4,
-      avg: 8,
-      min: 16,
-      max: 32
-    },
-
-    // TODO(c0bra): Create full list of these somehow. NOTE: do any allow a space before or after them?
-    CURRENCY_SYMBOLS: ['ƒ', '$', '£', '$', '¤', '¥', '៛', '₩', '₱', '฿', '₫'],
-
-    /**
-     * @ngdoc object
-     * @name scrollDirection
-     * @propertyOf ui.grid.service:uiGridConstants
-     * @description Set on {@link ui.grid.class:Grid#properties_scrollDirection Grid.scrollDirection},
-     * to indicate the direction the grid is currently scrolling in
-     *
-     * Available options are:
-     * - `uiGridConstants.scrollDirection.UP` - set when the grid is scrolling up
-     * - `uiGridConstants.scrollDirection.DOWN` - set when the grid is scrolling down
-     * - `uiGridConstants.scrollDirection.LEFT` - set when the grid is scrolling left
-     * - `uiGridConstants.scrollDirection.RIGHT` - set when the grid is scrolling right
-     * - `uiGridConstants.scrollDirection.NONE` - set when the grid is not scrolling, this is the default
-     */
-    scrollDirection: {
-      UP: 'up',
-      DOWN: 'down',
-      LEFT: 'left',
-      RIGHT: 'right',
-      NONE: 'none'
-
-    },
-
-    /**
-     * @ngdoc object
-     * @name dataChange
-     * @propertyOf ui.grid.service:uiGridConstants
-     * @description Used with {@link ui.grid.core.api:PublicApi#methods_notifyDataChange PublicApi.notifyDataChange},
-     * {@link ui.grid.class:Grid#methods_callDataChangeCallbacks Grid.callDataChangeCallbacks},
-     * and {@link ui.grid.class:Grid#methods_registerDataChangeCallback Grid.registerDataChangeCallback}
-     * to specify the type of the event(s).
-     *
-     * Available options are:
-     * - `uiGridConstants.dataChange.ALL` - listeners fired on any of these events, fires listeners on all events.
-     * - `uiGridConstants.dataChange.EDIT` - fired when the data in a cell is edited
-     * - `uiGridConstants.dataChange.ROW` - fired when a row is added or removed
-     * - `uiGridConstants.dataChange.COLUMN` - fired when the column definitions are modified
-     * - `uiGridConstants.dataChange.OPTIONS` - fired when the grid options are modified
-     */
-    dataChange: {
-      ALL: 'all',
-      EDIT: 'edit',
-      ROW: 'row',
-      COLUMN: 'column',
-      OPTIONS: 'options'
-    },
-
-    /**
-     * @ngdoc object
-     * @name scrollbars
-     * @propertyOf ui.grid.service:uiGridConstants
-     * @description Used with {@link ui.grid.class:GridOptions#properties_enableHorizontalScrollbar GridOptions.enableHorizontalScrollbar}
-     * and {@link ui.grid.class:GridOptions#properties_enableVerticalScrollbar GridOptions.enableVerticalScrollbar}
-     * to specify the scrollbar policy for that direction.
-     *
-     * Available options are:
-     * - `uiGridConstants.scrollbars.NEVER` - never show scrollbars in this direction
-     * - `uiGridConstants.scrollbars.ALWAYS` - always show scrollbars in this direction
-     */
-
-    scrollbars: {
-      NEVER: 0,
-      ALWAYS: 1
-      //WHEN_NEEDED: 2
-    }
-  });
-
-})();
-
-angular.module('ui.grid').directive('uiGridCell', ['$compile', '$parse', 'gridUtil', 'uiGridConstants', function ($compile, $parse, gridUtil, uiGridConstants) {
-  var uiGridCell = {
-    priority: 0,
-    scope: false,
-    require: '?^uiGrid',
-    compile: function() {
-      return {
-        pre: function($scope, $elm, $attrs, uiGridCtrl) {
-          function compileTemplate() {
-            var compiledElementFn = $scope.col.compiledElementFn;
-
-            compiledElementFn($scope, function(clonedElement, scope) {
-              $elm.append(clonedElement);
-            });
-          }
-
-          // If the grid controller is present, use it to get the compiled cell template function
-          if (uiGridCtrl && $scope.col.compiledElementFn) {
-             compileTemplate();
-          }
-          // No controller, compile the element manually (for unit tests)
-          else {
-            if ( uiGridCtrl && !$scope.col.compiledElementFn ){
-              // gridUtil.logError('Render has been called before precompile.  Please log a ui-grid issue');  
-
-              $scope.col.getCompiledElementFn()
-                .then(function (compiledElementFn) {
-                  compiledElementFn($scope, function(clonedElement, scope) {
-                    $elm.append(clonedElement);
-                  });
-                });
-            }
-            else {
-              var html = $scope.col.cellTemplate
-                .replace(uiGridConstants.MODEL_COL_FIELD, 'row.entity.' + gridUtil.preEval($scope.col.field))
-                .replace(uiGridConstants.COL_FIELD, 'grid.getCellValue(row, col)');
-
-              var cellElement = $compile(html)($scope);
-              $elm.append(cellElement);
-            }
-          }
-        },
-        post: function($scope, $elm, $attrs, uiGridCtrl) {
-          var initColClass = $scope.col.getColClass(false);
-          $elm.addClass(initColClass);
-
-          var classAdded;
-          var updateClass = function( grid ){
-            var contents = $elm;
-            if ( classAdded ){
-              contents.removeClass( classAdded );
-              classAdded = null;
-            }
-
-            if (angular.isFunction($scope.col.cellClass)) {
-              classAdded = $scope.col.cellClass($scope.grid, $scope.row, $scope.col, $scope.rowRenderIndex, $scope.colRenderIndex);
-            }
-            else {
-              classAdded = $scope.col.cellClass;
-            }
-            contents.addClass(classAdded);
-          };
-
-          if ($scope.col.cellClass) {
-            updateClass();
-          }
-          
-          // Register a data change watch that would get triggered whenever someone edits a cell or modifies column defs
-          var dataChangeDereg = $scope.grid.registerDataChangeCallback( updateClass, [uiGridConstants.dataChange.COLUMN, uiGridConstants.dataChange.EDIT]);
-          
-          // watch the col and row to see if they change - which would indicate that we've scrolled or sorted or otherwise
-          // changed the row/col that this cell relates to, and we need to re-evaluate cell classes and maybe other things
-          var cellChangeFunction = function( n, o ){
-            if ( n !== o ) {
-              if ( classAdded || $scope.col.cellClass ){
-                updateClass();
-              }
-
-              // See if the column's internal class has changed
-              var newColClass = $scope.col.getColClass(false);
-              if (newColClass !== initColClass) {
-                $elm.removeClass(initColClass);
-                $elm.addClass(newColClass);
-                initColClass = newColClass;
-              }
-            }
-          };
-
-          // TODO(c0bra): Turn this into a deep array watch
-/*        shouldn't be needed any more given track by col.name
-          var colWatchDereg = $scope.$watch( 'col', cellChangeFunction );
-*/
-          var rowWatchDereg = $scope.$watch( 'row', cellChangeFunction );
-          
-          
-          var deregisterFunction = function() {
-            dataChangeDereg();
-//            colWatchDereg();
-            rowWatchDereg(); 
-          };
-          
-          $scope.$on( '$destroy', deregisterFunction );
-          $elm.on( '$destroy', deregisterFunction );
-        }
-      };
-    }
-  };
-
-  return uiGridCell;
-}]);
-
-
-(function(){
-
-angular.module('ui.grid')
-.service('uiGridColumnMenuService', [ 'i18nService', 'uiGridConstants', 'gridUtil',
-function ( i18nService, uiGridConstants, gridUtil ) {
-/**
- *  @ngdoc service
- *  @name ui.grid.service:uiGridColumnMenuService
- *
- *  @description Services for working with column menus, factored out
- *  to make the code easier to understand
- */
-
-  var service = {
-    /**
-     * @ngdoc method
-     * @methodOf ui.grid.service:uiGridColumnMenuService
-     * @name initialize
-     * @description  Sets defaults, puts a reference to the $scope on
-     * the uiGridController
-     * @param {$scope} $scope the $scope from the uiGridColumnMenu
-     * @param {controller} uiGridCtrl the uiGridController for the grid
-     * we're on
-     *
-     */
-    initialize: function( $scope, uiGridCtrl ){
-      $scope.grid = uiGridCtrl.grid;
-
-      // Store a reference to this link/controller in the main uiGrid controller
-      // to allow showMenu later
-      uiGridCtrl.columnMenuScope = $scope;
-
-      // Save whether we're shown or not so the columns can check
-      $scope.menuShown = false;
-    },
-
-
-    /**
-     * @ngdoc method
-     * @methodOf ui.grid.service:uiGridColumnMenuService
-     * @name setColMenuItemWatch
-     * @description  Setup a watch on $scope.col.menuItems, and update
-     * menuItems based on this.  $scope.col needs to be set by the column
-     * before calling the menu.
-     * @param {$scope} $scope the $scope from the uiGridColumnMenu
-     * @param {controller} uiGridCtrl the uiGridController for the grid
-     * we're on
-     *
-     */
-    setColMenuItemWatch: function ( $scope ){
-      var deregFunction = $scope.$watch('col.menuItems', function (n) {
-        if (typeof(n) !== 'undefined' && n && angular.isArray(n)) {
-          n.forEach(function (item) {
-            if (typeof(item.context) === 'undefined' || !item.context) {
-              item.context = {};
-            }
-            item.context.col = $scope.col;
-          });
-
-          $scope.menuItems = $scope.defaultMenuItems.concat(n);
-        }
-        else {
-          $scope.menuItems = $scope.defaultMenuItems;
-        }
-      });
-
-      $scope.$on( '$destroy', deregFunction );
-    },
-
-
-    /**
-     * @ngdoc boolean
-     * @name enableSorting
-     * @propertyOf ui.grid.class:GridOptions.columnDef
-     * @description (optional) True by default. When enabled, this setting adds sort
-     * widgets to the column header, allowing sorting of the data in the individual column.
-     */
-    /**
-     * @ngdoc method
-     * @methodOf ui.grid.service:uiGridColumnMenuService
-     * @name sortable
-     * @description  determines whether this column is sortable
-     * @param {$scope} $scope the $scope from the uiGridColumnMenu
-     *
-     */
-    sortable: function( $scope ) {
-      if ( $scope.grid.options.enableSorting && typeof($scope.col) !== 'undefined' && $scope.col && $scope.col.enableSorting) {
-        return true;
-      }
-      else {
-        return false;
-      }
-    },
-
-    /**
-     * @ngdoc method
-     * @methodOf ui.grid.service:uiGridColumnMenuService
-     * @name isActiveSort
-     * @description  determines whether the requested sort direction is current active, to
-     * allow highlighting in the menu
-     * @param {$scope} $scope the $scope from the uiGridColumnMenu
-     * @param {string} direction the direction that we'd have selected for us to be active
-     *
-     */
-    isActiveSort: function( $scope, direction ){
-      return (typeof($scope.col) !== 'undefined' && typeof($scope.col.sort) !== 'undefined' &&
-              typeof($scope.col.sort.direction) !== 'undefined' && $scope.col.sort.direction === direction);
-
-    },
-
-    /**
-     * @ngdoc method
-     * @methodOf ui.grid.service:uiGridColumnMenuService
-     * @name suppressRemoveSort
-     * @description  determines whether we should suppress the removeSort option
-     * @param {$scope} $scope the $scope from the uiGridColumnMenu
-     *
-     */
-    suppressRemoveSort: function( $scope ) {
-      if ($scope.col && $scope.col.suppressRemoveSort) {
-        return true;
-      }
-      else {
-        return false;
-      }
-    },
-
-
-    /**
-     * @ngdoc boolean
-     * @name enableHiding
-     * @propertyOf ui.grid.class:GridOptions.columnDef
-     * @description (optional) True by default. When set to false, this setting prevents a user from hiding the column
-     * using the column menu or the grid menu.
-     */
-    /**
-     * @ngdoc method
-     * @methodOf ui.grid.service:uiGridColumnMenuService
-     * @name hideable
-     * @description  determines whether a column can be hidden, by checking the enableHiding columnDef option
-     * @param {$scope} $scope the $scope from the uiGridColumnMenu
-     *
-     */
-    hideable: function( $scope ) {
-      if (typeof($scope.col) !== 'undefined' && $scope.col && $scope.col.colDef && $scope.col.colDef.enableHiding === false ) {
-        return false;
-      }
-      else {
-        return true;
-      }
-    },
-
-
-    /**
-     * @ngdoc method
-     * @methodOf ui.grid.service:uiGridColumnMenuService
-     * @name getDefaultMenuItems
-     * @description  returns the default menu items for a column menu
-     * @param {$scope} $scope the $scope from the uiGridColumnMenu
-     *
-     */
-    getDefaultMenuItems: function( $scope ){
-      return [
-        {
-          title: i18nService.getSafeText('sort.ascending'),
-          icon: 'ui-grid-icon-sort-alt-up',
-          action: function($event) {
-            $event.stopPropagation();
-            $scope.sortColumn($event, uiGridConstants.ASC);
-          },
-          shown: function () {
-            return service.sortable( $scope );
-          },
-          active: function() {
-            return service.isActiveSort( $scope, uiGridConstants.ASC);
-          }
-        },
-        {
-          title: i18nService.getSafeText('sort.descending'),
-          icon: 'ui-grid-icon-sort-alt-down',
-          action: function($event) {
-            $event.stopPropagation();
-            $scope.sortColumn($event, uiGridConstants.DESC);
-          },
-          shown: function() {
-            return service.sortable( $scope );
-          },
-          active: function() {
-            return service.isActiveSort( $scope, uiGridConstants.DESC);
-          }
-        },
-        {
-          title: i18nService.getSafeText('sort.remove'),
-          icon: 'ui-grid-icon-cancel',
-          action: function ($event) {
-            $event.stopPropagation();
-            $scope.unsortColumn();
-          },
-          shown: function() {
-            return service.sortable( $scope ) &&
-                   typeof($scope.col) !== 'undefined' && (typeof($scope.col.sort) !== 'undefined' &&
-                   typeof($scope.col.sort.direction) !== 'undefined') && $scope.col.sort.direction !== null &&
-                  !service.suppressRemoveSort( $scope );
-          }
-        },
-        {
-          title: i18nService.getSafeText('column.hide'),
-          icon: 'ui-grid-icon-cancel',
-          shown: function() {
-            return service.hideable( $scope );
-          },
-          action: function ($event) {
-            $event.stopPropagation();
-            $scope.hideColumn();
-          }
-        }
-      ];
-    },
-
-
-    /**
-     * @ngdoc method
-     * @methodOf ui.grid.service:uiGridColumnMenuService
-     * @name getColumnElementPosition
-     * @description  gets the position information needed to place the column
-     * menu below the column header
-     * @param {$scope} $scope the $scope from the uiGridColumnMenu
-     * @param {GridCol} column the column we want to position below
-     * @param {element} $columnElement the column element we want to position below
-     * @returns {hash} containing left, top, offset, height, width
-     *
-     */
-    getColumnElementPosition: function( $scope, column, $columnElement ){
-      var positionData = {};
-      positionData.left = $columnElement[0].offsetLeft;
-      positionData.top = $columnElement[0].offsetTop;
-      positionData.parentLeft = $columnElement[0].offsetParent.offsetLeft;
-
-      // Get the grid scrollLeft
-      positionData.offset = 0;
-      if (column.grid.options.offsetLeft) {
-        positionData.offset = column.grid.options.offsetLeft;
-      }
-
-      positionData.height = gridUtil.elementHeight($columnElement, true);
-      positionData.width = gridUtil.elementWidth($columnElement, true);
-
-      return positionData;
-    },
-
-
-    /**
-     * @ngdoc method
-     * @methodOf ui.grid.service:uiGridColumnMenuService
-     * @name repositionMenu
-     * @description  Reposition the menu below the new column.  If the menu has no child nodes
-     * (i.e. it's not currently visible) then we guess it's width at 100, we'll be called again
-     * later to fix it
-     * @param {$scope} $scope the $scope from the uiGridColumnMenu
-     * @param {GridCol} column the column we want to position below
-     * @param {hash} positionData a hash containing left, top, offset, height, width
-     * @param {element} $elm the column menu element that we want to reposition
-     * @param {element} $columnElement the column element that we want to reposition underneath
-     *
-     */
-    repositionMenu: function( $scope, column, positionData, $elm, $columnElement ) {
-      var menu = $elm[0].querySelectorAll('.ui-grid-menu');
-
-      // It's possible that the render container of the column we're attaching to is
-      // offset from the grid (i.e. pinned containers), we need to get the difference in the offsetLeft
-      // between the render container and the grid
-      var renderContainerElm = gridUtil.closestElm($columnElement, '.ui-grid-render-container');
-      var renderContainerOffset = renderContainerElm.getBoundingClientRect().left - $scope.grid.element[0].getBoundingClientRect().left;
-
-      var containerScrollLeft = renderContainerElm.querySelectorAll('.ui-grid-viewport')[0].scrollLeft;
-
-      // default value the last width for _this_ column, otherwise last width for _any_ column, otherwise default to 170
-      var myWidth = column.lastMenuWidth ? column.lastMenuWidth : ( $scope.lastMenuWidth ? $scope.lastMenuWidth : 170);
-      var paddingRight = column.lastMenuPaddingRight ? column.lastMenuPaddingRight : ( $scope.lastMenuPaddingRight ? $scope.lastMenuPaddingRight : 10);
-
-      if ( menu.length !== 0 ){
-        var mid = menu[0].querySelectorAll('.ui-grid-menu-mid');
-        if ( mid.length !== 0 && !angular.element(mid).hasClass('ng-hide') ) {
-          myWidth = gridUtil.elementWidth(menu, true);
-          $scope.lastMenuWidth = myWidth;
-          column.lastMenuWidth = myWidth;
-
-          // TODO(c0bra): use padding-left/padding-right based on document direction (ltr/rtl), place menu on proper side
-          // Get the column menu right padding
-          paddingRight = parseInt(gridUtil.getStyles(angular.element(menu)[0])['paddingRight'], 10);
-          $scope.lastMenuPaddingRight = paddingRight;
-          column.lastMenuPaddingRight = paddingRight;
-        }
-      }
-
-      var left = positionData.left + renderContainerOffset - containerScrollLeft + positionData.parentLeft + positionData.width - myWidth + paddingRight;
-      if (left < positionData.offset){
-        left = positionData.offset;
-      }
-
-      $elm.css('left', left + 'px');
-      $elm.css('top', (positionData.top + positionData.height) + 'px');
-    }
-
-  };
-
-  return service;
-}])
-
-
-.directive('uiGridColumnMenu', ['$timeout', 'gridUtil', 'uiGridConstants', 'uiGridColumnMenuService', '$document',
-function ($timeout, gridUtil, uiGridConstants, uiGridColumnMenuService, $document) {
-/**
- * @ngdoc directive
- * @name ui.grid.directive:uiGridColumnMenu
- * @description  Provides the column menu framework, leverages uiGridMenu underneath
- *
- */
-
-  var uiGridColumnMenu = {
-    priority: 0,
-    scope: true,
-    require: '^uiGrid',
-    templateUrl: 'ui-grid/uiGridColumnMenu',
-    replace: true,
-    link: function ($scope, $elm, $attrs, uiGridCtrl) {
-      uiGridColumnMenuService.initialize( $scope, uiGridCtrl );
-
-      $scope.defaultMenuItems = uiGridColumnMenuService.getDefaultMenuItems( $scope );
-
-      // Set the menu items for use with the column menu. The user can later add additional items via the watch
-      $scope.menuItems = $scope.defaultMenuItems;
-      uiGridColumnMenuService.setColMenuItemWatch( $scope );
-
-
-      /**
-       * @ngdoc method
-       * @methodOf ui.grid.directive:uiGridColumnMenu
-       * @name showMenu
-       * @description Shows the column menu.  If the menu is already displayed it
-       * calls the menu to ask it to hide (it will animate), then it repositions the menu
-       * to the right place whilst hidden (it will make an assumption on menu width),
-       * then it asks the menu to show (it will animate), then it repositions the menu again
-       * once we can calculate it's size.
-       * @param {GridCol} column the column we want to position below
-       * @param {element} $columnElement the column element we want to position below
-       */
-      $scope.showMenu = function(column, $columnElement, event) {
-        // Swap to this column
-        $scope.col = column;
-
-        // Get the position information for the column element
-        var colElementPosition = uiGridColumnMenuService.getColumnElementPosition( $scope, column, $columnElement );
-
-        if ($scope.menuShown) {
-          // we want to hide, then reposition, then show, but we want to wait for animations
-          // we set a variable, and then rely on the menu-hidden event to call the reposition and show
-          $scope.colElement = $columnElement;
-          $scope.colElementPosition = colElementPosition;
-          $scope.hideThenShow = true;
-
-          $scope.$broadcast('hide-menu', { originalEvent: event });
-        } else {
-          $scope.menuShown = true;
-          uiGridColumnMenuService.repositionMenu( $scope, column, colElementPosition, $elm, $columnElement );
-
-          $scope.colElement = $columnElement;
-          $scope.colElementPosition = colElementPosition;
-          $scope.$broadcast('show-menu', { originalEvent: event });
-
-        }
-      };
-
-
-      /**
-       * @ngdoc method
-       * @methodOf ui.grid.directive:uiGridColumnMenu
-       * @name hideMenu
-       * @description Hides the column menu.
-       * @param {boolean} broadcastTrigger true if we were triggered by a broadcast
-       * from the menu itself - in which case don't broadcast again as we'll get
-       * an infinite loop
-       */
-      $scope.hideMenu = function( broadcastTrigger ) {
-        $scope.menuShown = false;
-        if ( !broadcastTrigger ){
-          $scope.$broadcast('hide-menu');
-        }
-      };
-
-
-      $scope.$on('menu-hidden', function() {
-        if ( $scope.hideThenShow ){
-          delete $scope.hideThenShow;
-
-          uiGridColumnMenuService.repositionMenu( $scope, $scope.col, $scope.colElementPosition, $elm, $scope.colElement );
-          $scope.$broadcast('show-menu');
-
-          $scope.menuShown = true;
-        } else {
-          $scope.hideMenu( true );
-
-          if ($scope.col) {
-            //Focus on the menu button
-            gridUtil.focus.bySelector($document, '.ui-grid-header-cell.' + $scope.col.getColClass()+ ' .ui-grid-column-menu-button', $scope.col.grid, false);
-          }
-        }
-      });
-
-      $scope.$on('menu-shown', function() {
-        $timeout( function() {
-          uiGridColumnMenuService.repositionMenu( $scope, $scope.col, $scope.colElementPosition, $elm, $scope.colElement );
-          //Focus on the first item
-          gridUtil.focus.bySelector($document, '.ui-grid-menu-items .ui-grid-menu-item', true);
-          delete $scope.colElementPosition;
-          delete $scope.columnElement;
-        }, 200);
-      });
-
-
-      /* Column methods */
-      $scope.sortColumn = function (event, dir) {
-        event.stopPropagation();
-
-        $scope.grid.sortColumn($scope.col, dir, true)
-          .then(function () {
-            $scope.grid.refresh();
-            $scope.hideMenu();
-          });
-      };
-
-      $scope.unsortColumn = function () {
-        $scope.col.unsort();
-
-        $scope.grid.refresh();
-        $scope.hideMenu();
-      };
-
-      //Since we are hiding this column the default hide action will fail so we need to focus somewhere else.
-      var setFocusOnHideColumn = function(){
-        $timeout(function(){
-          // Get the UID of the first
-          var focusToGridMenu = function(){
-            return gridUtil.focus.byId('grid-menu', $scope.grid);
-          };
-
-          var thisIndex;
-          $scope.grid.columns.some(function(element, index){
-            if (angular.equals(element, $scope.col)) {
-              thisIndex = index;
-              return true;
-            }
-          });
-
-          var previousVisibleCol;
-          // Try and find the next lower or nearest column to focus on
-          $scope.grid.columns.some(function(element, index){
-            if (!element.visible){
-              return false;
-            } // This columns index is below the current column index
-            else if ( index < thisIndex){
-              previousVisibleCol = element;
-            } // This elements index is above this column index and we haven't found one that is lower
-            else if ( index > thisIndex && !previousVisibleCol) {
-              // This is the next best thing
-              previousVisibleCol = element;
-              // We've found one so use it.
-              return true;
-            } // We've reached an element with an index above this column and the previousVisibleCol variable has been set
-            else if (index > thisIndex && previousVisibleCol) {
-              // We are done.
-              return true;
-            }
-          });
-          // If found then focus on it
-          if (previousVisibleCol){
-            var colClass = previousVisibleCol.getColClass();
-            gridUtil.focus.bySelector($document, '.ui-grid-header-cell.' + colClass+ ' .ui-grid-header-cell-primary-focus', true).then(angular.noop, function(reason){
-              if (reason !== 'canceled'){ // If this is canceled then don't perform the action
-                //The fallback action is to focus on the grid menu
-                return focusToGridMenu();
-              }
-            });
-          } else {
-            // Fallback action to focus on the grid menu
-            focusToGridMenu();
-          }
-        });
-      };
-
-      $scope.hideColumn = function () {
-        $scope.col.colDef.visible = false;
-        $scope.col.visible = false;
-
-        $scope.grid.queueGridRefresh();
-        $scope.hideMenu();
-        $scope.grid.api.core.notifyDataChange( uiGridConstants.dataChange.COLUMN );
-        $scope.grid.api.core.raise.columnVisibilityChanged( $scope.col );
-
-        // We are hiding so the default action of focusing on the button that opened this menu will fail.
-        setFocusOnHideColumn();
-      };
-    },
-
-
-
-    controller: ['$scope', function ($scope) {
-      var self = this;
-
-      $scope.$watch('menuItems', function (n) {
-        self.menuItems = n;
-      });
-    }]
-  };
-
-  return uiGridColumnMenu;
-
-}]);
-
-})();
-
-(function(){
-  'use strict';
-
-  angular.module('ui.grid').directive('uiGridFilter', ['$compile', '$templateCache', 'i18nService', 'gridUtil', function ($compile, $templateCache, i18nService, gridUtil) {
-
-    return {
-      compile: function() {
-        return {
-          pre: function ($scope, $elm, $attrs, controllers) {
-            $scope.col.updateFilters = function( filterable ){
-              $elm.children().remove();
-              if ( filterable ){
-                var template = $scope.col.filterHeaderTemplate;
-
-                $elm.append($compile(template)($scope));
-              }
-            };
-
-            $scope.$on( '$destroy', function() {
-              delete $scope.col.updateFilters;
-            });
-          },
-          post: function ($scope, $elm, $attrs, controllers){
-            $scope.aria = i18nService.getSafeText('headerCell.aria');
-            $scope.removeFilter = function(colFilter, index){
-              colFilter.term = null;
-              //Set the focus to the filter input after the action disables the button
-              gridUtil.focus.bySelector($elm, '.ui-grid-filter-input-' + index);
-            };
-          }
-        };
-      }
-    };
-  }]);
-})();
-
-(function () {
-  'use strict';
-
-  angular.module('ui.grid').directive('uiGridFooterCell', ['$timeout', 'gridUtil', 'uiGridConstants', '$compile',
-  function ($timeout, gridUtil, uiGridConstants, $compile) {
-    var uiGridFooterCell = {
-      priority: 0,
-      scope: {
-        col: '=',
-        row: '=',
-        renderIndex: '='
-      },
-      replace: true,
-      require: '^uiGrid',
-      compile: function compile(tElement, tAttrs, transclude) {
-        return {
-          pre: function ($scope, $elm, $attrs, uiGridCtrl) {
-            var cellFooter = $compile($scope.col.footerCellTemplate)($scope);
-            $elm.append(cellFooter);
-          },
-          post: function ($scope, $elm, $attrs, uiGridCtrl) {
-            //$elm.addClass($scope.col.getColClass(false));
-            $scope.grid = uiGridCtrl.grid;
-
-            var initColClass = $scope.col.getColClass(false);
-            $elm.addClass(initColClass);
-
-            // apply any footerCellClass
-            var classAdded;
-            var updateClass = function( grid ){
-              var contents = $elm;
-              if ( classAdded ){
-                contents.removeClass( classAdded );
-                classAdded = null;
-              }
-  
-              if (angular.isFunction($scope.col.footerCellClass)) {
-                classAdded = $scope.col.footerCellClass($scope.grid, $scope.row, $scope.col, $scope.rowRenderIndex, $scope.colRenderIndex);
-              }
-              else {
-                classAdded = $scope.col.footerCellClass;
-              }
-              contents.addClass(classAdded);
-            };
-  
-            if ($scope.col.footerCellClass) {
-              updateClass();
-            }
-
-            $scope.col.updateAggregationValue();
-
-            // Watch for column changes so we can alter the col cell class properly
-/* shouldn't be needed any more, given track by col.name
-            $scope.$watch('col', function (n, o) {
-              if (n !== o) {
-                // See if the column's internal class has changed
-                var newColClass = $scope.col.getColClass(false);
-                if (newColClass !== initColClass) {
-                  $elm.removeClass(initColClass);
-                  $elm.addClass(newColClass);
-                  initColClass = newColClass;
-                }
-              }
-            });
-*/
-
-
-            // Register a data change watch that would get triggered whenever someone edits a cell or modifies column defs
-            var dataChangeDereg = $scope.grid.registerDataChangeCallback( updateClass, [uiGridConstants.dataChange.COLUMN]);
-            // listen for visible rows change and update aggregation values
-            $scope.grid.api.core.on.rowsRendered( $scope, $scope.col.updateAggregationValue );
-            $scope.grid.api.core.on.rowsRendered( $scope, updateClass );
-            $scope.$on( '$destroy', dataChangeDereg );
-          }
-        };
-      }
-    };
-
-    return uiGridFooterCell;
-  }]);
-
-})();
-
-(function () {
-  'use strict';
-
-  angular.module('ui.grid').directive('uiGridFooter', ['$templateCache', '$compile', 'uiGridConstants', 'gridUtil', '$timeout', function ($templateCache, $compile, uiGridConstants, gridUtil, $timeout) {
-
-    return {
-      restrict: 'EA',
-      replace: true,
-      // priority: 1000,
-      require: ['^uiGrid', '^uiGridRenderContainer'],
-      scope: true,
-      compile: function ($elm, $attrs) {
-        return {
-          pre: function ($scope, $elm, $attrs, controllers) {
-            var uiGridCtrl = controllers[0];
-            var containerCtrl = controllers[1];
-
-            $scope.grid = uiGridCtrl.grid;
-            $scope.colContainer = containerCtrl.colContainer;
-
-            containerCtrl.footer = $elm;
-
-            var footerTemplate = $scope.grid.options.footerTemplate;
-            gridUtil.getTemplate(footerTemplate)
-              .then(function (contents) {
-                var template = angular.element(contents);
-
-                var newElm = $compile(template)($scope);
-                $elm.append(newElm);
-
-                if (containerCtrl) {
-                  // Inject a reference to the footer viewport (if it exists) into the grid controller for use in the horizontal scroll handler below
-                  var footerViewport = $elm[0].getElementsByClassName('ui-grid-footer-viewport')[0];
-
-                  if (footerViewport) {
-                    containerCtrl.footerViewport = footerViewport;
-                  }
-                }
-              });
-          },
-
-          post: function ($scope, $elm, $attrs, controllers) {
-            var uiGridCtrl = controllers[0];
-            var containerCtrl = controllers[1];
-
-            // gridUtil.logDebug('ui-grid-footer link');
-
-            var grid = uiGridCtrl.grid;
-
-            // Don't animate footer cells
-            gridUtil.disableAnimations($elm);
-
-            containerCtrl.footer = $elm;
-
-            var footerViewport = $elm[0].getElementsByClassName('ui-grid-footer-viewport')[0];
-            if (footerViewport) {
-              containerCtrl.footerViewport = footerViewport;
-            }
-          }
-        };
-      }
-    };
-  }]);
-
-})();
-(function () {
-  'use strict';
-
-  angular.module('ui.grid').directive('uiGridGridFooter', ['$templateCache', '$compile', 'uiGridConstants', 'gridUtil', '$timeout', function ($templateCache, $compile, uiGridConstants, gridUtil, $timeout) {
-
-    return {
-      restrict: 'EA',
-      replace: true,
-      // priority: 1000,
-      require: '^uiGrid',
-      scope: true,
-      compile: function ($elm, $attrs) {
-        return {
-          pre: function ($scope, $elm, $attrs, uiGridCtrl) {
-
-            $scope.grid = uiGridCtrl.grid;
-
-
-
-            var footerTemplate = $scope.grid.options.gridFooterTemplate;
-            gridUtil.getTemplate(footerTemplate)
-              .then(function (contents) {
-                var template = angular.element(contents);
-
-                var newElm = $compile(template)($scope);
-                $elm.append(newElm);
-              });
-          },
-
-          post: function ($scope, $elm, $attrs, controllers) {
-
-          }
-        };
-      }
-    };
-  }]);
-
-})();
-(function(){
-  'use strict';
-
-  angular.module('ui.grid').directive('uiGridGroupPanel', ["$compile", "uiGridConstants", "gridUtil", function($compile, uiGridConstants, gridUtil) {
-    var defaultTemplate = 'ui-grid/ui-grid-group-panel';
-
-    return {
-      restrict: 'EA',
-      replace: true,
-      require: '?^uiGrid',
-      scope: false,
-      compile: function($elm, $attrs) {
-        return {
-          pre: function ($scope, $elm, $attrs, uiGridCtrl) {
-            var groupPanelTemplate = $scope.grid.options.groupPanelTemplate  || defaultTemplate;
-
-             gridUtil.getTemplate(groupPanelTemplate)
-              .then(function (contents) {
-                var template = angular.element(contents);
-                
-                var newElm = $compile(template)($scope);
-                $elm.append(newElm);
-              });
-          },
-
-          post: function ($scope, $elm, $attrs, uiGridCtrl) {
-            $elm.bind('$destroy', function() {
-              // scrollUnbinder();
-            });
-          }
-        };
-      }
-    };
-  }]);
-
-})();
-(function(){
-  'use strict';
-
-  angular.module('ui.grid').directive('uiGridHeaderCell', ['$compile', '$timeout', '$window', '$document', 'gridUtil', 'uiGridConstants', 'ScrollEvent', 'i18nService',
-  function ($compile, $timeout, $window, $document, gridUtil, uiGridConstants, ScrollEvent, i18nService) {
-    // Do stuff after mouse has been down this many ms on the header cell
-    var mousedownTimeout = 500;
-    var changeModeTimeout = 500;    // length of time between a touch event and a mouse event being recognised again, and vice versa
-
-    var uiGridHeaderCell = {
-      priority: 0,
-      scope: {
-        col: '=',
-        row: '=',
-        renderIndex: '='
-      },
-      require: ['^uiGrid', '^uiGridRenderContainer'],
-      replace: true,
-      compile: function() {
-        return {
-          pre: function ($scope, $elm, $attrs) {
-            var cellHeader = $compile($scope.col.headerCellTemplate)($scope);
-            $elm.append(cellHeader);
-          },
-
-          post: function ($scope, $elm, $attrs, controllers) {
-            var uiGridCtrl = controllers[0];
-            var renderContainerCtrl = controllers[1];
-
-            $scope.i18n = {
-              headerCell: i18nService.getSafeText('headerCell'),
-              sort: i18nService.getSafeText('sort')
-            };
-            $scope.isSortPriorityVisible = function() {
-              //show sort priority if column is sorted and there is at least one other sorted column
-              return angular.isNumber($scope.col.sort.priority) && $scope.grid.columns.some(function(element, index){
-                  return angular.isNumber(element.sort.priority) && element !== $scope.col;
-                });
-            };
-            $scope.getSortDirectionAriaLabel = function(){
-              var col = $scope.col;
-              //Trying to recreate this sort of thing but it was getting messy having it in the template.
-              //Sort direction {{col.sort.direction == asc ? 'ascending' : ( col.sort.direction == desc ? 'descending':'none')}}. {{col.sort.priority ? {{columnPriorityText}} {{col.sort.priority}} : ''}
-              var sortDirectionText = col.sort.direction === uiGridConstants.ASC ? $scope.i18n.sort.ascending : ( col.sort.direction === uiGridConstants.DESC ? $scope.i18n.sort.descending : $scope.i18n.sort.none);
-              var label = sortDirectionText;
-
-              if ($scope.isSortPriorityVisible()) {
-                label = label + '. ' + $scope.i18n.headerCell.priority + ' ' + col.sort.priority;
-              }
-              return label;
-            };
-
-            $scope.grid = uiGridCtrl.grid;
-
-            $scope.renderContainer = uiGridCtrl.grid.renderContainers[renderContainerCtrl.containerId];
-
-            var initColClass = $scope.col.getColClass(false);
-            $elm.addClass(initColClass);
-
-            // Hide the menu by default
-            $scope.menuShown = false;
-
-            // Put asc and desc sort directions in scope
-            $scope.asc = uiGridConstants.ASC;
-            $scope.desc = uiGridConstants.DESC;
-
-            // Store a reference to menu element
-            var $colMenu = angular.element( $elm[0].querySelectorAll('.ui-grid-header-cell-menu') );
-
-            var $contentsElm = angular.element( $elm[0].querySelectorAll('.ui-grid-cell-contents') );
-
-
-            // apply any headerCellClass
-            var classAdded;
-            var previousMouseX;
-
-            // filter watchers
-            var filterDeregisters = [];
-
-
-            /*
-             * Our basic approach here for event handlers is that we listen for a down event (mousedown or touchstart).
-             * Once we have a down event, we need to work out whether we have a click, a drag, or a
-             * hold.  A click would sort the grid (if sortable).  A drag would be used by moveable, so
-             * we ignore it.  A hold would open the menu.
-             *
-             * So, on down event, we put in place handlers for move and up events, and a timer.  If the
-             * timer expires before we see a move or up, then we have a long press and hence a column menu open.
-             * If the up happens before the timer, then we have a click, and we sort if the column is sortable.
-             * If a move happens before the timer, then we are doing column move, so we do nothing, the moveable feature
-             * will handle it.
-             *
-             * To deal with touch enabled devices that also have mice, we only create our handlers when
-             * we get the down event, and we create the corresponding handlers - if we're touchstart then
-             * we get touchmove and touchend, if we're mousedown then we get mousemove and mouseup.
-             *
-             * We also suppress the click action whilst this is happening - otherwise after the mouseup there
-             * will be a click event and that can cause the column menu to close
-             *
-             */
-
-            $scope.downFn = function( event ){
-              event.stopPropagation();
-
-              if (typeof(event.originalEvent) !== 'undefined' && event.originalEvent !== undefined) {
-                event = event.originalEvent;
-              }
-
-              // Don't show the menu if it's not the left button
-              if (event.button && event.button !== 0) {
-                return;
-              }
-              previousMouseX = event.pageX;
-
-              $scope.mousedownStartTime = (new Date()).getTime();
-              $scope.mousedownTimeout = $timeout(function() { }, mousedownTimeout);
-
-              $scope.mousedownTimeout.then(function () {
-                if ( $scope.colMenu ) {
-                  uiGridCtrl.columnMenuScope.showMenu($scope.col, $elm, event);
-                }
-              });
-
-              uiGridCtrl.fireEvent(uiGridConstants.events.COLUMN_HEADER_CLICK, {event: event, columnName: $scope.col.colDef.name});
-
-              $scope.offAllEvents();
-              if ( event.type === 'touchstart'){
-                $document.on('touchend', $scope.upFn);
-                $document.on('touchmove', $scope.moveFn);
-              } else if ( event.type === 'mousedown' ){
-                $document.on('mouseup', $scope.upFn);
-                $document.on('mousemove', $scope.moveFn);
-              }
-            };
-
-            $scope.upFn = function( event ){
-              event.stopPropagation();
-              $timeout.cancel($scope.mousedownTimeout);
-              $scope.offAllEvents();
-              $scope.onDownEvents(event.type);
-
-              var mousedownEndTime = (new Date()).getTime();
-              var mousedownTime = mousedownEndTime - $scope.mousedownStartTime;
-
-              if (mousedownTime > mousedownTimeout) {
-                // long click, handled above with mousedown
-              }
-              else {
-                // short click
-                if ( $scope.sortable ){
-                  $scope.handleClick(event);
-                }
-              }
-            };
-
-            $scope.moveFn = function( event ){
-              // Chrome is known to fire some bogus move events.
-              var changeValue = event.pageX - previousMouseX;
-              if ( changeValue === 0 ){ return; }
-
-              // we're a move, so do nothing and leave for column move (if enabled) to take over
-              $timeout.cancel($scope.mousedownTimeout);
-              $scope.offAllEvents();
-              $scope.onDownEvents(event.type);
-            };
-
-            $scope.clickFn = function ( event ){
-              event.stopPropagation();
-              $contentsElm.off('click', $scope.clickFn);
-            };
-
-
-            $scope.offAllEvents = function(){
-              $contentsElm.off('touchstart', $scope.downFn);
-              $contentsElm.off('mousedown', $scope.downFn);
-
-              $document.off('touchend', $scope.upFn);
-              $document.off('mouseup', $scope.upFn);
-
-              $document.off('touchmove', $scope.moveFn);
-              $document.off('mousemove', $scope.moveFn);
-
-              $contentsElm.off('click', $scope.clickFn);
-            };
-
-            $scope.onDownEvents = function( type ){
-              // If there is a previous event, then wait a while before
-              // activating the other mode - i.e. if the last event was a touch event then
-              // don't enable mouse events for a wee while (500ms or so)
-              // Avoids problems with devices that emulate mouse events when you have touch events
-
-              switch (type){
-                case 'touchmove':
-                case 'touchend':
-                  $contentsElm.on('click', $scope.clickFn);
-                  $contentsElm.on('touchstart', $scope.downFn);
-                  $timeout(function(){
-                    $contentsElm.on('mousedown', $scope.downFn);
-                  }, changeModeTimeout);
-                  break;
-                case 'mousemove':
-                case 'mouseup':
-                  $contentsElm.on('click', $scope.clickFn);
-                  $contentsElm.on('mousedown', $scope.downFn);
-                  $timeout(function(){
-                    $contentsElm.on('touchstart', $scope.downFn);
-                  }, changeModeTimeout);
-                  break;
-                default:
-                  $contentsElm.on('click', $scope.clickFn);
-                  $contentsElm.on('touchstart', $scope.downFn);
-                  $contentsElm.on('mousedown', $scope.downFn);
-              }
-            };
-
-
-            var updateHeaderOptions = function( grid ){
-              var contents = $elm;
-              if ( classAdded ){
-                contents.removeClass( classAdded );
-                classAdded = null;
-              }
-
-              if (angular.isFunction($scope.col.headerCellClass)) {
-                classAdded = $scope.col.headerCellClass($scope.grid, $scope.row, $scope.col, $scope.rowRenderIndex, $scope.colRenderIndex);
-              }
-              else {
-                classAdded = $scope.col.headerCellClass;
-              }
-              contents.addClass(classAdded);
-
-              $timeout(function (){
-                var rightMostContainer = $scope.grid.renderContainers['right'] ? $scope.grid.renderContainers['right'] : $scope.grid.renderContainers['body'];
-                $scope.isLastCol = ( $scope.col === rightMostContainer.visibleColumnCache[ rightMostContainer.visibleColumnCache.length - 1 ] );
-              });
-
-              // Figure out whether this column is sortable or not
-              if (uiGridCtrl.grid.options.enableSorting && $scope.col.enableSorting) {
-                $scope.sortable = true;
-              }
-              else {
-                $scope.sortable = false;
-              }
-
-              // Figure out whether this column is filterable or not
-              var oldFilterable = $scope.filterable;
-              if (uiGridCtrl.grid.options.enableFiltering && $scope.col.enableFiltering) {
-                $scope.filterable = true;
-              }
-              else {
-                $scope.filterable = false;
-              }
-
-              if ( oldFilterable !== $scope.filterable){
-                if ( typeof($scope.col.updateFilters) !== 'undefined' ){
-                  $scope.col.updateFilters($scope.filterable);
-                }
-
-                // if column is filterable add a filter watcher
-                if ($scope.filterable) {
-                  $scope.col.filters.forEach( function(filter, i) {
-                    filterDeregisters.push($scope.$watch('col.filters[' + i + '].term', function(n, o) {
-                      if (n !== o) {
-                        uiGridCtrl.grid.api.core.raise.filterChanged();
-                        uiGridCtrl.grid.api.core.notifyDataChange( uiGridConstants.dataChange.COLUMN );
-                        uiGridCtrl.grid.queueGridRefresh();
-                      }
-                    }));
-                  });
-                  $scope.$on('$destroy', function() {
-                    filterDeregisters.forEach( function(filterDeregister) {
-                      filterDeregister();
-                    });
-                  });
-                } else {
-                  filterDeregisters.forEach( function(filterDeregister) {
-                    filterDeregister();
-                  });
-                }
-
-              }
-
-              // figure out whether we support column menus
-              if ($scope.col.grid.options && $scope.col.grid.options.enableColumnMenus !== false &&
-                      $scope.col.colDef && $scope.col.colDef.enableColumnMenu !== false){
-                $scope.colMenu = true;
-              } else {
-                $scope.colMenu = false;
-              }
-
-              /**
-              * @ngdoc property
-              * @name enableColumnMenu
-              * @propertyOf ui.grid.class:GridOptions.columnDef
-              * @description if column menus are enabled, controls the column menus for this specific
-              * column (i.e. if gridOptions.enableColumnMenus, then you can control column menus
-              * using this option. If gridOptions.enableColumnMenus === false then you get no column
-              * menus irrespective of the value of this option ).  Defaults to true.
-              *
-              */
-              /**
-              * @ngdoc property
-              * @name enableColumnMenus
-              * @propertyOf ui.grid.class:GridOptions.columnDef
-              * @description Override for column menus everywhere - if set to false then you get no
-              * column menus.  Defaults to true.
-              *
-              */
-
-              $scope.offAllEvents();
-
-              if ($scope.sortable || $scope.colMenu) {
-                $scope.onDownEvents();
-
-                $scope.$on('$destroy', function () {
-                  $scope.offAllEvents();
-                });
-              }
-            };
-
-/*
-            $scope.$watch('col', function (n, o) {
-              if (n !== o) {
-                // See if the column's internal class has changed
-                var newColClass = $scope.col.getColClass(false);
-                if (newColClass !== initColClass) {
-                  $elm.removeClass(initColClass);
-                  $elm.addClass(newColClass);
-                  initColClass = newColClass;
-                }
-              }
-            });
-*/
-            updateHeaderOptions();
-
-            // Register a data change watch that would get triggered whenever someone edits a cell or modifies column defs
-            var dataChangeDereg = $scope.grid.registerDataChangeCallback( updateHeaderOptions, [uiGridConstants.dataChange.COLUMN]);
-
-            $scope.$on( '$destroy', dataChangeDereg );
-
-            $scope.handleClick = function(event) {
-              // If the shift key is being held down, add this column to the sort
-              var add = false;
-              if (event.shiftKey) {
-                add = true;
-              }
-
-              // Sort this column then rebuild the grid's rows
-              uiGridCtrl.grid.sortColumn($scope.col, add)
-                .then(function () {
-                  if (uiGridCtrl.columnMenuScope) { uiGridCtrl.columnMenuScope.hideMenu(); }
-                  uiGridCtrl.grid.refresh();
-                });
-            };
-
-
-            $scope.toggleMenu = function(event) {
-              event.stopPropagation();
-
-              // If the menu is already showing...
-              if (uiGridCtrl.columnMenuScope.menuShown) {
-                // ... and we're the column the menu is on...
-                if (uiGridCtrl.columnMenuScope.col === $scope.col) {
-                  // ... hide it
-                  uiGridCtrl.columnMenuScope.hideMenu();
-                }
-                // ... and we're NOT the column the menu is on
-                else {
-                  // ... move the menu to our column
-                  uiGridCtrl.columnMenuScope.showMenu($scope.col, $elm);
-                }
-              }
-              // If the menu is NOT showing
-              else {
-                // ... show it on our column
-                uiGridCtrl.columnMenuScope.showMenu($scope.col, $elm);
-              }
-            };
-          }
-        };
-      }
-    };
-
-    return uiGridHeaderCell;
-  }]);
-
-})();
-
-(function(){
-  'use strict';
-
-  angular.module('ui.grid').directive('uiGridHeader', ['$templateCache', '$compile', 'uiGridConstants', 'gridUtil', '$timeout', 'ScrollEvent',
-    function($templateCache, $compile, uiGridConstants, gridUtil, $timeout, ScrollEvent) {
-    var defaultTemplate = 'ui-grid/ui-grid-header';
-    var emptyTemplate = 'ui-grid/ui-grid-no-header';
-
-    return {
-      restrict: 'EA',
-      // templateUrl: 'ui-grid/ui-grid-header',
-      replace: true,
-      // priority: 1000,
-      require: ['^uiGrid', '^uiGridRenderContainer'],
-      scope: true,
-      compile: function($elm, $attrs) {
-        return {
-          pre: function ($scope, $elm, $attrs, controllers) {
-            var uiGridCtrl = controllers[0];
-            var containerCtrl = controllers[1];
-
-            $scope.grid = uiGridCtrl.grid;
-            $scope.colContainer = containerCtrl.colContainer;
-
-            updateHeaderReferences();
-            
-            var headerTemplate;
-            if (!$scope.grid.options.showHeader) {
-              headerTemplate = emptyTemplate;
-            }
-            else {
-              headerTemplate = ($scope.grid.options.headerTemplate) ? $scope.grid.options.headerTemplate : defaultTemplate;            
-            }
-
-            gridUtil.getTemplate(headerTemplate)
-              .then(function (contents) {
-                var template = angular.element(contents);
-                
-                var newElm = $compile(template)($scope);
-                $elm.replaceWith(newElm);
-
-                // And update $elm to be the new element
-                $elm = newElm;
-
-                updateHeaderReferences();
-
-                if (containerCtrl) {
-                  // Inject a reference to the header viewport (if it exists) into the grid controller for use in the horizontal scroll handler below
-                  var headerViewport = $elm[0].getElementsByClassName('ui-grid-header-viewport')[0];
-
-
-                  if (headerViewport) {
-                    containerCtrl.headerViewport = headerViewport;
-                    angular.element(headerViewport).on('scroll', scrollHandler);
-                    $scope.$on('$destroy', function () {
-                      angular.element(headerViewport).off('scroll', scrollHandler);
-                    });
-                  }
-                }
-
-                $scope.grid.queueRefresh();
-              });
-
-            function updateHeaderReferences() {
-              containerCtrl.header = containerCtrl.colContainer.header = $elm;
-
-              var headerCanvases = $elm[0].getElementsByClassName('ui-grid-header-canvas');
-
-              if (headerCanvases.length > 0) {
-                containerCtrl.headerCanvas = containerCtrl.colContainer.headerCanvas = headerCanvases[0];
-              }
-              else {
-                containerCtrl.headerCanvas = null;
-              }
-            }
-
-            function scrollHandler(evt) {
-              if (uiGridCtrl.grid.isScrollingHorizontally) {
-                return;
-              }
-              var newScrollLeft = gridUtil.normalizeScrollLeft(containerCtrl.headerViewport, uiGridCtrl.grid);
-              var horizScrollPercentage = containerCtrl.colContainer.scrollHorizontal(newScrollLeft);
-
-              var scrollEvent = new ScrollEvent(uiGridCtrl.grid, null, containerCtrl.colContainer, ScrollEvent.Sources.ViewPortScroll);
-              scrollEvent.newScrollLeft = newScrollLeft;
-              if ( horizScrollPercentage > -1 ){
-                scrollEvent.x = { percentage: horizScrollPercentage };
-              }
-
-              uiGridCtrl.grid.scrollContainers(null, scrollEvent);
-            }
-          },
-
-          post: function ($scope, $elm, $attrs, controllers) {
-            var uiGridCtrl = controllers[0];
-            var containerCtrl = controllers[1];
-
-            // gridUtil.logDebug('ui-grid-header link');
-
-            var grid = uiGridCtrl.grid;
-
-            // Don't animate header cells
-            gridUtil.disableAnimations($elm);
-
-            function updateColumnWidths() {
-              // this styleBuilder always runs after the renderContainer, so we can rely on the column widths
-              // already being populated correctly
-
-              var columnCache = containerCtrl.colContainer.visibleColumnCache;
-              
-              // Build the CSS
-              // uiGridCtrl.grid.columns.forEach(function (column) {
-              var ret = '';
-              var canvasWidth = 0;
-              columnCache.forEach(function (column) {
-                ret = ret + column.getColClassDefinition();
-                canvasWidth += column.drawnWidth;
-              });
-
-              containerCtrl.colContainer.canvasWidth = canvasWidth;
-              
-              // Return the styles back to buildStyles which pops them into the `customStyles` scope variable
-              return ret;
-            }
-            
-            containerCtrl.header = $elm;
-            
-            var headerViewport = $elm[0].getElementsByClassName('ui-grid-header-viewport')[0];
-            if (headerViewport) {
-              containerCtrl.headerViewport = headerViewport;
-            }
-
-            //todo: remove this if by injecting gridCtrl into unit tests
-            if (uiGridCtrl) {
-              uiGridCtrl.grid.registerStyleComputation({
-                priority: 15,
-                func: updateColumnWidths
-              });
-            }
-          }
-        };
-      }
-    };
-  }]);
-
-})();
-
-(function(){
-
-angular.module('ui.grid')
-.service('uiGridGridMenuService', [ 'gridUtil', 'i18nService', 'uiGridConstants', function( gridUtil, i18nService, uiGridConstants ) {
-  /**
-   *  @ngdoc service
-   *  @name ui.grid.gridMenuService
-   *
-   *  @description Methods for working with the grid menu
-   */
-
-  var service = {
-    /**
-     * @ngdoc method
-     * @methodOf ui.grid.gridMenuService
-     * @name initialize
-     * @description Sets up the gridMenu. Most importantly, sets our
-     * scope onto the grid object as grid.gridMenuScope, allowing us
-     * to operate when passed only the grid.  Second most importantly,
-     * we register the 'addToGridMenu' and 'removeFromGridMenu' methods
-     * on the core api.
-     * @param {$scope} $scope the scope of this gridMenu
-     * @param {Grid} grid the grid to which this gridMenu is associated
-     */
-    initialize: function( $scope, grid ){
-      grid.gridMenuScope = $scope;
-      $scope.grid = grid;
-      $scope.registeredMenuItems = [];
-
-      // not certain this is needed, but would be bad to create a memory leak
-      $scope.$on('$destroy', function() {
-        if ( $scope.grid && $scope.grid.gridMenuScope ){
-          $scope.grid.gridMenuScope = null;
-        }
-        if ( $scope.grid ){
-          $scope.grid = null;
-        }
-        if ( $scope.registeredMenuItems ){
-          $scope.registeredMenuItems = null;
-        }
-      });
-
-      $scope.registeredMenuItems = [];
-
-      /**
-       * @ngdoc function
-       * @name addToGridMenu
-       * @methodOf ui.grid.core.api:PublicApi
-       * @description add items to the grid menu.  Used by features
-       * to add their menu items if they are enabled, can also be used by
-       * end users to add menu items.  This method has the advantage of allowing
-       * remove again, which can simplify management of which items are included
-       * in the menu when.  (Noting that in most cases the shown and active functions
-       * provide a better way to handle visibility of menu items)
-       * @param {Grid} grid the grid on which we are acting
-       * @param {array} items menu items in the format as described in the tutorial, with
-       * the added note that if you want to use remove you must also specify an `id` field,
-       * which is provided when you want to remove an item.  The id should be unique.
-       *
-       */
-      grid.api.registerMethod( 'core', 'addToGridMenu', service.addToGridMenu );
-
-      /**
-       * @ngdoc function
-       * @name removeFromGridMenu
-       * @methodOf ui.grid.core.api:PublicApi
-       * @description Remove an item from the grid menu based on a provided id. Assumes
-       * that the id is unique, removes only the last instance of that id. Does nothing if
-       * the specified id is not found
-       * @param {Grid} grid the grid on which we are acting
-       * @param {string} id the id we'd like to remove from the menu
-       *
-       */
-      grid.api.registerMethod( 'core', 'removeFromGridMenu', service.removeFromGridMenu );
-    },
-
-
-    /**
-     * @ngdoc function
-     * @name addToGridMenu
-     * @propertyOf ui.grid.gridMenuService
-     * @description add items to the grid menu.  Used by features
-     * to add their menu items if they are enabled, can also be used by
-     * end users to add menu items.  This method has the advantage of allowing
-     * remove again, which can simplify management of which items are included
-     * in the menu when.  (Noting that in most cases the shown and active functions
-     * provide a better way to handle visibility of menu items)
-     * @param {Grid} grid the grid on which we are acting
-     * @param {array} items menu items in the format as described in the tutorial, with
-     * the added note that if you want to use remove you must also specify an `id` field,
-     * which is provided when you want to remove an item.  The id should be unique.
-     *
-     */
-    addToGridMenu: function( grid, menuItems ) {
-      if ( !angular.isArray( menuItems ) ) {
-        gridUtil.logError( 'addToGridMenu: menuItems must be an array, and is not, not adding any items');
-      } else {
-        if ( grid.gridMenuScope ){
-          grid.gridMenuScope.registeredMenuItems = grid.gridMenuScope.registeredMenuItems ? grid.gridMenuScope.registeredMenuItems : [];
-          grid.gridMenuScope.registeredMenuItems = grid.gridMenuScope.registeredMenuItems.concat( menuItems );
-        } else {
-          gridUtil.logError( 'Asked to addToGridMenu, but gridMenuScope not present.  Timing issue?  Please log issue with ui-grid');
-        }
-      }
-    },
-
-
-    /**
-     * @ngdoc function
-     * @name removeFromGridMenu
-     * @methodOf ui.grid.gridMenuService
-     * @description Remove an item from the grid menu based on a provided id.  Assumes
-     * that the id is unique, removes only the last instance of that id.  Does nothing if
-     * the specified id is not found.  If there is no gridMenuScope or registeredMenuItems
-     * then do nothing silently - the desired result is those menu items not be present and they
-     * aren't.
-     * @param {Grid} grid the grid on which we are acting
-     * @param {string} id the id we'd like to remove from the menu
-     *
-     */
-    removeFromGridMenu: function( grid, id ){
-      var foundIndex = -1;
-
-      if ( grid && grid.gridMenuScope ){
-        grid.gridMenuScope.registeredMenuItems.forEach( function( value, index ) {
-          if ( value.id === id ){
-            if (foundIndex > -1) {
-              gridUtil.logError( 'removeFromGridMenu: found multiple items with the same id, removing only the last' );
-            } else {
-
-              foundIndex = index;
-            }
-          }
-        });
-      }
-
-      if ( foundIndex > -1 ){
-        grid.gridMenuScope.registeredMenuItems.splice( foundIndex, 1 );
-      }
-    },
-
-
-    /**
-     * @ngdoc array
-     * @name gridMenuCustomItems
-     * @propertyOf ui.grid.class:GridOptions
-     * @description (optional) An array of menu items that should be added to
-     * the gridMenu.  Follow the format documented in the tutorial for column
-     * menu customisation.  The context provided to the action function will
-     * include context.grid.  An alternative if working with dynamic menus is to use the
-     * provided api - core.addToGridMenu and core.removeFromGridMenu, which handles
-     * some of the management of items for you.
-     *
-     */
-    /**
-     * @ngdoc boolean
-     * @name gridMenuShowHideColumns
-     * @propertyOf ui.grid.class:GridOptions
-     * @description true by default, whether the grid menu should allow hide/show
-     * of columns
-     *
-     */
-    /**
-     * @ngdoc method
-     * @methodOf ui.grid.gridMenuService
-     * @name getMenuItems
-     * @description Decides the menu items to show in the menu.  This is a
-     * combination of:
-     *
-     * - the default menu items that are always included,
-     * - any menu items that have been provided through the addMenuItem api. These
-     *   are typically added by features within the grid
-     * - any menu items included in grid.options.gridMenuCustomItems.  These can be
-     *   changed dynamically, as they're always recalculated whenever we show the
-     *   menu
-     * @param {$scope} $scope the scope of this gridMenu, from which we can find all
-     * the information that we need
-     * @returns {array} an array of menu items that can be shown
-     */
-    getMenuItems: function( $scope ) {
-      var menuItems = [
-        // this is where we add any menu items we want to always include
-      ];
-
-      if ( $scope.grid.options.gridMenuCustomItems ){
-        if ( !angular.isArray( $scope.grid.options.gridMenuCustomItems ) ){
-          gridUtil.logError( 'gridOptions.gridMenuCustomItems must be an array, and is not');
-        } else {
-          menuItems = menuItems.concat( $scope.grid.options.gridMenuCustomItems );
-        }
-      }
-
-      var clearFilters = [{
-        title: i18nService.getSafeText('gridMenu.clearAllFilters'),
-        action: function ($event) {
-          $scope.grid.clearAllFilters(undefined, true, undefined);
-        },
-        shown: function() {
-          return $scope.grid.options.enableFiltering;
-        },
-        order: 100
-      }];
-      menuItems = menuItems.concat( clearFilters );
-
-      menuItems = menuItems.concat( $scope.registeredMenuItems );
-
-      if ( $scope.grid.options.gridMenuShowHideColumns !== false ){
-        menuItems = menuItems.concat( service.showHideColumns( $scope ) );
-      }
-
-      menuItems.sort(function(a, b){
-        return a.order - b.order;
-      });
-
-      return menuItems;
-    },
-
-
-    /**
-     * @ngdoc array
-     * @name gridMenuTitleFilter
-     * @propertyOf ui.grid.class:GridOptions
-     * @description (optional) A function that takes a title string
-     * (usually the col.displayName), and converts it into a display value.  The function
-     * must return either a string or a promise.
-     *
-     * Used for internationalization of the grid menu column names - for angular-translate
-     * you can pass $translate as the function, for i18nService you can pass getSafeText as the
-     * function
-     * @example
-     * <pre>
-     *   gridOptions = {
-     *     gridMenuTitleFilter: $translate
-     *   }
-     * </pre>
-     */
-    /**
-     * @ngdoc method
-     * @methodOf ui.grid.gridMenuService
-     * @name showHideColumns
-     * @description Adds two menu items for each of the columns in columnDefs.  One
-     * menu item for hide, one menu item for show.  Each is visible when appropriate
-     * (show when column is not visible, hide when column is visible).  Each toggles
-     * the visible property on the columnDef using toggleColumnVisibility
-     * @param {$scope} $scope of a gridMenu, which contains a reference to the grid
-     */
-    showHideColumns: function( $scope ){
-      var showHideColumns = [];
-      if ( !$scope.grid.options.columnDefs || $scope.grid.options.columnDefs.length === 0 || $scope.grid.columns.length === 0 ) {
-        return showHideColumns;
-      }
-
-      // add header for columns
-      showHideColumns.push({
-        title: i18nService.getSafeText('gridMenu.columns'),
-        order: 300
-      });
-
-      $scope.grid.options.gridMenuTitleFilter = $scope.grid.options.gridMenuTitleFilter ? $scope.grid.options.gridMenuTitleFilter : function( title ) { return title; };
-
-      $scope.grid.options.columnDefs.forEach( function( colDef, index ){
-        if ( colDef.enableHiding !== false ){
-          // add hide menu item - shows an OK icon as we only show when column is already visible
-          var menuItem = {
-            icon: 'ui-grid-icon-ok',
-            action: function($event) {
-              $event.stopPropagation();
-              service.toggleColumnVisibility( this.context.gridCol );
-            },
-            shown: function() {
-              return this.context.gridCol.colDef.visible === true || this.context.gridCol.colDef.visible === undefined;
-            },
-            context: { gridCol: $scope.grid.getColumn(colDef.name || colDef.field) },
-            leaveOpen: true,
-            order: 301 + index * 2
-          };
-          service.setMenuItemTitle( menuItem, colDef, $scope.grid );
-          showHideColumns.push( menuItem );
-
-          // add show menu item - shows no icon as we only show when column is invisible
-          menuItem = {
-            icon: 'ui-grid-icon-cancel',
-            action: function($event) {
-              $event.stopPropagation();
-              service.toggleColumnVisibility( this.context.gridCol );
-            },
-            shown: function() {
-              return !(this.context.gridCol.colDef.visible === true || this.context.gridCol.colDef.visible === undefined);
-            },
-            context: { gridCol: $scope.grid.getColumn(colDef.name || colDef.field) },
-            leaveOpen: true,
-            order: 301 + index * 2 + 1
-          };
-          service.setMenuItemTitle( menuItem, colDef, $scope.grid );
-          showHideColumns.push( menuItem );
-        }
-      });
-      return showHideColumns;
-    },
-
-
-    /**
-     * @ngdoc method
-     * @methodOf ui.grid.gridMenuService
-     * @name setMenuItemTitle
-     * @description Handles the response from gridMenuTitleFilter, adding it directly to the menu
-     * item if it returns a string, otherwise waiting for the promise to resolve or reject then
-     * putting the result into the title
-     * @param {object} menuItem the menuItem we want to put the title on
-     * @param {object} colDef the colDef from which we can get displayName, name or field
-     * @param {Grid} grid the grid, from which we can get the options.gridMenuTitleFilter
-     *
-     */
-    setMenuItemTitle: function( menuItem, colDef, grid ){
-      var title = grid.options.gridMenuTitleFilter( colDef.displayName || gridUtil.readableColumnName(colDef.name) || colDef.field );
-
-      if ( typeof(title) === 'string' ){
-        menuItem.title = title;
-      } else if ( title.then ){
-        // must be a promise
-        menuItem.title = "";
-        title.then( function( successValue ) {
-          menuItem.title = successValue;
-        }, function( errorValue ) {
-          menuItem.title = errorValue;
-        });
-      } else {
-        gridUtil.logError('Expected gridMenuTitleFilter to return a string or a promise, it has returned neither, bad config');
-        menuItem.title = 'badconfig';
-      }
-    },
-
-    /**
-     * @ngdoc method
-     * @methodOf ui.grid.gridMenuService
-     * @name toggleColumnVisibility
-     * @description Toggles the visibility of an individual column.  Expects to be
-     * provided a context that has on it a gridColumn, which is the column that
-     * we'll operate upon.  We change the visibility, and refresh the grid as appropriate
-     * @param {GridCol} gridCol the column that we want to toggle
-     *
-     */
-    toggleColumnVisibility: function( gridCol ) {
-      gridCol.colDef.visible = !( gridCol.colDef.visible === true || gridCol.colDef.visible === undefined );
-
-      gridCol.grid.refresh();
-      gridCol.grid.api.core.notifyDataChange( uiGridConstants.dataChange.COLUMN );
-      gridCol.grid.api.core.raise.columnVisibilityChanged( gridCol );
-    }
-  };
-
-  return service;
-}])
-
-
-
-.directive('uiGridMenuButton', ['gridUtil', 'uiGridConstants', 'uiGridGridMenuService', 'i18nService',
-function (gridUtil, uiGridConstants, uiGridGridMenuService, i18nService) {
-
-  return {
-    priority: 0,
-    scope: true,
-    require: ['^uiGrid'],
-    templateUrl: 'ui-grid/ui-grid-menu-button',
-    replace: true,
-
-    link: function ($scope, $elm, $attrs, controllers) {
-      var uiGridCtrl = controllers[0];
-
-      // For the aria label
-      $scope.i18n = {
-        aria: i18nService.getSafeText('gridMenu.aria')
-      };
-
-      uiGridGridMenuService.initialize($scope, uiGridCtrl.grid);
-
-      $scope.shown = false;
-
-      $scope.toggleMenu = function () {
-        if ( $scope.shown ){
-          $scope.$broadcast('hide-menu');
-          $scope.shown = false;
-        } else {
-          $scope.menuItems = uiGridGridMenuService.getMenuItems( $scope );
-          $scope.$broadcast('show-menu');
-          $scope.shown = true;
-        }
-      };
-
-      $scope.$on('menu-hidden', function() {
-        $scope.shown = false;
-        gridUtil.focus.bySelector($elm, '.ui-grid-icon-container');
-      });
-    }
-  };
-
-}]);
-
-})();
-
-(function(){
-
-/**
- * @ngdoc directive
- * @name ui.grid.directive:uiGridMenu
- * @element style
- * @restrict A
- *
- * @description
- * Allows us to interpolate expressions in `<style>` elements. Angular doesn't do this by default as it can/will/might? break in IE8.
- *
- * @example
- <doc:example module="app">
- <doc:source>
- <script>
- var app = angular.module('app', ['ui.grid']);
-
- app.controller('MainCtrl', ['$scope', function ($scope) {
-
- }]);
- </script>
-
- <div ng-controller="MainCtrl">
-   <div ui-grid-menu shown="true"  ></div>
- </div>
- </doc:source>
- <doc:scenario>
- </doc:scenario>
- </doc:example>
- */
-angular.module('ui.grid')
-
-.directive('uiGridMenu', ['$compile', '$timeout', '$window', '$document', 'gridUtil', 'uiGridConstants', 'i18nService',
-function ($compile, $timeout, $window, $document, gridUtil, uiGridConstants, i18nService) {
-  var uiGridMenu = {
-    priority: 0,
-    scope: {
-      // shown: '&',
-      menuItems: '=',
-      autoHide: '=?'
-    },
-    require: '?^uiGrid',
-    templateUrl: 'ui-grid/uiGridMenu',
-    replace: false,
-    link: function ($scope, $elm, $attrs, uiGridCtrl) {
-
-      $scope.dynamicStyles = '';
-
-      var setupHeightStyle = function(gridHeight) {
-        //menu appears under header row, so substract that height from it's total
-        // additional 20px for general padding
-        var gridMenuMaxHeight = gridHeight - uiGridCtrl.grid.headerHeight - 20;
-        $scope.dynamicStyles = [
-          '.grid' + uiGridCtrl.grid.id + ' .ui-grid-menu-mid {',
-          'max-height: ' + gridMenuMaxHeight + 'px;',
-          '}'
-        ].join(' ');
-      };
-
-      if (uiGridCtrl) {
-        setupHeightStyle(uiGridCtrl.grid.gridHeight);
-        uiGridCtrl.grid.api.core.on.gridDimensionChanged($scope, function(oldGridHeight, oldGridWidth, newGridHeight, newGridWidth) {
-          setupHeightStyle(newGridHeight);
-		});
-      }
-
-      $scope.i18n = {
-        close: i18nService.getSafeText('columnMenu.close')
-      };
-
-    // *** Show/Hide functions ******
-      $scope.showMenu = function(event, args) {
-        if ( !$scope.shown ){
-
-          /*
-           * In order to animate cleanly we remove the ng-if, wait a digest cycle, then
-           * animate the removal of the ng-hide.  We can't successfully (so far as I can tell)
-           * animate removal of the ng-if, as the menu items aren't there yet.  And we don't want
-           * to rely on ng-show only, as that leaves elements in the DOM that are needlessly evaluated
-           * on scroll events.
-           *
-           * Note when testing animation that animations don't run on the tutorials.  When debugging it looks
-           * like they do, but angular has a default $animate provider that is just a stub, and that's what's
-           * being called.  ALso don't be fooled by the fact that your browser has actually loaded the
-           * angular-translate.js, it's not using it.  You need to test animations in an external application.
-           */
-          $scope.shown = true;
-
-          $timeout( function() {
-            $scope.shownMid = true;
-            $scope.$emit('menu-shown');
-          });
-        } else if ( !$scope.shownMid ) {
-          // we're probably doing a hide then show, so we don't need to wait for ng-if
-          $scope.shownMid = true;
-          $scope.$emit('menu-shown');
-        }
-
-        var docEventType = 'click';
-        if (args && args.originalEvent && args.originalEvent.type && args.originalEvent.type === 'touchstart') {
-          docEventType = args.originalEvent.type;
-        }
-
-        // Turn off an existing document click handler
-        angular.element(document).off('click touchstart', applyHideMenu);
-        $elm.off('keyup', checkKeyUp);
-        $elm.off('keydown', checkKeyDown);
-
-        // Turn on the document click handler, but in a timeout so it doesn't apply to THIS click if there is one
-        $timeout(function() {
-          angular.element(document).on(docEventType, applyHideMenu);
-          $elm.on('keyup', checkKeyUp);
-          $elm.on('keydown', checkKeyDown);
-
-        });
-        //automatically set the focus to the first button element in the now open menu.
-        gridUtil.focus.bySelector($elm, 'button[type=button]', true);
-      };
-
-
-      $scope.hideMenu = function(event) {
-        if ( $scope.shown ){
-          /*
-           * In order to animate cleanly we animate the addition of ng-hide, then use a $timeout to
-           * set the ng-if (shown = false) after the animation runs.  In theory we can cascade off the
-           * callback on the addClass method, but it is very unreliable with unit tests for no discernable reason.
-           *
-           * The user may have clicked on the menu again whilst
-           * we're waiting, so we check that the mid isn't shown before applying the ng-if.
-           */
-          $scope.shownMid = false;
-          $timeout( function() {
-            if ( !$scope.shownMid ){
-              $scope.shown = false;
-              $scope.$emit('menu-hidden');
-            }
-          }, 200);
-        }
-
-        angular.element(document).off('click touchstart', applyHideMenu);
-        $elm.off('keyup', checkKeyUp);
-        $elm.off('keydown', checkKeyDown);
-      };
-
-      $scope.$on('hide-menu', function (event, args) {
-        $scope.hideMenu(event, args);
-      });
-
-      $scope.$on('show-menu', function (event, args) {
-        $scope.showMenu(event, args);
-      });
-
-
-    // *** Auto hide when click elsewhere ******
-      var applyHideMenu = function(){
-        if ($scope.shown) {
-          $scope.$apply(function () {
-            $scope.hideMenu();
-          });
-        }
-      };
-
-      // close menu on ESC and keep tab cyclical
-      var checkKeyUp = function(event) {
-        if (event.keyCode === 27) {
-          $scope.hideMenu();
-        }
-      };
-
-      var checkKeyDown = function(event) {
-        var setFocus = function(elm) {
-          elm.focus();
-          event.preventDefault();
-          return false;
-        };
-        if (event.keyCode === 9) {
-          var firstMenuItem, lastMenuItem;
-          var menuItemButtons = $elm[0].querySelectorAll('button:not(.ng-hide)');
-          if (menuItemButtons.length > 0) {
-            firstMenuItem = menuItemButtons[0];
-            lastMenuItem = menuItemButtons[menuItemButtons.length - 1];
-            if (event.target === lastMenuItem && !event.shiftKey) {
-              setFocus(firstMenuItem);
-            } else if (event.target === firstMenuItem && event.shiftKey) {
-              setFocus(lastMenuItem);
-            }
-          }
-        }
-      };
-
-      if (typeof($scope.autoHide) === 'undefined' || $scope.autoHide === undefined) {
-        $scope.autoHide = true;
-      }
-
-      if ($scope.autoHide) {
-        angular.element($window).on('resize', applyHideMenu);
-      }
-
-      $scope.$on('$destroy', function () {
-        angular.element(document).off('click touchstart', applyHideMenu);
-      });
-
-
-      $scope.$on('$destroy', function() {
-        angular.element($window).off('resize', applyHideMenu);
-      });
-
-      if (uiGridCtrl) {
-       $scope.$on('$destroy', uiGridCtrl.grid.api.core.on.scrollBegin($scope, applyHideMenu ));
-      }
-
-      $scope.$on('$destroy', $scope.$on(uiGridConstants.events.ITEM_DRAGGING, applyHideMenu ));
-    }
-  };
-
-  return uiGridMenu;
-}])
-
-.directive('uiGridMenuItem', ['gridUtil', '$compile', 'i18nService', function (gridUtil, $compile, i18nService) {
-  var uiGridMenuItem = {
-    priority: 0,
-    scope: {
-      name: '=',
-      active: '=',
-      action: '=',
-      icon: '=',
-      shown: '=',
-      context: '=',
-      templateUrl: '=',
-      leaveOpen: '=',
-      screenReaderOnly: '='
-    },
-    require: ['?^uiGrid'],
-    templateUrl: 'ui-grid/uiGridMenuItem',
-    replace: false,
-    compile: function() {
-      return {
-        pre: function ($scope, $elm) {
-          if ($scope.templateUrl) {
-            gridUtil.getTemplate($scope.templateUrl)
-                .then(function (contents) {
-                  var template = angular.element(contents);
-
-                  var newElm = $compile(template)($scope);
-                  $elm.replaceWith(newElm);
-                });
-          }
-        },
-        post: function ($scope, $elm, $attrs, controllers) {
-          var uiGridCtrl = controllers[0];
-
-          // TODO(c0bra): validate that shown and active are functions if they're defined. An exception is already thrown above this though
-          // if (typeof($scope.shown) !== 'undefined' && $scope.shown && typeof($scope.shown) !== 'function') {
-          //   throw new TypeError("$scope.shown is defined but not a function");
-          // }
-          if (typeof($scope.shown) === 'undefined' || $scope.shown === null) {
-            $scope.shown = function() { return true; };
-          }
-
-          $scope.itemShown = function () {
-            var context = {};
-            if ($scope.context) {
-              context.context = $scope.context;
-            }
-
-            if (typeof(uiGridCtrl) !== 'undefined' && uiGridCtrl) {
-              context.grid = uiGridCtrl.grid;
-            }
-
-            return $scope.shown.call(context);
-          };
-
-          $scope.itemAction = function($event,title) {
-            $event.stopPropagation();
-
-            if (typeof($scope.action) === 'function') {
-              var context = {};
-
-              if ($scope.context) {
-                context.context = $scope.context;
-              }
-
-              // Add the grid to the function call context if the uiGrid controller is present
-              if (typeof(uiGridCtrl) !== 'undefined' && uiGridCtrl) {
-                context.grid = uiGridCtrl.grid;
-              }
-


<TRUNCATED>

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


[09/11] qpid-dispatch git commit: DISPATCH-1001 Removed the deprecated directories

Posted by ea...@apache.org.
http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/a5e2307f/console/dispatch-dashboard/dispatch/static/dashboard/dispatch/dispatch.scss
----------------------------------------------------------------------
diff --git a/console/dispatch-dashboard/dispatch/static/dashboard/dispatch/dispatch.scss b/console/dispatch-dashboard/dispatch/static/dashboard/dispatch/dispatch.scss
deleted file mode 100644
index bd69b21..0000000
--- a/console/dispatch-dashboard/dispatch/static/dashboard/dispatch/dispatch.scss
+++ /dev/null
@@ -1,2135 +0,0 @@
-/*
-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.
-*/
-
-@import "https://cdn.rawgit.com/angular-ui/bower-ui-grid/master/ui-grid.min.css";
-@import "https://cdn.rawgit.com/mar10/dynatree/master/dist/skin/ui.dynatree.css";
-
-$sep-width: 6px;
-$left-width: 200px;
-$pane-top: 50px;
-#paneSep {
-	background-color: #FFF;
-    position: absolute;
-    top: $pane-top;
-    bottom: 0;
-    left: 200px;
-    width: $sep-width;
-    cursor: e-resize;
-    border-right: 1px solid #CCC;
-}
-
-#paneLeft {
-    position: absolute;
-    top: $pane-top;
-    bottom: 0;
-    left: 0;
-    width: $left-width;
-    overflow: auto;
-}
-
-#paneRight {
-    position: absolute;
-    top: $pane-top;
-    bottom: 0;
-    left: $left-width + $sep-width;
-    right: 0;
-    overflow: hidden;
-    margin: 0 1em;
-}
-
-$topology-left-width: 400px;
-$topology-pane-top: 80px;
-div.topology-container #paneLeft {
-  top: $topology-pane-top;
-  width: $topology-left-width;
-}
-div.topology-container #paneRight {
-  top: $topology-pane-top;
-  left: $topology-left-width + $sep-width;
-}
-div.topology-container #paneSep {
-  top: $topology-pane-top;
-  left: $topology-left-width;
-}
-
-.ui-grid-viewport {
-/*    overflow: auto; */
-}
-div.qdr-attributes span.dynatree-selected a {
-    background-color: #e0e0ff;
-}
-
-.qdr-overview.pane.left span:not(.dynatree-has-children) .dynatree-icon:before,
-.qdr-attributes.pane.left span:not(.dynatree-has-children) .dynatree-icon:before {
-    color: green;
-}
-
-span:not(.dynatree-has-children).address .dynatree-icon:before,
-span:not(.dynatree-has-children).router\.address .dynatree-icon:before {
-    content: "\f0ac";
-}
-span:not(.dynatree-has-children).address.mobile .dynatree-icon:before,
-span:not(.dynatree-has-children).router\.address.mobile .dynatree-icon:before {
-    content: "\f109";
-}
-span:not(.dynatree-has-children).address.internal.mobile .dynatree-icon:before,
-span:not(.dynatree-has-children).router\.address.internal.mobile .dynatree-icon:before {
-    content: "\f0ac";
-}
-span:not(.dynatree-has-children).address.router .dynatree-icon:before,
-span:not(.dynatree-has-children).router\.address.router .dynatree-icon:before {
-    content: "\f047";
-}
-
-span.address-link .dynatree-icon:before {
-    content: "\f0ac";
-}
-
-span:not(.dynatree-has-children).connection.external .dynatree-icon:before {
-    content: "\f109";
-}
-span:not(.dynatree-has-children).connection.normal .dynatree-icon:before {
-    content: "\f08e";
-}
-span:not(.dynatree-has-children).connection.external.quiesced .dynatree-icon:before {
-	content: "\f14c";
-	color: red;
-}
-span:not(.dynatree-has-children).connection.inter-router .dynatree-icon:before {
-     content: "\f07e";
-}
-span:not(.dynatree-has-children).no-data .dynatree-icon:before {
-     content: "\f05e";
-     color: red !important;
-}
-span:not(.dynatree-has-children).loading .dynatree-icon:before {
-     content: "\f254";
-}
-span:not(.dynatree-has-children).connector .dynatree-icon:before {
-     content: "\f126";
-}
-span:not(.dynatree-has-children).container .dynatree-icon:before {
-     content: "\f16c";
-}
-span:not(.dynatree-has-children).log .dynatree-icon:before {
-     content: "\f0f6";
-}
-span:not(.dynatree-has-children).router\.node .dynatree-icon:before {
-     content: "\f013";
-}
-span:not(.dynatree-has-children).link.inter-router .dynatree-icon:before,
-span:not(.dynatree-has-children).router\.link.inter-router .dynatree-icon:before{
-     content: "\f07e";
-}
-span:not(.dynatree-has-children).link.endpoint .dynatree-icon:before,
-span:not(.dynatree-has-children).router\.link.endpoint .dynatree-icon:before{
-     content: "\f109";
-}
-span:not(.dynatree-has-children).link.console .dynatree-icon:before,
-span:not(.dynatree-has-children).router\.link.console .dynatree-icon:before {
-     content: "\f108";
-}
-span:not(.dynatree-has-children).listener .dynatree-icon:before {
-     content: "\f025";
-}
-span:not(.dynatree-has-children).connection .dynatree-icon:before {
-     content: "\f07e";
-}
-span:not(.dynatree-has-children).connection.console .dynatree-icon:before {
-     content: "\f108";
-}
-span:not(.dynatree-has-children).waypoint .dynatree-icon:before {
-     content: "\f0ec";
-}
-span:not(.dynatree-has-children).router .dynatree-icon:before {
-     content: "\f047";
-}
-span:not(.dynatree-has-children).fixedAddress .dynatree-icon:before {
-     content: "\f015";
-}
-span:not(.dynatree-has-children).linkRoutePattern .dynatree-icon:before {
-     content: "\f039";
-}
-span:not(.dynatree-has-children).allocator .dynatree-icon:before {
-     content: "\f170";
-}
-
-span.filter-icon {
-	padding-left: 1em;
-}
-
-button.filter-close {
-    width: 15px;
-    height: 20px;
-    padding: 0;
-    position: absolute;
-    right: 4px;
-    top: 4px;
-}
-
-div.filter-title h6 {
-	margin: 0 0 0.5em 0;
-}
-
-.links button.btn-filter {
-	padding: 0 1em 0 0;
-    margin-left: 1em;
-    font-size: 1em;
-}
-
-button.btn-filter {
-	float: right;
-}
-span.dynatree-expanded button.btn-filter,
-a.dynatree-title:hover button.btn-filter {
- 	visibility: visible;
-}
-
-div.hdash-button a {
-	color: white;
-}
-
-.linkDirIn {
-	color: red;
-	background-color: #f3f3f3;
-}
-
-.linkDirOut {
-	color: blue;
-	background-color: white;
-}
-
-ul.dynatree-container {
-  background: inherit;
-}
-ul.dynatree-container li {
-  background: inherit;
-}
-
-span.dynatree-icon {
-  position: relative;
-  top: -2px;
-  font-size: 17px;
-}
-
-span:not(.dynatree-has-children) .dynatree-icon:before {
-  font-family: FontAwesome;
-  content: "\f013";
-}
-
-ul.inline,
-ol.inline {
-  margin-left: 0;
-  list-style: none;
-}
-
-ul.inline > li,
-ol.inline > li {
-  display: inline-block;
-  padding-right: 2px;
-  padding-left: 2px;
-}
-
-[class^="dynatree-folder icon-"], [class*=" dynatree-folder icon-"] {
-
-}
-
-[class^="dynatree-folder icon-"]:before, [class*=" dynatree-folder icon-"]:before {
-  font-size: 17px;
-  margin-left: 18px;
-}
-
-
-[class^="dynatree-folder icon-"], [class*=" dynatree-folder icon-"] .dynatree-connector {
-  display: none;
-}
-
-[class^="dynatree-folder icon-"], [class*=" dynatree-folder icon-"] .dynatree-icon {
-  display: none;
-}
-
-ul.dynatree-container {
-  overflow: visible;
-}
-
-ul.dynatree-container {
-  background: inherit;
-}
-ul.dynatree-container li {
-  background: inherit;
-}
-
-i.expandable-indicator {
-  color: #666;
-}
-
-span.dynatree-expander {
-  color: #728271;
-}
-
-span.dynatree-icon {
-  color: #EECA7C;
-}
-span:not(.dynatree-has-children) .dynatree-icon:before {
-  color: gray;
-}
-
-span.dynatree-empty,
-span.dynatree-vline,
-span.dynatree-connector,
-span.dynatree-expander,
-span.dynatree-icon,
-span.dynatree-checkbox,
-span.dynatree-radio,
-span.dynatree-drag-helper-img,
-#dynatree-drop-marker
-{
-    font-family: FontAwesome;
-    font-weight: normal;
-    font-style: normal;
-    display: inline-block;
-    text-decoration: inherit;
-    background-image: none;
-    vertical-align: middle;
-}
-
-.dynatree-checkbox {
-    color: #888888
-}
-
-/* Dynatree checkbox */
-span.dynatree-checkbox:before
-{
-    margin-top: 1px;
-    background-position: 0 0;
-    cursor: pointer;
-    content: "";
-}
-
-span.dynatree-checkbox:before:hover
-{
-    background-position: 0 0;
-    content: "";
-}
-
-.dynatree-selected span.dynatree-checkbox:before
-{
-    margin-top: 1px;
-    background-position: 0 0;
-    cursor: pointer;
-    content: "\f00c";
-}
-
-.dynatree-selected span.dynatree-checkbox:before:hover
-{
-    background-position: 0 0;
-    content: "\f00c";
-}
-
-
-.dynatree-expander {
-    color: #888888
-}
-
-/* Dynatree expander */
-span.dynatree-expander:before
-{
-    margin-top: 1px;
-    background-position: 0 0;
-    cursor: pointer;
-    content: "\f054";
-}
-
-span.dynatree-expander:before:hover
-{
-    background-position: 0 0;
-    content: "\f054";
-}
-
-.dynatree-exp-e span.dynatree-expander:before,  /* Expanded, not delayed, not last sibling */
-.dynatree-exp-ed span.dynatree-expander:before,  /* Expanded, delayed, not last sibling */
-.dynatree-exp-el span.dynatree-expander:before,  /* Expanded, not delayed, last sibling */
-.dynatree-exp-edl span.dynatree-expander:before  /* Expanded, delayed, last sibling */
-{
-    background-position: 0 0;
-    content: "\f078";
-}
-.dynatree-exp-e span.dynatree-expander:before:hover,  /* Expanded, not delayed, not last sibling */
-.dynatree-exp-ed span.dynatree-expander:before:hover,  /* Expanded, delayed, not last sibling */
-.dynatree-exp-el span.dynatree-expander:before:hover,  /* Expanded, not delayed, last sibling */
-.dynatree-exp-edl span.dynatree-expander:before:hover  /* Expanded, delayed, last sibling */
-{
-    background-position: 0 0;
-    content: "\f0da";
-}
-
-/* closed folder */
-.dynatree-ico-cf span.dynatree-icon:before {
-    background-position: 0 0;
-    content: "\f07b";
-}
-
-/* open folder */
-.dynatree-ico-ef span.dynatree-icon:before {
-    background-position: 0 0;
-    content: "\f07c";
-}
-
-span.dynatree-icon:before {
-    background-position: 0px 0px;
-    content: "\f013";
-}
-
-span.dynatree-folder a {
-    font-weight: normal;
-}
-
-div.treeContainer ul.dynatree-container {
-	border: 0px;
-}
-
-#linkFilter {
-	display: none;
-	padding: 0.5em;
-	border: 1px solid grey;
-	background-color: #F0F0F0;
-	position: absolute;
-	z-index: 100;
-	right: 1em;
-}
-
-span.filter-icon {
-	padding-left: 1em;
-}
-
-button.filter-close {
-    width: 15px;
-    height: 20px;
-    padding: 0;
-    position: absolute;
-    right: 4px;
-    top: 4px;
-}
-
-div.filter-title h6 {
-	margin: 0 0 0.5em 0;
-}
-
-.links button.btn-filter {
-	padding: 0 1em 0 0;
-    margin-left: 1em;
-    font-size: 1em;
-}
-
-button.btn-filter {
-	float: right;
-}
-
-div.formLine label, div.formLine input {
-	display: inline-block;
-	padding: 0 8px;
-}
-
-.ui-grid {
-  border: 0;
-/*  height: auto; */
-}
-
-
-.ui-grid-viewport {
-/*  height: 100% !important; */
-/*  overflow-x: auto !important; */
-}
-/*
-.ui-grid-row.ui-grid-row-selected > [ui-grid-row] > .ui-grid-cell {
-  background-color: #e0e0ff;
-}
-*/
-.grid:not(.noHighlight) .ui-grid-row:hover .ui-grid-cell-contents {
-	background-color: #EEE;
-}
-
-.ui-grid-top-panel {
-  background: inherit;
-}
-
-/*
-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.
-*/
-
-svg {
-  background-color: transparent;
-  cursor: default;
-  -webkit-user-select: none;
-  -moz-user-select: none;
-  -ms-user-select: none;
-  -o-user-select: none;
-  user-select: none;
-}
-
-svg:not(.active):not(.ctrl) {
-  cursor: crosshair;
-}
-#end-arrow-selected, #start-arrow-selected {
-	stroke: #00F;
-	fill: #00F;
-}
-
-path.link {
-  fill: none;
-  stroke: #000;
-  stroke-width: 4px;
-  cursor: default;
-}
-
-svg:not(.active):not(.ctrl) path.link {
-  cursor: pointer;
-}
-
-path.link.selected {
-  stroke-dasharray: 10,2;
-  stroke: #00F  !important;
-}
-
-
-path.link.highlighted {
-    stroke: #0F0 !important;
-
-}
-
-path.link.temp {
-  opacity: 0.3;
-}
-path.link.temp.over {
-  opacity: 0.8;
-  stroke-dasharray: 10,2;
-}
-
-path.link.dragline {
-  pointer-events: none;
-}
-
-path.link.hidden {
-  stroke-width: 0;
-}
-
-
-circle.node {
-    stroke-width: 1.5px;
-    cursor: pointer;
-    stroke: darkgray;
-    fill: lightgray;
-}
-
-circle.node.reflexive {
-    stroke: #F00 !important;
-    stroke-width: 2.5px;
-}
-circle.node.selected {
-    stroke: #F00 !important;
-    stroke-width: 2px;
-    fill: #e0e0ff !important;
-}
-circle.node.inter-router {
-    fill: #EAEAEA;
-}
-circle.node.normal {
-    fill: #F0F000;
-}
-circle.node.on-demand {
-    fill: #C0FFC0;
-}
-circle.node.on-demand.artemis {
-	fill: #FCC;
-	/*opacity: 0.2; */
-}
-
-circle.node.fixed {
-    stroke-dasharray: 10,2;
-}
-circle.node.temp {
-    stroke: #f80;
-    fill: #f0f0ff;
-}
-
-text {
-  font: 12px sans-serif;
-  pointer-events: none;
-  /*font-family: monospace;*/
-
-}
-
-.tooltipsy
-{
-    padding: 10px;
-/*    max-width: 320px;*/
-    color: #303030;
-    background-color: #fcfcfe;
-    border: 1px solid #deca7e;
-    border-radius: 5px;
-}
-
-.tiptable {
-
-}
-.tiptable tr {
-	border-bottom: 1px solid #ccc;
-}
-
-.tiptable tr:last-child {
-	border-bottom: 0px;
-}
-
-.tiptable tr:nth-child(even) {
-	background: #fcfcfe;
-}
-.tiptable tr:nth-child(odd) {
-	background: #FFF
-}
-
-text.id {
-  text-anchor: middle;
-  font-weight: bold;
-}
-
-text.label {
-  text-anchor: start;
-  font-weight: bold;
-}
-
-.row-fluid.tertiary {
-  position: relative;
-  left: 20px;
-}
-
-.row-fluid.tertiary.left {
-  float: left;
-}
-
-.row-fluid.tertiary.panel {
-  width: 410px;
-  /*height: 100%; */
-}
-/*
-div#topologyForm .ngViewport, div#topologyForm .grid {
-  height: inherit !important;
-	min-height: initial !important;
-	overflow: initial;
-}
-*/
-
-#topologyForm {
-  max-height: 20em;
-}
-
-div#multiple_details, div#link_details {
-	height: 300px;
-	width: 700px;
-/*	display: none; */
-  visibility: hidden;
-	padding: 0.5em;
-  border: 1px solid;
-	position: absolute;
-	background-color: white;
-	max-height: 330px !important;
-  overflow: hidden;
-  z-index: 99;
-}
-
-/*
-div#multiple_details div.ngRow.selected {
-	background-color: #c9dde1 !important;
-}
-*/
-div.grid-values {
-	text-align: right;
-}
-
-div.grid-values.ngCellText span {
-	padding-right: 4px;
-}
-
-.panel-adjacent {
-  margin-left: 430px;
-}
-
-#topologyForm.selected {
-  border: 1px solid red;
-}
-#topologyForm {
-    border: 1px solid white;
-    padding: 1em 1.5em;
-}
-
-div.qdr-topology.pane.left .ngViewport {
-    /* border: 1px solid lightgray; */
-}
-
-#topologyForm > div {
-  /* width:396px; */
-}
-
-/* globe */
-.land {
-  fill: #999;
-  stroke-opacity: 1;
-}
-
-.graticule {
-  fill: none;
-  stroke: black;
-  stroke-width:.5;
-  opacity:.1;
-}
-
-.labels {
-    font: 18px sans-serif;
-    fill: black;
-    opacity: .85;
-	text-anchor: middle;
-}
-
-.noclicks { pointer-events:none; }
-
-.point {  opacity:.6; }
-
-.arcs {
-  opacity:.7;
-  stroke: darkgreen;
-  stroke-width: 3;
-}
-.flyers {
-  stroke-width:1;
-  opacity: 0;
-  stroke: darkred;
-}
-.arc, .flyer {
-  stroke-linejoin: round;
-  fill:none;
-}
-.arc { }
-.arc:hover {
-  stroke: darkred;
-}
-.flyer { }
-.flyer:hover {
-  stroke: darkgreen;
-}
-.arc.inter-router {
-  stroke: darkblue;
-}
-
-#addNodeForm {
-  padding: 1em;
-}
-
-
-li.currentStep {
-  font-weight: bold;
-}
-
-.qdrTopology div.panel {
-  position: absolute;
-}
-/*
-.ui-dialog-titlebar {
-    border: 0;
-    background: transparent;
-}
-*/
-
-/*
-.ui-tabs.ui-tabs-vertical {
-    padding: 0;
-    width: 48em;
-}
-.ui-tabs.ui-tabs-vertical .ui-widget-header {
-    border: none;
-}
-.ui-tabs.ui-tabs-vertical .ui-tabs-nav {
-    float: left;
-    width: 10em;
-    background: #CCC;
-    border-radius: 4px 0 0 4px;
-    border-right: 1px solid gray;
-}
-.ui-tabs.ui-tabs-vertical .ui-tabs-nav li {
-    clear: left;
-    width: 100%;
-    margin: 0.1em 0;
-    border: 1px solid gray;
-    border-width: 1px 0 1px 1px;
-    border-radius: 4px 0 0 4px;
-    overflow: hidden;
-    position: relative;
-    right: -2px;
-    z-index: 2;
-}
-.ui-tabs.ui-tabs-vertical .ui-tabs-nav li a {
-    display: block;
-    width: 100%;
-    padding: 0.1em 1em;
-}
-.ui-tabs.ui-tabs-vertical .ui-tabs-nav li a:hover {
-    cursor: pointer;
-}
-.ui-tabs.ui-tabs-vertical .ui-tabs-nav li.ui-tabs-active {
-    margin-bottom: 0.2em;
-    padding-bottom: 0;
-    border-right: 1px solid white;
-}
-.ui-tabs.ui-tabs-vertical .ui-tabs-nav li:last-child {
-    margin-bottom: 10px;
-}
-.ui-tabs.ui-tabs-vertical .ui-tabs-panel {
-    float: left;
-    width: 34em;
-    border-left: 1px solid gray;
-    border-radius: 0;
-    position: relative;
-    left: -1px;
-}
-
-.ui-tabs .ui-tabs-nav li.ui-tabs-selected {
-    right: -3px !important;
-}
-
-.ui-tabs li i.ui-icon {
-    display: inline-block;
-}
-*/
-.ui-tabs .ui-tabs-panel {
-    /* padding-top: 0 !important; */
-}
-
-.ui-widget-content fieldset {
-  float: left;
-  padding: 0 1em 0 0;
-}
-
-.entity-description {
-  color: #960;
-  font-size: 90%;
-}
-
-.attr-description {
-  padding-top: 1.5em;
-  float: right;
-  width: 17em;
-}
-.attr-annotations {
-    padding-top: 2.5em;
-    clear: both;
-}
-.attr-annotations > span {
-    padding-top: 0.5em;
-    border-top: 1px dashed darkgray;
-    display: block;
-}
-
-.attr-type {
-    color: #990;
-    font-size: 85%;
-}
-.attr-required {
-    color: red;
-    font-size: 85%;
-}
-.attr-unique {
-    color: green;
-    font-size: 85%;
-}
-
-#tabs.nodeEntities {
-  border: 0;
-}
-
-#tabs ul.nodeTabs {
-  background: #fff;
-}
-
-#tabs #Container {
-  border-left: 1px solid #aaa;
-}
-
-#tabs.ui-tabs .ui-tabs-nav li {
-  border-bottom: 1px solid #aaa !important;
-}
-
-.entity-fields {
-  /* height: 400px; */
-  overflow-y: scroll;
-  overflow-x: hidden;
-}
-
-div.boolean label:first-child {
-    float: left;
-    margin-right: 1em;
-}
-div.boolean {
-    padding-bottom: 1em;
-}
-
-.entity-fields label {
-    font-weight: 600;
-    margin-top: 0.5em;
-	display: inline;
-}
-
-.aggregate {
-	text-align: right;
-}
-
-.aggregate i {
-	float: right;
-    margin: 3px 3px 3px 8px;
-}
-
-.aggregate .hastip {
-	padding: 5px;
-}
-
-.subTip .tipsy-inner {
-	background-color: white;
-	color: black;
-	font-size: 1.3em;
-	border: 1px solid black;
-}
-
-.subTip .tipsy-arrow-n { border-bottom-color: black; }
-.subTip .tipsy-arrow-s { border-top-color: black; }
-.subTip .tipsy-arrow-e { border-left-color: black; }
-.subTip .tipsy-arrow-w { border-right-color: black; }
-
-
-.contextMenu {
-    display:none;
-	position:absolute;
-	left:30px;
-	top:-30px;
-	z-index:999;
-	/* width:300px; */
-}
-.contextMenu ul {
-	width:300px;
-	margin:0;
-	padding-left: 0;
-	list-style:none;
-	background:#fff;
-	color:#333;
-    font-weight: 600;
-	/* -moz-border-radius:5px; -webkit-border-radius:5px; border-radius:5px; */
-	-moz-box-shadow:5px 5px 5px #ddd; -webkit-box-shadow:5px 5px 5px #999; box-shadow:5px 5px 5px #ddd;
-	border: 1px solid #aaa;
-}
-.contextMenu ul li {
-	padding:5px 10px;
-	/* border-bottom: solid 1px #ccc; */
-}
-.contextMenu ul li:hover {
-	background:#4a90d9; color:#fff;
-}
-.contextMenu ul li:last-child {
-    border:none;
-}
-
-.na {
-    display: none;
-}
-.contextMenu ul li.new {
-    display: block;
-}
-.contextMenu ul li.adding, .contextMenu ul li.adding + li {
-    display: block;
-}
-.contextMenu ul li.force-display {
-    display: block;
-}
-.contextMenu ul li.context-separator {
-    background-color: lightgray;
-    height: 1px;
-    padding: 0;
-}
-
-.ui-tabs.ui-tabs-vertical .ui-tabs-nav li.separated {
-    margin-top: 1em;
-}
-
-#crosssection {
-    display: none;
-    position: absolute;
-    top: 0;
-    left: 0;
-    z-index: 100;
-}
-
-.node circle {
-/*  fill: rgb(31, 119, 180);
-  fill-opacity: .25; */
-  fill: #cfe2f3;
-  fill-opacity: .98;
-  stroke: black;
-  stroke-width: 3px;
-}
-
-circle.subcircle {
-    stroke-width: 1px;
-    /* stroke-dasharray: 2; */
-    fill-opacity: 0;
-    stroke: darkgray;
-}
-
-.leaf circle {
-  fill: #6fa8dc;
-  fill-opacity: 0.95;
-  stroke-width: 3px;
-}
-
-.leaf circle[title] {
-    font-family: monospace;
-
-}
-
-#svg_legend {
-    position: absolute;
-    top: 74px;
-    right: 0;
-    border: 1px solid #ccc;
-    border-radius: 5px;
-    background-color: #fcfcfc;
-    margin-right: 1.3em;
-	padding: 1em;
-}
-
-#svg_legend svg {
-    height: 235px;
-    width: 180px;
-}
-
-/*
-#multiple_details div.grid {
-	min-height: 70px !important;
-	height: auto !important;
-}
-
-#multiple_details .ngViewport {
-    height: auto !important;
-}
-
-#multiple_details .gridCellButton button, #link_details .gridCellButton button {
-    margin: .25em .4em;
-    font-size: 12px;
-    height: 2em;
-	padding-top: .1em;
-}
-*/
-
-#linkFilter {
-	display: none;
-	padding: 0.5em;
-	border: 1px solid grey;
-	background-color: #F0F0F0;
-	position: absolute;
-	z-index: 100;
-	right: 1em;
-}
-div.formLine label, div.formLine input {
-	display: inline-block;
-	padding: 0 8px;
-}
-
-span.filter-icon {
-	padding-left: 1em;
-}
-
-button.filter-close {
-    width: 15px;
-    height: 20px;
-    padding: 0;
-    position: absolute;
-    right: 4px;
-    top: 4px;
-}
-
-div.filter-title h6 {
-	margin: 0 0 0.5em 0;
-}
-
-.links button.btn-filter {
-	padding: 0 1em 0 0;
-    margin-left: 1em;
-    font-size: 1em;
-}
-
-button.btn-filter {
-	float: right;
-}
-span.dynatree-expanded button.btn-filter,
-a.dynatree-title:hover button.btn-filter {
- 	visibility: visible;
-}
-
-div.hdash-button a {
-	color: white;
-}
-
-.linkDirIn {
-	color: red;
-	background-color: #f3f3f3;
-}
-
-.linkDirOut {
-	color: blue;
-	background-color: white;
-}
-
-div.topoGrid .ui-grid-viewport {
-	overflow: hidden !important;
-}
-
-@-moz-document url-prefix() {
-    .btn {padding: 2px 12px 8px !important;}
-}
-
-.ui-fancytree.fancytree-container {
-	font-size: 14px;
-}
-
-.grid-title {
-    background-color: #FAFAFA;
-    background-image: -moz-linear-gradient(top, #ffffff, #f2f2f2);
-    background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), to(#f2f2f2));
-    background-image: -webkit-linear-gradient(top, #ffffff, #f2f2f2);
-    background-image: -o-linear-gradient(top, #ffffff, #f2f2f2);
-    background-image: linear-gradient(to bottom, #ffffff, #f2f2f2);
-    background-repeat: repeat-x;
-    filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFFFFF', endColorstr='#F2F2F2', GradientType=0);
-    border-bottom: 1px solid #d4d4d4;
-    text-shadow: 0 1px 0 #FFFFFF;
-    border-top-left-radius: 5px;
-    border-top-right-radius: 5px;
-	margin: 0 0 10px 0;
-    padding-bottom: 4px;
-}
-
-.expand-collapse {
-	float: right;
-	margin-right: 0.5em;
-}
-
-.pane-viewport {
-	top: 24px !important;
-}/*
-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.
-*/
-main-display > .span8 {
-  height: 100%;
-  position: relative;
-}
-
-ul.qdrListNodes > li > span {
-  padding: 6px 20px; 6px; 6px;
-  display: block;
-}
-
-.qdrList .gridStyle {
-    width: 20em;
-    margin-right: 0;
-    float: left;
-}
-
-
-.qdrList div.gridDetails {
-    width: auto;
-}
-
-.selectedItems {
-    /* margin-left: 21em; */
-}
-
-.qdrListPane {
-    top: 110px;
-}
-
-.qdrListActions {
-    width: auto;
-}
-
-div.listAttrName {
-    padding-top: 5px;
-}
-
-div.listAttrName i.icon-bar-chart {
-    float: right;
-    margin: 3px 5px;
-}
-
-div.listAttrName i.icon-bar-chart.active, div.hastip i.icon-bar-chart.active, li.haschart i {
-    background-color: #AAFFAA;
-}
-
-div#main div ul.nav li a:not(.btn) {
-    background: initial !important;
-}
-
-div#main div ul.nav li.active a {
-    background-color: #f0f0ff !important;
-}
-
-div#main.qdr {
-    margin-top: 56px !important;
-}
-
-div.charts-header {
-  font-size: 1.2em;
-  color: #666666;
-  margin: 1em 0;
-}
-
-.selectedNode, .selectedAction, .selectedEntity {
-    font-weight: 600;
-    color: #606066;
-}
-
-.okButton {
-    text-align: center;
-    margin: 1em;
-}
-
-span.showChartsLink {
-    border: 1px solid blue;
-    padding: 1px 2px;
-}
-
-div.listGraphs p {
-    margin: 1em 0 2em 2em;
-    text-align: center;
-}
-
-div.centered {
-    text-align: center;
-    margin: 4em;
-}
-
-.modal-body.centered {
-	margin: 0;
-}
-
-/* dialog */
-div.aChart {
-    height: 200px;
-    width:  400px;
-    margin: 1em;
-}
-
-/* dashboard */
-div.aChart.hDash {
-	/* width: 21em; */
-	/* height: 17em; */
-	width: 100%;
-	height: 87%;
-	margin: 0;
-	padding: 0;
-
-}
-div.chartContainer {
-    float: left;
-	width: 100%;
-	height: 100%;
-	overflow: hidden;
-}
-
-/* the x and y axis lines */
-.d3Chart g.axis path.domain {
-    stroke-width: 1;
-    stroke: black;
-}
-
-/* the line surrounding the area chart */
-div.d3Chart path {
-/*    stroke: black; */
-    stroke-width: 0;
-/*	opacity: 0.5; */
-}
-
-/* the line above the area chart */
-/* the color gets overridden */
-div.d3Chart path.line {
-    stroke: steelblue;
-    stroke-width: 1.5;
-    fill: none;
-    opacity: 1;
-}
-
-.mo-rect {
-    fill: #ffffdd;
-    stroke: #f0f0f0;
-    stroke-width: 1;
-}
-
-.mo-guide {
-    fill: none;
-    stroke: #d0d0d0;
-    stroke-width: 2;
-    stroke-dasharray: 3,3;
-}
-
-div.d3Chart .title {
-    /* text-decoration: underline; */
-    font-weight: bold;
-}
-
-
-.axis line, .axis path {
-  fill: none;
-  shape-rendering: crispEdges;
-  stroke-width: 1;
-  stroke: #000000;
-}
-
-.axis line {
-  stroke: #C0C0C0;
-  stroke-dasharray: 1,1;
-  opacity: 0.5;
-}
-
-.y.axis text, .x.axis text, .focus text, div.d3Chart .title {
-    font-size: 12px;
-}
-
-.y.axis path {
-   stroke: #000;
- }
-
-.overlay {
-   fill: none;
-   pointer-events: all;
- }
-
-.focus circle {
-   fill: none;
-   stroke: steelblue;
- }
-.focus .fo-table {
-	/* box-shadow: 2px 2px 3px #EEE; */
-}
-
-div.d3Chart {
-    padding: 1em 0;
-    border: 1px solid #C0C0C0;
-}
-div.d3Chart.hDash {
-    border: 0px;
-}
-
-div.d3Chart .axis path {
-	display: inherit;
-}
-.c3-circle {
-	display: none;
-}
-
-.fo-table {
-	border: 1px solid darkgray;
-	background-color: white;
-	font-size: .85em;
-}
-
-.fo-table td {
-	padding: 4px;
-	border-left: 1px solid darkgray;
-}
-.fo-table tr.detail td {
-	padding: 1px 4px;
-}
-.fo-title {
-	color: white;
-	background-color: darkgray;
-}
-
-.fo-table-legend {
-	width: 8px;
-	height: 8px;
-	border: 1px solid black;
-	margin: 0 4px;
-	display: inline-block;
-}
-
-svg .legend {
-	dominant-baseline: central;
-}
-
-div.chartContainer div.aChart {
-    margin-top: 0.5em;
-}
-
-#list-controller .tree-header {
-    position: absolute;
-    height: auto;
-}
-
-#list-controller select {
-	height: auto;
-	float: left;
-}
-
-
-div#main.qdr div ul.nav li.active a {
-  background-color: #e0e0ff !important;
-  color: #000000;
-}
-
-div#main.qdr .selected, .box.selected {
-  color: #000000;
-  text-shadow: none;
-}
-
-/* the selected node on the list page */
-div.qdrList li.active, ul.qdrListNodes li.active {
-    background-color: #e0e0ff;
-}
-
-div.qdr-attributes span.dynatree-selected a {
-    background-color: #e0e0ff;
-}
-div.qdr-attributes.pane, div.qdr-topology.pane {
-	position: absolute;
-	margin-left: 10px;
-}
-div.qdr-overview.pane {
-	position: absolute;
-}
-div.qdr-topology.pane.left {
-	width: auto;
-}
-
-/* the selected row in the name table */
-div#main.qdr div.qdrList div.selected {
-  background-color: #e0e0ff !important;
-}
-
-#dialogChart {
-    height: 200px;
-}
-
-div.qdrCharts p.chartLabels button {
-    float: right;
-}
-
-div.qdrCharts p.chartLabels {
-     padding-right: 1em;;
- }
-
-p.dialogHeader {
-    text-align: center;
-}
-
-p.dialogHeader input {
-    margin-top: 10px;
-    width: 480px;
-}
-
-.ui-slider-tick {
-  position: absolute;
-  background-color: #666;
-  width: 2px;
-  height: 8px;
-  top: 12px;
-  z-index: -1;
-}
-
-label.rateGroup {
-    float: left;
-}
-
-div.chartOptions div.dlg-slider {
-    float: left;
-    margin-left: 2em;
-    width: 28em;
-    font-size: 14px;
-}
-
-div.chartOptions div.duration {
-  width: 35em !important;
-}
-
-div.chartOptions .slider {
-    margin-top: 1em;
-    margin-bottom: 1em;
-}
-
-input[type="radio"] {
-    margin-top: 0 !important;
-}
-
-div.chartOptions legend {
-    font-size: 1.2em;
-    margin-bottom: 10px;
-}
-
-div.chartOptions span.minicolors-swatch {
-    width: 14px;
-    height: 14px;
-}
-
-.minicolors-input {
-    width: 4em;
-    padding: 0 0 0 24px !important;
-}
-
-div.colorPicker div.colorText {
-	display: inline-block;
-	width: 10em;
-}
-div.colorPicker div:nth-of-type(1), /* first span under div.colorPicker */
- div.minicolors{
-    float:left;
-    margin-right: 0.5em;
-}
-
-div.chartOptions p.sep {
-    height: 1em;
-}
-
-ul.nav-tabs {
-    border-bottom: 1px solid #ddd !important;
-}
-
-.chartOptions ul.nav-tabs {
-    margin-bottom: 0px !important;
-}
-
-div.tabbable div.tab-content {
-    overflow: visible;
-}
-
-div.tabbable ul.nav-tabs > .active > a {
-  background-color: #f8f8f8;
-  border: 1px solid #ddd;
-  border-bottom-color: transparent;
-}
-
-
-div.tabbable .tab-pane {
-    background-color: #f8f8f8;
-    padding: 12px;
-    border-right: 1px solid #ddd;
-    border-left: 1px solid #ddd;
-    border-bottom: 1px solid #ddd;
-}
-div.dlg-large div.tabbable .tab-pane {
-	margin-left: 11em;
-}
-
-div.tabbable ul.nav-tabs {
-  margin-bottom: 0;
-}
-
-ul.qdrTopoModes {
-    position: relative;
-    top: -10px;
-}
-.overview.section {
-	/* width: 35em; */
-}
-.overview.section .ngGrid {
-	height: 12em !important;
-	min-height: 12em !important;
-}
-
-.overview.routers.section .ngGrid {
- 	height: 16em !important;
- 	min-height: 16em !important;
-}
-.overview.routers.section {
- 	/*width: 15em; */
- }
-
-.grid-align-value {
-	text-align: right;
-}
-
-.grid-align-value .ngCellText {
-	padding-right: 10px;
-}
-
-.overview .ngRow:hover {
-	background:#e0e0ff;
-}
-
-.qdr-overview.pane.left, .qdr-attributes.pane.left {
-	top: 104px;
-}
-.qdr-topology.pane.left {
-	top: 104px;
-}
-.qdr-overview.pane.left, .qdr-attributes.pane.left, .qdr-topology.pane.left {
-	left: 10px;
-}
-
-.treeContainer {
-	width: 100%;
-	float: left;
-}
-
-.pane-content {
-	overflow: auto;
-}
-
-#entityNames {
-    width: 20em;
-    float: left;
-}
-
-.treeDetails {
-	margin-left: 260px;
-}
-
-.gridStyle:not(.noHighlight) .ui-grid-row:hover .ui-grid-cell-contents {
-	background-color: #e0e0ff;
-}
-
-.ngCellText {
-	padding: 4px 0 0 4px;
-}
-
-.ui-grid-row.ui-grid-row-selected > [ui-grid-row] > .ui-grid-cell {
-  background-color: #e0e0ff;
-}
-
-.tab-content .tab-pane {
-    background-color: #f8f8f8;
-    padding: 12px;
-    border-right: 1px solid #ddd;
-    border-left: 1px solid #ddd;
-    border-bottom: 1px solid #ddd;
-}
-
-div.chartOptions ul.nav-tabs > .active > a {
-  background-color: #f8f8f8;
-  border: 1px solid #ddd;
-  border-bottom-color: transparent;
-}
-
-div.chartOptions label:nth-of-type(2) {
-    margin-left: 1em;
-}
-div.chartOptions label {
-	font-weight: normal;
-	display: inline-block;
-}
-
-/*
-.form-horizontal .control-label {
-    float: left;
-    width: 160px;
-    padding-top: 5px;
-    text-align: right;
-}
-
-.form-horizontal .controls {
-    margin-left: 180px;
-}
-
-.form-horizontal input,  {
-    display: inline-block;
-    margin-bottom: 0;
-    vertical-align: middle;
-}
-
-input[type="text"], input[type="number"], input[type="password"] {
-    background-color: #ffffff;
-    border: 1px solid #cccccc;
-    -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
-    -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
-    box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
-    -webkit-transition: border linear 0.2s, box-shadow linear 0.2s;
-    -moz-transition: border linear 0.2s, box-shadow linear 0.2s;
-    -o-transition: border linear 0.2s, box-shadow linear 0.2s;
-    transition: border linear 0.2s, box-shadow linear 0.2s;
-}
-
-input[type="text"], input[type="number"], input[type="password"] {
-    display: inline-block;
-    width: 200px;
-    padding: 4px 6px;
-    margin-bottom: 10px;
-    font-size: 14px;
-    line-height: 20px;
-    color: #555555;
-    vertical-align: middle;
-    -webkit-border-radius: 4px;
-    -moz-border-radius: 4px;
-    border-radius: 4px;
-}
-
-.login input[type="checkbox"] {
-	margin-top: 0.75em;
-}
-*/
-
-#dispatch-login-container {
-	/* width: 18.5em; */
-	margin-top: 2em;
-}
-/*
-div.login.container {
-	width: 550px;
-}
-*/
-
-
-#overtree .fancytree-container {
-	border: 0px;
-}
-
-#overtree span.fancytree-alert-icon.ui-icon-refresh {
-	background-position: -64px -80px;
-}
-#overtree span.fancytree-alert-icon.ui-icon-transfer-e-w {
-	background-position: -112px -80px;
-}
-
-#alerts {
-	position: fixed;
-	right: 0;
-	top: 0;
-	z-index: 100;
-}
-
-.alert-enter,
-.alert-leave,
-.alert-move {
-  -webkit-transition: 1s linear all;
-  -moz-transition: 1s linear all;
-  -o-transition: 1s linear all;
-  transition: 1s linear all;
-  position:relative;
-}
-
-.alert-enter {
-  left:-10px;
-  opacity:0;
-}
-.alert-enter.alert-enter-active {
-  left:0;
-  opacity:1;
-}
-
-.alert-leave {
-  left:0;
-  opacity:1;
-}
-.alert-leave.alert-leave-active {
-  left:-10px;
-  opacity:0;
-}
-
-.alert-move {
-  opacity:0.5;
-}
-.alert-move.alert-move-active {
-  opacity:1;
-}
-
-.overview .table-striped tr:hover  td {
-	background-color: #e0e0ff !important;
-}
-
-#entityNames div.ngViewport {
-	overflow-x: hidden;
-}
-
-.connect-column.connect-form {
-	width: 20em;
-}
-
-.chartLabels button a {
-	text-decoration: none;
-}
-
-.fancytree-ico-c.router .fancytree-icon {
-
-}
-
-.tabs-left .nav-tabs {
-	float: left;
-}
-.tabs-left .nav-tabs > li {
-/*	float: initial; */
-}
-
-div.modal.dlg-large {
-	width: 53em;
-}
-
-button.hdash-button a {
-	text-decoration: none;
-	color: #fff;
-}
-
-div.widget-body > div {
-	height: 100%;
-}
-
-div.qdrCharts {
-	height: 100%;
-}
-
-ul.dispatch-view {
-	margin-bottom: 0 !important;
-}
-
-.qdr-overview.pane.left span:not(.dynatree-has-children) .dynatree-icon:before,
-.qdr-attributes.pane.left span:not(.dynatree-has-children) .dynatree-icon:before {
-    color: green;
-}
-
-span:not(.dynatree-has-children).address .dynatree-icon:before,
-span:not(.dynatree-has-children).router\.address .dynatree-icon:before {
-    content: "\f0ac";
-}
-span:not(.dynatree-has-children).address.mobile .dynatree-icon:before,
-span:not(.dynatree-has-children).router\.address.mobile .dynatree-icon:before {
-    content: "\f109";
-}
-span:not(.dynatree-has-children).address.internal.mobile .dynatree-icon:before,
-span:not(.dynatree-has-children).router\.address.internal.mobile .dynatree-icon:before {
-    content: "\f0ac";
-}
-span:not(.dynatree-has-children).address.router .dynatree-icon:before,
-span:not(.dynatree-has-children).router\.address.router .dynatree-icon:before {
-    content: "\f047";
-}
-
-span.address-link .dynatree-icon:before {
-    content: "\f0ac";
-}
-
-span:not(.dynatree-has-children).connection.external .dynatree-icon:before {
-    content: "\f109";
-}
-span:not(.dynatree-has-children).connection.normal .dynatree-icon:before {
-    content: "\f08e";
-}
-span:not(.dynatree-has-children).connection.external.quiesced .dynatree-icon:before {
-	content: "\f14c";
-	color: red;
-}
-span:not(.dynatree-has-children).connection.inter-router .dynatree-icon:before {
-     content: "\f07e";
-}
-span:not(.dynatree-has-children).no-data .dynatree-icon:before {
-     content: "\f05e";
-     color: red !important;
-}
-span:not(.dynatree-has-children).loading .dynatree-icon:before {
-     content: "\f254";
-}
-span:not(.dynatree-has-children).connector .dynatree-icon:before {
-     content: "\f126";
-}
-span:not(.dynatree-has-children).container .dynatree-icon:before {
-     content: "\f16c";
-}
-span:not(.dynatree-has-children).log .dynatree-icon:before {
-     content: "\f0f6";
-}
-span:not(.dynatree-has-children).router\.node .dynatree-icon:before {
-     content: "\f013";
-}
-span:not(.dynatree-has-children).link.inter-router .dynatree-icon:before,
-span:not(.dynatree-has-children).router\.link.inter-router .dynatree-icon:before{
-     content: "\f07e";
-}
-span:not(.dynatree-has-children).link.endpoint .dynatree-icon:before,
-span:not(.dynatree-has-children).router\.link.endpoint .dynatree-icon:before{
-     content: "\f109";
-}
-span:not(.dynatree-has-children).link.console .dynatree-icon:before,
-span:not(.dynatree-has-children).router\.link.console .dynatree-icon:before {
-     content: "\f108";
-}
-span:not(.dynatree-has-children).listener .dynatree-icon:before {
-     content: "\f025";
-}
-span:not(.dynatree-has-children).connection .dynatree-icon:before {
-     content: "\f07e";
-}
-span:not(.dynatree-has-children).connection.console .dynatree-icon:before {
-     content: "\f108";
-}
-span:not(.dynatree-has-children).waypoint .dynatree-icon:before {
-     content: "\f0ec";
-}
-span:not(.dynatree-has-children).router .dynatree-icon:before {
-     content: "\f047";
-}
-span:not(.dynatree-has-children).fixedAddress .dynatree-icon:before {
-     content: "\f015";
-}
-span:not(.dynatree-has-children).linkRoutePattern .dynatree-icon:before {
-     content: "\f039";
-}
-span:not(.dynatree-has-children).allocator .dynatree-icon:before {
-     content: "\f170";
-}
-
-.ngCellText {
-/*    color: #333333; */
-}
-
-.changed {
-    color: #339933;
-}
-
-div.dispatch-router div.help {
-    width: auto;
-    padding: 1em;
-    background-color: lavender;
-    border-radius: 6px;
-    margin-top: 1em;
-    text-align: center;
-}
-
-div.operations tr:nth-child(even) {
-	background: #f3f3f3;
-}
-div.operations tr:nth-child(odd), div.operations tr:last-child {
-	background: #fff;
-}
-
-div.operations tr input {
-	margin: 0;
-	padding: 3px 6px;
-}
-div.operations table {
-    width: 100%;
-}
-div.operations th {
-    width: 50%;
-    border-bottom: 1px solid #cccccc;
-    text-align: left;
-}
-div.operations td:nth-child(odd), div.operations th:nth-child(odd) {
-	border-right: 1px solid #cccccc;
-}
-div.operations td:nth-child(odd) {
-	padding-left: 0;
-}
-div.operations td:nth-child(even), div.operations th:nth-child(even) {
-	padding-left: 5px;
-}
-div.operations th {
-	padding: 5px;
-}
-div.operations .tab-pane.active {
-    padding: 12px 12px 12px 0;
-}
-div.operations label {
-    padding-top: 4px;
-    margin-bottom: 4px;
-}
-.qdrListActions .ngGrid {
-	/*min-height: 40em;
-	height: 100%; */
-}
-div.qdrListActions .ngViewport {
-    height: initial !important;
-}
-
-div.operations .boolean {
-    padding-bottom: 0;
-}
-
-table.log-entry {
-    margin-bottom: 1em;
-    border-top: 1px solid black;
-}
-
-table.log-entry pre {
-    background-color: #f5f5f5;
-    color: inherit;
-    margin: 0;
-}
-
-circle.node.normal.console {
-    fill: lightcyan;
-}
-
-text.console, text.on-demand, text.normal {
-	font-family: FontAwesome;
-	font-weight: normal;
-	font-size: 16px;
-}
-
-@font-face {
-    font-family:"Brokers";
-    src: url("brokers.ttf") /* TTF file for CSS3 browsers */
-}
-
-text.artemis.on-demand {
-    font-family: Brokers;
-    font-size: 20px;
-    font-weight: bold;
-}
-
-text.qpid-cpp.on-demand {
-    font-family: Brokers;
-    font-size: 18px;
-    font-weight: bold;
-}
-
-i.red {
-	color: red;
-}
-
-.qdrListActions div.delete {
-    width: 20em;
-    margin: auto;
-    border: 1px solid #eaeaea;
-    height: 5em;
-    padding: 4em;
-    background-color: #fcfcfc;
-}
-
-.btn:focus {
-    box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(82, 168, 236, 0.6);
-}
-
-select:focus, input[type="file"]:focus, input[type="radio"]:focus, input[type="checkbox"]:focus {
-	outline:3px solid rgba(82, 168, 236, 0.6);
-    box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(82, 168, 236, 0.6);
-    outline: 5px auto -webkit-focus-ring-color;
-    outline-offset: -2px;
-}
-
-btn.disabled, .btn[disabled] {
-    opacity: 0.35;
-}
-
-#dispatch-login-container .ng-invalid-range {
-	border-color: #e9322d !important;
-}
-
-div#durationSlider, div#rateSlider {
-	margin-top: 1em;
-}
-
-.list-grid {
-	padding-left: 10px;
-}
-
-div#list-controller {
-    padding-left: 300px;
-}
-
-div.topology-container #content_body,
-div.topology-container #content_body .container-fluid,
-div.topology-container #content_body .container-fluid .row,
-div.topology-container #content_body .container-fluid .row .col-xs-12 {
-  height: inherit;
-}
-
-#overview-controller {
-  position: relative;
-}
-
-#overview-controller div.grid {
-  padding-left: 1em;
-}
-
-.overview-dropdown {
-  float: left;
-  color: #666;
-}
-
-.overview-dropdown * {
-  color: inherit;
-}
-
-.overview-dropdown.selected,
- .overview-dropdown.selected1 {
-  color: black;
-}
-
-.overview-dropdown select {
-  border: 1px solid black;
-  background: initial;
-  padding: 0.5em;
-  font-size: small;
-}
-
-#overview_dropdowns, #overview_charts {
-  display: flex;
-  justify-content: space-between;
-}
-
-.dropdown-entity {
-  font-weight: bold;
-}
-
-.link-menu-item label {
-  font-weight: normal;
-  padding-left: 8px;
-}
-
-.link-menu-item input {
-  margin: 0 0 0 4px;
-  position: relative;
-  top: 4px;
-}
-
-#overview_charts .d3Chart {
-    height: 180px;
-    width: 300px;
-    border: 0;
-    /*background-color: #EEE;*/
-    float: left;
-}

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/a5e2307f/console/dispatch-dashboard/dispatch/static/dashboard/dispatch/jquery.dynatree.min.js
----------------------------------------------------------------------
diff --git a/console/dispatch-dashboard/dispatch/static/dashboard/dispatch/jquery.dynatree.min.js b/console/dispatch-dashboard/dispatch/static/dashboard/dispatch/jquery.dynatree.min.js
deleted file mode 100644
index d946469..0000000
--- a/console/dispatch-dashboard/dispatch/static/dashboard/dispatch/jquery.dynatree.min.js
+++ /dev/null
@@ -1,4 +0,0 @@
-/*! jQuery Dynatree Plugin - v1.2.8 - 2015-07-04
-* https://github.com/mar10/dynatree/
-* Copyright (c) 2015 Martin Wendt; Licensed MIT, GPL */function _log(a){if(_canLog){var b=Array.prototype.slice.apply(arguments,[1]),c=new Date,d=c.getHours()+":"+c.getMinutes()+":"+c.getSeconds()+"."+c.getMilliseconds();b[0]=d+" - "+b[0];try{switch(a){case"info":window.console.info.apply(window.console,b);break;case"warn":window.console.warn.apply(window.console,b);break;default:window.console.log.apply(window.console,b)}}catch(e){window.console?-2146827850===e.number&&window.console.log(b.join(", ")):_canLog=!1}}}function logMsg(){Array.prototype.unshift.apply(arguments,["debug"]),_log.apply(this,arguments)}var _canLog=!0,getDynaTreePersistData=null,DTNodeStatus_Error=-1,DTNodeStatus_Loading=1,DTNodeStatus_Ok=0;!function($){function getDtNodeFromElement(a){return alert("getDtNodeFromElement is deprecated"),$.ui.dynatree.getNode(a)}function noop(){}function offsetString(a){return 0===a?"":a>0?"+"+a:""+a}function _checkBrowser(){function a(a){a=a.toLowerCase();var b=/(chrome)[ \/]([
 \w.]+)/.exec(a)||/(webkit)[ \/]([\w.]+)/.exec(a)||/(opera)(?:.*version|)[ \/]([\w.]+)/.exec(a)||/(msie) ([\w.]+)/.exec(a)||a.indexOf("compatible")<0&&/(mozilla)(?:.*? rv:([\w.]+)|)/.exec(a)||[];return{browser:b[1]||"",version:b[2]||"0"}}var b,c;return b=a(navigator.userAgent),c={},b.browser&&(c[b.browser]=!0,c.version=b.version),c.chrome?c.webkit=!0:c.webkit&&(c.safari=!0),c}function versionCompare(a,b){var c,d,e,f=(""+a).split("."),g=(""+b).split("."),h=Math.min(f.length,g.length);for(e=0;h>e;e++)if(c=parseInt(f[e],10),d=parseInt(g[e],10),isNaN(c)&&(c=f[e]),isNaN(d)&&(d=g[e]),c!=d)return c>d?1:d>c?-1:0/0;return f.length===g.length?0:f.length<g.length?-1:1}function _initDragAndDrop(a){var b=a.options.dnd||null;b&&(b.onDragStart||b.onDrop)&&_registerDnd(),b&&b.onDragStart&&a.$tree.draggable({addClasses:!1,appendTo:"body",containment:!1,delay:0,distance:4,revert:b.revert!==!0?!1:function(a){if(logMsg("draggable.revert(), dropped=",a),"boolean"==typeof a)return!a;var b=$.ui.ddmanager&&
 $.ui.ddmanager.current&&$.ui.ddmanager.current.helper,c=b&&b.hasClass("dynatree-drop-reject");return c},scroll:!0,scrollSpeed:7,scrollSensitivity:10,connectToDynatree:!0,helper:function(a){var b=$.ui.dynatree.getNode(a.target);return b?b.tree._onDragEvent("helper",b,null,a,null,null):"<div></div>"},start:function(a,b){var c=b.helper.data("dtSourceNode");return!!c}}),b&&b.onDrop&&a.$tree.droppable({addClasses:!1,tolerance:"pointer",greedy:!1})}var Class={create:function(){return function(){this.initialize.apply(this,arguments)}}},BROWSER=_checkBrowser(),jquerySupports={positionMyOfs:versionCompare($.ui.version,"1.9")>=0},DynaTreeNode=Class.create();DynaTreeNode.prototype={initialize:function(a,b,c){this.parent=a,this.tree=b,"string"==typeof c&&(c={title:c}),c.key=null==c.key?"_"+b._nodeCount++:""+c.key,this.data=$.extend({},$.ui.dynatree.nodedatadefaults,c),this.li=null,this.span=null,this.ul=null,this.childList=null,this._isLoading=!1,this.hasSubSel=!1,this.bExpanded=!1,this.bSelect
 ed=!1},toString:function(){return"DynaTreeNode<"+this.data.key+">: '"+this.data.title+"'"},toDict:function(a,b){var c,d=$.extend({},this.data);if(d.activate=this.tree.activeNode===this,d.focus=this.tree.focusNode===this,d.expand=this.bExpanded,d.select=this.bSelected,b&&b(d),a&&this.childList){d.children=[];for(var e=0,f=this.childList.length;f>e;e++)c=this.childList[e],c.isStatusNode()||d.children.push(c.toDict(!0,b))}else delete d.children;return d},fromDict:function(a){var b=a.children;return void 0===b?(this.data=$.extend(this.data,a),void this.render()):(a=$.extend({},a),a.children=void 0,this.data=$.extend(this.data,a),this.removeChildren(),void this.addChild(b))},_getInnerHtml:function(){var a,b=this.tree,c=b.options,d=b.cache,e=this.getLevel(),f=this.data,g="";e<c.minExpandLevel?e>1&&(g+=d.tagConnector):g+=this.hasChildren()!==!1?d.tagExpander:d.tagConnector,c.checkbox&&f.hideCheckbox!==!0&&!f.isStatusNode&&(g+=d.tagCheckbox),f.icon?(a="/"===f.icon.charAt(0)?f.icon:c.imagePa
 th+f.icon,g+="<img src='"+a+"' alt='' />"):f.icon===!1||(g+=f.iconClass?"<span class=' "+f.iconClass+"'></span>":d.tagNodeIcon);var h="";if(c.onCustomRender&&(h=c.onCustomRender.call(b,this)||""),!h){var i=f.tooltip?' title="'+f.tooltip.replace(/\"/g,"&quot;")+'"':"",j=f.href||"#";h=c.noLink||f.noLink?'<span style="display:inline-block;" class="'+c.classNames.title+'"'+i+">"+f.title+"</span>":'<a href="'+j+'" class="'+c.classNames.title+'"'+i+">"+f.title+"</a>"}return g+=h},_fixOrder:function(){var a=this.childList;if(a&&this.ul)for(var b=this.ul.firstChild,c=0,d=a.length-1;d>c;c++){var e=a[c],f=b.dtnode;e!==f?(this.tree.logDebug("_fixOrder: mismatch at index "+c+": "+e+" != "+f),this.ul.insertBefore(e.li,f.li)):b=b.nextSibling}},render:function(a,b){var c=this.tree,d=this.parent,e=this.data,f=c.options,g=f.classNames,h=this.isLastSibling(),i=!1;if(d||this.ul){if(d){this.li||(i=!0,this.li=document.createElement("li"),this.li.dtnode=this,e.key&&f.generateIds&&(this.li.id=f.idPrefix+e
 .key),this.span=document.createElement("span"),this.span.className=g.title,this.li.appendChild(this.span),d.ul||(d.ul=document.createElement("ul"),d.ul.style.display="none",d.li.appendChild(d.ul)),d.ul.appendChild(this.li)),this.span.innerHTML=this._getInnerHtml();var j=[];j.push(g.node),e.isFolder&&j.push(g.folder),this.bExpanded&&j.push(g.expanded),this.hasChildren()!==!1&&j.push(g.hasChildren),e.isLazy&&null===this.childList&&j.push(g.lazy),h&&j.push(g.lastsib),this.bSelected&&j.push(g.selected),this.hasSubSel&&j.push(g.partsel),c.activeNode===this&&j.push(g.active),e.addClass&&j.push(e.addClass),j.push(g.combinedExpanderPrefix+(this.bExpanded?"e":"c")+(e.isLazy&&null===this.childList?"d":"")+(h?"l":"")),j.push(g.combinedIconPrefix+(this.bExpanded?"e":"c")+(e.isFolder?"f":"")),this.span.className=j.join(" "),this.li.className=h?g.lastsib:"",i&&f.onCreate&&f.onCreate.call(c,this,this.span),f.onRender&&f.onRender.call(c,this,this.span)}}else this.li=this.span=null,this.ul=document.
 createElement("ul"),this.ul.className=f.minExpandLevel>1?g.container+" "+g.noConnector:g.container;if((this.bExpanded||b===!0)&&this.childList){for(var k=0,l=this.childList.length;l>k;k++)this.childList[k].render(!1,b);this._fixOrder()}if(this.ul){var m="none"===this.ul.style.display,n=!!this.bExpanded;if(a&&f.fx&&m===n){var o=f.fx.duration||200;$(this.ul).animate(f.fx,o)}else this.ul.style.display=this.bExpanded||!d?"":"none"}},getKeyPath:function(a){var b=[],c=this.tree.options.keyPathSeparator;return this.visitParents(function(a){a.parent&&b.unshift(a.data.key)},!a),c+b.join(c)},getParent:function(){return this.parent},getChildren:function(){return void 0===this.hasChildren()?void 0:this.childList},hasChildren:function(){return this.data.isLazy?null===this.childList||void 0===this.childList?void 0:0===this.childList.length?!1:1===this.childList.length&&this.childList[0].isStatusNode()?void 0:!0:!!this.childList},isFirstSibling:function(){var a=this.parent;return!a||a.childList[0]
 ===this},isLastSibling:function(){var a=this.parent;return!a||a.childList[a.childList.length-1]===this},isLoading:function(){return!!this._isLoading},getPrevSibling:function(){if(!this.parent)return null;for(var a=this.parent.childList,b=1,c=a.length;c>b;b++)if(a[b]===this)return a[b-1];return null},getNextSibling:function(){if(!this.parent)return null;for(var a=this.parent.childList,b=0,c=a.length-1;c>b;b++)if(a[b]===this)return a[b+1];return null},isStatusNode:function(){return this.data.isStatusNode===!0},isChildOf:function(a){return this.parent&&this.parent===a},isDescendantOf:function(a){if(!a)return!1;for(var b=this.parent;b;){if(b===a)return!0;b=b.parent}return!1},countChildren:function(){var a=this.childList;if(!a)return 0;for(var b=a.length,c=0,d=b;d>c;c++){var e=a[c];b+=e.countChildren()}return b},sortChildren:function(a,b){var c=this.childList;if(c){if(a=a||function(a,b){var c=a.data.title.toLowerCase(),d=b.data.title.toLowerCase();return c===d?0:c>d?1:-1},c.sort(a),b)for
 (var d=0,e=c.length;e>d;d++)c[d].childList&&c[d].sortChildren(a,"$norender$");"$norender$"!==b&&this.render()}},_setStatusNode:function(a){var b=this.childList?this.childList[0]:null;if(a)b?(a.isStatusNode=!0,a.key="_statusNode",b.data=a,b.render()):(a.isStatusNode=!0,a.key="_statusNode",b=this.addChild(a));else if(b&&b.isStatusNode()){try{this.ul&&(this.ul.removeChild(b.li),b.li=null)}catch(c){}1===this.childList.length?this.childList=[]:this.childList.shift()}},setLazyNodeStatus:function(a,b){var c=b&&b.tooltip?b.tooltip:null,d=b&&b.info?" ("+b.info+")":"";switch(a){case DTNodeStatus_Ok:this._setStatusNode(null),$(this.span).removeClass(this.tree.options.classNames.nodeLoading),this._isLoading=!1,this.tree.options.autoFocus&&(this===this.tree.tnRoot&&this.childList&&this.childList.length>0?this.childList[0].focus():this.focus());break;case DTNodeStatus_Loading:this._isLoading=!0,$(this.span).addClass(this.tree.options.classNames.nodeLoading),this.parent||this._setStatusNode({title
 :this.tree.options.strings.loading+d,tooltip:c,addClass:this.tree.options.classNames.nodeWait});break;case DTNodeStatus_Error:this._isLoading=!1,this._setStatusNode({title:this.tree.options.strings.loadError+d,tooltip:c,addClass:this.tree.options.classNames.nodeError});break;default:throw"Bad LazyNodeStatus: '"+a+"'."}},_parentList:function(a,b){for(var c=[],d=b?this:this.parent;d;)(a||d.parent)&&c.unshift(d),d=d.parent;return c},getLevel:function(){for(var a=0,b=this.parent;b;)a++,b=b.parent;return a},_getTypeForOuterNodeEvent:function(a){var b=this.tree.options.classNames,c=a.target;if(c.className.indexOf(b.node)<0)return null;for(var d=a.pageX-c.offsetLeft,e=a.pageY-c.offsetTop,f=0,g=c.childNodes.length;g>f;f++){var h=c.childNodes[f],i=h.offsetLeft-c.offsetLeft,j=h.offsetTop-c.offsetTop,k=h.clientWidth,l=h.clientHeight;if(d>=i&&i+k>=d&&e>=j&&j+l>=e){if(h.className==b.title)return"title";if(h.className==b.expander)return"expander";if(h.className==b.checkbox||h.className==b.radio)r
 eturn"checkbox";if(h.className==b.nodeIcon)return"icon"}}return"prefix"},getEventTargetType:function(a){var b=a&&a.target?a.target.className:"",c=this.tree.options.classNames;return b.indexOf(c.title)>=0?"title":b.indexOf(c.expander)>=0?"expander":b.indexOf(c.checkbox)>=0||b.indexOf(c.radio)>=0?"checkbox":b.indexOf(c.nodeIcon)>=0?"icon":b.indexOf(c.empty)>=0||b.indexOf(c.vline)>=0||b.indexOf(c.connector)>=0?"prefix":b.indexOf(c.node)>=0?this._getTypeForOuterNodeEvent(a):null},isVisible:function(){for(var a=this._parentList(!0,!1),b=0,c=a.length;c>b;b++)if(!a[b].bExpanded)return!1;return!0},makeVisible:function(){for(var a=this._parentList(!0,!1),b=0,c=a.length;c>b;b++)a[b]._expand(!0)},focus:function(){this.makeVisible();try{$(this.span).find(">a").focus()}catch(a){}},isFocused:function(){return this.tree.tnFocused===this},_activate:function(a,b){this.tree.logDebug("dtnode._activate(%o, fireEvents=%o) - %o",a,b,this);var c=this.tree.options;if(!this.data.isStatusNode)if(a){if(b&&c.o
 nQueryActivate&&c.onQueryActivate.call(this.tree,a,this)===!1)return;if(this.tree.activeNode){if(this.tree.activeNode===this)return;this.tree.activeNode.deactivate()}c.activeVisible&&this.makeVisible(),this.tree.activeNode=this,c.persist&&$.cookie(c.cookieId+"-active",this.data.key,c.cookie),this.tree.persistence.activeKey=this.data.key,$(this.span).addClass(c.classNames.active),b&&c.onActivate&&c.onActivate.call(this.tree,this)}else if(this.tree.activeNode===this){if(c.onQueryActivate&&c.onQueryActivate.call(this.tree,!1,this)===!1)return;$(this.span).removeClass(c.classNames.active),c.persist&&$.cookie(c.cookieId+"-active","",c.cookie),this.tree.persistence.activeKey=null,this.tree.activeNode=null,b&&c.onDeactivate&&c.onDeactivate.call(this.tree,this)}},activate:function(){this._activate(!0,!0)},activateSilently:function(){this._activate(!0,!1)},deactivate:function(){this._activate(!1,!0)},isActive:function(){return this.tree.activeNode===this},_userActivate:function(){var a=!0,b=
 !1;if(this.data.isFolder)switch(this.tree.options.clickFolderMode){case 2:a=!1,b=!0;break;case 3:a=b=!0}null===this.parent&&(b=!1),b&&(this.toggleExpand(),this.focus()),a&&this.activate()},_setSubSel:function(a){a?(this.hasSubSel=!0,$(this.span).addClass(this.tree.options.classNames.partsel)):(this.hasSubSel=!1,$(this.span).removeClass(this.tree.options.classNames.partsel))},_updatePartSelectionState:function(){var a;if(!this.hasChildren())return a=this.bSelected&&!this.data.unselectable&&!this.data.isStatusNode,this._setSubSel(!1),a;var b,c,d=this.childList,e=!0,f=!0;for(b=0,c=d.length;c>b;b++){var g=d[b],h=g._updatePartSelectionState();h!==!1&&(f=!1),h!==!0&&(e=!1)}return a=e?!0:f?!1:void 0,this._setSubSel(void 0===a),this.bSelected=a===!0,a},_fixSelectionState:function(){var a,b,c;if(this.bSelected)for(this.visit(function(a){a.parent._setSubSel(!0),a.data.unselectable||a._select(!0,!1,!1)}),a=this.parent;a;){a._setSubSel(!0);var d=!0;for(b=0,c=a.childList.length;c>b;b++){var e=a.
 childList[b];if(!e.bSelected&&!e.data.isStatusNode&&!e.data.unselectable){d=!1;break}}d&&a._select(!0,!1,!1),a=a.parent}else for(this._setSubSel(!1),this.visit(function(a){a._setSubSel(!1),a._select(!1,!1,!1)}),a=this.parent;a;){a._select(!1,!1,!1);var f=!1;for(b=0,c=a.childList.length;c>b;b++)if(a.childList[b].bSelected||a.childList[b].hasSubSel){f=!0;break}a._setSubSel(f),a=a.parent}},_select:function(a,b,c){var d=this.tree.options;this.data.isStatusNode||this.bSelected!==a&&(b&&d.onQuerySelect&&d.onQuerySelect.call(this.tree,a,this)===!1||(1==d.selectMode&&a&&this.tree.visit(function(a){return a.bSelected?(a._select(!1,!1,!1),!1):void 0}),this.bSelected=a,a?(d.persist&&this.tree.persistence.addSelect(this.data.key),$(this.span).addClass(d.classNames.selected),c&&3===d.selectMode&&this._fixSelectionState(),b&&d.onSelect&&d.onSelect.call(this.tree,!0,this)):(d.persist&&this.tree.persistence.clearSelect(this.data.key),$(this.span).removeClass(d.classNames.selected),c&&3===d.selectMo
 de&&this._fixSelectionState(),b&&d.onSelect&&d.onSelect.call(this.tree,!1,this))))},select:function(a){return this.data.unselectable?this.bSelected:this._select(a!==!1,!0,!0)},toggleSelect:function(){return this.select(!this.bSelected)},isSelected:function(){return this.bSelected},isLazy:function(){return!!this.data.isLazy},_loadContent:function(){try{var a=this.tree.options;this.tree.logDebug("_loadContent: start - %o",this),this.setLazyNodeStatus(DTNodeStatus_Loading),!0===a.onLazyRead.call(this.tree,this)&&(this.setLazyNodeStatus(DTNodeStatus_Ok),this.tree.logDebug("_loadContent: succeeded - %o",this))}catch(b){this.tree.logWarning("_loadContent: failed - %o",b),this.setLazyNodeStatus(DTNodeStatus_Error,{tooltip:""+b})}},_expand:function(a,b){if(this.bExpanded===a)return void this.tree.logDebug("dtnode._expand(%o) IGNORED - %o",a,this);this.tree.logDebug("dtnode._expand(%o) - %o",a,this);var c=this.tree.options;if(!a&&this.getLevel()<c.minExpandLevel)return void this.tree.logDebu
 g("dtnode._expand(%o) prevented collapse - %o",a,this);if(!c.onQueryExpand||c.onQueryExpand.call(this.tree,a,this)!==!1){this.bExpanded=a,c.persist&&(a?this.tree.persistence.addExpand(this.data.key):this.tree.persistence.clearExpand(this.data.key));var d=!(this.data.isLazy&&null===this.childList||this._isLoading||b);if(this.render(d),this.bExpanded&&this.parent&&c.autoCollapse)for(var e=this._parentList(!1,!0),f=0,g=e.length;g>f;f++)e[f].collapseSiblings();return c.activeVisible&&this.tree.activeNode&&!this.tree.activeNode.isVisible()&&this.tree.activeNode.deactivate(),a&&this.data.isLazy&&null===this.childList&&!this._isLoading?void this._loadContent():void(c.onExpand&&c.onExpand.call(this.tree,a,this))}},isExpanded:function(){return this.bExpanded},expand:function(a){a=a!==!1,(this.childList||this.data.isLazy||!a)&&(null!==this.parent||a)&&this._expand(a)},scheduleAction:function(a,b){this.tree.timer&&(clearTimeout(this.tree.timer),this.tree.logDebug("clearTimeout(%o)",this.tree.t
 imer));var c=this;switch(a){case"cancel":break;case"expand":this.tree.timer=setTimeout(function(){c.tree.logDebug("setTimeout: trigger expand"),c.expand(!0)},b);break;case"activate":this.tree.timer=setTimeout(function(){c.tree.logDebug("setTimeout: trigger activate"),c.activate()},b);break;default:throw"Invalid mode "+a}this.tree.logDebug("setTimeout(%s, %s): %s",a,b,this.tree.timer)},toggleExpand:function(){this.expand(!this.bExpanded)},collapseSiblings:function(){if(null!==this.parent)for(var a=this.parent.childList,b=0,c=a.length;c>b;b++)a[b]!==this&&a[b].bExpanded&&a[b]._expand(!1)},_onClick:function(a){var b=this.getEventTargetType(a);if("expander"===b)this.toggleExpand(),this.focus();else if("checkbox"===b)this.toggleSelect(),this.focus();else{this._userActivate();var c=this.span.getElementsByTagName("a");if(!c[0])return!0;BROWSER.msie&&parseInt(BROWSER.version,10)<9||c[0].focus()}a.preventDefault()},_onDblClick:function(){},_onKeydown:function(a){var b,c=!0;switch(a.which){ca
 se 107:case 187:this.bExpanded||this.toggleExpand();break;case 109:case 189:this.bExpanded&&this.toggleExpand();break;case 32:this._userActivate();break;case 8:this.parent&&this.parent.focus();break;case 37:this.bExpanded?(this.toggleExpand(),this.focus()):this.parent&&this.parent.parent&&this.parent.focus();break;case 39:this.bExpanded||!this.childList&&!this.data.isLazy?this.childList&&this.childList[0].focus():(this.toggleExpand(),this.focus());break;case 38:for(b=this.getPrevSibling();b&&b.bExpanded&&b.childList;)b=b.childList[b.childList.length-1];!b&&this.parent&&this.parent.parent&&(b=this.parent),b&&b.focus();break;case 40:if(this.bExpanded&&this.childList)b=this.childList[0];else for(var d=this._parentList(!1,!0),e=d.length-1;e>=0&&!(b=d[e].getNextSibling());e--);b&&b.focus();break;default:c=!1}c&&a.preventDefault()},_onKeypress:function(){},_onFocus:function(a){var b=this.tree.options;"blur"==a.type||"focusout"==a.type?(b.onBlur&&b.onBlur.call(this.tree,this),this.tree.tnF
 ocused&&$(this.tree.tnFocused.span).removeClass(b.classNames.focused),this.tree.tnFocused=null,b.persist&&$.cookie(b.cookieId+"-focus","",b.cookie)):("focus"==a.type||"focusin"==a.type)&&(this.tree.tnFocused&&this.tree.tnFocused!==this&&(this.tree.logDebug("dtnode.onFocus: out of sync: curFocus: %o",this.tree.tnFocused),$(this.tree.tnFocused.span).removeClass(b.classNames.focused)),this.tree.tnFocused=this,b.onFocus&&b.onFocus.call(this.tree,this),$(this.tree.tnFocused.span).addClass(b.classNames.focused),b.persist&&$.cookie(b.cookieId+"-focus",this.data.key,b.cookie))},visit:function(a,b){var c=!0;if(b===!0&&(c=a(this),c===!1||"skip"===c))return c;if(this.childList)for(var d=0,e=this.childList.length;e>d&&(c=this.childList[d].visit(a,!0),c!==!1);d++);return c},visitParents:function(a,b){if(b&&a(this)===!1)return!1;for(var c=this.parent;c;){if(a(c)===!1)return!1;c=c.parent}return!0},remove:function(){if(this===this.tree.root)throw"Cannot remove system root";return this.parent.remove
 Child(this)},removeChild:function(a){var b=this.childList;if(1===b.length){if(a!==b[0])throw"removeChild: invalid child";return this.removeChildren()}a===this.tree.activeNode&&a.deactivate(),this.tree.options.persist&&(a.bSelected&&this.tree.persistence.clearSelect(a.data.key),a.bExpanded&&this.tree.persistence.clearExpand(a.data.key)),a.removeChildren(!0),this.ul&&a.li&&this.ul.removeChild(a.li);for(var c=0,d=b.length;d>c;c++)if(b[c]===a){this.childList.splice(c,1);break}},removeChildren:function(a,b){this.tree.logDebug("%s.removeChildren(%o)",this,a);var c=this.tree,d=this.childList;if(d){for(var e=0,f=d.length;f>e;e++){var g=d[e];g!==c.activeNode||b||g.deactivate(),this.tree.options.persist&&!b&&(g.bSelected&&this.tree.persistence.clearSelect(g.data.key),g.bExpanded&&this.tree.persistence.clearExpand(g.data.key)),g.removeChildren(!0,b),this.ul&&g.li&&$("li",$(this.ul)).remove()}this.childList=null}a||(this._isLoading=!1,this.render())},setTitle:function(a){this.fromDict({title:a}
 )},reload:function(){throw"Use reloadChildren() instead"},reloadChildren:function(a){if(null===this.parent)throw"Use tree.reload() instead";if(!this.data.isLazy)throw"node.reloadChildren() requires lazy nodes.";if(a){var b=this,c="nodeLoaded.dynatree."+this.tree.$tree.attr("id")+"."+this.data.key;this.tree.$tree.bind(c,function(d,e,f){if(b.tree.$tree.unbind(c),b.tree.logDebug("loaded %o, %o, %o",d,e,f),e!==b)throw"got invalid load event";a.call(b.tree,e,f)})}this.removeChildren(),this._loadContent()},_loadKeyPath:function(a,b){var c=this.tree;if(c.logDebug("%s._loadKeyPath(%s)",this,a),""===a)throw"Key path must not be empty";var d=a.split(c.options.keyPathSeparator);if(""===d[0])throw"Key path must be relative (don't start with '/')";var e=d.shift();if(this.childList)for(var f=0,g=this.childList.length;g>f;f++){var h=this.childList[f];if(h.data.key===e){if(0===d.length)b.call(c,h,"ok");else if(!h.data.isLazy||null!==h.childList&&void 0!==h.childList)b.call(c,h,"loaded"),h._loadKeyP
 ath(d.join(c.options.keyPathSeparator),b);else{c.logDebug("%s._loadKeyPath(%s) -> reloading %s...",this,a,h);var i=this;h.reloadChildren(function(e,f){f?(c.logDebug("%s._loadKeyPath(%s) -> reloaded %s.",e,a,e),b.call(c,h,"loaded"),e._loadKeyPath(d.join(c.options.keyPathSeparator),b)):(c.logWarning("%s._loadKeyPath(%s) -> reloadChildren() failed.",i,a),b.call(c,h,"error"))})}return}}b.call(c,void 0,"notfound",e,0===d.length),c.logWarning("Node not found: "+e)},resetLazy:function(){if(null===this.parent)throw"Use tree.reload() instead";if(!this.data.isLazy)throw"node.resetLazy() requires lazy nodes.";this.expand(!1),this.removeChildren()},_addChildNode:function(a,b){var c=this.tree,d=c.options,e=c.persistence;if(a.parent=this,null===this.childList?this.childList=[]:b||this.childList.length>0&&$(this.childList[this.childList.length-1].span).removeClass(d.classNames.lastsib),b){var f=$.inArray(b,this.childList);if(0>f)throw"<beforeNode> must be a child of <this>";this.childList.splice(f
 ,0,a)}else this.childList.push(a);var g=c.isInitializing();if(d.persist&&e.cookiesFound&&g?(e.activeKey===a.data.key&&(c.activeNode=a),e.focusedKey===a.data.key&&(c.focusNode=a),a.bExpanded=$.inArray(a.data.key,e.expandedKeyList)>=0,a.bSelected=$.inArray(a.data.key,e.selectedKeyList)>=0):(a.data.activate&&(c.activeNode=a,d.persist&&(e.activeKey=a.data.key)),a.data.focus&&(c.focusNode=a,d.persist&&(e.focusedKey=a.data.key)),a.bExpanded=a.data.expand===!0,a.bExpanded&&d.persist&&e.addExpand(a.data.key),a.bSelected=a.data.select===!0,a.bSelected&&d.persist&&e.addSelect(a.data.key)),d.minExpandLevel>=a.getLevel()&&(this.bExpanded=!0),a.bSelected&&3==d.selectMode)for(var h=this;h;)h.hasSubSel||h._setSubSel(!0),h=h.parent;return c.bEnableUpdate&&this.render(),a},addChild:function(a,b){if("string"==typeof a)throw"Invalid data type for "+a;if(a&&0!==a.length){if(a instanceof DynaTreeNode)return this._addChildNode(a,b);a.length||(a=[a]);for(var c=this.tree.enableUpdate(!1),d=null,e=0,f=a.len
 gth;f>e;e++){var g=a[e],h=this._addChildNode(new DynaTreeNode(this,this.tree,g),b);d||(d=h),g.children&&h.addChild(g.children,null)}return this.tree.enableUpdate(c),d}},append:function(a){return this.tree.logWarning("node.append() is deprecated (use node.addChild() instead)."),this.addChild(a,null)},appendAjax:function(a){var b=this;if(this.removeChildren(!1,!0),this.setLazyNodeStatus(DTNodeStatus_Loading),a.debugLazyDelay){var c=a.debugLazyDelay;return a.debugLazyDelay=0,this.tree.logInfo("appendAjax: waiting for debugLazyDelay "+c),void setTimeout(function(){b.appendAjax(a)},c)}var d=a.success,e=a.error,f="nodeLoaded.dynatree."+this.tree.$tree.attr("id")+"."+this.data.key,g=$.extend({},this.tree.options.ajaxDefaults,a,{success:function(a,c){var e=b.tree.phase,g=b.tree.options;b.tree.phase="init",g.postProcess?a=g.postProcess.call(this,a,this.dataType):a&&a.hasOwnProperty("d")&&(a="string"==typeof a.d?$.parseJSON(a.d):a.d),$.isArray(a)&&0===a.length||b.addChild(a,null),b.tree.phase
 ="postInit",d&&d.call(g,b,a,c),b.tree.logDebug("trigger "+f),b.tree.$tree.trigger(f,[b,!0]),b.tree.phase=e,b.setLazyNodeStatus(DTNodeStatus_Ok),$.isArray(a)&&0===a.length&&(b.childList=[],b.render())},error:function(a,c,d){b.tree.logWarning("appendAjax failed:",c,":\n",a,"\n",d),e&&e.call(g,b,a,c,d),b.tree.$tree.trigger(f,[b,!1]),b.setLazyNodeStatus(DTNodeStatus_Error,{info:c,tooltip:""+d})}});$.ajax(g)},move:function(a,b){var c;if(this!==a){if(!this.parent)throw"Cannot move system root";(void 0===b||"over"==b)&&(b="child");var d=this.parent,e="child"===b?a:a.parent;if(e.isDescendantOf(this))throw"Cannot move a node to it's own descendant";if(1==this.parent.childList.length)this.parent.childList=this.parent.data.isLazy?[]:null,this.parent.bExpanded=!1;else{if(c=$.inArray(this,this.parent.childList),0>c)throw"Internal error";this.parent.childList.splice(c,1)}if(this.parent.ul&&this.li&&this.parent.ul.removeChild(this.li),this.parent=e,e.hasChildren())switch(b){case"child":e.childList
 .push(this);break;case"before":if(c=$.inArray(a,e.childList),0>c)throw"Internal error";e.childList.splice(c,0,this);break;case"after":if(c=$.inArray(a,e.childList),0>c)throw"Internal error";e.childList.splice(c+1,0,this);break;default:throw"Invalid mode "+b}else e.childList=[this];if(e.ul||(e.ul=document.createElement("ul"),e.ul.style.display="none",e.li&&e.li.appendChild(e.ul)),this.li&&e.ul.appendChild(this.li),this.tree!==a.tree)throw this.visit(function(b){b.tree=a.tree},null,!0),"Not yet implemented.";d.isDescendantOf(e)||d.render(),e.isDescendantOf(d)||e.render()}},lastentry:void 0};var DynaTreeStatus=Class.create();DynaTreeStatus._getTreePersistData=function(a,b){var c=new DynaTreeStatus(a,b);return c.read(),c.toDict()},getDynaTreePersistData=DynaTreeStatus._getTreePersistData,DynaTreeStatus.prototype={initialize:function(a,b){void 0===a&&(a=$.ui.dynatree.prototype.options.cookieId),b=$.extend({},$.ui.dynatree.prototype.options.cookie,b),this.cookieId=a,this.cookieOpts=b,this
 .cookiesFound=void 0,this.activeKey=null,this.focusedKey=null,this.expandedKeyList=null,this.selectedKeyList=null},_log:function(){Array.prototype.unshift.apply(arguments,["debug"]),_log.apply(this,arguments)},read:function(){this.cookiesFound=!1;var a=$.cookie(this.cookieId+"-active");this.activeKey=a||"",a&&(this.cookiesFound=!0),a=$.cookie(this.cookieId+"-focus"),this.focusedKey=a||"",a&&(this.cookiesFound=!0),a=$.cookie(this.cookieId+"-expand"),this.expandedKeyList=a?a.split(","):[],a&&(this.cookiesFound=!0),a=$.cookie(this.cookieId+"-select"),this.selectedKeyList=a?a.split(","):[],a&&(this.cookiesFound=!0)},write:function(){$.cookie(this.cookieId+"-active",null===this.activeKey?"":this.activeKey,this.cookieOpts),$.cookie(this.cookieId+"-focus",null===this.focusedKey?"":this.focusedKey,this.cookieOpts),$.cookie(this.cookieId+"-expand",null===this.expandedKeyList?"":this.expandedKeyList.join(","),this.cookieOpts),$.cookie(this.cookieId+"-select",null===this.selectedKeyList?"":thi
 s.selectedKeyList.join(","),this.cookieOpts)},addExpand:function(a){$.inArray(a,this.expandedKeyList)<0&&(this.expandedKeyList.push(a),$.cookie(this.cookieId+"-expand",this.expandedKeyList.join(","),this.cookieOpts))},clearExpand:function(a){var b=$.inArray(a,this.expandedKeyList);b>=0&&(this.expandedKeyList.splice(b,1),$.cookie(this.cookieId+"-expand",this.expandedKeyList.join(","),this.cookieOpts))},addSelect:function(a){$.inArray(a,this.selectedKeyList)<0&&(this.selectedKeyList.push(a),$.cookie(this.cookieId+"-select",this.selectedKeyList.join(","),this.cookieOpts))},clearSelect:function(a){var b=$.inArray(a,this.selectedKeyList);b>=0&&(this.selectedKeyList.splice(b,1),$.cookie(this.cookieId+"-select",this.selectedKeyList.join(","),this.cookieOpts))},isReloading:function(){return this.cookiesFound===!0},toDict:function(){return{cookiesFound:this.cookiesFound,activeKey:this.activeKey,focusedKey:this.activeKey,expandedKeyList:this.expandedKeyList,selectedKeyList:this.selectedKeyLis
 t}},lastentry:void 0};var DynaTree=Class.create();DynaTree.version="@@Version",DynaTree.prototype={initialize:function(a){this.phase="init",this.$widget=a,this.options=a.options,this.$tree=a.element,this.timer=null,this.divTree=this.$tree.get(0),_initDragAndDrop(this)},_load:function(a){var b=(this.$widget,this.options),c=this;this.bEnableUpdate=!0,this._nodeCount=1,this.activeNode=null,this.focusNode=null,void 0!==b.rootVisible&&this.logWarning("Option 'rootVisible' is no longer supported."),b.minExpandLevel<1&&(this.logWarning("Option 'minExpandLevel' must be >= 1."),b.minExpandLevel=1),b.classNames!==$.ui.dynatree.prototype.options.classNames&&(b.classNames=$.extend({},$.ui.dynatree.prototype.options.classNames,b.classNames)),b.ajaxDefaults!==$.ui.dynatree.prototype.options.ajaxDefaults&&(b.ajaxDefaults=$.extend({},$.ui.dynatree.prototype.options.ajaxDefaults,b.ajaxDefaults)),b.dnd!==$.ui.dynatree.prototype.options.dnd&&(b.dnd=$.extend({},$.ui.dynatree.prototype.options.dnd,b.dnd
 )),b.imagePath||$("script").each(function(){var a=/.*dynatree[^\/]*\.js$/i;return this.src.search(a)>=0?(b.imagePath=this.src.indexOf("/")>=0?this.src.slice(0,this.src.lastIndexOf("/"))+"/skin/":"skin/",c.logDebug("Guessing imagePath from '%s': '%s'",this.src,b.imagePath),!1):void 0}),this.persistence=new DynaTreeStatus(b.cookieId,b.cookie),b.persist&&($.cookie||_log("warn","Please include jquery.cookie.js to use persistence."),this.persistence.read()),this.logDebug("DynaTree.persistence: %o",this.persistence.toDict()),this.cache={tagEmpty:"<span class='"+b.classNames.empty+"'></span>",tagVline:"<span class='"+b.classNames.vline+"'></span>",tagExpander:"<span class='"+b.classNames.expander+"'></span>",tagConnector:"<span class='"+b.classNames.connector+"'></span>",tagNodeIcon:"<span class='"+b.classNames.nodeIcon+"'></span>",tagCheckbox:"<span class='"+b.classNames.checkbox+"'></span>",lastentry:void 0},(b.children||b.initAjax&&b.initAjax.url||b.initId)&&$(this.divTree).empty();var 
 d=this.$tree.find(">ul:first").hide();this.tnRoot=new DynaTreeNode(null,this,{}),this.tnRoot.bExpanded=!0,this.tnRoot.render(),this.divTree.appendChild(this.tnRoot.ul);var e=this.tnRoot,f=b.persist&&this.persistence.isReloading(),g=!1,h=this.enableUpdate(!1);this.logDebug("Dynatree._load(): read tree structure..."),b.children?e.addChild(b.children):b.initAjax&&b.initAjax.url?(g=!0,e.data.isLazy=!0,this._reloadAjax(a)):b.initId?this._createFromTag(e,$("#"+b.initId)):(this._createFromTag(e,d),d.remove()),this._checkConsistency(),g||3!=b.selectMode||e._updatePartSelectionState(),this.logDebug("Dynatree._load(): render nodes..."),this.enableUpdate(h),this.logDebug("Dynatree._load(): bind events..."),this.$widget.bind(),this.logDebug("Dynatree._load(): postInit..."),this.phase="postInit",b.persist&&this.persistence.write(),this.focusNode&&this.focusNode.isVisible()&&(this.logDebug("Focus on init: %o",this.focusNode),this.focusNode.focus()),g||(b.onPostInit&&b.onPostInit.call(this,f,!1),a
 &&a.call(this,"ok")),this.phase="idle"},_reloadAjax:function(a){var b=this.options;if(!b.initAjax||!b.initAjax.url)throw"tree.reload() requires 'initAjax' mode.";var c=this.persistence,d=$.extend({},b.initAjax);d.addActiveKey&&(d.data.activeKey=c.activeKey),d.addFocusedKey&&(d.data.focusedKey=c.focusedKey),d.addExpandedKeyList&&(d.data.expandedKeyList=c.expandedKeyList.join(",")),d.addSelectedKeyList&&(d.data.selectedKeyList=c.selectedKeyList.join(",")),d.success&&this.logWarning("initAjax: success callback is ignored; use onPostInit instead."),d.error&&this.logWarning("initAjax: error callback is ignored; use onPostInit instead.");var e=c.isReloading();d.success=function(c){3==b.selectMode&&c.tree.tnRoot._updatePartSelectionState(),b.onPostInit&&b.onPostInit.call(c.tree,e,!1),a&&a.call(c.tree,"ok")},d.error=function(c,d,f,g){b.onPostInit&&b.onPostInit.call(c.tree,e,!0,d,f,g),a&&a.call(c.tree,"error",d,f,g)},this.logDebug("Dynatree._init(): send Ajax request..."),this.tnRoot.appendA
 jax(d)},toString:function(){return"Dynatree '"+this.$tree.attr("id")+"'"},toDict:function(a){var b=this.tnRoot.toDict(!0);return a?b:b.children},serializeArray:function(a){
-for(var b=this.getSelectedNodes(a),c=this.$tree.attr("name")||this.$tree.attr("id"),d=[],e=0,f=b.length;f>e;e++)d.push({name:c,value:b[e].data.key});return d},getPersistData:function(){return this.persistence.toDict()},logDebug:function(){this.options.debugLevel>=2&&(Array.prototype.unshift.apply(arguments,["debug"]),_log.apply(this,arguments))},logInfo:function(){this.options.debugLevel>=1&&(Array.prototype.unshift.apply(arguments,["info"]),_log.apply(this,arguments))},logWarning:function(){Array.prototype.unshift.apply(arguments,["warn"]),_log.apply(this,arguments)},isInitializing:function(){return"init"==this.phase||"postInit"==this.phase},isReloading:function(){return("init"==this.phase||"postInit"==this.phase)&&this.options.persist&&this.persistence.cookiesFound},isUserEvent:function(){return"userEvent"==this.phase},redraw:function(){this.tnRoot.render(!1,!1)},renderInvisibleNodes:function(){this.tnRoot.render(!1,!0)},reload:function(a){this._load(a)},getRoot:function(){return 
 this.tnRoot},enable:function(){this.$widget.enable()},disable:function(){this.$widget.disable()},getNodeByKey:function(a){var b=document.getElementById(this.options.idPrefix+a);if(b)return b.dtnode?b.dtnode:null;var c=null;return this.visit(function(b){return b.data.key===a?(c=b,!1):void 0},!0),c},getActiveNode:function(){return this.activeNode},reactivate:function(a){var b=this.activeNode;b&&(this.activeNode=null,b.activate(),a&&b.focus())},getSelectedNodes:function(a){var b=[];return this.tnRoot.visit(function(c){return c.bSelected&&(b.push(c),a===!0)?"skip":void 0}),b},activateKey:function(a){var b=null===a?null:this.getNodeByKey(a);return b?(b.focus(),b.activate(),b):(this.activeNode&&this.activeNode.deactivate(),this.activeNode=null,null)},loadKeyPath:function(a,b){var c=a.split(this.options.keyPathSeparator);return""===c[0]&&c.shift(),c[0]==this.tnRoot.data.key&&(this.logDebug("Removed leading root key."),c.shift()),a=c.join(this.options.keyPathSeparator),this.tnRoot._loadKeyP
 ath(a,b)},selectKey:function(a,b){var c=this.getNodeByKey(a);return c?(c.select(b),c):null},enableUpdate:function(a){return this.bEnableUpdate==a?a:(this.bEnableUpdate=a,a&&this.redraw(),!a)},count:function(){return this.tnRoot.countChildren()},visit:function(a,b){return this.tnRoot.visit(a,b)},_createFromTag:function(parentTreeNode,$ulParent){var self=this;$ulParent.find(">li").each(function(){var $li=$(this),$liSpan=$li.find(">span:first"),$liA=$li.find(">a:first"),title,href=null,target=null,tooltip;if($liSpan.length)title=$liSpan.html();else if($liA.length)title=$liA.html(),href=$liA.attr("href"),target=$liA.attr("target"),tooltip=$liA.attr("title");else{title=$li.html();var iPos=title.search(/<ul/i);title=$.trim(iPos>=0?title.substring(0,iPos):title)}var data={title:title,tooltip:tooltip,isFolder:$li.hasClass("folder"),isLazy:$li.hasClass("lazy"),expand:$li.hasClass("expanded"),select:$li.hasClass("selected"),activate:$li.hasClass("active"),focus:$li.hasClass("focused"),noLink:
 $li.hasClass("noLink")};if(href&&(data.href=href,data.target=target),$li.attr("title")&&(data.tooltip=$li.attr("title")),$li.attr("id")&&(data.key=""+$li.attr("id")),$li.attr("data")){var dataAttr=$.trim($li.attr("data"));if(dataAttr){"{"!=dataAttr.charAt(0)&&(dataAttr="{"+dataAttr+"}");try{$.extend(data,eval("("+dataAttr+")"))}catch(e){throw"Error parsing node data: "+e+"\ndata:\n'"+dataAttr+"'"}}}var childNode=parentTreeNode.addChild(data),$ul=$li.find(">ul:first");$ul.length&&self._createFromTag(childNode,$ul)})},_checkConsistency:function(){},_setDndStatus:function(a,b,c,d,e){var f,g=a?$(a.span):null,h=$(b.span),i=0,j="center";if(this.$dndMarker||(this.$dndMarker=$("<div id='dynatree-drop-marker'></div>").hide().css({"z-index":1e3}).prependTo($(this.divTree).parent())),"after"===d||"before"===d||"over"===d){switch(d){case"before":this.$dndMarker.removeClass("dynatree-drop-after dynatree-drop-over"),this.$dndMarker.addClass("dynatree-drop-before"),j="top";break;case"after":this.$
 dndMarker.removeClass("dynatree-drop-before dynatree-drop-over"),this.$dndMarker.addClass("dynatree-drop-after"),j="bottom";break;default:this.$dndMarker.removeClass("dynatree-drop-after dynatree-drop-before"),this.$dndMarker.addClass("dynatree-drop-over"),h.addClass("dynatree-drop-target"),i=8}f=jquerySupports.positionMyOfs?{my:"left"+offsetString(i)+" center",at:"left "+j,of:h}:{my:"left center",at:"left "+j,of:h,offset:""+i+" 0"},this.$dndMarker.show().position(f)}else h.removeClass("dynatree-drop-target"),this.$dndMarker.hide();"after"===d?h.addClass("dynatree-drop-after"):h.removeClass("dynatree-drop-after"),"before"===d?h.addClass("dynatree-drop-before"):h.removeClass("dynatree-drop-before"),e===!0?(g&&g.addClass("dynatree-drop-accept"),h.addClass("dynatree-drop-accept"),c.addClass("dynatree-drop-accept")):(g&&g.removeClass("dynatree-drop-accept"),h.removeClass("dynatree-drop-accept"),c.removeClass("dynatree-drop-accept")),e===!1?(g&&g.addClass("dynatree-drop-reject"),h.addCla
 ss("dynatree-drop-reject"),c.addClass("dynatree-drop-reject")):(g&&g.removeClass("dynatree-drop-reject"),h.removeClass("dynatree-drop-reject"),c.removeClass("dynatree-drop-reject"))},_onDragEvent:function(a,b,c,d,e,f){var g,h,i,j=this.options.dnd,k=null,l=$(b.span);switch(a){case"helper":var m=$("<div class='dynatree-drag-helper'><span class='dynatree-drag-helper-img' /></div>").append(l.find(".dynatree-title").clone());$("ul.dynatree-container",b.tree.divTree).append(m),m.data("dtSourceNode",b),k=m;break;case"start":b.isStatusNode()?k=!1:j.onDragStart&&(k=j.onDragStart(b)),k===!1?(this.logDebug("tree.onDragStart() cancelled"),e.helper.trigger("mouseup"),e.helper.hide()):l.addClass("dynatree-drag-source");break;case"enter":i=j.onDragEnter?j.onDragEnter(b,c,e,f):null,k=i?$.isArray(i)?{over:$.inArray("over",i)>=0,before:$.inArray("before",i)>=0,after:$.inArray("after",i)>=0}:{over:i===!0||"over"===i,before:i===!0||"before"===i,after:i===!0||"after"===i}:!1,e.helper.data("enterResponse
 ",k);break;case"over":if(h=e.helper.data("enterResponse"),g=null,h===!1);else if("string"==typeof h)g=h;else{var n=l.offset(),o={x:d.pageX-n.left,y:d.pageY-n.top},p={x:o.x/l.width(),y:o.y/l.height()};h.after&&p.y>.75?g="after":!h.over&&h.after&&p.y>.5?g="after":h.before&&p.y<=.25?g="before":!h.over&&h.before&&p.y<=.5?g="before":h.over&&(g="over"),j.preventVoidMoves&&(b===c?g=null:"before"===g&&c&&b===c.getNextSibling()?g=null:"after"===g&&c&&b===c.getPrevSibling()?g=null:"over"===g&&c&&c.parent===b&&c.isLastSibling()&&(g=null)),e.helper.data("hitMode",g)}"over"===g&&j.autoExpandMS&&b.hasChildren()!==!1&&!b.bExpanded&&b.scheduleAction("expand",j.autoExpandMS),g&&j.onDragOver&&(k=j.onDragOver(b,c,g,e,f),("over"===k||"before"===k||"after"===k)&&(g=k)),this._setDndStatus(c,b,e.helper,g,k!==!1&&null!==g);break;case"drop":var q=e.helper.hasClass("dynatree-drop-reject");g=e.helper.data("hitMode"),g&&j.onDrop&&!q&&j.onDrop(b,c,g,e,f);break;case"leave":b.scheduleAction("cancel"),e.helper.dat
 a("enterResponse",null),e.helper.data("hitMode",null),this._setDndStatus(c,b,e.helper,"out",void 0),j.onDragLeave&&j.onDragLeave(b,c,e,f);break;case"stop":l.removeClass("dynatree-drag-source"),j.onDragStop&&j.onDragStop(b);break;default:throw"Unsupported drag event: "+a}return k},cancelDrag:function(){var a=$.ui.ddmanager.current;a&&a.cancel()},lastentry:void 0},$.widget("ui.dynatree",{_init:function(){return versionCompare($.ui.version,"1.8")<0?(this.options.debugLevel>=0&&_log("warn","ui.dynatree._init() was called; you should upgrade to jquery.ui.core.js v1.8 or higher."),this._create()):void(this.options.debugLevel>=2&&_log("debug","ui.dynatree._init() was called; no current default functionality."))},_create:function(){var a=this.options;a.debugLevel>=1&&logMsg("Dynatree._create(): version='%s', debugLevel=%o.",$.ui.dynatree.version,this.options.debugLevel),this.options.event+=".dynatree";this.element.get(0);this.tree=new DynaTree(this),this.tree._load(),this.tree.logDebug("Dyn
 atree._init(): done.")},bind:function(){function a(a){a=$.event.fix(a||window.event);var b=$.ui.dynatree.getNode(a.target);return b?b._onFocus(a):!1}this.unbind();var b="click.dynatree dblclick.dynatree";this.options.keyboard&&(b+=" keypress.dynatree keydown.dynatree"),this.element.bind(b,function(a){var b=$.ui.dynatree.getNode(a.target);if(!b)return!0;var c=b.tree,d=c.options;c.logDebug("event(%s): dtnode: %s",a.type,b);var e=c.phase;c.phase="userEvent";try{switch(a.type){case"click":return d.onClick&&d.onClick.call(c,b,a)===!1?!1:b._onClick(a);case"dblclick":return d.onDblClick&&d.onDblClick.call(c,b,a)===!1?!1:b._onDblClick(a);case"keydown":return d.onKeydown&&d.onKeydown.call(c,b,a)===!1?!1:b._onKeydown(a);case"keypress":return d.onKeypress&&d.onKeypress.call(c,b,a)===!1?!1:b._onKeypress(a)}}catch(f){c.logWarning("bind(%o): dtnode: %o, error: %o",a,b,f)}finally{c.phase=e}});var c=this.tree.divTree;c.addEventListener?(c.addEventListener("focus",a,!0),c.addEventListener("blur",a,!
 0)):c.onfocusin=c.onfocusout=a},unbind:function(){this.element.unbind(".dynatree")},enable:function(){this.bind(),$.Widget.prototype.enable.apply(this,arguments)},disable:function(){this.unbind(),$.Widget.prototype.disable.apply(this,arguments)},getTree:function(){return this.tree},getRoot:function(){return this.tree.getRoot()},getActiveNode:function(){return this.tree.getActiveNode()},getSelectedNodes:function(){return this.tree.getSelectedNodes()},lastentry:void 0}),versionCompare($.ui.version,"1.8")<0&&($.ui.dynatree.getter="getTree getRoot getActiveNode getSelectedNodes"),$.extend($.ui.dynatree,{version:"1.2.8",buildType:"release",_DynaTreeClass:DynaTree,_DynaTreeNodeClass:DynaTreeNode,getNode:function(a){if(a instanceof DynaTreeNode)return a;for(void 0!==a.selector&&(a=a[0]);a;){if(a.dtnode)return a.dtnode;a=a.parentNode}return null},getPersistData:DynaTreeStatus._getTreePersistData}),$.ui.dynatree.prototype.options={title:"Dynatree",minExpandLevel:1,imagePath:null,children:nul
 l,initId:null,initAjax:null,autoFocus:!0,keyboard:!0,persist:!1,autoCollapse:!1,clickFolderMode:3,activeVisible:!0,checkbox:!1,selectMode:2,fx:null,noLink:!1,onClick:null,onDblClick:null,onKeydown:null,onKeypress:null,onFocus:null,onBlur:null,onQueryActivate:null,onQuerySelect:null,onQueryExpand:null,onPostInit:null,onActivate:null,onDeactivate:null,onSelect:null,onExpand:null,onLazyRead:null,onCustomRender:null,onCreate:null,onRender:null,postProcess:null,dnd:{onDragStart:null,onDragStop:null,revert:!1,autoExpandMS:1e3,preventVoidMoves:!0,onDragEnter:null,onDragOver:null,onDrop:null,onDragLeave:null},ajaxDefaults:{cache:!1,timeout:0,dataType:"json"},strings:{loading:"Loading&#8230;",loadError:"Load error!"},generateIds:!1,idPrefix:"dynatree-id-",keyPathSeparator:"/",cookieId:"dynatree",cookie:{expires:null},classNames:{container:"dynatree-container",node:"dynatree-node",folder:"dynatree-folder",empty:"dynatree-empty",vline:"dynatree-vline",expander:"dynatree-expander",connector:"dy
 natree-connector",checkbox:"dynatree-checkbox",radio:"dynatree-radio",nodeIcon:"dynatree-icon",title:"dynatree-title",noConnector:"dynatree-no-connector",nodeError:"dynatree-statusnode-error",nodeWait:"dynatree-statusnode-wait",hidden:"dynatree-hidden",combinedExpanderPrefix:"dynatree-exp-",combinedIconPrefix:"dynatree-ico-",nodeLoading:"dynatree-loading",hasChildren:"dynatree-has-children",active:"dynatree-active",selected:"dynatree-selected",expanded:"dynatree-expanded",lazy:"dynatree-lazy",focused:"dynatree-focused",partsel:"dynatree-partsel",lastsib:"dynatree-lastsib"},debugLevel:1,lastentry:void 0},versionCompare($.ui.version,"1.8")<0&&($.ui.dynatree.defaults=$.ui.dynatree.prototype.options),$.ui.dynatree.nodedatadefaults={title:null,key:null,isFolder:!1,isLazy:!1,tooltip:null,href:null,icon:null,addClass:null,noLink:!1,activate:!1,focus:!1,expand:!1,select:!1,hideCheckbox:!1,unselectable:!1,children:null,lastentry:void 0};var didRegisterDnd=!1,_registerDnd=function(){didRegist
 erDnd||($.ui.plugin.add("draggable","connectToDynatree",{start:function(a,b){var c=$(this).data("ui-draggable")||$(this).data("draggable"),d=b.helper.data("dtSourceNode")||null;return d?(c.offset.click.top=-2,c.offset.click.left=16,d.tree._onDragEvent("start",d,null,a,b,c)):void 0},drag:function(a,b){var c=$(this).data("ui-draggable")||$(this).data("draggable"),d=b.helper.data("dtSourceNode")||null,e=b.helper.data("dtTargetNode")||null,f=$.ui.dynatree.getNode(a.target);if(a.target&&!f){var g=$(a.target).closest("div.dynatree-drag-helper,#dynatree-drop-marker").length>0;if(g)return}b.helper.data("dtTargetNode",f),e&&e!==f&&e.tree._onDragEvent("leave",e,d,a,b,c),f&&f.tree.options.dnd.onDrop&&(f===e?f.tree._onDragEvent("over",f,d,a,b,c):f.tree._onDragEvent("enter",f,d,a,b,c))},stop:function(a,b){var c=$(this).data("ui-draggable")||$(this).data("draggable"),d=b.helper.data("dtSourceNode")||null,e=b.helper.data("dtTargetNode")||null,f=a.type,g="mouseup"==f&&1==a.which;logMsg("draggable-c
 onnectToDynatree.stop: targetNode(from event): %s, dtTargetNode: %s",e,b.helper.data("dtTargetNode")),g||logMsg("Drag was cancelled"),e&&(g&&e.tree._onDragEvent("drop",e,d,a,b,c),e.tree._onDragEvent("leave",e,d,a,b,c)),d&&d.tree._onDragEvent("stop",d,null,a,b,c)}}),didRegisterDnd=!0)}}(jQuery);
\ No newline at end of file


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


[04/11] qpid-dispatch git commit: DISPATCH-1001 Removed the deprecated directories

Posted by ea...@apache.org.
http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/a5e2307f/console/dispatch-dashboard/dispatch/static/dashboard/dispatch/overv/overview.controller.js
----------------------------------------------------------------------
diff --git a/console/dispatch-dashboard/dispatch/static/dashboard/dispatch/overv/overview.controller.js b/console/dispatch-dashboard/dispatch/static/dashboard/dispatch/overv/overview.controller.js
deleted file mode 100644
index 4c24a23..0000000
--- a/console/dispatch-dashboard/dispatch/static/dashboard/dispatch/overv/overview.controller.js
+++ /dev/null
@@ -1,1430 +0,0 @@
-/*
-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.
-*/
-/**
- * @module QDR
- */
-/**
- * @module QDR
- */
-var QDR = (function (QDR) {
-  'use strict';
-
-  /**
-   * @method OverviewController
-   * @param $scope
-   * @param QDRService
-   * @param QDRChartServer
-   * dialogServer
-   * $location
-   *
-   * Controller that handles the QDR overview page
-   */
-  angular
-    .module('horizon.dashboard.dispatch.overv')
-    .controller('horizon.dashboard.dispatch.overv.OverviewController', OverviewController);
-
-  OverviewController.$inject = [
-    '$scope',
-    'horizon.dashboard.dispatch.comService',
-    'horizon.dashboard.dispatch.chartService',
-    '$location',
-    '$timeout',
-    'horizon.dashboard.dispatch.overv.basePath',
-    'uiGridConstants',
-  ];
-
-  var FILTERKEY = "QDROverviewFilters"
-  function OverviewController(
-    $scope,
-    QDRService,
-    QDRChartService,
-    $location,
-    $timeout,
-    basePath,
-    uiGridConstants) {
-
-    var ctrl = this;
-
-    QDR.log.debug("QDR.OverviewController started");
-
-    QDRService.addConnectAction( function () {
-      Overview(
-        $scope,
-        QDRService,
-        QDRChartService,
-        $location,
-        $timeout,
-        basePath,
-        uiGridConstants);
-    })
-    QDRService.loadConnectOptions(QDRService.connect);
-
-    $scope.filter = angular.fromJson(localStorage[FILTERKEY]) || {endpointsOnly: true, hideConsoles: true};
-    var showConsoleLinksTitle = function () {
-      return ($scope.filter.hideConsoles ? "Show" : "Hide") + " Console Links"
-    }
-    var showHideConsoleMenuItem = {
-      title: showConsoleLinksTitle(),
-      action: function($event) {
-        $scope.filter.hideConsoles = !$scope.filter.hideConsoles
-        // assumes this is always the 1st custom menu item added
-        this.context.col.colDef.menuItems[0].title = showConsoleLinksTitle()
-        $timeout($scope.allLinkInfo)
-      },
-    }
-    var endpointLinksTitle = function () {
-      return "Show" + ($scope.filter.endpointsOnly ? " all link types" : " endpoints only")
-    }
-
-    $scope.allRouterFields = [];
-    $scope.allRouters = {
-      saveKey: 'allRouters',
-      data: 'allRouterFields',
-      enableHorizontalScrollbar: uiGridConstants.scrollbars.NEVER,
-      columnDefs: [
-       {
-           field: 'routerId',
-           saveKey: 'allRouters',
-           displayName: 'Router'
-       },
-       {
-           field: 'area',
-           displayName: 'Area'
-       },
-       {
-           field: 'mode',
-           displayName: 'Mode'
-       },
-       {
-           field: 'connections',
-           displayName: 'External connections'
-       },
-       {
-           field: 'addrCount',
-           displayName: 'Address count'
-       },
-       {
-           field: 'linkCount',
-           displayName: 'Link count'
-       }
-      ],
-      enableRowSelection: true,
-      enableRowHeaderSelection: false,
-      multiSelect: false,
-      enableColumnResize: true,
-      enableColumnReordering: true,
-      onRegisterApi: function(gridApi){
-        gridApi.selection.on.rowSelectionChanged($scope,function(row){
-          $scope.setActivated('router' , row.entity.nodeId, 'nodeId')
-        });
-      }
-    };
-    $scope.routerFields = []
-    $scope.routerGrid = {
-      saveKey: 'routerGrid',
-      data: 'routerFields',
-      enableHorizontalScrollbar: uiGridConstants.scrollbars.NEVER,
-      columnDefs: [
-        {
-          field: 'attribute',
-          displayName: 'Attribute',
-          saveKey: 'routerGrid',
-        },
-        {
-          field: 'value',
-           displayName: 'Value',
-        }
-      ],
-      enableColumnResize: true,
-      multiSelect: false
-    }
-    $scope.addressesData = []
-    $scope.addressesGrid = {
-      saveKey: 'addressesGrid',
-      data: 'addressesData',
-      enableHorizontalScrollbar: uiGridConstants.scrollbars.NEVER,
-      columnDefs: [
-        {
-          field: 'address',
-          saveKey: 'addressesGrid',
-          displayName: 'address'
-        },
-        {
-          field: 'class',
-          displayName: 'class'
-        },
-        {
-          field: 'phase',
-          displayName: 'phase',
-          width: 80,
-          cellClass: 'grid-align-value'
-        },
-        {
-          field: 'inproc',
-          width: 80,
-          displayName: 'in-proc'
-        },
-        {
-          field: 'local',
-          displayName: 'local',
-          width: 80,
-          cellClass: 'grid-align-value'
-        },
-        {
-          field: 'remote',
-          displayName: 'remote',
-          width: 80,
-          cellClass: 'grid-align-value'
-        },
-        {
-          field: 'in',
-          displayName: 'in',
-          cellClass: 'grid-align-value'
-        },
-        {
-          field: 'out',
-          displayName: 'out',
-          cellClass: 'grid-align-value'
-        }
-      ],
-
-      enableRowSelection: true,
-      enableRowHeaderSelection: false,
-      multiSelect: false,
-      enableColumnResize: true,
-      enableColumnReordering: true,
-      onRegisterApi: function(gridApi){
-        gridApi.selection.on.rowSelectionChanged($scope,function(row){
-          $scope.setActivated('address', row.entity.uid, 'uid')
-        });
-      }
-    };
-    // get info for a all links
-    $scope.linkFields = []
-    $scope.linksGrid = {
-      saveKey: 'linksGrid',
-      data: 'linkFields',
-      enableFiltering: true,
-      enableHorizontalScrollbar: uiGridConstants.scrollbars.NEVER,
-      columnDefs: [
-        {
-          saveKey: 'linksGrid',
-          field: 'link',
-          displayName: 'Link',
-          filter: {placeholder: 'filter link name...'},
-          menuItems: [showHideConsoleMenuItem],
-        },
-        {
-          field: 'linkType',
-          displayName: 'Link type',
-          filter: {
-            term: $scope.filter.endpointsOnly ? 'endpoint' : '',
-            placeholder: 'filter link type...',
-          },
-          menuItems: [showHideConsoleMenuItem,
-          {
-            title: endpointLinksTitle(),
-            action: function($event) {
-              $scope.filter.endpointsOnly = !$scope.filter.endpointsOnly
-              // assumes this is the 2nd custom menu item added
-              this.context.col.colDef.menuItems[1].title = endpointLinksTitle()
-              this.context.col.filters[0].term = $scope.filter.endpointsOnly ? 'endpoint' : ''
-              $timeout($scope.allLinkInfo)
-            },
-          }],
-        },
-        {
-          field: 'linkDir',
-          displayName: 'Link dir',
-          filter: {placeholder: 'filter link dir...'},
-          menuItems: [showHideConsoleMenuItem],
-        },
-        {
-          field: 'adminStatus',
-          displayName: 'Admin status',
-          filter: {placeholder: 'filter admin status...'},
-          menuItems: [showHideConsoleMenuItem],
-        },
-        {
-          field: 'operStatus',
-          displayName: 'Oper status',
-          filter: {placeholder: 'filter oper status...'},
-          menuItems: [showHideConsoleMenuItem],
-        },
-        {
-          field: 'deliveryCount',
-          displayName: 'Delivery Count',
-          enableFiltering: false,
-          menuItems: [showHideConsoleMenuItem],
-        },
-        {
-          field: 'rate',
-          displayName: 'Rate',
-          enableFiltering: false,
-          menuItems: [showHideConsoleMenuItem],
-        },
-        {
-          field: 'uncounts',
-          displayName: 'Outstanding',
-          enableFiltering: false,
-          menuItems: [showHideConsoleMenuItem],
-        },
-        {
-          field: 'owningAddr',
-          displayName: 'Address',
-          filter: {placeholder: 'filter address...'},
-          menuItems: [showHideConsoleMenuItem],
-        }/*,
-        {
-          displayName: 'Quiesce',
-                    cellClass: 'gridCellButton',
-                    cellTemplate: '<button title="{$quiesceLinkText(row)$} this link" type="button" ng-class="quiesceLinkClass(row)" class="btn" ng-click="quiesceLink(row, $event)" ng-disabled="quiesceLinkDisabled(row)">{$quiesceLinkText(row)$}</button>',
-          width: '10%'
-                }*/
-            ],
-      enableRowSelection: true,
-      enableRowHeaderSelection: false,
-      multiSelect: false,
-      enableColumnReordering: true,
-      showColumnMenu: true,
-      rowTemplate: 'dispatch/tplLinkRow.html',
-      onRegisterApi: function(gridApi){
-        gridApi.selection.on.rowSelectionChanged($scope,function(row){
-          $scope.setActivated('link', row.entity.uid, 'uid')
-        });
-        gridApi.core.on.filterChanged( $scope, function() {
-          var column = this.grid.columns[1];
-          $scope.filter.endpointsOnly = (column.filters[0].term === 'endpoint' )
-          column.colDef.menuItems[1].title = endpointLinksTitle()
-        });
-      }
-    };
-    $scope.allConnectionFields = []
-    $scope.allConnectionGrid = {
-      saveKey: 'allConnGrid',
-      data: 'allConnectionFields',
-      enableHorizontalScrollbar: uiGridConstants.scrollbars.NEVER,
-      columnDefs: [
-        {
-           field: 'host',
-          saveKey: 'allConnGrid',
-           displayName: 'host'
-        },
-        {
-           field: 'container',
-           displayName: 'container'
-        },
-        {
-           field: 'role',
-           displayName: 'role'
-        },
-        {
-           field: 'dir',
-           displayName: 'dir'
-        },
-        {
-           field: 'security',
-           displayName: 'security'
-        },
-        {
-           field: 'authentication',
-           displayName: 'authentication'
-        }
-      ],
-      enableRowSelection: true,
-      enableRowHeaderSelection: false,
-      multiSelect: false,
-      enableColumnResize: true,
-      enableColumnReordering: true,
-      onRegisterApi: function(gridApi){
-        gridApi.selection.on.rowSelectionChanged($scope,function(row){
-          $scope.setActivated('connection', row.entity.uid, 'uid')
-        });
-      }
-    };
-    $scope.addressFields = []
-    $scope.addressGrid = {
-      saveKey: 'addGrid',
-      data: 'addressFields',
-      enableHorizontalScrollbar: uiGridConstants.scrollbars.NEVER,
-      columnDefs: [
-        {
-          field: 'attribute',
-          displayName: 'Attribute',
-          saveKey: 'addGrid',
-        },
-        {
-          field: 'value',
-          displayName: 'Value',
-        }
-      ],
-      enableColumnResize: true,
-      multiSelect: false
-    }
-    $scope.singleLinkFields = []
-    $scope.linkGrid = {
-      saveKey: 'linkGrid',
-      data: 'singleLinkFields',
-      enableHorizontalScrollbar: uiGridConstants.scrollbars.NEVER,
-      columnDefs: [
-        {
-          field: 'attribute',
-          displayName: 'Attribute',
-        },
-        {
-          field: 'value',
-          displayName: 'Value',
-        }
-      ],
-      enableColumnResize: true,
-      multiSelect: false
-    }
-    $scope.connectionFields = []
-    $scope.connectionGrid = {
-        saveKey: 'connGrid',
-      data: 'connectionFields',
-      enableHorizontalScrollbar: uiGridConstants.scrollbars.NEVER,
-      columnDefs: [
-                 {
-                     field: 'attribute',
-                     displayName: 'Attribute',
-                    saveKey: 'connGrid',
-                 },
-                 {
-                     field: 'value',
-                     displayName: 'Value',
-                 }
-            ],
-      enableColumnResize: true,
-      multiSelect: false
-    }
-    $scope.allLogFields = []
-    $scope.allLogGrid = {
-      saveKey: 'allLogGrid',
-      data: 'allLogFields',
-      enableHorizontalScrollbar: uiGridConstants.scrollbars.NEVER,
-      columnDefs: [
-        {
-          field: 'module',
-          saveKey: 'allLogGrid',
-          displayName: 'Module'
-        },
-        {
-          field: 'enable',
-          displayName: 'Enable'
-        },
-        {
-          field: 'count',
-          displayName: 'Count'
-        }
-      ],
-      enableRowSelection: true,
-      enableRowHeaderSelection: false,
-      multiSelect: false,
-      enableColumnResize: true,
-      enableColumnReordering: true,
-      onRegisterApi: function(gridApi){
-        gridApi.selection.on.rowSelectionChanged($scope,function(row){
-          $scope.setActivated('log', row.entity.module, 'module')
-        });
-      }
-    };
-  }
-
-  function Overview (
-    $scope,
-    QDRService,
-    QDRChartService,
-    $location,
-    $timeout,
-    basePath,
-    uiGridConstants) {
-
-    var COLUMNSTATEKEY = 'QDRColumnKey.';
-    var OVERVIEWEXPANDEDKEY = "QDROverviewExpanded"
-    var OVERVIEWACTIVATEDKEY = "QDROverviewActivated"
-    var OVERVIEWMODEIDS = "QDROverviewModeIds"
-
-    // we want attributes to be listed first, so add it at index 0
-
-    $scope.subLevelTabs = [{
-        content: '<i class="icon-list"></i> Attributes',
-        title: "View the attribute values on your selection",
-        isValid: function (workspace) { return true; },
-        href: function () { return "#/" + QDR.pluginName + "/attributes"; },
-        index: 0
-    },
-    {
-        content: '<i class="icon-leaf"></i> Operations',
-        title: "Execute operations on your selection",
-        isValid: function (workspace) { return true; },
-        href: function () { return "#/" + QDR.pluginName + "/operations"; },
-        index: 1
-    }]
-
-    $scope.activeTab = $scope.subLevelTabs[0];
-    $scope.setActive = function (nav) {
-      $scope.activeTab = nav;
-    };
-    $scope.isValid = function (nav) {
-      return nav.isValid()
-    }
-    $scope.isActive = function (nav) {
-      return nav == $scope.activeTab;
-    }
-    var refreshInterval = 5000
-    $scope.modes = [
-      {title: 'Overview', name: 'Overview', right: false}
-     ];
-
-    // get info for all routers
-    var allRouterInfo = function () {
-      var nodeIds = QDRService.nodeIdList()
-      var expected = Object.keys(nodeIds).length
-      var received = 0;
-      var allRouterFields = [];
-      var gotNodeInfo = function (nodeName, entity, response) {
-        var results = response.results;
-        var name = QDRService.nameFromId(nodeName)
-        var connections = 0;
-        results.forEach( function (result) {
-          var role = QDRService.valFor(response.attributeNames, result, "role")
-          if (role != 'inter-router') {
-            ++connections
-          }
-        })
-        allRouterFields.push({routerId: name, connections: connections, nodeId: nodeName})
-        ++received
-        if (expected == received) {
-          allRouterFields.sort ( function (a,b) { return a.routerId < b.routerId ? -1 : a.routerId > b.routerId ? 1 : 0})
-          // now get each router's node info
-          QDRService.getMultipleNodeInfo(nodeIds, "router", [], function (nodeIds, entity, responses) {
-            for(var r in responses) {
-              var result = responses[r]
-              var routerId = QDRService.valFor(result.attributeNames, result.results[0], "id")
-              allRouterFields.some( function (connField) {
-                if (routerId === connField.routerId) {
-                  result.attributeNames.forEach ( function (attrName) {
-                    connField[attrName] = QDRService.valFor(result.attributeNames, result.results[0], attrName)
-                  })
-                  connField['routerId'] = connField.id; // like QDR.A
-                  return true
-                }
-                return false
-              })
-            }
-            $scope.allRouterFields = allRouterFields
-            updateRouterTree(allRouterFields)
-          }, nodeIds[0], false)
-        }
-      }
-      nodeIds.forEach ( function (nodeId, i) {
-        QDRService.getNodeInfo(nodeId, ".connection", ["role"], gotNodeInfo)
-      })
-      loadColState($scope.allRouters)
-    }
-
-    // get info for a single router
-    var routerInfo = function (node) {
-      $scope.router = node
-
-      $scope.routerFields = [];
-      var fields = Object.keys(node.fields)
-      fields.forEach( function (field) {
-        var attr = (field === 'connections') ? 'External connections' : field
-        $scope.routerFields.push({attribute: attr, value: node.fields[field]})
-      })
-      loadColState($scope.routerGrid);
-    }
-
-    // get info for all addresses
-    var allAddressInfo = function () {
-      var gotAllAddressFields = function ( addressFields ) {
-        if (!addressFields || addressFields.length === 0)
-          return;
-        // update the grid's data
-        addressFields.sort ( function (a,b) { return a.address < b.address ? -1 : a.address > b.address ? 1 : 0})
-        addressFields[0].title = addressFields[0].address
-        for (var i=1; i<addressFields.length; ++i) {
-          if (addressFields[i].address === addressFields[i-1].address) {
-            addressFields[i-1].title = addressFields[i-1].address + " (" + addressFields[i-1]['class'] + ")"
-            addressFields[i].title = addressFields[i].address + " (" + addressFields[i]['class'] + ")"
-          } else
-            addressFields[i].title = addressFields[i].address
-        }
-        $scope.addressesData = addressFields
-
-        // repopulate the tree's child nodes
-        updateAddressTree(addressFields)
-      }
-      getAllAddressFields(gotAllAddressFields)
-      loadColState($scope.addressesGrid);
-    }
-
-    var getAllAddressFields = function (callback) {
-      var nodeIds = QDRService.nodeIdList()
-      var addr_class = function (addr) {
-        if (!addr) return "-"
-            if (addr[0] == 'M')  return "mobile"
-            if (addr[0] == 'R')  return "router"
-            if (addr[0] == 'A')  return "area"
-            if (addr[0] == 'L')  return "local"
-            if (addr[0] == 'C')  return "link-incoming"
-            if (addr[0] == 'E')  return "link-incoming"
-            if (addr[0] == 'D')  return "link-outgoing"
-            if (addr[0] == 'F')  return "link-outgoing"
-            if (addr[0] == 'T')  return "topo"
-            return "unknown: " + addr[0]
-      }
-
-      var addr_phase = function (addr) {
-            if (!addr)
-                return "-"
-            if (addr[0] == 'M')
-                return addr[1]
-            return ''
-      }
-
-      var addressFields = []
-      QDRService.getMultipleNodeInfo(nodeIds, "router.address", [], function (nodeIds, entity, response) {
-        response.aggregates.forEach( function (result) {
-          var prettySum = function (field) {
-            var fieldIndex = response.attributeNames.indexOf(field)
-            if (fieldIndex < 0) {
-              return "-"
-            }
-            var val = result[fieldIndex].sum
-            return QDRService.pretty(val)
-          }
-
-          var uid = QDRService.valFor(response.attributeNames, result, "identity").sum
-          var identity = QDRService.identity_clean(uid)
-
-          addressFields.push({
-            address: QDRService.addr_text(identity),
-            'class': QDRService.addr_class(identity),
-            phase:   addr_phase(identity),
-            inproc:  prettySum("inProcess"),
-            local:   prettySum("subscriberCount"),
-            remote:  prettySum("remoteCount"),
-            'in':    prettySum("deliveriesIngress"),
-            out:     prettySum("deliveriesEgress"),
-            thru:    prettySum("deliveriesTransit"),
-            toproc:  prettySum("deliveriesToContainer"),
-            fromproc:prettySum("deliveriesFromContainer"),
-            uid:     uid
-          })
-        })
-        callback(addressFields)
-      }, nodeIds[0])
-    }
-
-    var updateLinkGrid = function ( linkFields ) {
-      // apply the filter
-
-      var filteredLinks = linkFields.filter( function (link) {
-        var include = true;
-/*
-        if ($scope.filter.endpointsOnly === true) {
-          if (link.linkType !== 'endpoint')
-            include = false;
-        }
-*/
-        if ($scope.filter.hideConsoles) {
-          if (QDRService.isConsoleLink(link))
-            include = false;
-        }
-        return include;
-      })
-      $scope.linkFields = filteredLinks;
-    }
-
-    $scope.$watch("filter", function (newValue, oldValue) {
-      if (newValue !== oldValue) {
-        $timeout($scope.allLinkInfo);
-        localStorage[FILTERKEY] = JSON.stringify($scope.filter)
-      }
-    }, true)
-
-    $scope.$on('ngGridEventColumns', function (e, columns) {
-      var saveInfo = columns.map( function (col) {
-        return [col.width, col.visible]
-      })
-      var saveKey = columns[0].colDef.saveKey
-      if (saveKey)
-        localStorage.setItem(COLUMNSTATEKEY+saveKey, JSON.stringify(saveInfo));
-    })
-
-    var loadColState = function (grid) {
-      if (!grid)
-        return;
-      var columns = localStorage.getItem(COLUMNSTATEKEY+grid.saveKey);
-      if (columns) {
-        var cols = JSON.parse(columns);
-        cols.forEach( function (col, index) {
-          if (grid.columnDefs[index]) {
-            grid.columnDefs[index].width = col[0];
-            grid.columnDefs[index].visible = col[1]
-          }
-        })
-      }
-    }
-
-    $scope.allLinkInfo = function () {
-      getAllLinkFields([updateLinkGrid, updateLinkTree])
-//      loadColState($scope.linksGrid);
-    }
-
-    var getAllLinkFields = function (completionCallbacks, selectionCallback) {
-      var nodeIds = QDRService.nodeIdList()
-      var linkFields = []
-      var now = Date.now()
-      var rate = function (linkName, response, result) {
-        if (!$scope.linkFields)
-          return 0;
-        var oldname = $scope.linkFields.filter(function (link) {
-          return link.link === linkName
-        })
-        if (oldname.length === 1) {
-          var elapsed = (now - oldname[0].timestamp) / 1000;
-          if (elapsed < 0)
-            return 0
-          var delivered = QDRService.valFor(response.attributeNames, result, "deliveryCount") - oldname[0].rawDeliveryCount
-          //QDR.log.debug("elapsed " + elapsed + " delivered " + delivered)
-          return elapsed > 0 ? parseFloat(Math.round((delivered/elapsed) * 100) / 100).toFixed(2) : 0;
-        } else {
-          //QDR.log.debug("unable to find old linkName")
-          return 0
-        }
-      }
-      var expected = nodeIds.length;
-      var received = 0;
-      var gotLinkInfo = function (nodeName, entity, response) {
-        response.results.forEach( function (result) {
-          var nameIndex = response.attributeNames.indexOf('name')
-          var prettyVal = function (field) {
-            var fieldIndex = response.attributeNames.indexOf(field)
-            if (fieldIndex < 0) {
-              return "-"
-            }
-            var val = result[fieldIndex]
-            return QDRService.pretty(val)
-          }
-          var uncounts = function () {
-            var und = QDRService.valFor(response.attributeNames, result, "undeliveredCount")
-            var uns = QDRService.valFor(response.attributeNames, result, "unsettledCount")
-            return QDRService.pretty(und + uns)
-          }
-          var linkName = function () {
-            var namestr = QDRService.nameFromId(nodeName)
-            return namestr + ':' + QDRService.valFor(response.attributeNames, result, "identity")
-          }
-          var fixAddress = function () {
-            var addresses = []
-            var owningAddr = QDRService.valFor(response.attributeNames, result, "owningAddr") || ""
-            var rawAddress = owningAddr
-            /*
-                 - "L*"  =>  "* (local)"
-                 - "M0*" =>  "* (direct)"
-                 - "M1*" =>  "* (dequeue)"
-                 - "MX*" =>  "* (phase X)"
-            */
-            var address = undefined;
-            var starts = {'L': '(local)', 'M0': '(direct)', 'M1': '(dequeue)'}
-            for (var start in starts) {
-              if (owningAddr.startsWith(start)) {
-                var ends = owningAddr.substr(start.length)
-                address = ends + " " + starts[start]
-                rawAddress = ends
-                break;
-              }
-            }
-            if (!address) {
-              // check for MX*
-              if (owningAddr.length > 3) {
-                if (owningAddr[0] === 'M') {
-                  var phase = parseInt(owningAddress.substr(1))
-                  if (phase && !isNaN(phase)) {
-                    var phaseStr = phase + "";
-                    var star = owningAddress.substr(2 + phaseStr.length)
-                    address = star + " " + "(phase " + phaseStr + ")"
-                  }
-                }
-              }
-            }
-            addresses[0] = address || owningAddr
-            addresses[1] = rawAddress
-            return addresses
-          }
-          if (!selectionCallback || selectionCallback(response, result)) {
-            var adminStatus = QDRService.valFor(response.attributeNames, result, "adminStatus")
-            var operStatus = QDRService.valFor(response.attributeNames, result, "operStatus")
-            var linkName = linkName()
-            var linkType = QDRService.valFor(response.attributeNames, result, "linkType")
-            var rawRate = rate(linkName, response, result)
-            var addresses = fixAddress();
-            linkFields.push({
-              link:       linkName,
-              title:      linkName,
-              uncounts:   uncounts(),
-              operStatus: operStatus,
-              adminStatus:adminStatus,
-              owningAddr: addresses[0],
-
-              acceptedCount: prettyVal("acceptedCount"),
-              modifiedCount: prettyVal("modifiedCount"),
-              presettledCount: prettyVal("presettledCount"),
-              rejectedCount: prettyVal("rejectedCount"),
-              releasedCount: prettyVal("releasedCount"),
-              deliveryCount:prettyVal("deliveryCount") + " ",
-
-              rate: QDRService.pretty(rawRate),
-              rawRate: rawRate,
-              capacity: QDRService.valFor(response.attributeNames, result, "capacity"),
-              undeliveredCount: QDRService.valFor(response.attributeNames, result, "undeliveredCount"),
-              unsettledCount: QDRService.valFor(response.attributeNames, result, "unsettledCount"),
-
-              rawAddress: addresses[1],
-              rawDeliveryCount: QDRService.valFor(response.attributeNames, result, "deliveryCount"),
-              name: QDRService.valFor(response.attributeNames, result, "name"),
-              linkName: QDRService.valFor(response.attributeNames, result, "linkName"),
-              connectionId: QDRService.valFor(response.attributeNames, result, "connectionId"),
-              linkDir: QDRService.valFor(response.attributeNames, result, "linkDir"),
-              linkType: linkType,
-              peer: QDRService.valFor(response.attributeNames, result, "peer"),
-              type: QDRService.valFor(response.attributeNames, result, "type"),
-
-              uid:     linkName,
-              timestamp: now,
-              nodeId: nodeName,
-              identity: QDRService.valFor(response.attributeNames, result, "identity")
-            })
-          }
-        })
-        if (expected === ++received) {
-          linkFields.sort ( function (a,b) { return a.link < b.link ? -1 : a.link > b.link ? 1 : 0})
-          completionCallbacks.forEach( function (cb) {
-            cb(linkFields)
-          })
-        }
-      }
-      nodeIds.forEach( function (nodeId) {
-        QDRService.getNodeInfo(nodeId, "router.link", [], gotLinkInfo);
-      })
-    }
-
-    // get info for a all connections
-    var allConnectionInfo = function () {
-      getAllConnectionFields([updateConnectionGrid, updateConnectionTree])
-          loadColState($scope.allConnectionGrid);
-    }
-    // called after conection data is available
-    var updateConnectionGrid = function (connectionFields) {
-      $scope.allConnectionFields = connectionFields;
-    }
-
-    // get the connection data for all nodes
-    // called periodically
-    // creates a connectionFields array and calls the callbacks (updateTree and updateGrid)
-    var getAllConnectionFields = function (callbacks) {
-      var nodeIds = QDRService.nodeIdList()
-      var connectionFields = [];
-      var expected = nodeIds.length;
-      var received = 0;
-      var gotConnectionInfo = function (nodeName, entity, response) {
-        response.results.forEach( function (result) {
-
-          var auth = "no_auth"
-          var sasl = QDRService.valFor(response.attributeNames, result, "sasl")
-          if (QDRService.valFor(response.attributeNames, result, "isAuthenticated")) {
-            auth = sasl
-            if (sasl === "ANONYMOUS")
-              auth = "anonymous-user"
-            else {
-              if (sasl === "GSSAPI")
-                sasl = "Kerberos"
-              if (sasl === "EXTERNAL")
-                sasl = "x.509"
-              auth = QDRService.valFor(response.attributeNames, result, "user") + "(" +
-                  QDRService.valFor(response.attributeNames, result, "sslCipher") + ")"
-              }
-          }
-
-          var sec = "no-security"
-          if (QDRService.valFor(response.attributeNames, result, "isEncrypted")) {
-            if (sasl === "GSSAPI")
-              sec = "Kerberos"
-            else
-              sec = QDRService.valFor(response.attributeNames, result, "sslProto") + "(" +
-                  QDRService.valFor(response.attributeNames, result, "sslCipher") + ")"
-          }
-
-          var host = QDRService.valFor(response.attributeNames, result, "host")
-          var connField = {
-            host: host,
-            security: sec,
-            authentication: auth,
-            routerId: nodeName,
-            uid: host + QDRService.valFor(response.attributeNames, result, "identity")
-          }
-          response.attributeNames.forEach( function (attribute, i) {
-            connField[attribute] = result[i]
-          })
-          connectionFields.push(connField)
-        })
-        if (expected === ++received) {
-          connectionFields.sort ( function (a,b) { return a.host < b.host ? -1 : a.host > b.host ? 1 : 0})
-          callbacks.forEach( function (cb) {
-            cb(connectionFields)
-          })
-        }
-      }
-      nodeIds.forEach( function (nodeId) {
-        QDRService.getNodeInfo(nodeId, ".connection", [], gotConnectionInfo)
-      })
-    }
-
-    // get info for a single address
-    var addressInfo = function (address) {
-      if (!address)
-        return;
-      $scope.address = address
-      var currentEntity = getCurrentLinksEntity();
-      // we are viewing the addressLinks page
-      if (currentEntity === 'Address' && entityModes[currentEntity].currentModeId === 'links') {
-        updateModeLinks()
-        return;
-      }
-
-      $scope.addressFields = [];
-      var fields = Object.keys(address.fields)
-      fields.forEach( function (field) {
-        if (field != "title" && field != "uid")
-          $scope.addressFields.push({attribute: field, value: address.fields[field]})
-      })
-      loadColState($scope.addressGrid);
-    }
-
-    // display the grid detail info for a single link
-    var linkInfo = function (link) {
-      if (!link)
-        return;
-
-      $scope.link = link;
-      $scope.singleLinkFields = [];
-      var fields = Object.keys(link.fields)
-      var excludeFields = ["title", "uid", "uncounts", "rawDeliveryCount", "timestamp", "rawAddress"]
-      fields.forEach( function (field) {
-        if (excludeFields.indexOf(field) == -1)
-          $scope.singleLinkFields.push({attribute: field, value: link.fields[field]})
-      })
-      loadColState($scope.linkGrid);
-    }
-
-    // get info for a single connection
-    $scope.gridModes = [{
-          content: '<a><i class="icon-list"></i> Attriutes</a>',
-      id: 'attributes',
-      title: "View attributes"
-      },
-      {
-          content: '<a><i class="icon-link"></i> Links</a>',
-          id: 'links',
-          title: "Show links"
-      }
-      ];
-    var saveModeIds = function () {
-      var modeIds = {Address: entityModes.Address.currentModeId, Connection: entityModes.Connection.currentModeId}
-      localStorage[OVERVIEWMODEIDS] = JSON.stringify(modeIds)
-    }
-    var loadModeIds = function () {
-      return angular.fromJson(localStorage[OVERVIEWMODEIDS]) ||
-        {Address: 'attributes', Connection: 'attributes'}
-    }
-    var savedModeIds = loadModeIds()
-    var entityModes = {
-        Address: {
-            currentModeId: savedModeIds.Address,
-            filter: function (response, result) {
-              var owningAddr = QDRService.valFor(response.attributeNames, result, "owningAddr")
-              var id = $scope.address.data.fields.uid
-              return (owningAddr === $scope.address.data.fields.uid)
-            }
-        },
-        Connection: {
-            currentModeId: savedModeIds.Connection,
-            filter: function (response, result) {
-        var connectionId = QDRService.valFor(response.attributeNames, result, "connectionId")
-        return (connectionId === $scope.connection.data.fields.identity)
-            }
-        }
-    }
-    $scope.selectMode = function (mode, entity) {
-      if (!mode || !entity)
-        return;
-      entityModes[entity].currentModeId = mode.id;
-      saveModeIds();
-      if (mode.id === 'links') {
-        $scope.linkFields = [];
-        updateModeLinks();
-      }
-    }
-    $scope.isModeSelected = function (mode, entity) {
-      return mode.id === entityModes[entity].currentModeId
-    }
-    $scope.isModeVisible = function (entity, id) {
-      return entityModes[entity].currentModeId === id
-    }
-
-    var updateEntityLinkGrid = function (linkFields) {
-      $timeout(function () {$scope.linkFields = linkFields})
-    }
-    // based on which entity is selected, get and filter the links
-    var updateModeLinks = function () {
-      var currentEntity = getCurrentLinksEntity()
-      if (!currentEntity)
-        return;
-      var selectionCallback = entityModes[currentEntity].filter;
-      getAllLinkFields([updateEntityLinkGrid], selectionCallback)
-    }
-    var getCurrentLinksEntity = function () {
-      var currentEntity;
-      var active = $("#overtree").dynatree("getActiveNode");
-      if (active) {
-        currentEntity = active.data.type;
-      }
-      return currentEntity;
-    }
-
-    $scope.quiesceLinkClass = function (row) {
-      var stateClassMap = {
-        enabled: 'btn-primary',
-        disabled: 'btn-danger'
-      }
-      return stateClassMap[row.entity.adminStatus]
-    }
-
-    $scope.quiesceLink = function (row, $event) {
-      QDRService.quiesceLink(row.entity.nodeId, row.entity.name);
-      $event.stopPropagation()
-    }
-
-    $scope.quiesceLinkDisabled = function (row) {
-      return (row.entity.operStatus !== 'up' && row.entity.operStatus !== 'down')
-    }
-    $scope.quiesceLinkText = function (row) {
-      return row.entity.adminStatus === 'disabled' ? "Revive" : "Quiesce";
-    }
-
-    $scope.expandAll = function () {
-      $("#overtree").dynatree("getRoot").visit(function(node){
-                node.expand(true);
-            });
-    }
-    $scope.contractAll = function () {
-      $("#overtree").dynatree("getRoot").visit(function(node){
-                node.expand(false);
-            })
-    }
-
-    var connectionInfo = function (connection) {
-      if (!connection)
-        return;
-      $scope.connection = connection
-
-      var currentEntity = getCurrentLinksEntity();
-      // we are viewing the connectionLinks page
-      if (currentEntity === 'Connection' && entityModes[currentEntity].currentModeId === 'links') {
-        updateModeLinks()
-        return;
-      }
-
-      $scope.connectionFields = [];
-      var fields = Object.keys(connection.fields)
-      fields.forEach( function (field) {
-        if (field != "title" && field != "uid")
-          $scope.connectionFields.push({attribute: field, value: connection.fields[field]})
-      })
-      $scope.selectMode($scope.currentMode)
-      loadColState($scope.connectionGrid);
-    }
-
-    // get info for a all logs
-    var allLogEntries = []
-    var allLogInfo = function () {
-      var nodeIds = QDRService.nodeIdList()
-      var expected = nodeIds.length;
-      var received = 0;
-      var logResults = []
-      var gotLogInfo = function (nodeId, entity, response, context) {
-        var statusCode = context.message.application_properties.statusCode;
-        if (statusCode < 200 || statusCode >= 300) {
-          Core.notification('error', context.message.application_properties.statusDescription);
-          //QDR.log.debug(context.message.application_properties.statusDescription)
-          return;
-        }
-        var logFields = response.map( function (result) {
-          return {
-            nodeId: QDRService.nameFromId(nodeId),
-            name: result[0],
-            type: result[1],
-            message: result[2],
-            source: result[3],
-            line: result[4],
-            time: Date(result[5]).toString()
-          }
-        })
-        logResults.push.apply(logResults, logFields) // append new array to existing
-        if (expected == ++received) {
-          logResults.sort( function (a, b) {
-            return b.name - a.name
-          })
-
-          $scope.allLogFields = [];
-          var options = $scope.data.log.options;
-          options.forEach( function (option) {
-            if (option.id != 'all') {
-              $scope.allLogFields.push(
-                {module: option.id,
-                enable: option.fields.enable,
-                count: logResults.filter( function (entry) {
-                  return entry.name === option.fields.module
-                }).length
-              })
-            }
-          })
-          allLogEntries = logResults
-        }
-      }
-      nodeIds.forEach( function (node) {
-        QDRService.sendMethod(node, undefined, {}, "GET-LOG", {}, gotLogInfo)
-      })
-
-    }
-
-    // get info for a single log
-    var logInfo = function (node) {
-      $scope.log = node
-      $scope.logFields = allLogEntries.filter( function (log) {
-        return node.id === log.name
-      })
-      $scope.$apply();
-    }
-
-    var updateExpanded = function () {
-      if (!$scope.selectedObject)
-        return;
-      // find the parent of the selectedObject and call it's info function
-      if ($scope.selectedObject.pinfo)
-        $scope.selectedObject.pinfo()
-      $scope.selectedObject.info($scope.selectedObject)
-    }
-
-    var sendChartRequest = function (svgCharts) {
-      var gotChartData = function (linkFields) {
-        var now = new Date();
-        svgCharts.forEach( function (svgChart) {
-          var cutOff = new Date(now.getTime() - svgChart.chart.duration() * 60 * 1000);
-          var name = svgChart.chart.name()
-          var attr = svgChart.chart.attr()
-          var data = svgChart.chart.data(name, attr) // get a reference to the data array
-          var val = svgChart.chart.getVal(linkFields)
-          data.push([now, val])
-          // expire the old data
-          while (data[0][0] < cutOff) {
-            data.shift();
-          }
-        })
-      }
-      getAllLinkFields([gotChartData])
-    }
-
-    // loads the tree node name that was last selected
-    var loadActivatedNode = function () {
-      return localStorage[OVERVIEWACTIVATEDKEY] || 'Routers'
-    }
-    // saved the tree node name that is currently selected
-    var saveActivated = function (key) {
-      localStorage[OVERVIEWACTIVATEDKEY] = key;
-      lastKey = key;
-    }
-    // loads list that was saved
-    var loadExpandedNodeList = function () {
-      return angular.fromJson(localStorage[OVERVIEWEXPANDEDKEY]) || [];
-    }
-    // called when a node is expanded
-    // here we save the expanded node so it can be restored when the page reloads
-    var saveExpanded = function () {
-      var list = getExpandedList();
-      localStorage[OVERVIEWEXPANDEDKEY] = JSON.stringify(list)
-      expandedNodeList = list
-    }
-
-    $scope.setActivated = function (dropdown, uid, suid) {
-      $("#sel" + dropdown).val(uid)
-
-      var dd = $scope.data[dropdown];
-      var newOption;
-      if (uid == 'all') {
-        newOption = dd.options[0];
-      } else {
-        dd.options.some( function (option) {
-          if (option.fields && option.fields[suid] === uid) {
-            newOption = option
-            return true;
-          } else
-            return false;
-        })
-      }
-      $scope.activated(newOption)
-    }
-
-    $scope.selectedObject = null;
-    $scope.templateUrl = null;
-    // activated is called each time a dropdown is changed
-    // based on which node is clicked, load the correct data grid template and start getting the data
-    $scope.activated = function (node) {
-      if (!node)
-        return;
-      $scope.selectedObject = node;
-      if (node.id !== "all") {
-        $scope.data[node.type].sel = node
-      }
-      //saveExpanded()
-      //saveActivated(node.data.key)
-
-      $scope.templateUrl = 'dispatch/' + node.type + ".html";
-      // the node's info function will fetch the grids data
-      if (node.info) {
-        $timeout(function () {node.info(node)})
-      }
-    }
-
-    /* --------------------------------------------------
-    *
-    * setup the dropdowns
-    *
-    * -------------------------------------------------
-    */
-    var initDropDown = function (dd, info, type) {
-      $scope.data[dd] = {}
-      $scope.data[dd].options = getAllOption(dd, info, type)
-      $scope.data[dd].sel = $scope.data[dd].options[0];
-    }
-    var getAllOption = function (dd, info, type) {
-      return [{id: 'all',
-        name: 'All ' + type,
-        info: info,
-        type: type}]
-    }
-    var updateDropdown = function (dropdown, allFields, idKey, nameKey, allInfo, allType, info) {
-      var currentId = $scope.data[dropdown].sel.id;
-      $scope.data[dropdown].options = getAllOption(dropdown, allInfo, allType)
-      allFields.forEach( function (fields) {
-        var option = {id: fields[idKey],
-                     name: fields[nameKey],
-                     info: info,
-                     type: dropdown,
-                     fields: fields,
-                     pinfo: allInfo}
-        $scope.data[dropdown].options.push(option);
-
-        if (currentId === option.id) {
-          $scope.data[dropdown].sel = option
-        }
-      })
-      if ($scope.selectedObject && $scope.selectedObject.type === dropdown) {
-        $scope.selectedObject = $scope.data[dropdown].sel;
-//QDR.log.debug("updated " + dropdown + " to ")
-//console.dump($scope.selectedObject)
-      }
-    }
-
-    // get saved tree state
-    var lastKey = loadActivatedNode();
-    // called when the list of routers changes
-    var updateRouterTree = function (routerFields) {
-      updateDropdown('router', routerFields, 'nodeId', 'routerId', allRouterInfo, 'routers', routerInfo)
-    }
-    var updateAddressTree = function (addressFields) {
-      updateDropdown('address', addressFields, 'uid', 'title', allAddressInfo, 'addresss', addressInfo)
-    }
-    // called whenever a background update is done and an option in the link dropdown is selected
-    var updateLinkTree = function (linkFields) {
-      updateDropdown('link', linkFields, 'uid', 'title', $scope.allLinkInfo, 'links', linkInfo)
-    }
-    var updateConnectionTree = function (connectionFields) {
-      updateDropdown('connection', connectionFields, 'uid', 'host', allConnectionInfo, 'connections', connectionInfo)
-    }
-
-    $scope.data = {}
-    initDropDown('router', allRouterInfo, 'routers')
-    initDropDown('address', allAddressInfo, 'addresss')
-    initDropDown('link', $scope.allLinkInfo, 'links', true)
-    initDropDown('connection', allConnectionInfo, 'connections')
-    initDropDown('log', allLogInfo, 'logs')
-    // called after we are connected to initialize data
-    var initTreeState = function () {
-      allRouterInfo();
-      allAddressInfo();
-      $scope.allLinkInfo();
-      allConnectionInfo()
-
-      var nodeIds = QDRService.nodeIdList()
-      QDRService.getNodeInfo(nodeIds[0], "log", ["module", "enable"], function (nodeName, entity, response) {
-        var moduleIndex = response.attributeNames.indexOf('module')
-        response.results.sort( function (a,b) {return a[moduleIndex] < b[moduleIndex] ? -1 : a[moduleIndex] > b[moduleIndex] ? 1 : 0})
-        response.results.forEach( function (result) {
-          var entry = QDRService.flatten(response.attributeNames, result)
-          $scope.data.log.options.push({id: entry.module, name: entry.module, info: logInfo, type: 'log', fields: entry, pinfo: allLogInfo});
-        })
-        initTreeAndGrid();
-      })
-    }
-
-    $scope.svgCharts = [];
-    var updateTimer;
-    var initCharts = function () {
-      var charts = [];
-      charts.push(QDRChartService.createRequestAndChart(
-        {
-         attr: 'Outstanding deliveries',
-         nodeId: '',
-         name: 'for all endpoints',
-         entity: 'router.link',
-         visibleDuration: 1,
-         duration: 1,
-        }))
-        charts[charts.length-1].getVal = function (linkFields) {
-          var uncountTotal = 0;
-          linkFields.forEach( function (row) {
-            if (row.linkType == 'endpoint' && !QDRService.isConsoleLink(row))
-              uncountTotal += row.undeliveredCount + row.unsettledCount
-          })
-          return uncountTotal;
-        }
-
-      charts.push(QDRChartService.createRequestAndChart(
-        {
-         //type: "rate",
-         attr: 'Outgoing deliveries per second',
-         nodeId: '',
-         name: 'for all endpoints',
-         entity: 'router.link',
-         visibleDuration: 1,
-         duration: 1,
-        }))
-        charts[charts.length-1].getVal = function (linkFields) {
-          var countTotal = 0.0;
-          linkFields.forEach( function (row) {
-            if (row.linkType == 'endpoint' && !QDRService.isConsoleLink(row) && row.linkDir == "out") {
-              countTotal += parseFloat(row.rawRate + "")
-            }
-          })
-          return countTotal;
-        }
-
-      charts.push(QDRChartService.createRequestAndChart(
-        {
-         //type: "rate",
-         attr: 'Incoming deliveries per second',
-         nodeId: '',
-         name: 'for all endpoints',
-         entity: 'router.link',
-         visibleDuration: 1,
-         duration: 1,
-        }))
-        charts[charts.length-1].getVal = function (linkFields) {
-          var countTotal = 0.0;
-          linkFields.forEach( function (row) {
-            if (row.linkType == 'endpoint' && !QDRService.isConsoleLink(row) && row.linkDir == "in")
-              countTotal += parseFloat(row.rawRate + "")
-          })
-          return countTotal;
-        }
-        charts[charts.length-1].areaColor = "#fcd6d6"
-        charts[charts.length-1].lineColor = "#c70404"
-
-      charts.forEach( function (chart) {
-        $scope.svgCharts.push(new QDRChartService.AreaChart(chart));
-      })
-    }
-    initCharts();
-
-    var initTreeAndGrid = function () {
-
-      // show the All routers page
-      $scope.setActivated('link', 'all')
-
-      // populate the data for each expanded node
-      $timeout(updateExpanded);
-      QDRService.addUpdatedAction( "overview", function () {
-        $timeout(updateExpanded);
-        sendChartRequest($scope.svgCharts)
-      })
-      // update the node list
-      QDRService.startUpdating()
-
-      var showChart = function () {
-        // the chart divs are generated by angular and aren't available immediately
-        var div = angular.element("#" + $scope.svgCharts[0].chart.id());
-        if (!div.width()) {
-          setTimeout(showChart, 100);
-          return;
-        }
-        updateDialogChart();
-      }
-
-      var updateDialogChart = function () {
-        $scope.svgCharts.forEach( function ( svgChart) {
-          svgChart.tick(svgChart.chart.id())
-        })
-        if (updateTimer)
-          clearTimeout(updateTimer)
-        updateTimer = setTimeout(updateDialogChart, 1000);
-      }
-      showChart();
-
-      loadColState($scope.allRouters);
-      loadColState($scope.routerGrid);
-      loadColState($scope.addressesGrid);
-      loadColState($scope.addressGrid);
-      loadColState($scope.linksGrid);
-      loadColState($scope.linkGrid);
-      loadColState($scope.allConnectionGrid);
-      loadColState($scope.connectionGrid);
-    } // end of initTreeAndGrid
-
-    $scope.$on("$destroy", function( event ) {
-      QDRService.stopUpdating()
-      QDRService.delUpdatedAction("overview")
-      if (updateTimer)
-        clearTimeout(updateTimer)
-    });
-    initTreeState();
-    QDRService.addDisconnectAction( function () {
-      QDR.log.debug("disconnected from router. show a toast message");
-      if (updateTimer)
-        clearTimeout(updateTimer)
-    })
-  };
-
-  return QDR;
-
-}(QDR || {}));

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/a5e2307f/console/dispatch-dashboard/dispatch/static/dashboard/dispatch/overv/overview.module.js
----------------------------------------------------------------------
diff --git a/console/dispatch-dashboard/dispatch/static/dashboard/dispatch/overv/overview.module.js b/console/dispatch-dashboard/dispatch/static/dashboard/dispatch/overv/overview.module.js
deleted file mode 100644
index cdde521..0000000
--- a/console/dispatch-dashboard/dispatch/static/dashboard/dispatch/overv/overview.module.js
+++ /dev/null
@@ -1,178 +0,0 @@
-/*
- * Licensed 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.
- */
-(function () {
-  'use strict';
-
-  angular
-    .module('horizon.dashboard.dispatch.overv', [])
-    .config(config)
-    .run(addTemplates)
-
-  config.$inject = [
-    '$provide',
-    '$windowProvider'
-  ];
-
-  addTemplates.$inject = [
-    '$templateCache'
-  ]
-
-  /**
-   * @name config
-   * @param {Object} $provide
-   * @param {Object} $windowProvider
-   * @description Base path for the overview code
-   * @returns {undefined} No return value
-   */
-  function config($provide, $windowProvider) {
-    var path = $windowProvider.$get().STATIC_URL + 'dashboard/dispatch/overv/';
-    $provide.constant('horizon.dashboard.dispatch.overv.basePath', path);
-  }
-
-  function addTemplates($templateCache) {
-    $templateCache.put('dispatch/tplLinkRow.html',
-      "<div" +
-      "    ng-repeat=\"(colRenderIndex, col) in colContainer.renderedColumns track by col.uid\"" +
-      "    ui-grid-one-bind-id-grid=\"rowRenderIndex + '-' + col.uid + '-cell'\"" +
-      "    class=\"ui-grid-cell\"" +
-      "    ng-class=\"{ 'ui-grid-row-header-cell': col.isRowHeader, linkDirIn: row.entity.linkDir=='in', linkDirOut: row.entity.linkDir=='out' }\"" +
-      "    role=\"{{col.isRowHeader ? 'rowheader' : 'gridcell'}}\"" +
-      "    ui-grid-cell>" +
-      "</div>"
-    );
-    $templateCache.put('dispatch/links.html',
-      "<h3>Links</h3>" +
-      "<div class='grid' ui-grid='linksGrid' ui-grid-selection></div>"
-    );
-    $templateCache.put('dispatch/link.html',
-      "<h3>Link {$ link.name $}</h3>" +
-      "<div class='grid noHighlight' ui-grid='linkGrid' ui-grid-resize-columns></div>"
-    );
-    $templateCache.put('dispatch/overview.html',
-      "<div id=\"overview-controller\" ng-controller=\"horizon.dashboard.dispatch.overv.OverviewController as ctrl\">" +
-      "    <div id=\"overview_charts\" class=\"clearfix\">" +
-      "        <div ng-repeat=\"chart in svgCharts\" id=\"{$ chart.chart.id() $}\" class=\"d3Chart\"></div>" +
-      "    </div>" +
-      "    <hr/>" +
-      "    <div id=\"overview_dropdowns\" class=\"clearfix\">" +
-      "        <div class=\"overview-dropdown\"" +
-      "             ng-class=\"{selected1: selectedObject.type == 'router', selected: selectedObject.type == 'routers'}\">" +
-      "            <div class=\"dropdown-entity\">Routers</div>" +
-      "            <select id=\"selrouter\" ng-options=\"option.name for option in data.router.options track by option.id\"" +
-      "                    ng-click=\"activated(data.router.sel)\" ng-model=\"data.router.sel\"></select>" +
-      "        </div>" +
-      "        <div class=\"overview-dropdown\"" +
-      "            ng-class=\"{selected1: selectedObject.type == 'address', selected: selectedObject.type == 'addresses'}\">" +
-      "            <div class=\"dropdown-entity\">Addresses</div>" +
-      "            <select id=\"seladdress\" ng-options=\"option.name for option in data.address.options track by option.id\"" +
-      "                ng-click=\"activated(data.address.sel)\" ng-model=\"data.address.sel\"></select>" +
-      "        </div>" +
-      "        <div class=\"overview-dropdown\"" +
-      "            ng-class=\"{selected1: selectedObject.type == 'link', selected: selectedObject.type == 'links'}\">" +
-      "            <div class=\"dropdown-entity\">Links</div>" +
-      "            <select id=\"sellink\" ng-options=\"option.name for option in data.link.options track by option.id\"" +
-      "                    ng-click=\"activated(data.link.sel)\" ng-model=\"data.link.sel\"></select>" +
-      "        </div>" +
-      "        <div class=\"overview-dropdown\"" +
-      "            ng-class=\"{selected1: selectedObject.type == 'connection', selected: selectedObject.type == 'connections'}\">" +
-      "            <div class=\"dropdown-entity\">Connections</div>" +
-      "            <select id=\"selconnection\" ng-options=\"option.name for option in data.connection.options track by option.id\"" +
-      "                    ng-click=\"activated(data.connection.sel)\" ng-model=\"data.connection.sel\"></select>" +
-      "        </div>" +
-      "        <div class=\"overview-dropdown\"" +
-      "            ng-class=\"{selected1: selectedObject.type == 'log', selected: selectedObject.type == 'logs'}\">" +
-      "            <div class=\"dropdown-entity\">Logs</div>" +
-      "            <select id=\"sellog\" ng-options=\"option.name for option in data.log.options track by option.id\"" +
-      "                    ng-click=\"activated(data.log.sel)\" ng-model=\"data.log.sel\"></select>" +
-      "        </div>" +
-      "    </div>" +
-      "    <div ng-include=\"templateUrl\"></div>" +
-      "    <div ng-init=\"overviewLoaded()\"></div>" +
-      "</div>"
-    );
-    $templateCache.put('dispatch/addresss.html',
-      "<h3>Addresses</h3>" +
-      "<div class='grid' ui-grid='addressesGrid' ui-grid-selection></div>"
-    );
-    $templateCache.put('dispatch/address.html',
-      "<ul class=\"nav nav-tabs\">" +
-      "    <li ng-repeat=\"mode in gridModes\" ng-click=\"selectMode(mode,'Address')\" ng-class=\"{active : isModeSelected(mode,'Address')}\" title=\"{$ mode.title $}\" ng-bind-html-unsafe=\"mode.content\"> </li>" +
-      "</ul>" +
-      "<div ng-if=\"isModeVisible('Address','attributes')\" class=\"selectedItems\">" +
-      "    <h3>Address {$ address.name $}</h3>" +
-      "    <div class=\"gridStyle noHighlight\" ui-grid=\"addressGrid\"></div>" +
-      "</div>" +
-      "<div ng-if=\"isModeVisible('Address','links')\" class=\"selectedItems\">" +
-      "    <h3>Links for address {$ address.name $}</h3>" +
-      "    <div class=\"gridStyle\" ui-grid=\"linksGrid\"></div>" +
-      "</div>"
-    );
-
-    $templateCache.put('dispatch/connection.html',
-      "<ul class=\"nav nav-tabs\">" +
-      "    <li ng-repeat=\"mode in gridModes\" ng-click=\"selectMode(mode,'Connection')\" ng-class=\"{active : isModeSelected(mode,'Connection')}\" title=\"{$ mode.title $}\" ng-bind-html-unsafe=\"mode.content\"> </li>" +
-      "</ul>" +
-      "<div ng-if=\"isModeVisible('Connection','attributes')\" class=\"selectedItems\">" +
-      "    <h3>Connection {$ connection.name $}</h3>" +
-      "    <div class=\"gridStyle noHighlight\" ui-grid=\"connectionGrid\"></div>" +
-      "</div>" +
-      "<div ng-if=\"isModeVisible('Connection','links')\" class=\"selectedItems\">" +
-      "    <h3>Links for connection {$ connection.name $}</h3>" +
-      "    <div class=\"gridStyle\" ui-grid=\"linksGrid\"></div>" +
-      "</div>"
-    );
-    $templateCache.put('dispatch/connections.html',
-      "<h3>Connections</h3>" +
-      "<div class=\"overview\">" +
-      "    <div class=\"grid\" ui-grid=\"allConnectionGrid\" ui-grid-selection></div>" +
-      "</div>"
-    );
-    $templateCache.put('dispatch/log.html',
-      "<h3>{$ log.name $}</h3>" +
-      "<div ng-if=\"logFields.length > 0\">" +
-      "    <table class=\"log-entry\" ng-repeat=\"entry in logFields track by $index\">" +
-      "        <tr>" +
-      "            <td>Router</td><td>{$ entry.nodeId $}</td>" +
-      "        </tr>" +
-      "        <tr>" +
-      "            <td align=\"left\" colspan=\"2\">{$ entry.time $}</td>" +
-      "        </tr>" +
-      "        <tr>" +
-      "            <td>Source</td><td>{$ entry.source $}:{$ entry.line $}</td>" +
-      "        </tr>" +
-      "        <tr>" +
-      "            <td valign=\"middle\">Message</td><td valign=\"middle\"><pre>{$ entry.message $}</pre></td>" +
-      "        </tr>" +
-      "    </table>" +
-      "</div>" +
-      "<div ng-if=\"logFields.length == 0\">No log entries for {$ log.name $}</div>"
-    );
-    $templateCache.put('dispatch/logs.html',
-      "<h3>Recent log entries</h3>" +
-      "<div class=\"overview\">" +
-      "    <div class=\"grid\" ui-grid=\"allLogGrid\" ui-grid-selection></div>" +
-      "</div>"
-    );
-    $templateCache.put('dispatch/router.html',
-      "<h3>Router {$ router.name $}</h3>" +
-      "<div class=\"grid noHighlight\" ui-grid=\"routerGrid\"></div>"
-    );
-    $templateCache.put('dispatch/routers.html',
-      "<h3>Routers</h3>" +
-      "<div class=\"overview\">" +
-      "    <div class=\"grid\" ui-grid=\"allRouters\" ui-grid-selection></div>" +
-      "</div>"
-    );
-  }
-})();


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


[02/11] qpid-dispatch git commit: DISPATCH-1001 Removed the deprecated directories

Posted by ea...@apache.org.
http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/a5e2307f/console/dispatch-dashboard/dispatch/static/dashboard/dispatch/topology/topology.controller.js
----------------------------------------------------------------------
diff --git a/console/dispatch-dashboard/dispatch/static/dashboard/dispatch/topology/topology.controller.js b/console/dispatch-dashboard/dispatch/static/dashboard/dispatch/topology/topology.controller.js
deleted file mode 100644
index 208ff43..0000000
--- a/console/dispatch-dashboard/dispatch/static/dashboard/dispatch/topology/topology.controller.js
+++ /dev/null
@@ -1,1703 +0,0 @@
-/*
-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.
-*/
-/**
- * @module QDR
- */
-var QDR = (function (QDR) {
-  'use strict';
-
-  angular
-    .module('horizon.dashboard.dispatch.topology')
-    .controller('horizon.dashboard.dispatch.topology.TopologyController', TopologyController);
-
-  TopologyController.$inject = [
-    '$scope',
-    '$rootScope',
-    'horizon.dashboard.dispatch.comService',
-    '$location',
-    '$timeout',
-    '$modal',
-  ]
-
-  var mouseX, mouseY;
-  var dontHide = false;
-  function hideLinkDetails() {
-    d3.select("#link_details").transition()
-      .duration(500)
-      .style("opacity", 0)
-      .each("end", function (d) {
-          d3.select("#link_details").style("visibility", "hidden")
-      })
-  }
-
-  function TopologyController(
-    $scope,
-    $rootScope,
-    QDRService,
-    $location,
-    $timeout,
-    $modal) {
-
-    var ctrl = this;
-    QDRService.addConnectAction( function () {
-      Topology($scope, $rootScope, QDRService, $location, $timeout, $modal)
-    })
-    QDRService.loadConnectOptions(QDRService.connect);
-
-    $scope.multiData = []
-    $scope.multiDetails = {
-      data: 'multiData',
-      enableRowSelection: true,
-      enableRowHeaderSelection: false,
-      multiSelect: false,
-      enableColumnResize: true,
-      enableColumnReordering: true,
-      enableVerticalScrollbar: 0,
-      enableHorizontalScrollbar: 0,
-      onRegisterApi: function(gridApi){
-        gridApi.selection.on.rowSelectionChanged($scope, function(row){
-          var detailsDiv = d3.select('#link_details')
-          var isVis = detailsDiv.style('visibility') === 'visible';
-          if (!dontHide && isVis && $scope.connectionId === row.entity.connectionId) {
-            hideLinkDetails();
-            return;
-          }
-          dontHide = false;
-          $scope.multiDetails.showLinksList(row)
-        });
-      },
-      showLinksList: function (obj) {
-        $scope.linkData = obj.entity.linkData;
-        $scope.connectionId = obj.entity.connectionId;
-        var visibleLen = Math.min(obj.entity.linkData.length, 10)
-        var left = parseInt(d3.select('#multiple_details').style("left"))
-        var bounds = $("#topology").position()
-        var detailsDiv = d3.select('#link_details')
-        detailsDiv
-          .style({
-            visibility: 'visible',
-            opacity: 1,
-            left: (left + 20) + "px",
-            top:  (mouseY + 40 - bounds.top + $(document).scrollTop()) + "px",
-            height: ((visibleLen + 1) * 30) + 40 + "px", // +1 for the header row
-            'overflow-y': obj.entity.linkData > 10 ? 'scroll' : 'hidden'})
-      },
-      columnDefs: [
-      {
-        field: 'host',
-        displayName: 'Connection host'
-      },
-      {
-        field: 'user',
-        displayName: 'User'
-      },
-      {
-        field: 'properties',
-        displayName: 'Properties'
-      },
-/*
-      {
-        cellClass: 'gridCellButton',
-        cellTemplate: '<button title="{{quiesceText(row)}} the links" type="button" ng-class="quiesceClass(row)" class="btn" ng-click="$event.stopPropagation();quiesceConnection(row)" ng-disabled="quiesceDisabled(row)">{{quiesceText(row)}}</button>'
-      },
-*/
-      ]
-    };
-    $scope.linkData = [];
-    $scope.linkDetails = {
-      data: 'linkData',
-      enableRowSelection: true,
-      enableRowHeaderSelection: false,
-      multiSelect: false,
-      enableColumnResize: true,
-      enableColumnReordering: true,
-      enableVerticalScrollbar: 0,
-      enableHorizontalScrollbar: 0,
-      columnDefs: [
-      {
-        field: 'adminStatus',
-        displayName: 'Admin state'
-      },
-      {
-        field: 'operStatus',
-        displayName: 'Oper state'
-      },
-      {
-        field: 'dir',
-        displayName: 'dir'
-      },
-      {
-        field: 'owningAddr',
-        displayName: 'Address'
-      },
-      {
-        field: 'deliveryCount',
-        displayName: 'Delivered',
-        cellClass: 'grid-values'
-
-      },
-      {
-        field: 'uncounts',
-        displayName: 'Outstanding',
-        cellClass: 'grid-values'
-      }/*,
-      {
-        cellClass: 'gridCellButton',
-        cellTemplate: '<button title="{{quiesceLinkText(row)}} this link" type="button" ng-class="quiesceLinkClass(row)" class="btn" ng-click="quiesceLink(row)" ng-disabled="quiesceLinkDisabled(row)">{{quiesceLinkText(row)}}</button>'
-      }*/
-      ]
-    }
-  }
-
-  function Topology(
-    $scope,
-    $rootScope,
-    QDRService,
-    $location,
-    $timeout,
-    $modal) {
-
-    $scope.quiesceState = {}
-    $scope.quiesceConnection = function (row) {
-      // call method to set adminStatus
-    }
-    $scope.quiesceDisabled = function (row) {
-      return false;
-    }
-    $scope.quiesceText = function (row) {
-      return 'Quiesce'
-    }
-    $scope.quiesceClass = function (row) {
-      var stateClassMap = {
-        enabled: 'btn-primary',
-        quiescing: 'btn-warning',
-        reviving: 'btn-warning',
-        quiesced: 'btn-danger'
-      }
-      return 'btn-primary'
-    }
-    $scope.quiesceLinkClass = function (row) {
-      var stateClassMap = {
-        enabled: 'btn-primary',
-        disabled: 'btn-danger'
-      }
-      return stateClassMap[row.entity.adminStatus]
-    }
-    $scope.quiesceLink = function (row) {
-      QDRService.quiesceLink(row.entity.nodeId, row.entity.name);
-    }
-    $scope.quiesceLinkDisabled = function (row) {
-      return (row.entity.operStatus !== 'up' && row.entity.operStatus !== 'down')
-    }
-    $scope.quiesceLinkText = function (row) {
-      return row.entity.operStatus === 'down' ? "Revive" : "Quiesce";
-    }
-
-    // we are currently connected. setup a handler to get notified if we are ever disconnected
-    QDRService.addDisconnectAction( function () {
-      QDR.log.debug("disconnected from router. show a toast message");
-    })
-
-    var urlPrefix = $location.absUrl();
-    urlPrefix = urlPrefix.split("#")[0]
-    QDR.log.debug("started QDR.TopologyController with urlPrefix: " + urlPrefix);
-
-    $scope.addingNode = {
-      step: 0,
-      hasLink: false,
-      trigger: ''
-    };
-
-    $scope.cancel = function () {
-      $scope.addingNode.step = 0;
-    }
-    $scope.editNewRouter = function () {
-      $scope.addingNode.trigger = 'editNode';
-    }
-
-    var NewRouterName = "__NEW__";
-      // mouse event vars
-    var selected_node = null,
-      selected_link = null,
-      mousedown_link = null,
-      mousedown_node = null,
-      mouseup_node = null,
-      initial_mouse_down_position = null;
-
-    $scope.schema = "Not connected";
-
-    $scope.modes = [
-      {title: 'Topology view', name: 'Diagram', right: false},
-      /* {title: 'Add a new router node', name: 'Add Router', right: true} */
-    ];
-    $scope.mode = "Diagram";
-    $scope.contextNode = null; // node that is associated with the current context menu
-
-    $scope.isModeActive = function (name) {
-      if ((name == 'Add Router' || name == 'Diagram') && $scope.addingNode.step > 0)
-        return true;
-      return ($scope.mode == name);
-    }
-    $scope.selectMode = function (name) {
-      if (name == "Add Router") {
-        name = 'Diagram';
-        if ($scope.addingNode.step > 0) {
-          $scope.addingNode.step = 0;
-        } else {
-          // start adding node mode
-          $scope.addingNode.step = 1;
-        }
-      } else {
-        $scope.addingNode.step = 0;
-      }
-
-      $scope.mode = name;
-    }
-    $scope.$watch(function () {return $scope.addingNode.step}, function (newValue, oldValue) {
-      if (newValue == 0 && oldValue != 0) {
-        // we are cancelling the add
-
-        // find the New node
-        nodes.every(function (n, i) {
-          // for the placeholder node, the key will be __internal__
-          if (QDRService.nameFromId(n.key) == '__internal__') {
-            var newLinks = links.filter(function (e, i) {
-              return e.source.id == n.id || e.target.id == n.id;
-            })
-            // newLinks is an array of links to remove
-            newLinks.map(function (e) {
-              links.splice(links.indexOf(e), 1);
-            })
-            // i is the index of the node to remove
-            nodes.splice(i, 1);
-            force.nodes(nodes).links(links).start();
-                    restart(false);
-            return false; // stop looping
-          }
-          return true;
-        })
-        updateForm(Object.keys(QDRService.topology.nodeInfo())[0], 'router', 0);
-
-      } else if (newValue > 0) {
-        // we are starting the add mode
-        $scope.$broadcast('showAddForm')
-
-        resetMouseVars();
-        selected_node = null;
-        selected_link = null;
-        // add a new node
-        var id = "amqp:/_topo/0/__internal__/$management";
-        var x = radiusNormal * 4;
-        var y = x;;
-        if (newValue > 1) {   // add at current mouse position
-          var offset = jQuery('#topology').offset();
-          x = mouseX - offset.left + $(document).scrollLeft();
-          y = mouseY - offset.top + $(document).scrollTop();;
-        }
-        NewRouterName = genNewName();
-        nodes.push( aNode(id, NewRouterName, "inter-router", undefined, nodes.length, x, y, undefined, true) );
-        force.nodes(nodes).links(links).start();
-        restart(false);
-      }
-    })
-
-    $scope.isRight = function (mode) {
-      return mode.right;
-    }
-
-    // for ng-grid that shows details for multiple consoles/clients
-    // generate unique name for router and containerName
-    var genNewName = function () {
-      var nodeInfo = QDRService.topology.nodeInfo();
-      var nameIndex = 1;
-      var newName = "R." + nameIndex;
-
-      var names = [];
-      for (var key in nodeInfo) {
-        var node = nodeInfo[key];
-        var router = node['.router'];
-        var attrNames = router.attributeNames;
-        var name = QDRService.valFor(attrNames, router.results[0], 'routerId')
-        if (!name)
-          name = QDRService.valFor(attrNames, router.results[0], 'name')
-        names.push(name);
-      }
-
-      while (names.indexOf(newName) >= 0) {
-        newName = "R." + nameIndex++;
-      }
-      return newName;
-    }
-
-    $scope.$watch(function () {return $scope.addingNode.trigger}, function (newValue, oldValue) {
-      if (newValue == 'editNode') {
-        $scope.addingNode.trigger = "";
-        editNode();
-      }
-    })
-
-    function editNode() {
-      doAddDialog(NewRouterName);
-    };
-    $scope.reverseLink = function () {
-      if (!mousedown_link)
-        return;
-      var d = mousedown_link;
-      var tmp = d.left;
-      d.left = d.right;;
-      d.right = tmp;
-        restart(false);
-        tick();
-    }
-    $scope.removeLink = function () {
-      if (!mousedown_link)
-        return;
-      var d = mousedown_link;
-       links.every( function (l, i) {
-        if (l.source.id == d.source.id && l.target.id == d.target.id) {
-              links.splice(i, 1);
-          force.links(links).start();
-          return false; // exit the 'every' loop
-        }
-        return true;
-      });
-        restart(false);
-        tick();
-    }
-    $scope.setFixed = function (b) {
-      if ($scope.contextNode) {
-        $scope.contextNode.fixed = b;
-      }
-      restart();
-    }
-    $scope.isFixed = function () {
-      if (!$scope.contextNode)
-        return false;
-      return ($scope.contextNode.fixed & 0b1);
-    }
-
-    // event handlers for popup context menu
-    $(document).mousemove(function (e) {
-        mouseX = e.clientX;
-        mouseY = e.clientY;
-        //console.log("("+mouseX+"," + mouseY+")")
-    });
-    $(document).mousemove();
-    $(document).click(function (e) {
-      $scope.contextNode = null;
-      $(".contextMenu").fadeOut(200);
-    });
-
-    // set up SVG for D3
-    var colors = {'inter-router': "#EAEAEA", 'normal': "#F0F000", 'on-demand': '#00F000'};
-    var radii = {'inter-router': 25, 'normal': 15, 'on-demand': 15};
-    var radius = 25;
-    var radiusNormal = 15;
-    var svg, lsvg;
-    var force;
-    var animate = false; // should the force graph organize itself when it is displayed
-    var path, circle;
-    var savedKeys = {};
-    var width = 0;
-    var height = 0;
-
-    var getSizes = function () {
-      var legendWidth = 196;
-      var gap = 5;
-      var width = $('.qdrTopology').width() - gap - legendWidth;
-      var top = $('#topology').offset().top
-      var tpformHeight = $('#topologyForm').height()
-      var height = window.innerHeight - tpformHeight - top - gap;
-      if (height < 400)
-        height = 400;
-/*
-      QDR.log.debug("window.innerHeight:" + window.innerHeight +
-        " tpformHeight:" + tpformHeight +
-        " top:" + top +
-        " gap:" + gap +
-        " width:" + width +
-        " height:" + height)
-*/
-      if (width < 10 || height < 30) {
-        QDR.log.info("page width and height are abnormal w:" + width + " height:" + height)
-        return [0,0];
-      }
-      return [width, height]
-    }
-    var resize = function () {
-      var sizes = getSizes();
-      width = sizes[0]
-      height = sizes[1]
-      if (width > 0) {
-          // set attrs and 'resume' force
-          svg.attr('width', width);
-          svg.attr('height', height);
-          force.size(sizes).resume();
-      }
-    }
-    window.addEventListener('resize', resize);
-    var sizes = getSizes()
-    width = sizes[0]
-    height = sizes[1]
-    height = 300
-    if (width <= 0 || height <= 0)
-      return
-
-      // set up initial nodes and links
-      //  - nodes are known by 'id', not by index in array.
-      //  - selected edges are indicated on the node (as a bold red circle).
-      //  - links are always source < target; edge directions are set by 'left' and 'right'.
-    var nodes = [];
-    var links = [];
-
-    var aNode = function (id, name, nodeType, nodeInfo, nodeIndex, x, y, resultIndex, fixed, properties) {
-      properties = properties || {};
-      var routerId;
-      if (nodeInfo) {
-        var node = nodeInfo[id];
-        if (node) {
-          var router = node['.router'];
-          routerId = QDRService.valFor(router.attributeNames, router.results[0], 'id')
-          if (!routerId)
-            routerId = QDRService.valFor(router.attributeNames, router.results[0], 'routerId')
-        }
-      }
-      return {   key: id,
-        name: name,
-        nodeType: nodeType,
-        properties: properties,
-        routerId: routerId,
-        x: x,
-        y: y,
-        id: nodeIndex,
-        resultIndex: resultIndex,
-        fixed: fixed,
-        cls: name == NewRouterName ? 'temp' : ''
-      };
-    };
-
-
-        var initForm = function (attributes, results, entityType, formFields) {
-
-            while(formFields.length > 0) {
-                // remove all existing attributes
-                    formFields.pop();
-            }
-
-            for (var i=0; i<attributes.length; ++i) {
-                var name = attributes[i];
-                var val = results[i];
-                var desc = "";
-                if (entityType.attributes[name])
-                    if (entityType.attributes[name].description)
-                        desc = entityType.attributes[name].description;
-
-                formFields.push({'attributeName': name, 'attributeValue': val, 'description': desc});
-            }
-        }
-
-    // initialize the nodes and links array from the QDRService.topology._nodeInfo object
-    var initForceGraph = function () {
-      nodes = [];
-      links = [];
-
-      svg = d3.select('#topology')
-        .append('svg')
-        .attr("id", "SVG_ID")
-        .attr('width', width)
-        .attr('height', height)
-        .on("contextmenu", function(d) {
-          if (QDR.isHorizon)
-            return;
-          if (d3.event.defaultPrevented)
-            return;
-          d3.event.preventDefault();
-          if ($scope.addingNode.step != 0)
-            return;
-          if (d3.select('#svg_context_menu').style('display') !== 'block')
-            $(document).click();
-          d3.select('#svg_context_menu')
-            .style('left', (mouseX + $(document).scrollLeft()) + "px")
-            .style('top', (mouseY + $(document).scrollTop()) + "px")
-            .style('display', 'block');
-        })
-        .on('click', function (d) {
-          removeCrosssection()
-        });
-
-      $(document).keyup(function(e) {
-        if (e.keyCode === 27) {
-          removeCrosssection()
-        }
-      });
-
-      // the legend
-      lsvg = d3.select("#svg_legend")
-         .append('svg')
-        .attr('id', 'svglegend')
-      lsvg = lsvg.append('svg:g')
-        .attr('transform', 'translate('+(radii['inter-router']+2)+','+(radii['inter-router']+2)+')')
-        .selectAll('g');
-
-      // mouse event vars
-      selected_node = null;
-      selected_link = null;
-      mousedown_link = null;
-      mousedown_node = null;
-      mouseup_node = null;
-
-      // initialize the list of nodes
-      var yInit = 10;
-      var nodeInfo = QDRService.topology.nodeInfo();
-      var nodeCount = Object.keys(nodeInfo).length;
-      for (var id in nodeInfo) {
-        var name = QDRService.nameFromId(id);
-                // if we have any new nodes, animate the force graph to position them
-        var position = angular.fromJson(localStorage[name]);
-        if (!angular.isDefined(position)) {
-            animate = true;
-            position = {x: width / 4 + ((width / 2)/nodeCount) * nodes.length,
-                        y: 200 + yInit,
-                        fixed: false};
-        }
-        if (position.y > height)
-          position.y = 200 - yInit;
-        nodes.push( aNode(id, name, "inter-router", nodeInfo, nodes.length, position.x, position.y, undefined, position.fixed) );
-        yInit *= -1;
-        //QDR.log.debug("adding node " + nodes.length-1);
-      }
-
-      // initialize the list of links
-      var source = 0;
-      var client = 1;
-      for (var id in nodeInfo) {
-        var onode = nodeInfo[id];
-        var conns = onode['.connection'].results;
-        var attrs = onode['.connection'].attributeNames;
-        var parent = getNodeIndex(QDRService.nameFromId(id));
-        //QDR.log.debug("external client parent is " + parent);
-        var normalsParent = {console: undefined, client: undefined}; // 1st normal node for this parent
-
-        for (var j = 0; j < conns.length; j++) {
-                    var role = QDRService.valFor(attrs, conns[j], "role");
-                    var properties = QDRService.valFor(attrs, conns[j], "properties") || {};
-                    var dir = QDRService.valFor(attrs, conns[j], "dir");
-          if (role == "inter-router") {
-            var connId = QDRService.valFor(attrs, conns[j], "container");
-            var target = getContainerIndex(connId);
-            if (target >= 0)
-              getLink(source, target, dir);
-          } else if (role == "normal" || role == "on-demand") {
-            // not a router, but an external client
-            //QDR.log.debug("found an external client for " + id);
-            var name = QDRService.nameFromId(id) + "." + client;
-            //QDR.log.debug("external client name is  " + name + " and the role is " + role);
-
-                        // if we have any new clients, animate the force graph to position them
-                        var position = angular.fromJson(localStorage[name]);
-                        if (!angular.isDefined(position)) {
-                            animate = true;
-                            position = {x: nodes[parent].x + 40 + Math.sin(Math.PI/2 * client),
-                                        y: nodes[parent].y + 40 + Math.cos(Math.PI/2 * client),
-                                        fixed: false};
-                        }
-            if (position.y > height)
-              position.y = nodes[parent].y + 40 + Math.cos(Math.PI/2 * client)
-            var node = aNode(id, name, role, nodeInfo, nodes.length, position.x, position.y, j, position.fixed, properties)
-            var nodeType = QDRService.isAConsole(properties, QDRService.valFor(attrs, conns[j], "identity"), role, node.key)
-
-            if (role === 'normal') {
-              node.user = QDRService.valFor(attrs, conns[j], "user")
-              node.isEncrypted = QDRService.valFor(attrs, conns[j], "isEncrypted")
-              node.host = QDRService.valFor(attrs, conns[j], "host")
-              node.connectionId = QDRService.valFor(attrs, conns[j], "identity")
-
-              if (!normalsParent[nodeType]) {
-                normalsParent[nodeType] = node;
-                nodes.push(  node );
-                node.normals = [node];
-                // now add a link
-                getLink(parent, nodes.length-1, dir);
-                client++;
-              } else {
-                normalsParent[nodeType].normals.push(node)
-              }
-            } else {
-              nodes.push( node)
-              // now add a link
-              getLink(parent, nodes.length-1, dir);
-              client++;
-            }
-          }
-        }
-        source++;
-      }
-
-            $scope.schema = QDRService.schema;
-      // init D3 force layout
-      force = d3.layout.force()
-        .nodes(nodes)
-        .links(links)
-        .size([width, height])
-        .linkDistance(function(d) { return d.target.nodeType === 'inter-router' ? 150 : 65 })
-        .charge(-1800)
-        .friction(.10)
-        .gravity(0.0001)
-        .on('tick', tick)
-        .start()
-
-      svg.append("svg:defs").selectAll('marker')
-        .data(["end-arrow", "end-arrow-selected"])      // Different link/path types can be defined here
-        .enter().append("svg:marker")    // This section adds in the arrows
-        .attr("id", String)
-        .attr("viewBox", "0 -5 10 10")
-        //.attr("refX", 25)
-        .attr("markerWidth", 4)
-        .attr("markerHeight", 4)
-        .attr("orient", "auto")
-        .append("svg:path")
-        .attr('d', 'M 0 -5 L 10 0 L 0 5 z')
-
-      svg.append("svg:defs").selectAll('marker')
-        .data(["start-arrow", "start-arrow-selected"])      // Different link/path types can be defined here
-        .enter().append("svg:marker")    // This section adds in the arrows
-        .attr("id", String)
-        .attr("viewBox", "0 -5 10 10")
-        .attr("refX", 5)
-        .attr("markerWidth", 4)
-        .attr("markerHeight", 4)
-        .attr("orient", "auto")
-        .append("svg:path")
-        .attr('d', 'M 10 -5 L 0 0 L 10 5 z');
-
-      // handles to link and node element groups
-      path = svg.append('svg:g').selectAll('path'),
-      circle = svg.append('svg:g').selectAll('g');
-
-      force.on('end', function() {
-        //QDR.log.debug("force end called");
-        circle
-          .attr('cx', function(d) {
-            localStorage[d.name] = angular.toJson({x: d.x, y: d.y, fixed: d.fixed});
-            return d.x; });
-      });
-
-      // app starts here
-      restart(false);
-          force.start();
-      setTimeout(function () {
-            updateForm(Object.keys(QDRService.topology.nodeInfo())[0], 'router', 0);
-      }, 10)
-
-    }
-
-    function updateForm (key, entity, resultIndex) {
-      var nodeInfo = QDRService.topology.nodeInfo();
-      var onode = nodeInfo[key]
-      if (onode) {
-        var nodeResults = onode['.' + entity].results[resultIndex]
-        var nodeAttributes = onode['.' + entity].attributeNames
-        var attributes = nodeResults.map( function (row, i) {
-          return {
-            attributeName: nodeAttributes[i],
-            attributeValue: row
-          }
-        })
-        // sort by attributeName
-        attributes.sort( function (a, b) { return a.attributeName.localeCompare(b.attributeName) })
-
-        // move the Name first
-        var nameIndex = attributes.findIndex ( function (attr) {
-          return attr.attributeName === 'name'
-        })
-        if (nameIndex >= 0)
-          attributes.splice(0, 0, attributes.splice(nameIndex, 1)[0]);
-        // get the list of ports this router is listening on
-        if (entity === 'router') {
-          var listeners = onode['.listener'].results;
-          var listenerAttributes = onode['.listener'].attributeNames;
-          var normals = listeners.filter ( function (listener) {
-            return QDRService.valFor( listenerAttributes, listener, 'role') === 'normal';
-          })
-          var ports = []
-          normals.forEach (function (normalListener) {
-            ports.push(QDRService.valFor( listenerAttributes, normalListener, 'port'))
-          })
-          // add as 2nd row
-          if (ports.length)
-            attributes.splice(1, 0, {attributeName: 'Listening on', attributeValue: ports, description: 'The port on which this router is listening for connections'});
-        }
-
-        $scope.$broadcast('showEntityForm', {entity: entity, attributes: attributes})
-      }
-      if (!$scope.$$phase) $scope.$apply()
-    }
-
-        function getContainerIndex(_id) {
-            var nodeIndex = 0;
-            var nodeInfo = QDRService.topology.nodeInfo();
-            for (var id in nodeInfo) {
-                var node = nodeInfo[id]['.router'];
-                // there should be only one router entity for each node, so using results[0] should be fine
-                if (QDRService.valFor( node.attributeNames, node.results[0], "id") === _id)
-                    return nodeIndex;
-                if (QDRService.valFor( node.attributeNames, node.results[0], "routerId") === _id)
-                    return nodeIndex;
-                nodeIndex++
-            }
-      // there was no router.id that matched, check deprecated router.routerId
-            nodeIndex = 0;
-            for (var id in nodeInfo) {
-                var node = nodeInfo[id]['.container'];
-        if (node) {
-          if (QDRService.valFor ( node.attributeNames, node.results[0], "containerName") === _id)
-            return nodeIndex;
-        }
-        nodeIndex++
-      }
-            //QDR.log.warn("unable to find containerIndex for " + _id);
-            return -1;
-        }
-
-        function getNodeIndex (_id) {
-            var nodeIndex = 0;
-            var nodeInfo = QDRService.topology.nodeInfo();
-            for (var id in nodeInfo) {
-                if (QDRService.nameFromId(id) == _id) return nodeIndex;
-                nodeIndex++
-            }
-            QDR.log.warn("unable to find nodeIndex for " + _id);
-            return -1;
-        }
-
-        function getLink (_source, _target, dir, cls) {
-            for (var i=0; i < links.length; i++) {
-                var s = links[i].source, t = links[i].target;
-                if (typeof links[i].source == "object") {
-                    s = s.id;
-                    t = t.id;
-        }
-                if (s == _source && t == _target) {
-                    return i;
-                }
-        // same link, just reversed
-                if (s == _target && t == _source) {
-                    return -i;
-        }
-            }
-
-            //QDR.log.debug("creating new link (" + (links.length) + ") between " + nodes[_source].name + " and " + nodes[_target].name);
-            var link = {
-                source: _source,
-                target: _target,
-                left: dir != "out",
-                right: dir == "out",
-                cls: cls
-            };
-            return links.push(link) - 1;
-        }
-
-
-      function resetMouseVars() {
-          mousedown_node = null;
-          mouseup_node = null;
-          mousedown_link = null;
-      }
-
-      // update force layout (called automatically each iteration)
-      function tick() {
-          circle.attr('transform', function (d) {
-                var 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))
-              return 'translate(' + d.x + ',' + d.y + ')';
-          });
-
-          // draw directed edges with proper padding from node centers
-          path.attr('d', function (d) {
-        //QDR.log.debug("in tick for d");
-        //console.dump(d);
-                var sourcePadding, targetPadding, r;
-
-                if (d.target.nodeType == "inter-router") {
-          r = radius;
-          //                       right arrow  left line start
-          sourcePadding = d.left ? radius + 8  : radius;
-          //                      left arrow      right line start
-          targetPadding = d.right ? radius + 16 : radius;
-                } else {
-          r = radiusNormal - 18;
-          sourcePadding = d.left ? radiusNormal + 18  : radiusNormal;
-          targetPadding = d.right ? radiusNormal + 16 : radiusNormal;
-                }
-        var dtx = Math.max(targetPadding, Math.min(width-r, d.target.x)),
-            dty = Math.max(targetPadding, Math.min(height-r, d.target.y)),
-            dsx = Math.max(sourcePadding, Math.min(width-r, d.source.x)),
-          dsy = Math.max(sourcePadding, Math.min(height-r, d.source.y));
-
-              var deltaX = dtx - dsx,
-                  deltaY = dty - dsy,
-                  dist = Math.sqrt(deltaX * deltaX + deltaY * deltaY),
-                  normX = deltaX / dist,
-                  normY = deltaY / dist;
-                  var sourceX = dsx + (sourcePadding * normX),
-                  sourceY = dsy + (sourcePadding * normY),
-                  targetX = dtx - (targetPadding * normX),
-                  targetY = dty - (targetPadding * normY);
-          sourceX = Math.max(0, Math.min(width, sourceX))
-          sourceY = Math.max(0, Math.min(width, sourceY))
-          targetX = Math.max(0, Math.min(width, targetX))
-          targetY = Math.max(0, Math.min(width, targetY))
-
-              return 'M' + sourceX + ',' + sourceY + 'L' + targetX + ',' + targetY;
-          });
-
-          if (!animate) {
-              animate = true;
-              force.stop();
-          }
-      }
-
-        // highlight the paths between the selected node and the hovered node
-        function findNextHopNode(from, d) {
-            // d is the node that the mouse is over
-            // from is the selected_node ....
-            if (!from)
-                return null;
-
-            if (from == d)
-                return selected_node;
-
-            //QDR.log.debug("finding nextHop from: " + from.name + " to " + d.name);
-            var sInfo = QDRService.topology.nodeInfo()[from.key];
-
-            if (!sInfo) {
-                QDR.log.warn("unable to find topology node info for " + from.key);
-                return null;
-            }
-
-            // find the hovered name in the selected name's .router.node results
-            if (!sInfo['.router.node'])
-                return null;
-            var aAr = sInfo['.router.node'].attributeNames;
-            var vAr = sInfo['.router.node'].results;
-            for (var hIdx=0; hIdx<vAr.length; ++hIdx) {
-                var addrT = QDRService.valFor(aAr, vAr[hIdx], "id" );
-                if (addrT == d.name) {
-                    //QDR.log.debug("found " + d.name + " at " + hIdx);
-                    var nextHop = QDRService.valFor(aAr, vAr[hIdx], "nextHop");
-                    //QDR.log.debug("nextHop was " + nextHop);
-                    return (nextHop == null) ? nodeFor(addrT) : nodeFor(nextHop);
-                }
-            }
-            return null;
-        }
-
-        function nodeFor(name) {
-            for (var i=0; i<nodes.length; ++i) {
-                if (nodes[i].name == name)
-                    return nodes[i];
-            }
-            return null;
-        }
-
-        function linkFor(source, target) {
-            for (var i=0; i<links.length; ++i) {
-                if ((links[i].source == source) && (links[i].target == target))
-                    return links[i];
-                if ((links[i].source == target) && (links[i].target == source))
-                    return links[i];
-            }
-            // the selected node was a client/broker
-            //QDR.log.debug("failed to find a link between ");
-            //console.dump(source);
-            //QDR.log.debug(" and ");
-            //console.dump(target);
-            return null;
-        }
-
-    function clearPopups() {
-      d3.select("#crosssection").style("display", "none");
-      $('.hastip').empty();
-      d3.select("#multiple_details").style("visibility", "hidden")
-      d3.select("#link_details").style("visibility", "hidden")
-      d3.select('#node_context_menu').style('display', 'none');
-    }
-    function removeCrosssection() {
-      setTimeout(function () {
-        //d3.select("[id^=tooltipsy]").remove()
-        $('.hastip').empty();
-      }, 1010);
-      d3.select("#crosssection svg g").transition()
-        .duration(1000)
-        .attr("transform", "scale(0)")
-          .style("opacity", 0)
-          .each("end", function (d) {
-              d3.select("#crosssection svg").remove();
-              d3.select("#crosssection").style("display","none");
-          });
-      d3.select("#multiple_details").transition()
-        .duration(500)
-        .style("opacity", 0)
-        .each("end", function (d) {
-            d3.select("#multiple_details").style("visibility", "hidden")
-            stopUpdateConnectionsGrid();
-        })
-      hideLinkDetails();
-    }
-
-    // takes the nodes and links array of objects and adds svg elements for everything that hasn't already
-    // been added
-    function restart(start) {
-      circle.call(force.drag);
-
-      // path (link) group
-      path = path.data(links);
-
-      // update existing links
-      path.classed('selected', function(d) { return d === selected_link; })
-        .classed('highlighted', function(d) { return d.highlighted; } )
-        .classed('temp', function(d) { return d.cls == 'temp'; } )
-          .attr('marker-start', function(d) {
-            var sel = d===selected_link ? '-selected' : '';
-            return d.left ? 'url('+urlPrefix+'#start-arrow' + sel + ')' : ''; })
-          .attr('marker-end', function(d) {
-            var sel = d===selected_link ? '-selected' : '';
-            return d.right ? 'url('+urlPrefix+'#end-arrow' + sel +')' : ''; })
-
-
-      // add new links. if links[] is longer than the existing paths, add a new path for each new element
-      path.enter().append('svg:path')
-        .attr('class', 'link')
-                .attr('marker-start', function(d) {
-                        var sel = d===selected_link ? '-selected' : '';
-            return d.left ? 'url('+urlPrefix+'#start-arrow' + sel + ')' : ''; })
-                .attr('marker-end', function(d) {
-          var sel = d===selected_link ? '-selected' : '';
-                    return d.right ? 'url('+urlPrefix+'#end-arrow' + sel + ')' : ''; })
-            .classed('temp', function(d) { return d.cls == 'temp'; } )
-        // mouseover a line
-        .on('mouseover', function (d) {
-          if($scope.addingNode.step > 0) {
-            if (d.cls == 'temp') {
-                d3.select(this).classed('over', true);
-            }
-            return;
-          }
-              //QDR.log.debug("showing connections form");
-          var resultIndex = 0; // the connection to use
-                    var left = d.left ? d.target : d.source;
-          // right is the node that the arrow points to, left is the other node
-          var right = d.left ? d.source : d.target;
-          var onode = QDRService.topology.nodeInfo()[left.key];
-          // loop through all the connections for left, and find the one for right
-          if (!onode || !onode['.connection'])
-            return;
-                    // update the info dialog for the link the mouse is over
-                    if (!selected_node && !selected_link) {
-                        for (resultIndex=0; resultIndex < onode['.connection'].results.length; ++resultIndex) {
-                            var conn = onode['.connection'].results[resultIndex];
-                            /// find the connection whose container is the right's name
-                            var name = QDRService.valFor(onode['.connection'].attributeNames, conn, "container");
-                            if (name == right.routerId) {
-                                break;
-                            }
-                        }
-                        // did not find connection. this is a connection to a non-interrouter node
-                        if (resultIndex === onode['.connection'].results.length) {
-                            // use the non-interrouter node's connection info
-                            left = d.target;
-                            resultIndex = left.resultIndex;
-                        }
-            if (resultIndex)
-                            updateForm(left.key, 'connection', resultIndex);
-                    }
-
-          mousedown_link = d;
-          selected_link = mousedown_link;
-          restart();
-        })
-        // mouseout a line
-        .on('mouseout', function (d) {
-          if($scope.addingNode.step > 0) {
-            if (d.cls == 'temp') {
-                d3.select(this).classed('over', false);
-            }
-            return;
-          }
-              //QDR.log.debug("showing connections form");
-          selected_link = null;
-          restart();
-        })
-        // contextmenu for a line
-        .on("contextmenu", function(d) {
-          $(document).click();
-          d3.event.preventDefault();
-          if (d.cls !== "temp")
-              return;
-
-          mousedown_link = d;
-          d3.select('#link_context_menu')
-            .style('left', (mouseX + $(document).scrollLeft()) + "px")
-            .style('top', (mouseY + $(document).scrollTop()) + "px")
-            .style('display', 'block');
-        })
-        // clicked on a line
-        .on("click", function (d) {
-          var clickPos = d3.mouse(this);
-          d3.event.stopPropagation();
-          clearPopups();
-          var diameter = 400;
-          var format = d3.format(",d");
-          var pack = d3.layout.pack()
-              .size([diameter - 4, diameter - 4])
-              .padding(-10)
-              .value(function(d) { return d.size; });
-
-          d3.select("#crosssection svg").remove();
-          var svg = d3.select("#crosssection").append("svg")
-              .attr("width", diameter)
-              .attr("height", diameter)
-          var svgg = svg.append("g")
-              .attr("transform", "translate(2,2)");
-
-          var root = {
-            name: " Links between " + d.source.name + " and " + d.target.name,
-            children: []
-          }
-          var nodeInfo = QDRService.topology.nodeInfo();
-          var connections = nodeInfo[d.source.key]['.connection'];
-          var containerIndex = connections.attributeNames.indexOf('container');
-          connections.results.some ( function (connection) {
-            if (connection[containerIndex] == d.target.routerId) {
-              root.attributeNames = connections.attributeNames;
-              root.obj = connection;
-              root.desc = "Connection";
-              return true;    // stop looping after 1 match
-            }
-            return false;
-          })
-
-          // find router.links where link.remoteContainer is d.source.name
-          var links = nodeInfo[d.source.key]['.router.link'];
-          var identityIndex = connections.attributeNames.indexOf('identity')
-          var roleIndex = connections.attributeNames.indexOf('role')
-          var connectionIdIndex = links.attributeNames.indexOf('connectionId');
-          var linkTypeIndex = links.attributeNames.indexOf('linkType');
-          var nameIndex = links.attributeNames.indexOf('name');
-          var linkDirIndex = links.attributeNames.indexOf('linkDir');
-
-          if (roleIndex < 0 || identityIndex < 0 || connectionIdIndex < 0
-            || linkTypeIndex < 0 || nameIndex < 0 || linkDirIndex < 0)
-            return;
-          links.results.forEach ( function (link) {
-            if (root.obj && link[connectionIdIndex] == root.obj[identityIndex] && link[linkTypeIndex] == root.obj[roleIndex])
-              root.children.push (
-                { name: " " + link[linkDirIndex] + " ",
-                size: 100,
-                obj: link,
-                desc: "Link",
-                attributeNames: links.attributeNames
-              })
-          })
-          if (root.children.length == 0)
-            return;
-          var node = svgg.datum(root).selectAll(".node")
-            .data(pack.nodes)
-            .enter().append("g")
-            .attr("class", function(d) { return d.children ? "parent node hastip" : "leaf node hastip"; })
-            .attr("transform", function(d) { return "translate(" + d.x + "," + d.y + ")" + (!d.children ? "scale(0.9)" : ""); })
-            .attr("title", function (d) {
-              var title = "<h4>" + d.desc + "</h4><table class='tiptable'><tbody>";
-              if (d.attributeNames)
-                d.attributeNames.forEach( function (n, i) {
-                  title += "<tr><td>" + n + "</td><td>";
-                  title += d.obj[i] != null ? d.obj[i] : '';
-                  title += '</td></tr>';
-                })
-              title += "</tbody></table>"
-              return title
-            })
-            node.append("circle")
-              .attr("r", function(d) { return d.r; });
-
-//          node.filter(function(d) { return !d.children; }).append("text")
-            node.append("text")
-              .attr("dy", function (d) { return d.children ? "-10em" : ".5em"})
-              .style("text-anchor", "middle")
-              .text(function(d) {
-                  return d.name.substring(0, d.r / 3);
-              });
-          //$('.hastip').tooltipsy({ alignTo: 'cursor'});
-          svgg.attr("transform", "translate(2,2) scale(0.01)")
-
-          var bounds = $("#topology").position()
-          d3.select("#crosssection")
-            .style("display", "block")
-            .style("left", (clickPos[0] + bounds.left) + "px")
-            .style("top", (clickPos[1] + bounds.top) + "px")
-
-          svgg.transition()
-            .attr("transform", "translate(2,2) scale(1)")
-            .each("end", function ()  {
-              d3.selectAll("#crosssection g.leaf text").attr("dy", ".3em")
-            })
-        })
-
-          // remove old links
-          path.exit().remove();
-
-
-          // circle (node) group
-          // nodes are known by id
-          circle = circle.data(nodes, function (d) {
-              return d.id;
-          });
-
-          // update existing nodes visual states
-          circle.selectAll('circle')
-              .classed('selected', function (d) { return (d === selected_node) })
-              .classed('fixed', function (d) { return (d.fixed & 0b1) })
-
-      // add new circle nodes. if nodes[] is longer than the existing paths, add a new path for each new element
-          var g = circle.enter().append('svg:g')
-            .classed('multiple', function(d) { return (d.normals && d.normals.length > 1)  } )
-
-      var appendCircle = function (g) {
-        // add new circles and set their attr/class/behavior
-            return g.append('svg:circle')
-                .attr('class', 'node')
-                .attr('r', function (d) { return radii[d.nodeType] } )
-                .classed('fixed', function (d) {return d.fixed})
-                  .classed('temp', function(d) { return QDRService.nameFromId(d.key) == '__internal__'; } )
-                  .classed('normal', function(d) { return d.nodeType == 'normal' } )
-                  .classed('inter-router', function(d) { return d.nodeType == 'inter-router' } )
-                  .classed('on-demand', function(d) { return d.nodeType == 'on-demand' } )
-                  .classed('console', function(d) { return QDRService.isConsole(d) } )
-                  .classed('artemis', function(d) { return QDRService.isArtemis(d) } )
-                  .classed('qpid-cpp', function(d) { return QDRService.isQpid(d) } )
-                  .classed('client', function(d) { return d.nodeType === 'normal' && !d.properties.console_identifier } )
-      }
-      appendCircle(g)
-        .on('mouseover', function (d) { // mouseover a circle
-          if ($scope.addingNode.step > 0) {
-            d3.select(this).attr('transform', 'scale(1.1)');
-            return;
-          }
-          if (!selected_node) {
-            if (d.nodeType === 'inter-router') {
-              //QDR.log.debug("showing general form");
-              updateForm(d.key, 'router', 0);
-            } else if (d.nodeType === 'normal' || d.nodeType === 'on-demand') {
-              //QDR.log.debug("showing connections form");
-              updateForm(d.key, 'connection', d.resultIndex);
-            }
-          }
-
-          if (d === mousedown_node)
-            return;
-          //if (d === selected_node)
-          //    return;
-          // enlarge target node
-          d3.select(this).attr('transform', 'scale(1.1)');
-          // highlight the next-hop route from the selected node to this node
-          mousedown_node = null;
-          if (!selected_node) {
-              return;
-          }
-          setTimeout(nextHop, 1, selected_node, d);
-        })
-        .on('mouseout', function (d) { // mouseout a circle
-          // unenlarge target node
-          d3.select(this).attr('transform', '');
-          for (var i=0; i<links.length; ++i) {
-            links[i]['highlighted'] = false;
-          }
-          restart();
-        })
-        .on('mousedown', function (d) { // mousedown a circle
-          if (d3.event.button !== 0) {   // ignore all but left button
-            return;
-          }
-          mousedown_node = d;
-          // mouse position relative to svg
-          initial_mouse_down_position = d3.mouse(this.parentElement.parentElement.parentElement).slice();
-        })
-        .on('mouseup', function (d) {  // mouseup a circle
-          if (!mousedown_node)
-            return;
-
-          selected_link = null;
-          // unenlarge target node
-          d3.select(this).attr('transform', '');
-
-          // check for drag
-          mouseup_node = d;
-          var mySvg = this.parentElement.parentElement.parentElement;
-          // if we dragged the node, make it fixed
-          var cur_mouse = d3.mouse(mySvg);
-          if (cur_mouse[0] != initial_mouse_down_position[0] ||
-            cur_mouse[1] != initial_mouse_down_position[1]) {
-              console.log("mouse pos changed. making this node fixed")
-              d3.select(this).classed("fixed", d.fixed = true);
-              resetMouseVars();
-              return;
-          }
-
-          // we didn't drag, we just clicked on the node
-          if ($scope.addingNode.step > 0) {
-            if (d.nodeType !== 'inter-router')
-              return;
-            if (QDRService.nameFromId(d.key) == '__internal__')
-              return;
-
-            // add a link from the clicked node to the new node
-            getLink(d.id, nodes.length-1, "in", "temp");
-            $scope.addingNode.hasLink = true;
-            if (!$scope.$$phase) $scope.$apply()
-            // add new elements to the svg
-            force.links(links).start();
-            restart();
-            return;
-          }
-
-          // if this node was selected, unselect it
-          if (mousedown_node === selected_node) {
-            selected_node = null;
-          }
-          else {
-            if (d.nodeType !== 'normal' && d.nodeType !== 'on-demand')
-              selected_node = mousedown_node;
-          }
-          for (var i=0; i<links.length; ++i) {
-            links[i]['highlighted'] = false;
-          }
-          mousedown_node = null;
-          if (!$scope.$$phase) $scope.$apply()
-            restart(false);
-        })
-        .on("dblclick", function (d) {  // dblclick a circle
-          if (d.fixed) {
-            d3.select(this).classed("fixed", d.fixed = false);
-            force.start();  // let the nodes move to a new position
-          }
-          if (QDRService.nameFromId(d.key) == '__internal__') {
-            editNode();
-            if (!$scope.$$phase) $scope.$apply()
-          }
-        })
-        .on("contextmenu", function(d) { // rightclick a circle
-          $(document).click();
-          d3.event.preventDefault();
-          $scope.contextNode = d;
-          if (!$scope.$$phase) $scope.$apply()     // we just changed a scope valiable during an async event
-          var bounds = $(QDR.offsetParent).offset()
-          d3.select('#node_context_menu')
-            .style('left', (mouseX - bounds.left + $(document).scrollLeft()) + "px")
-            .style('top', (mouseY - bounds.top + $(document).scrollTop()) + "px")
-            .style('display', 'block');
-        })
-        .on("click", function (d) {  // leftclick a circle
-          var clickPos = d3.mouse(this);
-          clearPopups();
-          if (!d.normals) {
-            // circle was a router or a broker
-            if ( QDRService.isArtemis(d) && Core.ConnectionName === 'Artemis' ) {
-              $location.path('/jmx/attributes?tab=artemis&con=Artemis')
-            }
-            return;
-          }
-          // circle was a client or console
-          d3.event.stopPropagation();
-          startUpdateConnectionsGrid(d, clickPos);
-        })
-
-      var appendContent = function (g) {
-        // show node IDs
-        g.append('svg:text')
-          .attr('x', 0)
-          .attr('y', function (d) {
-            var y = 6;
-            if (QDRService.isArtemis(d))
-              y = 8;
-            else if (QDRService.isQpid(d))
-              y = 9;
-            else if (d.nodeType === 'inter-router')
-              y = 4;
-            return y;})
-          .attr('class', 'id')
-          .classed('console', function(d) { return QDRService.isConsole(d) } )
-          .classed('normal', function(d) { return d.nodeType === 'normal' } )
-          .classed('on-demand', function(d) { return d.nodeType === 'on-demand' } )
-          .classed('artemis', function(d) { return QDRService.isArtemis(d) } )
-          .classed('qpid-cpp', function(d) { return QDRService.isQpid(d) } )
-          .text(function (d) {
-            if (QDRService.isConsole(d)) {
-              return '\uf108'; // icon-desktop for this console
-            }
-            if (QDRService.isArtemis(d)) {
-              return '\ue900'
-            }
-            if (QDRService.isQpid(d)) {
-              return '\ue901';
-            }
-            if (d.nodeType === 'normal')
-              return '\uf109'; // icon-laptop for clients
-                    return d.name.length>7 ? d.name.substr(0,6)+'...' : d.name;
-          });
-      }
-      appendContent(g)
-
-      var appendTitle = function (g) {
-        g.append("svg:title").text(function (d) {
-          var x = '';
-          if (d.normals && d.normals.length > 1)
-            x = " x " + d.normals.length;
-          if (QDRService.isConsole(d)) {
-            return 'Dispatch console' + x
-          }
-          if (d.properties.product == 'qpid-cpp') {
-            return 'Broker - qpid-cpp' + x
-          }
-          if ( QDRService.isArtemis(d) ) {
-            return 'Broker - Artemis' + x
-          }
-          return d.nodeType == 'normal' ? 'client' + x : (d.nodeType == 'on-demand' ? 'broker' : 'Router ' + d.name)
-        })
-      }
-      appendTitle(g);
-
-      // remove old nodes
-      circle.exit().remove();
-
-      // add subcircles
-      svg.selectAll('.subcircle').remove();
-      var multiples = svg.selectAll('.multiple')
-      multiples.each( function (d) {
-        d.normals.forEach( function (n, i) {
-          if (i<d.normals.length-1 && i<3) // only show a few shadow circles
-            this.insert('svg:circle', ":first-child")
-            .attr('class', 'subcircle node')
-            .attr('r', 15 - i)
-            .attr('transform', "translate("+ 4 * (i+1) +", 0)")
-        }, d3.select(this))
-      })
-
-      // dynamically create the legend based on which node types are present
-      var legendNodes = [];
-      legendNodes.push(aNode("Router", "", "inter-router", undefined, 0, 0, 0, 0, false, {}))
-
-      if (!svg.selectAll('circle.console').empty()) {
-        legendNodes.push(aNode("Dispatch console", "", "normal", undefined, 1, 0, 0, 0, false, {console_identifier: 'Dispatch console'}))
-      }
-      if (!svg.selectAll('circle.client').empty()) {
-        legendNodes.push(aNode("Client", "", "normal", undefined, 2, 0, 0, 0, false, {}))
-      }
-      if (!svg.selectAll('circle.qpid-cpp').empty()) {
-        legendNodes.push(aNode("Qpid cpp broker", "", "on-demand", undefined, 3, 0, 0, 0, false, {product: 'qpid-cpp'}))
-      }
-      if (!svg.selectAll('circle.artemis').empty()) {
-        legendNodes.push(aNode("Artemis broker", "", "on-demand", undefined, 4, 0, 0, 0, false, {}))
-      }
-      lsvg = lsvg.data(legendNodes, function (d) {
-        return d.id;
-      });
-      var 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))+")"
-        })
-
-      appendCircle(lg)
-      appendContent(lg)
-      appendTitle(lg)
-      lg.append('svg:text')
-        .attr('x', 35)
-        .attr('y', 6)
-        .attr('class', "label")
-        .text(function (d) {return d.key })
-      lsvg.exit().remove();
-      var svgEl = document.getElementById('svglegend')
-      if (svgEl) {
-        var bb;
-        // firefox can throw an exception on getBBox on an svg element
-        try {
-          bb = svgEl.getBBox();
-        } catch (e) {
-          bb = {y: 0, height: 200, x: 0, width: 200}
-        }
-        svgEl.style.height = (bb.y + bb.height) + 'px';
-        svgEl.style.width = (bb.x + bb.width) + 'px';
-      }
-
-      if (!mousedown_node || !selected_node)
-        return;
-
-        if (!start)
-          return;
-        // set the graph in motion
-        //QDR.log.debug("mousedown_node is " + mousedown_node);
-        force.start();
-    }
-
-    // show the links popup and update it periodically
-    var startUpdateConnectionsGrid = function (d, clickPos) {
-      // called every update tick
-      var extendConnections = function () {
-        $scope.multiData = []
-        var normals = d.normals;
-        // find updated normals for d
-        d3.selectAll('.normal')
-          .each(function(newd) {
-            if (newd.id == d.id && newd.name == d.name) {
-              normals = newd.normals;
-            }
-          });
-        if (normals) {
-          normals.forEach( function (n) {
-            var nodeInfo = QDRService.topology.nodeInfo();
-            var links = nodeInfo[n.key]['.router.link'];
-            var linkTypeIndex = links.attributeNames.indexOf('linkType');
-            var connectionIdIndex = links.attributeNames.indexOf('connectionId');
-            n.linkData = [];
-            links.results.forEach( function (linkArray) {
-              var link = QDRService.flatten(links.attributeNames, linkArray)
-              if (link.linkType === 'endpoint' && link.connectionId === n.connectionId) {
-                var l = {};
-                l.owningAddr = link.owningAddr;
-                l.dir = link.linkDir;
-                if (l.owningAddr && l.owningAddr.length > 2)
-                  if (l.owningAddr[0] === 'M')
-                    l.owningAddr = l.owningAddr.substr(2)
-                  else
-                    l.owningAddr = l.owningAddr.substr(1)
-
-                l.deliveryCount = QDRService.pretty(link.deliveryCount);
-                l.uncounts = QDRService.pretty(link.undeliveredCount + link.unsettledCount)
-                l.adminStatus = link.adminStatus;
-                l.operStatus = link.operStatus;
-                l.identity = link.identity
-                l.connectionId = link.connectionId
-                l.nodeId = n.key
-                l.type = link.type
-                l.name = link.name
-
-                //QDR.log.debug("pushing link state for " + l.owningAddr + " status: "+ l.adminStatus)
-                n.linkData.push(l)
-              }
-            })
-            $scope.multiData.push(n)
-            if (n.connectionId == $scope.connectionId)
-              $scope.linkData = n.linkData;
-          })
-        }
-        $scope.$apply();
-
-        d3.select('#multiple_details')
-          .style({
-            height: ((normals.length + 1) * 30) + 40 + "px",
-            'overflow-y': normals.length > 10 ? 'scroll' : 'hidden'
-          })
-
-      }
-
-      // call extendConnections whenever the background data is updated
-      QDRService.addUpdatedAction("normalsStats", extendConnections)
-      extendConnections();
-      clearPopups();
-      var visibility = 'visible'
-      var left = mouseX + $(document).scrollLeft()
-      var bounds = $("#topology").position()
-      if (d.normals.length === 1) {
-        visibility = 'hidden'
-        left = left - 30;
-        mouseY = mouseY - 20
-      }
-      d3.select('#multiple_details')
-        .style({
-          visibility: visibility,
-          opacity: 1,
-          left: (clickPos[0] + bounds.left) + "px",
-          top:  (clickPos[1] + bounds.top) + "px"})
-      if (d.normals.length === 1) {
-        // simulate a click on the connection to popup the link details
-        $scope.multiDetails.showLinksList( {entity: d} )
-      }
-    }
-
-    var stopUpdateConnectionsGrid = function () {
-      QDRService.delUpdatedAction("normalsStats");
-    }
-
-    function nextHop(thisNode, d) {
-      if ((thisNode) && (thisNode != d)) {
-        var target = findNextHopNode(thisNode, d);
-        //QDR.log.debug("highlight link from node ");
-         //console.dump(nodeFor(selected_node.name));
-         //console.dump(target);
-        if (target) {
-          var hlLink = linkFor(nodeFor(thisNode.name), target);
-          //QDR.log.debug("need to highlight");
-          //console.dump(hlLink);
-          if (hlLink)
-            hlLink['highlighted'] = true;
-          else
-            target = null;
-        }
-        setTimeout(nextHop, 1, target, d);
-      }
-      restart();
-    }
-
-
-    function mousedown() {
-      // prevent I-bar on drag
-      //d3.event.preventDefault();
-
-      // because :active only works in WebKit?
-      svg.classed('active', true);
-    }
-
-    QDRService.addUpdatedAction("topology", function() {
-      //QDR.log.debug("Topology controller was notified that the model was updated");
-      if (hasChanged()) {
-        QDR.log.info("svg graph changed")
-        saveChanged();
-        // TODO: update graph nodes instead of rebuilding entire graph
-        d3.select("#SVG_ID").remove();
-        d3.select("#svg_legend svg").remove();
-        animate = true;
-        initForceGraph();
-        //if ($location.path().startsWith("/topology"))
-        //    Core.notification('info', "Qpid dispatch router topology changed");
-
-      } else {
-        //QDR.log.debug("no changes")
-      }
-    });
-
-    function hasChanged () {
-      // Don't update the underlying topology diagram if we are adding a new node.
-      // Once adding is completed, the topology will update automatically if it has changed
-      if ($scope.addingNode.step > 0)
-        return false;
-      var nodeInfo = QDRService.topology.nodeInfo();
-      if (Object.keys(nodeInfo).length != Object.keys(savedKeys).length)
-        return true;
-      for (var key in nodeInfo) {
-                // if this node isn't in the saved node list
-                if (!savedKeys.hasOwnProperty(key))
-                    return true;
-                // if the number of connections for this node chaanged
-                if (nodeInfo[key]['.connection'].results.length != savedKeys[key]) {
-          /*
-          QDR.log.debug("number of connections changed for " + key);
-          QDR.log.debug("QDRService.topology._nodeInfo[key]['.connection'].results.length");
-          console.dump(QDRService.topology._nodeInfo[key]['.connection'].results.length);
-          QDR.log.debug("savedKeys[key]");
-          console.dump(savedKeys[key]);
-          */
-                    return true;
-                }
-      }
-      return false;
-    };
-    function saveChanged () {
-            savedKeys = {};
-            var nodeInfo = QDRService.topology.nodeInfo();
-            // save the number of connections per node
-        for (var key in nodeInfo) {
-            savedKeys[key] = nodeInfo[key]['.connection'].results.length;
-        }
-      //QDR.log.debug("saving current keys");
-      //console.dump(savedKeys);
-    };
-    // we are about to leave the page, save the node positions
-    $rootScope.$on('$locationChangeStart', function(event, newUrl, oldUrl) {
-      //QDR.log.debug("locationChangeStart");
-      nodes.forEach( function (d) {
-             localStorage[d.name] = angular.toJson({x: d.x, y: d.y, fixed: d.fixed});
-      });
-            $scope.addingNode.step = 0;
-
-    });
-    // When the DOM element is removed from the page,
-    // AngularJS will trigger the $destroy event on
-    // the scope
-    $scope.$on("$destroy", function( event ) {
-      //QDR.log.debug("scope on destroy");
-      QDRService.stopUpdating();
-      QDRService.delUpdatedAction("topology");
-      d3.select("#SVG_ID").remove();
-      window.removeEventListener('resize', resize);
-    });
-
-    initForceGraph();
-    saveChanged();
-    QDRService.startUpdating();
-
-    function doAddDialog(NewRouterName) {
-      var d = $modal.dialog({
-      dialogClass: "modal dlg-large",
-      backdrop: true,
-      keyboard: true,
-      backdropClick: true,
-          controller: 'QDR.NodeDialogController',
-          templateUrl: 'node-config-template.html',
-          resolve: {
-              newname: function () {
-                  return NewRouterName;
-              }
-          }
-      });
-      d.open().then(function (result) {
-      if (result)
-        doDownloadDialog(result);
-      });
-    };
-
-    function doDownloadDialog(result) {
-      d = modal.dialog({
-      backdrop: true,
-      keyboard: true,
-      backdropClick: true,
-      controller: 'QDR.DownloadDialogController',
-          templateUrl: 'download-dialog-template.html',
-          resolve: {
-              results: function () {
-                  return result;
-              }
-          }
-      });
-      d.open().then(function (result) {
-      //QDR.log.debug("download dialog done")
-      })
-      if (!$scope.$$phase) $scope.$apply()
-    };
-  };
-
-  return QDR;
-}(QDR || {}));

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/a5e2307f/console/dispatch-dashboard/dispatch/static/dashboard/dispatch/topology/topology.download-controller.js
----------------------------------------------------------------------
diff --git a/console/dispatch-dashboard/dispatch/static/dashboard/dispatch/topology/topology.download-controller.js b/console/dispatch-dashboard/dispatch/static/dashboard/dispatch/topology/topology.download-controller.js
deleted file mode 100644
index 2eb812f..0000000
--- a/console/dispatch-dashboard/dispatch/static/dashboard/dispatch/topology/topology.download-controller.js
+++ /dev/null
@@ -1,150 +0,0 @@
-/*
-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.
-*/
-/**
- * @module QDR
- */
-var QDR = (function (QDR) {
-  'use strict';
-
-  angular
-    .module('horizon.dashboard.dispatch.topology')
-    .controller('horizon.dashboard.dispatch.topology.TopologyDownloadController', TopologyDownloadController);
-
-  TopologyDownloadController.$inject = [
-    '$scope',
-    'horizon.dashboard.dispatch.comService'
-  ]
-
-  function TopologyDownloadController($scope, QDRService, dialog, results) {
-		var result = results.entities;
-		var annotations = results.annotations;
-		var annotationKeys = Object.keys(annotations);
-		var annotationSections = {};
-
-		// use the router's name as the file name if present
-		$scope.newRouterName = 'router';
-		result.forEach( function (e) {
-			if (e.actualName == 'router') {
-				e.attributes.forEach( function (a) {
-					if (a.name == 'name') {
-						$scope.newRouterName = a.value;
-					}
-				})
-			}
-		})
-		$scope.newRouterName = $scope.newRouterName + ".conf";
-
-		var template = $templateCache.get('config-file-header.html');
-		$scope.verbose = true;
-		$scope.$watch('verbose', function (newVal) {
-			if (newVal !== undefined) {
-				// recreate output using current verbose setting
-				getOutput();
-			}
-		})
-
-		var getOutput = function () {
-			$scope.output = template + '\n';
-			$scope.parts = [];
-			var commentChar = '#'
-			result.forEach(function (entity) {
-				// don't output a section for annotations, they get flattened into the entities
-				var section = "";
-				if (entity.icon) {
-					section += "##\n## Add to " + entity.link.__data__.source.name + "'s configuration file\n##\n";
-				}
-				section += "##\n## " + QDRService.humanify(entity.actualName) + " - " + entity.description + "\n##\n";
-				section += entity.actualName + " {\n";
-				entity.attributes.forEach(function (attribute) {
-					if (attribute.input == 'select')
-						attribute.value = attribute.selected;
-
-					// treat values with all spaces and empty strings as undefined
-					attribute.value = String(attribute.value).trim();
-					if (attribute.value === 'undefined' || attribute.value === '')
-						attribute.value = undefined;
-
-					if ($scope.verbose) {
-						commentChar = attribute.required || attribute.value != attribute['default'] ? ' ' : '#';
-						if (!attribute.value) {
-							commentChar = '#';
-							attribute.value = '';
-						}
-						section += commentChar + "    "
-							+ attribute.name + ":" + Array(Math.max(20 - attribute.name.length, 1)).join(" ")
-							+ attribute.value
-						    + Array(Math.max(20 - ((attribute.value)+"").length, 1)).join(" ")
-							+ '# ' + attribute.description
-						    + "\n";
-					} else {
-						if (attribute.value) {
-							if (attribute.value != attribute['default'] || attribute.required)
-								section += "    "
-									+ attribute.name + ":" + Array(20 - attribute.name.length).join(" ")
-									+ attribute.value + "\n";
-
-						}
-					}
-				})
-				section += "}\n\n";
-				// if entity.icon is true, this is a connector intended for another router
-				if (entity.icon)
-					$scope.parts.push({output: section,
-								link: entity.link,
-								name: entity.link.__data__.source.name,
-								references: entity.references});
-				else
-					$scope.output += section;
-
-				// if this section is actually an annotation
-				if (annotationKeys.indexOf(entity.actualName) > -1) {
-					annotationSections[entity.actualName] = section;
-				}
-			})
-			// go back and add annotation sections to the parts
-			$scope.parts.forEach (function (part) {
-				for (var section in annotationSections) {
-					if (part.references.indexOf(section) > -1) {
-						part.output += annotationSections[section];
-					}
-				}
-			})
-			QDR.log.debug($scope.output);
-		}
-
-        // handle the download button click
-        $scope.download = function () {
-			var output = $scope.output + "\n\n"
-			var blob = new Blob([output], { type: 'text/plain;charset=utf-16' });
-			saveAs(blob, $scope.newRouterName);
-        }
-
-		$scope.downloadPart = function (part) {
-			var linkName = part.link.__data__.source.name + 'additional.conf';
-			var blob = new Blob([part.output], { type: 'text/plain;charset=utf-16' });
-			saveAs(blob, linkName);
-		}
-
-		$scope.done = function () {
-	        dialog.close();
-		}
-  };
-
-  return QDR;
-}(QDR || {}));

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/a5e2307f/console/dispatch-dashboard/dispatch/static/dashboard/dispatch/topology/topology.form-controller.js
----------------------------------------------------------------------
diff --git a/console/dispatch-dashboard/dispatch/static/dashboard/dispatch/topology/topology.form-controller.js b/console/dispatch-dashboard/dispatch/static/dashboard/dispatch/topology/topology.form-controller.js
deleted file mode 100644
index 19af366..0000000
--- a/console/dispatch-dashboard/dispatch/static/dashboard/dispatch/topology/topology.form-controller.js
+++ /dev/null
@@ -1,73 +0,0 @@
-/*
-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.
-*/
-/**
- * @module QDR
- */
-var QDR = (function (QDR) {
-  'use strict';
-
-  angular
-    .module('horizon.dashboard.dispatch.topology')
-    .controller('horizon.dashboard.dispatch.topology.TopologyFormController', TopologyFormController);
-
-  TopologyFormController.$inject = [
-    '$scope',
-    'horizon.dashboard.dispatch.comService'
-  ];
-
-  function TopologyFormController($scope, QDRService) {
-    var fctrl = this;
-		$scope.attributes = []
-    var nameTemplate = '<div title="{{row.entity.description}}" class="ngCellText"><span>{{row.entity.attributeName}}</span></div>';
-    var valueTemplate = '<div title="{{row.entity.attributeValue}}" class="ngCellText"><span>{{row.entity.attributeValue}}</span></div>';
-    $scope.topoGridOptions = {
-      data: 'attributes',
-			enableColumnResize: true,
-			multiSelect: false,
-      columnDefs: [
-        {
-          field: 'attributeName',
-//          cellTemplate: nameTemplate,
-          displayName: 'Attribute'
-        },
-        {
-          field: 'attributeValue',
-//          cellTemplate: valueTemplate,
-          displayName: 'Value'
-        }
-      ]
-    };
-		$scope.form = ''
-		$scope.$on('showEntityForm', function (event, args) {
-			var attributes = args.attributes;
-			var entityTypes = QDRService.schema.entityTypes[args.entity].attributes;
-			attributes.forEach( function (attr) {
-				if (entityTypes[attr.attributeName] && entityTypes[attr.attributeName].description)
-					attr.description = entityTypes[attr.attributeName].description
-			})
-			$scope.attributes = attributes;
-			$scope.form = args.entity;
-		})
-		$scope.$on('showAddForm', function (event) {
-			$scope.form = 'add';
-		})
-	}
-
-  return QDR;
-}(QDR || {}));
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/a5e2307f/console/dispatch-dashboard/dispatch/static/dashboard/dispatch/topology/topology.module.js
----------------------------------------------------------------------
diff --git a/console/dispatch-dashboard/dispatch/static/dashboard/dispatch/topology/topology.module.js b/console/dispatch-dashboard/dispatch/static/dashboard/dispatch/topology/topology.module.js
deleted file mode 100644
index e5a5242..0000000
--- a/console/dispatch-dashboard/dispatch/static/dashboard/dispatch/topology/topology.module.js
+++ /dev/null
@@ -1,112 +0,0 @@
-/*
- * Licensed 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.
- */
-(function () {
-  'use strict';
-
-  angular
-    .module('horizon.dashboard.dispatch.topology', [])
-    .config(config)
-    .run(addTemplates)
-
-  config.$inject = [
-    '$provide',
-    '$windowProvider'
-  ];
-
-  addTemplates.$inject = [
-    '$templateCache',
-  ];
-
-  /**
-   * @name config
-   * @param {Object} $provide
-   * @param {Object} $windowProvider
-   * @description Base path for the overview code
-   * @returns {undefined} No return value
-   */
-  function config($provide, $windowProvider) {
-    var path = $windowProvider.$get().STATIC_URL + 'dashboard/dispatch/topology/';
-    $provide.constant('horizon.dashboard.dispatch.topology.basePath', path);
-  }
-
-  function addTemplates($templateCache) {
-    $templateCache.put("dispatch/topology.html",
-      "<div class=\"qdrTopology\" ng-controller=\"horizon.dashboard.dispatch.topology.TopologyController as ctrl\">" +
-      "    <div>" +
-      "<!--" +
-      "        <ul class=\"nav nav-tabs ng-scope qdrTopoModes\">" +
-      "            <li ng-repeat=\"mode in modes\" ng-class=\"{active : isModeActive(mode.name), 'pull-right' : isRight(mode)}\" ng-click=\"selectMode('{{mode.name}}')\" >" +
-      "                <a data-placement=\"bottom\" class=\"ng-binding\"> {{mode.name}} </a></li>" +
-      "        </ul>" +
-      "-->" +
-      "        <div id=\"topology\" ng-show=\"mode == 'Diagram'\"><!-- d3 toplogy here --></div>" +
-      "        <div id=\"geology\" ng-show=\"mode == 'Globe'\"><!-- d3 globe here --></div>" +
-      "        <div id=\"crosssection\"><!-- d3 pack here --></div>" +
-      "        <!-- <div id=\"addRouter\" ng-show=\"mode == 'Add Node'\"></div> -->" +
-      "        <div id=\"node_context_menu\" class=\"contextMenu\">" +
-      "            <ul>" +
-      "                <li class=\"na\" ng-class=\"{new: contextNode.cls == 'temp'}\" ng-click=\"addingNode.trigger = 'editNode'\">Edit...</li>" +
-      "                <li class=\"na\" ng-class=\"{adding: addingNode.step > 0}\" ng-click=\"addingNode.step = 0\">Cancel add</li>" +
-      "                <li class=\"context-separator\"></li>" +
-      "                <li class=\"na\" ng-class=\"{'force-display': !isFixed()}\" ng-click=\"setFixed(true)\">Freeze in place</li>" +
-      "                <li class=\"na\" ng-class=\"{'force-display': isFixed()}\" ng-click=\"setFixed(false)\">Unfreeze</li>" +
-      "            </ul>" +
-      "        </div>" +
-      "        <div id=\"svg_context_menu\" class=\"contextMenu\">" +
-      "            <ul>" +
-      "                <li ng-click=\"addingNode.step = 2\">Add a new router</li>" +
-      "            </ul>" +
-      "        </div>" +
-      "        <div id=\"link_context_menu\" class=\"contextMenu\">" +
-      "            <ul>" +
-      "                <li ng-click=\"reverseLink()\">Reverse connection direction</li>" +
-      "                <li ng-click=\"removeLink()\">Remove connection</li>" +
-      "            </ul>" +
-      "        </div>" +
-      "        <div id=\"svg_legend\"></div>" +
-      "        <div id=\"multiple_details\">" +
-      "            <h4 class=\"grid-title\">Connections</h4>" +
-      "            <div class=\"grid\" ui-grid=\"multiDetails\" ui-grid-selection></div>" +
-      "         </div>" +
-      "        <div id=\"link_details\">" +
-      "            <h4 class=\"grid-title\">Links</h4>" +
-      "            <div class=\"grid\" ui-grid=\"linkDetails\" ui-grid-selection></div>" +
-      "        </div>" +
-      "    </div>" +
-      "    <div ng-controller=\"horizon.dashboard.dispatch.topology.TopologyFormController as fctrl\">" +
-      "        <div id=\"topologyForm\" ng-class=\"{selected : isSelected()}\">" +
-      "            <!-- <div ng-repeat=\"form in forms\" ng-show=\"isVisible(form)\" ng-class='{selected : isSelected(form)}'> -->" +
-      "            <div ng-if=\"form == 'router'\">" +
-      "                <h3>Router Info</h3>" +
-      "                <div class=\"grid\" ui-grid=\"topoGridOptions\"></div>" +
-      "            </div>" +
-      "            <div ng-if=\"form == 'connection'\">" +
-      "                <h3>Connection Info</h3>" +
-      "                <div class=\"grid\" ui-grid=\"topoGridOptions\"></div>" +
-      "            </div>" +
-      "            <div id=\"addNodeForm\" ng-show=\"form == 'add'\">" +
-      "                <h3>Add a new router</h3>" +
-      "                <ul>" +
-      "                    <li>Click on an existing router to create a connection to the new router</li>" +
-      "                    <li>Double-click on the new router to <button ng-click=\"editNewRouter()\">edit</button> its properties</li>" +
-      "                    <li ng-show=\"addingNode.hasLink\" >Right-click on a new connection to edit its properties</li>" +
-      "                </ul>" +
-      "                <button ng-click=\"cancel()\">Cancel</button>" +
-      "            </div>" +
-      "        </div>" +
-      "    </div>" +
-      "</div>"
-    );
-  }
-})();


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


[10/11] qpid-dispatch git commit: DISPATCH-1001 Removed the deprecated directories

Posted by ea...@apache.org.
DISPATCH-1001 Removed the deprecated directories


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

Branch: refs/heads/master
Commit: a5e2307f6dae479f17308a3ff6db2af889196625
Parents: e149d59
Author: Ernest Allen <ea...@redhat.com>
Authored: Wed May 30 19:34:36 2018 -0400
Committer: Ernest Allen <ea...@redhat.com>
Committed: Wed May 30 19:34:36 2018 -0400

----------------------------------------------------------------------
 console/config/README.md                        |    54 -
 console/dispatch-dashboard/MANIFEST.in          |     3 -
 console/dispatch-dashboard/README.rst           |    59 -
 console/dispatch-dashboard/dispatch/__init__.py |    18 -
 .../dispatch-dashboard/dispatch/dashboard.py    |    23 -
 .../dispatch/overv/__init__.py                  |    18 -
 .../dispatch-dashboard/dispatch/overv/panel.py  |    20 -
 .../dispatch/overv/templates/overv/index.html   |    32 -
 .../dispatch-dashboard/dispatch/overv/tests.py  |    19 -
 .../dispatch-dashboard/dispatch/overv/urls.py   |    20 -
 .../dispatch-dashboard/dispatch/overv/views.py  |    22 -
 .../static/dashboard/dispatch/connect.json      |     2 -
 .../dashboard/dispatch/dispatch.comService.js   |   937 -
 .../dashboard/dispatch/dispatch.module.js       |   256 -
 .../static/dashboard/dispatch/dispatch.scss     |  2135 --
 .../dashboard/dispatch/jquery.dynatree.min.js   |     4 -
 .../static/dashboard/dispatch/lib/d3.v3.min.js  |     5 -
 .../static/dashboard/dispatch/lib/rhea-min.js   |     4 -
 .../static/dashboard/dispatch/lib/slider.js     |   233 -
 .../static/dashboard/dispatch/lib/ui-grid.js    | 28540 -----------------
 .../dispatch/overv/overview.controller.js       |  1430 -
 .../dashboard/dispatch/overv/overview.module.js |   178 -
 .../dashboard/dispatch/qdrChartService.js       |  1109 -
 .../dispatch/topology/config-file-header.html   |    17 -
 .../topology/download-dialog-template.html      |    42 -
 .../dispatch/topology/node-config-template.html |    70 -
 .../dispatch/topology/topology.controller.js    |  1703 -
 .../topology/topology.download-controller.js    |   150 -
 .../topology/topology.form-controller.js        |    73 -
 .../dispatch/topology/topology.module.js        |   112 -
 .../topology/topology.node-controller.js        |   294 -
 .../dispatch/templates/dispatch/base.html       |    29 -
 .../dispatch/topology/__init__.py               |    18 -
 .../dispatch/topology/panel.py                  |    20 -
 .../topology/templates/topology/index.html      |    54 -
 .../dispatch/topology/tests.py                  |    19 -
 .../dispatch/topology/urls.py                   |    20 -
 .../dispatch/topology/views.py                  |    22 -
 .../enabled/_4000_dispatch.py                   |    33 -
 .../enabled/_4030_dispatch_overv_panel.py       |    28 -
 .../enabled/_4050_dispatch_topology_panel.py    |    29 -
 console/dispatch-dashboard/setup.py             |    42 -
 42 files changed, 37896 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/a5e2307f/console/config/README.md
----------------------------------------------------------------------
diff --git a/console/config/README.md b/console/config/README.md
deleted file mode 100644
index 61c8e42..0000000
--- a/console/config/README.md
+++ /dev/null
@@ -1,54 +0,0 @@
-<!---
-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.
---->
-This utility is deprecated and has been moved to a separate npm repository.
-This directory will be removed in a future release of interconnect.
-
-To install from the repository, in a new directory:
-
-```npm install dispatch-topology```
-
-
-Qpid Dispatch config file read/update/write utility
-=============
-
-A utility to read, update, write, and deploy dispatch router config files.
-
-Dependencies
-============
-
-- tested using python 2.7
-- npm to install the 3rd party javascript libraries
-  http://blog.npmjs.org/post/85484771375/how-to-install-npm
-
-- ansible if you wish to deploy the routers
-http://docs.ansible.com/ansible/latest/intro_installation.html
-
-Running
-====================
-
-Install the 3rd party javascript libraries:
-- in the console/config/ directory run
-  npm install
-This will create a node_modules/ directory and install the needed files
-
-- run ./config.py
-- in the address bar of a browser, enter localhost:8000
-
-
-

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/a5e2307f/console/dispatch-dashboard/MANIFEST.in
----------------------------------------------------------------------
diff --git a/console/dispatch-dashboard/MANIFEST.in b/console/dispatch-dashboard/MANIFEST.in
deleted file mode 100644
index 1d1b591..0000000
--- a/console/dispatch-dashboard/MANIFEST.in
+++ /dev/null
@@ -1,3 +0,0 @@
-include setup.py
-
-recursive-include dispatch *

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/a5e2307f/console/dispatch-dashboard/README.rst
----------------------------------------------------------------------
diff --git a/console/dispatch-dashboard/README.rst b/console/dispatch-dashboard/README.rst
deleted file mode 100644
index 0a99d07..0000000
--- a/console/dispatch-dashboard/README.rst
+++ /dev/null
@@ -1,59 +0,0 @@
-..
-.. 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
-
-=========
-dispatch_dashboard
-=========
-
-Qpid Dispatch Router Horizon plugin
-
-Manual Installation
--------------------
-
-Copy the contents of this directoty to /opt/stack/dispatch_plugin and setup the plugin::
-
-    cd /opt/stack/dispatch_plugin/
-    python setup.py sdist
-
-If needed, create a virtual environment and install Horizon dependencies::
-
-    cd /opt/stack/horizon
-    python tools/install_venv.py
-
-If needed, set up your ``local_settings.py`` file::
-
-    cp openstack_dashboard/local/local_settings.py.example openstack_dashboard/local/local_settings.py
-
-
-Install the dispatch dashboard in your horizon virtual environment::
-
-    ./tools/with_venv.sh pip install ../dispatch-plugin/dist/dispatch-0.0.1.tar.gz
-
-And enable it in Horizon::
-
-    cp ../dispatch-plugin/enabled/_4*.py openstack_dashboard/local/enabled
-
-If needed, compress the files::
-
-     ./tools/with-venv.sh python manage.py compress
-
-Run a server in the virtual environment::
-
-    ./tools/with-venv.sh python manage.py runserver 0.0.0.0:8080
-
-The horizon dashboard will be available in your browser at http://localhost:8080/

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/a5e2307f/console/dispatch-dashboard/dispatch/__init__.py
----------------------------------------------------------------------
diff --git a/console/dispatch-dashboard/dispatch/__init__.py b/console/dispatch-dashboard/dispatch/__init__.py
deleted file mode 100644
index ccd4780..0000000
--- a/console/dispatch-dashboard/dispatch/__init__.py
+++ /dev/null
@@ -1,18 +0,0 @@
-#
-# 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
-#
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/a5e2307f/console/dispatch-dashboard/dispatch/dashboard.py
----------------------------------------------------------------------
diff --git a/console/dispatch-dashboard/dispatch/dashboard.py b/console/dispatch-dashboard/dispatch/dashboard.py
deleted file mode 100644
index 9fad953..0000000
--- a/console/dispatch-dashboard/dispatch/dashboard.py
+++ /dev/null
@@ -1,23 +0,0 @@
-# Licensed 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.
-
-from django.utils.translation import ugettext_lazy as _
-
-import horizon
-
-
-class Dispatch(horizon.Dashboard):
-    name = _("Qpid Dispatch")
-    slug = "dispatch"
-    default_panel = 'overv'  # slug of the dashboard's default panel.
-
-horizon.register(Dispatch)

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/a5e2307f/console/dispatch-dashboard/dispatch/overv/__init__.py
----------------------------------------------------------------------
diff --git a/console/dispatch-dashboard/dispatch/overv/__init__.py b/console/dispatch-dashboard/dispatch/overv/__init__.py
deleted file mode 100644
index ccd4780..0000000
--- a/console/dispatch-dashboard/dispatch/overv/__init__.py
+++ /dev/null
@@ -1,18 +0,0 @@
-#
-# 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
-#
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/a5e2307f/console/dispatch-dashboard/dispatch/overv/panel.py
----------------------------------------------------------------------
diff --git a/console/dispatch-dashboard/dispatch/overv/panel.py b/console/dispatch-dashboard/dispatch/overv/panel.py
deleted file mode 100644
index 315c7e0..0000000
--- a/console/dispatch-dashboard/dispatch/overv/panel.py
+++ /dev/null
@@ -1,20 +0,0 @@
-# Licensed 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.
-
-from django.utils.translation import ugettext_lazy as _
-
-import horizon
-
-
-class Overv(horizon.Panel):
-    name = _("Overview")
-    slug = "overv"

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/a5e2307f/console/dispatch-dashboard/dispatch/overv/templates/overv/index.html
----------------------------------------------------------------------
diff --git a/console/dispatch-dashboard/dispatch/overv/templates/overv/index.html b/console/dispatch-dashboard/dispatch/overv/templates/overv/index.html
deleted file mode 100644
index b59f5cd..0000000
--- a/console/dispatch-dashboard/dispatch/overv/templates/overv/index.html
+++ /dev/null
@@ -1,32 +0,0 @@
-<!--
- 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
--->
-
-{% extends 'base.html' %}
-{% load i18n %}
-{% block title %}{% trans "Overv" %}{% endblock %}
-
-{% block page_header %}
-  {% include "horizon/common/_page_header.html" with title=_("Overview") %}
-{% endblock page_header %}
-
-{% block main %}
-  <ng-include src="'dispatch/overview.html'"></ng-include>
-{% endblock %}
-
-

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/a5e2307f/console/dispatch-dashboard/dispatch/overv/tests.py
----------------------------------------------------------------------
diff --git a/console/dispatch-dashboard/dispatch/overv/tests.py b/console/dispatch-dashboard/dispatch/overv/tests.py
deleted file mode 100644
index 47816a3..0000000
--- a/console/dispatch-dashboard/dispatch/overv/tests.py
+++ /dev/null
@@ -1,19 +0,0 @@
-# Licensed 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.
-
-from horizon.test import helpers as test
-
-
-class OvervTests(test.TestCase):
-    # Unit tests for overv.
-    def test_me(self):
-        self.assertTrue(1 + 1 == 2)

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/a5e2307f/console/dispatch-dashboard/dispatch/overv/urls.py
----------------------------------------------------------------------
diff --git a/console/dispatch-dashboard/dispatch/overv/urls.py b/console/dispatch-dashboard/dispatch/overv/urls.py
deleted file mode 100644
index 6debf00..0000000
--- a/console/dispatch-dashboard/dispatch/overv/urls.py
+++ /dev/null
@@ -1,20 +0,0 @@
-# Licensed 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.
-
-from django.conf.urls import url
-
-from dispatch.overv import views
-
-
-urlpatterns = [
-    url(r'^$', views.IndexView.as_view(), name='index'),
-]

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/a5e2307f/console/dispatch-dashboard/dispatch/overv/views.py
----------------------------------------------------------------------
diff --git a/console/dispatch-dashboard/dispatch/overv/views.py b/console/dispatch-dashboard/dispatch/overv/views.py
deleted file mode 100644
index 235a0d5..0000000
--- a/console/dispatch-dashboard/dispatch/overv/views.py
+++ /dev/null
@@ -1,22 +0,0 @@
-# Licensed 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.
-
-from horizon import views
-
-
-class IndexView(views.APIView):
-    # A very simple class-based view...
-    template_name = 'dispatch/overv/index.html'
-
-    def get_data(self, request, context, *args, **kwargs):
-        # Add data to the context here...
-        return context

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/a5e2307f/console/dispatch-dashboard/dispatch/static/dashboard/dispatch/connect.json
----------------------------------------------------------------------
diff --git a/console/dispatch-dashboard/dispatch/static/dashboard/dispatch/connect.json b/console/dispatch-dashboard/dispatch/static/dashboard/dispatch/connect.json
deleted file mode 100644
index 2be876d..0000000
--- a/console/dispatch-dashboard/dispatch/static/dashboard/dispatch/connect.json
+++ /dev/null
@@ -1,2 +0,0 @@
-)]}',
-{"address": "0.0.0.0", "port": 5673}

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/a5e2307f/console/dispatch-dashboard/dispatch/static/dashboard/dispatch/dispatch.comService.js
----------------------------------------------------------------------
diff --git a/console/dispatch-dashboard/dispatch/static/dashboard/dispatch/dispatch.comService.js b/console/dispatch-dashboard/dispatch/static/dashboard/dispatch/dispatch.comService.js
deleted file mode 100644
index 72883ec..0000000
--- a/console/dispatch-dashboard/dispatch/static/dashboard/dispatch/dispatch.comService.js
+++ /dev/null
@@ -1,937 +0,0 @@
-/*
-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.
-*/
-
-(function() {
-    console.dump = function(object) {
-        if (window.JSON && window.JSON.stringify)
-            QDR.log.info(JSON.stringify(object,undefined,2));
-        else
-            console.log(object);
-    };
-})();
-
-var QDR = (function(QDR) {
-  'use strict';
-
-  // The QDR service handles the connection to
-  // the server in the background
-  angular
-    .module('horizon.dashboard.dispatch')
-    .factory('horizon.dashboard.dispatch.comService', QDRService);
-
-  QDRService.$inject = [
-    '$rootScope',
-    '$http',
-    '$timeout',
-    '$location',
-    'horizon.dashboard.dispatch.basePath',
-  ];
-
-  function QDRService($rootScope, $http, $timeout, $location, basePath) {
-    var self = {
-
-	  rhea: require("rhea"),
-
-      timeout: 10,
-      connectActions: [],
-      disconnectActions: [],
-      updatedActions: {},
-      stop: undefined,  // update interval handle
-
-      addConnectAction: function(action) {
-        if (angular.isFunction(action)) {
-          self.connectActions.push(action);
-        }
-      },
-      addDisconnectAction: function(action) {
-        if (angular.isFunction(action)) {
-          self.disconnectActions.push(action);
-        }
-      },
-      addUpdatedAction: function(key, action) {
-        if (angular.isFunction(action)) {
-            self.updatedActions[key] = action;
-        }
-      },
-      delUpdatedAction: function(key) {
-        if (key in self.updatedActions)
-            delete self.updatedActions[key];
-      },
-
-      executeConnectActions: function() {
-        self.connectActions.forEach(function(action) {
-          //QDR.log.debug("executing connect action " + action);
-			try {
-                action.apply();
-            } catch (e) {
-                // in case the page that registered the handler has been unloaded
-            }
-        });
-        self.connectActions = [];
-
-      },
-      executeDisconnectActions: function() {
-        self.disconnectActions.forEach(function(action) {
-			try {
-                action.apply();
-            } catch (e) {
-                // in case the page that registered the handler has been unloaded
-            }
-        });
-        self.disconnectActions = [];
-      },
-      executeUpdatedActions: function() {
-        for (var action in self.updatedActions) {
-			try {
-                self.updatedActions[action].apply();
-            } catch (e) {
-                delete self.updatedActions[action]
-            }
-        }
-      },
-	redirectWhenConnected: function (org) {
-		//$location.path(basePath + "/connect")
-		//$location.search('org', org);
-           window.location.replace("/connect/");
-	},
-
-      notifyTopologyDone: function() {
-        //QDR.log.debug("got Toplogy done notice");
-
-        if (!angular.isDefined(self.schema))
-            return;
-        else if (self.topology._gettingTopo)
-            return;
-        if (!self.gotTopology) {
-            QDR.log.debug("topology was just initialized");
-            self.gotTopology = true;
-            self.executeConnectActions();
-            $rootScope.$apply();
-        } else {
-            //QDR.log.debug("topology model was just updated");
-            self.executeUpdatedActions();
-        }
-
-      },
-      /**
-       * @property options
-       * Holds a reference to the connection options when
-       * a connection is started
-       */
-      options: undefined,
-
-      /*
-       * @property message
-       * The proton message that is used to send commands
-       * and receive responses
-       */
-		sender: undefined,
-		receiver: undefined,
-		sendable: false,
-
-      schema: undefined,
-
-      toAddress: undefined,
-      connected: false,
-      gotTopology: false,
-      errorText: undefined,
-	  connectionError: undefined,
-
-      isConnected: function() {
-        return self.connected;
-      },
-
-    correlator: {
-        _objects: {},
-        _corremationID: 0,
-
-        corr: function () {
-            var id = ++this._corremationID + "";
-			this._objects[id] = {resolver: null}
-            return id;
-        },
-        request: function() {
-            //QDR.log.debug("correlator:request");
-            return this;
-        },
-        then: function(id, resolver, error) {
-            //QDR.log.debug("registered then resolver for correlationID: " + id);
-			if (error) {
-	            delete this._objects[id];
-				return;
-			}
-            this._objects[id].resolver = resolver;
-        },
-        // called by receiver's on('message') handler when a response arrives
-        resolve: function(context) {
-			var correlationID = context.message.properties.correlation_id;
-            this._objects[correlationID].resolver(context.message.body, context);
-            delete this._objects[correlationID];
-        }
-    },
-
-    onSubscription: function() {
-        self.getSchema();
-     },
-
-    startUpdating: function () {
-        self.stopUpdating();
-        QDR.log.info("startUpdating called")
-        self.topology.get();
-        self.stop = setInterval(function() {
-            self.topology.get();
-        }, 2000);
-    },
-    stopUpdating: function () {
-        if (angular.isDefined(self.stop)) {
-            QDR.log.info("stopUpdating called")
-            clearInterval(self.stop);
-            self.stop = undefined;
-        }
-    },
-
-      initProton: function() {
-        //self.loadConnectOptions()
-      },
-      cleanUp: function() {
-      },
-      error: function(line) {
-        if (line.num) {
-          QDR.log.debug("error - num: ", line.num, " message: ", line.message);
-        } else {
-          QDR.log.debug("error - message: ", line.message);
-        }
-      },
-      disconnected: function(line) {
-        QDR.log.debug("Disconnected from QDR server");
-        self.executeDisconnectActions();
-      },
-
-      nameFromId: function (id) {
-		    return id.split('/')[3];
-      },
-
-      humanify: function (s) {
-          if (!s || s.length === 0)
-			return s;
-          var t = s.charAt(0).toUpperCase() + s.substr(1).replace(/[A-Z]/g, ' $&');
-          return t.replace(".", " ");
-      },
-	  pretty: function(v) {
-    	var formatComma = d3.format(",");
-		if (!isNaN(parseFloat(v)) && isFinite(v))
-			return formatComma(v);
-		return v;
-	  },
-
-      nodeNameList: function() {
-        var nl = [];
-        // if we are in the middel of updating the topology
-        // then use the last known node info
-        var ni = self.topology._nodeInfo;
-        if (self.topology._gettingTopo)
-            ni = self.topology._lastNodeInfo;
-		for (var id in ni) {
-            nl.push(self.nameFromId(id));
-        }
-        return nl.sort();
-      },
-
-      nodeIdList: function() {
-        var nl = [];
-        // if we are in the middel of updating the topology
-        // then use the last known node info
-        var ni = self.topology._nodeInfo;
-        if (self.topology._gettingTopo)
-            ni = self.topology._lastNodeInfo;
-		for (var id in ni) {
-            nl.push(id);
-        }
-        return nl.sort();
-      },
-
-      nodeList: function () {
-        var nl = [];
-        var ni = self.topology._nodeInfo;
-        if (self.topology._gettingTopo)
-            ni = self.topology._lastNodeInfo;
-		for (var id in ni) {
-            nl.push({name: self.nameFromId(id), id: id});
-        }
-        return nl;
-      },
-
-      // given an attribute name array, find the value at the same index in the values array
-      valFor: function (aAr, vAr, key) {
-          var idx = aAr.indexOf(key);
-          if ((idx > -1) && (idx < vAr.length)) {
-              return vAr[idx];
-          }
-          return null;
-      },
-
-		isArtemis: function (d) {
-			return d.nodeType ==='on-demand' && !d.properties.product;
-		},
-
-		isQpid: function (d) {
-			return d.nodeType ==='on-demand' && (d.properties && d.properties.product === 'qpid-cpp');
-		},
-
-		isAConsole: function (properties, connectionId, nodeType, key) {
-			return self.isConsole({properties: properties, connectionId: connectionId, nodeType: nodeType, key: key})
-		},
-		isConsole: function (d) {
-			// use connection properties if available
-			if (d && d['properties'] && d['properties']['console_identifier'] == 'Dispatch console')
-				return true;
-			return false;
-		},
-
-		flatten: function (attributes, result) {
-			var flat = {}
-			attributes.forEach( function (attr, i) {
-				if (result && result.length > i)
-					flat[attr] = result[i]
-			})
-			return flat;
-		},
-		isConsoleLink: function (link) {
-			// find the connection for this link
-			var conns = self.topology.nodeInfo()[link.nodeId]['.connection']
-			var connIndex = conns.attributeNames.indexOf("identity")
-			var linkCons = conns.results.filter ( function (conn) {
-				return conn[connIndex] === link.connectionId;
-			})
-			var conn = self.flatten(conns.attributeNames, linkCons[0]);
-
-			return self.isConsole(conn)
-		},
-
-		quiesceLink: function (nodeId, name) {
-			function gotMethodResponse (nodeName, entity, response, context) {
-				var statusCode = context.message.application_properties.statusCode;
-				if (statusCode < 200 || statusCode >= 300) {
-					Core.notification('error', context.message.application_properties.statusDescription);
-				}
-			}
-			var attributes = {adminStatus: 'disabled', name: name};
-			self.sendMethod(nodeId, "router.link", attributes, "UPDATE", undefined, gotMethodResponse)
-		},
-
-    connectionOptions: {address: '0.0.0.0', port: 5673},
-    loadConnectOptions: function (callback) {
-      $http.get(basePath + 'connect.json').
-        success(function(data, status, headers, config) {
-        //QDR.log.debug("got connect info from file")
-        //console.dump(data)
-          self.connectionOptions = data;
-          if (callback)
-            callback()
-        }).
-        error(function(data, status, headers, config) {
-        //QDR.log.debug("did not get connect info from file")
-        //console.dump(status)
-          if (callback)
-            callback()
-        });
-    },
-
-		addr_text: function (addr) {
-	        if (!addr)
-	            return "-"
-	        if (addr[0] == 'M')
-	            return addr.substring(2)
-	        else
-	            return addr.substring(1)
-		},
-		addr_class: function (addr) {
-			if (!addr) return "-"
-	        if (addr[0] == 'M')  return "mobile"
-	        if (addr[0] == 'R')  return "router"
-	        if (addr[0] == 'A')  return "area"
-	        if (addr[0] == 'L')  return "local"
-	        if (addr[0] == 'C')  return "link-incoming"
-	        if (addr[0] == 'E')  return "link-incoming"
-	        if (addr[0] == 'D')  return "link-outgoing"
-	        if (addr[0] == 'F')  return "link-outgoing"
-	        if (addr[0] == 'T')  return "topo"
-	        return "unknown: " + addr[0]
-		},
-		identity_clean: function (identity) {
-	        if (!identity)
-	            return "-"
-	        var pos = identity.indexOf('/')
-	        if (pos >= 0)
-	            return identity.substring(pos + 1)
-	        return identity
-		},
-
-      /*
-       * send the management messages that build up the topology
-       *
-       *
-       */
-      topology: {
-        _gettingTopo: false,
-        _nodeInfo: {},
-        _lastNodeInfo: {},
-        _expected: {},
-        _timerHandle: null,
-
-        nodeInfo: function () {
-            return this._gettingTopo ? this._lastNodeInfo : this._nodeInfo;
-        },
-
-        get: function () {
-            if (this._gettingTopo)
-                return;
-            if (!self.connected) {
-				QDR.log.debug("topology get failed because !self.connected")
-                return;
-            }
-            this._lastNodeInfo = angular.copy(this._nodeInfo);
-            this._gettingTopo = true;
-
-            self.errorText = undefined;
-            this.cleanUp(this._nodeInfo);
-            this._nodeInfo = {};
-            this._expected = {};
-
-            // get the list of nodes to query.
-            // once this completes, we will get the info for each node returned
-            self.getRemoteNodeInfo( function (response, context) {
-                //QDR.log.debug("got remote node list of ");
-                //console.dump(response);
-                if( Object.prototype.toString.call( response ) === '[object Array]' ) {
-					if (response.length === 0) {
-						// there is only one router, get its node id from the reeciiver
-						//"amqp:/_topo/0/Router.A/temp.aSO3+WGaoNUgGVx"
-						var address = context.receiver.remote.attach.source.address;
-						var addrParts = address.split('/')
-						addrParts.splice(addrParts.length-1, 1, '$management')
-						response = [addrParts.join('/')]
-					}
-                    // we expect a response for each of these nodes
-                    self.topology.wait(self.timeout);
-                    for (var i=0; i<response.length; ++i) {
-                        self.makeMgmtCalls(response[i]);
-                    }
-                };
-            });
-        },
-
-        cleanUp: function (obj) {
-            //if (obj)
-            //    delete obj;
-        },
-        wait: function (timeout) {
-            this.timerHandle = setTimeout(this.timedOut, timeout * 1000);
-         },
-        timedOut: function () {
-        // a node dropped out. this happens when the get-mgmt-nodex
-        // results contains more nodes than actually respond within
-        // the timeout. However, if the responses we get don't contain
-        // the missing node, assume we are done.
-            QDR.log.info("timed out waiting for management responses");
-            // note: can't use 'this' in a timeout handler
-            self.topology.miniDump("state at timeout");
-            // check if _nodeInfo is consistent
-            if (self.topology.isConsistent()) {
-                //TODO: notify controllers which node was dropped
-                // so they can keep an event log
-                self.topology.ondone();
-                return;
-            }
-            self.topology.onerror(Error("Timed out waiting for management responses"));
-        },
-        isConsistent: function () {
-            // see if the responses we have so far reference any nodes
-            // for which we don't have a response
-            var gotKeys = {};
-            for (var id in this._nodeInfo) {
-                var onode = this._nodeInfo[id];
-                var conn = onode['.connection'];
-                // get list of node names in the connection data
-                if (conn) {
-                    var containerIndex = conn.attributeNames.indexOf('container');
-                    var connectionResults = conn.results;
-                    if (containerIndex >= 0)
-                        for (var j=0; j < connectionResults.length; ++j) {
-                            // inter-router connection to a valid dispatch connection name
-                            gotKeys[connectionResults[j][containerIndex]] = ""; // just add the key
-                        }
-                }
-            }
-            // gotKeys now contains all the container names that we have received
-            // Are any of the keys that are still expected in the gotKeys list?
-            var keys = Object.keys(gotKeys);
-            for (var id in this._expected) {
-                var key = self.nameFromId(id);
-                if (key in keys)
-                    return false;
-            }
-            return true;
-        },
-
-        addNodeInfo: function (id, entity, values) {
-            // save the results in the nodeInfo object
-            if (id) {
-                if (!(id in self.topology._nodeInfo)) {
-                    self.topology._nodeInfo[id] = {};
-                }
-                self.topology._nodeInfo[id][entity] = values;
-            }
-
-            // remove the id / entity from _expected
-            if (id in self.topology._expected) {
-                var entities = self.topology._expected[id];
-                var idx = entities.indexOf(entity);
-                if (idx > -1) {
-                    entities.splice(idx, 1);
-                    if (entities.length == 0)
-                        delete self.topology._expected[id];
-                }
-            }
-            // see if the expected obj is empty
-            if (Object.getOwnPropertyNames(self.topology._expected).length == 0)
-                self.topology.ondone();
-            self.topology.cleanUp(values);
-        },
-        expect: function (id, key) {
-            if (!key || !id)
-                return;
-            if (!(id in this._expected))
-                this._expected[id] = [];
-            if (this._expected[id].indexOf(key) == -1)
-                this._expected[id].push(key);
-        },
-        ondone: function () {
-            clearTimeout(this.timerHandle);
-            this._gettingTopo = false;
-            //this.miniDump();
-            //this.dump();
-            self.notifyTopologyDone();
-         },
-         dump: function (prefix) {
-            if (prefix)
-                QDR.log.info(prefix);
-            QDR.log.info("---");
-            for (var key in this._nodeInfo) {
-                QDR.log.info(key);
-                console.dump(this._nodeInfo[key]);
-                QDR.log.info("---");
-            }
-            QDR.log.debug("was still expecting:");
-            console.dump(this._expected);
-        },
-         miniDump: function (prefix) {
-            if (prefix)
-                QDR.log.info(prefix);
-            QDR.log.info("---");
-            console.dump(Object.keys(this._nodeInfo));
-            QDR.log.info("---");
-        },
-        onerror: function (err) {
-            this._gettingTopo = false;
-            QDR.log.debug("Err:" + err);
-            self.executeDisconnectActions();
-
-        }
-
-      },
-
-      getRemoteNodeInfo: function (callback) {
-	 	//QDR.log.debug("getRemoteNodeInfo called");
-        var ret;
-        // first get the list of remote node names
-	 	self.correlator.request(
-                ret = self.sendMgmtQuery('GET-MGMT-NODES')
-            ).then(ret.id, function(response, context) {
-                callback(response, context);
-                self.topology.cleanUp(response);
-            }, ret.error);
-      },
-
-      makeMgmtCalls: function (id) {
-            var keys = [".router", ".connection", ".container", ".router.node", ".listener", ".router.link"];
-            $.each(keys, function (i, key) {
-                self.topology.expect(id, key);
-                self.getNodeInfo(id, key, [], self.topology.addNodeInfo);
-            });
-      },
-
-      getNodeInfo: function (nodeName, entity, attrs, callback) {
-        //QDR.log.debug("getNodeInfo called with nodeName: " + nodeName + " and entity " + entity);
-        var ret;
-        self.correlator.request(
-            ret = self.sendQuery(nodeName, entity, attrs)
-        ).then(ret.id, function(response) {
-            callback(nodeName, entity, response);
-            //self.topology.addNodeInfo(nodeName, entity, response);
-            //self.topology.cleanUp(response);
-        }, ret.error);
-      },
-
-		getMultipleNodeInfo: function (nodeNames, entity, attrs, callback, selectedNodeId, aggregate) {
-			if (!angular.isDefined(aggregate))
-				aggregate = true;
-			var responses = {};
-			var gotNodesResult = function (nodeName, dotentity, response) {
-				responses[nodeName] = response;
-				if (Object.keys(responses).length == nodeNames.length) {
-					if (aggregate)
-						self.aggregateNodeInfo(nodeNames, entity, selectedNodeId, responses, callback);
-					else {
-						callback(nodeNames, entity, responses)
-					}
-				}
-			}
-
-			nodeNames.forEach( function (id) {
-	            self.getNodeInfo(id, '.'+entity, attrs, gotNodesResult);
-	        })
-			//TODO: implement a timeout in case not all requests complete
-		},
-
-		aggregateNodeInfo: function (nodeNames, entity, selectedNodeId, responses, callback) {
-			//QDR.log.debug("got all results for  " + entity);
-			// aggregate the responses
-			var newResponse = {};
-			var thisNode = responses[selectedNodeId];
-			newResponse['attributeNames'] = thisNode.attributeNames;
-			newResponse['results'] = thisNode.results;
-			newResponse['aggregates'] = [];
-			for (var i=0; i<thisNode.results.length; ++i) {
-				var result = thisNode.results[i];
-				var vals = [];
-				result.forEach( function (val) {
-					vals.push({sum: val, detail: []})
-				})
-				newResponse.aggregates.push(vals);
-			}
-			var nameIndex = thisNode.attributeNames.indexOf("name");
-			var ent = self.schema.entityTypes[entity];
-			var ids = Object.keys(responses);
-			ids.sort();
-			ids.forEach( function (id) {
-				var response = responses[id];
-				var results = response.results;
-				results.forEach( function (result) {
-					// find the matching result in the aggregates
-					var found = newResponse.aggregates.some( function (aggregate, j) {
-						if (aggregate[nameIndex].sum === result[nameIndex]) {
-							// result and aggregate are now the same record, add the graphable values
-							newResponse.attributeNames.forEach( function (key, i) {
-								if (ent.attributes[key] && ent.attributes[key].graph) {
-									if (id != selectedNodeId)
-										aggregate[i].sum += result[i];
-								}
-								aggregate[i].detail.push({node: self.nameFromId(id)+':', val: result[i]})
-							})
-							return true; // stop looping
-						}
-						return false; // continute looking for the aggregate record
-					})
-					if (!found) {
-						// this attribute was not found in the aggregates yet
-						// because it was not in the selectedNodeId's results
-						var vals = [];
-						result.forEach( function (val) {
-							vals.push({sum: val, detail: [{node: self.nameFromId(id), val: val}]})
-						})
-						newResponse.aggregates.push(vals)
-					}
-				})
-			})
-			callback(nodeNames, entity, newResponse);
-		},
-
-
-      getSchema: function () {
-        //QDR.log.debug("getting schema");
-        var ret;
-        self.correlator.request(
-            ret = self.sendMgmtQuery('GET-SCHEMA')
-        ).then(ret.id, function(response) {
-            //QDR.log.debug("Got schema response");
-			// remove deprecated
-			for (var entityName in response.entityTypes) {
-				var entity = response.entityTypes[entityName]
-				if (entity.deprecated) {
-					// deprecated entity
-				    delete response.entityTypes[entityName]
-				} else {
-					for (var attributeName in entity.attributes) {
-						var attribute = entity.attributes[attributeName]
-						if (attribute.deprecated) {
-							// deprecated attribute
-							delete response.entityTypes[entityName].attributes[attributeName]
-						}
-					}
-				}
-			}
-			self.schema = response;
-	        self.topology.get();
-        }, ret.error);
-      },
-
-      getNodeInfo: function (nodeName, entity, attrs, callback) {
-        //QDR.log.debug("getNodeInfo called with nodeName: " + nodeName + " and entity " + entity);
-        var ret;
-        self.correlator.request(
-            ret = self.sendQuery(nodeName, entity, attrs)
-        ).then(ret.id, function(response) {
-            callback(nodeName, entity, response);
-            //self.topology.addNodeInfo(nodeName, entity, response);
-            //self.topology.cleanUp(response);
-        }, ret.error);
-      },
-
-	sendMethod: function (nodeId, entity, attrs, operation, props, callback) {
-		var ret;
-		self.correlator.request(
-			ret = self._sendMethod(nodeId, entity, attrs, operation, props)
-		).then(ret.id, function (response, context) {
-				callback(nodeId, entity, response, context);
-		}, ret.error);
-	},
-
-	_fullAddr: function (toAddr) {
-        var toAddrParts = toAddr.split('/');
-        if (toAddrParts.shift() != "amqp:") {
-            self.topology.error(Error("unexpected format for router address: " + toAddr));
-            return;
-        }
-        //var fullAddr =  self.toAddress + "/" + toAddrParts.join('/');
-        var fullAddr =  toAddrParts.join('/');
-		return fullAddr;
-	},
-
-	_sendMethod: function (toAddr, entity, attrs, operation, props) {
-		var fullAddr = self._fullAddr(toAddr);
-		var ret = {id: self.correlator.corr()};
-		if (!self.sender || !self.sendable) {
-			ret.error = "no sender"
-			return ret;
-		}
-		try {
-			var application_properties = {
-				operation:  operation
-			}
-			if (entity) {
-				var ent = self.schema.entityTypes[entity];
-				var fullyQualifiedType = ent ? ent.fullyQualifiedType : entity;
-				application_properties.type = fullyQualifiedType || entity;
-			}
-			if (attrs.name)
-				application_properties.name = attrs.name;
-			if (props) {
-				jQuery.extend(application_properties, props);
-			}
-			var msg = {
-	                body: attrs,
-	                properties: {
-	                    to:                     fullAddr,
-                        reply_to:               self.receiver.remote.attach.source.address,
-	                    correlation_id:         ret.id
-	                },
-	                application_properties: application_properties
-            }
-            self.sender.send( msg );
-			console.dump("------- method called -------")
-            console.dump (msg)
-		}
-		catch (e) {
-			error = "error sending: " + e;
-			QDR.log.error(error)
-			ret.error = error;
-		}
-		return ret;
-	},
-
-    sendQuery: function(toAddr, entity, attrs, operation) {
-        operation = operation || "QUERY"
-		var fullAddr = self._fullAddr(toAddr);
-
-		var body;
-        if (attrs)
-            body = {
-                    "attributeNames": attrs,
-            }
-        else
-            body = {
-                "attributeNames": [],
-            }
-		if (entity[0] === '.')
-			entity = entity.substr(1, entity.length-1)
-		var prefix = "org.apache.qpid.dispatch."
-		var configs = ["address", "autoLink", "linkRoute"]
-		if (configs.indexOf(entity) > -1)
-			prefix += "router.config."
-		return self._send(body, fullAddr, operation, prefix + entity);
-    },
-
-    sendMgmtQuery: function (operation) {
-		return self._send([], "/$management", operation);
-    },
-
-	_send: function (body, to, operation, entityType) {
-		var ret = {id: self.correlator.corr()};
-		if (!self.sender || !self.sendable) {
-			ret.error = "no sender"
-			return ret;
-		}
-		try {
-			var application_properties = {
-				operation:  operation,
-                type:       "org.amqp.management",
-                name:       "self"
-            };
-			if (entityType)
-                application_properties.entityType = entityType;
-
-	        self.sender.send({
-	                body: body,
-	                properties: {
-	                    to:                     to,
-                        reply_to:               self.receiver.remote.attach.source.address,
-	                    correlation_id:         ret.id
-	                },
-	                application_properties: application_properties
-            })
-		}
-		catch (e) {
-			error = "error sending: " + e;
-			QDR.log.error(error)
-			ret.error = error;
-		}
-		return ret;
-	},
-
-      disconnect: function() {
-        self.connection.close();
-		self.errorText = "Disconnected."
-      },
-
-      connect: function(overrideConnectOptions) {
-  			QDR.log.debug("****** calling rhea.connect ********")
-        var options = self.connectionOptions;
-        if (overrideConnectOptions)
-          options = overrideConnectOptions;
-        self.topologyInitialized = false;
-		    if (!self.connected) {
-			    var okay = {connection: false, sender: false, receiver: false}
-          var port = options.port || 5673;
-          var baseAddress = options.address + ':' + port;
-			    var ws = self.rhea.websocket_connect(WebSocket);
-			    self.toAddress = "amqp://" + baseAddress;
-			    self.connectionError = undefined;
-
-			var stop = function (context) {
-				//self.stopUpdating();
-				okay.sender = false;
-				okay.receiver = false;
-				okay.connected = false;
-				self.connected = false;
-				self.sender = null;
-				self.receiver = null;
-				self.sendable = false;
-				self.gotTopology = false;
-			}
-			var maybeStart = function () {
-				if (okay.connection && okay.sender && okay.receiver && self.sendable && !self.connected) {
-					QDR.log.info("okay to start")
-					self.connected = true;
-					self.connection = connection;
-					self.sender = sender;
-					self.receiver = receiver;
-					self.onSubscription();
-					self.gotTopology = false;
-				}
-			}
-			var onDisconnect = function () {
-				//QDR.log.warn("Disconnected");
-				self.connectionError = true;
-				stop();
-				self.executeDisconnectActions();
-			}
-
-			var connection;
-			try {
-QDR.log.debug("trying to connect to ws://" + baseAddress)
-                connection = self.rhea.connect({
-                    connection_details:ws('ws://' + baseAddress, ["amqp", "binary", "AMQWSB10"]),
-                    reconnect:true,
-                    properties: {console_identifier: 'Dispatch console'}
-	            });
-			}
-			catch (e) {
-				QDR.log.debug("exception caught on connect")
-				self.errorText = "Connection failed"
-				onDisconnect();
-			}
-			if (!self.connectionError) {
-				connection.on('connection_open', function (context) {
-					QDR.log.debug("connection_opened")
-					okay.connection = true;
-					okay.receiver = false;
-					okay.sender = false;
-				})
-				connection.on('disconnected', function (context) {
-					QDR.log.debug("connection disconnected")
-					self.errorText = "Unable to connect"
-					onDisconnect();
-				})
-				connection.on('connection_close', function (context) {
-					QDR.log.debug("connection closed")
-					self.errorText = "Disconnected"
-					onDisconnect();
-				})
-
-				var sender = connection.open_sender();
-				sender.on('sender_open', function (context) {
-					QDR.log.debug("sender_opened")
-					okay.sender = true
-					maybeStart()
-				})
-				sender.on('sendable', function (context) {
-					//QDR.log.debug("sendable")
-					self.sendable = true;
-					maybeStart();
-				})
-
-				var receiver = connection.open_receiver({source: {dynamic: true}});
-				receiver.on('receiver_open', function (context) {
-					QDR.log.debug("receiver_opened")
-					okay.receiver = true;
-					maybeStart()
-				})
-				receiver.on("message", function (context) {
-					self.correlator.resolve(context);
-				});
-			}
-		}
-      }
-    }
-    return self;
-  };
-
-  return QDR;
-}(QDR || {}));

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/a5e2307f/console/dispatch-dashboard/dispatch/static/dashboard/dispatch/dispatch.module.js
----------------------------------------------------------------------
diff --git a/console/dispatch-dashboard/dispatch/static/dashboard/dispatch/dispatch.module.js b/console/dispatch-dashboard/dispatch/static/dashboard/dispatch/dispatch.module.js
deleted file mode 100644
index 48cc85f..0000000
--- a/console/dispatch-dashboard/dispatch/static/dashboard/dispatch/dispatch.module.js
+++ /dev/null
@@ -1,256 +0,0 @@
-/*
-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.
-*/
-/**
- * @module QDR
- * @main QDR
- *
- * The main entry point for the QDR module
- *
- */
-var QDR = (function(QDR) {
-
-  /**
-   * @property pluginName
-   * @type {string}
-   *
-   * The name of this plugin
-   */
-  QDR.pluginName = "QDR";
-  QDR.pluginRoot = "";
-  QDR.isStandalone = true;
-  QDR.isHorizon = true;
-  QDR.offsetParent = ".col-xs-12";
-
-  /**
-   * @property log
-   * @type {Logging.Logger}
-   *
-   * This plugin's logger instance
-   */
-  //HIO QDR.log = Logger.get(QDR.pluginName);
-  /**
-   * @property templatePath
-   * @type {string}
-   *
-   * The top level path to this plugin's partials
-   */
-  QDR.srcBase = "plugin/";
-  QDR.templatePath = QDR.srcBase + "html/";
-  QDR.cssPath = QDR.srcBase + "css/";
-  /**
-   * @property SETTINGS_KEY
-   * @type {string}
-   *
-   * The key used to fetch our settings from local storage
-   */
-  QDR.SETTINGS_KEY = 'QDRSettings';
-  QDR.LAST_LOCATION = "QDRLastLocation";
-
-  /**
-   * @property module
-   * @type {object}
-   *
-   * This plugin's angularjs module instance
-   */
-  QDR.module = angular.module('horizon.dashboard.dispatch',
-    [
-    'ui.grid',
-    'ui.grid.resizeColumns',
-    'ui.grid.selection',
-    'ui.bootstrap',
-    'ui.slider',
-    'horizon.dashboard.dispatch.overv',
-    'horizon.dashboard.dispatch.topology'
-    ])
-
-  Core = {
-	  notification: function (severity, msg) {
-        $.notify(msg, severity);
-    }
-  }
-
-  QDR.module.config(['$provide', '$windowProvider',
-    function ($provide, $windowProvider) {
-      var path = $windowProvider.$get().STATIC_URL + 'dashboard/dispatch/';
-      $provide.constant('horizon.dashboard.dispatch.basePath', path);
-    }
-  ]);
-
-  QDR.module.config(['$compileProvider',
-    function($compileProvider) {
-      $compileProvider.aHrefSanitizationWhitelist(/^\s*(https?|ftp|mailto|file|blob):/);
-    }
-  ]);
-
-	QDR.module.filter('to_trusted', ['$sce', function($sce){
-          return function(text) {
-              return $sce.trustAsHtml(text);
-          };
-    }]);
-
-	QDR.module.filter('humanify', ['horizon.dashboard.dispatch.comService', function (QDRService) {
-		return function (input) {
-			return QDRService.humanify(input);
-		};
-	}]);
-
-	QDR.module.filter('Pascalcase', function () {
-		return function (str) {
-			if (!str)
-				return "";
-			return str.replace(/(\w)(\w*)/g,
-			function(g0,g1,g2){return g1.toUpperCase() + g2.toLowerCase();});
-		}
-	})
-
-    QDR.module.filter('safePlural', function () {
-	        return function (str) {
-				var es = ['x', 'ch', 'ss', 'sh']
-				for (var i=0; i<es.length; ++i) {
-					if (str.endsWith(es[i]))
-						return str + 'es'
-				}
-				if (str.endsWith('y'))
-					return str.substr(0, str.length-2) + 'ies'
-				if (str.endsWith('s'))
-					return str;
-				return str + 's'
-	        }
-	})
-
-	QDR.logger = function ($log) {
-		var log = $log;
-
-		this.debug = function (msg) { msg = "QDR: " + msg; log.debug(msg)};
-		this.error = function (msg) {msg = "QDR: " + msg; log.error(msg)}
-		this.info = function (msg) {msg = "QDR: " + msg; log.info(msg)}
-		this.warn = function (msg) {msg = "QDR: " + msg; log.warn(msg)}
-
-		return this;
-	}
-    // one-time initialization happens in the run function
-    // of our module
-  QDR.module.run(
-    ["$rootScope",
-    '$route',
-    '$timeout',
-    "$location",
-    "$log",
-    "horizon.dashboard.dispatch.comService",
-    "horizon.dashboard.dispatch.chartService",
-    function (
-      $rootScope,
-      $route,
-      $timeout,
-      $location,
-      $log,
-      QDRService,
-      QDRChartService) {
-        QDR.log = new QDR.logger($log);
-        QDR.log.info("*************creating Dispatch Console************");
-
-        var curPath = $location.path()
-        var org = curPath.substr(1)
-        if (org && org.length > 0 && org !== "connect") {
-        //  $location.search('org', org)
-        } else {
-        //  $location.search('org', null)
-        }
-
-        QDRService.initProton();
-        var settings = angular.fromJson(localStorage[QDR.SETTINGS_KEY]);
-        QDRService.addConnectAction(function() {
-          QDRChartService.init(); // initialize charting service after we are connected
-        });
-
-    if (settings && settings.autostart) {
-      QDRService.addDisconnectAction( function () {
-        $timeout(function () {
-          var lastLocation = localStorage[QDR.LAST_LOCATION] || "/overview";
-          org = lastLocation.substr(1)
-          //$location.path("/connect");
-          //$location.search('org', org)
-debugger;
-          window.location.replace("/dispatch/connect/");
-        })
-      })
-      QDRService.addConnectAction(function() {
-        var searchObject = $location.search();
-        // the redirect will be handled by QDRService when connected
-        if (searchObject.org) {
-          return;
-        }
-        // there was no org= parameter, so redirect to last known location
-        $timeout(function () {
-          var lastLocation = localStorage[QDR.LAST_LOCATION] || "/overview";
-          //$location.path(lastLocation);
-        })
-      });
-      QDRService.connect(settings);
-    } else {
-QDR.log.debug("QDR.module run called with location of " + $location.path());
-      $timeout(function () {
-        //$location.path('/connect')
-        //$location.search('org', org)
-//debugger;
-//        window.location.replace("/dispatch/connect/");
-      })
-    }
-
-    $rootScope.$on('$routeChangeSuccess', function() {
-      var path = $location.path();
-      if (path !== "/connect") {
-        localStorage[QDR.LAST_LOCATION] = path;
-      }
-    });
-  }]);
-
-	QDR.module.controller ("QDR.Core", function ($scope, $rootScope) {
-		$scope.alerts = [];
-		$scope.closeAlert = function(index) {
-            $scope.alerts.splice(index, 1);
-        };
-		$scope.$on('newAlert', function(event, data) {
-			$scope.alerts.push(data);
-			$scope.$apply();
-		});
-		$scope.$on("clearAlerts", function () {
-			$scope.alerts = [];
-			$scope.$apply();
-		})
-
-	})
-
-  return QDR;
-}(QDR || {}));
-
-var Folder = (function () {
-    function Folder(title) {
-        this.title = title;
-	this.children = [];
-	this.folder = true;
-    }
-    return Folder;
-})();
-var Leaf = (function () {
-    function Leaf(title) {
-        this.title = title;
-    }
-    return Leaf;
-})();


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


[07/11] qpid-dispatch git commit: DISPATCH-1001 Removed the deprecated directories

Posted by ea...@apache.org.
http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/a5e2307f/console/dispatch-dashboard/dispatch/static/dashboard/dispatch/lib/rhea-min.js
----------------------------------------------------------------------
diff --git a/console/dispatch-dashboard/dispatch/static/dashboard/dispatch/lib/rhea-min.js b/console/dispatch-dashboard/dispatch/static/dashboard/dispatch/lib/rhea-min.js
deleted file mode 100644
index 939f401..0000000
--- a/console/dispatch-dashboard/dispatch/static/dashboard/dispatch/lib/rhea-min.js
+++ /dev/null
@@ -1,4 +0,0 @@
-require=function a(b,c,d){function e(g,h){if(!c[g]){if(!b[g]){var i="function"==typeof require&&require;if(!h&&i)return i(g,!0);if(f)return f(g,!0);var j=new Error("Cannot find module '"+g+"'");throw j.code="MODULE_NOT_FOUND",j}var k=c[g]={exports:{}};b[g][0].call(k.exports,function(a){var c=b[g][1][a];return e(c?c:a)},k,k.exports,a,b,c,d)}return c[g].exports}for(var f="function"==typeof require&&require,g=0;g<d.length;g++)e(d[g]);return e}({1:[function(a,b,c){(function(c,d){"use strict";function e(a,b,c){Error.call(this),Error.captureStackTrace(this,this.constructor),this.message=a,this.condition=b,this.description=a,this.connection=c}function f(a){return a.get_id_string?a.get_id_string():a.localAddress+":"+a.localPort+" -> "+a.remoteAddress+":"+a.remotePort}function g(a){var b=null;return{get_session:function(){return b||(b=a.create_session(),b.begin()),b}}}function h(a,b){if(a){var c,d=a;return function(e){return c!==e&&(d=a,c=e),d--?b(e):-1}}return b}function i(a,b){var c,d=a;re
 turn function(e){c!==e&&(d=a,c=e);var f=d,g=2*d;return d=b>g?g:b,f}}function j(a){if(void 0===a.transport||"tcp"===a.transport)return u.connect;if("tls"===a.transport||"ssl"===a.transport)return v.connect;throw Error("Unrecognised transport: "+a.transport)}function k(a){var b={};return b.connect=a.connect?a.connect:j(a),b.host=a.host?a.host:"localhost",b.port=a.port?a.port:5672,b.options=a,b}function l(a){return function(){return this.remote.open?this.remote.open[a]:void 0}}function m(a){A.prototype["on_"+a]=function(b){var c=this.remote_channel_map[b.channel];if(!c)throw Error(a+" received on invalid channel "+b.channel);c["on_"+a](b)}}var n=a("./frames.js"),o=a("./log.js"),p=a("./sasl.js"),q=a("./util.js"),r=a("./endpoint.js"),s=a("./session.js"),t=a("./transport.js"),u=a("net"),v=a("tls"),w=a("events").EventEmitter,x=0;a("util").inherits(e,Error);var y=["container_id","hostname","max_frame_size","channel_max","idle_time_out","outgoing_locales","incoming_locales","offered_capabili
 ties","desired_capabilities","properties"],z=1,A=function(a,b){if(this.options={},a)for(var c in a)this.options[c]=a[c];if(this.container=b,this.options.id||(this.options.id="connection-"+z++),this.options.container_id||(this.options.container_id=b?b.id:q.generate_uuid()),!this.options.connection_details){var d=this;this.options.connection_details=function(){return k(d.options)}}var e=this.get_option("reconnect",!0);if("boolean"==typeof e&&e){var f=this.get_option("initial_reconnect_delay",100),j=this.get_option("max_reconnect_delay",6e4);this.options.reconnect=h(this.get_option("reconnect_limit"),i(f,j))}else if("number"==typeof e){var m=this.options.reconnect;this.options.reconnect=h(this.get_option("reconnect_limit"),function(){return m})}this.registered=!1,this.state=new r,this.local_channel_map={},this.remote_channel_map={},this.local={},this.remote={},this.local.open=n.open(this.options),this.local.close=n.close({}),this.session_policy=g(this),this.amqp_transport=new t(this.op
 tions.id,x,n.TYPE_AMQP,this),this.sasl_transport=void 0,this.transport=this.amqp_transport,this.conn_established_counter=0,this.heartbeat_out=void 0,this.heartbeat_in=void 0,this.abort_idle=!1,this.socket_ready=!1,this.scheduled_reconnect=void 0,this.default_sender=void 0;for(var o in y){var p=y[o];Object.defineProperty(this,p,{get:l(p)})}Object.defineProperty(this,"error",{get:function(){return this.remote.close?this.remote.close.error:void 0}})};A.prototype=Object.create(w.prototype),A.prototype.constructor=A,A.prototype.dispatch=function(a){return o.events("Connection got event: "+a),this.listeners(a).length?(w.prototype.emit.apply(this,arguments),!0):this.container?this.container.dispatch.apply(this.container,arguments):!1},A.prototype.reset=function(){this.abort_idle&&(this.abort_idle=!1,this.local.close.error=void 0,this.state=new r,this.state.open()),this.amqp_transport=new t(this.options.id,x,n.TYPE_AMQP,this),this.sasl_transport=void 0,this.transport=this.amqp_transport,thi
 s.state.disconnected(),this.remote={},this.remote_channel_map={};for(var a in this.local_channel_map)this.local_channel_map[a].reset();this.socket_ready=!1},A.prototype.connect=function(){return this.is_server=!1,this._connect(this.options.connection_details(this.conn_established_counter)),this.open(),this},A.prototype.reconnect=function(){return this.scheduled_reconnect=void 0,o.reconnect("reconnecting..."),this.reset(),this._connect(this.options.connection_details(this.conn_established_counter)),c.nextTick(this._process.bind(this)),this},A.prototype._connect=function(a){return a.connect?this.init(a.connect(a.port,a.host,a.options,this.connected.bind(this))):this.init(j(a)(a.port,a.host,a.options,this.connected.bind(this))),this},A.prototype.accept=function(a){return this.is_server=!0,o.io("["+this.id+"] client accepted: "+f(a)),this.socket_ready=!0,this.init(a)},A.prototype.init=function(a){if(this.socket=a,this.socket.on("data",this.input.bind(this)),this.socket.on("error",this.o
 n_error.bind(this)),this.socket.on("end",this.eof.bind(this)),this.is_server){var b;this.container&&Object.getOwnPropertyNames(this.container.sasl_server_mechanisms).length&&(b=this.container.sasl_server_mechanisms),this.socket.encrypted&&this.socket.authorized&&this.get_option("enable_sasl_external",!1)&&(b=p.server_add_external(b?q.clone(b):{})),b&&(this.sasl_transport=new p.Server(this,b))}else{var c=this.get_option("sasl_mechanisms");if(!c){var d=this.get_option("username"),e=this.get_option("password");d&&(c=p.client_mechanisms(),e?c.enable_plain(d,e):c.enable_anonymous(d))}this.socket.encrypted&&this.options.cert&&this.get_option("enable_sasl_external",!1)&&(c||(c=p.client_mechanisms()),c.enable_external()),c&&(this.sasl_transport=new p.Client(this,c))}return this.transport=this.sasl_transport?this.sasl_transport:this.amqp_transport,this},A.prototype.attach_sender=function(a){return this.session_policy.get_session().attach_sender(a)},A.prototype.open_sender=A.prototype.attach_
 sender,A.prototype.attach_receiver=function(a){return this.session_policy.get_session().attach_receiver(a)},A.prototype.open_receiver=A.prototype.attach_receiver,A.prototype.get_option=function(a,b){return void 0!==this.options[a]?this.options[a]:this.container?this.container.get_option(a,b):b},A.prototype.send=function(a){return void 0===this.default_sender&&(this.default_sender=this.open_sender({target:{}})),this.default_sender.send(a)},A.prototype.connected=function(){this.socket_ready=!0,this.conn_established_counter++,o.io("["+this.options.id+"] connected "+f(this.socket)),this.output()},A.prototype.sasl_failed=function(a){this.transport_error={condition:"amqp:unauthorized-access",description:a},this._handle_error()},A.prototype._handle_error=function(){var a=this.get_error();if(a){var b=this.dispatch("connection_error",this._context());return b=this.dispatch("connection_close",this._context())||b,b||w.prototype.emit.call(this.container,"error",new e(a.description,a.condition,t
 his)),!0}return!1},A.prototype.get_error=function(){return this.transport_error?this.transport_error:this.remote.close&&this.remote.close.error?this.remote.close.error:void 0},A.prototype.output=function(){this.socket&&this.socket_ready&&(this.heartbeat_out&&clearTimeout(this.heartbeat_out),this.transport.write(this.socket),(this.is_closed()&&this.state.has_settled()||this.abort_idle||this.transport_error)&&!this.transport.has_writes_pending()?this.socket.end():this.is_open()&&this.remote.open.idle_time_out&&(this.heartbeat_out=setTimeout(this._write_frame.bind(this),this.remote.open.idle_time_out/2)))},A.prototype.input=function(a){this.heartbeat_in&&clearTimeout(this.heartbeat_in),o.io("["+this.options.id+"] read "+a.length+" bytes");var b;this.previous_input?(b=d.concat([this.previous_input,a],this.previous_input.length+a.length),this.previous_input=null):b=a;var c=this.transport.read(b,this);c<b.length&&(this.previous_input=b.slice(c)),this.local.open.idle_time_out&&(this.heartb
 eat_in=setTimeout(this.idle.bind(this),this.local.open.idle_time_out)),this.transport.has_writes_pending()?this.output():this.is_closed()&&this.state.has_settled()?this.socket.end():this.is_open()&&this.remote.open.idle_time_out&&!this.heartbeat_out&&(this.heartbeat_out=setTimeout(this._write_frame.bind(this),this.remote.open.idle_time_out/2))},A.prototype.idle=function(){this.is_open()&&(this.abort_idle=!0,this.local.close.error={condition:"amqp:resource-limit-exceeded",description:"max idle time exceeded"},this.close())},A.prototype.on_error=function(a){console.log("["+this.options.id+"] error: "+a),this._disconnected()},A.prototype.eof=function(){this._disconnected()},A.prototype._disconnected=function(){if(this.heartbeat_out&&clearTimeout(this.heartbeat_out),this.heartbeat_in&&clearTimeout(this.heartbeat_in),!this.is_closed()&&void 0===this.scheduled_reconnect&&(this.dispatch("disconnected",this._context())||console.log("["+this.options.id+"] disconnected "),!this.is_server&&!th
 is.transport_error&&this.options.reconnect)){var a=this.options.reconnect(this.conn_established_counter);a>=0&&(o.reconnect("Scheduled reconnect in "+a+"ms"),this.scheduled_reconnect=setTimeout(this.reconnect.bind(this),a))}},A.prototype.open=function(){this.state.open()&&this._register()},A.prototype.close=function(a){a&&(this.local.close.error=a),this.state.close()&&this._register()},A.prototype.is_open=function(){return this.state.is_open()},A.prototype.is_closed=function(){return this.state.is_closed()},A.prototype.create_session=function(){for(var a=0;this.local_channel_map[a];)a++;var b=new s(this,a);return this.local_channel_map[a]=b,b},A.prototype.on_open=function(a){if(!this.state.remote_opened())throw Error("Open already received");this.remote.open=a.performative,this.open(),this.dispatch("connection_open",this._context())},A.prototype.on_close=function(a){if(!this.state.remote_closed())throw Error("Close already received");this.remote.close=a.performative,this.close(),thi
 s.remote.close.error?this._handle_error():this.dispatch("connection_close",this._context()),this.heartbeat_out&&clearTimeout(this.heartbeat_out)},A.prototype._register=function(){this.registered||(this.registered=!0,c.nextTick(this._process.bind(this)))},A.prototype._process=function(){this.registered=!1;do{this.state.need_open()&&this._write_open();for(var a in this.local_channel_map)this.local_channel_map[a]._process();this.state.need_close()&&this._write_close()}while(!this.state.has_settled())},A.prototype._write_frame=function(a,b,c){this.amqp_transport.encode(n.amqp_frame(a,b,c)),this.output()},A.prototype._write_open=function(){this._write_frame(0,this.local.open.described())},A.prototype._write_close=function(){this._write_frame(0,this.local.close.described())},A.prototype.on_begin=function(a){var b;if(null===a.performative.remote_channel||void 0===a.performative.remote_channel)b=this.create_session(),b.local.begin.remote_channel=a.channel;else if(b=this.local_channel_map[a.
 performative.remote_channel],!b)throw Error("Invalid value for remote channel "+a.performative.remote_channel);b.on_begin(a),this.remote_channel_map[a.channel]=b},A.prototype.get_peer_certificate=function(){return this.socket&&this.socket.getPeerCertificate?this.socket.getPeerCertificate():void 0},A.prototype.get_tls_socket=function(){return!this.socket||"tls"!==this.options.transport&&"ssl"!==this.options.transport?void 0:this.socket},A.prototype._context=function(a){var b=a?a:{};return b.connection=this,this.container&&(b.container=this.container),b},m("end"),m("attach"),m("detach"),m("transfer"),m("disposition"),m("flow"),b.exports=A}).call(this,a("_process"),a("buffer").Buffer)},{"./endpoint.js":2,"./frames.js":3,"./log.js":5,"./sasl.js":8,"./session.js":9,"./transport.js":11,"./util.js":13,_process:21,buffer:16,events:20,net:15,tls:15,util:30}],2:[function(a,b,c){"use strict";var d=function(){this.init()};d.prototype.init=function(){this.local_open=!1,this.remote_open=!1,this.o
 pen_requests=0,this.close_requests=0,this.initialised=!1},d.prototype.open=function(){return this.initialised=!0,this.local_open?!1:(this.local_open=!0,this.open_requests++,!0)},d.prototype.close=function(){return this.local_open?(this.local_open=!1,this.close_requests++,!0):!1},d.prototype.disconnected=function(){var a=this.local_open;this.init(),a?this.open():this.close()},d.prototype.remote_opened=function(){return this.remote_open?!1:(this.remote_open=!0,!0)},d.prototype.remote_closed=function(){return this.remote_open?(this.remote_open=!1,!0):!1},d.prototype.is_open=function(){return this.local_open&&this.remote_open},d.prototype.is_closed=function(){return this.initialised&&!this.local_open&&!this.remote_open},d.prototype.has_settled=function(){return 0===this.open_requests&&0===this.close_requests},d.prototype.need_open=function(){return this.open_requests>0?(this.open_requests--,!0):!1},d.prototype.need_close=function(){return this.close_requests>0?(this.close_requests--,!0)
 :!1},b.exports=d},{}],3:[function(a,b,c){"use strict";function d(a,b){var c=e.define_composite(b);f[b.name]=c.create,g[Number(c.descriptor.numeric).toString(10)]=c,g[c.descriptor.symbolic]=c}var e=a("./types.js"),f={},g={};f.read_header=function(a){var b=4,c={},d=a.toString("ascii",0,b);if("AMQP"!==d)throw Error("Invalid protocol header for AMQP "+d);if(c.protocol_id=a.readUInt8(b++),c.major=a.readUInt8(b++),c.minor=a.readUInt8(b++),c.revision=a.readUInt8(b++),1!==c.major||0!==c.minor)throw Error("Unsupported AMQP version: "+JSON.stringify(c));return c},f.write_header=function(a,b){var c=4;return a.write("AMQP",0,c,"ascii"),a.writeUInt8(b.protocol_id,c++),a.writeUInt8(b.major,c++),a.writeUInt8(b.minor,c++),a.writeUInt8(b.revision,c++),8},f.TYPE_AMQP=0,f.TYPE_SASL=1,f.read_frame=function(a){var b=new e.Reader(a),c={};if(c.size=b.read_uint(4),b.remaining<c.size)return null;var d=b.read_uint(1);if(2>d)throw Error("Invalid data offset, must be at least 2 was "+d);if(c.type=b.read_uint(1
 ),c.type===f.TYPE_AMQP)c.channel=b.read_uint(2);else{if(c.type!==f.TYPE_SASL)throw Error("Unknown frame type "+c.type);b.skip(2)}if(d>1&&b.skip(4*d-8),b.remaining()){c.performative=b.read();var h=g[c.performative.descriptor.value];h&&(c.performative=new h(c.performative.value)),b.remaining()&&(c.payload=b.read_bytes(b.remaining()))}return c},f.write_frame=function(a){var b=new e.Writer;if(b.skip(4),b.write_uint(2,1),b.write_uint(a.type,1),a.type===f.TYPE_AMQP)b.write_uint(a.channel,2);else{if(a.type!==f.TYPE_SASL)throw Error("Unknown frame type "+a.type);b.write_uint(0,2)}a.performative&&(b.write(a.performative),a.payload&&b.write_bytes(a.payload));var c=b.toBuffer();return c.writeUInt32BE(c.length,0),c},f.amqp_frame=function(a,b,c){return{channel:a||0,type:f.TYPE_AMQP,performative:b,payload:c}},f.sasl_frame=function(a){return{channel:0,type:f.TYPE_SASL,performative:a}};var h={name:"open",code:16,fields:[{name:"container_id",type:"string",mandatory:!0},{name:"hostname",type:"string"
 },{name:"max_frame_size",type:"uint",default_value:4294967295},{name:"channel_max",type:"ushort",default_value:65535},{name:"idle_time_out",type:"uint"},{name:"outgoing_locales",type:"symbol",multiple:!0},{name:"incoming_locales",type:"symbol",multiple:!0},{name:"offered_capabilities",type:"symbol",multiple:!0},{name:"desired_capabilities",type:"symbol",multiple:!0},{name:"properties",type:"symbolic_map"}]},i={name:"begin",code:17,fields:[{name:"remote_channel",type:"ushort"},{name:"next_outgoing_id",type:"uint",mandatory:!0},{name:"incoming_window",type:"uint",mandatory:!0},{name:"outgoing_window",type:"uint",mandatory:!0},{name:"handle_max",type:"uint",default_value:"4294967295"},{name:"offered_capabilities",type:"symbol",multiple:!0},{name:"desired_capabilities",type:"symbol",multiple:!0},{name:"properties",type:"symbolic_map"}]},j={name:"attach",code:18,fields:[{name:"name",type:"string",mandatory:!0},{name:"handle",type:"uint",mandatory:!0},{name:"role",type:"boolean",mandatory
 :!0},{name:"snd_settle_mode",type:"ubyte",default_value:2},{name:"rcv_settle_mode",type:"ubyte",default_value:0},{name:"source",type:"*"},{name:"target",type:"*"},{name:"unsettled",type:"map"},{name:"incomplete_unsettled",type:"boolean",default_value:!1},{name:"initial_delivery_count",type:"uint"},{name:"max_message_size",type:"ulong"},{name:"offered_capabilities",type:"symbol",multiple:!0},{name:"desired_capabilities",type:"symbol",multiple:!0},{name:"properties",type:"symbolic_map"}]},k={name:"flow",code:19,fields:[{name:"next_incoming_id",type:"uint"},{name:"incoming_window",type:"uint",mandatory:!0},{name:"next_outgoing_id",type:"uint",mandatory:!0},{name:"outgoing_window",type:"uint",mandatory:!0},{name:"handle",type:"uint"},{name:"delivery_count",type:"uint"},{name:"link_credit",type:"uint"},{name:"available",type:"uint"},{name:"drain",type:"boolean",default_value:!1},{name:"echo",type:"boolean",default_value:!1},{name:"properties",type:"symbolic_map"}]},l={name:"transfer",cod
 e:20,fields:[{name:"handle",type:"uint",mandatory:!0},{name:"delivery_id",type:"uint"},{name:"delivery_tag",type:"binary"},{name:"message_format",type:"uint"},{name:"settled",type:"boolean"},{name:"more",type:"boolean",default_value:!1},{name:"rcv_settle_mode",type:"ubyte"},{name:"state",type:"delivery_state"},{name:"resume",type:"boolean",default_value:!1},{name:"aborted",type:"boolean",default_value:!1},{name:"batchable",type:"boolean",default_value:!1}]},m={name:"disposition",code:21,fields:[{name:"role",type:"boolean",mandatory:!0},{name:"first",type:"uint",mandatory:!0},{name:"last",type:"uint"},{name:"settled",type:"boolean",default_value:!1},{name:"state",type:"*"},{name:"batchable",type:"boolean",default_value:!1}]},n={name:"detach",code:22,fields:[{name:"handle",type:"uint",mandatory:!0},{name:"closed",type:"boolean",default_value:!1},{name:"error",type:"error"}]},o={name:"end",code:23,fields:[{name:"error",type:"error"}]},p={name:"close",code:24,fields:[{name:"error",type:
 "error"}]};d(f.TYPE_AMQP,h),d(f.TYPE_AMQP,i),d(f.TYPE_AMQP,j),d(f.TYPE_AMQP,k),d(f.TYPE_AMQP,l),d(f.TYPE_AMQP,m),d(f.TYPE_AMQP,n),d(f.TYPE_AMQP,o),d(f.TYPE_AMQP,p);var q={name:"sasl_mechanisms",code:64,fields:[{name:"sasl_server_mechanisms",type:"symbol",multiple:!0,mandatory:!0}]},r={name:"sasl_init",code:65,fields:[{name:"mechanism",type:"symbol",mandatory:!0},{name:"initial_response",type:"binary"},{name:"hostname",type:"string"}]},s={name:"sasl_challenge",code:66,fields:[{name:"challenge",type:"binary",mandatory:!0}]},t={name:"sasl_response",code:67,fields:[{name:"response",type:"binary",mandatory:!0}]},u={name:"sasl_outcome",code:68,fields:[{name:"code",type:"ubyte",mandatory:!0},{name:"additional_data",type:"binary"}]};d(f.TYPE_SASL,q),d(f.TYPE_SASL,r),d(f.TYPE_SASL,s),d(f.TYPE_SASL,t),d(f.TYPE_SASL,u),b.exports=f},{"./types.js":12}],4:[function(a,b,c){(function(c){"use strict";function d(a){a.delivery.settled=!0}function e(a){a.delivery.update(void 0,k.accepted().described())
 }function f(a,b,c){Error.call(this),Error.captureStackTrace(this,this.constructor),this.message=a,this.condition=b,this.description=a,this.link=c}function g(a){switch(a){case"name":case"handle":case"role":case"initial_delivery_count":return!0;default:return!1}}function h(a){return function(){return this.remote.attach?this.remote.attach[a]:void 0}}var i=a("./frames.js"),j=a("./log.js"),k=a("./message.js"),l=a("./terminus.js"),m=a("./endpoint.js"),n=function(a){this.window=a};n.prototype.update=function(a){var b=this.window-a.receiver.credit;a.receiver.flow(b)},a("util").inherits(f,Error);var o=a("events").EventEmitter,p=Object.create(o.prototype);p.dispatch=function(a){return j.events("Link got event: "+a),o.prototype.emit.apply(this.observers,arguments),this.listeners(a).length?(o.prototype.emit.apply(this,arguments),!0):this.session.dispatch.apply(this.session,arguments)},p.set_source=function(a){this.local.attach.source=l.source(a).described()},p.set_target=function(a){this.local.
 attach.target=l.target(a).described()},p.attach=function(){this.state.open()&&this.connection._register()},p.open=p.attach,p.detach=function(){this.local.detach.closed=!1,this.state.close()&&this.connection._register()},p.close=function(a){a&&(this.local.detach.error=a),this.local.detach.closed=!0,this.state.close()&&this.connection._register()},p.is_open=function(){return this.session.is_open()&&this.state.is_open()},p.is_closed=function(){return this.session.is_closed()||this.state.is_closed()},p._process=function(){do this.state.need_open()&&this.session.output(this.local.attach.described()),this.issue_flow&&(this.session._write_flow(this),this.issue_flow=!1),this.state.need_close()&&this.session.output(this.local.detach.described());while(!this.state.has_settled())},p.on_attach=function(a){if(!this.state.remote_opened())throw Error("Attach already received");this.remote.handle||(this.remote.handle=a.handle),a.performative.source=l.unwrap(a.performative.source),a.performative.tar
 get=l.unwrap(a.performative.target),this.remote.attach=a.performative,this.open(),this.dispatch(this.is_receiver()?"receiver_open":"sender_open",this._context())},p.prefix_event=function(a){return(this.local.attach.role?"receiver_":"sender_")+a},p.on_detach=function(a){if(!this.state.remote_closed())throw Error("Detach already received");this.remote.detach=a.performative,this.close();var b=this.remote.detach.error;if(b){var c=this.dispatch(this.prefix_event("error"),this._context());c=this.dispatch(this.prefix_event("close"),this._context())||c,c||o.prototype.emit.call(this.connection.container,"error",new f(b.description,b.condition,this))}else this.dispatch(this.prefix_event("close"),this._context())};var q=["snd_settle_mode","rcv_settle_mode","source","target","max_message_size","offered_capabilities","desired_capabilities","properties"];p.init=function(a,b,c,d,e){this.session=a,this.connection=a.connection,this.name=b,this.options=void 0===d?{}:d,this.state=new m,this.issue_flow
 =!1,this.local={handle:c},this.local.attach=i.attach({handle:c,name:b,role:e});for(var f in this.local.attach)g(f)||void 0===this.options[f]||(this.local.attach[f]=this.options[f]);this.local.detach=i.detach({handle:c,closed:!0}),this.remote={handle:void 0},this.delivery_count=0,this.credit=0,this.observers=new o;for(var j in q){var k=q[j];Object.defineProperty(this,k,{get:h(k)})}Object.defineProperty(this,"error",{get:function(){return this.remote.detach?this.remote.detach.error:void 0}})},p.reset=function(){this.state.disconnected(),this.remote={handle:void 0},this.delivery_count=0,this.credit=0},p.has_credit=function(){return this.credit>0},p.is_receiver=function(){return this.local.attach.role},p._context=function(a){var b=a?a:{};return this.is_receiver()?b.receiver=this:b.sender=this,this.session._context(b)},p.get_option=function(a,b){return void 0!==this.options[a]?this.options[a]:this.session.get_option(a,b)};var r=function(a,b,c,e){this.init(a,b,c,e,!1),this._draining=!1,th
 is._drained=!1,this.local.attach.initial_delivery_count=0,this.tag=0,this.get_option("autosettle",!0)&&this.observers.on("settled",d);var f=this;this.get_option("treat_modified_as_released",!0)&&this.observers.on("modified",function(a){f.dispatch("released",a)})};r.prototype=Object.create(p),r.prototype.constructor=r,r.prototype._get_drain=function(){if(this._draining&&this._drained&&this.credit){for(;this.credit;)++this.delivery_count,--this.credit;return!0}return!1},r.prototype.set_drained=function(a){this._drained=a,this._draining&&this._drained&&(this.issue_flow=!0)},r.prototype.next_tag=function(){return new c(new String(this.tag++))},r.prototype.sendable=function(){return this.credit&&this.session.outgoing.available()},r.prototype.on_flow=function(a){var b=a.performative;this.credit=b.delivery_count+b.link_credit-this.delivery_count,this._draining=b.drain,this._drained=this.credit>0,this.is_open()&&(this.dispatch("sender_flow",this._context()),this._draining&&this.dispatch("se
 nder_draining",this._context()),this.sendable()&&this.dispatch("sendable",this._context()))},r.prototype.on_transfer=function(){throw Error("got transfer on sending link")},r.prototype.send=function(a,b){var c=this.session.send(this,b?b:this.next_tag(),k.encode(a),0);return 1===this.local.attach.snd_settle_mode&&(c.settled=!0),c};var s=function(a,b,c,d){this.init(a,b,c,d,!0),this.drain=!1,this.set_credit_window(this.get_option("credit_window",100)),this.get_option("autoaccept",!0)&&this.observers.on("message",e)};s.prototype=Object.create(p),s.prototype.constructor=s,s.prototype.on_flow=function(a){this.dispatch("receiver_flow",this._context()),a.performative.drain&&(a.performative.link_credit>0?console.log("ERROR: received flow with drain set, but non zero credit"):this.dispatch("receiver_drained",this._context()))},s.prototype.flow=function(a){a>0&&(this.credit+=a,this.issue_flow=!0,this.connection._register())},s.prototype.add_credit=s.prototype.flow,s.prototype._get_drain=functi
 on(){return this.drain},s.prototype.set_credit_window=function(a){if(a>0){var b=new n(a),c=b.update.bind(b);this.observers.on("message",c),this.observers.on("receiver_open",c)}},b.exports={Sender:r,Receiver:s}}).call(this,a("buffer").Buffer)},{"./endpoint.js":2,"./frames.js":3,"./log.js":5,"./message.js":6,"./terminus.js":10,buffer:16,events:20,util:30}],5:[function(a,b,c){"use strict";var d=a("debug");b.exports={frames:d("rhea:frames"),raw:d("rhea:raw"),reconnect:d("rhea:reconnect"),events:d("rhea:events"),message:d("rhea:message"),flow:d("rhea:flow"),io:d("rhea:io")}},{debug:31}],6:[function(a,b,c){"use strict";function d(a,b,c){b.descriptor=a,p[a.symbolic]=b,p[Number(a.numeric).toString(10)]=b,c&&q.push(c)}function e(a){var b=n.define_composite(a);r[a.name]=b.create,o[Number(b.descriptor.numeric).toString(10)]=b,o[b.descriptor.symbolic]=b;var c=function(c,d){c[a.name]=new b(d.value)},e=function(c,d){d[a.name]&&(d[a.name].described?c.push(d[a.name].described()):c.push(b.create(d[a
 .name]).described()))};d(b.descriptor,c,e)}function f(a){var b={numeric:a.code};b.symbolic="amqp:"+a.name.replace(/_/g,"-")+":map";var c=function(b,c){b[a.name]=n.unwrap(c)},e=function(c,d){d[a.name]&&c.push(n.described(n.wrap_ulong(b.numeric),n.wrap_map(d[a.name])))};d(b,c,e)}function g(a){var b={};for(var c in a){var d=a[c];for(var e in d)b[d[e]]=c}return b}function h(a,b){for(var c in a){var d=a[c];"object"==typeof d?h(d,b[c]):b[c]=d}}function i(a,b,c){Object.defineProperty(a,c,{get:function(){return this[b]?this[b][c]:void 0},set:function(a){void 0===this[b]&&(this[b]={}),this[b][c]=a}})}function j(a){var b={toJSON:function(){var a={};for(var b in u){var c=u[b];if("function"!=typeof this[c]){var d=s[c];if(d)for(var e in d)void 0!==this[d[e]]&&(void 0===a[c]&&(a[c]={}),a[c][d[e]]=this[d[e]]);else this[c]&&(a[c]=this[c])}}return a},inspect:function(){return JSON.stringify(this.toJSON())},toString:function(){return JSON.stringify(this.toJSON())}};for(var c in t)i(b,t[c],c);return a
 &&h(a,b),b}function k(a){var b=void 0;for(var c in a)if("function"!=typeof a[c]&&u.indexOf(c)<0){void 0===b&&(b={});var d=t[c]||"application_properties";void 0===b[d]&&(b[d]={}),b[d][c]=a[c]}else void 0!==b&&(b[c]=a[c]);return b||a}function l(a){var b=n.define_composite(a);b.composite_type=a.name,r[a.name]=b.create,v[Number(b.descriptor.numeric).toString(10)]=b,v[b.descriptor.symbolic]=b,r["is_"+a.name]=function(b){if(b&&b.descriptor){var c=v[b.descriptor.value];if(c)return c.descriptor.numeric===a.code}return!1}}var m=a("./log.js"),n=a("./types.js"),o={},p={},q=[],r={};e({name:"header",code:112,fields:[{name:"durable",type:"boolean",default_value:!1},{name:"priority",type:"ubyte",default_value:4},{name:"ttl",type:"uint"},{name:"first_acquirer",type:"boolean",default_value:!1},{name:"delivery_count",type:"uint",default_value:0}]}),f({name:"delivery_annotations",code:113}),f({name:"message_annotations",code:114}),e({name:"properties",code:115,fields:[{name:"message_id",type:"message_
 id"},{name:"user_id",type:"binary"},{name:"to",type:"string"},{name:"subject",type:"string"},{name:"reply_to",type:"string"},{name:"correlation_id",type:"message_id"},{name:"content_type",type:"symbol"},{name:"content_encoding",type:"symbol"},{name:"absolute_expiry_time",type:"timestamp"},{name:"creation_time",type:"timestamp"},{name:"group_id",type:"string"},{name:"group_sequence",type:"uint"},{name:"reply_to_group_id",type:"string"}]}),f({name:"application_properties",code:116}),d({numeric:119,symbolic:"amqp:value:*"},function(a,b){a.body=n.unwrap(b)},function(a,b){a.push(n.described(n.wrap_ulong(119),n.wrap(b.body)))}),f({name:"footer",code:120});var s={properties:["message_id","user_id","to","subject","reply_to","correlation_id","content_type","content_encoding","absolute_expiry_time","creation_time","group_id","group_sequence","reply_to_group_id"],header:["durable","priority","ttl","first_acquirer","delivery_count"]},t=g(s),u=["header","delivery_annotations","message_annotation
 s","properties","application_properties","body","footer"];r.encode=function(a){var b=[],c=k(a);q.forEach(function(a){a(b,c)});for(var d=new n.Writer,e=0;e<b.length;e++)m.message("Encoding section "+(e+1)+" of "+b.length+": "+b[e]),d.write(b[e]);var f=d.toBuffer();return m.message("encoded "+f.length+" bytes"),f},r.decode=function(a){for(var b=j(),c=new n.Reader(a);c.remaining();){var d=c.read();if(m.message("decoding section: "+JSON.stringify(d)+" of type: "+JSON.stringify(d.descriptor)),d.descriptor){var e=p[d.descriptor.value];e?e(b,d):console.log("WARNING: did not recognise message section with descriptor "+d.descriptor)}else console.log("WARNING: expected described message section got "+JSON.stringify(d))}if(b.application_properties)for(var f in b.application_properties)i(b,"application_properties",f);return b};var v={};r.unwrap_outcome=function(a){if(a&&a.descriptor){var b=v[a.descriptor.value];if(b)return new b(n.unwrap(a))}return console.log("unrecognised outcome: "+JSON.stri
 ngify(a)),a},r.are_outcomes_equivalent=function(a,b){return void 0===a&&void 0===b?!0:void 0===a||void 0===b?!1:a.descriptor.value===b.descriptor.value&&JSON.stringify(a)===JSON.stringify(b)},l({name:"received",code:35,fields:[{name:"section_number",type:"uint",mandatory:!0},{name:"section_offset",type:"ulong",mandatory:!0}]}),l({name:"accepted",code:36,fields:[]}),l({name:"rejected",code:37,fields:[{name:"error",type:"error"}]}),l({name:"released",code:38,fields:[]}),l({name:"modified",code:39,fields:[{name:"delivery_failed",type:"boolean"},{name:"undeliverable_here",type:"boolean"},{name:"message_annotations",type:"map"}]}),b.exports=r},{"./log.js":5,"./types.js":12}],7:[function(a,b,c){"use strict";function d(a,b){return b?Array.isArray(b)?b.indexOf(a)>-1:a===b:!1}var e=a("url"),f={counter:1,next:function(){return this.counter++}},g=function(a,b){var c=e.parse(b);this.connection=a.connect({host:c.hostname,port:c.port}),this.connection.on("message",this._response.bind(this)),this.
 connection.on("receiver_open",this._ready.bind(this)),this.sender=this.connection.attach_sender(c.path.substr(1)),this.receiver=this.connection.attach_receiver({source:{dynamic:!0}}),this.id_generator=f,this.pending=[],this.outstanding={}};g.prototype._request=function(a,b,c,d){var e={properties:{}};e.properties.subject=b,e.body=c,e.properties.message_id=a,e.properties.reply_to=this.receiver.remote.attach.source.address,this.outstanding[a]=d,this.sender.send(e)},g.prototype._response=function(a){var b=a.message.properties.correlation_id,c=this.outstanding[b];c?"ok"===a.message.properties.subject?c(a.message.body):c(void 0,{name:a.message.properties.subject,description:a.message.body}):console.log("no request pending for "+b+", ignoring response")},g.prototype._ready=function(){this._process_pending()},g.prototype._process_pending=function(){for(var a=0;a<this.pending.length;a++){var b=this.pending[a];this._request(b.id,b.name,b.args,b.callback)}this.pending=[]},g.prototype.call=func
 tion(a,b,c){var d=this.id_generator.next();this.receiver.is_open()&&0===this.pending.length?this._request(d,a,b,c):this.pending.push({
-name:a,args:b,callback:c,id:d})},g.prototype.close=function(){this.receiver.close(),this.sender.close(),this.connection.close()},g.prototype.define=function(a){this[a]=function(b,c){this.call(a,b,c)}};var h=function(a,b){this.ttl=a,this.purged=b,this.entries={},this.timeout=void 0};h.prototype.clear=function(){this.timeout&&clearTimeout(this.timeout),this.entries={}},h.prototype.put=function(a,b){this.entries[a]={value:b,last_accessed:Date.now()},this.timeout||(this.timeout=setTimeout(this.purge.bind(this),this.ttl))},h.prototype.get=function(a){var b=this.entries[a];return b?(b.last_accessed=Date.now(),b.value):void 0},h.prototype.purge=function(){var a=Date.now(),b=[],c=0;for(var d in this.entries)a-this.entries[d].last_accessed>=this.ttl?b.push(d):c++;for(var e=0;e<b.length;e++){var f=this.entries[b[e]];delete this.entries[b[e]],this.purged(f.value)}c&&!this.timeout&&(this.timeout=setTimeout(this.purge.bind(this),this.ttl))};var i=function(a,b){this.factory=a,this.cache=new h(b,f
 unction(a){a.close()})};i.prototype.clear=function(){this.cache.clear()},i.prototype.get=function(a){var b=this.cache.get(a);return void 0===b&&(b=this.factory(a),this.cache.put(a,b)),b};var j=function(a,b,c){this.options=c||{};var d=e.parse(b);this.connection=a.connect({host:d.hostname,port:d.port}),this.connection.on("connection_open",this._connection_open.bind(this)),this.connection.on("message",this._request.bind(this)),this.receiver=this.connection.attach_receiver(d.path.substr(1)),this.callbacks={},this._send=void 0,this._clear=void 0};j.prototype._connection_open=function(){if(d("ANONYMOUS-RELAY",this.connection.remote.open.offered_capabilities)){var a=this.connection.attach_sender({target:{}});this._send=function(b){a.send(b)}}else{var b=new i(this.connection.attach_sender.bind(this.connection),this.options.cache_ttl||6e4);this._send=function(a){var c=b.get(a.properties.to);c&&c.send(a)},this._clear=function(){b.clear()}}},j.prototype._respond=function(a){var b=this;return f
 unction(c,d){d?(a.properties.subject=d.name||"error",a.body=d.description||d):(a.properties.subject="ok",a.body=c),b._send(a)}},j.prototype._request=function(a){var b=a.message,c={properties:{}};c.properties.to=b.properties.reply_to,c.properties.correlation_id=b.properties.message_id;var d=this.callbacks[b.properties.subject];d?d(b.body,this._respond(c)):(c.properties.subject="bad-method",c.body="Unrecognised method "+b.properties.subject,this._send(c))},j.prototype.bind_sync=function(a,b){this.callbacks[b||a.name]=function(b,c){var d=a(b);c(d)}},j.prototype.bind=function(a,b){this.callbacks[b||a.name]=a},j.prototype.close=function(){this._clear&&this._clear(),this.receiver.close(),this.connection.close()},b.exports={server:function(a,b,c){return new j(a,b,c)},client:function(a,b){return new g(a,b)}}},{url:26}],8:[function(a,b,c){(function(c){"use strict";function d(a){for(var b=[],c=0,d=0;d<a.length;)0===a[d]?(d>c?b.push(a.toString("utf8",c,d)):b.push(null),c=++d):++d;return d>c?b.
 push(a.toString("utf8",c,d)):b.push(null),b}var e=a("./frames.js"),f=a("./transport.js"),g={OK:0,AUTH:1,SYS:2,SYS_PERM:3,SYS_TEMP:4},h=3,i=function(a){this.callback=a,this.outcome=void 0,this.username=void 0};i.prototype.start=function(a){var b=d(a);3!==b.length&&this.connection.sasl_failed("Unexpected response in PLAIN, got "+b.length+" fields, expected 3"),this.callback(b[1],b[2])?(this.outcome=!0,this.username=b[1]):this.outcome=!1};var j=function(a,b){this.username=a,this.password=b};j.prototype.start=function(){var a=new c(1+this.username.length+1+this.password.length);return a.writeUInt8(0,0),a.write(this.username,1),a.writeUInt8(0,1+this.username.length),a.write(this.password,1+this.username.length+1),a};var k=function(){this.outcome=void 0,this.username=void 0};k.prototype.start=function(a){this.outcome=!0,this.username=a?a.toString("utf8"):"anonymous"};var l=function(a){this.username=a?a:"anonymous"};l.prototype.start=function(){var a=new c(1+this.username.length);return a.
 writeUInt8(0,0),a.write(this.username,1),a};var m=function(){this.outcome=void 0,this.username=void 0};m.prototype.start=function(){this.outcome=!0};var n=function(){this.username=void 0};n.prototype.start=function(){return null};var o=function(a,b){this.connection=a,this.transport=new f(a.amqp_transport.identifier,h,e.TYPE_SASL,this),this.next=a.amqp_transport,this.mechanisms=b,this.mechanism=void 0,this.outcome=void 0,this.username=void 0;var c=Object.getOwnPropertyNames(b);this.transport.encode(e.sasl_frame(e.sasl_mechanisms({sasl_server_mechanisms:c}).described()))};o.prototype.do_step=function(a){void 0===this.mechanism.outcome?this.transport.encode(e.sasl_frame(e.sasl_challenge({challenge:a}).described())):(this.outcome=this.mechanism.outcome?g.OK:g.AUTH,this.transport.encode(e.sasl_frame(e.sasl_outcome({code:this.outcome}).described())),this.outcome===g.OK&&(this.username=this.mechanism.username,this.transport.write_complete=!0,this.transport.read_complete=!0))},o.prototype.o
 n_sasl_init=function(a){var b=this.mechanisms[a.performative.mechanism];if(b){this.mechanism=b();var c=this.mechanism.start(a.performative.initial_response);this.do_step(c)}else this.outcome=g.AUTH,this.transport.encode(e.sasl_frame(e.sasl_outcome({code:this.outcome}).described()))},o.prototype.on_sasl_response=function(a){this.do_step(this.mechanism.step(a.performative.response))},o.prototype.has_writes_pending=function(){return this.transport.has_writes_pending()||this.next.has_writes_pending()},o.prototype.write=function(a){return this.transport.write_complete&&0===this.transport.pending.length?this.next.write(a):this.transport.write(a)},o.prototype.read=function(a){return this.transport.read_complete?this.next.read(a):this.transport.read(a)};var p=function(a,b){this.connection=a,this.transport=new f(a.amqp_transport.identifier,h,e.TYPE_SASL,this),this.next=a.amqp_transport,this.mechanisms=b,this.mechanism=void 0,this.mechanism_name=void 0,this.failed=!1};p.prototype.on_sasl_mech
 anisms=function(a){for(var b=0;void 0===this.mechanism&&b<a.performative.sasl_server_mechanisms.length;b++){var c=a.performative.sasl_server_mechanisms[b],d=this.mechanisms[c];d&&(this.mechanism=d(),this.mechanism_name=c)}if(this.mechanism){var f=this.mechanism.start();this.transport.encode(e.sasl_frame(e.sasl_init({mechanism:this.mechanism_name,initial_response:f}).described()))}else this.failed=!0,this.connection.sasl_failed("No suitable mechanism; server supports "+a.performative.sasl_server_mechanisms)},p.prototype.on_sasl_challenge=function(a){var b=this.mechanism.step(a.performative.challenge);this.transport.encode(e.sasl_frame(e.sasl_response({response:b}).described()))},p.prototype.on_sasl_outcome=function(a){switch(a.performative.code){case g.OK:this.transport.read_complete=!0,this.transport.write_complete=!0;break;default:this.transport.write_complete=!0,this.connection.sasl_failed("Failed to authenticate: "+a.performative.code)}},p.prototype.has_writes_pending=function(){
 return this.transport.has_writes_pending()||this.next.has_writes_pending()},p.prototype.write=function(a){return this.transport.write_complete?this.next.write(a):this.transport.write(a)},p.prototype.read=function(a){return this.transport.read_complete?this.next.read(a):this.transport.read(a)};var q={enable_anonymous:function(){this.ANONYMOUS=function(){return new k}},enable_plain:function(a){this.PLAIN=function(){return new i(a)}}},r={enable_anonymous:function(a){this.ANONYMOUS=function(){return new l(a)}},enable_plain:function(a,b){this.PLAIN=function(){return new j(a,b)}},enable_external:function(){this.EXTERNAL=function(){return new n}}};b.exports={Client:p,Server:o,server_mechanisms:function(){return Object.create(q)},client_mechanisms:function(){return Object.create(r)},server_add_external:function(a){return a.EXTERNAL=function(){return new m},a}}}).call(this,a("buffer").Buffer)},{"./frames.js":3,"./transport.js":11,buffer:16}],9:[function(a,b,c){(function(c){"use strict";funct
 ion d(a){var b,c,d,e,g;for(e=0;e<a.length;e++)g=a[e],void 0===b&&(b=g,c=g,d=g.id),i.are_outcomes_equivalent(c.state,g.state)&&c.settled===g.settled&&d===g.id?(c.id!==g.id&&(c=g),d++):(b.link.session.output(f.disposition({role:b.link.is_receiver(),first:b.id,last:c.id,state:b.state,settled:b.settled}).described()),b=g,c=g,d=g.id);void 0!==b&&void 0!==c&&b.link.session.output(f.disposition({role:b.link.is_receiver(),first:b.id,last:c.id,state:b.state,settled:b.settled}).described())}function e(a,b,c){var d=b?b:{};"string"==typeof b&&(d={},d[c]=b),d.name||(d.name=k.generate_uuid());var e=a(d.name,d);for(var f in{source:0,target:0})d[f]&&("string"==typeof d[f]&&(d[f]={address:d[f]}),e["set_"+f](d[f]));return e.attach(),e}var f=a("./frames.js"),g=a("./link.js"),h=a("./log.js"),i=a("./message.js"),j=a("./types.js"),k=a("./util.js"),l=a("./endpoint.js"),m=a("events").EventEmitter,n=function(a){this.capacity=a,this.size=0,this.head=0,this.tail=0,this.entries=[]};n.prototype.available=functi
 on(){return this.capacity-this.size},n.prototype.push=function(a){if(!(this.size<this.capacity))throw Error("circular buffer overflow: head="+this.head+" tail="+this.tail+" size="+this.size+" capacity="+this.capacity);this.entries[this.tail]=a,this.tail=(this.tail+1)%this.capacity,this.size++},n.prototype.pop_if=function(a){for(var b=0;this.size&&a(this.entries[this.head]);)this.entries[this.head]=void 0,this.head=(this.head+1)%this.capacity,this.size--,b++;return b},n.prototype.by_id=function(a){if(this.size>0){var b=a-this.entries[this.head].id;if(b<this.size)return this.entries[(this.head+b)%this.capacity]}return void 0},n.prototype.get_head=function(){return this.size>0?this.entries[this.head]:void 0};var o=function(){this.deliveries=new n(2048),this.updated=[],this.pending_dispositions=[],this.next_delivery_id=0,this.next_pending_delivery=0,this.next_transfer_id=0,this.window=j.MAX_UINT,this.remote_next_transfer_id=void 0,this.remote_window=void 0};o.prototype.available=functio
 n(){return this.deliveries.available()},o.prototype.send=function(a,b,c,d){var e={id:this.next_delivery_id++,tag:b,link:a,data:c,format:d?d:0,sent:!1,settled:!1,state:void 0,remote_settled:!1,remote_state:void 0},f=this;return e.update=function(a,b){f.update(e,a,b)},this.deliveries.push(e),e},o.prototype.on_begin=function(a){this.remote_window=a.incoming_window},o.prototype.on_flow=function(a){this.remote_next_transfer_id=a.next_incoming_id,this.remote_window=a.incoming_window},o.prototype.on_disposition=function(a){for(var b=a.last?a.last:a.first,c=a.first;b>=c;c++){var d=this.deliveries.by_id(c);if(d&&!d.remote_settled){var e=!1;a.settled&&(d.remote_settled=a.settled,e=!0),a.state&&a.state!==d.remote_state&&(d.remote_state=i.unwrap_outcome(a.state),e=!0),e&&this.updated.push(d)}}},o.prototype.update=function(a,b,c){a&&(a.settled=b,void 0!==c&&(a.state=c),a.remote_settled||this.pending_dispositions.push(a),a.link.connection._register())},o.prototype.transfer_window=function(){retur
 n this.remote_window?this.remote_window-(this.next_transfer_id-this.remote_next_transfer_id):0},o.prototype.process=function(){for(var a;this.next_pending_delivery<this.next_delivery_id;){if(a=this.deliveries.by_id(this.next_pending_delivery),!a){console.log("ERROR: Next pending delivery not found: "+this.next_pending_delivery);break}if(!a.link.has_credit()){h.flow("Link has no credit");break}if(a.link.delivery_count++,a.transfers_required=1,!(this.transfer_window()>=a.transfers_required)){h.flow("Incoming window of peer preventing sending further transfers: remote_window="+this.remote_window+", remote_next_transfer_id="+this.remote_next_transfer_id+", next_transfer_id="+this.next_transfer_id);break}this.next_transfer_id+=a.transfers_required,this.window-=a.transfers_required,a.link.session.output(f.transfer({handle:a.link.local.handle,message_format:a.format,delivery_id:a.id,delivery_tag:a.tag,settled:a.settled}).described(),a.data),a.link.credit--,this.next_pending_delivery++}for(
 var b=0;b<this.updated.length;b++)a=this.updated[b],a.remote_state&&a.remote_state.constructor.composite_type&&a.link.dispatch(a.remote_state.constructor.composite_type,a.link._context({delivery:a})),a.remote_settled&&a.link.dispatch("settled",a.link._context({delivery:a}));this.updated=[],this.pending_dispositions.length&&(d(this.pending_dispositions),this.pending_dispositions=[]),this.deliveries.pop_if(function(a){return a.settled&&a.remote_settled})};var p=function(){this.deliveries=new n(2048),this.updated=[],this.next_transfer_id=0,this.next_delivery_id=void 0,this.window=2048,this.remote_next_transfer_id=void 0,this.remote_window=void 0};p.prototype.update=function(a,b,c){a&&(a.settled=b,void 0!==c&&(a.state=c),a.remote_settled||this.updated.push(a),a.link.connection._register())},p.prototype.on_transfer=function(a,b){if(this.next_transfer_id++,b.is_open()){void 0===this.next_delivery_id&&(this.next_delivery_id=a.performative.delivery_id);var d,e,f=this.deliveries.get_head();i
 f(f&&f.incomplete){if(void 0!==a.performative.delivery_id&&this.next_delivery_id!==a.performative.delivery_id)throw Error("frame sequence error: delivery "+this.next_delivery_id+" not complete, got "+a.performative.delivery_id);d=f,e=c.concat([d.data,a.payload],d.data.size()+a.payload.size())}else{if(this.next_delivery_id!==a.performative.delivery_id)throw Error("frame sequence error: expected "+this.next_delivery_id+", got "+a.performative.delivery_id);d={id:a.performative.delivery_id,tag:a.performative.delivery_tag,link:b,settled:!1,state:void 0,remote_settled:void 0===a.performative.settled?!1:a.performative.settled,remote_state:a.performative.state};var g=this;d.update=function(a,c){var e=a;void 0===e&&(e=1!==b.local.attach.rcv_settle_mode),g.update(d,e,c)},d.accept=function(){this.update(void 0,i.accepted().described())},d.release=function(a){a?this.update(void 0,i.modified(a).described()):this.update(void 0,i.released().described())},d.reject=function(a){this.update(!0,i.rejec
 ted({error:a}).described())},d.modified=function(a){this.update(!0,i.modified(a).described())},this.deliveries.push(d),e=a.payload}d.incomplete=a.performative.more,d.incomplete?d.data=e:(b.credit--,b.delivery_count++,this.next_delivery_id++,b.dispatch("message",b._context({message:i.decode(e),delivery:d})))}},p.prototype.process=function(){this.updated.length>0&&(d(this.updated),this.updated=[]),this.deliveries.pop_if(function(a){return a.settled})},p.prototype.on_begin=function(a){this.remote_window=a.outgoing_window},p.prototype.on_flow=function(a){this.remote_next_transfer_id=a.next_outgoing_id,this.remote_window=a.outgoing_window},p.prototype.on_disposition=function(a){for(var b=a.last?a.last:a.first,c=a.first;b>=c;c++){var d=this.deliveries.by_id(c);d&&!d.remote_settled&&a.settled&&(d.remote_settled=a.settled,d.link.dispatch("settled",d.link._context({delivery:d})))}};var q=function(a,b){this.connection=a,this.outgoing=new o,this.incoming=new p,this.state=new l,this.local={chan
 nel:b,handles:{}},this.local.begin=f.begin({next_outgoing_id:this.outgoing.next_transfer_id,incoming_window:this.incoming.window,outgoing_window:this.outgoing.window}),this.local.end=f.end(),this.remote={handles:{}},this.links={},this.options={}};q.prototype=Object.create(m.prototype),q.prototype.constructor=q,q.prototype.reset=function(){this.state.disconnected(),this.outgoing=new o,this.incoming=new p,this.remote={handles:{}};for(var a in this.links)this.links[a].reset()},q.prototype.dispatch=function(a){return h.events("Session got event: "+a),this.listeners(a).length?(m.prototype.emit.apply(this,arguments),!0):this.connection.dispatch.apply(this.connection,arguments)},q.prototype.output=function(a,b){this.connection._write_frame(this.local.channel,a,b)},q.prototype.create_sender=function(a,b){return this.create_link(a,g.Sender,b)},q.prototype.create_receiver=function(a,b){return this.create_link(a,g.Receiver,b)},q.prototype.get_option=function(a,b){return void 0!==this.options[a
 ]?this.options[a]:this.connection.get_option(a,b)},q.prototype.attach_sender=function(a){return e(this.create_sender.bind(this),a,"target")},q.prototype.open_sender=q.prototype.attach_sender,q.prototype.attach_receiver=function(a){return e(this.create_receiver.bind(this),a,"source")},q.prototype.open_receiver=q.prototype.attach_receiver,q.prototype.create_link=function(a,b,c){for(var d=0;this.local.handles[d];)d++;var e=new b(this,a,d,c);return this.links[a]=e,this.local.handles[d]=e,e},q.prototype.begin=function(){this.state.open()&&this.connection._register()},q.prototype.open=q.prototype.begin,q.prototype.end=function(a){a&&(this.local.end.error=a),this.state.close()&&this.connection._register()},q.prototype.close=q.prototype.end,q.prototype.is_open=function(){return this.connection.is_open()&&this.state.is_open()},q.prototype.is_closed=function(){return this.connection.is_closed()||this.state.is_closed()},q.prototype._process=function(){do{this.state.need_open()&&this.output(thi
 s.local.begin.described()),this.outgoing.process(),this.incoming.process();for(var a in this.links)this.links[a]._process();this.state.need_close()&&this.output(this.local.end.described())}while(!this.state.has_settled())},q.prototype.send=function(a,b,c,d){var e=this.outgoing.send(a,b,c,d);return this.connection._register(),e},q.prototype._write_flow=function(a){var b={next_incoming_id:this.incoming.next_transfer_id,incoming_window:this.incoming.window,next_outgoing_id:this.outgoing.next_transfer_id,outgoing_window:this.outgoing.window};a&&(a._get_drain()&&(b.drain=!0),b.delivery_count=a.delivery_count,b.handle=a.local.handle,b.link_credit=a.credit),this.output(f.flow(b).described())},q.prototype.on_begin=function(a){if(!this.state.remote_opened())throw Error("Begin already received");this.remote.channel||(this.remote.channel=a.channel),this.remote.begin=a.performative,this.outgoing.on_begin(a.performative),this.incoming.on_begin(a.performative),this.open(),this.dispatch("session_o
 pen",this._context())},q.prototype.on_end=function(a){if(!this.state.remote_closed())throw Error("End already received");this.remote.end=a.performative,this.close(),this.dispatch("session_close",this._context())},q.prototype.on_attach=function(a){var b=a.performative.name,c=this.links[b];c||(c=a.performative.role?this.create_sender(b):this.create_receiver(b)),this.remote.handles[a.performative.handle]=c,c.on_attach(a),c.remote.attach=a.performative},q.prototype.on_disposition=function(a){a.performative.role?(h.events("Received disposition for outgoing transfers"),this.outgoing.on_disposition(a.performative)):(h.events("Received disposition for incoming transfers"),this.incoming.on_disposition(a.performative)),this.connection._register()},q.prototype.on_flow=function(a){this.outgoing.on_flow(a.performative),this.incoming.on_flow(a.performative),void 0!==a.performative.handle&&this._get_link(a).on_flow(a),this.connection._register()},q.prototype._context=function(a){var b=a?a:{};retur
 n b.session=this,this.connection._context(b)},q.prototype._get_link=function(a){var b=a.performative.handle,c=this.remote.handles[b];if(!c)throw Error("Invalid handle "+b);return c},q.prototype.on_detach=function(a){this._get_link(a).on_detach(a);var b=a.performative.handle,c=this.remote.handles[b];delete this.remote.handles[b],delete this.local.handles[c.local.handle],delete this.links[c.name]},q.prototype.on_transfer=function(a){this.incoming.on_transfer(a,this._get_link(a))},b.exports=q}).call(this,a("buffer").Buffer)},{"./endpoint.js":2,"./frames.js":3,"./link.js":4,"./log.js":5,"./message.js":6,"./types.js":12,"./util.js":13,buffer:16,events:20}],10:[function(a,b,c){"use strict";function d(a){var b=e.define_composite(a);f[a.name]=b.create,g[Number(b.descriptor.numeric).toString(10)]=b,g[b.descriptor.symbolic]=b}var e=a("./types.js"),f={},g={};f.unwrap=function(a){if(a&&a.descriptor){var b=g[a.descriptor.value];if(b)return new b(a.value);console.log("Unknown terminus: "+a.descri
 ptor)}return null},d({name:"source",code:40,fields:[{name:"address",type:"string"},{name:"durable",type:"uint",default_value:0},{name:"expiry_policy",type:"symbol",default_value:"session-end"},{name:"timeout",type:"uint",default_value:0},{name:"dynamic",type:"boolean",default_value:!1},{name:"dynamic_node_properties",type:"symbolic_map"},{name:"distribution_mode",type:"symbol"},{name:"filter",type:"symbolic_map"},{name:"default_outcome",type:"*"},{name:"outcomes",type:"symbol",multiple:!0},{name:"capabilities",type:"symbol",multiple:!0}]}),d({name:"target",code:41,fields:[{name:"address",type:"string"},{name:"durable",type:"uint",default_value:0},{name:"expiry_policy",type:"symbol",default_value:"session-end"},{name:"timeout",type:"uint",default_value:0},{name:"dynamic",type:"boolean",default_value:!1},{name:"dynamic_node_properties",type:"symbolic_map"},{name:"capabilities",type:"symbol",multiple:!0}]}),b.exports=f},{"./types.js":12}],11:[function(a,b,c){(function(c){"use strict";v
 ar d=a("./frames.js"),e=a("./log.js"),f=function(a,b,c,d){this.identifier=a,this.protocol_id=b,this.frame_type=c,this.handler=d,this.pending=[],this.header_sent=void 0,this.header_received=void 0,this.write_complete=!1,this.read_complete=!1};f.prototype.has_writes_pending=function(){return this.pending.length>0},f.prototype.encode=function(a){var b=d.write_frame(a);e.frames("["+this.identifier+"] PENDING: "+JSON.stringify(a)),this.pending.push(b)},f.prototype.write=function(a){if(!this.header_sent){var b=new c(8),f={protocol_id:this.protocol_id,major:1,minor:0,revision:0};d.write_header(b,f),a.write(b),this.header_sent=f}for(var g=0;g<this.pending.length;g++)a.write(this.pending[g]),e.raw("["+this.identifier+"] SENT: "+JSON.stringify(this.pending[g]));this.pending=[]},f.prototype.read=function(a){var b=0;if(!this.header_received){if(a.length<8)return b;if(this.header_received=d.read_header(a),e.frames("["+this.identifier+"] RECV: "+JSON.stringify(this.header_received)),this.header_r
 eceived.protocol_id!==this.protocol_id)throw Error("Invalid AMQP protocol id "+this.header_received.protocol_id+" expecting: "+this.protocol_id);b=8}for(;b<a.length&&!this.read_complete;){var c=a.readUInt32BE(b);if(e.io("["+this.identifier+"] got frame of size "+c),a.length<b+c){e.io("["+this.identifier+"] incomplete frame; have only "+(a.length-b)+" of "+c);break}var f=d.read_frame(a.slice(b,b+c));if(e.frames("["+this.identifier+"] RECV: "+JSON.stringify(f)),f.type!==this.frame_type)throw Error("Invalid frame type: "+f.type);b+=c,f.performative&&f.performative.dispatch(this.handler,f)}return b},b.exports=f}).call(this,a("buffer").Buffer)},{"./frames.js":3,"./log.js":5,buffer:16}],12:[function(a,b,c){(function(a){"use strict";function c(a,b){this.type=a,this.value=b}function d(a){return Number(a).toString(16)}function e(a,b,e,f){var g,h=b>>>4;switch(g=4===h?function(){this.type=g,this.value=f}:14===h||15===h?function(a,b,c){this.type=g,this.value=a,this.array_constructor={typecode:b
 },c&&(this.array_constructor.descriptor=c)}:function(a){this.type=g,this.value=a},g.typecode=b,g.prototype=Object.create(c.prototype),g.toString=function(){return a+"#"+d(b)},h){case 4:g.width=0,g.category="fixed";break;case 5:g.width=1,g.category="fixed";break;case 6:g.width=2,g.category="fixed";break;case 7:g.width=4,g.category="fixed";break;case 8:g.width=8,g.category="fixed";break;case 9:g.width=16,g.category="fixed";break;case 10:g.width=1,g.category="variable";break;case 11:g.width=4,g.category="variable";break;case 12:g.width=1,g.category="compound";break;case 13:g.width=4,g.category="compound";break;case 14:g.width=1,g.category="array";break;case 15:g.width=4,g.category="array"}if(e)for(var i in e)g[i]=e[i];return t.by_code[g.typecode]=g,t[a]=g,g}function f(a){return{read:function(b,c){return b["read"+a](c)},write:function(b,c,d){b["write"+a](c,d)}}}function g(a){return{read:function(b,c){return b["read"+a+"BE"](c)},write:function(b,c,d){b["write"+a+"BE"](c,d)}}}function h(a
 ,b,c){if("number"==typeof b||b instanceof Number){var d=Math.floor(b/u),e=b%u;a.writeUInt32BE(d,c),a.writeUInt32BE(e,c+4)}else b.copy(a,c)}function i(a,b){var c=a.readUInt32BE(b),d=a.readUInt32BE(b+4);return 2097153>c?c*u+d:a.slice(b,b+8)}function j(a,b,c){if("number"==typeof b||b instanceof Number){var d=Math.abs(b),e=Math.floor(d/u),f=d%u;if(a.writeInt32BE(e,c),a.writeUInt32BE(f,c+4),0>b)for(var g=1,h=0;8>h;h++){var i=c+(7-h),j=(255^a[i])+g;a[i]=255&j,g=j>>8}}else b.copy(a,c)}function k(a,b){var c=a.readInt32BE(b),d=a.readUInt32BE(b+4);return 2097153>c&&c>-2097153?c*u+d:a.slice(b,b+8)}function l(a,b){for(var c=0;c<b.length;c++)if(a.type.typecode===b[c].typecode)return!0;return!1}function m(a){for(var b={},c=0;c+1<a.length;)b[a[c++]]=a[c++];return b}function n(a){var b=t.by_code[a];if(!b)throw Error("Unrecognised typecode: "+d(a));return b}function o(a,b){return a>b?a:b}function p(a){if("symbol"===a)return{typecode:t.Sym8.typecode};throw Error("TODO: Array of type "+a+" not yet sup
 ported")}function q(a,b){if(void 0!==b&&null!==b){if(Array.isArray(b)){if(!a.multiple)throw Error("Field "+a.name+" does not support multiple values, got "+JSON.stringify(b));var c=p(a.type);return t.wrap_array(b,c.typecode,c.descriptor)}if("*"===a.type)return b;var d=t["wrap_"+a.type];if(d)return d(b);throw Error("No wrapper for field "+a.name+" of type "+a.type)}if(a.mandatory)throw Error("Field "+a.name+" is mandatory");return new t.Null}function r(a,b){var c=function(){return"*"===b.type?this.value[a]:t.unwrap(this.value[a])},d=function(c){this.value[a]=q(b,c)};return{get:c,set:d,enumerable:!0,configurable:!1}}function s(a){var b=t.define_composite(a);t["wrap_"+a.name]=function(a){return b.create(a).described()},w[Number(b.descriptor.numeric).toString(10)]=b,w[b.descriptor.symbolic]=b}c.prototype.toString=function(){return this.value?this.value.toString():null},c.prototype.toLocaleString=function(){return this.value?this.value.toLocaleString():null},c.prototype.valueOf=function(
 ){return this.value},c.prototype.toJSON=function(){return this.value&&this.value.toJSON?this.value.toJSON():this.value};var t={by_code:{}};Object.defineProperty(t,"MAX_UINT",{value:4294967295,writable:!1,configurable:!1}),Object.defineProperty(t,"MAX_USHORT",{value:65535,writable:!1,configurable:!1});var u=4294967296,v=-2147483647;e("Null",64,void 0,null),e("Boolean",86,f("UInt8")),e("True",65,void 0,!0),e("False",66,void 0,!1),e("Ubyte",80,f("UInt8")),e("Ushort",96,f("UInt16BE")),e("Uint",112,f("UInt32BE")),e("SmallUint",82,f("UInt8")),e("Uint0",67,void 0,0),e("Ulong",128,{write:h,read:i}),e("SmallUlong",83,f("UInt8")),e("Ulong0",68,void 0,0),e("Byte",81,f("Int8")),e("Short",97,f("Int16BE")),e("Int",113,f("Int32BE")),e("SmallInt",84,f("Int8")),e("Long",129,{write:j,read:k}),e("SmallLong",85,f("Int8")),e("Float",114,g("Float")),e("Double",130,g("Double")),e("Decimal32",116),e("Decimal64",132),e("Decimal128",148),e("CharUTF32",115),e("Timestamp",131,{write:j,read:k}),e("Uuid",152),e(
 "Vbin8",160),e("Vbin32",176),e("Str8",161,{encoding:"utf8"}),e("Str32",177,{encoding:"utf8"}),e("Sym8",163,{encoding:"ascii"}),e("Sym32",179,{encoding:"ascii"}),e("List0",69,void 0,[]),e("List8",192),e("List32",208),e("Map8",193),e("Map32",209),e("Array8",224),e("Array32",240),t.is_ulong=function(a){return l(a,[t.Ulong,t.Ulong0,t.SmallUlong])},t.is_string=function(a){return l(a,[t.Str8,t.Str32])},t.is_symbol=function(a){return l(a,[t.Sym8,t.Sym32])},t.is_list=function(a){return l(a,[t.List0,t.List8,t.List32])},t.is_map=function(a){return l(a,[t.Map8,t.Map32])},t.wrap_boolean=function(a){return a?new t.True:new t.False},t.wrap_ulong=function(a){return 0===a?new t.Ulong0:a>255?new t.Ulong(a):new t.SmallUlong(a)},t.wrap_uint=function(a){return 0===a?new t.Uint0:a>255?new t.Uint(a):new t.SmallUint(a)},t.wrap_ushort=function(a){return new t.Ushort(a)},t.wrap_ubyte=function(a){return new t.Ubyte(a)},t.wrap_long=function(a){return a>127||-128>a?new t.Long(a):new t.SmallLong(a)},t.wrap_int=
 function(a){return a>127||-128>a?new t.Int(a):new t.SmallInt(a)},t.wrap_short=function(a){return new t.Short(a)},t.wrap_byte=function(a){return new t.Byte(a)},t.wrap_float=function(a){return new t.Float(a)},t.wrap_double=function(a){return new t.Double(a)},t.wrap_timestamp=function(a){return new t.Timestamp(a)},t.wrap_binary=function(a){return a.length>255?new t.Vbin32(a):new t.Vbin8(a)},t.wrap_string=function(a){return a.length>255?new t.Str32(a):new t.Str8(a)},t.wrap_symbol=function(a){return a.length>255?new t.Sym32(a):new t.Sym8(a)},t.wrap_list=function(a){if(0===a.length)return new t.List0;var b=a.map(t.wrap);return new t.List32(b)},t.wrap_map=function(a,b){var c=[];for(var d in a)c.push(b?b(d):t.wrap(d)),c.push(t.wrap(a[d]));return new t.Map32(c)},t.wrap_symbolic_map=function(a){return t.wrap_map(a,t.wrap_symbol)},t.wrap_array=function(a,b,c){if(b)return new t.Array32(a,b,c);throw Error("An array must specify a type for its elements")},t.wrap=function(a){var b=typeof a;if("str
 ing"===b)return t.wrap_string(a);if("boolean"===b)return a?new t.True:new t.False;if("number"===b||a instanceof Number){if(isNaN(a))throw Error("Cannot wrap NaN! "+a);return Math.floor(a)-a!==0?new t.Double(a):a>0?u>a?t.wrap_uint(a):t.wrap_ulong(a):a>v?t.wrap_int(a):t.wrap_long(a)}return a instanceof Date?t.wrap_timestamp(a.getTime()):a instanceof c?a:"undefined"===b||null===a?new t.Null:Array.isArray(a)?t.wrap_list(a):t.wrap_map(a)},t.wrap_described=function(a,b){var c=t.wrap(a);return b&&("string"==typeof b?c=t.described(t.wrap_string(b),c):("number"==typeof b||b instanceof Number)&&(c=t.described(t.wrap_ulong(b),c))),c},t.wrap_message_id=function(a){var b=typeof a;if("string"===b)return t.wrap_string(a);if("number"===b||a instanceof Number)return t.wrap_ulong(a);throw Error("invalid message id:"+a)};var w={};t.unwrap=function(a,b){if(a instanceof c){if(a.descriptor){var d=w[a.descriptor.value];if(d)return new d(a.value);if(b)return a}var e=t.unwrap(a.value,!0);return t.is_map(a)?
 m(e):e}return Array.isArray(a)?a.map(function(a){return t.unwrap(a,!0)}):a},t.described=function(a,b){var c=Object.create(b);return a.length?(c.descriptor=a.shift(),t.described(a,c)):(c.descriptor=a,c)},t.Reader=function(a){this.buffer=a,this.position=0},t.Reader.prototype.read_typecode=function(){return this.read_uint(1)},t.Reader.prototype.read_uint=function(a){var b=this.position;this.position+=a;var c=a>1?"readUInt"+8*a+"BE":"readUInt8";return this.buffer[c](b)},t.Reader.prototype.read_fixed_width=function(a){var b=this.position;return this.position+=a.width,a.read?a.read(this.buffer,b):this.buffer.slice(b,this.position)},t.Reader.prototype.read_variable_width=function(a){var b=this.read_uint(a.width),c=this.read_bytes(b);return a.encoding?c.toString(a.encoding):c},t.Reader.prototype.read=function(){var a=this.read_constructor(),b=this.read_value(n(a.typecode));return a.descriptor?t.described(a.descriptor,b):b},t.Reader.prototype.read_constructor=function(){var a=this.read_typec
 ode();if(0===a){var b=[];b.push(this.read());for(var c=this.read_constructor();c.descriptor;)b.push(c.descriptor),c=this.read_constructor();return{typecode:c.typecode,descriptor:1===b.length?b[0]:b}}return{typecode:a}},t.Reader.prototype.read_value=function(a){if(0===a.width)return new a;if("fixed"===a.category)return new a(this.read_fixed_width(a));if("variable"===a.category)return new a(this.read_variable_width(a));if("compound"===a.category)return this.read_compound(a);if("array"===a.category)return this.read_array(a);throw Error("Invalid category for type: "+a)},t.Reader.prototype.read_multiple=function(a,b){for(var c=b?b:this.read.bind(this),d=[];d.length<a;)d.push(c.apply(this));return d},t.Reader.prototype.read_size_count=function(a){return{size:this.read_uint(a),count:this.read_uint(a)}},t.Reader.prototype.read_compound=function(a){var b=this.read_size_count(a.width);return new a(this.read_multiple(b.count))},t.Reader.prototype.read_array=function(a){var b=this.read_size_cou
 nt(a.width),c=this.read_constructor(),d=new a(this.read_multiple(b.count,this.read_value.bind(this,n(c.typecode))),c.typecode,c.descriptor);
-return d},t.Reader.prototype.toString=function(){var a="buffer@"+this.position;this.position&&(a+=": ");for(var b=this.position;b<this.buffer.length;b++)b>0&&(a+=","),a+="0x"+Number(this.buffer[b]).toString(16);return a},t.Reader.prototype.reset=function(){this.position=0},t.Reader.prototype.skip=function(a){this.position+=a},t.Reader.prototype.read_bytes=function(a){var b=this.position;return this.position+=a,this.buffer.slice(b,this.position)},t.Reader.prototype.remaining=function(){return this.buffer.length-this.position},t.Writer=function(b){this.buffer=b?b:new a(1024),this.position=0},t.Writer.prototype.toBuffer=function(){return this.buffer.slice(0,this.position)},t.Writer.prototype.ensure=function(b){if(this.buffer.length<b){var c=new a(o(2*this.buffer.length,b));this.buffer.copy(c),this.buffer=c}},t.Writer.prototype.write_typecode=function(a){this.write_uint(a,1)},t.Writer.prototype.write_uint=function(a,b){var c=this.position;this.ensure(this.position+b),this.position+=b;va
 r d=b>1?"writeUInt"+8*b+"BE":"writeUInt8";if(!this.buffer[d])throw Error("Buffer does not define "+d);return this.buffer[d](a,c)},t.Writer.prototype.write_fixed_width=function(a,b){var c=this.position;if(this.ensure(this.position+a.width),this.position+=a.width,a.write)a.write(this.buffer,b,c);else{if(!b.copy)throw Error("Cannot handle write for "+a);b.copy(this.buffer,c)}},t.Writer.prototype.write_variable_width=function(b,c){var d=b.encoding?new a(c,b.encoding):new a(c);this.write_uint(d.length,b.width),this.write_bytes(d)},t.Writer.prototype.write_bytes=function(a){var b=this.position;this.ensure(this.position+a.length),this.position+=a.length,a.copy(this.buffer,b)},t.Writer.prototype.write_constructor=function(a,b){b&&(this.write_typecode(0),this.write(b)),this.write_typecode(a)},t.Writer.prototype.write=function(a){if(!(a instanceof c))throw Error("Cannot write "+JSON.stringify(a));this.write_constructor(a.type.typecode,a.descriptor),this.write_value(a.type,a.value,a.array_cons
 tructor)},t.Writer.prototype.write_value=function(a,b,c){if(0!==a.width)if("fixed"===a.category)this.write_fixed_width(a,b);else if("variable"===a.category)this.write_variable_width(a,b);else if("compound"===a.category)this.write_compound(a,b);else{if("array"!==a.category)throw Error("Invalid category "+a.category+" for type: "+a);this.write_array(a,b,c)}},t.Writer.prototype.backfill_size=function(a,b){var c=this.position-b;this.position=b,this.write_uint(c-a,a),this.position+=c-a},t.Writer.prototype.write_compound=function(a,b){var c=this.position;this.position+=a.width,this.write_uint(b.length,a.width);for(var d=0;d<b.length;d++)void 0===b[d]||null===b[d]?this.write(new t.Null):this.write(b[d]);this.backfill_size(a.width,c)},t.Writer.prototype.write_array=function(a,b,c){var d=this.position;this.position+=a.width,this.write_uint(b.length,a.width),this.write_constructor(c.typecode,c.descriptor);for(var e=n(c.typecode),f=0;f<b.length;f++)this.write_value(e,b[f]);this.backfill_size(a
 .width,d)},t.Writer.prototype.toString=function(){var a="buffer@"+this.position;this.position&&(a+=": ");for(var b=0;b<this.position;b++)b>0&&(a+=","),a+=("00"+Number(this.buffer[b]).toString(16)).slice(-2);return a},t.Writer.prototype.skip=function(a){this.ensure(this.position+a),this.position+=a},t.Writer.prototype.clear=function(){this.buffer.fill(0),this.position=0},t.Writer.prototype.remaining=function(){return this.buffer.length-this.position},t.define_composite=function(a){var b=function(a){this.value=a?a:[]};b.descriptor={numeric:a.code,symbolic:"amqp:"+a.name+":list"},b.prototype.dispatch=function(b,c){b["on_"+a.name](c)};for(var c=0;c<a.fields.length;c++){var d=a.fields[c];Object.defineProperty(b.prototype,d.name,r(c,d))}return b.toString=function(){return a.name+"#"+Number(a.code).toString(16)},b.prototype.toJSON=function(){var a={};for(var b in this)"value"!==b&&this[b]&&(a[b]=this[b]);return a},b.create=function(a){var c=new b;for(var d in a)c[d]=a[d];return c},b.protot
 ype.described=function(){return t.described(t.wrap_ulong(b.descriptor.numeric),t.wrap_list(this.value))},b},s({name:"error",code:29,fields:[{name:"condition",type:"symbol",mandatory:!0},{name:"description",type:"string"},{name:"info",type:"map"}]}),b.exports=t}).call(this,a("buffer").Buffer)},{buffer:16}],13:[function(a,b,c){"use strict";var d={};d.generate_uuid=function(){var a="xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g,function(a){var b=16*Math.random()|0,c="x"===a?b:3&b|8;return c.toString(16)});return a},d.clone=function(a){for(var b=Object.create(a.prototype||{}),c=Object.getOwnPropertyNames(a),d=0;d<c.length;d++){var e=c[d];b[e]=a[e]}return b},b.exports=d},{}],14:[function(a,b,c){(function(a){"use strict";function c(a){return a}function d(b){return new a(b instanceof ArrayBuffer?new Uint8Array(b):b)}function e(a){return new Uint8Array(a)}function f(a){var b=c,f=c;return a.binaryType&&(a.binaryType="arraybuffer",b=d,f=e),{end:function(){a.close()},write:function(b){
 try{a.send(f(b),{binary:!0})}catch(c){a.onerror(c)}},on:function(c,d){"data"===c?a.onmessage=function(a){d(b(a.data))}:"end"===c?a.onclose=d:"error"===c?a.onerror=d:console.log("ERROR: Attempt to set unrecognised handler on websocket wrapper: "+c)},get_id_string:function(){return a.url}}}b.exports={connect:function(a){return function(b,c,d){return function(){return{connect:function(e,g,h,i){var j=new a(b,c,d);return j.onopen=i,f(j)}}}}},wrap:f}}).call(this,a("buffer").Buffer)},{buffer:16}],15:[function(a,b,c){},{}],16:[function(a,b,c){(function(b){"use strict";function d(){try{var a=new Uint8Array(1);return a.__proto__={__proto__:Uint8Array.prototype,foo:function(){return 42}},42===a.foo()&&"function"==typeof a.subarray&&0===a.subarray(1,1).byteLength}catch(b){return!1}}function e(){return g.TYPED_ARRAY_SUPPORT?2147483647:1073741823}function f(a,b){if(e()<b)throw new RangeError("Invalid typed array length");return g.TYPED_ARRAY_SUPPORT?(a=new Uint8Array(b),a.__proto__=g.prototype):(
 null===a&&(a=new g(b)),a.length=b),a}function g(a,b,c){if(!(g.TYPED_ARRAY_SUPPORT||this instanceof g))return new g(a,b,c);if("number"==typeof a){if("string"==typeof b)throw new Error("If encoding is specified then the first argument must be a string");return k(this,a)}return h(this,a,b,c)}function h(a,b,c,d){if("number"==typeof b)throw new TypeError('"value" argument must not be a number');return"undefined"!=typeof ArrayBuffer&&b instanceof ArrayBuffer?n(a,b,c,d):"string"==typeof b?l(a,b,c):o(a,b)}function i(a){if("number"!=typeof a)throw new TypeError('"size" argument must be a number');if(0>a)throw new RangeError('"size" argument must not be negative')}function j(a,b,c,d){return i(b),0>=b?f(a,b):void 0!==c?"string"==typeof d?f(a,b).fill(c,d):f(a,b).fill(c):f(a,b)}function k(a,b){if(i(b),a=f(a,0>b?0:0|p(b)),!g.TYPED_ARRAY_SUPPORT)for(var c=0;b>c;++c)a[c]=0;return a}function l(a,b,c){if(("string"!=typeof c||""===c)&&(c="utf8"),!g.isEncoding(c))throw new TypeError('"encoding" must be
  a valid string encoding');var d=0|r(b,c);a=f(a,d);var e=a.write(b,c);return e!==d&&(a=a.slice(0,e)),a}function m(a,b){var c=b.length<0?0:0|p(b.length);a=f(a,c);for(var d=0;c>d;d+=1)a[d]=255&b[d];return a}function n(a,b,c,d){if(b.byteLength,0>c||b.byteLength<c)throw new RangeError("'offset' is out of bounds");if(b.byteLength<c+(d||0))throw new RangeError("'length' is out of bounds");return b=void 0===c&&void 0===d?new Uint8Array(b):void 0===d?new Uint8Array(b,c):new Uint8Array(b,c,d),g.TYPED_ARRAY_SUPPORT?(a=b,a.__proto__=g.prototype):a=m(a,b),a}function o(a,b){if(g.isBuffer(b)){var c=0|p(b.length);return a=f(a,c),0===a.length?a:(b.copy(a,0,0,c),a)}if(b){if("undefined"!=typeof ArrayBuffer&&b.buffer instanceof ArrayBuffer||"length"in b)return"number"!=typeof b.length||Y(b.length)?f(a,0):m(a,b);if("Buffer"===b.type&&_(b.data))return m(a,b.data)}throw new TypeError("First argument must be a string, Buffer, ArrayBuffer, Array, or array-like object.")}function p(a){if(a>=e())throw new Ra
 ngeError("Attempt to allocate Buffer larger than maximum size: 0x"+e().toString(16)+" bytes");return 0|a}function q(a){return+a!=a&&(a=0),g.alloc(+a)}function r(a,b){if(g.isBuffer(a))return a.length;if("undefined"!=typeof ArrayBuffer&&"function"==typeof ArrayBuffer.isView&&(ArrayBuffer.isView(a)||a instanceof ArrayBuffer))return a.byteLength;"string"!=typeof a&&(a=""+a);var c=a.length;if(0===c)return 0;for(var d=!1;;)switch(b){case"ascii":case"latin1":case"binary":return c;case"utf8":case"utf-8":case void 0:return T(a).length;case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return 2*c;case"hex":return c>>>1;case"base64":return W(a).length;default:if(d)return T(a).length;b=(""+b).toLowerCase(),d=!0}}function s(a,b,c){var d=!1;if((void 0===b||0>b)&&(b=0),b>this.length)return"";if((void 0===c||c>this.length)&&(c=this.length),0>=c)return"";if(c>>>=0,b>>>=0,b>=c)return"";for(a||(a="utf8");;)switch(a){case"hex":return H(this,b,c);case"utf8":case"utf-8":return D(this,b,c);case"ascii":re
 turn F(this,b,c);case"latin1":case"binary":return G(this,b,c);case"base64":return C(this,b,c);case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return I(this,b,c);default:if(d)throw new TypeError("Unknown encoding: "+a);a=(a+"").toLowerCase(),d=!0}}function t(a,b,c){var d=a[b];a[b]=a[c],a[c]=d}function u(a,b,c,d,e){if(0===a.length)return-1;if("string"==typeof c?(d=c,c=0):c>2147483647?c=2147483647:-2147483648>c&&(c=-2147483648),c=+c,isNaN(c)&&(c=e?0:a.length-1),0>c&&(c=a.length+c),c>=a.length){if(e)return-1;c=a.length-1}else if(0>c){if(!e)return-1;c=0}if("string"==typeof b&&(b=g.from(b,d)),g.isBuffer(b))return 0===b.length?-1:v(a,b,c,d,e);if("number"==typeof b)return b=255&b,g.TYPED_ARRAY_SUPPORT&&"function"==typeof Uint8Array.prototype.indexOf?e?Uint8Array.prototype.indexOf.call(a,b,c):Uint8Array.prototype.lastIndexOf.call(a,b,c):v(a,[b],c,d,e);throw new TypeError("val must be string, number or Buffer")}function v(a,b,c,d,e){function f(a,b){return 1===g?a[b]:a.readUInt16BE(b*g)}va
 r g=1,h=a.length,i=b.length;if(void 0!==d&&(d=String(d).toLowerCase(),"ucs2"===d||"ucs-2"===d||"utf16le"===d||"utf-16le"===d)){if(a.length<2||b.length<2)return-1;g=2,h/=2,i/=2,c/=2}var j;if(e){var k=-1;for(j=c;h>j;j++)if(f(a,j)===f(b,-1===k?0:j-k)){if(-1===k&&(k=j),j-k+1===i)return k*g}else-1!==k&&(j-=j-k),k=-1}else for(c+i>h&&(c=h-i),j=c;j>=0;j--){for(var l=!0,m=0;i>m;m++)if(f(a,j+m)!==f(b,m)){l=!1;break}if(l)return j}return-1}function w(a,b,c,d){c=Number(c)||0;var e=a.length-c;d?(d=Number(d),d>e&&(d=e)):d=e;var f=b.length;if(f%2!==0)throw new TypeError("Invalid hex string");d>f/2&&(d=f/2);for(var g=0;d>g;++g){var h=parseInt(b.substr(2*g,2),16);if(isNaN(h))return g;a[c+g]=h}return g}function x(a,b,c,d){return X(T(b,a.length-c),a,c,d)}function y(a,b,c,d){return X(U(b),a,c,d)}function z(a,b,c,d){return y(a,b,c,d)}function A(a,b,c,d){return X(W(b),a,c,d)}function B(a,b,c,d){return X(V(b,a.length-c),a,c,d)}function C(a,b,c){return 0===b&&c===a.length?Z.fromByteArray(a):Z.fromByteArray(
 a.slice(b,c))}function D(a,b,c){c=Math.min(a.length,c);for(var d=[],e=b;c>e;){var f=a[e],g=null,h=f>239?4:f>223?3:f>191?2:1;if(c>=e+h){var i,j,k,l;switch(h){case 1:128>f&&(g=f);break;case 2:i=a[e+1],128===(192&i)&&(l=(31&f)<<6|63&i,l>127&&(g=l));break;case 3:i=a[e+1],j=a[e+2],128===(192&i)&&128===(192&j)&&(l=(15&f)<<12|(63&i)<<6|63&j,l>2047&&(55296>l||l>57343)&&(g=l));break;case 4:i=a[e+1],j=a[e+2],k=a[e+3],128===(192&i)&&128===(192&j)&&128===(192&k)&&(l=(15&f)<<18|(63&i)<<12|(63&j)<<6|63&k,l>65535&&1114112>l&&(g=l))}}null===g?(g=65533,h=1):g>65535&&(g-=65536,d.push(g>>>10&1023|55296),g=56320|1023&g),d.push(g),e+=h}return E(d)}function E(a){var b=a.length;if(aa>=b)return String.fromCharCode.apply(String,a);for(var c="",d=0;b>d;)c+=String.fromCharCode.apply(String,a.slice(d,d+=aa));return c}function F(a,b,c){var d="";c=Math.min(a.length,c);for(var e=b;c>e;++e)d+=String.fromCharCode(127&a[e]);return d}function G(a,b,c){var d="";c=Math.min(a.length,c);for(var e=b;c>e;++e)d+=String.from
 CharCode(a[e]);return d}function H(a,b,c){var d=a.length;(!b||0>b)&&(b=0),(!c||0>c||c>d)&&(c=d);for(var e="",f=b;c>f;++f)e+=S(a[f]);return e}function I(a,b,c){for(var d=a.slice(b,c),e="",f=0;f<d.length;f+=2)e+=String.fromCharCode(d[f]+256*d[f+1]);return e}function J(a,b,c){if(a%1!==0||0>a)throw new RangeError("offset is not uint");if(a+b>c)throw new RangeError("Trying to access beyond buffer length")}function K(a,b,c,d,e,f){if(!g.isBuffer(a))throw new TypeError('"buffer" argument must be a Buffer instance');if(b>e||f>b)throw new RangeError('"value" argument is out of bounds');if(c+d>a.length)throw new RangeError("Index out of range")}function L(a,b,c,d){0>b&&(b=65535+b+1);for(var e=0,f=Math.min(a.length-c,2);f>e;++e)a[c+e]=(b&255<<8*(d?e:1-e))>>>8*(d?e:1-e)}function M(a,b,c,d){0>b&&(b=4294967295+b+1);for(var e=0,f=Math.min(a.length-c,4);f>e;++e)a[c+e]=b>>>8*(d?e:3-e)&255}function N(a,b,c,d,e,f){if(c+d>a.length)throw new RangeError("Index out of range");if(0>c)throw new RangeError("I
 ndex out of range")}function O(a,b,c,d,e){return e||N(a,b,c,4,3.4028234663852886e38,-3.4028234663852886e38),$.write(a,b,c,d,23,4),c+4}function P(a,b,c,d,e){return e||N(a,b,c,8,1.7976931348623157e308,-1.7976931348623157e308),$.write(a,b,c,d,52,8),c+8}function Q(a){if(a=R(a).replace(ba,""),a.length<2)return"";for(;a.length%4!==0;)a+="=";return a}function R(a){return a.trim?a.trim():a.replace(/^\s+|\s+$/g,"")}function S(a){return 16>a?"0"+a.toString(16):a.toString(16)}function T(a,b){b=b||1/0;for(var c,d=a.length,e=null,f=[],g=0;d>g;++g){if(c=a.charCodeAt(g),c>55295&&57344>c){if(!e){if(c>56319){(b-=3)>-1&&f.push(239,191,189);continue}if(g+1===d){(b-=3)>-1&&f.push(239,191,189);continue}e=c;continue}if(56320>c){(b-=3)>-1&&f.push(239,191,189),e=c;continue}c=(e-55296<<10|c-56320)+65536}else e&&(b-=3)>-1&&f.push(239,191,189);if(e=null,128>c){if((b-=1)<0)break;f.push(c)}else if(2048>c){if((b-=2)<0)break;f.push(c>>6|192,63&c|128)}else if(65536>c){if((b-=3)<0)break;f.push(c>>12|224,c>>6&63|128
 ,63&c|128)}else{if(!(1114112>c))throw new Error("Invalid code point");if((b-=4)<0)break;f.push(c>>18|240,c>>12&63|128,c>>6&63|128,63&c|128)}}return f}function U(a){for(var b=[],c=0;c<a.length;++c)b.push(255&a.charCodeAt(c));return b}function V(a,b){for(var c,d,e,f=[],g=0;g<a.length&&!((b-=2)<0);++g)c=a.charCodeAt(g),d=c>>8,e=c%256,f.push(e),f.push(d);return f}function W(a){return Z.toByteArray(Q(a))}function X(a,b,c,d){for(var e=0;d>e&&!(e+c>=b.length||e>=a.length);++e)b[e+c]=a[e];return e}function Y(a){return a!==a}var Z=a("base64-js"),$=a("ieee754"),_=a("isarray");c.Buffer=g,c.SlowBuffer=q,c.INSPECT_MAX_BYTES=50,g.TYPED_ARRAY_SUPPORT=void 0!==b.TYPED_ARRAY_SUPPORT?b.TYPED_ARRAY_SUPPORT:d(),c.kMaxLength=e(),g.poolSize=8192,g._augment=function(a){return a.__proto__=g.prototype,a},g.from=function(a,b,c){return h(null,a,b,c)},g.TYPED_ARRAY_SUPPORT&&(g.prototype.__proto__=Uint8Array.prototype,g.__proto__=Uint8Array,"undefined"!=typeof Symbol&&Symbol.species&&g[Symbol.species]===g&&Obje
 ct.defineProperty(g,Symbol.species,{value:null,configurable:!0})),g.alloc=function(a,b,c){return j(null,a,b,c)},g.allocUnsafe=function(a){return k(null,a)},g.allocUnsafeSlow=function(a){return k(null,a)},g.isBuffer=function(a){return!(null==a||!a._isBuffer)},g.compare=function(a,b){if(!g.isBuffer(a)||!g.isBuffer(b))throw new TypeError("Arguments must be Buffers");if(a===b)return 0;for(var c=a.length,d=b.length,e=0,f=Math.min(c,d);f>e;++e)if(a[e]!==b[e]){c=a[e],d=b[e];break}return d>c?-1:c>d?1:0},g.isEncoding=function(a){switch(String(a).toLowerCase()){case"hex":case"utf8":case"utf-8":case"ascii":case"latin1":case"binary":case"base64":case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return!0;default:return!1}},g.concat=function(a,b){if(!_(a))throw new TypeError('"list" argument must be an Array of Buffers');if(0===a.length)return g.alloc(0);var c;if(void 0===b)for(b=0,c=0;c<a.length;++c)b+=a[c].length;var d=g.allocUnsafe(b),e=0;for(c=0;c<a.length;++c){var f=a[c];if(!g.isBuffer(f))
 throw new TypeError('"list" argument must be an Array of Buffers');f.copy(d,e),e+=f.length}return d},g.byteLength=r,g.prototype._isBuffer=!0,g.prototype.swap16=function(){var a=this.length;if(a%2!==0)throw new RangeError("Buffer size must be a multiple of 16-bits");for(var b=0;a>b;b+=2)t(this,b,b+1);return this},g.prototype.swap32=function(){var a=this.length;if(a%4!==0)throw new RangeError("Buffer size must be a multiple of 32-bits");for(var b=0;a>b;b+=4)t(this,b,b+3),t(this,b+1,b+2);return this},g.prototype.swap64=function(){var a=this.length;if(a%8!==0)throw new RangeError("Buffer size must be a multiple of 64-bits");for(var b=0;a>b;b+=8)t(this,b,b+7),t(this,b+1,b+6),t(this,b+2,b+5),t(this,b+3,b+4);return this},g.prototype.toString=function(){var a=0|this.length;return 0===a?"":0===arguments.length?D(this,0,a):s.apply(this,arguments)},g.prototype.equals=function(a){if(!g.isBuffer(a))throw new TypeError("Argument must be a Buffer");return this===a?!0:0===g.compare(this,a)},g.proto
 type.inspect=function(){var a="",b=c.INSPECT_MAX_BYTES;return this.length>0&&(a=this.toString("hex",0,b).match(/.{2}/g).join(" "),this.length>b&&(a+=" ... ")),"<Buffer "+a+">"},g.prototype.compare=function(a,b,c,d,e){if(!g.isBuffer(a))throw new TypeError("Argument must be a Buffer");if(void 0===b&&(b=0),void 0===c&&(c=a?a.length:0),void 0===d&&(d=0),void 0===e&&(e=this.length),0>b||c>a.length||0>d||e>this.length)throw new RangeError("out of range index");if(d>=e&&b>=c)return 0;if(d>=e)return-1;if(b>=c)return 1;if(b>>>=0,c>>>=0,d>>>=0,e>>>=0,this===a)return 0;for(var f=e-d,h=c-b,i=Math.min(f,h),j=this.slice(d,e),k=a.slice(b,c),l=0;i>l;++l)if(j[l]!==k[l]){f=j[l],h=k[l];break}return h>f?-1:f>h?1:0},g.prototype.includes=function(a,b,c){return-1!==this.indexOf(a,b,c)},g.prototype.indexOf=function(a,b,c){return u(this,a,b,c,!0)},g.prototype.lastIndexOf=function(a,b,c){return u(this,a,b,c,!1)},g.prototype.write=function(a,b,c,d){if(void 0===b)d="utf8",c=this.length,b=0;else if(void 0===c&&
 "string"==typeof b)d=b,c=this.length,b=0;else{if(!isFinite(b))throw new Error("Buffer.write(string, encoding, offset[, length]) is no longer supported");b=0|b,isFinite(c)?(c=0|c,void 0===d&&(d="utf8")):(d=c,c=void 0)}var e=this.length-b;if((void 0===c||c>e)&&(c=e),a.length>0&&(0>c||0>b)||b>this.length)throw new RangeError("Attempt to write outside buffer bounds");d||(d="utf8");for(var f=!1;;)switch(d){case"hex":return w(this,a,b,c);case"utf8":case"utf-8":return x(this,a,b,c);case"ascii":return y(this,a,b,c);case"latin1":case"binary":return z(this,a,b,c);case"base64":return A(this,a,b,c);case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return B(this,a,b,c);default:if(f)throw new TypeError("Unknown encoding: "+d);d=(""+d).toLowerCase(),f=!0}},g.prototype.toJSON=function(){return{type:"Buffer",data:Array.prototype.slice.call(this._arr||this,0)}};var aa=4096;g.prototype.slice=function(a,b){var c=this.length;a=~~a,b=void 0===b?c:~~b,0>a?(a+=c,0>a&&(a=0)):a>c&&(a=c),0>b?(b+=c,0>b&&(b=0
 )):b>c&&(b=c),a>b&&(b=a);var d;if(g.TYPED_ARRAY_SUPPORT)d=this.subarray(a,b),d.__proto__=g.prototype;else{var e=b-a;d=new g(e,void 0);for(var f=0;e>f;++f)d[f]=this[f+a]}return d},g.prototype.readUIntLE=function(a,b,c){a=0|a,b=0|b,c||J(a,b,this.length);for(var d=this[a],e=1,f=0;++f<b&&(e*=256);)d+=this[a+f]*e;return d},g.prototype.readUIntBE=function(a,b,c){a=0|a,b=0|b,c||J(a,b,this.length);for(var d=this[a+--b],e=1;b>0&&(e*=256);)d+=this[a+--b]*e;return d},g.prototype.readUInt8=function(a,b){return b||J(a,1,this.length),this[a]},g.prototype.readUInt16LE=function(a,b){return b||J(a,2,this.length),this[a]|this[a+1]<<8},g.prototype.readUInt16BE=function(a,b){return b||J(a,2,this.length),this[a]<<8|this[a+1]},g.prototype.readUInt32LE=function(a,b){return b||J(a,4,this.length),(this[a]|this[a+1]<<8|this[a+2]<<16)+16777216*this[a+3]},g.prototype.readUInt32BE=function(a,b){return b||J(a,4,this.length),16777216*this[a]+(this[a+1]<<16|this[a+2]<<8|this[a+3])},g.prototype.readIntLE=function(a
 ,b,c){a=0|a,b=0|b,c||J(a,b,this.length);for(var d=this[a],e=1,f=0;++f<b&&(e*=256);)d+=this[a+f]*e;return e*=128,d>=e&&(d-=Math.pow(2,8*b)),d},g.prototype.readIntBE=function(a,b,c){a=0|a,b=0|b,c||J(a,b,this.length);for(var d=b,e=1,f=this[a+--d];d>0&&(e*=256);)f+=this[a+--d]*e;return e*=128,f>=e&&(f-=Math.pow(2,8*b)),f},g.prototype.readInt8=function(a,b){return b||J(a,1,this.length),128&this[a]?-1*(255-this[a]+1):this[a]},g.prototype.readInt16LE=function(a,b){b||J(a,2,this.length);var c=this[a]|this[a+1]<<8;return 32768&c?4294901760|c:c},g.prototype.readInt16BE=function(a,b){b||J(a,2,this.length);var c=this[a+1]|this[a]<<8;return 32768&c?4294901760|c:c},g.prototype.readInt32LE=function(a,b){return b||J(a,4,this.length),this[a]|this[a+1]<<8|this[a+2]<<16|this[a+3]<<24},g.prototype.readInt32BE=function(a,b){return b||J(a,4,this.length),this[a]<<24|this[a+1]<<16|this[a+2]<<8|this[a+3]},g.prototype.readFloatLE=function(a,b){return b||J(a,4,this.length),$.read(this,a,!0,23,4)},g.prototype.
 readFloatBE=function(a,b){return b||J(a,4,this.length),$.read(this,a,!1,23,4)},g.prototype.readDoubleLE=function(a,b){return b||J(a,8,this.length),$.read(this,a,!0,52,8)},g.prototype.readDoubleBE=function(a,b){return b||J(a,8,this.length),$.read(this,a,!1,52,8)},g.prototype.writeUIntLE=function(a,b,c,d){if(a=+a,b=0|b,c=0|c,!d){var e=Math.pow(2,8*c)-1;K(this,a,b,c,e,0)}var f=1,g=0;for(this[b]=255&a;++g<c&&(f*=256);)this[b+g]=a/f&255;return b+c},g.prototype.writeUIntBE=function(a,b,c,d){if(a=+a,b=0|b,c=0|c,!d){var e=Math.pow(2,8*c)-1;K(this,a,b,c,e,0)}var f=c-1,g=1;for(this[b+f]=255&a;--f>=0&&(g*=256);)this[b+f]=a/g&255;return b+c},g.prototype.writeUInt8=function(a,b,c){return a=+a,b=0|b,c||K(this,a,b,1,255,0),g.TYPED_ARRAY_SUPPORT||(a=Math.floor(a)),this[b]=255&a,b+1},g.prototype.writeUInt16LE=function(a,b,c){return a=+a,b=0|b,c||K(this,a,b,2,65535,0),g.TYPED_ARRAY_SUPPORT?(this[b]=255&a,this[b+1]=a>>>8):L(this,a,b,!0),b+2},g.prototype.writeUInt16BE=function(a,b,c){return a=+a,b=0|b,
 c||K(this,a,b,2,65535,0),g.TYPED_ARRAY_SUPPORT?(this[b]=a>>>8,this[b+1]=255&a):L(this,a,b,!1),b+2},g.prototype.writeUInt32LE=function(a,b,c){return a=+a,b=0|b,c||K(this,a,b,4,4294967295,0),g.TYPED_ARRAY_SUPPORT?(this[b+3]=a>>>24,this[b+2]=a>>>16,this[b+1]=a>>>8,this[b]=255&a):M(this,a,b,!0),b+4},g.prototype.writeUInt32BE=function(a,b,c){return a=+a,b=0|b,c||K(this,a,b,4,4294967295,0),g.TYPED_ARRAY_SUPPORT?(this[b]=a>>>24,this[b+1]=a>>>16,this[b+2]=a>>>8,this[b+3]=255&a):M(this,a,b,!1),b+4},g.prototype.writeIntLE=function(a,b,c,d){if(a=+a,b=0|b,!d){var e=Math.pow(2,8*c-1);K(this,a,b,c,e-1,-e)}var f=0,g=1,h=0;for(this[b]=255&a;++f<c&&(g*=256);)0>a&&0===h&&0!==this[b+f-1]&&(h=1),this[b+f]=(a/g>>0)-h&255;return b+c},g.prototype.writeIntBE=function(a,b,c,d){if(a=+a,b=0|b,!d){var e=Math.pow(2,8*c-1);K(this,a,b,c,e-1,-e)}var f=c-1,g=1,h=0;for(this[b+f]=255&a;--f>=0&&(g*=256);)0>a&&0===h&&0!==this[b+f+1]&&(h=1),this[b+f]=(a/g>>0)-h&255;return b+c},g.prototype.writeInt8=function(a,b,c){retur
 n a=+a,b=0|b,c||K(this,a,b,1,127,-128),g.TYPED_ARRAY_SUPPORT||(a=Math.floor(a)),0>a&&(a=255+a+1),this[b]=255&a,b+1},g.prototype.writeInt16LE=function(a,b,c){return a=+a,b=0|b,c||K(this,a,b,2,32767,-32768),g.TYPED_ARRAY_SUPPORT?(this[b]=255&a,this[b+1]=a>>>8):L(this,a,b,!0),b+2},g.prototype.writeInt16BE=function(a,b,c){return a=+a,b=0|b,c||K(this,a,b,2,32767,-32768),g.TYPED_ARRAY_SUPPORT?(this[b]=a>>>8,this[b+1]=255&a):L(this,a,b,!1),b+2},g.prototype.writeInt32LE=function(a,b,c){return a=+a,b=0|b,c||K(this,a,b,4,2147483647,-2147483648),g.TYPED_ARRAY_SUPPORT?(this[b]=255&a,this[b+1]=a>>>8,this[b+2]=a>>>16,this[b+3]=a>>>24):M(this,a,b,!0),b+4},g.prototype.writeInt32BE=function(a,b,c){return a=+a,b=0|b,c||K(this,a,b,4,2147483647,-2147483648),0>a&&(a=4294967295+a+1),g.TYPED_ARRAY_SUPPORT?(this[b]=a>>>24,this[b+1]=a>>>16,this[b+2]=a>>>8,this[b+3]=255&a):M(this,a,b,!1),b+4},g.prototype.writeFloatLE=function(a,b,c){return O(this,a,b,!0,c)},g.prototype.writeFloatBE=function(a,b,c){return O(t
 his,a,b,!1,c)},g.prototype.writeDoubleLE=function(a,b,c){return P(this,a,b,!0,c)},g.prototype.writeDoubleBE=function(a,b,c){return P(this,a,b,!1,c)},g.prototype.copy=function(a,b,c,d){if(c||(c=0),d||0===d||(d=this.length),b>=a.length&&(b=a.length),b||(b=0),d>0&&c>d&&(d=c),d===c)return 0;if(0===a.length||0===this.length)return 0;if(0>b)throw new RangeError("targetStart out of bounds");if(0>c||c>=this.length)throw new RangeError("sourceStart out of bounds");if(0>d)throw new RangeError("sourceEnd out of bounds");d>this.length&&(d=this.length),a.length-b<d-c&&(d=a.length-b+c);var e,f=d-c;if(this===a&&b>c&&d>b)for(e=f-1;e>=0;--e)a[e+b]=this[e+c];else if(1e3>f||!g.TYPED_ARRAY_SUPPORT)for(e=0;f>e;++e)a[e+b]=this[e+c];else Uint8Array.prototype.set.call(a,this.subarray(c,c+f),b);return f},g.prototype.fill=function(a,b,c,d){if("string"==typeof a){if("string"==typeof b?(d=b,b=0,c=this.length):"string"==typeof c&&(d=c,c=th

<TRUNCATED>

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