Index: trunk/src/cptms/data_layers/convertCSVtoJSON.bash
===================================================================
--- trunk/src/cptms/data_layers/convertCSVtoJSON.bash	(revision 318)
+++ trunk/src/cptms/data_layers/convertCSVtoJSON.bash	(revision 318)
@@ -0,0 +1,16 @@
+#!/bin/bash
+# Convert csv to json using awk pgm
+# Get input filename from command line
+if [ "$#" -ne 1 ] 
+then
+  echo "argument required: provide input csv filename of prepped postmile file"
+  exit 1
+fi 
+
+echo "{"
+echo " \"type\": \"FeatureCollection\","
+echo " \"features\": ["
+awk -F',' -f csvToJson.awk $1
+echo " ]"
+echo "}"
+# NB: You need to manually remove the comma after the last feature.
Index: trunk/src/cptms/data_layers/cmsStatusD12.json
===================================================================
--- trunk/src/cptms/data_layers/cmsStatusD12.json	(revision 318)
+++ trunk/src/cptms/data_layers/cmsStatusD12.json	(revision 318)
@@ -0,0 +1,3397 @@
+{
+	"data":
+	[
+		{
+			"cms":
+			{
+				"index": "1200022",
+				"recordTimestamp":
+				{
+					"recordDate": "2019-03-06",
+					"recordTime": "18:19:07"
+				},
+				"location":
+				{
+					"district":       "12",
+					"locationName":   "VISTA HERMOSA",
+					"nearbyPlace":    "San Clemente",
+					"longitude":      "-117.630113",
+					"latitude":       "33.444697",
+					"elevation":      "206",
+					"direction":      "North",
+					"county":         "Orange",
+					"route":          "I-5",
+					"routeSuffix":    "",
+					"postmilePrefix": "",
+					"postmile":       "4.01",
+					"alignment":      "",
+					"milepost":       "76.25"
+				},
+				"inService": "true",
+				"message":
+				{
+					"messageTimestamp":
+					{
+						"messageDate": "Not Reported",
+						"messageTime": "Not Reported"
+					},
+					"display":     "1 Page (Normal)",
+					"displayTime": "Not Reported",
+					"phase1":
+					{
+						"phase1Font":  "Not Reported",
+						"phase1Line1": "  MINUTES TO:   ",
+						"phase1Line2": "405 FREEWAY   16",
+						"phase1Line3": "JW AIRPORT    23"
+					},
+					"phase2":
+					{
+						"phase2Font":  "Not Reported",
+						"phase2Line1": "",
+						"phase2Line2": "",
+						"phase2Line3": ""
+					}
+				}
+			}
+		},
+		{
+			"cms":
+			{
+				"index": "1200023",
+				"recordTimestamp":
+				{
+					"recordDate": "2019-03-06",
+					"recordTime": "18:19:07"
+				},
+				"location":
+				{
+					"district":       "12",
+					"locationName":   "AEROPUERTO",
+					"nearbyPlace":    "San Juan Capistrano",
+					"longitude":      "-117.669201",
+					"latitude":       "33.481886",
+					"elevation":      "88",
+					"direction":      "North",
+					"county":         "Orange",
+					"route":          "I-5",
+					"routeSuffix":    "",
+					"postmilePrefix": "",
+					"postmile":       "8.01",
+					"alignment":      "",
+					"milepost":       "80.27"
+				},
+				"inService": "true",
+				"message":
+				{
+					"messageTimestamp":
+					{
+						"messageDate": "Not Reported",
+						"messageTime": "Not Reported"
+					},
+					"display":     "1 Page (Normal)",
+					"displayTime": "Not Reported",
+					"phase1":
+					{
+						"phase1Font":  "Not Reported",
+						"phase1Line1": "  MINUTES TO:   ",
+						"phase1Line2": "405 FREEWAY   12",
+						"phase1Line3": "55 FREEWAY    21"
+					},
+					"phase2":
+					{
+						"phase2Font":  "Not Reported",
+						"phase2Line1": "",
+						"phase2Line2": "",
+						"phase2Line3": ""
+					}
+				}
+			}
+		},
+		{
+			"cms":
+			{
+				"index": "1200024",
+				"recordTimestamp":
+				{
+					"recordDate": "2019-03-06",
+					"recordTime": "18:19:07"
+				},
+				"location":
+				{
+					"district":       "12",
+					"locationName":   "EL TORO",
+					"nearbyPlace":    "Laguna Hills",
+					"longitude":      "-117.706059",
+					"latitude":       "33.613779",
+					"elevation":      "380",
+					"direction":      "North",
+					"county":         "Orange",
+					"route":          "I-5",
+					"routeSuffix":    "",
+					"postmilePrefix": "",
+					"postmile":       "18.59",
+					"alignment":      "",
+					"milepost":       "90.83"
+				},
+				"inService": "true",
+				"message":
+				{
+					"messageTimestamp":
+					{
+						"messageDate": "Not Reported",
+						"messageTime": "Not Reported"
+					},
+					"display":     "1 Page (Normal)",
+					"displayTime": "Not Reported",
+					"phase1":
+					{
+						"phase1Font":  "Not Reported",
+						"phase1Line1": "I-405 TO CLOSE",
+						"phase1Line2": "AT FAIRVIEW",
+						"phase1Line3": "SAT  11PM-9AM"
+					},
+					"phase2":
+					{
+						"phase2Font":  "Not Reported",
+						"phase2Line1": "",
+						"phase2Line2": "",
+						"phase2Line3": ""
+					}
+				}
+			}
+		},
+		{
+			"cms":
+			{
+				"index": "1200025",
+				"recordTimestamp":
+				{
+					"recordDate": "2019-03-06",
+					"recordTime": "18:19:07"
+				},
+				"location":
+				{
+					"district":       "12",
+					"locationName":   "S\/O REDHILL",
+					"nearbyPlace":    "Tustin",
+					"longitude":      "-117.807584",
+					"latitude":       "33.728551",
+					"elevation":      "95",
+					"direction":      "North",
+					"county":         "Orange",
+					"route":          "I-5",
+					"routeSuffix":    "",
+					"postmilePrefix": "R",
+					"postmile":       "28.54",
+					"alignment":      "",
+					"milepost":       "100.78"
+				},
+				"inService": "true",
+				"message":
+				{
+					"messageTimestamp":
+					{
+						"messageDate": "Not Reported",
+						"messageTime": "Not Reported"
+					},
+					"display":     "Blank",
+					"displayTime": "Not Reported",
+					"phase1":
+					{
+						"phase1Font":  "Not Reported",
+						"phase1Line1": "",
+						"phase1Line2": "",
+						"phase1Line3": ""
+					},
+					"phase2":
+					{
+						"phase2Font":  "Not Reported",
+						"phase2Line1": "",
+						"phase2Line2": "",
+						"phase2Line3": ""
+					}
+				}
+			}
+		},
+		{
+			"cms":
+			{
+				"index": "1200026",
+				"recordTimestamp":
+				{
+					"recordDate": "2019-03-06",
+					"recordTime": "18:19:07"
+				},
+				"location":
+				{
+					"district":       "12",
+					"locationName":   "17TH ST.",
+					"nearbyPlace":    "Santa Ana",
+					"longitude":      "-117.860465",
+					"latitude":       "33.759171",
+					"elevation":      "180",
+					"direction":      "North",
+					"county":         "Orange",
+					"route":          "I-5",
+					"routeSuffix":    "",
+					"postmilePrefix": "",
+					"postmile":       "32.36",
+					"alignment":      "",
+					"milepost":       "104.63"
+				},
+				"inService": "true",
+				"message":
+				{
+					"messageTimestamp":
+					{
+						"messageDate": "Not Reported",
+						"messageTime": "Not Reported"
+					},
+					"display":     "Blank",
+					"displayTime": "Not Reported",
+					"phase1":
+					{
+						"phase1Font":  "Not Reported",
+						"phase1Line1": "",
+						"phase1Line2": "",
+						"phase1Line3": ""
+					},
+					"phase2":
+					{
+						"phase2Font":  "Not Reported",
+						"phase2Line1": "",
+						"phase2Line2": "",
+						"phase2Line3": ""
+					}
+				}
+			}
+		},
+		{
+			"cms":
+			{
+				"index": "1200027",
+				"recordTimestamp":
+				{
+					"recordDate": "2019-03-06",
+					"recordTime": "18:19:07"
+				},
+				"location":
+				{
+					"district":       "12",
+					"locationName":   "STATE COLLEGE",
+					"nearbyPlace":    "Orange",
+					"longitude":      "-117.889301",
+					"latitude":       "33.791531",
+					"elevation":      "150",
+					"direction":      "North",
+					"county":         "Orange",
+					"route":          "I-5",
+					"routeSuffix":    "",
+					"postmilePrefix": "",
+					"postmile":       "35.16",
+					"alignment":      "",
+					"milepost":       "107.4"
+				},
+				"inService": "true",
+				"message":
+				{
+					"messageTimestamp":
+					{
+						"messageDate": "Not Reported",
+						"messageTime": "Not Reported"
+					},
+					"display":     "Blank",
+					"displayTime": "Not Reported",
+					"phase1":
+					{
+						"phase1Font":  "Not Reported",
+						"phase1Line1": "",
+						"phase1Line2": "",
+						"phase1Line3": ""
+					},
+					"phase2":
+					{
+						"phase2Font":  "Not Reported",
+						"phase2Line1": "",
+						"phase2Line2": "",
+						"phase2Line3": ""
+					}
+				}
+			}
+		},
+		{
+			"cms":
+			{
+				"index": "1200028",
+				"recordTimestamp":
+				{
+					"recordDate": "2019-03-06",
+					"recordTime": "18:19:07"
+				},
+				"location":
+				{
+					"district":       "12",
+					"locationName":   "BROOKHURST ST.",
+					"nearbyPlace":    "Anaheim",
+					"longitude":      "-117.948993",
+					"latitude":       "33.840168",
+					"elevation":      "127",
+					"direction":      "North",
+					"county":         "Orange",
+					"route":          "I-5",
+					"routeSuffix":    "",
+					"postmilePrefix": "",
+					"postmile":       "40.03",
+					"alignment":      "",
+					"milepost":       "112.27"
+				},
+				"inService": "true",
+				"message":
+				{
+					"messageTimestamp":
+					{
+						"messageDate": "Not Reported",
+						"messageTime": "Not Reported"
+					},
+					"display":     "Blank",
+					"displayTime": "Not Reported",
+					"phase1":
+					{
+						"phase1Font":  "Not Reported",
+						"phase1Line1": "",
+						"phase1Line2": "",
+						"phase1Line3": ""
+					},
+					"phase2":
+					{
+						"phase2Font":  "Not Reported",
+						"phase2Line1": "",
+						"phase2Line2": "",
+						"phase2Line3": ""
+					}
+				}
+			}
+		},
+		{
+			"cms":
+			{
+				"index": "1200029",
+				"recordTimestamp":
+				{
+					"recordDate": "2019-03-06",
+					"recordTime": "18:19:07"
+				},
+				"location":
+				{
+					"district":       "12",
+					"locationName":   "LOS ALISOS AVE.",
+					"nearbyPlace":    "Laguna Hills",
+					"longitude":      "-117.697775",
+					"latitude":       "33.608063",
+					"elevation":      "393",
+					"direction":      "South",
+					"county":         "Orange",
+					"route":          "I-5",
+					"routeSuffix":    "",
+					"postmilePrefix": "",
+					"postmile":       "17.96",
+					"alignment":      "",
+					"milepost":       "90.21"
+				},
+				"inService": "true",
+				"message":
+				{
+					"messageTimestamp":
+					{
+						"messageDate": "Not Reported",
+						"messageTime": "Not Reported"
+					},
+					"display":     "Blank",
+					"displayTime": "Not Reported",
+					"phase1":
+					{
+						"phase1Font":  "Not Reported",
+						"phase1Line1": "",
+						"phase1Line2": "",
+						"phase1Line3": ""
+					},
+					"phase2":
+					{
+						"phase2Font":  "Not Reported",
+						"phase2Line1": "",
+						"phase2Line2": "",
+						"phase2Line3": ""
+					}
+				}
+			}
+		},
+		{
+			"cms":
+			{
+				"index": "1200030",
+				"recordTimestamp":
+				{
+					"recordDate": "2019-03-06",
+					"recordTime": "18:19:07"
+				},
+				"location":
+				{
+					"district":       "12",
+					"locationName":   "JEFFREY",
+					"nearbyPlace":    "Irvine",
+					"longitude":      "-117.766893",
+					"latitude":       "33.687054",
+					"elevation":      "170",
+					"direction":      "South",
+					"county":         "Orange",
+					"route":          "I-5",
+					"routeSuffix":    "",
+					"postmilePrefix": "R",
+					"postmile":       "24.78",
+					"alignment":      "",
+					"milepost":       "97.04"
+				},
+				"inService": "true",
+				"message":
+				{
+					"messageTimestamp":
+					{
+						"messageDate": "Not Reported",
+						"messageTime": "Not Reported"
+					},
+					"display":     "Blank",
+					"displayTime": "Not Reported",
+					"phase1":
+					{
+						"phase1Font":  "Not Reported",
+						"phase1Line1": "",
+						"phase1Line2": "",
+						"phase1Line3": ""
+					},
+					"phase2":
+					{
+						"phase2Font":  "Not Reported",
+						"phase2Line1": "",
+						"phase2Line2": "",
+						"phase2Line3": ""
+					}
+				}
+			}
+		},
+		{
+			"cms":
+			{
+				"index": "1200031",
+				"recordTimestamp":
+				{
+					"recordDate": "2019-03-06",
+					"recordTime": "18:19:07"
+				},
+				"location":
+				{
+					"district":       "12",
+					"locationName":   "17TH ST.",
+					"nearbyPlace":    "Santa Ana",
+					"longitude":      "-117.862165",
+					"latitude":       "33.759473",
+					"elevation":      "170",
+					"direction":      "South",
+					"county":         "Orange",
+					"route":          "I-5",
+					"routeSuffix":    "",
+					"postmilePrefix": "",
+					"postmile":       "32.44",
+					"alignment":      "",
+					"milepost":       "104.75"
+				},
+				"inService": "true",
+				"message":
+				{
+					"messageTimestamp":
+					{
+						"messageDate": "Not Reported",
+						"messageTime": "Not Reported"
+					},
+					"display":     "Blank",
+					"displayTime": "Not Reported",
+					"phase1":
+					{
+						"phase1Font":  "Not Reported",
+						"phase1Line1": "",
+						"phase1Line2": "",
+						"phase1Line3": ""
+					},
+					"phase2":
+					{
+						"phase2Font":  "Not Reported",
+						"phase2Line1": "",
+						"phase2Line2": "",
+						"phase2Line3": ""
+					}
+				}
+			}
+		},
+		{
+			"cms":
+			{
+				"index": "1200032",
+				"recordTimestamp":
+				{
+					"recordDate": "2019-03-06",
+					"recordTime": "18:19:07"
+				},
+				"location":
+				{
+					"district":       "12",
+					"locationName":   "ANAHEIM BLVD",
+					"nearbyPlace":    "Anaheim",
+					"longitude":      "-117.904051",
+					"latitude":       "33.804356",
+					"elevation":      "154",
+					"direction":      "South",
+					"county":         "Orange",
+					"route":          "I-5",
+					"routeSuffix":    "",
+					"postmilePrefix": "",
+					"postmile":       "36.46",
+					"alignment":      "",
+					"milepost":       "108.65"
+				},
+				"inService": "true",
+				"message":
+				{
+					"messageTimestamp":
+					{
+						"messageDate": "Not Reported",
+						"messageTime": "Not Reported"
+					},
+					"display":     "1 Page (Normal)",
+					"displayTime": "Not Reported",
+					"phase1":
+					{
+						"phase1Font":  "Not Reported",
+						"phase1Line1": "  MINUTES TO:   ",
+						"phase1Line2": "55 FREEWAY     8",
+						"phase1Line3": "133 FREEWAY   15"
+					},
+					"phase2":
+					{
+						"phase2Font":  "Not Reported",
+						"phase2Line1": "",
+						"phase2Line2": "",
+						"phase2Line3": ""
+					}
+				}
+			}
+		},
+		{
+			"cms":
+			{
+				"index": "1200033",
+				"recordTimestamp":
+				{
+					"recordDate": "2019-03-06",
+					"recordTime": "18:19:07"
+				},
+				"location":
+				{
+					"district":       "12",
+					"locationName":   "BROADWAY AVE.",
+					"nearbyPlace":    "Anaheim",
+					"longitude":      "-117.929983",
+					"latitude":       "33.829882",
+					"elevation":      "127",
+					"direction":      "South",
+					"county":         "Orange",
+					"route":          "I-5",
+					"routeSuffix":    "",
+					"postmilePrefix": "",
+					"postmile":       "38.7",
+					"alignment":      "",
+					"milepost":       "110.93"
+				},
+				"inService": "true",
+				"message":
+				{
+					"messageTimestamp":
+					{
+						"messageDate": "Not Reported",
+						"messageTime": "Not Reported"
+					},
+					"display":     "1 Page (Normal)",
+					"displayTime": "Not Reported",
+					"phase1":
+					{
+						"phase1Font":  "Not Reported",
+						"phase1Line1": "  MINUTES TO:   ",
+						"phase1Line2": "55 FREEWAY     9",
+						"phase1Line3": "133 FREEWAY   17"
+					},
+					"phase2":
+					{
+						"phase2Font":  "Not Reported",
+						"phase2Line1": "",
+						"phase2Line2": "",
+						"phase2Line3": ""
+					}
+				}
+			}
+		},
+		{
+			"cms":
+			{
+				"index": "1200034",
+				"recordTimestamp":
+				{
+					"recordDate": "2019-03-06",
+					"recordTime": "18:19:07"
+				},
+				"location":
+				{
+					"district":       "12",
+					"locationName":   "ARTESIA ST.",
+					"nearbyPlace":    "Buena Park",
+					"longitude":      "-118.006132",
+					"latitude":       "33.870302",
+					"elevation":      "78",
+					"direction":      "South",
+					"county":         "Orange",
+					"route":          "I-5",
+					"routeSuffix":    "",
+					"postmilePrefix": "",
+					"postmile":       "43.96",
+					"alignment":      "",
+					"milepost":       "116.23"
+				},
+				"inService": "true",
+				"message":
+				{
+					"messageTimestamp":
+					{
+						"messageDate": "Not Reported",
+						"messageTime": "Not Reported"
+					},
+					"display":     "Blank",
+					"displayTime": "Not Reported",
+					"phase1":
+					{
+						"phase1Font":  "Not Reported",
+						"phase1Line1": "",
+						"phase1Line2": "",
+						"phase1Line3": ""
+					},
+					"phase2":
+					{
+						"phase2Font":  "Not Reported",
+						"phase2Line1": "",
+						"phase2Line2": "",
+						"phase2Line3": ""
+					}
+				}
+			}
+		},
+		{
+			"cms":
+			{
+				"index": "1200035",
+				"recordTimestamp":
+				{
+					"recordDate": "2019-03-06",
+					"recordTime": "18:19:07"
+				},
+				"location":
+				{
+					"district":       "12",
+					"locationName":   "HARBOR ST.",
+					"nearbyPlace":    "Garden Grove",
+					"longitude":      "-117.913378",
+					"latitude":       "33.76994",
+					"elevation":      "108",
+					"direction":      "East",
+					"county":         "Orange",
+					"route":          "SR-22",
+					"routeSuffix":    "",
+					"postmilePrefix": "R",
+					"postmile":       "8.27",
+					"alignment":      "",
+					"milepost":       "9.74"
+				},
+				"inService": "true",
+				"message":
+				{
+					"messageTimestamp":
+					{
+						"messageDate": "Not Reported",
+						"messageTime": "Not Reported"
+					},
+					"display":     "Blank",
+					"displayTime": "Not Reported",
+					"phase1":
+					{
+						"phase1Font":  "Not Reported",
+						"phase1Line1": "",
+						"phase1Line2": "",
+						"phase1Line3": ""
+					},
+					"phase2":
+					{
+						"phase2Font":  "Not Reported",
+						"phase2Line1": "",
+						"phase2Line2": "",
+						"phase2Line3": ""
+					}
+				}
+			}
+		},
+		{
+			"cms":
+			{
+				"index": "1200036",
+				"recordTimestamp":
+				{
+					"recordDate": "2019-03-06",
+					"recordTime": "18:19:07"
+				},
+				"location":
+				{
+					"district":       "12",
+					"locationName":   "CAMBRIDGE ST.",
+					"nearbyPlace":    "Orange",
+					"longitude":      "-117.843417",
+					"latitude":       "33.776622",
+					"elevation":      "206",
+					"direction":      "West",
+					"county":         "Orange",
+					"route":          "SR-22",
+					"routeSuffix":    "",
+					"postmilePrefix": "R",
+					"postmile":       "12.42",
+					"alignment":      "",
+					"milepost":       "13.98"
+				},
+				"inService": "true",
+				"message":
+				{
+					"messageTimestamp":
+					{
+						"messageDate": "Not Reported",
+						"messageTime": "Not Reported"
+					},
+					"display":     "Blank",
+					"displayTime": "Not Reported",
+					"phase1":
+					{
+						"phase1Font":  "Not Reported",
+						"phase1Line1": "",
+						"phase1Line2": "",
+						"phase1Line3": ""
+					},
+					"phase2":
+					{
+						"phase2Font":  "Not Reported",
+						"phase2Line1": "",
+						"phase2Line2": "",
+						"phase2Line3": ""
+					}
+				}
+			}
+		},
+		{
+			"cms":
+			{
+				"index": "1200037",
+				"recordTimestamp":
+				{
+					"recordDate": "2019-03-06",
+					"recordTime": "18:19:07"
+				},
+				"location":
+				{
+					"district":       "12",
+					"locationName":   "DYER ROAD",
+					"nearbyPlace":    "Santa Ana",
+					"longitude":      "-117.847695",
+					"latitude":       "33.712247",
+					"elevation":      "68",
+					"direction":      "North",
+					"county":         "Orange",
+					"route":          "SR-55",
+					"routeSuffix":    "",
+					"postmilePrefix": "R",
+					"postmile":       "8.21",
+					"alignment":      "",
+					"milepost":       "8.22"
+				},
+				"inService": "true",
+				"message":
+				{
+					"messageTimestamp":
+					{
+						"messageDate": "Not Reported",
+						"messageTime": "Not Reported"
+					},
+					"display":     "Blank",
+					"displayTime": "Not Reported",
+					"phase1":
+					{
+						"phase1Font":  "Not Reported",
+						"phase1Line1": "",
+						"phase1Line2": "",
+						"phase1Line3": ""
+					},
+					"phase2":
+					{
+						"phase2Font":  "Not Reported",
+						"phase2Line1": "",
+						"phase2Line2": "",
+						"phase2Line3": ""
+					}
+				}
+			}
+		},
+		{
+			"cms":
+			{
+				"index": "1200038",
+				"recordTimestamp":
+				{
+					"recordDate": "2019-03-06",
+					"recordTime": "18:19:07"
+				},
+				"location":
+				{
+					"district":       "12",
+					"locationName":   "MEATS AVE",
+					"nearbyPlace":    "Orange",
+					"longitude":      "-117.831691",
+					"latitude":       "33.822628",
+					"elevation":      "275",
+					"direction":      "North",
+					"county":         "Orange",
+					"route":          "SR-55",
+					"routeSuffix":    "",
+					"postmilePrefix": "",
+					"postmile":       "16.12",
+					"alignment":      "",
+					"milepost":       "16.07"
+				},
+				"inService": "true",
+				"message":
+				{
+					"messageTimestamp":
+					{
+						"messageDate": "Not Reported",
+						"messageTime": "Not Reported"
+					},
+					"display":     "Blank",
+					"displayTime": "Not Reported",
+					"phase1":
+					{
+						"phase1Font":  "Not Reported",
+						"phase1Line1": "",
+						"phase1Line2": "",
+						"phase1Line3": ""
+					},
+					"phase2":
+					{
+						"phase2Font":  "Not Reported",
+						"phase2Line1": "",
+						"phase2Line2": "",
+						"phase2Line3": ""
+					}
+				}
+			}
+		},
+		{
+			"cms":
+			{
+				"index": "1200039",
+				"recordTimestamp":
+				{
+					"recordDate": "2019-03-06",
+					"recordTime": "18:19:07"
+				},
+				"location":
+				{
+					"district":       "12",
+					"locationName":   "PAULARINO",
+					"nearbyPlace":    "Costa Mesa",
+					"longitude":      "-117.875754",
+					"latitude":       "33.683906",
+					"elevation":      "45",
+					"direction":      "South",
+					"county":         "Orange",
+					"route":          "SR-55",
+					"routeSuffix":    "",
+					"postmilePrefix": "R",
+					"postmile":       "5.68",
+					"alignment":      "",
+					"milepost":       "5.68"
+				},
+				"inService": "true",
+				"message":
+				{
+					"messageTimestamp":
+					{
+						"messageDate": "Not Reported",
+						"messageTime": "Not Reported"
+					},
+					"display":     "Blank",
+					"displayTime": "Not Reported",
+					"phase1":
+					{
+						"phase1Font":  "Not Reported",
+						"phase1Line1": "",
+						"phase1Line2": "",
+						"phase1Line3": ""
+					},
+					"phase2":
+					{
+						"phase2Font":  "Not Reported",
+						"phase2Line1": "",
+						"phase2Line2": "",
+						"phase2Line3": ""
+					}
+				}
+			}
+		},
+		{
+			"cms":
+			{
+				"index": "1200040",
+				"recordTimestamp":
+				{
+					"recordDate": "2019-03-06",
+					"recordTime": "18:19:07"
+				},
+				"location":
+				{
+					"district":       "12",
+					"locationName":   "WARNER AVE",
+					"nearbyPlace":    "Tustin",
+					"longitude":      "-117.843494",
+					"latitude":       "33.717264",
+					"elevation":      "85",
+					"direction":      "South",
+					"county":         "Orange",
+					"route":          "SR-55",
+					"routeSuffix":    "",
+					"postmilePrefix": "R",
+					"postmile":       "8.64",
+					"alignment":      "",
+					"milepost":       "8.64"
+				},
+				"inService": "true",
+				"message":
+				{
+					"messageTimestamp":
+					{
+						"messageDate": "Not Reported",
+						"messageTime": "Not Reported"
+					},
+					"display":     "1 Page (Normal)",
+					"displayTime": "Not Reported",
+					"phase1":
+					{
+						"phase1Font":  "Not Reported",
+						"phase1Line1": " I-405 TO CLOSE ",
+						"phase1Line2": "",
+						"phase1Line3": ""
+					},
+					"phase2":
+					{
+						"phase2Font":  "Not Reported",
+						"phase2Line1": "",
+						"phase2Line2": "",
+						"phase2Line3": ""
+					}
+				}
+			}
+		},
+		{
+			"cms":
+			{
+				"index": "1200041",
+				"recordTimestamp":
+				{
+					"recordDate": "2019-03-06",
+					"recordTime": "18:19:07"
+				},
+				"location":
+				{
+					"district":       "12",
+					"locationName":   "SANTA CLARA AVE.",
+					"nearbyPlace":    "Tustin",
+					"longitude":      "-117.831216",
+					"latitude":       "33.767232",
+					"elevation":      "203",
+					"direction":      "South",
+					"county":         "Orange",
+					"route":          "SR-55",
+					"routeSuffix":    "",
+					"postmilePrefix": "",
+					"postmile":       "12.3",
+					"alignment":      "",
+					"milepost":       "12.27"
+				},
+				"inService": "true",
+				"message":
+				{
+					"messageTimestamp":
+					{
+						"messageDate": "Not Reported",
+						"messageTime": "Not Reported"
+					},
+					"display":     "Blank",
+					"displayTime": "Not Reported",
+					"phase1":
+					{
+						"phase1Font":  "Not Reported",
+						"phase1Line1": "",
+						"phase1Line2": "",
+						"phase1Line3": ""
+					},
+					"phase2":
+					{
+						"phase2Font":  "Not Reported",
+						"phase2Line1": "",
+						"phase2Line2": "",
+						"phase2Line3": ""
+					}
+				}
+			}
+		},
+		{
+			"cms":
+			{
+				"index": "1200042",
+				"recordTimestamp":
+				{
+					"recordDate": "2019-03-06",
+					"recordTime": "18:19:07"
+				},
+				"location":
+				{
+					"district":       "12",
+					"locationName":   "KATELLA",
+					"nearbyPlace":    "Orange",
+					"longitude":      "-117.832172",
+					"latitude":       "33.808725",
+					"elevation":      "269",
+					"direction":      "South",
+					"county":         "Orange",
+					"route":          "SR-55",
+					"routeSuffix":    "",
+					"postmilePrefix": "",
+					"postmile":       "15.16",
+					"alignment":      "",
+					"milepost":       "15.12"
+				},
+				"inService": "true",
+				"message":
+				{
+					"messageTimestamp":
+					{
+						"messageDate": "Not Reported",
+						"messageTime": "Not Reported"
+					},
+					"display":     "Blank",
+					"displayTime": "Not Reported",
+					"phase1":
+					{
+						"phase1Font":  "Not Reported",
+						"phase1Line1": "",
+						"phase1Line2": "",
+						"phase1Line3": ""
+					},
+					"phase2":
+					{
+						"phase2Font":  "Not Reported",
+						"phase2Line1": "",
+						"phase2Line2": "",
+						"phase2Line3": ""
+					}
+				}
+			}
+		},
+		{
+			"cms":
+			{
+				"index": "1200043",
+				"recordTimestamp":
+				{
+					"recordDate": "2019-03-06",
+					"recordTime": "18:19:07"
+				},
+				"location":
+				{
+					"district":       "12",
+					"locationName":   "CHAPMAN AVE",
+					"nearbyPlace":    "Orange",
+					"longitude":      "-117.879574",
+					"latitude":       "33.786456",
+					"elevation":      "154",
+					"direction":      "North",
+					"county":         "Orange",
+					"route":          "SR-57",
+					"routeSuffix":    "",
+					"postmilePrefix": "",
+					"postmile":       "11.18",
+					"alignment":      "",
+					"milepost":       "0.46"
+				},
+				"inService": "true",
+				"message":
+				{
+					"messageTimestamp":
+					{
+						"messageDate": "Not Reported",
+						"messageTime": "Not Reported"
+					},
+					"display":     "1 Page (Normal)",
+					"displayTime": "Not Reported",
+					"phase1":
+					{
+						"phase1Font":  "Not Reported",
+						"phase1Line1": "HONDA CENTER",
+						"phase1Line2": "EXIT",
+						"phase1Line3": "KATELLA AVE"
+					},
+					"phase2":
+					{
+						"phase2Font":  "Not Reported",
+						"phase2Line1": "",
+						"phase2Line2": "",
+						"phase2Line3": ""
+					}
+				}
+			}
+		},
+		{
+			"cms":
+			{
+				"index": "1200044",
+				"recordTimestamp":
+				{
+					"recordDate": "2019-03-06",
+					"recordTime": "18:19:07"
+				},
+				"location":
+				{
+					"district":       "12",
+					"locationName":   "WAGNER AVE.",
+					"nearbyPlace":    "Anaheim",
+					"longitude":      "-117.875932",
+					"latitude":       "33.825274",
+					"elevation":      "200",
+					"direction":      "North",
+					"county":         "Orange",
+					"route":          "SR-57",
+					"routeSuffix":    "",
+					"postmilePrefix": "",
+					"postmile":       "13.91",
+					"alignment":      "",
+					"milepost":       "3.18"
+				},
+				"inService": "true",
+				"message":
+				{
+					"messageTimestamp":
+					{
+						"messageDate": "Not Reported",
+						"messageTime": "Not Reported"
+					},
+					"display":     "Blank",
+					"displayTime": "Not Reported",
+					"phase1":
+					{
+						"phase1Font":  "Not Reported",
+						"phase1Line1": "",
+						"phase1Line2": "",
+						"phase1Line3": ""
+					},
+					"phase2":
+					{
+						"phase2Font":  "Not Reported",
+						"phase2Line1": "",
+						"phase2Line2": "",
+						"phase2Line3": ""
+					}
+				}
+			}
+		},
+		{
+			"cms":
+			{
+				"index": "1200045",
+				"recordTimestamp":
+				{
+					"recordDate": "2019-03-06",
+					"recordTime": "18:19:07"
+				},
+				"location":
+				{
+					"district":       "12",
+					"locationName":   "WAGNER AVE.",
+					"nearbyPlace":    "Anaheim",
+					"longitude":      "-117.876328",
+					"latitude":       "33.825497",
+					"elevation":      "196",
+					"direction":      "South",
+					"county":         "Orange",
+					"route":          "SR-57",
+					"routeSuffix":    "",
+					"postmilePrefix": "",
+					"postmile":       "13.92",
+					"alignment":      "",
+					"milepost":       "3.19"
+				},
+				"inService": "true",
+				"message":
+				{
+					"messageTimestamp":
+					{
+						"messageDate": "Not Reported",
+						"messageTime": "Not Reported"
+					},
+					"display":     "1 Page (Normal)",
+					"displayTime": "Not Reported",
+					"phase1":
+					{
+						"phase1Font":  "Not Reported",
+						"phase1Line1": "HONDA CENTER",
+						"phase1Line2": "EXIT",
+						"phase1Line3": "BALL ROAD"
+					},
+					"phase2":
+					{
+						"phase2Font":  "Not Reported",
+						"phase2Line1": "",
+						"phase2Line2": "",
+						"phase2Line3": ""
+					}
+				}
+			}
+		},
+		{
+			"cms":
+			{
+				"index": "1200046",
+				"recordTimestamp":
+				{
+					"recordDate": "2019-03-06",
+					"recordTime": "18:19:07"
+				},
+				"location":
+				{
+					"district":       "12",
+					"locationName":   "YORBA LINDA BLVD",
+					"nearbyPlace":    "Fullerton",
+					"longitude":      "-117.880875",
+					"latitude":       "33.889973",
+					"elevation":      "285",
+					"direction":      "South",
+					"county":         "Orange",
+					"route":          "SR-57",
+					"routeSuffix":    "",
+					"postmilePrefix": "",
+					"postmile":       "18.41",
+					"alignment":      "",
+					"milepost":       "7.67"
+				},
+				"inService": "true",
+				"message":
+				{
+					"messageTimestamp":
+					{
+						"messageDate": "Not Reported",
+						"messageTime": "Not Reported"
+					},
+					"display":     "Blank",
+					"displayTime": "Not Reported",
+					"phase1":
+					{
+						"phase1Font":  "Not Reported",
+						"phase1Line1": "",
+						"phase1Line2": "",
+						"phase1Line3": ""
+					},
+					"phase2":
+					{
+						"phase2Font":  "Not Reported",
+						"phase2Line1": "",
+						"phase2Line2": "",
+						"phase2Line3": ""
+					}
+				}
+			}
+		},
+		{
+			"cms":
+			{
+				"index": "1200047",
+				"recordTimestamp":
+				{
+					"recordDate": "2019-03-06",
+					"recordTime": "18:19:07"
+				},
+				"location":
+				{
+					"district":       "12",
+					"locationName":   "HOLDER",
+					"nearbyPlace":    "Buena Park",
+					"longitude":      "-118.018053",
+					"latitude":       "33.855681",
+					"elevation":      "78",
+					"direction":      "East",
+					"county":         "Orange",
+					"route":          "SR-91",
+					"routeSuffix":    "",
+					"postmilePrefix": "R",
+					"postmile":       "1.46",
+					"alignment":      "",
+					"milepost":       "16.18"
+				},
+				"inService": "true",
+				"message":
+				{
+					"messageTimestamp":
+					{
+						"messageDate": "Not Reported",
+						"messageTime": "Not Reported"
+					},
+					"display":     "1 Page (Normal)",
+					"displayTime": "Not Reported",
+					"phase1":
+					{
+						"phase1Font":  "Not Reported",
+						"phase1Line1": "  MINUTES TO:   ",
+						"phase1Line2": "55 FREEWAY    14",
+						"phase1Line3": ""
+					},
+					"phase2":
+					{
+						"phase2Font":  "Not Reported",
+						"phase2Line1": "",
+						"phase2Line2": "",
+						"phase2Line3": ""
+					}
+				}
+			}
+		},
+		{
+			"cms":
+			{
+				"index": "1200048",
+				"recordTimestamp":
+				{
+					"recordDate": "2019-03-06",
+					"recordTime": "18:19:07"
+				},
+				"location":
+				{
+					"district":       "12",
+					"locationName":   "ACACIA",
+					"nearbyPlace":    "Anaheim",
+					"longitude":      "-117.900723",
+					"latitude":       "33.853692",
+					"elevation":      "180",
+					"direction":      "East",
+					"county":         "Orange",
+					"route":          "SR-91",
+					"routeSuffix":    "",
+					"postmilePrefix": "",
+					"postmile":       "4.6",
+					"alignment":      "",
+					"milepost":       "22.98"
+				},
+				"inService": "true",
+				"message":
+				{
+					"messageTimestamp":
+					{
+						"messageDate": "Not Reported",
+						"messageTime": "Not Reported"
+					},
+					"display":     "Blank",
+					"displayTime": "Not Reported",
+					"phase1":
+					{
+						"phase1Font":  "Not Reported",
+						"phase1Line1": "",
+						"phase1Line2": "",
+						"phase1Line3": ""
+					},
+					"phase2":
+					{
+						"phase2Font":  "Not Reported",
+						"phase2Line1": "",
+						"phase2Line2": "",
+						"phase2Line3": ""
+					}
+				}
+			}
+		},
+		{
+			"cms":
+			{
+				"index": "1200049",
+				"recordTimestamp":
+				{
+					"recordDate": "2019-03-06",
+					"recordTime": "18:19:07"
+				},
+				"location":
+				{
+					"district":       "12",
+					"locationName":   "EUCLID",
+					"nearbyPlace":    "Fullerton",
+					"longitude":      "-117.944242",
+					"latitude":       "33.854316",
+					"elevation":      "141",
+					"direction":      "West",
+					"county":         "Orange",
+					"route":          "SR-91",
+					"routeSuffix":    "",
+					"postmilePrefix": "",
+					"postmile":       "2.09",
+					"alignment":      "",
+					"milepost":       "20.46"
+				},
+				"inService": "true",
+				"message":
+				{
+					"messageTimestamp":
+					{
+						"messageDate": "Not Reported",
+						"messageTime": "Not Reported"
+					},
+					"display":     "Blank",
+					"displayTime": "Not Reported",
+					"phase1":
+					{
+						"phase1Font":  "Not Reported",
+						"phase1Line1": "",
+						"phase1Line2": "",
+						"phase1Line3": ""
+					},
+					"phase2":
+					{
+						"phase2Font":  "Not Reported",
+						"phase2Line1": "",
+						"phase2Line2": "",
+						"phase2Line3": ""
+					}
+				}
+			}
+		},
+		{
+			"cms":
+			{
+				"index": "1200050",
+				"recordTimestamp":
+				{
+					"recordDate": "2019-03-06",
+					"recordTime": "18:19:07"
+				},
+				"location":
+				{
+					"district":       "12",
+					"locationName":   "LAKEVIEW",
+					"nearbyPlace":    "Anaheim",
+					"longitude":      "-117.813397",
+					"latitude":       "33.852168",
+					"elevation":      "282",
+					"direction":      "West",
+					"county":         "Orange",
+					"route":          "SR-91",
+					"routeSuffix":    "",
+					"postmilePrefix": "R",
+					"postmile":       "10.19",
+					"alignment":      "",
+					"milepost":       "28.56"
+				},
+				"inService": "true",
+				"message":
+				{
+					"messageTimestamp":
+					{
+						"messageDate": "Not Reported",
+						"messageTime": "Not Reported"
+					},
+					"display":     "1 Page (Normal)",
+					"displayTime": "Not Reported",
+					"phase1":
+					{
+						"phase1Font":  "Not Reported",
+						"phase1Line1": "  MINUTES TO:   ",
+						"phase1Line2": "ORANGETHORPE  14",
+						"phase1Line3": ""
+					},
+					"phase2":
+					{
+						"phase2Font":  "Not Reported",
+						"phase2Line1": "",
+						"phase2Line2": "",
+						"phase2Line3": ""
+					}
+				}
+			}
+		},
+		{
+			"cms":
+			{
+				"index": "1200051",
+				"recordTimestamp":
+				{
+					"recordDate": "2019-03-06",
+					"recordTime": "18:19:07"
+				},
+				"location":
+				{
+					"district":       "12",
+					"locationName":   "WIER CANYON",
+					"nearbyPlace":    "Anaheim",
+					"longitude":      "-117.689271",
+					"latitude":       "33.873408",
+					"elevation":      "465",
+					"direction":      "West",
+					"county":         "Orange",
+					"route":          "SR-91",
+					"routeSuffix":    "",
+					"postmilePrefix": "R",
+					"postmile":       "17.82",
+					"alignment":      "L",
+					"milepost":       "36.19"
+				},
+				"inService": "true",
+				"message":
+				{
+					"messageTimestamp":
+					{
+						"messageDate": "Not Reported",
+						"messageTime": "Not Reported"
+					},
+					"display":     "Not Reported",
+					"displayTime": "Not Reported",
+					"phase1":
+					{
+						"phase1Font":  "Not Reported",
+						"phase1Line1": "Not Reported",
+						"phase1Line2": "Not Reported",
+						"phase1Line3": "Not Reported"
+					},
+					"phase2":
+					{
+						"phase2Font":  "Not Reported",
+						"phase2Line1": "Not Reported",
+						"phase2Line2": "Not Reported",
+						"phase2Line3": "Not Reported"
+					}
+				}
+			}
+		},
+		{
+			"cms":
+			{
+				"index": "1200052",
+				"recordTimestamp":
+				{
+					"recordDate": "2019-03-06",
+					"recordTime": "18:19:07"
+				},
+				"location":
+				{
+					"district":       "12",
+					"locationName":   "HARVARD",
+					"nearbyPlace":    "Irvine",
+					"longitude":      "-117.831322",
+					"latitude":       "33.672632",
+					"elevation":      "62",
+					"direction":      "North",
+					"county":         "Orange",
+					"route":          "I-405",
+					"routeSuffix":    "",
+					"postmilePrefix": "",
+					"postmile":       "6.15",
+					"alignment":      "",
+					"milepost":       "5.93"
+				},
+				"inService": "true",
+				"message":
+				{
+					"messageTimestamp":
+					{
+						"messageDate": "Not Reported",
+						"messageTime": "Not Reported"
+					},
+					"display":     "1 Page (Normal)",
+					"displayTime": "Not Reported",
+					"phase1":
+					{
+						"phase1Font":  "Not Reported",
+						"phase1Line1": "I-405 TO CLOSE",
+						"phase1Line2": "AT FAIRVIEW",
+						"phase1Line3": "SAT  11PM-9AM"
+					},
+					"phase2":
+					{
+						"phase2Font":  "Not Reported",
+						"phase2Line1": "",
+						"phase2Line2": "",
+						"phase2Line3": ""
+					}
+				}
+			}
+		},
+		{
+			"cms":
+			{
+				"index": "1200053",
+				"recordTimestamp":
+				{
+					"recordDate": "2019-03-06",
+					"recordTime": "18:19:07"
+				},
+				"location":
+				{
+					"district":       "12",
+					"locationName":   "MAGNOLIA ST",
+					"nearbyPlace":    "Fountain Valley",
+					"longitude":      "-117.971297",
+					"latitude":       "33.719788",
+					"elevation":      "42",
+					"direction":      "North",
+					"county":         "Orange",
+					"route":          "I-405",
+					"routeSuffix":    "",
+					"postmilePrefix": "",
+					"postmile":       "15.18",
+					"alignment":      "",
+					"milepost":       "14.93"
+				},
+				"inService": "true",
+				"message":
+				{
+					"messageTimestamp":
+					{
+						"messageDate": "Not Reported",
+						"messageTime": "Not Reported"
+					},
+					"display":     "1 Page (Normal)",
+					"displayTime": "Not Reported",
+					"phase1":
+					{
+						"phase1Font":  "Not Reported",
+						"phase1Line1": "I-405 TO CLOSE",
+						"phase1Line2": "AT FAIRVIEW",
+						"phase1Line3": "SAT  11PM-9AM"
+					},
+					"phase2":
+					{
+						"phase2Font":  "Not Reported",
+						"phase2Line1": "",
+						"phase2Line2": "",
+						"phase2Line3": ""
+					}
+				}
+			}
+		},
+		{
+			"cms":
+			{
+				"index": "1200055",
+				"recordTimestamp":
+				{
+					"recordDate": "2019-03-06",
+					"recordTime": "18:19:07"
+				},
+				"location":
+				{
+					"district":       "12",
+					"locationName":   "JEFFREY",
+					"nearbyPlace":    "Irvine",
+					"longitude":      "-117.796762",
+					"latitude":       "33.663333",
+					"elevation":      "121",
+					"direction":      "South",
+					"county":         "Orange",
+					"route":          "I-405",
+					"routeSuffix":    "",
+					"postmilePrefix": "",
+					"postmile":       "4.06",
+					"alignment":      "",
+					"milepost":       "3.81"
+				},
+				"inService": "true",
+				"message":
+				{
+					"messageTimestamp":
+					{
+						"messageDate": "Not Reported",
+						"messageTime": "Not Reported"
+					},
+					"display":     "1 Page (Normal)",
+					"displayTime": "Not Reported",
+					"phase1":
+					{
+						"phase1Font":  "Not Reported",
+						"phase1Line1": "I-405 TO CLOSE",
+						"phase1Line2": "AT FAIRVIEW",
+						"phase1Line3": "SAT  11PM-9AM"
+					},
+					"phase2":
+					{
+						"phase2Font":  "Not Reported",
+						"phase2Line1": "",
+						"phase2Line2": "",
+						"phase2Line3": ""
+					}
+				}
+			}
+		},
+		{
+			"cms":
+			{
+				"index": "1200056",
+				"recordTimestamp":
+				{
+					"recordDate": "2019-03-06",
+					"recordTime": "18:19:07"
+				},
+				"location":
+				{
+					"district":       "12",
+					"locationName":   "NEW HAMPSHIRE",
+					"nearbyPlace":    "Costa Mesa",
+					"longitude":      "-117.928345",
+					"latitude":       "33.692524",
+					"elevation":      "39",
+					"direction":      "South",
+					"county":         "Orange",
+					"route":          "I-405",
+					"routeSuffix":    "",
+					"postmilePrefix": "",
+					"postmile":       "12.04",
+					"alignment":      "",
+					"milepost":       "11.79"
+				},
+				"inService": "true",
+				"message":
+				{
+					"messageTimestamp":
+					{
+						"messageDate": "Not Reported",
+						"messageTime": "Not Reported"
+					},
+					"display":     "1 Page (Normal)",
+					"displayTime": "Not Reported",
+					"phase1":
+					{
+						"phase1Font":  "Not Reported",
+						"phase1Line1": "I-405 TO CLOSE",
+						"phase1Line2": "AT FAIRVIEW",
+						"phase1Line3": "SAT  11PM-9AM"
+					},
+					"phase2":
+					{
+						"phase2Font":  "Not Reported",
+						"phase2Line1": "",
+						"phase2Line2": "",
+						"phase2Line3": ""
+					}
+				}
+			}
+		},
+		{
+			"cms":
+			{
+				"index": "1200057",
+				"recordTimestamp":
+				{
+					"recordDate": "2019-03-06",
+					"recordTime": "18:19:07"
+				},
+				"location":
+				{
+					"district":       "12",
+					"locationName":   "SEAL BEACH",
+					"nearbyPlace":    "Seal Beach",
+					"longitude":      "-118.060253",
+					"latitude":       "33.774024",
+					"elevation":      "29",
+					"direction":      "South",
+					"county":         "Orange",
+					"route":          "I-405",
+					"routeSuffix":    "",
+					"postmilePrefix": "",
+					"postmile":       "21.8",
+					"alignment":      "",
+					"milepost":       "21.55"
+				},
+				"inService": "true",
+				"message":
+				{
+					"messageTimestamp":
+					{
+						"messageDate": "Not Reported",
+						"messageTime": "Not Reported"
+					},
+					"display":     "Blank",
+					"displayTime": "Not Reported",
+					"phase1":
+					{
+						"phase1Font":  "Not Reported",
+						"phase1Line1": "",
+						"phase1Line2": "",
+						"phase1Line3": ""
+					},
+					"phase2":
+					{
+						"phase2Font":  "Not Reported",
+						"phase2Line1": "",
+						"phase2Line2": "",
+						"phase2Line3": ""
+					}
+				}
+			}
+		},
+		{
+			"cms":
+			{
+				"index": "1200058",
+				"recordTimestamp":
+				{
+					"recordDate": "2019-03-06",
+					"recordTime": "18:19:07"
+				},
+				"location":
+				{
+					"district":       "12",
+					"locationName":   "WARDLOW",
+					"nearbyPlace":    "Long Beach",
+					"longitude":      "-118.081678",
+					"latitude":       "33.817992",
+					"elevation":      "42",
+					"direction":      "South",
+					"county":         "Los Angeles",
+					"route":          "I-605",
+					"routeSuffix":    "",
+					"postmilePrefix": "R",
+					"postmile":       "0.81",
+					"alignment":      "",
+					"milepost":       "2.86"
+				},
+				"inService": "true",
+				"message":
+				{
+					"messageTimestamp":
+					{
+						"messageDate": "Not Reported",
+						"messageTime": "Not Reported"
+					},
+					"display":     "1 Page (Normal)",
+					"displayTime": "Not Reported",
+					"phase1":
+					{
+						"phase1Font":  "Not Reported",
+						"phase1Line1": " I-405 TO CLOSE ",
+						"phase1Line2": "  AT FAIRVIEW   ",
+						"phase1Line3": " SAT  11PM-9AM  "
+					},
+					"phase2":
+					{
+						"phase2Font":  "Not Reported",
+						"phase2Line1": "",
+						"phase2Line2": "",
+						"phase2Line3": ""
+					}
+				}
+			}
+		},
+		{
+			"cms":
+			{
+				"index": "1208488",
+				"recordTimestamp":
+				{
+					"recordDate": "2019-03-06",
+					"recordTime": "18:19:07"
+				},
+				"location":
+				{
+					"district":       "12",
+					"locationName":   "YORBA LINDA",
+					"nearbyPlace":    "Fullerton",
+					"longitude":      "-117.880268",
+					"latitude":       "33.887518",
+					"elevation":      "278",
+					"direction":      "North",
+					"county":         "Orange",
+					"route":          "SR-57",
+					"routeSuffix":    "",
+					"postmilePrefix": "",
+					"postmile":       "18.24",
+					"alignment":      "",
+					"milepost":       "7.5"
+				},
+				"inService": "true",
+				"message":
+				{
+					"messageTimestamp":
+					{
+						"messageDate": "Not Reported",
+						"messageTime": "Not Reported"
+					},
+					"display":     "Blank",
+					"displayTime": "Not Reported",
+					"phase1":
+					{
+						"phase1Font":  "Not Reported",
+						"phase1Line1": "",
+						"phase1Line2": "",
+						"phase1Line3": ""
+					},
+					"phase2":
+					{
+						"phase2Font":  "Not Reported",
+						"phase2Line1": "",
+						"phase2Line2": "",
+						"phase2Line3": ""
+					}
+				}
+			}
+		},
+		{
+			"cms":
+			{
+				"index": "1211184",
+				"recordTimestamp":
+				{
+					"recordDate": "2019-03-06",
+					"recordTime": "18:19:07"
+				},
+				"location":
+				{
+					"district":       "12",
+					"locationName":   "IRVINE CENTER DRIVE",
+					"nearbyPlace":    "Irvine",
+					"longitude":      "-117.745482",
+					"latitude":       "33.647931",
+					"elevation":      "236",
+					"direction":      "North",
+					"county":         "Orange",
+					"route":          "I-405",
+					"routeSuffix":    "",
+					"postmilePrefix": "",
+					"postmile":       "0.87",
+					"alignment":      "",
+					"milepost":       "0.62"
+				},
+				"inService": "true",
+				"message":
+				{
+					"messageTimestamp":
+					{
+						"messageDate": "Not Reported",
+						"messageTime": "Not Reported"
+					},
+					"display":     "1 Page (Normal)",
+					"displayTime": "Not Reported",
+					"phase1":
+					{
+						"phase1Font":  "Not Reported",
+						"phase1Line1": "I-405 TO CLOSE",
+						"phase1Line2": "AT FAIRVIEW",
+						"phase1Line3": "SAT  11PM-9AM"
+					},
+					"phase2":
+					{
+						"phase2Font":  "Not Reported",
+						"phase2Line1": "",
+						"phase2Line2": "",
+						"phase2Line3": ""
+					}
+				}
+			}
+		},
+		{
+			"cms":
+			{
+				"index": "1211185",
+				"recordTimestamp":
+				{
+					"recordDate": "2019-03-06",
+					"recordTime": "18:19:07"
+				},
+				"location":
+				{
+					"district":       "12",
+					"locationName":   "VON KARMAN",
+					"nearbyPlace":    "Irvine",
+					"longitude":      "-117.851222",
+					"latitude":       "33.679969",
+					"elevation":      "62",
+					"direction":      "South",
+					"county":         "Orange",
+					"route":          "I-405",
+					"routeSuffix":    "",
+					"postmilePrefix": "",
+					"postmile":       "7.41",
+					"alignment":      "",
+					"milepost":       "7.19"
+				},
+				"inService": "true",
+				"message":
+				{
+					"messageTimestamp":
+					{
+						"messageDate": "Not Reported",
+						"messageTime": "Not Reported"
+					},
+					"display":     "1 Page (Normal)",
+					"displayTime": "Not Reported",
+					"phase1":
+					{
+						"phase1Font":  "Not Reported",
+						"phase1Line1": "I-405 TO CLOSE",
+						"phase1Line2": "AT FAIRVIEW",
+						"phase1Line3": "SAT  11PM-9AM"
+					},
+					"phase2":
+					{
+						"phase2Font":  "Not Reported",
+						"phase2Line1": "",
+						"phase2Line2": "",
+						"phase2Line3": ""
+					}
+				}
+			}
+		},
+		{
+			"cms":
+			{
+				"index": "1211967",
+				"recordTimestamp":
+				{
+					"recordDate": "2019-03-06",
+					"recordTime": "18:19:07"
+				},
+				"location":
+				{
+					"district":       "12",
+					"locationName":   "MAGNOLIA AT 22",
+					"nearbyPlace":    "Garden Grove",
+					"longitude":      "-117.969424",
+					"latitude":       "33.766029",
+					"elevation":      "68",
+					"direction":      "West",
+					"county":         "Orange",
+					"route":          "SR-22",
+					"routeSuffix":    "",
+					"postmilePrefix": "R",
+					"postmile":       "5",
+					"alignment":      "",
+					"milepost":       "6.43"
+				},
+				"inService": "true",
+				"message":
+				{
+					"messageTimestamp":
+					{
+						"messageDate": "Not Reported",
+						"messageTime": "Not Reported"
+					},
+					"display":     "1 Page (Normal)",
+					"displayTime": "Not Reported",
+					"phase1":
+					{
+						"phase1Font":  "Not Reported",
+						"phase1Line1": "I-405 TO CLOSE",
+						"phase1Line2": "AT FAIRVIEW",
+						"phase1Line3": "SAT  11PM-9AM"
+					},
+					"phase2":
+					{
+						"phase2Font":  "Not Reported",
+						"phase2Line1": "",
+						"phase2Line2": "",
+						"phase2Line3": ""
+					}
+				}
+			}
+		},
+		{
+			"cms":
+			{
+				"index": "1211978",
+				"recordTimestamp":
+				{
+					"recordDate": "2019-03-06",
+					"recordTime": "18:19:07"
+				},
+				"location":
+				{
+					"district":       "12",
+					"locationName":   "17th ST",
+					"nearbyPlace":    "Tustin",
+					"longitude":      "-117.830808",
+					"latitude":       "33.758616",
+					"elevation":      "160",
+					"direction":      "North",
+					"county":         "Orange",
+					"route":          "SR-55",
+					"routeSuffix":    "",
+					"postmilePrefix": "",
+					"postmile":       "11.71",
+					"alignment":      "",
+					"milepost":       "11.69"
+				},
+				"inService": "true",
+				"message":
+				{
+					"messageTimestamp":
+					{
+						"messageDate": "Not Reported",
+						"messageTime": "Not Reported"
+					},
+					"display":     "Blank",
+					"displayTime": "Not Reported",
+					"phase1":
+					{
+						"phase1Font":  "Not Reported",
+						"phase1Line1": "",
+						"phase1Line2": "",
+						"phase1Line3": ""
+					},
+					"phase2":
+					{
+						"phase2Font":  "Not Reported",
+						"phase2Line1": "",
+						"phase2Line2": "",
+						"phase2Line3": ""
+					}
+				}
+			}
+		},
+		{
+			"cms":
+			{
+				"index": "1212138",
+				"recordTimestamp":
+				{
+					"recordDate": "2019-03-06",
+					"recordTime": "18:19:07"
+				},
+				"location":
+				{
+					"district":       "12",
+					"locationName":   "Ortega Hwy",
+					"nearbyPlace":    "San Juan Capistrano",
+					"longitude":      "-117.661704",
+					"latitude":       "33.510279",
+					"elevation":      "216",
+					"direction":      "South",
+					"county":         "Orange",
+					"route":          "I-5",
+					"routeSuffix":    "",
+					"postmilePrefix": "",
+					"postmile":       "10.17",
+					"alignment":      "",
+					"milepost":       "82.43"
+				},
+				"inService": "true",
+				"message":
+				{
+					"messageTimestamp":
+					{
+						"messageDate": "Not Reported",
+						"messageTime": "Not Reported"
+					},
+					"display":     "Blank",
+					"displayTime": "Not Reported",
+					"phase1":
+					{
+						"phase1Font":  "Not Reported",
+						"phase1Line1": "",
+						"phase1Line2": "",
+						"phase1Line3": ""
+					},
+					"phase2":
+					{
+						"phase2Font":  "Not Reported",
+						"phase2Line1": "",
+						"phase2Line2": "",
+						"phase2Line3": ""
+					}
+				}
+			}
+		},
+		{
+			"cms":
+			{
+				"index": "1212822",
+				"recordTimestamp":
+				{
+					"recordDate": "2019-03-06",
+					"recordTime": "18:19:07"
+				},
+				"location":
+				{
+					"district":       "12",
+					"locationName":   "Kraemer",
+					"nearbyPlace":    "Anaheim",
+					"longitude":      "-117.859224",
+					"latitude":       "33.846746",
+					"elevation":      "226",
+					"direction":      "East",
+					"county":         "Orange",
+					"route":          "SR-91",
+					"routeSuffix":    "",
+					"postmilePrefix": "",
+					"postmile":       "7.12",
+					"alignment":      "",
+					"milepost":       "25.5"
+				},
+				"inService": "true",
+				"message":
+				{
+					"messageTimestamp":
+					{
+						"messageDate": "Not Reported",
+						"messageTime": "Not Reported"
+					},
+					"display":     "Blank",
+					"displayTime": "Not Reported",
+					"phase1":
+					{
+						"phase1Font":  "Not Reported",
+						"phase1Line1": "",
+						"phase1Line2": "",
+						"phase1Line3": ""
+					},
+					"phase2":
+					{
+						"phase2Font":  "Not Reported",
+						"phase2Line1": "",
+						"phase2Line2": "",
+						"phase2Line3": ""
+					}
+				}
+			}
+		},
+		{
+			"cms":
+			{
+				"index": "1212823",
+				"recordTimestamp":
+				{
+					"recordDate": "2019-03-06",
+					"recordTime": "18:19:07"
+				},
+				"location":
+				{
+					"district":       "12",
+					"locationName":   "E of Imperial",
+					"nearbyPlace":    "Anaheim",
+					"longitude":      "-117.767451",
+					"latitude":       "33.864767",
+					"elevation":      "314",
+					"direction":      "East",
+					"county":         "Orange",
+					"route":          "SR-91",
+					"routeSuffix":    "",
+					"postmilePrefix": "R",
+					"postmile":       "13.05",
+					"alignment":      "",
+					"milepost":       "31.4"
+				},
+				"inService": "true",
+				"message":
+				{
+					"messageTimestamp":
+					{
+						"messageDate": "Not Reported",
+						"messageTime": "Not Reported"
+					},
+					"display":     "Blank",
+					"displayTime": "Not Reported",
+					"phase1":
+					{
+						"phase1Font":  "Not Reported",
+						"phase1Line1": "",
+						"phase1Line2": "",
+						"phase1Line3": ""
+					},
+					"phase2":
+					{
+						"phase2Font":  "Not Reported",
+						"phase2Line1": "",
+						"phase2Line2": "",
+						"phase2Line3": ""
+					}
+				}
+			}
+		},
+		{
+			"cms":
+			{
+				"index": "1214503",
+				"recordTimestamp":
+				{
+					"recordDate": "2019-03-06",
+					"recordTime": "18:19:07"
+				},
+				"location":
+				{
+					"district":       "12",
+					"locationName":   "Vista Hermosa",
+					"nearbyPlace":    "San Clemente",
+					"longitude":      "-117.639346",
+					"latitude":       "33.449613",
+					"elevation":      "190",
+					"direction":      "South",
+					"county":         "Orange",
+					"route":          "I-5",
+					"routeSuffix":    "",
+					"postmilePrefix": "",
+					"postmile":       "4.64",
+					"alignment":      "",
+					"milepost":       "76.88"
+				},
+				"inService": "true",
+				"message":
+				{
+					"messageTimestamp":
+					{
+						"messageDate": "Not Reported",
+						"messageTime": "Not Reported"
+					},
+					"display":     "Blank",
+					"displayTime": "Not Reported",
+					"phase1":
+					{
+						"phase1Font":  "Not Reported",
+						"phase1Line1": "",
+						"phase1Line2": "",
+						"phase1Line3": ""
+					},
+					"phase2":
+					{
+						"phase2Font":  "Not Reported",
+						"phase2Line1": "",
+						"phase2Line2": "",
+						"phase2Line3": ""
+					}
+				}
+			}
+		},
+		{
+			"cms":
+			{
+				"index": "1214504",
+				"recordTimestamp":
+				{
+					"recordDate": "2019-03-06",
+					"recordTime": "18:19:07"
+				},
+				"location":
+				{
+					"district":       "12",
+					"locationName":   "Avery Pkwy",
+					"nearbyPlace":    "Mission Viejo",
+					"longitude":      "-117.672768",
+					"latitude":       "33.546096",
+					"elevation":      "252",
+					"direction":      "North",
+					"county":         "Orange",
+					"route":          "I-5",
+					"routeSuffix":    "",
+					"postmilePrefix": "",
+					"postmile":       "12.86",
+					"alignment":      "",
+					"milepost":       "85.12"
+				},
+				"inService": "true",
+				"message":
+				{
+					"messageTimestamp":
+					{
+						"messageDate": "Not Reported",
+						"messageTime": "Not Reported"
+					},
+					"display":     "Blank",
+					"displayTime": "Not Reported",
+					"phase1":
+					{
+						"phase1Font":  "Not Reported",
+						"phase1Line1": "",
+						"phase1Line2": "",
+						"phase1Line3": ""
+					},
+					"phase2":
+					{
+						"phase2Font":  "Not Reported",
+						"phase2Line1": "",
+						"phase2Line2": "",
+						"phase2Line3": ""
+					}
+				}
+			}
+		},
+		{
+			"cms":
+			{
+				"index": "1214505",
+				"recordTimestamp":
+				{
+					"recordDate": "2019-03-06",
+					"recordTime": "18:19:07"
+				},
+				"location":
+				{
+					"district":       "12",
+					"locationName":   "Crown Valley Pkwy",
+					"nearbyPlace":    "Mission Viejo",
+					"longitude":      "-117.67218",
+					"latitude":       "33.570674",
+					"elevation":      "288",
+					"direction":      "South",
+					"county":         "Orange",
+					"route":          "I-5",
+					"routeSuffix":    "",
+					"postmilePrefix": "",
+					"postmile":       "14.57",
+					"alignment":      "",
+					"milepost":       "86.82"
+				},
+				"inService": "true",
+				"message":
+				{
+					"messageTimestamp":
+					{
+						"messageDate": "Not Reported",
+						"messageTime": "Not Reported"
+					},
+					"display":     "Blank",
+					"displayTime": "Not Reported",
+					"phase1":
+					{
+						"phase1Font":  "Not Reported",
+						"phase1Line1": "",
+						"phase1Line2": "",
+						"phase1Line3": ""
+					},
+					"phase2":
+					{
+						"phase2Font":  "Not Reported",
+						"phase2Line1": "",
+						"phase2Line2": "",
+						"phase2Line3": ""
+					}
+				}
+			}
+		},
+		{
+			"cms":
+			{
+				"index": "1214506",
+				"recordTimestamp":
+				{
+					"recordDate": "2019-03-06",
+					"recordTime": "18:19:07"
+				},
+				"location":
+				{
+					"district":       "12",
+					"locationName":   "405 fwy",
+					"nearbyPlace":    "Irvine",
+					"longitude":      "-117.733182",
+					"latitude":       "33.642772",
+					"elevation":      "252",
+					"direction":      "North",
+					"county":         "Orange",
+					"route":          "I-5",
+					"routeSuffix":    "",
+					"postmilePrefix": "",
+					"postmile":       "21.14",
+					"alignment":      "",
+					"milepost":       "93.4"
+				},
+				"inService": "true",
+				"message":
+				{
+					"messageTimestamp":
+					{
+						"messageDate": "Not Reported",
+						"messageTime": "Not Reported"
+					},
+					"display":     "Blank",
+					"displayTime": "Not Reported",
+					"phase1":
+					{
+						"phase1Font":  "Not Reported",
+						"phase1Line1": "",
+						"phase1Line2": "",
+						"phase1Line3": ""
+					},
+					"phase2":
+					{
+						"phase2Font":  "Not Reported",
+						"phase2Line1": "",
+						"phase2Line2": "",
+						"phase2Line3": ""
+					}
+				}
+			}
+		},
+		{
+			"cms":
+			{
+				"index": "1214507",
+				"recordTimestamp":
+				{
+					"recordDate": "2019-03-06",
+					"recordTime": "18:19:07"
+				},
+				"location":
+				{
+					"district":       "12",
+					"locationName":   "Yale OC",
+					"nearbyPlace":    "Irvine",
+					"longitude":      "-117.775036",
+					"latitude":       "33.700544",
+					"elevation":      "150",
+					"direction":      "North",
+					"county":         "Orange",
+					"route":          "I-5",
+					"routeSuffix":    "",
+					"postmilePrefix": "R",
+					"postmile":       "25.82",
+					"alignment":      "",
+					"milepost":       "98.06"
+				},
+				"inService": "true",
+				"message":
+				{
+					"messageTimestamp":
+					{
+						"messageDate": "Not Reported",
+						"messageTime": "Not Reported"
+					},
+					"display":     "Blank",
+					"displayTime": "Not Reported",
+					"phase1":
+					{
+						"phase1Font":  "Not Reported",
+						"phase1Line1": "",
+						"phase1Line2": "",
+						"phase1Line3": ""
+					},
+					"phase2":
+					{
+						"phase2Font":  "Not Reported",
+						"phase2Line1": "",
+						"phase2Line2": "",
+						"phase2Line3": ""
+					}
+				}
+			}
+		},
+		{
+			"cms":
+			{
+				"index": "1214508",
+				"recordTimestamp":
+				{
+					"recordDate": "2019-03-06",
+					"recordTime": "18:19:07"
+				},
+				"location":
+				{
+					"district":       "12",
+					"locationName":   "Tustin Ranch OC",
+					"nearbyPlace":    "Tustin",
+					"longitude":      "-117.805112",
+					"latitude":       "33.725985",
+					"elevation":      "91",
+					"direction":      "South",
+					"county":         "Orange",
+					"route":          "I-5",
+					"routeSuffix":    "",
+					"postmilePrefix": "R",
+					"postmile":       "28.32",
+					"alignment":      "",
+					"milepost":       "100.57"
+				},
+				"inService": "true",
+				"message":
+				{
+					"messageTimestamp":
+					{
+						"messageDate": "Not Reported",
+						"messageTime": "Not Reported"
+					},
+					"display":     "Blank",
+					"displayTime": "Not Reported",
+					"phase1":
+					{
+						"phase1Font":  "Not Reported",
+						"phase1Line1": "",
+						"phase1Line2": "",
+						"phase1Line3": ""
+					},
+					"phase2":
+					{
+						"phase2Font":  "Not Reported",
+						"phase2Line1": "",
+						"phase2Line2": "",
+						"phase2Line3": ""
+					}
+				}
+			}
+		},
+		{
+			"cms":
+			{
+				"index": "1214509",
+				"recordTimestamp":
+				{
+					"recordDate": "2019-03-06",
+					"recordTime": "18:19:07"
+				},
+				"location":
+				{
+					"district":       "12",
+					"locationName":   "Santa Isabella",
+					"nearbyPlace":    "Costa Mesa",
+					"longitude":      "-117.903163",
+					"latitude":       "33.657101",
+					"elevation":      "72",
+					"direction":      "North",
+					"county":         "Orange",
+					"route":          "SR-55",
+					"routeSuffix":    "",
+					"postmilePrefix": "R",
+					"postmile":       "3.25",
+					"alignment":      "",
+					"milepost":       "3.25"
+				},
+				"inService": "true",
+				"message":
+				{
+					"messageTimestamp":
+					{
+						"messageDate": "Not Reported",
+						"messageTime": "Not Reported"
+					},
+					"display":     "1 Page (Normal)",
+					"displayTime": "Not Reported",
+					"phase1":
+					{
+						"phase1Font":  "Not Reported",
+						"phase1Line1": "I-405 TO CLOSE",
+						"phase1Line2": "AT FAIRVIEW",
+						"phase1Line3": "SAT  11PM-9AM"
+					},
+					"phase2":
+					{
+						"phase2Font":  "Not Reported",
+						"phase2Line1": "",
+						"phase2Line2": "",
+						"phase2Line3": ""
+					}
+				}
+			}
+		},
+		{
+			"cms":
+			{
+				"index": "1214510",
+				"recordTimestamp":
+				{
+					"recordDate": "2019-03-06",
+					"recordTime": "18:19:07"
+				},
+				"location":
+				{
+					"district":       "12",
+					"locationName":   "Baker Street",
+					"nearbyPlace":    "Costa Mesa",
+					"longitude":      "-117.878706",
+					"latitude":       "33.680209",
+					"elevation":      "55",
+					"direction":      "North",
+					"county":         "Orange",
+					"route":          "SR-55",
+					"routeSuffix":    "",
+					"postmilePrefix": "R",
+					"postmile":       "5.38",
+					"alignment":      "",
+					"milepost":       "5.38"
+				},
+				"inService": "true",
+				"message":
+				{
+					"messageTimestamp":
+					{
+						"messageDate": "Not Reported",
+						"messageTime": "Not Reported"
+					},
+					"display":     "1 Page (Normal)",
+					"displayTime": "Not Reported",
+					"phase1":
+					{
+						"phase1Font":  "Not Reported",
+						"phase1Line1": "I-405 TO CLOSE",
+						"phase1Line2": "AT FAIRVIEW",
+						"phase1Line3": "SAT  11PM-9AM"
+					},
+					"phase2":
+					{
+						"phase2Font":  "Not Reported",
+						"phase2Line1": "",
+						"phase2Line2": "",
+						"phase2Line3": ""
+					}
+				}
+			}
+		},
+		{
+			"cms":
+			{
+				"index": "1214511",
+				"recordTimestamp":
+				{
+					"recordDate": "2019-03-06",
+					"recordTime": "18:19:07"
+				},
+				"location":
+				{
+					"district":       "12",
+					"locationName":   "Orangewood Ave",
+					"nearbyPlace":    "Orange",
+					"longitude":      "-117.877915",
+					"latitude":       "33.796586",
+					"elevation":      "154",
+					"direction":      "South",
+					"county":         "Orange",
+					"route":          "SR-57",
+					"routeSuffix":    "",
+					"postmilePrefix": "",
+					"postmile":       "11.86",
+					"alignment":      "",
+					"milepost":       "1.14"
+				},
+				"inService": "true",
+				"message":
+				{
+					"messageTimestamp":
+					{
+						"messageDate": "Not Reported",
+						"messageTime": "Not Reported"
+					},
+					"display":     "Blank",
+					"displayTime": "Not Reported",
+					"phase1":
+					{
+						"phase1Font":  "Not Reported",
+						"phase1Line1": "",
+						"phase1Line2": "",
+						"phase1Line3": ""
+					},
+					"phase2":
+					{
+						"phase2Font":  "Not Reported",
+						"phase2Line1": "",
+						"phase2Line2": "",
+						"phase2Line3": ""
+					}
+				}
+			}
+		},
+		{
+			"cms":
+			{
+				"index": "1214512",
+				"recordTimestamp":
+				{
+					"recordDate": "2019-03-06",
+					"recordTime": "18:19:07"
+				},
+				"location":
+				{
+					"district":       "12",
+					"locationName":   "Placentia OH",
+					"nearbyPlace":    "Placentia",
+					"longitude":      "-117.879528",
+					"latitude":       "33.86806",
+					"elevation":      "223",
+					"direction":      "South",
+					"county":         "Orange",
+					"route":          "SR-57",
+					"routeSuffix":    "",
+					"postmilePrefix": "",
+					"postmile":       "16.88",
+					"alignment":      "",
+					"milepost":       "6.16"
+				},
+				"inService": "true",
+				"message":
+				{
+					"messageTimestamp":
+					{
+						"messageDate": "Not Reported",
+						"messageTime": "Not Reported"
+					},
+					"display":     "Blank",
+					"displayTime": "Not Reported",
+					"phase1":
+					{
+						"phase1Font":  "Not Reported",
+						"phase1Line1": "",
+						"phase1Line2": "",
+						"phase1Line3": ""
+					},
+					"phase2":
+					{
+						"phase2Font":  "Not Reported",
+						"phase2Line1": "",
+						"phase2Line2": "",
+						"phase2Line3": ""
+					}
+				}
+			}
+		},
+		{
+			"cms":
+			{
+				"index": "1214513",
+				"recordTimestamp":
+				{
+					"recordDate": "2019-03-06",
+					"recordTime": "18:19:07"
+				},
+				"location":
+				{
+					"district":       "12",
+					"locationName":   "Lambert Rd",
+					"nearbyPlace":    "Brea",
+					"longitude":      "-117.878697",
+					"latitude":       "33.935067",
+					"elevation":      "570",
+					"direction":      "South",
+					"county":         "Orange",
+					"route":          "SR-57",
+					"routeSuffix":    "",
+					"postmilePrefix": "",
+					"postmile":       "21.52",
+					"alignment":      "",
+					"milepost":       "10.79"
+				},
+				"inService": "true",
+				"message":
+				{
+					"messageTimestamp":
+					{
+						"messageDate": "Not Reported",
+						"messageTime": "Not Reported"
+					},
+					"display":     "Blank",
+					"displayTime": "Not Reported",
+					"phase1":
+					{
+						"phase1Font":  "Not Reported",
+						"phase1Line1": "",
+						"phase1Line2": "",
+						"phase1Line3": ""
+					},
+					"phase2":
+					{
+						"phase2Font":  "Not Reported",
+						"phase2Line1": "",
+						"phase2Line2": "",
+						"phase2Line3": ""
+					}
+				}
+			}
+		},
+		{
+			"cms":
+			{
+				"index": "1214514",
+				"recordTimestamp":
+				{
+					"recordDate": "2019-03-06",
+					"recordTime": "18:19:07"
+				},
+				"location":
+				{
+					"district":       "12",
+					"locationName":   "Edwards",
+					"nearbyPlace":    "Westminster",
+					"longitude":      "-118.01674",
+					"latitude":       "33.754335",
+					"elevation":      "39",
+					"direction":      "South",
+					"county":         "Orange",
+					"route":          "I-405",
+					"routeSuffix":    "",
+					"postmilePrefix": "",
+					"postmile":       "18.72",
+					"alignment":      "",
+					"milepost":       "18.48"
+				},
+				"inService": "true",
+				"message":
+				{
+					"messageTimestamp":
+					{
+						"messageDate": "Not Reported",
+						"messageTime": "Not Reported"
+					},
+					"display":     "1 Page (Normal)",
+					"displayTime": "Not Reported",
+					"phase1":
+					{
+						"phase1Font":  "Not Reported",
+						"phase1Line1": "I-405 TO CLOSE",
+						"phase1Line2": "AT FAIRVIEW",
+						"phase1Line3": "SAT  11PM-9AM"
+					},
+					"phase2":
+					{
+						"phase2Font":  "Not Reported",
+						"phase2Line1": "",
+						"phase2Line2": "",
+						"phase2Line3": ""
+					}
+				}
+			}
+		},
+		{
+			"cms":
+			{
+				"index": "1214956",
+				"recordTimestamp":
+				{
+					"recordDate": "2019-03-06",
+					"recordTime": "18:19:07"
+				},
+				"location":
+				{
+					"district":       "12",
+					"locationName":   "Cambridge Street",
+					"nearbyPlace":    "Santa Ana",
+					"longitude":      "-117.845635",
+					"latitude":       "33.775533",
+					"elevation":      "190",
+					"direction":      "East",
+					"county":         "Orange",
+					"route":          "SR-22",
+					"routeSuffix":    "",
+					"postmilePrefix": "R",
+					"postmile":       "12.28",
+					"alignment":      "",
+					"milepost":       "13.85"
+				},
+				"inService": "true",
+				"message":
+				{
+					"messageTimestamp":
+					{
+						"messageDate": "Not Reported",
+						"messageTime": "Not Reported"
+					},
+					"display":     "Blank",
+					"displayTime": "Not Reported",
+					"phase1":
+					{
+						"phase1Font":  "Not Reported",
+						"phase1Line1": "",
+						"phase1Line2": "",
+						"phase1Line3": ""
+					},
+					"phase2":
+					{
+						"phase2Font":  "Not Reported",
+						"phase2Line1": "",
+						"phase2Line2": "",
+						"phase2Line3": ""
+					}
+				}
+			}
+		},
+		{
+			"cms":
+			{
+				"index": "1217542",
+				"recordTimestamp":
+				{
+					"recordDate": "2019-03-06",
+					"recordTime": "18:19:07"
+				},
+				"location":
+				{
+					"district":       "12",
+					"locationName":   "Test CMS",
+					"nearbyPlace":    "Orange",
+					"longitude":      "-117.76848",
+					"latitude":       "33.69002",
+					"elevation":      "150",
+					"direction":      "South",
+					"county":         "Orange",
+					"route":          "I-5",
+					"routeSuffix":    "",
+					"postmilePrefix": "R",
+					"postmile":       "25",
+					"alignment":      "",
+					"milepost":       ""
+				},
+				"inService": "false",
+				"message":
+				{
+					"messageTimestamp":
+					{
+						"messageDate": "Not Reported",
+						"messageTime": "Not Reported"
+					},
+					"display":     "Blank",
+					"displayTime": "Not Reported",
+					"phase1":
+					{
+						"phase1Font":  "Not Reported",
+						"phase1Line1": "",
+						"phase1Line2": "",
+						"phase1Line3": ""
+					},
+					"phase2":
+					{
+						"phase2Font":  "Not Reported",
+						"phase2Line1": "",
+						"phase2Line2": "",
+						"phase2Line3": ""
+					}
+				}
+			}
+		},
+		{
+			"cms":
+			{
+				"index": "1218442",
+				"recordTimestamp":
+				{
+					"recordDate": "2019-03-06",
+					"recordTime": "18:19:07"
+				},
+				"location":
+				{
+					"district":       "12",
+					"locationName":   "Antonio",
+					"nearbyPlace":    "San Juan Capistrano",
+					"longitude":      "-117.624421",
+					"latitude":       "33.519067",
+					"elevation":      "170",
+					"direction":      "East",
+					"county":         "Orange",
+					"route":          "SR-74",
+					"routeSuffix":    "",
+					"postmilePrefix": "R",
+					"postmile":       "2.31",
+					"alignment":      "",
+					"milepost":       "2.31"
+				},
+				"inService": "true",
+				"message":
+				{
+					"messageTimestamp":
+					{
+						"messageDate": "Not Reported",
+						"messageTime": "Not Reported"
+					},
+					"display":     "Blank",
+					"displayTime": "Not Reported",
+					"phase1":
+					{
+						"phase1Font":  "Not Reported",
+						"phase1Line1": "",
+						"phase1Line2": "",
+						"phase1Line3": ""
+					},
+					"phase2":
+					{
+						"phase2Font":  "Not Reported",
+						"phase2Line1": "",
+						"phase2Line2": "",
+						"phase2Line3": ""
+					}
+				}
+			}
+		},
+		{
+			"cms":
+			{
+				"index": "1218482",
+				"recordTimestamp":
+				{
+					"recordDate": "2019-03-06",
+					"recordTime": "18:19:07"
+				},
+				"location":
+				{
+					"district":       "12",
+					"locationName":   "County Line",
+					"nearbyPlace":    "San Clemente",
+					"longitude":      "-117.59611",
+					"latitude":       "33.401633",
+					"elevation":      "127",
+					"direction":      "North",
+					"county":         "Orange",
+					"route":          "I-5",
+					"routeSuffix":    "",
+					"postmilePrefix": "",
+					"postmile":       "0.38",
+					"alignment":      "",
+					"milepost":       "72.64"
+				},
+				"inService": "true",
+				"message":
+				{
+					"messageTimestamp":
+					{
+						"messageDate": "Not Reported",
+						"messageTime": "Not Reported"
+					},
+					"display":     "Blank",
+					"displayTime": "Not Reported",
+					"phase1":
+					{
+						"phase1Font":  "Not Reported",
+						"phase1Line1": "",
+						"phase1Line2": "",
+						"phase1Line3": ""
+					},
+					"phase2":
+					{
+						"phase2Font":  "Not Reported",
+						"phase2Line1": "",
+						"phase2Line2": "",
+						"phase2Line3": ""
+					}
+				}
+			}
+		},
+		{
+			"cms":
+			{
+				"index": "1218483",
+				"recordTimestamp":
+				{
+					"recordDate": "2019-03-06",
+					"recordTime": "18:19:07"
+				},
+				"location":
+				{
+					"district":       "12",
+					"locationName":   "Springdale",
+					"nearbyPlace":    "Westminster",
+					"longitude":      "-118.023301",
+					"latitude":       "33.774078",
+					"elevation":      "49",
+					"direction":      "East",
+					"county":         "Orange",
+					"route":          "SR-22",
+					"routeSuffix":    "",
+					"postmilePrefix": "R",
+					"postmile":       "1.77",
+					"alignment":      "",
+					"milepost":       "3.23"
+				},
+				"inService": "true",
+				"message":
+				{
+					"messageTimestamp":
+					{
+						"messageDate": "Not Reported",
+						"messageTime": "Not Reported"
+					},
+					"display":     "Blank",
+					"displayTime": "Not Reported",
+					"phase1":
+					{
+						"phase1Font":  "Not Reported",
+						"phase1Line1": "",
+						"phase1Line2": "",
+						"phase1Line3": ""
+					},
+					"phase2":
+					{
+						"phase2Font":  "Not Reported",
+						"phase2Line1": "",
+						"phase2Line2": "",
+						"phase2Line3": ""
+					}
+				}
+			}
+		},
+		{
+			"cms":
+			{
+				"index": "1218484",
+				"recordTimestamp":
+				{
+					"recordDate": "2019-03-06",
+					"recordTime": "18:19:07"
+				},
+				"location":
+				{
+					"district":       "12",
+					"locationName":   "Laguna_Hills",
+					"nearbyPlace":    "Aliso Viejo",
+					"longitude":      "-117.725774",
+					"latitude":       "33.584286",
+					"elevation":      "452",
+					"direction":      "North",
+					"county":         "Orange",
+					"route":          "SR-73",
+					"routeSuffix":    "",
+					"postmilePrefix": "",
+					"postmile":       "14.77",
+					"alignment":      "",
+					"milepost":       "4.77"
+				},
+				"inService": "true",
+				"message":
+				{
+					"messageTimestamp":
+					{
+						"messageDate": "Not Reported",
+						"messageTime": "Not Reported"
+					},
+					"display":     "Blank",
+					"displayTime": "Not Reported",
+					"phase1":
+					{
+						"phase1Font":  "Not Reported",
+						"phase1Line1": "",
+						"phase1Line2": "",
+						"phase1Line3": ""
+					},
+					"phase2":
+					{
+						"phase2Font":  "Not Reported",
+						"phase2Line1": "",
+						"phase2Line2": "",
+						"phase2Line3": ""
+					}
+				}
+			}
+		},
+		{
+			"cms":
+			{
+				"index": "1218485",
+				"recordTimestamp":
+				{
+					"recordDate": "2019-03-06",
+					"recordTime": "18:19:07"
+				},
+				"location":
+				{
+					"district":       "12",
+					"locationName":   "North of Jamboree",
+					"nearbyPlace":    "Newport Beach",
+					"longitude":      "-117.866717",
+					"latitude":       "33.657071",
+					"elevation":      "59",
+					"direction":      "North",
+					"county":         "Orange",
+					"route":          "SR-73",
+					"routeSuffix":    "",
+					"postmilePrefix": "",
+					"postmile":       "24.91",
+					"alignment":      "",
+					"milepost":       "14.91"
+				},
+				"inService": "true",
+				"message":
+				{
+					"messageTimestamp":
+					{
+						"messageDate": "Not Reported",
+						"messageTime": "Not Reported"
+					},
+					"display":     "1 Page (Normal)",
+					"displayTime": "Not Reported",
+					"phase1":
+					{
+						"phase1Font":  "Not Reported",
+						"phase1Line1": "I-405 TO CLOSE",
+						"phase1Line2": "AT FAIRVIEW",
+						"phase1Line3": "SAT  11PM-9AM"
+					},
+					"phase2":
+					{
+						"phase2Font":  "Not Reported",
+						"phase2Line1": "",
+						"phase2Line2": "",
+						"phase2Line3": ""
+					}
+				}
+			}
+		},
+		{
+			"cms":
+			{
+				"index": "1218486",
+				"recordTimestamp":
+				{
+					"recordDate": "2019-03-06",
+					"recordTime": "18:19:07"
+				},
+				"location":
+				{
+					"district":       "12",
+					"locationName":   "South of Wildlife",
+					"nearbyPlace":    "Newport Coast",
+					"longitude":      "-117.818984",
+					"latitude":       "33.61494",
+					"elevation":      "718",
+					"direction":      "South",
+					"county":         "Orange",
+					"route":          "SR-73",
+					"routeSuffix":    "",
+					"postmilePrefix": "",
+					"postmile":       "20.75",
+					"alignment":      "",
+					"milepost":       "10.75"
+				},
+				"inService": "true",
+				"message":
+				{
+					"messageTimestamp":
+					{
+						"messageDate": "Not Reported",
+						"messageTime": "Not Reported"
+					},
+					"display":     "Blank",
+					"displayTime": "Not Reported",
+					"phase1":
+					{
+						"phase1Font":  "Not Reported",
+						"phase1Line1": "",
+						"phase1Line2": "",
+						"phase1Line3": ""
+					},
+					"phase2":
+					{
+						"phase2Font":  "Not Reported",
+						"phase2Line1": "",
+						"phase2Line2": "",
+						"phase2Line3": ""
+					}
+				}
+			}
+		}
+	]
+}
Index: trunk/src/cptms/data_layers/csvToJson.awk
===================================================================
--- trunk/src/cptms/data_layers/csvToJson.awk	(revision 318)
+++ trunk/src/cptms/data_layers/csvToJson.awk	(revision 318)
@@ -0,0 +1,13 @@
+# Convert a csv with postmile and coordinates to a json file
+# Note it switches lat/long to long/lat
+# Sample invocation:  awk -F',' -f awkpgm1 filename
+//{printf "  {\n  \"type\": \"Feature\",\n  \"id\": \"%s\",\n    \"geometry\":\n      {\n      \"type\": \"Point\",\n      \"coordinates\": [%s,%s]\n      },\n      \"properties\": {\"street\":\"%s\", \"color\":\"%s\", \"perpx\":\"%s\", \"perpy\":\"%s\"}\n  },\n", $1, $3,$2,$4,$7,$5,$6 }
+#
+# When finished prepend:
+#{
+#  "type": "FeatureCollection",
+#  "features": [
+# 
+# and Append:
+#  ] }
+
Index: trunk/src/cptms/data_layers/prep_cctv.py
===================================================================
--- trunk/src/cptms/data_layers/prep_cctv.py	(revision 318)
+++ trunk/src/cptms/data_layers/prep_cctv.py	(revision 318)
@@ -0,0 +1,79 @@
+import collections,math,sys
+# Scan the cctv file to find the nearest vds
+# This is a one-time job to create the static file of cctv locations and nearest vds
+# The output of this program needs to be manually modified before input to cptms_map.html
+# 1. The vds column is appended to cctvFile (yes, adding a new column to the original input).
+# 2. Convert this csv file to json (using cctvToJson.awk)
+# 3. Remove tabs from json.  Trim any blanks from nearVDS field. 
+# jdalbey Mar 2019
+vdsFile = "vds_fromhighwaysmap.csv"
+cctvFile = "cctv_locations_D12.csv"
+orientationLookup = {'N':0,'S':1,'E':0,'W':1}
+
+def loadHighways():
+
+    f = open(vdsFile,'r')
+    lines = [line.split(',') for line in f.readlines()]
+    # 5,N,0.65,4 S. LUIS REY
+    # Create a set containing just the route numbers 
+    routeNums = set()
+    for item in lines:
+        routeNums.add(int(item[0]))
+    # put the route numbers in order
+    sortedRoutes = sorted (routeNums)    
+    # Create the empty postmile collections
+    for route in sortedRoutes:
+        #print route,
+        highways[str(route)]=[collections.OrderedDict(),collections.OrderedDict()]
+    #print
+    # Process all the data, placing it in proper route and collection
+    for item in lines:
+        route = item[0]
+        orientation = orientationLookup[item[1]]
+        postmileItem = item[2]
+        highways[route][orientation][postmileItem]=item
+
+
+def dumpHighways():
+    # Dump the highways data we've organized
+    for item in highways:
+        for cnt in [0,1]:
+            list1 = highways[item][cnt]
+            print "highway",item,list1
+            # show fields for one entry
+            for pm_entry in list1:
+                print pm_entry,list1[pm_entry]
+
+def findNearest():
+
+    f = open(cctvFile,'r')
+    #5,S,42.11,-117.978854,33.856288,SB 5 N/O MAGNOLIA AVE (S/O 91),12-005-CCTV-0001
+    lines = [line.split(',') for line in f.readlines()]
+
+    # Find he nearest VDS to each cctv
+    for item in lines:
+        route = item[0]
+        orientation = orientationLookup[item[1]]
+        postmileItem = item[2]
+        segment = highways[route][orientation] 
+
+        # Now we know which highway segment the cctv is on, look at all those VDS to find nearest
+        print route,item[1],postmileItem+",",
+        min = 9999
+        nearVDS = 0
+        for vds in segment:
+            diff = abs(float(vds) - float(postmileItem))
+            #print vds + "("+str(diff)+")",
+            if (diff < min):
+                min = diff
+                nearVDS = vds
+        print route,item[1],nearVDS
+
+# ------------------------------------------------------------------------------------------
+
+highways = collections.OrderedDict()    
+loadHighways()
+dumpHighways()
+print "CCTV\tnearestVDS"
+findNearest()
+
Index: trunk/src/cptms/data_layers/showDupPostmiles.py
===================================================================
--- trunk/src/cptms/data_layers/showDupPostmiles.py	(revision 318)
+++ trunk/src/cptms/data_layers/showDupPostmiles.py	(revision 318)
@@ -0,0 +1,67 @@
+import fileinput
+# Some postmiles files have duplicate entries,
+# same postmile but slightly different street names.
+# This program presents the duplicates to the user to 
+# select which one to keep and discards the others.
+# Only works when duplicates are in successive rows of the file, which is
+# how it should be if it's sorted by postmile.  But sometimes
+# there's weird data where two SLIGHTLY different postmiles have
+# the same latlong, and you'll have to deal with these by hand.
+
+# Read from file name provided on command line
+# Expected input format: route, direction, lat, long, name
+# Assumes commas are separators and don't appear in name.
+prevName = ""
+prevCoords = ""
+prevstreet = ""
+prevFields = ["","","","","",""]
+matching = False
+streets = []
+outputFile = "uniqFile"
+outFile = open(outputFile,"w") # put results here
+# Examine each input line
+for line in fileinput.input():
+    lineIn = line.rstrip()   #to trim whitespace and newline
+    fields = lineIn.split(",")
+    current = fields[3]+","+fields[4]  # match the latLong pair
+    # Does this item match the previous one?
+    if (current == prevCoords): 
+        if not matching:
+            # indicate we are in matching mode (for 1 or more items)
+            matching = True
+            print fields[0] + "\t" + prevstreet
+        print "\t\t" + fields[5]
+        streets.append(fields[5])
+    else:
+        if matching: # if we were matching, turn it off
+            matching = False
+            # Ask user to select one of the matching items
+            choice = raw_input("choose one of "+str(len(streets)) + ": ")
+            if (len(choice)==0):
+                choice = "1"
+            print "         OK, you selected: ",streets[int(choice)-1]
+            print 
+            print "-----------"
+#            outFile.write(prevName + "," +prevCoords + "," + streets[int(choice)-1])
+            outFile.write(prevFields[0]+ "," + prevFields[1]+ "," + prevFields[2]+ "," + prevFields[3]+ "," + prevFields[4]+ "," + streets[int(choice)-1])
+            outFile.write("\n")
+        else:
+            # output the previous unmatched item (unless were at the first line)
+            if prevFields[0] != "":
+#            outFile.write(prevName + "," + prevCoords + "," + prevstreet + "\n")
+                outFile.write(prevFields[0]+ "," + prevFields[1]+ "," + prevFields[2]+ "," + prevFields[3]+ "," + prevFields[4]+ "," + prevFields[5])
+                outFile.write("\n")
+        # reset the saved street names
+        streets = []
+        streets.append(fields[5])
+    # save current for next iteration
+    prevName = fields[0]
+    prevCoords = current
+    prevstreet = fields[5]
+    prevFields = fields
+# output last entry
+outFile.write(prevFields[0]+ "," + prevFields[1]+ "," + prevFields[2]+ "," + prevFields[3]+ "," + prevFields[4]+ "," + prevFields[5])
+outFile.write("\n")
+outFile.close()
+
+print "All Done, output in ", outputFile
Index: trunk/src/cptms/data_layers/cmsToGeoJson.awk
===================================================================
--- trunk/src/cptms/data_layers/cmsToGeoJson.awk	(revision 318)
+++ trunk/src/cptms/data_layers/cmsToGeoJson.awk	(revision 318)
@@ -0,0 +1,18 @@
+# Convert a csv with cctv location data to a geojson file
+# This was used for a one-off task to convert the static csv file we manually produced into json
+# Sample invocation:  awk -F',' -f awkpgm1 filename
+
+# Manually remove the first line with column headers before running this.
+
+# Remove quotes around those streets names that have them
+//{gsub("\"","",$5);printf "  {\n  \"type\": \"Feature\",\n  \"id\": \"%s\",\n  \"geometry\":\n      {\n      \"type\": \"Point\",\n      \"coordinates\": [%s,%s]\n      },\n  \"properties\":\n      {\n      \"location\":\"%s %s %5.2f\",\n      \"street\":\"%s\"\n      }\n  },\n", $1,$7,$8,$10,$12,$15, $5}
+
+#
+# When finished prepend:
+#{
+#  "type": "FeatureCollection",
+#  "features": [
+# 
+# and Append:
+#  ] }
+
Index: trunk/src/cptms/data_layers/prep_postmiles.py
===================================================================
--- trunk/src/cptms/data_layers/prep_postmiles.py	(revision 318)
+++ trunk/src/cptms/data_layers/prep_postmiles.py	(revision 318)
@@ -0,0 +1,273 @@
+import collections,math,sys
+# Scan the postmile file to preprocess it to identify N/S pairs
+# that are so close they will overlap in the display. 
+# Compute the perpendicular vector that will be used to adjust their position.
+# Input filename is a Output to stdout.
+# This program adds one extra column to the output, a color, to allow the
+# results to be easily converted to json and displayed for visual verification. 
+# (See the convert csv to json bash/awk script)
+# Before being used in the simulation, remove the last column:
+#     cut -f1-6 -d"," output.txt
+
+# jdalbey Feb 2019
+postmileFile = "d12_vds_uniq_sorted.csv"
+
+# Helper function to find the perpendicular unit vector to the line
+# between two postmiles.
+def findPerpX(ax,ay,bx,by):
+    dx = float(bx) - float(ax);
+    dy = float(by) - float(ay);
+    
+    dist = math.sqrt(dx * dx + dy * dy);
+    try:
+        normX = dy / dist;  # calc a unit vector
+        normY = -dx / dist;
+        return round(normX, 6)
+    except ZeroDivisionError:
+        print "Oops, (",ay,",",ax,") appeared twice,"
+        print "causing findPerp() to divide by zero. Probable cause: duplicates in input"
+        print "Please correct the input file."
+        sys.exit(-1)
+# And same for Y ... I know it's redundant code.
+def findPerpY(ax,ay,bx,by):
+    dx = float(bx) - float(ax);
+    dy = float(by) - float(ay);
+    
+    dist = math.sqrt(dx * dx + dy * dy);
+    
+    normX = dy / dist;  # calc a unit vector
+    normY = -dx / dist;
+    return round(normY, 6)
+
+orientationLookup = {'N':0,'S':1,'E':0,'W':1}
+
+def loadHighways():
+
+    f = open(postmileFile,'r')
+    lines = [line.split(',') for line in f.readlines()]
+    
+    # Create a set containing just the route numbers 
+    routeNums = set()
+    for item in lines:
+        routeNums.add(int(item[0]))
+    # put the route numbers in order
+    sortedRoutes = sorted (routeNums)    
+    # Create the empty postmile collections
+    for route in sortedRoutes:
+        #print route,
+        highways[str(route)]=[collections.OrderedDict(),collections.OrderedDict()]
+    #print
+    # Process all the data, placing it in proper route and collection
+    for item in lines:
+        route = item[0]
+        orientation = orientationLookup[item[1]]
+        postmileItem = item[2]
+        highways[route][orientation][postmileItem]=item
+
+
+def dumpHighways():
+    # Dump the highways data we've organized
+    for item in highways:
+        for cnt in [0,1]:
+            list1 = highways[item][cnt]
+            print "highway",item,list1
+            # show fields for one entry
+            for pm_entry in list1:
+                print pm_entry,list1[pm_entry]
+
+def calcPerpendicularVectors(theList,thePerps,dirSign):
+    size = len(theList)
+    idx = 1
+    while (idx < size-1):
+        # see which is closer, previous or next
+        a = abs(float(theList[idx][2]) - float(theList[idx+1][2]))
+        b = abs(float(theList[idx][2]) - float(theList[idx-1][2]))
+        if ( a<b ):
+            #print "closest to ",theList[idx][1]+theList[idx][2]," is ", theList[idx+1][2],
+            ax=theList[idx][4] #long
+            ay=theList[idx][3] #lat
+            bx=theList[idx+1][4]
+            by=theList[idx+1][3]
+            px = findPerpX(ax,ay,bx,by) * dirSign
+            py = findPerpY(ax,ay,bx,by) * dirSign
+            # TODO: ADd check to see if this pm already assigned px,py
+            thePerps[theList[idx][2]] = [px,py]
+            thePerps[theList[idx+1][2]] = [px,py]
+            #print px,py
+        else:
+            #print ">closest to ",theList[idx][2]," is ", theList[idx-1][2],
+            ax=theList[idx][4]
+            ay=theList[idx][3]
+            bx=theList[idx-1][4]
+            by=theList[idx-1][3]
+            px = findPerpX(bx,by,ax,ay) * dirSign # reverse order so normal stays NB
+            py = findPerpY(bx,by,ax,ay) * dirSign
+            # TODO: ADd check to see if this pm already assigned px,py
+            thePerps[theList[idx][2]] = [px,py]
+            thePerps[theList[idx-1][2]] = [px,py]
+            #print px,py
+        idx += 1
+
+    # Did first and last spots get filled?
+    if theList[0][2] in thePerps:
+        #print "good, the first item ",theList[0][2]," is present"
+        pass
+    else:
+        #print "oops, first item ",theList[0][2]," missing"
+        # I'm too lazy to calc this value, so providing zero meaning no perp vector
+        # Which means if by chance this spot has a "mate" then it won't get adjusted
+        # as it should.  TODO: fix this by using the neighbor as adjacent
+        thePerps[theList[0][2]]=[0,0]
+    if theList[idx][2] in thePerps:
+        #print "good, the last item ",theList[idx][2]," is present"
+        pass
+    else:
+        #print "oops, last item ",theList[idx][2]," is missing"
+        thePerps[theList[idx][2]]=[0,0]
+
+# ------------------------------------------------------------------------------------------
+
+highways = collections.OrderedDict()    
+loadHighways()
+
+
+# Iterate over all the highway routes
+for route in highways:
+    #print "Starting route: ",route
+    # ---------------------------------------------------------------------------------
+    # ## First, compute the perpendicular vectors for each item 
+    # Compute nearest adjacent for each item (in SAME direction)
+    # We create separate north/south lists so it's easier to locate an adjacent spot
+    northlist = list (highways[route][0].values())
+    southlist = list (highways[route][1].values())
+    northPerps = {}  # a dictionary addressed by postmile that yields perp vectors
+    southPerps = {}
+    #print "northsize is ",northSize, "southsize is ",southSize
+    calcPerpendicularVectors(northlist,northPerps, +1)
+    calcPerpendicularVectors(southlist,southPerps, -1)
+    
+    # -------------------------------------------------------------------------------
+    #print "*****"
+    #print "Perps computed for these up pm's:",sorted(northPerps)
+    #print "Perps computed for these down pm's:",sorted (southPerps)
+    
+    # Try to find matching pairs
+    # Create a match list and add matching postmiles to it.
+    north = highways[route][0]
+    south = highways[route][1]
+    matches = []
+    for item in north:
+        # if south ALSO has item add i to matches list
+        if item in south:
+            #print "match for: " + item
+            matches.append(item)
+    
+    #print "found ",len(matches)," matches."
+    #outFile = open("pairedDots.json","w") # put results here
+    #[0xFF0000,0xFF4000,0xFF8000,0xFFBF00,0xFFFF00,0x00FF00,0x00FFFF,0x0080FF,0x0000FF,0x8000FF,0xFF00FF]
+    colorcode = ["red","salmon","deeppink","coral","orangered","yellow","khaki","purple",
+    "slateblue","lime","lightgreen","cyan","blue","slategray"]
+    colorindex=0
+    for match in matches:
+        # We want to output these as json with matching color
+        id = south[match][0] + " " + south[match][1] + " " + south[match][2]
+        print ("%s,%s,%s,%s,%s,%s,%s" % (id,south[match][3],south[match][4],south[match][5].rstrip(),southPerps[south[match][2]][0],southPerps[south[match][2]][1],colorcode[colorindex]))
+        # lookup perpvector for postmile = south[match][2]
+        #perpx = southPerps[south[match][2]][0]
+        #perpy = southPerps[south[match][2]][1]
+        #print perpx, perpy
+        
+        id = north[match][0] + " " + north[match][1] + " " + north[match][2]
+        print ("%s,%s,%s,%s,%s,%s,%s" % (id,north[match][3],north[match][4],north[match][5].rstrip(),northPerps[north[match][2]][0],northPerps[north[match][2]][1],colorcode[colorindex]))
+        colorindex = (colorindex+1) % 14 # advance to next color
+        # remove them from future consideration
+        south.pop(match)
+        north.pop(match)
+        
+
+    # -----------------------------------------------------------------------
+    leftover_count = len(north)+len(south)
+    #print "Leftover count:",leftover_count
+    # After we've handled all the "matching" pairs of N/S dots
+    # There will be "leftover" single dots 
+    if (leftover_count > 0):
+        #print "Leftovers ... single dots"
+        #print len(north),"North keys", north.keys()
+        #print len(south),"South keys", south.keys()
+        
+         
+        # Assert: there are no matching keys in the two dictionaries,
+        #         they should have been removed by the previous step.
+        # Merge the two sets of keys into one list,
+        # each entry is the postmile and direction
+        mergedKeys = []
+        upLetter = ''
+        downLetter = ''
+        if len(north) > 0:
+            upLetter = north.items()[0][1][1]
+            for item in north.keys():
+                mergedKeys.append(item + upLetter)
+            #print "north keys after merging and letter assigned:",mergedKeys
+        if len(south) > 0:
+            downLetter = south.items()[0][1][1]
+            for item in south.keys():
+                mergedKeys.append(item + downLetter)
+        
+        
+        #Sort the list of keys in ascending order by postmile
+        leftovers = sorted(mergedKeys)
+        # Create a dictionary of postmiles and assigned color, and init to white
+        pm_colors=collections.OrderedDict()
+        for pm in leftovers:
+            pm_colors[pm] = "white"
+        
+        # Look for adjacent items close together in opposite directions
+        # Give them same color dots and assign perpendicular vectors
+        close_count = 0
+        prev = leftovers.pop(0)
+        prev_dir = prev[-1:]
+        prev_pm = prev[:-1]
+        for curr in leftovers:
+            curr_dir = curr[-1:]
+            curr_pm  = curr[:-1]
+            # Only consider adjacent items in OPPOSITE directions
+            if curr_dir != prev_dir:
+                curr_color = "white"
+                # See if they are close enough to be considered a pair
+                if (abs(float(curr_pm) - float(prev_pm)) <= 0.111):
+                    #print "FOUND CLOSE: ",prev, curr
+                    close_count += 1
+                    # tag the previous item with a colored dot
+                    pm_colors[curr_pm+curr_dir]="lime"
+                    pm_colors[prev_pm+prev_dir]="lime"
+               
+            prev = curr
+            prev_dir = curr_dir
+            prev_pm = curr_pm
+                
+        #print "Counted ",close_count," close pairs"
+        # print all the tagged items as csv with their tagged color
+        for spot in pm_colors:
+            curr_dir = spot[-1:]
+            curr_pm  = spot[:-1]
+            if (curr_dir == upLetter):
+                curr_info = north[curr_pm]
+                curr_perpx = northPerps[north[curr_pm][2]][0]
+                curr_perpy = northPerps[north[curr_pm][2]][1]
+            else:
+                curr_info = south[curr_pm]
+                curr_perpx = southPerps[south[curr_pm][2]][0]
+                curr_perpy = southPerps[south[curr_pm][2]][1]
+            id = curr_info[0] + " " + curr_info[1] + " " + curr_info[2]
+            # white dots have no mate so don't need to be adjusted
+            if (pm_colors[spot]=="white"):
+                px=0
+                py=0
+            else:
+                px=curr_perpx
+                py=curr_perpy
+            # output this spot 
+            print ("%s,%s,%s,%s,%s,%s,%s" % (id,curr_info[3],curr_info[4],curr_info[5].rstrip(),px,py,pm_colors[curr_pm+curr_info[1]]))
+            
+
+    
