Merge pull request #361 from pgreyson/master

Tighten up the map layout per Umesh's request
diff --git a/cassandra.titan b/cassandra.titan
index 2f34fb3..6c6670f 100644
--- a/cassandra.titan
+++ b/cassandra.titan
@@ -1,6 +1,5 @@
-storage.backend=cassandra
+storage.backend=cassandrathrift
 storage.hostname=localhost
 storage.keyspace=onos
 storage.connection-pool-size=4096
 storage.replication-factor=3
-storage.read-consistency-level=1
diff --git a/cluster-mgmt/bin/bootup.sh b/cluster-mgmt/bin/bootup.sh
new file mode 100755
index 0000000..e58e802
--- /dev/null
+++ b/cluster-mgmt/bin/bootup.sh
@@ -0,0 +1,20 @@
+#! /bin/bash
+. $HOME/bin/func.sh
+
+onos stop
+cassandra cleandb
+cassandra stop
+zk stop
+
+zk start
+cassandra start
+cassandra cleandb
+db_status=`cassandra checkdb |grep OK | wc -l`
+if [ $db_status != 1 ];then
+  echo $db_status
+  echo "Cassandra DB was screwed up. Need DB key drop"
+  exit
+fi
+onos start
+switch local
+#dsh -g $basename 'cd ONOS; ./ctrl-local.sh'
diff --git a/cluster-mgmt/bin/pingall-speedup.sh b/cluster-mgmt/bin/pingall-speedup.sh
index 0ffbf57..9bec6ba 100755
--- a/cluster-mgmt/bin/pingall-speedup.sh
+++ b/cluster-mgmt/bin/pingall-speedup.sh
@@ -4,7 +4,9 @@
 elif [ ! -f ${HOME}/ONOS/web/$1  ]; then
   echo "no such flowdef file: $1"
 fi
-dsh "cd ONOS/web; ./pingallm-local.py $1" > /tmp/.pingall.result.$$
-cat /tmp/.pingall.result.$$ | grep "Pingall flow" | sort -n -k 4 
-cat /tmp/.pingall.result.$$ | grep "Pingall Result" | awk '{s+=$5; f+=$7; i+=$9}END{printf("Pingall Result: success %d fail %d incomplete %d\n",s,f,i)}'
+logfile="/tmp/.$USER.pingall.result.$$"
+echo "Raw data at $logfile"
+dsh "cd ONOS/web; ./pingallm-local.py $1" > $logfile 
+cat $logfile | grep "Pingall flow" | sort -n -k 4 
+cat $logfile | grep "Pingall Result" | awk '{s+=$5; f+=$7; i+=$9}END{printf("Pingall Result: success %d fail %d incomplete %d\n",s,f,i)}'
 
diff --git a/cluster-mgmt/bin/start.sh b/cluster-mgmt/bin/start.sh
index e58e802..277d69b 100755
--- a/cluster-mgmt/bin/start.sh
+++ b/cluster-mgmt/bin/start.sh
@@ -3,12 +3,7 @@
 
 onos stop
 cassandra cleandb
-cassandra stop
-zk stop
 
-zk start
-cassandra start
-cassandra cleandb
 db_status=`cassandra checkdb |grep OK | wc -l`
 if [ $db_status != 1 ];then
   echo $db_status
diff --git a/conf/onos.properties b/conf/onos.properties
new file mode 100644
index 0000000..668da42
--- /dev/null
+++ b/conf/onos.properties
@@ -0,0 +1,18 @@
+floodlight.modules = net.floodlightcontroller.storage.memory.MemoryStorageSource,\
+net.floodlightcontroller.core.FloodlightProvider,\
+net.floodlightcontroller.threadpool.ThreadPool,\
+net.floodlightcontroller.devicemanager.internal.DeviceManagerImpl,\
+net.floodlightcontroller.staticflowentry.StaticFlowEntryPusher,\
+net.floodlightcontroller.counter.CounterStore,\
+net.floodlightcontroller.perfmon.PktInProcessingTime,\
+net.floodlightcontroller.ui.web.StaticWebRoutable,\
+net.floodlightcontroller.onoslistener.OnosPublisher, \
+net.onrc.onos.registry.controller.ZookeeperRegistry
+net.floodlightcontroller.restserver.RestApiServer.port = 8080
+net.floodlightcontroller.core.FloodlightProvider.openflowport = 6633
+net.floodlightcontroller.core.FloodlightProvider.workerthreads = 16
+net.floodlightcontroller.jython.JythonDebugInterface.port = 6655
+net.floodlightcontroller.forwarding.Forwarding.idletimeout = 5
+net.floodlightcontroller.forwarding.Forwarding.hardtimeout = 0
+net.floodlightcontroller.onoslistener.OnosPublisher.dbconf = /tmp/cassandra.titan
+
diff --git a/scripts/ctrl-sw.sh b/scripts/ctrl-sw.sh
new file mode 100755
index 0000000..401b7fa
--- /dev/null
+++ b/scripts/ctrl-sw.sh
@@ -0,0 +1,31 @@
+#! /usr/bin/env python
+import sys
+import time
+import os
+import re
+import json
+import socket
+
+CONFIG_FILE=os.getenv("HOME") + "/ONOS/web/config.json"
+
+def read_config():
+  global controllers
+  f = open(CONFIG_FILE)
+  conf = json.load(f)
+  controllers = conf['controllers']
+  f.close()
+
+if __name__ == "__main__":
+  read_config()
+
+  url = ""
+  for idx in sys.argv[1:]:
+    url += "tcp:%s:6633" % socket.gethostbyname(controllers[int(idx)-1]) + " "
+
+  print url[:-1]
+
+  switches = os.popen("sudo ovs-vsctl list-br").read().split("\n");
+  switches.remove('')
+  for s in switches:
+    print "set switch %s controller %s" % (s, url)  
+    os.popen("sudo ovs-vsctl set-controller %s %s" % (s, url) )
diff --git a/scripts/runiperf.sh b/scripts/runiperf.sh
index ec903e3..3df4fb0 100755
--- a/scripts/runiperf.sh
+++ b/scripts/runiperf.sh
@@ -24,21 +24,24 @@
   dst_hostid=int(dst_dpid.split(':')[-1], 16)
 
   if (proto == "tcp"):
-    cmd="ssh -o StrictHostKeyChecking=no 1.1.%d.1 '/home/ubuntu/ONOS/scripts/iperf -t%s -i%s -k%s -yJ -o /home/ubuntu/ONOS/web/log/iperf_%s.out -c 192.168.%d.%d 2>&1 &' &" % (src_hostid, duration, interval, samples, flowid, dst_nwid, dst_hostid)
-    killcmd='pkill -KILL -f \"iperf .* -o .*/iperf_%s.out\"' % (flowid)
+#    cmd="ssh -o StrictHostKeyChecking=no 1.1.%d.1 '/home/ubuntu/ONOS/scripts/iperf -t%s -i%s -k%s -yJ -o /home/ubuntu/ONOS/web/log/iperf_%s.out -c 192.168.%d.%d 2>&1 &' &" % (src_hostid, duration, interval, samples, flowid, dst_nwid, dst_hostid)
+    cmd="${HOME}/ONOS/test-network/mininet/mrun host%d \'/home/ubuntu/ONOS/scripts/iperf -t%s -i%s -k%s -yJ -o /home/ubuntu/ONOS/web/log/iperf_%s.out -c 192.168.%d.%d 2>&1 &\' &" % (src_hostid, duration, interval, samples, flowid, dst_nwid, dst_hostid)
+    killcmd='sudo pkill -KILL -f \"iperf .* -o .*/iperf_%s.out\"' % (flowid)
     print killcmd
     print cmd
     os.popen(killcmd)
     os.popen(cmd)
   else:
     if (server == 'S'):
-      cmd="ssh -o StrictHostKeyChecking=no 1.1.%d.1 '/home/ubuntu/ONOS/scripts/iperf -us -i%s -k%s -yJ -o /home/ubuntu/ONOS/web/log/iperfsvr_%s.out 2>&1 &' &" % (dst_hostid, interval, samples, flowid)
-      killcmd='pkill -KILL -f \"iperf .* -o .*/iperfsvr_%s.out\"' % (flowid)
+#      cmd="ssh -o StrictHostKeyChecking=no 1.1.%d.1 '/home/ubuntu/ONOS/scripts/iperf -us -i%s -k%s -yJ -o /home/ubuntu/ONOS/web/log/iperfsvr_%s.out 2>&1 &' &" % (dst_hostid, interval, samples, flowid)
+      cmd="${HOME}/ONOS/test-network/mininet/mrun host%d \'/home/ubuntu/ONOS/scripts/iperf -us -i%s -k%s -yJ -o /home/ubuntu/ONOS/web/log/iperfsvr_%s.out 2>&1 &\' &" % (dst_hostid, interval, samples, flowid)
+      killcmd='sudo pkill -KILL -f \"iperf .* -o .*/iperfsvr_%s.out\"' % (flowid)
       print killcmd
       print cmd
     else:
-      cmd="ssh -o StrictHostKeyChecking=no 1.1.%d.1 '/home/ubuntu/ONOS/scripts/iperf -u -t%s -i%s -k%s -yJ -o /home/ubuntu/ONOS/web/log/iperfclient_%s.out -c 192.168.%d.%d 2>&1 &' &" % (src_hostid, duration, interval, samples, flowid, dst_nwid, dst_hostid)
-      killcmd='pkill -KILL -f \"iperf .* -o .*/iperfclient_%s.out\"' % (flowid)
+      cmd="${HOME}/ONOS/test-network/mininet/mrun host%d \'/home/ubuntu/ONOS/scripts/iperf -l 1000 -u -t%s -i%s -k%s -yJ -o /home/ubuntu/ONOS/web/log/iperfclient_%s.out -c 192.168.%d.%d 2>&1 &\' &" % (src_hostid, duration, interval, samples, flowid, dst_nwid, dst_hostid)
+#      cmd="ssh -o StrictHostKeyChecking=no 1.1.%d.1 '/home/ubuntu/ONOS/scripts/iperf -l 1000 -u -t%s -i%s -k%s -yJ -o /home/ubuntu/ONOS/web/log/iperfclient_%s.out -c 192.168.%d.%d 2>&1 &' &" % (src_hostid, duration, interval, samples, flowid, dst_nwid, dst_hostid)
+      killcmd='sudo pkill -KILL -f \"iperf .* -o .*/iperfclient_%s.out\"' % (flowid)
       print killcmd
       print cmd
     os.popen(killcmd)
diff --git a/src/main/java/net/floodlightcontroller/core/INetMapTopologyObjects.java b/src/main/java/net/floodlightcontroller/core/INetMapTopologyObjects.java
index 73b21fe..4a03327 100644
--- a/src/main/java/net/floodlightcontroller/core/INetMapTopologyObjects.java
+++ b/src/main/java/net/floodlightcontroller/core/INetMapTopologyObjects.java
@@ -44,10 +44,11 @@
 		@JsonProperty("ports")
 		@Adjacency(label="on")
 		public Iterable<IPortObject> getPorts();
-		
-		@JsonIgnore
-		@GremlinGroovy("_().out('on').has('number',port_num)")
-		public IPortObject getPort(final short port_num);
+
+// Requires Frames 2.3.0		
+//		@JsonIgnore
+//		@GremlinGroovy("_().out('on').has('number',port_num)")
+//		public IPortObject getPort(@GremlinParam("port_num") final short port_num);
 		
 		@Adjacency(label="on")
 		public void addPort(final IPortObject port);
diff --git a/src/main/java/net/floodlightcontroller/core/internal/SwitchStorageImpl.java b/src/main/java/net/floodlightcontroller/core/internal/SwitchStorageImpl.java
index f040881..b8197b7 100644
--- a/src/main/java/net/floodlightcontroller/core/internal/SwitchStorageImpl.java
+++ b/src/main/java/net/floodlightcontroller/core/internal/SwitchStorageImpl.java
@@ -48,7 +48,7 @@
 			log.info("SwitchStorage:setStatus dpid:{} state: {} done", dpid, state);
 		} 	else {
 			conn.endTx(Transaction.ROLLBACK);
-			log.info("SwitchStorage:setStatus dpid:{} state: {} failed", dpid, state);
+			log.info("SwitchStorage:setStatus dpid:{} state: {} failed: switch not found", dpid, state);
 		}
 	}
 
@@ -83,9 +83,12 @@
             		conn.endTx(Transaction.COMMIT);
   
             	}
+            } else {
+        		log.error("SwitchStorage:addPort dpid:{} port:{} : failed switch does not exist", dpid, port.getPortNumber());
             }
 		} catch (Exception e) {
              // TODO: handle exceptions
+			e.printStackTrace();
 			conn.endTx(Transaction.ROLLBACK);
 			log.error("SwitchStorage:addPort dpid:{} port:{} failed", dpid, port.getPortNumber());
 		}	
@@ -115,32 +118,37 @@
 		
 		log.info("SwitchStorage:addSwitch(): dpid {} ", dpid);
 		
-        try {
-        	ISwitchObject sw = conn.utils().searchSwitch(conn, dpid);
-            if (sw != null) {
-                    /*
-                     *  Do nothing or throw exception?
-                     */
-            	
-            		log.info("SwitchStorage:addSwitch dpid:{} already exists", dpid);
-            		sw.setState(SwitchState.ACTIVE.toString());
-            		conn.endTx(Transaction.COMMIT);
-            } else {
-                    sw = conn.utils().newSwitch(conn);
+		try {
+			ISwitchObject sw = conn.utils().searchSwitch(conn, dpid);
+			if (sw != null) {
+				/*
+				 *  Do nothing or throw exception?
+				 */
 
-                    sw.setType("switch");
-                    sw.setDPID(dpid);
-                    sw.setState(SwitchState.ACTIVE.toString());
-                    conn.endTx(Transaction.COMMIT);
-                    log.info("SwitchStorage:addSwitch dpid:{} added", dpid);
-            }
-    } catch (Exception e) {
-            /*
-             * retry?
-             */
-    	conn.endTx(Transaction.ROLLBACK);
-    	log.info("SwitchStorage:addSwitch dpid:{} failed", dpid);
-    }
+				log.info("SwitchStorage:addSwitch dpid:{} already exists", dpid);
+				sw.setState(SwitchState.ACTIVE.toString());
+				conn.endTx(Transaction.COMMIT);
+			} else {
+				sw = conn.utils().newSwitch(conn);
+
+				if (sw != null) {
+					sw.setType("switch");
+					sw.setDPID(dpid);
+					sw.setState(SwitchState.ACTIVE.toString());
+					conn.endTx(Transaction.COMMIT);
+					log.info("SwitchStorage:addSwitch dpid:{} added", dpid);
+				} else {
+					log.error("switchStorage:addSwitch dpid:{} failed -> newSwitch failed", dpid);
+				}
+			}
+		} catch (Exception e) {
+			/*
+			 * retry?
+			 */
+			e.printStackTrace();
+			conn.endTx(Transaction.ROLLBACK);
+			log.info("SwitchStorage:addSwitch dpid:{} failed", dpid);
+		}
 
 
 	}
@@ -160,6 +168,7 @@
             }
 		} catch (Exception e) {
              // TODO: handle exceptions
+			e.printStackTrace();
 			conn.endTx(Transaction.ROLLBACK);			
 			log.error("SwitchStorage:deleteSwitch {} failed", dpid);
 		}
