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 2016/02/18 19:04:46 UTC
[01/19] qpid-dispatch git commit: removed 3rd party libraries
Repository: qpid-dispatch
Updated Branches:
refs/heads/master 4c35796c4 -> 06c2538af
removed 3rd party libraries
Project: http://git-wip-us.apache.org/repos/asf/qpid-dispatch/repo
Commit: http://git-wip-us.apache.org/repos/asf/qpid-dispatch/commit/58143c84
Tree: http://git-wip-us.apache.org/repos/asf/qpid-dispatch/tree/58143c84
Diff: http://git-wip-us.apache.org/repos/asf/qpid-dispatch/diff/58143c84
Branch: refs/heads/master
Commit: 58143c84e340eca3ea67ea97a4a74b9d6418fc2c
Parents: 4c35796
Author: Ernest Allen <ea...@redhat.com>
Authored: Thu Feb 18 12:58:40 2016 -0500
Committer: Ernest Allen <ea...@redhat.com>
Committed: Thu Feb 18 12:58:40 2016 -0500
----------------------------------------------------------------------
console/stand-alone/index.html | 125 ++++++++++++++++++++++++++++++++++++
1 file changed, 125 insertions(+)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/58143c84/console/stand-alone/index.html
----------------------------------------------------------------------
diff --git a/console/stand-alone/index.html b/console/stand-alone/index.html
new file mode 100644
index 0000000..63bf162
--- /dev/null
+++ b/console/stand-alone/index.html
@@ -0,0 +1,125 @@
+<!DOCTYPE html>
+<!--
+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.
+-->
+<html>
+
+<head>
+
+ <meta charset="utf-8"/>
+ <meta name="viewport" content="width=device-width, initial-scale=1.0"/>
+ <title>Qpid Dispatch Console</title>
+
+ <link rel="stylesheet" href="https://code.jquery.com/ui/1.11.4/themes/smoothness/jquery-ui.css">
+ <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/jquery.tipsy/1.0.2/jquery.tipsy.css" type="text/css"/>
+ <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/angular-ui-grid/3.0.7/ui-grid.css" type="text/css"/>
+ <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/jquery.fancytree/2.15.0/skin-win8/ui.fancytree.css" type="text/css">
+
+ <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap.min.css" integrity="sha384-1q8mTJOASx8j1Au+a5WDVnPi2lkFfwwEAa8hDDdjZlpLegxhjVME1fgjWPGmkzs7" crossorigin="anonymous">
+ <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap-theme.min.css" integrity="sha384-fLW2N01lMqjakBkx3l/M9EahuwpSfeNvV63J5ezn3uZzapT0u7EYsXMjQV+0En5r" crossorigin="anonymous">
+
+ <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/font-awesome/3.2.1/css/font-awesome.min.css">
+
+
+ <link rel="stylesheet" href="plugin/css/site-base.css" type="text/css"/>
+ <link rel="stylesheet" href="plugin/css/plugin.css" type="text/css"/>
+ <link rel="stylesheet" href="plugin/css/qdrTopology.css" type="text/css"/>
+ <link rel="stylesheet" href="https://cdn.rawgit.com/mohsen1/json-formatter/master/dist/json-formatter.min.css" type="text/css"/>
+
+</head>
+
+<body ng-app="QDR">
+
+<div id="core" ng-controller="QDR.Core">
+ <div id="alerts">
+ <uib-alert ng-repeat="alert in alerts" type="{{alert.type}}">{{alert.msg}}</uib-alert>
+ </div>
+ <div id="main-nav" class="navbar navbar-fixed-top" ng-controller="QDR.MainController">
+ <div class="navbar-inner main-nav-lower">
+ <div class="container">
+ <div class="pull-left">
+ <ul class="nav">
+ <li ng-repeat="nav in topLevelTabs track by $index"
+ ng-class="{active : !nav.isActive()}"
+ ng-show="nav.isValid()">
+ <a ng-href="{{nav.href}}" title="{{nav.title}}" data-placement="bottom" ng-bind="nav.content">
+ </a>
+ </li>
+ </ul>
+ </div>
+ </div>
+ </div>
+ </div>
+
+ <div id="main-body" >
+ <div id="main" class="container-fluid ng-cloak qdr">
+ <div>
+ <ul class="nav nav-tabs connected" ng-controller="QDR.NavBarController">
+ <li ng-repeat="link in breadcrumbs" ng-show="isValid(link)" ng-class='{active : isActive(link.href), "pull-right" : isRight(link), haschart: hasChart(link)}'>
+ <a ng-href="{{link.href}}{{hash}}" ng-bind-html="link.content | to_trusted"></a>
+ </li>
+ </ul>
+ <div class="row-fluid">
+ <div ng-view></div>
+ </div>
+ </div>
+ </div>
+ </div>
+</div>
+
+ <script src="http://d3js.org/d3.v3.min.js"></script>
+ <script src="http://d3js.org/queue.v1.min.js"></script>
+ <script src="http://d3js.org/topojson.v0.min.js"></script>
+
+ <script src="http://code.jquery.com/jquery-1.12.0.min.js"></script>
+
+ <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/js/bootstrap.min.js" integrity="sha384-0mSbJDEHialfmuBBQP6A4Qrprq5OVfW37PRR3j5ELqxss1yVqOtnepnHVP9aJ7xS" crossorigin="anonymous"></script>
+
+ <script src="https://code.angularjs.org/1.4.8/angular.js"></script>
+ <script src="https://code.angularjs.org/1.4.8/angular-resource.js"></script>
+ <script src="https://code.angularjs.org/1.4.8/angular-route.js"></script>
+ <script src="https://code.angularjs.org/1.4.8/angular-animate.js"></script>
+ <script src="https://cdnjs.cloudflare.com/ajax/libs/angular-ui-bootstrap/1.1.0/ui-bootstrap-tpls.min.js"></script>
+ <script src="https://cdn.rawgit.com/jaz303/tipsy/master/src/javascripts/jquery.tipsy.js"></script>
+ <script src="https://cdn.rawgit.com/angular-ui/ui-slider/master/src/slider.js"></script>
+ <script src="https://cdn.rawgit.com/mohsen1/json-formatter/master/dist/json-formatter.min.js"></script>
+
+ <script src="https://code.jquery.com/ui/1.11.4/jquery-ui.min.js"></script>
+ <script src="https://cdnjs.cloudflare.com/ajax/libs/angular-ui-grid/3.0.7/ui-grid.js"></script>
+
+ <script type="text/javascript" src="plugin/js/qdrPlugin.js"></script>
+ <script type="text/javascript" src="plugin/js/qdrOverview.js"></script>
+ <script type="text/javascript" src="plugin/js/navbar.js"></script>
+ <script type="text/javascript" src="plugin/js/qdrList.js"></script>
+ <script type="text/javascript" src="plugin/js/qdrCharts.js"></script>
+ <script type="text/javascript" src="plugin/js/qdrSchema.js"></script>
+ <script type="text/javascript" src="plugin/js/qdrService.js"></script>
+ <script type="text/javascript" src="plugin/js/qdrChartService.js"></script>
+ <script type="text/javascript" src="plugin/js/qdrTopology.js"></script>
+ <script type="text/javascript" src="plugin/js/qdrSettings.js"></script>
+
+ <script type="text/javascript" src="plugin/lib/rhea.js"></script>
+
+ <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery.fancytree/2.15.0/jquery.fancytree.js" type="text/javascript"></script>
+
+ <script type="text/javascript">
+ angular.element(document.getElementsByTagName('head')).append(angular.element('<base href="' + window.location.pathname + '" />'));
+ </script>
+</body>
+</html>
+
---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@qpid.apache.org
For additional commands, e-mail: commits-help@qpid.apache.org
[08/19] qpid-dispatch git commit: moved standalone to a subdir
Posted by ea...@apache.org.
http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/4940e63d/console/stand-alone/plugin/css/site-base.css
----------------------------------------------------------------------
diff --git a/console/stand-alone/plugin/css/site-base.css b/console/stand-alone/plugin/css/site-base.css
new file mode 100644
index 0000000..23141ec
--- /dev/null
+++ b/console/stand-alone/plugin/css/site-base.css
@@ -0,0 +1,4482 @@
+/*
+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.
+*/
+* {
+ outline: none;
+}
+a:focus {
+ outline: none;
+}
+.navbar .brand {
+ font-size: 18px;
+}
+
+.brand > img {
+ height: 11px;
+ width: auto;
+}
+
+.property-name {
+ white-space: nowrap;
+}
+
+small table tbody tr td.property-name {
+ font-weight: bold;
+ text-align: right;
+}
+
+#log-panel {
+ position: fixed;
+ top: -5px;
+ left: 30px;
+ right: 30px;
+ bottom: 50%;
+ z-index: 10000;
+ background: inherit;
+ transition: bottom 1s ease-in-out;
+}
+
+#log-panel > div {
+ position: relative;
+ width: 100%;
+ height: 100%;
+}
+
+#log-panel #log-panel-statements {
+ margin-left: 0;
+ margin-bottom: 0;
+ position: absolute;
+ top: 0;
+ left: 0;
+ right: 0;
+ bottom: 20px;
+ overflow-y: auto;
+}
+
+#log-panel-statements li {
+ margin-left: 3px;
+ margin-right: 3px;
+ transition: background .25s ease-in-out;
+}
+
+#log-panel-statements li pre {
+ border-radius: 0;
+ font-size: 11px;
+}
+
+#log-panel-statements li:hover {
+ background: #111111;
+}
+
+#log-panel-statements li.DEBUG {
+ color: dodgerblue;
+}
+
+#log-panel-statements li.INFO {
+ color: white;
+}
+
+#log-panel-statements li.WARN {
+ color: yellow;
+}
+
+#log-panel-statements li.ERROR {
+ color: red;
+}
+
+#log-panel #close {
+ text-align: center;
+ position: absolute;
+ height: 20px;
+ bottom: 0;
+ left: 0;
+ right: 0;
+ box-shadow: 0 1px 13px rgba(0, 0, 0, 0.1) inset;
+ opacity: 1;
+}
+
+#log-panel #copy {
+ position: absolute;
+ right: 23px;
+ bottom: 26px;
+ background: inherit;
+ transition: opacity 1s ease-in-out;
+ opacity: 0.4;
+ cursor: pointer;
+}
+
+#log-panel #copy:hover {
+ opacity: 1;
+}
+
+div.log-stack-trace p {
+ line-height: 14px;
+ margin-bottom: 2px;
+}
+
+#canvas {
+ display: inline-block;
+}
+.fill {
+ min-height: 100%;
+ height: 100%;
+}
+/* sub tab tweaks */
+body div div ul.nav {
+ margin-bottom: 5px;
+ border-bottom: none;
+}
+
+#tree-ctrl {
+ position: relative;
+ top: -3px;
+}
+
+#tree-ctrl > li > a {
+ display: block;
+ padding-left: 5px;
+ padding-right: 5px;
+ /* padding: 5px; */
+}
+
+ul.dynatree-container {
+ background: inherit;
+}
+ul.dynatree-container li {
+ background: inherit;
+}
+/* Chart stuff */
+#charts {
+ display: block;
+ overflow: hidden;
+ margin: 5px auto;
+ position: relative;
+ padding-bottom: 35px;
+}
+.group {
+ margin-bottom: 1em;
+}
+.axis {
+ font: 10px sans-serif;
+ pointer-events: none;
+ z-index: 2;
+}
+.axis.text {
+ -webkit-transition: fill-opacity 250ms linear;
+}
+.axis path {
+ display: none;
+}
+.axis line {
+ stroke: #000;
+ shape-rendering: crispEdges;
+}
+.axis.top {
+ position: relative;
+ top: 0;
+ padding: 0;
+}
+.axis.bottom {
+ position: absolute;
+ bottom: 0px;
+ padding: 0;
+}
+.horizon {
+ overflow: hidden;
+ position: relative;
+}
+.horizon:last-child {
+ border-bottom: none;
+}
+.horizon + .horizon {
+ border-top: none;
+}
+.horizon canvas {
+ display: block;
+}
+.horizon .title,
+.horizon .value {
+ bottom: 0;
+ line-height: 30px;
+ margin: 0 6px;
+ position: absolute;
+ white-space: nowrap;
+}
+.horizon .title {
+ left: 0;
+}
+.horizon .value {
+ right: 0;
+}
+.line {
+ opacity: .2;
+ z-index: 2;
+}
+
+td {
+ padding-right: 20px;
+}
+
+.expandable {
+ padding: 3px;
+}
+
+.expandable > .title {
+ cursor: pointer;
+}
+
+i.expandable-indicator {
+ font-family: FontAwesome;
+ font-weight: normal;
+ font-style: normal;
+ display: inline-block;
+ text-decoration: inherit;
+}
+
+.expandable-body form fieldset legend {
+ font-size: inherit;
+ margin-bottom: 0px;
+}
+
+.expandable.opened i.expandable-indicator:before {
+ font-family: FontAwesome;
+ content: "\f078" !important;
+}
+
+.expandable.closed i.expandable-indicator:before {
+ font-family: FontAwesome;
+ content: "\f054";
+}
+
+.expandable.opened i.expandable-indicator.folder:before {
+ font-family: FontAwesome;
+ content: "\F07C" !important;
+}
+
+.expandable.closed i.expandable-indicator.folder:before {
+ font-family: FontAwesome;
+ content: "\F07B";
+}
+
+.expandable.opened .expandable-body {
+ display: inline-block;
+ margin-bottom: 3px;
+}
+
+.expandable.closed .expandable-body {
+ display: none;
+}
+
+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;
+}
+
+.tab {
+ display: block;
+ margin-left: 1em;
+}
+
+.red {
+ color: red !important;
+}
+
+.orange {
+ color: orange !important;
+}
+
+.yellow {
+ color: yellow !important;
+}
+
+.green {
+ color: green !important;
+}
+
+.background-green {
+ color: white;
+ background-color: #51a351;
+}
+
+.background-light-green {
+ color: white;
+ background-color: #5ab15a;
+}
+
+.blue {
+ color: dodgerblue !important;
+}
+
+.background-blue {
+ color: white;
+ background-color: #006dcc;
+}
+
+.icon1point5x {
+ font-size: 1.5em;
+}
+
+.centered,
+.align-center {
+ margin-left: auto !important;
+ margin-right: auto !important;
+ text-align: center;
+}
+
+.align-right {
+ text-align: right;
+}
+
+.align-left {
+ text-align: left;
+}
+
+.inline {
+ display: inline;
+}
+
+.inline-block,
+.list-row-select,
+.list-row-contents,
+.list-row-contents > .ngCellText {
+ display: inline-block;
+}
+
+.list-row {
+ height: 30px;
+ white-space: nowrap;
+}
+
+.list-row .ngCellText {
+ padding: 0;
+ vertical-align: middle;
+}
+
+.list-row-select,
+.list-row-contents {
+ height: 100%;
+ vertical-align: middle;
+}
+
+.list-row-select > input {
+ vertical-align: middle;
+}
+
+.no-bottom-margin {
+ margin-bottom: 0 !important;
+}
+
+.no-bottom-margin .control-group {
+ margin-bottom: 4px;
+}
+
+.bottom-margin {
+ margin-bottom: 20px;
+}
+
+li.attr-column {
+ width: 1em;
+}
+
+.editor-autoresize .CodeMirror {
+ height: auto;
+}
+
+.well.editor-autoresize {
+ padding: 0px;
+}
+
+.well.editor-autoresize .CodeMirror {
+ margin-bottom: 0px;
+ border: none;
+}
+
+.editor-autoresize .CodeMirror .CodeMirror-scroll {
+ overflow-y: hidden;
+ overflow-x: auto;
+}
+
+.gridster ul#widgets {
+ list-style-type: none;
+}
+
+.gridster ul#widgets .gs_w {
+ padding: 0px;
+ overflow: hidden;
+ position: relative;
+}
+
+.gridster ul#widgets .preview-holder {
+ transition-property: opacity;
+ transition-duration: 500ms;
+ padding: 1px;
+}
+
+.widget-area {
+ position: relative;
+ height: 100%;
+ width: 100%;
+}
+
+.widget-title {
+ margin: 0;
+ padding-left: 5px;
+ padding-right: 5px;
+ z-index: 6000;
+ position: absolute;
+ top: 0;
+ left: 0;
+ right: 0;
+}
+
+.widget-title:hover {
+ cursor: move;
+}
+
+.widget-title > .row-fluid > .pull-right > i {
+ cursor: pointer;
+ opacity: .25;
+}
+
+.widget-title > .row-fluid > .pull-right > i:hover {
+ transition: opacity 0.25s ease-in-out;
+ -moz-transition: opacity 0.25s ease-in-out;
+ -webkit-transition: opacity 0.25s ease-in-out;
+ opacity: 1;
+}
+
+.widget-body {
+ position: absolute;
+ top: 20px;
+ bottom: 0;
+ left: 0;
+ right: 0;
+}
+
+.height-controls > a {
+ float: left;
+ display: block;
+ opacity: .1;
+ text-decoration: none;
+}
+
+.width-controls > a {
+ float: left;
+ display: block;
+ opacity: .1;
+ text-decoration: none;
+}
+
+.width-controls > a:hover {
+ opacity: .9;
+ text-decoration: none;
+}
+
+.height-controls > a:hover {
+ opacity: .9;
+ text-decoration: none;
+}
+
+.width-controls {
+ font-size: 32px;
+ z-index: 50;
+ position: absolute;
+ width: 1.5em;
+ height: 3em;
+ display: block;
+ right: 5px;
+ top: 43%;
+}
+
+.height-controls {
+ font-size: 32px;
+ z-index: 50;
+ position: absolute;
+ display: block;
+ width: 3em;
+ height: 1.5em;
+ left: 41%;
+ bottom: 5px;
+}
+
+editable-property {
+ position: relative;
+}
+
+.ep.editing {
+ position: absolute;
+ top: -10px;
+ padding: 0;
+ z-index: 10000;
+ border: 1px solid #cecdcd;
+ white-space: nowrap;
+}
+
+/*
+.widget-title > div > div .ep[ng-show=editing] {
+ top: -1px;
+}
+
+table .ep.editing {
+ top: 12px;
+}
+ */
+.ep.editing > form > fieldset > i {
+ position: relative;
+ top: 2px;
+}
+
+.ep > i {
+ cursor: pointer;
+ opacity: .25;
+ transition: opacity 0.25s ease-in-out;
+ -moz-transition: opacity 0.25s ease-in-out;
+ -webkit-transition: opacity 0.25s ease-in-out;
+}
+
+.ep > form > fieldset > input {
+ border: 0;
+}
+
+.ep > i:hover {
+ opacity: 1;
+}
+
+.ep form fieldset i {
+ cursor: pointer;
+ padding-left: 5px;
+}
+
+.ep form.no-bottom-margin {
+ margin: 0;
+}
+
+.ngTotalSelectContainer {
+ margin: 0px;
+}
+
+.ngTopPanel {
+ background: inherit;
+}
+
+.ngGrid {
+ background: inherit;
+}
+
+.ngViewport {
+ margin-left: 0px;
+ margin-right: 0px;
+}
+
+#widgets li div div div div form fieldset div input {
+ display: none;
+}
+#widgets li div div div div div#attributesGrid div div div div.ngHeaderCell {
+ border: none;
+}
+#widgets li div div div div div#attributesGrid div div div div.ngCell {
+ border: none;
+}
+#widgets li div div div div div#attributesGrid div.ngTopPanel {
+ border: none;
+}
+#widgets li div div div div div#attributesGrid div.ngTopPanel div.ngGroupPanel {
+ border: none;
+}
+#widgets li div div div div div#attributesGrid div.ngFooterPanel {
+ border: none;
+ display: none;
+}
+.ngFooterPanel {
+ border-top: none;
+}
+.ngRow .ngCell:last-child {
+ border-right: none;
+}
+.ngRow:last-child {
+ border-bottom: none;
+}
+.ngFooterTotalItems span:first-child {
+ margin-right: .5em;
+}
+
+.ACTIVE:before {
+ font-family: FontAwesome;
+ content: "\f087";
+ font-style: normal;
+ color: #777777;
+}
+
+.RESOLVED:before {
+ font-family: FontAwesome;
+ content: "\f0ad";
+ font-style: normal;
+}
+
+.STARTING:before {
+ font-family: FontAwesome;
+ content: "\f021";
+ font-style: normal;
+}
+
+.STARTING {
+ -moz-animation: spin 2s infinite linear;
+ -o-animation: spin 2s infinite linear;
+ -webkit-animation: spin 2s infinite linear;
+ animation: spin 2s infinite linear;
+}
+
+.STOPPING:before {
+ font-family: FontAwesome;
+ content: "\f021";
+ font-style: normal;
+}
+
+.STOPPING {
+ -moz-animation: spin 2s infinite linear;
+ -o-animation: spin 2s infinite linear;
+ -webkit-animation: spin 2s infinite linear;
+ animation: spin 2s infinite linear;
+}
+
+.UNINSTALLED:before {
+ font-family: FontAwesome;
+ content: "\f014";
+ font-style: normal;
+}
+
+.INSTALLED:before {
+ font-family: FontAwesome;
+ content: "\f06b";
+ font-style: normal;
+}
+
+.table-bordered {
+ border: none;
+ border-radius: 0px;
+}
+
+.table-bordered thead:first-child tr:first-child th:first-child,
+.table-bordered tbody:first-child tr:first-child td:first-child {
+ border-radius: 0px;
+ border-left: none;
+}
+
+.table-bordered th,
+.table-bordered td {
+ border-left: none;
+ border-top: none;
+}
+
+.table-bordered th:last-child,
+.table-bordered td:last-child {
+ border-left: none;
+ border-top: none;
+ border-right: none;
+}
+
+table.table thead .sorting {
+ background: inherit;
+}
+
+table.table thead .sorting_asc:after {
+ background: url('../img/datatable/sort_asc.png') no-repeat top center;
+}
+
+table.table thead .sorting_desc:after {
+ background: url('../img/datatable/sort_desc.png') no-repeat top center;
+}
+
+.dataTables_filter label {
+ margin-bottom: 0px;
+}
+
+.dataTables_filter label input {
+ padding-right: 14px;
+ padding-right: 4px \9;
+ padding-left: 14px;
+ padding-left: 4px \9;
+ margin-bottom: 0;
+}
+
+.nav {
+ margin-bottom: 10px;
+}
+
+.navbar-fixed-top {
+ margin-bottom: 0px;
+}
+
+#main > div > ul.nav,
+ng-include > .nav.nav-tabs {
+ margin-bottom: 10px;
+ min-width: 120px;
+}
+
+#main > div > ul.nav > li,
+ng-include > .nav.nav-tabs > li {
+ margin-top: 3px;
+ margin-bottom: 3px;
+}
+
+.navbar .btn-navbar span:after {
+ font-family: FontAwesome;
+ content: "\f0de";
+ margin-left: 7px;
+}
+
+.navbar .btn-navbar.collapsed span:after {
+ font-family: FontAwesome;
+ content: "\f0dd";
+ margin-left: 7px;
+}
+
+#main > div > ul.nav,
+ng-include > .nav.nav-tabs {
+ padding-left: 3px;
+ padding-right: 3px;
+}
+
+.nav-tabs > li > a,
+.nav-pills > li > a {
+ margin-right: 0px;
+}
+
+div#main div ul.nav li a,
+div#main div ul.nav li span {
+ padding-bottom: 2px;
+ padding-top: 2px;
+}
+
+div#main div ul.nav li a:hover {
+ padding-bottom: 2px;
+ padding-top: 2px;
+}
+
+#main div div div section .tabbable .nav.nav-tabs {
+ margin-top: 0px;
+ margin-bottom: 10px;
+ min-width: 120px;
+}
+
+#main > div > div > div > .nav.nav-tabs:not(.connected),
+.span12 > .nav.nav-tabs:not(.connected) {
+ margin-top: 5px;
+}
+
+.span12 > .nav.nav-tabs:not(.connected),
+.span12 > .nav.nav-tabs > li {
+ margin: 3px;
+}
+
+.logbar {
+ z-index: 40;
+ position: fixed;
+ width: 87%;
+ top: 70px;
+ left: 5%;
+ padding-left: 20px;
+ padding-right: 20px;
+}
+
+.logbar-container {
+ margin-top: 10px;
+ margin-bottom: 5px;
+}
+
+.logbar-container .control-group {
+ margin-bottom: 5px;
+}
+
+.log-main {
+ margin-top: 55px;
+}
+
+.log-filter {
+ margin-right: 30px;
+}
+
+.ui-resizeable-handle {
+ display: none;
+}
+
+.ui-resizable-se {
+ height: 10px;
+ width: 10px;
+ margin-right: 5px;
+ margin-bottom: 5px;
+ font-size: 32px;
+ z-index: 50;
+ position: absolute;
+ display: block;
+ right: 0px;
+ bottom: 0px;
+ cursor: se-resize;
+}
+
+.no-log {
+ margin-top: 55px;
+}
+
+.control i {
+ cursor: pointer;
+}
+
+td.details {
+ padding: 0px;
+ border: none;
+ margin: 0px;
+ height: 0px;
+}
+
+.innerDetails {
+ padding: 5px;
+ white-space: normal;
+ display: none;
+}
+
+table.dataTable {
+ table-layout: fixed;
+}
+
+table.dataTable tbody tr td {
+ overflow: hidden;
+ white-space: nowrap;
+ text-overflow: ellipsis;
+}
+
+.wiki.logbar-container {
+ margin-top: 5px;
+ margin-bottom: 5px;
+}
+
+.wiki.logbar-container > .nav.nav-tabs {
+ margin-top: 0px;
+ margin-bottom: 0px;
+}
+
+.wiki.logbar-container .pull-right {
+ margin-top: 1px;
+}
+
+.wiki-fixed {
+ margin-top: 45px;
+}
+
+.wiki-fixed .pane {
+ top: 120px;
+}
+
+.help-sidebar li {
+ padding-left: 2px;
+ padding-right: 2px;
+}
+
+.help-sidebar li a {
+ padding-left: 3px;
+ padding-right: 3px;
+}
+
+.help-sidebar li:first-child {
+ margin-top: 0px !important;
+ padding-top: 20px;
+}
+
+.help-display p {
+ text-align: justify;
+}
+
+.help-display h5 {
+ margin-top: 2em;
+}
+
+.help-display h6 {
+ margin-top: 2em;
+}
+
+.form-data {
+ display: inline-block;
+ margin: 5px;
+}
+
+input[type="checkbox"].hawtio-checkbox {
+ margin-top: 10px;
+}
+
+.bundle-list {
+ width: 100%;
+}
+
+.bundle-item {
+ position: relative;
+ display: inline-block;
+ width: 300px;
+ margin-bottom: 1px;
+}
+
+.bundle-item-details table {
+ min-height: 0;
+}
+
+.bundle-item-details {
+ height: 0;
+ display: inline-block;
+ z-index: 15;
+}
+
+.bundle-item > a {
+ display: block;
+ z-index: 5;
+}
+
+.bundle-item > a:hover {
+ text-decoration: none;
+}
+
+.bundle-item a span {
+ display: block;
+ padding: 8px;
+ font-weight: normal;
+ z-index: 6;
+ text-overflow: ellipsis;
+ overflow: hidden;
+}
+
+.bundle-item a span.badge {
+ margin-left: 7px;
+}
+
+.bundle-item a span.badge::before {
+ padding: 0px;
+ float: left;
+ position: relative;
+ top: 4px;
+ left: -8px;
+ display: block;
+ content: ' ';
+ height: 6px;
+ width: 6px;
+ z-index: 10;
+}
+
+.bundle-item a.toggle-action {
+ position: absolute;
+ display: block;
+ width: 16px;
+ height: 16px;
+ margin: 0;
+ padding: 0;
+ right: 12px;
+ top: 6px;
+ opacity: 0.2;
+ transition: all 500ms ease-in-out;
+ font-size: 18px;
+}
+
+.bundle-item a.toggle-action .icon-power-off {
+ color: orange;
+}
+
+.bundle-item a.toggle-action .icon-play-circle {
+ color: green;
+}
+
+.bundle-item a.toggle-action:hover {
+ opacity: 1;
+ text-decoration: none;
+}
+
+.bundle-list {
+ margin-bottom: 2em;
+}
+
+div.hawtio-form-tabs div.tab-content {
+ padding-top: 15px;
+ padding: 10px;
+}
+
+.hawtio-form fieldset legend {
+ margin-bottom: 0;
+ border-bottom: none;
+ font-size: 15px;
+}
+
+.spacer {
+ display: inline-block;
+ margin-bottom: 10px;
+}
+
+div.hawtio-form-tabs ul.nav-tabs {
+ margin-bottom: 0px !important;
+}
+
+div.hawtio-form-tabs ul.nav-tabs li {
+ margin-bottom: -1px !important;
+}
+
+div.hawtio-form-tabs ul.nav-tabs li.active:first-child {
+ margin-left: 0px;
+}
+
+div.hawtio-form-tabs ul.nav-tabs li.active {
+ margin-right: 1px;
+ margin-left: 2px;
+ box-shadow: 0 -10px 10px -10px rgba(0, 0, 0, 0.1) !important;
+}
+
+div.hawtio-form-tabs ul.nav-tabs li.active a {
+ font-weight: bold;
+}
+
+.popover-inner .popover-title {
+ overflow: hidden;
+ text-overflow: ellipsis;
+ white-space: nowrap;
+}
+
+.popover {
+ width: auto;
+}
+
+li.stacktrace {
+ line-height: 10px;
+}
+
+.control-button {
+ width: 14px;
+}
+
+.ngViewport:focus {
+ outline: none;
+}
+
+.wikiGridStyle {
+ height: 350px;
+}
+
+/** Animations */
+.wave-enter-setup,
+.wave-leave-setup {
+ transition: all cubic-bezier(0.25, 0.46, 0.45, 0.94) 0.5s;
+}
+
+.wave-enter-setup {
+ position: absolute;
+ left: -100%;
+}
+
+.wave-enter-start {
+ left: 0;
+}
+
+.wave-leave-setup {
+ position: absolute;
+ left: 0;
+}
+
+.wave-leave-start {
+ left: 100%;
+}
+
+/* slideout directive stuff */
+.slideout {
+ position: fixed;
+ z-index: 3000;
+ width: 75%;
+}
+
+.slideout > .slideout-title {
+ min-height: 22px;
+ font-size: 20px;
+ padding: 15px;
+}
+
+.slideout > .slideout-content {
+ position: relative;
+ min-height: 93%;
+ max-height: 93%;
+ overflow: auto;
+ -webkit-transform: translateZ(0);
+}
+
+.slideout-title span {
+ width: 97%;
+ display: inline-block;
+ text-align: left;
+}
+
+.slideout.left > .slideout-content {
+ left: 0;
+ top: 0;
+ margin-right: 2px;
+ margin-left: 0px;
+}
+
+.slideout.right > .slideout-content {
+ left: 2px;
+ top: 0;
+ margin-left: 2px;
+ margin-right: 0px;
+}
+
+.slideout > .slideout-content > .slideout-body {
+ margin: 5px;
+ height: 100%;
+}
+
+.slideout.right {
+ left: 100%;
+}
+
+.slideout.left {
+ left: -75%;
+}
+
+.slideout .slideout-title a {
+ display: inline-block;
+}
+
+.slideout .slideout-title a:hover {
+ text-decoration: none;
+}
+
+.slideout.right .slideout-title a {
+ margin-left: 5px;
+ float: left;
+}
+
+.out {
+ transition: left 1s, right 1s ease-in-out;
+}
+
+.slideout.left .slideout-title a {
+ margin-right: 5px;
+ float: right;
+}
+
+.slideout.right.out {
+ left: 25%;
+}
+
+.slideout.left.out {
+ left: 0%;
+}
+
+.column-filter {
+ width: 94%;
+ margin-bottom: 10px !important;
+}
+
+.color-picker {
+ display: inline-block;
+ position: relative;
+ margin: 0px;
+ line-height: 0px;
+}
+
+.color-picker .wrapper {
+ display: inline-block;
+ padding: 2px;
+ line-height: 0;
+}
+
+.selected-color {
+ width: 1em;
+ height: 1em;
+ padding: 4px;
+ transition: all cubic-bezier(0.25, 0.46, 0.45, 0.94) 0.5s;
+ display: inline-block;
+ cursor: pointer;
+}
+
+.color-picker-popout {
+ transition: opacity 0.25s ease-in-out;
+ position: absolute;
+ top: 0px;
+ overflow: hidden;
+ padding: 0px;
+ line-height: 0;
+ margin: 0px;
+ width: 0px;
+ opacity: 0;
+}
+
+.popout-open {
+ padding: 1px;
+ width: auto;
+ opacity: 1;
+}
+
+.color-picker div table tr td div {
+ width: 1em;
+ height: 1em;
+ padding: 3px;
+ transition: all cubic-bezier(0.25, 0.46, 0.45, 0.94) 0.5s;
+}
+
+.color-picker div table tr td {
+ padding-right: 5px;
+}
+
+.color-picker div table tr td:last-child {
+ padding-right: 0px;
+}
+
+.modal-body div form fieldset div.spacer {
+ display: inherit;
+ margin-bottom: inherit;
+}
+
+.mouse-pointer {
+ cursor: pointer;
+}
+
+.clickable {
+ cursor: pointer;
+ opacity: 0.6;
+ transition: opacity .5s;
+ text-decoration: none;
+}
+
+.clickable,
+.clickable:before {
+ width: 16px;
+ height: 16px;
+ line-height: 16px;
+}
+
+.clickable.no-fade {
+ transition: none;
+ opacity: 1;
+}
+
+.clickable:hover {
+ opacity: 1;
+ text-decoration: none;
+}
+
+.hawtio-pager {
+ overflow: auto;
+ display: inline-block;
+}
+
+.hawtio-pager label {
+ min-height: 100%;
+ vertical-align: middle;
+ margin-right: 5px;
+ display: inline-block;
+}
+
+.fabric-view {
+ position: relative;
+ min-width: 928px;
+}
+
+.columns {
+ position: absolute;
+ bottom: 0;
+ top: 0;
+ left: 0;
+ right: 0;
+ padding-left: 300px;
+ padding-right: 304px;
+ padding-bottom: 0px;
+ padding-top: 0px;
+}
+
+.column {
+ float: left;
+ position: relative;
+ margin-top: 0px;
+ margin-bottom: 0;
+ height: 100%;
+ overflow-x: hidden;
+ overflow-y: auto;
+}
+
+.columns #center {
+ width: 100%;
+ padding: 0 5px;
+ margin-right: 8px;
+}
+
+.columns #left {
+ width: 280px;
+ padding: 0 5px;
+ margin-left: -100%;
+ right: 315px;
+}
+
+.columns #right {
+ width: 270px;
+ padding: 0 5px;
+ margin-right: -330px;
+}
+
+.canvas {
+ height: 91%;
+}
+
+.container-section {
+ height: 90%;
+ overflow-x: hidden;
+ overflow-y: auto;
+}
+
+.profile-section {
+ overflow-x: hidden;
+ overflow-y: auto;
+}
+
+.box.ui-draggable-dragging {
+ width: 274px;
+ transition: none;
+}
+
+.box.selected .box-right i {
+ text-shadow: none;
+}
+
+.contained {
+ display: inline-block;
+ overflow: hidden;
+ text-overflow: ellipsis;
+ position: relative;
+ white-space: nowrap;
+}
+
+h2 > .contained {
+ top: 5px;
+}
+
+h4 > .contained {
+ top: 4px;
+}
+
+.dropdown-toggle > .contained,
+.breadcrumb-link > .contained {
+ top: 2px;
+ line-height: 15px;
+}
+
+/* these widths are totally arbitrary */
+.c-narrow {
+ max-width: 5em;
+}
+
+.c-medium {
+ max-width: 10em;
+}
+
+.c-wide {
+ max-width: 15em;
+}
+
+.c-wide2 {
+ max-width: 20em;
+}
+
+.c-wide3 {
+ max-width: 25em;
+ min-width: 10em;
+}
+
+.c-max {
+ width: 100%;
+}
+
+.fabric-page-header > .profile-summary-wide {
+ margin-left: 10px;
+ line-height: 22px;
+}
+
+.profile-selector-name > .contained {
+ top: 8px;
+}
+
+.box {
+ cursor: pointer;
+ height: 50px;
+ overflow: hidden;
+ padding: 0;
+ margin: 0;
+ position: relative;
+ text-overflow: ellipsis;
+ transition: all 0.2s ease 0s;
+ white-space: nowrap;
+ line-height: 22px;
+ vertical-align: middle;
+}
+
+.box > .box-left,
+.box > .box-right,
+.box > .box-middle {
+ display: inline-block;
+ position: absolute;
+ vertical-align: middle;
+ top: 0;
+ bottom: 0;
+ padding-top: 10px;
+}
+
+.box > .box-left {
+ left: 11px;
+}
+
+.box > .box-right {
+ right: 11px;
+}
+
+.box > .box-middle {
+ right: 60px;
+}
+
+.box > .box-left > div,
+.box > .box-right > div,
+.box > .box-middle > div {
+
+}
+
+.box > .box-left > div > div,
+.box > .box-right > div > div,
+.box > .box-middle > div > div {
+ vertical-align: middle;
+ display: inline-block;
+ margin-left: 4px;
+ margin-right: 4px;
+}
+
+
+.box > .box-left > div > div .contained,
+.box > .box-left > div > div > span,
+.box > .box-right > div > div .contained,
+.box > .box-middle > div > div .contained {
+ vertical-align: middle;
+}
+
+
+.box > .box-left > .profile-select {
+ display: inline-block;
+ top: 9px;
+ max-width: 210px;
+ width: 210px;
+ overflow: hidden;
+ white-space: nowrap;
+ text-overflow: ellipsis;
+}
+
+.box input[type='checkbox'] {
+ margin-top: 5px;
+ display: inline;
+}
+
+.box .active-profile a.invisible {
+ visibility: none;
+}
+
+.box .active-profile div {
+ display: inline;
+}
+
+.box .active-profile {
+ position: absolute;
+ display: inline-block;
+ top: 10px;
+ left: 12px;
+ right: 0px;
+}
+
+.box .active-profile [class^='icon-circle'] {
+ top: 0;
+}
+
+.box-middle ul.inline li {
+ opacity: 0.5;
+ transition: opacity 0.5s;
+}
+
+.box-middle ul.inline li:hover{
+ opacity: 1;
+}
+
+.section-header {
+ padding: 5px 7px;
+}
+
+.selection-controls {
+ display: inline-block;
+}
+
+.section-title {
+ margin-left: 10px;
+ display: inline-block;
+}
+
+.section-controls {
+ display: inline-block;
+ float: right;
+}
+
+#center .section-header .section-controls {
+ position: relative;
+ top: 7px;
+ left: -2px;
+}
+
+.page-padded .section-header .section-controls {
+ position: relative;
+ top: 6px;
+ left: -3px;
+}
+
+.page-padded .section-header .selection-controls {
+ position: relative;
+ top: 1px;
+}
+
+.section-controls > a,
+.section-controls > span > span > span > span > span > .hawtio-dropdown {
+ margin-left: 12px;
+ margin-right: 12px;
+ cursor: pointer;
+}
+
+.section-controls > a:hover,
+.section-controls > span:hover {
+ text-decoration: none;
+}
+
+.section-controls > a.nav-danger {
+ color: IndianRed !important;
+}
+
+.section-controls > a.nav-danger:hover {
+ text-shadow: rgba(205, 92, 92, 0.6) 0 0 20px !important;
+}
+
+.page-padded .section-header .section-filter {
+ margin-top: 0px;
+}
+
+.section-filter {
+ position: relative;
+ display: inline-block;
+ margin-left: 12px;
+}
+
+.active-profile-filter > .section-filter {
+ margin-top: 5px;
+}
+
+#center > .section-header > .section-filter {
+ margin-top: 0px;
+}
+
+#right > .section-header > .section-filter {
+ margin-left: 8px;
+}
+
+#right > .canvas {
+ height: 80%;
+}
+
+.section-filter .icon-remove {
+ position: absolute;
+ top: 7px;
+ right: 9px;
+}
+
+.features-toolbar {
+ position: relative;
+ margin-bottom: 0.5em;
+}
+
+.version-section > .canvas > div > .box {
+ line-height: inherit;
+}
+
+.version-section select {
+ width: 100%;
+ margin-top: 5px;
+ margin-bottom: 5px;
+}
+
+span.remove {
+ float: right;
+}
+
+span.deleting {
+ text-decoration: line-through;
+}
+
+td.deleting {
+ background-color: IndianRed !important;
+}
+
+td.adding {
+ background-color: Aquamarine !important;
+}
+
+.no-match-filter {
+ display: none;
+}
+
+.file-upload div form fieldset .input-prepend .btn {
+ float: left;
+}
+
+@-moz-document url-prefix() {
+ /* hack to get the add button to line up correctly in FF */
+ .input-prepend .btn {
+ padding-top: 5px;
+ padding-bottom: 5px;
+ }
+}
+
+.input-prepend .progress {
+ position: relative;
+ left: 1px;
+ top: 0px;
+ min-height: 30px;
+ width: 160px;
+}
+
+.login-wrapper {
+ position: absolute;
+ left: 0;
+ top: 350px;
+ padding-top: 2px;
+ padding-bottom: 2px;
+ padding-left: 0;
+ padding-right: 0;
+ line-height: 0;
+ width: 100%;
+}
+
+.login-wrapper form {
+ margin-bottom: 0px;
+ padding-top: 67px;
+ padding-bottom: 7px;
+ padding-right: 40px;
+ padding-left: 40px;
+}
+
+.login-wrapper form fieldset {
+ width: 413px;
+}
+
+.login-form form fieldset .control-group {
+ margin-bottom: 15px;
+ margin-left: 5px;
+}
+
+.login-form form fieldset .control-group button[type='submit'] {
+ float: right;
+}
+
+.login-logo {
+ display: block;
+ position: absolute;
+ letter-spacing: 5px;
+ padding: 10px;
+ font-size: 20px;
+ left: 233px;
+ top: 9px;
+}
+
+.login-logo > img {
+ height: 30px;
+}
+
+/** highlight required fields which have no focus */
+input.ng-invalid,
+textarea.ng-invalid,
+select.ng-invalid {
+ border-color: #e5e971;
+ -webkit-box-shadow: 0 0 6px #eff898;
+ -moz-box-shadow: 0 0 6px #eff898;
+ box-shadow: 0 0 6px #eff898;
+}
+
+/** Use bigger and darker border on checkboxes as its hard to see since they already have a shadow */
+input[type="checkbox"].ng-invalid {
+ -webkit-box-shadow: 0 0 12px #e5e971;
+ -moz-box-shadow: 0 0 12px #e5e971;
+ box-shadow: 0 0 12px #e5e971;
+}
+
+.container-profile-settings {
+ min-width: 360px;
+}
+
+.container-settings {
+ min-width: 360px;
+}
+
+.bold {
+ font-weight: bold;
+}
+
+.container-settings dd .ep {
+ display: inline-block;
+ top: -5px;
+}
+
+.deployment-pane h3 {
+ margin-top: 0px;
+}
+
+.deployment-pane ul li i {
+ display: inline-block;
+ white-space: nowrap;
+}
+
+.deployment-pane ul li {
+ white-space: nowrap;
+ padding: 7px;
+}
+
+.deployment-pane ul li editable-property {
+ display: inline-block;
+}
+
+.deployment-pane ul li .ep {
+ display: inline-block;
+}
+
+.container-settings dd input[type=radio] {
+ display: inline-block;
+}
+
+.fabric-page-header .span4 h1,
+.fabric-page-header .span4 h2 {
+ line-height: inherit;
+}
+
+.fabric-page-header h2.inline-block {
+ margin-top: 0;
+ margin-bottom: 0;
+}
+
+.create-container-body {
+ margin-top: 10px;
+}
+
+.log-stack-trace > dd {
+ margin-left: 0;
+}
+
+.log-message > dd > div {
+ margin-top: 10px;
+}
+
+.log-stack-trace > dd > ul {
+ margin-top: 10px;
+}
+
+.log-stack-trace > dd > ul > li {
+ line-height: 12px;
+}
+
+.log-stack-trace > dd > ul > li > div.stack-line > a {
+ font-weight: bold;
+}
+
+pre.stack-line {
+ padding: 0;
+ margin: 0;
+ line-height: 14px;
+}
+
+div.stack-line {
+ white-space: pre-wrap;
+ word-break: break-all;
+ word-wrap: break-word;
+ line-height: 14px;
+}
+
+#container-create-form {
+ margin-bottom: 14px;
+}
+
+#container-create-form .control-group {
+ margin-bottom: 0px;
+}
+
+h1.ajaxError {
+ font-size: 16px;
+}
+
+h2.ajaxError {
+ font-size: 14px;
+}
+
+h3.ajaxError,
+h4.ajaxError {
+ font-size: 12px;
+}
+
+.directive-example {
+ padding: 10px;
+ margin: 10px;
+}
+
+div#main div ul.nav li a.nav-primary.active {
+ color: rgba(255, 255, 255, 0.75);
+}
+
+div#main div ul.nav li a.nav-primary {
+ color: #ffffff;
+ text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
+ background-color: #006dcc;
+ background-image: -moz-linear-gradient(top, #0088cc, #0044cc);
+ background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#0088cc), to(#0044cc));
+ background-image: -webkit-linear-gradient(top, #0088cc, #0044cc);
+ background-image: -o-linear-gradient(top, #0088cc, #0044cc);
+ background-image: linear-gradient(to bottom, #0088cc, #0044cc);
+ background-repeat: repeat-x;
+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0088cc', endColorstr='#ff0044cc', GradientType=0);
+ border-color: #0044cc #0044cc #002a80;
+ border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
+ *background-color: #0044cc;
+ /* Darken IE7 buttons by default so they stand out more given they won't have borders */
+
+ filter: progid:DXImageTransform.Microsoft.gradient(enabled=false);
+}
+
+div#main div ul.nav li a.nav-primary:hover,
+div#main div ul.nav li a.nav-primary:active,
+div#main div ul.nav li a.nav-primary.active,
+div#main div ul.nav li a.nav-primary.disabled,
+div#main div ul.nav li a.nav-primary[disabled] {
+ color: #ffffff;
+ background-color: #0044cc;
+ *background-color: #003bb3;
+}
+
+div#main div ul.nav li a.nav-primary:active,
+div#main div ul.nav li a.nav-primary.active {
+ background-color: #003399 \9;
+}
+
+.nav.nav-tabs li a[disabled] {
+ cursor: not-allowed;
+ opacity: 0.3;
+}
+
+.caret:before {
+ font-family: 'FontAwesome';
+ border: 0;
+ content: "\f078";
+ font-size: 11px;
+ display: block;
+ position: relative;
+ top: -9px;
+ left: 0;
+}
+
+.dropdown.perspective-selector .caret:before {
+ top: -7px;
+}
+
+.caret {
+ border: none;
+ width: 9px;
+}
+
+div#main div ul.nav li a.nav-primary .caret {
+ border-top-color: #ffffff;
+ border-bottom-color: #ffffff;
+}
+
+.main-nav-upper .container:before {
+ display: none;
+}
+
+.main-nav-upper .container:after {
+ display: none;
+}
+
+.main-nav-upper .container {
+ width: auto;
+ line-height: 23px;
+ vertical-align: auto;
+}
+
+.main-nav-upper .icon-desktop:before {
+ position:relative;
+ top: 1px;
+}
+
+.main-nav-lower .container:before {
+ display: none;
+}
+
+.main-nav-lower .container:after {
+ display: none;
+}
+
+.main-nav-lower .container {
+ width: 100%;
+}
+
+.overflow > .dropdown-toggle:not(.open) + .dropdown-menu {
+ border: none;
+}
+
+.main-nav-lower .container ul.nav {
+ width: 100%;
+}
+
+.navbar-inner {
+ height: auto;
+ min-height: 0;
+}
+
+.main-nav-upper {
+ height: 28px;
+ min-height: 28px;
+ font-size: 11px;
+}
+
+.main-nav-upper .brand {
+ font-size: 13px;
+ margin-left: 0px;
+ padding: 0px;
+ font-weight: normal;
+ margin-left: 20px;
+}
+
+.main-nav-upper .nav li a {
+ padding-top: 2px;
+ padding-bottom: 5px;
+}
+
+#main-nav {
+ max-height: 70px;
+}
+
+#main {
+ margin-top: 70px !important;
+}
+
+dd.file-list {
+ margin-left: 0;
+}
+
+.file-list-toolbar .nav .caption {
+ font-weight: bold;
+ padding-top: 5px;
+ padding-bottom: 5px;
+ padding-left: 0 !important;
+}
+
+.file-icon {
+ padding: 0;
+ margin: 0;
+ display: inline-block;
+ width: 16px;
+ height: 16px;
+ margin-right: 6px;
+}
+
+.file-icon i {
+ width: 16px;
+ height: 16px;
+ font-size: 17px;
+ position: relative;
+ left: 2px;
+ top: 2px;
+}
+
+.file-icon img {
+ width: 16px;
+ height: 16px;
+}
+
+.page-padded {
+ padding-left: 20px;
+ padding-right: 20px;
+}
+
+.fabric-page-header .span4 h2 i {
+ margin-right: 13px;
+}
+
+.controller-section-widget {
+ padding: 3px;
+}
+
+.container-dashboard-controls {
+ position: relative;
+ z-index: 10;
+}
+
+.container-dashboard-controls .pull-right .btn {
+ opacity: 0.5;
+ transition: opacity 1s;
+}
+
+.container-dashboard-controls .pull-right .btn:hover {
+ opacity: 0.9;
+}
+
+.container-dashboard-status-table {
+ position: relative;
+ top: -34px;
+ display: table;
+ max-width: 278px;
+ z-index: 9;
+}
+
+.container-status-dashboard {
+ text-align: center;
+ display: table-cell;
+ min-width: 144px;
+}
+
+.container-status-dashboard i {
+ position: relative;
+ left: 0px;
+ font-size: 133px;
+}
+
+.status-icon {
+ display: inline-block;
+ text-decoration: none;
+ color: inherit;
+}
+
+.status-icon:hover {
+ text-decoration: none;
+}
+
+.dashboard-service-list {
+ display: table-cell;
+ min-width: 139px;
+ vertical-align: middle;
+}
+
+.container-dashboard-profile-controls {
+ width: 100%;
+ text-align: center;
+ margin-bottom: 5px;
+}
+
+.no-list {
+ list-style-type: none;
+}
+
+.profile-selector-item {
+ display: table;
+}
+
+.profile-selector-checkbox {
+ display: table-cell;
+ padding-right: 5px;
+}
+
+.profile-selector-name {
+ display: table-cell;
+ position: relative;
+ width: 100%;
+}
+
+.profile-info {
+ position: absolute;
+ right: 3px;
+}
+
+.profile-list ul {
+ margin-left: 0;
+ margin-bottom: 0;
+}
+
+.profile-list ul li .expandable .expandable-body {
+ margin-left: 16px;
+}
+
+/** fabric active profiles */
+.active-profile-titles {
+ position: relative;
+ display: inline-block;
+ width: 100%;
+ height: 40px;
+}
+
+.active-profile-list .expandable {
+ padding: 0;
+}
+
+.active-profile-titles.section-header {
+ padding: 0;
+}
+
+.active-profile-titles div:not(.active-profile-filter) {
+ display: inline-block;
+ font-weight: bold;
+ top: 10px;
+}
+
+.active-profile-row {
+ position: relative;
+ display: inline-block;
+ width: 100%;
+ line-height: 22px;
+ height: 22px;
+}
+
+.active-profile-row div {
+ display: inline-block;
+}
+
+.active-profile-list .expandable .expandable-body {
+ width: 100%;
+}
+
+.active-profile-list .expandable .expandable-body ul li .box {
+ background: inherit;
+}
+
+.active-profile-list .expandable .expandable-body ul li .child-container {
+ margin-left: 0;
+}
+
+.active-profile-expander {
+ position: absolute;
+ left: 0;
+}
+
+.active-profile-requirements {
+ position: absolute;
+ right: 75px;
+}
+
+.active-profile-requirements-title {
+ position: absolute;
+ right: 75px;
+}
+
+.active-profile-create {
+ position: absolute;
+ right: 210px;
+}
+
+.active-profile-count {
+ position: absolute;
+ right: 0px;
+}
+
+.active-profile-count-title {
+ padding: 5px;
+ text-align: right;
+ font-weight: bold;
+}
+
+.active-profile-titles .section-controls {
+ position: absolute;
+ top: 10px !important;
+ right: 10px;
+}
+
+.active-profile-titles .section-controls a {
+ font-weight: normal;
+}
+
+
+.active-profile-name {
+ position: absolute;
+ left: 35px;
+ white-space: nowrap;
+ overflow: hidden;
+ text-overflow: ellipsis;
+ right: 95px;
+}
+
+.active-profile-icon {
+ position: absolute;
+ top: 1px;
+ left: 15px;
+ color: green !important;
+}
+
+.active-profile-icon i {
+ font-size: 17px;
+}
+
+.active-profile-filter {
+ position: absolute;
+ left: 0px;
+ top: -10px;
+}
+
+.active-profile-main {
+ min-width: 754px;
+}
+
+.active-profile-count a .icon-plus {
+ position: relative;
+ top: 1px;
+}
+
+.active-profile-count a:hover {
+ text-decoration: none;
+}
+
+/** fabric brokers page */
+.mq-titles {
+ position: relative;
+ display: inline-block;
+ width: 100%;
+ height: 40px;
+}
+
+.mq-titles.section-header {
+ padding: 0;
+}
+
+.mq-titles .section-controls {
+ position: absolute;
+ top: 9px !important;
+ right: 0px;
+}
+
+.mq-titles .section-controls a {
+ font-weight: normal;
+}
+
+.mq-profile-icon {
+ color: green !important;
+}
+
+.mq-profile-list, .mq-broker-list, .mq-container-list {
+ margin-left: 15px;
+}
+
+i.mq-master {
+ color: orange;
+}
+
+.mq-broker-rectangle, .mq-container-rectangle {
+ position: relative;
+
+ display: inline-block;
+ *display: inline;
+ /* IE7 inline-block hack */
+
+
+ margin-left: 5px;
+ margin-right: 5px;
+ margin-bottom: 5px;
+ margin-top: 5px;
+
+ border-left-width: 10px;
+ border-right-width: 10px;
+ border-top-width: 10px;
+
+ *zoom: 1;
+ padding: 4px 12px;
+ margin-bottom: 0;
+ font-size: 14px;
+ line-height: 20px;
+ *line-height: 20px;
+ text-align: center;
+ vertical-align: middle;
+ cursor: pointer;
+}
+
+.mq-page {
+ position: relative;
+}
+
+.mq-page .hero-unit {
+ position: absolute;
+ top: 53px;
+ left: 10px;
+ right: 10px;
+}
+
+.mq-groups {
+ position: absolute;
+ top: 42px;
+ left: 19px;
+ right: 10px;
+}
+
+.mq-group-rectangle:first-child {
+ margin-top: 10px;
+}
+
+.mq-group-rectangle {
+ position: relative;
+ margin-left: 0;
+ margin-right: 10px;
+ margin-bottom: 10px;
+ margin-top: 0;
+}
+
+.mq-group-rectangle-label .mq-group-name {
+ white-space: nowrap;
+ overflow: hidden;
+ text-overflow: ellipsis;
+ position: absolute;
+ top: 61px;
+ left: 4px;
+ right: 0;
+}
+
+.mq-group-rectangle-label a {
+ position: absolute;
+ top: 5px;
+ right: 5px;
+}
+
+.mq-group-rectangle-label {
+ position: relative;
+ top: 7px;
+ display: inline-block;
+ min-width: 150px;
+ max-width: 150px;
+ min-height: 150px;
+}
+
+.mq-profiles {
+ position: absolute;
+ min-height: 185px;
+ left: 150px;
+ right: 0;
+ display: inline-block;
+ overflow-x: auto;
+}
+
+.mq-profiles .mq-profile-canvas {
+ overflow: auto;
+}
+
+.mq-profile-rectangle {
+ display: inline-block;
+ height: 150px;
+ margin: 0;
+ margin-top: 5px;
+ margin-left: 10px;
+ padding-left: 4px;
+ padding-right: 4px;
+ padding-top: 4px;
+}
+
+.mq-profile-rectangle-label {
+ position: relative;
+ top: 2px;
+}
+
+.mq-profile-name {
+ white-space: nowrap;
+ overflow: hidden;
+ text-overflow: ellipsis;
+ margin-right: 48px;
+ max-width: 300px;
+ display: block;
+}
+
+.mq-profile-rectangle-label .mq-profile-create-broker {
+ position: absolute;
+ top: 0;
+ right: 0;
+}
+
+.mq-profile-canvas {
+ display: inline-block;
+}
+
+.mq-broker-area {
+ position: relative;
+ top: 11px;
+ text-align: center;
+ margin-left: auto;
+ margin-right: auto;
+}
+
+.mq-container-rectangle {
+ margin-top: 2px;
+ width: 20px;
+}
+
+.mq-container-row {
+ display: block;
+ margin-top: 8px;
+ margin-left: auto;
+ margin-right: auto;
+}
+
+.mq-broker-rectangle {
+ height: 88px;
+}
+
+.mq-group-rectangle-label, .mq-profile-rectangle-label, .mq-broker-rectangle-label, .mq-container-rectangle-label {
+ white-space:nowrap;
+}
+
+/** dashboard */
+.dashboard-link-row {
+ width: 100%;
+ position: relative;
+}
+
+a.dashboard-link {
+ line-height: 15px;
+ font-weight: normal;
+}
+
+a.dashboard-link:hover {
+ text-decoration: none;
+}
+
+.dashboard-link {
+ position: absolute;
+ top: 15px;
+ right: 76px;
+ z-index: 500;
+}
+
+.container-list-main {
+ min-width: 592px;
+}
+
+.widget-title > .row-fluid {
+ position: relative;
+}
+
+.widget-title > .row-fluid > .pull-left {
+ position: absolute;
+ right: 16px;
+ left: 0;
+}
+
+.widget-title > .row-fluid > .pull-left > .ep > div {
+ overflow: hidden;
+ white-space: nowrap;
+ text-overflow: ellipsis;
+}
+
+.container-detail-profiles {
+ position: relative;
+ margin-top: 2px;
+}
+
+.container-detail-profile-buttons {
+ position: absolute;
+ right: 0;
+ z-index: 50;
+}
+
+#dialog-body div .profile-list {
+ max-height: 327px;
+ overflow-y: auto;
+}
+
+@media (max-width: 979px) {
+ .navbar-fixed-top .navbar-inner, .navbar-fixed-bottom .navbar-inner {
+ padding: 0;
+ }
+
+ .navbar-fixed-top, .navbar-fixed-bottom {
+ position: fixed;
+ }
+
+}
+
+.header-list li {
+ vertical-align: top;
+ height: 30px;
+}
+
+.header-list li div {
+ height: 30px;
+}
+
+.provision-list {
+ margin-left: 0px;
+}
+
+.provision-list ul {
+ margin-left: 0px;
+}
+
+.provision-list ul li {
+ list-style-type: none;
+ padding: 7px;
+}
+
+ul.zebra-list {
+ margin-left: 0;
+}
+
+.zebra-list li {
+ padding: 7px;
+}
+
+ul.zebra-list > li {
+ list-style-type: none;
+}
+
+ol.zebra-list {
+ counter-reset:li;
+ margin-left: 0;
+ padding-left: 0;
+}
+
+ol.zebra-list > li {
+ position: relative;
+ list-style-type: none;
+}
+
+ol.zebra-list > li:before {
+ content: counter(li);
+ counter-increment: li;
+ padding: 7px;
+ font-weight: bold;
+}
+
+.pointer {
+ cursor: pointer;
+}
+
+.container-profile-settings span.folder-title {
+ font-weight: bold;
+}
+li.profile-selector-folder span.folder-title:hover, li.profile div.profile-selector-name>span>span:hover {
+ color: #005580;
+}
+.widget-body div div .wiki-fixed {
+ margin: 3px;
+}
+
+.loading {
+ position: relative;
+ top: 140px;
+}
+
+.loading p {
+ margin-top: 20px;
+ font-weight: bold;
+ font-size: 20px;
+}
+
+.add-link {
+ position: absolute;
+ right: 20px;
+ top: 130px;
+ width: 22px;
+ height: 19px;
+ text-align: center;
+}
+
+.log-table > li {
+ position: relative;
+ list-style-type: none;
+ min-height: 32px;
+ max-width: 100%;
+ padding: 0;
+}
+
+.log-table .table-head div div {
+ font-weight: bold;
+ text-align: center !important;
+ direction: ltr !important;
+}
+
+.log-table .table-head div div:nth-child(4) {
+ font-weight: bold;
+ left: 247px;
+ width: 326px;
+ text-align: center !important;
+ direction: ltr !important;
+}
+
+.log-table > li > div > div {
+ position: absolute;
+ display: inline-block;
+ white-space: nowrap;
+ text-overflow: ellipsis;
+ font-size: 12px;
+ min-height: 28px;
+ overflow-x: hidden;
+ padding: 3px;
+ padding-top: 6px;
+ width: auto;
+}
+
+.log-table {
+ margin: 0;
+}
+
+.log-table > .table-row {
+ cursor: pointer;
+}
+
+.log-table > .table-row.selected:before {
+ z-index: 39;
+ position: absolute;
+ top: 6px;
+ font-family: FontAwesome;
+ content: "\f054";
+ font-size: 20px;
+ color: green;
+}
+
+.log-table > li > div > div:nth-child(1):not(.stack-line) {
+ left: 0;
+ width: 11px;
+ z-index: 5;
+}
+
+.log-table > li > div > div:nth-child(2) {
+ left: 18px;
+ width: 180px;
+ z-index: 5;
+}
+
+.log-table > li > div > div:nth-child(3) {
+ left: 190px;
+ width: 60px;
+ z-index: 5;
+ text-align: center;
+}
+
+.log-table > li > div > div:nth-child(4) {
+ padding-right: 5px;
+ text-align: right;
+ direction: rtl;
+ z-index: 3;
+ left: 0;
+ width: 573px;
+}
+
+.log-table > li > div > div:nth-child(5) {
+ left: 580px;
+ right: 0;
+ padding-left: 5px;
+}
+
+.log-table > li > div > div:nth-child(6) {
+ position: static;
+ margin-top: 43px;
+ white-space: normal;
+ display: block;
+}
+
+.log-info-panel {
+ z-index: 60;
+ position: fixed;
+ right: 7em;
+ top: 150px;
+ bottom: 5em;
+ padding: 0;
+ overflow: hidden;
+ min-height: 500px;
+ min-width: 800px;
+}
+
+@media(max-width: 1085px) {
+ .log-info-panel {
+ left: 5px;
+ right: 5px;
+ max-width: inherit;
+ min-width: 500px;
+ }
+}
+
+.log-info-panel >.log-info-panel-frame {
+ position: relative;
+ height: 100%;
+ width: 100%;
+ margin: 10px;
+}
+
+.log-info-panel > .log-info-panel-frame > .log-info-panel-header {
+ position: absolute;
+ top: 0;
+ height: 80px;
+ left: 5px;
+ right: 50px;
+ white-space: nowrap;
+}
+
+.log-info-panel-header > span {
+ margin-left: 7px;
+ position: relative;
+ top: 2px;
+ overflow: hidden;
+}
+
+.log-info-panel-frame > .log-info-panel-body {
+ position: absolute;
+ overflow: auto;
+ left: 5px;
+ right: 27px;
+ top: 80px;
+ bottom: 15px;
+ padding-top: 10px;
+ padding-left: 5px;
+ padding-right: 5px;
+}
+
+.log-info-panel-body > .row-fluid {
+ margin-bottom: 10px;
+}
+
+.log-info-panel > .log-info-panel-frame > .log-info-panel-body > .row-fluid > span {
+ margin-right: 7px;
+ white-space: nowrap;
+}
+
+.log-table-dashboard {
+ position: absolute;
+ bottom: 0;
+ left: 0;
+ right: 0;
+}
+
+.ex-node-container {
+ position: relative;
+ width: 100%;
+ height: 696px;
+}
+
+.ex-node {
+ position: absolute;
+ width: 150px;
+ height: 90px;
+ text-align: center;
+ padding-top: 60px;
+}
+
+.dozer-mapping-node {
+ display: block;
+ margin-top: 10px;
+ margin-bottom: 10px;
+ padding: 20px;
+}
+
+.dozer-mappings li {
+ list-style-type: none;
+}
+
+.dozer-mappings ul {
+ margin-left: 50px;
+}
+
+.dozer-mappings span {
+ width: 500px;
+}
+
+.wiki-file-list-up:hover {
+ text-decoration: none;
+
+}
+
+.fabric-page-header.features {
+ margin-top: 10px;
+}
+
+.fabric-page-header > * {
+ line-height: 38px;
+}
+
+.profile-selector-name a:hover {
+ text-decoration: none;
+}
+
+.file-name:hover {
+ text-decoration: none;
+}
+
+i.expandable-indicator.folder {
+ font-size: 17px;
+}
+
+.switches li {
+ width: 215px;
+}
+
+.switch-light.switch-ios {
+ width: 100px;
+}
+
+.switch-container {
+ position: static;
+ padding-top: 5px;
+ width: 215px;
+ height: 45px;
+}
+
+[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;
+}
+
+.main-nav-lower .container ul .dropdown.overflow {
+ margin-right: 25px;
+}
+
+.dropdown-menu.right {
+ left: auto;
+ right: 0;
+}
+
+.dropdown-menu.right:before {
+ left:auto !important;
+ right: 9px;
+}
+
+.dropdown-menu.right:after {
+ left:auto !important;
+ right: 10px;
+}
+
+@media(max-width: 1134px) {
+ .profile-details > [class^="span"] {
+ width: 100%;
+ float: inherit;
+ display: block;
+ margin-left: 2px;
+ margin-right: 2px;
+ }
+}
+
+/* Start 800x600 Optimzations */
+@media(max-width: 849px) {
+
+ .page-padded {
+ padding-left: 5px;
+ padding-right: 5px;
+ }
+
+ .wiki-fixed {
+ margin-left: 0 !important;
+ margin-right: 0 !important;
+ }
+
+ .wiki-fixed .row-fluid .span9 {
+ margin-left: 9px;
+ }
+
+ .container-details > [class*=" offset"] {
+ display: none;
+ }
+
+ .container-details > .span4.offset1 {
+ width: 100%;
+ float: inherit;
+ display: block;
+ margin-left: 2px;
+ margin-right: 2px;
+ }
+
+ .container-details > .span5.offset1 {
+ width: 100%;
+ float: inherit;
+ display: block;
+ margin-left: 2px;
+ margin-right: 2px;
+ }
+
+ .create-container-body > [class^="span"] {
+ width: 100%;
+ float: inherit;
+ display: block;
+ margin-left: 2px;
+ margin-right: 2px;
+ }
+
+ .create-container-body > [class^="span"]:first-child {
+ margin-bottom: 15px;
+ }
+
+ .features-toolbar .pull-left {
+ margin-bottom: 10px;
+ }
+
+ .edit-feature-lists > [class^="span"] {
+ width: 49%;
+ float: inherit;
+ display: inline-block;
+ margin-left: 0;
+ margin-right: 0;
+ }
+
+}
+/* End 800x600 optimizations */
+
+/*
+ * jquery.tocify.css 1.8.0
+ * Author: @gregfranko
+ */
+/* The Table of Contents container element */
+.tocify {
+ /* top works for the wiki, may need customization
+ elsewhere */
+ top: 120px;
+ width: 232px;
+ padding-left: 1em;
+ padding-right: 1em;
+ overflow-y: auto;
+ overflow-x: hidden;
+ text-overflow: ellipsis;
+ white-space: nowrap;
+ position: fixed;
+ bottom: 5px;
+ z-index: 20;
+}
+
+.tocify h2,
+.tocify h3 {
+ white-space: normal;
+}
+
+.toc-container {
+ position: relative;
+ width: 100%;
+}
+
+.toc-content {
+ position: absolute;
+ left: 290px;
+ right: 0;
+}
+
+.tocify ul {
+ margin-left: 0px;
+}
+
+.tocify li {
+ list-style-type: none;
+ display: block;
+}
+
+.tocify li a {
+ display: block;
+ padding: 3px;
+ transition: background,border .25s ease-in-out;
+}
+
+.tocify li a:hover {
+ text-decoration: none;
+}
+
+.tocify li a.active {
+ font-weight: bolder;
+}
+
+/* Makes the font smaller for all subheader elements. */
+.tocify-subheader li {
+ font-size: 12px;
+}
+
+/* Further indents second level subheader elements. */
+.tocify-subheader .tocify-subheader {
+ text-indent: 30px;
+}
+
+/* Further indents third level subheader elements. You can continue this pattern if you have more nested elements. */
+.tocify-subheader .tocify-subheader .tocify-subheader {
+ text-indent: 40px;
+}
+
+@media(max-width: 700px) {
+ .tocify {
+ position: static;
+ width: auto;
+ margin-bottom: 1em;
+ }
+
+ .toc-content {
+ position: static;
+ left: auto;
+ }
+}
+
+fs-donut svg g text.value {
+ font-size: 40px;
+}
+
+fs-donut svg g text.units {
+ font-size: 20px;
+}
+
+.health-displays {
+ width: 100%;
+}
+
+.panel {
+ position: fixed;
+}
+
+.panel.bottom {
+ bottom: 0;
+}
+
+.deploy {
+ right: 0;
+}
+
+.profile-list-item:after {
+ content: ", ";
+}
+
+.profile-list-item:last-child:after {
+ content: " ";
+}
+
+.health-displays .health-display,
+.column-box,
+.column-box-variable,
+.column-box-square,
+.column-box-half-screen {
+ position: relative;
+ display: inline-block;
+ width: 300px;
+ height: 300px;
+ margin-left: 0;
+ margin-right: 0;
+ margin-bottom: 10px;
+ overflow: hidden;
+ vertical-align: top;
+}
+
+.column-box {
+ height: auto;
+ min-height: 175px;
+ width: 500px;
+}
+
+.wiki-icon-view {
+ min-height: 200px;
+}
+
+.wiki-icon-view .column-box {
+ min-height: 0;
+ margin-bottom: 25px;
+}
+
+.column-box-half-screen {
+ width: 50%;
+ min-width: auto;
+ height: auto;
+}
+
+.column-box-square {
+ height: 32px;
+ width: 32px;
+ line-height: 28px;
+ vertical-align: middle;
+ text-align: center;
+}
+
+.column-box-variable {
+ height: auto;
+ min-height: 175px;
+ width: auto;
+ min-width: 175px;
+ max-width: 500px;
+}
+
+.column-box-variable > h3 {
+ margin-bottom: 0;
+}
+
+.column-box .file-icon > * {
+ width: 100%;
+ height: auto;
+}
+
+.location-box {
+ margin: 12px;
+}
+
+.column-box-square > i {
+ font-size: 24px;
+ height: 24px;
+ vertical-align: middle;
+}
+
+.container-groups .column-box {
+ height: 125px;
+ width: auto;
+}
+
+.container-header-version,
+.container-header-version + hr {
+ margin-bottom: 0;
+}
+
+.container-header-version + hr {
+ margin-top: 0;
+}
+
+.container-groups .container-group-header {
+ border-bottom: none;
+}
+
+.column-row {
+ float: left;
+}
+
+.column-box-selected .column-box-header {
+ font-size: 150%;
+ font-weight: bold;
+}
+
+.column-box-icons > .span1 {
+ text-align: center;
+ vertical-align: middle;
+ width: 32px;
+}
+
+.column-box-icons i,
+.column-box-icons img {
+ font-size: 32px;
+ width: 32px;
+}
+
+.ok-container > i {
+ font-size: 32px;
+ color: #a4a4a4;
+}
+
+.column-box > div {
+ position: relative;
+ height: 100%;
+ margin: 10px;
+}
+
+.column-box h3 {
+ text-overflow: ellipsis;
+ line-height: normal;
+ margin-bottom: 0;
+}
+
+.bottom-anchored {
+ position: absolute;
+ bottom: 0;
+ margin-top: -3em;
+}
+
+.label-list > li > .badge {
+ margin-top: 3px;
+ margin-bottom: 3px;
+}
+
+.label-list > .inline-block > .badge {
+ margin-left: 3px;
+ margin-right: 3px;
+}
+
+.health-details {
+ top: 0;
+ bottom: 0;
+ z-index: 40;
+}
+
+.health-status {
+ padding: 0;
+ position: absolute;
+ bottom: 0;
+ overflow: hidden;
+ left: 0;
+ right: 0;
+ z-index: 20;
+}
+
+.health-message-wrap {
+ margin: 0;
+ padding: 0;
+ width: 100%;
+ height: 100%;
+}
+
+.health-message {
+ display: block;
+ margin: 10px;
+}
+
+.health-details-toggle {
+ position: absolute;
+ display: inline-block;
+ width: 16px;
+ height: 16px;
+ right: 2px;
+ top: 0px;
+}
+
+.health-details-wrap {
+ width: 300px;
+ height: 300px;
+ overflow-y: auto;
+ overflow-x: hidden;
+}
+
+.health-details-wrap a {
+ color: #d4d4d4;
+}
+
+.health-details-wrap dl {
+ margin-top: 5px;
+ margin-bottom: 2px;
+ margin-left: 0;
+}
+
+.health-details-wrap table {
+ max-width: 300px;
+}
+
+.health-details-wrap table tr td {
+ vertical-align: middle;
+}
+
+.health-details-wrap table tr td:first-child {
+ font-weight: bold;
+ text-align: right;
+ padding-right: 5px;
+}
+
+.health-details-wrap table tr td:last-child {
+ padding-left: 5px;
+ overflow-x: hidden;
+ text-overflow: ellipsis;
+}
+
+.health-display-title {
+ padding-top: 18px;
+ font-size: 30px;
+ width: 100%;
+ height: 40px;
+ margin-top: 10px;
+ margin-bottom: 10px;
+ font-weight: bold;
+ text-align: center;
+}
+
+.health-display-title.ok {
+ background-color: lightgreen;
+}
+
+.health-display-title.warning {
+ background-color: darkorange;
+}
+
+.health-displays .health-display .health-chart {
+ width: 300px;
+ height: 300px;
+}
+
+.create-column {
+ vertical-align: top;
+ display: inline-block;
+ width: 445px;
+ margin-bottom: 10px;
+}
+
+#create-form {
+ max-width: 422px;
+}
+
+/* hack to work around strange tabset behavior */
+tabset > .tabbable > ul {
+ display: none;
+}
+/* end hack */
+
+tabset > .tabbable > .tab-content > .nav.nav-tabs > li {
+ cursor: pointer;
+}
+
+tabset > .tabbable > .tab-content > .nav.nav-tabs > li.active {
+ cursor: pointer;
+}
+
+tabset > .tabbable > .tab-content > .nav.nav-tabs > li.disabled {
+ opacity: 0.3;
+}
+
+.toast.toast-warning * {
+ color: black;
+}
+
+.hawtio-toc .panel-title {
+ padding: 0;
+ margin-top: 20px;
+ margin-bottom: 20px;
+}
+
+.hawtio-toc .panel-title a {
+ display: block;
+ text-align: center;
+ padding: 10px;
+}
+
+._jsPlumb_endpoint {
+ z-index: 25;
+}
+
+.panes {
+ position: relative;
+ display: block;
+ min-height: 100%;
+}
+
+.panes > .left-pane {
+ position: absolute;
+ left: 0;
+ right: 285px;
+ height: 100%;
+}
+
+.panes > .right-pane {
+ position: absolute;
+ right: 0;
+ width: 275px;
+ height: 100%;
+}
+
+.camel-viewport {
+ overflow: auto;
+ height: 100%;
+}
+
+.camel-canvas-endpoint svg circle {
+ fill: #346789;
+}
+
+.camel-props {
+ position: relative;
+ height: 100%;
+}
+
+.camel-props > .button-bar {
+ left: 0;
+ right: 0;
+ display: block;
+ position: absolute;
+}
+
+.button-bar > .centered > form {
+ margin-bottom: 10px;
+}
+
+.camel-props > .prop-viewport {
+ overflow-y: auto;
+ overflow-x: visible;
+ position: absolute;
+ bottom: 0;
+ top: 80px;
+ width: 100%;
+}
+
+.camel-props form > fieldset > legend {
+ font-size: medium;
+ font-weight: bold;
+ margin: 0;
+ line-height: 12px;
+ padding: 3px;
+}
+
+.endpoint-control > label {
+ font-size: medium;
+ font-weight: bold;
+ margin: 0;
+ line-height: 12px;
+ padding: 3px;
+}
+
+.endpoint-props > p {
+ font-size: medium;
+ font-weight: bold;
+ margin: 0;
+ margin-bottom: 25px;
+ line-height: 12px;
+ padding: 3px;
+}
+
+.endpoint-control > .controls {
+ margin-top: 15px;
+}
+
+.camel-props form fieldset .control-label {
+ float: none;
+ width: auto;
+ text-align: left;
+}
+
+.camel-props form fieldset .controls {
+ margin-left: auto;
+}
+
+.camel-props form fieldset .controls .input-xxlarge {
+ width: auto;
+ margin-left: auto;
+ margin-right: auto;
+}
+
+.camel-props form fieldset div[hawtio-form-array] > div > div > div > .controls.pull-right {
+ float: none;
+}
+
+.welcome {
+ margin-left: 5em;
+ margin-right: 5em;
+}
+
+input.ng-invalid-pattern {
+ border-color: #e9322d;
+ -webkit-box-shadow: 0 0 6px #f8b9b7;
+ -moz-box-shadow: 0 0 6px #f8b9b7;
+ box-shadow: 0 0 6px #f8b9b7;
+}
+
+input.ng-invalid-pattern:focus {
+ border-color: #e9322d;
+ -webkit-box-shadow: 0 0 6px #f8b9b7;
+ -moz-box-shadow: 0 0 6px #f8b9b7;
+ box-shadow: 0 0 6px #f8b9b7;
+}
+
+.threads.logbar > .logbar-container {
+ margin-top: 2px;
+ margin-bottom: 5px;
+}
+
+.state-panel > ul > li:not(:first-child) > span {
+ margin-left: 15px;
+}
+
+.state-panel > ul > li.active {
+ font-weight: bold;
+}
+
+.runnable {
+ color: green;
+}
+
+.timed-waiting {
+ color: orange;
+}
+
+.waiting,
+.darkgray {
+ color: darkgray;
+}
+
+.blocked {
+ color: red;
+}
+
+strong.new,
+.lightgreen {
+ color: lightgreen;
+}
+
+.terminated,
+.darkred {
+ color: darkred;
+}
+
+.thread-state-indicator {
+ width: 100%;
+ height: 100%;
+ padding-top: 5px;
+}
+
+.monitor-indicator {
+ font-size: 10px;
+ padding: 4px;
+ margin: 5px;
+}
+
+.monitor-indicator.button {
+ cursor: pointer;
+}
+
+.monitor-indicator.true {
+ background: #1cd11d;
+ box-shadow: inset 0px 1px 0px 0px rgba(250, 250, 250, 0.5), 0px 0px 4px 1px rgba(34, 203, 1, 0.49);
+}
+
+.monitor-indicator.false {
+ background: #737373;
+ box-shadow: inset 0px 1px 0px 0px rgba(250, 250, 250, 0.5);
+}
+
+.table-header {
+ color: black;
+ position: relative;
+}
+
+.table-header > .indicator:after {
+ font-family: 'FontAwesome';
+ position: absolute;
+ right: 5px;
+}
+
+.table-header.asc > .indicator:after {
+ content: "\f077";
+}
+
+.table-header.desc > .indicator:after {
+ content: "\f078";
+}
+
+.camel-tree > ul.nav {
+ margin-bottom: 3px !important;
+}
+
+.camel-tree > .section-filter {
+ margin: 0 0 8px;
+ display: block;
+}
+
+.table > thead > tr > th {
+ white-space: nowrap;
+ overflow: hidden;
+ text-overflow: ellipsis;
+}
+
+th > .indicator:before {
+ display: inline-block;
+ content: "\00a0";
+ margin-left: 12px;
+}
+
+.simple-table-checkbox,
+.simple-table-checkbox > input {
+ vertical-align: middle;
+ margin: 0;
+ width: 16px;
+ line-height: 16px;
+ max-width: 16px;
+}
+
+
+.table td,
+.table th {
+ vertical-align: middle;
+}
+
+.ngCellText .icon-replication-controller {
+ width: 32px;
+}
+
+.repository-browser-toolbar > .btn {
+ margin-bottom: 10px;
+}
+
+.bundle-list-toolbar {
+ vertical-align: top;
+}
+
+.bundle-list-toolbar > .pull-left > *,
+.bundle-list-toolbar > .pull-right > * {
+ display: inline-block;
+}
+
+.bundle-list-toolbar > div > input,
+.bundle-list-toolbar > div > div > input {
+ margin-bottom: 10px;
+}
+
+.bundle-list-toolbar > div > label,
+.bundle-list-toolbar > div > strong {
+ position: relative;
+ top: -3px;
+}
+
+.bundle-list-toolbar > div > .input-append {
+ position: relative;
+ left: 3px;
+ top: -9px;
+}
+
+.connect-column {
+ display: inline-block;
+ vertical-align: top;
+ width: 550px;
+}
+
+.icon-spacer:before {
+ content: '\00a0';
+ width: 11px;
+}
+
+.dropdown-menu {
+ padding-top: 0;
+ padding-bottom: 0;
+ margin-top: 0;
+ top: 100%;
+ left: 0;
+ right: 0;
+ border-radius: 0;
+}
+
+.main-nav-upper .dropdown-menu {
+ border-top: none;
+ margin-top: -1;
+ border-radius: 0;
+}
+
+.main-nav-lower .dropdown-menu {
+ border-top: none;
+}
+
+.dropdown-menu > li > a {
+ cursor: pointer;
+ padding-left: 15px;
+ padding-right: 15px;
+}
+
+.dropdown.perspective-selector > .dropdown-menu {
+ min-width: 160px;
+ overflow: hidden;
+ text-overflow: ellipsis;
+}
+
+.dropdown.perspective-selector .dropdown-menu > div {
+ display: block;
+}
+
+.dropdown.perspective-selector .dropdown-menu > div > p,
+.hawtio-dropdown p {
+ font-size: smaller;
+ padding-left: 3px;
+ padding-right: 3px;
+ margin-bottom: 0;
+}
+
+.nav .hawtio-dropdown {
+ margin-top: 2px;
+}
+
+.dropdown.perspective-selector .dropdown-menu > div > ul {
+ margin-top: 0;
+}
+
+.dropdown.perspective-selector .dropdown-menu > div > ul > li.clear-recent > a {
+ padding: 3px 5px;
+}
+
+.dropdown-menu > li:hover > a {
+ text-shadow:0px 0px 1px white;
+}
+
+.dropdown-menu:before {
+ display: none !important;
+}
+
+.dropdown-menu:after {
+ display: none !important;
+}
+
+.nav.nav-tabs li .hawtio-dropdown .dropdown-menu {
+ margin-top: 4px;
+ border-top: none;
+}
+
+span.hawtio-dropdown {
+ position: relative;
+ display: block;
+ cursor: pointer;
+}
+
+span.hawtio-dropdown .dropdown-menu {
+ width: auto;
+}
+
+.btn .hawtio-dropdown > .caret {
+ width: 7px;
+}
+
+.btn .hawtio-dropdown > .dropdown-menu {
+ left: -10px;
+ margin-top: 5px;
+ text-align: left;
+}
+
+.submenu-caret {
+ display: inline-block;
+ width: 0;
+ height: 0;
+}
+
+.submenu-caret:before {
+ font-family: 'FontAwesome';
+ border: 0;
+ content: "\f054";
+ font-size: 11px;
+ display: block;
+}
+
+.hawtio-dropdown > ul > li {
+ padding: 3px;
+ padding-left: 5px;
+}
+
+.hawtio-dropdown > ul > li > .menu-item {
+ position: relative;
+ display: block;
+}
+
+.hawtio-dropdown > .submenu-caret:before,
+.hawtio-dropdown > ul > li > .menu-item > .submenu-caret:before {
+ position: absolute;
+ top: 0;
+ right: -2px;
+}
+
+.dropdown-menu .sub-menu {
+ position: absolute;
+ left: 195px;
+ top: -8px;
+}
+
+.hawtio-breadcrumb > li {
+ display: inline-block;
+}
+
+.dropdown-menu .dropdown .caret {
+ display: none;
+}
+
+.hawtio-breadcrumb .caret {
+ border: 0;
+ width: 17px;
+ margin-right: 2px;
+ margin-left: 0;
+}
+
+.hawtio-breadcrumb .caret:before {
+ font-family: 'FontAwesome';
+ content: "\F105";
+ font-size: 40px;
+ top: -9px;
+}
+/*
+.modal {
+ z-index: 5000;
+ width: 660px;
+ margin: -250px 0 0 -320px;
+}
+.modal-backdrop {
+ z-index: 4090;
+}
+*/
+.scrollable-section {
+ overflow-x: hidden;
+ overflow-y: auto;
+ max-height: 260px;
+}
+
+.component {
+ opacity: 0.8;
+ filter: alpha(opacity = 80);
+}
+
+.window,
+.node > rect {
+ stroke-width: 2px;
+ stroke: #346789;
+ fill: url(#rect-gradient);
+ border: 2px solid #346789;
+ z-index: 20;
+ position: absolute;
+ font-size: 0.8em;
+ filter: alpha(opacity = 80);
+ cursor: move;
+
+ box-shadow: 2px 2px 19px #e0e0e0;
+ -o-box-shadow: 2px 2px 19px #e0e0e0;
+ -webkit-box-shadow: 2px 2px 19px #e0e0e0;
+ -moz-box-shadow: 2px 2px 19px #e0e0e0;
+ -moz-border-radius: 4px;
+ border-radius: 4px;
+ background-color: lightgrey;
+ fill: lightgrey;
+}
+
+.window,
+.node.selected > rect {
+ stroke-width: 2px;
+ stroke-dasharray: 10,5;
+ stroke: red;
+}
+
+.window-inner {
+ position: relative;
+ border-radius: 2px;
+}
+
+.window-inner {
+ padding: 6px;
+}
+
+.window-inner.from,
+.node > .from {
+ background-color: lightsteelblue;
+ fill: lightsteelblue;
+}
+
+.window-inner.choice,
+.node > .choice {
+ background-color: lightblue;
+ fill: lightblue;
+}
+
+.window-inner.when,
+.node > .when {
+ background-color: lightgreen;
+ fill: lightgreen;
+}
+
+.window-inner.otherwise,
+.node > .otherwise {
+ background-color: lightgreen;
+ fill: lightgreen;
+}
+
+.window-inner.to,
+.node > .to {
+ background-color: lightsteelblue;
+ fill: lightsteelblue;
+}
+
+.window-inner.log,
+.node > .log {
+ background-color: lightcyan;
+ fill: lightcyan;
+}
+
+.window-inner.setBody,
+.node > .setBody {
+ background-color: #d3d3d3;
+ fill: #d3d3d3;
+}
+
+.window-inner.onException,
+.node > .onException {
+ background-color: lightpink;
+ fill: lightpink;
+}
+
+.window-inner.delay,
+.node > .delay {
+ background-color: lightgrey;
+ fill: lightgrey;
+}
+
+.window-inner.bean,
+.node > .bean {
+ background-color: mediumaquamarine;
+ fill: mediumaquamarine;
+}
+
+.window-inner > * {
+ vertical-align: middle;
+}
+
+.window-inner > span {
+ max-width: 15em;
+ display: inline-block;
+ white-space: nowrap;
+ text-overflow: ellipsis;
+ overflow: hidden;
+}
+
+.window:hover {
+ border-color: #5d94a6;
+ background-color: #ffffa0;
+}
+
+.window:hover > .window-inner {
+ background: inherit;
+}
+
+.window.selected {
+ background-color: #f0f0a0;
+}
+
+.window.selected > .window-inner {
+ background: inherit;
+}
+
+img.nodeIcon {
+ width: 24px !important;
+ height: 24px !important;
+ cursor: crosshair;
+ margin-right: 10px;
+}
+
+img.nodeIcon:hover {
+ opacity: 0.6;
+ box-shadow: 2px 2px 19px #a0a0a0;
+ background-color: #a0a0a0;
+}
+
+.l1 {
+ font-size: 13px;
+}
+
+._jsPlumb_connector {
+ z-index: 4;
+}
+
+._jsPlumb_overlay {
+ z-index: 6;
+}
+
+.hl {
+ border: 3px solid red;
+}
+
+.strong {
+ font-weight: bold;
+}
+
+.discovery > li {
+ position: relative;
+}
+
+.discovery > li > div {
+ vertical-align: middle;
+}
+
+.discovery > li > div:first-child {
+ margin-right: 10px;
+}
+
+.discovery > li > div:last-child,
+.discovery > li > .lock {
+ position: absolute;
+ width: 32px;
+ height: 32px;
+ margin: auto;
+ top: 0;
+ bottom: 0;
+ right: 10px;
+}
+
+.discovery > li > .lock {
+ right: 42px;
+}
+
+.discovery > li > div:last-child > div.connect-button {
+ width: 32px;
+ height: 32px;
+}
+
+.discovery > li > div:last-child > div > i,
+.discovery > li > .lock > i {
+ font-size: 32px;
+ cursor: pointer;
+}
+
+.discovery > li > .lock > i {
+ cursor: inherit;
+}
+
+.discovery > li > div:first-child > img {
+ vertical-align: middle;
+ width: 64px;
+ max-height: 64px;
+}
+
+.auth-form {
+ white-space: nowrap;
+}
+
+.auth-form > form > input {
+ margin-bottom: 0;
+}
+
+.slideout-body .btn-group,
+.btn-group[hawtio-pager] {
+ line-height: normal;
+}
+
+@media print {
+ #main-nav,
+ #log-panel {
+ display: none !important;
+ height: 0 !important;
+ }
+
+ .wiki-grid {
+ display: none;
+ }
+
+ .wiki-fixed {
+ margin-top: 0 !important;
+ }
+
+ .wiki-fixed > .row-fluid > .span3 {
+ display: none;
+ }
+
+ .wiki-fixed > .row-fluid > .span9 {
+ width: 100%;
+ }
+
+ .instance-name {
+ display: none !important;
+ }
+
+ .logbar-container > .nav {
+ display: none !important;
+ height: 0 !important;
+ }
+
+}
+
+.prefs {
+ height: 100%;
+ margin: 0;
+}
+
+.prefs > div {
+ height: 100%;
+ margin: 0;
+}
+
+.slideout-body .prefs {
+ overflow: hidden;
+ margin: 0;
+}
+
+.slideout-body .prefs .tabbable {
+ position: relative;
+ height: 100%;
+ margin: 0;
+}
+
+.pref-slideout > div > div > div {
+ height: 100%;
+ margin: 0;
+}
+
+.pref-slideout .slideout-body {
+ position: absolute;
+ top: 0;
+ bottom: 0;
+ left: 0px;
+ right: 0;
+ overflow: none !important;
+ margin: 0 !important;
+}
+
+.slideout-body .prefs .nav.nav-tabs {
+ top: 5px;
+ bottom: 5px;
+ left: 0;
+ width: 130px;
+ position: absolute;
+ margin: 0;
+ overflow-y: auto;
+}
+
+.slideout-body .prefs .nav.nav-tabs:after,
+.slideout-body .prefs .nav.nav-tabs:before {
+ display: none;
+}
+
+.slideout-body .prefs .nav.nav-tabs li {
+ display: block;
+ float: none;
+}
+
+.slideout-body .prefs .tab-content {
+ position: absolute;
+ overflow: auto;
+ top: 5px;
+ left: 140px;
+ right: 15px;
+ bottom: 5px;
+ margin: 0;
+}
+
+.help-header .without-text,
+.about-header .without-text {
+ position: relative;
+ top: -4px;
+ vertical-align: middle;
+ height: 48px;
+}
+
+.help-header .with-text,
+.about-header .with-text {
+ position: relative;
+ top: -4px;
+ vertical-align: middle;
+ height: 48px;
+}
+
+.service-list > li {
+ list-style-type: none;
+ display: inline-block;
+ margin-left: 3px;
+ margin-right: 3px;
+ vertical-align: middle;
+}
+
+.container-type {
+ width: 16px;
+}
+
+.container-status > i:before,
+.container-type i:before,
+.container-type img {
+ vertical-align: middle;
+ font-size: 16px;
+ height: 16px;
+ width: auto;
+ line-height: 16px;
+}
+
+.container-type img.girthy {
+ height: auto;
+ width: 16px;
+}
+
+.app-logo {
+ width: 64px;
+ margin-right: 10px;
+}
+
+.app-logo img,
+.app-logo i {
+ vertical-align: middle;
+ font-size: 64px;
+ height: 64px;
+ width: auto;
+ line-height: 64px;
+}
+
+.app-logo img.girthy {
+ height: auto;
+ width: 64px;
+}
+
+.service-list i:before,
+.service-list img {
+ height: 16px;
+ width: auto;
+ font-size: 16px;
+ vertical-align: middle;
+}
+
+.service-list img.girthy {
+ height: auto;
+ width: 16px;
+}
+
+.perspective-selector img {
+ width: auto;
+ height: 16px;
+ vertical-align: top;
+}
+
+.operation-row {
+ position: relative;
+ height: 30px;
+ vertical-align: middle;
+}
+
+.operation-row.can-invoke {
+ cursor: pointer;
+}
+
+.operation-row.cant-invoke {
+ cursor: not-allowed;
+}
+
+.operation-row > * {
+ display: inline-block;
+ height: 100%;
+ line-height: 30px;
+}
+
+.operation-actions {
+ position: absolute;
+ right: 6px;
+ top: 4px;
+}
+
+.help-block:empty {
+ margin-top: 10px;
+}
+
+ul.dynatree-container {
+ overflow: visible;
+}
+
+.pane {
+ position: fixed;
+ bottom: 0;
+ top: 70px;
+ height: auto;
+ width: 300px;
+}
+
+.pane > .pane-wrapper {
+ position: relative;
+ height: 100%;
+ width: 100%;
+ overflow: hidden;
+}
+
+.pane-viewport {
+ position: absolute;
+ top: 0;
+ bottom: 0;
+ left: 0;
+ overflow: auto;
+ margin-right: 10px;
+}
+
+.pane-content {
+ width: auto;
+ height: auto;
+}
+
+.pane-bar {
+ position: absolute;
+ top: 0;
+ right: 0;
+ width: 5px;
+ cursor: ew-resize;
+ height: 100%;
+}
+
+.pane-content {
+ float: none;
+ position: static;
+}
+
+.pane.left {
+ left: 0;
+ z-index: 39;
+}
+
+.pane.left .pane-viewport {
+ margin-left: 10px;
+ right: 5px;
+ margin-right: 0;
+}
+
+.pane.left .pane-bar {
+ right: 0;
+}
+
+.pane.right {
+ right: 0;
+}
+
+.pane.right .pane-viewport {
+ margin-left: 10px;
+ margin-right: 5px;
+ right: 5px;
+}
+
+.pane.right .pane-bar {
+ left: 0;
+}
+
+.pane-header-wrapper {
+ margin-left: 10px;
+ margin-right: 10px;
+}
+
+.tree-header {
+ position: relative;
+ height: 26px;
+}
+
+.fabric-app-view-header {
+ height: auto;
+}
+
+.fabric-app-view-header > * {
+ line-height: 12px;
+}
+
+.fabric-app-view-header .alert {
+ margin-bottom: 0;
+}
+
+.fabric-app-view-header .row-fluid:last-child {
+ padding-bottom: 8px;
+}
+
+.tree-header > .left,
+.tree-header > .right {
+ position: absolute;
+ top: 3px;
+ bottom: 6px;
+ vertical-align: middle;
+ line-height: 10px;
+}
+
+.tree-header > .left {
+ left: 0;
+}
+
+.tree-header > .right {
+ right: 10px;
+}
+
+.camel.tree-header {
+ height: 42px;
+}
+
+.camel.tree-header > .left {
+ right: 94px;
+}
+
+.camel.tree-header > .left,
+.camel.tree-header > .right {
+ top: 6px;
+ line-height: 30px;
+}
+
+
+.camel.tree-header > .left > .section-filter {
+ width: 100%;
+}
+
+.camel.tree-header > .left > .section-filter > .search-query {
+ width: 100%;
+ margin-bottom: 10px;
+}
+
+.camel.tree-header > .left > .section-filter > .icon-remove {
+ right: -16px;
+}
+
+.attributes-wrapper {
+ width: 100%;
+ overflow: auto;
+}
+
+.separator {
+ padding-top: 4px;
+ display: inline-block;
+}
+
+.grid-block,
+.health-display {
+ border: 1px solid #00f;
+}
+
+.widget-title {
+ border-bottom: 1px solid #00f;
+}
+
+.container-group-header {
+ vertical-align: middle;
+ line-height: 18px;
+ font-weight: bold;
+ padding: 4px;
+ margin-top: 10px;
+}
+
+.search-query.has-text {
+ background: #55ddff;
+ color: #333333;
+}
+
+.dataTables_filter input {
+ border-radius: 15px
+}
+
+.config-admin-form .form-horizontal .control-label {
+ width: 260px;
+}
+.config-admin-form .form-horizontal .controls {
+ margin-left: 280px;
+}
+
+.new-config-name-form {
+ margin-top: 30px;
+}
+
+.td-fixed-width-150 {
+ white-space: normal;
+ width: 150px;
+}
+
+.pod-label {
+ margin-right: 1em;
+}
+
+td > ul {
+ margin-bottom: 0px;
+}
+
+td > .zebra-list > li {
+ padding: 2px;
+}
+
+ul.nav select {
+ margin-bottom: 0px;
+ height: 25px;
+}
+
+/* ENTESB-2249: fixing bootstrap forms with tooltips */
+.form-horizontal input + div + .help-block,
+.form-horizontal select + div + .help-block,
+.form-horizontal textarea + div + .help-block {
+ margin-top: 10px;
+}
http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/4940e63d/console/stand-alone/plugin/data/places1.json
----------------------------------------------------------------------
diff --git a/console/stand-alone/plugin/data/places1.json b/console/stand-alone/plugin/data/places1.json
new file mode 100644
index 0000000..d1942c8
--- /dev/null
+++ b/console/stand-alone/plugin/data/places1.json
@@ -0,0 +1,13 @@
+{
+"type": "FeatureCollection",
+
+"features": [
+{ "type": "Feature", "properties": { "SCALERANK": 2, "NATSCALE": 200, "LABELRANK": 1, "FEATURECLA": "Admin-1 capital", "NAME": "Boston", "NAMEPAR": null, "NAMEALT": null, "DIFFASCII": 0, "NAMEASCII": "Boston", "ADM0CAP": 0.000000, "CAPALT": 0.000000, "CAPIN": null, "WORLDCITY": 1.000000, "MEGACITY": 1, "SOV0NAME": "United States", "SOV_A3": "USA", "ADM0NAME": "United States of America", "ADM0_A3": "USA", "ADM1NAME": "Massachusetts", "ISO_A2": "US", "NOTE": null, "LATITUDE": 42.329960, "LONGITUDE": -71.070014, "CHANGED": 0.000000, "NAMEDIFF": 0, "DIFFNOTE": null, "POP_MAX": 4467000, "POP_MIN": 589141, "POP_OTHER": 2238083, "RANK_MAX": 12, "RANK_MIN": 11, "GEONAMEID": 4930956.000000, "MEGANAME": "Boston", "LS_NAME": "Boston", "LS_MATCH": 1, "CHECKME": 0, "MAX_POP10": 2338688.000000, "MAX_POP20": 2663082.000000, "MAX_POP50": 4880817.000000, "MAX_POP300": 4880817.000000, "MAX_POP310": 4880817.000000, "MAX_NATSCA": 300.000000, "MIN_AREAKM": 1365.000000, "MAX_AREAKM": 3880.000000, "MIN_AR
EAMI": 527.000000, "MAX_AREAMI": 1498.000000, "MIN_PERKM": 1077.000000, "MAX_PERKM": 3538.000000, "MIN_PERMI": 669.000000, "MAX_PERMI": 2199.000000, "MIN_BBXMIN": -71.675000, "MAX_BBXMIN": -71.433881, "MIN_BBXMAX": -70.658333, "MAX_BBXMAX": -70.658333, "MIN_BBYMIN": 41.533333, "MAX_BBYMIN": 42.008333, "MIN_BBYMAX": 42.554143, "MAX_BBYMAX": 43.075000, "MEAN_BBXC": -71.177127, "MEAN_BBYC": 42.277571, "COMPARE": 0, "GN_ASCII": "Boston", "FEATURE_CL": "P", "FEATURE_CO": "PPLA", "ADMIN1_COD": 0.000000, "GN_POP": 589141.000000, "ELEVATION": 13.000000, "GTOPO30": 11.000000, "TIMEZONE": "America\/New_York", "GEONAMESNO": "GeoNames match general.", "UN_FID": 527, "UN_ADM0": "United States of America", "UN_LAT": 42.370000, "UN_LONG": -71.100000, "POP1950": 2551.000000, "POP1955": 2680.000000, "POP1960": 2818.000000, "POP1965": 3000.000000, "POP1970": 3187.000000, "POP1975": 3233.000000, "POP1980": 3281.000000, "POP1985": 3349.000000, "POP1990": 3428.000000, "POP1995": 3726.000000, "POP2000":
4049.000000, "POP2005": 4364.000000, "POP2010": 4467.000000, "POP2015": 4597.000000, "POP2020": 4774.000000, "POP2025": 4919.000000, "POP2050": 5032.000000, "CITYALT": null }, "geometry": { "type": "Point", "coordinates": [ -71.071959532186838, 42.331906001702293 ] } },
+{ "type": "Feature", "properties": { "SCALERANK": 2, "NATSCALE": 200, "LABELRANK": 8, "FEATURECLA": "Admin-0 capital alt", "NAME": "Tel Aviv-Yafo", "NAMEPAR": null, "NAMEALT": "Tel Aviv-Jaffa", "DIFFASCII": 0, "NAMEASCII": "Tel Aviv-Yafo", "ADM0CAP": 0.000000, "CAPALT": 1.000000, "CAPIN": "While Jerulsale", "WORLDCITY": 0.000000, "MEGACITY": 1, "SOV0NAME": "Israel", "SOV_A3": "IS1", "ADM0NAME": "Israel", "ADM0_A3": "ISR", "ADM1NAME": "Tel Aviv", "ISO_A2": "IL", "NOTE": null, "LATITUDE": 32.079991, "LONGITUDE": 34.770012, "CHANGED": 4.000000, "NAMEDIFF": 0, "DIFFNOTE": "Changed scale rank.", "POP_MAX": 3112000, "POP_MIN": 378358, "POP_OTHER": 2306851, "RANK_MAX": 12, "RANK_MIN": 10, "GEONAMEID": 293394.000000, "MEGANAME": "Tel Aviv-Yafo", "LS_NAME": "Tel Aviv-Yafo", "LS_MATCH": 1, "CHECKME": 0, "MAX_POP10": 2324568.000000, "MAX_POP20": 2324568.000000, "MAX_POP50": 2324568.000000, "MAX_POP300": 0.000000, "MAX_POP310": 0.000000, "MAX_NATSCA": 50.000000, "MIN_AREAKM": 436.000000, "MAX_A
REAKM": 436.000000, "MIN_AREAMI": 168.000000, "MAX_AREAMI": 168.000000, "MIN_PERKM": 386.000000, "MAX_PERKM": 386.000000, "MIN_PERMI": 240.000000, "MAX_PERMI": 240.000000, "MIN_BBXMIN": 34.716667, "MAX_BBXMIN": 34.716667, "MIN_BBXMAX": 34.958333, "MAX_BBXMAX": 34.958333, "MIN_BBYMIN": 31.850000, "MAX_BBYMIN": 31.850000, "MIN_BBYMAX": 32.208333, "MAX_BBYMAX": 32.208333, "MEAN_BBXC": 34.836735, "MEAN_BBYC": 32.030266, "COMPARE": 0, "GN_ASCII": "Tel Aviv-Yafo", "FEATURE_CL": "P", "FEATURE_CO": "PPL", "ADMIN1_COD": 5.000000, "GN_POP": 378358.000000, "ELEVATION": 0.000000, "GTOPO30": -9999.000000, "TIMEZONE": "Asia\/Jerusalem", "GEONAMESNO": "GeoNames match general.", "UN_FID": 304, "UN_ADM0": "Israel", "UN_LAT": 32.040000, "UN_LONG": 34.760000, "POP1950": 418.000000, "POP1955": 556.000000, "POP1960": 738.000000, "POP1965": 882.000000, "POP1970": 1029.000000, "POP1975": 1206.000000, "POP1980": 1416.000000, "POP1985": 1681.000000, "POP1990": 2026.000000, "POP1995": 2442.000000, "POP2000":
2752.000000, "POP2005": 3012.000000, "POP2010": 3112.000000, "POP2015": 3256.000000, "POP2020": 3453.000000, "POP2025": 3600.000000, "POP2050": 3726.000000, "CITYALT": "Tel Aviv-Jaffa" }, "geometry": { "type": "Point", "coordinates": [ 34.768065899551743, 32.081937333041651 ] } },
+{ "type": "Feature", "properties": { "SCALERANK": 7, "NATSCALE": 20, "LABELRANK": 7, "FEATURECLA": "Admin-1 capital", "NAME": "Brno", "NAMEPAR": null, "NAMEALT": null, "DIFFASCII": 0, "NAMEASCII": "Brno", "ADM0CAP": 0.000000, "CAPALT": 0.000000, "CAPIN": null, "WORLDCITY": 0.000000, "MEGACITY": 0, "SOV0NAME": "Czech Republic", "SOV_A3": "CZE", "ADM0NAME": "Czech Republic", "ADM0_A3": "CZE", "ADM1NAME": "Kraj Vysocina", "ISO_A2": "CZ", "NOTE": null, "LATITUDE": 49.200393, "LONGITUDE": 16.609983, "CHANGED": 0.000000, "NAMEDIFF": 0, "DIFFNOTE": null, "POP_MAX": 388277, "POP_MIN": 369559, "POP_OTHER": 380022, "RANK_MAX": 10, "RANK_MIN": 10, "GEONAMEID": 3078610.000000, "MEGANAME": null, "LS_NAME": "Brno", "LS_MATCH": 1, "CHECKME": 5, "MAX_POP10": 388277.000000, "MAX_POP20": 388277.000000, "MAX_POP50": 0.000000, "MAX_POP300": 0.000000, "MAX_POP310": 0.000000, "MAX_NATSCA": 20.000000, "MIN_AREAKM": 141.000000, "MAX_AREAKM": 141.000000, "MIN_AREAMI": 54.000000, "MAX_AREAMI": 54.000000, "MI
N_PERKM": 149.000000, "MAX_PERKM": 149.000000, "MIN_PERMI": 92.000000, "MAX_PERMI": 92.000000, "MIN_BBXMIN": 16.483333, "MAX_BBXMIN": 16.483333, "MIN_BBXMAX": 16.708333, "MAX_BBXMAX": 16.708333, "MIN_BBYMIN": 49.116667, "MAX_BBYMIN": 49.116667, "MIN_BBYMAX": 49.300000, "MAX_BBYMAX": 49.300000, "MEAN_BBXC": 16.601967, "MEAN_BBYC": 49.196167, "COMPARE": 0, "GN_ASCII": "Brno", "FEATURE_CL": "P", "FEATURE_CO": "PPLA", "ADMIN1_COD": 78.000000, "GN_POP": 369559.000000, "ELEVATION": 0.000000, "GTOPO30": 226.000000, "TIMEZONE": "Europe\/Prague", "GEONAMESNO": "GeoNames match general.", "UN_FID": 0, "UN_ADM0": null, "UN_LAT": 0.000000, "UN_LONG": 0.000000, "POP1950": 0.000000, "POP1955": 0.000000, "POP1960": 0.000000, "POP1965": 0.000000, "POP1970": 0.000000, "POP1975": 0.000000, "POP1980": 0.000000, "POP1985": 0.000000, "POP1990": 0.000000, "POP1995": 0.000000, "POP2000": 0.000000, "POP2005": 0.000000, "POP2010": 0.000000, "POP2015": 0.000000, "POP2020": 0.000000, "POP2025": 0.000000, "POP2
050": 0.000000, "CITYALT": null }, "geometry": { "type": "Point", "coordinates": [ 16.60998327501909, 49.200393492726221 ] } },
+{ "type": "Feature", "properties": { "SCALERANK": 1, "NATSCALE": 300, "LABELRANK": 2, "FEATURECLA": "Admin-1 capital", "NAME": "Toronto", "NAMEPAR": null, "NAMEALT": null, "DIFFASCII": 0, "NAMEASCII": "Toronto", "ADM0CAP": 0.000000, "CAPALT": 0.000000, "CAPIN": null, "WORLDCITY": 1.000000, "MEGACITY": 1, "SOV0NAME": "Canada", "SOV_A3": "CAN", "ADM0NAME": "Canada", "ADM0_A3": "CAN", "ADM1NAME": "Ontario", "ISO_A2": "CA", "NOTE": null, "LATITUDE": 43.699980, "LONGITUDE": -79.420021, "CHANGED": 0.000000, "NAMEDIFF": 0, "DIFFNOTE": null, "POP_MAX": 5213000, "POP_MIN": 3934421, "POP_OTHER": 3749229, "RANK_MAX": 13, "RANK_MIN": 12, "GEONAMEID": 6167865.000000, "MEGANAME": "Toronto", "LS_NAME": "Toronto", "LS_MATCH": 1, "CHECKME": 0, "MAX_POP10": 3934421.000000, "MAX_POP20": 4377344.000000, "MAX_POP50": 5190755.000000, "MAX_POP300": 5190755.000000, "MAX_POP310": 5190755.000000, "MAX_NATSCA": 300.000000, "MIN_AREAKM": 1432.000000, "MAX_AREAKM": 2286.000000, "MIN_AREAMI": 553.000000, "MAX_AR
EAMI": 883.000000, "MIN_PERKM": 464.000000, "MAX_PERKM": 1161.000000, "MIN_PERMI": 289.000000, "MAX_PERMI": 721.000000, "MIN_BBXMIN": -80.008333, "MAX_BBXMIN": -79.806554, "MIN_BBXMAX": -79.130272, "MAX_BBXMAX": -78.608333, "MIN_BBYMIN": 43.141667, "MAX_BBYMIN": 43.475000, "MIN_BBYMAX": 44.090162, "MAX_BBYMAX": 44.125000, "MEAN_BBXC": -79.464213, "MEAN_BBYC": 43.712937, "COMPARE": 0, "GN_ASCII": "Toronto", "FEATURE_CL": "P", "FEATURE_CO": "PPL", "ADMIN1_COD": 8.000000, "GN_POP": 4612191.000000, "ELEVATION": 0.000000, "GTOPO30": 173.000000, "TIMEZONE": "America\/Toronto", "GEONAMESNO": "Geonames ascii name + lat.d + long.d matching.", "UN_FID": 14, "UN_ADM0": "Canada", "UN_LAT": 43.720000, "UN_LONG": -79.410000, "POP1950": 1068.000000, "POP1955": 1365.000000, "POP1960": 1744.000000, "POP1965": 2093.000000, "POP1970": 2535.000000, "POP1975": 2770.000000, "POP1980": 3008.000000, "POP1985": 3355.000000, "POP1990": 3807.000000, "POP1995": 4197.000000, "POP2000": 4607.000000, "POP2005": 5
035.000000, "POP2010": 5213.000000, "POP2015": 5447.000000, "POP2020": 5687.000000, "POP2025": 5827.000000, "POP2050": 5946.000000, "CITYALT": null }, "geometry": { "type": "Point", "coordinates": [ -79.421966652988431, 43.701925736408441 ] } },
+{ "type": "Feature", "properties": { "SCALERANK": 0, "NATSCALE": 600, "LABELRANK": 1, "FEATURECLA": "Admin-0 capital", "NAME": "Beijing", "NAMEPAR": null, "NAMEALT": null, "DIFFASCII": 0, "NAMEASCII": "Beijing", "ADM0CAP": 1.000000, "CAPALT": 0.000000, "CAPIN": null, "WORLDCITY": 1.000000, "MEGACITY": 1, "SOV0NAME": "China", "SOV_A3": "CHN", "ADM0NAME": "China", "ADM0_A3": "CHN", "ADM1NAME": "Beijing", "ISO_A2": "CN", "NOTE": null, "LATITUDE": 39.928892, "LONGITUDE": 116.388286, "CHANGED": 0.000000, "NAMEDIFF": 0, "DIFFNOTE": null, "POP_MAX": 11106000, "POP_MIN": 7480601, "POP_OTHER": 9033231, "RANK_MAX": 14, "RANK_MIN": 13, "GEONAMEID": 1816670.000000, "MEGANAME": "Beijing", "LS_NAME": "Beijing", "LS_MATCH": 1, "CHECKME": 0, "MAX_POP10": 10190861.000000, "MAX_POP20": 11120470.000000, "MAX_POP50": 16510327.000000, "MAX_POP300": 23647944.000000, "MAX_POP310": 137121250.000000, "MAX_NATSCA": 300.000000, "MIN_AREAKM": 2512.000000, "MAX_AREAKM": 118844.000000, "MIN_AREAMI": 970.000000,
"MAX_AREAMI": 45886.000000, "MIN_PERKM": 1837.000000, "MAX_PERKM": 93615.000000, "MIN_PERMI": 1141.000000, "MAX_PERMI": 58169.000000, "MIN_BBXMIN": 111.441667, "MAX_BBXMIN": 116.058333, "MIN_BBXMAX": 117.208333, "MAX_BBXMAX": 117.325000, "MIN_BBYMIN": 31.883333, "MAX_BBYMIN": 39.658333, "MIN_BBYMAX": 40.433333, "MAX_BBYMAX": 40.466667, "MEAN_BBXC": 115.929521, "MEAN_BBYC": 38.837783, "COMPARE": 0, "GN_ASCII": "Beijing", "FEATURE_CL": "P", "FEATURE_CO": "PPLC", "ADMIN1_COD": 22.000000, "GN_POP": 7480601.000000, "ELEVATION": 0.000000, "GTOPO30": 63.000000, "TIMEZONE": "Asia\/Harbin", "GEONAMESNO": "GeoNames match general.", "UN_FID": 24, "UN_ADM0": "China", "UN_LAT": 39.900000, "UN_LONG": 116.380000, "POP1950": 4331.000000, "POP1955": 4628.000000, "POP1960": 4945.000000, "POP1965": 5284.000000, "POP1970": 5646.000000, "POP1975": 6034.000000, "POP1980": 6448.000000, "POP1985": 6890.000000, "POP1990": 7362.000000, "POP1995": 8486.000000, "POP2000": 9782.000000, "POP2005": 10717.000000,
"POP2010": 11106.000000, "POP2015": 11741.000000, "POP2020": 12842.000000, "POP2025": 13807.000000, "POP2050": 14545.000000, "CITYALT": null }, "geometry": { "type": "Point", "coordinates": [ 116.386339825659434, 39.930838089909059 ] } },
+{ "type": "Feature", "properties": { "SCALERANK": 4, "NATSCALE": 50, "LABELRANK": 1, "FEATURECLA": "Populated place", "NAME": "Ashburn", "NAMEPAR": null, "NAMEALT": null, "DIFFASCII": 0, "NAMEASCII": "Ashburn", "ADM0CAP": 0.000000, "CAPALT": 0.000000, "CAPIN": null, "WORLDCITY": 0.000000, "MEGACITY": 1, "SOV0NAME": "United States", "SOV_A3": "USA", "ADM0NAME": "United States of America", "ADM0_A3": "USA", "ADM1NAME": "Maryland", "ISO_A2": "US", "NOTE": null, "LATITUDE": 39.299990, "LONGITUDE": -76.619985, "CHANGED": 0.000000, "NAMEDIFF": 0, "DIFFNOTE": null, "POP_MAX": 2255000, "POP_MIN": 610892, "POP_OTHER": 1689307, "RANK_MAX": 12, "RANK_MIN": 11, "GEONAMEID": 4347778.000000, "MEGANAME": "Ashburn", "LS_NAME": "Ashburn", "LS_MATCH": 1, "CHECKME": 0, "MAX_POP10": 1776808.000000, "MAX_POP20": 1912760.000000, "MAX_POP50": 1912760.000000, "MAX_POP300": 0.000000, "MAX_POP310": 0.000000, "MAX_NATSCA": 50.000000, "MIN_AREAKM": 1079.000000, "MAX_AREAKM": 1256.000000, "MIN_AREAMI": 417.0000
00, "MAX_AREAMI": 485.000000, "MIN_PERKM": 645.000000, "MAX_PERKM": 832.000000, "MIN_PERMI": 401.000000, "MAX_PERMI": 517.000000, "MIN_BBXMIN": -76.934897, "MAX_BBXMIN": -76.934897, "MIN_BBXMAX": -76.400000, "MAX_BBXMAX": -76.400000, "MIN_BBYMIN": 38.975000, "MAX_BBYMIN": 39.075599, "MIN_BBYMAX": 39.533333, "MAX_BBYMAX": 39.533333, "MEAN_BBXC": -76.655503, "MEAN_BBYC": 39.269123, "COMPARE": 0, "GN_ASCII": "Ashburn", "FEATURE_CL": "P", "FEATURE_CO": "PPL", "ADMIN1_COD": 0.000000, "GN_POP": 610892.000000, "ELEVATION": 10.000000, "GTOPO30": 2.000000, "TIMEZONE": "America\/New_York", "GEONAMESNO": "Geonames ascii name + lat.d + long.d matching.", "UN_FID": 526, "UN_ADM0": "United States of America", "UN_LAT": 39.320000, "UN_LONG": -76.610000, "POP1950": 1168.000000, "POP1955": 1290.000000, "POP1960": 1422.000000, "POP1965": 1486.000000, "POP1970": 1555.000000, "POP1975": 1650.000000, "POP1980": 1749.000000, "POP1985": 1797.000000, "POP1990": 1849.000000, "POP1995": 1962.000000, "POP2000
": 2083.000000, "POP2005": 2207.000000, "POP2010": 2255.000000, "POP2015": 2322.000000, "POP2020": 2422.000000, "POP2025": 2508.000000, "POP2050": 2578.000000, "CITYALT": null }, "geometry": { "type": "Point", "coordinates": [ -76.621930845685483, 39.301935908916732 ] } },
+{ "type": "Feature", "properties": { "SCALERANK": 3, "NATSCALE": 110, "LABELRANK": 1, "FEATURECLA": "Admin-1 capital", "NAME": "Raleigh", "NAMEPAR": null, "NAMEALT": null, "DIFFASCII": 0, "NAMEASCII": "Raleigh", "ADM0CAP": 0.000000, "CAPALT": 0.000000, "CAPIN": null, "WORLDCITY": 0.000000, "MEGACITY": 0, "SOV0NAME": "United States", "SOV_A3": "USA", "ADM0NAME": "United States of America", "ADM0_A3": "USA", "ADM1NAME": "North Carolina", "ISO_A2": "US", "NOTE": null, "LATITUDE": 35.818781, "LONGITUDE": -78.644693, "CHANGED": 0.000000, "NAMEDIFF": 0, "DIFFNOTE": null, "POP_MAX": 1163515, "POP_MIN": 416468, "POP_OTHER": 656353, "RANK_MAX": 12, "RANK_MIN": 10, "GEONAMEID": 4487042.000000, "MEGANAME": null, "LS_NAME": "Raleigh", "LS_MATCH": 1, "CHECKME": 0, "MAX_POP10": 672592.000000, "MAX_POP20": 686323.000000, "MAX_POP50": 686323.000000, "MAX_POP300": 686323.000000, "MAX_POP310": 0.000000, "MAX_NATSCA": 100.000000, "MIN_AREAKM": 665.000000, "MAX_AREAKM": 691.000000, "MIN_AREAMI": 257.00
0000, "MAX_AREAMI": 267.000000, "MIN_PERKM": 520.000000, "MAX_PERKM": 553.000000, "MIN_PERMI": 323.000000, "MAX_PERMI": 344.000000, "MIN_BBXMIN": -78.916667, "MAX_BBXMIN": -78.903728, "MIN_BBXMAX": -78.458333, "MAX_BBXMAX": -78.458333, "MIN_BBYMIN": 35.625000, "MAX_BBYMIN": 35.625000, "MIN_BBYMAX": 36.000000, "MAX_BBYMAX": 36.000000, "MEAN_BBXC": -78.682861, "MEAN_BBYC": 35.811316, "COMPARE": 0, "GN_ASCII": "Raleigh", "FEATURE_CL": "P", "FEATURE_CO": "PPLA", "ADMIN1_COD": 0.000000, "GN_POP": 276093.000000, "ELEVATION": 96.000000, "GTOPO30": 91.000000, "TIMEZONE": "America\/New_York", "GEONAMESNO": "GeoNames match general.", "UN_FID": 0, "UN_ADM0": null, "UN_LAT": 0.000000, "UN_LONG": 0.000000, "POP1950": 0.000000, "POP1955": 0.000000, "POP1960": 0.000000, "POP1965": 0.000000, "POP1970": 0.000000, "POP1975": 0.000000, "POP1980": 0.000000, "POP1985": 0.000000, "POP1990": 0.000000, "POP1995": 0.000000, "POP2000": 0.000000, "POP2005": 0.000000, "POP2010": 0.000000, "POP2015": 0.000000,
"POP2020": 0.000000, "POP2025": 0.000000, "POP2050": 0.000000, "CITYALT": null }, "geometry": { "type": "Point", "coordinates": [ -78.644693442484481, 35.818781350745724 ] } }
+]
+}
---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@qpid.apache.org
For additional commands, e-mail: commits-help@qpid.apache.org
[10/19] qpid-dispatch git commit: moved standalone to a subdir
Posted by ea...@apache.org.
http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/4940e63d/console/plugin/lib/rhea.js
----------------------------------------------------------------------
diff --git a/console/plugin/lib/rhea.js b/console/plugin/lib/rhea.js
deleted file mode 100644
index fa323a3..0000000
--- a/console/plugin/lib/rhea.js
+++ /dev/null
@@ -1,7716 +0,0 @@
-require=(function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})({1:[function(require,module,exports){
-(function (process,Buffer){
-/*
- * Copyright 2015 Red Hat Inc.
- *
- * 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.
- */
-'use strict';
-
-var frames = require('./frames.js');
-var log = require('./log.js');
-var sasl = require('./sasl.js');
-var types = require('./types.js');
-var util = require('./util.js');
-var EndpointState = require('./endpoint.js');
-var Session = require('./session.js');
-var Transport = require('./transport.js');
-
-var net = require("net");
-var tls = require("tls");
-var EventEmitter = require('events').EventEmitter;
-
-var AMQP_PROTOCOL_ID = 0x00;
-var TLS_PROTOCOL_ID = 0x02;
-
-function get_socket_id(socket) {
- if (socket.get_id_string) return socket.get_id_string();
- return socket.localAddress + ':' + socket.localPort + ' -> ' + socket.remoteAddress + ':' + socket.remotePort;
-};
-
-function session_per_connection(conn) {
- var ssn = null;
- return {
- 'get_session' : function () {
- if (!ssn) {
- ssn = conn.create_session();
- ssn.begin();
- }
- return ssn;
- }
- };
-};
-
-function restrict(count, f) {
- if (count) {
- var current = count;
- var reset;
- return function (successful_attempts) {
- if (reset !== successful_attempts) {
- current = count;
- reset = successful_attempts;
- }
- if (current--) return f(successful_attempts);
- else return -1;
- };
- } else {
- return f;
- }
-}
-
-function backoff(initial, max) {
- var delay = initial;
- var reset;
- return function (successful_attempts) {
- if (reset !== successful_attempts) {
- delay = initial;
- reset = successful_attempts;
- }
- var current = delay;
- var next = delay*2;
- delay = max > next ? next : max;
- return current;
- };
-}
-
-function get_connect_fn(options) {
- if (options.transport === undefined || options.transport === 'tcp') {
- return net.connect;
- } else if (options.transport === 'tls' || options.transport === 'ssl') {
- return tls.connect;
- } else {
- throw Error('Unrecognised transport: ' + options.transport);
- }
-}
-
-function connection_details(options) {
- var details = {};
- details.connect = options.connect ? options.connect : get_connect_fn(options);
- details.host = options.host ? options.host : 'localhost';
- details.port = options.port ? options.port : 5672;
- details.options = options;
- return details;
-};
-
-var conn_counter = 1;
-
-var Connection = function (options, container) {
- this.options = {};
- if (options) {
- for (var k in options) {
- this.options[k] = options[k];
- }
- }
- this.container = container;
- if (!this.options.id) {
- this.options.id = 'connection-' + conn_counter++;
- }
- if (!this.options.container_id) {
- this.options.container_id = container ? container.id : util.generate_uuid();
- }
- if (!this.options.connection_details) {
- var self = this;
- this.options.connection_details = function() { return connection_details(self.options); };
- }
- var reconnect = this.get_option('reconnect', true);
- if (typeof reconnect === 'boolean' && reconnect) {
- var initial = this.get_option('initial_reconnect_delay', 100);
- var max = this.get_option('max_reconnect_delay', 60000);
- this.options.reconnect = restrict(this.get_option('reconnect_limit'), backoff(initial, max));
- } else if (typeof reconnect === 'number') {
- var fixed = this.options.reconnect
- this.options.reconnect = restrict(this.get_option('reconnect_limit'), function () { return fixed; });
- }
- this.registered = false;
- this.state = new EndpointState();
- this.local_channel_map = {};
- this.remote_channel_map = {};
- this.local = {};
- this.remote = {};
- this.local.open = frames.open(this.options);
- this.local.close = frames.close({});
- this.session_policy = session_per_connection(this);
- this.amqp_transport = new Transport(this.options.id, AMQP_PROTOCOL_ID, frames.TYPE_AMQP, this);
- this.sasl_transport = undefined;
- this.transport = this.amqp_transport;
- this.conn_established_counter = 0;
- this.heartbeat_out = undefined;
- this.heartbeat_in = undefined;
- this.abort_idle = false;
- this.socket_ready = false;
-};
-
-Connection.prototype = Object.create(EventEmitter.prototype);
-Connection.prototype.constructor = Connection;
-Connection.prototype.dispatch = function(name, context) {
- log.events('Connection got event: ' + name);
- if (this.listeners(name).length) {
- EventEmitter.prototype.emit.apply(this, arguments);
- return true;
- } else if (this.container) {
- return this.container.dispatch.apply(this.container, arguments);
- }
-};
-
-Connection.prototype.reset = function() {
- if (this.abort_idle) {
- this.abort_idle = false;
- this.local.close.error = undefined;
- this.state = new EndpointState();
- this.state.open();
- }
-
- //reset transport
- this.amqp_transport = new Transport(this.options.id, AMQP_PROTOCOL_ID, frames.TYPE_AMQP, this);
- this.sasl_transport = undefined;
- this.transport = this.amqp_transport;
-
- //reset remote endpoint state
- this.state.disconnected();
- this.remote = {};
- //reset sessions:
- this.remote_channel_map = {};
- for (var k in this.local_channel_map) {
- this.local_channel_map[k].reset();
- }
- this.socket_ready = false;
-}
-
-Connection.prototype.connect = function () {
- this.is_server = false;
- this._connect(this.options.connection_details(this.conn_established_counter));
- this.open();
- return this;
-};
-Connection.prototype.reconnect = function () {
- log.reconnect('reconnecting...');
- this.reset();
- this._connect(this.options.connection_details(this.conn_established_counter));
- process.nextTick(this._process.bind(this));
- return this;
-};
-
-Connection.prototype._connect = function (details) {
- if (details.connect) {
- this.init(details.connect(details.port, details.host, details.options, this.connected.bind(this)));
- } else {
- this.init(get_connect_fn(details)(details.port, details.host, details.options, this.connected.bind(this)));
- }
- return this;
-};
-
-Connection.prototype.accept = function (socket) {
- this.is_server = true;
- log.io('[' + this.id + '] client accepted: '+ get_socket_id(socket));
- this.socket_ready = true;
- return this.init(socket);
-};
-
-Connection.prototype.init = function (socket) {
- this.socket = socket;
- this.socket.on('data', this.input.bind(this));
- this.socket.on('error', this.error.bind(this));
- this.socket.on('end', this.eof.bind(this));
-
- if (this.is_server) {
- var mechs;
- if (this.container && Object.getOwnPropertyNames(this.container.sasl_server_mechanisms).length) {
- mechs = this.container.sasl_server_mechanisms;
- }
- if (this.socket.encrypted && this.socket.authorized && this.get_option('enable_sasl_external', false)) {
- mechs = sasl.server_add_external(mechs ? util.clone(mechs) : {});
- }
- if (mechs) {
- this.sasl_transport = new sasl.Server(this, mechs);
- }
- } else {
- var mechanisms = this.get_option('sasl_mechanisms');
- if (!mechanisms) {
- var username = this.get_option('username');
- var password = this.get_option('password');
- if (username) {
- mechanisms = sasl.client_mechanisms();
- if (password) mechanisms.enable_plain(username, password);
- else mechanisms.enable_anonymous(username);
- }
- }
- if (this.socket.encrypted && this.options.cert && this.get_option('enable_sasl_external', false)) {
- if (!mechanisms) mechanisms = sasl.client_mechanisms();
- mechanisms.enable_external();
- }
-
- if (mechanisms) {
- this.sasl_transport = new sasl.Client(this, mechanisms);
- }
- }
- this.transport = this.sasl_transport ? this.sasl_transport : this.amqp_transport;
- return this;
-};
-
-Connection.prototype.attach_sender = function (options) {
- return this.session_policy.get_session().attach_sender(options);
-};
-Connection.prototype.open_sender = Connection.prototype.attach_sender;//alias
-
-Connection.prototype.attach_receiver = function (options) {
- return this.session_policy.get_session().attach_receiver(options);
-};
-Connection.prototype.open_receiver = Connection.prototype.attach_receiver;//alias
-
-Connection.prototype.get_option = function (name, default_value) {
- if (this.options[name] !== undefined) return this.options[name];
- else if (this.container) return this.container.get_option(name, default_value);
- else return default_value;
-};
-
-Connection.prototype.connected = function () {
- this.socket_ready = true;
- this.conn_established_counter++;
- log.io('[' + this.options.id + '] connected ' + get_socket_id(this.socket));
- this.output();
-};
-Connection.prototype.sasl_failed = function (text) {
- this.transport_error = {condition:'amqp:unauthorized-access', description:text};
- this._handle_error();
-}
-
-Connection.prototype._handle_error = function () {
- var error = this.get_error();
- if (error) {
- //TODO: invoke connection_close regardless of whether connection_error is handled
- //TODO: example for error handling
- if (!this.dispatch('connection_error', this._context())) {
- if (!this.dispatch('connection_close', this._context())) {
- console.log('error: ' + JSON.stringify(error));
- }
- }
- return true;
- } else {
- return false;
- }
-}
-
-Connection.prototype.get_error = function () {
- if (this.transport_error) return this.transport_error;
- if (this.remote.close && this.remote.close.error) return this.remote.close.error;
- return undefined;
-}
-
-Connection.prototype.output = function () {
- if (this.socket && this.socket_ready) {
- if (this.heartbeat_out) clearTimeout(this.heartbeat_out);
- this.transport.write(this.socket);
- if (((this.is_closed() && this.state.has_settled()) || this.abort_idle || this.transport_error) && !this.transport.has_writes_pending()) {
- this.socket.end();
- } else if (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);
- }
- }
-};
-
-Connection.prototype.input = function (buff) {
- if (this.heartbeat_in) clearTimeout(this.heartbeat_in);
- log.io('[' + this.options.id + '] read ' + buff.length + ' bytes');
- var buffer;
- if (this.previous_input) {
- buffer = Buffer.concat([this.previous_input, buff], this.previous_input.length + buff.length);
- this.previous_input = null;
- } else {
- buffer = buff;
- }
- var read = this.transport.read(buffer, this);
- if (read < buffer.length) {
- this.previous_input = buffer.slice(read);
- }
- if (this.local.open.idle_time_out) this.heartbeat_in = setTimeout(this.idle.bind(this), this.local.open.idle_time_out);
- if (this.transport.has_writes_pending()) this.output();
-};
-
-Connection.prototype.idle = function () {
- if (this.is_open()) {
- this.abort_idle = true;
- this.local.close.error = {condition:'amqp:resource-limit-exceeded', description:'max idle time exceeded'};
- this.close();
- }
-};
-
-Connection.prototype.error = function (e) {
- console.log('[' + this.options.id + '] error: ' + e);
- this._disconnected();
-};
-
-Connection.prototype.eof = function (e) {
- this._disconnected();
-};
-
-Connection.prototype._disconnected = function () {
- if (!this.is_closed()) {
- if (!this.dispatch('disconnected', this._context())) {
- console.log('[' + this.options.id + '] disconnected');
- }
- if (!this.is_server && !this.transport_error && this.options.reconnect) {
- var delay = this.options.reconnect(this.conn_established_counter);
- if (delay >= 0) {
- log.reconnect('Scheduled reconnect in ' + delay + 'ms');
- setTimeout(this.reconnect.bind(this), delay);
- }
- }
- }
-};
-
-Connection.prototype.open = function () {
- if (this.state.open()) {
- this._register();
- }
-};
-Connection.prototype.close = function () {
- if (this.state.close()) {
- this._register();
- }
-};
-
-Connection.prototype.is_open = function () {
- return this.state.is_open();
-};
-
-Connection.prototype.is_closed = function () {
- return this.state.is_closed();
-};
-
-Connection.prototype.create_session = function () {
- var i = 0;
- while (this.local_channel_map[i]) i++;
- var session = new Session(this, i);
- this.local_channel_map[i] = session;
- return session;
-}
-
-Connection.prototype.on_open = function (frame) {
- if (this.state.remote_opened()) {
- this.remote.open = frame.performative;
- this.open();
- this.dispatch('connection_open', this._context());
- } else {
- throw Error('Open already received');
- }
-};
-
-Connection.prototype.on_close = function (frame) {
- if (this.state.remote_closed()) {
- this.remote.close = frame.performative;
- this.close();
- if (this.remote.close.error) {
- this._handle_error();
- } else {
- this.dispatch('connection_close', this._context());
- }
- if (this.heartbeat_out) clearTimeout(this.heartbeat_out);
- } else {
- throw Error('Close already received');
- }
-};
-
-Connection.prototype._register = function () {
- if (!this.registered) {
- this.registered = true;
- process.nextTick(this._process.bind(this));
- }
-};
-
-Connection.prototype._process = function () {
- this.registered = false;
- do {
- if (this.state.need_open()) {
- this._write_open();
- }
- for (var k in this.local_channel_map) {
- this.local_channel_map[k]._process();
- }
- if (this.state.need_close()) {
- this._write_close();
- }
- } while (!this.state.has_settled());
-};
-
-Connection.prototype._write_frame = function (channel, frame, payload) {
- this.amqp_transport.encode(frames.amqp_frame(channel, frame, payload));
- this.output();
-};
-
-Connection.prototype._write_open = function () {
- this._write_frame(0, this.local.open.described());
-};
-
-Connection.prototype._write_close = function () {
- this._write_frame(0, this.local.close.described());
-};
-
-Connection.prototype.on_begin = function (frame) {
- var session;
- if (frame.performative.remote_channel === null || frame.performative.remote_channel === undefined) {
- //peer initiated
- session = this.create_session();
- session.local.begin.remote_channel = frame.channel;
- } else {
- session = this.local_channel_map[frame.performative.remote_channel];
- if (!session) throw Error('Invalid value for remote channel ' + frame.performative.remote_channel);
- }
- session.on_begin(frame);
- this.remote_channel_map[frame.channel] = session;
-};
-
-Connection.prototype.get_peer_certificate = function() {
- if (this.socket && this.socket.getPeerCertificate) {
- return this.socket.getPeerCertificate();
- } else {
- return undefined;
- }
-};
-
-Connection.prototype._context = function (c) {
- var context = c ? c : {};
- context.connection = this;
- if (this.container) context.container = this.container;
- return context;
-};
-
-function delegate_to_session(name) {
- Connection.prototype['on_' + name] = function (frame) {
- var session = this.remote_channel_map[frame.channel];
- if (!session) {
- throw Error(name + ' received on invalid channel ' + frame.channel);
- }
- session['on_' + name](frame);
- };
-};
-
-delegate_to_session('end');
-delegate_to_session('attach');
-delegate_to_session('detach');
-delegate_to_session('transfer');
-delegate_to_session('disposition');
-delegate_to_session('flow');
-
-module.exports = Connection
-
-}).call(this,require('_process'),require("buffer").Buffer)
-},{"./endpoint.js":2,"./frames.js":3,"./log.js":5,"./sasl.js":8,"./session.js":9,"./transport.js":11,"./types.js":12,"./util.js":13,"_process":24,"buffer":19,"events":23,"net":18,"tls":18}],2:[function(require,module,exports){
-/*
- * Copyright 2015 Red Hat Inc.
- *
- * 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.
- */
-'use strict';
-
-var EndpointState = function () {
- this.init();
-};
-
-EndpointState.prototype.init = function () {
- this.local_open = false;
- this.remote_open = false;
- this.open_requests = 0;
- this.close_requests = 0;
- this.initialised = false;
-};
-
-EndpointState.prototype.open = function () {
- this.initialised = true;
- if (!this.local_open) {
- this.local_open = true;
- this.open_requests++;
- return true;
- } else {
- return false;
- }
-};
-
-EndpointState.prototype.close = function () {
- if (this.local_open) {
- this.local_open = false;
- this.close_requests++;
- return true;
- } else {
- return false;
- }
-};
-
-EndpointState.prototype.disconnected = function () {
- var was_open = this.local_open;
- this.init();
- if (was_open) {
- this.open();
- } else {
- this.close();
- }
-};
-
-EndpointState.prototype.remote_opened = function (frame) {
- if (!this.remote_open) {
- this.remote_open = true;
- return true;
- } else {
- return false;
- }
-};
-
-EndpointState.prototype.remote_closed = function (frame) {
- if (this.remote_open) {
- this.remote_open = false;
- return true;
- } else {
- return false;
- }
-};
-
-EndpointState.prototype.is_open = function () {
- return this.local_open && this.remote_open;
-};
-
-EndpointState.prototype.is_closed = function () {
- return this.initialised && !this.local_open && !this.remote_open;
-};
-
-EndpointState.prototype.has_settled = function () {
- return this.open_requests == 0 && this.close_requests == 0;
-};
-
-EndpointState.prototype.need_open = function () {
- if (this.open_requests > 0) {
- this.open_requests--;
- return true;
- } else {
- return false;
- }
-};
-
-EndpointState.prototype.need_close = function () {
- if (this.close_requests > 0) {
- this.close_requests--;
- return true;
- } else {
- return false;
- }
-};
-
-module.exports = EndpointState
-
-},{}],3:[function(require,module,exports){
-/*
- * Copyright 2015 Red Hat Inc.
- *
- * 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.
- */
-'use strict';
-
-var types = require('./types.js');
-
-var frames = {};
-var by_descriptor = {};
-
-frames.read_header = function(buffer) {
- var offset = 4;
- var header = {};
- var name = buffer.toString('ascii', 0, offset);
- if (name !== 'AMQP') {
- throw Error('Invalid protocol header for AMQP ' + name);
- }
- header.protocol_id = buffer.readUInt8(offset++);
- header.major = buffer.readUInt8(offset++);
- header.minor = buffer.readUInt8(offset++);
- header.revision = buffer.readUInt8(offset++);
- if (header.major !== 1 || header.minor !== 0) {
- throw Error('Unsupported AMQP version: ' + JSON.stringify(header));
- }
- return header;
-};
-frames.write_header = function(buffer, header) {
- var offset = 4;
- buffer.write('AMQP', 0, offset, 'ascii');
- buffer.writeUInt8(header.protocol_id, offset++);
- buffer.writeUInt8(header.major, offset++);
- buffer.writeUInt8(header.minor, offset++);
- buffer.writeUInt8(header.revision, offset++);
- return 8;
-};
-//todo: define enumeration for frame types
-frames.TYPE_AMQP = 0x00;
-frames.TYPE_SASL = 0x01;
-
-frames.read_frame = function(buffer) {
- var reader = new types.Reader(buffer);
- var frame = {};
- frame.size = reader.read_uint(4);
- if (reader.remaining < frame.size) {
- return null;
- }
- var doff = reader.read_uint(1);
- if (doff < 2) {
- throw Error('Invalid data offset, must be at least 2 was ' + doff);
- }
- frame.type = reader.read_uint(1);
- if (frame.type === frames.TYPE_AMQP) {
- frame.channel = reader.read_uint(2);
- } else if (frame.type === frames.TYPE_SASL) {
- reader.skip(2);
- } else {
- throw Error('Unknown frame type ' + frame.type);
- }
- if (doff > 1) {
- //ignore any extended header
- reader.skip(doff * 4 - 8);
- }
- if (reader.remaining()) {
- frame.performative = reader.read();
- var c = by_descriptor[frame.performative.descriptor.value];
- if (c) {
- frame.performative = new c(frame.performative.value);
- }
- if (reader.remaining()) {
- frame.payload = reader.read_bytes(reader.remaining());
- }
- }
- return frame;
-};
-
-frames.write_frame = function(frame) {
- var writer = new types.Writer();
- writer.skip(4);//skip size until we know how much we have written
- writer.write_uint(2, 1);//doff
- writer.write_uint(frame.type, 1);
- if (frame.type === frames.TYPE_AMQP) {
- writer.write_uint(frame.channel, 2);
- } else if (frame.type === frames.TYPE_SASL) {
- writer.write_uint(0, 2);
- } else {
- throw Error('Unknown frame type ' + frame.type);
- }
- if (frame.performative) {
- writer.write(frame.performative);
- if (frame.payload) {
- writer.write_bytes(frame.payload);
- }
- }
- var buffer = writer.toBuffer();
- buffer.writeUInt32BE(buffer.length, 0);//fill in the size
- return buffer;
-};
-
-frames.amqp_frame = function(channel, performative, payload) {
- return {'channel': channel || 0, 'type': frames.TYPE_AMQP, 'performative': performative, 'payload': payload};
-};
-frames.sasl_frame = function(performative) {
- return {'channel': 0, 'type': frames.TYPE_SASL, 'performative': performative};
-};
-
-function define_frame(type, def) {
- var c = types.define_composite(def);
- frames[def.name] = c.create;
- by_descriptor[Number(c.descriptor.numeric).toString(10)] = c;
- by_descriptor[c.descriptor.symbolic] = c;
-};
-
-var open = {name: "open",
- code: 0x10,
- fields: [
- {name:"container_id", type:"string", mandatory:true},
- {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:true},
- {name:"incoming_locales", type:"symbol", multiple:true},
- {name:"offered_capabilities", type:"symbol", multiple:true},
- {name:"desired_capabilities", type:"symbol", multiple:true},
- {name:"properties", type:"symbolic_map"}
- ]
- };
-
-var begin = {name:"begin",
- code:0x11,
- fields:[
- {name:"remote_channel", type:"ushort"},
- {name:"next_outgoing_id", type:"uint", mandatory:true},
- {name:"incoming_window", type:"uint", mandatory:true},
- {name:"outgoing_window", type:"uint", mandatory:true},
- {name:"handle_max", type:"uint", default_value:"4294967295"},
- {name:"offered_capabilities", type:"symbol", multiple:true},
- {name:"desired_capabilities", type:"symbol", multiple:true},
- {name:"properties", type:"symbolic_map"}
- ]
- };
-
-var attach = {name:"attach",
- code:0x12,
- fields:[
- {name:"name", type:"string", mandatory:true},
- {name:"handle", type:"uint", mandatory:true},
- {name:"role", type:"boolean", mandatory:true},
- {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:false},
- {name:"initial_delivery_count", type:"uint"},
- {name:"max_message_size", type:"ulong"},
- {name:"offered_capabilities", type:"symbol", multiple:true},
- {name:"desired_capabilities", type:"symbol", multiple:true},
- {name:"properties", type:"symbolic_map"}
- ]
- };
-
-var flow = {name:"flow",
- code:0x13,
- fields:[
- {name:"next_incoming_id", type:"uint"},
- {name:"incoming_window", type:"uint", mandatory:true},
- {name:"next_outgoing_id", type:"uint", mandatory:true},
- {name:"outgoing_window", type:"uint", mandatory:true},
- {name:"handle", type:"uint"},
- {name:"delivery_count", type:"uint"},
- {name:"link_credit", type:"uint"},
- {name:"available", type:"uint"},
- {name:"drain", type:"boolean", default_value:false},
- {name:"echo", type:"boolean", default_value:false},
- {name:"properties", type:"symbolic_map"}
- ]
- };
-
-var transfer = {name:"transfer",
- code:0x14,
- fields:[
- {name:"handle", type:"uint", mandatory:true},
- {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:false},
- {name:"rcv_settle_mode", type:"ubyte"},
- {name:"state", type:"delivery_state"},
- {name:"resume", type:"boolean", default_value:false},
- {name:"aborted", type:"boolean", default_value:false},
- {name:"batchable", type:"boolean", default_value:false}
- ]
- };
-
-var disposition = {name:"disposition",
- code:0x15,
- fields:[
- {name:"role", type:"boolean", mandatory:true},
- {name:"first", type:"uint", mandatory:true},
- {name:"last", type:"uint"},
- {name:"settled", type:"boolean", default_value:false},
- {name:"state", type:"*"},
- {name:"batchable", type:"boolean", default_value:false}
- ]
- };
-
-var detach = {name: "detach",
- code: 0x16,
- fields: [
- {name:"handle", type:"uint", mandatory:true},
- {name:"closed", type:"boolean", default_value:false},
- {name:"error", type:"error"}
- ]
- };
-
-var end = {name: "end",
- code: 0x17,
- fields: [
- {name:"error", type:"error"}
- ]
- };
-
-var close = {name: "close",
- code: 0x18,
- fields: [
- {name:"error", type:"error"}
- ]
- };
-
-define_frame(frames.TYPE_AMQP, open);
-define_frame(frames.TYPE_AMQP, begin);
-define_frame(frames.TYPE_AMQP, attach);
-define_frame(frames.TYPE_AMQP, flow);
-define_frame(frames.TYPE_AMQP, transfer);
-define_frame(frames.TYPE_AMQP, disposition);
-define_frame(frames.TYPE_AMQP, detach);
-define_frame(frames.TYPE_AMQP, end);
-define_frame(frames.TYPE_AMQP, close);
-
-var sasl_mechanisms = {name:"sasl_mechanisms", code:0x40,
- fields: [
- {name:"sasl_server_mechanisms", type:"symbol", multiple:true, mandatory:true}
- ]};
-
-var sasl_init = {name:"sasl_init", code:0x41,
- fields: [
- {name:"mechanism", type:"symbol", mandatory:true},
- {name:"initial_response", type:"binary"},
- {name:"hostname", type:"string"}
- ]};
-
-var sasl_challenge = {name:"sasl_challenge", code:0x42,
- fields: [
- {name:"challenge", type:"binary", mandatory:true}
- ]};
-
-var sasl_response = {name:"sasl_response", code:0x43,
- fields: [
- {name:"response", type:"binary", mandatory:true}
- ]};
-
-var sasl_outcome = {name:"sasl_outcome", code:0x44,
- fields: [
- {name:"code", type:"ubyte", mandatory:true},
- {name:"additional_data", type:"binary"}
- ]};
-
-define_frame(frames.TYPE_SASL, sasl_mechanisms);
-define_frame(frames.TYPE_SASL, sasl_init);
-define_frame(frames.TYPE_SASL, sasl_challenge);
-define_frame(frames.TYPE_SASL, sasl_response);
-define_frame(frames.TYPE_SASL, sasl_outcome);
-
-module.exports = frames;
-
-},{"./types.js":12}],4:[function(require,module,exports){
-/*
- * Copyright 2015 Red Hat Inc.
- *
- * 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.
- */
-'use strict';
-
-var frames = require('./frames.js');
-var log = require('./log.js');
-var message = require('./message.js');
-var terminus = require('./terminus.js')
-var types = require('./types.js')
-var EndpointState = require('./endpoint.js');
-
-var FlowController = function (window) {
- this.window = window;
-};
-FlowController.prototype.update = function (context) {
- var delta = this.window - context.receiver.credit;
- context.receiver.flow(delta);
-};
-
-function auto_settle(context) {
- context.delivery.settled = true;
-};
-
-function auto_accept(context) {
- context.delivery.update(true, message.accepted().described());
-};
-
-var EventEmitter = require('events').EventEmitter;
-
-var link = Object.create(EventEmitter.prototype);
-link.dispatch = function(name, context) {
- log.events('Link got event: '+ name);
- EventEmitter.prototype.emit.apply(this.observers, arguments);
- if (this.listeners(name).length) {
- EventEmitter.prototype.emit.apply(this, arguments);
- } else {
- this.session.dispatch.apply(this.session, arguments);
- }
-};
-link.set_source = function (fields) {
- this.local.attach.source = terminus.source(fields).described();
-};
-link.set_target = function (fields) {
- this.local.attach.target = terminus.target(fields).described();
-};
-
-link.attach = function () {
- if (this.state.open()) {
- this.connection._register();
- }
-};
-link.open = link.attach;
-
-link.detach = function () {
- this.local.detach.closed = false;
- if (this.state.close()) {
- this.connection._register();
- }
-};
-link.close = function() {
- this.local.detach.closed = true;
- if (this.state.close()) {
- this.connection._register();
- }
-}
-
-link.is_open = function () {
- return this.session.is_open() && this.state.is_open();
-};
-
-link.is_closed = function () {
- return this.session.is_closed() || this.state.is_closed();
-};
-
-link._process = function () {
- do {
- if (this.state.need_open()) {
- this.session.output(this.local.attach.described());
- }
-
- if (this.issue_flow) {
- this.session._write_flow(this);
- this.issue_flow = false;
- }
-
- if (this.state.need_close()) {
- this.session.output(this.local.detach.described());
- }
- } while (!this.state.has_settled());
-};
-
-link.on_attach = function (frame) {
- if (this.state.remote_opened()) {
- if (!this.remote.handle) {
- this.remote.handle = frame.handle;
- }
- frame.performative.source = terminus.unwrap(frame.performative.source);
- frame.performative.target = terminus.unwrap(frame.performative.target);
- this.remote.attach = frame.performative;
- this.open();
- this.dispatch(this.is_receiver() ? 'receiver_open' : 'sender_open', this._context());
- } else {
- throw Error('Attach already received');
- }
-};
-
-link.on_detach = function (frame) {
- if (this.state.remote_closed()) {
- this.remote.detach = frame.performative;
- this.close();
- this.dispatch(this.local.attach.role ? 'receiver_close' : 'sender_close', this._context());
- } else {
- throw Error('Detach already received');
- }
-};
-
-function is_internal(name) {
- switch (name) {
- case 'handle':
- case 'role':
- case 'initial_delivery_count':
- return true;
- default:
- return false;
- }
-}
-
-link.init = function (session, name, local_handle, opts, is_receiver) {
- this.session = session;
- this.connection = session.connection;
- this.name = name;
- this.options = opts === undefined ? {} : opts;
- this.state = new EndpointState();
- this.issue_flow = false;//currently only used by receiver
- this.local = {'handle': local_handle};
- this.local.attach = frames.attach({'handle':local_handle,'name':name, role:is_receiver});
- for (var f in this.local.attach) {
- if (!is_internal(f) && this.options[f] !== undefined) {
- this.local.attach[f] = this.options[f];
- }
- }
- this.local.detach = frames.detach({'handle':local_handle, 'closed':true});
- this.remote = {'handle':undefined};
- this.delivery_count = 0;
- this.credit = 0;
- this.observers = new EventEmitter();
-};
-link.reset = function() {
- this.state.disconnected();
- this.remote = {'handle':undefined};
- this.delivery_count = 0;
- this.credit = 0;
-};
-
-link.has_credit = function () {
- return this.credit > 0;
-};
-link.is_receiver = function () {
- return this.local.attach.role;
-};
-link._context = function (c) {
- var context = c ? c : {};
- if (this.is_receiver()) {
- context.receiver = this;
- } else {
- context.sender = this;
- }
- return this.session._context(context);
-};
-link.get_option = function (name, default_value) {
- if (this.options[name] !== undefined) return this.options[name];
- else return this.session.get_option(name, default_value);
-};
-
-var Sender = function (session, name, local_handle, opts) {
- this.init(session, name, local_handle, opts, false);
- this.local.attach.initial_delivery_count = 0;
- this.tag = 0;
- if (this.get_option('autosettle', true)) {
- this.observers.on('settled', auto_settle);
- }
-};
-Sender.prototype = Object.create(link);
-Sender.prototype.constructor = Sender;
-Sender.prototype.next_tag = function () {
- return new String(this.tag++);
-};
-Sender.prototype.sendable = function (frame) {
- return this.credit && this.session.outgoing.available();
-}
-Sender.prototype.on_flow = function (frame) {
- var flow = frame.performative;
- this.credit = flow.delivery_count + flow.link_credit - this.delivery_count;
- if (this.is_open()) {
- this.dispatch('sender_flow', this._context());
- if (this.sendable()) {
- this.dispatch('sendable', this._context());
- }
- }
-};
-Sender.prototype.on_transfer = function (frame) {
- throw Error('got transfer on sending link');
-};
-Sender.prototype.send = function (msg, tag) {
- return this.session.send(this, tag ? tag : this.next_tag(), message.encode(msg), 0);
-};
-
-
-var Receiver = function (session, name, local_handle, opts) {
- this.init(session, name, local_handle, opts, true);
- this.set_prefetch(this.get_option('prefetch', 100));
- if (this.get_option('autoaccept', true)) {
- this.observers.on('message', auto_accept);
- }
-};
-Receiver.prototype = Object.create(link);
-Receiver.prototype.constructor = Receiver;
-Receiver.prototype.on_flow = function (frame) {
- this.dispatch('receiver_flow', this._context());
-};
-Receiver.prototype.flow = function(credit) {
- if (credit > 0) {
- this.credit += credit;
- this.issue_flow = true;
- this.connection._register();
- }
-};
-
-Receiver.prototype.set_prefetch = function(prefetch) {
- if (prefetch > 0) {
- var flow_controller = new FlowController(prefetch);
- var listener = flow_controller.update.bind(flow_controller);
- this.observers.on('message', listener);
- this.observers.on('receiver_open', listener);
- }
-}
-
-module.exports = {'Sender': Sender, 'Receiver':Receiver};
-
-},{"./endpoint.js":2,"./frames.js":3,"./log.js":5,"./message.js":6,"./terminus.js":10,"./types.js":12,"events":23}],5:[function(require,module,exports){
-/*
- * Copyright 2015 Red Hat Inc.
- *
- * 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.
- */
-'use strict';
-
-var debug = require('debug');
-
-module.exports = {
- 'frames' : debug('rhea:frames'),
- 'raw' : debug('rhea:raw'),
- 'reconnect' : debug('rhea:reconnect'),
- 'events' : debug('rhea:events'),
- 'message' : debug('rhea:message'),
- 'flow' : debug('rhea:flow'),
- 'io' : debug('rhea:io')
-}
-
-},{"debug":15}],6:[function(require,module,exports){
-/*
- * Copyright 2015 Red Hat Inc.
- *
- * 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.
- */
-'use strict';
-
-var log = require('./log.js');
-var types = require('./types.js');
-
-var by_descriptor = {};
-var unwrappers = {};
-var wrappers = [];
-var message = {};
-
-function define_section(descriptor, unwrap, wrap) {
- unwrap.descriptor = descriptor;
- unwrappers[descriptor.symbolic] = unwrap;
- unwrappers[Number(descriptor.numeric).toString(10)] = unwrap;
- if (wrap) {
- wrappers.push(wrap);
- }
-};
-
-function define_composite_section(def) {
- var c = types.define_composite(def);
- message[def.name] = c.create;
- by_descriptor[Number(c.descriptor.numeric).toString(10)] = c;
- by_descriptor[c.descriptor.symbolic] = c;
-
- var unwrap = function (msg, section) {
- msg[def.name] = new c(section.value);
- };
-
- var wrap = function (sections, msg) {
- if (msg[def.name]) {
- if (msg[def.name].described) {
- sections.push(msg[def.name].described());
- } else {
- sections.push(c.create(msg[def.name]).described());
- }
- }
- };
- define_section(c.descriptor, unwrap, wrap);
-};
-
-
-function define_map_section(def) {
- var descriptor = {numeric:def.code};
- descriptor.symbolic = 'amqp:' + def.name.replace(/_/g, '-') + ':map';
- var unwrap = function (msg, section) {
- msg[def.name] = types.unwrap(section);
- };
- var wrap = function (sections, msg) {
- if (msg[def.name]) {
- sections.push(types.described(types.wrap_ulong(descriptor.numeric), types.wrap_map(msg[def.name])));
- }
- };
- define_section(descriptor, unwrap, wrap);
-};
-
-define_composite_section({name:"header",
- code:0x70,
- fields:[
- {name:"durable", type:"boolean", default_value:false},
- {name:"priority", type:"ubyte", default_value:4},
- {name:"ttl", type:"uint"},
- {name:"first_acquirer", type:"boolean", default_value:false},
- {name:"delivery_count", type:"uint", default_value:0}
- ]
- });
-define_map_section({name:"delivery_annotations", code:0x71});
-define_map_section({name:"message_annotations", code:0x72});
-define_composite_section({name:"properties",
- code:0x73,
- 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"}
- ]
- });
-define_map_section({name:"application_properties", code:0x74});
-
-define_section({numeric:0x77, symbolic:'amqp:value:*'},
- function(msg, section) { msg.body = types.unwrap(section); },
- function(sections, msg) { sections.push(types.described(types.wrap_ulong(0x77), types.wrap(msg.body))); });
-
-define_map_section({name:"footer", code:0x78});
-
-message.encode = function(obj) {
- var sections = [];
-
- wrappers.forEach(function (wrapper_fn) { wrapper_fn(sections, obj); });
- var writer = new types.Writer();
- for (var i = 0; i < sections.length; i++) {
- log.message('Encoding section ' + (i+1) + ' of ' + sections.length + ': ' + sections[i]);
- writer.write(sections[i]);
- }
- var data = writer.toBuffer();
- log.message('encoded ' + data.length + ' bytes');
- return data;
-}
-
-message.decode = function(buffer) {
- var msg = {};
- var reader = new types.Reader(buffer);
- while (reader.remaining()) {
- var s = reader.read();
- log.message('decoding section: ' + JSON.stringify(s) + ' of type: ' + JSON.stringify(s.descriptor));
- if (s.descriptor) {
- var unwrap = unwrappers[s.descriptor.value];
- if (unwrap) {
- unwrap(msg, s);
- } else {
- console.log("WARNING: did not recognise message section with descriptor " + s.descriptor);
- }
- } else {
- console.log("WARNING: expected described message section got " + JSON.stringify(s));
- }
- }
- return msg;
-}
-
-var outcomes = {};
-
-function define_outcome(def) {
- var c = types.define_composite(def);
- c.composite_type = def.name;
- message[def.name] = c.create;
- outcomes[Number(c.descriptor.numeric).toString(10)] = c;
- outcomes[c.descriptor.symbolic] = c;
- message['is_' + def.name] = function (o) {
- if (o && o.descriptor) {
- var c = outcomes[o.descriptor.value];
- if (c) {
- return c.descriptor.numeric == def.code;
- }
- }
- return false;
- };
-}
-
-message.unwrap_outcome = function (outcome) {
- if (outcome && outcome.descriptor) {
- var c = outcomes[outcome.descriptor.value];
- if (c) {
- return new c(outcome);
- }
- }
- console.log('unrecognised outcome');
- return outcome;
-};
-
-message.are_outcomes_equivalent = function(a, b) {
- if (a === undefined && b === undefined) return true;
- else if (a === undefined || b === undefined) return false;
- else return a.descriptor.value == b.descriptor.value && JSON.stringify(a) == JSON.stringify(b);
-};
-
-define_outcome({name:"received", code:0x23,
- fields:[
- {name:"section-number", type:"uint", mandatory:true},
- {name:"section-offset", type:"ulong", mandatory:true}
- ]});
-define_outcome({name:"accepted", code:0x24, fields:[]});
-define_outcome({name:"rejected", code:0x25, fields:[{name:"error", type:"error"}]});
-define_outcome({name:"released", code:0x26, fields:[]});
-define_outcome({name:"modified",
- code:0x27,
- fields:[
- {name:"delivery-failed", type:"boolean"},
- {name:"undeliverable-here", type:"boolean"},
- {name:"message-annotations", type:"fields"}
-]});
-
-module.exports = message;
-
-},{"./log.js":5,"./types.js":12}],7:[function(require,module,exports){
-/*
- * Copyright 2015 Red Hat Inc.
- *
- * 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.
- */
-'use strict';
-
-var url = require('url');
-
-var simple_id_generator = {
- counter : 1,
- next : function() {
- return this.counter++;
- }
-};
-
-var Client = function (container, address) {
- var u = url.parse(address);
- //TODO: handle scheme and user/password if present
- this.connection = container.connect({'host':u.hostname, 'port':u.port});
- this.connection.on('message', this._response.bind(this));
- this.connection.on('receiver_open', this._ready.bind(this));
- this.sender = this.connection.attach_sender(u.path.substr(1));
- this.receiver = this.connection.attach_receiver({source:{dynamic:true}});
- this.id_generator = simple_id_generator;
- this.pending = [];//requests yet to be made (waiting for receiver to open)
- this.outstanding = {};//requests sent, for which responses have not yet been received
-};
-
-Client.prototype._request = function (id, name, args, callback) {
- var request = {properties:{}};
- request.properties.subject = name;
- request.body = args;
- request.properties.message_id = id;
- request.properties.reply_to = this.receiver.remote.attach.source.address;
- this.outstanding[id] = callback;
- this.sender.send(request);
-};
-
-Client.prototype._response = function (context) {
- var id = context.message.properties.correlation_id;
- var callback = this.outstanding[id];
- if (callback) {
- if (context.message.properties.subject === 'ok') {
- callback(context.message.body);
- } else {
- callback(undefined, {name: context.message.properties.subject, description: context.message.body});
- }
- } else {
- console.log('no request pending for ' + id + ', ignoring response');
- }
-};
-
-Client.prototype._ready = function (context) {
- this._process_pending();
-};
-
-Client.prototype._process_pending = function () {
- for (var i = 0; i < this.pending.length; i++) {
- var r = this.pending[i];
- this._request(r.id, r.name, r.args, r.callback);
- }
- this.pending = [];
-};
-
-Client.prototype.call = function (name, args, callback) {
- var id = this.id_generator.next();
- if (this.receiver.is_open() && this.pending.length === 0) {
- this._request(id, name, args, callback);
- } else {
- //need to wait for reply-to address
- this.pending.push({'name':name, 'args':args, 'callback':callback, 'id':id});
- }
-};
-
-Client.prototype.close = function () {
- this.receiver.close();
- this.sender.close();
- this.connection.close();
-};
-
-Client.prototype.define = function (name) {
- this[name] = function (args, callback) { this.call(name, args, callback); };
-};
-
-var Cache = function (ttl, purged) {
- this.ttl = ttl;
- this.purged = purged;
- this.entries = {};
- this.timeout = undefined;
-};
-
-Cache.prototype.clear = function () {
- if (this.timeout) clearTimeout(this.timeout);
- this.entries = {};
-}
-
-Cache.prototype.put = function (key, value) {
- this.entries[key] = {'value':value, 'last_accessed': Date.now()};
- if (!this.timeout) this.timeout = setTimeout(this.purge.bind(this), this.ttl);
-};
-
-Cache.prototype.get = function (key) {
- var entry = this.entries[key];
- if (entry) {
- entry.last_accessed = Date.now();
- return entry.value;
- } else {
- return undefined;
- }
-};
-
-Cache.prototype.purge = function() {
- //TODO: this could be optimised if the map is large
- var now = Date.now();
- var expired = [];
- var live = 0;
- for (var k in this.entries) {
- if (now - this.entries[k].last_accessed >= this.ttl) {
- expired.push(k);
- } else {
- live++;
- }
- }
- for (var i = 0; i < expired.length; i++) {
- var entry = this.entries[expired[i]];
- delete this.entries[expired[i]];
- this.purged(entry.value);
- }
- if (live && !this.timeout) {
- this.timeout = setTimeout(this.purge.bind(this), this.ttl);
- }
-};
-
-var LinkCache = function (factory, ttl) {
- this.factory = factory;
- this.cache = new Cache(ttl, function(link) { link.close(); });
-}
-
-LinkCache.prototype.clear = function () {
- this.cache.clear();
-}
-
-LinkCache.prototype.get = function (address) {
- var link = this.cache.get(address);
- if (link === undefined) {
- link = this.factory(address);
- this.cache.put(address, link);
- }
- return link;
-};
-
-var Server = function (container, address, options) {
- this.options = options || {};
- var u = url.parse(address);
- //TODO: handle scheme and user/password if present
- this.connection = container.connect({'host':u.hostname, 'port':u.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(u.path.substr(1));
- this.callbacks = {};
- this._send = undefined;
- this._clear = undefined;
-};
-
-function match(desired, offered) {
- if (offered) {
- if (Array.isArray(offered)) {
- return offered.indexOf(desired) > -1;
- } else {
- return desired === offered;
- }
- } else {
- return false;
- }
-}
-
-Server.prototype._connection_open = function (context) {
- if (match('ANONYMOUS-RELAY', this.connection.remote.open.offered_capabilities)) {
- var relay = this.connection.attach_sender({target:{}});
- this._send = function (msg) { relay.send(msg); };
- } else {
- var cache = new LinkCache(this.connection.attach_sender.bind(this.connection), this.options.cache_ttl || 60000);
- this._send = function (msg) { var s = cache.get(msg.properties.to); if (s) s.send(msg); };
- this._clear = function () { cache.clear(); }
- }
-}
-
-Server.prototype._respond = function (response) {
- var server = this;
- return function (result, error) {
- if (error) {
- response.properties.subject = error.name || 'error';
- response.body = error.description || error;
- } else {
- response.properties.subject = 'ok';
- response.body = result;
- }
- server._send(response);
- };
-}
-
-Server.prototype._request = function (context) {
- var request = context.message;
- var response = {properties:{}};
- response.properties.to = request.properties.reply_to;
- response.properties.correlation_id = request.properties.message_id;
- var callback = this.callbacks[request.properties.subject];
- if (callback) {
- callback(request.body, this._respond(response));
- } else {
- response.properties.subject = 'bad-method';
- response.body = 'Unrecognised method ' + request.properties.subject;
- this._send(response);
- }
-};
-
-Server.prototype.bind_sync = function (f, name) {
- this.callbacks[name || f.name] = function (args, callback) { var result = f(args); callback(result); };
-};
-Server.prototype.bind = function (f, name) {
- this.callbacks[name || f.name] = f;
-};
-
-Server.prototype.close = function () {
- if (this._clear) this._clear();
- this.receiver.close();
- this.connection.close();
-};
-
-module.exports = {
- server : function(container, address, options) { return new Server(container, address, options); },
- client : function(connection, address) { return new Client(connection, address); }
-};
-
-},{"url":29}],8:[function(require,module,exports){
-(function (Buffer){
-/*
- * Copyright 2015 Red Hat Inc.
- *
- * 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.
- */
-'use strict';
-
-var frames = require('./frames.js');
-var log = require('./log.js');
-var Transport = require('./transport.js');
-
-var sasl_codes = {
- "OK":0,
- "AUTH":1,
- "SYS":2,
- "SYS_PERM":3,
- "SYS_TEMP":4,
-};
-
-var SASL_PROTOCOL_ID = 0x03;
-
-function intersection(lista, listb) {
- return lista.filter(function (a) { return listb.indexOf(a) >= 0; });
-}
-function extract(buffer) {
- var results = [];
- var start = 0;
- var i = 0;
- while (i < buffer.length) {
- if (buffer[i] === 0x00) {
- if (i > start) results.push(buffer.toString('utf8', start, i));
- else results.push(null);
- start = ++i;
- } else {
- ++i;
- }
- }
- if (i > start) results.push(buffer.toString('utf8', start, i));
- else results.push(null);
- return results;
-}
-
-var PlainServer = function(callback) {
- this.callback = callback;
- this.outcome = undefined;
- this.username = undefined;
-};
-
-PlainServer.prototype.start = function(response) {
- var fields = extract(response);
- if (fields.length !== 3) {
- this.connection.sasl_failed('Unexpected response in PLAIN, got ' + fields.length + ' fields, expected 3');
- }
- if (this.callback(fields[1], fields[2])) {
- this.outcome = true;
- this.username = fields[1];
- } else {
- this.outcome = false;
- }
-};
-
-var PlainClient = function(username, password) {
- this.username = username;
- this.password = password;
-};
-
-PlainClient.prototype.start = function() {
- var response = new Buffer(1 + this.username.length + 1 + this.password.length);
- response.writeUInt8(0, 0);
- response.write(this.username, 1);
- response.writeUInt8(0, 1 + this.username.length);
- response.write(this.password, 1 + this.username.length + 1);
- return response;
-};
-
-var AnonymousServer = function() {
- this.outcome = undefined;
- this.username = undefined;
-};
-
-AnonymousServer.prototype.start = function(response) {
- this.outcome = true;
- this.username = response ? response.toString('utf8') : 'anonymous';
-};
-
-var AnonymousClient = function(name) {
- this.username = name ? name : 'anonymous';
-};
-
-AnonymousClient.prototype.start = function() {
- var response = new Buffer(1 + this.username.length);
- response.writeUInt8(0, 0);
- response.write(this.username, 1);
- return response;
-};
-
-var ExternalServer = function() {
- this.outcome = undefined;
- this.username = undefined;
-};
-
-ExternalServer.prototype.start = function(response) {
- this.outcome = true;
-};
-
-var ExternalClient = function() {
- this.username = undefined;
-};
-
-ExternalClient.prototype.start = function() {
- return null;
-};
-
-/**
- * The mechanisms argument is a map of mechanism names to factory
- * functions for objects that implement that mechanism.
- */
-var SaslServer = function (connection, mechanisms) {
- this.connection = connection;
- this.transport = new Transport(connection.amqp_transport.identifier, SASL_PROTOCOL_ID, frames.TYPE_SASL, this);
- this.next = connection.amqp_transport;
- this.mechanisms = mechanisms;
- this.mechanism = undefined;
- this.outcome = undefined;
- this.username = undefined;
- var mechlist = Object.getOwnPropertyNames(mechanisms);
- this.transport.encode(frames.sasl_frame(frames.sasl_mechanisms({sasl_server_mechanisms:mechlist}).described()));
-};
-
-SaslServer.prototype.do_step = function (challenge) {
- if (this.mechanism.outcome === undefined) {
- this.transport.encode(frames.sasl_frame(frames.sasl_challenge({'challenge':challenge}).described()));
- } else {
- this.outcome = this.mechanism.outcome ? sasl_codes.OK : sasl_codes.AUTH;
- this.transport.encode(frames.sasl_frame(frames.sasl_outcome({code: this.outcome}).described()));
- if (this.outcome === sasl_codes.OK) {
- this.username = this.mechanism.username;
- this.transport.write_complete = true;
- this.transport.read_complete = true;
- }
- }
-};
-
-SaslServer.prototype.on_sasl_init = function (frame) {
- var f = this.mechanisms[frame.performative.mechanism];
- if (f) {
- this.mechanism = f();
- var challenge = this.mechanism.start(frame.performative.initial_response);
- this.do_step(challenge);
- } else {
- this.outcome = sasl_codes.AUTH;
- this.transport.encode(frames.sasl_frame(frames.sasl_outcome({code: this.outcome}).described()));
- }
-};
-SaslServer.prototype.on_sasl_response = function (frame) {
- this.do_step(this.mechanism.step(frame.performative.response));
-};
-
-SaslServer.prototype.has_writes_pending = function () {
- return this.transport.has_writes_pending() || this.next.has_writes_pending();
-}
-
-SaslServer.prototype.write = function (socket) {
- if (this.transport.write_complete && this.transport.pending.length === 0) {
- return this.next.write(socket);
- } else {
- return this.transport.write(socket);
- }
-};
-
-SaslServer.prototype.read = function (buffer) {
- if (this.transport.read_complete) {
- return this.next.read(buffer);
- } else {
- return this.transport.read(buffer);
- }
-};
-
-var SaslClient = function (connection, mechanisms) {
- this.connection = connection;
- this.transport = new Transport(connection.amqp_transport.identifier, SASL_PROTOCOL_ID, frames.TYPE_SASL, this);
- this.next = connection.amqp_transport;
- this.mechanisms = mechanisms;
- this.mechanism = undefined;
- this.mechanism_name = undefined;
- this.failed = false;
-};
-
-SaslClient.prototype.on_sasl_mechanisms = function (frame) {
- for (var i = 0; this.mechanism === undefined && i < frame.performative.sasl_server_mechanisms.length; i++) {
- var mech = frame.performative.sasl_server_mechanisms[i];
- var f = this.mechanisms[mech];
- if (f) {
- this.mechanism = f();
- this.mechanism_name = mech;
- }
- }
- if (this.mechanism) {
- var response = this.mechanism.start();
- this.transport.encode(frames.sasl_frame(frames.sasl_init({'mechanism':this.mechanism_name,'initial_response':response}).described()));
- } else {
- this.failed = true;
- this.connection.sasl_failed('No suitable mechanism; server supports ' + frame.performative.sasl_server_mechanisms);
- }
-};
-SaslClient.prototype.on_sasl_challenge = function (frame) {
- var response = this.mechanism.step(frame.performative.challenge);
- this.transport.encode(frames.sasl_frame(frames.sasl_response({'response':response}).described()));
-};
-SaslClient.prototype.on_sasl_outcome = function (frame) {
- switch (frame.performative.code) {
- case sasl_codes.OK:
- this.transport.read_complete = true;
- this.transport.write_complete = true;
- break;
- default:
- this.transport.write_complete = true;
- this.connection.sasl_failed("Failed to authenticate: " + frame.performative.code);
- }
-};
-
-SaslClient.prototype.has_writes_pending = function () {
- return this.transport.has_writes_pending() || this.next.has_writes_pending();
-}
-
-SaslClient.prototype.write = function (socket) {
- if (this.transport.write_complete) {
- return this.next.write(socket);
- } else {
- return this.transport.write(socket);
- }
-};
-
-SaslClient.prototype.read = function (buffer) {
- if (this.transport.read_complete) {
- return this.next.read(buffer);
- } else {
- return this.transport.read(buffer);
- }
-};
-
-var default_server_mechanisms = {
- enable_anonymous: function () {
- this['ANONYMOUS'] = function() { return new AnonymousServer(); };
- },
- enable_plain: function (callback) {
- this['PLAIN'] = function() { return new PlainServer(callback); };
- }
-};
-
-var default_client_mechanisms = {
- enable_anonymous: function (name) {
- this['ANONYMOUS'] = function() { return new AnonymousClient(name); };
- },
- enable_plain: function (username, password) {
- this['PLAIN'] = function() { return new PlainClient(username, password); };
- },
- enable_external: function () {
- this['EXTERNAL'] = function() { return new ExternalClient(); };
- }
-};
-
-module.exports = {
- Client : SaslClient,
- Server : SaslServer,
- server_mechanisms : function () {
- return Object.create(default_server_mechanisms);
- },
- client_mechanisms : function () {
- return Object.create(default_client_mechanisms);
- },
- server_add_external: function (mechs) {
- mechs['EXTERNAL'] = function() { return new ExternalServer(); };
- return mechs;
- }
-};
-
-}).call(this,require("buffer").Buffer)
-},{"./frames.js":3,"./log.js":5,"./transport.js":11,"buffer":19}],9:[function(require,module,exports){
-(function (Buffer){
-/*
- * Copyright 2015 Red Hat Inc.
- *
- * 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.
- */
-'use strict';
-
-var frames = require('./frames.js');
-var link = require('./link.js');
-var log = require('./log.js');
-var message = require('./message.js');
-var types = require('./types.js');
-var util = require('./util.js');
-var EndpointState = require('./endpoint.js');
-
-var EventEmitter = require('events').EventEmitter;
-
-var CircularBuffer = function (capacity) {
- this.capacity = capacity;
- this.size = 0;
- this.head = 0;
- this.tail = 0;
- this.entries = [];
-};
-
-CircularBuffer.prototype.available = function () {
- return this.capacity - this.size;
-};
-
-CircularBuffer.prototype.push = function (o) {
- if (this.size < this.capacity) {
- this.entries[this.tail] = o;
- this.tail = (this.tail + 1) % this.capacity;
- this.size++;
- } else {
- throw Error('circular buffer overflow: head=' + this.head + ' tail=' + this.tail + ' size=' + this.size + ' capacity=' + this.capacity);
- }
-};
-
-CircularBuffer.prototype.pop_if = function (f) {
- var count = 0;
- while (this.size && f(this.entries[this.head])) {
- this.entries[this.head] = undefined;
- this.head = (this.head + 1) % this.capacity;
- this.size--;
- count++;
- }
- return count;
-};
-
-CircularBuffer.prototype.by_id = function (id) {
- if (this.size > 0) {
- var gap = id - this.entries[this.head].id;
- if (gap < this.size) {
- return this.entries[(this.head + gap) % this.capacity];
- }
- }
- return undefined;
-};
-
-CircularBuffer.prototype.get_head = function (id) {
- return this.size > 0 ? this.entries[this.head] : undefined;
-};
-
-
-var Outgoing = function () {
- this.deliveries = new CircularBuffer(2048/*TODO= configurable?*/);
- this.updated = [];
- this.next_delivery_id = 0;
- this.next_pending_delivery = 0;
- this.next_transfer_id = 0;
- this.window = types.MAX_UINT;
- this.remote_next_transfer_id = undefined;
- this.remote_window = undefined;
-};
-
-Outgoing.prototype.available = function () {
- return this.deliveries.available();
-};
-
-Outgoing.prototype.send = function (sender, tag, data, format) {
- var d = {'id':this.next_delivery_id++,
- 'tag':tag,
- 'link':sender,
- 'data': data,
- 'format':format ? format : 0,
- 'sent': false,
- 'settled': false,
- 'state': undefined,
- 'remote_settled': false,
- 'remote_state': undefined};
- this.deliveries.push(d);
- return d;
-};
-
-Outgoing.prototype.on_begin = function (fields) {
- this.remote_window = fields.incoming_window;
-};
-
-Outgoing.prototype.on_flow = function (fields) {
- this.remote_next_transfer_id = fields.next_incoming_id;
- this.remote_window = fields.incoming_window;
-};
-
-Outgoing.prototype.on_disposition = function (fields) {
- var last = fields.last ? fields.last : fields.first;
- for (var i = fields.first; i <= last; i++) {
- var d = this.deliveries.by_id(i);
- if (!d) {
- console.log('Could not find delivery for ' + i + ' [' + JSON.stringify(fields) + ']');
- }
- if (d && !d.remote_settled) {
- var updated = false;
- if (fields.settled) {
- d.remote_settled = fields.settled;
- updated = true;
- }
- if (fields.state && fields.state !== d.remote_state) {
- d.remote_state = fields.state;
- updated = true;
- }
- if (updated) {
- this.updated.push(d);
- }
- }
- }
-};
-
-Outgoing.prototype.transfer_window = function() {
- if (this.remote_window) {
- return this.remote_window - (this.next_transfer_id - this.remote_next_transfer_id);
- }
-};
-
-Outgoing.prototype.process = function() {
- // send pending deliveries for which there is credit:
- while (this.next_pending_delivery < this.next_delivery_id) {
- var d = this.deliveries.by_id(this.next_pending_delivery);
- if (d) {
- if (d.link.has_credit()) {
- d.link.delivery_count++;
- //TODO: fragment as appropriate
- d.transfers_required = 1;
- if (this.transfer_window() >= d.transfers_required) {
- this.next_transfer_id += d.transfers_required;
- this.window -= d.transfers_required;
- d.link.session.output(frames.transfer({'handle':d.link.local.handle,'message_format':d.format,'delivery_id':d.id, 'delivery_tag':d.tag}).described(), d.data);
- d.link.credit--;
- this.next_pending_delivery++;
- } else {
- log.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;
- }
- } else {
- log.flow('Link has no credit');
- break;
- }
- } else {
- console.log('ERROR: Next pending delivery not found: ' + this.next_pending_delivery);
- break;
- }
- }
-
- // notify application of any updated deliveries:
- for (var i = 0; i < this.updated.length; i++) {
- var d = this.updated[i];
- if (d.remote_state) {
- d.remote_state = message.unwrap_outcome(d.remote_state);
- if (d.remote_state && d.remote_state.constructor.composite_type) {
- d.link.dispatch(d.remote_state.constructor.composite_type, d.link._context({'delivery':d}));
- }
- }
- if (d.remote_settled) d.link.dispatch('settled', d.link._context({'delivery':d}));
- }
- this.updated = [];
-
- // remove any fully settled deliveries:
- this.deliveries.pop_if(function (d) { return d.settled && d.remote_settled; });
-};
-
-var Incoming = function () {
- this.deliveries = new CircularBuffer(2048/*TODO: configurable?*/);
- this.updated = [];
- this.next_transfer_id = 0;
- this.next_delivery_id = undefined;
- this.window = 2048/*TODO: configurable?*/;
- this.remote_next_transfer_id = undefined;
- this.remote_window = undefined;
-};
-
-Incoming.prototype.update = function (delivery, settled, state) {
- if (delivery) {
- delivery.settled = settled;
- if (state !== undefined) delivery.state = state;
- if (!delivery.remote_settled) {
- this.updated.push(delivery);
- }
- delivery.link.connection._register();
- }
-};
-
-Incoming.prototype.on_transfer = function(frame, receiver) {
- this.next_transfer_id++;
- if (receiver.is_open()) {
- if (this.next_delivery_id === undefined) {
- this.next_delivery_id = frame.performative.delivery_id;
- }
- var current;
- var data;
- var last = this.deliveries.get_head();
- if (last && last.incomplete) {
- if (frame.performative.delivery_id !== undefined && this.next_delivery_id != frame.performative.delivery_id) {
- //TODO: better error handling
- throw Error("frame sequence error: delivery " + this.next_delivery_id + " not complete, got " + frame.performative.delivery_id);
- }
- current = last;
- data = Buffer.concat([current.data, frame.payload], current.data.size() + frame.payload.size());
- } else if (this.next_delivery_id === frame.performative.delivery_id) {
- current = {'id':frame.performative.delivery_id,
- 'tag':frame.performative.delivery_tag,
- 'link':receiver,
- 'settled': false,
- 'state': undefined,
- 'remote_settled': frame.performative.settled,
- 'remote_state': undefined};
- var self = this;
- current.update = function (settled, state) { self.update(current, settled, state); };
- this.deliveries.push(current);
- data = frame.payload;
- } else {
- //TODO: better error handling
- throw Error("frame sequence error: expected " + this.next_delivery_id + ", got " + frame.performative.delivery_id);
- }
- current.incomplete = frame.performative.more;
- if (current.incomplete) {
- current.data = data;
- } else {
- receiver.credit--;
- receiver.delivery_count++;
- this.next_delivery_id++;
- receiver.dispatch('message', receiver._context({'message':message.decode(data), 'delivery':current}));
- }
- }
-};
-
-Incoming.prototype.process = function () {
- if (this.updated.length > 0) {
- var first;
- var last;
- var next_id;
-
- for (var i = 0; i < this.updated.length; i++) {
- var delivery = this.updated[i];
- if (first === undefined) {
- first = delivery;
- last = delivery;
- next_id = delivery.id;
- }
-
- if (!message.are_outcomes_equivalent(last.state, delivery.state) || last.settled !== delivery.settled || next_id !== delivery.id) {
- first.link.session.output(frames.disposition({'role':true,'first':first.id,'last':last.id, 'state':first.state, 'settled':first.settled}).described());
- first = delivery;
- last = delivery;
- next_id = delivery.id;
- } else {
- if (last.id !== delivery.id) {
- last = delivery;
- }
- next_id++;
- }
- }
- if (first !== undefined && last !== undefined) {
- first.link.session.output(frames.disposition({'role':true,'first':first.id,'last':last.id, 'state':first.state, 'settled':first.settled}).described());
- }
-
- this.updated = [];
- }
-
- // remove any fully settled deliveries:
- this.deliveries.pop_if(function (d) { return d.settled; });
-};
-
-Incoming.prototype.on_begin = function (fields) {
- this.remote_window = fields.outgoing_window;
-};
-
-Incoming.prototype.on_flow = function (fields) {
- this.remote_next_transfer_id = fields.next_outgoing_id;
- this.remote_window = fields.outgoing_window;
-};
-
-Incoming.prototype.on_disposition = function (fields) {
- var last = fields.last ? fields.last : fields.first;
- for (var i = fields.first; i <= last; i++) {
- var d = this.deliveries.by_id(i);
- if (!d) {
- console.log('Could not find delivery for ' + i);
- }
- if (d && !d.remote_settled) {
- var updated = false;
- if (fields.settled) {
- d.remote_settled = fields.settled;
- updated = true;
- }
- if (fields.state && fields.state !== d.remote_state) {
- d.remote_state = fields.state;
- updated = true;
- }
- if (updated) {
- console.log(d.link.connection.options.id + ' added delivery to updated list following receipt of disposition for incoming deliveries');
- this.updated.push(d);
- }
- }
- }
-
-};
-
-var Session = function (connection, local_channel) {
- this.connection = connection;
- this.outgoing = new Outgoing();
- this.incoming = new Incoming();
- this.state = new EndpointState();
- this.local = {'channel': local_channel, 'handles':{}};
- this.local.begin = frames.begin({next_outgoing_id:this.outgoing.next_transfer_id,incoming_window:this.incoming.window,outgoing_window:this.outgoing.window});
- this.local.end = frames.end();
- this.remote = {'handles':{}};
- this.links = {}; // map by name
- this.options = {};
-};
-Session.prototype = Object.create(EventEmitter.prototype);
-Session.prototype.constructor = Session;
-
-Session.prototype.reset = function() {
- this.state.disconnected();
- this.outgoing = new Outgoing();
- this.incoming = new Incoming();
- this.remote = {'handles':{}};
- for (var l in this.links) {
- this.links[l].reset();
- }
-};
-
-Session.prototype.dispatch = function(name, context) {
- log.events('Session got event: '+ name);
- if (this.listeners(name).length) {
- EventEmitter.prototype.emit.apply(this, arguments);
- } else {
- this.connection.dispatch.apply(this.connection, arguments);
- }
-};
-Session.prototype.output = function (frame, payload) {
- this.connection._write_frame(this.local.channel, frame, payload);
-};
-
-Session.prototype.create_sender = function (name, opts) {
- return this.create_link(name, link.Sender, opts);
-};
-
-Session.prototype.create_receiver = function (name, opts) {
- return this.create_link(name, link.Receiver, opts);
-};
-
-function attach(factory, args, remote_terminus) {
- var opts = args ? args : {};
- if (typeof args === 'string') {
- opts = {};
- opts[remote_terminus] = args;
- }
- if (!opts.name) opts.name = util.generate_uuid();
- var l = factory(opts.name, opts);
- for (var t in {'source':0, 'target':0}) {
- if (opts[t]) {
- if (typeof opts[t] === 'string') {
- opts[t] = {'address' : opts[t]};
- }
- l['set_' + t](opts[t]);
- }
- }
- l.attach();
- return l;
-}
-
-Session.prototype.get_option = function (name, default_value) {
- if (this.options[name] !== undefined) return this.options[name];
- else return this.connection.get_option(name, default_value);
-};
-
-Session.prototype.attach_sender = function (args) {
- return attach(this.create_sender.bind(this), args, 'target');
-};
-Session.prototype.open_sender = Session.prototype.attach_sender;//alias
-
-Session.prototype.attach_receiver = function (args) {
- return attach(this.create_receiver.bind(this), args, 'source');
-};
-Session.prototype.open_receiver = Session.prototype.attach_receiver;//alias
-
-Session.prototype.create_link = function (name, constructor, opts) {
- var i = 0;
- while (this.local.handles[i]) i++;
- var l = new constructor(this, name, i, opts);
- this.links[name] = l;
- this.local.handles[i] = l;
- return l;
-};
-
-Session.prototype.begin = function () {
- if (this.state.open()) {
- this.connection._register();
- }
-};
-Session.prototype.open = Session.prototype.begin;
-
-Session.prototype.end = function () {
- if (this.state.close()) {
- this.connection._register();
- }
-};
-Session.prototype.close = Session.prototype.end;
-
-Session.prototype.is_open = function () {
- return this.connection.is_open() && this.state.is_open();
-};
-
-Session.prototype.is_closed = function () {
- return this.connection.is_closed() || this.state.is_closed();
-};
-
-Session.prototype._process = function () {
- do {
- if (this.state.need_open()) {
- this.output(this.local.begin.described());
- }
-
- this.outgoing.process();
- this.incoming.process();
- for (var k in this.links) {
- this.links[k]._process();
- }
-
- if (this.state.need_close()) {
- this.output(this.local.end.described());
- }
- } while (!this.state.has_settled());
-};
-
-Session.prototype.send = function (sender, tag, data, format) {
- var d = this.outgoing.send(sender, tag, data, format);
- this.connection._register();
- return d;
-};
-
-Session.prototype._write_flow = function (link) {
- var fields = {'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
- };
- if (link) {
- fields.delivery_count = link.delivery_count;
- fields.handle = link.local.handle;
- fields.link_credit = link.credit;
- }
- this.output(frames.flow(fields).described());
-};
-
-Session.prototype.on_begin = function (frame) {
- if (this.state.remote_opened()) {
- if (!this.remote.channel) {
- this.remote.channel = frame.channel;
- }
- this.remote.begin = frame.performative;
- this.outgoing.on_begin(frame.performative);
- this.incoming.on_begin(frame.performative);
- this.open();
- this.dispatch('session_open', this._context());
- } else {
- throw Error('Begin already received');
- }
-};
-Session.prototype.on_end = function (frame) {
- if (this.state.remote_closed()) {
- this.remote.end = frame.performative;
- this.close();
- this.dispatch('session_close', this._context());
- } else {
- throw Error('End already received');
- }
-};
-
-Session.prototype.on_attach = function (frame) {
- var name = frame.performative.name;
- var link = this.links[name];
- if (!link) {
- // if role is true, peer is receiver, so we are sender
- link = frame.performative.role ? this.create_sender(name) : this.create_receiver(name);
- }
- this.remote.handles[frame.performative.handle] = link;
- link.on_attach(frame);
- link.remote.attach = frame.performative;
-};
-
-Session.prototype.on_disposition = function (frame) {
- if (frame.performative.role) {
- log.events('Received disposition for outgoing transfers');
- this.outgoing.on_disposition(frame.performative);
- } else {
- log.events('Received disposition for incoming transfers');
- this.incoming.on_disposition(frame.performative);
- }
- this.connection._register();
-}
-
-Session.prototype.on_flow = function (frame) {
- this.outgoing.on_flow(frame.performative);
- this.incoming.on_flow(frame.performative);
- if (frame.performative.handle !== undefined) {
- this._get_link(frame).on_flow(frame);
- }
- this.connection._register();
-}
-Session.prototype._context = function (c) {
- var context = c ? c : {};
- context.session = this;
- return this.connection._context(context);
-};
-
-Session.prototype._get_link = function (frame) {
- var handle = frame.performative.handle;
- var link = this.remote.handles[handle];
- if (!link) {
- throw Error('Invalid handle ' + handle);
- }
- return link;
-};
-
-Session.prototype.on_detach = function (frame) {
- this._get_link(frame).on_detach(frame);
- //remove link
- var handle = frame.performative.handle;
- var link = this.remote.handles[handle];
- delete this.remote.handles[handle];
- delete this.local.handles[link.local.handle];
- delete this.links[link.name];
-};
-
-Session.prototype.on_transfer = function (frame) {
- this.incoming.on_transfer(frame, this._get_link(frame));
-};
-
-module.exports = Session;
-
-}).call(this,require("buffer").Buffer)
-},{"./endpoint.js":2,"./frames.js":3,"./link.js":4,"./log.js":5,"./message.js":6,"./types.js":12,"./util.js":13,"buffer":19,"events":23}],10:[function(require,module,exports){
-/*
- * Copyright 2015 Red Hat Inc.
- *
- * 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.
- */
-'use strict';
-
-var types = require('./types.js');
-
-var terminus = {};
-var by_descriptor = {};
-
-function define_terminus(def) {
- var c = types.define_composite(def);
- terminus[def.name] = c.create;
- by_descriptor[Number(c.descriptor.numeric).toString(10)] = c;
- by_descriptor[c.descriptor.symbolic] = c;
-};
-
-terminus.unwrap = function(field) {
- if (field && field.descriptor) {
- var c = by_descriptor[field.descriptor.value];
- if (c) {
- return new c(field.value)
- } else {
- console.log('Unknown terminus: ' + field.descriptor);
- }
- }
- return null;
-};
-
-define_terminus(
- {name:"source",
- code:0x28,
- 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:false},
- {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:true},
- {name:"capabilities", type:"symbol", multiple:true}
- ]
- });
-
-define_terminus(
- {name:"target",
- code:0x29,
- 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:false},
- {name:"dynamic_node_properties", type:"symbolic_map"},
- {name:"capabilities", type:"symbol", multiple:true}
- ]
- });
-
-module.exports = terminus;
-
-},{"./types.js":12}],11:[function(require,module,exports){
-(function (Buffer){
-/*
- * Copyright 2015 Red Hat Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in
<TRUNCATED>
---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@qpid.apache.org
For additional commands, e-mail: commits-help@qpid.apache.org
[17/19] qpid-dispatch git commit: moved standalone to a subdir
Posted by ea...@apache.org.
http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/4940e63d/console/plugin/css/site-base.css
----------------------------------------------------------------------
diff --git a/console/plugin/css/site-base.css b/console/plugin/css/site-base.css
deleted file mode 100644
index 23141ec..0000000
--- a/console/plugin/css/site-base.css
+++ /dev/null
@@ -1,4482 +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.
-*/
-* {
- outline: none;
-}
-a:focus {
- outline: none;
-}
-.navbar .brand {
- font-size: 18px;
-}
-
-.brand > img {
- height: 11px;
- width: auto;
-}
-
-.property-name {
- white-space: nowrap;
-}
-
-small table tbody tr td.property-name {
- font-weight: bold;
- text-align: right;
-}
-
-#log-panel {
- position: fixed;
- top: -5px;
- left: 30px;
- right: 30px;
- bottom: 50%;
- z-index: 10000;
- background: inherit;
- transition: bottom 1s ease-in-out;
-}
-
-#log-panel > div {
- position: relative;
- width: 100%;
- height: 100%;
-}
-
-#log-panel #log-panel-statements {
- margin-left: 0;
- margin-bottom: 0;
- position: absolute;
- top: 0;
- left: 0;
- right: 0;
- bottom: 20px;
- overflow-y: auto;
-}
-
-#log-panel-statements li {
- margin-left: 3px;
- margin-right: 3px;
- transition: background .25s ease-in-out;
-}
-
-#log-panel-statements li pre {
- border-radius: 0;
- font-size: 11px;
-}
-
-#log-panel-statements li:hover {
- background: #111111;
-}
-
-#log-panel-statements li.DEBUG {
- color: dodgerblue;
-}
-
-#log-panel-statements li.INFO {
- color: white;
-}
-
-#log-panel-statements li.WARN {
- color: yellow;
-}
-
-#log-panel-statements li.ERROR {
- color: red;
-}
-
-#log-panel #close {
- text-align: center;
- position: absolute;
- height: 20px;
- bottom: 0;
- left: 0;
- right: 0;
- box-shadow: 0 1px 13px rgba(0, 0, 0, 0.1) inset;
- opacity: 1;
-}
-
-#log-panel #copy {
- position: absolute;
- right: 23px;
- bottom: 26px;
- background: inherit;
- transition: opacity 1s ease-in-out;
- opacity: 0.4;
- cursor: pointer;
-}
-
-#log-panel #copy:hover {
- opacity: 1;
-}
-
-div.log-stack-trace p {
- line-height: 14px;
- margin-bottom: 2px;
-}
-
-#canvas {
- display: inline-block;
-}
-.fill {
- min-height: 100%;
- height: 100%;
-}
-/* sub tab tweaks */
-body div div ul.nav {
- margin-bottom: 5px;
- border-bottom: none;
-}
-
-#tree-ctrl {
- position: relative;
- top: -3px;
-}
-
-#tree-ctrl > li > a {
- display: block;
- padding-left: 5px;
- padding-right: 5px;
- /* padding: 5px; */
-}
-
-ul.dynatree-container {
- background: inherit;
-}
-ul.dynatree-container li {
- background: inherit;
-}
-/* Chart stuff */
-#charts {
- display: block;
- overflow: hidden;
- margin: 5px auto;
- position: relative;
- padding-bottom: 35px;
-}
-.group {
- margin-bottom: 1em;
-}
-.axis {
- font: 10px sans-serif;
- pointer-events: none;
- z-index: 2;
-}
-.axis.text {
- -webkit-transition: fill-opacity 250ms linear;
-}
-.axis path {
- display: none;
-}
-.axis line {
- stroke: #000;
- shape-rendering: crispEdges;
-}
-.axis.top {
- position: relative;
- top: 0;
- padding: 0;
-}
-.axis.bottom {
- position: absolute;
- bottom: 0px;
- padding: 0;
-}
-.horizon {
- overflow: hidden;
- position: relative;
-}
-.horizon:last-child {
- border-bottom: none;
-}
-.horizon + .horizon {
- border-top: none;
-}
-.horizon canvas {
- display: block;
-}
-.horizon .title,
-.horizon .value {
- bottom: 0;
- line-height: 30px;
- margin: 0 6px;
- position: absolute;
- white-space: nowrap;
-}
-.horizon .title {
- left: 0;
-}
-.horizon .value {
- right: 0;
-}
-.line {
- opacity: .2;
- z-index: 2;
-}
-
-td {
- padding-right: 20px;
-}
-
-.expandable {
- padding: 3px;
-}
-
-.expandable > .title {
- cursor: pointer;
-}
-
-i.expandable-indicator {
- font-family: FontAwesome;
- font-weight: normal;
- font-style: normal;
- display: inline-block;
- text-decoration: inherit;
-}
-
-.expandable-body form fieldset legend {
- font-size: inherit;
- margin-bottom: 0px;
-}
-
-.expandable.opened i.expandable-indicator:before {
- font-family: FontAwesome;
- content: "\f078" !important;
-}
-
-.expandable.closed i.expandable-indicator:before {
- font-family: FontAwesome;
- content: "\f054";
-}
-
-.expandable.opened i.expandable-indicator.folder:before {
- font-family: FontAwesome;
- content: "\F07C" !important;
-}
-
-.expandable.closed i.expandable-indicator.folder:before {
- font-family: FontAwesome;
- content: "\F07B";
-}
-
-.expandable.opened .expandable-body {
- display: inline-block;
- margin-bottom: 3px;
-}
-
-.expandable.closed .expandable-body {
- display: none;
-}
-
-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;
-}
-
-.tab {
- display: block;
- margin-left: 1em;
-}
-
-.red {
- color: red !important;
-}
-
-.orange {
- color: orange !important;
-}
-
-.yellow {
- color: yellow !important;
-}
-
-.green {
- color: green !important;
-}
-
-.background-green {
- color: white;
- background-color: #51a351;
-}
-
-.background-light-green {
- color: white;
- background-color: #5ab15a;
-}
-
-.blue {
- color: dodgerblue !important;
-}
-
-.background-blue {
- color: white;
- background-color: #006dcc;
-}
-
-.icon1point5x {
- font-size: 1.5em;
-}
-
-.centered,
-.align-center {
- margin-left: auto !important;
- margin-right: auto !important;
- text-align: center;
-}
-
-.align-right {
- text-align: right;
-}
-
-.align-left {
- text-align: left;
-}
-
-.inline {
- display: inline;
-}
-
-.inline-block,
-.list-row-select,
-.list-row-contents,
-.list-row-contents > .ngCellText {
- display: inline-block;
-}
-
-.list-row {
- height: 30px;
- white-space: nowrap;
-}
-
-.list-row .ngCellText {
- padding: 0;
- vertical-align: middle;
-}
-
-.list-row-select,
-.list-row-contents {
- height: 100%;
- vertical-align: middle;
-}
-
-.list-row-select > input {
- vertical-align: middle;
-}
-
-.no-bottom-margin {
- margin-bottom: 0 !important;
-}
-
-.no-bottom-margin .control-group {
- margin-bottom: 4px;
-}
-
-.bottom-margin {
- margin-bottom: 20px;
-}
-
-li.attr-column {
- width: 1em;
-}
-
-.editor-autoresize .CodeMirror {
- height: auto;
-}
-
-.well.editor-autoresize {
- padding: 0px;
-}
-
-.well.editor-autoresize .CodeMirror {
- margin-bottom: 0px;
- border: none;
-}
-
-.editor-autoresize .CodeMirror .CodeMirror-scroll {
- overflow-y: hidden;
- overflow-x: auto;
-}
-
-.gridster ul#widgets {
- list-style-type: none;
-}
-
-.gridster ul#widgets .gs_w {
- padding: 0px;
- overflow: hidden;
- position: relative;
-}
-
-.gridster ul#widgets .preview-holder {
- transition-property: opacity;
- transition-duration: 500ms;
- padding: 1px;
-}
-
-.widget-area {
- position: relative;
- height: 100%;
- width: 100%;
-}
-
-.widget-title {
- margin: 0;
- padding-left: 5px;
- padding-right: 5px;
- z-index: 6000;
- position: absolute;
- top: 0;
- left: 0;
- right: 0;
-}
-
-.widget-title:hover {
- cursor: move;
-}
-
-.widget-title > .row-fluid > .pull-right > i {
- cursor: pointer;
- opacity: .25;
-}
-
-.widget-title > .row-fluid > .pull-right > i:hover {
- transition: opacity 0.25s ease-in-out;
- -moz-transition: opacity 0.25s ease-in-out;
- -webkit-transition: opacity 0.25s ease-in-out;
- opacity: 1;
-}
-
-.widget-body {
- position: absolute;
- top: 20px;
- bottom: 0;
- left: 0;
- right: 0;
-}
-
-.height-controls > a {
- float: left;
- display: block;
- opacity: .1;
- text-decoration: none;
-}
-
-.width-controls > a {
- float: left;
- display: block;
- opacity: .1;
- text-decoration: none;
-}
-
-.width-controls > a:hover {
- opacity: .9;
- text-decoration: none;
-}
-
-.height-controls > a:hover {
- opacity: .9;
- text-decoration: none;
-}
-
-.width-controls {
- font-size: 32px;
- z-index: 50;
- position: absolute;
- width: 1.5em;
- height: 3em;
- display: block;
- right: 5px;
- top: 43%;
-}
-
-.height-controls {
- font-size: 32px;
- z-index: 50;
- position: absolute;
- display: block;
- width: 3em;
- height: 1.5em;
- left: 41%;
- bottom: 5px;
-}
-
-editable-property {
- position: relative;
-}
-
-.ep.editing {
- position: absolute;
- top: -10px;
- padding: 0;
- z-index: 10000;
- border: 1px solid #cecdcd;
- white-space: nowrap;
-}
-
-/*
-.widget-title > div > div .ep[ng-show=editing] {
- top: -1px;
-}
-
-table .ep.editing {
- top: 12px;
-}
- */
-.ep.editing > form > fieldset > i {
- position: relative;
- top: 2px;
-}
-
-.ep > i {
- cursor: pointer;
- opacity: .25;
- transition: opacity 0.25s ease-in-out;
- -moz-transition: opacity 0.25s ease-in-out;
- -webkit-transition: opacity 0.25s ease-in-out;
-}
-
-.ep > form > fieldset > input {
- border: 0;
-}
-
-.ep > i:hover {
- opacity: 1;
-}
-
-.ep form fieldset i {
- cursor: pointer;
- padding-left: 5px;
-}
-
-.ep form.no-bottom-margin {
- margin: 0;
-}
-
-.ngTotalSelectContainer {
- margin: 0px;
-}
-
-.ngTopPanel {
- background: inherit;
-}
-
-.ngGrid {
- background: inherit;
-}
-
-.ngViewport {
- margin-left: 0px;
- margin-right: 0px;
-}
-
-#widgets li div div div div form fieldset div input {
- display: none;
-}
-#widgets li div div div div div#attributesGrid div div div div.ngHeaderCell {
- border: none;
-}
-#widgets li div div div div div#attributesGrid div div div div.ngCell {
- border: none;
-}
-#widgets li div div div div div#attributesGrid div.ngTopPanel {
- border: none;
-}
-#widgets li div div div div div#attributesGrid div.ngTopPanel div.ngGroupPanel {
- border: none;
-}
-#widgets li div div div div div#attributesGrid div.ngFooterPanel {
- border: none;
- display: none;
-}
-.ngFooterPanel {
- border-top: none;
-}
-.ngRow .ngCell:last-child {
- border-right: none;
-}
-.ngRow:last-child {
- border-bottom: none;
-}
-.ngFooterTotalItems span:first-child {
- margin-right: .5em;
-}
-
-.ACTIVE:before {
- font-family: FontAwesome;
- content: "\f087";
- font-style: normal;
- color: #777777;
-}
-
-.RESOLVED:before {
- font-family: FontAwesome;
- content: "\f0ad";
- font-style: normal;
-}
-
-.STARTING:before {
- font-family: FontAwesome;
- content: "\f021";
- font-style: normal;
-}
-
-.STARTING {
- -moz-animation: spin 2s infinite linear;
- -o-animation: spin 2s infinite linear;
- -webkit-animation: spin 2s infinite linear;
- animation: spin 2s infinite linear;
-}
-
-.STOPPING:before {
- font-family: FontAwesome;
- content: "\f021";
- font-style: normal;
-}
-
-.STOPPING {
- -moz-animation: spin 2s infinite linear;
- -o-animation: spin 2s infinite linear;
- -webkit-animation: spin 2s infinite linear;
- animation: spin 2s infinite linear;
-}
-
-.UNINSTALLED:before {
- font-family: FontAwesome;
- content: "\f014";
- font-style: normal;
-}
-
-.INSTALLED:before {
- font-family: FontAwesome;
- content: "\f06b";
- font-style: normal;
-}
-
-.table-bordered {
- border: none;
- border-radius: 0px;
-}
-
-.table-bordered thead:first-child tr:first-child th:first-child,
-.table-bordered tbody:first-child tr:first-child td:first-child {
- border-radius: 0px;
- border-left: none;
-}
-
-.table-bordered th,
-.table-bordered td {
- border-left: none;
- border-top: none;
-}
-
-.table-bordered th:last-child,
-.table-bordered td:last-child {
- border-left: none;
- border-top: none;
- border-right: none;
-}
-
-table.table thead .sorting {
- background: inherit;
-}
-
-table.table thead .sorting_asc:after {
- background: url('../img/datatable/sort_asc.png') no-repeat top center;
-}
-
-table.table thead .sorting_desc:after {
- background: url('../img/datatable/sort_desc.png') no-repeat top center;
-}
-
-.dataTables_filter label {
- margin-bottom: 0px;
-}
-
-.dataTables_filter label input {
- padding-right: 14px;
- padding-right: 4px \9;
- padding-left: 14px;
- padding-left: 4px \9;
- margin-bottom: 0;
-}
-
-.nav {
- margin-bottom: 10px;
-}
-
-.navbar-fixed-top {
- margin-bottom: 0px;
-}
-
-#main > div > ul.nav,
-ng-include > .nav.nav-tabs {
- margin-bottom: 10px;
- min-width: 120px;
-}
-
-#main > div > ul.nav > li,
-ng-include > .nav.nav-tabs > li {
- margin-top: 3px;
- margin-bottom: 3px;
-}
-
-.navbar .btn-navbar span:after {
- font-family: FontAwesome;
- content: "\f0de";
- margin-left: 7px;
-}
-
-.navbar .btn-navbar.collapsed span:after {
- font-family: FontAwesome;
- content: "\f0dd";
- margin-left: 7px;
-}
-
-#main > div > ul.nav,
-ng-include > .nav.nav-tabs {
- padding-left: 3px;
- padding-right: 3px;
-}
-
-.nav-tabs > li > a,
-.nav-pills > li > a {
- margin-right: 0px;
-}
-
-div#main div ul.nav li a,
-div#main div ul.nav li span {
- padding-bottom: 2px;
- padding-top: 2px;
-}
-
-div#main div ul.nav li a:hover {
- padding-bottom: 2px;
- padding-top: 2px;
-}
-
-#main div div div section .tabbable .nav.nav-tabs {
- margin-top: 0px;
- margin-bottom: 10px;
- min-width: 120px;
-}
-
-#main > div > div > div > .nav.nav-tabs:not(.connected),
-.span12 > .nav.nav-tabs:not(.connected) {
- margin-top: 5px;
-}
-
-.span12 > .nav.nav-tabs:not(.connected),
-.span12 > .nav.nav-tabs > li {
- margin: 3px;
-}
-
-.logbar {
- z-index: 40;
- position: fixed;
- width: 87%;
- top: 70px;
- left: 5%;
- padding-left: 20px;
- padding-right: 20px;
-}
-
-.logbar-container {
- margin-top: 10px;
- margin-bottom: 5px;
-}
-
-.logbar-container .control-group {
- margin-bottom: 5px;
-}
-
-.log-main {
- margin-top: 55px;
-}
-
-.log-filter {
- margin-right: 30px;
-}
-
-.ui-resizeable-handle {
- display: none;
-}
-
-.ui-resizable-se {
- height: 10px;
- width: 10px;
- margin-right: 5px;
- margin-bottom: 5px;
- font-size: 32px;
- z-index: 50;
- position: absolute;
- display: block;
- right: 0px;
- bottom: 0px;
- cursor: se-resize;
-}
-
-.no-log {
- margin-top: 55px;
-}
-
-.control i {
- cursor: pointer;
-}
-
-td.details {
- padding: 0px;
- border: none;
- margin: 0px;
- height: 0px;
-}
-
-.innerDetails {
- padding: 5px;
- white-space: normal;
- display: none;
-}
-
-table.dataTable {
- table-layout: fixed;
-}
-
-table.dataTable tbody tr td {
- overflow: hidden;
- white-space: nowrap;
- text-overflow: ellipsis;
-}
-
-.wiki.logbar-container {
- margin-top: 5px;
- margin-bottom: 5px;
-}
-
-.wiki.logbar-container > .nav.nav-tabs {
- margin-top: 0px;
- margin-bottom: 0px;
-}
-
-.wiki.logbar-container .pull-right {
- margin-top: 1px;
-}
-
-.wiki-fixed {
- margin-top: 45px;
-}
-
-.wiki-fixed .pane {
- top: 120px;
-}
-
-.help-sidebar li {
- padding-left: 2px;
- padding-right: 2px;
-}
-
-.help-sidebar li a {
- padding-left: 3px;
- padding-right: 3px;
-}
-
-.help-sidebar li:first-child {
- margin-top: 0px !important;
- padding-top: 20px;
-}
-
-.help-display p {
- text-align: justify;
-}
-
-.help-display h5 {
- margin-top: 2em;
-}
-
-.help-display h6 {
- margin-top: 2em;
-}
-
-.form-data {
- display: inline-block;
- margin: 5px;
-}
-
-input[type="checkbox"].hawtio-checkbox {
- margin-top: 10px;
-}
-
-.bundle-list {
- width: 100%;
-}
-
-.bundle-item {
- position: relative;
- display: inline-block;
- width: 300px;
- margin-bottom: 1px;
-}
-
-.bundle-item-details table {
- min-height: 0;
-}
-
-.bundle-item-details {
- height: 0;
- display: inline-block;
- z-index: 15;
-}
-
-.bundle-item > a {
- display: block;
- z-index: 5;
-}
-
-.bundle-item > a:hover {
- text-decoration: none;
-}
-
-.bundle-item a span {
- display: block;
- padding: 8px;
- font-weight: normal;
- z-index: 6;
- text-overflow: ellipsis;
- overflow: hidden;
-}
-
-.bundle-item a span.badge {
- margin-left: 7px;
-}
-
-.bundle-item a span.badge::before {
- padding: 0px;
- float: left;
- position: relative;
- top: 4px;
- left: -8px;
- display: block;
- content: ' ';
- height: 6px;
- width: 6px;
- z-index: 10;
-}
-
-.bundle-item a.toggle-action {
- position: absolute;
- display: block;
- width: 16px;
- height: 16px;
- margin: 0;
- padding: 0;
- right: 12px;
- top: 6px;
- opacity: 0.2;
- transition: all 500ms ease-in-out;
- font-size: 18px;
-}
-
-.bundle-item a.toggle-action .icon-power-off {
- color: orange;
-}
-
-.bundle-item a.toggle-action .icon-play-circle {
- color: green;
-}
-
-.bundle-item a.toggle-action:hover {
- opacity: 1;
- text-decoration: none;
-}
-
-.bundle-list {
- margin-bottom: 2em;
-}
-
-div.hawtio-form-tabs div.tab-content {
- padding-top: 15px;
- padding: 10px;
-}
-
-.hawtio-form fieldset legend {
- margin-bottom: 0;
- border-bottom: none;
- font-size: 15px;
-}
-
-.spacer {
- display: inline-block;
- margin-bottom: 10px;
-}
-
-div.hawtio-form-tabs ul.nav-tabs {
- margin-bottom: 0px !important;
-}
-
-div.hawtio-form-tabs ul.nav-tabs li {
- margin-bottom: -1px !important;
-}
-
-div.hawtio-form-tabs ul.nav-tabs li.active:first-child {
- margin-left: 0px;
-}
-
-div.hawtio-form-tabs ul.nav-tabs li.active {
- margin-right: 1px;
- margin-left: 2px;
- box-shadow: 0 -10px 10px -10px rgba(0, 0, 0, 0.1) !important;
-}
-
-div.hawtio-form-tabs ul.nav-tabs li.active a {
- font-weight: bold;
-}
-
-.popover-inner .popover-title {
- overflow: hidden;
- text-overflow: ellipsis;
- white-space: nowrap;
-}
-
-.popover {
- width: auto;
-}
-
-li.stacktrace {
- line-height: 10px;
-}
-
-.control-button {
- width: 14px;
-}
-
-.ngViewport:focus {
- outline: none;
-}
-
-.wikiGridStyle {
- height: 350px;
-}
-
-/** Animations */
-.wave-enter-setup,
-.wave-leave-setup {
- transition: all cubic-bezier(0.25, 0.46, 0.45, 0.94) 0.5s;
-}
-
-.wave-enter-setup {
- position: absolute;
- left: -100%;
-}
-
-.wave-enter-start {
- left: 0;
-}
-
-.wave-leave-setup {
- position: absolute;
- left: 0;
-}
-
-.wave-leave-start {
- left: 100%;
-}
-
-/* slideout directive stuff */
-.slideout {
- position: fixed;
- z-index: 3000;
- width: 75%;
-}
-
-.slideout > .slideout-title {
- min-height: 22px;
- font-size: 20px;
- padding: 15px;
-}
-
-.slideout > .slideout-content {
- position: relative;
- min-height: 93%;
- max-height: 93%;
- overflow: auto;
- -webkit-transform: translateZ(0);
-}
-
-.slideout-title span {
- width: 97%;
- display: inline-block;
- text-align: left;
-}
-
-.slideout.left > .slideout-content {
- left: 0;
- top: 0;
- margin-right: 2px;
- margin-left: 0px;
-}
-
-.slideout.right > .slideout-content {
- left: 2px;
- top: 0;
- margin-left: 2px;
- margin-right: 0px;
-}
-
-.slideout > .slideout-content > .slideout-body {
- margin: 5px;
- height: 100%;
-}
-
-.slideout.right {
- left: 100%;
-}
-
-.slideout.left {
- left: -75%;
-}
-
-.slideout .slideout-title a {
- display: inline-block;
-}
-
-.slideout .slideout-title a:hover {
- text-decoration: none;
-}
-
-.slideout.right .slideout-title a {
- margin-left: 5px;
- float: left;
-}
-
-.out {
- transition: left 1s, right 1s ease-in-out;
-}
-
-.slideout.left .slideout-title a {
- margin-right: 5px;
- float: right;
-}
-
-.slideout.right.out {
- left: 25%;
-}
-
-.slideout.left.out {
- left: 0%;
-}
-
-.column-filter {
- width: 94%;
- margin-bottom: 10px !important;
-}
-
-.color-picker {
- display: inline-block;
- position: relative;
- margin: 0px;
- line-height: 0px;
-}
-
-.color-picker .wrapper {
- display: inline-block;
- padding: 2px;
- line-height: 0;
-}
-
-.selected-color {
- width: 1em;
- height: 1em;
- padding: 4px;
- transition: all cubic-bezier(0.25, 0.46, 0.45, 0.94) 0.5s;
- display: inline-block;
- cursor: pointer;
-}
-
-.color-picker-popout {
- transition: opacity 0.25s ease-in-out;
- position: absolute;
- top: 0px;
- overflow: hidden;
- padding: 0px;
- line-height: 0;
- margin: 0px;
- width: 0px;
- opacity: 0;
-}
-
-.popout-open {
- padding: 1px;
- width: auto;
- opacity: 1;
-}
-
-.color-picker div table tr td div {
- width: 1em;
- height: 1em;
- padding: 3px;
- transition: all cubic-bezier(0.25, 0.46, 0.45, 0.94) 0.5s;
-}
-
-.color-picker div table tr td {
- padding-right: 5px;
-}
-
-.color-picker div table tr td:last-child {
- padding-right: 0px;
-}
-
-.modal-body div form fieldset div.spacer {
- display: inherit;
- margin-bottom: inherit;
-}
-
-.mouse-pointer {
- cursor: pointer;
-}
-
-.clickable {
- cursor: pointer;
- opacity: 0.6;
- transition: opacity .5s;
- text-decoration: none;
-}
-
-.clickable,
-.clickable:before {
- width: 16px;
- height: 16px;
- line-height: 16px;
-}
-
-.clickable.no-fade {
- transition: none;
- opacity: 1;
-}
-
-.clickable:hover {
- opacity: 1;
- text-decoration: none;
-}
-
-.hawtio-pager {
- overflow: auto;
- display: inline-block;
-}
-
-.hawtio-pager label {
- min-height: 100%;
- vertical-align: middle;
- margin-right: 5px;
- display: inline-block;
-}
-
-.fabric-view {
- position: relative;
- min-width: 928px;
-}
-
-.columns {
- position: absolute;
- bottom: 0;
- top: 0;
- left: 0;
- right: 0;
- padding-left: 300px;
- padding-right: 304px;
- padding-bottom: 0px;
- padding-top: 0px;
-}
-
-.column {
- float: left;
- position: relative;
- margin-top: 0px;
- margin-bottom: 0;
- height: 100%;
- overflow-x: hidden;
- overflow-y: auto;
-}
-
-.columns #center {
- width: 100%;
- padding: 0 5px;
- margin-right: 8px;
-}
-
-.columns #left {
- width: 280px;
- padding: 0 5px;
- margin-left: -100%;
- right: 315px;
-}
-
-.columns #right {
- width: 270px;
- padding: 0 5px;
- margin-right: -330px;
-}
-
-.canvas {
- height: 91%;
-}
-
-.container-section {
- height: 90%;
- overflow-x: hidden;
- overflow-y: auto;
-}
-
-.profile-section {
- overflow-x: hidden;
- overflow-y: auto;
-}
-
-.box.ui-draggable-dragging {
- width: 274px;
- transition: none;
-}
-
-.box.selected .box-right i {
- text-shadow: none;
-}
-
-.contained {
- display: inline-block;
- overflow: hidden;
- text-overflow: ellipsis;
- position: relative;
- white-space: nowrap;
-}
-
-h2 > .contained {
- top: 5px;
-}
-
-h4 > .contained {
- top: 4px;
-}
-
-.dropdown-toggle > .contained,
-.breadcrumb-link > .contained {
- top: 2px;
- line-height: 15px;
-}
-
-/* these widths are totally arbitrary */
-.c-narrow {
- max-width: 5em;
-}
-
-.c-medium {
- max-width: 10em;
-}
-
-.c-wide {
- max-width: 15em;
-}
-
-.c-wide2 {
- max-width: 20em;
-}
-
-.c-wide3 {
- max-width: 25em;
- min-width: 10em;
-}
-
-.c-max {
- width: 100%;
-}
-
-.fabric-page-header > .profile-summary-wide {
- margin-left: 10px;
- line-height: 22px;
-}
-
-.profile-selector-name > .contained {
- top: 8px;
-}
-
-.box {
- cursor: pointer;
- height: 50px;
- overflow: hidden;
- padding: 0;
- margin: 0;
- position: relative;
- text-overflow: ellipsis;
- transition: all 0.2s ease 0s;
- white-space: nowrap;
- line-height: 22px;
- vertical-align: middle;
-}
-
-.box > .box-left,
-.box > .box-right,
-.box > .box-middle {
- display: inline-block;
- position: absolute;
- vertical-align: middle;
- top: 0;
- bottom: 0;
- padding-top: 10px;
-}
-
-.box > .box-left {
- left: 11px;
-}
-
-.box > .box-right {
- right: 11px;
-}
-
-.box > .box-middle {
- right: 60px;
-}
-
-.box > .box-left > div,
-.box > .box-right > div,
-.box > .box-middle > div {
-
-}
-
-.box > .box-left > div > div,
-.box > .box-right > div > div,
-.box > .box-middle > div > div {
- vertical-align: middle;
- display: inline-block;
- margin-left: 4px;
- margin-right: 4px;
-}
-
-
-.box > .box-left > div > div .contained,
-.box > .box-left > div > div > span,
-.box > .box-right > div > div .contained,
-.box > .box-middle > div > div .contained {
- vertical-align: middle;
-}
-
-
-.box > .box-left > .profile-select {
- display: inline-block;
- top: 9px;
- max-width: 210px;
- width: 210px;
- overflow: hidden;
- white-space: nowrap;
- text-overflow: ellipsis;
-}
-
-.box input[type='checkbox'] {
- margin-top: 5px;
- display: inline;
-}
-
-.box .active-profile a.invisible {
- visibility: none;
-}
-
-.box .active-profile div {
- display: inline;
-}
-
-.box .active-profile {
- position: absolute;
- display: inline-block;
- top: 10px;
- left: 12px;
- right: 0px;
-}
-
-.box .active-profile [class^='icon-circle'] {
- top: 0;
-}
-
-.box-middle ul.inline li {
- opacity: 0.5;
- transition: opacity 0.5s;
-}
-
-.box-middle ul.inline li:hover{
- opacity: 1;
-}
-
-.section-header {
- padding: 5px 7px;
-}
-
-.selection-controls {
- display: inline-block;
-}
-
-.section-title {
- margin-left: 10px;
- display: inline-block;
-}
-
-.section-controls {
- display: inline-block;
- float: right;
-}
-
-#center .section-header .section-controls {
- position: relative;
- top: 7px;
- left: -2px;
-}
-
-.page-padded .section-header .section-controls {
- position: relative;
- top: 6px;
- left: -3px;
-}
-
-.page-padded .section-header .selection-controls {
- position: relative;
- top: 1px;
-}
-
-.section-controls > a,
-.section-controls > span > span > span > span > span > .hawtio-dropdown {
- margin-left: 12px;
- margin-right: 12px;
- cursor: pointer;
-}
-
-.section-controls > a:hover,
-.section-controls > span:hover {
- text-decoration: none;
-}
-
-.section-controls > a.nav-danger {
- color: IndianRed !important;
-}
-
-.section-controls > a.nav-danger:hover {
- text-shadow: rgba(205, 92, 92, 0.6) 0 0 20px !important;
-}
-
-.page-padded .section-header .section-filter {
- margin-top: 0px;
-}
-
-.section-filter {
- position: relative;
- display: inline-block;
- margin-left: 12px;
-}
-
-.active-profile-filter > .section-filter {
- margin-top: 5px;
-}
-
-#center > .section-header > .section-filter {
- margin-top: 0px;
-}
-
-#right > .section-header > .section-filter {
- margin-left: 8px;
-}
-
-#right > .canvas {
- height: 80%;
-}
-
-.section-filter .icon-remove {
- position: absolute;
- top: 7px;
- right: 9px;
-}
-
-.features-toolbar {
- position: relative;
- margin-bottom: 0.5em;
-}
-
-.version-section > .canvas > div > .box {
- line-height: inherit;
-}
-
-.version-section select {
- width: 100%;
- margin-top: 5px;
- margin-bottom: 5px;
-}
-
-span.remove {
- float: right;
-}
-
-span.deleting {
- text-decoration: line-through;
-}
-
-td.deleting {
- background-color: IndianRed !important;
-}
-
-td.adding {
- background-color: Aquamarine !important;
-}
-
-.no-match-filter {
- display: none;
-}
-
-.file-upload div form fieldset .input-prepend .btn {
- float: left;
-}
-
-@-moz-document url-prefix() {
- /* hack to get the add button to line up correctly in FF */
- .input-prepend .btn {
- padding-top: 5px;
- padding-bottom: 5px;
- }
-}
-
-.input-prepend .progress {
- position: relative;
- left: 1px;
- top: 0px;
- min-height: 30px;
- width: 160px;
-}
-
-.login-wrapper {
- position: absolute;
- left: 0;
- top: 350px;
- padding-top: 2px;
- padding-bottom: 2px;
- padding-left: 0;
- padding-right: 0;
- line-height: 0;
- width: 100%;
-}
-
-.login-wrapper form {
- margin-bottom: 0px;
- padding-top: 67px;
- padding-bottom: 7px;
- padding-right: 40px;
- padding-left: 40px;
-}
-
-.login-wrapper form fieldset {
- width: 413px;
-}
-
-.login-form form fieldset .control-group {
- margin-bottom: 15px;
- margin-left: 5px;
-}
-
-.login-form form fieldset .control-group button[type='submit'] {
- float: right;
-}
-
-.login-logo {
- display: block;
- position: absolute;
- letter-spacing: 5px;
- padding: 10px;
- font-size: 20px;
- left: 233px;
- top: 9px;
-}
-
-.login-logo > img {
- height: 30px;
-}
-
-/** highlight required fields which have no focus */
-input.ng-invalid,
-textarea.ng-invalid,
-select.ng-invalid {
- border-color: #e5e971;
- -webkit-box-shadow: 0 0 6px #eff898;
- -moz-box-shadow: 0 0 6px #eff898;
- box-shadow: 0 0 6px #eff898;
-}
-
-/** Use bigger and darker border on checkboxes as its hard to see since they already have a shadow */
-input[type="checkbox"].ng-invalid {
- -webkit-box-shadow: 0 0 12px #e5e971;
- -moz-box-shadow: 0 0 12px #e5e971;
- box-shadow: 0 0 12px #e5e971;
-}
-
-.container-profile-settings {
- min-width: 360px;
-}
-
-.container-settings {
- min-width: 360px;
-}
-
-.bold {
- font-weight: bold;
-}
-
-.container-settings dd .ep {
- display: inline-block;
- top: -5px;
-}
-
-.deployment-pane h3 {
- margin-top: 0px;
-}
-
-.deployment-pane ul li i {
- display: inline-block;
- white-space: nowrap;
-}
-
-.deployment-pane ul li {
- white-space: nowrap;
- padding: 7px;
-}
-
-.deployment-pane ul li editable-property {
- display: inline-block;
-}
-
-.deployment-pane ul li .ep {
- display: inline-block;
-}
-
-.container-settings dd input[type=radio] {
- display: inline-block;
-}
-
-.fabric-page-header .span4 h1,
-.fabric-page-header .span4 h2 {
- line-height: inherit;
-}
-
-.fabric-page-header h2.inline-block {
- margin-top: 0;
- margin-bottom: 0;
-}
-
-.create-container-body {
- margin-top: 10px;
-}
-
-.log-stack-trace > dd {
- margin-left: 0;
-}
-
-.log-message > dd > div {
- margin-top: 10px;
-}
-
-.log-stack-trace > dd > ul {
- margin-top: 10px;
-}
-
-.log-stack-trace > dd > ul > li {
- line-height: 12px;
-}
-
-.log-stack-trace > dd > ul > li > div.stack-line > a {
- font-weight: bold;
-}
-
-pre.stack-line {
- padding: 0;
- margin: 0;
- line-height: 14px;
-}
-
-div.stack-line {
- white-space: pre-wrap;
- word-break: break-all;
- word-wrap: break-word;
- line-height: 14px;
-}
-
-#container-create-form {
- margin-bottom: 14px;
-}
-
-#container-create-form .control-group {
- margin-bottom: 0px;
-}
-
-h1.ajaxError {
- font-size: 16px;
-}
-
-h2.ajaxError {
- font-size: 14px;
-}
-
-h3.ajaxError,
-h4.ajaxError {
- font-size: 12px;
-}
-
-.directive-example {
- padding: 10px;
- margin: 10px;
-}
-
-div#main div ul.nav li a.nav-primary.active {
- color: rgba(255, 255, 255, 0.75);
-}
-
-div#main div ul.nav li a.nav-primary {
- color: #ffffff;
- text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
- background-color: #006dcc;
- background-image: -moz-linear-gradient(top, #0088cc, #0044cc);
- background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#0088cc), to(#0044cc));
- background-image: -webkit-linear-gradient(top, #0088cc, #0044cc);
- background-image: -o-linear-gradient(top, #0088cc, #0044cc);
- background-image: linear-gradient(to bottom, #0088cc, #0044cc);
- background-repeat: repeat-x;
- filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0088cc', endColorstr='#ff0044cc', GradientType=0);
- border-color: #0044cc #0044cc #002a80;
- border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
- *background-color: #0044cc;
- /* Darken IE7 buttons by default so they stand out more given they won't have borders */
-
- filter: progid:DXImageTransform.Microsoft.gradient(enabled=false);
-}
-
-div#main div ul.nav li a.nav-primary:hover,
-div#main div ul.nav li a.nav-primary:active,
-div#main div ul.nav li a.nav-primary.active,
-div#main div ul.nav li a.nav-primary.disabled,
-div#main div ul.nav li a.nav-primary[disabled] {
- color: #ffffff;
- background-color: #0044cc;
- *background-color: #003bb3;
-}
-
-div#main div ul.nav li a.nav-primary:active,
-div#main div ul.nav li a.nav-primary.active {
- background-color: #003399 \9;
-}
-
-.nav.nav-tabs li a[disabled] {
- cursor: not-allowed;
- opacity: 0.3;
-}
-
-.caret:before {
- font-family: 'FontAwesome';
- border: 0;
- content: "\f078";
- font-size: 11px;
- display: block;
- position: relative;
- top: -9px;
- left: 0;
-}
-
-.dropdown.perspective-selector .caret:before {
- top: -7px;
-}
-
-.caret {
- border: none;
- width: 9px;
-}
-
-div#main div ul.nav li a.nav-primary .caret {
- border-top-color: #ffffff;
- border-bottom-color: #ffffff;
-}
-
-.main-nav-upper .container:before {
- display: none;
-}
-
-.main-nav-upper .container:after {
- display: none;
-}
-
-.main-nav-upper .container {
- width: auto;
- line-height: 23px;
- vertical-align: auto;
-}
-
-.main-nav-upper .icon-desktop:before {
- position:relative;
- top: 1px;
-}
-
-.main-nav-lower .container:before {
- display: none;
-}
-
-.main-nav-lower .container:after {
- display: none;
-}
-
-.main-nav-lower .container {
- width: 100%;
-}
-
-.overflow > .dropdown-toggle:not(.open) + .dropdown-menu {
- border: none;
-}
-
-.main-nav-lower .container ul.nav {
- width: 100%;
-}
-
-.navbar-inner {
- height: auto;
- min-height: 0;
-}
-
-.main-nav-upper {
- height: 28px;
- min-height: 28px;
- font-size: 11px;
-}
-
-.main-nav-upper .brand {
- font-size: 13px;
- margin-left: 0px;
- padding: 0px;
- font-weight: normal;
- margin-left: 20px;
-}
-
-.main-nav-upper .nav li a {
- padding-top: 2px;
- padding-bottom: 5px;
-}
-
-#main-nav {
- max-height: 70px;
-}
-
-#main {
- margin-top: 70px !important;
-}
-
-dd.file-list {
- margin-left: 0;
-}
-
-.file-list-toolbar .nav .caption {
- font-weight: bold;
- padding-top: 5px;
- padding-bottom: 5px;
- padding-left: 0 !important;
-}
-
-.file-icon {
- padding: 0;
- margin: 0;
- display: inline-block;
- width: 16px;
- height: 16px;
- margin-right: 6px;
-}
-
-.file-icon i {
- width: 16px;
- height: 16px;
- font-size: 17px;
- position: relative;
- left: 2px;
- top: 2px;
-}
-
-.file-icon img {
- width: 16px;
- height: 16px;
-}
-
-.page-padded {
- padding-left: 20px;
- padding-right: 20px;
-}
-
-.fabric-page-header .span4 h2 i {
- margin-right: 13px;
-}
-
-.controller-section-widget {
- padding: 3px;
-}
-
-.container-dashboard-controls {
- position: relative;
- z-index: 10;
-}
-
-.container-dashboard-controls .pull-right .btn {
- opacity: 0.5;
- transition: opacity 1s;
-}
-
-.container-dashboard-controls .pull-right .btn:hover {
- opacity: 0.9;
-}
-
-.container-dashboard-status-table {
- position: relative;
- top: -34px;
- display: table;
- max-width: 278px;
- z-index: 9;
-}
-
-.container-status-dashboard {
- text-align: center;
- display: table-cell;
- min-width: 144px;
-}
-
-.container-status-dashboard i {
- position: relative;
- left: 0px;
- font-size: 133px;
-}
-
-.status-icon {
- display: inline-block;
- text-decoration: none;
- color: inherit;
-}
-
-.status-icon:hover {
- text-decoration: none;
-}
-
-.dashboard-service-list {
- display: table-cell;
- min-width: 139px;
- vertical-align: middle;
-}
-
-.container-dashboard-profile-controls {
- width: 100%;
- text-align: center;
- margin-bottom: 5px;
-}
-
-.no-list {
- list-style-type: none;
-}
-
-.profile-selector-item {
- display: table;
-}
-
-.profile-selector-checkbox {
- display: table-cell;
- padding-right: 5px;
-}
-
-.profile-selector-name {
- display: table-cell;
- position: relative;
- width: 100%;
-}
-
-.profile-info {
- position: absolute;
- right: 3px;
-}
-
-.profile-list ul {
- margin-left: 0;
- margin-bottom: 0;
-}
-
-.profile-list ul li .expandable .expandable-body {
- margin-left: 16px;
-}
-
-/** fabric active profiles */
-.active-profile-titles {
- position: relative;
- display: inline-block;
- width: 100%;
- height: 40px;
-}
-
-.active-profile-list .expandable {
- padding: 0;
-}
-
-.active-profile-titles.section-header {
- padding: 0;
-}
-
-.active-profile-titles div:not(.active-profile-filter) {
- display: inline-block;
- font-weight: bold;
- top: 10px;
-}
-
-.active-profile-row {
- position: relative;
- display: inline-block;
- width: 100%;
- line-height: 22px;
- height: 22px;
-}
-
-.active-profile-row div {
- display: inline-block;
-}
-
-.active-profile-list .expandable .expandable-body {
- width: 100%;
-}
-
-.active-profile-list .expandable .expandable-body ul li .box {
- background: inherit;
-}
-
-.active-profile-list .expandable .expandable-body ul li .child-container {
- margin-left: 0;
-}
-
-.active-profile-expander {
- position: absolute;
- left: 0;
-}
-
-.active-profile-requirements {
- position: absolute;
- right: 75px;
-}
-
-.active-profile-requirements-title {
- position: absolute;
- right: 75px;
-}
-
-.active-profile-create {
- position: absolute;
- right: 210px;
-}
-
-.active-profile-count {
- position: absolute;
- right: 0px;
-}
-
-.active-profile-count-title {
- padding: 5px;
- text-align: right;
- font-weight: bold;
-}
-
-.active-profile-titles .section-controls {
- position: absolute;
- top: 10px !important;
- right: 10px;
-}
-
-.active-profile-titles .section-controls a {
- font-weight: normal;
-}
-
-
-.active-profile-name {
- position: absolute;
- left: 35px;
- white-space: nowrap;
- overflow: hidden;
- text-overflow: ellipsis;
- right: 95px;
-}
-
-.active-profile-icon {
- position: absolute;
- top: 1px;
- left: 15px;
- color: green !important;
-}
-
-.active-profile-icon i {
- font-size: 17px;
-}
-
-.active-profile-filter {
- position: absolute;
- left: 0px;
- top: -10px;
-}
-
-.active-profile-main {
- min-width: 754px;
-}
-
-.active-profile-count a .icon-plus {
- position: relative;
- top: 1px;
-}
-
-.active-profile-count a:hover {
- text-decoration: none;
-}
-
-/** fabric brokers page */
-.mq-titles {
- position: relative;
- display: inline-block;
- width: 100%;
- height: 40px;
-}
-
-.mq-titles.section-header {
- padding: 0;
-}
-
-.mq-titles .section-controls {
- position: absolute;
- top: 9px !important;
- right: 0px;
-}
-
-.mq-titles .section-controls a {
- font-weight: normal;
-}
-
-.mq-profile-icon {
- color: green !important;
-}
-
-.mq-profile-list, .mq-broker-list, .mq-container-list {
- margin-left: 15px;
-}
-
-i.mq-master {
- color: orange;
-}
-
-.mq-broker-rectangle, .mq-container-rectangle {
- position: relative;
-
- display: inline-block;
- *display: inline;
- /* IE7 inline-block hack */
-
-
- margin-left: 5px;
- margin-right: 5px;
- margin-bottom: 5px;
- margin-top: 5px;
-
- border-left-width: 10px;
- border-right-width: 10px;
- border-top-width: 10px;
-
- *zoom: 1;
- padding: 4px 12px;
- margin-bottom: 0;
- font-size: 14px;
- line-height: 20px;
- *line-height: 20px;
- text-align: center;
- vertical-align: middle;
- cursor: pointer;
-}
-
-.mq-page {
- position: relative;
-}
-
-.mq-page .hero-unit {
- position: absolute;
- top: 53px;
- left: 10px;
- right: 10px;
-}
-
-.mq-groups {
- position: absolute;
- top: 42px;
- left: 19px;
- right: 10px;
-}
-
-.mq-group-rectangle:first-child {
- margin-top: 10px;
-}
-
-.mq-group-rectangle {
- position: relative;
- margin-left: 0;
- margin-right: 10px;
- margin-bottom: 10px;
- margin-top: 0;
-}
-
-.mq-group-rectangle-label .mq-group-name {
- white-space: nowrap;
- overflow: hidden;
- text-overflow: ellipsis;
- position: absolute;
- top: 61px;
- left: 4px;
- right: 0;
-}
-
-.mq-group-rectangle-label a {
- position: absolute;
- top: 5px;
- right: 5px;
-}
-
-.mq-group-rectangle-label {
- position: relative;
- top: 7px;
- display: inline-block;
- min-width: 150px;
- max-width: 150px;
- min-height: 150px;
-}
-
-.mq-profiles {
- position: absolute;
- min-height: 185px;
- left: 150px;
- right: 0;
- display: inline-block;
- overflow-x: auto;
-}
-
-.mq-profiles .mq-profile-canvas {
- overflow: auto;
-}
-
-.mq-profile-rectangle {
- display: inline-block;
- height: 150px;
- margin: 0;
- margin-top: 5px;
- margin-left: 10px;
- padding-left: 4px;
- padding-right: 4px;
- padding-top: 4px;
-}
-
-.mq-profile-rectangle-label {
- position: relative;
- top: 2px;
-}
-
-.mq-profile-name {
- white-space: nowrap;
- overflow: hidden;
- text-overflow: ellipsis;
- margin-right: 48px;
- max-width: 300px;
- display: block;
-}
-
-.mq-profile-rectangle-label .mq-profile-create-broker {
- position: absolute;
- top: 0;
- right: 0;
-}
-
-.mq-profile-canvas {
- display: inline-block;
-}
-
-.mq-broker-area {
- position: relative;
- top: 11px;
- text-align: center;
- margin-left: auto;
- margin-right: auto;
-}
-
-.mq-container-rectangle {
- margin-top: 2px;
- width: 20px;
-}
-
-.mq-container-row {
- display: block;
- margin-top: 8px;
- margin-left: auto;
- margin-right: auto;
-}
-
-.mq-broker-rectangle {
- height: 88px;
-}
-
-.mq-group-rectangle-label, .mq-profile-rectangle-label, .mq-broker-rectangle-label, .mq-container-rectangle-label {
- white-space:nowrap;
-}
-
-/** dashboard */
-.dashboard-link-row {
- width: 100%;
- position: relative;
-}
-
-a.dashboard-link {
- line-height: 15px;
- font-weight: normal;
-}
-
-a.dashboard-link:hover {
- text-decoration: none;
-}
-
-.dashboard-link {
- position: absolute;
- top: 15px;
- right: 76px;
- z-index: 500;
-}
-
-.container-list-main {
- min-width: 592px;
-}
-
-.widget-title > .row-fluid {
- position: relative;
-}
-
-.widget-title > .row-fluid > .pull-left {
- position: absolute;
- right: 16px;
- left: 0;
-}
-
-.widget-title > .row-fluid > .pull-left > .ep > div {
- overflow: hidden;
- white-space: nowrap;
- text-overflow: ellipsis;
-}
-
-.container-detail-profiles {
- position: relative;
- margin-top: 2px;
-}
-
-.container-detail-profile-buttons {
- position: absolute;
- right: 0;
- z-index: 50;
-}
-
-#dialog-body div .profile-list {
- max-height: 327px;
- overflow-y: auto;
-}
-
-@media (max-width: 979px) {
- .navbar-fixed-top .navbar-inner, .navbar-fixed-bottom .navbar-inner {
- padding: 0;
- }
-
- .navbar-fixed-top, .navbar-fixed-bottom {
- position: fixed;
- }
-
-}
-
-.header-list li {
- vertical-align: top;
- height: 30px;
-}
-
-.header-list li div {
- height: 30px;
-}
-
-.provision-list {
- margin-left: 0px;
-}
-
-.provision-list ul {
- margin-left: 0px;
-}
-
-.provision-list ul li {
- list-style-type: none;
- padding: 7px;
-}
-
-ul.zebra-list {
- margin-left: 0;
-}
-
-.zebra-list li {
- padding: 7px;
-}
-
-ul.zebra-list > li {
- list-style-type: none;
-}
-
-ol.zebra-list {
- counter-reset:li;
- margin-left: 0;
- padding-left: 0;
-}
-
-ol.zebra-list > li {
- position: relative;
- list-style-type: none;
-}
-
-ol.zebra-list > li:before {
- content: counter(li);
- counter-increment: li;
- padding: 7px;
- font-weight: bold;
-}
-
-.pointer {
- cursor: pointer;
-}
-
-.container-profile-settings span.folder-title {
- font-weight: bold;
-}
-li.profile-selector-folder span.folder-title:hover, li.profile div.profile-selector-name>span>span:hover {
- color: #005580;
-}
-.widget-body div div .wiki-fixed {
- margin: 3px;
-}
-
-.loading {
- position: relative;
- top: 140px;
-}
-
-.loading p {
- margin-top: 20px;
- font-weight: bold;
- font-size: 20px;
-}
-
-.add-link {
- position: absolute;
- right: 20px;
- top: 130px;
- width: 22px;
- height: 19px;
- text-align: center;
-}
-
-.log-table > li {
- position: relative;
- list-style-type: none;
- min-height: 32px;
- max-width: 100%;
- padding: 0;
-}
-
-.log-table .table-head div div {
- font-weight: bold;
- text-align: center !important;
- direction: ltr !important;
-}
-
-.log-table .table-head div div:nth-child(4) {
- font-weight: bold;
- left: 247px;
- width: 326px;
- text-align: center !important;
- direction: ltr !important;
-}
-
-.log-table > li > div > div {
- position: absolute;
- display: inline-block;
- white-space: nowrap;
- text-overflow: ellipsis;
- font-size: 12px;
- min-height: 28px;
- overflow-x: hidden;
- padding: 3px;
- padding-top: 6px;
- width: auto;
-}
-
-.log-table {
- margin: 0;
-}
-
-.log-table > .table-row {
- cursor: pointer;
-}
-
-.log-table > .table-row.selected:before {
- z-index: 39;
- position: absolute;
- top: 6px;
- font-family: FontAwesome;
- content: "\f054";
- font-size: 20px;
- color: green;
-}
-
-.log-table > li > div > div:nth-child(1):not(.stack-line) {
- left: 0;
- width: 11px;
- z-index: 5;
-}
-
-.log-table > li > div > div:nth-child(2) {
- left: 18px;
- width: 180px;
- z-index: 5;
-}
-
-.log-table > li > div > div:nth-child(3) {
- left: 190px;
- width: 60px;
- z-index: 5;
- text-align: center;
-}
-
-.log-table > li > div > div:nth-child(4) {
- padding-right: 5px;
- text-align: right;
- direction: rtl;
- z-index: 3;
- left: 0;
- width: 573px;
-}
-
-.log-table > li > div > div:nth-child(5) {
- left: 580px;
- right: 0;
- padding-left: 5px;
-}
-
-.log-table > li > div > div:nth-child(6) {
- position: static;
- margin-top: 43px;
- white-space: normal;
- display: block;
-}
-
-.log-info-panel {
- z-index: 60;
- position: fixed;
- right: 7em;
- top: 150px;
- bottom: 5em;
- padding: 0;
- overflow: hidden;
- min-height: 500px;
- min-width: 800px;
-}
-
-@media(max-width: 1085px) {
- .log-info-panel {
- left: 5px;
- right: 5px;
- max-width: inherit;
- min-width: 500px;
- }
-}
-
-.log-info-panel >.log-info-panel-frame {
- position: relative;
- height: 100%;
- width: 100%;
- margin: 10px;
-}
-
-.log-info-panel > .log-info-panel-frame > .log-info-panel-header {
- position: absolute;
- top: 0;
- height: 80px;
- left: 5px;
- right: 50px;
- white-space: nowrap;
-}
-
-.log-info-panel-header > span {
- margin-left: 7px;
- position: relative;
- top: 2px;
- overflow: hidden;
-}
-
-.log-info-panel-frame > .log-info-panel-body {
- position: absolute;
- overflow: auto;
- left: 5px;
- right: 27px;
- top: 80px;
- bottom: 15px;
- padding-top: 10px;
- padding-left: 5px;
- padding-right: 5px;
-}
-
-.log-info-panel-body > .row-fluid {
- margin-bottom: 10px;
-}
-
-.log-info-panel > .log-info-panel-frame > .log-info-panel-body > .row-fluid > span {
- margin-right: 7px;
- white-space: nowrap;
-}
-
-.log-table-dashboard {
- position: absolute;
- bottom: 0;
- left: 0;
- right: 0;
-}
-
-.ex-node-container {
- position: relative;
- width: 100%;
- height: 696px;
-}
-
-.ex-node {
- position: absolute;
- width: 150px;
- height: 90px;
- text-align: center;
- padding-top: 60px;
-}
-
-.dozer-mapping-node {
- display: block;
- margin-top: 10px;
- margin-bottom: 10px;
- padding: 20px;
-}
-
-.dozer-mappings li {
- list-style-type: none;
-}
-
-.dozer-mappings ul {
- margin-left: 50px;
-}
-
-.dozer-mappings span {
- width: 500px;
-}
-
-.wiki-file-list-up:hover {
- text-decoration: none;
-
-}
-
-.fabric-page-header.features {
- margin-top: 10px;
-}
-
-.fabric-page-header > * {
- line-height: 38px;
-}
-
-.profile-selector-name a:hover {
- text-decoration: none;
-}
-
-.file-name:hover {
- text-decoration: none;
-}
-
-i.expandable-indicator.folder {
- font-size: 17px;
-}
-
-.switches li {
- width: 215px;
-}
-
-.switch-light.switch-ios {
- width: 100px;
-}
-
-.switch-container {
- position: static;
- padding-top: 5px;
- width: 215px;
- height: 45px;
-}
-
-[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;
-}
-
-.main-nav-lower .container ul .dropdown.overflow {
- margin-right: 25px;
-}
-
-.dropdown-menu.right {
- left: auto;
- right: 0;
-}
-
-.dropdown-menu.right:before {
- left:auto !important;
- right: 9px;
-}
-
-.dropdown-menu.right:after {
- left:auto !important;
- right: 10px;
-}
-
-@media(max-width: 1134px) {
- .profile-details > [class^="span"] {
- width: 100%;
- float: inherit;
- display: block;
- margin-left: 2px;
- margin-right: 2px;
- }
-}
-
-/* Start 800x600 Optimzations */
-@media(max-width: 849px) {
-
- .page-padded {
- padding-left: 5px;
- padding-right: 5px;
- }
-
- .wiki-fixed {
- margin-left: 0 !important;
- margin-right: 0 !important;
- }
-
- .wiki-fixed .row-fluid .span9 {
- margin-left: 9px;
- }
-
- .container-details > [class*=" offset"] {
- display: none;
- }
-
- .container-details > .span4.offset1 {
- width: 100%;
- float: inherit;
- display: block;
- margin-left: 2px;
- margin-right: 2px;
- }
-
- .container-details > .span5.offset1 {
- width: 100%;
- float: inherit;
- display: block;
- margin-left: 2px;
- margin-right: 2px;
- }
-
- .create-container-body > [class^="span"] {
- width: 100%;
- float: inherit;
- display: block;
- margin-left: 2px;
- margin-right: 2px;
- }
-
- .create-container-body > [class^="span"]:first-child {
- margin-bottom: 15px;
- }
-
- .features-toolbar .pull-left {
- margin-bottom: 10px;
- }
-
- .edit-feature-lists > [class^="span"] {
- width: 49%;
- float: inherit;
- display: inline-block;
- margin-left: 0;
- margin-right: 0;
- }
-
-}
-/* End 800x600 optimizations */
-
-/*
- * jquery.tocify.css 1.8.0
- * Author: @gregfranko
- */
-/* The Table of Contents container element */
-.tocify {
- /* top works for the wiki, may need customization
- elsewhere */
- top: 120px;
- width: 232px;
- padding-left: 1em;
- padding-right: 1em;
- overflow-y: auto;
- overflow-x: hidden;
- text-overflow: ellipsis;
- white-space: nowrap;
- position: fixed;
- bottom: 5px;
- z-index: 20;
-}
-
-.tocify h2,
-.tocify h3 {
- white-space: normal;
-}
-
-.toc-container {
- position: relative;
- width: 100%;
-}
-
-.toc-content {
- position: absolute;
- left: 290px;
- right: 0;
-}
-
-.tocify ul {
- margin-left: 0px;
-}
-
-.tocify li {
- list-style-type: none;
- display: block;
-}
-
-.tocify li a {
- display: block;
- padding: 3px;
- transition: background,border .25s ease-in-out;
-}
-
-.tocify li a:hover {
- text-decoration: none;
-}
-
-.tocify li a.active {
- font-weight: bolder;
-}
-
-/* Makes the font smaller for all subheader elements. */
-.tocify-subheader li {
- font-size: 12px;
-}
-
-/* Further indents second level subheader elements. */
-.tocify-subheader .tocify-subheader {
- text-indent: 30px;
-}
-
-/* Further indents third level subheader elements. You can continue this pattern if you have more nested elements. */
-.tocify-subheader .tocify-subheader .tocify-subheader {
- text-indent: 40px;
-}
-
-@media(max-width: 700px) {
- .tocify {
- position: static;
- width: auto;
- margin-bottom: 1em;
- }
-
- .toc-content {
- position: static;
- left: auto;
- }
-}
-
-fs-donut svg g text.value {
- font-size: 40px;
-}
-
-fs-donut svg g text.units {
- font-size: 20px;
-}
-
-.health-displays {
- width: 100%;
-}
-
-.panel {
- position: fixed;
-}
-
-.panel.bottom {
- bottom: 0;
-}
-
-.deploy {
- right: 0;
-}
-
-.profile-list-item:after {
- content: ", ";
-}
-
-.profile-list-item:last-child:after {
- content: " ";
-}
-
-.health-displays .health-display,
-.column-box,
-.column-box-variable,
-.column-box-square,
-.column-box-half-screen {
- position: relative;
- display: inline-block;
- width: 300px;
- height: 300px;
- margin-left: 0;
- margin-right: 0;
- margin-bottom: 10px;
- overflow: hidden;
- vertical-align: top;
-}
-
-.column-box {
- height: auto;
- min-height: 175px;
- width: 500px;
-}
-
-.wiki-icon-view {
- min-height: 200px;
-}
-
-.wiki-icon-view .column-box {
- min-height: 0;
- margin-bottom: 25px;
-}
-
-.column-box-half-screen {
- width: 50%;
- min-width: auto;
- height: auto;
-}
-
-.column-box-square {
- height: 32px;
- width: 32px;
- line-height: 28px;
- vertical-align: middle;
- text-align: center;
-}
-
-.column-box-variable {
- height: auto;
- min-height: 175px;
- width: auto;
- min-width: 175px;
- max-width: 500px;
-}
-
-.column-box-variable > h3 {
- margin-bottom: 0;
-}
-
-.column-box .file-icon > * {
- width: 100%;
- height: auto;
-}
-
-.location-box {
- margin: 12px;
-}
-
-.column-box-square > i {
- font-size: 24px;
- height: 24px;
- vertical-align: middle;
-}
-
-.container-groups .column-box {
- height: 125px;
- width: auto;
-}
-
-.container-header-version,
-.container-header-version + hr {
- margin-bottom: 0;
-}
-
-.container-header-version + hr {
- margin-top: 0;
-}
-
-.container-groups .container-group-header {
- border-bottom: none;
-}
-
-.column-row {
- float: left;
-}
-
-.column-box-selected .column-box-header {
- font-size: 150%;
- font-weight: bold;
-}
-
-.column-box-icons > .span1 {
- text-align: center;
- vertical-align: middle;
- width: 32px;
-}
-
-.column-box-icons i,
-.column-box-icons img {
- font-size: 32px;
- width: 32px;
-}
-
-.ok-container > i {
- font-size: 32px;
- color: #a4a4a4;
-}
-
-.column-box > div {
- position: relative;
- height: 100%;
- margin: 10px;
-}
-
-.column-box h3 {
- text-overflow: ellipsis;
- line-height: normal;
- margin-bottom: 0;
-}
-
-.bottom-anchored {
- position: absolute;
- bottom: 0;
- margin-top: -3em;
-}
-
-.label-list > li > .badge {
- margin-top: 3px;
- margin-bottom: 3px;
-}
-
-.label-list > .inline-block > .badge {
- margin-left: 3px;
- margin-right: 3px;
-}
-
-.health-details {
- top: 0;
- bottom: 0;
- z-index: 40;
-}
-
-.health-status {
- padding: 0;
- position: absolute;
- bottom: 0;
- overflow: hidden;
- left: 0;
- right: 0;
- z-index: 20;
-}
-
-.health-message-wrap {
- margin: 0;
- padding: 0;
- width: 100%;
- height: 100%;
-}
-
-.health-message {
- display: block;
- margin: 10px;
-}
-
-.health-details-toggle {
- position: absolute;
- display: inline-block;
- width: 16px;
- height: 16px;
- right: 2px;
- top: 0px;
-}
-
-.health-details-wrap {
- width: 300px;
- height: 300px;
- overflow-y: auto;
- overflow-x: hidden;
-}
-
-.health-details-wrap a {
- color: #d4d4d4;
-}
-
-.health-details-wrap dl {
- margin-top: 5px;
- margin-bottom: 2px;
- margin-left: 0;
-}
-
-.health-details-wrap table {
- max-width: 300px;
-}
-
-.health-details-wrap table tr td {
- vertical-align: middle;
-}
-
-.health-details-wrap table tr td:first-child {
- font-weight: bold;
- text-align: right;
- padding-right: 5px;
-}
-
-.health-details-wrap table tr td:last-child {
- padding-left: 5px;
- overflow-x: hidden;
- text-overflow: ellipsis;
-}
-
-.health-display-title {
- padding-top: 18px;
- font-size: 30px;
- width: 100%;
- height: 40px;
- margin-top: 10px;
- margin-bottom: 10px;
- font-weight: bold;
- text-align: center;
-}
-
-.health-display-title.ok {
- background-color: lightgreen;
-}
-
-.health-display-title.warning {
- background-color: darkorange;
-}
-
-.health-displays .health-display .health-chart {
- width: 300px;
- height: 300px;
-}
-
-.create-column {
- vertical-align: top;
- display: inline-block;
- width: 445px;
- margin-bottom: 10px;
-}
-
-#create-form {
- max-width: 422px;
-}
-
-/* hack to work around strange tabset behavior */
-tabset > .tabbable > ul {
- display: none;
-}
-/* end hack */
-
-tabset > .tabbable > .tab-content > .nav.nav-tabs > li {
- cursor: pointer;
-}
-
-tabset > .tabbable > .tab-content > .nav.nav-tabs > li.active {
- cursor: pointer;
-}
-
-tabset > .tabbable > .tab-content > .nav.nav-tabs > li.disabled {
- opacity: 0.3;
-}
-
-.toast.toast-warning * {
- color: black;
-}
-
-.hawtio-toc .panel-title {
- padding: 0;
- margin-top: 20px;
- margin-bottom: 20px;
-}
-
-.hawtio-toc .panel-title a {
- display: block;
- text-align: center;
- padding: 10px;
-}
-
-._jsPlumb_endpoint {
- z-index: 25;
-}
-
-.panes {
- position: relative;
- display: block;
- min-height: 100%;
-}
-
-.panes > .left-pane {
- position: absolute;
- left: 0;
- right: 285px;
- height: 100%;
-}
-
-.panes > .right-pane {
- position: absolute;
- right: 0;
- width: 275px;
- height: 100%;
-}
-
-.camel-viewport {
- overflow: auto;
- height: 100%;
-}
-
-.camel-canvas-endpoint svg circle {
- fill: #346789;
-}
-
-.camel-props {
- position: relative;
- height: 100%;
-}
-
-.camel-props > .button-bar {
- left: 0;
- right: 0;
- display: block;
- position: absolute;
-}
-
-.button-bar > .centered > form {
- margin-bottom: 10px;
-}
-
-.camel-props > .prop-viewport {
- overflow-y: auto;
- overflow-x: visible;
- position: absolute;
- bottom: 0;
- top: 80px;
- width: 100%;
-}
-
-.camel-props form > fieldset > legend {
- font-size: medium;
- font-weight: bold;
- margin: 0;
- line-height: 12px;
- padding: 3px;
-}
-
-.endpoint-control > label {
- font-size: medium;
- font-weight: bold;
- margin: 0;
- line-height: 12px;
- padding: 3px;
-}
-
-.endpoint-props > p {
- font-size: medium;
- font-weight: bold;
- margin: 0;
- margin-bottom: 25px;
- line-height: 12px;
- padding: 3px;
-}
-
-.endpoint-control > .controls {
- margin-top: 15px;
-}
-
-.camel-props form fieldset .control-label {
- float: none;
- width: auto;
- text-align: left;
-}
-
-.camel-props form fieldset .controls {
- margin-left: auto;
-}
-
-.camel-props form fieldset .controls .input-xxlarge {
- width: auto;
- margin-left: auto;
- margin-right: auto;
-}
-
-.camel-props form fieldset div[hawtio-form-array] > div > div > div > .controls.pull-right {
- float: none;
-}
-
-.welcome {
- margin-left: 5em;
- margin-right: 5em;
-}
-
-input.ng-invalid-pattern {
- border-color: #e9322d;
- -webkit-box-shadow: 0 0 6px #f8b9b7;
- -moz-box-shadow: 0 0 6px #f8b9b7;
- box-shadow: 0 0 6px #f8b9b7;
-}
-
-input.ng-invalid-pattern:focus {
- border-color: #e9322d;
- -webkit-box-shadow: 0 0 6px #f8b9b7;
- -moz-box-shadow: 0 0 6px #f8b9b7;
- box-shadow: 0 0 6px #f8b9b7;
-}
-
-.threads.logbar > .logbar-container {
- margin-top: 2px;
- margin-bottom: 5px;
-}
-
-.state-panel > ul > li:not(:first-child) > span {
- margin-left: 15px;
-}
-
-.state-panel > ul > li.active {
- font-weight: bold;
-}
-
-.runnable {
- color: green;
-}
-
-.timed-waiting {
- color: orange;
-}
-
-.waiting,
-.darkgray {
- color: darkgray;
-}
-
-.blocked {
- color: red;
-}
-
-strong.new,
-.lightgreen {
- color: lightgreen;
-}
-
-.terminated,
-.darkred {
- color: darkred;
-}
-
-.thread-state-indicator {
- width: 100%;
- height: 100%;
- padding-top: 5px;
-}
-
-.monitor-indicator {
- font-size: 10px;
- padding: 4px;
- margin: 5px;
-}
-
-.monitor-indicator.button {
- cursor: pointer;
-}
-
-.monitor-indicator.true {
- background: #1cd11d;
- box-shadow: inset 0px 1px 0px 0px rgba(250, 250, 250, 0.5), 0px 0px 4px 1px rgba(34, 203, 1, 0.49);
-}
-
-.monitor-indicator.false {
- background: #737373;
- box-shadow: inset 0px 1px 0px 0px rgba(250, 250, 250, 0.5);
-}
-
-.table-header {
- color: black;
- position: relative;
-}
-
-.table-header > .indicator:after {
- font-family: 'FontAwesome';
- position: absolute;
- right: 5px;
-}
-
-.table-header.asc > .indicator:after {
- content: "\f077";
-}
-
-.table-header.desc > .indicator:after {
- content: "\f078";
-}
-
-.camel-tree > ul.nav {
- margin-bottom: 3px !important;
-}
-
-.camel-tree > .section-filter {
- margin: 0 0 8px;
- display: block;
-}
-
-.table > thead > tr > th {
- white-space: nowrap;
- overflow: hidden;
- text-overflow: ellipsis;
-}
-
-th > .indicator:before {
- display: inline-block;
- content: "\00a0";
- margin-left: 12px;
-}
-
-.simple-table-checkbox,
-.simple-table-checkbox > input {
- vertical-align: middle;
- margin: 0;
- width: 16px;
- line-height: 16px;
- max-width: 16px;
-}
-
-
-.table td,
-.table th {
- vertical-align: middle;
-}
-
-.ngCellText .icon-replication-controller {
- width: 32px;
-}
-
-.repository-browser-toolbar > .btn {
- margin-bottom: 10px;
-}
-
-.bundle-list-toolbar {
- vertical-align: top;
-}
-
-.bundle-list-toolbar > .pull-left > *,
-.bundle-list-toolbar > .pull-right > * {
- display: inline-block;
-}
-
-.bundle-list-toolbar > div > input,
-.bundle-list-toolbar > div > div > input {
- margin-bottom: 10px;
-}
-
-.bundle-list-toolbar > div > label,
-.bundle-list-toolbar > div > strong {
- position: relative;
- top: -3px;
-}
-
-.bundle-list-toolbar > div > .input-append {
- position: relative;
- left: 3px;
- top: -9px;
-}
-
-.connect-column {
- display: inline-block;
- vertical-align: top;
- width: 550px;
-}
-
-.icon-spacer:before {
- content: '\00a0';
- width: 11px;
-}
-
-.dropdown-menu {
- padding-top: 0;
- padding-bottom: 0;
- margin-top: 0;
- top: 100%;
- left: 0;
- right: 0;
- border-radius: 0;
-}
-
-.main-nav-upper .dropdown-menu {
- border-top: none;
- margin-top: -1;
- border-radius: 0;
-}
-
-.main-nav-lower .dropdown-menu {
- border-top: none;
-}
-
-.dropdown-menu > li > a {
- cursor: pointer;
- padding-left: 15px;
- padding-right: 15px;
-}
-
-.dropdown.perspective-selector > .dropdown-menu {
- min-width: 160px;
- overflow: hidden;
- text-overflow: ellipsis;
-}
-
-.dropdown.perspective-selector .dropdown-menu > div {
- display: block;
-}
-
-.dropdown.perspective-selector .dropdown-menu > div > p,
-.hawtio-dropdown p {
- font-size: smaller;
- padding-left: 3px;
- padding-right: 3px;
- margin-bottom: 0;
-}
-
-.nav .hawtio-dropdown {
- margin-top: 2px;
-}
-
-.dropdown.perspective-selector .dropdown-menu > div > ul {
- margin-top: 0;
-}
-
-.dropdown.perspective-selector .dropdown-menu > div > ul > li.clear-recent > a {
- padding: 3px 5px;
-}
-
-.dropdown-menu > li:hover > a {
- text-shadow:0px 0px 1px white;
-}
-
-.dropdown-menu:before {
- display: none !important;
-}
-
-.dropdown-menu:after {
- display: none !important;
-}
-
-.nav.nav-tabs li .hawtio-dropdown .dropdown-menu {
- margin-top: 4px;
- border-top: none;
-}
-
-span.hawtio-dropdown {
- position: relative;
- display: block;
- cursor: pointer;
-}
-
-span.hawtio-dropdown .dropdown-menu {
- width: auto;
-}
-
-.btn .hawtio-dropdown > .caret {
- width: 7px;
-}
-
-.btn .hawtio-dropdown > .dropdown-menu {
- left: -10px;
- margin-top: 5px;
- text-align: left;
-}
-
-.submenu-caret {
- display: inline-block;
- width: 0;
- height: 0;
-}
-
-.submenu-caret:before {
- font-family: 'FontAwesome';
- border: 0;
- content: "\f054";
- font-size: 11px;
- display: block;
-}
-
-.hawtio-dropdown > ul > li {
- padding: 3px;
- padding-left: 5px;
-}
-
-.hawtio-dropdown > ul > li > .menu-item {
- position: relative;
- display: block;
-}
-
-.hawtio-dropdown > .submenu-caret:before,
-.hawtio-dropdown > ul > li > .menu-item > .submenu-caret:before {
- position: absolute;
- top: 0;
- right: -2px;
-}
-
-.dropdown-menu .sub-menu {
- position: absolute;
- left: 195px;
- top: -8px;
-}
-
-.hawtio-breadcrumb > li {
- display: inline-block;
-}
-
-.dropdown-menu .dropdown .caret {
- display: none;
-}
-
-.hawtio-breadcrumb .caret {
- border: 0;
- width: 17px;
- margin-right: 2px;
- margin-left: 0;
-}
-
-.hawtio-breadcrumb .caret:before {
- font-family: 'FontAwesome';
- content: "\F105";
- font-size: 40px;
- top: -9px;
-}
-/*
-.modal {
- z-index: 5000;
- width: 660px;
- margin: -250px 0 0 -320px;
-}
-.modal-backdrop {
- z-index: 4090;
-}
-*/
-.scrollable-section {
- overflow-x: hidden;
- overflow-y: auto;
- max-height: 260px;
-}
-
-.component {
- opacity: 0.8;
- filter: alpha(opacity = 80);
-}
-
-.window,
-.node > rect {
- stroke-width: 2px;
- stroke: #346789;
- fill: url(#rect-gradient);
- border: 2px solid #346789;
- z-index: 20;
- position: absolute;
- font-size: 0.8em;
- filter: alpha(opacity = 80);
- cursor: move;
-
- box-shadow: 2px 2px 19px #e0e0e0;
- -o-box-shadow: 2px 2px 19px #e0e0e0;
- -webkit-box-shadow: 2px 2px 19px #e0e0e0;
- -moz-box-shadow: 2px 2px 19px #e0e0e0;
- -moz-border-radius: 4px;
- border-radius: 4px;
- background-color: lightgrey;
- fill: lightgrey;
-}
-
-.window,
-.node.selected > rect {
- stroke-width: 2px;
- stroke-dasharray: 10,5;
- stroke: red;
-}
-
-.window-inner {
- position: relative;
- border-radius: 2px;
-}
-
-.window-inner {
- padding: 6px;
-}
-
-.window-inner.from,
-.node > .from {
- background-color: lightsteelblue;
- fill: lightsteelblue;
-}
-
-.window-inner.choice,
-.node > .choice {
- background-color: lightblue;
- fill: lightblue;
-}
-
-.window-inner.when,
-.node > .when {
- background-color: lightgreen;
- fill: lightgreen;
-}
-
-.window-inner.otherwise,
-.node > .otherwise {
- background-color: lightgreen;
- fill: lightgreen;
-}
-
-.window-inner.to,
-.node > .to {
- background-color: lightsteelblue;
- fill: lightsteelblue;
-}
-
-.window-inner.log,
-.node > .log {
- background-color: lightcyan;
- fill: lightcyan;
-}
-
-.window-inner.setBody,
-.node > .setBody {
- background-color: #d3d3d3;
- fill: #d3d3d3;
-}
-
-.window-inner.onException,
-.node > .onException {
- background-color: lightpink;
- fill: lightpink;
-}
-
-.window-inner.delay,
-.node > .delay {
- background-color: lightgrey;
- fill: lightgrey;
-}
-
-.window-inner.bean,
-.node > .bean {
- background-color: mediumaquamarine;
- fill: mediumaquamarine;
-}
-
-.window-inner > * {
- vertical-align: middle;
-}
-
-.window-inner > span {
- max-width: 15em;
- display: inline-block;
- white-space: nowrap;
- text-overflow: ellipsis;
- overflow: hidden;
-}
-
-.window:hover {
- border-color: #5d94a6;
- background-color: #ffffa0;
-}
-
-.window:hover > .window-inner {
- background: inherit;
-}
-
-.window.selected {
- background-color: #f0f0a0;
-}
-
-.window.selected > .window-inner {
- background: inherit;
-}
-
-img.nodeIcon {
- width: 24px !important;
- height: 24px !important;
- cursor: crosshair;
- margin-right: 10px;
-}
-
-img.nodeIcon:hover {
- opacity: 0.6;
- box-shadow: 2px 2px 19px #a0a0a0;
- background-color: #a0a0a0;
-}
-
-.l1 {
- font-size: 13px;
-}
-
-._jsPlumb_connector {
- z-index: 4;
-}
-
-._jsPlumb_overlay {
- z-index: 6;
-}
-
-.hl {
- border: 3px solid red;
-}
-
-.strong {
- font-weight: bold;
-}
-
-.discovery > li {
- position: relative;
-}
-
-.discovery > li > div {
- vertical-align: middle;
-}
-
-.discovery > li > div:first-child {
- margin-right: 10px;
-}
-
-.discovery > li > div:last-child,
-.discovery > li > .lock {
- position: absolute;
- width: 32px;
- height: 32px;
- margin: auto;
- top: 0;
- bottom: 0;
- right: 10px;
-}
-
-.discovery > li > .lock {
- right: 42px;
-}
-
-.discovery > li > div:last-child > div.connect-button {
- width: 32px;
- height: 32px;
-}
-
-.discovery > li > div:last-child > div > i,
-.discovery > li > .lock > i {
- font-size: 32px;
- cursor: pointer;
-}
-
-.discovery > li > .lock > i {
- cursor: inherit;
-}
-
-.discovery > li > div:first-child > img {
- vertical-align: middle;
- width: 64px;
- max-height: 64px;
-}
-
-.auth-form {
- white-space: nowrap;
-}
-
-.auth-form > form > input {
- margin-bottom: 0;
-}
-
-.slideout-body .btn-group,
-.btn-group[hawtio-pager] {
- line-height: normal;
-}
-
-@media print {
- #main-nav,
- #log-panel {
- display: none !important;
- height: 0 !important;
- }
-
- .wiki-grid {
- display: none;
- }
-
- .wiki-fixed {
- margin-top: 0 !important;
- }
-
- .wiki-fixed > .row-fluid > .span3 {
- display: none;
- }
-
- .wiki-fixed > .row-fluid > .span9 {
- width: 100%;
- }
-
- .instance-name {
- display: none !important;
- }
-
- .logbar-container > .nav {
- display: none !important;
- height: 0 !important;
- }
-
-}
-
-.prefs {
- height: 100%;
- margin: 0;
-}
-
-.prefs > div {
- height: 100%;
- margin: 0;
-}
-
-.slideout-body .prefs {
- overflow: hidden;
- margin: 0;
-}
-
-.slideout-body .prefs .tabbable {
- position: relative;
- height: 100%;
- margin: 0;
-}
-
-.pref-slideout > div > div > div {
- height: 100%;
- margin: 0;
-}
-
-.pref-slideout .slideout-body {
- position: absolute;
- top: 0;
- bottom: 0;
- left: 0px;
- right: 0;
- overflow: none !important;
- margin: 0 !important;
-}
-
-.slideout-body .prefs .nav.nav-tabs {
- top: 5px;
- bottom: 5px;
- left: 0;
- width: 130px;
- position: absolute;
- margin: 0;
- overflow-y: auto;
-}
-
-.slideout-body .prefs .nav.nav-tabs:after,
-.slideout-body .prefs .nav.nav-tabs:before {
- display: none;
-}
-
-.slideout-body .prefs .nav.nav-tabs li {
- display: block;
- float: none;
-}
-
-.slideout-body .prefs .tab-content {
- position: absolute;
- overflow: auto;
- top: 5px;
- left: 140px;
- right: 15px;
- bottom: 5px;
- margin: 0;
-}
-
-.help-header .without-text,
-.about-header .without-text {
- position: relative;
- top: -4px;
- vertical-align: middle;
- height: 48px;
-}
-
-.help-header .with-text,
-.about-header .with-text {
- position: relative;
- top: -4px;
- vertical-align: middle;
- height: 48px;
-}
-
-.service-list > li {
- list-style-type: none;
- display: inline-block;
- margin-left: 3px;
- margin-right: 3px;
- vertical-align: middle;
-}
-
-.container-type {
- width: 16px;
-}
-
-.container-status > i:before,
-.container-type i:before,
-.container-type img {
- vertical-align: middle;
- font-size: 16px;
- height: 16px;
- width: auto;
- line-height: 16px;
-}
-
-.container-type img.girthy {
- height: auto;
- width: 16px;
-}
-
-.app-logo {
- width: 64px;
- margin-right: 10px;
-}
-
-.app-logo img,
-.app-logo i {
- vertical-align: middle;
- font-size: 64px;
- height: 64px;
- width: auto;
- line-height: 64px;
-}
-
-.app-logo img.girthy {
- height: auto;
- width: 64px;
-}
-
-.service-list i:before,
-.service-list img {
- height: 16px;
- width: auto;
- font-size: 16px;
- vertical-align: middle;
-}
-
-.service-list img.girthy {
- height: auto;
- width: 16px;
-}
-
-.perspective-selector img {
- width: auto;
- height: 16px;
- vertical-align: top;
-}
-
-.operation-row {
- position: relative;
- height: 30px;
- vertical-align: middle;
-}
-
-.operation-row.can-invoke {
- cursor: pointer;
-}
-
-.operation-row.cant-invoke {
- cursor: not-allowed;
-}
-
-.operation-row > * {
- display: inline-block;
- height: 100%;
- line-height: 30px;
-}
-
-.operation-actions {
- position: absolute;
- right: 6px;
- top: 4px;
-}
-
-.help-block:empty {
- margin-top: 10px;
-}
-
-ul.dynatree-container {
- overflow: visible;
-}
-
-.pane {
- position: fixed;
- bottom: 0;
- top: 70px;
- height: auto;
- width: 300px;
-}
-
-.pane > .pane-wrapper {
- position: relative;
- height: 100%;
- width: 100%;
- overflow: hidden;
-}
-
-.pane-viewport {
- position: absolute;
- top: 0;
- bottom: 0;
- left: 0;
- overflow: auto;
- margin-right: 10px;
-}
-
-.pane-content {
- width: auto;
- height: auto;
-}
-
-.pane-bar {
- position: absolute;
- top: 0;
- right: 0;
- width: 5px;
- cursor: ew-resize;
- height: 100%;
-}
-
-.pane-content {
- float: none;
- position: static;
-}
-
-.pane.left {
- left: 0;
- z-index: 39;
-}
-
-.pane.left .pane-viewport {
- margin-left: 10px;
- right: 5px;
- margin-right: 0;
-}
-
-.pane.left .pane-bar {
- right: 0;
-}
-
-.pane.right {
- right: 0;
-}
-
-.pane.right .pane-viewport {
- margin-left: 10px;
- margin-right: 5px;
- right: 5px;
-}
-
-.pane.right .pane-bar {
- left: 0;
-}
-
-.pane-header-wrapper {
- margin-left: 10px;
- margin-right: 10px;
-}
-
-.tree-header {
- position: relative;
- height: 26px;
-}
-
-.fabric-app-view-header {
- height: auto;
-}
-
-.fabric-app-view-header > * {
- line-height: 12px;
-}
-
-.fabric-app-view-header .alert {
- margin-bottom: 0;
-}
-
-.fabric-app-view-header .row-fluid:last-child {
- padding-bottom: 8px;
-}
-
-.tree-header > .left,
-.tree-header > .right {
- position: absolute;
- top: 3px;
- bottom: 6px;
- vertical-align: middle;
- line-height: 10px;
-}
-
-.tree-header > .left {
- left: 0;
-}
-
-.tree-header > .right {
- right: 10px;
-}
-
-.camel.tree-header {
- height: 42px;
-}
-
-.camel.tree-header > .left {
- right: 94px;
-}
-
-.camel.tree-header > .left,
-.camel.tree-header > .right {
- top: 6px;
- line-height: 30px;
-}
-
-
-.camel.tree-header > .left > .section-filter {
- width: 100%;
-}
-
-.camel.tree-header > .left > .section-filter > .search-query {
- width: 100%;
- margin-bottom: 10px;
-}
-
-.camel.tree-header > .left > .section-filter > .icon-remove {
- right: -16px;
-}
-
-.attributes-wrapper {
- width: 100%;
- overflow: auto;
-}
-
-.separator {
- padding-top: 4px;
- display: inline-block;
-}
-
-.grid-block,
-.health-display {
- border: 1px solid #00f;
-}
-
-.widget-title {
- border-bottom: 1px solid #00f;
-}
-
-.container-group-header {
- vertical-align: middle;
- line-height: 18px;
- font-weight: bold;
- padding: 4px;
- margin-top: 10px;
-}
-
-.search-query.has-text {
- background: #55ddff;
- color: #333333;
-}
-
-.dataTables_filter input {
- border-radius: 15px
-}
-
-.config-admin-form .form-horizontal .control-label {
- width: 260px;
-}
-.config-admin-form .form-horizontal .controls {
- margin-left: 280px;
-}
-
-.new-config-name-form {
- margin-top: 30px;
-}
-
-.td-fixed-width-150 {
- white-space: normal;
- width: 150px;
-}
-
-.pod-label {
- margin-right: 1em;
-}
-
-td > ul {
- margin-bottom: 0px;
-}
-
-td > .zebra-list > li {
- padding: 2px;
-}
-
-ul.nav select {
- margin-bottom: 0px;
- height: 25px;
-}
-
-/* ENTESB-2249: fixing bootstrap forms with tooltips */
-.form-horizontal input + div + .help-block,
-.form-horizontal select + div + .help-block,
-.form-horizontal textarea + div + .help-block {
- margin-top: 10px;
-}
http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/4940e63d/console/plugin/css/ui.dynatree.css
----------------------------------------------------------------------
diff --git a/console/plugin/css/ui.dynatree.css b/console/plugin/css/ui.dynatree.css
deleted file mode 100644
index 4b51e05..0000000
--- a/console/plugin/css/ui.dynatree.css
+++ /dev/null
@@ -1,456 +0,0 @@
-/*
-Licensed under MIT and GPL
-see https://code.google.com/p/dynatree/wiki/LicenseInfo
-*/
-
-/*******************************************************************************
- * Tree container
- */
-ul.dynatree-container
-{
- font-family: tahoma, arial, helvetica;
- font-size: 10pt; /* font size should not be too big */
- white-space: nowrap;
- padding: 3px;
- margin: 0; /* issue 201 */
- background-color: white;
- overflow: auto;
- height: 100%; /* issue 263 */
-}
-
-ul.dynatree-container ul
-{
- padding: 0 0 0 16px;
- margin: 0;
-}
-
-ul.dynatree-container li
-{
- list-style-image: none;
- list-style-position: outside;
- list-style-type: none;
- -moz-background-clip:border;
- -moz-background-inline-policy: continuous;
- -moz-background-origin: padding;
- background-attachment: scroll;
- background-color: transparent;
- background-position: 0 0;
- background-repeat: repeat-y;
- background-image: none; /* no v-lines */
-
- margin:0;
- padding:1px 0 0 0;
-}
-/* Suppress lines for last child node */
-ul.dynatree-container li.dynatree-lastsib
-{
- background-image: none;
-}
-/* Suppress lines if level is fixed expanded (option minExpandLevel) */
-ul.dynatree-no-connector > li
-{
- background-image: none;
-}
-
-/* Style, when control is disabled */
-.ui-dynatree-disabled ul.dynatree-container
-{
- opacity: 0.5;
-/* filter: alpha(opacity=50); /* Yields a css warning */
- background-color: silver;
-}
-
-
-/*******************************************************************************
- * Common icon definitions
- */
-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
-{
- width: 16px;
- height: 16px;
-/* display: -moz-inline-box; /* @ FF 1+2 removed for issue 221*/
-/* -moz-box-align: start; /* issue 221 */
- display: inline-block; /* Required to make a span sizeable */
- vertical-align: top;
- background-repeat: no-repeat;
- background-position: left;
- background-image: url("../img/dynatree/icons.gif");
- background-position: 0 0;
-}
-
-/** Used by 'icon' node option: */
-ul.dynatree-container img
-{
- width: 16px;
- height: 16px;
- margin-left: 3px;
- vertical-align: top;
- border-style: none;
-}
-
-
-/*******************************************************************************
- * Lines and connectors
- */
-
-/*
-span.dynatree-empty
-{
-}
-span.dynatree-vline
-{
-}
-*/
-span.dynatree-connector
-{
- background-image: none;
-}
-/*
-.dynatree-lastsib span.dynatree-connector
-{
-}
-*/
-/*******************************************************************************
- * Expander icon
- * Note: IE6 doesn't correctly evaluate multiples class names,
- * so we create combined class names that can be used in the CSS.
- *
- * Prefix: dynatree-exp-
- * 1st character: 'e': expanded, 'c': collapsed
- * 2nd character (optional): 'd': lazy (Delayed)
- * 3rd character (optional): 'l': Last sibling
- */
-
-span.dynatree-expander
-{
- background-position: 0px -80px;
- cursor: pointer;
-}
-span.dynatree-expander:hover
-{
- background-position: -16px -80px;
-}
-.dynatree-exp-cl span.dynatree-expander /* Collapsed, not delayed, last sibling */
-{
-}
-.dynatree-exp-cd span.dynatree-expander /* Collapsed, delayed, not last sibling */
-{
-}
-.dynatree-exp-cdl span.dynatree-expander /* Collapsed, delayed, last sibling */
-{
-}
-.dynatree-exp-e span.dynatree-expander, /* Expanded, not delayed, not last sibling */
-.dynatree-exp-ed span.dynatree-expander, /* Expanded, delayed, not last sibling */
-.dynatree-exp-el span.dynatree-expander, /* Expanded, not delayed, last sibling */
-.dynatree-exp-edl span.dynatree-expander /* Expanded, delayed, last sibling */
-{
- background-position: -32px -80px;
-}
-.dynatree-exp-e span.dynatree-expander:hover, /* Expanded, not delayed, not last sibling */
-.dynatree-exp-ed span.dynatree-expander:hover, /* Expanded, delayed, not last sibling */
-.dynatree-exp-el span.dynatree-expander:hover, /* Expanded, not delayed, last sibling */
-.dynatree-exp-edl span.dynatree-expander:hover /* Expanded, delayed, last sibling */
-{
- background-position: -48px -80px;
-}
-.dynatree-loading span.dynatree-expander /* 'Loading' status overrides all others */
-{
- background-position: 0 0;
- background-image: url("../img/dynatree/loading.gif");
-}
-
-
-/*******************************************************************************
- * Checkbox icon
- */
-span.dynatree-checkbox
-{
- margin-left: 3px;
- background-position: 0px -32px;
-}
-span.dynatree-checkbox:hover
-{
- background-position: -16px -32px;
-}
-
-.dynatree-partsel span.dynatree-checkbox
-{
- background-position: -64px -32px;
-}
-.dynatree-partsel span.dynatree-checkbox:hover
-{
- background-position: -80px -32px;
-}
-
-.dynatree-selected span.dynatree-checkbox
-{
- background-position: -32px -32px;
-}
-.dynatree-selected span.dynatree-checkbox:hover
-{
- background-position: -48px -32px;
-}
-
-/*******************************************************************************
- * Radiobutton icon
- * This is a customization, that may be activated by overriding the 'checkbox'
- * class name as 'dynatree-radio' in the tree options.
- */
-span.dynatree-radio
-{
- margin-left: 3px;
- background-position: 0px -48px;
-}
-span.dynatree-radio:hover
-{
- background-position: -16px -48px;
-}
-
-.dynatree-partsel span.dynatree-radio
-{
- background-position: -64px -48px;
-}
-.dynatree-partsel span.dynatree-radio:hover
-{
- background-position: -80px -48px;
-}
-
-.dynatree-selected span.dynatree-radio
-{
- background-position: -32px -48px;
-}
-.dynatree-selected span.dynatree-radio:hover
-{
- background-position: -48px -48px;
-}
-
-/*******************************************************************************
- * Node type icon
- * Note: IE6 doesn't correctly evaluate multiples class names,
- * so we create combined class names that can be used in the CSS.
- *
- * Prefix: dynatree-ico-
- * 1st character: 'e': expanded, 'c': collapsed
- * 2nd character (optional): 'f': folder
- */
-
-span.dynatree-icon /* Default icon */
-{
- margin-left: 3px;
- background-position: 0px 0px;
-}
-
-.dynatree-has-children span.dynatree-icon /* Default icon */
-{
- background-position: 0px -16px;
-}
-
-.dynatree-ico-cf span.dynatree-icon /* Collapsed Folder */
-{
- background-position: 0px -16px;
-}
-
-.dynatree-ico-ef span.dynatree-icon /* Expanded Folder */
-{
- background-position: -64px -16px;
-}
-
-/* Status node icons */
-
-.dynatree-statusnode-wait span.dynatree-icon
-{
- background-image: url("../img/dynatree/loading.gif");
-}
-
-.dynatree-statusnode-error span.dynatree-icon
-{
- background-position: 0px -112px;
-/* background-image: url("../img/dynatree/ltError.gif");*/
-}
-
-/*******************************************************************************
- * Node titles
- */
-
-/* @Chrome: otherwise hit area of node titles is broken (issue 133)
- Removed again for issue 165; (133 couldn't be reproduced) */
-span.dynatree-node
-{
-/* display: -moz-inline-box; /* issue 133, 165, 172, 192. removed for issue 221 */
-/* -moz-box-align: start; /* issue 221 */
-/* display: inline-block; /* Required to make a span sizeable */
-}
-
-
-/* Remove blue color and underline from title links */
-ul.dynatree-container a
-/*, ul.dynatree-container a:visited*/
-{
- color: black; /* inherit doesn't work on IE */
- text-decoration: none;
- vertical-align: top;
- margin: 0px;
- margin-left: 3px;
-/* outline: 0; /* @ Firefox, prevent dotted border after click */
- /* Set transparent border to prevent jumping when active node gets a border
- (we can do this, because this theme doesn't use vertical lines)
- */
- border: 1px solid white; /* Note: 'transparent' would not work in IE6 */
-
-}
-
-ul.dynatree-container a:hover
-{
-/* text-decoration: underline; */
- background: #F2F7FD; /* light blue */
- border-color: #B8D6FB; /* darker light blue */
-}
-
-span.dynatree-node a
-{
- display: inline-block; /* Better alignment, when title contains <br> */
-/* vertical-align: top;*/
- padding-left: 3px;
- padding-right: 3px; /* Otherwise italic font will be outside bounds */
- /* line-height: 16px; /* should be the same as img height, in case 16 px */
-}
-span.dynatree-folder a
-{
-/* font-weight: bold; */ /* custom */
-}
-
-ul.dynatree-container a:focus,
-span.dynatree-focused a:link /* @IE */
-{
- background-color: #EFEBDE; /* gray */
-}
-
-span.dynatree-has-children a
-{
-/* font-style: oblique; /* custom: */
-}
-
-span.dynatree-expanded a
-{
-}
-
-span.dynatree-selected a
-{
-/* color: green; */
- font-style: italic;
-}
-
-span.dynatree-active a
-{
- border: 1px solid #99DEFD;
- background-color: #D8F0FA;
-}
-
-/*******************************************************************************
- * Drag'n'drop support
- */
-
-/*** Helper object ************************************************************/
-div.dynatree-drag-helper
-{
-}
-div.dynatree-drag-helper a
-{
- border: 1px solid gray;
- background-color: white;
- padding-left: 5px;
- padding-right: 5px;
- opacity: 0.8;
-}
-span.dynatree-drag-helper-img
-{
- /*
- position: relative;
- left: -16px;
- */
-}
-div.dynatree-drag-helper /*.dynatree-drop-accept*/
-{
-/* border-color: green;
- background-color: red;*/
-}
-div.dynatree-drop-accept span.dynatree-drag-helper-img
-{
- background-position: -32px -112px;
-}
-div.dynatree-drag-helper.dynatree-drop-reject
-{
- border-color: red;
-}
-div.dynatree-drop-reject span.dynatree-drag-helper-img
-{
- background-position: -16px -112px;
-}
-
-/*** Drop marker icon *********************************************************/
-
-#dynatree-drop-marker
-{
- width: 24px;
- position: absolute;
- background-position: 0 -128px;
- margin: 0;
-}
-#dynatree-drop-marker.dynatree-drop-after,
-#dynatree-drop-marker.dynatree-drop-before
-{
- width:64px;
- background-position: 0 -144px;
-}
-#dynatree-drop-marker.dynatree-drop-copy
-{
- background-position: -64px -128px;
-}
-#dynatree-drop-marker.dynatree-drop-move
-{
- background-position: -64px -128px;
-}
-
-/*** Source node while dragging ***********************************************/
-
-span.dynatree-drag-source
-{
- /* border: 1px dotted gray; */
- background-color: #e0e0e0;
-}
-span.dynatree-drag-source a
-{
- color: gray;
-}
-
-/*** Target node while dragging cursor is over it *****************************/
-
-span.dynatree-drop-target
-{
- /*border: 1px solid gray;*/
-}
-span.dynatree-drop-target a
-{
-}
-span.dynatree-drop-target.dynatree-drop-accept a
-{
- /*border: 1px solid green;*/
- background-color: #3169C6 !important;
- color: white !important; /* @ IE6 */
- text-decoration: none;
-}
-span.dynatree-drop-target.dynatree-drop-reject
-{
- /*border: 1px solid red;*/
-}
-span.dynatree-drop-target.dynatree-drop-after a
-{
-}
---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@qpid.apache.org
For additional commands, e-mail: commits-help@qpid.apache.org
[03/19] qpid-dispatch git commit: removed canvas class from left panel
Posted by ea...@apache.org.
removed canvas class from left panel
Project: http://git-wip-us.apache.org/repos/asf/qpid-dispatch/repo
Commit: http://git-wip-us.apache.org/repos/asf/qpid-dispatch/commit/4802b684
Tree: http://git-wip-us.apache.org/repos/asf/qpid-dispatch/tree/4802b684
Diff: http://git-wip-us.apache.org/repos/asf/qpid-dispatch/diff/4802b684
Branch: refs/heads/master
Commit: 4802b6847236d7ab0f913d8c9e6a99f08194bebe
Parents: 739dff2
Author: Ernest Allen <ea...@redhat.com>
Authored: Thu Feb 18 13:00:37 2016 -0500
Committer: Ernest Allen <ea...@redhat.com>
Committed: Thu Feb 18 13:00:37 2016 -0500
----------------------------------------------------------------------
.../stand-alone/plugin/html/qdrTopology.html | 222 +++++++++++++++++++
1 file changed, 222 insertions(+)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/4802b684/console/stand-alone/plugin/html/qdrTopology.html
----------------------------------------------------------------------
diff --git a/console/stand-alone/plugin/html/qdrTopology.html b/console/stand-alone/plugin/html/qdrTopology.html
new file mode 100644
index 0000000..0cea1b6
--- /dev/null
+++ b/console/stand-alone/plugin/html/qdrTopology.html
@@ -0,0 +1,222 @@
+<!--
+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="qdrTopology row-fluid" ng-controller="QDR.TopologyController">
+ <div class="tertiary left panel">
+ <div id="topologyForm" ng-class="{selected : isSelected()}">
+ <!-- <div ng-repeat="form in forms" ng-show="isVisible(form)" ng-class='{selected : isSelected(form)}'> -->
+
+ <div ng-show="isGeneral()">
+ <h4>Router Info</h4>
+ <div ng-style="getTableHeight(attributes)" ui-grid-auto-resize ui-grid="topoGridOptions"></div>
+ </div>
+ <div ng-show="isConnections()">
+ <h4>Connection Info</h4>
+ <div ng-style="getTableHeight(connAttributes)" ui-grid-auto-resize ui-grid="topoConnOptions"></div>
+ </div>
+ <div id="addNodeForm" ng-show="isAddNode()">
+ <h4>Add a new router</h4>
+ <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 class="panel-adjacent">
+
+<!--
+ <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>
+</div>
+<!--
+ This is the template for the node edit dialog that is displayed.
+-->
+<script type="text/ng-template" id="node-config-template.html">
+ <div class="modal-header">
+ <h3 class="modal-title">Configure new router</h3>
+ </div>
+ <div class="modal-body">
+ <form novalidate name="editForm">
+ <div class="tabbable tabs-left">
+ <ul class="nav nav-tabs">
+ <li ng-repeat="entity in entities" ng-click="setActive(entity.tabName)" ng-class="{separated: entity.tabName == 'listener0'}">
+ <a href="#{{entity.tabName}}" data-toggle="tab"><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}}</a>
+ </li>
+ </ul>
+ <div class="tab-content">
+ <div id="{{entity.tabName}}" ng-repeat="entity in entities" ng-show="isActive(entity.tabName)" class="entity-fields">
+ <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>
+ <div ng-if="attribute.input == 'input'">
+ <!-- ng-pattern="testPattern(attribute)" -->
+ <input type="{{attribute.type}}" 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>
+ </div>
+ </div>
+ </div>
+ </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>
+
+<!--
+
+
+ <div class="nodeOptions" title="Configure new router">
+ <form novalidate name="editForm">
+ <div id="tabs" class="nodeEntities">
+ <ul class="nodeTabs">
+ <li ng-repeat="entity in entities" ng-class="{separated: entity.tabName == 'listener0'}">
+
+ <a href="#{{entity.tabName}}"><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}}</a>
+ </li>
+ </ul>
+ <div id="{{entity.tabName}}" ng-repeat="entity in entities" class="entity-fields">
+ <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>
+ <div ng-if="attribute.input == 'input'">
+ <input type="{{attribute.type}}" name="{{attribute.name}}" id="{{attribute.name}}" ng-model="attribute.value" ng-pattern="testPattern(attribute)" 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>
+ </div>
+ </div>
+ </form>
+
+ <div class="okButton">
+ <button ng-click="download()">Download</button>
+ <button ng-click="cancel()">Cancel</button>
+ </div>
+ </div>
+ -->
+</script>
+
+<script type="text/ng-template" id="config-file-header.html">##
+## 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
+##
+</script>
+
+<script type="text/ng-template" id="download-dialog-template.html">
+ <div title="Configure new router">
+
+ <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 class="okButton">
+ <button ng-click="done()">Done</button>
+ </div>
+
+ </div>
+</script>
+
---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@qpid.apache.org
For additional commands, e-mail: commits-help@qpid.apache.org
[09/19] qpid-dispatch git commit: moved standalone to a subdir
Posted by ea...@apache.org.
http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/4940e63d/console/plugin/lib/slider.js
----------------------------------------------------------------------
diff --git a/console/plugin/lib/slider.js b/console/plugin/lib/slider.js
deleted file mode 100644
index 1f0dd1d..0000000
--- a/console/plugin/lib/slider.js
+++ /dev/null
@@ -1,170 +0,0 @@
-/*
- jQuery UI Slider plugin wrapper
-
- Source: https://github.com/angular-ui/ui-slider/blob/master/src/slider.js
- License: MIT
-
-*/
-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 options = angular.extend(scope.$eval(attrs.uiSlider) || {}, uiSliderConfig);
- // Object holding range values
- var prevRangeValues = {
- min: null,
- max: null
- };
-
- // convenience properties
- var properties = ['min', 'max', 'step'];
- var useDecimals = (!angular.isUndefined(attrs.useDecimals)) ? true : false;
-
- 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('slide', function(event, ui) {
- ngModel.$setViewValue(ui.values || ui.value);
- scope.$apply();
- });
-
- // Update slider from model value
- ngModel.$render = function() {
- init();
- var method = options.range === true ? 'values' : 'value';
-
- if (!options.range && 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) {
-
- // 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[0] = prevRangeValues.min;
- }
- // Max value should be less to equal to min value
- if (prevRangeValues.max <= ngModel.$viewValue[0]) {
- ngModel.$viewValue[1] = 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();
- }
- }, true);
-
- function destroy() {
- elm.slider('destroy');
- }
- scope.$on("$destroy", function() {
- 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 = ['max', 'step', 'tick'];
- angular.forEach(properties, function(property) {
- if (angular.isDefined(attrs[property])) {
- options[property] = attrs[property];
- }
- });
- if (angular.isDefined(options['tick']) && angular.isDefined(options['step'])) {
- var gaps = parseInt(parseInt(options['max'])/parseInt(options['step'])) - 1;
- if (gaps > 0) {
- for (var i = 0; i<= gaps; ++i) {
- var left = ((i / gaps) * 100) + '%';
- $("<div/>").addClass("ui-slider-tick").appendTo(element).css({left: left});
- };
- }
- }
- }
-
- return {
- pre: preLink,
- post: postLink
- };
- }
- };
-}]);
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/4940e63d/console/stand-alone/plugin/css/plugin.css
----------------------------------------------------------------------
diff --git a/console/stand-alone/plugin/css/plugin.css b/console/stand-alone/plugin/css/plugin.css
new file mode 100644
index 0000000..5097d64
--- /dev/null
+++ b/console/stand-alone/plugin/css/plugin.css
@@ -0,0 +1,658 @@
+/*
+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;
+}
+
+.nickname-window,
+.channel-window,
+.main-window {
+ position: absolute;
+ top: 2px;
+ bottom: 2px;
+ left: 4px;
+ right: 4px;
+ /* border: 1px solid #d4d4d4;
+ border-radius: 4px;*/
+ overflow-y: auto;
+ overflow-x: hidden;
+}
+
+.nickname-window > .nickname-window-inner,
+.channel-window > .channel-window-inner,
+.main-window > .main-window-inner {
+ position: static;
+}
+
+.channel-window-inner > ul > li {
+ cursor: pointer;
+ padding: 0;
+ border-bottom: 1px solid #EEEEEE;
+}
+
+
+.channel-window-inner > ul > li > span:hover {
+ background-color: #EAEAEA;
+}
+
+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;
+}
+
+.nickname-window-inner > ul > li {
+ cursor: pointer;
+}
+
+.channel-window {
+ bottom: 40px;
+}
+
+.main-window {
+ border: none;
+ top: 46px;
+ bottom: 46px;
+}
+
+.main-window.no-topic {
+ top: 2px;
+}
+
+.topic-window {
+ position: absolute;
+ left: 10px;
+ right: 10px;
+ top: 2px;
+ height: 20px;
+ overflow: hidden;
+ z-index: 50;
+ border-bottom-left-radius: 4px;
+ border-bottom-right-radius: 4px;
+ border-left: 1px solid #d4d4d4;
+ border-right: 1px solid #d4d4d4;
+ border-bottom: 1px solid #d4d4d4;
+ background: white;
+ padding: 10px;
+}
+
+.input-widget {
+ background: white;
+ position: absolute;
+ bottom: 2px;
+ left: 2px;
+ right: 2px;
+ height: 40px;
+ z-index: 50;
+}
+
+.input-widget > form {
+ position: relative;
+}
+
+.input-widget > form > div {
+ position: absolute;
+ left: 2px;
+ top: 2px;
+ bottom: 2px;
+ right: 84px;
+}
+
+.input-widget > form > div > input[type="text"] {
+ width: 100%;
+}
+
+.input-widget > form > input[type="submit"] {
+ position: absolute;
+ right: 2px;
+ top: 3px;
+}
+
+.input-widget > form > input {
+ margin-bottom: 0;
+}
+
+.channel-control-buttons {
+ position: absolute;
+ background: white;
+ bottom: 2px;
+ left: 2px;
+ right: 2px;
+ z-index: 50;
+}
+
+div.listAttrName {
+ padding-top: 5px;
+}
+
+div.listAttrName i.icon-bar-chart {
+ float: right;
+ margin: 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: 44px !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;
+}
+
+div.aChart {
+ height: 200px;
+ width: 400px;
+ margin: 1em;
+}
+
+div.chartContainer {
+ float: left;
+}
+
+div.d3Chart path {
+ stroke: black;
+ stroke-width: 1;
+ opacity: 0.5;
+}
+
+div.d3Chart path.line {
+ stroke: steelblue;
+ stroke-width: 1;
+ 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;
+}
+
+
+.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 .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;
+}
+
+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 {
+ background-color: #e0e0ff;
+}
+
+/* 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: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.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;
+}
+
+.overview .ngRow:hover {
+ background:#e0e0ff;
+}
+
+.treeContainer {
+ width: 250px;
+ 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;
+}
+
+.overview {
+ border-bottom: 1px solid #d4d4d4;
+}
+
+.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;
+}
+
+.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;
+}
+
+#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;
+}
+
http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/4940e63d/console/stand-alone/plugin/css/qdrTopology.css
----------------------------------------------------------------------
diff --git a/console/stand-alone/plugin/css/qdrTopology.css b/console/stand-alone/plugin/css/qdrTopology.css
new file mode 100644
index 0000000..e1cf239
--- /dev/null
+++ b/console/stand-alone/plugin/css/qdrTopology.css
@@ -0,0 +1,498 @@
+/*
+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: #00F000;
+}
+
+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;
+}
+
+.row-fluid.tertiary {
+ position: relative;
+ left: 20px;
+}
+
+.row-fluid.tertiary.left {
+ float: left;
+}
+
+.row-fluid.tertiary.panel {
+ width: 410px;
+ height: 100%;
+}
+
+.panel-adjacent {
+ margin-left: 430px;
+}
+
+#topologyForm.selected {
+ border: 1px solid red;
+}
+#topologyForm {
+ border: 1px solid white;
+ padding: 2px;
+ position: relative;
+ top: -8px;
+}
+
+#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;
+}
+
+.entity-fields div.boolean label:first-child {
+ float: left;
+ margin-right: 1em;
+}
+.entity-fields div.boolean {
+ padding-bottom: 1em;
+}
+
+.entity-fields label.ng-binding {
+ font-weight: 600;
+ margin-top: 0.5em;
+}
+
+.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:10px; */
+ 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: 200px;
+ left: 600px;
+}
+
+.node circle {
+/* fill: rgb(31, 119, 180);
+ fill-opacity: .25; */
+ fill: #cfe2f3;
+ fill-opacity: .98;
+ stroke: black;
+ stroke-width: 3px;
+}
+
+.leaf circle {
+ fill: #6fa8dc;
+ fill-opacity: 0.95;
+ stroke-width: 3px;
+}
+
+.leaf circle[title] {
+ font-family: monospace;
+
+}
+
+.tabs-left .nav-tabs {
+ float: left;
+}
+.tabs-left .nav-tabs > li {
+ float: initial;
+}
\ 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
[18/19] qpid-dispatch git commit: moved standalone to a subdir
Posted by ea...@apache.org.
moved standalone to a subdir
Project: http://git-wip-us.apache.org/repos/asf/qpid-dispatch/repo
Commit: http://git-wip-us.apache.org/repos/asf/qpid-dispatch/commit/4940e63d
Tree: http://git-wip-us.apache.org/repos/asf/qpid-dispatch/tree/4940e63d
Diff: http://git-wip-us.apache.org/repos/asf/qpid-dispatch/diff/4940e63d
Branch: refs/heads/master
Commit: 4940e63df9e9345d0fec4ae949c86f7172a2c4e3
Parents: 4802b68
Author: Ernest Allen <ea...@redhat.com>
Authored: Thu Feb 18 13:01:26 2016 -0500
Committer: Ernest Allen <ea...@redhat.com>
Committed: Thu Feb 18 13:01:26 2016 -0500
----------------------------------------------------------------------
console/index.html | 127 -
console/plugin/css/json-formatter-min.css | 6 -
console/plugin/css/plugin.css | 658 --
console/plugin/css/qdrTopology.css | 498 --
console/plugin/css/site-base.css | 4482 ----------
console/plugin/css/ui.dynatree.css | 456 --
console/plugin/data/places1.json | 13 -
console/plugin/data/world-110m.json | 1 -
console/plugin/html/qdrCharts.html | 150 -
console/plugin/html/qdrConnect.html | 65 -
console/plugin/html/qdrGraphs.html | 15 -
console/plugin/html/qdrLayout.html | 26 -
console/plugin/html/qdrList.html | 56 -
console/plugin/html/qdrOverview.html | 83 -
console/plugin/html/qdrSchema.html | 21 -
console/plugin/html/qdrTopology.html | 222 -
console/plugin/img/ZeroClipboard.swf | Bin 1966 -> 0 bytes
console/plugin/img/ajax-loader.gif | Bin 3208 -> 0 bytes
console/plugin/img/dynatree/icons.gif | Bin 5512 -> 0 bytes
console/plugin/img/dynatree/loading.gif | Bin 3111 -> 0 bytes
console/plugin/js/navbar.js | 119 -
console/plugin/js/qdrChartService.js | 956 ---
console/plugin/js/qdrCharts.js | 230 -
console/plugin/js/qdrList.js | 474 --
console/plugin/js/qdrOverview.js | 696 --
console/plugin/js/qdrPlugin.js | 197 -
console/plugin/js/qdrSchema.js | 31 -
console/plugin/js/qdrService.js | 742 --
console/plugin/js/qdrSettings.js | 115 -
console/plugin/js/qdrTopology.js | 1871 -----
console/plugin/lib/jquery.tipsy.js | 418 -
console/plugin/lib/json-formatter-min.js | 7 -
console/plugin/lib/rhea.js | 7716 ------------------
console/plugin/lib/slider.js | 170 -
console/stand-alone/plugin/css/plugin.css | 658 ++
console/stand-alone/plugin/css/qdrTopology.css | 498 ++
console/stand-alone/plugin/css/site-base.css | 4482 ++++++++++
console/stand-alone/plugin/data/places1.json | 13 +
console/stand-alone/plugin/data/world-110m.json | 1 +
console/stand-alone/plugin/html/qdrCharts.html | 150 +
console/stand-alone/plugin/html/qdrConnect.html | 65 +
console/stand-alone/plugin/html/qdrGraphs.html | 15 +
console/stand-alone/plugin/html/qdrLayout.html | 26 +
console/stand-alone/plugin/html/qdrList.html | 56 +
.../stand-alone/plugin/html/qdrOverview.html | 83 +
console/stand-alone/plugin/html/qdrSchema.html | 21 +
.../stand-alone/plugin/img/ZeroClipboard.swf | Bin 0 -> 1966 bytes
console/stand-alone/plugin/img/ajax-loader.gif | Bin 0 -> 3208 bytes
.../stand-alone/plugin/img/dynatree/icons.gif | Bin 0 -> 5512 bytes
.../stand-alone/plugin/img/dynatree/loading.gif | Bin 0 -> 3111 bytes
console/stand-alone/plugin/js/navbar.js | 119 +
.../stand-alone/plugin/js/qdrChartService.js | 956 +++
console/stand-alone/plugin/js/qdrCharts.js | 230 +
console/stand-alone/plugin/js/qdrList.js | 474 ++
console/stand-alone/plugin/js/qdrOverview.js | 696 ++
console/stand-alone/plugin/js/qdrPlugin.js | 197 +
console/stand-alone/plugin/js/qdrSchema.js | 31 +
console/stand-alone/plugin/js/qdrService.js | 742 ++
console/stand-alone/plugin/js/qdrSettings.js | 115 +
console/stand-alone/plugin/lib/rhea.js | 7716 ++++++++++++++++++
60 files changed, 17344 insertions(+), 20621 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/4940e63d/console/index.html
----------------------------------------------------------------------
diff --git a/console/index.html b/console/index.html
deleted file mode 100644
index 69aa788..0000000
--- a/console/index.html
+++ /dev/null
@@ -1,127 +0,0 @@
-<!DOCTYPE html>
-<!--
-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.
--->
-<html>
-
-<head>
-
- <meta charset="utf-8"/>
- <meta name="viewport" content="width=device-width, initial-scale=1.0"/>
- <title>Qpid Dispatch Console</title>
-
- <link rel="stylesheet" href="https://code.jquery.com/ui/1.11.4/themes/smoothness/jquery-ui.css">
- <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/jquery.tipsy/1.0.2/jquery.tipsy.css" type="text/css"/>
- <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/angular-ui-grid/3.0.7/ui-grid.css" type="text/css"/>
- <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/jquery.fancytree/2.15.0/skin-win8/ui.fancytree.css" type="text/css">
-
- <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap.min.css" integrity="sha384-1q8mTJOASx8j1Au+a5WDVnPi2lkFfwwEAa8hDDdjZlpLegxhjVME1fgjWPGmkzs7" crossorigin="anonymous">
- <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap-theme.min.css" integrity="sha384-fLW2N01lMqjakBkx3l/M9EahuwpSfeNvV63J5ezn3uZzapT0u7EYsXMjQV+0En5r" crossorigin="anonymous">
-
- <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/font-awesome/3.2.1/css/font-awesome.min.css">
-
-
- <link rel="stylesheet" href="plugin/css/site-base.css" type="text/css"/>
- <link rel="stylesheet" href="plugin/css/plugin.css" type="text/css"/>
- <link rel="stylesheet" href="plugin/css/qdrTopology.css" type="text/css"/>
- <link rel="stylesheet" href="plugin/css/json-formatter-min.css" type="text/css"/>
-
-</head>
-
-<body ng-app="QDR">
-
-<div id="core" ng-controller="QDR.Core">
- <div id="alerts">
- <uib-alert ng-repeat="alert in alerts" type="{{alert.type}}">{{alert.msg}}</uib-alert>
- </div>
- <div id="main-nav" class="navbar navbar-fixed-top" ng-controller="QDR.MainController">
- <div class="navbar-inner main-nav-lower">
- <div class="container">
- <div class="pull-left">
- <ul class="nav">
- <li ng-repeat="nav in topLevelTabs track by $index"
- ng-class="{active : !nav.isActive()}"
- ng-show="nav.isValid()">
- <a ng-href="{{nav.href}}" title="{{nav.title}}" data-placement="bottom" ng-bind="nav.content">
- </a>
- </li>
- </ul>
- </div>
- </div>
- </div>
- </div>
-
- <div id="main-body" >
- <div id="main" class="container-fluid ng-cloak qdr">
- <div>
- <ul class="nav nav-tabs connected" ng-controller="QDR.NavBarController">
- <li ng-repeat="link in breadcrumbs" ng-show="isValid(link)" ng-class='{active : isActive(link.href), "pull-right" : isRight(link), haschart: hasChart(link)}'>
- <a ng-href="{{link.href}}{{hash}}" ng-bind-html="link.content | to_trusted"></a>
- </li>
- </ul>
- <div class="row-fluid">
- <div ng-view></div>
- </div>
- </div>
- </div>
- </div>
-</div>
-
- <script src="http://d3js.org/d3.v3.min.js"></script>
- <script src="http://d3js.org/queue.v1.min.js"></script>
- <script src="http://d3js.org/topojson.v0.min.js"></script>
-
- <script src="http://code.jquery.com/jquery-1.12.0.min.js"></script>
-
- <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/js/bootstrap.min.js" integrity="sha384-0mSbJDEHialfmuBBQP6A4Qrprq5OVfW37PRR3j5ELqxss1yVqOtnepnHVP9aJ7xS" crossorigin="anonymous"></script>
-
- <script src="https://code.angularjs.org/1.4.8/angular.js"></script>
- <script src="https://code.angularjs.org/1.4.8/angular-resource.js"></script>
- <script src="https://code.angularjs.org/1.4.8/angular-route.js"></script>
- <script src="https://code.angularjs.org/1.4.8/angular-animate.js"></script>
- <script src="https://cdnjs.cloudflare.com/ajax/libs/angular-ui-bootstrap/1.1.0/ui-bootstrap-tpls.min.js"></script>
- <script type="text/javascript" src="plugin/lib/jquery.tipsy.js"></script>
- <!-- <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery.tipsy/1.0.2/jquery.tipsy.js"></script> -->
-
- <script src="https://code.jquery.com/ui/1.11.4/jquery-ui.min.js"></script>
- <script src="https://cdnjs.cloudflare.com/ajax/libs/angular-ui-grid/3.0.7/ui-grid.js"></script>
-
- <script type="text/javascript" src="plugin/js/qdrPlugin.js"></script>
- <script type="text/javascript" src="plugin/js/qdrOverview.js"></script>
- <script type="text/javascript" src="plugin/js/navbar.js"></script>
- <script type="text/javascript" src="plugin/js/qdrList.js"></script>
- <script type="text/javascript" src="plugin/js/qdrCharts.js"></script>
- <script type="text/javascript" src="plugin/js/qdrSchema.js"></script>
- <script type="text/javascript" src="plugin/js/qdrService.js"></script>
- <script type="text/javascript" src="plugin/js/qdrChartService.js"></script>
- <script type="text/javascript" src="plugin/js/qdrTopology.js"></script>
- <script type="text/javascript" src="plugin/js/qdrSettings.js"></script>
-
- <script type="text/javascript" src="plugin/lib/slider.js"></script>
- <script type="text/javascript" src="plugin/lib/rhea.js"></script>
-
- <script type="text/javascript" src="plugin/lib/json-formatter-min.js"></script>
-
- <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery.fancytree/2.15.0/jquery.fancytree.js" type="text/javascript"></script>
-
- <script type="text/javascript">
- angular.element(document.getElementsByTagName('head')).append(angular.element('<base href="' + window.location.pathname + '" />'));
- </script>
-</body>
-</html>
-
http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/4940e63d/console/plugin/css/json-formatter-min.css
----------------------------------------------------------------------
diff --git a/console/plugin/css/json-formatter-min.css b/console/plugin/css/json-formatter-min.css
deleted file mode 100644
index cd55fd4..0000000
--- a/console/plugin/css/json-formatter-min.css
+++ /dev/null
@@ -1,6 +0,0 @@
-/*!
- * jsonformatter
- *
- * Version: 0.4.1 - 2015-12-03T03:38:59.933Z
- * License: MIT
- */.json-formatter-dark.json-formatter-row,.json-formatter-row{font-family:monospace}.json-formatter-dark.json-formatter-row .toggler.open:after,.json-formatter-row .toggler.open:after{transform:rotate(90deg)}.json-formatter-row,.json-formatter-row a,.json-formatter-row a:hover{color:#000;text-decoration:none}.json-formatter-row .json-formatter-row{margin-left:1em}.json-formatter-row .children.empty{opacity:.5;margin-left:1em}.json-formatter-row .children.empty.object:after{content:"No properties"}.json-formatter-row .children.empty.array:after{content:"[]"}.json-formatter-row .string{color:green;white-space:pre;word-wrap:break-word}.json-formatter-row .number{color:#00f}.json-formatter-row .boolean{color:red}.json-formatter-row .null{color:#855a00}.json-formatter-row .undefined{color:#ca0b69}.json-formatter-row .function{color:#ff20ed}.json-formatter-row .date{background-color:rgba(0,0,0,.05)}.json-formatter-row .url{text-decoration:underline;color:#00f;cursor:pointer}.json-formatt
er-row .bracket{color:#00f}.json-formatter-row .key{color:#00008b;cursor:pointer}.json-formatter-row .constructor-name{cursor:pointer}.json-formatter-row .toggler{font-size:.8em;line-height:1.2em;vertical-align:middle;opacity:.6;cursor:pointer}.json-formatter-row .toggler:after{display:inline-block;transition:transform .1s ease-in;content:"â–º"}.json-formatter-row>a>.thumbnail-text{opacity:0;transition:opacity .15s ease-in;font-style:italic}.json-formatter-row:hover>a>.thumbnail-text{opacity:.6}.json-formatter-dark.json-formatter-row,.json-formatter-dark.json-formatter-row a,.json-formatter-dark.json-formatter-row a:hover{color:#fff;text-decoration:none}.json-formatter-dark.json-formatter-row .json-formatter-row{margin-left:1em}.json-formatter-dark.json-formatter-row .children.empty{opacity:.5;margin-left:1em}.json-formatter-dark.json-formatter-row .children.empty.object:after{content:"No properties"}.json-formatter-dark.json-formatter-row .children.empty.array:after{content:"[]"}.j
son-formatter-dark.json-formatter-row .string{color:#31f031;white-space:pre;word-wrap:break-word}.json-formatter-dark.json-formatter-row .number{color:#66c2ff}.json-formatter-dark.json-formatter-row .boolean{color:#ec4242}.json-formatter-dark.json-formatter-row .null{color:#eec97d}.json-formatter-dark.json-formatter-row .undefined{color:#ef8fbe}.json-formatter-dark.json-formatter-row .function{color:#fd48cb}.json-formatter-dark.json-formatter-row .date{background-color:rgba(255,255,255,.05)}.json-formatter-dark.json-formatter-row .url{text-decoration:underline;color:#027bff;cursor:pointer}.json-formatter-dark.json-formatter-row .bracket{color:#9494ff}.json-formatter-dark.json-formatter-row .key{color:#23a0db;cursor:pointer}.json-formatter-dark.json-formatter-row .constructor-name{cursor:pointer}.json-formatter-dark.json-formatter-row .toggler{font-size:.8em;line-height:1.2em;vertical-align:middle;opacity:.6;cursor:pointer}.json-formatter-dark.json-formatter-row .toggler:after{displa
y:inline-block;transition:transform .1s ease-in;content:"â–º"}.json-formatter-dark.json-formatter-row>a>.thumbnail-text{opacity:0;transition:opacity .15s ease-in;font-style:italic}.json-formatter-dark.json-formatter-row:hover>a>.thumbnail-text{opacity:.6}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/4940e63d/console/plugin/css/plugin.css
----------------------------------------------------------------------
diff --git a/console/plugin/css/plugin.css b/console/plugin/css/plugin.css
deleted file mode 100644
index 5097d64..0000000
--- a/console/plugin/css/plugin.css
+++ /dev/null
@@ -1,658 +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.
-*/
-main-display > .span8 {
- height: 100%;
- position: relative;
-}
-
-.nickname-window,
-.channel-window,
-.main-window {
- position: absolute;
- top: 2px;
- bottom: 2px;
- left: 4px;
- right: 4px;
- /* border: 1px solid #d4d4d4;
- border-radius: 4px;*/
- overflow-y: auto;
- overflow-x: hidden;
-}
-
-.nickname-window > .nickname-window-inner,
-.channel-window > .channel-window-inner,
-.main-window > .main-window-inner {
- position: static;
-}
-
-.channel-window-inner > ul > li {
- cursor: pointer;
- padding: 0;
- border-bottom: 1px solid #EEEEEE;
-}
-
-
-.channel-window-inner > ul > li > span:hover {
- background-color: #EAEAEA;
-}
-
-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;
-}
-
-.nickname-window-inner > ul > li {
- cursor: pointer;
-}
-
-.channel-window {
- bottom: 40px;
-}
-
-.main-window {
- border: none;
- top: 46px;
- bottom: 46px;
-}
-
-.main-window.no-topic {
- top: 2px;
-}
-
-.topic-window {
- position: absolute;
- left: 10px;
- right: 10px;
- top: 2px;
- height: 20px;
- overflow: hidden;
- z-index: 50;
- border-bottom-left-radius: 4px;
- border-bottom-right-radius: 4px;
- border-left: 1px solid #d4d4d4;
- border-right: 1px solid #d4d4d4;
- border-bottom: 1px solid #d4d4d4;
- background: white;
- padding: 10px;
-}
-
-.input-widget {
- background: white;
- position: absolute;
- bottom: 2px;
- left: 2px;
- right: 2px;
- height: 40px;
- z-index: 50;
-}
-
-.input-widget > form {
- position: relative;
-}
-
-.input-widget > form > div {
- position: absolute;
- left: 2px;
- top: 2px;
- bottom: 2px;
- right: 84px;
-}
-
-.input-widget > form > div > input[type="text"] {
- width: 100%;
-}
-
-.input-widget > form > input[type="submit"] {
- position: absolute;
- right: 2px;
- top: 3px;
-}
-
-.input-widget > form > input {
- margin-bottom: 0;
-}
-
-.channel-control-buttons {
- position: absolute;
- background: white;
- bottom: 2px;
- left: 2px;
- right: 2px;
- z-index: 50;
-}
-
-div.listAttrName {
- padding-top: 5px;
-}
-
-div.listAttrName i.icon-bar-chart {
- float: right;
- margin: 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: 44px !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;
-}
-
-div.aChart {
- height: 200px;
- width: 400px;
- margin: 1em;
-}
-
-div.chartContainer {
- float: left;
-}
-
-div.d3Chart path {
- stroke: black;
- stroke-width: 1;
- opacity: 0.5;
-}
-
-div.d3Chart path.line {
- stroke: steelblue;
- stroke-width: 1;
- 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;
-}
-
-
-.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 .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;
-}
-
-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 {
- background-color: #e0e0ff;
-}
-
-/* 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: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.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;
-}
-
-.overview .ngRow:hover {
- background:#e0e0ff;
-}
-
-.treeContainer {
- width: 250px;
- 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;
-}
-
-.overview {
- border-bottom: 1px solid #d4d4d4;
-}
-
-.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;
-}
-
-.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;
-}
-
-#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;
-}
-
http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/4940e63d/console/plugin/css/qdrTopology.css
----------------------------------------------------------------------
diff --git a/console/plugin/css/qdrTopology.css b/console/plugin/css/qdrTopology.css
deleted file mode 100644
index e1cf239..0000000
--- a/console/plugin/css/qdrTopology.css
+++ /dev/null
@@ -1,498 +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.
-*/
-
-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: #00F000;
-}
-
-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;
-}
-
-.row-fluid.tertiary {
- position: relative;
- left: 20px;
-}
-
-.row-fluid.tertiary.left {
- float: left;
-}
-
-.row-fluid.tertiary.panel {
- width: 410px;
- height: 100%;
-}
-
-.panel-adjacent {
- margin-left: 430px;
-}
-
-#topologyForm.selected {
- border: 1px solid red;
-}
-#topologyForm {
- border: 1px solid white;
- padding: 2px;
- position: relative;
- top: -8px;
-}
-
-#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;
-}
-
-.entity-fields div.boolean label:first-child {
- float: left;
- margin-right: 1em;
-}
-.entity-fields div.boolean {
- padding-bottom: 1em;
-}
-
-.entity-fields label.ng-binding {
- font-weight: 600;
- margin-top: 0.5em;
-}
-
-.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:10px; */
- 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: 200px;
- left: 600px;
-}
-
-.node circle {
-/* fill: rgb(31, 119, 180);
- fill-opacity: .25; */
- fill: #cfe2f3;
- fill-opacity: .98;
- stroke: black;
- stroke-width: 3px;
-}
-
-.leaf circle {
- fill: #6fa8dc;
- fill-opacity: 0.95;
- stroke-width: 3px;
-}
-
-.leaf circle[title] {
- font-family: monospace;
-
-}
-
-.tabs-left .nav-tabs {
- float: left;
-}
-.tabs-left .nav-tabs > li {
- float: initial;
-}
\ 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
[05/19] qpid-dispatch git commit: moved standalone to a subdir
Posted by ea...@apache.org.
http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/4940e63d/console/stand-alone/plugin/js/qdrList.js
----------------------------------------------------------------------
diff --git a/console/stand-alone/plugin/js/qdrList.js b/console/stand-alone/plugin/js/qdrList.js
new file mode 100644
index 0000000..7352d82
--- /dev/null
+++ b/console/stand-alone/plugin/js/qdrList.js
@@ -0,0 +1,474 @@
+/*
+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) {
+
+ /**
+ * @method ListController
+ * @param $scope
+ * @param QDRService
+ *
+ * Controller for the main interface
+ */
+ QDR.module.controller("QDR.ListController", ['$scope', '$location', 'uiGridConstants', 'QDRService', 'QDRChartService', '$uibModal',
+ function ($scope, $location, uiGridConstants, QDRService, QDRChartService, $uibModal) {
+
+ //QDR.log.debug("started List controller");
+ if (!angular.isDefined(QDRService.schema))
+ return;
+ $scope.selectedAction = localStorage['QDRSelectedAction'];
+ $scope.selectedNode = localStorage['QDRSelectedNode'];
+ $scope.selectedNodeId = localStorage['QDRSelectedNodeId'];
+ $scope.selectedRecordName = localStorage['QDRSelectedRecordName'];
+
+ var excludedEntities = ["management", "org.amqp.management", "operationalEntity", "entity", "configurationEntity", "dummy", "console"];
+ var aggregateEntities = ["router.address"];
+
+ $scope.entities = [];
+ for (var entity in QDRService.schema.entityTypes) {
+ if (excludedEntities.indexOf(entity) == -1) {
+ $scope.entities.push( {
+ title: angular.isDefined(QDRService.schema.entityTypes[entity].description) ? QDRService.schema.entityTypes[entity].description : '',
+ humanName: QDRService.humanify(entity),
+ name: entity}
+ );
+ }
+ }
+ if (!angular.isDefined($scope.selectedAction)) {
+ $scope.selectedAction = $scope.entities[0].name;
+ //QDR.log.debug("defaulted selectedAction to " + $scope.selectedAction);
+ }
+
+ $scope.nodes = QDRService.nodeList().sort(function (a, b) { return a.name.toLowerCase() > b.name.toLowerCase()});
+ if (!angular.isDefined($scope.selectedNode)) {
+ //QDR.log.debug("selectedNode was " + $scope.selectedNode);
+ if ($scope.nodes.length > 0) {
+ $scope.selectedNode = $scope.nodes[0].name;
+ $scope.selectedNodeId = $scope.nodes[0].id;
+ //QDR.log.debug("forcing selectedNode to " + $scope.selectedNode);
+ }
+ }
+
+ $scope.isActionActive = function(name) {
+ //QDR.log.debug("isActionActive(" + name + ") selectedAction is " + $scope.selectedAction);
+ return $scope.selectedAction === name;
+ };
+ $scope.isNodeSelected = function (id) {
+ return $scope.selectedNodeId === id;
+ };
+
+ $scope.selectNode = function(node) {
+ //QDR.log.debug("setting selectedNode to " + node.name);
+ $scope.selectedNode = node.name;
+ $scope.selectedNodeId = node.id;
+ //QDR.log.debug("location is " + $location.url());
+ $location.search('n', node.name);
+ };
+ $scope.selectAction = function(action) {
+ $scope.selectedAction = action;
+ $location.search('a', action);
+ //QDR.log.debug("selectAction called with " + action + " location is now " + $location.url());
+ };
+
+ $scope.$watch('selectedAction', function(newValue, oldValue) {
+ if (newValue !== oldValue) {
+ localStorage['QDRSelectedAction'] = $scope.selectedAction;
+ //QDR.log.debug("saving selectedAction as " + $scope.selectedAction + " newValue is " + newValue);
+ }
+ })
+ $scope.$watch('selectedNode', function(newValue, oldValue) {
+ if (newValue !== oldValue) {
+ localStorage['QDRSelectedNode'] = $scope.selectedNode;
+ localStorage['QDRSelectedNodeId'] = $scope.selectedNodeId;
+ //QDR.log.debug("saving selectedNode as " + $scope.selectedNode + " newValue is " + newValue);
+ }
+ })
+ $scope.$watch('selectedRecordName', function(newValue, oldValue) {
+ if (newValue != oldValue) {
+ localStorage['QDRSelectedRecordName'] = $scope.selectedRecordName;
+ //QDR.log.debug("saving selectedRecordName as " + $scope.selectedRecordName);
+ }
+ })
+
+ $scope.tableRows = [];
+ var selectedRowIndex = 0;
+ var updateTableData = function (entity) {
+ var gotNodeInfo = function (nodeName, dotentity, response) {
+ //QDR.log.debug("got results for " + nodeName);
+ //console.dump(response);
+
+ var records = response.results;
+ var aggregates = response.aggregates;
+ var attributeNames = response.attributeNames;
+ var nameIndex = attributeNames.indexOf("name");
+ var ent = QDRService.schema.entityTypes[entity];
+ var tableRows = [];
+ for (var i=0; i<records.length; ++i) {
+ var record = records[i];
+ var aggregate = aggregates ? aggregates[i] : undefined;
+ var row = {};
+ var rowName;
+ if (nameIndex > -1) {
+ rowName = record[nameIndex];
+ } else {
+ QDR.log.error("response attributeNames did not contain a name field");
+ console.dump(response.attributeNames);
+ return;
+ }
+ if (rowName == $scope.selectedRecordName)
+ selectedRowIndex = i;
+ for (var j=0; j<attributeNames.length; ++j) {
+ var col = attributeNames[j];
+ row[col] = {value: record[j], type: undefined, graph: false, title: '', aggregate: '', aggregateTip: ''};
+ if (ent) {
+ var att = ent.attributes[col];
+ if (att) {
+ row[col].type = att.type;
+ row[col].graph = att.graph;
+ row[col].title = att.description;
+
+ if (aggregate) {
+ if (att.graph) {
+ row[col].aggregate = att.graph ? aggregate[j].sum : '';
+ var tip = [];
+ aggregate[j].detail.forEach( function (line) {
+ tip.push(line);
+ })
+ row[col].aggregateTip = angular.toJson(tip);
+ }
+ }
+ }
+ }
+ }
+ tableRows.push(row);
+ }
+ setTimeout(selectRow, 0, tableRows);
+ }
+
+ // if this entity should show an aggregate column, send the request to get the info for this entity from all the nedes
+ if (aggregateEntities.indexOf(entity) > -1) {
+ var nodeInfo = QDRService.topology.nodeInfo();
+ QDRService.getMultipleNodeInfo(Object.keys(nodeInfo), entity, [], gotNodeInfo, $scope.selectedNodeId);
+ } else {
+ QDRService.getNodeInfo($scope.selectedNodeId, '.' + entity, [], gotNodeInfo);
+ }
+ };
+
+ // tableRows are the records that were returned, this populates the left hand table on the page
+ var selectRow = function (tableRows) {
+ $scope.tableRows = tableRows;
+ // must apply scope here to update the tableRows before selecting the row
+ $scope.$apply();
+ $scope.gridApi.selection.selectRow($scope.tableRows[selectedRowIndex]);
+ fixTooltips();
+ }
+
+ $scope.getTableHeight = function() {
+ return {height: ($scope.tableRows.length * 30) + "px"};
+ };
+ var titleFromAlt = function (alt) {
+ if (alt && alt.length) {
+ var data = angular.fromJson(alt);
+ var table = "<table class='tiptable'><tbody>";
+ data.forEach (function (row) {
+ table += "<tr>";
+ table += "<td>" + row.node + "</td><td align='right'>" + QDRService.pretty(row.val) + "</td>";
+ table += "</tr>"
+ })
+ table += "</tbody></table>"
+ return table;
+ }
+ return '';
+ }
+ var fixTooltips = function () {
+ if ($('.hastip').length == 0) {
+ setTimeout(fixTooltips, 100);
+ return;
+ }
+ $('.hastip').each( function (i, tip) {
+ var tipset = tip.getAttribute('tipset')
+ if (!tipset) {
+ $(tip).tipsy({html: true, className: 'subTip', opacity: 1, title: function () {
+ return titleFromAlt(this.getAttribute('alt'))
+ } });
+ tip.setAttribute('tipset', true)
+ } else {
+ var title = titleFromAlt(tip.getAttribute('alt'))
+ tip.setAttribute('original-title', title)
+ }
+/*
+ $(tip).tipsy({html: true, className: 'subTip', opacity: 1, title: function () {
+ var alt = this.getAttribute('alt');
+ if (alt && alt.length) {
+ var data = angular.fromJson(alt);
+ var table = "<table class='tiptable'><tbody>";
+ data.forEach (function (row) {
+ table += "<tr>";
+ table += "<td>" + row.node + "</td><td align='right'>" + QDRService.pretty(row.val) + "</td>";
+ table += "</tr>"
+ })
+ table += "</tbody></table>"
+ return table;
+ }
+ return '';
+ } });
+ */
+ })
+ }
+ $scope.selectedEntity = undefined;
+ for (var i=0; i<$scope.entities.length; ++i) {
+ if ($scope.selectedAction === $scope.entities[i].name) {
+ $scope.selectedEntity = $scope.entities[i].name;
+ break;
+ }
+ }
+ if (!angular.isDefined($scope.selectedEntity)) {
+ $scope.selectedAction = $scope.entities[0].name;
+ $scope.selectedEntity = $scope.entities[0].name;
+ }
+ var savedCharts = angular.fromJson(localStorage['QDRListCharts']);
+ var getCurrentSavedCharts = function () {
+ if (angular.isDefined(savedCharts)) {
+ if (angular.isDefined(savedCharts[$scope.selectedEntity])) {
+ //graphFields = savedCharts[$scope.selectedEntity];
+ }
+ } else {
+ savedCharts = {};
+ }
+ }
+ getCurrentSavedCharts();
+
+ //QDR.log.debug("using entity of " + $scope.selectedEntity);
+ var stop = undefined;
+
+ // The left-hand table that lists the names
+ var gridCols = [
+ { field: 'name',
+ displayName: '',
+ cellTemplate: '<div class="ngCellText"><span ng-cell-text>{{row.entity.name.value}}</span></div>'
+ }
+ ];
+ // the table on the left of the page contains the name field for each record that was returned
+ $scope.gridDef = {
+ data: 'tableRows',
+ hideHeader: true,
+ showHeader: false,
+ enableHorizontalScrollbar: uiGridConstants.scrollbars.NEVER,
+ enableVerticalScrollbar: uiGridConstants.scrollbars.NEVER,
+ columnDefs: gridCols,
+ enableColumnResize: true,
+ multiSelect: false,
+ enableRowHeaderSelection: false,
+ noUnselect: true,
+ enableSelectAll: false,
+ enableRowSelection: true,
+ onRegisterApi: function (gridApi) {
+ $scope.gridApi = gridApi;
+ gridApi.selection.on.rowSelectionChanged($scope, function(row) {
+ if (row.isSelected) {
+ selectedRowIndex = row.rowIndex;
+ $scope.selectedRecordName = row.entity.name.value;
+ var details = [];
+ // for each field in the new row, add a row in the details grid
+ for (var name in row.entity) {
+ details.push( { attributeName: QDRService.humanify(name),
+ attributeValue: QDRService.pretty(row.entity[name].value),
+ type: row.entity[name].type,
+ name: name,
+ rawValue: row.entity[name].value,
+ graph: row.entity[name].graph,
+ title: row.entity[name].title,
+ aggregateValue: QDRService.pretty(row.entity[name].aggregate),
+ aggregateTip: row.entity[name].aggregateTip})
+ }
+ setTimeout(updateDetails, 10, details);
+ }
+ });
+ }
+ };
+
+ $scope.detailFields = [];
+ updateDetails = function (details) {
+ $scope.detailFields = details;
+ $scope.$apply();
+ }
+
+ $scope.isFieldGraphed = function(rowEntity, aggregate) {
+ var dot = !aggregate ? '.' : '';
+ return QDRChartService.isAttrCharted($scope.selectedNodeId, dot + $scope.selectedEntity, $scope.selectedRecordName, rowEntity.name);
+ }
+
+ $scope.addToGraph = function(rowEntity) {
+ var chart = QDRChartService.registerChart($scope.selectedNodeId, "." + $scope.selectedEntity, $scope.selectedRecordName, rowEntity.name, 1000);
+ doDialog("template-from-script.html", chart);
+ reset();
+ }
+
+ $scope.addAllToGraph = function(rowEntity) {
+ var chart = QDRChartService.registerChart($scope.selectedNodeId,
+ $scope.selectedEntity,
+ $scope.selectedRecordName,
+ rowEntity.name,
+ 1000,
+ false,
+ true);
+ doDialog("template-from-script.html", chart);
+ reset();
+ }
+
+ var detailCols = [
+ {
+ field: 'attributeName',
+ cellTemplate: '<div title="{{row.entity.title}}" class="listAttrName">{{row.entity.name}}<i ng-if="row.entity.graph" ng-click="grid.appScope.addToGraph(row.entity)" ng-class="{\'active\': grid.appScope.isFieldGraphed(row.entity, false), \'icon-bar-chart\': row.entity.graph == true }"></i></div>',
+ displayName: 'Attribute'
+ },
+ {
+ field: 'attributeValue',
+ displayName: 'Value'
+ }
+ ];
+ if (aggregateEntities.indexOf($scope.selectedEntity) > -1) {
+ detailCols.push(
+ {
+ width: '10%',
+ field: 'aggregateValue',
+ displayName: 'Aggregate',
+ cellTemplate: '<div class="hastip" alt="{{row.entity.aggregateTip}}">{{row.entity.aggregateValue}}<i ng-if="row.entity.graph" ng-click="grid.appScope.addAllToGraph(row.entity)" ng-class="{\'active\': grid.appScope.isFieldGraphed(row.entity, true), \'icon-bar-chart\': row.entity.graph == true }"></i></div>',
+ cellClass: 'aggregate'
+ }
+ )
+ }
+
+ // the table on the right of the page contains a row for each field in the selected record in the table on the left
+ $scope.details = {
+ data: 'detailFields',
+ columnDefs: detailCols,
+ enableHorizontalScrollbar: uiGridConstants.scrollbars.NEVER,
+ enableVerticalScrollbar: uiGridConstants.scrollbars.NEVER,
+ enableColumnResize: true,
+ multiSelect: false,
+ enableRowHeaderSelection: false,
+ noUnselect: true,
+ enableSelectAll: false,
+ enableRowSelection: true
+ };
+
+ updateTableData($scope.selectedEntity);
+ stop = setInterval(updateTableData, 5000, $scope.selectedEntity);
+ $scope.getDetailsTableHeight = function() {
+ return {height: ($scope.detailFields.length * 30) + "px"};
+ };
+
+ $scope.$on("$destroy", function( event ) {
+ //QDR.log.debug("scope destroyed for qdrList");
+ reset();
+ if (angular.isDefined(stop)) {
+ clearInterval(stop);
+ stop = undefined;
+ };
+ });
+
+ var reset = function () {
+ if ($scope.context) {
+ $scope.context.stop();
+ $scope.context = null;
+ }
+ };
+
+ function doDialog(template, chart) {
+
+ var modalInstance = $uibModal.open({
+ animation: true,
+ templateUrl: template,
+ controller: 'QDR.ListChartController',
+ resolve: {
+ chart: function () {
+ return chart;
+ }
+ }
+ });
+ };
+
+ }]);
+
+
+ QDR.module.controller('QDR.ListChartController', function ($scope, $uibModalInstance, $location, QDRChartService, chart) {
+
+ $scope.chart = chart;
+ $scope.dialogSvgChart = null;
+ $scope.updateTimer = null;
+ $scope.svgDivId = "dialogChart"; // the div id for the svg chart
+
+ $scope.showChartsPage = function () {
+ cleanup();
+ $uibModalInstance.close();
+ $location.path("/charts");
+ };
+
+ $scope.addChartsPage = function () {
+ QDRChartService.addDashboard($scope.chart);
+ };
+
+ $scope.delChartsPage = function () {
+ QDRChartService.delDashboard($scope.chart);
+ };
+
+ $scope.isOnChartsPage = function () {
+ return $scope.chart.dashboard;
+ }
+
+ var showChart = function () {
+ // the chart divs are generated by angular and aren't available immediately
+ var div = angular.element("#" + $scope.svgDivId);
+ if (!div.width()) {
+ setTimeout(showChart, 100);
+ return;
+ }
+ dialogSvgChart = new QDRChartService.AreaChart($scope.chart, $location.$$path);
+ $scope.dialogSvgChart = dialogSvgChart;
+ updateDialogChart();
+ }
+ showChart();
+
+ var updateDialogChart = function () {
+ if ($scope.dialogSvgChart)
+ $scope.dialogSvgChart.tick($scope.svgDivId);
+ $scope.updateTimer = setTimeout(updateDialogChart, 1000);
+ }
+
+ var cleanup = function () {
+ if ($scope.updateTimer) {
+ clearTimeout($scope.updateTimer);
+ $scope.updateTimer = null;
+ }
+ if (!$scope.chart.dashboard)
+ QDRChartService.unRegisterChart(chart); // remove the chart
+
+ }
+ $scope.ok = function () {
+ cleanup();
+ $uibModalInstance.close();
+ };
+
+ });
+ return QDR;
+
+} (QDR || {}));
http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/4940e63d/console/stand-alone/plugin/js/qdrOverview.js
----------------------------------------------------------------------
diff --git a/console/stand-alone/plugin/js/qdrOverview.js b/console/stand-alone/plugin/js/qdrOverview.js
new file mode 100644
index 0000000..d787a5e
--- /dev/null
+++ b/console/stand-alone/plugin/js/qdrOverview.js
@@ -0,0 +1,696 @@
+/*
+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) {
+
+ /**
+ * @method OverviewController
+ * @param $scope
+ * @param QDRService
+ * @param QDRChartServer
+ * dialogServer
+ * $location
+ *
+ * Controller that handles the QDR overview page
+ */
+ QDR.module.controller("QDR.OverviewController", ['$scope', 'uiGridConstants', 'QDRService', function($scope, uiGridConstants, QDRService) {
+
+
+ if (!angular.isDefined(QDRService.schema))
+ return;
+
+ var nodeIds = QDRService.nodeIdList();
+ var currentTimer;
+ var refreshInterval = 5000
+ 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;
+ })();
+ $scope.modes = [
+ {title: 'Overview', name: 'Overview', right: false}
+ ];
+
+ $scope.templates =
+ [ { name: 'Routers', url: 'routers.html'},
+ { name: 'Router', url: 'router.html'},
+ { name: 'Addresses', url: 'addresses.html'},
+ { name: 'Address', url: 'address.html'},
+ { name: 'Connections', url: 'connections.html'},
+ { name: 'Connection', url: 'connection.html'},
+ { name: 'Logs', url: 'logs.html'},
+ { name: 'Log', url: 'log.html'} ];
+
+ $scope.getGridHeight = function (data) {
+ // add 1 for the header row
+ return {height: (($scope[data.data].length + 1) * 30) + "px"};
+ }
+ $scope.overview = new Folder("Overview");
+
+ $scope.allRouterFields = [];
+ var allRouterCols = [
+ {
+ field: 'routerId',
+ 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'
+ }
+ ];
+ $scope.allRouters = {
+ data: 'allRouterFields',
+ columnDefs: allRouterCols,
+ enableHorizontalScrollbar: uiGridConstants.scrollbars.NEVER,
+ enableVerticalScrollbar: uiGridConstants.scrollbars.NEVER,
+ enableColumnResize: true,
+ multiSelect: false,
+ enableRowHeaderSelection: false,
+ noUnselect: true,
+ enableSelectAll: false,
+ enableRowSelection: true,
+ onRegisterApi: function (gridApi) {
+ gridApi.selection.on.rowSelectionChanged($scope, function(row) {
+ if (row.isSelected) {
+ var nodeId = row.entity.nodeId;
+ $("#overtree").fancytree("getTree").activateKey(nodeId);
+ }
+ });
+ }
+ };
+ // get info for all routers
+ var allRouterInfo = function () {
+ 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, response) {
+ var results = response.aggregates
+ results.forEach ( function (result) {
+
+ var routerId = QDRService.valFor(response.attributeNames, result, "routerId").sum
+ allRouterFields.some( function (connField) {
+ if (routerId === connField.routerId) {
+ response.attributeNames.forEach ( function (attrName) {
+ connField[attrName] = QDRService.valFor(response.attributeNames, result, attrName).sum
+ })
+ return true
+ }
+ return false
+ })
+ })
+ $scope.allRouterFields = allRouterFields
+ $scope.$apply()
+ if (currentTimer) {
+ clearTimeout(currentTimer)
+ }
+ currentTimer = setTimeout(allRouterInfo, refreshInterval);
+ }, nodeIds[0])
+ }
+ }
+ nodeIds.forEach ( function (nodeId) {
+ QDRService.getNodeInfo(nodeId, ".connection", ["role"], gotNodeInfo)
+ })
+
+ }
+
+ // get info for a single router
+ var routerInfo = function (node) {
+ $scope.router = node
+ $scope.routerFields = []
+ var cols = [
+ {
+ field: 'attribute',
+ displayName: 'Attribute',
+ width: '40%'
+ },
+ {
+ field: 'value',
+ displayName: 'Value',
+ width: '40%'
+ }
+ ]
+ $scope.routerGrid = {
+ data: 'routerFields',
+ columnDefs: cols,
+ enableHorizontalScrollbar: uiGridConstants.scrollbars.NEVER,
+ enableVerticalScrollbar: uiGridConstants.scrollbars.NEVER,
+ enableColumnResize: true,
+ multiSelect: false
+ }
+
+ $scope.allRouterFields.some( function (field) {
+ if (field.routerId === node.title) {
+ Object.keys(field).forEach ( function (key) {
+ if (key !== '$$hashKey')
+ $scope.routerFields.push({attribute: key, value: field[key]})
+ })
+ return true
+ }
+ })
+
+ $scope.$apply()
+ if (currentTimer) {
+ clearTimeout(currentTimer)
+ currentTimer = null
+ }
+ }
+
+ // get info for a all addresses
+ var allAddressInfo = function () {
+ $scope.addressFields = []
+ var addressCols = [
+ {
+ field: 'address',
+ displayName: 'address'
+ },
+ {
+ field: 'class',
+ displayName: 'class'
+ },
+ {
+ field: 'phase',
+ displayName: 'phase',
+ cellClass: 'grid-align-value'
+ },
+ {
+ field: 'inproc',
+ displayName: 'in-proc'
+ },
+ {
+ field: 'local',
+ displayName: 'local',
+ cellClass: 'grid-align-value'
+ },
+ {
+ field: 'remote',
+ displayName: 'remote',
+ cellClass: 'grid-align-value'
+ },
+ {
+ field: 'in',
+ displayName: 'in',
+ cellClass: 'grid-align-value'
+ },
+ {
+ field: 'out',
+ displayName: 'out',
+ cellClass: 'grid-align-value'
+ }
+ ]
+ $scope.selectedAddresses = []
+ $scope.addressGrid = {
+ data: 'addressFields',
+ columnDefs: addressCols,
+ enableColumnResize: true,
+ enableHorizontalScrollbar: uiGridConstants.scrollbars.NEVER,
+ enableVerticalScrollbar: uiGridConstants.scrollbars.NEVER,
+ multiSelect: false,
+ enableRowHeaderSelection: false,
+ noUnselect: true,
+ enableSelectAll: false,
+ enableRowSelection: true,
+ onRegisterApi: function (gridApi) {
+ gridApi.selection.on.rowSelectionChanged($scope, function(row) {
+ if (row.isSelected) {
+ var key = row.entity.uid;
+ $("#overtree").fancytree("getTree").activateKey(key);
+ }
+ });
+ }
+ }
+
+ var gotAllAddressFields = function ( addressFields ) {
+ $scope.addressFields = addressFields
+ $scope.$apply()
+ if (currentTimer) {
+ clearTimeout(currentTimer)
+ }
+ currentTimer = setTimeout(allAddressInfo, refreshInterval);
+ }
+ getAllAddressFields(gotAllAddressFields)
+ }
+
+ var getAllAddressFields = function (callback) {
+ 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] == 'D') return "link-outgoing"
+ return "unknown: " + addr[0]
+ }
+
+ var addr_text = function (addr) {
+ if (!addr)
+ return "-"
+ if (addr[0] == 'M')
+ return addr.substring(2)
+ else
+ return addr.substring(1)
+ }
+
+ var addr_phase = function (addr) {
+ if (!addr)
+ return "-"
+ if (addr[0] == 'M')
+ return addr[1]
+ return ''
+ }
+
+ var identity_clean = function (identity) {
+ if (!identity)
+ return "-"
+ var pos = identity.indexOf('/')
+ if (pos >= 0)
+ return identity.substring(pos + 1)
+ return identity
+ }
+
+ var addressFields = []
+ nodeIds = QDRService.nodeIdList()
+ 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 = identity_clean(uid)
+
+ addressFields.push({
+ address: addr_text(identity),
+ 'class': 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])
+ }
+
+
+ // get info for a all connections
+ var allConnectionInfo = function () {
+ $scope.allConnectionFields = []
+ var allConnectionCols = [
+ {
+ field: 'host',
+ displayName: 'host'
+ },
+ {
+ field: 'container',
+ displayName: 'container'
+ },
+ {
+ field: 'role',
+ displayName: 'role'
+ },
+ {
+ field: 'dir',
+ displayName: 'dir'
+ },
+ {
+ field: 'security',
+ displayName: 'security'
+ },
+ {
+ field: 'authentication',
+ displayName: 'authentication'
+ }
+ ]
+ $scope.allConnectionGrid = {
+ data: 'allConnectionFields',
+ columnDefs: allConnectionCols,
+ enableHorizontalScrollbar: uiGridConstants.scrollbars.NEVER,
+ enableVerticalScrollbar: uiGridConstants.scrollbars.NEVER,
+ enableColumnResize: true,
+ multiSelect: false,
+ enableRowHeaderSelection: false,
+ noUnselect: true,
+ enableSelectAll: false,
+ enableRowSelection: true,
+ onRegisterApi: function (gridApi) {
+ gridApi.selection.on.rowSelectionChanged($scope, function(row) {
+ if (row.isSelected) {
+ var host = row.entity.host;
+ $("#overtree").fancytree("getTree").activateKey(host);
+ }
+ });
+ }
+ }
+ connections.children.forEach( function (connection) {
+ $scope.allConnectionFields.push(connection.fields)
+ })
+ $scope.$apply()
+ if (currentTimer) {
+ clearTimeout(currentTimer)
+ currentTimer = null
+ }
+ }
+
+ // get info for a single address
+ var addressInfo = function (address) {
+ $scope.address = address
+ $scope.addressFields = []
+ var cols = [
+ {
+ field: 'attribute',
+ displayName: 'Attribute',
+ width: '40%'
+ },
+ {
+ field: 'value',
+ displayName: 'Value',
+ width: '40%'
+ }
+ ]
+ $scope.addressGrid = {
+ data: 'addressFields',
+ columnDefs: cols,
+ enableColumnResize: true,
+ enableHorizontalScrollbar: uiGridConstants.scrollbars.NEVER,
+ enableVerticalScrollbar: uiGridConstants.scrollbars.NEVER,
+ multiSelect: false
+ }
+
+ var fields = Object.keys(address.data.fields)
+ fields.forEach( function (field) {
+ if (field != "title" && field != "uid")
+ $scope.addressFields.push({attribute: field, value: address.data.fields[field]})
+ })
+
+ $scope.$apply()
+ if (currentTimer) {
+ clearTimeout(currentTimer)
+ currentTimer = null
+ }
+ }
+
+ // get info for a single connection
+ var connectionInfo = function (connection) {
+ $scope.connection = connection
+ $scope.connectionFields = []
+ var cols = [
+ {
+ field: 'attribute',
+ displayName: 'Attribute',
+ width: '40%'
+ },
+ {
+ field: 'value',
+ displayName: 'Value',
+ width: '40%'
+ }
+ ]
+ $scope.connectionGrid = {
+ data: 'connectionFields',
+ columnDefs: cols,
+ enableColumnResize: true,
+ enableHorizontalScrollbar: uiGridConstants.scrollbars.NEVER,
+ enableVerticalScrollbar: uiGridConstants.scrollbars.NEVER,
+ multiSelect: false
+ }
+
+ var fields = Object.keys(connection.data.fields)
+ fields.forEach( function (field) {
+ $scope.connectionFields.push({attribute: field, value: connection.data.fields[field]})
+ })
+
+ $scope.$apply()
+ if (currentTimer) {
+ clearTimeout(currentTimer)
+ currentTimer = null
+ }
+ }
+
+ // get info for a all logs
+ var allLogInfo = function () {
+ }
+
+ // get info for a single log
+ var logInfo = function (node) {
+ $scope.log = node
+ }
+
+ var activated = function (event, node) {
+ //QDR.log.debug("node activated: " + node.data.title)
+ node = node.node;
+ var type = node.data.type;
+ var template = $scope.templates.filter( function (tpl) {
+ return tpl.name == type;
+ })
+ $scope.template = template[0];
+ // Call the function associated with this type passing in the node that was selected
+ // In dynatree I could save the function to call in the node, but not in FancyTree
+ if (treeTypeMap[type])
+ treeTypeMap[type](node);
+
+ /*if (node.data.info)
+ node.data.info(node)
+ */
+ $scope.$apply();
+ }
+ $scope.template = $scope.templates[0];
+
+ var routers = new Folder("Routers")
+ routers.type = "Routers"
+ //routers.info = allRouterInfo
+ routers.focus = true
+ routers.expanded = true
+ routers.key = "Routers"
+ $scope.overview.children.push(routers)
+ nodeIds.forEach( function (node) {
+ var name = QDRService.nameFromId(node)
+ var router = new Leaf(name)
+ router.type = "Router"
+ //router.info = routerInfo
+ router.nodeId = node
+ router.key = node
+ routers.children.push(router)
+ })
+
+ var expected = nodeIds.length;
+ var addresses = new Folder("Addresses")
+ addresses.type = "Addresses"
+ //addresses.info = allAddressInfo
+ addresses.key = "Addresses"
+ $scope.overview.children.push(addresses)
+
+ var gotAddressFields = function (addressFields) {
+ 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
+ }
+ addressFields.forEach( function (address) {
+ var a = new Leaf(address.title)
+ //a.info = addressInfo
+ a.key = address.uid
+ a.fields = address
+ a.type = "Address"
+ addresses.children.push(a)
+ } )
+ }
+ getAllAddressFields(gotAddressFields)
+
+
+ var connreceived = 0;
+ var connectionsObj = {}
+ var connections = new Folder("Connections")
+ connections.type = "Connections"
+ //connections.info = allConnectionInfo
+ connections.key = "Connections"
+ $scope.overview.children.push(connections)
+ nodeIds.forEach( function (nodeId) {
+
+ QDRService.getNodeInfo(nodeId, ".connection", [], 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")
+ connectionsObj[host] = {}
+ response.attributeNames.forEach( function (attribute, i) {
+ connectionsObj[host][attribute] = result[i]
+ })
+ connectionsObj[host].security = sec
+ connectionsObj[host].authentication = auth
+ })
+ ++connreceived;
+ if (connreceived == expected) {
+ var allConnections = Object.keys(connectionsObj).sort()
+ allConnections.forEach(function (connection) {
+ var c = new Leaf(connection)
+ c.type = "Connection"
+ c.icon = "ui-icon "
+ c.icon += connectionsObj[connection].role === "inter-router" ? "ui-icon-refresh" : "ui-icon-transfer-e-w"
+ //c.info = connectionInfo
+ c.key = connection
+ c.fields = connectionsObj[connection]
+ c.tooltip = connectionsObj[connection].role === "inter-router" ? "inter-router connection" : "external connection"
+ connections.children.push(c)
+ })
+ }
+ })
+ })
+
+ var logsreceived = 0;
+ var logObj = {}
+ var logs = new Folder("Logs")
+ logs.type = "Logs"
+ //logs.info = allLogInfo
+ logs.key = "Logs"
+ //$scope.overview.children.push(logs)
+ nodeIds.forEach( function (nodeId) {
+ QDRService.getNodeInfo(nodeId, ".log", ["name"], function (nodeName, entity, response) {
+ response.results.forEach( function (result) {
+ logObj[result[0]] = 1 // use object to collapse duplicates
+ })
+ ++logsreceived;
+ if (logsreceived == expected) {
+ var allLogs = Object.keys(logObj).sort()
+ allLogs.forEach(function (log) {
+ var l = new Leaf(log)
+ l.type = "Log"
+ //l.info = logInfo
+ l.key = log
+ logs.children.push(l)
+ })
+ //console.log("---------------")
+ //console.dump($scope.overview.children)
+ //console.log("---------------")
+ $("#overtree").fancytree({
+ activate: activated,
+ clickFolderMode: 1,
+ source: $scope.overview.children
+ })
+ allRouterInfo();
+ }
+ })
+ })
+
+ $scope.$on("$destroy", function( event ) {
+ if (currentTimer) {
+ clearTimeout(currentTimer)
+ currentTimer = null;
+ }
+ });
+ var treeTypeMap = {
+ Routers: allRouterInfo,
+ Router: routerInfo,
+ Addresses: allAddressInfo,
+ Address: addressInfo,
+ Connections: allConnectionInfo,
+ Connection: connectionInfo
+ }
+
+ }]);
+
+ return QDR;
+
+}(QDR || {}));
+
http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/4940e63d/console/stand-alone/plugin/js/qdrPlugin.js
----------------------------------------------------------------------
diff --git a/console/stand-alone/plugin/js/qdrPlugin.js b/console/stand-alone/plugin/js/qdrPlugin.js
new file mode 100644
index 0000000..3d14f72
--- /dev/null
+++ b/console/stand-alone/plugin/js/qdrPlugin.js
@@ -0,0 +1,197 @@
+/*
+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 entrypoint for the QDR module
+ *
+ */
+var QDR = (function(QDR) {
+
+ /**
+ * @property pluginName
+ * @type {string}
+ *
+ * The name of this plugin
+ */
+ QDR.pluginName = "QDR";
+
+ /**
+ * @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 = "../dispatch/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(QDR.pluginName, ['ngAnimate', 'ngResource', 'ngRoute', 'ui.grid', 'ui.grid.selection',
+ 'ui.grid.autoResize', 'jsonFormatter', 'ui.bootstrap', 'ui.slider'/*, 'minicolors' */]);
+
+ // set up the routing for this plugin
+ QDR.module.config(function($routeProvider) {
+ $routeProvider
+ .when('/', {
+ templateUrl: QDR.templatePath + 'qdrConnect.html'
+ })
+ .when('/overview', {
+ templateUrl: QDR.templatePath + 'qdrOverview.html'
+ })
+ .when('/topology', {
+ templateUrl: QDR.templatePath + 'qdrTopology.html'
+ })
+ .when('/list', {
+ templateUrl: QDR.templatePath + 'qdrList.html'
+ })
+ .when('/schema', {
+ templateUrl: QDR.templatePath + 'qdrSchema.html'
+ })
+ .when('/charts', {
+ templateUrl: QDR.templatePath + 'qdrCharts.html'
+ })
+ .when('/connect', {
+ templateUrl: QDR.templatePath + 'qdrConnect.html'
+ })
+ });
+
+ QDR.module.config(['$compileProvider', function ($compileProvider) {
+ var cur = $compileProvider.aHrefSanitizationWhitelist();
+ $compileProvider.aHrefSanitizationWhitelist(/^\s*(https?|ftp|mailto|file|blob):/);
+ cur = $compileProvider.aHrefSanitizationWhitelist();
+ }]);
+
+ QDR.module.config(function (JSONFormatterConfigProvider) {
+ // Enable the hover preview feature
+ JSONFormatterConfigProvider.hoverPreviewEnabled = true;
+ });
+
+ QDR.module.filter('to_trusted', ['$sce', function($sce){
+ return function(text) {
+ return $sce.trustAsHtml(text);
+ };
+ }]);
+
+ QDR.module.filter('humanify', function (QDRService) {
+ return function (input) {
+ return QDRService.humanify(input);
+ };
+ });
+
+ 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", "$location", "$log", "QDRService", "QDRChartService", function ($rootScope, $location, $log, QDRService, QDRChartService) {
+ QDR.log = new QDR.logger($log);
+ QDR.log.debug("QDR.module.run()")
+
+ QDRService.initProton();
+ var settings = angular.fromJson(localStorage[QDR.SETTINGS_KEY]);
+ var lastLocation = localStorage[QDR.LAST_LOCATION];
+ if (!angular.isDefined(lastLocation))
+ lastLocation = "/overview";
+
+ QDRService.addConnectAction(function() {
+ QDRChartService.init(); // initialize charting service after we are connected
+ });
+ if (settings && settings.autostart) {
+ QDRService.addConnectAction(function() {
+ $location.path(lastLocation);
+ $location.replace();
+ $rootScope.$apply();
+ });
+ QDRService.connect(settings);
+ } else {
+ setTimeout(function () {
+ $location.url('/connect')
+ $location.replace();
+ }, 100)
+ }
+
+ $rootScope.$on('$routeChangeSuccess', function() {
+ localStorage[QDR.LAST_LOCATION] = $location.$$path;
+ });
+
+
+ }]);
+
+ QDR.module.controller ("QDR.MainController", ['$scope', '$location', function ($scope, $location) {
+ QDR.log.debug("started QDR.MainController with location.url: " + $location.url());
+ QDR.log.debug("started QDR.MainController with window.location.pathname : " + window.location.pathname);
+ $scope.topLevelTabs = [];
+ $scope.topLevelTabs.push({
+ id: "qdr",
+ content: "Qpid Dispatch Router Console",
+ title: "Dispatch Router Console",
+ isValid: function() { return true; },
+ href: function() { return "#connect"; },
+ isActive: function() { return true; }
+ });
+ }])
+
+ 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 || {}));
http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/4940e63d/console/stand-alone/plugin/js/qdrSchema.js
----------------------------------------------------------------------
diff --git a/console/stand-alone/plugin/js/qdrSchema.js b/console/stand-alone/plugin/js/qdrSchema.js
new file mode 100644
index 0000000..0e94351
--- /dev/null
+++ b/console/stand-alone/plugin/js/qdrSchema.js
@@ -0,0 +1,31 @@
+/*
+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) {
+
+ QDR.module.controller("QDR.SchemaController", ['$scope', 'QDRService', function($scope, QDRService) {
+
+ $scope.schema = QDRService.schema;
+
+ }]);
+
+ return QDR;
+}(QDR || {}));
http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/4940e63d/console/stand-alone/plugin/js/qdrService.js
----------------------------------------------------------------------
diff --git a/console/stand-alone/plugin/js/qdrService.js b/console/stand-alone/plugin/js/qdrService.js
new file mode 100644
index 0000000..47029d7
--- /dev/null
+++ b/console/stand-alone/plugin/js/qdrService.js
@@ -0,0 +1,742 @@
+/*
+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) {
+
+ // The QDR service handles the connection to
+ // the server in the background
+ QDR.module.factory("QDRService", ['$rootScope', '$http', '$resource', '$location', function($rootScope, $http, $resource, $location) {
+ 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);
+ action.apply();
+ });
+ self.connectActions = [];
+ },
+ executeDisconnectActions: function() {
+ self.disconnectActions.forEach(function(action) {
+ action.apply();
+ });
+ self.disconnectActions = [];
+ },
+ executeUpdatedActions: function() {
+ for (action in self.updatedActions) {
+ self.updatedActions[action].apply();
+ }
+ },
+
+ 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.gotTopology;
+ },
+
+ 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);
+ delete this._objects[correlationID];
+ }
+ },
+
+ onSubscription: function() {
+ self.getSchema();
+ self.topology.get();
+ },
+
+ startUpdating: function () {
+ QDR.log.info("startUpdating called")
+ self.stopUpdating();
+ self.topology.get();
+ self.stop = setInterval(function() {
+ self.topology.get();
+ }, 2000);
+ },
+ stopUpdating: function () {
+ if (angular.isDefined(self.stop)) {
+ QDR.log.info("stoptUpdating called")
+ clearInterval(self.stop);
+ self.stop = undefined;
+ }
+ },
+
+ initProton: function() {
+ //QDR.log.debug("*************QDR init proton called ************");
+ },
+ 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) {
+ 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;
+ },
+
+ /*
+ * 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) {
+ //QDR.log.debug("got remote node list of ");
+ //console.dump(response);
+ if( Object.prototype.toString.call( response ) === '[object Array]' ) {
+ // 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) {
+/*
+ for (var o in obj) {
+ QDR.log.debug("cleaning up");
+ console.dump(obj[o]);
+ if (isNaN(parseInt(o)))
+ this.cleanUp(obj[o]);
+ }
+*/
+ 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.debug("timed out waiting for management responses");
+ // note: can't use 'this' in a timeout handler
+ self.topology.dump("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);
+ },
+/*
+The response looks like:
+{
+ ".router": {
+ "results": [
+ [4, "router/QDR.X", 1, "0", 3, 60, 60, 11, "QDR.X", 30, "interior", "org.apache.qpid.dispatch.router", 5, 12, "router/QDR.X"]
+ ],
+ "attributeNames": ["raIntervalFlux", "name", "helloInterval", "area", "helloMaxAge", "mobileAddrMaxAge", "remoteLsMaxAge", "addrCount", "routerId", "raInterval", "mode", "type", "nodeCount", "linkCount", "identity"]
+ },
+ ".connection": {
+ "results": [
+ ["QDR.B", "connection/0.0.0.0:20002", "operational", "0.0.0.0:20002", "inter-router", "connection/0.0.0.0:20002", "ANONYMOUS", "org.apache.qpid.dispatch.connection", "out"],
+ ["QDR.A", "connection/0.0.0.0:20001", "operational", "0.0.0.0:20001", "inter-router", "connection/0.0.0.0:20001", "ANONYMOUS", "org.apache.qpid.dispatch.connection", "out"],
+ ["b2de2f8c-ef4a-4415-9a23-000c2f86e85d", "connection/localhost:33669", "operational", "localhost:33669", "normal", "connection/localhost:33669", "ANONYMOUS", "org.apache.qpid.dispatch.connection", "in"]
+ ],
+ "attributeNames": ["container", "name", "state", "host", "role", "identity", "sasl", "type", "dir"]
+ },
+ ".router.node": {
+ "results": [
+ ["QDR.A", null],
+ ["QDR.B", null],
+ ["QDR.C", "QDR.A"],
+ ["QDR.D", "QDR.A"],
+ ["QDR.Y", "QDR.A"]
+ ],
+ "attributeNames": ["routerId", "nextHop"]
+ }
+}*/
+ ondone: function () {
+ clearTimeout(this.timerHandle);
+ this._gettingTopo = false;
+ //this.miniDump();
+ //this.dump();
+ self.notifyTopologyDone();
+
+ },
+ dump: function (prefix) {
+ if (prefix)
+ QDR.log.debug(prefix);
+ QDR.log.debug("---");
+ for (var key in this._nodeInfo) {
+ QDR.log.debug(key);
+ console.dump(this._nodeInfo[key]);
+ QDR.log.debug("---");
+ }
+ QDR.log.debug("was still expecting:");
+ console.dump(this._expected);
+ },
+ miniDump: function (prefix) {
+ if (prefix)
+ QDR.log.debug(prefix);
+ QDR.log.debug("---");
+ console.dump(Object.keys(this._nodeInfo));
+ QDR.log.debug("---");
+ },
+ 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) {
+ callback(response);
+ 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) {
+ // TODO: file a bug against rhea - large numbers are coming back as Uint8Array
+ response.results.forEach( function (result) {
+ result.forEach( function (val, i) {
+ if (val instanceof Uint8Array) {
+ var ua2num = function(ua) {
+ var n = 0;
+ for (var i = 0; i<ua.length; i++) {
+ n *= 256;
+ n += ua[i];
+ }
+ return n;
+ }
+ result[i] = ua2num(val);
+ }
+ })
+ })
+ callback(nodeName, entity, response);
+ //self.topology.addNodeInfo(nodeName, entity, response);
+ //self.topology.cleanUp(response);
+ }, ret.error);
+ },
+
+ getMultipleNodeInfo: function (nodeNames, entity, attrs, callback, selectedNodeId) {
+ var responses = {};
+ var gotNodesResult = function (nodeName, dotentity, response) {
+ responses[nodeName] = response;
+ if (Object.keys(responses).length == nodeNames.length) {
+ aggregateNodeInfo(nodeNames, entity, responses, callback);
+ }
+ }
+
+ var aggregateNodeInfo = function (nodeNames, entity, 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: []})
+ })
+ newResponse.aggregates.push(vals)
+ }
+ })
+ })
+ callback(nodeNames, entity, newResponse);
+ }
+
+ nodeNames.forEach( function (id) {
+ self.getNodeInfo(id, '.'+entity, attrs, gotNodesResult);
+ })
+ //TODO: implement a timeout in case not all requests complete
+ },
+
+ 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");
+ self.schema = response;
+ //self.schema = angular.copy(response);
+ //self.topology.cleanUp(response);
+ self.notifyTopologyDone();
+ }, ret.error);
+ },
+
+ sendQuery: function(toAddr, entity, attrs) {
+ 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 body;
+ if (attrs)
+ body = {
+ "attributeNames": attrs,
+ }
+ else
+ body = {
+ "attributeNames": [],
+ }
+
+ return self._send(body, fullAddr, "QUERY", "org.apache.qpid.dispatch" + entity);
+ },
+
+ sendMgmtQuery: function (operation) {
+ // TODO: file bug against dispatch - We should be able to just pass body: [], but that generates an 'invalid body'
+ return self._send([' '], self.toAddress + "/$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();
+ },
+
+ connect: function(options) {
+ self.options = options;
+ 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();
+ if (self.connected) {
+ $rootScope.$broadcast('newAlert', { type: 'danger', msg: 'Connection to ' + baseAddress + " was lost. Retrying..." });
+ }
+ okay.sender = false;
+ okay.receiver = false;
+ okay.connected = false;
+ self.connected = false;
+ self.sender = null;
+ self.receiver = null;
+ self.sendable = 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();
+ $rootScope.$broadcast("clearAlerts");
+ }
+ }
+
+ QDR.log.debug("****** calling rhea.connect ********")
+ var connection = self.rhea.connect({
+ connection_details:ws('ws://' + baseAddress),
+ reconnect:true,
+ properties: {console_identifier: 'Dispatch console'}
+ });
+ 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.warn("disconnected");
+ stop();
+ self.errorText = "Error: Connection failed."
+ self.executeDisconnectActions();
+ self.connectionError = true;
+ })
+ connection.on('connection_close', function (context) { QDR.log.warn("connection_close"); stop()})
+
+ var sender = connection.open_sender("/$management");
+ 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 || {}));
+
+(function() {
+ console.dump = function(object) {
+ if (window.JSON && window.JSON.stringify)
+ console.log(JSON.stringify(object));
+ else
+ console.log(object);
+ };
+})();
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/4940e63d/console/stand-alone/plugin/js/qdrSettings.js
----------------------------------------------------------------------
diff --git a/console/stand-alone/plugin/js/qdrSettings.js b/console/stand-alone/plugin/js/qdrSettings.js
new file mode 100644
index 0000000..950e1c5
--- /dev/null
+++ b/console/stand-alone/plugin/js/qdrSettings.js
@@ -0,0 +1,115 @@
+/*
+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) {
+
+ /**
+ * @method SettingsController
+ * @param $scope
+ * @param QDRServer
+ *
+ * Controller that handles the QDR settings page
+ */
+ QDR.module.controller("QDR.SettingsController", ['$scope', 'QDRService', '$location', function($scope, QDRService, $location) {
+
+ $scope.connecting = false;
+ $scope.connectionError = false;
+ $scope.connectionErrorText = undefined;
+ $scope.forms = {};
+
+ $scope.formEntity = angular.fromJson(localStorage[QDR.SETTINGS_KEY]) || {address: '', port: '', username: '', password: '', autostart: false};
+ $scope.formConfig = {
+ properties: {
+ address: {
+ description: "Router address",
+ 'type': 'java.lang.String',
+ required: true
+ },
+ port: {
+ description: 'Router port',
+ 'type': 'Integer',
+ tooltip: 'Ports to connect to, by default 5672'
+ },
+ username: {
+ description: 'User Name',
+ 'type': 'java.lang.String'
+ },
+ password: {
+ description: 'Password',
+ 'type': 'password'
+ },
+ /*
+ useSSL: {
+ description: 'SSL',
+ 'type': 'boolean'
+ },*/
+ autostart: {
+ description: 'Connect at startup',
+ 'type': 'boolean',
+ tooltip: 'Whether or not the connection should be started as soon as you log into hawtio'
+ }
+ }
+ };
+
+ $scope.$watch('formEntity', function(newValue, oldValue) {
+ if (newValue !== oldValue) {
+ localStorage[QDR.SETTINGS_KEY] = angular.toJson(newValue);
+ }
+ }, true);
+
+ $scope.buttonText = function() {
+ if (QDRService.isConnected()) {
+ return "Reconnect";
+ } else {
+ return "Connect";
+ }
+ };
+
+
+ $scope.connect = function() {
+ if ($scope.settings.$valid) {
+ $scope.connectionError = false;
+ $scope.connecting = true;
+ console.log("attempting to connect");
+ QDRService.addDisconnectAction(function() {
+ //QDR.log.debug("disconnect action called");
+ $scope.connecting = false;
+ $scope.connectionErrorText = QDRService.errorText;
+ $scope.connectionError = true;
+ $scope.$apply();
+ });
+ QDRService.addConnectAction(function() {
+ //QDR.log.debug("got connection notification");
+ $scope.connecting = false;
+ //console.log("we were on connect page. let's switch to topo now that we are connected");
+ //QDR.log.debug("location before the connect " + $location.path());
+ $location.path("/overview");
+ //QDR.log.debug("location after the connect " + $location.path());
+ $scope.$apply();
+ });
+ QDRService.connect($scope.formEntity);
+ }
+ };
+
+ }]);
+
+ return QDR;
+}(QDR || {}));
---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@qpid.apache.org
For additional commands, e-mail: commits-help@qpid.apache.org
[11/19] qpid-dispatch git commit: moved standalone to a subdir
Posted by ea...@apache.org.
http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/4940e63d/console/plugin/lib/json-formatter-min.js
----------------------------------------------------------------------
diff --git a/console/plugin/lib/json-formatter-min.js b/console/plugin/lib/json-formatter-min.js
deleted file mode 100644
index 89ccb72..0000000
--- a/console/plugin/lib/json-formatter-min.js
+++ /dev/null
@@ -1,7 +0,0 @@
-/*!
- * jsonformatter
- *
- * Version: 0.4.1 - 2015-12-03T03:38:59.925Z
- * License: MIT
- */
-"use strict";angular.module("jsonFormatter",["RecursionHelper"]).provider("JSONFormatterConfig",function(){var n=!1,e=100,t=5;return{get hoverPreviewEnabled(){return n},set hoverPreviewEnabled(e){n=!!e},get hoverPreviewArrayCount(){return e},set hoverPreviewArrayCount(n){e=parseInt(n,10)},get hoverPreviewFieldCount(){return t},set hoverPreviewFieldCount(n){t=parseInt(n,10)},$get:function(){return{hoverPreviewEnabled:n,hoverPreviewArrayCount:e,hoverPreviewFieldCount:t}}}}).directive("jsonFormatter",["RecursionHelper","JSONFormatterConfig",function(n,e){function t(n){return n.replace('"','"')}function r(n){if(void 0===n)return"";if(null===n)return"Object";if("object"==typeof n&&!n.constructor)return"Object";var e=/function (.{1,})\(/,t=e.exec(n.constructor.toString());return t&&t.length>1?t[1]:""}function o(n){return null===n?"null":typeof n}function s(n,e){var r=o(n);return"null"===r||"undefined"===r?r:("string"===r&&(e='"'+t(e)+'"'),"function"===r?n.toString().replace(/[\r\n]/g,"").
replace(/\{.*\}/,"")+"{…}":e)}function i(n){var e="";return angular.isObject(n)?(e=r(n),angular.isArray(n)&&(e+="["+n.length+"]")):e=s(n,n),e}function a(n){n.isArray=function(){return angular.isArray(n.json)},n.isObject=function(){return angular.isObject(n.json)},n.getKeys=function(){return n.isObject()?Object.keys(n.json).map(function(n){return""===n?'""':n}):void 0},n.type=o(n.json),n.hasKey="undefined"!=typeof n.key,n.getConstructorName=function(){return r(n.json)},"string"===n.type&&("Invalid Date"!==new Date(n.json).toString()&&(n.isDate=!0),0===n.json.indexOf("http")&&(n.isUrl=!0)),n.isEmptyObject=function(){return n.getKeys()&&!n.getKeys().length&&n.isOpen&&!n.isArray()},n.isOpen=!!n.open,n.toggleOpen=function(){n.isOpen=!n.isOpen},n.childrenOpen=function(){return n.open>1?n.open-1:0},n.openLink=function(e){e&&(window.location.href=n.json)},n.parseValue=function(e){return s(n.json,e)},n.showThumbnail=function(){return!!e.hoverPreviewEnabled&&n.isObject()&&!n.isOpen},n.getTh
umbnail=function(){if(n.isArray())return n.json.length>e.hoverPreviewArrayCount?"Array["+n.json.length+"]":"["+n.json.map(i).join(", ")+"]";var t=n.getKeys(),r=t.slice(0,e.hoverPreviewFieldCount),o=r.map(function(e){return e+":"+i(n.json[e])}),s=t.length>=5?"…":"";return"{"+o.join(", ")+s+"}"}}return{templateUrl:"json-formatter.html",restrict:"E",replace:!0,scope:{json:"=",key:"=",open:"="},compile:function(e){return n.compile(e,a)}}}]),"object"==typeof module&&(module.exports="jsonFormatter"),angular.module("RecursionHelper",[]).factory("RecursionHelper",["$compile",function(n){return{compile:function(e,t){angular.isFunction(t)&&(t={post:t});var r,o=e.contents().remove();return{pre:t&&t.pre?t.pre:null,post:function(e,s){r||(r=n(o)),r(e,function(n){s.append(n)}),t&&t.post&&t.post.apply(null,arguments)}}}}}]),angular.module("jsonFormatter").run(["$templateCache",function(n){n.put("json-formatter.html",'<div ng-init="isOpen = open && open > 0" class="json-formatter-row"><a ng-click=
"toggleOpen()"><span class="toggler {{isOpen ? \'open\' : \'\'}}" ng-if="isObject()"></span> <span class="key" ng-if="hasKey"><span class="key-text">{{key}}</span><span class="colon">:</span></span> <span class="value"><span ng-if="isObject()"><span class="constructor-name">{{getConstructorName(json)}}</span> <span ng-if="isArray()"><span class="bracket">[</span><span class="number">{{json.length}}</span><span class="bracket">]</span></span></span> <span ng-if="!isObject()" ng-click="openLink(isUrl)" class="{{type}}" ng-class="{date: isDate, url: isUrl}">{{parseValue(json)}}</span></span> <span ng-if="showThumbnail()" class="thumbnail-text">{{getThumbnail()}}</span></a><div class="children" ng-if="getKeys().length && isOpen"><json-formatter ng-repeat="key in getKeys() track by $index" json="json[key]" key="key" open="childrenOpen()"></json-formatter></div><div class="children empty object" ng-if="isEmptyObject()"></div><div class="children empty array" ng-if="getKeys() && !getKeys()
.length && isOpen && isArray()"></div></div>')}]);
\ 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
[19/19] qpid-dispatch git commit: DISPATCH-201: removed LICENSE file.
No 3rd party files are being distributed
Posted by ea...@apache.org.
DISPATCH-201: removed LICENSE file. No 3rd party files are being distributed
Project: http://git-wip-us.apache.org/repos/asf/qpid-dispatch/repo
Commit: http://git-wip-us.apache.org/repos/asf/qpid-dispatch/commit/06c2538a
Tree: http://git-wip-us.apache.org/repos/asf/qpid-dispatch/tree/06c2538a
Diff: http://git-wip-us.apache.org/repos/asf/qpid-dispatch/diff/06c2538a
Branch: refs/heads/master
Commit: 06c2538af6eefe5388a6a74011edb79f55a2d442
Parents: 4940e63
Author: Ernest Allen <ea...@redhat.com>
Authored: Thu Feb 18 13:04:06 2016 -0500
Committer: Ernest Allen <ea...@redhat.com>
Committed: Thu Feb 18 13:04:06 2016 -0500
----------------------------------------------------------------------
console/LICENSE | 265 ---------------------------------------------------
1 file changed, 265 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/06c2538a/console/LICENSE
----------------------------------------------------------------------
diff --git a/console/LICENSE b/console/LICENSE
deleted file mode 100644
index fc915e4..0000000
--- a/console/LICENSE
+++ /dev/null
@@ -1,265 +0,0 @@
- Apache License
- Version 2.0, January 2004
- http://www.apache.org/licenses/
-
- TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
-
- 1. Definitions.
-
- "License" shall mean the terms and conditions for use, reproduction,
- and distribution as defined by Sections 1 through 9 of this document.
-
- "Licensor" shall mean the copyright owner or entity authorized by
- the copyright owner that is granting the License.
-
- "Legal Entity" shall mean the union of the acting entity and all
- other entities that control, are controlled by, or are under common
- control with that entity. For the purposes of this definition,
- "control" means (i) the power, direct or indirect, to cause the
- direction or management of such entity, whether by contract or
- otherwise, or (ii) ownership of fifty percent (50%) or more of the
- outstanding shares, or (iii) beneficial ownership of such entity.
-
- "You" (or "Your") shall mean an individual or Legal Entity
- exercising permissions granted by this License.
-
- "Source" form shall mean the preferred form for making modifications,
- including but not limited to software source code, documentation
- source, and configuration files.
-
- "Object" form shall mean any form resulting from mechanical
- transformation or translation of a Source form, including but
- not limited to compiled object code, generated documentation,
- and conversions to other media types.
-
- "Work" shall mean the work of authorship, whether in Source or
- Object form, made available under the License, as indicated by a
- copyright notice that is included in or attached to the work
- (an example is provided in the Appendix below).
-
- "Derivative Works" shall mean any work, whether in Source or Object
- form, that is based on (or derived from) the Work and for which the
- editorial revisions, annotations, elaborations, or other modifications
- represent, as a whole, an original work of authorship. For the purposes
- of this License, Derivative Works shall not include works that remain
- separable from, or merely link (or bind by name) to the interfaces of,
- the Work and Derivative Works thereof.
-
- "Contribution" shall mean any work of authorship, including
- the original version of the Work and any modifications or additions
- to that Work or Derivative Works thereof, that is intentionally
- submitted to Licensor for inclusion in the Work by the copyright owner
- or by an individual or Legal Entity authorized to submit on behalf of
- the copyright owner. For the purposes of this definition, "submitted"
- means any form of electronic, verbal, or written communication sent
- to the Licensor or its representatives, including but not limited to
- communication on electronic mailing lists, source code control systems,
- and issue tracking systems that are managed by, or on behalf of, the
- Licensor for the purpose of discussing and improving the Work, but
- excluding communication that is conspicuously marked or otherwise
- designated in writing by the copyright owner as "Not a Contribution."
-
- "Contributor" shall mean Licensor and any individual or Legal Entity
- on behalf of whom a Contribution has been received by Licensor and
- subsequently incorporated within the Work.
-
- 2. Grant of Copyright License. Subject to the terms and conditions of
- this License, each Contributor hereby grants to You a perpetual,
- worldwide, non-exclusive, no-charge, royalty-free, irrevocable
- copyright license to reproduce, prepare Derivative Works of,
- publicly display, publicly perform, sublicense, and distribute the
- Work and such Derivative Works in Source or Object form.
-
- 3. Grant of Patent License. Subject to the terms and conditions of
- this License, each Contributor hereby grants to You a perpetual,
- worldwide, non-exclusive, no-charge, royalty-free, irrevocable
- (except as stated in this section) patent license to make, have made,
- use, offer to sell, sell, import, and otherwise transfer the Work,
- where such license applies only to those patent claims licensable
- by such Contributor that are necessarily infringed by their
- Contribution(s) alone or by combination of their Contribution(s)
- with the Work to which such Contribution(s) was submitted. If You
- institute patent litigation against any entity (including a
- cross-claim or counterclaim in a lawsuit) alleging that the Work
- or a Contribution incorporated within the Work constitutes direct
- or contributory patent infringement, then any patent licenses
- granted to You under this License for that Work shall terminate
- as of the date such litigation is filed.
-
- 4. Redistribution. You may reproduce and distribute copies of the
- Work or Derivative Works thereof in any medium, with or without
- modifications, and in Source or Object form, provided that You
- meet the following conditions:
-
- (a) You must give any other recipients of the Work or
- Derivative Works a copy of this License; and
-
- (b) You must cause any modified files to carry prominent notices
- stating that You changed the files; and
-
- (c) You must retain, in the Source form of any Derivative Works
- that You distribute, all copyright, patent, trademark, and
- attribution notices from the Source form of the Work,
- excluding those notices that do not pertain to any part of
- the Derivative Works; and
-
- (d) If the Work includes a "NOTICE" text file as part of its
- distribution, then any Derivative Works that You distribute must
- include a readable copy of the attribution notices contained
- within such NOTICE file, excluding those notices that do not
- pertain to any part of the Derivative Works, in at least one
- of the following places: within a NOTICE text file distributed
- as part of the Derivative Works; within the Source form or
- documentation, if provided along with the Derivative Works; or,
- within a display generated by the Derivative Works, if and
- wherever such third-party notices normally appear. The contents
- of the NOTICE file are for informational purposes only and
- do not modify the License. You may add Your own attribution
- notices within Derivative Works that You distribute, alongside
- or as an addendum to the NOTICE text from the Work, provided
- that such additional attribution notices cannot be construed
- as modifying the License.
-
- You may add Your own copyright statement to Your modifications and
- may provide additional or different license terms and conditions
- for use, reproduction, or distribution of Your modifications, or
- for any such Derivative Works as a whole, provided Your use,
- reproduction, and distribution of the Work otherwise complies with
- the conditions stated in this License.
-
- 5. Submission of Contributions. Unless You explicitly state otherwise,
- any Contribution intentionally submitted for inclusion in the Work
- by You to the Licensor shall be under the terms and conditions of
- this License, without any additional terms or conditions.
- Notwithstanding the above, nothing herein shall supersede or modify
- the terms of any separate license agreement you may have executed
- with Licensor regarding such Contributions.
-
- 6. Trademarks. This License does not grant permission to use the trade
- names, trademarks, service marks, or product names of the Licensor,
- except as required for reasonable and customary use in describing the
- origin of the Work and reproducing the content of the NOTICE file.
-
- 7. Disclaimer of Warranty. Unless required by applicable law or
- agreed to in writing, Licensor provides the Work (and each
- Contributor provides its Contributions) on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
- implied, including, without limitation, any warranties or conditions
- of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
- PARTICULAR PURPOSE. You are solely responsible for determining the
- appropriateness of using or redistributing the Work and assume any
- risks associated with Your exercise of permissions under this License.
-
- 8. Limitation of Liability. In no event and under no legal theory,
- whether in tort (including negligence), contract, or otherwise,
- unless required by applicable law (such as deliberate and grossly
- negligent acts) or agreed to in writing, shall any Contributor be
- liable to You for damages, including any direct, indirect, special,
- incidental, or consequential damages of any character arising as a
- result of this License or out of the use or inability to use the
- Work (including but not limited to damages for loss of goodwill,
- work stoppage, computer failure or malfunction, or any and all
- other commercial damages or losses), even if such Contributor
- has been advised of the possibility of such damages.
-
- 9. Accepting Warranty or Additional Liability. While redistributing
- the Work or Derivative Works thereof, You may choose to offer,
- and charge a fee for, acceptance of support, warranty, indemnity,
- or other liability obligations and/or rights consistent with this
- License. However, in accepting such obligations, You may act only
- on Your own behalf and on Your sole responsibility, not on behalf
- of any other Contributor, and only if You agree to indemnify,
- defend, and hold each Contributor harmless for any liability
- incurred by, or claims asserted against, such Contributor by reason
- of your accepting any such warranty or additional liability.
-
- END OF TERMS AND CONDITIONS
-
- APPENDIX: How to apply the Apache License to your work.
-
- To apply the Apache License to your work, attach the following
- boilerplate notice, with the fields enclosed by brackets "[]"
- replaced with your own identifying information. (Don't include
- the brackets!) The text should be enclosed in the appropriate
- comment syntax for the file format. We also recommend that a
- file or class name and description of purpose be included on the
- same "printed page" as the copyright notice for easier
- identification within third-party archives.
-
- Copyright [yyyy] [name of copyright owner]
-
- 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.
-
-
-
-###############################################
-# Third Party Dependency Licensing Information:
-###############################################
-
-This product bundles
-// tipsy, facebook style tooltips for jquery
-// version 1.0.2
-// (c) 2008-2010 jason frame [jason@onehackoranother.com]
-// released under the MIT license
-
-/*!
- * jsonformatter
- *
- * Version: 0.4.1 - 2015-12-03T03:38:59.925Z
- * License: MIT
- */
-
-/* ui-dynatree
-Licensed under MIT and GPL
-see https://code.google.com/p/dynatree/wiki/LicenseInfo
-*/
-
-/*
- jQuery UI Slider plugin wrapper
-
- Source: https://github.com/angular-ui/ui-slider/blob/master/src/slider.js
- License: MIT
-
-*/
-
-This product loads but does not bundle the following javascript libraries:
-angularjs, bootstrap, jquery which use the MIT license.
-
-the MIT licence:
-
-Copyright (c) 2004-2013 QOS.ch
-All rights reserved.
-
-Permission is hereby granted, free of charge, to any person obtaining
-a copy of this software and associated documentation files (the
-"Software"), to deal in the Software without restriction, including
-without limitation the rights to use, copy, modify, merge, publish,
-distribute, sublicense, and/or sell copies of the Software, and to
-permit persons to whom the Software is furnished to do so, subject to
-the following conditions:
-
-The above copyright notice and this permission notice shall be
-included in all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-
-d3.js is loaded but not bundled. It's license is @ https://github.com/mbostock/d3/blob/master/LICENSE
-jquery.fancytree is loaded but not bundled. It's license is @ https://github.com/mar10/fancytree/blob/master/LICENSE.txt
-
-
---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@qpid.apache.org
For additional commands, e-mail: commits-help@qpid.apache.org
[15/19] qpid-dispatch git commit: moved standalone to a subdir
Posted by ea...@apache.org.
http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/4940e63d/console/plugin/data/world-110m.json
----------------------------------------------------------------------
diff --git a/console/plugin/data/world-110m.json b/console/plugin/data/world-110m.json
deleted file mode 100644
index a1ce852..0000000
--- a/console/plugin/data/world-110m.json
+++ /dev/null
@@ -1 +0,0 @@
-{"type":"Topology","transform":{"scale":[0.0036000360003600037,0.0016925586033320111],"translate":[-180,-85.60903777459777]},"objects":{"land":{"type":"MultiPolygon","arcs":[[[0]],[[1]],[[2]],[[3]],[[4]],[[5]],[[6]],[[7,8,9]],[[10,11]],[[12]],[[13]],[[14]],[[15]],[[16]],[[17]],[[18]],[[19]],[[20]],[[21]],[[22]],[[23]],[[24]],[[25]],[[26]],[[27]],[[28]],[[29,30]],[[31]],[[32]],[[33]],[[34]],[[35]],[[36]],[[37]],[[38]],[[39]],[[40]],[[41]],[[42,43]],[[44]],[[45]],[[46]],[[47,48,49,50]],[[51]],[[52]],[[53]],[[54]],[[55]],[[56]],[[57]],[[58]],[[59]],[[60]],[[61]],[[62,63]],[[64]],[[65]],[[66]],[[67]],[[68]],[[69]],[[70]],[[71]],[[72]],[[73]],[[74]],[[75]],[[76,77]],[[78]],[[79]],[[80]],[[81]],[[82]],[[83]],[[84]],[[85]],[[86]],[[87]],[[88]],[[89]],[[90,91]],[[92]],[[93]],[[94]],[[95]],[[96]],[[97]],[[98]],[[99]],[[100]],[[101]],[[102]],[[103]],[[104]],[[105]],[[106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137
,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221]],[[222,223]],[[224]],[[225]],[[226]],[[227]],[[228]],[[229]],[[230,231,232,233]],[[234]],[[235]],[[236]],[[237]],[[238]],[[239]],[[240]],[[241]],[[242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,
370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,456,457,458,459,460,461,462,463,464,465,466,467,468,469,470,471,472,473,474,475,476,477],[478,479,480,481,482,483,484]],[[485]],[[486]],[[487]],[[488]],[[489]],[[490]],[[491]],[[492]],[[493]],[[494]],[[495]],[[496]],[[497]],[[498]]]},"countries":{"type":"GeometryCollection","geometries":[{"type":"Polygon","arcs":[[499,500,501,502,503,504]],"id":4},{"type":"MultiPolygon","arcs":[[[505,506,352,507]],[[354,508,509]]],"id":24},{"type":"Polygon","arcs":[[510,511,414,512,513,514]],"id":8},{"type":"Polygon","arcs":[[312,515,314,516,517]],"id":784},{"type":"MultiPolygon","arcs":[[[518,11]],[[519,520,521,166,522,168,523,524]]],"id":32},{"type":"Polygon",
"arcs":[[525,526,527,528,529]],"id":51},{"type":"MultiPolygon","arcs":[[[0]],[[1]],[[2]],[[3]],[[4]],[[5]],[[6]],[[530,531]]],"id":10},{"type":"Polygon","arcs":[[13]],"id":260},{"type":"MultiPolygon","arcs":[[[14]],[[24]]],"id":36},{"type":"Polygon","arcs":[[532,533,534,535,536,537,538]],"id":40},{"type":"MultiPolygon","arcs":[[[539,-528]],[[484,540,479,541,-526,542,543]]],"id":31},{"type":"Polygon","arcs":[[544,545,546]],"id":108},{"type":"Polygon","arcs":[[547,548,549,550,437]],"id":56},{"type":"Polygon","arcs":[[551,552,553,554,366]],"id":204},{"type":"Polygon","arcs":[[555,556,557,-553,558,559]],"id":854},{"type":"Polygon","arcs":[[560,561,289,562]],"id":50},{"type":"Polygon","arcs":[[563,404,564,565,566,567]],"id":100},{"type":"MultiPolygon","arcs":[[[71]],[[73]],[[74]]],"id":44},{"type":"Polygon","arcs":[[568,569,570]],"id":70},{"type":"Polygon","arcs":[[571,572,573,574,575]],"id":112},{"type":"Polygon","arcs":[[576,145,577]],"id":84},{"type":"Polygon","arcs":[[578,579,580,581
,-525]],"id":68},{"type":"Polygon","arcs":[[-521,582,-581,583,584,585,586,587,588,164,589]],"id":76},{"type":"Polygon","arcs":[[48,590]],"id":96},{"type":"Polygon","arcs":[[591,592]],"id":64},{"type":"Polygon","arcs":[[593,594,595,596]],"id":72},{"type":"Polygon","arcs":[[597,598,599,600,601,602,603]],"id":140},{"type":"MultiPolygon","arcs":[[[84]],[[85]],[[86]],[[87]],[[88]],[[96]],[[97]],[[99]],[[101]],[[103]],[[604,107,605,109,606,111,607,113,608,115,609,117,610,199,611,201,612,215,613,217,614,219,615,221]],[[616,223]],[[224]],[[225]],[[226]],[[227]],[[229]],[[230,617,232,618]],[[235]],[[237]],[[238]],[[240]],[[241]],[[485]],[[486]],[[488]],[[489]],[[490]],[[496]],[[497]]],"id":124},{"type":"Polygon","arcs":[[-536,619,620,621]],"id":756},{"type":"MultiPolygon","arcs":[[[-519,622,623,624]],[[-524,169,625,171,626,-579]]],"id":152},{"type":"MultiPolygon","arcs":[[[64]],[[627,274,628,276,629,278,630,280,631,632,633,634,635,-593,636,637,638,639,-503,640,641,642,643,644,645]]],"id":156
},{"type":"Polygon","arcs":[[369,646,647,648,-556,649]],"id":384},{"type":"Polygon","arcs":[[650,651,652,359,653,654,655,656,-604,657]],"id":120},{"type":"Polygon","arcs":[[658,659,-545,660,661,662,663,-508,353,-510,664,-602,665]],"id":180},{"type":"Polygon","arcs":[[-509,355,666,-658,-603,-665]],"id":178},{"type":"Polygon","arcs":[[667,174,668,155,669,-585,670]],"id":170},{"type":"Polygon","arcs":[[178,671,151,672]],"id":188},{"type":"Polygon","arcs":[[70]],"id":192},{"type":"Polygon","arcs":[[77,673]],"id":-99},{"type":"Polygon","arcs":[[76,-674]],"id":196},{"type":"Polygon","arcs":[[-538,674,675,676]],"id":203},{"type":"Polygon","arcs":[[445,677,-675,-537,-622,678,679,-549,680,441,681]],"id":276},{"type":"Polygon","arcs":[[337,682,683,684]],"id":262},{"type":"MultiPolygon","arcs":[[[92]],[[-682,442,685,444]]],"id":208},{"type":"Polygon","arcs":[[62,686]],"id":214},{"type":"Polygon","arcs":[[687,688,689,690,691,384,692,693]],"id":12},{"type":"Polygon","arcs":[[173,-668,694]],"id":
218},{"type":"Polygon","arcs":[[333,695,696,390,697]],"id":818},{"type":"Polygon","arcs":[[698,699,700,336,-685]],"id":232},{"type":"Polygon","arcs":[[431,701,433,702,427,703,429,704]],"id":724},{"type":"Polygon","arcs":[[450,705,706]],"id":233},{"type":"Polygon","arcs":[[-684,707,708,709,710,711,712,-699]],"id":231},{"type":"Polygon","arcs":[[713,452,714,715,455,716,717]],"id":246},{"type":"MultiPolygon","arcs":[[[18]],[[19]],[[20]]],"id":242},{"type":"Polygon","arcs":[[12]],"id":238},{"type":"MultiPolygon","arcs":[[[718,719,163,-589]],[[82]],[[720,-679,-621,721,426,-703,434,722,436,-551]]],"id":250},{"type":"Polygon","arcs":[[356,723,-651,-667]],"id":266},{"type":"MultiPolygon","arcs":[[[724,90]],[[725,726,727,728,729,730,731,732]]],"id":826},{"type":"Polygon","arcs":[[400,733,-543,-530,734]],"id":268},{"type":"Polygon","arcs":[[368,-650,-560,735]],"id":288},{"type":"Polygon","arcs":[[736,737,374,738,739,740,-648]],"id":324},{"type":"Polygon","arcs":[[741,377]],"id":270},{"type":"
Polygon","arcs":[[375,742,-739]],"id":624},{"type":"Polygon","arcs":[[357,-652,-724]],"id":226},{"type":"MultiPolygon","arcs":[[[78]],[[407,743,409,744,411,745,413,-512,746,-566,747]]],"id":300},{"type":"Polygon","arcs":[[498]],"id":304},{"type":"Polygon","arcs":[[185,748,-578,146,749,750]],"id":320},{"type":"Polygon","arcs":[[161,751,-587,752]],"id":328},{"type":"Polygon","arcs":[[182,753,754,-750,147,755,149,756]],"id":340},{"type":"Polygon","arcs":[[757,-571,758,417,759,419,760,761]],"id":191},{"type":"Polygon","arcs":[[-687,63]],"id":332},{"type":"Polygon","arcs":[[-533,762,763,764,765,-762,766]],"id":348},{"type":"MultiPolygon","arcs":[[[26]],[[767,30]],[[31]],[[32]],[[35]],[[36]],[[39]],[[40]],[[768,43]],[[44]],[[45]],[[769,50]],[[46]]],"id":360},{"type":"Polygon","arcs":[[-639,770,-637,-592,-636,771,-563,290,772,292,773,294,774,296,775]],"id":356},{"type":"Polygon","arcs":[[91,-725]],"id":372},{"type":"Polygon","arcs":[[776,-505,777,300,778,302,779,780,781,-540,-527,-542,480]
],"id":364},{"type":"Polygon","arcs":[[782,783,784,785,786,-781,787]],"id":368},{"type":"Polygon","arcs":[[100]],"id":352},{"type":"Polygon","arcs":[[788,789,-698,391,790,791,792]],"id":376},{"type":"MultiPolygon","arcs":[[[79]],[[80]],[[793,421,794,423,795,425,-722,-620,-535]]],"id":380},{"type":"Polygon","arcs":[[61]],"id":388},{"type":"Polygon","arcs":[[796,-785,797,332,-790,798,-793]],"id":400},{"type":"MultiPolygon","arcs":[[[75]],[[81]],[[83]]],"id":392},{"type":"Polygon","arcs":[[799,800,482,801,-643,802]],"id":398},{"type":"Polygon","arcs":[[342,803,804,805,-710,806]],"id":404},{"type":"Polygon","arcs":[[-803,-642,807,808]],"id":417},{"type":"Polygon","arcs":[[809,810,811,283]],"id":116},{"type":"Polygon","arcs":[[265,812,267,813]],"id":410},{"type":"Polygon","arcs":[[-515,814,815,816]],"id":-99},{"type":"Polygon","arcs":[[304,817,-783]],"id":414},{"type":"Polygon","arcs":[[818,819,-634,820,-811]],"id":418},{"type":"Polygon","arcs":[[-791,392,821]],"id":422},{"type":"Polygon
","arcs":[[370,822,372,823,-737,-647]],"id":430},{"type":"Polygon","arcs":[[824,-694,825,388,826,-697,827,828]],"id":434},{"type":"Polygon","arcs":[[52]],"id":144},{"type":"Polygon","arcs":[[829]],"id":426},{"type":"Polygon","arcs":[[830,448,831,-572,832]],"id":440},{"type":"Polygon","arcs":[[-680,-721,-550]],"id":442},{"type":"Polygon","arcs":[[449,-707,833,-573,-832]],"id":428},{"type":"Polygon","arcs":[[-692,834,835,836,837,383]],"id":504},{"type":"Polygon","arcs":[[838,839]],"id":498},{"type":"Polygon","arcs":[[23]],"id":450},{"type":"Polygon","arcs":[[840,-577,-749,186,841,188,842,190,843,192,844,194,845]],"id":484},{"type":"Polygon","arcs":[[-817,846,-567,-747,-511]],"id":807},{"type":"Polygon","arcs":[[847,-689,848,-557,-649,-741,849]],"id":466},{"type":"Polygon","arcs":[[287,-561,-772,-635,-820,850]],"id":104},{"type":"Polygon","arcs":[[416,-759,-570,851,-815,-514,852]],"id":499},{"type":"Polygon","arcs":[[853,-645]],"id":496},{"type":"Polygon","arcs":[[854,344,855,856,347,8
57,858,859,860,861,862]],"id":508},{"type":"Polygon","arcs":[[863,379,864,-690,-848]],"id":478},{"type":"Polygon","arcs":[[-863,865,866]],"id":454},{"type":"MultiPolygon","arcs":[[[285,867]],[[-770,47,-591,49]]],"id":458},{"type":"Polygon","arcs":[[351,-507,868,-595,869]],"id":516},{"type":"Polygon","arcs":[[17]],"id":540},{"type":"Polygon","arcs":[[-558,-849,-688,-825,870,-656,871,-554]],"id":562},{"type":"Polygon","arcs":[[361,872,363,873,365,-555,-872,-655]],"id":566},{"type":"Polygon","arcs":[[179,874,181,-757,150,-672]],"id":558},{"type":"Polygon","arcs":[[-681,-548,438,875,440]],"id":528},{"type":"MultiPolygon","arcs":[[[876,-718,877,457,878,459,879,461]],[[487]],[[492]],[[493]]],"id":578},{"type":"Polygon","arcs":[[-771,-638]],"id":524},{"type":"MultiPolygon","arcs":[[[15]],[[16]]],"id":554},{"type":"MultiPolygon","arcs":[[[880,319,881,882,883,-517,315,884,317]],[[-516,313]]],"id":512},{"type":"Polygon","arcs":[[-640,-776,297,885,299,-778,-504]],"id":586},{"type":"Polygon","a
rcs":[[175,886,177,-673,152,887,154,-669]],"id":591},{"type":"Polygon","arcs":[[-627,172,-695,-671,-584,-580]],"id":604},{"type":"MultiPolygon","arcs":[[[51]],[[54]],[[55]],[[56]],[[57]],[[58]],[[59]]],"id":608},{"type":"MultiPolygon","arcs":[[[37]],[[38]],[[-769,42]],[[41]]],"id":598},{"type":"Polygon","arcs":[[-678,446,888,-833,-576,889,890,-676]],"id":616},{"type":"Polygon","arcs":[[60]],"id":630},{"type":"Polygon","arcs":[[262,891,264,-814,892,269,893,271,894,273,-628,895]],"id":408},{"type":"Polygon","arcs":[[-705,430]],"id":620},{"type":"Polygon","arcs":[[-582,-583,-520]],"id":600},{"type":"Polygon","arcs":[[-799,-789]],"id":275},{"type":"Polygon","arcs":[[308,896,310,897]],"id":634},{"type":"Polygon","arcs":[[898,-840,899,403,-564,900,-765]],"id":642},{"type":"MultiPolygon","arcs":[[[89]],[[-889,447,-831]],[[102]],[[104]],[[105]],[[228]],[[234]],[[236]],[[239]],[[901,243,902,245,903,247,904,249,905,251,906,253,907,255,908,257,909,259,910,261,-896,-646,-854,-644,-802,483,-544,
-734,401,911,-574,-834,-706,451,-714,-877,912,913,914,915,464,916,466,917,468,918,470,919,920,473,921,475,922,477]],[[491]],[[494]],[[495]]],"id":643},{"type":"Polygon","arcs":[[923,-546,-660,924]],"id":646},{"type":"Polygon","arcs":[[-691,-865,380,-835]],"id":732},{"type":"Polygon","arcs":[[925,329,926,331,-798,-784,-818,305,927,307,-898,311,-518,-884,928]],"id":682},{"type":"Polygon","arcs":[[-599,929,-828,-696,334,-700,-713,930,931,932]],"id":729},{"type":"Polygon","arcs":[[-711,-806,933,-666,-601,934,-932,935]],"id":728},{"type":"Polygon","arcs":[[378,-864,-850,-740,-743,376,-742]],"id":686},{"type":"MultiPolygon","arcs":[[[25]],[[27]],[[28]],[[33]],[[34]]],"id":90},{"type":"Polygon","arcs":[[373,-738,-824]],"id":694},{"type":"Polygon","arcs":[[184,-751,-755,936]],"id":222},{"type":"Polygon","arcs":[[-708,-683,338,937,340,938]],"id":-99},{"type":"Polygon","arcs":[[-807,-709,-939,341]],"id":706},{"type":"Polygon","arcs":[[-568,-847,-816,-852,-569,-758,-766,-901]],"id":688},{"type
":"Polygon","arcs":[[162,-720,939,-588,-752]],"id":740},{"type":"Polygon","arcs":[[-891,940,-763,-539,-677]],"id":703},{"type":"Polygon","arcs":[[-534,-767,-761,420,-794]],"id":705},{"type":"Polygon","arcs":[[-878,-717,456]],"id":752},{"type":"Polygon","arcs":[[941,-859]],"id":748},{"type":"Polygon","arcs":[[-797,-792,-822,393,942,-786]],"id":760},{"type":"Polygon","arcs":[[-871,-829,-930,-598,-657]],"id":148},{"type":"Polygon","arcs":[[-736,-559,-552,367]],"id":768},{"type":"Polygon","arcs":[[284,-868,286,-851,-819,-810]],"id":764},{"type":"Polygon","arcs":[[-808,-641,-502,943]],"id":762},{"type":"Polygon","arcs":[[-777,481,-801,944,-500]],"id":795},{"type":"Polygon","arcs":[[29,-768]],"id":626},{"type":"Polygon","arcs":[[53]],"id":780},{"type":"Polygon","arcs":[[-693,385,945,387,-826]],"id":788},{"type":"MultiPolygon","arcs":[[[399,-735,-529,-782,-787,-943,394,946,947,397,948]],[[949,-748,-565,405]]],"id":792},{"type":"Polygon","arcs":[[72]],"id":158},{"type":"Polygon","arcs":[[-8
04,343,-855,-867,950,-663,951,-661,-547,-924,952]],"id":834},{"type":"Polygon","arcs":[[-925,-659,-934,-805,-953]],"id":800},{"type":"Polygon","arcs":[[-912,402,-900,-839,-899,-764,-941,-890,-575]],"id":804},{"type":"Polygon","arcs":[[-590,165,-522]],"id":858},{"type":"MultiPolygon","arcs":[[[65]],[[66]],[[67]],[[68]],[[69]],[[118,953,120,954,122,955,124,956,126,957,128,958,130,959,132,960,134,961,136,962,138,963,140,964,142,-846,195,965,966,967,968,969,-611]],[[93]],[[95]],[[98]],[[-613,202,970,204,971,206,972,208,973,210,974,212,975,214]]],"id":840},{"type":"Polygon","arcs":[[-945,-800,-809,-944,-501]],"id":860},{"type":"Polygon","arcs":[[156,976,158,977,160,-753,-586,-670]],"id":862},{"type":"Polygon","arcs":[[282,-812,-821,-633]],"id":704},{"type":"MultiPolygon","arcs":[[[21]],[[22]]],"id":548},{"type":"Polygon","arcs":[[321,978,323,979,325,980,327,-929,-883,981]],"id":887},{"type":"Polygon","arcs":[[982,350,-870,-594,983,-860,-942,-858,348],[-830]],"id":710},{"type":"Polygon","
arcs":[[-866,-862,984,-596,-869,-506,-664,-951]],"id":894},{"type":"Polygon","arcs":[[-984,-597,-985,-861]],"id":716}]}},"arcs":[[[33289,2723],[-582,81],[-621,-35],[-348,197],[0,23],[-152,174],[625,-23],[599,-58],[207,243],[147,208],[288,-243],[-82,-301],[-81,-266]],[[5242,3530],[-364,208],[-163,209],[-11,35],[-180,162],[169,220],[517,-93],[277,-185],[212,-209],[76,-266],[-533,-81]],[[35977,2708],[-658,35],[-365,197],[49,243],[593,162],[239,197],[174,254],[126,220],[168,209],[180,243],[141,0],[414,127],[419,-127],[342,-255],[120,-359],[33,-254],[11,-301],[-430,-186],[-452,-150],[-522,-139],[-582,-116]],[[16602,6806],[-386,47],[-278,208],[60,197],[332,-104],[359,-93],[332,104],[-158,-208],[-261,-151]],[[15547,6934],[-164,23],[-359,58],[-381,162],[202,127],[277,-139],[425,-231]],[[23277,7733],[-217,46],[-337,-23],[-343,23],[-376,-35],[-283,116],[-146,243],[174,104],[353,-81],[403,-46],[305,-81],[304,69],[163,-335]],[[30256,7743],[-364,11],[136,232],[-327,-81],[-310,-81],[-212,174],[-1
6,243],[305,231],[190,70],[321,-23],[82,301],[16,219],[-6,475],[158,278],[256,93],[147,-220],[65,-220],[120,-267],[92,-254],[76,-267],[33,-266],[-49,-231],[-76,-220],[-326,-81],[-311,-116]],[[794,704],[78,49],[94,61],[81,52],[41,26]],[[1088,892],[41,-1],[29,-10]],[[1158,881],[402,-246],[352,246],[63,34],[816,104],[265,-138],[130,-71],[419,-196],[789,-151],[625,-185],[1072,-139],[800,162],[1181,-116],[669,-185],[734,174],[773,162],[60,278],[-1094,23],[-898,139],[-234,231],[-745,128],[49,266],[103,243],[104,220],[-55,243],[-462,162],[-212,209],[-430,185],[675,-35],[642,93],[402,-197],[495,173],[457,220],[223,197],[-98,243],[-359,162],[-408,174],[-571,35],[-500,81],[-539,58],[-180,220],[-359,185],[-217,208],[-87,672],[136,-58],[250,-185],[457,58],[441,81],[228,-255],[441,58],[370,127],[348,162],[315,197],[419,58],[-11,220],[-97,220],[81,208],[359,104],[163,-196],[425,115],[321,151],[397,12],[375,57],[376,139],[299,128],[337,127],[218,-35],[190,-46],[414,81],[370,-104],[381,11],[364,81]
,[375,-57],[414,-58],[386,23],[403,-12],[413,-11],[381,23],[283,174],[337,92],[349,-127],[331,104],[300,208],[179,-185],[98,-208],[180,-197],[288,174],[332,-220],[375,-70],[321,-162],[392,35],[354,104],[418,-23],[376,-81],[381,-104],[147,254],[-180,197],[-136,209],[-359,46],[-158,220],[-60,220],[-98,440],[213,-81],[364,-35],[359,35],[327,-93],[283,-174],[119,-208],[376,-35],[359,81],[381,116],[342,70],[283,-139],[370,46],[239,451],[224,-266],[321,-104],[348,58],[228,-232],[365,-23],[337,-69],[332,-128],[218,220],[108,209],[278,-232],[381,58],[283,-127],[190,-197],[370,58],[288,127],[283,151],[337,81],[392,69],[354,81],[272,127],[163,186],[65,254],[-32,244],[-87,231],[-98,232],[-87,231],[-71,209],[-16,231],[27,232],[130,220],[109,243],[44,231],[-55,255],[-32,232],[136,266],[152,173],[180,220],[190,186],[223,173],[109,255],[152,162],[174,151],[267,34],[174,186],[196,115],[228,70],[202,150],[157,186],[218,69],[163,-151],[-103,-196],[-283,-174],[-120,-127],[-206,92],[-229,-58],[-190,-13
9],[-202,-150],[-136,-174],[-38,-231],[17,-220],[130,-197],[-190,-139],[-261,-46],[-153,-197],[-163,-185],[-174,-255],[-44,-220],[98,-243],[147,-185],[229,-139],[212,-185],[114,-232],[60,-220],[82,-232],[130,-196],[82,-220],[38,-544],[81,-220],[22,-232],[87,-231],[-38,-313],[-152,-243],[-163,-197],[-370,-81],[-125,-208],[-169,-197],[-419,-220],[-370,-93],[-348,-127],[-376,-128],[-223,-243],[-446,-23],[-489,23],[-441,-46],[-468,0],[87,-232],[424,-104],[311,-162],[174,-208],[-310,-185],[-479,58],[-397,-151],[-17,-243],[-11,-232],[327,-196],[60,-220],[353,-220],[588,-93],[500,-162],[398,-185],[506,-186],[690,-92],[681,-162],[473,-174],[517,-197],[272,-278],[136,-220],[337,209],[457,173],[484,186],[577,150],[495,162],[691,12],[680,-81],[560,-139],[180,255],[386,173],[702,12],[550,127],[522,128],[577,81],[614,104],[430,150],[-196,209],[-119,208],[0,220],[-539,-23],[-571,-93],[-544,0],[-77,220],[39,440],[125,128],[397,138],[468,139],[337,174],[337,174],[251,231],[380,104],[376,81],[190,47
],[430,23],[408,81],[343,116],[337,139],[305,139],[386,185],[245,197],[261,173],[82,232],[-294,139],[98,243],[185,185],[288,116],[305,139],[283,185],[217,232],[136,277],[202,163],[331,-35],[136,-197],[332,-23],[11,220],[142,231],[299,-58],[71,-220],[331,-34],[360,104],[348,69],[315,-34],[120,-243],[305,196],[283,105],[315,81],[310,81],[283,139],[310,92],[240,128],[168,208],[207,-151],[288,81],[202,-277],[157,-209],[316,116],[125,232],[283,162],[365,-35],[108,-220],[229,220],[299,69],[326,23],[294,-11],[310,-70],[300,-34],[130,-197],[180,-174],[304,104],[327,24],[315,0],[310,11],[278,81],[294,70],[245,162],[261,104],[283,58],[212,162],[152,324],[158,197],[288,-93],[109,-208],[239,-139],[289,46],[196,-208],[206,-151],[283,139],[98,255],[250,104],[289,197],[272,81],[326,116],[218,127],[228,139],[218,127],[261,-69],[250,208],[180,162],[261,-11],[229,139],[54,208],[234,162],[228,116],[278,93],[256,46],[244,-35],[262,-58],[223,-162],[27,-254],[245,-197],[168,-162],[332,-70],[185,-162],[22
9,-162],[266,-35],[223,116],[240,243],[261,-127],[272,-70],[261,-69],[272,-46],[277,0],[229,-614],[-11,-150],[-33,-267],[-266,-150],[-218,-220],[38,-232],[310,12],[-38,-232],[-141,-220],[-131,-243],[212,-185],[321,-58],[321,104],[153,232],[92,220],[153,185],[174,174],[70,208],[147,289],[174,58],[316,24],[277,69],[283,93],[136,231],[82,220],[190,220],[272,151],[234,115],[153,197],[157,104],[202,93],[277,-58],[250,58],[272,69],[305,-34],[201,162],[142,393],[103,-162],[131,-278],[234,-115],[266,-47],[267,70],[283,-46],[261,-12],[174,58],[234,-35],[212,-127],[250,81],[300,0],[255,81],[289,-81],[185,197],[141,196],[191,163],[348,439],[179,-81],[212,-162],[185,-208],[354,-359],[272,-12],[256,0],[299,70],[299,81],[229,162],[190,174],[310,23],[207,127],[218,-116],[141,-185],[196,-185],[305,23],[190,-150],[332,-151],[348,-58],[288,47],[218,185],[185,185],[250,46],[251,-81],[288,-58],[261,93],[250,0],[245,-58],[256,-58],[250,104],[299,93],[283,23],[316,0],[255,58],[251,46],[76,290],[11,243],[
174,-162],[49,-266],[92,-244],[115,-196],[234,-105],[315,35],[365,12],[250,35],[364,0],[262,11],[364,-23],[310,-46],[196,-186],[-54,-220],[179,-173],[299,-139],[310,-151],[360,-104],[375,-92],[283,-93],[315,-12],[180,197],[245,-162],[212,-185],[245,-139],[337,-58],[321,-69],[136,-232],[316,-139],[212,-208],[310,-93],[321,12],[299,-35],[332,12],[332,-47],[310,-81],[288,-139],[289,-116],[195,-173],[-32,-232],[-147,-208],[-125,-266],[-98,-209],[-131,-243],[-364,-93],[-163,-208],[-360,-127],[-125,-232],[-190,-220],[-201,-185],[-115,-243],[-70,-220],[-28,-266],[6,-220],[158,-232],[60,-220],[130,-208],[517,-81],[109,-255],[-501,-93],[-424,-127],[-528,-23],[-234,-336],[-49,-278],[-119,-220],[-147,-220],[370,-196],[141,-244],[239,-219],[338,-197],[386,-186],[419,-185],[636,-185],[142,-289],[800,-128],[53,-45],[208,-175],[767,151],[636,-186],[-99504,-147],[245,344],[501,-185],[32,21]],[[31400,18145],[-92,-239],[-238,-183],[-301,67],[-202,177],[-291,86],[-350,330],[-283,317],[-383,662],[229,-
124],[390,-395],[369,-212],[143,271],[90,405],[256,244],[198,-70]],[[30935,19481],[106,-274],[139,-443],[361,-355],[389,-147],[-125,-296],[-264,-29],[-141,208]],[[33139,19680],[-139,266],[333,354],[236,-148],[167,237],[222,-266],[-83,-207],[-375,-177],[-125,207],[-236,-266]],[[69095,21172],[-7,314],[41,244],[19,121],[179,-186],[263,-74],[9,-112],[-77,-269],[-427,-38]],[[90796,24799],[-57,32],[-171,19],[-171,505],[-38,390],[-160,515],[7,271],[181,-52],[269,-204],[151,81],[217,113],[166,-39],[20,-702],[-95,-203],[-29,-476],[-97,162],[-193,-412]],[[97036,23023],[-256,13],[-180,194],[-302,42],[-46,217],[149,438],[349,583],[179,111],[200,225],[238,310],[167,306],[123,441],[106,149],[41,330],[195,273],[61,-251],[63,-244],[198,239],[80,-249],[0,-249],[-103,-274],[-182,-435],[-142,-238],[103,-284],[-214,-7],[-238,-223],[-75,-387],[-157,-597],[-219,-264],[-138,-169]],[[98677,25949],[-48,155],[-116,85],[160,486],[-91,326],[-299,236],[8,214],[201,206],[47,455],[-13,382],[-113,396],[8,104],[-13
3,244],[-218,523],[-117,418],[104,46],[151,-328],[216,-153],[78,-526],[202,-622],[5,403],[126,-161],[41,-447],[224,-192],[188,-48],[158,226],[141,-69],[-67,-524],[-85,-345],[-212,12],[-74,-179],[26,-254],[-41,-110],[-105,-319],[-138,-404],[-214,-236]],[[96316,37345],[-153,160],[-199,266],[-179,313],[-184,416],[-38,201],[119,-9],[156,-201],[122,-200],[89,-166],[228,-366],[144,-272],[-105,-142]],[[99425,39775],[-153,73],[-27,260],[107,203],[126,-74],[69,98],[96,-171],[-46,-308],[-172,-81]],[[99645,40529],[-36,220],[139,121],[88,33],[163,184],[0,-289],[-177,-145],[-177,-124]],[[0,40798],[0,289],[57,27],[-34,-284],[-23,-32]],[[96531,40773],[-93,259],[10,158],[175,-339],[-92,-78]],[[96463,41280],[-75,74],[-58,-32],[-39,163],[-6,453],[133,-182],[45,-476]],[[62613,35454],[-160,151],[-220,211],[-77,312],[-18,524],[-98,471],[-26,425],[50,426],[128,102],[1,197],[133,447],[25,377],[-65,280],[-52,372],[-23,544],[97,331],[38,375],[138,22],[155,121],[103,107],[122,7],[158,337],[229,364],[83,297],
[-38,253],[118,-71],[153,410],[6,356],[92,264],[96,-254],[74,-251],[69,-390],[45,-711],[72,-276],[-28,-284],[-49,-174],[-94,347],[-53,-175],[53,-438],[-24,-250],[-77,-137],[-18,-500],[-109,-689],[-137,-814],[-172,-1120],[-106,-821],[-125,-685],[-226,-140],[-243,-250]],[[90643,27516],[-230,262],[-170,104],[43,308],[-152,-112],[-243,-428],[-240,160],[-158,94],[-159,42],[-269,171],[-179,364],[-52,449],[-64,298],[-137,240],[-267,71],[91,287],[-67,438],[-136,-408],[-247,-109],[146,327],[42,341],[107,289],[-22,438],[-226,-504],[-174,-202],[-106,-470],[-217,243],[9,313],[-174,429],[-147,221],[52,137],[-356,358],[-195,17],[-267,287],[-498,-56],[-359,-211],[-317,-197],[-265,39],[-294,-303],[-241,-137],[-53,-309],[-103,-240],[-236,-15],[-174,-52],[-246,107],[-199,-64],[-191,-27],[-165,-315],[-81,26],[-140,-167],[-133,-187],[-203,23],[-186,0],[-295,377],[-149,113],[6,338],[138,81],[47,134],[-10,212],[34,411],[-31,350],[-147,598],[-45,337],[12,336],[-111,385],[-7,174],[-123,235],[-35,463],[-158
,467],[-39,252],[122,-255],[-93,548],[137,-171],[83,-229],[-5,303],[-138,465],[-26,186],[-65,177],[31,341],[56,146],[38,295],[-29,346],[114,425],[21,-450],[118,406],[225,198],[136,252],[212,217],[126,46],[77,-73],[219,220],[168,66],[42,129],[74,54],[153,-14],[292,173],[151,262],[71,316],[163,300],[13,236],[7,321],[194,502],[117,-510],[119,118],[-99,279],[87,287],[122,-128],[34,449],[152,291],[67,233],[140,101],[4,165],[122,-69],[5,148],[122,85],[134,80],[205,-271],[155,-350],[173,-4],[177,-56],[-59,325],[133,473],[126,155],[-44,147],[121,338],[168,208],[142,-70],[234,111],[-5,302],[-204,195],[148,86],[184,-147],[148,-242],[234,-151],[79,60],[172,-182],[162,169],[105,-51],[65,113],[127,-292],[-74,-316],[-105,-239],[-96,-20],[32,-236],[-81,-295],[-99,-291],[20,-166],[221,-327],[214,-189],[143,-204],[201,-350],[78,1],[145,-151],[43,-183],[265,-200],[183,202],[55,317],[56,262],[34,324],[85,470],[-39,286],[20,171],[-32,339],[37,445],[53,120],[-43,197],[67,313],[52,325],[7,168],[104,222],
[78,-289],[19,-371],[70,-71],[11,-249],[101,-300],[21,-335],[-10,-214],[100,-464],[179,223],[92,-250],[133,-231],[-29,-262],[60,-506],[42,-295],[70,-72],[75,-505],[-27,-307],[90,-400],[301,-309],[197,-281],[186,-257],[-37,-143],[159,-371],[108,-639],[111,130],[113,-256],[68,91],[48,-626],[197,-363],[129,-226],[217,-478],[78,-475],[7,-337],[-19,-365],[132,-502],[-16,-523],[-48,-274],[-75,-527],[6,-339],[-55,-423],[-123,-538],[-205,-290],[-102,-458],[-93,-292],[-82,-510],[-107,-294],[-70,-442],[-36,-407],[14,-187],[-159,-205],[-311,-22],[-257,-242],[-127,-229],[-168,-254]],[[95110,44183],[-194,4],[-106,363],[166,-142],[56,-22],[78,-203]],[[83414,44519],[-368,414],[259,116],[146,-180],[97,-180],[-17,-159],[-117,-11]],[[94572,44733],[-170,60],[-58,91],[17,235],[183,-93],[91,-124],[45,-155],[-108,-14]],[[94868,44799],[-206,512],[-57,353],[94,0],[100,-473],[111,-283],[-42,-109]],[[84713,45326],[32,139],[239,133],[194,20],[87,74],[105,-74],[-102,-160],[-289,-258],[-233,-170]],[[84746,45030
],[-181,-441],[-238,-130],[-33,71],[25,201],[119,360],[275,235]],[[82576,45238],[-149,5],[95,340],[153,5],[74,209],[100,-158],[172,48],[69,-251],[-321,-119],[-193,-79]],[[83681,45301],[-370,73],[0,216],[220,123],[174,-177],[185,45],[249,216],[-41,-328],[-417,-168]],[[94421,45535],[-218,251],[-152,212],[-104,197],[41,60],[128,-142],[228,-272],[65,-187],[12,-119]],[[93704,46205],[-121,134],[-114,243],[14,99],[166,-250],[111,-193],[-56,-33]],[[81823,45409],[-306,238],[-251,-16],[-288,44],[-260,106],[-322,225],[-204,59],[-116,-74],[-506,243],[-48,254],[-255,44],[191,564],[337,-35],[224,-231],[115,-45],[38,-210],[533,-59],[61,244],[515,-284],[101,-383],[417,-108],[341,-351],[-317,-225]],[[87280,46506],[-27,445],[49,212],[58,200],[63,-173],[0,-282],[-143,-402]],[[93221,46491],[-120,227],[-122,375],[-59,450],[38,57],[30,-175],[84,-134],[135,-375],[131,-200],[-39,-166],[-78,-59]],[[91733,46847],[-148,1],[-228,171],[-158,165],[23,183],[249,-86],[152,46],[42,283],[40,15],[27,-314],[158,45],[7
8,202],[155,211],[-30,348],[166,11],[56,-97],[-5,-327],[-93,-361],[-146,-48],[-44,-166],[-152,-144],[-142,-138]],[[85242,48340],[-192,108],[-54,254],[281,29],[69,-195],[-104,-196]],[[86342,48300],[-234,244],[-232,49],[-157,-39],[-192,21],[65,325],[344,24],[305,-172],[101,-452]],[[92451,47764],[-52,348],[-65,229],[-126,193],[-158,252],[-200,174],[77,143],[150,-166],[94,-130],[117,-142],[111,-248],[106,-189],[33,-307],[-87,-157]],[[89166,49043],[482,-407],[513,-338],[192,-302],[154,-297],[43,-349],[462,-365],[68,-313],[-256,-64],[62,-393],[248,-388],[180,-627],[159,20],[-11,-262],[215,-100],[-84,-111],[295,-249],[-30,-171],[-184,-41],[-69,153],[-238,66],[-281,89],[-216,377],[-158,325],[-144,517],[-362,259],[-235,-169],[-170,-195],[35,-436],[-218,-203],[-155,99],[-288,25]],[[89175,45193],[-247,485],[-282,118],[-69,-168],[-352,-18],[118,481],[175,164],[-72,642],[-134,496],[-538,500],[-229,50],[-417,546],[-82,-287],[-107,-52],[-63,216],[-1,257],[-212,290],[299,213],[198,-11],[-23,156],[-
407,1],[-110,352],[-248,109],[-117,293],[374,143],[142,192],[446,-242],[44,-220],[78,-955],[287,-354],[232,627],[319,356],[247,1],[238,-206],[206,-212],[298,-113]],[[83276,47228],[-119,173],[79,544],[-43,570],[-117,4],[-86,405],[115,387],[40,469],[139,891],[58,243],[237,439],[217,-174],[350,-82],[319,25],[275,429],[48,-132],[-223,-587],[-209,-113],[-267,115],[-463,-29],[-243,-85],[-39,-447],[248,-526],[150,268],[518,201],[-22,-272],[-121,86],[-121,-347],[-245,-229],[263,-757],[-50,-203],[249,-682],[-2,-388],[-148,-173],[-109,207],[134,484],[-273,-229],[-69,164],[36,228],[-200,346],[21,576],[-186,-179],[24,-689],[11,-846],[-176,-85]],[[85582,50048],[-112,374],[-82,755],[56,472],[92,215],[20,-322],[164,-52],[26,-241],[-15,-517],[-143,58],[-42,-359],[114,-312],[-78,-71]],[[79085,47110],[-234,494],[-356,482],[-119,358],[-210,481],[-138,443],[-212,827],[-244,493],[-81,508],[-103,461],[-250,372],[-145,506],[-209,330],[-290,652],[-24,300],[178,-24],[430,-114],[246,-577],[215,-401],[153,-24
6],[263,-635],[283,-9],[233,-405],[161,-495],[211,-270],[-111,-482],[159,-205],[100,-15],[47,-412],[97,-330],[204,-52],[135,-374],[-70,-735],[-11,-914],[-308,-12]],[[80461,51765],[204,-202],[214,110],[56,500],[119,112],[333,128],[199,467],[137,374]],[[81723,53254],[110,221],[236,323]],[[82069,53798],[214,411],[140,462],[112,2],[143,-299],[13,-257],[183,-165],[231,-177],[-20,-232],[-186,-29],[50,-289],[-205,-201]],[[82744,53024],[-158,-533],[204,-560],[-48,-272],[312,-546],[-329,-70],[-93,-403],[12,-535],[-267,-404],[-7,-589],[-107,-903],[-41,210],[-316,-266],[-110,361],[-198,34],[-139,189],[-330,-212],[-101,285],[-182,-32],[-229,68],[-43,793],[-138,164],[-134,505],[-38,517],[32,548],[165,392]],[[84832,53877],[-327,343],[-78,428],[84,280],[-176,280],[-87,-245],[-131,23],[-205,-330],[-46,173],[109,498],[175,166],[151,223],[98,-268],[212,162],[45,264],[196,15],[-16,457],[225,-280],[23,-297],[20,-218],[28,-392],[16,-332],[-94,-540],[-102,602],[-130,-300],[89,-435],[-79,-277]],[[72318,54
106],[-132,470],[-49,849],[126,959],[192,-328],[129,-416],[134,-616],[-42,-615],[-116,-168],[-242,-135]],[[32841,56488],[-50,53],[81,163],[-6,233],[160,77],[58,-21],[-11,-440],[-232,-65]],[[84165,55910],[-171,409],[57,158],[70,165],[30,367],[153,35],[-44,-398],[205,570],[-26,-563],[-100,-195],[-87,-373],[-87,-175]],[[82548,55523],[136,414],[200,364],[167,409],[146,587],[49,-482],[-183,-325],[-146,-406],[-369,-561]],[[83889,56748],[-10,275],[20,301],[-43,282],[166,-183],[177,1],[-5,-247],[-129,-251],[-176,-178]],[[84666,56567],[-11,416],[-84,31],[-43,357],[163,-47],[-4,224],[-169,451],[266,-13],[77,-220],[78,-660],[-214,157],[5,-199],[68,-364],[-132,-133]],[[83683,57791],[-119,295],[-142,450],[238,-22],[97,-213],[-74,-510]],[[84465,57987],[-216,290],[-103,310],[-71,-217],[-177,354],[-253,-87],[-138,130],[14,244],[87,151],[-83,136],[-36,-213],[-137,340],[-41,257],[-11,566],[112,-195],[29,925],[90,535],[169,-1],[171,-168],[85,153],[26,-150],[-46,-245],[95,-423],[-73,-491],[-164,-196],[
-43,-476],[62,-471],[147,-65],[123,70],[347,-328],[-27,-321],[91,-142],[-29,-272]],[[31337,61183],[-16,253],[40,86],[227,-3],[142,-52],[50,-118],[-71,-149],[-209,4],[-163,-21]],[[28554,61038],[-156,95],[-159,215],[34,135],[116,41],[64,-20],[187,-53],[147,-142],[46,-161],[-195,-11],[-84,-99]],[[30080,62227],[34,101],[217,-3],[165,-152],[73,15],[50,-209],[152,11],[-9,-176],[124,-21],[136,-217],[-103,-240],[-132,128],[-127,-25],[-92,28],[-50,-107],[-106,-37],[-43,144],[-92,-85],[-111,-405],[-71,94],[-14,170]],[[30081,61241],[-185,100],[-131,-41],[-169,43],[-130,-110],[-149,184],[24,190],[256,-82],[210,-47],[100,131],[-127,256],[2,226],[-175,92],[62,163],[170,-26],[241,-93]],[[80409,61331],[-228,183],[-8,509],[137,267],[304,166],[159,-14],[62,-226],[-122,-260],[-64,-341],[-240,-284]],[[6753,61756],[-69,84],[8,165],[-46,216],[14,65],[48,97],[-19,116],[16,55],[21,-11],[107,-100],[49,-51],[45,-79],[71,-207],[-7,-33],[-108,-126],[-89,-92],[-41,-99]],[[6551,62734],[-47,125],[-32,48],[-3,37],
[27,50],[99,-56],[73,-90],[-23,-71],[-94,-43]],[[6447,63028],[-149,17],[21,72],[137,-26],[-9,-63]],[[6192,63143],[-19,8],[-97,21],[-35,133],[-11,24],[74,82],[23,-38],[80,-196],[-15,-34]],[[5704,63509],[-93,107],[14,43],[43,58],[64,-12],[5,-138],[-33,-58]],[[28401,62311],[186,329],[-113,154],[-179,39],[-96,171],[-66,336],[-157,-23],[-259,159],[-83,124],[-362,91],[-97,115],[104,148],[-273,30],[-199,-307],[-115,-8],[-40,-144],[-138,-65],[-118,56],[146,183],[60,213],[126,131],[142,116],[210,56],[67,65],[240,-42],[219,-7],[261,-201],[110,-216],[260,66],[98,-138],[235,-366],[173,-267],[92,8],[165,-120],[-20,-167],[205,-24],[210,-242],[-33,-138],[-185,-75],[-187,-29],[-191,46],[-398,-57]],[[28394,64588],[-70,340],[-104,171],[60,375],[84,-23],[97,-491],[1,-343],[-68,-29]],[[83540,63560],[-146,499],[-32,438],[163,581],[223,447],[127,-176],[-49,-357],[-167,-947],[-119,-485]],[[28080,66189],[-19,219],[130,47],[184,-18],[8,-153],[-303,-95]],[[28563,65870],[-51,75],[4,309],[-124,234],[-1,67],[22
0,-265],[-48,-420]],[[86948,69902],[-181,168],[2,281],[154,352],[158,-68],[114,248],[204,-127],[35,-203],[-156,-357],[-114,189],[-143,-137],[-73,-346]],[[59437,71293],[8,-48],[-285,-240],[-136,77],[-64,237],[132,22]],[[59092,71341],[19,3],[40,143],[200,-8],[253,176],[-188,-251],[21,-111]],[[56867,71211],[3,98],[-339,115],[52,251],[152,-199],[216,34],[207,-42],[-7,-103],[151,71],[-35,-175],[-400,-50]],[[54194,72216],[-213,222],[-141,64],[-387,300],[38,304],[325,-54],[284,64],[211,51],[-100,-465],[41,-183],[-58,-303]],[[52446,73567],[-105,156],[-11,713],[-64,338],[153,-30],[139,183],[166,-419],[-39,-782],[-126,38],[-113,-197]],[[86301,68913],[-135,229],[69,533],[-176,172],[-113,405],[263,182],[145,371],[280,306],[203,403],[553,177],[297,-121],[291,1050],[185,-282],[408,591],[158,229],[174,723],[-47,664],[117,374],[295,108],[152,-819],[-9,-479],[-256,-595],[4,-610],[-104,-472],[48,-296],[-145,-416],[-355,-278],[-488,-36],[-396,-675],[-186,227],[-12,442],[-483,-130],[-329,-279],[-325,-1
1],[282,-435],[-186,-1004],[-179,-248]],[[52563,75028],[-126,120],[-64,398],[56,219],[179,226],[47,-507],[-92,-456]],[[88876,75140],[-39,587],[138,455],[296,33],[81,817],[83,460],[326,-615],[213,-198],[195,-126],[197,250],[62,-663],[-412,-162],[-244,-587],[-436,404],[-152,-646],[-308,-9]],[[32535,77739],[-353,250],[-69,198],[105,183],[97,-288],[202,-79],[257,16],[-137,-242],[-102,-38]],[[32696,79581],[-360,186],[-258,279],[96,49],[365,-148],[284,-247],[8,-108],[-135,-11]],[[15552,79158],[-456,269],[-84,209],[-248,207],[-50,168],[-286,107],[-107,321],[24,137],[291,-129],[171,-89],[261,-63],[94,-204],[138,-280],[277,-244],[115,-327],[-140,-82]],[[35133,78123],[-183,111],[60,484],[-77,75],[-322,-513],[-166,21],[196,277],[-267,144],[-298,-35],[-539,18],[-43,175],[173,208],[-121,160],[234,356],[287,941],[172,336],[241,204],[129,-26],[-54,-160],[-148,-372],[-184,-517],[181,199],[187,-126],[-98,-206],[247,-162],[128,144],[277,-182],[-86,-433],[194,101],[36,-313],[86,-367],[-117,-520],[-125
,-22]],[[13561,81409],[-111,1],[-167,270],[-103,272],[-140,184],[-51,260],[16,188],[131,-76],[267,47],[-84,-671],[242,-475]],[[89469,77738],[-51,496],[31,575],[-32,638],[64,446],[13,790],[-163,581],[24,808],[257,271],[-110,274],[123,83],[73,-391],[96,-569],[-7,-581],[114,-597],[280,-1046],[-411,195],[-171,-854],[271,-605],[-8,-413],[-211,356],[-182,-457]],[[47896,83153],[233,24],[298,-365],[-149,-406]],[[48278,82406],[46,-422],[-210,-528],[-493,-349],[-393,89],[225,617],[-145,601],[378,463],[210,276]],[[53358,82957],[-291,333],[-39,246],[408,195],[88,-296],[-166,-478]],[[7221,84100],[-142,152],[-43,277],[252,210],[148,90],[185,-40],[117,-183],[-240,-281],[-277,-225]],[[48543,80097],[-148,118],[407,621],[249,127],[-436,99],[-79,235],[291,183],[-152,319],[52,387],[414,-54],[40,343],[-190,372],[-337,104],[-66,160],[101,264],[-92,163],[-149,-279],[-17,569],[-140,301],[101,611],[216,480],[222,-47],[335,49],[-297,-639],[283,81],[304,-3],[-72,-481],[-250,-530],[287,-38],[270,-759],[190,-95
],[171,-673],[79,-233],[337,-113],[-34,-378],[-142,-173],[111,-305],[-250,-310],[-371,6],[-473,-163],[-130,116],[-183,-276],[-257,67],[-195,-226]],[[3835,85884],[-182,110],[-168,161],[274,101],[220,-54],[27,-226],[-171,-92]],[[27873,86994],[-123,50],[-73,176],[13,41],[107,177],[114,-13],[70,-121],[-108,-310]],[[26925,87305],[-196,13],[-61,160],[207,273],[381,-6],[-6,-114],[-325,-326]],[[2908,87788],[-211,128],[-106,107],[-245,-34],[-66,52],[17,223],[171,-113],[173,61],[225,-156],[276,-79],[-23,-64],[-211,-125]],[[26243,87832],[-95,346],[-377,-57],[242,292],[35,465],[95,542],[201,-49],[51,-259],[143,91],[161,-155],[304,-203],[318,-184],[25,-281],[204,46],[199,-196],[-247,-186],[-432,142],[-156,266],[-275,-314],[-396,-306]],[[44817,88095],[-365,87],[-775,187],[273,261],[-605,289],[492,114],[-12,174],[-583,137],[188,385],[421,87],[433,-400],[422,321],[349,-167],[453,315],[461,-42],[-64,-382],[314,-403],[-361,-451],[-801,-405],[-240,-107]],[[28614,90223],[-69,289],[118,331],[255,82],[21
7,-163],[3,-253],[-32,-82],[-180,-174],[-312,-30]],[[1957,88542],[-260,17],[-212,206],[-369,172],[-62,257],[-283,96],[-315,-76],[-151,207],[60,219],[-333,-140],[126,-278],[-158,-251],[0,2354],[681,-451],[728,-588],[-24,-367],[187,-147],[-64,429],[754,-88],[544,-553],[-276,-257],[-455,-61],[-7,-578],[-111,-122]],[[23258,91203],[-374,179],[-226,-65],[-380,266],[245,183],[194,256],[295,-168],[166,-106],[84,-112],[169,-226],[-173,-207]],[[99694,92399],[-49,187],[354,247],[0,-404],[-305,-30]],[[0,92429],[0,404],[36,24],[235,-1],[402,-169],[-24,-81],[-286,-141],[-363,-36]],[[26228,91219],[16,648],[394,-45]],[[26638,91822],[411,-87],[373,-293],[17,-293],[-207,-315],[196,-316],[-36,-288],[-544,-413],[-386,-91],[-287,178],[-83,-297],[-268,-498]],[[25824,89109],[-81,-258],[-322,-400]],[[25421,88451],[-397,-39],[-220,-250],[-18,-384],[-323,-74],[-340,-479],[-301,-665],[-108,-466]],[[23714,86094],[-15,-686],[408,-99]],[[24107,85309],[125,-553],[130,-448],[388,117],[517,-256],[277,-225],[199,-27
9]],[[25743,83665],[348,-162],[294,-249]],[[26385,83254],[459,-34],[302,-58],[-45,-511],[86,-594],[201,-661],[414,-561],[214,192],[150,607],[-145,934],[-196,311],[445,276],[314,415],[154,411]],[[28738,83981],[-22,395],[-189,502]],[[28527,84878],[-338,445],[328,619],[-121,535],[-93,922],[194,137],[476,-161],[286,-57],[230,155],[258,-200],[342,-343],[85,-229],[495,-45],[-8,-496],[92,-747],[254,-92],[201,-348],[402,328],[266,652],[184,274],[216,-527],[362,-754],[307,-709],[-112,-371],[370,-333],[250,-338],[442,-152],[179,-189],[110,-500],[216,-78],[112,-223],[20,-664],[-202,-222],[-199,-207],[-458,-210],[-349,-486],[-470,-96],[-594,125],[-417,4],[-287,-41],[-233,-424],[-354,-262],[-401,-782],[-320,-545],[236,97],[446,776],[583,493]],[[31513,79609],[416,59],[245,-290]],[[32174,79378],[-262,-397],[88,-637],[91,-446],[361,-295],[459,86],[278,664],[19,-429],[180,-214],[-344,-387],[-615,-351],[-276,-239],[-310,-426],[-211,44],[-11,500],[483,488],[-445,-19],[-309,-72]],[[31350,77248],[48,-19
4],[-296,-286],[-286,-204],[-293,-175]],[[30523,76389],[-159,-386],[-35,-98]],[[30329,75905],[-3,-313],[92,-313],[115,-15],[-29,216],[83,-131],[-22,-169],[-188,-96]],[[30377,75084],[-133,12],[-205,-104]],[[30039,74992],[-121,-29],[-162,-29],[-231,-171],[408,111],[82,-112],[-389,-177],[-177,-1],[8,72],[-84,-164],[82,-27],[-60,-424],[-203,-455],[-20,152]],[[29172,73738],[-61,31],[-91,147]],[[29020,73916],[57,-318]],[[29077,73598],[66,-106],[8,-222]],[[29151,73270],[-89,-230],[-157,-472],[-25,24],[86,402]],[[28966,72994],[-142,226],[-33,490]],[[28791,73710],[-53,-255],[59,-375]],[[28797,73080],[-175,88],[183,-186]],[[28805,72982],[12,-562],[79,-41],[29,-204],[39,-591],[-176,-439],[-288,-175],[-182,-346],[-139,-38],[-141,-217],[-39,-199],[-305,-383],[-157,-281],[-131,-351],[-43,-419],[50,-411],[92,-505],[124,-418],[1,-256],[132,-685],[-9,-398],[-12,-230],[-69,-361]],[[27672,65472],[-83,-74],[-137,71]],[[27452,65469],[-44,259]],[[27408,65728],[-106,136],[-147,508]],[[27155,66372],[-129,4
52],[-42,231],[57,393],[-77,325],[-217,494]],[[26747,68267],[-108,91],[-281,-269]],[[26358,68089],[-49,30]],[[26309,68119],[-135,276],[-174,146]],[[26000,68541],[-314,-75],[-247,66],[-212,-41]],[[25227,68491],[-118,-83],[54,-166]],[[25163,68242],[-5,-240],[59,-117],[-53,-77],[-103,87],[-104,-112],[-202,18]],[[24755,67801],[-207,313],[-242,-74]],[[24306,68040],[-202,137],[-173,-42],[-234,-138],[-253,-438],[-276,-255],[-152,-282],[-63,-266],[-3,-407],[14,-284],[52,-201]],[[23016,65864],[1,-1],[-1,-1],[-107,-516]],[[22909,65346],[-49,-426],[-20,-791],[-27,-289],[48,-322],[86,-288],[56,-458],[184,-440],[65,-337],[109,-291],[295,-157],[114,-247],[244,165],[212,60],[208,106],[175,101],[176,241],[67,345],[22,496],[48,173],[188,155],[294,137],[246,-21],[169,50],[66,-125],[-9,-285],[-149,-351],[-66,-360],[51,-103],[-42,-255],[-69,-461],[-71,152],[-58,-10]],[[25472,61510],[1,-87],[53,-3],[-5,-160],[-45,-256],[24,-91],[-29,-212],[18,-56],[-32,-299],[-55,-156],[-50,-19],[-55,-205]],[[25297,5996
6],[90,-107],[24,88],[82,-75]],[[25493,59872],[29,-23],[61,104],[79,8],[26,-48],[43,29],[129,-53]],[[25860,59889],[128,16],[90,65]],[[26078,59970],[32,66],[89,-31],[66,-40],[73,14],[55,51],[127,-82],[44,-13],[85,-110],[80,-132],[101,-91],[73,-162]],[[26903,59440],[-24,-57],[-14,-132],[29,-216],[-64,-202],[-30,-237],[-9,-261],[15,-152],[7,-266],[-43,-58],[-26,-253],[19,-156],[-56,-151],[12,-159],[43,-97]],[[26762,57043],[70,-321],[108,-238],[130,-252]],[[27070,56232],[100,-212]],[[27170,56020],[-6,-125],[111,-27]],[[27275,55868],[26,48],[77,-145],[136,42],[119,150],[168,119],[95,176],[153,-34],[-10,-58],[155,-21],[124,-102],[90,-177],[105,-164]],[[28513,55702],[143,-18],[209,412],[114,63],[3,195],[51,500],[159,274],[175,11],[22,123],[218,-49],[218,298],[109,132],[134,285],[98,-36],[73,-156],[-54,-199]],[[30185,57537],[-8,-139],[-163,-69],[91,-268],[-3,-309]],[[30102,56752],[-123,-343],[105,-469]],[[30084,55940],[120,38],[62,427],[-86,208],[-14,447],[346,241],[-38,278],[97,186],[100,-
415],[195,-9],[180,-330],[11,-195],[249,-6],[297,61],[159,-264]],[[31762,56607],[213,-73],[155,184]],[[32130,56718],[4,149],[344,35],[333,9],[-236,-175],[95,-279],[222,-44],[210,-291],[45,-473],[144,13],[109,-139]],[[33400,55523],[183,-217],[171,-385],[8,-304],[105,-14],[149,-289],[109,-205]],[[34125,54109],[333,-119],[30,107],[225,43],[298,-159]],[[35011,53981],[95,-65],[204,-140],[294,-499],[46,-242]],[[35650,53035],[95,28],[69,-327],[155,-1033],[149,-97],[7,-408],[-208,-487],[86,-178],[491,-92],[10,-593],[211,388],[349,-212],[462,-361],[135,-346],[-45,-327],[323,182],[540,-313],[415,23],[411,-489],[355,-662],[214,-170],[237,-24],[101,-186],[94,-752],[46,-358],[-110,-977],[-142,-385],[-391,-822],[-177,-668],[-206,-513],[-69,-11],[-78,-435],[20,-1107],[-77,-910],[-30,-390],[-88,-233],[-49,-790],[-282,-771],[-47,-610],[-225,-256],[-65,-355],[-302,2],[-437,-227],[-195,-263],[-311,-173],[-327,-470],[-235,-586],[-41,-441],[46,-326],[-51,-597],[-63,-289],[-195,-325],[-308,-1040],[-244,-
468],[-189,-277],[-127,-562],[-183,-337]],[[35174,30629],[-121,-372],[-313,-328],[-205,118],[-151,-63],[-256,253],[-189,-19],[-169,327]],[[33770,30545],[-19,-308],[353,-506],[-38,-408],[173,-257],[-14,-289],[-267,-757],[-412,-317],[-557,-123],[-305,59],[59,-352],[-57,-442],[51,-298],[-167,-208],[-284,-82],[-267,216],[-108,-155],[39,-587],[188,-178],[152,186],[82,-307],[-255,-183],[-223,-367],[-41,-595],[-66,-316],[-262,-2],[-218,-302],[-80,-443]],[[31227,23224],[274,-433],[265,-119]],[[31766,22672],[-96,-531],[-328,-333],[-180,-692],[-254,-234],[-113,-276],[89,-614],[185,-342],[-117,30]],[[30952,19680],[-247,4],[-134,-145],[-250,-213],[-45,-552],[-118,-14],[-313,192],[-318,412],[-346,338],[-87,374],[79,346],[-140,393],[-36,1007],[119,568],[293,457],[-422,172],[265,522],[94,982],[309,-208],[145,1224],[-186,157],[-87,-738],[-175,83],[87,845],[95,1095],[127,404]],[[29661,27385],[-79,576],[-23,666]],[[29559,28627],[117,19],[170,954],[192,945],[118,881],[-64,885],[83,487],[-34,730],[163,
721],[50,1143],[89,1227],[87,1321],[-20,967],[-58,832]],[[30452,39739],[-279,340],[-24,242],[-551,593],[-498,646],[-214,365],[-115,488],[46,170],[-236,775],[-274,1090],[-262,1177],[-114,269],[-87,435],[-216,386],[-198,239],[90,264],[-134,563],[86,414],[221,373]],[[27693,48568],[148,442],[-60,258],[-106,-275],[-166,259],[56,167],[-47,536],[97,89],[52,368],[105,381],[-20,241],[153,126],[190,236]],[[28095,51396],[-37,183],[103,44],[-12,296],[65,214],[138,40],[117,371],[106,310],[-102,141],[52,343],[-62,540],[59,155],[-44,500],[-112,315]],[[28366,54848],[-93,170],[-59,319],[68,158],[-70,40]],[[28212,55535],[-52,195],[-138,165]],[[28022,55895],[-122,-38],[-56,-205],[-112,-149],[-61,-20],[-27,-123],[132,-321],[-75,-76],[-40,-87],[-130,-30],[-48,353],[-36,-101],[-92,35],[-56,238],[-114,39],[-72,69],[-119,-1],[-8,-128],[-32,89]],[[26954,55439],[-151,131],[-56,124],[32,103],[-11,130],[-77,142],[-109,116],[-95,76],[-19,173],[-73,105],[18,-172],[-55,-141],[-64,164],[-89,58],[-38,120],[2,179],[
36,187],[-78,83],[64,114]],[[26191,57131],[-96,186],[-130,238],[-61,200],[-117,185],[-140,267]],[[25647,58207],[31,92],[46,-89]],[[25724,58210],[21,41]],[[25745,58251],[-48,185]],[[25697,58436],[-84,52],[-31,-140]],[[25582,58348],[-161,9],[-100,57],[-115,117],[-154,37],[-79,127]],[[24973,58695],[-142,103],[-174,11],[-127,117],[-149,244]],[[24381,59170],[-314,636]],[[24067,59806],[-144,192],[-226,154]],[[23697,60152],[-156,-43],[-223,-223],[-140,-58],[-196,156],[-208,112],[-260,271],[-208,83],[-314,275],[-233,282],[-70,158],[-155,35],[-284,187],[-116,270],[-299,335],[-139,373],[-66,288],[93,57],[-29,169],[64,153],[1,204],[-93,266],[-25,235],[-94,298],[-244,587],[-280,462],[-135,368],[-238,241],[-51,145],[42,365]],[[19641,66203],[-142,137],[-164,288]],[[19335,66628],[-69,412],[-149,48],[-162,311],[-130,288],[-12,184],[-149,446],[-99,452],[5,227]],[[18570,68996],[-201,235],[-93,-26]],[[18276,69205],[-159,163],[-44,-240],[46,-284],[27,-444],[95,-243],[206,-407],[46,-139],[42,-42],[37,-2
03],[49,8],[56,-381],[85,-150],[59,-210],[174,-300],[92,-550],[83,-259],[77,-277],[15,-311],[134,-20],[112,-268],[100,-264],[-6,-106],[-117,-217],[-49,3],[-74,359]],[[19362,64423],[-182,337],[-200,286]],[[18980,65046],[-142,150],[9,432],[-42,320],[-132,183],[-191,264],[-37,-76],[-70,154],[-171,143],[-164,343],[20,44],[115,-33],[103,221],[10,266],[-214,422],[-163,163],[-102,369],[-103,388],[-129,472],[-113,531]],[[17464,69802],[-46,302],[-180,340],[-130,71],[-30,169],[-156,30],[-100,159],[-258,59]],[[16564,70932],[-70,95],[-34,324]],[[16460,71351],[-270,594],[-231,821],[10,137],[-123,195],[-215,495],[-38,482],[-148,323],[61,489],[-10,507],[-89,453],[109,557],[67,1072],[-50,792],[-88,506],[-80,274],[33,115],[402,-200],[148,-558]],[[15948,78405],[68,156],[-44,485],[-94,484]],[[15878,79530],[-38,1],[-537,581],[-199,255]],[[15104,80367],[-503,245],[-155,523],[40,362]],[[14486,81497],[-356,252],[-48,476],[-336,429],[-6,304]],[[13740,82958],[-153,223],[-245,188],[-78,515],[-358,478],[-150,
558],[-267,38],[-441,15],[-326,170],[-574,613],[-266,112],[-486,211]],[[10396,86079],[-385,-50],[-546,271]],[[9465,86300],[-330,252],[-309,-125],[58,-411],[-154,-38],[-321,-123],[-245,-199]],[[8164,85656],[-307,-126],[-40,348]],[[7817,85878],[125,580],[295,182],[-76,148],[-354,-329],[-190,-394],[-400,-420],[203,-287],[-262,-424]],[[7158,84934],[-299,-247],[-278,-181]],[[6581,84506],[-69,-261],[-434,-305],[-87,-278],[-325,-252],[-191,45],[-259,-165],[-282,-201],[-231,-197],[-477,-169],[-43,99],[304,276],[271,182],[296,324],[345,66],[137,243],[385,353],[62,119],[205,208],[48,448],[141,349],[-320,-179],[-90,102],[-150,-215],[-181,300],[-75,-212],[-104,294],[-278,-236],[-170,0],[-24,352]],[[4985,85596],[50,217],[-179,210]],[[4856,86023],[-361,-113],[-235,277],[-190,142],[-1,334],[-214,252],[108,340],[226,330],[99,303],[225,43],[191,-94],[224,285],[201,-51],[212,183],[-52,270],[-155,106],[205,228],[-170,-7],[-295,-128],[-85,-131],[-219,131],[-392,-67],[-407,142],[-117,238],[-351,343],[39
0,247],[620,289],[228,0]],[[4541,89915],[-38,-295],[586,22]],[[5089,89642],[-225,366]],[[4864,90008],[-342,226],[-197,295]],[[4325,90529],[-267,252],[-381,187],[155,309],[493,19],[350,270],[66,287],[284,281],[271,68],[526,262],[256,-40],[427,315],[421,-124],[201,-266],[123,114],[469,-35],[-16,-136],[425,-101],[283,59],[585,-186],[534,-56],[214,-77],[370,96],[421,-177],[302,-83]],[[10837,91767],[518,-142]],[[11355,91625],[438,-284],[289,-55]],[[12082,91286],[244,247],[336,184],[413,-72],[416,259],[455,148],[191,-245],[207,138],[62,278],[192,-63],[470,-530],[369,401]],[[15437,92031],[38,-448],[341,96]],[[15816,91679],[105,173],[337,-34],[424,-248],[650,-217],[383,-100],[272,38]],[[17987,91291],[375,-300],[-391,-293]],[[17971,90698],[502,-127],[750,70],[236,103],[296,-354],[302,299],[-283,251],[179,202],[338,27],[223,59],[224,-141],[279,-321],[310,47],[491,-266],[431,94],[405,-14],[-32,367],[247,103],[431,-200],[-2,-559],[177,471],[223,-16],[126,594],[-298,364],[-324,239],[22,653],[329
,429],[366,-95],[281,-261],[378,-666],[-247,-290],[517,-120],[-1,-604],[371,463],[332,-380],[-83,-438],[269,-399],[290,427],[202,510]],[[19722,91216],[-824,-103],[-374,-41]],[[18524,91072],[-151,279],[-379,161],[-246,-66],[-343,468],[185,62],[429,101],[392,-26],[362,103],[-537,138],[-594,-47],[-394,12],[-146,217],[644,237],[-428,-9],[-485,156],[233,443],[193,235],[744,359],[284,-114],[-139,-277],[618,179],[386,-298],[314,302],[254,-194],[227,-580],[140,244],[-197,606],[244,86],[276,-94],[311,-239],[175,-575],[86,-417],[466,-293],[502,-279],[-31,-260],[-456,-48],[178,-227],[-94,-217],[-503,93],[-478,160],[-322,-36],[-522,-201]],[[20728,93568],[-434,413],[95,83],[372,24],[211,-130],[-244,-390]],[[27920,93557],[-80,36],[-306,313],[12,213],[133,39],[636,-63],[479,-325],[25,-163],[-296,17],[-299,13],[-304,-80]],[[31620,87170],[-753,236],[-596,343],[-337,287],[97,167],[-414,304],[-405,286],[5,-171],[-803,-94],[-235,203],[183,435],[522,10],[571,76],[-92,211],[96,294],[360,576],[-77,261],[-
107,203],[-425,286],[-563,201],[178,150],[-294,367],[-245,34],[-219,201],[-149,-175],[-503,-76],[-1011,132],[-588,174],[-450,89],[-231,207],[290,270],[-394,2],[-88,599],[213,528],[286,241],[717,158],[-204,-382],[219,-369],[256,477],[704,242],[477,-611],[-42,-387],[550,172],[263,235],[616,-299],[383,-282],[36,-258],[515,134],[290,-376],[670,-234],[242,-238],[263,-553],[-510,-275],[654,-386],[441,-130],[400,-543],[437,-39],[-87,-414],[-487,-687],[-342,253],[-437,568],[-359,-74],[-35,-338],[292,-344],[377,-272],[114,-157],[181,-584],[-96,-425],[-350,160],[-697,473],[393,-509],[289,-357],[45,-206]],[[22678,92689],[-268,50],[-192,225],[-690,456],[5,189],[567,-73],[-306,386],[329,286],[331,-124],[496,75],[72,-172],[-259,-283],[420,-254],[-50,-532],[-455,-229]],[[89468,93831],[-569,66],[-49,31],[263,234],[348,54],[394,-226],[34,-155],[-421,-4]],[[23814,93133],[-317,22],[-173,519],[4,294],[145,251],[276,161],[579,-20],[530,-144],[-415,-526],[-331,-115],[-298,-442]],[[15808,92470],[-147,259]
,[-641,312]],[[15020,93041],[93,193],[218,489]],[[15331,93723],[241,388],[-272,362],[939,93],[397,-123],[709,-33],[270,-171],[298,-249],[-349,-149],[-681,-415],[-344,-414]],[[16539,93012],[0,-248],[-731,-294]],[[91548,94707],[-444,53],[-516,233],[66,192],[518,-89],[697,-155],[-321,-234]],[[23845,94650],[-403,44],[-337,155],[148,266],[399,159],[243,-208],[101,-187],[-151,-229]],[[88598,94662],[-550,384],[149,406],[366,111],[734,-26],[1004,-313],[-219,-439],[-1023,16],[-461,-139]],[[22275,94831],[-298,94],[5,345],[-455,-46],[-18,457],[299,-18],[419,201],[390,-34],[22,77],[212,-273],[9,-303],[-127,-440],[-458,-60]],[[18404,94533],[-35,193],[577,261],[-1255,-70],[-389,106],[379,577],[262,165],[782,-199],[493,-350],[485,-45],[-397,565],[255,215],[286,-68],[94,-282],[109,-210],[247,99],[291,-26],[49,-289],[-169,-281],[-940,-91],[-701,-256],[-423,-14]],[[65817,92311],[-907,77],[-74,262],[-503,158],[-40,320],[284,126],[-10,323],[551,503],[-255,73],[665,518],[-75,268],[621,312],[917,380],[92
5,110],[475,220],[541,76],[193,-233],[-187,-184],[-984,-293],[-848,-282],[-863,-562],[-414,-577],[-435,-568],[56,-491],[531,-484],[-164,-52]],[[25514,94532],[-449,73],[-738,190],[-96,325],[-34,293],[-279,258],[-574,72],[-322,183],[104,242],[573,-37],[308,-190],[547,1],[240,-194],[-64,-222],[319,-134],[177,-140],[374,-26],[406,-50],[441,128],[566,51],[451,-42],[298,-223],[62,-244],[-174,-157],[-414,-127],[-355,72],[-797,-91],[-570,-11]],[[16250,95423],[-377,128],[472,442],[570,383],[426,-9],[381,87],[-38,-454],[-214,-205],[-259,-29],[-517,-252],[-444,-91]],[[81143,94175],[250,112],[142,-379]],[[81535,93908],[122,153],[444,93],[892,-97],[67,-276],[1162,-88],[15,451]],[[84237,94144],[590,-103],[443,3]],[[85270,94044],[449,-312],[128,-378],[-165,-247],[349,-465],[437,-240],[268,620],[446,-266],[473,159],[538,-182],[204,166],[455,-83],[-201,549],[367,256],[2509,-384],[236,-351],[727,-451],[1122,112],[553,-98],[231,-244],[-33,-432],[342,-168],[372,121],[492,15],[525,-116],[526,66],[484,-5
26],[344,189],[-224,378]],[[97224,91732],[123,263],[886,-166]],[[98233,91829],[578,36],[799,-282],[389,-258],[0,-2354],[-2,-3],[-357,-260],[-360,44],[250,-315],[166,-487],[128,-159],[32,-244],[-71,-157],[-518,129],[-777,-445],[-247,-69],[-425,-415],[-403,-362],[-102,-269],[-397,409],[-724,-464]],[[96192,85904],[-126,220],[-268,-254]],[[95798,85870],[-371,81],[-90,-388],[-333,-572],[10,-239],[316,-132],[-37,-860],[-258,-22],[-119,-494],[116,-255]],[[95032,82989],[-486,-301],[-96,-675]],[[94450,82013],[-415,-144],[-83,-600],[-400,-551],[-103,407],[-119,862],[-155,1313],[134,819],[234,353]],[[93543,84472],[15,276],[431,132]],[[93989,84880],[496,744],[479,608],[499,471],[223,833],[-337,-50],[-167,-487]],[[95182,86999],[-705,-648],[-227,726]],[[94250,87077],[-717,-201],[-696,-990],[230,-362],[-620,-154],[-430,-61],[20,427],[-431,90],[-344,-291],[-850,102]],[[90412,85637],[-913,-175],[-900,-1153]],[[88599,84309],[-1065,-1394],[438,-74],[136,-370],[270,-132]],[[88378,82339],[178,296],[305,
-39]],[[88861,82596],[401,-650]],[[89262,81946],[9,-502],[-217,-591]],[[89054,80853],[-23,-705],[-126,-945],[-418,-855],[-94,-409],[-377,-688],[-374,-682],[-179,-349],[-370,-346],[-175,-8],[-175,287],[-373,-432],[-43,-197]],[[86327,75524],[-106,36]],[[86221,75560],[-120,-201],[-83,-201]],[[86018,75158],[10,-424],[-143,-130],[-50,-105],[-104,-174],[-185,-97],[-121,-159],[-9,-256],[-32,-65],[111,-96],[157,-259]],[[85652,73393],[240,-697],[68,-383],[3,-681],[-105,-325],[-252,-113],[-222,-245],[-250,-51],[-31,322]],[[85103,71220],[52,443],[-123,615]],[[85032,72278],[206,99],[-190,506]],[[85048,72883],[-135,113],[-34,-112]],[[84879,72884],[-81,-49],[-10,112],[-72,54],[-75,94]],[[84641,73095],[77,260],[65,69]],[[84783,73424],[-25,108],[71,319]],[[84829,73851],[-18,97],[-163,64]],[[84648,74012],[-131,158]],[[84517,74170],[-388,-171],[-204,-277],[-300,-161],[148,274],[-58,230],[220,397],[-147,310],[-242,-209],[-314,-411],[-171,-381],[-272,-29],[-142,-275],[147,-400],[227,-97],[9,-265]],[[83
030,72705],[220,-172],[311,421]],[[83561,72954],[247,-230],[179,-15]],[[83987,72709],[46,-310],[-394,-165]],[[83639,72234],[-130,-319],[-270,-296],[-142,-414]],[[83097,71205],[299,-324],[109,-582]],[[83505,70299],[169,-541],[189,-454],[-5,-439],[-174,-161],[66,-315],[164,-184],[-43,-481],[-71,-468],[-155,-53],[-203,-640],[-225,-775],[-258,-705],[-382,-545],[-386,-498],[-313,-68],[-170,-262],[-96,192],[-157,-294],[-388,-296],[-294,-90],[-95,-624],[-154,-35],[-73,429],[66,228]],[[80517,63220],[-373,190],[-131,-97]],[[80013,63313],[-371,-505],[-231,-558],[-61,-410],[212,-623],[260,-772],[252,-365],[169,-475],[127,-1093],[-37,-1039],[-232,-389],[-318,-381],[-227,-492],[-346,-550],[-101,378],[78,401],[-206,335]],[[78981,56775],[-233,87],[-112,307],[-141,611]],[[78495,57780],[-249,271],[-238,-11],[41,464],[-245,-3],[-22,-650],[-150,-863],[-90,-522],[19,-428],[181,-18],[113,-539],[50,-512],[155,-338],[168,-69],[144,-306]],[[78372,54256],[64,-56],[164,-356],[116,-396],[16,-398],[-29,-269],[
27,-203],[20,-349],[98,-163],[109,-523],[-5,-199],[-197,-40],[-263,438],[-329,469],[-32,301],[-161,395],[-38,489],[-100,322],[30,431],[-61,250]],[[77801,54399],[-110,227],[-47,292],[-148,334],[-135,280],[-45,-347],[-53,328],[30,369],[82,566]],[[77375,56448],[-27,439],[86,452],[-94,350],[23,644],[-113,306],[-90,707],[-50,746],[-121,490],[-183,-297],[-315,-421],[-156,53],[-172,138],[96,732],[-58,554],[-218,681],[34,213],[-163,76],[-197,481]],[[75657,62792],[-79,309],[-16,301],[-53,284]],[[75509,63686],[-116,344],[-256,23],[25,-243],[-87,-329],[-118,120],[-41,-108],[-78,65],[-108,53]],[[74730,63611],[-39,-216],[-189,7],[-343,-122],[16,-445],[-148,-349],[-400,-398],[-311,-695],[-209,-373]],[[73107,61020],[-276,-386],[-1,-272]],[[72830,60362],[-138,-146]],[[72692,60216],[-250,-212],[-130,-31]],[[72312,59973],[-84,-450],[58,-769],[15,-490],[-118,-561],[-1,-1004],[-144,-29],[-126,-450],[84,-195]],[[71996,56025],[-253,-167],[-93,-402]],[[71650,55456],[-112,-170],[-263,552],[-128,827],[-107,
596],[-97,279],[-148,568],[-69,739],[-48,369],[-253,811],[-115,1145],[-83,756],[1,716],[-54,553],[-404,-353],[-196,70],[-362,716],[133,214],[-82,232],[-326,501]],[[68937,64577],[-203,150]],[[68734,64727],[-83,425],[-215,449]],[[68436,65601],[-512,-111],[-451,-11],[-391,-83]],[[67082,65396],[-523,179]],[[66559,65575],[-302,136],[-314,76]],[[65943,65787],[-118,725],[-133,105],[-214,-106],[-280,-286],[-339,196],[-281,454],[-267,168],[-186,561],[-205,788],[-149,-96],[-177,196]],[[63594,68492],[-103,-231],[-165,29]],[[63326,68290],[58,-261],[-25,-135],[89,-445]],[[63448,67449],[109,-510],[137,-135],[47,-207]],[[63741,66597],[190,-248],[16,-244]],[[63947,66105],[-27,-197],[35,-199],[80,-165],[37,-194],[41,-145]],[[64113,65205],[-18,430],[75,310],[76,64]],[[64246,66009],[84,-186],[5,-345]],[[64335,65478],[-61,-348]],[[64274,65130],[53,-226]],[[64327,64904],[49,29],[11,-162],[217,93],[230,-15],[168,-18],[190,400],[207,379],[176,364]],[[65575,65974],[80,201],[35,-51],[-26,-244],[-37,-108]],[
[65627,65772],[38,-466]],[[65665,65306],[125,-404],[155,-214]],[[65945,64688],[204,-78],[164,-107]],[[66313,64503],[125,-339],[75,-196],[100,-75],[-1,-132],[-101,-352],[-44,-166],[-117,-189],[-104,-404],[-126,31],[-58,-141],[-44,-300],[34,-395],[-26,-72],[-128,2],[-174,-221],[-27,-288],[-63,-125],[-173,5],[-109,-149]],[[65352,60997],[1,-239],[-134,-164]],[[65219,60594],[-153,56],[-186,-199]],[[64880,60451],[-128,-33],[-201,-159]],[[64551,60259],[-54,-263],[-6,-201],[-277,-249],[-444,-276],[-249,-417]],[[63521,58853],[-122,-32],[-83,34]],[[63316,58855],[-163,-245]],[[63153,58610],[-177,-113],[-233,-31]],[[62743,58466],[-70,-34],[-61,-156],[-73,-43]],[[62539,58233],[-42,-150],[-138,13]],[[62359,58096],[-89,-80],[-192,30],[-72,345],[8,323],[-46,174],[-54,437],[-80,243],[56,29],[-29,270],[34,114],[-12,257]],[[61883,60238],[-36,253],[-84,177]],[[61763,60668],[-22,236],[-143,212],[-148,495],[-79,482],[-192,406],[-124,97],[-184,563],[-32,411],[12,350],[-159,655],[-130,231],[-150,122],[-92,
339],[15,133]],[[60335,65400],[-77,307],[-81,131]],[[60177,65838],[-108,440],[-170,476],[-141,406],[-139,-3],[44,325],[12,206],[34,236]],[[59709,67924],[-9,86]],[[59700,68010],[-78,-238],[-60,-446],[-75,-308],[-65,-103],[-93,191],[-125,263],[-198,847],[-29,-53],[115,-624],[171,-594],[210,-920],[102,-321],[90,-334],[249,-654],[-55,-103],[9,-384],[323,-530],[49,-121]],[[60240,63578],[90,-580],[-61,-107],[40,-608],[102,-706],[106,-145],[152,-219]],[[60669,61213],[161,-683],[77,-543]],[[60907,59987],[152,-288],[379,-558],[154,-336],[151,-341],[87,-203],[136,-178]],[[61966,58083],[66,-183],[-9,-245],[-158,-142],[119,-161]],[[61984,57352],[91,-109]],[[62075,57243],[54,-244],[125,-248]],[[62254,56751],[138,-2],[262,151],[302,70],[245,184],[138,39],[99,108],[158,20]],[[63596,57321],[89,12],[128,88],[147,59],[132,202],[105,2],[6,-163],[-25,-344],[1,-310],[-59,-214],[-78,-639],[-134,-659],[-172,-755],[-238,-866],[-237,-661],[-327,-806],[-278,-479],[-415,-586],[-259,-450],[-304,-715],[-64,-312
],[-63,-140]],[[61551,49585],[-195,-236],[-68,-246],[-104,-44],[-40,-416],[-89,-238],[-54,-393],[-112,-195]],[[60889,47817],[-128,-728],[16,-335],[178,-216],[8,-153],[-76,-357],[16,-180],[-18,-282],[97,-370],[115,-583],[101,-129]],[[61198,44484],[45,-265],[-11,-588],[34,-519],[11,-923],[49,-290],[-83,-422],[-108,-410],[-177,-366],[-254,-225],[-313,-287],[-313,-634],[-107,-108],[-194,-420],[-115,-136],[-23,-421],[132,-448],[54,-346],[4,-177],[49,29],[-8,-579]],[[59870,36949],[-45,-274],[65,-102]],[[59890,36573],[-41,-246],[-116,-210]],[[59733,36117],[-229,-199],[-334,-320],[-122,-219],[24,-248],[71,-40],[-24,-311]],[[59119,34780],[-70,-430],[-32,-491],[-72,-267],[-190,-298],[-54,-86],[-118,-300],[-77,-303],[-158,-424],[-314,-609],[-196,-355]],[[57838,31217],[-209,-269],[-291,-229]],[[57338,30719],[-141,-31],[-36,-164],[-169,88],[-138,-113],[-301,114],[-168,-72],[-115,31],[-286,-233],[-238,-94],[-171,-223],[-127,-14],[-117,210],[-94,11],[-120,264],[-13,-82],[-37,159],[2,346],[-90,396]
,[89,108],[-7,453],[-182,553],[-139,501],[-1,1],[-199,768]],[[54540,33696],[-207,446],[-108,432],[-62,575],[-68,428],[-93,910],[-7,707],[-35,322],[-108,243],[-144,489],[-146,708],[-60,371],[-226,577],[-17,453]],[[53259,40357],[-26,372],[38,519],[96,541],[15,254],[90,532],[66,243],[159,386],[90,263],[29,438],[-15,335],[-83,211],[-74,358],[-68,355],[15,122],[85,235],[-84,570],[-57,396],[-139,374],[26,115]],[[53422,46976],[-39,183]],[[53383,47159],[-74,444]],[[53309,47603],[-228,626]],[[53081,48229],[-285,596],[-184,488],[-169,610],[9,196],[61,189],[67,430],[56,438]],[[52636,51176],[-52,90],[96,663]],[[52680,51929],[40,467],[-108,390]],[[52612,52786],[-127,100],[-56,265]],[[52429,53151],[-71,85],[3,163]],[[52361,53399],[-289,-213]],[[52072,53186],[-105,32],[-107,-133]],[[51860,53085],[-222,13],[-149,370],[-91,427]],[[51398,53895],[-197,390],[-209,-8]],[[50992,54277],[-245,1]],[[50747,54278],[-229,-69]],[[50518,54209],[-224,-126]],[[50294,54083],[-436,-346],[-154,-203],[-250,-171],[-248
,168]],[[49206,53531],[-126,-7],[-194,116],[-178,-7],[-329,-103],[-193,-170],[-275,-217],[-54,15]],[[47857,53158],[-73,-5],[-286,282]],[[47498,53435],[-252,450],[-237,323]],[[47009,54208],[-187,381]],[[46822,54589],[-75,44],[-200,238],[-144,316],[-49,216],[-34,437]],[[46320,55840],[-122,349],[-108,232],[-71,76],[-69,118],[-32,261],[-41,130],[-80,97]],[[45797,57103],[-149,247],[-117,39],[-63,166],[1,90],[-84,125],[-18,127]],[[45367,57897],[-46,453]],[[45321,58350],[36,262]],[[45357,58612],[-115,460],[-138,210],[122,112],[134,415],[66,304]],[[45426,60113],[-24,318],[78,291],[34,557],[-30,583],[-34,294],[28,295],[-72,281],[-146,255]],[[45260,62987],[12,249]],[[45272,63236],[13,274],[106,161],[91,308],[-18,200],[96,417],[155,376],[93,95],[74,344],[6,315],[100,365],[185,216],[177,603],[144,235]],[[46494,67145],[259,66],[219,403],[139,158]],[[47111,67772],[232,493],[-70,735],[106,508],[37,312],[179,399],[278,270],[206,244],[186,612],[87,362],[205,-2],[167,-251],[264,41],[288,-131],[121,-6
]],[[49397,71358],[267,323],[300,102],[175,244],[268,180],[471,105],[459,48],[140,-87],[262,232],[297,5],[113,-137],[190,35]],[[52339,72408],[302,239],[195,-71],[-9,-299],[236,217],[20,-113]],[[53083,72381],[-139,-289],[-2,-274]],[[52942,71818],[96,-147],[-36,-511],[-183,-297],[53,-322],[143,-10],[70,-281],[106,-92]],[[53191,70158],[326,-204],[117,51],[232,-98],[368,-264],[130,-526],[250,-114],[391,-248],[296,-293],[136,153],[133,272],[-65,452],[87,288],[200,277],[192,80],[375,-121],[95,-264],[104,-2],[88,-101]],[[56646,69496],[276,-69],[68,-196]],[[56990,69231],[369,10],[268,-156],[275,-175],[129,-92],[214,188],[114,169],[245,49],[198,-75],[75,-293],[65,193],[222,-140],[217,-33],[137,149]],[[59518,69025],[80,194],[-19,34],[74,276],[56,446],[40,149],[8,6]],[[59757,70130],[99,482],[138,416],[5,21]],[[59999,71049],[-26,452],[68,243]],[[60041,71744],[-102,268],[105,222],[-169,-51],[-233,136],[-191,-340],[-421,-66],[-225,317],[-300,20],[-64,-245]],[[58441,72005],[-192,-71],[-268,315]],[
[57981,72249],[-303,-10],[-165,587]],[[57513,72826],[-203,328],[135,459],[-176,283],[308,565],[428,23],[117,449],[529,-78],[334,383],[324,167],[459,13]],[[59768,75418],[485,-416],[399,-229]],[[60652,74773],[323,91],[239,-53],[328,309]],[[61542,75120],[42,252],[-70,403],[-160,218],[-154,68],[-102,181]],[[61098,76242],[-354,499],[-317,223],[-240,347],[202,95],[231,494],[-156,234],[410,241],[-8,129],[-249,-95]],[[60617,78409],[-222,-48],[-185,-191],[-260,-31],[-239,-220],[16,-368],[136,-142],[284,35],[-55,-210],[-304,-103],[-377,-342],[-154,121],[61,277],[-304,173],[50,113],[265,197],[-80,135],[-432,149],[-19,221],[-257,-73],[-103,-325],[-215,-437]],[[58223,77340],[6,-152],[-135,-128],[-84,56],[-78,-713]],[[57932,76403],[-144,-245],[-101,-422],[89,-337]],[[57776,75399],[33,-228],[243,-190],[-51,-145],[-330,-33],[-118,-182],[-232,-319]],[[57321,74302],[-87,275],[3,122]],[[57237,74699],[-169,17],[-145,56],[-336,-154],[192,-332],[-141,-96]],[[56638,74190],[-154,0],[-147,304]],[[56337,7449
4],[-52,-130],[62,-353],[139,-277]],[[56486,73734],[-105,-130],[155,-272]],[[56536,73332],[137,-171],[4,-334],[-257,157],[82,-302],[-176,-62],[105,-521]],[[56431,72099],[-184,-7],[-228,257],[-104,472]],[[55915,72821],[-49,393],[-108,272],[-143,337],[-18,168]],[[55597,73991],[-48,41],[-5,130],[-154,199],[-24,281],[23,403],[38,184]],[[55427,75229],[-46,93],[-59,46]],[[55322,75368],[-78,192],[-120,118]],[[55124,75678],[-261,218],[-161,213],[-254,176]],[[54448,76285],[-233,435],[56,44]],[[54271,76764],[-127,248],[-5,200],[-179,93],[-85,-255],[-82,198],[6,205],[10,9]],[[53809,77462],[62,54]],[[53871,77516],[-221,86],[-226,-210],[15,-293],[-34,-168],[91,-301],[261,-298],[140,-488],[309,-476],[217,3],[68,-130],[-78,-118]],[[54413,75123],[249,-213],[204,-179]],[[54866,74731],[238,-308],[29,-111],[-52,-211],[-154,276],[-242,97],[-116,-382],[200,-219],[-33,-309],[-116,-35],[-148,-506],[-116,-46],[1,181],[57,317],[60,126],[-108,342],[-85,298],[-115,74],[-82,255],[-179,107],[-120,238],[-206,38]
,[-217,267],[-254,384]],[[53108,75604],[-189,341],[-86,584]],[[52833,76529],[-138,68],[-226,195],[-128,-80],[-161,-274],[-115,-43]],[[52065,76395],[-252,-334],[-548,160],[-404,-192],[-32,-355]],[[50829,75674],[15,-344],[-263,-393],[-356,-125],[-25,-199],[-171,-327],[-107,-481],[108,-338],[-160,-263],[-60,-384],[-210,-118]],[[49600,72702],[-197,-455],[-352,-8]],[[49051,72239],[-265,11],[-174,-209],[-106,-223],[-136,49],[-103,199],[-79,340],[-259,92]],[[47929,72498],[-112,-153],[-146,83],[-143,-65],[42,462],[-26,363],[-124,55],[-67,224],[22,386],[111,215],[20,239],[58,355],[-6,250],[-56,212],[-12,200]],[[47490,75324],[14,420],[-114,257],[393,426]],[[47783,76427],[340,-107],[373,4]],[[48496,76324],[296,-101],[230,31],[449,-19]],[[49471,76235],[144,354],[53,1177],[-287,620],[-205,299]],[[49176,78685],[-424,228],[-28,430]],[[48724,79343],[360,129],[466,-152],[-88,669],[263,-254],[646,461],[84,484],[243,119]],[[50698,80799],[222,117]],[[50920,80916],[143,162]],[[51063,81078],[244,870],[38
0,247]],[[51687,82195],[231,-17]],[[51918,82178],[54,125],[232,32],[52,-130],[188,291],[-63,222],[-13,335]],[[52368,83053],[-113,328],[-8,604],[46,159]],[[52293,84144],[80,178],[244,36]],[[52617,84358],[98,163],[223,167],[-9,-304],[-82,-192],[33,-166],[151,-89],[-68,-223],[-83,64],[-200,-425],[76,-288]],[[52756,83065],[4,-228],[281,-138],[-3,-210],[283,111],[156,162],[313,-233],[132,-189]],[[53922,82340],[189,174],[434,273],[350,200],[277,-100],[21,-144],[268,-7]],[[55461,82736],[63,260],[383,191]],[[55907,83187],[-59,497]],[[55848,83684],[10,445],[136,371],[262,202],[221,-442],[223,12],[53,453]],[[56753,84725],[32,349],[-102,-75],[-176,210],[-24,340],[351,164],[350,86],[301,-97],[287,17]],[[57772,85719],[316,327],[-291,280]],[[57797,86326],[-504,-47],[-489,-216],[-452,-125]],[[56352,85938],[-161,322],[-269,195],[62,581]],[[55984,87036],[-135,534],[133,344]],[[55982,87914],[252,371],[635,640],[185,124],[-28,250],[-387,279]],[[56639,89578],[-478,-167],[-269,-413],[43,-361],[-441,-475
],[-537,-509],[-202,-832],[198,-416],[265,-328],[-255,-666],[-289,-138],[-106,-992],[-157,-554],[-337,57],[-158,-468],[-321,-27],[-89,558],[-232,671],[-211,835]],[[53063,85353],[-187,363],[-548,-684]],[[52328,85032],[-370,-138],[-385,301]],[[51573,85195],[-99,635]],[[51474,85830],[-88,1364],[256,380]],[[51642,87574],[733,496],[549,609],[508,824],[668,1141],[465,444],[763,741],[610,259],[457,-31],[423,489],[506,-26],[499,118],[869,-433],[-358,-158],[305,-371]],[[58639,91676],[286,206],[456,-358],[761,-140],[1050,-668],[213,-281],[18,-393],[-308,-311],[-454,-157],[-1240,449],[-204,-75],[453,-433],[36,-878],[358,-180],[217,-153],[36,286]],[[60317,88590],[-174,263],[183,215]],[[60326,89068],[672,-368]],[[60998,88700],[234,144],[-187,433]],[[61045,89277],[647,578],[256,-34],[260,-206],[161,406],[-231,352],[136,353],[-204,367],[777,-190],[158,-331],[-351,-73]],[[62654,90499],[2,-328],[218,-203]],[[62874,89968],[429,128],[68,377]],[[63371,90473],[581,282],[969,507]],[[64921,91262],[209,-29
],[-273,-359],[344,-61],[199,202],[521,16],[412,245],[317,-356],[315,391],[-291,343],[145,195],[820,-179],[385,-185],[1006,-675],[186,309],[-282,313],[-8,125],[-335,58],[92,280],[-149,461],[-8,189],[512,535]],[[69038,93080],[182,537],[207,116]],[[69427,93733],[735,-156],[58,-328]],[[70220,93249],[-263,-479],[173,-189],[89,-413],[-63,-809],[307,-362],[-120,-395],[-544,-839],[318,-87],[110,213],[306,151],[74,293],[240,281],[-162,336],[130,390],[-304,49],[-67,328]],[[70444,91717],[222,594],[-361,481]],[[70305,92792],[497,398],[-64,421],[139,13],[145,-328],[-109,-570],[297,-108],[-127,426],[465,233],[577,31],[513,-337],[-247,492],[-28,630]],[[72363,94093],[484,119],[668,-26]],[[73515,94186],[602,77],[-226,309],[321,388],[319,16],[540,293],[734,79],[93,162],[729,55],[227,-133],[624,314],[510,-10],[77,255],[265,252],[656,242],[476,-191],[-378,-146],[629,-90],[75,-292],[254,143],[812,-7],[626,-289],[223,-221],[-69,-307],[-307,-175],[-730,-328],[-209,-175],[345,-83],[410,-149]],[[63720,7385
8],[-47,-207],[-102,-138]],[[63571,73513],[7,-293]],[[63578,73220],[88,-436],[263,-123],[193,-296],[395,-102],[434,156],[27,139]],[[64978,72558],[-52,417],[40,618],[-216,200],[71,405],[-184,34],[61,498],[262,-145],[244,189],[-202,355],[-80,338],[-224,-151],[-28,-433],[-87,383]],[[64583,75266],[-15,144],[68,246],[-53,206],[-322,202],[-125,530],[-154,150],[-9,192],[270,-56],[11,432],[236,96],[243,-88],[50,576],[-50,365],[-278,-28],[-236,144],[-321,-260],[-259,-124]],[[63639,77993],[-127,-350],[-269,-97],[-276,-610],[252,-561],[-27,-398],[303,-696]],[[63495,75281],[146,-311],[141,-419],[130,-28],[85,-159],[-228,-47],[-49,-459]],[[23807,96363],[-521,38],[-74,165],[559,-9],[195,-109],[-33,-68],[-126,-17]],[[18874,96315],[-411,191],[224,188],[406,60],[392,-92],[-93,-177],[-518,-170]],[[56247,96336],[-490,137],[191,152],[-167,189],[575,119],[110,-222],[401,-134],[-620,-241]],[[19199,96904],[-461,1],[5,84],[285,177],[149,-27],[361,-120],[-339,-115]],[[22969,96575],[-226,138],[-119,221],[-22
,245],[360,-24],[162,-39],[332,-205],[-76,-214],[-411,-122]],[[22313,96609],[-453,66],[-457,192],[-619,21],[268,176],[-335,142],[-21,227],[546,-81],[751,-215],[212,-281],[108,-247]],[[77621,96617],[507,776],[229,66],[208,-38],[704,-336],[-82,-240],[-1566,-228]],[[54420,95937],[-598,361],[252,210],[-416,170],[-541,499],[-216,463],[757,212],[152,-207],[396,8],[105,202],[408,20],[350,-206],[915,-440],[-699,-233],[-155,-435],[-243,-111],[-132,-490],[-335,-23]],[[56395,97491],[-819,98],[-50,163],[-398,11],[-304,271],[858,165],[403,-142],[281,177],[702,-148],[545,-207],[-412,-318],[-806,-70]],[[63218,97851],[-301,140],[158,185],[-618,18],[542,107],[422,8],[57,-160],[159,142],[262,97],[412,-129],[-107,-90],[-373,-78],[-250,-45],[-39,-97],[-324,-98]],[[77154,97111],[-773,170],[-462,226],[-213,423],[-379,117],[722,404],[600,133],[540,-297],[640,-572],[-69,-531],[-606,-73]],[[24776,96791],[-575,76],[-299,240],[4,215],[220,157],[-508,-4],[-306,196],[-176,268],[193,262],[192,180],[285,42],[-122
,135],[646,30],[355,-315],[468,-127],[455,-112],[220,-390],[334,-190],[-381,-176],[-513,-445],[-492,-42]],[[27622,95587],[-726,163],[-816,-91],[-414,71],[-525,31],[-35,284],[514,133],[-137,427],[170,41],[742,-255],[-379,379],[-450,113],[225,229],[492,141],[79,206],[-392,231],[-118,304],[759,-26],[220,-64],[433,216],[-625,68],[-972,-38],[-491,201],[-232,239],[-324,173],[-61,202],[413,112],[324,19],[545,96],[409,220],[344,-30],[300,-166],[211,319],[367,95],[498,65],[849,24],[148,-63],[802,100],[601,-38],[602,-37],[742,-47],[597,-75],[508,-161],[-12,-157],[-678,-257],[-672,-119],[-251,-133],[605,3],[-656,-358],[-452,-167],[-476,-483],[-573,-98],[-177,-120],[-841,-64],[383,-74],[-192,-105],[230,-292],[-264,-202],[-429,-167],[-132,-232],[-388,-176],[39,-134],[475,23],[6,-144],[-742,-355]],[[37559,86051],[-410,482],[-556,3],[-269,324],[-186,577],[-481,735],[-141,385],[-38,530],[-384,546],[100,435],[-186,208],[275,691],[418,220],[110,247],[58,461],[-318,-209],[-151,-88],[-249,-84],[-341,19
3],[-19,401],[109,314],[258,9],[567,-157],[-478,375],[-249,202],[-276,-83],[-232,147],[310,550],[-169,220],[-220,409],[-335,626],[-353,230],[3,247],[-745,346],[-590,43],[-743,-24],[-677,-44],[-323,188],[-482,372],[729,186],[559,31],[-1188,154],[-627,241],[39,229],[1051,285],[1018,284],[107,214],[-750,213],[243,235],[961,413],[404,63],[-115,265],[658,156],[854,93],[853,5],[303,-184],[737,325],[663,-221],[390,-46],[577,-192],[-660,318],[38,253],[932,353],[975,-27],[354,218],[982,57],[2219,-74],[1737,-469],[-513,-227],[-1062,-26],[-1496,-58],[140,-105],[984,65],[836,-204],[540,181],[231,-212],[-305,-344],[707,220],[1348,229],[833,-114],[156,-253],[-1132,-420],[-157,-136],[-888,-102],[643,-28],[-324,-431],[-224,-383],[9,-658],[333,-386],[-434,-24],[-457,-187],[513,-313],[65,-502],[-297,-55],[360,-508],[-617,-42],[322,-241],[-91,-208],[-391,-91],[-388,-2],[348,-400],[4,-263],[-549,244],[-143,-158],[375,-148],[364,-361],[105,-476],[-495,-114],[-214,228],[-344,340],[95,-401],[-322,-311],[7
32,-25],[383,-32],[-745,-515],[-755,-466],[-813,-204],[-306,-2],[-288,-228],[-386,-624],[-597,-414],[-192,-24],[-370,-145],[-399,-138],[-238,-365],[-4,-415],[-141,-388],[-453,-472],[112,-462],[-125,-488],[-142,-577],[-391,-36]],[[67002,71642],[284,-224],[209,79],[58,268],[219,89],[157,180],[55,472],[234,114],[44,211],[131,-158],[84,-19]],[[68477,72654],[154,-4],[210,-124]],[[68841,72526],[85,-72],[201,189],[93,-114],[90,271],[166,-12],[43,86],[29,239],[120,205],[150,-134],[-30,-181],[84,-28],[-26,-496],[110,-194],[97,125],[123,58],[173,265],[192,-44],[286,-1]],[[70827,72688],[50,-169]],[[70877,72519],[-162,-67],[-141,-109],[-319,-68],[-298,-124],[-163,-258],[66,-250],[32,-294],[-139,-248],[12,-227],[-76,-213],[-265,18],[110,-390],[-177,-150],[-118,-356],[15,-355],[-108,-166],[-103,55],[-212,-77],[-31,-166],[-207,1],[-154,-334],[-10,-503],[-361,-246],[-194,52],[-56,-129],[-166,75],[-278,-88],[-465,301]],[[66909,68203],[252,536],[-23,380],[-210,100],[-22,375],[-91,472],[119,323],[-121
,87],[76,430],[113,736]],[[56642,44124],[29,-184],[-32,-286],[49,-277],[-41,-222],[24,-203],[-579,7],[-13,-1880],[188,-483],[181,-369]],[[56448,40227],[-510,-241],[-673,83],[-192,284],[-1126,-26],[-42,-41],[-166,267],[-180,17],[-166,-100],[-134,-113]],[[53422,46976],[115,79],[80,-11],[98,71],[820,-8],[68,-440],[80,-354],[64,-191],[106,-309],[184,47],[91,83],[154,-83],[42,148],[69,344],[172,23],[15,103],[142,2],[-24,-213],[337,5],[5,-372],[56,-228],[-41,-356],[21,-363],[93,-219],[-15,-703],[68,54],[121,-15],[172,89],[127,-35]],[[53309,47603],[112,255],[84,100],[104,-203]],[[53609,47755],[-101,-124],[-45,-152],[-9,-258],[-71,-62]],[[55719,75309],[-35,-201],[39,-254],[115,-144]],[[55838,74710],[-5,-155],[-91,-85],[-16,-192],[-129,-287]],[[55427,75229],[-47,93]],[[55380,75322],[-18,188],[120,291],[18,-111],[75,52]],[[55575,75742],[59,-159],[66,-60],[19,-214]],[[65575,65974],[52,-202]],[[65665,65306],[-142,-3],[-23,-384],[50,-82],[-126,-117],[-1,-241],[-81,-245],[-7,-238]],[[65335,63996]
,[-56,-125],[-835,298],[-106,599],[-11,136]],[[31400,18145],[-168,16],[-297,1],[0,1319]],[[32587,37434],[511,-964],[227,-89],[339,-437],[286,-231],[40,-261],[-273,-898],[280,-160],[312,-91],[220,95],[252,453],[45,521]],[[34826,35372],[138,114],[139,-341],[-6,-472],[-234,-326],[-186,-241],[-314,-573],[-370,-806]],[[33993,32727],[-70,-473],[-74,-607],[3,-588],[-61,-132],[-21,-382]],[[31227,23224],[273,-433],[266,-119]],[[30952,19680],[-257,93],[-672,79],[-115,344],[6,443],[-185,-38],[-98,214],[-24,626],[213,260],[88,375],[-33,299],[148,504],[101,782],[-30,347],[122,112],[-30,223],[-129,118],[92,248],[-126,224],[-65,682],[112,120],[-47,720],[65,605],[75,527],[166,215],[-84,576],[-1,543],[210,386],[-7,494],[159,576],[1,544],[-72,108],[-128,1020],[171,607],[-27,572],[100,537],[182,555],[196,367],[-83,232],[58,190],[-9,985],[302,291],[96,614],[-34,148]],[[31359,37147],[231,534],[364,-144],[163,-427],[109,475],[316,-24],[45,-127]],[[62492,74950],[57,-155],[106,-103],[-56,-148],[148,-202],[
-78,-189],[118,-160],[124,-97],[7,-410]],[[62918,73486],[-101,-17]],[[62817,73469],[-113,342],[1,91],[-123,-2],[-82,159],[-58,-16]],[[62442,74043],[-109,172],[-207,147],[27,288],[-47,208]],[[62106,74858],[386,92]],[[1088,892],[38,-7],[32,-4]],[[1158,881],[402,-246],[352,246],[63,34],[816,104],[265,-138],[130,-71],[419,-196],[789,-151],[625,-185],[1072,-139],[800,162],[1181,-116],[669,-185],[734,174],[773,162],[60,278],[-1094,23],[-898,139],[-234,231],[-745,128],[49,266],[103,243],[104,220],[-55,243],[-462,162],[-212,209],[-430,185],[675,-35],[642,93],[402,-197],[495,173],[457,220],[223,197],[-98,243],[-359,162],[-408,174],[-571,35],[-500,81],[-539,58],[-180,220],[-359,185],[-217,208],[-87,672],[136,-58],[250,-185],[457,58],[441,81],[228,-255],[441,58],[370,127],[348,162],[315,197],[419,58],[-11,220],[-97,220],[81,208],[359,104],[163,-196],[425,115],[321,151],[397,12],[375,57],[376,139],[299,128],[337,127],[218,-35],[190,-46],[414,81],[370,-104],[381,11],[364,81],[375,-57],[414,-58],
[386,23],[403,-12],[413,-11],[381,23],[283,174],[337,92],[349,-127],[331,104],[300,208],[179,-185],[98,-208],[180,-197],[288,174],[332,-220],[375,-70],[321,-162],[392,35],[354,104],[418,-23],[376,-81],[381,-104],[147,254],[-180,197],[-136,209],[-359,46],[-158,220],[-60,220],[-98,440],[213,-81],[364,-35],[359,35],[327,-93],[283,-174],[119,-208],[376,-35],[359,81],[381,116],[342,70],[283,-139],[370,46],[239,451],[224,-266],[321,-104],[348,58],[228,-232],[365,-23],[337,-69],[332,-128],[218,220],[108,209],[278,-232],[381,58],[283,-127],[190,-197],[370,58],[288,127],[283,151],[337,81],[392,69],[354,81],[272,127],[163,186],[65,254],[-32,244],[-87,231],[-98,232],[-87,231],[-71,209],[-16,231],[27,232],[130,220],[109,243],[44,231],[-55,255],[-32,232],[136,266],[152,173],[180,220],[190,186],[223,173],[109,255],[152,162],[174,151],[267,34],[174,186],[196,115],[228,70],[202,150],[157,186],[218,69],[163,-151],[-103,-196],[-283,-174],[-120,-127],[-206,92],[-229,-58],[-190,-139],[-202,-150],[-136,
-174],[-38,-231],[17,-220],[130,-197],[-190,-139],[-261,-46],[-153,-197],[-163,-185],[-174,-255],[-44,-220],[98,-243],[147,-185],[229,-139],[212,-185],[114,-232],[60,-220],[82,-232],[130,-196],[82,-220],[38,-544],[81,-220],[22,-232],[87,-231],[-38,-313],[-152,-243],[-163,-197],[-370,-81],[-125,-208],[-169,-197],[-419,-220],[-370,-93],[-348,-127],[-376,-128],[-223,-243],[-446,-23],[-489,23],[-441,-46],[-468,0],[87,-232],[424,-104],[311,-162],[174,-208],[-310,-185],[-479,58],[-397,-151],[-17,-243],[-11,-232],[327,-196],[60,-220],[353,-220],[588,-93],[500,-162],[398,-185],[506,-186],[690,-92],[681,-162],[473,-174],[517,-197],[272,-278],[136,-220],[337,209],[457,173],[484,186],[577,150],[495,162],[691,12],[680,-81],[560,-139],[180,255],[386,173],[702,12],[550,127],[522,128],[577,81],[614,104],[430,150],[-196,209],[-119,208],[0,220],[-539,-23],[-571,-93],[-544,0],[-77,220],[39,440],[125,128],[397,138],[468,139],[337,174],[337,174],[251,231],[380,104],[376,81],[190,47],[430,23],[408,81],[
343,116],[337,139],[305,139],[386,185],[245,197],[261,173],[82,232],[-294,139],[98,243],[185,185],[288,116],[305,139],[283,185],[217,232],[136,277],[202,163],[331,-35],[136,-197],[332,-23],[11,220],[142,231],[299,-58],[71,-220],[331,-34],[360,104],[348,69],[315,-34],[120,-243],[305,196],[283,105],[315,81],[310,81],[283,139],[310,92],[240,128],[168,208],[207,-151],[288,81],[202,-277],[157,-209],[316,116],[125,232],[283,162],[365,-35],[108,-220],[229,220],[299,69],[326,23],[294,-11],[310,-70],[300,-34],[130,-197],[180,-174],[304,104],[327,24],[315,0],[310,11],[278,81],[294,70],[245,162],[261,104],[283,58],[212,162],[152,324],[158,197],[288,-93],[109,-208],[239,-139],[289,46],[196,-208],[206,-151],[283,139],[98,255],[250,104],[289,197],[272,81],[326,116],[218,127],[228,139],[218,127],[261,-69],[250,208],[180,162],[261,-11],[229,139],[54,208],[234,162],[228,116],[278,93],[256,46],[244,-35],[262,-58],[223,-162],[27,-254],[245,-197],[168,-162],[332,-70],[185,-162],[229,-162],[266,-35],[22
3,116],[240,243],[261,-127],[272,-70],[261,-69],[272,-46],[277,0],[229,-614],[-11,-150],[-33,-267],[-266,-150],[-218,-220],[38,-232],[310,12],[-38,-232],[-141,-220],[-131,-243],[212,-185],[321,-58],[321,104],[153,232],[92,220],[153,185],[174,174],[70,208],[147,289],[174,58],[316,24],[277,69],[283,93],[136,231],[82,220],[190,220],[272,151],[234,115],[153,197],[157,104],[202,93],[277,-58],[250,58],[272,69],[305,-34],[201,162],[142,393],[103,-162],[131,-278],[234,-115],[266,-47],[267,70],[283,-46],[261,-12],[174,58],[234,-35],[212,-127],[250,81],[300,0],[255,81],[289,-81],[185,197],[141,196],[191,163],[348,439],[179,-81],[212,-162],[185,-208],[354,-359],[272,-12],[256,0],[299,70],[299,81],[229,162],[190,174],[310,23],[207,127],[218,-116],[141,-185],[196,-185],[305,23],[190,-150],[332,-151],[348,-58],[288,47],[218,185],[185,185],[250,46],[251,-81],[288,-58],[261,93],[250,0],[245,-58],[256,-58],[250,104],[299,93],[283,23],[316,0],[255,58],[251,46],[76,290],[11,243],[174,-162],[49,-266],[
92,-244],[115,-196],[234,-105],[315,35],[365,12],[250,35],[364,0],[262,11],[364,-23],[310,-46],[196,-186],[-54,-220],[179,-173],[299,-139],[310,-151],[360,-104],[375,-92],[283,-93],[315,-12],[180,197],[245,-162],[212,-185],[245,-139],[337,-58],[321,-69],[136,-232],[316,-139],[212,-208],[310,-93],[321,12],[299,-35],[332,12],[332,-47],[310,-81],[288,-139],[289,-116],[195,-173],[-32,-232],[-147,-208],[-125,-266],[-98,-209],[-131,-243],[-364,-93],[-163,-208],[-360,-127],[-125,-232],[-190,-220],[-201,-185],[-115,-243],[-70,-220],[-28,-266],[6,-220],[158,-232],[60,-220],[130,-208],[517,-81],[109,-255],[-501,-93],[-424,-127],[-528,-23],[-234,-336],[-49,-278],[-119,-220],[-147,-220],[370,-196],[141,-244],[239,-219],[338,-197],[386,-186],[419,-185],[636,-185],[142,-289],[800,-128],[53,-45],[208,-175],[767,151],[636,-186],[-99504,-147],[245,344],[501,-185],[32,21],[294,188]],[[54716,79012],[-21,-241],[-156,-2],[53,-128],[-92,-380]],[[54500,78261],[-53,-100],[-243,-14],[-140,-134],[-229,45]],[
[53835,78058],[-398,153],[-62,205],[-274,-102],[-32,-113],[-169,84]],[[52900,78285],[-142,16],[-125,108],[42,145],[-10,104]],[[52665,78658],[83,33],[141,-164],[39,156],[245,-25],[199,106],[133,-18],[87,-121],[26,100],[-40,385],[100,75],[98,272]],[[53776,79457],[206,-190],[157,242],[98,44],[215,-180],[131,30],[128,-111]],[[54711,79292],[-23,-75],[28,-205]],[[62817,73469],[-190,78],[-141,273],[-44,223]],[[63720,73858],[-48,-207],[-101,-138]],[[63578,73220],[-69,-29],[-173,309],[95,292],[-82,174],[-104,-44],[-327,-436]],[[62492,74950],[68,96],[207,-169],[149,-36],[38,70],[-136,319],[72,82]],[[62890,75312],[78,-20],[191,-359],[122,-40],[48,150],[166,238]],[[58149,47921],[-17,713],[-70,268]],[[58062,48902],[169,-46],[85,336],[147,-38]],[[58463,49154],[16,-233],[60,-134],[3,-192],[-69,-124],[-108,-308],[-101,-214],[-115,-28]],[[50920,80916],[204,-47],[257,123],[176,-258],[153,-138]],[[51710,80596],[-32,-400]],[[51678,80196],[-72,-22],[-30,-331]],[[51576,79843],[-243,269],[-143,-46],[-194,
279],[-129,237],[-129,10],[-40,207]],[[50518,54209],[-69,407],[13,1357],[-56,122],[-11,290],[-96,207],[-85,174],[35,311]],[[50249,57077],[96,67],[56,258],[136,56],[61,176]],[[50598,57634],[93,173],[100,2],[212,-340]],[[51003,57469],[-11,-197],[62,-350],[-54,-238],[29,-159],[-135,-366],[-86,-181],[-52,-372],[7,-376],[-16,-952]],[[49214,56277],[-190,152],[-130,-22],[-97,-149],[-125,125],[-49,195],[-125,129]],[[48498,56707],[-18,343],[76,250],[-7,200],[221,490],[41,405],[76,144],[134,-79],[116,120],[38,152],[216,265],[53,184],[259,246],[153,84],[70,-114],[178,3]],[[50104,59400],[-22,-286],[37,-269],[156,-386],[9,-286],[320,-134],[-6,-405]],[[50249,57077],[-243,13]],[[50006,57090],[-128,47],[-90,-96],[-123,43],[-482,-27],[-7,-336],[38,-444]],[[75742,63602],[-6,-424],[-97,90],[18,-476]],[[75657,62792],[-79,308],[-16,301],[-53,285]],[[74730,63611],[-43,486],[-96,444],[47,356],[-171,159],[62,215],[173,220],[-200,313],[98,401],[220,-255],[133,-30],[24,-410],[265,-81],[257,8],[160,-101],[-12
8,-500],[-124,-34],[-86,-336],[152,-306],[46,377],[76,2],[147,-937]],[[56293,76715],[80,-243],[108,43],[213,-92],[408,-31],[138,150],[327,138],[202,-215],[163,-62]],[[57776,75399],[-239,79],[-283,-186]],[[57254,75292],[-3,-294],[-252,-56],[-196,206],[-222,-162],[-206,17]],[[56375,75003],[-20,391],[-139,189]],[[56216,75583],[46,84],[-30,70],[47,188],[105,185],[-135,255],[-24,216],[68,134]],[[55279,77084],[100,2],[-69,-260],[134,-227],[-41,-278],[-65,-27]],[[55338,76294],[-52,-53],[-90,-138],[-41,-325]],[[55155,75778],[-246,224],[-105,247],[-106,130],[-127,221],[-61,183],[-136,277],[59,245],[99,-136],[60,123],[130,13],[239,-98],[192,8],[126,-131]],[[56523,82432],[268,-4],[302,223],[64,333],[228,190],[-26,264]],[[57359,83438],[169,100],[298,228]],[[57826,83766],[293,-149],[39,-146],[146,70],[272,-141],[27,-277],[-60,-159],[174,-387],[113,-108],[-16,-107],[187,-104],[80,-157],[-108,-129],[-224,20],[-54,-55],[66,-196],[68,-379]],[[58829,81362],[-239,-35],[-85,-129],[-18,-298],[-111,57],[
-250,-28],[-73,138],[-104,-103],[-105,86],[-218,12],[-310,141],[-281,47],[-215,-14],[-152,-160],[-133,-23]],[[56535,81053],[-6,263],[-85,274],[166,121],[2,235],[-77,225],[-12,261]],[[25238,61101],[-2,87],[33,27],[51,-70],[99,357],[53,8]],[[25297,59966],[-83,0],[22,667],[2,468]],[[31359,37147],[-200,-81],[-109,814],[-150,663],[88,572],[-146,250],[-37,426],[-136,402]],[[30669,40193],[175,638],[-119,496],[63,199],[-49,219],[108,295],[6,503],[13,415],[60,200],[-240,951]],[[30686,44109],[206,-50],[143,13],[62,179],[243,239],[147,222],[363,100],[-29,-443],[34,-227],[-23,-396],[302,-529],[311,-98],[109,-220],[188,-117],[115,-172],[175,6],[161,-175],[12,-342],[55,-172],[3,-255],[-81,-10],[107,-688],[533,-24],[-41,-342],[30,-233],[151,-166],[66,-367],[-49,-465],[-77,-259],[27,-337],[-87,-122]],[[33842,38659],[-4,182],[-259,302],[-258,9],[-484,-172],[-133,-520],[-7,-318],[-110,-708]],[[34826,35372],[54,341],[38,350],[0,325],[-100,107],[-104,-96],[-103,26],[-33,228],[-26,541],[-52,177],[-187,1
60],[-114,-116],[-293,113],[18,802],[-82,329]],[[30686,44109],[-157,-102],[-126,68],[18,898],[-228,-348],[-245,15],[-105,315],[-184,34],[59,254],[-155,359],[-115,532],[73,108],[0,250],[168,171],[-28,319],[71,206],[20,275],[318,402],[227,114],[37,89],[251,-28]],[[30585,48040],[125,1620],[6,256],[-43,339],[-123,215],[1,430],[156,97],[56,-61],[9,226],[-162,61],[-4,370],[541,-13],[92,203],[77,-187],[55,-349],[52,73]],[[31423,51320],[153,-312],[216,38],[54,181],[206,138],[115,97],[32,250],[198,168],[-15,124],[-235,51],[-39,372],[12,396],[-125,153],[52,55],[206,-76],[221,-148],[80,140],[200,92],[310,221],[102,225],[-37,167]],[[33129,53652],[145,26],[64,-136],[-36,-259],[96,-90],[63,-274],[-77,-209],[-44,-502],[71,-299],[20,-274],[171,-277],[137,-29],[30,116],[88,25],[126,104],[90,157],[154,-50],[67,21]],[[34294,51702],[151,-48],[25,120],[-46,118],[28,171],[112,-53],[131,61],[159,-125]],[[34854,51946],[121,-122],[86,160],[62,-25],[38,-166],[133,42],[107,224],[85,436],[164,540]],[[35174,306
29],[-77,334],[122,280],[-160,402],[-218,327],[-286,379],[-103,-18],[-279,457],[-180,-63]],[[82069,53798],[-13,-291],[-16,-377],[-133,19],[-58,-202],[-126,307]],[[75471,66988],[113,-189],[-20,-363],[-227,-17],[-234,39],[-175,-92],[-252,224],[-6,119]],[[74670,66709],[184,439],[150,150],[198,-137],[147,-14],[122,-159]],[[58175,37528],[-393,-435],[-249,-442],[-93,-393],[-83,-
<TRUNCATED>
---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@qpid.apache.org
For additional commands, e-mail: commits-help@qpid.apache.org
[12/19] qpid-dispatch git commit: moved standalone to a subdir
Posted by ea...@apache.org.
http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/4940e63d/console/plugin/js/qdrTopology.js
----------------------------------------------------------------------
diff --git a/console/plugin/js/qdrTopology.js b/console/plugin/js/qdrTopology.js
deleted file mode 100644
index c8921ff..0000000
--- a/console/plugin/js/qdrTopology.js
+++ /dev/null
@@ -1,1871 +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) {
-
- /**
- * @method SettingsController
- * @param $scope
- * @param QDRServer
- *
- * Controller that handles the QDR settings page
- */
-
- /**
- * @function NavBarController
- *
- * @param $scope
- * @param workspace
- *
- * The controller for this plugin's navigation bar
- *
- */
-
- QDR.module.controller("QDR.TopologyController", ['$scope', '$rootScope', 'uiGridConstants', 'QDRService', '$uibModal', '$location', '$timeout',
- function($scope, $rootScope, uiGridConstants, QDRService, $uibModal, $location, $timeout) {
-
- QDR.log.debug("started QDR.TopologyController with location.url: " + $location.url());
- var urlPrefix = window.location.pathname;
-
- $scope.attributes = [];
- $scope.connAttributes = [];
- $scope.topoForm = "general";
- $scope.topoFormSelected = "";
- $scope.addingNode = {
- step: 0,
- hasLink: false,
- trigger: ''
- }; // shared object about the node that is be $scope.topoForm = "general";
-
- var generalCellTemplate = '<div class="ngCellText"><span title="{{row.entity.description}}">{{row.entity.attributeName}}</span></div>';
-
- $scope.isGeneral = function () {
- //QDR.log.debug("$scope.topoForm=" + $scope.topoForm)
- return $scope.topoForm === 'general';
- };
- $scope.isConnections = function () {
- //QDR.log.debug("$scope.topoForm=" + $scope.topoForm)
- return $scope.topoForm === 'connections';
- };
- $scope.isAddNode = function () {
- //QDR.log.debug("$scope.topoForm=" + $scope.topoForm)
- return $scope.topoForm === 'addNode';
- }
-
- $scope.getTableHeight = function (rows) {
- return {height: (rows.length * 30) + "px"};
- }
- $scope.isSelected = function () {
- return ($scope.topoFormSelected != "");
- }
-
- $scope.cancel = function () {
- $scope.addingNode.step = 0;
- }
- $scope.editNewRouter = function () {
- $scope.addingNode.trigger = 'editNode';
- }
-
- $scope.topoGridOptions = {
- data: 'attributes',
- enableColumnResize: true,
- enableHorizontalScrollbar: uiGridConstants.scrollbars.NEVER,
- enableVerticalScrollbar: uiGridConstants.scrollbars.NEVER,
- multiSelect: false,
- columnDefs: [
- {
- field: 'attributeName',
- displayName: 'Attribute',
- cellTemplate: generalCellTemplate
- },
- {
- field: 'attributeValue',
- displayName: 'Value'
- }
- ]
- };
- $scope.topoConnOptions = angular.copy($scope.topoGridOptions);
- $scope.topoConnOptions.data = 'connAttributes';
- 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: '3D Globe view', name: 'Globe', 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.topoForm = 'general'
- $scope.topoFormSelected = '';
- $scope.addingNode.step = 0;
- } else {
- // start adding node mode
- $scope.addingNode.step = 1;
- }
- } else {
- $scope.topoForm = 'general'
- $scope.topoFormSelected = '';
- $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;
- })
- $scope.topoForm = 'general'
- $scope.topoFormSelected = '';
- } else if (newValue > 0) {
- // we are starting the add mode
- $scope.topoForm = 'addNode';
- $scope.topoFormSelected = 'addNode';
-
- 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;
- }
-
-
- // 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 (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);
- }
-
- var mouseX, mouseY;
- // event handlers for popup context menu
- $(document).mousemove(function (e) {
- mouseX = e.clientX;
- mouseY = e.clientY;
- });
- $(document).mousemove();
- $(document).click(function (e) {
- $scope.contextNode = null;
- $(".contextMenu").fadeOut(200);
- });
-
-
- // set up SVG for D3
- var width, height;
- var tpdiv = $('#topology');
- var colors = {'inter-router': "#EAEAEA", 'normal': "#F0F000", 'on-demand': '#00F000'};
- var gap = 5;
- var radii = {'inter-router': 25, 'normal': 15, 'on-demand': 15};
- var radius = 25;
- var radiusNormal = 15;
- width = tpdiv.width() - gap;
- height = $(document).height() - gap;
-
- var svg;
- var force;
- var animate = false; // should the force graph organize itself when it is displayed
- var path, circle;
- var savedKeys = {};
-
- // 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) {
- var containerName;
- if (nodeInfo) {
- var node = nodeInfo[id];
- if (node) {
- containerName = node['.container'].results[0][0];
- }
- }
- return { key: id,
- name: name,
- nodeType: nodeType,
- containerName: containerName,
- 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});
- }
- }
-
- var cities = ["Raleigh"];
- var possibleCities = ["Boston","Tel Aviv-Yafo", "Brno", "Toronto", "Beijing", , "Ashburn", "Raleigh"]
- //var drag;
- // create an bare svg element and
- // initialize the nodes and links array from the QDRService.topology._nodeInfo object
- var initForceGraph = function () {
- //QDR.log.debug("initForceGraph called");
- nodes = [];
- links = [];
-
- svg = d3.select('#topology')
- .append('svg')
- .attr("id", "SVG_ID")
- .attr('width', width)
- .attr('height', height)
- .on("contextmenu", function(d) {
- 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) {
- d3.select("#crosssection").style("display","none");
- d3.select("#crosssection svg").remove();
-
- });
-
- // 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: height / 2 + yInit,
- fixed: false};
- }
- 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;
- cities = ["Raleigh"];
- for (var id in nodeInfo) {
- var onode = nodeInfo[id];
- var conns = onode['.connection'].results;
- var attrs = onode['.connection'].attributeNames;
-
- for (var j = 0; j < conns.length; j++) {
- var role = QDRService.valFor(attrs, conns[j], "role");
- 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);
- var parent = getNodeIndex(QDRService.nameFromId(id));
- //QDR.log.debug("external client parent is " + parent);
-
- // 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};
- }
- //QDR.log.debug("adding node " + nodeIndex);
- nodes.push( aNode(id, name, role, nodeInfo, nodes.length, position.x, position.y, j, position.fixed) );
- // now add a link
- getLink(parent, nodes.length-1, dir);
- client++;
-
-/*
- var container = QDRService.valFor(attrs, conns[j], "container");
- var parts = container.split('.')
- if (parts.length) {
- var city = parts[parts.length-1]
- if (city === 'TelAvivYafo')
- city = 'Tel Aviv-Yafo'
- if (possibleCities.indexOf(city) > -1) {
- if (cities.indexOf(city) == -1) {
- cities.push(city);
- }
- }
- } else {
- // there was no city
- var user = QDRService.valFor(attrs, conns[j], "user");
- city = 'Boston'
- if (cities.indexOf(city) == -1 && role == 'normal' && user != "anonymous") {
- cities.push(city);
- }
-
- }
-*/
- }
- }
- source++;
- }
-
- $scope.schema = QDRService.schema;
- // add a row for each attribute in .router attributeNames array
- for (var id in nodeInfo) {
- var onode = nodeInfo[id];
-
- initForm(onode['.connection'].attributeNames, onode['.connection'].results[0], QDRService.schema.entityTypes.connection, $scope.connAttributes);
- initForm(onode['.router'].attributeNames, onode['.router'].results[0], QDRService.schema.entityTypes.router, $scope.attributes);
-
- break;
- }
- // 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()
-
- //drag = force.drag()
- // .on("dragstart", dragstart);
-
- 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();
- }
-/*
- function dragstart(d) {
- d3.select(this).classed("fixed", d.fixed = true);
- }
-
- function dblclick(d) {
- d3.select(this).classed("fixed", d.fixed = false);
- }
-*/
- var initGlobe = function (clients) {
- d3.select(window)
- .on("mousemove", mousemove)
- .on("mouseup", mouseup);
-
- var width = 960,
- height = 500;
-
- var proj = d3.geo.orthographic()
- .scale(220)
- .translate([width / 2, height / 2])
- .clipAngle(90);
-
- var path = d3.geo.path().projection(proj).pointRadius(1.5);
-
- var links = [],
- arcLines = [];
-
- var graticule = d3.geo.graticule();
- d3.select("#geology svg").remove();
- var svg = d3.select("#geology").append("svg")
- .attr("width", width)
- .attr("height", height)
- .on("mousedown", mousedown);
-
- queue()
- .defer(d3.json, "plugin/data/world-110m.json")
- .defer(d3.json, "plugin/data/places1.json")
- .await(ready);
-
- function ready(error, world, places) {
- var ocean_fill = svg.append("defs").append("radialGradient")
- .attr("id", "ocean_fill")
- .attr("cx", "75%")
- .attr("cy", "25%");
- ocean_fill.append("stop").attr("offset", "5%").attr("stop-color", "#fff");
- ocean_fill.append("stop").attr("offset", "100%").attr("stop-color", "#eef");
-
- var globe_highlight = svg.append("defs").append("radialGradient")
- .attr("id", "globe_highlight")
- .attr("cx", "75%")
- .attr("cy", "25%");
- globe_highlight.append("stop")
- .attr("offset", "5%").attr("stop-color", "#ffd")
- .attr("stop-opacity","0.6");
- globe_highlight.append("stop")
- .attr("offset", "100%").attr("stop-color", "#ba9")
- .attr("stop-opacity","0.1");
-
- var globe_shading = svg.append("defs").append("radialGradient")
- .attr("id", "globe_shading")
- .attr("cx", "55%")
- .attr("cy", "45%");
- globe_shading.append("stop")
- .attr("offset","30%").attr("stop-color", "#fff")
- .attr("stop-opacity","0")
- globe_shading.append("stop")
- .attr("offset","100%").attr("stop-color", "#505962")
- .attr("stop-opacity","0.2")
-
- var drop_shadow = svg.append("defs").append("radialGradient")
- .attr("id", "drop_shadow")
- .attr("cx", "50%")
- .attr("cy", "50%");
- drop_shadow.append("stop")
- .attr("offset","20%").attr("stop-color", "#000")
- .attr("stop-opacity",".5")
- drop_shadow.append("stop")
- .attr("offset","100%").attr("stop-color", "#000")
- .attr("stop-opacity","0")
-
- svg.append("ellipse")
- .attr("cx", 440).attr("cy", 450)
- .attr("rx", proj.scale()*.90)
- .attr("ry", proj.scale()*.25)
- .attr("class", "noclicks")
- .style("fill", "url("+urlPrefix+"#drop_shadow)");
-
- svg.append("circle")
- .attr("cx", width / 2).attr("cy", height / 2)
- .attr("r", proj.scale())
- .attr("class", "noclicks")
- .style("fill", "url("+urlPrefix+"#ocean_fill)");
-
- svg.append("path")
- .datum(topojson.object(world, world.objects.land))
- .attr("class", "land noclicks")
- .attr("d", path);
-
- svg.append("path")
- .datum(graticule)
- .attr("class", "graticule noclicks")
- .attr("d", path);
-
- svg.append("circle")
- .attr("cx", width / 2).attr("cy", height / 2)
- .attr("r", proj.scale())
- .attr("class","noclicks")
- .style("fill", "url("+urlPrefix+"#globe_highlight)");
-
- svg.append("circle")
- .attr("cx", width / 2).attr("cy", height / 2)
- .attr("r", proj.scale())
- .attr("class","noclicks")
- .style("fill", "url("+urlPrefix+"#globe_shading)");
-
- var filtered = places.features.filter( function (feature) {
- return clients.indexOf(feature.properties.NAME) > -1
- })
- svg.append("g").attr("class","points")
- .selectAll("text").data(filtered)
- .enter().append("path")
- .attr("class", "point")
- .attr("d", path);
-
- svg.append("g").attr("class","labels")
- .selectAll("text").data(filtered)
- .enter().append("text")
- .attr("class", "label")
- .text(function(d) { return d.properties.NAME })
-
- position_labels();
-
- // spawn links between cities as source/target coord pairs
- places.features.forEach(function(a, i) {
- if (clients.indexOf(a.properties.NAME) > -1) {
- places.features.forEach(function(b, j) {
- if (b.properties.NAME === 'Raleigh') {
- if (j > i) { // avoid duplicates
- links.push({
- source: a.geometry.coordinates,
- target: b.geometry.coordinates
- });
- }
- }
- });
- }
- });
-
- // build geoJSON features from links array
- links.forEach(function(e,i,a) {
- var feature = { "type": "Feature", "geometry": { "type": "LineString", "coordinates": [e.source,e.target] }}
- arcLines.push(feature)
- })
-
- svg.append("g").attr("class","arcs")
- .selectAll("path").data(arcLines)
- .enter().append("path")
- .attr("class","arc")
- .attr("d",path)
- refresh();
- }
-
- function position_labels() {
- var centerPos = proj.invert([width/2,height/2]);
-
- var arc = d3.geo.greatArc();
-
- svg.selectAll(".label")
- .attr("transform", function(d) {
- var loc = proj(d.geometry.coordinates),
- x = loc[0],
- y = loc[1];
- var offset = x < width/2 ? -5 : 5;
- return "translate(" + (x+offset) + "," + (y-2) + ")"
- })
- .style("display",function(d) {
- var d = arc.distance({source: d.geometry.coordinates, target: centerPos});
- return (d > 1.57) ? 'none' : 'inline';
- })
- }
-
- function refresh() {
- svg.selectAll(".land").attr("d", path);
- svg.selectAll(".point").attr("d", path);
- svg.selectAll(".graticule").attr("d", path);
- svg.selectAll(".arc").attr("d", path);
- position_labels();
- }
-
- // modified from http://bl.ocks.org/1392560
- var m0, o0;
- o0 = angular.fromJson(localStorage["QDR.rotate"]);
- if (o0)
- proj.rotate(o0);
-
- function mousedown() {
- m0 = [d3.event.pageX, d3.event.pageY];
- o0 = proj.rotate();
- d3.event.preventDefault();
- }
- function mousemove() {
- if (m0) {
- var m1 = [d3.event.pageX, d3.event.pageY]
- , o1 = [o0[0] + (m1[0] - m0[0]) / 6, o0[1] + (m0[1] - m1[1]) / 6];
- o1[1] = o1[1] > 30 ? 30 :
- o1[1] < -30 ? -30 :
- o1[1];
- proj.rotate(o1);
- refresh();
- }
- }
- function mouseup() {
- if (m0) {
- mousemove();
- m0 = null;
- localStorage["QDR.rotate"] = angular.toJson(proj.rotate());
- }
- }
- }
-
- // called when we mouseover a node
- // we need to update the table
- function updateNodeForm (d) {
- //QDR.log.debug("update form info for ");
- //console.dump(d);
- var nodeInfo = QDRService.topology.nodeInfo();
- var onode = nodeInfo[d.key];
- if (onode) {
- var nodeResults = onode['.router'].results[0];
- var nodeAttributes = onode['.router'].attributeNames;
-
- for (var i=0; i<$scope.attributes.length; ++i) {
- var idx = nodeAttributes.indexOf($scope.attributes[i].attributeName);
- if (idx > -1) {
- if ($scope.attributes[i].attributeValue != nodeResults[idx]) {
- // highlight the changed data
- $scope.attributes[i].attributeValue = nodeResults[idx];
-
- }
- }
- }
- }
- $scope.topoForm = "general";
- $scope.$apply();
- }
-
- function updateConnForm (d, resultIndex) {
- var nodeInfo = QDRService.topology.nodeInfo();
- var onode = nodeInfo[d.key];
- if (onode && onode['.connection']) {
- var nodeResults = onode['.connection'].results[resultIndex];
- var nodeAttributes = onode['.connection'].attributeNames;
-
- for (var i=0; i<$scope.connAttributes.length; ++i) {
- var idx = nodeAttributes.indexOf($scope.connAttributes[i].attributeName);
- if (idx > -1) {
- try {
- if ($scope.connAttributes[i].attributeValue != nodeResults[idx]) {
- // highlight the changed data
- $scope.connAttributes[i].attributeValue = nodeResults[idx];
-
- }
- } catch (err) {
- QDR.log.error("error updating form" + err)
- }
- }
- }
- }
- $scope.topoForm = "connections";
- $scope.$apply();
- }
-
-
- function getContainerIndex(_id) {
- var nodeIndex = 0;
- var nodeInfo = QDRService.topology.nodeInfo();
- for (var id in nodeInfo) {
- var node = nodeInfo[id];
- if (node['.container'].results[0][0] == _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() {
- // 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 deltaX = d.target.x - d.source.x,
- deltaY = d.target.y - d.source.y,
- dist = Math.sqrt(deltaX * deltaX + deltaY * deltaY),
- normX = deltaX / dist,
- normY = deltaY / dist;
- var sourcePadding, targetPadding;
- if (d.target.nodeType == "inter-router") {
- // right arrow left line start
- sourcePadding = d.left ? radius + 8 : radius;
- // left arrow right line start
- targetPadding = d.right ? radius + 16 : radius;
- } else {
- sourcePadding = d.left ? radiusNormal + 18 : radiusNormal;
- targetPadding = d.right ? radiusNormal + 16 : radiusNormal;
- }
- var sourceX = d.source.x + (sourcePadding * normX),
- sourceY = d.source.y + (sourcePadding * normY),
- targetX = d.target.x - (targetPadding * normX),
- targetY = d.target.y - (targetPadding * normY);
- return 'M' + sourceX + ',' + sourceY + 'L' + targetX + ',' + targetY;
- });
-
- circle.attr('transform', function (d) {
- d.x = Math.max(d.x, radiusNormal * 2);
- d.y = Math.max(d.y, radiusNormal * 2);
- return 'translate(' + d.x + ',' + d.y + ')';
- });
- 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], "routerId" );
- 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;
- }
-
- // 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);
- //svg.classed('ctrl', true);
-
- // 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'; } )
- .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.name) {
- 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;
- }
- updateConnForm(left, resultIndex);
- }
-
- // select link
- mousedown_link = d;
- selected_link = mousedown_link;
- //selected_node = null;
- //mousedown_node = null;
- restart();
- })
- .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");
- // select link
- selected_link = null;
- //selected_node = null;
- //mousedown_node = null;
- restart();
- })
- .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');
- })
- .on("dblclick", function (d) {
- var pos = d3.mouse(this);
- var diameter = 400;
- var format = d3.format(",d");
- var pack = d3.layout.pack()
- .size([diameter - 4, diameter - 4])
- .padding(3)
- .value(function(d) { return d.size; });
-
- var svg = d3.select("#crosssection").append("svg")
- .attr("width", diameter)
- .attr("height", diameter);
- var svgg = svg.append("g")
- .attr("transform", "translate(2,2)");
-
- svg.on('click', function (d) {
- d3.select("#crosssection").style("display","none");
- })
-
- 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.containerName) {
- 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'];
- containerIndex = links.attributeNames.indexOf('remoteContainer');
- var nameIndex = links.attributeNames.indexOf('name');
- var linkDirIndex = links.attributeNames.indexOf('linkDir');
- links.results.forEach ( function (link) {
- if (link[containerIndex] == d.target.containerName)
- root.children.push (
- { name: "(" + link[linkDirIndex] + ") " + link[nameIndex],
- 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 + ")"; })
- .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" : ".3em"})
- .style("text-anchor", "middle")
- .text(function(d) {
- return d.name.substring(0, d.r / 3);
- });
-
- $('.hastip').tooltipsy({ alignTo: 'cursor'});
- d3.select("#crosssection").style("display","block");
- })
-
-
- // 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');
-
- // add new circles and set their attr/class/behavior
- 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' } )
-
-/*
- .style('fill', function (d) {
- var sColor = colors[d.nodeType];
- return (d === selected_node) ? d3.rgb(sColor).brighter().toString() : d3.rgb(sColor);
- })
- .style('stroke', function (d) {
- var sColor = colors[d.nodeType];
- return d3.rgb(sColor).darker().toString();
- })
-*/
- .on('mouseover', function (d) {
- 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");
- updateNodeForm(d);
- } else if (d.nodeType === 'normal' || d.nodeType === 'on-demand') {
- //QDR.log.debug("showing connections form");
- updateConnForm(d, 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) {
- // 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) {
- 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) {
- 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;
- $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;
- $scope.topoFormSelected = "";
- }
- else {
- selected_node = mousedown_node;
- if (d.nodeType === 'inter-router') {
- //QDR.log.debug("showing general form");
- updateNodeForm(d);
- $scope.topoFormSelected = "general";
- } else if (d.nodeType === 'normal' || d.nodeType === 'on-demand') {
- //QDR.log.debug("showing connections form");
- updateConnForm(d, d.resultIndex);
- $scope.topoFormSelected = "connections";
- }
- }
- for (var i=0; i<links.length; ++i) {
- links[i]['highlighted'] = false;
- }
- mousedown_node = null;
- $scope.$apply();
- restart(false);
-
- })
- .on("dblclick", function (d) {
- 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();
- $scope.$apply();
- }
- })
- .on("contextmenu", function(d) {
- $(document).click();
- d3.event.preventDefault();
- $scope.contextNode = d;
- $scope.$apply(); // we just changed a scope valiable during an async event
- d3.select('#node_context_menu')
- .style('left', (mouseX + $(document).scrollLeft()) + "px")
- .style('top', (mouseY + $(document).scrollTop()) + "px")
- .style('display', 'block');
-
- });
-
- // show node IDs
- g.append('svg:text')
- .attr('x', 0)
- .attr('y', 4)
- .attr('class', 'id')
- .text(function (d) {
- return (d.nodeType === 'normal' || d.nodeType == 'on-demand') ? d.name.slice(-1) :
- d.name.length>7 ? d.name.substr(0,6)+'...' : d.name;
- });
-
- // remove old nodes
- circle.exit().remove();
-
- if (!mousedown_node || !selected_node)
- return;
-
- if (!start)
- return;
- // set the graph in motion
- //QDR.log.debug("mousedown_node is " + mousedown_node);
- force.start();
-
- }
-
- 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();
- animate = true;
- initForceGraph();
- initGlobe(cities);
- //if ($location.path().startsWith("/topology"))
- // Core.notification('info', "Qpid dispatch router topology changed");
-
- } else {
- //QDR.log.debug("no changes")
- }
- });
-
- function hasChanged () {
- 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();
- });
-
- initForceGraph();
- saveChanged();
- QDRService.startUpdating();
-
- initGlobe(cities)//, "Boston", "Tel Aviv-Yafo"]);
-
- function doAddDialog(NewRouterName) {
- var modalInstance = $uibModal.open({
- animation: true,
- controller: 'QDR.NodeDialogController',
- templateUrl: 'node-config-template.html',
- size: 'lg',
- resolve: {
- newname: function () {
- return NewRouterName;
- }
- }
- });
- modalInstance.result.then(function (result) {
- if (result)
- setTimeout(doDownloadDialog, 100, result);
- });
- };
-
- function doDownloadDialog(result) {
- var modalInstance = $uibModal.open({
- animation: true,
- controller: 'QDR.DownloadDialogController',
- templateUrl: 'download-dialog-template.html',
- resolve: {
- results: function () {
- return result;
- }
- }
- });
- };
- }]);
-
- QDR.module.controller("QDR.NodeDialogController", function($scope, QDRService, $uibModalInstance, newname) {
- var schema = QDRService.schema;
- var myEntities = ['container', '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 == 'addr'})[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 == 'addr'})[0].value =
- QDRService.valFor(attrs, res, 'addr')
- 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 == 'addr'})[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.cancel = function () {
- $uibModalInstance.close()
- };
- $scope.testPattern = function (attr) {
- if (attr.rawtype == 'path')
- return /^(\/)?([^/\0]+(\/)?)+$/;
- //return /^(.*\/)([^/]*)$/;
- return /(.*?)/;
- }
-
- $scope.attributeDescription = '';
- $scope.attributeType = '';
- $scope.attributeRequired = '';
- $scope.attributeUnique = '';
- $scope.active = 'container'
- $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 () {
- $uibModalInstance.close({entities: $scope.entities, annotations: annotations});
- }
-
- $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();
-
- });
-
-QDR.module.controller("QDR.DownloadDialogController", function($scope, QDRService, $templateCache, $window, $uibModalInstance, 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 blob = new Blob([$scope.output], { type: 'text/plain' });
- var downloadLink = angular.element('<a></a>');
- downloadLink.attr('href', ($window.URL || $window.webkitURL).createObjectURL(blob));
- downloadLink.attr('download', $scope.newRouterName);
- downloadLink[0].click();
- }
-
- $scope.downloadPart = function (part) {
- var linkName = part.link.__data__.source.name + 'additional.conf';
- var blob = new Blob([part.output], { type: 'text/plain' });
- var downloadLink = angular.element('<a></a>');
- downloadLink.attr('href', ($window.URL || $window.webkitURL).createObjectURL(blob));
- downloadLink.attr('download', linkName);
- downloadLink[0].click();
-
- QDR.log.debug(part);
- }
-
- $scope.done = function () {
- $uibModalInstance.close();
- }
-});
-
- return QDR;
-}(QDR || {}));
http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/4940e63d/console/plugin/lib/jquery.tipsy.js
----------------------------------------------------------------------
diff --git a/console/plugin/lib/jquery.tipsy.js b/console/plugin/lib/jquery.tipsy.js
deleted file mode 100644
index 7c12d4e..0000000
--- a/console/plugin/lib/jquery.tipsy.js
+++ /dev/null
@@ -1,418 +0,0 @@
-// tipsy, facebook style tooltips for jquery
-// version 1.0.2
-// (c) 2008-2010 jason frame [jason@onehackoranother.com]
-// released under the MIT license
-
-(function($, window, undefined) {
-
- function maybeCall(thing, ctx) {
- return (typeof thing == 'function') ? (thing.call(ctx)) : thing;
- }
-
- function isElementInDOM(ele) {
- while (ele = ele.parentNode) {
- if (ele == document) return true;
- }
- return false;
- }
-
- // Returns true if it is a DOM element
- // http://stackoverflow.com/a/384380/999
- function isElement(o){
- return (
- typeof HTMLElement === "object" ? o instanceof HTMLElement : //DOM2
- o && typeof o === "object" && o.nodeType === 1 && typeof o.nodeName==="string"
- );
- }
-
- var tipsyIDcounter = 0;
- function tipsyID() {
- return "tipsyuid" + (tipsyIDcounter++);
- }
-
- function Tipsy(element, options) {
- this.$element = $(element);
- this.options = options;
- this.enabled = true;
- this.fixTitle();
- }
-
- Tipsy.prototype = {
- show: function() {
- if (!isElementInDOM(this.$element[0])) {
- return;
- }
-
- if (isElement(this.$element) && !this.$element.is(':visible')) {
- return;
- }
-
- var title;
- if (this.enabled && (title = this.getTitle())) {
- var $tip = this.tip();
-
- $tip.find('.tipsy-inner' + this.options.theme)[this.options.html ? 'html' : 'text'](title);
-
- $tip[0].className = 'tipsy' + this.options.theme; // reset classname in case of dynamic gravity
- if (this.options.className) {
- $tip.addClass(maybeCall(this.options.className, this.$element[0]));
- }
-
- $tip.remove().css({top: 0, left: 0, width: 'auto', visibility: 'hidden', display: 'block'}).prependTo(document.body);
-
- var pos = $.extend({}, this.$element.offset());
-
- // If the element is contained in a SVG object, use getBBox
- if (this.$element.parents('svg').size() > 0) {
- pos = $.extend(pos, this.$element[0].getBBox());
- } else {
- pos = $.extend(pos, {
- width: this.$element[0].offsetWidth || 0,
- height: this.$element[0].offsetHeight || 0
- });
- }
-
- var actualWidth = $tip[0].offsetWidth,
- actualHeight = $tip[0].offsetHeight,
- gravity = maybeCall(this.options.gravity, this.$element[0]);
-
- var tp;
- switch (gravity.charAt(0)) {
- case 'n':
- tp = {top: pos.top + pos.height + this.options.offset, left: pos.left + pos.width / 2 - actualWidth / 2};
- break;
- case 's':
- tp = {top: pos.top - actualHeight - this.options.offset, left: pos.left + pos.width / 2 - actualWidth / 2};
- break;
- case 'e':
- tp = {top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left - actualWidth - this.options.offset};
- break;
- case 'w':
- tp = {top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left + pos.width + this.options.offset};
- break;
- default:
- break;
- }
-
- if (gravity.length == 2) {
- if (gravity.charAt(1) == 'w') {
- tp.left = pos.left + pos.width / 2 - 15;
- } else {
- tp.left = pos.left + pos.width / 2 - actualWidth + 15;
- }
- }
-
- $tip.css(tp).addClass('tipsy-' + gravity + this.options.theme);
- $tip.find('.tipsy-arrow' + this.options.theme)[0].className = 'tipsy-arrow' + this.options.theme + ' tipsy-arrow-' + gravity.charAt(0) + this.options.theme;
- $tip.css({width: (actualWidth - 8) + 'px'});
-
- if (this.options.fade) {
- if(this.options.shadow)
- $(".tipsy-inner").css({'box-shadow': '0px 0px '+this.options.shadowBlur+'px '+this.options.shadowSpread+'px rgba(0, 0, 0, '+this.options.shadowOpacity+')', '-webkit-box-shadow': '0px 0px '+this.options.shadowBlur+'px '+this.options.shadowSpread+'px rgba(0, 0, 0, '+this.options.shadowOpacity+')'});
- $tip.stop().css({opacity: 0, display: 'block', visibility: 'visible'}).animate({opacity: this.options.opacity}, this.options.fadeInTime);
- } else {
- $tip.css({visibility: 'visible', opacity: this.options.opacity});
- }
-
- if (this.options.aria) {
- var $tipID = tipsyID();
- $tip.attr("id", $tipID);
- this.$element.attr("aria-describedby", $tipID);
- }
- }
- },
-
- hide: function() {
- if (this.options.fade) {
- this.tip().stop().fadeOut(this.options.fadeOutTime, function() { $(this).remove(); });
- } else {
- this.tip().remove();
- }
- if (this.options.aria) {
- this.$element.removeAttr("aria-describedby");
- }
- },
-
- fixTitle: function() {
- var $e = this.$element,
- id = maybeCall(this.options.id, this.$element[0]);
- if ($e.prop('title') || typeof($e.prop('original-title')) != 'string') {
- $e.prop('original-title', $e.prop('title') || '').removeAttr('title');
- // add aria-describedby pointing to the tooltip's id
- $e.attr('aria-describedby', id);
- // if it doesn't already have a tabindex, force the trigger element into the tab cycle
- // to make it keyboard accessible with tabindex=0. this automatically makes elements
- // that are not normally keyboard accessible (div or span) that have been tipsy-fied
- // also operable with the keyboard.
- if ($e.attr('tabindex') === undefined) {
- $e.attr('tabindex', 0);
- }
- }
- },
-
- getTitle: function() {
- var title, $e = this.$element, o = this.options;
- this.fixTitle();
- if (typeof o.title == 'string') {
- title = $e.prop(o.title == 'title' ? 'original-title' : o.title);
- } else if (typeof o.title == 'function') {
- title = o.title.call($e[0]);
- }
- title = ('' + title).replace(/(^\s*|\s*$)/, "");
- return title || o.fallback;
- },
-
- tip: function() {
- var id = maybeCall(this.options.id, this.$element[0]);
-
- if (!this.$tip) {
- // generate tooltip, with appropriate ARIA role and an 'id' (can be set in options),
- // so it can be targetted by aria-describedby in the trigger element
- this.$tip = $('<div class="tipsy' + this.options.theme + '" id="'+id+'" role="tooltip"></div>').html('<div class="tipsy-arrow' + this.options.theme + '"></div><div class="tipsy-inner' + this.options.theme + '"></div>').attr("role","tooltip");
- this.$tip.data('tipsy-pointee', this.$element[0]);
- }
- return this.$tip;
- },
-
- validate: function() {
- if (!this.$element[0].parentNode) {
- this.hide();
- this.$element = null;
- this.options = null;
- }
- },
-
- enable: function() { this.enabled = true; },
- disable: function() { this.enabled = false; },
- toggleEnabled: function() { this.enabled = !this.enabled; }
- };
-
- $.fn.tipsy = function(options) {
-
- $.fn.tipsy.enable();
-
- if (options === true) {
- return this.data('tipsy');
- } else if (typeof options == 'string') {
- var tipsy = this.data('tipsy');
- if (tipsy) tipsy[options]();
- return this;
- }
-
- options = $.extend({}, $.fn.tipsy.defaults, options);
-
- // Establish theme
- options.theme = (options.theme && options.theme !== '') ? '-' + options.theme : '';
-
- function get(ele) {
- var tipsy = $.data(ele, 'tipsy');
- if (!tipsy) {
- tipsy = new Tipsy(ele, $.fn.tipsy.elementOptions(ele, options));
- $.data(ele, 'tipsy', tipsy);
- }
- return tipsy;
- }
-
- function enter() {
- if ($.fn.tipsy.enabled !== true) {
- return;
- }
- var tipsy = get(this);
- tipsy.hoverState = 'in';
- if (options.delayIn === 0) {
- tipsy.show();
- } else {
- tipsy.fixTitle();
- setTimeout(function() {
- if (tipsy.hoverState == 'in' && isElementInDOM(tipsy.$element)) {
- tipsy.show();
- }
- }, options.delayIn);
- }
- }
-
- function leave() {
- var tipsy = get(this);
- tipsy.hoverState = 'out';
- if (options.delayOut === 0) {
- tipsy.hide();
- } else {
- setTimeout(function() { if (tipsy.hoverState == 'out' || !tipsy.$element || !tipsy.$element.is(':visible')) tipsy.hide(); }, options.delayOut);
- }
- }
-
- if (!options.live) this.each(function() { get(this); });
-
- if (options.trigger != 'manual') {
- // one of the biggest changes from 1.0.0a: by default, bind to BOTH mouseenter/mouseleave AND focus/blur
- // this ensures out-of-the-box keyboard accessibility, showing tooltips when users TAB to a (focusable) element
- // sites that still use 'hover' will also get this new interactive behavior automatically, only those who
- // explicitly set 'focus' will only get focus/blur (for forms, for instance)
-
- if (options.live && options.live !== true) {
- if (options.trigger != 'focus') {
- $(this).on('mouseenter', options.live, enter);
- $(this).on('mouseleave', options.live, leave);
- }
- if (options.trigger != 'blur') {
- $(this).on('focus', options.live, enter);
- $(this).on('blur', options.live, leave);
- }
- } else {
- if (options.live && !$.live) {
- //live === true and using jQuery >= 1.9
- throw "Since jQuery 1.9, pass selector as live argument. eg. $(document).tipsy({live: 'a.live'});";
- }
- var binder = options.live ? 'live' : 'bind';
- if (options.trigger != 'focus') {
- this[binder]('mouseenter', enter)[binder]('mouseleave', leave);
- }
- if (options.trigger != 'blur') {
- this[binder]('focus', enter)[binder]('blur', leave);
- }
- }
- }
-
- return this;
-
- };
-
- $.fn.tipsy.defaults = {
- aria: false,
- className: null,
- id: 'tipsy',
- delayIn: 0,
- delayOut: 0,
- fade: false,
- fadeInTime: 400,
- fadeOutTime: 400,
- shadow: false,
- shadowBlur: 8,
- shadowOpacity: 1,
- shadowSpread: 0,
- fallback: '',
- gravity: 'n',
- html: false,
- live: false,
- offset: 0,
- opacity: 0.8,
- title: 'title',
- trigger: 'interactive',
- theme: ''
- };
-
- $.fn.tipsy.revalidate = function() {
- $('.tipsy').each(function() {
- var pointee = $.data(this, 'tipsy-pointee');
- if (!pointee || !isElementInDOM(pointee)) {
- $(this).remove();
- }
- });
- };
-
- $.fn.tipsy.enable = function() {
- $.fn.tipsy.enabled = true;
- };
-
- $.fn.tipsy.disable = function() {
- $.fn.tipsy.enabled = false;
- };
-
- // Overwrite this method to provide options on a per-element basis.
- // For example, you could store the gravity in a 'tipsy-gravity' attribute:
- // return $.extend({}, options, {gravity: $(ele).prop('tipsy-gravity') || 'n' });
- // (remember - do not modify 'options' in place!)
- $.fn.tipsy.elementOptions = function(ele, options) {
- return $.metadata ? $.extend({}, options, $(ele).metadata()) : options;
- };
-
- $.fn.tipsy.autoNS = function() {
- return $(this).offset().top > ($(document).scrollTop() + $(window).height() / 2) ? 's' : 'n';
- };
-
- $.fn.tipsy.autoWE = function() {
- return $(this).offset().left > ($(document).scrollLeft() + $(window).width() / 2) ? 'e' : 'w';
- };
-
- $.fn.tipsy.autoNWNE = function() {
- return $(this).offset().left > ($(document).scrollLeft() + $(window).width() / 2) ? 'ne' : 'nw';
- };
-
- $.fn.tipsy.autoSWSE = function() {
- return $(this).offset().left > ($(document).scrollLeft() + $(window).width() / 2) ? 'se' : 'sw';
- };
-
- /**
- * yields a closure of the supplied parameters, producing a function that takes
- * no arguments and is suitable for use as an autogravity function like so:
- *
- * @param marginNorth (int) - distance from the viewable region top edge that an
- * element should be before setting its tooltip's gravity to be away
- * from that edge.
- * @param marginEast (int) - distance from the viewable region right edge that an
- * element should be before setting its tooltip's gravity to be away
- * from that edge.
- * @param prefer (string, e.g. 'n', 'sw', 'w') - the direction to prefer
- * if there are no viewable region edges effecting the tooltip's
- * gravity. It will try to vary from this minimally, for example,
- * if 'sw' is preferred and an element is near the right viewable
- * region edge, but not the top edge, it will set the gravity for
- * that element's tooltip to be 'se', preserving the southern
- * component.
- */
- $.fn.tipsy.autoBounds = function(marginNorth, marginEast, prefer) {
- return function() {
- var dir = {ns: prefer[0], ew: (prefer.length > 1 ? prefer[1] : false)},
- boundTop = $(document).scrollTop() + marginNorth,
- boundLeft = $(document).scrollLeft() + marginEast,
- $this = $(this);
-
- if ($this.offset().top < boundTop) dir.ns = 'n';
- if ($this.offset().left < boundLeft) dir.ew = 'w';
- if ($(window).width() + $(document).scrollLeft() - $this.offset().left < marginEast) dir.ew = 'e';
- if ($(window).height() + $(document).scrollTop() - $this.offset().top < marginNorth) dir.ns = 's';
-
- return dir.ns + (dir.ew ? dir.ew : '');
- };
- };
-
- /**
- * Improved version of autoBounds for automatic placement of chunky tips
- * The original autoBounds failed in two regards: 1. it would never return a 'w' or 'e', gravity even if they
- * were preferred and/or optimal, 2. it only respected the margin between the left hand side of an element and
- * left hand side of the viewport, and the top of an element and the top of the viewport. This version checks
- * to see if the bottom of an element is too close to the bottom of the screen, similarly for the right hand side
- */
- $.fn.tipsy.autoBounds2 = function(margin, prefer) {
- return function() {
- var dir = {},
- boundTop = $(document).scrollTop() + margin,
- boundLeft = $(document).scrollLeft() + margin,
- $this = $(this);
-
- // bi-directional string (ne, se, sw, etc...)
- if (prefer.length > 1) {
- dir.ns = prefer[0];
- dir.ew = prefer[1];
- } else {
- // single direction string (e, w, n or s)
- if (prefer[0] == 'e' || prefer[0] == 'w') {
- dir.ew = prefer[0];
- } else {
- dir.ns = prefer[0];
- }
- }
-
- if ($this.offset().top < boundTop) dir.ns = 'n';
- if ($this.offset().left < boundLeft) dir.ew = 'w';
- if ($(window).width() + $(document).scrollLeft() - ($this.offset().left + $this.width()) < margin) dir.ew = 'e';
- if ($(window).height() + $(document).scrollTop() - ($this.offset().top + $this.height()) < margin) dir.ns = 's';
-
- if (dir.ns) {
- return dir.ns + (dir.ew ? dir.ew : '');
- }
- return dir.ew;
- }
- };
-
-})(jQuery, window);
---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@qpid.apache.org
For additional commands, e-mail: commits-help@qpid.apache.org
[14/19] qpid-dispatch git commit: moved standalone to a subdir
Posted by ea...@apache.org.
http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/4940e63d/console/plugin/html/qdrCharts.html
----------------------------------------------------------------------
diff --git a/console/plugin/html/qdrCharts.html b/console/plugin/html/qdrCharts.html
deleted file mode 100644
index 8ba1ffe..0000000
--- a/console/plugin/html/qdrCharts.html
+++ /dev/null
@@ -1,150 +0,0 @@
-<div class="main-display row-fluid qdrCharts" ng-controller="QDR.ChartsController">
- <div ng-show="hasCharts()">
- <div ng-repeat="chart in svgCharts" class="chartContainer">
- <p class="chartLabels">
- <button ng-click="delChart(chart)" title="Delete"><i class="icon-trash"></i></button>
- <button ng-click="editChart(chart)" title="Configure"><i class="icon-edit"></i></button>
- <button ng-click="zoomChart(chart)" title="Zoom {{chart.zoomed ? 'in' : 'out'}}" ng-if="!chart.chart.request().nodeList"><i ng-class="chart.zoomed ? 'icon-zoom-in' : 'icon-zoom-out'"></i></button>
- </p><div style="clear:both"></div>
- <div id="{{chart.chart.id()}}" class="aChart d3Chart"></div>
- </div>
- <div ng-init="chartsLoaded()"></div>
- </div>
- <div ng-hide="hasCharts()" class="centered">
- There are no charts. To add charts to this page, click on a <i class="icon-bar-chart"></i> icon on the <button ng-click="showListPage()"><i class="icon-list "></i> List</button> page.
- </div>
-</div>
-
-<!--
- This is the template for the graph dialog that is displayed. It uses the
- dialogCtrl controller in qdrCharts.js.
--->
-<script type="text/ng-template" id="chart-config-template.html">
-<div class="chartOptions">
- <div class="modal-header">
- <h3 class="modal-title">Chart {{chart.attr() | humanify}}</h3>
- </div>
- <div class="modal-body">
- <div id="{{svgDivId}}" class="d3Chart"></div>
- <uib-tabset>
- <uib-tab heading="Type">
- <legend>Chart type</legend>
- <label><input type="radio" ng-model="dialogChart.type" value="value" ng-change="chartChanged()" /> Value Chart</label>
- <label><input type="radio" ng-model="dialogChart.type" value="rate" ng-change="chartChanged()" /> Rate Chart</label>
- <div class="dlg-slider" ng-show="dialogChart.type=='rate'">
- <span>Rate Window: {{rateWindow}} second{{rateWindow > 1 ? "s" : ""}}</span>
- <div class="slider" ui-slider="slider.options" ng-model="rateWindow"></div>
- </div>
- <div style="clear:both;"> </div>
- </uib-tab>
- <uib-tab heading="Colors">
- <legend>Chart colors</legend>
- <div class="colorPicker">
- <div>Area</div><input minicolors="areaColor" id="position-bottom-left" type="text" ng-model="dialogChart.areaColor" />
- </div>
- <div class="colorPicker">
- <div>Line</div><input minicolors="lineColor" id="position-bottom-left" type="text" ng-model="dialogChart.lineColor" />
- </div>
- <div style="clear:both;"> </div>
- </uib-tab>
- <uib-tab heading="Duration">
- <legend>Chart duration</legend>
- <div class="dlg-slider duration">
- <span>Show data for past {{dialogChart.visibleDuration}} minute{{dialogChart.visibleDuration > 1 ? "s" : ""}}</span> <div class="slider" ui-slider="duration.options" ng-model="dialogChart.visibleDuration"></div>
- </div>
- <div style="clear:both;"> </div>
-
- </uib-tab>
- </uib-tabset>
- </div>
- <div class="modal-footer">
- <button class="btn btn-success" type="button" ng-click="apply()">Apply to existing chart</button>
- <button class="btn btn-info" type="button" ng-click="copyToDashboard()">Create new chart</button>
- <button class="btn btn-primary" type="button" ng-click="okClick()">Close</button>
- </div>
-</div>
-<!--
- <div class="chartOptions" title="Configure chart" ng-controller="QDR.ChartDialogController">
- <p class="dialogHeader">Title: <input type="text" ng-model="userTitle" /></p>
- <div id="{{svgDivId}}" class="d3Chart"></div>
- <p></p>
- <uib-tabset>
- <uib-tab heading="Type">
- <legend>Chart type</legend>
- <label><input type="radio" ng-model="dialogChart.type" value="value" ng-change="chartChanged()" /> Value Chart</label>
- <label><input type="radio" ng-model="dialogChart.type" value="rate" ng-change="chartChanged()" /> Rate Chart</label>
-
- <div class="dlg-slider" ng-show="dialogChart.type=='rate'">
- <span>Rate Window: {{rateWindow}} second{{rateWindow > 1 ? "s" : ""}}</span>
- <div class="slider" ui-slider="slider.options" ng-model="rateWindow"></div>
- </div>
- <div style="clear:both;"> </div>
- </uib-tab>
- <uib-tab heading="Colors">
- <legend>Chart colors</legend>
- <div class="colorPicker">
- <div>Area</div><input minicolors="areaColor" id="position-bottom-left" type="text" ng-model="dialogChart.areaColor" />
- </div>
- <div class="colorPicker">
- <div>Line</div><input minicolors="lineColor" id="position-bottom-left" type="text" ng-model="dialogChart.lineColor" />
- </div>
- <div style="clear:both;"> </div>
- </uib-tab>
- <uib-tab heading="Duration">
- <legend>Chart duration</legend>
- <div class="dlg-slider duration">
- <span>Show data for past {{dialogChart.visibleDuration}} minute{{dialogChart.visibleDuration > 1 ? "s" : ""}}</span> <div class="slider" ui-slider="duration.options" ng-model="dialogChart.visibleDuration"></div>
- </div>
- <div style="clear:both;"> </div>
-
- </uib-tab>
- </uib-tabset>
-
- <tabset>
- <tab heading="Type">
- <div>
- <legend>Chart type</legend>
- <label>
- <input type="radio" ng-model="dialogChart.type" value="value" ng-change="chartChanged()" />
- Value Chart
- </label>
- <label class="rateGroup">
- <input type="radio" ng-model="dialogChart.type" value="rate" ng-change="chartChanged()" /> Rate Chart
- </label>
- <div class="dlg-slider" ng-show="dialogChart.type=='rate'">
- <span>Rate Window: {{rateWindow}} second{{rateWindow > 1 ? "s" : ""}}</span> <div class="slider" ui-slider="slider.options" ng-model="rateWindow"></div>
- </div>
- </div>
- <div style="clear:both;"> </div>
- </tab>
- <tab heading="Colors">
- <div>
- <legend>Chart colors</legend>
- <div class="colorPicker">
- <div>Area</div><input minicolors="areaColor" id="position-bottom-left" type="text" ng-model="dialogChart.areaColor" />
- </div>
- <div class="colorPicker">
- <div>Line</div><input minicolors="lineColor" id="position-bottom-left" type="text" ng-model="dialogChart.lineColor" />
- </div>
- </div>
- <div style="clear:both;"> </div>
- </tab>
- <tab heading="Duration">
- <div>
- <legend>Chart duration</legend>
- </div>
- <div class="dlg-slider duration">
- <span>Show data for past {{dialogChart.visibleDuration}} minute{{dialogChart.visibleDuration > 1 ? "s" : ""}}</span> <div class="slider" ui-slider="duration.options" ng-model="dialogChart.visibleDuration"></div>
- </div>
- <div style="clear:both;"> </div>
- </tab>
- </tabset>
- <div class="okButton">
- <button ng-click="apply()">Apply to existing chart</button>
- <button ng-click="copyToDashboard()">Create new chart</button>
- <button ng-click="okClick()">Close</button>
- </div>
- </div>
--->
-</script>
-
http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/4940e63d/console/plugin/html/qdrConnect.html
----------------------------------------------------------------------
diff --git a/console/plugin/html/qdrConnect.html b/console/plugin/html/qdrConnect.html
deleted file mode 100644
index 34e452f..0000000
--- a/console/plugin/html/qdrConnect.html
+++ /dev/null
@@ -1,65 +0,0 @@
-<div class="row-fluid" ng-controller="QDR.SettingsController">
- <div class="login container" ng-hide="connecting">
- <div class="row" id="login-container">
- <div class="span2 offset4">
- <!-- <div simple-form name="settings" data="formConfig" entity="formEntity"></div> -->
- <form class="form-horizontal no-bottom-margin" novalidate name="settings" action="" method="post">
- <fieldset>
- <div class="control-group">
- <label class="control-label">Address: </label>
- <div class="controls">
- <input type="text" description="Router address" ng-model="formEntity.address" name="address" required="required" autofocus="autofocus" class="ng-pristine ng-valid ng-valid-required">
- <span class="help-block"></span>
- </div>
- </div>
- <div class="control-group">
- <label class="control-label" title="Port to connect to, by default 5673">Port: </label>
- <div class="controls">
- <input type="number" description="Router port" tooltip="Ports to connect to, by default 5672" ng-model="formEntity.port" name="port" title="Port to connect to, by default 5673" class="ng-scope ng-pristine ng-valid ng-valid-number">
- <span class="help-block"></span>
- </div>
- </div>
- <!--
- <div class="control-group">
- <label class="control-label">Username: </label>
- <div class="controls">
- <input type="text" description="User Name" ng-model="formEntity.username" name="username" class="ng-pristine ng-valid">
- <span class="help-block"></span>
- </div>
- </div>
- <div class="control-group">
- <label class="control-label">Password: </label>
- <div class="controls">
- <input type="password" description="Password" ng-model="formEntity.password" name="password" class="ng-pristine ng-valid">
- <span class="help-block"></span>
- </div>
- </div>
- -->
- <div class="control-group">
- <label class="control-label" title="Whether or not the connection should be started as soon as you navigate to the console">Autostart: </label>
- <div class="controls">
- <input type="checkbox" description="Connect at startup" tooltip="Whether or not the connection should be started as soon as you navigate to the console" ng-model="formEntity.autostart" name="autostart" title="Whether or not the connection should be started as soon as you log into hawtio" class="ng-scope ng-pristine ng-valid">
- <span class="help-block"></span>
- </div>
- </div>
- <input type="submit" style="position: absolute; left: -9999px; width: 1px; height: 1px;">
- </fieldset>
- </form>
- <p></p>
- <div>
- <button class="btn btn-primary pull-right" ng-disabled="settings.$invalid" ng-click="connect()">{{buttonText()}}</button>
- </div>
- </div>
- </div>
- </div>
-
- <div class="span4 centered" ng-show="connecting">
- <i class="icon-spin icon-spinner icon-4x"></i>
- <p>Please wait, connecting now...</p>
- </div>
- <div class="centered" ng-show="connectionError">
- <p>There was a connection error: {{connectionErrorText}}</p>
- </div>
-
- <div class="span4"></div>
-</div>
http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/4940e63d/console/plugin/html/qdrGraphs.html
----------------------------------------------------------------------
diff --git a/console/plugin/html/qdrGraphs.html b/console/plugin/html/qdrGraphs.html
deleted file mode 100644
index c311246..0000000
--- a/console/plugin/html/qdrGraphs.html
+++ /dev/null
@@ -1,15 +0,0 @@
-<div ng-controller="QDR.ListController" title=""
- class="prefs">
- <div class="row-fluid">
- <div class="tabbable">
- <div value="graphs"
- class="tab-pane"
- title="graphs">
- <div>
- <div id="graph"></div>
-
- </div>
- </div>
- </div>
- </div>
-</div>
http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/4940e63d/console/plugin/html/qdrLayout.html
----------------------------------------------------------------------
diff --git a/console/plugin/html/qdrLayout.html b/console/plugin/html/qdrLayout.html
deleted file mode 100644
index d164f8a..0000000
--- a/console/plugin/html/qdrLayout.html
+++ /dev/null
@@ -1,26 +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.
--->
-<ul class="nav nav-tabs connected" ng-controller="QDR.NavBarController">
- <li ng-repeat="link in breadcrumbs" ng-show="isValid(link)" ng-class='{active : isActive(link.href), "pull-right" : isRight(link), haschart: hasChart(link)}'>
- <a ng-href="{{link.href}}{{hash}}" ng-bind-html="link.content | to_trusted"></a>
- </li>
-</ul>
-<div class="row-fluid">
- <div ng-view></div>
-</div>
http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/4940e63d/console/plugin/html/qdrList.html
----------------------------------------------------------------------
diff --git a/console/plugin/html/qdrList.html b/console/plugin/html/qdrList.html
deleted file mode 100644
index 156b21a..0000000
--- a/console/plugin/html/qdrList.html
+++ /dev/null
@@ -1,56 +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="main-display row-fluid qdrList" ng-controller="QDR.ListController">
- <ul class="nav nav-tabs qdrListNodes">
- <li ng-repeat="node in nodes" ng-click="selectNode(node)" ng-class="{active : isNodeSelected(node.id)}"> <span>{{node.name}}</span> </li>
- </ul>
-
- <div class="row-fluid qdrListActions">
- <ul class="nav nav-tabs ng-scope">
- <li ng-repeat="entity in entities" ng-class="{active : isActionActive(entity.name)}" ng-click="selectAction(entity.name)" >
- <a title="{{entity.title}}" data-placement="bottom"> {{entity.humanName}} </a></li>
- </ul>
- <div class="gridStyle" ng-style="getTableHeight()" ui-grid-auto-resize ui-grid-selection ui-grid="gridDef"></div>
- <div class="selectedItems">
- <div ng-style="getDetailsTableHeight()" ui-grid-auto-resize ui-grid-selection ui-grid="details"></div>
- </div>
- </div>
-</div>
-<!--
- This is the template for the graph dialog that is displayed. It uses the
- dialogCtrl controller in qdrList.js.
--->
-<script type="text/ng-template" id="template-from-script.html">
- <div class="modal-header">
- <h3 class="modal-title">Chart {{chart.attr() | humanify}}</h3>
- </div>
- <div class="modal-body">
- <div id="{{svgDivId}}" class="d3Chart"></div>
- </div>
- <div class="modal-footer">
- <span ng-hide="isOnChartsPage()">
- <button class="btn btn-success" type="button" ng-click="addChartsPage()"><i class="icon-bar-chart"></i> Add</button> this chart to the Charts page.
- </span>
- <span ng-show="isOnChartsPage()">
- <button class="btn btn-danger" type="button" ng-click="delChartsPage()">Remove</button> this chart from the <button class="btn btn-success" type="button" ng-click="showChartsPage()"><i class="icon-bar-chart"></i> Charts</button> page.
- </span>
- <button class="btn btn-primary" type="button" ng-click="ok()">Close</button>
- </div>
-</script>
-
http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/4940e63d/console/plugin/html/qdrOverview.html
----------------------------------------------------------------------
diff --git a/console/plugin/html/qdrOverview.html b/console/plugin/html/qdrOverview.html
deleted file mode 100644
index d63ea0e..0000000
--- a/console/plugin/html/qdrOverview.html
+++ /dev/null
@@ -1,83 +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 ng-controller="QDR.OverviewController">
-
- <div class="treeContainer">
- <div id="overtree"></div>
- </div>
-
- <div class="treeDetails" ng-include="template.url"></div>
-</div>
-
-
-<!-- the following scripts are content that gets loaded into the above div that has the temple.url -->
-<script type="text/ng-template" id="routers.html">
- <div class="row-fluid">
- <h3>Routers</h3>
- <div class="overview">
- <div class="gridStyle" ng-style="getGridHeight(allRouters)" ui-grid-auto-resize ui-grid-selection ui-grid="allRouters"></div>
- </div>
- </div>
-</script>
-
-<script type="text/ng-template" id="router.html">
- <div class="row-fluid">
- <h3>Router {{router.data.title}}</h3>
- <div ng-style="getGridHeight(routerGrid)" ui-grid-auto-resize ui-grid="routerGrid" class="gridStyle noHighlight"></div>
- </div>
-</script>
-
-<script type="text/ng-template" id="addresses.html">
- <div class="row-fluid">
- <h3>Addresses</h3>
- <div class="overview">
- <div class="gridStyle" ng-style="getGridHeight(addressGrid)" ui-grid-auto-resize ui-grid-selection ui-grid="addressGrid"></div>
- </div>
- </div>
-</script>
-<script type="text/ng-template" id="address.html">
- <div class="row-fluid">
- <h3>Address {{address.data.title}}</h3>
- <div ng-style="getGridHeight(addressGrid)" ui-grid-auto-resize class="gridStyle noHighlight" ui-grid="addressGrid"></div>
- </div>
-</script>
-<script type="text/ng-template" id="connections.html">
- <div class="row-fluid">
- <h3>Connections</h3>
- <div class="overview">
- <div class="gridStyle" ng-style="getGridHeight(allConnectionGrid)" ui-grid-auto-resize ui-grid-selection ui-grid="allConnectionGrid"></div>
- </div>
- </div>
-</script>
-<script type="text/ng-template" id="connection.html">
- <div class="row-fluid">
- <h3>Connection {{connection.data.title}}</h3>
- <div ng-style="getGridHeight(connectionGrid)" ui-grid-auto-resize class="gridStyle noHighlight" ui-grid="connectionGrid"></div>
- </div>
-</script>
-<script type="text/ng-template" id="logs.html">
- <div class="row-fluid">
- <h3>Logs</h3>
- </div>
-</script>
-<script type="text/ng-template" id="log.html">
- <div class="row-fluid">
- <h3>Log {{log.data.title}}</h3>
- </div>
-</script>
http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/4940e63d/console/plugin/html/qdrSchema.html
----------------------------------------------------------------------
diff --git a/console/plugin/html/qdrSchema.html b/console/plugin/html/qdrSchema.html
deleted file mode 100644
index 15ebb46..0000000
--- a/console/plugin/html/qdrSchema.html
+++ /dev/null
@@ -1,21 +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="main-display row-fluid" ng-controller="QDR.SchemaController">
- <json-formatter json="schema" open="2"></json-formatter>
-</div>
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/4940e63d/console/plugin/html/qdrTopology.html
----------------------------------------------------------------------
diff --git a/console/plugin/html/qdrTopology.html b/console/plugin/html/qdrTopology.html
deleted file mode 100644
index 078cc97..0000000
--- a/console/plugin/html/qdrTopology.html
+++ /dev/null
@@ -1,222 +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="qdrTopology row-fluid" ng-controller="QDR.TopologyController">
- <div class="tertiary left panel">
- <div id="topologyForm" ng-class="{selected : isSelected()}">
- <!-- <div ng-repeat="form in forms" ng-show="isVisible(form)" ng-class='{selected : isSelected(form)}'> -->
-
- <div ng-show="isGeneral()">
- <h4>Router Info</h4>
- <div ng-style="getTableHeight(attributes)" ui-grid-auto-resize ui-grid="topoGridOptions"></div>
- </div>
- <div ng-show="isConnections()">
- <h4>Connection Info</h4>
- <div ng-style="getTableHeight(connAttributes)" ui-grid-auto-resize ui-grid="topoConnOptions"></div>
- </div>
- <div id="addNodeForm" ng-show="isAddNode()">
- <h4>Add a new router</h4>
- <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 class="panel-adjacent canvas">
-
-<!--
- <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>
-</div>
-<!--
- This is the template for the node edit dialog that is displayed.
--->
-<script type="text/ng-template" id="node-config-template.html">
- <div class="modal-header">
- <h3 class="modal-title">Configure new router</h3>
- </div>
- <div class="modal-body">
- <form novalidate name="editForm">
- <div class="tabbable tabs-left">
- <ul class="nav nav-tabs">
- <li ng-repeat="entity in entities" ng-click="setActive(entity.tabName)" ng-class="{separated: entity.tabName == 'listener0'}">
- <a href="#{{entity.tabName}}" data-toggle="tab"><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}}</a>
- </li>
- </ul>
- <div class="tab-content">
- <div id="{{entity.tabName}}" ng-repeat="entity in entities" ng-show="isActive(entity.tabName)" class="entity-fields">
- <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>
- <div ng-if="attribute.input == 'input'">
- <!-- ng-pattern="testPattern(attribute)" -->
- <input type="{{attribute.type}}" 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>
- </div>
- </div>
- </div>
- </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>
-
-<!--
-
-
- <div class="nodeOptions" title="Configure new router">
- <form novalidate name="editForm">
- <div id="tabs" class="nodeEntities">
- <ul class="nodeTabs">
- <li ng-repeat="entity in entities" ng-class="{separated: entity.tabName == 'listener0'}">
-
- <a href="#{{entity.tabName}}"><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}}</a>
- </li>
- </ul>
- <div id="{{entity.tabName}}" ng-repeat="entity in entities" class="entity-fields">
- <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>
- <div ng-if="attribute.input == 'input'">
- <input type="{{attribute.type}}" name="{{attribute.name}}" id="{{attribute.name}}" ng-model="attribute.value" ng-pattern="testPattern(attribute)" 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>
- </div>
- </div>
- </form>
-
- <div class="okButton">
- <button ng-click="download()">Download</button>
- <button ng-click="cancel()">Cancel</button>
- </div>
- </div>
- -->
-</script>
-
-<script type="text/ng-template" id="config-file-header.html">##
-## 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
-##
-</script>
-
-<script type="text/ng-template" id="download-dialog-template.html">
- <div title="Configure new router">
-
- <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 class="okButton">
- <button ng-click="done()">Done</button>
- </div>
-
- </div>
-</script>
-
http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/4940e63d/console/plugin/img/ZeroClipboard.swf
----------------------------------------------------------------------
diff --git a/console/plugin/img/ZeroClipboard.swf b/console/plugin/img/ZeroClipboard.swf
deleted file mode 100644
index a3aaa20..0000000
Binary files a/console/plugin/img/ZeroClipboard.swf and /dev/null differ
http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/4940e63d/console/plugin/img/ajax-loader.gif
----------------------------------------------------------------------
diff --git a/console/plugin/img/ajax-loader.gif b/console/plugin/img/ajax-loader.gif
deleted file mode 100644
index 3c2f7c0..0000000
Binary files a/console/plugin/img/ajax-loader.gif and /dev/null differ
http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/4940e63d/console/plugin/img/dynatree/icons.gif
----------------------------------------------------------------------
diff --git a/console/plugin/img/dynatree/icons.gif b/console/plugin/img/dynatree/icons.gif
deleted file mode 100644
index 6e237a0..0000000
Binary files a/console/plugin/img/dynatree/icons.gif and /dev/null differ
http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/4940e63d/console/plugin/img/dynatree/loading.gif
----------------------------------------------------------------------
diff --git a/console/plugin/img/dynatree/loading.gif b/console/plugin/img/dynatree/loading.gif
deleted file mode 100644
index 2a96840..0000000
Binary files a/console/plugin/img/dynatree/loading.gif and /dev/null differ
http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/4940e63d/console/plugin/js/navbar.js
----------------------------------------------------------------------
diff --git a/console/plugin/js/navbar.js b/console/plugin/js/navbar.js
deleted file mode 100644
index ebda4d4..0000000
--- a/console/plugin/js/navbar.js
+++ /dev/null
@@ -1,119 +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) {
-
- /**
- * @property breadcrumbs
- * @type {{content: string, title: string, isValid: isValid, href: string}[]}
- *
- * Data structure that defines the sub-level tabs for
- * our plugin, used by the navbar controller to show
- * or hide tabs based on some criteria
- */
- QDR.breadcrumbs = [
- {
- content: '<i class="icon-cogs"></i> Connect',
- title: "Connect to a router",
- isValid: function () { return true; },
- href: "#connect"
- },
- {
- content: '<i class="fa fa-home"></i> Overview',
- title: "View router overview",
- isValid: function (QDRService) { return QDRService.isConnected(); },
- href: "#/overview"
- },
- {
- content: '<i class="icon-star-empty"></i> Topology',
- title: "View router network topology",
- isValid: function (QDRService) { return QDRService.isConnected(); },
- href: "#/topology"
- },
- {
- content: '<i class="icon-list "></i> List',
- title: "View router nodes as a list",
- isValid: function (QDRService) { return QDRService.isConnected(); },
- href: "#/list"
- },
- {
- content: '<i class="icon-bar-chart"></i> Charts',
- title: "View charts",
- isValid: function (QDRService, $location) { return QDRService.isConnected(); },
- href: "#/charts"
- },
- {
- content: '<i class="icon-align-left"></i> Schema',
- title: "View dispatch schema",
- isValid: function (QDRService) { return QDRService.isConnected(); },
- href: "#/schema",
- right: true
-
- }
- ];
- /**
- * @function NavBarController
- *
- * @param $scope
- * @param workspace
- *
- * The controller for this plugin's navigation bar
- *
- */
- QDR.module.controller("QDR.NavBarController", ['$scope', '$sce', 'QDRService', 'QDRChartService', '$location', function($scope, $sce, QDRService, QDRChartService, $location) {
-
- QDR.log.debug("navbar started with location.url: " + $location.url());
- QDR.log.debug("navbar started with window.location.pathname : " + window.location.pathname);
-
- if ($location.path().startsWith("/topology")
- && !QDRService.isConnected()) {
- $location.path("/connect");
- }
-
- if ($location.path().startsWith("/connect")
- && QDRService.isConnected()) {
- $location.path("/topology");
- }
-
- $scope.breadcrumbs = QDR.breadcrumbs;
-
- $scope.isValid = function(link) {
- return link.isValid(QDRService, $location);
- };
-
- $scope.isActive = function(href) {
- return href.split("#")[1] == $location.path();
- };
-
- $scope.isRight = function (link) {
- return angular.isDefined(link.right);
- };
-
- $scope.hasChart = function (link) {
- if (link.href == "#/charts") {
- return QDRChartService.charts.some(function (c) { return c.dashboard });
- }
- }
- }]);
-
- return QDR;
-
-} (QDR || {}));
http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/4940e63d/console/plugin/js/qdrChartService.js
----------------------------------------------------------------------
diff --git a/console/plugin/js/qdrChartService.js b/console/plugin/js/qdrChartService.js
deleted file mode 100644
index 6535384..0000000
--- a/console/plugin/js/qdrChartService.js
+++ /dev/null
@@ -1,956 +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) {
-
- // The QDR chart service handles periodic gathering data for charts and displaying the charts
- QDR.module.factory("QDRChartService", ['$rootScope', 'QDRService', '$http', '$resource',
- function($rootScope, QDRService, $http, $resource) {
-
- 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(name, attr, request) {
-
- var base = findBase(name, attr, request);
- if (!base) {
- base = new ChartBase(name, attr, request);
- bases.push(base);
- }
- this.base = base;
- this.instance = instance++;
- this.dashboard = false; // is this chart on the dashboard page
- this.type = "value"; // value or rate
- this.rateWindow = 1000; // calculate the rate of change over this time interval. higher == smother graph
- this.areaColor = "#c0e0ff"; // the chart's area color when not an empty string
- this.lineColor = "#4682b4"; // the chart's line color when not an empty string
- this.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 key = this.request().nodeId + this.request().entity + this.name() + this.attr() + "_" + this.instance;
- // 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;
- 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.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());
- 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(this.nodeId(), this.entity(),
- this.name(), this.attr(), this.interval(), true, this.base.request.aggregate);
- 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(nodeId, entity, name, attr, interval, aggregate) {
- this.duration = 10; // number of minutes to keep the data
- this.nodeId = nodeId; // eg amqp:/_topo/0/QDR.A/$management
- this.entity = entity; // eg .router.address
- // sorted since the responses will always be sorted
- this.aggregate = 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 = interval; // 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(name, 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);
- }
- };
- 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();
- },
-
- 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 (name, attr, nodeId, entity) {
- return self.charts.filter( function (chart) {
- return (chart.name() == name &&
- chart.attr() == attr &&
- chart.nodeId() == nodeId &&
- chart.entity() == entity)
- });
- },
-
- 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) {
- 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)
- self.saveCharts();
- }
- }
- if (foundBases == 1) {
- var baseIndex = bases.indexOf(chart.base)
- bases.splice(baseIndex, 1);
- }
- },
-
- registerChart: function (nodeId, entity, name, attr, interval, forceCreate, aggregate) {
- var request = self.findChartRequest(nodeId, entity, aggregate);
- if (request) {
- // add any new attr or name to the list
- request.addAttrName(name, attr)
- } else {
- // the nodeId/entity did not already exist, so add a new request and chart
- QDR.log.debug("added new request: " + nodeId + " " + entity);
- request = new ChartRequest(nodeId, entity, name, attr, interval, aggregate);
- self.chartRequests.push(request);
- self.startCollecting(request);
- }
- var charts = self.findCharts(name, attr, nodeId, entity);
- var chart;
- if (charts.length == 0 || forceCreate) {
- chart = new Chart(name, attr, 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) {
- // remove the chart
- 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);
- 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);
- }
- }
- }
- }
- },
-
- 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);
- },
- // send the request
- sendChartRequest: function (request) {
- // 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) {
- //QDR.log.debug("got chart results for " + nodeId + " " + entity);
- // records 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 send another request
- request.setTimeoutHandle = setTimeout(self.sendChartRequest, request.interval, request)
- },
-
- numCharts: function () {
- return self.charts.length;
- },
-
- isAttrCharted: function (nodeId, entity, name, attr) {
- var charts = self.findCharts(name, attr, nodeId, entity);
- // if any of the matching charts are on the dashboard page, return true
- return charts.some(function (chart) {
- return (chart.dashboard) });
- },
-
- 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.copyProps(minChart);
- minCharts.push(minChart);
- }
- })
- localStorage["QDRCharts"] = angular.toJson(minCharts);
- },
- loadCharts: function () {
- var charts = angular.fromJson(localStorage["QDRCharts"]);
- if (charts) {
- charts.forEach(function (chart) {
- if (!chart.interval)
- chart.interval = 1000;
- if (!chart.duration)
- chart.duration = 10;
- if (chart.nodeList)
- chart.aggregate = true;
- var newChart = self.registerChart(chart.nodeId, chart.entity, chart.name, chart.attr, chart.interval, true, chart.aggregate);
- newChart.dashboard = true; // we only save the dashboard charts
- newChart.type = chart.type;
- newChart.rateWindow = chart.rateWindow;
- newChart.areaColor = chart.areaColor ? chart.areaColor : "#c0e0ff";
- newChart.lineColor = chart.lineColor ? chart.lineColor : "#4682b4";
- newChart.duration(chart.duration);
- newChart.visibleDuration = chart.visibleDuration ? chart.visibleDuration : 10;
- if (chart.userTitle)
- newChart.title(chart.userTitle);
- })
- }
- },
-
- AreaChart: function (chart, url) {
- 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;
- if (url)
- url = "/dispatch" + url;
- else
- url = "";
- this.url = url;
-
- // 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;
- 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)
- .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) {
- 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
- }
- 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 + ")");
-
- 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");
-
-
- 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];});
- 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]});
- var max = d3.max(data, function(d) {return d[1]});
- 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()
-
- //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; })
-
- series.enter().append("g")
- .append("path")
- .attr("class", "area")
- series.enter().append("path")
- .attr("class", "line")
-
- series.exit().remove()
-
- // Update the area path.
- container.select(".area").data([data])
- .attr("d", area.y0(y.range()[0]))
- .style("fill", attrs.areaColor);
-
- //Update the line path.
- container.select(".line").data([data])
- .attr("d", line)
- .style("stroke", attrs.lineColor)
- }
- // 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 || {}));
---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@qpid.apache.org
For additional commands, e-mail: commits-help@qpid.apache.org
[04/19] qpid-dispatch git commit: moved standalone to a subdir
Posted by ea...@apache.org.
http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/4940e63d/console/stand-alone/plugin/lib/rhea.js
----------------------------------------------------------------------
diff --git a/console/stand-alone/plugin/lib/rhea.js b/console/stand-alone/plugin/lib/rhea.js
new file mode 100644
index 0000000..fa323a3
--- /dev/null
+++ b/console/stand-alone/plugin/lib/rhea.js
@@ -0,0 +1,7716 @@
+require=(function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})({1:[function(require,module,exports){
+(function (process,Buffer){
+/*
+ * Copyright 2015 Red Hat Inc.
+ *
+ * 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.
+ */
+'use strict';
+
+var frames = require('./frames.js');
+var log = require('./log.js');
+var sasl = require('./sasl.js');
+var types = require('./types.js');
+var util = require('./util.js');
+var EndpointState = require('./endpoint.js');
+var Session = require('./session.js');
+var Transport = require('./transport.js');
+
+var net = require("net");
+var tls = require("tls");
+var EventEmitter = require('events').EventEmitter;
+
+var AMQP_PROTOCOL_ID = 0x00;
+var TLS_PROTOCOL_ID = 0x02;
+
+function get_socket_id(socket) {
+ if (socket.get_id_string) return socket.get_id_string();
+ return socket.localAddress + ':' + socket.localPort + ' -> ' + socket.remoteAddress + ':' + socket.remotePort;
+};
+
+function session_per_connection(conn) {
+ var ssn = null;
+ return {
+ 'get_session' : function () {
+ if (!ssn) {
+ ssn = conn.create_session();
+ ssn.begin();
+ }
+ return ssn;
+ }
+ };
+};
+
+function restrict(count, f) {
+ if (count) {
+ var current = count;
+ var reset;
+ return function (successful_attempts) {
+ if (reset !== successful_attempts) {
+ current = count;
+ reset = successful_attempts;
+ }
+ if (current--) return f(successful_attempts);
+ else return -1;
+ };
+ } else {
+ return f;
+ }
+}
+
+function backoff(initial, max) {
+ var delay = initial;
+ var reset;
+ return function (successful_attempts) {
+ if (reset !== successful_attempts) {
+ delay = initial;
+ reset = successful_attempts;
+ }
+ var current = delay;
+ var next = delay*2;
+ delay = max > next ? next : max;
+ return current;
+ };
+}
+
+function get_connect_fn(options) {
+ if (options.transport === undefined || options.transport === 'tcp') {
+ return net.connect;
+ } else if (options.transport === 'tls' || options.transport === 'ssl') {
+ return tls.connect;
+ } else {
+ throw Error('Unrecognised transport: ' + options.transport);
+ }
+}
+
+function connection_details(options) {
+ var details = {};
+ details.connect = options.connect ? options.connect : get_connect_fn(options);
+ details.host = options.host ? options.host : 'localhost';
+ details.port = options.port ? options.port : 5672;
+ details.options = options;
+ return details;
+};
+
+var conn_counter = 1;
+
+var Connection = function (options, container) {
+ this.options = {};
+ if (options) {
+ for (var k in options) {
+ this.options[k] = options[k];
+ }
+ }
+ this.container = container;
+ if (!this.options.id) {
+ this.options.id = 'connection-' + conn_counter++;
+ }
+ if (!this.options.container_id) {
+ this.options.container_id = container ? container.id : util.generate_uuid();
+ }
+ if (!this.options.connection_details) {
+ var self = this;
+ this.options.connection_details = function() { return connection_details(self.options); };
+ }
+ var reconnect = this.get_option('reconnect', true);
+ if (typeof reconnect === 'boolean' && reconnect) {
+ var initial = this.get_option('initial_reconnect_delay', 100);
+ var max = this.get_option('max_reconnect_delay', 60000);
+ this.options.reconnect = restrict(this.get_option('reconnect_limit'), backoff(initial, max));
+ } else if (typeof reconnect === 'number') {
+ var fixed = this.options.reconnect
+ this.options.reconnect = restrict(this.get_option('reconnect_limit'), function () { return fixed; });
+ }
+ this.registered = false;
+ this.state = new EndpointState();
+ this.local_channel_map = {};
+ this.remote_channel_map = {};
+ this.local = {};
+ this.remote = {};
+ this.local.open = frames.open(this.options);
+ this.local.close = frames.close({});
+ this.session_policy = session_per_connection(this);
+ this.amqp_transport = new Transport(this.options.id, AMQP_PROTOCOL_ID, frames.TYPE_AMQP, this);
+ this.sasl_transport = undefined;
+ this.transport = this.amqp_transport;
+ this.conn_established_counter = 0;
+ this.heartbeat_out = undefined;
+ this.heartbeat_in = undefined;
+ this.abort_idle = false;
+ this.socket_ready = false;
+};
+
+Connection.prototype = Object.create(EventEmitter.prototype);
+Connection.prototype.constructor = Connection;
+Connection.prototype.dispatch = function(name, context) {
+ log.events('Connection got event: ' + name);
+ if (this.listeners(name).length) {
+ EventEmitter.prototype.emit.apply(this, arguments);
+ return true;
+ } else if (this.container) {
+ return this.container.dispatch.apply(this.container, arguments);
+ }
+};
+
+Connection.prototype.reset = function() {
+ if (this.abort_idle) {
+ this.abort_idle = false;
+ this.local.close.error = undefined;
+ this.state = new EndpointState();
+ this.state.open();
+ }
+
+ //reset transport
+ this.amqp_transport = new Transport(this.options.id, AMQP_PROTOCOL_ID, frames.TYPE_AMQP, this);
+ this.sasl_transport = undefined;
+ this.transport = this.amqp_transport;
+
+ //reset remote endpoint state
+ this.state.disconnected();
+ this.remote = {};
+ //reset sessions:
+ this.remote_channel_map = {};
+ for (var k in this.local_channel_map) {
+ this.local_channel_map[k].reset();
+ }
+ this.socket_ready = false;
+}
+
+Connection.prototype.connect = function () {
+ this.is_server = false;
+ this._connect(this.options.connection_details(this.conn_established_counter));
+ this.open();
+ return this;
+};
+Connection.prototype.reconnect = function () {
+ log.reconnect('reconnecting...');
+ this.reset();
+ this._connect(this.options.connection_details(this.conn_established_counter));
+ process.nextTick(this._process.bind(this));
+ return this;
+};
+
+Connection.prototype._connect = function (details) {
+ if (details.connect) {
+ this.init(details.connect(details.port, details.host, details.options, this.connected.bind(this)));
+ } else {
+ this.init(get_connect_fn(details)(details.port, details.host, details.options, this.connected.bind(this)));
+ }
+ return this;
+};
+
+Connection.prototype.accept = function (socket) {
+ this.is_server = true;
+ log.io('[' + this.id + '] client accepted: '+ get_socket_id(socket));
+ this.socket_ready = true;
+ return this.init(socket);
+};
+
+Connection.prototype.init = function (socket) {
+ this.socket = socket;
+ this.socket.on('data', this.input.bind(this));
+ this.socket.on('error', this.error.bind(this));
+ this.socket.on('end', this.eof.bind(this));
+
+ if (this.is_server) {
+ var mechs;
+ if (this.container && Object.getOwnPropertyNames(this.container.sasl_server_mechanisms).length) {
+ mechs = this.container.sasl_server_mechanisms;
+ }
+ if (this.socket.encrypted && this.socket.authorized && this.get_option('enable_sasl_external', false)) {
+ mechs = sasl.server_add_external(mechs ? util.clone(mechs) : {});
+ }
+ if (mechs) {
+ this.sasl_transport = new sasl.Server(this, mechs);
+ }
+ } else {
+ var mechanisms = this.get_option('sasl_mechanisms');
+ if (!mechanisms) {
+ var username = this.get_option('username');
+ var password = this.get_option('password');
+ if (username) {
+ mechanisms = sasl.client_mechanisms();
+ if (password) mechanisms.enable_plain(username, password);
+ else mechanisms.enable_anonymous(username);
+ }
+ }
+ if (this.socket.encrypted && this.options.cert && this.get_option('enable_sasl_external', false)) {
+ if (!mechanisms) mechanisms = sasl.client_mechanisms();
+ mechanisms.enable_external();
+ }
+
+ if (mechanisms) {
+ this.sasl_transport = new sasl.Client(this, mechanisms);
+ }
+ }
+ this.transport = this.sasl_transport ? this.sasl_transport : this.amqp_transport;
+ return this;
+};
+
+Connection.prototype.attach_sender = function (options) {
+ return this.session_policy.get_session().attach_sender(options);
+};
+Connection.prototype.open_sender = Connection.prototype.attach_sender;//alias
+
+Connection.prototype.attach_receiver = function (options) {
+ return this.session_policy.get_session().attach_receiver(options);
+};
+Connection.prototype.open_receiver = Connection.prototype.attach_receiver;//alias
+
+Connection.prototype.get_option = function (name, default_value) {
+ if (this.options[name] !== undefined) return this.options[name];
+ else if (this.container) return this.container.get_option(name, default_value);
+ else return default_value;
+};
+
+Connection.prototype.connected = function () {
+ this.socket_ready = true;
+ this.conn_established_counter++;
+ log.io('[' + this.options.id + '] connected ' + get_socket_id(this.socket));
+ this.output();
+};
+Connection.prototype.sasl_failed = function (text) {
+ this.transport_error = {condition:'amqp:unauthorized-access', description:text};
+ this._handle_error();
+}
+
+Connection.prototype._handle_error = function () {
+ var error = this.get_error();
+ if (error) {
+ //TODO: invoke connection_close regardless of whether connection_error is handled
+ //TODO: example for error handling
+ if (!this.dispatch('connection_error', this._context())) {
+ if (!this.dispatch('connection_close', this._context())) {
+ console.log('error: ' + JSON.stringify(error));
+ }
+ }
+ return true;
+ } else {
+ return false;
+ }
+}
+
+Connection.prototype.get_error = function () {
+ if (this.transport_error) return this.transport_error;
+ if (this.remote.close && this.remote.close.error) return this.remote.close.error;
+ return undefined;
+}
+
+Connection.prototype.output = function () {
+ if (this.socket && this.socket_ready) {
+ if (this.heartbeat_out) clearTimeout(this.heartbeat_out);
+ this.transport.write(this.socket);
+ if (((this.is_closed() && this.state.has_settled()) || this.abort_idle || this.transport_error) && !this.transport.has_writes_pending()) {
+ this.socket.end();
+ } else if (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);
+ }
+ }
+};
+
+Connection.prototype.input = function (buff) {
+ if (this.heartbeat_in) clearTimeout(this.heartbeat_in);
+ log.io('[' + this.options.id + '] read ' + buff.length + ' bytes');
+ var buffer;
+ if (this.previous_input) {
+ buffer = Buffer.concat([this.previous_input, buff], this.previous_input.length + buff.length);
+ this.previous_input = null;
+ } else {
+ buffer = buff;
+ }
+ var read = this.transport.read(buffer, this);
+ if (read < buffer.length) {
+ this.previous_input = buffer.slice(read);
+ }
+ if (this.local.open.idle_time_out) this.heartbeat_in = setTimeout(this.idle.bind(this), this.local.open.idle_time_out);
+ if (this.transport.has_writes_pending()) this.output();
+};
+
+Connection.prototype.idle = function () {
+ if (this.is_open()) {
+ this.abort_idle = true;
+ this.local.close.error = {condition:'amqp:resource-limit-exceeded', description:'max idle time exceeded'};
+ this.close();
+ }
+};
+
+Connection.prototype.error = function (e) {
+ console.log('[' + this.options.id + '] error: ' + e);
+ this._disconnected();
+};
+
+Connection.prototype.eof = function (e) {
+ this._disconnected();
+};
+
+Connection.prototype._disconnected = function () {
+ if (!this.is_closed()) {
+ if (!this.dispatch('disconnected', this._context())) {
+ console.log('[' + this.options.id + '] disconnected');
+ }
+ if (!this.is_server && !this.transport_error && this.options.reconnect) {
+ var delay = this.options.reconnect(this.conn_established_counter);
+ if (delay >= 0) {
+ log.reconnect('Scheduled reconnect in ' + delay + 'ms');
+ setTimeout(this.reconnect.bind(this), delay);
+ }
+ }
+ }
+};
+
+Connection.prototype.open = function () {
+ if (this.state.open()) {
+ this._register();
+ }
+};
+Connection.prototype.close = function () {
+ if (this.state.close()) {
+ this._register();
+ }
+};
+
+Connection.prototype.is_open = function () {
+ return this.state.is_open();
+};
+
+Connection.prototype.is_closed = function () {
+ return this.state.is_closed();
+};
+
+Connection.prototype.create_session = function () {
+ var i = 0;
+ while (this.local_channel_map[i]) i++;
+ var session = new Session(this, i);
+ this.local_channel_map[i] = session;
+ return session;
+}
+
+Connection.prototype.on_open = function (frame) {
+ if (this.state.remote_opened()) {
+ this.remote.open = frame.performative;
+ this.open();
+ this.dispatch('connection_open', this._context());
+ } else {
+ throw Error('Open already received');
+ }
+};
+
+Connection.prototype.on_close = function (frame) {
+ if (this.state.remote_closed()) {
+ this.remote.close = frame.performative;
+ this.close();
+ if (this.remote.close.error) {
+ this._handle_error();
+ } else {
+ this.dispatch('connection_close', this._context());
+ }
+ if (this.heartbeat_out) clearTimeout(this.heartbeat_out);
+ } else {
+ throw Error('Close already received');
+ }
+};
+
+Connection.prototype._register = function () {
+ if (!this.registered) {
+ this.registered = true;
+ process.nextTick(this._process.bind(this));
+ }
+};
+
+Connection.prototype._process = function () {
+ this.registered = false;
+ do {
+ if (this.state.need_open()) {
+ this._write_open();
+ }
+ for (var k in this.local_channel_map) {
+ this.local_channel_map[k]._process();
+ }
+ if (this.state.need_close()) {
+ this._write_close();
+ }
+ } while (!this.state.has_settled());
+};
+
+Connection.prototype._write_frame = function (channel, frame, payload) {
+ this.amqp_transport.encode(frames.amqp_frame(channel, frame, payload));
+ this.output();
+};
+
+Connection.prototype._write_open = function () {
+ this._write_frame(0, this.local.open.described());
+};
+
+Connection.prototype._write_close = function () {
+ this._write_frame(0, this.local.close.described());
+};
+
+Connection.prototype.on_begin = function (frame) {
+ var session;
+ if (frame.performative.remote_channel === null || frame.performative.remote_channel === undefined) {
+ //peer initiated
+ session = this.create_session();
+ session.local.begin.remote_channel = frame.channel;
+ } else {
+ session = this.local_channel_map[frame.performative.remote_channel];
+ if (!session) throw Error('Invalid value for remote channel ' + frame.performative.remote_channel);
+ }
+ session.on_begin(frame);
+ this.remote_channel_map[frame.channel] = session;
+};
+
+Connection.prototype.get_peer_certificate = function() {
+ if (this.socket && this.socket.getPeerCertificate) {
+ return this.socket.getPeerCertificate();
+ } else {
+ return undefined;
+ }
+};
+
+Connection.prototype._context = function (c) {
+ var context = c ? c : {};
+ context.connection = this;
+ if (this.container) context.container = this.container;
+ return context;
+};
+
+function delegate_to_session(name) {
+ Connection.prototype['on_' + name] = function (frame) {
+ var session = this.remote_channel_map[frame.channel];
+ if (!session) {
+ throw Error(name + ' received on invalid channel ' + frame.channel);
+ }
+ session['on_' + name](frame);
+ };
+};
+
+delegate_to_session('end');
+delegate_to_session('attach');
+delegate_to_session('detach');
+delegate_to_session('transfer');
+delegate_to_session('disposition');
+delegate_to_session('flow');
+
+module.exports = Connection
+
+}).call(this,require('_process'),require("buffer").Buffer)
+},{"./endpoint.js":2,"./frames.js":3,"./log.js":5,"./sasl.js":8,"./session.js":9,"./transport.js":11,"./types.js":12,"./util.js":13,"_process":24,"buffer":19,"events":23,"net":18,"tls":18}],2:[function(require,module,exports){
+/*
+ * Copyright 2015 Red Hat Inc.
+ *
+ * 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.
+ */
+'use strict';
+
+var EndpointState = function () {
+ this.init();
+};
+
+EndpointState.prototype.init = function () {
+ this.local_open = false;
+ this.remote_open = false;
+ this.open_requests = 0;
+ this.close_requests = 0;
+ this.initialised = false;
+};
+
+EndpointState.prototype.open = function () {
+ this.initialised = true;
+ if (!this.local_open) {
+ this.local_open = true;
+ this.open_requests++;
+ return true;
+ } else {
+ return false;
+ }
+};
+
+EndpointState.prototype.close = function () {
+ if (this.local_open) {
+ this.local_open = false;
+ this.close_requests++;
+ return true;
+ } else {
+ return false;
+ }
+};
+
+EndpointState.prototype.disconnected = function () {
+ var was_open = this.local_open;
+ this.init();
+ if (was_open) {
+ this.open();
+ } else {
+ this.close();
+ }
+};
+
+EndpointState.prototype.remote_opened = function (frame) {
+ if (!this.remote_open) {
+ this.remote_open = true;
+ return true;
+ } else {
+ return false;
+ }
+};
+
+EndpointState.prototype.remote_closed = function (frame) {
+ if (this.remote_open) {
+ this.remote_open = false;
+ return true;
+ } else {
+ return false;
+ }
+};
+
+EndpointState.prototype.is_open = function () {
+ return this.local_open && this.remote_open;
+};
+
+EndpointState.prototype.is_closed = function () {
+ return this.initialised && !this.local_open && !this.remote_open;
+};
+
+EndpointState.prototype.has_settled = function () {
+ return this.open_requests == 0 && this.close_requests == 0;
+};
+
+EndpointState.prototype.need_open = function () {
+ if (this.open_requests > 0) {
+ this.open_requests--;
+ return true;
+ } else {
+ return false;
+ }
+};
+
+EndpointState.prototype.need_close = function () {
+ if (this.close_requests > 0) {
+ this.close_requests--;
+ return true;
+ } else {
+ return false;
+ }
+};
+
+module.exports = EndpointState
+
+},{}],3:[function(require,module,exports){
+/*
+ * Copyright 2015 Red Hat Inc.
+ *
+ * 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.
+ */
+'use strict';
+
+var types = require('./types.js');
+
+var frames = {};
+var by_descriptor = {};
+
+frames.read_header = function(buffer) {
+ var offset = 4;
+ var header = {};
+ var name = buffer.toString('ascii', 0, offset);
+ if (name !== 'AMQP') {
+ throw Error('Invalid protocol header for AMQP ' + name);
+ }
+ header.protocol_id = buffer.readUInt8(offset++);
+ header.major = buffer.readUInt8(offset++);
+ header.minor = buffer.readUInt8(offset++);
+ header.revision = buffer.readUInt8(offset++);
+ if (header.major !== 1 || header.minor !== 0) {
+ throw Error('Unsupported AMQP version: ' + JSON.stringify(header));
+ }
+ return header;
+};
+frames.write_header = function(buffer, header) {
+ var offset = 4;
+ buffer.write('AMQP', 0, offset, 'ascii');
+ buffer.writeUInt8(header.protocol_id, offset++);
+ buffer.writeUInt8(header.major, offset++);
+ buffer.writeUInt8(header.minor, offset++);
+ buffer.writeUInt8(header.revision, offset++);
+ return 8;
+};
+//todo: define enumeration for frame types
+frames.TYPE_AMQP = 0x00;
+frames.TYPE_SASL = 0x01;
+
+frames.read_frame = function(buffer) {
+ var reader = new types.Reader(buffer);
+ var frame = {};
+ frame.size = reader.read_uint(4);
+ if (reader.remaining < frame.size) {
+ return null;
+ }
+ var doff = reader.read_uint(1);
+ if (doff < 2) {
+ throw Error('Invalid data offset, must be at least 2 was ' + doff);
+ }
+ frame.type = reader.read_uint(1);
+ if (frame.type === frames.TYPE_AMQP) {
+ frame.channel = reader.read_uint(2);
+ } else if (frame.type === frames.TYPE_SASL) {
+ reader.skip(2);
+ } else {
+ throw Error('Unknown frame type ' + frame.type);
+ }
+ if (doff > 1) {
+ //ignore any extended header
+ reader.skip(doff * 4 - 8);
+ }
+ if (reader.remaining()) {
+ frame.performative = reader.read();
+ var c = by_descriptor[frame.performative.descriptor.value];
+ if (c) {
+ frame.performative = new c(frame.performative.value);
+ }
+ if (reader.remaining()) {
+ frame.payload = reader.read_bytes(reader.remaining());
+ }
+ }
+ return frame;
+};
+
+frames.write_frame = function(frame) {
+ var writer = new types.Writer();
+ writer.skip(4);//skip size until we know how much we have written
+ writer.write_uint(2, 1);//doff
+ writer.write_uint(frame.type, 1);
+ if (frame.type === frames.TYPE_AMQP) {
+ writer.write_uint(frame.channel, 2);
+ } else if (frame.type === frames.TYPE_SASL) {
+ writer.write_uint(0, 2);
+ } else {
+ throw Error('Unknown frame type ' + frame.type);
+ }
+ if (frame.performative) {
+ writer.write(frame.performative);
+ if (frame.payload) {
+ writer.write_bytes(frame.payload);
+ }
+ }
+ var buffer = writer.toBuffer();
+ buffer.writeUInt32BE(buffer.length, 0);//fill in the size
+ return buffer;
+};
+
+frames.amqp_frame = function(channel, performative, payload) {
+ return {'channel': channel || 0, 'type': frames.TYPE_AMQP, 'performative': performative, 'payload': payload};
+};
+frames.sasl_frame = function(performative) {
+ return {'channel': 0, 'type': frames.TYPE_SASL, 'performative': performative};
+};
+
+function define_frame(type, def) {
+ var c = types.define_composite(def);
+ frames[def.name] = c.create;
+ by_descriptor[Number(c.descriptor.numeric).toString(10)] = c;
+ by_descriptor[c.descriptor.symbolic] = c;
+};
+
+var open = {name: "open",
+ code: 0x10,
+ fields: [
+ {name:"container_id", type:"string", mandatory:true},
+ {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:true},
+ {name:"incoming_locales", type:"symbol", multiple:true},
+ {name:"offered_capabilities", type:"symbol", multiple:true},
+ {name:"desired_capabilities", type:"symbol", multiple:true},
+ {name:"properties", type:"symbolic_map"}
+ ]
+ };
+
+var begin = {name:"begin",
+ code:0x11,
+ fields:[
+ {name:"remote_channel", type:"ushort"},
+ {name:"next_outgoing_id", type:"uint", mandatory:true},
+ {name:"incoming_window", type:"uint", mandatory:true},
+ {name:"outgoing_window", type:"uint", mandatory:true},
+ {name:"handle_max", type:"uint", default_value:"4294967295"},
+ {name:"offered_capabilities", type:"symbol", multiple:true},
+ {name:"desired_capabilities", type:"symbol", multiple:true},
+ {name:"properties", type:"symbolic_map"}
+ ]
+ };
+
+var attach = {name:"attach",
+ code:0x12,
+ fields:[
+ {name:"name", type:"string", mandatory:true},
+ {name:"handle", type:"uint", mandatory:true},
+ {name:"role", type:"boolean", mandatory:true},
+ {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:false},
+ {name:"initial_delivery_count", type:"uint"},
+ {name:"max_message_size", type:"ulong"},
+ {name:"offered_capabilities", type:"symbol", multiple:true},
+ {name:"desired_capabilities", type:"symbol", multiple:true},
+ {name:"properties", type:"symbolic_map"}
+ ]
+ };
+
+var flow = {name:"flow",
+ code:0x13,
+ fields:[
+ {name:"next_incoming_id", type:"uint"},
+ {name:"incoming_window", type:"uint", mandatory:true},
+ {name:"next_outgoing_id", type:"uint", mandatory:true},
+ {name:"outgoing_window", type:"uint", mandatory:true},
+ {name:"handle", type:"uint"},
+ {name:"delivery_count", type:"uint"},
+ {name:"link_credit", type:"uint"},
+ {name:"available", type:"uint"},
+ {name:"drain", type:"boolean", default_value:false},
+ {name:"echo", type:"boolean", default_value:false},
+ {name:"properties", type:"symbolic_map"}
+ ]
+ };
+
+var transfer = {name:"transfer",
+ code:0x14,
+ fields:[
+ {name:"handle", type:"uint", mandatory:true},
+ {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:false},
+ {name:"rcv_settle_mode", type:"ubyte"},
+ {name:"state", type:"delivery_state"},
+ {name:"resume", type:"boolean", default_value:false},
+ {name:"aborted", type:"boolean", default_value:false},
+ {name:"batchable", type:"boolean", default_value:false}
+ ]
+ };
+
+var disposition = {name:"disposition",
+ code:0x15,
+ fields:[
+ {name:"role", type:"boolean", mandatory:true},
+ {name:"first", type:"uint", mandatory:true},
+ {name:"last", type:"uint"},
+ {name:"settled", type:"boolean", default_value:false},
+ {name:"state", type:"*"},
+ {name:"batchable", type:"boolean", default_value:false}
+ ]
+ };
+
+var detach = {name: "detach",
+ code: 0x16,
+ fields: [
+ {name:"handle", type:"uint", mandatory:true},
+ {name:"closed", type:"boolean", default_value:false},
+ {name:"error", type:"error"}
+ ]
+ };
+
+var end = {name: "end",
+ code: 0x17,
+ fields: [
+ {name:"error", type:"error"}
+ ]
+ };
+
+var close = {name: "close",
+ code: 0x18,
+ fields: [
+ {name:"error", type:"error"}
+ ]
+ };
+
+define_frame(frames.TYPE_AMQP, open);
+define_frame(frames.TYPE_AMQP, begin);
+define_frame(frames.TYPE_AMQP, attach);
+define_frame(frames.TYPE_AMQP, flow);
+define_frame(frames.TYPE_AMQP, transfer);
+define_frame(frames.TYPE_AMQP, disposition);
+define_frame(frames.TYPE_AMQP, detach);
+define_frame(frames.TYPE_AMQP, end);
+define_frame(frames.TYPE_AMQP, close);
+
+var sasl_mechanisms = {name:"sasl_mechanisms", code:0x40,
+ fields: [
+ {name:"sasl_server_mechanisms", type:"symbol", multiple:true, mandatory:true}
+ ]};
+
+var sasl_init = {name:"sasl_init", code:0x41,
+ fields: [
+ {name:"mechanism", type:"symbol", mandatory:true},
+ {name:"initial_response", type:"binary"},
+ {name:"hostname", type:"string"}
+ ]};
+
+var sasl_challenge = {name:"sasl_challenge", code:0x42,
+ fields: [
+ {name:"challenge", type:"binary", mandatory:true}
+ ]};
+
+var sasl_response = {name:"sasl_response", code:0x43,
+ fields: [
+ {name:"response", type:"binary", mandatory:true}
+ ]};
+
+var sasl_outcome = {name:"sasl_outcome", code:0x44,
+ fields: [
+ {name:"code", type:"ubyte", mandatory:true},
+ {name:"additional_data", type:"binary"}
+ ]};
+
+define_frame(frames.TYPE_SASL, sasl_mechanisms);
+define_frame(frames.TYPE_SASL, sasl_init);
+define_frame(frames.TYPE_SASL, sasl_challenge);
+define_frame(frames.TYPE_SASL, sasl_response);
+define_frame(frames.TYPE_SASL, sasl_outcome);
+
+module.exports = frames;
+
+},{"./types.js":12}],4:[function(require,module,exports){
+/*
+ * Copyright 2015 Red Hat Inc.
+ *
+ * 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.
+ */
+'use strict';
+
+var frames = require('./frames.js');
+var log = require('./log.js');
+var message = require('./message.js');
+var terminus = require('./terminus.js')
+var types = require('./types.js')
+var EndpointState = require('./endpoint.js');
+
+var FlowController = function (window) {
+ this.window = window;
+};
+FlowController.prototype.update = function (context) {
+ var delta = this.window - context.receiver.credit;
+ context.receiver.flow(delta);
+};
+
+function auto_settle(context) {
+ context.delivery.settled = true;
+};
+
+function auto_accept(context) {
+ context.delivery.update(true, message.accepted().described());
+};
+
+var EventEmitter = require('events').EventEmitter;
+
+var link = Object.create(EventEmitter.prototype);
+link.dispatch = function(name, context) {
+ log.events('Link got event: '+ name);
+ EventEmitter.prototype.emit.apply(this.observers, arguments);
+ if (this.listeners(name).length) {
+ EventEmitter.prototype.emit.apply(this, arguments);
+ } else {
+ this.session.dispatch.apply(this.session, arguments);
+ }
+};
+link.set_source = function (fields) {
+ this.local.attach.source = terminus.source(fields).described();
+};
+link.set_target = function (fields) {
+ this.local.attach.target = terminus.target(fields).described();
+};
+
+link.attach = function () {
+ if (this.state.open()) {
+ this.connection._register();
+ }
+};
+link.open = link.attach;
+
+link.detach = function () {
+ this.local.detach.closed = false;
+ if (this.state.close()) {
+ this.connection._register();
+ }
+};
+link.close = function() {
+ this.local.detach.closed = true;
+ if (this.state.close()) {
+ this.connection._register();
+ }
+}
+
+link.is_open = function () {
+ return this.session.is_open() && this.state.is_open();
+};
+
+link.is_closed = function () {
+ return this.session.is_closed() || this.state.is_closed();
+};
+
+link._process = function () {
+ do {
+ if (this.state.need_open()) {
+ this.session.output(this.local.attach.described());
+ }
+
+ if (this.issue_flow) {
+ this.session._write_flow(this);
+ this.issue_flow = false;
+ }
+
+ if (this.state.need_close()) {
+ this.session.output(this.local.detach.described());
+ }
+ } while (!this.state.has_settled());
+};
+
+link.on_attach = function (frame) {
+ if (this.state.remote_opened()) {
+ if (!this.remote.handle) {
+ this.remote.handle = frame.handle;
+ }
+ frame.performative.source = terminus.unwrap(frame.performative.source);
+ frame.performative.target = terminus.unwrap(frame.performative.target);
+ this.remote.attach = frame.performative;
+ this.open();
+ this.dispatch(this.is_receiver() ? 'receiver_open' : 'sender_open', this._context());
+ } else {
+ throw Error('Attach already received');
+ }
+};
+
+link.on_detach = function (frame) {
+ if (this.state.remote_closed()) {
+ this.remote.detach = frame.performative;
+ this.close();
+ this.dispatch(this.local.attach.role ? 'receiver_close' : 'sender_close', this._context());
+ } else {
+ throw Error('Detach already received');
+ }
+};
+
+function is_internal(name) {
+ switch (name) {
+ case 'handle':
+ case 'role':
+ case 'initial_delivery_count':
+ return true;
+ default:
+ return false;
+ }
+}
+
+link.init = function (session, name, local_handle, opts, is_receiver) {
+ this.session = session;
+ this.connection = session.connection;
+ this.name = name;
+ this.options = opts === undefined ? {} : opts;
+ this.state = new EndpointState();
+ this.issue_flow = false;//currently only used by receiver
+ this.local = {'handle': local_handle};
+ this.local.attach = frames.attach({'handle':local_handle,'name':name, role:is_receiver});
+ for (var f in this.local.attach) {
+ if (!is_internal(f) && this.options[f] !== undefined) {
+ this.local.attach[f] = this.options[f];
+ }
+ }
+ this.local.detach = frames.detach({'handle':local_handle, 'closed':true});
+ this.remote = {'handle':undefined};
+ this.delivery_count = 0;
+ this.credit = 0;
+ this.observers = new EventEmitter();
+};
+link.reset = function() {
+ this.state.disconnected();
+ this.remote = {'handle':undefined};
+ this.delivery_count = 0;
+ this.credit = 0;
+};
+
+link.has_credit = function () {
+ return this.credit > 0;
+};
+link.is_receiver = function () {
+ return this.local.attach.role;
+};
+link._context = function (c) {
+ var context = c ? c : {};
+ if (this.is_receiver()) {
+ context.receiver = this;
+ } else {
+ context.sender = this;
+ }
+ return this.session._context(context);
+};
+link.get_option = function (name, default_value) {
+ if (this.options[name] !== undefined) return this.options[name];
+ else return this.session.get_option(name, default_value);
+};
+
+var Sender = function (session, name, local_handle, opts) {
+ this.init(session, name, local_handle, opts, false);
+ this.local.attach.initial_delivery_count = 0;
+ this.tag = 0;
+ if (this.get_option('autosettle', true)) {
+ this.observers.on('settled', auto_settle);
+ }
+};
+Sender.prototype = Object.create(link);
+Sender.prototype.constructor = Sender;
+Sender.prototype.next_tag = function () {
+ return new String(this.tag++);
+};
+Sender.prototype.sendable = function (frame) {
+ return this.credit && this.session.outgoing.available();
+}
+Sender.prototype.on_flow = function (frame) {
+ var flow = frame.performative;
+ this.credit = flow.delivery_count + flow.link_credit - this.delivery_count;
+ if (this.is_open()) {
+ this.dispatch('sender_flow', this._context());
+ if (this.sendable()) {
+ this.dispatch('sendable', this._context());
+ }
+ }
+};
+Sender.prototype.on_transfer = function (frame) {
+ throw Error('got transfer on sending link');
+};
+Sender.prototype.send = function (msg, tag) {
+ return this.session.send(this, tag ? tag : this.next_tag(), message.encode(msg), 0);
+};
+
+
+var Receiver = function (session, name, local_handle, opts) {
+ this.init(session, name, local_handle, opts, true);
+ this.set_prefetch(this.get_option('prefetch', 100));
+ if (this.get_option('autoaccept', true)) {
+ this.observers.on('message', auto_accept);
+ }
+};
+Receiver.prototype = Object.create(link);
+Receiver.prototype.constructor = Receiver;
+Receiver.prototype.on_flow = function (frame) {
+ this.dispatch('receiver_flow', this._context());
+};
+Receiver.prototype.flow = function(credit) {
+ if (credit > 0) {
+ this.credit += credit;
+ this.issue_flow = true;
+ this.connection._register();
+ }
+};
+
+Receiver.prototype.set_prefetch = function(prefetch) {
+ if (prefetch > 0) {
+ var flow_controller = new FlowController(prefetch);
+ var listener = flow_controller.update.bind(flow_controller);
+ this.observers.on('message', listener);
+ this.observers.on('receiver_open', listener);
+ }
+}
+
+module.exports = {'Sender': Sender, 'Receiver':Receiver};
+
+},{"./endpoint.js":2,"./frames.js":3,"./log.js":5,"./message.js":6,"./terminus.js":10,"./types.js":12,"events":23}],5:[function(require,module,exports){
+/*
+ * Copyright 2015 Red Hat Inc.
+ *
+ * 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.
+ */
+'use strict';
+
+var debug = require('debug');
+
+module.exports = {
+ 'frames' : debug('rhea:frames'),
+ 'raw' : debug('rhea:raw'),
+ 'reconnect' : debug('rhea:reconnect'),
+ 'events' : debug('rhea:events'),
+ 'message' : debug('rhea:message'),
+ 'flow' : debug('rhea:flow'),
+ 'io' : debug('rhea:io')
+}
+
+},{"debug":15}],6:[function(require,module,exports){
+/*
+ * Copyright 2015 Red Hat Inc.
+ *
+ * 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.
+ */
+'use strict';
+
+var log = require('./log.js');
+var types = require('./types.js');
+
+var by_descriptor = {};
+var unwrappers = {};
+var wrappers = [];
+var message = {};
+
+function define_section(descriptor, unwrap, wrap) {
+ unwrap.descriptor = descriptor;
+ unwrappers[descriptor.symbolic] = unwrap;
+ unwrappers[Number(descriptor.numeric).toString(10)] = unwrap;
+ if (wrap) {
+ wrappers.push(wrap);
+ }
+};
+
+function define_composite_section(def) {
+ var c = types.define_composite(def);
+ message[def.name] = c.create;
+ by_descriptor[Number(c.descriptor.numeric).toString(10)] = c;
+ by_descriptor[c.descriptor.symbolic] = c;
+
+ var unwrap = function (msg, section) {
+ msg[def.name] = new c(section.value);
+ };
+
+ var wrap = function (sections, msg) {
+ if (msg[def.name]) {
+ if (msg[def.name].described) {
+ sections.push(msg[def.name].described());
+ } else {
+ sections.push(c.create(msg[def.name]).described());
+ }
+ }
+ };
+ define_section(c.descriptor, unwrap, wrap);
+};
+
+
+function define_map_section(def) {
+ var descriptor = {numeric:def.code};
+ descriptor.symbolic = 'amqp:' + def.name.replace(/_/g, '-') + ':map';
+ var unwrap = function (msg, section) {
+ msg[def.name] = types.unwrap(section);
+ };
+ var wrap = function (sections, msg) {
+ if (msg[def.name]) {
+ sections.push(types.described(types.wrap_ulong(descriptor.numeric), types.wrap_map(msg[def.name])));
+ }
+ };
+ define_section(descriptor, unwrap, wrap);
+};
+
+define_composite_section({name:"header",
+ code:0x70,
+ fields:[
+ {name:"durable", type:"boolean", default_value:false},
+ {name:"priority", type:"ubyte", default_value:4},
+ {name:"ttl", type:"uint"},
+ {name:"first_acquirer", type:"boolean", default_value:false},
+ {name:"delivery_count", type:"uint", default_value:0}
+ ]
+ });
+define_map_section({name:"delivery_annotations", code:0x71});
+define_map_section({name:"message_annotations", code:0x72});
+define_composite_section({name:"properties",
+ code:0x73,
+ 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"}
+ ]
+ });
+define_map_section({name:"application_properties", code:0x74});
+
+define_section({numeric:0x77, symbolic:'amqp:value:*'},
+ function(msg, section) { msg.body = types.unwrap(section); },
+ function(sections, msg) { sections.push(types.described(types.wrap_ulong(0x77), types.wrap(msg.body))); });
+
+define_map_section({name:"footer", code:0x78});
+
+message.encode = function(obj) {
+ var sections = [];
+
+ wrappers.forEach(function (wrapper_fn) { wrapper_fn(sections, obj); });
+ var writer = new types.Writer();
+ for (var i = 0; i < sections.length; i++) {
+ log.message('Encoding section ' + (i+1) + ' of ' + sections.length + ': ' + sections[i]);
+ writer.write(sections[i]);
+ }
+ var data = writer.toBuffer();
+ log.message('encoded ' + data.length + ' bytes');
+ return data;
+}
+
+message.decode = function(buffer) {
+ var msg = {};
+ var reader = new types.Reader(buffer);
+ while (reader.remaining()) {
+ var s = reader.read();
+ log.message('decoding section: ' + JSON.stringify(s) + ' of type: ' + JSON.stringify(s.descriptor));
+ if (s.descriptor) {
+ var unwrap = unwrappers[s.descriptor.value];
+ if (unwrap) {
+ unwrap(msg, s);
+ } else {
+ console.log("WARNING: did not recognise message section with descriptor " + s.descriptor);
+ }
+ } else {
+ console.log("WARNING: expected described message section got " + JSON.stringify(s));
+ }
+ }
+ return msg;
+}
+
+var outcomes = {};
+
+function define_outcome(def) {
+ var c = types.define_composite(def);
+ c.composite_type = def.name;
+ message[def.name] = c.create;
+ outcomes[Number(c.descriptor.numeric).toString(10)] = c;
+ outcomes[c.descriptor.symbolic] = c;
+ message['is_' + def.name] = function (o) {
+ if (o && o.descriptor) {
+ var c = outcomes[o.descriptor.value];
+ if (c) {
+ return c.descriptor.numeric == def.code;
+ }
+ }
+ return false;
+ };
+}
+
+message.unwrap_outcome = function (outcome) {
+ if (outcome && outcome.descriptor) {
+ var c = outcomes[outcome.descriptor.value];
+ if (c) {
+ return new c(outcome);
+ }
+ }
+ console.log('unrecognised outcome');
+ return outcome;
+};
+
+message.are_outcomes_equivalent = function(a, b) {
+ if (a === undefined && b === undefined) return true;
+ else if (a === undefined || b === undefined) return false;
+ else return a.descriptor.value == b.descriptor.value && JSON.stringify(a) == JSON.stringify(b);
+};
+
+define_outcome({name:"received", code:0x23,
+ fields:[
+ {name:"section-number", type:"uint", mandatory:true},
+ {name:"section-offset", type:"ulong", mandatory:true}
+ ]});
+define_outcome({name:"accepted", code:0x24, fields:[]});
+define_outcome({name:"rejected", code:0x25, fields:[{name:"error", type:"error"}]});
+define_outcome({name:"released", code:0x26, fields:[]});
+define_outcome({name:"modified",
+ code:0x27,
+ fields:[
+ {name:"delivery-failed", type:"boolean"},
+ {name:"undeliverable-here", type:"boolean"},
+ {name:"message-annotations", type:"fields"}
+]});
+
+module.exports = message;
+
+},{"./log.js":5,"./types.js":12}],7:[function(require,module,exports){
+/*
+ * Copyright 2015 Red Hat Inc.
+ *
+ * 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.
+ */
+'use strict';
+
+var url = require('url');
+
+var simple_id_generator = {
+ counter : 1,
+ next : function() {
+ return this.counter++;
+ }
+};
+
+var Client = function (container, address) {
+ var u = url.parse(address);
+ //TODO: handle scheme and user/password if present
+ this.connection = container.connect({'host':u.hostname, 'port':u.port});
+ this.connection.on('message', this._response.bind(this));
+ this.connection.on('receiver_open', this._ready.bind(this));
+ this.sender = this.connection.attach_sender(u.path.substr(1));
+ this.receiver = this.connection.attach_receiver({source:{dynamic:true}});
+ this.id_generator = simple_id_generator;
+ this.pending = [];//requests yet to be made (waiting for receiver to open)
+ this.outstanding = {};//requests sent, for which responses have not yet been received
+};
+
+Client.prototype._request = function (id, name, args, callback) {
+ var request = {properties:{}};
+ request.properties.subject = name;
+ request.body = args;
+ request.properties.message_id = id;
+ request.properties.reply_to = this.receiver.remote.attach.source.address;
+ this.outstanding[id] = callback;
+ this.sender.send(request);
+};
+
+Client.prototype._response = function (context) {
+ var id = context.message.properties.correlation_id;
+ var callback = this.outstanding[id];
+ if (callback) {
+ if (context.message.properties.subject === 'ok') {
+ callback(context.message.body);
+ } else {
+ callback(undefined, {name: context.message.properties.subject, description: context.message.body});
+ }
+ } else {
+ console.log('no request pending for ' + id + ', ignoring response');
+ }
+};
+
+Client.prototype._ready = function (context) {
+ this._process_pending();
+};
+
+Client.prototype._process_pending = function () {
+ for (var i = 0; i < this.pending.length; i++) {
+ var r = this.pending[i];
+ this._request(r.id, r.name, r.args, r.callback);
+ }
+ this.pending = [];
+};
+
+Client.prototype.call = function (name, args, callback) {
+ var id = this.id_generator.next();
+ if (this.receiver.is_open() && this.pending.length === 0) {
+ this._request(id, name, args, callback);
+ } else {
+ //need to wait for reply-to address
+ this.pending.push({'name':name, 'args':args, 'callback':callback, 'id':id});
+ }
+};
+
+Client.prototype.close = function () {
+ this.receiver.close();
+ this.sender.close();
+ this.connection.close();
+};
+
+Client.prototype.define = function (name) {
+ this[name] = function (args, callback) { this.call(name, args, callback); };
+};
+
+var Cache = function (ttl, purged) {
+ this.ttl = ttl;
+ this.purged = purged;
+ this.entries = {};
+ this.timeout = undefined;
+};
+
+Cache.prototype.clear = function () {
+ if (this.timeout) clearTimeout(this.timeout);
+ this.entries = {};
+}
+
+Cache.prototype.put = function (key, value) {
+ this.entries[key] = {'value':value, 'last_accessed': Date.now()};
+ if (!this.timeout) this.timeout = setTimeout(this.purge.bind(this), this.ttl);
+};
+
+Cache.prototype.get = function (key) {
+ var entry = this.entries[key];
+ if (entry) {
+ entry.last_accessed = Date.now();
+ return entry.value;
+ } else {
+ return undefined;
+ }
+};
+
+Cache.prototype.purge = function() {
+ //TODO: this could be optimised if the map is large
+ var now = Date.now();
+ var expired = [];
+ var live = 0;
+ for (var k in this.entries) {
+ if (now - this.entries[k].last_accessed >= this.ttl) {
+ expired.push(k);
+ } else {
+ live++;
+ }
+ }
+ for (var i = 0; i < expired.length; i++) {
+ var entry = this.entries[expired[i]];
+ delete this.entries[expired[i]];
+ this.purged(entry.value);
+ }
+ if (live && !this.timeout) {
+ this.timeout = setTimeout(this.purge.bind(this), this.ttl);
+ }
+};
+
+var LinkCache = function (factory, ttl) {
+ this.factory = factory;
+ this.cache = new Cache(ttl, function(link) { link.close(); });
+}
+
+LinkCache.prototype.clear = function () {
+ this.cache.clear();
+}
+
+LinkCache.prototype.get = function (address) {
+ var link = this.cache.get(address);
+ if (link === undefined) {
+ link = this.factory(address);
+ this.cache.put(address, link);
+ }
+ return link;
+};
+
+var Server = function (container, address, options) {
+ this.options = options || {};
+ var u = url.parse(address);
+ //TODO: handle scheme and user/password if present
+ this.connection = container.connect({'host':u.hostname, 'port':u.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(u.path.substr(1));
+ this.callbacks = {};
+ this._send = undefined;
+ this._clear = undefined;
+};
+
+function match(desired, offered) {
+ if (offered) {
+ if (Array.isArray(offered)) {
+ return offered.indexOf(desired) > -1;
+ } else {
+ return desired === offered;
+ }
+ } else {
+ return false;
+ }
+}
+
+Server.prototype._connection_open = function (context) {
+ if (match('ANONYMOUS-RELAY', this.connection.remote.open.offered_capabilities)) {
+ var relay = this.connection.attach_sender({target:{}});
+ this._send = function (msg) { relay.send(msg); };
+ } else {
+ var cache = new LinkCache(this.connection.attach_sender.bind(this.connection), this.options.cache_ttl || 60000);
+ this._send = function (msg) { var s = cache.get(msg.properties.to); if (s) s.send(msg); };
+ this._clear = function () { cache.clear(); }
+ }
+}
+
+Server.prototype._respond = function (response) {
+ var server = this;
+ return function (result, error) {
+ if (error) {
+ response.properties.subject = error.name || 'error';
+ response.body = error.description || error;
+ } else {
+ response.properties.subject = 'ok';
+ response.body = result;
+ }
+ server._send(response);
+ };
+}
+
+Server.prototype._request = function (context) {
+ var request = context.message;
+ var response = {properties:{}};
+ response.properties.to = request.properties.reply_to;
+ response.properties.correlation_id = request.properties.message_id;
+ var callback = this.callbacks[request.properties.subject];
+ if (callback) {
+ callback(request.body, this._respond(response));
+ } else {
+ response.properties.subject = 'bad-method';
+ response.body = 'Unrecognised method ' + request.properties.subject;
+ this._send(response);
+ }
+};
+
+Server.prototype.bind_sync = function (f, name) {
+ this.callbacks[name || f.name] = function (args, callback) { var result = f(args); callback(result); };
+};
+Server.prototype.bind = function (f, name) {
+ this.callbacks[name || f.name] = f;
+};
+
+Server.prototype.close = function () {
+ if (this._clear) this._clear();
+ this.receiver.close();
+ this.connection.close();
+};
+
+module.exports = {
+ server : function(container, address, options) { return new Server(container, address, options); },
+ client : function(connection, address) { return new Client(connection, address); }
+};
+
+},{"url":29}],8:[function(require,module,exports){
+(function (Buffer){
+/*
+ * Copyright 2015 Red Hat Inc.
+ *
+ * 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.
+ */
+'use strict';
+
+var frames = require('./frames.js');
+var log = require('./log.js');
+var Transport = require('./transport.js');
+
+var sasl_codes = {
+ "OK":0,
+ "AUTH":1,
+ "SYS":2,
+ "SYS_PERM":3,
+ "SYS_TEMP":4,
+};
+
+var SASL_PROTOCOL_ID = 0x03;
+
+function intersection(lista, listb) {
+ return lista.filter(function (a) { return listb.indexOf(a) >= 0; });
+}
+function extract(buffer) {
+ var results = [];
+ var start = 0;
+ var i = 0;
+ while (i < buffer.length) {
+ if (buffer[i] === 0x00) {
+ if (i > start) results.push(buffer.toString('utf8', start, i));
+ else results.push(null);
+ start = ++i;
+ } else {
+ ++i;
+ }
+ }
+ if (i > start) results.push(buffer.toString('utf8', start, i));
+ else results.push(null);
+ return results;
+}
+
+var PlainServer = function(callback) {
+ this.callback = callback;
+ this.outcome = undefined;
+ this.username = undefined;
+};
+
+PlainServer.prototype.start = function(response) {
+ var fields = extract(response);
+ if (fields.length !== 3) {
+ this.connection.sasl_failed('Unexpected response in PLAIN, got ' + fields.length + ' fields, expected 3');
+ }
+ if (this.callback(fields[1], fields[2])) {
+ this.outcome = true;
+ this.username = fields[1];
+ } else {
+ this.outcome = false;
+ }
+};
+
+var PlainClient = function(username, password) {
+ this.username = username;
+ this.password = password;
+};
+
+PlainClient.prototype.start = function() {
+ var response = new Buffer(1 + this.username.length + 1 + this.password.length);
+ response.writeUInt8(0, 0);
+ response.write(this.username, 1);
+ response.writeUInt8(0, 1 + this.username.length);
+ response.write(this.password, 1 + this.username.length + 1);
+ return response;
+};
+
+var AnonymousServer = function() {
+ this.outcome = undefined;
+ this.username = undefined;
+};
+
+AnonymousServer.prototype.start = function(response) {
+ this.outcome = true;
+ this.username = response ? response.toString('utf8') : 'anonymous';
+};
+
+var AnonymousClient = function(name) {
+ this.username = name ? name : 'anonymous';
+};
+
+AnonymousClient.prototype.start = function() {
+ var response = new Buffer(1 + this.username.length);
+ response.writeUInt8(0, 0);
+ response.write(this.username, 1);
+ return response;
+};
+
+var ExternalServer = function() {
+ this.outcome = undefined;
+ this.username = undefined;
+};
+
+ExternalServer.prototype.start = function(response) {
+ this.outcome = true;
+};
+
+var ExternalClient = function() {
+ this.username = undefined;
+};
+
+ExternalClient.prototype.start = function() {
+ return null;
+};
+
+/**
+ * The mechanisms argument is a map of mechanism names to factory
+ * functions for objects that implement that mechanism.
+ */
+var SaslServer = function (connection, mechanisms) {
+ this.connection = connection;
+ this.transport = new Transport(connection.amqp_transport.identifier, SASL_PROTOCOL_ID, frames.TYPE_SASL, this);
+ this.next = connection.amqp_transport;
+ this.mechanisms = mechanisms;
+ this.mechanism = undefined;
+ this.outcome = undefined;
+ this.username = undefined;
+ var mechlist = Object.getOwnPropertyNames(mechanisms);
+ this.transport.encode(frames.sasl_frame(frames.sasl_mechanisms({sasl_server_mechanisms:mechlist}).described()));
+};
+
+SaslServer.prototype.do_step = function (challenge) {
+ if (this.mechanism.outcome === undefined) {
+ this.transport.encode(frames.sasl_frame(frames.sasl_challenge({'challenge':challenge}).described()));
+ } else {
+ this.outcome = this.mechanism.outcome ? sasl_codes.OK : sasl_codes.AUTH;
+ this.transport.encode(frames.sasl_frame(frames.sasl_outcome({code: this.outcome}).described()));
+ if (this.outcome === sasl_codes.OK) {
+ this.username = this.mechanism.username;
+ this.transport.write_complete = true;
+ this.transport.read_complete = true;
+ }
+ }
+};
+
+SaslServer.prototype.on_sasl_init = function (frame) {
+ var f = this.mechanisms[frame.performative.mechanism];
+ if (f) {
+ this.mechanism = f();
+ var challenge = this.mechanism.start(frame.performative.initial_response);
+ this.do_step(challenge);
+ } else {
+ this.outcome = sasl_codes.AUTH;
+ this.transport.encode(frames.sasl_frame(frames.sasl_outcome({code: this.outcome}).described()));
+ }
+};
+SaslServer.prototype.on_sasl_response = function (frame) {
+ this.do_step(this.mechanism.step(frame.performative.response));
+};
+
+SaslServer.prototype.has_writes_pending = function () {
+ return this.transport.has_writes_pending() || this.next.has_writes_pending();
+}
+
+SaslServer.prototype.write = function (socket) {
+ if (this.transport.write_complete && this.transport.pending.length === 0) {
+ return this.next.write(socket);
+ } else {
+ return this.transport.write(socket);
+ }
+};
+
+SaslServer.prototype.read = function (buffer) {
+ if (this.transport.read_complete) {
+ return this.next.read(buffer);
+ } else {
+ return this.transport.read(buffer);
+ }
+};
+
+var SaslClient = function (connection, mechanisms) {
+ this.connection = connection;
+ this.transport = new Transport(connection.amqp_transport.identifier, SASL_PROTOCOL_ID, frames.TYPE_SASL, this);
+ this.next = connection.amqp_transport;
+ this.mechanisms = mechanisms;
+ this.mechanism = undefined;
+ this.mechanism_name = undefined;
+ this.failed = false;
+};
+
+SaslClient.prototype.on_sasl_mechanisms = function (frame) {
+ for (var i = 0; this.mechanism === undefined && i < frame.performative.sasl_server_mechanisms.length; i++) {
+ var mech = frame.performative.sasl_server_mechanisms[i];
+ var f = this.mechanisms[mech];
+ if (f) {
+ this.mechanism = f();
+ this.mechanism_name = mech;
+ }
+ }
+ if (this.mechanism) {
+ var response = this.mechanism.start();
+ this.transport.encode(frames.sasl_frame(frames.sasl_init({'mechanism':this.mechanism_name,'initial_response':response}).described()));
+ } else {
+ this.failed = true;
+ this.connection.sasl_failed('No suitable mechanism; server supports ' + frame.performative.sasl_server_mechanisms);
+ }
+};
+SaslClient.prototype.on_sasl_challenge = function (frame) {
+ var response = this.mechanism.step(frame.performative.challenge);
+ this.transport.encode(frames.sasl_frame(frames.sasl_response({'response':response}).described()));
+};
+SaslClient.prototype.on_sasl_outcome = function (frame) {
+ switch (frame.performative.code) {
+ case sasl_codes.OK:
+ this.transport.read_complete = true;
+ this.transport.write_complete = true;
+ break;
+ default:
+ this.transport.write_complete = true;
+ this.connection.sasl_failed("Failed to authenticate: " + frame.performative.code);
+ }
+};
+
+SaslClient.prototype.has_writes_pending = function () {
+ return this.transport.has_writes_pending() || this.next.has_writes_pending();
+}
+
+SaslClient.prototype.write = function (socket) {
+ if (this.transport.write_complete) {
+ return this.next.write(socket);
+ } else {
+ return this.transport.write(socket);
+ }
+};
+
+SaslClient.prototype.read = function (buffer) {
+ if (this.transport.read_complete) {
+ return this.next.read(buffer);
+ } else {
+ return this.transport.read(buffer);
+ }
+};
+
+var default_server_mechanisms = {
+ enable_anonymous: function () {
+ this['ANONYMOUS'] = function() { return new AnonymousServer(); };
+ },
+ enable_plain: function (callback) {
+ this['PLAIN'] = function() { return new PlainServer(callback); };
+ }
+};
+
+var default_client_mechanisms = {
+ enable_anonymous: function (name) {
+ this['ANONYMOUS'] = function() { return new AnonymousClient(name); };
+ },
+ enable_plain: function (username, password) {
+ this['PLAIN'] = function() { return new PlainClient(username, password); };
+ },
+ enable_external: function () {
+ this['EXTERNAL'] = function() { return new ExternalClient(); };
+ }
+};
+
+module.exports = {
+ Client : SaslClient,
+ Server : SaslServer,
+ server_mechanisms : function () {
+ return Object.create(default_server_mechanisms);
+ },
+ client_mechanisms : function () {
+ return Object.create(default_client_mechanisms);
+ },
+ server_add_external: function (mechs) {
+ mechs['EXTERNAL'] = function() { return new ExternalServer(); };
+ return mechs;
+ }
+};
+
+}).call(this,require("buffer").Buffer)
+},{"./frames.js":3,"./log.js":5,"./transport.js":11,"buffer":19}],9:[function(require,module,exports){
+(function (Buffer){
+/*
+ * Copyright 2015 Red Hat Inc.
+ *
+ * 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.
+ */
+'use strict';
+
+var frames = require('./frames.js');
+var link = require('./link.js');
+var log = require('./log.js');
+var message = require('./message.js');
+var types = require('./types.js');
+var util = require('./util.js');
+var EndpointState = require('./endpoint.js');
+
+var EventEmitter = require('events').EventEmitter;
+
+var CircularBuffer = function (capacity) {
+ this.capacity = capacity;
+ this.size = 0;
+ this.head = 0;
+ this.tail = 0;
+ this.entries = [];
+};
+
+CircularBuffer.prototype.available = function () {
+ return this.capacity - this.size;
+};
+
+CircularBuffer.prototype.push = function (o) {
+ if (this.size < this.capacity) {
+ this.entries[this.tail] = o;
+ this.tail = (this.tail + 1) % this.capacity;
+ this.size++;
+ } else {
+ throw Error('circular buffer overflow: head=' + this.head + ' tail=' + this.tail + ' size=' + this.size + ' capacity=' + this.capacity);
+ }
+};
+
+CircularBuffer.prototype.pop_if = function (f) {
+ var count = 0;
+ while (this.size && f(this.entries[this.head])) {
+ this.entries[this.head] = undefined;
+ this.head = (this.head + 1) % this.capacity;
+ this.size--;
+ count++;
+ }
+ return count;
+};
+
+CircularBuffer.prototype.by_id = function (id) {
+ if (this.size > 0) {
+ var gap = id - this.entries[this.head].id;
+ if (gap < this.size) {
+ return this.entries[(this.head + gap) % this.capacity];
+ }
+ }
+ return undefined;
+};
+
+CircularBuffer.prototype.get_head = function (id) {
+ return this.size > 0 ? this.entries[this.head] : undefined;
+};
+
+
+var Outgoing = function () {
+ this.deliveries = new CircularBuffer(2048/*TODO= configurable?*/);
+ this.updated = [];
+ this.next_delivery_id = 0;
+ this.next_pending_delivery = 0;
+ this.next_transfer_id = 0;
+ this.window = types.MAX_UINT;
+ this.remote_next_transfer_id = undefined;
+ this.remote_window = undefined;
+};
+
+Outgoing.prototype.available = function () {
+ return this.deliveries.available();
+};
+
+Outgoing.prototype.send = function (sender, tag, data, format) {
+ var d = {'id':this.next_delivery_id++,
+ 'tag':tag,
+ 'link':sender,
+ 'data': data,
+ 'format':format ? format : 0,
+ 'sent': false,
+ 'settled': false,
+ 'state': undefined,
+ 'remote_settled': false,
+ 'remote_state': undefined};
+ this.deliveries.push(d);
+ return d;
+};
+
+Outgoing.prototype.on_begin = function (fields) {
+ this.remote_window = fields.incoming_window;
+};
+
+Outgoing.prototype.on_flow = function (fields) {
+ this.remote_next_transfer_id = fields.next_incoming_id;
+ this.remote_window = fields.incoming_window;
+};
+
+Outgoing.prototype.on_disposition = function (fields) {
+ var last = fields.last ? fields.last : fields.first;
+ for (var i = fields.first; i <= last; i++) {
+ var d = this.deliveries.by_id(i);
+ if (!d) {
+ console.log('Could not find delivery for ' + i + ' [' + JSON.stringify(fields) + ']');
+ }
+ if (d && !d.remote_settled) {
+ var updated = false;
+ if (fields.settled) {
+ d.remote_settled = fields.settled;
+ updated = true;
+ }
+ if (fields.state && fields.state !== d.remote_state) {
+ d.remote_state = fields.state;
+ updated = true;
+ }
+ if (updated) {
+ this.updated.push(d);
+ }
+ }
+ }
+};
+
+Outgoing.prototype.transfer_window = function() {
+ if (this.remote_window) {
+ return this.remote_window - (this.next_transfer_id - this.remote_next_transfer_id);
+ }
+};
+
+Outgoing.prototype.process = function() {
+ // send pending deliveries for which there is credit:
+ while (this.next_pending_delivery < this.next_delivery_id) {
+ var d = this.deliveries.by_id(this.next_pending_delivery);
+ if (d) {
+ if (d.link.has_credit()) {
+ d.link.delivery_count++;
+ //TODO: fragment as appropriate
+ d.transfers_required = 1;
+ if (this.transfer_window() >= d.transfers_required) {
+ this.next_transfer_id += d.transfers_required;
+ this.window -= d.transfers_required;
+ d.link.session.output(frames.transfer({'handle':d.link.local.handle,'message_format':d.format,'delivery_id':d.id, 'delivery_tag':d.tag}).described(), d.data);
+ d.link.credit--;
+ this.next_pending_delivery++;
+ } else {
+ log.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;
+ }
+ } else {
+ log.flow('Link has no credit');
+ break;
+ }
+ } else {
+ console.log('ERROR: Next pending delivery not found: ' + this.next_pending_delivery);
+ break;
+ }
+ }
+
+ // notify application of any updated deliveries:
+ for (var i = 0; i < this.updated.length; i++) {
+ var d = this.updated[i];
+ if (d.remote_state) {
+ d.remote_state = message.unwrap_outcome(d.remote_state);
+ if (d.remote_state && d.remote_state.constructor.composite_type) {
+ d.link.dispatch(d.remote_state.constructor.composite_type, d.link._context({'delivery':d}));
+ }
+ }
+ if (d.remote_settled) d.link.dispatch('settled', d.link._context({'delivery':d}));
+ }
+ this.updated = [];
+
+ // remove any fully settled deliveries:
+ this.deliveries.pop_if(function (d) { return d.settled && d.remote_settled; });
+};
+
+var Incoming = function () {
+ this.deliveries = new CircularBuffer(2048/*TODO: configurable?*/);
+ this.updated = [];
+ this.next_transfer_id = 0;
+ this.next_delivery_id = undefined;
+ this.window = 2048/*TODO: configurable?*/;
+ this.remote_next_transfer_id = undefined;
+ this.remote_window = undefined;
+};
+
+Incoming.prototype.update = function (delivery, settled, state) {
+ if (delivery) {
+ delivery.settled = settled;
+ if (state !== undefined) delivery.state = state;
+ if (!delivery.remote_settled) {
+ this.updated.push(delivery);
+ }
+ delivery.link.connection._register();
+ }
+};
+
+Incoming.prototype.on_transfer = function(frame, receiver) {
+ this.next_transfer_id++;
+ if (receiver.is_open()) {
+ if (this.next_delivery_id === undefined) {
+ this.next_delivery_id = frame.performative.delivery_id;
+ }
+ var current;
+ var data;
+ var last = this.deliveries.get_head();
+ if (last && last.incomplete) {
+ if (frame.performative.delivery_id !== undefined && this.next_delivery_id != frame.performative.delivery_id) {
+ //TODO: better error handling
+ throw Error("frame sequence error: delivery " + this.next_delivery_id + " not complete, got " + frame.performative.delivery_id);
+ }
+ current = last;
+ data = Buffer.concat([current.data, frame.payload], current.data.size() + frame.payload.size());
+ } else if (this.next_delivery_id === frame.performative.delivery_id) {
+ current = {'id':frame.performative.delivery_id,
+ 'tag':frame.performative.delivery_tag,
+ 'link':receiver,
+ 'settled': false,
+ 'state': undefined,
+ 'remote_settled': frame.performative.settled,
+ 'remote_state': undefined};
+ var self = this;
+ current.update = function (settled, state) { self.update(current, settled, state); };
+ this.deliveries.push(current);
+ data = frame.payload;
+ } else {
+ //TODO: better error handling
+ throw Error("frame sequence error: expected " + this.next_delivery_id + ", got " + frame.performative.delivery_id);
+ }
+ current.incomplete = frame.performative.more;
+ if (current.incomplete) {
+ current.data = data;
+ } else {
+ receiver.credit--;
+ receiver.delivery_count++;
+ this.next_delivery_id++;
+ receiver.dispatch('message', receiver._context({'message':message.decode(data), 'delivery':current}));
+ }
+ }
+};
+
+Incoming.prototype.process = function () {
+ if (this.updated.length > 0) {
+ var first;
+ var last;
+ var next_id;
+
+ for (var i = 0; i < this.updated.length; i++) {
+ var delivery = this.updated[i];
+ if (first === undefined) {
+ first = delivery;
+ last = delivery;
+ next_id = delivery.id;
+ }
+
+ if (!message.are_outcomes_equivalent(last.state, delivery.state) || last.settled !== delivery.settled || next_id !== delivery.id) {
+ first.link.session.output(frames.disposition({'role':true,'first':first.id,'last':last.id, 'state':first.state, 'settled':first.settled}).described());
+ first = delivery;
+ last = delivery;
+ next_id = delivery.id;
+ } else {
+ if (last.id !== delivery.id) {
+ last = delivery;
+ }
+ next_id++;
+ }
+ }
+ if (first !== undefined && last !== undefined) {
+ first.link.session.output(frames.disposition({'role':true,'first':first.id,'last':last.id, 'state':first.state, 'settled':first.settled}).described());
+ }
+
+ this.updated = [];
+ }
+
+ // remove any fully settled deliveries:
+ this.deliveries.pop_if(function (d) { return d.settled; });
+};
+
+Incoming.prototype.on_begin = function (fields) {
+ this.remote_window = fields.outgoing_window;
+};
+
+Incoming.prototype.on_flow = function (fields) {
+ this.remote_next_transfer_id = fields.next_outgoing_id;
+ this.remote_window = fields.outgoing_window;
+};
+
+Incoming.prototype.on_disposition = function (fields) {
+ var last = fields.last ? fields.last : fields.first;
+ for (var i = fields.first; i <= last; i++) {
+ var d = this.deliveries.by_id(i);
+ if (!d) {
+ console.log('Could not find delivery for ' + i);
+ }
+ if (d && !d.remote_settled) {
+ var updated = false;
+ if (fields.settled) {
+ d.remote_settled = fields.settled;
+ updated = true;
+ }
+ if (fields.state && fields.state !== d.remote_state) {
+ d.remote_state = fields.state;
+ updated = true;
+ }
+ if (updated) {
+ console.log(d.link.connection.options.id + ' added delivery to updated list following receipt of disposition for incoming deliveries');
+ this.updated.push(d);
+ }
+ }
+ }
+
+};
+
+var Session = function (connection, local_channel) {
+ this.connection = connection;
+ this.outgoing = new Outgoing();
+ this.incoming = new Incoming();
+ this.state = new EndpointState();
+ this.local = {'channel': local_channel, 'handles':{}};
+ this.local.begin = frames.begin({next_outgoing_id:this.outgoing.next_transfer_id,incoming_window:this.incoming.window,outgoing_window:this.outgoing.window});
+ this.local.end = frames.end();
+ this.remote = {'handles':{}};
+ this.links = {}; // map by name
+ this.options = {};
+};
+Session.prototype = Object.create(EventEmitter.prototype);
+Session.prototype.constructor = Session;
+
+Session.prototype.reset = function() {
+ this.state.disconnected();
+ this.outgoing = new Outgoing();
+ this.incoming = new Incoming();
+ this.remote = {'handles':{}};
+ for (var l in this.links) {
+ this.links[l].reset();
+ }
+};
+
+Session.prototype.dispatch = function(name, context) {
+ log.events('Session got event: '+ name);
+ if (this.listeners(name).length) {
+ EventEmitter.prototype.emit.apply(this, arguments);
+ } else {
+ this.connection.dispatch.apply(this.connection, arguments);
+ }
+};
+Session.prototype.output = function (frame, payload) {
+ this.connection._write_frame(this.local.channel, frame, payload);
+};
+
+Session.prototype.create_sender = function (name, opts) {
+ return this.create_link(name, link.Sender, opts);
+};
+
+Session.prototype.create_receiver = function (name, opts) {
+ return this.create_link(name, link.Receiver, opts);
+};
+
+function attach(factory, args, remote_terminus) {
+ var opts = args ? args : {};
+ if (typeof args === 'string') {
+ opts = {};
+ opts[remote_terminus] = args;
+ }
+ if (!opts.name) opts.name = util.generate_uuid();
+ var l = factory(opts.name, opts);
+ for (var t in {'source':0, 'target':0}) {
+ if (opts[t]) {
+ if (typeof opts[t] === 'string') {
+ opts[t] = {'address' : opts[t]};
+ }
+ l['set_' + t](opts[t]);
+ }
+ }
+ l.attach();
+ return l;
+}
+
+Session.prototype.get_option = function (name, default_value) {
+ if (this.options[name] !== undefined) return this.options[name];
+ else return this.connection.get_option(name, default_value);
+};
+
+Session.prototype.attach_sender = function (args) {
+ return attach(this.create_sender.bind(this), args, 'target');
+};
+Session.prototype.open_sender = Session.prototype.attach_sender;//alias
+
+Session.prototype.attach_receiver = function (args) {
+ return attach(this.create_receiver.bind(this), args, 'source');
+};
+Session.prototype.open_receiver = Session.prototype.attach_receiver;//alias
+
+Session.prototype.create_link = function (name, constructor, opts) {
+ var i = 0;
+ while (this.local.handles[i]) i++;
+ var l = new constructor(this, name, i, opts);
+ this.links[name] = l;
+ this.local.handles[i] = l;
+ return l;
+};
+
+Session.prototype.begin = function () {
+ if (this.state.open()) {
+ this.connection._register();
+ }
+};
+Session.prototype.open = Session.prototype.begin;
+
+Session.prototype.end = function () {
+ if (this.state.close()) {
+ this.connection._register();
+ }
+};
+Session.prototype.close = Session.prototype.end;
+
+Session.prototype.is_open = function () {
+ return this.connection.is_open() && this.state.is_open();
+};
+
+Session.prototype.is_closed = function () {
+ return this.connection.is_closed() || this.state.is_closed();
+};
+
+Session.prototype._process = function () {
+ do {
+ if (this.state.need_open()) {
+ this.output(this.local.begin.described());
+ }
+
+ this.outgoing.process();
+ this.incoming.process();
+ for (var k in this.links) {
+ this.links[k]._process();
+ }
+
+ if (this.state.need_close()) {
+ this.output(this.local.end.described());
+ }
+ } while (!this.state.has_settled());
+};
+
+Session.prototype.send = function (sender, tag, data, format) {
+ var d = this.outgoing.send(sender, tag, data, format);
+ this.connection._register();
+ return d;
+};
+
+Session.prototype._write_flow = function (link) {
+ var fields = {'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
+ };
+ if (link) {
+ fields.delivery_count = link.delivery_count;
+ fields.handle = link.local.handle;
+ fields.link_credit = link.credit;
+ }
+ this.output(frames.flow(fields).described());
+};
+
+Session.prototype.on_begin = function (frame) {
+ if (this.state.remote_opened()) {
+ if (!this.remote.channel) {
+ this.remote.channel = frame.channel;
+ }
+ this.remote.begin = frame.performative;
+ this.outgoing.on_begin(frame.performative);
+ this.incoming.on_begin(frame.performative);
+ this.open();
+ this.dispatch('session_open', this._context());
+ } else {
+ throw Error('Begin already received');
+ }
+};
+Session.prototype.on_end = function (frame) {
+ if (this.state.remote_closed()) {
+ this.remote.end = frame.performative;
+ this.close();
+ this.dispatch('session_close', this._context());
+ } else {
+ throw Error('End already received');
+ }
+};
+
+Session.prototype.on_attach = function (frame) {
+ var name = frame.performative.name;
+ var link = this.links[name];
+ if (!link) {
+ // if role is true, peer is receiver, so we are sender
+ link = frame.performative.role ? this.create_sender(name) : this.create_receiver(name);
+ }
+ this.remote.handles[frame.performative.handle] = link;
+ link.on_attach(frame);
+ link.remote.attach = frame.performative;
+};
+
+Session.prototype.on_disposition = function (frame) {
+ if (frame.performative.role) {
+ log.events('Received disposition for outgoing transfers');
+ this.outgoing.on_disposition(frame.performative);
+ } else {
+ log.events('Received disposition for incoming transfers');
+ this.incoming.on_disposition(frame.performative);
+ }
+ this.connection._register();
+}
+
+Session.prototype.on_flow = function (frame) {
+ this.outgoing.on_flow(frame.performative);
+ this.incoming.on_flow(frame.performative);
+ if (frame.performative.handle !== undefined) {
+ this._get_link(frame).on_flow(frame);
+ }
+ this.connection._register();
+}
+Session.prototype._context = function (c) {
+ var context = c ? c : {};
+ context.session = this;
+ return this.connection._context(context);
+};
+
+Session.prototype._get_link = function (frame) {
+ var handle = frame.performative.handle;
+ var link = this.remote.handles[handle];
+ if (!link) {
+ throw Error('Invalid handle ' + handle);
+ }
+ return link;
+};
+
+Session.prototype.on_detach = function (frame) {
+ this._get_link(frame).on_detach(frame);
+ //remove link
+ var handle = frame.performative.handle;
+ var link = this.remote.handles[handle];
+ delete this.remote.handles[handle];
+ delete this.local.handles[link.local.handle];
+ delete this.links[link.name];
+};
+
+Session.prototype.on_transfer = function (frame) {
+ this.incoming.on_transfer(frame, this._get_link(frame));
+};
+
+module.exports = Session;
+
+}).call(this,require("buffer").Buffer)
+},{"./endpoint.js":2,"./frames.js":3,"./link.js":4,"./log.js":5,"./message.js":6,"./types.js":12,"./util.js":13,"buffer":19,"events":23}],10:[function(require,module,exports){
+/*
+ * Copyright 2015 Red Hat Inc.
+ *
+ * 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.
+ */
+'use strict';
+
+var types = require('./types.js');
+
+var terminus = {};
+var by_descriptor = {};
+
+function define_terminus(def) {
+ var c = types.define_composite(def);
+ terminus[def.name] = c.create;
+ by_descriptor[Number(c.descriptor.numeric).toString(10)] = c;
+ by_descriptor[c.descriptor.symbolic] = c;
+};
+
+terminus.unwrap = function(field) {
+ if (field && field.descriptor) {
+ var c = by_descriptor[field.descriptor.value];
+ if (c) {
+ return new c(field.value)
+ } else {
+ console.log('Unknown terminus: ' + field.descriptor);
+ }
+ }
+ return null;
+};
+
+define_terminus(
+ {name:"source",
+ code:0x28,
+ 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:false},
+ {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:true},
+ {name:"capabilities", type:"symbol", multiple:true}
+ ]
+ });
+
+define_terminus(
+ {name:"target",
+ code:0x29,
+ 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:false},
+ {name:"dynamic_node_properties", type:"symbolic_map"},
+ {name:"capabilities", type:"symbol", multiple:true}
+ ]
+ });
+
+module.exports = terminus;
+
+},{"./types.js":12}],11:[function(require,module,exports){
+(function (Buffer){
+/*
+ * Copyright 2015 Red Hat Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License
<TRUNCATED>
---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@qpid.apache.org
For additional commands, e-mail: commits-help@qpid.apache.org
[07/19] qpid-dispatch git commit: moved standalone to a subdir
Posted by ea...@apache.org.
http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/4940e63d/console/stand-alone/plugin/data/world-110m.json
----------------------------------------------------------------------
diff --git a/console/stand-alone/plugin/data/world-110m.json b/console/stand-alone/plugin/data/world-110m.json
new file mode 100644
index 0000000..a1ce852
--- /dev/null
+++ b/console/stand-alone/plugin/data/world-110m.json
@@ -0,0 +1 @@
+{"type":"Topology","transform":{"scale":[0.0036000360003600037,0.0016925586033320111],"translate":[-180,-85.60903777459777]},"objects":{"land":{"type":"MultiPolygon","arcs":[[[0]],[[1]],[[2]],[[3]],[[4]],[[5]],[[6]],[[7,8,9]],[[10,11]],[[12]],[[13]],[[14]],[[15]],[[16]],[[17]],[[18]],[[19]],[[20]],[[21]],[[22]],[[23]],[[24]],[[25]],[[26]],[[27]],[[28]],[[29,30]],[[31]],[[32]],[[33]],[[34]],[[35]],[[36]],[[37]],[[38]],[[39]],[[40]],[[41]],[[42,43]],[[44]],[[45]],[[46]],[[47,48,49,50]],[[51]],[[52]],[[53]],[[54]],[[55]],[[56]],[[57]],[[58]],[[59]],[[60]],[[61]],[[62,63]],[[64]],[[65]],[[66]],[[67]],[[68]],[[69]],[[70]],[[71]],[[72]],[[73]],[[74]],[[75]],[[76,77]],[[78]],[[79]],[[80]],[[81]],[[82]],[[83]],[[84]],[[85]],[[86]],[[87]],[[88]],[[89]],[[90,91]],[[92]],[[93]],[[94]],[[95]],[[96]],[[97]],[[98]],[[99]],[[100]],[[101]],[[102]],[[103]],[[104]],[[105]],[[106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137
,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221]],[[222,223]],[[224]],[[225]],[[226]],[[227]],[[228]],[[229]],[[230,231,232,233]],[[234]],[[235]],[[236]],[[237]],[[238]],[[239]],[[240]],[[241]],[[242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,
370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,456,457,458,459,460,461,462,463,464,465,466,467,468,469,470,471,472,473,474,475,476,477],[478,479,480,481,482,483,484]],[[485]],[[486]],[[487]],[[488]],[[489]],[[490]],[[491]],[[492]],[[493]],[[494]],[[495]],[[496]],[[497]],[[498]]]},"countries":{"type":"GeometryCollection","geometries":[{"type":"Polygon","arcs":[[499,500,501,502,503,504]],"id":4},{"type":"MultiPolygon","arcs":[[[505,506,352,507]],[[354,508,509]]],"id":24},{"type":"Polygon","arcs":[[510,511,414,512,513,514]],"id":8},{"type":"Polygon","arcs":[[312,515,314,516,517]],"id":784},{"type":"MultiPolygon","arcs":[[[518,11]],[[519,520,521,166,522,168,523,524]]],"id":32},{"type":"Polygon",
"arcs":[[525,526,527,528,529]],"id":51},{"type":"MultiPolygon","arcs":[[[0]],[[1]],[[2]],[[3]],[[4]],[[5]],[[6]],[[530,531]]],"id":10},{"type":"Polygon","arcs":[[13]],"id":260},{"type":"MultiPolygon","arcs":[[[14]],[[24]]],"id":36},{"type":"Polygon","arcs":[[532,533,534,535,536,537,538]],"id":40},{"type":"MultiPolygon","arcs":[[[539,-528]],[[484,540,479,541,-526,542,543]]],"id":31},{"type":"Polygon","arcs":[[544,545,546]],"id":108},{"type":"Polygon","arcs":[[547,548,549,550,437]],"id":56},{"type":"Polygon","arcs":[[551,552,553,554,366]],"id":204},{"type":"Polygon","arcs":[[555,556,557,-553,558,559]],"id":854},{"type":"Polygon","arcs":[[560,561,289,562]],"id":50},{"type":"Polygon","arcs":[[563,404,564,565,566,567]],"id":100},{"type":"MultiPolygon","arcs":[[[71]],[[73]],[[74]]],"id":44},{"type":"Polygon","arcs":[[568,569,570]],"id":70},{"type":"Polygon","arcs":[[571,572,573,574,575]],"id":112},{"type":"Polygon","arcs":[[576,145,577]],"id":84},{"type":"Polygon","arcs":[[578,579,580,581
,-525]],"id":68},{"type":"Polygon","arcs":[[-521,582,-581,583,584,585,586,587,588,164,589]],"id":76},{"type":"Polygon","arcs":[[48,590]],"id":96},{"type":"Polygon","arcs":[[591,592]],"id":64},{"type":"Polygon","arcs":[[593,594,595,596]],"id":72},{"type":"Polygon","arcs":[[597,598,599,600,601,602,603]],"id":140},{"type":"MultiPolygon","arcs":[[[84]],[[85]],[[86]],[[87]],[[88]],[[96]],[[97]],[[99]],[[101]],[[103]],[[604,107,605,109,606,111,607,113,608,115,609,117,610,199,611,201,612,215,613,217,614,219,615,221]],[[616,223]],[[224]],[[225]],[[226]],[[227]],[[229]],[[230,617,232,618]],[[235]],[[237]],[[238]],[[240]],[[241]],[[485]],[[486]],[[488]],[[489]],[[490]],[[496]],[[497]]],"id":124},{"type":"Polygon","arcs":[[-536,619,620,621]],"id":756},{"type":"MultiPolygon","arcs":[[[-519,622,623,624]],[[-524,169,625,171,626,-579]]],"id":152},{"type":"MultiPolygon","arcs":[[[64]],[[627,274,628,276,629,278,630,280,631,632,633,634,635,-593,636,637,638,639,-503,640,641,642,643,644,645]]],"id":156
},{"type":"Polygon","arcs":[[369,646,647,648,-556,649]],"id":384},{"type":"Polygon","arcs":[[650,651,652,359,653,654,655,656,-604,657]],"id":120},{"type":"Polygon","arcs":[[658,659,-545,660,661,662,663,-508,353,-510,664,-602,665]],"id":180},{"type":"Polygon","arcs":[[-509,355,666,-658,-603,-665]],"id":178},{"type":"Polygon","arcs":[[667,174,668,155,669,-585,670]],"id":170},{"type":"Polygon","arcs":[[178,671,151,672]],"id":188},{"type":"Polygon","arcs":[[70]],"id":192},{"type":"Polygon","arcs":[[77,673]],"id":-99},{"type":"Polygon","arcs":[[76,-674]],"id":196},{"type":"Polygon","arcs":[[-538,674,675,676]],"id":203},{"type":"Polygon","arcs":[[445,677,-675,-537,-622,678,679,-549,680,441,681]],"id":276},{"type":"Polygon","arcs":[[337,682,683,684]],"id":262},{"type":"MultiPolygon","arcs":[[[92]],[[-682,442,685,444]]],"id":208},{"type":"Polygon","arcs":[[62,686]],"id":214},{"type":"Polygon","arcs":[[687,688,689,690,691,384,692,693]],"id":12},{"type":"Polygon","arcs":[[173,-668,694]],"id":
218},{"type":"Polygon","arcs":[[333,695,696,390,697]],"id":818},{"type":"Polygon","arcs":[[698,699,700,336,-685]],"id":232},{"type":"Polygon","arcs":[[431,701,433,702,427,703,429,704]],"id":724},{"type":"Polygon","arcs":[[450,705,706]],"id":233},{"type":"Polygon","arcs":[[-684,707,708,709,710,711,712,-699]],"id":231},{"type":"Polygon","arcs":[[713,452,714,715,455,716,717]],"id":246},{"type":"MultiPolygon","arcs":[[[18]],[[19]],[[20]]],"id":242},{"type":"Polygon","arcs":[[12]],"id":238},{"type":"MultiPolygon","arcs":[[[718,719,163,-589]],[[82]],[[720,-679,-621,721,426,-703,434,722,436,-551]]],"id":250},{"type":"Polygon","arcs":[[356,723,-651,-667]],"id":266},{"type":"MultiPolygon","arcs":[[[724,90]],[[725,726,727,728,729,730,731,732]]],"id":826},{"type":"Polygon","arcs":[[400,733,-543,-530,734]],"id":268},{"type":"Polygon","arcs":[[368,-650,-560,735]],"id":288},{"type":"Polygon","arcs":[[736,737,374,738,739,740,-648]],"id":324},{"type":"Polygon","arcs":[[741,377]],"id":270},{"type":"
Polygon","arcs":[[375,742,-739]],"id":624},{"type":"Polygon","arcs":[[357,-652,-724]],"id":226},{"type":"MultiPolygon","arcs":[[[78]],[[407,743,409,744,411,745,413,-512,746,-566,747]]],"id":300},{"type":"Polygon","arcs":[[498]],"id":304},{"type":"Polygon","arcs":[[185,748,-578,146,749,750]],"id":320},{"type":"Polygon","arcs":[[161,751,-587,752]],"id":328},{"type":"Polygon","arcs":[[182,753,754,-750,147,755,149,756]],"id":340},{"type":"Polygon","arcs":[[757,-571,758,417,759,419,760,761]],"id":191},{"type":"Polygon","arcs":[[-687,63]],"id":332},{"type":"Polygon","arcs":[[-533,762,763,764,765,-762,766]],"id":348},{"type":"MultiPolygon","arcs":[[[26]],[[767,30]],[[31]],[[32]],[[35]],[[36]],[[39]],[[40]],[[768,43]],[[44]],[[45]],[[769,50]],[[46]]],"id":360},{"type":"Polygon","arcs":[[-639,770,-637,-592,-636,771,-563,290,772,292,773,294,774,296,775]],"id":356},{"type":"Polygon","arcs":[[91,-725]],"id":372},{"type":"Polygon","arcs":[[776,-505,777,300,778,302,779,780,781,-540,-527,-542,480]
],"id":364},{"type":"Polygon","arcs":[[782,783,784,785,786,-781,787]],"id":368},{"type":"Polygon","arcs":[[100]],"id":352},{"type":"Polygon","arcs":[[788,789,-698,391,790,791,792]],"id":376},{"type":"MultiPolygon","arcs":[[[79]],[[80]],[[793,421,794,423,795,425,-722,-620,-535]]],"id":380},{"type":"Polygon","arcs":[[61]],"id":388},{"type":"Polygon","arcs":[[796,-785,797,332,-790,798,-793]],"id":400},{"type":"MultiPolygon","arcs":[[[75]],[[81]],[[83]]],"id":392},{"type":"Polygon","arcs":[[799,800,482,801,-643,802]],"id":398},{"type":"Polygon","arcs":[[342,803,804,805,-710,806]],"id":404},{"type":"Polygon","arcs":[[-803,-642,807,808]],"id":417},{"type":"Polygon","arcs":[[809,810,811,283]],"id":116},{"type":"Polygon","arcs":[[265,812,267,813]],"id":410},{"type":"Polygon","arcs":[[-515,814,815,816]],"id":-99},{"type":"Polygon","arcs":[[304,817,-783]],"id":414},{"type":"Polygon","arcs":[[818,819,-634,820,-811]],"id":418},{"type":"Polygon","arcs":[[-791,392,821]],"id":422},{"type":"Polygon
","arcs":[[370,822,372,823,-737,-647]],"id":430},{"type":"Polygon","arcs":[[824,-694,825,388,826,-697,827,828]],"id":434},{"type":"Polygon","arcs":[[52]],"id":144},{"type":"Polygon","arcs":[[829]],"id":426},{"type":"Polygon","arcs":[[830,448,831,-572,832]],"id":440},{"type":"Polygon","arcs":[[-680,-721,-550]],"id":442},{"type":"Polygon","arcs":[[449,-707,833,-573,-832]],"id":428},{"type":"Polygon","arcs":[[-692,834,835,836,837,383]],"id":504},{"type":"Polygon","arcs":[[838,839]],"id":498},{"type":"Polygon","arcs":[[23]],"id":450},{"type":"Polygon","arcs":[[840,-577,-749,186,841,188,842,190,843,192,844,194,845]],"id":484},{"type":"Polygon","arcs":[[-817,846,-567,-747,-511]],"id":807},{"type":"Polygon","arcs":[[847,-689,848,-557,-649,-741,849]],"id":466},{"type":"Polygon","arcs":[[287,-561,-772,-635,-820,850]],"id":104},{"type":"Polygon","arcs":[[416,-759,-570,851,-815,-514,852]],"id":499},{"type":"Polygon","arcs":[[853,-645]],"id":496},{"type":"Polygon","arcs":[[854,344,855,856,347,8
57,858,859,860,861,862]],"id":508},{"type":"Polygon","arcs":[[863,379,864,-690,-848]],"id":478},{"type":"Polygon","arcs":[[-863,865,866]],"id":454},{"type":"MultiPolygon","arcs":[[[285,867]],[[-770,47,-591,49]]],"id":458},{"type":"Polygon","arcs":[[351,-507,868,-595,869]],"id":516},{"type":"Polygon","arcs":[[17]],"id":540},{"type":"Polygon","arcs":[[-558,-849,-688,-825,870,-656,871,-554]],"id":562},{"type":"Polygon","arcs":[[361,872,363,873,365,-555,-872,-655]],"id":566},{"type":"Polygon","arcs":[[179,874,181,-757,150,-672]],"id":558},{"type":"Polygon","arcs":[[-681,-548,438,875,440]],"id":528},{"type":"MultiPolygon","arcs":[[[876,-718,877,457,878,459,879,461]],[[487]],[[492]],[[493]]],"id":578},{"type":"Polygon","arcs":[[-771,-638]],"id":524},{"type":"MultiPolygon","arcs":[[[15]],[[16]]],"id":554},{"type":"MultiPolygon","arcs":[[[880,319,881,882,883,-517,315,884,317]],[[-516,313]]],"id":512},{"type":"Polygon","arcs":[[-640,-776,297,885,299,-778,-504]],"id":586},{"type":"Polygon","a
rcs":[[175,886,177,-673,152,887,154,-669]],"id":591},{"type":"Polygon","arcs":[[-627,172,-695,-671,-584,-580]],"id":604},{"type":"MultiPolygon","arcs":[[[51]],[[54]],[[55]],[[56]],[[57]],[[58]],[[59]]],"id":608},{"type":"MultiPolygon","arcs":[[[37]],[[38]],[[-769,42]],[[41]]],"id":598},{"type":"Polygon","arcs":[[-678,446,888,-833,-576,889,890,-676]],"id":616},{"type":"Polygon","arcs":[[60]],"id":630},{"type":"Polygon","arcs":[[262,891,264,-814,892,269,893,271,894,273,-628,895]],"id":408},{"type":"Polygon","arcs":[[-705,430]],"id":620},{"type":"Polygon","arcs":[[-582,-583,-520]],"id":600},{"type":"Polygon","arcs":[[-799,-789]],"id":275},{"type":"Polygon","arcs":[[308,896,310,897]],"id":634},{"type":"Polygon","arcs":[[898,-840,899,403,-564,900,-765]],"id":642},{"type":"MultiPolygon","arcs":[[[89]],[[-889,447,-831]],[[102]],[[104]],[[105]],[[228]],[[234]],[[236]],[[239]],[[901,243,902,245,903,247,904,249,905,251,906,253,907,255,908,257,909,259,910,261,-896,-646,-854,-644,-802,483,-544,
-734,401,911,-574,-834,-706,451,-714,-877,912,913,914,915,464,916,466,917,468,918,470,919,920,473,921,475,922,477]],[[491]],[[494]],[[495]]],"id":643},{"type":"Polygon","arcs":[[923,-546,-660,924]],"id":646},{"type":"Polygon","arcs":[[-691,-865,380,-835]],"id":732},{"type":"Polygon","arcs":[[925,329,926,331,-798,-784,-818,305,927,307,-898,311,-518,-884,928]],"id":682},{"type":"Polygon","arcs":[[-599,929,-828,-696,334,-700,-713,930,931,932]],"id":729},{"type":"Polygon","arcs":[[-711,-806,933,-666,-601,934,-932,935]],"id":728},{"type":"Polygon","arcs":[[378,-864,-850,-740,-743,376,-742]],"id":686},{"type":"MultiPolygon","arcs":[[[25]],[[27]],[[28]],[[33]],[[34]]],"id":90},{"type":"Polygon","arcs":[[373,-738,-824]],"id":694},{"type":"Polygon","arcs":[[184,-751,-755,936]],"id":222},{"type":"Polygon","arcs":[[-708,-683,338,937,340,938]],"id":-99},{"type":"Polygon","arcs":[[-807,-709,-939,341]],"id":706},{"type":"Polygon","arcs":[[-568,-847,-816,-852,-569,-758,-766,-901]],"id":688},{"type
":"Polygon","arcs":[[162,-720,939,-588,-752]],"id":740},{"type":"Polygon","arcs":[[-891,940,-763,-539,-677]],"id":703},{"type":"Polygon","arcs":[[-534,-767,-761,420,-794]],"id":705},{"type":"Polygon","arcs":[[-878,-717,456]],"id":752},{"type":"Polygon","arcs":[[941,-859]],"id":748},{"type":"Polygon","arcs":[[-797,-792,-822,393,942,-786]],"id":760},{"type":"Polygon","arcs":[[-871,-829,-930,-598,-657]],"id":148},{"type":"Polygon","arcs":[[-736,-559,-552,367]],"id":768},{"type":"Polygon","arcs":[[284,-868,286,-851,-819,-810]],"id":764},{"type":"Polygon","arcs":[[-808,-641,-502,943]],"id":762},{"type":"Polygon","arcs":[[-777,481,-801,944,-500]],"id":795},{"type":"Polygon","arcs":[[29,-768]],"id":626},{"type":"Polygon","arcs":[[53]],"id":780},{"type":"Polygon","arcs":[[-693,385,945,387,-826]],"id":788},{"type":"MultiPolygon","arcs":[[[399,-735,-529,-782,-787,-943,394,946,947,397,948]],[[949,-748,-565,405]]],"id":792},{"type":"Polygon","arcs":[[72]],"id":158},{"type":"Polygon","arcs":[[-8
04,343,-855,-867,950,-663,951,-661,-547,-924,952]],"id":834},{"type":"Polygon","arcs":[[-925,-659,-934,-805,-953]],"id":800},{"type":"Polygon","arcs":[[-912,402,-900,-839,-899,-764,-941,-890,-575]],"id":804},{"type":"Polygon","arcs":[[-590,165,-522]],"id":858},{"type":"MultiPolygon","arcs":[[[65]],[[66]],[[67]],[[68]],[[69]],[[118,953,120,954,122,955,124,956,126,957,128,958,130,959,132,960,134,961,136,962,138,963,140,964,142,-846,195,965,966,967,968,969,-611]],[[93]],[[95]],[[98]],[[-613,202,970,204,971,206,972,208,973,210,974,212,975,214]]],"id":840},{"type":"Polygon","arcs":[[-945,-800,-809,-944,-501]],"id":860},{"type":"Polygon","arcs":[[156,976,158,977,160,-753,-586,-670]],"id":862},{"type":"Polygon","arcs":[[282,-812,-821,-633]],"id":704},{"type":"MultiPolygon","arcs":[[[21]],[[22]]],"id":548},{"type":"Polygon","arcs":[[321,978,323,979,325,980,327,-929,-883,981]],"id":887},{"type":"Polygon","arcs":[[982,350,-870,-594,983,-860,-942,-858,348],[-830]],"id":710},{"type":"Polygon","
arcs":[[-866,-862,984,-596,-869,-506,-664,-951]],"id":894},{"type":"Polygon","arcs":[[-984,-597,-985,-861]],"id":716}]}},"arcs":[[[33289,2723],[-582,81],[-621,-35],[-348,197],[0,23],[-152,174],[625,-23],[599,-58],[207,243],[147,208],[288,-243],[-82,-301],[-81,-266]],[[5242,3530],[-364,208],[-163,209],[-11,35],[-180,162],[169,220],[517,-93],[277,-185],[212,-209],[76,-266],[-533,-81]],[[35977,2708],[-658,35],[-365,197],[49,243],[593,162],[239,197],[174,254],[126,220],[168,209],[180,243],[141,0],[414,127],[419,-127],[342,-255],[120,-359],[33,-254],[11,-301],[-430,-186],[-452,-150],[-522,-139],[-582,-116]],[[16602,6806],[-386,47],[-278,208],[60,197],[332,-104],[359,-93],[332,104],[-158,-208],[-261,-151]],[[15547,6934],[-164,23],[-359,58],[-381,162],[202,127],[277,-139],[425,-231]],[[23277,7733],[-217,46],[-337,-23],[-343,23],[-376,-35],[-283,116],[-146,243],[174,104],[353,-81],[403,-46],[305,-81],[304,69],[163,-335]],[[30256,7743],[-364,11],[136,232],[-327,-81],[-310,-81],[-212,174],[-1
6,243],[305,231],[190,70],[321,-23],[82,301],[16,219],[-6,475],[158,278],[256,93],[147,-220],[65,-220],[120,-267],[92,-254],[76,-267],[33,-266],[-49,-231],[-76,-220],[-326,-81],[-311,-116]],[[794,704],[78,49],[94,61],[81,52],[41,26]],[[1088,892],[41,-1],[29,-10]],[[1158,881],[402,-246],[352,246],[63,34],[816,104],[265,-138],[130,-71],[419,-196],[789,-151],[625,-185],[1072,-139],[800,162],[1181,-116],[669,-185],[734,174],[773,162],[60,278],[-1094,23],[-898,139],[-234,231],[-745,128],[49,266],[103,243],[104,220],[-55,243],[-462,162],[-212,209],[-430,185],[675,-35],[642,93],[402,-197],[495,173],[457,220],[223,197],[-98,243],[-359,162],[-408,174],[-571,35],[-500,81],[-539,58],[-180,220],[-359,185],[-217,208],[-87,672],[136,-58],[250,-185],[457,58],[441,81],[228,-255],[441,58],[370,127],[348,162],[315,197],[419,58],[-11,220],[-97,220],[81,208],[359,104],[163,-196],[425,115],[321,151],[397,12],[375,57],[376,139],[299,128],[337,127],[218,-35],[190,-46],[414,81],[370,-104],[381,11],[364,81]
,[375,-57],[414,-58],[386,23],[403,-12],[413,-11],[381,23],[283,174],[337,92],[349,-127],[331,104],[300,208],[179,-185],[98,-208],[180,-197],[288,174],[332,-220],[375,-70],[321,-162],[392,35],[354,104],[418,-23],[376,-81],[381,-104],[147,254],[-180,197],[-136,209],[-359,46],[-158,220],[-60,220],[-98,440],[213,-81],[364,-35],[359,35],[327,-93],[283,-174],[119,-208],[376,-35],[359,81],[381,116],[342,70],[283,-139],[370,46],[239,451],[224,-266],[321,-104],[348,58],[228,-232],[365,-23],[337,-69],[332,-128],[218,220],[108,209],[278,-232],[381,58],[283,-127],[190,-197],[370,58],[288,127],[283,151],[337,81],[392,69],[354,81],[272,127],[163,186],[65,254],[-32,244],[-87,231],[-98,232],[-87,231],[-71,209],[-16,231],[27,232],[130,220],[109,243],[44,231],[-55,255],[-32,232],[136,266],[152,173],[180,220],[190,186],[223,173],[109,255],[152,162],[174,151],[267,34],[174,186],[196,115],[228,70],[202,150],[157,186],[218,69],[163,-151],[-103,-196],[-283,-174],[-120,-127],[-206,92],[-229,-58],[-190,-13
9],[-202,-150],[-136,-174],[-38,-231],[17,-220],[130,-197],[-190,-139],[-261,-46],[-153,-197],[-163,-185],[-174,-255],[-44,-220],[98,-243],[147,-185],[229,-139],[212,-185],[114,-232],[60,-220],[82,-232],[130,-196],[82,-220],[38,-544],[81,-220],[22,-232],[87,-231],[-38,-313],[-152,-243],[-163,-197],[-370,-81],[-125,-208],[-169,-197],[-419,-220],[-370,-93],[-348,-127],[-376,-128],[-223,-243],[-446,-23],[-489,23],[-441,-46],[-468,0],[87,-232],[424,-104],[311,-162],[174,-208],[-310,-185],[-479,58],[-397,-151],[-17,-243],[-11,-232],[327,-196],[60,-220],[353,-220],[588,-93],[500,-162],[398,-185],[506,-186],[690,-92],[681,-162],[473,-174],[517,-197],[272,-278],[136,-220],[337,209],[457,173],[484,186],[577,150],[495,162],[691,12],[680,-81],[560,-139],[180,255],[386,173],[702,12],[550,127],[522,128],[577,81],[614,104],[430,150],[-196,209],[-119,208],[0,220],[-539,-23],[-571,-93],[-544,0],[-77,220],[39,440],[125,128],[397,138],[468,139],[337,174],[337,174],[251,231],[380,104],[376,81],[190,47
],[430,23],[408,81],[343,116],[337,139],[305,139],[386,185],[245,197],[261,173],[82,232],[-294,139],[98,243],[185,185],[288,116],[305,139],[283,185],[217,232],[136,277],[202,163],[331,-35],[136,-197],[332,-23],[11,220],[142,231],[299,-58],[71,-220],[331,-34],[360,104],[348,69],[315,-34],[120,-243],[305,196],[283,105],[315,81],[310,81],[283,139],[310,92],[240,128],[168,208],[207,-151],[288,81],[202,-277],[157,-209],[316,116],[125,232],[283,162],[365,-35],[108,-220],[229,220],[299,69],[326,23],[294,-11],[310,-70],[300,-34],[130,-197],[180,-174],[304,104],[327,24],[315,0],[310,11],[278,81],[294,70],[245,162],[261,104],[283,58],[212,162],[152,324],[158,197],[288,-93],[109,-208],[239,-139],[289,46],[196,-208],[206,-151],[283,139],[98,255],[250,104],[289,197],[272,81],[326,116],[218,127],[228,139],[218,127],[261,-69],[250,208],[180,162],[261,-11],[229,139],[54,208],[234,162],[228,116],[278,93],[256,46],[244,-35],[262,-58],[223,-162],[27,-254],[245,-197],[168,-162],[332,-70],[185,-162],[22
9,-162],[266,-35],[223,116],[240,243],[261,-127],[272,-70],[261,-69],[272,-46],[277,0],[229,-614],[-11,-150],[-33,-267],[-266,-150],[-218,-220],[38,-232],[310,12],[-38,-232],[-141,-220],[-131,-243],[212,-185],[321,-58],[321,104],[153,232],[92,220],[153,185],[174,174],[70,208],[147,289],[174,58],[316,24],[277,69],[283,93],[136,231],[82,220],[190,220],[272,151],[234,115],[153,197],[157,104],[202,93],[277,-58],[250,58],[272,69],[305,-34],[201,162],[142,393],[103,-162],[131,-278],[234,-115],[266,-47],[267,70],[283,-46],[261,-12],[174,58],[234,-35],[212,-127],[250,81],[300,0],[255,81],[289,-81],[185,197],[141,196],[191,163],[348,439],[179,-81],[212,-162],[185,-208],[354,-359],[272,-12],[256,0],[299,70],[299,81],[229,162],[190,174],[310,23],[207,127],[218,-116],[141,-185],[196,-185],[305,23],[190,-150],[332,-151],[348,-58],[288,47],[218,185],[185,185],[250,46],[251,-81],[288,-58],[261,93],[250,0],[245,-58],[256,-58],[250,104],[299,93],[283,23],[316,0],[255,58],[251,46],[76,290],[11,243],[
174,-162],[49,-266],[92,-244],[115,-196],[234,-105],[315,35],[365,12],[250,35],[364,0],[262,11],[364,-23],[310,-46],[196,-186],[-54,-220],[179,-173],[299,-139],[310,-151],[360,-104],[375,-92],[283,-93],[315,-12],[180,197],[245,-162],[212,-185],[245,-139],[337,-58],[321,-69],[136,-232],[316,-139],[212,-208],[310,-93],[321,12],[299,-35],[332,12],[332,-47],[310,-81],[288,-139],[289,-116],[195,-173],[-32,-232],[-147,-208],[-125,-266],[-98,-209],[-131,-243],[-364,-93],[-163,-208],[-360,-127],[-125,-232],[-190,-220],[-201,-185],[-115,-243],[-70,-220],[-28,-266],[6,-220],[158,-232],[60,-220],[130,-208],[517,-81],[109,-255],[-501,-93],[-424,-127],[-528,-23],[-234,-336],[-49,-278],[-119,-220],[-147,-220],[370,-196],[141,-244],[239,-219],[338,-197],[386,-186],[419,-185],[636,-185],[142,-289],[800,-128],[53,-45],[208,-175],[767,151],[636,-186],[-99504,-147],[245,344],[501,-185],[32,21]],[[31400,18145],[-92,-239],[-238,-183],[-301,67],[-202,177],[-291,86],[-350,330],[-283,317],[-383,662],[229,-
124],[390,-395],[369,-212],[143,271],[90,405],[256,244],[198,-70]],[[30935,19481],[106,-274],[139,-443],[361,-355],[389,-147],[-125,-296],[-264,-29],[-141,208]],[[33139,19680],[-139,266],[333,354],[236,-148],[167,237],[222,-266],[-83,-207],[-375,-177],[-125,207],[-236,-266]],[[69095,21172],[-7,314],[41,244],[19,121],[179,-186],[263,-74],[9,-112],[-77,-269],[-427,-38]],[[90796,24799],[-57,32],[-171,19],[-171,505],[-38,390],[-160,515],[7,271],[181,-52],[269,-204],[151,81],[217,113],[166,-39],[20,-702],[-95,-203],[-29,-476],[-97,162],[-193,-412]],[[97036,23023],[-256,13],[-180,194],[-302,42],[-46,217],[149,438],[349,583],[179,111],[200,225],[238,310],[167,306],[123,441],[106,149],[41,330],[195,273],[61,-251],[63,-244],[198,239],[80,-249],[0,-249],[-103,-274],[-182,-435],[-142,-238],[103,-284],[-214,-7],[-238,-223],[-75,-387],[-157,-597],[-219,-264],[-138,-169]],[[98677,25949],[-48,155],[-116,85],[160,486],[-91,326],[-299,236],[8,214],[201,206],[47,455],[-13,382],[-113,396],[8,104],[-13
3,244],[-218,523],[-117,418],[104,46],[151,-328],[216,-153],[78,-526],[202,-622],[5,403],[126,-161],[41,-447],[224,-192],[188,-48],[158,226],[141,-69],[-67,-524],[-85,-345],[-212,12],[-74,-179],[26,-254],[-41,-110],[-105,-319],[-138,-404],[-214,-236]],[[96316,37345],[-153,160],[-199,266],[-179,313],[-184,416],[-38,201],[119,-9],[156,-201],[122,-200],[89,-166],[228,-366],[144,-272],[-105,-142]],[[99425,39775],[-153,73],[-27,260],[107,203],[126,-74],[69,98],[96,-171],[-46,-308],[-172,-81]],[[99645,40529],[-36,220],[139,121],[88,33],[163,184],[0,-289],[-177,-145],[-177,-124]],[[0,40798],[0,289],[57,27],[-34,-284],[-23,-32]],[[96531,40773],[-93,259],[10,158],[175,-339],[-92,-78]],[[96463,41280],[-75,74],[-58,-32],[-39,163],[-6,453],[133,-182],[45,-476]],[[62613,35454],[-160,151],[-220,211],[-77,312],[-18,524],[-98,471],[-26,425],[50,426],[128,102],[1,197],[133,447],[25,377],[-65,280],[-52,372],[-23,544],[97,331],[38,375],[138,22],[155,121],[103,107],[122,7],[158,337],[229,364],[83,297],
[-38,253],[118,-71],[153,410],[6,356],[92,264],[96,-254],[74,-251],[69,-390],[45,-711],[72,-276],[-28,-284],[-49,-174],[-94,347],[-53,-175],[53,-438],[-24,-250],[-77,-137],[-18,-500],[-109,-689],[-137,-814],[-172,-1120],[-106,-821],[-125,-685],[-226,-140],[-243,-250]],[[90643,27516],[-230,262],[-170,104],[43,308],[-152,-112],[-243,-428],[-240,160],[-158,94],[-159,42],[-269,171],[-179,364],[-52,449],[-64,298],[-137,240],[-267,71],[91,287],[-67,438],[-136,-408],[-247,-109],[146,327],[42,341],[107,289],[-22,438],[-226,-504],[-174,-202],[-106,-470],[-217,243],[9,313],[-174,429],[-147,221],[52,137],[-356,358],[-195,17],[-267,287],[-498,-56],[-359,-211],[-317,-197],[-265,39],[-294,-303],[-241,-137],[-53,-309],[-103,-240],[-236,-15],[-174,-52],[-246,107],[-199,-64],[-191,-27],[-165,-315],[-81,26],[-140,-167],[-133,-187],[-203,23],[-186,0],[-295,377],[-149,113],[6,338],[138,81],[47,134],[-10,212],[34,411],[-31,350],[-147,598],[-45,337],[12,336],[-111,385],[-7,174],[-123,235],[-35,463],[-158
,467],[-39,252],[122,-255],[-93,548],[137,-171],[83,-229],[-5,303],[-138,465],[-26,186],[-65,177],[31,341],[56,146],[38,295],[-29,346],[114,425],[21,-450],[118,406],[225,198],[136,252],[212,217],[126,46],[77,-73],[219,220],[168,66],[42,129],[74,54],[153,-14],[292,173],[151,262],[71,316],[163,300],[13,236],[7,321],[194,502],[117,-510],[119,118],[-99,279],[87,287],[122,-128],[34,449],[152,291],[67,233],[140,101],[4,165],[122,-69],[5,148],[122,85],[134,80],[205,-271],[155,-350],[173,-4],[177,-56],[-59,325],[133,473],[126,155],[-44,147],[121,338],[168,208],[142,-70],[234,111],[-5,302],[-204,195],[148,86],[184,-147],[148,-242],[234,-151],[79,60],[172,-182],[162,169],[105,-51],[65,113],[127,-292],[-74,-316],[-105,-239],[-96,-20],[32,-236],[-81,-295],[-99,-291],[20,-166],[221,-327],[214,-189],[143,-204],[201,-350],[78,1],[145,-151],[43,-183],[265,-200],[183,202],[55,317],[56,262],[34,324],[85,470],[-39,286],[20,171],[-32,339],[37,445],[53,120],[-43,197],[67,313],[52,325],[7,168],[104,222],
[78,-289],[19,-371],[70,-71],[11,-249],[101,-300],[21,-335],[-10,-214],[100,-464],[179,223],[92,-250],[133,-231],[-29,-262],[60,-506],[42,-295],[70,-72],[75,-505],[-27,-307],[90,-400],[301,-309],[197,-281],[186,-257],[-37,-143],[159,-371],[108,-639],[111,130],[113,-256],[68,91],[48,-626],[197,-363],[129,-226],[217,-478],[78,-475],[7,-337],[-19,-365],[132,-502],[-16,-523],[-48,-274],[-75,-527],[6,-339],[-55,-423],[-123,-538],[-205,-290],[-102,-458],[-93,-292],[-82,-510],[-107,-294],[-70,-442],[-36,-407],[14,-187],[-159,-205],[-311,-22],[-257,-242],[-127,-229],[-168,-254]],[[95110,44183],[-194,4],[-106,363],[166,-142],[56,-22],[78,-203]],[[83414,44519],[-368,414],[259,116],[146,-180],[97,-180],[-17,-159],[-117,-11]],[[94572,44733],[-170,60],[-58,91],[17,235],[183,-93],[91,-124],[45,-155],[-108,-14]],[[94868,44799],[-206,512],[-57,353],[94,0],[100,-473],[111,-283],[-42,-109]],[[84713,45326],[32,139],[239,133],[194,20],[87,74],[105,-74],[-102,-160],[-289,-258],[-233,-170]],[[84746,45030
],[-181,-441],[-238,-130],[-33,71],[25,201],[119,360],[275,235]],[[82576,45238],[-149,5],[95,340],[153,5],[74,209],[100,-158],[172,48],[69,-251],[-321,-119],[-193,-79]],[[83681,45301],[-370,73],[0,216],[220,123],[174,-177],[185,45],[249,216],[-41,-328],[-417,-168]],[[94421,45535],[-218,251],[-152,212],[-104,197],[41,60],[128,-142],[228,-272],[65,-187],[12,-119]],[[93704,46205],[-121,134],[-114,243],[14,99],[166,-250],[111,-193],[-56,-33]],[[81823,45409],[-306,238],[-251,-16],[-288,44],[-260,106],[-322,225],[-204,59],[-116,-74],[-506,243],[-48,254],[-255,44],[191,564],[337,-35],[224,-231],[115,-45],[38,-210],[533,-59],[61,244],[515,-284],[101,-383],[417,-108],[341,-351],[-317,-225]],[[87280,46506],[-27,445],[49,212],[58,200],[63,-173],[0,-282],[-143,-402]],[[93221,46491],[-120,227],[-122,375],[-59,450],[38,57],[30,-175],[84,-134],[135,-375],[131,-200],[-39,-166],[-78,-59]],[[91733,46847],[-148,1],[-228,171],[-158,165],[23,183],[249,-86],[152,46],[42,283],[40,15],[27,-314],[158,45],[7
8,202],[155,211],[-30,348],[166,11],[56,-97],[-5,-327],[-93,-361],[-146,-48],[-44,-166],[-152,-144],[-142,-138]],[[85242,48340],[-192,108],[-54,254],[281,29],[69,-195],[-104,-196]],[[86342,48300],[-234,244],[-232,49],[-157,-39],[-192,21],[65,325],[344,24],[305,-172],[101,-452]],[[92451,47764],[-52,348],[-65,229],[-126,193],[-158,252],[-200,174],[77,143],[150,-166],[94,-130],[117,-142],[111,-248],[106,-189],[33,-307],[-87,-157]],[[89166,49043],[482,-407],[513,-338],[192,-302],[154,-297],[43,-349],[462,-365],[68,-313],[-256,-64],[62,-393],[248,-388],[180,-627],[159,20],[-11,-262],[215,-100],[-84,-111],[295,-249],[-30,-171],[-184,-41],[-69,153],[-238,66],[-281,89],[-216,377],[-158,325],[-144,517],[-362,259],[-235,-169],[-170,-195],[35,-436],[-218,-203],[-155,99],[-288,25]],[[89175,45193],[-247,485],[-282,118],[-69,-168],[-352,-18],[118,481],[175,164],[-72,642],[-134,496],[-538,500],[-229,50],[-417,546],[-82,-287],[-107,-52],[-63,216],[-1,257],[-212,290],[299,213],[198,-11],[-23,156],[-
407,1],[-110,352],[-248,109],[-117,293],[374,143],[142,192],[446,-242],[44,-220],[78,-955],[287,-354],[232,627],[319,356],[247,1],[238,-206],[206,-212],[298,-113]],[[83276,47228],[-119,173],[79,544],[-43,570],[-117,4],[-86,405],[115,387],[40,469],[139,891],[58,243],[237,439],[217,-174],[350,-82],[319,25],[275,429],[48,-132],[-223,-587],[-209,-113],[-267,115],[-463,-29],[-243,-85],[-39,-447],[248,-526],[150,268],[518,201],[-22,-272],[-121,86],[-121,-347],[-245,-229],[263,-757],[-50,-203],[249,-682],[-2,-388],[-148,-173],[-109,207],[134,484],[-273,-229],[-69,164],[36,228],[-200,346],[21,576],[-186,-179],[24,-689],[11,-846],[-176,-85]],[[85582,50048],[-112,374],[-82,755],[56,472],[92,215],[20,-322],[164,-52],[26,-241],[-15,-517],[-143,58],[-42,-359],[114,-312],[-78,-71]],[[79085,47110],[-234,494],[-356,482],[-119,358],[-210,481],[-138,443],[-212,827],[-244,493],[-81,508],[-103,461],[-250,372],[-145,506],[-209,330],[-290,652],[-24,300],[178,-24],[430,-114],[246,-577],[215,-401],[153,-24
6],[263,-635],[283,-9],[233,-405],[161,-495],[211,-270],[-111,-482],[159,-205],[100,-15],[47,-412],[97,-330],[204,-52],[135,-374],[-70,-735],[-11,-914],[-308,-12]],[[80461,51765],[204,-202],[214,110],[56,500],[119,112],[333,128],[199,467],[137,374]],[[81723,53254],[110,221],[236,323]],[[82069,53798],[214,411],[140,462],[112,2],[143,-299],[13,-257],[183,-165],[231,-177],[-20,-232],[-186,-29],[50,-289],[-205,-201]],[[82744,53024],[-158,-533],[204,-560],[-48,-272],[312,-546],[-329,-70],[-93,-403],[12,-535],[-267,-404],[-7,-589],[-107,-903],[-41,210],[-316,-266],[-110,361],[-198,34],[-139,189],[-330,-212],[-101,285],[-182,-32],[-229,68],[-43,793],[-138,164],[-134,505],[-38,517],[32,548],[165,392]],[[84832,53877],[-327,343],[-78,428],[84,280],[-176,280],[-87,-245],[-131,23],[-205,-330],[-46,173],[109,498],[175,166],[151,223],[98,-268],[212,162],[45,264],[196,15],[-16,457],[225,-280],[23,-297],[20,-218],[28,-392],[16,-332],[-94,-540],[-102,602],[-130,-300],[89,-435],[-79,-277]],[[72318,54
106],[-132,470],[-49,849],[126,959],[192,-328],[129,-416],[134,-616],[-42,-615],[-116,-168],[-242,-135]],[[32841,56488],[-50,53],[81,163],[-6,233],[160,77],[58,-21],[-11,-440],[-232,-65]],[[84165,55910],[-171,409],[57,158],[70,165],[30,367],[153,35],[-44,-398],[205,570],[-26,-563],[-100,-195],[-87,-373],[-87,-175]],[[82548,55523],[136,414],[200,364],[167,409],[146,587],[49,-482],[-183,-325],[-146,-406],[-369,-561]],[[83889,56748],[-10,275],[20,301],[-43,282],[166,-183],[177,1],[-5,-247],[-129,-251],[-176,-178]],[[84666,56567],[-11,416],[-84,31],[-43,357],[163,-47],[-4,224],[-169,451],[266,-13],[77,-220],[78,-660],[-214,157],[5,-199],[68,-364],[-132,-133]],[[83683,57791],[-119,295],[-142,450],[238,-22],[97,-213],[-74,-510]],[[84465,57987],[-216,290],[-103,310],[-71,-217],[-177,354],[-253,-87],[-138,130],[14,244],[87,151],[-83,136],[-36,-213],[-137,340],[-41,257],[-11,566],[112,-195],[29,925],[90,535],[169,-1],[171,-168],[85,153],[26,-150],[-46,-245],[95,-423],[-73,-491],[-164,-196],[
-43,-476],[62,-471],[147,-65],[123,70],[347,-328],[-27,-321],[91,-142],[-29,-272]],[[31337,61183],[-16,253],[40,86],[227,-3],[142,-52],[50,-118],[-71,-149],[-209,4],[-163,-21]],[[28554,61038],[-156,95],[-159,215],[34,135],[116,41],[64,-20],[187,-53],[147,-142],[46,-161],[-195,-11],[-84,-99]],[[30080,62227],[34,101],[217,-3],[165,-152],[73,15],[50,-209],[152,11],[-9,-176],[124,-21],[136,-217],[-103,-240],[-132,128],[-127,-25],[-92,28],[-50,-107],[-106,-37],[-43,144],[-92,-85],[-111,-405],[-71,94],[-14,170]],[[30081,61241],[-185,100],[-131,-41],[-169,43],[-130,-110],[-149,184],[24,190],[256,-82],[210,-47],[100,131],[-127,256],[2,226],[-175,92],[62,163],[170,-26],[241,-93]],[[80409,61331],[-228,183],[-8,509],[137,267],[304,166],[159,-14],[62,-226],[-122,-260],[-64,-341],[-240,-284]],[[6753,61756],[-69,84],[8,165],[-46,216],[14,65],[48,97],[-19,116],[16,55],[21,-11],[107,-100],[49,-51],[45,-79],[71,-207],[-7,-33],[-108,-126],[-89,-92],[-41,-99]],[[6551,62734],[-47,125],[-32,48],[-3,37],
[27,50],[99,-56],[73,-90],[-23,-71],[-94,-43]],[[6447,63028],[-149,17],[21,72],[137,-26],[-9,-63]],[[6192,63143],[-19,8],[-97,21],[-35,133],[-11,24],[74,82],[23,-38],[80,-196],[-15,-34]],[[5704,63509],[-93,107],[14,43],[43,58],[64,-12],[5,-138],[-33,-58]],[[28401,62311],[186,329],[-113,154],[-179,39],[-96,171],[-66,336],[-157,-23],[-259,159],[-83,124],[-362,91],[-97,115],[104,148],[-273,30],[-199,-307],[-115,-8],[-40,-144],[-138,-65],[-118,56],[146,183],[60,213],[126,131],[142,116],[210,56],[67,65],[240,-42],[219,-7],[261,-201],[110,-216],[260,66],[98,-138],[235,-366],[173,-267],[92,8],[165,-120],[-20,-167],[205,-24],[210,-242],[-33,-138],[-185,-75],[-187,-29],[-191,46],[-398,-57]],[[28394,64588],[-70,340],[-104,171],[60,375],[84,-23],[97,-491],[1,-343],[-68,-29]],[[83540,63560],[-146,499],[-32,438],[163,581],[223,447],[127,-176],[-49,-357],[-167,-947],[-119,-485]],[[28080,66189],[-19,219],[130,47],[184,-18],[8,-153],[-303,-95]],[[28563,65870],[-51,75],[4,309],[-124,234],[-1,67],[22
0,-265],[-48,-420]],[[86948,69902],[-181,168],[2,281],[154,352],[158,-68],[114,248],[204,-127],[35,-203],[-156,-357],[-114,189],[-143,-137],[-73,-346]],[[59437,71293],[8,-48],[-285,-240],[-136,77],[-64,237],[132,22]],[[59092,71341],[19,3],[40,143],[200,-8],[253,176],[-188,-251],[21,-111]],[[56867,71211],[3,98],[-339,115],[52,251],[152,-199],[216,34],[207,-42],[-7,-103],[151,71],[-35,-175],[-400,-50]],[[54194,72216],[-213,222],[-141,64],[-387,300],[38,304],[325,-54],[284,64],[211,51],[-100,-465],[41,-183],[-58,-303]],[[52446,73567],[-105,156],[-11,713],[-64,338],[153,-30],[139,183],[166,-419],[-39,-782],[-126,38],[-113,-197]],[[86301,68913],[-135,229],[69,533],[-176,172],[-113,405],[263,182],[145,371],[280,306],[203,403],[553,177],[297,-121],[291,1050],[185,-282],[408,591],[158,229],[174,723],[-47,664],[117,374],[295,108],[152,-819],[-9,-479],[-256,-595],[4,-610],[-104,-472],[48,-296],[-145,-416],[-355,-278],[-488,-36],[-396,-675],[-186,227],[-12,442],[-483,-130],[-329,-279],[-325,-1
1],[282,-435],[-186,-1004],[-179,-248]],[[52563,75028],[-126,120],[-64,398],[56,219],[179,226],[47,-507],[-92,-456]],[[88876,75140],[-39,587],[138,455],[296,33],[81,817],[83,460],[326,-615],[213,-198],[195,-126],[197,250],[62,-663],[-412,-162],[-244,-587],[-436,404],[-152,-646],[-308,-9]],[[32535,77739],[-353,250],[-69,198],[105,183],[97,-288],[202,-79],[257,16],[-137,-242],[-102,-38]],[[32696,79581],[-360,186],[-258,279],[96,49],[365,-148],[284,-247],[8,-108],[-135,-11]],[[15552,79158],[-456,269],[-84,209],[-248,207],[-50,168],[-286,107],[-107,321],[24,137],[291,-129],[171,-89],[261,-63],[94,-204],[138,-280],[277,-244],[115,-327],[-140,-82]],[[35133,78123],[-183,111],[60,484],[-77,75],[-322,-513],[-166,21],[196,277],[-267,144],[-298,-35],[-539,18],[-43,175],[173,208],[-121,160],[234,356],[287,941],[172,336],[241,204],[129,-26],[-54,-160],[-148,-372],[-184,-517],[181,199],[187,-126],[-98,-206],[247,-162],[128,144],[277,-182],[-86,-433],[194,101],[36,-313],[86,-367],[-117,-520],[-125
,-22]],[[13561,81409],[-111,1],[-167,270],[-103,272],[-140,184],[-51,260],[16,188],[131,-76],[267,47],[-84,-671],[242,-475]],[[89469,77738],[-51,496],[31,575],[-32,638],[64,446],[13,790],[-163,581],[24,808],[257,271],[-110,274],[123,83],[73,-391],[96,-569],[-7,-581],[114,-597],[280,-1046],[-411,195],[-171,-854],[271,-605],[-8,-413],[-211,356],[-182,-457]],[[47896,83153],[233,24],[298,-365],[-149,-406]],[[48278,82406],[46,-422],[-210,-528],[-493,-349],[-393,89],[225,617],[-145,601],[378,463],[210,276]],[[53358,82957],[-291,333],[-39,246],[408,195],[88,-296],[-166,-478]],[[7221,84100],[-142,152],[-43,277],[252,210],[148,90],[185,-40],[117,-183],[-240,-281],[-277,-225]],[[48543,80097],[-148,118],[407,621],[249,127],[-436,99],[-79,235],[291,183],[-152,319],[52,387],[414,-54],[40,343],[-190,372],[-337,104],[-66,160],[101,264],[-92,163],[-149,-279],[-17,569],[-140,301],[101,611],[216,480],[222,-47],[335,49],[-297,-639],[283,81],[304,-3],[-72,-481],[-250,-530],[287,-38],[270,-759],[190,-95
],[171,-673],[79,-233],[337,-113],[-34,-378],[-142,-173],[111,-305],[-250,-310],[-371,6],[-473,-163],[-130,116],[-183,-276],[-257,67],[-195,-226]],[[3835,85884],[-182,110],[-168,161],[274,101],[220,-54],[27,-226],[-171,-92]],[[27873,86994],[-123,50],[-73,176],[13,41],[107,177],[114,-13],[70,-121],[-108,-310]],[[26925,87305],[-196,13],[-61,160],[207,273],[381,-6],[-6,-114],[-325,-326]],[[2908,87788],[-211,128],[-106,107],[-245,-34],[-66,52],[17,223],[171,-113],[173,61],[225,-156],[276,-79],[-23,-64],[-211,-125]],[[26243,87832],[-95,346],[-377,-57],[242,292],[35,465],[95,542],[201,-49],[51,-259],[143,91],[161,-155],[304,-203],[318,-184],[25,-281],[204,46],[199,-196],[-247,-186],[-432,142],[-156,266],[-275,-314],[-396,-306]],[[44817,88095],[-365,87],[-775,187],[273,261],[-605,289],[492,114],[-12,174],[-583,137],[188,385],[421,87],[433,-400],[422,321],[349,-167],[453,315],[461,-42],[-64,-382],[314,-403],[-361,-451],[-801,-405],[-240,-107]],[[28614,90223],[-69,289],[118,331],[255,82],[21
7,-163],[3,-253],[-32,-82],[-180,-174],[-312,-30]],[[1957,88542],[-260,17],[-212,206],[-369,172],[-62,257],[-283,96],[-315,-76],[-151,207],[60,219],[-333,-140],[126,-278],[-158,-251],[0,2354],[681,-451],[728,-588],[-24,-367],[187,-147],[-64,429],[754,-88],[544,-553],[-276,-257],[-455,-61],[-7,-578],[-111,-122]],[[23258,91203],[-374,179],[-226,-65],[-380,266],[245,183],[194,256],[295,-168],[166,-106],[84,-112],[169,-226],[-173,-207]],[[99694,92399],[-49,187],[354,247],[0,-404],[-305,-30]],[[0,92429],[0,404],[36,24],[235,-1],[402,-169],[-24,-81],[-286,-141],[-363,-36]],[[26228,91219],[16,648],[394,-45]],[[26638,91822],[411,-87],[373,-293],[17,-293],[-207,-315],[196,-316],[-36,-288],[-544,-413],[-386,-91],[-287,178],[-83,-297],[-268,-498]],[[25824,89109],[-81,-258],[-322,-400]],[[25421,88451],[-397,-39],[-220,-250],[-18,-384],[-323,-74],[-340,-479],[-301,-665],[-108,-466]],[[23714,86094],[-15,-686],[408,-99]],[[24107,85309],[125,-553],[130,-448],[388,117],[517,-256],[277,-225],[199,-27
9]],[[25743,83665],[348,-162],[294,-249]],[[26385,83254],[459,-34],[302,-58],[-45,-511],[86,-594],[201,-661],[414,-561],[214,192],[150,607],[-145,934],[-196,311],[445,276],[314,415],[154,411]],[[28738,83981],[-22,395],[-189,502]],[[28527,84878],[-338,445],[328,619],[-121,535],[-93,922],[194,137],[476,-161],[286,-57],[230,155],[258,-200],[342,-343],[85,-229],[495,-45],[-8,-496],[92,-747],[254,-92],[201,-348],[402,328],[266,652],[184,274],[216,-527],[362,-754],[307,-709],[-112,-371],[370,-333],[250,-338],[442,-152],[179,-189],[110,-500],[216,-78],[112,-223],[20,-664],[-202,-222],[-199,-207],[-458,-210],[-349,-486],[-470,-96],[-594,125],[-417,4],[-287,-41],[-233,-424],[-354,-262],[-401,-782],[-320,-545],[236,97],[446,776],[583,493]],[[31513,79609],[416,59],[245,-290]],[[32174,79378],[-262,-397],[88,-637],[91,-446],[361,-295],[459,86],[278,664],[19,-429],[180,-214],[-344,-387],[-615,-351],[-276,-239],[-310,-426],[-211,44],[-11,500],[483,488],[-445,-19],[-309,-72]],[[31350,77248],[48,-19
4],[-296,-286],[-286,-204],[-293,-175]],[[30523,76389],[-159,-386],[-35,-98]],[[30329,75905],[-3,-313],[92,-313],[115,-15],[-29,216],[83,-131],[-22,-169],[-188,-96]],[[30377,75084],[-133,12],[-205,-104]],[[30039,74992],[-121,-29],[-162,-29],[-231,-171],[408,111],[82,-112],[-389,-177],[-177,-1],[8,72],[-84,-164],[82,-27],[-60,-424],[-203,-455],[-20,152]],[[29172,73738],[-61,31],[-91,147]],[[29020,73916],[57,-318]],[[29077,73598],[66,-106],[8,-222]],[[29151,73270],[-89,-230],[-157,-472],[-25,24],[86,402]],[[28966,72994],[-142,226],[-33,490]],[[28791,73710],[-53,-255],[59,-375]],[[28797,73080],[-175,88],[183,-186]],[[28805,72982],[12,-562],[79,-41],[29,-204],[39,-591],[-176,-439],[-288,-175],[-182,-346],[-139,-38],[-141,-217],[-39,-199],[-305,-383],[-157,-281],[-131,-351],[-43,-419],[50,-411],[92,-505],[124,-418],[1,-256],[132,-685],[-9,-398],[-12,-230],[-69,-361]],[[27672,65472],[-83,-74],[-137,71]],[[27452,65469],[-44,259]],[[27408,65728],[-106,136],[-147,508]],[[27155,66372],[-129,4
52],[-42,231],[57,393],[-77,325],[-217,494]],[[26747,68267],[-108,91],[-281,-269]],[[26358,68089],[-49,30]],[[26309,68119],[-135,276],[-174,146]],[[26000,68541],[-314,-75],[-247,66],[-212,-41]],[[25227,68491],[-118,-83],[54,-166]],[[25163,68242],[-5,-240],[59,-117],[-53,-77],[-103,87],[-104,-112],[-202,18]],[[24755,67801],[-207,313],[-242,-74]],[[24306,68040],[-202,137],[-173,-42],[-234,-138],[-253,-438],[-276,-255],[-152,-282],[-63,-266],[-3,-407],[14,-284],[52,-201]],[[23016,65864],[1,-1],[-1,-1],[-107,-516]],[[22909,65346],[-49,-426],[-20,-791],[-27,-289],[48,-322],[86,-288],[56,-458],[184,-440],[65,-337],[109,-291],[295,-157],[114,-247],[244,165],[212,60],[208,106],[175,101],[176,241],[67,345],[22,496],[48,173],[188,155],[294,137],[246,-21],[169,50],[66,-125],[-9,-285],[-149,-351],[-66,-360],[51,-103],[-42,-255],[-69,-461],[-71,152],[-58,-10]],[[25472,61510],[1,-87],[53,-3],[-5,-160],[-45,-256],[24,-91],[-29,-212],[18,-56],[-32,-299],[-55,-156],[-50,-19],[-55,-205]],[[25297,5996
6],[90,-107],[24,88],[82,-75]],[[25493,59872],[29,-23],[61,104],[79,8],[26,-48],[43,29],[129,-53]],[[25860,59889],[128,16],[90,65]],[[26078,59970],[32,66],[89,-31],[66,-40],[73,14],[55,51],[127,-82],[44,-13],[85,-110],[80,-132],[101,-91],[73,-162]],[[26903,59440],[-24,-57],[-14,-132],[29,-216],[-64,-202],[-30,-237],[-9,-261],[15,-152],[7,-266],[-43,-58],[-26,-253],[19,-156],[-56,-151],[12,-159],[43,-97]],[[26762,57043],[70,-321],[108,-238],[130,-252]],[[27070,56232],[100,-212]],[[27170,56020],[-6,-125],[111,-27]],[[27275,55868],[26,48],[77,-145],[136,42],[119,150],[168,119],[95,176],[153,-34],[-10,-58],[155,-21],[124,-102],[90,-177],[105,-164]],[[28513,55702],[143,-18],[209,412],[114,63],[3,195],[51,500],[159,274],[175,11],[22,123],[218,-49],[218,298],[109,132],[134,285],[98,-36],[73,-156],[-54,-199]],[[30185,57537],[-8,-139],[-163,-69],[91,-268],[-3,-309]],[[30102,56752],[-123,-343],[105,-469]],[[30084,55940],[120,38],[62,427],[-86,208],[-14,447],[346,241],[-38,278],[97,186],[100,-
415],[195,-9],[180,-330],[11,-195],[249,-6],[297,61],[159,-264]],[[31762,56607],[213,-73],[155,184]],[[32130,56718],[4,149],[344,35],[333,9],[-236,-175],[95,-279],[222,-44],[210,-291],[45,-473],[144,13],[109,-139]],[[33400,55523],[183,-217],[171,-385],[8,-304],[105,-14],[149,-289],[109,-205]],[[34125,54109],[333,-119],[30,107],[225,43],[298,-159]],[[35011,53981],[95,-65],[204,-140],[294,-499],[46,-242]],[[35650,53035],[95,28],[69,-327],[155,-1033],[149,-97],[7,-408],[-208,-487],[86,-178],[491,-92],[10,-593],[211,388],[349,-212],[462,-361],[135,-346],[-45,-327],[323,182],[540,-313],[415,23],[411,-489],[355,-662],[214,-170],[237,-24],[101,-186],[94,-752],[46,-358],[-110,-977],[-142,-385],[-391,-822],[-177,-668],[-206,-513],[-69,-11],[-78,-435],[20,-1107],[-77,-910],[-30,-390],[-88,-233],[-49,-790],[-282,-771],[-47,-610],[-225,-256],[-65,-355],[-302,2],[-437,-227],[-195,-263],[-311,-173],[-327,-470],[-235,-586],[-41,-441],[46,-326],[-51,-597],[-63,-289],[-195,-325],[-308,-1040],[-244,-
468],[-189,-277],[-127,-562],[-183,-337]],[[35174,30629],[-121,-372],[-313,-328],[-205,118],[-151,-63],[-256,253],[-189,-19],[-169,327]],[[33770,30545],[-19,-308],[353,-506],[-38,-408],[173,-257],[-14,-289],[-267,-757],[-412,-317],[-557,-123],[-305,59],[59,-352],[-57,-442],[51,-298],[-167,-208],[-284,-82],[-267,216],[-108,-155],[39,-587],[188,-178],[152,186],[82,-307],[-255,-183],[-223,-367],[-41,-595],[-66,-316],[-262,-2],[-218,-302],[-80,-443]],[[31227,23224],[274,-433],[265,-119]],[[31766,22672],[-96,-531],[-328,-333],[-180,-692],[-254,-234],[-113,-276],[89,-614],[185,-342],[-117,30]],[[30952,19680],[-247,4],[-134,-145],[-250,-213],[-45,-552],[-118,-14],[-313,192],[-318,412],[-346,338],[-87,374],[79,346],[-140,393],[-36,1007],[119,568],[293,457],[-422,172],[265,522],[94,982],[309,-208],[145,1224],[-186,157],[-87,-738],[-175,83],[87,845],[95,1095],[127,404]],[[29661,27385],[-79,576],[-23,666]],[[29559,28627],[117,19],[170,954],[192,945],[118,881],[-64,885],[83,487],[-34,730],[163,
721],[50,1143],[89,1227],[87,1321],[-20,967],[-58,832]],[[30452,39739],[-279,340],[-24,242],[-551,593],[-498,646],[-214,365],[-115,488],[46,170],[-236,775],[-274,1090],[-262,1177],[-114,269],[-87,435],[-216,386],[-198,239],[90,264],[-134,563],[86,414],[221,373]],[[27693,48568],[148,442],[-60,258],[-106,-275],[-166,259],[56,167],[-47,536],[97,89],[52,368],[105,381],[-20,241],[153,126],[190,236]],[[28095,51396],[-37,183],[103,44],[-12,296],[65,214],[138,40],[117,371],[106,310],[-102,141],[52,343],[-62,540],[59,155],[-44,500],[-112,315]],[[28366,54848],[-93,170],[-59,319],[68,158],[-70,40]],[[28212,55535],[-52,195],[-138,165]],[[28022,55895],[-122,-38],[-56,-205],[-112,-149],[-61,-20],[-27,-123],[132,-321],[-75,-76],[-40,-87],[-130,-30],[-48,353],[-36,-101],[-92,35],[-56,238],[-114,39],[-72,69],[-119,-1],[-8,-128],[-32,89]],[[26954,55439],[-151,131],[-56,124],[32,103],[-11,130],[-77,142],[-109,116],[-95,76],[-19,173],[-73,105],[18,-172],[-55,-141],[-64,164],[-89,58],[-38,120],[2,179],[
36,187],[-78,83],[64,114]],[[26191,57131],[-96,186],[-130,238],[-61,200],[-117,185],[-140,267]],[[25647,58207],[31,92],[46,-89]],[[25724,58210],[21,41]],[[25745,58251],[-48,185]],[[25697,58436],[-84,52],[-31,-140]],[[25582,58348],[-161,9],[-100,57],[-115,117],[-154,37],[-79,127]],[[24973,58695],[-142,103],[-174,11],[-127,117],[-149,244]],[[24381,59170],[-314,636]],[[24067,59806],[-144,192],[-226,154]],[[23697,60152],[-156,-43],[-223,-223],[-140,-58],[-196,156],[-208,112],[-260,271],[-208,83],[-314,275],[-233,282],[-70,158],[-155,35],[-284,187],[-116,270],[-299,335],[-139,373],[-66,288],[93,57],[-29,169],[64,153],[1,204],[-93,266],[-25,235],[-94,298],[-244,587],[-280,462],[-135,368],[-238,241],[-51,145],[42,365]],[[19641,66203],[-142,137],[-164,288]],[[19335,66628],[-69,412],[-149,48],[-162,311],[-130,288],[-12,184],[-149,446],[-99,452],[5,227]],[[18570,68996],[-201,235],[-93,-26]],[[18276,69205],[-159,163],[-44,-240],[46,-284],[27,-444],[95,-243],[206,-407],[46,-139],[42,-42],[37,-2
03],[49,8],[56,-381],[85,-150],[59,-210],[174,-300],[92,-550],[83,-259],[77,-277],[15,-311],[134,-20],[112,-268],[100,-264],[-6,-106],[-117,-217],[-49,3],[-74,359]],[[19362,64423],[-182,337],[-200,286]],[[18980,65046],[-142,150],[9,432],[-42,320],[-132,183],[-191,264],[-37,-76],[-70,154],[-171,143],[-164,343],[20,44],[115,-33],[103,221],[10,266],[-214,422],[-163,163],[-102,369],[-103,388],[-129,472],[-113,531]],[[17464,69802],[-46,302],[-180,340],[-130,71],[-30,169],[-156,30],[-100,159],[-258,59]],[[16564,70932],[-70,95],[-34,324]],[[16460,71351],[-270,594],[-231,821],[10,137],[-123,195],[-215,495],[-38,482],[-148,323],[61,489],[-10,507],[-89,453],[109,557],[67,1072],[-50,792],[-88,506],[-80,274],[33,115],[402,-200],[148,-558]],[[15948,78405],[68,156],[-44,485],[-94,484]],[[15878,79530],[-38,1],[-537,581],[-199,255]],[[15104,80367],[-503,245],[-155,523],[40,362]],[[14486,81497],[-356,252],[-48,476],[-336,429],[-6,304]],[[13740,82958],[-153,223],[-245,188],[-78,515],[-358,478],[-150,
558],[-267,38],[-441,15],[-326,170],[-574,613],[-266,112],[-486,211]],[[10396,86079],[-385,-50],[-546,271]],[[9465,86300],[-330,252],[-309,-125],[58,-411],[-154,-38],[-321,-123],[-245,-199]],[[8164,85656],[-307,-126],[-40,348]],[[7817,85878],[125,580],[295,182],[-76,148],[-354,-329],[-190,-394],[-400,-420],[203,-287],[-262,-424]],[[7158,84934],[-299,-247],[-278,-181]],[[6581,84506],[-69,-261],[-434,-305],[-87,-278],[-325,-252],[-191,45],[-259,-165],[-282,-201],[-231,-197],[-477,-169],[-43,99],[304,276],[271,182],[296,324],[345,66],[137,243],[385,353],[62,119],[205,208],[48,448],[141,349],[-320,-179],[-90,102],[-150,-215],[-181,300],[-75,-212],[-104,294],[-278,-236],[-170,0],[-24,352]],[[4985,85596],[50,217],[-179,210]],[[4856,86023],[-361,-113],[-235,277],[-190,142],[-1,334],[-214,252],[108,340],[226,330],[99,303],[225,43],[191,-94],[224,285],[201,-51],[212,183],[-52,270],[-155,106],[205,228],[-170,-7],[-295,-128],[-85,-131],[-219,131],[-392,-67],[-407,142],[-117,238],[-351,343],[39
0,247],[620,289],[228,0]],[[4541,89915],[-38,-295],[586,22]],[[5089,89642],[-225,366]],[[4864,90008],[-342,226],[-197,295]],[[4325,90529],[-267,252],[-381,187],[155,309],[493,19],[350,270],[66,287],[284,281],[271,68],[526,262],[256,-40],[427,315],[421,-124],[201,-266],[123,114],[469,-35],[-16,-136],[425,-101],[283,59],[585,-186],[534,-56],[214,-77],[370,96],[421,-177],[302,-83]],[[10837,91767],[518,-142]],[[11355,91625],[438,-284],[289,-55]],[[12082,91286],[244,247],[336,184],[413,-72],[416,259],[455,148],[191,-245],[207,138],[62,278],[192,-63],[470,-530],[369,401]],[[15437,92031],[38,-448],[341,96]],[[15816,91679],[105,173],[337,-34],[424,-248],[650,-217],[383,-100],[272,38]],[[17987,91291],[375,-300],[-391,-293]],[[17971,90698],[502,-127],[750,70],[236,103],[296,-354],[302,299],[-283,251],[179,202],[338,27],[223,59],[224,-141],[279,-321],[310,47],[491,-266],[431,94],[405,-14],[-32,367],[247,103],[431,-200],[-2,-559],[177,471],[223,-16],[126,594],[-298,364],[-324,239],[22,653],[329
,429],[366,-95],[281,-261],[378,-666],[-247,-290],[517,-120],[-1,-604],[371,463],[332,-380],[-83,-438],[269,-399],[290,427],[202,510]],[[19722,91216],[-824,-103],[-374,-41]],[[18524,91072],[-151,279],[-379,161],[-246,-66],[-343,468],[185,62],[429,101],[392,-26],[362,103],[-537,138],[-594,-47],[-394,12],[-146,217],[644,237],[-428,-9],[-485,156],[233,443],[193,235],[744,359],[284,-114],[-139,-277],[618,179],[386,-298],[314,302],[254,-194],[227,-580],[140,244],[-197,606],[244,86],[276,-94],[311,-239],[175,-575],[86,-417],[466,-293],[502,-279],[-31,-260],[-456,-48],[178,-227],[-94,-217],[-503,93],[-478,160],[-322,-36],[-522,-201]],[[20728,93568],[-434,413],[95,83],[372,24],[211,-130],[-244,-390]],[[27920,93557],[-80,36],[-306,313],[12,213],[133,39],[636,-63],[479,-325],[25,-163],[-296,17],[-299,13],[-304,-80]],[[31620,87170],[-753,236],[-596,343],[-337,287],[97,167],[-414,304],[-405,286],[5,-171],[-803,-94],[-235,203],[183,435],[522,10],[571,76],[-92,211],[96,294],[360,576],[-77,261],[-
107,203],[-425,286],[-563,201],[178,150],[-294,367],[-245,34],[-219,201],[-149,-175],[-503,-76],[-1011,132],[-588,174],[-450,89],[-231,207],[290,270],[-394,2],[-88,599],[213,528],[286,241],[717,158],[-204,-382],[219,-369],[256,477],[704,242],[477,-611],[-42,-387],[550,172],[263,235],[616,-299],[383,-282],[36,-258],[515,134],[290,-376],[670,-234],[242,-238],[263,-553],[-510,-275],[654,-386],[441,-130],[400,-543],[437,-39],[-87,-414],[-487,-687],[-342,253],[-437,568],[-359,-74],[-35,-338],[292,-344],[377,-272],[114,-157],[181,-584],[-96,-425],[-350,160],[-697,473],[393,-509],[289,-357],[45,-206]],[[22678,92689],[-268,50],[-192,225],[-690,456],[5,189],[567,-73],[-306,386],[329,286],[331,-124],[496,75],[72,-172],[-259,-283],[420,-254],[-50,-532],[-455,-229]],[[89468,93831],[-569,66],[-49,31],[263,234],[348,54],[394,-226],[34,-155],[-421,-4]],[[23814,93133],[-317,22],[-173,519],[4,294],[145,251],[276,161],[579,-20],[530,-144],[-415,-526],[-331,-115],[-298,-442]],[[15808,92470],[-147,259]
,[-641,312]],[[15020,93041],[93,193],[218,489]],[[15331,93723],[241,388],[-272,362],[939,93],[397,-123],[709,-33],[270,-171],[298,-249],[-349,-149],[-681,-415],[-344,-414]],[[16539,93012],[0,-248],[-731,-294]],[[91548,94707],[-444,53],[-516,233],[66,192],[518,-89],[697,-155],[-321,-234]],[[23845,94650],[-403,44],[-337,155],[148,266],[399,159],[243,-208],[101,-187],[-151,-229]],[[88598,94662],[-550,384],[149,406],[366,111],[734,-26],[1004,-313],[-219,-439],[-1023,16],[-461,-139]],[[22275,94831],[-298,94],[5,345],[-455,-46],[-18,457],[299,-18],[419,201],[390,-34],[22,77],[212,-273],[9,-303],[-127,-440],[-458,-60]],[[18404,94533],[-35,193],[577,261],[-1255,-70],[-389,106],[379,577],[262,165],[782,-199],[493,-350],[485,-45],[-397,565],[255,215],[286,-68],[94,-282],[109,-210],[247,99],[291,-26],[49,-289],[-169,-281],[-940,-91],[-701,-256],[-423,-14]],[[65817,92311],[-907,77],[-74,262],[-503,158],[-40,320],[284,126],[-10,323],[551,503],[-255,73],[665,518],[-75,268],[621,312],[917,380],[92
5,110],[475,220],[541,76],[193,-233],[-187,-184],[-984,-293],[-848,-282],[-863,-562],[-414,-577],[-435,-568],[56,-491],[531,-484],[-164,-52]],[[25514,94532],[-449,73],[-738,190],[-96,325],[-34,293],[-279,258],[-574,72],[-322,183],[104,242],[573,-37],[308,-190],[547,1],[240,-194],[-64,-222],[319,-134],[177,-140],[374,-26],[406,-50],[441,128],[566,51],[451,-42],[298,-223],[62,-244],[-174,-157],[-414,-127],[-355,72],[-797,-91],[-570,-11]],[[16250,95423],[-377,128],[472,442],[570,383],[426,-9],[381,87],[-38,-454],[-214,-205],[-259,-29],[-517,-252],[-444,-91]],[[81143,94175],[250,112],[142,-379]],[[81535,93908],[122,153],[444,93],[892,-97],[67,-276],[1162,-88],[15,451]],[[84237,94144],[590,-103],[443,3]],[[85270,94044],[449,-312],[128,-378],[-165,-247],[349,-465],[437,-240],[268,620],[446,-266],[473,159],[538,-182],[204,166],[455,-83],[-201,549],[367,256],[2509,-384],[236,-351],[727,-451],[1122,112],[553,-98],[231,-244],[-33,-432],[342,-168],[372,121],[492,15],[525,-116],[526,66],[484,-5
26],[344,189],[-224,378]],[[97224,91732],[123,263],[886,-166]],[[98233,91829],[578,36],[799,-282],[389,-258],[0,-2354],[-2,-3],[-357,-260],[-360,44],[250,-315],[166,-487],[128,-159],[32,-244],[-71,-157],[-518,129],[-777,-445],[-247,-69],[-425,-415],[-403,-362],[-102,-269],[-397,409],[-724,-464]],[[96192,85904],[-126,220],[-268,-254]],[[95798,85870],[-371,81],[-90,-388],[-333,-572],[10,-239],[316,-132],[-37,-860],[-258,-22],[-119,-494],[116,-255]],[[95032,82989],[-486,-301],[-96,-675]],[[94450,82013],[-415,-144],[-83,-600],[-400,-551],[-103,407],[-119,862],[-155,1313],[134,819],[234,353]],[[93543,84472],[15,276],[431,132]],[[93989,84880],[496,744],[479,608],[499,471],[223,833],[-337,-50],[-167,-487]],[[95182,86999],[-705,-648],[-227,726]],[[94250,87077],[-717,-201],[-696,-990],[230,-362],[-620,-154],[-430,-61],[20,427],[-431,90],[-344,-291],[-850,102]],[[90412,85637],[-913,-175],[-900,-1153]],[[88599,84309],[-1065,-1394],[438,-74],[136,-370],[270,-132]],[[88378,82339],[178,296],[305,
-39]],[[88861,82596],[401,-650]],[[89262,81946],[9,-502],[-217,-591]],[[89054,80853],[-23,-705],[-126,-945],[-418,-855],[-94,-409],[-377,-688],[-374,-682],[-179,-349],[-370,-346],[-175,-8],[-175,287],[-373,-432],[-43,-197]],[[86327,75524],[-106,36]],[[86221,75560],[-120,-201],[-83,-201]],[[86018,75158],[10,-424],[-143,-130],[-50,-105],[-104,-174],[-185,-97],[-121,-159],[-9,-256],[-32,-65],[111,-96],[157,-259]],[[85652,73393],[240,-697],[68,-383],[3,-681],[-105,-325],[-252,-113],[-222,-245],[-250,-51],[-31,322]],[[85103,71220],[52,443],[-123,615]],[[85032,72278],[206,99],[-190,506]],[[85048,72883],[-135,113],[-34,-112]],[[84879,72884],[-81,-49],[-10,112],[-72,54],[-75,94]],[[84641,73095],[77,260],[65,69]],[[84783,73424],[-25,108],[71,319]],[[84829,73851],[-18,97],[-163,64]],[[84648,74012],[-131,158]],[[84517,74170],[-388,-171],[-204,-277],[-300,-161],[148,274],[-58,230],[220,397],[-147,310],[-242,-209],[-314,-411],[-171,-381],[-272,-29],[-142,-275],[147,-400],[227,-97],[9,-265]],[[83
030,72705],[220,-172],[311,421]],[[83561,72954],[247,-230],[179,-15]],[[83987,72709],[46,-310],[-394,-165]],[[83639,72234],[-130,-319],[-270,-296],[-142,-414]],[[83097,71205],[299,-324],[109,-582]],[[83505,70299],[169,-541],[189,-454],[-5,-439],[-174,-161],[66,-315],[164,-184],[-43,-481],[-71,-468],[-155,-53],[-203,-640],[-225,-775],[-258,-705],[-382,-545],[-386,-498],[-313,-68],[-170,-262],[-96,192],[-157,-294],[-388,-296],[-294,-90],[-95,-624],[-154,-35],[-73,429],[66,228]],[[80517,63220],[-373,190],[-131,-97]],[[80013,63313],[-371,-505],[-231,-558],[-61,-410],[212,-623],[260,-772],[252,-365],[169,-475],[127,-1093],[-37,-1039],[-232,-389],[-318,-381],[-227,-492],[-346,-550],[-101,378],[78,401],[-206,335]],[[78981,56775],[-233,87],[-112,307],[-141,611]],[[78495,57780],[-249,271],[-238,-11],[41,464],[-245,-3],[-22,-650],[-150,-863],[-90,-522],[19,-428],[181,-18],[113,-539],[50,-512],[155,-338],[168,-69],[144,-306]],[[78372,54256],[64,-56],[164,-356],[116,-396],[16,-398],[-29,-269],[
27,-203],[20,-349],[98,-163],[109,-523],[-5,-199],[-197,-40],[-263,438],[-329,469],[-32,301],[-161,395],[-38,489],[-100,322],[30,431],[-61,250]],[[77801,54399],[-110,227],[-47,292],[-148,334],[-135,280],[-45,-347],[-53,328],[30,369],[82,566]],[[77375,56448],[-27,439],[86,452],[-94,350],[23,644],[-113,306],[-90,707],[-50,746],[-121,490],[-183,-297],[-315,-421],[-156,53],[-172,138],[96,732],[-58,554],[-218,681],[34,213],[-163,76],[-197,481]],[[75657,62792],[-79,309],[-16,301],[-53,284]],[[75509,63686],[-116,344],[-256,23],[25,-243],[-87,-329],[-118,120],[-41,-108],[-78,65],[-108,53]],[[74730,63611],[-39,-216],[-189,7],[-343,-122],[16,-445],[-148,-349],[-400,-398],[-311,-695],[-209,-373]],[[73107,61020],[-276,-386],[-1,-272]],[[72830,60362],[-138,-146]],[[72692,60216],[-250,-212],[-130,-31]],[[72312,59973],[-84,-450],[58,-769],[15,-490],[-118,-561],[-1,-1004],[-144,-29],[-126,-450],[84,-195]],[[71996,56025],[-253,-167],[-93,-402]],[[71650,55456],[-112,-170],[-263,552],[-128,827],[-107,
596],[-97,279],[-148,568],[-69,739],[-48,369],[-253,811],[-115,1145],[-83,756],[1,716],[-54,553],[-404,-353],[-196,70],[-362,716],[133,214],[-82,232],[-326,501]],[[68937,64577],[-203,150]],[[68734,64727],[-83,425],[-215,449]],[[68436,65601],[-512,-111],[-451,-11],[-391,-83]],[[67082,65396],[-523,179]],[[66559,65575],[-302,136],[-314,76]],[[65943,65787],[-118,725],[-133,105],[-214,-106],[-280,-286],[-339,196],[-281,454],[-267,168],[-186,561],[-205,788],[-149,-96],[-177,196]],[[63594,68492],[-103,-231],[-165,29]],[[63326,68290],[58,-261],[-25,-135],[89,-445]],[[63448,67449],[109,-510],[137,-135],[47,-207]],[[63741,66597],[190,-248],[16,-244]],[[63947,66105],[-27,-197],[35,-199],[80,-165],[37,-194],[41,-145]],[[64113,65205],[-18,430],[75,310],[76,64]],[[64246,66009],[84,-186],[5,-345]],[[64335,65478],[-61,-348]],[[64274,65130],[53,-226]],[[64327,64904],[49,29],[11,-162],[217,93],[230,-15],[168,-18],[190,400],[207,379],[176,364]],[[65575,65974],[80,201],[35,-51],[-26,-244],[-37,-108]],[
[65627,65772],[38,-466]],[[65665,65306],[125,-404],[155,-214]],[[65945,64688],[204,-78],[164,-107]],[[66313,64503],[125,-339],[75,-196],[100,-75],[-1,-132],[-101,-352],[-44,-166],[-117,-189],[-104,-404],[-126,31],[-58,-141],[-44,-300],[34,-395],[-26,-72],[-128,2],[-174,-221],[-27,-288],[-63,-125],[-173,5],[-109,-149]],[[65352,60997],[1,-239],[-134,-164]],[[65219,60594],[-153,56],[-186,-199]],[[64880,60451],[-128,-33],[-201,-159]],[[64551,60259],[-54,-263],[-6,-201],[-277,-249],[-444,-276],[-249,-417]],[[63521,58853],[-122,-32],[-83,34]],[[63316,58855],[-163,-245]],[[63153,58610],[-177,-113],[-233,-31]],[[62743,58466],[-70,-34],[-61,-156],[-73,-43]],[[62539,58233],[-42,-150],[-138,13]],[[62359,58096],[-89,-80],[-192,30],[-72,345],[8,323],[-46,174],[-54,437],[-80,243],[56,29],[-29,270],[34,114],[-12,257]],[[61883,60238],[-36,253],[-84,177]],[[61763,60668],[-22,236],[-143,212],[-148,495],[-79,482],[-192,406],[-124,97],[-184,563],[-32,411],[12,350],[-159,655],[-130,231],[-150,122],[-92,
339],[15,133]],[[60335,65400],[-77,307],[-81,131]],[[60177,65838],[-108,440],[-170,476],[-141,406],[-139,-3],[44,325],[12,206],[34,236]],[[59709,67924],[-9,86]],[[59700,68010],[-78,-238],[-60,-446],[-75,-308],[-65,-103],[-93,191],[-125,263],[-198,847],[-29,-53],[115,-624],[171,-594],[210,-920],[102,-321],[90,-334],[249,-654],[-55,-103],[9,-384],[323,-530],[49,-121]],[[60240,63578],[90,-580],[-61,-107],[40,-608],[102,-706],[106,-145],[152,-219]],[[60669,61213],[161,-683],[77,-543]],[[60907,59987],[152,-288],[379,-558],[154,-336],[151,-341],[87,-203],[136,-178]],[[61966,58083],[66,-183],[-9,-245],[-158,-142],[119,-161]],[[61984,57352],[91,-109]],[[62075,57243],[54,-244],[125,-248]],[[62254,56751],[138,-2],[262,151],[302,70],[245,184],[138,39],[99,108],[158,20]],[[63596,57321],[89,12],[128,88],[147,59],[132,202],[105,2],[6,-163],[-25,-344],[1,-310],[-59,-214],[-78,-639],[-134,-659],[-172,-755],[-238,-866],[-237,-661],[-327,-806],[-278,-479],[-415,-586],[-259,-450],[-304,-715],[-64,-312
],[-63,-140]],[[61551,49585],[-195,-236],[-68,-246],[-104,-44],[-40,-416],[-89,-238],[-54,-393],[-112,-195]],[[60889,47817],[-128,-728],[16,-335],[178,-216],[8,-153],[-76,-357],[16,-180],[-18,-282],[97,-370],[115,-583],[101,-129]],[[61198,44484],[45,-265],[-11,-588],[34,-519],[11,-923],[49,-290],[-83,-422],[-108,-410],[-177,-366],[-254,-225],[-313,-287],[-313,-634],[-107,-108],[-194,-420],[-115,-136],[-23,-421],[132,-448],[54,-346],[4,-177],[49,29],[-8,-579]],[[59870,36949],[-45,-274],[65,-102]],[[59890,36573],[-41,-246],[-116,-210]],[[59733,36117],[-229,-199],[-334,-320],[-122,-219],[24,-248],[71,-40],[-24,-311]],[[59119,34780],[-70,-430],[-32,-491],[-72,-267],[-190,-298],[-54,-86],[-118,-300],[-77,-303],[-158,-424],[-314,-609],[-196,-355]],[[57838,31217],[-209,-269],[-291,-229]],[[57338,30719],[-141,-31],[-36,-164],[-169,88],[-138,-113],[-301,114],[-168,-72],[-115,31],[-286,-233],[-238,-94],[-171,-223],[-127,-14],[-117,210],[-94,11],[-120,264],[-13,-82],[-37,159],[2,346],[-90,396]
,[89,108],[-7,453],[-182,553],[-139,501],[-1,1],[-199,768]],[[54540,33696],[-207,446],[-108,432],[-62,575],[-68,428],[-93,910],[-7,707],[-35,322],[-108,243],[-144,489],[-146,708],[-60,371],[-226,577],[-17,453]],[[53259,40357],[-26,372],[38,519],[96,541],[15,254],[90,532],[66,243],[159,386],[90,263],[29,438],[-15,335],[-83,211],[-74,358],[-68,355],[15,122],[85,235],[-84,570],[-57,396],[-139,374],[26,115]],[[53422,46976],[-39,183]],[[53383,47159],[-74,444]],[[53309,47603],[-228,626]],[[53081,48229],[-285,596],[-184,488],[-169,610],[9,196],[61,189],[67,430],[56,438]],[[52636,51176],[-52,90],[96,663]],[[52680,51929],[40,467],[-108,390]],[[52612,52786],[-127,100],[-56,265]],[[52429,53151],[-71,85],[3,163]],[[52361,53399],[-289,-213]],[[52072,53186],[-105,32],[-107,-133]],[[51860,53085],[-222,13],[-149,370],[-91,427]],[[51398,53895],[-197,390],[-209,-8]],[[50992,54277],[-245,1]],[[50747,54278],[-229,-69]],[[50518,54209],[-224,-126]],[[50294,54083],[-436,-346],[-154,-203],[-250,-171],[-248
,168]],[[49206,53531],[-126,-7],[-194,116],[-178,-7],[-329,-103],[-193,-170],[-275,-217],[-54,15]],[[47857,53158],[-73,-5],[-286,282]],[[47498,53435],[-252,450],[-237,323]],[[47009,54208],[-187,381]],[[46822,54589],[-75,44],[-200,238],[-144,316],[-49,216],[-34,437]],[[46320,55840],[-122,349],[-108,232],[-71,76],[-69,118],[-32,261],[-41,130],[-80,97]],[[45797,57103],[-149,247],[-117,39],[-63,166],[1,90],[-84,125],[-18,127]],[[45367,57897],[-46,453]],[[45321,58350],[36,262]],[[45357,58612],[-115,460],[-138,210],[122,112],[134,415],[66,304]],[[45426,60113],[-24,318],[78,291],[34,557],[-30,583],[-34,294],[28,295],[-72,281],[-146,255]],[[45260,62987],[12,249]],[[45272,63236],[13,274],[106,161],[91,308],[-18,200],[96,417],[155,376],[93,95],[74,344],[6,315],[100,365],[185,216],[177,603],[144,235]],[[46494,67145],[259,66],[219,403],[139,158]],[[47111,67772],[232,493],[-70,735],[106,508],[37,312],[179,399],[278,270],[206,244],[186,612],[87,362],[205,-2],[167,-251],[264,41],[288,-131],[121,-6
]],[[49397,71358],[267,323],[300,102],[175,244],[268,180],[471,105],[459,48],[140,-87],[262,232],[297,5],[113,-137],[190,35]],[[52339,72408],[302,239],[195,-71],[-9,-299],[236,217],[20,-113]],[[53083,72381],[-139,-289],[-2,-274]],[[52942,71818],[96,-147],[-36,-511],[-183,-297],[53,-322],[143,-10],[70,-281],[106,-92]],[[53191,70158],[326,-204],[117,51],[232,-98],[368,-264],[130,-526],[250,-114],[391,-248],[296,-293],[136,153],[133,272],[-65,452],[87,288],[200,277],[192,80],[375,-121],[95,-264],[104,-2],[88,-101]],[[56646,69496],[276,-69],[68,-196]],[[56990,69231],[369,10],[268,-156],[275,-175],[129,-92],[214,188],[114,169],[245,49],[198,-75],[75,-293],[65,193],[222,-140],[217,-33],[137,149]],[[59518,69025],[80,194],[-19,34],[74,276],[56,446],[40,149],[8,6]],[[59757,70130],[99,482],[138,416],[5,21]],[[59999,71049],[-26,452],[68,243]],[[60041,71744],[-102,268],[105,222],[-169,-51],[-233,136],[-191,-340],[-421,-66],[-225,317],[-300,20],[-64,-245]],[[58441,72005],[-192,-71],[-268,315]],[
[57981,72249],[-303,-10],[-165,587]],[[57513,72826],[-203,328],[135,459],[-176,283],[308,565],[428,23],[117,449],[529,-78],[334,383],[324,167],[459,13]],[[59768,75418],[485,-416],[399,-229]],[[60652,74773],[323,91],[239,-53],[328,309]],[[61542,75120],[42,252],[-70,403],[-160,218],[-154,68],[-102,181]],[[61098,76242],[-354,499],[-317,223],[-240,347],[202,95],[231,494],[-156,234],[410,241],[-8,129],[-249,-95]],[[60617,78409],[-222,-48],[-185,-191],[-260,-31],[-239,-220],[16,-368],[136,-142],[284,35],[-55,-210],[-304,-103],[-377,-342],[-154,121],[61,277],[-304,173],[50,113],[265,197],[-80,135],[-432,149],[-19,221],[-257,-73],[-103,-325],[-215,-437]],[[58223,77340],[6,-152],[-135,-128],[-84,56],[-78,-713]],[[57932,76403],[-144,-245],[-101,-422],[89,-337]],[[57776,75399],[33,-228],[243,-190],[-51,-145],[-330,-33],[-118,-182],[-232,-319]],[[57321,74302],[-87,275],[3,122]],[[57237,74699],[-169,17],[-145,56],[-336,-154],[192,-332],[-141,-96]],[[56638,74190],[-154,0],[-147,304]],[[56337,7449
4],[-52,-130],[62,-353],[139,-277]],[[56486,73734],[-105,-130],[155,-272]],[[56536,73332],[137,-171],[4,-334],[-257,157],[82,-302],[-176,-62],[105,-521]],[[56431,72099],[-184,-7],[-228,257],[-104,472]],[[55915,72821],[-49,393],[-108,272],[-143,337],[-18,168]],[[55597,73991],[-48,41],[-5,130],[-154,199],[-24,281],[23,403],[38,184]],[[55427,75229],[-46,93],[-59,46]],[[55322,75368],[-78,192],[-120,118]],[[55124,75678],[-261,218],[-161,213],[-254,176]],[[54448,76285],[-233,435],[56,44]],[[54271,76764],[-127,248],[-5,200],[-179,93],[-85,-255],[-82,198],[6,205],[10,9]],[[53809,77462],[62,54]],[[53871,77516],[-221,86],[-226,-210],[15,-293],[-34,-168],[91,-301],[261,-298],[140,-488],[309,-476],[217,3],[68,-130],[-78,-118]],[[54413,75123],[249,-213],[204,-179]],[[54866,74731],[238,-308],[29,-111],[-52,-211],[-154,276],[-242,97],[-116,-382],[200,-219],[-33,-309],[-116,-35],[-148,-506],[-116,-46],[1,181],[57,317],[60,126],[-108,342],[-85,298],[-115,74],[-82,255],[-179,107],[-120,238],[-206,38]
,[-217,267],[-254,384]],[[53108,75604],[-189,341],[-86,584]],[[52833,76529],[-138,68],[-226,195],[-128,-80],[-161,-274],[-115,-43]],[[52065,76395],[-252,-334],[-548,160],[-404,-192],[-32,-355]],[[50829,75674],[15,-344],[-263,-393],[-356,-125],[-25,-199],[-171,-327],[-107,-481],[108,-338],[-160,-263],[-60,-384],[-210,-118]],[[49600,72702],[-197,-455],[-352,-8]],[[49051,72239],[-265,11],[-174,-209],[-106,-223],[-136,49],[-103,199],[-79,340],[-259,92]],[[47929,72498],[-112,-153],[-146,83],[-143,-65],[42,462],[-26,363],[-124,55],[-67,224],[22,386],[111,215],[20,239],[58,355],[-6,250],[-56,212],[-12,200]],[[47490,75324],[14,420],[-114,257],[393,426]],[[47783,76427],[340,-107],[373,4]],[[48496,76324],[296,-101],[230,31],[449,-19]],[[49471,76235],[144,354],[53,1177],[-287,620],[-205,299]],[[49176,78685],[-424,228],[-28,430]],[[48724,79343],[360,129],[466,-152],[-88,669],[263,-254],[646,461],[84,484],[243,119]],[[50698,80799],[222,117]],[[50920,80916],[143,162]],[[51063,81078],[244,870],[38
0,247]],[[51687,82195],[231,-17]],[[51918,82178],[54,125],[232,32],[52,-130],[188,291],[-63,222],[-13,335]],[[52368,83053],[-113,328],[-8,604],[46,159]],[[52293,84144],[80,178],[244,36]],[[52617,84358],[98,163],[223,167],[-9,-304],[-82,-192],[33,-166],[151,-89],[-68,-223],[-83,64],[-200,-425],[76,-288]],[[52756,83065],[4,-228],[281,-138],[-3,-210],[283,111],[156,162],[313,-233],[132,-189]],[[53922,82340],[189,174],[434,273],[350,200],[277,-100],[21,-144],[268,-7]],[[55461,82736],[63,260],[383,191]],[[55907,83187],[-59,497]],[[55848,83684],[10,445],[136,371],[262,202],[221,-442],[223,12],[53,453]],[[56753,84725],[32,349],[-102,-75],[-176,210],[-24,340],[351,164],[350,86],[301,-97],[287,17]],[[57772,85719],[316,327],[-291,280]],[[57797,86326],[-504,-47],[-489,-216],[-452,-125]],[[56352,85938],[-161,322],[-269,195],[62,581]],[[55984,87036],[-135,534],[133,344]],[[55982,87914],[252,371],[635,640],[185,124],[-28,250],[-387,279]],[[56639,89578],[-478,-167],[-269,-413],[43,-361],[-441,-475
],[-537,-509],[-202,-832],[198,-416],[265,-328],[-255,-666],[-289,-138],[-106,-992],[-157,-554],[-337,57],[-158,-468],[-321,-27],[-89,558],[-232,671],[-211,835]],[[53063,85353],[-187,363],[-548,-684]],[[52328,85032],[-370,-138],[-385,301]],[[51573,85195],[-99,635]],[[51474,85830],[-88,1364],[256,380]],[[51642,87574],[733,496],[549,609],[508,824],[668,1141],[465,444],[763,741],[610,259],[457,-31],[423,489],[506,-26],[499,118],[869,-433],[-358,-158],[305,-371]],[[58639,91676],[286,206],[456,-358],[761,-140],[1050,-668],[213,-281],[18,-393],[-308,-311],[-454,-157],[-1240,449],[-204,-75],[453,-433],[36,-878],[358,-180],[217,-153],[36,286]],[[60317,88590],[-174,263],[183,215]],[[60326,89068],[672,-368]],[[60998,88700],[234,144],[-187,433]],[[61045,89277],[647,578],[256,-34],[260,-206],[161,406],[-231,352],[136,353],[-204,367],[777,-190],[158,-331],[-351,-73]],[[62654,90499],[2,-328],[218,-203]],[[62874,89968],[429,128],[68,377]],[[63371,90473],[581,282],[969,507]],[[64921,91262],[209,-29
],[-273,-359],[344,-61],[199,202],[521,16],[412,245],[317,-356],[315,391],[-291,343],[145,195],[820,-179],[385,-185],[1006,-675],[186,309],[-282,313],[-8,125],[-335,58],[92,280],[-149,461],[-8,189],[512,535]],[[69038,93080],[182,537],[207,116]],[[69427,93733],[735,-156],[58,-328]],[[70220,93249],[-263,-479],[173,-189],[89,-413],[-63,-809],[307,-362],[-120,-395],[-544,-839],[318,-87],[110,213],[306,151],[74,293],[240,281],[-162,336],[130,390],[-304,49],[-67,328]],[[70444,91717],[222,594],[-361,481]],[[70305,92792],[497,398],[-64,421],[139,13],[145,-328],[-109,-570],[297,-108],[-127,426],[465,233],[577,31],[513,-337],[-247,492],[-28,630]],[[72363,94093],[484,119],[668,-26]],[[73515,94186],[602,77],[-226,309],[321,388],[319,16],[540,293],[734,79],[93,162],[729,55],[227,-133],[624,314],[510,-10],[77,255],[265,252],[656,242],[476,-191],[-378,-146],[629,-90],[75,-292],[254,143],[812,-7],[626,-289],[223,-221],[-69,-307],[-307,-175],[-730,-328],[-209,-175],[345,-83],[410,-149]],[[63720,7385
8],[-47,-207],[-102,-138]],[[63571,73513],[7,-293]],[[63578,73220],[88,-436],[263,-123],[193,-296],[395,-102],[434,156],[27,139]],[[64978,72558],[-52,417],[40,618],[-216,200],[71,405],[-184,34],[61,498],[262,-145],[244,189],[-202,355],[-80,338],[-224,-151],[-28,-433],[-87,383]],[[64583,75266],[-15,144],[68,246],[-53,206],[-322,202],[-125,530],[-154,150],[-9,192],[270,-56],[11,432],[236,96],[243,-88],[50,576],[-50,365],[-278,-28],[-236,144],[-321,-260],[-259,-124]],[[63639,77993],[-127,-350],[-269,-97],[-276,-610],[252,-561],[-27,-398],[303,-696]],[[63495,75281],[146,-311],[141,-419],[130,-28],[85,-159],[-228,-47],[-49,-459]],[[23807,96363],[-521,38],[-74,165],[559,-9],[195,-109],[-33,-68],[-126,-17]],[[18874,96315],[-411,191],[224,188],[406,60],[392,-92],[-93,-177],[-518,-170]],[[56247,96336],[-490,137],[191,152],[-167,189],[575,119],[110,-222],[401,-134],[-620,-241]],[[19199,96904],[-461,1],[5,84],[285,177],[149,-27],[361,-120],[-339,-115]],[[22969,96575],[-226,138],[-119,221],[-22
,245],[360,-24],[162,-39],[332,-205],[-76,-214],[-411,-122]],[[22313,96609],[-453,66],[-457,192],[-619,21],[268,176],[-335,142],[-21,227],[546,-81],[751,-215],[212,-281],[108,-247]],[[77621,96617],[507,776],[229,66],[208,-38],[704,-336],[-82,-240],[-1566,-228]],[[54420,95937],[-598,361],[252,210],[-416,170],[-541,499],[-216,463],[757,212],[152,-207],[396,8],[105,202],[408,20],[350,-206],[915,-440],[-699,-233],[-155,-435],[-243,-111],[-132,-490],[-335,-23]],[[56395,97491],[-819,98],[-50,163],[-398,11],[-304,271],[858,165],[403,-142],[281,177],[702,-148],[545,-207],[-412,-318],[-806,-70]],[[63218,97851],[-301,140],[158,185],[-618,18],[542,107],[422,8],[57,-160],[159,142],[262,97],[412,-129],[-107,-90],[-373,-78],[-250,-45],[-39,-97],[-324,-98]],[[77154,97111],[-773,170],[-462,226],[-213,423],[-379,117],[722,404],[600,133],[540,-297],[640,-572],[-69,-531],[-606,-73]],[[24776,96791],[-575,76],[-299,240],[4,215],[220,157],[-508,-4],[-306,196],[-176,268],[193,262],[192,180],[285,42],[-122
,135],[646,30],[355,-315],[468,-127],[455,-112],[220,-390],[334,-190],[-381,-176],[-513,-445],[-492,-42]],[[27622,95587],[-726,163],[-816,-91],[-414,71],[-525,31],[-35,284],[514,133],[-137,427],[170,41],[742,-255],[-379,379],[-450,113],[225,229],[492,141],[79,206],[-392,231],[-118,304],[759,-26],[220,-64],[433,216],[-625,68],[-972,-38],[-491,201],[-232,239],[-324,173],[-61,202],[413,112],[324,19],[545,96],[409,220],[344,-30],[300,-166],[211,319],[367,95],[498,65],[849,24],[148,-63],[802,100],[601,-38],[602,-37],[742,-47],[597,-75],[508,-161],[-12,-157],[-678,-257],[-672,-119],[-251,-133],[605,3],[-656,-358],[-452,-167],[-476,-483],[-573,-98],[-177,-120],[-841,-64],[383,-74],[-192,-105],[230,-292],[-264,-202],[-429,-167],[-132,-232],[-388,-176],[39,-134],[475,23],[6,-144],[-742,-355]],[[37559,86051],[-410,482],[-556,3],[-269,324],[-186,577],[-481,735],[-141,385],[-38,530],[-384,546],[100,435],[-186,208],[275,691],[418,220],[110,247],[58,461],[-318,-209],[-151,-88],[-249,-84],[-341,19
3],[-19,401],[109,314],[258,9],[567,-157],[-478,375],[-249,202],[-276,-83],[-232,147],[310,550],[-169,220],[-220,409],[-335,626],[-353,230],[3,247],[-745,346],[-590,43],[-743,-24],[-677,-44],[-323,188],[-482,372],[729,186],[559,31],[-1188,154],[-627,241],[39,229],[1051,285],[1018,284],[107,214],[-750,213],[243,235],[961,413],[404,63],[-115,265],[658,156],[854,93],[853,5],[303,-184],[737,325],[663,-221],[390,-46],[577,-192],[-660,318],[38,253],[932,353],[975,-27],[354,218],[982,57],[2219,-74],[1737,-469],[-513,-227],[-1062,-26],[-1496,-58],[140,-105],[984,65],[836,-204],[540,181],[231,-212],[-305,-344],[707,220],[1348,229],[833,-114],[156,-253],[-1132,-420],[-157,-136],[-888,-102],[643,-28],[-324,-431],[-224,-383],[9,-658],[333,-386],[-434,-24],[-457,-187],[513,-313],[65,-502],[-297,-55],[360,-508],[-617,-42],[322,-241],[-91,-208],[-391,-91],[-388,-2],[348,-400],[4,-263],[-549,244],[-143,-158],[375,-148],[364,-361],[105,-476],[-495,-114],[-214,228],[-344,340],[95,-401],[-322,-311],[7
32,-25],[383,-32],[-745,-515],[-755,-466],[-813,-204],[-306,-2],[-288,-228],[-386,-624],[-597,-414],[-192,-24],[-370,-145],[-399,-138],[-238,-365],[-4,-415],[-141,-388],[-453,-472],[112,-462],[-125,-488],[-142,-577],[-391,-36]],[[67002,71642],[284,-224],[209,79],[58,268],[219,89],[157,180],[55,472],[234,114],[44,211],[131,-158],[84,-19]],[[68477,72654],[154,-4],[210,-124]],[[68841,72526],[85,-72],[201,189],[93,-114],[90,271],[166,-12],[43,86],[29,239],[120,205],[150,-134],[-30,-181],[84,-28],[-26,-496],[110,-194],[97,125],[123,58],[173,265],[192,-44],[286,-1]],[[70827,72688],[50,-169]],[[70877,72519],[-162,-67],[-141,-109],[-319,-68],[-298,-124],[-163,-258],[66,-250],[32,-294],[-139,-248],[12,-227],[-76,-213],[-265,18],[110,-390],[-177,-150],[-118,-356],[15,-355],[-108,-166],[-103,55],[-212,-77],[-31,-166],[-207,1],[-154,-334],[-10,-503],[-361,-246],[-194,52],[-56,-129],[-166,75],[-278,-88],[-465,301]],[[66909,68203],[252,536],[-23,380],[-210,100],[-22,375],[-91,472],[119,323],[-121
,87],[76,430],[113,736]],[[56642,44124],[29,-184],[-32,-286],[49,-277],[-41,-222],[24,-203],[-579,7],[-13,-1880],[188,-483],[181,-369]],[[56448,40227],[-510,-241],[-673,83],[-192,284],[-1126,-26],[-42,-41],[-166,267],[-180,17],[-166,-100],[-134,-113]],[[53422,46976],[115,79],[80,-11],[98,71],[820,-8],[68,-440],[80,-354],[64,-191],[106,-309],[184,47],[91,83],[154,-83],[42,148],[69,344],[172,23],[15,103],[142,2],[-24,-213],[337,5],[5,-372],[56,-228],[-41,-356],[21,-363],[93,-219],[-15,-703],[68,54],[121,-15],[172,89],[127,-35]],[[53309,47603],[112,255],[84,100],[104,-203]],[[53609,47755],[-101,-124],[-45,-152],[-9,-258],[-71,-62]],[[55719,75309],[-35,-201],[39,-254],[115,-144]],[[55838,74710],[-5,-155],[-91,-85],[-16,-192],[-129,-287]],[[55427,75229],[-47,93]],[[55380,75322],[-18,188],[120,291],[18,-111],[75,52]],[[55575,75742],[59,-159],[66,-60],[19,-214]],[[65575,65974],[52,-202]],[[65665,65306],[-142,-3],[-23,-384],[50,-82],[-126,-117],[-1,-241],[-81,-245],[-7,-238]],[[65335,63996]
,[-56,-125],[-835,298],[-106,599],[-11,136]],[[31400,18145],[-168,16],[-297,1],[0,1319]],[[32587,37434],[511,-964],[227,-89],[339,-437],[286,-231],[40,-261],[-273,-898],[280,-160],[312,-91],[220,95],[252,453],[45,521]],[[34826,35372],[138,114],[139,-341],[-6,-472],[-234,-326],[-186,-241],[-314,-573],[-370,-806]],[[33993,32727],[-70,-473],[-74,-607],[3,-588],[-61,-132],[-21,-382]],[[31227,23224],[273,-433],[266,-119]],[[30952,19680],[-257,93],[-672,79],[-115,344],[6,443],[-185,-38],[-98,214],[-24,626],[213,260],[88,375],[-33,299],[148,504],[101,782],[-30,347],[122,112],[-30,223],[-129,118],[92,248],[-126,224],[-65,682],[112,120],[-47,720],[65,605],[75,527],[166,215],[-84,576],[-1,543],[210,386],[-7,494],[159,576],[1,544],[-72,108],[-128,1020],[171,607],[-27,572],[100,537],[182,555],[196,367],[-83,232],[58,190],[-9,985],[302,291],[96,614],[-34,148]],[[31359,37147],[231,534],[364,-144],[163,-427],[109,475],[316,-24],[45,-127]],[[62492,74950],[57,-155],[106,-103],[-56,-148],[148,-202],[
-78,-189],[118,-160],[124,-97],[7,-410]],[[62918,73486],[-101,-17]],[[62817,73469],[-113,342],[1,91],[-123,-2],[-82,159],[-58,-16]],[[62442,74043],[-109,172],[-207,147],[27,288],[-47,208]],[[62106,74858],[386,92]],[[1088,892],[38,-7],[32,-4]],[[1158,881],[402,-246],[352,246],[63,34],[816,104],[265,-138],[130,-71],[419,-196],[789,-151],[625,-185],[1072,-139],[800,162],[1181,-116],[669,-185],[734,174],[773,162],[60,278],[-1094,23],[-898,139],[-234,231],[-745,128],[49,266],[103,243],[104,220],[-55,243],[-462,162],[-212,209],[-430,185],[675,-35],[642,93],[402,-197],[495,173],[457,220],[223,197],[-98,243],[-359,162],[-408,174],[-571,35],[-500,81],[-539,58],[-180,220],[-359,185],[-217,208],[-87,672],[136,-58],[250,-185],[457,58],[441,81],[228,-255],[441,58],[370,127],[348,162],[315,197],[419,58],[-11,220],[-97,220],[81,208],[359,104],[163,-196],[425,115],[321,151],[397,12],[375,57],[376,139],[299,128],[337,127],[218,-35],[190,-46],[414,81],[370,-104],[381,11],[364,81],[375,-57],[414,-58],
[386,23],[403,-12],[413,-11],[381,23],[283,174],[337,92],[349,-127],[331,104],[300,208],[179,-185],[98,-208],[180,-197],[288,174],[332,-220],[375,-70],[321,-162],[392,35],[354,104],[418,-23],[376,-81],[381,-104],[147,254],[-180,197],[-136,209],[-359,46],[-158,220],[-60,220],[-98,440],[213,-81],[364,-35],[359,35],[327,-93],[283,-174],[119,-208],[376,-35],[359,81],[381,116],[342,70],[283,-139],[370,46],[239,451],[224,-266],[321,-104],[348,58],[228,-232],[365,-23],[337,-69],[332,-128],[218,220],[108,209],[278,-232],[381,58],[283,-127],[190,-197],[370,58],[288,127],[283,151],[337,81],[392,69],[354,81],[272,127],[163,186],[65,254],[-32,244],[-87,231],[-98,232],[-87,231],[-71,209],[-16,231],[27,232],[130,220],[109,243],[44,231],[-55,255],[-32,232],[136,266],[152,173],[180,220],[190,186],[223,173],[109,255],[152,162],[174,151],[267,34],[174,186],[196,115],[228,70],[202,150],[157,186],[218,69],[163,-151],[-103,-196],[-283,-174],[-120,-127],[-206,92],[-229,-58],[-190,-139],[-202,-150],[-136,
-174],[-38,-231],[17,-220],[130,-197],[-190,-139],[-261,-46],[-153,-197],[-163,-185],[-174,-255],[-44,-220],[98,-243],[147,-185],[229,-139],[212,-185],[114,-232],[60,-220],[82,-232],[130,-196],[82,-220],[38,-544],[81,-220],[22,-232],[87,-231],[-38,-313],[-152,-243],[-163,-197],[-370,-81],[-125,-208],[-169,-197],[-419,-220],[-370,-93],[-348,-127],[-376,-128],[-223,-243],[-446,-23],[-489,23],[-441,-46],[-468,0],[87,-232],[424,-104],[311,-162],[174,-208],[-310,-185],[-479,58],[-397,-151],[-17,-243],[-11,-232],[327,-196],[60,-220],[353,-220],[588,-93],[500,-162],[398,-185],[506,-186],[690,-92],[681,-162],[473,-174],[517,-197],[272,-278],[136,-220],[337,209],[457,173],[484,186],[577,150],[495,162],[691,12],[680,-81],[560,-139],[180,255],[386,173],[702,12],[550,127],[522,128],[577,81],[614,104],[430,150],[-196,209],[-119,208],[0,220],[-539,-23],[-571,-93],[-544,0],[-77,220],[39,440],[125,128],[397,138],[468,139],[337,174],[337,174],[251,231],[380,104],[376,81],[190,47],[430,23],[408,81],[
343,116],[337,139],[305,139],[386,185],[245,197],[261,173],[82,232],[-294,139],[98,243],[185,185],[288,116],[305,139],[283,185],[217,232],[136,277],[202,163],[331,-35],[136,-197],[332,-23],[11,220],[142,231],[299,-58],[71,-220],[331,-34],[360,104],[348,69],[315,-34],[120,-243],[305,196],[283,105],[315,81],[310,81],[283,139],[310,92],[240,128],[168,208],[207,-151],[288,81],[202,-277],[157,-209],[316,116],[125,232],[283,162],[365,-35],[108,-220],[229,220],[299,69],[326,23],[294,-11],[310,-70],[300,-34],[130,-197],[180,-174],[304,104],[327,24],[315,0],[310,11],[278,81],[294,70],[245,162],[261,104],[283,58],[212,162],[152,324],[158,197],[288,-93],[109,-208],[239,-139],[289,46],[196,-208],[206,-151],[283,139],[98,255],[250,104],[289,197],[272,81],[326,116],[218,127],[228,139],[218,127],[261,-69],[250,208],[180,162],[261,-11],[229,139],[54,208],[234,162],[228,116],[278,93],[256,46],[244,-35],[262,-58],[223,-162],[27,-254],[245,-197],[168,-162],[332,-70],[185,-162],[229,-162],[266,-35],[22
3,116],[240,243],[261,-127],[272,-70],[261,-69],[272,-46],[277,0],[229,-614],[-11,-150],[-33,-267],[-266,-150],[-218,-220],[38,-232],[310,12],[-38,-232],[-141,-220],[-131,-243],[212,-185],[321,-58],[321,104],[153,232],[92,220],[153,185],[174,174],[70,208],[147,289],[174,58],[316,24],[277,69],[283,93],[136,231],[82,220],[190,220],[272,151],[234,115],[153,197],[157,104],[202,93],[277,-58],[250,58],[272,69],[305,-34],[201,162],[142,393],[103,-162],[131,-278],[234,-115],[266,-47],[267,70],[283,-46],[261,-12],[174,58],[234,-35],[212,-127],[250,81],[300,0],[255,81],[289,-81],[185,197],[141,196],[191,163],[348,439],[179,-81],[212,-162],[185,-208],[354,-359],[272,-12],[256,0],[299,70],[299,81],[229,162],[190,174],[310,23],[207,127],[218,-116],[141,-185],[196,-185],[305,23],[190,-150],[332,-151],[348,-58],[288,47],[218,185],[185,185],[250,46],[251,-81],[288,-58],[261,93],[250,0],[245,-58],[256,-58],[250,104],[299,93],[283,23],[316,0],[255,58],[251,46],[76,290],[11,243],[174,-162],[49,-266],[
92,-244],[115,-196],[234,-105],[315,35],[365,12],[250,35],[364,0],[262,11],[364,-23],[310,-46],[196,-186],[-54,-220],[179,-173],[299,-139],[310,-151],[360,-104],[375,-92],[283,-93],[315,-12],[180,197],[245,-162],[212,-185],[245,-139],[337,-58],[321,-69],[136,-232],[316,-139],[212,-208],[310,-93],[321,12],[299,-35],[332,12],[332,-47],[310,-81],[288,-139],[289,-116],[195,-173],[-32,-232],[-147,-208],[-125,-266],[-98,-209],[-131,-243],[-364,-93],[-163,-208],[-360,-127],[-125,-232],[-190,-220],[-201,-185],[-115,-243],[-70,-220],[-28,-266],[6,-220],[158,-232],[60,-220],[130,-208],[517,-81],[109,-255],[-501,-93],[-424,-127],[-528,-23],[-234,-336],[-49,-278],[-119,-220],[-147,-220],[370,-196],[141,-244],[239,-219],[338,-197],[386,-186],[419,-185],[636,-185],[142,-289],[800,-128],[53,-45],[208,-175],[767,151],[636,-186],[-99504,-147],[245,344],[501,-185],[32,21],[294,188]],[[54716,79012],[-21,-241],[-156,-2],[53,-128],[-92,-380]],[[54500,78261],[-53,-100],[-243,-14],[-140,-134],[-229,45]],[
[53835,78058],[-398,153],[-62,205],[-274,-102],[-32,-113],[-169,84]],[[52900,78285],[-142,16],[-125,108],[42,145],[-10,104]],[[52665,78658],[83,33],[141,-164],[39,156],[245,-25],[199,106],[133,-18],[87,-121],[26,100],[-40,385],[100,75],[98,272]],[[53776,79457],[206,-190],[157,242],[98,44],[215,-180],[131,30],[128,-111]],[[54711,79292],[-23,-75],[28,-205]],[[62817,73469],[-190,78],[-141,273],[-44,223]],[[63720,73858],[-48,-207],[-101,-138]],[[63578,73220],[-69,-29],[-173,309],[95,292],[-82,174],[-104,-44],[-327,-436]],[[62492,74950],[68,96],[207,-169],[149,-36],[38,70],[-136,319],[72,82]],[[62890,75312],[78,-20],[191,-359],[122,-40],[48,150],[166,238]],[[58149,47921],[-17,713],[-70,268]],[[58062,48902],[169,-46],[85,336],[147,-38]],[[58463,49154],[16,-233],[60,-134],[3,-192],[-69,-124],[-108,-308],[-101,-214],[-115,-28]],[[50920,80916],[204,-47],[257,123],[176,-258],[153,-138]],[[51710,80596],[-32,-400]],[[51678,80196],[-72,-22],[-30,-331]],[[51576,79843],[-243,269],[-143,-46],[-194,
279],[-129,237],[-129,10],[-40,207]],[[50518,54209],[-69,407],[13,1357],[-56,122],[-11,290],[-96,207],[-85,174],[35,311]],[[50249,57077],[96,67],[56,258],[136,56],[61,176]],[[50598,57634],[93,173],[100,2],[212,-340]],[[51003,57469],[-11,-197],[62,-350],[-54,-238],[29,-159],[-135,-366],[-86,-181],[-52,-372],[7,-376],[-16,-952]],[[49214,56277],[-190,152],[-130,-22],[-97,-149],[-125,125],[-49,195],[-125,129]],[[48498,56707],[-18,343],[76,250],[-7,200],[221,490],[41,405],[76,144],[134,-79],[116,120],[38,152],[216,265],[53,184],[259,246],[153,84],[70,-114],[178,3]],[[50104,59400],[-22,-286],[37,-269],[156,-386],[9,-286],[320,-134],[-6,-405]],[[50249,57077],[-243,13]],[[50006,57090],[-128,47],[-90,-96],[-123,43],[-482,-27],[-7,-336],[38,-444]],[[75742,63602],[-6,-424],[-97,90],[18,-476]],[[75657,62792],[-79,308],[-16,301],[-53,285]],[[74730,63611],[-43,486],[-96,444],[47,356],[-171,159],[62,215],[173,220],[-200,313],[98,401],[220,-255],[133,-30],[24,-410],[265,-81],[257,8],[160,-101],[-12
8,-500],[-124,-34],[-86,-336],[152,-306],[46,377],[76,2],[147,-937]],[[56293,76715],[80,-243],[108,43],[213,-92],[408,-31],[138,150],[327,138],[202,-215],[163,-62]],[[57776,75399],[-239,79],[-283,-186]],[[57254,75292],[-3,-294],[-252,-56],[-196,206],[-222,-162],[-206,17]],[[56375,75003],[-20,391],[-139,189]],[[56216,75583],[46,84],[-30,70],[47,188],[105,185],[-135,255],[-24,216],[68,134]],[[55279,77084],[100,2],[-69,-260],[134,-227],[-41,-278],[-65,-27]],[[55338,76294],[-52,-53],[-90,-138],[-41,-325]],[[55155,75778],[-246,224],[-105,247],[-106,130],[-127,221],[-61,183],[-136,277],[59,245],[99,-136],[60,123],[130,13],[239,-98],[192,8],[126,-131]],[[56523,82432],[268,-4],[302,223],[64,333],[228,190],[-26,264]],[[57359,83438],[169,100],[298,228]],[[57826,83766],[293,-149],[39,-146],[146,70],[272,-141],[27,-277],[-60,-159],[174,-387],[113,-108],[-16,-107],[187,-104],[80,-157],[-108,-129],[-224,20],[-54,-55],[66,-196],[68,-379]],[[58829,81362],[-239,-35],[-85,-129],[-18,-298],[-111,57],[
-250,-28],[-73,138],[-104,-103],[-105,86],[-218,12],[-310,141],[-281,47],[-215,-14],[-152,-160],[-133,-23]],[[56535,81053],[-6,263],[-85,274],[166,121],[2,235],[-77,225],[-12,261]],[[25238,61101],[-2,87],[33,27],[51,-70],[99,357],[53,8]],[[25297,59966],[-83,0],[22,667],[2,468]],[[31359,37147],[-200,-81],[-109,814],[-150,663],[88,572],[-146,250],[-37,426],[-136,402]],[[30669,40193],[175,638],[-119,496],[63,199],[-49,219],[108,295],[6,503],[13,415],[60,200],[-240,951]],[[30686,44109],[206,-50],[143,13],[62,179],[243,239],[147,222],[363,100],[-29,-443],[34,-227],[-23,-396],[302,-529],[311,-98],[109,-220],[188,-117],[115,-172],[175,6],[161,-175],[12,-342],[55,-172],[3,-255],[-81,-10],[107,-688],[533,-24],[-41,-342],[30,-233],[151,-166],[66,-367],[-49,-465],[-77,-259],[27,-337],[-87,-122]],[[33842,38659],[-4,182],[-259,302],[-258,9],[-484,-172],[-133,-520],[-7,-318],[-110,-708]],[[34826,35372],[54,341],[38,350],[0,325],[-100,107],[-104,-96],[-103,26],[-33,228],[-26,541],[-52,177],[-187,1
60],[-114,-116],[-293,113],[18,802],[-82,329]],[[30686,44109],[-157,-102],[-126,68],[18,898],[-228,-348],[-245,15],[-105,315],[-184,34],[59,254],[-155,359],[-115,532],[73,108],[0,250],[168,171],[-28,319],[71,206],[20,275],[318,402],[227,114],[37,89],[251,-28]],[[30585,48040],[125,1620],[6,256],[-43,339],[-123,215],[1,430],[156,97],[56,-61],[9,226],[-162,61],[-4,370],[541,-13],[92,203],[77,-187],[55,-349],[52,73]],[[31423,51320],[153,-312],[216,38],[54,181],[206,138],[115,97],[32,250],[198,168],[-15,124],[-235,51],[-39,372],[12,396],[-125,153],[52,55],[206,-76],[221,-148],[80,140],[200,92],[310,221],[102,225],[-37,167]],[[33129,53652],[145,26],[64,-136],[-36,-259],[96,-90],[63,-274],[-77,-209],[-44,-502],[71,-299],[20,-274],[171,-277],[137,-29],[30,116],[88,25],[126,104],[90,157],[154,-50],[67,21]],[[34294,51702],[151,-48],[25,120],[-46,118],[28,171],[112,-53],[131,61],[159,-125]],[[34854,51946],[121,-122],[86,160],[62,-25],[38,-166],[133,42],[107,224],[85,436],[164,540]],[[35174,306
29],[-77,334],[122,280],[-160,402],[-218,327],[-286,379],[-103,-18],[-279,457],[-180,-63]],[[82069,53798],[-13,-291],[-16,-377],[-133,19],[-58,-202],[-126,307]],[[75471,66988],[113,-189],[-20,-363],[-227,-17],[-234,39],[-175,-92],[-252,224],[-6,119]],[[74670,66709],[184,439],[150,150],[198,-137],[147,-14],[122,-159]],[[58175,3752
<TRUNCATED>
---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@qpid.apache.org
For additional commands, e-mail: commits-help@qpid.apache.org
[16/19] qpid-dispatch git commit: moved standalone to a subdir
Posted by ea...@apache.org.
http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/4940e63d/console/plugin/data/places1.json
----------------------------------------------------------------------
diff --git a/console/plugin/data/places1.json b/console/plugin/data/places1.json
deleted file mode 100644
index d1942c8..0000000
--- a/console/plugin/data/places1.json
+++ /dev/null
@@ -1,13 +0,0 @@
-{
-"type": "FeatureCollection",
-
-"features": [
-{ "type": "Feature", "properties": { "SCALERANK": 2, "NATSCALE": 200, "LABELRANK": 1, "FEATURECLA": "Admin-1 capital", "NAME": "Boston", "NAMEPAR": null, "NAMEALT": null, "DIFFASCII": 0, "NAMEASCII": "Boston", "ADM0CAP": 0.000000, "CAPALT": 0.000000, "CAPIN": null, "WORLDCITY": 1.000000, "MEGACITY": 1, "SOV0NAME": "United States", "SOV_A3": "USA", "ADM0NAME": "United States of America", "ADM0_A3": "USA", "ADM1NAME": "Massachusetts", "ISO_A2": "US", "NOTE": null, "LATITUDE": 42.329960, "LONGITUDE": -71.070014, "CHANGED": 0.000000, "NAMEDIFF": 0, "DIFFNOTE": null, "POP_MAX": 4467000, "POP_MIN": 589141, "POP_OTHER": 2238083, "RANK_MAX": 12, "RANK_MIN": 11, "GEONAMEID": 4930956.000000, "MEGANAME": "Boston", "LS_NAME": "Boston", "LS_MATCH": 1, "CHECKME": 0, "MAX_POP10": 2338688.000000, "MAX_POP20": 2663082.000000, "MAX_POP50": 4880817.000000, "MAX_POP300": 4880817.000000, "MAX_POP310": 4880817.000000, "MAX_NATSCA": 300.000000, "MIN_AREAKM": 1365.000000, "MAX_AREAKM": 3880.000000, "MIN_AR
EAMI": 527.000000, "MAX_AREAMI": 1498.000000, "MIN_PERKM": 1077.000000, "MAX_PERKM": 3538.000000, "MIN_PERMI": 669.000000, "MAX_PERMI": 2199.000000, "MIN_BBXMIN": -71.675000, "MAX_BBXMIN": -71.433881, "MIN_BBXMAX": -70.658333, "MAX_BBXMAX": -70.658333, "MIN_BBYMIN": 41.533333, "MAX_BBYMIN": 42.008333, "MIN_BBYMAX": 42.554143, "MAX_BBYMAX": 43.075000, "MEAN_BBXC": -71.177127, "MEAN_BBYC": 42.277571, "COMPARE": 0, "GN_ASCII": "Boston", "FEATURE_CL": "P", "FEATURE_CO": "PPLA", "ADMIN1_COD": 0.000000, "GN_POP": 589141.000000, "ELEVATION": 13.000000, "GTOPO30": 11.000000, "TIMEZONE": "America\/New_York", "GEONAMESNO": "GeoNames match general.", "UN_FID": 527, "UN_ADM0": "United States of America", "UN_LAT": 42.370000, "UN_LONG": -71.100000, "POP1950": 2551.000000, "POP1955": 2680.000000, "POP1960": 2818.000000, "POP1965": 3000.000000, "POP1970": 3187.000000, "POP1975": 3233.000000, "POP1980": 3281.000000, "POP1985": 3349.000000, "POP1990": 3428.000000, "POP1995": 3726.000000, "POP2000":
4049.000000, "POP2005": 4364.000000, "POP2010": 4467.000000, "POP2015": 4597.000000, "POP2020": 4774.000000, "POP2025": 4919.000000, "POP2050": 5032.000000, "CITYALT": null }, "geometry": { "type": "Point", "coordinates": [ -71.071959532186838, 42.331906001702293 ] } },
-{ "type": "Feature", "properties": { "SCALERANK": 2, "NATSCALE": 200, "LABELRANK": 8, "FEATURECLA": "Admin-0 capital alt", "NAME": "Tel Aviv-Yafo", "NAMEPAR": null, "NAMEALT": "Tel Aviv-Jaffa", "DIFFASCII": 0, "NAMEASCII": "Tel Aviv-Yafo", "ADM0CAP": 0.000000, "CAPALT": 1.000000, "CAPIN": "While Jerulsale", "WORLDCITY": 0.000000, "MEGACITY": 1, "SOV0NAME": "Israel", "SOV_A3": "IS1", "ADM0NAME": "Israel", "ADM0_A3": "ISR", "ADM1NAME": "Tel Aviv", "ISO_A2": "IL", "NOTE": null, "LATITUDE": 32.079991, "LONGITUDE": 34.770012, "CHANGED": 4.000000, "NAMEDIFF": 0, "DIFFNOTE": "Changed scale rank.", "POP_MAX": 3112000, "POP_MIN": 378358, "POP_OTHER": 2306851, "RANK_MAX": 12, "RANK_MIN": 10, "GEONAMEID": 293394.000000, "MEGANAME": "Tel Aviv-Yafo", "LS_NAME": "Tel Aviv-Yafo", "LS_MATCH": 1, "CHECKME": 0, "MAX_POP10": 2324568.000000, "MAX_POP20": 2324568.000000, "MAX_POP50": 2324568.000000, "MAX_POP300": 0.000000, "MAX_POP310": 0.000000, "MAX_NATSCA": 50.000000, "MIN_AREAKM": 436.000000, "MAX_A
REAKM": 436.000000, "MIN_AREAMI": 168.000000, "MAX_AREAMI": 168.000000, "MIN_PERKM": 386.000000, "MAX_PERKM": 386.000000, "MIN_PERMI": 240.000000, "MAX_PERMI": 240.000000, "MIN_BBXMIN": 34.716667, "MAX_BBXMIN": 34.716667, "MIN_BBXMAX": 34.958333, "MAX_BBXMAX": 34.958333, "MIN_BBYMIN": 31.850000, "MAX_BBYMIN": 31.850000, "MIN_BBYMAX": 32.208333, "MAX_BBYMAX": 32.208333, "MEAN_BBXC": 34.836735, "MEAN_BBYC": 32.030266, "COMPARE": 0, "GN_ASCII": "Tel Aviv-Yafo", "FEATURE_CL": "P", "FEATURE_CO": "PPL", "ADMIN1_COD": 5.000000, "GN_POP": 378358.000000, "ELEVATION": 0.000000, "GTOPO30": -9999.000000, "TIMEZONE": "Asia\/Jerusalem", "GEONAMESNO": "GeoNames match general.", "UN_FID": 304, "UN_ADM0": "Israel", "UN_LAT": 32.040000, "UN_LONG": 34.760000, "POP1950": 418.000000, "POP1955": 556.000000, "POP1960": 738.000000, "POP1965": 882.000000, "POP1970": 1029.000000, "POP1975": 1206.000000, "POP1980": 1416.000000, "POP1985": 1681.000000, "POP1990": 2026.000000, "POP1995": 2442.000000, "POP2000":
2752.000000, "POP2005": 3012.000000, "POP2010": 3112.000000, "POP2015": 3256.000000, "POP2020": 3453.000000, "POP2025": 3600.000000, "POP2050": 3726.000000, "CITYALT": "Tel Aviv-Jaffa" }, "geometry": { "type": "Point", "coordinates": [ 34.768065899551743, 32.081937333041651 ] } },
-{ "type": "Feature", "properties": { "SCALERANK": 7, "NATSCALE": 20, "LABELRANK": 7, "FEATURECLA": "Admin-1 capital", "NAME": "Brno", "NAMEPAR": null, "NAMEALT": null, "DIFFASCII": 0, "NAMEASCII": "Brno", "ADM0CAP": 0.000000, "CAPALT": 0.000000, "CAPIN": null, "WORLDCITY": 0.000000, "MEGACITY": 0, "SOV0NAME": "Czech Republic", "SOV_A3": "CZE", "ADM0NAME": "Czech Republic", "ADM0_A3": "CZE", "ADM1NAME": "Kraj Vysocina", "ISO_A2": "CZ", "NOTE": null, "LATITUDE": 49.200393, "LONGITUDE": 16.609983, "CHANGED": 0.000000, "NAMEDIFF": 0, "DIFFNOTE": null, "POP_MAX": 388277, "POP_MIN": 369559, "POP_OTHER": 380022, "RANK_MAX": 10, "RANK_MIN": 10, "GEONAMEID": 3078610.000000, "MEGANAME": null, "LS_NAME": "Brno", "LS_MATCH": 1, "CHECKME": 5, "MAX_POP10": 388277.000000, "MAX_POP20": 388277.000000, "MAX_POP50": 0.000000, "MAX_POP300": 0.000000, "MAX_POP310": 0.000000, "MAX_NATSCA": 20.000000, "MIN_AREAKM": 141.000000, "MAX_AREAKM": 141.000000, "MIN_AREAMI": 54.000000, "MAX_AREAMI": 54.000000, "MI
N_PERKM": 149.000000, "MAX_PERKM": 149.000000, "MIN_PERMI": 92.000000, "MAX_PERMI": 92.000000, "MIN_BBXMIN": 16.483333, "MAX_BBXMIN": 16.483333, "MIN_BBXMAX": 16.708333, "MAX_BBXMAX": 16.708333, "MIN_BBYMIN": 49.116667, "MAX_BBYMIN": 49.116667, "MIN_BBYMAX": 49.300000, "MAX_BBYMAX": 49.300000, "MEAN_BBXC": 16.601967, "MEAN_BBYC": 49.196167, "COMPARE": 0, "GN_ASCII": "Brno", "FEATURE_CL": "P", "FEATURE_CO": "PPLA", "ADMIN1_COD": 78.000000, "GN_POP": 369559.000000, "ELEVATION": 0.000000, "GTOPO30": 226.000000, "TIMEZONE": "Europe\/Prague", "GEONAMESNO": "GeoNames match general.", "UN_FID": 0, "UN_ADM0": null, "UN_LAT": 0.000000, "UN_LONG": 0.000000, "POP1950": 0.000000, "POP1955": 0.000000, "POP1960": 0.000000, "POP1965": 0.000000, "POP1970": 0.000000, "POP1975": 0.000000, "POP1980": 0.000000, "POP1985": 0.000000, "POP1990": 0.000000, "POP1995": 0.000000, "POP2000": 0.000000, "POP2005": 0.000000, "POP2010": 0.000000, "POP2015": 0.000000, "POP2020": 0.000000, "POP2025": 0.000000, "POP2
050": 0.000000, "CITYALT": null }, "geometry": { "type": "Point", "coordinates": [ 16.60998327501909, 49.200393492726221 ] } },
-{ "type": "Feature", "properties": { "SCALERANK": 1, "NATSCALE": 300, "LABELRANK": 2, "FEATURECLA": "Admin-1 capital", "NAME": "Toronto", "NAMEPAR": null, "NAMEALT": null, "DIFFASCII": 0, "NAMEASCII": "Toronto", "ADM0CAP": 0.000000, "CAPALT": 0.000000, "CAPIN": null, "WORLDCITY": 1.000000, "MEGACITY": 1, "SOV0NAME": "Canada", "SOV_A3": "CAN", "ADM0NAME": "Canada", "ADM0_A3": "CAN", "ADM1NAME": "Ontario", "ISO_A2": "CA", "NOTE": null, "LATITUDE": 43.699980, "LONGITUDE": -79.420021, "CHANGED": 0.000000, "NAMEDIFF": 0, "DIFFNOTE": null, "POP_MAX": 5213000, "POP_MIN": 3934421, "POP_OTHER": 3749229, "RANK_MAX": 13, "RANK_MIN": 12, "GEONAMEID": 6167865.000000, "MEGANAME": "Toronto", "LS_NAME": "Toronto", "LS_MATCH": 1, "CHECKME": 0, "MAX_POP10": 3934421.000000, "MAX_POP20": 4377344.000000, "MAX_POP50": 5190755.000000, "MAX_POP300": 5190755.000000, "MAX_POP310": 5190755.000000, "MAX_NATSCA": 300.000000, "MIN_AREAKM": 1432.000000, "MAX_AREAKM": 2286.000000, "MIN_AREAMI": 553.000000, "MAX_AR
EAMI": 883.000000, "MIN_PERKM": 464.000000, "MAX_PERKM": 1161.000000, "MIN_PERMI": 289.000000, "MAX_PERMI": 721.000000, "MIN_BBXMIN": -80.008333, "MAX_BBXMIN": -79.806554, "MIN_BBXMAX": -79.130272, "MAX_BBXMAX": -78.608333, "MIN_BBYMIN": 43.141667, "MAX_BBYMIN": 43.475000, "MIN_BBYMAX": 44.090162, "MAX_BBYMAX": 44.125000, "MEAN_BBXC": -79.464213, "MEAN_BBYC": 43.712937, "COMPARE": 0, "GN_ASCII": "Toronto", "FEATURE_CL": "P", "FEATURE_CO": "PPL", "ADMIN1_COD": 8.000000, "GN_POP": 4612191.000000, "ELEVATION": 0.000000, "GTOPO30": 173.000000, "TIMEZONE": "America\/Toronto", "GEONAMESNO": "Geonames ascii name + lat.d + long.d matching.", "UN_FID": 14, "UN_ADM0": "Canada", "UN_LAT": 43.720000, "UN_LONG": -79.410000, "POP1950": 1068.000000, "POP1955": 1365.000000, "POP1960": 1744.000000, "POP1965": 2093.000000, "POP1970": 2535.000000, "POP1975": 2770.000000, "POP1980": 3008.000000, "POP1985": 3355.000000, "POP1990": 3807.000000, "POP1995": 4197.000000, "POP2000": 4607.000000, "POP2005": 5
035.000000, "POP2010": 5213.000000, "POP2015": 5447.000000, "POP2020": 5687.000000, "POP2025": 5827.000000, "POP2050": 5946.000000, "CITYALT": null }, "geometry": { "type": "Point", "coordinates": [ -79.421966652988431, 43.701925736408441 ] } },
-{ "type": "Feature", "properties": { "SCALERANK": 0, "NATSCALE": 600, "LABELRANK": 1, "FEATURECLA": "Admin-0 capital", "NAME": "Beijing", "NAMEPAR": null, "NAMEALT": null, "DIFFASCII": 0, "NAMEASCII": "Beijing", "ADM0CAP": 1.000000, "CAPALT": 0.000000, "CAPIN": null, "WORLDCITY": 1.000000, "MEGACITY": 1, "SOV0NAME": "China", "SOV_A3": "CHN", "ADM0NAME": "China", "ADM0_A3": "CHN", "ADM1NAME": "Beijing", "ISO_A2": "CN", "NOTE": null, "LATITUDE": 39.928892, "LONGITUDE": 116.388286, "CHANGED": 0.000000, "NAMEDIFF": 0, "DIFFNOTE": null, "POP_MAX": 11106000, "POP_MIN": 7480601, "POP_OTHER": 9033231, "RANK_MAX": 14, "RANK_MIN": 13, "GEONAMEID": 1816670.000000, "MEGANAME": "Beijing", "LS_NAME": "Beijing", "LS_MATCH": 1, "CHECKME": 0, "MAX_POP10": 10190861.000000, "MAX_POP20": 11120470.000000, "MAX_POP50": 16510327.000000, "MAX_POP300": 23647944.000000, "MAX_POP310": 137121250.000000, "MAX_NATSCA": 300.000000, "MIN_AREAKM": 2512.000000, "MAX_AREAKM": 118844.000000, "MIN_AREAMI": 970.000000,
"MAX_AREAMI": 45886.000000, "MIN_PERKM": 1837.000000, "MAX_PERKM": 93615.000000, "MIN_PERMI": 1141.000000, "MAX_PERMI": 58169.000000, "MIN_BBXMIN": 111.441667, "MAX_BBXMIN": 116.058333, "MIN_BBXMAX": 117.208333, "MAX_BBXMAX": 117.325000, "MIN_BBYMIN": 31.883333, "MAX_BBYMIN": 39.658333, "MIN_BBYMAX": 40.433333, "MAX_BBYMAX": 40.466667, "MEAN_BBXC": 115.929521, "MEAN_BBYC": 38.837783, "COMPARE": 0, "GN_ASCII": "Beijing", "FEATURE_CL": "P", "FEATURE_CO": "PPLC", "ADMIN1_COD": 22.000000, "GN_POP": 7480601.000000, "ELEVATION": 0.000000, "GTOPO30": 63.000000, "TIMEZONE": "Asia\/Harbin", "GEONAMESNO": "GeoNames match general.", "UN_FID": 24, "UN_ADM0": "China", "UN_LAT": 39.900000, "UN_LONG": 116.380000, "POP1950": 4331.000000, "POP1955": 4628.000000, "POP1960": 4945.000000, "POP1965": 5284.000000, "POP1970": 5646.000000, "POP1975": 6034.000000, "POP1980": 6448.000000, "POP1985": 6890.000000, "POP1990": 7362.000000, "POP1995": 8486.000000, "POP2000": 9782.000000, "POP2005": 10717.000000,
"POP2010": 11106.000000, "POP2015": 11741.000000, "POP2020": 12842.000000, "POP2025": 13807.000000, "POP2050": 14545.000000, "CITYALT": null }, "geometry": { "type": "Point", "coordinates": [ 116.386339825659434, 39.930838089909059 ] } },
-{ "type": "Feature", "properties": { "SCALERANK": 4, "NATSCALE": 50, "LABELRANK": 1, "FEATURECLA": "Populated place", "NAME": "Ashburn", "NAMEPAR": null, "NAMEALT": null, "DIFFASCII": 0, "NAMEASCII": "Ashburn", "ADM0CAP": 0.000000, "CAPALT": 0.000000, "CAPIN": null, "WORLDCITY": 0.000000, "MEGACITY": 1, "SOV0NAME": "United States", "SOV_A3": "USA", "ADM0NAME": "United States of America", "ADM0_A3": "USA", "ADM1NAME": "Maryland", "ISO_A2": "US", "NOTE": null, "LATITUDE": 39.299990, "LONGITUDE": -76.619985, "CHANGED": 0.000000, "NAMEDIFF": 0, "DIFFNOTE": null, "POP_MAX": 2255000, "POP_MIN": 610892, "POP_OTHER": 1689307, "RANK_MAX": 12, "RANK_MIN": 11, "GEONAMEID": 4347778.000000, "MEGANAME": "Ashburn", "LS_NAME": "Ashburn", "LS_MATCH": 1, "CHECKME": 0, "MAX_POP10": 1776808.000000, "MAX_POP20": 1912760.000000, "MAX_POP50": 1912760.000000, "MAX_POP300": 0.000000, "MAX_POP310": 0.000000, "MAX_NATSCA": 50.000000, "MIN_AREAKM": 1079.000000, "MAX_AREAKM": 1256.000000, "MIN_AREAMI": 417.0000
00, "MAX_AREAMI": 485.000000, "MIN_PERKM": 645.000000, "MAX_PERKM": 832.000000, "MIN_PERMI": 401.000000, "MAX_PERMI": 517.000000, "MIN_BBXMIN": -76.934897, "MAX_BBXMIN": -76.934897, "MIN_BBXMAX": -76.400000, "MAX_BBXMAX": -76.400000, "MIN_BBYMIN": 38.975000, "MAX_BBYMIN": 39.075599, "MIN_BBYMAX": 39.533333, "MAX_BBYMAX": 39.533333, "MEAN_BBXC": -76.655503, "MEAN_BBYC": 39.269123, "COMPARE": 0, "GN_ASCII": "Ashburn", "FEATURE_CL": "P", "FEATURE_CO": "PPL", "ADMIN1_COD": 0.000000, "GN_POP": 610892.000000, "ELEVATION": 10.000000, "GTOPO30": 2.000000, "TIMEZONE": "America\/New_York", "GEONAMESNO": "Geonames ascii name + lat.d + long.d matching.", "UN_FID": 526, "UN_ADM0": "United States of America", "UN_LAT": 39.320000, "UN_LONG": -76.610000, "POP1950": 1168.000000, "POP1955": 1290.000000, "POP1960": 1422.000000, "POP1965": 1486.000000, "POP1970": 1555.000000, "POP1975": 1650.000000, "POP1980": 1749.000000, "POP1985": 1797.000000, "POP1990": 1849.000000, "POP1995": 1962.000000, "POP2000
": 2083.000000, "POP2005": 2207.000000, "POP2010": 2255.000000, "POP2015": 2322.000000, "POP2020": 2422.000000, "POP2025": 2508.000000, "POP2050": 2578.000000, "CITYALT": null }, "geometry": { "type": "Point", "coordinates": [ -76.621930845685483, 39.301935908916732 ] } },
-{ "type": "Feature", "properties": { "SCALERANK": 3, "NATSCALE": 110, "LABELRANK": 1, "FEATURECLA": "Admin-1 capital", "NAME": "Raleigh", "NAMEPAR": null, "NAMEALT": null, "DIFFASCII": 0, "NAMEASCII": "Raleigh", "ADM0CAP": 0.000000, "CAPALT": 0.000000, "CAPIN": null, "WORLDCITY": 0.000000, "MEGACITY": 0, "SOV0NAME": "United States", "SOV_A3": "USA", "ADM0NAME": "United States of America", "ADM0_A3": "USA", "ADM1NAME": "North Carolina", "ISO_A2": "US", "NOTE": null, "LATITUDE": 35.818781, "LONGITUDE": -78.644693, "CHANGED": 0.000000, "NAMEDIFF": 0, "DIFFNOTE": null, "POP_MAX": 1163515, "POP_MIN": 416468, "POP_OTHER": 656353, "RANK_MAX": 12, "RANK_MIN": 10, "GEONAMEID": 4487042.000000, "MEGANAME": null, "LS_NAME": "Raleigh", "LS_MATCH": 1, "CHECKME": 0, "MAX_POP10": 672592.000000, "MAX_POP20": 686323.000000, "MAX_POP50": 686323.000000, "MAX_POP300": 686323.000000, "MAX_POP310": 0.000000, "MAX_NATSCA": 100.000000, "MIN_AREAKM": 665.000000, "MAX_AREAKM": 691.000000, "MIN_AREAMI": 257.00
0000, "MAX_AREAMI": 267.000000, "MIN_PERKM": 520.000000, "MAX_PERKM": 553.000000, "MIN_PERMI": 323.000000, "MAX_PERMI": 344.000000, "MIN_BBXMIN": -78.916667, "MAX_BBXMIN": -78.903728, "MIN_BBXMAX": -78.458333, "MAX_BBXMAX": -78.458333, "MIN_BBYMIN": 35.625000, "MAX_BBYMIN": 35.625000, "MIN_BBYMAX": 36.000000, "MAX_BBYMAX": 36.000000, "MEAN_BBXC": -78.682861, "MEAN_BBYC": 35.811316, "COMPARE": 0, "GN_ASCII": "Raleigh", "FEATURE_CL": "P", "FEATURE_CO": "PPLA", "ADMIN1_COD": 0.000000, "GN_POP": 276093.000000, "ELEVATION": 96.000000, "GTOPO30": 91.000000, "TIMEZONE": "America\/New_York", "GEONAMESNO": "GeoNames match general.", "UN_FID": 0, "UN_ADM0": null, "UN_LAT": 0.000000, "UN_LONG": 0.000000, "POP1950": 0.000000, "POP1955": 0.000000, "POP1960": 0.000000, "POP1965": 0.000000, "POP1970": 0.000000, "POP1975": 0.000000, "POP1980": 0.000000, "POP1985": 0.000000, "POP1990": 0.000000, "POP1995": 0.000000, "POP2000": 0.000000, "POP2005": 0.000000, "POP2010": 0.000000, "POP2015": 0.000000,
"POP2020": 0.000000, "POP2025": 0.000000, "POP2050": 0.000000, "CITYALT": null }, "geometry": { "type": "Point", "coordinates": [ -78.644693442484481, 35.818781350745724 ] } }
-]
-}
---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@qpid.apache.org
For additional commands, e-mail: commits-help@qpid.apache.org
[06/19] qpid-dispatch git commit: moved standalone to a subdir
Posted by ea...@apache.org.
http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/4940e63d/console/stand-alone/plugin/html/qdrCharts.html
----------------------------------------------------------------------
diff --git a/console/stand-alone/plugin/html/qdrCharts.html b/console/stand-alone/plugin/html/qdrCharts.html
new file mode 100644
index 0000000..8ba1ffe
--- /dev/null
+++ b/console/stand-alone/plugin/html/qdrCharts.html
@@ -0,0 +1,150 @@
+<div class="main-display row-fluid qdrCharts" ng-controller="QDR.ChartsController">
+ <div ng-show="hasCharts()">
+ <div ng-repeat="chart in svgCharts" class="chartContainer">
+ <p class="chartLabels">
+ <button ng-click="delChart(chart)" title="Delete"><i class="icon-trash"></i></button>
+ <button ng-click="editChart(chart)" title="Configure"><i class="icon-edit"></i></button>
+ <button ng-click="zoomChart(chart)" title="Zoom {{chart.zoomed ? 'in' : 'out'}}" ng-if="!chart.chart.request().nodeList"><i ng-class="chart.zoomed ? 'icon-zoom-in' : 'icon-zoom-out'"></i></button>
+ </p><div style="clear:both"></div>
+ <div id="{{chart.chart.id()}}" class="aChart d3Chart"></div>
+ </div>
+ <div ng-init="chartsLoaded()"></div>
+ </div>
+ <div ng-hide="hasCharts()" class="centered">
+ There are no charts. To add charts to this page, click on a <i class="icon-bar-chart"></i> icon on the <button ng-click="showListPage()"><i class="icon-list "></i> List</button> page.
+ </div>
+</div>
+
+<!--
+ This is the template for the graph dialog that is displayed. It uses the
+ dialogCtrl controller in qdrCharts.js.
+-->
+<script type="text/ng-template" id="chart-config-template.html">
+<div class="chartOptions">
+ <div class="modal-header">
+ <h3 class="modal-title">Chart {{chart.attr() | humanify}}</h3>
+ </div>
+ <div class="modal-body">
+ <div id="{{svgDivId}}" class="d3Chart"></div>
+ <uib-tabset>
+ <uib-tab heading="Type">
+ <legend>Chart type</legend>
+ <label><input type="radio" ng-model="dialogChart.type" value="value" ng-change="chartChanged()" /> Value Chart</label>
+ <label><input type="radio" ng-model="dialogChart.type" value="rate" ng-change="chartChanged()" /> Rate Chart</label>
+ <div class="dlg-slider" ng-show="dialogChart.type=='rate'">
+ <span>Rate Window: {{rateWindow}} second{{rateWindow > 1 ? "s" : ""}}</span>
+ <div class="slider" ui-slider="slider.options" ng-model="rateWindow"></div>
+ </div>
+ <div style="clear:both;"> </div>
+ </uib-tab>
+ <uib-tab heading="Colors">
+ <legend>Chart colors</legend>
+ <div class="colorPicker">
+ <div>Area</div><input minicolors="areaColor" id="position-bottom-left" type="text" ng-model="dialogChart.areaColor" />
+ </div>
+ <div class="colorPicker">
+ <div>Line</div><input minicolors="lineColor" id="position-bottom-left" type="text" ng-model="dialogChart.lineColor" />
+ </div>
+ <div style="clear:both;"> </div>
+ </uib-tab>
+ <uib-tab heading="Duration">
+ <legend>Chart duration</legend>
+ <div class="dlg-slider duration">
+ <span>Show data for past {{dialogChart.visibleDuration}} minute{{dialogChart.visibleDuration > 1 ? "s" : ""}}</span> <div class="slider" ui-slider="duration.options" ng-model="dialogChart.visibleDuration"></div>
+ </div>
+ <div style="clear:both;"> </div>
+
+ </uib-tab>
+ </uib-tabset>
+ </div>
+ <div class="modal-footer">
+ <button class="btn btn-success" type="button" ng-click="apply()">Apply to existing chart</button>
+ <button class="btn btn-info" type="button" ng-click="copyToDashboard()">Create new chart</button>
+ <button class="btn btn-primary" type="button" ng-click="okClick()">Close</button>
+ </div>
+</div>
+<!--
+ <div class="chartOptions" title="Configure chart" ng-controller="QDR.ChartDialogController">
+ <p class="dialogHeader">Title: <input type="text" ng-model="userTitle" /></p>
+ <div id="{{svgDivId}}" class="d3Chart"></div>
+ <p></p>
+ <uib-tabset>
+ <uib-tab heading="Type">
+ <legend>Chart type</legend>
+ <label><input type="radio" ng-model="dialogChart.type" value="value" ng-change="chartChanged()" /> Value Chart</label>
+ <label><input type="radio" ng-model="dialogChart.type" value="rate" ng-change="chartChanged()" /> Rate Chart</label>
+
+ <div class="dlg-slider" ng-show="dialogChart.type=='rate'">
+ <span>Rate Window: {{rateWindow}} second{{rateWindow > 1 ? "s" : ""}}</span>
+ <div class="slider" ui-slider="slider.options" ng-model="rateWindow"></div>
+ </div>
+ <div style="clear:both;"> </div>
+ </uib-tab>
+ <uib-tab heading="Colors">
+ <legend>Chart colors</legend>
+ <div class="colorPicker">
+ <div>Area</div><input minicolors="areaColor" id="position-bottom-left" type="text" ng-model="dialogChart.areaColor" />
+ </div>
+ <div class="colorPicker">
+ <div>Line</div><input minicolors="lineColor" id="position-bottom-left" type="text" ng-model="dialogChart.lineColor" />
+ </div>
+ <div style="clear:both;"> </div>
+ </uib-tab>
+ <uib-tab heading="Duration">
+ <legend>Chart duration</legend>
+ <div class="dlg-slider duration">
+ <span>Show data for past {{dialogChart.visibleDuration}} minute{{dialogChart.visibleDuration > 1 ? "s" : ""}}</span> <div class="slider" ui-slider="duration.options" ng-model="dialogChart.visibleDuration"></div>
+ </div>
+ <div style="clear:both;"> </div>
+
+ </uib-tab>
+ </uib-tabset>
+
+ <tabset>
+ <tab heading="Type">
+ <div>
+ <legend>Chart type</legend>
+ <label>
+ <input type="radio" ng-model="dialogChart.type" value="value" ng-change="chartChanged()" />
+ Value Chart
+ </label>
+ <label class="rateGroup">
+ <input type="radio" ng-model="dialogChart.type" value="rate" ng-change="chartChanged()" /> Rate Chart
+ </label>
+ <div class="dlg-slider" ng-show="dialogChart.type=='rate'">
+ <span>Rate Window: {{rateWindow}} second{{rateWindow > 1 ? "s" : ""}}</span> <div class="slider" ui-slider="slider.options" ng-model="rateWindow"></div>
+ </div>
+ </div>
+ <div style="clear:both;"> </div>
+ </tab>
+ <tab heading="Colors">
+ <div>
+ <legend>Chart colors</legend>
+ <div class="colorPicker">
+ <div>Area</div><input minicolors="areaColor" id="position-bottom-left" type="text" ng-model="dialogChart.areaColor" />
+ </div>
+ <div class="colorPicker">
+ <div>Line</div><input minicolors="lineColor" id="position-bottom-left" type="text" ng-model="dialogChart.lineColor" />
+ </div>
+ </div>
+ <div style="clear:both;"> </div>
+ </tab>
+ <tab heading="Duration">
+ <div>
+ <legend>Chart duration</legend>
+ </div>
+ <div class="dlg-slider duration">
+ <span>Show data for past {{dialogChart.visibleDuration}} minute{{dialogChart.visibleDuration > 1 ? "s" : ""}}</span> <div class="slider" ui-slider="duration.options" ng-model="dialogChart.visibleDuration"></div>
+ </div>
+ <div style="clear:both;"> </div>
+ </tab>
+ </tabset>
+ <div class="okButton">
+ <button ng-click="apply()">Apply to existing chart</button>
+ <button ng-click="copyToDashboard()">Create new chart</button>
+ <button ng-click="okClick()">Close</button>
+ </div>
+ </div>
+-->
+</script>
+
http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/4940e63d/console/stand-alone/plugin/html/qdrConnect.html
----------------------------------------------------------------------
diff --git a/console/stand-alone/plugin/html/qdrConnect.html b/console/stand-alone/plugin/html/qdrConnect.html
new file mode 100644
index 0000000..34e452f
--- /dev/null
+++ b/console/stand-alone/plugin/html/qdrConnect.html
@@ -0,0 +1,65 @@
+<div class="row-fluid" ng-controller="QDR.SettingsController">
+ <div class="login container" ng-hide="connecting">
+ <div class="row" id="login-container">
+ <div class="span2 offset4">
+ <!-- <div simple-form name="settings" data="formConfig" entity="formEntity"></div> -->
+ <form class="form-horizontal no-bottom-margin" novalidate name="settings" action="" method="post">
+ <fieldset>
+ <div class="control-group">
+ <label class="control-label">Address: </label>
+ <div class="controls">
+ <input type="text" description="Router address" ng-model="formEntity.address" name="address" required="required" autofocus="autofocus" class="ng-pristine ng-valid ng-valid-required">
+ <span class="help-block"></span>
+ </div>
+ </div>
+ <div class="control-group">
+ <label class="control-label" title="Port to connect to, by default 5673">Port: </label>
+ <div class="controls">
+ <input type="number" description="Router port" tooltip="Ports to connect to, by default 5672" ng-model="formEntity.port" name="port" title="Port to connect to, by default 5673" class="ng-scope ng-pristine ng-valid ng-valid-number">
+ <span class="help-block"></span>
+ </div>
+ </div>
+ <!--
+ <div class="control-group">
+ <label class="control-label">Username: </label>
+ <div class="controls">
+ <input type="text" description="User Name" ng-model="formEntity.username" name="username" class="ng-pristine ng-valid">
+ <span class="help-block"></span>
+ </div>
+ </div>
+ <div class="control-group">
+ <label class="control-label">Password: </label>
+ <div class="controls">
+ <input type="password" description="Password" ng-model="formEntity.password" name="password" class="ng-pristine ng-valid">
+ <span class="help-block"></span>
+ </div>
+ </div>
+ -->
+ <div class="control-group">
+ <label class="control-label" title="Whether or not the connection should be started as soon as you navigate to the console">Autostart: </label>
+ <div class="controls">
+ <input type="checkbox" description="Connect at startup" tooltip="Whether or not the connection should be started as soon as you navigate to the console" ng-model="formEntity.autostart" name="autostart" title="Whether or not the connection should be started as soon as you log into hawtio" class="ng-scope ng-pristine ng-valid">
+ <span class="help-block"></span>
+ </div>
+ </div>
+ <input type="submit" style="position: absolute; left: -9999px; width: 1px; height: 1px;">
+ </fieldset>
+ </form>
+ <p></p>
+ <div>
+ <button class="btn btn-primary pull-right" ng-disabled="settings.$invalid" ng-click="connect()">{{buttonText()}}</button>
+ </div>
+ </div>
+ </div>
+ </div>
+
+ <div class="span4 centered" ng-show="connecting">
+ <i class="icon-spin icon-spinner icon-4x"></i>
+ <p>Please wait, connecting now...</p>
+ </div>
+ <div class="centered" ng-show="connectionError">
+ <p>There was a connection error: {{connectionErrorText}}</p>
+ </div>
+
+ <div class="span4"></div>
+</div>
http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/4940e63d/console/stand-alone/plugin/html/qdrGraphs.html
----------------------------------------------------------------------
diff --git a/console/stand-alone/plugin/html/qdrGraphs.html b/console/stand-alone/plugin/html/qdrGraphs.html
new file mode 100644
index 0000000..c311246
--- /dev/null
+++ b/console/stand-alone/plugin/html/qdrGraphs.html
@@ -0,0 +1,15 @@
+<div ng-controller="QDR.ListController" title=""
+ class="prefs">
+ <div class="row-fluid">
+ <div class="tabbable">
+ <div value="graphs"
+ class="tab-pane"
+ title="graphs">
+ <div>
+ <div id="graph"></div>
+
+ </div>
+ </div>
+ </div>
+ </div>
+</div>
http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/4940e63d/console/stand-alone/plugin/html/qdrLayout.html
----------------------------------------------------------------------
diff --git a/console/stand-alone/plugin/html/qdrLayout.html b/console/stand-alone/plugin/html/qdrLayout.html
new file mode 100644
index 0000000..d164f8a
--- /dev/null
+++ b/console/stand-alone/plugin/html/qdrLayout.html
@@ -0,0 +1,26 @@
+<!--
+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.
+-->
+<ul class="nav nav-tabs connected" ng-controller="QDR.NavBarController">
+ <li ng-repeat="link in breadcrumbs" ng-show="isValid(link)" ng-class='{active : isActive(link.href), "pull-right" : isRight(link), haschart: hasChart(link)}'>
+ <a ng-href="{{link.href}}{{hash}}" ng-bind-html="link.content | to_trusted"></a>
+ </li>
+</ul>
+<div class="row-fluid">
+ <div ng-view></div>
+</div>
http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/4940e63d/console/stand-alone/plugin/html/qdrList.html
----------------------------------------------------------------------
diff --git a/console/stand-alone/plugin/html/qdrList.html b/console/stand-alone/plugin/html/qdrList.html
new file mode 100644
index 0000000..156b21a
--- /dev/null
+++ b/console/stand-alone/plugin/html/qdrList.html
@@ -0,0 +1,56 @@
+<!--
+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="main-display row-fluid qdrList" ng-controller="QDR.ListController">
+ <ul class="nav nav-tabs qdrListNodes">
+ <li ng-repeat="node in nodes" ng-click="selectNode(node)" ng-class="{active : isNodeSelected(node.id)}"> <span>{{node.name}}</span> </li>
+ </ul>
+
+ <div class="row-fluid qdrListActions">
+ <ul class="nav nav-tabs ng-scope">
+ <li ng-repeat="entity in entities" ng-class="{active : isActionActive(entity.name)}" ng-click="selectAction(entity.name)" >
+ <a title="{{entity.title}}" data-placement="bottom"> {{entity.humanName}} </a></li>
+ </ul>
+ <div class="gridStyle" ng-style="getTableHeight()" ui-grid-auto-resize ui-grid-selection ui-grid="gridDef"></div>
+ <div class="selectedItems">
+ <div ng-style="getDetailsTableHeight()" ui-grid-auto-resize ui-grid-selection ui-grid="details"></div>
+ </div>
+ </div>
+</div>
+<!--
+ This is the template for the graph dialog that is displayed. It uses the
+ dialogCtrl controller in qdrList.js.
+-->
+<script type="text/ng-template" id="template-from-script.html">
+ <div class="modal-header">
+ <h3 class="modal-title">Chart {{chart.attr() | humanify}}</h3>
+ </div>
+ <div class="modal-body">
+ <div id="{{svgDivId}}" class="d3Chart"></div>
+ </div>
+ <div class="modal-footer">
+ <span ng-hide="isOnChartsPage()">
+ <button class="btn btn-success" type="button" ng-click="addChartsPage()"><i class="icon-bar-chart"></i> Add</button> this chart to the Charts page.
+ </span>
+ <span ng-show="isOnChartsPage()">
+ <button class="btn btn-danger" type="button" ng-click="delChartsPage()">Remove</button> this chart from the <button class="btn btn-success" type="button" ng-click="showChartsPage()"><i class="icon-bar-chart"></i> Charts</button> page.
+ </span>
+ <button class="btn btn-primary" type="button" ng-click="ok()">Close</button>
+ </div>
+</script>
+
http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/4940e63d/console/stand-alone/plugin/html/qdrOverview.html
----------------------------------------------------------------------
diff --git a/console/stand-alone/plugin/html/qdrOverview.html b/console/stand-alone/plugin/html/qdrOverview.html
new file mode 100644
index 0000000..d63ea0e
--- /dev/null
+++ b/console/stand-alone/plugin/html/qdrOverview.html
@@ -0,0 +1,83 @@
+<!--
+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 ng-controller="QDR.OverviewController">
+
+ <div class="treeContainer">
+ <div id="overtree"></div>
+ </div>
+
+ <div class="treeDetails" ng-include="template.url"></div>
+</div>
+
+
+<!-- the following scripts are content that gets loaded into the above div that has the temple.url -->
+<script type="text/ng-template" id="routers.html">
+ <div class="row-fluid">
+ <h3>Routers</h3>
+ <div class="overview">
+ <div class="gridStyle" ng-style="getGridHeight(allRouters)" ui-grid-auto-resize ui-grid-selection ui-grid="allRouters"></div>
+ </div>
+ </div>
+</script>
+
+<script type="text/ng-template" id="router.html">
+ <div class="row-fluid">
+ <h3>Router {{router.data.title}}</h3>
+ <div ng-style="getGridHeight(routerGrid)" ui-grid-auto-resize ui-grid="routerGrid" class="gridStyle noHighlight"></div>
+ </div>
+</script>
+
+<script type="text/ng-template" id="addresses.html">
+ <div class="row-fluid">
+ <h3>Addresses</h3>
+ <div class="overview">
+ <div class="gridStyle" ng-style="getGridHeight(addressGrid)" ui-grid-auto-resize ui-grid-selection ui-grid="addressGrid"></div>
+ </div>
+ </div>
+</script>
+<script type="text/ng-template" id="address.html">
+ <div class="row-fluid">
+ <h3>Address {{address.data.title}}</h3>
+ <div ng-style="getGridHeight(addressGrid)" ui-grid-auto-resize class="gridStyle noHighlight" ui-grid="addressGrid"></div>
+ </div>
+</script>
+<script type="text/ng-template" id="connections.html">
+ <div class="row-fluid">
+ <h3>Connections</h3>
+ <div class="overview">
+ <div class="gridStyle" ng-style="getGridHeight(allConnectionGrid)" ui-grid-auto-resize ui-grid-selection ui-grid="allConnectionGrid"></div>
+ </div>
+ </div>
+</script>
+<script type="text/ng-template" id="connection.html">
+ <div class="row-fluid">
+ <h3>Connection {{connection.data.title}}</h3>
+ <div ng-style="getGridHeight(connectionGrid)" ui-grid-auto-resize class="gridStyle noHighlight" ui-grid="connectionGrid"></div>
+ </div>
+</script>
+<script type="text/ng-template" id="logs.html">
+ <div class="row-fluid">
+ <h3>Logs</h3>
+ </div>
+</script>
+<script type="text/ng-template" id="log.html">
+ <div class="row-fluid">
+ <h3>Log {{log.data.title}}</h3>
+ </div>
+</script>
http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/4940e63d/console/stand-alone/plugin/html/qdrSchema.html
----------------------------------------------------------------------
diff --git a/console/stand-alone/plugin/html/qdrSchema.html b/console/stand-alone/plugin/html/qdrSchema.html
new file mode 100644
index 0000000..15ebb46
--- /dev/null
+++ b/console/stand-alone/plugin/html/qdrSchema.html
@@ -0,0 +1,21 @@
+<!--
+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="main-display row-fluid" ng-controller="QDR.SchemaController">
+ <json-formatter json="schema" open="2"></json-formatter>
+</div>
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/4940e63d/console/stand-alone/plugin/img/ZeroClipboard.swf
----------------------------------------------------------------------
diff --git a/console/stand-alone/plugin/img/ZeroClipboard.swf b/console/stand-alone/plugin/img/ZeroClipboard.swf
new file mode 100644
index 0000000..a3aaa20
Binary files /dev/null and b/console/stand-alone/plugin/img/ZeroClipboard.swf differ
http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/4940e63d/console/stand-alone/plugin/img/ajax-loader.gif
----------------------------------------------------------------------
diff --git a/console/stand-alone/plugin/img/ajax-loader.gif b/console/stand-alone/plugin/img/ajax-loader.gif
new file mode 100644
index 0000000..3c2f7c0
Binary files /dev/null and b/console/stand-alone/plugin/img/ajax-loader.gif differ
http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/4940e63d/console/stand-alone/plugin/img/dynatree/icons.gif
----------------------------------------------------------------------
diff --git a/console/stand-alone/plugin/img/dynatree/icons.gif b/console/stand-alone/plugin/img/dynatree/icons.gif
new file mode 100644
index 0000000..6e237a0
Binary files /dev/null and b/console/stand-alone/plugin/img/dynatree/icons.gif differ
http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/4940e63d/console/stand-alone/plugin/img/dynatree/loading.gif
----------------------------------------------------------------------
diff --git a/console/stand-alone/plugin/img/dynatree/loading.gif b/console/stand-alone/plugin/img/dynatree/loading.gif
new file mode 100644
index 0000000..2a96840
Binary files /dev/null and b/console/stand-alone/plugin/img/dynatree/loading.gif differ
http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/4940e63d/console/stand-alone/plugin/js/navbar.js
----------------------------------------------------------------------
diff --git a/console/stand-alone/plugin/js/navbar.js b/console/stand-alone/plugin/js/navbar.js
new file mode 100644
index 0000000..ebda4d4
--- /dev/null
+++ b/console/stand-alone/plugin/js/navbar.js
@@ -0,0 +1,119 @@
+/*
+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) {
+
+ /**
+ * @property breadcrumbs
+ * @type {{content: string, title: string, isValid: isValid, href: string}[]}
+ *
+ * Data structure that defines the sub-level tabs for
+ * our plugin, used by the navbar controller to show
+ * or hide tabs based on some criteria
+ */
+ QDR.breadcrumbs = [
+ {
+ content: '<i class="icon-cogs"></i> Connect',
+ title: "Connect to a router",
+ isValid: function () { return true; },
+ href: "#connect"
+ },
+ {
+ content: '<i class="fa fa-home"></i> Overview',
+ title: "View router overview",
+ isValid: function (QDRService) { return QDRService.isConnected(); },
+ href: "#/overview"
+ },
+ {
+ content: '<i class="icon-star-empty"></i> Topology',
+ title: "View router network topology",
+ isValid: function (QDRService) { return QDRService.isConnected(); },
+ href: "#/topology"
+ },
+ {
+ content: '<i class="icon-list "></i> List',
+ title: "View router nodes as a list",
+ isValid: function (QDRService) { return QDRService.isConnected(); },
+ href: "#/list"
+ },
+ {
+ content: '<i class="icon-bar-chart"></i> Charts',
+ title: "View charts",
+ isValid: function (QDRService, $location) { return QDRService.isConnected(); },
+ href: "#/charts"
+ },
+ {
+ content: '<i class="icon-align-left"></i> Schema',
+ title: "View dispatch schema",
+ isValid: function (QDRService) { return QDRService.isConnected(); },
+ href: "#/schema",
+ right: true
+
+ }
+ ];
+ /**
+ * @function NavBarController
+ *
+ * @param $scope
+ * @param workspace
+ *
+ * The controller for this plugin's navigation bar
+ *
+ */
+ QDR.module.controller("QDR.NavBarController", ['$scope', '$sce', 'QDRService', 'QDRChartService', '$location', function($scope, $sce, QDRService, QDRChartService, $location) {
+
+ QDR.log.debug("navbar started with location.url: " + $location.url());
+ QDR.log.debug("navbar started with window.location.pathname : " + window.location.pathname);
+
+ if ($location.path().startsWith("/topology")
+ && !QDRService.isConnected()) {
+ $location.path("/connect");
+ }
+
+ if ($location.path().startsWith("/connect")
+ && QDRService.isConnected()) {
+ $location.path("/topology");
+ }
+
+ $scope.breadcrumbs = QDR.breadcrumbs;
+
+ $scope.isValid = function(link) {
+ return link.isValid(QDRService, $location);
+ };
+
+ $scope.isActive = function(href) {
+ return href.split("#")[1] == $location.path();
+ };
+
+ $scope.isRight = function (link) {
+ return angular.isDefined(link.right);
+ };
+
+ $scope.hasChart = function (link) {
+ if (link.href == "#/charts") {
+ return QDRChartService.charts.some(function (c) { return c.dashboard });
+ }
+ }
+ }]);
+
+ return QDR;
+
+} (QDR || {}));
http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/4940e63d/console/stand-alone/plugin/js/qdrChartService.js
----------------------------------------------------------------------
diff --git a/console/stand-alone/plugin/js/qdrChartService.js b/console/stand-alone/plugin/js/qdrChartService.js
new file mode 100644
index 0000000..6535384
--- /dev/null
+++ b/console/stand-alone/plugin/js/qdrChartService.js
@@ -0,0 +1,956 @@
+/*
+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) {
+
+ // The QDR chart service handles periodic gathering data for charts and displaying the charts
+ QDR.module.factory("QDRChartService", ['$rootScope', 'QDRService', '$http', '$resource',
+ function($rootScope, QDRService, $http, $resource) {
+
+ 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(name, attr, request) {
+
+ var base = findBase(name, attr, request);
+ if (!base) {
+ base = new ChartBase(name, attr, request);
+ bases.push(base);
+ }
+ this.base = base;
+ this.instance = instance++;
+ this.dashboard = false; // is this chart on the dashboard page
+ this.type = "value"; // value or rate
+ this.rateWindow = 1000; // calculate the rate of change over this time interval. higher == smother graph
+ this.areaColor = "#c0e0ff"; // the chart's area color when not an empty string
+ this.lineColor = "#4682b4"; // the chart's line color when not an empty string
+ this.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 key = this.request().nodeId + this.request().entity + this.name() + this.attr() + "_" + this.instance;
+ // 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;
+ 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.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());
+ 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(this.nodeId(), this.entity(),
+ this.name(), this.attr(), this.interval(), true, this.base.request.aggregate);
+ 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(nodeId, entity, name, attr, interval, aggregate) {
+ this.duration = 10; // number of minutes to keep the data
+ this.nodeId = nodeId; // eg amqp:/_topo/0/QDR.A/$management
+ this.entity = entity; // eg .router.address
+ // sorted since the responses will always be sorted
+ this.aggregate = 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 = interval; // 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(name, 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);
+ }
+ };
+ 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();
+ },
+
+ 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 (name, attr, nodeId, entity) {
+ return self.charts.filter( function (chart) {
+ return (chart.name() == name &&
+ chart.attr() == attr &&
+ chart.nodeId() == nodeId &&
+ chart.entity() == entity)
+ });
+ },
+
+ 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) {
+ 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)
+ self.saveCharts();
+ }
+ }
+ if (foundBases == 1) {
+ var baseIndex = bases.indexOf(chart.base)
+ bases.splice(baseIndex, 1);
+ }
+ },
+
+ registerChart: function (nodeId, entity, name, attr, interval, forceCreate, aggregate) {
+ var request = self.findChartRequest(nodeId, entity, aggregate);
+ if (request) {
+ // add any new attr or name to the list
+ request.addAttrName(name, attr)
+ } else {
+ // the nodeId/entity did not already exist, so add a new request and chart
+ QDR.log.debug("added new request: " + nodeId + " " + entity);
+ request = new ChartRequest(nodeId, entity, name, attr, interval, aggregate);
+ self.chartRequests.push(request);
+ self.startCollecting(request);
+ }
+ var charts = self.findCharts(name, attr, nodeId, entity);
+ var chart;
+ if (charts.length == 0 || forceCreate) {
+ chart = new Chart(name, attr, 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) {
+ // remove the chart
+ 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);
+ 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);
+ }
+ }
+ }
+ }
+ },
+
+ 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);
+ },
+ // send the request
+ sendChartRequest: function (request) {
+ // 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) {
+ //QDR.log.debug("got chart results for " + nodeId + " " + entity);
+ // records 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 send another request
+ request.setTimeoutHandle = setTimeout(self.sendChartRequest, request.interval, request)
+ },
+
+ numCharts: function () {
+ return self.charts.length;
+ },
+
+ isAttrCharted: function (nodeId, entity, name, attr) {
+ var charts = self.findCharts(name, attr, nodeId, entity);
+ // if any of the matching charts are on the dashboard page, return true
+ return charts.some(function (chart) {
+ return (chart.dashboard) });
+ },
+
+ 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.copyProps(minChart);
+ minCharts.push(minChart);
+ }
+ })
+ localStorage["QDRCharts"] = angular.toJson(minCharts);
+ },
+ loadCharts: function () {
+ var charts = angular.fromJson(localStorage["QDRCharts"]);
+ if (charts) {
+ charts.forEach(function (chart) {
+ if (!chart.interval)
+ chart.interval = 1000;
+ if (!chart.duration)
+ chart.duration = 10;
+ if (chart.nodeList)
+ chart.aggregate = true;
+ var newChart = self.registerChart(chart.nodeId, chart.entity, chart.name, chart.attr, chart.interval, true, chart.aggregate);
+ newChart.dashboard = true; // we only save the dashboard charts
+ newChart.type = chart.type;
+ newChart.rateWindow = chart.rateWindow;
+ newChart.areaColor = chart.areaColor ? chart.areaColor : "#c0e0ff";
+ newChart.lineColor = chart.lineColor ? chart.lineColor : "#4682b4";
+ newChart.duration(chart.duration);
+ newChart.visibleDuration = chart.visibleDuration ? chart.visibleDuration : 10;
+ if (chart.userTitle)
+ newChart.title(chart.userTitle);
+ })
+ }
+ },
+
+ AreaChart: function (chart, url) {
+ 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;
+ if (url)
+ url = "/dispatch" + url;
+ else
+ url = "";
+ this.url = url;
+
+ // 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;
+ 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)
+ .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) {
+ 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
+ }
+ 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 + ")");
+
+ 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");
+
+
+ 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];});
+ 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]});
+ var max = d3.max(data, function(d) {return d[1]});
+ 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()
+
+ //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; })
+
+ series.enter().append("g")
+ .append("path")
+ .attr("class", "area")
+ series.enter().append("path")
+ .attr("class", "line")
+
+ series.exit().remove()
+
+ // Update the area path.
+ container.select(".area").data([data])
+ .attr("d", area.y0(y.range()[0]))
+ .style("fill", attrs.areaColor);
+
+ //Update the line path.
+ container.select(".line").data([data])
+ .attr("d", line)
+ .style("stroke", attrs.lineColor)
+ }
+ // 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/4940e63d/console/stand-alone/plugin/js/qdrCharts.js
----------------------------------------------------------------------
diff --git a/console/stand-alone/plugin/js/qdrCharts.js b/console/stand-alone/plugin/js/qdrCharts.js
new file mode 100644
index 0000000..e484b07
--- /dev/null
+++ b/console/stand-alone/plugin/js/qdrCharts.js
@@ -0,0 +1,230 @@
+/*
+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) {
+
+ /**
+ * @method ChartsController
+ * @param $scope
+ * @param QDRServer
+ * @param QDRChartServer
+ *
+ * Controller that handles the QDR charts page
+ */
+ QDR.module.controller("QDR.ChartsController", ['$scope', 'QDRService', 'QDRChartService', '$uibModal', '$location',
+ function($scope, QDRService, QDRChartService, $uibModal, $location) {
+ var updateTimer = null;
+
+ QDR.log.debug("started Charts controller");
+ if (!angular.isDefined(QDRService.schema))
+ return;
+
+ $scope.svgCharts = [];
+ // create an svg object for each chart
+ QDRChartService.charts.filter(function (chart) {return chart.dashboard}).forEach(function (chart) {
+ var svgChart = new QDRChartService.AreaChart(chart, $location.$$path)
+ svgChart.zoomed = false;
+ $scope.svgCharts.push(svgChart);
+ })
+
+ // redraw the charts every second
+ var updateCharts = function () {
+ $scope.svgCharts.forEach(function (svgChart) {
+ svgChart.tick(svgChart.chart.id()); // on this page we are using the chart.id() as the div id in which to render the chart
+ })
+ updateHandle = setTimeout(updateCharts, 1100);
+ }
+ $scope.chartsLoaded = function () {
+ setTimeout(updateCharts, 0);
+ }
+
+ $scope.zoomChart = function (chart) {
+ chart.zoomed = !chart.zoomed;
+ chart.zoom(chart.chart.id(), chart.zoomed);
+ }
+ $scope.showListPage = function () {
+ $location.path("/list");
+ };
+
+ $scope.hasCharts = function () {
+ return QDRChartService.numCharts() > 0;
+ };
+
+ $scope.editChart = function (chart) {
+ doDialog("chart-config-template.html", chart.chart);
+ };
+
+ $scope.delChart = function (chart) {
+ QDRChartService.unRegisterChart(chart.chart);
+ // remove from svgCharts
+ $scope.svgCharts.forEach(function (svgChart, i) {
+ if (svgChart === chart) {
+ delete $scope.svgCharts.splice(i, 1);
+ }
+ })
+ };
+
+ // called from dialog when we want to clone the dialog chart
+ // the chart argument here is a QDRChartService chart
+ $scope.addChart = function (chart) {
+ $scope.svgCharts.push(new QDRChartService.AreaChart(chart, $location.$$path));
+ };
+
+ $scope.$on("$destroy", function( event ) {
+ if (updateTimer) {
+ cancelTimer(updateTimer);
+ updateTimer = null;
+ }
+ for (var i=$scope.svgCharts.length-1; i>=0; --i) {
+ delete $scope.svgCharts.splice(i, 1);
+ }
+ });
+
+ function doDialog(template, chart) {
+
+ var modalInstance = $uibModal.open({
+ animation: true,
+ templateUrl: template,
+ controller: 'QDR.ChartDialogController',
+ resolve: {
+ chart: function () {
+ return chart;
+ },
+ dashboard: function () {
+ return $scope;
+ }
+ }
+ });
+ };
+
+ }]);
+
+ QDR.module.controller("QDR.ChartDialogController", function($scope, QDRChartService, $location, $uibModalInstance, $rootScope, chart, dashboard) {
+ var dialogSvgChart = null;
+ $scope.svgDivId = "dialogChart"; // the div id for the svg chart
+
+ $scope.updateTimer = null;
+ $scope.chart = chart; // the underlying chart object from the dashboard
+ $scope.dialogChart = $scope.chart.copy(); // the chart object for this dialog
+ $scope.userTitle = $scope.chart.title();
+
+ $scope.$watch('userTitle', function(newValue, oldValue) {
+ if (newValue !== oldValue) {
+ $scope.dialogChart.title(newValue);
+ }
+ })
+ // the stored rateWindow is in milliseconds, but the slider is in seconds
+ $scope.rateWindow = $scope.chart.rateWindow / 1000;
+
+ var cleanup = function () {
+ if ($scope.updateTimer) {
+ clearTimeout($scope.updateTimer);
+ $scope.updateTimer = null;
+ }
+ QDRChartService.unRegisterChart($scope.dialogChart); // remove the chart
+ }
+ $scope.okClick = function () {
+ cleanup();
+ $uibModalInstance.close();
+ };
+
+ // initialize the rateWindow slider
+ $scope.slider = {
+ 'options': {
+ min: 1,
+ max: 10,
+ step: 1,
+ tick: true,
+ stop: function (event, ui) {
+ $scope.dialogChart.rateWindow = ui.value * 1000;
+ if (dialogSvgChart)
+ dialogSvgChart.tick($scope.svgDivId);
+ }
+ }
+ };
+
+ $scope.visibleDuration =
+ $scope.duration = {
+ 'options': {
+ min: 1,
+ max: 10,
+ step: 1,
+ tick: true,
+ stop: function (event, ui) {
+ if (dialogSvgChart)
+ dialogSvgChart.tick($scope.svgDivId);
+ }
+ }
+ };
+
+ // handle the Apply button click
+ // update the dashboard chart's properties
+ $scope.apply = function () {
+ $scope.chart.areaColor = $scope.dialogChart.areaColor;
+ $scope.chart.lineColor = $scope.dialogChart.lineColor;
+ $scope.chart.type = $scope.dialogChart.type;
+ $scope.chart.rateWindow = $scope.dialogChart.rateWindow;
+ $scope.chart.title($scope.dialogChart.title());
+ $scope.chart.visibleDuration = $scope.dialogChart.visibleDuration;
+ QDRChartService.saveCharts();
+ }
+
+ // add a new chart to the dashboard based on the current dialog settings
+ $scope.copyToDashboard = function () {
+ var chart = $scope.dialogChart.copy();
+ // set the new chart's dashboard state
+ QDRChartService.addDashboard(chart);
+ // notify the chart controller that it needs to display a new chart
+ dashboard.addChart(chart);
+ }
+
+ // update the chart on the popup dialog
+ var updateDialogChart = function () {
+ // draw the chart using the current data
+ if (dialogSvgChart)
+ dialogSvgChart.tick($scope.svgDivId);
+
+ // draw the chart again in 1 second
+ $scope.updateTimer = setTimeout(updateDialogChart, 1000);
+ }
+
+ var showChart = function () {
+ // ensure the div for our chart is loaded in the dom
+ var div = angular.element("#dialogChart");
+ if (!div.width()) {
+ setTimeout(showChart, 100);
+ return;
+ }
+ dialogSvgChart = new QDRChartService.AreaChart($scope.dialogChart, $location.$$path);
+ updateDialogChart();
+ }
+ showChart();
+
+
+ });
+
+ return QDR;
+
+}(QDR || {}));
+
---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@qpid.apache.org
For additional commands, e-mail: commits-help@qpid.apache.org
[13/19] qpid-dispatch git commit: moved standalone to a subdir
Posted by ea...@apache.org.
http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/4940e63d/console/plugin/js/qdrCharts.js
----------------------------------------------------------------------
diff --git a/console/plugin/js/qdrCharts.js b/console/plugin/js/qdrCharts.js
deleted file mode 100644
index e484b07..0000000
--- a/console/plugin/js/qdrCharts.js
+++ /dev/null
@@ -1,230 +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) {
-
- /**
- * @method ChartsController
- * @param $scope
- * @param QDRServer
- * @param QDRChartServer
- *
- * Controller that handles the QDR charts page
- */
- QDR.module.controller("QDR.ChartsController", ['$scope', 'QDRService', 'QDRChartService', '$uibModal', '$location',
- function($scope, QDRService, QDRChartService, $uibModal, $location) {
- var updateTimer = null;
-
- QDR.log.debug("started Charts controller");
- if (!angular.isDefined(QDRService.schema))
- return;
-
- $scope.svgCharts = [];
- // create an svg object for each chart
- QDRChartService.charts.filter(function (chart) {return chart.dashboard}).forEach(function (chart) {
- var svgChart = new QDRChartService.AreaChart(chart, $location.$$path)
- svgChart.zoomed = false;
- $scope.svgCharts.push(svgChart);
- })
-
- // redraw the charts every second
- var updateCharts = function () {
- $scope.svgCharts.forEach(function (svgChart) {
- svgChart.tick(svgChart.chart.id()); // on this page we are using the chart.id() as the div id in which to render the chart
- })
- updateHandle = setTimeout(updateCharts, 1100);
- }
- $scope.chartsLoaded = function () {
- setTimeout(updateCharts, 0);
- }
-
- $scope.zoomChart = function (chart) {
- chart.zoomed = !chart.zoomed;
- chart.zoom(chart.chart.id(), chart.zoomed);
- }
- $scope.showListPage = function () {
- $location.path("/list");
- };
-
- $scope.hasCharts = function () {
- return QDRChartService.numCharts() > 0;
- };
-
- $scope.editChart = function (chart) {
- doDialog("chart-config-template.html", chart.chart);
- };
-
- $scope.delChart = function (chart) {
- QDRChartService.unRegisterChart(chart.chart);
- // remove from svgCharts
- $scope.svgCharts.forEach(function (svgChart, i) {
- if (svgChart === chart) {
- delete $scope.svgCharts.splice(i, 1);
- }
- })
- };
-
- // called from dialog when we want to clone the dialog chart
- // the chart argument here is a QDRChartService chart
- $scope.addChart = function (chart) {
- $scope.svgCharts.push(new QDRChartService.AreaChart(chart, $location.$$path));
- };
-
- $scope.$on("$destroy", function( event ) {
- if (updateTimer) {
- cancelTimer(updateTimer);
- updateTimer = null;
- }
- for (var i=$scope.svgCharts.length-1; i>=0; --i) {
- delete $scope.svgCharts.splice(i, 1);
- }
- });
-
- function doDialog(template, chart) {
-
- var modalInstance = $uibModal.open({
- animation: true,
- templateUrl: template,
- controller: 'QDR.ChartDialogController',
- resolve: {
- chart: function () {
- return chart;
- },
- dashboard: function () {
- return $scope;
- }
- }
- });
- };
-
- }]);
-
- QDR.module.controller("QDR.ChartDialogController", function($scope, QDRChartService, $location, $uibModalInstance, $rootScope, chart, dashboard) {
- var dialogSvgChart = null;
- $scope.svgDivId = "dialogChart"; // the div id for the svg chart
-
- $scope.updateTimer = null;
- $scope.chart = chart; // the underlying chart object from the dashboard
- $scope.dialogChart = $scope.chart.copy(); // the chart object for this dialog
- $scope.userTitle = $scope.chart.title();
-
- $scope.$watch('userTitle', function(newValue, oldValue) {
- if (newValue !== oldValue) {
- $scope.dialogChart.title(newValue);
- }
- })
- // the stored rateWindow is in milliseconds, but the slider is in seconds
- $scope.rateWindow = $scope.chart.rateWindow / 1000;
-
- var cleanup = function () {
- if ($scope.updateTimer) {
- clearTimeout($scope.updateTimer);
- $scope.updateTimer = null;
- }
- QDRChartService.unRegisterChart($scope.dialogChart); // remove the chart
- }
- $scope.okClick = function () {
- cleanup();
- $uibModalInstance.close();
- };
-
- // initialize the rateWindow slider
- $scope.slider = {
- 'options': {
- min: 1,
- max: 10,
- step: 1,
- tick: true,
- stop: function (event, ui) {
- $scope.dialogChart.rateWindow = ui.value * 1000;
- if (dialogSvgChart)
- dialogSvgChart.tick($scope.svgDivId);
- }
- }
- };
-
- $scope.visibleDuration =
- $scope.duration = {
- 'options': {
- min: 1,
- max: 10,
- step: 1,
- tick: true,
- stop: function (event, ui) {
- if (dialogSvgChart)
- dialogSvgChart.tick($scope.svgDivId);
- }
- }
- };
-
- // handle the Apply button click
- // update the dashboard chart's properties
- $scope.apply = function () {
- $scope.chart.areaColor = $scope.dialogChart.areaColor;
- $scope.chart.lineColor = $scope.dialogChart.lineColor;
- $scope.chart.type = $scope.dialogChart.type;
- $scope.chart.rateWindow = $scope.dialogChart.rateWindow;
- $scope.chart.title($scope.dialogChart.title());
- $scope.chart.visibleDuration = $scope.dialogChart.visibleDuration;
- QDRChartService.saveCharts();
- }
-
- // add a new chart to the dashboard based on the current dialog settings
- $scope.copyToDashboard = function () {
- var chart = $scope.dialogChart.copy();
- // set the new chart's dashboard state
- QDRChartService.addDashboard(chart);
- // notify the chart controller that it needs to display a new chart
- dashboard.addChart(chart);
- }
-
- // update the chart on the popup dialog
- var updateDialogChart = function () {
- // draw the chart using the current data
- if (dialogSvgChart)
- dialogSvgChart.tick($scope.svgDivId);
-
- // draw the chart again in 1 second
- $scope.updateTimer = setTimeout(updateDialogChart, 1000);
- }
-
- var showChart = function () {
- // ensure the div for our chart is loaded in the dom
- var div = angular.element("#dialogChart");
- if (!div.width()) {
- setTimeout(showChart, 100);
- return;
- }
- dialogSvgChart = new QDRChartService.AreaChart($scope.dialogChart, $location.$$path);
- updateDialogChart();
- }
- showChart();
-
-
- });
-
- return QDR;
-
-}(QDR || {}));
-
http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/4940e63d/console/plugin/js/qdrList.js
----------------------------------------------------------------------
diff --git a/console/plugin/js/qdrList.js b/console/plugin/js/qdrList.js
deleted file mode 100644
index 7352d82..0000000
--- a/console/plugin/js/qdrList.js
+++ /dev/null
@@ -1,474 +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) {
-
- /**
- * @method ListController
- * @param $scope
- * @param QDRService
- *
- * Controller for the main interface
- */
- QDR.module.controller("QDR.ListController", ['$scope', '$location', 'uiGridConstants', 'QDRService', 'QDRChartService', '$uibModal',
- function ($scope, $location, uiGridConstants, QDRService, QDRChartService, $uibModal) {
-
- //QDR.log.debug("started List controller");
- if (!angular.isDefined(QDRService.schema))
- return;
- $scope.selectedAction = localStorage['QDRSelectedAction'];
- $scope.selectedNode = localStorage['QDRSelectedNode'];
- $scope.selectedNodeId = localStorage['QDRSelectedNodeId'];
- $scope.selectedRecordName = localStorage['QDRSelectedRecordName'];
-
- var excludedEntities = ["management", "org.amqp.management", "operationalEntity", "entity", "configurationEntity", "dummy", "console"];
- var aggregateEntities = ["router.address"];
-
- $scope.entities = [];
- for (var entity in QDRService.schema.entityTypes) {
- if (excludedEntities.indexOf(entity) == -1) {
- $scope.entities.push( {
- title: angular.isDefined(QDRService.schema.entityTypes[entity].description) ? QDRService.schema.entityTypes[entity].description : '',
- humanName: QDRService.humanify(entity),
- name: entity}
- );
- }
- }
- if (!angular.isDefined($scope.selectedAction)) {
- $scope.selectedAction = $scope.entities[0].name;
- //QDR.log.debug("defaulted selectedAction to " + $scope.selectedAction);
- }
-
- $scope.nodes = QDRService.nodeList().sort(function (a, b) { return a.name.toLowerCase() > b.name.toLowerCase()});
- if (!angular.isDefined($scope.selectedNode)) {
- //QDR.log.debug("selectedNode was " + $scope.selectedNode);
- if ($scope.nodes.length > 0) {
- $scope.selectedNode = $scope.nodes[0].name;
- $scope.selectedNodeId = $scope.nodes[0].id;
- //QDR.log.debug("forcing selectedNode to " + $scope.selectedNode);
- }
- }
-
- $scope.isActionActive = function(name) {
- //QDR.log.debug("isActionActive(" + name + ") selectedAction is " + $scope.selectedAction);
- return $scope.selectedAction === name;
- };
- $scope.isNodeSelected = function (id) {
- return $scope.selectedNodeId === id;
- };
-
- $scope.selectNode = function(node) {
- //QDR.log.debug("setting selectedNode to " + node.name);
- $scope.selectedNode = node.name;
- $scope.selectedNodeId = node.id;
- //QDR.log.debug("location is " + $location.url());
- $location.search('n', node.name);
- };
- $scope.selectAction = function(action) {
- $scope.selectedAction = action;
- $location.search('a', action);
- //QDR.log.debug("selectAction called with " + action + " location is now " + $location.url());
- };
-
- $scope.$watch('selectedAction', function(newValue, oldValue) {
- if (newValue !== oldValue) {
- localStorage['QDRSelectedAction'] = $scope.selectedAction;
- //QDR.log.debug("saving selectedAction as " + $scope.selectedAction + " newValue is " + newValue);
- }
- })
- $scope.$watch('selectedNode', function(newValue, oldValue) {
- if (newValue !== oldValue) {
- localStorage['QDRSelectedNode'] = $scope.selectedNode;
- localStorage['QDRSelectedNodeId'] = $scope.selectedNodeId;
- //QDR.log.debug("saving selectedNode as " + $scope.selectedNode + " newValue is " + newValue);
- }
- })
- $scope.$watch('selectedRecordName', function(newValue, oldValue) {
- if (newValue != oldValue) {
- localStorage['QDRSelectedRecordName'] = $scope.selectedRecordName;
- //QDR.log.debug("saving selectedRecordName as " + $scope.selectedRecordName);
- }
- })
-
- $scope.tableRows = [];
- var selectedRowIndex = 0;
- var updateTableData = function (entity) {
- var gotNodeInfo = function (nodeName, dotentity, response) {
- //QDR.log.debug("got results for " + nodeName);
- //console.dump(response);
-
- var records = response.results;
- var aggregates = response.aggregates;
- var attributeNames = response.attributeNames;
- var nameIndex = attributeNames.indexOf("name");
- var ent = QDRService.schema.entityTypes[entity];
- var tableRows = [];
- for (var i=0; i<records.length; ++i) {
- var record = records[i];
- var aggregate = aggregates ? aggregates[i] : undefined;
- var row = {};
- var rowName;
- if (nameIndex > -1) {
- rowName = record[nameIndex];
- } else {
- QDR.log.error("response attributeNames did not contain a name field");
- console.dump(response.attributeNames);
- return;
- }
- if (rowName == $scope.selectedRecordName)
- selectedRowIndex = i;
- for (var j=0; j<attributeNames.length; ++j) {
- var col = attributeNames[j];
- row[col] = {value: record[j], type: undefined, graph: false, title: '', aggregate: '', aggregateTip: ''};
- if (ent) {
- var att = ent.attributes[col];
- if (att) {
- row[col].type = att.type;
- row[col].graph = att.graph;
- row[col].title = att.description;
-
- if (aggregate) {
- if (att.graph) {
- row[col].aggregate = att.graph ? aggregate[j].sum : '';
- var tip = [];
- aggregate[j].detail.forEach( function (line) {
- tip.push(line);
- })
- row[col].aggregateTip = angular.toJson(tip);
- }
- }
- }
- }
- }
- tableRows.push(row);
- }
- setTimeout(selectRow, 0, tableRows);
- }
-
- // if this entity should show an aggregate column, send the request to get the info for this entity from all the nedes
- if (aggregateEntities.indexOf(entity) > -1) {
- var nodeInfo = QDRService.topology.nodeInfo();
- QDRService.getMultipleNodeInfo(Object.keys(nodeInfo), entity, [], gotNodeInfo, $scope.selectedNodeId);
- } else {
- QDRService.getNodeInfo($scope.selectedNodeId, '.' + entity, [], gotNodeInfo);
- }
- };
-
- // tableRows are the records that were returned, this populates the left hand table on the page
- var selectRow = function (tableRows) {
- $scope.tableRows = tableRows;
- // must apply scope here to update the tableRows before selecting the row
- $scope.$apply();
- $scope.gridApi.selection.selectRow($scope.tableRows[selectedRowIndex]);
- fixTooltips();
- }
-
- $scope.getTableHeight = function() {
- return {height: ($scope.tableRows.length * 30) + "px"};
- };
- var titleFromAlt = function (alt) {
- if (alt && alt.length) {
- var data = angular.fromJson(alt);
- var table = "<table class='tiptable'><tbody>";
- data.forEach (function (row) {
- table += "<tr>";
- table += "<td>" + row.node + "</td><td align='right'>" + QDRService.pretty(row.val) + "</td>";
- table += "</tr>"
- })
- table += "</tbody></table>"
- return table;
- }
- return '';
- }
- var fixTooltips = function () {
- if ($('.hastip').length == 0) {
- setTimeout(fixTooltips, 100);
- return;
- }
- $('.hastip').each( function (i, tip) {
- var tipset = tip.getAttribute('tipset')
- if (!tipset) {
- $(tip).tipsy({html: true, className: 'subTip', opacity: 1, title: function () {
- return titleFromAlt(this.getAttribute('alt'))
- } });
- tip.setAttribute('tipset', true)
- } else {
- var title = titleFromAlt(tip.getAttribute('alt'))
- tip.setAttribute('original-title', title)
- }
-/*
- $(tip).tipsy({html: true, className: 'subTip', opacity: 1, title: function () {
- var alt = this.getAttribute('alt');
- if (alt && alt.length) {
- var data = angular.fromJson(alt);
- var table = "<table class='tiptable'><tbody>";
- data.forEach (function (row) {
- table += "<tr>";
- table += "<td>" + row.node + "</td><td align='right'>" + QDRService.pretty(row.val) + "</td>";
- table += "</tr>"
- })
- table += "</tbody></table>"
- return table;
- }
- return '';
- } });
- */
- })
- }
- $scope.selectedEntity = undefined;
- for (var i=0; i<$scope.entities.length; ++i) {
- if ($scope.selectedAction === $scope.entities[i].name) {
- $scope.selectedEntity = $scope.entities[i].name;
- break;
- }
- }
- if (!angular.isDefined($scope.selectedEntity)) {
- $scope.selectedAction = $scope.entities[0].name;
- $scope.selectedEntity = $scope.entities[0].name;
- }
- var savedCharts = angular.fromJson(localStorage['QDRListCharts']);
- var getCurrentSavedCharts = function () {
- if (angular.isDefined(savedCharts)) {
- if (angular.isDefined(savedCharts[$scope.selectedEntity])) {
- //graphFields = savedCharts[$scope.selectedEntity];
- }
- } else {
- savedCharts = {};
- }
- }
- getCurrentSavedCharts();
-
- //QDR.log.debug("using entity of " + $scope.selectedEntity);
- var stop = undefined;
-
- // The left-hand table that lists the names
- var gridCols = [
- { field: 'name',
- displayName: '',
- cellTemplate: '<div class="ngCellText"><span ng-cell-text>{{row.entity.name.value}}</span></div>'
- }
- ];
- // the table on the left of the page contains the name field for each record that was returned
- $scope.gridDef = {
- data: 'tableRows',
- hideHeader: true,
- showHeader: false,
- enableHorizontalScrollbar: uiGridConstants.scrollbars.NEVER,
- enableVerticalScrollbar: uiGridConstants.scrollbars.NEVER,
- columnDefs: gridCols,
- enableColumnResize: true,
- multiSelect: false,
- enableRowHeaderSelection: false,
- noUnselect: true,
- enableSelectAll: false,
- enableRowSelection: true,
- onRegisterApi: function (gridApi) {
- $scope.gridApi = gridApi;
- gridApi.selection.on.rowSelectionChanged($scope, function(row) {
- if (row.isSelected) {
- selectedRowIndex = row.rowIndex;
- $scope.selectedRecordName = row.entity.name.value;
- var details = [];
- // for each field in the new row, add a row in the details grid
- for (var name in row.entity) {
- details.push( { attributeName: QDRService.humanify(name),
- attributeValue: QDRService.pretty(row.entity[name].value),
- type: row.entity[name].type,
- name: name,
- rawValue: row.entity[name].value,
- graph: row.entity[name].graph,
- title: row.entity[name].title,
- aggregateValue: QDRService.pretty(row.entity[name].aggregate),
- aggregateTip: row.entity[name].aggregateTip})
- }
- setTimeout(updateDetails, 10, details);
- }
- });
- }
- };
-
- $scope.detailFields = [];
- updateDetails = function (details) {
- $scope.detailFields = details;
- $scope.$apply();
- }
-
- $scope.isFieldGraphed = function(rowEntity, aggregate) {
- var dot = !aggregate ? '.' : '';
- return QDRChartService.isAttrCharted($scope.selectedNodeId, dot + $scope.selectedEntity, $scope.selectedRecordName, rowEntity.name);
- }
-
- $scope.addToGraph = function(rowEntity) {
- var chart = QDRChartService.registerChart($scope.selectedNodeId, "." + $scope.selectedEntity, $scope.selectedRecordName, rowEntity.name, 1000);
- doDialog("template-from-script.html", chart);
- reset();
- }
-
- $scope.addAllToGraph = function(rowEntity) {
- var chart = QDRChartService.registerChart($scope.selectedNodeId,
- $scope.selectedEntity,
- $scope.selectedRecordName,
- rowEntity.name,
- 1000,
- false,
- true);
- doDialog("template-from-script.html", chart);
- reset();
- }
-
- var detailCols = [
- {
- field: 'attributeName',
- cellTemplate: '<div title="{{row.entity.title}}" class="listAttrName">{{row.entity.name}}<i ng-if="row.entity.graph" ng-click="grid.appScope.addToGraph(row.entity)" ng-class="{\'active\': grid.appScope.isFieldGraphed(row.entity, false), \'icon-bar-chart\': row.entity.graph == true }"></i></div>',
- displayName: 'Attribute'
- },
- {
- field: 'attributeValue',
- displayName: 'Value'
- }
- ];
- if (aggregateEntities.indexOf($scope.selectedEntity) > -1) {
- detailCols.push(
- {
- width: '10%',
- field: 'aggregateValue',
- displayName: 'Aggregate',
- cellTemplate: '<div class="hastip" alt="{{row.entity.aggregateTip}}">{{row.entity.aggregateValue}}<i ng-if="row.entity.graph" ng-click="grid.appScope.addAllToGraph(row.entity)" ng-class="{\'active\': grid.appScope.isFieldGraphed(row.entity, true), \'icon-bar-chart\': row.entity.graph == true }"></i></div>',
- cellClass: 'aggregate'
- }
- )
- }
-
- // the table on the right of the page contains a row for each field in the selected record in the table on the left
- $scope.details = {
- data: 'detailFields',
- columnDefs: detailCols,
- enableHorizontalScrollbar: uiGridConstants.scrollbars.NEVER,
- enableVerticalScrollbar: uiGridConstants.scrollbars.NEVER,
- enableColumnResize: true,
- multiSelect: false,
- enableRowHeaderSelection: false,
- noUnselect: true,
- enableSelectAll: false,
- enableRowSelection: true
- };
-
- updateTableData($scope.selectedEntity);
- stop = setInterval(updateTableData, 5000, $scope.selectedEntity);
- $scope.getDetailsTableHeight = function() {
- return {height: ($scope.detailFields.length * 30) + "px"};
- };
-
- $scope.$on("$destroy", function( event ) {
- //QDR.log.debug("scope destroyed for qdrList");
- reset();
- if (angular.isDefined(stop)) {
- clearInterval(stop);
- stop = undefined;
- };
- });
-
- var reset = function () {
- if ($scope.context) {
- $scope.context.stop();
- $scope.context = null;
- }
- };
-
- function doDialog(template, chart) {
-
- var modalInstance = $uibModal.open({
- animation: true,
- templateUrl: template,
- controller: 'QDR.ListChartController',
- resolve: {
- chart: function () {
- return chart;
- }
- }
- });
- };
-
- }]);
-
-
- QDR.module.controller('QDR.ListChartController', function ($scope, $uibModalInstance, $location, QDRChartService, chart) {
-
- $scope.chart = chart;
- $scope.dialogSvgChart = null;
- $scope.updateTimer = null;
- $scope.svgDivId = "dialogChart"; // the div id for the svg chart
-
- $scope.showChartsPage = function () {
- cleanup();
- $uibModalInstance.close();
- $location.path("/charts");
- };
-
- $scope.addChartsPage = function () {
- QDRChartService.addDashboard($scope.chart);
- };
-
- $scope.delChartsPage = function () {
- QDRChartService.delDashboard($scope.chart);
- };
-
- $scope.isOnChartsPage = function () {
- return $scope.chart.dashboard;
- }
-
- var showChart = function () {
- // the chart divs are generated by angular and aren't available immediately
- var div = angular.element("#" + $scope.svgDivId);
- if (!div.width()) {
- setTimeout(showChart, 100);
- return;
- }
- dialogSvgChart = new QDRChartService.AreaChart($scope.chart, $location.$$path);
- $scope.dialogSvgChart = dialogSvgChart;
- updateDialogChart();
- }
- showChart();
-
- var updateDialogChart = function () {
- if ($scope.dialogSvgChart)
- $scope.dialogSvgChart.tick($scope.svgDivId);
- $scope.updateTimer = setTimeout(updateDialogChart, 1000);
- }
-
- var cleanup = function () {
- if ($scope.updateTimer) {
- clearTimeout($scope.updateTimer);
- $scope.updateTimer = null;
- }
- if (!$scope.chart.dashboard)
- QDRChartService.unRegisterChart(chart); // remove the chart
-
- }
- $scope.ok = function () {
- cleanup();
- $uibModalInstance.close();
- };
-
- });
- return QDR;
-
-} (QDR || {}));
http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/4940e63d/console/plugin/js/qdrOverview.js
----------------------------------------------------------------------
diff --git a/console/plugin/js/qdrOverview.js b/console/plugin/js/qdrOverview.js
deleted file mode 100644
index d787a5e..0000000
--- a/console/plugin/js/qdrOverview.js
+++ /dev/null
@@ -1,696 +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) {
-
- /**
- * @method OverviewController
- * @param $scope
- * @param QDRService
- * @param QDRChartServer
- * dialogServer
- * $location
- *
- * Controller that handles the QDR overview page
- */
- QDR.module.controller("QDR.OverviewController", ['$scope', 'uiGridConstants', 'QDRService', function($scope, uiGridConstants, QDRService) {
-
-
- if (!angular.isDefined(QDRService.schema))
- return;
-
- var nodeIds = QDRService.nodeIdList();
- var currentTimer;
- var refreshInterval = 5000
- 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;
- })();
- $scope.modes = [
- {title: 'Overview', name: 'Overview', right: false}
- ];
-
- $scope.templates =
- [ { name: 'Routers', url: 'routers.html'},
- { name: 'Router', url: 'router.html'},
- { name: 'Addresses', url: 'addresses.html'},
- { name: 'Address', url: 'address.html'},
- { name: 'Connections', url: 'connections.html'},
- { name: 'Connection', url: 'connection.html'},
- { name: 'Logs', url: 'logs.html'},
- { name: 'Log', url: 'log.html'} ];
-
- $scope.getGridHeight = function (data) {
- // add 1 for the header row
- return {height: (($scope[data.data].length + 1) * 30) + "px"};
- }
- $scope.overview = new Folder("Overview");
-
- $scope.allRouterFields = [];
- var allRouterCols = [
- {
- field: 'routerId',
- 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'
- }
- ];
- $scope.allRouters = {
- data: 'allRouterFields',
- columnDefs: allRouterCols,
- enableHorizontalScrollbar: uiGridConstants.scrollbars.NEVER,
- enableVerticalScrollbar: uiGridConstants.scrollbars.NEVER,
- enableColumnResize: true,
- multiSelect: false,
- enableRowHeaderSelection: false,
- noUnselect: true,
- enableSelectAll: false,
- enableRowSelection: true,
- onRegisterApi: function (gridApi) {
- gridApi.selection.on.rowSelectionChanged($scope, function(row) {
- if (row.isSelected) {
- var nodeId = row.entity.nodeId;
- $("#overtree").fancytree("getTree").activateKey(nodeId);
- }
- });
- }
- };
- // get info for all routers
- var allRouterInfo = function () {
- 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, response) {
- var results = response.aggregates
- results.forEach ( function (result) {
-
- var routerId = QDRService.valFor(response.attributeNames, result, "routerId").sum
- allRouterFields.some( function (connField) {
- if (routerId === connField.routerId) {
- response.attributeNames.forEach ( function (attrName) {
- connField[attrName] = QDRService.valFor(response.attributeNames, result, attrName).sum
- })
- return true
- }
- return false
- })
- })
- $scope.allRouterFields = allRouterFields
- $scope.$apply()
- if (currentTimer) {
- clearTimeout(currentTimer)
- }
- currentTimer = setTimeout(allRouterInfo, refreshInterval);
- }, nodeIds[0])
- }
- }
- nodeIds.forEach ( function (nodeId) {
- QDRService.getNodeInfo(nodeId, ".connection", ["role"], gotNodeInfo)
- })
-
- }
-
- // get info for a single router
- var routerInfo = function (node) {
- $scope.router = node
- $scope.routerFields = []
- var cols = [
- {
- field: 'attribute',
- displayName: 'Attribute',
- width: '40%'
- },
- {
- field: 'value',
- displayName: 'Value',
- width: '40%'
- }
- ]
- $scope.routerGrid = {
- data: 'routerFields',
- columnDefs: cols,
- enableHorizontalScrollbar: uiGridConstants.scrollbars.NEVER,
- enableVerticalScrollbar: uiGridConstants.scrollbars.NEVER,
- enableColumnResize: true,
- multiSelect: false
- }
-
- $scope.allRouterFields.some( function (field) {
- if (field.routerId === node.title) {
- Object.keys(field).forEach ( function (key) {
- if (key !== '$$hashKey')
- $scope.routerFields.push({attribute: key, value: field[key]})
- })
- return true
- }
- })
-
- $scope.$apply()
- if (currentTimer) {
- clearTimeout(currentTimer)
- currentTimer = null
- }
- }
-
- // get info for a all addresses
- var allAddressInfo = function () {
- $scope.addressFields = []
- var addressCols = [
- {
- field: 'address',
- displayName: 'address'
- },
- {
- field: 'class',
- displayName: 'class'
- },
- {
- field: 'phase',
- displayName: 'phase',
- cellClass: 'grid-align-value'
- },
- {
- field: 'inproc',
- displayName: 'in-proc'
- },
- {
- field: 'local',
- displayName: 'local',
- cellClass: 'grid-align-value'
- },
- {
- field: 'remote',
- displayName: 'remote',
- cellClass: 'grid-align-value'
- },
- {
- field: 'in',
- displayName: 'in',
- cellClass: 'grid-align-value'
- },
- {
- field: 'out',
- displayName: 'out',
- cellClass: 'grid-align-value'
- }
- ]
- $scope.selectedAddresses = []
- $scope.addressGrid = {
- data: 'addressFields',
- columnDefs: addressCols,
- enableColumnResize: true,
- enableHorizontalScrollbar: uiGridConstants.scrollbars.NEVER,
- enableVerticalScrollbar: uiGridConstants.scrollbars.NEVER,
- multiSelect: false,
- enableRowHeaderSelection: false,
- noUnselect: true,
- enableSelectAll: false,
- enableRowSelection: true,
- onRegisterApi: function (gridApi) {
- gridApi.selection.on.rowSelectionChanged($scope, function(row) {
- if (row.isSelected) {
- var key = row.entity.uid;
- $("#overtree").fancytree("getTree").activateKey(key);
- }
- });
- }
- }
-
- var gotAllAddressFields = function ( addressFields ) {
- $scope.addressFields = addressFields
- $scope.$apply()
- if (currentTimer) {
- clearTimeout(currentTimer)
- }
- currentTimer = setTimeout(allAddressInfo, refreshInterval);
- }
- getAllAddressFields(gotAllAddressFields)
- }
-
- var getAllAddressFields = function (callback) {
- 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] == 'D') return "link-outgoing"
- return "unknown: " + addr[0]
- }
-
- var addr_text = function (addr) {
- if (!addr)
- return "-"
- if (addr[0] == 'M')
- return addr.substring(2)
- else
- return addr.substring(1)
- }
-
- var addr_phase = function (addr) {
- if (!addr)
- return "-"
- if (addr[0] == 'M')
- return addr[1]
- return ''
- }
-
- var identity_clean = function (identity) {
- if (!identity)
- return "-"
- var pos = identity.indexOf('/')
- if (pos >= 0)
- return identity.substring(pos + 1)
- return identity
- }
-
- var addressFields = []
- nodeIds = QDRService.nodeIdList()
- 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 = identity_clean(uid)
-
- addressFields.push({
- address: addr_text(identity),
- 'class': 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])
- }
-
-
- // get info for a all connections
- var allConnectionInfo = function () {
- $scope.allConnectionFields = []
- var allConnectionCols = [
- {
- field: 'host',
- displayName: 'host'
- },
- {
- field: 'container',
- displayName: 'container'
- },
- {
- field: 'role',
- displayName: 'role'
- },
- {
- field: 'dir',
- displayName: 'dir'
- },
- {
- field: 'security',
- displayName: 'security'
- },
- {
- field: 'authentication',
- displayName: 'authentication'
- }
- ]
- $scope.allConnectionGrid = {
- data: 'allConnectionFields',
- columnDefs: allConnectionCols,
- enableHorizontalScrollbar: uiGridConstants.scrollbars.NEVER,
- enableVerticalScrollbar: uiGridConstants.scrollbars.NEVER,
- enableColumnResize: true,
- multiSelect: false,
- enableRowHeaderSelection: false,
- noUnselect: true,
- enableSelectAll: false,
- enableRowSelection: true,
- onRegisterApi: function (gridApi) {
- gridApi.selection.on.rowSelectionChanged($scope, function(row) {
- if (row.isSelected) {
- var host = row.entity.host;
- $("#overtree").fancytree("getTree").activateKey(host);
- }
- });
- }
- }
- connections.children.forEach( function (connection) {
- $scope.allConnectionFields.push(connection.fields)
- })
- $scope.$apply()
- if (currentTimer) {
- clearTimeout(currentTimer)
- currentTimer = null
- }
- }
-
- // get info for a single address
- var addressInfo = function (address) {
- $scope.address = address
- $scope.addressFields = []
- var cols = [
- {
- field: 'attribute',
- displayName: 'Attribute',
- width: '40%'
- },
- {
- field: 'value',
- displayName: 'Value',
- width: '40%'
- }
- ]
- $scope.addressGrid = {
- data: 'addressFields',
- columnDefs: cols,
- enableColumnResize: true,
- enableHorizontalScrollbar: uiGridConstants.scrollbars.NEVER,
- enableVerticalScrollbar: uiGridConstants.scrollbars.NEVER,
- multiSelect: false
- }
-
- var fields = Object.keys(address.data.fields)
- fields.forEach( function (field) {
- if (field != "title" && field != "uid")
- $scope.addressFields.push({attribute: field, value: address.data.fields[field]})
- })
-
- $scope.$apply()
- if (currentTimer) {
- clearTimeout(currentTimer)
- currentTimer = null
- }
- }
-
- // get info for a single connection
- var connectionInfo = function (connection) {
- $scope.connection = connection
- $scope.connectionFields = []
- var cols = [
- {
- field: 'attribute',
- displayName: 'Attribute',
- width: '40%'
- },
- {
- field: 'value',
- displayName: 'Value',
- width: '40%'
- }
- ]
- $scope.connectionGrid = {
- data: 'connectionFields',
- columnDefs: cols,
- enableColumnResize: true,
- enableHorizontalScrollbar: uiGridConstants.scrollbars.NEVER,
- enableVerticalScrollbar: uiGridConstants.scrollbars.NEVER,
- multiSelect: false
- }
-
- var fields = Object.keys(connection.data.fields)
- fields.forEach( function (field) {
- $scope.connectionFields.push({attribute: field, value: connection.data.fields[field]})
- })
-
- $scope.$apply()
- if (currentTimer) {
- clearTimeout(currentTimer)
- currentTimer = null
- }
- }
-
- // get info for a all logs
- var allLogInfo = function () {
- }
-
- // get info for a single log
- var logInfo = function (node) {
- $scope.log = node
- }
-
- var activated = function (event, node) {
- //QDR.log.debug("node activated: " + node.data.title)
- node = node.node;
- var type = node.data.type;
- var template = $scope.templates.filter( function (tpl) {
- return tpl.name == type;
- })
- $scope.template = template[0];
- // Call the function associated with this type passing in the node that was selected
- // In dynatree I could save the function to call in the node, but not in FancyTree
- if (treeTypeMap[type])
- treeTypeMap[type](node);
-
- /*if (node.data.info)
- node.data.info(node)
- */
- $scope.$apply();
- }
- $scope.template = $scope.templates[0];
-
- var routers = new Folder("Routers")
- routers.type = "Routers"
- //routers.info = allRouterInfo
- routers.focus = true
- routers.expanded = true
- routers.key = "Routers"
- $scope.overview.children.push(routers)
- nodeIds.forEach( function (node) {
- var name = QDRService.nameFromId(node)
- var router = new Leaf(name)
- router.type = "Router"
- //router.info = routerInfo
- router.nodeId = node
- router.key = node
- routers.children.push(router)
- })
-
- var expected = nodeIds.length;
- var addresses = new Folder("Addresses")
- addresses.type = "Addresses"
- //addresses.info = allAddressInfo
- addresses.key = "Addresses"
- $scope.overview.children.push(addresses)
-
- var gotAddressFields = function (addressFields) {
- 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
- }
- addressFields.forEach( function (address) {
- var a = new Leaf(address.title)
- //a.info = addressInfo
- a.key = address.uid
- a.fields = address
- a.type = "Address"
- addresses.children.push(a)
- } )
- }
- getAllAddressFields(gotAddressFields)
-
-
- var connreceived = 0;
- var connectionsObj = {}
- var connections = new Folder("Connections")
- connections.type = "Connections"
- //connections.info = allConnectionInfo
- connections.key = "Connections"
- $scope.overview.children.push(connections)
- nodeIds.forEach( function (nodeId) {
-
- QDRService.getNodeInfo(nodeId, ".connection", [], 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")
- connectionsObj[host] = {}
- response.attributeNames.forEach( function (attribute, i) {
- connectionsObj[host][attribute] = result[i]
- })
- connectionsObj[host].security = sec
- connectionsObj[host].authentication = auth
- })
- ++connreceived;
- if (connreceived == expected) {
- var allConnections = Object.keys(connectionsObj).sort()
- allConnections.forEach(function (connection) {
- var c = new Leaf(connection)
- c.type = "Connection"
- c.icon = "ui-icon "
- c.icon += connectionsObj[connection].role === "inter-router" ? "ui-icon-refresh" : "ui-icon-transfer-e-w"
- //c.info = connectionInfo
- c.key = connection
- c.fields = connectionsObj[connection]
- c.tooltip = connectionsObj[connection].role === "inter-router" ? "inter-router connection" : "external connection"
- connections.children.push(c)
- })
- }
- })
- })
-
- var logsreceived = 0;
- var logObj = {}
- var logs = new Folder("Logs")
- logs.type = "Logs"
- //logs.info = allLogInfo
- logs.key = "Logs"
- //$scope.overview.children.push(logs)
- nodeIds.forEach( function (nodeId) {
- QDRService.getNodeInfo(nodeId, ".log", ["name"], function (nodeName, entity, response) {
- response.results.forEach( function (result) {
- logObj[result[0]] = 1 // use object to collapse duplicates
- })
- ++logsreceived;
- if (logsreceived == expected) {
- var allLogs = Object.keys(logObj).sort()
- allLogs.forEach(function (log) {
- var l = new Leaf(log)
- l.type = "Log"
- //l.info = logInfo
- l.key = log
- logs.children.push(l)
- })
- //console.log("---------------")
- //console.dump($scope.overview.children)
- //console.log("---------------")
- $("#overtree").fancytree({
- activate: activated,
- clickFolderMode: 1,
- source: $scope.overview.children
- })
- allRouterInfo();
- }
- })
- })
-
- $scope.$on("$destroy", function( event ) {
- if (currentTimer) {
- clearTimeout(currentTimer)
- currentTimer = null;
- }
- });
- var treeTypeMap = {
- Routers: allRouterInfo,
- Router: routerInfo,
- Addresses: allAddressInfo,
- Address: addressInfo,
- Connections: allConnectionInfo,
- Connection: connectionInfo
- }
-
- }]);
-
- return QDR;
-
-}(QDR || {}));
-
http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/4940e63d/console/plugin/js/qdrPlugin.js
----------------------------------------------------------------------
diff --git a/console/plugin/js/qdrPlugin.js b/console/plugin/js/qdrPlugin.js
deleted file mode 100644
index 3d14f72..0000000
--- a/console/plugin/js/qdrPlugin.js
+++ /dev/null
@@ -1,197 +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 entrypoint for the QDR module
- *
- */
-var QDR = (function(QDR) {
-
- /**
- * @property pluginName
- * @type {string}
- *
- * The name of this plugin
- */
- QDR.pluginName = "QDR";
-
- /**
- * @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 = "../dispatch/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(QDR.pluginName, ['ngAnimate', 'ngResource', 'ngRoute', 'ui.grid', 'ui.grid.selection',
- 'ui.grid.autoResize', 'jsonFormatter', 'ui.bootstrap', 'ui.slider'/*, 'minicolors' */]);
-
- // set up the routing for this plugin
- QDR.module.config(function($routeProvider) {
- $routeProvider
- .when('/', {
- templateUrl: QDR.templatePath + 'qdrConnect.html'
- })
- .when('/overview', {
- templateUrl: QDR.templatePath + 'qdrOverview.html'
- })
- .when('/topology', {
- templateUrl: QDR.templatePath + 'qdrTopology.html'
- })
- .when('/list', {
- templateUrl: QDR.templatePath + 'qdrList.html'
- })
- .when('/schema', {
- templateUrl: QDR.templatePath + 'qdrSchema.html'
- })
- .when('/charts', {
- templateUrl: QDR.templatePath + 'qdrCharts.html'
- })
- .when('/connect', {
- templateUrl: QDR.templatePath + 'qdrConnect.html'
- })
- });
-
- QDR.module.config(['$compileProvider', function ($compileProvider) {
- var cur = $compileProvider.aHrefSanitizationWhitelist();
- $compileProvider.aHrefSanitizationWhitelist(/^\s*(https?|ftp|mailto|file|blob):/);
- cur = $compileProvider.aHrefSanitizationWhitelist();
- }]);
-
- QDR.module.config(function (JSONFormatterConfigProvider) {
- // Enable the hover preview feature
- JSONFormatterConfigProvider.hoverPreviewEnabled = true;
- });
-
- QDR.module.filter('to_trusted', ['$sce', function($sce){
- return function(text) {
- return $sce.trustAsHtml(text);
- };
- }]);
-
- QDR.module.filter('humanify', function (QDRService) {
- return function (input) {
- return QDRService.humanify(input);
- };
- });
-
- 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", "$location", "$log", "QDRService", "QDRChartService", function ($rootScope, $location, $log, QDRService, QDRChartService) {
- QDR.log = new QDR.logger($log);
- QDR.log.debug("QDR.module.run()")
-
- QDRService.initProton();
- var settings = angular.fromJson(localStorage[QDR.SETTINGS_KEY]);
- var lastLocation = localStorage[QDR.LAST_LOCATION];
- if (!angular.isDefined(lastLocation))
- lastLocation = "/overview";
-
- QDRService.addConnectAction(function() {
- QDRChartService.init(); // initialize charting service after we are connected
- });
- if (settings && settings.autostart) {
- QDRService.addConnectAction(function() {
- $location.path(lastLocation);
- $location.replace();
- $rootScope.$apply();
- });
- QDRService.connect(settings);
- } else {
- setTimeout(function () {
- $location.url('/connect')
- $location.replace();
- }, 100)
- }
-
- $rootScope.$on('$routeChangeSuccess', function() {
- localStorage[QDR.LAST_LOCATION] = $location.$$path;
- });
-
-
- }]);
-
- QDR.module.controller ("QDR.MainController", ['$scope', '$location', function ($scope, $location) {
- QDR.log.debug("started QDR.MainController with location.url: " + $location.url());
- QDR.log.debug("started QDR.MainController with window.location.pathname : " + window.location.pathname);
- $scope.topLevelTabs = [];
- $scope.topLevelTabs.push({
- id: "qdr",
- content: "Qpid Dispatch Router Console",
- title: "Dispatch Router Console",
- isValid: function() { return true; },
- href: function() { return "#connect"; },
- isActive: function() { return true; }
- });
- }])
-
- 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 || {}));
http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/4940e63d/console/plugin/js/qdrSchema.js
----------------------------------------------------------------------
diff --git a/console/plugin/js/qdrSchema.js b/console/plugin/js/qdrSchema.js
deleted file mode 100644
index 0e94351..0000000
--- a/console/plugin/js/qdrSchema.js
+++ /dev/null
@@ -1,31 +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) {
-
- QDR.module.controller("QDR.SchemaController", ['$scope', 'QDRService', function($scope, QDRService) {
-
- $scope.schema = QDRService.schema;
-
- }]);
-
- return QDR;
-}(QDR || {}));
http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/4940e63d/console/plugin/js/qdrService.js
----------------------------------------------------------------------
diff --git a/console/plugin/js/qdrService.js b/console/plugin/js/qdrService.js
deleted file mode 100644
index 47029d7..0000000
--- a/console/plugin/js/qdrService.js
+++ /dev/null
@@ -1,742 +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) {
-
- // The QDR service handles the connection to
- // the server in the background
- QDR.module.factory("QDRService", ['$rootScope', '$http', '$resource', '$location', function($rootScope, $http, $resource, $location) {
- 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);
- action.apply();
- });
- self.connectActions = [];
- },
- executeDisconnectActions: function() {
- self.disconnectActions.forEach(function(action) {
- action.apply();
- });
- self.disconnectActions = [];
- },
- executeUpdatedActions: function() {
- for (action in self.updatedActions) {
- self.updatedActions[action].apply();
- }
- },
-
- 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.gotTopology;
- },
-
- 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);
- delete this._objects[correlationID];
- }
- },
-
- onSubscription: function() {
- self.getSchema();
- self.topology.get();
- },
-
- startUpdating: function () {
- QDR.log.info("startUpdating called")
- self.stopUpdating();
- self.topology.get();
- self.stop = setInterval(function() {
- self.topology.get();
- }, 2000);
- },
- stopUpdating: function () {
- if (angular.isDefined(self.stop)) {
- QDR.log.info("stoptUpdating called")
- clearInterval(self.stop);
- self.stop = undefined;
- }
- },
-
- initProton: function() {
- //QDR.log.debug("*************QDR init proton called ************");
- },
- 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) {
- 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;
- },
-
- /*
- * 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) {
- //QDR.log.debug("got remote node list of ");
- //console.dump(response);
- if( Object.prototype.toString.call( response ) === '[object Array]' ) {
- // 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) {
-/*
- for (var o in obj) {
- QDR.log.debug("cleaning up");
- console.dump(obj[o]);
- if (isNaN(parseInt(o)))
- this.cleanUp(obj[o]);
- }
-*/
- 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.debug("timed out waiting for management responses");
- // note: can't use 'this' in a timeout handler
- self.topology.dump("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);
- },
-/*
-The response looks like:
-{
- ".router": {
- "results": [
- [4, "router/QDR.X", 1, "0", 3, 60, 60, 11, "QDR.X", 30, "interior", "org.apache.qpid.dispatch.router", 5, 12, "router/QDR.X"]
- ],
- "attributeNames": ["raIntervalFlux", "name", "helloInterval", "area", "helloMaxAge", "mobileAddrMaxAge", "remoteLsMaxAge", "addrCount", "routerId", "raInterval", "mode", "type", "nodeCount", "linkCount", "identity"]
- },
- ".connection": {
- "results": [
- ["QDR.B", "connection/0.0.0.0:20002", "operational", "0.0.0.0:20002", "inter-router", "connection/0.0.0.0:20002", "ANONYMOUS", "org.apache.qpid.dispatch.connection", "out"],
- ["QDR.A", "connection/0.0.0.0:20001", "operational", "0.0.0.0:20001", "inter-router", "connection/0.0.0.0:20001", "ANONYMOUS", "org.apache.qpid.dispatch.connection", "out"],
- ["b2de2f8c-ef4a-4415-9a23-000c2f86e85d", "connection/localhost:33669", "operational", "localhost:33669", "normal", "connection/localhost:33669", "ANONYMOUS", "org.apache.qpid.dispatch.connection", "in"]
- ],
- "attributeNames": ["container", "name", "state", "host", "role", "identity", "sasl", "type", "dir"]
- },
- ".router.node": {
- "results": [
- ["QDR.A", null],
- ["QDR.B", null],
- ["QDR.C", "QDR.A"],
- ["QDR.D", "QDR.A"],
- ["QDR.Y", "QDR.A"]
- ],
- "attributeNames": ["routerId", "nextHop"]
- }
-}*/
- ondone: function () {
- clearTimeout(this.timerHandle);
- this._gettingTopo = false;
- //this.miniDump();
- //this.dump();
- self.notifyTopologyDone();
-
- },
- dump: function (prefix) {
- if (prefix)
- QDR.log.debug(prefix);
- QDR.log.debug("---");
- for (var key in this._nodeInfo) {
- QDR.log.debug(key);
- console.dump(this._nodeInfo[key]);
- QDR.log.debug("---");
- }
- QDR.log.debug("was still expecting:");
- console.dump(this._expected);
- },
- miniDump: function (prefix) {
- if (prefix)
- QDR.log.debug(prefix);
- QDR.log.debug("---");
- console.dump(Object.keys(this._nodeInfo));
- QDR.log.debug("---");
- },
- 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) {
- callback(response);
- 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) {
- // TODO: file a bug against rhea - large numbers are coming back as Uint8Array
- response.results.forEach( function (result) {
- result.forEach( function (val, i) {
- if (val instanceof Uint8Array) {
- var ua2num = function(ua) {
- var n = 0;
- for (var i = 0; i<ua.length; i++) {
- n *= 256;
- n += ua[i];
- }
- return n;
- }
- result[i] = ua2num(val);
- }
- })
- })
- callback(nodeName, entity, response);
- //self.topology.addNodeInfo(nodeName, entity, response);
- //self.topology.cleanUp(response);
- }, ret.error);
- },
-
- getMultipleNodeInfo: function (nodeNames, entity, attrs, callback, selectedNodeId) {
- var responses = {};
- var gotNodesResult = function (nodeName, dotentity, response) {
- responses[nodeName] = response;
- if (Object.keys(responses).length == nodeNames.length) {
- aggregateNodeInfo(nodeNames, entity, responses, callback);
- }
- }
-
- var aggregateNodeInfo = function (nodeNames, entity, 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: []})
- })
- newResponse.aggregates.push(vals)
- }
- })
- })
- callback(nodeNames, entity, newResponse);
- }
-
- nodeNames.forEach( function (id) {
- self.getNodeInfo(id, '.'+entity, attrs, gotNodesResult);
- })
- //TODO: implement a timeout in case not all requests complete
- },
-
- 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");
- self.schema = response;
- //self.schema = angular.copy(response);
- //self.topology.cleanUp(response);
- self.notifyTopologyDone();
- }, ret.error);
- },
-
- sendQuery: function(toAddr, entity, attrs) {
- 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 body;
- if (attrs)
- body = {
- "attributeNames": attrs,
- }
- else
- body = {
- "attributeNames": [],
- }
-
- return self._send(body, fullAddr, "QUERY", "org.apache.qpid.dispatch" + entity);
- },
-
- sendMgmtQuery: function (operation) {
- // TODO: file bug against dispatch - We should be able to just pass body: [], but that generates an 'invalid body'
- return self._send([' '], self.toAddress + "/$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();
- },
-
- connect: function(options) {
- self.options = options;
- 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();
- if (self.connected) {
- $rootScope.$broadcast('newAlert', { type: 'danger', msg: 'Connection to ' + baseAddress + " was lost. Retrying..." });
- }
- okay.sender = false;
- okay.receiver = false;
- okay.connected = false;
- self.connected = false;
- self.sender = null;
- self.receiver = null;
- self.sendable = 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();
- $rootScope.$broadcast("clearAlerts");
- }
- }
-
- QDR.log.debug("****** calling rhea.connect ********")
- var connection = self.rhea.connect({
- connection_details:ws('ws://' + baseAddress),
- reconnect:true,
- properties: {console_identifier: 'Dispatch console'}
- });
- 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.warn("disconnected");
- stop();
- self.errorText = "Error: Connection failed."
- self.executeDisconnectActions();
- self.connectionError = true;
- })
- connection.on('connection_close', function (context) { QDR.log.warn("connection_close"); stop()})
-
- var sender = connection.open_sender("/$management");
- 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 || {}));
-
-(function() {
- console.dump = function(object) {
- if (window.JSON && window.JSON.stringify)
- console.log(JSON.stringify(object));
- else
- console.log(object);
- };
-})();
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/4940e63d/console/plugin/js/qdrSettings.js
----------------------------------------------------------------------
diff --git a/console/plugin/js/qdrSettings.js b/console/plugin/js/qdrSettings.js
deleted file mode 100644
index 950e1c5..0000000
--- a/console/plugin/js/qdrSettings.js
+++ /dev/null
@@ -1,115 +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) {
-
- /**
- * @method SettingsController
- * @param $scope
- * @param QDRServer
- *
- * Controller that handles the QDR settings page
- */
- QDR.module.controller("QDR.SettingsController", ['$scope', 'QDRService', '$location', function($scope, QDRService, $location) {
-
- $scope.connecting = false;
- $scope.connectionError = false;
- $scope.connectionErrorText = undefined;
- $scope.forms = {};
-
- $scope.formEntity = angular.fromJson(localStorage[QDR.SETTINGS_KEY]) || {address: '', port: '', username: '', password: '', autostart: false};
- $scope.formConfig = {
- properties: {
- address: {
- description: "Router address",
- 'type': 'java.lang.String',
- required: true
- },
- port: {
- description: 'Router port',
- 'type': 'Integer',
- tooltip: 'Ports to connect to, by default 5672'
- },
- username: {
- description: 'User Name',
- 'type': 'java.lang.String'
- },
- password: {
- description: 'Password',
- 'type': 'password'
- },
- /*
- useSSL: {
- description: 'SSL',
- 'type': 'boolean'
- },*/
- autostart: {
- description: 'Connect at startup',
- 'type': 'boolean',
- tooltip: 'Whether or not the connection should be started as soon as you log into hawtio'
- }
- }
- };
-
- $scope.$watch('formEntity', function(newValue, oldValue) {
- if (newValue !== oldValue) {
- localStorage[QDR.SETTINGS_KEY] = angular.toJson(newValue);
- }
- }, true);
-
- $scope.buttonText = function() {
- if (QDRService.isConnected()) {
- return "Reconnect";
- } else {
- return "Connect";
- }
- };
-
-
- $scope.connect = function() {
- if ($scope.settings.$valid) {
- $scope.connectionError = false;
- $scope.connecting = true;
- console.log("attempting to connect");
- QDRService.addDisconnectAction(function() {
- //QDR.log.debug("disconnect action called");
- $scope.connecting = false;
- $scope.connectionErrorText = QDRService.errorText;
- $scope.connectionError = true;
- $scope.$apply();
- });
- QDRService.addConnectAction(function() {
- //QDR.log.debug("got connection notification");
- $scope.connecting = false;
- //console.log("we were on connect page. let's switch to topo now that we are connected");
- //QDR.log.debug("location before the connect " + $location.path());
- $location.path("/overview");
- //QDR.log.debug("location after the connect " + $location.path());
- $scope.$apply();
- });
- QDRService.connect($scope.formEntity);
- }
- };
-
- }]);
-
- return QDR;
-}(QDR || {}));
---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@qpid.apache.org
For additional commands, e-mail: commits-help@qpid.apache.org
[02/19] qpid-dispatch git commit: removed canvas class
Posted by ea...@apache.org.
removed canvas class
Project: http://git-wip-us.apache.org/repos/asf/qpid-dispatch/repo
Commit: http://git-wip-us.apache.org/repos/asf/qpid-dispatch/commit/739dff26
Tree: http://git-wip-us.apache.org/repos/asf/qpid-dispatch/tree/739dff26
Diff: http://git-wip-us.apache.org/repos/asf/qpid-dispatch/diff/739dff26
Branch: refs/heads/master
Commit: 739dff26cd730faa9f41d0416ca9c5b523cc8e88
Parents: 58143c8
Author: Ernest Allen <ea...@redhat.com>
Authored: Thu Feb 18 12:59:27 2016 -0500
Committer: Ernest Allen <ea...@redhat.com>
Committed: Thu Feb 18 12:59:27 2016 -0500
----------------------------------------------------------------------
console/stand-alone/plugin/js/qdrTopology.js | 1871 +++++++++++++++++++++
1 file changed, 1871 insertions(+)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/739dff26/console/stand-alone/plugin/js/qdrTopology.js
----------------------------------------------------------------------
diff --git a/console/stand-alone/plugin/js/qdrTopology.js b/console/stand-alone/plugin/js/qdrTopology.js
new file mode 100644
index 0000000..c8921ff
--- /dev/null
+++ b/console/stand-alone/plugin/js/qdrTopology.js
@@ -0,0 +1,1871 @@
+/*
+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) {
+
+ /**
+ * @method SettingsController
+ * @param $scope
+ * @param QDRServer
+ *
+ * Controller that handles the QDR settings page
+ */
+
+ /**
+ * @function NavBarController
+ *
+ * @param $scope
+ * @param workspace
+ *
+ * The controller for this plugin's navigation bar
+ *
+ */
+
+ QDR.module.controller("QDR.TopologyController", ['$scope', '$rootScope', 'uiGridConstants', 'QDRService', '$uibModal', '$location', '$timeout',
+ function($scope, $rootScope, uiGridConstants, QDRService, $uibModal, $location, $timeout) {
+
+ QDR.log.debug("started QDR.TopologyController with location.url: " + $location.url());
+ var urlPrefix = window.location.pathname;
+
+ $scope.attributes = [];
+ $scope.connAttributes = [];
+ $scope.topoForm = "general";
+ $scope.topoFormSelected = "";
+ $scope.addingNode = {
+ step: 0,
+ hasLink: false,
+ trigger: ''
+ }; // shared object about the node that is be $scope.topoForm = "general";
+
+ var generalCellTemplate = '<div class="ngCellText"><span title="{{row.entity.description}}">{{row.entity.attributeName}}</span></div>';
+
+ $scope.isGeneral = function () {
+ //QDR.log.debug("$scope.topoForm=" + $scope.topoForm)
+ return $scope.topoForm === 'general';
+ };
+ $scope.isConnections = function () {
+ //QDR.log.debug("$scope.topoForm=" + $scope.topoForm)
+ return $scope.topoForm === 'connections';
+ };
+ $scope.isAddNode = function () {
+ //QDR.log.debug("$scope.topoForm=" + $scope.topoForm)
+ return $scope.topoForm === 'addNode';
+ }
+
+ $scope.getTableHeight = function (rows) {
+ return {height: (rows.length * 30) + "px"};
+ }
+ $scope.isSelected = function () {
+ return ($scope.topoFormSelected != "");
+ }
+
+ $scope.cancel = function () {
+ $scope.addingNode.step = 0;
+ }
+ $scope.editNewRouter = function () {
+ $scope.addingNode.trigger = 'editNode';
+ }
+
+ $scope.topoGridOptions = {
+ data: 'attributes',
+ enableColumnResize: true,
+ enableHorizontalScrollbar: uiGridConstants.scrollbars.NEVER,
+ enableVerticalScrollbar: uiGridConstants.scrollbars.NEVER,
+ multiSelect: false,
+ columnDefs: [
+ {
+ field: 'attributeName',
+ displayName: 'Attribute',
+ cellTemplate: generalCellTemplate
+ },
+ {
+ field: 'attributeValue',
+ displayName: 'Value'
+ }
+ ]
+ };
+ $scope.topoConnOptions = angular.copy($scope.topoGridOptions);
+ $scope.topoConnOptions.data = 'connAttributes';
+ 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: '3D Globe view', name: 'Globe', 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.topoForm = 'general'
+ $scope.topoFormSelected = '';
+ $scope.addingNode.step = 0;
+ } else {
+ // start adding node mode
+ $scope.addingNode.step = 1;
+ }
+ } else {
+ $scope.topoForm = 'general'
+ $scope.topoFormSelected = '';
+ $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;
+ })
+ $scope.topoForm = 'general'
+ $scope.topoFormSelected = '';
+ } else if (newValue > 0) {
+ // we are starting the add mode
+ $scope.topoForm = 'addNode';
+ $scope.topoFormSelected = 'addNode';
+
+ 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;
+ }
+
+
+ // 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 (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);
+ }
+
+ var mouseX, mouseY;
+ // event handlers for popup context menu
+ $(document).mousemove(function (e) {
+ mouseX = e.clientX;
+ mouseY = e.clientY;
+ });
+ $(document).mousemove();
+ $(document).click(function (e) {
+ $scope.contextNode = null;
+ $(".contextMenu").fadeOut(200);
+ });
+
+
+ // set up SVG for D3
+ var width, height;
+ var tpdiv = $('#topology');
+ var colors = {'inter-router': "#EAEAEA", 'normal': "#F0F000", 'on-demand': '#00F000'};
+ var gap = 5;
+ var radii = {'inter-router': 25, 'normal': 15, 'on-demand': 15};
+ var radius = 25;
+ var radiusNormal = 15;
+ width = tpdiv.width() - gap;
+ height = $(document).height() - gap;
+
+ var svg;
+ var force;
+ var animate = false; // should the force graph organize itself when it is displayed
+ var path, circle;
+ var savedKeys = {};
+
+ // 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) {
+ var containerName;
+ if (nodeInfo) {
+ var node = nodeInfo[id];
+ if (node) {
+ containerName = node['.container'].results[0][0];
+ }
+ }
+ return { key: id,
+ name: name,
+ nodeType: nodeType,
+ containerName: containerName,
+ 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});
+ }
+ }
+
+ var cities = ["Raleigh"];
+ var possibleCities = ["Boston","Tel Aviv-Yafo", "Brno", "Toronto", "Beijing", , "Ashburn", "Raleigh"]
+ //var drag;
+ // create an bare svg element and
+ // initialize the nodes and links array from the QDRService.topology._nodeInfo object
+ var initForceGraph = function () {
+ //QDR.log.debug("initForceGraph called");
+ nodes = [];
+ links = [];
+
+ svg = d3.select('#topology')
+ .append('svg')
+ .attr("id", "SVG_ID")
+ .attr('width', width)
+ .attr('height', height)
+ .on("contextmenu", function(d) {
+ 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) {
+ d3.select("#crosssection").style("display","none");
+ d3.select("#crosssection svg").remove();
+
+ });
+
+ // 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: height / 2 + yInit,
+ fixed: false};
+ }
+ 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;
+ cities = ["Raleigh"];
+ for (var id in nodeInfo) {
+ var onode = nodeInfo[id];
+ var conns = onode['.connection'].results;
+ var attrs = onode['.connection'].attributeNames;
+
+ for (var j = 0; j < conns.length; j++) {
+ var role = QDRService.valFor(attrs, conns[j], "role");
+ 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);
+ var parent = getNodeIndex(QDRService.nameFromId(id));
+ //QDR.log.debug("external client parent is " + parent);
+
+ // 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};
+ }
+ //QDR.log.debug("adding node " + nodeIndex);
+ nodes.push( aNode(id, name, role, nodeInfo, nodes.length, position.x, position.y, j, position.fixed) );
+ // now add a link
+ getLink(parent, nodes.length-1, dir);
+ client++;
+
+/*
+ var container = QDRService.valFor(attrs, conns[j], "container");
+ var parts = container.split('.')
+ if (parts.length) {
+ var city = parts[parts.length-1]
+ if (city === 'TelAvivYafo')
+ city = 'Tel Aviv-Yafo'
+ if (possibleCities.indexOf(city) > -1) {
+ if (cities.indexOf(city) == -1) {
+ cities.push(city);
+ }
+ }
+ } else {
+ // there was no city
+ var user = QDRService.valFor(attrs, conns[j], "user");
+ city = 'Boston'
+ if (cities.indexOf(city) == -1 && role == 'normal' && user != "anonymous") {
+ cities.push(city);
+ }
+
+ }
+*/
+ }
+ }
+ source++;
+ }
+
+ $scope.schema = QDRService.schema;
+ // add a row for each attribute in .router attributeNames array
+ for (var id in nodeInfo) {
+ var onode = nodeInfo[id];
+
+ initForm(onode['.connection'].attributeNames, onode['.connection'].results[0], QDRService.schema.entityTypes.connection, $scope.connAttributes);
+ initForm(onode['.router'].attributeNames, onode['.router'].results[0], QDRService.schema.entityTypes.router, $scope.attributes);
+
+ break;
+ }
+ // 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()
+
+ //drag = force.drag()
+ // .on("dragstart", dragstart);
+
+ 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();
+ }
+/*
+ function dragstart(d) {
+ d3.select(this).classed("fixed", d.fixed = true);
+ }
+
+ function dblclick(d) {
+ d3.select(this).classed("fixed", d.fixed = false);
+ }
+*/
+ var initGlobe = function (clients) {
+ d3.select(window)
+ .on("mousemove", mousemove)
+ .on("mouseup", mouseup);
+
+ var width = 960,
+ height = 500;
+
+ var proj = d3.geo.orthographic()
+ .scale(220)
+ .translate([width / 2, height / 2])
+ .clipAngle(90);
+
+ var path = d3.geo.path().projection(proj).pointRadius(1.5);
+
+ var links = [],
+ arcLines = [];
+
+ var graticule = d3.geo.graticule();
+ d3.select("#geology svg").remove();
+ var svg = d3.select("#geology").append("svg")
+ .attr("width", width)
+ .attr("height", height)
+ .on("mousedown", mousedown);
+
+ queue()
+ .defer(d3.json, "plugin/data/world-110m.json")
+ .defer(d3.json, "plugin/data/places1.json")
+ .await(ready);
+
+ function ready(error, world, places) {
+ var ocean_fill = svg.append("defs").append("radialGradient")
+ .attr("id", "ocean_fill")
+ .attr("cx", "75%")
+ .attr("cy", "25%");
+ ocean_fill.append("stop").attr("offset", "5%").attr("stop-color", "#fff");
+ ocean_fill.append("stop").attr("offset", "100%").attr("stop-color", "#eef");
+
+ var globe_highlight = svg.append("defs").append("radialGradient")
+ .attr("id", "globe_highlight")
+ .attr("cx", "75%")
+ .attr("cy", "25%");
+ globe_highlight.append("stop")
+ .attr("offset", "5%").attr("stop-color", "#ffd")
+ .attr("stop-opacity","0.6");
+ globe_highlight.append("stop")
+ .attr("offset", "100%").attr("stop-color", "#ba9")
+ .attr("stop-opacity","0.1");
+
+ var globe_shading = svg.append("defs").append("radialGradient")
+ .attr("id", "globe_shading")
+ .attr("cx", "55%")
+ .attr("cy", "45%");
+ globe_shading.append("stop")
+ .attr("offset","30%").attr("stop-color", "#fff")
+ .attr("stop-opacity","0")
+ globe_shading.append("stop")
+ .attr("offset","100%").attr("stop-color", "#505962")
+ .attr("stop-opacity","0.2")
+
+ var drop_shadow = svg.append("defs").append("radialGradient")
+ .attr("id", "drop_shadow")
+ .attr("cx", "50%")
+ .attr("cy", "50%");
+ drop_shadow.append("stop")
+ .attr("offset","20%").attr("stop-color", "#000")
+ .attr("stop-opacity",".5")
+ drop_shadow.append("stop")
+ .attr("offset","100%").attr("stop-color", "#000")
+ .attr("stop-opacity","0")
+
+ svg.append("ellipse")
+ .attr("cx", 440).attr("cy", 450)
+ .attr("rx", proj.scale()*.90)
+ .attr("ry", proj.scale()*.25)
+ .attr("class", "noclicks")
+ .style("fill", "url("+urlPrefix+"#drop_shadow)");
+
+ svg.append("circle")
+ .attr("cx", width / 2).attr("cy", height / 2)
+ .attr("r", proj.scale())
+ .attr("class", "noclicks")
+ .style("fill", "url("+urlPrefix+"#ocean_fill)");
+
+ svg.append("path")
+ .datum(topojson.object(world, world.objects.land))
+ .attr("class", "land noclicks")
+ .attr("d", path);
+
+ svg.append("path")
+ .datum(graticule)
+ .attr("class", "graticule noclicks")
+ .attr("d", path);
+
+ svg.append("circle")
+ .attr("cx", width / 2).attr("cy", height / 2)
+ .attr("r", proj.scale())
+ .attr("class","noclicks")
+ .style("fill", "url("+urlPrefix+"#globe_highlight)");
+
+ svg.append("circle")
+ .attr("cx", width / 2).attr("cy", height / 2)
+ .attr("r", proj.scale())
+ .attr("class","noclicks")
+ .style("fill", "url("+urlPrefix+"#globe_shading)");
+
+ var filtered = places.features.filter( function (feature) {
+ return clients.indexOf(feature.properties.NAME) > -1
+ })
+ svg.append("g").attr("class","points")
+ .selectAll("text").data(filtered)
+ .enter().append("path")
+ .attr("class", "point")
+ .attr("d", path);
+
+ svg.append("g").attr("class","labels")
+ .selectAll("text").data(filtered)
+ .enter().append("text")
+ .attr("class", "label")
+ .text(function(d) { return d.properties.NAME })
+
+ position_labels();
+
+ // spawn links between cities as source/target coord pairs
+ places.features.forEach(function(a, i) {
+ if (clients.indexOf(a.properties.NAME) > -1) {
+ places.features.forEach(function(b, j) {
+ if (b.properties.NAME === 'Raleigh') {
+ if (j > i) { // avoid duplicates
+ links.push({
+ source: a.geometry.coordinates,
+ target: b.geometry.coordinates
+ });
+ }
+ }
+ });
+ }
+ });
+
+ // build geoJSON features from links array
+ links.forEach(function(e,i,a) {
+ var feature = { "type": "Feature", "geometry": { "type": "LineString", "coordinates": [e.source,e.target] }}
+ arcLines.push(feature)
+ })
+
+ svg.append("g").attr("class","arcs")
+ .selectAll("path").data(arcLines)
+ .enter().append("path")
+ .attr("class","arc")
+ .attr("d",path)
+ refresh();
+ }
+
+ function position_labels() {
+ var centerPos = proj.invert([width/2,height/2]);
+
+ var arc = d3.geo.greatArc();
+
+ svg.selectAll(".label")
+ .attr("transform", function(d) {
+ var loc = proj(d.geometry.coordinates),
+ x = loc[0],
+ y = loc[1];
+ var offset = x < width/2 ? -5 : 5;
+ return "translate(" + (x+offset) + "," + (y-2) + ")"
+ })
+ .style("display",function(d) {
+ var d = arc.distance({source: d.geometry.coordinates, target: centerPos});
+ return (d > 1.57) ? 'none' : 'inline';
+ })
+ }
+
+ function refresh() {
+ svg.selectAll(".land").attr("d", path);
+ svg.selectAll(".point").attr("d", path);
+ svg.selectAll(".graticule").attr("d", path);
+ svg.selectAll(".arc").attr("d", path);
+ position_labels();
+ }
+
+ // modified from http://bl.ocks.org/1392560
+ var m0, o0;
+ o0 = angular.fromJson(localStorage["QDR.rotate"]);
+ if (o0)
+ proj.rotate(o0);
+
+ function mousedown() {
+ m0 = [d3.event.pageX, d3.event.pageY];
+ o0 = proj.rotate();
+ d3.event.preventDefault();
+ }
+ function mousemove() {
+ if (m0) {
+ var m1 = [d3.event.pageX, d3.event.pageY]
+ , o1 = [o0[0] + (m1[0] - m0[0]) / 6, o0[1] + (m0[1] - m1[1]) / 6];
+ o1[1] = o1[1] > 30 ? 30 :
+ o1[1] < -30 ? -30 :
+ o1[1];
+ proj.rotate(o1);
+ refresh();
+ }
+ }
+ function mouseup() {
+ if (m0) {
+ mousemove();
+ m0 = null;
+ localStorage["QDR.rotate"] = angular.toJson(proj.rotate());
+ }
+ }
+ }
+
+ // called when we mouseover a node
+ // we need to update the table
+ function updateNodeForm (d) {
+ //QDR.log.debug("update form info for ");
+ //console.dump(d);
+ var nodeInfo = QDRService.topology.nodeInfo();
+ var onode = nodeInfo[d.key];
+ if (onode) {
+ var nodeResults = onode['.router'].results[0];
+ var nodeAttributes = onode['.router'].attributeNames;
+
+ for (var i=0; i<$scope.attributes.length; ++i) {
+ var idx = nodeAttributes.indexOf($scope.attributes[i].attributeName);
+ if (idx > -1) {
+ if ($scope.attributes[i].attributeValue != nodeResults[idx]) {
+ // highlight the changed data
+ $scope.attributes[i].attributeValue = nodeResults[idx];
+
+ }
+ }
+ }
+ }
+ $scope.topoForm = "general";
+ $scope.$apply();
+ }
+
+ function updateConnForm (d, resultIndex) {
+ var nodeInfo = QDRService.topology.nodeInfo();
+ var onode = nodeInfo[d.key];
+ if (onode && onode['.connection']) {
+ var nodeResults = onode['.connection'].results[resultIndex];
+ var nodeAttributes = onode['.connection'].attributeNames;
+
+ for (var i=0; i<$scope.connAttributes.length; ++i) {
+ var idx = nodeAttributes.indexOf($scope.connAttributes[i].attributeName);
+ if (idx > -1) {
+ try {
+ if ($scope.connAttributes[i].attributeValue != nodeResults[idx]) {
+ // highlight the changed data
+ $scope.connAttributes[i].attributeValue = nodeResults[idx];
+
+ }
+ } catch (err) {
+ QDR.log.error("error updating form" + err)
+ }
+ }
+ }
+ }
+ $scope.topoForm = "connections";
+ $scope.$apply();
+ }
+
+
+ function getContainerIndex(_id) {
+ var nodeIndex = 0;
+ var nodeInfo = QDRService.topology.nodeInfo();
+ for (var id in nodeInfo) {
+ var node = nodeInfo[id];
+ if (node['.container'].results[0][0] == _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() {
+ // 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 deltaX = d.target.x - d.source.x,
+ deltaY = d.target.y - d.source.y,
+ dist = Math.sqrt(deltaX * deltaX + deltaY * deltaY),
+ normX = deltaX / dist,
+ normY = deltaY / dist;
+ var sourcePadding, targetPadding;
+ if (d.target.nodeType == "inter-router") {
+ // right arrow left line start
+ sourcePadding = d.left ? radius + 8 : radius;
+ // left arrow right line start
+ targetPadding = d.right ? radius + 16 : radius;
+ } else {
+ sourcePadding = d.left ? radiusNormal + 18 : radiusNormal;
+ targetPadding = d.right ? radiusNormal + 16 : radiusNormal;
+ }
+ var sourceX = d.source.x + (sourcePadding * normX),
+ sourceY = d.source.y + (sourcePadding * normY),
+ targetX = d.target.x - (targetPadding * normX),
+ targetY = d.target.y - (targetPadding * normY);
+ return 'M' + sourceX + ',' + sourceY + 'L' + targetX + ',' + targetY;
+ });
+
+ circle.attr('transform', function (d) {
+ d.x = Math.max(d.x, radiusNormal * 2);
+ d.y = Math.max(d.y, radiusNormal * 2);
+ return 'translate(' + d.x + ',' + d.y + ')';
+ });
+ 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], "routerId" );
+ 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;
+ }
+
+ // 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);
+ //svg.classed('ctrl', true);
+
+ // 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'; } )
+ .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.name) {
+ 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;
+ }
+ updateConnForm(left, resultIndex);
+ }
+
+ // select link
+ mousedown_link = d;
+ selected_link = mousedown_link;
+ //selected_node = null;
+ //mousedown_node = null;
+ restart();
+ })
+ .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");
+ // select link
+ selected_link = null;
+ //selected_node = null;
+ //mousedown_node = null;
+ restart();
+ })
+ .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');
+ })
+ .on("dblclick", function (d) {
+ var pos = d3.mouse(this);
+ var diameter = 400;
+ var format = d3.format(",d");
+ var pack = d3.layout.pack()
+ .size([diameter - 4, diameter - 4])
+ .padding(3)
+ .value(function(d) { return d.size; });
+
+ var svg = d3.select("#crosssection").append("svg")
+ .attr("width", diameter)
+ .attr("height", diameter);
+ var svgg = svg.append("g")
+ .attr("transform", "translate(2,2)");
+
+ svg.on('click', function (d) {
+ d3.select("#crosssection").style("display","none");
+ })
+
+ 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.containerName) {
+ 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'];
+ containerIndex = links.attributeNames.indexOf('remoteContainer');
+ var nameIndex = links.attributeNames.indexOf('name');
+ var linkDirIndex = links.attributeNames.indexOf('linkDir');
+ links.results.forEach ( function (link) {
+ if (link[containerIndex] == d.target.containerName)
+ root.children.push (
+ { name: "(" + link[linkDirIndex] + ") " + link[nameIndex],
+ 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 + ")"; })
+ .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" : ".3em"})
+ .style("text-anchor", "middle")
+ .text(function(d) {
+ return d.name.substring(0, d.r / 3);
+ });
+
+ $('.hastip').tooltipsy({ alignTo: 'cursor'});
+ d3.select("#crosssection").style("display","block");
+ })
+
+
+ // 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');
+
+ // add new circles and set their attr/class/behavior
+ 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' } )
+
+/*
+ .style('fill', function (d) {
+ var sColor = colors[d.nodeType];
+ return (d === selected_node) ? d3.rgb(sColor).brighter().toString() : d3.rgb(sColor);
+ })
+ .style('stroke', function (d) {
+ var sColor = colors[d.nodeType];
+ return d3.rgb(sColor).darker().toString();
+ })
+*/
+ .on('mouseover', function (d) {
+ 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");
+ updateNodeForm(d);
+ } else if (d.nodeType === 'normal' || d.nodeType === 'on-demand') {
+ //QDR.log.debug("showing connections form");
+ updateConnForm(d, 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) {
+ // 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) {
+ 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) {
+ 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;
+ $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;
+ $scope.topoFormSelected = "";
+ }
+ else {
+ selected_node = mousedown_node;
+ if (d.nodeType === 'inter-router') {
+ //QDR.log.debug("showing general form");
+ updateNodeForm(d);
+ $scope.topoFormSelected = "general";
+ } else if (d.nodeType === 'normal' || d.nodeType === 'on-demand') {
+ //QDR.log.debug("showing connections form");
+ updateConnForm(d, d.resultIndex);
+ $scope.topoFormSelected = "connections";
+ }
+ }
+ for (var i=0; i<links.length; ++i) {
+ links[i]['highlighted'] = false;
+ }
+ mousedown_node = null;
+ $scope.$apply();
+ restart(false);
+
+ })
+ .on("dblclick", function (d) {
+ 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();
+ $scope.$apply();
+ }
+ })
+ .on("contextmenu", function(d) {
+ $(document).click();
+ d3.event.preventDefault();
+ $scope.contextNode = d;
+ $scope.$apply(); // we just changed a scope valiable during an async event
+ d3.select('#node_context_menu')
+ .style('left', (mouseX + $(document).scrollLeft()) + "px")
+ .style('top', (mouseY + $(document).scrollTop()) + "px")
+ .style('display', 'block');
+
+ });
+
+ // show node IDs
+ g.append('svg:text')
+ .attr('x', 0)
+ .attr('y', 4)
+ .attr('class', 'id')
+ .text(function (d) {
+ return (d.nodeType === 'normal' || d.nodeType == 'on-demand') ? d.name.slice(-1) :
+ d.name.length>7 ? d.name.substr(0,6)+'...' : d.name;
+ });
+
+ // remove old nodes
+ circle.exit().remove();
+
+ if (!mousedown_node || !selected_node)
+ return;
+
+ if (!start)
+ return;
+ // set the graph in motion
+ //QDR.log.debug("mousedown_node is " + mousedown_node);
+ force.start();
+
+ }
+
+ 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();
+ animate = true;
+ initForceGraph();
+ initGlobe(cities);
+ //if ($location.path().startsWith("/topology"))
+ // Core.notification('info', "Qpid dispatch router topology changed");
+
+ } else {
+ //QDR.log.debug("no changes")
+ }
+ });
+
+ function hasChanged () {
+ 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();
+ });
+
+ initForceGraph();
+ saveChanged();
+ QDRService.startUpdating();
+
+ initGlobe(cities)//, "Boston", "Tel Aviv-Yafo"]);
+
+ function doAddDialog(NewRouterName) {
+ var modalInstance = $uibModal.open({
+ animation: true,
+ controller: 'QDR.NodeDialogController',
+ templateUrl: 'node-config-template.html',
+ size: 'lg',
+ resolve: {
+ newname: function () {
+ return NewRouterName;
+ }
+ }
+ });
+ modalInstance.result.then(function (result) {
+ if (result)
+ setTimeout(doDownloadDialog, 100, result);
+ });
+ };
+
+ function doDownloadDialog(result) {
+ var modalInstance = $uibModal.open({
+ animation: true,
+ controller: 'QDR.DownloadDialogController',
+ templateUrl: 'download-dialog-template.html',
+ resolve: {
+ results: function () {
+ return result;
+ }
+ }
+ });
+ };
+ }]);
+
+ QDR.module.controller("QDR.NodeDialogController", function($scope, QDRService, $uibModalInstance, newname) {
+ var schema = QDRService.schema;
+ var myEntities = ['container', '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 == 'addr'})[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 == 'addr'})[0].value =
+ QDRService.valFor(attrs, res, 'addr')
+ 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 == 'addr'})[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.cancel = function () {
+ $uibModalInstance.close()
+ };
+ $scope.testPattern = function (attr) {
+ if (attr.rawtype == 'path')
+ return /^(\/)?([^/\0]+(\/)?)+$/;
+ //return /^(.*\/)([^/]*)$/;
+ return /(.*?)/;
+ }
+
+ $scope.attributeDescription = '';
+ $scope.attributeType = '';
+ $scope.attributeRequired = '';
+ $scope.attributeUnique = '';
+ $scope.active = 'container'
+ $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 () {
+ $uibModalInstance.close({entities: $scope.entities, annotations: annotations});
+ }
+
+ $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();
+
+ });
+
+QDR.module.controller("QDR.DownloadDialogController", function($scope, QDRService, $templateCache, $window, $uibModalInstance, 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 blob = new Blob([$scope.output], { type: 'text/plain' });
+ var downloadLink = angular.element('<a></a>');
+ downloadLink.attr('href', ($window.URL || $window.webkitURL).createObjectURL(blob));
+ downloadLink.attr('download', $scope.newRouterName);
+ downloadLink[0].click();
+ }
+
+ $scope.downloadPart = function (part) {
+ var linkName = part.link.__data__.source.name + 'additional.conf';
+ var blob = new Blob([part.output], { type: 'text/plain' });
+ var downloadLink = angular.element('<a></a>');
+ downloadLink.attr('href', ($window.URL || $window.webkitURL).createObjectURL(blob));
+ downloadLink.attr('download', linkName);
+ downloadLink[0].click();
+
+ QDR.log.debug(part);
+ }
+
+ $scope.done = function () {
+ $uibModalInstance.close();
+ }
+});
+
+ return QDR;
+}(QDR || {}));
---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@qpid.apache.org
For additional commands, e-mail: commits-help@qpid.apache.org