summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHiroyuki Eguchi <h-eguchi@az.jp.nec.com>2017-03-01 22:06:27 +0900
committerHiroyuki Eguchi <h-eguchi@az.jp.nec.com>2017-03-01 22:08:14 +0900
commit9b0f08ab3148d63091930fa4ee780fc6c188630f (patch)
tree4921068447cf4a619904360a2170961d29f28189
parent856f767a81d440c98b504abb49b44eb7e2fecf7f (diff)
Add Overview Panel
Add Overview Panel like a neutron network topology panel. User can see all relationships among machine learning resources. implements blueprint overview-panel Change-Id: I1ee215e43039d984b494aa9f407d176ce008ea81
Notes
Notes (review): Code-Review+2: Hiroyuki Eguchi <h-eguchi@az.jp.nec.com> Workflow+1: Hiroyuki Eguchi <h-eguchi@az.jp.nec.com> Verified+2: Jenkins Submitted-by: Jenkins Submitted-at: Wed, 01 Mar 2017 13:14:10 +0000 Reviewed-on: https://review.openstack.org/433382 Project: openstack/meteos-ui Branch: refs/heads/master
-rw-r--r--meteos_ui/content/machine_learning/overview/__init__.py0
-rw-r--r--meteos_ui/content/machine_learning/overview/panel.py23
-rw-r--r--meteos_ui/content/machine_learning/overview/tests.py19
-rw-r--r--meteos_ui/content/machine_learning/overview/urls.py20
-rw-r--r--meteos_ui/enabled/_1720_machine_learning_overview_panel.py21
-rw-r--r--meteos_ui/enabled/_1730_machine_learning_templates_panel.py (renamed from meteos_ui/enabled/_1720_machine_learning_templates_panel.py)0
-rw-r--r--meteos_ui/enabled/_1740_machine_learning_experiments_panel.py (renamed from meteos_ui/enabled/_1730_machine_learning_experiments_panel.py)0
-rw-r--r--meteos_ui/enabled/_1750_machine_learning_datasets_panel.py (renamed from meteos_ui/enabled/_1740_machine_learning_datasets_panel.py)0
-rw-r--r--meteos_ui/enabled/_1760_machine_learning_models_panel.py (renamed from meteos_ui/enabled/_1750_machine_learning_models_panel.py)0
-rw-r--r--meteos_ui/enabled/_1770_machine_learning_model_evaluations_panel.py (renamed from meteos_ui/enabled/_1760_machine_learning_model_evaluations_panel.py)0
-rw-r--r--meteos_ui/enabled/_1780_machine_learning_learnings_panel.py (renamed from meteos_ui/enabled/_1770_machine_learning_learnings_panel.py)0
-rw-r--r--meteos_ui/static/dashboard/machine_learning/machine_learning.module.js3
-rw-r--r--meteos_ui/static/dashboard/machine_learning/overview/details.module.js215
-rw-r--r--meteos_ui/static/dashboard/machine_learning/overview/images/meteos-dataset.svg36
-rw-r--r--meteos_ui/static/dashboard/machine_learning/overview/images/meteos-evaluation.svg279
-rw-r--r--meteos_ui/static/dashboard/machine_learning/overview/images/meteos-experiment.svg39
-rw-r--r--meteos_ui/static/dashboard/machine_learning/overview/images/meteos-learning.svg27
-rw-r--r--meteos_ui/static/dashboard/machine_learning/overview/images/meteos-model.svg31
-rw-r--r--meteos_ui/static/dashboard/machine_learning/overview/images/meteos-template.svg27
-rw-r--r--meteos_ui/static/dashboard/machine_learning/overview/overview.module.js52
-rw-r--r--meteos_ui/static/dashboard/machine_learning/overview/overview.module.spec.js23
-rw-r--r--meteos_ui/static/dashboard/machine_learning/overview/panel.html8
22 files changed, 822 insertions, 1 deletions
diff --git a/meteos_ui/content/machine_learning/overview/__init__.py b/meteos_ui/content/machine_learning/overview/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/meteos_ui/content/machine_learning/overview/__init__.py
diff --git a/meteos_ui/content/machine_learning/overview/panel.py b/meteos_ui/content/machine_learning/overview/panel.py
new file mode 100644
index 0000000..7f54a19
--- /dev/null
+++ b/meteos_ui/content/machine_learning/overview/panel.py
@@ -0,0 +1,23 @@
1# Licensed under the Apache License, Version 2.0 (the "License"); you may
2# not use this file except in compliance with the License. You may obtain
3# a copy of the License at
4#
5# http://www.apache.org/licenses/LICENSE-2.0
6#
7# Unless required by applicable law or agreed to in writing, software
8# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
9# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
10# License for the specific language governing permissions and limitations
11# under the License.
12
13from django.utils.translation import ugettext_lazy as _
14import horizon
15
16# This panel will be loaded from horizon, because specified in enabled file.
17# To register REST api, import below here.
18from meteos_ui.api import rest_api # noqa
19
20
21class Overview(horizon.Panel):
22 name = _("Overview")
23 slug = "machine_learning.overview"
diff --git a/meteos_ui/content/machine_learning/overview/tests.py b/meteos_ui/content/machine_learning/overview/tests.py
new file mode 100644
index 0000000..172bc42
--- /dev/null
+++ b/meteos_ui/content/machine_learning/overview/tests.py
@@ -0,0 +1,19 @@
1# Licensed under the Apache License, Version 2.0 (the "License"); you may
2# not use this file except in compliance with the License. You may obtain
3# a copy of the License at
4#
5# http://www.apache.org/licenses/LICENSE-2.0
6#
7# Unless required by applicable law or agreed to in writing, software
8# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
9# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
10# License for the specific language governing permissions and limitations
11# under the License.
12
13from openstack_dashboard.test import helpers as test
14
15
16class OverviewTests(test.TestCase):
17 # Unit tests for Overview.
18 def test_me(self):
19 self.assertTrue(1 + 1 == 2)
diff --git a/meteos_ui/content/machine_learning/overview/urls.py b/meteos_ui/content/machine_learning/overview/urls.py
new file mode 100644
index 0000000..b31efda
--- /dev/null
+++ b/meteos_ui/content/machine_learning/overview/urls.py
@@ -0,0 +1,20 @@
1# Licensed under the Apache License, Version 2.0 (the "License"); you may
2# not use this file except in compliance with the License. You may obtain
3# a copy of the License at
4#
5# http://www.apache.org/licenses/LICENSE-2.0
6#
7# Unless required by applicable law or agreed to in writing, software
8# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
9# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
10# License for the specific language governing permissions and limitations
11# under the License.
12
13from django.conf.urls import url
14from django.utils.translation import ugettext_lazy as _
15from horizon.browsers import views
16
17title = _("Overview")
18urlpatterns = [
19 url('', views.AngularIndexView.as_view(title=title), name='index'),
20]
diff --git a/meteos_ui/enabled/_1720_machine_learning_overview_panel.py b/meteos_ui/enabled/_1720_machine_learning_overview_panel.py
new file mode 100644
index 0000000..9854858
--- /dev/null
+++ b/meteos_ui/enabled/_1720_machine_learning_overview_panel.py
@@ -0,0 +1,21 @@
1# Licensed under the Apache License, Version 2.0 (the "License"); you may
2# not use this file except in compliance with the License. You may obtain
3# a copy of the License at
4#
5# http://www.apache.org/licenses/LICENSE-2.0
6#
7# Unless required by applicable law or agreed to in writing, software
8# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
9# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
10# License for the specific language governing permissions and limitations
11# under the License.
12
13# The slug of the panel to be added to HORIZON_CONFIG. Required.
14PANEL = 'machine_learning.overview'
15# The slug of the panel group the PANEL is associated with.
16PANEL_GROUP = 'machine_learning'
17# The slug of the dashboard the PANEL associated with. Required.
18PANEL_DASHBOARD = 'project'
19
20# Python panel class of the PANEL to be added.
21ADD_PANEL = 'meteos_ui.content.machine_learning.overview.panel.Overview'
diff --git a/meteos_ui/enabled/_1720_machine_learning_templates_panel.py b/meteos_ui/enabled/_1730_machine_learning_templates_panel.py
index 030cd6e..030cd6e 100644
--- a/meteos_ui/enabled/_1720_machine_learning_templates_panel.py
+++ b/meteos_ui/enabled/_1730_machine_learning_templates_panel.py
diff --git a/meteos_ui/enabled/_1730_machine_learning_experiments_panel.py b/meteos_ui/enabled/_1740_machine_learning_experiments_panel.py
index 781b0f0..781b0f0 100644
--- a/meteos_ui/enabled/_1730_machine_learning_experiments_panel.py
+++ b/meteos_ui/enabled/_1740_machine_learning_experiments_panel.py
diff --git a/meteos_ui/enabled/_1740_machine_learning_datasets_panel.py b/meteos_ui/enabled/_1750_machine_learning_datasets_panel.py
index 4dbc29a..4dbc29a 100644
--- a/meteos_ui/enabled/_1740_machine_learning_datasets_panel.py
+++ b/meteos_ui/enabled/_1750_machine_learning_datasets_panel.py
diff --git a/meteos_ui/enabled/_1750_machine_learning_models_panel.py b/meteos_ui/enabled/_1760_machine_learning_models_panel.py
index e673399..e673399 100644
--- a/meteos_ui/enabled/_1750_machine_learning_models_panel.py
+++ b/meteos_ui/enabled/_1760_machine_learning_models_panel.py
diff --git a/meteos_ui/enabled/_1760_machine_learning_model_evaluations_panel.py b/meteos_ui/enabled/_1770_machine_learning_model_evaluations_panel.py
index 0e9c958..0e9c958 100644
--- a/meteos_ui/enabled/_1760_machine_learning_model_evaluations_panel.py
+++ b/meteos_ui/enabled/_1770_machine_learning_model_evaluations_panel.py
diff --git a/meteos_ui/enabled/_1770_machine_learning_learnings_panel.py b/meteos_ui/enabled/_1780_machine_learning_learnings_panel.py
index ebc4da4..ebc4da4 100644
--- a/meteos_ui/enabled/_1770_machine_learning_learnings_panel.py
+++ b/meteos_ui/enabled/_1780_machine_learning_learnings_panel.py
diff --git a/meteos_ui/static/dashboard/machine_learning/machine_learning.module.js b/meteos_ui/static/dashboard/machine_learning/machine_learning.module.js
index 477f2e0..b5884c1 100644
--- a/meteos_ui/static/dashboard/machine_learning/machine_learning.module.js
+++ b/meteos_ui/static/dashboard/machine_learning/machine_learning.module.js
@@ -28,7 +28,8 @@
28 'horizon.dashboard.machine_learning.datasets', 28 'horizon.dashboard.machine_learning.datasets',
29 'horizon.dashboard.machine_learning.models', 29 'horizon.dashboard.machine_learning.models',
30 'horizon.dashboard.machine_learning.model_evaluations', 30 'horizon.dashboard.machine_learning.model_evaluations',
31 'horizon.dashboard.machine_learning.learnings' 31 'horizon.dashboard.machine_learning.learnings',
32 'horizon.dashboard.machine_learning.overview'
32 ]) 33 ])
33 .config(config) 34 .config(config)
34 35
diff --git a/meteos_ui/static/dashboard/machine_learning/overview/details.module.js b/meteos_ui/static/dashboard/machine_learning/overview/details.module.js
new file mode 100644
index 0000000..03c2617
--- /dev/null
+++ b/meteos_ui/static/dashboard/machine_learning/overview/details.module.js
@@ -0,0 +1,215 @@
1/**
2 * Licensed under the Apache License, Version 2.0 (the "License"); you may
3 * not use this file except in compliance with the License. You may obtain
4 * a copy of the License at
5 *
6 * http://www.apache.org/licenses/LICENSE-2.0
7 *
8 * Unless required by applicable law or agreed to in writing, software
9 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
10 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
11 * License for the specific language governing permissions and limitations
12 * under the License.
13 */
14(function () {
15 'use strict';
16
17 angular
18 .module('horizon.framework.widgets')
19 .controller('OverviewController', OverviewController);
20
21 OverviewController.$inject = [
22 '$q',
23 '$scope',
24 'horizon.dashboard.machine_learning.overview.basePath',
25 'horizon.app.core.openstack-service-api.meteos'
26 ];
27
28 function OverviewController($q, $scope, basePath, meteos) {
29
30 var topologyNodes = [];
31 var topologyLinks = [];
32
33 var templates = meteos.getTemplates().then(function(response){
34 response.data.items.map(addIcon, 'template');
35 });
36
37 var experiments = meteos.getExperiments().then(function(response){
38 response.data.items.map(addIcon, 'experiment');
39 });
40
41 var datasets = meteos.getDatasets().then(function(response){
42 response.data.items.map(addIcon, 'dataset');
43 });
44
45 var models = meteos.getModels().then(function(response){
46 response.data.items.map(addIcon, 'model');
47 });
48
49 var evaluations = meteos.getModelEvaluations().then(function(response){
50 response.data.items.map(addIcon, 'evaluation');
51 });
52
53 var learnings = meteos.getLearnings().then(function(response){
54 response.data.items.map(addIcon, 'learning');
55 });
56
57 function addIcon(item){
58
59 item.icon = "meteos-" + this + ".svg";
60 topologyNodes.push(item);
61 }
62
63 var promiseAll = $q.all([templates,
64 experiments,
65 datasets,
66 models,
67 evaluations,
68 learnings]);
69
70 promiseAll.then(drawTopology);
71
72 function drawTopology() {
73
74 angular.forEach(topologyNodes,function(record, index){
75 if("template_id" in record){
76 createIndex(index, record.template_id);
77 }
78 if("experiment_id" in record){
79 createIndex(index, record.experiment_id);
80 }
81 if("model_id" in record){
82 createIndex(index, record.model_id);
83 }
84 if("source_dataset_url" in record){
85 if ( record.source_dataset_url.indexOf('internal') != -1) {
86 createIndex(index, record.source_dataset_url.split('//')[1]);
87 }
88 }
89 });
90
91 function createIndex(source_index, id){
92 angular.forEach(topologyNodes,function(record,i){
93 if(record.id == id){
94 topologyLinks.push({"source": source_index, "target": i})
95 }
96 });
97 }
98
99 var topology = {
100 "nodes":topologyNodes,
101 "links":topologyLinks}
102
103 var width = 900,
104 height = 500;
105
106 var force = d3.layout.force()
107 .charge(-2500)
108 .linkDistance(100)
109 .size([width, height])
110 .nodes(topology.nodes)
111 .links(topology.links)
112 .start();
113
114 var zoom = d3.behavior.zoom()
115 .scaleExtent([1, 10])
116 .on("zoom", zoomed);
117
118 var svg = d3.select("#meteosTopologyCanvas").append("svg")
119 .attr("width", width)
120 .attr("height", height)
121 .append("g")
122 .call(zoom);
123
124 var rect = svg.append("rect")
125 .attr("width", width)
126 .attr("height", height)
127 .style("fill", "none");
128
129 var container = svg.append("g");
130
131 var link = container.append("g")
132 .attr("class", "links")
133 .selectAll(".link")
134 .data(topology.links)
135 .enter().append("line")
136 .attr("class", "link");
137
138 var node = container.append("g")
139 .attr("class", "nodes")
140 .selectAll(".node")
141 .data(topology.nodes)
142 .enter().append("g")
143 .attr("class", "node")
144 .attr("cx", function(d) { return d.x; })
145 .attr("cy", function(d) { return d.y; })
146 .call(force.drag);
147
148 var div = d3.select("#meteosMenu").append("div")
149 .style("width", "360px")
150 .style("height", "180px")
151 .style("background", "#d6dadf")
152 .style("position", "absolute")
153 .style("opacity", 0)
154 .style("text-overflow", "ellipsis")
155 .style("display", "inline-block")
156 .style("overflow", "hidden")
157 .style("border-radius", "8px")
158 .style("padding", "5px")
159 .style("box-shadow", "0px 0px 3px 3px #d6dadf");
160
161 node.append("image")
162 .attr("xlink:href", function(d) {return basePath + "/images/" + d.icon})
163 .attr("x", -35)
164 .attr("y", -35)
165 .attr("width", 70)
166 .attr("height", 70);
167
168 node.on("mouseover", function(d) {
169 div.transition()
170 .style("opacity", .9);
171 div.html(createMenu(d))
172 .style("left", (d3.event.pageX - 200) + "px")
173 .style("top", (d3.event.pageY - 10) + "px");
174 });
175
176 node.on("mouseout", function(d) {
177 div.transition()
178 .duration(600)
179 .style("opacity", 0);
180 });
181
182 node.append("text")
183 .attr("dx", 50)
184 .attr("dy", ".60em")
185 .text(function(d) { return d.name });
186
187 force.on("tick", function() {
188 link.attr("x1", function(d) { return d.source.x; })
189 .attr("y1", function(d) { return d.source.y; })
190 .attr("x2", function(d) { return d.target.x; })
191 .attr("y2", function(d) { return d.target.y; });
192 node.attr("transform", function(d) { return "translate(" + d.x + "," + d.y + ")"; });
193 });
194
195 var hiddenFields=['x', 'y', 'px', 'py',
196 'index','head','fixed','icon', 'stdout',
197 'weight', 'links', 'name', 'created_at'];
198
199 function createMenu(d){
200 var form = "";
201 angular.forEach(d, function(v, k){
202
203 if(hiddenFields.indexOf(k) == -1){
204 form += "<b>" + k + "</b> : " + v + "</br>";
205 }
206 });
207 return form;
208 }
209
210 function zoomed() {
211 container.attr("transform", "translate(" + d3.event.translate + ")scale(" + d3.event.scale + ")");
212 }
213 }
214 }
215})();
diff --git a/meteos_ui/static/dashboard/machine_learning/overview/images/meteos-dataset.svg b/meteos_ui/static/dashboard/machine_learning/overview/images/meteos-dataset.svg
new file mode 100644
index 0000000..8443853
--- /dev/null
+++ b/meteos_ui/static/dashboard/machine_learning/overview/images/meteos-dataset.svg
@@ -0,0 +1,36 @@
1<?xml version="1.0" standalone="no"?>
2<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 20010904//EN"
3 "http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd">
4<svg version="1.0" xmlns="http://www.w3.org/2000/svg"
5 width="356.000000pt" height="356.000000pt" viewBox="0 0 356.000000 356.000000"
6 preserveAspectRatio="xMidYMid meet">
7
8<g transform="translate(0.000000,356.000000) scale(0.100000,-0.100000)"
9fill="#000000" stroke="none">
10<path d="M1560 3549 c-313 -40 -615 -165 -870 -359 -97 -74 -247 -224 -322
11-323 -166 -217 -286 -482 -339 -744 -30 -153 -37 -436 -15 -593 98 -676 561
12-1229 1208 -1444 209 -69 293 -81 568 -81 206 0 248 3 340 23 621 135 1109
13552 1324 1134 86 231 101 325 101 618 -1 216 -3 257 -23 350 -77 355 -242 660
14-494 912 -283 283 -644 457 -1048 508 -97 12 -335 11 -430 -1z m368 -250 c264
15-29 481 -105 689 -242 353 -233 593 -594 670 -1007 27 -146 24 -431 -6 -570
16-45 -212 -134 -417 -254 -587 -80 -113 -248 -281 -360 -360 -173 -122 -375
17-209 -587 -254 -153 -33 -449 -33 -599 -1 -479 104 -860 400 -1079 838 -45 90
18-108 285 -126 394 -85 499 65 979 417 1339 129 132 250 219 417 301 259 128
19542 180 818 149z"/>
20<path d="M1345 2459 c-49 -4 -106 -11 -125 -15 l-35 -7 40 -8 c181 -35 840
21-37 1095 -3 229 30 -663 61 -975 33z"/>
22<path d="M1150 2237 l0 -165 63 -11 c229 -41 924 -38 1165 4 l32 6 0 166 c0
23141 -2 164 -15 159 -60 -23 -220 -31 -615 -31 -395 0 -555 8 -615 31 -13 5
24-15 -17 -15 -159z"/>
25<path d="M1252 1980 c-29 -4 -55 -10 -58 -13 -7 -7 88 -18 246 -27 269 -17
26690 -9 880 16 49 6 52 8 29 18 -29 13 -1016 18 -1097 6z"/>
27<path d="M1150 1767 l0 -165 63 -11 c229 -41 924 -38 1165 4 l32 6 0 166 c0
28141 -2 164 -15 159 -60 -23 -220 -31 -615 -31 -395 0 -555 8 -615 31 -13 5
29-15 -17 -15 -159z"/>
30<path d="M1345 1509 c-49 -4 -106 -11 -125 -15 l-35 -7 40 -8 c181 -35 840
31-37 1095 -3 229 30 -663 61 -975 33z"/>
32<path d="M1150 1287 l0 -165 63 -11 c229 -41 924 -38 1165 4 l32 6 0 166 c0
33141 -2 164 -15 159 -60 -23 -220 -31 -615 -31 -395 0 -555 8 -615 31 -13 5
34-15 -17 -15 -159z"/>
35</g>
36</svg>
diff --git a/meteos_ui/static/dashboard/machine_learning/overview/images/meteos-evaluation.svg b/meteos_ui/static/dashboard/machine_learning/overview/images/meteos-evaluation.svg
new file mode 100644
index 0000000..cb76cd7
--- /dev/null
+++ b/meteos_ui/static/dashboard/machine_learning/overview/images/meteos-evaluation.svg
@@ -0,0 +1,279 @@
1<?xml version="1.0" standalone="no"?>
2<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 20010904//EN"
3 "http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd">
4<svg version="1.0" xmlns="http://www.w3.org/2000/svg"
5 width="355.000000pt" height="356.000000pt" viewBox="0 0 355.000000 356.000000"
6 preserveAspectRatio="xMidYMid meet">
7
8<g transform="translate(0.000000,356.000000) scale(0.100000,-0.100000)"
9fill="#000000" stroke="none">
10<path d="M1560 3549 c-546 -71 -1010 -370 -1303 -844 -101 -161 -189 -387
11-228 -582 -30 -153 -37 -436 -15 -593 68 -472 317 -893 695 -1179 201 -152
12456 -267 716 -322 98 -21 136 -24 345 -24 206 0 249 3 348 23 707 143 1250
13684 1403 1397 22 99 24 134 24 355 -1 279 -12 356 -87 575 -218 640 -778 1101
14-1444 1190 -117 16 -348 18 -454 4z m480 -264 c249 -42 507 -163 710 -333 275
15-229 461 -549 527 -904 27 -143 24 -430 -6 -568 -122 -572 -531 -1014 -1085
16-1174 -275 -80 -620 -70 -898 24 -741 253 -1173 1031 -996 1794 95 412 354
17762 726 980 167 98 395 173 592 195 110 13 310 6 430 -14z"/>
18<path d="M1730 3060 c0 -27 3 -30 30 -30 27 0 30 3 30 30 0 27 -3 30 -30 30
19-27 0 -30 -3 -30 -30z"/>
20<path d="M1727 2951 c-2 -10 -1 -25 4 -33 6 -10 2 -21 -11 -33 -20 -18 -21
21-18 -35 1 -14 19 -14 19 -35 -2 -20 -20 -21 -23 -7 -45 15 -24 10 -30 -255
22-319 -149 -162 -275 -295 -282 -295 -26 -2 -57 -27 -52 -43 3 -9 -1 -26 -9
23-36 -12 -16 -17 -17 -30 -6 -13 11 -20 11 -40 0 -24 -13 -24 -15 -9 -38 18
24-27 11 -39 -26 -44 -22 -3 -26 -10 -33 -57 -7 -52 -6 -56 39 -130 61 -101 56
25-95 78 -125 15 -21 16 -30 7 -35 -8 -5 -10 -18 -6 -34 6 -22 11 -26 30 -21 17
264 27 -1 39 -18 16 -22 16 -23 -9 -32 -44 -17 -27 -72 19 -60 22 5 25 10 20 28
27-10 33 -1 20 117 -164 100 -158 109 -176 99 -199 -9 -19 -8 -27 5 -40 13 -13
2819 -13 36 -3 17 11 33 9 105 -15 83 -27 84 -28 84 -60 0 -30 3 -33 30 -33 24
290 30 4 30 21 0 17 4 20 23 15 12 -3 25 -6 30 -6 4 0 7 -7 7 -15 0 -11 11 -15
3038 -15 20 0 132 -33 247 -73 l210 -72 -3 -32 c-3 -31 -1 -33 27 -33 26 0 31 4
3131 23 0 20 4 23 30 19 21 -3 30 -10 30 -24 0 -16 7 -19 43 -17 23 1 50 6 60
3211 11 5 17 5 17 -2 0 -5 6 -10 13 -10 13 0 37 40 37 61 0 13 -42 28 -55 21
33-11 -7 -15 -8 -58 -18 -27 -6 -27 -6 -16 22 161 421 379 1009 379 1024 0 26
34-13 40 -414 439 l-346 345 22 23 c21 23 21 23 2 38 -25 19 -41 19 -53 -2 -9
35-17 -11 -16 -32 4 -19 19 -20 24 -9 38 12 15 11 19 -10 36 -21 15 -27 16 -35
365 -9 -11 -14 -11 -32 4 -12 9 -21 23 -21 31 3 41 -3 49 -31 49 -20 0 -30 -6
37-34 -19z m58 -211 c3 -5 -1 -10 -10 -10 -9 0 -13 5 -10 10 3 6 8 10 10 10 2 0
387 -4 10 -10z m65 -67 c25 -26 38 -41 28 -35 -14 11 -19 9 -32 -10 -15 -21 -15
39-24 5 -43 l20 -20 20 24 20 24 22 -21 c17 -17 19 -24 9 -34 -18 -18 -15 -31
4010 -47 19 -12 23 -11 33 3 11 14 14 14 30 -4 9 -10 15 -26 12 -35 -7 -16 32
41-48 51 -43 6 2 96 -84 201 -191 151 -155 191 -201 196 -228 5 -30 9 -34 29
42-29 28 7 67 -27 43 -37 -8 -3 -17 -15 -20 -27 -4 -16 -1 -24 14 -27 22 -6 22
43-5 7 -38 -8 -17 -17 -24 -29 -20 -21 7 -38 -44 -18 -55 18 -12 2 -60 -20 -60
44-22 0 -35 -38 -20 -56 14 -17 2 -54 -17 -54 -19 0 -39 -51 -24 -60 8 -5 8 -15
450 -34 -5 -15 -14 -25 -19 -22 -5 3 -14 -7 -19 -23 -7 -20 -7 -31 0 -33 11 -4
46-10 -58 -23 -58 -5 0 -11 -17 -14 -37 -4 -21 -15 -56 -26 -79 -10 -23 -19 -50
47-19 -60 0 -25 -36 -84 -52 -85 -7 -1 -28 0 -45 1 -31 1 -33 -1 -33 -29 0 -35
481 -35 -34 -21 -16 6 -26 17 -26 30 0 15 -7 20 -29 20 -16 0 -31 -4 -33 -9 -1
49-5 -113 29 -248 74 -135 46 -235 84 -222 84 18 1 22 7 22 31 0 27 -3 30 -30
5030 -25 0 -30 -4 -30 -25 0 -27 -3 -28 -37 -19 -14 4 -23 14 -23 25 0 11 -7 19
51-18 19 -17 0 -69 73 -65 90 5 18 -17 61 -28 55 -11 -8 -38 22 -39 43 0 6 7 12
5215 12 17 0 18 4 9 38 -6 19 -11 22 -38 17 -31 -6 -32 -5 -146 176 -127 200
53-129 204 -109 197 9 -3 20 7 29 28 22 47 456 521 473 516 5 -1 20 4 34 13 18
5412 22 20 14 29 -8 10 -6 20 8 37 19 23 20 23 34 5 12 -16 16 -17 35 -5 26 16
5528 32 7 49 -13 11 -12 16 8 41 23 29 40 38 31 16 -2 -7 4 -22 16 -32 19 -17
5621 -17 40 0 14 12 18 25 14 41 -4 13 -4 24 -2 24 2 0 24 -21 48 -47z m390
57-1623 c0 -12 -17 -12 -45 0 -17 7 -15 9 13 9 17 1 32 -3 32 -9z"/>
58<path d="M1740 2580 c0 -27 3 -30 30 -30 27 0 30 3 30 30 0 27 -3 30 -30 30
59-27 0 -30 -3 -30 -30z"/>
60<path d="M1740 2458 c1 -34 19 -68 37 -68 6 0 18 11 27 25 9 14 12 25 6 25 -5
610 -10 11 -10 25 0 21 -5 25 -30 25 -27 0 -30 -3 -30 -32z"/>
62<path d="M1659 2381 l-24 -20 21 -21 c20 -20 21 -20 42 -3 21 17 21 19 4 41
63l-18 23 -25 -20z"/>
64<path d="M1847 2375 c-17 -24 -17 -25 8 -41 24 -16 27 -16 40 2 17 23 15 33
65-11 50 -16 11 -21 9 -37 -11z"/>
66<path d="M1740 2340 c0 -27 3 -30 30 -30 27 0 30 3 30 30 0 27 -3 30 -30 30
67-27 0 -30 -3 -30 -30z"/>
68<path d="M1562 2312 c-23 -18 -23 -18 -5 -41 17 -21 22 -22 41 -10 27 17 27
6921 5 48 -17 20 -19 20 -41 3z"/>
70<path d="M1946 2306 c-14 -22 -13 -25 4 -41 19 -17 21 -17 40 0 26 23 25 29
71-4 48 -23 15 -25 15 -40 -7z"/>
72<path d="M2044 2235 c-16 -24 -16 -27 2 -40 23 -17 33 -15 50 11 11 16 9 21
73-11 37 -24 17 -25 17 -41 -8z"/>
74<path d="M1461 2236 c-9 -11 -10 -20 -1 -35 13 -25 20 -26 46 -7 15 12 17 18
758 33 -15 24 -38 28 -53 9z"/>
76<path d="M1740 2220 c0 -27 3 -30 30 -30 27 0 30 3 30 30 0 27 -3 30 -30 30
77-27 0 -30 -3 -30 -30z"/>
78<path d="M1371 2171 c-21 -16 -22 -20 -10 -39 17 -27 31 -28 52 -4 14 15 14
7919 -2 38 -17 21 -18 21 -40 5z"/>
80<path d="M2142 2168 c-18 -18 -15 -36 7 -48 26 -14 29 -13 41 11 19 35 -20 65
81-48 37z"/>
82<path d="M1747 2123 c-4 -3 -7 -17 -7 -30 0 -19 5 -23 30 -23 27 0 30 3 30 30
830 25 -4 30 -23 30 -13 0 -27 -3 -30 -7z"/>
84<path d="M1271 2099 l-24 -20 20 -20 c18 -18 23 -19 42 -8 25 16 25 18 3 46
85l-17 22 -24 -20z"/>
86<path d="M2236 2092 c-15 -18 -15 -20 2 -35 25 -22 34 -21 51 5 12 19 11 23
87-5 35 -23 17 -28 17 -48 -5z"/>
88<path d="M2335 2023 c-13 -19 -15 -28 -6 -31 7 -2 20 -13 30 -24 13 -13 26
89-17 44 -13 23 6 24 9 15 36 -5 16 -15 29 -21 29 -6 0 -18 7 -27 15 -16 14 -19
9013 -35 -12z"/>
91<path d="M1168 2023 c-9 -10 -18 -34 -22 -54 -5 -31 -3 -37 13 -42 11 -3 22
92-17 26 -36 6 -27 10 -31 28 -25 32 9 37 17 31 42 -4 13 -14 22 -25 22 -23 0
93-23 6 -4 43 26 50 -12 89 -47 50z"/>
94<path d="M1747 2004 c-4 -4 -7 -18 -7 -31 0 -20 5 -23 36 -23 33 0 35 2 32 28
95-2 20 -9 28 -28 30 -14 2 -29 0 -33 -4z"/>
96<path d="M2263 1979 c-42 -16 -22 -66 21 -55 22 5 26 11 20 29 -9 32 -16 36
97-41 26z"/>
98<path d="M1259 1934 c-12 -33 -13 -31 21 -42 27 -10 30 -9 36 13 7 29 1 41
99-26 48 -16 4 -23 -1 -31 -19z"/>
100<path d="M2150 1950 c-14 -3 -25 -11 -24 -18 1 -7 2 -19 3 -27 1 -19 50 -20
10157 -2 2 7 1 22 -3 33 -6 16 -14 19 -33 14z"/>
102<path d="M2311 1908 c-10 -26 -6 -33 26 -42 18 -6 24 -2 29 20 11 43 -39 63
103-55 22z"/>
104<path d="M1374 1896 c-8 -31 -7 -32 27 -41 23 -6 27 -3 32 22 6 33 8 30 -25
10538 -23 6 -28 3 -34 -19z"/>
106<path d="M2015 1909 c-4 -5 -4 -21 -1 -34 5 -19 10 -22 31 -17 13 4 25 10 25
10715 1 43 -1 47 -24 47 -14 0 -28 -5 -31 -11z"/>
108<path d="M1489 1864 c-12 -33 -13 -31 21 -42 27 -10 30 -9 36 13 7 29 1 41
109-26 48 -16 4 -23 -1 -31 -19z"/>
110<path d="M1750 1855 c0 -19 -5 -35 -10 -35 -12 0 -33 -50 -25 -59 3 -3 10 1
11114 8 6 9 11 10 15 2 9 -15 57 -14 76 2 8 7 16 25 18 40 4 34 -32 77 -65 77
112-20 0 -23 -5 -23 -35z"/>
113<path d="M1902 1881 c-9 -5 -11 -17 -7 -34 6 -23 11 -26 34 -21 34 9 34 9 27
11439 -6 25 -29 32 -54 16z"/>
115<path d="M1604 1826 c-8 -31 -7 -32 27 -41 23 -6 27 -3 32 22 6 33 8 30 -25
11638 -23 6 -28 3 -34 -19z"/>
117<path d="M1233 1810 c-15 -6 -20 -15 -16 -30 7 -27 17 -32 47 -24 22 5 23 8
11814 35 -11 31 -12 32 -45 19z"/>
119<path d="M2274 1794 c-11 -43 39 -63 55 -21 10 25 6 32 -26 41 -18 6 -24 2
120-29 -20z"/>
121<path d="M1671 1708 c-12 -19 -11 -23 10 -39 23 -18 24 -18 41 4 17 21 17 23
122-3 40 -27 22 -31 22 -48 -5z"/>
123<path d="M1848 1719 c-21 -12 -23 -29 -5 -53 12 -17 14 -17 36 1 21 17 22 22
12410 41 -16 25 -17 25 -41 11z"/>
125<path d="M1262 1692 c-9 -6 -10 -15 -3 -35 8 -19 15 -24 31 -20 26 7 33 18 25
12643 -7 21 -30 26 -53 12z"/>
127<path d="M2235 1680 c-8 -25 -1 -36 25 -43 16 -4 23 1 31 20 7 20 6 29 -3 35
128-23 14 -46 9 -53 -12z"/>
129<path d="M1613 1618 c-22 -29 -22 -37 2 -52 23 -15 25 -15 41 9 16 24 16 27
130-2 40 -24 18 -29 18 -41 3z"/>
131<path d="M1906 1615 c-18 -13 -18 -16 -2 -40 16 -24 17 -24 42 -9 22 15 23 19
13211 37 -18 27 -28 29 -51 12z"/>
133<path d="M2200 1564 c-12 -31 -13 -30 22 -39 23 -6 28 -3 34 19 7 31 7 31 -23
13440 -19 6 -25 2 -33 -20z"/>
135<path d="M1539 1509 c-9 -17 -8 -25 4 -37 18 -17 45 -10 54 14 4 11 -1 22 -12
13630 -25 19 -32 18 -46 -7z"/>
137<path d="M1978 1519 c-21 -12 -23 -29 -5 -53 12 -17 14 -17 36 1 21 17 22 22
13810 41 -16 25 -17 25 -41 11z"/>
139<path d="M2161 1450 c-9 -26 -7 -29 19 -39 26 -9 29 -7 39 19 9 26 7 29 -19
14039 -26 9 -29 7 -39 -19z"/>
141<path d="M1472 1410 c-16 -26 -16 -25 12 -43 23 -15 25 -15 41 9 16 24 15 26
142-2 40 -25 19 -36 17 -51 -6z"/>
143<path d="M2041 1413 c-22 -18 -22 -19 -4 -41 17 -21 19 -21 41 -4 23 18 23 19
1445 41 -18 22 -19 22 -42 4z"/>
145<path d="M2125 1341 c-8 -27 -45 -49 -45 -26 0 10 -10 15 -30 15 -27 0 -30 -3
146-30 -30 0 -27 3 -30 30 -30 17 0 30 5 30 13 1 6 9 2 20 -11 18 -22 20 -22 44
147-7 20 14 52 72 44 81 -2 1 -15 5 -30 9 -21 5 -27 3 -33 -14z"/>
148<path d="M1660 1300 c0 -27 3 -30 30 -30 27 0 30 3 30 30 0 27 -3 30 -30 30
149-27 0 -30 -3 -30 -30z"/>
150<path d="M1780 1300 c0 -27 3 -30 30 -30 27 0 30 3 30 30 0 27 -3 30 -30 30
151-27 0 -30 -3 -30 -30z"/>
152<path d="M1900 1300 c0 -27 3 -30 30 -30 27 0 30 3 30 30 0 27 -3 30 -30 30
153-27 0 -30 -3 -30 -30z"/>
154<path d="M2171 1213 c-22 -18 -22 -19 -4 -42 18 -22 19 -22 42 -4 22 18 22 19
1554 42 -18 22 -19 22 -42 4z"/>
156<path d="M1551 2813 c-22 -18 -22 -19 -4 -42 18 -22 19 -22 42 -4 22 18 22 19
1574 42 -18 22 -19 22 -42 4z"/>
158<path d="M1453 2742 c-22 -17 -22 -17 -3 -42 l19 -25 23 23 c22 22 22 22 3 42
159-19 18 -21 18 -42 2z"/>
160<path d="M2029 2728 c-10 -18 -8 -24 7 -35 21 -15 34 -13 48 9 7 12 6 21 -3
16132 -19 22 -38 20 -52 -6z"/>
162<path d="M1356 2671 c-15 -16 -15 -22 -4 -40 15 -25 17 -25 42 -6 17 13 18 18
1636 40 -16 30 -22 31 -44 6z"/>
164<path d="M2129 2664 c-9 -11 -10 -20 -2 -32 16 -26 40 -26 54 -1 10 19 9 25
165-7 36 -23 17 -29 16 -45 -3z"/>
166<path d="M1261 2603 c-21 -17 -22 -22 -10 -41 17 -27 21 -27 48 -4 20 16 20
16718 3 40 -18 23 -18 23 -41 5z"/>
168<path d="M2222 2590 c-16 -26 -16 -25 12 -43 23 -15 25 -15 41 9 16 24 15 26
169-2 40 -25 19 -36 17 -51 -6z"/>
170<path d="M1162 2532 l-23 -18 20 -25 20 -24 21 21 c20 20 20 21 3 42 -17 21
171-19 21 -41 4z"/>
172<path d="M2319 2518 c-10 -18 -8 -24 11 -40 22 -17 23 -17 36 -1 19 25 17 41
173-5 53 -27 14 -29 13 -42 -12z"/>
174<path d="M1064 2461 c-21 -17 -21 -18 -5 -40 16 -21 20 -22 39 -10 27 17 28
17531 5 52 -16 14 -20 14 -39 -2z"/>
176<path d="M2419 2454 c-9 -11 -10 -20 -2 -32 14 -22 43 -22 57 1 9 15 7 21 -8
17733 -25 18 -31 18 -47 -2z"/>
178<path d="M970 2392 c-20 -16 -21 -21 -9 -40 17 -27 21 -27 48 -4 20 17 20 17
1792 39 -19 22 -20 22 -41 5z"/>
180<path d="M2523 2388 c-22 -29 -22 -37 2 -52 23 -15 25 -15 41 9 16 24 16 27
181-2 40 -24 18 -29 18 -41 3z"/>
182<path d="M871 2321 c-21 -16 -22 -20 -10 -39 17 -27 31 -28 52 -4 14 16 14 19
183-1 39 -17 22 -18 22 -41 4z"/>
184<path d="M2611 2308 c-12 -19 -11 -24 10 -41 23 -18 23 -18 41 5 17 22 17 24
185-3 41 -27 22 -31 22 -48 -5z"/>
186<path d="M773 2251 c-22 -19 -22 -20 -5 -41 16 -20 21 -21 40 -9 27 17 27 21
1875 48 -18 20 -18 20 -40 2z"/>
188<path d="M2709 2239 c-9 -18 -7 -25 9 -42 l21 -20 20 24 20 24 -22 17 c-29 23
189-34 22 -48 -3z"/>
190<path d="M667 2172 c-25 -27 -21 -45 7 -40 22 5 23 3 14 -24 -10 -29 -3 -99
19110 -97 34 3 46 18 47 62 2 35 -1 47 -12 47 -10 0 -12 6 -8 20 7 22 -10 50 -30
19250 -6 0 -19 -8 -28 -18z"/>
193<path d="M2805 2168 c-13 -19 -13 -25 -2 -33 8 -5 17 -22 21 -38 6 -24 10 -26
19434 -21 15 4 28 8 29 9 7 4 -19 70 -33 86 -22 24 -29 24 -49 -3z"/>
195<path d="M571 2140 c-9 -26 -7 -29 19 -39 26 -9 29 -7 39 19 9 26 7 29 -19 39
196-26 9 -29 7 -39 -19z"/>
197<path d="M2943 2163 c-7 -3 -8 -14 -4 -31 4 -15 10 -26 14 -24 4 1 11 2 16 2
1989 0 3 48 -8 54 -3 2 -11 1 -18 -1z"/>
199<path d="M2717 2103 c-13 -3 -16 -11 -11 -31 9 -35 7 -34 38 -26 26 6 31 19
20020 48 -6 16 -14 18 -47 9z"/>
201<path d="M801 2070 c-9 -26 -7 -29 19 -39 26 -9 29 -7 39 19 9 26 7 29 -19 39
202-26 9 -29 7 -39 -19z"/>
203<path d="M2779 2053 c-7 -20 -6 -29 3 -35 23 -14 46 -9 53 12 8 25 1 36 -25
20443 -16 4 -23 -1 -31 -20z"/>
205<path d="M733 1960 c-18 -8 -21 -13 -14 -32 16 -44 69 -29 57 16 -7 28 -10 29
206-43 16z"/>
207<path d="M2741 1938 c-10 -26 -6 -33 25 -42 18 -5 24 -1 32 23 9 26 8 30 -11
20835 -34 9 -37 8 -46 -16z"/>
209<path d="M777 1848 c-22 -8 -26 -14 -21 -31 9 -32 16 -36 42 -26 22 8 26 21
21014 50 -6 13 -13 14 -35 7z"/>
211<path d="M2706 1824 c-5 -18 -3 -30 6 -35 23 -15 46 -9 52 13 6 25 1 33 -30
21242 -18 5 -23 1 -28 -20z"/>
213<path d="M807 1733 c-15 -4 -17 -11 -12 -31 9 -34 8 -34 39 -26 28 7 29 8 20
21442 -6 22 -12 24 -47 15z"/>
215<path d="M2666 1708 c-6 -25 -1 -33 30 -42 18 -5 23 -1 28 20 5 18 3 30 -6 35
216-23 15 -46 9 -52 -13z"/>
217<path d="M849 1617 c-23 -10 -25 -16 -18 -34 14 -39 69 -27 61 13 -6 32 -12
21834 -43 21z"/>
219<path d="M2630 1594 c-12 -31 -13 -30 22 -39 23 -6 28 -3 34 19 7 31 7 31 -23
22040 -19 6 -25 2 -33 -20z"/>
221<path d="M872 1502 c-10 -7 -10 -15 -2 -36 8 -22 14 -26 33 -20 30 9 30 10 23
22239 -6 25 -29 32 -54 17z"/>
223<path d="M2591 1480 c-9 -26 -7 -29 19 -39 26 -9 29 -7 39 19 9 26 7 29 -19
22439 -26 9 -29 7 -39 -19z"/>
225<path d="M1118 1487 c-24 -11 -26 -14 -15 -39 11 -24 14 -26 39 -15 24 11 26
22614 15 39 -11 24 -14 26 -39 15z"/>
227<path d="M923 1393 c-25 -5 -26 -7 -17 -40 6 -23 29 -29 52 -14 13 8 7 63 -7
22860 -3 -1 -16 -4 -28 -6z"/>
229<path d="M2556 1365 c-8 -32 -9 -31 25 -40 23 -6 27 -3 33 20 8 32 9 31 -25
23040 -23 6 -27 3 -33 -20z"/>
231<path d="M1147 1373 c-13 -3 -16 -10 -11 -26 9 -32 17 -37 42 -31 22 6 27 20
23216 48 -6 16 -14 18 -47 9z"/>
233<path d="M945 1270 c-3 -5 -3 -21 1 -35 5 -21 11 -24 28 -19 31 9 36 17 30 42
234-7 23 -47 32 -59 12z"/>
235<path d="M2519 1252 c-7 -18 -6 -28 3 -34 21 -13 45 -9 52 8 11 29 6 42 -20
23647 -20 4 -27 -1 -35 -21z"/>
237<path d="M1192 1259 c-18 -7 -22 -14 -16 -31 9 -31 9 -31 39 -24 27 7 32 23
23813 48 -10 12 -19 14 -36 7z"/>
239<path d="M988 1158 c-21 -17 -6 -63 18 -54 9 3 20 6 25 6 16 0 5 55 -11 58 -9
2401 -23 -3 -32 -10z"/>
241<path d="M2481 1138 c-10 -26 -6 -33 25 -42 18 -5 24 -1 32 23 8 24 7 31 -5
24235 -28 11 -44 6 -52 -16z"/>
243<path d="M1221 1141 c-19 -12 -6 -65 14 -57 9 3 15 -1 15 -10 0 -11 6 -13 19
244-9 11 3 23 0 27 -6 5 -9 11 -7 21 6 7 11 13 13 13 7 0 -7 13 -12 30 -12 27 0
24530 3 30 31 0 28 -2 30 -32 28 -18 -1 -41 2 -50 6 -9 4 -22 4 -28 0 -5 -3 -10
2461 -10 9 0 17 -27 21 -49 7z"/>
247<path d="M1450 1090 c0 -27 3 -30 30 -30 27 0 30 3 30 30 0 27 -3 30 -30 30
248-27 0 -30 -3 -30 -30z"/>
249<path d="M1031 1049 c-15 -6 -21 -14 -17 -25 3 -9 6 -20 6 -25 0 -11 30 -12
25048 0 9 5 11 17 6 34 -7 30 -8 30 -43 16z"/>
251<path d="M2444 1025 c-12 -47 39 -64 57 -19 11 31 12 30 -23 39 -24 6 -28 3
252-34 -20z"/>
253<path d="M1206 1008 c-14 -19 -14 -23 2 -34 25 -19 40 -17 53 8 10 18 8 24 -7
25435 -24 18 -30 17 -48 -9z"/>
255<path d="M1062 931 c-9 -5 -11 -17 -6 -35 5 -20 11 -25 25 -21 13 4 19 1 19
256-9 0 -21 48 -21 78 0 28 19 28 40 1 55 -15 8 -24 8 -32 0 -16 -16 -37 -14 -37
2574 0 16 -27 20 -48 6z"/>
258<path d="M1220 880 c0 -27 3 -30 30 -30 27 0 30 3 30 30 0 27 -3 30 -30 30
259-27 0 -30 -3 -30 -30z"/>
260<path d="M1340 880 c0 -27 3 -30 30 -30 27 0 30 3 30 30 0 27 -3 30 -30 30
261-27 0 -30 -3 -30 -30z"/>
262<path d="M1460 880 c0 -27 3 -30 30 -30 27 0 30 3 30 30 0 27 -3 30 -30 30
263-27 0 -30 -3 -30 -30z"/>
264<path d="M1580 880 c0 -27 3 -30 30 -30 27 0 30 3 30 30 0 27 -3 30 -30 30
265-27 0 -30 -3 -30 -30z"/>
266<path d="M1700 880 c0 -27 3 -30 30 -30 27 0 30 3 30 30 0 27 -3 30 -30 30
267-27 0 -30 -3 -30 -30z"/>
268<path d="M1820 880 c0 -27 3 -30 30 -30 27 0 30 3 30 30 0 27 -3 30 -30 30
269-27 0 -30 -3 -30 -30z"/>
270<path d="M1940 880 c0 -27 3 -30 30 -30 27 0 30 3 30 30 0 27 -3 30 -30 30
271-27 0 -30 -3 -30 -30z"/>
272<path d="M2060 880 c0 -27 3 -30 30 -30 27 0 30 3 30 30 0 27 -3 30 -30 30
273-27 0 -30 -3 -30 -30z"/>
274<path d="M1072 810 c-16 -26 -16 -25 12 -43 23 -15 25 -15 41 9 16 24 15 26
275-2 40 -25 19 -36 17 -51 -6z"/>
276<path d="M2432 812 c-23 -18 -23 -18 -5 -41 17 -21 22 -22 41 -10 27 17 27 21
2775 48 -17 20 -19 20 -41 3z"/>
278</g>
279</svg>
diff --git a/meteos_ui/static/dashboard/machine_learning/overview/images/meteos-experiment.svg b/meteos_ui/static/dashboard/machine_learning/overview/images/meteos-experiment.svg
new file mode 100644
index 0000000..869c946
--- /dev/null
+++ b/meteos_ui/static/dashboard/machine_learning/overview/images/meteos-experiment.svg
@@ -0,0 +1,39 @@
1<?xml version="1.0" standalone="no"?>
2<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 20010904//EN"
3 "http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd">
4<svg version="1.0" xmlns="http://www.w3.org/2000/svg"
5 width="356.000000pt" height="356.000000pt" viewBox="0 0 356.000000 356.000000"
6 preserveAspectRatio="xMidYMid meet">
7
8<g transform="translate(0.000000,356.000000) scale(0.100000,-0.100000)"
9fill="#000000" stroke="none">
10<path d="M1560 3549 c-313 -40 -615 -165 -870 -359 -97 -74 -247 -224 -322
11-323 -166 -217 -286 -482 -339 -744 -30 -153 -37 -436 -15 -593 98 -676 561
12-1229 1208 -1444 209 -69 293 -81 568 -81 206 0 248 3 340 23 621 135 1109
13552 1324 1134 86 231 101 325 101 618 -1 216 -3 257 -23 350 -77 355 -242 660
14-494 912 -283 283 -644 457 -1048 508 -97 12 -335 11 -430 -1z m368 -250 c264
15-29 481 -105 689 -242 353 -233 593 -594 670 -1007 27 -146 24 -431 -6 -570
16-45 -212 -134 -417 -254 -587 -80 -113 -248 -281 -360 -360 -173 -122 -375
17-209 -587 -254 -153 -33 -449 -33 -599 -1 -479 104 -860 400 -1079 838 -45 90
18-108 285 -126 394 -85 499 65 979 417 1339 129 132 250 219 417 301 259 128
19542 180 818 149z"/>
20<path d="M975 2641 c-11 -5 -29 -19 -40 -31 -19 -21 -20 -38 -23 -283 -2 -185
210 -269 9 -289 25 -60 -6 -58 863 -58 l795 0 28 24 28 24 3 268 c2 190 0 276
22-9 296 -25 60 5 58 -851 57 -431 0 -792 -4 -803 -8z m985 -146 l0 -55 -445 0
23-445 0 0 55 0 55 445 0 445 0 0 -55z m552 -93 c38 -37 48 -98 23 -140 -50 -83
24-169 -81 -210 4 -19 41 -19 67 0 105 38 73 130 88 187 31z m-552 -142 l0 -60
25-445 0 -445 0 0 60 0 60 445 0 445 0 0 -60z"/>
26<path d="M1750 1905 c0 -32 2 -35 30 -35 28 0 30 3 30 35 0 32 -2 35 -30 35
27-28 0 -30 -3 -30 -35z"/>
28<path d="M975 1821 c-11 -5 -29 -19 -40 -31 -19 -21 -20 -38 -23 -283 -2 -185
290 -269 9 -289 25 -60 -6 -58 863 -58 l795 0 28 24 28 24 3 268 c2 190 0 276
30-9 296 -25 60 5 58 -851 57 -431 0 -792 -4 -803 -8z m985 -151 l0 -60 -445 0
31-445 0 0 60 0 60 445 0 445 0 0 -60z m552 -98 c38 -37 48 -98 23 -140 -50 -83
32-169 -81 -210 4 -19 41 -19 67 0 105 38 73 130 88 187 31z m-552 -142 l0 -60
33-445 0 -445 0 0 60 0 60 445 0 445 0 0 -60z"/>
34<path d="M1750 1025 l0 -95 -384 0 -384 0 -30 30 c-34 34 -59 37 -102 15 -58
35-30 -67 -90 -21 -136 40 -39 82 -39 123 1 l30 30 795 0 795 0 28 -30 c56 -60
36149 -23 150 58 0 39 -46 92 -80 92 -28 0 -76 -26 -83 -45 -6 -13 -54 -15 -392
37-15 l-385 0 0 95 0 95 -30 0 -30 0 0 -95z"/>
38</g>
39</svg>
diff --git a/meteos_ui/static/dashboard/machine_learning/overview/images/meteos-learning.svg b/meteos_ui/static/dashboard/machine_learning/overview/images/meteos-learning.svg
new file mode 100644
index 0000000..2518546
--- /dev/null
+++ b/meteos_ui/static/dashboard/machine_learning/overview/images/meteos-learning.svg
@@ -0,0 +1,27 @@
1<?xml version="1.0" standalone="no"?>
2<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 20010904//EN"
3 "http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd">
4<svg version="1.0" xmlns="http://www.w3.org/2000/svg"
5 width="356.000000pt" height="356.000000pt" viewBox="0 0 356.000000 356.000000"
6 preserveAspectRatio="xMidYMid meet">
7
8<g transform="translate(0.000000,356.000000) scale(0.100000,-0.100000)"
9fill="#000000" stroke="none">
10<path d="M1560 3549 c-313 -40 -615 -165 -870 -359 -97 -74 -247 -224 -322
11-323 -166 -217 -286 -482 -339 -744 -30 -153 -37 -436 -15 -593 98 -676 561
12-1229 1208 -1444 209 -69 293 -81 568 -81 206 0 248 3 340 23 621 135 1109
13552 1324 1134 86 231 101 325 101 618 -1 216 -3 257 -23 350 -77 355 -242 660
14-494 912 -283 283 -644 457 -1048 508 -97 12 -335 11 -430 -1z m368 -250 c264
15-29 481 -105 689 -242 353 -233 593 -594 670 -1007 27 -146 24 -431 -6 -570
16-45 -212 -134 -417 -254 -587 -80 -113 -248 -281 -360 -360 -173 -122 -375
17-209 -587 -254 -153 -33 -449 -33 -599 -1 -479 104 -860 400 -1079 838 -45 90
18-108 285 -126 394 -85 499 65 979 417 1339 129 132 250 219 417 301 259 128
19542 180 818 149z"/>
20<path d="M1490 2240 c-157 -44 -428 -118 -603 -166 -175 -48 -312 -91 -305
21-95 7 -4 132 -39 278 -78 146 -40 273 -74 283 -77 16 -5 17 -28 17 -295 l0
22-289 620 0 620 0 0 290 c0 160 2 290 5 290 7 0 589 161 592 163 1 2 -1082 299
23-1212 333 -5 1 -138 -33 -295 -76z"/>
24<path d="M2631 1738 c-12 -79 -24 -151 -27 -160 -5 -16 2 -18 56 -18 59 0 62
251 57 23 -3 12 -16 84 -28 160 -13 75 -26 137 -29 137 -3 0 -16 -64 -29 -142z"/>
26</g>
27</svg>
diff --git a/meteos_ui/static/dashboard/machine_learning/overview/images/meteos-model.svg b/meteos_ui/static/dashboard/machine_learning/overview/images/meteos-model.svg
new file mode 100644
index 0000000..cbc2f7b
--- /dev/null
+++ b/meteos_ui/static/dashboard/machine_learning/overview/images/meteos-model.svg
@@ -0,0 +1,31 @@
1<?xml version="1.0" standalone="no"?>
2<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 20010904//EN"
3 "http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd">
4<svg version="1.0" xmlns="http://www.w3.org/2000/svg"
5 width="356.000000pt" height="356.000000pt" viewBox="0 0 356.000000 356.000000"
6 preserveAspectRatio="xMidYMid meet">
7
8<g transform="translate(0.000000,356.000000) scale(0.100000,-0.100000)"
9fill="#000000" stroke="none">
10<path d="M1560 3549 c-313 -40 -615 -165 -870 -359 -97 -74 -247 -224 -322
11-323 -166 -217 -286 -482 -339 -744 -30 -153 -37 -436 -15 -593 98 -676 561
12-1229 1208 -1444 209 -69 293 -81 568 -81 206 0 248 3 340 23 621 135 1109
13552 1324 1134 86 231 101 325 101 618 -1 216 -3 257 -23 350 -77 355 -242 660
14-494 912 -283 283 -644 457 -1048 508 -97 12 -335 11 -430 -1z m368 -250 c264
15-29 481 -105 689 -242 353 -233 593 -594 670 -1007 27 -146 24 -431 -6 -570
16-45 -212 -134 -417 -254 -587 -80 -113 -248 -281 -360 -360 -173 -122 -375
17-209 -587 -254 -153 -33 -449 -33 -599 -1 -479 104 -860 400 -1079 838 -45 90
18-108 285 -126 394 -85 499 65 979 417 1339 129 132 250 219 417 301 259 128
19542 180 818 149z"/>
20<path d="M2297 2510 c-65 -37 -120 -70 -123 -73 -3 -3 10 -16 30 -29 l36 -25
21-136 -201 c-75 -111 -140 -202 -145 -202 -5 0 -114 59 -242 130 -129 72 -239
22130 -246 130 -11 0 -527 -273 -540 -285 -7 -8 30 -75 41 -75 4 0 99 49 211
23109 111 60 222 119 247 131 l45 21 245 -136 c139 -77 253 -135 265 -133 14 2
2466 71 167 222 81 120 151 223 157 229 6 6 20 2 41 -13 17 -12 33 -20 35 -18 6
256 37 256 33 271 -2 11 -36 -4 -121 -53z"/>
26<path d="M2310 1600 l0 -620 175 0 175 0 0 620 0 620 -175 0 -175 0 0 -620z"/>
27<path d="M1360 1425 l0 -445 180 0 180 0 0 445 0 445 -180 0 -180 0 0 -445z"/>
28<path d="M1840 1365 l0 -385 175 0 175 0 0 385 0 385 -175 0 -175 0 0 -385z"/>
29<path d="M890 1335 l0 -355 180 0 180 0 0 355 0 355 -180 0 -180 0 0 -355z"/>
30</g>
31</svg>
diff --git a/meteos_ui/static/dashboard/machine_learning/overview/images/meteos-template.svg b/meteos_ui/static/dashboard/machine_learning/overview/images/meteos-template.svg
new file mode 100644
index 0000000..93167a7
--- /dev/null
+++ b/meteos_ui/static/dashboard/machine_learning/overview/images/meteos-template.svg
@@ -0,0 +1,27 @@
1<?xml version="1.0" standalone="no"?>
2<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 20010904//EN"
3 "http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd">
4<svg version="1.0" xmlns="http://www.w3.org/2000/svg"
5 width="356.000000pt" height="356.000000pt" viewBox="0 0 356.000000 356.000000"
6 preserveAspectRatio="xMidYMid meet">
7
8<g transform="translate(0.000000,356.000000) scale(0.100000,-0.100000)"
9fill="#000000" stroke="none">
10<path d="M1560 3549 c-313 -40 -615 -165 -870 -359 -97 -74 -247 -224 -322
11-323 -166 -217 -286 -482 -339 -744 -30 -153 -37 -436 -15 -593 98 -676 561
12-1229 1208 -1444 209 -69 293 -81 568 -81 206 0 248 3 340 23 621 135 1109
13552 1324 1134 86 231 101 325 101 618 -1 216 -3 257 -23 350 -77 355 -242 660
14-494 912 -283 283 -644 457 -1048 508 -97 12 -335 11 -430 -1z m368 -250 c264
15-29 481 -105 689 -242 353 -233 593 -594 670 -1007 27 -146 24 -431 -6 -570
16-45 -212 -134 -417 -254 -587 -80 -113 -248 -281 -360 -360 -173 -122 -375
17-209 -587 -254 -153 -33 -449 -33 -599 -1 -479 104 -860 400 -1079 838 -45 90
18-108 285 -126 394 -85 499 65 979 417 1339 129 132 250 219 417 301 259 128
19542 180 818 149z"/>
20<path d="M1150 2450 l0 -40 684 0 c376 0 691 -3 700 -6 14 -5 16 -52 16 -425
21l0 -419 45 0 45 0 0 465 0 465 -745 0 -745 0 0 -40z"/>
22<path d="M1040 2325 l0 -45 695 0 695 0 0 -419 c0 -231 3 -422 8 -424 4 -3 22
23-2 40 0 l32 5 0 464 0 464 -735 0 -735 0 0 -45z"/>
24<path d="M910 1686 c0 -520 1 -555 18 -560 72 -21 217 -39 332 -40 163 -1 228
2512 444 91 250 92 390 125 589 139 l97 7 0 458 0 459 -740 0 -740 0 0 -554z"/>
26</g>
27</svg>
diff --git a/meteos_ui/static/dashboard/machine_learning/overview/overview.module.js b/meteos_ui/static/dashboard/machine_learning/overview/overview.module.js
new file mode 100644
index 0000000..7737600
--- /dev/null
+++ b/meteos_ui/static/dashboard/machine_learning/overview/overview.module.js
@@ -0,0 +1,52 @@
1/**
2 * Licensed under the Apache License, Version 2.0 (the "License"); you may
3 * not use this file except in compliance with the License. You may obtain
4 * a copy of the License at
5 *
6 * http://www.apache.org/licenses/LICENSE-2.0
7 *
8 * Unless required by applicable law or agreed to in writing, software
9 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
10 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
11 * License for the specific language governing permissions and limitations
12 * under the License.
13 */
14
15(function() {
16 'use strict';
17
18 /**
19 * @ngdoc overview
20 * @name horizon.dashboard.machine_learning.overview
21 * @ngModule
22 * @description
23 * Provides all the services and widgets require to display the experiment
24 * panel
25 */
26 angular
27 .module('horizon.dashboard.machine_learning.overview', [
28 'ngRoute'])
29 .config(config);
30
31 config.$inject = [
32 '$provide',
33 '$windowProvider',
34 '$routeProvider'
35 ];
36
37 /**
38 * @name config
39 * @param {Object} $provide
40 * @param {Object} $windowProvider
41 * @param {Object} $routeProvider
42 * @description Routes used by this module.
43 * @returns {undefined} Returns nothing
44 */
45 function config($provide, $windowProvider, $routeProvider) {
46 var path = $windowProvider.$get().STATIC_URL + 'dashboard/machine_learning/overview/';
47 $provide.constant('horizon.dashboard.machine_learning.overview.basePath', path);
48 $routeProvider.when('/project/machine_learning/overview', {
49 templateUrl: path + 'panel.html'
50 });
51 }
52})();
diff --git a/meteos_ui/static/dashboard/machine_learning/overview/overview.module.spec.js b/meteos_ui/static/dashboard/machine_learning/overview/overview.module.spec.js
new file mode 100644
index 0000000..86fb5dc
--- /dev/null
+++ b/meteos_ui/static/dashboard/machine_learning/overview/overview.module.spec.js
@@ -0,0 +1,23 @@
1/**
2 * Licensed under the Apache License, Version 2.0 (the "License"); you may
3 * not use this file except in compliance with the License. You may obtain
4 * a copy of the License at
5 *
6 * http://www.apache.org/licenses/LICENSE-2.0
7 *
8 * Unless required by applicable law or agreed to in writing, software
9 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
10 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
11 * License for the specific language governing permissions and limitations
12 * under the License.
13 */
14(function() {
15 'use strict';
16
17 describe('horizon.dashboard.machine_learning.overview', function() {
18 it('should exist', function() {
19 expect(angular.module('horizon.dashboard.machine_learning.overview')).toBeDefined();
20 });
21 });
22
23})();
diff --git a/meteos_ui/static/dashboard/machine_learning/overview/panel.html b/meteos_ui/static/dashboard/machine_learning/overview/panel.html
new file mode 100644
index 0000000..295d0e9
--- /dev/null
+++ b/meteos_ui/static/dashboard/machine_learning/overview/panel.html
@@ -0,0 +1,8 @@
1<div>
2 <hz-page-header header="Overview"></hz-page-header>
3</div>
4<div ng-controller="OverviewController as ctrl">
5 <div id="meteosTopologyCanvas">
6 <div id="meteosMenu"></div>
7 </div>
8</div>