diff --git a/src/main/java/net/floodlightcontroller/core/internal/TopoSwitchServiceImpl.java b/src/main/java/net/floodlightcontroller/core/internal/TopoSwitchServiceImpl.java
index 9f63fd7..931802e 100644
--- a/src/main/java/net/floodlightcontroller/core/internal/TopoSwitchServiceImpl.java
+++ b/src/main/java/net/floodlightcontroller/core/internal/TopoSwitchServiceImpl.java
@@ -1,14 +1,14 @@
 package net.floodlightcontroller.core.internal;
 
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
 import net.floodlightcontroller.core.INetMapTopologyObjects.IPortObject;
 import net.floodlightcontroller.core.INetMapTopologyObjects.ISwitchObject;
 import net.floodlightcontroller.core.INetMapTopologyService.ITopoSwitchService;
 import net.onrc.onos.util.GraphDBConnection;
 import net.onrc.onos.util.GraphDBConnection.Transaction;
 
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
 public class TopoSwitchServiceImpl implements ITopoSwitchService {
 	
 	private GraphDBConnection conn;
@@ -21,7 +21,7 @@
 	
 	@Override
 	public void close() {
-		conn.endTx(Transaction.COMMIT);
+
 		conn.close();
 	}
 	
diff --git a/src/main/java/net/floodlightcontroller/flowcache/FlowManager.java b/src/main/java/net/floodlightcontroller/flowcache/FlowManager.java
index fc94260..4de2cbc 100644
--- a/src/main/java/net/floodlightcontroller/flowcache/FlowManager.java
+++ b/src/main/java/net/floodlightcontroller/flowcache/FlowManager.java
@@ -102,13 +102,14 @@
     private final ScheduledExecutorService mapReaderScheduler =
 	Executors.newScheduledThreadPool(1);
 
+    private final ScheduledExecutorService shortestPathReconcileScheduler =
+	Executors.newScheduledThreadPool(1);
+
     final Runnable mapReader = new Runnable() {
 	    public void run() {
 		long startTime = System.nanoTime();
 		int counterAllFlowEntries = 0;
 		int counterMyNotUpdatedFlowEntries = 0;
-		int counterAllFlowPaths = 0;
-		int counterMyFlowPaths = 0;
 
 		if (floodlightProvider == null) {
 		    log.debug("FloodlightProvider service not found!");
@@ -120,7 +121,6 @@
 		    new LinkedList<IFlowEntry>();
 		LinkedList<IFlowEntry> deleteFlowEntries =
 		    new LinkedList<IFlowEntry>();
-		LinkedList<IFlowPath> deleteFlows = new LinkedList<IFlowPath>();
 
 		//
 		// Fetch all Flow Entries and select only my Flow Entries
@@ -218,6 +218,45 @@
 		    conn.utils().removeFlowEntry(conn, flowEntryObj);
 		}
 
+		conn.endTx(Transaction.COMMIT);
+
+		if (processed_measurement_flow) {
+		    long estimatedTime =
+			System.nanoTime() - modifiedMeasurementFlowTime;
+		    String logMsg = "MEASUREMENT: Pushed Flow delay: " +
+			(double)estimatedTime / 1000000000 + " sec";
+		    log.debug(logMsg);
+		}
+
+		long estimatedTime = System.nanoTime() - startTime;
+		double rate = 0.0;
+		if (estimatedTime > 0)
+		    rate = ((double)counterAllFlowEntries * 1000000000) / estimatedTime;
+		String logMsg = "MEASUREMENT: Processed AllFlowEntries: " +
+		    counterAllFlowEntries + " MyNotUpdatedFlowEntries: " +
+		    counterMyNotUpdatedFlowEntries + " in " +
+		    (double)estimatedTime / 1000000000 + " sec: " +
+		    rate + " paths/s";
+		log.debug(logMsg);
+	    }
+	};
+
+    final Runnable shortestPathReconcile = new Runnable() {
+	    public void run() {
+		long startTime = System.nanoTime();
+		int counterAllFlowPaths = 0;
+		int counterMyFlowPaths = 0;
+
+		if (floodlightProvider == null) {
+		    log.debug("FloodlightProvider service not found!");
+		    return;
+		}
+		Map<Long, IOFSwitch> mySwitches =
+		    floodlightProvider.getSwitches();
+		LinkedList<IFlowPath> deleteFlows = new LinkedList<IFlowPath>();
+
+		boolean processed_measurement_flow = false;
+
 		//
 		// Fetch and recompute the Shortest Path for those
 		// Flow Paths this controller is responsible for.
@@ -228,11 +267,6 @@
 		    counterAllFlowPaths++;
 		    if (flowPathObj == null)
 			continue;
-		    String dataPathSummaryStr = flowPathObj.getDataPathSummary();
-		    if (dataPathSummaryStr == null)
-			continue;	// Could be invalid entry?
-		    if (dataPathSummaryStr.isEmpty())
-			continue;	// No need to maintain this flow
 
 		    String srcDpidStr = flowPathObj.getSrcSwitch();
 		    if (srcDpidStr == null)
@@ -250,6 +284,13 @@
 		    if (mySwitch == null)
 			continue;	// Ignore: not my responsibility
 
+		    // Test the Data Path Summary string
+		    String dataPathSummaryStr = flowPathObj.getDataPathSummary();
+		    if (dataPathSummaryStr == null)
+			continue;	// Could be invalid entry?
+		    if (dataPathSummaryStr.isEmpty())
+			continue;	// No need to maintain this flow
+
 		    //
 		    // Test whether we need to complete the Flow cleanup,
 		    // if the Flow has been deleted by the user.
@@ -336,9 +377,7 @@
 		double rate = 0.0;
 		if (estimatedTime > 0)
 		    rate = ((double)counterAllFlowPaths * 1000000000) / estimatedTime;
-		String logMsg = "MEASUREMENT: Processed AllFlowEntries: " +
-		    counterAllFlowEntries + " MyNotUpdatedFlowEntries: " +
-		    counterMyNotUpdatedFlowEntries + " AllFlowPaths: " +
+		String logMsg = "MEASUREMENT: Processed AllFlowPaths: " +
 		    counterAllFlowPaths + " MyFlowPaths: " +
 		    counterMyFlowPaths + " in " +
 		    (double)estimatedTime / 1000000000 + " sec: " +
@@ -350,6 +389,9 @@
     final ScheduledFuture<?> mapReaderHandle =
 	mapReaderScheduler.scheduleAtFixedRate(mapReader, 3, 3, TimeUnit.SECONDS);
 
+    final ScheduledFuture<?> shortestPathReconcileHandle =
+	shortestPathReconcileScheduler.scheduleAtFixedRate(shortestPathReconcile, 3, 3, TimeUnit.SECONDS);
+
     @Override
     public void init(String conf) {
 	conn = GraphDBConnection.getInstance(conf);
@@ -1232,44 +1274,15 @@
      */
     @Override
     public FlowPath addAndMaintainShortestPathFlow(FlowPath flowPath) {
-	String dataPathSummaryStr = null;
-
 	//
-	// Do the shortest path computation
+	// Don't do the shortest path computation here.
+	// Instead, let the Flow reconciliation thread take care of it.
 	//
-	DataPath dataPath =
-	    topoRouteService.getShortestPath(flowPath.dataPath().srcPort(),
-					     flowPath.dataPath().dstPort());
-	if (dataPath == null) {
-	    // We need the DataPath to populate the Network MAP
-	    dataPath = new DataPath();
-	    dataPath.setSrcPort(flowPath.dataPath().srcPort());
-	    dataPath.setDstPort(flowPath.dataPath().dstPort());
-	}
 
-	// Compute the Data Path summary
-	dataPathSummaryStr = dataPath.dataPathSummary();
-
-	//
-	// Set the incoming port matching and the outgoing port output
-	// actions for each flow entry.
-	//
-	for (FlowEntry flowEntry : dataPath.flowEntries()) {
-	    // Set the incoming port matching
-	    FlowEntryMatch flowEntryMatch = new FlowEntryMatch();
-	    flowEntry.setFlowEntryMatch(flowEntryMatch);
-	    flowEntryMatch.enableInPort(flowEntry.inPort());
-
-	    // Set the outgoing port output action
-	    ArrayList<FlowEntryAction> flowEntryActions = flowEntry.flowEntryActions();
-	    if (flowEntryActions == null) {
-		flowEntryActions = new ArrayList<FlowEntryAction>();
-		flowEntry.setFlowEntryActions(flowEntryActions);
-	    }
-	    FlowEntryAction flowEntryAction = new FlowEntryAction();
-	    flowEntryAction.setActionOutput(flowEntry.outPort());
-	    flowEntryActions.add(flowEntryAction);
-	}
+	// We need the DataPath to populate the Network MAP
+	DataPath dataPath = new DataPath();
+	dataPath.setSrcPort(flowPath.dataPath().srcPort());
+	dataPath.setDstPort(flowPath.dataPath().dstPort());
 
 	//
 	// Prepare the computed Flow Path
@@ -1281,6 +1294,7 @@
 	computedFlowPath.setFlowEntryMatch(new FlowEntryMatch(flowPath.flowEntryMatch()));
 
 	FlowId flowId = new FlowId();
+	String dataPathSummaryStr = dataPath.dataPathSummary();
 	if (! addFlow(computedFlowPath, flowId, dataPathSummaryStr))
 	    return null;
 
@@ -1323,73 +1337,14 @@
 	//
 	// Remove the old Flow Entries, and add the new Flow Entries
 	//
-
-	//
-	// Remove the Flow Entries from the Network MAP
-	//
 	Iterable<IFlowEntry> flowEntries = flowObj.getFlowEntries();
 	LinkedList<IFlowEntry> deleteFlowEntries = new LinkedList<IFlowEntry>();
 	for (IFlowEntry flowEntryObj : flowEntries) {
-	    String dpidStr = flowEntryObj.getSwitchDpid();
-	    if (dpidStr == null)
-		continue;
-	    Dpid dpid = new Dpid(dpidStr);
-	    IOFSwitch mySwitch = mySwitches.get(dpid.value());
-
 	    flowEntryObj.setUserState("FE_USER_DELETE");
-	    if (mySwitch == null) {
-		//
-		// Not my switch. Mark it for deletion in the Network MAP
-		//
-		flowEntryObj.setSwitchState("FE_SWITCH_NOT_UPDATED");
-		continue;
-	    }
-
-	    deleteFlowEntries.add(flowEntryObj);
-
-	    //
-	    // Delete the flow entry from the switch
-	    //
-	    // flowEntryObj.setSwitchState("FE_SWITCH_NOT_UPDATED");
-	    installFlowEntry(mySwitch, flowObj, flowEntryObj);
-	    // flowEntryObj.setSwitchState("FE_SWITCH_UPDATED");
+	    flowEntryObj.setSwitchState("FE_SWITCH_NOT_UPDATED");
 	}
-	for (IFlowEntry flowEntryObj : deleteFlowEntries) {
-	    flowObj.removeFlowEntry(flowEntryObj);
-	    conn.utils().removeFlowEntry(conn, flowEntryObj);
-	}
-
-	//
-	// Install the new shortest path into the Network MAP and the switches.
-	//
 	for (FlowEntry flowEntry : newDataPath.flowEntries()) {
-	    flowEntry.setFlowEntryUserState(FlowEntryUserState.FE_USER_ADD);
-	    IFlowEntry flowEntryObj = addFlowEntry(flowObj, flowEntry);
-	    if (flowEntryObj == null) {
-		//
-		// TODO: Remove the "new Object[] wrapper in the statement
-		// below after the SLF4J logger is upgraded to
-		// Version 1.7.5
-		//
-		log.error("Cannot add Flow Entry to switch {} for Path Flow from {} to {} : Flow Entry not in the Network MAP",
-			  new Object[] {
-			      flowEntry.dpid(),
-			      newDataPath.srcPort(),
-			      newDataPath.dstPort()
-			  });
-		continue;
-	    }
-
-	    IOFSwitch mySwitch = mySwitches.get(flowEntry.dpid().value());
-	    if (mySwitch == null) {
-		// Not my switch: just add to the Network MAP
-		continue;
-	    }
-
-	    // Install the Flow Entry into the switch
-	    if (installFlowEntry(mySwitch, flowObj, flowEntryObj)) {
-		flowEntryObj.setSwitchState("FE_SWITCH_UPDATED");
-	    }
+	    addFlowEntry(flowObj, flowEntry);
 	}
 
 	//
diff --git a/src/main/java/net/floodlightcontroller/linkdiscovery/internal/LinkStorageImpl.java b/src/main/java/net/floodlightcontroller/linkdiscovery/internal/LinkStorageImpl.java
index 0ab52e2..d62d65b 100644
--- a/src/main/java/net/floodlightcontroller/linkdiscovery/internal/LinkStorageImpl.java
+++ b/src/main/java/net/floodlightcontroller/linkdiscovery/internal/LinkStorageImpl.java
@@ -1,9 +1,7 @@
 package net.floodlightcontroller.linkdiscovery.internal;
 
 import java.util.ArrayList;
-import java.util.Collection;
 import java.util.List;
-import java.util.Set;
 
 import net.floodlightcontroller.core.INetMapTopologyObjects.IPortObject;
 import net.floodlightcontroller.core.INetMapTopologyObjects.ISwitchObject;
@@ -13,7 +11,6 @@
 import net.floodlightcontroller.linkdiscovery.LinkInfo;
 import net.floodlightcontroller.routing.Link;
 import net.onrc.onos.util.GraphDBConnection;
-import net.onrc.onos.util.GraphDBConnection.GenerateEvent;
 import net.onrc.onos.util.GraphDBConnection.Transaction;
 
 import org.openflow.util.HexString;
@@ -21,20 +18,15 @@
 import org.slf4j.LoggerFactory;
 
 import com.thinkaurelius.titan.core.TitanException;
-import com.thinkaurelius.titan.core.TitanFactory;
-import com.thinkaurelius.titan.core.TitanGraph;
 import com.tinkerpop.blueprints.Direction;
-import com.tinkerpop.blueprints.TransactionalGraph.Conclusion;
-import com.tinkerpop.blueprints.Vertex;
 import com.tinkerpop.blueprints.Edge;
-import com.tinkerpop.blueprints.util.wrappers.event.EventGraph;
-import com.tinkerpop.blueprints.util.wrappers.event.EventTransactionalGraph;
+import com.tinkerpop.blueprints.Vertex;
 import com.tinkerpop.gremlin.java.GremlinPipeline;
 import com.tinkerpop.pipes.PipeFunction;
 import com.tinkerpop.pipes.transform.PathPipe;
 
 public class LinkStorageImpl implements ILinkStorage {
-	public TitanGraph graph;
+	
 	protected static Logger log = LoggerFactory.getLogger(LinkStorageImpl.class);
 	protected String conf;
 
@@ -63,18 +55,6 @@
 			break;
 		}
 	}
-
-	private Vertex getPortVertex(String dpid, short port) {
-		Vertex vsw, vport = null;
-        if ((vsw = graph.getVertices("dpid", dpid).iterator().next()) != null) {
-        	GremlinPipeline<Vertex, Vertex> pipe = new GremlinPipeline<Vertex, Vertex>();        	
-        	pipe.start(vsw).out("on").has("number", port);
-        	if (pipe.hasNext()) {
-        		vport = pipe.next();
-        	}
-        }
-        return vport;
-	}
 	
 	public void addOrUpdateLink(Link lt, LinkInfo linkinfo, DM_OPERATION op) {
 		GraphDBConnection conn = GraphDBConnection.getInstance(this.conf);
@@ -96,9 +76,9 @@
             if (vportSrc != null && vportDst != null) {
          	       	
             	// check if the link exists
-            	List<IPortObject> currLinks = new ArrayList<IPortObject>();
-            	Iterable<IPortObject> currPorts = vportSrc.getLinkedPorts();
             	
+            	Iterable<IPortObject> currPorts = vportSrc.getLinkedPorts();
+            	List<IPortObject> currLinks = new ArrayList<IPortObject>();
             	for (IPortObject V : currPorts) {
             		currLinks.add(V);
             	}
@@ -110,20 +90,21 @@
             					new Object[]{op, lt, vportSrc, vportDst});
             		}
             	} else {
-            		conn.getFramedGraph().addEdge(null, vportSrc.asVertex(), vportDst.asVertex(), "link");
+            		vportSrc.setLinkPort(vportDst);
+
             		conn.endTx(Transaction.COMMIT);
             		log.debug("addOrUpdateLink(): link added {} {} src {} dst {}", new Object[]{op, lt, vportSrc, vportDst});
             	}
             } else {
             	log.error("addOrUpdateLink(): failed invalid vertices {} {} src {} dst {}", new Object[]{op, lt, vportSrc, vportDst});
-            	conn.endTx(Transaction.ROLLBACK);
+ //           	conn.endTx(Transaction.ROLLBACK);
             }
         } catch (TitanException e) {
             /*
              * retry till we succeed?
              */
-        	log.error("addOrUpdateLink(): titan exception {} {} {}", new Object[]{op, lt, e.toString()});
         	e.printStackTrace();
+        	log.error("addOrUpdateLink(): titan exception {} {} {}", new Object[]{op, lt, e.toString()});
         }
 	}
 	
@@ -155,7 +136,6 @@
          	port = lt.getDstPort();
          	vportDst = conn.utils().searchPort(conn, dpid, port);
      		// FIXME: This needs to remove all edges
