Removed legacy GUI.
FIxed an NPE in the devices table.
Added cord-gui to obs.exclude
Change-Id: I18a53d2c44c6c97fb7f5d16b7446942a1a37ddca
diff --git a/web/gui/src/main/java/org/onosproject/ui/impl/DeviceViewMessageHandler.java b/web/gui/src/main/java/org/onosproject/ui/impl/DeviceViewMessageHandler.java
index d1cbcb4..fb83cdd 100644
--- a/web/gui/src/main/java/org/onosproject/ui/impl/DeviceViewMessageHandler.java
+++ b/web/gui/src/main/java/org/onosproject/ui/impl/DeviceViewMessageHandler.java
@@ -121,6 +121,8 @@
boolean available = ds.isAvailable(id);
String iconId = available ? ICON_ID_ONLINE : ICON_ID_OFFLINE;
+ String protocol = dev.annotations().value(PROTOCOL);
+
row.cell(ID, id)
.cell(AVAILABLE, available)
.cell(AVAILABLE_IID, iconId)
@@ -128,7 +130,7 @@
.cell(MFR, dev.manufacturer())
.cell(HW, dev.hwVersion())
.cell(SW, dev.swVersion())
- .cell(PROTOCOL, dev.annotations().value(PROTOCOL))
+ .cell(PROTOCOL, protocol != null ? protocol : "")
.cell(NUM_PORTS, ds.getPorts(id).size())
.cell(MASTER_ID, ms.getMasterFor(id));
}
diff --git a/web/gui/src/main/java/org/onosproject/ui/impl/GuiWebSocketServlet.java b/web/gui/src/main/java/org/onosproject/ui/impl/GuiWebSocketServlet.java
deleted file mode 100644
index 835058f..0000000
--- a/web/gui/src/main/java/org/onosproject/ui/impl/GuiWebSocketServlet.java
+++ /dev/null
@@ -1,76 +0,0 @@
-/*
- * Copyright 2014-2015 Open Networking Laboratory
- *
- * 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.
- */
-package org.onosproject.ui.impl;
-
-import org.eclipse.jetty.websocket.WebSocket;
-import org.eclipse.jetty.websocket.WebSocketServlet;
-import org.onlab.osgi.DefaultServiceDirectory;
-import org.onlab.osgi.ServiceDirectory;
-
-import javax.servlet.ServletException;
-import javax.servlet.http.HttpServletRequest;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.Set;
-import java.util.Timer;
-import java.util.TimerTask;
-
-/**
- * Web socket servlet capable of creating various sockets for the user interface.
- */
-@Deprecated
-public class GuiWebSocketServlet extends WebSocketServlet {
-
- private static final long PING_DELAY_MS = 5000;
-
- private ServiceDirectory directory = new DefaultServiceDirectory();
-
- private final Set<TopologyViewWebSocket> sockets = new HashSet<>();
- private final Timer timer = new Timer();
- private final TimerTask pruner = new Pruner();
-
- @Override
- public void init() throws ServletException {
- super.init();
- timer.schedule(pruner, PING_DELAY_MS, PING_DELAY_MS);
- }
-
- @Override
- public WebSocket doWebSocketConnect(HttpServletRequest request, String protocol) {
- TopologyViewWebSocket socket = new TopologyViewWebSocket(directory);
- synchronized (sockets) {
- sockets.add(socket);
- }
- return socket;
- }
-
- // Task for pruning web-sockets that are idle.
- private class Pruner extends TimerTask {
- @Override
- public void run() {
- synchronized (sockets) {
- Iterator<TopologyViewWebSocket> it = sockets.iterator();
- while (it.hasNext()) {
- TopologyViewWebSocket socket = it.next();
- if (socket.isIdle()) {
- it.remove();
- socket.close();
- }
- }
- }
- }
- }
-}
diff --git a/web/gui/src/main/java/org/onosproject/ui/impl/TopologyResource.java b/web/gui/src/main/java/org/onosproject/ui/impl/TopologyResource.java
index 2e37b6f..b71b9f8 100644
--- a/web/gui/src/main/java/org/onosproject/ui/impl/TopologyResource.java
+++ b/web/gui/src/main/java/org/onosproject/ui/impl/TopologyResource.java
@@ -52,7 +52,7 @@
ArrayNode devices = mapper.createArrayNode();
ArrayNode hosts = mapper.createArrayNode();
- Map<String, ObjectNode> metaUi = TopologyViewMessages.getMetaUi();
+ Map<String, ObjectNode> metaUi = TopologyViewMessageHandler.getMetaUi();
for (String id : metaUi.keySet()) {
ObjectNode memento = metaUi.get(id);
if (id.charAt(17) == '/') {
diff --git a/web/gui/src/main/java/org/onosproject/ui/impl/TopologyViewMessages.java b/web/gui/src/main/java/org/onosproject/ui/impl/TopologyViewMessages.java
deleted file mode 100644
index 463f8b3..0000000
--- a/web/gui/src/main/java/org/onosproject/ui/impl/TopologyViewMessages.java
+++ /dev/null
@@ -1,885 +0,0 @@
-/*
- * Copyright 2014-2015 Open Networking Laboratory
- *
- * 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.
- */
-package org.onosproject.ui.impl;
-
-import com.fasterxml.jackson.databind.JsonNode;
-import com.fasterxml.jackson.databind.ObjectMapper;
-import com.fasterxml.jackson.databind.node.ArrayNode;
-import com.fasterxml.jackson.databind.node.ObjectNode;
-import org.onlab.osgi.ServiceDirectory;
-import org.onlab.packet.IpAddress;
-import org.onosproject.cluster.ClusterEvent;
-import org.onosproject.cluster.ClusterService;
-import org.onosproject.cluster.ControllerNode;
-import org.onosproject.cluster.NodeId;
-import org.onosproject.core.CoreService;
-import org.onosproject.mastership.MastershipService;
-import org.onosproject.net.Annotated;
-import org.onosproject.net.AnnotationKeys;
-import org.onosproject.net.Annotations;
-import org.onosproject.net.ConnectPoint;
-import org.onosproject.net.DefaultEdgeLink;
-import org.onosproject.net.Device;
-import org.onosproject.net.DeviceId;
-import org.onosproject.net.EdgeLink;
-import org.onosproject.net.Host;
-import org.onosproject.net.HostId;
-import org.onosproject.net.HostLocation;
-import org.onosproject.net.Link;
-import org.onosproject.net.LinkKey;
-import org.onosproject.net.PortNumber;
-import org.onosproject.net.device.DeviceEvent;
-import org.onosproject.net.device.DeviceService;
-import org.onosproject.net.flow.FlowEntry;
-import org.onosproject.net.flow.FlowRuleService;
-import org.onosproject.net.flow.TrafficTreatment;
-import org.onosproject.net.flow.instructions.Instruction;
-import org.onosproject.net.flow.instructions.Instructions.OutputInstruction;
-import org.onosproject.net.host.HostEvent;
-import org.onosproject.net.host.HostService;
-import org.onosproject.net.intent.Intent;
-import org.onosproject.net.intent.IntentService;
-import org.onosproject.net.intent.LinkCollectionIntent;
-import org.onosproject.net.intent.OpticalConnectivityIntent;
-import org.onosproject.net.intent.OpticalPathIntent;
-import org.onosproject.net.intent.PathIntent;
-import org.onosproject.net.link.LinkEvent;
-import org.onosproject.net.link.LinkService;
-import org.onosproject.net.provider.ProviderId;
-import org.onosproject.net.statistic.Load;
-import org.onosproject.net.statistic.StatisticService;
-import org.onosproject.net.topology.Topology;
-import org.onosproject.net.topology.TopologyService;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.text.DecimalFormat;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import java.util.concurrent.ConcurrentHashMap;
-
-import static com.google.common.base.Preconditions.checkNotNull;
-import static com.google.common.base.Strings.isNullOrEmpty;
-import static org.onosproject.cluster.ClusterEvent.Type.INSTANCE_ADDED;
-import static org.onosproject.cluster.ClusterEvent.Type.INSTANCE_REMOVED;
-import static org.onosproject.cluster.ControllerNode.State.ACTIVE;
-import static org.onosproject.net.DeviceId.deviceId;
-import static org.onosproject.net.HostId.hostId;
-import static org.onosproject.net.LinkKey.linkKey;
-import static org.onosproject.net.PortNumber.P0;
-import static org.onosproject.net.PortNumber.portNumber;
-import static org.onosproject.net.device.DeviceEvent.Type.DEVICE_ADDED;
-import static org.onosproject.net.device.DeviceEvent.Type.DEVICE_REMOVED;
-import static org.onosproject.net.host.HostEvent.Type.HOST_ADDED;
-import static org.onosproject.net.host.HostEvent.Type.HOST_REMOVED;
-import static org.onosproject.net.link.LinkEvent.Type.LINK_ADDED;
-import static org.onosproject.net.link.LinkEvent.Type.LINK_REMOVED;
-
-/**
- * Facility for creating messages bound for the topology viewer.
- */
-@Deprecated
-public abstract class TopologyViewMessages {
-
- protected static final Logger log = LoggerFactory.getLogger(TopologyViewMessages.class);
-
- private static final ProviderId PID = new ProviderId("core", "org.onosproject.core", true);
- private static final String COMPACT = "%s/%s-%s/%s";
-
- private static final double KB = 1024;
- private static final double MB = 1024 * KB;
- private static final double GB = 1024 * MB;
-
- private static final String GB_UNIT = "GB";
- private static final String MB_UNIT = "MB";
- private static final String KB_UNIT = "KB";
- private static final String B_UNIT = "B";
-
- protected final ServiceDirectory directory;
- protected final ClusterService clusterService;
- protected final DeviceService deviceService;
- protected final LinkService linkService;
- protected final HostService hostService;
- protected final MastershipService mastershipService;
- protected final IntentService intentService;
- protected final FlowRuleService flowService;
- protected final StatisticService statService;
- protected final TopologyService topologyService;
-
- protected final ObjectMapper mapper = new ObjectMapper();
- private final String version;
-
- // TODO: extract into an external & durable state; good enough for now and demo
- private static Map<String, ObjectNode> metaUi = new ConcurrentHashMap<>();
-
- /**
- * Returns read-only view of the meta-ui information.
- *
- * @return map of id to meta-ui mementos
- */
- static Map<String, ObjectNode> getMetaUi() {
- return Collections.unmodifiableMap(metaUi);
- }
-
- /**
- * Creates a messaging facility for creating messages for topology viewer.
- *
- * @param directory service directory
- */
- protected TopologyViewMessages(ServiceDirectory directory) {
- this.directory = checkNotNull(directory, "Directory cannot be null");
- clusterService = directory.get(ClusterService.class);
- deviceService = directory.get(DeviceService.class);
- linkService = directory.get(LinkService.class);
- hostService = directory.get(HostService.class);
- mastershipService = directory.get(MastershipService.class);
- intentService = directory.get(IntentService.class);
- flowService = directory.get(FlowRuleService.class);
- statService = directory.get(StatisticService.class);
- topologyService = directory.get(TopologyService.class);
-
- String ver = directory.get(CoreService.class).version().toString();
- version = ver.replace(".SNAPSHOT", "*").replaceFirst("~.*$", "");
- }
-
- // Retrieves the payload from the specified event.
- protected ObjectNode payload(ObjectNode event) {
- return (ObjectNode) event.path("payload");
- }
-
- // Returns the specified node property as a number
- protected long number(ObjectNode node, String name) {
- return node.path(name).asLong();
- }
-
- // Returns the specified node property as a string.
- protected String string(ObjectNode node, String name) {
- return node.path(name).asText();
- }
-
- // Returns the specified node property as a string.
- protected String string(ObjectNode node, String name, String defaultValue) {
- return node.path(name).asText(defaultValue);
- }
-
- // Returns the specified set of IP addresses as a string.
- private String ip(Set<IpAddress> ipAddresses) {
- Iterator<IpAddress> it = ipAddresses.iterator();
- return it.hasNext() ? it.next().toString() : "unknown";
- }
-
- // Produces JSON structure from annotations.
- private JsonNode props(Annotations annotations) {
- ObjectNode props = mapper.createObjectNode();
- if (annotations != null) {
- for (String key : annotations.keys()) {
- props.put(key, annotations.value(key));
- }
- }
- return props;
- }
-
- // Produces an informational log message event bound to the client.
- protected ObjectNode info(long id, String message) {
- return message("info", id, message);
- }
-
- // Produces a warning log message event bound to the client.
- protected ObjectNode warning(long id, String message) {
- return message("warning", id, message);
- }
-
- // Produces an error log message event bound to the client.
- protected ObjectNode error(long id, String message) {
- return message("error", id, message);
- }
-
- // Produces a log message event bound to the client.
- private ObjectNode message(String severity, long id, String message) {
- return envelope("message", id,
- mapper.createObjectNode()
- .put("severity", severity)
- .put("message", message));
- }
-
- // Puts the payload into an envelope and returns it.
- protected ObjectNode envelope(String type, long sid, ObjectNode payload) {
- ObjectNode event = mapper.createObjectNode();
- event.put("event", type);
- if (sid > 0) {
- event.put("sid", sid);
- }
- event.set("payload", payload);
- return event;
- }
-
- // Produces a set of all hosts listed in the specified JSON array.
- protected Set<Host> getHosts(ArrayNode array) {
- Set<Host> hosts = new HashSet<>();
- if (array != null) {
- for (JsonNode node : array) {
- try {
- addHost(hosts, hostId(node.asText()));
- } catch (IllegalArgumentException e) {
- log.debug("Skipping ID {}", node.asText());
- }
- }
- }
- return hosts;
- }
-
- // Adds the specified host to the set of hosts.
- private void addHost(Set<Host> hosts, HostId hostId) {
- Host host = hostService.getHost(hostId);
- if (host != null) {
- hosts.add(host);
- }
- }
-
-
- // Produces a set of all devices listed in the specified JSON array.
- protected Set<Device> getDevices(ArrayNode array) {
- Set<Device> devices = new HashSet<>();
- if (array != null) {
- for (JsonNode node : array) {
- try {
- addDevice(devices, deviceId(node.asText()));
- } catch (IllegalArgumentException e) {
- log.debug("Skipping ID {}", node.asText());
- }
- }
- }
- return devices;
- }
-
- private void addDevice(Set<Device> devices, DeviceId deviceId) {
- Device device = deviceService.getDevice(deviceId);
- if (device != null) {
- devices.add(device);
- }
- }
-
- protected void addHover(Set<Host> hosts, Set<Device> devices, String hover) {
- try {
- addHost(hosts, hostId(hover));
- } catch (IllegalArgumentException e) {
- try {
- addDevice(devices, deviceId(hover));
- } catch (IllegalArgumentException ne) {
- log.debug("Skipping ID {}", hover);
- }
- }
- }
-
- // Produces a cluster instance message to the client.
- protected ObjectNode instanceMessage(ClusterEvent event, String messageType) {
- ControllerNode node = event.subject();
- int switchCount = mastershipService.getDevicesOf(node.id()).size();
- ObjectNode payload = mapper.createObjectNode()
- .put("id", node.id().toString())
- .put("ip", node.ip().toString())
- .put("online", clusterService.getState(node.id()) == ACTIVE)
- .put("uiAttached", event.subject().equals(clusterService.getLocalNode()))
- .put("switches", switchCount);
-
- ArrayNode labels = mapper.createArrayNode();
- labels.add(node.id().toString());
- labels.add(node.ip().toString());
-
- // Add labels, props and stuff the payload into envelope.
- payload.set("labels", labels);
- addMetaUi(node.id().toString(), payload);
-
- String type = messageType != null ? messageType :
- ((event.type() == INSTANCE_ADDED) ? "addInstance" :
- ((event.type() == INSTANCE_REMOVED ? "removeInstance" :
- "addInstance")));
- return envelope(type, 0, payload);
- }
-
- // Produces a device event message to the client.
- protected ObjectNode deviceMessage(DeviceEvent event) {
- Device device = event.subject();
- ObjectNode payload = mapper.createObjectNode()
- .put("id", device.id().toString())
- .put("type", device.type().toString().toLowerCase())
- .put("online", deviceService.isAvailable(device.id()))
- .put("master", master(device.id()));
-
- // Generate labels: id, chassis id, no-label, optional-name
- String name = device.annotations().value(AnnotationKeys.NAME);
- ArrayNode labels = mapper.createArrayNode();
- labels.add("");
- labels.add(isNullOrEmpty(name) ? device.id().toString() : name);
- labels.add(device.id().toString());
-
- // Add labels, props and stuff the payload into envelope.
- payload.set("labels", labels);
- payload.set("props", props(device.annotations()));
- addGeoLocation(device, payload);
- addMetaUi(device.id().toString(), payload);
-
- String type = (event.type() == DEVICE_ADDED) ? "addDevice" :
- ((event.type() == DEVICE_REMOVED) ? "removeDevice" : "updateDevice");
- return envelope(type, 0, payload);
- }
-
- // Produces a link event message to the client.
- protected ObjectNode linkMessage(LinkEvent event) {
- Link link = event.subject();
- ObjectNode payload = mapper.createObjectNode()
- .put("id", compactLinkString(link))
- .put("type", link.type().toString().toLowerCase())
- .put("online", link.state() == Link.State.ACTIVE)
- .put("linkWidth", 1.2)
- .put("src", link.src().deviceId().toString())
- .put("srcPort", link.src().port().toString())
- .put("dst", link.dst().deviceId().toString())
- .put("dstPort", link.dst().port().toString());
- String type = (event.type() == LINK_ADDED) ? "addLink" :
- ((event.type() == LINK_REMOVED) ? "removeLink" : "updateLink");
- return envelope(type, 0, payload);
- }
-
- // Produces a host event message to the client.
- protected ObjectNode hostMessage(HostEvent event) {
- Host host = event.subject();
- String hostType = host.annotations().value(AnnotationKeys.TYPE);
- ObjectNode payload = mapper.createObjectNode()
- .put("id", host.id().toString())
- .put("type", isNullOrEmpty(hostType) ? "endstation" : hostType)
- .put("ingress", compactLinkString(edgeLink(host, true)))
- .put("egress", compactLinkString(edgeLink(host, false)));
- payload.set("cp", hostConnect(mapper, host.location()));
- payload.set("labels", labels(mapper, ip(host.ipAddresses()),
- host.mac().toString()));
- payload.set("props", props(host.annotations()));
- addGeoLocation(host, payload);
- addMetaUi(host.id().toString(), payload);
-
- String type = (event.type() == HOST_ADDED) ? "addHost" :
- ((event.type() == HOST_REMOVED) ? "removeHost" : "updateHost");
- return envelope(type, 0, payload);
- }
-
- // Encodes the specified host location into a JSON object.
- private ObjectNode hostConnect(ObjectMapper mapper, HostLocation location) {
- return mapper.createObjectNode()
- .put("device", location.deviceId().toString())
- .put("port", location.port().toLong());
- }
-
- // Encodes the specified list of labels a JSON array.
- private ArrayNode labels(ObjectMapper mapper, String... labels) {
- ArrayNode json = mapper.createArrayNode();
- for (String label : labels) {
- json.add(label);
- }
- return json;
- }
-
- // Returns the name of the master node for the specified device id.
- private String master(DeviceId deviceId) {
- NodeId master = mastershipService.getMasterFor(deviceId);
- return master != null ? master.toString() : "";
- }
-
- // Generates an edge link from the specified host location.
- private EdgeLink edgeLink(Host host, boolean ingress) {
- return new DefaultEdgeLink(PID, new ConnectPoint(host.id(), portNumber(0)),
- host.location(), ingress);
- }
-
- // Adds meta UI information for the specified object.
- private void addMetaUi(String id, ObjectNode payload) {
- ObjectNode meta = metaUi.get(id);
- if (meta != null) {
- payload.set("metaUi", meta);
- }
- }
-
- // Adds a geo location JSON to the specified payload object.
- private void addGeoLocation(Annotated annotated, ObjectNode payload) {
- Annotations annotations = annotated.annotations();
- if (annotations == null) {
- return;
- }
-
- String slat = annotations.value(AnnotationKeys.LATITUDE);
- String slng = annotations.value(AnnotationKeys.LONGITUDE);
- try {
- if (slat != null && slng != null && !slat.isEmpty() && !slng.isEmpty()) {
- double lat = Double.parseDouble(slat);
- double lng = Double.parseDouble(slng);
- ObjectNode loc = mapper.createObjectNode()
- .put("type", "latlng").put("lat", lat).put("lng", lng);
- payload.set("location", loc);
- }
- } catch (NumberFormatException e) {
- log.warn("Invalid geo data latitude={}; longiture={}", slat, slng);
- }
- }
-
- // Updates meta UI information for the specified object.
- protected void updateMetaUi(ObjectNode event) {
- ObjectNode payload = payload(event);
- metaUi.put(string(payload, "id"), (ObjectNode) payload.path("memento"));
- }
-
- // Returns summary response.
- protected ObjectNode summmaryMessage(long sid) {
- Topology topology = topologyService.currentTopology();
- return envelope("showSummary", sid,
- json("ONOS Summary", "node",
- new Prop("Devices", format(topology.deviceCount())),
- new Prop("Links", format(topology.linkCount())),
- new Prop("Hosts", format(hostService.getHostCount())),
- new Prop("Topology SCCs", format(topology.clusterCount())),
- new Separator(),
- new Prop("Intents", format(intentService.getIntentCount())),
- new Prop("Flows", format(flowService.getFlowRuleCount())),
- new Prop("Version", version)));
- }
-
- // Returns device details response.
- protected ObjectNode deviceDetails(DeviceId deviceId, long sid) {
- Device device = deviceService.getDevice(deviceId);
- Annotations annot = device.annotations();
- String name = annot.value(AnnotationKeys.NAME);
- int portCount = deviceService.getPorts(deviceId).size();
- int flowCount = getFlowCount(deviceId);
- return envelope("showDetails", sid,
- json(isNullOrEmpty(name) ? deviceId.toString() : name,
- device.type().toString().toLowerCase(),
- new Prop("URI", deviceId.toString()),
- new Prop("Vendor", device.manufacturer()),
- new Prop("H/W Version", device.hwVersion()),
- new Prop("S/W Version", device.swVersion()),
- new Prop("Serial Number", device.serialNumber()),
- new Prop("Protocol", annot.value(AnnotationKeys.PROTOCOL)),
- new Separator(),
- new Prop("Master", master(deviceId)),
- new Prop("Latitude", annot.value(AnnotationKeys.LATITUDE)),
- new Prop("Longitude", annot.value(AnnotationKeys.LONGITUDE)),
- new Separator(),
- new Prop("Ports", Integer.toString(portCount)),
- new Prop("Flows", Integer.toString(flowCount))));
- }
-
- protected int getFlowCount(DeviceId deviceId) {
- int count = 0;
- Iterator<FlowEntry> it = flowService.getFlowEntries(deviceId).iterator();
- while (it.hasNext()) {
- count++;
- it.next();
- }
- return count;
- }
-
- // Counts all entries that egress on the given device links.
- protected Map<Link, Integer> getFlowCounts(DeviceId deviceId) {
- List<FlowEntry> entries = new ArrayList<>();
- Set<Link> links = new HashSet<>(linkService.getDeviceEgressLinks(deviceId));
- Set<Host> hosts = hostService.getConnectedHosts(deviceId);
- Iterator<FlowEntry> it = flowService.getFlowEntries(deviceId).iterator();
- while (it.hasNext()) {
- entries.add(it.next());
- }
-
- // Add all edge links to the set
- if (hosts != null) {
- for (Host host : hosts) {
- links.add(new DefaultEdgeLink(host.providerId(),
- new ConnectPoint(host.id(), P0),
- host.location(), false));
- }
- }
-
- Map<Link, Integer> counts = new HashMap<>();
- for (Link link : links) {
- counts.put(link, getEgressFlows(link, entries));
- }
- return counts;
- }
-
- // Counts all entries that egress on the link source port.
- private Integer getEgressFlows(Link link, List<FlowEntry> entries) {
- int count = 0;
- PortNumber out = link.src().port();
- for (FlowEntry entry : entries) {
- TrafficTreatment treatment = entry.treatment();
- for (Instruction instruction : treatment.allInstructions()) {
- if (instruction.type() == Instruction.Type.OUTPUT &&
- ((OutputInstruction) instruction).port().equals(out)) {
- count++;
- }
- }
- }
- return count;
- }
-
-
- // Returns host details response.
- protected ObjectNode hostDetails(HostId hostId, long sid) {
- Host host = hostService.getHost(hostId);
- Annotations annot = host.annotations();
- String type = annot.value(AnnotationKeys.TYPE);
- String name = annot.value(AnnotationKeys.NAME);
- String vlan = host.vlan().toString();
- return envelope("showDetails", sid,
- json(isNullOrEmpty(name) ? hostId.toString() : name,
- isNullOrEmpty(type) ? "endstation" : type,
- new Prop("MAC", host.mac().toString()),
- new Prop("IP", host.ipAddresses().toString().replaceAll("[\\[\\]]", "")),
- new Prop("VLAN", vlan.equals("-1") ? "none" : vlan),
- new Separator(),
- new Prop("Latitude", annot.value(AnnotationKeys.LATITUDE)),
- new Prop("Longitude", annot.value(AnnotationKeys.LONGITUDE))));
- }
-
-
- // Produces JSON message to trigger traffic overview visualization
- protected ObjectNode trafficSummaryMessage(long sid) {
- ObjectNode payload = mapper.createObjectNode();
- ArrayNode paths = mapper.createArrayNode();
- payload.set("paths", paths);
-
- ObjectNode pathNodeN = mapper.createObjectNode();
- ArrayNode linksNodeN = mapper.createArrayNode();
- ArrayNode labelsN = mapper.createArrayNode();
-
- pathNodeN.put("class", "plain").put("traffic", false);
- pathNodeN.set("links", linksNodeN);
- pathNodeN.set("labels", labelsN);
- paths.add(pathNodeN);
-
- ObjectNode pathNodeT = mapper.createObjectNode();
- ArrayNode linksNodeT = mapper.createArrayNode();
- ArrayNode labelsT = mapper.createArrayNode();
-
- pathNodeT.put("class", "secondary").put("traffic", true);
- pathNodeT.set("links", linksNodeT);
- pathNodeT.set("labels", labelsT);
- paths.add(pathNodeT);
-
- for (BiLink link : consolidateLinks(linkService.getLinks())) {
- boolean bi = link.two != null;
- if (isInfrastructureEgress(link.one) ||
- (bi && isInfrastructureEgress(link.two))) {
- link.addLoad(statService.load(link.one));
- link.addLoad(bi ? statService.load(link.two) : null);
- if (link.hasTraffic) {
- linksNodeT.add(compactLinkString(link.one));
- labelsT.add(formatBytes(link.bytes));
- } else {
- linksNodeN.add(compactLinkString(link.one));
- labelsN.add("");
- }
- }
- }
- return envelope("showTraffic", sid, payload);
- }
-
- private Collection<BiLink> consolidateLinks(Iterable<Link> links) {
- Map<LinkKey, BiLink> biLinks = new HashMap<>();
- for (Link link : links) {
- addLink(biLinks, link);
- }
- return biLinks.values();
- }
-
- // Produces JSON message to trigger flow overview visualization
- protected ObjectNode flowSummaryMessage(long sid, Set<Device> devices) {
- ObjectNode payload = mapper.createObjectNode();
- ArrayNode paths = mapper.createArrayNode();
- payload.set("paths", paths);
-
- for (Device device : devices) {
- Map<Link, Integer> counts = getFlowCounts(device.id());
- for (Link link : counts.keySet()) {
- addLinkFlows(link, paths, counts.get(link));
- }
- }
- return envelope("showTraffic", sid, payload);
- }
-
- private void addLinkFlows(Link link, ArrayNode paths, Integer count) {
- ObjectNode pathNode = mapper.createObjectNode();
- ArrayNode linksNode = mapper.createArrayNode();
- ArrayNode labels = mapper.createArrayNode();
- boolean noFlows = count == null || count == 0;
- pathNode.put("class", noFlows ? "secondary" : "primary");
- pathNode.put("traffic", false);
- pathNode.set("links", linksNode.add(compactLinkString(link)));
- pathNode.set("labels", labels.add(noFlows ? "" : (count.toString() +
- (count == 1 ? " flow" : " flows"))));
- paths.add(pathNode);
- }
-
-
- // Produces JSON message to trigger traffic visualization
- protected ObjectNode trafficMessage(long sid, TrafficClass... trafficClasses) {
- ObjectNode payload = mapper.createObjectNode();
- ArrayNode paths = mapper.createArrayNode();
- payload.set("paths", paths);
-
- // Classify links based on their traffic traffic first...
- Map<LinkKey, BiLink> biLinks = classifyLinkTraffic(trafficClasses);
-
- // Then separate the links into their respective classes and send them out.
- Map<String, ObjectNode> pathNodes = new HashMap<>();
- for (BiLink biLink : biLinks.values()) {
- boolean hasTraffic = biLink.hasTraffic;
- String tc = (biLink.classes + (hasTraffic ? " animated" : "")).trim();
- ObjectNode pathNode = pathNodes.get(tc);
- if (pathNode == null) {
- pathNode = mapper.createObjectNode()
- .put("class", tc).put("traffic", hasTraffic);
- pathNode.set("links", mapper.createArrayNode());
- pathNode.set("labels", mapper.createArrayNode());
- pathNodes.put(tc, pathNode);
- paths.add(pathNode);
- }
- ((ArrayNode) pathNode.path("links")).add(compactLinkString(biLink.one));
- ((ArrayNode) pathNode.path("labels")).add(hasTraffic ? formatBytes(biLink.bytes) : "");
- }
-
- return envelope("showTraffic", sid, payload);
- }
-
- // Classifies the link traffic according to the specified classes.
- private Map<LinkKey, BiLink> classifyLinkTraffic(TrafficClass... trafficClasses) {
- Map<LinkKey, BiLink> biLinks = new HashMap<>();
- for (TrafficClass trafficClass : trafficClasses) {
- for (Intent intent : trafficClass.intents) {
- boolean isOptical = intent instanceof OpticalConnectivityIntent;
- List<Intent> installables = intentService.getInstallableIntents(intent.key());
- if (installables != null) {
- for (Intent installable : installables) {
- String type = isOptical ? trafficClass.type + " optical" : trafficClass.type;
- if (installable instanceof PathIntent) {
- classifyLinks(type, biLinks, trafficClass.showTraffic,
- ((PathIntent) installable).path().links());
- } else if (installable instanceof LinkCollectionIntent) {
- classifyLinks(type, biLinks, trafficClass.showTraffic,
- ((LinkCollectionIntent) installable).links());
- } else if (installable instanceof OpticalPathIntent) {
- classifyLinks(type, biLinks, trafficClass.showTraffic,
- ((OpticalPathIntent) installable).path().links());
- }
- }
- }
- }
- }
- return biLinks;
- }
-
-
- // Adds the link segments (path or tree) associated with the specified
- // connectivity intent
- private void classifyLinks(String type, Map<LinkKey, BiLink> biLinks,
- boolean showTraffic, Iterable<Link> links) {
- if (links != null) {
- for (Link link : links) {
- BiLink biLink = addLink(biLinks, link);
- if (isInfrastructureEgress(link)) {
- if (showTraffic) {
- biLink.addLoad(statService.load(link));
- }
- biLink.addClass(type);
- }
- }
- }
- }
-
-
- private BiLink addLink(Map<LinkKey, BiLink> biLinks, Link link) {
- LinkKey key = canonicalLinkKey(link);
- BiLink biLink = biLinks.get(key);
- if (biLink != null) {
- biLink.setOther(link);
- } else {
- biLink = new BiLink(key, link);
- biLinks.put(key, biLink);
- }
- return biLink;
- }
-
-
- // Adds the link segments (path or tree) associated with the specified
- // connectivity intent
- protected void addPathTraffic(ArrayNode paths, String type, String trafficType,
- Iterable<Link> links) {
- ObjectNode pathNode = mapper.createObjectNode();
- ArrayNode linksNode = mapper.createArrayNode();
-
- if (links != null) {
- ArrayNode labels = mapper.createArrayNode();
- boolean hasTraffic = false;
- for (Link link : links) {
- if (isInfrastructureEgress(link)) {
- linksNode.add(compactLinkString(link));
- Load load = statService.load(link);
- String label = "";
- if (load.rate() > 0) {
- hasTraffic = true;
- label = formatBytes(load.latest());
- }
- labels.add(label);
- }
- }
- pathNode.put("class", hasTraffic ? type + " " + trafficType : type);
- pathNode.put("traffic", hasTraffic);
- pathNode.set("links", linksNode);
- pathNode.set("labels", labels);
- paths.add(pathNode);
- }
- }
-
- // Poor-mans formatting to get the labels with byte counts looking nice.
- private String formatBytes(long bytes) {
- String unit;
- double value;
- if (bytes > GB) {
- value = bytes / GB;
- unit = GB_UNIT;
- } else if (bytes > MB) {
- value = bytes / MB;
- unit = MB_UNIT;
- } else if (bytes > KB) {
- value = bytes / KB;
- unit = KB_UNIT;
- } else {
- value = bytes;
- unit = B_UNIT;
- }
- DecimalFormat format = new DecimalFormat("#,###.##");
- return format.format(value) + " " + unit;
- }
-
- // Formats the given number into a string.
- private String format(Number number) {
- DecimalFormat format = new DecimalFormat("#,###");
- return format.format(number);
- }
-
- private boolean isInfrastructureEgress(Link link) {
- return link.src().elementId() instanceof DeviceId;
- }
-
- // Produces compact string representation of a link.
- private static String compactLinkString(Link link) {
- return String.format(COMPACT, link.src().elementId(), link.src().port(),
- link.dst().elementId(), link.dst().port());
- }
-
- // Produces JSON property details.
- private ObjectNode json(String id, String type, Prop... props) {
- ObjectMapper mapper = new ObjectMapper();
- ObjectNode result = mapper.createObjectNode()
- .put("id", id).put("type", type);
- ObjectNode pnode = mapper.createObjectNode();
- ArrayNode porder = mapper.createArrayNode();
- for (Prop p : props) {
- porder.add(p.key);
- pnode.put(p.key, p.value);
- }
- result.set("propOrder", porder);
- result.set("props", pnode);
- return result;
- }
-
- // Produces canonical link key, i.e. one that will match link and its inverse.
- private LinkKey canonicalLinkKey(Link link) {
- String sn = link.src().elementId().toString();
- String dn = link.dst().elementId().toString();
- return sn.compareTo(dn) < 0 ?
- linkKey(link.src(), link.dst()) : linkKey(link.dst(), link.src());
- }
-
- // Representation of link and its inverse and any traffic data.
- private class BiLink {
- public final LinkKey key;
- public final Link one;
- public Link two;
- public boolean hasTraffic = false;
- public long bytes = 0;
- public String classes = "";
-
- BiLink(LinkKey key, Link link) {
- this.key = key;
- this.one = link;
- }
-
- void setOther(Link link) {
- this.two = link;
- }
-
- void addLoad(Load load) {
- if (load != null) {
- this.hasTraffic = hasTraffic || load.rate() > 0;
- this.bytes += load.latest();
- }
- }
-
- void addClass(String trafficClass) {
- classes = classes + " " + trafficClass;
- }
- }
-
- // Auxiliary key/value carrier.
- private class Prop {
- public final String key;
- public final String value;
-
- protected Prop(String key, String value) {
- this.key = key;
- this.value = value;
- }
- }
-
- // Auxiliary properties separator
- private class Separator extends Prop {
- protected Separator() {
- super("-", "");
- }
- }
-
- // Auxiliary carrier of data for requesting traffic message.
- protected class TrafficClass {
- public final boolean showTraffic;
- public final String type;
- public final Iterable<Intent> intents;
-
- TrafficClass(String type, Iterable<Intent> intents) {
- this(type, intents, false);
- }
-
- TrafficClass(String type, Iterable<Intent> intents, boolean showTraffic) {
- this.type = type;
- this.intents = intents;
- this.showTraffic = showTraffic;
- }
- }
-
-}
diff --git a/web/gui/src/main/java/org/onosproject/ui/impl/TopologyViewWebSocket.java b/web/gui/src/main/java/org/onosproject/ui/impl/TopologyViewWebSocket.java
deleted file mode 100644
index 16b0eb6..0000000
--- a/web/gui/src/main/java/org/onosproject/ui/impl/TopologyViewWebSocket.java
+++ /dev/null
@@ -1,752 +0,0 @@
-/*
- * Copyright 2014-2015 Open Networking Laboratory
- *
- * 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.
- */
-package org.onosproject.ui.impl;
-
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
-import java.util.Timer;
-import java.util.TimerTask;
-
-import org.eclipse.jetty.websocket.WebSocket;
-import org.onlab.osgi.ServiceDirectory;
-import org.onlab.util.AbstractAccumulator;
-import org.onlab.util.Accumulator;
-import org.onosproject.cluster.ClusterEvent;
-import org.onosproject.cluster.ClusterEventListener;
-import org.onosproject.cluster.ControllerNode;
-import org.onosproject.core.ApplicationId;
-import org.onosproject.core.CoreService;
-import org.onosproject.event.Event;
-import org.onosproject.mastership.MastershipAdminService;
-import org.onosproject.mastership.MastershipEvent;
-import org.onosproject.mastership.MastershipListener;
-import org.onosproject.net.ConnectPoint;
-import org.onosproject.net.Device;
-import org.onosproject.net.Host;
-import org.onosproject.net.HostId;
-import org.onosproject.net.HostLocation;
-import org.onosproject.net.Link;
-import org.onosproject.net.device.DeviceEvent;
-import org.onosproject.net.device.DeviceListener;
-import org.onosproject.net.flow.DefaultTrafficSelector;
-import org.onosproject.net.flow.DefaultTrafficTreatment;
-import org.onosproject.net.flow.FlowRuleEvent;
-import org.onosproject.net.flow.FlowRuleListener;
-import org.onosproject.net.flow.TrafficSelector;
-import org.onosproject.net.flow.TrafficTreatment;
-import org.onosproject.net.host.HostEvent;
-import org.onosproject.net.host.HostListener;
-import org.onosproject.net.intent.HostToHostIntent;
-import org.onosproject.net.intent.Intent;
-import org.onosproject.net.intent.IntentEvent;
-import org.onosproject.net.intent.IntentListener;
-import org.onosproject.net.intent.MultiPointToSinglePointIntent;
-import org.onosproject.net.link.LinkEvent;
-import org.onosproject.net.link.LinkListener;
-
-import com.fasterxml.jackson.databind.JsonNode;
-import com.fasterxml.jackson.databind.node.ArrayNode;
-import com.fasterxml.jackson.databind.node.ObjectNode;
-
-import static com.google.common.base.Strings.isNullOrEmpty;
-import static org.onosproject.cluster.ClusterEvent.Type.INSTANCE_ADDED;
-import static org.onosproject.net.DeviceId.deviceId;
-import static org.onosproject.net.HostId.hostId;
-import static org.onosproject.net.device.DeviceEvent.Type.DEVICE_ADDED;
-import static org.onosproject.net.device.DeviceEvent.Type.DEVICE_UPDATED;
-import static org.onosproject.net.host.HostEvent.Type.HOST_ADDED;
-import static org.onosproject.net.link.LinkEvent.Type.LINK_ADDED;
-
-/**
- * Web socket capable of interacting with the GUI topology view.
- */
-@Deprecated
-public class TopologyViewWebSocket
- extends TopologyViewMessages
- implements WebSocket.OnTextMessage, WebSocket.OnControl {
-
- private static final long MAX_AGE_MS = 15000;
-
- private static final byte PING = 0x9;
- private static final byte PONG = 0xA;
- private static final byte[] PING_DATA = new byte[]{(byte) 0xde, (byte) 0xad};
-
- private static final String APP_ID = "org.onosproject.gui";
-
- private static final long TRAFFIC_FREQUENCY = 5000;
- private static final long SUMMARY_FREQUENCY = 30000;
-
- private static final Comparator<? super ControllerNode> NODE_COMPARATOR =
- new Comparator<ControllerNode>() {
- @Override
- public int compare(ControllerNode o1, ControllerNode o2) {
- return o1.id().toString().compareTo(o2.id().toString());
- }
- };
-
-
- private final Timer timer = new Timer("topology-view");
-
- private static final int MAX_EVENTS = 1000;
- private static final int MAX_BATCH_MS = 5000;
- private static final int MAX_IDLE_MS = 1000;
-
- private final ApplicationId appId;
-
- private Connection connection;
- private FrameConnection control;
-
- private final ClusterEventListener clusterListener = new InternalClusterListener();
- private final MastershipListener mastershipListener = new InternalMastershipListener();
- private final DeviceListener deviceListener = new InternalDeviceListener();
- private final LinkListener linkListener = new InternalLinkListener();
- private final HostListener hostListener = new InternalHostListener();
- private final IntentListener intentListener = new InternalIntentListener();
- private final FlowRuleListener flowListener = new InternalFlowListener();
-
- private final Accumulator<Event> eventAccummulator = new InternalEventAccummulator();
-
- private TimerTask trafficTask;
- private ObjectNode trafficEvent;
-
- private TimerTask summaryTask;
- private ObjectNode summaryEvent;
-
- private long lastActive = System.currentTimeMillis();
- private boolean listenersRemoved = false;
-
- private TopologyViewIntentFilter intentFilter;
-
- // Current selection context
- private Set<Host> selectedHosts;
- private Set<Device> selectedDevices;
- private List<Intent> selectedIntents;
- private int currentIntentIndex = -1;
-
- /**
- * Creates a new web-socket for serving data to GUI topology view.
- *
- * @param directory service directory
- */
- public TopologyViewWebSocket(ServiceDirectory directory) {
- super(directory);
- intentFilter = new TopologyViewIntentFilter(intentService, deviceService,
- hostService, linkService);
- appId = directory.get(CoreService.class).registerApplication(APP_ID);
- }
-
- /**
- * Issues a close on the connection.
- */
- synchronized void close() {
- removeListeners();
- if (connection.isOpen()) {
- connection.close();
- }
- }
-
- /**
- * Indicates if this connection is idle.
- *
- * @return true if idle or closed
- */
- synchronized boolean isIdle() {
- boolean idle = (System.currentTimeMillis() - lastActive) > MAX_AGE_MS;
- if (idle || (connection != null && !connection.isOpen())) {
- return true;
- } else if (connection != null) {
- try {
- control.sendControl(PING, PING_DATA, 0, PING_DATA.length);
- } catch (IOException e) {
- log.warn("Unable to send ping message due to: ", e);
- }
- }
- return false;
- }
-
- @Override
- public void onOpen(Connection connection) {
- log.info("Legacy GUI client connected");
- this.connection = connection;
- this.control = (FrameConnection) connection;
- addListeners();
-
- sendAllInstances(null);
- sendAllDevices();
- sendAllLinks();
- sendAllHosts();
- }
-
- @Override
- public synchronized void onClose(int closeCode, String message) {
- removeListeners();
- timer.cancel();
- log.info("Legacy GUI client disconnected");
- }
-
- @Override
- public boolean onControl(byte controlCode, byte[] data, int offset, int length) {
- lastActive = System.currentTimeMillis();
- return true;
- }
-
- @Override
- public void onMessage(String data) {
- lastActive = System.currentTimeMillis();
- try {
- processMessage((ObjectNode) mapper.reader().readTree(data));
- } catch (Exception e) {
- log.warn("Unable to parse GUI request {} due to {}", data, e);
- log.debug("Boom!!!", e);
- }
- }
-
- // Processes the specified event.
- private void processMessage(ObjectNode event) {
- String type = string(event, "event", "unknown");
- if (type.equals("requestDetails")) {
- requestDetails(event);
- } else if (type.equals("updateMeta")) {
- updateMetaUi(event);
-
- } else if (type.equals("addHostIntent")) {
- createHostIntent(event);
- } else if (type.equals("addMultiSourceIntent")) {
- createMultiSourceIntent(event);
-
- } else if (type.equals("requestRelatedIntents")) {
- stopTrafficMonitoring();
- requestRelatedIntents(event);
-
- } else if (type.equals("requestNextRelatedIntent")) {
- stopTrafficMonitoring();
- requestAnotherRelatedIntent(event, +1);
- } else if (type.equals("requestPrevRelatedIntent")) {
- stopTrafficMonitoring();
- requestAnotherRelatedIntent(event, -1);
- } else if (type.equals("requestSelectedIntentTraffic")) {
- requestSelectedIntentTraffic(event);
- startTrafficMonitoring(event);
-
- } else if (type.equals("requestAllTraffic")) {
- requestAllTraffic(event);
- startTrafficMonitoring(event);
-
- } else if (type.equals("requestDeviceLinkFlows")) {
- requestDeviceLinkFlows(event);
- startTrafficMonitoring(event);
-
- } else if (type.equals("cancelTraffic")) {
- cancelTraffic(event);
-
- } else if (type.equals("requestSummary")) {
- requestSummary(event);
- startSummaryMonitoring(event);
- } else if (type.equals("cancelSummary")) {
- stopSummaryMonitoring();
-
- } else if (type.equals("equalizeMasters")) {
- equalizeMasters(event);
- }
- }
-
- // Sends the specified data to the client.
- protected synchronized void sendMessage(ObjectNode data) {
- try {
- if (connection.isOpen()) {
- connection.sendMessage(data.toString());
- }
- } catch (IOException e) {
- log.warn("Unable to send message {} to GUI due to {}", data, e);
- log.debug("Boom!!!", e);
- }
- }
-
- // Sends all controller nodes to the client as node-added messages.
- private void sendAllInstances(String messageType) {
- List<ControllerNode> nodes = new ArrayList<>(clusterService.getNodes());
- Collections.sort(nodes, NODE_COMPARATOR);
- for (ControllerNode node : nodes) {
- sendMessage(instanceMessage(new ClusterEvent(INSTANCE_ADDED, node),
- messageType));
- }
- }
-
- // Sends all devices to the client as device-added messages.
- private void sendAllDevices() {
- // Send optical first, others later for layered rendering
- for (Device device : deviceService.getDevices()) {
- if (device.type() == Device.Type.ROADM) {
- sendMessage(deviceMessage(new DeviceEvent(DEVICE_ADDED, device)));
- }
- }
- for (Device device : deviceService.getDevices()) {
- if (device.type() != Device.Type.ROADM) {
- sendMessage(deviceMessage(new DeviceEvent(DEVICE_ADDED, device)));
- }
- }
- }
-
- // Sends all links to the client as link-added messages.
- private void sendAllLinks() {
- // Send optical first, others later for layered rendering
- for (Link link : linkService.getLinks()) {
- if (link.type() == Link.Type.OPTICAL) {
- sendMessage(linkMessage(new LinkEvent(LINK_ADDED, link)));
- }
- }
- for (Link link : linkService.getLinks()) {
- if (link.type() != Link.Type.OPTICAL) {
- sendMessage(linkMessage(new LinkEvent(LINK_ADDED, link)));
- }
- }
- }
-
- // Sends all hosts to the client as host-added messages.
- private void sendAllHosts() {
- for (Host host : hostService.getHosts()) {
- sendMessage(hostMessage(new HostEvent(HOST_ADDED, host)));
- }
- }
-
- // Sends back device or host details.
- private void requestDetails(ObjectNode event) {
- ObjectNode payload = payload(event);
- String type = string(payload, "class", "unknown");
- long sid = number(event, "sid");
-
- if (type.equals("device")) {
- sendMessage(deviceDetails(deviceId(string(payload, "id")), sid));
- } else if (type.equals("host")) {
- sendMessage(hostDetails(hostId(string(payload, "id")), sid));
- }
- }
-
-
- // Creates host-to-host intent.
- private void createHostIntent(ObjectNode event) {
- ObjectNode payload = payload(event);
- long id = number(event, "sid");
- // TODO: add protection against device ids and non-existent hosts.
- HostId one = hostId(string(payload, "one"));
- HostId two = hostId(string(payload, "two"));
-
- HostToHostIntent intent =
- HostToHostIntent.builder()
- .appId(appId)
- .one(one)
- .two(two)
- .build();
-
-
- intentService.submit(intent);
- startMonitoringIntent(event, intent);
- }
-
- // Creates multi-source-to-single-dest intent.
- private void createMultiSourceIntent(ObjectNode event) {
- ObjectNode payload = payload(event);
- long id = number(event, "sid");
- // TODO: add protection against device ids and non-existent hosts.
- Set<HostId> src = getHostIds((ArrayNode) payload.path("src"));
- HostId dst = hostId(string(payload, "dst"));
- Host dstHost = hostService.getHost(dst);
-
- Set<ConnectPoint> ingressPoints = getHostLocations(src);
-
- // FIXME: clearly, this is not enough
- TrafficSelector selector = DefaultTrafficSelector.builder()
- .matchEthDst(dstHost.mac()).build();
- TrafficTreatment treatment = DefaultTrafficTreatment.emptyTreatment();
-
- MultiPointToSinglePointIntent intent =
- MultiPointToSinglePointIntent.builder()
- .appId(appId)
- .selector(selector)
- .treatment(treatment)
- .ingressPoints(ingressPoints)
- .egressPoint(dstHost.location())
- .build();
-
- intentService.submit(intent);
- startMonitoringIntent(event, intent);
- }
-
-
- private synchronized void startMonitoringIntent(ObjectNode event, Intent intent) {
- selectedHosts = new HashSet<>();
- selectedDevices = new HashSet<>();
- selectedIntents = new ArrayList<>();
- selectedIntents.add(intent);
- currentIntentIndex = -1;
- requestAnotherRelatedIntent(event, +1);
- requestSelectedIntentTraffic(event);
- }
-
-
- private Set<ConnectPoint> getHostLocations(Set<HostId> hostIds) {
- Set<ConnectPoint> points = new HashSet<>();
- for (HostId hostId : hostIds) {
- points.add(getHostLocation(hostId));
- }
- return points;
- }
-
- private HostLocation getHostLocation(HostId hostId) {
- return hostService.getHost(hostId).location();
- }
-
- // Produces a list of host ids from the specified JSON array.
- private Set<HostId> getHostIds(ArrayNode ids) {
- Set<HostId> hostIds = new HashSet<>();
- for (JsonNode id : ids) {
- hostIds.add(hostId(id.asText()));
- }
- return hostIds;
- }
-
-
- private synchronized long startTrafficMonitoring(ObjectNode event) {
- stopTrafficMonitoring();
- trafficEvent = event;
- trafficTask = new TrafficMonitor();
- timer.schedule(trafficTask, TRAFFIC_FREQUENCY, TRAFFIC_FREQUENCY);
- return number(event, "sid");
- }
-
- private synchronized void stopTrafficMonitoring() {
- if (trafficTask != null) {
- trafficTask.cancel();
- trafficTask = null;
- trafficEvent = null;
- }
- }
-
- // Subscribes for host traffic messages.
- private synchronized void requestAllTraffic(ObjectNode event) {
- long sid = startTrafficMonitoring(event);
- sendMessage(trafficSummaryMessage(sid));
- }
-
- private void requestDeviceLinkFlows(ObjectNode event) {
- ObjectNode payload = payload(event);
- long sid = startTrafficMonitoring(event);
-
- // Get the set of selected hosts and their intents.
- ArrayNode ids = (ArrayNode) payload.path("ids");
- Set<Host> hosts = new HashSet<>();
- Set<Device> devices = getDevices(ids);
-
- // If there is a hover node, include it in the hosts and find intents.
- String hover = string(payload, "hover");
- if (!isNullOrEmpty(hover)) {
- addHover(hosts, devices, hover);
- }
- sendMessage(flowSummaryMessage(sid, devices));
- }
-
-
- // Requests related intents message.
- private synchronized void requestRelatedIntents(ObjectNode event) {
- ObjectNode payload = payload(event);
- if (!payload.has("ids")) {
- return;
- }
-
- long sid = number(event, "sid");
-
- // Cancel any other traffic monitoring mode.
- stopTrafficMonitoring();
-
- // Get the set of selected hosts and their intents.
- ArrayNode ids = (ArrayNode) payload.path("ids");
- selectedHosts = getHosts(ids);
- selectedDevices = getDevices(ids);
- selectedIntents = intentFilter.findPathIntents(selectedHosts, selectedDevices,
- intentService.getIntents());
- currentIntentIndex = -1;
-
- if (haveSelectedIntents()) {
- // Send a message to highlight all links of all monitored intents.
- sendMessage(trafficMessage(sid, new TrafficClass("primary", selectedIntents)));
- }
-
- // FIXME: Re-introduce one the client click vs hover gesture stuff is sorted out.
-// String hover = string(payload, "hover");
-// if (!isNullOrEmpty(hover)) {
-// // If there is a hover node, include it in the selection and find intents.
-// processHoverExtendedSelection(sid, hover);
-// }
- }
-
- private boolean haveSelectedIntents() {
- return selectedIntents != null && !selectedIntents.isEmpty();
- }
-
- // Processes the selection extended with hovered item to segregate items
- // into primary (those including the hover) vs secondary highlights.
- private void processHoverExtendedSelection(long sid, String hover) {
- Set<Host> hoverSelHosts = new HashSet<>(selectedHosts);
- Set<Device> hoverSelDevices = new HashSet<>(selectedDevices);
- addHover(hoverSelHosts, hoverSelDevices, hover);
-
- List<Intent> primary = selectedIntents == null ? new ArrayList<>() :
- intentFilter.findPathIntents(hoverSelHosts, hoverSelDevices,
- selectedIntents);
- Set<Intent> secondary = new HashSet<>(selectedIntents);
- secondary.removeAll(primary);
-
- // Send a message to highlight all links of all monitored intents.
- sendMessage(trafficMessage(sid, new TrafficClass("primary", primary),
- new TrafficClass("secondary", secondary)));
- }
-
- // Requests next or previous related intent.
- private void requestAnotherRelatedIntent(ObjectNode event, int offset) {
- if (haveSelectedIntents()) {
- currentIntentIndex = currentIntentIndex + offset;
- if (currentIntentIndex < 0) {
- currentIntentIndex = selectedIntents.size() - 1;
- } else if (currentIntentIndex >= selectedIntents.size()) {
- currentIntentIndex = 0;
- }
- sendSelectedIntent(event);
- }
- }
-
- // Sends traffic information on the related intents with the currently
- // selected intent highlighted.
- private void sendSelectedIntent(ObjectNode event) {
- Intent selectedIntent = selectedIntents.get(currentIntentIndex);
- log.info("Requested next intent {}", selectedIntent.id());
-
- Set<Intent> primary = new HashSet<>();
- primary.add(selectedIntent);
-
- Set<Intent> secondary = new HashSet<>(selectedIntents);
- secondary.remove(selectedIntent);
-
- // Send a message to highlight all links of the selected intent.
- sendMessage(trafficMessage(number(event, "sid"),
- new TrafficClass("primary", primary),
- new TrafficClass("secondary", secondary)));
- }
-
- // Requests monitoring of traffic for the selected intent.
- private void requestSelectedIntentTraffic(ObjectNode event) {
- if (haveSelectedIntents()) {
- if (currentIntentIndex < 0) {
- currentIntentIndex = 0;
- }
- Intent selectedIntent = selectedIntents.get(currentIntentIndex);
- log.info("Requested traffic for selected {}", selectedIntent.id());
-
- Set<Intent> primary = new HashSet<>();
- primary.add(selectedIntent);
-
- // Send a message to highlight all links of the selected intent.
- sendMessage(trafficMessage(number(event, "sid"),
- new TrafficClass("primary", primary, true)));
- }
- }
-
- // Cancels sending traffic messages.
- private void cancelTraffic(ObjectNode event) {
- selectedIntents = null;
- sendMessage(trafficMessage(number(event, "sid")));
- stopTrafficMonitoring();
- }
-
-
- private synchronized long startSummaryMonitoring(ObjectNode event) {
- stopSummaryMonitoring();
- summaryEvent = event;
- summaryTask = new SummaryMonitor();
- timer.schedule(summaryTask, SUMMARY_FREQUENCY, SUMMARY_FREQUENCY);
- return number(event, "sid");
- }
-
- private synchronized void stopSummaryMonitoring() {
- if (summaryEvent != null) {
- summaryTask.cancel();
- summaryTask = null;
- summaryEvent = null;
- }
- }
-
- // Subscribes for summary messages.
- private synchronized void requestSummary(ObjectNode event) {
- sendMessage(summmaryMessage(number(event, "sid")));
- }
-
-
- // Forces mastership role rebalancing.
- private void equalizeMasters(ObjectNode event) {
- directory.get(MastershipAdminService.class).balanceRoles();
- }
-
-
- // Adds all internal listeners.
- private void addListeners() {
- clusterService.addListener(clusterListener);
- mastershipService.addListener(mastershipListener);
- deviceService.addListener(deviceListener);
- linkService.addListener(linkListener);
- hostService.addListener(hostListener);
- intentService.addListener(intentListener);
- flowService.addListener(flowListener);
- }
-
- // Removes all internal listeners.
- private synchronized void removeListeners() {
- if (!listenersRemoved) {
- listenersRemoved = true;
- clusterService.removeListener(clusterListener);
- mastershipService.removeListener(mastershipListener);
- deviceService.removeListener(deviceListener);
- linkService.removeListener(linkListener);
- hostService.removeListener(hostListener);
- intentService.removeListener(intentListener);
- flowService.removeListener(flowListener);
- }
- }
-
- // Cluster event listener.
- private class InternalClusterListener implements ClusterEventListener {
- @Override
- public void event(ClusterEvent event) {
- sendMessage(instanceMessage(event, null));
- }
- }
-
- // Mastership change listener
- private class InternalMastershipListener implements MastershipListener {
- @Override
- public void event(MastershipEvent event) {
- sendAllInstances("updateInstance");
- Device device = deviceService.getDevice(event.subject());
- sendMessage(deviceMessage(new DeviceEvent(DEVICE_UPDATED, device)));
- }
- }
-
- // Device event listener.
- private class InternalDeviceListener implements DeviceListener {
- @Override
- public void event(DeviceEvent event) {
- sendMessage(deviceMessage(event));
- eventAccummulator.add(event);
- }
- }
-
- // Link event listener.
- private class InternalLinkListener implements LinkListener {
- @Override
- public void event(LinkEvent event) {
- sendMessage(linkMessage(event));
- eventAccummulator.add(event);
- }
- }
-
- // Host event listener.
- private class InternalHostListener implements HostListener {
- @Override
- public void event(HostEvent event) {
- sendMessage(hostMessage(event));
- eventAccummulator.add(event);
- }
- }
-
- // Intent event listener.
- private class InternalIntentListener implements IntentListener {
- @Override
- public void event(IntentEvent event) {
- if (trafficEvent != null) {
- requestSelectedIntentTraffic(trafficEvent);
- }
- eventAccummulator.add(event);
- }
- }
-
- // Intent event listener.
- private class InternalFlowListener implements FlowRuleListener {
- @Override
- public void event(FlowRuleEvent event) {
- eventAccummulator.add(event);
- }
- }
-
- // Periodic update of the traffic information
- private class TrafficMonitor extends TimerTask {
- @Override
- public void run() {
- try {
- if (trafficEvent != null) {
- String type = string(trafficEvent, "event", "unknown");
- if (type.equals("requestAllTraffic")) {
- requestAllTraffic(trafficEvent);
- } else if (type.equals("requestDeviceLinkFlows")) {
- requestDeviceLinkFlows(trafficEvent);
- } else if (type.equals("requestSelectedIntentTraffic")) {
- requestSelectedIntentTraffic(trafficEvent);
- }
- }
- } catch (Exception e) {
- log.warn("Unable to handle traffic request due to {}", e.getMessage());
- log.debug("Boom!", e);
- }
- }
- }
-
- // Periodic update of the summary information
- private class SummaryMonitor extends TimerTask {
- @Override
- public void run() {
- try {
- if (summaryEvent != null) {
- requestSummary(summaryEvent);
- }
- } catch (Exception e) {
- log.warn("Unable to handle summary request due to {}", e.getMessage());
- log.debug("Boom!", e);
- }
- }
- }
-
- // Accumulates events to drive methodic update of the summary pane.
- private class InternalEventAccummulator extends AbstractAccumulator<Event> {
- protected InternalEventAccummulator() {
- super(new Timer("topo-summary"), MAX_EVENTS, MAX_BATCH_MS, MAX_IDLE_MS);
- }
-
- @Override
- public void processItems(List<Event> items) {
- try {
- if (summaryEvent != null) {
- sendMessage(summmaryMessage(0));
- }
- } catch (Exception e) {
- log.warn("Unable to handle summary request due to {}", e.getMessage());
- log.debug("Boom!", e);
- }
- }
- }
-}
-
diff --git a/web/gui/src/main/webapp/WEB-INF/web.xml b/web/gui/src/main/webapp/WEB-INF/web.xml
index ace06db..f03925b 100644
--- a/web/gui/src/main/webapp/WEB-INF/web.xml
+++ b/web/gui/src/main/webapp/WEB-INF/web.xml
@@ -161,15 +161,4 @@
<url-pattern>/websock/*</url-pattern>
</servlet-mapping>
- <servlet>
- <servlet-name>Legacy Web Socket Service</servlet-name>
- <servlet-class>org.onosproject.ui.impl.GuiWebSocketServlet</servlet-class>
- <load-on-startup>2</load-on-startup>
- </servlet>
-
- <servlet-mapping>
- <servlet-name>Legacy Web Socket Service</servlet-name>
- <url-pattern>/ws/*</url-pattern>
- </servlet-mapping>
-
</web-app>
diff --git a/web/gui/src/main/webapp/legacy/base.css b/web/gui/src/main/webapp/legacy/base.css
deleted file mode 100644
index bc5b240..0000000
--- a/web/gui/src/main/webapp/legacy/base.css
+++ /dev/null
@@ -1,29 +0,0 @@
-/*
- * Copyright 2014 Open Networking Laboratory
- *
- * 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.
- */
-
-/*
- Base CSS file
- */
-
-html {
- font-family: sans-serif;
- -webkit-text-size-adjust: 100%;
- -ms-text-size-adjust: 100%;
-}
-
-body {
- margin: 0;
-}
diff --git a/web/gui/src/main/webapp/legacy/continental_us.json b/web/gui/src/main/webapp/legacy/continental_us.json
deleted file mode 100644
index 978fbdf..0000000
--- a/web/gui/src/main/webapp/legacy/continental_us.json
+++ /dev/null
@@ -1,25782 +0,0 @@
-{
- "type": "Topology",
- "objects": {
- "states": {
- "type": "GeometryCollection",
- "geometries": [
- {
- "type": "MultiPolygon",
- "arcs": [
- [
- [
- 0
- ]
- ],
- [
- [
- 1,
- 2,
- 3,
- 4,
- 5
- ]
- ]
- ]
- },
- {
- "type": "Polygon",
- "arcs": [
- [
- 6,
- 7,
- 8,
- 9,
- 10,
- 11
- ]
- ]
- },
- {
- "type": "Polygon",
- "arcs": [
- [
- 12,
- 13,
- 14,
- 15,
- 16
- ]
- ]
- },
- {
- "type": "MultiPolygon",
- "arcs": [
- [
- [
- 17
- ]
- ],
- [
- [
- 18
- ]
- ],
- [
- [
- 19
- ]
- ],
- [
- [
- 20
- ]
- ],
- [
- [
- 21
- ]
- ],
- [
- [
- 22
- ]
- ],
- [
- [
- 23,
- 24,
- -15,
- 25
- ]
- ]
- ]
- },
- {
- "type": "Polygon",
- "arcs": [
- [
- 26,
- 27,
- 28,
- 29,
- 30,
- 31
- ]
- ]
- },
- {
- "type": "Polygon",
- "arcs": [
- [
- 32,
- 33,
- 34,
- 35
- ]
- ]
- },
- {
- "type": "Polygon",
- "arcs": [
- [
- 36,
- 37
- ]
- ]
- },
- {
- "type": "Polygon",
- "arcs": [
- [
- 38,
- 39,
- 40
- ]
- ]
- },
- {
- "type": "MultiPolygon",
- "arcs": [
- [
- [
- 41
- ]
- ],
- [
- [
- 42
- ]
- ],
- [
- [
- 43
- ]
- ],
- [
- [
- 44
- ]
- ],
- [
- [
- 45
- ]
- ],
- [
- [
- 46
- ]
- ],
- [
- [
- 47
- ]
- ],
- [
- [
- 48
- ]
- ],
- [
- [
- 49
- ]
- ],
- [
- [
- 50
- ]
- ],
- [
- [
- 51
- ]
- ],
- [
- [
- 52,
- -6,
- 53
- ]
- ]
- ]
- },
- {
- "type": "MultiPolygon",
- "arcs": [
- [
- [
- 54
- ]
- ],
- [
- [
- 55,
- -54,
- -5,
- 56,
- 57,
- 58
- ]
- ]
- ]
- },
- {
- "type": "Polygon",
- "arcs": [
- [
- 59,
- 60,
- 61,
- 62,
- 63,
- 64
- ]
- ]
- },
- {
- "type": "Polygon",
- "arcs": [
- [
- 65,
- 66,
- 67,
- 68,
- 69,
- 70,
- 71
- ]
- ]
- },
- {
- "type": "Polygon",
- "arcs": [
- [
- 72,
- 73,
- 74,
- 75,
- -60,
- 76
- ]
- ]
- },
- {
- "type": "Polygon",
- "arcs": [
- [
- 77,
- 78,
- -74,
- 79,
- 80
- ]
- ]
- },
- {
- "type": "Polygon",
- "arcs": [
- [
- 81,
- -27,
- 82,
- 83
- ]
- ]
- },
- {
- "type": "MultiPolygon",
- "arcs": [
- [
- [
- 84,
- 85
- ]
- ],
- [
- [
- 86,
- 87,
- 88,
- 89,
- -75,
- -79,
- 90
- ]
- ]
- ]
- },
- {
- "type": "MultiPolygon",
- "arcs": [
- [
- [
- 91
- ]
- ],
- [
- [
- 92
- ]
- ],
- [
- [
- 93
- ]
- ],
- [
- [
- 94
- ]
- ],
- [
- [
- 95,
- 96,
- -9,
- 97
- ]
- ]
- ]
- },
- {
- "type": "MultiPolygon",
- "arcs": [
- [
- [
- 98
- ]
- ],
- [
- [
- 99
- ]
- ],
- [
- [
- 100,
- -36,
- 101,
- 102,
- 103,
- 104
- ]
- ]
- ]
- },
- {
- "type": "MultiPolygon",
- "arcs": [
- [
- [
- 105,
- 106
- ]
- ],
- [
- [
- -40,
- 107,
- 108,
- 109,
- -38,
- 110,
- 111,
- 112
- ]
- ]
- ]
- },
- {
- "type": "MultiPolygon",
- "arcs": [
- [
- [
- 113
- ]
- ],
- [
- [
- 114
- ]
- ],
- [
- [
- 115,
- 116
- ]
- ]
- ]
- },
- {
- "type": "MultiPolygon",
- "arcs": [
- [
- [
- 117
- ]
- ],
- [
- [
- 118
- ]
- ],
- [
- [
- 119,
- -81,
- 120
- ]
- ],
- [
- [
- 121
- ]
- ],
- [
- [
- 122
- ]
- ],
- [
- [
- 123
- ]
- ],
- [
- [
- 124
- ]
- ],
- [
- [
- 125,
- 126
- ]
- ],
- [
- [
- 127
- ]
- ],
- [
- [
- 128
- ]
- ]
- ]
- },
- {
- "type": "Polygon",
- "arcs": [
- [
- 129,
- -64,
- 130,
- 131,
- 132
- ]
- ]
- },
- {
- "type": "Polygon",
- "arcs": [
- [
- -76,
- -90,
- 133,
- -86,
- 134,
- -12,
- 135,
- -84,
- 136,
- -61
- ]
- ]
- },
- {
- "type": "MultiPolygon",
- "arcs": [
- [
- [
- 137
- ]
- ],
- [
- [
- 138,
- -98,
- -8,
- 139,
- -3
- ]
- ]
- ]
- },
- {
- "type": "Polygon",
- "arcs": [
- [
- 140,
- 141,
- -72,
- 142,
- 143
- ]
- ]
- },
- {
- "type": "MultiPolygon",
- "arcs": [
- [
- [
- 144
- ]
- ],
- [
- [
- 145
- ]
- ],
- [
- [
- 146
- ]
- ],
- [
- [
- 147
- ]
- ],
- [
- [
- 148
- ]
- ],
- [
- [
- 149,
- 150
- ]
- ],
- [
- [
- 151,
- -58,
- 152,
- 153,
- 154
- ]
- ]
- ]
- },
- {
- "type": "Polygon",
- "arcs": [
- [
- 155,
- -144,
- 156,
- -132
- ]
- ]
- },
- {
- "type": "Polygon",
- "arcs": [
- [
- -62,
- -137,
- -83,
- -32,
- 157,
- 158
- ]
- ]
- },
- {
- "type": "Polygon",
- "arcs": [
- [
- 159,
- -104,
- 160,
- 161,
- -116
- ]
- ]
- },
- {
- "type": "MultiPolygon",
- "arcs": [
- [
- [
- 162
- ]
- ],
- [
- [
- 163,
- 164,
- 165
- ]
- ]
- ]
- },
- {
- "type": "Polygon",
- "arcs": [
- [
- 166,
- 167,
- -13,
- -29,
- 168
- ]
- ]
- },
- {
- "type": "Polygon",
- "arcs": [
- [
- -16,
- -25,
- 169,
- -68,
- 170
- ]
- ]
- },
- {
- "type": "MultiPolygon",
- "arcs": [
- [
- [
- 171
- ]
- ],
- [
- [
- 172
- ]
- ],
- [
- [
- 173
- ]
- ],
- [
- [
- 174
- ]
- ],
- [
- [
- 175
- ]
- ],
- [
- [
- 176,
- -102,
- -35,
- 177,
- -165,
- 178,
- 179
- ]
- ]
- ]
- },
- {
- "type": "Polygon",
- "arcs": [
- [
- 180,
- -91,
- -78,
- -120,
- 181,
- 182
- ]
- ]
- },
- {
- "type": "Polygon",
- "arcs": [
- [
- -11,
- 183,
- -169,
- -28,
- -82,
- -136
- ]
- ]
- },
- {
- "type": "Polygon",
- "arcs": [
- [
- 184,
- -69,
- -170,
- -24,
- 185
- ]
- ]
- },
- {
- "type": "Polygon",
- "arcs": [
- [
- -164,
- 186,
- -41,
- -113,
- 187,
- -183,
- 188,
- -179
- ]
- ]
- },
- {
- "type": "MultiPolygon",
- "arcs": [
- [
- [
- 189
- ]
- ],
- [
- [
- 190
- ]
- ],
- [
- [
- 191,
- -33,
- -101
- ]
- ]
- ]
- },
- {
- "type": "Polygon",
- "arcs": [
- [
- 192,
- -59,
- -152
- ]
- ]
- },
- {
- "type": "Polygon",
- "arcs": [
- [
- -131,
- -63,
- -159,
- 193,
- -141,
- -156
- ]
- ]
- },
- {
- "type": "Polygon",
- "arcs": [
- [
- 194,
- -153,
- -57,
- -4,
- -140,
- -7,
- -135,
- -85,
- -134,
- -89
- ]
- ]
- },
- {
- "type": "MultiPolygon",
- "arcs": [
- [
- [
- 195
- ]
- ],
- [
- [
- 196
- ]
- ],
- [
- [
- 197
- ]
- ],
- [
- [
- 198
- ]
- ],
- [
- [
- 199
- ]
- ],
- [
- [
- -10,
- -97,
- 200,
- -167,
- -184
- ]
- ]
- ]
- },
- {
- "type": "Polygon",
- "arcs": [
- [
- 201,
- -30,
- -17,
- -171,
- -67
- ]
- ]
- },
- {
- "type": "MultiPolygon",
- "arcs": [
- [
- [
- -109,
- 202
- ]
- ],
- [
- [
- -106,
- 203
- ]
- ],
- [
- [
- -111,
- -37,
- 204,
- -150,
- 205,
- -154,
- -195,
- -88,
- 206
- ]
- ]
- ]
- },
- {
- "type": "Polygon",
- "arcs": [
- [
- -103,
- -177,
- 207,
- -161
- ]
- ]
- },
- {
- "type": "MultiPolygon",
- "arcs": [
- [
- [
- 208
- ]
- ],
- [
- [
- 209
- ]
- ],
- [
- [
- 210
- ]
- ],
- [
- [
- 211
- ]
- ],
- [
- [
- 212
- ]
- ],
- [
- [
- 213
- ]
- ],
- [
- [
- 214
- ]
- ],
- [
- [
- 215
- ]
- ],
- [
- [
- -185,
- 216,
- -70
- ]
- ]
- ]
- },
- {
- "type": "MultiPolygon",
- "arcs": [
- [
- [
- 217
- ]
- ],
- [
- [
- 218
- ]
- ],
- [
- [
- 219
- ]
- ],
- [
- [
- 220
- ]
- ],
- [
- [
- -126,
- 221,
- -77,
- -65,
- -130,
- 222
- ]
- ],
- [
- [
- 223
- ]
- ],
- [
- [
- 224
- ]
- ]
- ]
- },
- {
- "type": "Polygon",
- "arcs": [
- [
- -112,
- -207,
- -87,
- -181,
- -188
- ]
- ]
- },
- {
- "type": "Polygon",
- "arcs": [
- [
- -158,
- -31,
- -202,
- -66,
- -142,
- -194
- ]
- ]
- }
- ]
- }
- },
- "arcs": [
- [
- [
- 6347,
- 2300
- ],
- [
- -16,
- -9
- ],
- [
- -22,
- 1
- ],
- [
- -5,
- 3
- ],
- [
- 9,
- 6
- ],
- [
- 27,
- 7
- ],
- [
- 7,
- -8
- ]
- ],
- [
- [
- 6447,
- 2350
- ],
- [
- -4,
- -4
- ],
- [
- -19,
- -41
- ],
- [
- -66,
- -14
- ],
- [
- 4,
- 9
- ],
- [
- 14,
- 2
- ],
- [
- 19,
- 14
- ],
- [
- -4,
- 22
- ],
- [
- -7,
- 24
- ],
- [
- -7,
- 3
- ],
- [
- -5,
- 14
- ],
- [
- 0,
- 45
- ],
- [
- -4,
- 27
- ],
- [
- -11,
- 27
- ],
- [
- -4,
- -6
- ],
- [
- -8,
- -46
- ],
- [
- -6,
- -61
- ],
- [
- -3,
- -19
- ],
- [
- -20,
- -2
- ],
- [
- -18,
- 4
- ],
- [
- -8,
- -1
- ]
- ],
- [
- [
- 6290,
- 2347
- ],
- [
- -2,
- 83
- ],
- [
- -2,
- 76
- ],
- [
- -2,
- 75
- ],
- [
- -2,
- 76
- ],
- [
- -2,
- 76
- ],
- [
- -2,
- 75
- ],
- [
- -1,
- 76
- ],
- [
- -2,
- 75
- ],
- [
- 4,
- 75
- ],
- [
- 4,
- 74
- ],
- [
- 5,
- 75
- ],
- [
- 4,
- 74
- ],
- [
- 4,
- 74
- ],
- [
- 4,
- 75
- ],
- [
- 4,
- 74
- ],
- [
- 5,
- 75
- ],
- [
- 4,
- 74
- ],
- [
- 4,
- 74
- ],
- [
- 4,
- 75
- ],
- [
- 5,
- 74
- ],
- [
- 4,
- 75
- ],
- [
- 4,
- 74
- ],
- [
- 4,
- 74
- ],
- [
- 4,
- 75
- ],
- [
- 2,
- 19
- ],
- [
- 0,
- 6
- ],
- [
- 0,
- 10
- ],
- [
- -15,
- 26
- ]
- ],
- [
- [
- 6329,
- 4211
- ],
- [
- -3,
- 6
- ],
- [
- -2,
- 4
- ],
- [
- 2,
- 1
- ],
- [
- 28,
- -1
- ],
- [
- 28,
- 0
- ],
- [
- 27,
- -1
- ],
- [
- 28,
- -1
- ],
- [
- 28,
- 0
- ],
- [
- 28,
- -1
- ],
- [
- 28,
- 0
- ],
- [
- 27,
- -1
- ],
- [
- 28,
- -1
- ],
- [
- 28,
- 0
- ],
- [
- 28,
- -1
- ],
- [
- 28,
- 0
- ],
- [
- 27,
- -1
- ],
- [
- 28,
- -1
- ],
- [
- 28,
- 0
- ],
- [
- 28,
- -1
- ]
- ],
- [
- [
- 6771,
- 4212
- ],
- [
- 4,
- -51
- ],
- [
- 5,
- -52
- ],
- [
- 4,
- -51
- ],
- [
- 5,
- -52
- ],
- [
- 5,
- -51
- ],
- [
- 4,
- -52
- ],
- [
- 5,
- -51
- ],
- [
- 4,
- -52
- ],
- [
- 5,
- -51
- ],
- [
- 4,
- -52
- ],
- [
- 5,
- -51
- ],
- [
- 5,
- -52
- ],
- [
- 4,
- -51
- ],
- [
- 5,
- -51
- ],
- [
- 4,
- -52
- ],
- [
- 5,
- -51
- ],
- [
- 4,
- -24
- ],
- [
- 4,
- -38
- ],
- [
- 24,
- -112
- ],
- [
- 7,
- -47
- ],
- [
- -2,
- -19
- ],
- [
- 3,
- -17
- ],
- [
- 8,
- -13
- ],
- [
- -1,
- -16
- ],
- [
- -11,
- -18
- ],
- [
- -7,
- -22
- ],
- [
- -5,
- -39
- ],
- [
- -11,
- -69
- ],
- [
- 0,
- -41
- ],
- [
- 10,
- -57
- ],
- [
- 2,
- -26
- ],
- [
- -6,
- -111
- ],
- [
- 4,
- -72
- ],
- [
- 10,
- -47
- ]
- ],
- [
- [
- 6877,
- 2601
- ],
- [
- -55,
- 0
- ],
- [
- -56,
- 0
- ],
- [
- -56,
- 0
- ],
- [
- -56,
- 0
- ],
- [
- -57,
- 0
- ],
- [
- -56,
- 0
- ],
- [
- -56,
- 0
- ],
- [
- -56,
- 0
- ],
- [
- -2,
- -29
- ],
- [
- 1,
- -27
- ],
- [
- 6,
- -27
- ],
- [
- 25,
- -49
- ],
- [
- 3,
- -13
- ],
- [
- -5,
- -38
- ],
- [
- 1,
- -28
- ],
- [
- -3,
- -14
- ],
- [
- -6,
- -12
- ],
- [
- -2,
- -14
- ]
- ],
- [
- [
- 6064,
- 4615
- ],
- [
- -1,
- -7
- ],
- [
- 3,
- -16
- ],
- [
- 0,
- -9
- ],
- [
- -2,
- -6
- ],
- [
- -6,
- -3
- ],
- [
- -4,
- -4
- ],
- [
- -1,
- -7
- ],
- [
- -1,
- -3
- ],
- [
- 1,
- -8
- ],
- [
- 1,
- -7
- ],
- [
- -3,
- -9
- ],
- [
- -20,
- -22
- ],
- [
- -9,
- -29
- ],
- [
- 3,
- -35
- ],
- [
- -7,
- -36
- ],
- [
- -17,
- -35
- ],
- [
- -7,
- -41
- ],
- [
- 3,
- -44
- ],
- [
- -9,
- -36
- ],
- [
- -20,
- -28
- ],
- [
- -6,
- -16
- ],
- [
- 0,
- -2
- ]
- ],
- [
- [
- 5962,
- 4212
- ],
- [
- 0,
- -12
- ],
- [
- 2,
- -10
- ],
- [
- -7,
- -19
- ],
- [
- -16,
- -19
- ],
- [
- -9,
- -19
- ],
- [
- -2,
- -18
- ],
- [
- -4,
- -9
- ],
- [
- -7,
- -4
- ],
- [
- -4,
- -27
- ],
- [
- -4,
- -63
- ],
- [
- -8,
- -36
- ],
- [
- -15,
- -9
- ],
- [
- -7,
- -14
- ],
- [
- -1,
- -20
- ],
- [
- -9,
- -22
- ],
- [
- -16,
- -26
- ],
- [
- -5,
- -24
- ],
- [
- 5,
- -23
- ],
- [
- -1,
- -9
- ],
- [
- -5,
- -8
- ],
- [
- -17,
- -11
- ],
- [
- -3,
- -5
- ],
- [
- -2,
- -6
- ],
- [
- 4,
- -12
- ],
- [
- 2,
- -18
- ],
- [
- -3,
- -29
- ],
- [
- -4,
- -13
- ],
- [
- -4,
- -12
- ],
- [
- -15,
- -21
- ],
- [
- -4,
- -16
- ],
- [
- 7,
- -11
- ],
- [
- -1,
- -12
- ],
- [
- -7,
- -14
- ],
- [
- 2,
- -14
- ],
- [
- 2,
- -10
- ],
- [
- 7,
- -9
- ],
- [
- 2,
- -25
- ],
- [
- -5,
- -32
- ],
- [
- 1,
- -26
- ],
- [
- 8,
- -22
- ],
- [
- 2,
- -9
- ],
- [
- -8,
- -71
- ],
- [
- 0,
- -10
- ]
- ],
- [
- [
- 5813,
- 3413
- ],
- [
- -34,
- -1
- ],
- [
- -31,
- 0
- ],
- [
- -31,
- 0
- ],
- [
- -31,
- 0
- ],
- [
- -31,
- 0
- ],
- [
- -31,
- 0
- ],
- [
- -31,
- 0
- ],
- [
- -31,
- 0
- ],
- [
- -32,
- 0
- ],
- [
- -31,
- 0
- ],
- [
- -31,
- 0
- ],
- [
- -31,
- -1
- ],
- [
- -31,
- 0
- ],
- [
- -31,
- 0
- ],
- [
- -31,
- 0
- ],
- [
- -31,
- 0
- ]
- ],
- [
- [
- 5313,
- 3411
- ],
- [
- -1,
- 55
- ],
- [
- 0,
- 54
- ],
- [
- 0,
- 55
- ],
- [
- 0,
- 55
- ],
- [
- -9,
- 9
- ],
- [
- -16,
- 4
- ],
- [
- -9,
- -3
- ],
- [
- -9,
- 3
- ],
- [
- -7,
- -9
- ],
- [
- -4,
- -2
- ],
- [
- -4,
- 2
- ],
- [
- -2,
- 8
- ],
- [
- -7,
- 6
- ],
- [
- -9,
- 19
- ]
- ],
- [
- [
- 5236,
- 3667
- ],
- [
- 0,
- 44
- ],
- [
- 1,
- 44
- ],
- [
- 0,
- 44
- ],
- [
- 1,
- 43
- ],
- [
- 0,
- 44
- ],
- [
- 1,
- 44
- ],
- [
- 0,
- 44
- ],
- [
- 1,
- 44
- ],
- [
- 0,
- 43
- ],
- [
- 1,
- 44
- ],
- [
- 0,
- 44
- ],
- [
- 1,
- 44
- ],
- [
- 0,
- 43
- ],
- [
- 1,
- 44
- ],
- [
- 0,
- 44
- ],
- [
- 1,
- 44
- ],
- [
- -4,
- 56
- ],
- [
- -4,
- 56
- ],
- [
- -4,
- 56
- ],
- [
- -4,
- 56
- ],
- [
- -4,
- 56
- ],
- [
- -4,
- 56
- ],
- [
- -4,
- 56
- ],
- [
- -3,
- 56
- ]
- ],
- [
- [
- 5213,
- 4816
- ],
- [
- 48,
- 0
- ],
- [
- 48,
- 0
- ],
- [
- 48,
- 0
- ],
- [
- 49,
- 0
- ],
- [
- 48,
- 0
- ],
- [
- 48,
- 0
- ],
- [
- 48,
- 0
- ],
- [
- 49,
- 0
- ],
- [
- 48,
- 0
- ],
- [
- 48,
- 0
- ],
- [
- 48,
- 0
- ],
- [
- 49,
- 0
- ],
- [
- 48,
- 0
- ],
- [
- 48,
- 0
- ],
- [
- 48,
- 0
- ],
- [
- 49,
- 0
- ],
- [
- 7,
- -31
- ],
- [
- 8,
- -21
- ],
- [
- 1,
- -15
- ],
- [
- -2,
- -15
- ],
- [
- -12,
- -33
- ],
- [
- -12,
- -15
- ],
- [
- -6,
- -16
- ],
- [
- -9,
- -15
- ],
- [
- -13,
- -43
- ],
- [
- 28,
- 0
- ],
- [
- 29,
- 1
- ],
- [
- 28,
- 1
- ],
- [
- 32,
- 1
- ]
- ],
- [
- [
- 2713,
- 5018
- ],
- [
- 0,
- -143
- ],
- [
- 0,
- -143
- ],
- [
- 0,
- -143
- ],
- [
- 0,
- -143
- ],
- [
- 0,
- -142
- ],
- [
- 0,
- -143
- ],
- [
- 0,
- -143
- ],
- [
- 0,
- -143
- ],
- [
- 0,
- -142
- ],
- [
- 0,
- -143
- ],
- [
- 0,
- -143
- ],
- [
- 0,
- -143
- ],
- [
- 0,
- -143
- ],
- [
- 0,
- -142
- ],
- [
- 0,
- -143
- ],
- [
- 0,
- -143
- ]
- ],
- [
- [
- 2713,
- 2733
- ],
- [
- -39,
- 0
- ],
- [
- -61,
- -1
- ],
- [
- -62,
- 0
- ],
- [
- -61,
- 0
- ],
- [
- -61,
- 0
- ],
- [
- -61,
- -1
- ],
- [
- -83,
- 60
- ],
- [
- -82,
- 60
- ],
- [
- -82,
- 59
- ],
- [
- -82,
- 60
- ],
- [
- -82,
- 59
- ],
- [
- -82,
- 60
- ],
- [
- -82,
- 60
- ],
- [
- -83,
- 59
- ],
- [
- 9,
- 23
- ],
- [
- 11,
- 61
- ]
- ],
- [
- [
- 1730,
- 3292
- ],
- [
- 0,
- 3
- ],
- [
- 24,
- 4
- ],
- [
- 12,
- 16
- ],
- [
- 7,
- 28
- ],
- [
- 1,
- 28
- ],
- [
- -4,
- 29
- ],
- [
- -10,
- 21
- ],
- [
- -17,
- 14
- ],
- [
- -10,
- 40
- ],
- [
- -2,
- 65
- ],
- [
- 3,
- 35
- ],
- [
- 8,
- 5
- ],
- [
- 9,
- 16
- ],
- [
- 8,
- 26
- ],
- [
- 6,
- 29
- ],
- [
- 4,
- 31
- ],
- [
- 0,
- 40
- ],
- [
- -2,
- 48
- ],
- [
- 16,
- 60
- ],
- [
- 15,
- 36
- ],
- [
- 29,
- 45
- ],
- [
- 6,
- 13
- ],
- [
- 1,
- 11
- ],
- [
- 0,
- 2
- ],
- [
- -6,
- 15
- ],
- [
- -26,
- 31
- ],
- [
- -11,
- 23
- ],
- [
- -1,
- 20
- ],
- [
- 0,
- 1
- ],
- [
- -4,
- 19
- ],
- [
- -27,
- 83
- ],
- [
- -10,
- 45
- ],
- [
- 0,
- 34
- ]
- ],
- [
- [
- 1749,
- 4208
- ],
- [
- 0,
- 3
- ],
- [
- 4,
- 143
- ],
- [
- -10,
- 49
- ],
- [
- -2,
- 28
- ],
- [
- 2,
- 35
- ],
- [
- 0,
- 21
- ],
- [
- -5,
- 19
- ],
- [
- -1,
- 33
- ],
- [
- -1,
- 42
- ],
- [
- -8,
- 27
- ],
- [
- -1,
- 12
- ],
- [
- 4,
- 29
- ],
- [
- 8,
- 15
- ],
- [
- 14,
- 10
- ],
- [
- 15,
- 3
- ],
- [
- 17,
- -3
- ],
- [
- 13,
- -13
- ],
- [
- 8,
- -22
- ],
- [
- 9,
- -12
- ],
- [
- 8,
- 0
- ],
- [
- 12,
- 18
- ],
- [
- 10,
- 40
- ],
- [
- 3,
- 3
- ],
- [
- 0,
- 173
- ],
- [
- 0,
- 158
- ]
- ],
- [
- [
- 1848,
- 5019
- ],
- [
- 54,
- 0
- ],
- [
- 54,
- 0
- ],
- [
- 54,
- 0
- ],
- [
- 55,
- 0
- ],
- [
- 54,
- -1
- ],
- [
- 54,
- 0
- ],
- [
- 54,
- 0
- ],
- [
- 54,
- 0
- ],
- [
- 54,
- 0
- ],
- [
- 54,
- 0
- ],
- [
- 54,
- 0
- ],
- [
- 54,
- 0
- ],
- [
- 54,
- 0
- ],
- [
- 54,
- 0
- ],
- [
- 54,
- 0
- ],
- [
- 54,
- 0
- ]
- ],
- [
- [
- 1102,
- 3337
- ],
- [
- -10,
- -4
- ],
- [
- -12,
- 8
- ],
- [
- -9,
- 39
- ],
- [
- -11,
- 31
- ],
- [
- 6,
- 8
- ],
- [
- 8,
- -29
- ],
- [
- 22,
- -44
- ],
- [
- 6,
- -9
- ]
- ],
- [
- [
- 913,
- 3494
- ],
- [
- -7,
- -1
- ],
- [
- -11,
- 4
- ],
- [
- -6,
- 21
- ],
- [
- 9,
- 2
- ],
- [
- 8,
- -3
- ],
- [
- 7,
- -17
- ],
- [
- 0,
- -6
- ]
- ],
- [
- [
- 1102,
- 3562
- ],
- [
- 9,
- -30
- ],
- [
- -13,
- 4
- ],
- [
- -13,
- -2
- ],
- [
- -4,
- 16
- ],
- [
- -4,
- 23
- ],
- [
- -3,
- 5
- ],
- [
- -9,
- 2
- ],
- [
- 0,
- 2
- ],
- [
- -1,
- 11
- ],
- [
- 2,
- 5
- ],
- [
- 28,
- -25
- ],
- [
- 8,
- -11
- ]
- ],
- [
- [
- 808,
- 3776
- ],
- [
- -12,
- -5
- ],
- [
- -9,
- 5
- ],
- [
- -15,
- 39
- ],
- [
- 31,
- 5
- ],
- [
- 14,
- -17
- ],
- [
- 2,
- -5
- ],
- [
- -11,
- -22
- ]
- ],
- [
- [
- 763,
- 3819
- ],
- [
- -9,
- -1
- ],
- [
- -15,
- 4
- ],
- [
- 5,
- 10
- ],
- [
- 8,
- 7
- ],
- [
- 3,
- -6
- ],
- [
- 8,
- -14
- ]
- ],
- [
- [
- 836,
- 3841
- ],
- [
- 36,
- -21
- ],
- [
- 19,
- 10
- ],
- [
- 3,
- -10
- ],
- [
- -2,
- -8
- ],
- [
- -43,
- -16
- ],
- [
- -13,
- 11
- ],
- [
- -1,
- 15
- ],
- [
- -5,
- 14
- ],
- [
- 6,
- 5
- ]
- ],
- [
- [
- 83,
- 7031
- ],
- [
- 48,
- 0
- ],
- [
- 45,
- 0
- ],
- [
- 46,
- 0
- ],
- [
- 46,
- 0
- ],
- [
- 45,
- 0
- ],
- [
- 46,
- 0
- ],
- [
- 46,
- 0
- ],
- [
- 45,
- 0
- ],
- [
- 46,
- 0
- ],
- [
- 46,
- 0
- ],
- [
- 45,
- 0
- ],
- [
- 46,
- 0
- ],
- [
- 46,
- 0
- ],
- [
- 45,
- 0
- ],
- [
- 46,
- 0
- ],
- [
- 46,
- 0
- ]
- ],
- [
- [
- 816,
- 7031
- ],
- [
- 0,
- -75
- ],
- [
- 0,
- -76
- ],
- [
- 0,
- -75
- ],
- [
- 0,
- -76
- ],
- [
- 0,
- -75
- ],
- [
- 0,
- -76
- ],
- [
- 0,
- -75
- ],
- [
- 0,
- -76
- ],
- [
- 0,
- -76
- ],
- [
- 0,
- -75
- ],
- [
- 0,
- -76
- ],
- [
- 0,
- -75
- ],
- [
- 0,
- -76
- ],
- [
- 0,
- -75
- ],
- [
- 0,
- -76
- ],
- [
- 0,
- -75
- ],
- [
- 40,
- -66
- ],
- [
- 41,
- -66
- ],
- [
- 41,
- -66
- ],
- [
- 40,
- -66
- ],
- [
- 41,
- -65
- ],
- [
- 40,
- -66
- ],
- [
- 41,
- -66
- ],
- [
- 40,
- -66
- ],
- [
- 32,
- -55
- ],
- [
- 32,
- -56
- ],
- [
- 32,
- -55
- ],
- [
- 31,
- -56
- ],
- [
- 32,
- -55
- ],
- [
- 32,
- -56
- ],
- [
- 32,
- -55
- ],
- [
- 32,
- -56
- ],
- [
- 44,
- -80
- ],
- [
- 43,
- -80
- ],
- [
- 44,
- -79
- ],
- [
- 44,
- -80
- ],
- [
- 44,
- -80
- ],
- [
- 44,
- -80
- ],
- [
- 44,
- -80
- ],
- [
- 47,
- -85
- ]
- ],
- [
- [
- 1730,
- 3292
- ],
- [
- -20,
- -5
- ],
- [
- -50,
- -8
- ],
- [
- -49,
- -9
- ],
- [
- -50,
- -9
- ],
- [
- -49,
- -8
- ],
- [
- -50,
- -9
- ],
- [
- -50,
- -8
- ],
- [
- -49,
- -9
- ],
- [
- -50,
- -9
- ],
- [
- 0,
- 3
- ],
- [
- -1,
- 44
- ],
- [
- -8,
- 16
- ],
- [
- -11,
- -10
- ],
- [
- -4,
- 57
- ],
- [
- 2,
- 27
- ],
- [
- -1,
- 27
- ],
- [
- -10,
- 65
- ],
- [
- -25,
- 78
- ],
- [
- -56,
- 98
- ],
- [
- -28,
- 33
- ],
- [
- -23,
- 41
- ],
- [
- -14,
- 12
- ],
- [
- -17,
- 3
- ],
- [
- -6,
- -19
- ],
- [
- -20,
- 13
- ],
- [
- 3,
- 46
- ],
- [
- -19,
- 64
- ],
- [
- -16,
- 7
- ],
- [
- -41,
- -4
- ],
- [
- -54,
- 35
- ],
- [
- -16,
- 21
- ],
- [
- -5,
- 38
- ],
- [
- -26,
- 32
- ],
- [
- -33,
- 32
- ],
- [
- -18,
- -7
- ],
- [
- -25,
- 5
- ],
- [
- -34,
- 23
- ],
- [
- -20,
- 3
- ],
- [
- -40,
- -7
- ],
- [
- -14,
- 5
- ],
- [
- -14,
- 29
- ],
- [
- -15,
- 15
- ],
- [
- 3,
- 35
- ],
- [
- -2,
- 33
- ],
- [
- 3,
- 25
- ],
- [
- -7,
- 55
- ],
- [
- 5,
- 52
- ],
- [
- -4,
- 18
- ],
- [
- -9,
- 14
- ],
- [
- -26,
- 21
- ],
- [
- -4,
- 26
- ],
- [
- 4,
- 37
- ],
- [
- -7,
- 24
- ],
- [
- -21,
- 22
- ],
- [
- -20,
- 51
- ],
- [
- -26,
- 28
- ],
- [
- -10,
- 47
- ],
- [
- -15,
- 29
- ],
- [
- -6,
- 25
- ],
- [
- -34,
- 92
- ],
- [
- -37,
- 71
- ],
- [
- -6,
- 41
- ],
- [
- -1,
- 56
- ],
- [
- 14,
- 34
- ],
- [
- 8,
- 30
- ],
- [
- -1,
- 28
- ],
- [
- -2,
- 20
- ],
- [
- -13,
- 36
- ],
- [
- -49,
- 21
- ],
- [
- -40,
- 87
- ],
- [
- -2,
- 67
- ],
- [
- -16,
- 68
- ],
- [
- 0,
- 44
- ],
- [
- -3,
- 48
- ],
- [
- 12,
- 11
- ],
- [
- 11,
- -4
- ],
- [
- -1,
- -19
- ],
- [
- 3,
- -35
- ],
- [
- 13,
- -25
- ],
- [
- 12,
- -12
- ],
- [
- 11,
- -25
- ],
- [
- 8,
- -7
- ],
- [
- 8,
- -2
- ],
- [
- -4,
- 16
- ],
- [
- -5,
- 10
- ],
- [
- -6,
- 34
- ],
- [
- -11,
- 42
- ],
- [
- -13,
- 24
- ],
- [
- -6,
- 42
- ],
- [
- -6,
- 10
- ],
- [
- -3,
- 16
- ],
- [
- 12,
- 19
- ],
- [
- 17,
- 13
- ],
- [
- 22,
- 4
- ],
- [
- 64,
- -6
- ],
- [
- 14,
- 11
- ],
- [
- 11,
- -4
- ],
- [
- 9,
- 1
- ],
- [
- -18,
- 12
- ],
- [
- -10,
- -4
- ],
- [
- -11,
- 2
- ],
- [
- -23,
- -2
- ],
- [
- -9,
- 5
- ],
- [
- -10,
- 13
- ],
- [
- -7,
- 2
- ],
- [
- -21,
- -24
- ],
- [
- -10,
- 3
- ],
- [
- -22,
- 26
- ],
- [
- -10,
- 3
- ],
- [
- -15,
- -14
- ],
- [
- -2,
- -63
- ],
- [
- 5,
- -46
- ],
- [
- -10,
- -5
- ],
- [
- -11,
- 19
- ],
- [
- -16,
- 12
- ],
- [
- -14,
- 17
- ],
- [
- -20,
- 32
- ],
- [
- -10,
- 12
- ],
- [
- -12,
- -27
- ],
- [
- 0,
- 13
- ],
- [
- 6,
- 31
- ],
- [
- -2,
- 53
- ],
- [
- 18,
- -42
- ],
- [
- -6,
- 29
- ],
- [
- -13,
- 33
- ],
- [
- -11,
- 11
- ],
- [
- -13,
- 58
- ],
- [
- -29,
- 35
- ],
- [
- -23,
- 56
- ],
- [
- -48,
- 93
- ],
- [
- -3,
- 82
- ],
- [
- -18,
- 104
- ],
- [
- 7,
- 59
- ],
- [
- -1,
- 42
- ],
- [
- -8,
- 63
- ],
- [
- -9,
- 34
- ],
- [
- -39,
- 95
- ],
- [
- -37,
- 63
- ],
- [
- -6,
- 48
- ],
- [
- -2,
- 48
- ],
- [
- 8,
- 43
- ],
- [
- 7,
- 46
- ],
- [
- 5,
- 12
- ],
- [
- 2,
- -5
- ],
- [
- -1,
- -10
- ],
- [
- 5,
- -3
- ],
- [
- 2,
- 20
- ],
- [
- 3,
- 10
- ],
- [
- -6,
- 2
- ],
- [
- 1,
- 6
- ],
- [
- 3,
- 13
- ],
- [
- 12,
- 59
- ],
- [
- -1,
- 75
- ],
- [
- 12,
- 92
- ],
- [
- 0,
- 30
- ],
- [
- -8,
- 66
- ],
- [
- -8,
- 39
- ],
- [
- -14,
- 28
- ],
- [
- 6,
- 40
- ],
- [
- -1,
- 39
- ],
- [
- -3,
- 6
- ]
- ],
- [
- [
- 3930,
- 6226
- ],
- [
- 0,
- -76
- ],
- [
- 0,
- -75
- ],
- [
- 0,
- -76
- ],
- [
- 0,
- -75
- ],
- [
- 0,
- -76
- ],
- [
- 0,
- -75
- ],
- [
- 1,
- -76
- ],
- [
- 0,
- -75
- ],
- [
- 0,
- -76
- ],
- [
- 0,
- -75
- ],
- [
- 0,
- -76
- ],
- [
- 0,
- -75
- ],
- [
- 0,
- -76
- ],
- [
- 0,
- -75
- ],
- [
- 1,
- -76
- ],
- [
- 0,
- -75
- ]
- ],
- [
- [
- 3932,
- 5018
- ],
- [
- -43,
- 0
- ],
- [
- -43,
- 0
- ],
- [
- -43,
- 0
- ],
- [
- -42,
- 0
- ]
- ],
- [
- [
- 3761,
- 5018
- ],
- [
- -66,
- 0
- ],
- [
- -65,
- 0
- ],
- [
- -66,
- 0
- ],
- [
- -65,
- 0
- ],
- [
- -66,
- 0
- ],
- [
- -65,
- 0
- ],
- [
- -66,
- 0
- ],
- [
- -65,
- 0
- ],
- [
- -66,
- 0
- ],
- [
- -65,
- 0
- ],
- [
- -65,
- 0
- ],
- [
- -66,
- 0
- ],
- [
- -65,
- 0
- ],
- [
- -66,
- 0
- ],
- [
- -65,
- 0
- ],
- [
- -66,
- 0
- ]
- ],
- [
- [
- 2713,
- 5018
- ],
- [
- 0,
- 100
- ],
- [
- 0,
- 101
- ],
- [
- 0,
- 101
- ],
- [
- 0,
- 100
- ],
- [
- 0,
- 101
- ],
- [
- 0,
- 101
- ],
- [
- 0,
- 100
- ],
- [
- 0,
- 101
- ],
- [
- 0,
- 101
- ],
- [
- 0,
- 100
- ],
- [
- 0,
- 101
- ],
- [
- 0,
- 101
- ],
- [
- 0,
- 100
- ],
- [
- 0,
- 101
- ],
- [
- 0,
- 101
- ],
- [
- 0,
- 101
- ]
- ],
- [
- [
- 2713,
- 6629
- ],
- [
- 55,
- 0
- ],
- [
- 54,
- 0
- ],
- [
- 55,
- 0
- ],
- [
- 54,
- 0
- ],
- [
- 54,
- 0
- ],
- [
- 55,
- 0
- ],
- [
- 54,
- 0
- ],
- [
- 55,
- 0
- ],
- [
- 54,
- 0
- ],
- [
- 54,
- 0
- ],
- [
- 55,
- 0
- ],
- [
- 54,
- 0
- ],
- [
- 55,
- 0
- ],
- [
- 54,
- 0
- ],
- [
- 54,
- 0
- ],
- [
- 55,
- 0
- ]
- ],
- [
- [
- 3584,
- 6629
- ],
- [
- 43,
- 0
- ],
- [
- 43,
- 0
- ],
- [
- 43,
- 0
- ],
- [
- 44,
- -1
- ],
- [
- 43,
- 0
- ],
- [
- 43,
- 0
- ],
- [
- 43,
- 0
- ],
- [
- 44,
- 0
- ],
- [
- 0,
- -50
- ],
- [
- 0,
- -50
- ],
- [
- 0,
- -51
- ],
- [
- 0,
- -50
- ],
- [
- 0,
- -50
- ],
- [
- 0,
- -50
- ],
- [
- 0,
- -51
- ],
- [
- 0,
- -50
- ]
- ],
- [
- [
- 9165,
- 7036
- ],
- [
- 0,
- -22
- ],
- [
- 0,
- -30
- ],
- [
- 0,
- -22
- ],
- [
- 1,
- -31
- ],
- [
- 0,
- -34
- ],
- [
- 0,
- -32
- ],
- [
- 0,
- -27
- ],
- [
- -1,
- -17
- ],
- [
- -1,
- -25
- ],
- [
- -4,
- -10
- ],
- [
- -2,
- -23
- ]
- ],
- [
- [
- 9158,
- 6763
- ],
- [
- -15,
- 3
- ],
- [
- -25,
- -6
- ],
- [
- -33,
- -14
- ],
- [
- -19,
- 8
- ],
- [
- -18,
- -15
- ],
- [
- -64,
- -4
- ],
- [
- -14,
- 8
- ],
- [
- -17,
- -28
- ],
- [
- -27,
- -16
- ],
- [
- -70,
- -62
- ],
- [
- -8,
- -12
- ]
- ],
- [
- [
- 8848,
- 6625
- ],
- [
- -9,
- 25
- ],
- [
- -7,
- 20
- ],
- [
- 14,
- 16
- ],
- [
- 11,
- 12
- ],
- [
- 10,
- 11
- ],
- [
- 7,
- 7
- ],
- [
- -6,
- 16
- ],
- [
- -5,
- 15
- ],
- [
- 1,
- 39
- ],
- [
- 2,
- 38
- ],
- [
- 1,
- 38
- ],
- [
- 2,
- 38
- ],
- [
- 1,
- 39
- ],
- [
- 1,
- 38
- ],
- [
- 2,
- 38
- ],
- [
- 1,
- 38
- ]
- ],
- [
- [
- 8874,
- 7053
- ],
- [
- 15,
- -1
- ],
- [
- 14,
- -1
- ],
- [
- 15,
- -1
- ],
- [
- 14,
- -1
- ],
- [
- 15,
- -1
- ],
- [
- 15,
- -1
- ],
- [
- 14,
- -1
- ],
- [
- 15,
- -1
- ],
- [
- 0,
- -11
- ],
- [
- 7,
- 1
- ],
- [
- 1,
- 10
- ],
- [
- 21,
- -1
- ],
- [
- 21,
- 0
- ],
- [
- 20,
- -1
- ],
- [
- 21,
- -1
- ],
- [
- 21,
- 0
- ],
- [
- 21,
- -1
- ],
- [
- 20,
- 0
- ],
- [
- 21,
- -1
- ],
- [
- 0,
- -4
- ]
- ],
- [
- [
- 8259,
- 5778
- ],
- [
- -4,
- 11
- ],
- [
- -8,
- 8
- ],
- [
- -4,
- 3
- ]
- ],
- [
- [
- 8243,
- 5800
- ],
- [
- 14,
- 27
- ],
- [
- 9,
- -23
- ],
- [
- 10,
- -26
- ],
- [
- -15,
- -33
- ],
- [
- -2,
- 33
- ]
- ],
- [
- [
- 8538,
- 6151
- ],
- [
- -7,
- -14
- ],
- [
- -7,
- -25
- ],
- [
- -15,
- -31
- ],
- [
- 1,
- -21
- ],
- [
- 3,
- -15
- ],
- [
- -1,
- -30
- ],
- [
- 9,
- -30
- ],
- [
- 18,
- -49
- ],
- [
- 4,
- -76
- ],
- [
- 14,
- -51
- ],
- [
- 22,
- -59
- ],
- [
- 17,
- -17
- ],
- [
- 0,
- -22
- ],
- [
- -7,
- -36
- ],
- [
- -10,
- -17
- ],
- [
- 13,
- 3
- ],
- [
- 6,
- -8
- ],
- [
- 7,
- -30
- ],
- [
- -1,
- -20
- ]
- ],
- [
- [
- 8604,
- 5603
- ],
- [
- -18,
- 0
- ],
- [
- -38,
- 0
- ],
- [
- -39,
- 0
- ],
- [
- -17,
- 0
- ],
- [
- -1,
- 0
- ],
- [
- -1,
- 0
- ],
- [
- -1,
- 0
- ],
- [
- -1,
- 0
- ],
- [
- -1,
- 64
- ],
- [
- -2,
- 64
- ],
- [
- -2,
- 64
- ],
- [
- -1,
- 63
- ],
- [
- -2,
- 64
- ],
- [
- -2,
- 64
- ],
- [
- -1,
- 64
- ],
- [
- -2,
- 64
- ]
- ],
- [
- [
- 8475,
- 6114
- ],
- [
- 13,
- 32
- ],
- [
- 6,
- 10
- ],
- [
- 7,
- 5
- ],
- [
- 22,
- 1
- ],
- [
- 15,
- -11
- ]
- ],
- [
- [
- 7436,
- 1
- ],
- [
- -5,
- -1
- ],
- [
- 0,
- 6
- ],
- [
- 8,
- 8
- ],
- [
- 5,
- -1
- ],
- [
- -1,
- -8
- ],
- [
- -7,
- -4
- ]
- ],
- [
- [
- 7473,
- 23
- ],
- [
- -11,
- -4
- ],
- [
- 9,
- 16
- ],
- [
- 3,
- 24
- ],
- [
- 6,
- -19
- ],
- [
- -1,
- -11
- ],
- [
- -6,
- -6
- ]
- ],
- [
- [
- 7514,
- 44
- ],
- [
- -6,
- -9
- ],
- [
- -2,
- 3
- ],
- [
- 0,
- 12
- ],
- [
- -7,
- 27
- ],
- [
- 0,
- 7
- ],
- [
- 17,
- -27
- ],
- [
- 0,
- -7
- ],
- [
- -2,
- -6
- ]
- ],
- [
- [
- 7564,
- 70
- ],
- [
- -8,
- -9
- ],
- [
- -8,
- 7
- ],
- [
- 9,
- 9
- ],
- [
- 27,
- 10
- ],
- [
- -10,
- -12
- ],
- [
- -10,
- -5
- ]
- ],
- [
- [
- 7601,
- 105
- ],
- [
- -3,
- 0
- ],
- [
- 2,
- 6
- ],
- [
- 6,
- 11
- ],
- [
- 3,
- -4
- ],
- [
- 0,
- -6
- ],
- [
- -8,
- -7
- ]
- ],
- [
- [
- 7634,
- 145
- ],
- [
- -4,
- -2
- ],
- [
- 6,
- 18
- ],
- [
- 2,
- -2
- ],
- [
- -4,
- -14
- ]
- ],
- [
- [
- 7679,
- 242
- ],
- [
- -35,
- -76
- ],
- [
- 4,
- 19
- ],
- [
- 14,
- 40
- ],
- [
- 4,
- 19
- ],
- [
- 9,
- 13
- ],
- [
- 8,
- 21
- ],
- [
- 1,
- 26
- ],
- [
- 12,
- 18
- ],
- [
- 4,
- 2
- ],
- [
- -21,
- -82
- ]
- ],
- [
- [
- 7392,
- 770
- ],
- [
- -6,
- -11
- ],
- [
- -13,
- 8
- ],
- [
- -7,
- 14
- ],
- [
- -2,
- 27
- ],
- [
- 10,
- -29
- ],
- [
- 4,
- -6
- ],
- [
- 14,
- -3
- ]
- ],
- [
- [
- 7384,
- 810
- ],
- [
- 0,
- -24
- ],
- [
- -9,
- 39
- ],
- [
- -6,
- 44
- ],
- [
- 8,
- -14
- ],
- [
- 7,
- -45
- ]
- ],
- [
- [
- 7712,
- 1102
- ],
- [
- 3,
- -30
- ],
- [
- -16,
- 69
- ],
- [
- -19,
- 108
- ],
- [
- -11,
- 83
- ],
- [
- 7,
- -22
- ],
- [
- 7,
- -47
- ],
- [
- 29,
- -161
- ]
- ],
- [
- [
- 6895,
- 2054
- ],
- [
- -18,
- -14
- ],
- [
- -18,
- 10
- ],
- [
- 11,
- 2
- ],
- [
- 9,
- -4
- ],
- [
- 21,
- 21
- ],
- [
- 11,
- 15
- ],
- [
- 13,
- 6
- ],
- [
- -29,
- -36
- ]
- ],
- [
- [
- 7484,
- 2493
- ],
- [
- 8,
- -37
- ],
- [
- 13,
- -149
- ],
- [
- 8,
- -52
- ],
- [
- 15,
- -140
- ],
- [
- 26,
- -136
- ],
- [
- 35,
- -164
- ],
- [
- 58,
- -198
- ],
- [
- 7,
- -29
- ],
- [
- -8,
- -24
- ],
- [
- -2,
- -25
- ],
- [
- 0,
- -37
- ],
- [
- 2,
- -37
- ],
- [
- 6,
- -44
- ],
- [
- 14,
- -68
- ],
- [
- -8,
- 13
- ],
- [
- -19,
- 98
- ],
- [
- -2,
- 58
- ],
- [
- 3,
- 81
- ],
- [
- -5,
- -2
- ],
- [
- -3,
- -26
- ],
- [
- -2,
- -31
- ],
- [
- -5,
- -13
- ],
- [
- -7,
- 48
- ],
- [
- 1,
- 21
- ],
- [
- 7,
- 26
- ],
- [
- -2,
- 9
- ],
- [
- -12,
- 12
- ],
- [
- -2,
- 21
- ],
- [
- 1,
- 20
- ],
- [
- -6,
- 10
- ],
- [
- -5,
- 0
- ],
- [
- 3,
- -49
- ],
- [
- 5,
- -31
- ],
- [
- 7,
- -72
- ],
- [
- 11,
- -44
- ],
- [
- 6,
- -37
- ],
- [
- 74,
- -392
- ],
- [
- 17,
- -50
- ],
- [
- 6,
- -36
- ],
- [
- 7,
- -75
- ],
- [
- 2,
- -96
- ],
- [
- -12,
- -176
- ],
- [
- -3,
- -120
- ],
- [
- -2,
- 4
- ],
- [
- -1,
- 12
- ],
- [
- -3,
- 2
- ],
- [
- -10,
- -55
- ],
- [
- -14,
- -50
- ],
- [
- -5,
- -77
- ],
- [
- -7,
- -38
- ],
- [
- -20,
- -41
- ],
- [
- -13,
- 1
- ],
- [
- -31,
- -31
- ],
- [
- -22,
- 8
- ],
- [
- -25,
- -17
- ],
- [
- -18,
- 2
- ],
- [
- -9,
- 36
- ],
- [
- 1,
- 17
- ],
- [
- 4,
- 16
- ],
- [
- 7,
- 4
- ],
- [
- 23,
- -38
- ],
- [
- 4,
- 16
- ],
- [
- -7,
- 19
- ],
- [
- -13,
- 11
- ],
- [
- -10,
- 11
- ],
- [
- -20,
- 87
- ],
- [
- -20,
- 60
- ],
- [
- -4,
- 40
- ],
- [
- -35,
- 24
- ],
- [
- -25,
- 37
- ],
- [
- -17,
- 66
- ],
- [
- -9,
- 116
- ],
- [
- -12,
- 13
- ],
- [
- -4,
- 9
- ],
- [
- 10,
- 44
- ],
- [
- 12,
- 36
- ],
- [
- -9,
- -9
- ],
- [
- -7,
- -14
- ],
- [
- -8,
- -32
- ],
- [
- -7,
- -5
- ],
- [
- -5,
- 5
- ],
- [
- -7,
- 62
- ],
- [
- 2,
- 75
- ],
- [
- 9,
- 28
- ],
- [
- -14,
- 1
- ],
- [
- -15,
- -11
- ],
- [
- 2,
- -25
- ],
- [
- -2,
- -14
- ],
- [
- -11,
- 4
- ],
- [
- -8,
- 9
- ],
- [
- -11,
- 26
- ],
- [
- -15,
- 50
- ],
- [
- -31,
- 137
- ],
- [
- -6,
- 20
- ],
- [
- -10,
- 20
- ],
- [
- 4,
- 6
- ],
- [
- 9,
- 4
- ],
- [
- 20,
- 62
- ],
- [
- 16,
- 37
- ],
- [
- 5,
- 26
- ],
- [
- -1,
- 11
- ],
- [
- -7,
- 16
- ],
- [
- -9,
- -14
- ],
- [
- -4,
- 4
- ],
- [
- -10,
- 33
- ],
- [
- -10,
- 9
- ],
- [
- -7,
- -7
- ],
- [
- 8,
- -27
- ],
- [
- 6,
- -10
- ],
- [
- -2,
- -38
- ],
- [
- -3,
- -13
- ],
- [
- -6,
- -11
- ],
- [
- -10,
- 6
- ],
- [
- -4,
- -10
- ],
- [
- -6,
- 11
- ],
- [
- -5,
- 17
- ],
- [
- -7,
- 28
- ],
- [
- 17,
- 157
- ],
- [
- 15,
- 100
- ],
- [
- 2,
- 115
- ],
- [
- 1,
- 17
- ],
- [
- -1,
- 30
- ],
- [
- -21,
- 66
- ],
- [
- -90,
- 161
- ],
- [
- -70,
- 191
- ],
- [
- -61,
- 72
- ],
- [
- -46,
- -16
- ],
- [
- -8,
- -14
- ],
- [
- -3,
- -19
- ],
- [
- 3,
- -21
- ],
- [
- -4,
- -9
- ],
- [
- -13,
- 1
- ],
- [
- -16,
- -5
- ],
- [
- -44,
- -50
- ],
- [
- -15,
- 1
- ],
- [
- -14,
- -13
- ],
- [
- -10,
- -9
- ],
- [
- -28,
- -6
- ],
- [
- -23,
- -11
- ],
- [
- -9,
- 6
- ],
- [
- -7,
- 29
- ],
- [
- 0,
- 31
- ],
- [
- 5,
- -24
- ],
- [
- 8,
- -18
- ],
- [
- 4,
- 8
- ],
- [
- 2,
- 16
- ],
- [
- -9,
- 31
- ],
- [
- -26,
- 40
- ],
- [
- -29,
- 59
- ],
- [
- 9,
- -2
- ],
- [
- 2,
- 13
- ],
- [
- -9,
- 16
- ],
- [
- 4,
- 19
- ],
- [
- 6,
- 21
- ],
- [
- -12,
- -3
- ],
- [
- -12,
- -15
- ],
- [
- 0,
- -17
- ],
- [
- -2,
- -14
- ],
- [
- -6,
- 2
- ],
- [
- -11,
- 17
- ],
- [
- -56,
- 48
- ],
- [
- -48,
- 27
- ],
- [
- 37,
- 12
- ],
- [
- 20,
- -10
- ],
- [
- -2,
- 15
- ],
- [
- -5,
- 9
- ],
- [
- -16,
- 12
- ],
- [
- -20,
- -5
- ],
- [
- -13,
- 6
- ],
- [
- -13,
- -12
- ],
- [
- -14,
- -17
- ],
- [
- -13,
- -9
- ],
- [
- -50,
- -12
- ],
- [
- -41,
- -13
- ],
- [
- 7,
- 14
- ],
- [
- 7,
- 9
- ],
- [
- 24,
- 14
- ],
- [
- 3,
- 28
- ],
- [
- -5,
- 28
- ],
- [
- -7,
- -7
- ],
- [
- -6,
- -21
- ],
- [
- -8,
- 15
- ],
- [
- -9,
- 0
- ],
- [
- -3,
- -34
- ],
- [
- -11,
- -23
- ],
- [
- -5,
- -23
- ],
- [
- -34,
- -18
- ],
- [
- -4,
- 6
- ],
- [
- 9,
- 22
- ],
- [
- 0,
- 12
- ],
- [
- -8,
- -7
- ]
- ],
- [
- [
- 6877,
- 2601
- ],
- [
- 8,
- -31
- ],
- [
- 13,
- -66
- ],
- [
- 1,
- -16
- ],
- [
- 16,
- -2
- ],
- [
- 28,
- -4
- ],
- [
- 27,
- -3
- ],
- [
- 28,
- -4
- ],
- [
- 27,
- -4
- ],
- [
- 28,
- -4
- ],
- [
- 28,
- -4
- ],
- [
- 27,
- -3
- ],
- [
- 28,
- -4
- ],
- [
- 28,
- -4
- ],
- [
- 27,
- -4
- ],
- [
- 28,
- -3
- ],
- [
- 27,
- -4
- ],
- [
- 28,
- -4
- ],
- [
- 28,
- -4
- ],
- [
- 27,
- -3
- ],
- [
- 28,
- -4
- ],
- [
- 0,
- -13
- ],
- [
- 5,
- -21
- ],
- [
- 1,
- -24
- ],
- [
- 2,
- -12
- ],
- [
- 5,
- -7
- ],
- [
- 9,
- -1
- ],
- [
- 9,
- 13
- ],
- [
- 5,
- 29
- ],
- [
- 2,
- 34
- ],
- [
- -4,
- 37
- ],
- [
- 1,
- 32
- ],
- [
- 4,
- 18
- ],
- [
- 5,
- 5
- ],
- [
- 5,
- 10
- ],
- [
- 4,
- 2
- ],
- [
- 9,
- -5
- ],
- [
- 36,
- -27
- ],
- [
- 29,
- -3
- ]
- ],
- [
- [
- 7499,
- 2589
- ],
- [
- -8,
- -98
- ],
- [
- -3,
- 35
- ],
- [
- 0,
- 34
- ],
- [
- 6,
- 20
- ],
- [
- 5,
- 9
- ]
- ],
- [
- [
- 7594,
- 3015
- ],
- [
- -9,
- -34
- ],
- [
- -21,
- -21
- ],
- [
- -7,
- 1
- ],
- [
- -5,
- -6
- ],
- [
- 3,
- -16
- ],
- [
- 5,
- -11
- ],
- [
- 0,
- -10
- ],
- [
- -5,
- -14
- ],
- [
- -11,
- -4
- ],
- [
- -7,
- -16
- ],
- [
- 2,
- -15
- ],
- [
- 4,
- -8
- ],
- [
- -1,
- -14
- ],
- [
- -12,
- -15
- ],
- [
- -3,
- -14
- ],
- [
- 6,
- -4
- ],
- [
- 5,
- 4
- ],
- [
- 3,
- -3
- ],
- [
- -7,
- -24
- ],
- [
- -7,
- -15
- ],
- [
- -6,
- -26
- ],
- [
- -15,
- -7
- ],
- [
- 0,
- -8
- ],
- [
- 9,
- -8
- ],
- [
- 7,
- -20
- ],
- [
- -14,
- -37
- ],
- [
- -8,
- 3
- ],
- [
- -5,
- 8
- ],
- [
- -3,
- -29
- ],
- [
- 1,
- -16
- ],
- [
- -3,
- -32
- ],
- [
- -5,
- -38
- ],
- [
- -4,
- -16
- ],
- [
- 1,
- -29
- ],
- [
- 2,
- -28
- ]
- ],
- [
- [
- 6771,
- 4212
- ],
- [
- 56,
- -1
- ],
- [
- 56,
- -1
- ],
- [
- 56,
- -2
- ],
- [
- 57,
- -1
- ]
- ],
- [
- [
- 6996,
- 4207
- ],
- [
- 52,
- 1
- ],
- [
- 52,
- 2
- ],
- [
- 53,
- 1
- ],
- [
- 52,
- 1
- ]
- ],
- [
- [
- 7205,
- 4212
- ],
- [
- -1,
- 0
- ],
- [
- -8,
- -27
- ],
- [
- -26,
- -52
- ],
- [
- -6,
- -39
- ],
- [
- 32,
- -44
- ],
- [
- 20,
- -35
- ],
- [
- 13,
- -14
- ],
- [
- 14,
- -4
- ],
- [
- 9,
- -12
- ],
- [
- 5,
- -29
- ],
- [
- 39,
- -140
- ],
- [
- 41,
- -72
- ],
- [
- 17,
- -36
- ],
- [
- 8,
- -34
- ],
- [
- 35,
- -57
- ],
- [
- 12,
- -31
- ],
- [
- 1,
- -23
- ],
- [
- 4,
- -16
- ],
- [
- 8,
- -10
- ],
- [
- 7,
- -20
- ],
- [
- 7,
- -32
- ],
- [
- 14,
- -28
- ],
- [
- 21,
- -23
- ],
- [
- 16,
- -54
- ],
- [
- 9,
- -83
- ],
- [
- 10,
- -49
- ],
- [
- 15,
- -20
- ],
- [
- 21,
- -71
- ],
- [
- 7,
- -43
- ],
- [
- -1,
- -37
- ],
- [
- 11,
- -29
- ],
- [
- 35,
- -33
- ]
- ],
- [
- [
- 5900,
- 7238
- ],
- [
- 10,
- -28
- ],
- [
- 19,
- -25
- ],
- [
- 10,
- -23
- ],
- [
- 2,
- -21
- ],
- [
- 12,
- -24
- ],
- [
- 19,
- -24
- ],
- [
- 12,
- -22
- ],
- [
- 3,
- -18
- ],
- [
- -1,
- -30
- ],
- [
- -4,
- -39
- ],
- [
- -7,
- -28
- ],
- [
- -10,
- -18
- ],
- [
- -8,
- -24
- ],
- [
- -5,
- -31
- ],
- [
- -15,
- -29
- ],
- [
- -26,
- -27
- ],
- [
- -29,
- -18
- ],
- [
- -32,
- -9
- ],
- [
- -19,
- -23
- ],
- [
- -6,
- -36
- ],
- [
- 3,
- -30
- ],
- [
- 11,
- -24
- ],
- [
- 7,
- -26
- ],
- [
- 1,
- -27
- ],
- [
- -8,
- -44
- ],
- [
- -17,
- -63
- ],
- [
- -20,
- -40
- ],
- [
- -21,
- -18
- ],
- [
- -10,
- -27
- ],
- [
- 2,
- -36
- ],
- [
- -1,
- -21
- ],
- [
- -9,
- -7
- ]
- ],
- [
- [
- 5763,
- 6378
- ],
- [
- -15,
- 22
- ],
- [
- -3,
- 14
- ],
- [
- -12,
- 16
- ],
- [
- -2,
- 9
- ],
- [
- -10,
- 9
- ],
- [
- -8,
- 29
- ],
- [
- -44,
- -1
- ],
- [
- -44,
- 0
- ],
- [
- -43,
- -1
- ],
- [
- -44,
- 0
- ],
- [
- -44,
- -1
- ],
- [
- -44,
- 0
- ],
- [
- -43,
- -1
- ],
- [
- -44,
- -1
- ],
- [
- -44,
- 0
- ],
- [
- -43,
- -1
- ],
- [
- -44,
- 0
- ],
- [
- -44,
- -1
- ],
- [
- -43,
- -1
- ],
- [
- -44,
- 0
- ],
- [
- -44,
- -1
- ],
- [
- -43,
- 0
- ]
- ],
- [
- [
- 5014,
- 6468
- ],
- [
- -11,
- 30
- ],
- [
- -5,
- 28
- ],
- [
- 3,
- 13
- ],
- [
- 1,
- 45
- ],
- [
- -2,
- 77
- ],
- [
- -4,
- 43
- ],
- [
- -7,
- 10
- ],
- [
- 0,
- 13
- ],
- [
- 4,
- 17
- ],
- [
- -1,
- 12
- ],
- [
- -8,
- 5
- ],
- [
- -2,
- 15
- ],
- [
- 3,
- 24
- ],
- [
- -2,
- 14
- ],
- [
- -7,
- 5
- ],
- [
- -2,
- 8
- ],
- [
- 1,
- 11
- ],
- [
- -4,
- 7
- ],
- [
- -8,
- 3
- ],
- [
- -3,
- 26
- ],
- [
- 1,
- 50
- ],
- [
- -3,
- 35
- ],
- [
- -7,
- 21
- ],
- [
- -4,
- 19
- ],
- [
- 0,
- 18
- ],
- [
- -9,
- 28
- ],
- [
- -16,
- 39
- ],
- [
- -10,
- 52
- ],
- [
- -5,
- 63
- ],
- [
- -12,
- 36
- ],
- [
- -5,
- 2
- ]
- ],
- [
- [
- 4890,
- 7237
- ],
- [
- -4,
- 33
- ],
- [
- -5,
- 15
- ],
- [
- -1,
- 11
- ],
- [
- -14,
- 29
- ],
- [
- -1,
- 11
- ],
- [
- 2,
- 14
- ],
- [
- 9,
- 27
- ],
- [
- 8,
- 44
- ],
- [
- 2,
- 30
- ],
- [
- 7,
- 23
- ],
- [
- 0,
- 12
- ],
- [
- -1,
- 16
- ],
- [
- -4,
- 14
- ],
- [
- -11,
- 11
- ],
- [
- -1,
- 4
- ],
- [
- -1,
- 17
- ],
- [
- 4,
- 10
- ],
- [
- 2,
- 12
- ],
- [
- -2,
- 14
- ],
- [
- -6,
- 25
- ],
- [
- -3,
- 25
- ],
- [
- 25,
- 2
- ]
- ],
- [
- [
- 4895,
- 7636
- ],
- [
- 56,
- 0
- ],
- [
- 56,
- 0
- ],
- [
- 57,
- 0
- ],
- [
- 56,
- 0
- ],
- [
- 56,
- 0
- ],
- [
- 57,
- 0
- ],
- [
- 56,
- 0
- ],
- [
- 56,
- 0
- ],
- [
- 57,
- 0
- ],
- [
- 56,
- 0
- ],
- [
- 56,
- 0
- ],
- [
- 57,
- 0
- ],
- [
- 56,
- 0
- ],
- [
- 56,
- 0
- ],
- [
- 57,
- 0
- ],
- [
- 57,
- 0
- ]
- ],
- [
- [
- 5797,
- 7636
- ],
- [
- 1,
- -25
- ],
- [
- 3,
- -18
- ],
- [
- 7,
- -15
- ],
- [
- 11,
- -11
- ],
- [
- 2,
- -21
- ],
- [
- -7,
- -32
- ],
- [
- -3,
- -39
- ],
- [
- 3,
- -47
- ],
- [
- 5,
- -42
- ],
- [
- 8,
- -37
- ],
- [
- 19,
- -28
- ],
- [
- 30,
- -17
- ],
- [
- 17,
- -27
- ],
- [
- 6,
- -36
- ],
- [
- 1,
- -3
- ]
- ],
- [
- [
- 2366,
- 8037
- ],
- [
- 0,
- -63
- ],
- [
- 0,
- -62
- ],
- [
- 0,
- -63
- ],
- [
- 0,
- -63
- ],
- [
- 0,
- -63
- ],
- [
- 0,
- -63
- ],
- [
- 0,
- -63
- ],
- [
- 0,
- -63
- ],
- [
- 0,
- -63
- ],
- [
- 0,
- -62
- ],
- [
- 0,
- -63
- ],
- [
- 0,
- -63
- ],
- [
- 0,
- -63
- ],
- [
- 0,
- -63
- ],
- [
- 0,
- -63
- ],
- [
- 0,
- -63
- ]
- ],
- [
- [
- 2366,
- 7031
- ],
- [
- -32,
- 0
- ],
- [
- -33,
- 0
- ],
- [
- -32,
- 0
- ],
- [
- -32,
- 0
- ],
- [
- -33,
- 0
- ],
- [
- -32,
- 0
- ],
- [
- -33,
- 0
- ],
- [
- -32,
- 0
- ],
- [
- -32,
- 0
- ],
- [
- -33,
- 0
- ],
- [
- -32,
- 0
- ],
- [
- -33,
- 0
- ],
- [
- -32,
- 0
- ],
- [
- -32,
- 0
- ],
- [
- -33,
- 0
- ],
- [
- -32,
- 0
- ]
- ],
- [
- [
- 1848,
- 7031
- ],
- [
- -65,
- 0
- ],
- [
- -64,
- 0
- ],
- [
- -64,
- 0
- ],
- [
- -65,
- 0
- ],
- [
- -64,
- 0
- ],
- [
- -65,
- 0
- ],
- [
- -64,
- 0
- ],
- [
- -64,
- 0
- ]
- ],
- [
- [
- 1333,
- 7031
- ],
- [
- 0,
- 90
- ],
- [
- 0,
- 90
- ],
- [
- -1,
- 90
- ],
- [
- 0,
- 90
- ],
- [
- 0,
- 90
- ],
- [
- 0,
- 89
- ],
- [
- 0,
- 90
- ],
- [
- 0,
- 99
- ],
- [
- 0,
- 2
- ],
- [
- 11,
- 61
- ],
- [
- 2,
- 30
- ],
- [
- -3,
- 16
- ],
- [
- 2,
- 16
- ],
- [
- 7,
- 16
- ],
- [
- 0,
- 17
- ],
- [
- -7,
- 18
- ],
- [
- -13,
- 12
- ],
- [
- -20,
- 6
- ],
- [
- -10,
- 22
- ],
- [
- 0,
- 37
- ],
- [
- 14,
- 57
- ],
- [
- 29,
- 78
- ],
- [
- 17,
- 54
- ],
- [
- 2,
- 32
- ],
- [
- 18,
- 74
- ],
- [
- 33,
- 116
- ],
- [
- 12,
- 74
- ],
- [
- -7,
- 33
- ],
- [
- -17,
- 31
- ],
- [
- -26,
- 30
- ],
- [
- -18,
- 34
- ],
- [
- -5,
- 18
- ]
- ],
- [
- [
- 1353,
- 8643
- ],
- [
- -5,
- 21
- ],
- [
- -3,
- 28
- ],
- [
- 4,
- 16
- ],
- [
- -4,
- 27
- ],
- [
- -11,
- 40
- ],
- [
- -5,
- 27
- ],
- [
- 1,
- 9
- ],
- [
- 1,
- 4
- ],
- [
- 0,
- 64
- ],
- [
- 0,
- 65
- ],
- [
- 0,
- 64
- ],
- [
- 0,
- 65
- ],
- [
- 0,
- 65
- ],
- [
- -1,
- 64
- ],
- [
- 0,
- 65
- ],
- [
- 0,
- 64
- ],
- [
- 0,
- 65
- ],
- [
- 0,
- 64
- ],
- [
- 0,
- 65
- ],
- [
- 0,
- 64
- ],
- [
- -1,
- 65
- ],
- [
- 0,
- 65
- ],
- [
- 0,
- 64
- ],
- [
- 0,
- 64
- ]
- ],
- [
- [
- 1329,
- 9847
- ],
- [
- 56,
- 0
- ],
- [
- 73,
- 0
- ],
- [
- 42,
- 0
- ]
- ],
- [
- [
- 1500,
- 9847
- ],
- [
- 0,
- -99
- ],
- [
- 0,
- -100
- ],
- [
- 0,
- -99
- ],
- [
- 0,
- -100
- ],
- [
- 19,
- -40
- ],
- [
- 14,
- -25
- ],
- [
- 8,
- -27
- ],
- [
- 14,
- -28
- ],
- [
- 3,
- -10
- ],
- [
- 4,
- -30
- ],
- [
- -3,
- -22
- ],
- [
- 7,
- -22
- ],
- [
- -1,
- -11
- ],
- [
- -6,
- -5
- ],
- [
- -1,
- -2
- ],
- [
- 0,
- -2
- ],
- [
- 2,
- -4
- ],
- [
- 19,
- -21
- ],
- [
- 19,
- -30
- ],
- [
- 23,
- -20
- ],
- [
- 8,
- -12
- ],
- [
- 31,
- -59
- ],
- [
- 16,
- -38
- ],
- [
- 17,
- -27
- ],
- [
- 9,
- -32
- ],
- [
- 17,
- -27
- ],
- [
- 4,
- -14
- ],
- [
- 2,
- -3
- ],
- [
- 2,
- -1
- ],
- [
- 11,
- 7
- ],
- [
- 3,
- -2
- ],
- [
- 5,
- -11
- ],
- [
- 1,
- -16
- ],
- [
- 4,
- -7
- ],
- [
- 7,
- -4
- ],
- [
- 7,
- -1
- ],
- [
- 24,
- 8
- ],
- [
- 5,
- 0
- ],
- [
- 3,
- -4
- ],
- [
- 1,
- -8
- ],
- [
- 0,
- -15
- ],
- [
- -3,
- -20
- ],
- [
- -7,
- -21
- ],
- [
- 1,
- -19
- ],
- [
- -5,
- -44
- ],
- [
- -6,
- -29
- ],
- [
- 0,
- -29
- ],
- [
- -7,
- -16
- ],
- [
- 4,
- -20
- ],
- [
- -3,
- -30
- ],
- [
- 3,
- -7
- ],
- [
- 8,
- -14
- ],
- [
- 3,
- -37
- ],
- [
- -1,
- -7
- ],
- [
- -15,
- -14
- ],
- [
- -5,
- -10
- ],
- [
- -2,
- -13
- ],
- [
- 6,
- -39
- ],
- [
- -6,
- -21
- ],
- [
- -1,
- -18
- ],
- [
- 2,
- -5
- ],
- [
- 14,
- -10
- ],
- [
- 17,
- -22
- ],
- [
- 5,
- -4
- ],
- [
- 4,
- 1
- ],
- [
- 7,
- 7
- ],
- [
- 8,
- 15
- ],
- [
- 16,
- 14
- ],
- [
- 19,
- 32
- ],
- [
- 1,
- 9
- ],
- [
- 2,
- 5
- ],
- [
- 2,
- 0
- ],
- [
- 6,
- -4
- ],
- [
- 12,
- -20
- ],
- [
- 11,
- -10
- ],
- [
- 1,
- -3
- ],
- [
- 1,
- -5
- ],
- [
- 0,
- -19
- ],
- [
- 6,
- -15
- ],
- [
- 1,
- -25
- ],
- [
- 6,
- -25
- ],
- [
- 5,
- -30
- ],
- [
- 15,
- -39
- ],
- [
- 9,
- -27
- ],
- [
- 9,
- -13
- ],
- [
- 6,
- -15
- ],
- [
- 4,
- -17
- ],
- [
- 2,
- -14
- ],
- [
- -6,
- -26
- ],
- [
- 2,
- -11
- ],
- [
- 5,
- -12
- ],
- [
- 16,
- -26
- ],
- [
- 3,
- -2
- ],
- [
- 15,
- 3
- ],
- [
- 8,
- -5
- ],
- [
- 8,
- -13
- ],
- [
- 8,
- -20
- ],
- [
- 6,
- -21
- ],
- [
- 1,
- -24
- ],
- [
- 8,
- -26
- ],
- [
- 2,
- -24
- ],
- [
- 5,
- -11
- ],
- [
- 10,
- -14
- ],
- [
- 10,
- -8
- ],
- [
- 4,
- -1
- ],
- [
- 2,
- 4
- ],
- [
- 1,
- 13
- ],
- [
- 4,
- 10
- ],
- [
- 13,
- 14
- ],
- [
- 11,
- 0
- ],
- [
- 45,
- -12
- ],
- [
- 3,
- 1
- ],
- [
- 2,
- 4
- ],
- [
- 7,
- 21
- ],
- [
- 6,
- 9
- ],
- [
- 10,
- 2
- ],
- [
- 27,
- -5
- ],
- [
- 31,
- 3
- ],
- [
- 17,
- -6
- ],
- [
- 24,
- 8
- ],
- [
- 27,
- -6
- ],
- [
- 4,
- 3
- ],
- [
- 1,
- 5
- ],
- [
- -3,
- 8
- ],
- [
- 0,
- 16
- ],
- [
- 5,
- 19
- ],
- [
- 2,
- 16
- ],
- [
- 6,
- 9
- ],
- [
- 7,
- 5
- ],
- [
- 6,
- -1
- ],
- [
- 6,
- -8
- ],
- [
- 7,
- -15
- ],
- [
- 12,
- -39
- ],
- [
- 6,
- -14
- ],
- [
- 8,
- -12
- ],
- [
- 11,
- -11
- ]
- ],
- [
- [
- 6392,
- 7231
- ],
- [
- 0,
- -63
- ],
- [
- 2,
- -52
- ],
- [
- 5,
- -23
- ],
- [
- 6,
- -17
- ],
- [
- 7,
- -11
- ],
- [
- 7,
- -34
- ],
- [
- 9,
- -57
- ],
- [
- 8,
- -37
- ],
- [
- 6,
- -16
- ]
- ],
- [
- [
- 6442,
- 6921
- ],
- [
- 0,
- -107
- ],
- [
- 0,
- -121
- ],
- [
- -1,
- -121
- ],
- [
- 0,
- -120
- ],
- [
- 0,
- -121
- ],
- [
- -1,
- -121
- ],
- [
- 0,
- -121
- ],
- [
- 0,
- -114
- ],
- [
- 0,
- -1
- ],
- [
- -8,
- -13
- ],
- [
- -6,
- -21
- ],
- [
- 2,
- -23
- ],
- [
- -2,
- -16
- ],
- [
- -6,
- -10
- ],
- [
- 3,
- -25
- ],
- [
- 11,
- -40
- ],
- [
- 6,
- -40
- ],
- [
- 3,
- -39
- ],
- [
- -2,
- -28
- ],
- [
- -10,
- -25
- ],
- [
- -9,
- -56
- ],
- [
- -8,
- -22
- ],
- [
- -9,
- -7
- ],
- [
- -9,
- -20
- ],
- [
- -7,
- -34
- ],
- [
- -8,
- -16
- ],
- [
- -8,
- 1
- ],
- [
- -7,
- -6
- ],
- [
- -4,
- -14
- ],
- [
- 1,
- -14
- ],
- [
- 5,
- -14
- ],
- [
- -2,
- -14
- ],
- [
- -8,
- -12
- ],
- [
- 0,
- -6
- ],
- [
- 3,
- -4
- ],
- [
- -1,
- -6
- ],
- [
- -5,
- -6
- ],
- [
- -4,
- -19
- ],
- [
- 1,
- -31
- ],
- [
- -3,
- -15
- ],
- [
- -6,
- -1
- ],
- [
- 0,
- -8
- ],
- [
- 9,
- -35
- ]
- ],
- [
- [
- 6352,
- 5335
- ],
- [
- -6,
- -7
- ],
- [
- -9,
- -29
- ],
- [
- -2,
- -32
- ],
- [
- 5,
- -35
- ],
- [
- -14,
- -28
- ],
- [
- -34,
- -21
- ],
- [
- -19,
- -19
- ],
- [
- -2,
- -16
- ],
- [
- 3,
- -25
- ],
- [
- 7,
- -34
- ],
- [
- 1,
- -23
- ],
- [
- -5,
- -13
- ],
- [
- -24,
- 9
- ],
- [
- -45,
- 30
- ],
- [
- -30,
- -1
- ],
- [
- -15,
- -33
- ],
- [
- -6,
- -24
- ],
- [
- 2,
- -20
- ]
- ],
- [
- [
- 6159,
- 5014
- ],
- [
- -12,
- 24
- ],
- [
- -8,
- 11
- ],
- [
- -2,
- 0
- ],
- [
- -2,
- -3
- ],
- [
- 0,
- -8
- ],
- [
- 0,
- -5
- ],
- [
- 1,
- -7
- ],
- [
- 0,
- -4
- ],
- [
- -2,
- 0
- ],
- [
- -9,
- 10
- ],
- [
- -11,
- 26
- ],
- [
- -13,
- 45
- ],
- [
- -2,
- 35
- ],
- [
- 7,
- 26
- ],
- [
- 0,
- 28
- ],
- [
- -7,
- 29
- ],
- [
- -4,
- 28
- ],
- [
- 0,
- 28
- ],
- [
- -17,
- 41
- ],
- [
- -35,
- 55
- ],
- [
- -25,
- 34
- ],
- [
- -16,
- 13
- ],
- [
- -19,
- 28
- ],
- [
- -22,
- 42
- ],
- [
- -12,
- 32
- ],
- [
- -1,
- 23
- ],
- [
- 10,
- 59
- ],
- [
- 28,
- 130
- ],
- [
- 4,
- 16
- ],
- [
- 1,
- 5
- ],
- [
- -2,
- 6
- ],
- [
- -2,
- 5
- ],
- [
- -13,
- 15
- ],
- [
- -23,
- 14
- ],
- [
- -21,
- 7
- ],
- [
- -17,
- -16
- ],
- [
- -15,
- 32
- ],
- [
- -13,
- 78
- ],
- [
- -32,
- 83
- ],
- [
- -50,
- 86
- ],
- [
- -29,
- 60
- ],
- [
- -8,
- 31
- ],
- [
- -7,
- 46
- ],
- [
- -7,
- 63
- ],
- [
- 1,
- 51
- ],
- [
- 10,
- 62
- ]
- ],
- [
- [
- 5900,
- 7238
- ],
- [
- 80,
- -2
- ],
- [
- 78,
- -1
- ],
- [
- 78,
- -1
- ],
- [
- 78,
- -1
- ],
- [
- 78,
- -1
- ],
- [
- 78,
- -1
- ],
- [
- 22,
- 0
- ]
- ],
- [
- [
- 6914,
- 6911
- ],
- [
- -1,
- -131
- ],
- [
- 0,
- -131
- ],
- [
- -1,
- -131
- ],
- [
- 0,
- -131
- ],
- [
- -1,
- -132
- ],
- [
- -1,
- -131
- ],
- [
- 0,
- -131
- ],
- [
- 0,
- -133
- ]
- ],
- [
- [
- 6910,
- 5860
- ],
- [
- -3,
- -4
- ],
- [
- -4,
- -17
- ],
- [
- 4,
- -18
- ],
- [
- 0,
- -14
- ],
- [
- -5,
- -11
- ],
- [
- 2,
- -8
- ],
- [
- 8,
- -6
- ],
- [
- 3,
- -12
- ],
- [
- -2,
- -20
- ],
- [
- -17,
- -20
- ],
- [
- -34,
- -23
- ],
- [
- -7,
- -6
- ],
- [
- -6,
- -3
- ],
- [
- -3,
- 1
- ],
- [
- -4,
- 5
- ],
- [
- -6,
- 9
- ],
- [
- -10,
- 4
- ],
- [
- -18,
- -3
- ],
- [
- -6,
- -19
- ],
- [
- 3,
- -35
- ],
- [
- -6,
- -26
- ],
- [
- -15,
- -19
- ],
- [
- -11,
- -25
- ],
- [
- -6,
- -30
- ],
- [
- -11,
- -19
- ],
- [
- -14,
- -6
- ],
- [
- -11,
- -28
- ],
- [
- -9,
- -50
- ],
- [
- -10,
- -31
- ],
- [
- -10,
- -12
- ],
- [
- -14,
- 3
- ],
- [
- -18,
- 18
- ],
- [
- -11,
- 18
- ],
- [
- -3,
- 19
- ],
- [
- -5,
- 14
- ],
- [
- -5,
- 6
- ],
- [
- -3,
- 0
- ],
- [
- 0,
- -3
- ],
- [
- 1,
- -5
- ],
- [
- -2,
- -6
- ],
- [
- -11,
- -2
- ],
- [
- -5,
- -8
- ],
- [
- 2,
- -13
- ],
- [
- -3,
- -10
- ],
- [
- -6,
- -6
- ],
- [
- -4,
- -13
- ],
- [
- 0,
- -21
- ],
- [
- -5,
- -18
- ],
- [
- -8,
- -17
- ],
- [
- -13,
- 5
- ],
- [
- -17,
- 29
- ],
- [
- -17,
- 6
- ],
- [
- -17,
- -15
- ],
- [
- -13,
- -21
- ],
- [
- -9,
- -26
- ],
- [
- -8,
- -6
- ],
- [
- -12,
- 20
- ],
- [
- -28,
- 27
- ],
- [
- -15,
- 6
- ],
- [
- -11,
- -7
- ],
- [
- -7,
- 3
- ],
- [
- -3,
- 8
- ],
- [
- -1,
- 3
- ],
- [
- -3,
- -4
- ],
- [
- 0,
- -24
- ],
- [
- -2,
- -15
- ],
- [
- -5,
- -6
- ],
- [
- -4,
- 5
- ],
- [
- -2,
- 16
- ],
- [
- -6,
- 6
- ],
- [
- -10,
- -6
- ],
- [
- -10,
- 2
- ],
- [
- -8,
- 10
- ],
- [
- -3,
- -1
- ],
- [
- -3,
- -5
- ],
- [
- 1,
- -18
- ],
- [
- -2,
- -15
- ],
- [
- -4,
- -10
- ],
- [
- -7,
- -2
- ],
- [
- -8,
- 5
- ],
- [
- -3,
- -5
- ]
- ],
- [
- [
- 6442,
- 6921
- ],
- [
- 1,
- -3
- ],
- [
- 7,
- -10
- ],
- [
- 5,
- -6
- ],
- [
- 4,
- -1
- ],
- [
- 2,
- -8
- ],
- [
- 10,
- -6
- ],
- [
- 17,
- -2
- ],
- [
- 17,
- 4
- ],
- [
- 15,
- 9
- ],
- [
- 36,
- 37
- ]
- ],
- [
- [
- 6556,
- 6935
- ],
- [
- 43,
- -1
- ],
- [
- 52,
- 0
- ],
- [
- 53,
- 0
- ],
- [
- 52,
- 0
- ],
- [
- 53,
- 0
- ],
- [
- 52,
- 0
- ],
- [
- 53,
- 0
- ],
- [
- 0,
- -23
- ]
- ],
- [
- [
- 5213,
- 5018
- ],
- [
- -40,
- 0
- ],
- [
- -40,
- 0
- ],
- [
- -40,
- 0
- ],
- [
- -40,
- 0
- ],
- [
- -41,
- 0
- ],
- [
- -40,
- 0
- ],
- [
- -40,
- 0
- ],
- [
- -40,
- 0
- ],
- [
- -40,
- 0
- ],
- [
- -40,
- 0
- ],
- [
- -40,
- 0
- ],
- [
- -40,
- 0
- ],
- [
- -40,
- 0
- ],
- [
- -40,
- 0
- ],
- [
- -40,
- 0
- ],
- [
- -40,
- 0
- ],
- [
- -40,
- 0
- ],
- [
- -40,
- 0
- ],
- [
- -40,
- 0
- ],
- [
- -40,
- 0
- ],
- [
- -40,
- 0
- ],
- [
- -40,
- 0
- ],
- [
- -40,
- 0
- ],
- [
- -40,
- 0
- ],
- [
- -40,
- 0
- ],
- [
- -40,
- 0
- ],
- [
- -40,
- 0
- ],
- [
- -40,
- 0
- ],
- [
- -40,
- 0
- ],
- [
- -40,
- 0
- ],
- [
- -40,
- 0
- ],
- [
- -40,
- 0
- ]
- ],
- [
- [
- 3930,
- 6226
- ],
- [
- 36,
- 0
- ],
- [
- 36,
- 0
- ],
- [
- 37,
- 0
- ],
- [
- 36,
- 0
- ],
- [
- 36,
- 0
- ],
- [
- 37,
- 0
- ],
- [
- 36,
- 0
- ],
- [
- 36,
- 0
- ],
- [
- 36,
- 0
- ],
- [
- 37,
- 0
- ],
- [
- 36,
- 0
- ],
- [
- 36,
- 0
- ],
- [
- 37,
- 0
- ],
- [
- 36,
- 0
- ],
- [
- 36,
- 0
- ],
- [
- 37,
- 0
- ],
- [
- 36,
- 0
- ],
- [
- 36,
- 0
- ],
- [
- 37,
- 0
- ],
- [
- 36,
- 0
- ],
- [
- 36,
- 0
- ],
- [
- 36,
- 0
- ],
- [
- 37,
- 0
- ],
- [
- 36,
- 0
- ],
- [
- 36,
- 0
- ],
- [
- 37,
- 0
- ],
- [
- 36,
- 0
- ],
- [
- 36,
- 0
- ],
- [
- 37,
- 0
- ],
- [
- 36,
- 0
- ],
- [
- 36,
- 0
- ],
- [
- 31,
- 0
- ]
- ],
- [
- [
- 5086,
- 6226
- ],
- [
- 40,
- -52
- ],
- [
- 11,
- -1
- ],
- [
- 12,
- 9
- ],
- [
- 10,
- -12
- ],
- [
- 6,
- -32
- ],
- [
- -1,
- -17
- ],
- [
- -8,
- 0
- ],
- [
- -10,
- -20
- ],
- [
- -13,
- -38
- ],
- [
- 3,
- -35
- ],
- [
- 19,
- -34
- ],
- [
- 12,
- -33
- ],
- [
- 6,
- -34
- ],
- [
- 12,
- -26
- ],
- [
- 27,
- -28
- ],
- [
- 0,
- -16
- ],
- [
- 0,
- -52
- ],
- [
- 0,
- -53
- ],
- [
- 0,
- -52
- ],
- [
- 0,
- -53
- ],
- [
- 0,
- -52
- ],
- [
- 0,
- -53
- ],
- [
- 0,
- -52
- ],
- [
- 0,
- -53
- ],
- [
- 0,
- -52
- ],
- [
- 0,
- -53
- ],
- [
- 0,
- -52
- ],
- [
- 0,
- -52
- ],
- [
- 0,
- -53
- ],
- [
- 1,
- -52
- ],
- [
- 0,
- -53
- ],
- [
- 0,
- -52
- ]
- ],
- [
- [
- 6101,
- 4817
- ],
- [
- -12,
- -1
- ]
- ],
- [
- [
- 6089,
- 4816
- ],
- [
- 0,
- 5
- ],
- [
- 1,
- 11
- ],
- [
- 1,
- 5
- ],
- [
- 2,
- 1
- ],
- [
- 3,
- 0
- ],
- [
- 4,
- -11
- ],
- [
- 1,
- -10
- ]
- ],
- [
- [
- 7292,
- 5600
- ],
- [
- 4,
- -11
- ],
- [
- 2,
- -59
- ],
- [
- -1,
- -12
- ],
- [
- -6,
- -25
- ],
- [
- 0,
- -13
- ],
- [
- 5,
- -20
- ],
- [
- 19,
- -47
- ],
- [
- 2,
- -18
- ],
- [
- 7,
- -18
- ],
- [
- 6,
- -26
- ],
- [
- 20,
- -57
- ],
- [
- 30,
- -47
- ],
- [
- 24,
- -12
- ]
- ],
- [
- [
- 7404,
- 5235
- ],
- [
- -65,
- -98
- ],
- [
- -30,
- -36
- ],
- [
- -29,
- -28
- ],
- [
- -2,
- -5
- ],
- [
- -6,
- -31
- ],
- [
- -18,
- -28
- ],
- [
- -11,
- -29
- ],
- [
- -25,
- -25
- ],
- [
- -19,
- -33
- ],
- [
- -46,
- -33
- ],
- [
- -26,
- -12
- ],
- [
- -17,
- -19
- ]
- ],
- [
- [
- 7110,
- 4858
- ],
- [
- -2,
- -1
- ],
- [
- -1,
- -1
- ],
- [
- -2,
- -1
- ],
- [
- -1,
- -1
- ],
- [
- -1,
- 0
- ],
- [
- -2,
- -1
- ],
- [
- -1,
- -1
- ],
- [
- -1,
- -1
- ],
- [
- -60,
- 4
- ],
- [
- -61,
- 4
- ],
- [
- -60,
- 4
- ],
- [
- -60,
- 4
- ],
- [
- -60,
- 3
- ],
- [
- -60,
- 4
- ],
- [
- -60,
- 4
- ],
- [
- -60,
- 4
- ],
- [
- -58,
- -2
- ],
- [
- -58,
- -2
- ],
- [
- -57,
- -2
- ],
- [
- -58,
- -2
- ],
- [
- -5,
- 12
- ],
- [
- -15,
- 3
- ],
- [
- -24,
- 4
- ],
- [
- -1,
- 1
- ],
- [
- 7,
- -42
- ],
- [
- 0,
- -36
- ],
- [
- -27,
- 0
- ],
- [
- -30,
- 0
- ],
- [
- -30,
- 0
- ],
- [
- -30,
- 0
- ],
- [
- -30,
- 0
- ],
- [
- -30,
- 0
- ],
- [
- -30,
- 0
- ],
- [
- -34,
- 0
- ]
- ],
- [
- [
- 6108,
- 4816
- ],
- [
- 9,
- 35
- ],
- [
- 8,
- 10
- ],
- [
- 4,
- 2
- ],
- [
- 8,
- -7
- ],
- [
- 4,
- -2
- ],
- [
- 10,
- 12
- ],
- [
- 8,
- 37
- ],
- [
- 4,
- 38
- ],
- [
- 2,
- 41
- ],
- [
- -6,
- 32
- ]
- ],
- [
- [
- 6910,
- 5860
- ],
- [
- 9,
- 13
- ],
- [
- 10,
- 2
- ],
- [
- 9,
- -14
- ],
- [
- 11,
- -4
- ],
- [
- 15,
- 7
- ],
- [
- 13,
- -5
- ],
- [
- 13,
- -16
- ],
- [
- 12,
- -30
- ],
- [
- 11,
- -45
- ],
- [
- 19,
- -26
- ],
- [
- 29,
- -10
- ],
- [
- 21,
- -18
- ],
- [
- 13,
- -24
- ],
- [
- 11,
- -8
- ],
- [
- 12,
- 13
- ],
- [
- 14,
- 7
- ],
- [
- 13,
- -8
- ],
- [
- 18,
- -21
- ],
- [
- 27,
- 4
- ],
- [
- 35,
- 31
- ],
- [
- 21,
- -2
- ],
- [
- 6,
- -33
- ],
- [
- 15,
- -35
- ],
- [
- 24,
- -37
- ],
- [
- 1,
- -1
- ]
- ],
- [
- [
- 5702,
- 1997
- ],
- [
- -7,
- -6
- ],
- [
- -28,
- 35
- ],
- [
- -2,
- 15
- ],
- [
- 14,
- 14
- ],
- [
- 9,
- -2
- ],
- [
- 13,
- -17
- ],
- [
- 5,
- -5
- ],
- [
- 3,
- -7
- ],
- [
- -2,
- -12
- ],
- [
- -5,
- -15
- ]
- ],
- [
- [
- 6205,
- 2082
- ],
- [
- -9,
- -21
- ],
- [
- 0,
- 8
- ],
- [
- 7,
- 21
- ],
- [
- 5,
- 9
- ],
- [
- -3,
- -17
- ]
- ],
- [
- [
- 6216,
- 2121
- ],
- [
- -5,
- -13
- ],
- [
- 5,
- 61
- ],
- [
- -7,
- 52
- ],
- [
- 7,
- -23
- ],
- [
- 2,
- -27
- ],
- [
- -2,
- -50
- ]
- ],
- [
- [
- 6147,
- 2232
- ],
- [
- 1,
- -19
- ],
- [
- -9,
- 9
- ],
- [
- -12,
- 1
- ],
- [
- 5,
- 7
- ],
- [
- 4,
- 6
- ],
- [
- 2,
- 7
- ],
- [
- 16,
- 23
- ],
- [
- -5,
- -17
- ],
- [
- -2,
- -17
- ]
- ],
- [
- [
- 6096,
- 2276
- ],
- [
- -12,
- -11
- ],
- [
- -63,
- 41
- ],
- [
- -16,
- 34
- ],
- [
- -14,
- 7
- ],
- [
- -17,
- 4
- ],
- [
- -19,
- -41
- ],
- [
- -14,
- -55
- ],
- [
- 22,
- -31
- ],
- [
- 19,
- -14
- ],
- [
- 32,
- 12
- ],
- [
- 17,
- 27
- ],
- [
- 14,
- -1
- ],
- [
- 7,
- 5
- ],
- [
- 6,
- 14
- ],
- [
- 12,
- -11
- ],
- [
- 1,
- -11
- ],
- [
- -9,
- -15
- ],
- [
- -11,
- -14
- ],
- [
- -6,
- -15
- ],
- [
- 12,
- -31
- ],
- [
- 19,
- -11
- ],
- [
- 8,
- 5
- ],
- [
- 4,
- 35
- ],
- [
- 12,
- 22
- ],
- [
- 16,
- -4
- ],
- [
- -2,
- -15
- ],
- [
- 2,
- -13
- ],
- [
- 8,
- -23
- ],
- [
- -1,
- -32
- ],
- [
- 1,
- -8
- ],
- [
- -17,
- -15
- ],
- [
- -13,
- -5
- ],
- [
- -11,
- -19
- ],
- [
- 6,
- -11
- ],
- [
- -11,
- -9
- ],
- [
- -7,
- 4
- ],
- [
- -3,
- -4
- ],
- [
- -2,
- -12
- ],
- [
- -5,
- -10
- ],
- [
- 8,
- -33
- ],
- [
- 16,
- -21
- ],
- [
- 12,
- -27
- ],
- [
- 46,
- -35
- ],
- [
- 12,
- 1
- ],
- [
- 11,
- -35
- ],
- [
- 9,
- -12
- ],
- [
- 8,
- -6
- ],
- [
- -1,
- -24
- ],
- [
- -15,
- -18
- ],
- [
- -4,
- -21
- ],
- [
- -4,
- -12
- ],
- [
- -7,
- 15
- ],
- [
- -7,
- 11
- ],
- [
- -16,
- -33
- ],
- [
- -8,
- -7
- ],
- [
- 4,
- 36
- ],
- [
- -7,
- 14
- ],
- [
- -9,
- 35
- ],
- [
- -14,
- 23
- ],
- [
- -9,
- 7
- ],
- [
- -8,
- 14
- ],
- [
- -9,
- 6
- ],
- [
- -7,
- -2
- ],
- [
- -13,
- 8
- ],
- [
- -1,
- 20
- ],
- [
- -4,
- 14
- ],
- [
- -10,
- 17
- ],
- [
- -49,
- 32
- ],
- [
- 0,
- -14
- ],
- [
- 3,
- -9
- ],
- [
- 7,
- -7
- ],
- [
- 9,
- -13
- ],
- [
- -1,
- -38
- ],
- [
- -3,
- -16
- ],
- [
- -2,
- -23
- ],
- [
- -3,
- -23
- ],
- [
- -6,
- -19
- ],
- [
- -13,
- -12
- ],
- [
- -6,
- 10
- ],
- [
- -10,
- 50
- ],
- [
- -13,
- 16
- ],
- [
- -21,
- 2
- ],
- [
- -15,
- -11
- ],
- [
- -16,
- -49
- ],
- [
- -12,
- -8
- ],
- [
- -44,
- 25
- ],
- [
- -50,
- 39
- ],
- [
- 1,
- 12
- ],
- [
- 8,
- 5
- ],
- [
- 15,
- -6
- ],
- [
- -1,
- 14
- ],
- [
- -15,
- 42
- ],
- [
- -3,
- 20
- ],
- [
- 2,
- 24
- ],
- [
- -5,
- -1
- ],
- [
- -9,
- -20
- ],
- [
- -32,
- 17
- ],
- [
- -8,
- 20
- ],
- [
- -19,
- 57
- ],
- [
- -26,
- 2
- ],
- [
- -12,
- 34
- ],
- [
- -22,
- -14
- ],
- [
- -11,
- -16
- ],
- [
- -9,
- -25
- ],
- [
- 3,
- -13
- ],
- [
- 10,
- -20
- ],
- [
- -4,
- -10
- ],
- [
- -31,
- -14
- ],
- [
- -71,
- 16
- ],
- [
- -21,
- 15
- ],
- [
- -28,
- 32
- ],
- [
- -39,
- 26
- ],
- [
- -18,
- 4
- ],
- [
- -18,
- -5
- ],
- [
- -53,
- -3
- ],
- [
- -13,
- -7
- ],
- [
- -10,
- -11
- ],
- [
- -7,
- 13
- ],
- [
- -3,
- 22
- ],
- [
- 6,
- 3
- ],
- [
- 7,
- 13
- ],
- [
- 6,
- 25
- ],
- [
- 1,
- 16
- ],
- [
- -5,
- 10
- ]
- ],
- [
- [
- 5355,
- 2189
- ],
- [
- 12,
- 40
- ],
- [
- 3,
- 14
- ],
- [
- -2,
- 69
- ],
- [
- -5,
- 25
- ],
- [
- 1,
- 14
- ],
- [
- 5,
- 38
- ],
- [
- -1,
- 34
- ],
- [
- 10,
- 41
- ],
- [
- 7,
- 22
- ],
- [
- 8,
- 44
- ],
- [
- 1,
- 28
- ],
- [
- 4,
- 22
- ],
- [
- -3,
- 23
- ],
- [
- 6,
- 16
- ],
- [
- -4,
- 24
- ],
- [
- -1,
- 30
- ],
- [
- -6,
- 12
- ],
- [
- -12,
- 46
- ],
- [
- 0,
- 20
- ],
- [
- -13,
- 42
- ],
- [
- 0,
- 15
- ],
- [
- -12,
- 22
- ],
- [
- -2,
- 14
- ],
- [
- -1,
- 59
- ],
- [
- -4,
- 17
- ],
- [
- -10,
- 34
- ],
- [
- -24,
- 49
- ],
- [
- 0,
- 51
- ],
- [
- 0,
- 51
- ],
- [
- 0,
- 51
- ],
- [
- 0,
- 51
- ],
- [
- 0,
- 51
- ],
- [
- 0,
- 51
- ],
- [
- 1,
- 51
- ],
- [
- 0,
- 51
- ]
- ],
- [
- [
- 5813,
- 3413
- ],
- [
- 1,
- -20
- ],
- [
- 9,
- -12
- ],
- [
- 0,
- -21
- ],
- [
- -7,
- -31
- ],
- [
- 0,
- -21
- ],
- [
- 7,
- -12
- ],
- [
- 0,
- -13
- ],
- [
- -8,
- -13
- ],
- [
- -2,
- -15
- ],
- [
- 6,
- -15
- ],
- [
- 3,
- -18
- ],
- [
- -1,
- -21
- ],
- [
- 8,
- -27
- ],
- [
- 12,
- -17
- ],
- [
- 8,
- -20
- ],
- [
- 1,
- -11
- ],
- [
- 0,
- -11
- ],
- [
- -2,
- -15
- ],
- [
- -9,
- -22
- ],
- [
- -8,
- -16
- ],
- [
- -5,
- -6
- ],
- [
- -2,
- -11
- ],
- [
- -1,
- -23
- ],
- [
- -11,
- -30
- ],
- [
- -22,
- -35
- ],
- [
- -15,
- -45
- ],
- [
- -7,
- -53
- ],
- [
- -8,
- -35
- ],
- [
- -8,
- -14
- ],
- [
- -4,
- -28
- ],
- [
- 0,
- -42
- ],
- [
- -5,
- -23
- ],
- [
- -11,
- -5
- ],
- [
- -2,
- -24
- ],
- [
- 6,
- -43
- ],
- [
- -2,
- -18
- ],
- [
- -8,
- -14
- ],
- [
- 0,
- -12
- ],
- [
- 41,
- 0
- ],
- [
- 42,
- 0
- ],
- [
- 41,
- 0
- ],
- [
- 42,
- 0
- ],
- [
- 42,
- 0
- ],
- [
- 41,
- 0
- ],
- [
- 42,
- 0
- ],
- [
- 41,
- 0
- ],
- [
- -5,
- -46
- ],
- [
- -12,
- -63
- ],
- [
- 0,
- -16
- ],
- [
- 3,
- -20
- ],
- [
- 0,
- -12
- ],
- [
- 4,
- -17
- ],
- [
- 10,
- -17
- ],
- [
- 9,
- -26
- ],
- [
- 8,
- -45
- ],
- [
- 2,
- -22
- ],
- [
- 6,
- -29
- ],
- [
- 4,
- -6
- ],
- [
- 4,
- -3
- ],
- [
- 5,
- -3
- ]
- ],
- [
- [
- 9481,
- 6735
- ],
- [
- -13,
- -6
- ],
- [
- -31,
- 15
- ],
- [
- 25,
- 12
- ],
- [
- 4,
- 4
- ],
- [
- 4,
- 19
- ],
- [
- 0,
- 9
- ],
- [
- 10,
- -40
- ],
- [
- 1,
- -13
- ]
- ],
- [
- [
- 9389,
- 6780
- ],
- [
- -48,
- -20
- ],
- [
- -8,
- 13
- ],
- [
- 12,
- 6
- ],
- [
- 15,
- 30
- ],
- [
- 10,
- 3
- ],
- [
- 16,
- -17
- ],
- [
- 3,
- -15
- ]
- ],
- [
- [
- 9263,
- 6913
- ],
- [
- -6,
- 18
- ],
- [
- -6,
- 9
- ],
- [
- -6,
- 10
- ],
- [
- 0,
- 15
- ],
- [
- 0,
- 22
- ],
- [
- -7,
- 5
- ],
- [
- -1,
- 28
- ],
- [
- 0,
- 18
- ],
- [
- -13,
- -1
- ],
- [
- -11,
- 0
- ],
- [
- -17,
- 0
- ],
- [
- -18,
- -1
- ],
- [
- -13,
- 0
- ]
- ],
- [
- [
- 8874,
- 7053
- ],
- [
- -4,
- 10
- ],
- [
- 5,
- 34
- ],
- [
- 6,
- 34
- ],
- [
- 5,
- 34
- ],
- [
- 6,
- 34
- ],
- [
- 5,
- 33
- ],
- [
- 6,
- 34
- ],
- [
- 5,
- 34
- ],
- [
- 6,
- 34
- ]
- ],
- [
- [
- 8914,
- 7334
- ],
- [
- 17,
- -1
- ],
- [
- 17,
- -1
- ],
- [
- 17,
- -1
- ],
- [
- 17,
- -2
- ],
- [
- 17,
- -1
- ],
- [
- 17,
- -1
- ],
- [
- 17,
- -1
- ],
- [
- 17,
- -1
- ]
- ],
- [
- [
- 9050,
- 7325
- ],
- [
- 24,
- -1
- ],
- [
- 25,
- -2
- ],
- [
- 25,
- -1
- ],
- [
- 24,
- -2
- ],
- [
- 25,
- -1
- ],
- [
- 25,
- -1
- ],
- [
- 24,
- -2
- ],
- [
- 25,
- -1
- ],
- [
- 15,
- 11
- ],
- [
- 18,
- 31
- ],
- [
- 11,
- 7
- ],
- [
- 17,
- 19
- ],
- [
- 9,
- 4
- ],
- [
- 20,
- -2
- ]
- ],
- [
- [
- 9337,
- 7384
- ],
- [
- -4,
- -21
- ],
- [
- 5,
- -20
- ],
- [
- 4,
- -22
- ],
- [
- 8,
- -21
- ],
- [
- 6,
- -1
- ],
- [
- 8,
- 3
- ],
- [
- 5,
- -1
- ],
- [
- 3,
- -8
- ],
- [
- -1,
- -11
- ],
- [
- -8,
- -3
- ],
- [
- -16,
- -18
- ],
- [
- -14,
- -8
- ],
- [
- -7,
- -22
- ],
- [
- -10,
- -26
- ],
- [
- -20,
- -41
- ],
- [
- 8,
- -12
- ],
- [
- 31,
- -14
- ],
- [
- 14,
- -15
- ],
- [
- 21,
- -76
- ],
- [
- -5,
- -7
- ],
- [
- -2,
- -14
- ],
- [
- 19,
- -20
- ],
- [
- 6,
- -54
- ],
- [
- 15,
- -19
- ],
- [
- 23,
- -11
- ],
- [
- 28,
- 16
- ],
- [
- 23,
- 23
- ],
- [
- -1,
- 19
- ],
- [
- -15,
- 43
- ],
- [
- -3,
- 20
- ],
- [
- -11,
- 13
- ],
- [
- -4,
- -11
- ],
- [
- -7,
- 15
- ],
- [
- -1,
- 8
- ],
- [
- 7,
- 4
- ],
- [
- 7,
- -2
- ],
- [
- 9,
- -8
- ],
- [
- 23,
- -47
- ],
- [
- 6,
- -61
- ],
- [
- 2,
- -40
- ],
- [
- -3,
- -13
- ],
- [
- -7,
- 3
- ],
- [
- -12,
- -3
- ],
- [
- -60,
- -20
- ],
- [
- -13,
- -18
- ],
- [
- -31,
- -20
- ],
- [
- -2,
- 10
- ],
- [
- 3,
- 20
- ],
- [
- -2,
- 41
- ],
- [
- -6,
- 2
- ],
- [
- -48,
- -67
- ],
- [
- -18,
- -4
- ],
- [
- -15,
- -20
- ],
- [
- -4,
- 11
- ],
- [
- -3,
- 50
- ],
- [
- 10,
- 43
- ],
- [
- -5,
- -1
- ],
- [
- -10,
- -15
- ]
- ],
- [
- [
- 8572,
- 5436
- ],
- [
- -5,
- -1
- ]
- ],
- [
- [
- 8567,
- 5435
- ],
- [
- 5,
- 14
- ],
- [
- 15,
- 68
- ],
- [
- 7,
- 23
- ],
- [
- -7,
- -47
- ],
- [
- -11,
- -44
- ],
- [
- -4,
- -13
- ]
- ],
- [
- [
- 8604,
- 5603
- ],
- [
- 0,
- -11
- ],
- [
- -2,
- -18
- ],
- [
- -4,
- -7
- ],
- [
- 0,
- 18
- ],
- [
- -3,
- 6
- ],
- [
- -4,
- -7
- ],
- [
- -3,
- -9
- ],
- [
- -2,
- -35
- ],
- [
- -3,
- -17
- ],
- [
- -11,
- -5
- ],
- [
- -12,
- -46
- ],
- [
- -10,
- -26
- ],
- [
- -4,
- -16
- ]
- ],
- [
- [
- 8546,
- 5430
- ],
- [
- -16,
- -4
- ],
- [
- -26,
- -6
- ],
- [
- -7,
- -19
- ]
- ],
- [
- [
- 8497,
- 5401
- ],
- [
- -13,
- 8
- ],
- [
- -20,
- 0
- ],
- [
- 3,
- 24
- ],
- [
- 6,
- 22
- ],
- [
- -10,
- 21
- ],
- [
- -6,
- 3
- ],
- [
- -7,
- 9
- ],
- [
- 8,
- 18
- ],
- [
- 3,
- 19
- ],
- [
- -2,
- 23
- ],
- [
- 3,
- 18
- ],
- [
- -5,
- -3
- ],
- [
- -8,
- -18
- ],
- [
- -6,
- -8
- ],
- [
- -3,
- 17
- ],
- [
- -3,
- -4
- ],
- [
- -3,
- -11
- ],
- [
- -5,
- -6
- ],
- [
- -11,
- 15
- ],
- [
- -17,
- 17
- ],
- [
- -9,
- 31
- ],
- [
- -5,
- 23
- ],
- [
- 5,
- 43
- ],
- [
- 11,
- 7
- ],
- [
- 15,
- -7
- ],
- [
- 20,
- 0
- ],
- [
- -3,
- 10
- ],
- [
- -7,
- -2
- ],
- [
- -21,
- 35
- ],
- [
- -6,
- 20
- ],
- [
- -11,
- 6
- ],
- [
- -6,
- -20
- ],
- [
- -5,
- -5
- ],
- [
- 7,
- 43
- ],
- [
- 9,
- 2
- ],
- [
- 14,
- 12
- ],
- [
- -4,
- 26
- ],
- [
- -9,
- 11
- ],
- [
- -16,
- -14
- ],
- [
- 1,
- 18
- ],
- [
- 3,
- 22
- ],
- [
- 11,
- 0
- ],
- [
- 11,
- -7
- ],
- [
- 8,
- 37
- ],
- [
- 1,
- 16
- ],
- [
- -15,
- -24
- ],
- [
- -3,
- 52
- ],
- [
- 14,
- 50
- ],
- [
- 14,
- 21
- ],
- [
- 17,
- 0
- ],
- [
- 17,
- 3
- ],
- [
- -11,
- 9
- ],
- [
- -11,
- 5
- ],
- [
- 9,
- 20
- ],
- [
- 7,
- 3
- ],
- [
- 7,
- 17
- ],
- [
- -17,
- -2
- ],
- [
- 2,
- 32
- ],
- [
- -8,
- -6
- ],
- [
- -10,
- -3
- ],
- [
- -4,
- -14
- ],
- [
- 1,
- -23
- ],
- [
- -3,
- -15
- ],
- [
- -8,
- -12
- ],
- [
- -13,
- -9
- ],
- [
- -1,
- 16
- ],
- [
- -4,
- 7
- ],
- [
- -2,
- -34
- ],
- [
- -3,
- -12
- ],
- [
- -10,
- 32
- ],
- [
- -2,
- -6
- ],
- [
- 0,
- -9
- ],
- [
- -2,
- -17
- ],
- [
- -9,
- -8
- ],
- [
- 1,
- -20
- ],
- [
- -3,
- -12
- ],
- [
- -26,
- 18
- ],
- [
- -1,
- -6
- ],
- [
- 15,
- -38
- ],
- [
- 11,
- -14
- ],
- [
- 1,
- -21
- ],
- [
- -9,
- -17
- ],
- [
- -13,
- 15
- ],
- [
- -2,
- -1
- ],
- [
- 7,
- -26
- ],
- [
- 4,
- -22
- ],
- [
- -4,
- -19
- ],
- [
- 0,
- -23
- ],
- [
- -1,
- -22
- ],
- [
- -2,
- -18
- ],
- [
- 6,
- -85
- ],
- [
- 7,
- -23
- ],
- [
- 8,
- -22
- ],
- [
- 3,
- -20
- ],
- [
- -7,
- -3
- ],
- [
- -13,
- 17
- ],
- [
- -10,
- 12
- ],
- [
- -13,
- 42
- ],
- [
- -2,
- 16
- ],
- [
- -4,
- 13
- ],
- [
- 2,
- -30
- ],
- [
- 5,
- -33
- ],
- [
- 40,
- -75
- ],
- [
- 7,
- -29
- ],
- [
- 6,
- -22
- ],
- [
- -1,
- -22
- ],
- [
- -11,
- 15
- ],
- [
- -9,
- 20
- ],
- [
- -24,
- 22
- ],
- [
- -30,
- 14
- ],
- [
- -18,
- 51
- ],
- [
- 0,
- -21
- ],
- [
- -3,
- -18
- ],
- [
- -11,
- 22
- ],
- [
- -6,
- 19
- ],
- [
- -3,
- 20
- ],
- [
- -13,
- -1
- ],
- [
- -13,
- -18
- ],
- [
- -14,
- 4
- ],
- [
- -1,
- 35
- ],
- [
- 3,
- 19
- ],
- [
- 15,
- 44
- ],
- [
- 14,
- 22
- ],
- [
- 6,
- 29
- ],
- [
- -2,
- 45
- ]
- ],
- [
- [
- 8243,
- 5800
- ],
- [
- -11,
- 10
- ],
- [
- -20,
- 34
- ],
- [
- -31,
- 24
- ],
- [
- -4,
- 12
- ],
- [
- 0,
- 13
- ],
- [
- 5,
- 19
- ],
- [
- -10,
- 18
- ],
- [
- -23,
- 17
- ],
- [
- -10,
- 15
- ]
- ],
- [
- [
- 8139,
- 5962
- ],
- [
- -3,
- 3
- ],
- [
- -1,
- 19
- ],
- [
- -3,
- 12
- ],
- [
- -5,
- 5
- ],
- [
- -1,
- 8
- ],
- [
- 3,
- 10
- ],
- [
- -3,
- 12
- ],
- [
- -9,
- 13
- ],
- [
- -4,
- 11
- ],
- [
- 3,
- 9
- ],
- [
- -4,
- 5
- ],
- [
- -13,
- -1
- ],
- [
- -12,
- 9
- ],
- [
- -13,
- 19
- ],
- [
- -14,
- 3
- ],
- [
- -25,
- -19
- ],
- [
- -14,
- -4
- ],
- [
- -6,
- -11
- ],
- [
- -3,
- -18
- ],
- [
- -7,
- -9
- ],
- [
- -13,
- -1
- ],
- [
- -2,
- 1
- ],
- [
- -16,
- 6
- ],
- [
- -11,
- 11
- ],
- [
- -2,
- 5
- ],
- [
- 1,
- 10
- ],
- [
- -2,
- 4
- ],
- [
- -3,
- 1
- ],
- [
- -4,
- -6
- ],
- [
- -3,
- -17
- ],
- [
- -27,
- -47
- ],
- [
- -13,
- 10
- ],
- [
- -5,
- -1
- ],
- [
- -38,
- -66
- ],
- [
- -11,
- -10
- ],
- [
- -22,
- -30
- ],
- [
- 0,
- 51
- ],
- [
- 0,
- 52
- ],
- [
- 1,
- 51
- ],
- [
- 0,
- 52
- ]
- ],
- [
- [
- 7835,
- 6114
- ],
- [
- 40,
- 0
- ],
- [
- 40,
- 0
- ],
- [
- 40,
- 0
- ],
- [
- 40,
- 0
- ],
- [
- 40,
- 0
- ],
- [
- 40,
- 0
- ],
- [
- 40,
- 0
- ],
- [
- 40,
- 0
- ],
- [
- 40,
- 0
- ],
- [
- 40,
- 0
- ],
- [
- 40,
- 0
- ],
- [
- 40,
- 0
- ],
- [
- 40,
- 0
- ],
- [
- 40,
- 0
- ],
- [
- 40,
- 0
- ],
- [
- 40,
- 0
- ]
- ],
- [
- [
- 9716,
- 7915
- ],
- [
- -7,
- -8
- ],
- [
- -7,
- 3
- ],
- [
- 0,
- 20
- ],
- [
- 2,
- 7
- ],
- [
- 2,
- 3
- ],
- [
- 4,
- -6
- ],
- [
- 6,
- -19
- ]
- ],
- [
- [
- 9791,
- 7970
- ],
- [
- -10,
- -8
- ],
- [
- -11,
- 4
- ],
- [
- 0,
- -21
- ],
- [
- -1,
- -8
- ],
- [
- -12,
- 11
- ],
- [
- -5,
- 7
- ],
- [
- 1,
- 28
- ],
- [
- 10,
- 27
- ],
- [
- 9,
- 10
- ],
- [
- 10,
- -7
- ],
- [
- 8,
- -30
- ],
- [
- 1,
- -13
- ]
- ],
- [
- [
- 9350,
- 7462
- ],
- [
- -14,
- 38
- ],
- [
- -3,
- 30
- ],
- [
- -15,
- 36
- ],
- [
- -6,
- 24
- ],
- [
- -3,
- 28
- ],
- [
- 1,
- 30
- ],
- [
- -1,
- 45
- ],
- [
- -1,
- 44
- ],
- [
- -2,
- 45
- ],
- [
- -1,
- 45
- ],
- [
- -1,
- 44
- ],
- [
- -2,
- 45
- ],
- [
- -1,
- 44
- ],
- [
- -1,
- 45
- ],
- [
- -2,
- 45
- ],
- [
- -1,
- 44
- ],
- [
- -1,
- 45
- ],
- [
- -2,
- 45
- ],
- [
- -1,
- 44
- ],
- [
- -1,
- 45
- ],
- [
- -2,
- 45
- ],
- [
- -1,
- 40
- ]
- ],
- [
- [
- 9289,
- 8358
- ],
- [
- 4,
- 6
- ],
- [
- 11,
- 11
- ],
- [
- 7,
- -2
- ],
- [
- 6,
- -17
- ],
- [
- 5,
- -11
- ],
- [
- 5,
- 3
- ],
- [
- 5,
- 16
- ],
- [
- 0,
- 23
- ],
- [
- 7,
- 15
- ],
- [
- 8,
- 3
- ],
- [
- 7,
- -1
- ],
- [
- 4,
- 8
- ],
- [
- -1,
- 11
- ],
- [
- -2,
- 17
- ],
- [
- 0,
- 21
- ],
- [
- 19,
- 38
- ],
- [
- 22,
- 25
- ],
- [
- 8,
- 12
- ],
- [
- 2,
- 26
- ],
- [
- 13,
- 27
- ],
- [
- 7,
- 15
- ],
- [
- 1,
- 13
- ],
- [
- -3,
- 17
- ],
- [
- 0,
- 31
- ],
- [
- 5,
- 37
- ],
- [
- 5,
- 41
- ],
- [
- 12,
- 37
- ],
- [
- 19,
- 40
- ],
- [
- 5,
- 52
- ],
- [
- 6,
- 55
- ],
- [
- 23,
- 54
- ],
- [
- 27,
- 62
- ],
- [
- 15,
- 34
- ],
- [
- 28,
- 64
- ],
- [
- 19,
- 45
- ],
- [
- 10,
- 21
- ],
- [
- 10,
- 24
- ],
- [
- 17,
- -7
- ],
- [
- 17,
- -8
- ],
- [
- -3,
- -35
- ],
- [
- 2,
- -18
- ],
- [
- 1,
- -8
- ],
- [
- 8,
- -15
- ],
- [
- 11,
- -10
- ],
- [
- 9,
- -4
- ],
- [
- 10,
- 1
- ],
- [
- 28,
- 20
- ],
- [
- 32,
- 13
- ],
- [
- 18,
- 12
- ],
- [
- 4,
- 11
- ],
- [
- 8,
- 4
- ],
- [
- 13,
- -3
- ],
- [
- 24,
- -29
- ],
- [
- 28,
- -43
- ],
- [
- 22,
- -34
- ],
- [
- 1,
- -59
- ],
- [
- 0,
- -63
- ],
- [
- 1,
- -66
- ],
- [
- 0,
- -47
- ],
- [
- 0,
- -65
- ],
- [
- 1,
- -52
- ],
- [
- 1,
- -67
- ],
- [
- 0,
- -36
- ],
- [
- 3,
- -11
- ],
- [
- -2,
- -14
- ],
- [
- -1,
- -7
- ],
- [
- 0,
- -5
- ],
- [
- 2,
- -8
- ],
- [
- -1,
- -9
- ],
- [
- -2,
- -9
- ],
- [
- -2,
- -11
- ],
- [
- 0,
- -6
- ],
- [
- -11,
- -6
- ],
- [
- 15,
- -28
- ],
- [
- 26,
- -27
- ],
- [
- 20,
- -5
- ],
- [
- 11,
- 7
- ],
- [
- 3,
- -2
- ],
- [
- 3,
- -15
- ],
- [
- -2,
- -14
- ],
- [
- -5,
- -7
- ],
- [
- -6,
- -5
- ],
- [
- -1,
- -11
- ],
- [
- 3,
- -11
- ],
- [
- 4,
- -10
- ],
- [
- 5,
- -18
- ],
- [
- -2,
- -15
- ],
- [
- -4,
- -13
- ],
- [
- -2,
- -13
- ],
- [
- 3,
- -11
- ],
- [
- 10,
- -15
- ],
- [
- 5,
- -15
- ],
- [
- 9,
- -8
- ],
- [
- 4,
- 6
- ],
- [
- 4,
- 7
- ],
- [
- 4,
- 6
- ],
- [
- 6,
- -3
- ],
- [
- 7,
- -5
- ],
- [
- 8,
- -5
- ],
- [
- -1,
- -12
- ],
- [
- 5,
- -21
- ],
- [
- 4,
- -39
- ],
- [
- -6,
- -18
- ],
- [
- 1,
- -24
- ],
- [
- 16,
- -7
- ],
- [
- 4,
- -7
- ],
- [
- 1,
- -9
- ],
- [
- -35,
- -62
- ],
- [
- -30,
- 9
- ],
- [
- -17,
- -16
- ],
- [
- -17,
- -5
- ],
- [
- -7,
- -27
- ],
- [
- -9,
- -6
- ],
- [
- -13,
- 2
- ],
- [
- -11,
- 7
- ],
- [
- -9,
- -4
- ],
- [
- -11,
- -49
- ],
- [
- -10,
- 4
- ],
- [
- -4,
- -17
- ],
- [
- -5,
- -8
- ],
- [
- -7,
- -7
- ],
- [
- -7,
- 22
- ],
- [
- -4,
- 21
- ],
- [
- -6,
- 5
- ],
- [
- -8,
- 5
- ],
- [
- -8,
- 0
- ],
- [
- -6,
- -3
- ],
- [
- -6,
- -14
- ],
- [
- -10,
- -11
- ],
- [
- -8,
- 9
- ],
- [
- -6,
- 16
- ],
- [
- -5,
- -25
- ],
- [
- -7,
- -26
- ],
- [
- 1,
- -31
- ],
- [
- -3,
- -18
- ],
- [
- -7,
- 4
- ],
- [
- -6,
- 16
- ],
- [
- -20,
- 13
- ],
- [
- -15,
- -1
- ],
- [
- 3,
- 17
- ],
- [
- 15,
- 25
- ],
- [
- -5,
- 4
- ],
- [
- -7,
- -3
- ],
- [
- -3,
- 3
- ],
- [
- 5,
- 23
- ],
- [
- 0,
- 24
- ],
- [
- -6,
- -8
- ],
- [
- -8,
- -26
- ],
- [
- -20,
- -21
- ],
- [
- 1,
- -34
- ],
- [
- -19,
- -71
- ],
- [
- -1,
- -30
- ],
- [
- -11,
- -24
- ],
- [
- -16,
- -21
- ],
- [
- -20,
- 6
- ],
- [
- -16,
- -18
- ],
- [
- -8,
- -21
- ],
- [
- -7,
- -3
- ],
- [
- -3,
- 26
- ],
- [
- -3,
- 8
- ],
- [
- -6,
- -38
- ],
- [
- -6,
- -3
- ],
- [
- -2,
- 28
- ],
- [
- -3,
- 18
- ],
- [
- -8,
- -16
- ],
- [
- -5,
- -41
- ],
- [
- -6,
- 3
- ],
- [
- -1,
- 16
- ],
- [
- -4,
- 4
- ],
- [
- -2,
- -17
- ],
- [
- 2,
- -25
- ],
- [
- -3,
- -13
- ],
- [
- -5,
- 7
- ],
- [
- -6,
- 12
- ],
- [
- -9,
- -9
- ],
- [
- -8,
- -4
- ],
- [
- -1,
- 12
- ],
- [
- 2,
- 15
- ],
- [
- -17,
- -8
- ],
- [
- -20,
- -28
- ],
- [
- -16,
- -38
- ],
- [
- 6,
- -6
- ],
- [
- 6,
- -12
- ],
- [
- -27,
- -59
- ],
- [
- -28,
- -53
- ],
- [
- -21,
- -86
- ],
- [
- -9,
- -10
- ],
- [
- -7,
- -16
- ]
- ],
- [
- [
- 6710,
- 8280
- ],
- [
- -2,
- -5
- ],
- [
- -5,
- 0
- ],
- [
- -4,
- 6
- ],
- [
- -4,
- 17
- ],
- [
- 1,
- 4
- ],
- [
- 10,
- -2
- ],
- [
- 3,
- -8
- ],
- [
- 1,
- -12
- ]
- ],
- [
- [
- 6783,
- 8482
- ],
- [
- -6,
- -2
- ],
- [
- -4,
- 5
- ],
- [
- 0,
- 18
- ],
- [
- 6,
- 33
- ],
- [
- 6,
- 15
- ],
- [
- 8,
- -6
- ],
- [
- -1,
- -4
- ],
- [
- 1,
- -35
- ],
- [
- -2,
- -15
- ],
- [
- -8,
- -9
- ]
- ],
- [
- [
- 7146,
- 6928
- ],
- [
- -1,
- -2
- ],
- [
- -58,
- -4
- ],
- [
- -58,
- -4
- ],
- [
- -57,
- -3
- ],
- [
- -58,
- -4
- ]
- ],
- [
- [
- 6556,
- 6935
- ],
- [
- 11,
- 11
- ],
- [
- 19,
- 26
- ],
- [
- 10,
- 23
- ],
- [
- 10,
- 31
- ],
- [
- 9,
- 38
- ],
- [
- 20,
- 57
- ],
- [
- 9,
- 35
- ],
- [
- 10,
- 43
- ],
- [
- 7,
- 46
- ],
- [
- 4,
- 48
- ],
- [
- 2,
- 49
- ],
- [
- 0,
- 52
- ],
- [
- -5,
- 51
- ],
- [
- -9,
- 52
- ],
- [
- -5,
- 27
- ],
- [
- -1,
- 7
- ],
- [
- -17,
- 67
- ],
- [
- -18,
- 92
- ],
- [
- 0,
- 8
- ],
- [
- 17,
- 56
- ],
- [
- 1,
- 7
- ],
- [
- -2,
- 45
- ],
- [
- -4,
- 22
- ],
- [
- -9,
- 30
- ],
- [
- 1,
- 8
- ],
- [
- 18,
- 39
- ],
- [
- 10,
- 29
- ],
- [
- 10,
- 36
- ],
- [
- 7,
- 41
- ],
- [
- 3,
- 47
- ],
- [
- -1,
- 32
- ],
- [
- -3,
- 16
- ],
- [
- 1,
- 12
- ],
- [
- 3,
- 8
- ],
- [
- 20,
- 12
- ],
- [
- 6,
- 18
- ],
- [
- 2,
- 33
- ],
- [
- 4,
- 16
- ],
- [
- 6,
- 0
- ],
- [
- 6,
- 7
- ],
- [
- 6,
- 14
- ],
- [
- 7,
- 4
- ],
- [
- 9,
- -6
- ],
- [
- 13,
- 20
- ],
- [
- 16,
- 47
- ],
- [
- 13,
- 26
- ],
- [
- 9,
- 5
- ],
- [
- 1,
- -4
- ],
- [
- -5,
- -14
- ],
- [
- -2,
- -15
- ],
- [
- 2,
- -17
- ],
- [
- -1,
- -16
- ],
- [
- -5,
- -22
- ],
- [
- 3,
- -7
- ],
- [
- -7,
- -36
- ],
- [
- 0,
- -17
- ],
- [
- 4,
- -14
- ],
- [
- 5,
- 5
- ],
- [
- 6,
- 23
- ],
- [
- 2,
- 12
- ],
- [
- -3,
- 2
- ],
- [
- 1,
- 9
- ],
- [
- 4,
- 18
- ],
- [
- 4,
- 9
- ],
- [
- 3,
- -1
- ],
- [
- 1,
- -10
- ],
- [
- -1,
- -19
- ],
- [
- -10,
- -43
- ],
- [
- -2,
- -14
- ],
- [
- 3,
- -4
- ],
- [
- 11,
- 28
- ],
- [
- 9,
- 44
- ],
- [
- 7,
- 33
- ],
- [
- 2,
- 19
- ],
- [
- -3,
- 47
- ],
- [
- 1,
- 19
- ],
- [
- 3,
- 14
- ],
- [
- 9,
- 15
- ],
- [
- 17,
- 17
- ],
- [
- 17,
- 9
- ],
- [
- 16,
- 1
- ],
- [
- 11,
- 4
- ],
- [
- 7,
- 8
- ],
- [
- -2,
- 7
- ],
- [
- -11,
- 5
- ],
- [
- -9,
- 10
- ],
- [
- -5,
- 16
- ],
- [
- -2,
- 19
- ],
- [
- 2,
- 21
- ],
- [
- 7,
- 21
- ],
- [
- 12,
- 20
- ],
- [
- 3,
- 15
- ],
- [
- -4,
- 9
- ],
- [
- 5,
- 3
- ],
- [
- 15,
- -2
- ],
- [
- 10,
- 2
- ],
- [
- 6,
- 8
- ],
- [
- 14,
- -8
- ],
- [
- 22,
- -25
- ],
- [
- 21,
- -14
- ],
- [
- 20,
- -5
- ],
- [
- 15,
- -8
- ],
- [
- 9,
- -14
- ],
- [
- 7,
- -15
- ],
- [
- 4,
- -16
- ],
- [
- 9,
- -10
- ],
- [
- 15,
- -2
- ],
- [
- 12,
- -7
- ],
- [
- 9,
- -12
- ],
- [
- 47,
- -31
- ],
- [
- 20,
- -16
- ],
- [
- 11,
- -16
- ],
- [
- 3,
- -11
- ],
- [
- -1,
- -10
- ],
- [
- 2,
- -11
- ],
- [
- 8,
- -21
- ],
- [
- 3,
- -2
- ],
- [
- 2,
- -10
- ],
- [
- 0,
- -18
- ],
- [
- 3,
- -13
- ],
- [
- 4,
- -6
- ],
- [
- -3,
- -3
- ],
- [
- -14,
- 11
- ],
- [
- -9,
- -3
- ],
- [
- -3,
- -14
- ],
- [
- -1,
- -13
- ],
- [
- 3,
- -12
- ],
- [
- 18,
- -38
- ],
- [
- 5,
- -33
- ],
- [
- 1,
- -41
- ],
- [
- -2,
- -16
- ],
- [
- -2,
- -35
- ],
- [
- -2,
- -55
- ],
- [
- 0,
- -19
- ],
- [
- -6,
- -18
- ],
- [
- -17,
- -26
- ],
- [
- 0,
- 5
- ],
- [
- -4,
- 1
- ],
- [
- -5,
- -4
- ],
- [
- -6,
- -22
- ],
- [
- -5,
- -41
- ],
- [
- -6,
- -22
- ],
- [
- -8,
- -4
- ],
- [
- -4,
- -5
- ],
- [
- -2,
- -9
- ],
- [
- -8,
- -5
- ],
- [
- -14,
- -3
- ],
- [
- -10,
- -13
- ],
- [
- -7,
- -35
- ],
- [
- 0,
- -16
- ],
- [
- -4,
- -21
- ],
- [
- 1,
- -18
- ],
- [
- 4,
- -15
- ],
- [
- 11,
- -15
- ],
- [
- 20,
- -15
- ],
- [
- 11,
- -2
- ],
- [
- 9,
- 6
- ],
- [
- 8,
- 24
- ],
- [
- 8,
- 10
- ],
- [
- 10,
- 4
- ],
- [
- 4,
- 11
- ],
- [
- 16,
- 49
- ],
- [
- 0,
- 11
- ],
- [
- -6,
- 4
- ],
- [
- 1,
- 3
- ],
- [
- 8,
- 2
- ],
- [
- 6,
- 6
- ],
- [
- 6,
- 11
- ],
- [
- 10,
- 9
- ],
- [
- 24,
- 13
- ],
- [
- 13,
- 14
- ],
- [
- 8,
- 2
- ],
- [
- 12,
- -7
- ],
- [
- 16,
- -18
- ],
- [
- 12,
- -26
- ],
- [
- 9,
- -34
- ],
- [
- 12,
- -89
- ],
- [
- 14,
- -143
- ],
- [
- 9,
- -80
- ],
- [
- 6,
- -17
- ],
- [
- 2,
- -8
- ],
- [
- -12,
- -112
- ],
- [
- -10,
- -46
- ],
- [
- -17,
- -27
- ],
- [
- 1,
- 6
- ],
- [
- 1,
- 8
- ],
- [
- 0,
- 27
- ],
- [
- -3,
- 10
- ],
- [
- -7,
- 5
- ],
- [
- -8,
- -3
- ],
- [
- -9,
- -10
- ],
- [
- -3,
- -11
- ],
- [
- 4,
- -10
- ],
- [
- -2,
- -10
- ],
- [
- -8,
- -8
- ],
- [
- -5,
- -20
- ],
- [
- -3,
- -31
- ],
- [
- -3,
- -19
- ],
- [
- -4,
- -8
- ],
- [
- -16,
- -11
- ],
- [
- -8,
- -10
- ],
- [
- -7,
- -15
- ],
- [
- -6,
- -23
- ],
- [
- -6,
- -33
- ],
- [
- -2,
- -25
- ],
- [
- 2,
- -14
- ],
- [
- -5,
- -9
- ],
- [
- -9,
- -17
- ],
- [
- -2,
- -6
- ],
- [
- 1,
- -10
- ],
- [
- -2,
- -4
- ],
- [
- -4,
- 0
- ],
- [
- -4,
- -5
- ],
- [
- -8,
- -17
- ],
- [
- -13,
- -46
- ],
- [
- -3,
- -9
- ]
- ],
- [
- [
- 6955,
- 8570
- ],
- [
- 23,
- -6
- ],
- [
- 2,
- 3
- ],
- [
- 6,
- -11
- ],
- [
- 1,
- -9
- ],
- [
- -3,
- -7
- ],
- [
- -3,
- -4
- ],
- [
- -5,
- -1
- ],
- [
- -8,
- 8
- ],
- [
- -14,
- 20
- ],
- [
- 1,
- 7
- ]
- ],
- [
- [
- 7138,
- 8647
- ],
- [
- 2,
- -9
- ],
- [
- -5,
- -13
- ],
- [
- -12,
- -7
- ],
- [
- -24,
- 1
- ],
- [
- -16,
- 5
- ],
- [
- -8,
- 9
- ],
- [
- -1,
- 5
- ],
- [
- 0,
- 11
- ],
- [
- 4,
- 1
- ],
- [
- 5,
- -6
- ],
- [
- 8,
- 2
- ],
- [
- 10,
- 11
- ],
- [
- 6,
- 8
- ],
- [
- 0,
- 5
- ],
- [
- -3,
- 10
- ],
- [
- 3,
- 5
- ],
- [
- 13,
- -4
- ],
- [
- 5,
- -7
- ],
- [
- 9,
- -23
- ],
- [
- 4,
- -4
- ]
- ],
- [
- [
- 7031,
- 8741
- ],
- [
- -2,
- -2
- ],
- [
- -9,
- 15
- ],
- [
- -2,
- 10
- ],
- [
- 1,
- 8
- ],
- [
- 4,
- 1
- ],
- [
- 5,
- -8
- ],
- [
- 3,
- -8
- ],
- [
- 1,
- -10
- ],
- [
- -1,
- -6
- ]
- ],
- [
- [
- 7029,
- 8788
- ],
- [
- 0,
- -9
- ],
- [
- -5,
- 2
- ],
- [
- -5,
- 6
- ],
- [
- -3,
- 10
- ],
- [
- -5,
- 24
- ],
- [
- -7,
- 17
- ],
- [
- 11,
- 20
- ],
- [
- 6,
- 2
- ],
- [
- 6,
- -4
- ],
- [
- 1,
- -12
- ],
- [
- -5,
- -18
- ],
- [
- 1,
- -19
- ],
- [
- 5,
- -19
- ]
- ],
- [
- [
- 6427,
- 8283
- ],
- [
- -8,
- 5
- ],
- [
- -7,
- 16
- ],
- [
- -4,
- 16
- ],
- [
- -1,
- 17
- ],
- [
- 10,
- 41
- ],
- [
- 1,
- 7
- ],
- [
- -1,
- 4
- ],
- [
- -5,
- 4
- ],
- [
- -13,
- -7
- ],
- [
- -13,
- -2
- ],
- [
- -4,
- 3
- ],
- [
- -1,
- 7
- ],
- [
- 0,
- 11
- ],
- [
- 2,
- 14
- ],
- [
- 8,
- 24
- ],
- [
- 0,
- 23
- ],
- [
- 4,
- 13
- ],
- [
- -4,
- 25
- ],
- [
- 1,
- 11
- ],
- [
- -5,
- 13
- ],
- [
- -15,
- 17
- ],
- [
- -33,
- 23
- ],
- [
- 3,
- 25
- ],
- [
- -1,
- 11
- ],
- [
- -8,
- 16
- ],
- [
- -35,
- 19
- ],
- [
- -24,
- 8
- ],
- [
- -24,
- 1
- ],
- [
- -17,
- 6
- ],
- [
- -19,
- 3
- ],
- [
- -12,
- 11
- ],
- [
- -12,
- 11
- ],
- [
- -13,
- 12
- ],
- [
- -12,
- 11
- ],
- [
- -21,
- 10
- ],
- [
- -22,
- 9
- ],
- [
- -22,
- 10
- ],
- [
- -21,
- 10
- ],
- [
- -22,
- 9
- ],
- [
- -22,
- 10
- ],
- [
- -21,
- 10
- ],
- [
- -22,
- 9
- ],
- [
- -5,
- 17
- ],
- [
- -5,
- 17
- ],
- [
- -4,
- 17
- ],
- [
- -5,
- 17
- ],
- [
- -10,
- 7
- ],
- [
- -6,
- 4
- ],
- [
- -3,
- 9
- ],
- [
- -9,
- -4
- ],
- [
- -4,
- 15
- ],
- [
- 1,
- 3
- ]
- ],
- [
- [
- 5942,
- 8881
- ],
- [
- 11,
- 4
- ],
- [
- 33,
- 20
- ],
- [
- 28,
- 26
- ],
- [
- 23,
- 30
- ],
- [
- 28,
- 19
- ],
- [
- 35,
- 6
- ],
- [
- 24,
- 11
- ],
- [
- 15,
- 15
- ],
- [
- 20,
- 28
- ],
- [
- 11,
- 8
- ],
- [
- 14,
- 3
- ],
- [
- 11,
- 11
- ],
- [
- 7,
- 19
- ],
- [
- 13,
- 22
- ],
- [
- 20,
- 25
- ],
- [
- 11,
- 10
- ],
- [
- 3,
- -5
- ],
- [
- 1,
- -8
- ],
- [
- -1,
- -13
- ],
- [
- 5,
- -10
- ],
- [
- 11,
- -8
- ],
- [
- 5,
- -11
- ],
- [
- -1,
- -13
- ],
- [
- 3,
- -11
- ],
- [
- 6,
- -9
- ],
- [
- 2,
- -20
- ],
- [
- -3,
- -31
- ],
- [
- 0,
- -20
- ],
- [
- 2,
- -9
- ],
- [
- 2,
- -5
- ],
- [
- 4,
- 5
- ],
- [
- 5,
- 11
- ],
- [
- 2,
- 6
- ],
- [
- 1,
- 7
- ],
- [
- 29,
- 31
- ],
- [
- 5,
- 2
- ],
- [
- 10,
- -8
- ],
- [
- 43,
- -12
- ],
- [
- 18,
- -8
- ],
- [
- 18,
- -17
- ],
- [
- 6,
- -7
- ],
- [
- 22,
- -58
- ],
- [
- 10,
- -22
- ],
- [
- 6,
- -7
- ],
- [
- 4,
- -8
- ],
- [
- 3,
- -21
- ],
- [
- 3,
- -6
- ],
- [
- 33,
- -4
- ],
- [
- 14,
- 3
- ],
- [
- 9,
- 9
- ],
- [
- 10,
- -6
- ],
- [
- 11,
- -18
- ],
- [
- 11,
- -6
- ],
- [
- 11,
- 9
- ],
- [
- 10,
- -1
- ],
- [
- 9,
- -9
- ],
- [
- 4,
- -6
- ],
- [
- 3,
- 0
- ],
- [
- 19,
- 29
- ],
- [
- 22,
- 26
- ],
- [
- 29,
- 27
- ],
- [
- 18,
- 13
- ],
- [
- 4,
- -4
- ],
- [
- 28,
- 10
- ],
- [
- 24,
- 1
- ],
- [
- 33,
- -6
- ],
- [
- 30,
- 6
- ],
- [
- 28,
- 19
- ],
- [
- 25,
- 10
- ],
- [
- 21,
- 2
- ],
- [
- 8,
- -5
- ],
- [
- -5,
- -12
- ],
- [
- -3,
- -22
- ],
- [
- 0,
- -30
- ],
- [
- -2,
- -19
- ],
- [
- -3,
- -8
- ],
- [
- -1,
- -8
- ],
- [
- 3,
- -7
- ],
- [
- 21,
- -5
- ],
- [
- 11,
- -10
- ],
- [
- 12,
- 0
- ],
- [
- 14,
- 9
- ],
- [
- 11,
- -4
- ],
- [
- 7,
- -16
- ],
- [
- 11,
- -2
- ],
- [
- 11,
- 11
- ],
- [
- 7,
- 11
- ],
- [
- 7,
- 4
- ],
- [
- 5,
- 1
- ],
- [
- 5,
- -5
- ],
- [
- 4,
- -9
- ],
- [
- 9,
- -25
- ],
- [
- 4,
- -17
- ],
- [
- 3,
- -25
- ],
- [
- 2,
- -8
- ],
- [
- 0,
- -15
- ],
- [
- -6,
- -10
- ],
- [
- -2,
- -7
- ],
- [
- 4,
- -8
- ],
- [
- 20,
- -2
- ],
- [
- 9,
- -8
- ],
- [
- 4,
- -9
- ],
- [
- -2,
- -9
- ],
- [
- 1,
- -11
- ],
- [
- 5,
- -10
- ],
- [
- 16,
- -17
- ],
- [
- 4,
- -8
- ],
- [
- -1,
- -8
- ],
- [
- -5,
- -5
- ],
- [
- -8,
- -3
- ],
- [
- -63,
- 16
- ],
- [
- -19,
- 2
- ],
- [
- -2,
- -5
- ],
- [
- -2,
- -1
- ],
- [
- -3,
- 1
- ],
- [
- -5,
- 1
- ],
- [
- -3,
- 3
- ],
- [
- -2,
- 11
- ],
- [
- -6,
- 6
- ],
- [
- -8,
- 3
- ],
- [
- -8,
- -8
- ],
- [
- -9,
- -30
- ],
- [
- 2,
- -6
- ],
- [
- -2,
- -19
- ],
- [
- 2,
- -6
- ],
- [
- 0,
- -4
- ],
- [
- -2,
- -4
- ],
- [
- -5,
- 1
- ],
- [
- -8,
- 4
- ],
- [
- -29,
- 46
- ],
- [
- -23,
- 24
- ],
- [
- -27,
- 16
- ],
- [
- -22,
- 9
- ],
- [
- -16,
- -1
- ],
- [
- -13,
- -12
- ],
- [
- -11,
- -23
- ],
- [
- -16,
- -13
- ],
- [
- -22,
- -3
- ],
- [
- -12,
- -7
- ],
- [
- -2,
- -9
- ],
- [
- -7,
- 0
- ],
- [
- -14,
- 9
- ],
- [
- -15,
- 2
- ],
- [
- -15,
- -3
- ],
- [
- -11,
- -10
- ],
- [
- -11,
- -28
- ],
- [
- -2,
- -14
- ],
- [
- -9,
- -12
- ],
- [
- -22,
- -20
- ],
- [
- -1,
- -7
- ],
- [
- -12,
- -21
- ],
- [
- -3,
- -12
- ],
- [
- 0,
- -12
- ],
- [
- -4,
- 1
- ],
- [
- -8,
- 13
- ],
- [
- 0,
- 18
- ],
- [
- 7,
- 22
- ],
- [
- 6,
- 11
- ],
- [
- 6,
- -1
- ],
- [
- 4,
- 10
- ],
- [
- 1,
- 20
- ],
- [
- -2,
- 11
- ],
- [
- -11,
- -4
- ],
- [
- -6,
- -9
- ],
- [
- -7,
- -1
- ],
- [
- -9,
- 4
- ],
- [
- -8,
- -11
- ],
- [
- -7,
- -27
- ],
- [
- -8,
- -17
- ],
- [
- -9,
- -9
- ],
- [
- -6,
- 9
- ],
- [
- -3,
- 27
- ],
- [
- 0,
- 21
- ],
- [
- 3,
- 26
- ],
- [
- -2,
- 5
- ],
- [
- -4,
- -9
- ],
- [
- -6,
- -21
- ],
- [
- -7,
- -46
- ],
- [
- -5,
- -15
- ],
- [
- -7,
- -6
- ],
- [
- -11,
- -28
- ],
- [
- -15,
- -50
- ],
- [
- -17,
- -48
- ],
- [
- -18,
- -47
- ],
- [
- -12,
- -25
- ],
- [
- -3,
- -3
- ],
- [
- -2,
- -9
- ],
- [
- -1,
- -19
- ]
- ],
- [
- [
- 6321,
- 9129
- ],
- [
- -4,
- -13
- ],
- [
- 1,
- -7
- ],
- [
- -21,
- -35
- ],
- [
- -8,
- -22
- ],
- [
- -6,
- -3
- ],
- [
- -5,
- 15
- ],
- [
- 0,
- 12
- ],
- [
- 5,
- 9
- ],
- [
- 5,
- 13
- ],
- [
- 1,
- 17
- ],
- [
- -2,
- 7
- ],
- [
- -7,
- -16
- ],
- [
- 4,
- -4
- ],
- [
- 1,
- -2
- ],
- [
- -1,
- -6
- ],
- [
- -24,
- 8
- ],
- [
- -8,
- 13
- ],
- [
- 2,
- 17
- ],
- [
- 8,
- 22
- ],
- [
- 29,
- 47
- ],
- [
- 13,
- 13
- ],
- [
- 36,
- 21
- ],
- [
- 20,
- 5
- ],
- [
- 20,
- 0
- ],
- [
- 15,
- -7
- ],
- [
- 9,
- -14
- ],
- [
- -9,
- -9
- ],
- [
- -40,
- -7
- ],
- [
- -1,
- -3
- ],
- [
- 8,
- -7
- ],
- [
- 1,
- -5
- ],
- [
- -7,
- -14
- ],
- [
- -35,
- -45
- ]
- ],
- [
- [
- 6194,
- 9418
- ],
- [
- -1,
- -7
- ],
- [
- 6,
- -2
- ],
- [
- -1,
- -3
- ],
- [
- -7,
- -6
- ],
- [
- -19,
- -13
- ],
- [
- -13,
- -4
- ],
- [
- -7,
- 5
- ],
- [
- -1,
- 8
- ],
- [
- 6,
- 12
- ],
- [
- 0,
- 6
- ],
- [
- -6,
- 0
- ],
- [
- 1,
- 5
- ],
- [
- 8,
- 9
- ],
- [
- 68,
- 61
- ],
- [
- 29,
- 22
- ],
- [
- 16,
- 7
- ],
- [
- 2,
- -3
- ],
- [
- -17,
- -23
- ],
- [
- -2,
- -9
- ],
- [
- 0,
- -7
- ],
- [
- -5,
- -12
- ],
- [
- -50,
- -42
- ],
- [
- -7,
- -4
- ]
- ],
- [
- [
- 5648,
- 8949
- ],
- [
- -4,
- 0
- ],
- [
- -12,
- -22
- ],
- [
- -5,
- -15
- ],
- [
- -11,
- -4
- ],
- [
- 0,
- -58
- ],
- [
- 0,
- -58
- ],
- [
- 0,
- -58
- ],
- [
- -1,
- -58
- ],
- [
- -5,
- -6
- ],
- [
- -7,
- -14
- ],
- [
- -10,
- -3
- ],
- [
- -47,
- -48
- ],
- [
- -8,
- -14
- ],
- [
- -8,
- -31
- ],
- [
- -15,
- -36
- ],
- [
- -4,
- -20
- ],
- [
- 1,
- -25
- ],
- [
- 23,
- -21
- ],
- [
- 9,
- -20
- ],
- [
- 4,
- -24
- ],
- [
- -1,
- -22
- ],
- [
- -11,
- -41
- ],
- [
- -3,
- -17
- ],
- [
- 2,
- -50
- ],
- [
- -6,
- -16
- ],
- [
- 5,
- -41
- ],
- [
- 0,
- -14
- ],
- [
- -4,
- -45
- ],
- [
- -2,
- -13
- ],
- [
- 4,
- -24
- ],
- [
- 1,
- -2
- ],
- [
- 22,
- -33
- ],
- [
- 18,
- -18
- ],
- [
- 17,
- -5
- ],
- [
- 13,
- -14
- ],
- [
- 9,
- -22
- ],
- [
- 13,
- -14
- ],
- [
- 15,
- -7
- ],
- [
- 17,
- -19
- ],
- [
- 24,
- -44
- ],
- [
- 13,
- -38
- ],
- [
- 21,
- -28
- ],
- [
- 35,
- -29
- ],
- [
- 23,
- -25
- ],
- [
- 11,
- -22
- ],
- [
- 7,
- -56
- ],
- [
- 6,
- -119
- ]
- ],
- [
- [
- 4895,
- 7636
- ],
- [
- 0,
- 90
- ],
- [
- 0,
- 90
- ],
- [
- 0,
- 91
- ],
- [
- 0,
- 90
- ],
- [
- 0,
- 91
- ],
- [
- 0,
- 90
- ],
- [
- 0,
- 90
- ],
- [
- 0,
- 91
- ],
- [
- -14,
- 30
- ],
- [
- -28,
- 24
- ],
- [
- -7,
- 15
- ],
- [
- -14,
- 36
- ],
- [
- -5,
- 15
- ],
- [
- -1,
- 12
- ],
- [
- 6,
- 14
- ],
- [
- 26,
- 38
- ],
- [
- 9,
- 18
- ],
- [
- 4,
- 18
- ],
- [
- 6,
- 40
- ]
- ],
- [
- [
- 4877,
- 8619
- ],
- [
- -3,
- 31
- ],
- [
- 2,
- 48
- ],
- [
- -5,
- 36
- ],
- [
- -1,
- 17
- ],
- [
- -4,
- 23
- ],
- [
- -19,
- 58
- ],
- [
- -5,
- 48
- ],
- [
- -5,
- 23
- ],
- [
- -2,
- 60
- ],
- [
- 1,
- 17
- ],
- [
- 4,
- 32
- ],
- [
- -8,
- 22
- ],
- [
- -2,
- 18
- ],
- [
- -4,
- 143
- ],
- [
- -2,
- 20
- ],
- [
- 1,
- 67
- ],
- [
- -16,
- 69
- ],
- [
- -7,
- 24
- ],
- [
- -4,
- 29
- ],
- [
- 1,
- 13
- ],
- [
- -13,
- 48
- ],
- [
- -8,
- 52
- ],
- [
- 1,
- 46
- ],
- [
- -3,
- 34
- ],
- [
- 1,
- 27
- ],
- [
- -2,
- 40
- ],
- [
- 3,
- 22
- ],
- [
- 0,
- 36
- ],
- [
- -17,
- 125
- ]
- ],
- [
- [
- 4761,
- 9847
- ],
- [
- 21,
- 0
- ],
- [
- 74,
- 0
- ],
- [
- 74,
- 0
- ],
- [
- 74,
- 0
- ],
- [
- 74,
- 0
- ],
- [
- 40,
- 0
- ],
- [
- 1,
- 85
- ],
- [
- 1,
- 67
- ],
- [
- 37,
- -8
- ],
- [
- 11,
- -12
- ],
- [
- 4,
- -6
- ],
- [
- -1,
- -19
- ],
- [
- 3,
- -56
- ],
- [
- 7,
- -47
- ],
- [
- 15,
- -56
- ],
- [
- 2,
- -22
- ],
- [
- 5,
- -14
- ],
- [
- 9,
- -13
- ],
- [
- 36,
- -15
- ],
- [
- 62,
- -18
- ],
- [
- 35,
- -21
- ],
- [
- 9,
- -24
- ],
- [
- 16,
- -9
- ],
- [
- 25,
- 5
- ],
- [
- 18,
- 9
- ],
- [
- 14,
- 23
- ],
- [
- 21,
- 5
- ],
- [
- 18,
- -2
- ],
- [
- 18,
- -2
- ],
- [
- 10,
- -3
- ],
- [
- 27,
- -18
- ],
- [
- 18,
- -14
- ],
- [
- 26,
- -27
- ],
- [
- 14,
- -12
- ],
- [
- 7,
- -28
- ],
- [
- 8,
- -36
- ],
- [
- 12,
- 0
- ],
- [
- 8,
- 21
- ],
- [
- 22,
- 4
- ],
- [
- 29,
- -15
- ],
- [
- 26,
- -42
- ],
- [
- 36,
- -37
- ],
- [
- 23,
- -19
- ],
- [
- 22,
- 0
- ],
- [
- 29,
- 19
- ],
- [
- 31,
- 35
- ],
- [
- 22,
- 7
- ],
- [
- 13,
- -4
- ],
- [
- 7,
- -28
- ],
- [
- 10,
- -10
- ],
- [
- 23,
- 3
- ],
- [
- 50,
- -6
- ],
- [
- 40,
- 8
- ],
- [
- 9,
- -16
- ],
- [
- 8,
- -25
- ],
- [
- 16,
- -8
- ],
- [
- 22,
- 8
- ],
- [
- 34,
- -6
- ],
- [
- -5,
- -4
- ],
- [
- -5,
- 1
- ],
- [
- -7,
- -6
- ],
- [
- -8,
- -13
- ],
- [
- -19,
- -19
- ],
- [
- -29,
- -24
- ],
- [
- -35,
- -22
- ],
- [
- -69,
- -39
- ],
- [
- -43,
- -42
- ],
- [
- -19,
- -24
- ],
- [
- -75,
- -125
- ],
- [
- -44,
- -66
- ],
- [
- -73,
- -93
- ],
- [
- -7,
- -12
- ],
- [
- 0,
- -11
- ]
- ],
- [
- [
- 6108,
- 4816
- ],
- [
- 0,
- -1
- ],
- [
- -4,
- -4
- ],
- [
- -2,
- 4
- ],
- [
- -1,
- 2
- ]
- ],
- [
- [
- 6089,
- 4816
- ],
- [
- 3,
- -30
- ],
- [
- -2,
- -21
- ],
- [
- -9,
- -9
- ],
- [
- -1,
- -12
- ],
- [
- 5,
- -14
- ],
- [
- 0,
- -6
- ],
- [
- -2,
- -5
- ],
- [
- -6,
- -2
- ],
- [
- -4,
- -3
- ],
- [
- -4,
- -11
- ],
- [
- 7,
- -21
- ],
- [
- -1,
- -25
- ],
- [
- -10,
- -30
- ],
- [
- -1,
- -12
- ]
- ],
- [
- [
- 5213,
- 4816
- ],
- [
- 0,
- 51
- ],
- [
- 0,
- 50
- ],
- [
- 0,
- 50
- ],
- [
- 0,
- 51
- ]
- ],
- [
- [
- 5086,
- 6226
- ],
- [
- -2,
- 4
- ],
- [
- -13,
- 34
- ],
- [
- -5,
- 41
- ],
- [
- -10,
- 27
- ],
- [
- -15,
- 12
- ],
- [
- -9,
- 28
- ],
- [
- -4,
- 41
- ],
- [
- -10,
- 42
- ],
- [
- -4,
- 13
- ]
- ],
- [
- [
- 6262,
- 2285
- ],
- [
- -2,
- -4
- ],
- [
- -15,
- 8
- ],
- [
- -9,
- 8
- ],
- [
- -2,
- 7
- ],
- [
- 26,
- -14
- ],
- [
- 2,
- -5
- ]
- ],
- [
- [
- 6290,
- 2347
- ],
- [
- -51,
- -6
- ],
- [
- -22,
- 21
- ],
- [
- -9,
- 4
- ],
- [
- -6,
- -1
- ],
- [
- -26,
- -19
- ],
- [
- -29,
- -14
- ],
- [
- -7,
- 4
- ],
- [
- -10,
- 1
- ],
- [
- -21,
- -49
- ],
- [
- -13,
- -12
- ]
- ],
- [
- [
- 5962,
- 4212
- ],
- [
- 44,
- 0
- ],
- [
- 46,
- 0
- ],
- [
- 46,
- 0
- ],
- [
- 46,
- 0
- ],
- [
- 46,
- 0
- ],
- [
- 46,
- 0
- ],
- [
- 46,
- -1
- ],
- [
- 47,
- 0
- ]
- ],
- [
- [
- 3586,
- 8619
- ],
- [
- 0,
- -94
- ],
- [
- 0,
- -93
- ],
- [
- 0,
- -94
- ],
- [
- 1,
- -93
- ],
- [
- 0,
- -2
- ],
- [
- 0,
- -1
- ],
- [
- 0,
- -1
- ],
- [
- 0,
- -1
- ],
- [
- -2,
- 0
- ],
- [
- -1,
- 0
- ],
- [
- -2,
- 0
- ],
- [
- -1,
- 0
- ]
- ],
- [
- [
- 3581,
- 8240
- ],
- [
- -38,
- 0
- ],
- [
- -38,
- 0
- ],
- [
- -38,
- 0
- ],
- [
- -38,
- 0
- ],
- [
- -38,
- 0
- ],
- [
- -38,
- 0
- ],
- [
- -38,
- 0
- ],
- [
- -38,
- 0
- ],
- [
- -38,
- 0
- ],
- [
- -38,
- 0
- ],
- [
- -38,
- 0
- ],
- [
- -38,
- 0
- ],
- [
- -38,
- 0
- ],
- [
- -38,
- 0
- ],
- [
- -37,
- 0
- ],
- [
- -38,
- 0
- ],
- [
- -38,
- 0
- ],
- [
- -38,
- 0
- ],
- [
- -38,
- 0
- ],
- [
- -38,
- 0
- ],
- [
- -38,
- 0
- ],
- [
- -38,
- 0
- ],
- [
- -38,
- 0
- ],
- [
- -38,
- 0
- ],
- [
- -38,
- 0
- ],
- [
- -38,
- 0
- ],
- [
- -38,
- 0
- ],
- [
- -38,
- 0
- ],
- [
- -38,
- 0
- ],
- [
- -38,
- 0
- ],
- [
- -38,
- 0
- ],
- [
- -38,
- 0
- ],
- [
- 0,
- -51
- ],
- [
- 0,
- -51
- ],
- [
- 0,
- -50
- ],
- [
- 0,
- -51
- ]
- ],
- [
- [
- 1500,
- 9847
- ],
- [
- 32,
- 0
- ],
- [
- 74,
- 0
- ],
- [
- 74,
- 0
- ],
- [
- 74,
- 0
- ],
- [
- 74,
- 0
- ],
- [
- 16,
- 0
- ],
- [
- 58,
- 0
- ],
- [
- 73,
- 0
- ],
- [
- 74,
- 0
- ],
- [
- 74,
- 0
- ],
- [
- 74,
- 0
- ],
- [
- 74,
- 0
- ],
- [
- 74,
- 0
- ],
- [
- 74,
- 0
- ],
- [
- 73,
- 0
- ],
- [
- 56,
- 0
- ],
- [
- 18,
- 0
- ],
- [
- 74,
- 0
- ],
- [
- 74,
- 0
- ],
- [
- 74,
- 0
- ],
- [
- 74,
- 0
- ],
- [
- 74,
- 0
- ],
- [
- 73,
- 0
- ],
- [
- 74,
- 0
- ],
- [
- 74,
- 0
- ],
- [
- 74,
- 0
- ],
- [
- 74,
- 0
- ],
- [
- 74,
- 0
- ],
- [
- 74,
- 0
- ],
- [
- 74,
- 0
- ],
- [
- 55,
- 0
- ]
- ],
- [
- [
- 3582,
- 9847
- ],
- [
- 0,
- -76
- ],
- [
- 0,
- -77
- ],
- [
- 0,
- -77
- ],
- [
- 1,
- -76
- ],
- [
- 0,
- -77
- ],
- [
- 0,
- -77
- ],
- [
- 0,
- -77
- ],
- [
- 1,
- -77
- ],
- [
- 0,
- -76
- ],
- [
- 0,
- -77
- ],
- [
- 0,
- -77
- ],
- [
- 1,
- -77
- ],
- [
- 0,
- -77
- ],
- [
- 0,
- -76
- ],
- [
- 0,
- -77
- ],
- [
- 1,
- -77
- ]
- ],
- [
- [
- 8343,
- 4073
- ],
- [
- -4,
- -1
- ],
- [
- -7,
- 4
- ],
- [
- -9,
- 9
- ],
- [
- -2,
- 6
- ],
- [
- 9,
- -2
- ],
- [
- 13,
- -16
- ]
- ],
- [
- [
- 8350,
- 4068
- ],
- [
- -4,
- -5
- ],
- [
- 16,
- 51
- ],
- [
- 31,
- 63
- ],
- [
- 9,
- 10
- ],
- [
- -26,
- -54
- ],
- [
- -26,
- -65
- ]
- ],
- [
- [
- 8476,
- 4288
- ],
- [
- -32,
- -28
- ],
- [
- -4,
- 1
- ],
- [
- 21,
- 21
- ],
- [
- 15,
- 6
- ]
- ],
- [
- [
- 8517,
- 4308
- ],
- [
- -24,
- -11
- ],
- [
- -2,
- 4
- ],
- [
- 27,
- 23
- ],
- [
- 8,
- 81
- ],
- [
- 2,
- 37
- ],
- [
- -4,
- 66
- ],
- [
- 0,
- 14
- ],
- [
- 4,
- -22
- ],
- [
- 4,
- -61
- ],
- [
- -2,
- -47
- ],
- [
- -7,
- -67
- ],
- [
- -6,
- -17
- ]
- ],
- [
- [
- 8501,
- 4556
- ],
- [
- -3,
- -8
- ],
- [
- -11,
- 45
- ],
- [
- 12,
- -15
- ],
- [
- 2,
- -12
- ],
- [
- 0,
- -10
- ]
- ],
- [
- [
- 8457,
- 4836
- ],
- [
- 5,
- 0
- ]
- ],
- [
- [
- 8462,
- 4836
- ],
- [
- 18,
- -129
- ],
- [
- 34,
- -141
- ],
- [
- 4,
- -24
- ],
- [
- -8,
- 21
- ],
- [
- -25,
- 93
- ],
- [
- -14,
- 68
- ],
- [
- -14,
- 112
- ]
- ],
- [
- [
- 7994,
- 3759
- ],
- [
- -25,
- 49
- ],
- [
- -24,
- 46
- ],
- [
- -23,
- 46
- ],
- [
- -24,
- 46
- ],
- [
- -23,
- 46
- ],
- [
- -23,
- 46
- ],
- [
- -24,
- 46
- ],
- [
- -23,
- 46
- ],
- [
- -25,
- 1
- ],
- [
- -24,
- 2
- ],
- [
- -25,
- 2
- ],
- [
- -24,
- 1
- ],
- [
- -25,
- 2
- ],
- [
- -24,
- 2
- ],
- [
- -24,
- 1
- ],
- [
- -25,
- 2
- ],
- [
- -1,
- 31
- ],
- [
- -1,
- 23
- ],
- [
- -15,
- 38
- ],
- [
- -9,
- 23
- ],
- [
- -19,
- -20
- ],
- [
- -1,
- 10
- ],
- [
- 1,
- 17
- ],
- [
- -2,
- 5
- ],
- [
- -6,
- 4
- ],
- [
- -27,
- 3
- ],
- [
- -27,
- 2
- ],
- [
- -28,
- 2
- ],
- [
- -27,
- 3
- ],
- [
- -28,
- 2
- ],
- [
- -27,
- 2
- ],
- [
- -28,
- 3
- ],
- [
- -27,
- 2
- ],
- [
- -7,
- 4
- ],
- [
- -12,
- -14
- ],
- [
- -32,
- -20
- ],
- [
- -16,
- -17
- ],
- [
- -6,
- 1
- ],
- [
- -28,
- -17
- ],
- [
- -28,
- -18
- ],
- [
- -3,
- 0
- ]
- ],
- [
- [
- 6996,
- 4207
- ],
- [
- 6,
- 86
- ],
- [
- 5,
- 19
- ],
- [
- 5,
- 5
- ],
- [
- 18,
- 0
- ],
- [
- 11,
- 10
- ],
- [
- 10,
- 52
- ],
- [
- 23,
- 40
- ],
- [
- 11,
- 10
- ],
- [
- 15,
- 8
- ],
- [
- 37,
- 10
- ],
- [
- 39,
- 39
- ],
- [
- 28,
- 38
- ],
- [
- 23,
- 10
- ],
- [
- 7,
- 14
- ],
- [
- 5,
- 18
- ],
- [
- 3,
- 24
- ],
- [
- 3,
- 5
- ],
- [
- 13,
- -2
- ],
- [
- 10,
- 21
- ],
- [
- 9,
- 12
- ],
- [
- 10,
- 7
- ],
- [
- 6,
- 1
- ],
- [
- 2,
- -7
- ],
- [
- 1,
- -18
- ],
- [
- 2,
- -6
- ],
- [
- 5,
- 0
- ],
- [
- 5,
- 4
- ],
- [
- 8,
- 12
- ],
- [
- 19,
- 36
- ],
- [
- 12,
- 13
- ],
- [
- 20,
- 8
- ],
- [
- 14,
- -19
- ],
- [
- 8,
- 7
- ],
- [
- 25,
- 74
- ],
- [
- 10,
- 13
- ],
- [
- 8,
- 6
- ],
- [
- 12,
- 1
- ],
- [
- 1,
- 20
- ],
- [
- 4,
- 31
- ],
- [
- 1,
- 21
- ],
- [
- 7,
- 30
- ]
- ],
- [
- [
- 7457,
- 4860
- ],
- [
- 3,
- -6
- ],
- [
- 63,
- -1
- ],
- [
- 63,
- -1
- ],
- [
- 62,
- -1
- ],
- [
- 63,
- -1
- ],
- [
- 63,
- -2
- ],
- [
- 62,
- -1
- ],
- [
- 63,
- -1
- ],
- [
- 63,
- -1
- ],
- [
- 63,
- -1
- ],
- [
- 62,
- -1
- ],
- [
- 63,
- -1
- ],
- [
- 63,
- -1
- ],
- [
- 62,
- -2
- ],
- [
- 63,
- -1
- ],
- [
- 63,
- -1
- ],
- [
- 43,
- 0
- ]
- ],
- [
- [
- 8444,
- 4837
- ],
- [
- -5,
- -32
- ],
- [
- 2,
- -18
- ],
- [
- 10,
- -18
- ],
- [
- 10,
- -47
- ],
- [
- 8,
- -62
- ],
- [
- -11,
- 25
- ],
- [
- -12,
- 14
- ],
- [
- -18,
- 10
- ],
- [
- -16,
- 18
- ],
- [
- 1,
- -26
- ],
- [
- -1,
- -28
- ],
- [
- -13,
- 9
- ],
- [
- -8,
- 9
- ],
- [
- 7,
- -30
- ],
- [
- -16,
- 9
- ],
- [
- -11,
- -2
- ],
- [
- -7,
- -26
- ],
- [
- -9,
- -16
- ],
- [
- -14,
- -5
- ],
- [
- -21,
- 24
- ],
- [
- -7,
- 29
- ],
- [
- -2,
- 33
- ],
- [
- -1,
- -39
- ],
- [
- 3,
- -40
- ],
- [
- -1,
- -31
- ],
- [
- 20,
- -5
- ],
- [
- 19,
- 5
- ],
- [
- 25,
- -1
- ],
- [
- 16,
- 5
- ],
- [
- 10,
- 10
- ],
- [
- 24,
- -8
- ],
- [
- 1,
- -37
- ],
- [
- -2,
- -37
- ],
- [
- -2,
- -39
- ],
- [
- 7,
- 0
- ],
- [
- 8,
- 13
- ],
- [
- 3,
- 70
- ],
- [
- 22,
- 25
- ],
- [
- 7,
- -1
- ],
- [
- 7,
- -23
- ],
- [
- 3,
- -23
- ],
- [
- 2,
- -31
- ],
- [
- -5,
- -48
- ],
- [
- -33,
- -56
- ],
- [
- -24,
- -51
- ],
- [
- -12,
- -11
- ],
- [
- -18,
- 6
- ],
- [
- -20,
- 13
- ],
- [
- -10,
- 3
- ],
- [
- -7,
- -4
- ],
- [
- -5,
- 16
- ],
- [
- -2,
- 29
- ],
- [
- -8,
- 9
- ],
- [
- -6,
- -1
- ],
- [
- -4,
- -31
- ],
- [
- -19,
- -8
- ],
- [
- -25,
- 12
- ],
- [
- -26,
- 26
- ],
- [
- 11,
- -28
- ],
- [
- 66,
- -51
- ],
- [
- 7,
- -10
- ],
- [
- 7,
- -14
- ],
- [
- -9,
- -23
- ],
- [
- -7,
- -25
- ],
- [
- -2,
- -19
- ],
- [
- -2,
- -13
- ],
- [
- -26,
- -33
- ],
- [
- -14,
- 6
- ],
- [
- -37,
- 60
- ],
- [
- 17,
- -52
- ],
- [
- 13,
- -22
- ],
- [
- 27,
- -12
- ],
- [
- 50,
- 19
- ],
- [
- 16,
- -21
- ],
- [
- -13,
- -38
- ],
- [
- -14,
- -26
- ],
- [
- -17,
- -3
- ],
- [
- -16,
- -7
- ],
- [
- -4,
- -18
- ],
- [
- -11,
- -1
- ],
- [
- -17,
- -1
- ],
- [
- -27,
- -2
- ],
- [
- -15,
- 4
- ],
- [
- -20,
- -37
- ],
- [
- -8,
- -5
- ],
- [
- -11,
- 7
- ],
- [
- -4,
- 30
- ],
- [
- -5,
- 14
- ],
- [
- 0,
- -56
- ],
- [
- 2,
- -15
- ],
- [
- 4,
- -11
- ],
- [
- -24,
- -30
- ],
- [
- -23,
- -38
- ],
- [
- -8,
- -10
- ],
- [
- -10,
- -19
- ],
- [
- -19,
- -55
- ],
- [
- -4,
- -40
- ],
- [
- -7,
- -44
- ],
- [
- -1,
- 20
- ],
- [
- 1,
- 33
- ],
- [
- -5,
- 39
- ],
- [
- -3,
- -71
- ],
- [
- -7,
- -33
- ],
- [
- -68,
- 3
- ],
- [
- -27,
- -17
- ]
- ],
- [
- [
- 4877,
- 8619
- ],
- [
- -40,
- 0
- ],
- [
- -41,
- 0
- ],
- [
- -40,
- 0
- ],
- [
- -41,
- 0
- ],
- [
- -40,
- 0
- ],
- [
- -40,
- 0
- ],
- [
- -41,
- 0
- ],
- [
- -40,
- 0
- ],
- [
- -40,
- 0
- ],
- [
- -41,
- 0
- ],
- [
- -40,
- 0
- ],
- [
- -40,
- 0
- ],
- [
- -41,
- 0
- ],
- [
- -40,
- 0
- ],
- [
- -40,
- 0
- ],
- [
- -41,
- 0
- ],
- [
- -40,
- 0
- ],
- [
- -40,
- 0
- ],
- [
- -41,
- 0
- ],
- [
- -40,
- 0
- ],
- [
- -41,
- 0
- ],
- [
- -40,
- 0
- ],
- [
- -40,
- 0
- ],
- [
- -41,
- 0
- ],
- [
- -40,
- 0
- ],
- [
- -40,
- 0
- ],
- [
- -41,
- 0
- ],
- [
- -40,
- 0
- ],
- [
- -40,
- 0
- ],
- [
- -41,
- 0
- ],
- [
- -40,
- 0
- ],
- [
- -40,
- 0
- ]
- ],
- [
- [
- 3582,
- 9847
- ],
- [
- 18,
- 0
- ],
- [
- 74,
- 0
- ],
- [
- 74,
- 0
- ],
- [
- 74,
- 0
- ],
- [
- 74,
- 0
- ],
- [
- 74,
- 0
- ],
- [
- 74,
- 0
- ],
- [
- 73,
- 0
- ],
- [
- 74,
- 0
- ],
- [
- 74,
- 0
- ],
- [
- 74,
- 0
- ],
- [
- 74,
- 0
- ],
- [
- 74,
- 0
- ],
- [
- 74,
- 0
- ],
- [
- 73,
- 0
- ],
- [
- 74,
- 0
- ],
- [
- 53,
- 0
- ]
- ],
- [
- [
- 3584,
- 6629
- ],
- [
- 0,
- 100
- ],
- [
- -1,
- 101
- ],
- [
- 0,
- 101
- ],
- [
- 0,
- 100
- ],
- [
- 0,
- 101
- ],
- [
- 0,
- 101
- ],
- [
- 0,
- 101
- ],
- [
- -1,
- 100
- ]
- ],
- [
- [
- 3582,
- 7434
- ],
- [
- 60,
- 0
- ],
- [
- 60,
- 0
- ],
- [
- 60,
- 0
- ],
- [
- 60,
- 0
- ],
- [
- 60,
- 0
- ],
- [
- 60,
- 0
- ],
- [
- 60,
- 0
- ],
- [
- 60,
- 0
- ],
- [
- 60,
- 0
- ],
- [
- 60,
- 0
- ],
- [
- 60,
- 0
- ],
- [
- 60,
- 0
- ],
- [
- 60,
- 0
- ],
- [
- 60,
- 0
- ],
- [
- 60,
- 0
- ],
- [
- 68,
- 0
- ],
- [
- 52,
- -60
- ],
- [
- 31,
- -19
- ],
- [
- 14,
- 18
- ],
- [
- 32,
- 10
- ],
- [
- 49,
- 3
- ],
- [
- 31,
- -8
- ],
- [
- 13,
- -20
- ],
- [
- 25,
- -21
- ],
- [
- 37,
- -24
- ],
- [
- 22,
- -25
- ],
- [
- 8,
- -28
- ],
- [
- 13,
- -18
- ],
- [
- 13,
- -5
- ]
- ],
- [
- [
- 9350,
- 7462
- ],
- [
- -8,
- -52
- ],
- [
- -5,
- -26
- ]
- ],
- [
- [
- 9050,
- 7325
- ],
- [
- -3,
- 15
- ],
- [
- -10,
- 25
- ],
- [
- -2,
- 11
- ],
- [
- 0,
- 12
- ],
- [
- 6,
- 32
- ],
- [
- 4,
- 10
- ],
- [
- 4,
- 19
- ],
- [
- 6,
- 75
- ],
- [
- 5,
- 43
- ],
- [
- 4,
- 80
- ],
- [
- 4,
- 23
- ],
- [
- 4,
- 14
- ],
- [
- 7,
- 38
- ],
- [
- 13,
- 30
- ],
- [
- 9,
- 38
- ],
- [
- 10,
- 32
- ],
- [
- 1,
- 20
- ],
- [
- 8,
- 41
- ],
- [
- 5,
- 75
- ],
- [
- 5,
- 11
- ],
- [
- 24,
- 10
- ],
- [
- 7,
- 8
- ],
- [
- 25,
- 31
- ],
- [
- 7,
- 12
- ],
- [
- 5,
- 13
- ],
- [
- 4,
- 21
- ],
- [
- 3,
- 6
- ],
- [
- 0,
- 11
- ],
- [
- -8,
- 49
- ],
- [
- -1,
- 17
- ],
- [
- 19,
- 55
- ],
- [
- -4,
- 32
- ],
- [
- 3,
- 8
- ]
- ],
- [
- [
- 9214,
- 8242
- ],
- [
- 17,
- 78
- ],
- [
- 16,
- 36
- ],
- [
- 22,
- -12
- ],
- [
- 12,
- 1
- ],
- [
- 8,
- 13
- ]
- ],
- [
- [
- 8761,
- 6097
- ],
- [
- -20,
- -61
- ],
- [
- -1,
- 12
- ],
- [
- 26,
- 75
- ],
- [
- -5,
- -26
- ]
- ],
- [
- [
- 8598,
- 6219
- ],
- [
- 9,
- 13
- ],
- [
- 20,
- 25
- ],
- [
- 30,
- 31
- ],
- [
- -42,
- 101
- ],
- [
- -10,
- 6
- ],
- [
- -11,
- 49
- ],
- [
- -13,
- 14
- ],
- [
- -3,
- 7
- ],
- [
- 0,
- 38
- ],
- [
- 1,
- 22
- ],
- [
- 2,
- 13
- ],
- [
- 11,
- 10
- ],
- [
- 6,
- 22
- ],
- [
- 0,
- 12
- ],
- [
- -8,
- 35
- ],
- [
- 0,
- 11
- ],
- [
- 16,
- 21
- ],
- [
- 20,
- 42
- ],
- [
- 12,
- 45
- ],
- [
- 5,
- 14
- ],
- [
- 6,
- 9
- ],
- [
- 14,
- 13
- ]
- ],
- [
- [
- 8663,
- 6772
- ],
- [
- 17,
- -18
- ],
- [
- 17,
- -19
- ],
- [
- 18,
- -18
- ],
- [
- 17,
- -19
- ],
- [
- 17,
- -18
- ],
- [
- 17,
- -18
- ],
- [
- 17,
- -19
- ],
- [
- 17,
- -18
- ]
- ],
- [
- [
- 8800,
- 6625
- ],
- [
- -3,
- -31
- ],
- [
- -17,
- -64
- ],
- [
- -7,
- -15
- ],
- [
- -9,
- -13
- ],
- [
- -6,
- -5
- ],
- [
- -6,
- -11
- ],
- [
- -7,
- -16
- ],
- [
- -7,
- -32
- ],
- [
- 4,
- -29
- ],
- [
- 34,
- -10
- ],
- [
- 8,
- 9
- ],
- [
- 5,
- -21
- ],
- [
- 3,
- -29
- ],
- [
- -3,
- -32
- ],
- [
- -6,
- -32
- ],
- [
- -4,
- -39
- ],
- [
- -3,
- -61
- ],
- [
- -6,
- -54
- ],
- [
- 0,
- 17
- ],
- [
- 3,
- 66
- ],
- [
- -5,
- -7
- ],
- [
- -4,
- -15
- ],
- [
- -10,
- -86
- ],
- [
- -14,
- -45
- ],
- [
- -13,
- -31
- ],
- [
- -13,
- 5
- ],
- [
- 3,
- -25
- ],
- [
- -4,
- -13
- ],
- [
- -3,
- -27
- ],
- [
- -8,
- -18
- ],
- [
- -7,
- 1
- ],
- [
- -11,
- -12
- ],
- [
- -4,
- -9
- ],
- [
- -1,
- -19
- ],
- [
- -7,
- -16
- ],
- [
- -25,
- -83
- ],
- [
- -23,
- -24
- ],
- [
- -5,
- 4
- ],
- [
- 6,
- 39
- ],
- [
- 4,
- 39
- ],
- [
- -14,
- 18
- ],
- [
- -13,
- 9
- ],
- [
- -15,
- -2
- ],
- [
- -16,
- 31
- ],
- [
- -21,
- 23
- ],
- [
- -30,
- 60
- ],
- [
- 1,
- 17
- ],
- [
- -1,
- 28
- ],
- [
- 9,
- 45
- ],
- [
- 9,
- 31
- ],
- [
- 12,
- 16
- ],
- [
- 34,
- 16
- ],
- [
- 9,
- 25
- ],
- [
- 5,
- 21
- ]
- ],
- [
- [
- 3761,
- 4816
- ],
- [
- -8,
- 0
- ],
- [
- 0,
- -113
- ],
- [
- 0,
- -113
- ],
- [
- 0,
- -114
- ],
- [
- -1,
- -113
- ],
- [
- 0,
- -113
- ],
- [
- 0,
- -113
- ],
- [
- 0,
- -113
- ],
- [
- -1,
- -114
- ],
- [
- 0,
- -113
- ],
- [
- 0,
- -113
- ],
- [
- 0,
- -113
- ],
- [
- -1,
- -114
- ],
- [
- 0,
- -113
- ],
- [
- 0,
- -113
- ],
- [
- 0,
- -113
- ],
- [
- -1,
- -113
- ],
- [
- -39,
- 0
- ],
- [
- -39,
- 0
- ],
- [
- -38,
- 0
- ],
- [
- -39,
- -1
- ],
- [
- -39,
- 0
- ],
- [
- -39,
- 0
- ],
- [
- -39,
- 0
- ],
- [
- -39,
- 0
- ],
- [
- -39,
- 0
- ],
- [
- -39,
- 0
- ],
- [
- -39,
- 0
- ],
- [
- -39,
- 0
- ],
- [
- -39,
- 0
- ],
- [
- -39,
- 0
- ],
- [
- -39,
- 0
- ],
- [
- -39,
- 0
- ],
- [
- -1,
- 0
- ],
- [
- 18,
- -73
- ],
- [
- 21,
- -21
- ]
- ],
- [
- [
- 3164,
- 2910
- ],
- [
- -1,
- 1
- ],
- [
- -39,
- 0
- ],
- [
- -38,
- 1
- ],
- [
- -38,
- 0
- ],
- [
- -38,
- 1
- ],
- [
- -38,
- 0
- ],
- [
- -38,
- 1
- ],
- [
- -38,
- 0
- ],
- [
- -38,
- 1
- ],
- [
- 0,
- -46
- ],
- [
- 0,
- -45
- ],
- [
- 0,
- -45
- ],
- [
- -1,
- -46
- ],
- [
- -61,
- 0
- ],
- [
- -61,
- 0
- ],
- [
- -22,
- 0
- ]
- ],
- [
- [
- 3761,
- 5018
- ],
- [
- 0,
- -51
- ],
- [
- 0,
- -50
- ],
- [
- 0,
- -50
- ],
- [
- 0,
- -51
- ]
- ],
- [
- [
- 816,
- 7031
- ],
- [
- 64,
- 0
- ],
- [
- 65,
- 0
- ],
- [
- 65,
- 0
- ],
- [
- 64,
- 0
- ],
- [
- 65,
- 0
- ],
- [
- 64,
- 0
- ],
- [
- 65,
- 0
- ],
- [
- 65,
- 0
- ]
- ],
- [
- [
- 1848,
- 7031
- ],
- [
- 0,
- -63
- ],
- [
- 0,
- -62
- ],
- [
- 0,
- -63
- ],
- [
- 0,
- -63
- ],
- [
- 0,
- -63
- ],
- [
- 0,
- -63
- ],
- [
- 0,
- -63
- ],
- [
- 0,
- -63
- ],
- [
- 0,
- -63
- ],
- [
- 0,
- -63
- ],
- [
- 0,
- -62
- ],
- [
- 0,
- -63
- ],
- [
- 0,
- -63
- ],
- [
- 0,
- -63
- ],
- [
- 0,
- -63
- ],
- [
- 0,
- -63
- ],
- [
- 0,
- -63
- ],
- [
- 0,
- -63
- ],
- [
- 0,
- -63
- ],
- [
- 0,
- -62
- ],
- [
- 0,
- -63
- ],
- [
- 0,
- -63
- ],
- [
- 0,
- -63
- ],
- [
- 0,
- -63
- ],
- [
- 0,
- -63
- ],
- [
- 0,
- -63
- ],
- [
- 0,
- -63
- ],
- [
- 0,
- -63
- ],
- [
- 0,
- -62
- ],
- [
- 0,
- -63
- ],
- [
- 0,
- -63
- ],
- [
- 0,
- -63
- ]
- ],
- [
- [
- 8752,
- 6436
- ],
- [
- -9,
- -2
- ],
- [
- 9,
- 39
- ],
- [
- 15,
- 18
- ],
- [
- 5,
- -4
- ],
- [
- 1,
- -14
- ],
- [
- -3,
- -11
- ],
- [
- -10,
- -18
- ],
- [
- -8,
- -8
- ]
- ],
- [
- [
- 9042,
- 6623
- ],
- [
- -12,
- -26
- ],
- [
- 11,
- -3
- ],
- [
- 10,
- 8
- ],
- [
- 9,
- 15
- ],
- [
- 21,
- 21
- ],
- [
- 18,
- 9
- ],
- [
- 5,
- 2
- ],
- [
- 9,
- -15
- ],
- [
- 17,
- 12
- ],
- [
- 17,
- 7
- ],
- [
- -75,
- -67
- ],
- [
- -16,
- -8
- ],
- [
- -22,
- -20
- ],
- [
- -20,
- -14
- ],
- [
- -16,
- -5
- ],
- [
- -74,
- -50
- ],
- [
- -6,
- -1
- ],
- [
- -7,
- 5
- ],
- [
- -61,
- -26
- ],
- [
- -25,
- -3
- ],
- [
- -23,
- -9
- ],
- [
- 17,
- 21
- ],
- [
- 0,
- 8
- ],
- [
- -4,
- 6
- ],
- [
- -9,
- -2
- ],
- [
- -10,
- -21
- ],
- [
- -14,
- -7
- ],
- [
- -3,
- 23
- ],
- [
- 5,
- 18
- ],
- [
- 6,
- 17
- ],
- [
- 15,
- 26
- ],
- [
- 21,
- 17
- ],
- [
- 11,
- 15
- ],
- [
- 7,
- -13
- ],
- [
- 2,
- 17
- ],
- [
- 6,
- 10
- ],
- [
- 6,
- 6
- ],
- [
- 15,
- 0
- ],
- [
- 8,
- 3
- ],
- [
- 6,
- 5
- ],
- [
- 6,
- 2
- ],
- [
- 16,
- -8
- ],
- [
- 16,
- 2
- ],
- [
- 13,
- 11
- ],
- [
- 14,
- 3
- ],
- [
- 35,
- 3
- ],
- [
- 35,
- 8
- ],
- [
- 14,
- 14
- ],
- [
- 30,
- 40
- ],
- [
- 17,
- 11
- ],
- [
- -26,
- -46
- ],
- [
- -15,
- -21
- ]
- ],
- [
- [
- 7930,
- 7443
- ],
- [
- -5,
- -14
- ],
- [
- -5,
- 1
- ],
- [
- -4,
- 5
- ],
- [
- -1,
- 8
- ],
- [
- 1,
- 11
- ],
- [
- 4,
- 5
- ],
- [
- 13,
- -4
- ],
- [
- 0,
- -4
- ],
- [
- -3,
- -8
- ]
- ],
- [
- [
- 8392,
- 7832
- ],
- [
- -2,
- -1
- ],
- [
- 0,
- 9
- ],
- [
- 3,
- 5
- ],
- [
- 5,
- 3
- ],
- [
- 0,
- -4
- ],
- [
- -6,
- -12
- ]
- ],
- [
- [
- 8418,
- 7948
- ],
- [
- -5,
- -3
- ],
- [
- -1,
- 5
- ],
- [
- 1,
- 4
- ],
- [
- 4,
- 6
- ],
- [
- 8,
- 0
- ],
- [
- -1,
- -5
- ],
- [
- -6,
- -7
- ]
- ],
- [
- [
- 8896,
- 8241
- ],
- [
- 2,
- -26
- ],
- [
- -4,
- -32
- ],
- [
- 3,
- -34
- ],
- [
- -4,
- -72
- ],
- [
- 11,
- -55
- ],
- [
- -3,
- -37
- ],
- [
- 1,
- -40
- ],
- [
- -2,
- -10
- ],
- [
- -9,
- -23
- ],
- [
- -5,
- -23
- ],
- [
- -2,
- -22
- ],
- [
- 0,
- -15
- ],
- [
- 7,
- -66
- ],
- [
- 1,
- -28
- ],
- [
- 0,
- -17
- ],
- [
- -6,
- -54
- ],
- [
- -1,
- -16
- ],
- [
- 2,
- -4
- ],
- [
- 3,
- 0
- ],
- [
- 7,
- 17
- ],
- [
- 3,
- 2
- ],
- [
- 4,
- -4
- ],
- [
- 11,
- -26
- ],
- [
- -1,
- -45
- ],
- [
- 0,
- -33
- ],
- [
- -1,
- -37
- ],
- [
- 0,
- -56
- ],
- [
- -1,
- -40
- ],
- [
- 0,
- -37
- ],
- [
- -1,
- -29
- ],
- [
- -2,
- -21
- ],
- [
- 5,
- -24
- ]
- ],
- [
- [
- 8848,
- 6625
- ],
- [
- -7,
- -11
- ],
- [
- -19,
- -35
- ],
- [
- -12,
- -19
- ],
- [
- -10,
- -6
- ],
- [
- -7,
- -16
- ],
- [
- -7,
- -10
- ],
- [
- 7,
- 35
- ],
- [
- 7,
- 30
- ],
- [
- 6,
- 57
- ],
- [
- -1,
- 47
- ],
- [
- -8,
- 19
- ],
- [
- -8,
- 13
- ],
- [
- 9,
- -46
- ],
- [
- 2,
- -56
- ],
- [
- 0,
- -2
- ]
- ],
- [
- [
- 8663,
- 6772
- ],
- [
- -4,
- 15
- ],
- [
- -6,
- 12
- ],
- [
- -31,
- 20
- ],
- [
- -8,
- 14
- ],
- [
- -7,
- 18
- ],
- [
- -5,
- 22
- ],
- [
- -3,
- 24
- ],
- [
- 0,
- 18
- ],
- [
- 3,
- 21
- ],
- [
- -7,
- 14
- ],
- [
- -1,
- 13
- ],
- [
- -4,
- 9
- ],
- [
- -20,
- 16
- ],
- [
- -6,
- 21
- ],
- [
- -14,
- 21
- ],
- [
- -24,
- 0
- ],
- [
- -24,
- 0
- ],
- [
- -24,
- 0
- ],
- [
- -23,
- 0
- ],
- [
- -24,
- 0
- ],
- [
- -24,
- 0
- ],
- [
- -24,
- 1
- ],
- [
- -24,
- 0
- ],
- [
- -24,
- 0
- ],
- [
- -24,
- 0
- ],
- [
- -24,
- 0
- ],
- [
- -23,
- 0
- ],
- [
- -24,
- 0
- ],
- [
- -24,
- 0
- ],
- [
- -24,
- 0
- ],
- [
- -24,
- 0
- ],
- [
- -24,
- 0
- ],
- [
- -24,
- 0
- ],
- [
- -24,
- 0
- ],
- [
- -24,
- 0
- ],
- [
- -23,
- 0
- ],
- [
- -24,
- 0
- ],
- [
- -24,
- 0
- ],
- [
- -24,
- 0
- ],
- [
- -24,
- 0
- ],
- [
- -24,
- 0
- ],
- [
- -24,
- 0
- ],
- [
- -24,
- 0
- ],
- [
- -23,
- 0
- ],
- [
- -24,
- 0
- ],
- [
- -24,
- 0
- ],
- [
- -24,
- 0
- ],
- [
- 0,
- 55
- ],
- [
- 0,
- 54
- ],
- [
- 0,
- 2
- ]
- ],
- [
- [
- 7786,
- 7142
- ],
- [
- 10,
- 10
- ],
- [
- 33,
- 36
- ],
- [
- 17,
- 27
- ],
- [
- 17,
- 22
- ],
- [
- 19,
- 18
- ],
- [
- 14,
- 22
- ],
- [
- 11,
- 28
- ],
- [
- 12,
- 20
- ],
- [
- 13,
- 14
- ],
- [
- 7,
- 14
- ],
- [
- 1,
- 15
- ],
- [
- -2,
- 20
- ],
- [
- -6,
- 25
- ],
- [
- -1,
- 20
- ],
- [
- 4,
- 14
- ],
- [
- 1,
- 10
- ],
- [
- -2,
- 5
- ],
- [
- -27,
- 14
- ],
- [
- 1,
- 70
- ],
- [
- -1,
- 2
- ],
- [
- 2,
- 0
- ],
- [
- 63,
- 31
- ],
- [
- 40,
- 11
- ],
- [
- 49,
- 3
- ],
- [
- 58,
- -16
- ],
- [
- 23,
- -13
- ],
- [
- 14,
- -18
- ],
- [
- 17,
- -5
- ],
- [
- 19,
- 9
- ],
- [
- 26,
- 2
- ],
- [
- 33,
- -2
- ],
- [
- 18,
- -5
- ],
- [
- 2,
- -5
- ],
- [
- 2,
- 2
- ],
- [
- 2,
- 8
- ],
- [
- 9,
- 10
- ],
- [
- 25,
- 15
- ],
- [
- 4,
- -3
- ],
- [
- 5,
- 7
- ],
- [
- 7,
- 18
- ],
- [
- 12,
- 19
- ],
- [
- 19,
- 22
- ],
- [
- 17,
- 11
- ],
- [
- 15,
- 1
- ],
- [
- 10,
- 5
- ],
- [
- 5,
- 10
- ],
- [
- 1,
- 9
- ],
- [
- -2,
- 7
- ],
- [
- 1,
- 8
- ],
- [
- 1,
- 4
- ],
- [
- -1,
- 4
- ],
- [
- -2,
- 7
- ],
- [
- -1,
- 35
- ],
- [
- -3,
- 16
- ],
- [
- -4,
- 13
- ],
- [
- -5,
- 7
- ],
- [
- 0,
- 9
- ],
- [
- 9,
- 10
- ],
- [
- 0,
- -10
- ],
- [
- 2,
- -2
- ],
- [
- 4,
- 4
- ],
- [
- 10,
- 21
- ],
- [
- 1,
- 8
- ],
- [
- 7,
- 8
- ],
- [
- 5,
- 13
- ],
- [
- -6,
- 2
- ],
- [
- -13,
- -4
- ],
- [
- -3,
- 4
- ],
- [
- 7,
- 17
- ],
- [
- -1,
- 9
- ],
- [
- -2,
- 4
- ],
- [
- -4,
- 2
- ],
- [
- -15,
- -15
- ],
- [
- -4,
- -1
- ],
- [
- -1,
- 8
- ],
- [
- -7,
- 17
- ],
- [
- 20,
- 31
- ],
- [
- 70,
- 86
- ],
- [
- 7,
- 14
- ],
- [
- 3,
- 11
- ],
- [
- -2,
- 10
- ],
- [
- -2,
- 3
- ],
- [
- 1,
- 3
- ],
- [
- 67,
- 110
- ],
- [
- 39,
- 52
- ],
- [
- 32,
- 28
- ],
- [
- 24,
- 14
- ],
- [
- 16,
- -2
- ],
- [
- 9,
- 2
- ],
- [
- 8,
- 0
- ],
- [
- 41,
- 0
- ],
- [
- 72,
- 0
- ],
- [
- 72,
- 0
- ],
- [
- 42,
- 0
- ]
- ],
- [
- [
- 7655,
- 6486
- ],
- [
- -21,
- -18
- ],
- [
- -3,
- -16
- ],
- [
- 6,
- -21
- ],
- [
- 3,
- -26
- ],
- [
- 1,
- -33
- ],
- [
- -12,
- -72
- ],
- [
- -23,
- -111
- ],
- [
- -12,
- -70
- ],
- [
- -1,
- -29
- ],
- [
- -15,
- -37
- ],
- [
- -30,
- -47
- ],
- [
- -22,
- -28
- ],
- [
- -12,
- -9
- ],
- [
- -10,
- 1
- ],
- [
- -9,
- 11
- ],
- [
- -9,
- -8
- ],
- [
- -10,
- -26
- ],
- [
- -9,
- -14
- ],
- [
- -9,
- -1
- ],
- [
- -8,
- -17
- ],
- [
- -6,
- -33
- ],
- [
- -6,
- -19
- ],
- [
- -5,
- -6
- ],
- [
- -1,
- -17
- ],
- [
- 5,
- -28
- ],
- [
- -1,
- -11
- ],
- [
- -2,
- 0
- ],
- [
- -3,
- 2
- ],
- [
- -6,
- -7
- ],
- [
- -6,
- -16
- ],
- [
- -3,
- 0
- ],
- [
- -2,
- 3
- ],
- [
- -1,
- 21
- ],
- [
- -6,
- 14
- ],
- [
- -9,
- 9
- ],
- [
- -12,
- -19
- ],
- [
- -16,
- -48
- ],
- [
- -7,
- -31
- ],
- [
- 3,
- -21
- ],
- [
- 1,
- -31
- ],
- [
- -4,
- -13
- ],
- [
- -8,
- -5
- ],
- [
- -7,
- -17
- ],
- [
- -5,
- -29
- ],
- [
- -12,
- -18
- ],
- [
- -19,
- -8
- ],
- [
- -20,
- 13
- ]
- ],
- [
- [
- 7146,
- 6928
- ],
- [
- 0,
- -1
- ],
- [
- 2,
- -7
- ],
- [
- 16,
- -4
- ],
- [
- 11,
- -9
- ],
- [
- 8,
- -12
- ],
- [
- 30,
- -25
- ],
- [
- 9,
- -15
- ],
- [
- 10,
- -9
- ],
- [
- 9,
- -1
- ],
- [
- 6,
- 5
- ],
- [
- 3,
- 11
- ],
- [
- 4,
- 1
- ],
- [
- 6,
- -10
- ],
- [
- 17,
- -11
- ],
- [
- 0,
- -3
- ],
- [
- -47,
- -18
- ],
- [
- -10,
- -9
- ],
- [
- 12,
- -6
- ],
- [
- 12,
- 2
- ],
- [
- 12,
- 9
- ],
- [
- 14,
- -1
- ],
- [
- 12,
- -4
- ],
- [
- 4,
- 3
- ],
- [
- 1,
- 2
- ],
- [
- 21,
- -24
- ],
- [
- 7,
- -3
- ],
- [
- 8,
- 2
- ],
- [
- 8,
- 9
- ],
- [
- 18,
- 12
- ],
- [
- 28,
- 15
- ],
- [
- 27,
- 6
- ],
- [
- 26,
- -3
- ],
- [
- 16,
- 4
- ],
- [
- 15,
- 15
- ],
- [
- 33,
- 50
- ],
- [
- 38,
- 39
- ],
- [
- 62,
- 50
- ],
- [
- 61,
- 39
- ]
- ],
- [
- [
- 7655,
- 7027
- ],
- [
- 0,
- -34
- ],
- [
- 0,
- -42
- ],
- [
- 0,
- -42
- ],
- [
- 0,
- -43
- ],
- [
- 0,
- -42
- ],
- [
- 0,
- -42
- ],
- [
- 0,
- -42
- ],
- [
- 0,
- -43
- ],
- [
- 0,
- -42
- ],
- [
- 0,
- -42
- ],
- [
- 0,
- -42
- ],
- [
- 0,
- -42
- ],
- [
- 0,
- -43
- ]
- ],
- [
- [
- 5236,
- 3667
- ],
- [
- -39,
- 21
- ],
- [
- -10,
- 13
- ],
- [
- -18,
- 15
- ],
- [
- -16,
- 30
- ],
- [
- -32,
- 37
- ],
- [
- -12,
- 9
- ],
- [
- -4,
- -1
- ],
- [
- -6,
- -18
- ],
- [
- -17,
- -15
- ],
- [
- -10,
- 0
- ],
- [
- -16,
- 5
- ],
- [
- -3,
- 5
- ],
- [
- -3,
- 11
- ],
- [
- -6,
- 8
- ],
- [
- -5,
- -6
- ],
- [
- -25,
- -16
- ],
- [
- -3,
- -11
- ],
- [
- -14,
- 0
- ],
- [
- -14,
- 8
- ],
- [
- -34,
- -25
- ],
- [
- -12,
- -19
- ],
- [
- -12,
- -7
- ],
- [
- -6,
- -18
- ],
- [
- -4,
- 2
- ],
- [
- -13,
- 23
- ],
- [
- -13,
- 7
- ],
- [
- -18,
- 23
- ],
- [
- -1,
- 20
- ],
- [
- -2,
- 3
- ],
- [
- -3,
- 2
- ],
- [
- -4,
- -2
- ],
- [
- -8,
- -17
- ],
- [
- -4,
- -4
- ],
- [
- -5,
- 0
- ],
- [
- -18,
- 12
- ],
- [
- -7,
- 21
- ],
- [
- -4,
- 6
- ],
- [
- -4,
- 1
- ],
- [
- -7,
- -6
- ],
- [
- -4,
- -23
- ],
- [
- -4,
- -6
- ],
- [
- -7,
- -4
- ],
- [
- 0,
- -11
- ],
- [
- -6,
- -32
- ],
- [
- -4,
- -6
- ],
- [
- -4,
- 1
- ],
- [
- -5,
- 8
- ],
- [
- -3,
- 11
- ],
- [
- -2,
- 10
- ],
- [
- 3,
- 25
- ],
- [
- -2,
- 8
- ],
- [
- -3,
- 3
- ],
- [
- -9,
- -12
- ],
- [
- -7,
- 0
- ],
- [
- -10,
- -11
- ],
- [
- -6,
- -4
- ],
- [
- -5,
- 3
- ],
- [
- -9,
- 19
- ],
- [
- -16,
- 12
- ],
- [
- -6,
- 23
- ],
- [
- -3,
- 6
- ],
- [
- -3,
- 2
- ],
- [
- -3,
- -1
- ],
- [
- -6,
- -7
- ],
- [
- -18,
- -30
- ],
- [
- -8,
- -9
- ],
- [
- -7,
- -2
- ],
- [
- -7,
- 3
- ],
- [
- -4,
- 8
- ],
- [
- -1,
- 29
- ],
- [
- -4,
- 9
- ],
- [
- -16,
- 19
- ],
- [
- -4,
- 18
- ],
- [
- -1,
- 24
- ],
- [
- -20,
- -3
- ],
- [
- -25,
- 2
- ],
- [
- -11,
- -22
- ],
- [
- -6,
- -4
- ],
- [
- -7,
- 5
- ],
- [
- -20,
- 29
- ],
- [
- -21,
- -6
- ],
- [
- -12,
- 3
- ],
- [
- -29,
- 22
- ],
- [
- -23,
- 2
- ],
- [
- -10,
- 4
- ],
- [
- -5,
- 5
- ],
- [
- -2,
- 33
- ],
- [
- -9,
- 28
- ],
- [
- -3,
- 8
- ],
- [
- -16,
- 20
- ],
- [
- -2,
- 0
- ],
- [
- -2,
- -4
- ],
- [
- -4,
- -22
- ],
- [
- -4,
- -1
- ],
- [
- -18,
- 6
- ],
- [
- -17,
- -7
- ],
- [
- -9,
- 11
- ],
- [
- -32,
- 52
- ],
- [
- -12,
- 13
- ],
- [
- -11,
- 4
- ],
- [
- 0,
- 48
- ],
- [
- 0,
- 49
- ],
- [
- 0,
- 48
- ],
- [
- 0,
- 48
- ],
- [
- 0,
- 48
- ],
- [
- 0,
- 48
- ],
- [
- 0,
- 49
- ],
- [
- 0,
- 48
- ],
- [
- 0,
- 48
- ],
- [
- 0,
- 48
- ],
- [
- 0,
- 48
- ],
- [
- 0,
- 48
- ],
- [
- 0,
- 49
- ],
- [
- 0,
- 48
- ],
- [
- 0,
- 48
- ],
- [
- 0,
- 48
- ],
- [
- -33,
- 0
- ],
- [
- -32,
- 0
- ],
- [
- -32,
- 0
- ],
- [
- -33,
- 0
- ],
- [
- -32,
- 0
- ],
- [
- -33,
- 0
- ],
- [
- -32,
- 0
- ],
- [
- -33,
- 0
- ],
- [
- -32,
- 0
- ],
- [
- -33,
- 0
- ],
- [
- -32,
- 0
- ],
- [
- -33,
- 0
- ],
- [
- -32,
- 0
- ],
- [
- -32,
- 0
- ],
- [
- -33,
- 0
- ],
- [
- -32,
- 0
- ]
- ],
- [
- [
- 258,
- 8704
- ],
- [
- 17,
- 10
- ],
- [
- 14,
- -8
- ],
- [
- 17,
- -18
- ],
- [
- 17,
- -55
- ],
- [
- 17,
- -92
- ],
- [
- 4,
- -30
- ],
- [
- 13,
- -19
- ],
- [
- 15,
- -1
- ],
- [
- 62,
- -14
- ],
- [
- 9,
- 1
- ],
- [
- 12,
- 4
- ],
- [
- 35,
- 35
- ],
- [
- 38,
- 11
- ],
- [
- 45,
- -2
- ],
- [
- 28,
- -10
- ],
- [
- 10,
- -18
- ],
- [
- 24,
- -1
- ],
- [
- 57,
- 20
- ],
- [
- 63,
- 14
- ],
- [
- 34,
- 15
- ],
- [
- 38,
- 31
- ],
- [
- 88,
- 38
- ],
- [
- 43,
- 5
- ],
- [
- 22,
- 14
- ],
- [
- 6,
- 8
- ],
- [
- 3,
- 0
- ],
- [
- 46,
- 0
- ],
- [
- 46,
- 0
- ],
- [
- 46,
- 0
- ],
- [
- 46,
- 1
- ],
- [
- 46,
- 0
- ],
- [
- 46,
- 0
- ],
- [
- 46,
- 0
- ],
- [
- 42,
- 0
- ]
- ],
- [
- [
- 83,
- 7031
- ],
- [
- -22,
- 49
- ],
- [
- -9,
- 74
- ],
- [
- -2,
- 30
- ],
- [
- 3,
- 82
- ],
- [
- -7,
- 35
- ],
- [
- -16,
- 57
- ],
- [
- 7,
- 50
- ],
- [
- 7,
- 31
- ],
- [
- 19,
- 132
- ],
- [
- 4,
- 11
- ],
- [
- 8,
- 0
- ],
- [
- 14,
- 22
- ],
- [
- -6,
- 5
- ],
- [
- -10,
- -10
- ],
- [
- 9,
- 52
- ],
- [
- 9,
- 45
- ],
- [
- 6,
- 16
- ],
- [
- 3,
- 147
- ],
- [
- 6,
- 112
- ],
- [
- 9,
- 37
- ],
- [
- -3,
- 38
- ],
- [
- 3,
- 51
- ],
- [
- -2,
- 53
- ],
- [
- 19,
- 251
- ],
- [
- -3,
- 30
- ],
- [
- 6,
- 41
- ],
- [
- -5,
- 107
- ],
- [
- 2,
- 120
- ],
- [
- -5,
- 15
- ],
- [
- -2,
- 16
- ],
- [
- 4,
- 3
- ],
- [
- 9,
- -18
- ],
- [
- 42,
- 0
- ],
- [
- 26,
- 17
- ],
- [
- 9,
- -6
- ],
- [
- 12,
- -22
- ],
- [
- 14,
- -4
- ],
- [
- 17,
- 4
- ]
- ],
- [
- [
- 8598,
- 6219
- ],
- [
- -17,
- -36
- ],
- [
- -26,
- -12
- ],
- [
- -13,
- -13
- ],
- [
- -4,
- -7
- ]
- ],
- [
- [
- 7835,
- 6114
- ],
- [
- -22,
- 0
- ],
- [
- -23,
- 0
- ],
- [
- -22,
- 0
- ],
- [
- -23,
- 0
- ],
- [
- -22,
- 0
- ],
- [
- -23,
- 0
- ],
- [
- -23,
- 0
- ],
- [
- -22,
- 0
- ],
- [
- 0,
- 46
- ],
- [
- 0,
- 47
- ],
- [
- 0,
- 46
- ],
- [
- 0,
- 47
- ],
- [
- 0,
- 47
- ],
- [
- 0,
- 46
- ],
- [
- 0,
- 47
- ],
- [
- 0,
- 46
- ]
- ],
- [
- [
- 7655,
- 7027
- ],
- [
- 32,
- 20
- ],
- [
- 14,
- 14
- ],
- [
- 15,
- 14
- ],
- [
- 7,
- 8
- ],
- [
- 9,
- 7
- ],
- [
- 54,
- 52
- ]
- ],
- [
- [
- 9241,
- 6824
- ],
- [
- -5,
- -8
- ],
- [
- -2,
- 20
- ],
- [
- 3,
- 22
- ],
- [
- 4,
- 0
- ],
- [
- 1,
- -11
- ],
- [
- -1,
- -23
- ]
- ],
- [
- [
- 9262,
- 6826
- ],
- [
- -9,
- -11
- ],
- [
- -9,
- 2
- ],
- [
- 5,
- 15
- ],
- [
- 2,
- 22
- ],
- [
- 4,
- 24
- ],
- [
- 3,
- 7
- ],
- [
- 6,
- 7
- ],
- [
- -2,
- -66
- ]
- ],
- [
- [
- 9263,
- 6913
- ],
- [
- -6,
- -10
- ],
- [
- -7,
- 15
- ],
- [
- -3,
- 17
- ],
- [
- -5,
- 10
- ],
- [
- -6,
- 4
- ],
- [
- 5,
- -38
- ],
- [
- -11,
- -28
- ],
- [
- -3,
- -72
- ],
- [
- -14,
- -30
- ],
- [
- -42,
- -20
- ],
- [
- -13,
- 2
- ]
- ],
- [
- [
- 7994,
- 3759
- ],
- [
- -3,
- -1
- ],
- [
- -45,
- -60
- ],
- [
- -14,
- -26
- ],
- [
- -38,
- -102
- ],
- [
- -10,
- -65
- ],
- [
- -7,
- 27
- ],
- [
- 2,
- 21
- ],
- [
- 0,
- 16
- ],
- [
- -10,
- -36
- ],
- [
- 9,
- -52
- ],
- [
- -8,
- -20
- ],
- [
- -25,
- -38
- ],
- [
- -13,
- -6
- ],
- [
- -16,
- -10
- ],
- [
- -4,
- -37
- ],
- [
- -21,
- -34
- ],
- [
- -12,
- -15
- ],
- [
- -23,
- 9
- ],
- [
- 7,
- -33
- ],
- [
- -8,
- -25
- ],
- [
- -14,
- -19
- ],
- [
- -17,
- -12
- ],
- [
- -10,
- 1
- ],
- [
- -9,
- -6
- ],
- [
- -7,
- -16
- ],
- [
- -16,
- -15
- ],
- [
- -17,
- 8
- ],
- [
- -19,
- 5
- ],
- [
- -11,
- -8
- ],
- [
- 18,
- -15
- ],
- [
- 10,
- -21
- ],
- [
- -2,
- -29
- ],
- [
- -5,
- -11
- ],
- [
- -12,
- -15
- ],
- [
- -5,
- 2
- ],
- [
- -3,
- 14
- ],
- [
- -3,
- 28
- ],
- [
- -6,
- -6
- ],
- [
- 0,
- -13
- ],
- [
- -5,
- -5
- ],
- [
- -16,
- 45
- ],
- [
- 1,
- -34
- ],
- [
- 5,
- -26
- ],
- [
- 6,
- -14
- ],
- [
- 5,
- -7
- ],
- [
- 2,
- -13
- ],
- [
- -11,
- -29
- ],
- [
- -6,
- -7
- ],
- [
- -10,
- -5
- ],
- [
- -6,
- -18
- ],
- [
- 2,
- -16
- ]
- ],
- [
- [
- 3582,
- 7434
- ],
- [
- 0,
- 101
- ],
- [
- 0,
- 101
- ],
- [
- 0,
- 100
- ],
- [
- 0,
- 101
- ],
- [
- 0,
- 101
- ],
- [
- -1,
- 100
- ],
- [
- 0,
- 101
- ],
- [
- 0,
- 101
- ]
- ],
- [
- [
- 7110,
- 4858
- ],
- [
- 39,
- 0
- ],
- [
- 84,
- -1
- ],
- [
- 59,
- -1
- ],
- [
- 49,
- 0
- ],
- [
- 29,
- 0
- ],
- [
- 37,
- -1
- ],
- [
- 8,
- 9
- ],
- [
- 18,
- -2
- ],
- [
- 24,
- -2
- ]
- ],
- [
- [
- 4770,
- 651
- ],
- [
- -2,
- -18
- ],
- [
- -14,
- 87
- ],
- [
- -24,
- 198
- ],
- [
- 0,
- 112
- ],
- [
- 3,
- 39
- ],
- [
- 6,
- -159
- ],
- [
- 26,
- -202
- ],
- [
- 5,
- -57
- ]
- ],
- [
- [
- 4739,
- 1111
- ],
- [
- -6,
- -24
- ],
- [
- 2,
- 35
- ],
- [
- 14,
- 78
- ],
- [
- 29,
- 104
- ],
- [
- 12,
- 17
- ],
- [
- -33,
- -113
- ],
- [
- -18,
- -97
- ]
- ],
- [
- [
- 4798,
- 1353
- ],
- [
- -4,
- -1
- ],
- [
- 8,
- 33
- ],
- [
- 2,
- 13
- ],
- [
- 13,
- 42
- ],
- [
- 8,
- 6
- ],
- [
- 3,
- -18
- ],
- [
- -14,
- -29
- ],
- [
- -16,
- -46
- ]
- ],
- [
- [
- 4841,
- 1454
- ],
- [
- -7,
- -2
- ],
- [
- 8,
- 22
- ],
- [
- 13,
- 11
- ],
- [
- 28,
- 42
- ],
- [
- 12,
- 3
- ],
- [
- 6,
- 14
- ],
- [
- 2,
- 2
- ],
- [
- -1,
- -17
- ],
- [
- -23,
- -25
- ],
- [
- -38,
- -50
- ]
- ],
- [
- [
- 5140,
- 1854
- ],
- [
- -9,
- -4
- ],
- [
- 38,
- 62
- ],
- [
- 8,
- 21
- ],
- [
- 10,
- -1
- ],
- [
- -17,
- -35
- ],
- [
- -30,
- -43
- ]
- ],
- [
- [
- 5355,
- 2189
- ],
- [
- -8,
- 1
- ],
- [
- -18,
- -66
- ],
- [
- 10,
- -38
- ],
- [
- 0,
- -13
- ],
- [
- -37,
- -8
- ],
- [
- -82,
- -75
- ],
- [
- -32,
- -40
- ],
- [
- 2,
- 14
- ],
- [
- 39,
- 52
- ],
- [
- -14,
- 8
- ],
- [
- -22,
- -13
- ],
- [
- -8,
- 5
- ],
- [
- 9,
- 43
- ],
- [
- -3,
- 38
- ],
- [
- -15,
- 1
- ],
- [
- -10,
- -30
- ],
- [
- -7,
- 1
- ],
- [
- -9,
- 13
- ],
- [
- -7,
- -4
- ],
- [
- 5,
- -69
- ],
- [
- 10,
- -28
- ],
- [
- 8,
- -36
- ],
- [
- -23,
- -45
- ],
- [
- -21,
- -37
- ],
- [
- -2,
- -36
- ],
- [
- -21,
- -46
- ],
- [
- -20,
- -27
- ],
- [
- -46,
- -62
- ],
- [
- -13,
- -13
- ],
- [
- -21,
- -29
- ],
- [
- -29,
- -21
- ],
- [
- -28,
- -34
- ],
- [
- -9,
- -6
- ],
- [
- 17,
- 29
- ],
- [
- 21,
- 29
- ],
- [
- -18,
- -4
- ],
- [
- -27,
- 13
- ],
- [
- -17,
- 1
- ],
- [
- -1,
- -10
- ],
- [
- -12,
- -15
- ],
- [
- -14,
- 22
- ],
- [
- -6,
- 14
- ],
- [
- -2,
- 13
- ],
- [
- -6,
- 3
- ],
- [
- -6,
- -6
- ],
- [
- 20,
- -89
- ],
- [
- 9,
- -3
- ],
- [
- 9,
- -9
- ],
- [
- -11,
- -21
- ],
- [
- -13,
- -16
- ],
- [
- -20,
- -10
- ],
- [
- -17,
- 32
- ],
- [
- -3,
- -40
- ],
- [
- -3,
- -41
- ],
- [
- -5,
- -10
- ],
- [
- -9,
- -15
- ],
- [
- -5,
- 11
- ],
- [
- -2,
- 16
- ],
- [
- -6,
- -14
- ],
- [
- -9,
- -11
- ],
- [
- -14,
- -2
- ],
- [
- -10,
- -5
- ],
- [
- 0,
- -17
- ],
- [
- 3,
- -17
- ],
- [
- 18,
- 13
- ],
- [
- -7,
- -43
- ],
- [
- -17,
- -43
- ],
- [
- -14,
- -10
- ],
- [
- -21,
- 6
- ],
- [
- -5,
- -4
- ],
- [
- -5,
- -9
- ],
- [
- 25,
- -67
- ],
- [
- -16,
- -101
- ],
- [
- -10,
- -37
- ],
- [
- -7,
- -5
- ],
- [
- -8,
- -1
- ],
- [
- -27,
- 33
- ],
- [
- -15,
- 25
- ],
- [
- 13,
- -69
- ],
- [
- 36,
- -20
- ],
- [
- 2,
- -26
- ],
- [
- 0,
- -22
- ],
- [
- -7,
- -26
- ],
- [
- -7,
- -34
- ],
- [
- 5,
- -24
- ],
- [
- 5,
- -60
- ],
- [
- 5,
- -27
- ],
- [
- 6,
- -83
- ],
- [
- 5,
- -36
- ],
- [
- 33,
- -133
- ],
- [
- 11,
- -1
- ],
- [
- 2,
- -14
- ],
- [
- -1,
- -27
- ],
- [
- -24,
- -8
- ],
- [
- -10,
- -13
- ],
- [
- -2,
- -10
- ],
- [
- -1,
- -6
- ],
- [
- -3,
- 0
- ],
- [
- -11,
- 8
- ],
- [
- -26,
- 38
- ],
- [
- -37,
- 23
- ],
- [
- -49,
- 9
- ],
- [
- -33,
- 19
- ],
- [
- -18,
- 29
- ],
- [
- -18,
- 17
- ],
- [
- -20,
- 5
- ],
- [
- -16,
- 15
- ],
- [
- -13,
- 26
- ],
- [
- -18,
- 17
- ],
- [
- -25,
- 7
- ],
- [
- -16,
- 19
- ],
- [
- -11,
- 47
- ],
- [
- 0,
- 1
- ],
- [
- -10,
- 79
- ],
- [
- -13,
- 49
- ],
- [
- -24,
- 62
- ],
- [
- -2,
- 8
- ],
- [
- -1,
- 10
- ],
- [
- 3,
- 35
- ],
- [
- -2,
- 26
- ],
- [
- -8,
- 21
- ],
- [
- -2,
- 22
- ],
- [
- 4,
- 23
- ],
- [
- 1,
- 28
- ],
- [
- -4,
- 33
- ],
- [
- -16,
- 35
- ],
- [
- -27,
- 38
- ],
- [
- -24,
- 55
- ],
- [
- -19,
- 73
- ],
- [
- -19,
- 50
- ],
- [
- -19,
- 28
- ],
- [
- -13,
- 35
- ],
- [
- -7,
- 40
- ],
- [
- -2,
- 23
- ],
- [
- 3,
- 7
- ],
- [
- -12,
- 45
- ],
- [
- -26,
- 83
- ],
- [
- -15,
- 61
- ],
- [
- -4,
- 39
- ],
- [
- -16,
- 46
- ],
- [
- -30,
- 53
- ],
- [
- -16,
- 35
- ],
- [
- -4,
- 24
- ],
- [
- -45,
- 70
- ],
- [
- -14,
- 43
- ],
- [
- -10,
- 14
- ],
- [
- -12,
- -1
- ],
- [
- -6,
- 4
- ],
- [
- -1,
- 10
- ],
- [
- -3,
- 0
- ],
- [
- -8,
- -9
- ],
- [
- -24,
- -2
- ],
- [
- -42,
- 6
- ],
- [
- -29,
- 12
- ],
- [
- -19,
- 18
- ],
- [
- -13,
- -2
- ],
- [
- -7,
- -24
- ],
- [
- -16,
- -15
- ],
- [
- -24,
- -7
- ],
- [
- -20,
- -43
- ],
- [
- -18,
- -81
- ],
- [
- -7,
- -52
- ],
- [
- 2,
- -23
- ],
- [
- -5,
- -17
- ],
- [
- -11,
- -10
- ],
- [
- -11,
- -23
- ],
- [
- -12,
- -37
- ],
- [
- -13,
- -17
- ],
- [
- -16,
- 1
- ],
- [
- -29,
- 28
- ],
- [
- -41,
- 55
- ],
- [
- -33,
- 34
- ],
- [
- -24,
- 12
- ],
- [
- -21,
- 26
- ],
- [
- -18,
- 38
- ],
- [
- -17,
- 25
- ],
- [
- -15,
- 12
- ],
- [
- -18,
- 42
- ],
- [
- -20,
- 71
- ],
- [
- -11,
- 55
- ],
- [
- 0,
- 58
- ],
- [
- -26,
- 126
- ],
- [
- -15,
- 55
- ],
- [
- -10,
- 25
- ],
- [
- -21,
- 30
- ],
- [
- -31,
- 35
- ],
- [
- -41,
- 70
- ],
- [
- -52,
- 105
- ],
- [
- -36,
- 63
- ],
- [
- -22,
- 21
- ],
- [
- -18,
- 38
- ],
- [
- -16,
- 54
- ],
- [
- -16,
- 35
- ],
- [
- -1,
- 1
- ]
- ],
- [
- [
- 2366,
- 7031
- ],
- [
- 0,
- -50
- ],
- [
- 0,
- -50
- ],
- [
- 0,
- -51
- ],
- [
- 0,
- -50
- ],
- [
- 0,
- -50
- ],
- [
- 0,
- -51
- ],
- [
- 0,
- -50
- ],
- [
- 0,
- -50
- ],
- [
- 44,
- 0
- ],
- [
- 43,
- 0
- ],
- [
- 43,
- 0
- ],
- [
- 44,
- 0
- ],
- [
- 43,
- 0
- ],
- [
- 44,
- 0
- ],
- [
- 43,
- 0
- ],
- [
- 43,
- 0
- ]
- ],
- [
- [
- 8546,
- 5430
- ],
- [
- -38,
- -159
- ],
- [
- 1,
- -29
- ],
- [
- -7,
- -9
- ],
- [
- -12,
- -8
- ],
- [
- -12,
- -17
- ],
- [
- -8,
- -20
- ],
- [
- -7,
- -51
- ],
- [
- -14,
- -59
- ],
- [
- -9,
- 25
- ],
- [
- -2,
- 20
- ],
- [
- 4,
- 55
- ],
- [
- 15,
- 89
- ],
- [
- 17,
- 55
- ],
- [
- 12,
- 26
- ],
- [
- 11,
- 53
- ]
- ],
- [
- [
- 8572,
- 5436
- ],
- [
- -19,
- -61
- ],
- [
- -8,
- -7
- ],
- [
- 22,
- 67
- ]
- ],
- [
- [
- 8259,
- 5778
- ],
- [
- -2,
- -46
- ],
- [
- -8,
- -22
- ],
- [
- -13,
- -18
- ],
- [
- -17,
- -30
- ],
- [
- -4,
- -29
- ],
- [
- -5,
- -53
- ],
- [
- 7,
- -18
- ],
- [
- 7,
- -5
- ],
- [
- 21,
- 12
- ],
- [
- 11,
- -5
- ],
- [
- 25,
- -65
- ],
- [
- 45,
- -25
- ],
- [
- 17,
- -16
- ],
- [
- 13,
- -34
- ],
- [
- 20,
- -19
- ],
- [
- 16,
- -28
- ],
- [
- 0,
- -18
- ],
- [
- -5,
- -22
- ],
- [
- -2,
- -29
- ],
- [
- -7,
- -19
- ],
- [
- -16,
- -2
- ],
- [
- -10,
- 5
- ],
- [
- -52,
- 103
- ],
- [
- -6,
- 9
- ],
- [
- -19,
- 54
- ],
- [
- -23,
- 29
- ],
- [
- -7,
- 0
- ],
- [
- 32,
- -54
- ],
- [
- 14,
- -37
- ],
- [
- 23,
- -52
- ],
- [
- 16,
- -23
- ],
- [
- 13,
- -34
- ],
- [
- 11,
- -17
- ],
- [
- 31,
- -23
- ],
- [
- -11,
- -16
- ],
- [
- 17,
- -14
- ],
- [
- 3,
- -26
- ],
- [
- -2,
- -30
- ],
- [
- -24,
- 12
- ],
- [
- 0,
- -22
- ],
- [
- 2,
- -13
- ],
- [
- -11,
- -11
- ],
- [
- -15,
- 15
- ],
- [
- -38,
- 79
- ],
- [
- 1,
- -11
- ],
- [
- 3,
- -12
- ],
- [
- 22,
- -51
- ],
- [
- 20,
- -30
- ],
- [
- 16,
- -14
- ],
- [
- 13,
- -26
- ],
- [
- 5,
- -15
- ],
- [
- 3,
- -24
- ],
- [
- -10,
- -15
- ],
- [
- -11,
- -9
- ],
- [
- -10,
- 16
- ],
- [
- -8,
- 16
- ],
- [
- -17,
- 29
- ],
- [
- -5,
- 32
- ],
- [
- -12,
- -2
- ],
- [
- -53,
- 40
- ],
- [
- -42,
- 5
- ],
- [
- 4,
- -8
- ],
- [
- 6,
- -6
- ],
- [
- 33,
- -10
- ],
- [
- 13,
- -18
- ],
- [
- 28,
- -17
- ],
- [
- 16,
- -4
- ],
- [
- 7,
- -51
- ],
- [
- 22,
- -34
- ],
- [
- 3,
- -26
- ],
- [
- 16,
- -3
- ],
- [
- 26,
- 25
- ],
- [
- 18,
- -9
- ],
- [
- 25,
- -7
- ],
- [
- 6,
- -20
- ],
- [
- 4,
- -39
- ],
- [
- 9,
- -44
- ],
- [
- 5,
- -43
- ]
- ],
- [
- [
- 8457,
- 4836
- ],
- [
- -13,
- 1
- ]
- ],
- [
- [
- 7404,
- 5235
- ],
- [
- 2,
- -13
- ],
- [
- -3,
- -14
- ],
- [
- 6,
- -17
- ],
- [
- 4,
- -25
- ],
- [
- 7,
- -16
- ],
- [
- 8,
- -13
- ],
- [
- 13,
- -11
- ],
- [
- 16,
- -19
- ],
- [
- 13,
- -6
- ],
- [
- 4,
- 1
- ],
- [
- 14,
- 19
- ],
- [
- 11,
- 10
- ],
- [
- 12,
- 21
- ],
- [
- 21,
- -29
- ],
- [
- 9,
- 0
- ],
- [
- 21,
- 13
- ],
- [
- 19,
- 3
- ],
- [
- 5,
- 4
- ],
- [
- 8,
- 11
- ],
- [
- 0,
- 24
- ],
- [
- 1,
- 6
- ],
- [
- 4,
- 3
- ],
- [
- 4,
- 1
- ],
- [
- 8,
- -9
- ],
- [
- 9,
- 0
- ],
- [
- 37,
- 27
- ],
- [
- 3,
- -2
- ],
- [
- 4,
- -13
- ],
- [
- 17,
- 17
- ],
- [
- 9,
- 14
- ],
- [
- 4,
- 23
- ],
- [
- 8,
- 22
- ],
- [
- -1,
- 10
- ],
- [
- -6,
- 13
- ],
- [
- 7,
- 30
- ],
- [
- 10,
- 29
- ],
- [
- 38,
- 90
- ],
- [
- 12,
- 54
- ],
- [
- 15,
- 35
- ],
- [
- 5,
- 27
- ],
- [
- 12,
- 28
- ],
- [
- 8,
- 56
- ],
- [
- 5,
- 12
- ],
- [
- 8,
- 1
- ],
- [
- 7,
- -7
- ],
- [
- 5,
- -10
- ],
- [
- 4,
- -17
- ],
- [
- 18,
- -15
- ],
- [
- 16,
- -2
- ],
- [
- 11,
- 11
- ],
- [
- 7,
- 20
- ],
- [
- 9,
- 37
- ],
- [
- 8,
- 22
- ],
- [
- 5,
- 28
- ],
- [
- 6,
- 19
- ],
- [
- 8,
- 12
- ],
- [
- 22,
- -1
- ],
- [
- 11,
- 17
- ],
- [
- 8,
- 20
- ],
- [
- 5,
- 6
- ],
- [
- 6,
- -1
- ],
- [
- 20,
- 31
- ],
- [
- 25,
- 65
- ],
- [
- 5,
- 41
- ],
- [
- 7,
- 30
- ],
- [
- 2,
- 30
- ],
- [
- 5,
- 17
- ],
- [
- 23,
- -33
- ],
- [
- 13,
- -19
- ],
- [
- 29,
- -43
- ],
- [
- 20,
- -29
- ],
- [
- 7,
- 33
- ],
- [
- 12,
- 48
- ]
- ],
- [
- [
- 8896,
- 8241
- ],
- [
- 30,
- 0
- ],
- [
- 72,
- 1
- ],
- [
- 72,
- 0
- ],
- [
- 72,
- 0
- ],
- [
- 72,
- 0
- ]
- ],
- [
- [
- 322,
- 9127
- ],
- [
- -2,
- -8
- ],
- [
- -2,
- 1
- ],
- [
- -6,
- 16
- ],
- [
- -1,
- 11
- ],
- [
- 5,
- 8
- ],
- [
- 6,
- -23
- ],
- [
- 0,
- -5
- ]
- ],
- [
- [
- 401,
- 9204
- ],
- [
- -1,
- -9
- ],
- [
- -6,
- -7
- ],
- [
- -4,
- 1
- ],
- [
- 0,
- 11
- ],
- [
- -2,
- 2
- ],
- [
- -7,
- -13
- ],
- [
- 1,
- 25
- ],
- [
- 3,
- 27
- ],
- [
- 3,
- 1
- ],
- [
- 5,
- -18
- ],
- [
- 8,
- -20
- ]
- ],
- [
- [
- 383,
- 9284
- ],
- [
- -1,
- -8
- ],
- [
- -9,
- 10
- ],
- [
- -3,
- 8
- ],
- [
- 0,
- 19
- ],
- [
- 2,
- 13
- ],
- [
- 2,
- 2
- ],
- [
- 6,
- -5
- ],
- [
- 1,
- -3
- ],
- [
- 2,
- -36
- ]
- ],
- [
- [
- 370,
- 9510
- ],
- [
- 9,
- -52
- ],
- [
- 3,
- 22
- ],
- [
- 24,
- -38
- ],
- [
- 0,
- -19
- ],
- [
- -3,
- -7
- ],
- [
- -5,
- -2
- ],
- [
- -4,
- 6
- ],
- [
- -5,
- 13
- ],
- [
- -5,
- 7
- ],
- [
- -11,
- 4
- ],
- [
- -6,
- 15
- ],
- [
- -2,
- 11
- ],
- [
- -1,
- 29
- ],
- [
- -2,
- 9
- ],
- [
- -6,
- 2
- ],
- [
- -6,
- 7
- ],
- [
- -9,
- 21
- ],
- [
- -1,
- 6
- ],
- [
- 4,
- 17
- ],
- [
- 10,
- 28
- ],
- [
- 7,
- 13
- ],
- [
- 4,
- -1
- ],
- [
- 5,
- -9
- ],
- [
- 7,
- -15
- ],
- [
- -2,
- -11
- ],
- [
- -25,
- -22
- ],
- [
- -1,
- -5
- ],
- [
- 12,
- -6
- ],
- [
- 5,
- -5
- ],
- [
- 4,
- -18
- ]
- ],
- [
- [
- 327,
- 9621
- ],
- [
- -2,
- -4
- ],
- [
- -10,
- 5
- ],
- [
- -5,
- 9
- ],
- [
- -2,
- 12
- ],
- [
- 3,
- 21
- ],
- [
- 5,
- 6
- ],
- [
- 3,
- -2
- ],
- [
- 1,
- -19
- ],
- [
- 8,
- -19
- ],
- [
- -1,
- -9
- ]
- ],
- [
- [
- 294,
- 9649
- ],
- [
- 5,
- -13
- ],
- [
- -19,
- 8
- ],
- [
- -8,
- 8
- ],
- [
- -2,
- 7
- ],
- [
- -3,
- 25
- ],
- [
- 1,
- 8
- ],
- [
- 8,
- 2
- ],
- [
- 16,
- -30
- ],
- [
- 2,
- -15
- ]
- ],
- [
- [
- 334,
- 9718
- ],
- [
- 2,
- -8
- ],
- [
- -7,
- -9
- ],
- [
- -5,
- -1
- ],
- [
- -8,
- 13
- ],
- [
- -3,
- 2
- ],
- [
- 3,
- -21
- ],
- [
- -1,
- -7
- ],
- [
- -16,
- 13
- ],
- [
- -3,
- 10
- ],
- [
- 4,
- 11
- ],
- [
- 10,
- 11
- ],
- [
- 4,
- 1
- ],
- [
- 20,
- -15
- ]
- ],
- [
- [
- 288,
- 9847
- ],
- [
- -3,
- -6
- ],
- [
- -2,
- 1
- ],
- [
- -2,
- 5
- ],
- [
- 7,
- 0
- ]
- ],
- [
- [
- 258,
- 8704
- ],
- [
- -5,
- 5
- ],
- [
- -9,
- 2
- ],
- [
- -18,
- 20
- ],
- [
- -10,
- 20
- ],
- [
- -32,
- -1
- ],
- [
- -7,
- 13
- ],
- [
- -36,
- -13
- ],
- [
- -11,
- 13
- ],
- [
- -20,
- -9
- ],
- [
- 5,
- 38
- ],
- [
- -1,
- 47
- ],
- [
- 1,
- 47
- ],
- [
- 5,
- -34
- ],
- [
- 12,
- -36
- ],
- [
- 6,
- 41
- ],
- [
- 4,
- 51
- ],
- [
- -12,
- 19
- ],
- [
- -19,
- 15
- ],
- [
- -8,
- 47
- ],
- [
- 47,
- 41
- ],
- [
- -25,
- 8
- ],
- [
- -9,
- 19
- ],
- [
- -12,
- 2
- ],
- [
- -1,
- -14
- ],
- [
- -4,
- -19
- ],
- [
- -4,
- 25
- ],
- [
- -2,
- 29
- ],
- [
- -4,
- 49
- ],
- [
- -20,
- 79
- ],
- [
- -11,
- 102
- ],
- [
- -15,
- 50
- ],
- [
- -28,
- 49
- ],
- [
- -7,
- 28
- ],
- [
- -7,
- 71
- ],
- [
- 4,
- 55
- ],
- [
- -5,
- 38
- ],
- [
- 13,
- -3
- ],
- [
- 36,
- -29
- ],
- [
- 44,
- -24
- ],
- [
- 13,
- -17
- ],
- [
- 21,
- -13
- ],
- [
- 118,
- -19
- ],
- [
- 8,
- 1
- ],
- [
- 15,
- 13
- ],
- [
- 7,
- -2
- ],
- [
- 17,
- -28
- ],
- [
- 9,
- -3
- ],
- [
- 11,
- 1
- ],
- [
- 8,
- 6
- ],
- [
- 15,
- 19
- ],
- [
- 1,
- -7
- ],
- [
- 0,
- -18
- ],
- [
- 5,
- -25
- ],
- [
- 11,
- -33
- ],
- [
- 4,
- -20
- ],
- [
- -21,
- -58
- ],
- [
- -4,
- -1
- ],
- [
- -1,
- 19
- ],
- [
- -3,
- 4
- ],
- [
- -40,
- -97
- ],
- [
- -13,
- -46
- ],
- [
- -2,
- -21
- ],
- [
- 1,
- -12
- ],
- [
- 5,
- -3
- ],
- [
- 13,
- 5
- ],
- [
- 19,
- 19
- ],
- [
- 1,
- 4
- ],
- [
- -18,
- -7
- ],
- [
- -8,
- 0
- ],
- [
- 1,
- 21
- ],
- [
- 2,
- 11
- ],
- [
- 11,
- 32
- ],
- [
- 12,
- 19
- ],
- [
- 17,
- 21
- ],
- [
- 10,
- 17
- ],
- [
- 7,
- 25
- ],
- [
- 19,
- 29
- ],
- [
- 4,
- 8
- ],
- [
- -1,
- 25
- ],
- [
- 1,
- 4
- ],
- [
- 9,
- -3
- ],
- [
- 4,
- -42
- ],
- [
- -2,
- -19
- ],
- [
- -17,
- -22
- ],
- [
- -2,
- -8
- ],
- [
- 3,
- -31
- ],
- [
- -2,
- -3
- ],
- [
- -7,
- 3
- ],
- [
- -2,
- -2
- ],
- [
- 16,
- -34
- ],
- [
- 5,
- -26
- ],
- [
- 1,
- -23
- ],
- [
- -5,
- -45
- ],
- [
- -4,
- -8
- ],
- [
- -8,
- 3
- ],
- [
- -10,
- 14
- ],
- [
- -2,
- -4
- ],
- [
- -9,
- -35
- ],
- [
- -2,
- 3
- ],
- [
- -5,
- 41
- ],
- [
- -3,
- 3
- ],
- [
- -16,
- -19
- ],
- [
- -6,
- -18
- ],
- [
- -6,
- -29
- ],
- [
- -7,
- -13
- ],
- [
- 20,
- -3
- ],
- [
- 18,
- 5
- ],
- [
- 14,
- -13
- ],
- [
- 5,
- -1
- ],
- [
- 13,
- 14
- ],
- [
- 4,
- 9
- ],
- [
- 11,
- 44
- ],
- [
- 5,
- 7
- ],
- [
- 8,
- 1
- ],
- [
- 8,
- 6
- ],
- [
- 11,
- 24
- ],
- [
- 1,
- 10
- ],
- [
- -5,
- 53
- ],
- [
- 2,
- 31
- ],
- [
- -3,
- 9
- ],
- [
- -5,
- 10
- ],
- [
- 1,
- 10
- ],
- [
- 4,
- 16
- ],
- [
- 0,
- 15
- ],
- [
- -3,
- 12
- ],
- [
- 1,
- 15
- ],
- [
- 11,
- 32
- ],
- [
- 2,
- 13
- ],
- [
- 14,
- 32
- ],
- [
- -4,
- 12
- ],
- [
- -10,
- 16
- ],
- [
- -6,
- 13
- ],
- [
- -6,
- 21
- ],
- [
- -5,
- 7
- ],
- [
- -1,
- -3
- ],
- [
- 6,
- -34
- ],
- [
- -1,
- -3
- ],
- [
- -17,
- 19
- ],
- [
- -4,
- 12
- ],
- [
- -2,
- 16
- ],
- [
- 1,
- 12
- ],
- [
- 10,
- 11
- ],
- [
- 11,
- 5
- ],
- [
- -1,
- 10
- ],
- [
- -14,
- 32
- ],
- [
- -9,
- 15
- ],
- [
- -7,
- 7
- ],
- [
- -10,
- 2
- ],
- [
- -4,
- 5
- ],
- [
- -1,
- 8
- ],
- [
- 2,
- 10
- ],
- [
- 5,
- 3
- ],
- [
- 14,
- -4
- ],
- [
- 8,
- 7
- ],
- [
- 0,
- 13
- ],
- [
- -3,
- 7
- ],
- [
- 1,
- 46
- ],
- [
- -6,
- 37
- ],
- [
- -3,
- 7
- ],
- [
- -3,
- 0
- ],
- [
- -3,
- -5
- ],
- [
- -10,
- -1
- ],
- [
- -5,
- 12
- ],
- [
- -7,
- 24
- ],
- [
- -11,
- 56
- ],
- [
- 18,
- 0
- ],
- [
- 73,
- 0
- ],
- [
- 74,
- 0
- ],
- [
- 74,
- 0
- ],
- [
- 74,
- 0
- ],
- [
- 74,
- 0
- ],
- [
- 74,
- 0
- ],
- [
- 74,
- 0
- ],
- [
- 73,
- 0
- ],
- [
- 74,
- 0
- ],
- [
- 74,
- 0
- ],
- [
- 74,
- 0
- ],
- [
- 74,
- 0
- ],
- [
- 74,
- 0
- ],
- [
- 18,
- 0
- ]
- ],
- [
- [
- 6534,
- 8336
- ],
- [
- -4,
- -5
- ],
- [
- -5,
- 3
- ],
- [
- -2,
- -7
- ],
- [
- 1,
- -19
- ],
- [
- -2,
- -8
- ],
- [
- -4,
- 1
- ],
- [
- -1,
- -3
- ],
- [
- 5,
- -9
- ],
- [
- 0,
- -9
- ],
- [
- -3,
- -9
- ],
- [
- -3,
- -5
- ],
- [
- -3,
- 1
- ],
- [
- -5,
- -11
- ],
- [
- -7,
- -24
- ],
- [
- -2,
- -13
- ],
- [
- 2,
- -4
- ],
- [
- -1,
- -7
- ],
- [
- -16,
- -35
- ],
- [
- -6,
- -4
- ],
- [
- -7,
- 5
- ],
- [
- -5,
- 10
- ],
- [
- -3,
- 16
- ],
- [
- -1,
- 12
- ],
- [
- 2,
- 9
- ],
- [
- 14,
- 31
- ],
- [
- 6,
- 20
- ],
- [
- 3,
- 23
- ],
- [
- 7,
- 14
- ],
- [
- 9,
- 6
- ],
- [
- 8,
- 15
- ],
- [
- 6,
- 22
- ],
- [
- 7,
- 9
- ],
- [
- 7,
- -3
- ],
- [
- 4,
- -8
- ],
- [
- -1,
- -14
- ]
- ],
- [
- [
- 6556,
- 8381
- ],
- [
- -5,
- -4
- ],
- [
- -10,
- 1
- ],
- [
- -3,
- 9
- ],
- [
- 5,
- 24
- ],
- [
- 2,
- -5
- ],
- [
- 8,
- 0
- ],
- [
- 3,
- -2
- ],
- [
- 1,
- -6
- ],
- [
- -1,
- -17
- ]
- ],
- [
- [
- 5890,
- 8957
- ],
- [
- -10,
- -5
- ],
- [
- -5,
- 1
- ],
- [
- 2,
- 7
- ],
- [
- 5,
- 10
- ],
- [
- 23,
- 22
- ],
- [
- 4,
- 0
- ],
- [
- 2,
- -6
- ],
- [
- -12,
- -11
- ],
- [
- -4,
- -6
- ],
- [
- 0,
- -6
- ],
- [
- -5,
- -6
- ]
- ],
- [
- [
- 5918,
- 9012
- ],
- [
- -6,
- -2
- ],
- [
- -12,
- 3
- ],
- [
- 0,
- 6
- ],
- [
- 13,
- 8
- ],
- [
- 6,
- 3
- ],
- [
- 1,
- -4
- ],
- [
- -2,
- -14
- ]
- ],
- [
- [
- 6427,
- 8283
- ],
- [
- 0,
- -11
- ],
- [
- -3,
- -20
- ],
- [
- -10,
- -16
- ],
- [
- -26,
- -20
- ],
- [
- -4,
- -14
- ],
- [
- 0,
- -11
- ],
- [
- -17,
- -47
- ],
- [
- -8,
- -29
- ],
- [
- -5,
- -30
- ],
- [
- 2,
- -19
- ],
- [
- 8,
- -7
- ],
- [
- 7,
- 3
- ],
- [
- 6,
- 13
- ],
- [
- 8,
- 13
- ],
- [
- 11,
- 11
- ],
- [
- 8,
- 16
- ],
- [
- 11,
- 40
- ],
- [
- 13,
- 22
- ],
- [
- 6,
- 2
- ],
- [
- 2,
- -1
- ],
- [
- 13,
- 10
- ],
- [
- 11,
- -3
- ],
- [
- 6,
- -15
- ],
- [
- 6,
- -11
- ],
- [
- 2,
- -10
- ],
- [
- -3,
- -22
- ],
- [
- -6,
- -24
- ],
- [
- -9,
- -25
- ],
- [
- -8,
- -37
- ],
- [
- -7,
- -49
- ],
- [
- -2,
- -38
- ],
- [
- 5,
- -25
- ],
- [
- -4,
- -22
- ],
- [
- -12,
- -20
- ],
- [
- -10,
- -27
- ],
- [
- -7,
- -33
- ],
- [
- -4,
- -28
- ],
- [
- -1,
- -23
- ],
- [
- 1,
- -16
- ],
- [
- 4,
- -23
- ],
- [
- 0,
- -12
- ],
- [
- -13,
- -50
- ],
- [
- -4,
- -25
- ],
- [
- -1,
- -19
- ],
- [
- -3,
- -19
- ],
- [
- -10,
- -39
- ],
- [
- -3,
- -21
- ],
- [
- -1,
- -20
- ],
- [
- 2,
- -32
- ],
- [
- -1,
- -11
- ],
- [
- 1,
- -8
- ],
- [
- 2,
- -6
- ],
- [
- 0,
- -10
- ],
- [
- -2,
- -15
- ],
- [
- 0,
- -11
- ],
- [
- 5,
- -9
- ],
- [
- 3,
- -15
- ],
- [
- 1,
- -23
- ],
- [
- 3,
- -20
- ],
- [
- 6,
- -15
- ],
- [
- 1,
- -23
- ],
- [
- -4,
- -29
- ],
- [
- -1,
- -55
- ],
- [
- 0,
- -19
- ]
- ],
- [
- [
- 5648,
- 8949
- ],
- [
- 6,
- -11
- ],
- [
- 14,
- -15
- ],
- [
- 12,
- -1
- ],
- [
- 15,
- 3
- ],
- [
- 58,
- 25
- ],
- [
- 25,
- 18
- ],
- [
- 24,
- 31
- ],
- [
- 2,
- 1
- ],
- [
- 10,
- -6
- ],
- [
- 3,
- -3
- ],
- [
- 32,
- 35
- ],
- [
- 10,
- 4
- ],
- [
- 8,
- 0
- ],
- [
- 10,
- -14
- ],
- [
- 3,
- -8
- ],
- [
- -4,
- -16
- ],
- [
- -9,
- -24
- ],
- [
- -4,
- -20
- ],
- [
- 0,
- -16
- ],
- [
- -4,
- -17
- ],
- [
- -10,
- -24
- ],
- [
- 4,
- -6
- ],
- [
- 26,
- 17
- ],
- [
- 4,
- 6
- ],
- [
- 1,
- 4
- ],
- [
- -2,
- 5
- ],
- [
- 3,
- 2
- ],
- [
- 21,
- -23
- ],
- [
- 14,
- -13
- ],
- [
- 11,
- -6
- ],
- [
- 11,
- 4
- ]
- ],
- [
- [
- 5890,
- 9015
- ],
- [
- -3,
- -3
- ],
- [
- -6,
- 7
- ],
- [
- -1,
- 6
- ],
- [
- 2,
- 5
- ],
- [
- 3,
- -1
- ],
- [
- 4,
- -8
- ],
- [
- 1,
- -6
- ]
- ],
- [
- [
- 5939,
- 9055
- ],
- [
- -6,
- -6
- ],
- [
- -2,
- 3
- ],
- [
- 1,
- 12
- ],
- [
- 3,
- 7
- ],
- [
- 4,
- 2
- ],
- [
- 3,
- -3
- ],
- [
- 0,
- -8
- ],
- [
- -3,
- -7
- ]
- ]
- ],
- "transform": {
- "scale": [
- 0.005772872856602365,
- 0.0024829805705001468
- ],
- "translate": [
- -124.70997774915153,
- 24.542349340056283
- ]
- }
-}
diff --git a/web/gui/src/main/webapp/legacy/d3Utils.css b/web/gui/src/main/webapp/legacy/d3Utils.css
deleted file mode 100644
index a0167d3..0000000
--- a/web/gui/src/main/webapp/legacy/d3Utils.css
+++ /dev/null
@@ -1,138 +0,0 @@
-/*
- * Copyright 2014 Open Networking Laboratory
- *
- * 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.
- */
-
-/*
- D3 Utilities CSS file
- */
-
-#d3u .light.norm.c1 {
- color: #1f77b4;
-}
-
-#d3u .light.norm.c2 {
- color: #2ca02c;
-}
-
-#d3u .light.norm.c3 {
- color: #d62728;
-}
-
-#d3u .light.norm.c4 {
- color: #9467bd;
-}
-
-#d3u .light.norm.c5 {
- color: #e377c2;
-}
-
-#d3u .light.norm.c6 {
- color: #bcbd22;
-}
-
-#d3u .light.norm.c7 {
- color: #17becf;
-}
-
-
-
-#d3u .light.mute.c1 {
- color: #aec7e8;
-}
-
-#d3u .light.mute.c2 {
- color: #98df8a;
-}
-
-#d3u .light.mute.c3 {
- color: #ff9896;
-}
-
-#d3u .light.mute.c4 {
- color: #c5b0d5;
-}
-
-#d3u .light.mute.c5 {
- color: #f7b6d2;
-}
-
-#d3u .light.mute.c6 {
- color: #dbdb8d;
-}
-
-#d3u .light.mute.c7 {
- color: #9edae5;
-}
-
-
-
-#d3u .dark.norm.c1 {
- color: #1f77b4;
-}
-
-#d3u .dark.norm.c2 {
- color: #2ca02c;
-}
-
-#d3u .dark.norm.c3 {
- color: #d62728;
-}
-
-#d3u .dark.norm.c4 {
- color: #9467bd;
-}
-
-#d3u .dark.norm.c5 {
- color: #e377c2;
-}
-
-#d3u .dark.norm.c6 {
- color: #bcbd22;
-}
-
-#d3u .dark.norm.c7 {
- color: #17becf;
-}
-
-
-
-#d3u .dark.mute.c1 {
- color: #aec7e8;
-}
-
-#d3u .dark.mute.c2 {
- color: #639a56;
-}
-
-#d3u .dark.mute.c3 {
- color: #ff9896;
-}
-
-#d3u .dark.mute.c4 {
- color: #c5b0d5;
-}
-
-#d3u .dark.mute.c5 {
- color: #f7b6d2;
-}
-
-#d3u .dark.mute.c6 {
- color: #dbdb8d;
-}
-
-#d3u .dark.mute.c7 {
- color: #9edae5;
-}
-
diff --git a/web/gui/src/main/webapp/legacy/d3Utils.js b/web/gui/src/main/webapp/legacy/d3Utils.js
deleted file mode 100644
index 00ca887..0000000
--- a/web/gui/src/main/webapp/legacy/d3Utils.js
+++ /dev/null
@@ -1,248 +0,0 @@
-/*
- * Copyright 2014 Open Networking Laboratory
- *
- * 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.
- */
-
-/*
- Utility functions for D3 visualizations.
- */
-
-(function (onos) {
- 'use strict';
-
- function isF(f) {
- return $.isFunction(f) ? f : null;
- }
-
- // TODO: sensible defaults
- function createDragBehavior(force, selectCb, atDragEnd,
- dragEnabled, clickEnabled) {
- var draggedThreshold = d3.scale.linear()
- .domain([0, 0.1])
- .range([5, 20])
- .clamp(true),
- drag,
- fSel = isF(selectCb),
- fEnd = isF(atDragEnd),
- fDEn = isF(dragEnabled),
- fCEn = isF(clickEnabled),
- bad = [];
-
- function naf(what) {
- return 'd3util.createDragBehavior(): '+ what + ' is not a function';
- }
-
- if (!fSel) {
- bad.push(naf('selectCb'));
- }
- if (!fEnd) {
- bad.push(naf('atDragEnd'));
- }
- if (!fDEn) {
- bad.push(naf('dragEnabled'));
- }
- if (!fCEn) {
- bad.push(naf('clickEnabled'));
- }
-
- if (bad.length) {
- alert(bad.join('\n'));
- return null;
- }
-
-
- function dragged(d) {
- var threshold = draggedThreshold(force.alpha()),
- dx = d.oldX - d.px,
- dy = d.oldY - d.py;
- if (Math.abs(dx) >= threshold || Math.abs(dy) >= threshold) {
- d.dragged = true;
- }
- return d.dragged;
- }
-
- drag = d3.behavior.drag()
- .origin(function(d) { return d; })
- .on('dragstart', function(d) {
- if (clickEnabled() || dragEnabled()) {
- d3.event.sourceEvent.stopPropagation();
-
- d.oldX = d.x;
- d.oldY = d.y;
- d.dragged = false;
- d.fixed |= 2;
- d.dragStarted = true;
- }
- })
- .on('drag', function(d) {
- if (dragEnabled()) {
- d.px = d3.event.x;
- d.py = d3.event.y;
- if (dragged(d)) {
- if (!force.alpha()) {
- force.alpha(.025);
- }
- }
- }
- })
- .on('dragend', function(d) {
- if (d.dragStarted) {
- d.dragStarted = false;
- if (!dragged(d)) {
- // consider this the same as a 'click'
- // (selection of a node)
- if (clickEnabled()) {
- selectCb(d, this); // TODO: set 'this' context instead of param
- }
- }
- d.fixed &= ~6;
-
- // hook at the end of a drag gesture
- if (dragEnabled()) {
- atDragEnd(d, this); // TODO: set 'this' context instead of param
- }
- }
- });
-
- return drag;
- }
-
- function loadGlow(defs) {
- // TODO: parameterize color
-
- var glow = defs.append('filter')
- .attr('x', '-50%')
- .attr('y', '-50%')
- .attr('width', '200%')
- .attr('height', '200%')
- .attr('id', 'blue-glow');
-
- glow.append('feColorMatrix')
- .attr('type', 'matrix')
- .attr('values',
- '0 0 0 0 0 ' +
- '0 0 0 0 0 ' +
- '0 0 0 0 .7 ' +
- '0 0 0 1 0 ');
-
- glow.append('feGaussianBlur')
- .attr('stdDeviation', 3)
- .attr('result', 'coloredBlur');
-
- glow.append('feMerge').selectAll('feMergeNode')
- .data(['coloredBlur', 'SourceGraphic'])
- .enter().append('feMergeNode')
- .attr('in', String);
- }
-
- // --- Ordinal scales for 7 values.
- // TODO: tune colors for light and dark themes
- // Note: These colors look good on the white background. Still, need to tune for dark.
-
- // blue brown brick red sea green purple dark teal lime
- var lightNorm = ['#3E5780', '#78533B', '#CB4D28', '#018D61', '#8A2979', '#006D73', '#56AF00'],
- lightMute = ['#A8B8CC', '#CCB3A8', '#FFC2BD', '#96D6BF', '#D19FCE', '#8FCCCA', '#CAEAA4'],
-
- darkNorm = ['#3E5780', '#78533B', '#CB4D28', '#018D61', '#8A2979', '#006D73', '#56AF00'],
- darkMute = ['#A8B8CC', '#CCB3A8', '#FFC2BD', '#96D6BF', '#D19FCE', '#8FCCCA', '#CAEAA4'];
-
- function cat7() {
- var colors = {
- light: {
- norm: d3.scale.ordinal().range(lightNorm),
- mute: d3.scale.ordinal().range(lightMute)
- },
- dark: {
- norm: d3.scale.ordinal().range(darkNorm),
- mute: d3.scale.ordinal().range(darkMute)
- }
- },
- tcid = 'd3utilTestCard';
-
- function get(id, muted, theme) {
- // NOTE: since we are lazily assigning domain ids, we need to
- // get the color from all 4 scales, to keep the domains
- // in sync.
- var ln = colors.light.norm(id),
- lm = colors.light.mute(id),
- dn = colors.dark.norm(id),
- dm = colors.dark.mute(id);
- if (theme === 'dark') {
- return muted ? dm : dn;
- } else {
- return muted ? lm : ln;
- }
- }
-
- function testCard(svg) {
- var g = svg.select('g#' + tcid),
- dom = d3.range(7),
- k, muted, theme, what;
-
- if (!g.empty()) {
- g.remove();
-
- } else {
- g = svg.append('g')
- .attr('id', tcid)
- .attr('transform', 'scale(4)translate(20,20)');
-
- for (k=0; k<4; k++) {
- muted = k%2;
- what = muted ? ' muted' : ' normal';
- theme = k < 2 ? 'light' : 'dark';
- dom.forEach(function (id, i) {
- var x = i * 20,
- y = k * 20,
- f = get(id, muted, theme);
- g.append('circle').attr({
- cx: x,
- cy: y,
- r: 5,
- fill: f
- });
- });
- g.append('rect').attr({
- x: 140,
- y: k * 20 - 5,
- width: 32,
- height: 10,
- rx: 2,
- fill: '#888'
- });
- g.append('text').text(theme + what)
- .attr({
- x: 142,
- y: k * 20 + 2,
- fill: 'white'
- })
- .style('font-size', '4pt');
- }
- }
- }
-
- return {
- testCard: testCard,
- get: get
- };
- }
-
- // === register the functions as a library
- onos.ui.addLib('d3util', {
- createDragBehavior: createDragBehavior,
- loadGlow: loadGlow,
- cat7: cat7
- });
-
-}(ONOS));
diff --git a/web/gui/src/main/webapp/legacy/geometry.js b/web/gui/src/main/webapp/legacy/geometry.js
deleted file mode 100644
index 5ede643..0000000
--- a/web/gui/src/main/webapp/legacy/geometry.js
+++ /dev/null
@@ -1,123 +0,0 @@
-/*
- * Copyright 2014 Open Networking Laboratory
- *
- * 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.
- */
-
-/*
- Geometry library - based on work by Mike Bostock.
- */
-
-(function() {
-
- if (typeof geo == 'undefined') {
- geo = {};
- }
-
- var tolerance = 1e-10;
-
- function eq(a, b) {
- return (Math.abs(a - b) < tolerance);
- }
-
- function gt(a, b) {
- return (a - b > -tolerance);
- }
-
- function lt(a, b) {
- return gt(b, a);
- }
-
- geo.eq = eq;
- geo.gt = gt;
- geo.lt = lt;
-
- geo.LineSegment = function(x1, y1, x2, y2) {
- this.x1 = x1;
- this.y1 = y1;
- this.x2 = x2;
- this.y2 = y2;
-
- // Ax + By = C
- this.a = y2 - y1;
- this.b = x1 - x2;
- this.c = x1 * this.a + y1 * this.b;
-
- if (eq(this.a, 0) && eq(this.b, 0)) {
- throw new Error(
- 'Cannot construct a LineSegment with two equal endpoints.');
- }
- };
-
- geo.LineSegment.prototype.intersect = function(that) {
- var d = (this.x1 - this.x2) * (that.y1 - that.y2) -
- (this.y1 - this.y2) * (that.x1 - that.x2);
-
- if (eq(d, 0)) {
- // The two lines are parallel or very close.
- return {
- x : NaN,
- y : NaN
- };
- }
-
- var t1 = this.x1 * this.y2 - this.y1 * this.x2,
- t2 = that.x1 * that.y2 - that.y1 * that.x2,
- x = (t1 * (that.x1 - that.x2) - t2 * (this.x1 - this.x2)) / d,
- y = (t1 * (that.y1 - that.y2) - t2 * (this.y1 - this.y2)) / d,
- in1 = (gt(x, Math.min(this.x1, this.x2)) && lt(x, Math.max(this.x1, this.x2)) &&
- gt(y, Math.min(this.y1, this.y2)) && lt(y, Math.max(this.y1, this.y2))),
- in2 = (gt(x, Math.min(that.x1, that.x2)) && lt(x, Math.max(that.x1, that.x2)) &&
- gt(y, Math.min(that.y1, that.y2)) && lt(y, Math.max(that.y1, that.y2)));
-
- return {
- x : x,
- y : y,
- in1 : in1,
- in2 : in2
- };
- };
-
- geo.LineSegment.prototype.x = function(y) {
- // x = (C - By) / a;
- if (this.a) {
- return (this.c - this.b * y) / this.a;
- } else {
- // a == 0 -> horizontal line
- return NaN;
- }
- };
-
- geo.LineSegment.prototype.y = function(x) {
- // y = (C - Ax) / b;
- if (this.b) {
- return (this.c - this.a * x) / this.b;
- } else {
- // b == 0 -> vertical line
- return NaN;
- }
- };
-
- geo.LineSegment.prototype.length = function() {
- return Math.sqrt(
- (this.y2 - this.y1) * (this.y2 - this.y1) +
- (this.x2 - this.x1) * (this.x2 - this.x1));
- };
-
- geo.LineSegment.prototype.offset = function(x, y) {
- return new geo.LineSegment(
- this.x1 + x, this.y1 + y,
- this.x2 + x, this.y2 + y);
- };
-
-})();
diff --git a/web/gui/src/main/webapp/legacy/glyphs.js b/web/gui/src/main/webapp/legacy/glyphs.js
deleted file mode 100644
index 9f8b461..0000000
--- a/web/gui/src/main/webapp/legacy/glyphs.js
+++ /dev/null
@@ -1,132 +0,0 @@
-/*
- * Copyright 2014 Open Networking Laboratory
- *
- * 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.
- */
-
-/*
- ONOS -- SVG Glyphs Library.
- */
-
-
-(function (onos) {
- 'use strict';
-
- var birdViewBox = '352 224 113 112',
-
- birdData = {
- bird: "M427.7,300.4 c-6.9,0.6-13.1,5-19.2,7.1c-18.1,6.2-33.9," +
- "9.1-56.5,4.7c24.6,17.2,36.6,13,63.7,0.1c-0.5,0.6-0.7,1.3-1.3," +
- "1.9c1.4-0.4,2.4-1.7,3.4-2.2c-0.4,0.7-0.9,1.5-1.4,1.9c2.2-0.6," +
- "3.7-2.3,5.9-3.9c-2.4,2.1-4.2,5-6,8c-1.5,2.5-3.1,4.8-5.1,6.9c-1," +
- "1-1.9,1.9-2.9,2.9c-1.4,1.3-2.9,2.5-5.1,2.9c1.7,0.1,3.6-0.3,6.5" +
- "-1.9c-1.6,2.4-7.1,6.2-9.9,7.2c10.5-2.6,19.2-15.9,25.7-18c18.3" +
- "-5.9,13.8-3.4,27-14.2c1.6-1.3,3-1,5.1-0.8c1.1,0.1,2.1,0.3,3.2," +
- "0.5c0.8,0.2,1.4,0.4,2.2,0.8l1.8,0.9c-1.9-4.5-2.3-4.1-5.9-6c-2.3" +
- "-1.3-3.3-3.8-6.2-4.9c-7.1-2.6-11.9,11.7-11.7-5c0.1-8,4.2-14.4," +
- "6.4-22c1.1-3.8,2.3-7.6,2.4-11.5c0.1-2.3,0-4.7-0.4-7c-2-11.2-8.4" +
- "-21.5-19.7-24.8c-1-0.3-1.1-0.3-0.9,0c9.6,17.1,7.2,38.3,3.1,54.2" +
- "C429.9,285.5,426.7,293.2,427.7,300.4z"
- },
-
- glyphViewBox = '0 0 110 110',
-
- glyphData = {
- unknown: "M35,40a5,5,0,0,1,5-5h30a5,5,0,0,1,5,5v30a5,5,0,0,1-5,5" +
- "h-30a5,5,0,0,1-5-5z",
-
- node: "M15,100a5,5,0,0,1-5-5v-65a5,5,0,0,1,5-5h80a5,5,0,0,1,5,5" +
- "v65a5,5,0,0,1-5,5zM14,22.5l11-11a10,3,0,0,1,10-2h40a10,3,0,0,1," +
- "10,2l11,11zM16,35a5,5,0,0,1,10,0a5,5,0,0,1-10,0z",
-
- switch: "M10,20a10,10,0,0,1,10-10h70a10,10,0,0,1,10,10v70a10,10," +
- "0,0,1-10,10h-70a10,10,0,0,1-10-10zM60,26l12,0,0-8,18,13-18,13,0" +
- "-8-12,0zM60,60l12,0,0-8,18,13-18,13,0-8-12,0zM50,40l-12,0,0-8" +
- "-18,13,18,13,0-8,12,0zM50,74l-12,0,0-8-18,13,18,13,0-8,12,0z",
-
- roadm: "M10,35l25-25h40l25,25v40l-25,25h-40l-25-25zM58,26l12,0,0" +
- "-8,18,13-18,13,0-8-12,0zM58,60l12,0,0-8,18,13-18,13,0-8-12,0z" +
- "M52,40l-12,0,0-8-18,13,18,13,0-8,12,0zM52,74l-12,0,0-8-18,13," +
- "18,13,0-8,12,0z",
-
- endstation: "M10,15a5,5,0,0,1,5-5h65a5,5,0,0,1,5,5v80a5,5,0,0,1" +
- "-5,5h-65a5,5,0,0,1-5-5zM87.5,14l11,11a3,10,0,0,1,2,10v40a3,10," +
- "0,0,1,-2,10l-11,11zM17,19a2,2,0,0,1,2-2h56a2,2,0,0,1,2,2v26a2," +
- "2,0,0,1-2,2h-56a2,2,0,0,1-2-2zM20,20h54v10h-54zM20,33h54v10h" +
- "-54zM42,70a5,5,0,0,1,10,0a5,5,0,0,1-10,0z",
-
- router: "M10,55A45,45,0,0,1,100,55A45,45,0,0,1,10,55M20,50l12,0," +
- "0-8,18,13-18,13,0-8-12,0zM90,50l-12,0,0-8-18,13,18,13,0-8,12,0z" +
- "M50,47l0-12-8,0,13-18,13,18-8,0,0,12zM50,63l0,12-8,0,13,18,13" +
- "-18-8,0,0-12z",
-
- bgpSpeaker: "M10,40a45,35,0,0,1,90,0Q100,77,55,100Q10,77,10,40z" +
- "M50,29l12,0,0-8,18,13-18,13,0-8-12,0zM60,57l-12,0,0-8-18,13," +
- "18,13,0-8,12,0z",
-
- chain: "M60.4,77.6c-4.9,5.2-9.6,11.3-15.3,16.3c-8.6,7.5-20.4,6.8" +
- "-28-0.8c-7.7-7.7-8.4-19.6-0.8-28.4c6.5-7.4,13.5-14.4,20.9-20.9" +
- "c7.5-6.7,19.2-6.7,26.5-0.8c3.5,2.8,4.4,6.1,2.2,8.7c-2.7,3.1" +
- "-5.5,2.5-8.5,0.3c-4.7-3.4-9.7-3.2-14,0.9C37.1,58.7,31,64.8," +
- "25.2,71c-4.2,4.4-4.2,10.6-0.6,14.3c3.7,3.7,9.7,3.7,14.3-0.4" +
- "c2.9-2.5,5.3-5.5,8.3-8c1-0.9,3-1.1,4.4-0.9C54.8,76.3,57.9,77.1," +
- "60.4,77.6zM49.2,32.2c5-5.2,9.7-10.9,15.2-15.7c12.8-11,31.2" +
- "-4.9,34.3,11.2C100,34.2,98.3,40.2,94,45c-6.7,7.4-13.7,14.6" +
- "-21.2,21.2C65.1,73,53.2,72.7,46,66.5c-3.2-2.8-3.9-5.8-1.6-8.4" +
- "c2.6-2.9,5.3-2.4,8.2-0.3c5.2,3.7,10,3.3,14.7-1.1c5.8-5.6,11.6" +
- "-11.3,17.2-17.2c4.6-4.8,4.9-11.1,0.9-15c-3.9-3.9-10.1-3.4-15," +
- "1.2c-3.1,2.9-5.7,7.4-9.3,8.5C57.6,35.3,53,33,49.2,32.2z",
-
- crown: "M99.5,21.6c0,3-2.3,5.4-5.1,5.4c-0.3,0-0.7,0-1-0.1c-1.8," +
- "4-4.8,10-7.2,17.3c-3.4,10.6-0.9,26.2,2.7,27.3C90.4,72,91.3," +
- "75,88,75H22.7c-3.3,0-2.4-3-0.9-3.5c3.6-1.1,6.1-16.7,2.7-27.3" +
- "c-2.4-7.4-5.4-13.5-7.2-17.5c-0.5,0.2-1,0.3-1.6,0.3c-2.8,0" +
- "-5.1-2.4-5.1-5.4c0-3,2.3-5.4,5.1-5.4c2.8,0,5.1,2.4,5.1,5.4c0," +
- "1-0.2,1.9-0.7,2.7c0.7,0.8,1.4,1.6,2.4,2.6c8.8,8.9,11.9,12.7," +
- "18.1,11.7c6.5-1,11-8.2,13.3-14.1c-2-0.8-3.3-2.7-3.3-5.1c0-3," +
- "2.3-5.4,5.1-5.4c2.8,0,5.1,2.4,5.1,5.4c0,2.5-1.6,4.5-3.7,5.2" +
- "c2.3,5.9,6.8,13,13.2,14c6.2,1,9.3-2.7,18.1-11.7c0.7-0.7,1.4" +
- "-1.5,2-2.1c-0.6-0.9-1-2-1-3.1c0-3,2.3-5.4,5.1-5.4C97.2,16.2," +
- "99.5,18.6,99.5,21.6zM92,87.9c0,2.2-1.7,4.1-3.8,4.1H22.4c" +
- "-2.1,0-4.4-1.9-4.4-4.1v-3.3c0-2.2,2.3-4.5,4.4-4.5h65.8c2.1," +
- "0,3.8,2.3,3.8,4.5V87.9z"
- },
-
- badgeViewBox = '0 0 10 10',
-
- badgeData = {
- uiAttached: "M2,2.5a.5,.5,0,0,1,.5-.5h5a.5,.5,0,0,1,.5,.5v3" +
- "a.5,.5,0,0,1-.5,.5h-5a.5,.5,0,0,1-.5-.5zM2.5,2.8a.3,.3,0,0,1," +
- ".3-.3h4.4a.3,.3,0,0,1,.3,.3v2.4a.3,.3,0,0,1-.3,.3h-4.4" +
- "a.3,.3,0,0,1-.3-.3zM2,6.55h6l1,1.45h-8z"
- };
-
- function defStuff(defs, viewbox, data) {
- d3.map(data).keys().forEach(function (key) {
- defs.append('symbol')
- .attr({ id: key, viewBox: viewbox })
- .append('path').attr('d', data[key]);
- });
- }
-
- function loadDefs(defs) {
- defStuff(defs, birdViewBox, birdData);
- defStuff(defs, glyphViewBox, glyphData);
- defStuff(defs, badgeViewBox, badgeData);
- }
-
- onos.ui.addLib('glyphs', {
- loadDefs: loadDefs
- });
-
-}(ONOS));
diff --git a/web/gui/src/main/webapp/legacy/index.html b/web/gui/src/main/webapp/legacy/index.html
deleted file mode 100644
index 0e5f57a..0000000
--- a/web/gui/src/main/webapp/legacy/index.html
+++ /dev/null
@@ -1,111 +0,0 @@
-<!DOCTYPE html>
-<!--
- ~ Copyright 2014 Open Networking Laboratory
- ~
- ~ 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.
- -->
-
-<!--
- ONOS UI - single page web app
- Version 1.1
- -->
-<html>
-<head>
- <meta charset="utf-8">
- <link rel="shortcut icon" href="../img/onos-logo.png">
- <title>ONOS</title>
-
- <!-- Third party library code included here -->
- <!--TODO: use the minified version of d3, once debugging is complete -->
- <script src="../tp/d3.js"></script>
- <script src="../tp/topojson.v1.min.js"></script>
- <script src="../tp/jquery-2.1.1.min.js"></script>
-
- <!-- ONOS UI Framework included here -->
- <script src="onos.js"></script>
-
- <!-- Framework and library stylesheets included here -->
- <link rel="stylesheet" href="base.css">
- <link rel="stylesheet" href="onos.css">
- <link rel="stylesheet" href="onosMast.css">
- <link rel="stylesheet" href="onosFloatPanel.css">
- <link rel="stylesheet" href="onosFlash.css">
- <link rel="stylesheet" href="onosQuickHelp.css">
-
- <!-- This is where contributed stylesheets get INJECTED -->
- <!-- TODO: replace with template marker and inject refs server-side -->
- <link rel="stylesheet" href="topo.css">
-</head>
-<body>
- <div id="frame">
- <div id="mast">
- <!-- NOTE: masthead injected here by mast.js -->
- </div>
- <div id="view">
- <!-- NOTE: views injected here by onos.js -->
- </div>
- <div id="floatPanels">
- <!-- NOTE: floating panels injected here, as needed -->
- <!-- see onos.ui.addFloatingPanel -->
- </div>
- <div id="alerts">
- <!-- NOTE: alert content injected here, as needed -->
- </div>
- <div id="feedback">
- <!-- NOTE: feedback flashes to user -->
- </div>
- <div id="quickhelp">
- <!-- NOTE: key bindings and mouse gesture help -->
- </div>
- </div>
-
- <!-- Initialize the UI...-->
- <script type="text/javascript">
- var ONOS = $.onos({
- comment: 'configuration options',
- theme: 'dark',
- startVid: 'topo'
- });
- </script>
-
- <!-- Library modules included here -->
- <script src="d3Utils.js"></script>
- <script src="geometry.js"></script>
- <script src="glyphs.js"></script>
-
- <!-- Framework modules included here -->
- <script src="onosMast.js"></script>
- <script src="onosFlash.js"></script>
- <script src="onosQuickHelp.js"></script>
-
- <!-- View Module Templates; REMOVE THESE LINES, FOR PRODUCTION -->
- <script src="module-svg-template.js"></script>
- <script src="module-div-template.js"></script>
-
- <!-- Sample Views; REMOVE THESE LINES, FOR PRODUCTION -->
- <script src="sample.js"></script>
- <script src="sampleRadio.js"></script>
- <script src="sampleKeys.js"></script>
- <script src="sampleHash.js"></script>
-
- <!-- Contributed (application) views injected here -->
- <!-- TODO: replace with template marker and inject refs server-side -->
- <script src="topo.js"></script>
-
- <!-- finally, build the UI-->
- <script type="text/javascript">
- $(ONOS.buildUi);
- </script>
-
-</body>
-</html>
diff --git a/web/gui/src/main/webapp/legacy/module-div-template.js b/web/gui/src/main/webapp/legacy/module-div-template.js
deleted file mode 100644
index 52aece9..0000000
--- a/web/gui/src/main/webapp/legacy/module-div-template.js
+++ /dev/null
@@ -1,105 +0,0 @@
-/*
- * Copyright 2014 Open Networking Laboratory
- *
- * 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.
- */
-
-/*
- Module template file for DIV based view.
- */
-
-(function (onos) {
- 'use strict';
-
- var list,
- data = [ 'foo', 'bar', 'baz' ];
-
- // invoked only the first time the view is loaded
- // - used to initialize the view contents
- function init(view, ctx, flags) {
- // NOTE: view.$div is a D3 selection of the view's div
- list = view.$div.append('ul');
- // ... further code to initialize the SVG view ...
-
- }
-
- // invoked just prior to loading the view
- // - used to clear the view of stale data
- function reset(view, ctx, flags) {
-
- }
-
- // invoked when the view is loaded
- // - used to load data into the view,
- // when the view is shown
- function load(view, ctx, flags) {
- list.selectAll('li')
- .data(data)
- .enter()
- .append('li')
- .text(function (d) { return d; })
- }
-
- // invoked when the view is unloaded
- // - used to clean up data that should be removed,
- // when the view is hidden
- function unload(view, ctx, flags) {
-
- }
-
- // invoked when the view is resized
- // - used to reconfigure elements to the new view size
- function resize(view, ctx, flags) {
- var w = view.width(),
- h = view.height();
-
- }
-
- // invoked when the framework needs to alert the view of an error
- // - (EXPERIMENTAL -- not currently used)
- function error(view, ctx, flags) {
-
- }
-
- // ================================================================
- // == register the view here, with links to lifecycle callbacks
-
- // A typical setup that initializes the view once, then reacts to
- // load and resize events would look like this:
-
- onos.ui.addView('myDivViewId', {
- init: init,
- load: load,
- resize: resize
- });
-
- // A minimum setup that builds the view every time it is loaded
- // would look like this:
- //
- // onos.ui.addView('myViewId', {
- // reset: true, // clear view contents on reset
- // load: load
- // });
-
- // The complete gamut of callbacks would look like this:
- //
- // onos.ui.addView('myViewId', {
- // init: init,
- // reset: reset,
- // load: load,
- // unload: unload,
- // resize: resize,
- // error: error
- // });
-
-}(ONOS));
diff --git a/web/gui/src/main/webapp/legacy/module-svg-template.js b/web/gui/src/main/webapp/legacy/module-svg-template.js
deleted file mode 100644
index d4d7c4f..0000000
--- a/web/gui/src/main/webapp/legacy/module-svg-template.js
+++ /dev/null
@@ -1,135 +0,0 @@
-/*
- * Copyright 2014 Open Networking Laboratory
- *
- * 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.
- */
-
-/*
- Module template file for SVG based view.
- */
-
-(function (onos) {
- 'use strict';
-
- var svg,
- data = [ 60 ];
-
- // invoked only the first time the view is loaded
- // - used to initialize the view contents
- function init(view, ctx, flags) {
- svg = view.$div.append('svg');
- resize(view);
- // ... further code to initialize the SVG view ...
-
- }
-
- // invoked just prior to loading the view
- // - used to clear the view of stale data
- function reset(view, ctx, flags) {
- // e.g. clear svg of all objects...
- // svg.html('');
-
- }
-
- // invoked when the view is loaded
- // - used to load data into the view,
- // when the view is shown
- function load(view, ctx, flags) {
- var w = view.width(),
- h = view.height();
-
- // as an example...
- svg.selectAll('circle')
- .data(data)
- .enter()
- .append('circle')
- .attr({
- cx: w / 2,
- cy: h / 2,
- r: function (d) { return d; }
- })
- .style({
- fill: 'goldenrod',
- stroke: 'black',
- 'stroke-width': 3.5,
- });
- }
-
- // invoked when the view is unloaded
- // - used to clean up data that should be removed,
- // when the view is hidden
- function unload(view, ctx, flags) {
-
- }
-
- // invoked when the view is resized
- // - used to reconfigure elements to the new size of the view
- function resize(view, ctx, flags) {
- var w = view.width(),
- h = view.height();
-
- // resize svg layer to match new size of view
- svg.attr({
- width: w,
- height: h
- });
-
- // as an example...
- svg.selectAll('circle')
- .attr({
- cx: w / 2,
- cy: h / 2
- });
-
- // ... further code to handle resize of view ...
-
- }
-
- // invoked when the framework needs to alert the view of an error
- // - (EXPERIMENTAL -- not currently used)
- function error(view, ctx, flags) {
-
- }
-
- // ================================================================
- // == register the view here, with links to lifecycle callbacks
-
- // A typical setup that initializes the view once, then reacts to
- // load and resize events would look like this:
-
- onos.ui.addView('mySvgViewId', {
- init: init,
- load: load,
- resize: resize
- });
-
- // A minimum setup that builds the view every time it is loaded
- // would look like this:
- //
- // onos.ui.addView('myViewId', {
- // reset: true, // clear view contents on reset
- // load: load
- // });
-
- // The complete gamut of callbacks would look like this:
- //
- // onos.ui.addView('myViewId', {
- // init: init,
- // reset: reset,
- // load: load,
- // unload: unload,
- // resize: resize,
- // error: error
- // });
-
-}(ONOS));
diff --git a/web/gui/src/main/webapp/legacy/onos-logo.png b/web/gui/src/main/webapp/legacy/onos-logo.png
deleted file mode 100644
index 8688cd6..0000000
--- a/web/gui/src/main/webapp/legacy/onos-logo.png
+++ /dev/null
Binary files differ
diff --git a/web/gui/src/main/webapp/legacy/onos.css b/web/gui/src/main/webapp/legacy/onos.css
deleted file mode 100644
index 5870044..0000000
--- a/web/gui/src/main/webapp/legacy/onos.css
+++ /dev/null
@@ -1,134 +0,0 @@
-/*
- * Copyright 2014 Open Networking Laboratory
- *
- * 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.
- */
-
-/*
- ONOS GUI -- Base Framework -- CSS file
- */
-
-html, body {
- height: 100%;
-}
-
-/* This is to ensure that the body does not expand to account for the
- flyout details pane, that is positioned "off screen".
- */
-body {
- overflow: hidden;
-}
-
-#frame {
- width: 100%;
- height: 100%;
- background-color: #fff;
-}
-
-div.onosView {
- display: none;
-}
-
-div.onosView.currentView {
- display: block;
-}
-
-
-#alerts {
- display: none;
- position: absolute;
- z-index: 1200;
- opacity: 0.65;
- background-color: #006;
- color: white;
- top: 80px;
- left: 40px;
- padding: 3px 6px;
- -moz-border-radius: 6px;
- border-radius: 6px;
- box-shadow: 0px 2px 12px #777;
-}
-
-#alerts pre {
- margin: 0.2em 6px;
-}
-
-#alerts span.close {
- color: #6af;
- float: right;
- right: 2px;
- cursor: pointer;
-}
-
-#alerts span.close:hover {
- color: #fff;
-}
-
-#alerts p.footnote {
- text-align: right;
- font-size: 8pt;
- margin: 8px 0 0 0;
- color: #66d;
-}
-
-#floatPanels {
- z-index: 1100;
-}
-
-#flyout {
- position: absolute;
- display: block;
- top: 10%;
- width: 280px;
- right: -300px;
- opacity: 0;
- background-color: rgba(255,255,255,0.8);
-
- padding: 10px;
- color: black;
- font-size: 10pt;
- box-shadow: 2px 2px 16px #777;
-}
-
-#flyout h2 {
- margin: 8px 4px;
- color: black;
- vertical-align: middle;
-}
-
-#flyout h2 img {
- height: 32px;
- padding-right: 8px;
- vertical-align: middle;
-}
-
-#flyout p, table {
- margin: 4px 4px;
-}
-
-#flyout td.label {
- font-style: italic;
- color: #777;
- padding-right: 12px;
-}
-
-#flyout td.value {
-
-}
-
-#flyout hr {
- height: 1px;
- color: #ccc;
- background-color: #ccc;
- border: 0;
-}
diff --git a/web/gui/src/main/webapp/legacy/onos.js b/web/gui/src/main/webapp/legacy/onos.js
deleted file mode 100644
index c122177..0000000
--- a/web/gui/src/main/webapp/legacy/onos.js
+++ /dev/null
@@ -1,1002 +0,0 @@
-/*
- * Copyright 2014 Open Networking Laboratory
- *
- * 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.
- */
-
-/*
- ONOS GUI -- Base Framework
- */
-
-(function ($) {
- 'use strict';
- var tsI = new Date().getTime(), // initialize time stamp
- tsB, // build time stamp
- mastHeight = 36, // see mast2.css
- defaultVid = 'sample';
-
-
- // attach our main function to the jQuery object
- $.onos = function (options) {
- var uiApi,
- viewApi,
- navApi,
- libApi,
- exported = {};
-
- var defaultOptions = {
- trace: false,
- theme: 'dark',
- startVid: defaultVid
- };
-
- // compute runtime settings
- var settings = $.extend({}, defaultOptions, options);
-
- // set the selected theme
- d3.select('body').classed(settings.theme, true);
-
- // internal state
- var views = {},
- fpanels = {},
- current = {
- view: null,
- ctx: '',
- flags: {},
- theme: settings.theme
- },
- built = false,
- buildErrors = [],
- keyHandler = {
- globalKeys: {},
- maskedKeys: {},
- viewKeys: {},
- viewFn: null,
- viewGestures: []
- },
- alerts = {
- open: false,
- count: 0
- };
-
- // DOM elements etc.
- // TODO: verify existence of following elements...
- var $view = d3.select('#view'),
- $floatPanels = d3.select('#floatPanels'),
- $alerts = d3.select('#alerts'),
- // note, following elements added programmatically...
- $mastRadio;
-
-
- function whatKey(code) {
- switch (code) {
- case 13: return 'enter';
- case 16: return 'shift';
- case 17: return 'ctrl';
- case 18: return 'alt';
- case 27: return 'esc';
- case 32: return 'space';
- case 37: return 'leftArrow';
- case 38: return 'upArrow';
- case 39: return 'rightArrow';
- case 40: return 'downArrow';
- case 91: return 'cmdLeft';
- case 93: return 'cmdRight';
- case 187: return 'equals';
- case 189: return 'dash';
- case 191: return 'slash';
- case 192: return 'backQuote';
- case 220: return 'backSlash';
- default:
- if ((code >= 48 && code <= 57) ||
- (code >= 65 && code <= 90)) {
- return String.fromCharCode(code);
- } else if (code >= 112 && code <= 123) {
- return 'F' + (code - 111);
- }
- return '.';
- }
- }
-
-
- // ..........................................................
- // Internal functions
-
- // throw an error
- function throwError(msg) {
- // separate function, as we might add tracing here too, later
- throw new Error(msg);
- }
-
- function doError(msg) {
- console.error(msg);
- doAlert(msg);
- }
-
- function trace(msg) {
- if (settings.trace) {
- console.log(msg);
- }
- }
-
- function traceFn(fn, params) {
- if (settings.trace) {
- console.log('*FN* ' + fn + '(...): ' + params);
- }
- }
-
- // hash navigation
- function hash() {
- var hash = window.location.hash,
- redo = false,
- view,
- t;
-
- traceFn('hash', hash);
-
- if (!hash) {
- hash = settings.startVid;
- redo = true;
- }
-
- t = parseHash(hash);
- if (!t || !t.vid) {
- doError('Unable to parse target hash: "' + hash + '"');
- }
-
- view = views[t.vid];
- if (!view) {
- doError('No view defined with id: ' + t.vid);
- }
-
- if (redo) {
- window.location.hash = makeHash(t);
- // the above will result in a hashchange event, invoking
- // this function again
- } else {
- // hash was not modified... navigate to where we need to be
- navigate(hash, view, t);
- }
- }
-
- function parseHash(s) {
- // extract navigation coordinates from the supplied string
- // "vid,ctx?flag1,flag2" --> { vid:vid, ctx:ctx, flags:{...} }
- traceFn('parseHash', s);
-
- // look for use of flags, first
- var vidctx,
- vid,
- ctx,
- flags,
- flagMap,
- m;
-
- // RE that includes flags ('?flag1,flag2')
- m = /^[#]{0,1}(.+)\?(.+)$/.exec(s);
- if (m) {
- vidctx = m[1];
- flags = m[2];
- flagMap = {};
- } else {
- // no flags
- m = /^[#]{0,1}((.+)(,.+)*)$/.exec(s);
- if (m) {
- vidctx = m[1];
- } else {
- // bad hash
- return null;
- }
- }
-
- vidctx = vidctx.split(',');
- vid = vidctx[0];
- ctx = vidctx[1];
- if (flags) {
- flags.split(',').forEach(function (f) {
- flagMap[f.trim()] = true;
- });
- }
-
- return {
- vid: vid.trim(),
- ctx: ctx ? ctx.trim() : '',
- flags: flagMap
- };
-
- }
-
- function makeHash(t, ctx, flags) {
- traceFn('makeHash');
- // make a hash string from the given navigation coordinates,
- // and optional flags map.
- // if t is not an object, then it is a vid
- var h = t,
- c = ctx || '',
- f = $.isPlainObject(flags) ? flags : null;
-
- if ($.isPlainObject(t)) {
- h = t.vid;
- c = t.ctx || '';
- f = t.flags || null;
- }
-
- if (c) {
- h += ',' + c;
- }
- if (f) {
- h += '?' + d3.map(f).keys().join(',');
- }
- trace('hash = "' + h + '"');
- return h;
- }
-
- function navigate(hash, view, t) {
- traceFn('navigate', view.vid);
- // closePanes() // flyouts etc.
- // updateNav() // accordion / selected nav item etc.
- createView(view);
- setView(view, hash, t);
- }
-
- function buildError(msg) {
- buildErrors.push(msg);
- }
-
- function reportBuildErrors() {
- traceFn('reportBuildErrors');
- var nerr = buildErrors.length,
- errmsg;
- if (!nerr) {
- console.log('(no build errors)');
- } else {
- errmsg = 'Build errors: ' + nerr + ' found...\n\n' +
- buildErrors.join('\n');
- doAlert(errmsg);
- console.error(errmsg);
- }
- }
-
- // returns the reference if it is a function, null otherwise
- function isF(f) {
- return $.isFunction(f) ? f : null;
- }
-
- // returns the reference if it is an array, null otherwise
- function isA(a) {
- return $.isArray(a) ? a : null;
- }
-
- // ..........................................................
- // View life-cycle functions
-
- function setViewDimensions(sel) {
- var w = window.innerWidth,
- h = window.innerHeight - mastHeight;
- sel.each(function () {
- $(this)
- .css('width', w + 'px')
- .css('height', h + 'px')
- });
- }
-
- function createView(view) {
- var $d;
-
- // lazy initialization of the view
- if (view && !view.$div) {
- trace('creating view for ' + view.vid);
- $d = $view.append('div')
- .attr({
- id: view.vid,
- class: 'onosView'
- });
- setViewDimensions($d);
- view.$div = $d; // cache a reference to the D3 selection
- }
- }
-
- function setView(view, hash, t) {
- traceFn('setView', view.vid);
- // set the specified view as current, while invoking the
- // appropriate life-cycle callbacks
-
- // first, we'll start by closing the alerts pane, if open
- closeAlerts();
-
- // if there is a current view, and it is not the same as
- // the incoming view, then unload it...
- if (current.view && (current.view.vid !== view.vid)) {
- current.view.unload();
-
- // detach radio buttons, key handlers, etc.
- $('#mastRadio').children().detach();
- keyHandler.viewKeys = {};
- keyHandler.viewFn = null;
- }
-
- // cache new view and context
- current.view = view;
- current.ctx = t.ctx || '';
- current.flags = t.flags || {};
-
- // init is called only once, after the view is in the DOM
- if (!view.inited) {
- view.init(current.ctx, current.flags);
- view.inited = true;
- }
-
- // clear the view of stale data
- view.reset();
-
- // load the view
- view.load(current.ctx, current.flags);
- }
-
- // generate 'unique' id by prefixing view id
- function makeUid(view, id) {
- return view.vid + '-' + id;
- }
-
- // restore id by removing view id prefix
- function unmakeUid(view, uid) {
- var re = new RegExp('^' + view.vid + '-');
- return uid.replace(re, '');
- }
-
- function setRadioButtons(vid, btnSet) {
- var view = views[vid],
- btnG,
- api = {};
-
- // lazily create the buttons...
- if (!(btnG = view.radioButtons)) {
- btnG = d3.select(document.createElement('div'));
- btnG.buttonDef = {};
-
- btnSet.forEach(function (btn, i) {
- var bid = btn.id || 'b' + i,
- txt = btn.text || 'Button #' + i,
- uid = makeUid(view, bid),
- button = btnG.append('span')
- .attr({
- id: uid,
- class: 'radio'
- })
- .text(txt);
-
- btn.id = bid;
- btnG.buttonDef[uid] = btn;
-
- if (i === 0) {
- button.classed('active', true);
- btnG.selected = bid;
- }
- });
-
- btnG.selectAll('span')
- .on('click', function (d) {
- var button = d3.select(this),
- uid = button.attr('id'),
- btn = btnG.buttonDef[uid],
- act = button.classed('active');
-
- if (!act) {
- btnG.selectAll('span').classed('active', false);
- button.classed('active', true);
- btnG.selected = btn.id;
- if (isF(btn.cb)) {
- btn.cb(view.token(), btn);
- }
- }
- });
-
- view.radioButtons = btnG;
-
- api.selected = function () {
- return btnG.selected;
- }
- }
-
- // attach the buttons to the masthead
- $mastRadio.node().appendChild(btnG.node());
- // return an api for interacting with the button set
- return api;
- }
-
- function setupGlobalKeys() {
- $.extend(keyHandler, {
- globalKeys: {
- backSlash: [quickHelp, 'Show / hide Quick Help'],
- slash: [quickHelp, 'Show / hide Quick Help'],
- esc: [escapeKey, 'Dismiss dialog or cancel selections'],
- T: [toggleTheme, "Toggle theme"]
- },
- globalFormat: ['backSlash', 'slash', 'esc', 'T'],
-
- // Masked keys are global key handlers that always return true.
- // That is, the view will never see the event for that key.
- maskedKeys: {
- slash: true,
- backSlash: true,
- T: true
- }
- });
- }
-
- function quickHelp(view, key, code, ev) {
- libApi.quickHelp.show(keyHandler);
- return true;
- }
-
- function escapeKey(view, key, code, ev) {
- if (alerts.open) {
- closeAlerts();
- return true;
- }
- if (libApi.quickHelp.hide()) {
- return true;
- }
- return false;
- }
-
- function toggleTheme(view, key, code, ev) {
- var body = d3.select('body');
- current.theme = (current.theme === 'light') ? 'dark' : 'light';
- body.classed('light dark', false);
- body.classed(current.theme, true);
- theme(view);
- return true;
- }
-
- function setGestureNotes(g) {
- keyHandler.viewGestures = isA(g) || [];
- }
-
- function setKeyBindings(keyArg) {
- var viewKeys,
- masked = [];
-
- if ($.isFunction(keyArg)) {
- // set general key handler callback
- keyHandler.viewFn = keyArg;
- } else {
- // set specific key filter map
- viewKeys = d3.map(keyArg).keys();
- viewKeys.forEach(function (key) {
- if (keyHandler.maskedKeys[key]) {
- masked.push(' Key "' + key + '" is reserved');
- }
- });
-
- if (masked.length) {
- doAlert('WARNING...\n\nsetKeys():\n' + masked.join('\n'));
- }
- keyHandler.viewKeys = keyArg;
- }
- }
-
- function keyIn() {
- var event = d3.event,
- keyCode = event.keyCode,
- key = whatKey(keyCode),
- kh = keyHandler,
- gk = kh.globalKeys[key],
- gcb = isF(gk) || (isA(gk) && isF(gk[0])),
- vk = kh.viewKeys[key],
- vcb = isF(vk) || (isA(vk) && isF(vk[0])) || isF(kh.viewFn),
- token = current.view.token();
-
- // global callback?
- if (gcb && gcb(token, key, keyCode, event)) {
- // if the event was 'handled', we are done
- return;
- }
- // otherwise, let the view callback have a shot
- if (vcb) {
- vcb(token, key, keyCode, event);
- }
- }
-
- function createAlerts() {
- $alerts.style('display', 'block');
- $alerts.append('span')
- .attr('class', 'close')
- .text('X')
- .on('click', closeAlerts);
- $alerts.append('pre');
- $alerts.append('p').attr('class', 'footnote')
- .text('Press ESCAPE to close');
- alerts.open = true;
- alerts.count = 0;
- }
-
- function closeAlerts() {
- $alerts.style('display', 'none')
- .html('');
- alerts.open = false;
- }
-
- function addAlert(msg) {
- var lines,
- oldContent;
-
- if (alerts.count) {
- oldContent = $alerts.select('pre').html();
- }
-
- lines = msg.split('\n');
- lines[0] += ' '; // spacing so we don't crowd 'X'
- lines = lines.join('\n');
-
- if (oldContent) {
- lines += '\n----\n' + oldContent;
- }
-
- $alerts.select('pre').html(lines);
- alerts.count++;
- }
-
- function doAlert(msg) {
- if (!alerts.open) {
- createAlerts();
- }
- addAlert(msg);
- }
-
- function resize(e) {
- d3.selectAll('.onosView').call(setViewDimensions);
- // allow current view to react to resize event...
- if (current.view) {
- current.view.resize(current.ctx, current.flags);
- }
- }
-
- function theme() {
- // allow current view to react to theme event...
- if (current.view) {
- current.view.theme(current.ctx, current.flags);
- }
- }
-
- // ..........................................................
- // View class
- // Captures state information about a view.
-
- // Constructor
- // vid : view id
- // nid : id of associated nav-item (optional)
- // cb : callbacks (init, reset, load, unload, resize, theme, error)
- function View(vid) {
- var av = 'addView(): ',
- args = Array.prototype.slice.call(arguments),
- nid,
- cb;
-
- args.shift(); // first arg is always vid
- if (typeof args[0] === 'string') { // nid specified
- nid = args.shift();
- }
- cb = args.shift();
-
- this.vid = vid;
-
- if (validateViewArgs(vid)) {
- this.nid = nid; // explicit navitem id (can be null)
- this.cb = $.isPlainObject(cb) ? cb : {}; // callbacks
- this.$div = null; // view not yet added to DOM
- this.radioButtons = null; // no radio buttons yet
- this.ok = true; // valid view
- }
- }
-
- function validateViewArgs(vid) {
- var av = "ui.addView(...): ",
- ok = false;
- if (typeof vid !== 'string' || !vid) {
- doError(av + 'vid required');
- } else if (views[vid]) {
- doError(av + 'View ID "' + vid + '" already exists');
- } else {
- ok = true;
- }
- return ok;
- }
-
- var viewInstanceMethods = {
- token: function () {
- return {
- // attributes
- vid: this.vid,
- nid: this.nid,
- $div: this.$div,
-
- // functions
- width: this.width,
- height: this.height,
- uid: this.uid,
- setRadio: this.setRadio,
- setKeys: this.setKeys,
- setGestures: this.setGestures,
- dataLoadError: this.dataLoadError,
- alert: this.alert,
- flash: this.flash,
- getTheme: this.getTheme
- }
- },
-
- // == Life-cycle functions
- // TODO: factor common code out of life-cycle
- init: function (ctx, flags) {
- var c = ctx || '',
- fn = isF(this.cb.init);
- traceFn('View.init', this.vid + ', ' + c);
- if (fn) {
- trace('INIT cb for ' + this.vid);
- fn(this.token(), c, flags);
- }
- },
-
- reset: function (ctx, flags) {
- var c = ctx || '',
- fn = isF(this.cb.reset);
- traceFn('View.reset', this.vid);
- if (fn) {
- trace('RESET cb for ' + this.vid);
- fn(this.token(), c, flags);
- } else if (this.cb.reset === true) {
- // boolean true signifies "clear view"
- trace(' [true] cleaing view...');
- viewApi.empty();
- }
- },
-
- load: function (ctx, flags) {
- var c = ctx || '',
- fn = isF(this.cb.load);
- traceFn('View.load', this.vid + ', ' + c);
- this.$div.classed('currentView', true);
- if (fn) {
- trace('LOAD cb for ' + this.vid);
- fn(this.token(), c, flags);
- }
- },
-
- unload: function (ctx, flags) {
- var c = ctx | '',
- fn = isF(this.cb.unload);
- traceFn('View.unload', this.vid);
- this.$div.classed('currentView', false);
- if (fn) {
- trace('UNLOAD cb for ' + this.vid);
- fn(this.token(), c, flags);
- }
- },
-
- resize: function (ctx, flags) {
- var c = ctx || '',
- fn = isF(this.cb.resize),
- w = this.width(),
- h = this.height();
- traceFn('View.resize', this.vid + '/' + c +
- ' [' + w + 'x' + h + ']');
- if (fn) {
- trace('RESIZE cb for ' + this.vid);
- fn(this.token(), c, flags);
- }
- },
-
- theme: function (ctx, flags) {
- var c = ctx | '',
- fn = isF(this.cb.theme);
- traceFn('View.theme', this.vid);
- if (fn) {
- trace('THEME cb for ' + this.vid);
- fn(this.token(), c, flags);
- }
- },
-
- error: function (ctx, flags) {
- var c = ctx || '',
- fn = isF(this.cb.error);
- traceFn('View.error', this.vid + ', ' + c);
- if (fn) {
- trace('ERROR cb for ' + this.vid);
- fn(this.token(), c, flags);
- }
- },
-
- // == Token API functions
- width: function () {
- return $(this.$div.node()).width();
- },
-
- height: function () {
- return $(this.$div.node()).height();
- },
-
- setRadio: function (btnSet) {
- return setRadioButtons(this.vid, btnSet);
- },
-
- setKeys: function (keyArg) {
- setKeyBindings(keyArg);
- },
-
- setGestures: function (g) {
- setGestureNotes(g);
- },
-
- getTheme: function () {
- return current.theme;
- },
-
- uid: function (id) {
- return makeUid(this, id);
- },
-
- // TODO : add exportApi and importApi methods
- // TODO : implement custom dialogs
-
- // Consider enhancing alert mechanism to handle multiples
- // as individually closable.
- alert: function (msg) {
- doAlert(msg);
- },
-
- flash: function (msg) {
- libApi.feedback.flash(msg);
- },
-
- dataLoadError: function (err, url) {
- var msg = 'Data Load Error\n\n' +
- err.status + ' -- ' + err.statusText + '\n\n' +
- 'relative-url: "' + url + '"\n\n' +
- 'complete-url: "' + err.responseURL + '"';
- this.alert(msg);
- }
-
- // TODO: consider schedule, clearTimer, etc.
- };
-
- // attach instance methods to the view prototype
- $.extend(View.prototype, viewInstanceMethods);
-
- // ..........................................................
- // UI API
-
- var fpConfig = {
- TR: {
- side: 'right'
- },
- TL: {
- side: 'left'
- }
- };
-
- uiApi = {
- addLib: function (libName, api) {
- // TODO: validation of args
- libApi[libName] = api;
- },
-
- // TODO: implement floating panel as a class
- // TODO: parameterize position (currently hard-coded to TopRight)
- /*
- * Creates div in floating panels block, with the given id.
- * Returns panel token used to interact with the panel
- */
- addFloatingPanel: function (id, position) {
- var pos = position || 'TR',
- cfg = fpConfig[pos],
- el,
- fp,
- on = false;
-
- if (fpanels[id]) {
- buildError('Float panel with id "' + id + '" already exists.');
- return null;
- }
-
- el = $floatPanels.append('div')
- .attr('id', id)
- .attr('class', 'fpanel')
- .style('opacity', 0);
-
- // has to be called after el is set.
- el.style(cfg.side, pxHide());
-
- function pxShow() {
- return '20px';
- }
- function pxHide() {
- return (-20 - widthVal()) + 'px';
- }
- function noPx(what) {
- return el.style(what).replace(/px$/, '');
- }
- function widthVal() {
- return noPx('width');
- }
- function heightVal() {
- return noPx('height');
- }
-
- function noop() {}
-
- fp = {
- id: id,
- el: el,
- pos: pos,
- isVisible: function () {
- return on;
- },
-
- show: function (cb) {
- var endCb = isF(cb) || noop;
- on = true;
- el.transition().duration(750)
- .each('end', endCb)
- .style(cfg.side, pxShow())
- .style('opacity', 1);
- },
- hide: function (cb) {
- var endCb = isF(cb) || noop;
- on = false;
- el.transition().duration(750)
- .each('end', endCb)
- .style(cfg.side, pxHide())
- .style('opacity', 0);
- },
- empty: function () {
- return el.html('');
- },
- append: function (what) {
- return el.append(what);
- },
- width: function (w) {
- if (w === undefined) {
- return widthVal();
- }
- el.style('width', w + 'px');
- },
- height: function (h) {
- if (h === undefined) {
- return heightVal();
- }
- el.style('height', h + 'px');
- }
- };
- fpanels[id] = fp;
- return fp;
- },
-
- // TODO: it remains to be seen whether we keep this style of docs
- /** @api ui addView( vid, nid, cb )
- * Adds a view to the UI.
- * <p>
- * Views are loaded/unloaded into the view content pane at
- * appropriate times, by the navigation framework. This method
- * adds a view to the UI and returns a token object representing
- * the view. A view's token is always passed as the first
- * argument to each of the view's life-cycle callback functions.
- * <p>
- * Note that if the view is directly referenced by a nav-item,
- * or in a group of views with one of those views referenced by
- * a nav-item, then the <i>nid</i> argument can be omitted as
- * the framework can infer it.
- * <p>
- * <i>cb</i> is a plain object containing callback functions:
- * "init", "reset", "load", "unload", "resize", "theme", "error".
- * <pre>
- * function myLoad(view, ctx) { ... }
- * ...
- * // short form...
- * onos.ui.addView('viewId', {
- * load: myLoad
- * });
- * </pre>
- *
- * @param vid (string) [*] view ID (a unique DOM element id)
- * @param nid (string) nav-item ID (a unique DOM element id)
- * @param cb (object) [*] callbacks object
- * @return the view token
- */
- addView: function (vid, nid, cb) {
- traceFn('addView', vid);
- var view = new View(vid, nid, cb),
- token;
- if (view.ok) {
- views[vid] = view;
- token = view.token();
- } else {
- token = { vid: view.vid, bad: true };
- }
- return token;
- }
- };
-
- // ..........................................................
- // View API
-
- // TODO: deprecated
- viewApi = {
- /** @api view empty( )
- * Empties the current view.
- * <p>
- * More specifically, removes all DOM elements from the
- * current view's display div.
- */
- empty: function () {
- if (!current.view) {
- return;
- }
- current.view.$div.html('');
- }
- };
-
- // ..........................................................
- // Nav API
- navApi = {
-
- };
-
- // ..........................................................
- // Library API
- libApi = {
-
- };
-
- // ..........................................................
- // Exported API
-
- // function to be called from index.html to build the ONOS UI
- function buildOnosUi() {
- tsB = new Date().getTime();
- tsI = tsB - tsI; // initialization duration
-
- console.log('ONOS UI initialized in ' + tsI + 'ms');
-
- if (built) {
- throwError("ONOS UI already built!");
- }
- built = true;
-
- $mastRadio = d3.select('#mastRadio');
-
- $(window).on('hashchange', hash);
- $(window).on('resize', resize);
-
- d3.select('body').on('keydown', keyIn);
- setupGlobalKeys();
-
- // Invoke hashchange callback to navigate to content
- // indicated by the window location hash.
- hash();
-
- // If there were any build errors, report them
- reportBuildErrors();
- }
-
- // export the api and build-UI function
- return {
- ui: uiApi,
- lib: libApi,
- //view: viewApi,
- nav: navApi,
- buildUi: buildOnosUi,
- exported: exported
- };
- };
-
-}(jQuery));
diff --git a/web/gui/src/main/webapp/legacy/onosFlash.css b/web/gui/src/main/webapp/legacy/onosFlash.css
deleted file mode 100644
index 30decca..0000000
--- a/web/gui/src/main/webapp/legacy/onosFlash.css
+++ /dev/null
@@ -1,46 +0,0 @@
-/*
- * Copyright 2014 Open Networking Laboratory
- *
- * 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.
- */
-
-/*
- ONOS GUI -- Feedback layer -- CSS file
- */
-
-#feedback {
- z-index: 1400;
-}
-
-#feedback svg {
- position: absolute;
- bottom: 0;
- opacity: 0.8;
-}
-
-#feedback svg g.feedbackItem {
- background-color: teal;
-}
-
-#feedback svg g.feedbackItem rect {
- fill: #ccc;
-}
-
-#feedback svg g.feedbackItem text {
- fill: #333;
- stroke: none;
- text-anchor: middle;
- alignment-baseline: middle;
-
- font-size: 16pt;
-}
diff --git a/web/gui/src/main/webapp/legacy/onosFlash.js b/web/gui/src/main/webapp/legacy/onosFlash.js
deleted file mode 100644
index 4035bb3..0000000
--- a/web/gui/src/main/webapp/legacy/onosFlash.js
+++ /dev/null
@@ -1,145 +0,0 @@
-/*
- * Copyright 2014 Open Networking Laboratory
- *
- * 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.
- */
-
-/*
- ONOS GUI -- Feedback layer
-
- Defines the feedback layer for the UI. Used to give user visual feedback
- of choices, typically responding to keystrokes.
- */
-
-(function (onos){
- 'use strict';
-
- // API's
- var api = onos.api;
-
- // Config variables
- var w = '100%',
- h = 200,
- fade = 200,
- showFor = 1200,
- vb = '-200 -' + (h/2) + ' 400 ' + h,
- xpad = 20,
- ypad = 10;
-
- // State variables
- var timer = null,
- data = [];
-
- // DOM elements and the like
- var fb = d3.select('#feedback');
-
- var svg;
-
- //var svg = fb.append('svg').attr({
- // width: w,
- // height: h,
- // viewBox: vb
- //});
-
- function computeBox(el) {
- var text = el.select('text'),
- box = text.node().getBBox();
-
- // center
- box.x = -box.width / 2;
- box.y = -box.height / 2;
-
- // add some padding
- box.x -= xpad;
- box.width += xpad * 2;
- box.y -= ypad;
- box.height += ypad * 2;
-
- return box;
- }
-
- function updateFeedback() {
- if (!svg) {
- svg = fb.append('svg').attr({
- width: w,
- height: h,
- viewBox: vb
- });
- }
-
- var items = svg.selectAll('.feedbackItem')
- .data(data);
-
- var entering = items.enter()
- .append('g')
- .attr({
- class: 'feedbackItem',
- opacity: 0
- })
- .transition()
- .duration(fade)
- .attr('opacity', 1);
-
- entering.each(function (d) {
- var el = d3.select(this),
- box;
-
- d.el = el;
- el.append('rect').attr({ rx: 10, ry: 10});
- el.append('text').text(d.label);
- box = computeBox(el);
- el.select('rect').attr(box);
- });
-
- items.exit()
- .transition()
- .duration(fade)
- .attr({ opacity: 0})
- .remove();
-
- if (svg && data.length === 0) {
- svg.transition()
- .delay(fade + 10)
- .remove();
- svg = null;
- }
- }
-
- function clearFlash() {
- if (timer) {
- clearInterval(timer);
- }
- data = [];
- updateFeedback();
- }
-
- // for now, simply display some text feedback
- function flash(text) {
- // cancel old scheduled event if there was one
- if (timer) {
- clearInterval(timer);
- }
- timer = setInterval(function () {
- clearFlash();
- }, showFor);
-
- data = [{
- label: text
- }];
- updateFeedback();
- }
-
- onos.ui.addLib('feedback', {
- flash: flash
- });
-}(ONOS));
diff --git a/web/gui/src/main/webapp/legacy/onosFloatPanel.css b/web/gui/src/main/webapp/legacy/onosFloatPanel.css
deleted file mode 100644
index 05ae076..0000000
--- a/web/gui/src/main/webapp/legacy/onosFloatPanel.css
+++ /dev/null
@@ -1,46 +0,0 @@
-/*
- * Copyright 2014 Open Networking Laboratory
- *
- * 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.
- */
-
-/*
- ONOS GUI -- Floating Panels -- CSS file
- */
-
-.fpanel {
- position: absolute;
- z-index: 100;
- display: block;
- top: 64px;
- width: 260px;
- right: -300px;
- opacity: 0;
- background-color: rgba(255,255,255,0.8);
-
- padding: 10px;
- color: black;
- font-size: 10pt;
-
- -moz-border-radius: 6px;
- border-radius: 6px;
- box-shadow: 0px 2px 12px #777;
-}
-
-/* TODO: light/dark themes */
-.light .fpanel {
-
-}
-.dark .fpanel {
-
-}
diff --git a/web/gui/src/main/webapp/legacy/onosMast.css b/web/gui/src/main/webapp/legacy/onosMast.css
deleted file mode 100644
index 7210043..0000000
--- a/web/gui/src/main/webapp/legacy/onosMast.css
+++ /dev/null
@@ -1,140 +0,0 @@
-/*
- * Copyright 2014 Open Networking Laboratory
- *
- * 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.
- */
-
-/*
- ONOS GUI -- Masthead -- CSS file
- */
-
-#mast {
- height: 36px;
- padding: 4px;
- vertical-align: baseline;
-}
-
-.light #mast {
- background-color: #bbb;
- box-shadow: 0 2px 8px #777;
-}
-.dark #mast {
- background-color: #444;
- box-shadow: 0 2px 8px #777;
-}
-
-#mast img#logo {
- height: 38px;
- padding-left: 8px;
- padding-right: 8px;
-}
-
-#mast span.title {
- font-size: 14pt;
- font-style: italic;
- vertical-align: 12px;
-}
-
-.light #mast span.title {
- color: #369;
-}
-.dark #mast span.title {
- color: #eee;
-}
-
-#mast span.right {
- padding-top: 8px;
- padding-right: 16px;
- float: right;
-}
-
-#mast span.radio {
- font-size: 10pt;
- margin: 4px 2px;
- padding: 1px 6px;
- -moz-border-radius: 3px;
- border-radius: 3px;
- cursor: pointer;
-}
-
-.light #mast span.radio {
- border: 1px dotted #222;
- color: #eee;
-}
-.dark #mast span.radio {
- border: 1px dotted #bbb;
- color: #888;
-}
-
-#mast span.radio.active {
- padding: 1px 6px;
-}
-
-.light #mast span.radio.active {
- background-color: #bbb;
- border: 1px solid #eee;
- color: #666;
-
-}
-.dark #mast span.radio.active {
- background-color: #222;
- border: 1px solid #eee;
- color: #78a;
-}
-
-/* Button Bar */
-
-#bb {
- margin: 0 30px;
- padding: 0 2px;
-}
-
-#bb .btn {
- margin: 0 4px;
- padding: 2px 6px;
- -moz-border-radius: 3px;
- border-radius: 3px;
- font-size: 9pt;
- cursor: pointer;
-}
-
-.light #bb .btn {
- border: 1px solid #fff;
- border-right-color: #444;
- border-bottom-color: #444;
- color: #222;
-}
-
-.light #bb .btn.active {
- border: 1px solid #444;
- border-right-color: #fff;
- border-bottom-color: #fff;
- background-color: #888;
- color: #ddf;
-}
-
-.dark #bb .btn {
- border: 1px solid #888;
- border-right-color: #111;
- border-bottom-color: #111;
- color: #888;
-}
-
-.dark #bb .btn.active {
- border: 1px solid #111;
- border-right-color: #888;
- border-bottom-color: #888;
- background-color: #555;
- color: #78a;
-}
-
diff --git a/web/gui/src/main/webapp/legacy/onosMast.js b/web/gui/src/main/webapp/legacy/onosMast.js
deleted file mode 100644
index d4f51b7..0000000
--- a/web/gui/src/main/webapp/legacy/onosMast.js
+++ /dev/null
@@ -1,54 +0,0 @@
-/*
- * Copyright 2014 Open Networking Laboratory
- *
- * 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.
- */
-
-/*
- ONOS GUI -- Masthead script
-
- Defines the masthead for the UI. Injects logo and title, as well as providing
- the placeholder for a set of radio buttons.
- */
-
-(function (onos){
- 'use strict';
-
- // API's
- var api = onos.api;
-
- // Config variables
- var guiTitle = 'Open Network Operating System';
-
- // DOM elements and the like
- var mast = d3.select('#mast');
-
- mast.append('img')
- .attr({
- id: 'logo',
- src: 'onos-logo.png'
- });
-
- mast.append('span')
- .attr({
- class: 'title'
- })
- .text(guiTitle);
-
- mast.append('span')
- .attr({
- id: 'mastRadio',
- class: 'right'
- });
-
-}(ONOS));
diff --git a/web/gui/src/main/webapp/legacy/onosQuickHelp.css b/web/gui/src/main/webapp/legacy/onosQuickHelp.css
deleted file mode 100644
index 899730e..0000000
--- a/web/gui/src/main/webapp/legacy/onosQuickHelp.css
+++ /dev/null
@@ -1,64 +0,0 @@
-/*
- * Copyright 2014 Open Networking Laboratory
- *
- * 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.
- */
-
-/*
- ONOS GUI -- Quick Help layer -- CSS file
- */
-
-#quickhelp {
- z-index: 1300;
-}
-
-#quickhelp svg {
- position: absolute;
- top: 180px;
- opacity: 1;
-}
-
-#quickhelp svg g.help rect {
- fill: black;
- opacity: 0.7;
-}
-
-#quickhelp svg text.title {
- font-size: 10pt;
- font-style: italic;
- text-anchor: middle;
- fill: #999;
-}
-
-#quickhelp svg g.keyItem {
- fill: white;
-}
-
-#quickhelp svg g line.qhrowsep {
- stroke: #888;
- stroke-dasharray: 2 2;
-}
-
-#quickhelp svg text {
- font-size: 7pt;
- alignment-baseline: middle;
-}
-
-#quickhelp svg text.key {
- fill: #add;
-}
-
-#quickhelp svg text.desc {
- fill: #ddd;
-}
-
diff --git a/web/gui/src/main/webapp/legacy/onosQuickHelp.js b/web/gui/src/main/webapp/legacy/onosQuickHelp.js
deleted file mode 100644
index c0767ef..0000000
--- a/web/gui/src/main/webapp/legacy/onosQuickHelp.js
+++ /dev/null
@@ -1,351 +0,0 @@
-/*
- * Copyright 2014 Open Networking Laboratory
- *
- * 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.
- */
-
-/*
- ONOS GUI -- Quick Help Layer
-
- Defines the key-map layer for the UI. Used to give user a list of
- key bindings; both global, and for the current view.
- */
-
-(function (onos){
- 'use strict';
-
- // Config variables
- var w = '100%',
- h = '80%',
- fade = 500,
- vb = '-200 0 400 400';
-
- // layout configuration
- var pad = 10,
- offy = 45,
- sepYDelta = 20,
- colXDelta = 16,
- yTextSpc = 12,
- offDesc = 8;
-
- // State variables
- var data = [],
- yCount;
-
- // DOM elements and the like
- var qhdiv = d3.select('#quickhelp'),
- svg = qhdiv.select('svg'),
- pane, rect, items;
-
- // General functions
- function isA(a) { return $.isArray(a) ? a : null; }
- function isS(s) { return typeof s === 'string'; }
-
- function cap(s) {
- return s.replace(/^[a-z]/, function (m) { return m.toUpperCase(); });
- }
-
- var keyDisp = {
- equals: '=',
- dash: '-',
- slash: '/',
- backSlash: '\\',
- backQuote: '`',
- leftArrow: 'L-arrow',
- upArrow: 'U-arrow',
- rightArrow: 'R-arrow',
- downArrow: 'D-arrow'
- };
-
- function mkKeyDisp(id) {
- var v = keyDisp[id] || id;
- return cap(v);
- }
-
- function addSeparator(el, i) {
- var y = sepYDelta/2 - 5;
- el.append('line')
- .attr({ 'class': 'qhrowsep', x1: 0, y1: y, x2: 0, y2: y });
- }
-
- function addContent(el, data, ri) {
- var xCount = 0,
- clsPfx = 'qh-r' + ri + '-c';
-
- function addColumn(el, c, i) {
- var cls = clsPfx + i,
- oy = 0,
- aggKey = el.append('g').attr('visibility', 'hidden'),
- gcol = el.append('g').attr({
- 'class': cls,
- transform: translate(xCount, 0)
- });
-
- c.forEach(function (j) {
- var k = j[0],
- v = j[1];
-
- if (k !== '-') {
- aggKey.append('text').text(k);
-
- gcol.append('text').text(k)
- .attr({
- 'class': 'key',
- y: oy
- });
- gcol.append('text').text(v)
- .attr({
- 'class': 'desc',
- y: oy
- });
- }
-
- oy += yTextSpc;
- });
-
- // adjust position of descriptions, based on widest key
- var kbox = aggKey.node().getBBox(),
- ox = kbox.width + offDesc;
- gcol.selectAll('.desc').attr('x', ox);
- aggKey.remove();
-
- // now update x-offset for next column
- var bbox = gcol.node().getBBox();
- xCount += bbox.width + colXDelta;
- }
-
- data.forEach(function (d, i) {
- addColumn(el, d, i);
- });
-
- // finally, return the height of the row..
- return el.node().getBBox().height;
- }
-
- function updateKeyItems() {
- var rows = items.selectAll('.qhRow').data(data);
-
- yCount = offy;
-
- var entering = rows.enter()
- .append('g')
- .attr({
- 'class': 'qhrow'
- });
-
- entering.each(function (r, i) {
- var el = d3.select(this),
- sep = r.type === 'sep',
- dy;
-
- el.attr('transform', translate(0, yCount));
-
- if (sep) {
- addSeparator(el, i);
- yCount += sepYDelta;
- } else {
- dy = addContent(el, r.data, i);
- yCount += dy;
- }
- });
-
- // size the backing rectangle
- var ibox = items.node().getBBox(),
- paneW = ibox.width + pad * 2,
- paneH = ibox.height + offy;
-
- items.selectAll('.qhrowsep').attr('x2', ibox.width);
- items.attr('transform', translate(-paneW/2, -pad));
- rect.attr({
- width: paneW,
- height: paneH,
- transform: translate(-paneW/2-pad, 0)
- });
-
- }
-
- function translate(x, y) {
- return 'translate(' + x + ',' + y + ')';
- }
-
- function checkFmt(fmt) {
- // should be a single array of keys,
- // or array of arrays of keys (one per column).
- // return null if there is a problem.
- var a = isA(fmt),
- n = a && a.length,
- ns = 0,
- na = 0;
-
- if (n) {
- // it is an array which has some content
- a.forEach(function (d) {
- isA(d) && na++;
- isS(d) && ns++;
- });
- if (na === n || ns === n) {
- // all arrays or all strings...
- return a;
- }
- }
- return null;
- }
-
- function buildBlock(map, fmt) {
- var b = [];
- fmt.forEach(function (k) {
- var v = map.get(k),
- a = isA(v),
- d = (a && a[1]);
-
- // '-' marks a separator; d is the description
- if (k === '-' || d) {
- b.push([mkKeyDisp(k), d]);
- }
- });
- return b;
- }
-
- function emptyRow() {
- return { type: 'row', data: []};
- }
-
- function mkArrRow(fmt) {
- var d = emptyRow();
- d.data.push(fmt);
- return d;
- }
-
- function mkColumnarRow(map, fmt) {
- var d = emptyRow();
- fmt.forEach(function (a) {
- d.data.push(buildBlock(map, a));
- });
- return d;
- }
-
- function mkMapRow(map, fmt) {
- var d = emptyRow();
- d.data.push(buildBlock(map, fmt));
- return d;
- }
-
- function addRow(row) {
- var d = row || { type: 'sep' };
- data.push(d);
- }
-
- function aggregateData(bindings) {
- var hf = '_helpFormat',
- gmap = d3.map(bindings.globalKeys),
- gfmt = bindings.globalFormat,
- vmap = d3.map(bindings.viewKeys),
- vgest = bindings.viewGestures,
- vfmt, vkeys;
-
- // filter out help format entry
- vfmt = checkFmt(vmap.get(hf));
- vmap.remove(hf);
-
- // if bad (or no) format, fallback to sorted keys
- if (!vfmt) {
- vkeys = vmap.keys();
- vfmt = vkeys.sort();
- }
-
- data = [];
-
- addRow(mkMapRow(gmap, gfmt));
- addRow();
- addRow(isA(vfmt[0]) ? mkColumnarRow(vmap, vfmt) : mkMapRow(vmap, vfmt));
- addRow();
- addRow(mkArrRow(vgest));
- }
-
-
- function popBind(bindings) {
- pane = svg.append('g')
- .attr({
- class: 'help',
- opacity: 0
- });
-
- rect = pane.append('rect')
- .attr('rx', 8);
-
- pane.append('text')
- .text('Quick Help')
- .attr({
- class: 'title',
- dy: '1.2em',
- transform: translate(-pad,0)
- });
-
- items = pane.append('g');
- aggregateData(bindings);
- updateKeyItems();
-
- _fade(1);
- }
-
- function fadeBindings() {
- _fade(0);
- }
-
- function _fade(o) {
- svg.selectAll('g.help')
- .transition()
- .duration(fade)
- .attr('opacity', o);
- }
-
- function addSvg() {
- svg = qhdiv.append('svg')
- .attr({
- width: w,
- height: h,
- viewBox: vb
- });
- }
-
- function removeSvg() {
- svg.transition()
- .delay(fade + 20)
- .remove();
- }
-
- function showQuickHelp(bindings) {
- svg = qhdiv.select('svg');
- if (svg.empty()) {
- addSvg();
- popBind(bindings);
- } else {
- hideQuickHelp();
- }
- }
-
- function hideQuickHelp() {
- svg = qhdiv.select('svg');
- if (!svg.empty()) {
- fadeBindings();
- removeSvg();
- return true;
- }
- return false;
- }
-
- onos.ui.addLib('quickHelp', {
- show: showQuickHelp,
- hide: hideQuickHelp
- });
-}(ONOS));
diff --git a/web/gui/src/main/webapp/legacy/sample.js b/web/gui/src/main/webapp/legacy/sample.js
deleted file mode 100644
index bbd7ef9..0000000
--- a/web/gui/src/main/webapp/legacy/sample.js
+++ /dev/null
@@ -1,220 +0,0 @@
-/*
- * Copyright 2014 Open Networking Laboratory
- *
- * 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.
- */
-
-/*
- Sample module file to illustrate framework integration.
- */
-
-(function (onos) {
- 'use strict';
-
- var pi = Math.PI,
- svg,
- dotG,
- nCircles = 12,
- circleData = [],
- dotId = 0,
- angle = 360 / nCircles,
- baseAngle = -90 - angle,
- groupRadius = 120,
- dotRadius = 24,
- dotMoveMs = 800,
- dotAppearMs = 300,
- dotEase = 'elastic',
- colorScale = d3.scale.linear()
- .domain([-pi/2, 2*pi/4, 3*pi/2])
- .range(['green', 'goldenrod', 'blue']);
-
- // set the size of the SVG layer to match that of the view
- function sizeSvg(view) {
- svg.attr({
- width: view.width(),
- height: view.height()
- });
- }
-
- // gets invoked only the first time the view is loaded
- function init(view, ctx, flags) {
- // prepare our SVG layer...
- svg = view.$div.append('svg');
- sizeSvg(view);
- dotG = svg.append('g').attr('id', 'dots');
- }
-
- // gets invoked just before our view is loaded
- function reset(view, ctx, flags) {
- // clear dot group and reset circle data
- dotG.html('');
- circleData = [];
- // also clear text, if any
- svg.selectAll('text').remove();
- }
-
- function updateCirclePositions(view, addNew) {
- var w = view.width(),
- h = view.height(),
- ox = w / 2,
- oy = h / 2;
-
- // reposition existing dots
- circleData.forEach(function (c, i) {
- var inc = addNew ? 1 : 0,
- theta = ((i + inc) * angle + baseAngle) * pi/180,
- dx = Math.cos(theta) * groupRadius,
- dy = Math.sin(theta) * groupRadius,
- x = ox + dx,
- y = oy + dy;
- if (!addNew && i === 0) {
- x = ox;
- y = oy;
- }
- c.cx = x;
- c.cy = y;
- c.rgb = colorScale(theta);
- });
-
- if (addNew) {
- // introduce a new dot
- circleData.unshift({
- cx: ox,
- cy: oy,
- id: dotId++
- });
- }
-
- // +1 to account for the circle in the center..
- if (circleData.length > nCircles + 1) {
- circleData.splice(nCircles + 1, 1);
- }
- }
-
- function doCircles(view) {
- var ox = view.width() / 2,
- oy = view.height() / 2,
- stroke = 'black',
- fill = 'red',
- hoverFill = 'magenta';
-
- // move existing circles, and add a new one
- updateCirclePositions(view, true);
-
- var circ = dotG.selectAll('circle')
- .data(circleData, function (d) { return d.id; });
-
- // operate on existing elements
- circ.on('mouseover', null)
- .on('mouseout', null)
- .on('click', null)
- .transition()
- .duration(dotMoveMs)
- .ease(dotEase)
- .attr({
- cx: function (d) { return d.cx; },
- cy: function (d) { return d.cy; }
- })
- .style({
- cursor: 'default',
- fill: function (d) { return d.rgb; }
- });
-
- // operate on entering elements
- circ.enter()
- .append('circle')
- .attr({
- cx: function (d) { return d.cx; },
- cy: function (d) { return d.cy; },
- r: 0
- })
- .style({
- fill: fill,
- stroke: stroke,
- 'stroke-width': 3.5,
- cursor: 'pointer',
- opacity: 0
- })
- .on('mouseover', function (d) {
- d3.select(this).style('fill', hoverFill);
- })
- .on('mouseout', function (d) {
- d3.select(this).style('fill', fill);
- })
- .on('click', function (d) {
- setTimeout(function() {
- doCircles(view, true);
- }, 10);
- })
- .transition()
- .delay(dotMoveMs)
- .duration(dotAppearMs)
- .attr('r', dotRadius)
- .style('opacity', 1);
-
- // operate on exiting elements
- circ.exit()
- .transition()
- .duration(750)
- .style('opacity', 0)
- .attr({
- cx: ox,
- cy: oy,
- r: groupRadius - dotRadius
- })
- .remove();
- }
-
- function load(view, ctx, flags) {
- var ctxText = ctx ? 'Context is "' + ctx + '"' : '';
-
- // display our view context
- if (ctxText) {
- svg.append('text')
- .text(ctxText)
- .attr({
- x: 20,
- y: '1.5em'
- })
- .style({
- fill: 'darkgreen',
- 'font-size': '20pt'
- });
- }
-
- doCircles(view);
- }
-
- function resize(view, ctx, flags) {
- sizeSvg(view);
- updateCirclePositions(view);
-
- // move exiting dots into new positions, relative to view size
- var circ = dotG.selectAll('circle')
- .data(circleData, function (d) { return d.id; });
- circ.attr({
- cx: function (d) { return d.cx; },
- cy: function (d) { return d.cy; }
- });
- }
-
- // == register our view here, with links to lifecycle callbacks
-
- onos.ui.addView('sample', {
- init: init,
- reset: reset,
- load: load,
- resize: resize
- });
-
-}(ONOS));
diff --git a/web/gui/src/main/webapp/legacy/sampleHash.js b/web/gui/src/main/webapp/legacy/sampleHash.js
deleted file mode 100644
index f668c74..0000000
--- a/web/gui/src/main/webapp/legacy/sampleHash.js
+++ /dev/null
@@ -1,82 +0,0 @@
-/*
- * Copyright 2014 Open Networking Laboratory
- *
- * 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.
- */
-
-/*
- Sample view to illustrate hash formats.
- */
-
-(function (onos) {
- 'use strict';
-
- var intro = "Try using the following hashes in the address bar:",
- hashPrefix = '#sampleHash',
- suffixes = [
- '',
- ',one',
- ',two',
- ',context,ignored',
- ',context,ignored?a,b,c',
- ',two?foo',
- ',three?foo,bar'
- ],
- $d;
-
- function note(txt) {
- $d.append('p')
- .text(txt)
- .style({
- 'font-size': '10pt',
- color: 'darkorange',
- padding: '0 20px',
- margin: 0
- });
- }
-
- function para(txt, color) {
- var c = color || 'black';
- $d.append('p')
- .text(txt)
- .style({
- padding: '2px 8px',
- color: c
- });
- }
-
- function load(view, ctx, flags) {
- var c = ctx || '(undefined)',
- f = flags ? d3.map(flags).keys() : [];
-
- $d = view.$div;
-
- para(intro);
-
- suffixes.forEach(function (s) {
- note(hashPrefix + s);
- });
-
- para('View ID: ' + view.vid, 'blue');
- para('Context: ' + c, 'blue');
- para('Flags: { ' + f.join(', ') + ' }', 'magenta');
- }
-
- // == register the view here, with links to lifecycle callbacks
-
- onos.ui.addView('sampleHash', {
- reset: true, // empty the div on reset
- load: load
- });
-
-}(ONOS));
diff --git a/web/gui/src/main/webapp/legacy/sampleKeys.js b/web/gui/src/main/webapp/legacy/sampleKeys.js
deleted file mode 100644
index ef3d76c..0000000
--- a/web/gui/src/main/webapp/legacy/sampleKeys.js
+++ /dev/null
@@ -1,87 +0,0 @@
-/*
- * Copyright 2014 Open Networking Laboratory
- *
- * 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.
- */
-
-/*
- Sample view to illustrate key bindings.
- */
-
-(function (onos) {
- 'use strict';
-
- var keyDispatch = {
- Z: keyUndo,
- X: keyCut,
- C: keyCopy,
- V: keyPaste,
- space: keySpace
- };
-
- function keyUndo(view) {
- note(view, 'Z = UNDO');
- }
-
- function keyCut(view) {
- note(view, 'X = CUT');
- }
-
- function keyCopy(view) {
- note(view, 'C = COPY');
- }
-
- function keyPaste(view) {
- note(view, 'V = PASTE');
- }
-
- function keySpace(view) {
- note(view, 'The SpaceBar');
- }
-
- function note(view, msg) {
- view.$div.append('p')
- .text(msg)
- .style({
- 'font-size': '10pt',
- color: 'darkorange',
- padding: '0 20px',
- margin: 0
- });
- }
-
- function keyCallback(view, key, keyCode, event) {
- note(view, 'Key = ' + key + ' KeyCode = ' + keyCode);
- }
-
- function load(view, ctx) {
- // this maps specific keys to specific functions (1)
- view.setKeys(keyDispatch);
- // whereas, this installs a general key handler function (2)
- view.setKeys(keyCallback);
-
- // Note that (1) takes precedence over (2)
-
- view.$div.append('p')
- .text('Press a key or two (try Z,X,C,V and others) ...')
- .style('padding', '2px 8px');
- }
-
- // == register the view here, with links to lifecycle callbacks
-
- onos.ui.addView('sampleKeys', {
- reset: true, // empty the div on reset
- load: load
- });
-
-}(ONOS));
diff --git a/web/gui/src/main/webapp/legacy/sampleRadio.js b/web/gui/src/main/webapp/legacy/sampleRadio.js
deleted file mode 100644
index 11dd1ef..0000000
--- a/web/gui/src/main/webapp/legacy/sampleRadio.js
+++ /dev/null
@@ -1,66 +0,0 @@
-/*
- * Copyright 2014 Open Networking Laboratory
- *
- * 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.
- */
-
-/*
- Sample view to illustrate radio buttons.
- */
-
-(function (onos) {
- 'use strict';
-
- var intro = [ 'Yo, radio button set...', 'Time to shine' ],
- btnSet = [
- { text: 'First Button', cb: cbRadio },
- { text: 'Second Button', cb: cbRadio },
- { text: 'Third Button', cb: cbRadio }
- ];
-
- // radio button callback
- function cbRadio(view, btn) {
- write(view, 'You pressed the ' + btn.text);
- }
-
- function write(view, msg) {
- view.$div.append('p')
- .text(msg)
- .style({
- 'font-size': '10pt',
- color: 'green',
- padding: '0 20px',
- margin: '2px'
- });
- }
-
- // invoked when the view is loaded
- function load(view, ctx) {
- view.setRadio(btnSet);
-
- view.$div.selectAll('p')
- .data(intro)
- .enter()
- .append('p')
- .text(function (d) { return d; })
- .style('padding', '2px 8px');
- }
-
- // == register the view here, with links to lifecycle callbacks
-
- onos.ui.addView('sampleRadio', {
- reset: true, // empty the div on reset
- load: load
- });
-
-}(ONOS));
diff --git a/web/gui/src/main/webapp/legacy/topo.css b/web/gui/src/main/webapp/legacy/topo.css
deleted file mode 100644
index ddf15b6..0000000
--- a/web/gui/src/main/webapp/legacy/topo.css
+++ /dev/null
@@ -1,417 +0,0 @@
-/*
- * Copyright 2014 Open Networking Laboratory
- *
- * 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.
- */
-
-/*
- ONOS GUI -- Topology view -- CSS file
- */
-
-#topo svg #topo-bg {
- opacity: 0.5;
-}
-
-#topo #map {
- stroke-width: 2px;
- stroke: #eee;
- fill: transparent;
-}
-
-/* TODO: move glyphs into framework */
-
-#topo svg .glyphIcon {
- fill: black;
- stroke: none;
- fill-rule: evenodd;
-}
-#topo svg .glyphIcon rect {
- fill: #ddd;
- stroke: none;
-}
-
-
-#topo svg .noDevsLayer {
- visibility: hidden;
-}
-
-#topo svg .noDevsLayer text {
- font-size: 60pt;
- font-style: italic;
- fill: #dde;
-}
-
-#topo svg .noDevsBird {
- fill: #ecd;
-}
-
-/* NODES */
-
-#topo svg .node {
- cursor: pointer;
-}
-
-#topo svg .node.selected rect,
-#topo svg .node.selected circle {
- fill: #f90;
- filter: url(#blue-glow);
-}
-
-#topo svg .node text {
- pointer-events: none;
-}
-
-/* Device Nodes */
-
-#topo svg .node.device {
-}
-
-#topo svg .node.device rect {
- stroke-width: 1.5;
-}
-
-#topo svg .node.device.fixed rect {
- stroke-width: 1.5;
- stroke: #ccc;
-}
-
-/* note: device is offline without the 'online' class */
-#topo svg .node.device {
- fill: #777;
-}
-
-#topo svg .node.device.online {
- fill: #6e7fa3;
-}
-
-/* note: device is offline without the 'online' class */
-#topo svg .node.device text {
- fill: #bbb;
- font: 10pt sans-serif;
-}
-
-#topo svg .node.device.online text {
- fill: white;
-}
-
-#topo svg .node.device .glyphIcon rect {
- fill: #aaa;
-}
-#topo svg .node.device .glyphIcon use {
- fill: #777;
-}
-#topo svg .node.device.selected .glyphIcon rect {
- fill: #f90;
-}
-#topo svg .node.device.online .glyphIcon rect {
- fill: #ccc;
-}
-#topo svg .node.device.online .glyphIcon use {
- fill: #000;
-}
-#topo svg .node.device.online.selected .glyphIcon rect {
- fill: #f90;
-}
-
-
-/* Host Nodes */
-
-#topo svg .node.host {
- stroke: #000;
-}
-
-#topo svg .node.host text {
- fill: #846;
- stroke: none;
- font: 9pt sans-serif;
-}
-
-svg .node.host circle {
- stroke: #000;
- fill: #edb;
-}
-
-/* LINKS */
-
-#topo svg .link {
- opacity: .9;
-}
-
-#topo svg .link.inactive {
- opacity: .5;
- stroke-dasharray: 8 4;
-}
-
-#topo svg .link.secondary {
- stroke: rgba(0,153,51,0.5);
- stroke-width: 3px;
-}
-#topo svg .link.primary {
- stroke: #ffA300;
- stroke-width: 4px;
-}
-#topo svg .link.animated {
- stroke: #ffA300;
-}
-
-#topo svg .link.secondary.optical {
- stroke: rgba(128,64,255,0.5);
- stroke-width: 4px;
-}
-#topo svg .link.primary.optical {
- stroke: #74f;
- stroke-width: 6px;
-}
-#topo svg .link.animated.optical {
- stroke: #74f;
- stroke-width: 10px;
-}
-
-#topo svg .linkLabel rect {
- fill: #eee;
- stroke: none;
-}
-#topo svg .linkLabel text {
- text-anchor: middle;
- stroke: #777;
- stroke-width: 0.1;
- font-size: 9pt;
-}
-
-/* Fly-in summary pane */
-
-#topo-summary {
- /* gets base CSS from .fpanel in floatPanel.css */
- top: 64px;
-}
-
-#topo-summary svg {
- display: inline-block;
- width: 42px;
- height: 42px;
-}
-
-#topo-summary svg .glyphIcon {
- fill: black;
- stroke: none;
- fill-rule: evenodd;
-}
-
-#topo-summary h2 {
- position: absolute;
- margin: 0 4px;
- top: 20px;
- left: 50px;
- color: black;
-}
-
-#topo-summary h3 {
- margin: 0 4px;
- top: 20px;
- left: 50px;
- color: black;
-}
-
-#topo-summary p, table {
- margin: 4px 4px;
-}
-
-#topo-summary td.label {
- font-style: italic;
- color: #777;
- padding-right: 12px;
-}
-
-#topo-summary td.value {
-}
-
-#topo-summary hr {
- height: 1px;
- color: #ccc;
- background-color: #ccc;
- border: 0;
-}
-
-/* Fly-in details pane */
-
-#topo-detail {
- /* gets base CSS from .fpanel in floatPanel.css */
- top: 320px;
-
-}
-
-#topo-detail svg {
- display: inline-block;
- width: 42px;
- height: 42px;
-}
-
-#topo-detail svg .glyphIcon {
- fill: black;
- stroke: none;
- fill-rule: evenodd;
-}
-
-#topo-detail h2 {
- position: absolute;
- margin: 0 4px;
- top: 20px;
- left: 50px;
- color: black;
-}
-
-#topo-detail h3 {
- margin: 0 4px;
- top: 20px;
- left: 50px;
- color: black;
-}
-
-#topo-detail p, table {
- margin: 4px 4px;
-}
-
-#topo-detail td.label {
- font-style: italic;
- color: #777;
- padding-right: 12px;
-}
-
-#topo-detail td.value {
-}
-
-
-#topo-detail .actionBtn {
- margin: 6px 12px;
- padding: 2px 6px;
- font-size: 9pt;
- cursor: pointer;
- width: 200px;
- text-align: center;
-
- /* theme specific... */
- border: 2px solid #ddd;
- border-radius: 4px;
- color: #eee;
- background: #888;
-}
-
-#topo-detail .actionBtn:hover {
- /* theme specific... */
- border: 2px solid #ddd;
- color: #eee;
- background: #444;
-}
-
-
-#topo-detail hr {
- height: 1px;
- color: #ccc;
- background-color: #ccc;
- border: 0;
-}
-
-/* ONOS instance stuff */
-
-#topo-oibox {
- height: 100px;
-}
-
-#topo-oibox div.onosInst {
- display: inline-block;
- width: 170px;
- height: 85px;
- cursor: pointer;
-}
-
-#topo-oibox svg rect {
- fill: #ccc;
- stroke: #aaa;
- stroke-width: 3.5;
-}
-#topo-oibox .online svg rect {
- opacity: 1;
- fill: #9cf;
- stroke: #555;
-}
-
-#topo-oibox svg .glyphIcon {
- fill: #888;
- fill-rule: evenodd;
-}
-#topo-oibox .online svg .glyphIcon {
- fill: #000;
-}
-
-#topo-oibox svg .badgeIcon {
- fill: #777;
- fill-rule: evenodd;
-}
-
-#topo-oibox .online svg .badgeIcon {
- fill: #fff;
-}
-
-#topo-oibox svg text {
- text-anchor: middle;
- fill: #777;
-}
-#topo-oibox .online svg text {
- fill: #eee;
-}
-
-#topo-oibox svg text.instTitle {
- font-size: 11pt;
- font-weight: bold;
-}
-#topo-oibox svg text.instLabel {
- font-size: 9pt;
- font-style: italic;
-}
-
-#topo-oibox .onosInst.mastership {
- opacity: 0.3;
-}
-#topo-oibox .onosInst.mastership.affinity {
- opacity: 1.0;
-}
-#topo-oibox .onosInst.mastership.affinity svg rect {
- filter: url(#blue-glow);
-}
-
-
-#topo svg .suppressed {
- opacity: 0.2;
-}
-
-/* Death Mask (starts hidden) */
-
-#topo-mask {
- display: none;
- position: absolute;
- top: 0;
- left: 0;
- width: 10000px;
- height: 8000px;
- z-index: 5000;
- background-color: rgba(0,0,0,0.75);
- padding: 60px;
-}
-
-#topo-mask p {
- margin: 8px 20px;
- color: #ddd;
- font-size: 14pt;
- font-style: italic;
-}
-
diff --git a/web/gui/src/main/webapp/legacy/topo.js b/web/gui/src/main/webapp/legacy/topo.js
deleted file mode 100644
index a8f0570..0000000
--- a/web/gui/src/main/webapp/legacy/topo.js
+++ /dev/null
@@ -1,3160 +0,0 @@
-/*
- * Copyright 2014 Open Networking Laboratory
- *
- * 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.
- */
-
-/*
- ONOS network topology viewer - version 1.1
- */
-
-(function (onos) {
- 'use strict';
-
- // shorter names for library APIs
- var d3u = onos.lib.d3util,
- gly = onos.lib.glyphs;
-
- // configuration data
- var config = {
- useLiveData: true,
- fnTrace: true,
- debugOn: false,
- birdDim: 400,
- options: {
- showBackground: true
- },
- webSockUrl: '../ws/topology',
- data: {
- live: {
- jsonUrl: '../rs/topology/graph',
- detailPrefix: '../rs/topology/graph/',
- detailSuffix: ''
- },
- fake: {
- jsonUrl: 'json/network2.json',
- detailPrefix: 'json/',
- detailSuffix: '.json'
- }
- },
- labels: {
- imgPad: 16,
- padLR: 4,
- padTB: 3,
- marginLR: 3,
- marginTB: 2,
- port: {
- gap: 3,
- width: 18,
- height: 14
- }
- },
- topo: {
- linkBaseColor: '#666',
- linkInColor: '#66f',
- linkInWidth: 12,
- linkOutColor: '#f00',
- linkOutWidth: 10
- },
- icons: {
- device: {
- dim: 36,
- rx: 4,
- xoff: -20,
- yoff: -18
- },
- host: {
- defaultRadius: 9,
- radius: {
- endstation: 14,
- bgpSpeaker: 14,
- router: 14
- }
- }
- },
- force: {
- note_for_links: 'link.type is used to differentiate',
- linkDistance: {
- direct: 100,
- optical: 120,
- hostLink: 3
- },
- linkStrength: {
- direct: 1.0,
- optical: 1.0,
- hostLink: 1.0
- },
- note_for_nodes: 'node.class is used to differentiate',
- charge: {
- device: -8000,
- host: -5000
- }
- },
- // see below in creation of viewBox on main svg
- logicalSize: 1000
- };
-
- // radio buttons
- var layerButtons = [
- { text: 'All Layers', id: 'all', cb: showAllLayers },
- { text: 'Packet Only', id: 'pkt', cb: showPacketLayer },
- { text: 'Optical Only', id: 'opt', cb: showOpticalLayer }
- ],
- layerBtnSet,
- layerBtnDispatch = {
- all: showAllLayers,
- pkt: showPacketLayer,
- opt: showOpticalLayer
- };
-
- // key bindings
- var keyDispatch = {
- // ==== "development mode" ====
- //0: testMe,
- //equals: injectStartupEvents,
- //dash: injectTestEvent,
-
- O: [toggleSummary, 'Toggle ONOS summary pane'],
- I: [toggleInstances, 'Toggle ONOS instances pane'],
- D: [toggleDetails, 'Disable / enable details pane'],
-
- H: [toggleHosts, 'Toggle host visibility'],
- M: [toggleOffline, 'Toggle offline visibility'],
- B: [toggleBg, 'Toggle background image'],
- P: togglePorts,
-
- X: [toggleNodeLock, 'Lock / unlock node positions'],
- Z: [toggleOblique, 'Toggle oblique view (Experimental)'],
- L: [cycleLabels, 'Cycle device labels'],
- U: [unpin, 'Unpin node (hover mouse over)'],
- R: [resetPanZoom, 'Reset pan / zoom'],
-
- V: [showRelatedIntentsAction, 'Show all related intents'],
- rightArrow: [showNextIntentAction, 'Show next related intent'],
- leftArrow: [showPrevIntentAction, 'Show previous related intent'],
- W: [showSelectedIntentTrafficAction, 'Monitor traffic of selected intent'],
- A: [showAllTrafficAction, 'Monitor all traffic'],
- F: [showDeviceLinkFlowsAction, 'Show device link flows'],
-
- E: [equalizeMasters, 'Equalize mastership roles'],
-
- esc: handleEscape,
-
- _helpFormat: [
- ['O', 'I', 'D', '-', 'H', 'M', 'B', 'P' ],
- ['X', 'Z', 'L', 'U', 'R' ],
- ['V', 'rightArrow', 'leftArrow', 'W', 'A', 'F', '-', 'E' ]
- ]
- };
-
- // mouse gestures
- var gestures = [
- ['click', 'Select the item and show details'],
- ['shift-click', 'Toggle selection state'],
- ['drag', 'Reposition (and pin) device / host'],
- ['cmd-scroll', 'Zoom in / out'],
- ['cmd-drag', 'Pan']
- ];
-
- // state variables
- var network = {
- view: null, // view token reference
- nodes: [],
- links: [],
- lookup: {},
- revLinkToKey: {}
- },
- scenario = {
- evDir: 'json/ev/',
- evScenario: '/scenario.json',
- evPrefix: '/ev_',
- evOnos: '_onos.json',
- evUi: '_ui.json',
- ctx: null,
- params: {},
- evNumber: 0,
- view: null
- },
- webSock,
- sid = 0,
- deviceLabelCount = 3,
- hostLabelCount = 2,
- deviceLabelIndex = 0,
- hostLabelIndex = 0,
- selections = {},
- selectOrder = [],
- hovered = null,
- summaryPane,
- detailPane,
- antTimer = null,
- guiSuccessor = null,
- onosInstances = {},
- onosOrder = [],
- oiBox,
- oiShowMaster = false,
- portLabelsOn = false,
- cat7 = d3u.cat7(),
- colorAffinity = false,
- showHosts = false,
- showOffline = true,
- useDetails = true,
- haveDetails = false,
- nodeLock = false,
- oblique = false;
-
- // constants
- var hoverModeNone = 0,
- hoverModeAll = 1,
- hoverModeFlows = 2,
- hoverModeIntents = 3,
- hoverMode = hoverModeNone;
-
- // D3 selections
- var svg,
- panZoomContainer,
- noDevices,
- bgImg,
- topoG,
- nodeG,
- linkG,
- linkLabelG,
- node,
- link,
- linkLabel,
- mask;
-
- // the projection for the map background
- var geoMapProj;
-
- // the zoom function
- var zoom;
-
- // ==============================
- // For Debugging / Development
-
- function fnTrace(msg, id) {
- if (config.fnTrace) {
- console.log('FN: ' + msg + ' [' + id + ']');
- }
- }
-
- function evTrace(data) {
- fnTrace(data.event, data.payload.id);
- }
-
- // ==============================
- // Key Callbacks
-
- function flash(txt) {
- network.view.flash(txt);
- }
-
- function testMe(view) {
- //view.alert('Theme is ' + view.getTheme());
- //view.flash('This is some text');
- cat7.testCard(svg);
- }
-
- function injectTestEvent(view) {
- if (config.useLiveData) { return; }
-
- var sc = scenario,
- evn = ++sc.evNumber,
- pfx = sc.evDir + sc.ctx + sc.evPrefix + evn,
- onosUrl = pfx + sc.evOnos,
- uiUrl = pfx + sc.evUi,
- stack = [
- { url: onosUrl, cb: handleServerEvent },
- { url: uiUrl, cb: handleUiEvent }
- ];
- recurseFetchEvent(stack, evn);
- }
-
- function recurseFetchEvent(stack, evn) {
- var v = scenario.view,
- frame;
- if (stack.length === 0) {
- v.alert('Oops!\n\nNo event #' + evn + ' found.');
- return;
- }
- frame = stack.shift();
-
- d3.json(frame.url, function (err, data) {
- if (err) {
- if (err.status === 404) {
- // if we didn't find the data, try the next stack frame
- recurseFetchEvent(stack, evn);
- } else {
- v.alert('non-404 error:\n\n' + frame.url + '\n\n' + err);
- }
- } else {
- wsTrace('test', JSON.stringify(data));
- frame.cb(data);
- }
- });
-
- }
-
- function handleUiEvent(data) {
- scenario.view.alert('UI Tx: ' + data.event + '\n\n' +
- JSON.stringify(data));
- }
-
- function injectStartupEvents(view) {
- var last = scenario.params.lastAuto || 0;
- if (config.useLiveData) { return; }
-
- while (scenario.evNumber < last) {
- injectTestEvent(view);
- }
- }
-
- function toggleBg() {
- var vis = bgImg.style('visibility');
- bgImg.style('visibility', visVal(vis === 'hidden'));
- }
-
- function opacifyBg(b) {
- bgImg.transition()
- .duration(1000)
- .attr('opacity', b ? 1 : 0);
- }
-
- function toggleNodeLock() {
- nodeLock = !nodeLock;
- flash('Node positions ' + (nodeLock ? 'locked' : 'unlocked'))
- }
-
- function toggleOblique() {
- oblique = !oblique;
- if (oblique) {
- network.force.stop();
- toObliqueView();
- } else {
- toNormalView();
- }
- }
-
- function toggleHosts() {
- showHosts = !showHosts;
- updateHostVisibility();
- flash('Hosts ' + visVal(showHosts));
- }
-
- function toggleOffline() {
- showOffline = !showOffline;
- updateOfflineVisibility();
- flash('Offline devices ' + visVal(showOffline));
- }
-
- function cycleLabels() {
- deviceLabelIndex = (deviceLabelIndex === 2)
- ? 0 : deviceLabelIndex + 1;
-
- network.nodes.forEach(function (d) {
- if (d.class === 'device') {
- updateDeviceLabel(d);
- }
- });
- }
-
- function togglePorts(view) {
- //view.alert('togglePorts() callback')
- }
-
- function unpin() {
- if (hovered) {
- sendUpdateMeta(hovered);
- hovered.fixed = false;
- hovered.el.classed('fixed', false);
- fResume();
- }
- }
-
- function handleEscape(view) {
- if (oiShowMaster) {
- cancelAffinity();
- } else if (haveDetails) {
- deselectAll();
- } else if (oiBox.isVisible()) {
- hideInstances();
- } else if (summaryPane.isVisible()) {
- cancelSummary();
- stopAntTimer();
- } else {
- hoverMode = hoverModeNone;
- }
- }
-
- function showNoDevs(b) {
- noDevices.style('visibility', visVal(b));
- }
-
- // ==============================
- // Oblique view ...
-
- var obview = {
- tt: -.7, // x skew y factor
- xsk: -35, // x skew angle
- ysc: 0.5, // y scale
- pad: 50,
- time: 1500,
- fill: {
- pkt: 'rgba(130,130,170,0.3)',
- opt: 'rgba(170,130,170,0.3)'
- },
- id: function (tag) {
- return 'obview-' + tag + 'Plane';
- },
- yt: function (h, dir) {
- return h * obview.ysc * dir * 1.1;
- },
- obXform: function (h, dir) {
- var yt = obview.yt(h, dir);
- return scale(1, obview.ysc) + translate(0, yt) + skewX(obview.xsk);
- },
- noXform: function () {
- return skewX(0) + translate(0,0) + scale(1,1);
- },
- xffn: null,
- plane: {}
- };
-
-
- function toObliqueView() {
- var box = nodeG.node().getBBox(),
- ox, oy;
-
- padBox(box, obview.pad);
-
- ox = box.x + box.width / 2;
- oy = box.y + box.height / 2;
-
- // remember node lock state, then lock the nodes down
- obview.nodeLock = nodeLock;
- nodeLock = true;
- opacifyBg(false);
-
- insertPlanes(ox, oy);
-
- obview.xffn = function (xy, dir) {
- var yt = obview.yt(box.height, dir),
- ax = xy.x - ox,
- ay = xy.y - oy,
- x = ax + ay * obview.tt,
- y = ay * obview.ysc + obview.ysc * yt;
- return {x: ox + x, y: oy + y};
- };
-
- showPlane('pkt', box, -1);
- showPlane('opt', box, 1);
- obTransitionNodes();
- }
-
- function toNormalView() {
- obview.xffn = null;
-
- hidePlane('pkt');
- hidePlane('opt');
- obTransitionNodes();
-
- removePlanes();
-
- // restore node lock state
- nodeLock = obview.nodeLock;
- opacifyBg(true);
- }
-
- function obTransitionNodes() {
- var xffn = obview.xffn;
-
- // return the direction for the node
- // -1 for pkt layer, 1 for optical layer
- function dir(d) {
- return inLayer(d, 'pkt') ? -1 : 1;
- }
-
- if (xffn) {
- network.nodes.forEach(function (d) {
- var oldxy = {x: d.x, y: d.y},
- coords = xffn(oldxy, dir(d));
- d.oldxy = oldxy;
- d.px = d.x = coords.x;
- d.py = d.y = coords.y;
- });
- } else {
- network.nodes.forEach(function (d) {
- var old = d.oldxy || {x: d.x, y: d.y};
- d.px = d.x = old.x;
- d.py = d.y = old.y;
- delete d.oldxy;
- });
- }
-
- node.transition()
- .duration(obview.time)
- .attr(tickStuff.nodeAttr);
- link.transition()
- .duration(obview.time)
- .attr(tickStuff.linkAttr);
- linkLabel.transition()
- .duration(obview.time)
- .attr(tickStuff.linkLabelAttr);
- }
-
- function showPlane(tag, box, dir) {
- var g = obview.plane[tag];
-
- // set box origin at center..
- box.x = -box.width/2;
- box.y = -box.height/2;
-
- g.select('rect')
- .attr(box)
- .attr('opacity', 0)
- .transition()
- .duration(obview.time)
- .attr('opacity', 1)
- .attr('transform', obview.obXform(box.height, dir));
- }
-
- function hidePlane(tag) {
- var g = obview.plane[tag];
-
- g.select('rect')
- .transition()
- .duration(obview.time)
- .attr('opacity', 0)
- .attr('transform', obview.noXform());
- }
-
- function insertPlanes(ox, oy) {
- function ins(tag) {
- var id = obview.id(tag),
- g = panZoomContainer.insert('g', '#topo-G')
- .attr('id', id)
- .attr('transform', translate(ox,oy));
- g.append('rect')
- .attr('fill', obview.fill[tag])
- .attr('opacity', 0);
- obview.plane[tag] = g;
- }
- ins('opt');
- ins('pkt');
- }
-
- function removePlanes() {
- function rem(tag) {
- var id = obview.id(tag);
- panZoomContainer.select('#'+id)
- .transition()
- .duration(obview.time + 50)
- .remove();
- delete obview.plane[tag];
- }
- rem('opt');
- rem('pkt');
- }
-
- function padBox(box, p) {
- box.x -= p;
- box.y -= p;
- box.width += p*2;
- box.height += p*2;
- }
-
- // ==============================
- // Radio Button Callbacks
-
- var layerLookup = {
- host: {
- endstation: 'pkt', // default, if host event does not define type
- router: 'pkt',
- bgpSpeaker: 'pkt'
- },
- device: {
- switch: 'pkt',
- roadm: 'opt'
- },
- link: {
- hostLink: 'pkt',
- direct: 'pkt',
- indirect: '',
- tunnel: '',
- optical: 'opt'
- }
- };
-
- function inLayer(d, layer) {
- var type = d.class === 'link' ? d.type() : d.type,
- look = layerLookup[d.class],
- lyr = look && look[type];
- return lyr === layer;
- }
-
- function unsuppressLayer(which) {
- node.each(function (d) {
- var node = d.el;
- if (inLayer(d, which)) {
- node.classed('suppressed', false);
- }
- });
-
- link.each(function (d) {
- var link = d.el;
- if (inLayer(d, which)) {
- link.classed('suppressed', false);
- }
- });
- }
-
- function suppressLayers(b) {
- node.classed('suppressed', b);
- link.classed('suppressed', b);
-// d3.selectAll('svg .port').classed('inactive', false);
-// d3.selectAll('svg .portText').classed('inactive', false);
- }
-
- function showAllLayers() {
- suppressLayers(false);
- }
-
- function showPacketLayer() {
- node.classed('suppressed', true);
- link.classed('suppressed', true);
- unsuppressLayer('pkt');
- }
-
- function showOpticalLayer() {
- node.classed('suppressed', true);
- link.classed('suppressed', true);
- unsuppressLayer('opt');
- }
-
- function restoreLayerState() {
- layerBtnDispatch[layerBtnSet.selected()]();
- }
-
- // ==============================
- // Private functions
-
- function safeId(s) {
- return s.replace(/[^a-z0-9]/gi, '-');
- }
-
- // set the size of the given element to that of the view (reduced if padded)
- function setSize(el, view, pad) {
- var padding = pad ? pad * 2 : 0;
- el.attr({
- width: view.width() - padding,
- height: view.height() - padding
- });
- }
-
- function makeNodeKey(d, what) {
- var port = what + 'Port';
- return d[what] + '/' + d[port];
- }
-
- function makeLinkKey(d, flipped) {
- var one = flipped ? makeNodeKey(d, 'dst') : makeNodeKey(d, 'src'),
- two = flipped ? makeNodeKey(d, 'src') : makeNodeKey(d, 'dst');
- return one + '-' + two;
- }
-
- function findLinkById(id) {
- // check to see if this is a reverse lookup, else default to given id
- var key = network.revLinkToKey[id] || id;
- return key && network.lookup[key];
- }
-
- function findLink(linkData, op) {
- var key = makeLinkKey(linkData),
- keyrev = makeLinkKey(linkData, 1),
- link = network.lookup[key],
- linkRev = network.lookup[keyrev],
- result = {},
- ldata = link || linkRev,
- rawLink;
-
- if (op === 'add') {
- if (link) {
- // trying to add a link that we already know about
- result.ldata = link;
- result.badLogic = 'addLink: link already added';
-
- } else if (linkRev) {
- // we found the reverse of the link to be added
- result.ldata = linkRev;
- if (linkRev.fromTarget) {
- result.badLogic = 'addLink: link already added';
- }
- }
- } else if (op === 'update') {
- if (!ldata) {
- result.badLogic = 'updateLink: link not found';
- } else {
- rawLink = link ? ldata.fromSource : ldata.fromTarget;
- result.updateWith = function (data) {
- $.extend(rawLink, data);
- restyleLinkElement(ldata);
- }
- }
- } else if (op === 'remove') {
- if (!ldata) {
- result.badLogic = 'removeLink: link not found';
- } else {
- rawLink = link ? ldata.fromSource : ldata.fromTarget;
-
- if (!rawLink) {
- result.badLogic = 'removeLink: link not found';
-
- } else {
- result.removeRawLink = function () {
- if (link) {
- // remove fromSource
- ldata.fromSource = null;
- if (ldata.fromTarget) {
- // promote target into source position
- ldata.fromSource = ldata.fromTarget;
- ldata.fromTarget = null;
- ldata.key = keyrev;
- delete network.lookup[key];
- network.lookup[keyrev] = ldata;
- delete network.revLinkToKey[keyrev];
- }
- } else {
- // remove fromTarget
- ldata.fromTarget = null;
- delete network.revLinkToKey[keyrev];
- }
- if (ldata.fromSource) {
- restyleLinkElement(ldata);
- } else {
- removeLinkElement(ldata);
- }
- }
- }
- }
- }
- return result;
- }
-
- function addLinkUpdate(ldata, link) {
- // add link event, but we already have the reverse link installed
- ldata.fromTarget = link;
- network.revLinkToKey[link.id] = ldata.key;
- restyleLinkElement(ldata);
- }
-
- var allLinkTypes = 'direct indirect optical tunnel',
- defaultLinkType = 'direct';
-
- function restyleLinkElement(ldata) {
- // this fn's job is to look at raw links and decide what svg classes
- // need to be applied to the line element in the DOM
- var el = ldata.el,
- type = ldata.type(),
- lw = ldata.linkWidth(),
- online = ldata.online();
-
- el.classed('link', true);
- el.classed('inactive', !online);
- el.classed(allLinkTypes, false);
- if (type) {
- el.classed(type, true);
- }
- el.transition()
- .duration(1000)
- .attr('stroke-width', linkScale(lw))
- .attr('stroke', config.topo.linkBaseColor);
- }
-
- // ==============================
- // Event handlers for server-pushed events
-
- function logicError(msg) {
- // TODO, report logic error to server, via websock, so it can be logged
- console.warn(msg);
- }
-
- var eventDispatch = {
- addInstance: addInstance,
- addDevice: addDevice,
- addLink: addLink,
- addHost: addHost,
-
- updateInstance: updateInstance,
- updateDevice: updateDevice,
- updateLink: updateLink,
- updateHost: updateHost,
-
- removeInstance: removeInstance,
- removeDevice: removeDevice,
- removeLink: removeLink,
- removeHost: removeHost,
-
- showDetails: showDetails,
- showSummary: showSummary,
- showTraffic: showTraffic
- };
-
- function addInstance(data) {
- evTrace(data);
- var inst = data.payload,
- id = inst.id;
- if (onosInstances[id]) {
- updateInstance(data);
- return;
- }
- onosInstances[id] = inst;
- onosOrder.push(inst);
- updateInstances();
- }
-
- function addDevice(data) {
- evTrace(data);
- var device = data.payload,
- id = device.id,
- d;
-
- showNoDevs(false);
-
- if (network.lookup[id]) {
- updateDevice(data);
- return;
- }
-
- d = createDeviceNode(device);
- network.nodes.push(d);
- network.lookup[id] = d;
- updateNodes();
- fStart();
- }
-
- function addLink(data) {
- evTrace(data);
- var link = data.payload,
- result = findLink(link, 'add'),
- bad = result.badLogic,
- d = result.ldata;
-
- if (bad) {
- logicError(bad + ': ' + link.id);
- return;
- }
-
- if (d) {
- // we already have a backing store link for src/dst nodes
- addLinkUpdate(d, link);
- return;
- }
-
- // no backing store link yet
- d = createLink(link);
- if (d) {
- network.links.push(d);
- network.lookup[d.key] = d;
- updateLinks();
- fStart();
- }
- }
-
- function addHost(data) {
- evTrace(data);
- var host = data.payload,
- id = host.id,
- d,
- lnk;
-
- if (network.lookup[id]) {
- logicError('Host already added: ' + id);
- return;
- }
-
- d = createHostNode(host);
- network.nodes.push(d);
- network.lookup[host.id] = d;
- updateNodes();
-
- lnk = createHostLink(host);
- if (lnk) {
- d.linkData = lnk; // cache ref on its host
- network.links.push(lnk);
- network.lookup[d.ingress] = lnk;
- network.lookup[d.egress] = lnk;
- updateLinks();
- }
- fStart();
- }
-
- function updateInstance(data) {
- evTrace(data);
- var inst = data.payload,
- id = inst.id,
- d = onosInstances[id];
- if (d) {
- $.extend(d, inst);
- updateInstances();
- } else {
- logicError('updateInstance lookup fail. ID = "' + id + '"');
- }
- }
-
- function updateDevice(data) {
- evTrace(data);
- var device = data.payload,
- id = device.id,
- d = network.lookup[id],
- wasOnline;
-
- if (d) {
- wasOnline = d.online;
- $.extend(d, device);
- if (positionNode(d, true)) {
- sendUpdateMeta(d, true);
- }
- updateNodes();
- if (wasOnline !== d.online) {
- findAttachedLinks(d.id).forEach(restyleLinkElement);
- updateOfflineVisibility(d);
- }
- } else {
- logicError('updateDevice lookup fail. ID = "' + id + '"');
- }
- }
-
- function updateLink(data) {
- evTrace(data);
- var link = data.payload,
- result = findLink(link, 'update'),
- bad = result.badLogic;
- if (bad) {
- logicError(bad + ': ' + link.id);
- return;
- }
- result.updateWith(link);
- }
-
- function updateHost(data) {
- evTrace(data);
- var host = data.payload,
- id = host.id,
- d = network.lookup[id];
- if (d) {
- $.extend(d, host);
- if (positionNode(d, true)) {
- sendUpdateMeta(d, true);
- }
- updateNodes(d);
- } else {
- logicError('updateHost lookup fail. ID = "' + id + '"');
- }
- }
-
- function removeInstance(data) {
- evTrace(data);
- var inst = data.payload,
- id = inst.id,
- d = onosInstances[id];
- if (d) {
- var idx = find(id, onosOrder);
- if (idx >= 0) {
- onosOrder.splice(idx, 1);
- }
- delete onosInstances[id];
- updateInstances();
- } else {
- logicError('updateInstance lookup fail. ID = "' + id + '"');
- }
- }
-
- function removeDevice(data) {
- evTrace(data);
- var device = data.payload,
- id = device.id,
- d = network.lookup[id];
- if (d) {
- removeDeviceElement(d);
- } else {
- logicError('removeDevice lookup fail. ID = "' + id + '"');
- }
- }
-
- function removeLink(data) {
- evTrace(data);
- var link = data.payload,
- result = findLink(link, 'remove'),
- bad = result.badLogic;
- if (bad) {
- // may have already removed link, if attached to removed device
- console.warn(bad + ': ' + link.id);
- return;
- }
- result.removeRawLink();
- }
-
- function removeHost(data) {
- evTrace(data);
- var host = data.payload,
- id = host.id,
- d = network.lookup[id];
- if (d) {
- removeHostElement(d, true);
- } else {
- // may have already removed host, if attached to removed device
- console.warn('removeHost lookup fail. ID = "' + id + '"');
- }
- }
-
- // the following events are server responses to user actions
- function showSummary(data) {
- evTrace(data);
- populateSummary(data.payload);
- showSummaryPane();
- }
-
- function showDetails(data) {
- evTrace(data);
- haveDetails = true;
- populateDetails(data.payload);
- if (useDetails) {
- showDetailPane();
- }
- }
-
- function showTraffic(data) {
- evTrace(data);
- var paths = data.payload.paths,
- hasTraffic = false;
-
- // Revert any links hilighted previously.
- link.style('stroke-width', null)
- .classed('primary secondary animated optical', false);
- // Remove all previous labels.
- removeLinkLabels();
-
- // Now hilight all links in the paths payload, and attach
- // labels to them, if they are defined.
- paths.forEach(function (p) {
- var n = p.links.length,
- i,
- ldata;
-
- hasTraffic = hasTraffic || p.traffic;
- for (i=0; i<n; i++) {
- ldata = findLinkById(p.links[i]);
- if (ldata && ldata.el) {
- ldata.el.classed(p.class, true);
- ldata.label = p.labels[i];
- }
- }
- });
-
- updateLinks();
-
- if (hasTraffic && !antTimer) {
- startAntTimer();
- } else if (!hasTraffic && antTimer) {
- stopAntTimer();
- }
- }
-
- // ...............................
-
- function unknownEvent(data) {
- console.warn('Unknown event type: "' + data.event + '"', data);
- }
-
- function handleServerEvent(data) {
- var fn = eventDispatch[data.event] || unknownEvent;
- fn(data);
- }
-
- // ==============================
- // Out-going messages...
-
- function nSel() {
- return selectOrder.length;
- }
- function getSel(idx) {
- return selections[selectOrder[idx]];
- }
- function allSelectionsClass(cls) {
- for (var i=0, n=nSel(); i<n; i++) {
- if (getSel(i).obj.class !== cls) {
- return false;
- }
- }
- return true;
- }
-
- function toggleInstances() {
- if (!oiBox.isVisible()) {
- showInstances();
- } else {
- hideInstances();
- }
- }
-
- function showInstances() {
- oiBox.show();
- colorAffinity = true;
- updateDeviceColors();
- }
-
- function hideInstances() {
- oiBox.hide();
- colorAffinity = false;
- cancelAffinity();
- updateDeviceColors();
- }
-
- function equalizeMasters() {
- sendMessage('equalizeMasters');
- flash('Equalizing master roles');
- }
-
- function toggleSummary() {
- if (!summaryPane.isVisible()) {
- requestSummary();
- } else {
- cancelSummary();
- }
- }
-
- function requestSummary() {
- sendMessage('requestSummary');
- }
-
- function cancelSummary() {
- sendMessage('cancelSummary');
- hideSummaryPane();
- }
-
- function toggleDetails() {
- useDetails = !useDetails;
- if (useDetails) {
- flash('Enable details pane');
- if (haveDetails) {
- showDetailPane();
- }
- } else {
- flash('Disable details pane');
- hideDetailPane();
- }
- }
-
- // encapsulate interaction between summary and details panes
- function showSummaryPane() {
- if (detailPane.isVisible()) {
- detailPane.down(summaryPane.show);
- } else {
- summaryPane.show();
- }
- }
-
- function hideSummaryPane() {
- summaryPane.hide(function () {
- if (detailPane.isVisible()) {
- detailPane.up();
- }
- });
- }
-
- function showDetailPane() {
- if (summaryPane.isVisible()) {
- detailPane.down(detailPane.show);
- } else {
- detailPane.up(detailPane.show);
- }
- }
-
- function hideDetailPane() {
- detailPane.hide();
- }
-
-
- // request details for the selected element
- // invoked from selection of a single node.
- function requestDetails() {
- var data = getSel(0).obj;
- sendMessage('requestDetails', {
- id: data.id,
- class: data.class
- });
- }
-
- function addHostIntentAction() {
- sendMessage('addHostIntent', {
- one: selectOrder[0],
- two: selectOrder[1],
- ids: selectOrder
- });
- flash('Host-to-Host flow added');
- }
-
- function addMultiSourceIntentAction() {
- sendMessage('addMultiSourceIntent', {
- src: selectOrder.slice(0, selectOrder.length - 1),
- dst: selectOrder[selectOrder.length - 1],
- ids: selectOrder
- });
- flash('Multi-Source flow added');
- }
-
- function cancelTraffic() {
- sendMessage('cancelTraffic');
- }
-
- function requestTrafficForMode() {
- if (hoverMode === hoverModeFlows) {
- requestDeviceLinkFlows();
- } else if (hoverMode === hoverModeIntents) {
- requestRelatedIntents();
- }
- }
-
- function showRelatedIntentsAction() {
- hoverMode = hoverModeIntents;
- requestRelatedIntents();
- flash('Related Paths');
- }
-
- function requestRelatedIntents() {
- function hoverValid() {
- return hoverMode === hoverModeIntents &&
- hovered &&
- (hovered.class === 'host' || hovered.class === 'device');
- }
-
- if (validateSelectionContext()) {
- sendMessage('requestRelatedIntents', {
- ids: selectOrder,
- hover: hoverValid() ? hovered.id : ''
- });
- }
- }
-
- function showNextIntentAction() {
- hoverMode = hoverModeNone;
- sendMessage('requestNextRelatedIntent');
- flash('>');
- }
-
- function showPrevIntentAction() {
- hoverMode = hoverModeNone;
- sendMessage('requestPrevRelatedIntent');
- flash('<');
- }
-
- function showSelectedIntentTrafficAction() {
- hoverMode = hoverModeNone;
- sendMessage('requestSelectedIntentTraffic');
- flash('Traffic on Selected Path');
- }
-
- function showDeviceLinkFlowsAction() {
- hoverMode = hoverModeFlows;
- requestDeviceLinkFlows();
- flash('Device Flows');
- }
-
- function requestDeviceLinkFlows() {
- function hoverValid() {
- return hoverMode === hoverModeFlows &&
- hovered && (hovered.class === 'device');
- }
-
- if (validateSelectionContext()) {
- sendMessage('requestDeviceLinkFlows', {
- ids: selectOrder,
- hover: hoverValid() ? hovered.id : ''
- });
- }
- }
-
- function showAllTrafficAction() {
- hoverMode = hoverModeAll;
- requestAllTraffic();
- flash('All Traffic');
- }
-
- function requestAllTraffic() {
- sendMessage('requestAllTraffic');
- }
-
- function validateSelectionContext() {
- if (!hovered && nSel() === 0) {
- cancelTraffic();
- return false;
- }
- return true;
- }
-
-
- // ==============================
- // onos instance panel functions
-
- var instCfg = {
- rectPad: 8,
- nodeOx: 9,
- nodeOy: 9,
- nodeDim: 40,
- birdOx: 19,
- birdOy: 21,
- birdDim: 21,
- uiDy: 45,
- titleDy: 30,
- textYOff: 20,
- textYSpc: 15
- };
-
- function viewBox(dim) {
- return '0 0 ' + dim.w + ' ' + dim.h;
- }
-
- function instRectAttr(dim) {
- var pad = instCfg.rectPad;
- return {
- x: pad,
- y: pad,
- width: dim.w - pad*2,
- height: dim.h - pad*2,
- rx: 6
- };
- }
-
- function computeDim(self) {
- var css = window.getComputedStyle(self);
- return {
- w: stripPx(css.width),
- h: stripPx(css.height)
- };
- }
-
- function updateInstances() {
- var onoses = oiBox.el.selectAll('.onosInst')
- .data(onosOrder, function (d) { return d.id; }),
- instDim = {w:0,h:0},
- c = instCfg;
-
- function nSw(n) {
- return '# Switches: ' + n;
- }
-
- // operate on existing onos instances if necessary
- onoses.each(function (d) {
- var el = d3.select(this),
- svg = el.select('svg');
- instDim = computeDim(this);
-
- // update online state
- el.classed('online', d.online);
-
- // update ui-attached state
- svg.select('use.uiBadge').remove();
- if (d.uiAttached) {
- attachUiBadge(svg);
- }
-
- function updAttr(id, value) {
- svg.select('text.instLabel.'+id).text(value);
- }
-
- updAttr('ip', d.ip);
- updAttr('ns', nSw(d.switches));
- });
-
-
- // operate on new onos instances
- var entering = onoses.enter()
- .append('div')
- .attr('class', 'onosInst')
- .classed('online', function (d) { return d.online; })
- .on('click', clickInst);
-
- entering.each(function (d) {
- var el = d3.select(this),
- rectAttr,
- svg;
- instDim = computeDim(this);
- rectAttr = instRectAttr(instDim);
-
- svg = el.append('svg').attr({
- width: instDim.w,
- height: instDim.h,
- viewBox: viewBox(instDim)
- });
-
- svg.append('rect').attr(rectAttr);
-
- appendBadge(svg, 14, 14, 28, '#bird');
-
- if (d.uiAttached) {
- attachUiBadge(svg);
- }
-
- var left = c.nodeOx + c.nodeDim,
- len = rectAttr.width - left,
- hlen = len / 2,
- midline = hlen + left;
-
- // title
- svg.append('text')
- .attr({
- class: 'instTitle',
- x: midline,
- y: c.titleDy
- })
- .text(d.id);
-
- // a couple of attributes
- var ty = c.titleDy + c.textYOff;
-
- function addAttr(id, label) {
- svg.append('text').attr({
- class: 'instLabel ' + id,
- x: midline,
- y: ty
- }).text(label);
- ty += c.textYSpc;
- }
-
- addAttr('ip', d.ip);
- addAttr('ns', nSw(d.switches));
- });
-
- // operate on existing + new onoses here
- // set the affinity colors...
- onoses.each(function (d) {
- var el = d3.select(this),
- rect = el.select('svg').select('rect'),
- col = instColor(d.id, d.online);
- rect.style('fill', col);
- });
-
- // adjust the panel size appropriately...
- oiBox.width(instDim.w * onosOrder.length);
- oiBox.height(instDim.h);
-
- // remove any outgoing instances
- onoses.exit().remove();
- }
-
- function instColor(id, online) {
- return cat7.get(id, !online, network.view.getTheme());
- }
-
- function clickInst(d) {
- var el = d3.select(this),
- aff = el.classed('affinity');
- if (!aff) {
- setAffinity(el, d);
- } else {
- cancelAffinity();
- }
- }
-
- function setAffinity(el, d) {
- d3.selectAll('.onosInst')
- .classed('mastership', true)
- .classed('affinity', false);
- el.classed('affinity', true);
-
- suppressLayers(true);
- node.each(function (n) {
- if (n.master === d.id) {
- n.el.classed('suppressed', false);
- }
- });
- oiShowMaster = true;
- }
-
- function cancelAffinity() {
- d3.selectAll('.onosInst')
- .classed('mastership affinity', false);
- restoreLayerState();
- oiShowMaster = false;
- }
-
- // TODO: these should be moved out to utility module.
- function stripPx(s) {
- return s.replace(/px$/,'');
- }
-
- function appendUse(svg, ox, oy, dim, iid, cls) {
- var use = svg.append('use').attr({
- transform: translate(ox,oy),
- 'xlink:href': iid,
- width: dim,
- height: dim
- });
- if (cls) {
- use.classed(cls, true);
- }
- return use;
- }
-
- function appendGlyph(svg, ox, oy, dim, iid, cls) {
- appendUse(svg, ox, oy, dim, iid, cls).classed('glyphIcon', true);
- }
-
- function appendBadge(svg, ox, oy, dim, iid, cls) {
- appendUse(svg, ox, oy, dim, iid, cls).classed('badgeIcon', true);
- }
-
- function attachUiBadge(svg) {
- appendBadge(svg, 12, instCfg.uiDy, 30, '#uiAttached', 'uiBadge');
- }
-
- function visVal(b) {
- return b ? 'visible' : 'hidden';
- }
-
- // ==============================
- // force layout modification functions
-
- function translate(x, y) {
- return 'translate(' + x + ',' + y + ')';
- }
- function scale(x,y) {
- return 'scale(' + x + ',' + y + ')';
- }
- function skewX(x) {
- return 'skewX(' + x + ')';
- }
- function rotate(deg) {
- return 'rotate(' + deg + ')';
- }
-
- function missMsg(what, id) {
- return '\n[' + what + '] "' + id + '" missing ';
- }
-
- function linkEndPoints(srcId, dstId) {
- var srcNode = network.lookup[srcId],
- dstNode = network.lookup[dstId],
- sMiss = !srcNode ? missMsg('src', srcId) : '',
- dMiss = !dstNode ? missMsg('dst', dstId) : '';
-
- if (sMiss || dMiss) {
- logicError('Node(s) not on map for link:\n' + sMiss + dMiss);
- return null;
- }
- return {
- source: srcNode,
- target: dstNode,
- x1: srcNode.x,
- y1: srcNode.y,
- x2: dstNode.x,
- y2: dstNode.y
- };
- }
-
- function createHostLink(host) {
- var src = host.id,
- dst = host.cp.device,
- id = host.ingress,
- lnk = linkEndPoints(src, dst);
-
- if (!lnk) {
- return null;
- }
-
- // Synthesize link ...
- $.extend(lnk, {
- key: id,
- class: 'link',
-
- type: function () { return 'hostLink'; },
- online: function () {
- // hostlink target is edge switch
- return lnk.target.online;
- },
- linkWidth: function () { return 1; }
- });
- return lnk;
- }
-
- function createLink(link) {
- var lnk = linkEndPoints(link.src, link.dst);
-
- if (!lnk) {
- return null;
- }
-
- $.extend(lnk, {
- key: link.id,
- class: 'link',
- fromSource: link,
-
- // functions to aggregate dual link state
- type: function () {
- var s = lnk.fromSource,
- t = lnk.fromTarget;
- return (s && s.type) || (t && t.type) || defaultLinkType;
- },
- online: function () {
- var s = lnk.fromSource,
- t = lnk.fromTarget,
- both = lnk.source.online && lnk.target.online;
- return both && ((s && s.online) || (t && t.online));
- },
- linkWidth: function () {
- var s = lnk.fromSource,
- t = lnk.fromTarget,
- ws = (s && s.linkWidth) || 0,
- wt = (t && t.linkWidth) || 0;
- return Math.max(ws, wt);
- }
- });
- return lnk;
- }
-
- function removeLinkLabels() {
- network.links.forEach(function (d) {
- d.label = '';
- });
- }
-
- function showHostVis(el) {
- el.style('visibility', visVal(showHosts));
- }
-
- var widthRatio = 1.4,
- linkScale = d3.scale.linear()
- .domain([1, 12])
- .range([widthRatio, 12 * widthRatio])
- .clamp(true);
-
- function updateLinks() {
- link = linkG.selectAll('.link')
- .data(network.links, function (d) { return d.key; });
-
- // operate on existing links, if necessary
- // link .foo() .bar() ...
-
- // operate on entering links:
- var entering = link.enter()
- .append('line')
- .attr({
- x1: function (d) { return d.x1; },
- y1: function (d) { return d.y1; },
- x2: function (d) { return d.x2; },
- y2: function (d) { return d.y2; },
- stroke: config.topo.linkInColor,
- 'stroke-width': config.topo.linkInWidth
- });
-
- // augment links
- entering.each(function (d) {
- var link = d3.select(this);
- // provide ref to element selection from backing data....
- d.el = link;
- restyleLinkElement(d);
- if (d.type() === 'hostLink') {
- showHostVis(link);
- }
- });
-
- // operate on both existing and new links, if necessary
- //link .foo() .bar() ...
-
- // apply or remove labels
- var labelData = getLabelData();
- applyLinkLabels(labelData);
-
- // operate on exiting links:
- link.exit()
- .attr('stroke-dasharray', '3 3')
- .style('opacity', 0.5)
- .transition()
- .duration(1500)
- .attr({
- 'stroke-dasharray': '3 12',
- stroke: config.topo.linkOutColor,
- 'stroke-width': config.topo.linkOutWidth
- })
- .style('opacity', 0.0)
- .remove();
-
- // NOTE: invoke a single tick to force the labels to position
- // onto their links.
- tick();
- }
-
- function getLabelData() {
- // create the backing data for showing labels..
- var data = [];
- link.each(function (d) {
- if (d.label) {
- data.push({
- id: 'lab-' + d.key,
- key: d.key,
- label: d.label,
- ldata: d
- });
- }
- });
- return data;
- }
-
- var linkLabelOffset = '0.3em';
-
- function applyLinkLabels(data) {
- var entering;
-
- linkLabel = linkLabelG.selectAll('.linkLabel')
- .data(data, function (d) { return d.id; });
-
- // for elements already existing, we need to update the text
- // and adjust the rectangle size to fit
- linkLabel.each(function (d) {
- var el = d3.select(this),
- rect = el.select('rect'),
- text = el.select('text');
- text.text(d.label);
- rect.attr(rectAroundText(el));
- });
-
- entering = linkLabel.enter().append('g')
- .classed('linkLabel', true)
- .attr('id', function (d) { return d.id; });
-
- entering.each(function (d) {
- var el = d3.select(this),
- rect,
- text,
- parms = {
- x1: d.ldata.x1,
- y1: d.ldata.y1,
- x2: d.ldata.x2,
- y2: d.ldata.y2
- };
-
- d.el = el;
- rect = el.append('rect');
- text = el.append('text').text(d.label);
- rect.attr(rectAroundText(el));
- text.attr('dy', linkLabelOffset);
-
- el.attr('transform', transformLabel(parms));
- });
-
- // Remove any labels that are no longer required.
- linkLabel.exit().remove();
- }
-
- function rectAroundText(el) {
- var text = el.select('text'),
- box = text.node().getBBox();
-
- // translate the bbox so that it is centered on [x,y]
- box.x = -box.width / 2;
- box.y = -box.height / 2;
-
- // add padding
- box.x -= 1;
- box.width += 2;
- return box;
- }
-
- function transformLabel(p) {
- var dx = p.x2 - p.x1,
- dy = p.y2 - p.y1,
- xMid = dx/2 + p.x1,
- yMid = dy/2 + p.y1;
- return translate(xMid, yMid);
- }
-
- function createDeviceNode(device) {
- // start with the object as is
- var node = device,
- type = device.type,
- svgCls = type ? 'node device ' + type : 'node device';
-
- // Augment as needed...
- node.class = 'device';
- node.svgClass = device.online ? svgCls + ' online' : svgCls;
- positionNode(node);
- return node;
- }
-
- function createHostNode(host) {
- // start with the object as is
- var node = host;
-
- // Augment as needed...
- node.class = 'host';
- if (!node.type) {
- node.type = 'endstation';
- }
- node.svgClass = 'node host ' + node.type;
- positionNode(node);
- return node;
- }
-
- function positionNode(node, forUpdate) {
- var meta = node.metaUi,
- x = meta && meta.x,
- y = meta && meta.y,
- xy;
-
- // If we have [x,y] already, use that...
- if (x && y) {
- node.fixed = true;
- node.px = node.x = x;
- node.py = node.y = y;
- return;
- }
-
- var location = node.location;
- if (location && location.type === 'latlng') {
- var coord = geoMapProj([location.lng, location.lat]);
- node.fixed = true;
- node.px = node.x = coord[0];
- node.py = node.y = coord[1];
- return true;
- }
-
- // if this is a node update (not a node add).. skip randomizer
- if (forUpdate) {
- return;
- }
-
- // Note: Placing incoming unpinned nodes at exactly the same point
- // (center of the view) causes them to explode outwards when
- // the force layout kicks in. So, we spread them out a bit
- // initially, to provide a more serene layout convergence.
- // Additionally, if the node is a host, we place it near
- // the device it is connected to.
-
- function spread(s) {
- return Math.floor((Math.random() * s) - s/2);
- }
-
- function randDim(dim) {
- return dim / 2 + spread(dim * 0.7071);
- }
-
- function rand() {
- return {
- x: randDim(network.view.width()),
- y: randDim(network.view.height())
- };
- }
-
- function near(node) {
- var min = 12,
- dx = spread(12),
- dy = spread(12);
- return {
- x: node.x + min + dx,
- y: node.y + min + dy
- };
- }
-
- function getDevice(cp) {
- var d = network.lookup[cp.device];
- return d || rand();
- }
-
- xy = (node.class === 'host') ? near(getDevice(node.cp)) : rand();
- $.extend(node, xy);
- }
-
-
- function iconGlyphUrl(d) {
- var which = d.type || 'unknown';
- return '#' + which;
- }
-
- // returns the newly computed bounding box of the rectangle
- function adjustRectToFitText(n) {
- var text = n.select('text'),
- box = text.node().getBBox(),
- lab = config.labels;
-
- text.attr('text-anchor', 'middle')
- .attr('y', '-0.8em')
- .attr('x', lab.imgPad/2);
-
- // translate the bbox so that it is centered on [x,y]
- box.x = -box.width / 2;
- box.y = -box.height / 2;
-
- // add padding
- box.x -= (lab.padLR + lab.imgPad/2);
- box.width += lab.padLR * 2 + lab.imgPad;
- box.y -= lab.padTB;
- box.height += lab.padTB * 2;
-
- return box;
- }
-
- function mkSvgClass(d) {
- return d.fixed ? d.svgClass + ' fixed' : d.svgClass;
- }
-
- function hostLabel(d) {
- var idx = (hostLabelIndex < d.labels.length) ? hostLabelIndex : 0;
- return d.labels[idx];
- }
- function deviceLabel(d) {
- var idx = (deviceLabelIndex < d.labels.length) ? deviceLabelIndex : 0;
- return d.labels[idx];
- }
- function trimLabel(label) {
- return (label && label.trim()) || '';
- }
-
- function emptyBox() {
- return {
- x: -2,
- y: -2,
- width: 4,
- height: 4
- };
- }
-
- function updateDeviceLabel(d) {
- var label = trimLabel(deviceLabel(d)),
- noLabel = !label,
- node = d.el,
- box,
- dx,
- dy,
- cfg = config.icons.device;
-
- node.select('text')
- .text(label)
- .style('opacity', 0)
- .transition()
- .style('opacity', 1);
-
- if (noLabel) {
- box = emptyBox();
- dx = -cfg.dim/2;
- dy = -cfg.dim/2;
- } else {
- box = adjustRectToFitText(node);
- dx = box.x + cfg.xoff;
- dy = box.y + cfg.yoff;
- }
-
- node.select('rect')
- .transition()
- .attr(box);
-
- node.select('g.deviceIcon')
- .transition()
- .attr('transform', translate(dx, dy));
- }
-
- function updateHostLabel(d) {
- var label = trimLabel(hostLabel(d));
- d.el.select('text').text(label);
- }
-
- function updateHostVisibility() {
- var v = visVal(showHosts);
- nodeG.selectAll('.host').style('visibility', v);
- linkG.selectAll('.hostLink').style('visibility', v);
- }
-
- function findOfflineNodes() {
- var a = [];
- network.nodes.forEach(function (d) {
- if (d.class === 'device' && !d.online) {
- a.push(d);
- }
- });
- return a;
- }
-
- function updateOfflineVisibility(dev) {
- var so = showOffline,
- sh = showHosts,
- vb = 'visibility',
- v, off, al, ah, db, b;
-
- function updAtt(show) {
- al.forEach(function (d) {
- b = show && ((d.type() !== 'hostLink') || sh);
- d.el.style(vb, visVal(b));
- });
- ah.forEach(function (d) {
- b = show && sh;
- d.el.style(vb, visVal(b));
- });
- }
-
- if (dev) {
- // updating a specific device that just toggled off/on-line
- db = dev.online || so;
- dev.el.style(vb, visVal(db));
- al = findAttachedLinks(dev.id);
- ah = findAttachedHosts(dev.id);
- updAtt(db);
- } else {
- // updating all offline devices
- v = visVal(so);
- off = findOfflineNodes();
- off.forEach(function (d) {
- d.el.style(vb, v);
- al = findAttachedLinks(d.id);
- ah = findAttachedHosts(d.id);
- updAtt(so);
- });
- }
- }
-
- function nodeMouseOver(d) {
- if (hovered != d) {
- hovered = d;
- requestTrafficForMode();
- }
- }
-
- function nodeMouseOut(d) {
- if (hovered != null) {
- hovered = null;
- requestTrafficForMode();
- }
- }
-
- function addHostIcon(node, radius, iid) {
- var dim = radius * 1.5,
- xlate = -dim / 2;
-
- node.append('use').attr({
- class: 'glyphIcon hostIcon',
- transform: translate(xlate,xlate),
- 'xlink:href': iid,
- width: dim,
- height: dim
- });
- }
-
- function updateNodes() {
- node = nodeG.selectAll('.node')
- .data(network.nodes, function (d) { return d.id; });
-
- // operate on existing nodes...
- node.filter('.device').each(function (d) {
- var node = d.el;
- node.classed('online', d.online);
- updateDeviceLabel(d);
- positionNode(d, true);
- });
-
- node.filter('.host').each(function (d) {
- updateHostLabel(d);
- positionNode(d, true);
- });
-
- // operate on entering nodes:
- var entering = node.enter()
- .append('g')
- .attr({
- id: function (d) { return safeId(d.id); },
- class: mkSvgClass,
- transform: function (d) { return translate(d.x, d.y); },
- opacity: 0
- })
- .call(network.drag)
- .on('mouseover', nodeMouseOver)
- .on('mouseout', nodeMouseOut)
- .transition()
- .attr('opacity', 1);
-
- // augment device nodes...
- entering.filter('.device').each(function (d) {
- var node = d3.select(this),
- label = trimLabel(deviceLabel(d)),
- noLabel = !label,
- box;
-
- // provide ref to element from backing data....
- d.el = node;
-
- node.append('rect').attr({ rx: 5, ry: 5 });
- node.append('text').text(label).attr('dy', '1.1em');
- box = adjustRectToFitText(node);
- node.select('rect').attr(box);
- addDeviceIcon(node, box, noLabel, iconGlyphUrl(d));
- });
-
- // augment host nodes...
- entering.filter('.host').each(function (d) {
- var node = d3.select(this),
- cfg = config.icons.host,
- r = cfg.radius[d.type] || cfg.defaultRadius,
- textDy = r + 10,
- iid = iconGlyphUrl(d);
-
- // provide ref to element from backing data....
- d.el = node;
- showHostVis(node);
-
- node.append('circle').attr('r', r);
- if (iid) {
- addHostIcon(node, r, iid);
- }
- node.append('text')
- .text(hostLabel)
- .attr('dy', textDy)
- .attr('text-anchor', 'middle');
- });
-
- // operate on both existing and new nodes, if necessary
- updateDeviceColors();
-
- // operate on exiting nodes:
- // Note that the node is removed after 2 seconds.
- // Sub element animations should be shorter than 2 seconds.
- var exiting = node.exit()
- .transition()
- .duration(2000)
- .style('opacity', 0)
- .remove();
-
- // host node exits....
- exiting.filter('.host').each(function (d) {
- var node = d.el;
- node.select('use')
- .style('opacity', 0.5)
- .transition()
- .duration(800)
- .style('opacity', 0);
-
- node.select('text')
- .style('opacity', 0.5)
- .transition()
- .duration(800)
- .style('opacity', 0);
-
- node.select('circle')
- .style('stroke-fill', '#555')
- .style('fill', '#888')
- .style('opacity', 0.5)
- .transition()
- .duration(1500)
- .attr('r', 0);
- });
-
- // device node exits....
- exiting.filter('.device').each(function (d) {
- var node = d.el;
- node.select('use')
- .style('opacity', 0.5)
- .transition()
- .duration(800)
- .style('opacity', 0);
-
- node.selectAll('rect')
- .style('stroke-fill', '#555')
- .style('fill', '#888')
- .style('opacity', 0.5);
- });
- fResume();
- }
-
- var dCol = {
- black: '#000',
- paleblue: '#acf',
- offwhite: '#ddd',
- midgrey: '#888',
- lightgrey: '#bbb',
- orange: '#f90'
- };
-
- // note: these are the device icon colors without affinity
- var dColTheme = {
- light: {
- online: {
- glyph: dCol.black,
- rect: dCol.paleblue
- },
- offline: {
- glyph: dCol.midgrey,
- rect: dCol.lightgrey
- }
- },
- // TODO: theme
- dark: {
- online: {
- glyph: dCol.black,
- rect: dCol.paleblue
- },
- offline: {
- glyph: dCol.midgrey,
- rect: dCol.lightgrey
- }
- }
- };
-
- function devBaseColor(d) {
- var t = network.view.getTheme(),
- o = d.online ? 'online' : 'offline';
- return dColTheme[t][o];
- }
-
- function setDeviceColor(d) {
- var o = d.online,
- s = d.el.classed('selected'),
- c = devBaseColor(d),
- a = instColor(d.master, o),
- g, r,
- icon = d.el.select('g.deviceIcon');
-
- if (s) {
- g = c.glyph;
- r = dColTheme.sel;
- } else if (colorAffinity) {
- g = o ? a : c.glyph;
- r = o ? dCol.offwhite : a;
- } else {
- g = c.glyph;
- r = c.rect;
- }
-
- icon.select('use')
- .style('fill', g);
- icon.select('rect')
- .style('fill', r);
- }
-
- function addDeviceIcon(node, box, noLabel, iid) {
- var cfg = config.icons.device,
- dx,
- dy,
- g;
-
- if (noLabel) {
- dx = -cfg.dim/2;
- dy = -cfg.dim/2;
- } else {
- box = adjustRectToFitText(node);
- dx = box.x + cfg.xoff;
- dy = box.y + cfg.yoff;
- }
-
- g = node.append('g')
- .attr('class', 'glyphIcon deviceIcon')
- .attr('transform', translate(dx, dy));
-
- g.append('rect').attr({
- x: 0,
- y: 0,
- rx: cfg.rx,
- width: cfg.dim,
- height: cfg.dim
- });
-
- g.append('use').attr({
- 'xlink:href': iid,
- width: cfg.dim,
- height: cfg.dim
- });
-
- }
-
- function find(key, array, tag) {
- var _tag = tag || 'id',
- idx, n, d;
- for (idx = 0, n = array.length; idx < n; idx++) {
- d = array[idx];
- if (d[_tag] === key) {
- return idx;
- }
- }
- return -1;
- }
-
- function removeLinkElement(d) {
- var idx = find(d.key, network.links, 'key'),
- removed;
- if (idx >=0) {
- // remove from links array
- removed = network.links.splice(idx, 1);
- // remove from lookup cache
- delete network.lookup[removed[0].key];
- updateLinks();
- fResume();
- }
- }
-
- function removeHostElement(d, upd) {
- var lu = network.lookup;
- // first, remove associated hostLink...
- removeLinkElement(d.linkData);
-
- // remove hostLink bindings
- delete lu[d.ingress];
- delete lu[d.egress];
-
- // remove from lookup cache
- delete lu[d.id];
- // remove from nodes array
- var idx = find(d.id, network.nodes);
- network.nodes.splice(idx, 1);
- // remove from SVG
- // NOTE: upd is false if we were called from removeDeviceElement()
- if (upd) {
- updateNodes();
- fResume();
- }
- }
-
-
- function removeDeviceElement(d) {
- var id = d.id;
- // first, remove associated hosts and links..
- findAttachedHosts(id).forEach(removeHostElement);
- findAttachedLinks(id).forEach(removeLinkElement);
-
- // remove from lookup cache
- delete network.lookup[id];
- // remove from nodes array
- var idx = find(id, network.nodes);
- network.nodes.splice(idx, 1);
-
- if (!network.nodes.length) {
- showNoDevs(true);
- }
-
- // remove from SVG
- updateNodes();
- fResume();
- }
-
- function findAttachedHosts(devId) {
- var hosts = [];
- network.nodes.forEach(function (d) {
- if (d.class === 'host' && d.cp.device === devId) {
- hosts.push(d);
- }
- });
- return hosts;
- }
-
- function findAttachedLinks(devId) {
- var links = [];
- network.links.forEach(function (d) {
- if (d.source.id === devId || d.target.id === devId) {
- links.push(d);
- }
- });
- return links;
- }
-
- function fResume() {
- if (!oblique) {
- network.force.resume();
- }
- }
-
- function fStart() {
- if (!oblique) {
- network.force.start();
- }
- }
-
- var tickStuff = {
- nodeAttr: {
- transform: function (d) { return translate(d.x, d.y); }
- },
- linkAttr: {
- x1: function (d) { return d.source.x; },
- y1: function (d) { return d.source.y; },
- x2: function (d) { return d.target.x; },
- y2: function (d) { return d.target.y; }
- },
- linkLabelAttr: {
- transform: function (d) {
- var lnk = findLinkById(d.key);
-
- if (lnk) {
- var parms = {
- x1: lnk.source.x,
- y1: lnk.source.y,
- x2: lnk.target.x,
- y2: lnk.target.y
- };
- return transformLabel(parms);
- }
- }
- }
- };
-
- function tick() {
- node.attr(tickStuff.nodeAttr);
- link.attr(tickStuff.linkAttr);
- linkLabel.attr(tickStuff.linkLabelAttr);
- }
-
- // ==============================
- // Web-Socket for live data
-
- function findGuiSuccessor() {
- var idx = -1;
- onosOrder.forEach(function (d, i) {
- if (d.uiAttached) {
- idx = i;
- }
- });
-
- for (var i = 0; i < onosOrder.length - 1; i++) {
- var ni = (idx + 1 + i) % onosOrder.length;
- if (onosOrder[ni].online) {
- return onosOrder[ni].ip;
- }
- }
- return null;
- }
-
- function webSockUrl() {
- var url = document.location.toString()
- .replace(/\#.*/, '')
- .replace('http://', 'ws://')
- .replace('https://', 'wss://')
- .replace('index.html', config.webSockUrl);
- if (guiSuccessor) {
- url = url.replace(location.hostname, guiSuccessor);
- }
- return url;
- }
-
- webSock = {
- ws : null,
- retries: 0,
-
- connect : function() {
- webSock.ws = new WebSocket(webSockUrl());
-
- webSock.ws.onopen = function() {
- noWebSock(false);
- requestSummary();
- showInstances();
- webSock.retries = 0;
- };
-
- webSock.ws.onmessage = function(m) {
- if (m.data) {
- wsTraceRx(m.data);
- handleServerEvent(JSON.parse(m.data));
- }
- };
-
- webSock.ws.onclose = function(m) {
- webSock.ws = null;
- guiSuccessor = findGuiSuccessor();
- if (guiSuccessor && webSock.retries < onosOrder.length) {
- webSock.retries++;
- webSock.connect();
- } else {
- noWebSock(true);
- }
- };
- },
-
- send : function(text) {
- if (text != null) {
- webSock._send(text);
- }
- },
-
- _send : function(message) {
- if (webSock.ws) {
- webSock.ws.send(message);
- } else if (config.useLiveData) {
- console.warn('no web socket open', message);
- } else {
- console.log('WS Send: ', message);
- }
- }
-
- };
-
- function noWebSock(b) {
- mask.style('display',b ? 'block' : 'none');
- }
-
- function sendMessage(evType, payload) {
- var p = payload || {},
- toSend = {
- event: evType,
- sid: ++sid,
- payload: p
- },
- asText = JSON.stringify(toSend);
- wsTraceTx(asText);
- webSock.send(asText);
-
- // Temporary measure for debugging UI behavior ...
- if (!config.useLiveData) {
- handleTestSend(toSend);
- }
- }
-
- function wsTraceTx(msg) {
- wsTrace('tx', msg);
- }
- function wsTraceRx(msg) {
- wsTrace('rx', msg);
- }
- function wsTrace(rxtx, msg) {
- // console.log('[' + rxtx + '] ' + msg);
- }
-
- function handleTestSend(msg) { }
-
- // ==============================
- // Selection stuff
-
- function selectObject(obj, el) {
- var n,
- ev = d3.event.sourceEvent;
-
- // if the meta or alt key is pressed, we are panning/zooming, so ignore
- if (ev.metaKey || ev.altKey) {
- return;
- }
-
- if (el) {
- n = d3.select(el);
- } else {
- node.each(function(d) {
- if (d == obj) {
- n = d3.select(el = this);
- }
- });
- }
- if (!n) return;
-
- if (ev.shiftKey && n.classed('selected')) {
- deselectObject(obj.id);
- updateDetailPane();
- return;
- }
-
- if (!ev.shiftKey) {
- deselectAll();
- }
-
- selections[obj.id] = { obj: obj, el: el };
- selectOrder.push(obj.id);
-
- n.classed('selected', true);
- updateDeviceColors(obj);
- updateDetailPane();
- }
-
- function deselectObject(id) {
- var obj = selections[id],
- idx;
- if (obj) {
- d3.select(obj.el).classed('selected', false);
- delete selections[id];
- idx = $.inArray(id, selectOrder);
- if (idx >= 0) {
- selectOrder.splice(idx, 1);
- }
- updateDeviceColors(obj.obj);
- }
- }
-
- function deselectAll() {
- // deselect all nodes in the network...
- node.classed('selected', false);
- selections = {};
- selectOrder = [];
- updateDeviceColors();
- updateDetailPane();
- }
-
- function updateDeviceColors(d) {
- if (d) {
- setDeviceColor(d);
- } else {
- node.filter('.device').each(function (d) {
- setDeviceColor(d);
- });
- }
- }
-
- // update the state of the detail pane, based on current selections
- function updateDetailPane() {
- var nSel = selectOrder.length;
- if (!nSel) {
- emptySelect();
- } else if (nSel === 1) {
- singleSelect();
- } else {
- multiSelect();
- }
- }
-
- function emptySelect() {
- haveDetails = false;
- hideDetailPane();
- cancelTraffic();
- }
-
- function singleSelect() {
- // NOTE: detail is shown from showDetails event callback
- requestDetails();
- cancelTraffic();
- requestTrafficForMode();
- }
-
- function multiSelect() {
- haveDetails = true;
- populateMultiSelect();
- cancelTraffic();
- requestTrafficForMode();
- }
-
- function addSep(tbody) {
- var tr = tbody.append('tr');
- $('<hr>').appendTo(tr.append('td').attr('colspan', 2));
- }
-
- function addProp(tbody, label, value) {
- var tr = tbody.append('tr');
-
- tr.append('td')
- .attr('class', 'label')
- .text(label + ' :');
-
- tr.append('td')
- .attr('class', 'value')
- .text(value);
- }
-
- function populateMultiSelect() {
- detailPane.empty();
-
- var title = detailPane.append('h3'),
- table = detailPane.append('table'),
- tbody = table.append('tbody');
-
- title.text('Selected Nodes');
-
- selectOrder.forEach(function (d, i) {
- addProp(tbody, i+1, d);
- });
-
- addMultiSelectActions();
- }
-
- function populateSummary(data) {
- summaryPane.empty();
-
- var svg = summaryPane.append('svg'),
- iid = iconGlyphUrl(data);
-
- var title = summaryPane.append('h2'),
- table = summaryPane.append('table'),
- tbody = table.append('tbody');
-
- appendGlyph(svg, 0, 0, 40, iid);
-
- svg.append('use')
- .attr({
- class: 'birdBadge',
- transform: translate(8,12),
- 'xlink:href': '#bird',
- width: 24,
- height: 24,
- fill: '#fff'
- });
-
- title.text('ONOS Summary');
-
- data.propOrder.forEach(function(p) {
- if (p === '-') {
- addSep(tbody);
- } else {
- addProp(tbody, p, data.props[p]);
- }
- });
- }
-
- function populateDetails(data) {
- detailPane.empty();
-
- var svg = detailPane.append('svg'),
- iid = iconGlyphUrl(data);
-
- var title = detailPane.append('h2'),
- table = detailPane.append('table'),
- tbody = table.append('tbody');
-
- appendGlyph(svg, 0, 0, 40, iid);
- title.text(data.id);
-
- data.propOrder.forEach(function(p) {
- if (p === '-') {
- addSep(tbody);
- } else {
- addProp(tbody, p, data.props[p]);
- }
- });
-
- addSingleSelectActions(data);
- }
-
- function addSingleSelectActions(data) {
- detailPane.append('hr');
- // always want to allow 'show traffic'
- addAction(detailPane, 'Show Related Traffic', showRelatedIntentsAction);
-
- if (data.type === 'switch') {
- addAction(detailPane, 'Show Device Flows', showDeviceLinkFlowsAction);
- }
- }
-
- function addMultiSelectActions() {
- detailPane.append('hr');
- // always want to allow 'show traffic'
- addAction(detailPane, 'Show Related Traffic', showRelatedIntentsAction);
- // if exactly two hosts are selected, also want 'add host intent'
- if (nSel() === 2 && allSelectionsClass('host')) {
- addAction(detailPane, 'Create Host-to-Host Flow', addHostIntentAction);
- } else if (nSel() >= 2 && allSelectionsClass('host')) {
- addAction(detailPane, 'Create Multi-Source Flow', addMultiSourceIntentAction);
- }
- }
-
- function addAction(panel, text, cb) {
- panel.append('div')
- .classed('actionBtn', true)
- .text(text)
- .on('click', cb);
- }
-
-
- // === Pan and Zoom behaviors...
-
- function panZoom(translate, scale) {
- panZoomContainer.attr('transform',
- 'translate(' + translate + ')scale(' + scale + ')');
- // keep the map lines constant width while zooming
- bgImg.style('stroke-width', 2.0 / scale + 'px');
- }
-
- function resetPanZoom() {
- panZoom([0,0], 1);
- zoom.translate([0,0]).scale(1);
- }
-
- function setupPanZoom() {
- function zoomed() {
- var ev = d3.event.sourceEvent;
- // pan/zoom active when meta or alt key is pressed...
- if (ev.metaKey || ev.altKey) {
- panZoom(d3.event.translate, d3.event.scale);
- }
- }
-
- zoom = d3.behavior.zoom()
- .translate([0, 0])
- .scale(1)
- .scaleExtent([0.25, 10])
- .on("zoom", zoomed);
-
- svg.call(zoom);
- }
-
-
- function setupNoDevices() {
- var g = noDevices.append('g');
- appendBadge(g, 0, 0, 100, '#bird', 'noDevsBird');
- var text = g.append('text')
- .text('No devices are connected')
- .attr({ x: 120, y: 80});
- }
-
- function repositionNoDevices() {
- var g = noDevices.select('g');
- var box = g.node().getBBox();
- box.x -= box.width/2;
- box.y -= box.height/2;
- g.attr('transform', translate(box.x, box.y));
- }
-
-
- // ==============================
- // Test harness code
-
- function prepareScenario(view, ctx, dbg) {
- var sc = scenario,
- urlSc = sc.evDir + ctx + sc.evScenario;
-
- if (!ctx) {
- view.alert("No scenario specified (null ctx)");
- return;
- }
-
- sc.view = view;
- sc.ctx = ctx;
- sc.debug = dbg;
- sc.evNumber = 0;
-
- d3.json(urlSc, function(err, data) {
- var p = data && data.params || {},
- desc = data && data.description || null,
- intro = data && data.title;
-
- if (err) {
- view.alert('No scenario found:\n\n' + urlSc + '\n\n' + err);
- } else {
- sc.params = p;
- if (desc) {
- intro += '\n\n ' + desc.join('\n ');
- }
- view.alert(intro);
- }
- });
-
- }
-
- function setupDefs(svg) {
- var defs = svg.append('defs');
- gly.loadDefs(defs);
- d3u.loadGlow(defs);
- }
-
- function sendUpdateMeta(d, store) {
- var metaUi = {},
- ll;
-
- if (store) {
- ll = geoMapProj.invert([d.x, d.y]);
- metaUi = {
- x: d.x,
- y: d.y,
- lng: ll[0],
- lat: ll[1]
- };
- }
- d.metaUi = metaUi;
- sendMessage('updateMeta', {
- id: d.id,
- 'class': d.class,
- memento: metaUi
- });
- }
-
- // ==============================
- // View life-cycle callbacks
-
- function init(view, ctx, flags) {
- var w = view.width(),
- h = view.height(),
- logSize = config.logicalSize,
- fcfg = config.force;
-
- // NOTE: view.$div is a D3 selection of the view's div
- var viewBox = '0 0 ' + logSize + ' ' + logSize;
- svg = view.$div.append('svg').attr('viewBox', viewBox);
- setSize(svg, view);
-
- // load glyphs, filters, and other definitions...
- setupDefs(svg);
-
- panZoomContainer = svg.append('g').attr('id', 'panZoomContainer');
- setupPanZoom();
-
- noDevices = svg.append('g')
- .attr('class', 'noDevsLayer')
- .attr('transform', translate(logSize/2, logSize/2));
- setupNoDevices();
-
- // group for the topology
- topoG = panZoomContainer.append('g')
- .attr('id', 'topo-G');
-
- // subgroups for links, link labels, and nodes
- linkG = topoG.append('g').attr('id', 'links');
- linkLabelG = topoG.append('g').attr('id', 'linkLabels');
- nodeG = topoG.append('g').attr('id', 'nodes');
-
- // selection of links, linkLabels, and nodes
- link = linkG.selectAll('.link');
- linkLabel = linkLabelG.selectAll('.linkLabel');
- node = nodeG.selectAll('.node');
-
- function chrg(d) {
- return fcfg.charge[d.class] || -12000;
- }
- function ldist(d) {
- return fcfg.linkDistance[d.type] || 50;
- }
- function lstrg(d) {
- // 0.0 - 1.0
- return fcfg.linkStrength[d.type] || 1.0;
- }
-
- function selectCb(d, self) {
- selectObject(d, self);
- }
-
- function atDragEnd(d, self) {
- // once we've finished moving, pin the node in position
- d.fixed = true;
- d3.select(self).classed('fixed', true);
- if (config.useLiveData) {
- sendUpdateMeta(d, true);
- } else {
- console.log('Moving node ' + d.id + ' to [' + d.x + ',' + d.y + ']');
- }
- }
-
- // predicate that indicates when dragging is active
- function dragEnabled() {
- var ev = d3.event.sourceEvent;
- // nodeLock means we aren't allowing nodes to be dragged...
- // meta or alt key pressed means we are zooming/panning...
- return !nodeLock && !(ev.metaKey || ev.altKey);
- }
-
- // predicate that indicates when clicking is active
- function clickEnabled() {
- return true;
- }
-
- // set up the force layout
- network.force = d3.layout.force()
- .size([w, h])
- .nodes(network.nodes)
- .links(network.links)
- .gravity(0.4)
- .friction(0.7)
- .charge(chrg)
- .linkDistance(ldist)
- .linkStrength(lstrg)
- .on('tick', tick);
-
- network.drag = d3u.createDragBehavior(network.force,
- selectCb, atDragEnd, dragEnabled, clickEnabled);
-
-
- // create mask layer for when we lose connection to server.
- // TODO: this should be part of the framework
-
- function para(sel, text) {
- sel.append('p').text(text);
- }
-
- mask = view.$div.append('div').attr('id','topo-mask');
- para(mask, 'Oops!');
- para(mask, 'Web-socket connection to server closed...');
- para(mask, 'Try refreshing the page.');
-
- mask.append('svg')
- .attr({
- id: 'mask-bird',
- width: w,
- height: h
- })
- .append('g')
- .attr('transform', birdTranslate(w, h))
- .style('opacity', 0.3)
- .append('use')
- .attr({
- 'xlink:href': '#bird',
- width: config.birdDim,
- height: config.birdDim,
- fill: '#111'
- })
- }
-
-
- function load(view, ctx, flags) {
- // resize, in case the window was resized while we were not loaded
- resize(view, ctx, flags);
-
- // cache the view token, so network topo functions can access it
- network.view = view;
- config.useLiveData = !flags.local;
-
- if (!config.useLiveData) {
- prepareScenario(view, ctx, flags.debug);
- }
-
- // set our radio buttons and key bindings
- layerBtnSet = view.setRadio(layerButtons);
- view.setKeys(keyDispatch);
- view.setGestures(gestures);
-
- // Load map data asynchronously; complete startup after that..
- loadGeoJsonData();
- }
-
- function startAntTimer() {
- // Note: disabled until traffic can be allotted to intents properly
- if (false && !antTimer) {
- var pulses = [5, 3, 1.2, 3],
- pulse = 0;
- antTimer = setInterval(function () {
- pulse = pulse + 1;
- pulse = pulse === pulses.length ? 0 : pulse;
- d3.selectAll('.animated').style('stroke-width', pulses[pulse]);
- }, 200);
- }
- }
-
- function stopAntTimer() {
- if (antTimer) {
- clearInterval(antTimer);
- antTimer = null;
- }
- }
-
- function unload(view, ctx, flags) {
- stopAntTimer();
- }
-
- var geoJsonUrl = 'continental_us.json',
- geoJson;
-
- function loadGeoJsonData() {
- d3.json(geoJsonUrl, function (err, data) {
- if (err) {
- console.error('failed to load Map data', err);
- } else {
- geoJson = data;
- loadGeoMap();
- }
-
- repositionNoDevices();
- showNoDevs(true);
-
- // finally, connect to the server...
- if (config.useLiveData) {
- webSock.connect();
- }
- });
- }
-
- function setProjForView(path, topoData) {
- var dim = config.logicalSize;
-
- // start with unit scale, no translation..
- geoMapProj.scale(1).translate([0, 0]);
-
- // figure out dimensions of map data..
- var b = path.bounds(topoData),
- x1 = b[0][0],
- y1 = b[0][1],
- x2 = b[1][0],
- y2 = b[1][1],
- dx = x2 - x1,
- dy = y2 - y1,
- x = (x1 + x2) / 2,
- y = (y1 + y2) / 2;
-
- // size map to 95% of minimum dimension to fill space..
- var s = .95 / Math.min(dx / dim, dy / dim);
- var t = [dim / 2 - s * x, dim / 2 - s * y];
-
- // set new scale, translation on the projection..
- geoMapProj.scale(s).translate(t);
- }
-
- function loadGeoMap() {
- fnTrace('loadGeoMap', geoJsonUrl);
-
- // extracts the topojson data into geocoordinate-based geometry
- var topoData = topojson.feature(geoJson, geoJson.objects.states);
-
- // see: http://bl.ocks.org/mbostock/4707858
- geoMapProj = d3.geo.mercator();
- var path = d3.geo.path().projection(geoMapProj);
-
- setProjForView(path, topoData);
-
- bgImg = panZoomContainer.insert("g", '#topo-G');
- bgImg.attr('id', 'map').selectAll('path')
- .data(topoData.features)
- .enter()
- .append('path')
- .attr('d', path);
- }
-
- function resize(view, ctx, flags) {
- var w = view.width(),
- h = view.height();
-
- setSize(svg, view);
-
- d3.select('#mask-bird').attr({ width: w, height: h})
- .select('g').attr('transform', birdTranslate(w, h));
- }
-
- function theme(view, ctx, flags) {
- updateInstances();
- updateDeviceColors();
- }
-
- function birdTranslate(w, h) {
- var bdim = config.birdDim;
- return 'translate('+((w-bdim)*.4)+','+((h-bdim)*.1)+')';
- }
-
- function isF(f) { return $.isFunction(f) ? f : null; }
- function noop() {}
-
- function augmentDetailPane() {
- var dp = detailPane;
- dp.ypos = { up: 64, down: 320, current: 320};
-
- dp._move = function (y, cb) {
- var endCb = isF(cb) || noop,
- yp = dp.ypos;
- if (yp.current !== y) {
- yp.current = y;
- dp.el.transition().duration(300)
- .each('end', endCb)
- .style('top', yp.current + 'px');
- } else {
- endCb();
- }
- };
-
- dp.down = function (cb) { dp._move(dp.ypos.down, cb); };
- dp.up = function (cb) { dp._move(dp.ypos.up, cb); };
- }
-
- // ==============================
- // View registration
-
- onos.ui.addView('topo', {
- init: init,
- load: load,
- unload: unload,
- resize: resize,
- theme: theme
- });
-
- summaryPane = onos.ui.addFloatingPanel('topo-summary');
- detailPane = onos.ui.addFloatingPanel('topo-detail');
- augmentDetailPane();
- oiBox = onos.ui.addFloatingPanel('topo-oibox', 'TL');
- oiBox.width(20);
-
-}(ONOS));
diff --git a/web/gui/src/test/java/org/onosproject/ui/README.txt b/web/gui/src/test/java/org/onosproject/ui/impl/README.txt
similarity index 100%
rename from web/gui/src/test/java/org/onosproject/ui/README.txt
rename to web/gui/src/test/java/org/onosproject/ui/impl/README.txt
diff --git a/web/gui/src/test/java/org/onosproject/ui/impl/TopologyViewWebSocketTest.java b/web/gui/src/test/java/org/onosproject/ui/impl/TopologyViewWebSocketTest.java
deleted file mode 100644
index 8937971..0000000
--- a/web/gui/src/test/java/org/onosproject/ui/impl/TopologyViewWebSocketTest.java
+++ /dev/null
@@ -1,171 +0,0 @@
-/*
- * Copyright 2015 Open Networking Laboratory
- *
- * 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.
- */
-
-package org.onosproject.ui.impl;
-
-import com.fasterxml.jackson.databind.node.ObjectNode;
-import com.google.common.collect.ImmutableSet;
-import org.junit.Before;
-import org.junit.Test;
-import org.onlab.osgi.ServiceDirectory;
-import org.onlab.osgi.TestServiceDirectory;
-import org.onlab.packet.ChassisId;
-import org.onlab.packet.IpAddress;
-import org.onlab.packet.MacAddress;
-import org.onlab.packet.VlanId;
-import org.onosproject.cluster.ClusterService;
-import org.onosproject.cluster.ClusterServiceAdapter;
-import org.onosproject.core.CoreService;
-import org.onosproject.core.CoreServiceAdapter;
-import org.onosproject.core.Version;
-import org.onosproject.mastership.MastershipService;
-import org.onosproject.mastership.MastershipServiceAdapter;
-import org.onosproject.net.DefaultDevice;
-import org.onosproject.net.DefaultHost;
-import org.onosproject.net.Device;
-import org.onosproject.net.DeviceId;
-import org.onosproject.net.Host;
-import org.onosproject.net.HostId;
-import org.onosproject.net.HostLocation;
-import org.onosproject.net.Port;
-import org.onosproject.net.PortNumber;
-import org.onosproject.net.device.DeviceService;
-import org.onosproject.net.device.DeviceServiceAdapter;
-import org.onosproject.net.flow.FlowEntry;
-import org.onosproject.net.flow.FlowRuleService;
-import org.onosproject.net.flow.FlowRuleServiceAdapter;
-import org.onosproject.net.host.HostService;
-import org.onosproject.net.host.HostServiceAdapter;
-import org.onosproject.net.intent.IntentService;
-import org.onosproject.net.intent.IntentServiceAdapter;
-import org.onosproject.net.link.LinkService;
-import org.onosproject.net.link.LinkServiceAdapter;
-import org.onosproject.net.provider.ProviderId;
-import org.onosproject.net.statistic.StatisticService;
-import org.onosproject.net.statistic.StatisticServiceAdapter;
-import org.onosproject.net.topology.TopologyService;
-import org.onosproject.net.topology.TopologyServiceAdapter;
-
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Set;
-
-import static org.junit.Assert.assertEquals;
-
-public class TopologyViewWebSocketTest {
-
- private static final ProviderId PID = new ProviderId("of", "foo.bar");
- private static final ChassisId CHID = new ChassisId(123L);
- private static final MacAddress MAC = MacAddress.valueOf("00:00:00:00:00:19");
- private static final DeviceId DID = DeviceId.deviceId("of:foo");
- private static final Set<IpAddress> IPS = ImmutableSet.of(IpAddress.valueOf("1.2.3.4"));
-
- private TestWebSocket ws;
- private TestServiceDirectory sd;
-
- @Before
- public void setUp() {
- sd = new TestServiceDirectory();
- sd.add(DeviceService.class, new TestDeviceService());
- sd.add(ClusterService.class, new ClusterServiceAdapter());
- sd.add(LinkService.class, new LinkServiceAdapter());
- sd.add(HostService.class, new TestHostService());
- sd.add(MastershipService.class, new MastershipServiceAdapter());
- sd.add(IntentService.class, new IntentServiceAdapter());
- sd.add(FlowRuleService.class, new TestFlowService());
- sd.add(StatisticService.class, new StatisticServiceAdapter());
- sd.add(TopologyService.class, new TopologyServiceAdapter());
- sd.add(CoreService.class, new TestCoreService());
- ws = new TestWebSocket(sd);
- }
-
- @Test
- public void requestDetailsDevice() {
- // build the request
- String request = "{\"event\":\"requestDetails\", \"sid\":0, "
- + "\"payload\":{\"id\":\"of:000001\",\"class\":\"device\"}}";
- ws.onMessage(request);
- // look at the ws reply, and verify that it is correct
- assertEquals("incorrect id", "of:000001", ws.reply.path("payload").path("id").asText());
- assertEquals("incorrect mfr", "foo", ws.reply.path("payload").path("props").path("Vendor").asText());
- }
-
- @Test
- public void requestDetailsHost() {
- // build the request
- String request = "{\"event\":\"requestDetails\", \"sid\":0, "
- + "\"payload\":{\"id\":\"00:00:00:00:00:19/-1\",\"class\":\"host\"}}";
- ws.onMessage(request);
- // look at the ws reply, and verify that it is correct
- assertEquals("incorrect id", "00:00:00:00:00:19/-1", ws.reply.path("payload").path("id").asText());
- assertEquals("incorrect ip address", "1.2.3.4", ws.reply.path("payload").path("props").path("IP").asText());
- }
-
- private class TestWebSocket extends TopologyViewWebSocket {
-
- private ObjectNode reply;
-
- /**
- * Creates a new web-socket for serving data to GUI topology view.
- *
- * @param directory service directory
- */
- public TestWebSocket(ServiceDirectory directory) {
- super(directory);
- }
-
- @Override
- protected synchronized void sendMessage(ObjectNode data) {
- reply = data;
- }
- }
-
- private class TestCoreService extends CoreServiceAdapter {
- @Override
- public Version version() {
- return Version.version("1.2.3");
- }
- }
-
- private class TestDeviceService extends DeviceServiceAdapter {
-
- @Override
- public Device getDevice(DeviceId deviceId) {
- return new DefaultDevice(PID, deviceId, Device.Type.SWITCH,
- "foo", "hw", "sw", "sn", CHID);
- }
-
- @Override
- public List<Port> getPorts(DeviceId deviceId) {
- return new ArrayList<>();
- }
- }
-
- private class TestFlowService extends FlowRuleServiceAdapter {
- @Override
- public Iterable<FlowEntry> getFlowEntries(DeviceId deviceId) {
- return new ArrayList<>();
- }
- }
-
- private class TestHostService extends HostServiceAdapter {
- @Override
- public Host getHost(HostId hostId) {
- return new DefaultHost(PID, hostId, MAC, VlanId.NONE,
- new HostLocation(DID, PortNumber.P0, 123L), IPS);
- }
- }
-}
\ No newline at end of file