-         	// FIXME: Events will only be generated on singleton graph object (GraphDBConnection)
          	
          	if (vportSrc != null && vportDst != null) {
 
@@ -174,7 +154,7 @@
             	
             } else {
             	log.error("deleteLink(): failed invalid vertices {} src {} dst {}", new Object[]{lt, vportSrc, vportDst});
-            	conn.endTx(Transaction.ROLLBACK);
+//            	conn.endTx(Transaction.ROLLBACK);
             }
          	
         } catch (TitanException e) {
@@ -189,13 +169,15 @@
 	// TODO: Fix me
 	@Override
 	public List<Link> getLinks(Long dpid, short port) {
-		Vertex vportSrc, vportDst;
+		GraphDBConnection conn = GraphDBConnection.getInstance(this.conf);
+		IPortObject vportSrc, vportDst;
     	List<Link> links = null;
     	Link lt;
     	
-		vportSrc = getPortVertex(HexString.toHexString(dpid), port);
+		vportSrc = conn.utils().searchPort(conn, HexString.toHexString(dpid), port);
 		if (vportSrc != null) {
-     		for (Edge e : vportSrc.getEdges(Direction.OUT)) {
+			
+     		for (Edge e : vportSrc.asVertex().getEdges(Direction.OUT)) {
      			if (e.getLabel().equals("link")) {
      				break;
      			}
@@ -209,18 +191,7 @@
 		//TODO extract the DB location from properties
 	
 		this.conf = conf;
-        graph = TitanFactory.open(this.conf);
-        
-        // FIXME: These keys are not needed for Links but we better create it before using it as per titan
-        Set<String> s = graph.getIndexedKeys(Vertex.class);
-        if (!s.contains("dpid")) {
-           graph.createKeyIndex("dpid", Vertex.class);
-           graph.stopTransaction(Conclusion.SUCCESS);
-        }
-        if (!s.contains("type")) {
-        	graph.createKeyIndex("type", Vertex.class);
-        	graph.stopTransaction(Conclusion.SUCCESS);
-        }
+		
 	}
 
 	@Override
@@ -237,9 +208,9 @@
 
 	public List<Link> getActiveLinks() {
 
-		ITopoSwitchService swService = new TopoSwitchServiceImpl();
+		GraphDBConnection conn = GraphDBConnection.getInstance(this.conf);
 		
-		Iterable<ISwitchObject> switches = swService.getActiveSwitches();
+		Iterable<ISwitchObject> switches = conn.utils().getActiveSwitches(conn);
 
 		List<Link> links = new ArrayList<Link>(); 
 		for (ISwitchObject sw : switches) {
@@ -292,7 +263,7 @@
 	@Override
 	public void close() {
 		// TODO Auto-generated method stub
-		graph.shutdown();		
+//		graph.shutdown();		
 	}
 
 
diff --git a/src/main/java/net/floodlightcontroller/onoslistener/OnosPublisher.java b/src/main/java/net/floodlightcontroller/onoslistener/OnosPublisher.java
index 6d8087b..e07196f 100644
--- a/src/main/java/net/floodlightcontroller/onoslistener/OnosPublisher.java
+++ b/src/main/java/net/floodlightcontroller/onoslistener/OnosPublisher.java
@@ -51,7 +51,7 @@
 	protected static final String CleanupEnabled = "EnableCleanup";
 	protected IThreadPoolService threadPool;
 	
-	protected final int CLEANUP_TASK_INTERVAL = 10; // 10 sec
+	protected final int CLEANUP_TASK_INTERVAL = 60; // 1 min
 	protected SingletonTask cleanupTask;
 	
 	/**
diff --git a/src/main/java/net/onrc/onos/util/GraphDBConnection.java b/src/main/java/net/onrc/onos/util/GraphDBConnection.java
index 84a0501..4d23b0d 100644
--- a/src/main/java/net/onrc/onos/util/GraphDBConnection.java
+++ b/src/main/java/net/onrc/onos/util/GraphDBConnection.java
@@ -87,6 +87,7 @@
 		   		FramedGraph<TitanGraph> fg = new FramedGraph<TitanGraph>(graph);
 		   		return fg;
 		   	} else {
+		   		log.error("new FramedGraph failed");
 		   		return null;
 		   	}
 	   }
@@ -118,16 +119,16 @@
 	   
 	   public void endTx(Transaction tx) {
 		   try {
-			switch (tx) {
+			   switch (tx) {
 			   case COMMIT:
 				   graph.stopTransaction(Conclusion.SUCCESS);
 			   case ROLLBACK:
 				   graph.stopTransaction(Conclusion.FAILURE);
 			   }
-		} catch (Exception e) {
-			// TODO Auto-generated catch block
-			e.printStackTrace();
-		}
+		   } catch (Exception e) {
+			   // TODO Auto-generated catch block
+			   log.error("{}",e.toString());
+		   }
 	   }
 	   
 	   public void endTx(TransactionHandle tr, Transaction tx) {
@@ -167,6 +168,7 @@
 	   }
 	   
 	   public void close() {
+		   endTx(Transaction.COMMIT);
 //		   graph.shutdown();
 	   }
 	   
diff --git a/src/main/java/net/onrc/onos/util/GraphDBUtils.java b/src/main/java/net/onrc/onos/util/GraphDBUtils.java
index eea57fd..7ed51b9 100644
--- a/src/main/java/net/onrc/onos/util/GraphDBUtils.java
+++ b/src/main/java/net/onrc/onos/util/GraphDBUtils.java
@@ -38,7 +38,7 @@
 		// TODO Auto-generated method stub
 		FramedGraph<TitanGraph> fg = conn.getFramedGraph();
 		
-		return fg.getVertices("dpid",dpid).iterator().hasNext() ? 
+		return (fg != null && fg.getVertices("dpid",dpid).iterator().hasNext()) ? 
 				fg.getVertices("dpid",dpid,ISwitchObject.class).iterator().next() : null;
     			
 	}
@@ -47,7 +47,7 @@
 	public IDeviceObject searchDevice(GraphDBConnection conn, String macAddr) {
 		// TODO Auto-generated method stub
 		FramedGraph<TitanGraph> fg = conn.getFramedGraph();	
-		return fg.getVertices("dl_address",macAddr).iterator().hasNext() ? fg.getVertices("dl_address",macAddr,
+		return (fg != null && fg.getVertices("dl_address",macAddr).iterator().hasNext()) ? fg.getVertices("dl_address",macAddr,
     			IDeviceObject.class).iterator().next() : null;
     			
 	}
@@ -58,6 +58,9 @@
 //		if (sw != null) {
 //			
 //			IPortObject port = null;
+//			
+			// Requires Frames 2.3.0
+//			
 //			try {
 //				port = sw.getPort(number);
 //			} catch (Exception e) {
@@ -67,12 +70,15 @@
 //			
 //			return port;
 //		}
-//		return null;
-		GremlinPipeline<Vertex, IPortObject> pipe = new GremlinPipeline<Vertex, IPortObject>();
-		pipe.start(sw.asVertex());
-	    pipe.out("on").has("number", number);
-	    FramedVertexIterable<IPortObject> r = new FramedVertexIterable<IPortObject>(conn.getFramedGraph(), (Iterable) pipe, IPortObject.class);
-	    return r.iterator().hasNext() ? r.iterator().next() : null;
+		
+		if (sw != null) {
+			GremlinPipeline<Vertex, IPortObject> pipe = new GremlinPipeline<Vertex, IPortObject>();
+			pipe.start(sw.asVertex());
+			pipe.out("on").has("number", number);
+			FramedVertexIterable<IPortObject> r = new FramedVertexIterable<IPortObject>(conn.getFramedGraph(), (Iterable) pipe, IPortObject.class);
+			return r != null && r.iterator().hasNext() ? r.iterator().next() : null;
+		}
+		return null;
 	}
 
 	@Override
@@ -93,19 +99,19 @@
 	public void removePort(GraphDBConnection conn, IPortObject port) {
 		FramedGraph<TitanGraph> fg = conn.getFramedGraph();	
 //		EventGraph<TitanGraph> eg = conn.getEventGraph();
-		fg.removeVertex(port.asVertex());		
+		if (fg != null) fg.removeVertex(port.asVertex());		
 	}
 
 	@Override
 	public void removeDevice(GraphDBConnection conn, IDeviceObject dev) {
 		FramedGraph<TitanGraph> fg = conn.getFramedGraph();	
-		fg.removeVertex(dev.asVertex());		
+		if (fg != null) fg.removeVertex(dev.asVertex());		
 	}
 
 	@Override
 	public Iterable<IDeviceObject> getDevices(GraphDBConnection conn) {
 		FramedGraph<TitanGraph> fg = conn.getFramedGraph();	
-		return fg.getVertices("type","device",IDeviceObject.class);
+		return fg != null ? fg.getVertices("type","device",IDeviceObject.class) : null;
 	}
 
 	@Override
@@ -226,7 +232,12 @@
 
 	@Override
 	public ISwitchObject searchActiveSwitch(GraphDBConnection conn, String dpid) {
-		// TODO Auto-generated method stub
-		return null;
+
+        ISwitchObject sw = searchSwitch(conn, dpid);
+        if ((sw != null) &&
+            sw.getState().equals(SwitchState.ACTIVE.toString())) {
+            return sw;
+        }
+        return null;
 	}
 }
diff --git a/web/link.json b/web/link.json
new file mode 100644
index 0000000..1bf2b66
--- /dev/null
+++ b/web/link.json
@@ -0,0 +1,2636 @@
+[
+  {
+    "dst-switch": "00:00:00:16:97:08:9a:46", 
+    "src-switch": "00:00:00:00:ba:5e:ba:11", 
+    "src-port": 2, 
+    "dst-port": 2
+  }, 
+  {
+    "dst-switch": "00:00:00:08:a2:08:f9:01", 
+    "src-switch": "00:00:00:00:ba:5e:ba:11", 
+    "src-port": 3, 
+    "dst-port": 2
+  }, 
+  {
+    "dst-switch": "00:00:00:00:00:00:02:01", 
+    "src-switch": "00:00:00:00:ba:5e:ba:11", 
+    "src-port": 4, 
+    "dst-port": 51
+  }, 
+  {
+    "dst-switch": "00:00:00:00:00:00:05:01", 
+    "src-switch": "00:00:00:00:00:00:ba:12", 
+    "src-port": 5, 
+    "dst-port": 26
+  }, 
+  {
+    "dst-switch": "00:00:00:00:00:00:04:01", 
+    "src-switch": "00:00:00:00:00:00:ba:12", 
+    "src-port": 4, 
+    "dst-port": 26
+  }, 
+  {
+    "dst-switch": "00:00:00:08:a2:08:f9:01", 
+    "src-switch": "00:00:00:00:00:00:ba:12", 
+    "src-port": 2, 
+    "dst-port": 3
+  }, 
+  {
+    "dst-switch": "00:00:00:00:ba:5e:ba:13", 
+    "src-switch": "00:00:00:00:00:00:ba:12", 
+    "src-port": 3, 
+    "dst-port": 2
+  }, 
+  {
+    "dst-switch": "00:00:00:00:00:00:07:01", 
+    "src-switch": "00:00:20:4e:7f:51:8a:35", 
+    "src-port": 5, 
+    "dst-port": 26
+  }, 
+  {
+    "dst-switch": "00:00:00:16:97:08:9a:46", 
+    "src-switch": "00:00:20:4e:7f:51:8a:35", 
+    "src-port": 2, 
+    "dst-port": 3
+  }, 
+  {
+    "dst-switch": "00:00:00:08:a2:08:f9:01", 
+    "src-switch": "00:00:20:4e:7f:51:8a:35", 
+    "src-port": 3, 
+    "dst-port": 4
+  }, 
+  {
+    "dst-switch": "00:00:00:00:ba:5e:ba:13", 
+    "src-switch": "00:00:20:4e:7f:51:8a:35", 
+    "src-port": 4, 
+    "dst-port": 3
+  }, 
+  {
+    "dst-switch": "00:00:00:00:00:00:06:01", 
+    "src-switch": "00:00:00:00:ba:5e:ba:13", 
+    "src-port": 4, 
+    "dst-port": 26
+  }, 
+  {
+    "dst-switch": "00:00:00:00:00:00:ba:12", 
+    "src-switch": "00:00:00:00:ba:5e:ba:13", 
+    "src-port": 2, 
+    "dst-port": 3
+  }, 
+  {
+    "dst-switch": "00:00:20:4e:7f:51:8a:35", 
+    "src-switch": "00:00:00:00:ba:5e:ba:13", 
+    "src-port": 3, 
+    "dst-port": 4
+  }, 
+  {
+    "dst-switch": "00:00:00:00:00:00:03:01", 
+    "src-switch": "00:00:00:08:a2:08:f9:01", 
+    "src-port": 5, 
+    "dst-port": 26
+  }, 
+  {
+    "dst-switch": "00:00:00:00:ba:5e:ba:11", 
+    "src-switch": "00:00:00:08:a2:08:f9:01", 
+    "src-port": 2, 
+    "dst-port": 3
+  }, 
+  {
+    "dst-switch": "00:00:00:00:00:00:ba:12", 
+    "src-switch": "00:00:00:08:a2:08:f9:01", 
+    "src-port": 3, 
+    "dst-port": 2
+  }, 
+  {
+    "dst-switch": "00:00:20:4e:7f:51:8a:35", 
+    "src-switch": "00:00:00:08:a2:08:f9:01", 
+    "src-port": 4, 
+    "dst-port": 3
+  }, 
+  {
+    "dst-switch": "00:00:00:00:00:00:08:01", 
+    "src-switch": "00:00:00:16:97:08:9a:46", 
+    "src-port": 4, 
+    "dst-port": 26
+  }, 
+  {
+    "dst-switch": "00:00:00:00:ba:5e:ba:11", 
+    "src-switch": "00:00:00:16:97:08:9a:46", 
+    "src-port": 2, 
+    "dst-port": 2
+  }, 
+  {
+    "dst-switch": "00:00:20:4e:7f:51:8a:35", 
+    "src-switch": "00:00:00:16:97:08:9a:46", 
+    "src-port": 3, 
+    "dst-port": 2
+  },
+    {
+        "dst-port": 21, 
+        "dst-switch": "00:00:00:00:00:00:07:01", 
+        "src-port": 2, 
+        "src-switch": "00:00:00:00:00:00:07:15"
+    }, 
+    {
+        "dst-port": 15, 
+        "dst-switch": "00:00:00:00:00:00:06:01", 
+        "src-port": 2, 
+        "src-switch": "00:00:00:00:00:00:06:0f"
+    }, 
+    {
+        "dst-port": 17, 
+        "dst-switch": "00:00:00:00:00:00:07:01", 
+        "src-port": 2, 
+        "src-switch": "00:00:00:00:00:00:07:11"
+    }, 
+    {
+        "dst-port": 12, 
+        "dst-switch": "00:00:00:00:00:00:06:01", 
+        "src-port": 2, 
+        "src-switch": "00:00:00:00:00:00:06:0c"
+    }, 
+    {
+        "dst-port": 3, 
+        "dst-switch": "00:00:00:00:00:00:03:01", 
+        "src-port": 2, 
+        "src-switch": "00:00:00:00:00:00:03:03"
+    }, 
+    {
+        "dst-port": 22, 
+        "dst-switch": "00:00:00:00:00:00:05:01", 
+        "src-port": 2, 
+        "src-switch": "00:00:00:00:00:00:05:16"
+    }, 
+    {
+        "dst-port": 11, 
+        "dst-switch": "00:00:00:00:00:00:07:01", 
+        "src-port": 2, 
+        "src-switch": "00:00:00:00:00:00:07:0b"
+    }, 
+    {
+        "dst-port": 14, 
+        "dst-switch": "00:00:00:00:00:00:03:01", 
+        "src-port": 2, 
+        "src-switch": "00:00:00:00:00:00:03:0e"
+    }, 
+    {
+        "dst-port": 13, 
+        "dst-switch": "00:00:00:00:00:00:03:01", 
+        "src-port": 2, 
+        "src-switch": "00:00:00:00:00:00:03:0d"
+    }, 
+    {
+        "dst-port": 12, 
+        "dst-switch": "00:00:00:00:00:00:04:01", 
+        "src-port": 2, 
+        "src-switch": "00:00:00:00:00:00:04:0c"
+    }, 
+    {
+        "dst-port": 25, 
+        "dst-switch": "00:00:00:00:00:00:06:01", 
+        "src-port": 2, 
+        "src-switch": "00:00:00:00:00:00:06:19"
+    }, 
+    {
+        "dst-port": 18, 
+        "dst-switch": "00:00:00:00:00:00:03:01", 
+        "src-port": 2, 
+        "src-switch": "00:00:00:00:00:00:03:12"
+    }, 
+    {
+        "dst-port": 22, 
+        "dst-switch": "00:00:00:00:00:00:02:01", 
+        "src-port": 2, 
+        "src-switch": "00:00:00:00:00:00:02:16"
+    }, 
+    {
+        "dst-port": 6, 
+        "dst-switch": "00:00:00:00:00:00:07:01", 
+        "src-port": 2, 
+        "src-switch": "00:00:00:00:00:00:07:06"
+    }, 
+    {
+        "dst-port": 2, 
+        "dst-switch": "00:00:00:00:00:00:01:01", 
+        "src-port": 2, 
+        "src-switch": "00:00:00:00:00:00:01:02"
+    }, 
+    {
+        "dst-port": 2, 
+        "dst-switch": "00:00:00:00:00:00:01:03", 
+        "src-port": 3, 
+        "src-switch": "00:00:00:00:00:00:01:02"
+    }, 
+    {
+        "dst-port": 51, 
+        "dst-switch": "00:00:00:00:00:00:02:01", 
+        "src-port": 4, 
+        "src-switch": "00:00:00:00:00:00:01:02"
+    }, 
+    {
+        "dst-port": 17, 
+        "dst-switch": "00:00:00:00:00:00:06:01", 
+        "src-port": 2, 
+        "src-switch": "00:00:00:00:00:00:06:11"
+    }, 
+    {
+        "dst-port": 4, 
+        "dst-switch": "00:00:00:00:00:00:02:01", 
+        "src-port": 2, 
+        "src-switch": "00:00:00:00:00:00:02:04"
+    }, 
+    {
+        "dst-port": 6, 
+        "dst-switch": "00:00:00:00:00:00:02:01", 
+        "src-port": 2, 
+        "src-switch": "00:00:00:00:00:00:02:06"
+    }, 
+    {
+        "dst-port": 9, 
+        "dst-switch": "00:00:00:00:00:00:03:01", 
+        "src-port": 2, 
+        "src-switch": "00:00:00:00:00:00:03:09"
+    }, 
+    {
+        "dst-port": 20, 
+        "dst-switch": "00:00:00:00:00:00:07:01", 
+        "src-port": 2, 
+        "src-switch": "00:00:00:00:00:00:07:14"
+    }, 
+    {
+        "dst-port": 15, 
+        "dst-switch": "00:00:00:00:00:00:03:01", 
+        "src-port": 2, 
+        "src-switch": "00:00:00:00:00:00:03:0f"
+    }, 
+    {
+        "dst-port": 14, 
+        "dst-switch": "00:00:00:00:00:00:04:01", 
+        "src-port": 2, 
+        "src-switch": "00:00:00:00:00:00:04:0e"
+    }, 
+    {
+        "dst-port": 2, 
+        "dst-switch": "00:00:00:00:00:00:07:01", 
+        "src-port": 2, 
+        "src-switch": "00:00:00:00:00:00:07:02"
+    }, 
+    {
+        "dst-port": 8, 
+        "dst-switch": "00:00:00:00:00:00:03:01", 
+        "src-port": 2, 
+        "src-switch": "00:00:00:00:00:00:03:08"
+    }, 
+    {
+        "dst-port": 13, 
+        "dst-switch": "00:00:00:00:00:00:04:01", 
+        "src-port": 2, 
+        "src-switch": "00:00:00:00:00:00:04:0d"
+    }, 
+    {
+        "dst-port": 11, 
+        "dst-switch": "00:00:00:00:00:00:08:01", 
+        "src-port": 2, 
+        "src-switch": "00:00:00:00:00:00:08:0b"
+    }, 
+    {
+        "dst-port": 22, 
+        "dst-switch": "00:00:00:00:00:00:04:01", 
+        "src-port": 2, 
+        "src-switch": "00:00:00:00:00:00:04:16"
+    }, 
+    {
+        "dst-port": 18, 
+        "dst-switch": "00:00:00:00:00:00:08:01", 
+        "src-port": 2, 
+        "src-switch": "00:00:00:00:00:00:08:12"
+    }, 
+    {
+        "dst-port": 26, 
+        "dst-switch": "00:00:00:00:00:00:03:01", 
+        "src-port": 5, 
+        "src-switch": "00:00:00:00:00:00:01:03"
+    }, 
+    {
+        "dst-port": 3, 
+        "dst-switch": "00:00:00:00:00:00:01:02", 
+        "src-port": 2, 
+        "src-switch": "00:00:00:00:00:00:01:03"
+    }, 
+    {
+        "dst-port": 2, 
+        "dst-switch": "00:00:00:00:00:00:01:04", 
+        "src-port": 3, 
+        "src-switch": "00:00:00:00:00:00:01:03"
+    }, 
+    {
+        "dst-port": 3, 
+        "dst-switch": "00:00:00:00:00:00:01:06", 
+        "src-port": 4, 
+        "src-switch": "00:00:00:00:00:00:01:03"
+    }, 
+    {
+        "dst-port": 7, 
+        "dst-switch": "00:00:00:00:00:00:07:01", 
+        "src-port": 2, 
+        "src-switch": "00:00:00:00:00:00:07:07"
+    }, 
+    {
+        "dst-port": 25, 
+        "dst-switch": "00:00:00:00:00:00:07:01", 
+        "src-port": 2, 
+        "src-switch": "00:00:00:00:00:00:07:19"
+    }, 
+    {
+        "dst-port": 26, 
+        "dst-switch": "00:00:00:00:00:00:07:01", 
+        "src-port": 6, 
+        "src-switch": "00:00:00:00:00:00:01:06"
+    }, 
+    {
+        "dst-port": 4, 
+        "dst-switch": "00:00:00:00:00:00:01:04", 
+        "src-port": 5, 
+        "src-switch": "00:00:00:00:00:00:01:06"
+    }, 
+    {
+        "dst-port": 3, 
+        "dst-switch": "00:00:00:00:00:00:01:01", 
+        "src-port": 2, 
+        "src-switch": "00:00:00:00:00:00:01:06"
+    }, 
+    {
+        "dst-port": 4, 
+        "dst-switch": "00:00:00:00:00:00:01:03", 
+        "src-port": 3, 
+        "src-switch": "00:00:00:00:00:00:01:06"
+    }, 
+    {
+        "dst-port": 3, 
+        "dst-switch": "00:00:00:00:00:00:01:05", 
+        "src-port": 4, 
+        "src-switch": "00:00:00:00:00:00:01:06"
+    }, 
+    {
+        "dst-port": 20, 
+        "dst-switch": "00:00:00:00:00:00:04:01", 
+        "src-port": 2, 
+        "src-switch": "00:00:00:00:00:00:04:14"
+    }, 
+    {
+        "dst-port": 8, 
+        "dst-switch": "00:00:00:00:00:00:07:01", 
+        "src-port": 2, 
+        "src-switch": "00:00:00:00:00:00:07:08"
+    }, 
+    {
+        "dst-port": 26, 
+        "dst-switch": "00:00:00:00:00:00:05:01", 
+        "src-port": 6, 
+        "src-switch": "00:00:00:00:00:00:01:04"
+    }, 
+    {
+        "dst-port": 26, 
+        "dst-switch": "00:00:00:00:00:00:04:01", 
+        "src-port": 5, 
+        "src-switch": "00:00:00:00:00:00:01:04"
+    }, 
+    {
+        "dst-port": 3, 
+        "dst-switch": "00:00:00:00:00:00:01:03", 
+        "src-port": 2, 
+        "src-switch": "00:00:00:00:00:00:01:04"
+    }, 
+    {
+        "dst-port": 2, 
+        "dst-switch": "00:00:00:00:00:00:01:05", 
+        "src-port": 3, 
+        "src-switch": "00:00:00:00:00:00:01:04"
+    }, 
+    {
+        "dst-port": 5, 
+        "dst-switch": "00:00:00:00:00:00:01:06", 
+        "src-port": 4, 
+        "src-switch": "00:00:00:00:00:00:01:04"
+    }, 
+    {
+        "dst-port": 6, 
+        "dst-switch": "00:00:00:00:00:00:04:01", 
+        "src-port": 2, 
+        "src-switch": "00:00:00:00:00:00:04:06"
+    }, 
+    {
+        "dst-port": 5, 
+        "dst-switch": "00:00:00:00:00:00:08:01", 
+        "src-port": 2, 
+        "src-switch": "00:00:00:00:00:00:08:05"
+    }, 
+    {
+        "dst-port": 15, 
+        "dst-switch": "00:00:00:00:00:00:07:01", 
+        "src-port": 2, 
+        "src-switch": "00:00:00:00:00:00:07:0f"
+    }, 
+    {
+        "dst-port": 3, 
+        "dst-switch": "00:00:00:00:00:00:01:04", 
+        "src-port": 2, 
+        "src-switch": "00:00:00:00:00:00:01:05"
+    }, 
+    {
+        "dst-port": 4, 
+        "dst-switch": "00:00:00:00:00:00:01:06", 
+        "src-port": 3, 
+        "src-switch": "00:00:00:00:00:00:01:05"
+    }, 
+    {
+        "dst-port": 26, 
+        "dst-switch": "00:00:00:00:00:00:06:01", 
+        "src-port": 4, 
+        "src-switch": "00:00:00:00:00:00:01:05"
+    }, 
+    {
+        "dst-port": 25, 
+        "dst-switch": "00:00:00:00:00:00:04:01", 
+        "src-port": 2, 
+        "src-switch": "00:00:00:00:00:00:04:19"
+    }, 
+    {
+        "dst-port": 20, 
+        "dst-switch": "00:00:00:00:00:00:03:01", 
+        "src-port": 2, 
+        "src-switch": "00:00:00:00:00:00:03:14"
+    }, 
+    {
+        "dst-port": 12, 
+        "dst-switch": "00:00:00:00:00:00:05:01", 
+        "src-port": 2, 
+        "src-switch": "00:00:00:00:00:00:05:0c"
+    }, 
+    {
+        "dst-port": 14, 
+        "dst-switch": "00:00:00:00:00:00:07:01", 
+        "src-port": 2, 
+        "src-switch": "00:00:00:00:00:00:07:0e"
+    }, 
+    {
+        "dst-port": 25, 
+        "dst-switch": "00:00:00:00:00:00:05:01", 
+        "src-port": 2, 
+        "src-switch": "00:00:00:00:00:00:05:19"
+    }, 
+    {
+        "dst-port": 16, 
+        "dst-switch": "00:00:00:00:00:00:04:01", 
+        "src-port": 2, 
+        "src-switch": "00:00:00:00:00:00:04:10"
+    }, 
+    {
+        "dst-port": 10, 
+        "dst-switch": "00:00:00:00:00:00:04:01", 
+        "src-port": 2, 
+        "src-switch": "00:00:00:00:00:00:04:0a"
+    }, 
+    {
+        "dst-port": 11, 
+        "dst-switch": "00:00:00:00:00:00:03:01", 
+        "src-port": 2, 
+        "src-switch": "00:00:00:00:00:00:03:0b"
+    }, 
+    {
+        "dst-port": 15, 
+        "dst-switch": "00:00:00:00:00:00:02:01", 
+        "src-port": 2, 
+        "src-switch": "00:00:00:00:00:00:02:0f"
+    }, 
+    {
+        "dst-port": 12, 
+        "dst-switch": "00:00:00:00:00:00:07:01", 
+        "src-port": 2, 
+        "src-switch": "00:00:00:00:00:00:07:0c"
+    }, 
+    {
+        "dst-port": 2, 
+        "dst-switch": "00:00:00:00:00:00:03:01", 
+        "src-port": 2, 
+        "src-switch": "00:00:00:00:00:00:03:02"
+    }, 
+    {
+        "dst-port": 22, 
+        "dst-switch": "00:00:00:00:00:00:07:01", 
+        "src-port": 2, 
+        "src-switch": "00:00:00:00:00:00:07:16"
+    }, 
+    {
+        "dst-port": 10, 
+        "dst-switch": "00:00:00:00:00:00:03:01", 
+        "src-port": 2, 
+        "src-switch": "00:00:00:00:00:00:03:0a"
+    }, 
+    {
+        "dst-port": 2, 
+        "dst-switch": "00:00:00:00:00:00:08:01", 
+        "src-port": 2, 
+        "src-switch": "00:00:00:00:00:00:08:02"
+    }, 
+    {
+        "dst-port": 17, 
+        "dst-switch": "00:00:00:00:00:00:03:01", 
+        "src-port": 2, 
+        "src-switch": "00:00:00:00:00:00:03:11"
+    }, 
+    {
+        "dst-port": 31, 
+        "dst-switch": "00:00:00:00:00:00:02:01", 
+        "src-port": 2, 
+        "src-switch": "00:00:00:00:00:00:02:1f"
+    }, 
+    {
+        "dst-port": 11, 
+        "dst-switch": "00:00:00:00:00:00:04:01", 
+        "src-port": 2, 
+        "src-switch": "00:00:00:00:00:00:04:0b"
+    }, 
+    {
+        "dst-port": 17, 
+        "dst-switch": "00:00:00:00:00:00:08:01", 
+        "src-port": 2, 
+        "src-switch": "00:00:00:00:00:00:08:11"
+    }, 
+    {
+        "dst-port": 44, 
+        "dst-switch": "00:00:00:00:00:00:02:01", 
+        "src-port": 2, 
+        "src-switch": "00:00:00:00:00:00:02:2c"
+    }, 
+    {
+        "dst-port": 9, 
+        "dst-switch": "00:00:00:00:00:00:04:01", 
+        "src-port": 2, 
+        "src-switch": "00:00:00:00:00:00:04:09"
+    }, 
+    {
+        "dst-port": 25, 
+        "dst-switch": "00:00:00:00:00:00:08:01", 
+        "src-port": 2, 
+        "src-switch": "00:00:00:00:00:00:08:19"
+    }, 
+    {
+        "dst-port": 16, 
+        "dst-switch": "00:00:00:00:00:00:07:01", 
+        "src-port": 2, 
+        "src-switch": "00:00:00:00:00:00:07:10"
+    }, 
+    {
+        "dst-port": 23, 
+        "dst-switch": "00:00:00:00:00:00:06:01", 
+        "src-port": 2, 
+        "src-switch": "00:00:00:00:00:00:06:17"
+    }, 
+    {
+        "dst-port": 39, 
+        "dst-switch": "00:00:00:00:00:00:02:01", 
+        "src-port": 2, 
+        "src-switch": "00:00:00:00:00:00:02:27"
+    }, 
+    {
+        "dst-port": 14, 
+        "dst-switch": "00:00:00:00:00:00:08:01", 
+        "src-port": 2, 
+        "src-switch": "00:00:00:00:00:00:08:0e"
+    }, 
+    {
+        "dst-port": 11, 
+        "dst-switch": "00:00:00:00:00:00:02:01", 
+        "src-port": 2, 
+        "src-switch": "00:00:00:00:00:00:02:0b"
+    }, 
+    {
+        "dst-port": 21, 
+        "dst-switch": "00:00:00:00:00:00:05:01", 
+        "src-port": 2, 
+        "src-switch": "00:00:00:00:00:00:05:15"
+    }, 
+    {
+        "dst-port": 13, 
+        "dst-switch": "00:00:00:00:00:00:07:01", 
+        "src-port": 2, 
+        "src-switch": "00:00:00:00:00:00:07:0d"
+    }, 
+    {
+        "dst-port": 13, 
+        "dst-switch": "00:00:00:00:00:00:06:01", 
+        "src-port": 2, 
+        "src-switch": "00:00:00:00:00:00:06:0d"
+    }, 
+    {
+        "dst-port": 21, 
+        "dst-switch": "00:00:00:00:00:00:03:01", 
+        "src-port": 2, 
+        "src-switch": "00:00:00:00:00:00:03:15"
+    }, 
+    {
+        "dst-port": 27, 
+        "dst-switch": "00:00:00:00:00:00:02:01", 
+        "src-port": 2, 
+        "src-switch": "00:00:00:00:00:00:02:1b"
+    }, 
+    {
+        "dst-port": 3, 
+        "dst-switch": "00:00:00:00:00:00:07:01", 
+        "src-port": 2, 
+        "src-switch": "00:00:00:00:00:00:07:03"
+    }, 
+    {
+        "dst-port": 21, 
+        "dst-switch": "00:00:00:00:00:00:06:01", 
+        "src-port": 2, 
+        "src-switch": "00:00:00:00:00:00:06:15"
+    }, 
+    {
+        "dst-port": 13, 
+        "dst-switch": "00:00:00:00:00:00:02:01", 
+        "src-port": 2, 
+        "src-switch": "00:00:00:00:00:00:02:0d"
+    }, 
+    {
+        "dst-port": 5, 
+        "dst-switch": "00:00:00:00:00:00:04:01", 
+        "src-port": 2, 
+        "src-switch": "00:00:00:00:00:00:04:05"
+    }, 
+    {
+        "dst-port": 10, 
+        "dst-switch": "00:00:00:00:00:00:08:01", 
+        "src-port": 2, 
+        "src-switch": "00:00:00:00:00:00:08:0a"
+    }, 
+    {
+        "dst-port": 23, 
+        "dst-switch": "00:00:00:00:00:00:08:01", 
+        "src-port": 2, 
+        "src-switch": "00:00:00:00:00:00:08:17"
+    }, 
+    {
+        "dst-port": 18, 
+        "dst-switch": "00:00:00:00:00:00:07:01", 
+        "src-port": 2, 
+        "src-switch": "00:00:00:00:00:00:07:12"
+    }, 
+    {
+        "dst-port": 8, 
+        "dst-switch": "00:00:00:00:00:00:08:01", 
+        "src-port": 2, 
+        "src-switch": "00:00:00:00:00:00:08:08"
+    }, 
+    {
+        "dst-port": 8, 
+        "dst-switch": "00:00:00:00:00:00:06:01", 
+        "src-port": 2, 
+        "src-switch": "00:00:00:00:00:00:06:08"
+    }, 
+    {
+        "dst-port": 17, 
+        "dst-switch": "00:00:00:00:00:00:02:01", 
+        "src-port": 2, 
+        "src-switch": "00:00:00:00:00:00:02:11"
+    }, 
+    {
+        "dst-port": 23, 
+        "dst-switch": "00:00:00:00:00:00:04:01", 
+        "src-port": 2, 
+        "src-switch": "00:00:00:00:00:00:04:17"
+    }, 
+    {
+        "dst-port": 35, 
+        "dst-switch": "00:00:00:00:00:00:02:01", 
+        "src-port": 2, 
+        "src-switch": "00:00:00:00:00:00:02:23"
+    }, 
+    {
+        "dst-port": 38, 
+        "dst-switch": "00:00:00:00:00:00:02:01", 
+        "src-port": 2, 
+        "src-switch": "00:00:00:00:00:00:02:26"
+    }, 
+    {
+        "dst-port": 25, 
+        "dst-switch": "00:00:00:00:00:00:03:01", 
+        "src-port": 2, 
+        "src-switch": "00:00:00:00:00:00:03:19"
+    }, 
+    {
+        "dst-port": 4, 
+        "dst-switch": "00:00:00:00:00:00:07:01", 
+        "src-port": 2, 
+        "src-switch": "00:00:00:00:00:00:07:04"
+    }, 
+    {
+        "dst-port": 36, 
+        "dst-switch": "00:00:00:00:00:00:02:01", 
+        "src-port": 2, 
+        "src-switch": "00:00:00:00:00:00:02:24"
+    }, 
+    {
+        "dst-port": 10, 
+        "dst-switch": "00:00:00:00:00:00:07:01", 
+        "src-port": 2, 
+        "src-switch": "00:00:00:00:00:00:07:0a"
+    }, 
+    {
+        "dst-port": 23, 
+        "dst-switch": "00:00:00:00:00:00:03:01", 
+        "src-port": 2, 
+        "src-switch": "00:00:00:00:00:00:03:17"
+    }, 
+    {
+        "dst-port": 12, 
+        "dst-switch": "00:00:00:00:00:00:02:01", 
+        "src-port": 2, 
+        "src-switch": "00:00:00:00:00:00:02:0c"
+    }, 
+    {
+        "dst-port": 43, 
+        "dst-switch": "00:00:00:00:00:00:02:01", 
+        "src-port": 2, 
+        "src-switch": "00:00:00:00:00:00:02:2b"
+    }, 
+    {
+        "dst-port": 5, 
+        "dst-switch": "00:00:00:00:00:00:07:01", 
+        "src-port": 2, 
+        "src-switch": "00:00:00:00:00:00:07:05"
+    }, 
+    {
+        "dst-port": 8, 
+        "dst-switch": "00:00:00:00:00:00:04:01", 
+        "src-port": 2, 
+        "src-switch": "00:00:00:00:00:00:04:08"
+    }, 
+    {
+        "dst-port": 4, 
+        "dst-switch": "00:00:00:00:00:00:08:01", 
+        "src-port": 2, 
+        "src-switch": "00:00:00:00:00:00:08:04"
+    }, 
+    {
+        "dst-port": 24, 
+        "dst-switch": "00:00:00:00:00:00:02:01", 
+        "src-port": 2, 
+        "src-switch": "00:00:00:00:00:00:02:18"
+    }, 
+    {
+        "dst-port": 28, 
+        "dst-switch": "00:00:00:00:00:00:02:01", 
+        "src-port": 2, 
+        "src-switch": "00:00:00:00:00:00:02:1c"
+    }, 
+    {
+        "dst-port": 2, 
+        "dst-switch": "00:00:00:00:00:00:07:0c", 
+        "src-port": 12, 
+        "src-switch": "00:00:00:00:00:00:07:01"
+    }, 
+    {
+        "dst-port": 2, 
+        "dst-switch": "00:00:00:00:00:00:07:16", 
+        "src-port": 22, 
+        "src-switch": "00:00:00:00:00:00:07:01"
+    }, 
+    {
+        "dst-port": 2, 
+        "dst-switch": "00:00:00:00:00:00:07:14", 
+        "src-port": 20, 
+        "src-switch": "00:00:00:00:00:00:07:01"
+    }, 
+    {
+        "dst-port": 2, 
+        "dst-switch": "00:00:00:00:00:00:07:06", 
+        "src-port": 6, 
+        "src-switch": "00:00:00:00:00:00:07:01"
+    }, 
+    {
+        "dst-port": 2, 
+        "dst-switch": "00:00:00:00:00:00:07:0d", 
+        "src-port": 13, 
+        "src-switch": "00:00:00:00:00:00:07:01"
+    }, 
+    {
+        "dst-port": 2, 
+        "dst-switch": "00:00:00:00:00:00:07:13", 
+        "src-port": 19, 
+        "src-switch": "00:00:00:00:00:00:07:01"
+    }, 
+    {
+        "dst-port": 2, 
+        "dst-switch": "00:00:00:00:00:00:07:05", 
+        "src-port": 5, 
+        "src-switch": "00:00:00:00:00:00:07:01"
+    }, 
+    {
+        "dst-port": 2, 
+        "dst-switch": "00:00:00:00:00:00:07:12", 
+        "src-port": 18, 
+        "src-switch": "00:00:00:00:00:00:07:01"
+    }, 
+    {
+        "dst-port": 2, 
+        "dst-switch": "00:00:00:00:00:00:07:19", 
+        "src-port": 25, 
+        "src-switch": "00:00:00:00:00:00:07:01"
+    }, 
+    {
+        "dst-port": 2, 
+        "dst-switch": "00:00:00:00:00:00:07:07", 
+        "src-port": 7, 
+        "src-switch": "00:00:00:00:00:00:07:01"
+    }, 
+    {
+        "dst-port": 6, 
+        "dst-switch": "00:00:00:00:00:00:01:06", 
+        "src-port": 26, 
+        "src-switch": "00:00:00:00:00:00:07:01"
+    }, 
+    {
+        "dst-port": 2, 
+        "dst-switch": "00:00:00:00:00:00:07:08", 
+        "src-port": 8, 
+        "src-switch": "00:00:00:00:00:00:07:01"
+    }, 
+    {
+        "dst-port": 2, 
+        "dst-switch": "00:00:00:00:00:00:07:11", 
+        "src-port": 17, 
+        "src-switch": "00:00:00:00:00:00:07:01"
+    }, 
+    {
+        "dst-port": 2, 
+        "dst-switch": "00:00:00:00:00:00:07:02", 
+        "src-port": 2, 
+        "src-switch": "00:00:00:00:00:00:07:01"
+    }, 
+    {
+        "dst-port": 2, 
+        "dst-switch": "00:00:00:00:00:00:07:09", 
+        "src-port": 9, 
+        "src-switch": "00:00:00:00:00:00:07:01"
+    }, 
+    {
+        "dst-port": 2, 
+        "dst-switch": "00:00:00:00:00:00:07:0a", 
+        "src-port": 10, 
+        "src-switch": "00:00:00:00:00:00:07:01"
+    }, 
+    {
+        "dst-port": 2, 
+        "dst-switch": "00:00:00:00:00:00:07:17", 
+        "src-port": 23, 
+        "src-switch": "00:00:00:00:00:00:07:01"
+    }, 
+    {
+        "dst-port": 2, 
+        "dst-switch": "00:00:00:00:00:00:07:10", 
+        "src-port": 16, 
+        "src-switch": "00:00:00:00:00:00:07:01"
+    }, 
+    {
+        "dst-port": 2, 
+        "dst-switch": "00:00:00:00:00:00:07:0f", 
+        "src-port": 15, 
+        "src-switch": "00:00:00:00:00:00:07:01"
+    }, 
+    {
+        "dst-port": 2, 
+        "dst-switch": "00:00:00:00:00:00:07:18", 
+        "src-port": 24, 
+        "src-switch": "00:00:00:00:00:00:07:01"
+    }, 
+    {
+        "dst-port": 2, 
+        "dst-switch": "00:00:00:00:00:00:07:0e", 
+        "src-port": 14, 
+        "src-switch": "00:00:00:00:00:00:07:01"
+    }, 
+    {
+        "dst-port": 2, 
+        "dst-switch": "00:00:00:00:00:00:07:15", 
+        "src-port": 21, 
+        "src-switch": "00:00:00:00:00:00:07:01"
+    }, 
+    {
+        "dst-port": 2, 
+        "dst-switch": "00:00:00:00:00:00:07:03", 
+        "src-port": 3, 
+        "src-switch": "00:00:00:00:00:00:07:01"
+    }, 
+    {
+        "dst-port": 2, 
+        "dst-switch": "00:00:00:00:00:00:07:0b", 
+        "src-port": 11, 
+        "src-switch": "00:00:00:00:00:00:07:01"
+    }, 
+    {
+        "dst-port": 2, 
+        "dst-switch": "00:00:00:00:00:00:07:04", 
+        "src-port": 4, 
+        "src-switch": "00:00:00:00:00:00:07:01"
+    }, 
+    {
+        "dst-port": 16, 
+        "dst-switch": "00:00:00:00:00:00:03:01", 
+        "src-port": 2, 
+        "src-switch": "00:00:00:00:00:00:03:10"
+    }, 
+    {
+        "dst-port": 12, 
+        "dst-switch": "00:00:00:00:00:00:03:01", 
+        "src-port": 2, 
+        "src-switch": "00:00:00:00:00:00:03:0c"
+    }, 
+    {
+        "dst-port": 30, 
+        "dst-switch": "00:00:00:00:00:00:02:01", 
+        "src-port": 2, 
+        "src-switch": "00:00:00:00:00:00:02:1e"
+    }, 
+    {
+        "dst-port": 4, 
+        "dst-switch": "00:00:00:00:00:00:06:01", 
+        "src-port": 2, 
+        "src-switch": "00:00:00:00:00:00:06:04"
+    }, 
+    {
+        "dst-port": 19, 
+        "dst-switch": "00:00:00:00:00:00:02:01", 
+        "src-port": 2, 
+        "src-switch": "00:00:00:00:00:00:02:13"
+    }, 
+    {
+        "dst-port": 2, 
+        "dst-switch": "00:00:00:00:00:00:02:28", 
+        "src-port": 40, 
+        "src-switch": "00:00:00:00:00:00:02:01"
+    }, 
+    {
+        "dst-port": 2, 
+        "dst-switch": "00:00:00:00:00:00:02:16", 
+        "src-port": 22, 
+        "src-switch": "00:00:00:00:00:00:02:01"
+    }, 
+    {
+        "dst-port": 2, 
+        "dst-switch": "00:00:00:00:00:00:02:31", 
+        "src-port": 49, 
+        "src-switch": "00:00:00:00:00:00:02:01"
+    }, 
+    {
+        "dst-port": 2, 
+        "dst-switch": "00:00:00:00:00:00:02:0c", 
+        "src-port": 12, 
+        "src-switch": "00:00:00:00:00:00:02:01"
+    }, 
+    {
+        "dst-port": 2, 
+        "dst-switch": "00:00:00:00:00:00:02:1f", 
+        "src-port": 31, 
+        "src-switch": "00:00:00:00:00:00:02:01"
+    }, 
+    {
+        "dst-port": 2, 
+        "dst-switch": "00:00:00:00:00:00:02:14", 
+        "src-port": 20, 
+        "src-switch": "00:00:00:00:00:00:02:01"
+    }, 
+    {
+        "dst-port": 2, 
+        "dst-switch": "00:00:00:00:00:00:02:06", 
+        "src-port": 6, 
+        "src-switch": "00:00:00:00:00:00:02:01"
+    }, 
+    {
+        "dst-port": 2, 
+        "dst-switch": "00:00:00:00:00:00:02:1b", 
+        "src-port": 27, 
+        "src-switch": "00:00:00:00:00:00:02:01"
+    }, 
+    {
+        "dst-port": 2, 
+        "dst-switch": "00:00:00:00:00:00:02:22", 
+        "src-port": 34, 
+        "src-switch": "00:00:00:00:00:00:02:01"
+    }, 
+    {
+        "dst-port": 2, 
+        "dst-switch": "00:00:00:00:00:00:02:13", 
+        "src-port": 19, 
+        "src-switch": "00:00:00:00:00:00:02:01"
+    }, 
+    {
+        "dst-port": 2, 
+        "dst-switch": "00:00:00:00:00:00:02:0d", 
+        "src-port": 13, 
+        "src-switch": "00:00:00:00:00:00:02:01"
+    }, 
+    {
+        "dst-port": 2, 
+        "dst-switch": "00:00:00:00:00:00:02:29", 
+        "src-port": 41, 
+        "src-switch": "00:00:00:00:00:00:02:01"
+    }, 
+    {
+        "dst-port": 2, 
+        "dst-switch": "00:00:00:00:00:00:02:30", 
+        "src-port": 48, 
+        "src-switch": "00:00:00:00:00:00:02:01"
+    }, 
+    {
+        "dst-port": 2, 
+        "dst-switch": "00:00:00:00:00:00:02:05", 
+        "src-port": 5, 
+        "src-switch": "00:00:00:00:00:00:02:01"
+    }, 
+    {
+        "dst-port": 2, 
+        "dst-switch": "00:00:00:00:00:00:02:1c", 
+        "src-port": 28, 
+        "src-switch": "00:00:00:00:00:00:02:01"
+    }, 
+    {
+        "dst-port": 2, 
+        "dst-switch": "00:00:00:00:00:00:02:21", 
+        "src-port": 33, 
+        "src-switch": "00:00:00:00:00:00:02:01"
+    }, 
+    {
+        "dst-port": 2, 
+        "dst-switch": "00:00:00:00:00:00:02:12", 
+        "src-port": 18, 
+        "src-switch": "00:00:00:00:00:00:02:01"
+    }, 
+    {
+        "dst-port": 2, 
+        "dst-switch": "00:00:00:00:00:00:02:2a", 
+        "src-port": 42, 
+        "src-switch": "00:00:00:00:00:00:02:01"
+    }, 
+    {
+        "dst-port": 2, 
+        "dst-switch": "00:00:00:00:00:00:02:19", 
+        "src-port": 25, 
+        "src-switch": "00:00:00:00:00:00:02:01"
+    }, 
+    {
+        "dst-port": 2, 
+        "dst-switch": "00:00:00:00:00:00:02:2f", 
+        "src-port": 47, 
+        "src-switch": "00:00:00:00:00:00:02:01"
+    }, 
+    {
+        "dst-port": 2, 
+        "dst-switch": "00:00:00:00:00:00:02:2e", 
+        "src-port": 46, 
+        "src-switch": "00:00:00:00:00:00:02:01"
+    }, 
+    {
+        "dst-port": 2, 
+        "dst-switch": "00:00:00:00:00:00:02:07", 
+        "src-port": 7, 
+        "src-switch": "00:00:00:00:00:00:02:01"
+    }, 
+    {
+        "dst-port": 2, 
+        "dst-switch": "00:00:00:00:00:00:02:1a", 
+        "src-port": 26, 
+        "src-switch": "00:00:00:00:00:00:02:01"
+    }, 
+    {
+        "dst-port": 2, 
+        "dst-switch": "00:00:00:00:00:00:02:24", 
+        "src-port": 36, 
+        "src-switch": "00:00:00:00:00:00:02:01"
+    }, 
+    {
+        "dst-port": 2, 
+        "dst-switch": "00:00:00:00:00:00:02:08", 
+        "src-port": 8, 
+        "src-switch": "00:00:00:00:00:00:02:01"
+    }, 
+    {
+        "dst-port": 2, 
+        "dst-switch": "00:00:00:00:00:00:02:2d", 
+        "src-port": 45, 
+        "src-switch": "00:00:00:00:00:00:02:01"
+    }, 
+    {
+        "dst-port": 2, 
+        "dst-switch": "00:00:00:00:00:00:02:23", 
+        "src-port": 35, 
+        "src-switch": "00:00:00:00:00:00:02:01"
+    }, 
+    {
+        "dst-port": 2, 
+        "dst-switch": "00:00:00:00:00:00:02:11", 
+        "src-port": 17, 
+        "src-switch": "00:00:00:00:00:00:02:01"
+    }, 
+    {
+        "dst-port": 2, 
+        "dst-switch": "00:00:00:00:00:00:02:02", 
+        "src-port": 2, 
+        "src-switch": "00:00:00:00:00:00:02:01"
+    }, 
+    {
+        "dst-port": 2, 
+        "dst-switch": "00:00:00:00:00:00:02:09", 
+        "src-port": 9, 
+        "src-switch": "00:00:00:00:00:00:02:01"
+    }, 
+    {
+        "dst-port": 4, 
+        "dst-switch": "00:00:00:00:00:00:01:02", 
+        "src-port": 51, 
+        "src-switch": "00:00:00:00:00:00:02:01"
+    }, 
+    {
+        "dst-port": 2, 
+        "dst-switch": "00:00:00:00:00:00:02:25", 
+        "src-port": 37, 
+        "src-switch": "00:00:00:00:00:00:02:01"
+    }, 
+    {
+        "dst-port": 2, 
+        "dst-switch": "00:00:00:00:00:00:02:2c", 
+        "src-port": 44, 
+        "src-switch": "00:00:00:00:00:00:02:01"
+    }, 
+    {
+        "dst-port": 2, 
+        "dst-switch": "00:00:00:00:00:00:02:2b", 
+        "src-port": 43, 
+        "src-switch": "00:00:00:00:00:00:02:01"
+    }, 
+    {
+        "dst-port": 2, 
+        "dst-switch": "00:00:00:00:00:00:02:10", 
+        "src-port": 16, 
+        "src-switch": "00:00:00:00:00:00:02:01"
+    }, 
+    {
+        "dst-port": 2, 
+        "dst-switch": "00:00:00:00:00:00:02:1e", 
+        "src-port": 30, 
+        "src-switch": "00:00:00:00:00:00:02:01"
+    }, 
+    {
+        "dst-port": 2, 
+        "dst-switch": "00:00:00:00:00:00:02:17", 
+        "src-port": 23, 
+        "src-switch": "00:00:00:00:00:00:02:01"
+    }, 
+    {
+        "dst-port": 2, 
+        "dst-switch": "00:00:00:00:00:00:02:0a", 
+        "src-port": 10, 
+        "src-switch": "00:00:00:00:00:00:02:01"
+    }, 
+    {
+        "dst-port": 2, 
+        "dst-switch": "00:00:00:00:00:00:02:0f", 
+        "src-port": 15, 
+        "src-switch": "00:00:00:00:00:00:02:01"
+    }, 
+    {
+        "dst-port": 2, 
+        "dst-switch": "00:00:00:00:00:00:02:26", 
+        "src-port": 38, 
+        "src-switch": "00:00:00:00:00:00:02:01"
+    }, 
+    {
+        "dst-port": 2, 
+        "dst-switch": "00:00:00:00:00:00:02:1d", 
+        "src-port": 29, 
+        "src-switch": "00:00:00:00:00:00:02:01"
+    }, 
+    {
+        "dst-port": 2, 
+        "dst-switch": "00:00:00:00:00:00:02:18", 
+        "src-port": 24, 
+        "src-switch": "00:00:00:00:00:00:02:01"
+    }, 
+    {
+        "dst-port": 2, 
+        "dst-switch": "00:00:00:00:00:00:02:0e", 
+        "src-port": 14, 
+        "src-switch": "00:00:00:00:00:00:02:01"
+    }, 
+    {
+        "dst-port": 2, 
+        "dst-switch": "00:00:00:00:00:00:02:15", 
+        "src-port": 21, 
+        "src-switch": "00:00:00:00:00:00:02:01"
+    }, 
+    {
+        "dst-port": 2, 
+        "dst-switch": "00:00:00:00:00:00:02:03", 
+        "src-port": 3, 
+        "src-switch": "00:00:00:00:00:00:02:01"
+    }, 
+    {
+        "dst-port": 2, 
+        "dst-switch": "00:00:00:00:00:00:02:27", 
+        "src-port": 39, 
+        "src-switch": "00:00:00:00:00:00:02:01"
+    }, 
+    {
+        "dst-port": 2, 
+        "dst-switch": "00:00:00:00:00:00:02:20", 
+        "src-port": 32, 
+        "src-switch": "00:00:00:00:00:00:02:01"
+    }, 
+    {
+        "dst-port": 2, 
+        "dst-switch": "00:00:00:00:00:00:02:0b", 
+        "src-port": 11, 
+        "src-switch": "00:00:00:00:00:00:02:01"
+    }, 
+    {
+        "dst-port": 2, 
+        "dst-switch": "00:00:00:00:00:00:02:04", 
+        "src-port": 4, 
+        "src-switch": "00:00:00:00:00:00:02:01"
+    }, 
+    {
+        "dst-port": 2, 
+        "dst-switch": "00:00:00:00:00:00:02:04", 
+        "src-port": 4, 
+        "src-switch": "00:00:00:00:00:00:02:01"
+    }, 
+    {
+        "dst-port": 2, 
+        "dst-switch": "00:00:00:00:00:00:02:32", 
+        "src-port": 50, 
+        "src-switch": "00:00:00:00:00:00:02:01"
+    }, 
+    {
+        "dst-port": 16, 
+        "dst-switch": "00:00:00:00:00:00:06:01", 
+        "src-port": 2, 
+        "src-switch": "00:00:00:00:00:00:06:10"
+    }, 
+    {
+        "dst-port": 20, 
+        "dst-switch": "00:00:00:00:00:00:08:01", 
+        "src-port": 2, 
+        "src-switch": "00:00:00:00:00:00:08:14"
+    }, 
+    {
+        "dst-port": 4, 
+        "dst-switch": "00:00:00:00:00:00:05:01", 
+        "src-port": 2, 
+        "src-switch": "00:00:00:00:00:00:05:04"
+    }, 
+    {
+        "dst-port": 49, 
+        "dst-switch": "00:00:00:00:00:00:02:01", 
+        "src-port": 2, 
+        "src-switch": "00:00:00:00:00:00:02:31"
+    }, 
+    {
+        "dst-port": 20, 
+        "dst-switch": "00:00:00:00:00:00:05:01", 
+        "src-port": 2, 
+        "src-switch": "00:00:00:00:00:00:05:14"
+    }, 
+    {
+        "dst-port": 5, 
+        "dst-switch": "00:00:00:00:00:00:03:01", 
+        "src-port": 2, 
+        "src-switch": "00:00:00:00:00:00:03:05"
+    }, 
+    {
+        "dst-port": 24, 
+        "dst-switch": "00:00:00:00:00:00:07:01", 
+        "src-port": 2, 
+        "src-switch": "00:00:00:00:00:00:07:18"
+    }, 
+    {
+        "dst-port": 18, 
+        "dst-switch": "00:00:00:00:00:00:02:01", 
+        "src-port": 2, 
+        "src-switch": "00:00:00:00:00:00:02:12"
+    }, 
+    {
+        "dst-port": 11, 
+        "dst-switch": "00:00:00:00:00:00:05:01", 
+        "src-port": 2, 
+        "src-switch": "00:00:00:00:00:00:05:0b"
+    }, 
+    {
+        "dst-port": 42, 
+        "dst-switch": "00:00:00:00:00:00:02:01", 
+        "src-port": 2, 
+        "src-switch": "00:00:00:00:00:00:02:2a"
+    }, 
+    {
+        "dst-port": 24, 
+        "dst-switch": "00:00:00:00:00:00:08:01", 
+        "src-port": 2, 
+        "src-switch": "00:00:00:00:00:00:08:18"
+    }, 
+    {
+        "dst-port": 48, 
+        "dst-switch": "00:00:00:00:00:00:02:01", 
+        "src-port": 2, 
+        "src-switch": "00:00:00:00:00:00:02:30"
+    }, 
+    {
+        "dst-port": 20, 
+        "dst-switch": "00:00:00:00:00:00:06:01", 
+        "src-port": 2, 
+        "src-switch": "00:00:00:00:00:00:06:14"
+    }, 
+    {
+        "dst-port": 21, 
+        "dst-switch": "00:00:00:00:00:00:04:01", 
+        "src-port": 2, 
+        "src-switch": "00:00:00:00:00:00:04:15"
+    }, 
+    {
+        "dst-port": 19, 
+        "dst-switch": "00:00:00:00:00:00:05:01", 
+        "src-port": 2, 
+        "src-switch": "00:00:00:00:00:00:05:13"
+    }, 
+    {
+        "dst-port": 7, 
+        "dst-switch": "00:00:00:00:00:00:06:01", 
+        "src-port": 2, 
+        "src-switch": "00:00:00:00:00:00:06:07"
+    }, 
+    {
+        "dst-port": 37, 
+        "dst-switch": "00:00:00:00:00:00:02:01", 
+        "src-port": 2, 
+        "src-switch": "00:00:00:00:00:00:02:25"
+    }, 
+    {
+        "dst-port": 33, 
+        "dst-switch": "00:00:00:00:00:00:02:01", 
+        "src-port": 2, 
+        "src-switch": "00:00:00:00:00:00:02:21"
+    }, 
+    {
+        "dst-port": 23, 
+        "dst-switch": "00:00:00:00:00:00:07:01", 
+        "src-port": 2, 
+        "src-switch": "00:00:00:00:00:00:07:17"
+    }, 
+    {
+        "dst-port": 6, 
+        "dst-switch": "00:00:00:00:00:00:06:01", 
+        "src-port": 2, 
+        "src-switch": "00:00:00:00:00:00:06:06"
+    }, 
+    {
+        "dst-port": 16, 
+        "dst-switch": "00:00:00:00:00:00:02:01", 
+        "src-port": 2, 
+        "src-switch": "00:00:00:00:00:00:02:10"
+    }, 
+    {
+        "dst-port": 17, 
+        "dst-switch": "00:00:00:00:00:00:05:01", 
+        "src-port": 2, 
+        "src-switch": "00:00:00:00:00:00:05:11"
+    }, 
+    {
+        "dst-port": 13, 
+        "dst-switch": "00:00:00:00:00:00:08:01", 
+        "src-port": 2, 
+        "src-switch": "00:00:00:00:00:00:08:0d"
+    }, 
+    {
+        "dst-port": 32, 
+        "dst-switch": "00:00:00:00:00:00:02:01", 
+        "src-port": 2, 
+        "src-switch": "00:00:00:00:00:00:02:20"
+    }, 
+    {
+        "dst-port": 16, 
+        "dst-switch": "00:00:00:00:00:00:08:01", 
+        "src-port": 2, 
+        "src-switch": "00:00:00:00:00:00:08:10"
+    }, 
+    {
+        "dst-port": 9, 
+        "dst-switch": "00:00:00:00:00:00:07:01", 
+        "src-port": 2, 
+        "src-switch": "00:00:00:00:00:00:07:09"
+    }, 
+    {
+        "dst-port": 34, 
+        "dst-switch": "00:00:00:00:00:00:02:01", 
+        "src-port": 2, 
+        "src-switch": "00:00:00:00:00:00:02:22"
+    }, 
+    {
+        "dst-port": 4, 
+        "dst-switch": "00:00:00:00:00:00:03:01", 
+        "src-port": 2, 
+        "src-switch": "00:00:00:00:00:00:03:04"
+    }, 
+    {
+        "dst-port": 9, 
+        "dst-switch": "00:00:00:00:00:00:06:01", 
+        "src-port": 2, 
+        "src-switch": "00:00:00:00:00:00:06:09"
+    }, 
+    {
+        "dst-port": 21, 
+        "dst-switch": "00:00:00:00:00:00:08:01", 
+        "src-port": 2, 
+        "src-switch": "00:00:00:00:00:00:08:15"
+    }, 
+    {
+        "dst-port": 7, 
+        "dst-switch": "00:00:00:00:00:00:03:01", 
+        "src-port": 2, 
+        "src-switch": "00:00:00:00:00:00:03:07"
+    }, 
+    {
+        "dst-port": 12, 
+        "dst-switch": "00:00:00:00:00:00:08:01", 
+        "src-port": 2, 
+        "src-switch": "00:00:00:00:00:00:08:0c"
+    }, 
+    {
+        "dst-port": 47, 
+        "dst-switch": "00:00:00:00:00:00:02:01", 
+        "src-port": 2, 
+        "src-switch": "00:00:00:00:00:00:02:2f"
+    }, 
+    {
+        "dst-port": 16, 
+        "dst-switch": "00:00:00:00:00:00:05:01", 
+        "src-port": 2, 
+        "src-switch": "00:00:00:00:00:00:05:10"
+    }, 
+    {
+        "dst-port": 9, 
+        "dst-switch": "00:00:00:00:00:00:02:01", 
+        "src-port": 2, 
+        "src-switch": "00:00:00:00:00:00:02:09"
+    }, 
+    {
+        "dst-port": 13, 
+        "dst-switch": "00:00:00:00:00:00:05:01", 
+        "src-port": 2, 
+        "src-switch": "00:00:00:00:00:00:05:0d"
+    }, 
+    {
+        "dst-port": 19, 
+        "dst-switch": "00:00:00:00:00:00:08:01", 
+        "src-port": 2, 
+        "src-switch": "00:00:00:00:00:00:08:13"
+    }, 
+    {
+        "dst-port": 6, 
+        "dst-switch": "00:00:00:00:00:00:03:01", 
+        "src-port": 2, 
+        "src-switch": "00:00:00:00:00:00:03:06"
+    }, 
+    {
+        "dst-port": 15, 
+        "dst-switch": "00:00:00:00:00:00:05:01", 
+        "src-port": 2, 
+        "src-switch": "00:00:00:00:00:00:05:0f"
+    }, 
+    {
+        "dst-port": 2, 
+        "dst-switch": "00:00:00:00:00:00:06:01", 
+        "src-port": 2, 
+        "src-switch": "00:00:00:00:00:00:06:02"
+    }, 
+    {
+        "dst-port": 9, 
+        "dst-switch": "00:00:00:00:00:00:05:01", 
+        "src-port": 2, 
+        "src-switch": "00:00:00:00:00:00:05:09"
+    }, 
+    {
+        "dst-port": 24, 
+        "dst-switch": "00:00:00:00:00:00:03:01", 
+        "src-port": 2, 
+        "src-switch": "00:00:00:00:00:00:03:18"
+    }, 
+    {
+        "dst-port": 18, 
+        "dst-switch": "00:00:00:00:00:00:05:01", 
+        "src-port": 2, 
+        "src-switch": "00:00:00:00:00:00:05:12"
+    }, 
+    {
+        "dst-port": 24, 
+        "dst-switch": "00:00:00:00:00:00:05:01", 
+        "src-port": 2, 
+        "src-switch": "00:00:00:00:00:00:05:18"
+    }, 
+    {
+        "dst-port": 45, 
+        "dst-switch": "00:00:00:00:00:00:02:01", 
+        "src-port": 2, 
+        "src-switch": "00:00:00:00:00:00:02:2d"
+    }, 
+    {
+        "dst-port": 11, 
+        "dst-switch": "00:00:00:00:00:00:06:01", 
+        "src-port": 2, 
+        "src-switch": "00:00:00:00:00:00:06:0b"
+    }, 
+    {
+        "dst-port": 19, 
+        "dst-switch": "00:00:00:00:00:00:03:01", 
+        "src-port": 2, 
+        "src-switch": "00:00:00:00:00:00:03:13"
+    }, 
+    {
+        "dst-port": 2, 
+        "dst-switch": "00:00:00:00:00:00:05:01", 
+        "src-port": 2, 
+        "src-switch": "00:00:00:00:00:00:05:02"
+    }, 
+    {
+        "dst-port": 20, 
+        "dst-switch": "00:00:00:00:00:00:02:01", 
+        "src-port": 2, 
+        "src-switch": "00:00:00:00:00:00:02:14"
+    }, 
+    {
+        "dst-port": 2, 
+        "dst-switch": "00:00:00:00:00:00:08:0c", 
+        "src-port": 12, 
+        "src-switch": "00:00:00:00:00:00:08:01"
+    }, 
+    {
+        "dst-port": 2, 
+        "dst-switch": "00:00:00:00:00:00:08:16", 
+        "src-port": 22, 
+        "src-switch": "00:00:00:00:00:00:08:01"
+    }, 
+    {
+        "dst-port": 2, 
+        "dst-switch": "00:00:00:00:00:00:08:14", 
+        "src-port": 20, 
+        "src-switch": "00:00:00:00:00:00:08:01"
+    }, 
+    {
+        "dst-port": 2, 
+        "dst-switch": "00:00:00:00:00:00:08:06", 
+        "src-port": 6, 
+        "src-switch": "00:00:00:00:00:00:08:01"
+    }, 
+    {
+        "dst-port": 2, 
+        "dst-switch": "00:00:00:00:00:00:08:0d", 
+        "src-port": 13, 
+        "src-switch": "00:00:00:00:00:00:08:01"
+    }, 
+    {
+        "dst-port": 2, 
+        "dst-switch": "00:00:00:00:00:00:08:13", 
+        "src-port": 19, 
+        "src-switch": "00:00:00:00:00:00:08:01"
+    }, 
+    {
+        "dst-port": 2, 
+        "dst-switch": "00:00:00:00:00:00:08:05", 
+        "src-port": 5, 
+        "src-switch": "00:00:00:00:00:00:08:01"
+    }, 
+    {
+        "dst-port": 2, 
+        "dst-switch": "00:00:00:00:00:00:08:12", 
+        "src-port": 18, 
+        "src-switch": "00:00:00:00:00:00:08:01"
+    }, 
+    {
+        "dst-port": 2, 
+        "dst-switch": "00:00:00:00:00:00:08:19", 
+        "src-port": 25, 
+        "src-switch": "00:00:00:00:00:00:08:01"
+    }, 
+    {
+        "dst-port": 2, 
+        "dst-switch": "00:00:00:00:00:00:08:07", 
+        "src-port": 7, 
+        "src-switch": "00:00:00:00:00:00:08:01"
+    }, 
+    {
+        "dst-port": 4, 
+        "dst-switch": "00:00:00:00:00:00:01:01", 
+        "src-port": 26, 
+        "src-switch": "00:00:00:00:00:00:08:01"
+    }, 
+    {
+        "dst-port": 2, 
+        "dst-switch": "00:00:00:00:00:00:08:08", 
+        "src-port": 8, 
+        "src-switch": "00:00:00:00:00:00:08:01"
+    }, 
+    {
+        "dst-port": 2, 
+        "dst-switch": "00:00:00:00:00:00:08:11", 
+        "src-port": 17, 
+        "src-switch": "00:00:00:00:00:00:08:01"
+    }, 
+    {
+        "dst-port": 2, 
+        "dst-switch": "00:00:00:00:00:00:08:02", 
+        "src-port": 2, 
+        "src-switch": "00:00:00:00:00:00:08:01"
+    }, 
+    {
+        "dst-port": 2, 
+        "dst-switch": "00:00:00:00:00:00:08:09", 
+        "src-port": 9, 
+        "src-switch": "00:00:00:00:00:00:08:01"
+    }, 
+    {
+        "dst-port": 2, 
+        "dst-switch": "00:00:00:00:00:00:08:0a", 
+        "src-port": 10, 
+        "src-switch": "00:00:00:00:00:00:08:01"
+    }, 
+    {
+        "dst-port": 2, 
+        "dst-switch": "00:00:00:00:00:00:08:17", 
+        "src-port": 23, 
+        "src-switch": "00:00:00:00:00:00:08:01"
+    }, 
+    {
+        "dst-port": 2, 
+        "dst-switch": "00:00:00:00:00:00:08:10", 
+        "src-port": 16, 
+        "src-switch": "00:00:00:00:00:00:08:01"
+    }, 
+    {
+        "dst-port": 2, 
+        "dst-switch": "00:00:00:00:00:00:08:0f", 
+        "src-port": 15, 
+        "src-switch": "00:00:00:00:00:00:08:01"
+    }, 
+    {
+        "dst-port": 2, 
+        "dst-switch": "00:00:00:00:00:00:08:18", 
+        "src-port": 24, 
+        "src-switch": "00:00:00:00:00:00:08:01"
+    }, 
+    {
+        "dst-port": 2, 
+        "dst-switch": "00:00:00:00:00:00:08:0e", 
+        "src-port": 14, 
+        "src-switch": "00:00:00:00:00:00:08:01"
+    }, 
+    {
+        "dst-port": 2, 
+        "dst-switch": "00:00:00:00:00:00:08:15", 
+        "src-port": 21, 
+        "src-switch": "00:00:00:00:00:00:08:01"
+    }, 
+    {
+        "dst-port": 2, 
+        "dst-switch": "00:00:00:00:00:00:08:03", 
+        "src-port": 3, 
+        "src-switch": "00:00:00:00:00:00:08:01"
+    }, 
+    {
+        "dst-port": 2, 
+        "dst-switch": "00:00:00:00:00:00:08:0b", 
+        "src-port": 11, 
+        "src-switch": "00:00:00:00:00:00:08:01"
+    }, 
+    {
+        "dst-port": 2, 
+        "dst-switch": "00:00:00:00:00:00:08:04", 
+        "src-port": 4, 
+        "src-switch": "00:00:00:00:00:00:08:01"
+    }, 
+    {
+        "dst-port": 2, 
+        "dst-switch": "00:00:00:00:00:00:03:0c", 
+        "src-port": 12, 
+        "src-switch": "00:00:00:00:00:00:03:01"
+    }, 
+    {
+        "dst-port": 2, 
+        "dst-switch": "00:00:00:00:00:00:03:16", 
+        "src-port": 22, 
+        "src-switch": "00:00:00:00:00:00:03:01"
+    }, 
+    {
+        "dst-port": 2, 
+        "dst-switch": "00:00:00:00:00:00:03:14", 
+        "src-port": 20, 
+        "src-switch": "00:00:00:00:00:00:03:01"
+    }, 
+    {
+        "dst-port": 2, 
+        "dst-switch": "00:00:00:00:00:00:03:06", 
+        "src-port": 6, 
+        "src-switch": "00:00:00:00:00:00:03:01"
+    }, 
+    {
+        "dst-port": 2, 
+        "dst-switch": "00:00:00:00:00:00:03:0d", 
+        "src-port": 13, 
+        "src-switch": "00:00:00:00:00:00:03:01"
+    }, 
+    {
+        "dst-port": 2, 
+        "dst-switch": "00:00:00:00:00:00:03:0d", 
+        "src-port": 13, 
+        "src-switch": "00:00:00:00:00:00:03:01"
+    }, 
+    {
+        "dst-port": 2, 
+        "dst-switch": "00:00:00:00:00:00:03:13", 
+        "src-port": 19, 
+        "src-switch": "00:00:00:00:00:00:03:01"
+    }, 
+    {
+        "dst-port": 2, 
+        "dst-switch": "00:00:00:00:00:00:03:05", 
+        "src-port": 5, 
+        "src-switch": "00:00:00:00:00:00:03:01"
+    }, 
+    {
+        "dst-port": 2, 
+        "dst-switch": "00:00:00:00:00:00:03:12", 
+        "src-port": 18, 
+        "src-switch": "00:00:00:00:00:00:03:01"
+    }, 
+    {
+        "dst-port": 2, 
+        "dst-switch": "00:00:00:00:00:00:03:19", 
+        "src-port": 25, 
+        "src-switch": "00:00:00:00:00:00:03:01"
+    }, 
+    {
+        "dst-port": 2, 
+        "dst-switch": "00:00:00:00:00:00:03:07", 
+        "src-port": 7, 
+        "src-switch": "00:00:00:00:00:00:03:01"
+    }, 
+    {
+        "dst-port": 5, 
+        "dst-switch": "00:00:00:00:00:00:01:03", 
+        "src-port": 26, 
+        "src-switch": "00:00:00:00:00:00:03:01"
+    }, 
+    {
+        "dst-port": 2, 
+        "dst-switch": "00:00:00:00:00:00:03:08", 
+        "src-port": 8, 
+        "src-switch": "00:00:00:00:00:00:03:01"
+    }, 
+    {
+        "dst-port": 2, 
+        "dst-switch": "00:00:00:00:00:00:03:11", 
+        "src-port": 17, 
+        "src-switch": "00:00:00:00:00:00:03:01"
+    }, 
+    {
+        "dst-port": 2, 
+        "dst-switch": "00:00:00:00:00:00:03:02", 
+        "src-port": 2, 
+        "src-switch": "00:00:00:00:00:00:03:01"
+    }, 
+    {
+        "dst-port": 2, 
+        "dst-switch": "00:00:00:00:00:00:03:09", 
+        "src-port": 9, 
+        "src-switch": "00:00:00:00:00:00:03:01"
+    }, 
+    {
+        "dst-port": 2, 
+        "dst-switch": "00:00:00:00:00:00:03:0a", 
+        "src-port": 10, 
+        "src-switch": "00:00:00:00:00:00:03:01"
+    }, 
+    {
+        "dst-port": 2, 
+        "dst-switch": "00:00:00:00:00:00:03:17", 
+        "src-port": 23, 
+        "src-switch": "00:00:00:00:00:00:03:01"
+    }, 
+    {
+        "dst-port": 2, 
+        "dst-switch": "00:00:00:00:00:00:03:10", 
+        "src-port": 16, 
+        "src-switch": "00:00:00:00:00:00:03:01"
+    }, 
+    {
+        "dst-port": 2, 
+        "dst-switch": "00:00:00:00:00:00:03:0f", 
+        "src-port": 15, 
+        "src-switch": "00:00:00:00:00:00:03:01"
+    }, 
+    {
+        "dst-port": 2, 
+        "dst-switch": "00:00:00:00:00:00:03:18", 
+        "src-port": 24, 
+        "src-switch": "00:00:00:00:00:00:03:01"
+    }, 
+    {
+        "dst-port": 2, 
+        "dst-switch": "00:00:00:00:00:00:03:0e", 
+        "src-port": 14, 
+        "src-switch": "00:00:00:00:00:00:03:01"
+    }, 
+    {
+        "dst-port": 2, 
+        "dst-switch": "00:00:00:00:00:00:03:15", 
+        "src-port": 21, 
+        "src-switch": "00:00:00:00:00:00:03:01"
+    }, 
+    {
+        "dst-port": 2, 
+        "dst-switch": "00:00:00:00:00:00:03:03", 
+        "src-port": 3, 
+        "src-switch": "00:00:00:00:00:00:03:01"
+    }, 
+    {
+        "dst-port": 2, 
+        "dst-switch": "00:00:00:00:00:00:03:0b", 
+        "src-port": 11, 
+        "src-switch": "00:00:00:00:00:00:03:01"
+    }, 
+    {
+        "dst-port": 2, 
+        "dst-switch": "00:00:00:00:00:00:03:04", 
+        "src-port": 4, 
+        "src-switch": "00:00:00:00:00:00:03:01"
+    }, 
+    {
+        "dst-port": 3, 
+        "dst-switch": "00:00:00:00:00:00:06:01", 
+        "src-port": 2, 
+        "src-switch": "00:00:00:00:00:00:06:03"
+    }, 
+    {
+        "dst-port": 29, 
+        "dst-switch": "00:00:00:00:00:00:02:01", 
+        "src-port": 2, 
+        "src-switch": "00:00:00:00:00:00:02:1d"
+    }, 
+    {
+        "dst-port": 3, 
+        "dst-switch": "00:00:00:00:00:00:05:01", 
+        "src-port": 2, 
+        "src-switch": "00:00:00:00:00:00:05:03"
+    }, 
+    {
+        "dst-port": 25, 
+        "dst-switch": "00:00:00:00:00:00:02:01", 
+        "src-port": 2, 
+        "src-switch": "00:00:00:00:00:00:02:19"
+    }, 
+    {
+        "dst-port": 7, 
+        "dst-switch": "00:00:00:00:00:00:04:01", 
+        "src-port": 2, 
+        "src-switch": "00:00:00:00:00:00:04:07"
+    }, 
+    {
+        "dst-port": 8, 
+        "dst-switch": "00:00:00:00:00:00:02:01", 
+        "src-port": 2, 
+        "src-switch": "00:00:00:00:00:00:02:08"
+    }, 
+    {
+        "dst-port": 14, 
+        "dst-switch": "00:00:00:00:00:00:02:01", 
+        "src-port": 2, 
+        "src-switch": "00:00:00:00:00:00:02:0e"
+    }, 
+    {
+        "dst-port": 14, 
+        "dst-switch": "00:00:00:00:00:00:05:01", 
+        "src-port": 2, 
+        "src-switch": "00:00:00:00:00:00:05:0e"
+    }, 
+    {
+        "dst-port": 7, 
+        "dst-switch": "00:00:00:00:00:00:02:01", 
+        "src-port": 2, 
+        "src-switch": "00:00:00:00:00:00:02:07"
+    }, 
+    {
+        "dst-port": 6, 
+        "dst-switch": "00:00:00:00:00:00:05:01", 
+        "src-port": 2, 
+        "src-switch": "00:00:00:00:00:00:05:06"
+    }, 
+    {
+        "dst-port": 15, 
+        "dst-switch": "00:00:00:00:00:00:08:01", 
+        "src-port": 2, 
+        "src-switch": "00:00:00:00:00:00:08:0f"
+    }, 
+    {
+        "dst-port": 5, 
+        "dst-switch": "00:00:00:00:00:00:02:01", 
+        "src-port": 2, 
+        "src-switch": "00:00:00:00:00:00:02:05"
+    }, 
+    {
+        "dst-port": 2, 
+        "dst-switch": "00:00:00:00:00:00:05:0c", 
+        "src-port": 12, 
+        "src-switch": "00:00:00:00:00:00:05:01"
+    }, 
+    {
+        "dst-port": 2, 
+        "dst-switch": "00:00:00:00:00:00:05:16", 
+        "src-port": 22, 
+        "src-switch": "00:00:00:00:00:00:05:01"
+    }, 
+    {
+        "dst-port": 2, 
+        "dst-switch": "00:00:00:00:00:00:05:14", 
+        "src-port": 20, 
+        "src-switch": "00:00:00:00:00:00:05:01"
+    }, 
+    {
+        "dst-port": 2, 
+        "dst-switch": "00:00:00:00:00:00:05:06", 
+        "src-port": 6, 
+        "src-switch": "00:00:00:00:00:00:05:01"
+    }, 
+    {
+        "dst-port": 2, 
+        "dst-switch": "00:00:00:00:00:00:05:0d", 
+        "src-port": 13, 
+        "src-switch": "00:00:00:00:00:00:05:01"
+    }, 
+    {
+        "dst-port": 2, 
+        "dst-switch": "00:00:00:00:00:00:05:13", 
+        "src-port": 19, 
+        "src-switch": "00:00:00:00:00:00:05:01"
+    }, 
+    {
+        "dst-port": 2, 
+        "dst-switch": "00:00:00:00:00:00:05:05", 
+        "src-port": 5, 
+        "src-switch": "00:00:00:00:00:00:05:01"
+    }, 
+    {
+        "dst-port": 2, 
+        "dst-switch": "00:00:00:00:00:00:05:12", 
+        "src-port": 18, 
+        "src-switch": "00:00:00:00:00:00:05:01"
+    }, 
+    {
+        "dst-port": 2, 
+        "dst-switch": "00:00:00:00:00:00:05:19", 
+        "src-port": 25, 
+        "src-switch": "00:00:00:00:00:00:05:01"
+    }, 
+    {
+        "dst-port": 2, 
+        "dst-switch": "00:00:00:00:00:00:05:07", 
+        "src-port": 7, 
+        "src-switch": "00:00:00:00:00:00:05:01"
+    }, 
+    {
+        "dst-port": 6, 
+        "dst-switch": "00:00:00:00:00:00:01:04", 
+        "src-port": 26, 
+        "src-switch": "00:00:00:00:00:00:05:01"
+    }, 
+    {
+        "dst-port": 2, 
+        "dst-switch": "00:00:00:00:00:00:05:08", 
+        "src-port": 8, 
+        "src-switch": "00:00:00:00:00:00:05:01"
+    }, 
+    {
+        "dst-port": 2, 
+        "dst-switch": "00:00:00:00:00:00:05:11", 
+        "src-port": 17, 
+        "src-switch": "00:00:00:00:00:00:05:01"
+    }, 
+    {
+        "dst-port": 2, 
+        "dst-switch": "00:00:00:00:00:00:05:02", 
+        "src-port": 2, 
+        "src-switch": "00:00:00:00:00:00:05:01"
+    }, 
+    {
+        "dst-port": 2, 
+        "dst-switch": "00:00:00:00:00:00:05:09", 
+        "src-port": 9, 
+        "src-switch": "00:00:00:00:00:00:05:01"
+    }, 
+    {
+        "dst-port": 2, 
+        "dst-switch": "00:00:00:00:00:00:05:0a", 
+        "src-port": 10, 
+        "src-switch": "00:00:00:00:00:00:05:01"
+    }, 
+    {
+        "dst-port": 2, 
+        "dst-switch": "00:00:00:00:00:00:05:17", 
+        "src-port": 23, 
+        "src-switch": "00:00:00:00:00:00:05:01"
+    }, 
+    {
+        "dst-port": 2, 
+        "dst-switch": "00:00:00:00:00:00:05:10", 
+        "src-port": 16, 
+        "src-switch": "00:00:00:00:00:00:05:01"
+    }, 
+    {
+        "dst-port": 2, 
+        "dst-switch": "00:00:00:00:00:00:05:0f", 
+        "src-port": 15, 
+        "src-switch": "00:00:00:00:00:00:05:01"
+    }, 
+    {
+        "dst-port": 2, 
+        "dst-switch": "00:00:00:00:00:00:05:18", 
+        "src-port": 24, 
+        "src-switch": "00:00:00:00:00:00:05:01"
+    }, 
+    {
+        "dst-port": 2, 
+        "dst-switch": "00:00:00:00:00:00:05:0e", 
+        "src-port": 14, 
+        "src-switch": "00:00:00:00:00:00:05:01"
+    }, 
+    {
+        "dst-port": 2, 
+        "dst-switch": "00:00:00:00:00:00:05:15", 
+        "src-port": 21, 
+        "src-switch": "00:00:00:00:00:00:05:01"
+    }, 
+    {
+        "dst-port": 2, 
+        "dst-switch": "00:00:00:00:00:00:05:03", 
+        "src-port": 3, 
+        "src-switch": "00:00:00:00:00:00:05:01"
+    }, 
+    {
+        "dst-port": 2, 
+        "dst-switch": "00:00:00:00:00:00:05:0b", 
+        "src-port": 11, 
+        "src-switch": "00:00:00:00:00:00:05:01"
+    }, 
+    {
+        "dst-port": 2, 
+        "dst-switch": "00:00:00:00:00:00:05:04", 
+        "src-port": 4, 
+        "src-switch": "00:00:00:00:00:00:05:01"
+    }, 
+    {
+        "dst-port": 2, 
+        "dst-switch": "00:00:00:00:00:00:01:02", 
+        "src-port": 2, 
+        "src-switch": "00:00:00:00:00:00:01:01"
+    }, 
+    {
+        "dst-port": 2, 
+        "dst-switch": "00:00:00:00:00:00:01:06", 
+        "src-port": 3, 
+        "src-switch": "00:00:00:00:00:00:01:01"
+    }, 
+    {
+        "dst-port": 26, 
+        "dst-switch": "00:00:00:00:00:00:08:01", 
+        "src-port": 4, 
+        "src-switch": "00:00:00:00:00:00:01:01"
+    }, 
+    {
+        "dst-port": 18, 
+        "dst-switch": "00:00:00:00:00:00:04:01", 
+        "src-port": 2, 
+        "src-switch": "00:00:00:00:00:00:04:12"
+    }, 
+    {
+        "dst-port": 10, 
+        "dst-switch": "00:00:00:00:00:00:02:01", 
+        "src-port": 2, 
+        "src-switch": "00:00:00:00:00:00:02:0a"
+    }, 
+    {
+        "dst-port": 3, 
+        "dst-switch": "00:00:00:00:00:00:02:01", 
+        "src-port": 2, 
+        "src-switch": "00:00:00:00:00:00:02:03"
+    }, 
+    {
+        "dst-port": 17, 
+        "dst-switch": "00:00:00:00:00:00:04:01", 
+        "src-port": 2, 
+        "src-switch": "00:00:00:00:00:00:04:11"
+    }, 
+    {
+        "dst-port": 23, 
+        "dst-switch": "00:00:00:00:00:00:05:01", 
+        "src-port": 2, 
+        "src-switch": "00:00:00:00:00:00:05:17"
+    }, 
+    {
+        "dst-port": 18, 
+        "dst-switch": "00:00:00:00:00:00:06:01", 
+        "src-port": 2, 
+        "src-switch": "00:00:00:00:00:00:06:12"
+    }, 
+    {
+        "dst-port": 19, 
+        "dst-switch": "00:00:00:00:00:00:06:01", 
+        "src-port": 2, 
+        "src-switch": "00:00:00:00:00:00:06:13"
+    }, 
+    {
+        "dst-port": 7, 
+        "dst-switch": "00:00:00:00:00:00:05:01", 
+        "src-port": 2, 
+        "src-switch": "00:00:00:00:00:00:05:07"
+    }, 
+    {
+        "dst-port": 10, 
+        "dst-switch": "00:00:00:00:00:00:06:01", 
+        "src-port": 2, 
+        "src-switch": "00:00:00:00:00:00:06:0a"
+    }, 
+    {
+        "dst-port": 40, 
+        "dst-switch": "00:00:00:00:00:00:02:01", 
+        "src-port": 2, 
+        "src-switch": "00:00:00:00:00:00:02:28"
+    }, 
+    {
+        "dst-port": 10, 
+        "dst-switch": "00:00:00:00:00:00:05:01", 
+        "src-port": 2, 
+        "src-switch": "00:00:00:00:00:00:05:0a"
+    }, 
+    {
+        "dst-port": 50, 
+        "dst-switch": "00:00:00:00:00:00:02:01", 
+        "src-port": 2, 
+        "src-switch": "00:00:00:00:00:00:02:32"
+    }, 
+    {
+        "dst-port": 41, 
+        "dst-switch": "00:00:00:00:00:00:02:01", 
+        "src-port": 2, 
+        "src-switch": "00:00:00:00:00:00:02:29"
+    }, 
+    {
+        "dst-port": 5, 
+        "dst-switch": "00:00:00:00:00:00:05:01", 
+        "src-port": 2, 
+        "src-switch": "00:00:00:00:00:00:05:05"
+    }, 
+    {
+        "dst-port": 5, 
+        "dst-switch": "00:00:00:00:00:00:06:01", 
+        "src-port": 2, 
+        "src-switch": "00:00:00:00:00:00:06:05"
+    }, 
+    {
+        "dst-port": 22, 
+        "dst-switch": "00:00:00:00:00:00:08:01", 
+        "src-port": 2, 
+        "src-switch": "00:00:00:00:00:00:08:16"
+    }, 
+    {
+        "dst-port": 3, 
+        "dst-switch": "00:00:00:00:00:00:04:01", 
+        "src-port": 2, 
+        "src-switch": "00:00:00:00:00:00:04:03"
+    }, 
+    {
+        "dst-port": 23, 
+        "dst-switch": "00:00:00:00:00:00:02:01", 
+        "src-port": 2, 
+        "src-switch": "00:00:00:00:00:00:02:17"
+    }, 
+    {
+        "dst-port": 19, 
+        "dst-switch": "00:00:00:00:00:00:04:01", 
+        "src-port": 2, 
+        "src-switch": "00:00:00:00:00:00:04:13"
+    }, 
+    {
+        "dst-port": 4, 
+        "dst-switch": "00:00:00:00:00:00:04:01", 
+        "src-port": 2, 
+        "src-switch": "00:00:00:00:00:00:04:04"
+    }, 
+    {
+        "dst-port": 26, 
+        "dst-switch": "00:00:00:00:00:00:02:01", 
+        "src-port": 2, 
+        "src-switch": "00:00:00:00:00:00:02:1a"
+    }, 
+    {
+        "dst-port": 6, 
+        "dst-switch": "00:00:00:00:00:00:08:01", 
+        "src-port": 2, 
+        "src-switch": "00:00:00:00:00:00:08:06"
+    }, 
+    {
+        "dst-port": 2, 
+        "dst-switch": "00:00:00:00:00:00:04:01", 
+        "src-port": 2, 
+        "src-switch": "00:00:00:00:00:00:04:02"
+    }, 
+    {
+        "dst-port": 19, 
+        "dst-switch": "00:00:00:00:00:00:07:01", 
+        "src-port": 2, 
+        "src-switch": "00:00:00:00:00:00:07:13"
+    }, 
+    {
+        "dst-port": 2, 
+        "dst-switch": "00:00:00:00:00:00:04:0c", 
+        "src-port": 12, 
+        "src-switch": "00:00:00:00:00:00:04:01"
+    }, 
+    {
+        "dst-port": 2, 
+        "dst-switch": "00:00:00:00:00:00:04:16", 
+        "src-port": 22, 
+        "src-switch": "00:00:00:00:00:00:04:01"
+    }, 
+    {
+        "dst-port": 2, 
+        "dst-switch": "00:00:00:00:00:00:04:14", 
+        "src-port": 20, 
+        "src-switch": "00:00:00:00:00:00:04:01"
+    }, 
+    {
+        "dst-port": 2, 
+        "dst-switch": "00:00:00:00:00:00:04:06", 
+        "src-port": 6, 
+        "src-switch": "00:00:00:00:00:00:04:01"
+    }, 
+    {
+        "dst-port": 2, 
+        "dst-switch": "00:00:00:00:00:00:04:0d", 
+        "src-port": 13, 
+        "src-switch": "00:00:00:00:00:00:04:01"
+    }, 
+    {
+        "dst-port": 2, 
+        "dst-switch": "00:00:00:00:00:00:04:13", 
+        "src-port": 19, 
+        "src-switch": "00:00:00:00:00:00:04:01"
+    }, 
+    {
+        "dst-port": 2, 
+        "dst-switch": "00:00:00:00:00:00:04:05", 
+        "src-port": 5, 
+        "src-switch": "00:00:00:00:00:00:04:01"
+    }, 
+    {
+        "dst-port": 2, 
+        "dst-switch": "00:00:00:00:00:00:04:12", 
+        "src-port": 18, 
+        "src-switch": "00:00:00:00:00:00:04:01"
+    }, 
+    {
+        "dst-port": 2, 
+        "dst-switch": "00:00:00:00:00:00:04:19", 
+        "src-port": 25, 
+        "src-switch": "00:00:00:00:00:00:04:01"
+    }, 
+    {
+        "dst-port": 2, 
+        "dst-switch": "00:00:00:00:00:00:04:07", 
+        "src-port": 7, 
+        "src-switch": "00:00:00:00:00:00:04:01"
+    }, 
+    {
+        "dst-port": 5, 
+        "dst-switch": "00:00:00:00:00:00:01:04", 
+        "src-port": 26, 
+        "src-switch": "00:00:00:00:00:00:04:01"
+    }, 
+    {
+        "dst-port": 2, 
+        "dst-switch": "00:00:00:00:00:00:04:08", 
+        "src-port": 8, 
+        "src-switch": "00:00:00:00:00:00:04:01"
+    }, 
+    {
+        "dst-port": 2, 
+        "dst-switch": "00:00:00:00:00:00:04:11", 
+        "src-port": 17, 
+        "src-switch": "00:00:00:00:00:00:04:01"
+    }, 
+    {
+        "dst-port": 2, 
+        "dst-switch": "00:00:00:00:00:00:04:02", 
+        "src-port": 2, 
+        "src-switch": "00:00:00:00:00:00:04:01"
+    }, 
+    {
+        "dst-port": 2, 
+        "dst-switch": "00:00:00:00:00:00:04:09", 
+        "src-port": 9, 
+        "src-switch": "00:00:00:00:00:00:04:01"
+    }, 
+    {
+        "dst-port": 2, 
+        "dst-switch": "00:00:00:00:00:00:04:0a", 
+        "src-port": 10, 
+        "src-switch": "00:00:00:00:00:00:04:01"
+    }, 
+    {
+        "dst-port": 2, 
+        "dst-switch": "00:00:00:00:00:00:04:17", 
+        "src-port": 23, 
+        "src-switch": "00:00:00:00:00:00:04:01"
+    }, 
+    {
+        "dst-port": 2, 
+        "dst-switch": "00:00:00:00:00:00:04:10", 
+        "src-port": 16, 
+        "src-switch": "00:00:00:00:00:00:04:01"
+    }, 
+    {
+        "dst-port": 2, 
+        "dst-switch": "00:00:00:00:00:00:04:0f", 
+        "src-port": 15, 
+        "src-switch": "00:00:00:00:00:00:04:01"
+    }, 
+    {
+        "dst-port": 2, 
+        "dst-switch": "00:00:00:00:00:00:04:18", 
+        "src-port": 24, 
+        "src-switch": "00:00:00:00:00:00:04:01"
+    }, 
+    {
+        "dst-port": 2, 
+        "dst-switch": "00:00:00:00:00:00:04:0e", 
+        "src-port": 14, 
+        "src-switch": "00:00:00:00:00:00:04:01"
+    }, 
+    {
+        "dst-port": 2, 
+        "dst-switch": "00:00:00:00:00:00:04:15", 
+        "src-port": 21, 
+        "src-switch": "00:00:00:00:00:00:04:01"
+    }, 
+    {
+        "dst-port": 2, 
+        "dst-switch": "00:00:00:00:00:00:04:03", 
+        "src-port": 3, 
+        "src-switch": "00:00:00:00:00:00:04:01"
+    }, 
+    {
+        "dst-port": 2, 
+        "dst-switch": "00:00:00:00:00:00:04:0b", 
+        "src-port": 11, 
+        "src-switch": "00:00:00:00:00:00:04:01"
+    }, 
+    {
+        "dst-port": 2, 
+        "dst-switch": "00:00:00:00:00:00:04:04", 
+        "src-port": 4, 
+        "src-switch": "00:00:00:00:00:00:04:01"
+    }, 
+    {
+        "dst-port": 21, 
+        "dst-switch": "00:00:00:00:00:00:02:01", 
+        "src-port": 2, 
+        "src-switch": "00:00:00:00:00:00:02:15"
+    }, 
+    {
+        "dst-port": 3, 
+        "dst-switch": "00:00:00:00:00:00:08:01", 
+        "src-port": 2, 
+        "src-switch": "00:00:00:00:00:00:08:03"
+    }, 
+    {
+        "dst-port": 24, 
+        "dst-switch": "00:00:00:00:00:00:06:01", 
+        "src-port": 2, 
+        "src-switch": "00:00:00:00:00:00:06:18"
+    }, 
+    {
+        "dst-port": 9, 
+        "dst-switch": "00:00:00:00:00:00:08:01", 
+        "src-port": 2, 
+        "src-switch": "00:00:00:00:00:00:08:09"
+    }, 
+    {
+        "dst-port": 46, 
+        "dst-switch": "00:00:00:00:00:00:02:01", 
+        "src-port": 2, 
+        "src-switch": "00:00:00:00:00:00:02:2e"
+    }, 
+    {
+        "dst-port": 15, 
+        "dst-switch": "00:00:00:00:00:00:04:01", 
+        "src-port": 2, 
+        "src-switch": "00:00:00:00:00:00:04:0f"
+    }, 
+    {
+        "dst-port": 2, 
+        "dst-switch": "00:00:00:00:00:00:02:01", 
+        "src-port": 2, 
+        "src-switch": "00:00:00:00:00:00:02:02"
+    }, 
+    {
+        "dst-port": 14, 
+        "dst-switch": "00:00:00:00:00:00:06:01", 
+        "src-port": 2, 
+        "src-switch": "00:00:00:00:00:00:06:0e"
+    }, 
+    {
+        "dst-port": 22, 
+        "dst-switch": "00:00:00:00:00:00:03:01", 
+        "src-port": 2, 
+        "src-switch": "00:00:00:00:00:00:03:16"
+    }, 
+    {
+        "dst-port": 22, 
+        "dst-switch": "00:00:00:00:00:00:06:01", 
+        "src-port": 2, 
+        "src-switch": "00:00:00:00:00:00:06:16"
+    }, 
+    {
+        "dst-port": 7, 
+        "dst-switch": "00:00:00:00:00:00:08:01", 
+        "src-port": 2, 
+        "src-switch": "00:00:00:00:00:00:08:07"
+    }, 
+    {
+        "dst-port": 24, 
+        "dst-switch": "00:00:00:00:00:00:04:01", 
+        "src-port": 2, 
+        "src-switch": "00:00:00:00:00:00:04:18"
+    }, 
+    {
+        "dst-port": 2, 
+        "dst-switch": "00:00:00:00:00:00:06:0c", 
+        "src-port": 12, 
+        "src-switch": "00:00:00:00:00:00:06:01"
+    }, 
+    {
+        "dst-port": 2, 
+        "dst-switch": "00:00:00:00:00:00:06:16", 
+        "src-port": 22, 
+        "src-switch": "00:00:00:00:00:00:06:01"
+    }, 
+    {
+        "dst-port": 2, 
+        "dst-switch": "00:00:00:00:00:00:06:14", 
+        "src-port": 20, 
+        "src-switch": "00:00:00:00:00:00:06:01"
+    }, 
+    {
+        "dst-port": 2, 
+        "dst-switch": "00:00:00:00:00:00:06:06", 
+        "src-port": 6, 
+        "src-switch": "00:00:00:00:00:00:06:01"
+    }, 
+    {
+        "dst-port": 2, 
+        "dst-switch": "00:00:00:00:00:00:06:0d", 
+        "src-port": 13, 
+        "src-switch": "00:00:00:00:00:00:06:01"
+    }, 
+    {
+        "dst-port": 2, 
+        "dst-switch": "00:00:00:00:00:00:06:13", 
+        "src-port": 19, 
+        "src-switch": "00:00:00:00:00:00:06:01"
+    }, 
+    {
+        "dst-port": 2, 
+        "dst-switch": "00:00:00:00:00:00:06:05", 
+        "src-port": 5, 
+        "src-switch": "00:00:00:00:00:00:06:01"
+    }, 
+    {
+        "dst-port": 2, 
+        "dst-switch": "00:00:00:00:00:00:06:12", 
+        "src-port": 18, 
+        "src-switch": "00:00:00:00:00:00:06:01"
+    }, 
+    {
+        "dst-port": 2, 
+        "dst-switch": "00:00:00:00:00:00:06:19", 
+        "src-port": 25, 
+        "src-switch": "00:00:00:00:00:00:06:01"
+    }, 
+    {
+        "dst-port": 2, 
+        "dst-switch": "00:00:00:00:00:00:06:07", 
+        "src-port": 7, 
+        "src-switch": "00:00:00:00:00:00:06:01"
+    }, 
+    {
+        "dst-port": 4, 
+        "dst-switch": "00:00:00:00:00:00:01:05", 
+        "src-port": 26, 
+        "src-switch": "00:00:00:00:00:00:06:01"
+    }, 
+    {
+        "dst-port": 2, 
+        "dst-switch": "00:00:00:00:00:00:06:08", 
+        "src-port": 8, 
+        "src-switch": "00:00:00:00:00:00:06:01"
+    }, 
+    {
+        "dst-port": 2, 
+        "dst-switch": "00:00:00:00:00:00:06:11", 
+        "src-port": 17, 
+        "src-switch": "00:00:00:00:00:00:06:01"
+    }, 
+    {
+        "dst-port": 2, 
+        "dst-switch": "00:00:00:00:00:00:06:02", 
+        "src-port": 2, 
+        "src-switch": "00:00:00:00:00:00:06:01"
+    }, 
+    {
+        "dst-port": 2, 
+        "dst-switch": "00:00:00:00:00:00:06:09", 
+        "src-port": 9, 
+        "src-switch": "00:00:00:00:00:00:06:01"
+    }, 
+    {
+        "dst-port": 2, 
+        "dst-switch": "00:00:00:00:00:00:06:0a", 
+        "src-port": 10, 
+        "src-switch": "00:00:00:00:00:00:06:01"
+    }, 
+    {
+        "dst-port": 2, 
+        "dst-switch": "00:00:00:00:00:00:06:17", 
+        "src-port": 23, 
+        "src-switch": "00:00:00:00:00:00:06:01"
+    }, 
+    {
+        "dst-port": 2, 
+        "dst-switch": "00:00:00:00:00:00:06:10", 
+        "src-port": 16, 
+        "src-switch": "00:00:00:00:00:00:06:01"
+    }, 
+    {
+        "dst-port": 2, 
+        "dst-switch": "00:00:00:00:00:00:06:0f", 
+        "src-port": 15, 
+        "src-switch": "00:00:00:00:00:00:06:01"
+    }, 
+    {
+        "dst-port": 2, 
+        "dst-switch": "00:00:00:00:00:00:06:18", 
+        "src-port": 24, 
+        "src-switch": "00:00:00:00:00:00:06:01"
+    }, 
+    {
+        "dst-port": 2, 
+        "dst-switch": "00:00:00:00:00:00:06:0e", 
+        "src-port": 14, 
+        "src-switch": "00:00:00:00:00:00:06:01"
+    }, 
+    {
+        "dst-port": 2, 
+        "dst-switch": "00:00:00:00:00:00:06:15", 
+        "src-port": 21, 
+        "src-switch": "00:00:00:00:00:00:06:01"
+    }, 
+    {
+        "dst-port": 2, 
+        "dst-switch": "00:00:00:00:00:00:06:03", 
+        "src-port": 3, 
+        "src-switch": "00:00:00:00:00:00:06:01"
+    }, 
+    {
+        "dst-port": 2, 
+        "dst-switch": "00:00:00:00:00:00:06:0b", 
+        "src-port": 11, 
+        "src-switch": "00:00:00:00:00:00:06:01"
+    }, 
+    {
+        "dst-port": 2, 
+        "dst-switch": "00:00:00:00:00:00:06:04", 
+        "src-port": 4, 
+        "src-switch": "00:00:00:00:00:00:06:01"
+    }, 
+    {
+        "dst-port": 8, 
+        "dst-switch": "00:00:00:00:00:00:05:01", 
+        "src-port": 2, 
+        "src-switch": "00:00:00:00:00:00:05:08"
+    }
+]
diff --git a/web/ons-demo/data/configuration.json.dev b/web/ons-demo/data/configuration.json.dev
index 5968375..c2a2e6b 100644
--- a/web/ons-demo/data/configuration.json.dev
+++ b/web/ons-demo/data/configuration.json.dev
@@ -8,7 +8,6 @@
 		"00:00:00:00:00:00:01:06"
 	],
 	"aggregation": [
-		"00:00:00:00:00:00:01:01",
 		"00:00:00:00:00:00:02:01",
 		"00:00:00:00:00:00:03:01",
 		"00:00:00:00:00:00:04:01",
@@ -19,23 +18,61 @@
 	],
 	"association": {
 		"00:00:00:00:00:00:01:01": [
-			"00:00:00:00:00:00:08:01"
+			"00:00:00:00:00:00:07:01"
 		],
 		"00:00:00:00:00:00:01:02": [
-			"00:00:00:00:00:00:02:01"
+			"00:00:00:00:00:00:06:01"
 		],
 		"00:00:00:00:00:00:01:03": [
 			"00:00:00:00:00:00:03:01"
 		],
 		"00:00:00:00:00:00:01:04": [
-			"00:00:00:00:00:00:04:01",
-			"00:00:00:00:00:00:05:01"
+			"00:00:00:00:00:00:08:01"
 		],
 		"00:00:00:00:00:00:01:05": [
-			"00:00:00:00:00:00:06:01"
+			"00:00:00:00:00:00:02:01"
 		],
 		"00:00:00:00:00:00:01:06": [
-			"00:00:00:00:00:00:07:01"
+			"00:00:00:00:00:00:04:01",
+			"00:00:00:00:00:00:05:01"
 		]
+	},
+	"geo": {
+		"00:00:00:00:00:00:01:01": {
+			"lat": 33.758599,
+			"lng": -84.387360,
+			"label": "ATL",
+			"fanOutAngle": 0
+		},
+		"00:00:00:00:00:00:01:02": {
+			"lat": 37.901187,
+			"lng": -76.037163,
+			"label": "DC",
+			"fanOutAngle": 45
+		},
+		"00:00:00:00:00:00:01:03": {
+			"lat": 41.891033,
+			"lng": -87.628326,
+			"label": "CHI",
+			"fanOutAngle": 180
+		},
+		"00:00:00:00:00:00:01:04": {
+			"lat": 34.102708,
+			"lng": -118.238983,
+			"label": "LA",
+			"fanOutAngle": 315
+		},
+		"00:00:00:00:00:00:01:05": {
+			"lat": 47.611024,
+			"lng": -122.33242,
+			"label": "SEA",
+			"fanOutAngle": 270
+		},
+		"00:00:00:00:00:00:01:06": {
+			"lat": 41.225925,
+			"lng": -74.00528,
+			"label": "NYC",
+			"fanOutAngle": 135
+		}
 	}
 }
\ No newline at end of file
diff --git a/web/topology_rest.py b/web/topology_rest.py
index 036776f..7bbf7ce 100755
--- a/web/topology_rest.py
+++ b/web/topology_rest.py
@@ -15,6 +15,7 @@
 
 
 CONFIG_FILE=os.getenv("HOME") + "/ONOS/web/config.json"
+LINK_FILE=os.getenv("HOME") + "/ONOS/web/link.json"
 
 ## Global Var for ON.Lab local REST ##
 RestIP="localhost"
@@ -22,6 +23,9 @@
 ONOS_DEFAULT_HOST="localhost" ;# Has to set if LB=False
 DEBUG=1
 
+pp = pprint.PrettyPrinter(indent=4)
+app = Flask(__name__)
+
 def read_config():
   global LB, TESTBED, controllers, core_switches, ONOS_GUI3_HOST, ONOS_GUI3_CONTROL_HOST
   f = open(CONFIG_FILE)
@@ -34,8 +38,23 @@
   ONOS_GUI3_CONTROL_HOST=conf['ONOS_GUI3_CONTROL_HOST']
   f.close()
 
-pp = pprint.PrettyPrinter(indent=4)
-app = Flask(__name__)
+def read_link_def():
+  global link_def
+  f=open(LINK_FILE)
+  try:
+    link_def=json.load(f)
+    f.close()
+  except:
+    print "Can't read link def file (link.json)"
+    sys.exit(1)
+
+def get_link_ports(src_dpid, dst_dpid):
+  ret = (-1, -1)
+  for link in link_def:
+    if link['src-switch'] == src_dpid and link['dst-switch'] == dst_dpid:
+        ret = (link['src-port'], link['dst-port'])
+        break
+  return ret
 
 ## Worker Functions ##
 def log_error(txt):
@@ -671,10 +690,12 @@
 ### Command ###
 @app.route("/gui/controller/<cmd>/<controller_name>")
 def controller_status_change(cmd, controller_name):
-#  start_onos="ssh -i ~/.ssh/onlabkey.pem %s ONOS/start-onos.sh start" % (controller_name)
-#  stop_onos="ssh -i ~/.ssh/onlabkey.pem %s ONOS/start-onos.sh stop" % (controller_name)
-  start_onos="cd; onos start %s" % (controller_name[-1:])
-  stop_onos="cd; onos stop %s" % (controller_name[-1:])
+  if (TESTBED == "hw"):
+    start_onos="cd; onos start %s" % (controller_name[-1:])
+    stop_onos="cd; onos stop %s" % (controller_name[-1:])
+  else:
+    start_onos="ssh -i ~/.ssh/onlabkey.pem %s ONOS/start-onos.sh start" % (controller_name)
+    stop_onos="ssh -i ~/.ssh/onlabkey.pem %s ONOS/start-onos.sh stop" % (controller_name)
 
   if cmd == "up":
     result=os.popen(start_onos).read()
@@ -749,27 +770,37 @@
 
   cmd = 'up'
   result=""
-
   for dpid in (src_dpid, dst_dpid):
     if dpid in core_switches:
       host = controllers[0]
-      src_ports = [1, 2, 3, 4, 5]
     else:
       hostid=int(dpid.split(':')[-2])
       host = controllers[hostid-1]
-      if hostid == 2 :
-        src_ports = [51]
-      else :
-        src_ports = [26]
 
-    for port in src_ports :
-      cmd_string="ssh -i ~/.ssh/onlabkey.pem %s 'cd ONOS/scripts; ./link.sh %s %s %s'" % (host, dpid, port, cmd)
-      print cmd_string
-      res=os.popen(cmd_string).read()
-      result = result + ' ' + res
+    if dpid == src_dpid:
+      (port, dontcare) = get_link_ports(dpid, dst_dpid)
+    else:
+      (port, dontcare) = get_link_ports(dpid, src_dpid)
+
+    cmd_string="ssh -i ~/.ssh/onlabkey.pem %s 'cd ONOS/scripts; ./link.sh %s %s %s'" % (host, dpid, port, cmd)
+    print cmd_string
+    res=os.popen(cmd_string).read()
+    result = result + ' ' + res
 
   return result
 
+#      if hostid == 2 :
+#        src_ports = [51]
+#      else :
+#        src_ports = [26]
+#
+#    for port in src_ports :
+#      cmd_string="ssh -i ~/.ssh/onlabkey.pem %s 'cd ONOS/scripts; ./link.sh %s %s %s'" % (host, dpid, port, cmd)
+#      print cmd_string
+#      res=os.popen(cmd_string).read()
+
+
+
 # Link up on hardware testbed
 def link_up_hw(src_dpid, src_port, dst_dpid, dst_port):
 
@@ -875,16 +906,14 @@
 #1 FOOBAR 00:00:00:00:00:00:01:01 1 00:00:00:00:00:00:01:0b 1 matchSrcMac 00:00:00:00:00:00 matchDstMac 00:01:00:00:00:00
 @app.route("/gui/addflow/<src_dpid>/<src_port>/<dst_dpid>/<dst_port>/<srcMAC>/<dstMAC>")
 def add_flow(src_dpid, src_port, dst_dpid, dst_port, srcMAC, dstMAC):
-  command =  "/home/ubuntu/ONOS/web/get_flow.py  all |grep FlowPath  |gawk '{print strtonum($4)}'| sort -n | tail -n 1"
-  print command
-  ret = os.popen(command).read()
-  if ret == "":
-    flow_nr=0
-  else:
-    flow_nr=int(ret)
-
+  host = pick_host()
+  url ="%s/wm/flow/getsummary/%s/%s/json" % (host, 0, 0)
+  (code, result) = get_json(url)
+  parsedResult = json.loads(result)
+  flow_nr = int(parsedResult[-1]['flowId'], 16)
   flow_nr += 1
-  command = "/home/ubuntu/ONOS/web/add_flow.py -m onos %d %s %s %s %s %s matchSrcMac %s matchDstMac %s" % (flow_nr, "dummy", src_dpid, src_port, dst_dpid, dst_port, srcMAC, dstMAC)
+  command =  "/home/ubuntu/ONOS/web/add_flow.py -m onos %d %s %s %s %s %s matchSrcMac %s matchDstMac %s" % (flow_nr, "dummy", src_dpid, src_port, dst_dpid, dst_port, srcMAC, dstMAC)
+  flow_nr += 1
   command1 = "/home/ubuntu/ONOS/web/add_flow.py -m onos %d %s %s %s %s %s matchSrcMac %s matchDstMac %s" % (flow_nr, "dummy", dst_dpid, dst_port, src_dpid, src_port, dstMAC, srcMAC)
   print command
   errcode = os.popen(command).read()
@@ -999,6 +1028,7 @@
 if __name__ == "__main__":
   random.seed()
   read_config()
+  read_link_def()
   if len(sys.argv) > 1 and sys.argv[1] == "-d":
 #      add_flow("00:00:00:00:00:00:02:02", 1, "00:00:00:00:00:00:03:02", 1, "00:00:00:00:02:02", "00:00:00:00:03:0c")
 #     link_change("up", "00:00:00:00:ba:5e:ba:11", 1, "00:00:00:00:00:00:00:00", 1)
@@ -1016,7 +1046,8 @@
 #    devices()
 #    iperf_start(1,10,15)
 #    iperf_rate(1)
-    switches()
+#    switches()
+    add_flow(1,2,3,4,5,6)
   else:
     app.debug = True
     app.run(threaded=True, host="0.0.0.0", port=9000)