From f09fcd82f7e5ac5a57b26790daa52597d7f5c88c Mon Sep 17 00:00:00 2001 From: Jacob Powers Date: Wed, 16 Jul 2025 02:45:17 +0000 Subject: [PATCH 01/19] wip map renders streets fix files --- Localizable.xcstrings | 12 + Meshtastic.xcodeproj/project.pbxproj | 16 + .../xcshareddata/swiftpm/Package.resolved | 69 + .../Helpers/GeoJSONOverlayManager.swift | 75 + Meshtastic/Resources/Street_Outlines.geojson | 1 + Meshtastic/Resources/Toilets.geojson | 2984 +++++++++++++++++ Meshtastic/Resources/Trash_Fence.geojson | 44 + .../Map/MapContent/MeshMapContent.swift | 57 + .../Nodes/Helpers/Map/MapSettingsForm.swift | 41 + 9 files changed, 3299 insertions(+) create mode 100644 Meshtastic.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved create mode 100644 Meshtastic/Helpers/GeoJSONOverlayManager.swift create mode 100644 Meshtastic/Resources/Street_Outlines.geojson create mode 100644 Meshtastic/Resources/Toilets.geojson create mode 100644 Meshtastic/Resources/Trash_Fence.geojson diff --git a/Localizable.xcstrings b/Localizable.xcstrings index 8c321273..71912ca9 100644 --- a/Localizable.xcstrings +++ b/Localizable.xcstrings @@ -5813,6 +5813,9 @@ } } } + }, + "Burning Man Overlays" : { + }, "Button GPIO" : { "localizations" : { @@ -35137,6 +35140,9 @@ } } } + }, + "Street Outlines" : { + }, "Subscribed" : { "localizations" : { @@ -37907,6 +37913,9 @@ } } } + }, + "Toilets" : { + }, "Topic: %@" : { "localizations" : { @@ -38381,6 +38390,9 @@ } } } + }, + "Trash Fence" : { + }, "Treat double tap on supported accelerometers as a user button press." : { "localizations" : { diff --git a/Meshtastic.xcodeproj/project.pbxproj b/Meshtastic.xcodeproj/project.pbxproj index 828dcafb..b50e07f8 100644 --- a/Meshtastic.xcodeproj/project.pbxproj +++ b/Meshtastic.xcodeproj/project.pbxproj @@ -56,6 +56,10 @@ 25F5D5C02C3F6DA6008036E3 /* Router.swift in Sources */ = {isa = PBXBuildFile; fileRef = 25F5D5BF2C3F6DA6008036E3 /* Router.swift */; }; 25F5D5C22C3F6E4B008036E3 /* AppState.swift in Sources */ = {isa = PBXBuildFile; fileRef = 25F5D5C12C3F6E4B008036E3 /* AppState.swift */; }; 25F5D5D12C4375DF008036E3 /* RouterTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 25F5D5D02C4375DF008036E3 /* RouterTests.swift */; }; + 3D3417B42E2730EC006A988B /* GeoJSONOverlayManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3D3417B32E2730EC006A988B /* GeoJSONOverlayManager.swift */; }; + 3D3417BC2E273AC6006A988B /* Street_Outlines.geojson in Resources */ = {isa = PBXBuildFile; fileRef = 3D3417BB2E273AC6006A988B /* Street_Outlines.geojson */; }; + 3D3417C32E274800006A988B /* Toilets.geojson in Resources */ = {isa = PBXBuildFile; fileRef = 3D3417C12E274800006A988B /* Toilets.geojson */; }; + 3D3417C42E274800006A988B /* Trash_Fence.geojson in Resources */ = {isa = PBXBuildFile; fileRef = 3D3417C22E274800006A988B /* Trash_Fence.geojson */; }; 6D825E622C34786C008DBEE4 /* CommonRegex.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6D825E612C34786C008DBEE4 /* CommonRegex.swift */; }; 6DA39D8E2A92DC52007E311C /* MeshtasticAppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6DA39D8D2A92DC52007E311C /* MeshtasticAppDelegate.swift */; }; 6DEDA55A2A957B8E00321D2E /* DetectionSensorLog.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6DEDA5592A957B8E00321D2E /* DetectionSensorLog.swift */; }; @@ -326,6 +330,10 @@ 25F5D5C12C3F6E4B008036E3 /* AppState.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppState.swift; sourceTree = ""; }; 25F5D5C72C4375A8008036E3 /* MeshtasticTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = MeshtasticTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; 25F5D5D02C4375DF008036E3 /* RouterTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RouterTests.swift; sourceTree = ""; }; + 3D3417B32E2730EC006A988B /* GeoJSONOverlayManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GeoJSONOverlayManager.swift; sourceTree = ""; }; + 3D3417BB2E273AC6006A988B /* Street_Outlines.geojson */ = {isa = PBXFileReference; lastKnownFileType = text; path = Street_Outlines.geojson; sourceTree = ""; }; + 3D3417C12E274800006A988B /* Toilets.geojson */ = {isa = PBXFileReference; lastKnownFileType = text; path = Toilets.geojson; sourceTree = ""; }; + 3D3417C22E274800006A988B /* Trash_Fence.geojson */ = {isa = PBXFileReference; lastKnownFileType = text; path = Trash_Fence.geojson; sourceTree = ""; }; 6D825E612C34786C008DBEE4 /* CommonRegex.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CommonRegex.swift; sourceTree = ""; }; 6DA39D8D2A92DC52007E311C /* MeshtasticAppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MeshtasticAppDelegate.swift; sourceTree = ""; }; 6DEDA5592A957B8E00321D2E /* DetectionSensorLog.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DetectionSensorLog.swift; sourceTree = ""; }; @@ -1050,6 +1058,9 @@ DDB75A192A05EB67006ED576 /* alpha.png */, DDC2E15B26CE248F0042C5E4 /* Assets.xcassets */, DD0E21002B8A6BC500F2D100 /* DeviceHardware.json */, + 3D3417BB2E273AC6006A988B /* Street_Outlines.geojson */, + 3D3417C12E274800006A988B /* Toilets.geojson */, + 3D3417C22E274800006A988B /* Trash_Fence.geojson */, ); path = Resources; sourceTree = ""; @@ -1108,6 +1119,7 @@ DD964FBC296E6B01007C176F /* EmojiOnlyTextField.swift */, DD3619142B1EF9F900C41C8C /* LocationsHandler.swift */, 6D825E612C34786C008DBEE4 /* CommonRegex.swift */, + 3D3417B32E2730EC006A988B /* GeoJSONOverlayManager.swift */, ); path = Helpers; sourceTree = ""; @@ -1360,7 +1372,10 @@ DDC2E15F26CE248F0042C5E4 /* Preview Assets.xcassets in Resources */, 25AECD4F2C2F723200862C8E /* Localizable.xcstrings in Resources */, DDDE5A1329AFEAB900490C6C /* Assets.xcassets in Resources */, + 3D3417BC2E273AC6006A988B /* Street_Outlines.geojson in Resources */, DDB75A1A2A05EB67006ED576 /* alpha.png in Resources */, + 3D3417C32E274800006A988B /* Toilets.geojson in Resources */, + 3D3417C42E274800006A988B /* Trash_Fence.geojson in Resources */, DDC2E15C26CE248F0042C5E4 /* Assets.xcassets in Resources */, DD0E21012B8A6F1300F2D100 /* DeviceHardware.json in Resources */, DDDBC87B2BC62E4E001E8DF7 /* Settings.bundle in Resources */, @@ -1476,6 +1491,7 @@ DDDB445429F8AD1600EE2349 /* Data.swift in Sources */, DDDB26462AACC0B7003AFCB7 /* NodeInfoItem.swift in Sources */, DDE5B4042B2279A700FCDD05 /* TraceRouteLog.swift in Sources */, + 3D3417B42E2730EC006A988B /* GeoJSONOverlayManager.swift in Sources */, 237B46962DC8F1C100B22D99 /* RateLimitedButton.swift in Sources */, DD6193792863875F00E59241 /* SerialConfig.swift in Sources */, DDDB263F2AABEE20003AFCB7 /* NodeList.swift in Sources */, diff --git a/Meshtastic.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved b/Meshtastic.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved new file mode 100644 index 00000000..3b339cec --- /dev/null +++ b/Meshtastic.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved @@ -0,0 +1,69 @@ +{ + "originHash" : "2569905853aec088d5bac6b540eac77f78963f88b406e8dd95a88c40623cc8b4", + "pins" : [ + { + "identity" : "cocoamqtt", + "kind" : "remoteSourceControl", + "location" : "https://github.com/emqx/CocoaMQTT", + "state" : { + "revision" : "22b98acc75bdca77917a1093bd3e1b45ef6e9718", + "version" : "2.1.9" + } + }, + { + "identity" : "dd-sdk-ios", + "kind" : "remoteSourceControl", + "location" : "https://github.com/DataDog/dd-sdk-ios.git", + "state" : { + "revision" : "d0a42d8067665cb6ee86af51251ccc071f62bd54", + "version" : "2.29.0" + } + }, + { + "identity" : "mqttcocoaasyncsocket", + "kind" : "remoteSourceControl", + "location" : "https://github.com/leeway1208/MqttCocoaAsyncSocket", + "state" : { + "revision" : "ce3e18607fd01079495f86ff6195d8a3ca469f73", + "version" : "1.0.8" + } + }, + { + "identity" : "opentelemetry-swift-packages", + "kind" : "remoteSourceControl", + "location" : "https://github.com/DataDog/opentelemetry-swift-packages.git", + "state" : { + "revision" : "4a7295600d4ebb9525a23c11586c5fdb74ae8b7e", + "version" : "1.13.1" + } + }, + { + "identity" : "plcrashreporter", + "kind" : "remoteSourceControl", + "location" : "https://github.com/microsoft/plcrashreporter.git", + "state" : { + "revision" : "8c61e5e38e9f737dd68512ed1ea5ab081244ad65", + "version" : "1.12.0" + } + }, + { + "identity" : "starscream", + "kind" : "remoteSourceControl", + "location" : "https://github.com/daltoniam/Starscream.git", + "state" : { + "revision" : "c6bfd1af48efcc9a9ad203665db12375ba6b145a", + "version" : "4.0.8" + } + }, + { + "identity" : "swift-protobuf", + "kind" : "remoteSourceControl", + "location" : "https://github.com/apple/swift-protobuf.git", + "state" : { + "revision" : "102a647b573f60f73afdce5613a51d71349fe507", + "version" : "1.30.0" + } + } + ], + "version" : 3 +} diff --git a/Meshtastic/Helpers/GeoJSONOverlayManager.swift b/Meshtastic/Helpers/GeoJSONOverlayManager.swift new file mode 100644 index 00000000..c0d0b6c4 --- /dev/null +++ b/Meshtastic/Helpers/GeoJSONOverlayManager.swift @@ -0,0 +1,75 @@ +import SwiftUI +import MapKit + +/// Enum for supported static overlays +enum StaticGeoJSONOverlay: String, CaseIterable { + case streetOutlines = "Street_Outlines" + case toilets = "Toilets" + case trashFence = "Trash_Fence" + + var filename: String { self.rawValue + ".geojson" } +} + +/// Manager for loading and adding GeoJSON overlays +class GeoJSONOverlayManager { + static let shared = GeoJSONOverlayManager() + private init() {} + + private var overlays: [StaticGeoJSONOverlay: [MKOverlay]] = [:] + + /// Load overlays for a given type (from bundle) + func loadOverlays(for type: StaticGeoJSONOverlay) -> [MKOverlay] { + print("GeoJSONOverlayManager: Attempting to load overlays for \(type.rawValue)") + if let cached = overlays[type] { + print("GeoJSONOverlayManager: Returning cached overlays for \(type.rawValue), count: \(cached.count)") + return cached + } + guard let url = Bundle.main.url(forResource: type.rawValue, withExtension: "geojson") else { + print("GeoJSONOverlayManager: No file found for \(type.rawValue).geojson") + return [] + } + print("GeoJSONOverlayManager: Found file at: \(url)") + do { + let data = try Data(contentsOf: url) + print("GeoJSONOverlayManager: Loaded data size: \(data.count) bytes") + let features = try MKGeoJSONDecoder().decode(data) + print("GeoJSONOverlayManager: Decoded \(features.count) features for \(type.rawValue)") + + var allOverlays: [MKOverlay] = [] + for (index, feature) in features.enumerated() { + if let mkFeature = feature as? MKGeoJSONFeature { + print("GeoJSONOverlayManager: Feature \(index) has \(mkFeature.geometry.count) geometries") + for (geoIndex, geometry) in mkFeature.geometry.enumerated() { + print("GeoJSONOverlayManager: Geometry \(geoIndex): \(Swift.type(of: geometry))") + if let overlay = geometry as? MKOverlay { + allOverlays.append(overlay) + print("GeoJSONOverlayManager: Added as overlay") + } else { + print("GeoJSONOverlayManager: Could not cast to MKOverlay") + } + } + } else { + print("GeoJSONOverlayManager: Feature \(index) could not be cast to MKGeoJSONFeature") + } + } + + print("GeoJSONOverlayManager: Created \(allOverlays.count) total overlays for \(type.rawValue)") + overlays[type] = allOverlays + return allOverlays + } catch { + print("Failed to load GeoJSON overlay: \(type) error: \(error)") + return [] + } + } + + /// Add overlays to the map + func addOverlays(_ type: StaticGeoJSONOverlay, to mapView: MKMapView) { + let overlays = loadOverlays(for: type) + mapView.addOverlays(overlays, level: .aboveLabels) + } + /// Remove overlays from the map + func removeOverlays(_ type: StaticGeoJSONOverlay, from mapView: MKMapView) { + let overlays = self.overlays[type] ?? [] + mapView.removeOverlays(overlays) + } +} \ No newline at end of file diff --git a/Meshtastic/Resources/Street_Outlines.geojson b/Meshtastic/Resources/Street_Outlines.geojson new file mode 100644 index 00000000..dc1bd8b6 --- /dev/null +++ b/Meshtastic/Resources/Street_Outlines.geojson @@ -0,0 +1 @@ +{"type":"FeatureCollection","features":[{"type":"Feature","id":0,"geometry":{"type":"Polygon","coordinates":[[[-119.21612,40.8029],[-119.21608,40.80293],[-119.21605,40.80297],[-119.21603,40.80301],[-119.21601,40.80305],[-119.216,40.80309],[-119.216,40.80314],[-119.21602,40.80318],[-119.21604,40.80322],[-119.21607,40.80326],[-119.2161,40.80329],[-119.21615,40.80332],[-119.2162,40.80335],[-119.21625,40.80336],[-119.2163,40.80337],[-119.21636,40.80338],[-119.21642,40.80337],[-119.21647,40.80336],[-119.21653,40.80335],[-119.21658,40.80332],[-119.21662,40.8033],[-119.21666,40.80326],[-119.21669,40.80323],[-119.21671,40.80319],[-119.21672,40.80314],[-119.21672,40.8031],[-119.21672,40.80306],[-119.21671,40.80302],[-119.21668,40.80298],[-119.21665,40.80294],[-119.21662,40.80291],[-119.21657,40.80288],[-119.21652,40.80286],[-119.21647,40.80284],[-119.21642,40.80283],[-119.21636,40.80283],[-119.2163,40.80283],[-119.21625,40.80284],[-119.21458,40.80064],[-119.2148,40.80054],[-119.21518,40.80037],[-119.21556,40.80018],[-119.21593,40.79999],[-119.21629,40.7998],[-119.21665,40.7996],[-119.217,40.79939],[-119.21735,40.79918],[-119.21735,40.79918],[-119.21769,40.79896],[-119.21802,40.79874],[-119.21835,40.79851],[-119.21867,40.79827],[-119.21899,40.79803],[-119.2193,40.79779],[-119.2196,40.79754],[-119.21989,40.79729],[-119.22018,40.79703],[-119.22018,40.79703],[-119.22046,40.79676],[-119.22073,40.79649],[-119.22099,40.79622],[-119.22125,40.79595],[-119.2215,40.79567],[-119.22174,40.79538],[-119.22197,40.79509],[-119.2222,40.7948],[-119.2222,40.7948],[-119.22241,40.7945],[-119.22262,40.7942],[-119.22282,40.7939],[-119.22301,40.7936],[-119.2232,40.79329],[-119.22337,40.79298],[-119.22353,40.79266],[-119.22369,40.79234],[-119.22369,40.79234],[-119.22384,40.79202],[-119.22397,40.7917],[-119.2241,40.79138],[-119.22422,40.79105],[-119.22433,40.79072],[-119.22444,40.7904],[-119.22453,40.79006],[-119.22461,40.78973],[-119.22461,40.78973],[-119.22468,40.7894],[-119.22475,40.78906],[-119.2248,40.78873],[-119.22485,40.78839],[-119.22488,40.78805],[-119.22491,40.78771],[-119.22492,40.78738],[-119.22493,40.78704],[-119.22493,40.78704],[-119.22493,40.7867],[-119.22492,40.78636],[-119.2249,40.78602],[-119.22486,40.78569],[-119.22482,40.78535],[-119.22477,40.78501],[-119.22472,40.78468],[-119.22465,40.78434],[-119.22465,40.78434],[-119.22457,40.78401],[-119.22448,40.78368],[-119.22438,40.78335],[-119.22428,40.78302],[-119.22425,40.78293],[-119.2338,40.78342],[-119.23383,40.78337],[-119.23375,40.78331],[-119.23359,40.7833],[-119.23348,40.7833],[-119.23334,40.78329],[-119.2332,40.78327],[-119.23306,40.78325],[-119.23292,40.78321],[-119.23279,40.78318],[-119.23266,40.78313],[-119.23253,40.78308],[-119.23241,40.78302],[-119.23229,40.78296],[-119.23218,40.7829],[-119.22086,40.77429],[-119.22189,40.7743],[-119.22131,40.77386],[-119.22074,40.77343],[-119.22075,40.77421],[-119.22071,40.77418],[-119.21812,40.77221],[-119.21801,40.77213],[-119.21789,40.77205],[-119.21777,40.77198],[-119.21764,40.77191],[-119.2175,40.77185],[-119.21736,40.7718],[-119.21722,40.77175],[-119.21707,40.77171],[-119.21692,40.77167],[-119.21677,40.77164],[-119.21662,40.77162],[-119.21646,40.7716],[-119.21641,40.7716],[-119.21639,40.77154],[-119.21637,40.77148],[-119.21633,40.77143],[-119.21629,40.77137],[-119.21624,40.77132],[-119.21618,40.77128],[-119.21612,40.77124],[-119.21605,40.7712],[-119.21597,40.77118],[-119.2159,40.77115],[-119.21582,40.77114],[-119.21573,40.77113],[-119.21565,40.77113],[-119.21557,40.77114],[-119.21549,40.77115],[-119.21541,40.77118],[-119.21534,40.7712],[-119.21527,40.77124],[-119.2152,40.77128],[-119.21515,40.77132],[-119.2151,40.77137],[-119.21505,40.77143],[-119.21502,40.77148],[-119.21499,40.77154],[-119.21498,40.7716],[-119.21497,40.77167],[-119.21497,40.77173],[-119.21498,40.77179],[-119.21501,40.77185],[-119.21504,40.77191],[-119.21507,40.77197],[-119.21512,40.77202],[-119.21517,40.77206],[-119.21524,40.77211],[-119.21527,40.77213],[-119.21445,40.77321],[-119.21422,40.77311],[-119.21383,40.77295],[-119.21343,40.7728],[-119.21303,40.77265],[-119.21263,40.77251],[-119.21222,40.77237],[-119.21181,40.77224],[-119.21139,40.77212],[-119.21139,40.77212],[-119.21097,40.77201],[-119.21055,40.7719],[-119.21013,40.7718],[-119.2097,40.7717],[-119.20953,40.77167],[-119.20892,40.76489],[-119.20897,40.76489],[-119.20905,40.76487],[-119.20912,40.76484],[-119.20919,40.76481],[-119.20926,40.76478],[-119.20931,40.76474],[-119.20888,40.76441],[-119.2088,40.76435],[-119.20873,40.76438],[-119.20873,40.76438],[-119.20816,40.7646],[-119.20818,40.76464],[-119.20823,40.76469],[-119.20829,40.76473],[-119.20835,40.76478],[-119.20841,40.76481],[-119.20848,40.76484],[-119.20856,40.76487],[-119.20864,40.76489],[-119.20872,40.7649],[-119.20878,40.7649],[-119.20938,40.77164],[-119.20927,40.77161],[-119.20884,40.77153],[-119.2084,40.77146],[-119.20797,40.77139],[-119.20753,40.77133],[-119.20753,40.77133],[-119.20709,40.77128],[-119.20665,40.77124],[-119.20621,40.7712],[-119.20576,40.77117],[-119.20532,40.77114],[-119.20487,40.77113],[-119.20443,40.77112],[-119.20398,40.77112],[-119.20398,40.77112],[-119.20354,40.77112],[-119.20309,40.77113],[-119.20265,40.77115],[-119.2022,40.77118],[-119.20176,40.77122],[-119.20132,40.77126],[-119.20088,40.77131],[-119.20044,40.77136],[-119.20044,40.77136],[-119.2,40.77143],[-119.19957,40.7715],[-119.19913,40.77157],[-119.1987,40.77166],[-119.19827,40.77175],[-119.19785,40.77185],[-119.19742,40.77195],[-119.197,40.77206],[-119.197,40.77206],[-119.19659,40.77218],[-119.19617,40.77231],[-119.19576,40.77244],[-119.19536,40.77258],[-119.19495,40.77272],[-119.19456,40.77287],[-119.19416,40.77303],[-119.19377,40.7732],[-119.19377,40.7732],[-119.19339,40.77337],[-119.19301,40.77354],[-119.19263,40.77373],[-119.19227,40.77392],[-119.1919,40.77411],[-119.19154,40.77431],[-119.19119,40.77452],[-119.19085,40.77473],[-119.19084,40.77473],[-119.1905,40.77495],[-119.19017,40.77517],[-119.18984,40.7754],[-119.18952,40.77564],[-119.1892,40.77588],[-119.1889,40.77612],[-119.1886,40.77637],[-119.1883,40.77662],[-119.18802,40.77688],[-119.18801,40.77688],[-119.18774,40.77715],[-119.18746,40.77741],[-119.1872,40.77769],[-119.18694,40.77796],[-119.18669,40.77824],[-119.18645,40.77853],[-119.18622,40.77882],[-119.18599,40.77911],[-119.18599,40.77911],[-119.18578,40.7794],[-119.18557,40.7797],[-119.18537,40.78001],[-119.18518,40.78031],[-119.185,40.78062],[-119.18482,40.78093],[-119.18466,40.78125],[-119.1845,40.78156],[-119.1845,40.78156],[-119.18435,40.78188],[-119.18422,40.7822],[-119.18409,40.78253],[-119.18397,40.78284],[-119.18397,40.78285],[-119.18395,40.78291],[-119.18404,40.78293],[-119.18408,40.78293],[-119.18409,40.78294],[-119.1847,40.78306],[-119.18533,40.78319],[-119.1863,40.78339],[-119.18728,40.78359],[-119.18826,40.78379],[-119.18993,40.78413],[-119.19091,40.78433],[-119.19188,40.78452],[-119.19286,40.78472],[-119.19384,40.78492],[-119.19534,40.78523],[-119.19534,40.78523],[-119.19535,40.78523],[-119.19542,40.78525],[-119.19544,40.78519],[-119.19545,40.78519],[-119.19552,40.78498],[-119.19561,40.78477],[-119.19571,40.78457],[-119.19581,40.78436],[-119.19593,40.78416],[-119.19605,40.78396],[-119.19618,40.78377],[-119.19632,40.78358],[-119.19647,40.78339],[-119.19662,40.7832],[-119.19679,40.78302],[-119.19696,40.78284],[-119.19713,40.78267],[-119.19732,40.7825],[-119.19751,40.78234],[-119.19771,40.78218],[-119.20399,40.78696],[-119.19804,40.79148],[-119.19798,40.79145],[-119.19792,40.79143],[-119.19785,40.79141],[-119.19778,40.7914],[-119.19771,40.7914],[-119.19764,40.7914],[-119.19757,40.79141],[-119.1975,40.79143],[-119.19744,40.79145],[-119.19738,40.79148],[-119.19733,40.79152],[-119.19728,40.79156],[-119.19724,40.7916],[-119.19721,40.79165],[-119.19719,40.7917],[-119.19717,40.79175],[-119.19717,40.79181],[-119.19717,40.79186],[-119.19719,40.79191],[-119.19721,40.79197],[-119.19724,40.79201],[-119.19728,40.79206],[-119.19733,40.7921],[-119.19738,40.79213],[-119.19744,40.79216],[-119.1975,40.79219],[-119.19757,40.79221],[-119.19764,40.79222],[-119.19771,40.79222],[-119.19778,40.79222],[-119.19785,40.79221],[-119.19792,40.79219],[-119.19798,40.79216],[-119.19804,40.79213],[-119.19809,40.7921],[-119.19814,40.79206],[-119.19818,40.79201],[-119.19821,40.79197],[-119.19823,40.79191],[-119.19825,40.79186],[-119.19825,40.79181],[-119.19825,40.79175],[-119.19823,40.7917],[-119.19821,40.79165],[-119.19818,40.7916],[-119.19814,40.79156],[-119.20409,40.78703],[-119.21038,40.79181],[-119.21017,40.79196],[-119.20995,40.7921],[-119.20973,40.79225],[-119.2095,40.79238],[-119.20927,40.79251],[-119.20903,40.79263],[-119.20879,40.79275],[-119.20854,40.79286],[-119.20829,40.79297],[-119.20803,40.79307],[-119.20777,40.79316],[-119.20751,40.79325],[-119.20724,40.79333],[-119.20696,40.7934],[-119.20669,40.79347],[-119.20645,40.79352],[-119.20641,40.79353],[-119.20634,40.79355],[-119.20636,40.7936],[-119.20638,40.79365],[-119.20677,40.79475],[-119.20703,40.79549],[-119.20729,40.79624],[-119.20755,40.79698],[-119.20781,40.79772],[-119.20826,40.79899],[-119.20853,40.79974],[-119.20879,40.80048],[-119.20905,40.80122],[-119.20922,40.8017],[-119.20938,40.80217],[-119.2094,40.8022],[-119.20942,40.80227],[-119.20949,40.80225],[-119.20951,40.80225],[-119.20992,40.80216],[-119.21034,40.80206],[-119.21077,40.80196],[-119.21119,40.80185],[-119.21119,40.80185],[-119.2116,40.80173],[-119.21202,40.8016],[-119.21243,40.80147],[-119.21284,40.80133],[-119.21324,40.80119],[-119.21364,40.80104],[-119.21403,40.80088],[-119.21442,40.80071],[-119.21442,40.80071],[-119.21445,40.8007],[-119.21612,40.8029]],[[-119.21436,40.80058],[-119.21433,40.80059],[-119.21394,40.80076],[-119.21355,40.80091],[-119.21316,40.80106],[-119.21276,40.80121],[-119.21236,40.80135],[-119.21207,40.80144],[-119.21186,40.80106],[-119.21218,40.80095],[-119.21218,40.80095],[-119.21258,40.80082],[-119.21258,40.80082],[-119.21297,40.80067],[-119.21297,40.80067],[-119.21336,40.80053],[-119.21336,40.80052],[-119.21375,40.80037],[-119.21375,40.80037],[-119.21409,40.80022],[-119.21436,40.80058]],[[-119.21193,40.80148],[-119.21154,40.8016],[-119.21113,40.80172],[-119.21071,40.80183],[-119.21029,40.80193],[-119.20987,40.80203],[-119.20951,40.80211],[-119.20937,40.80171],[-119.20972,40.80163],[-119.20972,40.80163],[-119.21014,40.80154],[-119.21014,40.80154],[-119.21055,40.80144],[-119.21056,40.80143],[-119.21097,40.80133],[-119.21097,40.80132],[-119.21138,40.80121],[-119.21138,40.80121],[-119.21173,40.8011],[-119.21193,40.80148]],[[-119.21134,40.80113],[-119.21093,40.80125],[-119.21052,40.80136],[-119.21011,40.80146],[-119.20969,40.80156],[-119.20934,40.80163],[-119.2092,40.80123],[-119.20955,40.80116],[-119.20955,40.80116],[-119.20996,40.80106],[-119.20996,40.80106],[-119.21036,40.80096],[-119.21037,40.80096],[-119.21077,40.80085],[-119.21077,40.80085],[-119.21117,40.80074],[-119.21117,40.80074],[-119.21148,40.80064],[-119.21169,40.80103],[-119.21134,40.80113]],[[-119.21113,40.80066],[-119.21073,40.80078],[-119.21033,40.80088],[-119.20992,40.80099],[-119.20952,40.80108],[-119.20917,40.80115],[-119.20894,40.80049],[-119.20927,40.80042],[-119.20927,40.80042],[-119.20967,40.80033],[-119.20967,40.80033],[-119.21007,40.80023],[-119.21007,40.80023],[-119.21046,40.80012],[-119.21046,40.80012],[-119.21085,40.80001],[-119.21086,40.80001],[-119.21109,40.79993],[-119.21144,40.80057],[-119.21113,40.80066]],[[-119.21043,40.80004],[-119.21004,40.80015],[-119.20964,40.80025],[-119.20924,40.80034],[-119.20891,40.80041],[-119.20868,40.79975],[-119.209,40.79968],[-119.209,40.79968],[-119.20939,40.79959],[-119.20939,40.79959],[-119.20977,40.79949],[-119.20977,40.79949],[-119.21016,40.79939],[-119.21016,40.79939],[-119.21053,40.79928],[-119.21054,40.79928],[-119.2107,40.79922],[-119.21105,40.79986],[-119.21082,40.79993],[-119.21043,40.80004]],[[-119.21012,40.79931],[-119.20974,40.79941],[-119.20936,40.79951],[-119.20897,40.7996],[-119.20865,40.79967],[-119.20842,40.799],[-119.20873,40.79894],[-119.20873,40.79894],[-119.2091,40.79885],[-119.2091,40.79885],[-119.20948,40.79876],[-119.20948,40.79876],[-119.20985,40.79866],[-119.20985,40.79865],[-119.21021,40.79855],[-119.21021,40.79855],[-119.21032,40.79851],[-119.21066,40.79915],[-119.2105,40.7992],[-119.21012,40.79931]],[[-119.20981,40.79858],[-119.20944,40.79868],[-119.20907,40.79877],[-119.2087,40.79886],[-119.20839,40.79892],[-119.20797,40.79773],[-119.20826,40.79767],[-119.20826,40.79767],[-119.20861,40.79759],[-119.20862,40.79759],[-119.20897,40.7975],[-119.20897,40.7975],[-119.20932,40.7974],[-119.20932,40.7974],[-119.20967,40.79729],[-119.20967,40.79729],[-119.21001,40.79718],[-119.21001,40.79718],[-119.21035,40.79707],[-119.21035,40.79707],[-119.21068,40.79694],[-119.21069,40.79694],[-119.21102,40.79681],[-119.21102,40.79681],[-119.21134,40.79667],[-119.21134,40.79667],[-119.21138,40.79666],[-119.21219,40.79773],[-119.21194,40.79784],[-119.21159,40.79798],[-119.21124,40.79811],[-119.21089,40.79824],[-119.21053,40.79836],[-119.21017,40.79847],[-119.20981,40.79858]],[[-119.21097,40.79674],[-119.21064,40.79687],[-119.2103,40.79699],[-119.20997,40.79711],[-119.20962,40.79722],[-119.20928,40.79732],[-119.20893,40.79742],[-119.20858,40.79751],[-119.20823,40.79759],[-119.20794,40.79765],[-119.20771,40.79699],[-119.20798,40.79693],[-119.20798,40.79693],[-119.20833,40.79685],[-119.20833,40.79685],[-119.20867,40.79676],[-119.20867,40.79676],[-119.20901,40.79667],[-119.20901,40.79667],[-119.20934,40.79656],[-119.20934,40.79656],[-119.20967,40.79646],[-119.20967,40.79645],[-119.21,40.79634],[-119.21,40.79634],[-119.21032,40.79622],[-119.21033,40.79622],[-119.21064,40.79609],[-119.21064,40.79609],[-119.21088,40.79599],[-119.21133,40.79659],[-119.21129,40.7966],[-119.21097,40.79674]],[[-119.21059,40.79602],[-119.21028,40.79615],[-119.20995,40.79627],[-119.20963,40.79638],[-119.2093,40.79649],[-119.20897,40.79659],[-119.20863,40.79668],[-119.20829,40.79677],[-119.20795,40.79685],[-119.20768,40.79691],[-119.20744,40.79625],[-119.20771,40.79619],[-119.20771,40.79619],[-119.20804,40.79611],[-119.20804,40.79611],[-119.20837,40.79603],[-119.20837,40.79603],[-119.20869,40.79593],[-119.20869,40.79593],[-119.20901,40.79583],[-119.20902,40.79583],[-119.20933,40.79573],[-119.20933,40.79573],[-119.20965,40.79562],[-119.20965,40.79562],[-119.20996,40.7955],[-119.20996,40.7955],[-119.21026,40.79537],[-119.21026,40.79537],[-119.21037,40.79533],[-119.21082,40.79592],[-119.21059,40.79602]],[[-119.20991,40.79542],[-119.2096,40.79554],[-119.20929,40.79565],[-119.20897,40.79576],[-119.20865,40.79586],[-119.20833,40.79595],[-119.20801,40.79603],[-119.20768,40.79611],[-119.20742,40.79617],[-119.20718,40.7955],[-119.20743,40.79545],[-119.20743,40.79545],[-119.20775,40.79537],[-119.20775,40.79537],[-119.20806,40.79529],[-119.20806,40.79529],[-119.20837,40.7952],[-119.20838,40.7952],[-119.20868,40.79511],[-119.20868,40.79511],[-119.20899,40.795],[-119.20899,40.795],[-119.20929,40.7949],[-119.20929,40.79489],[-119.20958,40.79478],[-119.20958,40.79478],[-119.20986,40.79466],[-119.21032,40.79525],[-119.21021,40.7953],[-119.20991,40.79542]],[[-119.20953,40.79471],[-119.20924,40.79482],[-119.20894,40.79493],[-119.20864,40.79503],[-119.20834,40.79513],[-119.20803,40.79521],[-119.20772,40.7953],[-119.2074,40.79537],[-119.20715,40.79542],[-119.20692,40.79476],[-119.20716,40.79471],[-119.20716,40.79471],[-119.20746,40.79464],[-119.20746,40.79464],[-119.20776,40.79456],[-119.20776,40.79456],[-119.20805,40.79447],[-119.20805,40.79447],[-119.20834,40.79438],[-119.20835,40.79438],[-119.20863,40.79428],[-119.20863,40.79428],[-119.20892,40.79418],[-119.20892,40.79418],[-119.2092,40.79406],[-119.2092,40.79406],[-119.20936,40.79399],[-119.20981,40.79459],[-119.20953,40.79471]],[[-119.20887,40.7941],[-119.20859,40.79421],[-119.2083,40.79431],[-119.20801,40.7944],[-119.20772,40.79448],[-119.20742,40.79456],[-119.20712,40.79463],[-119.20689,40.79468],[-119.20652,40.79362],[-119.20673,40.79358],[-119.20673,40.79358],[-119.20701,40.79351],[-119.20701,40.79351],[-119.20729,40.79343],[-119.20729,40.79343],[-119.20756,40.79335],[-119.20756,40.79335],[-119.20783,40.79326],[-119.20783,40.79326],[-119.20809,40.79317],[-119.2081,40.79317],[-119.20836,40.79307],[-119.20836,40.79307],[-119.20858,40.79297],[-119.2093,40.79392],[-119.20915,40.79399],[-119.20887,40.7941]],[[-119.20871,40.79292],[-119.20886,40.79285],[-119.20887,40.79285],[-119.20911,40.79273],[-119.20911,40.79273],[-119.20935,40.7926],[-119.20936,40.7926],[-119.20959,40.79247],[-119.20959,40.79247],[-119.20982,40.79233],[-119.20982,40.79233],[-119.21005,40.79219],[-119.21005,40.79219],[-119.21026,40.79204],[-119.21027,40.79204],[-119.21029,40.79202],[-119.2103,40.79202],[-119.21031,40.79201],[-119.21033,40.79201],[-119.21034,40.79201],[-119.21036,40.792],[-119.21038,40.79201],[-119.21039,40.79201],[-119.21041,40.79202],[-119.21042,40.79202],[-119.21145,40.7927],[-119.21141,40.79273],[-119.21118,40.79289],[-119.21095,40.79305],[-119.21071,40.7932],[-119.21046,40.79335],[-119.21021,40.79349],[-119.20995,40.79362],[-119.20969,40.79375],[-119.20943,40.79387],[-119.20871,40.79292]],[[-119.21076,40.79177],[-119.21075,40.79176],[-119.21075,40.79174],[-119.21074,40.79173],[-119.21074,40.79172],[-119.21074,40.7917],[-119.21074,40.79169],[-119.21075,40.79168],[-119.21076,40.79167],[-119.21077,40.79165],[-119.21077,40.79165],[-119.21088,40.79156],[-119.21088,40.79156],[-119.21107,40.79139],[-119.21107,40.79139],[-119.21126,40.79122],[-119.21126,40.79122],[-119.21143,40.79104],[-119.21144,40.79104],[-119.2116,40.79086],[-119.21161,40.79086],[-119.21177,40.79068],[-119.21177,40.79067],[-119.21192,40.79049],[-119.21192,40.79049],[-119.21195,40.79045],[-119.2132,40.791],[-119.21316,40.79105],[-119.21299,40.79126],[-119.21282,40.79145],[-119.21264,40.79165],[-119.21245,40.79184],[-119.21226,40.79203],[-119.21206,40.79221],[-119.21185,40.79239],[-119.21165,40.79254],[-119.21076,40.79177]],[[-119.21164,40.79062],[-119.21149,40.7908],[-119.21132,40.79098],[-119.21114,40.79115],[-119.21096,40.79132],[-119.21077,40.79149],[-119.21058,40.79165],[-119.21048,40.79173],[-119.2042,40.78696],[-119.20961,40.78284],[-119.20968,40.78279],[-119.20977,40.78272],[-119.20981,40.78274],[-119.20993,40.78283],[-119.21006,40.7829],[-119.2102,40.78297],[-119.21034,40.78304],[-119.21048,40.7831],[-119.21063,40.78315],[-119.21079,40.78319],[-119.21094,40.78323],[-119.2111,40.78326],[-119.21126,40.78329],[-119.21142,40.78331],[-119.21159,40.78332],[-119.21166,40.78332],[-119.21168,40.78334],[-119.21183,40.78353],[-119.21197,40.78372],[-119.21211,40.78391],[-119.21223,40.78411],[-119.21235,40.78431],[-119.21246,40.78452],[-119.21255,40.78472],[-119.21264,40.78493],[-119.21273,40.78514],[-119.2128,40.78535],[-119.21286,40.78557],[-119.21292,40.78578],[-119.21296,40.786],[-119.213,40.78622],[-119.21302,40.78643],[-119.21304,40.78665],[-119.21305,40.78687],[-119.21305,40.78709],[-119.21304,40.78731],[-119.21302,40.78753],[-119.21299,40.78775],[-119.21295,40.78797],[-119.2129,40.78818],[-119.21285,40.7884],[-119.21278,40.78861],[-119.21271,40.78882],[-119.21262,40.78903],[-119.21253,40.78924],[-119.21243,40.78945],[-119.21232,40.78965],[-119.2122,40.78985],[-119.21207,40.79005],[-119.21194,40.79024],[-119.2118,40.79043],[-119.21164,40.79062]],[[-119.20409,40.78688],[-119.19781,40.7821],[-119.19792,40.78203],[-119.19813,40.78188],[-119.19835,40.78173],[-119.19857,40.7816],[-119.1988,40.78146],[-119.19904,40.78134],[-119.19928,40.78122],[-119.19952,40.7811],[-119.19977,40.78099],[-119.20003,40.78089],[-119.20029,40.78079],[-119.20055,40.7807],[-119.20082,40.78062],[-119.20109,40.78054],[-119.20136,40.78047],[-119.20164,40.78041],[-119.20192,40.78035],[-119.2022,40.7803],[-119.20248,40.78026],[-119.20276,40.78022],[-119.20305,40.78019],[-119.20334,40.78017],[-119.20363,40.78016],[-119.20391,40.78015],[-119.2042,40.78015],[-119.20449,40.78015],[-119.20478,40.78017],[-119.20507,40.78019],[-119.20535,40.78022],[-119.20564,40.78025],[-119.20592,40.78029],[-119.2062,40.78034],[-119.20648,40.78039],[-119.20676,40.78046],[-119.20703,40.78052],[-119.2073,40.7806],[-119.20757,40.78068],[-119.20784,40.78077],[-119.2081,40.78086],[-119.20835,40.78097],[-119.2086,40.78107],[-119.20885,40.78119],[-119.20888,40.7812],[-119.20889,40.78132],[-119.20891,40.78145],[-119.20893,40.78157],[-119.20897,40.78169],[-119.20902,40.78181],[-119.20907,40.78193],[-119.20914,40.78204],[-119.20921,40.78215],[-119.20929,40.78226],[-119.20938,40.78237],[-119.20947,40.78247],[-119.20958,40.78257],[-119.20967,40.78264],[-119.20409,40.78688]],[[-119.19742,40.78214],[-119.19743,40.78215],[-119.19744,40.78217],[-119.19745,40.78218],[-119.19745,40.78219],[-119.19745,40.78221],[-119.19744,40.78222],[-119.19744,40.78223],[-119.19743,40.78224],[-119.19742,40.78226],[-119.19741,40.78226],[-119.1974,40.78227],[-119.19721,40.78243],[-119.19721,40.78243],[-119.19702,40.7826],[-119.19702,40.7826],[-119.19684,40.78278],[-119.19684,40.78278],[-119.19667,40.78296],[-119.19667,40.78296],[-119.1965,40.78314],[-119.1965,40.78314],[-119.19634,40.78333],[-119.19634,40.78333],[-119.19625,40.78345],[-119.195,40.7829],[-119.19515,40.7827],[-119.19532,40.7825],[-119.1955,40.78231],[-119.19569,40.78212],[-119.19588,40.78193],[-119.19608,40.78175],[-119.19629,40.78157],[-119.1965,40.78139],[-119.19654,40.78137],[-119.19742,40.78214]],[[-119.19618,40.78354],[-119.19605,40.78371],[-119.19605,40.78372],[-119.19592,40.78391],[-119.19592,40.78392],[-119.1958,40.78412],[-119.19579,40.78412],[-119.19568,40.78432],[-119.19568,40.78432],[-119.19557,40.78453],[-119.19557,40.78453],[-119.19547,40.78474],[-119.19547,40.78474],[-119.19538,40.78495],[-119.19538,40.78495],[-119.19532,40.78511],[-119.19393,40.78483],[-119.19399,40.78465],[-119.19409,40.78442],[-119.19419,40.7842],[-119.1943,40.78398],[-119.19442,40.78376],[-119.19455,40.78354],[-119.19469,40.78333],[-119.19484,40.78312],[-119.19493,40.783],[-119.19618,40.78354]],[[-119.19474,40.78308],[-119.19474,40.78308],[-119.19459,40.78329],[-119.19459,40.78329],[-119.19446,40.7835],[-119.19446,40.78351],[-119.19433,40.78372],[-119.19432,40.78373],[-119.1942,40.78395],[-119.1942,40.78395],[-119.19409,40.78417],[-119.19409,40.78417],[-119.19399,40.7844],[-119.19398,40.7844],[-119.19389,40.78463],[-119.19389,40.78463],[-119.19382,40.78481],[-119.19295,40.78463],[-119.19302,40.78444],[-119.19312,40.7842],[-119.19323,40.78397],[-119.19334,40.78373],[-119.19347,40.7835],[-119.1936,40.78327],[-119.19375,40.78305],[-119.1939,40.78282],[-119.19405,40.78261],[-119.19483,40.78295],[-119.19474,40.78308]],[[-119.1938,40.78278],[-119.1938,40.78278],[-119.19365,40.78301],[-119.19365,40.78301],[-119.19351,40.78324],[-119.1935,40.78324],[-119.19337,40.78347],[-119.19337,40.78347],[-119.19324,40.7837],[-119.19324,40.7837],[-119.19313,40.78394],[-119.19313,40.78394],[-119.19302,40.78418],[-119.19302,40.78418],[-119.19292,40.78442],[-119.19292,40.78442],[-119.19285,40.78461],[-119.19197,40.78443],[-119.19205,40.78423],[-119.19215,40.78398],[-119.19226,40.78373],[-119.19238,40.78349],[-119.19251,40.78325],[-119.19265,40.78301],[-119.1928,40.78277],[-119.19295,40.78254],[-119.19311,40.78231],[-119.19318,40.78223],[-119.19396,40.78257],[-119.1938,40.78278]],[[-119.19302,40.78227],[-119.19302,40.78227],[-119.19286,40.7825],[-119.19286,40.7825],[-119.1927,40.78273],[-119.1927,40.78273],[-119.19255,40.78297],[-119.19255,40.78297],[-119.19241,40.78321],[-119.19241,40.78321],[-119.19228,40.78346],[-119.19228,40.78346],[-119.19216,40.78371],[-119.19216,40.78371],[-119.19205,40.78395],[-119.19205,40.78396],[-119.19194,40.78421],[-119.19194,40.78421],[-119.19187,40.78441],[-119.191,40.78423],[-119.19108,40.78402],[-119.19118,40.78376],[-119.1913,40.7835],[-119.19142,40.78325],[-119.19155,40.783],[-119.19169,40.78275],[-119.19185,40.7825],[-119.192,40.78226],[-119.19217,40.78202],[-119.1923,40.78184],[-119.19308,40.78219],[-119.19302,40.78227]],[[-119.19208,40.78198],[-119.19208,40.78198],[-119.19191,40.78222],[-119.19191,40.78222],[-119.19175,40.78246],[-119.19175,40.78247],[-119.1916,40.78271],[-119.1916,40.78271],[-119.19145,40.78296],[-119.19145,40.78297],[-119.19132,40.78322],[-119.19132,40.78322],[-119.19119,40.78348],[-119.19119,40.78348],[-119.19108,40.78374],[-119.19108,40.78374],[-119.19097,40.784],[-119.19097,40.784],[-119.19089,40.78421],[-119.19002,40.78403],[-119.1901,40.78381],[-119.19021,40.78354],[-119.19033,40.78328],[-119.19046,40.78301],[-119.19059,40.78275],[-119.19074,40.78249],[-119.19089,40.78224],[-119.19105,40.78198],[-119.19122,40.78173],[-119.1914,40.78149],[-119.19142,40.78146],[-119.19221,40.7818],[-119.19208,40.78198]],[[-119.19113,40.78169],[-119.19113,40.78169],[-119.19096,40.78195],[-119.19096,40.78195],[-119.19079,40.7822],[-119.19079,40.7822],[-119.19064,40.78246],[-119.19064,40.78246],[-119.19049,40.78272],[-119.19049,40.78272],[-119.19036,40.78298],[-119.19036,40.78298],[-119.19023,40.78325],[-119.19023,40.78325],[-119.19011,40.78352],[-119.19011,40.78352],[-119.19,40.78379],[-119.19,40.78379],[-119.18992,40.78401],[-119.18835,40.78369],[-119.18843,40.78346],[-119.18855,40.78317],[-119.18867,40.78289],[-119.1888,40.78261],[-119.18894,40.78234],[-119.18909,40.78206],[-119.18925,40.78179],[-119.18942,40.78152],[-119.18959,40.78126],[-119.18978,40.78099],[-119.18992,40.7808],[-119.19133,40.78142],[-119.19131,40.78145],[-119.19131,40.78145],[-119.19113,40.78169]],[[-119.18889,40.78223],[-119.18884,40.7823],[-119.18884,40.7823],[-119.1887,40.78258],[-119.1887,40.78258],[-119.18857,40.78286],[-119.18857,40.78286],[-119.18844,40.78315],[-119.18844,40.78315],[-119.18833,40.78343],[-119.18833,40.78343],[-119.18824,40.78367],[-119.18737,40.78349],[-119.18746,40.78325],[-119.18758,40.78296],[-119.1877,40.78266],[-119.18784,40.78238],[-119.18798,40.78209],[-119.18805,40.78196],[-119.18889,40.78223]],[[-119.18788,40.78206],[-119.18788,40.78206],[-119.18774,40.78235],[-119.18774,40.78235],[-119.1876,40.78264],[-119.1876,40.78264],[-119.18747,40.78293],[-119.18747,40.78293],[-119.18736,40.78323],[-119.18736,40.78323],[-119.18727,40.78347],[-119.18639,40.78329],[-119.18649,40.78304],[-119.18661,40.78274],[-119.18674,40.78244],[-119.18688,40.78214],[-119.18702,40.78185],[-119.18712,40.78167],[-119.18795,40.78193],[-119.18788,40.78206]],[[-119.18692,40.78182],[-119.18692,40.78182],[-119.18677,40.78211],[-119.18677,40.78211],[-119.18663,40.78241],[-119.18663,40.78241],[-119.1865,40.78271],[-119.1865,40.78271],[-119.18638,40.78302],[-119.18638,40.78302],[-119.18629,40.78327],[-119.18542,40.78309],[-119.18551,40.78283],[-119.18564,40.78252],[-119.18577,40.78221],[-119.18591,40.78191],[-119.18606,40.78161],[-119.18618,40.78137],[-119.18702,40.78164],[-119.18692,40.78182]],[[-119.18596,40.78158],[-119.18596,40.78158],[-119.18581,40.78188],[-119.18581,40.78188],[-119.18567,40.78219],[-119.18567,40.78219],[-119.18553,40.7825],[-119.18553,40.7825],[-119.18541,40.78281],[-119.18541,40.78281],[-119.18531,40.78307],[-119.18479,40.78296],[-119.18489,40.7827],[-119.18501,40.78238],[-119.18515,40.78207],[-119.18529,40.78176],[-119.18544,40.78145],[-119.18558,40.78119],[-119.18608,40.78134],[-119.18596,40.78158]],[[-119.18534,40.78142],[-119.18534,40.78142],[-119.18519,40.78173],[-119.18519,40.78173],[-119.18504,40.78204],[-119.18504,40.78204],[-119.18491,40.78236],[-119.18491,40.78236],[-119.18478,40.78268],[-119.18478,40.78268],[-119.18468,40.78294],[-119.18416,40.78284],[-119.18426,40.78257],[-119.18439,40.78225],[-119.18453,40.78193],[-119.18467,40.78161],[-119.18483,40.7813],[-119.18498,40.781],[-119.18548,40.78115],[-119.18534,40.78142]],[[-119.18504,40.78089],[-119.18516,40.78067],[-119.18534,40.78037],[-119.18553,40.78007],[-119.18573,40.77977],[-119.18594,40.77947],[-119.18615,40.77918],[-119.18617,40.77915],[-119.18664,40.77936],[-119.18645,40.77962],[-119.18645,40.77962],[-119.18624,40.77991],[-119.18624,40.77991],[-119.18605,40.78021],[-119.18604,40.78021],[-119.18586,40.7805],[-119.18586,40.78051],[-119.18568,40.78081],[-119.18568,40.78081],[-119.18554,40.78105],[-119.18504,40.78089]],[[-119.18624,40.77906],[-119.18637,40.77889],[-119.1866,40.7786],[-119.18684,40.77832],[-119.18709,40.77804],[-119.18734,40.77777],[-119.18761,40.7775],[-119.18766,40.77744],[-119.18809,40.77769],[-119.18785,40.77794],[-119.18785,40.77794],[-119.1876,40.77821],[-119.1876,40.77821],[-119.18735,40.77848],[-119.18735,40.77848],[-119.18711,40.77876],[-119.18711,40.77876],[-119.18688,40.77904],[-119.18688,40.77904],[-119.18671,40.77926],[-119.18624,40.77906]],[[-119.18775,40.77735],[-119.18788,40.77723],[-119.18815,40.77697],[-119.18844,40.77671],[-119.18873,40.77646],[-119.18903,40.77621],[-119.18933,40.77597],[-119.18944,40.77589],[-119.18982,40.77618],[-119.18953,40.77641],[-119.18953,40.77641],[-119.18923,40.77665],[-119.18923,40.77665],[-119.18894,40.7769],[-119.18894,40.7769],[-119.18866,40.77715],[-119.18866,40.77715],[-119.18838,40.77741],[-119.18838,40.77741],[-119.18818,40.7776],[-119.18775,40.77735]],[[-119.18954,40.77581],[-119.18965,40.77573],[-119.18996,40.7755],[-119.19029,40.77527],[-119.19062,40.77505],[-119.19096,40.77484],[-119.1913,40.77463],[-119.19146,40.77453],[-119.19179,40.77486],[-119.19145,40.77506],[-119.19145,40.77506],[-119.19112,40.77527],[-119.19112,40.77527],[-119.19079,40.77549],[-119.19079,40.77549],[-119.19046,40.77571],[-119.19046,40.77571],[-119.19015,40.77594],[-119.19014,40.77594],[-119.18992,40.7761],[-119.18954,40.77581]],[[-119.19158,40.77447],[-119.19165,40.77442],[-119.19201,40.77422],[-119.19237,40.77403],[-119.19273,40.77384],[-119.19311,40.77366],[-119.19348,40.77348],[-119.19372,40.77338],[-119.19399,40.77373],[-119.19397,40.77374],[-119.19397,40.77375],[-119.19359,40.77391],[-119.19359,40.77392],[-119.19322,40.77409],[-119.19322,40.77409],[-119.19286,40.77427],[-119.19286,40.77427],[-119.1925,40.77446],[-119.1925,40.77446],[-119.19214,40.77466],[-119.19214,40.77466],[-119.19191,40.77479],[-119.19158,40.77447]],[[-119.19381,40.77334],[-119.19386,40.77332],[-119.19425,40.77315],[-119.19464,40.773],[-119.19503,40.77285],[-119.19543,40.7727],[-119.19583,40.77256],[-119.19616,40.77246],[-119.19636,40.77284],[-119.19631,40.77286],[-119.19631,40.77286],[-119.19591,40.77299],[-119.19591,40.77299],[-119.19551,40.77313],[-119.19551,40.77313],[-119.19512,40.77327],[-119.19512,40.77327],[-119.19473,40.77342],[-119.19473,40.77342],[-119.19435,40.77358],[-119.19435,40.77358],[-119.19409,40.77369],[-119.19381,40.77334]],[[-119.19622,40.77244],[-119.19624,40.77243],[-119.19665,40.77231],[-119.19706,40.77219],[-119.19748,40.77208],[-119.1979,40.77198],[-119.19832,40.77188],[-119.1987,40.7718],[-119.19884,40.7722],[-119.19878,40.77221],[-119.19878,40.77221],[-119.19836,40.7723],[-119.19836,40.7723],[-119.19795,40.7724],[-119.19795,40.7724],[-119.19753,40.7725],[-119.19753,40.7725],[-119.19712,40.77261],[-119.19712,40.77261],[-119.19671,40.77273],[-119.19671,40.77273],[-119.19643,40.77282],[-119.19622,40.77244]],[[-119.1988,40.77178],[-119.19918,40.77171],[-119.19961,40.77163],[-119.20004,40.77156],[-119.20047,40.7715],[-119.20091,40.77144],[-119.20134,40.77139],[-119.20136,40.77139],[-119.20143,40.7718],[-119.20135,40.77181],[-119.20135,40.77181],[-119.20092,40.77186],[-119.20091,40.77186],[-119.20049,40.77191],[-119.20048,40.77191],[-119.20006,40.77198],[-119.20006,40.77198],[-119.19963,40.77205],[-119.19963,40.77205],[-119.19921,40.77212],[-119.1992,40.77212],[-119.19894,40.77218],[-119.1988,40.77178]],[[-119.20143,40.77139],[-119.20178,40.77135],[-119.20222,40.77132],[-119.20266,40.77129],[-119.2031,40.77127],[-119.20354,40.77126],[-119.20398,40.77125],[-119.20402,40.77125],[-119.20402,40.77167],[-119.20396,40.77167],[-119.20396,40.77167],[-119.20352,40.77167],[-119.20352,40.77167],[-119.20309,40.77168],[-119.20308,40.77168],[-119.20265,40.77171],[-119.20265,40.77171],[-119.20221,40.77173],[-119.20221,40.77173],[-119.20178,40.77177],[-119.20178,40.77177],[-119.2015,40.77179],[-119.20143,40.77139]],[[-119.20417,40.77125],[-119.20442,40.77126],[-119.20487,40.77126],[-119.20531,40.77128],[-119.20575,40.7713],[-119.20619,40.77133],[-119.20663,40.77137],[-119.20675,40.77139],[-119.20668,40.77179],[-119.20657,40.77178],[-119.20657,40.77178],[-119.20614,40.77174],[-119.20614,40.77174],[-119.2057,40.77171],[-119.2057,40.77171],[-119.20527,40.77169],[-119.20527,40.77169],[-119.20483,40.77168],[-119.20483,40.77168],[-119.20439,40.77167],[-119.20439,40.77167],[-119.20417,40.77167],[-119.20417,40.77125]],[[-119.20683,40.77139],[-119.20706,40.77142],[-119.2075,40.77147],[-119.20793,40.77153],[-119.20837,40.77159],[-119.2088,40.77167],[-119.20923,40.77175],[-119.20939,40.77178],[-119.20925,40.77218],[-119.20914,40.77215],[-119.20914,40.77215],[-119.20872,40.77208],[-119.20872,40.77207],[-119.20829,40.772],[-119.20829,40.772],[-119.20786,40.77194],[-119.20786,40.77194],[-119.20743,40.77188],[-119.20743,40.77188],[-119.207,40.77183],[-119.207,40.77183],[-119.20675,40.7718],[-119.20683,40.77139]],[[-119.20949,40.7718],[-119.20965,40.77183],[-119.21008,40.77193],[-119.2105,40.77203],[-119.21092,40.77213],[-119.21133,40.77225],[-119.21174,40.77237],[-119.21196,40.77244],[-119.21176,40.77282],[-119.21163,40.77278],[-119.21163,40.77278],[-119.21122,40.77266],[-119.21122,40.77266],[-119.21081,40.77254],[-119.21081,40.77254],[-119.2104,40.77244],[-119.2104,40.77244],[-119.20998,40.77234],[-119.20998,40.77234],[-119.20956,40.77224],[-119.20956,40.77224],[-119.20935,40.7722],[-119.20949,40.7718]],[[-119.21203,40.77246],[-119.21215,40.7725],[-119.21255,40.77263],[-119.21296,40.77277],[-119.21335,40.77292],[-119.21374,40.77307],[-119.21413,40.77323],[-119.21436,40.77333],[-119.21409,40.77369],[-119.21398,40.77364],[-119.21398,40.77364],[-119.2136,40.77348],[-119.2136,40.77348],[-119.21322,40.77333],[-119.21321,40.77333],[-119.21282,40.77318],[-119.21282,40.77318],[-119.21243,40.77304],[-119.21243,40.77304],[-119.21203,40.77291],[-119.21203,40.77291],[-119.21182,40.77284],[-119.21203,40.77246]],[[-119.21461,40.77328],[-119.21461,40.77328],[-119.21457,40.77327],[-119.2154,40.77218],[-119.21545,40.7722],[-119.21553,40.77222],[-119.21561,40.77223],[-119.21569,40.77223],[-119.21578,40.77223],[-119.21586,40.77222],[-119.21594,40.7722],[-119.21601,40.77217],[-119.21608,40.77214],[-119.21615,40.77211],[-119.21621,40.77206],[-119.21626,40.77202],[-119.21631,40.77197],[-119.21635,40.77191],[-119.21638,40.77185],[-119.2164,40.77179],[-119.21641,40.77173],[-119.21641,40.77171],[-119.21645,40.77171],[-119.21659,40.77173],[-119.21674,40.77175],[-119.21688,40.77178],[-119.21703,40.77181],[-119.21716,40.77185],[-119.2173,40.7719],[-119.21743,40.77195],[-119.21756,40.77201],[-119.21768,40.77207],[-119.2178,40.77214],[-119.21791,40.77221],[-119.21802,40.77229],[-119.22056,40.77422],[-119.21592,40.77391],[-119.21574,40.77382],[-119.21537,40.77363],[-119.21499,40.77345],[-119.21461,40.77328]],[[-119.22059,40.77433],[-119.21877,40.77572],[-119.21851,40.77552],[-119.21818,40.77529],[-119.21785,40.77506],[-119.21752,40.77484],[-119.21751,40.77484],[-119.21717,40.77462],[-119.21682,40.77441],[-119.21647,40.77421],[-119.21615,40.77404],[-119.22059,40.77433]],[[-119.22069,40.77441],[-119.22084,40.77571],[-119.21894,40.77584],[-119.21888,40.77579],[-119.22069,40.77441]],[[-119.22084,40.77443],[-119.23209,40.78298],[-119.23221,40.78305],[-119.23233,40.78312],[-119.23246,40.78318],[-119.2326,40.78323],[-119.23267,40.78326],[-119.22421,40.78282],[-119.22416,40.78269],[-119.22404,40.78237],[-119.2239,40.78204],[-119.22376,40.78172],[-119.22361,40.7814],[-119.22361,40.7814],[-119.22345,40.78109],[-119.22328,40.78078],[-119.2231,40.78047],[-119.22291,40.78016],[-119.22272,40.77985],[-119.22252,40.77955],[-119.2223,40.77926],[-119.22217,40.77908],[-119.2236,40.77846],[-119.22361,40.77847],[-119.22367,40.77852],[-119.22373,40.77856],[-119.2238,40.7786],[-119.22387,40.77863],[-119.22394,40.77865],[-119.22402,40.77867],[-119.2241,40.77868],[-119.22419,40.77868],[-119.22427,40.77868],[-119.22435,40.77867],[-119.22443,40.77865],[-119.2245,40.77863],[-119.22458,40.7786],[-119.22464,40.77856],[-119.2247,40.77852],[-119.22476,40.77847],[-119.2248,40.77842],[-119.22484,40.77836],[-119.22487,40.77831],[-119.22489,40.77824],[-119.22491,40.77818],[-119.22491,40.77812],[-119.2249,40.77806],[-119.22488,40.778],[-119.22486,40.77794],[-119.22482,40.77788],[-119.22478,40.77783],[-119.22473,40.77778],[-119.22467,40.77773],[-119.22461,40.77769],[-119.22454,40.77766],[-119.22447,40.77763],[-119.22439,40.77761],[-119.22431,40.77759],[-119.22423,40.77759],[-119.22414,40.77759],[-119.22406,40.77759],[-119.22398,40.77761],[-119.2239,40.77763],[-119.22383,40.77766],[-119.22376,40.77769],[-119.2237,40.77773],[-119.22364,40.77778],[-119.22359,40.77783],[-119.22355,40.77788],[-119.22351,40.77794],[-119.22349,40.778],[-119.22347,40.77806],[-119.22346,40.77812],[-119.22347,40.77818],[-119.22348,40.77824],[-119.2235,40.77831],[-119.22353,40.77836],[-119.2221,40.77899],[-119.22208,40.77896],[-119.22208,40.77896],[-119.22185,40.77867],[-119.22162,40.77838],[-119.22137,40.7781],[-119.22125,40.77797],[-119.22084,40.77443]],[[-119.2241,40.78305],[-119.22421,40.78338],[-119.2243,40.78371],[-119.22439,40.78403],[-119.22447,40.78436],[-119.22454,40.7847],[-119.22457,40.78488],[-119.22403,40.78493],[-119.224,40.78474],[-119.224,40.78474],[-119.22393,40.78441],[-119.22393,40.78441],[-119.22385,40.78409],[-119.22385,40.78409],[-119.22377,40.78376],[-119.22377,40.78376],[-119.22367,40.78344],[-119.22367,40.78344],[-119.22357,40.78312],[-119.22356,40.78312],[-119.22354,40.78304],[-119.22406,40.78293],[-119.2241,40.78305]],[[-119.22346,40.78314],[-119.22356,40.78346],[-119.22366,40.78378],[-119.22375,40.7841],[-119.22382,40.78443],[-119.22389,40.78475],[-119.22392,40.78494],[-119.22339,40.785],[-119.22335,40.7848],[-119.22335,40.7848],[-119.22328,40.78448],[-119.22328,40.78448],[-119.22321,40.78416],[-119.22321,40.78416],[-119.22312,40.78384],[-119.22312,40.78384],[-119.22303,40.78352],[-119.22303,40.78352],[-119.22292,40.7832],[-119.22292,40.7832],[-119.22291,40.78316],[-119.22343,40.78306],[-119.22346,40.78314]],[[-119.22404,40.78499],[-119.22458,40.78493],[-119.2246,40.78503],[-119.22464,40.78536],[-119.22468,40.7857],[-119.22472,40.78603],[-119.22474,40.78637],[-119.22475,40.7867],[-119.22475,40.7869],[-119.22421,40.7869],[-119.22421,40.78673],[-119.22421,40.78672],[-119.2242,40.78639],[-119.2242,40.78639],[-119.22418,40.78606],[-119.22418,40.78606],[-119.22415,40.78573],[-119.22415,40.78573],[-119.22411,40.7854],[-119.22411,40.7854],[-119.22406,40.78507],[-119.22406,40.78507],[-119.22404,40.78499]],[[-119.22395,40.78508],[-119.224,40.78541],[-119.22404,40.78574],[-119.22407,40.78607],[-119.22409,40.7864],[-119.2241,40.78673],[-119.2241,40.7869],[-119.22356,40.7869],[-119.22356,40.78675],[-119.22356,40.78675],[-119.22355,40.78642],[-119.22355,40.78642],[-119.22353,40.7861],[-119.22353,40.7861],[-119.2235,40.78577],[-119.2235,40.78577],[-119.22346,40.78545],[-119.22346,40.78545],[-119.22341,40.78512],[-119.22341,40.78512],[-119.2234,40.78505],[-119.22393,40.785],[-119.22395,40.78508]],[[-119.2233,40.78513],[-119.22335,40.78546],[-119.22339,40.78578],[-119.22342,40.7861],[-119.22344,40.78643],[-119.22345,40.78675],[-119.22345,40.7869],[-119.22255,40.7869],[-119.22255,40.78689],[-119.22255,40.78689],[-119.22254,40.78658],[-119.22254,40.78658],[-119.22253,40.78626],[-119.22253,40.78626],[-119.2225,40.78594],[-119.2225,40.78594],[-119.22247,40.78563],[-119.22247,40.78563],[-119.22242,40.78531],[-119.22242,40.78531],[-119.22239,40.78515],[-119.22329,40.78506],[-119.2233,40.78513]],[[-119.22231,40.78532],[-119.22236,40.78563],[-119.22239,40.78595],[-119.22242,40.78626],[-119.22243,40.78658],[-119.22244,40.78689],[-119.22244,40.7869],[-119.22184,40.7869],[-119.22182,40.78686],[-119.2218,40.78682],[-119.22176,40.78678],[-119.22172,40.78675],[-119.22168,40.78672],[-119.22162,40.7867],[-119.22157,40.78669],[-119.22153,40.78668],[-119.22152,40.78641],[-119.22152,40.78641],[-119.2215,40.78611],[-119.2215,40.78611],[-119.22147,40.7858],[-119.22147,40.7858],[-119.22143,40.78549],[-119.22143,40.78549],[-119.22139,40.78525],[-119.22229,40.78516],[-119.22231,40.78532]],[[-119.22132,40.7855],[-119.22136,40.78581],[-119.22139,40.78611],[-119.22141,40.78642],[-119.22142,40.78668],[-119.2214,40.78669],[-119.22134,40.7867],[-119.22129,40.78672],[-119.22124,40.78675],[-119.2212,40.78678],[-119.22117,40.78682],[-119.22115,40.78686],[-119.22113,40.7869],[-119.22053,40.7869],[-119.22053,40.78686],[-119.22053,40.78686],[-119.22052,40.78656],[-119.22052,40.78656],[-119.2205,40.78626],[-119.2205,40.78626],[-119.22047,40.78597],[-119.22047,40.78596],[-119.22044,40.78567],[-119.22044,40.78567],[-119.22039,40.78537],[-119.22039,40.78537],[-119.22039,40.78535],[-119.22128,40.78526],[-119.22132,40.7855]],[[-119.22029,40.78538],[-119.22033,40.78568],[-119.22037,40.78597],[-119.22039,40.78627],[-119.22041,40.78656],[-119.22042,40.78686],[-119.22042,40.7869],[-119.21879,40.7869],[-119.21879,40.78683],[-119.21879,40.78683],[-119.21878,40.78655],[-119.21878,40.78655],[-119.21876,40.78626],[-119.21876,40.78626],[-119.21874,40.78598],[-119.21874,40.78598],[-119.2187,40.7857],[-119.2187,40.7857],[-119.21865,40.78542],[-119.21865,40.78542],[-119.2186,40.78514],[-119.2186,40.78514],[-119.21853,40.78486],[-119.21853,40.78486],[-119.21846,40.78458],[-119.21846,40.78458],[-119.21837,40.7843],[-119.21837,40.7843],[-119.2183,40.7841],[-119.21987,40.78378],[-119.21992,40.78392],[-119.22001,40.78421],[-119.2201,40.7845],[-119.22017,40.78479],[-119.22023,40.78509],[-119.22029,40.78538]],[[-119.21827,40.78432],[-119.21835,40.7846],[-119.21842,40.78487],[-119.21849,40.78515],[-119.21855,40.78543],[-119.21859,40.78571],[-119.21863,40.78599],[-119.21866,40.78627],[-119.21867,40.78655],[-119.21868,40.78683],[-119.21868,40.7869],[-119.21778,40.7869],[-119.21778,40.78687],[-119.21778,40.78687],[-119.21777,40.7866],[-119.21777,40.78659],[-119.21776,40.78632],[-119.21776,40.78632],[-119.21773,40.78605],[-119.21773,40.78605],[-119.21769,40.78578],[-119.21769,40.78577],[-119.21765,40.7855],[-119.21765,40.7855],[-119.21759,40.78523],[-119.21759,40.78523],[-119.21753,40.78496],[-119.21753,40.78496],[-119.21745,40.78469],[-119.21745,40.78469],[-119.21737,40.78443],[-119.21737,40.78443],[-119.21733,40.7843],[-119.2182,40.78412],[-119.21827,40.78432]],[[-119.21727,40.78445],[-119.21735,40.78471],[-119.21742,40.78498],[-119.21749,40.78525],[-119.21754,40.78551],[-119.21759,40.78578],[-119.21762,40.78605],[-119.21765,40.78633],[-119.21766,40.7866],[-119.21767,40.78687],[-119.21767,40.7869],[-119.21677,40.7869],[-119.21676,40.78664],[-119.21676,40.78664],[-119.21675,40.78638],[-119.21675,40.78638],[-119.21672,40.78612],[-119.21672,40.78611],[-119.21669,40.78585],[-119.21669,40.78585],[-119.21664,40.78559],[-119.21664,40.78559],[-119.21659,40.78533],[-119.21659,40.78533],[-119.21653,40.78507],[-119.21653,40.78507],[-119.21645,40.78481],[-119.21645,40.78481],[-119.21637,40.78456],[-119.21637,40.78456],[-119.21635,40.7845],[-119.21722,40.78432],[-119.21727,40.78445]],[[-119.21627,40.78458],[-119.21635,40.78483],[-119.21642,40.78509],[-119.21648,40.78534],[-119.21654,40.7856],[-119.21658,40.78586],[-119.21661,40.78612],[-119.21664,40.78638],[-119.21666,40.78664],[-119.21666,40.7869],[-119.21606,40.7869],[-119.21604,40.78686],[-119.21602,40.78682],[-119.21598,40.78678],[-119.21594,40.78675],[-119.2159,40.78672],[-119.21585,40.7867],[-119.21579,40.78669],[-119.21575,40.78668],[-119.21574,40.78643],[-119.21574,40.78643],[-119.21571,40.78618],[-119.21571,40.78618],[-119.21568,40.78593],[-119.21568,40.78593],[-119.21564,40.78568],[-119.21564,40.78568],[-119.21559,40.78543],[-119.21559,40.78543],[-119.21552,40.78518],[-119.21552,40.78518],[-119.21545,40.78494],[-119.21545,40.78494],[-119.21537,40.7847],[-119.21625,40.78452],[-119.21627,40.78458]],[[-119.21535,40.78495],[-119.21542,40.7852],[-119.21548,40.78544],[-119.21553,40.78569],[-119.21557,40.78594],[-119.21561,40.78619],[-119.21563,40.78644],[-119.21565,40.78668],[-119.21562,40.78669],[-119.21556,40.7867],[-119.21551,40.78672],[-119.21547,40.78675],[-119.21543,40.78678],[-119.21539,40.78682],[-119.21537,40.78686],[-119.21536,40.78688],[-119.21475,40.78685],[-119.21474,40.78673],[-119.21474,40.78673],[-119.21473,40.78649],[-119.21473,40.78649],[-119.21471,40.78625],[-119.21471,40.78625],[-119.21467,40.78601],[-119.21467,40.78601],[-119.21463,40.78577],[-119.21463,40.78577],[-119.21458,40.78553],[-119.21458,40.78553],[-119.21452,40.7853],[-119.21452,40.7853],[-119.21445,40.78506],[-119.21445,40.78506],[-119.2144,40.7849],[-119.21527,40.78472],[-119.21535,40.78495]],[[-119.21435,40.78508],[-119.21442,40.78531],[-119.21448,40.78555],[-119.21453,40.78578],[-119.21457,40.78602],[-119.2146,40.78626],[-119.21462,40.78649],[-119.21464,40.78673],[-119.21464,40.78684],[-119.21329,40.78677],[-119.21327,40.78677],[-119.21325,40.78677],[-119.21324,40.78676],[-119.21322,40.78675],[-119.21321,40.78674],[-119.2132,40.78673],[-119.21319,40.78672],[-119.21319,40.7867],[-119.21319,40.78669],[-119.21319,40.78669],[-119.21319,40.78665],[-119.21319,40.78665],[-119.21317,40.78643],[-119.21317,40.78643],[-119.21314,40.78621],[-119.21314,40.7862],[-119.2131,40.78598],[-119.2131,40.78598],[-119.21306,40.78576],[-119.21306,40.78576],[-119.213,40.78554],[-119.213,40.78554],[-119.21294,40.78533],[-119.21294,40.78533],[-119.2129,40.7852],[-119.21429,40.78492],[-119.21435,40.78508]],[[-119.21287,40.78512],[-119.21287,40.78511],[-119.21286,40.78511],[-119.21278,40.7849],[-119.21278,40.7849],[-119.21269,40.78469],[-119.21269,40.78468],[-119.21259,40.78448],[-119.21259,40.78448],[-119.21248,40.78427],[-119.21248,40.78427],[-119.21236,40.78407],[-119.21236,40.78406],[-119.21224,40.78387],[-119.21224,40.78386],[-119.2121,40.78367],[-119.2121,40.78367],[-119.21206,40.78361],[-119.21206,40.78361],[-119.21205,40.78359],[-119.21205,40.78358],[-119.21205,40.78357],[-119.21205,40.78355],[-119.21206,40.78354],[-119.21207,40.78353],[-119.21208,40.78352],[-119.21209,40.78351],[-119.21326,40.783],[-119.21333,40.78309],[-119.21348,40.7833],[-119.21362,40.78351],[-119.21375,40.78373],[-119.21387,40.78395],[-119.21398,40.78417],[-119.21409,40.7844],[-119.21418,40.78462],[-119.21427,40.78484],[-119.21287,40.78512]],[[-119.21284,40.78304],[-119.21269,40.78308],[-119.21254,40.78312],[-119.21239,40.78315],[-119.21223,40.78318],[-119.21207,40.7832],[-119.21191,40.78321],[-119.21175,40.78321],[-119.21159,40.78321],[-119.21143,40.7832],[-119.21127,40.78318],[-119.21112,40.78315],[-119.21096,40.78312],[-119.21081,40.78308],[-119.21066,40.78304],[-119.21052,40.78299],[-119.21037,40.78293],[-119.21024,40.78286],[-119.21011,40.78279],[-119.21066,40.78223],[-119.21077,40.78228],[-119.21088,40.78234],[-119.21099,40.78238],[-119.21111,40.78242],[-119.21124,40.78245],[-119.21136,40.78248],[-119.21149,40.78249],[-119.21162,40.7825],[-119.21175,40.78251],[-119.21188,40.7825],[-119.21201,40.78249],[-119.21214,40.78248],[-119.21227,40.78245],[-119.21239,40.78242],[-119.21251,40.78238],[-119.21263,40.78234],[-119.21269,40.78231],[-119.21284,40.78248],[-119.21301,40.78268],[-119.21318,40.78288],[-119.21319,40.7829],[-119.21313,40.78293],[-119.21299,40.78298],[-119.21284,40.78304]],[[-119.20957,40.78238],[-119.20955,40.78236],[-119.20946,40.78226],[-119.20937,40.78215],[-119.2093,40.78205],[-119.20923,40.78194],[-119.20918,40.78182],[-119.20913,40.78171],[-119.20909,40.78159],[-119.20906,40.78147],[-119.20904,40.78135],[-119.20902,40.78123],[-119.20902,40.7811],[-119.20903,40.78098],[-119.20904,40.78086],[-119.20907,40.78074],[-119.20911,40.78062],[-119.20915,40.7805],[-119.2092,40.78039],[-119.20926,40.78028],[-119.20932,40.78019],[-119.20931,40.78019],[-119.20943,40.78004],[-119.20945,40.78005],[-119.20972,40.78018],[-119.20998,40.78031],[-119.21021,40.78042],[-119.21019,40.78045],[-119.21013,40.78054],[-119.21007,40.78063],[-119.21003,40.78072],[-119.20999,40.78082],[-119.20997,40.78091],[-119.20995,40.78101],[-119.20995,40.78111],[-119.20995,40.78121],[-119.20996,40.78131],[-119.20998,40.78141],[-119.21001,40.7815],[-119.21005,40.7816],[-119.2101,40.78169],[-119.21016,40.78178],[-119.21022,40.78186],[-119.21029,40.78195],[-119.21031,40.78196],[-119.20957,40.78238]],[[-119.20863,40.78088],[-119.20861,40.78089],[-119.2086,40.7809],[-119.20859,40.7809],[-119.20857,40.78091],[-119.20855,40.78091],[-119.20853,40.78091],[-119.20852,40.78091],[-119.2085,40.7809],[-119.2085,40.7809],[-119.20842,40.78087],[-119.20842,40.78087],[-119.20816,40.78077],[-119.20816,40.78077],[-119.2079,40.78067],[-119.20789,40.78067],[-119.20763,40.78058],[-119.20763,40.78058],[-119.20736,40.7805],[-119.20735,40.7805],[-119.20708,40.78042],[-119.20708,40.78042],[-119.2068,40.78035],[-119.2068,40.78035],[-119.20652,40.78029],[-119.20652,40.78029],[-119.2065,40.78028],[-119.20688,40.77922],[-119.20716,40.77929],[-119.20746,40.77936],[-119.20776,40.77944],[-119.20805,40.77952],[-119.20834,40.77962],[-119.20862,40.77972],[-119.2089,40.77982],[-119.20918,40.77993],[-119.2093,40.77999],[-119.20863,40.78088]],[[-119.2064,40.78026],[-119.20624,40.78023],[-119.20623,40.78023],[-119.20595,40.78018],[-119.20595,40.78018],[-119.20566,40.78014],[-119.20566,40.78014],[-119.20537,40.78011],[-119.20537,40.78011],[-119.20508,40.78008],[-119.20508,40.78008],[-119.20479,40.78006],[-119.20479,40.78006],[-119.2045,40.78004],[-119.2045,40.78004],[-119.20443,40.78004],[-119.20442,40.78004],[-119.2044,40.78004],[-119.20439,40.78003],[-119.20437,40.78003],[-119.20436,40.78002],[-119.20435,40.78001],[-119.20434,40.78],[-119.20434,40.77998],[-119.20433,40.77997],[-119.20424,40.77894],[-119.20439,40.77894],[-119.2047,40.77895],[-119.20501,40.77897],[-119.20532,40.77899],[-119.20563,40.77903],[-119.20594,40.77906],[-119.20625,40.77911],[-119.20656,40.77916],[-119.20677,40.7792],[-119.2064,40.78026]],[[-119.20385,40.77997],[-119.20385,40.77998],[-119.20385,40.77999],[-119.20384,40.78001],[-119.20383,40.78002],[-119.20381,40.78003],[-119.2038,40.78003],[-119.20378,40.78004],[-119.20376,40.78004],[-119.20374,40.78004],[-119.20374,40.78004],[-119.20362,40.78005],[-119.20362,40.78005],[-119.20333,40.78006],[-119.20332,40.78006],[-119.20303,40.78008],[-119.20303,40.78009],[-119.20274,40.78011],[-119.20274,40.78011],[-119.20245,40.78015],[-119.20245,40.78015],[-119.20217,40.78019],[-119.20216,40.7802],[-119.20188,40.78025],[-119.20188,40.78025],[-119.20179,40.78026],[-119.20142,40.7792],[-119.20159,40.77917],[-119.2019,40.77912],[-119.20221,40.77907],[-119.20251,40.77903],[-119.20282,40.779],[-119.20314,40.77897],[-119.20345,40.77895],[-119.20376,40.77894],[-119.20395,40.77894],[-119.20385,40.77997]],[[-119.20169,40.78029],[-119.2016,40.7803],[-119.2016,40.7803],[-119.20132,40.78037],[-119.20132,40.78037],[-119.20104,40.78044],[-119.20104,40.78044],[-119.20077,40.78052],[-119.20076,40.78052],[-119.20049,40.7806],[-119.20049,40.7806],[-119.20023,40.78069],[-119.20022,40.78069],[-119.19996,40.78079],[-119.19996,40.78079],[-119.1997,40.7809],[-119.1997,40.7809],[-119.19959,40.78094],[-119.19887,40.77999],[-119.19897,40.77995],[-119.19925,40.77984],[-119.19953,40.77973],[-119.19982,40.77963],[-119.2001,40.77954],[-119.2004,40.77945],[-119.20069,40.77937],[-119.20099,40.7793],[-119.20129,40.77923],[-119.20131,40.77922],[-119.20169,40.78029]],[[-119.1995,40.78099],[-119.19945,40.78101],[-119.19945,40.78101],[-119.1992,40.78112],[-119.1992,40.78112],[-119.19896,40.78125],[-119.19895,40.78125],[-119.19872,40.78137],[-119.19871,40.78138],[-119.19848,40.78151],[-119.19848,40.78151],[-119.19825,40.78165],[-119.19825,40.78165],[-119.19803,40.7818],[-119.19803,40.7818],[-119.19791,40.78188],[-119.19789,40.78189],[-119.19788,40.7819],[-119.19786,40.7819],[-119.19785,40.78191],[-119.19783,40.78191],[-119.19781,40.7819],[-119.1978,40.7819],[-119.19778,40.78189],[-119.19777,40.78189],[-119.19674,40.78121],[-119.19695,40.78106],[-119.19718,40.7809],[-119.19742,40.78075],[-119.19767,40.7806],[-119.19792,40.78046],[-119.19817,40.78032],[-119.19844,40.78019],[-119.1987,40.78007],[-119.19878,40.78003],[-119.1995,40.78099]],[[-119.19646,40.7813],[-119.19642,40.78134],[-119.19642,40.78134],[-119.19621,40.78151],[-119.19621,40.78151],[-119.196,40.78169],[-119.196,40.78169],[-119.1958,40.78188],[-119.19579,40.78188],[-119.1956,40.78207],[-119.1956,40.78207],[-119.19541,40.78226],[-119.19541,40.78226],[-119.19523,40.78246],[-119.19523,40.78246],[-119.19506,40.78266],[-119.19506,40.78266],[-119.1949,40.78286],[-119.19412,40.78252],[-119.19422,40.78239],[-119.1944,40.78218],[-119.19458,40.78197],[-119.19477,40.78176],[-119.19497,40.78156],[-119.19518,40.78137],[-119.19539,40.78118],[-119.19561,40.78099],[-119.19568,40.78094],[-119.19572,40.78096],[-119.19577,40.78098],[-119.19583,40.78099],[-119.19588,40.78099],[-119.19594,40.78099],[-119.196,40.78098],[-119.19605,40.78096],[-119.19606,40.78095],[-119.19646,40.7813]],[[-119.19531,40.78112],[-119.19531,40.78112],[-119.19509,40.78132],[-119.19509,40.78132],[-119.19488,40.78151],[-119.19488,40.78151],[-119.19468,40.78171],[-119.19468,40.78172],[-119.19449,40.78192],[-119.19449,40.78192],[-119.19431,40.78213],[-119.19431,40.78213],[-119.19413,40.78234],[-119.19413,40.78235],[-119.19403,40.78247],[-119.19325,40.78213],[-119.19329,40.78208],[-119.19347,40.78186],[-119.19365,40.78164],[-119.19385,40.78142],[-119.19405,40.78121],[-119.19426,40.781],[-119.19448,40.7808],[-119.19471,40.7806],[-119.19494,40.78041],[-119.19511,40.78028],[-119.19557,40.78058],[-119.19555,40.78062],[-119.19553,40.78066],[-119.19552,40.7807],[-119.19553,40.78075],[-119.19554,40.78079],[-119.19556,40.78083],[-119.19559,40.78087],[-119.1956,40.78088],[-119.19553,40.78094],[-119.19553,40.78094],[-119.19531,40.78112]],[[-119.19486,40.78035],[-119.19486,40.78036],[-119.19463,40.78055],[-119.19462,40.78055],[-119.1944,40.78075],[-119.1944,40.78075],[-119.19418,40.78095],[-119.19418,40.78095],[-119.19397,40.78116],[-119.19397,40.78116],[-119.19376,40.78137],[-119.19376,40.78138],[-119.19356,40.78159],[-119.19356,40.78159],[-119.19337,40.78181],[-119.19337,40.78181],[-119.19319,40.78204],[-119.19319,40.78204],[-119.19315,40.78209],[-119.19237,40.78175],[-119.19253,40.78155],[-119.19272,40.78132],[-119.19292,40.78109],[-119.19313,40.78087],[-119.19334,40.78065],[-119.19356,40.78044],[-119.19379,40.78023],[-119.19403,40.78003],[-119.19427,40.77983],[-119.19444,40.7797],[-119.19508,40.78018],[-119.19486,40.78035]],[[-119.1942,40.77977],[-119.1942,40.77977],[-119.19395,40.77997],[-119.19395,40.77997],[-119.19371,40.78018],[-119.19371,40.78018],[-119.19348,40.78039],[-119.19348,40.78039],[-119.19326,40.7806],[-119.19326,40.7806],[-119.19304,40.78082],[-119.19304,40.78082],[-119.19283,40.78104],[-119.19283,40.78104],[-119.19263,40.78127],[-119.19263,40.78127],[-119.19244,40.7815],[-119.19244,40.7815],[-119.19228,40.78171],[-119.1915,40.78136],[-119.19159,40.78124],[-119.19178,40.781],[-119.19199,40.78077],[-119.1922,40.78054],[-119.19241,40.78031],[-119.19264,40.78009],[-119.19287,40.77987],[-119.19311,40.77965],[-119.19336,40.77944],[-119.19362,40.77924],[-119.19373,40.77915],[-119.19437,40.77964],[-119.1942,40.77977]],[[-119.19354,40.77918],[-119.19354,40.77918],[-119.19328,40.77939],[-119.19328,40.77939],[-119.19303,40.7796],[-119.19303,40.7796],[-119.19279,40.77981],[-119.19279,40.77981],[-119.19256,40.78003],[-119.19256,40.78004],[-119.19233,40.78026],[-119.19233,40.78026],[-119.19211,40.78049],[-119.19211,40.78049],[-119.1919,40.78072],[-119.1919,40.78072],[-119.19169,40.78096],[-119.19169,40.78096],[-119.1915,40.7812],[-119.1915,40.7812],[-119.1914,40.78132],[-119.18999,40.7807],[-119.19017,40.78048],[-119.19038,40.78023],[-119.19059,40.77998],[-119.19082,40.77974],[-119.19105,40.7795],[-119.19129,40.77926],[-119.19153,40.77903],[-119.19179,40.77881],[-119.19205,40.77858],[-119.19231,40.77837],[-119.1925,40.77822],[-119.19365,40.77909],[-119.19354,40.77918]],[[-119.18983,40.78076],[-119.18968,40.78095],[-119.18968,40.78095],[-119.1895,40.78122],[-119.1895,40.78122],[-119.18932,40.78148],[-119.18932,40.78149],[-119.18915,40.78175],[-119.18915,40.78176],[-119.18899,40.78203],[-119.18899,40.78203],[-119.18894,40.78212],[-119.18811,40.78186],[-119.18814,40.78181],[-119.1883,40.78153],[-119.18847,40.78125],[-119.18865,40.78097],[-119.18884,40.7807],[-119.18903,40.78043],[-119.18905,40.78041],[-119.18983,40.78076]],[[-119.18874,40.78066],[-119.18874,40.78066],[-119.18855,40.78093],[-119.18855,40.78094],[-119.18837,40.78121],[-119.18837,40.78121],[-119.1882,40.78149],[-119.1882,40.78149],[-119.18804,40.78177],[-119.18804,40.78177],[-119.18801,40.78183],[-119.18717,40.78157],[-119.18718,40.78155],[-119.18735,40.78126],[-119.18752,40.78098],[-119.1877,40.78069],[-119.18789,40.78041],[-119.18809,40.78014],[-119.18817,40.78003],[-119.18895,40.78037],[-119.18894,40.78039],[-119.18894,40.78039],[-119.18874,40.78066]],[[-119.188,40.7801],[-119.188,40.7801],[-119.1878,40.78037],[-119.1878,40.78038],[-119.18761,40.78066],[-119.1876,40.78066],[-119.18742,40.78094],[-119.18742,40.78094],[-119.18725,40.78123],[-119.18725,40.78123],[-119.18708,40.78152],[-119.18708,40.78152],[-119.18707,40.78154],[-119.18624,40.78127],[-119.18639,40.78101],[-119.18657,40.78071],[-119.18675,40.78042],[-119.18695,40.78013],[-119.18715,40.77984],[-119.1873,40.77965],[-119.18808,40.77999],[-119.188,40.7801]],[[-119.18705,40.7798],[-119.18705,40.77981],[-119.18685,40.78009],[-119.18685,40.78009],[-119.18666,40.78038],[-119.18665,40.78038],[-119.18647,40.78068],[-119.18647,40.78068],[-119.18629,40.78097],[-119.18629,40.78097],[-119.18614,40.78124],[-119.18564,40.78108],[-119.18578,40.78084],[-119.18595,40.78054],[-119.18614,40.78024],[-119.18634,40.77995],[-119.18654,40.77966],[-119.18673,40.7794],[-119.1872,40.7796],[-119.18705,40.7798]],[[-119.18681,40.7793],[-119.18698,40.77908],[-119.1872,40.7788],[-119.18744,40.77853],[-119.18769,40.77825],[-119.18794,40.77799],[-119.18818,40.77774],[-119.18861,40.77799],[-119.18844,40.77816],[-119.18844,40.77816],[-119.18819,40.77842],[-119.18819,40.77842],[-119.18795,40.77869],[-119.18795,40.77869],[-119.18771,40.77896],[-119.18771,40.77896],[-119.18748,40.77924],[-119.18748,40.77924],[-119.18727,40.77951],[-119.18681,40.7793]],[[-119.18827,40.77765],[-119.18847,40.77746],[-119.18874,40.77721],[-119.18902,40.77695],[-119.18931,40.77671],[-119.18961,40.77647],[-119.1899,40.77624],[-119.19028,40.77653],[-119.19011,40.77667],[-119.19011,40.77667],[-119.18981,40.7769],[-119.18981,40.7769],[-119.18952,40.77715],[-119.18952,40.77715],[-119.18924,40.77739],[-119.18924,40.77739],[-119.18897,40.77764],[-119.18897,40.77764],[-119.1887,40.7779],[-119.1887,40.7779],[-119.1887,40.7779],[-119.18827,40.77765]],[[-119.19,40.77616],[-119.19022,40.776],[-119.19054,40.77577],[-119.19086,40.77555],[-119.19119,40.77534],[-119.19152,40.77513],[-119.19186,40.77492],[-119.19219,40.77525],[-119.19201,40.77535],[-119.19201,40.77535],[-119.19168,40.77556],[-119.19168,40.77556],[-119.19135,40.77577],[-119.19135,40.77577],[-119.19103,40.77599],[-119.19103,40.77599],[-119.19072,40.77621],[-119.19072,40.77621],[-119.19041,40.77643],[-119.19041,40.77644],[-119.19038,40.77645],[-119.19,40.77616]],[[-119.19197,40.77486],[-119.19221,40.77472],[-119.19256,40.77453],[-119.19292,40.77434],[-119.19328,40.77416],[-119.19365,40.77399],[-119.19402,40.77382],[-119.19405,40.77381],[-119.19432,40.77416],[-119.19413,40.77424],[-119.19413,40.77424],[-119.19377,40.77441],[-119.19376,40.77441],[-119.1934,40.77459],[-119.1934,40.77459],[-119.19305,40.77477],[-119.19305,40.77477],[-119.1927,40.77496],[-119.1927,40.77496],[-119.19235,40.77515],[-119.19235,40.77516],[-119.1923,40.77518],[-119.19197,40.77486]],[[-119.19414,40.77377],[-119.1944,40.77365],[-119.19478,40.7735],[-119.19517,40.77335],[-119.19556,40.7732],[-119.19595,40.77306],[-119.19635,40.77293],[-119.19641,40.77292],[-119.19661,40.7733],[-119.19642,40.77336],[-119.19642,40.77336],[-119.19603,40.77349],[-119.19603,40.77349],[-119.19564,40.77363],[-119.19564,40.77363],[-119.19526,40.77377],[-119.19526,40.77377],[-119.19488,40.77392],[-119.19488,40.77392],[-119.1945,40.77408],[-119.1945,40.77408],[-119.19441,40.77412],[-119.19414,40.77377]],[[-119.19647,40.7729],[-119.19675,40.77281],[-119.19716,40.77269],[-119.19757,40.77258],[-119.19798,40.77248],[-119.19839,40.77238],[-119.19881,40.77229],[-119.19886,40.77228],[-119.199,40.77268],[-119.19885,40.77271],[-119.19885,40.77271],[-119.19844,40.7728],[-119.19844,40.7728],[-119.19803,40.7729],[-119.19803,40.7729],[-119.19762,40.773],[-119.19762,40.773],[-119.19722,40.77311],[-119.19722,40.77311],[-119.19682,40.77323],[-119.19682,40.77323],[-119.19668,40.77328],[-119.19647,40.7729]],[[-119.19897,40.77226],[-119.19923,40.7722],[-119.19965,40.77213],[-119.20008,40.77206],[-119.2005,40.77199],[-119.20093,40.77194],[-119.20136,40.77189],[-119.20145,40.77188],[-119.20152,40.77229],[-119.20137,40.77231],[-119.20137,40.77231],[-119.20094,40.77235],[-119.20094,40.77235],[-119.20052,40.77241],[-119.20052,40.77241],[-119.2001,40.77247],[-119.2001,40.77247],[-119.19968,40.77254],[-119.19968,40.77255],[-119.19926,40.77262],[-119.19926,40.77262],[-119.19911,40.77265],[-119.19897,40.77226]],[[-119.20152,40.77188],[-119.20179,40.77185],[-119.20222,40.77181],[-119.20266,40.77179],[-119.20309,40.77177],[-119.20352,40.77175],[-119.20396,40.77175],[-119.20402,40.77175],[-119.20402,40.77216],[-119.20393,40.77216],[-119.20393,40.77216],[-119.2035,40.77217],[-119.2035,40.77217],[-119.20308,40.77218],[-119.20307,40.77218],[-119.20265,40.7722],[-119.20265,40.7722],[-119.20222,40.77223],[-119.20222,40.77223],[-119.20179,40.77226],[-119.20179,40.77226],[-119.20159,40.77228],[-119.20152,40.77188]],[[-119.20417,40.77175],[-119.20439,40.77175],[-119.20483,40.77176],[-119.20526,40.77177],[-119.20569,40.7718],[-119.20613,40.77183],[-119.20656,40.77186],[-119.20667,40.77188],[-119.2066,40.77228],[-119.2065,40.77227],[-119.2065,40.77227],[-119.20608,40.77224],[-119.20607,40.77224],[-119.20565,40.77221],[-119.20565,40.77221],[-119.20522,40.77218],[-119.20522,40.77218],[-119.20479,40.77217],[-119.20479,40.77217],[-119.20436,40.77216],[-119.20436,40.77216],[-119.20417,40.77216],[-119.20417,40.77175]],[[-119.20674,40.77188],[-119.20699,40.77191],[-119.20742,40.77196],[-119.20784,40.77202],[-119.20827,40.77208],[-119.20869,40.77216],[-119.20911,40.77223],[-119.20922,40.77226],[-119.20908,40.77265],[-119.20903,40.77264],[-119.20903,40.77264],[-119.20861,40.77256],[-119.20861,40.77256],[-119.20819,40.77249],[-119.20819,40.77249],[-119.20777,40.77243],[-119.20777,40.77243],[-119.20735,40.77237],[-119.20735,40.77237],[-119.20693,40.77232],[-119.20693,40.77232],[-119.20667,40.77229],[-119.20674,40.77188]],[[-119.20932,40.77228],[-119.20953,40.77232],[-119.20995,40.77241],[-119.21036,40.77251],[-119.21077,40.77262],[-119.21118,40.77273],[-119.21159,40.77285],[-119.21172,40.7729],[-119.21151,40.77328],[-119.21147,40.77326],[-119.21147,40.77326],[-119.21107,40.77314],[-119.21107,40.77314],[-119.21067,40.77303],[-119.21067,40.77303],[-119.21026,40.77292],[-119.21026,40.77292],[-119.20985,40.77282],[-119.20985,40.77282],[-119.20944,40.77273],[-119.20944,40.77273],[-119.20918,40.77268],[-119.20932,40.77228]],[[-119.21178,40.77292],[-119.21199,40.77298],[-119.21238,40.77311],[-119.21278,40.77325],[-119.21317,40.7734],[-119.21355,40.77355],[-119.21393,40.77371],[-119.21403,40.77376],[-119.21376,40.77411],[-119.2134,40.77396],[-119.2134,40.77396],[-119.21303,40.77381],[-119.21302,40.77381],[-119.21264,40.77366],[-119.21264,40.77366],[-119.21225,40.77352],[-119.21225,40.77352],[-119.21186,40.77339],[-119.21186,40.77339],[-119.21157,40.7733],[-119.21178,40.77292]],[[-119.21436,40.77381],[-119.21436,40.77381],[-119.21421,40.77374],[-119.21448,40.77338],[-119.21452,40.7734],[-119.21489,40.77357],[-119.21527,40.77375],[-119.21564,40.77393],[-119.216,40.77413],[-119.21636,40.77432],[-119.21661,40.77447],[-119.21628,40.77479],[-119.21618,40.77473],[-119.21617,40.77473],[-119.21582,40.77453],[-119.21582,40.77453],[-119.21547,40.77434],[-119.21546,40.77434],[-119.2151,40.77416],[-119.2151,40.77416],[-119.21474,40.77398],[-119.21473,40.77398],[-119.21436,40.77381]],[[-119.21672,40.77453],[-119.21706,40.77473],[-119.2174,40.77494],[-119.21773,40.77516],[-119.21806,40.77539],[-119.21838,40.77562],[-119.21865,40.77581],[-119.21826,40.7761],[-119.21816,40.77603],[-119.21816,40.77603],[-119.21785,40.7758],[-119.21784,40.7758],[-119.21752,40.77557],[-119.21752,40.77557],[-119.2172,40.77535],[-119.21719,40.77535],[-119.21686,40.77514],[-119.21686,40.77514],[-119.21652,40.77493],[-119.21652,40.77493],[-119.21639,40.77486],[-119.21672,40.77453]],[[-119.22086,40.77582],[-119.22108,40.77779],[-119.22086,40.77755],[-119.22059,40.77728],[-119.22031,40.77701],[-119.22003,40.77675],[-119.22003,40.77675],[-119.21974,40.7765],[-119.21944,40.77624],[-119.21914,40.776],[-119.21907,40.77594],[-119.22086,40.77582]],[[-119.22071,40.77763],[-119.22097,40.7779],[-119.22122,40.77818],[-119.22146,40.77846],[-119.2217,40.77874],[-119.22193,40.77903],[-119.22195,40.77906],[-119.22148,40.77926],[-119.22139,40.77915],[-119.22139,40.77915],[-119.22116,40.77887],[-119.22116,40.77886],[-119.22093,40.77859],[-119.22093,40.77858],[-119.22068,40.77831],[-119.22068,40.77831],[-119.22043,40.77804],[-119.22043,40.77804],[-119.22017,40.77777],[-119.22017,40.77777],[-119.22009,40.77769],[-119.22052,40.77744],[-119.22071,40.77763]],[[-119.22202,40.77915],[-119.22215,40.77932],[-119.22236,40.77962],[-119.22256,40.77992],[-119.22275,40.78022],[-119.22294,40.78052],[-119.22311,40.78083],[-119.22316,40.78092],[-119.22266,40.78108],[-119.22258,40.78092],[-119.22258,40.78092],[-119.2224,40.78062],[-119.2224,40.78062],[-119.22221,40.78032],[-119.22221,40.78032],[-119.22202,40.78002],[-119.22202,40.78002],[-119.22182,40.77973],[-119.22182,40.77973],[-119.22161,40.77944],[-119.22161,40.77943],[-119.22155,40.77936],[-119.22202,40.77915]],[[-119.22319,40.78097],[-119.22328,40.78114],[-119.22344,40.78145],[-119.22359,40.78177],[-119.22373,40.78209],[-119.22386,40.78241],[-119.22399,40.78273],[-119.22403,40.78285],[-119.22351,40.78296],[-119.22345,40.7828],[-119.22345,40.7828],[-119.22333,40.78248],[-119.22333,40.78248],[-119.2232,40.78216],[-119.22319,40.78216],[-119.22305,40.78185],[-119.22305,40.78185],[-119.2229,40.78154],[-119.2229,40.78154],[-119.22274,40.78123],[-119.22274,40.78123],[-119.22269,40.78113],[-119.22319,40.78097]],[[-119.22264,40.78126],[-119.2228,40.78157],[-119.22295,40.78188],[-119.22309,40.78219],[-119.22322,40.7825],[-119.22335,40.78282],[-119.2234,40.78298],[-119.22288,40.78308],[-119.22281,40.78289],[-119.22281,40.78289],[-119.22269,40.78258],[-119.22269,40.78258],[-119.22256,40.78227],[-119.22256,40.78227],[-119.22242,40.78196],[-119.22241,40.78196],[-119.22227,40.78165],[-119.22227,40.78165],[-119.22211,40.78135],[-119.22211,40.78135],[-119.22209,40.78132],[-119.22259,40.78116],[-119.22264,40.78126]],[[-119.22201,40.78138],[-119.22216,40.78168],[-119.22231,40.78199],[-119.22245,40.78229],[-119.22258,40.7826],[-119.22271,40.78291],[-119.22278,40.78311],[-119.2219,40.78328],[-119.22185,40.78313],[-119.22185,40.78313],[-119.22173,40.78283],[-119.22173,40.78283],[-119.2216,40.78253],[-119.2216,40.78252],[-119.22147,40.78223],[-119.22147,40.78222],[-119.22132,40.78193],[-119.22132,40.78193],[-119.22117,40.78163],[-119.22117,40.78163],[-119.22116,40.78161],[-119.22199,40.78135],[-119.22201,40.78138]],[[-119.2228,40.78319],[-119.22282,40.78322],[-119.22292,40.78354],[-119.22302,40.78386],[-119.2231,40.78417],[-119.22318,40.78449],[-119.22324,40.78481],[-119.22328,40.78501],[-119.22238,40.7851],[-119.22237,40.785],[-119.22237,40.78499],[-119.2223,40.78468],[-119.2223,40.78468],[-119.22223,40.78437],[-119.22223,40.78437],[-119.22215,40.78406],[-119.22215,40.78406],[-119.22206,40.78375],[-119.22206,40.78375],[-119.22196,40.78344],[-119.22196,40.78344],[-119.22193,40.78336],[-119.2228,40.78319]],[[-119.22185,40.78346],[-119.22195,40.78377],[-119.22204,40.78407],[-119.22213,40.78438],[-119.2222,40.78469],[-119.22226,40.78501],[-119.22228,40.78511],[-119.22138,40.7852],[-119.22138,40.78519],[-119.22138,40.78518],[-119.22132,40.78488],[-119.22132,40.78488],[-119.22125,40.78458],[-119.22125,40.78458],[-119.22118,40.78427],[-119.22118,40.78427],[-119.22109,40.78397],[-119.22109,40.78397],[-119.22099,40.78367],[-119.22099,40.78367],[-119.22096,40.78356],[-119.22183,40.78338],[-119.22185,40.78346]],[[-119.22089,40.78369],[-119.22098,40.78399],[-119.22107,40.78429],[-119.22115,40.78459],[-119.22122,40.78489],[-119.22127,40.7852],[-119.22128,40.78521],[-119.22038,40.7853],[-119.22034,40.78507],[-119.22034,40.78507],[-119.22027,40.78478],[-119.22027,40.78478],[-119.2202,40.78449],[-119.2202,40.78449],[-119.22012,40.78419],[-119.22012,40.78419],[-119.22003,40.7839],[-119.22003,40.7839],[-119.21998,40.78376],[-119.22085,40.78358],[-119.22089,40.78369]],[[-119.21985,40.7837],[-119.21828,40.78402],[-119.21818,40.78376],[-119.21818,40.78376],[-119.21807,40.78349],[-119.21807,40.78348],[-119.21795,40.78322],[-119.21794,40.78322],[-119.21782,40.78295],[-119.21782,40.78295],[-119.21768,40.78269],[-119.21768,40.78269],[-119.21753,40.78243],[-119.21753,40.78243],[-119.21738,40.78217],[-119.21737,40.78217],[-119.21721,40.78191],[-119.21721,40.78191],[-119.21704,40.78166],[-119.21704,40.78166],[-119.21686,40.78142],[-119.21826,40.7808],[-119.21834,40.7809],[-119.21852,40.78116],[-119.2187,40.78142],[-119.21887,40.78169],[-119.21904,40.78196],[-119.21919,40.78223],[-119.21933,40.78251],[-119.21947,40.78279],[-119.2196,40.78307],[-119.21971,40.78335],[-119.21982,40.78364],[-119.21985,40.7837]],[[-119.21694,40.7817],[-119.21711,40.78195],[-119.21728,40.7822],[-119.21743,40.78246],[-119.21758,40.78272],[-119.21771,40.78298],[-119.21784,40.78324],[-119.21796,40.78351],[-119.21807,40.78378],[-119.21817,40.78404],[-119.2173,40.78422],[-119.21728,40.78416],[-119.21728,40.78416],[-119.21718,40.7839],[-119.21718,40.7839],[-119.21707,40.78364],[-119.21707,40.78364],[-119.21695,40.78338],[-119.21695,40.78338],[-119.21682,40.78312],[-119.21682,40.78312],[-119.21668,40.78287],[-119.21668,40.78287],[-119.21654,40.78262],[-119.21654,40.78262],[-119.21638,40.78237],[-119.21638,40.78237],[-119.21622,40.78213],[-119.21622,40.78213],[-119.21605,40.78189],[-119.21605,40.78189],[-119.21598,40.7818],[-119.21676,40.78146],[-119.21694,40.7817]],[[-119.21595,40.78193],[-119.21612,40.78217],[-119.21628,40.78241],[-119.21644,40.78265],[-119.21658,40.7829],[-119.21672,40.78315],[-119.21685,40.78341],[-119.21696,40.78367],[-119.21707,40.78392],[-119.21717,40.78418],[-119.21719,40.78424],[-119.21632,40.78442],[-119.21628,40.7843],[-119.21628,40.7843],[-119.21618,40.78405],[-119.21618,40.78405],[-119.21607,40.7838],[-119.21607,40.7838],[-119.21595,40.78355],[-119.21595,40.78355],[-119.21583,40.78331],[-119.21583,40.78331],[-119.21569,40.78306],[-119.21569,40.78306],[-119.21555,40.78282],[-119.21554,40.78282],[-119.21539,40.78259],[-119.21539,40.78259],[-119.21523,40.78235],[-119.21523,40.78235],[-119.21511,40.78219],[-119.21589,40.78184],[-119.21595,40.78193]],[[-119.21514,40.78239],[-119.2153,40.78262],[-119.21545,40.78286],[-119.21559,40.7831],[-119.21573,40.78334],[-119.21585,40.78358],[-119.21597,40.78383],[-119.21608,40.78407],[-119.21618,40.78432],[-119.21622,40.78444],[-119.21535,40.78462],[-119.21528,40.78445],[-119.21528,40.78445],[-119.21518,40.78421],[-119.21518,40.78421],[-119.21508,40.78397],[-119.21508,40.78397],[-119.21496,40.78373],[-119.21496,40.78373],[-119.21483,40.7835],[-119.21483,40.7835],[-119.2147,40.78327],[-119.2147,40.78326],[-119.21456,40.78304],[-119.21456,40.78304],[-119.21441,40.78281],[-119.21441,40.78281],[-119.21425,40.78259],[-119.21425,40.78259],[-119.21423,40.78257],[-119.21501,40.78223],[-119.21514,40.78239]],[[-119.21415,40.78263],[-119.21431,40.78285],[-119.21446,40.78307],[-119.2146,40.7833],[-119.21473,40.78353],[-119.21486,40.78376],[-119.21497,40.78399],[-119.21508,40.78423],[-119.21518,40.78447],[-119.21524,40.78464],[-119.21437,40.78482],[-119.21429,40.7846],[-119.21429,40.7846],[-119.21419,40.78437],[-119.21419,40.78437],[-119.21408,40.78414],[-119.21408,40.78414],[-119.21397,40.78392],[-119.21397,40.78392],[-119.21385,40.7837],[-119.21385,40.7837],[-119.21372,40.78348],[-119.21372,40.78348],[-119.21358,40.78326],[-119.21357,40.78326],[-119.21343,40.78305],[-119.21343,40.78305],[-119.21335,40.78295],[-119.21414,40.78261],[-119.21415,40.78263]],[[-119.21328,40.78286],[-119.21327,40.78284],[-119.21327,40.78284],[-119.21311,40.78264],[-119.2131,40.78264],[-119.21293,40.78243],[-119.21293,40.78243],[-119.21278,40.78226],[-119.21351,40.78186],[-119.21363,40.78199],[-119.21381,40.7822],[-119.21399,40.78241],[-119.21406,40.78252],[-119.21328,40.78286]],[[-119.21264,40.78226],[-119.21261,40.78228],[-119.2125,40.78232],[-119.21238,40.78236],[-119.21226,40.78239],[-119.21213,40.78242],[-119.21201,40.78244],[-119.21188,40.78245],[-119.21175,40.78245],[-119.21162,40.78245],[-119.2115,40.78244],[-119.21137,40.78242],[-119.21125,40.78239],[-119.21113,40.78236],[-119.21101,40.78232],[-119.21089,40.78228],[-119.21079,40.78223],[-119.21071,40.78219],[-119.21119,40.7817],[-119.21122,40.78172],[-119.2113,40.78176],[-119.21139,40.78179],[-119.21147,40.78182],[-119.21157,40.78183],[-119.21166,40.78184],[-119.21175,40.78185],[-119.21184,40.78184],[-119.21194,40.78183],[-119.21203,40.78182],[-119.21212,40.78179],[-119.21215,40.78178],[-119.21228,40.78191],[-119.21248,40.78209],[-119.21264,40.78226]],[[-119.21037,40.78193],[-119.21033,40.78189],[-119.21026,40.78181],[-119.2102,40.78172],[-119.21015,40.78163],[-119.2101,40.78154],[-119.21007,40.78145],[-119.21004,40.78135],[-119.21003,40.78126],[-119.21002,40.78116],[-119.21002,40.78106],[-119.21003,40.78096],[-119.21005,40.78087],[-119.21008,40.78077],[-119.21012,40.78068],[-119.21017,40.78059],[-119.21023,40.7805],[-119.21027,40.78046],[-119.21049,40.78058],[-119.21074,40.78073],[-119.2109,40.78083],[-119.2109,40.78084],[-119.21086,40.78091],[-119.21084,40.78098],[-119.21082,40.78105],[-119.21081,40.78112],[-119.21082,40.78119],[-119.21083,40.78126],[-119.21085,40.78133],[-119.21088,40.7814],[-119.21092,40.78146],[-119.21096,40.78152],[-119.211,40.78156],[-119.21037,40.78193]],[[-119.2108,40.78067],[-119.2108,40.78067],[-119.21056,40.78052],[-119.21055,40.78052],[-119.21033,40.78039],[-119.21085,40.77983],[-119.21085,40.77983],[-119.21089,40.77985],[-119.21115,40.78],[-119.21141,40.78016],[-119.21166,40.78032],[-119.21182,40.78042],[-119.2118,40.78042],[-119.2117,40.78042],[-119.21161,40.78043],[-119.21152,40.78044],[-119.21143,40.78046],[-119.21134,40.78049],[-119.21126,40.78053],[-119.21118,40.78057],[-119.21111,40.78061],[-119.21105,40.78066],[-119.21099,40.78072],[-119.21095,40.78076],[-119.2108,40.78067]],[[-119.21027,40.78036],[-119.21004,40.78024],[-119.21004,40.78024],[-119.20978,40.78011],[-119.20978,40.78011],[-119.20951,40.77998],[-119.20951,40.77998],[-119.20948,40.77997],[-119.20993,40.77938],[-119.21007,40.77944],[-119.21035,40.77957],[-119.21062,40.77971],[-119.21079,40.7798],[-119.21027,40.78036]],[[-119.20936,40.77992],[-119.20923,40.77986],[-119.20923,40.77986],[-119.20895,40.77975],[-119.20895,40.77975],[-119.20867,40.77964],[-119.20867,40.77964],[-119.20838,40.77954],[-119.20838,40.77954],[-119.20809,40.77945],[-119.20809,40.77945],[-119.20779,40.77936],[-119.20779,40.77936],[-119.2075,40.77928],[-119.20749,40.77928],[-119.20719,40.77921],[-119.20719,40.77921],[-119.2069,40.77914],[-119.20714,40.77848],[-119.20736,40.77853],[-119.20768,40.7786],[-119.20799,40.77869],[-119.2083,40.77877],[-119.2086,40.77887],[-119.2089,40.77897],[-119.2092,40.77908],[-119.20949,40.77919],[-119.20978,40.77931],[-119.20981,40.77932],[-119.20936,40.77992]],[[-119.2068,40.77912],[-119.20658,40.77908],[-119.20658,40.77908],[-119.20627,40.77903],[-119.20627,40.77903],[-119.20596,40.77898],[-119.20596,40.77898],[-119.20565,40.77894],[-119.20565,40.77894],[-119.20534,40.77891],[-119.20534,40.77891],[-119.20502,40.77889],[-119.20502,40.77889],[-119.20471,40.77887],[-119.20471,40.77887],[-119.20439,40.77886],[-119.20439,40.77886],[-119.20423,40.77886],[-119.20419,40.77839],[-119.20421,40.77839],[-119.20426,40.77837],[-119.20431,40.77835],[-119.20435,40.77832],[-119.20439,40.77829],[-119.20442,40.77825],[-119.20444,40.77821],[-119.20445,40.77818],[-119.20477,40.77819],[-119.2051,40.7782],[-119.20543,40.77823],[-119.20576,40.77826],[-119.20608,40.7783],[-119.2064,40.77835],[-119.20673,40.7784],[-119.20703,40.77846],[-119.2068,40.77912]],[[-119.20375,40.77821],[-119.20377,40.77825],[-119.2038,40.77829],[-119.20383,40.77832],[-119.20388,40.77835],[-119.20393,40.77837],[-119.20398,40.77839],[-119.204,40.77839],[-119.20396,40.77886],[-119.20376,40.77886],[-119.20376,40.77886],[-119.20344,40.77887],[-119.20344,40.77887],[-119.20313,40.77889],[-119.20313,40.77889],[-119.20281,40.77892],[-119.20281,40.77892],[-119.2025,40.77895],[-119.2025,40.77895],[-119.20219,40.77899],[-119.20218,40.77899],[-119.20188,40.77904],[-119.20187,40.77904],[-119.20157,40.77909],[-119.20157,40.77909],[-119.20139,40.77912],[-119.20116,40.77846],[-119.20118,40.77845],[-119.2015,40.7784],[-119.20182,40.77834],[-119.20215,40.7783],[-119.20247,40.77826],[-119.2028,40.77823],[-119.20313,40.7782],[-119.20346,40.77818],[-119.20374,40.77818],[-119.20375,40.77821]],[[-119.20128,40.77914],[-119.20126,40.77915],[-119.20126,40.77915],[-119.20096,40.77922],[-119.20096,40.77922],[-119.20066,40.77929],[-119.20065,40.77929],[-119.20036,40.77937],[-119.20036,40.77937],[-119.20006,40.77946],[-119.20006,40.77946],[-119.19977,40.77955],[-119.19977,40.77955],[-119.19949,40.77965],[-119.19948,40.77966],[-119.1992,40.77976],[-119.1992,40.77976],[-119.19892,40.77988],[-119.19892,40.77988],[-119.19881,40.77992],[-119.19836,40.77933],[-119.19844,40.77929],[-119.19873,40.77917],[-119.19902,40.77906],[-119.19932,40.77895],[-119.19962,40.77885],[-119.19993,40.77876],[-119.20024,40.77867],[-119.20055,40.77859],[-119.20087,40.77852],[-119.20105,40.77848],[-119.20128,40.77914]],[[-119.19872,40.77996],[-119.19865,40.78],[-119.19865,40.78],[-119.19838,40.78012],[-119.19838,40.78012],[-119.19811,40.78025],[-119.19811,40.78025],[-119.19786,40.78039],[-119.19785,40.78039],[-119.1976,40.78053],[-119.1976,40.78054],[-119.19735,40.78068],[-119.19735,40.78069],[-119.19711,40.78084],[-119.19711,40.78084],[-119.19688,40.781],[-119.19687,40.781],[-119.19666,40.78116],[-119.1962,40.78085],[-119.19621,40.78083],[-119.19623,40.78079],[-119.19624,40.78075],[-119.19625,40.7807],[-119.19624,40.78066],[-119.19622,40.78062],[-119.1962,40.78058],[-119.19618,40.78056],[-119.19631,40.78046],[-119.19656,40.7803],[-119.19681,40.78014],[-119.19707,40.77998],[-119.19733,40.77983],[-119.1976,40.77969],[-119.19788,40.77955],[-119.19816,40.77942],[-119.19827,40.77937],[-119.19872,40.77996]],[[-119.19782,40.77948],[-119.19782,40.77948],[-119.19754,40.77962],[-119.19754,40.77962],[-119.19727,40.77977],[-119.19727,40.77977],[-119.197,40.77992],[-119.197,40.77992],[-119.19674,40.78007],[-119.19674,40.78007],[-119.19649,40.78023],[-119.19649,40.78024],[-119.19624,40.7804],[-119.19624,40.7804],[-119.1961,40.7805],[-119.19608,40.78048],[-119.19603,40.78046],[-119.19597,40.78045],[-119.19591,40.78044],[-119.19586,40.78044],[-119.1958,40.78045],[-119.19574,40.78046],[-119.19571,40.78048],[-119.19531,40.78013],[-119.19542,40.78004],[-119.19568,40.77986],[-119.19593,40.77969],[-119.1962,40.77952],[-119.19647,40.77936],[-119.19675,40.77921],[-119.19703,40.77906],[-119.19731,40.77891],[-119.19761,40.77877],[-119.19776,40.7787],[-119.19822,40.7793],[-119.1981,40.77935],[-119.1981,40.77935],[-119.19782,40.77948]],[[-119.19726,40.77884],[-119.19726,40.77884],[-119.19697,40.77899],[-119.19697,40.77899],[-119.19668,40.77914],[-119.19668,40.77914],[-119.1964,40.7793],[-119.1964,40.7793],[-119.19613,40.77946],[-119.19613,40.77946],[-119.19586,40.77963],[-119.19586,40.77963],[-119.1956,40.7798],[-119.1956,40.7798],[-119.19535,40.77998],[-119.19535,40.77998],[-119.19518,40.7801],[-119.19454,40.77962],[-119.19478,40.77944],[-119.19505,40.77926],[-119.19532,40.77908],[-119.19559,40.77891],[-119.19587,40.77874],[-119.19616,40.77858],[-119.19645,40.77842],[-119.19675,40.77827],[-119.19706,40.77813],[-119.19726,40.77804],[-119.19771,40.77863],[-119.19755,40.7787],[-119.19755,40.7787],[-119.19726,40.77884]],[[-119.197,40.77806],[-119.197,40.77806],[-119.19669,40.7782],[-119.19669,40.7782],[-119.19639,40.77835],[-119.19639,40.77836],[-119.1961,40.77851],[-119.1961,40.77851],[-119.19581,40.77868],[-119.19581,40.77868],[-119.19552,40.77884],[-119.19552,40.77884],[-119.19525,40.77902],[-119.19524,40.77902],[-119.19497,40.7792],[-119.19497,40.7792],[-119.19471,40.77938],[-119.19471,40.77938],[-119.19447,40.77956],[-119.19383,40.77907],[-119.19388,40.77904],[-119.19414,40.77884],[-119.19442,40.77865],[-119.1947,40.77847],[-119.19499,40.77829],[-119.19528,40.77812],[-119.19558,40.77795],[-119.19588,40.77779],[-119.19619,40.77764],[-119.1965,40.77749],[-119.19675,40.77737],[-119.1972,40.77797],[-119.197,40.77806]],[[-119.19645,40.77742],[-119.19644,40.77742],[-119.19613,40.77757],[-119.19613,40.77757],[-119.19582,40.77772],[-119.19582,40.77772],[-119.19551,40.77789],[-119.19551,40.77789],[-119.19521,40.77805],[-119.19521,40.77805],[-119.19492,40.77823],[-119.19492,40.77823],[-119.19463,40.77841],[-119.19463,40.77841],[-119.19435,40.77859],[-119.19435,40.77859],[-119.19407,40.77878],[-119.19407,40.77878],[-119.1938,40.77898],[-119.1938,40.77898],[-119.19375,40.77902],[-119.1926,40.77814],[-119.19287,40.77795],[-119.19315,40.77775],[-119.19345,40.77755],[-119.19375,40.77736],[-119.19405,40.77717],[-119.19436,40.77699],[-119.19468,40.77682],[-119.195,40.77665],[-119.19533,40.77649],[-119.19566,40.77633],[-119.19589,40.77623],[-119.1967,40.7773],[-119.19645,40.77742]],[[-119.19243,40.77816],[-119.19224,40.77831],[-119.19223,40.77831],[-119.19197,40.77853],[-119.19197,40.77853],[-119.1917,40.77875],[-119.1917,40.77875],[-119.19145,40.77898],[-119.19145,40.77898],[-119.1912,40.77921],[-119.1912,40.77921],[-119.1911,40.77931],[-119.19039,40.77889],[-119.19062,40.77866],[-119.19088,40.77843],[-119.19115,40.7782],[-119.19142,40.77797],[-119.19159,40.77783],[-119.19163,40.77785],[-119.19169,40.77787],[-119.19174,40.77788],[-119.1918,40.77788],[-119.19186,40.77788],[-119.19191,40.77787],[-119.19197,40.77785],[-119.192,40.77784],[-119.19243,40.77816]],[[-119.19102,40.7794],[-119.19096,40.77945],[-119.19096,40.77945],[-119.19073,40.77969],[-119.19073,40.77969],[-119.1905,40.77993],[-119.1905,40.77993],[-119.19029,40.78018],[-119.19029,40.78018],[-119.19008,40.78044],[-119.19008,40.78044],[-119.1899,40.78066],[-119.18912,40.78032],[-119.18924,40.78017],[-119.18945,40.77991],[-119.18967,40.77965],[-119.1899,40.7794],[-119.19013,40.77915],[-119.1903,40.77898],[-119.19102,40.7794]],[[-119.19004,40.7791],[-119.19004,40.7791],[-119.18981,40.77935],[-119.18981,40.77935],[-119.18958,40.7796],[-119.18958,40.7796],[-119.18936,40.77986],[-119.18936,40.77986],[-119.18914,40.78013],[-119.18914,40.78013],[-119.18903,40.78028],[-119.18824,40.77993],[-119.1883,40.77986],[-119.18851,40.77959],[-119.18874,40.77933],[-119.18897,40.77906],[-119.18921,40.77881],[-119.18945,40.77855],[-119.1895,40.77851],[-119.19021,40.77893],[-119.19004,40.7791]],[[-119.18912,40.77876],[-119.18912,40.77876],[-119.18888,40.77902],[-119.18888,40.77902],[-119.18865,40.77928],[-119.18865,40.77928],[-119.18842,40.77955],[-119.18842,40.77955],[-119.18821,40.77982],[-119.18821,40.77982],[-119.18815,40.77989],[-119.18737,40.77955],[-119.18758,40.77928],[-119.1878,40.77901],[-119.18804,40.77874],[-119.18828,40.77847],[-119.18853,40.77821],[-119.1887,40.77804],[-119.18941,40.77846],[-119.18937,40.7785],[-119.18937,40.7785],[-119.18912,40.77876]],[[-119.18878,40.77795],[-119.18879,40.77795],[-119.18905,40.7777],[-119.18932,40.77745],[-119.1896,40.7772],[-119.18989,40.77696],[-119.19018,40.77672],[-119.19036,40.77659],[-119.191,40.77708],[-119.19072,40.77729],[-119.19072,40.77729],[-119.19043,40.77752],[-119.19043,40.77752],[-119.19016,40.77776],[-119.19016,40.77776],[-119.18989,40.778],[-119.18989,40.778],[-119.18962,40.77825],[-119.18962,40.77825],[-119.1895,40.77837],[-119.18878,40.77795]],[[-119.19046,40.77651],[-119.19048,40.77649],[-119.19079,40.77627],[-119.1911,40.77605],[-119.19142,40.77583],[-119.19175,40.77562],[-119.19208,40.77542],[-119.19226,40.77532],[-119.1928,40.77586],[-119.19256,40.776],[-119.19256,40.776],[-119.19224,40.7762],[-119.19224,40.77621],[-119.19192,40.77641],[-119.19192,40.77641],[-119.19161,40.77662],[-119.19161,40.77662],[-119.19131,40.77684],[-119.19131,40.77684],[-119.1911,40.777],[-119.19046,40.77651]],[[-119.19237,40.77525],[-119.19242,40.77522],[-119.19276,40.77503],[-119.19311,40.77484],[-119.19346,40.77466],[-119.19382,40.77448],[-119.19419,40.77432],[-119.19437,40.77423],[-119.19482,40.77483],[-119.19462,40.77492],[-119.19462,40.77492],[-119.19426,40.77508],[-119.19426,40.77508],[-119.19391,40.77526],[-119.19391,40.77526],[-119.19357,40.77543],[-119.19357,40.77543],[-119.19323,40.77562],[-119.19323,40.77562],[-119.19292,40.77579],[-119.19237,40.77525]],[[-119.19446,40.77419],[-119.19456,40.77415],[-119.19493,40.774],[-119.19531,40.77385],[-119.19569,40.7737],[-119.19608,40.77356],[-119.19647,40.77343],[-119.19665,40.77337],[-119.197,40.77401],[-119.19685,40.77405],[-119.19685,40.77405],[-119.19647,40.77418],[-119.19647,40.77418],[-119.19609,40.77432],[-119.19609,40.77432],[-119.19572,40.77446],[-119.19572,40.77446],[-119.19535,40.7746],[-119.19535,40.7746],[-119.19498,40.77476],[-119.19498,40.77476],[-119.19492,40.77479],[-119.19446,40.77419]],[[-119.19672,40.77335],[-119.19686,40.77331],[-119.19726,40.77319],[-119.19766,40.77308],[-119.19806,40.77297],[-119.19847,40.77288],[-119.19888,40.77279],[-119.19903,40.77275],[-119.19927,40.77342],[-119.19922,40.77343],[-119.19922,40.77343],[-119.19882,40.77351],[-119.19882,40.77351],[-119.19842,40.77361],[-119.19842,40.77361],[-119.19802,40.77371],[-119.19802,40.77371],[-119.19763,40.77382],[-119.19763,40.77382],[-119.19724,40.77393],[-119.19724,40.77393],[-119.19707,40.77399],[-119.19672,40.77335]],[[-119.19914,40.77273],[-119.19929,40.7727],[-119.19971,40.77263],[-119.20012,40.77256],[-119.20054,40.77249],[-119.20096,40.77244],[-119.20138,40.77239],[-119.20153,40.77237],[-119.20165,40.77305],[-119.20126,40.77309],[-119.20126,40.77309],[-119.20085,40.77315],[-119.20085,40.77315],[-119.20044,40.77321],[-119.20044,40.77321],[-119.20003,40.77327],[-119.20003,40.77327],[-119.19962,40.77335],[-119.19962,40.77335],[-119.19937,40.7734],[-119.19914,40.77273]],[[-119.2016,40.77237],[-119.20181,40.77235],[-119.20223,40.77231],[-119.20266,40.77228],[-119.20308,40.77226],[-119.20351,40.77225],[-119.20393,40.77224],[-119.20402,40.77224],[-119.20402,40.77293],[-119.20376,40.77293],[-119.20375,40.77293],[-119.20334,40.77294],[-119.20334,40.77294],[-119.20292,40.77296],[-119.20292,40.77296],[-119.2025,40.77298],[-119.2025,40.77298],[-119.20209,40.77301],[-119.20209,40.77301],[-119.20172,40.77305],[-119.2016,40.77237]],[[-119.20417,40.77224],[-119.20436,40.77224],[-119.20479,40.77225],[-119.20521,40.77227],[-119.20564,40.77229],[-119.20606,40.77232],[-119.20649,40.77236],[-119.20658,40.77237],[-119.20647,40.77305],[-119.20626,40.77303],[-119.20626,40.77302],[-119.20584,40.77299],[-119.20584,40.77299],[-119.20542,40.77296],[-119.20542,40.77296],[-119.20501,40.77295],[-119.20501,40.77295],[-119.20459,40.77293],[-119.20459,40.77293],[-119.20417,40.77293],[-119.20417,40.77293],[-119.20417,40.77293],[-119.20417,40.77224]],[[-119.20666,40.77237],[-119.20691,40.7724],[-119.20733,40.77245],[-119.20775,40.77251],[-119.20817,40.77257],[-119.20859,40.77264],[-119.209,40.77272],[-119.20905,40.77273],[-119.20882,40.7734],[-119.20872,40.77338],[-119.20872,40.77338],[-119.20831,40.7733],[-119.20831,40.7733],[-119.20791,40.77323],[-119.2079,40.77323],[-119.2075,40.77317],[-119.20749,40.77317],[-119.20708,40.77311],[-119.20708,40.77311],[-119.20667,40.77307],[-119.20667,40.77307],[-119.20654,40.77305],[-119.20666,40.77237]],[[-119.20915,40.77275],[-119.20941,40.77281],[-119.20982,40.7729],[-119.21023,40.773],[-119.21063,40.77311],[-119.21103,40.77322],[-119.21143,40.77334],[-119.21147,40.77335],[-119.21112,40.77399],[-119.2111,40.77398],[-119.21109,40.77398],[-119.21071,40.77386],[-119.21071,40.77386],[-119.21031,40.77375],[-119.21031,40.77375],[-119.20992,40.77365],[-119.20992,40.77365],[-119.20952,40.77355],[-119.20952,40.77355],[-119.20912,40.77346],[-119.20912,40.77346],[-119.20892,40.77342],[-119.20915,40.77275]],[[-119.21153,40.77337],[-119.21182,40.77346],[-119.21221,40.7736],[-119.21259,40.77374],[-119.21298,40.77388],[-119.21335,40.77403],[-119.21371,40.77419],[-119.21326,40.77478],[-119.21298,40.77466],[-119.21298,40.77466],[-119.21261,40.77451],[-119.21261,40.77451],[-119.21224,40.77437],[-119.21224,40.77437],[-119.21186,40.77423],[-119.21186,40.77423],[-119.21148,40.7741],[-119.21148,40.7741],[-119.21119,40.77401],[-119.21153,40.77337]],[[-119.21389,40.77417],[-119.21416,40.77381],[-119.21431,40.77388],[-119.21468,40.77405],[-119.21504,40.77423],[-119.2154,40.77441],[-119.21576,40.7746],[-119.21611,40.7748],[-119.21621,40.77486],[-119.21588,40.77518],[-119.21558,40.77501],[-119.21558,40.77501],[-119.21523,40.77482],[-119.21523,40.77482],[-119.21487,40.77464],[-119.21487,40.77464],[-119.21451,40.77446],[-119.21451,40.77446],[-119.21415,40.77429],[-119.21415,40.77429],[-119.21389,40.77417]],[[-119.21633,40.77492],[-119.21645,40.775],[-119.21679,40.7752],[-119.21712,40.77542],[-119.21745,40.77563],[-119.21777,40.77586],[-119.21808,40.77609],[-119.21819,40.77616],[-119.2178,40.77645],[-119.21755,40.77626],[-119.21755,40.77626],[-119.21724,40.77604],[-119.21724,40.77604],[-119.21692,40.77582],[-119.21692,40.77582],[-119.21659,40.77561],[-119.21659,40.77561],[-119.21626,40.77541],[-119.21626,40.7754],[-119.216,40.77525],[-119.21633,40.77492]],[[-119.21837,40.77618],[-119.21875,40.77589],[-119.21901,40.77609],[-119.21931,40.77634],[-119.2196,40.77659],[-119.21989,40.77684],[-119.22017,40.7771],[-119.22044,40.77735],[-119.22001,40.7776],[-119.21991,40.77751],[-119.21991,40.77751],[-119.21964,40.77725],[-119.21963,40.77725],[-119.21935,40.77699],[-119.21935,40.77699],[-119.21907,40.77675],[-119.21907,40.77674],[-119.21877,40.7765],[-119.21877,40.7765],[-119.21847,40.77626],[-119.21847,40.77626],[-119.21837,40.77618]],[[-119.21839,40.77632],[-119.21869,40.77656],[-119.21899,40.7768],[-119.21927,40.77705],[-119.21955,40.7773],[-119.21982,40.77756],[-119.21992,40.77765],[-119.21949,40.7779],[-119.21929,40.77771],[-119.21929,40.77771],[-119.21902,40.77745],[-119.21901,40.77745],[-119.21874,40.77721],[-119.21874,40.77721],[-119.21845,40.77696],[-119.21845,40.77696],[-119.21816,40.77673],[-119.21816,40.77673],[-119.21791,40.77653],[-119.21829,40.77624],[-119.21839,40.77632]],[[-119.22001,40.77774],[-119.22009,40.77782],[-119.22035,40.77809],[-119.22059,40.77836],[-119.22084,40.77863],[-119.22107,40.77891],[-119.2213,40.77919],[-119.22138,40.7793],[-119.22091,40.77951],[-119.22076,40.77931],[-119.22076,40.77931],[-119.22053,40.77903],[-119.22053,40.77903],[-119.2203,40.77876],[-119.2203,40.77876],[-119.22006,40.77849],[-119.22006,40.77849],[-119.21981,40.77823],[-119.21981,40.77822],[-119.21958,40.77799],[-119.22001,40.77774]],[[-119.22145,40.7794],[-119.22151,40.77948],[-119.22172,40.77976],[-119.22192,40.78006],[-119.22212,40.78035],[-119.2223,40.78065],[-119.22248,40.78095],[-119.22256,40.78111],[-119.22206,40.78127],[-119.22194,40.78105],[-119.22194,40.78105],[-119.22176,40.78075],[-119.22176,40.78075],[-119.22158,40.78046],[-119.22158,40.78046],[-119.22139,40.78016],[-119.22139,40.78016],[-119.22119,40.77988],[-119.22119,40.77988],[-119.22099,40.7796],[-119.22145,40.7794]],[[-119.22109,40.77992],[-119.22129,40.7802],[-119.22148,40.78049],[-119.22167,40.78078],[-119.22184,40.78108],[-119.22196,40.7813],[-119.22113,40.78156],[-119.221,40.78134],[-119.221,40.78134],[-119.22083,40.78105],[-119.22083,40.78105],[-119.22065,40.78076],[-119.22065,40.78076],[-119.22046,40.78048],[-119.22046,40.78048],[-119.22027,40.7802],[-119.22027,40.7802],[-119.22011,40.77999],[-119.22089,40.77965],[-119.22109,40.77992]],[[-119.22017,40.78024],[-119.22037,40.78052],[-119.22056,40.7808],[-119.22073,40.78108],[-119.22091,40.78137],[-119.22103,40.78159],[-119.22019,40.78186],[-119.22007,40.78163],[-119.22007,40.78163],[-119.2199,40.78135],[-119.2199,40.78135],[-119.21973,40.78107],[-119.21973,40.78107],[-119.21954,40.7808],[-119.21954,40.7808],[-119.21935,40.78053],[-119.21935,40.78053],[-119.21923,40.78037],[-119.22002,40.78003],[-119.22017,40.78024]],[[-119.22106,40.78164],[-119.22107,40.78166],[-119.22122,40.78196],[-119.22136,40.78225],[-119.2215,40.78255],[-119.22163,40.78285],[-119.22175,40.78315],[-119.2218,40.78331],[-119.22093,40.78348],[-119.22089,40.78337],[-119.22089,40.78337],[-119.22077,40.78308],[-119.22077,40.78308],[-119.22065,40.78278],[-119.22065,40.78278],[-119.22052,40.78249],[-119.22052,40.78249],[-119.22038,40.7822],[-119.22038,40.7822],[-119.22023,40.78192],[-119.22023,40.78192],[-119.22022,40.78191],[-119.22106,40.78164]],[[-119.22013,40.78195],[-119.22028,40.78223],[-119.22042,40.78252],[-119.22055,40.78281],[-119.22067,40.7831],[-119.22078,40.7834],[-119.22082,40.7835],[-119.21995,40.78368],[-119.21993,40.78361],[-119.21993,40.78361],[-119.21982,40.78333],[-119.21982,40.78333],[-119.2197,40.78304],[-119.2197,40.78304],[-119.21957,40.78276],[-119.21957,40.78276],[-119.21943,40.78248],[-119.21943,40.78248],[-119.21929,40.7822],[-119.21929,40.7822],[-119.21929,40.7822],[-119.22012,40.78194],[-119.22013,40.78195]],[[-119.21926,40.78215],[-119.21913,40.78193],[-119.21913,40.78193],[-119.21897,40.78165],[-119.21897,40.78165],[-119.2188,40.78138],[-119.2188,40.78138],[-119.21862,40.78112],[-119.21862,40.78112],[-119.21843,40.78086],[-119.21843,40.78086],[-119.21836,40.78076],[-119.21914,40.78041],[-119.21925,40.78057],[-119.21945,40.78084],[-119.21963,40.78111],[-119.2198,40.78139],[-119.21997,40.78167],[-119.22009,40.78189],[-119.21926,40.78215]],[[-119.21819,40.7807],[-119.21679,40.78132],[-119.21667,40.78117],[-119.21667,40.78117],[-119.21647,40.78093],[-119.21647,40.78093],[-119.21627,40.78069],[-119.21627,40.78069],[-119.21605,40.78046],[-119.21605,40.78046],[-119.21583,40.78023],[-119.21583,40.78023],[-119.2156,40.78001],[-119.2156,40.78001],[-119.21537,40.77979],[-119.21537,40.77979],[-119.21512,40.77957],[-119.21512,40.77957],[-119.21487,40.77936],[-119.21487,40.77936],[-119.21462,40.77916],[-119.21462,40.77916],[-119.21454,40.77909],[-119.21569,40.77822],[-119.21577,40.77829],[-119.21604,40.7785],[-119.2163,40.77872],[-119.21656,40.77895],[-119.21681,40.77918],[-119.21705,40.77941],[-119.21728,40.77965],[-119.21751,40.77989],[-119.21773,40.78013],[-119.21794,40.78038],[-119.21814,40.78064],[-119.21819,40.7807]],[[-119.21454,40.77921],[-119.21479,40.77942],[-119.21504,40.77963],[-119.21528,40.77984],[-119.21552,40.78006],[-119.21575,40.78028],[-119.21596,40.78051],[-119.21618,40.78074],[-119.21638,40.78097],[-119.21658,40.78121],[-119.21669,40.78136],[-119.21591,40.78171],[-119.21587,40.78165],[-119.21587,40.78165],[-119.21568,40.78142],[-119.21568,40.78142],[-119.21548,40.78119],[-119.21548,40.78119],[-119.21528,40.78096],[-119.21528,40.78096],[-119.21507,40.78074],[-119.21507,40.78074],[-119.21485,40.78052],[-119.21485,40.78052],[-119.21462,40.78031],[-119.21462,40.78031],[-119.21439,40.7801],[-119.21439,40.7801],[-119.21415,40.7799],[-119.21415,40.77989],[-119.2139,40.7797],[-119.2139,40.7797],[-119.21382,40.77964],[-119.21446,40.77915],[-119.21454,40.77921]],[[-119.21519,40.78101],[-119.21539,40.78123],[-119.21559,40.78146],[-119.21577,40.78169],[-119.21582,40.78175],[-119.21503,40.78209],[-119.21488,40.7819],[-119.21488,40.7819],[-119.2147,40.78167],[-119.2147,40.78167],[-119.2145,40.78146],[-119.2145,40.78146],[-119.21442,40.78137],[-119.21515,40.78097],[-119.21519,40.78101]],[[-119.21441,40.7815],[-119.21461,40.78172],[-119.21479,40.78194],[-119.21494,40.78213],[-119.21416,40.78247],[-119.21408,40.78237],[-119.21408,40.78237],[-119.2139,40.78216],[-119.2139,40.78216],[-119.21372,40.78195],[-119.21372,40.78195],[-119.2136,40.78182],[-119.2136,40.78181],[-119.21433,40.78142],[-119.21441,40.7815]],[[-119.21344,40.78179],[-119.21347,40.78182],[-119.21347,40.78182],[-119.21273,40.78222],[-119.21256,40.78204],[-119.21256,40.78204],[-119.21237,40.78185],[-119.21237,40.78185],[-119.21224,40.78174],[-119.21228,40.78172],[-119.21235,40.78168],[-119.21242,40.78163],[-119.21249,40.78158],[-119.21254,40.78152],[-119.21259,40.78146],[-119.21263,40.78139],[-119.21266,40.78133],[-119.21268,40.78126],[-119.21269,40.78119],[-119.21269,40.78112],[-119.21269,40.78108],[-119.21283,40.7812],[-119.21304,40.78139],[-119.21324,40.78159],[-119.21344,40.78179]],[[-119.21353,40.78174],[-119.21353,40.78174],[-119.21333,40.78154],[-119.21333,40.78154],[-119.21312,40.78134],[-119.21312,40.78134],[-119.21291,40.78115],[-119.21291,40.78115],[-119.21269,40.78096],[-119.21269,40.78096],[-119.21265,40.78093],[-119.21264,40.78091],[-119.21261,40.78084],[-119.21256,40.78078],[-119.21251,40.78072],[-119.21246,40.78067],[-119.21303,40.78024],[-119.2131,40.78029],[-119.21334,40.78048],[-119.21357,40.78068],[-119.21379,40.78088],[-119.214,40.78108],[-119.21421,40.78129],[-119.21429,40.78137],[-119.21356,40.78177],[-119.21353,40.78174]],[[-119.21236,40.78059],[-119.21232,40.78057],[-119.21224,40.78053],[-119.21216,40.78049],[-119.21207,40.78046],[-119.21202,40.78045],[-119.21198,40.78042],[-119.21198,40.78042],[-119.21173,40.78026],[-119.21173,40.78025],[-119.21148,40.78009],[-119.21148,40.78009],[-119.21122,40.77994],[-119.21122,40.77994],[-119.21095,40.77978],[-119.21095,40.77978],[-119.21092,40.77976],[-119.21144,40.77921],[-119.21155,40.77926],[-119.21182,40.77942],[-119.21209,40.77959],[-119.21235,40.77975],[-119.21261,40.77993],[-119.21286,40.78011],[-119.21293,40.78016],[-119.21236,40.78059]],[[-119.21085,40.77973],[-119.21085,40.77973],[-119.21068,40.77964],[-119.21068,40.77964],[-119.21041,40.7795],[-119.2104,40.7795],[-119.21012,40.77937],[-119.21012,40.77936],[-119.20999,40.77931],[-119.21044,40.77871],[-119.21069,40.77882],[-119.21098,40.77897],[-119.21127,40.77911],[-119.21138,40.77917],[-119.21085,40.77973]],[[-119.20986,40.77925],[-119.20984,40.77924],[-119.20983,40.77924],[-119.20954,40.77912],[-119.20954,40.77912],[-119.20925,40.779],[-119.20925,40.779],[-119.20895,40.77889],[-119.20895,40.77889],[-119.20864,40.77879],[-119.20864,40.77879],[-119.20834,40.7787],[-119.20834,40.7787],[-119.20802,40.77861],[-119.20802,40.77861],[-119.20771,40.77853],[-119.20771,40.77853],[-119.20739,40.77845],[-119.20739,40.77845],[-119.20716,40.7784],[-119.2074,40.77774],[-119.20755,40.77777],[-119.20788,40.77785],[-119.20821,40.77793],[-119.20853,40.77802],[-119.20885,40.77811],[-119.20917,40.77822],[-119.20948,40.77833],[-119.20979,40.77844],[-119.2101,40.77856],[-119.21031,40.77866],[-119.20986,40.77925]],[[-119.20706,40.77838],[-119.20675,40.77832],[-119.20675,40.77832],[-119.20643,40.77827],[-119.20642,40.77827],[-119.2061,40.77822],[-119.2061,40.77822],[-119.20577,40.77818],[-119.20577,40.77818],[-119.20544,40.77815],[-119.20544,40.77815],[-119.20511,40.77812],[-119.20511,40.77812],[-119.20478,40.7781],[-119.20478,40.7781],[-119.20445,40.77809],[-119.20445,40.77808],[-119.20443,40.77803],[-119.20441,40.77799],[-119.20437,40.77796],[-119.20433,40.77792],[-119.20429,40.7779],[-119.20424,40.77788],[-119.20418,40.77786],[-119.20417,40.77786],[-119.20417,40.7774],[-119.2045,40.77741],[-119.20485,40.77742],[-119.20519,40.77744],[-119.20553,40.77747],[-119.20587,40.7775],[-119.20621,40.77754],[-119.20655,40.77759],[-119.20689,40.77764],[-119.20722,40.7777],[-119.20729,40.77772],[-119.20706,40.77838]],[[-119.20402,40.77786],[-119.20401,40.77786],[-119.20395,40.77788],[-119.2039,40.7779],[-119.20385,40.77792],[-119.20381,40.77796],[-119.20378,40.77799],[-119.20376,40.77803],[-119.20374,40.77808],[-119.20374,40.77809],[-119.20345,40.7781],[-119.20345,40.7781],[-119.20312,40.77812],[-119.20312,40.77812],[-119.20279,40.77814],[-119.20279,40.77814],[-119.20246,40.77818],[-119.20246,40.77818],[-119.20213,40.77822],[-119.20213,40.77822],[-119.2018,40.77826],[-119.2018,40.77826],[-119.20148,40.77831],[-119.20148,40.77831],[-119.20116,40.77837],[-119.20115,40.77838],[-119.20113,40.77838],[-119.20089,40.77772],[-119.20109,40.77768],[-119.20143,40.77762],[-119.20176,40.77757],[-119.2021,40.77752],[-119.20244,40.77749],[-119.20278,40.77745],[-119.20313,40.77743],[-119.20347,40.77741],[-119.20381,40.77741],[-119.20402,40.7774],[-119.20402,40.77786]],[[-119.20102,40.7784],[-119.20084,40.77844],[-119.20083,40.77844],[-119.20052,40.77852],[-119.20052,40.77852],[-119.2002,40.7786],[-119.2002,40.7786],[-119.19989,40.77868],[-119.19989,40.77868],[-119.19958,40.77878],[-119.19958,40.77878],[-119.19928,40.77888],[-119.19928,40.77888],[-119.19898,40.77899],[-119.19898,40.77899],[-119.19868,40.7791],[-119.19868,40.7791],[-119.19839,40.77922],[-119.19839,40.77922],[-119.19831,40.77926],[-119.19786,40.77866],[-119.1979,40.77864],[-119.19821,40.77852],[-119.19851,40.7784],[-119.19882,40.77828],[-119.19914,40.77818],[-119.19945,40.77808],[-119.19978,40.77798],[-119.2001,40.7779],[-119.20043,40.77782],[-119.20076,40.77775],[-119.20079,40.77774],[-119.20102,40.7784]],[[-119.2004,40.77774],[-119.2004,40.77774],[-119.20007,40.77782],[-119.20007,40.77782],[-119.19974,40.77791],[-119.19974,40.77791],[-119.19941,40.778],[-119.19941,40.778],[-119.19909,40.7781],[-119.19909,40.7781],[-119.19878,40.77821],[-119.19878,40.77821],[-119.19846,40.77832],[-119.19846,40.77832],[-119.19816,40.77844],[-119.19815,40.77844],[-119.19785,40.77857],[-119.19785,40.77857],[-119.1978,40.77859],[-119.19735,40.778],[-119.19736,40.77799],[-119.19768,40.77786],[-119.19799,40.77773],[-119.19832,40.77762],[-119.19864,40.7775],[-119.19897,40.7774],[-119.1993,40.7773],[-119.19964,40.77721],[-119.19998,40.77712],[-119.20032,40.77704],[-119.20053,40.777],[-119.20076,40.77766],[-119.20073,40.77767],[-119.20073,40.77767],[-119.2004,40.77774]],[[-119.19995,40.77704],[-119.19995,40.77704],[-119.1996,40.77713],[-119.1996,40.77713],[-119.19927,40.77722],[-119.19926,40.77722],[-119.19893,40.77732],[-119.19893,40.77732],[-119.1986,40.77743],[-119.1986,40.77743],[-119.19827,40.77754],[-119.19827,40.77754],[-119.19795,40.77766],[-119.19794,40.77766],[-119.19763,40.77779],[-119.19762,40.77779],[-119.19731,40.77792],[-119.19731,40.77792],[-119.1973,40.77792],[-119.19685,40.77733],[-119.19714,40.77721],[-119.19747,40.77707],[-119.1978,40.77695],[-119.19814,40.77683],[-119.19848,40.77672],[-119.19882,40.77661],[-119.19917,40.77652],[-119.19952,40.77642],[-119.19987,40.77634],[-119.20023,40.77626],[-119.20027,40.77625],[-119.2005,40.77692],[-119.20029,40.77696],[-119.20029,40.77696],[-119.19995,40.77704]],[[-119.19984,40.77626],[-119.19984,40.77626],[-119.19949,40.77635],[-119.19949,40.77635],[-119.19913,40.77644],[-119.19913,40.77644],[-119.19878,40.77654],[-119.19878,40.77654],[-119.19844,40.77664],[-119.19844,40.77664],[-119.1981,40.77676],[-119.19809,40.77676],[-119.19776,40.77687],[-119.19776,40.77688],[-119.19742,40.777],[-119.19742,40.777],[-119.19709,40.77713],[-119.19709,40.77713],[-119.19679,40.77726],[-119.19598,40.77619],[-119.196,40.77618],[-119.19634,40.77604],[-119.19668,40.7759],[-119.19703,40.77577],[-119.19739,40.77564],[-119.19775,40.77552],[-119.19811,40.77541],[-119.19847,40.77531],[-119.19884,40.77521],[-119.19921,40.77512],[-119.19959,40.77503],[-119.19982,40.77498],[-119.20024,40.77617],[-119.2002,40.77618],[-119.2002,40.77618],[-119.19984,40.77626]],[[-119.19583,40.77616],[-119.1956,40.77626],[-119.1956,40.77626],[-119.19527,40.77642],[-119.19527,40.77642],[-119.19494,40.77658],[-119.19494,40.77658],[-119.19462,40.77675],[-119.19462,40.77675],[-119.1943,40.77693],[-119.1943,40.77693],[-119.19415,40.77701],[-119.1936,40.77647],[-119.19382,40.77634],[-119.19415,40.77616],[-119.19449,40.77599],[-119.19482,40.77582],[-119.19517,40.77566],[-119.19538,40.77557],[-119.19583,40.77616]],[[-119.19404,40.77708],[-119.19399,40.77711],[-119.19398,40.77711],[-119.19368,40.7773],[-119.19368,40.7773],[-119.19338,40.77749],[-119.19338,40.77749],[-119.19308,40.77769],[-119.19308,40.77769],[-119.19279,40.77789],[-119.19279,40.77789],[-119.19253,40.77808],[-119.1921,40.77776],[-119.19213,40.77773],[-119.19215,40.77769],[-119.19216,40.77764],[-119.19216,40.7776],[-119.19215,40.77755],[-119.19214,40.77751],[-119.19211,40.77747],[-119.19209,40.77745],[-119.19227,40.77732],[-119.19257,40.77711],[-119.19288,40.77691],[-119.19319,40.77672],[-119.19349,40.77654],[-119.19404,40.77708]],[[-119.1915,40.77746],[-119.19149,40.77747],[-119.19146,40.77751],[-119.19145,40.77755],[-119.19144,40.7776],[-119.19144,40.77764],[-119.19145,40.77769],[-119.19147,40.77773],[-119.1915,40.77776],[-119.19151,40.77777],[-119.19134,40.77791],[-119.19134,40.77791],[-119.19107,40.77814],[-119.19106,40.77814],[-119.1908,40.77837],[-119.1908,40.77837],[-119.19054,40.77861],[-119.19054,40.77861],[-119.1903,40.77884],[-119.18959,40.77842],[-119.18971,40.7783],[-119.18997,40.77806],[-119.19024,40.77782],[-119.19051,40.77758],[-119.1908,40.77735],[-119.19107,40.77713],[-119.1915,40.77746]],[[-119.19117,40.77706],[-119.19138,40.7769],[-119.19169,40.77668],[-119.19199,40.77647],[-119.19231,40.77627],[-119.19263,40.77607],[-119.19287,40.77593],[-119.19342,40.77647],[-119.19312,40.77665],[-119.19312,40.77665],[-119.19281,40.77685],[-119.19281,40.77685],[-119.1925,40.77705],[-119.1925,40.77705],[-119.1922,40.77726],[-119.1922,40.77726],[-119.19202,40.77739],[-119.19199,40.77738],[-119.19194,40.77736],[-119.19189,40.77734],[-119.19183,40.77734],[-119.19177,40.77734],[-119.19171,40.77734],[-119.19166,40.77736],[-119.19161,40.77738],[-119.1916,40.77738],[-119.19117,40.77706]],[[-119.19298,40.77586],[-119.19329,40.77569],[-119.19363,40.7755],[-119.19397,40.77532],[-119.19432,40.77515],[-119.19468,40.77499],[-119.19488,40.7749],[-119.19533,40.77549],[-119.19511,40.77559],[-119.19511,40.77559],[-119.19477,40.77575],[-119.19477,40.77575],[-119.19443,40.77592],[-119.19442,40.77592],[-119.19409,40.77609],[-119.19409,40.77609],[-119.19376,40.77627],[-119.19376,40.77627],[-119.19353,40.7764],[-119.19298,40.77586]],[[-119.19497,40.77486],[-119.19503,40.77483],[-119.1954,40.77468],[-119.19577,40.77453],[-119.19614,40.77439],[-119.19651,40.77426],[-119.19689,40.77413],[-119.19704,40.77408],[-119.19739,40.77472],[-119.19728,40.77475],[-119.19728,40.77475],[-119.19691,40.77487],[-119.19691,40.77487],[-119.19654,40.775],[-119.19654,40.77501],[-119.19618,40.77514],[-119.19618,40.77514],[-119.19582,40.77528],[-119.19582,40.77529],[-119.19546,40.77543],[-119.19546,40.77543],[-119.19542,40.77545],[-119.19497,40.77486]],[[-119.19711,40.77406],[-119.19728,40.77401],[-119.19767,40.77389],[-119.19806,40.77379],[-119.19845,40.77369],[-119.19885,40.77359],[-119.19925,40.77351],[-119.19929,40.7735],[-119.19953,40.77416],[-119.19919,40.77423],[-119.19919,40.77423],[-119.1988,40.77432],[-119.1988,40.77432],[-119.19842,40.77442],[-119.19842,40.77442],[-119.19803,40.77452],[-119.19803,40.77452],[-119.19766,40.77463],[-119.19765,40.77463],[-119.19745,40.7747],[-119.19711,40.77406]],[[-119.1994,40.77348],[-119.19965,40.77343],[-119.20005,40.77335],[-119.20046,40.77329],[-119.20087,40.77323],[-119.20128,40.77318],[-119.20166,40.77313],[-119.20178,40.77381],[-119.20157,40.77384],[-119.20157,40.77384],[-119.20117,40.77389],[-119.20116,40.77389],[-119.20077,40.77394],[-119.20077,40.77394],[-119.20037,40.774],[-119.20037,40.774],[-119.19997,40.77407],[-119.19997,40.77407],[-119.19963,40.77414],[-119.1994,40.77348]],[[-119.20174,40.77313],[-119.2021,40.77309],[-119.20251,40.77306],[-119.20293,40.77304],[-119.20334,40.77302],[-119.20376,40.77301],[-119.20402,40.77301],[-119.20402,40.77347],[-119.20401,40.77347],[-119.20395,40.77349],[-119.2039,40.77351],[-119.20385,40.77353],[-119.20381,40.77356],[-119.20378,40.7736],[-119.20376,40.77364],[-119.20374,40.77368],[-119.20374,40.7737],[-119.20359,40.7737],[-119.20359,40.7737],[-119.20318,40.77372],[-119.20318,40.77372],[-119.20278,40.77373],[-119.20278,40.77373],[-119.20237,40.77376],[-119.20237,40.77376],[-119.20197,40.7738],[-119.20197,40.7738],[-119.20185,40.77381],[-119.20174,40.77313]],[[-119.20602,40.77378],[-119.20602,40.77378],[-119.20561,40.77375],[-119.20561,40.77375],[-119.20521,40.77372],[-119.20521,40.77372],[-119.2048,40.77371],[-119.2048,40.77371],[-119.20445,40.7737],[-119.20445,40.77368],[-119.20443,40.77364],[-119.20441,40.7736],[-119.20437,40.77356],[-119.20433,40.77353],[-119.20429,40.77351],[-119.20424,40.77349],[-119.20418,40.77347],[-119.20417,40.77347],[-119.20417,40.77301],[-119.20417,40.77301],[-119.20459,40.77302],[-119.205,40.77303],[-119.20542,40.77305],[-119.20583,40.77307],[-119.20624,40.77311],[-119.20645,40.77313],[-119.20633,40.77381],[-119.20602,40.77378]],[[-119.20652,40.77313],[-119.20666,40.77315],[-119.20707,40.77319],[-119.20747,40.77325],[-119.20788,40.77331],[-119.20829,40.77338],[-119.20869,40.77346],[-119.20879,40.77348],[-119.20856,40.77414],[-119.20841,40.77411],[-119.20841,40.77411],[-119.20802,40.77404],[-119.20802,40.77404],[-119.20762,40.77397],[-119.20762,40.77397],[-119.20722,40.77391],[-119.20722,40.77391],[-119.20682,40.77386],[-119.20682,40.77386],[-119.20642,40.77382],[-119.20642,40.77382],[-119.20641,40.77381],[-119.20652,40.77313]],[[-119.20889,40.7735],[-119.20909,40.77354],[-119.20949,40.77363],[-119.20989,40.77372],[-119.21028,40.77383],[-119.21067,40.77394],[-119.21105,40.77405],[-119.21108,40.77406],[-119.21073,40.7747],[-119.21072,40.77469],[-119.21072,40.77469],[-119.21034,40.77458],[-119.21034,40.77458],[-119.20996,40.77447],[-119.20996,40.77447],[-119.20958,40.77437],[-119.20958,40.77437],[-119.20919,40.77428],[-119.20919,40.77428],[-119.2088,40.77419],[-119.2088,40.77419],[-119.20866,40.77416],[-119.20889,40.7735]],[[-119.21115,40.77408],[-119.21144,40.77418],[-119.21181,40.77431],[-119.21219,40.77444],[-119.21256,40.77458],[-119.21293,40.77473],[-119.2132,40.77485],[-119.21275,40.77545],[-119.21255,40.77536],[-119.21255,40.77536],[-119.21219,40.77521],[-119.21219,40.77521],[-119.21183,40.77507],[-119.21183,40.77507],[-119.21147,40.77494],[-119.21146,40.77494],[-119.2111,40.77481],[-119.21109,40.77481],[-119.2108,40.77472],[-119.21115,40.77408]],[[-119.21338,40.77484],[-119.21383,40.77424],[-119.21409,40.77436],[-119.21446,40.77453],[-119.21481,40.7747],[-119.21517,40.77489],[-119.21551,40.77508],[-119.21582,40.77525],[-119.21527,40.77579],[-119.21509,40.77569],[-119.21509,40.77569],[-119.21475,40.7755],[-119.21475,40.7755],[-119.21441,40.77532],[-119.2144,40.77532],[-119.21406,40.77515],[-119.21405,40.77515],[-119.2137,40.77498],[-119.2137,40.77498],[-119.21338,40.77484]],[[-119.21593,40.77532],[-119.21619,40.77547],[-119.21652,40.77568],[-119.21685,40.77589],[-119.21716,40.7761],[-119.21747,40.77632],[-119.21773,40.77651],[-119.21709,40.777],[-119.21699,40.77692],[-119.21699,40.77692],[-119.21669,40.77671],[-119.21669,40.7767],[-119.21638,40.77649],[-119.21638,40.77649],[-119.21607,40.77628],[-119.21607,40.77628],[-119.21575,40.77608],[-119.21575,40.77608],[-119.21542,40.77588],[-119.21542,40.77588],[-119.21538,40.77586],[-119.21593,40.77532]],[[-119.21783,40.77659],[-119.21808,40.77678],[-119.21837,40.77702],[-119.21865,40.77726],[-119.21893,40.77751],[-119.2192,40.77776],[-119.2194,40.77795],[-119.21869,40.77837],[-119.21866,40.77835],[-119.21866,40.77834],[-119.2184,40.7781],[-119.2184,40.7781],[-119.21813,40.77785],[-119.21813,40.77785],[-119.21786,40.77761],[-119.21786,40.77761],[-119.21758,40.77738],[-119.21758,40.77738],[-119.21729,40.77715],[-119.21729,40.77715],[-119.21719,40.77708],[-119.21783,40.77659]],[[-119.21949,40.77804],[-119.21972,40.77827],[-119.21997,40.77854],[-119.22021,40.77881],[-119.22044,40.77908],[-119.22067,40.77935],[-119.22082,40.77955],[-119.22004,40.77989],[-119.21985,40.77965],[-119.21985,40.77965],[-119.21963,40.77938],[-119.21963,40.77938],[-119.2194,40.77912],[-119.2194,40.77912],[-119.21916,40.77886],[-119.21916,40.77885],[-119.21891,40.7786],[-119.21891,40.7786],[-119.21878,40.77846],[-119.21949,40.77804]],[[-119.21883,40.77865],[-119.21907,40.7789],[-119.21931,40.77916],[-119.21954,40.77943],[-119.21976,40.77969],[-119.21994,40.77993],[-119.21916,40.78028],[-119.21915,40.78026],[-119.21915,40.78026],[-119.21894,40.77999],[-119.21894,40.77999],[-119.21872,40.77973],[-119.21872,40.77973],[-119.2185,40.77948],[-119.2185,40.77948],[-119.21826,40.77922],[-119.21826,40.77922],[-119.21802,40.77898],[-119.21802,40.77898],[-119.21797,40.77893],[-119.21869,40.77851],[-119.21883,40.77865]],[[-119.21794,40.77902],[-119.21818,40.77927],[-119.21841,40.77952],[-119.21863,40.77978],[-119.21885,40.78004],[-119.21905,40.7803],[-119.21907,40.78032],[-119.21829,40.78066],[-119.21824,40.7806],[-119.21824,40.7806],[-119.21803,40.78034],[-119.21803,40.78034],[-119.21782,40.78009],[-119.21782,40.78009],[-119.2176,40.77984],[-119.2176,40.77984],[-119.21737,40.7796],[-119.21737,40.7796],[-119.21717,40.7794],[-119.21789,40.77898],[-119.21794,40.77902]],[[-119.21708,40.77931],[-119.21689,40.77912],[-119.21689,40.77912],[-119.21664,40.77889],[-119.21664,40.77889],[-119.21639,40.77867],[-119.21639,40.77867],[-119.21612,40.77845],[-119.21612,40.77845],[-119.21585,40.77823],[-119.21585,40.77823],[-119.21576,40.77816],[-119.21619,40.77784],[-119.21622,40.77785],[-119.21627,40.77787],[-119.21633,40.77788],[-119.21639,40.77788],[-119.21645,40.77788],[-119.2165,40.77787],[-119.21656,40.77785],[-119.2166,40.77783],[-119.21663,40.77786],[-119.21691,40.77808],[-119.21718,40.77831],[-119.21744,40.77854],[-119.21769,40.77878],[-119.2178,40.77889],[-119.21708,40.77931]],[[-119.21558,40.77814],[-119.21443,40.77902],[-119.21435,40.77896],[-119.21435,40.77895],[-119.21408,40.77876],[-119.21408,40.77876],[-119.21381,40.77857],[-119.21381,40.77857],[-119.21352,40.77839],[-119.21352,40.77838],[-119.21323,40.77821],[-119.21323,40.77821],[-119.21294,40.77803],[-119.21294,40.77803],[-119.21264,40.77787],[-119.21264,40.77786],[-119.21233,40.7777],[-119.21233,40.7777],[-119.21202,40.77755],[-119.21202,40.77755],[-119.2117,40.7774],[-119.2117,40.7774],[-119.2115,40.77731],[-119.21232,40.77624],[-119.2124,40.77628],[-119.21274,40.77643],[-119.21306,40.77659],[-119.21339,40.77676],[-119.21371,40.77693],[-119.21402,40.77711],[-119.21433,40.77729],[-119.21463,40.77748],[-119.21492,40.77767],[-119.21521,40.77787],[-119.2155,40.77808],[-119.21558,40.77814]],[[-119.21165,40.77747],[-119.21196,40.77762],[-119.21227,40.77777],[-119.21257,40.77793],[-119.21287,40.7781],[-119.21317,40.77827],[-119.21345,40.77845],[-119.21373,40.77863],[-119.21401,40.77882],[-119.21428,40.77901],[-119.21436,40.77908],[-119.21372,40.77956],[-119.21364,40.7795],[-119.21364,40.7795],[-119.21338,40.77931],[-119.21338,40.77931],[-119.21311,40.77913],[-119.21311,40.77913],[-119.21284,40.77895],[-119.21284,40.77895],[-119.21256,40.77878],[-119.21256,40.77878],[-119.21227,40.77861],[-119.21227,40.77861],[-119.21198,40.77845],[-119.21198,40.77845],[-119.21168,40.7783],[-119.21168,40.7783],[-119.21138,40.77815],[-119.21138,40.77815],[-119.21107,40.77801],[-119.21107,40.77801],[-119.211,40.77797],[-119.21145,40.77738],[-119.21165,40.77747]],[[-119.21221,40.77868],[-119.21249,40.77884],[-119.21277,40.77902],[-119.21304,40.77919],[-119.21331,40.77937],[-119.21357,40.77956],[-119.21366,40.77963],[-119.21302,40.78011],[-119.21293,40.78005],[-119.21293,40.78005],[-119.21268,40.77987],[-119.21268,40.77987],[-119.21242,40.77969],[-119.21242,40.77969],[-119.21216,40.77952],[-119.21216,40.77952],[-119.21189,40.77936],[-119.21189,40.77936],[-119.21161,40.7792],[-119.21161,40.7792],[-119.2115,40.77914],[-119.21203,40.77858],[-119.21221,40.77868]],[[-119.21373,40.77969],[-119.21382,40.77975],[-119.21407,40.77995],[-119.21431,40.78015],[-119.21454,40.78036],[-119.21476,40.78057],[-119.21498,40.78079],[-119.21511,40.78092],[-119.21438,40.78132],[-119.2143,40.78124],[-119.2143,40.78124],[-119.21409,40.78103],[-119.21409,40.78103],[-119.21387,40.78083],[-119.21387,40.78082],[-119.21365,40.78062],[-119.21365,40.78062],[-119.21342,40.78043],[-119.21342,40.78043],[-119.21318,40.78024],[-119.21318,40.78024],[-119.21309,40.78017],[-119.21373,40.77969]],[[-119.21144,40.77911],[-119.21133,40.77904],[-119.21133,40.77904],[-119.21104,40.7789],[-119.21104,40.7789],[-119.21075,40.77875],[-119.21075,40.77875],[-119.21049,40.77864],[-119.21094,40.77804],[-119.21102,40.77808],[-119.21132,40.77822],[-119.21162,40.77837],[-119.21192,40.77852],[-119.21197,40.77855],[-119.21144,40.77911]],[[-119.21037,40.77858],[-119.21015,40.77849],[-119.21015,40.77849],[-119.20984,40.77837],[-119.20984,40.77837],[-119.20953,40.77825],[-119.20953,40.77825],[-119.20921,40.77814],[-119.20921,40.77814],[-119.20889,40.77804],[-119.20889,40.77804],[-119.20857,40.77794],[-119.20857,40.77794],[-119.20825,40.77785],[-119.20824,40.77785],[-119.20792,40.77777],[-119.20791,40.77777],[-119.20758,40.77769],[-119.20758,40.77769],[-119.20743,40.77766],[-119.20766,40.777],[-119.20774,40.77701],[-119.20808,40.77709],[-119.20842,40.77717],[-119.20876,40.77726],[-119.20909,40.77736],[-119.20942,40.77746],[-119.20975,40.77757],[-119.21007,40.77769],[-119.21039,40.77781],[-119.21071,40.77794],[-119.21082,40.77799],[-119.21037,40.77858]],[[-119.20732,40.77764],[-119.20725,40.77762],[-119.20725,40.77762],[-119.20691,40.77756],[-119.20691,40.77756],[-119.20657,40.77751],[-119.20657,40.77751],[-119.20623,40.77746],[-119.20623,40.77746],[-119.20589,40.77742],[-119.20589,40.77742],[-119.20554,40.77738],[-119.20554,40.77738],[-119.2052,40.77736],[-119.2052,40.77736],[-119.20485,40.77734],[-119.20485,40.77734],[-119.20451,40.77733],[-119.20451,40.77733],[-119.20417,40.77732],[-119.20417,40.77663],[-119.20421,40.77663],[-119.20456,40.77664],[-119.20492,40.77665],[-119.20528,40.77667],[-119.20563,40.7767],[-119.20599,40.77674],[-119.20634,40.77678],[-119.20669,40.77683],[-119.20704,40.77688],[-119.20739,40.77694],[-119.20756,40.77698],[-119.20732,40.77764]],[[-119.20402,40.77732],[-119.20381,40.77732],[-119.20381,40.77732],[-119.20347,40.77733],[-119.20346,40.77733],[-119.20312,40.77735],[-119.20312,40.77735],[-119.20277,40.77737],[-119.20277,40.77737],[-119.20243,40.7774],[-119.20243,40.7774],[-119.20209,40.77744],[-119.20208,40.77744],[-119.20174,40.77749],[-119.20174,40.77749],[-119.2014,40.77754],[-119.2014,40.77754],[-119.20107,40.7776],[-119.20106,40.7776],[-119.20087,40.77764],[-119.20063,40.77698],[-119.20067,40.77697],[-119.20101,40.7769],[-119.20136,40.77685],[-119.20171,40.77679],[-119.20207,40.77675],[-119.20242,40.77671],[-119.20278,40.77668],[-119.20313,40.77666],[-119.20349,40.77664],[-119.20385,40.77664],[-119.20402,40.77664],[-119.20402,40.77732]],[[-119.20205,40.77667],[-119.20205,40.77667],[-119.2017,40.77671],[-119.20169,40.77671],[-119.20134,40.77676],[-119.20134,40.77676],[-119.20099,40.77682],[-119.20099,40.77682],[-119.20064,40.77689],[-119.20064,40.77689],[-119.2006,40.7769],[-119.20037,40.77623],[-119.20059,40.77619],[-119.20095,40.77613],[-119.20131,40.77607],[-119.20167,40.77602],[-119.20204,40.77598],[-119.20241,40.77594],[-119.20278,40.77591],[-119.20315,40.77589],[-119.20352,40.77587],[-119.20389,40.77587],[-119.20402,40.77587],[-119.20402,40.77655],[-119.20385,40.77655],[-119.20385,40.77655],[-119.20349,40.77656],[-119.20348,40.77656],[-119.20313,40.77658],[-119.20313,40.77658],[-119.20277,40.7766],[-119.20277,40.7766],[-119.20241,40.77663],[-119.20241,40.77663],[-119.20205,40.77667]],[[-119.20203,40.77589],[-119.20202,40.77589],[-119.20166,40.77594],[-119.20166,40.77594],[-119.20129,40.77599],[-119.20129,40.77599],[-119.20093,40.77605],[-119.20092,40.77605],[-119.20056,40.77611],[-119.20056,40.77611],[-119.20034,40.77615],[-119.19992,40.77496],[-119.19996,40.77495],[-119.20034,40.77488],[-119.20072,40.77482],[-119.20111,40.77476],[-119.20149,40.77471],[-119.20188,40.77466],[-119.20227,40.77463],[-119.20266,40.7746],[-119.20304,40.77457],[-119.20343,40.77456],[-119.20383,40.77455],[-119.20402,40.77455],[-119.20402,40.77578],[-119.20388,40.77578],[-119.20388,40.77578],[-119.20351,40.77579],[-119.20351,40.77579],[-119.20314,40.77581],[-119.20314,40.77581],[-119.20277,40.77583],[-119.20277,40.77583],[-119.2024,40.77586],[-119.20239,40.77586],[-119.20203,40.77589]],[[-119.19979,40.7749],[-119.19956,40.77495],[-119.19956,40.77495],[-119.19918,40.77504],[-119.19918,40.77504],[-119.19881,40.77513],[-119.19881,40.77513],[-119.19844,40.77523],[-119.19844,40.77523],[-119.19807,40.77534],[-119.19807,40.77534],[-119.19784,40.77541],[-119.1975,40.77477],[-119.19769,40.77471],[-119.19807,40.7746],[-119.19845,40.7745],[-119.19883,40.7744],[-119.19922,40.77431],[-119.19956,40.77424],[-119.19979,40.7749]],[[-119.19777,40.77543],[-119.19771,40.77545],[-119.1977,40.77545],[-119.19734,40.77557],[-119.19734,40.77557],[-119.19699,40.77569],[-119.19699,40.77569],[-119.19664,40.77583],[-119.19663,40.77583],[-119.19629,40.77597],[-119.19629,40.77597],[-119.19594,40.77611],[-119.19594,40.77611],[-119.19593,40.77612],[-119.19547,40.77552],[-119.19552,40.77551],[-119.19587,40.77536],[-119.19623,40.77522],[-119.19659,40.77508],[-119.19695,40.77495],[-119.19732,40.77483],[-119.19743,40.77479],[-119.19777,40.77543]],[[-119.19966,40.77422],[-119.2,40.77415],[-119.20039,40.77408],[-119.20079,40.77402],[-119.20118,40.77397],[-119.20158,40.77392],[-119.2018,40.7739],[-119.20191,40.77458],[-119.20186,40.77458],[-119.20186,40.77458],[-119.20148,40.77463],[-119.20147,40.77463],[-119.20109,40.77468],[-119.20109,40.77468],[-119.2007,40.77473],[-119.2007,40.77473],[-119.20032,40.7748],[-119.20032,40.7748],[-119.19994,40.77487],[-119.19994,40.77487],[-119.19989,40.77488],[-119.19966,40.77422]],[[-119.20187,40.77389],[-119.20198,40.77388],[-119.20238,40.77384],[-119.20278,40.77382],[-119.20319,40.7738],[-119.20359,40.77378],[-119.20374,40.77378],[-119.20375,40.77381],[-119.20377,40.77386],[-119.2038,40.77389],[-119.20383,40.77393],[-119.20388,40.77396],[-119.20393,40.77398],[-119.20398,40.774],[-119.20402,40.77401],[-119.20402,40.77447],[-119.20382,40.77447],[-119.20382,40.77447],[-119.20343,40.77448],[-119.20343,40.77448],[-119.20304,40.77449],[-119.20304,40.77449],[-119.20265,40.77451],[-119.20264,40.77451],[-119.20226,40.77454],[-119.20225,40.77454],[-119.20199,40.77457],[-119.20187,40.77389]],[[-119.20417,40.77401],[-119.20421,40.774],[-119.20426,40.77398],[-119.20431,40.77396],[-119.20435,40.77393],[-119.20439,40.77389],[-119.20442,40.77386],[-119.20444,40.77381],[-119.20445,40.77378],[-119.2048,40.77379],[-119.2052,40.77381],[-119.2056,40.77383],[-119.20601,40.77386],[-119.20632,40.77389],[-119.2062,40.77457],[-119.20618,40.77457],[-119.20618,40.77457],[-119.20579,40.77453],[-119.20579,40.77453],[-119.2054,40.7745],[-119.20539,40.7745],[-119.205,40.77448],[-119.205,40.77448],[-119.20461,40.77447],[-119.20461,40.77447],[-119.20422,40.77447],[-119.20422,40.77447],[-119.20417,40.77447],[-119.20417,40.77401]],[[-119.20639,40.7739],[-119.20641,40.7739],[-119.20681,40.77394],[-119.2072,40.77399],[-119.2076,40.77405],[-119.20799,40.77412],[-119.20838,40.77419],[-119.20853,40.77422],[-119.20829,40.77488],[-119.20811,40.77484],[-119.20811,40.77484],[-119.20773,40.77477],[-119.20773,40.77477],[-119.20734,40.77471],[-119.20734,40.77471],[-119.20696,40.77466],[-119.20695,40.77466],[-119.20657,40.77461],[-119.20657,40.77461],[-119.20627,40.77458],[-119.20639,40.7739]],[[-119.20863,40.77424],[-119.20877,40.77427],[-119.20916,40.77435],[-119.20955,40.77445],[-119.20993,40.77455],[-119.21031,40.77465],[-119.21068,40.77477],[-119.21069,40.77477],[-119.21035,40.77541],[-119.21035,40.77541],[-119.21035,40.77541],[-119.20998,40.7753],[-119.20998,40.77529],[-119.20961,40.77519],[-119.20961,40.77519],[-119.20924,40.77509],[-119.20924,40.77509],[-119.20887,40.775],[-119.20887,40.775],[-119.20849,40.77492],[-119.20849,40.77492],[-119.2084,40.7749],[-119.20863,40.77424]],[[-119.21076,40.77479],[-119.21105,40.77489],[-119.21142,40.77501],[-119.21178,40.77515],[-119.21214,40.77529],[-119.2125,40.77543],[-119.2127,40.77552],[-119.21225,40.77611],[-119.21212,40.77606],[-119.21212,40.77606],[-119.21177,40.77591],[-119.21177,40.77591],[-119.21142,40.77578],[-119.21142,40.77578],[-119.21107,40.77565],[-119.21107,40.77565],[-119.21071,40.77552],[-119.21071,40.77552],[-119.21041,40.77543],[-119.21076,40.77479]],[[-119.2129,40.77551],[-119.2129,40.77551],[-119.21288,40.7755],[-119.21333,40.77491],[-119.21364,40.77505],[-119.214,40.77522],[-119.21434,40.77539],[-119.21469,40.77557],[-119.21502,40.77576],[-119.2152,40.77586],[-119.21465,40.7764],[-119.21459,40.77637],[-119.21459,40.77637],[-119.21426,40.77618],[-119.21426,40.77618],[-119.21393,40.77601],[-119.21393,40.77601],[-119.21359,40.77584],[-119.21359,40.77584],[-119.21325,40.77567],[-119.21325,40.77567],[-119.2129,40.77551]],[[-119.21532,40.77593],[-119.21535,40.77595],[-119.21568,40.77614],[-119.216,40.77634],[-119.21631,40.77655],[-119.21662,40.77677],[-119.21692,40.77698],[-119.21701,40.77706],[-119.21659,40.77738],[-119.21658,40.77738],[-119.21653,40.77736],[-119.21647,40.77734],[-119.21642,40.77734],[-119.21636,40.77734],[-119.2163,40.77734],[-119.21625,40.77736],[-119.2162,40.77738],[-119.21617,40.77739],[-119.21614,40.77736],[-119.21614,40.77736],[-119.21584,40.77715],[-119.21584,40.77715],[-119.21554,40.77695],[-119.21554,40.77695],[-119.21523,40.77675],[-119.21523,40.77675],[-119.21491,40.77656],[-119.21491,40.77655],[-119.21477,40.77647],[-119.21532,40.77593]],[[-119.21712,40.77713],[-119.21721,40.77721],[-119.2175,40.77743],[-119.21778,40.77767],[-119.21805,40.77791],[-119.21832,40.77815],[-119.21858,40.7784],[-119.2186,40.77842],[-119.21789,40.77884],[-119.21778,40.77873],[-119.21777,40.77873],[-119.21752,40.77849],[-119.21752,40.77849],[-119.21726,40.77826],[-119.21726,40.77826],[-119.21699,40.77803],[-119.21699,40.77803],[-119.21671,40.7778],[-119.21671,40.7778],[-119.21668,40.77777],[-119.21669,40.77776],[-119.21671,40.77773],[-119.21674,40.77769],[-119.21675,40.77764],[-119.21675,40.7776],[-119.21674,40.77755],[-119.21673,40.77751],[-119.2167,40.77747],[-119.21669,40.77746],[-119.21712,40.77713]],[[-119.21606,40.77742],[-119.2161,40.77745],[-119.21608,40.77747],[-119.21605,40.77751],[-119.21603,40.77755],[-119.21603,40.7776],[-119.21603,40.77764],[-119.21604,40.77769],[-119.21606,40.77773],[-119.21609,40.77776],[-119.21566,40.77808],[-119.21557,40.77802],[-119.21557,40.77802],[-119.21529,40.77781],[-119.21529,40.77781],[-119.215,40.77761],[-119.215,40.77761],[-119.2147,40.77742],[-119.2147,40.77742],[-119.2144,40.77723],[-119.21439,40.77722],[-119.21415,40.77708],[-119.2147,40.77654],[-119.21484,40.77662],[-119.21516,40.77681],[-119.21547,40.77701],[-119.21577,40.77721],[-119.21606,40.77742]],[[-119.21404,40.77701],[-119.21377,40.77686],[-119.21377,40.77686],[-119.21345,40.77669],[-119.21345,40.77669],[-119.21312,40.77652],[-119.21312,40.77652],[-119.21279,40.77636],[-119.21279,40.77636],[-119.21246,40.7762],[-119.21246,40.7762],[-119.21237,40.77617],[-119.21282,40.77557],[-119.21285,40.77558],[-119.21319,40.77574],[-119.21353,40.7759],[-119.21387,40.77607],[-119.2142,40.77625],[-119.21452,40.77643],[-119.21459,40.77647],[-119.21404,40.77701]],[[-119.21206,40.77613],[-119.21219,40.77618],[-119.21138,40.77725],[-119.21106,40.77712],[-119.21105,40.77712],[-119.21073,40.77698],[-119.21072,40.77698],[-119.21039,40.77686],[-119.21039,40.77686],[-119.21005,40.77674],[-119.21005,40.77674],[-119.20971,40.77663],[-119.20971,40.77663],[-119.20936,40.77653],[-119.20936,40.77652],[-119.20901,40.77643],[-119.20901,40.77643],[-119.20866,40.77634],[-119.20866,40.77634],[-119.2083,40.77625],[-119.2083,40.77625],[-119.20795,40.77617],[-119.20837,40.77498],[-119.20846,40.775],[-119.20883,40.77508],[-119.20921,40.77517],[-119.20958,40.77527],[-119.20994,40.77537],[-119.21031,40.77548],[-119.21067,40.7756],[-119.21102,40.77572],[-119.21137,40.77585],[-119.21172,40.77599],[-119.21206,40.77613]],[[-119.20827,40.77633],[-119.20862,40.77641],[-119.20897,40.7765],[-119.20932,40.7766],[-119.20967,40.77671],[-119.21001,40.77682],[-119.21034,40.77693],[-119.21068,40.77706],[-119.211,40.77719],[-119.21133,40.77732],[-119.21087,40.77792],[-119.21076,40.77787],[-119.21076,40.77787],[-119.21044,40.77774],[-119.21044,40.77774],[-119.21012,40.77762],[-119.21012,40.77761],[-119.2098,40.7775],[-119.2098,40.7775],[-119.20947,40.77739],[-119.20947,40.77739],[-119.20913,40.77728],[-119.20913,40.77728],[-119.2088,40.77719],[-119.2088,40.77718],[-119.20846,40.77709],[-119.20845,40.77709],[-119.20811,40.77701],[-119.20811,40.77701],[-119.20777,40.77693],[-119.20777,40.77693],[-119.20769,40.77692],[-119.20792,40.77625],[-119.20827,40.77633]],[[-119.20758,40.7769],[-119.20742,40.77686],[-119.20742,40.77686],[-119.20707,40.7768],[-119.20707,40.7768],[-119.20671,40.77674],[-119.20671,40.77674],[-119.20636,40.7767],[-119.20636,40.7767],[-119.206,40.77665],[-119.206,40.77665],[-119.20565,40.77662],[-119.20564,40.77662],[-119.20529,40.77659],[-119.20529,40.77659],[-119.20493,40.77657],[-119.20493,40.77657],[-119.20457,40.77656],[-119.20457,40.77656],[-119.20421,40.77655],[-119.20421,40.77655],[-119.20417,40.77655],[-119.20417,40.77587],[-119.20426,40.77587],[-119.20463,40.77587],[-119.205,40.77589],[-119.20537,40.77591],[-119.20573,40.77594],[-119.2061,40.77597],[-119.20647,40.77601],[-119.20683,40.77606],[-119.20719,40.77612],[-119.20756,40.77618],[-119.20782,40.77623],[-119.20758,40.7769]],[[-119.20758,40.7761],[-119.20758,40.7761],[-119.20722,40.77604],[-119.20722,40.77604],[-119.20685,40.77598],[-119.20685,40.77598],[-119.20649,40.77593],[-119.20648,40.77593],[-119.20612,40.77589],[-119.20612,40.77589],[-119.20575,40.77585],[-119.20575,40.77585],[-119.20538,40.77583],[-119.20537,40.77583],[-119.205,40.7758],[-119.205,40.7758],[-119.20463,40.77579],[-119.20463,40.77579],[-119.20426,40.77578],[-119.20426,40.77578],[-119.20417,40.77578],[-119.20417,40.77455],[-119.20422,40.77455],[-119.20461,40.77455],[-119.205,40.77457],[-119.20539,40.77459],[-119.20578,40.77461],[-119.20616,40.77465],[-119.20655,40.77469],[-119.20694,40.77474],[-119.20732,40.77479],[-119.2077,40.77485],[-119.20808,40.77492],[-119.20827,40.77496],[-119.20784,40.77615],[-119.20758,40.7761]],[[-119.22421,40.78701],[-119.22475,40.78701],[-119.22475,40.78704],[-119.22474,40.78737],[-119.22473,40.78771],[-119.2247,40.78804],[-119.22467,40.78838],[-119.22462,40.78871],[-119.22458,40.78898],[-119.22404,40.78892],[-119.22408,40.78871],[-119.22408,40.78871],[-119.22412,40.78838],[-119.22412,40.78838],[-119.22416,40.78805],[-119.22416,40.78805],[-119.22418,40.78772],[-119.22418,40.78772],[-119.2242,40.78739],[-119.2242,40.78739],[-119.22421,40.78706],[-119.22421,40.78706],[-119.22421,40.78701]],[[-119.22393,40.78897],[-119.22391,40.78903],[-119.22385,40.78936],[-119.22378,40.78968],[-119.2237,40.79001],[-119.2236,40.79033],[-119.2235,40.79065],[-119.22343,40.79085],[-119.22291,40.79074],[-119.22295,40.79063],[-119.22295,40.79062],[-119.22305,40.79031],[-119.22305,40.79031],[-119.22315,40.78999],[-119.22315,40.78999],[-119.22323,40.78967],[-119.22323,40.78967],[-119.2233,40.78935],[-119.2233,40.78935],[-119.22337,40.78903],[-119.22337,40.78903],[-119.22339,40.78891],[-119.22393,40.78897]],[[-119.22361,40.79067],[-119.22361,40.79067],[-119.22371,40.79035],[-119.22371,40.79035],[-119.2238,40.79002],[-119.2238,40.79002],[-119.22388,40.7897],[-119.22388,40.7897],[-119.22396,40.78937],[-119.22396,40.78937],[-119.22402,40.78904],[-119.22402,40.78904],[-119.22403,40.78898],[-119.22457,40.78903],[-119.22457,40.78904],[-119.2245,40.78938],[-119.22443,40.78971],[-119.22435,40.79004],[-119.22426,40.79037],[-119.22416,40.79069],[-119.22406,40.79098],[-119.22354,40.79087],[-119.22361,40.79067]],[[-119.22403,40.79106],[-119.22393,40.79134],[-119.2238,40.79166],[-119.22367,40.79198],[-119.22352,40.7923],[-119.22337,40.79261],[-119.2232,40.79292],[-119.22319,40.79294],[-119.22269,40.79278],[-119.22281,40.79256],[-119.22281,40.79256],[-119.22296,40.79225],[-119.22296,40.79225],[-119.22311,40.79194],[-119.22311,40.79194],[-119.22325,40.79163],[-119.22325,40.79163],[-119.22338,40.79131],[-119.22338,40.79131],[-119.2235,40.79099],[-119.2235,40.79099],[-119.22351,40.79095],[-119.22403,40.79106]],[[-119.22317,40.79299],[-119.22303,40.79323],[-119.22285,40.79354],[-119.22266,40.79384],[-119.22246,40.79414],[-119.22226,40.79444],[-119.22204,40.79473],[-119.22201,40.79477],[-119.22154,40.79456],[-119.22169,40.79436],[-119.22169,40.79436],[-119.2219,40.79407],[-119.2219,40.79407],[-119.2221,40.79378],[-119.2221,40.79378],[-119.22229,40.79348],[-119.22229,40.79348],[-119.22247,40.79318],[-119.22247,40.79318],[-119.22264,40.79287],[-119.22264,40.79287],[-119.22267,40.79283],[-119.22317,40.79299]],[[-119.22196,40.79484],[-119.22182,40.79502],[-119.22159,40.79531],[-119.22135,40.79559],[-119.2211,40.79587],[-119.22085,40.79614],[-119.22059,40.79641],[-119.22053,40.79647],[-119.2201,40.79622],[-119.22028,40.79604],[-119.22028,40.79604],[-119.22053,40.79577],[-119.22053,40.79577],[-119.22078,40.7955],[-119.22078,40.7955],[-119.22102,40.79522],[-119.22102,40.79522],[-119.22125,40.79494],[-119.22125,40.79494],[-119.22148,40.79465],[-119.22148,40.79465],[-119.22149,40.79463],[-119.22196,40.79484]],[[-119.22044,40.79656],[-119.22032,40.79668],[-119.22004,40.79694],[-119.21975,40.7972],[-119.21946,40.79745],[-119.21916,40.7977],[-119.21886,40.79794],[-119.21875,40.79802],[-119.21837,40.79773],[-119.21859,40.79756],[-119.21859,40.79756],[-119.21889,40.79732],[-119.21889,40.79732],[-119.21918,40.79707],[-119.21918,40.79707],[-119.21946,40.79682],[-119.21947,40.79682],[-119.21974,40.79656],[-119.21974,40.79656],[-119.22001,40.79631],[-119.22044,40.79656]],[[-119.21865,40.7981],[-119.21855,40.79817],[-119.21823,40.79841],[-119.2179,40.79863],[-119.21757,40.79886],[-119.21723,40.79907],[-119.21689,40.79928],[-119.21673,40.79938],[-119.2164,40.79905],[-119.21665,40.7989],[-119.21665,40.7989],[-119.21699,40.79869],[-119.21699,40.79869],[-119.21732,40.79847],[-119.21732,40.79847],[-119.21765,40.79825],[-119.21765,40.79825],[-119.21797,40.79803],[-119.21797,40.79803],[-119.21827,40.7978],[-119.21865,40.7981]],[[-119.21661,40.79944],[-119.21654,40.79949],[-119.21618,40.79969],[-119.21582,40.79988],[-119.21546,40.80007],[-119.21509,40.80025],[-119.21471,40.80042],[-119.21449,40.80052],[-119.21422,40.80017],[-119.21451,40.80004],[-119.21451,40.80004],[-119.21488,40.79986],[-119.21488,40.79986],[-119.21524,40.79968],[-119.21524,40.79968],[-119.2156,40.7995],[-119.2156,40.79949],[-119.21596,40.7993],[-119.21596,40.7993],[-119.21628,40.79912],[-119.21661,40.79944]],[[-119.21404,40.80015],[-119.2137,40.8003],[-119.21331,40.80045],[-119.21293,40.8006],[-119.21253,40.80074],[-119.21214,40.80088],[-119.21182,40.80098],[-119.21161,40.8006],[-119.21196,40.80049],[-119.21196,40.80049],[-119.21235,40.80035],[-119.21236,40.80035],[-119.21274,40.80021],[-119.21274,40.80021],[-119.21312,40.80006],[-119.21312,40.80006],[-119.2135,40.79991],[-119.2135,40.79991],[-119.21377,40.79979],[-119.21404,40.80015]],[[-119.21345,40.79984],[-119.21307,40.79999],[-119.21269,40.80014],[-119.21231,40.80028],[-119.21192,40.80041],[-119.21157,40.80053],[-119.21122,40.79989],[-119.21124,40.79989],[-119.21124,40.79989],[-119.21162,40.79976],[-119.21163,40.79976],[-119.212,40.79963],[-119.21201,40.79963],[-119.21238,40.79949],[-119.21238,40.79949],[-119.21275,40.79934],[-119.21275,40.79934],[-119.21312,40.79919],[-119.21312,40.79919],[-119.21326,40.79913],[-119.21371,40.79972],[-119.21345,40.79984]],[[-119.2127,40.79927],[-119.21233,40.79942],[-119.21196,40.79955],[-119.21158,40.79969],[-119.2112,40.79981],[-119.21118,40.79982],[-119.21084,40.79918],[-119.21091,40.79916],[-119.21091,40.79916],[-119.21128,40.79904],[-119.21128,40.79904],[-119.21165,40.79891],[-119.21165,40.7989],[-119.21201,40.79877],[-119.21202,40.79877],[-119.21237,40.79863],[-119.21237,40.79862],[-119.21273,40.79848],[-119.21273,40.79848],[-119.21275,40.79846],[-119.21321,40.79906],[-119.21307,40.79912],[-119.2127,40.79927]],[[-119.21232,40.79855],[-119.21197,40.79869],[-119.2116,40.79883],[-119.21124,40.79896],[-119.21087,40.79908],[-119.2108,40.79911],[-119.21045,40.79847],[-119.21058,40.79843],[-119.21058,40.79843],[-119.21093,40.79831],[-119.21094,40.79831],[-119.21129,40.79818],[-119.21129,40.79818],[-119.21164,40.79805],[-119.21164,40.79805],[-119.21199,40.79791],[-119.21199,40.79791],[-119.21225,40.7978],[-119.2127,40.79839],[-119.21268,40.7984],[-119.21232,40.79855]],[[-119.21237,40.79774],[-119.21267,40.79761],[-119.21267,40.79761],[-119.213,40.79745],[-119.213,40.79745],[-119.21333,40.79729],[-119.21333,40.79728],[-119.21365,40.79711],[-119.21365,40.79711],[-119.21397,40.79694],[-119.21397,40.79694],[-119.21404,40.7969],[-119.21459,40.79744],[-119.21437,40.79757],[-119.21404,40.79775],[-119.21371,40.79792],[-119.21337,40.79809],[-119.21302,40.79825],[-119.21282,40.79834],[-119.21237,40.79774]],[[-119.21359,40.79705],[-119.21327,40.79722],[-119.21294,40.79738],[-119.21261,40.79754],[-119.21232,40.79767],[-119.21151,40.7966],[-119.21166,40.79653],[-119.21167,40.79653],[-119.21198,40.79638],[-119.21198,40.79638],[-119.21229,40.79623],[-119.2123,40.79623],[-119.2126,40.79607],[-119.2126,40.79607],[-119.2129,40.7959],[-119.2129,40.7959],[-119.2132,40.79573],[-119.2132,40.79573],[-119.21349,40.79555],[-119.21349,40.79555],[-119.21377,40.79536],[-119.21377,40.79536],[-119.21405,40.79517],[-119.21405,40.79517],[-119.21432,40.79498],[-119.21432,40.79498],[-119.21444,40.79489],[-119.21559,40.79577],[-119.21539,40.79591],[-119.21511,40.79611],[-119.21482,40.79631],[-119.21452,40.7965],[-119.21422,40.79669],[-119.21391,40.79687],[-119.21359,40.79705]],[[-119.21425,40.79492],[-119.21398,40.79511],[-119.2137,40.7953],[-119.21342,40.79548],[-119.21313,40.79566],[-119.21284,40.79583],[-119.21254,40.796],[-119.21223,40.79616],[-119.21192,40.79631],[-119.21161,40.79646],[-119.21145,40.79653],[-119.211,40.79594],[-119.21127,40.79582],[-119.21127,40.79582],[-119.21157,40.79567],[-119.21157,40.79567],[-119.21187,40.79552],[-119.21187,40.79552],[-119.21217,40.79536],[-119.21217,40.79536],[-119.21245,40.79519],[-119.21245,40.79519],[-119.21274,40.79502],[-119.21274,40.79502],[-119.21301,40.79485],[-119.21301,40.79485],[-119.21328,40.79467],[-119.21328,40.79467],[-119.21355,40.79448],[-119.21355,40.79448],[-119.21372,40.79435],[-119.21436,40.79483],[-119.21425,40.79492]],[[-119.21347,40.79442],[-119.21321,40.7946],[-119.21294,40.79478],[-119.21267,40.79496],[-119.21239,40.79513],[-119.2121,40.79529],[-119.21181,40.79545],[-119.21151,40.7956],[-119.21121,40.79575],[-119.21095,40.79587],[-119.21049,40.79527],[-119.21056,40.79524],[-119.21056,40.79524],[-119.21086,40.7951],[-119.21086,40.7951],[-119.21115,40.79496],[-119.21115,40.79496],[-119.21144,40.79481],[-119.21144,40.79481],[-119.21172,40.79465],[-119.21172,40.79465],[-119.21199,40.79449],[-119.21199,40.79449],[-119.21226,40.79433],[-119.21226,40.79432],[-119.21252,40.79415],[-119.21252,40.79415],[-119.21278,40.79397],[-119.21278,40.79397],[-119.21301,40.79381],[-119.21364,40.79429],[-119.21347,40.79442]],[[-119.2127,40.79391],[-119.21245,40.79409],[-119.21219,40.79426],[-119.21192,40.79443],[-119.21165,40.79459],[-119.21137,40.79474],[-119.21109,40.79489],[-119.2108,40.79503],[-119.21051,40.79517],[-119.21044,40.7952],[-119.20999,40.79461],[-119.21016,40.79453],[-119.21016,40.79453],[-119.21044,40.79439],[-119.21044,40.79439],[-119.21072,40.79425],[-119.21072,40.79425],[-119.21099,40.79411],[-119.21099,40.79411],[-119.21125,40.79396],[-119.21125,40.79396],[-119.21151,40.7938],[-119.21151,40.7938],[-119.21177,40.79363],[-119.21177,40.79363],[-119.21201,40.79347],[-119.21201,40.79346],[-119.21209,40.79341],[-119.21209,40.79341],[-119.21214,40.79344],[-119.21219,40.79346],[-119.21225,40.79347],[-119.2123,40.79347],[-119.21236,40.79347],[-119.21242,40.79346],[-119.21247,40.79344],[-119.21248,40.79343],[-119.21288,40.79378],[-119.2127,40.79391]],[[-119.2117,40.79357],[-119.21144,40.79373],[-119.21119,40.79389],[-119.21092,40.79404],[-119.21066,40.79419],[-119.21038,40.79433],[-119.2101,40.79446],[-119.20993,40.79453],[-119.20948,40.79394],[-119.20974,40.79382],[-119.20974,40.79382],[-119.21001,40.79369],[-119.21001,40.79369],[-119.21027,40.79355],[-119.21027,40.79355],[-119.21052,40.79341],[-119.21053,40.79341],[-119.21077,40.79326],[-119.21078,40.79326],[-119.21102,40.79311],[-119.21102,40.79311],[-119.21126,40.79295],[-119.21126,40.79295],[-119.21149,40.79279],[-119.21149,40.79279],[-119.21153,40.79275],[-119.21199,40.79306],[-119.21197,40.7931],[-119.21195,40.79314],[-119.21194,40.79318],[-119.21195,40.79323],[-119.21196,40.79327],[-119.21198,40.79331],[-119.21201,40.79335],[-119.21201,40.79335],[-119.21194,40.7934],[-119.2117,40.79357]],[[-119.21172,40.79261],[-119.21193,40.79244],[-119.21193,40.79244],[-119.21214,40.79226],[-119.21214,40.79226],[-119.21234,40.79208],[-119.21234,40.79208],[-119.21254,40.79189],[-119.21254,40.79189],[-119.21273,40.7917],[-119.21273,40.7917],[-119.21291,40.7915],[-119.21291,40.7915],[-119.21308,40.7913],[-119.21309,40.7913],[-119.21325,40.7911],[-119.21325,40.79109],[-119.21329,40.79104],[-119.21407,40.79138],[-119.21401,40.79147],[-119.21384,40.79168],[-119.21365,40.79189],[-119.21347,40.7921],[-119.21327,40.7923],[-119.21307,40.79249],[-119.21285,40.79268],[-119.21264,40.79287],[-119.21251,40.79297],[-119.2125,40.79296],[-119.21245,40.79294],[-119.21239,40.79293],[-119.21233,40.79292],[-119.21228,40.79292],[-119.21222,40.79293],[-119.21216,40.79294],[-119.21213,40.79296],[-119.21172,40.79261]],[[-119.21335,40.79097],[-119.21341,40.79089],[-119.21341,40.79089],[-119.21356,40.79067],[-119.21356,40.79067],[-119.2137,40.79046],[-119.2137,40.79046],[-119.21383,40.79024],[-119.21383,40.79024],[-119.21396,40.79002],[-119.21396,40.79002],[-119.21407,40.7898],[-119.21407,40.78979],[-119.21418,40.78957],[-119.21418,40.78957],[-119.21428,40.78934],[-119.21428,40.78934],[-119.21436,40.78911],[-119.21436,40.78911],[-119.21437,40.78909],[-119.21524,40.78927],[-119.21519,40.78941],[-119.21509,40.78965],[-119.21499,40.78989],[-119.21487,40.79012],[-119.21475,40.79035],[-119.21462,40.79058],[-119.21448,40.79081],[-119.21433,40.79103],[-119.21417,40.79125],[-119.21413,40.79131],[-119.21335,40.79097]],[[-119.21417,40.78932],[-119.21408,40.78954],[-119.21397,40.78977],[-119.21386,40.78999],[-119.21373,40.79021],[-119.2136,40.79042],[-119.21346,40.79064],[-119.21331,40.79085],[-119.21325,40.79093],[-119.212,40.79038],[-119.21207,40.79029],[-119.21207,40.79029],[-119.2122,40.7901],[-119.2122,40.79009],[-119.21233,40.7899],[-119.21233,40.78989],[-119.21245,40.78969],[-119.21245,40.78969],[-119.21256,40.78949],[-119.21256,40.78949],[-119.21267,40.78928],[-119.21267,40.78928],[-119.21276,40.78907],[-119.21276,40.78907],[-119.21285,40.78885],[-119.21285,40.78885],[-119.21287,40.78878],[-119.21427,40.78907],[-119.21426,40.78909],[-119.21417,40.78932]],[[-119.2129,40.78871],[-119.21292,40.78864],[-119.21292,40.78864],[-119.21299,40.78842],[-119.21299,40.78842],[-119.21305,40.7882],[-119.21305,40.7882],[-119.21309,40.78798],[-119.21309,40.78798],[-119.21313,40.78776],[-119.21313,40.78776],[-119.21316,40.78754],[-119.21316,40.78754],[-119.21318,40.78732],[-119.21318,40.78732],[-119.21319,40.78721],[-119.21319,40.78721],[-119.21319,40.7872],[-119.21319,40.78719],[-119.2132,40.78718],[-119.21321,40.78717],[-119.21322,40.78716],[-119.21324,40.78715],[-119.21325,40.78714],[-119.21327,40.78714],[-119.21328,40.78714],[-119.21464,40.78707],[-119.21463,40.78721],[-119.21462,40.78745],[-119.2146,40.78768],[-119.21456,40.78792],[-119.21452,40.78816],[-119.21447,40.78839],[-119.21441,40.78862],[-119.21434,40.78886],[-119.21429,40.78899],[-119.2129,40.78871]],[[-119.21444,40.78888],[-119.21444,40.78888],[-119.21451,40.78864],[-119.21451,40.78864],[-119.21458,40.78841],[-119.21458,40.7884],[-119.21463,40.78817],[-119.21463,40.78817],[-119.21467,40.78793],[-119.21467,40.78793],[-119.2147,40.78769],[-119.2147,40.78769],[-119.21473,40.78745],[-119.21473,40.78745],[-119.21474,40.78721],[-119.21474,40.78721],[-119.21475,40.78706],[-119.21536,40.78703],[-119.21536,40.78703],[-119.21538,40.78707],[-119.21541,40.78711],[-119.21544,40.78714],[-119.21549,40.78717],[-119.21554,40.7872],[-119.21559,40.78722],[-119.21564,40.78723],[-119.21563,40.78744],[-119.21561,40.78769],[-119.21558,40.78794],[-119.21554,40.78819],[-119.21549,40.78843],[-119.21543,40.78868],[-119.21536,40.78892],[-119.21528,40.78917],[-119.21527,40.78919],[-119.2144,40.78901],[-119.21444,40.78888]],[[-119.21538,40.78919],[-119.21546,40.78894],[-119.21546,40.78894],[-119.21553,40.7887],[-119.21553,40.7887],[-119.21559,40.78845],[-119.21559,40.78845],[-119.21564,40.7882],[-119.21564,40.7882],[-119.21569,40.78795],[-119.21569,40.78795],[-119.21572,40.7877],[-119.21572,40.7877],[-119.21574,40.78744],[-119.21574,40.78744],[-119.21575,40.78723],[-119.21576,40.78723],[-119.21582,40.78722],[-119.21587,40.7872],[-119.21592,40.78717],[-119.21597,40.78714],[-119.216,40.78711],[-119.21603,40.78707],[-119.21605,40.78703],[-119.21606,40.78701],[-119.21666,40.78701],[-119.21666,40.78717],[-119.21665,40.78743],[-119.21662,40.78769],[-119.21659,40.78795],[-119.21655,40.78821],[-119.2165,40.78847],[-119.21644,40.78873],[-119.21638,40.78898],[-119.2163,40.78924],[-119.21625,40.78939],[-119.21538,40.78921],[-119.21538,40.78919],[-119.21538,40.78919]],[[-119.2164,40.78926],[-119.2164,40.78926],[-119.21648,40.789],[-119.21648,40.789],[-119.21655,40.78874],[-119.21655,40.78874],[-119.21661,40.78848],[-119.21661,40.78848],[-119.21666,40.78822],[-119.21666,40.78822],[-119.2167,40.78796],[-119.2167,40.78796],[-119.21673,40.7877],[-119.21673,40.7877],[-119.21675,40.78743],[-119.21675,40.78743],[-119.21677,40.78717],[-119.21677,40.78717],[-119.21677,40.78701],[-119.21767,40.78701],[-119.21767,40.78714],[-119.21766,40.78741],[-119.21764,40.78768],[-119.21761,40.78796],[-119.21757,40.78823],[-119.21752,40.7885],[-119.21746,40.78876],[-119.2174,40.78903],[-119.21732,40.7893],[-119.21723,40.78956],[-119.21722,40.78959],[-119.21635,40.78941],[-119.2164,40.78926]],[[-119.21734,40.78958],[-119.21734,40.78958],[-119.21742,40.78932],[-119.21743,40.78931],[-119.2175,40.78905],[-119.2175,40.78905],[-119.21757,40.78878],[-119.21757,40.78878],[-119.21763,40.78851],[-119.21763,40.78851],[-119.21768,40.78824],[-119.21768,40.78824],[-119.21772,40.78796],[-119.21772,40.78796],[-119.21775,40.78769],[-119.21775,40.78769],[-119.21777,40.78742],[-119.21777,40.78742],[-119.21778,40.78714],[-119.21778,40.78714],[-119.21778,40.78701],[-119.21868,40.78701],[-119.21868,40.78711],[-119.21867,40.78739],[-119.21865,40.78768],[-119.21862,40.78796],[-119.21859,40.78824],[-119.21854,40.78852],[-119.21848,40.78879],[-119.21842,40.78907],[-119.21834,40.78935],[-119.21826,40.78962],[-119.2182,40.78978],[-119.21733,40.78961],[-119.21734,40.78958]],[[-119.21836,40.78964],[-119.21836,40.78964],[-119.21845,40.78936],[-119.21845,40.78936],[-119.21852,40.78909],[-119.21852,40.78909],[-119.21859,40.78881],[-119.21859,40.78881],[-119.21865,40.78853],[-119.21865,40.78853],[-119.21869,40.78825],[-119.21869,40.78824],[-119.21873,40.78796],[-119.21873,40.78796],[-119.21876,40.78768],[-119.21876,40.78768],[-119.21878,40.7874],[-119.21878,40.7874],[-119.21879,40.78711],[-119.21879,40.78711],[-119.21879,40.78701],[-119.22042,40.78701],[-119.22042,40.78716],[-119.2204,40.78746],[-119.22038,40.78775],[-119.22035,40.78805],[-119.22032,40.78834],[-119.22027,40.78864],[-119.22021,40.78893],[-119.22014,40.78922],[-119.22007,40.78952],[-119.21998,40.78981],[-119.21989,40.79009],[-119.21988,40.79013],[-119.21831,40.78981],[-119.21836,40.78964]],[[-119.22039,40.78856],[-119.22042,40.78835],[-119.22042,40.78835],[-119.22046,40.78806],[-119.22046,40.78805],[-119.22049,40.78776],[-119.22049,40.78776],[-119.22051,40.78746],[-119.22051,40.78746],[-119.22052,40.78716],[-119.22052,40.78716],[-119.22052,40.78701],[-119.22113,40.78701],[-119.22114,40.78703],[-119.22116,40.78707],[-119.22119,40.78711],[-119.22122,40.78714],[-119.22127,40.78717],[-119.22132,40.7872],[-119.22137,40.78721],[-119.22142,40.78722],[-119.22142,40.78734],[-119.22141,40.78764],[-119.22138,40.78795],[-119.22134,40.78826],[-119.2213,40.78856],[-119.22128,40.78865],[-119.22039,40.78856]],[[-119.22141,40.78857],[-119.22141,40.78857],[-119.22145,40.78826],[-119.22145,40.78826],[-119.22149,40.78796],[-119.22149,40.78796],[-119.22151,40.78765],[-119.22151,40.78765],[-119.22153,40.78734],[-119.22153,40.78734],[-119.22153,40.78723],[-119.22154,40.78722],[-119.2216,40.78721],[-119.22165,40.7872],[-119.2217,40.78717],[-119.22174,40.78714],[-119.22178,40.78711],[-119.22181,40.78707],[-119.22183,40.78703],[-119.22184,40.78701],[-119.22244,40.78701],[-119.22244,40.78721],[-119.22242,40.78753],[-119.2224,40.78784],[-119.22237,40.78816],[-119.22233,40.78847],[-119.22229,40.78875],[-119.22139,40.78866],[-119.22141,40.78857]],[[-119.22244,40.78848],[-119.22244,40.78848],[-119.22248,40.78816],[-119.22248,40.78816],[-119.22251,40.78785],[-119.22251,40.78785],[-119.22253,40.78753],[-119.22253,40.78753],[-119.22255,40.78721],[-119.22255,40.78721],[-119.22255,40.78701],[-119.22345,40.78701],[-119.22345,40.78708],[-119.22344,40.7874],[-119.22343,40.78772],[-119.2234,40.78805],[-119.22336,40.78837],[-119.22332,40.78869],[-119.22329,40.78885],[-119.2224,40.78876],[-119.22244,40.78848]],[[-119.22342,40.7887],[-119.22342,40.7887],[-119.22347,40.78838],[-119.22347,40.78838],[-119.22351,40.78805],[-119.22351,40.78805],[-119.22353,40.78773],[-119.22353,40.78773],[-119.22355,40.7874],[-119.22355,40.7874],[-119.22356,40.78708],[-119.22356,40.78708],[-119.22356,40.78701],[-119.2241,40.78701],[-119.2241,40.78706],[-119.22409,40.78739],[-119.22408,40.78772],[-119.22405,40.78805],[-119.22401,40.78837],[-119.22397,40.7887],[-119.22393,40.78891],[-119.2234,40.78886],[-119.22342,40.7887]],[[-119.22328,40.7889],[-119.22326,40.78901],[-119.2232,40.78934],[-119.22312,40.78965],[-119.22304,40.78997],[-119.22295,40.79029],[-119.22285,40.7906],[-119.22281,40.79072],[-119.22193,40.79054],[-119.222,40.79035],[-119.222,40.79035],[-119.2221,40.79005],[-119.2221,40.79004],[-119.22218,40.78973],[-119.22218,40.78973],[-119.22226,40.78942],[-119.22226,40.78942],[-119.22233,40.78911],[-119.22233,40.78911],[-119.22239,40.78881],[-119.22328,40.7889]],[[-119.22278,40.7908],[-119.22274,40.79092],[-119.22262,40.79123],[-119.22249,40.79154],[-119.22235,40.79185],[-119.22221,40.79215],[-119.22205,40.79245],[-119.22199,40.79256],[-119.22116,40.7923],[-119.22123,40.79217],[-119.22123,40.79217],[-119.22138,40.79187],[-119.22138,40.79187],[-119.22152,40.79157],[-119.22152,40.79157],[-119.22165,40.79127],[-119.22165,40.79127],[-119.22178,40.79097],[-119.22178,40.79097],[-119.22189,40.79066],[-119.22189,40.79066],[-119.22191,40.79062],[-119.22278,40.7908]],[[-119.22215,40.79248],[-119.22215,40.79248],[-119.22231,40.79218],[-119.22231,40.79218],[-119.22245,40.79187],[-119.22245,40.79187],[-119.22259,40.79157],[-119.22259,40.79156],[-119.22272,40.79125],[-119.22272,40.79125],[-119.22284,40.79094],[-119.22284,40.79094],[-119.22288,40.79082],[-119.22341,40.79093],[-119.22339,40.79097],[-119.22327,40.79129],[-119.22315,40.7916],[-119.22301,40.79192],[-119.22286,40.79223],[-119.22271,40.79253],[-119.22259,40.79275],[-119.22209,40.79259],[-119.22215,40.79248]],[[-119.22257,40.7928],[-119.22254,40.79284],[-119.22237,40.79314],[-119.22219,40.79344],[-119.222,40.79374],[-119.2218,40.79403],[-119.2216,40.79432],[-119.22145,40.79452],[-119.22098,40.79432],[-119.22103,40.79425],[-119.22103,40.79425],[-119.22124,40.79396],[-119.22124,40.79396],[-119.22144,40.79367],[-119.22144,40.79367],[-119.22163,40.79338],[-119.22163,40.79338],[-119.22181,40.79308],[-119.22181,40.79308],[-119.22199,40.79279],[-119.22199,40.79278],[-119.22206,40.79264],[-119.22257,40.7928]],[[-119.2214,40.79459],[-119.22138,40.79461],[-119.22116,40.79489],[-119.22093,40.79517],[-119.22069,40.79545],[-119.22044,40.79572],[-119.22019,40.79599],[-119.22001,40.79617],[-119.21958,40.79592],[-119.21962,40.79588],[-119.21962,40.79588],[-119.21988,40.79562],[-119.21988,40.79562],[-119.22012,40.79535],[-119.22012,40.79535],[-119.22036,40.79508],[-119.22036,40.79508],[-119.22059,40.79481],[-119.22059,40.79481],[-119.22082,40.79453],[-119.22082,40.79453],[-119.22093,40.79439],[-119.2214,40.79459]],[[-119.21993,40.79626],[-119.21966,40.79651],[-119.21938,40.79677],[-119.2191,40.79702],[-119.21881,40.79726],[-119.21851,40.7975],[-119.21829,40.79767],[-119.21791,40.79738],[-119.21794,40.79736],[-119.21794,40.79736],[-119.21823,40.79712],[-119.21823,40.79712],[-119.21853,40.79689],[-119.21853,40.79688],[-119.21881,40.79664],[-119.21881,40.79664],[-119.21909,40.79639],[-119.21909,40.79639],[-119.21936,40.79614],[-119.21936,40.79614],[-119.21949,40.796],[-119.21993,40.79626]],[[-119.21819,40.79775],[-119.21789,40.79797],[-119.21758,40.79819],[-119.21725,40.79841],[-119.21692,40.79863],[-119.21659,40.79883],[-119.21633,40.79899],[-119.216,40.79866],[-119.21601,40.79866],[-119.21601,40.79866],[-119.21635,40.79845],[-119.21635,40.79845],[-119.21668,40.79825],[-119.21668,40.79824],[-119.217,40.79803],[-119.217,40.79803],[-119.21732,40.79781],[-119.21732,40.79781],[-119.21763,40.79759],[-119.21763,40.79759],[-119.21781,40.79745],[-119.21819,40.79775]],[[-119.21622,40.79905],[-119.2159,40.79924],[-119.21554,40.79943],[-119.21518,40.79961],[-119.21482,40.79979],[-119.21445,40.79997],[-119.21416,40.8001],[-119.21389,40.79974],[-119.21424,40.79958],[-119.21424,40.79958],[-119.21461,40.79941],[-119.21461,40.79941],[-119.21497,40.79923],[-119.21497,40.79923],[-119.21532,40.79904],[-119.21532,40.79904],[-119.21567,40.79885],[-119.21567,40.79885],[-119.21589,40.79873],[-119.21622,40.79905]],[[-119.2156,40.79879],[-119.21526,40.79898],[-119.21491,40.79916],[-119.21455,40.79934],[-119.21419,40.79951],[-119.21384,40.79967],[-119.21338,40.79907],[-119.21348,40.79903],[-119.21348,40.79903],[-119.21384,40.79887],[-119.21384,40.79887],[-119.21419,40.7987],[-119.21419,40.7987],[-119.21454,40.79852],[-119.21454,40.79852],[-119.21488,40.79834],[-119.21488,40.79834],[-119.21522,40.79815],[-119.21522,40.79815],[-119.21527,40.79812],[-119.21582,40.79866],[-119.2156,40.79879]],[[-119.21482,40.79827],[-119.21448,40.79845],[-119.21413,40.79863],[-119.21378,40.7988],[-119.21343,40.79896],[-119.21333,40.799],[-119.21288,40.79841],[-119.21308,40.79832],[-119.21308,40.79832],[-119.21342,40.79816],[-119.21343,40.79816],[-119.21376,40.79799],[-119.21377,40.79799],[-119.2141,40.79782],[-119.2141,40.79782],[-119.21443,40.79764],[-119.21443,40.79764],[-119.21466,40.79751],[-119.21521,40.79805],[-119.21515,40.79808],[-119.21482,40.79827]],[[-119.21477,40.79744],[-119.21507,40.79726],[-119.21507,40.79726],[-119.21539,40.79706],[-119.21539,40.79706],[-119.21569,40.79686],[-119.21569,40.79686],[-119.21599,40.79665],[-119.21599,40.79665],[-119.21617,40.79652],[-119.21622,40.79654],[-119.21628,40.79656],[-119.21633,40.79657],[-119.21639,40.79657],[-119.21644,40.79657],[-119.21649,40.79656],[-119.21654,40.79655],[-119.21659,40.79653],[-119.21671,40.79662],[-119.21673,40.79663],[-119.21702,40.79685],[-119.21673,40.79706],[-119.21668,40.7971],[-119.21667,40.79711],[-119.21643,40.79728],[-119.21612,40.79749],[-119.2158,40.79769],[-119.21548,40.79789],[-119.21532,40.79798],[-119.21477,40.79744]],[[-119.21592,40.79659],[-119.21562,40.7968],[-119.21532,40.797],[-119.215,40.79719],[-119.21471,40.79737],[-119.21416,40.79683],[-119.21428,40.79675],[-119.21428,40.79675],[-119.21459,40.79657],[-119.21459,40.79657],[-119.21489,40.79637],[-119.21489,40.79637],[-119.21518,40.79617],[-119.21518,40.79617],[-119.21547,40.79597],[-119.21547,40.79597],[-119.21566,40.79582],[-119.21609,40.79615],[-119.21606,40.79618],[-119.21604,40.79622],[-119.21603,40.79626],[-119.21603,40.79631],[-119.21603,40.79635],[-119.21605,40.79639],[-119.21607,40.79643],[-119.2161,40.79646],[-119.21592,40.79659]],[[-119.21577,40.79575],[-119.21602,40.79555],[-119.21602,40.79554],[-119.21629,40.79533],[-119.21629,40.79533],[-119.21655,40.7951],[-119.21655,40.7951],[-119.2168,40.79487],[-119.2168,40.79487],[-119.21705,40.79464],[-119.21705,40.79464],[-119.21709,40.7946],[-119.2178,40.79502],[-119.21757,40.79525],[-119.21731,40.79548],[-119.21705,40.79571],[-119.21677,40.79594],[-119.2166,40.79608],[-119.21656,40.79606],[-119.21651,40.79604],[-119.21645,40.79603],[-119.2164,40.79603],[-119.21634,40.79603],[-119.21629,40.79604],[-119.21624,40.79605],[-119.21619,40.79607],[-119.21577,40.79575]],[[-119.21672,40.79482],[-119.21647,40.79505],[-119.21621,40.79527],[-119.21594,40.79549],[-119.21569,40.79569],[-119.21454,40.79482],[-119.21459,40.79478],[-119.21459,40.79478],[-119.21484,40.79457],[-119.21485,40.79457],[-119.2151,40.79436],[-119.2151,40.79436],[-119.21534,40.79415],[-119.21534,40.79415],[-119.21558,40.79393],[-119.21558,40.79393],[-119.21581,40.79371],[-119.21581,40.79371],[-119.21603,40.79348],[-119.21603,40.79348],[-119.21624,40.79325],[-119.21624,40.79325],[-119.21645,40.79301],[-119.21645,40.79301],[-119.21665,40.79277],[-119.21665,40.79277],[-119.2168,40.79258],[-119.2182,40.79319],[-119.21807,40.79337],[-119.21786,40.79362],[-119.21765,40.79387],[-119.21743,40.79411],[-119.2172,40.79435],[-119.21696,40.79459],[-119.21672,40.79482]],[[-119.21655,40.79273],[-119.21636,40.79297],[-119.21615,40.7932],[-119.21594,40.79343],[-119.21572,40.79366],[-119.21549,40.79388],[-119.21526,40.7941],[-119.21501,40.79431],[-119.21477,40.79452],[-119.21451,40.79472],[-119.21446,40.79476],[-119.21382,40.79427],[-119.21406,40.79409],[-119.21406,40.79409],[-119.2143,40.79389],[-119.2143,40.79389],[-119.21454,40.79368],[-119.21454,40.79368],[-119.21477,40.79347],[-119.21477,40.79347],[-119.21499,40.79325],[-119.21499,40.79325],[-119.2152,40.79303],[-119.2152,40.79303],[-119.21541,40.79281],[-119.21541,40.79281],[-119.21561,40.79258],[-119.21561,40.79258],[-119.2158,40.79235],[-119.2158,40.79235],[-119.21592,40.79219],[-119.2167,40.79253],[-119.21655,40.79273]],[[-119.21571,40.79231],[-119.21552,40.79254],[-119.21532,40.79276],[-119.21511,40.79299],[-119.2149,40.7932],[-119.21468,40.79342],[-119.21445,40.79363],[-119.21422,40.79383],[-119.21398,40.79403],[-119.21375,40.79421],[-119.21311,40.79373],[-119.21327,40.7936],[-119.21327,40.7936],[-119.21351,40.79341],[-119.21351,40.79341],[-119.21373,40.79321],[-119.21374,40.79321],[-119.21396,40.79301],[-119.21396,40.79301],[-119.21417,40.7928],[-119.21417,40.7928],[-119.21438,40.79259],[-119.21438,40.79259],[-119.21458,40.79237],[-119.21458,40.79237],[-119.21477,40.79215],[-119.21477,40.79215],[-119.21495,40.79193],[-119.21495,40.79193],[-119.21504,40.79181],[-119.21583,40.79215],[-119.21571,40.79231]],[[-119.21486,40.79189],[-119.21468,40.79211],[-119.21449,40.79233],[-119.21429,40.79254],[-119.21409,40.79275],[-119.21387,40.79296],[-119.21365,40.79316],[-119.21343,40.79335],[-119.21319,40.79355],[-119.21308,40.79363],[-119.21262,40.79333],[-119.21263,40.79331],[-119.21265,40.79327],[-119.21266,40.79323],[-119.21267,40.79318],[-119.21266,40.79314],[-119.21264,40.7931],[-119.21262,40.79306],[-119.21259,40.79303],[-119.21272,40.79293],[-119.21272,40.79293],[-119.21294,40.79274],[-119.21294,40.79274],[-119.21315,40.79254],[-119.21315,40.79254],[-119.21336,40.79235],[-119.21336,40.79235],[-119.21355,40.79214],[-119.21355,40.79214],[-119.21374,40.79194],[-119.21374,40.79194],[-119.21393,40.79173],[-119.21393,40.79172],[-119.2141,40.79151],[-119.2141,40.79151],[-119.21417,40.79142],[-119.21495,40.79177],[-119.21486,40.79189]],[[-119.21422,40.79135],[-119.21427,40.79129],[-119.21427,40.79129],[-119.21443,40.79107],[-119.21443,40.79107],[-119.21458,40.79084],[-119.21458,40.79084],[-119.21472,40.79062],[-119.21472,40.79062],[-119.21485,40.79038],[-119.21485,40.79038],[-119.21498,40.79015],[-119.21498,40.79015],[-119.21509,40.78991],[-119.21509,40.78991],[-119.2152,40.78967],[-119.2152,40.78967],[-119.21529,40.78943],[-119.2153,40.78943],[-119.21535,40.78929],[-119.21622,40.78947],[-119.21621,40.78949],[-119.21612,40.78974],[-119.21601,40.78999],[-119.2159,40.79024],[-119.21577,40.79048],[-119.21564,40.79072],[-119.2155,40.79096],[-119.21535,40.7912],[-119.2152,40.79143],[-119.21503,40.79166],[-119.21501,40.7917],[-119.21422,40.79135]],[[-119.21529,40.79147],[-119.21529,40.79147],[-119.21545,40.79124],[-119.21545,40.79123],[-119.2156,40.791],[-119.2156,40.791],[-119.21574,40.79076],[-119.21574,40.79076],[-119.21587,40.79051],[-119.21588,40.79051],[-119.216,40.79027],[-119.216,40.79027],[-119.21611,40.79002],[-119.21611,40.79002],[-119.21622,40.78977],[-119.21622,40.78976],[-119.21632,40.78951],[-119.21632,40.78951],[-119.21632,40.78949],[-119.2172,40.78967],[-119.21714,40.78982],[-119.21704,40.79008],[-119.21692,40.79034],[-119.2168,40.7906],[-119.21667,40.79085],[-119.21653,40.7911],[-119.21638,40.79135],[-119.21623,40.79159],[-119.21606,40.79183],[-119.21589,40.79207],[-119.21588,40.79208],[-119.2151,40.79174],[-119.21513,40.7917],[-119.21513,40.7917],[-119.21529,40.79147]],[[-119.21616,40.79187],[-119.21616,40.79187],[-119.21632,40.79163],[-119.21632,40.79163],[-119.21648,40.79138],[-119.21648,40.79138],[-119.21663,40.79113],[-119.21663,40.79113],[-119.21677,40.79088],[-119.21677,40.79088],[-119.2169,40.79063],[-119.2169,40.79062],[-119.21702,40.79037],[-119.21702,40.79037],[-119.21714,40.79011],[-119.21714,40.79011],[-119.21724,40.78985],[-119.21724,40.78984],[-119.2173,40.78969],[-119.21817,40.78986],[-119.21816,40.78989],[-119.21806,40.79016],[-119.21795,40.79043],[-119.21783,40.7907],[-119.2177,40.79096],[-119.21756,40.79122],[-119.21741,40.79148],[-119.21726,40.79174],[-119.2171,40.79199],[-119.21692,40.79224],[-119.21676,40.79246],[-119.21598,40.79212],[-119.21598,40.79211],[-119.21598,40.79211],[-119.21616,40.79187]],[[-119.21702,40.79228],[-119.21702,40.79228],[-119.21719,40.79203],[-119.21719,40.79203],[-119.21736,40.79177],[-119.21736,40.79177],[-119.21751,40.79152],[-119.21751,40.79151],[-119.21766,40.79125],[-119.21766,40.79125],[-119.2178,40.79099],[-119.2178,40.79099],[-119.21793,40.79073],[-119.21793,40.79073],[-119.21805,40.79046],[-119.21805,40.79046],[-119.21816,40.79019],[-119.21816,40.79019],[-119.21827,40.78991],[-119.21827,40.78991],[-119.21828,40.78989],[-119.21985,40.79021],[-119.21978,40.79038],[-119.21967,40.79066],[-119.21955,40.79095],[-119.21942,40.79123],[-119.21928,40.7915],[-119.21913,40.79178],[-119.21898,40.79205],[-119.21881,40.79232],[-119.21864,40.79259],[-119.21846,40.79285],[-119.21827,40.79311],[-119.21826,40.79312],[-119.21685,40.7925],[-119.21702,40.79228]],[[-119.21998,40.79015],[-119.21999,40.79011],[-119.21999,40.79011],[-119.22009,40.78982],[-119.22009,40.78982],[-119.22017,40.78953],[-119.22017,40.78953],[-119.22025,40.78924],[-119.22025,40.78924],[-119.22032,40.78895],[-119.22032,40.78894],[-119.22037,40.78865],[-119.22037,40.78865],[-119.22038,40.78861],[-119.22128,40.7887],[-119.22125,40.78886],[-119.22118,40.78917],[-119.22111,40.78947],[-119.22103,40.78977],[-119.22094,40.79007],[-119.22085,40.79032],[-119.21998,40.79015]],[[-119.22104,40.79009],[-119.22104,40.79009],[-119.22114,40.78979],[-119.22114,40.78979],[-119.22122,40.78948],[-119.22122,40.78948],[-119.22129,40.78918],[-119.22129,40.78918],[-119.22135,40.78888],[-119.22135,40.78888],[-119.22138,40.78871],[-119.22228,40.7888],[-119.22222,40.7891],[-119.22215,40.78941],[-119.22208,40.78972],[-119.22199,40.79003],[-119.22189,40.79033],[-119.22183,40.79052],[-119.22096,40.79035],[-119.22104,40.79009]],[[-119.2218,40.7906],[-119.22179,40.79064],[-119.22167,40.79094],[-119.22155,40.79124],[-119.22142,40.79154],[-119.22128,40.79184],[-119.22113,40.79214],[-119.22106,40.79226],[-119.22022,40.792],[-119.22031,40.79185],[-119.22031,40.79185],[-119.22045,40.79156],[-119.22045,40.79156],[-119.22059,40.79127],[-119.22059,40.79127],[-119.22072,40.79098],[-119.22072,40.79098],[-119.22083,40.79068],[-119.22083,40.79068],[-119.22093,40.79043],[-119.2218,40.7906]],[[-119.22103,40.79232],[-119.22097,40.79243],[-119.2208,40.79272],[-119.22063,40.793],[-119.22044,40.79328],[-119.22025,40.79356],[-119.22005,40.79384],[-119.22001,40.79389],[-119.21923,40.79355],[-119.21925,40.79352],[-119.21925,40.79352],[-119.21945,40.79325],[-119.21945,40.79325],[-119.21964,40.79297],[-119.21964,40.79297],[-119.21982,40.7927],[-119.21982,40.7927],[-119.21999,40.79242],[-119.21999,40.79242],[-119.22015,40.79214],[-119.22015,40.79213],[-119.2202,40.79205],[-119.22103,40.79232]],[[-119.22014,40.79388],[-119.22014,40.79388],[-119.22034,40.7936],[-119.22035,40.7936],[-119.22054,40.79332],[-119.22054,40.79332],[-119.22072,40.79304],[-119.22072,40.79304],[-119.2209,40.79275],[-119.2209,40.79275],[-119.22107,40.79246],[-119.22107,40.79246],[-119.22113,40.79235],[-119.22196,40.79261],[-119.22189,40.79275],[-119.22171,40.79305],[-119.22153,40.79334],[-119.22134,40.79363],[-119.22115,40.79392],[-119.22094,40.79421],[-119.22089,40.79427],[-119.2201,40.79393],[-119.22014,40.79388]],[[-119.22083,40.79435],[-119.22072,40.79449],[-119.2205,40.79476],[-119.22027,40.79504],[-119.22003,40.7953],[-119.21979,40.79557],[-119.21953,40.79583],[-119.2195,40.79587],[-119.21878,40.79545],[-119.21901,40.79522],[-119.21901,40.79521],[-119.21925,40.79496],[-119.21925,40.79496],[-119.21949,40.79469],[-119.21949,40.79469],[-119.21971,40.79443],[-119.21971,40.79443],[-119.21993,40.79416],[-119.21993,40.79416],[-119.22005,40.794],[-119.22083,40.79435]],[[-119.21941,40.79595],[-119.21927,40.79609],[-119.219,40.79634],[-119.21873,40.79659],[-119.21845,40.79683],[-119.21816,40.79707],[-119.21786,40.7973],[-119.21783,40.79732],[-119.21755,40.7971],[-119.21751,40.79707],[-119.2172,40.79683],[-119.2174,40.79667],[-119.2174,40.79667],[-119.21756,40.79654],[-119.21763,40.79649],[-119.21769,40.79644],[-119.21769,40.79644],[-119.21797,40.79621],[-119.21797,40.79621],[-119.21824,40.79597],[-119.21824,40.79597],[-119.2185,40.79572],[-119.2185,40.79572],[-119.21869,40.79554],[-119.21941,40.79595]],[[-119.2174,40.79715],[-119.21746,40.79719],[-119.21773,40.7974],[-119.21756,40.79753],[-119.21725,40.79775],[-119.21693,40.79797],[-119.21661,40.79818],[-119.21628,40.79839],[-119.21594,40.79859],[-119.21594,40.79859],[-119.21539,40.79805],[-119.21555,40.79796],[-119.21555,40.79795],[-119.21587,40.79776],[-119.21587,40.79775],[-119.21619,40.79755],[-119.21619,40.79755],[-119.2165,40.79734],[-119.2165,40.79734],[-119.21674,40.79717],[-119.21677,40.79715],[-119.21681,40.79712],[-119.21681,40.79712],[-119.21709,40.79691],[-119.2174,40.79715]],[[-119.21842,40.79567],[-119.21816,40.79591],[-119.21789,40.79615],[-119.21761,40.79639],[-119.21752,40.79646],[-119.21749,40.79648],[-119.21732,40.79662],[-119.21712,40.79678],[-119.21684,40.79656],[-119.21681,40.79654],[-119.21669,40.79645],[-119.21672,40.79641],[-119.21674,40.79637],[-119.21675,40.79633],[-119.21675,40.79629],[-119.21675,40.79625],[-119.21673,40.79621],[-119.21671,40.79617],[-119.21668,40.79613],[-119.21685,40.796],[-119.21685,40.796],[-119.21713,40.79577],[-119.21713,40.79577],[-119.21739,40.79554],[-119.21739,40.79554],[-119.21765,40.7953],[-119.21765,40.7953],[-119.21789,40.79507],[-119.21861,40.79549],[-119.21842,40.79567]],[[-119.21798,40.79498],[-119.21815,40.79481],[-119.21815,40.79481],[-119.21838,40.79456],[-119.21838,40.79456],[-119.21861,40.7943],[-119.21861,40.7943],[-119.21883,40.79405],[-119.21883,40.79405],[-119.21905,40.79378],[-119.21905,40.79378],[-119.21917,40.79362],[-119.21996,40.79396],[-119.21984,40.79411],[-119.21962,40.79438],[-119.2194,40.79465],[-119.21916,40.79491],[-119.21892,40.79517],[-119.21869,40.7954],[-119.21798,40.79498]],[[-119.21895,40.79374],[-119.21874,40.794],[-119.21852,40.79426],[-119.2183,40.79451],[-119.21806,40.79476],[-119.21789,40.79493],[-119.21717,40.79451],[-119.21729,40.7944],[-119.21729,40.7944],[-119.21752,40.79416],[-119.21752,40.79416],[-119.21774,40.79391],[-119.21774,40.79391],[-119.21796,40.79366],[-119.21796,40.79366],[-119.21816,40.79341],[-119.21816,40.79341],[-119.2183,40.79323],[-119.21908,40.79358],[-119.21895,40.79374]],[[-119.21835,40.79316],[-119.21836,40.79315],[-119.21836,40.79315],[-119.21855,40.79289],[-119.21855,40.79289],[-119.21874,40.79263],[-119.21874,40.79262],[-119.21891,40.79236],[-119.21891,40.79236],[-119.21908,40.79209],[-119.21908,40.79209],[-119.21923,40.79181],[-119.21923,40.79181],[-119.21926,40.79176],[-119.2201,40.79202],[-119.22005,40.7921],[-119.21989,40.79238],[-119.21972,40.79266],[-119.21954,40.79294],[-119.21935,40.79321],[-119.21916,40.79348],[-119.21913,40.79351],[-119.21835,40.79316]],[[-119.21929,40.79171],[-119.21938,40.79154],[-119.21938,40.79153],[-119.21952,40.79126],[-119.21952,40.79125],[-119.21965,40.79097],[-119.21965,40.79097],[-119.21977,40.79069],[-119.21978,40.79069],[-119.21989,40.7904],[-119.21989,40.7904],[-119.21995,40.79023],[-119.22082,40.7904],[-119.22073,40.79066],[-119.22061,40.79095],[-119.22049,40.79124],[-119.22035,40.79153],[-119.22021,40.79182],[-119.22012,40.79197],[-119.21929,40.79171]]]},"properties":{"FID":0,"Id":0}}]} \ No newline at end of file diff --git a/Meshtastic/Resources/Toilets.geojson b/Meshtastic/Resources/Toilets.geojson new file mode 100644 index 00000000..1232a328 --- /dev/null +++ b/Meshtastic/Resources/Toilets.geojson @@ -0,0 +1,2984 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "id": 0, + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [ + -119.21320575933734, + 40.7990581593531 + ], + [ + -119.21316093593714, + 40.79899917635024 + ], + [ + -119.21311577599103, + 40.79893974846658 + ], + [ + -119.21307061612544, + 40.7988803205646 + ], + [ + -119.21302545515535, + 40.79882089264441 + ], + [ + -119.21298029545105, + 40.79876146560644 + ], + [ + -119.21293513582712, + 40.79870203764956 + ], + [ + -119.21288997509869, + 40.798642609674495 + ], + [ + -119.21284481563588, + 40.79858318168101 + ], + [ + -119.21279965506871, + 40.79852375456995 + ], + [ + -119.21275415440566, + 40.798463877173425 + ], + [ + -119.21266938910365, + 40.798500083422574 + ], + [ + -119.21258462489452, + 40.79853628870858 + ], + [ + -119.21258497336845, + 40.798536760589634 + ], + [ + -119.21262936708565, + 40.79859682005213 + ], + [ + -119.21267359375693, + 40.798656652561824 + ], + [ + -119.21271781932245, + 40.79871648415346 + ], + [ + -119.21276204496739, + 40.798776315727494 + ], + [ + -119.21280627187686, + 40.79883614728388 + ], + [ + -119.21285049768076, + 40.79889597972333 + ], + [ + -119.21289472356396, + 40.79895581124463 + ], + [ + -119.21293894952662, + 40.79901564274834 + ], + [ + -119.21298317675375, + 40.79907547423441 + ], + [ + -119.21302689200826, + 40.799134615894204 + ], + [ + -119.21308732347266, + 40.79910878422354 + ], + [ + -119.21311632572406, + 40.79909638720812 + ], + [ + -119.21320575933734, + 40.7990581593531 + ] + ] + ] + }, + "properties": { + "FID": 0, + "ref": "toilet" + } + }, + { + "type": "Feature", + "id": 1, + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [ + -119.21047092086818, + 40.79575556526773 + ], + [ + -119.21049201126682, + 40.795784336014556 + ], + [ + -119.21051486761431, + 40.795815515726055 + ], + [ + -119.21055881443952, + 40.79587546616701 + ], + [ + -119.21060276015868, + 40.79593541569008 + ], + [ + -119.2106251982363, + 40.79596602353057 + ], + [ + -119.21064629232383, + 40.79599479965143 + ], + [ + -119.21073382249229, + 40.79595754733276 + ], + [ + -119.21082135256289, + 40.79592029494745 + ], + [ + -119.21077657723585, + 40.79586136772022 + ], + [ + -119.2107314203576, + 40.795801938870675 + ], + [ + -119.2106862647449, + 40.795742510002775 + ], + [ + -119.21064110802774, + 40.79568308111665 + ], + [ + -119.21059595139103, + 40.79562365131166 + ], + [ + -119.21055079601993, + 40.79556422238886 + ], + [ + -119.21050563954441, + 40.795504793447876 + ], + [ + -119.2104604831493, + 40.795445363587994 + ], + [ + -119.21041532801989, + 40.79538593461036 + ], + [ + -119.21036978423504, + 40.795325995003395 + ], + [ + -119.21032662025745, + 40.79534434317189 + ], + [ + -119.21028829689155, + 40.79536063322639 + ], + [ + -119.21020681064851, + 40.79539527229217 + ], + [ + -119.21022790437453, + 40.79542404669124 + ], + [ + -119.21025119069365, + 40.79545581361603 + ], + [ + -119.21029513585941, + 40.79551576416125 + ], + [ + -119.21033908228928, + 40.79557571468907 + ], + [ + -119.21038302879822, + 40.79563566519949 + ], + [ + -119.21042697420111, + 40.79569561479202 + ], + [ + -119.2104498221915, + 40.795726783710336 + ], + [ + -119.21047092086818, + 40.79575556526773 + ] + ] + ] + }, + "properties": { + "FID": 1, + "ref": "toilet" + } + }, + { + "type": "Feature", + "id": 2, + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [ + -119.21385001719372, + 40.79444703483277 + ], + [ + -119.21378618440286, + 40.79439853374776 + ], + [ + -119.21378615951494, + 40.79439851483754 + ], + [ + -119.21372176743238, + 40.79434958778626 + ], + [ + -119.21365694021905, + 40.7943975853953 + ], + [ + -119.21359211172738, + 40.79444558296763 + ], + [ + -119.21352728906683, + 40.79449357690031 + ], + [ + -119.21351571747512, + 40.79450214421786 + ], + [ + -119.21351468188222, + 40.794502890888026 + ], + [ + -119.21346112117706, + 40.79454050731331 + ], + [ + -119.21339465335176, + 40.794587190051026 + ], + [ + -119.21332818424845, + 40.79463387365076 + ], + [ + -119.21326171860659, + 40.7946805536092 + ], + [ + -119.21325088152491, + 40.794688164419384 + ], + [ + -119.21324981985292, + 40.79468888947518 + ], + [ + -119.21319392313474, + 40.794726121410186 + ], + [ + -119.21321079020258, + 40.79474043399223 + ], + [ + -119.21325468111574, + 40.794777678751785 + ], + [ + -119.21329805653599, + 40.79481448585073 + ], + [ + -119.21331492483368, + 40.79482879931783 + ], + [ + -119.21332588993857, + 40.794821376714 + ], + [ + -119.21334213615293, + 40.794810345038904 + ], + [ + -119.21335835865887, + 40.794799293550525 + ], + [ + -119.21337455982649, + 40.79478822314928 + ], + [ + -119.21338325226407, + 40.79478226417455 + ], + [ + -119.2133907372857, + 40.794777132934726 + ], + [ + -119.21340689222166, + 40.79476602380741 + ], + [ + -119.21342302344915, + 40.79475489486686 + ], + [ + -119.21343913215337, + 40.79474374701353 + ], + [ + -119.2134511742765, + 40.79473538770124 + ], + [ + -119.21345521714925, + 40.79473258024754 + ], + [ + -119.2134712796217, + 40.794721393668226 + ], + [ + -119.213487319571, + 40.79471018907675 + ], + [ + -119.21350333581168, + 40.79469896377153 + ], + [ + -119.21351869324042, + 40.79468816719666 + ], + [ + -119.21351932834416, + 40.79468772045424 + ], + [ + -119.21353529835338, + 40.794676458224245 + ], + [ + -119.21355124465413, + 40.794665176181105 + ], + [ + -119.21356716724648, + 40.79465387522537 + ], + [ + -119.21358579493612, + 40.79464060716558 + ], + [ + -119.21359894367635, + 40.79463121657597 + ], + [ + -119.21361479632878, + 40.79461985888243 + ], + [ + -119.21363062527287, + 40.79460848227636 + ], + [ + -119.21365246988341, + 40.79459270760953 + ], + [ + -119.21366221322107, + 40.79458567232648 + ], + [ + -119.21367797222516, + 40.79457423898269 + ], + [ + -119.21369370633602, + 40.79456278762712 + ], + [ + -119.21370941792343, + 40.79455131645833 + ], + [ + -119.21371874297014, + 40.794544487439474 + ], + [ + -119.21372510461761, + 40.79453982727778 + ], + [ + -119.21374076878848, + 40.79452831918461 + ], + [ + -119.21375640806599, + 40.79451679217908 + ], + [ + -119.21377202482014, + 40.794505246261 + ], + [ + -119.21378459404778, + 40.79449592414308 + ], + [ + -119.2137876166811, + 40.79449368233113 + ], + [ + -119.21380318483368, + 40.794482099488846 + ], + [ + -119.21381916531358, + 40.79447017078473 + ], + [ + -119.21383424882897, + 40.79445887796767 + ], + [ + -119.21385001719372, + 40.79444703483277 + ] + ] + ] + }, + "properties": { + "FID": 2, + "ref": "toilet" + } + }, + { + "type": "Feature", + "id": 3, + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [ + -119.21721171740113, + 40.7972087991963 + ], + [ + -119.21724203581684, + 40.79723234065531 + ], + [ + -119.21727488000113, + 40.79725784329317 + ], + [ + -119.2173077242108, + 40.797283346822155 + ], + [ + -119.21733804269428, + 40.79730688825561 + ], + [ + -119.21736836119919, + 40.79733042968105 + ], + [ + -119.21740120548021, + 40.797355932282485 + ], + [ + -119.2174643683591, + 40.79740497627434 + ], + [ + -119.21752753014613, + 40.79745402113192 + ], + [ + -119.21755961480463, + 40.79747893299204 + ], + [ + -119.21758993346613, + 40.7975024743585 + ], + [ + -119.21766110350161, + 40.797449552121314 + ], + [ + -119.21773227342406, + 40.797396629839774 + ], + [ + -119.21766887944887, + 40.7973484685954 + ], + [ + -119.21760501620962, + 40.7972999507389 + ], + [ + -119.21754115306331, + 40.7972514328466 + ], + [ + -119.21747729000985, + 40.79720291401793 + ], + [ + -119.21741342704955, + 40.79715439605411 + ], + [ + -119.21734956418224, + 40.79710587805451 + ], + [ + -119.21728570140792, + 40.797057360019124 + ], + [ + -119.21722183872659, + 40.797008841948006 + ], + [ + -119.21715797613828, + 40.796960323841084 + ], + [ + -119.21709363955175, + 40.796911445517566 + ], + [ + -119.21702596977725, + 40.796961735506876 + ], + [ + -119.21695829990043, + 40.79701202455551 + ], + [ + -119.21698861695185, + 40.79703556518151 + ], + [ + -119.21702223134385, + 40.79706166579492 + ], + [ + -119.21708539366495, + 40.79711070999682 + ], + [ + -119.21714855607918, + 40.79715975506428 + ], + [ + -119.21718140019196, + 40.79718525772909 + ], + [ + -119.21721171740113, + 40.7972087991963 + ] + ] + ] + }, + "properties": { + "FID": 3, + "ref": "toilet" + } + }, + { + "type": "Feature", + "id": 4, + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [ + -119.21917379598577, + 40.79361865457066 + ], + [ + -119.21911517355844, + 40.79369409890048 + ], + [ + -119.21906573443805, + 40.793757723618846 + ], + [ + -119.21908748013841, + 40.79376752547737 + ], + [ + -119.21914450441346, + 40.79379322978992 + ], + [ + -119.21922216875679, + 40.79382823622663 + ], + [ + -119.21929983436684, + 40.79386324351128 + ], + [ + -119.2193775000585, + 40.79389825074344 + ], + [ + -119.21945516464673, + 40.793933257923236 + ], + [ + -119.21953283879422, + 40.79396825514282 + ], + [ + -119.2196104952529, + 40.794003272125174 + ], + [ + -119.21968816008564, + 40.79403827824691 + ], + [ + -119.21976582618515, + 40.794073285216534 + ], + [ + -119.21984238545613, + 40.79410779336001 + ], + [ + -119.21984259166848, + 40.794107886092256 + ], + [ + -119.21989487941399, + 40.79404079520031 + ], + [ + -119.21995582890966, + 40.79396165595559 + ], + [ + -119.21987862526129, + 40.79392779459533 + ], + [ + -119.21987180843793, + 40.793924804680906 + ], + [ + -119.21984991093768, + 40.79391520021947 + ], + [ + -119.2198004475217, + 40.79389350553736 + ], + [ + -119.21980041789378, + 40.79389349293318 + ], + [ + -119.21972223904969, + 40.79385920382218 + ], + [ + -119.21972220942178, + 40.793859191217976 + ], + [ + -119.21964403184313, + 40.7938249020536 + ], + [ + -119.21964400221502, + 40.7938248885488 + ], + [ + -119.21956582353206, + 40.793790600231965 + ], + [ + -119.219565793904, + 40.793790586727155 + ], + [ + -119.21948761648629, + 40.79375629745636 + ], + [ + -119.21948758685846, + 40.793756284852094 + ], + [ + -119.21940940833622, + 40.79372199552825 + ], + [ + -119.21940937870843, + 40.793721982924 + ], + [ + -119.21933120145182, + 40.79368769444738 + ], + [ + -119.21933117182382, + 40.793687680942504 + ], + [ + -119.21925299346252, + 40.793653391512244 + ], + [ + -119.21925296383458, + 40.793653378007335 + ], + [ + -119.21917379598577, + 40.79361865457066 + ] + ] + ] + }, + "properties": { + "FID": 4, + "ref": "toilet" + } + }, + { + "type": "Feature", + "id": 5, + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [ + -119.21571494737744, + 40.79229337450262 + ], + [ + -119.21571533252319, + 40.79229354917759 + ], + [ + -119.21576651176535, + 40.79222797773445 + ], + [ + -119.21582741508674, + 40.79215082554209 + ], + [ + -119.21574935409568, + 40.792116583249125 + ], + [ + -119.21567114979315, + 40.79208227877708 + ], + [ + -119.21559294675603, + 40.7920479742517 + ], + [ + -119.21551474142932, + 40.792013668772746 + ], + [ + -119.21543653855318, + 40.79197936414095 + ], + [ + -119.21535833457257, + 40.79194505945604 + ], + [ + -119.21528013185727, + 40.791910753817234 + ], + [ + -119.21520192803763, + 40.79187644902589 + ], + [ + -119.2151237242985, + 40.79184214418136 + ], + [ + -119.21504498499849, + 40.79180760338077 + ], + [ + -119.21498818035438, + 40.791880453578045 + ], + [ + -119.2149401968823, + 40.791941325120504 + ], + [ + -119.2149409541302, + 40.79194166907339 + ], + [ + -119.21497739447432, + 40.791958227427784 + ], + [ + -119.2150184612826, + 40.79197688820218 + ], + [ + -119.21509596022165, + 40.792012104577736 + ], + [ + -119.2151734604276, + 40.792047320900906 + ], + [ + -119.21525095834546, + 40.792082537172014 + ], + [ + -119.21532845990012, + 40.79211775339053 + ], + [ + -119.21540595798193, + 40.79215297045766 + ], + [ + -119.21548345970037, + 40.79218818657159 + ], + [ + -119.21552375176226, + 40.792206496013186 + ], + [ + -119.21556095794581, + 40.79222340263362 + ], + [ + -119.21563845864287, + 40.792258617742526 + ], + [ + -119.21571494737744, + 40.79229337450262 + ] + ] + ] + }, + "properties": { + "FID": 5, + "ref": "toilet" + } + }, + { + "type": "Feature", + "id": 6, + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [ + -119.21679029554303, + 40.789750555405746 + ], + [ + -119.21683197581672, + 40.789759563887365 + ], + [ + -119.21687714348134, + 40.78976932575896 + ], + [ + -119.2169639926537, + 40.789788096947206 + ], + [ + -119.21705084187477, + 40.78980686716944 + ], + [ + -119.21709530335764, + 40.789816475935055 + ], + [ + -119.21713687114098, + 40.78982546000325 + ], + [ + -119.21716409348235, + 40.78975208072795 + ], + [ + -119.21719664297312, + 40.78966557659157 + ], + [ + -119.21710958436879, + 40.78964785748685 + ], + [ + -119.21702236583984, + 40.789630105913176 + ], + [ + -119.21693514617242, + 40.78961235427368 + ], + [ + -119.21684792773634, + 40.78959460256802 + ], + [ + -119.21676070934652, + 40.78957684989582 + ], + [ + -119.21667349100333, + 40.78955909805823 + ], + [ + -119.21658627152166, + 40.78954134615478 + ], + [ + -119.21649905327135, + 40.7895235941852 + ], + [ + -119.21641183506748, + 40.78950584214966 + ], + [ + -119.21632401850282, + 40.78948796763168 + ], + [ + -119.21630566483016, + 40.789537347841424 + ], + [ + -119.21629372788107, + 40.789569461322365 + ], + [ + -119.2162683439118, + 40.78963774468154 + ], + [ + -119.2163100299694, + 40.78964675515243 + ], + [ + -119.21635605065998, + 40.789656701758226 + ], + [ + -119.21644289953876, + 40.78967547243849 + ], + [ + -119.21652974846646, + 40.789694243053304 + ], + [ + -119.21661659744302, + 40.789713013602686 + ], + [ + -119.21670344646866, + 40.78973178498723 + ], + [ + -119.21674859987606, + 40.789741544209 + ], + [ + -119.21679029554303, + 40.789750555405746 + ] + ] + ] + }, + "properties": { + "FID": 6, + "ref": "toilet" + } + }, + { + "type": "Feature", + "id": 7, + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [ + -119.22092933792445, + 40.790425222943064 + ], + [ + -119.22089817044981, + 40.7905095800207 + ], + [ + -119.22087194788512, + 40.7905807355731 + ], + [ + -119.22095988700913, + 40.79059948558106 + ], + [ + -119.22104682366856, + 40.79061802132951 + ], + [ + -119.22113376037655, + 40.790636557913004 + ], + [ + -119.22122069713285, + 40.790655094430925 + ], + [ + -119.22130763393723, + 40.7906736299827 + ], + [ + -119.22139457079024, + 40.79069216636949 + ], + [ + -119.2214815076913, + 40.79071070179011 + ], + [ + -119.22156844464091, + 40.79072923804576 + ], + [ + -119.22165538163864, + 40.790747773335276 + ], + [ + -119.22174125454603, + 40.790766082674644 + ], + [ + -119.22176886277701, + 40.79069098214608 + ], + [ + -119.22180133161706, + 40.79060266385688 + ], + [ + -119.22171478485738, + 40.790585052619086 + ], + [ + -119.22162756387684, + 40.79056730452955 + ], + [ + -119.22154034294275, + 40.790549556374025 + ], + [ + -119.22145312323998, + 40.79053180815234 + ], + [ + -119.22136590239869, + 40.79051405986483 + ], + [ + -119.22127868160389, + 40.79049631151132 + ], + [ + -119.2211914608555, + 40.790478563091824 + ], + [ + -119.22110424015325, + 40.79046081370578 + ], + [ + -119.22101701949771, + 40.79044306515429 + ], + [ + -119.22092933792445, + 40.790425222943064 + ] + ] + ] + }, + "properties": { + "FID": 7, + "ref": "toilet" + } + }, + { + "type": "Feature", + "id": 8, + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [ + -119.21676672304201, + 40.787151394980775 + ], + [ + -119.21766954360965, + 40.787161860773196 + ], + [ + -119.21767084923582, + 40.78708562592472 + ], + [ + -119.21767215485924, + 40.78700939197582 + ], + [ + -119.21676925186783, + 40.78700949460194 + ], + [ + -119.2167679868638, + 40.78708044479188 + ], + [ + -119.21676672304201, + 40.787151394980775 + ] + ] + ] + }, + "properties": { + "FID": 8, + "ref": "toilet" + } + }, + { + "type": "Feature", + "id": 9, + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [ + -119.22254782594494, + 40.787008715718244 + ], + [ + -119.22254677471386, + 40.78708063947169 + ], + [ + -119.22254572229546, + 40.787152562323826 + ], + [ + -119.2234485653877, + 40.78715990109053 + ], + [ + -119.2234496406282, + 40.78708423448604 + ], + [ + -119.22345071586633, + 40.78700856788055 + ], + [ + -119.22254782594494, + 40.787008715718244 + ] + ] + ] + }, + "properties": { + "FID": 9, + "ref": "toilet" + } + }, + { + "type": "Feature", + "id": 10, + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [ + -119.2218829922685, + 40.78354908316953 + ], + [ + -119.22185754365873, + 40.78347354309549 + ], + [ + -119.22182745541112, + 40.7833847398726 + ], + [ + -119.2209556458216, + 40.78356244113754 + ], + [ + -119.22098414671561, + 40.78364734167054 + ], + [ + -119.22100824744685, + 40.783718928552894 + ], + [ + -119.2218829922685, + 40.78354908316953 + ] + ] + ] + }, + "properties": { + "FID": 10, + "ref": "toilet" + } + }, + { + "type": "Feature", + "id": 11, + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [ + -119.21640231451448, + 40.78465156267149 + ], + [ + -119.21727716792408, + 40.78448421172071 + ], + [ + -119.21725235009494, + 40.78441034116092 + ], + [ + -119.21722363396417, + 40.78432305678725 + ], + [ + -119.21635114582351, + 40.78450085750285 + ], + [ + -119.21637875565848, + 40.78458289718729 + ], + [ + -119.21640231451448, + 40.78465156267149 + ] + ] + ] + }, + "properties": { + "FID": 11, + "ref": "toilet" + } + }, + { + "type": "Feature", + "id": 12, + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [ + -119.2151975382086, + 40.782309077116544 + ], + [ + -119.21598623671463, + 40.781975048924906 + ], + [ + -119.21593722331049, + 40.78190853113694 + ], + [ + -119.21588821000412, + 40.78184201332739 + ], + [ + -119.2151063894347, + 40.78218522529658 + ], + [ + -119.21515196318701, + 40.78224715166624 + ], + [ + -119.2151975382086, + 40.782309077116544 + ] + ] + ] + }, + "properties": { + "FID": 12, + "ref": "toilet" + } + }, + { + "type": "Feature", + "id": 13, + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [ + -119.2193295832776, + 40.78050183376417 + ], + [ + -119.2201166729552, + 40.780165692590515 + ], + [ + -119.22006637451267, + 40.78009773217038 + ], + [ + -119.2200160773574, + 40.78002977172738 + ], + [ + -119.21923430995108, + 40.78037300725894 + ], + [ + -119.21928194716081, + 40.780437420971985 + ], + [ + -119.2193295832776, + 40.78050183376417 + ] + ] + ] + }, + "properties": { + "FID": 13, + "ref": "toilet" + } + }, + { + "type": "Feature", + "id": 14, + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [ + -119.21708944144868, + 40.7769978974874 + ], + [ + -119.21772788050963, + 40.77651241738916 + ], + [ + -119.21765680730987, + 40.77645943601728 + ], + [ + -119.21758573422323, + 40.77640645550172 + ], + [ + -119.2169547608597, + 40.77689684039848 + ], + [ + -119.21702210051073, + 40.77694736851259 + ], + [ + -119.21708944144868, + 40.7769978974874 + ] + ] + ] + }, + "properties": { + "FID": 14, + "ref": "toilet" + } + }, + { + "type": "Feature", + "id": 15, + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [ + -119.2132216108523, + 40.78007471931362 + ], + [ + -119.21315778175973, + 40.78012324892972 + ], + [ + -119.21309395849744, + 40.78017177400672 + ], + [ + -119.21314135245652, + 40.7802083071664 + ], + [ + -119.2131572523761, + 40.78022072593136 + ], + [ + -119.21322021938654, + 40.78026990929782 + ], + [ + -119.21328319596883, + 40.780319098932864 + ], + [ + -119.21329798807355, + 40.7803306523011 + ], + [ + -119.21329901063201, + 40.780331469053095 + ], + [ + -119.21334482571022, + 40.78036927298379 + ], + [ + -119.21340600774849, + 40.7804197559392 + ], + [ + -119.21346718987927, + 40.78047023796111 + ], + [ + -119.2135283744727, + 40.780520723552286 + ], + [ + -119.2135331199942, + 40.780524638921705 + ], + [ + -119.21353410938843, + 40.780525478188984 + ], + [ + -119.21358788169937, + 40.78057235839886 + ], + [ + -119.21364722316586, + 40.78062409409382 + ], + [ + -119.2137065659092, + 40.78067582975771 + ], + [ + -119.21372571699102, + 40.780663290175404 + ], + [ + -119.21377413012641, + 40.7806315926332 + ], + [ + -119.2138233760243, + 40.780599350144584 + ], + [ + -119.2138425294316, + 40.78058680964197 + ], + [ + -119.21378238801414, + 40.78053425547957 + ], + [ + -119.21372224669156, + 40.780481702185966 + ], + [ + -119.21368215410898, + 40.78044666723947 + ], + [ + -119.21366150129336, + 40.780429545169326 + ], + [ + -119.21359957253237, + 40.78037820234927 + ], + [ + -119.21353764623656, + 40.7803268612965 + ], + [ + -119.21347571648133, + 40.78027551660797 + ], + [ + -119.21345507799042, + 40.78025840620683 + ], + [ + -119.21341261995272, + 40.780225000520936 + ], + [ + -119.21334895134179, + 40.78017490772123 + ], + [ + -119.21328528875092, + 40.78012481938843 + ], + [ + -119.2132216108523, + 40.78007471931362 + ] + ] + ] + }, + "properties": { + "FID": 15, + "ref": "toilet" + } + }, + { + "type": "Feature", + "id": 16, + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [ + -119.21300041996254, + 40.78123025232274 + ], + [ + -119.2131383345187, + 40.78114131034533 + ], + [ + -119.21307862437591, + 40.78108848290931 + ], + [ + -119.21301898779195, + 40.781035718477426 + ], + [ + -119.21288232231299, + 40.78112670095125 + ], + [ + -119.21294137109192, + 40.78117847665234 + ], + [ + -119.21300041996254, + 40.78123025232274 + ] + ] + ] + }, + "properties": { + "FID": 16, + "ref": "toilet" + } + }, + { + "type": "Feature", + "id": 17, + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [ + -119.21176305362536, + 40.78027593476868 + ], + [ + -119.21183157681881, + 40.78032047148881 + ], + [ + -119.21189748418074, + 40.780365206473924 + ], + [ + -119.21189880884677, + 40.78036611597847 + ], + [ + -119.21194969864037, + 40.78032317428929 + ], + [ + -119.21195916865051, + 40.7803151827266 + ], + [ + -119.21197565409197, + 40.78030127201963 + ], + [ + -119.21197645135408, + 40.780300599225924 + ], + [ + -119.2120195686397, + 40.78026421521763 + ], + [ + -119.21195260558652, + 40.78021869956332 + ], + [ + -119.21195126433693, + 40.78021779726521 + ], + [ + -119.21188275760795, + 40.780171994387324 + ], + [ + -119.21188245902674, + 40.78017179717863 + ], + [ + -119.21188236544067, + 40.78017187913848 + ], + [ + -119.21182314197179, + 40.78022353004417 + ], + [ + -119.21176305362536, + 40.78027593476868 + ] + ] + ] + }, + "properties": { + "FID": 17, + "ref": "toilet" + } + }, + { + "type": "Feature", + "id": 18, + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [ + -119.21020536873128, + 40.778514851606324 + ], + [ + -119.21028680404447, + 40.77854952082683 + ], + [ + -119.21036803451047, + 40.77858446468027 + ], + [ + -119.21081933655222, + 40.777990154493125 + ], + [ + -119.2107320334661, + 40.777952632017175 + ], + [ + -119.21064460136105, + 40.777915279693495 + ], + [ + -119.21020536873128, + 40.778514851606324 + ] + ] + ] + }, + "properties": { + "FID": 18, + "ref": "toilet" + } + }, + { + "type": "Feature", + "id": 19, + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [ + -119.21275135554313, + 40.775445784485875 + ], + [ + -119.21320225029969, + 40.774851947402766 + ], + [ + -119.21311305202414, + 40.77481344431436 + ], + [ + -119.21302385740572, + 40.77477494205707 + ], + [ + -119.21258213146425, + 40.77537303666288 + ], + [ + -119.21266679971923, + 40.77540933134951 + ], + [ + -119.21275135554313, + 40.775445784485875 + ] + ] + ] + }, + "properties": { + "FID": 19, + "ref": "toilet" + } + }, + { + "type": "Feature", + "id": 20, + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [ + -119.20834962042393, + 40.77409780628778 + ], + [ + -119.20844361982616, + 40.77411660979402 + ], + [ + -119.20855523756354, + 40.77413845923842 + ], + [ + -119.20878883905819, + 40.77347554973287 + ], + [ + -119.20867197791121, + 40.77345280553384 + ], + [ + -119.20857275862824, + 40.77343303337966 + ], + [ + -119.20834962042393, + 40.77409780628778 + ] + ] + ] + }, + "properties": { + "FID": 20, + "ref": "toilet" + } + }, + { + "type": "Feature", + "id": 21, + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [ + -119.207123361391, + 40.77760015740201 + ], + [ + -119.2072139959848, + 40.77761712388506 + ], + [ + -119.20732163381176, + 40.77763891877992 + ], + [ + -119.20734529986585, + 40.77757176663249 + ], + [ + -119.2073686614448, + 40.777505479053076 + ], + [ + -119.20739202416196, + 40.77743919056755 + ], + [ + -119.207415385648, + 40.777372902977135 + ], + [ + -119.20743874708769, + 40.777306616281834 + ], + [ + -119.20746210848085, + 40.77724032868044 + ], + [ + -119.20748546982762, + 40.77717404107356 + ], + [ + -119.20750883112792, + 40.777107753461195 + ], + [ + -119.2075321923818, + 40.77704146584335 + ], + [ + -119.2075552799642, + 40.77697595543618 + ], + [ + -119.20744068536774, + 40.776953483715346 + ], + [ + -119.20734351673474, + 40.776934603841056 + ], + [ + -119.2073435025205, + 40.776934647069716 + ], + [ + -119.2073346967702, + 40.77696126871736 + ], + [ + -119.2073216681793, + 40.77700065452499 + ], + [ + -119.20729965374674, + 40.777067208637646 + ], + [ + -119.20727763808553, + 40.77713376274538 + ], + [ + -119.2072556235651, + 40.77720031594753 + ], + [ + -119.20723360900074, + 40.77726687004529 + ], + [ + -119.2072203990563, + 40.7773068025016 + ], + [ + -119.20721159320773, + 40.77733342413815 + ], + [ + -119.2072027873521, + 40.77736004577387 + ], + [ + -119.20718957855549, + 40.77739997822595 + ], + [ + -119.20716756267458, + 40.77746653230884 + ], + [ + -119.20714554793443, + 40.77753308548616 + ], + [ + -119.20713216731, + 40.77757353487286 + ], + [ + -119.207123361391, + 40.77760015740201 + ] + ] + ] + }, + "properties": { + "FID": 21, + "ref": "toilet" + } + }, + { + "type": "Feature", + "id": 22, + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [ + -119.2040216470444, + 40.77292931041174 + ], + [ + -119.20402164789714, + 40.77224281637116 + ], + [ + -119.20392211662923, + 40.772243598868975 + ], + [ + -119.20382258535919, + 40.772244328146165 + ], + [ + -119.2038324243343, + 40.772930248534806 + ], + [ + -119.20392703568997, + 40.77292978401501 + ], + [ + -119.2040216470444, + 40.77292931041174 + ] + ] + ] + }, + "properties": { + "FID": 22, + "ref": "toilet" + } + }, + { + "type": "Feature", + "id": 23, + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [ + -119.20402164158783, + 40.77732138544076 + ], + [ + -119.20402164244045, + 40.77663516480276 + ], + [ + -119.20392135707702, + 40.77663584553226 + ], + [ + -119.20382107171072, + 40.77663672340352 + ], + [ + -119.20383497840776, + 40.77732259824864 + ], + [ + -119.20392830703825, + 40.77732147719606 + ], + [ + -119.20402164158783, + 40.77732138544076 + ] + ] + ] + }, + "properties": { + "FID": 23, + "ref": "toilet" + } + }, + { + "type": "Feature", + "id": 24, + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [ + -119.20076124764562, + 40.77765965755061 + ], + [ + -119.20052782299456, + 40.77699732167107 + ], + [ + -119.2004137790404, + 40.777021352990054 + ], + [ + -119.20031720832984, + 40.777041930112965 + ], + [ + -119.2005642411247, + 40.777702009956734 + ], + [ + -119.20065412494814, + 40.777682893184384 + ], + [ + -119.20076124764562, + 40.77765965755061 + ] + ] + ] + }, + "properties": { + "FID": 24, + "ref": "toilet" + } + }, + { + "type": "Feature", + "id": 25, + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [ + -119.1995278514809, + 40.77415976855591 + ], + [ + -119.19929425116318, + 40.7734968578974 + ], + [ + -119.19917808390781, + 40.77352157146861 + ], + [ + -119.1990791770348, + 40.773542228521364 + ], + [ + -119.19932303816117, + 40.7742027021409 + ], + [ + -119.19941681395557, + 40.77418326317026 + ], + [ + -119.1995278514809, + 40.77415976855591 + ] + ] + ] + }, + "properties": { + "FID": 25, + "ref": "toilet" + } + }, + { + "type": "Feature", + "id": 26, + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [ + -119.19532728004116, + 40.77549429657251 + ], + [ + -119.19487602486184, + 40.77489998254467 + ], + [ + -119.19477189259176, + 40.774946269847455 + ], + [ + -119.19468338803483, + 40.774985685938326 + ], + [ + -119.1951437681951, + 40.77557568399637 + ], + [ + -119.19522773449108, + 40.77553845924082 + ], + [ + -119.19532728004116, + 40.77549429657251 + ] + ] + ] + }, + "properties": { + "FID": 26, + "ref": "toilet" + } + }, + { + "type": "Feature", + "id": 27, + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [ + -119.19771020694508, + 40.77863246607556 + ], + [ + -119.19725882400937, + 40.77803804910777 + ], + [ + -119.19715688265121, + 40.77808374788119 + ], + [ + -119.1970706050369, + 40.778122621959916 + ], + [ + -119.19753393776243, + 40.77871161879406 + ], + [ + -119.1976142528664, + 40.77867547101938 + ], + [ + -119.19771020694508, + 40.77863246607556 + ] + ] + ] + }, + "properties": { + "FID": 27, + "ref": "toilet" + } + }, + { + "type": "Feature", + "id": 28, + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [ + -119.19086315485652, + 40.77717787530686 + ], + [ + -119.19092964331372, + 40.777126699763315 + ], + [ + -119.19099613285378, + 40.777075523280516 + ], + [ + -119.19035769394851, + 40.77659004250601 + ], + [ + -119.19028797671389, + 40.77664405509332 + ], + [ + -119.19021826055098, + 40.776698067638094 + ], + [ + -119.19086315485652, + 40.77717787530686 + ] + ] + ] + }, + "properties": { + "FID": 28, + "ref": "toilet" + } + }, + { + "type": "Feature", + "id": 29, + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [ + -119.19423774539449, + 40.77954034227019 + ], + [ + -119.19417343010704, + 40.77959006273348 + ], + [ + -119.1941095447375, + 40.779640108310126 + ], + [ + -119.19404610113503, + 40.77969046819472 + ], + [ + -119.19398309456017, + 40.77974114599001 + ], + [ + -119.19392052856739, + 40.77979214079633 + ], + [ + -119.19385840789568, + 40.77984345351549 + ], + [ + -119.19379673965548, + 40.779895072441136 + ], + [ + -119.19373546816874, + 40.779946965147815 + ], + [ + -119.19367474980655, + 40.77999923611851 + ], + [ + -119.19361443412241, + 40.78005177817046 + ], + [ + -119.19375120094296, + 40.780142343761256 + ], + [ + -119.19381095489082, + 40.780090691369644 + ], + [ + -119.19387070756136, + 40.780039038946555 + ], + [ + -119.19393046369373, + 40.779987385591774 + ], + [ + -119.19399184622608, + 40.779936853580395 + ], + [ + -119.19405336845158, + 40.77988641610985 + ], + [ + -119.19411489176878, + 40.77983597860616 + ], + [ + -119.1941764173628, + 40.779785538367655 + ], + [ + -119.19423955513058, + 40.77973627350137 + ], + [ + -119.19430280415997, + 40.77968708515957 + ], + [ + -119.19436605309605, + 40.77963789678266 + ], + [ + -119.19423774539449, + 40.77954034227019 + ] + ] + ] + }, + "properties": { + "FID": 29, + "ref": "toilet" + } + }, + { + "type": "Feature", + "id": 30, + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [ + -119.19299002376005, + 40.78230899670278 + ], + [ + -119.19303580849362, + 40.782247167643966 + ], + [ + -119.19308159432708, + 40.782185338566414 + ], + [ + -119.19229964710226, + 40.78184207150602 + ], + [ + -119.19225048924183, + 40.78190852805178 + ], + [ + -119.19220133246836, + 40.781974983675376 + ], + [ + -119.19299002376005, + 40.78230899670278 + ] + ] + ] + }, + "properties": { + "FID": 30, + "ref": "toilet" + } + }, + { + "type": "Feature", + "id": 31, + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [ + -119.18885733838226, + 40.78050148682467 + ], + [ + -119.18890545074669, + 40.780437279438374 + ], + [ + -119.18895382482424, + 40.78037318553977 + ], + [ + -119.1881720302765, + 40.78002993905606 + ], + [ + -119.18812129123252, + 40.78009770850407 + ], + [ + -119.18807055090043, + 40.78016547882942 + ], + [ + -119.18885733838226, + 40.78050148682467 + ] + ] + ] + }, + "properties": { + "FID": 31, + "ref": "toilet" + } + }, + { + "type": "Feature", + "id": 32, + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [ + -119.20807701015322, + 40.799556578877315 + ], + [ + -119.20805761240287, + 40.79950369521236 + ], + [ + -119.2077096584774, + 40.799577398672284 + ], + [ + -119.20772905595561, + 40.79963028239871 + ], + [ + -119.20807701015322, + 40.799556578877315 + ] + ] + ] + }, + "properties": { + "FID": 32, + "ref": "toilet" + } + }, + { + "type": "Feature", + "id": 33, + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [ + -119.20647352034797, + 40.79514409401405 + ], + [ + -119.2061255860784, + 40.79521778906046 + ], + [ + -119.20614498001456, + 40.79527067330854 + ], + [ + -119.20649291458307, + 40.79519697819492 + ], + [ + -119.20647352034797, + 40.79514409401405 + ] + ] + ] + }, + "properties": { + "FID": 33, + "ref": "toilet" + } + }, + { + "type": "Feature", + "id": 34, + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [ + -119.20759256623303, + 40.78969202603579 + ], + [ + -119.20733719487723, + 40.789886134459444 + ], + [ + -119.20738827362703, + 40.789924952807304 + ], + [ + -119.20764364498281, + 40.78973084427192 + ], + [ + -119.20759256623303, + 40.78969202603579 + ] + ] + ] + }, + "properties": { + "FID": 34, + "ref": "toilet" + } + }, + { + "type": "Feature", + "id": 35, + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [ + -119.20228810888008, + 40.78698272541642 + ], + [ + -119.2022881103759, + 40.78692782562718 + ], + [ + -119.2019269605131, + 40.78692781937738 + ], + [ + -119.20192695871988, + 40.78698271916661 + ], + [ + -119.20228810888008, + 40.78698272541642 + ] + ] + ] + }, + "properties": { + "FID": 35, + "ref": "toilet" + } + }, + { + "type": "Feature", + "id": 36, + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [ + -119.20044219316563, + 40.78425724047879 + ], + [ + -119.20018682180992, + 40.78445133326208 + ], + [ + -119.20023789223208, + 40.784490154811365 + ], + [ + -119.20049326358783, + 40.784296061916386 + ], + [ + -119.20044219316563, + 40.78425724047879 + ] + ] + ] + }, + "properties": { + "FID": 36, + "ref": "toilet" + } + }, + { + "type": "Feature", + "id": 37, + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [ + -119.18740374995261, + 40.784028722138835 + ], + [ + -119.18733417812913, + 40.784013973886296 + ], + [ + -119.18723716269027, + 40.78427838251221 + ], + [ + -119.18730673476344, + 40.784293130835266 + ], + [ + -119.18740374995261, + 40.784028722138835 + ] + ] + ] + }, + "properties": { + "FID": 37, + "ref": "toilet" + } + }, + { + "type": "Feature", + "id": 38, + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [ + -119.1932088670016, + 40.78507884824537 + ], + [ + -119.1931392925312, + 40.78506410422078 + ], + [ + -119.19304230344187, + 40.785328518711125 + ], + [ + -119.19311187816962, + 40.78534326278575 + ], + [ + -119.1932088670016, + 40.78507884824537 + ] + ] + ] + }, + "properties": { + "FID": 38, + "ref": "toilet" + } + }, + { + "type": "Feature", + "id": 39, + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [ + -119.19538823841754, + 40.79139782940088 + ], + [ + -119.19502706434051, + 40.79139780155435 + ], + [ + -119.19502705686388, + 40.79145270130027 + ], + [ + -119.19538823123841, + 40.79145272914685 + ], + [ + -119.19538823841754, + 40.79139782940088 + ] + ] + ] + }, + "properties": { + "FID": 39, + "ref": "toilet" + } + }, + { + "type": "Feature", + "id": 40, + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [ + -119.1977993927962, + 40.80150107981738 + ], + [ + -119.1976283678516, + 40.80145695305287 + ], + [ + -119.19760514015168, + 40.80150893787917 + ], + [ + -119.1977761652143, + 40.801553064677705 + ], + [ + -119.1977993927962, + 40.80150107981738 + ] + ] + ] + }, + "properties": { + "FID": 40, + "ref": "toilet" + } + }, + { + "type": "Feature", + "id": 41, + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [ + -119.19988262699445, + 40.80388068539161 + ], + [ + -119.19970547847284, + 40.80385390280192 + ], + [ + -119.1996913799548, + 40.80390774700976 + ], + [ + -119.19986852861389, + 40.80393452962084 + ], + [ + -119.19988262699445, + 40.80388068539161 + ] + ] + ] + }, + "properties": { + "FID": 41, + "ref": "toilet" + } + }, + { + "type": "Feature", + "id": 42, + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [ + -119.20298750014379, + 40.80223839013915 + ], + [ + -119.20280727061372, + 40.80222941172552 + ], + [ + -119.2028025443886, + 40.80228419377095 + ], + [ + -119.20298277406624, + 40.802293172191874 + ], + [ + -119.20298750014379, + 40.80223839013915 + ] + ] + ] + }, + "properties": { + "FID": 42, + "ref": "toilet" + } + }, + { + "type": "Feature", + "id": 43, + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [ + -119.1925071048293, + 40.80145374515956 + ], + [ + -119.19235327782975, + 40.80138181993947 + ], + [ + -119.1923154175198, + 40.801428577299696 + ], + [ + -119.19246924458639, + 40.80150050256967 + ], + [ + -119.1925071048293, + 40.80145374515956 + ] + ] + ] + }, + "properties": { + "FID": 43, + "ref": "toilet" + } + }, + { + "type": "Feature", + "id": 44, + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [ + -119.18498512322356, + 40.79577252557828 + ], + [ + -119.1849235459306, + 40.795801231749074 + ], + [ + -119.18501797833379, + 40.79591822353866 + ], + [ + -119.18507955569419, + 40.79588951731807 + ], + [ + -119.18498512322356, + 40.79577252557828 + ] + ] + ] + }, + "properties": { + "FID": 44, + "ref": "toilet" + } + } + ] +} \ No newline at end of file diff --git a/Meshtastic/Resources/Trash_Fence.geojson b/Meshtastic/Resources/Trash_Fence.geojson new file mode 100644 index 00000000..10c08f06 --- /dev/null +++ b/Meshtastic/Resources/Trash_Fence.geojson @@ -0,0 +1,44 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "id": 0, + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [ + -119.18279831290056, + 40.80313545483217 + ], + [ + -119.21776730133423, + 40.80734514946494 + ], + [ + -119.23383070469475, + 40.783371453674185 + ], + [ + -119.20880237381652, + 40.76435187944433 + ], + [ + -119.17727060534106, + 40.776562577639574 + ], + [ + -119.18279831290056, + 40.80313545483217 + ] + ] + ] + }, + "properties": { + "FID": 0, + "Id": 0 + } + } + ] +} \ No newline at end of file diff --git a/Meshtastic/Views/Nodes/Helpers/Map/MapContent/MeshMapContent.swift b/Meshtastic/Views/Nodes/Helpers/Map/MapContent/MeshMapContent.swift index 832ae9c6..34f03f15 100644 --- a/Meshtastic/Views/Nodes/Helpers/Map/MapContent/MeshMapContent.swift +++ b/Meshtastic/Views/Nodes/Helpers/Map/MapContent/MeshMapContent.swift @@ -8,6 +8,11 @@ import SwiftUI import MapKit +struct IdentifiableOverlay: Identifiable { + let overlay: MKOverlay + var id: ObjectIdentifier { ObjectIdentifier(overlay as AnyObject) } +} + struct MeshMapContent: MapContent { /// Parameters @@ -24,6 +29,11 @@ struct MeshMapContent: MapContent { @AppStorage("enableMapWaypoints") private var showWaypoints = true @Binding var selectedWaypoint: WaypointEntity? + // Burning Man GeoJSON overlays + @AppStorage("burningManShowStreets") private var showStreets = false + @AppStorage("burningManShowToilets") private var showToilets = false + @AppStorage("burningManShowTrashFence") private var showTrashFence = false + @FetchRequest(fetchRequest: PositionEntity.allPositionsFetchRequest(), animation: .easeIn) var positions: FetchedResults @@ -222,6 +232,53 @@ struct MeshMapContent: MapContent { .foregroundStyle(.indigo.opacity(0.4)) } } + + /// Burning Man GeoJSON Overlays + if showStreets { + let overlays = GeoJSONOverlayManager.shared.loadOverlays(for: StaticGeoJSONOverlay.streetOutlines) + let identifiableOverlays = overlays.map { IdentifiableOverlay(overlay: $0) } + ForEach(identifiableOverlays) { identifiable in + let overlay = identifiable.overlay + if let polygon = overlay as? MKPolygon { + MapPolygon(polygon) + .stroke(.yellow.opacity(0.8), lineWidth: 0.5) + .foregroundStyle(.clear) + } else if let polyline = overlay as? MKPolyline { + MapPolyline(polyline) + .stroke(.yellow.opacity(0.9), lineWidth: 0.8) + } + } + } + + if showToilets { + let overlays = GeoJSONOverlayManager.shared.loadOverlays(for: StaticGeoJSONOverlay.toilets) + let identifiableOverlays = overlays.map { IdentifiableOverlay(overlay: $0) } + ForEach(identifiableOverlays) { identifiable in + let overlay = identifiable.overlay + if let polygon = overlay as? MKPolygon { + MapPolygon(polygon) + .stroke(.brown, lineWidth: 1) + .foregroundStyle(.brown.opacity(0.3)) + } + } + } + + if showTrashFence { + let overlays = GeoJSONOverlayManager.shared.loadOverlays(for: StaticGeoJSONOverlay.trashFence) + let identifiableOverlays = overlays.map { IdentifiableOverlay(overlay: $0) } + ForEach(identifiableOverlays) { identifiable in + let overlay = identifiable.overlay + if let polyline = overlay as? MKPolyline { + MapPolyline(polyline) + .stroke(.red, lineWidth: 3) + } else if let polygon = overlay as? MKPolygon { + MapPolygon(polygon) + .stroke(.red, lineWidth: 3) + .foregroundStyle(.red.opacity(0.2)) + } + } + } + positionAnnotations routeAnnotations waypointAnnotations diff --git a/Meshtastic/Views/Nodes/Helpers/Map/MapSettingsForm.swift b/Meshtastic/Views/Nodes/Helpers/Map/MapSettingsForm.swift index 8a2ba6bc..b24c4927 100644 --- a/Meshtastic/Views/Nodes/Helpers/Map/MapSettingsForm.swift +++ b/Meshtastic/Views/Nodes/Helpers/Map/MapSettingsForm.swift @@ -115,6 +115,47 @@ struct MapSettingsForm: View { UserDefaults.enableMapPointsOfInterest = self.pointsOfInterest } } + + Section(header: Text("Burning Man Overlays")) { + Toggle(isOn: Binding( + get: { UserDefaults.standard.bool(forKey: "burningManShowStreets") }, + set: { UserDefaults.standard.set($0, forKey: "burningManShowStreets") } + )) { + Label { + Text("Street Outlines") + } icon: { + Image(systemName: "road.lanes") + .foregroundColor(.yellow) + } + } + .tint(.accentColor) + + Toggle(isOn: Binding( + get: { UserDefaults.standard.bool(forKey: "burningManShowToilets") }, + set: { UserDefaults.standard.set($0, forKey: "burningManShowToilets") } + )) { + Label { + Text("Toilets") + } icon: { + Image(systemName: "toilet") + .foregroundColor(.brown) + } + } + .tint(.accentColor) + + Toggle(isOn: Binding( + get: { UserDefaults.standard.bool(forKey: "burningManShowTrashFence") }, + set: { UserDefaults.standard.set($0, forKey: "burningManShowTrashFence") } + )) { + Label { + Text("Trash Fence") + } icon: { + Image(systemName: "fence") + .foregroundColor(.red) + } + } + .tint(.accentColor) + } } #if targetEnvironment(macCatalyst) From 4c2363d275f4055294042c9055366d812776096c Mon Sep 17 00:00:00 2001 From: Jacob Powers Date: Wed, 16 Jul 2025 02:50:56 +0000 Subject: [PATCH 02/19] compressed sample geojson files --- Meshtastic/Resources/Toilets.geojson | 2985 +--------------------- Meshtastic/Resources/Trash_Fence.geojson | 45 +- 2 files changed, 2 insertions(+), 3028 deletions(-) diff --git a/Meshtastic/Resources/Toilets.geojson b/Meshtastic/Resources/Toilets.geojson index 1232a328..fb1e726b 100644 --- a/Meshtastic/Resources/Toilets.geojson +++ b/Meshtastic/Resources/Toilets.geojson @@ -1,2984 +1 @@ -{ - "type": "FeatureCollection", - "features": [ - { - "type": "Feature", - "id": 0, - "geometry": { - "type": "Polygon", - "coordinates": [ - [ - [ - -119.21320575933734, - 40.7990581593531 - ], - [ - -119.21316093593714, - 40.79899917635024 - ], - [ - -119.21311577599103, - 40.79893974846658 - ], - [ - -119.21307061612544, - 40.7988803205646 - ], - [ - -119.21302545515535, - 40.79882089264441 - ], - [ - -119.21298029545105, - 40.79876146560644 - ], - [ - -119.21293513582712, - 40.79870203764956 - ], - [ - -119.21288997509869, - 40.798642609674495 - ], - [ - -119.21284481563588, - 40.79858318168101 - ], - [ - -119.21279965506871, - 40.79852375456995 - ], - [ - -119.21275415440566, - 40.798463877173425 - ], - [ - -119.21266938910365, - 40.798500083422574 - ], - [ - -119.21258462489452, - 40.79853628870858 - ], - [ - -119.21258497336845, - 40.798536760589634 - ], - [ - -119.21262936708565, - 40.79859682005213 - ], - [ - -119.21267359375693, - 40.798656652561824 - ], - [ - -119.21271781932245, - 40.79871648415346 - ], - [ - -119.21276204496739, - 40.798776315727494 - ], - [ - -119.21280627187686, - 40.79883614728388 - ], - [ - -119.21285049768076, - 40.79889597972333 - ], - [ - -119.21289472356396, - 40.79895581124463 - ], - [ - -119.21293894952662, - 40.79901564274834 - ], - [ - -119.21298317675375, - 40.79907547423441 - ], - [ - -119.21302689200826, - 40.799134615894204 - ], - [ - -119.21308732347266, - 40.79910878422354 - ], - [ - -119.21311632572406, - 40.79909638720812 - ], - [ - -119.21320575933734, - 40.7990581593531 - ] - ] - ] - }, - "properties": { - "FID": 0, - "ref": "toilet" - } - }, - { - "type": "Feature", - "id": 1, - "geometry": { - "type": "Polygon", - "coordinates": [ - [ - [ - -119.21047092086818, - 40.79575556526773 - ], - [ - -119.21049201126682, - 40.795784336014556 - ], - [ - -119.21051486761431, - 40.795815515726055 - ], - [ - -119.21055881443952, - 40.79587546616701 - ], - [ - -119.21060276015868, - 40.79593541569008 - ], - [ - -119.2106251982363, - 40.79596602353057 - ], - [ - -119.21064629232383, - 40.79599479965143 - ], - [ - -119.21073382249229, - 40.79595754733276 - ], - [ - -119.21082135256289, - 40.79592029494745 - ], - [ - -119.21077657723585, - 40.79586136772022 - ], - [ - -119.2107314203576, - 40.795801938870675 - ], - [ - -119.2106862647449, - 40.795742510002775 - ], - [ - -119.21064110802774, - 40.79568308111665 - ], - [ - -119.21059595139103, - 40.79562365131166 - ], - [ - -119.21055079601993, - 40.79556422238886 - ], - [ - -119.21050563954441, - 40.795504793447876 - ], - [ - -119.2104604831493, - 40.795445363587994 - ], - [ - -119.21041532801989, - 40.79538593461036 - ], - [ - -119.21036978423504, - 40.795325995003395 - ], - [ - -119.21032662025745, - 40.79534434317189 - ], - [ - -119.21028829689155, - 40.79536063322639 - ], - [ - -119.21020681064851, - 40.79539527229217 - ], - [ - -119.21022790437453, - 40.79542404669124 - ], - [ - -119.21025119069365, - 40.79545581361603 - ], - [ - -119.21029513585941, - 40.79551576416125 - ], - [ - -119.21033908228928, - 40.79557571468907 - ], - [ - -119.21038302879822, - 40.79563566519949 - ], - [ - -119.21042697420111, - 40.79569561479202 - ], - [ - -119.2104498221915, - 40.795726783710336 - ], - [ - -119.21047092086818, - 40.79575556526773 - ] - ] - ] - }, - "properties": { - "FID": 1, - "ref": "toilet" - } - }, - { - "type": "Feature", - "id": 2, - "geometry": { - "type": "Polygon", - "coordinates": [ - [ - [ - -119.21385001719372, - 40.79444703483277 - ], - [ - -119.21378618440286, - 40.79439853374776 - ], - [ - -119.21378615951494, - 40.79439851483754 - ], - [ - -119.21372176743238, - 40.79434958778626 - ], - [ - -119.21365694021905, - 40.7943975853953 - ], - [ - -119.21359211172738, - 40.79444558296763 - ], - [ - -119.21352728906683, - 40.79449357690031 - ], - [ - -119.21351571747512, - 40.79450214421786 - ], - [ - -119.21351468188222, - 40.794502890888026 - ], - [ - -119.21346112117706, - 40.79454050731331 - ], - [ - -119.21339465335176, - 40.794587190051026 - ], - [ - -119.21332818424845, - 40.79463387365076 - ], - [ - -119.21326171860659, - 40.7946805536092 - ], - [ - -119.21325088152491, - 40.794688164419384 - ], - [ - -119.21324981985292, - 40.79468888947518 - ], - [ - -119.21319392313474, - 40.794726121410186 - ], - [ - -119.21321079020258, - 40.79474043399223 - ], - [ - -119.21325468111574, - 40.794777678751785 - ], - [ - -119.21329805653599, - 40.79481448585073 - ], - [ - -119.21331492483368, - 40.79482879931783 - ], - [ - -119.21332588993857, - 40.794821376714 - ], - [ - -119.21334213615293, - 40.794810345038904 - ], - [ - -119.21335835865887, - 40.794799293550525 - ], - [ - -119.21337455982649, - 40.79478822314928 - ], - [ - -119.21338325226407, - 40.79478226417455 - ], - [ - -119.2133907372857, - 40.794777132934726 - ], - [ - -119.21340689222166, - 40.79476602380741 - ], - [ - -119.21342302344915, - 40.79475489486686 - ], - [ - -119.21343913215337, - 40.79474374701353 - ], - [ - -119.2134511742765, - 40.79473538770124 - ], - [ - -119.21345521714925, - 40.79473258024754 - ], - [ - -119.2134712796217, - 40.794721393668226 - ], - [ - -119.213487319571, - 40.79471018907675 - ], - [ - -119.21350333581168, - 40.79469896377153 - ], - [ - -119.21351869324042, - 40.79468816719666 - ], - [ - -119.21351932834416, - 40.79468772045424 - ], - [ - -119.21353529835338, - 40.794676458224245 - ], - [ - -119.21355124465413, - 40.794665176181105 - ], - [ - -119.21356716724648, - 40.79465387522537 - ], - [ - -119.21358579493612, - 40.79464060716558 - ], - [ - -119.21359894367635, - 40.79463121657597 - ], - [ - -119.21361479632878, - 40.79461985888243 - ], - [ - -119.21363062527287, - 40.79460848227636 - ], - [ - -119.21365246988341, - 40.79459270760953 - ], - [ - -119.21366221322107, - 40.79458567232648 - ], - [ - -119.21367797222516, - 40.79457423898269 - ], - [ - -119.21369370633602, - 40.79456278762712 - ], - [ - -119.21370941792343, - 40.79455131645833 - ], - [ - -119.21371874297014, - 40.794544487439474 - ], - [ - -119.21372510461761, - 40.79453982727778 - ], - [ - -119.21374076878848, - 40.79452831918461 - ], - [ - -119.21375640806599, - 40.79451679217908 - ], - [ - -119.21377202482014, - 40.794505246261 - ], - [ - -119.21378459404778, - 40.79449592414308 - ], - [ - -119.2137876166811, - 40.79449368233113 - ], - [ - -119.21380318483368, - 40.794482099488846 - ], - [ - -119.21381916531358, - 40.79447017078473 - ], - [ - -119.21383424882897, - 40.79445887796767 - ], - [ - -119.21385001719372, - 40.79444703483277 - ] - ] - ] - }, - "properties": { - "FID": 2, - "ref": "toilet" - } - }, - { - "type": "Feature", - "id": 3, - "geometry": { - "type": "Polygon", - "coordinates": [ - [ - [ - -119.21721171740113, - 40.7972087991963 - ], - [ - -119.21724203581684, - 40.79723234065531 - ], - [ - -119.21727488000113, - 40.79725784329317 - ], - [ - -119.2173077242108, - 40.797283346822155 - ], - [ - -119.21733804269428, - 40.79730688825561 - ], - [ - -119.21736836119919, - 40.79733042968105 - ], - [ - -119.21740120548021, - 40.797355932282485 - ], - [ - -119.2174643683591, - 40.79740497627434 - ], - [ - -119.21752753014613, - 40.79745402113192 - ], - [ - -119.21755961480463, - 40.79747893299204 - ], - [ - -119.21758993346613, - 40.7975024743585 - ], - [ - -119.21766110350161, - 40.797449552121314 - ], - [ - -119.21773227342406, - 40.797396629839774 - ], - [ - -119.21766887944887, - 40.7973484685954 - ], - [ - -119.21760501620962, - 40.7972999507389 - ], - [ - -119.21754115306331, - 40.7972514328466 - ], - [ - -119.21747729000985, - 40.79720291401793 - ], - [ - -119.21741342704955, - 40.79715439605411 - ], - [ - -119.21734956418224, - 40.79710587805451 - ], - [ - -119.21728570140792, - 40.797057360019124 - ], - [ - -119.21722183872659, - 40.797008841948006 - ], - [ - -119.21715797613828, - 40.796960323841084 - ], - [ - -119.21709363955175, - 40.796911445517566 - ], - [ - -119.21702596977725, - 40.796961735506876 - ], - [ - -119.21695829990043, - 40.79701202455551 - ], - [ - -119.21698861695185, - 40.79703556518151 - ], - [ - -119.21702223134385, - 40.79706166579492 - ], - [ - -119.21708539366495, - 40.79711070999682 - ], - [ - -119.21714855607918, - 40.79715975506428 - ], - [ - -119.21718140019196, - 40.79718525772909 - ], - [ - -119.21721171740113, - 40.7972087991963 - ] - ] - ] - }, - "properties": { - "FID": 3, - "ref": "toilet" - } - }, - { - "type": "Feature", - "id": 4, - "geometry": { - "type": "Polygon", - "coordinates": [ - [ - [ - -119.21917379598577, - 40.79361865457066 - ], - [ - -119.21911517355844, - 40.79369409890048 - ], - [ - -119.21906573443805, - 40.793757723618846 - ], - [ - -119.21908748013841, - 40.79376752547737 - ], - [ - -119.21914450441346, - 40.79379322978992 - ], - [ - -119.21922216875679, - 40.79382823622663 - ], - [ - -119.21929983436684, - 40.79386324351128 - ], - [ - -119.2193775000585, - 40.79389825074344 - ], - [ - -119.21945516464673, - 40.793933257923236 - ], - [ - -119.21953283879422, - 40.79396825514282 - ], - [ - -119.2196104952529, - 40.794003272125174 - ], - [ - -119.21968816008564, - 40.79403827824691 - ], - [ - -119.21976582618515, - 40.794073285216534 - ], - [ - -119.21984238545613, - 40.79410779336001 - ], - [ - -119.21984259166848, - 40.794107886092256 - ], - [ - -119.21989487941399, - 40.79404079520031 - ], - [ - -119.21995582890966, - 40.79396165595559 - ], - [ - -119.21987862526129, - 40.79392779459533 - ], - [ - -119.21987180843793, - 40.793924804680906 - ], - [ - -119.21984991093768, - 40.79391520021947 - ], - [ - -119.2198004475217, - 40.79389350553736 - ], - [ - -119.21980041789378, - 40.79389349293318 - ], - [ - -119.21972223904969, - 40.79385920382218 - ], - [ - -119.21972220942178, - 40.793859191217976 - ], - [ - -119.21964403184313, - 40.7938249020536 - ], - [ - -119.21964400221502, - 40.7938248885488 - ], - [ - -119.21956582353206, - 40.793790600231965 - ], - [ - -119.219565793904, - 40.793790586727155 - ], - [ - -119.21948761648629, - 40.79375629745636 - ], - [ - -119.21948758685846, - 40.793756284852094 - ], - [ - -119.21940940833622, - 40.79372199552825 - ], - [ - -119.21940937870843, - 40.793721982924 - ], - [ - -119.21933120145182, - 40.79368769444738 - ], - [ - -119.21933117182382, - 40.793687680942504 - ], - [ - -119.21925299346252, - 40.793653391512244 - ], - [ - -119.21925296383458, - 40.793653378007335 - ], - [ - -119.21917379598577, - 40.79361865457066 - ] - ] - ] - }, - "properties": { - "FID": 4, - "ref": "toilet" - } - }, - { - "type": "Feature", - "id": 5, - "geometry": { - "type": "Polygon", - "coordinates": [ - [ - [ - -119.21571494737744, - 40.79229337450262 - ], - [ - -119.21571533252319, - 40.79229354917759 - ], - [ - -119.21576651176535, - 40.79222797773445 - ], - [ - -119.21582741508674, - 40.79215082554209 - ], - [ - -119.21574935409568, - 40.792116583249125 - ], - [ - -119.21567114979315, - 40.79208227877708 - ], - [ - -119.21559294675603, - 40.7920479742517 - ], - [ - -119.21551474142932, - 40.792013668772746 - ], - [ - -119.21543653855318, - 40.79197936414095 - ], - [ - -119.21535833457257, - 40.79194505945604 - ], - [ - -119.21528013185727, - 40.791910753817234 - ], - [ - -119.21520192803763, - 40.79187644902589 - ], - [ - -119.2151237242985, - 40.79184214418136 - ], - [ - -119.21504498499849, - 40.79180760338077 - ], - [ - -119.21498818035438, - 40.791880453578045 - ], - [ - -119.2149401968823, - 40.791941325120504 - ], - [ - -119.2149409541302, - 40.79194166907339 - ], - [ - -119.21497739447432, - 40.791958227427784 - ], - [ - -119.2150184612826, - 40.79197688820218 - ], - [ - -119.21509596022165, - 40.792012104577736 - ], - [ - -119.2151734604276, - 40.792047320900906 - ], - [ - -119.21525095834546, - 40.792082537172014 - ], - [ - -119.21532845990012, - 40.79211775339053 - ], - [ - -119.21540595798193, - 40.79215297045766 - ], - [ - -119.21548345970037, - 40.79218818657159 - ], - [ - -119.21552375176226, - 40.792206496013186 - ], - [ - -119.21556095794581, - 40.79222340263362 - ], - [ - -119.21563845864287, - 40.792258617742526 - ], - [ - -119.21571494737744, - 40.79229337450262 - ] - ] - ] - }, - "properties": { - "FID": 5, - "ref": "toilet" - } - }, - { - "type": "Feature", - "id": 6, - "geometry": { - "type": "Polygon", - "coordinates": [ - [ - [ - -119.21679029554303, - 40.789750555405746 - ], - [ - -119.21683197581672, - 40.789759563887365 - ], - [ - -119.21687714348134, - 40.78976932575896 - ], - [ - -119.2169639926537, - 40.789788096947206 - ], - [ - -119.21705084187477, - 40.78980686716944 - ], - [ - -119.21709530335764, - 40.789816475935055 - ], - [ - -119.21713687114098, - 40.78982546000325 - ], - [ - -119.21716409348235, - 40.78975208072795 - ], - [ - -119.21719664297312, - 40.78966557659157 - ], - [ - -119.21710958436879, - 40.78964785748685 - ], - [ - -119.21702236583984, - 40.789630105913176 - ], - [ - -119.21693514617242, - 40.78961235427368 - ], - [ - -119.21684792773634, - 40.78959460256802 - ], - [ - -119.21676070934652, - 40.78957684989582 - ], - [ - -119.21667349100333, - 40.78955909805823 - ], - [ - -119.21658627152166, - 40.78954134615478 - ], - [ - -119.21649905327135, - 40.7895235941852 - ], - [ - -119.21641183506748, - 40.78950584214966 - ], - [ - -119.21632401850282, - 40.78948796763168 - ], - [ - -119.21630566483016, - 40.789537347841424 - ], - [ - -119.21629372788107, - 40.789569461322365 - ], - [ - -119.2162683439118, - 40.78963774468154 - ], - [ - -119.2163100299694, - 40.78964675515243 - ], - [ - -119.21635605065998, - 40.789656701758226 - ], - [ - -119.21644289953876, - 40.78967547243849 - ], - [ - -119.21652974846646, - 40.789694243053304 - ], - [ - -119.21661659744302, - 40.789713013602686 - ], - [ - -119.21670344646866, - 40.78973178498723 - ], - [ - -119.21674859987606, - 40.789741544209 - ], - [ - -119.21679029554303, - 40.789750555405746 - ] - ] - ] - }, - "properties": { - "FID": 6, - "ref": "toilet" - } - }, - { - "type": "Feature", - "id": 7, - "geometry": { - "type": "Polygon", - "coordinates": [ - [ - [ - -119.22092933792445, - 40.790425222943064 - ], - [ - -119.22089817044981, - 40.7905095800207 - ], - [ - -119.22087194788512, - 40.7905807355731 - ], - [ - -119.22095988700913, - 40.79059948558106 - ], - [ - -119.22104682366856, - 40.79061802132951 - ], - [ - -119.22113376037655, - 40.790636557913004 - ], - [ - -119.22122069713285, - 40.790655094430925 - ], - [ - -119.22130763393723, - 40.7906736299827 - ], - [ - -119.22139457079024, - 40.79069216636949 - ], - [ - -119.2214815076913, - 40.79071070179011 - ], - [ - -119.22156844464091, - 40.79072923804576 - ], - [ - -119.22165538163864, - 40.790747773335276 - ], - [ - -119.22174125454603, - 40.790766082674644 - ], - [ - -119.22176886277701, - 40.79069098214608 - ], - [ - -119.22180133161706, - 40.79060266385688 - ], - [ - -119.22171478485738, - 40.790585052619086 - ], - [ - -119.22162756387684, - 40.79056730452955 - ], - [ - -119.22154034294275, - 40.790549556374025 - ], - [ - -119.22145312323998, - 40.79053180815234 - ], - [ - -119.22136590239869, - 40.79051405986483 - ], - [ - -119.22127868160389, - 40.79049631151132 - ], - [ - -119.2211914608555, - 40.790478563091824 - ], - [ - -119.22110424015325, - 40.79046081370578 - ], - [ - -119.22101701949771, - 40.79044306515429 - ], - [ - -119.22092933792445, - 40.790425222943064 - ] - ] - ] - }, - "properties": { - "FID": 7, - "ref": "toilet" - } - }, - { - "type": "Feature", - "id": 8, - "geometry": { - "type": "Polygon", - "coordinates": [ - [ - [ - -119.21676672304201, - 40.787151394980775 - ], - [ - -119.21766954360965, - 40.787161860773196 - ], - [ - -119.21767084923582, - 40.78708562592472 - ], - [ - -119.21767215485924, - 40.78700939197582 - ], - [ - -119.21676925186783, - 40.78700949460194 - ], - [ - -119.2167679868638, - 40.78708044479188 - ], - [ - -119.21676672304201, - 40.787151394980775 - ] - ] - ] - }, - "properties": { - "FID": 8, - "ref": "toilet" - } - }, - { - "type": "Feature", - "id": 9, - "geometry": { - "type": "Polygon", - "coordinates": [ - [ - [ - -119.22254782594494, - 40.787008715718244 - ], - [ - -119.22254677471386, - 40.78708063947169 - ], - [ - -119.22254572229546, - 40.787152562323826 - ], - [ - -119.2234485653877, - 40.78715990109053 - ], - [ - -119.2234496406282, - 40.78708423448604 - ], - [ - -119.22345071586633, - 40.78700856788055 - ], - [ - -119.22254782594494, - 40.787008715718244 - ] - ] - ] - }, - "properties": { - "FID": 9, - "ref": "toilet" - } - }, - { - "type": "Feature", - "id": 10, - "geometry": { - "type": "Polygon", - "coordinates": [ - [ - [ - -119.2218829922685, - 40.78354908316953 - ], - [ - -119.22185754365873, - 40.78347354309549 - ], - [ - -119.22182745541112, - 40.7833847398726 - ], - [ - -119.2209556458216, - 40.78356244113754 - ], - [ - -119.22098414671561, - 40.78364734167054 - ], - [ - -119.22100824744685, - 40.783718928552894 - ], - [ - -119.2218829922685, - 40.78354908316953 - ] - ] - ] - }, - "properties": { - "FID": 10, - "ref": "toilet" - } - }, - { - "type": "Feature", - "id": 11, - "geometry": { - "type": "Polygon", - "coordinates": [ - [ - [ - -119.21640231451448, - 40.78465156267149 - ], - [ - -119.21727716792408, - 40.78448421172071 - ], - [ - -119.21725235009494, - 40.78441034116092 - ], - [ - -119.21722363396417, - 40.78432305678725 - ], - [ - -119.21635114582351, - 40.78450085750285 - ], - [ - -119.21637875565848, - 40.78458289718729 - ], - [ - -119.21640231451448, - 40.78465156267149 - ] - ] - ] - }, - "properties": { - "FID": 11, - "ref": "toilet" - } - }, - { - "type": "Feature", - "id": 12, - "geometry": { - "type": "Polygon", - "coordinates": [ - [ - [ - -119.2151975382086, - 40.782309077116544 - ], - [ - -119.21598623671463, - 40.781975048924906 - ], - [ - -119.21593722331049, - 40.78190853113694 - ], - [ - -119.21588821000412, - 40.78184201332739 - ], - [ - -119.2151063894347, - 40.78218522529658 - ], - [ - -119.21515196318701, - 40.78224715166624 - ], - [ - -119.2151975382086, - 40.782309077116544 - ] - ] - ] - }, - "properties": { - "FID": 12, - "ref": "toilet" - } - }, - { - "type": "Feature", - "id": 13, - "geometry": { - "type": "Polygon", - "coordinates": [ - [ - [ - -119.2193295832776, - 40.78050183376417 - ], - [ - -119.2201166729552, - 40.780165692590515 - ], - [ - -119.22006637451267, - 40.78009773217038 - ], - [ - -119.2200160773574, - 40.78002977172738 - ], - [ - -119.21923430995108, - 40.78037300725894 - ], - [ - -119.21928194716081, - 40.780437420971985 - ], - [ - -119.2193295832776, - 40.78050183376417 - ] - ] - ] - }, - "properties": { - "FID": 13, - "ref": "toilet" - } - }, - { - "type": "Feature", - "id": 14, - "geometry": { - "type": "Polygon", - "coordinates": [ - [ - [ - -119.21708944144868, - 40.7769978974874 - ], - [ - -119.21772788050963, - 40.77651241738916 - ], - [ - -119.21765680730987, - 40.77645943601728 - ], - [ - -119.21758573422323, - 40.77640645550172 - ], - [ - -119.2169547608597, - 40.77689684039848 - ], - [ - -119.21702210051073, - 40.77694736851259 - ], - [ - -119.21708944144868, - 40.7769978974874 - ] - ] - ] - }, - "properties": { - "FID": 14, - "ref": "toilet" - } - }, - { - "type": "Feature", - "id": 15, - "geometry": { - "type": "Polygon", - "coordinates": [ - [ - [ - -119.2132216108523, - 40.78007471931362 - ], - [ - -119.21315778175973, - 40.78012324892972 - ], - [ - -119.21309395849744, - 40.78017177400672 - ], - [ - -119.21314135245652, - 40.7802083071664 - ], - [ - -119.2131572523761, - 40.78022072593136 - ], - [ - -119.21322021938654, - 40.78026990929782 - ], - [ - -119.21328319596883, - 40.780319098932864 - ], - [ - -119.21329798807355, - 40.7803306523011 - ], - [ - -119.21329901063201, - 40.780331469053095 - ], - [ - -119.21334482571022, - 40.78036927298379 - ], - [ - -119.21340600774849, - 40.7804197559392 - ], - [ - -119.21346718987927, - 40.78047023796111 - ], - [ - -119.2135283744727, - 40.780520723552286 - ], - [ - -119.2135331199942, - 40.780524638921705 - ], - [ - -119.21353410938843, - 40.780525478188984 - ], - [ - -119.21358788169937, - 40.78057235839886 - ], - [ - -119.21364722316586, - 40.78062409409382 - ], - [ - -119.2137065659092, - 40.78067582975771 - ], - [ - -119.21372571699102, - 40.780663290175404 - ], - [ - -119.21377413012641, - 40.7806315926332 - ], - [ - -119.2138233760243, - 40.780599350144584 - ], - [ - -119.2138425294316, - 40.78058680964197 - ], - [ - -119.21378238801414, - 40.78053425547957 - ], - [ - -119.21372224669156, - 40.780481702185966 - ], - [ - -119.21368215410898, - 40.78044666723947 - ], - [ - -119.21366150129336, - 40.780429545169326 - ], - [ - -119.21359957253237, - 40.78037820234927 - ], - [ - -119.21353764623656, - 40.7803268612965 - ], - [ - -119.21347571648133, - 40.78027551660797 - ], - [ - -119.21345507799042, - 40.78025840620683 - ], - [ - -119.21341261995272, - 40.780225000520936 - ], - [ - -119.21334895134179, - 40.78017490772123 - ], - [ - -119.21328528875092, - 40.78012481938843 - ], - [ - -119.2132216108523, - 40.78007471931362 - ] - ] - ] - }, - "properties": { - "FID": 15, - "ref": "toilet" - } - }, - { - "type": "Feature", - "id": 16, - "geometry": { - "type": "Polygon", - "coordinates": [ - [ - [ - -119.21300041996254, - 40.78123025232274 - ], - [ - -119.2131383345187, - 40.78114131034533 - ], - [ - -119.21307862437591, - 40.78108848290931 - ], - [ - -119.21301898779195, - 40.781035718477426 - ], - [ - -119.21288232231299, - 40.78112670095125 - ], - [ - -119.21294137109192, - 40.78117847665234 - ], - [ - -119.21300041996254, - 40.78123025232274 - ] - ] - ] - }, - "properties": { - "FID": 16, - "ref": "toilet" - } - }, - { - "type": "Feature", - "id": 17, - "geometry": { - "type": "Polygon", - "coordinates": [ - [ - [ - -119.21176305362536, - 40.78027593476868 - ], - [ - -119.21183157681881, - 40.78032047148881 - ], - [ - -119.21189748418074, - 40.780365206473924 - ], - [ - -119.21189880884677, - 40.78036611597847 - ], - [ - -119.21194969864037, - 40.78032317428929 - ], - [ - -119.21195916865051, - 40.7803151827266 - ], - [ - -119.21197565409197, - 40.78030127201963 - ], - [ - -119.21197645135408, - 40.780300599225924 - ], - [ - -119.2120195686397, - 40.78026421521763 - ], - [ - -119.21195260558652, - 40.78021869956332 - ], - [ - -119.21195126433693, - 40.78021779726521 - ], - [ - -119.21188275760795, - 40.780171994387324 - ], - [ - -119.21188245902674, - 40.78017179717863 - ], - [ - -119.21188236544067, - 40.78017187913848 - ], - [ - -119.21182314197179, - 40.78022353004417 - ], - [ - -119.21176305362536, - 40.78027593476868 - ] - ] - ] - }, - "properties": { - "FID": 17, - "ref": "toilet" - } - }, - { - "type": "Feature", - "id": 18, - "geometry": { - "type": "Polygon", - "coordinates": [ - [ - [ - -119.21020536873128, - 40.778514851606324 - ], - [ - -119.21028680404447, - 40.77854952082683 - ], - [ - -119.21036803451047, - 40.77858446468027 - ], - [ - -119.21081933655222, - 40.777990154493125 - ], - [ - -119.2107320334661, - 40.777952632017175 - ], - [ - -119.21064460136105, - 40.777915279693495 - ], - [ - -119.21020536873128, - 40.778514851606324 - ] - ] - ] - }, - "properties": { - "FID": 18, - "ref": "toilet" - } - }, - { - "type": "Feature", - "id": 19, - "geometry": { - "type": "Polygon", - "coordinates": [ - [ - [ - -119.21275135554313, - 40.775445784485875 - ], - [ - -119.21320225029969, - 40.774851947402766 - ], - [ - -119.21311305202414, - 40.77481344431436 - ], - [ - -119.21302385740572, - 40.77477494205707 - ], - [ - -119.21258213146425, - 40.77537303666288 - ], - [ - -119.21266679971923, - 40.77540933134951 - ], - [ - -119.21275135554313, - 40.775445784485875 - ] - ] - ] - }, - "properties": { - "FID": 19, - "ref": "toilet" - } - }, - { - "type": "Feature", - "id": 20, - "geometry": { - "type": "Polygon", - "coordinates": [ - [ - [ - -119.20834962042393, - 40.77409780628778 - ], - [ - -119.20844361982616, - 40.77411660979402 - ], - [ - -119.20855523756354, - 40.77413845923842 - ], - [ - -119.20878883905819, - 40.77347554973287 - ], - [ - -119.20867197791121, - 40.77345280553384 - ], - [ - -119.20857275862824, - 40.77343303337966 - ], - [ - -119.20834962042393, - 40.77409780628778 - ] - ] - ] - }, - "properties": { - "FID": 20, - "ref": "toilet" - } - }, - { - "type": "Feature", - "id": 21, - "geometry": { - "type": "Polygon", - "coordinates": [ - [ - [ - -119.207123361391, - 40.77760015740201 - ], - [ - -119.2072139959848, - 40.77761712388506 - ], - [ - -119.20732163381176, - 40.77763891877992 - ], - [ - -119.20734529986585, - 40.77757176663249 - ], - [ - -119.2073686614448, - 40.777505479053076 - ], - [ - -119.20739202416196, - 40.77743919056755 - ], - [ - -119.207415385648, - 40.777372902977135 - ], - [ - -119.20743874708769, - 40.777306616281834 - ], - [ - -119.20746210848085, - 40.77724032868044 - ], - [ - -119.20748546982762, - 40.77717404107356 - ], - [ - -119.20750883112792, - 40.777107753461195 - ], - [ - -119.2075321923818, - 40.77704146584335 - ], - [ - -119.2075552799642, - 40.77697595543618 - ], - [ - -119.20744068536774, - 40.776953483715346 - ], - [ - -119.20734351673474, - 40.776934603841056 - ], - [ - -119.2073435025205, - 40.776934647069716 - ], - [ - -119.2073346967702, - 40.77696126871736 - ], - [ - -119.2073216681793, - 40.77700065452499 - ], - [ - -119.20729965374674, - 40.777067208637646 - ], - [ - -119.20727763808553, - 40.77713376274538 - ], - [ - -119.2072556235651, - 40.77720031594753 - ], - [ - -119.20723360900074, - 40.77726687004529 - ], - [ - -119.2072203990563, - 40.7773068025016 - ], - [ - -119.20721159320773, - 40.77733342413815 - ], - [ - -119.2072027873521, - 40.77736004577387 - ], - [ - -119.20718957855549, - 40.77739997822595 - ], - [ - -119.20716756267458, - 40.77746653230884 - ], - [ - -119.20714554793443, - 40.77753308548616 - ], - [ - -119.20713216731, - 40.77757353487286 - ], - [ - -119.207123361391, - 40.77760015740201 - ] - ] - ] - }, - "properties": { - "FID": 21, - "ref": "toilet" - } - }, - { - "type": "Feature", - "id": 22, - "geometry": { - "type": "Polygon", - "coordinates": [ - [ - [ - -119.2040216470444, - 40.77292931041174 - ], - [ - -119.20402164789714, - 40.77224281637116 - ], - [ - -119.20392211662923, - 40.772243598868975 - ], - [ - -119.20382258535919, - 40.772244328146165 - ], - [ - -119.2038324243343, - 40.772930248534806 - ], - [ - -119.20392703568997, - 40.77292978401501 - ], - [ - -119.2040216470444, - 40.77292931041174 - ] - ] - ] - }, - "properties": { - "FID": 22, - "ref": "toilet" - } - }, - { - "type": "Feature", - "id": 23, - "geometry": { - "type": "Polygon", - "coordinates": [ - [ - [ - -119.20402164158783, - 40.77732138544076 - ], - [ - -119.20402164244045, - 40.77663516480276 - ], - [ - -119.20392135707702, - 40.77663584553226 - ], - [ - -119.20382107171072, - 40.77663672340352 - ], - [ - -119.20383497840776, - 40.77732259824864 - ], - [ - -119.20392830703825, - 40.77732147719606 - ], - [ - -119.20402164158783, - 40.77732138544076 - ] - ] - ] - }, - "properties": { - "FID": 23, - "ref": "toilet" - } - }, - { - "type": "Feature", - "id": 24, - "geometry": { - "type": "Polygon", - "coordinates": [ - [ - [ - -119.20076124764562, - 40.77765965755061 - ], - [ - -119.20052782299456, - 40.77699732167107 - ], - [ - -119.2004137790404, - 40.777021352990054 - ], - [ - -119.20031720832984, - 40.777041930112965 - ], - [ - -119.2005642411247, - 40.777702009956734 - ], - [ - -119.20065412494814, - 40.777682893184384 - ], - [ - -119.20076124764562, - 40.77765965755061 - ] - ] - ] - }, - "properties": { - "FID": 24, - "ref": "toilet" - } - }, - { - "type": "Feature", - "id": 25, - "geometry": { - "type": "Polygon", - "coordinates": [ - [ - [ - -119.1995278514809, - 40.77415976855591 - ], - [ - -119.19929425116318, - 40.7734968578974 - ], - [ - -119.19917808390781, - 40.77352157146861 - ], - [ - -119.1990791770348, - 40.773542228521364 - ], - [ - -119.19932303816117, - 40.7742027021409 - ], - [ - -119.19941681395557, - 40.77418326317026 - ], - [ - -119.1995278514809, - 40.77415976855591 - ] - ] - ] - }, - "properties": { - "FID": 25, - "ref": "toilet" - } - }, - { - "type": "Feature", - "id": 26, - "geometry": { - "type": "Polygon", - "coordinates": [ - [ - [ - -119.19532728004116, - 40.77549429657251 - ], - [ - -119.19487602486184, - 40.77489998254467 - ], - [ - -119.19477189259176, - 40.774946269847455 - ], - [ - -119.19468338803483, - 40.774985685938326 - ], - [ - -119.1951437681951, - 40.77557568399637 - ], - [ - -119.19522773449108, - 40.77553845924082 - ], - [ - -119.19532728004116, - 40.77549429657251 - ] - ] - ] - }, - "properties": { - "FID": 26, - "ref": "toilet" - } - }, - { - "type": "Feature", - "id": 27, - "geometry": { - "type": "Polygon", - "coordinates": [ - [ - [ - -119.19771020694508, - 40.77863246607556 - ], - [ - -119.19725882400937, - 40.77803804910777 - ], - [ - -119.19715688265121, - 40.77808374788119 - ], - [ - -119.1970706050369, - 40.778122621959916 - ], - [ - -119.19753393776243, - 40.77871161879406 - ], - [ - -119.1976142528664, - 40.77867547101938 - ], - [ - -119.19771020694508, - 40.77863246607556 - ] - ] - ] - }, - "properties": { - "FID": 27, - "ref": "toilet" - } - }, - { - "type": "Feature", - "id": 28, - "geometry": { - "type": "Polygon", - "coordinates": [ - [ - [ - -119.19086315485652, - 40.77717787530686 - ], - [ - -119.19092964331372, - 40.777126699763315 - ], - [ - -119.19099613285378, - 40.777075523280516 - ], - [ - -119.19035769394851, - 40.77659004250601 - ], - [ - -119.19028797671389, - 40.77664405509332 - ], - [ - -119.19021826055098, - 40.776698067638094 - ], - [ - -119.19086315485652, - 40.77717787530686 - ] - ] - ] - }, - "properties": { - "FID": 28, - "ref": "toilet" - } - }, - { - "type": "Feature", - "id": 29, - "geometry": { - "type": "Polygon", - "coordinates": [ - [ - [ - -119.19423774539449, - 40.77954034227019 - ], - [ - -119.19417343010704, - 40.77959006273348 - ], - [ - -119.1941095447375, - 40.779640108310126 - ], - [ - -119.19404610113503, - 40.77969046819472 - ], - [ - -119.19398309456017, - 40.77974114599001 - ], - [ - -119.19392052856739, - 40.77979214079633 - ], - [ - -119.19385840789568, - 40.77984345351549 - ], - [ - -119.19379673965548, - 40.779895072441136 - ], - [ - -119.19373546816874, - 40.779946965147815 - ], - [ - -119.19367474980655, - 40.77999923611851 - ], - [ - -119.19361443412241, - 40.78005177817046 - ], - [ - -119.19375120094296, - 40.780142343761256 - ], - [ - -119.19381095489082, - 40.780090691369644 - ], - [ - -119.19387070756136, - 40.780039038946555 - ], - [ - -119.19393046369373, - 40.779987385591774 - ], - [ - -119.19399184622608, - 40.779936853580395 - ], - [ - -119.19405336845158, - 40.77988641610985 - ], - [ - -119.19411489176878, - 40.77983597860616 - ], - [ - -119.1941764173628, - 40.779785538367655 - ], - [ - -119.19423955513058, - 40.77973627350137 - ], - [ - -119.19430280415997, - 40.77968708515957 - ], - [ - -119.19436605309605, - 40.77963789678266 - ], - [ - -119.19423774539449, - 40.77954034227019 - ] - ] - ] - }, - "properties": { - "FID": 29, - "ref": "toilet" - } - }, - { - "type": "Feature", - "id": 30, - "geometry": { - "type": "Polygon", - "coordinates": [ - [ - [ - -119.19299002376005, - 40.78230899670278 - ], - [ - -119.19303580849362, - 40.782247167643966 - ], - [ - -119.19308159432708, - 40.782185338566414 - ], - [ - -119.19229964710226, - 40.78184207150602 - ], - [ - -119.19225048924183, - 40.78190852805178 - ], - [ - -119.19220133246836, - 40.781974983675376 - ], - [ - -119.19299002376005, - 40.78230899670278 - ] - ] - ] - }, - "properties": { - "FID": 30, - "ref": "toilet" - } - }, - { - "type": "Feature", - "id": 31, - "geometry": { - "type": "Polygon", - "coordinates": [ - [ - [ - -119.18885733838226, - 40.78050148682467 - ], - [ - -119.18890545074669, - 40.780437279438374 - ], - [ - -119.18895382482424, - 40.78037318553977 - ], - [ - -119.1881720302765, - 40.78002993905606 - ], - [ - -119.18812129123252, - 40.78009770850407 - ], - [ - -119.18807055090043, - 40.78016547882942 - ], - [ - -119.18885733838226, - 40.78050148682467 - ] - ] - ] - }, - "properties": { - "FID": 31, - "ref": "toilet" - } - }, - { - "type": "Feature", - "id": 32, - "geometry": { - "type": "Polygon", - "coordinates": [ - [ - [ - -119.20807701015322, - 40.799556578877315 - ], - [ - -119.20805761240287, - 40.79950369521236 - ], - [ - -119.2077096584774, - 40.799577398672284 - ], - [ - -119.20772905595561, - 40.79963028239871 - ], - [ - -119.20807701015322, - 40.799556578877315 - ] - ] - ] - }, - "properties": { - "FID": 32, - "ref": "toilet" - } - }, - { - "type": "Feature", - "id": 33, - "geometry": { - "type": "Polygon", - "coordinates": [ - [ - [ - -119.20647352034797, - 40.79514409401405 - ], - [ - -119.2061255860784, - 40.79521778906046 - ], - [ - -119.20614498001456, - 40.79527067330854 - ], - [ - -119.20649291458307, - 40.79519697819492 - ], - [ - -119.20647352034797, - 40.79514409401405 - ] - ] - ] - }, - "properties": { - "FID": 33, - "ref": "toilet" - } - }, - { - "type": "Feature", - "id": 34, - "geometry": { - "type": "Polygon", - "coordinates": [ - [ - [ - -119.20759256623303, - 40.78969202603579 - ], - [ - -119.20733719487723, - 40.789886134459444 - ], - [ - -119.20738827362703, - 40.789924952807304 - ], - [ - -119.20764364498281, - 40.78973084427192 - ], - [ - -119.20759256623303, - 40.78969202603579 - ] - ] - ] - }, - "properties": { - "FID": 34, - "ref": "toilet" - } - }, - { - "type": "Feature", - "id": 35, - "geometry": { - "type": "Polygon", - "coordinates": [ - [ - [ - -119.20228810888008, - 40.78698272541642 - ], - [ - -119.2022881103759, - 40.78692782562718 - ], - [ - -119.2019269605131, - 40.78692781937738 - ], - [ - -119.20192695871988, - 40.78698271916661 - ], - [ - -119.20228810888008, - 40.78698272541642 - ] - ] - ] - }, - "properties": { - "FID": 35, - "ref": "toilet" - } - }, - { - "type": "Feature", - "id": 36, - "geometry": { - "type": "Polygon", - "coordinates": [ - [ - [ - -119.20044219316563, - 40.78425724047879 - ], - [ - -119.20018682180992, - 40.78445133326208 - ], - [ - -119.20023789223208, - 40.784490154811365 - ], - [ - -119.20049326358783, - 40.784296061916386 - ], - [ - -119.20044219316563, - 40.78425724047879 - ] - ] - ] - }, - "properties": { - "FID": 36, - "ref": "toilet" - } - }, - { - "type": "Feature", - "id": 37, - "geometry": { - "type": "Polygon", - "coordinates": [ - [ - [ - -119.18740374995261, - 40.784028722138835 - ], - [ - -119.18733417812913, - 40.784013973886296 - ], - [ - -119.18723716269027, - 40.78427838251221 - ], - [ - -119.18730673476344, - 40.784293130835266 - ], - [ - -119.18740374995261, - 40.784028722138835 - ] - ] - ] - }, - "properties": { - "FID": 37, - "ref": "toilet" - } - }, - { - "type": "Feature", - "id": 38, - "geometry": { - "type": "Polygon", - "coordinates": [ - [ - [ - -119.1932088670016, - 40.78507884824537 - ], - [ - -119.1931392925312, - 40.78506410422078 - ], - [ - -119.19304230344187, - 40.785328518711125 - ], - [ - -119.19311187816962, - 40.78534326278575 - ], - [ - -119.1932088670016, - 40.78507884824537 - ] - ] - ] - }, - "properties": { - "FID": 38, - "ref": "toilet" - } - }, - { - "type": "Feature", - "id": 39, - "geometry": { - "type": "Polygon", - "coordinates": [ - [ - [ - -119.19538823841754, - 40.79139782940088 - ], - [ - -119.19502706434051, - 40.79139780155435 - ], - [ - -119.19502705686388, - 40.79145270130027 - ], - [ - -119.19538823123841, - 40.79145272914685 - ], - [ - -119.19538823841754, - 40.79139782940088 - ] - ] - ] - }, - "properties": { - "FID": 39, - "ref": "toilet" - } - }, - { - "type": "Feature", - "id": 40, - "geometry": { - "type": "Polygon", - "coordinates": [ - [ - [ - -119.1977993927962, - 40.80150107981738 - ], - [ - -119.1976283678516, - 40.80145695305287 - ], - [ - -119.19760514015168, - 40.80150893787917 - ], - [ - -119.1977761652143, - 40.801553064677705 - ], - [ - -119.1977993927962, - 40.80150107981738 - ] - ] - ] - }, - "properties": { - "FID": 40, - "ref": "toilet" - } - }, - { - "type": "Feature", - "id": 41, - "geometry": { - "type": "Polygon", - "coordinates": [ - [ - [ - -119.19988262699445, - 40.80388068539161 - ], - [ - -119.19970547847284, - 40.80385390280192 - ], - [ - -119.1996913799548, - 40.80390774700976 - ], - [ - -119.19986852861389, - 40.80393452962084 - ], - [ - -119.19988262699445, - 40.80388068539161 - ] - ] - ] - }, - "properties": { - "FID": 41, - "ref": "toilet" - } - }, - { - "type": "Feature", - "id": 42, - "geometry": { - "type": "Polygon", - "coordinates": [ - [ - [ - -119.20298750014379, - 40.80223839013915 - ], - [ - -119.20280727061372, - 40.80222941172552 - ], - [ - -119.2028025443886, - 40.80228419377095 - ], - [ - -119.20298277406624, - 40.802293172191874 - ], - [ - -119.20298750014379, - 40.80223839013915 - ] - ] - ] - }, - "properties": { - "FID": 42, - "ref": "toilet" - } - }, - { - "type": "Feature", - "id": 43, - "geometry": { - "type": "Polygon", - "coordinates": [ - [ - [ - -119.1925071048293, - 40.80145374515956 - ], - [ - -119.19235327782975, - 40.80138181993947 - ], - [ - -119.1923154175198, - 40.801428577299696 - ], - [ - -119.19246924458639, - 40.80150050256967 - ], - [ - -119.1925071048293, - 40.80145374515956 - ] - ] - ] - }, - "properties": { - "FID": 43, - "ref": "toilet" - } - }, - { - "type": "Feature", - "id": 44, - "geometry": { - "type": "Polygon", - "coordinates": [ - [ - [ - -119.18498512322356, - 40.79577252557828 - ], - [ - -119.1849235459306, - 40.795801231749074 - ], - [ - -119.18501797833379, - 40.79591822353866 - ], - [ - -119.18507955569419, - 40.79588951731807 - ], - [ - -119.18498512322356, - 40.79577252557828 - ] - ] - ] - }, - "properties": { - "FID": 44, - "ref": "toilet" - } - } - ] -} \ No newline at end of file +{"type":"FeatureCollection","features":[{"type":"Feature","id":0,"geometry":{"type":"Polygon","coordinates":[[[-119.21321,40.79906],[-119.21316,40.799],[-119.21312,40.79894],[-119.21307,40.79888],[-119.21303,40.79882],[-119.21298,40.79876],[-119.21294,40.7987],[-119.21289,40.79864],[-119.21284,40.79858],[-119.2128,40.79852],[-119.21275,40.79846],[-119.21267,40.7985],[-119.21258,40.79854],[-119.21258,40.79854],[-119.21263,40.7986],[-119.21267,40.79866],[-119.21272,40.79872],[-119.21276,40.79878],[-119.21281,40.79884],[-119.21285,40.7989],[-119.21289,40.79896],[-119.21294,40.79902],[-119.21298,40.79908],[-119.21303,40.79913],[-119.21309,40.79911],[-119.21312,40.7991],[-119.21321,40.79906]]]},"properties":{"FID":0,"ref":"toilet"}},{"type":"Feature","id":1,"geometry":{"type":"Polygon","coordinates":[[[-119.21047,40.79576],[-119.21049,40.79578],[-119.21051,40.79582],[-119.21056,40.79588],[-119.2106,40.79594],[-119.21063,40.79597],[-119.21065,40.79599],[-119.21073,40.79596],[-119.21082,40.79592],[-119.21078,40.79586],[-119.21073,40.7958],[-119.21069,40.79574],[-119.21064,40.79568],[-119.2106,40.79562],[-119.21055,40.79556],[-119.21051,40.7955],[-119.21046,40.79545],[-119.21042,40.79539],[-119.21037,40.79533],[-119.21033,40.79534],[-119.21029,40.79536],[-119.21021,40.7954],[-119.21023,40.79542],[-119.21025,40.79546],[-119.2103,40.79552],[-119.21034,40.79558],[-119.21038,40.79564],[-119.21043,40.7957],[-119.21045,40.79573],[-119.21047,40.79576]]]},"properties":{"FID":1,"ref":"toilet"}},{"type":"Feature","id":2,"geometry":{"type":"Polygon","coordinates":[[[-119.21385,40.79445],[-119.21379,40.7944],[-119.21379,40.7944],[-119.21372,40.79435],[-119.21366,40.7944],[-119.21359,40.79445],[-119.21353,40.79449],[-119.21352,40.7945],[-119.21351,40.7945],[-119.21346,40.79454],[-119.21339,40.79459],[-119.21333,40.79463],[-119.21326,40.79468],[-119.21325,40.79469],[-119.21325,40.79469],[-119.21319,40.79473],[-119.21321,40.79474],[-119.21325,40.79478],[-119.2133,40.79481],[-119.21331,40.79483],[-119.21333,40.79482],[-119.21334,40.79481],[-119.21336,40.7948],[-119.21337,40.79479],[-119.21338,40.79478],[-119.21339,40.79478],[-119.21341,40.79477],[-119.21342,40.79475],[-119.21344,40.79474],[-119.21345,40.79474],[-119.21346,40.79473],[-119.21347,40.79472],[-119.21349,40.79471],[-119.2135,40.7947],[-119.21352,40.79469],[-119.21352,40.79469],[-119.21354,40.79468],[-119.21355,40.79467],[-119.21357,40.79465],[-119.21359,40.79464],[-119.2136,40.79463],[-119.21361,40.79462],[-119.21363,40.79461],[-119.21365,40.79459],[-119.21366,40.79459],[-119.21368,40.79457],[-119.21369,40.79456],[-119.21371,40.79455],[-119.21372,40.79454],[-119.21373,40.79454],[-119.21374,40.79453],[-119.21376,40.79452],[-119.21377,40.79451],[-119.21378,40.7945],[-119.21379,40.79449],[-119.2138,40.79448],[-119.21382,40.79447],[-119.21383,40.79446],[-119.21385,40.79445]]]},"properties":{"FID":2,"ref":"toilet"}},{"type":"Feature","id":3,"geometry":{"type":"Polygon","coordinates":[[[-119.21721,40.79721],[-119.21724,40.79723],[-119.21727,40.79726],[-119.21731,40.79728],[-119.21734,40.79731],[-119.21737,40.79733],[-119.2174,40.79736],[-119.21746,40.7974],[-119.21753,40.79745],[-119.21756,40.79748],[-119.21759,40.7975],[-119.21766,40.79745],[-119.21773,40.7974],[-119.21767,40.79735],[-119.21761,40.7973],[-119.21754,40.79725],[-119.21748,40.7972],[-119.21741,40.79715],[-119.21735,40.79711],[-119.21729,40.79706],[-119.21722,40.79701],[-119.21716,40.79696],[-119.21709,40.79691],[-119.21703,40.79696],[-119.21696,40.79701],[-119.21699,40.79704],[-119.21702,40.79706],[-119.21709,40.79711],[-119.21715,40.79716],[-119.21718,40.79719],[-119.21721,40.79721]]]},"properties":{"FID":3,"ref":"toilet"}},{"type":"Feature","id":4,"geometry":{"type":"Polygon","coordinates":[[[-119.21917,40.79362],[-119.21912,40.79369],[-119.21907,40.79376],[-119.21909,40.79377],[-119.21914,40.79379],[-119.21922,40.79383],[-119.2193,40.79386],[-119.21938,40.7939],[-119.21946,40.79393],[-119.21953,40.79397],[-119.21961,40.794],[-119.21969,40.79404],[-119.21977,40.79407],[-119.21984,40.79411],[-119.21984,40.79411],[-119.21989,40.79404],[-119.21996,40.79396],[-119.21988,40.79393],[-119.21987,40.79392],[-119.21985,40.79392],[-119.2198,40.79389],[-119.2198,40.79389],[-119.21972,40.79386],[-119.21972,40.79386],[-119.21964,40.79382],[-119.21964,40.79382],[-119.21957,40.79379],[-119.21957,40.79379],[-119.21949,40.79376],[-119.21949,40.79376],[-119.21941,40.79372],[-119.21941,40.79372],[-119.21933,40.79369],[-119.21933,40.79369],[-119.21925,40.79365],[-119.21925,40.79365],[-119.21917,40.79362]]]},"properties":{"FID":4,"ref":"toilet"}},{"type":"Feature","id":5,"geometry":{"type":"Polygon","coordinates":[[[-119.21571,40.79229],[-119.21572,40.79229],[-119.21577,40.79223],[-119.21583,40.79215],[-119.21575,40.79212],[-119.21567,40.79208],[-119.21559,40.79205],[-119.21551,40.79201],[-119.21544,40.79198],[-119.21536,40.79195],[-119.21528,40.79191],[-119.2152,40.79188],[-119.21512,40.79184],[-119.21504,40.79181],[-119.21499,40.79188],[-119.21494,40.79194],[-119.21494,40.79194],[-119.21498,40.79196],[-119.21502,40.79198],[-119.2151,40.79201],[-119.21517,40.79205],[-119.21525,40.79208],[-119.21533,40.79212],[-119.21541,40.79215],[-119.21548,40.79219],[-119.21552,40.79221],[-119.21556,40.79222],[-119.21564,40.79226],[-119.21571,40.79229]]]},"properties":{"FID":5,"ref":"toilet"}},{"type":"Feature","id":6,"geometry":{"type":"Polygon","coordinates":[[[-119.21679,40.78975],[-119.21683,40.78976],[-119.21688,40.78977],[-119.21696,40.78979],[-119.21705,40.78981],[-119.2171,40.78982],[-119.21714,40.78983],[-119.21716,40.78975],[-119.2172,40.78967],[-119.21711,40.78965],[-119.21702,40.78963],[-119.21694,40.78961],[-119.21685,40.78959],[-119.21676,40.78958],[-119.21667,40.78956],[-119.21659,40.78954],[-119.2165,40.78952],[-119.21641,40.78951],[-119.21632,40.78949],[-119.21631,40.78954],[-119.21629,40.78957],[-119.21627,40.78964],[-119.21631,40.78965],[-119.21636,40.78966],[-119.21644,40.78968],[-119.21653,40.78969],[-119.21662,40.78971],[-119.2167,40.78973],[-119.21675,40.78974],[-119.21679,40.78975]]]},"properties":{"FID":6,"ref":"toilet"}},{"type":"Feature","id":7,"geometry":{"type":"Polygon","coordinates":[[[-119.22093,40.79043],[-119.2209,40.79051],[-119.22087,40.79058],[-119.22096,40.7906],[-119.22105,40.79062],[-119.22113,40.79064],[-119.22122,40.79066],[-119.22131,40.79067],[-119.22139,40.79069],[-119.22148,40.79071],[-119.22157,40.79073],[-119.22166,40.79075],[-119.22174,40.79077],[-119.22177,40.79069],[-119.2218,40.7906],[-119.22171,40.79059],[-119.22163,40.79057],[-119.22154,40.79055],[-119.22145,40.79053],[-119.22137,40.79051],[-119.22128,40.7905],[-119.22119,40.79048],[-119.2211,40.79046],[-119.22102,40.79044],[-119.22093,40.79043]]]},"properties":{"FID":7,"ref":"toilet"}},{"type":"Feature","id":8,"geometry":{"type":"Polygon","coordinates":[[[-119.21677,40.78715],[-119.21767,40.78716],[-119.21767,40.78709],[-119.21767,40.78701],[-119.21677,40.78701],[-119.21677,40.78708],[-119.21677,40.78715]]]},"properties":{"FID":8,"ref":"toilet"}},{"type":"Feature","id":9,"geometry":{"type":"Polygon","coordinates":[[[-119.22255,40.78701],[-119.22255,40.78708],[-119.22255,40.78715],[-119.22345,40.78716],[-119.22345,40.78708],[-119.22345,40.78701],[-119.22255,40.78701]]]},"properties":{"FID":9,"ref":"toilet"}},{"type":"Feature","id":10,"geometry":{"type":"Polygon","coordinates":[[[-119.22188,40.78355],[-119.22186,40.78347],[-119.22183,40.78338],[-119.22096,40.78356],[-119.22098,40.78365],[-119.22101,40.78372],[-119.22188,40.78355]]]},"properties":{"FID":10,"ref":"toilet"}},{"type":"Feature","id":11,"geometry":{"type":"Polygon","coordinates":[[[-119.2164,40.78465],[-119.21728,40.78448],[-119.21725,40.78441],[-119.21722,40.78432],[-119.21635,40.7845],[-119.21638,40.78458],[-119.2164,40.78465]]]},"properties":{"FID":11,"ref":"toilet"}},{"type":"Feature","id":12,"geometry":{"type":"Polygon","coordinates":[[[-119.2152,40.78231],[-119.21599,40.78198],[-119.21594,40.78191],[-119.21589,40.78184],[-119.21511,40.78219],[-119.21515,40.78225],[-119.2152,40.78231]]]},"properties":{"FID":12,"ref":"toilet"}},{"type":"Feature","id":13,"geometry":{"type":"Polygon","coordinates":[[[-119.21933,40.7805],[-119.22012,40.78017],[-119.22007,40.7801],[-119.22002,40.78003],[-119.21923,40.78037],[-119.21928,40.78044],[-119.21933,40.7805]]]},"properties":{"FID":13,"ref":"toilet"}},{"type":"Feature","id":14,"geometry":{"type":"Polygon","coordinates":[[[-119.21709,40.777],[-119.21773,40.77651],[-119.21766,40.77646],[-119.21759,40.77641],[-119.21695,40.7769],[-119.21702,40.77695],[-119.21709,40.777]]]},"properties":{"FID":14,"ref":"toilet"}},{"type":"Feature","id":15,"geometry":{"type":"Polygon","coordinates":[[[-119.21322,40.78007],[-119.21316,40.78012],[-119.21309,40.78017],[-119.21314,40.78021],[-119.21316,40.78022],[-119.21322,40.78027],[-119.21328,40.78032],[-119.2133,40.78033],[-119.2133,40.78033],[-119.21334,40.78037],[-119.21341,40.78042],[-119.21347,40.78047],[-119.21353,40.78052],[-119.21353,40.78052],[-119.21353,40.78053],[-119.21359,40.78057],[-119.21365,40.78062],[-119.21371,40.78068],[-119.21373,40.78066],[-119.21377,40.78063],[-119.21382,40.7806],[-119.21384,40.78059],[-119.21378,40.78053],[-119.21372,40.78048],[-119.21368,40.78045],[-119.21366,40.78043],[-119.2136,40.78038],[-119.21354,40.78033],[-119.21348,40.78028],[-119.21346,40.78026],[-119.21341,40.78023],[-119.21335,40.78017],[-119.21329,40.78012],[-119.21322,40.78007]]]},"properties":{"FID":15,"ref":"toilet"}},{"type":"Feature","id":16,"geometry":{"type":"Polygon","coordinates":[[[-119.213,40.78123],[-119.21314,40.78114],[-119.21308,40.78109],[-119.21302,40.78104],[-119.21288,40.78113],[-119.21294,40.78118],[-119.213,40.78123]]]},"properties":{"FID":16,"ref":"toilet"}},{"type":"Feature","id":17,"geometry":{"type":"Polygon","coordinates":[[[-119.21176,40.78028],[-119.21183,40.78032],[-119.2119,40.78037],[-119.2119,40.78037],[-119.21195,40.78032],[-119.21196,40.78032],[-119.21198,40.7803],[-119.21198,40.7803],[-119.21202,40.78026],[-119.21195,40.78022],[-119.21195,40.78022],[-119.21188,40.78017],[-119.21188,40.78017],[-119.21188,40.78017],[-119.21182,40.78022],[-119.21176,40.78028]]]},"properties":{"FID":17,"ref":"toilet"}},{"type":"Feature","id":18,"geometry":{"type":"Polygon","coordinates":[[[-119.21021,40.77851],[-119.21029,40.77855],[-119.21037,40.77858],[-119.21082,40.77799],[-119.21073,40.77795],[-119.21064,40.77792],[-119.21021,40.77851]]]},"properties":{"FID":18,"ref":"toilet"}},{"type":"Feature","id":19,"geometry":{"type":"Polygon","coordinates":[[[-119.21275,40.77545],[-119.2132,40.77485],[-119.21311,40.77481],[-119.21302,40.77477],[-119.21258,40.77537],[-119.21267,40.77541],[-119.21275,40.77545]]]},"properties":{"FID":19,"ref":"toilet"}},{"type":"Feature","id":20,"geometry":{"type":"Polygon","coordinates":[[[-119.20835,40.7741],[-119.20844,40.77412],[-119.20856,40.77414],[-119.20879,40.77348],[-119.20867,40.77345],[-119.20857,40.77343],[-119.20835,40.7741]]]},"properties":{"FID":20,"ref":"toilet"}},{"type":"Feature","id":21,"geometry":{"type":"Polygon","coordinates":[[[-119.20712,40.7776],[-119.20721,40.77762],[-119.20732,40.77764],[-119.20735,40.77757],[-119.20737,40.77751],[-119.20739,40.77744],[-119.20742,40.77737],[-119.20744,40.77731],[-119.20746,40.77724],[-119.20749,40.77717],[-119.20751,40.77711],[-119.20753,40.77704],[-119.20756,40.77698],[-119.20744,40.77695],[-119.20734,40.77693],[-119.20734,40.77693],[-119.20733,40.77696],[-119.20732,40.777],[-119.2073,40.77707],[-119.20728,40.77713],[-119.20726,40.7772],[-119.20723,40.77727],[-119.20722,40.77731],[-119.20721,40.77733],[-119.2072,40.77736],[-119.20719,40.7774],[-119.20717,40.77747],[-119.20715,40.77753],[-119.20713,40.77757],[-119.20712,40.7776]]]},"properties":{"FID":21,"ref":"toilet"}},{"type":"Feature","id":22,"geometry":{"type":"Polygon","coordinates":[[[-119.20402,40.77293],[-119.20402,40.77224],[-119.20392,40.77224],[-119.20382,40.77224],[-119.20383,40.77293],[-119.20393,40.77293],[-119.20402,40.77293]]]},"properties":{"FID":22,"ref":"toilet"}},{"type":"Feature","id":23,"geometry":{"type":"Polygon","coordinates":[[[-119.20402,40.77732],[-119.20402,40.77664],[-119.20392,40.77664],[-119.20382,40.77664],[-119.20383,40.77732],[-119.20393,40.77732],[-119.20402,40.77732]]]},"properties":{"FID":23,"ref":"toilet"}},{"type":"Feature","id":24,"geometry":{"type":"Polygon","coordinates":[[[-119.20076,40.77766],[-119.20053,40.777],[-119.20041,40.77702],[-119.20032,40.77704],[-119.20056,40.7777],[-119.20065,40.77768],[-119.20076,40.77766]]]},"properties":{"FID":24,"ref":"toilet"}},{"type":"Feature","id":25,"geometry":{"type":"Polygon","coordinates":[[[-119.19953,40.77416],[-119.19929,40.7735],[-119.19918,40.77352],[-119.19908,40.77354],[-119.19932,40.7742],[-119.19942,40.77418],[-119.19953,40.77416]]]},"properties":{"FID":25,"ref":"toilet"}},{"type":"Feature","id":26,"geometry":{"type":"Polygon","coordinates":[[[-119.19533,40.77549],[-119.19488,40.7749],[-119.19477,40.77495],[-119.19468,40.77499],[-119.19514,40.77558],[-119.19523,40.77554],[-119.19533,40.77549]]]},"properties":{"FID":26,"ref":"toilet"}},{"type":"Feature","id":27,"geometry":{"type":"Polygon","coordinates":[[[-119.19771,40.77863],[-119.19726,40.77804],[-119.19716,40.77808],[-119.19707,40.77812],[-119.19753,40.77871],[-119.19761,40.77868],[-119.19771,40.77863]]]},"properties":{"FID":27,"ref":"toilet"}},{"type":"Feature","id":28,"geometry":{"type":"Polygon","coordinates":[[[-119.19086,40.77718],[-119.19093,40.77713],[-119.191,40.77708],[-119.19036,40.77659],[-119.19029,40.77664],[-119.19022,40.7767],[-119.19086,40.77718]]]},"properties":{"FID":28,"ref":"toilet"}},{"type":"Feature","id":29,"geometry":{"type":"Polygon","coordinates":[[[-119.19424,40.77954],[-119.19417,40.77959],[-119.19411,40.77964],[-119.19405,40.77969],[-119.19398,40.77974],[-119.19392,40.77979],[-119.19386,40.77984],[-119.1938,40.7799],[-119.19374,40.77995],[-119.19367,40.78],[-119.19361,40.78005],[-119.19375,40.78014],[-119.19381,40.78009],[-119.19387,40.78004],[-119.19393,40.77999],[-119.19399,40.77994],[-119.19405,40.77989],[-119.19411,40.77984],[-119.19418,40.77979],[-119.19424,40.77974],[-119.1943,40.77969],[-119.19437,40.77964],[-119.19424,40.77954]]]},"properties":{"FID":29,"ref":"toilet"}},{"type":"Feature","id":30,"geometry":{"type":"Polygon","coordinates":[[[-119.19299,40.78231],[-119.19304,40.78225],[-119.19308,40.78219],[-119.1923,40.78184],[-119.19225,40.78191],[-119.1922,40.78197],[-119.19299,40.78231]]]},"properties":{"FID":30,"ref":"toilet"}},{"type":"Feature","id":31,"geometry":{"type":"Polygon","coordinates":[[[-119.18886,40.7805],[-119.18891,40.78044],[-119.18895,40.78037],[-119.18817,40.78003],[-119.18812,40.7801],[-119.18807,40.78017],[-119.18886,40.7805]]]},"properties":{"FID":31,"ref":"toilet"}},{"type":"Feature","id":32,"geometry":{"type":"Polygon","coordinates":[[[-119.20808,40.79956],[-119.20806,40.7995],[-119.20771,40.79958],[-119.20773,40.79963],[-119.20808,40.79956]]]},"properties":{"FID":32,"ref":"toilet"}},{"type":"Feature","id":33,"geometry":{"type":"Polygon","coordinates":[[[-119.20647,40.79514],[-119.20613,40.79522],[-119.20614,40.79527],[-119.20649,40.7952],[-119.20647,40.79514]]]},"properties":{"FID":33,"ref":"toilet"}},{"type":"Feature","id":34,"geometry":{"type":"Polygon","coordinates":[[[-119.20759,40.78969],[-119.20734,40.78989],[-119.20739,40.78992],[-119.20764,40.78973],[-119.20759,40.78969]]]},"properties":{"FID":34,"ref":"toilet"}},{"type":"Feature","id":35,"geometry":{"type":"Polygon","coordinates":[[[-119.20229,40.78698],[-119.20229,40.78693],[-119.20193,40.78693],[-119.20193,40.78698],[-119.20229,40.78698]]]},"properties":{"FID":35,"ref":"toilet"}},{"type":"Feature","id":36,"geometry":{"type":"Polygon","coordinates":[[[-119.20044,40.78426],[-119.20019,40.78445],[-119.20024,40.78449],[-119.20049,40.7843],[-119.20044,40.78426]]]},"properties":{"FID":36,"ref":"toilet"}},{"type":"Feature","id":37,"geometry":{"type":"Polygon","coordinates":[[[-119.1874,40.78403],[-119.18733,40.78401],[-119.18724,40.78428],[-119.18731,40.78429],[-119.1874,40.78403]]]},"properties":{"FID":37,"ref":"toilet"}},{"type":"Feature","id":38,"geometry":{"type":"Polygon","coordinates":[[[-119.19321,40.78508],[-119.19314,40.78506],[-119.19304,40.78533],[-119.19311,40.78534],[-119.19321,40.78508]]]},"properties":{"FID":38,"ref":"toilet"}},{"type":"Feature","id":39,"geometry":{"type":"Polygon","coordinates":[[[-119.19539,40.7914],[-119.19503,40.7914],[-119.19503,40.79145],[-119.19539,40.79145],[-119.19539,40.7914]]]},"properties":{"FID":39,"ref":"toilet"}},{"type":"Feature","id":40,"geometry":{"type":"Polygon","coordinates":[[[-119.1978,40.8015],[-119.19763,40.80146],[-119.19761,40.80151],[-119.19778,40.80155],[-119.1978,40.8015]]]},"properties":{"FID":40,"ref":"toilet"}},{"type":"Feature","id":41,"geometry":{"type":"Polygon","coordinates":[[[-119.19988,40.80388],[-119.19971,40.80385],[-119.19969,40.80391],[-119.19987,40.80393],[-119.19988,40.80388]]]},"properties":{"FID":41,"ref":"toilet"}},{"type":"Feature","id":42,"geometry":{"type":"Polygon","coordinates":[[[-119.20299,40.80224],[-119.20281,40.80223],[-119.2028,40.80228],[-119.20298,40.80229],[-119.20299,40.80224]]]},"properties":{"FID":42,"ref":"toilet"}},{"type":"Feature","id":43,"geometry":{"type":"Polygon","coordinates":[[[-119.19251,40.80145],[-119.19235,40.80138],[-119.19232,40.80143],[-119.19247,40.8015],[-119.19251,40.80145]]]},"properties":{"FID":43,"ref":"toilet"}},{"type":"Feature","id":44,"geometry":{"type":"Polygon","coordinates":[[[-119.18499,40.79577],[-119.18492,40.7958],[-119.18502,40.79592],[-119.18508,40.79589],[-119.18499,40.79577]]]},"properties":{"FID":44,"ref":"toilet"}}]} \ No newline at end of file diff --git a/Meshtastic/Resources/Trash_Fence.geojson b/Meshtastic/Resources/Trash_Fence.geojson index 10c08f06..9889b05b 100644 --- a/Meshtastic/Resources/Trash_Fence.geojson +++ b/Meshtastic/Resources/Trash_Fence.geojson @@ -1,44 +1 @@ -{ - "type": "FeatureCollection", - "features": [ - { - "type": "Feature", - "id": 0, - "geometry": { - "type": "Polygon", - "coordinates": [ - [ - [ - -119.18279831290056, - 40.80313545483217 - ], - [ - -119.21776730133423, - 40.80734514946494 - ], - [ - -119.23383070469475, - 40.783371453674185 - ], - [ - -119.20880237381652, - 40.76435187944433 - ], - [ - -119.17727060534106, - 40.776562577639574 - ], - [ - -119.18279831290056, - 40.80313545483217 - ] - ] - ] - }, - "properties": { - "FID": 0, - "Id": 0 - } - } - ] -} \ No newline at end of file +{"type":"FeatureCollection","features":[{"type":"Feature","id":0,"geometry":{"type":"Polygon","coordinates":[[[-119.1828,40.80314],[-119.21777,40.80735],[-119.23383,40.78337],[-119.2088,40.76435],[-119.17727,40.77656],[-119.1828,40.80314]]]},"properties":{"FID":0,"Id":0}}]} \ No newline at end of file From e03093f5e953153342d5367946fdf9e8169b10a0 Mon Sep 17 00:00:00 2001 From: Jacob Powers Date: Wed, 16 Jul 2025 03:36:42 +0000 Subject: [PATCH 03/19] better map colors - wip --- .../Helpers/Map/MapContent/MeshMapContent.swift | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/Meshtastic/Views/Nodes/Helpers/Map/MapContent/MeshMapContent.swift b/Meshtastic/Views/Nodes/Helpers/Map/MapContent/MeshMapContent.swift index 34f03f15..be33b54a 100644 --- a/Meshtastic/Views/Nodes/Helpers/Map/MapContent/MeshMapContent.swift +++ b/Meshtastic/Views/Nodes/Helpers/Map/MapContent/MeshMapContent.swift @@ -241,11 +241,11 @@ struct MeshMapContent: MapContent { let overlay = identifiable.overlay if let polygon = overlay as? MKPolygon { MapPolygon(polygon) - .stroke(.yellow.opacity(0.8), lineWidth: 0.5) + .stroke(.green.opacity(0.8), lineWidth: 0.5) .foregroundStyle(.clear) } else if let polyline = overlay as? MKPolyline { MapPolyline(polyline) - .stroke(.yellow.opacity(0.9), lineWidth: 0.8) + .stroke(.green.opacity(0.9), lineWidth: 0.8) } } } @@ -257,8 +257,8 @@ struct MeshMapContent: MapContent { let overlay = identifiable.overlay if let polygon = overlay as? MKPolygon { MapPolygon(polygon) - .stroke(.brown, lineWidth: 1) - .foregroundStyle(.brown.opacity(0.3)) + .stroke(.blue, lineWidth: 2) + .foregroundStyle(.blue.opacity(1.0)) } } } @@ -270,11 +270,11 @@ struct MeshMapContent: MapContent { let overlay = identifiable.overlay if let polyline = overlay as? MKPolyline { MapPolyline(polyline) - .stroke(.red, lineWidth: 3) + .stroke(.red, lineWidth: 2) } else if let polygon = overlay as? MKPolygon { MapPolygon(polygon) - .stroke(.red, lineWidth: 3) - .foregroundStyle(.red.opacity(0.2)) + .stroke(.red, lineWidth: 2) + .foregroundStyle(.clear) } } } From 220a06211454e7af658eb60fb3d2c7f0cee92f98 Mon Sep 17 00:00:00 2001 From: Jacob Powers Date: Thu, 17 Jul 2025 21:37:49 +0000 Subject: [PATCH 04/19] fix labels, toggles, and localize --- Localizable.xcstrings | 105 ++++++++++++++++-- .../Map/MapContent/MeshMapContent.swift | 31 +++--- .../Nodes/Helpers/Map/MapSettingsForm.swift | 38 +------ 3 files changed, 117 insertions(+), 57 deletions(-) diff --git a/Localizable.xcstrings b/Localizable.xcstrings index efff5b5d..61679bf7 100644 --- a/Localizable.xcstrings +++ b/Localizable.xcstrings @@ -5814,8 +5814,103 @@ } } }, - "Burning Man Overlays" : { - + "Burning Man" : { + "localizations" : { + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "ברנינג מן" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "バーニングマン" + } + }, + "sr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Бернинг Мен" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "火人节" + } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "火人節" + } + } + } + }, + "Map Overlays" : { + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Karten-Overlays" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Superpositions de cartes" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "שכבות מפה" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Sovrapposizioni mappa" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "マップオーバーレイ" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Nakładki map" + } + }, + "se" : { + "stringUnit" : { + "state" : "translated", + "value" : "Kartöverlägg" + } + }, + "sr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Преклапања мапе" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "地图覆盖层" + } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "地圖覆蓋層" + } + } + } }, "Button GPIO" : { "localizations" : { @@ -35140,9 +35235,6 @@ } } } - }, - "Street Outlines" : { - }, "Subscribed" : { "localizations" : { @@ -38365,9 +38457,6 @@ } } } - }, - "Trash Fence" : { - }, "Treat double tap on supported accelerometers as a user button press." : { "localizations" : { diff --git a/Meshtastic/Views/Nodes/Helpers/Map/MapContent/MeshMapContent.swift b/Meshtastic/Views/Nodes/Helpers/Map/MapContent/MeshMapContent.swift index be33b54a..a319085e 100644 --- a/Meshtastic/Views/Nodes/Helpers/Map/MapContent/MeshMapContent.swift +++ b/Meshtastic/Views/Nodes/Helpers/Map/MapContent/MeshMapContent.swift @@ -30,9 +30,7 @@ struct MeshMapContent: MapContent { @Binding var selectedWaypoint: WaypointEntity? // Burning Man GeoJSON overlays - @AppStorage("burningManShowStreets") private var showStreets = false - @AppStorage("burningManShowToilets") private var showToilets = false - @AppStorage("burningManShowTrashFence") private var showTrashFence = false + @AppStorage("burningManShowAll") private var showBurningMan = false @FetchRequest(fetchRequest: PositionEntity.allPositionsFetchRequest(), animation: .easeIn) var positions: FetchedResults @@ -234,10 +232,11 @@ struct MeshMapContent: MapContent { } /// Burning Man GeoJSON Overlays - if showStreets { - let overlays = GeoJSONOverlayManager.shared.loadOverlays(for: StaticGeoJSONOverlay.streetOutlines) - let identifiableOverlays = overlays.map { IdentifiableOverlay(overlay: $0) } - ForEach(identifiableOverlays) { identifiable in + if showBurningMan { + // Load and display street outlines + let streetOverlays = GeoJSONOverlayManager.shared.loadOverlays(for: .streetOutlines) + let streetIdentifiableOverlays = streetOverlays.map { IdentifiableOverlay(overlay: $0) } + ForEach(streetIdentifiableOverlays) { identifiable in let overlay = identifiable.overlay if let polygon = overlay as? MKPolygon { MapPolygon(polygon) @@ -248,12 +247,11 @@ struct MeshMapContent: MapContent { .stroke(.green.opacity(0.9), lineWidth: 0.8) } } - } - if showToilets { - let overlays = GeoJSONOverlayManager.shared.loadOverlays(for: StaticGeoJSONOverlay.toilets) - let identifiableOverlays = overlays.map { IdentifiableOverlay(overlay: $0) } - ForEach(identifiableOverlays) { identifiable in + // Load and display toilets + let toiletOverlays = GeoJSONOverlayManager.shared.loadOverlays(for: .toilets) + let toiletIdentifiableOverlays = toiletOverlays.map { IdentifiableOverlay(overlay: $0) } + ForEach(toiletIdentifiableOverlays) { identifiable in let overlay = identifiable.overlay if let polygon = overlay as? MKPolygon { MapPolygon(polygon) @@ -261,12 +259,11 @@ struct MeshMapContent: MapContent { .foregroundStyle(.blue.opacity(1.0)) } } - } - if showTrashFence { - let overlays = GeoJSONOverlayManager.shared.loadOverlays(for: StaticGeoJSONOverlay.trashFence) - let identifiableOverlays = overlays.map { IdentifiableOverlay(overlay: $0) } - ForEach(identifiableOverlays) { identifiable in + // Load and display trash fence + let trashFenceOverlays = GeoJSONOverlayManager.shared.loadOverlays(for: .trashFence) + let trashFenceIdentifiableOverlays = trashFenceOverlays.map { IdentifiableOverlay(overlay: $0) } + ForEach(trashFenceIdentifiableOverlays) { identifiable in let overlay = identifiable.overlay if let polyline = overlay as? MKPolyline { MapPolyline(polyline) diff --git a/Meshtastic/Views/Nodes/Helpers/Map/MapSettingsForm.swift b/Meshtastic/Views/Nodes/Helpers/Map/MapSettingsForm.swift index b24c4927..3079a9d9 100644 --- a/Meshtastic/Views/Nodes/Helpers/Map/MapSettingsForm.swift +++ b/Meshtastic/Views/Nodes/Helpers/Map/MapSettingsForm.swift @@ -116,42 +116,16 @@ struct MapSettingsForm: View { } } - Section(header: Text("Burning Man Overlays")) { + Section(header: Text("Map Overlays")) { Toggle(isOn: Binding( - get: { UserDefaults.standard.bool(forKey: "burningManShowStreets") }, - set: { UserDefaults.standard.set($0, forKey: "burningManShowStreets") } + get: { UserDefaults.standard.bool(forKey: "burningManShowAll") }, + set: { UserDefaults.standard.set($0, forKey: "burningManShowAll") } )) { Label { - Text("Street Outlines") + Text("Burning Man") } icon: { - Image(systemName: "road.lanes") - .foregroundColor(.yellow) - } - } - .tint(.accentColor) - - Toggle(isOn: Binding( - get: { UserDefaults.standard.bool(forKey: "burningManShowToilets") }, - set: { UserDefaults.standard.set($0, forKey: "burningManShowToilets") } - )) { - Label { - Text("Toilets") - } icon: { - Image(systemName: "toilet") - .foregroundColor(.brown) - } - } - .tint(.accentColor) - - Toggle(isOn: Binding( - get: { UserDefaults.standard.bool(forKey: "burningManShowTrashFence") }, - set: { UserDefaults.standard.set($0, forKey: "burningManShowTrashFence") } - )) { - Label { - Text("Trash Fence") - } icon: { - Image(systemName: "fence") - .foregroundColor(.red) + Image(systemName: "flame.fill") + .foregroundColor(.orange) } } .tint(.accentColor) From 6adefdb3aac408c84072144d915844d8b08ec963 Mon Sep 17 00:00:00 2001 From: Jacob Powers Date: Fri, 18 Jul 2025 01:28:21 +0000 Subject: [PATCH 05/19] updates --- Localizable.xcstrings | 131 ++++++++-------- Meshtastic.xcodeproj/project.pbxproj | 28 ++-- Meshtastic/Extensions/Color+Hex.swift | 30 ++++ Meshtastic/Extensions/Data+Gzip.swift | 63 ++++++++ Meshtastic/Helpers/GeoJSONOverlayConfig.swift | 123 +++++++++++++++ .../Helpers/GeoJSONOverlayManager.swift | 143 +++++++++++++----- .../BurningManGeoJSONMapConfig.json.gz | Bin 0 -> 33876 bytes .../BurningManGeoJSONMapConfig.json.zlib | Bin 0 -> 34272 bytes Meshtastic/Resources/Street_Outlines.geojson | 1 - Meshtastic/Resources/Toilets.geojson | 1 - Meshtastic/Resources/Trash_Fence.geojson | 1 - .../Map/MapContent/MeshMapContent.swift | 66 ++++---- 12 files changed, 433 insertions(+), 154 deletions(-) create mode 100644 Meshtastic/Extensions/Color+Hex.swift create mode 100644 Meshtastic/Extensions/Data+Gzip.swift create mode 100644 Meshtastic/Helpers/GeoJSONOverlayConfig.swift create mode 100644 Meshtastic/Resources/BurningManGeoJSONMapConfig.json.gz create mode 100644 Meshtastic/Resources/BurningManGeoJSONMapConfig.json.zlib delete mode 100644 Meshtastic/Resources/Street_Outlines.geojson delete mode 100644 Meshtastic/Resources/Toilets.geojson delete mode 100644 Meshtastic/Resources/Trash_Fence.geojson diff --git a/Localizable.xcstrings b/Localizable.xcstrings index 61679bf7..aa955d27 100644 --- a/Localizable.xcstrings +++ b/Localizable.xcstrings @@ -5848,70 +5848,6 @@ } } }, - "Map Overlays" : { - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Karten-Overlays" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Superpositions de cartes" - } - }, - "he" : { - "stringUnit" : { - "state" : "translated", - "value" : "שכבות מפה" - } - }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Sovrapposizioni mappa" - } - }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "マップオーバーレイ" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Nakładki map" - } - }, - "se" : { - "stringUnit" : { - "state" : "translated", - "value" : "Kartöverlägg" - } - }, - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Преклапања мапе" - } - }, - "zh-Hans" : { - "stringUnit" : { - "state" : "translated", - "value" : "地图覆盖层" - } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "地圖覆蓋層" - } - } - } - }, "Button GPIO" : { "localizations" : { "it" : { @@ -20566,6 +20502,70 @@ } } }, + "Map Overlays" : { + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Karten-Overlays" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Superpositions de cartes" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "שכבות מפה" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Sovrapposizioni mappa" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "マップオーバーレイ" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Nakładki map" + } + }, + "se" : { + "stringUnit" : { + "state" : "translated", + "value" : "Kartöverlägg" + } + }, + "sr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Преклапања мапе" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "地图覆盖层" + } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "地圖覆蓋層" + } + } + } + }, "Map Publish Interval" : { "localizations" : { "it" : { @@ -37980,9 +37980,6 @@ } } } - }, - "Toilets" : { - }, "Topic: %@" : { "localizations" : { diff --git a/Meshtastic.xcodeproj/project.pbxproj b/Meshtastic.xcodeproj/project.pbxproj index f5e5b07f..98753d57 100644 --- a/Meshtastic.xcodeproj/project.pbxproj +++ b/Meshtastic.xcodeproj/project.pbxproj @@ -57,9 +57,10 @@ 25F5D5C22C3F6E4B008036E3 /* AppState.swift in Sources */ = {isa = PBXBuildFile; fileRef = 25F5D5C12C3F6E4B008036E3 /* AppState.swift */; }; 25F5D5D12C4375DF008036E3 /* RouterTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 25F5D5D02C4375DF008036E3 /* RouterTests.swift */; }; 3D3417B42E2730EC006A988B /* GeoJSONOverlayManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3D3417B32E2730EC006A988B /* GeoJSONOverlayManager.swift */; }; - 3D3417BC2E273AC6006A988B /* Street_Outlines.geojson in Resources */ = {isa = PBXBuildFile; fileRef = 3D3417BB2E273AC6006A988B /* Street_Outlines.geojson */; }; - 3D3417C32E274800006A988B /* Toilets.geojson in Resources */ = {isa = PBXBuildFile; fileRef = 3D3417C12E274800006A988B /* Toilets.geojson */; }; - 3D3417C42E274800006A988B /* Trash_Fence.geojson in Resources */ = {isa = PBXBuildFile; fileRef = 3D3417C22E274800006A988B /* Trash_Fence.geojson */; }; + 3D3417C82E29D38A006A988B /* GeoJSONOverlayConfig.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3D3417C72E29D38A006A988B /* GeoJSONOverlayConfig.swift */; }; + 3D3417CB2E29D3B0006A988B /* Color+Hex.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3D3417C92E29D3B0006A988B /* Color+Hex.swift */; }; + 3D3417CC2E29D3B0006A988B /* Data+Gzip.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3D3417CA2E29D3B0006A988B /* Data+Gzip.swift */; }; + 3D3417CE2E29D5D6006A988B /* BurningManGeoJSONMapConfig.json.zlib in Resources */ = {isa = PBXBuildFile; fileRef = 3D3417CD2E29D5D6006A988B /* BurningManGeoJSONMapConfig.json.zlib */; }; 6D825E622C34786C008DBEE4 /* CommonRegex.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6D825E612C34786C008DBEE4 /* CommonRegex.swift */; }; 6DA39D8E2A92DC52007E311C /* MeshtasticAppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6DA39D8D2A92DC52007E311C /* MeshtasticAppDelegate.swift */; }; 6DEDA55A2A957B8E00321D2E /* DetectionSensorLog.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6DEDA5592A957B8E00321D2E /* DetectionSensorLog.swift */; }; @@ -331,9 +332,10 @@ 25F5D5C72C4375A8008036E3 /* MeshtasticTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = MeshtasticTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; 25F5D5D02C4375DF008036E3 /* RouterTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RouterTests.swift; sourceTree = ""; }; 3D3417B32E2730EC006A988B /* GeoJSONOverlayManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GeoJSONOverlayManager.swift; sourceTree = ""; }; - 3D3417BB2E273AC6006A988B /* Street_Outlines.geojson */ = {isa = PBXFileReference; lastKnownFileType = text; path = Street_Outlines.geojson; sourceTree = ""; }; - 3D3417C12E274800006A988B /* Toilets.geojson */ = {isa = PBXFileReference; lastKnownFileType = text; path = Toilets.geojson; sourceTree = ""; }; - 3D3417C22E274800006A988B /* Trash_Fence.geojson */ = {isa = PBXFileReference; lastKnownFileType = text; path = Trash_Fence.geojson; sourceTree = ""; }; + 3D3417C72E29D38A006A988B /* GeoJSONOverlayConfig.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GeoJSONOverlayConfig.swift; sourceTree = ""; }; + 3D3417C92E29D3B0006A988B /* Color+Hex.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Color+Hex.swift"; sourceTree = ""; }; + 3D3417CA2E29D3B0006A988B /* Data+Gzip.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Data+Gzip.swift"; sourceTree = ""; }; + 3D3417CD2E29D5D6006A988B /* BurningManGeoJSONMapConfig.json.zlib */ = {isa = PBXFileReference; lastKnownFileType = file; path = BurningManGeoJSONMapConfig.json.zlib; sourceTree = ""; }; 6D825E612C34786C008DBEE4 /* CommonRegex.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CommonRegex.swift; sourceTree = ""; }; 6DA39D8D2A92DC52007E311C /* MeshtasticAppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MeshtasticAppDelegate.swift; sourceTree = ""; }; 6DEDA5592A957B8E00321D2E /* DetectionSensorLog.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DetectionSensorLog.swift; sourceTree = ""; }; @@ -1055,12 +1057,10 @@ DDC2E18926CE24F70042C5E4 /* Resources */ = { isa = PBXGroup; children = ( + 3D3417CD2E29D5D6006A988B /* BurningManGeoJSONMapConfig.json.zlib */, DDB75A192A05EB67006ED576 /* alpha.png */, DDC2E15B26CE248F0042C5E4 /* Assets.xcassets */, DD0E21002B8A6BC500F2D100 /* DeviceHardware.json */, - 3D3417BB2E273AC6006A988B /* Street_Outlines.geojson */, - 3D3417C12E274800006A988B /* Toilets.geojson */, - 3D3417C22E274800006A988B /* Trash_Fence.geojson */, ); path = Resources; sourceTree = ""; @@ -1110,6 +1110,7 @@ DDC2E1A526CEB32B0042C5E4 /* Helpers */ = { isa = PBXGroup; children = ( + 3D3417C72E29D38A006A988B /* GeoJSONOverlayConfig.swift */, BCD7448C2E0F2FA300F265A2 /* ContactURLHandler.swift */, DDD43FE12A78C86B0083A3E9 /* Mqtt */, DDAF8C5226EB1DF10058C060 /* BLEManager.swift */, @@ -1178,6 +1179,8 @@ DDDB443E29F79A9400EE2349 /* Extensions */ = { isa = PBXGroup; children = ( + 3D3417C92E29D3B0006A988B /* Color+Hex.swift */, + 3D3417CA2E29D3B0006A988B /* Data+Gzip.swift */, DD007BB12AA59B9A00F5FA12 /* CoreData */, DDFFA7462B3A7F3C004730DB /* Bundle.swift */, DDDB444529F8A96500EE2349 /* Character.swift */, @@ -1372,11 +1375,9 @@ DDC2E15F26CE248F0042C5E4 /* Preview Assets.xcassets in Resources */, 25AECD4F2C2F723200862C8E /* Localizable.xcstrings in Resources */, DDDE5A1329AFEAB900490C6C /* Assets.xcassets in Resources */, - 3D3417BC2E273AC6006A988B /* Street_Outlines.geojson in Resources */, DDB75A1A2A05EB67006ED576 /* alpha.png in Resources */, - 3D3417C32E274800006A988B /* Toilets.geojson in Resources */, - 3D3417C42E274800006A988B /* Trash_Fence.geojson in Resources */, DDC2E15C26CE248F0042C5E4 /* Assets.xcassets in Resources */, + 3D3417CE2E29D5D6006A988B /* BurningManGeoJSONMapConfig.json.zlib in Resources */, DD0E21012B8A6F1300F2D100 /* DeviceHardware.json in Resources */, DDDBC87B2BC62E4E001E8DF7 /* Settings.bundle in Resources */, ); @@ -1492,6 +1493,7 @@ DDDB26462AACC0B7003AFCB7 /* NodeInfoItem.swift in Sources */, DDE5B4042B2279A700FCDD05 /* TraceRouteLog.swift in Sources */, 3D3417B42E2730EC006A988B /* GeoJSONOverlayManager.swift in Sources */, + 3D3417C82E29D38A006A988B /* GeoJSONOverlayConfig.swift in Sources */, 237B46962DC8F1C100B22D99 /* RateLimitedButton.swift in Sources */, DD6193792863875F00E59241 /* SerialConfig.swift in Sources */, DDDB263F2AABEE20003AFCB7 /* NodeList.swift in Sources */, @@ -1589,6 +1591,8 @@ DD86D40F2881BE4C00BAEB7A /* CsvDocument.swift in Sources */, DDB75A1E2A0B0CD0006ED576 /* LoRaSignalStrengthIndicator.swift in Sources */, DDA6B2E928419CF2003E8C16 /* MeshPackets.swift in Sources */, + 3D3417CB2E29D3B0006A988B /* Color+Hex.swift in Sources */, + 3D3417CC2E29D3B0006A988B /* Data+Gzip.swift in Sources */, DDCE4E2C2869F92900BE9F8F /* UserConfig.swift in Sources */, BCB613852C68703800485544 /* NodePositionIntent.swift in Sources */, DDB75A212A12B954006ED576 /* LoRaSignalStrength.swift in Sources */, diff --git a/Meshtastic/Extensions/Color+Hex.swift b/Meshtastic/Extensions/Color+Hex.swift new file mode 100644 index 00000000..bae3d9b8 --- /dev/null +++ b/Meshtastic/Extensions/Color+Hex.swift @@ -0,0 +1,30 @@ +import SwiftUI + +extension Color { + /// Initialize a Color from a hex string (e.g., "#FF0000" or "FF0000") + init(hex: String) { + let hex = hex.trimmingCharacters(in: CharacterSet.alphanumerics.inverted) + var int: UInt64 = 0 + Scanner(string: hex).scanHexInt64(&int) + + let a, r, g, b: UInt64 + switch hex.count { + case 3: // RGB (12-bit) + (a, r, g, b) = (255, (int >> 8) * 17, (int >> 4 & 0xF) * 17, (int & 0xF) * 17) + case 6: // RGB (24-bit) + (a, r, g, b) = (255, int >> 16, int >> 8 & 0xFF, int & 0xFF) + case 8: // ARGB (32-bit) + (a, r, g, b) = (int >> 24, int >> 16 & 0xFF, int >> 8 & 0xFF, int & 0xFF) + default: + (a, r, g, b) = (255, 0, 0, 0) + } + + self.init( + .sRGB, + red: Double(r) / 255, + green: Double(g) / 255, + blue: Double(b) / 255, + opacity: Double(a) / 255 + ) + } +} \ No newline at end of file diff --git a/Meshtastic/Extensions/Data+Gzip.swift b/Meshtastic/Extensions/Data+Gzip.swift new file mode 100644 index 00000000..580ececf --- /dev/null +++ b/Meshtastic/Extensions/Data+Gzip.swift @@ -0,0 +1,63 @@ +import Foundation +import Compression + +extension Data { + /// Decompresses raw deflate data + func zlibDecompressed() throws -> Data { + guard self.count > 0 else { return Data() } + + // Try Foundation's zlib first + do { + let decompressedData = try (self as NSData).decompressed(using: .zlib) as Data + print("Data+Zlib: Successfully decompressed with Foundation \(count) bytes to \(decompressedData.count) bytes") + return decompressedData + } catch { + print("Data+Zlib: Foundation decompression failed: \(error), trying raw deflate...") + } + + // Fallback to Compression framework with raw deflate + let bufferSize = count * 10 + let destination = UnsafeMutablePointer.allocate(capacity: bufferSize) + defer { destination.deallocate() } + + return try self.withUnsafeBytes { bytes in + let source = bytes.bindMemory(to: UInt8.self) + + let result = compression_decode_buffer( + destination, bufferSize, + source.baseAddress!, count, + nil, COMPRESSION_ZLIB + ) + + guard result > 0 else { + print("Data+Zlib: Raw deflate decompression also failed, result size: \(result)") + throw ZlibError.decompression + } + + print("Data+Zlib: Successfully decompressed with raw deflate \(count) bytes to \(result) bytes") + return Data(bytes: destination, count: result) + } + } +} + +enum ZlibError: Error { + case decompression + + var localizedDescription: String { + switch self { + case .decompression: + return "Failed to decompress data" + } + } +} + +enum GzipError: Error { + case decompression + + var localizedDescription: String { + switch self { + case .decompression: + return "Failed to decompress gzip data" + } + } +} \ No newline at end of file diff --git a/Meshtastic/Helpers/GeoJSONOverlayConfig.swift b/Meshtastic/Helpers/GeoJSONOverlayConfig.swift new file mode 100644 index 00000000..5d3a5e8c --- /dev/null +++ b/Meshtastic/Helpers/GeoJSONOverlayConfig.swift @@ -0,0 +1,123 @@ +import Foundation +import MapKit + +// MARK: - Configuration Models + +struct GeoJSONOverlayConfiguration: Codable { + let version: String + let metadata: OverlayMetadata + let overlays: [OverlayDefinition] +} + +struct OverlayMetadata: Codable { + let name: String + let description: String + let generated: String +} + +struct OverlayDefinition: Codable { + let id: String + let name: String + let description: String + let rendering: RenderingProperties + let geojson: GeoJSONFeatureCollection +} + +struct RenderingProperties: Codable { + let lineColor: String // Hex color (e.g., "#FF0000") + let lineOpacity: Double // 0.0 to 1.0 + let lineThickness: Double // Line width in points + let fillOpacity: Double // 0.0 to 1.0 +} + +struct GeoJSONFeatureCollection: Codable { + let type: String // Always "FeatureCollection" + let features: [GeoJSONFeature] +} + +struct GeoJSONFeature: Codable { + let type: String // Always "Feature" + let id: Int? + let geometry: GeoJSONGeometry + let properties: [String: AnyCodableValue]? +} + +struct GeoJSONGeometry: Codable { + let type: String // "Point", "LineString", "Polygon", etc. + let coordinates: AnyCodableValue // Flexible coordinate structure +} + +// MARK: - Flexible JSON Value Type + +enum AnyCodableValue: Codable { + case string(String) + case int(Int) + case double(Double) + case bool(Bool) + case array([AnyCodableValue]) + case object([String: AnyCodableValue]) + case null + + init(from decoder: Decoder) throws { + let container = try decoder.singleValueContainer() + + if container.decodeNil() { + self = .null + } else if let value = try? container.decode(Bool.self) { + self = .bool(value) + } else if let value = try? container.decode(Int.self) { + self = .int(value) + } else if let value = try? container.decode(Double.self) { + self = .double(value) + } else if let value = try? container.decode(String.self) { + self = .string(value) + } else if let value = try? container.decode([AnyCodableValue].self) { + self = .array(value) + } else if let value = try? container.decode([String: AnyCodableValue].self) { + self = .object(value) + } else { + throw DecodingError.typeMismatch(AnyCodableValue.self, DecodingError.Context(codingPath: decoder.codingPath, debugDescription: "Unable to decode AnyCodableValue")) + } + } + + func encode(to encoder: Encoder) throws { + var container = encoder.singleValueContainer() + + switch self { + case .null: + try container.encodeNil() + case .bool(let value): + try container.encode(value) + case .int(let value): + try container.encode(value) + case .double(let value): + try container.encode(value) + case .string(let value): + try container.encode(value) + case .array(let value): + try container.encode(value) + case .object(let value): + try container.encode(value) + } + } + + // Helper to convert coordinates to the format expected by MKGeoJSONDecoder + func toAnyObject() -> Any { + switch self { + case .null: + return NSNull() + case .bool(let value): + return value + case .int(let value): + return value + case .double(let value): + return value + case .string(let value): + return value + case .array(let values): + return values.map { $0.toAnyObject() } + case .object(let dict): + return dict.mapValues { $0.toAnyObject() } + } + } +} \ No newline at end of file diff --git a/Meshtastic/Helpers/GeoJSONOverlayManager.swift b/Meshtastic/Helpers/GeoJSONOverlayManager.swift index c0d0b6c4..48feecdb 100644 --- a/Meshtastic/Helpers/GeoJSONOverlayManager.swift +++ b/Meshtastic/Helpers/GeoJSONOverlayManager.swift @@ -1,39 +1,101 @@ import SwiftUI import MapKit -/// Enum for supported static overlays -enum StaticGeoJSONOverlay: String, CaseIterable { - case streetOutlines = "Street_Outlines" - case toilets = "Toilets" - case trashFence = "Trash_Fence" - - var filename: String { self.rawValue + ".geojson" } -} - -/// Manager for loading and adding GeoJSON overlays +/// Manager for loading and managing GeoJSON overlays from consolidated configuration class GeoJSONOverlayManager { static let shared = GeoJSONOverlayManager() private init() {} - private var overlays: [StaticGeoJSONOverlay: [MKOverlay]] = [:] + private var configuration: GeoJSONOverlayConfiguration? + private var overlays: [String: [MKOverlay]] = [:] - /// Load overlays for a given type (from bundle) - func loadOverlays(for type: StaticGeoJSONOverlay) -> [MKOverlay] { - print("GeoJSONOverlayManager: Attempting to load overlays for \(type.rawValue)") - if let cached = overlays[type] { - print("GeoJSONOverlayManager: Returning cached overlays for \(type.rawValue), count: \(cached.count)") + /// Load and decompress the consolidated configuration + func loadConfiguration() -> GeoJSONOverlayConfiguration? { + if let cached = configuration { return cached } - guard let url = Bundle.main.url(forResource: type.rawValue, withExtension: "geojson") else { - print("GeoJSONOverlayManager: No file found for \(type.rawValue).geojson") + + guard let url = Bundle.main.url(forResource: "BurningManGeoJSONMapConfig", withExtension: "json.zlib") else { + print("GeoJSONOverlayManager: No compressed configuration file found") + return nil + } + + do { + let compressedData = try Data(contentsOf: url) + print("GeoJSONOverlayManager: Loaded compressed data size: \(compressedData.count) bytes") + + let decompressedData = try compressedData.zlibDecompressed() + print("GeoJSONOverlayManager: Decompressed data size: \(decompressedData.count) bytes") + + // Debug: Check the first few characters of decompressed data + if let decompressedString = String(data: decompressedData, encoding: .utf8) { + let firstChars = String(decompressedString.prefix(100)) + print("GeoJSONOverlayManager: First 100 chars of decompressed data: \(firstChars)") + } else { + print("GeoJSONOverlayManager: Decompressed data is not valid UTF-8") + // Show first few bytes as hex + let firstBytes = decompressedData.prefix(20).map { String(format: "%02x", $0) }.joined() + print("GeoJSONOverlayManager: First 20 bytes (hex): \(firstBytes)") + } + + let config = try JSONDecoder().decode(GeoJSONOverlayConfiguration.self, from: decompressedData) + print("GeoJSONOverlayManager: Loaded configuration with \(config.overlays.count) overlays") + + configuration = config + return config + } catch { + print("GeoJSONOverlayManager: Failed to load configuration: \(error)") + return nil + } + } + + /// Load overlays for a specific overlay ID + func loadOverlays(for overlayId: String) -> [MKOverlay] { + print("GeoJSONOverlayManager: Attempting to load overlays for \(overlayId)") + + if let cached = overlays[overlayId] { + print("GeoJSONOverlayManager: Returning cached overlays for \(overlayId), count: \(cached.count)") + return cached + } + + guard let config = loadConfiguration() else { + print("GeoJSONOverlayManager: Failed to load configuration") return [] } - print("GeoJSONOverlayManager: Found file at: \(url)") + + guard let overlayDef = config.overlays.first(where: { $0.id == overlayId }) else { + print("GeoJSONOverlayManager: No overlay found for ID: \(overlayId)") + return [] + } + do { - let data = try Data(contentsOf: url) - print("GeoJSONOverlayManager: Loaded data size: \(data.count) bytes") - let features = try MKGeoJSONDecoder().decode(data) - print("GeoJSONOverlayManager: Decoded \(features.count) features for \(type.rawValue)") + // Convert our custom GeoJSON structure to the format expected by MKGeoJSONDecoder + let standardGeoJSON: [String: Any] = [ + "type": overlayDef.geojson.type, + "features": overlayDef.geojson.features.map { feature in + var featureDict: [String: Any] = [ + "type": feature.type, + "geometry": [ + "type": feature.geometry.type, + "coordinates": feature.geometry.coordinates.toAnyObject() + ] + ] + + if let id = feature.id { + featureDict["id"] = id + } + + if let properties = feature.properties { + featureDict["properties"] = properties.mapValues { $0.toAnyObject() } + } + + return featureDict + } + ] + + let geojsonData = try JSONSerialization.data(withJSONObject: standardGeoJSON) + let features = try MKGeoJSONDecoder().decode(geojsonData) + print("GeoJSONOverlayManager: Decoded \(features.count) features for \(overlayId)") var allOverlays: [MKOverlay] = [] for (index, feature) in features.enumerated() { @@ -53,23 +115,36 @@ class GeoJSONOverlayManager { } } - print("GeoJSONOverlayManager: Created \(allOverlays.count) total overlays for \(type.rawValue)") - overlays[type] = allOverlays + print("GeoJSONOverlayManager: Created \(allOverlays.count) total overlays for \(overlayId)") + overlays[overlayId] = allOverlays return allOverlays } catch { - print("Failed to load GeoJSON overlay: \(type) error: \(error)") + print("GeoJSONOverlayManager: Failed to decode overlays for \(overlayId): \(error)") return [] } } - /// Add overlays to the map - func addOverlays(_ type: StaticGeoJSONOverlay, to mapView: MKMapView) { - let overlays = loadOverlays(for: type) - mapView.addOverlays(overlays, level: .aboveLabels) + /// Get rendering properties for an overlay + func getRenderingProperties(for overlayId: String) -> RenderingProperties? { + guard let config = loadConfiguration() else { return nil } + return config.overlays.first(where: { $0.id == overlayId })?.rendering } - /// Remove overlays from the map - func removeOverlays(_ type: StaticGeoJSONOverlay, from mapView: MKMapView) { - let overlays = self.overlays[type] ?? [] - mapView.removeOverlays(overlays) + + /// Get all available overlay IDs + func getAvailableOverlayIds() -> [String] { + guard let config = loadConfiguration() else { return [] } + return config.overlays.map { $0.id } + } + + /// Get overlay definition by ID + func getOverlayDefinition(for overlayId: String) -> OverlayDefinition? { + guard let config = loadConfiguration() else { return nil } + return config.overlays.first(where: { $0.id == overlayId }) + } + + /// Clear cached overlays (useful for testing or memory management) + func clearCache() { + overlays.removeAll() + configuration = nil } } \ No newline at end of file diff --git a/Meshtastic/Resources/BurningManGeoJSONMapConfig.json.gz b/Meshtastic/Resources/BurningManGeoJSONMapConfig.json.gz new file mode 100644 index 0000000000000000000000000000000000000000..6b9bf085bc7d0befe8716826c33ce66d8a267ea1 GIT binary patch literal 33876 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 literal 0 HcmV?d00001 diff --git a/Meshtastic/Resources/BurningManGeoJSONMapConfig.json.zlib b/Meshtastic/Resources/BurningManGeoJSONMapConfig.json.zlib new file mode 100644 index 0000000000000000000000000000000000000000..773128ca84bd80da8695e85ca6a952e37415ae44 GIT binary patch literal 34272 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

BXNcs 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 Y8q@~KSZ@llEsOBm`ETtp!rXlQFUMktbN~PV literal 0 HcmV?d00001 diff --git a/Meshtastic/Resources/Street_Outlines.geojson b/Meshtastic/Resources/Street_Outlines.geojson deleted file mode 100644 index dc1bd8b6..00000000 --- a/Meshtastic/Resources/Street_Outlines.geojson +++ /dev/null @@ -1 +0,0 @@ -{"type":"FeatureCollection","features":[{"type":"Feature","id":0,"geometry":{"type":"Polygon","coordinates":[[[-119.21612,40.8029],[-119.21608,40.80293],[-119.21605,40.80297],[-119.21603,40.80301],[-119.21601,40.80305],[-119.216,40.80309],[-119.216,40.80314],[-119.21602,40.80318],[-119.21604,40.80322],[-119.21607,40.80326],[-119.2161,40.80329],[-119.21615,40.80332],[-119.2162,40.80335],[-119.21625,40.80336],[-119.2163,40.80337],[-119.21636,40.80338],[-119.21642,40.80337],[-119.21647,40.80336],[-119.21653,40.80335],[-119.21658,40.80332],[-119.21662,40.8033],[-119.21666,40.80326],[-119.21669,40.80323],[-119.21671,40.80319],[-119.21672,40.80314],[-119.21672,40.8031],[-119.21672,40.80306],[-119.21671,40.80302],[-119.21668,40.80298],[-119.21665,40.80294],[-119.21662,40.80291],[-119.21657,40.80288],[-119.21652,40.80286],[-119.21647,40.80284],[-119.21642,40.80283],[-119.21636,40.80283],[-119.2163,40.80283],[-119.21625,40.80284],[-119.21458,40.80064],[-119.2148,40.80054],[-119.21518,40.80037],[-119.21556,40.80018],[-119.21593,40.79999],[-119.21629,40.7998],[-119.21665,40.7996],[-119.217,40.79939],[-119.21735,40.79918],[-119.21735,40.79918],[-119.21769,40.79896],[-119.21802,40.79874],[-119.21835,40.79851],[-119.21867,40.79827],[-119.21899,40.79803],[-119.2193,40.79779],[-119.2196,40.79754],[-119.21989,40.79729],[-119.22018,40.79703],[-119.22018,40.79703],[-119.22046,40.79676],[-119.22073,40.79649],[-119.22099,40.79622],[-119.22125,40.79595],[-119.2215,40.79567],[-119.22174,40.79538],[-119.22197,40.79509],[-119.2222,40.7948],[-119.2222,40.7948],[-119.22241,40.7945],[-119.22262,40.7942],[-119.22282,40.7939],[-119.22301,40.7936],[-119.2232,40.79329],[-119.22337,40.79298],[-119.22353,40.79266],[-119.22369,40.79234],[-119.22369,40.79234],[-119.22384,40.79202],[-119.22397,40.7917],[-119.2241,40.79138],[-119.22422,40.79105],[-119.22433,40.79072],[-119.22444,40.7904],[-119.22453,40.79006],[-119.22461,40.78973],[-119.22461,40.78973],[-119.22468,40.7894],[-119.22475,40.78906],[-119.2248,40.78873],[-119.22485,40.78839],[-119.22488,40.78805],[-119.22491,40.78771],[-119.22492,40.78738],[-119.22493,40.78704],[-119.22493,40.78704],[-119.22493,40.7867],[-119.22492,40.78636],[-119.2249,40.78602],[-119.22486,40.78569],[-119.22482,40.78535],[-119.22477,40.78501],[-119.22472,40.78468],[-119.22465,40.78434],[-119.22465,40.78434],[-119.22457,40.78401],[-119.22448,40.78368],[-119.22438,40.78335],[-119.22428,40.78302],[-119.22425,40.78293],[-119.2338,40.78342],[-119.23383,40.78337],[-119.23375,40.78331],[-119.23359,40.7833],[-119.23348,40.7833],[-119.23334,40.78329],[-119.2332,40.78327],[-119.23306,40.78325],[-119.23292,40.78321],[-119.23279,40.78318],[-119.23266,40.78313],[-119.23253,40.78308],[-119.23241,40.78302],[-119.23229,40.78296],[-119.23218,40.7829],[-119.22086,40.77429],[-119.22189,40.7743],[-119.22131,40.77386],[-119.22074,40.77343],[-119.22075,40.77421],[-119.22071,40.77418],[-119.21812,40.77221],[-119.21801,40.77213],[-119.21789,40.77205],[-119.21777,40.77198],[-119.21764,40.77191],[-119.2175,40.77185],[-119.21736,40.7718],[-119.21722,40.77175],[-119.21707,40.77171],[-119.21692,40.77167],[-119.21677,40.77164],[-119.21662,40.77162],[-119.21646,40.7716],[-119.21641,40.7716],[-119.21639,40.77154],[-119.21637,40.77148],[-119.21633,40.77143],[-119.21629,40.77137],[-119.21624,40.77132],[-119.21618,40.77128],[-119.21612,40.77124],[-119.21605,40.7712],[-119.21597,40.77118],[-119.2159,40.77115],[-119.21582,40.77114],[-119.21573,40.77113],[-119.21565,40.77113],[-119.21557,40.77114],[-119.21549,40.77115],[-119.21541,40.77118],[-119.21534,40.7712],[-119.21527,40.77124],[-119.2152,40.77128],[-119.21515,40.77132],[-119.2151,40.77137],[-119.21505,40.77143],[-119.21502,40.77148],[-119.21499,40.77154],[-119.21498,40.7716],[-119.21497,40.77167],[-119.21497,40.77173],[-119.21498,40.77179],[-119.21501,40.77185],[-119.21504,40.77191],[-119.21507,40.77197],[-119.21512,40.77202],[-119.21517,40.77206],[-119.21524,40.77211],[-119.21527,40.77213],[-119.21445,40.77321],[-119.21422,40.77311],[-119.21383,40.77295],[-119.21343,40.7728],[-119.21303,40.77265],[-119.21263,40.77251],[-119.21222,40.77237],[-119.21181,40.77224],[-119.21139,40.77212],[-119.21139,40.77212],[-119.21097,40.77201],[-119.21055,40.7719],[-119.21013,40.7718],[-119.2097,40.7717],[-119.20953,40.77167],[-119.20892,40.76489],[-119.20897,40.76489],[-119.20905,40.76487],[-119.20912,40.76484],[-119.20919,40.76481],[-119.20926,40.76478],[-119.20931,40.76474],[-119.20888,40.76441],[-119.2088,40.76435],[-119.20873,40.76438],[-119.20873,40.76438],[-119.20816,40.7646],[-119.20818,40.76464],[-119.20823,40.76469],[-119.20829,40.76473],[-119.20835,40.76478],[-119.20841,40.76481],[-119.20848,40.76484],[-119.20856,40.76487],[-119.20864,40.76489],[-119.20872,40.7649],[-119.20878,40.7649],[-119.20938,40.77164],[-119.20927,40.77161],[-119.20884,40.77153],[-119.2084,40.77146],[-119.20797,40.77139],[-119.20753,40.77133],[-119.20753,40.77133],[-119.20709,40.77128],[-119.20665,40.77124],[-119.20621,40.7712],[-119.20576,40.77117],[-119.20532,40.77114],[-119.20487,40.77113],[-119.20443,40.77112],[-119.20398,40.77112],[-119.20398,40.77112],[-119.20354,40.77112],[-119.20309,40.77113],[-119.20265,40.77115],[-119.2022,40.77118],[-119.20176,40.77122],[-119.20132,40.77126],[-119.20088,40.77131],[-119.20044,40.77136],[-119.20044,40.77136],[-119.2,40.77143],[-119.19957,40.7715],[-119.19913,40.77157],[-119.1987,40.77166],[-119.19827,40.77175],[-119.19785,40.77185],[-119.19742,40.77195],[-119.197,40.77206],[-119.197,40.77206],[-119.19659,40.77218],[-119.19617,40.77231],[-119.19576,40.77244],[-119.19536,40.77258],[-119.19495,40.77272],[-119.19456,40.77287],[-119.19416,40.77303],[-119.19377,40.7732],[-119.19377,40.7732],[-119.19339,40.77337],[-119.19301,40.77354],[-119.19263,40.77373],[-119.19227,40.77392],[-119.1919,40.77411],[-119.19154,40.77431],[-119.19119,40.77452],[-119.19085,40.77473],[-119.19084,40.77473],[-119.1905,40.77495],[-119.19017,40.77517],[-119.18984,40.7754],[-119.18952,40.77564],[-119.1892,40.77588],[-119.1889,40.77612],[-119.1886,40.77637],[-119.1883,40.77662],[-119.18802,40.77688],[-119.18801,40.77688],[-119.18774,40.77715],[-119.18746,40.77741],[-119.1872,40.77769],[-119.18694,40.77796],[-119.18669,40.77824],[-119.18645,40.77853],[-119.18622,40.77882],[-119.18599,40.77911],[-119.18599,40.77911],[-119.18578,40.7794],[-119.18557,40.7797],[-119.18537,40.78001],[-119.18518,40.78031],[-119.185,40.78062],[-119.18482,40.78093],[-119.18466,40.78125],[-119.1845,40.78156],[-119.1845,40.78156],[-119.18435,40.78188],[-119.18422,40.7822],[-119.18409,40.78253],[-119.18397,40.78284],[-119.18397,40.78285],[-119.18395,40.78291],[-119.18404,40.78293],[-119.18408,40.78293],[-119.18409,40.78294],[-119.1847,40.78306],[-119.18533,40.78319],[-119.1863,40.78339],[-119.18728,40.78359],[-119.18826,40.78379],[-119.18993,40.78413],[-119.19091,40.78433],[-119.19188,40.78452],[-119.19286,40.78472],[-119.19384,40.78492],[-119.19534,40.78523],[-119.19534,40.78523],[-119.19535,40.78523],[-119.19542,40.78525],[-119.19544,40.78519],[-119.19545,40.78519],[-119.19552,40.78498],[-119.19561,40.78477],[-119.19571,40.78457],[-119.19581,40.78436],[-119.19593,40.78416],[-119.19605,40.78396],[-119.19618,40.78377],[-119.19632,40.78358],[-119.19647,40.78339],[-119.19662,40.7832],[-119.19679,40.78302],[-119.19696,40.78284],[-119.19713,40.78267],[-119.19732,40.7825],[-119.19751,40.78234],[-119.19771,40.78218],[-119.20399,40.78696],[-119.19804,40.79148],[-119.19798,40.79145],[-119.19792,40.79143],[-119.19785,40.79141],[-119.19778,40.7914],[-119.19771,40.7914],[-119.19764,40.7914],[-119.19757,40.79141],[-119.1975,40.79143],[-119.19744,40.79145],[-119.19738,40.79148],[-119.19733,40.79152],[-119.19728,40.79156],[-119.19724,40.7916],[-119.19721,40.79165],[-119.19719,40.7917],[-119.19717,40.79175],[-119.19717,40.79181],[-119.19717,40.79186],[-119.19719,40.79191],[-119.19721,40.79197],[-119.19724,40.79201],[-119.19728,40.79206],[-119.19733,40.7921],[-119.19738,40.79213],[-119.19744,40.79216],[-119.1975,40.79219],[-119.19757,40.79221],[-119.19764,40.79222],[-119.19771,40.79222],[-119.19778,40.79222],[-119.19785,40.79221],[-119.19792,40.79219],[-119.19798,40.79216],[-119.19804,40.79213],[-119.19809,40.7921],[-119.19814,40.79206],[-119.19818,40.79201],[-119.19821,40.79197],[-119.19823,40.79191],[-119.19825,40.79186],[-119.19825,40.79181],[-119.19825,40.79175],[-119.19823,40.7917],[-119.19821,40.79165],[-119.19818,40.7916],[-119.19814,40.79156],[-119.20409,40.78703],[-119.21038,40.79181],[-119.21017,40.79196],[-119.20995,40.7921],[-119.20973,40.79225],[-119.2095,40.79238],[-119.20927,40.79251],[-119.20903,40.79263],[-119.20879,40.79275],[-119.20854,40.79286],[-119.20829,40.79297],[-119.20803,40.79307],[-119.20777,40.79316],[-119.20751,40.79325],[-119.20724,40.79333],[-119.20696,40.7934],[-119.20669,40.79347],[-119.20645,40.79352],[-119.20641,40.79353],[-119.20634,40.79355],[-119.20636,40.7936],[-119.20638,40.79365],[-119.20677,40.79475],[-119.20703,40.79549],[-119.20729,40.79624],[-119.20755,40.79698],[-119.20781,40.79772],[-119.20826,40.79899],[-119.20853,40.79974],[-119.20879,40.80048],[-119.20905,40.80122],[-119.20922,40.8017],[-119.20938,40.80217],[-119.2094,40.8022],[-119.20942,40.80227],[-119.20949,40.80225],[-119.20951,40.80225],[-119.20992,40.80216],[-119.21034,40.80206],[-119.21077,40.80196],[-119.21119,40.80185],[-119.21119,40.80185],[-119.2116,40.80173],[-119.21202,40.8016],[-119.21243,40.80147],[-119.21284,40.80133],[-119.21324,40.80119],[-119.21364,40.80104],[-119.21403,40.80088],[-119.21442,40.80071],[-119.21442,40.80071],[-119.21445,40.8007],[-119.21612,40.8029]],[[-119.21436,40.80058],[-119.21433,40.80059],[-119.21394,40.80076],[-119.21355,40.80091],[-119.21316,40.80106],[-119.21276,40.80121],[-119.21236,40.80135],[-119.21207,40.80144],[-119.21186,40.80106],[-119.21218,40.80095],[-119.21218,40.80095],[-119.21258,40.80082],[-119.21258,40.80082],[-119.21297,40.80067],[-119.21297,40.80067],[-119.21336,40.80053],[-119.21336,40.80052],[-119.21375,40.80037],[-119.21375,40.80037],[-119.21409,40.80022],[-119.21436,40.80058]],[[-119.21193,40.80148],[-119.21154,40.8016],[-119.21113,40.80172],[-119.21071,40.80183],[-119.21029,40.80193],[-119.20987,40.80203],[-119.20951,40.80211],[-119.20937,40.80171],[-119.20972,40.80163],[-119.20972,40.80163],[-119.21014,40.80154],[-119.21014,40.80154],[-119.21055,40.80144],[-119.21056,40.80143],[-119.21097,40.80133],[-119.21097,40.80132],[-119.21138,40.80121],[-119.21138,40.80121],[-119.21173,40.8011],[-119.21193,40.80148]],[[-119.21134,40.80113],[-119.21093,40.80125],[-119.21052,40.80136],[-119.21011,40.80146],[-119.20969,40.80156],[-119.20934,40.80163],[-119.2092,40.80123],[-119.20955,40.80116],[-119.20955,40.80116],[-119.20996,40.80106],[-119.20996,40.80106],[-119.21036,40.80096],[-119.21037,40.80096],[-119.21077,40.80085],[-119.21077,40.80085],[-119.21117,40.80074],[-119.21117,40.80074],[-119.21148,40.80064],[-119.21169,40.80103],[-119.21134,40.80113]],[[-119.21113,40.80066],[-119.21073,40.80078],[-119.21033,40.80088],[-119.20992,40.80099],[-119.20952,40.80108],[-119.20917,40.80115],[-119.20894,40.80049],[-119.20927,40.80042],[-119.20927,40.80042],[-119.20967,40.80033],[-119.20967,40.80033],[-119.21007,40.80023],[-119.21007,40.80023],[-119.21046,40.80012],[-119.21046,40.80012],[-119.21085,40.80001],[-119.21086,40.80001],[-119.21109,40.79993],[-119.21144,40.80057],[-119.21113,40.80066]],[[-119.21043,40.80004],[-119.21004,40.80015],[-119.20964,40.80025],[-119.20924,40.80034],[-119.20891,40.80041],[-119.20868,40.79975],[-119.209,40.79968],[-119.209,40.79968],[-119.20939,40.79959],[-119.20939,40.79959],[-119.20977,40.79949],[-119.20977,40.79949],[-119.21016,40.79939],[-119.21016,40.79939],[-119.21053,40.79928],[-119.21054,40.79928],[-119.2107,40.79922],[-119.21105,40.79986],[-119.21082,40.79993],[-119.21043,40.80004]],[[-119.21012,40.79931],[-119.20974,40.79941],[-119.20936,40.79951],[-119.20897,40.7996],[-119.20865,40.79967],[-119.20842,40.799],[-119.20873,40.79894],[-119.20873,40.79894],[-119.2091,40.79885],[-119.2091,40.79885],[-119.20948,40.79876],[-119.20948,40.79876],[-119.20985,40.79866],[-119.20985,40.79865],[-119.21021,40.79855],[-119.21021,40.79855],[-119.21032,40.79851],[-119.21066,40.79915],[-119.2105,40.7992],[-119.21012,40.79931]],[[-119.20981,40.79858],[-119.20944,40.79868],[-119.20907,40.79877],[-119.2087,40.79886],[-119.20839,40.79892],[-119.20797,40.79773],[-119.20826,40.79767],[-119.20826,40.79767],[-119.20861,40.79759],[-119.20862,40.79759],[-119.20897,40.7975],[-119.20897,40.7975],[-119.20932,40.7974],[-119.20932,40.7974],[-119.20967,40.79729],[-119.20967,40.79729],[-119.21001,40.79718],[-119.21001,40.79718],[-119.21035,40.79707],[-119.21035,40.79707],[-119.21068,40.79694],[-119.21069,40.79694],[-119.21102,40.79681],[-119.21102,40.79681],[-119.21134,40.79667],[-119.21134,40.79667],[-119.21138,40.79666],[-119.21219,40.79773],[-119.21194,40.79784],[-119.21159,40.79798],[-119.21124,40.79811],[-119.21089,40.79824],[-119.21053,40.79836],[-119.21017,40.79847],[-119.20981,40.79858]],[[-119.21097,40.79674],[-119.21064,40.79687],[-119.2103,40.79699],[-119.20997,40.79711],[-119.20962,40.79722],[-119.20928,40.79732],[-119.20893,40.79742],[-119.20858,40.79751],[-119.20823,40.79759],[-119.20794,40.79765],[-119.20771,40.79699],[-119.20798,40.79693],[-119.20798,40.79693],[-119.20833,40.79685],[-119.20833,40.79685],[-119.20867,40.79676],[-119.20867,40.79676],[-119.20901,40.79667],[-119.20901,40.79667],[-119.20934,40.79656],[-119.20934,40.79656],[-119.20967,40.79646],[-119.20967,40.79645],[-119.21,40.79634],[-119.21,40.79634],[-119.21032,40.79622],[-119.21033,40.79622],[-119.21064,40.79609],[-119.21064,40.79609],[-119.21088,40.79599],[-119.21133,40.79659],[-119.21129,40.7966],[-119.21097,40.79674]],[[-119.21059,40.79602],[-119.21028,40.79615],[-119.20995,40.79627],[-119.20963,40.79638],[-119.2093,40.79649],[-119.20897,40.79659],[-119.20863,40.79668],[-119.20829,40.79677],[-119.20795,40.79685],[-119.20768,40.79691],[-119.20744,40.79625],[-119.20771,40.79619],[-119.20771,40.79619],[-119.20804,40.79611],[-119.20804,40.79611],[-119.20837,40.79603],[-119.20837,40.79603],[-119.20869,40.79593],[-119.20869,40.79593],[-119.20901,40.79583],[-119.20902,40.79583],[-119.20933,40.79573],[-119.20933,40.79573],[-119.20965,40.79562],[-119.20965,40.79562],[-119.20996,40.7955],[-119.20996,40.7955],[-119.21026,40.79537],[-119.21026,40.79537],[-119.21037,40.79533],[-119.21082,40.79592],[-119.21059,40.79602]],[[-119.20991,40.79542],[-119.2096,40.79554],[-119.20929,40.79565],[-119.20897,40.79576],[-119.20865,40.79586],[-119.20833,40.79595],[-119.20801,40.79603],[-119.20768,40.79611],[-119.20742,40.79617],[-119.20718,40.7955],[-119.20743,40.79545],[-119.20743,40.79545],[-119.20775,40.79537],[-119.20775,40.79537],[-119.20806,40.79529],[-119.20806,40.79529],[-119.20837,40.7952],[-119.20838,40.7952],[-119.20868,40.79511],[-119.20868,40.79511],[-119.20899,40.795],[-119.20899,40.795],[-119.20929,40.7949],[-119.20929,40.79489],[-119.20958,40.79478],[-119.20958,40.79478],[-119.20986,40.79466],[-119.21032,40.79525],[-119.21021,40.7953],[-119.20991,40.79542]],[[-119.20953,40.79471],[-119.20924,40.79482],[-119.20894,40.79493],[-119.20864,40.79503],[-119.20834,40.79513],[-119.20803,40.79521],[-119.20772,40.7953],[-119.2074,40.79537],[-119.20715,40.79542],[-119.20692,40.79476],[-119.20716,40.79471],[-119.20716,40.79471],[-119.20746,40.79464],[-119.20746,40.79464],[-119.20776,40.79456],[-119.20776,40.79456],[-119.20805,40.79447],[-119.20805,40.79447],[-119.20834,40.79438],[-119.20835,40.79438],[-119.20863,40.79428],[-119.20863,40.79428],[-119.20892,40.79418],[-119.20892,40.79418],[-119.2092,40.79406],[-119.2092,40.79406],[-119.20936,40.79399],[-119.20981,40.79459],[-119.20953,40.79471]],[[-119.20887,40.7941],[-119.20859,40.79421],[-119.2083,40.79431],[-119.20801,40.7944],[-119.20772,40.79448],[-119.20742,40.79456],[-119.20712,40.79463],[-119.20689,40.79468],[-119.20652,40.79362],[-119.20673,40.79358],[-119.20673,40.79358],[-119.20701,40.79351],[-119.20701,40.79351],[-119.20729,40.79343],[-119.20729,40.79343],[-119.20756,40.79335],[-119.20756,40.79335],[-119.20783,40.79326],[-119.20783,40.79326],[-119.20809,40.79317],[-119.2081,40.79317],[-119.20836,40.79307],[-119.20836,40.79307],[-119.20858,40.79297],[-119.2093,40.79392],[-119.20915,40.79399],[-119.20887,40.7941]],[[-119.20871,40.79292],[-119.20886,40.79285],[-119.20887,40.79285],[-119.20911,40.79273],[-119.20911,40.79273],[-119.20935,40.7926],[-119.20936,40.7926],[-119.20959,40.79247],[-119.20959,40.79247],[-119.20982,40.79233],[-119.20982,40.79233],[-119.21005,40.79219],[-119.21005,40.79219],[-119.21026,40.79204],[-119.21027,40.79204],[-119.21029,40.79202],[-119.2103,40.79202],[-119.21031,40.79201],[-119.21033,40.79201],[-119.21034,40.79201],[-119.21036,40.792],[-119.21038,40.79201],[-119.21039,40.79201],[-119.21041,40.79202],[-119.21042,40.79202],[-119.21145,40.7927],[-119.21141,40.79273],[-119.21118,40.79289],[-119.21095,40.79305],[-119.21071,40.7932],[-119.21046,40.79335],[-119.21021,40.79349],[-119.20995,40.79362],[-119.20969,40.79375],[-119.20943,40.79387],[-119.20871,40.79292]],[[-119.21076,40.79177],[-119.21075,40.79176],[-119.21075,40.79174],[-119.21074,40.79173],[-119.21074,40.79172],[-119.21074,40.7917],[-119.21074,40.79169],[-119.21075,40.79168],[-119.21076,40.79167],[-119.21077,40.79165],[-119.21077,40.79165],[-119.21088,40.79156],[-119.21088,40.79156],[-119.21107,40.79139],[-119.21107,40.79139],[-119.21126,40.79122],[-119.21126,40.79122],[-119.21143,40.79104],[-119.21144,40.79104],[-119.2116,40.79086],[-119.21161,40.79086],[-119.21177,40.79068],[-119.21177,40.79067],[-119.21192,40.79049],[-119.21192,40.79049],[-119.21195,40.79045],[-119.2132,40.791],[-119.21316,40.79105],[-119.21299,40.79126],[-119.21282,40.79145],[-119.21264,40.79165],[-119.21245,40.79184],[-119.21226,40.79203],[-119.21206,40.79221],[-119.21185,40.79239],[-119.21165,40.79254],[-119.21076,40.79177]],[[-119.21164,40.79062],[-119.21149,40.7908],[-119.21132,40.79098],[-119.21114,40.79115],[-119.21096,40.79132],[-119.21077,40.79149],[-119.21058,40.79165],[-119.21048,40.79173],[-119.2042,40.78696],[-119.20961,40.78284],[-119.20968,40.78279],[-119.20977,40.78272],[-119.20981,40.78274],[-119.20993,40.78283],[-119.21006,40.7829],[-119.2102,40.78297],[-119.21034,40.78304],[-119.21048,40.7831],[-119.21063,40.78315],[-119.21079,40.78319],[-119.21094,40.78323],[-119.2111,40.78326],[-119.21126,40.78329],[-119.21142,40.78331],[-119.21159,40.78332],[-119.21166,40.78332],[-119.21168,40.78334],[-119.21183,40.78353],[-119.21197,40.78372],[-119.21211,40.78391],[-119.21223,40.78411],[-119.21235,40.78431],[-119.21246,40.78452],[-119.21255,40.78472],[-119.21264,40.78493],[-119.21273,40.78514],[-119.2128,40.78535],[-119.21286,40.78557],[-119.21292,40.78578],[-119.21296,40.786],[-119.213,40.78622],[-119.21302,40.78643],[-119.21304,40.78665],[-119.21305,40.78687],[-119.21305,40.78709],[-119.21304,40.78731],[-119.21302,40.78753],[-119.21299,40.78775],[-119.21295,40.78797],[-119.2129,40.78818],[-119.21285,40.7884],[-119.21278,40.78861],[-119.21271,40.78882],[-119.21262,40.78903],[-119.21253,40.78924],[-119.21243,40.78945],[-119.21232,40.78965],[-119.2122,40.78985],[-119.21207,40.79005],[-119.21194,40.79024],[-119.2118,40.79043],[-119.21164,40.79062]],[[-119.20409,40.78688],[-119.19781,40.7821],[-119.19792,40.78203],[-119.19813,40.78188],[-119.19835,40.78173],[-119.19857,40.7816],[-119.1988,40.78146],[-119.19904,40.78134],[-119.19928,40.78122],[-119.19952,40.7811],[-119.19977,40.78099],[-119.20003,40.78089],[-119.20029,40.78079],[-119.20055,40.7807],[-119.20082,40.78062],[-119.20109,40.78054],[-119.20136,40.78047],[-119.20164,40.78041],[-119.20192,40.78035],[-119.2022,40.7803],[-119.20248,40.78026],[-119.20276,40.78022],[-119.20305,40.78019],[-119.20334,40.78017],[-119.20363,40.78016],[-119.20391,40.78015],[-119.2042,40.78015],[-119.20449,40.78015],[-119.20478,40.78017],[-119.20507,40.78019],[-119.20535,40.78022],[-119.20564,40.78025],[-119.20592,40.78029],[-119.2062,40.78034],[-119.20648,40.78039],[-119.20676,40.78046],[-119.20703,40.78052],[-119.2073,40.7806],[-119.20757,40.78068],[-119.20784,40.78077],[-119.2081,40.78086],[-119.20835,40.78097],[-119.2086,40.78107],[-119.20885,40.78119],[-119.20888,40.7812],[-119.20889,40.78132],[-119.20891,40.78145],[-119.20893,40.78157],[-119.20897,40.78169],[-119.20902,40.78181],[-119.20907,40.78193],[-119.20914,40.78204],[-119.20921,40.78215],[-119.20929,40.78226],[-119.20938,40.78237],[-119.20947,40.78247],[-119.20958,40.78257],[-119.20967,40.78264],[-119.20409,40.78688]],[[-119.19742,40.78214],[-119.19743,40.78215],[-119.19744,40.78217],[-119.19745,40.78218],[-119.19745,40.78219],[-119.19745,40.78221],[-119.19744,40.78222],[-119.19744,40.78223],[-119.19743,40.78224],[-119.19742,40.78226],[-119.19741,40.78226],[-119.1974,40.78227],[-119.19721,40.78243],[-119.19721,40.78243],[-119.19702,40.7826],[-119.19702,40.7826],[-119.19684,40.78278],[-119.19684,40.78278],[-119.19667,40.78296],[-119.19667,40.78296],[-119.1965,40.78314],[-119.1965,40.78314],[-119.19634,40.78333],[-119.19634,40.78333],[-119.19625,40.78345],[-119.195,40.7829],[-119.19515,40.7827],[-119.19532,40.7825],[-119.1955,40.78231],[-119.19569,40.78212],[-119.19588,40.78193],[-119.19608,40.78175],[-119.19629,40.78157],[-119.1965,40.78139],[-119.19654,40.78137],[-119.19742,40.78214]],[[-119.19618,40.78354],[-119.19605,40.78371],[-119.19605,40.78372],[-119.19592,40.78391],[-119.19592,40.78392],[-119.1958,40.78412],[-119.19579,40.78412],[-119.19568,40.78432],[-119.19568,40.78432],[-119.19557,40.78453],[-119.19557,40.78453],[-119.19547,40.78474],[-119.19547,40.78474],[-119.19538,40.78495],[-119.19538,40.78495],[-119.19532,40.78511],[-119.19393,40.78483],[-119.19399,40.78465],[-119.19409,40.78442],[-119.19419,40.7842],[-119.1943,40.78398],[-119.19442,40.78376],[-119.19455,40.78354],[-119.19469,40.78333],[-119.19484,40.78312],[-119.19493,40.783],[-119.19618,40.78354]],[[-119.19474,40.78308],[-119.19474,40.78308],[-119.19459,40.78329],[-119.19459,40.78329],[-119.19446,40.7835],[-119.19446,40.78351],[-119.19433,40.78372],[-119.19432,40.78373],[-119.1942,40.78395],[-119.1942,40.78395],[-119.19409,40.78417],[-119.19409,40.78417],[-119.19399,40.7844],[-119.19398,40.7844],[-119.19389,40.78463],[-119.19389,40.78463],[-119.19382,40.78481],[-119.19295,40.78463],[-119.19302,40.78444],[-119.19312,40.7842],[-119.19323,40.78397],[-119.19334,40.78373],[-119.19347,40.7835],[-119.1936,40.78327],[-119.19375,40.78305],[-119.1939,40.78282],[-119.19405,40.78261],[-119.19483,40.78295],[-119.19474,40.78308]],[[-119.1938,40.78278],[-119.1938,40.78278],[-119.19365,40.78301],[-119.19365,40.78301],[-119.19351,40.78324],[-119.1935,40.78324],[-119.19337,40.78347],[-119.19337,40.78347],[-119.19324,40.7837],[-119.19324,40.7837],[-119.19313,40.78394],[-119.19313,40.78394],[-119.19302,40.78418],[-119.19302,40.78418],[-119.19292,40.78442],[-119.19292,40.78442],[-119.19285,40.78461],[-119.19197,40.78443],[-119.19205,40.78423],[-119.19215,40.78398],[-119.19226,40.78373],[-119.19238,40.78349],[-119.19251,40.78325],[-119.19265,40.78301],[-119.1928,40.78277],[-119.19295,40.78254],[-119.19311,40.78231],[-119.19318,40.78223],[-119.19396,40.78257],[-119.1938,40.78278]],[[-119.19302,40.78227],[-119.19302,40.78227],[-119.19286,40.7825],[-119.19286,40.7825],[-119.1927,40.78273],[-119.1927,40.78273],[-119.19255,40.78297],[-119.19255,40.78297],[-119.19241,40.78321],[-119.19241,40.78321],[-119.19228,40.78346],[-119.19228,40.78346],[-119.19216,40.78371],[-119.19216,40.78371],[-119.19205,40.78395],[-119.19205,40.78396],[-119.19194,40.78421],[-119.19194,40.78421],[-119.19187,40.78441],[-119.191,40.78423],[-119.19108,40.78402],[-119.19118,40.78376],[-119.1913,40.7835],[-119.19142,40.78325],[-119.19155,40.783],[-119.19169,40.78275],[-119.19185,40.7825],[-119.192,40.78226],[-119.19217,40.78202],[-119.1923,40.78184],[-119.19308,40.78219],[-119.19302,40.78227]],[[-119.19208,40.78198],[-119.19208,40.78198],[-119.19191,40.78222],[-119.19191,40.78222],[-119.19175,40.78246],[-119.19175,40.78247],[-119.1916,40.78271],[-119.1916,40.78271],[-119.19145,40.78296],[-119.19145,40.78297],[-119.19132,40.78322],[-119.19132,40.78322],[-119.19119,40.78348],[-119.19119,40.78348],[-119.19108,40.78374],[-119.19108,40.78374],[-119.19097,40.784],[-119.19097,40.784],[-119.19089,40.78421],[-119.19002,40.78403],[-119.1901,40.78381],[-119.19021,40.78354],[-119.19033,40.78328],[-119.19046,40.78301],[-119.19059,40.78275],[-119.19074,40.78249],[-119.19089,40.78224],[-119.19105,40.78198],[-119.19122,40.78173],[-119.1914,40.78149],[-119.19142,40.78146],[-119.19221,40.7818],[-119.19208,40.78198]],[[-119.19113,40.78169],[-119.19113,40.78169],[-119.19096,40.78195],[-119.19096,40.78195],[-119.19079,40.7822],[-119.19079,40.7822],[-119.19064,40.78246],[-119.19064,40.78246],[-119.19049,40.78272],[-119.19049,40.78272],[-119.19036,40.78298],[-119.19036,40.78298],[-119.19023,40.78325],[-119.19023,40.78325],[-119.19011,40.78352],[-119.19011,40.78352],[-119.19,40.78379],[-119.19,40.78379],[-119.18992,40.78401],[-119.18835,40.78369],[-119.18843,40.78346],[-119.18855,40.78317],[-119.18867,40.78289],[-119.1888,40.78261],[-119.18894,40.78234],[-119.18909,40.78206],[-119.18925,40.78179],[-119.18942,40.78152],[-119.18959,40.78126],[-119.18978,40.78099],[-119.18992,40.7808],[-119.19133,40.78142],[-119.19131,40.78145],[-119.19131,40.78145],[-119.19113,40.78169]],[[-119.18889,40.78223],[-119.18884,40.7823],[-119.18884,40.7823],[-119.1887,40.78258],[-119.1887,40.78258],[-119.18857,40.78286],[-119.18857,40.78286],[-119.18844,40.78315],[-119.18844,40.78315],[-119.18833,40.78343],[-119.18833,40.78343],[-119.18824,40.78367],[-119.18737,40.78349],[-119.18746,40.78325],[-119.18758,40.78296],[-119.1877,40.78266],[-119.18784,40.78238],[-119.18798,40.78209],[-119.18805,40.78196],[-119.18889,40.78223]],[[-119.18788,40.78206],[-119.18788,40.78206],[-119.18774,40.78235],[-119.18774,40.78235],[-119.1876,40.78264],[-119.1876,40.78264],[-119.18747,40.78293],[-119.18747,40.78293],[-119.18736,40.78323],[-119.18736,40.78323],[-119.18727,40.78347],[-119.18639,40.78329],[-119.18649,40.78304],[-119.18661,40.78274],[-119.18674,40.78244],[-119.18688,40.78214],[-119.18702,40.78185],[-119.18712,40.78167],[-119.18795,40.78193],[-119.18788,40.78206]],[[-119.18692,40.78182],[-119.18692,40.78182],[-119.18677,40.78211],[-119.18677,40.78211],[-119.18663,40.78241],[-119.18663,40.78241],[-119.1865,40.78271],[-119.1865,40.78271],[-119.18638,40.78302],[-119.18638,40.78302],[-119.18629,40.78327],[-119.18542,40.78309],[-119.18551,40.78283],[-119.18564,40.78252],[-119.18577,40.78221],[-119.18591,40.78191],[-119.18606,40.78161],[-119.18618,40.78137],[-119.18702,40.78164],[-119.18692,40.78182]],[[-119.18596,40.78158],[-119.18596,40.78158],[-119.18581,40.78188],[-119.18581,40.78188],[-119.18567,40.78219],[-119.18567,40.78219],[-119.18553,40.7825],[-119.18553,40.7825],[-119.18541,40.78281],[-119.18541,40.78281],[-119.18531,40.78307],[-119.18479,40.78296],[-119.18489,40.7827],[-119.18501,40.78238],[-119.18515,40.78207],[-119.18529,40.78176],[-119.18544,40.78145],[-119.18558,40.78119],[-119.18608,40.78134],[-119.18596,40.78158]],[[-119.18534,40.78142],[-119.18534,40.78142],[-119.18519,40.78173],[-119.18519,40.78173],[-119.18504,40.78204],[-119.18504,40.78204],[-119.18491,40.78236],[-119.18491,40.78236],[-119.18478,40.78268],[-119.18478,40.78268],[-119.18468,40.78294],[-119.18416,40.78284],[-119.18426,40.78257],[-119.18439,40.78225],[-119.18453,40.78193],[-119.18467,40.78161],[-119.18483,40.7813],[-119.18498,40.781],[-119.18548,40.78115],[-119.18534,40.78142]],[[-119.18504,40.78089],[-119.18516,40.78067],[-119.18534,40.78037],[-119.18553,40.78007],[-119.18573,40.77977],[-119.18594,40.77947],[-119.18615,40.77918],[-119.18617,40.77915],[-119.18664,40.77936],[-119.18645,40.77962],[-119.18645,40.77962],[-119.18624,40.77991],[-119.18624,40.77991],[-119.18605,40.78021],[-119.18604,40.78021],[-119.18586,40.7805],[-119.18586,40.78051],[-119.18568,40.78081],[-119.18568,40.78081],[-119.18554,40.78105],[-119.18504,40.78089]],[[-119.18624,40.77906],[-119.18637,40.77889],[-119.1866,40.7786],[-119.18684,40.77832],[-119.18709,40.77804],[-119.18734,40.77777],[-119.18761,40.7775],[-119.18766,40.77744],[-119.18809,40.77769],[-119.18785,40.77794],[-119.18785,40.77794],[-119.1876,40.77821],[-119.1876,40.77821],[-119.18735,40.77848],[-119.18735,40.77848],[-119.18711,40.77876],[-119.18711,40.77876],[-119.18688,40.77904],[-119.18688,40.77904],[-119.18671,40.77926],[-119.18624,40.77906]],[[-119.18775,40.77735],[-119.18788,40.77723],[-119.18815,40.77697],[-119.18844,40.77671],[-119.18873,40.77646],[-119.18903,40.77621],[-119.18933,40.77597],[-119.18944,40.77589],[-119.18982,40.77618],[-119.18953,40.77641],[-119.18953,40.77641],[-119.18923,40.77665],[-119.18923,40.77665],[-119.18894,40.7769],[-119.18894,40.7769],[-119.18866,40.77715],[-119.18866,40.77715],[-119.18838,40.77741],[-119.18838,40.77741],[-119.18818,40.7776],[-119.18775,40.77735]],[[-119.18954,40.77581],[-119.18965,40.77573],[-119.18996,40.7755],[-119.19029,40.77527],[-119.19062,40.77505],[-119.19096,40.77484],[-119.1913,40.77463],[-119.19146,40.77453],[-119.19179,40.77486],[-119.19145,40.77506],[-119.19145,40.77506],[-119.19112,40.77527],[-119.19112,40.77527],[-119.19079,40.77549],[-119.19079,40.77549],[-119.19046,40.77571],[-119.19046,40.77571],[-119.19015,40.77594],[-119.19014,40.77594],[-119.18992,40.7761],[-119.18954,40.77581]],[[-119.19158,40.77447],[-119.19165,40.77442],[-119.19201,40.77422],[-119.19237,40.77403],[-119.19273,40.77384],[-119.19311,40.77366],[-119.19348,40.77348],[-119.19372,40.77338],[-119.19399,40.77373],[-119.19397,40.77374],[-119.19397,40.77375],[-119.19359,40.77391],[-119.19359,40.77392],[-119.19322,40.77409],[-119.19322,40.77409],[-119.19286,40.77427],[-119.19286,40.77427],[-119.1925,40.77446],[-119.1925,40.77446],[-119.19214,40.77466],[-119.19214,40.77466],[-119.19191,40.77479],[-119.19158,40.77447]],[[-119.19381,40.77334],[-119.19386,40.77332],[-119.19425,40.77315],[-119.19464,40.773],[-119.19503,40.77285],[-119.19543,40.7727],[-119.19583,40.77256],[-119.19616,40.77246],[-119.19636,40.77284],[-119.19631,40.77286],[-119.19631,40.77286],[-119.19591,40.77299],[-119.19591,40.77299],[-119.19551,40.77313],[-119.19551,40.77313],[-119.19512,40.77327],[-119.19512,40.77327],[-119.19473,40.77342],[-119.19473,40.77342],[-119.19435,40.77358],[-119.19435,40.77358],[-119.19409,40.77369],[-119.19381,40.77334]],[[-119.19622,40.77244],[-119.19624,40.77243],[-119.19665,40.77231],[-119.19706,40.77219],[-119.19748,40.77208],[-119.1979,40.77198],[-119.19832,40.77188],[-119.1987,40.7718],[-119.19884,40.7722],[-119.19878,40.77221],[-119.19878,40.77221],[-119.19836,40.7723],[-119.19836,40.7723],[-119.19795,40.7724],[-119.19795,40.7724],[-119.19753,40.7725],[-119.19753,40.7725],[-119.19712,40.77261],[-119.19712,40.77261],[-119.19671,40.77273],[-119.19671,40.77273],[-119.19643,40.77282],[-119.19622,40.77244]],[[-119.1988,40.77178],[-119.19918,40.77171],[-119.19961,40.77163],[-119.20004,40.77156],[-119.20047,40.7715],[-119.20091,40.77144],[-119.20134,40.77139],[-119.20136,40.77139],[-119.20143,40.7718],[-119.20135,40.77181],[-119.20135,40.77181],[-119.20092,40.77186],[-119.20091,40.77186],[-119.20049,40.77191],[-119.20048,40.77191],[-119.20006,40.77198],[-119.20006,40.77198],[-119.19963,40.77205],[-119.19963,40.77205],[-119.19921,40.77212],[-119.1992,40.77212],[-119.19894,40.77218],[-119.1988,40.77178]],[[-119.20143,40.77139],[-119.20178,40.77135],[-119.20222,40.77132],[-119.20266,40.77129],[-119.2031,40.77127],[-119.20354,40.77126],[-119.20398,40.77125],[-119.20402,40.77125],[-119.20402,40.77167],[-119.20396,40.77167],[-119.20396,40.77167],[-119.20352,40.77167],[-119.20352,40.77167],[-119.20309,40.77168],[-119.20308,40.77168],[-119.20265,40.77171],[-119.20265,40.77171],[-119.20221,40.77173],[-119.20221,40.77173],[-119.20178,40.77177],[-119.20178,40.77177],[-119.2015,40.77179],[-119.20143,40.77139]],[[-119.20417,40.77125],[-119.20442,40.77126],[-119.20487,40.77126],[-119.20531,40.77128],[-119.20575,40.7713],[-119.20619,40.77133],[-119.20663,40.77137],[-119.20675,40.77139],[-119.20668,40.77179],[-119.20657,40.77178],[-119.20657,40.77178],[-119.20614,40.77174],[-119.20614,40.77174],[-119.2057,40.77171],[-119.2057,40.77171],[-119.20527,40.77169],[-119.20527,40.77169],[-119.20483,40.77168],[-119.20483,40.77168],[-119.20439,40.77167],[-119.20439,40.77167],[-119.20417,40.77167],[-119.20417,40.77125]],[[-119.20683,40.77139],[-119.20706,40.77142],[-119.2075,40.77147],[-119.20793,40.77153],[-119.20837,40.77159],[-119.2088,40.77167],[-119.20923,40.77175],[-119.20939,40.77178],[-119.20925,40.77218],[-119.20914,40.77215],[-119.20914,40.77215],[-119.20872,40.77208],[-119.20872,40.77207],[-119.20829,40.772],[-119.20829,40.772],[-119.20786,40.77194],[-119.20786,40.77194],[-119.20743,40.77188],[-119.20743,40.77188],[-119.207,40.77183],[-119.207,40.77183],[-119.20675,40.7718],[-119.20683,40.77139]],[[-119.20949,40.7718],[-119.20965,40.77183],[-119.21008,40.77193],[-119.2105,40.77203],[-119.21092,40.77213],[-119.21133,40.77225],[-119.21174,40.77237],[-119.21196,40.77244],[-119.21176,40.77282],[-119.21163,40.77278],[-119.21163,40.77278],[-119.21122,40.77266],[-119.21122,40.77266],[-119.21081,40.77254],[-119.21081,40.77254],[-119.2104,40.77244],[-119.2104,40.77244],[-119.20998,40.77234],[-119.20998,40.77234],[-119.20956,40.77224],[-119.20956,40.77224],[-119.20935,40.7722],[-119.20949,40.7718]],[[-119.21203,40.77246],[-119.21215,40.7725],[-119.21255,40.77263],[-119.21296,40.77277],[-119.21335,40.77292],[-119.21374,40.77307],[-119.21413,40.77323],[-119.21436,40.77333],[-119.21409,40.77369],[-119.21398,40.77364],[-119.21398,40.77364],[-119.2136,40.77348],[-119.2136,40.77348],[-119.21322,40.77333],[-119.21321,40.77333],[-119.21282,40.77318],[-119.21282,40.77318],[-119.21243,40.77304],[-119.21243,40.77304],[-119.21203,40.77291],[-119.21203,40.77291],[-119.21182,40.77284],[-119.21203,40.77246]],[[-119.21461,40.77328],[-119.21461,40.77328],[-119.21457,40.77327],[-119.2154,40.77218],[-119.21545,40.7722],[-119.21553,40.77222],[-119.21561,40.77223],[-119.21569,40.77223],[-119.21578,40.77223],[-119.21586,40.77222],[-119.21594,40.7722],[-119.21601,40.77217],[-119.21608,40.77214],[-119.21615,40.77211],[-119.21621,40.77206],[-119.21626,40.77202],[-119.21631,40.77197],[-119.21635,40.77191],[-119.21638,40.77185],[-119.2164,40.77179],[-119.21641,40.77173],[-119.21641,40.77171],[-119.21645,40.77171],[-119.21659,40.77173],[-119.21674,40.77175],[-119.21688,40.77178],[-119.21703,40.77181],[-119.21716,40.77185],[-119.2173,40.7719],[-119.21743,40.77195],[-119.21756,40.77201],[-119.21768,40.77207],[-119.2178,40.77214],[-119.21791,40.77221],[-119.21802,40.77229],[-119.22056,40.77422],[-119.21592,40.77391],[-119.21574,40.77382],[-119.21537,40.77363],[-119.21499,40.77345],[-119.21461,40.77328]],[[-119.22059,40.77433],[-119.21877,40.77572],[-119.21851,40.77552],[-119.21818,40.77529],[-119.21785,40.77506],[-119.21752,40.77484],[-119.21751,40.77484],[-119.21717,40.77462],[-119.21682,40.77441],[-119.21647,40.77421],[-119.21615,40.77404],[-119.22059,40.77433]],[[-119.22069,40.77441],[-119.22084,40.77571],[-119.21894,40.77584],[-119.21888,40.77579],[-119.22069,40.77441]],[[-119.22084,40.77443],[-119.23209,40.78298],[-119.23221,40.78305],[-119.23233,40.78312],[-119.23246,40.78318],[-119.2326,40.78323],[-119.23267,40.78326],[-119.22421,40.78282],[-119.22416,40.78269],[-119.22404,40.78237],[-119.2239,40.78204],[-119.22376,40.78172],[-119.22361,40.7814],[-119.22361,40.7814],[-119.22345,40.78109],[-119.22328,40.78078],[-119.2231,40.78047],[-119.22291,40.78016],[-119.22272,40.77985],[-119.22252,40.77955],[-119.2223,40.77926],[-119.22217,40.77908],[-119.2236,40.77846],[-119.22361,40.77847],[-119.22367,40.77852],[-119.22373,40.77856],[-119.2238,40.7786],[-119.22387,40.77863],[-119.22394,40.77865],[-119.22402,40.77867],[-119.2241,40.77868],[-119.22419,40.77868],[-119.22427,40.77868],[-119.22435,40.77867],[-119.22443,40.77865],[-119.2245,40.77863],[-119.22458,40.7786],[-119.22464,40.77856],[-119.2247,40.77852],[-119.22476,40.77847],[-119.2248,40.77842],[-119.22484,40.77836],[-119.22487,40.77831],[-119.22489,40.77824],[-119.22491,40.77818],[-119.22491,40.77812],[-119.2249,40.77806],[-119.22488,40.778],[-119.22486,40.77794],[-119.22482,40.77788],[-119.22478,40.77783],[-119.22473,40.77778],[-119.22467,40.77773],[-119.22461,40.77769],[-119.22454,40.77766],[-119.22447,40.77763],[-119.22439,40.77761],[-119.22431,40.77759],[-119.22423,40.77759],[-119.22414,40.77759],[-119.22406,40.77759],[-119.22398,40.77761],[-119.2239,40.77763],[-119.22383,40.77766],[-119.22376,40.77769],[-119.2237,40.77773],[-119.22364,40.77778],[-119.22359,40.77783],[-119.22355,40.77788],[-119.22351,40.77794],[-119.22349,40.778],[-119.22347,40.77806],[-119.22346,40.77812],[-119.22347,40.77818],[-119.22348,40.77824],[-119.2235,40.77831],[-119.22353,40.77836],[-119.2221,40.77899],[-119.22208,40.77896],[-119.22208,40.77896],[-119.22185,40.77867],[-119.22162,40.77838],[-119.22137,40.7781],[-119.22125,40.77797],[-119.22084,40.77443]],[[-119.2241,40.78305],[-119.22421,40.78338],[-119.2243,40.78371],[-119.22439,40.78403],[-119.22447,40.78436],[-119.22454,40.7847],[-119.22457,40.78488],[-119.22403,40.78493],[-119.224,40.78474],[-119.224,40.78474],[-119.22393,40.78441],[-119.22393,40.78441],[-119.22385,40.78409],[-119.22385,40.78409],[-119.22377,40.78376],[-119.22377,40.78376],[-119.22367,40.78344],[-119.22367,40.78344],[-119.22357,40.78312],[-119.22356,40.78312],[-119.22354,40.78304],[-119.22406,40.78293],[-119.2241,40.78305]],[[-119.22346,40.78314],[-119.22356,40.78346],[-119.22366,40.78378],[-119.22375,40.7841],[-119.22382,40.78443],[-119.22389,40.78475],[-119.22392,40.78494],[-119.22339,40.785],[-119.22335,40.7848],[-119.22335,40.7848],[-119.22328,40.78448],[-119.22328,40.78448],[-119.22321,40.78416],[-119.22321,40.78416],[-119.22312,40.78384],[-119.22312,40.78384],[-119.22303,40.78352],[-119.22303,40.78352],[-119.22292,40.7832],[-119.22292,40.7832],[-119.22291,40.78316],[-119.22343,40.78306],[-119.22346,40.78314]],[[-119.22404,40.78499],[-119.22458,40.78493],[-119.2246,40.78503],[-119.22464,40.78536],[-119.22468,40.7857],[-119.22472,40.78603],[-119.22474,40.78637],[-119.22475,40.7867],[-119.22475,40.7869],[-119.22421,40.7869],[-119.22421,40.78673],[-119.22421,40.78672],[-119.2242,40.78639],[-119.2242,40.78639],[-119.22418,40.78606],[-119.22418,40.78606],[-119.22415,40.78573],[-119.22415,40.78573],[-119.22411,40.7854],[-119.22411,40.7854],[-119.22406,40.78507],[-119.22406,40.78507],[-119.22404,40.78499]],[[-119.22395,40.78508],[-119.224,40.78541],[-119.22404,40.78574],[-119.22407,40.78607],[-119.22409,40.7864],[-119.2241,40.78673],[-119.2241,40.7869],[-119.22356,40.7869],[-119.22356,40.78675],[-119.22356,40.78675],[-119.22355,40.78642],[-119.22355,40.78642],[-119.22353,40.7861],[-119.22353,40.7861],[-119.2235,40.78577],[-119.2235,40.78577],[-119.22346,40.78545],[-119.22346,40.78545],[-119.22341,40.78512],[-119.22341,40.78512],[-119.2234,40.78505],[-119.22393,40.785],[-119.22395,40.78508]],[[-119.2233,40.78513],[-119.22335,40.78546],[-119.22339,40.78578],[-119.22342,40.7861],[-119.22344,40.78643],[-119.22345,40.78675],[-119.22345,40.7869],[-119.22255,40.7869],[-119.22255,40.78689],[-119.22255,40.78689],[-119.22254,40.78658],[-119.22254,40.78658],[-119.22253,40.78626],[-119.22253,40.78626],[-119.2225,40.78594],[-119.2225,40.78594],[-119.22247,40.78563],[-119.22247,40.78563],[-119.22242,40.78531],[-119.22242,40.78531],[-119.22239,40.78515],[-119.22329,40.78506],[-119.2233,40.78513]],[[-119.22231,40.78532],[-119.22236,40.78563],[-119.22239,40.78595],[-119.22242,40.78626],[-119.22243,40.78658],[-119.22244,40.78689],[-119.22244,40.7869],[-119.22184,40.7869],[-119.22182,40.78686],[-119.2218,40.78682],[-119.22176,40.78678],[-119.22172,40.78675],[-119.22168,40.78672],[-119.22162,40.7867],[-119.22157,40.78669],[-119.22153,40.78668],[-119.22152,40.78641],[-119.22152,40.78641],[-119.2215,40.78611],[-119.2215,40.78611],[-119.22147,40.7858],[-119.22147,40.7858],[-119.22143,40.78549],[-119.22143,40.78549],[-119.22139,40.78525],[-119.22229,40.78516],[-119.22231,40.78532]],[[-119.22132,40.7855],[-119.22136,40.78581],[-119.22139,40.78611],[-119.22141,40.78642],[-119.22142,40.78668],[-119.2214,40.78669],[-119.22134,40.7867],[-119.22129,40.78672],[-119.22124,40.78675],[-119.2212,40.78678],[-119.22117,40.78682],[-119.22115,40.78686],[-119.22113,40.7869],[-119.22053,40.7869],[-119.22053,40.78686],[-119.22053,40.78686],[-119.22052,40.78656],[-119.22052,40.78656],[-119.2205,40.78626],[-119.2205,40.78626],[-119.22047,40.78597],[-119.22047,40.78596],[-119.22044,40.78567],[-119.22044,40.78567],[-119.22039,40.78537],[-119.22039,40.78537],[-119.22039,40.78535],[-119.22128,40.78526],[-119.22132,40.7855]],[[-119.22029,40.78538],[-119.22033,40.78568],[-119.22037,40.78597],[-119.22039,40.78627],[-119.22041,40.78656],[-119.22042,40.78686],[-119.22042,40.7869],[-119.21879,40.7869],[-119.21879,40.78683],[-119.21879,40.78683],[-119.21878,40.78655],[-119.21878,40.78655],[-119.21876,40.78626],[-119.21876,40.78626],[-119.21874,40.78598],[-119.21874,40.78598],[-119.2187,40.7857],[-119.2187,40.7857],[-119.21865,40.78542],[-119.21865,40.78542],[-119.2186,40.78514],[-119.2186,40.78514],[-119.21853,40.78486],[-119.21853,40.78486],[-119.21846,40.78458],[-119.21846,40.78458],[-119.21837,40.7843],[-119.21837,40.7843],[-119.2183,40.7841],[-119.21987,40.78378],[-119.21992,40.78392],[-119.22001,40.78421],[-119.2201,40.7845],[-119.22017,40.78479],[-119.22023,40.78509],[-119.22029,40.78538]],[[-119.21827,40.78432],[-119.21835,40.7846],[-119.21842,40.78487],[-119.21849,40.78515],[-119.21855,40.78543],[-119.21859,40.78571],[-119.21863,40.78599],[-119.21866,40.78627],[-119.21867,40.78655],[-119.21868,40.78683],[-119.21868,40.7869],[-119.21778,40.7869],[-119.21778,40.78687],[-119.21778,40.78687],[-119.21777,40.7866],[-119.21777,40.78659],[-119.21776,40.78632],[-119.21776,40.78632],[-119.21773,40.78605],[-119.21773,40.78605],[-119.21769,40.78578],[-119.21769,40.78577],[-119.21765,40.7855],[-119.21765,40.7855],[-119.21759,40.78523],[-119.21759,40.78523],[-119.21753,40.78496],[-119.21753,40.78496],[-119.21745,40.78469],[-119.21745,40.78469],[-119.21737,40.78443],[-119.21737,40.78443],[-119.21733,40.7843],[-119.2182,40.78412],[-119.21827,40.78432]],[[-119.21727,40.78445],[-119.21735,40.78471],[-119.21742,40.78498],[-119.21749,40.78525],[-119.21754,40.78551],[-119.21759,40.78578],[-119.21762,40.78605],[-119.21765,40.78633],[-119.21766,40.7866],[-119.21767,40.78687],[-119.21767,40.7869],[-119.21677,40.7869],[-119.21676,40.78664],[-119.21676,40.78664],[-119.21675,40.78638],[-119.21675,40.78638],[-119.21672,40.78612],[-119.21672,40.78611],[-119.21669,40.78585],[-119.21669,40.78585],[-119.21664,40.78559],[-119.21664,40.78559],[-119.21659,40.78533],[-119.21659,40.78533],[-119.21653,40.78507],[-119.21653,40.78507],[-119.21645,40.78481],[-119.21645,40.78481],[-119.21637,40.78456],[-119.21637,40.78456],[-119.21635,40.7845],[-119.21722,40.78432],[-119.21727,40.78445]],[[-119.21627,40.78458],[-119.21635,40.78483],[-119.21642,40.78509],[-119.21648,40.78534],[-119.21654,40.7856],[-119.21658,40.78586],[-119.21661,40.78612],[-119.21664,40.78638],[-119.21666,40.78664],[-119.21666,40.7869],[-119.21606,40.7869],[-119.21604,40.78686],[-119.21602,40.78682],[-119.21598,40.78678],[-119.21594,40.78675],[-119.2159,40.78672],[-119.21585,40.7867],[-119.21579,40.78669],[-119.21575,40.78668],[-119.21574,40.78643],[-119.21574,40.78643],[-119.21571,40.78618],[-119.21571,40.78618],[-119.21568,40.78593],[-119.21568,40.78593],[-119.21564,40.78568],[-119.21564,40.78568],[-119.21559,40.78543],[-119.21559,40.78543],[-119.21552,40.78518],[-119.21552,40.78518],[-119.21545,40.78494],[-119.21545,40.78494],[-119.21537,40.7847],[-119.21625,40.78452],[-119.21627,40.78458]],[[-119.21535,40.78495],[-119.21542,40.7852],[-119.21548,40.78544],[-119.21553,40.78569],[-119.21557,40.78594],[-119.21561,40.78619],[-119.21563,40.78644],[-119.21565,40.78668],[-119.21562,40.78669],[-119.21556,40.7867],[-119.21551,40.78672],[-119.21547,40.78675],[-119.21543,40.78678],[-119.21539,40.78682],[-119.21537,40.78686],[-119.21536,40.78688],[-119.21475,40.78685],[-119.21474,40.78673],[-119.21474,40.78673],[-119.21473,40.78649],[-119.21473,40.78649],[-119.21471,40.78625],[-119.21471,40.78625],[-119.21467,40.78601],[-119.21467,40.78601],[-119.21463,40.78577],[-119.21463,40.78577],[-119.21458,40.78553],[-119.21458,40.78553],[-119.21452,40.7853],[-119.21452,40.7853],[-119.21445,40.78506],[-119.21445,40.78506],[-119.2144,40.7849],[-119.21527,40.78472],[-119.21535,40.78495]],[[-119.21435,40.78508],[-119.21442,40.78531],[-119.21448,40.78555],[-119.21453,40.78578],[-119.21457,40.78602],[-119.2146,40.78626],[-119.21462,40.78649],[-119.21464,40.78673],[-119.21464,40.78684],[-119.21329,40.78677],[-119.21327,40.78677],[-119.21325,40.78677],[-119.21324,40.78676],[-119.21322,40.78675],[-119.21321,40.78674],[-119.2132,40.78673],[-119.21319,40.78672],[-119.21319,40.7867],[-119.21319,40.78669],[-119.21319,40.78669],[-119.21319,40.78665],[-119.21319,40.78665],[-119.21317,40.78643],[-119.21317,40.78643],[-119.21314,40.78621],[-119.21314,40.7862],[-119.2131,40.78598],[-119.2131,40.78598],[-119.21306,40.78576],[-119.21306,40.78576],[-119.213,40.78554],[-119.213,40.78554],[-119.21294,40.78533],[-119.21294,40.78533],[-119.2129,40.7852],[-119.21429,40.78492],[-119.21435,40.78508]],[[-119.21287,40.78512],[-119.21287,40.78511],[-119.21286,40.78511],[-119.21278,40.7849],[-119.21278,40.7849],[-119.21269,40.78469],[-119.21269,40.78468],[-119.21259,40.78448],[-119.21259,40.78448],[-119.21248,40.78427],[-119.21248,40.78427],[-119.21236,40.78407],[-119.21236,40.78406],[-119.21224,40.78387],[-119.21224,40.78386],[-119.2121,40.78367],[-119.2121,40.78367],[-119.21206,40.78361],[-119.21206,40.78361],[-119.21205,40.78359],[-119.21205,40.78358],[-119.21205,40.78357],[-119.21205,40.78355],[-119.21206,40.78354],[-119.21207,40.78353],[-119.21208,40.78352],[-119.21209,40.78351],[-119.21326,40.783],[-119.21333,40.78309],[-119.21348,40.7833],[-119.21362,40.78351],[-119.21375,40.78373],[-119.21387,40.78395],[-119.21398,40.78417],[-119.21409,40.7844],[-119.21418,40.78462],[-119.21427,40.78484],[-119.21287,40.78512]],[[-119.21284,40.78304],[-119.21269,40.78308],[-119.21254,40.78312],[-119.21239,40.78315],[-119.21223,40.78318],[-119.21207,40.7832],[-119.21191,40.78321],[-119.21175,40.78321],[-119.21159,40.78321],[-119.21143,40.7832],[-119.21127,40.78318],[-119.21112,40.78315],[-119.21096,40.78312],[-119.21081,40.78308],[-119.21066,40.78304],[-119.21052,40.78299],[-119.21037,40.78293],[-119.21024,40.78286],[-119.21011,40.78279],[-119.21066,40.78223],[-119.21077,40.78228],[-119.21088,40.78234],[-119.21099,40.78238],[-119.21111,40.78242],[-119.21124,40.78245],[-119.21136,40.78248],[-119.21149,40.78249],[-119.21162,40.7825],[-119.21175,40.78251],[-119.21188,40.7825],[-119.21201,40.78249],[-119.21214,40.78248],[-119.21227,40.78245],[-119.21239,40.78242],[-119.21251,40.78238],[-119.21263,40.78234],[-119.21269,40.78231],[-119.21284,40.78248],[-119.21301,40.78268],[-119.21318,40.78288],[-119.21319,40.7829],[-119.21313,40.78293],[-119.21299,40.78298],[-119.21284,40.78304]],[[-119.20957,40.78238],[-119.20955,40.78236],[-119.20946,40.78226],[-119.20937,40.78215],[-119.2093,40.78205],[-119.20923,40.78194],[-119.20918,40.78182],[-119.20913,40.78171],[-119.20909,40.78159],[-119.20906,40.78147],[-119.20904,40.78135],[-119.20902,40.78123],[-119.20902,40.7811],[-119.20903,40.78098],[-119.20904,40.78086],[-119.20907,40.78074],[-119.20911,40.78062],[-119.20915,40.7805],[-119.2092,40.78039],[-119.20926,40.78028],[-119.20932,40.78019],[-119.20931,40.78019],[-119.20943,40.78004],[-119.20945,40.78005],[-119.20972,40.78018],[-119.20998,40.78031],[-119.21021,40.78042],[-119.21019,40.78045],[-119.21013,40.78054],[-119.21007,40.78063],[-119.21003,40.78072],[-119.20999,40.78082],[-119.20997,40.78091],[-119.20995,40.78101],[-119.20995,40.78111],[-119.20995,40.78121],[-119.20996,40.78131],[-119.20998,40.78141],[-119.21001,40.7815],[-119.21005,40.7816],[-119.2101,40.78169],[-119.21016,40.78178],[-119.21022,40.78186],[-119.21029,40.78195],[-119.21031,40.78196],[-119.20957,40.78238]],[[-119.20863,40.78088],[-119.20861,40.78089],[-119.2086,40.7809],[-119.20859,40.7809],[-119.20857,40.78091],[-119.20855,40.78091],[-119.20853,40.78091],[-119.20852,40.78091],[-119.2085,40.7809],[-119.2085,40.7809],[-119.20842,40.78087],[-119.20842,40.78087],[-119.20816,40.78077],[-119.20816,40.78077],[-119.2079,40.78067],[-119.20789,40.78067],[-119.20763,40.78058],[-119.20763,40.78058],[-119.20736,40.7805],[-119.20735,40.7805],[-119.20708,40.78042],[-119.20708,40.78042],[-119.2068,40.78035],[-119.2068,40.78035],[-119.20652,40.78029],[-119.20652,40.78029],[-119.2065,40.78028],[-119.20688,40.77922],[-119.20716,40.77929],[-119.20746,40.77936],[-119.20776,40.77944],[-119.20805,40.77952],[-119.20834,40.77962],[-119.20862,40.77972],[-119.2089,40.77982],[-119.20918,40.77993],[-119.2093,40.77999],[-119.20863,40.78088]],[[-119.2064,40.78026],[-119.20624,40.78023],[-119.20623,40.78023],[-119.20595,40.78018],[-119.20595,40.78018],[-119.20566,40.78014],[-119.20566,40.78014],[-119.20537,40.78011],[-119.20537,40.78011],[-119.20508,40.78008],[-119.20508,40.78008],[-119.20479,40.78006],[-119.20479,40.78006],[-119.2045,40.78004],[-119.2045,40.78004],[-119.20443,40.78004],[-119.20442,40.78004],[-119.2044,40.78004],[-119.20439,40.78003],[-119.20437,40.78003],[-119.20436,40.78002],[-119.20435,40.78001],[-119.20434,40.78],[-119.20434,40.77998],[-119.20433,40.77997],[-119.20424,40.77894],[-119.20439,40.77894],[-119.2047,40.77895],[-119.20501,40.77897],[-119.20532,40.77899],[-119.20563,40.77903],[-119.20594,40.77906],[-119.20625,40.77911],[-119.20656,40.77916],[-119.20677,40.7792],[-119.2064,40.78026]],[[-119.20385,40.77997],[-119.20385,40.77998],[-119.20385,40.77999],[-119.20384,40.78001],[-119.20383,40.78002],[-119.20381,40.78003],[-119.2038,40.78003],[-119.20378,40.78004],[-119.20376,40.78004],[-119.20374,40.78004],[-119.20374,40.78004],[-119.20362,40.78005],[-119.20362,40.78005],[-119.20333,40.78006],[-119.20332,40.78006],[-119.20303,40.78008],[-119.20303,40.78009],[-119.20274,40.78011],[-119.20274,40.78011],[-119.20245,40.78015],[-119.20245,40.78015],[-119.20217,40.78019],[-119.20216,40.7802],[-119.20188,40.78025],[-119.20188,40.78025],[-119.20179,40.78026],[-119.20142,40.7792],[-119.20159,40.77917],[-119.2019,40.77912],[-119.20221,40.77907],[-119.20251,40.77903],[-119.20282,40.779],[-119.20314,40.77897],[-119.20345,40.77895],[-119.20376,40.77894],[-119.20395,40.77894],[-119.20385,40.77997]],[[-119.20169,40.78029],[-119.2016,40.7803],[-119.2016,40.7803],[-119.20132,40.78037],[-119.20132,40.78037],[-119.20104,40.78044],[-119.20104,40.78044],[-119.20077,40.78052],[-119.20076,40.78052],[-119.20049,40.7806],[-119.20049,40.7806],[-119.20023,40.78069],[-119.20022,40.78069],[-119.19996,40.78079],[-119.19996,40.78079],[-119.1997,40.7809],[-119.1997,40.7809],[-119.19959,40.78094],[-119.19887,40.77999],[-119.19897,40.77995],[-119.19925,40.77984],[-119.19953,40.77973],[-119.19982,40.77963],[-119.2001,40.77954],[-119.2004,40.77945],[-119.20069,40.77937],[-119.20099,40.7793],[-119.20129,40.77923],[-119.20131,40.77922],[-119.20169,40.78029]],[[-119.1995,40.78099],[-119.19945,40.78101],[-119.19945,40.78101],[-119.1992,40.78112],[-119.1992,40.78112],[-119.19896,40.78125],[-119.19895,40.78125],[-119.19872,40.78137],[-119.19871,40.78138],[-119.19848,40.78151],[-119.19848,40.78151],[-119.19825,40.78165],[-119.19825,40.78165],[-119.19803,40.7818],[-119.19803,40.7818],[-119.19791,40.78188],[-119.19789,40.78189],[-119.19788,40.7819],[-119.19786,40.7819],[-119.19785,40.78191],[-119.19783,40.78191],[-119.19781,40.7819],[-119.1978,40.7819],[-119.19778,40.78189],[-119.19777,40.78189],[-119.19674,40.78121],[-119.19695,40.78106],[-119.19718,40.7809],[-119.19742,40.78075],[-119.19767,40.7806],[-119.19792,40.78046],[-119.19817,40.78032],[-119.19844,40.78019],[-119.1987,40.78007],[-119.19878,40.78003],[-119.1995,40.78099]],[[-119.19646,40.7813],[-119.19642,40.78134],[-119.19642,40.78134],[-119.19621,40.78151],[-119.19621,40.78151],[-119.196,40.78169],[-119.196,40.78169],[-119.1958,40.78188],[-119.19579,40.78188],[-119.1956,40.78207],[-119.1956,40.78207],[-119.19541,40.78226],[-119.19541,40.78226],[-119.19523,40.78246],[-119.19523,40.78246],[-119.19506,40.78266],[-119.19506,40.78266],[-119.1949,40.78286],[-119.19412,40.78252],[-119.19422,40.78239],[-119.1944,40.78218],[-119.19458,40.78197],[-119.19477,40.78176],[-119.19497,40.78156],[-119.19518,40.78137],[-119.19539,40.78118],[-119.19561,40.78099],[-119.19568,40.78094],[-119.19572,40.78096],[-119.19577,40.78098],[-119.19583,40.78099],[-119.19588,40.78099],[-119.19594,40.78099],[-119.196,40.78098],[-119.19605,40.78096],[-119.19606,40.78095],[-119.19646,40.7813]],[[-119.19531,40.78112],[-119.19531,40.78112],[-119.19509,40.78132],[-119.19509,40.78132],[-119.19488,40.78151],[-119.19488,40.78151],[-119.19468,40.78171],[-119.19468,40.78172],[-119.19449,40.78192],[-119.19449,40.78192],[-119.19431,40.78213],[-119.19431,40.78213],[-119.19413,40.78234],[-119.19413,40.78235],[-119.19403,40.78247],[-119.19325,40.78213],[-119.19329,40.78208],[-119.19347,40.78186],[-119.19365,40.78164],[-119.19385,40.78142],[-119.19405,40.78121],[-119.19426,40.781],[-119.19448,40.7808],[-119.19471,40.7806],[-119.19494,40.78041],[-119.19511,40.78028],[-119.19557,40.78058],[-119.19555,40.78062],[-119.19553,40.78066],[-119.19552,40.7807],[-119.19553,40.78075],[-119.19554,40.78079],[-119.19556,40.78083],[-119.19559,40.78087],[-119.1956,40.78088],[-119.19553,40.78094],[-119.19553,40.78094],[-119.19531,40.78112]],[[-119.19486,40.78035],[-119.19486,40.78036],[-119.19463,40.78055],[-119.19462,40.78055],[-119.1944,40.78075],[-119.1944,40.78075],[-119.19418,40.78095],[-119.19418,40.78095],[-119.19397,40.78116],[-119.19397,40.78116],[-119.19376,40.78137],[-119.19376,40.78138],[-119.19356,40.78159],[-119.19356,40.78159],[-119.19337,40.78181],[-119.19337,40.78181],[-119.19319,40.78204],[-119.19319,40.78204],[-119.19315,40.78209],[-119.19237,40.78175],[-119.19253,40.78155],[-119.19272,40.78132],[-119.19292,40.78109],[-119.19313,40.78087],[-119.19334,40.78065],[-119.19356,40.78044],[-119.19379,40.78023],[-119.19403,40.78003],[-119.19427,40.77983],[-119.19444,40.7797],[-119.19508,40.78018],[-119.19486,40.78035]],[[-119.1942,40.77977],[-119.1942,40.77977],[-119.19395,40.77997],[-119.19395,40.77997],[-119.19371,40.78018],[-119.19371,40.78018],[-119.19348,40.78039],[-119.19348,40.78039],[-119.19326,40.7806],[-119.19326,40.7806],[-119.19304,40.78082],[-119.19304,40.78082],[-119.19283,40.78104],[-119.19283,40.78104],[-119.19263,40.78127],[-119.19263,40.78127],[-119.19244,40.7815],[-119.19244,40.7815],[-119.19228,40.78171],[-119.1915,40.78136],[-119.19159,40.78124],[-119.19178,40.781],[-119.19199,40.78077],[-119.1922,40.78054],[-119.19241,40.78031],[-119.19264,40.78009],[-119.19287,40.77987],[-119.19311,40.77965],[-119.19336,40.77944],[-119.19362,40.77924],[-119.19373,40.77915],[-119.19437,40.77964],[-119.1942,40.77977]],[[-119.19354,40.77918],[-119.19354,40.77918],[-119.19328,40.77939],[-119.19328,40.77939],[-119.19303,40.7796],[-119.19303,40.7796],[-119.19279,40.77981],[-119.19279,40.77981],[-119.19256,40.78003],[-119.19256,40.78004],[-119.19233,40.78026],[-119.19233,40.78026],[-119.19211,40.78049],[-119.19211,40.78049],[-119.1919,40.78072],[-119.1919,40.78072],[-119.19169,40.78096],[-119.19169,40.78096],[-119.1915,40.7812],[-119.1915,40.7812],[-119.1914,40.78132],[-119.18999,40.7807],[-119.19017,40.78048],[-119.19038,40.78023],[-119.19059,40.77998],[-119.19082,40.77974],[-119.19105,40.7795],[-119.19129,40.77926],[-119.19153,40.77903],[-119.19179,40.77881],[-119.19205,40.77858],[-119.19231,40.77837],[-119.1925,40.77822],[-119.19365,40.77909],[-119.19354,40.77918]],[[-119.18983,40.78076],[-119.18968,40.78095],[-119.18968,40.78095],[-119.1895,40.78122],[-119.1895,40.78122],[-119.18932,40.78148],[-119.18932,40.78149],[-119.18915,40.78175],[-119.18915,40.78176],[-119.18899,40.78203],[-119.18899,40.78203],[-119.18894,40.78212],[-119.18811,40.78186],[-119.18814,40.78181],[-119.1883,40.78153],[-119.18847,40.78125],[-119.18865,40.78097],[-119.18884,40.7807],[-119.18903,40.78043],[-119.18905,40.78041],[-119.18983,40.78076]],[[-119.18874,40.78066],[-119.18874,40.78066],[-119.18855,40.78093],[-119.18855,40.78094],[-119.18837,40.78121],[-119.18837,40.78121],[-119.1882,40.78149],[-119.1882,40.78149],[-119.18804,40.78177],[-119.18804,40.78177],[-119.18801,40.78183],[-119.18717,40.78157],[-119.18718,40.78155],[-119.18735,40.78126],[-119.18752,40.78098],[-119.1877,40.78069],[-119.18789,40.78041],[-119.18809,40.78014],[-119.18817,40.78003],[-119.18895,40.78037],[-119.18894,40.78039],[-119.18894,40.78039],[-119.18874,40.78066]],[[-119.188,40.7801],[-119.188,40.7801],[-119.1878,40.78037],[-119.1878,40.78038],[-119.18761,40.78066],[-119.1876,40.78066],[-119.18742,40.78094],[-119.18742,40.78094],[-119.18725,40.78123],[-119.18725,40.78123],[-119.18708,40.78152],[-119.18708,40.78152],[-119.18707,40.78154],[-119.18624,40.78127],[-119.18639,40.78101],[-119.18657,40.78071],[-119.18675,40.78042],[-119.18695,40.78013],[-119.18715,40.77984],[-119.1873,40.77965],[-119.18808,40.77999],[-119.188,40.7801]],[[-119.18705,40.7798],[-119.18705,40.77981],[-119.18685,40.78009],[-119.18685,40.78009],[-119.18666,40.78038],[-119.18665,40.78038],[-119.18647,40.78068],[-119.18647,40.78068],[-119.18629,40.78097],[-119.18629,40.78097],[-119.18614,40.78124],[-119.18564,40.78108],[-119.18578,40.78084],[-119.18595,40.78054],[-119.18614,40.78024],[-119.18634,40.77995],[-119.18654,40.77966],[-119.18673,40.7794],[-119.1872,40.7796],[-119.18705,40.7798]],[[-119.18681,40.7793],[-119.18698,40.77908],[-119.1872,40.7788],[-119.18744,40.77853],[-119.18769,40.77825],[-119.18794,40.77799],[-119.18818,40.77774],[-119.18861,40.77799],[-119.18844,40.77816],[-119.18844,40.77816],[-119.18819,40.77842],[-119.18819,40.77842],[-119.18795,40.77869],[-119.18795,40.77869],[-119.18771,40.77896],[-119.18771,40.77896],[-119.18748,40.77924],[-119.18748,40.77924],[-119.18727,40.77951],[-119.18681,40.7793]],[[-119.18827,40.77765],[-119.18847,40.77746],[-119.18874,40.77721],[-119.18902,40.77695],[-119.18931,40.77671],[-119.18961,40.77647],[-119.1899,40.77624],[-119.19028,40.77653],[-119.19011,40.77667],[-119.19011,40.77667],[-119.18981,40.7769],[-119.18981,40.7769],[-119.18952,40.77715],[-119.18952,40.77715],[-119.18924,40.77739],[-119.18924,40.77739],[-119.18897,40.77764],[-119.18897,40.77764],[-119.1887,40.7779],[-119.1887,40.7779],[-119.1887,40.7779],[-119.18827,40.77765]],[[-119.19,40.77616],[-119.19022,40.776],[-119.19054,40.77577],[-119.19086,40.77555],[-119.19119,40.77534],[-119.19152,40.77513],[-119.19186,40.77492],[-119.19219,40.77525],[-119.19201,40.77535],[-119.19201,40.77535],[-119.19168,40.77556],[-119.19168,40.77556],[-119.19135,40.77577],[-119.19135,40.77577],[-119.19103,40.77599],[-119.19103,40.77599],[-119.19072,40.77621],[-119.19072,40.77621],[-119.19041,40.77643],[-119.19041,40.77644],[-119.19038,40.77645],[-119.19,40.77616]],[[-119.19197,40.77486],[-119.19221,40.77472],[-119.19256,40.77453],[-119.19292,40.77434],[-119.19328,40.77416],[-119.19365,40.77399],[-119.19402,40.77382],[-119.19405,40.77381],[-119.19432,40.77416],[-119.19413,40.77424],[-119.19413,40.77424],[-119.19377,40.77441],[-119.19376,40.77441],[-119.1934,40.77459],[-119.1934,40.77459],[-119.19305,40.77477],[-119.19305,40.77477],[-119.1927,40.77496],[-119.1927,40.77496],[-119.19235,40.77515],[-119.19235,40.77516],[-119.1923,40.77518],[-119.19197,40.77486]],[[-119.19414,40.77377],[-119.1944,40.77365],[-119.19478,40.7735],[-119.19517,40.77335],[-119.19556,40.7732],[-119.19595,40.77306],[-119.19635,40.77293],[-119.19641,40.77292],[-119.19661,40.7733],[-119.19642,40.77336],[-119.19642,40.77336],[-119.19603,40.77349],[-119.19603,40.77349],[-119.19564,40.77363],[-119.19564,40.77363],[-119.19526,40.77377],[-119.19526,40.77377],[-119.19488,40.77392],[-119.19488,40.77392],[-119.1945,40.77408],[-119.1945,40.77408],[-119.19441,40.77412],[-119.19414,40.77377]],[[-119.19647,40.7729],[-119.19675,40.77281],[-119.19716,40.77269],[-119.19757,40.77258],[-119.19798,40.77248],[-119.19839,40.77238],[-119.19881,40.77229],[-119.19886,40.77228],[-119.199,40.77268],[-119.19885,40.77271],[-119.19885,40.77271],[-119.19844,40.7728],[-119.19844,40.7728],[-119.19803,40.7729],[-119.19803,40.7729],[-119.19762,40.773],[-119.19762,40.773],[-119.19722,40.77311],[-119.19722,40.77311],[-119.19682,40.77323],[-119.19682,40.77323],[-119.19668,40.77328],[-119.19647,40.7729]],[[-119.19897,40.77226],[-119.19923,40.7722],[-119.19965,40.77213],[-119.20008,40.77206],[-119.2005,40.77199],[-119.20093,40.77194],[-119.20136,40.77189],[-119.20145,40.77188],[-119.20152,40.77229],[-119.20137,40.77231],[-119.20137,40.77231],[-119.20094,40.77235],[-119.20094,40.77235],[-119.20052,40.77241],[-119.20052,40.77241],[-119.2001,40.77247],[-119.2001,40.77247],[-119.19968,40.77254],[-119.19968,40.77255],[-119.19926,40.77262],[-119.19926,40.77262],[-119.19911,40.77265],[-119.19897,40.77226]],[[-119.20152,40.77188],[-119.20179,40.77185],[-119.20222,40.77181],[-119.20266,40.77179],[-119.20309,40.77177],[-119.20352,40.77175],[-119.20396,40.77175],[-119.20402,40.77175],[-119.20402,40.77216],[-119.20393,40.77216],[-119.20393,40.77216],[-119.2035,40.77217],[-119.2035,40.77217],[-119.20308,40.77218],[-119.20307,40.77218],[-119.20265,40.7722],[-119.20265,40.7722],[-119.20222,40.77223],[-119.20222,40.77223],[-119.20179,40.77226],[-119.20179,40.77226],[-119.20159,40.77228],[-119.20152,40.77188]],[[-119.20417,40.77175],[-119.20439,40.77175],[-119.20483,40.77176],[-119.20526,40.77177],[-119.20569,40.7718],[-119.20613,40.77183],[-119.20656,40.77186],[-119.20667,40.77188],[-119.2066,40.77228],[-119.2065,40.77227],[-119.2065,40.77227],[-119.20608,40.77224],[-119.20607,40.77224],[-119.20565,40.77221],[-119.20565,40.77221],[-119.20522,40.77218],[-119.20522,40.77218],[-119.20479,40.77217],[-119.20479,40.77217],[-119.20436,40.77216],[-119.20436,40.77216],[-119.20417,40.77216],[-119.20417,40.77175]],[[-119.20674,40.77188],[-119.20699,40.77191],[-119.20742,40.77196],[-119.20784,40.77202],[-119.20827,40.77208],[-119.20869,40.77216],[-119.20911,40.77223],[-119.20922,40.77226],[-119.20908,40.77265],[-119.20903,40.77264],[-119.20903,40.77264],[-119.20861,40.77256],[-119.20861,40.77256],[-119.20819,40.77249],[-119.20819,40.77249],[-119.20777,40.77243],[-119.20777,40.77243],[-119.20735,40.77237],[-119.20735,40.77237],[-119.20693,40.77232],[-119.20693,40.77232],[-119.20667,40.77229],[-119.20674,40.77188]],[[-119.20932,40.77228],[-119.20953,40.77232],[-119.20995,40.77241],[-119.21036,40.77251],[-119.21077,40.77262],[-119.21118,40.77273],[-119.21159,40.77285],[-119.21172,40.7729],[-119.21151,40.77328],[-119.21147,40.77326],[-119.21147,40.77326],[-119.21107,40.77314],[-119.21107,40.77314],[-119.21067,40.77303],[-119.21067,40.77303],[-119.21026,40.77292],[-119.21026,40.77292],[-119.20985,40.77282],[-119.20985,40.77282],[-119.20944,40.77273],[-119.20944,40.77273],[-119.20918,40.77268],[-119.20932,40.77228]],[[-119.21178,40.77292],[-119.21199,40.77298],[-119.21238,40.77311],[-119.21278,40.77325],[-119.21317,40.7734],[-119.21355,40.77355],[-119.21393,40.77371],[-119.21403,40.77376],[-119.21376,40.77411],[-119.2134,40.77396],[-119.2134,40.77396],[-119.21303,40.77381],[-119.21302,40.77381],[-119.21264,40.77366],[-119.21264,40.77366],[-119.21225,40.77352],[-119.21225,40.77352],[-119.21186,40.77339],[-119.21186,40.77339],[-119.21157,40.7733],[-119.21178,40.77292]],[[-119.21436,40.77381],[-119.21436,40.77381],[-119.21421,40.77374],[-119.21448,40.77338],[-119.21452,40.7734],[-119.21489,40.77357],[-119.21527,40.77375],[-119.21564,40.77393],[-119.216,40.77413],[-119.21636,40.77432],[-119.21661,40.77447],[-119.21628,40.77479],[-119.21618,40.77473],[-119.21617,40.77473],[-119.21582,40.77453],[-119.21582,40.77453],[-119.21547,40.77434],[-119.21546,40.77434],[-119.2151,40.77416],[-119.2151,40.77416],[-119.21474,40.77398],[-119.21473,40.77398],[-119.21436,40.77381]],[[-119.21672,40.77453],[-119.21706,40.77473],[-119.2174,40.77494],[-119.21773,40.77516],[-119.21806,40.77539],[-119.21838,40.77562],[-119.21865,40.77581],[-119.21826,40.7761],[-119.21816,40.77603],[-119.21816,40.77603],[-119.21785,40.7758],[-119.21784,40.7758],[-119.21752,40.77557],[-119.21752,40.77557],[-119.2172,40.77535],[-119.21719,40.77535],[-119.21686,40.77514],[-119.21686,40.77514],[-119.21652,40.77493],[-119.21652,40.77493],[-119.21639,40.77486],[-119.21672,40.77453]],[[-119.22086,40.77582],[-119.22108,40.77779],[-119.22086,40.77755],[-119.22059,40.77728],[-119.22031,40.77701],[-119.22003,40.77675],[-119.22003,40.77675],[-119.21974,40.7765],[-119.21944,40.77624],[-119.21914,40.776],[-119.21907,40.77594],[-119.22086,40.77582]],[[-119.22071,40.77763],[-119.22097,40.7779],[-119.22122,40.77818],[-119.22146,40.77846],[-119.2217,40.77874],[-119.22193,40.77903],[-119.22195,40.77906],[-119.22148,40.77926],[-119.22139,40.77915],[-119.22139,40.77915],[-119.22116,40.77887],[-119.22116,40.77886],[-119.22093,40.77859],[-119.22093,40.77858],[-119.22068,40.77831],[-119.22068,40.77831],[-119.22043,40.77804],[-119.22043,40.77804],[-119.22017,40.77777],[-119.22017,40.77777],[-119.22009,40.77769],[-119.22052,40.77744],[-119.22071,40.77763]],[[-119.22202,40.77915],[-119.22215,40.77932],[-119.22236,40.77962],[-119.22256,40.77992],[-119.22275,40.78022],[-119.22294,40.78052],[-119.22311,40.78083],[-119.22316,40.78092],[-119.22266,40.78108],[-119.22258,40.78092],[-119.22258,40.78092],[-119.2224,40.78062],[-119.2224,40.78062],[-119.22221,40.78032],[-119.22221,40.78032],[-119.22202,40.78002],[-119.22202,40.78002],[-119.22182,40.77973],[-119.22182,40.77973],[-119.22161,40.77944],[-119.22161,40.77943],[-119.22155,40.77936],[-119.22202,40.77915]],[[-119.22319,40.78097],[-119.22328,40.78114],[-119.22344,40.78145],[-119.22359,40.78177],[-119.22373,40.78209],[-119.22386,40.78241],[-119.22399,40.78273],[-119.22403,40.78285],[-119.22351,40.78296],[-119.22345,40.7828],[-119.22345,40.7828],[-119.22333,40.78248],[-119.22333,40.78248],[-119.2232,40.78216],[-119.22319,40.78216],[-119.22305,40.78185],[-119.22305,40.78185],[-119.2229,40.78154],[-119.2229,40.78154],[-119.22274,40.78123],[-119.22274,40.78123],[-119.22269,40.78113],[-119.22319,40.78097]],[[-119.22264,40.78126],[-119.2228,40.78157],[-119.22295,40.78188],[-119.22309,40.78219],[-119.22322,40.7825],[-119.22335,40.78282],[-119.2234,40.78298],[-119.22288,40.78308],[-119.22281,40.78289],[-119.22281,40.78289],[-119.22269,40.78258],[-119.22269,40.78258],[-119.22256,40.78227],[-119.22256,40.78227],[-119.22242,40.78196],[-119.22241,40.78196],[-119.22227,40.78165],[-119.22227,40.78165],[-119.22211,40.78135],[-119.22211,40.78135],[-119.22209,40.78132],[-119.22259,40.78116],[-119.22264,40.78126]],[[-119.22201,40.78138],[-119.22216,40.78168],[-119.22231,40.78199],[-119.22245,40.78229],[-119.22258,40.7826],[-119.22271,40.78291],[-119.22278,40.78311],[-119.2219,40.78328],[-119.22185,40.78313],[-119.22185,40.78313],[-119.22173,40.78283],[-119.22173,40.78283],[-119.2216,40.78253],[-119.2216,40.78252],[-119.22147,40.78223],[-119.22147,40.78222],[-119.22132,40.78193],[-119.22132,40.78193],[-119.22117,40.78163],[-119.22117,40.78163],[-119.22116,40.78161],[-119.22199,40.78135],[-119.22201,40.78138]],[[-119.2228,40.78319],[-119.22282,40.78322],[-119.22292,40.78354],[-119.22302,40.78386],[-119.2231,40.78417],[-119.22318,40.78449],[-119.22324,40.78481],[-119.22328,40.78501],[-119.22238,40.7851],[-119.22237,40.785],[-119.22237,40.78499],[-119.2223,40.78468],[-119.2223,40.78468],[-119.22223,40.78437],[-119.22223,40.78437],[-119.22215,40.78406],[-119.22215,40.78406],[-119.22206,40.78375],[-119.22206,40.78375],[-119.22196,40.78344],[-119.22196,40.78344],[-119.22193,40.78336],[-119.2228,40.78319]],[[-119.22185,40.78346],[-119.22195,40.78377],[-119.22204,40.78407],[-119.22213,40.78438],[-119.2222,40.78469],[-119.22226,40.78501],[-119.22228,40.78511],[-119.22138,40.7852],[-119.22138,40.78519],[-119.22138,40.78518],[-119.22132,40.78488],[-119.22132,40.78488],[-119.22125,40.78458],[-119.22125,40.78458],[-119.22118,40.78427],[-119.22118,40.78427],[-119.22109,40.78397],[-119.22109,40.78397],[-119.22099,40.78367],[-119.22099,40.78367],[-119.22096,40.78356],[-119.22183,40.78338],[-119.22185,40.78346]],[[-119.22089,40.78369],[-119.22098,40.78399],[-119.22107,40.78429],[-119.22115,40.78459],[-119.22122,40.78489],[-119.22127,40.7852],[-119.22128,40.78521],[-119.22038,40.7853],[-119.22034,40.78507],[-119.22034,40.78507],[-119.22027,40.78478],[-119.22027,40.78478],[-119.2202,40.78449],[-119.2202,40.78449],[-119.22012,40.78419],[-119.22012,40.78419],[-119.22003,40.7839],[-119.22003,40.7839],[-119.21998,40.78376],[-119.22085,40.78358],[-119.22089,40.78369]],[[-119.21985,40.7837],[-119.21828,40.78402],[-119.21818,40.78376],[-119.21818,40.78376],[-119.21807,40.78349],[-119.21807,40.78348],[-119.21795,40.78322],[-119.21794,40.78322],[-119.21782,40.78295],[-119.21782,40.78295],[-119.21768,40.78269],[-119.21768,40.78269],[-119.21753,40.78243],[-119.21753,40.78243],[-119.21738,40.78217],[-119.21737,40.78217],[-119.21721,40.78191],[-119.21721,40.78191],[-119.21704,40.78166],[-119.21704,40.78166],[-119.21686,40.78142],[-119.21826,40.7808],[-119.21834,40.7809],[-119.21852,40.78116],[-119.2187,40.78142],[-119.21887,40.78169],[-119.21904,40.78196],[-119.21919,40.78223],[-119.21933,40.78251],[-119.21947,40.78279],[-119.2196,40.78307],[-119.21971,40.78335],[-119.21982,40.78364],[-119.21985,40.7837]],[[-119.21694,40.7817],[-119.21711,40.78195],[-119.21728,40.7822],[-119.21743,40.78246],[-119.21758,40.78272],[-119.21771,40.78298],[-119.21784,40.78324],[-119.21796,40.78351],[-119.21807,40.78378],[-119.21817,40.78404],[-119.2173,40.78422],[-119.21728,40.78416],[-119.21728,40.78416],[-119.21718,40.7839],[-119.21718,40.7839],[-119.21707,40.78364],[-119.21707,40.78364],[-119.21695,40.78338],[-119.21695,40.78338],[-119.21682,40.78312],[-119.21682,40.78312],[-119.21668,40.78287],[-119.21668,40.78287],[-119.21654,40.78262],[-119.21654,40.78262],[-119.21638,40.78237],[-119.21638,40.78237],[-119.21622,40.78213],[-119.21622,40.78213],[-119.21605,40.78189],[-119.21605,40.78189],[-119.21598,40.7818],[-119.21676,40.78146],[-119.21694,40.7817]],[[-119.21595,40.78193],[-119.21612,40.78217],[-119.21628,40.78241],[-119.21644,40.78265],[-119.21658,40.7829],[-119.21672,40.78315],[-119.21685,40.78341],[-119.21696,40.78367],[-119.21707,40.78392],[-119.21717,40.78418],[-119.21719,40.78424],[-119.21632,40.78442],[-119.21628,40.7843],[-119.21628,40.7843],[-119.21618,40.78405],[-119.21618,40.78405],[-119.21607,40.7838],[-119.21607,40.7838],[-119.21595,40.78355],[-119.21595,40.78355],[-119.21583,40.78331],[-119.21583,40.78331],[-119.21569,40.78306],[-119.21569,40.78306],[-119.21555,40.78282],[-119.21554,40.78282],[-119.21539,40.78259],[-119.21539,40.78259],[-119.21523,40.78235],[-119.21523,40.78235],[-119.21511,40.78219],[-119.21589,40.78184],[-119.21595,40.78193]],[[-119.21514,40.78239],[-119.2153,40.78262],[-119.21545,40.78286],[-119.21559,40.7831],[-119.21573,40.78334],[-119.21585,40.78358],[-119.21597,40.78383],[-119.21608,40.78407],[-119.21618,40.78432],[-119.21622,40.78444],[-119.21535,40.78462],[-119.21528,40.78445],[-119.21528,40.78445],[-119.21518,40.78421],[-119.21518,40.78421],[-119.21508,40.78397],[-119.21508,40.78397],[-119.21496,40.78373],[-119.21496,40.78373],[-119.21483,40.7835],[-119.21483,40.7835],[-119.2147,40.78327],[-119.2147,40.78326],[-119.21456,40.78304],[-119.21456,40.78304],[-119.21441,40.78281],[-119.21441,40.78281],[-119.21425,40.78259],[-119.21425,40.78259],[-119.21423,40.78257],[-119.21501,40.78223],[-119.21514,40.78239]],[[-119.21415,40.78263],[-119.21431,40.78285],[-119.21446,40.78307],[-119.2146,40.7833],[-119.21473,40.78353],[-119.21486,40.78376],[-119.21497,40.78399],[-119.21508,40.78423],[-119.21518,40.78447],[-119.21524,40.78464],[-119.21437,40.78482],[-119.21429,40.7846],[-119.21429,40.7846],[-119.21419,40.78437],[-119.21419,40.78437],[-119.21408,40.78414],[-119.21408,40.78414],[-119.21397,40.78392],[-119.21397,40.78392],[-119.21385,40.7837],[-119.21385,40.7837],[-119.21372,40.78348],[-119.21372,40.78348],[-119.21358,40.78326],[-119.21357,40.78326],[-119.21343,40.78305],[-119.21343,40.78305],[-119.21335,40.78295],[-119.21414,40.78261],[-119.21415,40.78263]],[[-119.21328,40.78286],[-119.21327,40.78284],[-119.21327,40.78284],[-119.21311,40.78264],[-119.2131,40.78264],[-119.21293,40.78243],[-119.21293,40.78243],[-119.21278,40.78226],[-119.21351,40.78186],[-119.21363,40.78199],[-119.21381,40.7822],[-119.21399,40.78241],[-119.21406,40.78252],[-119.21328,40.78286]],[[-119.21264,40.78226],[-119.21261,40.78228],[-119.2125,40.78232],[-119.21238,40.78236],[-119.21226,40.78239],[-119.21213,40.78242],[-119.21201,40.78244],[-119.21188,40.78245],[-119.21175,40.78245],[-119.21162,40.78245],[-119.2115,40.78244],[-119.21137,40.78242],[-119.21125,40.78239],[-119.21113,40.78236],[-119.21101,40.78232],[-119.21089,40.78228],[-119.21079,40.78223],[-119.21071,40.78219],[-119.21119,40.7817],[-119.21122,40.78172],[-119.2113,40.78176],[-119.21139,40.78179],[-119.21147,40.78182],[-119.21157,40.78183],[-119.21166,40.78184],[-119.21175,40.78185],[-119.21184,40.78184],[-119.21194,40.78183],[-119.21203,40.78182],[-119.21212,40.78179],[-119.21215,40.78178],[-119.21228,40.78191],[-119.21248,40.78209],[-119.21264,40.78226]],[[-119.21037,40.78193],[-119.21033,40.78189],[-119.21026,40.78181],[-119.2102,40.78172],[-119.21015,40.78163],[-119.2101,40.78154],[-119.21007,40.78145],[-119.21004,40.78135],[-119.21003,40.78126],[-119.21002,40.78116],[-119.21002,40.78106],[-119.21003,40.78096],[-119.21005,40.78087],[-119.21008,40.78077],[-119.21012,40.78068],[-119.21017,40.78059],[-119.21023,40.7805],[-119.21027,40.78046],[-119.21049,40.78058],[-119.21074,40.78073],[-119.2109,40.78083],[-119.2109,40.78084],[-119.21086,40.78091],[-119.21084,40.78098],[-119.21082,40.78105],[-119.21081,40.78112],[-119.21082,40.78119],[-119.21083,40.78126],[-119.21085,40.78133],[-119.21088,40.7814],[-119.21092,40.78146],[-119.21096,40.78152],[-119.211,40.78156],[-119.21037,40.78193]],[[-119.2108,40.78067],[-119.2108,40.78067],[-119.21056,40.78052],[-119.21055,40.78052],[-119.21033,40.78039],[-119.21085,40.77983],[-119.21085,40.77983],[-119.21089,40.77985],[-119.21115,40.78],[-119.21141,40.78016],[-119.21166,40.78032],[-119.21182,40.78042],[-119.2118,40.78042],[-119.2117,40.78042],[-119.21161,40.78043],[-119.21152,40.78044],[-119.21143,40.78046],[-119.21134,40.78049],[-119.21126,40.78053],[-119.21118,40.78057],[-119.21111,40.78061],[-119.21105,40.78066],[-119.21099,40.78072],[-119.21095,40.78076],[-119.2108,40.78067]],[[-119.21027,40.78036],[-119.21004,40.78024],[-119.21004,40.78024],[-119.20978,40.78011],[-119.20978,40.78011],[-119.20951,40.77998],[-119.20951,40.77998],[-119.20948,40.77997],[-119.20993,40.77938],[-119.21007,40.77944],[-119.21035,40.77957],[-119.21062,40.77971],[-119.21079,40.7798],[-119.21027,40.78036]],[[-119.20936,40.77992],[-119.20923,40.77986],[-119.20923,40.77986],[-119.20895,40.77975],[-119.20895,40.77975],[-119.20867,40.77964],[-119.20867,40.77964],[-119.20838,40.77954],[-119.20838,40.77954],[-119.20809,40.77945],[-119.20809,40.77945],[-119.20779,40.77936],[-119.20779,40.77936],[-119.2075,40.77928],[-119.20749,40.77928],[-119.20719,40.77921],[-119.20719,40.77921],[-119.2069,40.77914],[-119.20714,40.77848],[-119.20736,40.77853],[-119.20768,40.7786],[-119.20799,40.77869],[-119.2083,40.77877],[-119.2086,40.77887],[-119.2089,40.77897],[-119.2092,40.77908],[-119.20949,40.77919],[-119.20978,40.77931],[-119.20981,40.77932],[-119.20936,40.77992]],[[-119.2068,40.77912],[-119.20658,40.77908],[-119.20658,40.77908],[-119.20627,40.77903],[-119.20627,40.77903],[-119.20596,40.77898],[-119.20596,40.77898],[-119.20565,40.77894],[-119.20565,40.77894],[-119.20534,40.77891],[-119.20534,40.77891],[-119.20502,40.77889],[-119.20502,40.77889],[-119.20471,40.77887],[-119.20471,40.77887],[-119.20439,40.77886],[-119.20439,40.77886],[-119.20423,40.77886],[-119.20419,40.77839],[-119.20421,40.77839],[-119.20426,40.77837],[-119.20431,40.77835],[-119.20435,40.77832],[-119.20439,40.77829],[-119.20442,40.77825],[-119.20444,40.77821],[-119.20445,40.77818],[-119.20477,40.77819],[-119.2051,40.7782],[-119.20543,40.77823],[-119.20576,40.77826],[-119.20608,40.7783],[-119.2064,40.77835],[-119.20673,40.7784],[-119.20703,40.77846],[-119.2068,40.77912]],[[-119.20375,40.77821],[-119.20377,40.77825],[-119.2038,40.77829],[-119.20383,40.77832],[-119.20388,40.77835],[-119.20393,40.77837],[-119.20398,40.77839],[-119.204,40.77839],[-119.20396,40.77886],[-119.20376,40.77886],[-119.20376,40.77886],[-119.20344,40.77887],[-119.20344,40.77887],[-119.20313,40.77889],[-119.20313,40.77889],[-119.20281,40.77892],[-119.20281,40.77892],[-119.2025,40.77895],[-119.2025,40.77895],[-119.20219,40.77899],[-119.20218,40.77899],[-119.20188,40.77904],[-119.20187,40.77904],[-119.20157,40.77909],[-119.20157,40.77909],[-119.20139,40.77912],[-119.20116,40.77846],[-119.20118,40.77845],[-119.2015,40.7784],[-119.20182,40.77834],[-119.20215,40.7783],[-119.20247,40.77826],[-119.2028,40.77823],[-119.20313,40.7782],[-119.20346,40.77818],[-119.20374,40.77818],[-119.20375,40.77821]],[[-119.20128,40.77914],[-119.20126,40.77915],[-119.20126,40.77915],[-119.20096,40.77922],[-119.20096,40.77922],[-119.20066,40.77929],[-119.20065,40.77929],[-119.20036,40.77937],[-119.20036,40.77937],[-119.20006,40.77946],[-119.20006,40.77946],[-119.19977,40.77955],[-119.19977,40.77955],[-119.19949,40.77965],[-119.19948,40.77966],[-119.1992,40.77976],[-119.1992,40.77976],[-119.19892,40.77988],[-119.19892,40.77988],[-119.19881,40.77992],[-119.19836,40.77933],[-119.19844,40.77929],[-119.19873,40.77917],[-119.19902,40.77906],[-119.19932,40.77895],[-119.19962,40.77885],[-119.19993,40.77876],[-119.20024,40.77867],[-119.20055,40.77859],[-119.20087,40.77852],[-119.20105,40.77848],[-119.20128,40.77914]],[[-119.19872,40.77996],[-119.19865,40.78],[-119.19865,40.78],[-119.19838,40.78012],[-119.19838,40.78012],[-119.19811,40.78025],[-119.19811,40.78025],[-119.19786,40.78039],[-119.19785,40.78039],[-119.1976,40.78053],[-119.1976,40.78054],[-119.19735,40.78068],[-119.19735,40.78069],[-119.19711,40.78084],[-119.19711,40.78084],[-119.19688,40.781],[-119.19687,40.781],[-119.19666,40.78116],[-119.1962,40.78085],[-119.19621,40.78083],[-119.19623,40.78079],[-119.19624,40.78075],[-119.19625,40.7807],[-119.19624,40.78066],[-119.19622,40.78062],[-119.1962,40.78058],[-119.19618,40.78056],[-119.19631,40.78046],[-119.19656,40.7803],[-119.19681,40.78014],[-119.19707,40.77998],[-119.19733,40.77983],[-119.1976,40.77969],[-119.19788,40.77955],[-119.19816,40.77942],[-119.19827,40.77937],[-119.19872,40.77996]],[[-119.19782,40.77948],[-119.19782,40.77948],[-119.19754,40.77962],[-119.19754,40.77962],[-119.19727,40.77977],[-119.19727,40.77977],[-119.197,40.77992],[-119.197,40.77992],[-119.19674,40.78007],[-119.19674,40.78007],[-119.19649,40.78023],[-119.19649,40.78024],[-119.19624,40.7804],[-119.19624,40.7804],[-119.1961,40.7805],[-119.19608,40.78048],[-119.19603,40.78046],[-119.19597,40.78045],[-119.19591,40.78044],[-119.19586,40.78044],[-119.1958,40.78045],[-119.19574,40.78046],[-119.19571,40.78048],[-119.19531,40.78013],[-119.19542,40.78004],[-119.19568,40.77986],[-119.19593,40.77969],[-119.1962,40.77952],[-119.19647,40.77936],[-119.19675,40.77921],[-119.19703,40.77906],[-119.19731,40.77891],[-119.19761,40.77877],[-119.19776,40.7787],[-119.19822,40.7793],[-119.1981,40.77935],[-119.1981,40.77935],[-119.19782,40.77948]],[[-119.19726,40.77884],[-119.19726,40.77884],[-119.19697,40.77899],[-119.19697,40.77899],[-119.19668,40.77914],[-119.19668,40.77914],[-119.1964,40.7793],[-119.1964,40.7793],[-119.19613,40.77946],[-119.19613,40.77946],[-119.19586,40.77963],[-119.19586,40.77963],[-119.1956,40.7798],[-119.1956,40.7798],[-119.19535,40.77998],[-119.19535,40.77998],[-119.19518,40.7801],[-119.19454,40.77962],[-119.19478,40.77944],[-119.19505,40.77926],[-119.19532,40.77908],[-119.19559,40.77891],[-119.19587,40.77874],[-119.19616,40.77858],[-119.19645,40.77842],[-119.19675,40.77827],[-119.19706,40.77813],[-119.19726,40.77804],[-119.19771,40.77863],[-119.19755,40.7787],[-119.19755,40.7787],[-119.19726,40.77884]],[[-119.197,40.77806],[-119.197,40.77806],[-119.19669,40.7782],[-119.19669,40.7782],[-119.19639,40.77835],[-119.19639,40.77836],[-119.1961,40.77851],[-119.1961,40.77851],[-119.19581,40.77868],[-119.19581,40.77868],[-119.19552,40.77884],[-119.19552,40.77884],[-119.19525,40.77902],[-119.19524,40.77902],[-119.19497,40.7792],[-119.19497,40.7792],[-119.19471,40.77938],[-119.19471,40.77938],[-119.19447,40.77956],[-119.19383,40.77907],[-119.19388,40.77904],[-119.19414,40.77884],[-119.19442,40.77865],[-119.1947,40.77847],[-119.19499,40.77829],[-119.19528,40.77812],[-119.19558,40.77795],[-119.19588,40.77779],[-119.19619,40.77764],[-119.1965,40.77749],[-119.19675,40.77737],[-119.1972,40.77797],[-119.197,40.77806]],[[-119.19645,40.77742],[-119.19644,40.77742],[-119.19613,40.77757],[-119.19613,40.77757],[-119.19582,40.77772],[-119.19582,40.77772],[-119.19551,40.77789],[-119.19551,40.77789],[-119.19521,40.77805],[-119.19521,40.77805],[-119.19492,40.77823],[-119.19492,40.77823],[-119.19463,40.77841],[-119.19463,40.77841],[-119.19435,40.77859],[-119.19435,40.77859],[-119.19407,40.77878],[-119.19407,40.77878],[-119.1938,40.77898],[-119.1938,40.77898],[-119.19375,40.77902],[-119.1926,40.77814],[-119.19287,40.77795],[-119.19315,40.77775],[-119.19345,40.77755],[-119.19375,40.77736],[-119.19405,40.77717],[-119.19436,40.77699],[-119.19468,40.77682],[-119.195,40.77665],[-119.19533,40.77649],[-119.19566,40.77633],[-119.19589,40.77623],[-119.1967,40.7773],[-119.19645,40.77742]],[[-119.19243,40.77816],[-119.19224,40.77831],[-119.19223,40.77831],[-119.19197,40.77853],[-119.19197,40.77853],[-119.1917,40.77875],[-119.1917,40.77875],[-119.19145,40.77898],[-119.19145,40.77898],[-119.1912,40.77921],[-119.1912,40.77921],[-119.1911,40.77931],[-119.19039,40.77889],[-119.19062,40.77866],[-119.19088,40.77843],[-119.19115,40.7782],[-119.19142,40.77797],[-119.19159,40.77783],[-119.19163,40.77785],[-119.19169,40.77787],[-119.19174,40.77788],[-119.1918,40.77788],[-119.19186,40.77788],[-119.19191,40.77787],[-119.19197,40.77785],[-119.192,40.77784],[-119.19243,40.77816]],[[-119.19102,40.7794],[-119.19096,40.77945],[-119.19096,40.77945],[-119.19073,40.77969],[-119.19073,40.77969],[-119.1905,40.77993],[-119.1905,40.77993],[-119.19029,40.78018],[-119.19029,40.78018],[-119.19008,40.78044],[-119.19008,40.78044],[-119.1899,40.78066],[-119.18912,40.78032],[-119.18924,40.78017],[-119.18945,40.77991],[-119.18967,40.77965],[-119.1899,40.7794],[-119.19013,40.77915],[-119.1903,40.77898],[-119.19102,40.7794]],[[-119.19004,40.7791],[-119.19004,40.7791],[-119.18981,40.77935],[-119.18981,40.77935],[-119.18958,40.7796],[-119.18958,40.7796],[-119.18936,40.77986],[-119.18936,40.77986],[-119.18914,40.78013],[-119.18914,40.78013],[-119.18903,40.78028],[-119.18824,40.77993],[-119.1883,40.77986],[-119.18851,40.77959],[-119.18874,40.77933],[-119.18897,40.77906],[-119.18921,40.77881],[-119.18945,40.77855],[-119.1895,40.77851],[-119.19021,40.77893],[-119.19004,40.7791]],[[-119.18912,40.77876],[-119.18912,40.77876],[-119.18888,40.77902],[-119.18888,40.77902],[-119.18865,40.77928],[-119.18865,40.77928],[-119.18842,40.77955],[-119.18842,40.77955],[-119.18821,40.77982],[-119.18821,40.77982],[-119.18815,40.77989],[-119.18737,40.77955],[-119.18758,40.77928],[-119.1878,40.77901],[-119.18804,40.77874],[-119.18828,40.77847],[-119.18853,40.77821],[-119.1887,40.77804],[-119.18941,40.77846],[-119.18937,40.7785],[-119.18937,40.7785],[-119.18912,40.77876]],[[-119.18878,40.77795],[-119.18879,40.77795],[-119.18905,40.7777],[-119.18932,40.77745],[-119.1896,40.7772],[-119.18989,40.77696],[-119.19018,40.77672],[-119.19036,40.77659],[-119.191,40.77708],[-119.19072,40.77729],[-119.19072,40.77729],[-119.19043,40.77752],[-119.19043,40.77752],[-119.19016,40.77776],[-119.19016,40.77776],[-119.18989,40.778],[-119.18989,40.778],[-119.18962,40.77825],[-119.18962,40.77825],[-119.1895,40.77837],[-119.18878,40.77795]],[[-119.19046,40.77651],[-119.19048,40.77649],[-119.19079,40.77627],[-119.1911,40.77605],[-119.19142,40.77583],[-119.19175,40.77562],[-119.19208,40.77542],[-119.19226,40.77532],[-119.1928,40.77586],[-119.19256,40.776],[-119.19256,40.776],[-119.19224,40.7762],[-119.19224,40.77621],[-119.19192,40.77641],[-119.19192,40.77641],[-119.19161,40.77662],[-119.19161,40.77662],[-119.19131,40.77684],[-119.19131,40.77684],[-119.1911,40.777],[-119.19046,40.77651]],[[-119.19237,40.77525],[-119.19242,40.77522],[-119.19276,40.77503],[-119.19311,40.77484],[-119.19346,40.77466],[-119.19382,40.77448],[-119.19419,40.77432],[-119.19437,40.77423],[-119.19482,40.77483],[-119.19462,40.77492],[-119.19462,40.77492],[-119.19426,40.77508],[-119.19426,40.77508],[-119.19391,40.77526],[-119.19391,40.77526],[-119.19357,40.77543],[-119.19357,40.77543],[-119.19323,40.77562],[-119.19323,40.77562],[-119.19292,40.77579],[-119.19237,40.77525]],[[-119.19446,40.77419],[-119.19456,40.77415],[-119.19493,40.774],[-119.19531,40.77385],[-119.19569,40.7737],[-119.19608,40.77356],[-119.19647,40.77343],[-119.19665,40.77337],[-119.197,40.77401],[-119.19685,40.77405],[-119.19685,40.77405],[-119.19647,40.77418],[-119.19647,40.77418],[-119.19609,40.77432],[-119.19609,40.77432],[-119.19572,40.77446],[-119.19572,40.77446],[-119.19535,40.7746],[-119.19535,40.7746],[-119.19498,40.77476],[-119.19498,40.77476],[-119.19492,40.77479],[-119.19446,40.77419]],[[-119.19672,40.77335],[-119.19686,40.77331],[-119.19726,40.77319],[-119.19766,40.77308],[-119.19806,40.77297],[-119.19847,40.77288],[-119.19888,40.77279],[-119.19903,40.77275],[-119.19927,40.77342],[-119.19922,40.77343],[-119.19922,40.77343],[-119.19882,40.77351],[-119.19882,40.77351],[-119.19842,40.77361],[-119.19842,40.77361],[-119.19802,40.77371],[-119.19802,40.77371],[-119.19763,40.77382],[-119.19763,40.77382],[-119.19724,40.77393],[-119.19724,40.77393],[-119.19707,40.77399],[-119.19672,40.77335]],[[-119.19914,40.77273],[-119.19929,40.7727],[-119.19971,40.77263],[-119.20012,40.77256],[-119.20054,40.77249],[-119.20096,40.77244],[-119.20138,40.77239],[-119.20153,40.77237],[-119.20165,40.77305],[-119.20126,40.77309],[-119.20126,40.77309],[-119.20085,40.77315],[-119.20085,40.77315],[-119.20044,40.77321],[-119.20044,40.77321],[-119.20003,40.77327],[-119.20003,40.77327],[-119.19962,40.77335],[-119.19962,40.77335],[-119.19937,40.7734],[-119.19914,40.77273]],[[-119.2016,40.77237],[-119.20181,40.77235],[-119.20223,40.77231],[-119.20266,40.77228],[-119.20308,40.77226],[-119.20351,40.77225],[-119.20393,40.77224],[-119.20402,40.77224],[-119.20402,40.77293],[-119.20376,40.77293],[-119.20375,40.77293],[-119.20334,40.77294],[-119.20334,40.77294],[-119.20292,40.77296],[-119.20292,40.77296],[-119.2025,40.77298],[-119.2025,40.77298],[-119.20209,40.77301],[-119.20209,40.77301],[-119.20172,40.77305],[-119.2016,40.77237]],[[-119.20417,40.77224],[-119.20436,40.77224],[-119.20479,40.77225],[-119.20521,40.77227],[-119.20564,40.77229],[-119.20606,40.77232],[-119.20649,40.77236],[-119.20658,40.77237],[-119.20647,40.77305],[-119.20626,40.77303],[-119.20626,40.77302],[-119.20584,40.77299],[-119.20584,40.77299],[-119.20542,40.77296],[-119.20542,40.77296],[-119.20501,40.77295],[-119.20501,40.77295],[-119.20459,40.77293],[-119.20459,40.77293],[-119.20417,40.77293],[-119.20417,40.77293],[-119.20417,40.77293],[-119.20417,40.77224]],[[-119.20666,40.77237],[-119.20691,40.7724],[-119.20733,40.77245],[-119.20775,40.77251],[-119.20817,40.77257],[-119.20859,40.77264],[-119.209,40.77272],[-119.20905,40.77273],[-119.20882,40.7734],[-119.20872,40.77338],[-119.20872,40.77338],[-119.20831,40.7733],[-119.20831,40.7733],[-119.20791,40.77323],[-119.2079,40.77323],[-119.2075,40.77317],[-119.20749,40.77317],[-119.20708,40.77311],[-119.20708,40.77311],[-119.20667,40.77307],[-119.20667,40.77307],[-119.20654,40.77305],[-119.20666,40.77237]],[[-119.20915,40.77275],[-119.20941,40.77281],[-119.20982,40.7729],[-119.21023,40.773],[-119.21063,40.77311],[-119.21103,40.77322],[-119.21143,40.77334],[-119.21147,40.77335],[-119.21112,40.77399],[-119.2111,40.77398],[-119.21109,40.77398],[-119.21071,40.77386],[-119.21071,40.77386],[-119.21031,40.77375],[-119.21031,40.77375],[-119.20992,40.77365],[-119.20992,40.77365],[-119.20952,40.77355],[-119.20952,40.77355],[-119.20912,40.77346],[-119.20912,40.77346],[-119.20892,40.77342],[-119.20915,40.77275]],[[-119.21153,40.77337],[-119.21182,40.77346],[-119.21221,40.7736],[-119.21259,40.77374],[-119.21298,40.77388],[-119.21335,40.77403],[-119.21371,40.77419],[-119.21326,40.77478],[-119.21298,40.77466],[-119.21298,40.77466],[-119.21261,40.77451],[-119.21261,40.77451],[-119.21224,40.77437],[-119.21224,40.77437],[-119.21186,40.77423],[-119.21186,40.77423],[-119.21148,40.7741],[-119.21148,40.7741],[-119.21119,40.77401],[-119.21153,40.77337]],[[-119.21389,40.77417],[-119.21416,40.77381],[-119.21431,40.77388],[-119.21468,40.77405],[-119.21504,40.77423],[-119.2154,40.77441],[-119.21576,40.7746],[-119.21611,40.7748],[-119.21621,40.77486],[-119.21588,40.77518],[-119.21558,40.77501],[-119.21558,40.77501],[-119.21523,40.77482],[-119.21523,40.77482],[-119.21487,40.77464],[-119.21487,40.77464],[-119.21451,40.77446],[-119.21451,40.77446],[-119.21415,40.77429],[-119.21415,40.77429],[-119.21389,40.77417]],[[-119.21633,40.77492],[-119.21645,40.775],[-119.21679,40.7752],[-119.21712,40.77542],[-119.21745,40.77563],[-119.21777,40.77586],[-119.21808,40.77609],[-119.21819,40.77616],[-119.2178,40.77645],[-119.21755,40.77626],[-119.21755,40.77626],[-119.21724,40.77604],[-119.21724,40.77604],[-119.21692,40.77582],[-119.21692,40.77582],[-119.21659,40.77561],[-119.21659,40.77561],[-119.21626,40.77541],[-119.21626,40.7754],[-119.216,40.77525],[-119.21633,40.77492]],[[-119.21837,40.77618],[-119.21875,40.77589],[-119.21901,40.77609],[-119.21931,40.77634],[-119.2196,40.77659],[-119.21989,40.77684],[-119.22017,40.7771],[-119.22044,40.77735],[-119.22001,40.7776],[-119.21991,40.77751],[-119.21991,40.77751],[-119.21964,40.77725],[-119.21963,40.77725],[-119.21935,40.77699],[-119.21935,40.77699],[-119.21907,40.77675],[-119.21907,40.77674],[-119.21877,40.7765],[-119.21877,40.7765],[-119.21847,40.77626],[-119.21847,40.77626],[-119.21837,40.77618]],[[-119.21839,40.77632],[-119.21869,40.77656],[-119.21899,40.7768],[-119.21927,40.77705],[-119.21955,40.7773],[-119.21982,40.77756],[-119.21992,40.77765],[-119.21949,40.7779],[-119.21929,40.77771],[-119.21929,40.77771],[-119.21902,40.77745],[-119.21901,40.77745],[-119.21874,40.77721],[-119.21874,40.77721],[-119.21845,40.77696],[-119.21845,40.77696],[-119.21816,40.77673],[-119.21816,40.77673],[-119.21791,40.77653],[-119.21829,40.77624],[-119.21839,40.77632]],[[-119.22001,40.77774],[-119.22009,40.77782],[-119.22035,40.77809],[-119.22059,40.77836],[-119.22084,40.77863],[-119.22107,40.77891],[-119.2213,40.77919],[-119.22138,40.7793],[-119.22091,40.77951],[-119.22076,40.77931],[-119.22076,40.77931],[-119.22053,40.77903],[-119.22053,40.77903],[-119.2203,40.77876],[-119.2203,40.77876],[-119.22006,40.77849],[-119.22006,40.77849],[-119.21981,40.77823],[-119.21981,40.77822],[-119.21958,40.77799],[-119.22001,40.77774]],[[-119.22145,40.7794],[-119.22151,40.77948],[-119.22172,40.77976],[-119.22192,40.78006],[-119.22212,40.78035],[-119.2223,40.78065],[-119.22248,40.78095],[-119.22256,40.78111],[-119.22206,40.78127],[-119.22194,40.78105],[-119.22194,40.78105],[-119.22176,40.78075],[-119.22176,40.78075],[-119.22158,40.78046],[-119.22158,40.78046],[-119.22139,40.78016],[-119.22139,40.78016],[-119.22119,40.77988],[-119.22119,40.77988],[-119.22099,40.7796],[-119.22145,40.7794]],[[-119.22109,40.77992],[-119.22129,40.7802],[-119.22148,40.78049],[-119.22167,40.78078],[-119.22184,40.78108],[-119.22196,40.7813],[-119.22113,40.78156],[-119.221,40.78134],[-119.221,40.78134],[-119.22083,40.78105],[-119.22083,40.78105],[-119.22065,40.78076],[-119.22065,40.78076],[-119.22046,40.78048],[-119.22046,40.78048],[-119.22027,40.7802],[-119.22027,40.7802],[-119.22011,40.77999],[-119.22089,40.77965],[-119.22109,40.77992]],[[-119.22017,40.78024],[-119.22037,40.78052],[-119.22056,40.7808],[-119.22073,40.78108],[-119.22091,40.78137],[-119.22103,40.78159],[-119.22019,40.78186],[-119.22007,40.78163],[-119.22007,40.78163],[-119.2199,40.78135],[-119.2199,40.78135],[-119.21973,40.78107],[-119.21973,40.78107],[-119.21954,40.7808],[-119.21954,40.7808],[-119.21935,40.78053],[-119.21935,40.78053],[-119.21923,40.78037],[-119.22002,40.78003],[-119.22017,40.78024]],[[-119.22106,40.78164],[-119.22107,40.78166],[-119.22122,40.78196],[-119.22136,40.78225],[-119.2215,40.78255],[-119.22163,40.78285],[-119.22175,40.78315],[-119.2218,40.78331],[-119.22093,40.78348],[-119.22089,40.78337],[-119.22089,40.78337],[-119.22077,40.78308],[-119.22077,40.78308],[-119.22065,40.78278],[-119.22065,40.78278],[-119.22052,40.78249],[-119.22052,40.78249],[-119.22038,40.7822],[-119.22038,40.7822],[-119.22023,40.78192],[-119.22023,40.78192],[-119.22022,40.78191],[-119.22106,40.78164]],[[-119.22013,40.78195],[-119.22028,40.78223],[-119.22042,40.78252],[-119.22055,40.78281],[-119.22067,40.7831],[-119.22078,40.7834],[-119.22082,40.7835],[-119.21995,40.78368],[-119.21993,40.78361],[-119.21993,40.78361],[-119.21982,40.78333],[-119.21982,40.78333],[-119.2197,40.78304],[-119.2197,40.78304],[-119.21957,40.78276],[-119.21957,40.78276],[-119.21943,40.78248],[-119.21943,40.78248],[-119.21929,40.7822],[-119.21929,40.7822],[-119.21929,40.7822],[-119.22012,40.78194],[-119.22013,40.78195]],[[-119.21926,40.78215],[-119.21913,40.78193],[-119.21913,40.78193],[-119.21897,40.78165],[-119.21897,40.78165],[-119.2188,40.78138],[-119.2188,40.78138],[-119.21862,40.78112],[-119.21862,40.78112],[-119.21843,40.78086],[-119.21843,40.78086],[-119.21836,40.78076],[-119.21914,40.78041],[-119.21925,40.78057],[-119.21945,40.78084],[-119.21963,40.78111],[-119.2198,40.78139],[-119.21997,40.78167],[-119.22009,40.78189],[-119.21926,40.78215]],[[-119.21819,40.7807],[-119.21679,40.78132],[-119.21667,40.78117],[-119.21667,40.78117],[-119.21647,40.78093],[-119.21647,40.78093],[-119.21627,40.78069],[-119.21627,40.78069],[-119.21605,40.78046],[-119.21605,40.78046],[-119.21583,40.78023],[-119.21583,40.78023],[-119.2156,40.78001],[-119.2156,40.78001],[-119.21537,40.77979],[-119.21537,40.77979],[-119.21512,40.77957],[-119.21512,40.77957],[-119.21487,40.77936],[-119.21487,40.77936],[-119.21462,40.77916],[-119.21462,40.77916],[-119.21454,40.77909],[-119.21569,40.77822],[-119.21577,40.77829],[-119.21604,40.7785],[-119.2163,40.77872],[-119.21656,40.77895],[-119.21681,40.77918],[-119.21705,40.77941],[-119.21728,40.77965],[-119.21751,40.77989],[-119.21773,40.78013],[-119.21794,40.78038],[-119.21814,40.78064],[-119.21819,40.7807]],[[-119.21454,40.77921],[-119.21479,40.77942],[-119.21504,40.77963],[-119.21528,40.77984],[-119.21552,40.78006],[-119.21575,40.78028],[-119.21596,40.78051],[-119.21618,40.78074],[-119.21638,40.78097],[-119.21658,40.78121],[-119.21669,40.78136],[-119.21591,40.78171],[-119.21587,40.78165],[-119.21587,40.78165],[-119.21568,40.78142],[-119.21568,40.78142],[-119.21548,40.78119],[-119.21548,40.78119],[-119.21528,40.78096],[-119.21528,40.78096],[-119.21507,40.78074],[-119.21507,40.78074],[-119.21485,40.78052],[-119.21485,40.78052],[-119.21462,40.78031],[-119.21462,40.78031],[-119.21439,40.7801],[-119.21439,40.7801],[-119.21415,40.7799],[-119.21415,40.77989],[-119.2139,40.7797],[-119.2139,40.7797],[-119.21382,40.77964],[-119.21446,40.77915],[-119.21454,40.77921]],[[-119.21519,40.78101],[-119.21539,40.78123],[-119.21559,40.78146],[-119.21577,40.78169],[-119.21582,40.78175],[-119.21503,40.78209],[-119.21488,40.7819],[-119.21488,40.7819],[-119.2147,40.78167],[-119.2147,40.78167],[-119.2145,40.78146],[-119.2145,40.78146],[-119.21442,40.78137],[-119.21515,40.78097],[-119.21519,40.78101]],[[-119.21441,40.7815],[-119.21461,40.78172],[-119.21479,40.78194],[-119.21494,40.78213],[-119.21416,40.78247],[-119.21408,40.78237],[-119.21408,40.78237],[-119.2139,40.78216],[-119.2139,40.78216],[-119.21372,40.78195],[-119.21372,40.78195],[-119.2136,40.78182],[-119.2136,40.78181],[-119.21433,40.78142],[-119.21441,40.7815]],[[-119.21344,40.78179],[-119.21347,40.78182],[-119.21347,40.78182],[-119.21273,40.78222],[-119.21256,40.78204],[-119.21256,40.78204],[-119.21237,40.78185],[-119.21237,40.78185],[-119.21224,40.78174],[-119.21228,40.78172],[-119.21235,40.78168],[-119.21242,40.78163],[-119.21249,40.78158],[-119.21254,40.78152],[-119.21259,40.78146],[-119.21263,40.78139],[-119.21266,40.78133],[-119.21268,40.78126],[-119.21269,40.78119],[-119.21269,40.78112],[-119.21269,40.78108],[-119.21283,40.7812],[-119.21304,40.78139],[-119.21324,40.78159],[-119.21344,40.78179]],[[-119.21353,40.78174],[-119.21353,40.78174],[-119.21333,40.78154],[-119.21333,40.78154],[-119.21312,40.78134],[-119.21312,40.78134],[-119.21291,40.78115],[-119.21291,40.78115],[-119.21269,40.78096],[-119.21269,40.78096],[-119.21265,40.78093],[-119.21264,40.78091],[-119.21261,40.78084],[-119.21256,40.78078],[-119.21251,40.78072],[-119.21246,40.78067],[-119.21303,40.78024],[-119.2131,40.78029],[-119.21334,40.78048],[-119.21357,40.78068],[-119.21379,40.78088],[-119.214,40.78108],[-119.21421,40.78129],[-119.21429,40.78137],[-119.21356,40.78177],[-119.21353,40.78174]],[[-119.21236,40.78059],[-119.21232,40.78057],[-119.21224,40.78053],[-119.21216,40.78049],[-119.21207,40.78046],[-119.21202,40.78045],[-119.21198,40.78042],[-119.21198,40.78042],[-119.21173,40.78026],[-119.21173,40.78025],[-119.21148,40.78009],[-119.21148,40.78009],[-119.21122,40.77994],[-119.21122,40.77994],[-119.21095,40.77978],[-119.21095,40.77978],[-119.21092,40.77976],[-119.21144,40.77921],[-119.21155,40.77926],[-119.21182,40.77942],[-119.21209,40.77959],[-119.21235,40.77975],[-119.21261,40.77993],[-119.21286,40.78011],[-119.21293,40.78016],[-119.21236,40.78059]],[[-119.21085,40.77973],[-119.21085,40.77973],[-119.21068,40.77964],[-119.21068,40.77964],[-119.21041,40.7795],[-119.2104,40.7795],[-119.21012,40.77937],[-119.21012,40.77936],[-119.20999,40.77931],[-119.21044,40.77871],[-119.21069,40.77882],[-119.21098,40.77897],[-119.21127,40.77911],[-119.21138,40.77917],[-119.21085,40.77973]],[[-119.20986,40.77925],[-119.20984,40.77924],[-119.20983,40.77924],[-119.20954,40.77912],[-119.20954,40.77912],[-119.20925,40.779],[-119.20925,40.779],[-119.20895,40.77889],[-119.20895,40.77889],[-119.20864,40.77879],[-119.20864,40.77879],[-119.20834,40.7787],[-119.20834,40.7787],[-119.20802,40.77861],[-119.20802,40.77861],[-119.20771,40.77853],[-119.20771,40.77853],[-119.20739,40.77845],[-119.20739,40.77845],[-119.20716,40.7784],[-119.2074,40.77774],[-119.20755,40.77777],[-119.20788,40.77785],[-119.20821,40.77793],[-119.20853,40.77802],[-119.20885,40.77811],[-119.20917,40.77822],[-119.20948,40.77833],[-119.20979,40.77844],[-119.2101,40.77856],[-119.21031,40.77866],[-119.20986,40.77925]],[[-119.20706,40.77838],[-119.20675,40.77832],[-119.20675,40.77832],[-119.20643,40.77827],[-119.20642,40.77827],[-119.2061,40.77822],[-119.2061,40.77822],[-119.20577,40.77818],[-119.20577,40.77818],[-119.20544,40.77815],[-119.20544,40.77815],[-119.20511,40.77812],[-119.20511,40.77812],[-119.20478,40.7781],[-119.20478,40.7781],[-119.20445,40.77809],[-119.20445,40.77808],[-119.20443,40.77803],[-119.20441,40.77799],[-119.20437,40.77796],[-119.20433,40.77792],[-119.20429,40.7779],[-119.20424,40.77788],[-119.20418,40.77786],[-119.20417,40.77786],[-119.20417,40.7774],[-119.2045,40.77741],[-119.20485,40.77742],[-119.20519,40.77744],[-119.20553,40.77747],[-119.20587,40.7775],[-119.20621,40.77754],[-119.20655,40.77759],[-119.20689,40.77764],[-119.20722,40.7777],[-119.20729,40.77772],[-119.20706,40.77838]],[[-119.20402,40.77786],[-119.20401,40.77786],[-119.20395,40.77788],[-119.2039,40.7779],[-119.20385,40.77792],[-119.20381,40.77796],[-119.20378,40.77799],[-119.20376,40.77803],[-119.20374,40.77808],[-119.20374,40.77809],[-119.20345,40.7781],[-119.20345,40.7781],[-119.20312,40.77812],[-119.20312,40.77812],[-119.20279,40.77814],[-119.20279,40.77814],[-119.20246,40.77818],[-119.20246,40.77818],[-119.20213,40.77822],[-119.20213,40.77822],[-119.2018,40.77826],[-119.2018,40.77826],[-119.20148,40.77831],[-119.20148,40.77831],[-119.20116,40.77837],[-119.20115,40.77838],[-119.20113,40.77838],[-119.20089,40.77772],[-119.20109,40.77768],[-119.20143,40.77762],[-119.20176,40.77757],[-119.2021,40.77752],[-119.20244,40.77749],[-119.20278,40.77745],[-119.20313,40.77743],[-119.20347,40.77741],[-119.20381,40.77741],[-119.20402,40.7774],[-119.20402,40.77786]],[[-119.20102,40.7784],[-119.20084,40.77844],[-119.20083,40.77844],[-119.20052,40.77852],[-119.20052,40.77852],[-119.2002,40.7786],[-119.2002,40.7786],[-119.19989,40.77868],[-119.19989,40.77868],[-119.19958,40.77878],[-119.19958,40.77878],[-119.19928,40.77888],[-119.19928,40.77888],[-119.19898,40.77899],[-119.19898,40.77899],[-119.19868,40.7791],[-119.19868,40.7791],[-119.19839,40.77922],[-119.19839,40.77922],[-119.19831,40.77926],[-119.19786,40.77866],[-119.1979,40.77864],[-119.19821,40.77852],[-119.19851,40.7784],[-119.19882,40.77828],[-119.19914,40.77818],[-119.19945,40.77808],[-119.19978,40.77798],[-119.2001,40.7779],[-119.20043,40.77782],[-119.20076,40.77775],[-119.20079,40.77774],[-119.20102,40.7784]],[[-119.2004,40.77774],[-119.2004,40.77774],[-119.20007,40.77782],[-119.20007,40.77782],[-119.19974,40.77791],[-119.19974,40.77791],[-119.19941,40.778],[-119.19941,40.778],[-119.19909,40.7781],[-119.19909,40.7781],[-119.19878,40.77821],[-119.19878,40.77821],[-119.19846,40.77832],[-119.19846,40.77832],[-119.19816,40.77844],[-119.19815,40.77844],[-119.19785,40.77857],[-119.19785,40.77857],[-119.1978,40.77859],[-119.19735,40.778],[-119.19736,40.77799],[-119.19768,40.77786],[-119.19799,40.77773],[-119.19832,40.77762],[-119.19864,40.7775],[-119.19897,40.7774],[-119.1993,40.7773],[-119.19964,40.77721],[-119.19998,40.77712],[-119.20032,40.77704],[-119.20053,40.777],[-119.20076,40.77766],[-119.20073,40.77767],[-119.20073,40.77767],[-119.2004,40.77774]],[[-119.19995,40.77704],[-119.19995,40.77704],[-119.1996,40.77713],[-119.1996,40.77713],[-119.19927,40.77722],[-119.19926,40.77722],[-119.19893,40.77732],[-119.19893,40.77732],[-119.1986,40.77743],[-119.1986,40.77743],[-119.19827,40.77754],[-119.19827,40.77754],[-119.19795,40.77766],[-119.19794,40.77766],[-119.19763,40.77779],[-119.19762,40.77779],[-119.19731,40.77792],[-119.19731,40.77792],[-119.1973,40.77792],[-119.19685,40.77733],[-119.19714,40.77721],[-119.19747,40.77707],[-119.1978,40.77695],[-119.19814,40.77683],[-119.19848,40.77672],[-119.19882,40.77661],[-119.19917,40.77652],[-119.19952,40.77642],[-119.19987,40.77634],[-119.20023,40.77626],[-119.20027,40.77625],[-119.2005,40.77692],[-119.20029,40.77696],[-119.20029,40.77696],[-119.19995,40.77704]],[[-119.19984,40.77626],[-119.19984,40.77626],[-119.19949,40.77635],[-119.19949,40.77635],[-119.19913,40.77644],[-119.19913,40.77644],[-119.19878,40.77654],[-119.19878,40.77654],[-119.19844,40.77664],[-119.19844,40.77664],[-119.1981,40.77676],[-119.19809,40.77676],[-119.19776,40.77687],[-119.19776,40.77688],[-119.19742,40.777],[-119.19742,40.777],[-119.19709,40.77713],[-119.19709,40.77713],[-119.19679,40.77726],[-119.19598,40.77619],[-119.196,40.77618],[-119.19634,40.77604],[-119.19668,40.7759],[-119.19703,40.77577],[-119.19739,40.77564],[-119.19775,40.77552],[-119.19811,40.77541],[-119.19847,40.77531],[-119.19884,40.77521],[-119.19921,40.77512],[-119.19959,40.77503],[-119.19982,40.77498],[-119.20024,40.77617],[-119.2002,40.77618],[-119.2002,40.77618],[-119.19984,40.77626]],[[-119.19583,40.77616],[-119.1956,40.77626],[-119.1956,40.77626],[-119.19527,40.77642],[-119.19527,40.77642],[-119.19494,40.77658],[-119.19494,40.77658],[-119.19462,40.77675],[-119.19462,40.77675],[-119.1943,40.77693],[-119.1943,40.77693],[-119.19415,40.77701],[-119.1936,40.77647],[-119.19382,40.77634],[-119.19415,40.77616],[-119.19449,40.77599],[-119.19482,40.77582],[-119.19517,40.77566],[-119.19538,40.77557],[-119.19583,40.77616]],[[-119.19404,40.77708],[-119.19399,40.77711],[-119.19398,40.77711],[-119.19368,40.7773],[-119.19368,40.7773],[-119.19338,40.77749],[-119.19338,40.77749],[-119.19308,40.77769],[-119.19308,40.77769],[-119.19279,40.77789],[-119.19279,40.77789],[-119.19253,40.77808],[-119.1921,40.77776],[-119.19213,40.77773],[-119.19215,40.77769],[-119.19216,40.77764],[-119.19216,40.7776],[-119.19215,40.77755],[-119.19214,40.77751],[-119.19211,40.77747],[-119.19209,40.77745],[-119.19227,40.77732],[-119.19257,40.77711],[-119.19288,40.77691],[-119.19319,40.77672],[-119.19349,40.77654],[-119.19404,40.77708]],[[-119.1915,40.77746],[-119.19149,40.77747],[-119.19146,40.77751],[-119.19145,40.77755],[-119.19144,40.7776],[-119.19144,40.77764],[-119.19145,40.77769],[-119.19147,40.77773],[-119.1915,40.77776],[-119.19151,40.77777],[-119.19134,40.77791],[-119.19134,40.77791],[-119.19107,40.77814],[-119.19106,40.77814],[-119.1908,40.77837],[-119.1908,40.77837],[-119.19054,40.77861],[-119.19054,40.77861],[-119.1903,40.77884],[-119.18959,40.77842],[-119.18971,40.7783],[-119.18997,40.77806],[-119.19024,40.77782],[-119.19051,40.77758],[-119.1908,40.77735],[-119.19107,40.77713],[-119.1915,40.77746]],[[-119.19117,40.77706],[-119.19138,40.7769],[-119.19169,40.77668],[-119.19199,40.77647],[-119.19231,40.77627],[-119.19263,40.77607],[-119.19287,40.77593],[-119.19342,40.77647],[-119.19312,40.77665],[-119.19312,40.77665],[-119.19281,40.77685],[-119.19281,40.77685],[-119.1925,40.77705],[-119.1925,40.77705],[-119.1922,40.77726],[-119.1922,40.77726],[-119.19202,40.77739],[-119.19199,40.77738],[-119.19194,40.77736],[-119.19189,40.77734],[-119.19183,40.77734],[-119.19177,40.77734],[-119.19171,40.77734],[-119.19166,40.77736],[-119.19161,40.77738],[-119.1916,40.77738],[-119.19117,40.77706]],[[-119.19298,40.77586],[-119.19329,40.77569],[-119.19363,40.7755],[-119.19397,40.77532],[-119.19432,40.77515],[-119.19468,40.77499],[-119.19488,40.7749],[-119.19533,40.77549],[-119.19511,40.77559],[-119.19511,40.77559],[-119.19477,40.77575],[-119.19477,40.77575],[-119.19443,40.77592],[-119.19442,40.77592],[-119.19409,40.77609],[-119.19409,40.77609],[-119.19376,40.77627],[-119.19376,40.77627],[-119.19353,40.7764],[-119.19298,40.77586]],[[-119.19497,40.77486],[-119.19503,40.77483],[-119.1954,40.77468],[-119.19577,40.77453],[-119.19614,40.77439],[-119.19651,40.77426],[-119.19689,40.77413],[-119.19704,40.77408],[-119.19739,40.77472],[-119.19728,40.77475],[-119.19728,40.77475],[-119.19691,40.77487],[-119.19691,40.77487],[-119.19654,40.775],[-119.19654,40.77501],[-119.19618,40.77514],[-119.19618,40.77514],[-119.19582,40.77528],[-119.19582,40.77529],[-119.19546,40.77543],[-119.19546,40.77543],[-119.19542,40.77545],[-119.19497,40.77486]],[[-119.19711,40.77406],[-119.19728,40.77401],[-119.19767,40.77389],[-119.19806,40.77379],[-119.19845,40.77369],[-119.19885,40.77359],[-119.19925,40.77351],[-119.19929,40.7735],[-119.19953,40.77416],[-119.19919,40.77423],[-119.19919,40.77423],[-119.1988,40.77432],[-119.1988,40.77432],[-119.19842,40.77442],[-119.19842,40.77442],[-119.19803,40.77452],[-119.19803,40.77452],[-119.19766,40.77463],[-119.19765,40.77463],[-119.19745,40.7747],[-119.19711,40.77406]],[[-119.1994,40.77348],[-119.19965,40.77343],[-119.20005,40.77335],[-119.20046,40.77329],[-119.20087,40.77323],[-119.20128,40.77318],[-119.20166,40.77313],[-119.20178,40.77381],[-119.20157,40.77384],[-119.20157,40.77384],[-119.20117,40.77389],[-119.20116,40.77389],[-119.20077,40.77394],[-119.20077,40.77394],[-119.20037,40.774],[-119.20037,40.774],[-119.19997,40.77407],[-119.19997,40.77407],[-119.19963,40.77414],[-119.1994,40.77348]],[[-119.20174,40.77313],[-119.2021,40.77309],[-119.20251,40.77306],[-119.20293,40.77304],[-119.20334,40.77302],[-119.20376,40.77301],[-119.20402,40.77301],[-119.20402,40.77347],[-119.20401,40.77347],[-119.20395,40.77349],[-119.2039,40.77351],[-119.20385,40.77353],[-119.20381,40.77356],[-119.20378,40.7736],[-119.20376,40.77364],[-119.20374,40.77368],[-119.20374,40.7737],[-119.20359,40.7737],[-119.20359,40.7737],[-119.20318,40.77372],[-119.20318,40.77372],[-119.20278,40.77373],[-119.20278,40.77373],[-119.20237,40.77376],[-119.20237,40.77376],[-119.20197,40.7738],[-119.20197,40.7738],[-119.20185,40.77381],[-119.20174,40.77313]],[[-119.20602,40.77378],[-119.20602,40.77378],[-119.20561,40.77375],[-119.20561,40.77375],[-119.20521,40.77372],[-119.20521,40.77372],[-119.2048,40.77371],[-119.2048,40.77371],[-119.20445,40.7737],[-119.20445,40.77368],[-119.20443,40.77364],[-119.20441,40.7736],[-119.20437,40.77356],[-119.20433,40.77353],[-119.20429,40.77351],[-119.20424,40.77349],[-119.20418,40.77347],[-119.20417,40.77347],[-119.20417,40.77301],[-119.20417,40.77301],[-119.20459,40.77302],[-119.205,40.77303],[-119.20542,40.77305],[-119.20583,40.77307],[-119.20624,40.77311],[-119.20645,40.77313],[-119.20633,40.77381],[-119.20602,40.77378]],[[-119.20652,40.77313],[-119.20666,40.77315],[-119.20707,40.77319],[-119.20747,40.77325],[-119.20788,40.77331],[-119.20829,40.77338],[-119.20869,40.77346],[-119.20879,40.77348],[-119.20856,40.77414],[-119.20841,40.77411],[-119.20841,40.77411],[-119.20802,40.77404],[-119.20802,40.77404],[-119.20762,40.77397],[-119.20762,40.77397],[-119.20722,40.77391],[-119.20722,40.77391],[-119.20682,40.77386],[-119.20682,40.77386],[-119.20642,40.77382],[-119.20642,40.77382],[-119.20641,40.77381],[-119.20652,40.77313]],[[-119.20889,40.7735],[-119.20909,40.77354],[-119.20949,40.77363],[-119.20989,40.77372],[-119.21028,40.77383],[-119.21067,40.77394],[-119.21105,40.77405],[-119.21108,40.77406],[-119.21073,40.7747],[-119.21072,40.77469],[-119.21072,40.77469],[-119.21034,40.77458],[-119.21034,40.77458],[-119.20996,40.77447],[-119.20996,40.77447],[-119.20958,40.77437],[-119.20958,40.77437],[-119.20919,40.77428],[-119.20919,40.77428],[-119.2088,40.77419],[-119.2088,40.77419],[-119.20866,40.77416],[-119.20889,40.7735]],[[-119.21115,40.77408],[-119.21144,40.77418],[-119.21181,40.77431],[-119.21219,40.77444],[-119.21256,40.77458],[-119.21293,40.77473],[-119.2132,40.77485],[-119.21275,40.77545],[-119.21255,40.77536],[-119.21255,40.77536],[-119.21219,40.77521],[-119.21219,40.77521],[-119.21183,40.77507],[-119.21183,40.77507],[-119.21147,40.77494],[-119.21146,40.77494],[-119.2111,40.77481],[-119.21109,40.77481],[-119.2108,40.77472],[-119.21115,40.77408]],[[-119.21338,40.77484],[-119.21383,40.77424],[-119.21409,40.77436],[-119.21446,40.77453],[-119.21481,40.7747],[-119.21517,40.77489],[-119.21551,40.77508],[-119.21582,40.77525],[-119.21527,40.77579],[-119.21509,40.77569],[-119.21509,40.77569],[-119.21475,40.7755],[-119.21475,40.7755],[-119.21441,40.77532],[-119.2144,40.77532],[-119.21406,40.77515],[-119.21405,40.77515],[-119.2137,40.77498],[-119.2137,40.77498],[-119.21338,40.77484]],[[-119.21593,40.77532],[-119.21619,40.77547],[-119.21652,40.77568],[-119.21685,40.77589],[-119.21716,40.7761],[-119.21747,40.77632],[-119.21773,40.77651],[-119.21709,40.777],[-119.21699,40.77692],[-119.21699,40.77692],[-119.21669,40.77671],[-119.21669,40.7767],[-119.21638,40.77649],[-119.21638,40.77649],[-119.21607,40.77628],[-119.21607,40.77628],[-119.21575,40.77608],[-119.21575,40.77608],[-119.21542,40.77588],[-119.21542,40.77588],[-119.21538,40.77586],[-119.21593,40.77532]],[[-119.21783,40.77659],[-119.21808,40.77678],[-119.21837,40.77702],[-119.21865,40.77726],[-119.21893,40.77751],[-119.2192,40.77776],[-119.2194,40.77795],[-119.21869,40.77837],[-119.21866,40.77835],[-119.21866,40.77834],[-119.2184,40.7781],[-119.2184,40.7781],[-119.21813,40.77785],[-119.21813,40.77785],[-119.21786,40.77761],[-119.21786,40.77761],[-119.21758,40.77738],[-119.21758,40.77738],[-119.21729,40.77715],[-119.21729,40.77715],[-119.21719,40.77708],[-119.21783,40.77659]],[[-119.21949,40.77804],[-119.21972,40.77827],[-119.21997,40.77854],[-119.22021,40.77881],[-119.22044,40.77908],[-119.22067,40.77935],[-119.22082,40.77955],[-119.22004,40.77989],[-119.21985,40.77965],[-119.21985,40.77965],[-119.21963,40.77938],[-119.21963,40.77938],[-119.2194,40.77912],[-119.2194,40.77912],[-119.21916,40.77886],[-119.21916,40.77885],[-119.21891,40.7786],[-119.21891,40.7786],[-119.21878,40.77846],[-119.21949,40.77804]],[[-119.21883,40.77865],[-119.21907,40.7789],[-119.21931,40.77916],[-119.21954,40.77943],[-119.21976,40.77969],[-119.21994,40.77993],[-119.21916,40.78028],[-119.21915,40.78026],[-119.21915,40.78026],[-119.21894,40.77999],[-119.21894,40.77999],[-119.21872,40.77973],[-119.21872,40.77973],[-119.2185,40.77948],[-119.2185,40.77948],[-119.21826,40.77922],[-119.21826,40.77922],[-119.21802,40.77898],[-119.21802,40.77898],[-119.21797,40.77893],[-119.21869,40.77851],[-119.21883,40.77865]],[[-119.21794,40.77902],[-119.21818,40.77927],[-119.21841,40.77952],[-119.21863,40.77978],[-119.21885,40.78004],[-119.21905,40.7803],[-119.21907,40.78032],[-119.21829,40.78066],[-119.21824,40.7806],[-119.21824,40.7806],[-119.21803,40.78034],[-119.21803,40.78034],[-119.21782,40.78009],[-119.21782,40.78009],[-119.2176,40.77984],[-119.2176,40.77984],[-119.21737,40.7796],[-119.21737,40.7796],[-119.21717,40.7794],[-119.21789,40.77898],[-119.21794,40.77902]],[[-119.21708,40.77931],[-119.21689,40.77912],[-119.21689,40.77912],[-119.21664,40.77889],[-119.21664,40.77889],[-119.21639,40.77867],[-119.21639,40.77867],[-119.21612,40.77845],[-119.21612,40.77845],[-119.21585,40.77823],[-119.21585,40.77823],[-119.21576,40.77816],[-119.21619,40.77784],[-119.21622,40.77785],[-119.21627,40.77787],[-119.21633,40.77788],[-119.21639,40.77788],[-119.21645,40.77788],[-119.2165,40.77787],[-119.21656,40.77785],[-119.2166,40.77783],[-119.21663,40.77786],[-119.21691,40.77808],[-119.21718,40.77831],[-119.21744,40.77854],[-119.21769,40.77878],[-119.2178,40.77889],[-119.21708,40.77931]],[[-119.21558,40.77814],[-119.21443,40.77902],[-119.21435,40.77896],[-119.21435,40.77895],[-119.21408,40.77876],[-119.21408,40.77876],[-119.21381,40.77857],[-119.21381,40.77857],[-119.21352,40.77839],[-119.21352,40.77838],[-119.21323,40.77821],[-119.21323,40.77821],[-119.21294,40.77803],[-119.21294,40.77803],[-119.21264,40.77787],[-119.21264,40.77786],[-119.21233,40.7777],[-119.21233,40.7777],[-119.21202,40.77755],[-119.21202,40.77755],[-119.2117,40.7774],[-119.2117,40.7774],[-119.2115,40.77731],[-119.21232,40.77624],[-119.2124,40.77628],[-119.21274,40.77643],[-119.21306,40.77659],[-119.21339,40.77676],[-119.21371,40.77693],[-119.21402,40.77711],[-119.21433,40.77729],[-119.21463,40.77748],[-119.21492,40.77767],[-119.21521,40.77787],[-119.2155,40.77808],[-119.21558,40.77814]],[[-119.21165,40.77747],[-119.21196,40.77762],[-119.21227,40.77777],[-119.21257,40.77793],[-119.21287,40.7781],[-119.21317,40.77827],[-119.21345,40.77845],[-119.21373,40.77863],[-119.21401,40.77882],[-119.21428,40.77901],[-119.21436,40.77908],[-119.21372,40.77956],[-119.21364,40.7795],[-119.21364,40.7795],[-119.21338,40.77931],[-119.21338,40.77931],[-119.21311,40.77913],[-119.21311,40.77913],[-119.21284,40.77895],[-119.21284,40.77895],[-119.21256,40.77878],[-119.21256,40.77878],[-119.21227,40.77861],[-119.21227,40.77861],[-119.21198,40.77845],[-119.21198,40.77845],[-119.21168,40.7783],[-119.21168,40.7783],[-119.21138,40.77815],[-119.21138,40.77815],[-119.21107,40.77801],[-119.21107,40.77801],[-119.211,40.77797],[-119.21145,40.77738],[-119.21165,40.77747]],[[-119.21221,40.77868],[-119.21249,40.77884],[-119.21277,40.77902],[-119.21304,40.77919],[-119.21331,40.77937],[-119.21357,40.77956],[-119.21366,40.77963],[-119.21302,40.78011],[-119.21293,40.78005],[-119.21293,40.78005],[-119.21268,40.77987],[-119.21268,40.77987],[-119.21242,40.77969],[-119.21242,40.77969],[-119.21216,40.77952],[-119.21216,40.77952],[-119.21189,40.77936],[-119.21189,40.77936],[-119.21161,40.7792],[-119.21161,40.7792],[-119.2115,40.77914],[-119.21203,40.77858],[-119.21221,40.77868]],[[-119.21373,40.77969],[-119.21382,40.77975],[-119.21407,40.77995],[-119.21431,40.78015],[-119.21454,40.78036],[-119.21476,40.78057],[-119.21498,40.78079],[-119.21511,40.78092],[-119.21438,40.78132],[-119.2143,40.78124],[-119.2143,40.78124],[-119.21409,40.78103],[-119.21409,40.78103],[-119.21387,40.78083],[-119.21387,40.78082],[-119.21365,40.78062],[-119.21365,40.78062],[-119.21342,40.78043],[-119.21342,40.78043],[-119.21318,40.78024],[-119.21318,40.78024],[-119.21309,40.78017],[-119.21373,40.77969]],[[-119.21144,40.77911],[-119.21133,40.77904],[-119.21133,40.77904],[-119.21104,40.7789],[-119.21104,40.7789],[-119.21075,40.77875],[-119.21075,40.77875],[-119.21049,40.77864],[-119.21094,40.77804],[-119.21102,40.77808],[-119.21132,40.77822],[-119.21162,40.77837],[-119.21192,40.77852],[-119.21197,40.77855],[-119.21144,40.77911]],[[-119.21037,40.77858],[-119.21015,40.77849],[-119.21015,40.77849],[-119.20984,40.77837],[-119.20984,40.77837],[-119.20953,40.77825],[-119.20953,40.77825],[-119.20921,40.77814],[-119.20921,40.77814],[-119.20889,40.77804],[-119.20889,40.77804],[-119.20857,40.77794],[-119.20857,40.77794],[-119.20825,40.77785],[-119.20824,40.77785],[-119.20792,40.77777],[-119.20791,40.77777],[-119.20758,40.77769],[-119.20758,40.77769],[-119.20743,40.77766],[-119.20766,40.777],[-119.20774,40.77701],[-119.20808,40.77709],[-119.20842,40.77717],[-119.20876,40.77726],[-119.20909,40.77736],[-119.20942,40.77746],[-119.20975,40.77757],[-119.21007,40.77769],[-119.21039,40.77781],[-119.21071,40.77794],[-119.21082,40.77799],[-119.21037,40.77858]],[[-119.20732,40.77764],[-119.20725,40.77762],[-119.20725,40.77762],[-119.20691,40.77756],[-119.20691,40.77756],[-119.20657,40.77751],[-119.20657,40.77751],[-119.20623,40.77746],[-119.20623,40.77746],[-119.20589,40.77742],[-119.20589,40.77742],[-119.20554,40.77738],[-119.20554,40.77738],[-119.2052,40.77736],[-119.2052,40.77736],[-119.20485,40.77734],[-119.20485,40.77734],[-119.20451,40.77733],[-119.20451,40.77733],[-119.20417,40.77732],[-119.20417,40.77663],[-119.20421,40.77663],[-119.20456,40.77664],[-119.20492,40.77665],[-119.20528,40.77667],[-119.20563,40.7767],[-119.20599,40.77674],[-119.20634,40.77678],[-119.20669,40.77683],[-119.20704,40.77688],[-119.20739,40.77694],[-119.20756,40.77698],[-119.20732,40.77764]],[[-119.20402,40.77732],[-119.20381,40.77732],[-119.20381,40.77732],[-119.20347,40.77733],[-119.20346,40.77733],[-119.20312,40.77735],[-119.20312,40.77735],[-119.20277,40.77737],[-119.20277,40.77737],[-119.20243,40.7774],[-119.20243,40.7774],[-119.20209,40.77744],[-119.20208,40.77744],[-119.20174,40.77749],[-119.20174,40.77749],[-119.2014,40.77754],[-119.2014,40.77754],[-119.20107,40.7776],[-119.20106,40.7776],[-119.20087,40.77764],[-119.20063,40.77698],[-119.20067,40.77697],[-119.20101,40.7769],[-119.20136,40.77685],[-119.20171,40.77679],[-119.20207,40.77675],[-119.20242,40.77671],[-119.20278,40.77668],[-119.20313,40.77666],[-119.20349,40.77664],[-119.20385,40.77664],[-119.20402,40.77664],[-119.20402,40.77732]],[[-119.20205,40.77667],[-119.20205,40.77667],[-119.2017,40.77671],[-119.20169,40.77671],[-119.20134,40.77676],[-119.20134,40.77676],[-119.20099,40.77682],[-119.20099,40.77682],[-119.20064,40.77689],[-119.20064,40.77689],[-119.2006,40.7769],[-119.20037,40.77623],[-119.20059,40.77619],[-119.20095,40.77613],[-119.20131,40.77607],[-119.20167,40.77602],[-119.20204,40.77598],[-119.20241,40.77594],[-119.20278,40.77591],[-119.20315,40.77589],[-119.20352,40.77587],[-119.20389,40.77587],[-119.20402,40.77587],[-119.20402,40.77655],[-119.20385,40.77655],[-119.20385,40.77655],[-119.20349,40.77656],[-119.20348,40.77656],[-119.20313,40.77658],[-119.20313,40.77658],[-119.20277,40.7766],[-119.20277,40.7766],[-119.20241,40.77663],[-119.20241,40.77663],[-119.20205,40.77667]],[[-119.20203,40.77589],[-119.20202,40.77589],[-119.20166,40.77594],[-119.20166,40.77594],[-119.20129,40.77599],[-119.20129,40.77599],[-119.20093,40.77605],[-119.20092,40.77605],[-119.20056,40.77611],[-119.20056,40.77611],[-119.20034,40.77615],[-119.19992,40.77496],[-119.19996,40.77495],[-119.20034,40.77488],[-119.20072,40.77482],[-119.20111,40.77476],[-119.20149,40.77471],[-119.20188,40.77466],[-119.20227,40.77463],[-119.20266,40.7746],[-119.20304,40.77457],[-119.20343,40.77456],[-119.20383,40.77455],[-119.20402,40.77455],[-119.20402,40.77578],[-119.20388,40.77578],[-119.20388,40.77578],[-119.20351,40.77579],[-119.20351,40.77579],[-119.20314,40.77581],[-119.20314,40.77581],[-119.20277,40.77583],[-119.20277,40.77583],[-119.2024,40.77586],[-119.20239,40.77586],[-119.20203,40.77589]],[[-119.19979,40.7749],[-119.19956,40.77495],[-119.19956,40.77495],[-119.19918,40.77504],[-119.19918,40.77504],[-119.19881,40.77513],[-119.19881,40.77513],[-119.19844,40.77523],[-119.19844,40.77523],[-119.19807,40.77534],[-119.19807,40.77534],[-119.19784,40.77541],[-119.1975,40.77477],[-119.19769,40.77471],[-119.19807,40.7746],[-119.19845,40.7745],[-119.19883,40.7744],[-119.19922,40.77431],[-119.19956,40.77424],[-119.19979,40.7749]],[[-119.19777,40.77543],[-119.19771,40.77545],[-119.1977,40.77545],[-119.19734,40.77557],[-119.19734,40.77557],[-119.19699,40.77569],[-119.19699,40.77569],[-119.19664,40.77583],[-119.19663,40.77583],[-119.19629,40.77597],[-119.19629,40.77597],[-119.19594,40.77611],[-119.19594,40.77611],[-119.19593,40.77612],[-119.19547,40.77552],[-119.19552,40.77551],[-119.19587,40.77536],[-119.19623,40.77522],[-119.19659,40.77508],[-119.19695,40.77495],[-119.19732,40.77483],[-119.19743,40.77479],[-119.19777,40.77543]],[[-119.19966,40.77422],[-119.2,40.77415],[-119.20039,40.77408],[-119.20079,40.77402],[-119.20118,40.77397],[-119.20158,40.77392],[-119.2018,40.7739],[-119.20191,40.77458],[-119.20186,40.77458],[-119.20186,40.77458],[-119.20148,40.77463],[-119.20147,40.77463],[-119.20109,40.77468],[-119.20109,40.77468],[-119.2007,40.77473],[-119.2007,40.77473],[-119.20032,40.7748],[-119.20032,40.7748],[-119.19994,40.77487],[-119.19994,40.77487],[-119.19989,40.77488],[-119.19966,40.77422]],[[-119.20187,40.77389],[-119.20198,40.77388],[-119.20238,40.77384],[-119.20278,40.77382],[-119.20319,40.7738],[-119.20359,40.77378],[-119.20374,40.77378],[-119.20375,40.77381],[-119.20377,40.77386],[-119.2038,40.77389],[-119.20383,40.77393],[-119.20388,40.77396],[-119.20393,40.77398],[-119.20398,40.774],[-119.20402,40.77401],[-119.20402,40.77447],[-119.20382,40.77447],[-119.20382,40.77447],[-119.20343,40.77448],[-119.20343,40.77448],[-119.20304,40.77449],[-119.20304,40.77449],[-119.20265,40.77451],[-119.20264,40.77451],[-119.20226,40.77454],[-119.20225,40.77454],[-119.20199,40.77457],[-119.20187,40.77389]],[[-119.20417,40.77401],[-119.20421,40.774],[-119.20426,40.77398],[-119.20431,40.77396],[-119.20435,40.77393],[-119.20439,40.77389],[-119.20442,40.77386],[-119.20444,40.77381],[-119.20445,40.77378],[-119.2048,40.77379],[-119.2052,40.77381],[-119.2056,40.77383],[-119.20601,40.77386],[-119.20632,40.77389],[-119.2062,40.77457],[-119.20618,40.77457],[-119.20618,40.77457],[-119.20579,40.77453],[-119.20579,40.77453],[-119.2054,40.7745],[-119.20539,40.7745],[-119.205,40.77448],[-119.205,40.77448],[-119.20461,40.77447],[-119.20461,40.77447],[-119.20422,40.77447],[-119.20422,40.77447],[-119.20417,40.77447],[-119.20417,40.77401]],[[-119.20639,40.7739],[-119.20641,40.7739],[-119.20681,40.77394],[-119.2072,40.77399],[-119.2076,40.77405],[-119.20799,40.77412],[-119.20838,40.77419],[-119.20853,40.77422],[-119.20829,40.77488],[-119.20811,40.77484],[-119.20811,40.77484],[-119.20773,40.77477],[-119.20773,40.77477],[-119.20734,40.77471],[-119.20734,40.77471],[-119.20696,40.77466],[-119.20695,40.77466],[-119.20657,40.77461],[-119.20657,40.77461],[-119.20627,40.77458],[-119.20639,40.7739]],[[-119.20863,40.77424],[-119.20877,40.77427],[-119.20916,40.77435],[-119.20955,40.77445],[-119.20993,40.77455],[-119.21031,40.77465],[-119.21068,40.77477],[-119.21069,40.77477],[-119.21035,40.77541],[-119.21035,40.77541],[-119.21035,40.77541],[-119.20998,40.7753],[-119.20998,40.77529],[-119.20961,40.77519],[-119.20961,40.77519],[-119.20924,40.77509],[-119.20924,40.77509],[-119.20887,40.775],[-119.20887,40.775],[-119.20849,40.77492],[-119.20849,40.77492],[-119.2084,40.7749],[-119.20863,40.77424]],[[-119.21076,40.77479],[-119.21105,40.77489],[-119.21142,40.77501],[-119.21178,40.77515],[-119.21214,40.77529],[-119.2125,40.77543],[-119.2127,40.77552],[-119.21225,40.77611],[-119.21212,40.77606],[-119.21212,40.77606],[-119.21177,40.77591],[-119.21177,40.77591],[-119.21142,40.77578],[-119.21142,40.77578],[-119.21107,40.77565],[-119.21107,40.77565],[-119.21071,40.77552],[-119.21071,40.77552],[-119.21041,40.77543],[-119.21076,40.77479]],[[-119.2129,40.77551],[-119.2129,40.77551],[-119.21288,40.7755],[-119.21333,40.77491],[-119.21364,40.77505],[-119.214,40.77522],[-119.21434,40.77539],[-119.21469,40.77557],[-119.21502,40.77576],[-119.2152,40.77586],[-119.21465,40.7764],[-119.21459,40.77637],[-119.21459,40.77637],[-119.21426,40.77618],[-119.21426,40.77618],[-119.21393,40.77601],[-119.21393,40.77601],[-119.21359,40.77584],[-119.21359,40.77584],[-119.21325,40.77567],[-119.21325,40.77567],[-119.2129,40.77551]],[[-119.21532,40.77593],[-119.21535,40.77595],[-119.21568,40.77614],[-119.216,40.77634],[-119.21631,40.77655],[-119.21662,40.77677],[-119.21692,40.77698],[-119.21701,40.77706],[-119.21659,40.77738],[-119.21658,40.77738],[-119.21653,40.77736],[-119.21647,40.77734],[-119.21642,40.77734],[-119.21636,40.77734],[-119.2163,40.77734],[-119.21625,40.77736],[-119.2162,40.77738],[-119.21617,40.77739],[-119.21614,40.77736],[-119.21614,40.77736],[-119.21584,40.77715],[-119.21584,40.77715],[-119.21554,40.77695],[-119.21554,40.77695],[-119.21523,40.77675],[-119.21523,40.77675],[-119.21491,40.77656],[-119.21491,40.77655],[-119.21477,40.77647],[-119.21532,40.77593]],[[-119.21712,40.77713],[-119.21721,40.77721],[-119.2175,40.77743],[-119.21778,40.77767],[-119.21805,40.77791],[-119.21832,40.77815],[-119.21858,40.7784],[-119.2186,40.77842],[-119.21789,40.77884],[-119.21778,40.77873],[-119.21777,40.77873],[-119.21752,40.77849],[-119.21752,40.77849],[-119.21726,40.77826],[-119.21726,40.77826],[-119.21699,40.77803],[-119.21699,40.77803],[-119.21671,40.7778],[-119.21671,40.7778],[-119.21668,40.77777],[-119.21669,40.77776],[-119.21671,40.77773],[-119.21674,40.77769],[-119.21675,40.77764],[-119.21675,40.7776],[-119.21674,40.77755],[-119.21673,40.77751],[-119.2167,40.77747],[-119.21669,40.77746],[-119.21712,40.77713]],[[-119.21606,40.77742],[-119.2161,40.77745],[-119.21608,40.77747],[-119.21605,40.77751],[-119.21603,40.77755],[-119.21603,40.7776],[-119.21603,40.77764],[-119.21604,40.77769],[-119.21606,40.77773],[-119.21609,40.77776],[-119.21566,40.77808],[-119.21557,40.77802],[-119.21557,40.77802],[-119.21529,40.77781],[-119.21529,40.77781],[-119.215,40.77761],[-119.215,40.77761],[-119.2147,40.77742],[-119.2147,40.77742],[-119.2144,40.77723],[-119.21439,40.77722],[-119.21415,40.77708],[-119.2147,40.77654],[-119.21484,40.77662],[-119.21516,40.77681],[-119.21547,40.77701],[-119.21577,40.77721],[-119.21606,40.77742]],[[-119.21404,40.77701],[-119.21377,40.77686],[-119.21377,40.77686],[-119.21345,40.77669],[-119.21345,40.77669],[-119.21312,40.77652],[-119.21312,40.77652],[-119.21279,40.77636],[-119.21279,40.77636],[-119.21246,40.7762],[-119.21246,40.7762],[-119.21237,40.77617],[-119.21282,40.77557],[-119.21285,40.77558],[-119.21319,40.77574],[-119.21353,40.7759],[-119.21387,40.77607],[-119.2142,40.77625],[-119.21452,40.77643],[-119.21459,40.77647],[-119.21404,40.77701]],[[-119.21206,40.77613],[-119.21219,40.77618],[-119.21138,40.77725],[-119.21106,40.77712],[-119.21105,40.77712],[-119.21073,40.77698],[-119.21072,40.77698],[-119.21039,40.77686],[-119.21039,40.77686],[-119.21005,40.77674],[-119.21005,40.77674],[-119.20971,40.77663],[-119.20971,40.77663],[-119.20936,40.77653],[-119.20936,40.77652],[-119.20901,40.77643],[-119.20901,40.77643],[-119.20866,40.77634],[-119.20866,40.77634],[-119.2083,40.77625],[-119.2083,40.77625],[-119.20795,40.77617],[-119.20837,40.77498],[-119.20846,40.775],[-119.20883,40.77508],[-119.20921,40.77517],[-119.20958,40.77527],[-119.20994,40.77537],[-119.21031,40.77548],[-119.21067,40.7756],[-119.21102,40.77572],[-119.21137,40.77585],[-119.21172,40.77599],[-119.21206,40.77613]],[[-119.20827,40.77633],[-119.20862,40.77641],[-119.20897,40.7765],[-119.20932,40.7766],[-119.20967,40.77671],[-119.21001,40.77682],[-119.21034,40.77693],[-119.21068,40.77706],[-119.211,40.77719],[-119.21133,40.77732],[-119.21087,40.77792],[-119.21076,40.77787],[-119.21076,40.77787],[-119.21044,40.77774],[-119.21044,40.77774],[-119.21012,40.77762],[-119.21012,40.77761],[-119.2098,40.7775],[-119.2098,40.7775],[-119.20947,40.77739],[-119.20947,40.77739],[-119.20913,40.77728],[-119.20913,40.77728],[-119.2088,40.77719],[-119.2088,40.77718],[-119.20846,40.77709],[-119.20845,40.77709],[-119.20811,40.77701],[-119.20811,40.77701],[-119.20777,40.77693],[-119.20777,40.77693],[-119.20769,40.77692],[-119.20792,40.77625],[-119.20827,40.77633]],[[-119.20758,40.7769],[-119.20742,40.77686],[-119.20742,40.77686],[-119.20707,40.7768],[-119.20707,40.7768],[-119.20671,40.77674],[-119.20671,40.77674],[-119.20636,40.7767],[-119.20636,40.7767],[-119.206,40.77665],[-119.206,40.77665],[-119.20565,40.77662],[-119.20564,40.77662],[-119.20529,40.77659],[-119.20529,40.77659],[-119.20493,40.77657],[-119.20493,40.77657],[-119.20457,40.77656],[-119.20457,40.77656],[-119.20421,40.77655],[-119.20421,40.77655],[-119.20417,40.77655],[-119.20417,40.77587],[-119.20426,40.77587],[-119.20463,40.77587],[-119.205,40.77589],[-119.20537,40.77591],[-119.20573,40.77594],[-119.2061,40.77597],[-119.20647,40.77601],[-119.20683,40.77606],[-119.20719,40.77612],[-119.20756,40.77618],[-119.20782,40.77623],[-119.20758,40.7769]],[[-119.20758,40.7761],[-119.20758,40.7761],[-119.20722,40.77604],[-119.20722,40.77604],[-119.20685,40.77598],[-119.20685,40.77598],[-119.20649,40.77593],[-119.20648,40.77593],[-119.20612,40.77589],[-119.20612,40.77589],[-119.20575,40.77585],[-119.20575,40.77585],[-119.20538,40.77583],[-119.20537,40.77583],[-119.205,40.7758],[-119.205,40.7758],[-119.20463,40.77579],[-119.20463,40.77579],[-119.20426,40.77578],[-119.20426,40.77578],[-119.20417,40.77578],[-119.20417,40.77455],[-119.20422,40.77455],[-119.20461,40.77455],[-119.205,40.77457],[-119.20539,40.77459],[-119.20578,40.77461],[-119.20616,40.77465],[-119.20655,40.77469],[-119.20694,40.77474],[-119.20732,40.77479],[-119.2077,40.77485],[-119.20808,40.77492],[-119.20827,40.77496],[-119.20784,40.77615],[-119.20758,40.7761]],[[-119.22421,40.78701],[-119.22475,40.78701],[-119.22475,40.78704],[-119.22474,40.78737],[-119.22473,40.78771],[-119.2247,40.78804],[-119.22467,40.78838],[-119.22462,40.78871],[-119.22458,40.78898],[-119.22404,40.78892],[-119.22408,40.78871],[-119.22408,40.78871],[-119.22412,40.78838],[-119.22412,40.78838],[-119.22416,40.78805],[-119.22416,40.78805],[-119.22418,40.78772],[-119.22418,40.78772],[-119.2242,40.78739],[-119.2242,40.78739],[-119.22421,40.78706],[-119.22421,40.78706],[-119.22421,40.78701]],[[-119.22393,40.78897],[-119.22391,40.78903],[-119.22385,40.78936],[-119.22378,40.78968],[-119.2237,40.79001],[-119.2236,40.79033],[-119.2235,40.79065],[-119.22343,40.79085],[-119.22291,40.79074],[-119.22295,40.79063],[-119.22295,40.79062],[-119.22305,40.79031],[-119.22305,40.79031],[-119.22315,40.78999],[-119.22315,40.78999],[-119.22323,40.78967],[-119.22323,40.78967],[-119.2233,40.78935],[-119.2233,40.78935],[-119.22337,40.78903],[-119.22337,40.78903],[-119.22339,40.78891],[-119.22393,40.78897]],[[-119.22361,40.79067],[-119.22361,40.79067],[-119.22371,40.79035],[-119.22371,40.79035],[-119.2238,40.79002],[-119.2238,40.79002],[-119.22388,40.7897],[-119.22388,40.7897],[-119.22396,40.78937],[-119.22396,40.78937],[-119.22402,40.78904],[-119.22402,40.78904],[-119.22403,40.78898],[-119.22457,40.78903],[-119.22457,40.78904],[-119.2245,40.78938],[-119.22443,40.78971],[-119.22435,40.79004],[-119.22426,40.79037],[-119.22416,40.79069],[-119.22406,40.79098],[-119.22354,40.79087],[-119.22361,40.79067]],[[-119.22403,40.79106],[-119.22393,40.79134],[-119.2238,40.79166],[-119.22367,40.79198],[-119.22352,40.7923],[-119.22337,40.79261],[-119.2232,40.79292],[-119.22319,40.79294],[-119.22269,40.79278],[-119.22281,40.79256],[-119.22281,40.79256],[-119.22296,40.79225],[-119.22296,40.79225],[-119.22311,40.79194],[-119.22311,40.79194],[-119.22325,40.79163],[-119.22325,40.79163],[-119.22338,40.79131],[-119.22338,40.79131],[-119.2235,40.79099],[-119.2235,40.79099],[-119.22351,40.79095],[-119.22403,40.79106]],[[-119.22317,40.79299],[-119.22303,40.79323],[-119.22285,40.79354],[-119.22266,40.79384],[-119.22246,40.79414],[-119.22226,40.79444],[-119.22204,40.79473],[-119.22201,40.79477],[-119.22154,40.79456],[-119.22169,40.79436],[-119.22169,40.79436],[-119.2219,40.79407],[-119.2219,40.79407],[-119.2221,40.79378],[-119.2221,40.79378],[-119.22229,40.79348],[-119.22229,40.79348],[-119.22247,40.79318],[-119.22247,40.79318],[-119.22264,40.79287],[-119.22264,40.79287],[-119.22267,40.79283],[-119.22317,40.79299]],[[-119.22196,40.79484],[-119.22182,40.79502],[-119.22159,40.79531],[-119.22135,40.79559],[-119.2211,40.79587],[-119.22085,40.79614],[-119.22059,40.79641],[-119.22053,40.79647],[-119.2201,40.79622],[-119.22028,40.79604],[-119.22028,40.79604],[-119.22053,40.79577],[-119.22053,40.79577],[-119.22078,40.7955],[-119.22078,40.7955],[-119.22102,40.79522],[-119.22102,40.79522],[-119.22125,40.79494],[-119.22125,40.79494],[-119.22148,40.79465],[-119.22148,40.79465],[-119.22149,40.79463],[-119.22196,40.79484]],[[-119.22044,40.79656],[-119.22032,40.79668],[-119.22004,40.79694],[-119.21975,40.7972],[-119.21946,40.79745],[-119.21916,40.7977],[-119.21886,40.79794],[-119.21875,40.79802],[-119.21837,40.79773],[-119.21859,40.79756],[-119.21859,40.79756],[-119.21889,40.79732],[-119.21889,40.79732],[-119.21918,40.79707],[-119.21918,40.79707],[-119.21946,40.79682],[-119.21947,40.79682],[-119.21974,40.79656],[-119.21974,40.79656],[-119.22001,40.79631],[-119.22044,40.79656]],[[-119.21865,40.7981],[-119.21855,40.79817],[-119.21823,40.79841],[-119.2179,40.79863],[-119.21757,40.79886],[-119.21723,40.79907],[-119.21689,40.79928],[-119.21673,40.79938],[-119.2164,40.79905],[-119.21665,40.7989],[-119.21665,40.7989],[-119.21699,40.79869],[-119.21699,40.79869],[-119.21732,40.79847],[-119.21732,40.79847],[-119.21765,40.79825],[-119.21765,40.79825],[-119.21797,40.79803],[-119.21797,40.79803],[-119.21827,40.7978],[-119.21865,40.7981]],[[-119.21661,40.79944],[-119.21654,40.79949],[-119.21618,40.79969],[-119.21582,40.79988],[-119.21546,40.80007],[-119.21509,40.80025],[-119.21471,40.80042],[-119.21449,40.80052],[-119.21422,40.80017],[-119.21451,40.80004],[-119.21451,40.80004],[-119.21488,40.79986],[-119.21488,40.79986],[-119.21524,40.79968],[-119.21524,40.79968],[-119.2156,40.7995],[-119.2156,40.79949],[-119.21596,40.7993],[-119.21596,40.7993],[-119.21628,40.79912],[-119.21661,40.79944]],[[-119.21404,40.80015],[-119.2137,40.8003],[-119.21331,40.80045],[-119.21293,40.8006],[-119.21253,40.80074],[-119.21214,40.80088],[-119.21182,40.80098],[-119.21161,40.8006],[-119.21196,40.80049],[-119.21196,40.80049],[-119.21235,40.80035],[-119.21236,40.80035],[-119.21274,40.80021],[-119.21274,40.80021],[-119.21312,40.80006],[-119.21312,40.80006],[-119.2135,40.79991],[-119.2135,40.79991],[-119.21377,40.79979],[-119.21404,40.80015]],[[-119.21345,40.79984],[-119.21307,40.79999],[-119.21269,40.80014],[-119.21231,40.80028],[-119.21192,40.80041],[-119.21157,40.80053],[-119.21122,40.79989],[-119.21124,40.79989],[-119.21124,40.79989],[-119.21162,40.79976],[-119.21163,40.79976],[-119.212,40.79963],[-119.21201,40.79963],[-119.21238,40.79949],[-119.21238,40.79949],[-119.21275,40.79934],[-119.21275,40.79934],[-119.21312,40.79919],[-119.21312,40.79919],[-119.21326,40.79913],[-119.21371,40.79972],[-119.21345,40.79984]],[[-119.2127,40.79927],[-119.21233,40.79942],[-119.21196,40.79955],[-119.21158,40.79969],[-119.2112,40.79981],[-119.21118,40.79982],[-119.21084,40.79918],[-119.21091,40.79916],[-119.21091,40.79916],[-119.21128,40.79904],[-119.21128,40.79904],[-119.21165,40.79891],[-119.21165,40.7989],[-119.21201,40.79877],[-119.21202,40.79877],[-119.21237,40.79863],[-119.21237,40.79862],[-119.21273,40.79848],[-119.21273,40.79848],[-119.21275,40.79846],[-119.21321,40.79906],[-119.21307,40.79912],[-119.2127,40.79927]],[[-119.21232,40.79855],[-119.21197,40.79869],[-119.2116,40.79883],[-119.21124,40.79896],[-119.21087,40.79908],[-119.2108,40.79911],[-119.21045,40.79847],[-119.21058,40.79843],[-119.21058,40.79843],[-119.21093,40.79831],[-119.21094,40.79831],[-119.21129,40.79818],[-119.21129,40.79818],[-119.21164,40.79805],[-119.21164,40.79805],[-119.21199,40.79791],[-119.21199,40.79791],[-119.21225,40.7978],[-119.2127,40.79839],[-119.21268,40.7984],[-119.21232,40.79855]],[[-119.21237,40.79774],[-119.21267,40.79761],[-119.21267,40.79761],[-119.213,40.79745],[-119.213,40.79745],[-119.21333,40.79729],[-119.21333,40.79728],[-119.21365,40.79711],[-119.21365,40.79711],[-119.21397,40.79694],[-119.21397,40.79694],[-119.21404,40.7969],[-119.21459,40.79744],[-119.21437,40.79757],[-119.21404,40.79775],[-119.21371,40.79792],[-119.21337,40.79809],[-119.21302,40.79825],[-119.21282,40.79834],[-119.21237,40.79774]],[[-119.21359,40.79705],[-119.21327,40.79722],[-119.21294,40.79738],[-119.21261,40.79754],[-119.21232,40.79767],[-119.21151,40.7966],[-119.21166,40.79653],[-119.21167,40.79653],[-119.21198,40.79638],[-119.21198,40.79638],[-119.21229,40.79623],[-119.2123,40.79623],[-119.2126,40.79607],[-119.2126,40.79607],[-119.2129,40.7959],[-119.2129,40.7959],[-119.2132,40.79573],[-119.2132,40.79573],[-119.21349,40.79555],[-119.21349,40.79555],[-119.21377,40.79536],[-119.21377,40.79536],[-119.21405,40.79517],[-119.21405,40.79517],[-119.21432,40.79498],[-119.21432,40.79498],[-119.21444,40.79489],[-119.21559,40.79577],[-119.21539,40.79591],[-119.21511,40.79611],[-119.21482,40.79631],[-119.21452,40.7965],[-119.21422,40.79669],[-119.21391,40.79687],[-119.21359,40.79705]],[[-119.21425,40.79492],[-119.21398,40.79511],[-119.2137,40.7953],[-119.21342,40.79548],[-119.21313,40.79566],[-119.21284,40.79583],[-119.21254,40.796],[-119.21223,40.79616],[-119.21192,40.79631],[-119.21161,40.79646],[-119.21145,40.79653],[-119.211,40.79594],[-119.21127,40.79582],[-119.21127,40.79582],[-119.21157,40.79567],[-119.21157,40.79567],[-119.21187,40.79552],[-119.21187,40.79552],[-119.21217,40.79536],[-119.21217,40.79536],[-119.21245,40.79519],[-119.21245,40.79519],[-119.21274,40.79502],[-119.21274,40.79502],[-119.21301,40.79485],[-119.21301,40.79485],[-119.21328,40.79467],[-119.21328,40.79467],[-119.21355,40.79448],[-119.21355,40.79448],[-119.21372,40.79435],[-119.21436,40.79483],[-119.21425,40.79492]],[[-119.21347,40.79442],[-119.21321,40.7946],[-119.21294,40.79478],[-119.21267,40.79496],[-119.21239,40.79513],[-119.2121,40.79529],[-119.21181,40.79545],[-119.21151,40.7956],[-119.21121,40.79575],[-119.21095,40.79587],[-119.21049,40.79527],[-119.21056,40.79524],[-119.21056,40.79524],[-119.21086,40.7951],[-119.21086,40.7951],[-119.21115,40.79496],[-119.21115,40.79496],[-119.21144,40.79481],[-119.21144,40.79481],[-119.21172,40.79465],[-119.21172,40.79465],[-119.21199,40.79449],[-119.21199,40.79449],[-119.21226,40.79433],[-119.21226,40.79432],[-119.21252,40.79415],[-119.21252,40.79415],[-119.21278,40.79397],[-119.21278,40.79397],[-119.21301,40.79381],[-119.21364,40.79429],[-119.21347,40.79442]],[[-119.2127,40.79391],[-119.21245,40.79409],[-119.21219,40.79426],[-119.21192,40.79443],[-119.21165,40.79459],[-119.21137,40.79474],[-119.21109,40.79489],[-119.2108,40.79503],[-119.21051,40.79517],[-119.21044,40.7952],[-119.20999,40.79461],[-119.21016,40.79453],[-119.21016,40.79453],[-119.21044,40.79439],[-119.21044,40.79439],[-119.21072,40.79425],[-119.21072,40.79425],[-119.21099,40.79411],[-119.21099,40.79411],[-119.21125,40.79396],[-119.21125,40.79396],[-119.21151,40.7938],[-119.21151,40.7938],[-119.21177,40.79363],[-119.21177,40.79363],[-119.21201,40.79347],[-119.21201,40.79346],[-119.21209,40.79341],[-119.21209,40.79341],[-119.21214,40.79344],[-119.21219,40.79346],[-119.21225,40.79347],[-119.2123,40.79347],[-119.21236,40.79347],[-119.21242,40.79346],[-119.21247,40.79344],[-119.21248,40.79343],[-119.21288,40.79378],[-119.2127,40.79391]],[[-119.2117,40.79357],[-119.21144,40.79373],[-119.21119,40.79389],[-119.21092,40.79404],[-119.21066,40.79419],[-119.21038,40.79433],[-119.2101,40.79446],[-119.20993,40.79453],[-119.20948,40.79394],[-119.20974,40.79382],[-119.20974,40.79382],[-119.21001,40.79369],[-119.21001,40.79369],[-119.21027,40.79355],[-119.21027,40.79355],[-119.21052,40.79341],[-119.21053,40.79341],[-119.21077,40.79326],[-119.21078,40.79326],[-119.21102,40.79311],[-119.21102,40.79311],[-119.21126,40.79295],[-119.21126,40.79295],[-119.21149,40.79279],[-119.21149,40.79279],[-119.21153,40.79275],[-119.21199,40.79306],[-119.21197,40.7931],[-119.21195,40.79314],[-119.21194,40.79318],[-119.21195,40.79323],[-119.21196,40.79327],[-119.21198,40.79331],[-119.21201,40.79335],[-119.21201,40.79335],[-119.21194,40.7934],[-119.2117,40.79357]],[[-119.21172,40.79261],[-119.21193,40.79244],[-119.21193,40.79244],[-119.21214,40.79226],[-119.21214,40.79226],[-119.21234,40.79208],[-119.21234,40.79208],[-119.21254,40.79189],[-119.21254,40.79189],[-119.21273,40.7917],[-119.21273,40.7917],[-119.21291,40.7915],[-119.21291,40.7915],[-119.21308,40.7913],[-119.21309,40.7913],[-119.21325,40.7911],[-119.21325,40.79109],[-119.21329,40.79104],[-119.21407,40.79138],[-119.21401,40.79147],[-119.21384,40.79168],[-119.21365,40.79189],[-119.21347,40.7921],[-119.21327,40.7923],[-119.21307,40.79249],[-119.21285,40.79268],[-119.21264,40.79287],[-119.21251,40.79297],[-119.2125,40.79296],[-119.21245,40.79294],[-119.21239,40.79293],[-119.21233,40.79292],[-119.21228,40.79292],[-119.21222,40.79293],[-119.21216,40.79294],[-119.21213,40.79296],[-119.21172,40.79261]],[[-119.21335,40.79097],[-119.21341,40.79089],[-119.21341,40.79089],[-119.21356,40.79067],[-119.21356,40.79067],[-119.2137,40.79046],[-119.2137,40.79046],[-119.21383,40.79024],[-119.21383,40.79024],[-119.21396,40.79002],[-119.21396,40.79002],[-119.21407,40.7898],[-119.21407,40.78979],[-119.21418,40.78957],[-119.21418,40.78957],[-119.21428,40.78934],[-119.21428,40.78934],[-119.21436,40.78911],[-119.21436,40.78911],[-119.21437,40.78909],[-119.21524,40.78927],[-119.21519,40.78941],[-119.21509,40.78965],[-119.21499,40.78989],[-119.21487,40.79012],[-119.21475,40.79035],[-119.21462,40.79058],[-119.21448,40.79081],[-119.21433,40.79103],[-119.21417,40.79125],[-119.21413,40.79131],[-119.21335,40.79097]],[[-119.21417,40.78932],[-119.21408,40.78954],[-119.21397,40.78977],[-119.21386,40.78999],[-119.21373,40.79021],[-119.2136,40.79042],[-119.21346,40.79064],[-119.21331,40.79085],[-119.21325,40.79093],[-119.212,40.79038],[-119.21207,40.79029],[-119.21207,40.79029],[-119.2122,40.7901],[-119.2122,40.79009],[-119.21233,40.7899],[-119.21233,40.78989],[-119.21245,40.78969],[-119.21245,40.78969],[-119.21256,40.78949],[-119.21256,40.78949],[-119.21267,40.78928],[-119.21267,40.78928],[-119.21276,40.78907],[-119.21276,40.78907],[-119.21285,40.78885],[-119.21285,40.78885],[-119.21287,40.78878],[-119.21427,40.78907],[-119.21426,40.78909],[-119.21417,40.78932]],[[-119.2129,40.78871],[-119.21292,40.78864],[-119.21292,40.78864],[-119.21299,40.78842],[-119.21299,40.78842],[-119.21305,40.7882],[-119.21305,40.7882],[-119.21309,40.78798],[-119.21309,40.78798],[-119.21313,40.78776],[-119.21313,40.78776],[-119.21316,40.78754],[-119.21316,40.78754],[-119.21318,40.78732],[-119.21318,40.78732],[-119.21319,40.78721],[-119.21319,40.78721],[-119.21319,40.7872],[-119.21319,40.78719],[-119.2132,40.78718],[-119.21321,40.78717],[-119.21322,40.78716],[-119.21324,40.78715],[-119.21325,40.78714],[-119.21327,40.78714],[-119.21328,40.78714],[-119.21464,40.78707],[-119.21463,40.78721],[-119.21462,40.78745],[-119.2146,40.78768],[-119.21456,40.78792],[-119.21452,40.78816],[-119.21447,40.78839],[-119.21441,40.78862],[-119.21434,40.78886],[-119.21429,40.78899],[-119.2129,40.78871]],[[-119.21444,40.78888],[-119.21444,40.78888],[-119.21451,40.78864],[-119.21451,40.78864],[-119.21458,40.78841],[-119.21458,40.7884],[-119.21463,40.78817],[-119.21463,40.78817],[-119.21467,40.78793],[-119.21467,40.78793],[-119.2147,40.78769],[-119.2147,40.78769],[-119.21473,40.78745],[-119.21473,40.78745],[-119.21474,40.78721],[-119.21474,40.78721],[-119.21475,40.78706],[-119.21536,40.78703],[-119.21536,40.78703],[-119.21538,40.78707],[-119.21541,40.78711],[-119.21544,40.78714],[-119.21549,40.78717],[-119.21554,40.7872],[-119.21559,40.78722],[-119.21564,40.78723],[-119.21563,40.78744],[-119.21561,40.78769],[-119.21558,40.78794],[-119.21554,40.78819],[-119.21549,40.78843],[-119.21543,40.78868],[-119.21536,40.78892],[-119.21528,40.78917],[-119.21527,40.78919],[-119.2144,40.78901],[-119.21444,40.78888]],[[-119.21538,40.78919],[-119.21546,40.78894],[-119.21546,40.78894],[-119.21553,40.7887],[-119.21553,40.7887],[-119.21559,40.78845],[-119.21559,40.78845],[-119.21564,40.7882],[-119.21564,40.7882],[-119.21569,40.78795],[-119.21569,40.78795],[-119.21572,40.7877],[-119.21572,40.7877],[-119.21574,40.78744],[-119.21574,40.78744],[-119.21575,40.78723],[-119.21576,40.78723],[-119.21582,40.78722],[-119.21587,40.7872],[-119.21592,40.78717],[-119.21597,40.78714],[-119.216,40.78711],[-119.21603,40.78707],[-119.21605,40.78703],[-119.21606,40.78701],[-119.21666,40.78701],[-119.21666,40.78717],[-119.21665,40.78743],[-119.21662,40.78769],[-119.21659,40.78795],[-119.21655,40.78821],[-119.2165,40.78847],[-119.21644,40.78873],[-119.21638,40.78898],[-119.2163,40.78924],[-119.21625,40.78939],[-119.21538,40.78921],[-119.21538,40.78919],[-119.21538,40.78919]],[[-119.2164,40.78926],[-119.2164,40.78926],[-119.21648,40.789],[-119.21648,40.789],[-119.21655,40.78874],[-119.21655,40.78874],[-119.21661,40.78848],[-119.21661,40.78848],[-119.21666,40.78822],[-119.21666,40.78822],[-119.2167,40.78796],[-119.2167,40.78796],[-119.21673,40.7877],[-119.21673,40.7877],[-119.21675,40.78743],[-119.21675,40.78743],[-119.21677,40.78717],[-119.21677,40.78717],[-119.21677,40.78701],[-119.21767,40.78701],[-119.21767,40.78714],[-119.21766,40.78741],[-119.21764,40.78768],[-119.21761,40.78796],[-119.21757,40.78823],[-119.21752,40.7885],[-119.21746,40.78876],[-119.2174,40.78903],[-119.21732,40.7893],[-119.21723,40.78956],[-119.21722,40.78959],[-119.21635,40.78941],[-119.2164,40.78926]],[[-119.21734,40.78958],[-119.21734,40.78958],[-119.21742,40.78932],[-119.21743,40.78931],[-119.2175,40.78905],[-119.2175,40.78905],[-119.21757,40.78878],[-119.21757,40.78878],[-119.21763,40.78851],[-119.21763,40.78851],[-119.21768,40.78824],[-119.21768,40.78824],[-119.21772,40.78796],[-119.21772,40.78796],[-119.21775,40.78769],[-119.21775,40.78769],[-119.21777,40.78742],[-119.21777,40.78742],[-119.21778,40.78714],[-119.21778,40.78714],[-119.21778,40.78701],[-119.21868,40.78701],[-119.21868,40.78711],[-119.21867,40.78739],[-119.21865,40.78768],[-119.21862,40.78796],[-119.21859,40.78824],[-119.21854,40.78852],[-119.21848,40.78879],[-119.21842,40.78907],[-119.21834,40.78935],[-119.21826,40.78962],[-119.2182,40.78978],[-119.21733,40.78961],[-119.21734,40.78958]],[[-119.21836,40.78964],[-119.21836,40.78964],[-119.21845,40.78936],[-119.21845,40.78936],[-119.21852,40.78909],[-119.21852,40.78909],[-119.21859,40.78881],[-119.21859,40.78881],[-119.21865,40.78853],[-119.21865,40.78853],[-119.21869,40.78825],[-119.21869,40.78824],[-119.21873,40.78796],[-119.21873,40.78796],[-119.21876,40.78768],[-119.21876,40.78768],[-119.21878,40.7874],[-119.21878,40.7874],[-119.21879,40.78711],[-119.21879,40.78711],[-119.21879,40.78701],[-119.22042,40.78701],[-119.22042,40.78716],[-119.2204,40.78746],[-119.22038,40.78775],[-119.22035,40.78805],[-119.22032,40.78834],[-119.22027,40.78864],[-119.22021,40.78893],[-119.22014,40.78922],[-119.22007,40.78952],[-119.21998,40.78981],[-119.21989,40.79009],[-119.21988,40.79013],[-119.21831,40.78981],[-119.21836,40.78964]],[[-119.22039,40.78856],[-119.22042,40.78835],[-119.22042,40.78835],[-119.22046,40.78806],[-119.22046,40.78805],[-119.22049,40.78776],[-119.22049,40.78776],[-119.22051,40.78746],[-119.22051,40.78746],[-119.22052,40.78716],[-119.22052,40.78716],[-119.22052,40.78701],[-119.22113,40.78701],[-119.22114,40.78703],[-119.22116,40.78707],[-119.22119,40.78711],[-119.22122,40.78714],[-119.22127,40.78717],[-119.22132,40.7872],[-119.22137,40.78721],[-119.22142,40.78722],[-119.22142,40.78734],[-119.22141,40.78764],[-119.22138,40.78795],[-119.22134,40.78826],[-119.2213,40.78856],[-119.22128,40.78865],[-119.22039,40.78856]],[[-119.22141,40.78857],[-119.22141,40.78857],[-119.22145,40.78826],[-119.22145,40.78826],[-119.22149,40.78796],[-119.22149,40.78796],[-119.22151,40.78765],[-119.22151,40.78765],[-119.22153,40.78734],[-119.22153,40.78734],[-119.22153,40.78723],[-119.22154,40.78722],[-119.2216,40.78721],[-119.22165,40.7872],[-119.2217,40.78717],[-119.22174,40.78714],[-119.22178,40.78711],[-119.22181,40.78707],[-119.22183,40.78703],[-119.22184,40.78701],[-119.22244,40.78701],[-119.22244,40.78721],[-119.22242,40.78753],[-119.2224,40.78784],[-119.22237,40.78816],[-119.22233,40.78847],[-119.22229,40.78875],[-119.22139,40.78866],[-119.22141,40.78857]],[[-119.22244,40.78848],[-119.22244,40.78848],[-119.22248,40.78816],[-119.22248,40.78816],[-119.22251,40.78785],[-119.22251,40.78785],[-119.22253,40.78753],[-119.22253,40.78753],[-119.22255,40.78721],[-119.22255,40.78721],[-119.22255,40.78701],[-119.22345,40.78701],[-119.22345,40.78708],[-119.22344,40.7874],[-119.22343,40.78772],[-119.2234,40.78805],[-119.22336,40.78837],[-119.22332,40.78869],[-119.22329,40.78885],[-119.2224,40.78876],[-119.22244,40.78848]],[[-119.22342,40.7887],[-119.22342,40.7887],[-119.22347,40.78838],[-119.22347,40.78838],[-119.22351,40.78805],[-119.22351,40.78805],[-119.22353,40.78773],[-119.22353,40.78773],[-119.22355,40.7874],[-119.22355,40.7874],[-119.22356,40.78708],[-119.22356,40.78708],[-119.22356,40.78701],[-119.2241,40.78701],[-119.2241,40.78706],[-119.22409,40.78739],[-119.22408,40.78772],[-119.22405,40.78805],[-119.22401,40.78837],[-119.22397,40.7887],[-119.22393,40.78891],[-119.2234,40.78886],[-119.22342,40.7887]],[[-119.22328,40.7889],[-119.22326,40.78901],[-119.2232,40.78934],[-119.22312,40.78965],[-119.22304,40.78997],[-119.22295,40.79029],[-119.22285,40.7906],[-119.22281,40.79072],[-119.22193,40.79054],[-119.222,40.79035],[-119.222,40.79035],[-119.2221,40.79005],[-119.2221,40.79004],[-119.22218,40.78973],[-119.22218,40.78973],[-119.22226,40.78942],[-119.22226,40.78942],[-119.22233,40.78911],[-119.22233,40.78911],[-119.22239,40.78881],[-119.22328,40.7889]],[[-119.22278,40.7908],[-119.22274,40.79092],[-119.22262,40.79123],[-119.22249,40.79154],[-119.22235,40.79185],[-119.22221,40.79215],[-119.22205,40.79245],[-119.22199,40.79256],[-119.22116,40.7923],[-119.22123,40.79217],[-119.22123,40.79217],[-119.22138,40.79187],[-119.22138,40.79187],[-119.22152,40.79157],[-119.22152,40.79157],[-119.22165,40.79127],[-119.22165,40.79127],[-119.22178,40.79097],[-119.22178,40.79097],[-119.22189,40.79066],[-119.22189,40.79066],[-119.22191,40.79062],[-119.22278,40.7908]],[[-119.22215,40.79248],[-119.22215,40.79248],[-119.22231,40.79218],[-119.22231,40.79218],[-119.22245,40.79187],[-119.22245,40.79187],[-119.22259,40.79157],[-119.22259,40.79156],[-119.22272,40.79125],[-119.22272,40.79125],[-119.22284,40.79094],[-119.22284,40.79094],[-119.22288,40.79082],[-119.22341,40.79093],[-119.22339,40.79097],[-119.22327,40.79129],[-119.22315,40.7916],[-119.22301,40.79192],[-119.22286,40.79223],[-119.22271,40.79253],[-119.22259,40.79275],[-119.22209,40.79259],[-119.22215,40.79248]],[[-119.22257,40.7928],[-119.22254,40.79284],[-119.22237,40.79314],[-119.22219,40.79344],[-119.222,40.79374],[-119.2218,40.79403],[-119.2216,40.79432],[-119.22145,40.79452],[-119.22098,40.79432],[-119.22103,40.79425],[-119.22103,40.79425],[-119.22124,40.79396],[-119.22124,40.79396],[-119.22144,40.79367],[-119.22144,40.79367],[-119.22163,40.79338],[-119.22163,40.79338],[-119.22181,40.79308],[-119.22181,40.79308],[-119.22199,40.79279],[-119.22199,40.79278],[-119.22206,40.79264],[-119.22257,40.7928]],[[-119.2214,40.79459],[-119.22138,40.79461],[-119.22116,40.79489],[-119.22093,40.79517],[-119.22069,40.79545],[-119.22044,40.79572],[-119.22019,40.79599],[-119.22001,40.79617],[-119.21958,40.79592],[-119.21962,40.79588],[-119.21962,40.79588],[-119.21988,40.79562],[-119.21988,40.79562],[-119.22012,40.79535],[-119.22012,40.79535],[-119.22036,40.79508],[-119.22036,40.79508],[-119.22059,40.79481],[-119.22059,40.79481],[-119.22082,40.79453],[-119.22082,40.79453],[-119.22093,40.79439],[-119.2214,40.79459]],[[-119.21993,40.79626],[-119.21966,40.79651],[-119.21938,40.79677],[-119.2191,40.79702],[-119.21881,40.79726],[-119.21851,40.7975],[-119.21829,40.79767],[-119.21791,40.79738],[-119.21794,40.79736],[-119.21794,40.79736],[-119.21823,40.79712],[-119.21823,40.79712],[-119.21853,40.79689],[-119.21853,40.79688],[-119.21881,40.79664],[-119.21881,40.79664],[-119.21909,40.79639],[-119.21909,40.79639],[-119.21936,40.79614],[-119.21936,40.79614],[-119.21949,40.796],[-119.21993,40.79626]],[[-119.21819,40.79775],[-119.21789,40.79797],[-119.21758,40.79819],[-119.21725,40.79841],[-119.21692,40.79863],[-119.21659,40.79883],[-119.21633,40.79899],[-119.216,40.79866],[-119.21601,40.79866],[-119.21601,40.79866],[-119.21635,40.79845],[-119.21635,40.79845],[-119.21668,40.79825],[-119.21668,40.79824],[-119.217,40.79803],[-119.217,40.79803],[-119.21732,40.79781],[-119.21732,40.79781],[-119.21763,40.79759],[-119.21763,40.79759],[-119.21781,40.79745],[-119.21819,40.79775]],[[-119.21622,40.79905],[-119.2159,40.79924],[-119.21554,40.79943],[-119.21518,40.79961],[-119.21482,40.79979],[-119.21445,40.79997],[-119.21416,40.8001],[-119.21389,40.79974],[-119.21424,40.79958],[-119.21424,40.79958],[-119.21461,40.79941],[-119.21461,40.79941],[-119.21497,40.79923],[-119.21497,40.79923],[-119.21532,40.79904],[-119.21532,40.79904],[-119.21567,40.79885],[-119.21567,40.79885],[-119.21589,40.79873],[-119.21622,40.79905]],[[-119.2156,40.79879],[-119.21526,40.79898],[-119.21491,40.79916],[-119.21455,40.79934],[-119.21419,40.79951],[-119.21384,40.79967],[-119.21338,40.79907],[-119.21348,40.79903],[-119.21348,40.79903],[-119.21384,40.79887],[-119.21384,40.79887],[-119.21419,40.7987],[-119.21419,40.7987],[-119.21454,40.79852],[-119.21454,40.79852],[-119.21488,40.79834],[-119.21488,40.79834],[-119.21522,40.79815],[-119.21522,40.79815],[-119.21527,40.79812],[-119.21582,40.79866],[-119.2156,40.79879]],[[-119.21482,40.79827],[-119.21448,40.79845],[-119.21413,40.79863],[-119.21378,40.7988],[-119.21343,40.79896],[-119.21333,40.799],[-119.21288,40.79841],[-119.21308,40.79832],[-119.21308,40.79832],[-119.21342,40.79816],[-119.21343,40.79816],[-119.21376,40.79799],[-119.21377,40.79799],[-119.2141,40.79782],[-119.2141,40.79782],[-119.21443,40.79764],[-119.21443,40.79764],[-119.21466,40.79751],[-119.21521,40.79805],[-119.21515,40.79808],[-119.21482,40.79827]],[[-119.21477,40.79744],[-119.21507,40.79726],[-119.21507,40.79726],[-119.21539,40.79706],[-119.21539,40.79706],[-119.21569,40.79686],[-119.21569,40.79686],[-119.21599,40.79665],[-119.21599,40.79665],[-119.21617,40.79652],[-119.21622,40.79654],[-119.21628,40.79656],[-119.21633,40.79657],[-119.21639,40.79657],[-119.21644,40.79657],[-119.21649,40.79656],[-119.21654,40.79655],[-119.21659,40.79653],[-119.21671,40.79662],[-119.21673,40.79663],[-119.21702,40.79685],[-119.21673,40.79706],[-119.21668,40.7971],[-119.21667,40.79711],[-119.21643,40.79728],[-119.21612,40.79749],[-119.2158,40.79769],[-119.21548,40.79789],[-119.21532,40.79798],[-119.21477,40.79744]],[[-119.21592,40.79659],[-119.21562,40.7968],[-119.21532,40.797],[-119.215,40.79719],[-119.21471,40.79737],[-119.21416,40.79683],[-119.21428,40.79675],[-119.21428,40.79675],[-119.21459,40.79657],[-119.21459,40.79657],[-119.21489,40.79637],[-119.21489,40.79637],[-119.21518,40.79617],[-119.21518,40.79617],[-119.21547,40.79597],[-119.21547,40.79597],[-119.21566,40.79582],[-119.21609,40.79615],[-119.21606,40.79618],[-119.21604,40.79622],[-119.21603,40.79626],[-119.21603,40.79631],[-119.21603,40.79635],[-119.21605,40.79639],[-119.21607,40.79643],[-119.2161,40.79646],[-119.21592,40.79659]],[[-119.21577,40.79575],[-119.21602,40.79555],[-119.21602,40.79554],[-119.21629,40.79533],[-119.21629,40.79533],[-119.21655,40.7951],[-119.21655,40.7951],[-119.2168,40.79487],[-119.2168,40.79487],[-119.21705,40.79464],[-119.21705,40.79464],[-119.21709,40.7946],[-119.2178,40.79502],[-119.21757,40.79525],[-119.21731,40.79548],[-119.21705,40.79571],[-119.21677,40.79594],[-119.2166,40.79608],[-119.21656,40.79606],[-119.21651,40.79604],[-119.21645,40.79603],[-119.2164,40.79603],[-119.21634,40.79603],[-119.21629,40.79604],[-119.21624,40.79605],[-119.21619,40.79607],[-119.21577,40.79575]],[[-119.21672,40.79482],[-119.21647,40.79505],[-119.21621,40.79527],[-119.21594,40.79549],[-119.21569,40.79569],[-119.21454,40.79482],[-119.21459,40.79478],[-119.21459,40.79478],[-119.21484,40.79457],[-119.21485,40.79457],[-119.2151,40.79436],[-119.2151,40.79436],[-119.21534,40.79415],[-119.21534,40.79415],[-119.21558,40.79393],[-119.21558,40.79393],[-119.21581,40.79371],[-119.21581,40.79371],[-119.21603,40.79348],[-119.21603,40.79348],[-119.21624,40.79325],[-119.21624,40.79325],[-119.21645,40.79301],[-119.21645,40.79301],[-119.21665,40.79277],[-119.21665,40.79277],[-119.2168,40.79258],[-119.2182,40.79319],[-119.21807,40.79337],[-119.21786,40.79362],[-119.21765,40.79387],[-119.21743,40.79411],[-119.2172,40.79435],[-119.21696,40.79459],[-119.21672,40.79482]],[[-119.21655,40.79273],[-119.21636,40.79297],[-119.21615,40.7932],[-119.21594,40.79343],[-119.21572,40.79366],[-119.21549,40.79388],[-119.21526,40.7941],[-119.21501,40.79431],[-119.21477,40.79452],[-119.21451,40.79472],[-119.21446,40.79476],[-119.21382,40.79427],[-119.21406,40.79409],[-119.21406,40.79409],[-119.2143,40.79389],[-119.2143,40.79389],[-119.21454,40.79368],[-119.21454,40.79368],[-119.21477,40.79347],[-119.21477,40.79347],[-119.21499,40.79325],[-119.21499,40.79325],[-119.2152,40.79303],[-119.2152,40.79303],[-119.21541,40.79281],[-119.21541,40.79281],[-119.21561,40.79258],[-119.21561,40.79258],[-119.2158,40.79235],[-119.2158,40.79235],[-119.21592,40.79219],[-119.2167,40.79253],[-119.21655,40.79273]],[[-119.21571,40.79231],[-119.21552,40.79254],[-119.21532,40.79276],[-119.21511,40.79299],[-119.2149,40.7932],[-119.21468,40.79342],[-119.21445,40.79363],[-119.21422,40.79383],[-119.21398,40.79403],[-119.21375,40.79421],[-119.21311,40.79373],[-119.21327,40.7936],[-119.21327,40.7936],[-119.21351,40.79341],[-119.21351,40.79341],[-119.21373,40.79321],[-119.21374,40.79321],[-119.21396,40.79301],[-119.21396,40.79301],[-119.21417,40.7928],[-119.21417,40.7928],[-119.21438,40.79259],[-119.21438,40.79259],[-119.21458,40.79237],[-119.21458,40.79237],[-119.21477,40.79215],[-119.21477,40.79215],[-119.21495,40.79193],[-119.21495,40.79193],[-119.21504,40.79181],[-119.21583,40.79215],[-119.21571,40.79231]],[[-119.21486,40.79189],[-119.21468,40.79211],[-119.21449,40.79233],[-119.21429,40.79254],[-119.21409,40.79275],[-119.21387,40.79296],[-119.21365,40.79316],[-119.21343,40.79335],[-119.21319,40.79355],[-119.21308,40.79363],[-119.21262,40.79333],[-119.21263,40.79331],[-119.21265,40.79327],[-119.21266,40.79323],[-119.21267,40.79318],[-119.21266,40.79314],[-119.21264,40.7931],[-119.21262,40.79306],[-119.21259,40.79303],[-119.21272,40.79293],[-119.21272,40.79293],[-119.21294,40.79274],[-119.21294,40.79274],[-119.21315,40.79254],[-119.21315,40.79254],[-119.21336,40.79235],[-119.21336,40.79235],[-119.21355,40.79214],[-119.21355,40.79214],[-119.21374,40.79194],[-119.21374,40.79194],[-119.21393,40.79173],[-119.21393,40.79172],[-119.2141,40.79151],[-119.2141,40.79151],[-119.21417,40.79142],[-119.21495,40.79177],[-119.21486,40.79189]],[[-119.21422,40.79135],[-119.21427,40.79129],[-119.21427,40.79129],[-119.21443,40.79107],[-119.21443,40.79107],[-119.21458,40.79084],[-119.21458,40.79084],[-119.21472,40.79062],[-119.21472,40.79062],[-119.21485,40.79038],[-119.21485,40.79038],[-119.21498,40.79015],[-119.21498,40.79015],[-119.21509,40.78991],[-119.21509,40.78991],[-119.2152,40.78967],[-119.2152,40.78967],[-119.21529,40.78943],[-119.2153,40.78943],[-119.21535,40.78929],[-119.21622,40.78947],[-119.21621,40.78949],[-119.21612,40.78974],[-119.21601,40.78999],[-119.2159,40.79024],[-119.21577,40.79048],[-119.21564,40.79072],[-119.2155,40.79096],[-119.21535,40.7912],[-119.2152,40.79143],[-119.21503,40.79166],[-119.21501,40.7917],[-119.21422,40.79135]],[[-119.21529,40.79147],[-119.21529,40.79147],[-119.21545,40.79124],[-119.21545,40.79123],[-119.2156,40.791],[-119.2156,40.791],[-119.21574,40.79076],[-119.21574,40.79076],[-119.21587,40.79051],[-119.21588,40.79051],[-119.216,40.79027],[-119.216,40.79027],[-119.21611,40.79002],[-119.21611,40.79002],[-119.21622,40.78977],[-119.21622,40.78976],[-119.21632,40.78951],[-119.21632,40.78951],[-119.21632,40.78949],[-119.2172,40.78967],[-119.21714,40.78982],[-119.21704,40.79008],[-119.21692,40.79034],[-119.2168,40.7906],[-119.21667,40.79085],[-119.21653,40.7911],[-119.21638,40.79135],[-119.21623,40.79159],[-119.21606,40.79183],[-119.21589,40.79207],[-119.21588,40.79208],[-119.2151,40.79174],[-119.21513,40.7917],[-119.21513,40.7917],[-119.21529,40.79147]],[[-119.21616,40.79187],[-119.21616,40.79187],[-119.21632,40.79163],[-119.21632,40.79163],[-119.21648,40.79138],[-119.21648,40.79138],[-119.21663,40.79113],[-119.21663,40.79113],[-119.21677,40.79088],[-119.21677,40.79088],[-119.2169,40.79063],[-119.2169,40.79062],[-119.21702,40.79037],[-119.21702,40.79037],[-119.21714,40.79011],[-119.21714,40.79011],[-119.21724,40.78985],[-119.21724,40.78984],[-119.2173,40.78969],[-119.21817,40.78986],[-119.21816,40.78989],[-119.21806,40.79016],[-119.21795,40.79043],[-119.21783,40.7907],[-119.2177,40.79096],[-119.21756,40.79122],[-119.21741,40.79148],[-119.21726,40.79174],[-119.2171,40.79199],[-119.21692,40.79224],[-119.21676,40.79246],[-119.21598,40.79212],[-119.21598,40.79211],[-119.21598,40.79211],[-119.21616,40.79187]],[[-119.21702,40.79228],[-119.21702,40.79228],[-119.21719,40.79203],[-119.21719,40.79203],[-119.21736,40.79177],[-119.21736,40.79177],[-119.21751,40.79152],[-119.21751,40.79151],[-119.21766,40.79125],[-119.21766,40.79125],[-119.2178,40.79099],[-119.2178,40.79099],[-119.21793,40.79073],[-119.21793,40.79073],[-119.21805,40.79046],[-119.21805,40.79046],[-119.21816,40.79019],[-119.21816,40.79019],[-119.21827,40.78991],[-119.21827,40.78991],[-119.21828,40.78989],[-119.21985,40.79021],[-119.21978,40.79038],[-119.21967,40.79066],[-119.21955,40.79095],[-119.21942,40.79123],[-119.21928,40.7915],[-119.21913,40.79178],[-119.21898,40.79205],[-119.21881,40.79232],[-119.21864,40.79259],[-119.21846,40.79285],[-119.21827,40.79311],[-119.21826,40.79312],[-119.21685,40.7925],[-119.21702,40.79228]],[[-119.21998,40.79015],[-119.21999,40.79011],[-119.21999,40.79011],[-119.22009,40.78982],[-119.22009,40.78982],[-119.22017,40.78953],[-119.22017,40.78953],[-119.22025,40.78924],[-119.22025,40.78924],[-119.22032,40.78895],[-119.22032,40.78894],[-119.22037,40.78865],[-119.22037,40.78865],[-119.22038,40.78861],[-119.22128,40.7887],[-119.22125,40.78886],[-119.22118,40.78917],[-119.22111,40.78947],[-119.22103,40.78977],[-119.22094,40.79007],[-119.22085,40.79032],[-119.21998,40.79015]],[[-119.22104,40.79009],[-119.22104,40.79009],[-119.22114,40.78979],[-119.22114,40.78979],[-119.22122,40.78948],[-119.22122,40.78948],[-119.22129,40.78918],[-119.22129,40.78918],[-119.22135,40.78888],[-119.22135,40.78888],[-119.22138,40.78871],[-119.22228,40.7888],[-119.22222,40.7891],[-119.22215,40.78941],[-119.22208,40.78972],[-119.22199,40.79003],[-119.22189,40.79033],[-119.22183,40.79052],[-119.22096,40.79035],[-119.22104,40.79009]],[[-119.2218,40.7906],[-119.22179,40.79064],[-119.22167,40.79094],[-119.22155,40.79124],[-119.22142,40.79154],[-119.22128,40.79184],[-119.22113,40.79214],[-119.22106,40.79226],[-119.22022,40.792],[-119.22031,40.79185],[-119.22031,40.79185],[-119.22045,40.79156],[-119.22045,40.79156],[-119.22059,40.79127],[-119.22059,40.79127],[-119.22072,40.79098],[-119.22072,40.79098],[-119.22083,40.79068],[-119.22083,40.79068],[-119.22093,40.79043],[-119.2218,40.7906]],[[-119.22103,40.79232],[-119.22097,40.79243],[-119.2208,40.79272],[-119.22063,40.793],[-119.22044,40.79328],[-119.22025,40.79356],[-119.22005,40.79384],[-119.22001,40.79389],[-119.21923,40.79355],[-119.21925,40.79352],[-119.21925,40.79352],[-119.21945,40.79325],[-119.21945,40.79325],[-119.21964,40.79297],[-119.21964,40.79297],[-119.21982,40.7927],[-119.21982,40.7927],[-119.21999,40.79242],[-119.21999,40.79242],[-119.22015,40.79214],[-119.22015,40.79213],[-119.2202,40.79205],[-119.22103,40.79232]],[[-119.22014,40.79388],[-119.22014,40.79388],[-119.22034,40.7936],[-119.22035,40.7936],[-119.22054,40.79332],[-119.22054,40.79332],[-119.22072,40.79304],[-119.22072,40.79304],[-119.2209,40.79275],[-119.2209,40.79275],[-119.22107,40.79246],[-119.22107,40.79246],[-119.22113,40.79235],[-119.22196,40.79261],[-119.22189,40.79275],[-119.22171,40.79305],[-119.22153,40.79334],[-119.22134,40.79363],[-119.22115,40.79392],[-119.22094,40.79421],[-119.22089,40.79427],[-119.2201,40.79393],[-119.22014,40.79388]],[[-119.22083,40.79435],[-119.22072,40.79449],[-119.2205,40.79476],[-119.22027,40.79504],[-119.22003,40.7953],[-119.21979,40.79557],[-119.21953,40.79583],[-119.2195,40.79587],[-119.21878,40.79545],[-119.21901,40.79522],[-119.21901,40.79521],[-119.21925,40.79496],[-119.21925,40.79496],[-119.21949,40.79469],[-119.21949,40.79469],[-119.21971,40.79443],[-119.21971,40.79443],[-119.21993,40.79416],[-119.21993,40.79416],[-119.22005,40.794],[-119.22083,40.79435]],[[-119.21941,40.79595],[-119.21927,40.79609],[-119.219,40.79634],[-119.21873,40.79659],[-119.21845,40.79683],[-119.21816,40.79707],[-119.21786,40.7973],[-119.21783,40.79732],[-119.21755,40.7971],[-119.21751,40.79707],[-119.2172,40.79683],[-119.2174,40.79667],[-119.2174,40.79667],[-119.21756,40.79654],[-119.21763,40.79649],[-119.21769,40.79644],[-119.21769,40.79644],[-119.21797,40.79621],[-119.21797,40.79621],[-119.21824,40.79597],[-119.21824,40.79597],[-119.2185,40.79572],[-119.2185,40.79572],[-119.21869,40.79554],[-119.21941,40.79595]],[[-119.2174,40.79715],[-119.21746,40.79719],[-119.21773,40.7974],[-119.21756,40.79753],[-119.21725,40.79775],[-119.21693,40.79797],[-119.21661,40.79818],[-119.21628,40.79839],[-119.21594,40.79859],[-119.21594,40.79859],[-119.21539,40.79805],[-119.21555,40.79796],[-119.21555,40.79795],[-119.21587,40.79776],[-119.21587,40.79775],[-119.21619,40.79755],[-119.21619,40.79755],[-119.2165,40.79734],[-119.2165,40.79734],[-119.21674,40.79717],[-119.21677,40.79715],[-119.21681,40.79712],[-119.21681,40.79712],[-119.21709,40.79691],[-119.2174,40.79715]],[[-119.21842,40.79567],[-119.21816,40.79591],[-119.21789,40.79615],[-119.21761,40.79639],[-119.21752,40.79646],[-119.21749,40.79648],[-119.21732,40.79662],[-119.21712,40.79678],[-119.21684,40.79656],[-119.21681,40.79654],[-119.21669,40.79645],[-119.21672,40.79641],[-119.21674,40.79637],[-119.21675,40.79633],[-119.21675,40.79629],[-119.21675,40.79625],[-119.21673,40.79621],[-119.21671,40.79617],[-119.21668,40.79613],[-119.21685,40.796],[-119.21685,40.796],[-119.21713,40.79577],[-119.21713,40.79577],[-119.21739,40.79554],[-119.21739,40.79554],[-119.21765,40.7953],[-119.21765,40.7953],[-119.21789,40.79507],[-119.21861,40.79549],[-119.21842,40.79567]],[[-119.21798,40.79498],[-119.21815,40.79481],[-119.21815,40.79481],[-119.21838,40.79456],[-119.21838,40.79456],[-119.21861,40.7943],[-119.21861,40.7943],[-119.21883,40.79405],[-119.21883,40.79405],[-119.21905,40.79378],[-119.21905,40.79378],[-119.21917,40.79362],[-119.21996,40.79396],[-119.21984,40.79411],[-119.21962,40.79438],[-119.2194,40.79465],[-119.21916,40.79491],[-119.21892,40.79517],[-119.21869,40.7954],[-119.21798,40.79498]],[[-119.21895,40.79374],[-119.21874,40.794],[-119.21852,40.79426],[-119.2183,40.79451],[-119.21806,40.79476],[-119.21789,40.79493],[-119.21717,40.79451],[-119.21729,40.7944],[-119.21729,40.7944],[-119.21752,40.79416],[-119.21752,40.79416],[-119.21774,40.79391],[-119.21774,40.79391],[-119.21796,40.79366],[-119.21796,40.79366],[-119.21816,40.79341],[-119.21816,40.79341],[-119.2183,40.79323],[-119.21908,40.79358],[-119.21895,40.79374]],[[-119.21835,40.79316],[-119.21836,40.79315],[-119.21836,40.79315],[-119.21855,40.79289],[-119.21855,40.79289],[-119.21874,40.79263],[-119.21874,40.79262],[-119.21891,40.79236],[-119.21891,40.79236],[-119.21908,40.79209],[-119.21908,40.79209],[-119.21923,40.79181],[-119.21923,40.79181],[-119.21926,40.79176],[-119.2201,40.79202],[-119.22005,40.7921],[-119.21989,40.79238],[-119.21972,40.79266],[-119.21954,40.79294],[-119.21935,40.79321],[-119.21916,40.79348],[-119.21913,40.79351],[-119.21835,40.79316]],[[-119.21929,40.79171],[-119.21938,40.79154],[-119.21938,40.79153],[-119.21952,40.79126],[-119.21952,40.79125],[-119.21965,40.79097],[-119.21965,40.79097],[-119.21977,40.79069],[-119.21978,40.79069],[-119.21989,40.7904],[-119.21989,40.7904],[-119.21995,40.79023],[-119.22082,40.7904],[-119.22073,40.79066],[-119.22061,40.79095],[-119.22049,40.79124],[-119.22035,40.79153],[-119.22021,40.79182],[-119.22012,40.79197],[-119.21929,40.79171]]]},"properties":{"FID":0,"Id":0}}]} \ No newline at end of file diff --git a/Meshtastic/Resources/Toilets.geojson b/Meshtastic/Resources/Toilets.geojson deleted file mode 100644 index fb1e726b..00000000 --- a/Meshtastic/Resources/Toilets.geojson +++ /dev/null @@ -1 +0,0 @@ -{"type":"FeatureCollection","features":[{"type":"Feature","id":0,"geometry":{"type":"Polygon","coordinates":[[[-119.21321,40.79906],[-119.21316,40.799],[-119.21312,40.79894],[-119.21307,40.79888],[-119.21303,40.79882],[-119.21298,40.79876],[-119.21294,40.7987],[-119.21289,40.79864],[-119.21284,40.79858],[-119.2128,40.79852],[-119.21275,40.79846],[-119.21267,40.7985],[-119.21258,40.79854],[-119.21258,40.79854],[-119.21263,40.7986],[-119.21267,40.79866],[-119.21272,40.79872],[-119.21276,40.79878],[-119.21281,40.79884],[-119.21285,40.7989],[-119.21289,40.79896],[-119.21294,40.79902],[-119.21298,40.79908],[-119.21303,40.79913],[-119.21309,40.79911],[-119.21312,40.7991],[-119.21321,40.79906]]]},"properties":{"FID":0,"ref":"toilet"}},{"type":"Feature","id":1,"geometry":{"type":"Polygon","coordinates":[[[-119.21047,40.79576],[-119.21049,40.79578],[-119.21051,40.79582],[-119.21056,40.79588],[-119.2106,40.79594],[-119.21063,40.79597],[-119.21065,40.79599],[-119.21073,40.79596],[-119.21082,40.79592],[-119.21078,40.79586],[-119.21073,40.7958],[-119.21069,40.79574],[-119.21064,40.79568],[-119.2106,40.79562],[-119.21055,40.79556],[-119.21051,40.7955],[-119.21046,40.79545],[-119.21042,40.79539],[-119.21037,40.79533],[-119.21033,40.79534],[-119.21029,40.79536],[-119.21021,40.7954],[-119.21023,40.79542],[-119.21025,40.79546],[-119.2103,40.79552],[-119.21034,40.79558],[-119.21038,40.79564],[-119.21043,40.7957],[-119.21045,40.79573],[-119.21047,40.79576]]]},"properties":{"FID":1,"ref":"toilet"}},{"type":"Feature","id":2,"geometry":{"type":"Polygon","coordinates":[[[-119.21385,40.79445],[-119.21379,40.7944],[-119.21379,40.7944],[-119.21372,40.79435],[-119.21366,40.7944],[-119.21359,40.79445],[-119.21353,40.79449],[-119.21352,40.7945],[-119.21351,40.7945],[-119.21346,40.79454],[-119.21339,40.79459],[-119.21333,40.79463],[-119.21326,40.79468],[-119.21325,40.79469],[-119.21325,40.79469],[-119.21319,40.79473],[-119.21321,40.79474],[-119.21325,40.79478],[-119.2133,40.79481],[-119.21331,40.79483],[-119.21333,40.79482],[-119.21334,40.79481],[-119.21336,40.7948],[-119.21337,40.79479],[-119.21338,40.79478],[-119.21339,40.79478],[-119.21341,40.79477],[-119.21342,40.79475],[-119.21344,40.79474],[-119.21345,40.79474],[-119.21346,40.79473],[-119.21347,40.79472],[-119.21349,40.79471],[-119.2135,40.7947],[-119.21352,40.79469],[-119.21352,40.79469],[-119.21354,40.79468],[-119.21355,40.79467],[-119.21357,40.79465],[-119.21359,40.79464],[-119.2136,40.79463],[-119.21361,40.79462],[-119.21363,40.79461],[-119.21365,40.79459],[-119.21366,40.79459],[-119.21368,40.79457],[-119.21369,40.79456],[-119.21371,40.79455],[-119.21372,40.79454],[-119.21373,40.79454],[-119.21374,40.79453],[-119.21376,40.79452],[-119.21377,40.79451],[-119.21378,40.7945],[-119.21379,40.79449],[-119.2138,40.79448],[-119.21382,40.79447],[-119.21383,40.79446],[-119.21385,40.79445]]]},"properties":{"FID":2,"ref":"toilet"}},{"type":"Feature","id":3,"geometry":{"type":"Polygon","coordinates":[[[-119.21721,40.79721],[-119.21724,40.79723],[-119.21727,40.79726],[-119.21731,40.79728],[-119.21734,40.79731],[-119.21737,40.79733],[-119.2174,40.79736],[-119.21746,40.7974],[-119.21753,40.79745],[-119.21756,40.79748],[-119.21759,40.7975],[-119.21766,40.79745],[-119.21773,40.7974],[-119.21767,40.79735],[-119.21761,40.7973],[-119.21754,40.79725],[-119.21748,40.7972],[-119.21741,40.79715],[-119.21735,40.79711],[-119.21729,40.79706],[-119.21722,40.79701],[-119.21716,40.79696],[-119.21709,40.79691],[-119.21703,40.79696],[-119.21696,40.79701],[-119.21699,40.79704],[-119.21702,40.79706],[-119.21709,40.79711],[-119.21715,40.79716],[-119.21718,40.79719],[-119.21721,40.79721]]]},"properties":{"FID":3,"ref":"toilet"}},{"type":"Feature","id":4,"geometry":{"type":"Polygon","coordinates":[[[-119.21917,40.79362],[-119.21912,40.79369],[-119.21907,40.79376],[-119.21909,40.79377],[-119.21914,40.79379],[-119.21922,40.79383],[-119.2193,40.79386],[-119.21938,40.7939],[-119.21946,40.79393],[-119.21953,40.79397],[-119.21961,40.794],[-119.21969,40.79404],[-119.21977,40.79407],[-119.21984,40.79411],[-119.21984,40.79411],[-119.21989,40.79404],[-119.21996,40.79396],[-119.21988,40.79393],[-119.21987,40.79392],[-119.21985,40.79392],[-119.2198,40.79389],[-119.2198,40.79389],[-119.21972,40.79386],[-119.21972,40.79386],[-119.21964,40.79382],[-119.21964,40.79382],[-119.21957,40.79379],[-119.21957,40.79379],[-119.21949,40.79376],[-119.21949,40.79376],[-119.21941,40.79372],[-119.21941,40.79372],[-119.21933,40.79369],[-119.21933,40.79369],[-119.21925,40.79365],[-119.21925,40.79365],[-119.21917,40.79362]]]},"properties":{"FID":4,"ref":"toilet"}},{"type":"Feature","id":5,"geometry":{"type":"Polygon","coordinates":[[[-119.21571,40.79229],[-119.21572,40.79229],[-119.21577,40.79223],[-119.21583,40.79215],[-119.21575,40.79212],[-119.21567,40.79208],[-119.21559,40.79205],[-119.21551,40.79201],[-119.21544,40.79198],[-119.21536,40.79195],[-119.21528,40.79191],[-119.2152,40.79188],[-119.21512,40.79184],[-119.21504,40.79181],[-119.21499,40.79188],[-119.21494,40.79194],[-119.21494,40.79194],[-119.21498,40.79196],[-119.21502,40.79198],[-119.2151,40.79201],[-119.21517,40.79205],[-119.21525,40.79208],[-119.21533,40.79212],[-119.21541,40.79215],[-119.21548,40.79219],[-119.21552,40.79221],[-119.21556,40.79222],[-119.21564,40.79226],[-119.21571,40.79229]]]},"properties":{"FID":5,"ref":"toilet"}},{"type":"Feature","id":6,"geometry":{"type":"Polygon","coordinates":[[[-119.21679,40.78975],[-119.21683,40.78976],[-119.21688,40.78977],[-119.21696,40.78979],[-119.21705,40.78981],[-119.2171,40.78982],[-119.21714,40.78983],[-119.21716,40.78975],[-119.2172,40.78967],[-119.21711,40.78965],[-119.21702,40.78963],[-119.21694,40.78961],[-119.21685,40.78959],[-119.21676,40.78958],[-119.21667,40.78956],[-119.21659,40.78954],[-119.2165,40.78952],[-119.21641,40.78951],[-119.21632,40.78949],[-119.21631,40.78954],[-119.21629,40.78957],[-119.21627,40.78964],[-119.21631,40.78965],[-119.21636,40.78966],[-119.21644,40.78968],[-119.21653,40.78969],[-119.21662,40.78971],[-119.2167,40.78973],[-119.21675,40.78974],[-119.21679,40.78975]]]},"properties":{"FID":6,"ref":"toilet"}},{"type":"Feature","id":7,"geometry":{"type":"Polygon","coordinates":[[[-119.22093,40.79043],[-119.2209,40.79051],[-119.22087,40.79058],[-119.22096,40.7906],[-119.22105,40.79062],[-119.22113,40.79064],[-119.22122,40.79066],[-119.22131,40.79067],[-119.22139,40.79069],[-119.22148,40.79071],[-119.22157,40.79073],[-119.22166,40.79075],[-119.22174,40.79077],[-119.22177,40.79069],[-119.2218,40.7906],[-119.22171,40.79059],[-119.22163,40.79057],[-119.22154,40.79055],[-119.22145,40.79053],[-119.22137,40.79051],[-119.22128,40.7905],[-119.22119,40.79048],[-119.2211,40.79046],[-119.22102,40.79044],[-119.22093,40.79043]]]},"properties":{"FID":7,"ref":"toilet"}},{"type":"Feature","id":8,"geometry":{"type":"Polygon","coordinates":[[[-119.21677,40.78715],[-119.21767,40.78716],[-119.21767,40.78709],[-119.21767,40.78701],[-119.21677,40.78701],[-119.21677,40.78708],[-119.21677,40.78715]]]},"properties":{"FID":8,"ref":"toilet"}},{"type":"Feature","id":9,"geometry":{"type":"Polygon","coordinates":[[[-119.22255,40.78701],[-119.22255,40.78708],[-119.22255,40.78715],[-119.22345,40.78716],[-119.22345,40.78708],[-119.22345,40.78701],[-119.22255,40.78701]]]},"properties":{"FID":9,"ref":"toilet"}},{"type":"Feature","id":10,"geometry":{"type":"Polygon","coordinates":[[[-119.22188,40.78355],[-119.22186,40.78347],[-119.22183,40.78338],[-119.22096,40.78356],[-119.22098,40.78365],[-119.22101,40.78372],[-119.22188,40.78355]]]},"properties":{"FID":10,"ref":"toilet"}},{"type":"Feature","id":11,"geometry":{"type":"Polygon","coordinates":[[[-119.2164,40.78465],[-119.21728,40.78448],[-119.21725,40.78441],[-119.21722,40.78432],[-119.21635,40.7845],[-119.21638,40.78458],[-119.2164,40.78465]]]},"properties":{"FID":11,"ref":"toilet"}},{"type":"Feature","id":12,"geometry":{"type":"Polygon","coordinates":[[[-119.2152,40.78231],[-119.21599,40.78198],[-119.21594,40.78191],[-119.21589,40.78184],[-119.21511,40.78219],[-119.21515,40.78225],[-119.2152,40.78231]]]},"properties":{"FID":12,"ref":"toilet"}},{"type":"Feature","id":13,"geometry":{"type":"Polygon","coordinates":[[[-119.21933,40.7805],[-119.22012,40.78017],[-119.22007,40.7801],[-119.22002,40.78003],[-119.21923,40.78037],[-119.21928,40.78044],[-119.21933,40.7805]]]},"properties":{"FID":13,"ref":"toilet"}},{"type":"Feature","id":14,"geometry":{"type":"Polygon","coordinates":[[[-119.21709,40.777],[-119.21773,40.77651],[-119.21766,40.77646],[-119.21759,40.77641],[-119.21695,40.7769],[-119.21702,40.77695],[-119.21709,40.777]]]},"properties":{"FID":14,"ref":"toilet"}},{"type":"Feature","id":15,"geometry":{"type":"Polygon","coordinates":[[[-119.21322,40.78007],[-119.21316,40.78012],[-119.21309,40.78017],[-119.21314,40.78021],[-119.21316,40.78022],[-119.21322,40.78027],[-119.21328,40.78032],[-119.2133,40.78033],[-119.2133,40.78033],[-119.21334,40.78037],[-119.21341,40.78042],[-119.21347,40.78047],[-119.21353,40.78052],[-119.21353,40.78052],[-119.21353,40.78053],[-119.21359,40.78057],[-119.21365,40.78062],[-119.21371,40.78068],[-119.21373,40.78066],[-119.21377,40.78063],[-119.21382,40.7806],[-119.21384,40.78059],[-119.21378,40.78053],[-119.21372,40.78048],[-119.21368,40.78045],[-119.21366,40.78043],[-119.2136,40.78038],[-119.21354,40.78033],[-119.21348,40.78028],[-119.21346,40.78026],[-119.21341,40.78023],[-119.21335,40.78017],[-119.21329,40.78012],[-119.21322,40.78007]]]},"properties":{"FID":15,"ref":"toilet"}},{"type":"Feature","id":16,"geometry":{"type":"Polygon","coordinates":[[[-119.213,40.78123],[-119.21314,40.78114],[-119.21308,40.78109],[-119.21302,40.78104],[-119.21288,40.78113],[-119.21294,40.78118],[-119.213,40.78123]]]},"properties":{"FID":16,"ref":"toilet"}},{"type":"Feature","id":17,"geometry":{"type":"Polygon","coordinates":[[[-119.21176,40.78028],[-119.21183,40.78032],[-119.2119,40.78037],[-119.2119,40.78037],[-119.21195,40.78032],[-119.21196,40.78032],[-119.21198,40.7803],[-119.21198,40.7803],[-119.21202,40.78026],[-119.21195,40.78022],[-119.21195,40.78022],[-119.21188,40.78017],[-119.21188,40.78017],[-119.21188,40.78017],[-119.21182,40.78022],[-119.21176,40.78028]]]},"properties":{"FID":17,"ref":"toilet"}},{"type":"Feature","id":18,"geometry":{"type":"Polygon","coordinates":[[[-119.21021,40.77851],[-119.21029,40.77855],[-119.21037,40.77858],[-119.21082,40.77799],[-119.21073,40.77795],[-119.21064,40.77792],[-119.21021,40.77851]]]},"properties":{"FID":18,"ref":"toilet"}},{"type":"Feature","id":19,"geometry":{"type":"Polygon","coordinates":[[[-119.21275,40.77545],[-119.2132,40.77485],[-119.21311,40.77481],[-119.21302,40.77477],[-119.21258,40.77537],[-119.21267,40.77541],[-119.21275,40.77545]]]},"properties":{"FID":19,"ref":"toilet"}},{"type":"Feature","id":20,"geometry":{"type":"Polygon","coordinates":[[[-119.20835,40.7741],[-119.20844,40.77412],[-119.20856,40.77414],[-119.20879,40.77348],[-119.20867,40.77345],[-119.20857,40.77343],[-119.20835,40.7741]]]},"properties":{"FID":20,"ref":"toilet"}},{"type":"Feature","id":21,"geometry":{"type":"Polygon","coordinates":[[[-119.20712,40.7776],[-119.20721,40.77762],[-119.20732,40.77764],[-119.20735,40.77757],[-119.20737,40.77751],[-119.20739,40.77744],[-119.20742,40.77737],[-119.20744,40.77731],[-119.20746,40.77724],[-119.20749,40.77717],[-119.20751,40.77711],[-119.20753,40.77704],[-119.20756,40.77698],[-119.20744,40.77695],[-119.20734,40.77693],[-119.20734,40.77693],[-119.20733,40.77696],[-119.20732,40.777],[-119.2073,40.77707],[-119.20728,40.77713],[-119.20726,40.7772],[-119.20723,40.77727],[-119.20722,40.77731],[-119.20721,40.77733],[-119.2072,40.77736],[-119.20719,40.7774],[-119.20717,40.77747],[-119.20715,40.77753],[-119.20713,40.77757],[-119.20712,40.7776]]]},"properties":{"FID":21,"ref":"toilet"}},{"type":"Feature","id":22,"geometry":{"type":"Polygon","coordinates":[[[-119.20402,40.77293],[-119.20402,40.77224],[-119.20392,40.77224],[-119.20382,40.77224],[-119.20383,40.77293],[-119.20393,40.77293],[-119.20402,40.77293]]]},"properties":{"FID":22,"ref":"toilet"}},{"type":"Feature","id":23,"geometry":{"type":"Polygon","coordinates":[[[-119.20402,40.77732],[-119.20402,40.77664],[-119.20392,40.77664],[-119.20382,40.77664],[-119.20383,40.77732],[-119.20393,40.77732],[-119.20402,40.77732]]]},"properties":{"FID":23,"ref":"toilet"}},{"type":"Feature","id":24,"geometry":{"type":"Polygon","coordinates":[[[-119.20076,40.77766],[-119.20053,40.777],[-119.20041,40.77702],[-119.20032,40.77704],[-119.20056,40.7777],[-119.20065,40.77768],[-119.20076,40.77766]]]},"properties":{"FID":24,"ref":"toilet"}},{"type":"Feature","id":25,"geometry":{"type":"Polygon","coordinates":[[[-119.19953,40.77416],[-119.19929,40.7735],[-119.19918,40.77352],[-119.19908,40.77354],[-119.19932,40.7742],[-119.19942,40.77418],[-119.19953,40.77416]]]},"properties":{"FID":25,"ref":"toilet"}},{"type":"Feature","id":26,"geometry":{"type":"Polygon","coordinates":[[[-119.19533,40.77549],[-119.19488,40.7749],[-119.19477,40.77495],[-119.19468,40.77499],[-119.19514,40.77558],[-119.19523,40.77554],[-119.19533,40.77549]]]},"properties":{"FID":26,"ref":"toilet"}},{"type":"Feature","id":27,"geometry":{"type":"Polygon","coordinates":[[[-119.19771,40.77863],[-119.19726,40.77804],[-119.19716,40.77808],[-119.19707,40.77812],[-119.19753,40.77871],[-119.19761,40.77868],[-119.19771,40.77863]]]},"properties":{"FID":27,"ref":"toilet"}},{"type":"Feature","id":28,"geometry":{"type":"Polygon","coordinates":[[[-119.19086,40.77718],[-119.19093,40.77713],[-119.191,40.77708],[-119.19036,40.77659],[-119.19029,40.77664],[-119.19022,40.7767],[-119.19086,40.77718]]]},"properties":{"FID":28,"ref":"toilet"}},{"type":"Feature","id":29,"geometry":{"type":"Polygon","coordinates":[[[-119.19424,40.77954],[-119.19417,40.77959],[-119.19411,40.77964],[-119.19405,40.77969],[-119.19398,40.77974],[-119.19392,40.77979],[-119.19386,40.77984],[-119.1938,40.7799],[-119.19374,40.77995],[-119.19367,40.78],[-119.19361,40.78005],[-119.19375,40.78014],[-119.19381,40.78009],[-119.19387,40.78004],[-119.19393,40.77999],[-119.19399,40.77994],[-119.19405,40.77989],[-119.19411,40.77984],[-119.19418,40.77979],[-119.19424,40.77974],[-119.1943,40.77969],[-119.19437,40.77964],[-119.19424,40.77954]]]},"properties":{"FID":29,"ref":"toilet"}},{"type":"Feature","id":30,"geometry":{"type":"Polygon","coordinates":[[[-119.19299,40.78231],[-119.19304,40.78225],[-119.19308,40.78219],[-119.1923,40.78184],[-119.19225,40.78191],[-119.1922,40.78197],[-119.19299,40.78231]]]},"properties":{"FID":30,"ref":"toilet"}},{"type":"Feature","id":31,"geometry":{"type":"Polygon","coordinates":[[[-119.18886,40.7805],[-119.18891,40.78044],[-119.18895,40.78037],[-119.18817,40.78003],[-119.18812,40.7801],[-119.18807,40.78017],[-119.18886,40.7805]]]},"properties":{"FID":31,"ref":"toilet"}},{"type":"Feature","id":32,"geometry":{"type":"Polygon","coordinates":[[[-119.20808,40.79956],[-119.20806,40.7995],[-119.20771,40.79958],[-119.20773,40.79963],[-119.20808,40.79956]]]},"properties":{"FID":32,"ref":"toilet"}},{"type":"Feature","id":33,"geometry":{"type":"Polygon","coordinates":[[[-119.20647,40.79514],[-119.20613,40.79522],[-119.20614,40.79527],[-119.20649,40.7952],[-119.20647,40.79514]]]},"properties":{"FID":33,"ref":"toilet"}},{"type":"Feature","id":34,"geometry":{"type":"Polygon","coordinates":[[[-119.20759,40.78969],[-119.20734,40.78989],[-119.20739,40.78992],[-119.20764,40.78973],[-119.20759,40.78969]]]},"properties":{"FID":34,"ref":"toilet"}},{"type":"Feature","id":35,"geometry":{"type":"Polygon","coordinates":[[[-119.20229,40.78698],[-119.20229,40.78693],[-119.20193,40.78693],[-119.20193,40.78698],[-119.20229,40.78698]]]},"properties":{"FID":35,"ref":"toilet"}},{"type":"Feature","id":36,"geometry":{"type":"Polygon","coordinates":[[[-119.20044,40.78426],[-119.20019,40.78445],[-119.20024,40.78449],[-119.20049,40.7843],[-119.20044,40.78426]]]},"properties":{"FID":36,"ref":"toilet"}},{"type":"Feature","id":37,"geometry":{"type":"Polygon","coordinates":[[[-119.1874,40.78403],[-119.18733,40.78401],[-119.18724,40.78428],[-119.18731,40.78429],[-119.1874,40.78403]]]},"properties":{"FID":37,"ref":"toilet"}},{"type":"Feature","id":38,"geometry":{"type":"Polygon","coordinates":[[[-119.19321,40.78508],[-119.19314,40.78506],[-119.19304,40.78533],[-119.19311,40.78534],[-119.19321,40.78508]]]},"properties":{"FID":38,"ref":"toilet"}},{"type":"Feature","id":39,"geometry":{"type":"Polygon","coordinates":[[[-119.19539,40.7914],[-119.19503,40.7914],[-119.19503,40.79145],[-119.19539,40.79145],[-119.19539,40.7914]]]},"properties":{"FID":39,"ref":"toilet"}},{"type":"Feature","id":40,"geometry":{"type":"Polygon","coordinates":[[[-119.1978,40.8015],[-119.19763,40.80146],[-119.19761,40.80151],[-119.19778,40.80155],[-119.1978,40.8015]]]},"properties":{"FID":40,"ref":"toilet"}},{"type":"Feature","id":41,"geometry":{"type":"Polygon","coordinates":[[[-119.19988,40.80388],[-119.19971,40.80385],[-119.19969,40.80391],[-119.19987,40.80393],[-119.19988,40.80388]]]},"properties":{"FID":41,"ref":"toilet"}},{"type":"Feature","id":42,"geometry":{"type":"Polygon","coordinates":[[[-119.20299,40.80224],[-119.20281,40.80223],[-119.2028,40.80228],[-119.20298,40.80229],[-119.20299,40.80224]]]},"properties":{"FID":42,"ref":"toilet"}},{"type":"Feature","id":43,"geometry":{"type":"Polygon","coordinates":[[[-119.19251,40.80145],[-119.19235,40.80138],[-119.19232,40.80143],[-119.19247,40.8015],[-119.19251,40.80145]]]},"properties":{"FID":43,"ref":"toilet"}},{"type":"Feature","id":44,"geometry":{"type":"Polygon","coordinates":[[[-119.18499,40.79577],[-119.18492,40.7958],[-119.18502,40.79592],[-119.18508,40.79589],[-119.18499,40.79577]]]},"properties":{"FID":44,"ref":"toilet"}}]} \ No newline at end of file diff --git a/Meshtastic/Resources/Trash_Fence.geojson b/Meshtastic/Resources/Trash_Fence.geojson deleted file mode 100644 index 9889b05b..00000000 --- a/Meshtastic/Resources/Trash_Fence.geojson +++ /dev/null @@ -1 +0,0 @@ -{"type":"FeatureCollection","features":[{"type":"Feature","id":0,"geometry":{"type":"Polygon","coordinates":[[[-119.1828,40.80314],[-119.21777,40.80735],[-119.23383,40.78337],[-119.2088,40.76435],[-119.17727,40.77656],[-119.1828,40.80314]]]},"properties":{"FID":0,"Id":0}}]} \ No newline at end of file diff --git a/Meshtastic/Views/Nodes/Helpers/Map/MapContent/MeshMapContent.swift b/Meshtastic/Views/Nodes/Helpers/Map/MapContent/MeshMapContent.swift index a319085e..85d88838 100644 --- a/Meshtastic/Views/Nodes/Helpers/Map/MapContent/MeshMapContent.swift +++ b/Meshtastic/Views/Nodes/Helpers/Map/MapContent/MeshMapContent.swift @@ -231,47 +231,37 @@ struct MeshMapContent: MapContent { } } - /// Burning Man GeoJSON Overlays + /// GeoJSON Overlays (Configuration-Driven) if showBurningMan { - // Load and display street outlines - let streetOverlays = GeoJSONOverlayManager.shared.loadOverlays(for: .streetOutlines) - let streetIdentifiableOverlays = streetOverlays.map { IdentifiableOverlay(overlay: $0) } - ForEach(streetIdentifiableOverlays) { identifiable in - let overlay = identifiable.overlay - if let polygon = overlay as? MKPolygon { - MapPolygon(polygon) - .stroke(.green.opacity(0.8), lineWidth: 0.5) - .foregroundStyle(.clear) - } else if let polyline = overlay as? MKPolyline { - MapPolyline(polyline) - .stroke(.green.opacity(0.9), lineWidth: 0.8) - } - } + let overlayManager = GeoJSONOverlayManager.shared + let availableOverlays = overlayManager.getAvailableOverlayIds() - // Load and display toilets - let toiletOverlays = GeoJSONOverlayManager.shared.loadOverlays(for: .toilets) - let toiletIdentifiableOverlays = toiletOverlays.map { IdentifiableOverlay(overlay: $0) } - ForEach(toiletIdentifiableOverlays) { identifiable in - let overlay = identifiable.overlay - if let polygon = overlay as? MKPolygon { - MapPolygon(polygon) - .stroke(.blue, lineWidth: 2) - .foregroundStyle(.blue.opacity(1.0)) - } - } + ForEach(availableOverlays, id: \.self) { overlayId in + let overlays = overlayManager.loadOverlays(for: overlayId) + let rendering = overlayManager.getRenderingProperties(for: overlayId) - // Load and display trash fence - let trashFenceOverlays = GeoJSONOverlayManager.shared.loadOverlays(for: .trashFence) - let trashFenceIdentifiableOverlays = trashFenceOverlays.map { IdentifiableOverlay(overlay: $0) } - ForEach(trashFenceIdentifiableOverlays) { identifiable in - let overlay = identifiable.overlay - if let polyline = overlay as? MKPolyline { - MapPolyline(polyline) - .stroke(.red, lineWidth: 2) - } else if let polygon = overlay as? MKPolygon { - MapPolygon(polygon) - .stroke(.red, lineWidth: 2) - .foregroundStyle(.clear) + ForEach(overlays.map { IdentifiableOverlay(overlay: $0) }) { identifiable in + let overlay = identifiable.overlay + + if let polygon = overlay as? MKPolygon { + MapPolygon(polygon) + .stroke( + Color(hex: rendering?.lineColor ?? "#000000") + .opacity(rendering?.lineOpacity ?? 1.0), + lineWidth: rendering?.lineThickness ?? 1.0 + ) + .foregroundStyle( + Color(hex: rendering?.lineColor ?? "#000000") + .opacity(rendering?.fillOpacity ?? 0.0) + ) + } else if let polyline = overlay as? MKPolyline { + MapPolyline(polyline) + .stroke( + Color(hex: rendering?.lineColor ?? "#000000") + .opacity(rendering?.lineOpacity ?? 1.0), + lineWidth: rendering?.lineThickness ?? 1.0 + ) + } } } } From 64c96ccb94fe2addbc45ac8dce244d4fd2617b92 Mon Sep 17 00:00:00 2001 From: Jacob Powers Date: Fri, 18 Jul 2025 01:48:18 +0000 Subject: [PATCH 06/19] updates - compressed overlay data --- .../Helpers/GeoJSONOverlayManager.swift | 42 ++---------------- .../BurningManGeoJSONMapConfig.json.zlib | Bin 34272 -> 34240 bytes .../Map/MapContent/MeshMapContent.swift | 8 ++-- 3 files changed, 6 insertions(+), 44 deletions(-) diff --git a/Meshtastic/Helpers/GeoJSONOverlayManager.swift b/Meshtastic/Helpers/GeoJSONOverlayManager.swift index 48feecdb..78187fc3 100644 --- a/Meshtastic/Helpers/GeoJSONOverlayManager.swift +++ b/Meshtastic/Helpers/GeoJSONOverlayManager.swift @@ -16,55 +16,32 @@ class GeoJSONOverlayManager { } guard let url = Bundle.main.url(forResource: "BurningManGeoJSONMapConfig", withExtension: "json.zlib") else { - print("GeoJSONOverlayManager: No compressed configuration file found") return nil } do { let compressedData = try Data(contentsOf: url) - print("GeoJSONOverlayManager: Loaded compressed data size: \(compressedData.count) bytes") - let decompressedData = try compressedData.zlibDecompressed() - print("GeoJSONOverlayManager: Decompressed data size: \(decompressedData.count) bytes") - - // Debug: Check the first few characters of decompressed data - if let decompressedString = String(data: decompressedData, encoding: .utf8) { - let firstChars = String(decompressedString.prefix(100)) - print("GeoJSONOverlayManager: First 100 chars of decompressed data: \(firstChars)") - } else { - print("GeoJSONOverlayManager: Decompressed data is not valid UTF-8") - // Show first few bytes as hex - let firstBytes = decompressedData.prefix(20).map { String(format: "%02x", $0) }.joined() - print("GeoJSONOverlayManager: First 20 bytes (hex): \(firstBytes)") - } - let config = try JSONDecoder().decode(GeoJSONOverlayConfiguration.self, from: decompressedData) - print("GeoJSONOverlayManager: Loaded configuration with \(config.overlays.count) overlays") configuration = config return config } catch { - print("GeoJSONOverlayManager: Failed to load configuration: \(error)") return nil } } /// Load overlays for a specific overlay ID func loadOverlays(for overlayId: String) -> [MKOverlay] { - print("GeoJSONOverlayManager: Attempting to load overlays for \(overlayId)") - if let cached = overlays[overlayId] { - print("GeoJSONOverlayManager: Returning cached overlays for \(overlayId), count: \(cached.count)") return cached } guard let config = loadConfiguration() else { - print("GeoJSONOverlayManager: Failed to load configuration") return [] } guard let overlayDef = config.overlays.first(where: { $0.id == overlayId }) else { - print("GeoJSONOverlayManager: No overlay found for ID: \(overlayId)") return [] } @@ -78,48 +55,35 @@ class GeoJSONOverlayManager { "geometry": [ "type": feature.geometry.type, "coordinates": feature.geometry.coordinates.toAnyObject() - ] + ], + "properties": [:] ] if let id = feature.id { featureDict["id"] = id } - if let properties = feature.properties { - featureDict["properties"] = properties.mapValues { $0.toAnyObject() } - } - return featureDict } ] let geojsonData = try JSONSerialization.data(withJSONObject: standardGeoJSON) let features = try MKGeoJSONDecoder().decode(geojsonData) - print("GeoJSONOverlayManager: Decoded \(features.count) features for \(overlayId)") var allOverlays: [MKOverlay] = [] for (index, feature) in features.enumerated() { if let mkFeature = feature as? MKGeoJSONFeature { - print("GeoJSONOverlayManager: Feature \(index) has \(mkFeature.geometry.count) geometries") for (geoIndex, geometry) in mkFeature.geometry.enumerated() { - print("GeoJSONOverlayManager: Geometry \(geoIndex): \(Swift.type(of: geometry))") if let overlay = geometry as? MKOverlay { allOverlays.append(overlay) - print("GeoJSONOverlayManager: Added as overlay") - } else { - print("GeoJSONOverlayManager: Could not cast to MKOverlay") } } - } else { - print("GeoJSONOverlayManager: Feature \(index) could not be cast to MKGeoJSONFeature") } } - print("GeoJSONOverlayManager: Created \(allOverlays.count) total overlays for \(overlayId)") - overlays[overlayId] = allOverlays + overlays[overlayId] = allOverlays return allOverlays } catch { - print("GeoJSONOverlayManager: Failed to decode overlays for \(overlayId): \(error)") return [] } } diff --git a/Meshtastic/Resources/BurningManGeoJSONMapConfig.json.zlib b/Meshtastic/Resources/BurningManGeoJSONMapConfig.json.zlib index 773128ca84bd80da8695e85ca6a952e37415ae44..c07ee6f615784fb2fd7bb9696114094c815eab97 100644 GIT binary patch literal 34240 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

BXNcs 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 Y8q@~KSZ@llEsOBm`ETtp!rXlQFUMktbN~PV diff --git a/Meshtastic/Views/Nodes/Helpers/Map/MapContent/MeshMapContent.swift b/Meshtastic/Views/Nodes/Helpers/Map/MapContent/MeshMapContent.swift index 85d88838..04f8c2e9 100644 --- a/Meshtastic/Views/Nodes/Helpers/Map/MapContent/MeshMapContent.swift +++ b/Meshtastic/Views/Nodes/Helpers/Map/MapContent/MeshMapContent.swift @@ -231,18 +231,16 @@ struct MeshMapContent: MapContent { } } - /// GeoJSON Overlays (Configuration-Driven) + /// GeoJSON Overlays (Configuration-Driven) if showBurningMan { let overlayManager = GeoJSONOverlayManager.shared let availableOverlays = overlayManager.getAvailableOverlayIds() - ForEach(availableOverlays, id: \.self) { overlayId in + ForEach(Array(availableOverlays.enumerated()), id: \.element) { _, overlayId in let overlays = overlayManager.loadOverlays(for: overlayId) let rendering = overlayManager.getRenderingProperties(for: overlayId) - ForEach(overlays.map { IdentifiableOverlay(overlay: $0) }) { identifiable in - let overlay = identifiable.overlay - + ForEach(Array(overlays.enumerated()), id: \.offset) { _, overlay in if let polygon = overlay as? MKPolygon { MapPolygon(polygon) .stroke( From d32c43eafd9ed2d951a22e3d2accc28f5d30717a Mon Sep 17 00:00:00 2001 From: Jacob Powers Date: Fri, 18 Jul 2025 02:34:59 +0000 Subject: [PATCH 07/19] optimized streets --- .../BurningManGeoJSONMapConfig.json.zlib | Bin 34240 -> 21773 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/Meshtastic/Resources/BurningManGeoJSONMapConfig.json.zlib b/Meshtastic/Resources/BurningManGeoJSONMapConfig.json.zlib index c07ee6f615784fb2fd7bb9696114094c815eab97..bcb493e10b28a5e8f3bfa9db8cd330f8c7ae40f3 100644 GIT binary patch literal 21773 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 A6aWAK literal 34240 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 Date: Fri, 18 Jul 2025 03:31:24 +0000 Subject: [PATCH 08/19] remove stale file --- .../BurningManGeoJSONMapConfig.json.gz | Bin 33876 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 Meshtastic/Resources/BurningManGeoJSONMapConfig.json.gz diff --git a/Meshtastic/Resources/BurningManGeoJSONMapConfig.json.gz b/Meshtastic/Resources/BurningManGeoJSONMapConfig.json.gz deleted file mode 100644 index 6b9bf085bc7d0befe8716826c33ce66d8a267ea1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 33876 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 From 7e0d37d76fe0d824339174129d23d5240211a015 Mon Sep 17 00:00:00 2001 From: Jacob Powers Date: Mon, 21 Jul 2025 21:42:36 +0000 Subject: [PATCH 09/19] remove some burning man references --- Localizable.xcstrings | 558 ++++++++++++++++-- Meshtastic.xcodeproj/project.pbxproj | 12 +- .../Helpers/GeoJSONOverlayManager.swift | 34 +- Meshtastic/Helpers/MapDataManager.swift | 378 ++++++++++++ Meshtastic/Info.plist | 90 +++ Meshtastic/MeshtasticApp.swift | 3 + .../BurningManGeoJSONMapConfig.json.zlib | Bin 21773 -> 0 bytes .../Map/MapContent/MeshMapContent.swift | 6 +- .../Nodes/Helpers/Map/MapSettingsForm.swift | 49 +- Meshtastic/Views/Settings/AppData.swift | 27 + Meshtastic/Views/Settings/MapDataUpload.swift | 273 +++++++++ 11 files changed, 1369 insertions(+), 61 deletions(-) create mode 100644 Meshtastic/Helpers/MapDataManager.swift delete mode 100644 Meshtastic/Resources/BurningManGeoJSONMapConfig.json.zlib create mode 100644 Meshtastic/Views/Settings/MapDataUpload.swift diff --git a/Localizable.xcstrings b/Localizable.xcstrings index aa955d27..ee7f5824 100644 --- a/Localizable.xcstrings +++ b/Localizable.xcstrings @@ -1381,6 +1381,40 @@ } } }, + "%lld overlays" : { + "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld sovrapposizioni" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lldオーバーレイ" + } + }, + "sr" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld slojeva" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld覆盖层" + } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld覆蓋層" + } + } + } + }, "%lld Readings Total" : { "localizations" : { "it" : { @@ -1545,6 +1579,9 @@ } } }, + "•" : { + "shouldTranslate" : false + }, "• %@" : { "shouldTranslate" : false }, @@ -5814,40 +5851,6 @@ } } }, - "Burning Man" : { - "localizations" : { - "he" : { - "stringUnit" : { - "state" : "translated", - "value" : "ברנינג מן" - } - }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "バーニングマン" - } - }, - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Бернинг Мен" - } - }, - "zh-Hans" : { - "stringUnit" : { - "state" : "translated", - "value" : "火人节" - } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "火人節" - } - } - } - }, "Button GPIO" : { "localizations" : { "it" : { @@ -20364,6 +20367,41 @@ } } }, + "Manage custom map overlays" : { + "comment" : "Subtitle for map data management", + "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Gestisci sovrapposizioni mappa personalizzate" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "カスタムマップオーバーレイを管理" + } + }, + "sr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Upravljaj prilagođenim slojevima mape" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "管理自定义地图覆盖层" + } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "管理自訂地圖覆蓋層" + } + } + } + }, "Managed Device" : { "localizations" : { "it" : { @@ -20462,6 +20500,40 @@ } } }, + "Map Data" : { + "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Dati Mappa" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "マップデータ" + } + }, + "sr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Podaci Mape" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "地图数据" + } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "地圖資料" + } + } + } + }, "Map Options" : { "localizations" : { "de" : { @@ -23083,6 +23155,41 @@ } } }, + "No Data" : { + "comment" : "Data source label when no files are available", + "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Nessun Dato" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "データなし" + } + }, + "sr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Bez Podataka" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "无数据" + } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "無資料" + } + } + } + }, "No device connected" : { "localizations" : { "de" : { @@ -23209,6 +23316,41 @@ } } }, + "No files uploaded yet" : { + "comment" : "Empty state text when no files are uploaded", + "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Nessun file caricato ancora" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "まだファイルがアップロードされていません" + } + }, + "sr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Još uvek nema otpremljenih datoteka" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "尚未上传文件" + } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "尚未上傳檔案" + } + } + } + }, "No Interface" : { "localizations" : { "de" : { @@ -27726,6 +27868,40 @@ } } }, + "Processing file..." : { + "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Elaborazione file..." + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "ファイル処理中..." + } + }, + "sr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Obrada datoteke..." + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "正在处理文件..." + } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "正在處理檔案..." + } + } + } + }, "Project information" : { "localizations" : { "it" : { @@ -31740,6 +31916,41 @@ } } }, + "Select Map Data File" : { + "comment" : "Button text for selecting map data file", + "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Seleziona File Dati Mappa" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "マップデータファイルを選択" + } + }, + "sr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Izaberi Datoteku Podataka Mape" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "选择地图数据文件" + } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "選擇地圖資料檔案" + } + } + } + }, "Select Node" : { "localizations" : { "de" : { @@ -39875,6 +40086,213 @@ } } }, + "Upload Error" : { + "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Errore Caricamento" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "アップロードエラー" + } + }, + "sr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Greška Otpremanja" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "上传错误" + } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "上傳錯誤" + } + } + } + }, + "Upload GeoJSON files to display custom map overlays. Files are stored locally and can be up to 10MB." : { + "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Carica file GeoJSON per visualizzare sovrapposizioni mappa personalizzate. I file sono memorizzati localmente e possono essere fino a 10MB." + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "カスタムマップオーバーレイを表示するためにGeoJSONファイルをアップロードしてください。ファイルはローカルに保存され、最大10MBまでです。" + } + }, + "sr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Otpremi GeoJSON datoteke da prikažeš prilagođene slojeve mape. Datoteke se čuvaju lokalno i mogu biti do 10MB." + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "上传GeoJSON文件以显示自定义地图覆盖层。文件本地存储,最大10MB。" + } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "上傳GeoJSON檔案以顯示自訂地圖覆蓋層。檔案本機儲存,最大10MB。" + } + } + } + }, + "Upload Map Data" : { + "comment" : "Title for map data upload screen", + "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Carica Dati Mappa" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "マップデータをアップロード" + } + }, + "sr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Otpremi Podatke Mape" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "上传地图数据" + } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "上傳地圖資料" + } + } + } + }, + "Upload map data to enable overlays" : { + "comment" : "Prompt to upload map data when none is available", + "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Carica dati mappa per abilitare sovrapposizioni" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "オーバーレイを有効にするにはマップデータをアップロード" + } + }, + "sr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Otpremi podatke mape da omogućiš slojeve" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "上传地图数据以启用覆盖层" + } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "上傳地圖資料以啟用覆蓋層" + } + } + } + }, + "Upload Success" : { + "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Caricamento Riuscito" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "アップロード成功" + } + }, + "sr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Uspešno Otpremanje" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "上传成功" + } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "上傳成功" + } + } + } + }, + "Uploaded Files" : { + "comment" : "Section header for uploaded files", + "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "File Caricati" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "アップロードされたファイル" + } + }, + "sr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Otpremljene Datoteke" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "已上传文件" + } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "已上傳檔案" + } + } + } + }, "Uptime" : { "localizations" : { "it" : { @@ -40309,6 +40727,41 @@ } } }, + "User Uploaded" : { + "comment" : "Data source label for user uploaded files", + "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Caricato dall'Utente" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "ユーザーがアップロード" + } + }, + "sr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Otpremio Korisnik" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "用户上传" + } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "使用者上傳" + } + } + } + }, "Username" : { "localizations" : { "de" : { @@ -40401,6 +40854,41 @@ } } }, + "Using %@ data" : { + "comment" : "Shows which data source is being used", + "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Utilizzo dati %@" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@データを使用" + } + }, + "sr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Koristi %@ podatke" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "使用%@数据" + } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "使用%@資料" + } + } + } + }, "Utilizes the network connection on your phone to connect to MQTT." : { "localizations" : { "it" : { @@ -42325,4 +42813,4 @@ } }, "version" : "1.0" -} \ No newline at end of file +} diff --git a/Meshtastic.xcodeproj/project.pbxproj b/Meshtastic.xcodeproj/project.pbxproj index 98753d57..43118390 100644 --- a/Meshtastic.xcodeproj/project.pbxproj +++ b/Meshtastic.xcodeproj/project.pbxproj @@ -60,7 +60,8 @@ 3D3417C82E29D38A006A988B /* GeoJSONOverlayConfig.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3D3417C72E29D38A006A988B /* GeoJSONOverlayConfig.swift */; }; 3D3417CB2E29D3B0006A988B /* Color+Hex.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3D3417C92E29D3B0006A988B /* Color+Hex.swift */; }; 3D3417CC2E29D3B0006A988B /* Data+Gzip.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3D3417CA2E29D3B0006A988B /* Data+Gzip.swift */; }; - 3D3417CE2E29D5D6006A988B /* BurningManGeoJSONMapConfig.json.zlib in Resources */ = {isa = PBXBuildFile; fileRef = 3D3417CD2E29D5D6006A988B /* BurningManGeoJSONMapConfig.json.zlib */; }; + 3D3417D22E2DC260006A988B /* MapDataManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3D3417D12E2DC260006A988B /* MapDataManager.swift */; }; + 3D3417D42E2DC293006A988B /* MapDataUpload.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3D3417D32E2DC293006A988B /* MapDataUpload.swift */; }; 6D825E622C34786C008DBEE4 /* CommonRegex.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6D825E612C34786C008DBEE4 /* CommonRegex.swift */; }; 6DA39D8E2A92DC52007E311C /* MeshtasticAppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6DA39D8D2A92DC52007E311C /* MeshtasticAppDelegate.swift */; }; 6DEDA55A2A957B8E00321D2E /* DetectionSensorLog.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6DEDA5592A957B8E00321D2E /* DetectionSensorLog.swift */; }; @@ -335,7 +336,8 @@ 3D3417C72E29D38A006A988B /* GeoJSONOverlayConfig.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GeoJSONOverlayConfig.swift; sourceTree = ""; }; 3D3417C92E29D3B0006A988B /* Color+Hex.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Color+Hex.swift"; sourceTree = ""; }; 3D3417CA2E29D3B0006A988B /* Data+Gzip.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Data+Gzip.swift"; sourceTree = ""; }; - 3D3417CD2E29D5D6006A988B /* BurningManGeoJSONMapConfig.json.zlib */ = {isa = PBXFileReference; lastKnownFileType = file; path = BurningManGeoJSONMapConfig.json.zlib; sourceTree = ""; }; + 3D3417D12E2DC260006A988B /* MapDataManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MapDataManager.swift; sourceTree = ""; }; + 3D3417D32E2DC293006A988B /* MapDataUpload.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MapDataUpload.swift; sourceTree = ""; }; 6D825E612C34786C008DBEE4 /* CommonRegex.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CommonRegex.swift; sourceTree = ""; }; 6DA39D8D2A92DC52007E311C /* MeshtasticAppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MeshtasticAppDelegate.swift; sourceTree = ""; }; 6DEDA5592A957B8E00321D2E /* DetectionSensorLog.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DetectionSensorLog.swift; sourceTree = ""; }; @@ -797,6 +799,7 @@ DD4A911C2708C57100501B7E /* Settings */ = { isa = PBXGroup; children = ( + 3D3417D32E2DC293006A988B /* MapDataUpload.swift */, DDD5BB0E2C285F92007E03CA /* Logs */, DD93800C2BA74CE3008BEC06 /* Channels */, DD61937A2863876A00E59241 /* Config */, @@ -1057,7 +1060,6 @@ DDC2E18926CE24F70042C5E4 /* Resources */ = { isa = PBXGroup; children = ( - 3D3417CD2E29D5D6006A988B /* BurningManGeoJSONMapConfig.json.zlib */, DDB75A192A05EB67006ED576 /* alpha.png */, DDC2E15B26CE248F0042C5E4 /* Assets.xcassets */, DD0E21002B8A6BC500F2D100 /* DeviceHardware.json */, @@ -1110,6 +1112,7 @@ DDC2E1A526CEB32B0042C5E4 /* Helpers */ = { isa = PBXGroup; children = ( + 3D3417D12E2DC260006A988B /* MapDataManager.swift */, 3D3417C72E29D38A006A988B /* GeoJSONOverlayConfig.swift */, BCD7448C2E0F2FA300F265A2 /* ContactURLHandler.swift */, DDD43FE12A78C86B0083A3E9 /* Mqtt */, @@ -1377,7 +1380,6 @@ DDDE5A1329AFEAB900490C6C /* Assets.xcassets in Resources */, DDB75A1A2A05EB67006ED576 /* alpha.png in Resources */, DDC2E15C26CE248F0042C5E4 /* Assets.xcassets in Resources */, - 3D3417CE2E29D5D6006A988B /* BurningManGeoJSONMapConfig.json.zlib in Resources */, DD0E21012B8A6F1300F2D100 /* DeviceHardware.json in Resources */, DDDBC87B2BC62E4E001E8DF7 /* Settings.bundle in Resources */, ); @@ -1454,6 +1456,7 @@ DD913639270DFF4C00D7ACF3 /* LocalNotificationManager.swift in Sources */, DDDB444C29F8AAA600EE2349 /* Color.swift in Sources */, DDDFE73F2D0D48FF0044463C /* IgnoreNodeButton.swift in Sources */, + 3D3417D42E2DC293006A988B /* MapDataUpload.swift in Sources */, DDB8F4122A9EE5DD00230ECE /* UserList.swift in Sources */, DDB75A0F2A05920E006ED576 /* FileManager.swift in Sources */, DD3D17E02C3FB67200561584 /* LocalWeatherConditions.swift in Sources */, @@ -1601,6 +1604,7 @@ 251926922C3CB52300249DF5 /* DeleteNodeButton.swift in Sources */, DDB6ABE428B13FFF00384BA1 /* DisplayEnums.swift in Sources */, DD4975A52B147BA90026544E /* AmbientLightingConfig.swift in Sources */, + 3D3417D22E2DC260006A988B /* MapDataManager.swift in Sources */, D93068D92B81509C0066FBC8 /* TapbackResponses.swift in Sources */, DDF82CBD2D5BC69200DC25EC /* NavigateToButton.swift in Sources */, 8D3F8A3F2D44BB02009EAAA4 /* PowerMetrics.swift in Sources */, diff --git a/Meshtastic/Helpers/GeoJSONOverlayManager.swift b/Meshtastic/Helpers/GeoJSONOverlayManager.swift index 78187fc3..413e06e2 100644 --- a/Meshtastic/Helpers/GeoJSONOverlayManager.swift +++ b/Meshtastic/Helpers/GeoJSONOverlayManager.swift @@ -9,26 +9,20 @@ class GeoJSONOverlayManager { private var configuration: GeoJSONOverlayConfiguration? private var overlays: [String: [MKOverlay]] = [:] - /// Load and decompress the consolidated configuration + /// Load user-uploaded configuration only func loadConfiguration() -> GeoJSONOverlayConfiguration? { if let cached = configuration { return cached } - guard let url = Bundle.main.url(forResource: "BurningManGeoJSONMapConfig", withExtension: "json.zlib") else { - return nil + // Load user-uploaded configuration + if let userConfig = MapDataManager.shared.loadUserConfiguration() { + configuration = userConfig + return userConfig } - do { - let compressedData = try Data(contentsOf: url) - let decompressedData = try compressedData.zlibDecompressed() - let config = try JSONDecoder().decode(GeoJSONOverlayConfiguration.self, from: decompressedData) - - configuration = config - return config - } catch { - return nil - } + // No configuration available + return nil } /// Load overlays for a specific overlay ID @@ -111,4 +105,18 @@ class GeoJSONOverlayManager { overlays.removeAll() configuration = nil } + + /// Check if user-uploaded data is available + func hasUserData() -> Bool { + return MapDataManager.shared.getUploadedFiles().contains { $0.isActive } + } + + /// Get the active data source name + func getActiveDataSource() -> String { + if hasUserData() { + return NSLocalizedString("User Uploaded", comment: "Data source label for user uploaded files") + } else { + return NSLocalizedString("No Data", comment: "Data source label when no files are available") + } + } } \ No newline at end of file diff --git a/Meshtastic/Helpers/MapDataManager.swift b/Meshtastic/Helpers/MapDataManager.swift new file mode 100644 index 00000000..cdda7305 --- /dev/null +++ b/Meshtastic/Helpers/MapDataManager.swift @@ -0,0 +1,378 @@ +import Foundation +import MapKit +import OSLog + +/// Manager for handling user-uploaded map data files +class MapDataManager { + static let shared = MapDataManager() + private init() {} + + // MARK: - Constants + private let maxFileSize: Int64 = 10 * 1024 * 1024 // 10MB + private let mapDataDirectory = "MapData" + private let userUploadedDirectory = "user_uploaded" + private let metadataFileName = "upload_history.json" + + // MARK: - Properties + private var uploadedFiles: [MapDataMetadata] = [] + private var activeConfiguration: GeoJSONOverlayConfiguration? + + // MARK: - File Management + + /// Get the base URL for map data storage + private func getMapDataDirectory() -> URL? { + guard let documentsURL = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first else { + Logger.services.error("🗂️ Could not access documents directory") + return nil + } + return documentsURL.appendingPathComponent(mapDataDirectory) + } + + /// Get the URL for user uploaded files + private func getUserUploadedDirectory() -> URL? { + guard let baseURL = getMapDataDirectory() else { return nil } + return baseURL.appendingPathComponent(userUploadedDirectory) + } + + /// Get the URL for metadata file + private func getMetadataFileURL() -> URL? { + guard let baseURL = getMapDataDirectory() else { return nil } + return baseURL.appendingPathComponent(metadataFileName) + } + + /// Create necessary directories + private func createDirectoriesIfNeeded() -> Bool { + guard let userDir = getUserUploadedDirectory() else { return false } + + do { + try FileManager.default.createDirectory(at: userDir, withIntermediateDirectories: true) + return true + } catch { + Logger.services.error("🗂️ Failed to create directories: \(error.localizedDescription, privacy: .public)") + return false + } + } + + // MARK: - File Upload & Processing + + /// Process and store an uploaded file + func processUploadedFile(from sourceURL: URL) async throws -> MapDataMetadata { + Logger.services.info("📁 Processing uploaded file: \(sourceURL.lastPathComponent, privacy: .public)") + + // 1. Start accessing security-scoped resource + let isAccessing = sourceURL.startAccessingSecurityScopedResource() + defer { + if isAccessing { + sourceURL.stopAccessingSecurityScopedResource() + } + } + + // 2. Validate file + try validateFile(at: sourceURL) + + // 2. Create directories if needed + guard createDirectoriesIfNeeded() else { + throw MapDataError.directoryCreationFailed + } + + // 3. Generate destination filename + let timestamp = Date().timeIntervalSince1970 + let originalName = sourceURL.deletingPathExtension().lastPathComponent + let fileExtension = sourceURL.pathExtension + let newFilename = "\(originalName)_\(Int(timestamp)).\(fileExtension)" + + guard let destURL = getUserUploadedDirectory()?.appendingPathComponent(newFilename) else { + throw MapDataError.invalidDestination + } + + // 4. Copy file to app storage + try FileManager.default.copyItem(at: sourceURL, to: destURL) + + // 5. Process and validate content + let metadata = try await processFileContent(at: destURL, originalName: originalName) + + // 6. Save metadata + uploadedFiles.append(metadata) + try saveMetadata() + + // 7. Clear cached configuration to force reload + activeConfiguration = nil + + Logger.services.info("📁 Successfully processed file: \(newFilename, privacy: .public)") + return metadata + } + + /// Validate uploaded file + private func validateFile(at url: URL) throws { + let fileAttributes = try url.resourceValues(forKeys: [.fileSizeKey, .isRegularFileKey]) + + // Check file size + guard let fileSize = fileAttributes.fileSize, fileSize <= maxFileSize else { + throw MapDataError.fileTooLarge + } + + // Check if it's a regular file + guard fileAttributes.isRegularFile == true else { + throw MapDataError.invalidFileType + } + + // Check file extension + let allowedExtensions = ["json", "geojson", "kml", "kmz", "gz", "zlib"] + let fileExtension = url.pathExtension.lowercased() + guard allowedExtensions.contains(fileExtension) else { + throw MapDataError.unsupportedFormat + } + } + + /// Process file content and extract metadata + private func processFileContent(at url: URL, originalName: String) async throws -> MapDataMetadata { + let fileAttributes = try url.resourceValues(forKeys: [.fileSizeKey, .creationDateKey]) + let fileSize = fileAttributes.fileSize ?? 0 + let uploadDate = fileAttributes.creationDate ?? Date() + + // Read and process file content on background queue + let (processedData, overlayCount) = try await withCheckedThrowingContinuation { continuation in + Task.detached { + do { + let data = try Data(contentsOf: url) + let processedData = try self.processData(data, filename: url.lastPathComponent) + let overlayCount = try self.getOverlayCount(from: processedData) + continuation.resume(returning: (processedData, overlayCount)) + } catch { + continuation.resume(throwing: error) + } + } + } + + // If this is the first file uploaded, make it active by default + let isFirstFile = uploadedFiles.isEmpty + + return MapDataMetadata( + filename: url.lastPathComponent, + originalName: originalName, + uploadDate: uploadDate, + fileSize: Int64(fileSize), + format: url.pathExtension.lowercased(), + license: nil, // Will be extracted from content if available + attribution: nil, // Will be extracted from content if available + overlayCount: overlayCount, + isActive: isFirstFile + ) + } + + /// Process data (decompress if needed) + private func processData(_ data: Data, filename: String) throws -> Data { + let fileExtension = filename.components(separatedBy: ".").last?.lowercased() ?? "" + + switch fileExtension { + case "gz", "zlib": + return try data.zlibDecompressed() + default: + return data + } + } + + /// Get overlay count from processed data + private func getOverlayCount(from data: Data) throws -> Int { + do { + let config = try JSONDecoder().decode(GeoJSONOverlayConfiguration.self, from: data) + return config.overlays.count + } catch { + // Try parsing as raw GeoJSON + if let json = try JSONSerialization.jsonObject(with: data) as? [String: Any], + let features = json["features"] as? [[String: Any]] { + return features.count + } + throw MapDataError.invalidContent + } + } + + // MARK: - Configuration Loading + + /// Load user configuration (priority over bundled) + func loadUserConfiguration() -> GeoJSONOverlayConfiguration? { + if let cached = activeConfiguration { + return cached + } + + // Find active user files + let activeFiles = uploadedFiles.filter { $0.isActive } + guard let activeFile = activeFiles.first else { + return nil + } + + guard let fileURL = getUserUploadedDirectory()?.appendingPathComponent(activeFile.filename) else { + return nil + } + + do { + let data = try Data(contentsOf: fileURL) + let processedData = try processData(data, filename: activeFile.filename) + let config = try JSONDecoder().decode(GeoJSONOverlayConfiguration.self, from: processedData) + + activeConfiguration = config + return config + } catch { + Logger.services.error("📁 Failed to load user configuration: \(error.localizedDescription, privacy: .public)") + return nil + } + } + + // MARK: - File Management + + /// Get all uploaded files + func getUploadedFiles() -> [MapDataMetadata] { + return uploadedFiles + } + + /// Delete uploaded file + func deleteFile(_ metadata: MapDataMetadata) throws { + guard let fileURL = getUserUploadedDirectory()?.appendingPathComponent(metadata.filename) else { + throw MapDataError.fileNotFound + } + + try FileManager.default.removeItem(at: fileURL) + + if let index = uploadedFiles.firstIndex(where: { $0.filename == metadata.filename }) { + uploadedFiles.remove(at: index) + } + + try saveMetadata() + + // Clear cache if this was the active file + if activeConfiguration != nil { + activeConfiguration = nil + } + + Logger.services.info("🗑️ Deleted file: \(metadata.filename, privacy: .public)") + } + + /// Toggle file active status + func toggleFileActive(_ metadata: MapDataMetadata) throws { + if let index = uploadedFiles.firstIndex(where: { $0.filename == metadata.filename }) { + let newActiveState = !uploadedFiles[index].isActive + + // If making this file active, deactivate all others (only one can be active) + if newActiveState { + for i in uploadedFiles.indices { + uploadedFiles[i].isActive = (i == index) + } + } else { + // Just deactivate this file + uploadedFiles[index].isActive = false + } + + try saveMetadata() + + // Clear cache to force reload + activeConfiguration = nil + } + } + + // MARK: - Metadata Persistence + + /// Load metadata from disk + func loadMetadata() { + guard let metadataURL = getMetadataFileURL(), + let data = try? Data(contentsOf: metadataURL), + let files = try? JSONDecoder().decode([MapDataMetadata].self, from: data) else { + uploadedFiles = [] + return + } + + uploadedFiles = files + } + + /// Save metadata to disk + private func saveMetadata() throws { + guard let metadataURL = getMetadataFileURL() else { + throw MapDataError.invalidDestination + } + + let data = try JSONEncoder().encode(uploadedFiles) + try data.write(to: metadataURL) + } + + // MARK: - Initialization + + /// Initialize the manager + func initialize() { + loadMetadata() + } +} + +// MARK: - Supporting Types + +/// Metadata for uploaded map data files +struct MapDataMetadata: Codable, Identifiable { + let id: UUID + let filename: String + let originalName: String + let uploadDate: Date + let fileSize: Int64 + let format: String + let license: String? + let attribution: String? + let overlayCount: Int + var isActive: Bool + + init(filename: String, originalName: String, uploadDate: Date, fileSize: Int64, format: String, license: String?, attribution: String?, overlayCount: Int, isActive: Bool) { + self.id = UUID() + self.filename = filename + self.originalName = originalName + self.uploadDate = uploadDate + self.fileSize = fileSize + self.format = format + self.license = license + self.attribution = attribution + self.overlayCount = overlayCount + self.isActive = isActive + } + + var fileSizeString: String { + let formatter = ByteCountFormatter() + formatter.allowedUnits = [.useKB, .useMB] + formatter.countStyle = .file + return formatter.string(fromByteCount: fileSize) + } + + var uploadDateString: String { + let formatter = DateFormatter() + formatter.dateStyle = .medium + formatter.timeStyle = .short + return formatter.string(from: uploadDate) + } +} + +/// Errors that can occur during map data operations +enum MapDataError: Error, LocalizedError { + case fileTooLarge + case invalidFileType + case unsupportedFormat + case invalidContent + case directoryCreationFailed + case invalidDestination + case fileNotFound + case saveFailed + + var errorDescription: String? { + switch self { + case .fileTooLarge: + return "File is too large. Maximum size is 10MB." + case .invalidFileType: + return "Invalid file type. Please select a regular file." + case .unsupportedFormat: + return "Unsupported file format. Supported formats: JSON, GeoJSON, KML, KMZ, GZ, ZLIB." + case .invalidContent: + return "Invalid file content. Please check the file format." + case .directoryCreationFailed: + return "Failed to create storage directory." + case .invalidDestination: + return "Invalid destination path." + case .fileNotFound: + return "File not found." + case .saveFailed: + return "Failed to save file." + } + } +} \ No newline at end of file diff --git a/Meshtastic/Info.plist b/Meshtastic/Info.plist index a0552164..3c6cc130 100644 --- a/Meshtastic/Info.plist +++ b/Meshtastic/Info.plist @@ -18,6 +18,39 @@ gvh.MeshtasticApple.mbtiles + + CFBundleTypeName + GeoJSON Map Data + LSHandlerRank + Default + LSItemContentTypes + + public.json + gvh.MeshtasticApple.geojson + + + + CFBundleTypeName + KML Map Data + LSHandlerRank + Default + LSItemContentTypes + + public.xml + gvh.MeshtasticApple.kml + + + + CFBundleTypeName + KMZ Map Data + LSHandlerRank + Default + LSItemContentTypes + + public.zip-archive + gvh.MeshtasticApple.kmz + + CFBundleExecutable $(EXECUTABLE_NAME) @@ -138,6 +171,63 @@ + + UTTypeConformsTo + + public.json + + UTTypeDescription + GeoJSON Map Data + UTTypeIconFiles + + UTTypeIdentifier + gvh.MeshtasticApple.geojson + UTTypeTagSpecification + + public.filename-extension + + geojson + + + + + UTTypeConformsTo + + public.xml + + UTTypeDescription + KML Map Data + UTTypeIconFiles + + UTTypeIdentifier + gvh.MeshtasticApple.kml + UTTypeTagSpecification + + public.filename-extension + + kml + + + + + UTTypeConformsTo + + public.zip-archive + + UTTypeDescription + KMZ Map Data + UTTypeIconFiles + + UTTypeIdentifier + gvh.MeshtasticApple.kmz + UTTypeTagSpecification + + public.filename-extension + + kmz + + + com.apple.developer.carplay-communication diff --git a/Meshtastic/MeshtasticApp.swift b/Meshtastic/MeshtasticApp.swift index 19a001e1..05bf141e 100644 --- a/Meshtastic/MeshtasticApp.swift +++ b/Meshtastic/MeshtasticApp.swift @@ -67,6 +67,9 @@ struct MeshtasticAppleApp: App { self.persistenceController = persistenceController // Wire up router self.appDelegate.router = appState.router + + // Initialize map data manager + MapDataManager.shared.initialize() #if DEBUG // Show tips in development try? Tips.resetDatastore() diff --git a/Meshtastic/Resources/BurningManGeoJSONMapConfig.json.zlib b/Meshtastic/Resources/BurningManGeoJSONMapConfig.json.zlib deleted file mode 100644 index bcb493e10b28a5e8f3bfa9db8cd330f8c7ae40f3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 21773 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 A6aWAK diff --git a/Meshtastic/Views/Nodes/Helpers/Map/MapContent/MeshMapContent.swift b/Meshtastic/Views/Nodes/Helpers/Map/MapContent/MeshMapContent.swift index 04f8c2e9..8e550d20 100644 --- a/Meshtastic/Views/Nodes/Helpers/Map/MapContent/MeshMapContent.swift +++ b/Meshtastic/Views/Nodes/Helpers/Map/MapContent/MeshMapContent.swift @@ -29,8 +29,8 @@ struct MeshMapContent: MapContent { @AppStorage("enableMapWaypoints") private var showWaypoints = true @Binding var selectedWaypoint: WaypointEntity? - // Burning Man GeoJSON overlays - @AppStorage("burningManShowAll") private var showBurningMan = false + // Map overlays + @AppStorage("mapOverlaysEnabled") private var showMapOverlays = false @FetchRequest(fetchRequest: PositionEntity.allPositionsFetchRequest(), animation: .easeIn) var positions: FetchedResults @@ -232,7 +232,7 @@ struct MeshMapContent: MapContent { } /// GeoJSON Overlays (Configuration-Driven) - if showBurningMan { + if showMapOverlays { let overlayManager = GeoJSONOverlayManager.shared let availableOverlays = overlayManager.getAvailableOverlayIds() diff --git a/Meshtastic/Views/Nodes/Helpers/Map/MapSettingsForm.swift b/Meshtastic/Views/Nodes/Helpers/Map/MapSettingsForm.swift index 3079a9d9..765d62ee 100644 --- a/Meshtastic/Views/Nodes/Helpers/Map/MapSettingsForm.swift +++ b/Meshtastic/Views/Nodes/Helpers/Map/MapSettingsForm.swift @@ -116,19 +116,56 @@ struct MapSettingsForm: View { } } - Section(header: Text("Map Overlays")) { + Section(header: Text("Map Overlays")) { + let hasUserData = GeoJSONOverlayManager.shared.hasUserData() + + // Master toggle for map overlays Toggle(isOn: Binding( - get: { UserDefaults.standard.bool(forKey: "burningManShowAll") }, - set: { UserDefaults.standard.set($0, forKey: "burningManShowAll") } + get: { hasUserData && UserDefaults.standard.bool(forKey: "mapOverlaysEnabled") }, + set: { UserDefaults.standard.set($0, forKey: "mapOverlaysEnabled") } )) { Label { - Text("Burning Man") + VStack(alignment: .leading) { + Text("Map Overlays") + Text(GeoJSONOverlayManager.shared.getActiveDataSource()) + .font(.caption) + .foregroundColor(.secondary) + } } icon: { - Image(systemName: "flame.fill") - .foregroundColor(.orange) + Image(systemName: "map") + .foregroundColor(hasUserData ? .accentColor : .secondary) } } .tint(.accentColor) + .disabled(!hasUserData) + + // Show data source info or upload prompt + if hasUserData && UserDefaults.standard.bool(forKey: "mapOverlaysEnabled") { + HStack { + Image(systemName: "info.circle") + .foregroundColor(.secondary) + Text(String(format: NSLocalizedString("Using %@ data", comment: "Shows which data source is being used"), GeoJSONOverlayManager.shared.getActiveDataSource())) + .font(.caption) + .foregroundColor(.secondary) + Spacer() + } + .padding(.leading, 35) + } else if !hasUserData { + NavigationLink(destination: MapDataUpload()) { + HStack { + Image(systemName: "arrow.up.doc") + .foregroundColor(.accentColor) + Text(NSLocalizedString("Upload map data to enable overlays", comment: "Prompt to upload map data when none is available")) + .font(.caption) + .foregroundColor(.secondary) + Spacer() + Image(systemName: "chevron.right") + .font(.caption2) + .foregroundColor(.secondary) + } + } + .padding(.leading, 35) + } } } diff --git a/Meshtastic/Views/Settings/AppData.swift b/Meshtastic/Views/Settings/AppData.swift index e5ff252c..468a7ef2 100644 --- a/Meshtastic/Views/Settings/AppData.swift +++ b/Meshtastic/Views/Settings/AppData.swift @@ -25,6 +25,33 @@ struct AppData: View { GPSStatus() } Divider() + + // Map Data Section + Section(header: Text("Map Data")) { + NavigationLink(destination: MapDataUpload()) { + HStack { + Image(systemName: "map") + .symbolRenderingMode(.hierarchical) + .font(idiom == .phone ? .callout : .title) + .frame(width: 35) + + VStack(alignment: .leading) { + Text(NSLocalizedString("Upload Map Data", comment: "Title for map data upload screen")) + .font(.headline) + Text(NSLocalizedString("Manage custom map overlays", comment: "Subtitle for map data management")) + .font(.caption) + .foregroundColor(.secondary) + } + + Spacer() + + Image(systemName: "chevron.right") + .font(.caption) + .foregroundColor(.secondary) + } + } + } + Divider() } List(files, id: \.self) { file in diff --git a/Meshtastic/Views/Settings/MapDataUpload.swift b/Meshtastic/Views/Settings/MapDataUpload.swift new file mode 100644 index 00000000..c686aaaf --- /dev/null +++ b/Meshtastic/Views/Settings/MapDataUpload.swift @@ -0,0 +1,273 @@ +import SwiftUI +import UniformTypeIdentifiers +import OSLog + +struct MapDataUpload: View { + @Environment(\.managedObjectContext) var context + @EnvironmentObject var bleManager: BLEManager + + @State private var isShowingFilePicker = false + @State private var isProcessing = false + @State private var processingProgress: Double = 0.0 + @State private var showError = false + @State private var errorMessage = "" + @State private var showSuccess = false + @State private var successMessage = "" + + private let mapDataManager = MapDataManager.shared + + var body: some View { + VStack(spacing: 20) { + // Header + VStack(alignment: .leading, spacing: 8) { + Text(NSLocalizedString("Upload Map Data", comment: "Title for map data upload screen")) + .font(.title2) + .fontWeight(.bold) + + Text("Upload GeoJSON files to display custom map overlays. Files are stored locally and can be up to 10MB.") + .font(.caption) + .foregroundColor(.secondary) + } + .frame(maxWidth: .infinity, alignment: .leading) + .padding(.horizontal) + + // Upload Button + Button(action: { + isShowingFilePicker = true + }) { + HStack { + Image(systemName: "doc.badge.plus") + .font(.title2) + Text(NSLocalizedString("Select Map Data File", comment: "Button text for selecting map data file")) + .fontWeight(.medium) + } + .frame(maxWidth: .infinity) + .padding() + .background(Color.accentColor) + .foregroundColor(.white) + .cornerRadius(10) + } + .disabled(isProcessing) + .padding(.horizontal) + + // Processing Indicator + if isProcessing { + VStack(spacing: 12) { + ProgressView(value: processingProgress) + .progressViewStyle(LinearProgressViewStyle()) + .padding(.horizontal) + + Text("Processing file...") + .font(.caption) + .foregroundColor(.secondary) + } + } + + // Current Files Section + VStack(alignment: .leading, spacing: 12) { + Text(NSLocalizedString("Uploaded Files", comment: "Section header for uploaded files")) + .font(.headline) + .padding(.horizontal) + + let uploadedFiles = mapDataManager.getUploadedFiles() + + if uploadedFiles.isEmpty { + VStack(spacing: 8) { + Image(systemName: "doc.text") + .font(.title) + .foregroundColor(.secondary) + Text(NSLocalizedString("No files uploaded yet", comment: "Empty state text when no files are uploaded")) + .font(.caption) + .foregroundColor(.secondary) + } + .frame(maxWidth: .infinity) + .padding(.vertical, 40) + } else { + ScrollView { + LazyVStack(spacing: 8) { + ForEach(uploadedFiles) { file in + MapDataFileRow(file: file) { + toggleFileActive(file) + } onDelete: { + deleteFile(file) + } + } + } + .padding(.horizontal) + } + } + } + + Spacer() + } + .navigationTitle("Map Data") + .navigationBarTitleDisplayMode(.inline) + .fileImporter( + isPresented: $isShowingFilePicker, + allowedContentTypes: [ + UTType.json, + UTType(filenameExtension: "geojson") ?? UTType.json, + UTType(filenameExtension: "kml") ?? UTType.xml, + UTType(filenameExtension: "kmz") ?? UTType.zip, + UTType(filenameExtension: "gz") ?? UTType.data, + UTType(filenameExtension: "zlib") ?? UTType.data + ], + allowsMultipleSelection: false + ) { result in + handleFileSelection(result) + } + .alert("Upload Error", isPresented: $showError) { + Button("OK") { } + } message: { + Text(errorMessage) + } + .alert("Upload Success", isPresented: $showSuccess) { + Button("OK") { } + } message: { + Text(successMessage) + } + .onAppear { + // Initialize map data manager if needed + mapDataManager.initialize() + } + } + + // MARK: - File Handling + + private func handleFileSelection(_ result: Result<[URL], Error>) { + do { + guard let selectedFile = try result.get().first else { return } + + // Start processing + isProcessing = true + processingProgress = 0.0 + + // Process file asynchronously + Task { + do { + // Simulate progress + await simulateProgress() + + let metadata = try await mapDataManager.processUploadedFile(from: selectedFile) + + await MainActor.run { + isProcessing = false + processingProgress = 1.0 + + successMessage = "Successfully uploaded '\(metadata.originalName)' with \(metadata.overlayCount) overlays" + showSuccess = true + } + } catch { + await MainActor.run { + isProcessing = false + processingProgress = 0.0 + + errorMessage = error.localizedDescription + showError = true + } + } + } + } catch { + errorMessage = "Failed to access file: \(error.localizedDescription)" + showError = true + } + } + + private func simulateProgress() async { + for i in 1...10 { + await MainActor.run { + processingProgress = Double(i) / 10.0 + } + try? await Task.sleep(nanoseconds: 200_000_000) // 0.2 seconds + } + } + + private func toggleFileActive(_ file: MapDataMetadata) { + do { + try mapDataManager.toggleFileActive(file) + } catch { + errorMessage = "Failed to toggle file: \(error.localizedDescription)" + showError = true + } + } + + private func deleteFile(_ file: MapDataMetadata) { + do { + try mapDataManager.deleteFile(file) + } catch { + errorMessage = "Failed to delete file: \(error.localizedDescription)" + showError = true + } + } +} + +// MARK: - Supporting Views + +struct MapDataFileRow: View { + let file: MapDataMetadata + let onToggle: () -> Void + let onDelete: () -> Void + + var body: some View { + HStack { + VStack(alignment: .leading, spacing: 4) { + HStack { + Text(file.originalName) + .font(.headline) + .lineLimit(1) + + Spacer() + + Toggle("", isOn: Binding( + get: { file.isActive }, + set: { _ in onToggle() } + )) + .toggleStyle(SwitchToggleStyle(tint: .accentColor)) + } + + HStack { + Text(file.format.uppercased()) + .font(.caption) + .padding(.horizontal, 8) + .padding(.vertical, 2) + .background(Color.secondary.opacity(0.2)) + .cornerRadius(4) + + Text(file.fileSizeString) + .font(.caption) + .foregroundColor(.secondary) + + Text("•") + .font(.caption) + .foregroundColor(.secondary) + + Text("\(file.overlayCount) overlays") + .font(.caption) + .foregroundColor(.secondary) + + Spacer() + + Text(file.uploadDateString) + .font(.caption) + .foregroundColor(.secondary) + } + } + + Button(action: onDelete) { + Image(systemName: "trash") + .foregroundColor(.red) + } + .buttonStyle(BorderlessButtonStyle()) + } + .padding() + .background(Color(.systemBackground)) + .cornerRadius(8) + .shadow(color: .black.opacity(0.1), radius: 2, x: 0, y: 1) + } +} + +#Preview { + NavigationView { + MapDataUpload() + } +} \ No newline at end of file From 909ec06fd9a159c27e811892b94a8e8879da30e1 Mon Sep 17 00:00:00 2001 From: Jacob Powers Date: Tue, 22 Jul 2025 00:48:50 +0000 Subject: [PATCH 10/19] wip --- Localizable.xcstrings | 14 +- Meshtastic/Helpers/GeoJSONOverlayConfig.swift | 268 ++++++++++++++++-- .../Helpers/GeoJSONOverlayManager.swift | 171 +++++------ Meshtastic/Helpers/MapDataManager.swift | 156 +++++++--- .../Map/MapContent/MeshMapContent.swift | 70 +++-- .../Nodes/Helpers/Map/MapSettingsForm.swift | 104 ++++++- 6 files changed, 593 insertions(+), 190 deletions(-) diff --git a/Localizable.xcstrings b/Localizable.xcstrings index ee7f5824..1f66cd0a 100644 --- a/Localizable.xcstrings +++ b/Localizable.xcstrings @@ -1346,6 +1346,9 @@ } } } + }, + "%lld features" : { + }, "%lld or less hops away" : { "localizations" : { @@ -14554,6 +14557,9 @@ } } }, + "Files Available" : { + "comment" : "Data source label when files exist but none are active" + }, "Find a contact" : { "localizations" : { "de" : { @@ -20402,6 +20408,9 @@ } } }, + "Manage map data" : { + "comment" : "Link to manage uploaded map data" + }, "Managed Device" : { "localizations" : { "it" : { @@ -23415,6 +23424,9 @@ } } }, + "No map data files uploaded" : { + "comment" : "Message when no files are uploaded" + }, "No PAX Counter Logs" : { "localizations" : { "it" : { @@ -42813,4 +42825,4 @@ } }, "version" : "1.0" -} +} \ No newline at end of file diff --git a/Meshtastic/Helpers/GeoJSONOverlayConfig.swift b/Meshtastic/Helpers/GeoJSONOverlayConfig.swift index 5d3a5e8c..6a4860fd 100644 --- a/Meshtastic/Helpers/GeoJSONOverlayConfig.swift +++ b/Meshtastic/Helpers/GeoJSONOverlayConfig.swift @@ -1,34 +1,10 @@ import Foundation import MapKit +import SwiftUI +import CoreLocation +import OSLog -// MARK: - Configuration Models - -struct GeoJSONOverlayConfiguration: Codable { - let version: String - let metadata: OverlayMetadata - let overlays: [OverlayDefinition] -} - -struct OverlayMetadata: Codable { - let name: String - let description: String - let generated: String -} - -struct OverlayDefinition: Codable { - let id: String - let name: String - let description: String - let rendering: RenderingProperties - let geojson: GeoJSONFeatureCollection -} - -struct RenderingProperties: Codable { - let lineColor: String // Hex color (e.g., "#FF0000") - let lineOpacity: Double // 0.0 to 1.0 - let lineThickness: Double // Line width in points - let fillOpacity: Double // 0.0 to 1.0 -} +// MARK: - Raw GeoJSON Support Only struct GeoJSONFeatureCollection: Codable { let type: String // Always "FeatureCollection" @@ -40,6 +16,218 @@ struct GeoJSONFeature: Codable { let id: Int? let geometry: GeoJSONGeometry let properties: [String: AnyCodableValue]? + + // MARK: - GeoJSON Styling Properties + + /// Extract layer metadata from properties + var layerId: String? { + if case .string(let value) = properties?["layer_id"] { + return value + } + return nil + } + + var layerName: String? { + if case .string(let value) = properties?["layer_name"] { + return value + } + return nil + } + + var layerDescription: String? { + if case .string(let value) = properties?["description"] { + return value + } + return nil + } + + var isVisible: Bool { + if case .bool(let value) = properties?["visible"] { + return value + } + return true // Default to visible + } + + // MARK: - Point/Marker Styling + + var markerColor: String? { + if case .string(let value) = properties?["marker-color"] { + return value + } + return nil + } + + var markerSize: String? { + if case .string(let value) = properties?["marker-size"] { + return value + } + return "medium" // Default size + } + + var markerSymbol: String? { + if case .string(let value) = properties?["marker-symbol"] { + return value + } + return nil + } + + // MARK: - Stroke/Line Styling + + var strokeColor: String? { + if case .string(let value) = properties?["stroke"] { + return value + } + return nil + } + + var strokeWidth: Double { + if case .double(let value) = properties?["stroke-width"] { + return value + } else if case .int(let value) = properties?["stroke-width"] { + return Double(value) + } + return 1.0 // Default width + } + + var strokeOpacity: Double { + if case .double(let value) = properties?["stroke-opacity"] { + return value + } else if case .int(let value) = properties?["stroke-opacity"] { + return Double(value) + } + return 1.0 // Default opacity + } + + var lineDashArray: [Double]? { + if case .array(let values) = properties?["line-dasharray"] { + return values.compactMap { value in + switch value { + case .double(let d): return d + case .int(let i): return Double(i) + default: return nil + } + } + } + return nil + } + + // MARK: - Fill Styling + + var fillColor: String? { + if case .string(let value) = properties?["fill"] { + return value + } + return nil + } + + var fillOpacity: Double { + if case .double(let value) = properties?["fill-opacity"] { + return value + } else if case .int(let value) = properties?["fill-opacity"] { + return Double(value) + } + return 0.0 // Default to no fill + } + + // MARK: - Computed Rendering Properties + + /// Get effective stroke color (fallback to marker color for points) + var effectiveStrokeColor: String { + return strokeColor ?? markerColor ?? "#000000" + } + + /// Get effective fill color (fallback to stroke color if fill opacity > 0) + var effectiveFillColor: String { + if fillOpacity > 0 { + return fillColor ?? effectiveStrokeColor + } + return "#000000" + } + + /// Convert marker size to point radius + var markerRadius: CGFloat { + switch markerSize { + case "small": return 8.0 + case "medium": return 12.0 + case "large": return 16.0 + default: return 12.0 + } + } +} + +// MARK: - Styled Feature Wrapper + +/// Wrapper for a GeoJSON feature with its styling properties and metadata +struct GeoJSONStyledFeature: Identifiable { + let id = UUID() + let feature: GeoJSONFeature + let overlayId: String + + /// Create MKOverlay from this styled feature + func createOverlay() -> MKOverlay? { + do { + // Convert feature to standard GeoJSON format for MKGeoJSONDecoder + let featureDict: [String: Any] = [ + "type": feature.type, + "geometry": [ + "type": feature.geometry.type, + "coordinates": feature.geometry.coordinates.toAnyObject() + ], + "properties": feature.properties?.mapValues { $0.toAnyObject() } ?? [:] + ] + + // Creating overlay for geometry + + let geojsonData = try JSONSerialization.data(withJSONObject: featureDict) + let mkFeatures = try MKGeoJSONDecoder().decode(geojsonData) + + // MKGeoJSONDecoder processing + + if let mkFeature = mkFeatures.first as? MKGeoJSONFeature { + // Processing geometry objects + if let geometry = mkFeature.geometry.first as? MKOverlay { + // Successfully created overlay + return geometry + } else { + Logger.services.warning("🗺️ GeoJSONStyledFeature: First geometry is not an MKOverlay: \(type(of: mkFeature.geometry.first))") + } + } else { + Logger.services.warning("🗺️ GeoJSONStyledFeature: First feature is not an MKGeoJSONFeature: \(type(of: mkFeatures.first))") + } + } catch { + Logger.services.error("🗺️ GeoJSONStyledFeature: Failed to convert feature to overlay: \(error.localizedDescription)") + } + return nil + } + + /// Get stroke style for this feature + var strokeStyle: StrokeStyle { + let dashArray = feature.lineDashArray + if let dashArray = dashArray, !dashArray.isEmpty { + return StrokeStyle( + lineWidth: feature.strokeWidth, + lineCap: .round, + lineJoin: .round, + dash: dashArray.map { CGFloat($0) } + ) + } else { + return StrokeStyle( + lineWidth: feature.strokeWidth, + lineCap: .round, + lineJoin: .round + ) + } + } + + /// Get stroke color with opacity + var strokeColor: Color { + return Color(hex: feature.effectiveStrokeColor).opacity(feature.strokeOpacity) + } + + /// Get fill color with opacity + var fillColor: Color { + return Color(hex: feature.effectiveFillColor).opacity(feature.fillOpacity) + } } struct GeoJSONGeometry: Codable { @@ -120,4 +308,28 @@ enum AnyCodableValue: Codable { return dict.mapValues { $0.toAnyObject() } } } + + // Helper to convert Point coordinates to CLLocationCoordinate2D + func toCoordinate() -> CLLocationCoordinate2D? { + if case .array(let coords) = self, + coords.count >= 2 { + let lon: Double + let lat: Double + + switch coords[0] { + case .double(let d): lon = d + case .int(let i): lon = Double(i) + default: return nil + } + + switch coords[1] { + case .double(let d): lat = d + case .int(let i): lat = Double(i) + default: return nil + } + + return CLLocationCoordinate2D(latitude: lat, longitude: lon) + } + return nil + } } \ No newline at end of file diff --git a/Meshtastic/Helpers/GeoJSONOverlayManager.swift b/Meshtastic/Helpers/GeoJSONOverlayManager.swift index 413e06e2..dcffbaaa 100644 --- a/Meshtastic/Helpers/GeoJSONOverlayManager.swift +++ b/Meshtastic/Helpers/GeoJSONOverlayManager.swift @@ -1,122 +1,131 @@ import SwiftUI import MapKit +import OSLog -/// Manager for loading and managing GeoJSON overlays from consolidated configuration +/// Manager for loading and managing raw GeoJSON feature collections with embedded styling class GeoJSONOverlayManager { static let shared = GeoJSONOverlayManager() private init() {} - private var configuration: GeoJSONOverlayConfiguration? - private var overlays: [String: [MKOverlay]] = [:] + private var featureCollection: GeoJSONFeatureCollection? - /// Load user-uploaded configuration only - func loadConfiguration() -> GeoJSONOverlayConfiguration? { - if let cached = configuration { + /// Load raw GeoJSON feature collection from user uploads + func loadFeatureCollection() -> GeoJSONFeatureCollection? { + Logger.services.debug("🗺️ GeoJSONOverlayManager: loadFeatureCollection() called") + + if let cached = featureCollection { + Logger.services.debug("🗺️ GeoJSONOverlayManager: Returning cached feature collection with \(cached.features.count) features") return cached } - // Load user-uploaded configuration - if let userConfig = MapDataManager.shared.loadUserConfiguration() { - configuration = userConfig - return userConfig + // Load user-uploaded feature collection + Logger.services.debug("🗺️ GeoJSONOverlayManager: Loading feature collection from MapDataManager") + if let userFeatures = MapDataManager.shared.loadFeatureCollection() { + Logger.services.info("🗺️ GeoJSONOverlayManager: Loaded feature collection with \(userFeatures.features.count) features") + featureCollection = userFeatures + return userFeatures } - // No configuration available + // No feature collection available + Logger.services.debug("🗺️ GeoJSONOverlayManager: No feature collection available") return nil } - /// Load overlays for a specific overlay ID - func loadOverlays(for overlayId: String) -> [MKOverlay] { - if let cached = overlays[overlayId] { - return cached - } - - guard let config = loadConfiguration() else { + /// Load styled features for direct rendering + func loadStyledFeatures() -> [GeoJSONStyledFeature] { + Logger.services.debug("🗺️ GeoJSONOverlayManager: loadStyledFeatures() called") + + guard let collection = loadFeatureCollection() else { + Logger.services.debug("🗺️ GeoJSONOverlayManager: No feature collection available, returning empty array") return [] } - - guard let overlayDef = config.overlays.first(where: { $0.id == overlayId }) else { - return [] - } - - do { - // Convert our custom GeoJSON structure to the format expected by MKGeoJSONDecoder - let standardGeoJSON: [String: Any] = [ - "type": overlayDef.geojson.type, - "features": overlayDef.geojson.features.map { feature in - var featureDict: [String: Any] = [ - "type": feature.type, - "geometry": [ - "type": feature.geometry.type, - "coordinates": feature.geometry.coordinates.toAnyObject() - ], - "properties": [:] - ] - - if let id = feature.id { - featureDict["id"] = id - } - - return featureDict - } - ] - - let geojsonData = try JSONSerialization.data(withJSONObject: standardGeoJSON) - let features = try MKGeoJSONDecoder().decode(geojsonData) - - var allOverlays: [MKOverlay] = [] - for (index, feature) in features.enumerated() { - if let mkFeature = feature as? MKGeoJSONFeature { - for (geoIndex, geometry) in mkFeature.geometry.enumerated() { - if let overlay = geometry as? MKOverlay { - allOverlays.append(overlay) - } - } - } + + var styledFeatures: [GeoJSONStyledFeature] = [] + + Logger.services.info("🗺️ GeoJSONOverlayManager: Processing \(collection.features.count) features") + + for feature in collection.features { + // Skip invisible features + guard feature.isVisible else { + Logger.services.debug("🗺️ GeoJSONOverlayManager: Skipping invisible feature") + continue } - - overlays[overlayId] = allOverlays - return allOverlays - } catch { - return [] + + let layerId = feature.layerId ?? "default" + let styledFeature = GeoJSONStyledFeature( + feature: feature, + overlayId: layerId + ) + styledFeatures.append(styledFeature) } + + Logger.services.info("🗺️ GeoJSONOverlayManager: Returning \(styledFeatures.count) styled features") + return styledFeatures } - /// Get rendering properties for an overlay - func getRenderingProperties(for overlayId: String) -> RenderingProperties? { - guard let config = loadConfiguration() else { return nil } - return config.overlays.first(where: { $0.id == overlayId })?.rendering + /// Get all features grouped by layer ID + func getFeaturesByLayer() -> [String: [GeoJSONFeature]] { + guard let collection = loadFeatureCollection() else { return [:] } + + var featuresByLayer: [String: [GeoJSONFeature]] = [:] + + for feature in collection.features { + let layerId = feature.layerId ?? "default" + if featuresByLayer[layerId] == nil { + featuresByLayer[layerId] = [] + } + featuresByLayer[layerId]?.append(feature) + } + + return featuresByLayer } - /// Get all available overlay IDs - func getAvailableOverlayIds() -> [String] { - guard let config = loadConfiguration() else { return [] } - return config.overlays.map { $0.id } + /// Get all available layer IDs from features + func getAvailableLayerIds() -> [String] { + guard let collection = loadFeatureCollection() else { return [] } + let layerIds = Set(collection.features.compactMap { $0.layerId ?? "default" }) + return Array(layerIds).sorted() } - /// Get overlay definition by ID - func getOverlayDefinition(for overlayId: String) -> OverlayDefinition? { - guard let config = loadConfiguration() else { return nil } - return config.overlays.first(where: { $0.id == overlayId }) - } - - /// Clear cached overlays (useful for testing or memory management) + /// Clear cached data (useful for testing or memory management) func clearCache() { - overlays.removeAll() - configuration = nil + Logger.services.info("🗺️ GeoJSONOverlayManager: Clearing cache") + featureCollection = nil } - /// Check if user-uploaded data is available + /// Check if user-uploaded data is available (regardless of active state) func hasUserData() -> Bool { + return !MapDataManager.shared.getUploadedFiles().isEmpty + } + + /// Check if there are any active files + func hasActiveData() -> Bool { return MapDataManager.shared.getUploadedFiles().contains { $0.isActive } } /// Get the active data source name func getActiveDataSource() -> String { - if hasUserData() { + if hasActiveData() { return NSLocalizedString("User Uploaded", comment: "Data source label for user uploaded files") + } else if hasUserData() { + return NSLocalizedString("Files Available", comment: "Data source label when files exist but none are active") } else { return NSLocalizedString("No Data", comment: "Data source label when no files are available") } } + + // MARK: - File-based Filtering + + /// Get all uploaded files with their active states for UI display + func getUploadedFilesWithState() -> [MapDataMetadata] { + return MapDataManager.shared.getUploadedFiles() + } + + /// Toggle the active state of an uploaded file + func toggleFileActive(_ fileId: UUID) { + Logger.services.debug("🗺️ GeoJSONOverlayManager: Toggling active state for file: \(fileId)") + MapDataManager.shared.toggleFileActive(fileId) + // Clear cache to force reload with new file states + clearCache() + } } \ No newline at end of file diff --git a/Meshtastic/Helpers/MapDataManager.swift b/Meshtastic/Helpers/MapDataManager.swift index cdda7305..50ebb0eb 100644 --- a/Meshtastic/Helpers/MapDataManager.swift +++ b/Meshtastic/Helpers/MapDataManager.swift @@ -15,7 +15,7 @@ class MapDataManager { // MARK: - Properties private var uploadedFiles: [MapDataMetadata] = [] - private var activeConfiguration: GeoJSONOverlayConfiguration? + private var activeFeatureCollection: GeoJSONFeatureCollection? // MARK: - File Management @@ -96,7 +96,7 @@ class MapDataManager { try saveMetadata() // 7. Clear cached configuration to force reload - activeConfiguration = nil + activeFeatureCollection = nil Logger.services.info("📁 Successfully processed file: \(newFilename, privacy: .public)") return metadata @@ -131,7 +131,7 @@ class MapDataManager { let uploadDate = fileAttributes.creationDate ?? Date() // Read and process file content on background queue - let (processedData, overlayCount) = try await withCheckedThrowingContinuation { continuation in + let (_, overlayCount) = try await withCheckedThrowingContinuation { continuation in Task.detached { do { let data = try Data(contentsOf: url) @@ -172,50 +172,84 @@ class MapDataManager { } } - /// Get overlay count from processed data + /// Get overlay count from raw GeoJSON data private func getOverlayCount(from data: Data) throws -> Int { - do { - let config = try JSONDecoder().decode(GeoJSONOverlayConfiguration.self, from: data) - return config.overlays.count - } catch { - // Try parsing as raw GeoJSON - if let json = try JSONSerialization.jsonObject(with: data) as? [String: Any], - let features = json["features"] as? [[String: Any]] { - return features.count - } - throw MapDataError.invalidContent + // Parse as raw GeoJSON FeatureCollection + if let json = try JSONSerialization.jsonObject(with: data) as? [String: Any], + let features = json["features"] as? [[String: Any]] { + return features.count } + throw MapDataError.invalidContent } // MARK: - Configuration Loading - /// Load user configuration (priority over bundled) - func loadUserConfiguration() -> GeoJSONOverlayConfiguration? { - if let cached = activeConfiguration { + /// Load and combine raw GeoJSON feature collections from all active files + func loadFeatureCollection() -> GeoJSONFeatureCollection? { + if let cached = activeFeatureCollection { + Logger.services.debug("📁 MapDataManager: Returning cached feature collection") return cached } // Find active user files let activeFiles = uploadedFiles.filter { $0.isActive } - guard let activeFile = activeFiles.first else { + Logger.services.debug("📁 MapDataManager: Found \(activeFiles.count) active files out of \(self.uploadedFiles.count) total files") + + guard !activeFiles.isEmpty else { + Logger.services.debug("📁 MapDataManager: No active files found") return nil } - guard let fileURL = getUserUploadedDirectory()?.appendingPathComponent(activeFile.filename) else { - return nil - } + var allFeatures: [GeoJSONFeature] = [] + + // Load features from all active files + for activeFile in activeFiles { + Logger.services.info("📁 MapDataManager: Attempting to load active file: \(activeFile.filename, privacy: .public)") - do { - let data = try Data(contentsOf: fileURL) - let processedData = try processData(data, filename: activeFile.filename) - let config = try JSONDecoder().decode(GeoJSONOverlayConfiguration.self, from: processedData) + guard let fileURL = getUserUploadedDirectory()?.appendingPathComponent(activeFile.filename) else { + Logger.services.error("📁 MapDataManager: Could not construct file URL for: \(activeFile.filename, privacy: .public)") + continue + } - activeConfiguration = config - return config - } catch { - Logger.services.error("📁 Failed to load user configuration: \(error.localizedDescription, privacy: .public)") - return nil + // Check if file exists before trying to load it + if !FileManager.default.fileExists(atPath: fileURL.path) { + Logger.services.error("📁 MapDataManager: Active file does not exist at path: \(fileURL.path, privacy: .public)") + Logger.services.info("📁 MapDataManager: Removing missing file from metadata") + + // Remove the missing file from our metadata + if let index = uploadedFiles.firstIndex(where: { $0.filename == activeFile.filename }) { + uploadedFiles.remove(at: index) + do { + try saveMetadata() + Logger.services.info("📁 MapDataManager: Successfully cleaned up missing file from metadata") + } catch { + Logger.services.error("📁 MapDataManager: Failed to save cleaned metadata: \(error.localizedDescription, privacy: .public)") + } + } + continue + } + + do { + let data = try Data(contentsOf: fileURL) + let processedData = try processData(data, filename: activeFile.filename) + let featureCollection = try JSONDecoder().decode(GeoJSONFeatureCollection.self, from: processedData) + + Logger.services.info("📁 MapDataManager: Successfully loaded \(featureCollection.features.count) features from \(activeFile.filename, privacy: .public)") + allFeatures.append(contentsOf: featureCollection.features) + } catch { + Logger.services.error("📁 MapDataManager: Failed to load feature collection from \(activeFile.filename, privacy: .public): \(error.localizedDescription, privacy: .public)") + } } + + // Create combined feature collection + let combinedCollection = GeoJSONFeatureCollection( + type: "FeatureCollection", + features: allFeatures + ) + + Logger.services.info("📁 MapDataManager: Successfully combined \(allFeatures.count) total features from \(activeFiles.count) active files") + activeFeatureCollection = combinedCollection + return combinedCollection } // MARK: - File Management @@ -224,27 +258,77 @@ class MapDataManager { func getUploadedFiles() -> [MapDataMetadata] { return uploadedFiles } + + /// Toggle the active state of an uploaded file + func toggleFileActive(_ fileId: UUID) { + Logger.services.debug("📁 MapDataManager: Toggling active state for file: \(fileId)") + + if let index = uploadedFiles.firstIndex(where: { $0.id == fileId }) { + uploadedFiles[index].isActive.toggle() + Logger.services.info("📁 MapDataManager: File '\(self.uploadedFiles[index].filename)' active state: \(self.uploadedFiles[index].isActive)") + + // Save metadata changes + do { + try saveMetadata() + // Clear cached data to force reload + activeFeatureCollection = nil + } catch { + Logger.services.error("📁 MapDataManager: Failed to save metadata after toggling file: \(error.localizedDescription)") + } + } else { + Logger.services.error("📁 MapDataManager: Could not find file with ID: \(fileId)") + } + } /// Delete uploaded file func deleteFile(_ metadata: MapDataMetadata) throws { + Logger.services.info("🗑️ MapDataManager: Attempting to delete file: \(metadata.filename, privacy: .public)") + guard let fileURL = getUserUploadedDirectory()?.appendingPathComponent(metadata.filename) else { + Logger.services.error("🗑️ MapDataManager: Could not construct file URL for: \(metadata.filename, privacy: .public)") throw MapDataError.fileNotFound } - try FileManager.default.removeItem(at: fileURL) + Logger.services.debug("🗑️ MapDataManager: File URL: \(fileURL.path, privacy: .public)") + + // Check if file exists before trying to delete + if !FileManager.default.fileExists(atPath: fileURL.path) { + Logger.services.warning("🗑️ MapDataManager: File does not exist at path: \(fileURL.path, privacy: .public)") + } + + do { + try FileManager.default.removeItem(at: fileURL) + Logger.services.info("🗑️ MapDataManager: Successfully removed file from filesystem") + } catch { + Logger.services.error("🗑️ MapDataManager: Failed to remove file: \(error.localizedDescription, privacy: .public)") + throw error + } if let index = uploadedFiles.firstIndex(where: { $0.filename == metadata.filename }) { uploadedFiles.remove(at: index) + Logger.services.debug("🗑️ MapDataManager: Removed file from uploadedFiles array at index \(index)") + } else { + Logger.services.warning("🗑️ MapDataManager: File not found in uploadedFiles array") } - try saveMetadata() + do { + try saveMetadata() + Logger.services.debug("🗑️ MapDataManager: Successfully saved updated metadata") + } catch { + Logger.services.error("🗑️ MapDataManager: Failed to save metadata: \(error.localizedDescription, privacy: .public)") + throw error + } // Clear cache if this was the active file - if activeConfiguration != nil { - activeConfiguration = nil + if activeFeatureCollection != nil { + activeFeatureCollection = nil + Logger.services.debug("🗑️ MapDataManager: Cleared active configuration cache") } + + // Clear GeoJSON overlay manager cache + GeoJSONOverlayManager.shared.clearCache() - Logger.services.info("🗑️ Deleted file: \(metadata.filename, privacy: .public)") + Logger.services.info("🗑️ MapDataManager: Successfully deleted file: \(metadata.filename, privacy: .public)") } /// Toggle file active status @@ -265,7 +349,7 @@ class MapDataManager { try saveMetadata() // Clear cache to force reload - activeConfiguration = nil + activeFeatureCollection = nil } } diff --git a/Meshtastic/Views/Nodes/Helpers/Map/MapContent/MeshMapContent.swift b/Meshtastic/Views/Nodes/Helpers/Map/MapContent/MeshMapContent.swift index 8e550d20..cfa92edf 100644 --- a/Meshtastic/Views/Nodes/Helpers/Map/MapContent/MeshMapContent.swift +++ b/Meshtastic/Views/Nodes/Helpers/Map/MapContent/MeshMapContent.swift @@ -7,6 +7,8 @@ import SwiftUI import MapKit +import CoreLocation +import OSLog struct IdentifiableOverlay: Identifiable { let overlay: MKOverlay @@ -231,37 +233,9 @@ struct MeshMapContent: MapContent { } } - /// GeoJSON Overlays (Configuration-Driven) + /// GeoJSON Overlays with embedded styling if showMapOverlays { - let overlayManager = GeoJSONOverlayManager.shared - let availableOverlays = overlayManager.getAvailableOverlayIds() - - ForEach(Array(availableOverlays.enumerated()), id: \.element) { _, overlayId in - let overlays = overlayManager.loadOverlays(for: overlayId) - let rendering = overlayManager.getRenderingProperties(for: overlayId) - - ForEach(Array(overlays.enumerated()), id: \.offset) { _, overlay in - if let polygon = overlay as? MKPolygon { - MapPolygon(polygon) - .stroke( - Color(hex: rendering?.lineColor ?? "#000000") - .opacity(rendering?.lineOpacity ?? 1.0), - lineWidth: rendering?.lineThickness ?? 1.0 - ) - .foregroundStyle( - Color(hex: rendering?.lineColor ?? "#000000") - .opacity(rendering?.fillOpacity ?? 0.0) - ) - } else if let polyline = overlay as? MKPolyline { - MapPolyline(polyline) - .stroke( - Color(hex: rendering?.lineColor ?? "#000000") - .opacity(rendering?.lineOpacity ?? 1.0), - lineWidth: rendering?.lineThickness ?? 1.0 - ) - } - } - } + overlayContent } positionAnnotations @@ -269,6 +243,42 @@ struct MeshMapContent: MapContent { waypointAnnotations } + var overlayContent: some MapContent { + let styledFeatures = GeoJSONOverlayManager.shared.loadStyledFeatures() + + return Group { + ForEach(0.. Date: Tue, 22 Jul 2025 02:03:36 +0000 Subject: [PATCH 11/19] wip multiple file uploads - geojson files --- .../Helpers/GeoJSONOverlayManager.swift | 46 ++++++++++++++++++- Meshtastic/Helpers/MapDataManager.swift | 44 ++++++++++++++++-- .../Map/MapContent/MeshMapContent.swift | 11 +++-- .../Nodes/Helpers/Map/MapSettingsForm.swift | 23 ++++++---- Meshtastic/Views/Nodes/MeshMap.swift | 12 ++++- 5 files changed, 116 insertions(+), 20 deletions(-) diff --git a/Meshtastic/Helpers/GeoJSONOverlayManager.swift b/Meshtastic/Helpers/GeoJSONOverlayManager.swift index dcffbaaa..e37956cd 100644 --- a/Meshtastic/Helpers/GeoJSONOverlayManager.swift +++ b/Meshtastic/Helpers/GeoJSONOverlayManager.swift @@ -31,7 +31,48 @@ class GeoJSONOverlayManager { return nil } - /// Load styled features for direct rendering + /// Load styled features for specific enabled configs + func loadStyledFeaturesForConfigs(_ enabledConfigs: Set) -> [GeoJSONStyledFeature] { + Logger.services.debug("🗺️ GeoJSONOverlayManager: loadStyledFeaturesForConfigs() called with \(enabledConfigs.count) configs") + + // Get files that match the enabled configs + let enabledFiles = MapDataManager.shared.getUploadedFiles().filter { enabledConfigs.contains($0.id) } + + guard !enabledFiles.isEmpty else { + Logger.services.debug("🗺️ GeoJSONOverlayManager: No enabled files found, returning empty array") + return [] + } + + // Load feature collection from enabled files only + guard let collection = MapDataManager.shared.loadFeatureCollectionForFiles(enabledFiles) else { + Logger.services.debug("🗺️ GeoJSONOverlayManager: No feature collection available for enabled files, returning empty array") + return [] + } + + var styledFeatures: [GeoJSONStyledFeature] = [] + + Logger.services.info("🗺️ GeoJSONOverlayManager: Processing \(collection.features.count) features from \(enabledFiles.count) enabled files") + + for feature in collection.features { + // Skip invisible features + guard feature.isVisible else { + Logger.services.debug("🗺️ GeoJSONOverlayManager: Skipping invisible feature") + continue + } + + let layerId = feature.layerId ?? "default" + let styledFeature = GeoJSONStyledFeature( + feature: feature, + overlayId: layerId + ) + styledFeatures.append(styledFeature) + } + + Logger.services.info("🗺️ GeoJSONOverlayManager: Returning \(styledFeatures.count) styled features from enabled configs") + return styledFeatures + } + + /// Load styled features for direct rendering (legacy method) func loadStyledFeatures() -> [GeoJSONStyledFeature] { Logger.services.debug("🗺️ GeoJSONOverlayManager: loadStyledFeatures() called") @@ -123,9 +164,10 @@ class GeoJSONOverlayManager { /// Toggle the active state of an uploaded file func toggleFileActive(_ fileId: UUID) { - Logger.services.debug("🗺️ GeoJSONOverlayManager: Toggling active state for file: \(fileId)") + Logger.services.error("🚨 GeoJSONOverlayManager: ENTRY - Toggling active state for file: \(fileId)") MapDataManager.shared.toggleFileActive(fileId) // Clear cache to force reload with new file states clearCache() + Logger.services.error("🚨 GeoJSONOverlayManager: EXIT - Completed toggle and cache clear for file: \(fileId)") } } \ No newline at end of file diff --git a/Meshtastic/Helpers/MapDataManager.swift b/Meshtastic/Helpers/MapDataManager.swift index 50ebb0eb..3bdab686 100644 --- a/Meshtastic/Helpers/MapDataManager.swift +++ b/Meshtastic/Helpers/MapDataManager.swift @@ -184,6 +184,38 @@ class MapDataManager { // MARK: - Configuration Loading + /// Load combined feature collection from specific files + func loadFeatureCollectionForFiles(_ files: [MapDataMetadata]) -> GeoJSONFeatureCollection? { + Logger.services.debug("📁 MapDataManager: Loading feature collection for \(files.count) specific files") + + guard !files.isEmpty else { + Logger.services.debug("📁 MapDataManager: No files provided, returning nil") + return nil + } + + var allFeatures: [GeoJSONFeature] = [] + + for file in files { + do { + if let featureCollection = try loadFeatureCollectionFromFile(file) { + allFeatures.append(contentsOf: featureCollection.features) + Logger.services.info("📁 MapDataManager: Successfully loaded \(featureCollection.features.count) features from \(file.filename, privacy: .public)") + } + } catch { + Logger.services.error("📁 MapDataManager: Failed to load feature collection from \(file.filename, privacy: .public): \(error.localizedDescription, privacy: .public)") + continue + } + } + + guard !allFeatures.isEmpty else { + Logger.services.debug("📁 MapDataManager: No features loaded from any files") + return nil + } + + Logger.services.info("📁 MapDataManager: Successfully combined \(allFeatures.count) total features from \(files.count) files") + return GeoJSONFeatureCollection(type: "FeatureCollection", features: allFeatures) + } + /// Load and combine raw GeoJSON feature collections from all active files func loadFeatureCollection() -> GeoJSONFeatureCollection? { if let cached = activeFeatureCollection { @@ -261,23 +293,27 @@ class MapDataManager { /// Toggle the active state of an uploaded file func toggleFileActive(_ fileId: UUID) { - Logger.services.debug("📁 MapDataManager: Toggling active state for file: \(fileId)") + Logger.services.error("🚨 MapDataManager: ENTRY - Toggling active state for file: \(fileId)") if let index = uploadedFiles.firstIndex(where: { $0.id == fileId }) { + let oldState = uploadedFiles[index].isActive uploadedFiles[index].isActive.toggle() - Logger.services.info("📁 MapDataManager: File '\(self.uploadedFiles[index].filename)' active state: \(self.uploadedFiles[index].isActive)") + let newState = uploadedFiles[index].isActive + Logger.services.error("🚨 MapDataManager: File '\(self.uploadedFiles[index].filename)' changed from \(oldState) to \(newState)") // Save metadata changes do { try saveMetadata() // Clear cached data to force reload activeFeatureCollection = nil + Logger.services.error("🚨 MapDataManager: Successfully saved metadata and cleared cache") } catch { - Logger.services.error("📁 MapDataManager: Failed to save metadata after toggling file: \(error.localizedDescription)") + Logger.services.error("🚨 MapDataManager: FAILED to save metadata after toggling file: \(error.localizedDescription)") } } else { - Logger.services.error("📁 MapDataManager: Could not find file with ID: \(fileId)") + Logger.services.error("🚨 MapDataManager: ERROR - Could not find file with ID: \(fileId)") } + Logger.services.error("🚨 MapDataManager: EXIT - Completed toggle operation for file: \(fileId)") } /// Delete uploaded file diff --git a/Meshtastic/Views/Nodes/Helpers/Map/MapContent/MeshMapContent.swift b/Meshtastic/Views/Nodes/Helpers/Map/MapContent/MeshMapContent.swift index cfa92edf..3bd32bab 100644 --- a/Meshtastic/Views/Nodes/Helpers/Map/MapContent/MeshMapContent.swift +++ b/Meshtastic/Views/Nodes/Helpers/Map/MapContent/MeshMapContent.swift @@ -33,6 +33,7 @@ struct MeshMapContent: MapContent { // Map overlays @AppStorage("mapOverlaysEnabled") private var showMapOverlays = false + @Binding var enabledOverlayConfigs: Set @FetchRequest(fetchRequest: PositionEntity.allPositionsFetchRequest(), animation: .easeIn) var positions: FetchedResults @@ -244,11 +245,15 @@ struct MeshMapContent: MapContent { } var overlayContent: some MapContent { - let styledFeatures = GeoJSONOverlayManager.shared.loadStyledFeatures() + // Get all features but filter by enabled configs + let allStyledFeatures = GeoJSONOverlayManager.shared.loadStyledFeaturesForConfigs(enabledOverlayConfigs) + + // Log with error level to make it visible + print("🚨 MeshMapContent: overlayContent computed - \(enabledOverlayConfigs.count) enabled configs, \(allStyledFeatures.count) features") return Group { - ForEach(0.. var body: some View { @@ -160,15 +161,18 @@ struct MapSettingsForm: View { ForEach(uploadedFiles) { file in Toggle(isOn: Binding( get: { - Logger.services.debug("🔧 MapSettingsForm: File '\(file.originalName)' toggle getter - current state: \(file.isActive)") - return file.isActive + let isEnabled = enabledOverlayConfigs.contains(file.id) + Logger.services.debug("🔧 MapSettingsForm: File '\(file.originalName)' toggle getter - enabled: \(isEnabled)") + return isEnabled }, set: { newValue in - Logger.services.info("🔧 MapSettingsForm: File '\(file.originalName)' toggle setter - changing to: \(newValue)") - GeoJSONOverlayManager.shared.toggleFileActive(file.id) - // Update local state - uploadedFiles = GeoJSONOverlayManager.shared.getUploadedFilesWithState() - Logger.services.info("🔧 MapSettingsForm: Updated local uploadedFiles state after toggle") + Logger.services.error("🚨 SETTER CALLED: File '\(file.originalName)' toggle setter - changing to: \(newValue)") + if newValue { + enabledOverlayConfigs.insert(file.id) + } else { + enabledOverlayConfigs.remove(file.id) + } + Logger.services.error("🚨 SETTER COMPLETED: enabledOverlayConfigs now has \(enabledOverlayConfigs.count) items") } )) { Label { @@ -186,8 +190,9 @@ struct MapSettingsForm: View { } } } icon: { - Image(systemName: file.isActive ? "doc.fill" : "doc") - .foregroundColor(file.isActive ? .accentColor : .secondary) + let isEnabled = enabledOverlayConfigs.contains(file.id) + Image(systemName: isEnabled ? "doc.fill" : "doc") + .foregroundColor(isEnabled ? .accentColor : .secondary) } } .tint(.accentColor) diff --git a/Meshtastic/Views/Nodes/MeshMap.swift b/Meshtastic/Views/Nodes/MeshMap.swift index a0650c41..35989b74 100644 --- a/Meshtastic/Views/Nodes/MeshMap.swift +++ b/Meshtastic/Views/Nodes/MeshMap.swift @@ -26,6 +26,8 @@ struct MeshMap: View { @AppStorage("enableMapTraffic") private var showTraffic: Bool = false @AppStorage("enableMapPointsOfInterest") private var showPointsOfInterest: Bool = false @AppStorage("mapLayer") private var selectedMapLayer: MapLayer = .standard + /// Map overlay configs + @State private var enabledOverlayConfigs: Set = [] // Map Configuration @Namespace var mapScope @State var mapStyle: MapStyle = MapStyle.standard(elevation: .flat, emphasis: MapStyle.StandardEmphasis.muted, pointsOfInterest: .excludingAll, showsTraffic: false) @@ -70,7 +72,8 @@ struct MeshMap: View { showPointsOfInterest: $showPointsOfInterest, selectedMapLayer: $selectedMapLayer, selectedPosition: $selectedPosition, - selectedWaypoint: $selectedWaypoint + selectedWaypoint: $selectedWaypoint, + enabledOverlayConfigs: $enabledOverlayConfigs ) } .mapScope(mapScope) @@ -134,7 +137,7 @@ struct MeshMap: View { .padding() } .sheet(isPresented: $editingSettings) { - MapSettingsForm(traffic: $showTraffic, pointsOfInterest: $showPointsOfInterest, mapLayer: $selectedMapLayer, meshMap: $isMeshMap) + MapSettingsForm(traffic: $showTraffic, pointsOfInterest: $showPointsOfInterest, mapLayer: $selectedMapLayer, meshMap: $isMeshMap, enabledOverlayConfigs: $enabledOverlayConfigs) } .onChange(of: router.navigationState) { guard case .map = router.navigationState.selectedTab else { return } @@ -195,6 +198,11 @@ struct MeshMap: View { }) .onFirstAppear { UIApplication.shared.isIdleTimerDisabled = true + + // Initialize enabled overlay configs with all active files + let activeFiles = GeoJSONOverlayManager.shared.getUploadedFilesWithState().filter { $0.isActive } + enabledOverlayConfigs = Set(activeFiles.map { $0.id }) + print("🚨 MeshMap: Initialized with \(enabledOverlayConfigs.count) enabled overlay configs") // let wayPointEntity = getWaypoint(id: Int64(deepLinkManager.waypointId) ?? -1, context: context) // if wayPointEntity.id > 0 { From 1e95694c7b279fe3ed835a7895a0977641bb7a8b Mon Sep 17 00:00:00 2001 From: Jacob Powers Date: Tue, 22 Jul 2025 02:18:00 +0000 Subject: [PATCH 12/19] remove some print statements --- Meshtastic/Helpers/GeoJSONOverlayConfig.swift | 4 --- .../Helpers/GeoJSONOverlayManager.swift | 25 -------------- Meshtastic/Helpers/MapDataManager.swift | 33 ------------------- .../Map/MapContent/MeshMapContent.swift | 2 -- .../Nodes/Helpers/Map/MapSettingsForm.swift | 9 +---- Meshtastic/Views/Nodes/MeshMap.swift | 1 - 6 files changed, 1 insertion(+), 73 deletions(-) diff --git a/Meshtastic/Helpers/GeoJSONOverlayConfig.swift b/Meshtastic/Helpers/GeoJSONOverlayConfig.swift index 6a4860fd..ac06b6ed 100644 --- a/Meshtastic/Helpers/GeoJSONOverlayConfig.swift +++ b/Meshtastic/Helpers/GeoJSONOverlayConfig.swift @@ -188,11 +188,7 @@ struct GeoJSONStyledFeature: Identifiable { if let geometry = mkFeature.geometry.first as? MKOverlay { // Successfully created overlay return geometry - } else { - Logger.services.warning("🗺️ GeoJSONStyledFeature: First geometry is not an MKOverlay: \(type(of: mkFeature.geometry.first))") } - } else { - Logger.services.warning("🗺️ GeoJSONStyledFeature: First feature is not an MKGeoJSONFeature: \(type(of: mkFeatures.first))") } } catch { Logger.services.error("🗺️ GeoJSONStyledFeature: Failed to convert feature to overlay: \(error.localizedDescription)") diff --git a/Meshtastic/Helpers/GeoJSONOverlayManager.swift b/Meshtastic/Helpers/GeoJSONOverlayManager.swift index e37956cd..85080d89 100644 --- a/Meshtastic/Helpers/GeoJSONOverlayManager.swift +++ b/Meshtastic/Helpers/GeoJSONOverlayManager.swift @@ -11,52 +11,38 @@ class GeoJSONOverlayManager { /// Load raw GeoJSON feature collection from user uploads func loadFeatureCollection() -> GeoJSONFeatureCollection? { - Logger.services.debug("🗺️ GeoJSONOverlayManager: loadFeatureCollection() called") - if let cached = featureCollection { - Logger.services.debug("🗺️ GeoJSONOverlayManager: Returning cached feature collection with \(cached.features.count) features") return cached } // Load user-uploaded feature collection - Logger.services.debug("🗺️ GeoJSONOverlayManager: Loading feature collection from MapDataManager") if let userFeatures = MapDataManager.shared.loadFeatureCollection() { - Logger.services.info("🗺️ GeoJSONOverlayManager: Loaded feature collection with \(userFeatures.features.count) features") featureCollection = userFeatures return userFeatures } - // No feature collection available - Logger.services.debug("🗺️ GeoJSONOverlayManager: No feature collection available") return nil } /// Load styled features for specific enabled configs func loadStyledFeaturesForConfigs(_ enabledConfigs: Set) -> [GeoJSONStyledFeature] { - Logger.services.debug("🗺️ GeoJSONOverlayManager: loadStyledFeaturesForConfigs() called with \(enabledConfigs.count) configs") - // Get files that match the enabled configs let enabledFiles = MapDataManager.shared.getUploadedFiles().filter { enabledConfigs.contains($0.id) } guard !enabledFiles.isEmpty else { - Logger.services.debug("🗺️ GeoJSONOverlayManager: No enabled files found, returning empty array") return [] } // Load feature collection from enabled files only guard let collection = MapDataManager.shared.loadFeatureCollectionForFiles(enabledFiles) else { - Logger.services.debug("🗺️ GeoJSONOverlayManager: No feature collection available for enabled files, returning empty array") return [] } var styledFeatures: [GeoJSONStyledFeature] = [] - Logger.services.info("🗺️ GeoJSONOverlayManager: Processing \(collection.features.count) features from \(enabledFiles.count) enabled files") - for feature in collection.features { // Skip invisible features guard feature.isVisible else { - Logger.services.debug("🗺️ GeoJSONOverlayManager: Skipping invisible feature") continue } @@ -68,27 +54,20 @@ class GeoJSONOverlayManager { styledFeatures.append(styledFeature) } - Logger.services.info("🗺️ GeoJSONOverlayManager: Returning \(styledFeatures.count) styled features from enabled configs") return styledFeatures } /// Load styled features for direct rendering (legacy method) func loadStyledFeatures() -> [GeoJSONStyledFeature] { - Logger.services.debug("🗺️ GeoJSONOverlayManager: loadStyledFeatures() called") - guard let collection = loadFeatureCollection() else { - Logger.services.debug("🗺️ GeoJSONOverlayManager: No feature collection available, returning empty array") return [] } var styledFeatures: [GeoJSONStyledFeature] = [] - Logger.services.info("🗺️ GeoJSONOverlayManager: Processing \(collection.features.count) features") - for feature in collection.features { // Skip invisible features guard feature.isVisible else { - Logger.services.debug("🗺️ GeoJSONOverlayManager: Skipping invisible feature") continue } @@ -100,7 +79,6 @@ class GeoJSONOverlayManager { styledFeatures.append(styledFeature) } - Logger.services.info("🗺️ GeoJSONOverlayManager: Returning \(styledFeatures.count) styled features") return styledFeatures } @@ -130,7 +108,6 @@ class GeoJSONOverlayManager { /// Clear cached data (useful for testing or memory management) func clearCache() { - Logger.services.info("🗺️ GeoJSONOverlayManager: Clearing cache") featureCollection = nil } @@ -164,10 +141,8 @@ class GeoJSONOverlayManager { /// Toggle the active state of an uploaded file func toggleFileActive(_ fileId: UUID) { - Logger.services.error("🚨 GeoJSONOverlayManager: ENTRY - Toggling active state for file: \(fileId)") MapDataManager.shared.toggleFileActive(fileId) // Clear cache to force reload with new file states clearCache() - Logger.services.error("🚨 GeoJSONOverlayManager: EXIT - Completed toggle and cache clear for file: \(fileId)") } } \ No newline at end of file diff --git a/Meshtastic/Helpers/MapDataManager.swift b/Meshtastic/Helpers/MapDataManager.swift index 3bdab686..3f9f61e4 100644 --- a/Meshtastic/Helpers/MapDataManager.swift +++ b/Meshtastic/Helpers/MapDataManager.swift @@ -57,7 +57,6 @@ class MapDataManager { /// Process and store an uploaded file func processUploadedFile(from sourceURL: URL) async throws -> MapDataMetadata { - Logger.services.info("📁 Processing uploaded file: \(sourceURL.lastPathComponent, privacy: .public)") // 1. Start accessing security-scoped resource let isAccessing = sourceURL.startAccessingSecurityScopedResource() @@ -98,7 +97,6 @@ class MapDataManager { // 7. Clear cached configuration to force reload activeFeatureCollection = nil - Logger.services.info("📁 Successfully processed file: \(newFilename, privacy: .public)") return metadata } @@ -186,10 +184,7 @@ class MapDataManager { /// Load combined feature collection from specific files func loadFeatureCollectionForFiles(_ files: [MapDataMetadata]) -> GeoJSONFeatureCollection? { - Logger.services.debug("📁 MapDataManager: Loading feature collection for \(files.count) specific files") - guard !files.isEmpty else { - Logger.services.debug("📁 MapDataManager: No files provided, returning nil") return nil } @@ -199,7 +194,6 @@ class MapDataManager { do { if let featureCollection = try loadFeatureCollectionFromFile(file) { allFeatures.append(contentsOf: featureCollection.features) - Logger.services.info("📁 MapDataManager: Successfully loaded \(featureCollection.features.count) features from \(file.filename, privacy: .public)") } } catch { Logger.services.error("📁 MapDataManager: Failed to load feature collection from \(file.filename, privacy: .public): \(error.localizedDescription, privacy: .public)") @@ -208,27 +202,21 @@ class MapDataManager { } guard !allFeatures.isEmpty else { - Logger.services.debug("📁 MapDataManager: No features loaded from any files") return nil } - - Logger.services.info("📁 MapDataManager: Successfully combined \(allFeatures.count) total features from \(files.count) files") return GeoJSONFeatureCollection(type: "FeatureCollection", features: allFeatures) } /// Load and combine raw GeoJSON feature collections from all active files func loadFeatureCollection() -> GeoJSONFeatureCollection? { if let cached = activeFeatureCollection { - Logger.services.debug("📁 MapDataManager: Returning cached feature collection") return cached } // Find active user files let activeFiles = uploadedFiles.filter { $0.isActive } - Logger.services.debug("📁 MapDataManager: Found \(activeFiles.count) active files out of \(self.uploadedFiles.count) total files") guard !activeFiles.isEmpty else { - Logger.services.debug("📁 MapDataManager: No active files found") return nil } @@ -236,7 +224,6 @@ class MapDataManager { // Load features from all active files for activeFile in activeFiles { - Logger.services.info("📁 MapDataManager: Attempting to load active file: \(activeFile.filename, privacy: .public)") guard let fileURL = getUserUploadedDirectory()?.appendingPathComponent(activeFile.filename) else { Logger.services.error("📁 MapDataManager: Could not construct file URL for: \(activeFile.filename, privacy: .public)") @@ -246,14 +233,12 @@ class MapDataManager { // Check if file exists before trying to load it if !FileManager.default.fileExists(atPath: fileURL.path) { Logger.services.error("📁 MapDataManager: Active file does not exist at path: \(fileURL.path, privacy: .public)") - Logger.services.info("📁 MapDataManager: Removing missing file from metadata") // Remove the missing file from our metadata if let index = uploadedFiles.firstIndex(where: { $0.filename == activeFile.filename }) { uploadedFiles.remove(at: index) do { try saveMetadata() - Logger.services.info("📁 MapDataManager: Successfully cleaned up missing file from metadata") } catch { Logger.services.error("📁 MapDataManager: Failed to save cleaned metadata: \(error.localizedDescription, privacy: .public)") } @@ -266,7 +251,6 @@ class MapDataManager { let processedData = try processData(data, filename: activeFile.filename) let featureCollection = try JSONDecoder().decode(GeoJSONFeatureCollection.self, from: processedData) - Logger.services.info("📁 MapDataManager: Successfully loaded \(featureCollection.features.count) features from \(activeFile.filename, privacy: .public)") allFeatures.append(contentsOf: featureCollection.features) } catch { Logger.services.error("📁 MapDataManager: Failed to load feature collection from \(activeFile.filename, privacy: .public): \(error.localizedDescription, privacy: .public)") @@ -279,7 +263,6 @@ class MapDataManager { features: allFeatures ) - Logger.services.info("📁 MapDataManager: Successfully combined \(allFeatures.count) total features from \(activeFiles.count) active files") activeFeatureCollection = combinedCollection return combinedCollection } @@ -293,39 +276,28 @@ class MapDataManager { /// Toggle the active state of an uploaded file func toggleFileActive(_ fileId: UUID) { - Logger.services.error("🚨 MapDataManager: ENTRY - Toggling active state for file: \(fileId)") - if let index = uploadedFiles.firstIndex(where: { $0.id == fileId }) { - let oldState = uploadedFiles[index].isActive uploadedFiles[index].isActive.toggle() - let newState = uploadedFiles[index].isActive - Logger.services.error("🚨 MapDataManager: File '\(self.uploadedFiles[index].filename)' changed from \(oldState) to \(newState)") // Save metadata changes do { try saveMetadata() // Clear cached data to force reload activeFeatureCollection = nil - Logger.services.error("🚨 MapDataManager: Successfully saved metadata and cleared cache") } catch { Logger.services.error("🚨 MapDataManager: FAILED to save metadata after toggling file: \(error.localizedDescription)") } - } else { - Logger.services.error("🚨 MapDataManager: ERROR - Could not find file with ID: \(fileId)") } - Logger.services.error("🚨 MapDataManager: EXIT - Completed toggle operation for file: \(fileId)") } /// Delete uploaded file func deleteFile(_ metadata: MapDataMetadata) throws { - Logger.services.info("🗑️ MapDataManager: Attempting to delete file: \(metadata.filename, privacy: .public)") guard let fileURL = getUserUploadedDirectory()?.appendingPathComponent(metadata.filename) else { Logger.services.error("🗑️ MapDataManager: Could not construct file URL for: \(metadata.filename, privacy: .public)") throw MapDataError.fileNotFound } - Logger.services.debug("🗑️ MapDataManager: File URL: \(fileURL.path, privacy: .public)") // Check if file exists before trying to delete if !FileManager.default.fileExists(atPath: fileURL.path) { @@ -334,7 +306,6 @@ class MapDataManager { do { try FileManager.default.removeItem(at: fileURL) - Logger.services.info("🗑️ MapDataManager: Successfully removed file from filesystem") } catch { Logger.services.error("🗑️ MapDataManager: Failed to remove file: \(error.localizedDescription, privacy: .public)") throw error @@ -342,14 +313,12 @@ class MapDataManager { if let index = uploadedFiles.firstIndex(where: { $0.filename == metadata.filename }) { uploadedFiles.remove(at: index) - Logger.services.debug("🗑️ MapDataManager: Removed file from uploadedFiles array at index \(index)") } else { Logger.services.warning("🗑️ MapDataManager: File not found in uploadedFiles array") } do { try saveMetadata() - Logger.services.debug("🗑️ MapDataManager: Successfully saved updated metadata") } catch { Logger.services.error("🗑️ MapDataManager: Failed to save metadata: \(error.localizedDescription, privacy: .public)") throw error @@ -358,13 +327,11 @@ class MapDataManager { // Clear cache if this was the active file if activeFeatureCollection != nil { activeFeatureCollection = nil - Logger.services.debug("🗑️ MapDataManager: Cleared active configuration cache") } // Clear GeoJSON overlay manager cache GeoJSONOverlayManager.shared.clearCache() - Logger.services.info("🗑️ MapDataManager: Successfully deleted file: \(metadata.filename, privacy: .public)") } /// Toggle file active status diff --git a/Meshtastic/Views/Nodes/Helpers/Map/MapContent/MeshMapContent.swift b/Meshtastic/Views/Nodes/Helpers/Map/MapContent/MeshMapContent.swift index 3bd32bab..cfaa1e89 100644 --- a/Meshtastic/Views/Nodes/Helpers/Map/MapContent/MeshMapContent.swift +++ b/Meshtastic/Views/Nodes/Helpers/Map/MapContent/MeshMapContent.swift @@ -248,8 +248,6 @@ struct MeshMapContent: MapContent { // Get all features but filter by enabled configs let allStyledFeatures = GeoJSONOverlayManager.shared.loadStyledFeaturesForConfigs(enabledOverlayConfigs) - // Log with error level to make it visible - print("🚨 MeshMapContent: overlayContent computed - \(enabledOverlayConfigs.count) enabled configs, \(allStyledFeatures.count) features") return Group { ForEach(0.. 0 { From ee43a3f4dcf5312e4f0dfd5427356fa6f681c5d5 Mon Sep 17 00:00:00 2001 From: Jacob Powers Date: Tue, 22 Jul 2025 03:23:43 +0000 Subject: [PATCH 13/19] cleanup --- Meshtastic.xcodeproj/project.pbxproj | 4 - Meshtastic/Extensions/Data+Gzip.swift | 63 ---- Meshtastic/Helpers/MapDataManager.swift | 62 ++-- .../Nodes/Helpers/Map/NodeMapSwiftUI.swift | 331 ++++++++++-------- Meshtastic/Views/Settings/MapDataUpload.swift | 27 +- 5 files changed, 213 insertions(+), 274 deletions(-) delete mode 100644 Meshtastic/Extensions/Data+Gzip.swift diff --git a/Meshtastic.xcodeproj/project.pbxproj b/Meshtastic.xcodeproj/project.pbxproj index 43118390..a17f29d1 100644 --- a/Meshtastic.xcodeproj/project.pbxproj +++ b/Meshtastic.xcodeproj/project.pbxproj @@ -59,7 +59,6 @@ 3D3417B42E2730EC006A988B /* GeoJSONOverlayManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3D3417B32E2730EC006A988B /* GeoJSONOverlayManager.swift */; }; 3D3417C82E29D38A006A988B /* GeoJSONOverlayConfig.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3D3417C72E29D38A006A988B /* GeoJSONOverlayConfig.swift */; }; 3D3417CB2E29D3B0006A988B /* Color+Hex.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3D3417C92E29D3B0006A988B /* Color+Hex.swift */; }; - 3D3417CC2E29D3B0006A988B /* Data+Gzip.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3D3417CA2E29D3B0006A988B /* Data+Gzip.swift */; }; 3D3417D22E2DC260006A988B /* MapDataManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3D3417D12E2DC260006A988B /* MapDataManager.swift */; }; 3D3417D42E2DC293006A988B /* MapDataUpload.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3D3417D32E2DC293006A988B /* MapDataUpload.swift */; }; 6D825E622C34786C008DBEE4 /* CommonRegex.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6D825E612C34786C008DBEE4 /* CommonRegex.swift */; }; @@ -335,7 +334,6 @@ 3D3417B32E2730EC006A988B /* GeoJSONOverlayManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GeoJSONOverlayManager.swift; sourceTree = ""; }; 3D3417C72E29D38A006A988B /* GeoJSONOverlayConfig.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GeoJSONOverlayConfig.swift; sourceTree = ""; }; 3D3417C92E29D3B0006A988B /* Color+Hex.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Color+Hex.swift"; sourceTree = ""; }; - 3D3417CA2E29D3B0006A988B /* Data+Gzip.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Data+Gzip.swift"; sourceTree = ""; }; 3D3417D12E2DC260006A988B /* MapDataManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MapDataManager.swift; sourceTree = ""; }; 3D3417D32E2DC293006A988B /* MapDataUpload.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MapDataUpload.swift; sourceTree = ""; }; 6D825E612C34786C008DBEE4 /* CommonRegex.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CommonRegex.swift; sourceTree = ""; }; @@ -1183,7 +1181,6 @@ isa = PBXGroup; children = ( 3D3417C92E29D3B0006A988B /* Color+Hex.swift */, - 3D3417CA2E29D3B0006A988B /* Data+Gzip.swift */, DD007BB12AA59B9A00F5FA12 /* CoreData */, DDFFA7462B3A7F3C004730DB /* Bundle.swift */, DDDB444529F8A96500EE2349 /* Character.swift */, @@ -1595,7 +1592,6 @@ DDB75A1E2A0B0CD0006ED576 /* LoRaSignalStrengthIndicator.swift in Sources */, DDA6B2E928419CF2003E8C16 /* MeshPackets.swift in Sources */, 3D3417CB2E29D3B0006A988B /* Color+Hex.swift in Sources */, - 3D3417CC2E29D3B0006A988B /* Data+Gzip.swift in Sources */, DDCE4E2C2869F92900BE9F8F /* UserConfig.swift in Sources */, BCB613852C68703800485544 /* NodePositionIntent.swift in Sources */, DDB75A212A12B954006ED576 /* LoRaSignalStrength.swift in Sources */, diff --git a/Meshtastic/Extensions/Data+Gzip.swift b/Meshtastic/Extensions/Data+Gzip.swift deleted file mode 100644 index 580ececf..00000000 --- a/Meshtastic/Extensions/Data+Gzip.swift +++ /dev/null @@ -1,63 +0,0 @@ -import Foundation -import Compression - -extension Data { - /// Decompresses raw deflate data - func zlibDecompressed() throws -> Data { - guard self.count > 0 else { return Data() } - - // Try Foundation's zlib first - do { - let decompressedData = try (self as NSData).decompressed(using: .zlib) as Data - print("Data+Zlib: Successfully decompressed with Foundation \(count) bytes to \(decompressedData.count) bytes") - return decompressedData - } catch { - print("Data+Zlib: Foundation decompression failed: \(error), trying raw deflate...") - } - - // Fallback to Compression framework with raw deflate - let bufferSize = count * 10 - let destination = UnsafeMutablePointer.allocate(capacity: bufferSize) - defer { destination.deallocate() } - - return try self.withUnsafeBytes { bytes in - let source = bytes.bindMemory(to: UInt8.self) - - let result = compression_decode_buffer( - destination, bufferSize, - source.baseAddress!, count, - nil, COMPRESSION_ZLIB - ) - - guard result > 0 else { - print("Data+Zlib: Raw deflate decompression also failed, result size: \(result)") - throw ZlibError.decompression - } - - print("Data+Zlib: Successfully decompressed with raw deflate \(count) bytes to \(result) bytes") - return Data(bytes: destination, count: result) - } - } -} - -enum ZlibError: Error { - case decompression - - var localizedDescription: String { - switch self { - case .decompression: - return "Failed to decompress data" - } - } -} - -enum GzipError: Error { - case decompression - - var localizedDescription: String { - switch self { - case .decompression: - return "Failed to decompress gzip data" - } - } -} \ No newline at end of file diff --git a/Meshtastic/Helpers/MapDataManager.swift b/Meshtastic/Helpers/MapDataManager.swift index 3f9f61e4..0991224b 100644 --- a/Meshtastic/Helpers/MapDataManager.swift +++ b/Meshtastic/Helpers/MapDataManager.swift @@ -115,7 +115,7 @@ class MapDataManager { } // Check file extension - let allowedExtensions = ["json", "geojson", "kml", "kmz", "gz", "zlib"] + let allowedExtensions = ["json", "geojson"] let fileExtension = url.pathExtension.lowercased() guard allowedExtensions.contains(fileExtension) else { throw MapDataError.unsupportedFormat @@ -133,15 +133,22 @@ class MapDataManager { Task.detached { do { let data = try Data(contentsOf: url) - let processedData = try self.processData(data, filename: url.lastPathComponent) - let overlayCount = try self.getOverlayCount(from: processedData) - continuation.resume(returning: (processedData, overlayCount)) + let overlayCount = try self.getOverlayCount(from: data) + continuation.resume(returning: (data, overlayCount)) } catch { continuation.resume(throwing: error) } } } + // TODO: Add proper GeoJSON schema validation here + // - Validate required properties (type, features) + // - Validate geometry types and coordinates + // - Validate feature structure + // - Consider using JSONSchema validation + // - Ensure coordinates are within valid ranges (lat: -90 to 90, lon: -180 to 180) + // - Validate that feature properties follow expected patterns + // If this is the first file uploaded, make it active by default let isFirstFile = uploadedFiles.isEmpty @@ -158,17 +165,6 @@ class MapDataManager { ) } - /// Process data (decompress if needed) - private func processData(_ data: Data, filename: String) throws -> Data { - let fileExtension = filename.components(separatedBy: ".").last?.lowercased() ?? "" - - switch fileExtension { - case "gz", "zlib": - return try data.zlibDecompressed() - default: - return data - } - } /// Get overlay count from raw GeoJSON data private func getOverlayCount(from data: Data) throws -> Int { @@ -180,6 +176,16 @@ class MapDataManager { throw MapDataError.invalidContent } + /// Load feature collection from a single file + private func loadFeatureCollectionFromFile(_ file: MapDataMetadata) throws -> GeoJSONFeatureCollection? { + guard let fileURL = getUserUploadedDirectory()?.appendingPathComponent(file.filename) else { + throw MapDataError.fileNotFound + } + + let data = try Data(contentsOf: fileURL) + return try JSONDecoder().decode(GeoJSONFeatureCollection.self, from: data) + } + // MARK: - Configuration Loading /// Load combined feature collection from specific files @@ -248,8 +254,7 @@ class MapDataManager { do { let data = try Data(contentsOf: fileURL) - let processedData = try processData(data, filename: activeFile.filename) - let featureCollection = try JSONDecoder().decode(GeoJSONFeatureCollection.self, from: processedData) + let featureCollection = try JSONDecoder().decode(GeoJSONFeatureCollection.self, from: data) allFeatures.append(contentsOf: featureCollection.features) } catch { @@ -291,7 +296,7 @@ class MapDataManager { } /// Delete uploaded file - func deleteFile(_ metadata: MapDataMetadata) throws { + func deleteFile(_ metadata: MapDataMetadata) async throws { guard let fileURL = getUserUploadedDirectory()?.appendingPathComponent(metadata.filename) else { Logger.services.error("🗑️ MapDataManager: Could not construct file URL for: \(metadata.filename, privacy: .public)") @@ -334,27 +339,6 @@ class MapDataManager { } - /// Toggle file active status - func toggleFileActive(_ metadata: MapDataMetadata) throws { - if let index = uploadedFiles.firstIndex(where: { $0.filename == metadata.filename }) { - let newActiveState = !uploadedFiles[index].isActive - - // If making this file active, deactivate all others (only one can be active) - if newActiveState { - for i in uploadedFiles.indices { - uploadedFiles[i].isActive = (i == index) - } - } else { - // Just deactivate this file - uploadedFiles[index].isActive = false - } - - try saveMetadata() - - // Clear cache to force reload - activeFeatureCollection = nil - } - } // MARK: - Metadata Persistence diff --git a/Meshtastic/Views/Nodes/Helpers/Map/NodeMapSwiftUI.swift b/Meshtastic/Views/Nodes/Helpers/Map/NodeMapSwiftUI.swift index f5a2f84c..bf1b6186 100644 --- a/Meshtastic/Views/Nodes/Helpers/Map/NodeMapSwiftUI.swift +++ b/Meshtastic/Views/Nodes/Helpers/Map/NodeMapSwiftUI.swift @@ -30,6 +30,7 @@ struct NodeMapSwiftUI: View { @State var isShowingAltitude = false @State var isEditingSettings = false @State var isMeshMap = false + @State var enabledOverlayConfigs: Set = Set() @State private var mapRegion = MKCoordinateRegion.init() @@ -40,165 +41,191 @@ struct NodeMapSwiftUI: View { private var waypoints: FetchedResults var body: some View { - var mostRecent = node.positions?.lastObject as? PositionEntity - if node.hasPositions { + mapWithNavigation + } else { + ContentUnavailableView("No Positions", systemImage: "mappin.slash") + } + } + + private var mapWithNavigation: some View { + ZStack { + MapReader { _ in + configuredMap + } + } + .navigationBarTitle(String((node.user?.shortName ?? "Unknown".localized) + (" \(node.positions?.count ?? 0) points")), displayMode: .inline) + .navigationBarItems(trailing: ZStack { - MapReader { _ in - Map(position: $position, bounds: MapCameraBounds(minimumDistance: 0, maximumDistance: .infinity), scope: mapScope) { - NodeMapContent(node: node) - } - .mapScope(mapScope) - .mapStyle(mapStyle) - .mapControls { - MapScaleView(scope: mapScope) - .mapControlVisibility(.visible) - if showUserLocation { - MapUserLocationButton(scope: mapScope) - .mapControlVisibility(.visible) - } - MapPitchToggle(scope: mapScope) - .mapControlVisibility(.visible) - MapCompass(scope: mapScope) - .mapControlVisibility(.visible) - } - .controlSize(.regular) - .overlay(alignment: .bottom) { - if scene != nil && isLookingAround { - LookAroundPreview(initialScene: scene) - .frame(height: UIDevice.current.userInterfaceIdiom == .phone ? 250 : 400) - .clipShape(RoundedRectangle(cornerRadius: 12)) - .padding(.horizontal, 20) - } - } - .overlay(alignment: .bottom) { - if !isLookingAround && isShowingAltitude { - PositionAltitudeChart(node: node) - .frame(height: UIDevice.current.userInterfaceIdiom == .phone ? 250 : 400) - .clipShape(RoundedRectangle(cornerRadius: 12)) - .padding(.horizontal, 20) - } - } - .sheet(isPresented: $isEditingSettings) { - MapSettingsForm(traffic: $showTraffic, pointsOfInterest: $showPointsOfInterest, mapLayer: $selectedMapLayer, meshMap: $isMeshMap) - .onChange(of: (selectedMapLayer)) { _, newMapLayer in - switch selectedMapLayer { - case .standard: - UserDefaults.mapLayer = newMapLayer - mapStyle = MapStyle.standard(elevation: .flat, pointsOfInterest: showPointsOfInterest ? .all : .excludingAll, showsTraffic: showTraffic) - case .hybrid: - UserDefaults.mapLayer = newMapLayer - mapStyle = MapStyle.hybrid(elevation: .flat, pointsOfInterest: showPointsOfInterest ? .all : .excludingAll, showsTraffic: showTraffic) - case .satellite: - UserDefaults.mapLayer = newMapLayer - mapStyle = MapStyle.imagery(elevation: .flat) - case .offline: - return - } - } - } - .onChange(of: node) { - isLookingAround = false - isShowingAltitude = false - mostRecent = node.positions?.lastObject as? PositionEntity - if node.positions?.count ?? 0 > 1 { - position = .automatic - } else { - position = .camera(MapCamera(centerCoordinate: mostRecent!.coordinate, distance: distance, heading: 0, pitch: 0)) - } - if let mostRecent { - Task { - scene = try? await fetchScene(for: mostRecent.coordinate) - } - } - } - .onAppear { - UIApplication.shared.isIdleTimerDisabled = true - switch selectedMapLayer { - case .standard: - mapStyle = MapStyle.standard(elevation: .flat, pointsOfInterest: showPointsOfInterest ? .all : .excludingAll, showsTraffic: showTraffic) - case .hybrid: - mapStyle = MapStyle.hybrid(elevation: .flat, pointsOfInterest: showPointsOfInterest ? .all : .excludingAll, showsTraffic: showTraffic) - case .satellite: - mapStyle = MapStyle.imagery(elevation: .flat) - case .offline: - mapStyle = MapStyle.hybrid(elevation: .flat, pointsOfInterest: showPointsOfInterest ? .all : .excludingAll, showsTraffic: showTraffic) - } - mostRecent = node.positions?.lastObject as? PositionEntity - if node.positions?.count ?? 0 > 1 { - position = .automatic - } else { - if let mrCoord = mostRecent?.coordinate { - position = .camera(MapCamera(centerCoordinate: mrCoord, distance: distance, heading: 0, pitch: 0)) - } - } - if self.scene == nil { - Task { - scene = try? await fetchScene(for: mostRecent!.coordinate) - } - } - } - .safeAreaInset(edge: .bottom, alignment: .trailing) { - HStack { - Button(action: { - withAnimation { - isEditingSettings = !isEditingSettings - } - }) { - Image(systemName: isEditingSettings ? "info.circle.fill" : "info.circle") - .padding(.vertical, 5) - } - .tint(Color(UIColor.secondarySystemBackground)) - .foregroundColor(.accentColor) - .buttonStyle(.borderedProminent) - /// Look Around Button - if self.scene != nil { - Button(action: { - if isShowingAltitude { - isShowingAltitude = false - } - isLookingAround = !isLookingAround - }) { - Image(systemName: isLookingAround ? "binoculars.fill" : "binoculars") - .padding(.vertical, 5) - } - .tint(Color(UIColor.secondarySystemBackground)) - .foregroundColor(.accentColor) - .buttonStyle(.borderedProminent) - } - /// Altitude Button - if node.positions?.count ?? 0 > 1 { - Button(action: { - if isLookingAround { - isLookingAround = false - } - isShowingAltitude = !isShowingAltitude - }) { - Image(systemName: isShowingAltitude ? "mountain.2.fill" : "mountain.2") - .padding(.vertical, 5) - } - .tint(Color(UIColor.secondarySystemBackground)) - .foregroundColor(.accentColor) - .buttonStyle(.borderedProminent) - } - } - .controlSize(.regular) - .padding(5) - } - .onDisappear { - UIApplication.shared.isIdleTimerDisabled = false - } - }} - .navigationBarTitle(String((node.user?.shortName ?? "Unknown".localized) + (" \(node.positions?.count ?? 0) points")), displayMode: .inline) - .navigationBarItems(trailing: - ZStack { ConnectedDevice( bluetoothOn: bleManager.isSwitchedOn, deviceConnected: bleManager.connectedPeripheral != nil, name: (bleManager.connectedPeripheral != nil) ? bleManager.connectedPeripheral.shortName : "?") }) - } else { - ContentUnavailableView("No Positions", systemImage: "mappin.slash") + } + + private var configuredMap: some View { + baseMap + .overlay(alignment: .bottom) { + lookAroundView + } + .overlay(alignment: .bottom) { + altitudeView + } + .sheet(isPresented: $isEditingSettings) { + MapSettingsForm(traffic: $showTraffic, pointsOfInterest: $showPointsOfInterest, mapLayer: $selectedMapLayer, meshMap: $isMeshMap, enabledOverlayConfigs: $enabledOverlayConfigs) + } + .onChange(of: selectedMapLayer) { _, newMapLayer in + updateMapStyle(for: newMapLayer) + } + .onChange(of: node) { + handleNodeChange() + } + .onAppear { + handleAppear() + } + .safeAreaInset(edge: .bottom, alignment: .trailing) { + controlButtons + } + .onDisappear { + UIApplication.shared.isIdleTimerDisabled = false + } + } + + private var baseMap: some View { + Map(position: $position, bounds: MapCameraBounds(minimumDistance: 0, maximumDistance: .infinity), scope: mapScope) { + NodeMapContent(node: node) + } + .mapScope(mapScope) + .mapStyle(mapStyle) + .mapControls { + MapScaleView(scope: mapScope) + .mapControlVisibility(.visible) + if showUserLocation { + MapUserLocationButton(scope: mapScope) + .mapControlVisibility(.visible) + } + MapPitchToggle(scope: mapScope) + .mapControlVisibility(.visible) + MapCompass(scope: mapScope) + .mapControlVisibility(.visible) + } + .controlSize(.regular) + } + + private var lookAroundView: some View { + Group { + if scene != nil && isLookingAround { + LookAroundPreview(initialScene: scene) + .frame(height: UIDevice.current.userInterfaceIdiom == .phone ? 250 : 400) + .clipShape(RoundedRectangle(cornerRadius: 12)) + .padding(.horizontal, 20) + } + } + } + + private var altitudeView: some View { + Group { + if !isLookingAround && isShowingAltitude { + PositionAltitudeChart(node: node) + .frame(height: UIDevice.current.userInterfaceIdiom == .phone ? 250 : 400) + .clipShape(RoundedRectangle(cornerRadius: 12)) + .padding(.horizontal, 20) + } + } + } + + private var controlButtons: some View { + HStack { + Button(action: { + withAnimation { + isEditingSettings = !isEditingSettings + } + }) { + Image(systemName: isEditingSettings ? "info.circle.fill" : "info.circle") + .padding(.vertical, 5) + } + .tint(Color(UIColor.secondarySystemBackground)) + .foregroundColor(.accentColor) + .buttonStyle(.borderedProminent) + + if scene != nil { + Button(action: { + if isShowingAltitude { + isShowingAltitude = false + } + isLookingAround = !isLookingAround + }) { + Image(systemName: isLookingAround ? "binoculars.fill" : "binoculars") + .padding(.vertical, 5) + } + .tint(Color(UIColor.secondarySystemBackground)) + .foregroundColor(.accentColor) + .buttonStyle(.borderedProminent) + } + + if node.positions?.count ?? 0 > 1 { + Button(action: { + if isLookingAround { + isLookingAround = false + } + isShowingAltitude = !isShowingAltitude + }) { + Image(systemName: isShowingAltitude ? "mountain.2.fill" : "mountain.2") + .padding(.vertical, 5) + } + .tint(Color(UIColor.secondarySystemBackground)) + .foregroundColor(.accentColor) + .buttonStyle(.borderedProminent) + } + } + .controlSize(.regular) + .padding(5) + } + + private func updateMapStyle(for layer: MapLayer) { + UserDefaults.mapLayer = layer + switch layer { + case .standard: + mapStyle = MapStyle.standard(elevation: .flat, pointsOfInterest: showPointsOfInterest ? .all : .excludingAll, showsTraffic: showTraffic) + case .hybrid: + mapStyle = MapStyle.hybrid(elevation: .flat, pointsOfInterest: showPointsOfInterest ? .all : .excludingAll, showsTraffic: showTraffic) + case .satellite: + mapStyle = MapStyle.imagery(elevation: .flat) + case .offline: + break + } + } + + private func handleNodeChange() { + isLookingAround = false + isShowingAltitude = false + let newMostRecent = node.positions?.lastObject as? PositionEntity + if node.positions?.count ?? 0 > 1 { + position = .automatic + } else if let mrCoord = newMostRecent?.coordinate { + position = .camera(MapCamera(centerCoordinate: mrCoord, distance: distance, heading: 0, pitch: 0)) + } + if let newMostRecent { + Task { + scene = try? await fetchScene(for: newMostRecent.coordinate) + } + } + } + + private func handleAppear() { + UIApplication.shared.isIdleTimerDisabled = true + updateMapStyle(for: selectedMapLayer) + let mostRecent = node.positions?.lastObject as? PositionEntity + if node.positions?.count ?? 0 > 1 { + position = .automatic + } else if let mrCoord = mostRecent?.coordinate { + position = .camera(MapCamera(centerCoordinate: mrCoord, distance: distance, heading: 0, pitch: 0)) + } + if scene == nil, let mrCoord = mostRecent?.coordinate { + Task { + scene = try? await fetchScene(for: mrCoord) + } } } /// Get the look around scene diff --git a/Meshtastic/Views/Settings/MapDataUpload.swift b/Meshtastic/Views/Settings/MapDataUpload.swift index c686aaaf..0eaea62c 100644 --- a/Meshtastic/Views/Settings/MapDataUpload.swift +++ b/Meshtastic/Views/Settings/MapDataUpload.swift @@ -106,11 +106,7 @@ struct MapDataUpload: View { isPresented: $isShowingFilePicker, allowedContentTypes: [ UTType.json, - UTType(filenameExtension: "geojson") ?? UTType.json, - UTType(filenameExtension: "kml") ?? UTType.xml, - UTType(filenameExtension: "kmz") ?? UTType.zip, - UTType(filenameExtension: "gz") ?? UTType.data, - UTType(filenameExtension: "zlib") ?? UTType.data + UTType(filenameExtension: "geojson") ?? UTType.json ], allowsMultipleSelection: false ) { result in @@ -183,20 +179,19 @@ struct MapDataUpload: View { } private func toggleFileActive(_ file: MapDataMetadata) { - do { - try mapDataManager.toggleFileActive(file) - } catch { - errorMessage = "Failed to toggle file: \(error.localizedDescription)" - showError = true - } + mapDataManager.toggleFileActive(file.id) } private func deleteFile(_ file: MapDataMetadata) { - do { - try mapDataManager.deleteFile(file) - } catch { - errorMessage = "Failed to delete file: \(error.localizedDescription)" - showError = true + Task { + do { + try await mapDataManager.deleteFile(file) + } catch { + await MainActor.run { + errorMessage = "Failed to delete file: \(error.localizedDescription)" + showError = true + } + } } } } From aa54a7aa73c01e0200240fb237424ea7f71e0208 Mon Sep 17 00:00:00 2001 From: Jacob Powers Date: Tue, 22 Jul 2025 03:46:04 +0000 Subject: [PATCH 14/19] remove toggles from file upload page --- Meshtastic/Views/Settings/MapDataUpload.swift | 12 ------------ 1 file changed, 12 deletions(-) diff --git a/Meshtastic/Views/Settings/MapDataUpload.swift b/Meshtastic/Views/Settings/MapDataUpload.swift index 0eaea62c..b6166bc4 100644 --- a/Meshtastic/Views/Settings/MapDataUpload.swift +++ b/Meshtastic/Views/Settings/MapDataUpload.swift @@ -87,8 +87,6 @@ struct MapDataUpload: View { LazyVStack(spacing: 8) { ForEach(uploadedFiles) { file in MapDataFileRow(file: file) { - toggleFileActive(file) - } onDelete: { deleteFile(file) } } @@ -178,9 +176,6 @@ struct MapDataUpload: View { } } - private func toggleFileActive(_ file: MapDataMetadata) { - mapDataManager.toggleFileActive(file.id) - } private func deleteFile(_ file: MapDataMetadata) { Task { @@ -200,7 +195,6 @@ struct MapDataUpload: View { struct MapDataFileRow: View { let file: MapDataMetadata - let onToggle: () -> Void let onDelete: () -> Void var body: some View { @@ -212,12 +206,6 @@ struct MapDataFileRow: View { .lineLimit(1) Spacer() - - Toggle("", isOn: Binding( - get: { file.isActive }, - set: { _ in onToggle() } - )) - .toggleStyle(SwitchToggleStyle(tint: .accentColor)) } HStack { From abe0144d48a0e81c90b7611fb02da3ef4bf04792 Mon Sep 17 00:00:00 2001 From: Jacob Powers Date: Tue, 22 Jul 2025 04:13:54 +0000 Subject: [PATCH 15/19] fixes --- Meshtastic.xcodeproj/project.pbxproj | 8 +-- Meshtastic/Helpers/MapDataManager.swift | 71 ++++++++++++------- .../Nodes/Helpers/Map/MapSettingsForm.swift | 14 ++-- Meshtastic/Views/Nodes/MeshMap.swift | 5 ++ Meshtastic/Views/Settings/AppData.swift | 2 +- ...MapDataUpload.swift => MapDataFiles.swift} | 7 +- 6 files changed, 64 insertions(+), 43 deletions(-) rename Meshtastic/Views/Settings/{MapDataUpload.swift => MapDataFiles.swift} (98%) diff --git a/Meshtastic.xcodeproj/project.pbxproj b/Meshtastic.xcodeproj/project.pbxproj index a17f29d1..02246fa1 100644 --- a/Meshtastic.xcodeproj/project.pbxproj +++ b/Meshtastic.xcodeproj/project.pbxproj @@ -60,7 +60,7 @@ 3D3417C82E29D38A006A988B /* GeoJSONOverlayConfig.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3D3417C72E29D38A006A988B /* GeoJSONOverlayConfig.swift */; }; 3D3417CB2E29D3B0006A988B /* Color+Hex.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3D3417C92E29D3B0006A988B /* Color+Hex.swift */; }; 3D3417D22E2DC260006A988B /* MapDataManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3D3417D12E2DC260006A988B /* MapDataManager.swift */; }; - 3D3417D42E2DC293006A988B /* MapDataUpload.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3D3417D32E2DC293006A988B /* MapDataUpload.swift */; }; + 3D3417D42E2DC293006A988B /* MapDataFiles.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3D3417D32E2DC293006A988B /* MapDataFiles.swift */; }; 6D825E622C34786C008DBEE4 /* CommonRegex.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6D825E612C34786C008DBEE4 /* CommonRegex.swift */; }; 6DA39D8E2A92DC52007E311C /* MeshtasticAppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6DA39D8D2A92DC52007E311C /* MeshtasticAppDelegate.swift */; }; 6DEDA55A2A957B8E00321D2E /* DetectionSensorLog.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6DEDA5592A957B8E00321D2E /* DetectionSensorLog.swift */; }; @@ -335,7 +335,7 @@ 3D3417C72E29D38A006A988B /* GeoJSONOverlayConfig.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GeoJSONOverlayConfig.swift; sourceTree = ""; }; 3D3417C92E29D3B0006A988B /* Color+Hex.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Color+Hex.swift"; sourceTree = ""; }; 3D3417D12E2DC260006A988B /* MapDataManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MapDataManager.swift; sourceTree = ""; }; - 3D3417D32E2DC293006A988B /* MapDataUpload.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MapDataUpload.swift; sourceTree = ""; }; + 3D3417D32E2DC293006A988B /* MapDataFiles.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MapDataFiles.swift; sourceTree = ""; }; 6D825E612C34786C008DBEE4 /* CommonRegex.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CommonRegex.swift; sourceTree = ""; }; 6DA39D8D2A92DC52007E311C /* MeshtasticAppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MeshtasticAppDelegate.swift; sourceTree = ""; }; 6DEDA5592A957B8E00321D2E /* DetectionSensorLog.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DetectionSensorLog.swift; sourceTree = ""; }; @@ -797,7 +797,7 @@ DD4A911C2708C57100501B7E /* Settings */ = { isa = PBXGroup; children = ( - 3D3417D32E2DC293006A988B /* MapDataUpload.swift */, + 3D3417D32E2DC293006A988B /* MapDataManager.swift */, DDD5BB0E2C285F92007E03CA /* Logs */, DD93800C2BA74CE3008BEC06 /* Channels */, DD61937A2863876A00E59241 /* Config */, @@ -1453,7 +1453,7 @@ DD913639270DFF4C00D7ACF3 /* LocalNotificationManager.swift in Sources */, DDDB444C29F8AAA600EE2349 /* Color.swift in Sources */, DDDFE73F2D0D48FF0044463C /* IgnoreNodeButton.swift in Sources */, - 3D3417D42E2DC293006A988B /* MapDataUpload.swift in Sources */, + 3D3417D42E2DC293006A988B /* MapDataManager.swift in Sources */, DDB8F4122A9EE5DD00230ECE /* UserList.swift in Sources */, DDB75A0F2A05920E006ED576 /* FileManager.swift in Sources */, DD3D17E02C3FB67200561584 /* LocalWeatherConditions.swift in Sources */, diff --git a/Meshtastic/Helpers/MapDataManager.swift b/Meshtastic/Helpers/MapDataManager.swift index 0991224b..04609e7a 100644 --- a/Meshtastic/Helpers/MapDataManager.swift +++ b/Meshtastic/Helpers/MapDataManager.swift @@ -1,9 +1,10 @@ import Foundation import MapKit import OSLog +import Combine /// Manager for handling user-uploaded map data files -class MapDataManager { +class MapDataManager: ObservableObject { static let shared = MapDataManager() private init() {} @@ -14,7 +15,7 @@ class MapDataManager { private let metadataFileName = "upload_history.json" // MARK: - Properties - private var uploadedFiles: [MapDataMetadata] = [] + @Published private var uploadedFiles: [MapDataMetadata] = [] private var activeFeatureCollection: GeoJSONFeatureCollection? // MARK: - File Management @@ -90,13 +91,14 @@ class MapDataManager { // 5. Process and validate content let metadata = try await processFileContent(at: destURL, originalName: originalName) - // 6. Save metadata - uploadedFiles.append(metadata) + // 6. Save metadata and update UI on main thread + await MainActor.run { + uploadedFiles.append(metadata) + // Clear cached configuration to force reload + activeFeatureCollection = nil + } try saveMetadata() - // 7. Clear cached configuration to force reload - activeFeatureCollection = nil - return metadata } @@ -181,7 +183,7 @@ class MapDataManager { guard let fileURL = getUserUploadedDirectory()?.appendingPathComponent(file.filename) else { throw MapDataError.fileNotFound } - + let data = try Data(contentsOf: fileURL) return try JSONDecoder().decode(GeoJSONFeatureCollection.self, from: data) } @@ -193,9 +195,9 @@ class MapDataManager { guard !files.isEmpty else { return nil } - + var allFeatures: [GeoJSONFeature] = [] - + for file in files { do { if let featureCollection = try loadFeatureCollectionFromFile(file) { @@ -206,7 +208,7 @@ class MapDataManager { continue } } - + guard !allFeatures.isEmpty else { return nil } @@ -221,13 +223,13 @@ class MapDataManager { // Find active user files let activeFiles = uploadedFiles.filter { $0.isActive } - + guard !activeFiles.isEmpty else { return nil } var allFeatures: [GeoJSONFeature] = [] - + // Load features from all active files for activeFile in activeFiles { @@ -239,7 +241,7 @@ class MapDataManager { // Check if file exists before trying to load it if !FileManager.default.fileExists(atPath: fileURL.path) { Logger.services.error("📁 MapDataManager: Active file does not exist at path: \(fileURL.path, privacy: .public)") - + // Remove the missing file from our metadata if let index = uploadedFiles.firstIndex(where: { $0.filename == activeFile.filename }) { uploadedFiles.remove(at: index) @@ -261,13 +263,13 @@ class MapDataManager { Logger.services.error("📁 MapDataManager: Failed to load feature collection from \(activeFile.filename, privacy: .public): \(error.localizedDescription, privacy: .public)") } } - + // Create combined feature collection let combinedCollection = GeoJSONFeatureCollection( type: "FeatureCollection", features: allFeatures ) - + activeFeatureCollection = combinedCollection return combinedCollection } @@ -278,12 +280,12 @@ class MapDataManager { func getUploadedFiles() -> [MapDataMetadata] { return uploadedFiles } - + /// Toggle the active state of an uploaded file func toggleFileActive(_ fileId: UUID) { if let index = uploadedFiles.firstIndex(where: { $0.id == fileId }) { uploadedFiles[index].isActive.toggle() - + // Save metadata changes do { try saveMetadata() @@ -297,13 +299,13 @@ class MapDataManager { /// Delete uploaded file func deleteFile(_ metadata: MapDataMetadata) async throws { - + guard let fileURL = getUserUploadedDirectory()?.appendingPathComponent(metadata.filename) else { Logger.services.error("🗑️ MapDataManager: Could not construct file URL for: \(metadata.filename, privacy: .public)") throw MapDataError.fileNotFound } - + // Check if file exists before trying to delete if !FileManager.default.fileExists(atPath: fileURL.path) { Logger.services.warning("🗑️ MapDataManager: File does not exist at path: \(fileURL.path, privacy: .public)") @@ -316,10 +318,13 @@ class MapDataManager { throw error } - if let index = uploadedFiles.firstIndex(where: { $0.filename == metadata.filename }) { - uploadedFiles.remove(at: index) - } else { - Logger.services.warning("🗑️ MapDataManager: File not found in uploadedFiles array") + // Update UI-related properties on main thread + await MainActor.run { + if let index = uploadedFiles.firstIndex(where: { $0.filename == metadata.filename }) { + uploadedFiles.remove(at: index) + } else { + Logger.services.warning("🗑️ MapDataManager: File not found in uploadedFiles array") + } } do { @@ -330,13 +335,20 @@ class MapDataManager { } // Clear cache if this was the active file - if activeFeatureCollection != nil { - activeFeatureCollection = nil + await MainActor.run { + if activeFeatureCollection != nil { + activeFeatureCollection = nil + } } - + // Clear GeoJSON overlay manager cache GeoJSONOverlayManager.shared.clearCache() + // Notify UI components that a file was deleted + await MainActor.run { + NotificationCenter.default.post(name: Foundation.Notification.Name.mapDataFileDeleted, object: metadata.id) + } + } @@ -446,4 +458,9 @@ enum MapDataError: Error, LocalizedError { return "Failed to save file." } } +} + +// MARK: - Notification Names +extension Foundation.Notification.Name { + static let mapDataFileDeleted = Foundation.Notification.Name("mapDataFileDeleted") } \ No newline at end of file diff --git a/Meshtastic/Views/Nodes/Helpers/Map/MapSettingsForm.swift b/Meshtastic/Views/Nodes/Helpers/Map/MapSettingsForm.swift index b735f07b..a1f8d36c 100644 --- a/Meshtastic/Views/Nodes/Helpers/Map/MapSettingsForm.swift +++ b/Meshtastic/Views/Nodes/Helpers/Map/MapSettingsForm.swift @@ -18,7 +18,7 @@ struct MapSettingsForm: View { @AppStorage("enableMapWaypoints") private var enableMapWaypoints = true @AppStorage("enableMapShowFavorites") private var enableMapShowFavorites = false @AppStorage("mapOverlaysEnabled") private var mapOverlaysEnabled = false - @State private var uploadedFiles: [MapDataMetadata] = [] + @ObservedObject private var mapDataManager = MapDataManager.shared @Binding var traffic: Bool @Binding var pointsOfInterest: Bool @Binding var mapLayer: MapLayer @@ -142,7 +142,7 @@ struct MapSettingsForm: View { // Show individual file toggles when overlays are enabled if mapOverlaysEnabled && hasUserData { - if !uploadedFiles.isEmpty { + if !mapDataManager.getUploadedFiles().isEmpty { // Data source info HStack { Image(systemName: "info.circle") @@ -155,7 +155,7 @@ struct MapSettingsForm: View { .padding(.leading, 35) // Individual file toggles - ForEach(uploadedFiles) { file in + ForEach(mapDataManager.getUploadedFiles()) { file in Toggle(isOn: Binding( get: { return enabledOverlayConfigs.contains(file.id) @@ -193,7 +193,7 @@ struct MapSettingsForm: View { } // Manage data link - NavigationLink(destination: MapDataUpload()) { + NavigationLink(destination: MapDataFiles()) { HStack { Image(systemName: "folder") .foregroundColor(.accentColor) @@ -221,7 +221,7 @@ struct MapSettingsForm: View { } } else if !hasUserData { // Upload prompt when no data available - NavigationLink(destination: MapDataUpload()) { + NavigationLink(destination: MapDataFiles()) { HStack { Image(systemName: "arrow.up.doc") .foregroundColor(.accentColor) @@ -257,8 +257,8 @@ Spacer() .presentationDragIndicator(.visible) .presentationBackgroundInteraction(.enabled(upThrough: .medium)) .onAppear { - // Load files on appear - uploadedFiles = GeoJSONOverlayManager.shared.getUploadedFilesWithState() + // Initialize map data manager + mapDataManager.initialize() } } diff --git a/Meshtastic/Views/Nodes/MeshMap.swift b/Meshtastic/Views/Nodes/MeshMap.swift index 054dd7fb..9e7f642c 100644 --- a/Meshtastic/Views/Nodes/MeshMap.swift +++ b/Meshtastic/Views/Nodes/MeshMap.swift @@ -220,6 +220,11 @@ struct MeshMap: View { .onDisappear(perform: { UIApplication.shared.isIdleTimerDisabled = false }) + .onReceive(NotificationCenter.default.publisher(for: Foundation.Notification.Name.mapDataFileDeleted)) { notification in + if let deletedFileId = notification.object as? UUID { + enabledOverlayConfigs.remove(deletedFileId) + } + } } // moves the map to a new coordinate diff --git a/Meshtastic/Views/Settings/AppData.swift b/Meshtastic/Views/Settings/AppData.swift index 468a7ef2..4706b62e 100644 --- a/Meshtastic/Views/Settings/AppData.swift +++ b/Meshtastic/Views/Settings/AppData.swift @@ -28,7 +28,7 @@ struct AppData: View { // Map Data Section Section(header: Text("Map Data")) { - NavigationLink(destination: MapDataUpload()) { + NavigationLink(destination: MapDataFiles()) { HStack { Image(systemName: "map") .symbolRenderingMode(.hierarchical) diff --git a/Meshtastic/Views/Settings/MapDataUpload.swift b/Meshtastic/Views/Settings/MapDataFiles.swift similarity index 98% rename from Meshtastic/Views/Settings/MapDataUpload.swift rename to Meshtastic/Views/Settings/MapDataFiles.swift index b6166bc4..7e1bb686 100644 --- a/Meshtastic/Views/Settings/MapDataUpload.swift +++ b/Meshtastic/Views/Settings/MapDataFiles.swift @@ -2,9 +2,10 @@ import SwiftUI import UniformTypeIdentifiers import OSLog -struct MapDataUpload: View { +struct MapDataFiles: View { @Environment(\.managedObjectContext) var context @EnvironmentObject var bleManager: BLEManager + @ObservedObject private var mapDataManager = MapDataManager.shared @State private var isShowingFilePicker = false @State private var isProcessing = false @@ -14,8 +15,6 @@ struct MapDataUpload: View { @State private var showSuccess = false @State private var successMessage = "" - private let mapDataManager = MapDataManager.shared - var body: some View { VStack(spacing: 20) { // Header @@ -251,6 +250,6 @@ struct MapDataFileRow: View { #Preview { NavigationView { - MapDataUpload() + MapDataFiles() } } \ No newline at end of file From d33bbfc04f5abd1c6f254bae2dbb31420c9707c4 Mon Sep 17 00:00:00 2001 From: Jacob Powers Date: Tue, 22 Jul 2025 06:40:43 +0000 Subject: [PATCH 16/19] display points of interest with names --- Meshtastic/Helpers/GeoJSONOverlayConfig.swift | 22 ++++++++++++++----- .../Map/MapContent/MeshMapContent.swift | 10 ++++----- .../Nodes/Helpers/Map/NodeMapSwiftUI.swift | 22 +++++++++---------- 3 files changed, 33 insertions(+), 21 deletions(-) diff --git a/Meshtastic/Helpers/GeoJSONOverlayConfig.swift b/Meshtastic/Helpers/GeoJSONOverlayConfig.swift index ac06b6ed..9082fcfc 100644 --- a/Meshtastic/Helpers/GeoJSONOverlayConfig.swift +++ b/Meshtastic/Helpers/GeoJSONOverlayConfig.swift @@ -19,6 +19,18 @@ struct GeoJSONFeature: Codable { // MARK: - GeoJSON Styling Properties + /// Extract feature name from properties, defaulting to empty string + var name: String { + // Check for "NAME" first (uppercase), then "name" (lowercase) + if case .string(let value) = properties?["NAME"] { + return value + } + if case .string(let value) = properties?["name"] { + return value + } + return "" + } + /// Extract layer metadata from properties var layerId: String? { if case .string(let value) = properties?["layer_id"] { @@ -147,10 +159,10 @@ struct GeoJSONFeature: Codable { /// Convert marker size to point radius var markerRadius: CGFloat { switch markerSize { - case "small": return 8.0 - case "medium": return 12.0 - case "large": return 16.0 - default: return 12.0 + case "small": return 4.0 + case "medium": return 8.0 + case "large": return 12.0 + default: return 4.0 } } } @@ -328,4 +340,4 @@ enum AnyCodableValue: Codable { } return nil } -} \ No newline at end of file +} diff --git a/Meshtastic/Views/Nodes/Helpers/Map/MapContent/MeshMapContent.swift b/Meshtastic/Views/Nodes/Helpers/Map/MapContent/MeshMapContent.swift index cfaa1e89..30651e93 100644 --- a/Meshtastic/Views/Nodes/Helpers/Map/MapContent/MeshMapContent.swift +++ b/Meshtastic/Views/Nodes/Helpers/Map/MapContent/MeshMapContent.swift @@ -247,23 +247,23 @@ struct MeshMapContent: MapContent { var overlayContent: some MapContent { // Get all features but filter by enabled configs let allStyledFeatures = GeoJSONOverlayManager.shared.loadStyledFeaturesForConfigs(enabledOverlayConfigs) - - + + return Group { ForEach(0.. 1 { Button(action: { if isLookingAround { @@ -182,7 +182,7 @@ struct NodeMapSwiftUI: View { .controlSize(.regular) .padding(5) } - + private func updateMapStyle(for layer: MapLayer) { UserDefaults.mapLayer = layer switch layer { @@ -196,7 +196,7 @@ struct NodeMapSwiftUI: View { break } } - + private func handleNodeChange() { isLookingAround = false isShowingAltitude = false @@ -212,7 +212,7 @@ struct NodeMapSwiftUI: View { } } } - + private func handleAppear() { UIApplication.shared.isIdleTimerDisabled = true updateMapStyle(for: selectedMapLayer) From 8a41d11ec114c4ebf7f7b33ccd9ad374440fd8b4 Mon Sep 17 00:00:00 2001 From: Jacob Powers Date: Wed, 23 Jul 2025 20:24:55 +0000 Subject: [PATCH 17/19] fix poi visibility --- .../Views/Nodes/Helpers/Map/MapContent/MeshMapContent.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Meshtastic/Views/Nodes/Helpers/Map/MapContent/MeshMapContent.swift b/Meshtastic/Views/Nodes/Helpers/Map/MapContent/MeshMapContent.swift index 30651e93..8b754fcd 100644 --- a/Meshtastic/Views/Nodes/Helpers/Map/MapContent/MeshMapContent.swift +++ b/Meshtastic/Views/Nodes/Helpers/Map/MapContent/MeshMapContent.swift @@ -263,7 +263,7 @@ struct MeshMapContent: MapContent { .stroke(styledFeature.strokeColor, style: styledFeature.strokeStyle) .frame(width: feature.markerRadius * 2, height: feature.markerRadius * 2) } - .annotationTitles(.visible) + .annotationTitles(.automatic) .annotationSubtitles(.hidden) } } else if geometryType == "LineString" { From 11b95dca4da6becfc7d95e231336f178153227e2 Mon Sep 17 00:00:00 2001 From: Jacob Powers Date: Wed, 23 Jul 2025 20:26:50 +0000 Subject: [PATCH 18/19] swiftlint --- Meshtastic/Extensions/Color+Hex.swift | 2 +- Meshtastic/Extensions/UserDefaults.swift | 4 +- Meshtastic/Helpers/GeoJSONOverlayConfig.swift | 68 +++++++++---------- .../Helpers/GeoJSONOverlayManager.swift | 44 ++++++------ Meshtastic/Helpers/MapDataManager.swift | 5 +- Meshtastic/Helpers/MeshPackets.swift | 2 +- .../Map/MapContent/MeshMapContent.swift | 1 - .../Nodes/Helpers/Map/MapSettingsForm.swift | 6 +- Meshtastic/Views/Nodes/MeshMap.swift | 2 +- .../Settings/Config/SecurityConfig.swift | 2 +- Meshtastic/Views/Settings/MapDataFiles.swift | 3 +- 11 files changed, 67 insertions(+), 72 deletions(-) diff --git a/Meshtastic/Extensions/Color+Hex.swift b/Meshtastic/Extensions/Color+Hex.swift index bae3d9b8..79f0f4b5 100644 --- a/Meshtastic/Extensions/Color+Hex.swift +++ b/Meshtastic/Extensions/Color+Hex.swift @@ -27,4 +27,4 @@ extension Color { opacity: Double(a) / 255 ) } -} \ No newline at end of file +} diff --git a/Meshtastic/Extensions/UserDefaults.swift b/Meshtastic/Extensions/UserDefaults.swift index a8f550e7..03ce9187 100644 --- a/Meshtastic/Extensions/UserDefaults.swift +++ b/Meshtastic/Extensions/UserDefaults.swift @@ -19,11 +19,11 @@ struct UserDefault { var wrappedValue: T { get { - if defaultValue as? any RawRepresentable != nil { + if defaultValue is any RawRepresentable { let storedValue = UserDefaults.standard.object(forKey: key.rawValue) guard let storedValue, - let jsonString = (storedValue as? String != nil) ? "\"\(storedValue)\"" : "\(storedValue)", + let jsonString = (storedValue is String) ? "\"\(storedValue)\"" : "\(storedValue)", let data = jsonString.data(using: .utf8), let value = (try? JSONDecoder().decode(T.self, from: data)) else { return defaultValue } diff --git a/Meshtastic/Helpers/GeoJSONOverlayConfig.swift b/Meshtastic/Helpers/GeoJSONOverlayConfig.swift index 9082fcfc..ddbc30bd 100644 --- a/Meshtastic/Helpers/GeoJSONOverlayConfig.swift +++ b/Meshtastic/Helpers/GeoJSONOverlayConfig.swift @@ -16,9 +16,9 @@ struct GeoJSONFeature: Codable { let id: Int? let geometry: GeoJSONGeometry let properties: [String: AnyCodableValue]? - + // MARK: - GeoJSON Styling Properties - + /// Extract feature name from properties, defaulting to empty string var name: String { // Check for "NAME" first (uppercase), then "name" (lowercase) @@ -30,7 +30,7 @@ struct GeoJSONFeature: Codable { } return "" } - + /// Extract layer metadata from properties var layerId: String? { if case .string(let value) = properties?["layer_id"] { @@ -38,60 +38,60 @@ struct GeoJSONFeature: Codable { } return nil } - + var layerName: String? { if case .string(let value) = properties?["layer_name"] { return value } return nil } - + var layerDescription: String? { if case .string(let value) = properties?["description"] { return value } return nil } - + var isVisible: Bool { if case .bool(let value) = properties?["visible"] { return value } return true // Default to visible } - + // MARK: - Point/Marker Styling - + var markerColor: String? { if case .string(let value) = properties?["marker-color"] { return value } return nil } - + var markerSize: String? { if case .string(let value) = properties?["marker-size"] { return value } return "medium" // Default size } - + var markerSymbol: String? { if case .string(let value) = properties?["marker-symbol"] { return value } return nil } - + // MARK: - Stroke/Line Styling - + var strokeColor: String? { if case .string(let value) = properties?["stroke"] { return value } return nil } - + var strokeWidth: Double { if case .double(let value) = properties?["stroke-width"] { return value @@ -100,7 +100,7 @@ struct GeoJSONFeature: Codable { } return 1.0 // Default width } - + var strokeOpacity: Double { if case .double(let value) = properties?["stroke-opacity"] { return value @@ -109,7 +109,7 @@ struct GeoJSONFeature: Codable { } return 1.0 // Default opacity } - + var lineDashArray: [Double]? { if case .array(let values) = properties?["line-dasharray"] { return values.compactMap { value in @@ -122,16 +122,16 @@ struct GeoJSONFeature: Codable { } return nil } - + // MARK: - Fill Styling - + var fillColor: String? { if case .string(let value) = properties?["fill"] { return value } return nil } - + var fillOpacity: Double { if case .double(let value) = properties?["fill-opacity"] { return value @@ -140,14 +140,14 @@ struct GeoJSONFeature: Codable { } return 0.0 // Default to no fill } - + // MARK: - Computed Rendering Properties - + /// Get effective stroke color (fallback to marker color for points) var effectiveStrokeColor: String { return strokeColor ?? markerColor ?? "#000000" } - + /// Get effective fill color (fallback to stroke color if fill opacity > 0) var effectiveFillColor: String { if fillOpacity > 0 { @@ -155,7 +155,7 @@ struct GeoJSONFeature: Codable { } return "#000000" } - + /// Convert marker size to point radius var markerRadius: CGFloat { switch markerSize { @@ -174,7 +174,7 @@ struct GeoJSONStyledFeature: Identifiable { let id = UUID() let feature: GeoJSONFeature let overlayId: String - + /// Create MKOverlay from this styled feature func createOverlay() -> MKOverlay? { do { @@ -187,14 +187,14 @@ struct GeoJSONStyledFeature: Identifiable { ], "properties": feature.properties?.mapValues { $0.toAnyObject() } ?? [:] ] - + // Creating overlay for geometry - + let geojsonData = try JSONSerialization.data(withJSONObject: featureDict) let mkFeatures = try MKGeoJSONDecoder().decode(geojsonData) - + // MKGeoJSONDecoder processing - + if let mkFeature = mkFeatures.first as? MKGeoJSONFeature { // Processing geometry objects if let geometry = mkFeature.geometry.first as? MKOverlay { @@ -207,7 +207,7 @@ struct GeoJSONStyledFeature: Identifiable { } return nil } - + /// Get stroke style for this feature var strokeStyle: StrokeStyle { let dashArray = feature.lineDashArray @@ -226,12 +226,12 @@ struct GeoJSONStyledFeature: Identifiable { ) } } - + /// Get stroke color with opacity var strokeColor: Color { return Color(hex: feature.effectiveStrokeColor).opacity(feature.strokeOpacity) } - + /// Get fill color with opacity var fillColor: Color { return Color(hex: feature.effectiveFillColor).opacity(feature.fillOpacity) @@ -316,26 +316,26 @@ enum AnyCodableValue: Codable { return dict.mapValues { $0.toAnyObject() } } } - + // Helper to convert Point coordinates to CLLocationCoordinate2D func toCoordinate() -> CLLocationCoordinate2D? { if case .array(let coords) = self, coords.count >= 2 { let lon: Double let lat: Double - + switch coords[0] { case .double(let d): lon = d case .int(let i): lon = Double(i) default: return nil } - + switch coords[1] { case .double(let d): lat = d case .int(let i): lat = Double(i) default: return nil } - + return CLLocationCoordinate2D(latitude: lat, longitude: lon) } return nil diff --git a/Meshtastic/Helpers/GeoJSONOverlayManager.swift b/Meshtastic/Helpers/GeoJSONOverlayManager.swift index 85080d89..a77df91b 100644 --- a/Meshtastic/Helpers/GeoJSONOverlayManager.swift +++ b/Meshtastic/Helpers/GeoJSONOverlayManager.swift @@ -28,24 +28,24 @@ class GeoJSONOverlayManager { func loadStyledFeaturesForConfigs(_ enabledConfigs: Set) -> [GeoJSONStyledFeature] { // Get files that match the enabled configs let enabledFiles = MapDataManager.shared.getUploadedFiles().filter { enabledConfigs.contains($0.id) } - + guard !enabledFiles.isEmpty else { return [] } - + // Load feature collection from enabled files only guard let collection = MapDataManager.shared.loadFeatureCollectionForFiles(enabledFiles) else { return [] } - + var styledFeatures: [GeoJSONStyledFeature] = [] - + for feature in collection.features { // Skip invisible features - guard feature.isVisible else { - continue + guard feature.isVisible else { + continue } - + let layerId = feature.layerId ?? "default" let styledFeature = GeoJSONStyledFeature( feature: feature, @@ -53,7 +53,7 @@ class GeoJSONOverlayManager { ) styledFeatures.append(styledFeature) } - + return styledFeatures } @@ -62,15 +62,15 @@ class GeoJSONOverlayManager { guard let collection = loadFeatureCollection() else { return [] } - + var styledFeatures: [GeoJSONStyledFeature] = [] - + for feature in collection.features { // Skip invisible features - guard feature.isVisible else { - continue + guard feature.isVisible else { + continue } - + let layerId = feature.layerId ?? "default" let styledFeature = GeoJSONStyledFeature( feature: feature, @@ -78,16 +78,16 @@ class GeoJSONOverlayManager { ) styledFeatures.append(styledFeature) } - + return styledFeatures } /// Get all features grouped by layer ID func getFeaturesByLayer() -> [String: [GeoJSONFeature]] { guard let collection = loadFeatureCollection() else { return [:] } - + var featuresByLayer: [String: [GeoJSONFeature]] = [:] - + for feature in collection.features { let layerId = feature.layerId ?? "default" if featuresByLayer[layerId] == nil { @@ -95,7 +95,7 @@ class GeoJSONOverlayManager { } featuresByLayer[layerId]?.append(feature) } - + return featuresByLayer } @@ -115,7 +115,7 @@ class GeoJSONOverlayManager { func hasUserData() -> Bool { return !MapDataManager.shared.getUploadedFiles().isEmpty } - + /// Check if there are any active files func hasActiveData() -> Bool { return MapDataManager.shared.getUploadedFiles().contains { $0.isActive } @@ -131,18 +131,18 @@ class GeoJSONOverlayManager { return NSLocalizedString("No Data", comment: "Data source label when no files are available") } } - + // MARK: - File-based Filtering - + /// Get all uploaded files with their active states for UI display func getUploadedFilesWithState() -> [MapDataMetadata] { return MapDataManager.shared.getUploadedFiles() } - + /// Toggle the active state of an uploaded file func toggleFileActive(_ fileId: UUID) { MapDataManager.shared.toggleFileActive(fileId) // Clear cache to force reload with new file states clearCache() } -} \ No newline at end of file +} diff --git a/Meshtastic/Helpers/MapDataManager.swift b/Meshtastic/Helpers/MapDataManager.swift index 04609e7a..bad659af 100644 --- a/Meshtastic/Helpers/MapDataManager.swift +++ b/Meshtastic/Helpers/MapDataManager.swift @@ -167,7 +167,6 @@ class MapDataManager: ObservableObject { ) } - /// Get overlay count from raw GeoJSON data private func getOverlayCount(from data: Data) throws -> Int { // Parse as raw GeoJSON FeatureCollection @@ -305,7 +304,6 @@ class MapDataManager: ObservableObject { throw MapDataError.fileNotFound } - // Check if file exists before trying to delete if !FileManager.default.fileExists(atPath: fileURL.path) { Logger.services.warning("🗑️ MapDataManager: File does not exist at path: \(fileURL.path, privacy: .public)") @@ -351,7 +349,6 @@ class MapDataManager: ObservableObject { } - // MARK: - Metadata Persistence /// Load metadata from disk @@ -463,4 +460,4 @@ enum MapDataError: Error, LocalizedError { // MARK: - Notification Names extension Foundation.Notification.Name { static let mapDataFileDeleted = Foundation.Notification.Name("mapDataFileDeleted") -} \ No newline at end of file +} diff --git a/Meshtastic/Helpers/MeshPackets.swift b/Meshtastic/Helpers/MeshPackets.swift index 24a577b2..4223bdf2 100644 --- a/Meshtastic/Helpers/MeshPackets.swift +++ b/Meshtastic/Helpers/MeshPackets.swift @@ -1027,7 +1027,7 @@ func textMessageAppPacket( subtitle: "AKA \(newMessage.fromUser?.shortName ?? "?")", content: messageText!, target: "messages", - path: "meshtastic:///messages?userNum=\(newMessage.fromUser?.num ?? 0)&messageId=\(newMessage.isEmoji ? newMessage.replyID : newMessage.messageId)", + path: "meshtastic:///messages?userNum=\(newMessage.fromUser?.num ?? 0)&messageId=\(newMessage.isEmoji ? newMessage.replyID : newMessage.messageId)", messageId: newMessage.messageId, channel: newMessage.channel, userNum: Int64(packet.from), diff --git a/Meshtastic/Views/Nodes/Helpers/Map/MapContent/MeshMapContent.swift b/Meshtastic/Views/Nodes/Helpers/Map/MapContent/MeshMapContent.swift index 8b754fcd..8af740a9 100644 --- a/Meshtastic/Views/Nodes/Helpers/Map/MapContent/MeshMapContent.swift +++ b/Meshtastic/Views/Nodes/Helpers/Map/MapContent/MeshMapContent.swift @@ -248,7 +248,6 @@ struct MeshMapContent: MapContent { // Get all features but filter by enabled configs let allStyledFeatures = GeoJSONOverlayManager.shared.loadStyledFeaturesForConfigs(enabledOverlayConfigs) - return Group { ForEach(0.. Date: Wed, 23 Jul 2025 20:58:46 +0000 Subject: [PATCH 19/19] spaces -> tabs --- Meshtastic/Extensions/Color+Hex.swift | 48 +- Meshtastic/Helpers/GeoJSONOverlayConfig.swift | 554 +++++------ .../Helpers/GeoJSONOverlayManager.swift | 226 ++--- Meshtastic/Helpers/MapDataManager.swift | 874 +++++++++--------- .../Views/Helpers/ConnectedDevice.swift | 140 +-- Meshtastic/Views/Settings/MapDataFiles.swift | 422 ++++----- 6 files changed, 1132 insertions(+), 1132 deletions(-) diff --git a/Meshtastic/Extensions/Color+Hex.swift b/Meshtastic/Extensions/Color+Hex.swift index 79f0f4b5..c1fe99a7 100644 --- a/Meshtastic/Extensions/Color+Hex.swift +++ b/Meshtastic/Extensions/Color+Hex.swift @@ -1,30 +1,30 @@ import SwiftUI extension Color { - /// Initialize a Color from a hex string (e.g., "#FF0000" or "FF0000") - init(hex: String) { - let hex = hex.trimmingCharacters(in: CharacterSet.alphanumerics.inverted) - var int: UInt64 = 0 - Scanner(string: hex).scanHexInt64(&int) + /// Initialize a Color from a hex string (e.g., "#FF0000" or "FF0000") + init(hex: String) { + let hex = hex.trimmingCharacters(in: CharacterSet.alphanumerics.inverted) + var int: UInt64 = 0 + Scanner(string: hex).scanHexInt64(&int) - let a, r, g, b: UInt64 - switch hex.count { - case 3: // RGB (12-bit) - (a, r, g, b) = (255, (int >> 8) * 17, (int >> 4 & 0xF) * 17, (int & 0xF) * 17) - case 6: // RGB (24-bit) - (a, r, g, b) = (255, int >> 16, int >> 8 & 0xFF, int & 0xFF) - case 8: // ARGB (32-bit) - (a, r, g, b) = (int >> 24, int >> 16 & 0xFF, int >> 8 & 0xFF, int & 0xFF) - default: - (a, r, g, b) = (255, 0, 0, 0) - } + let a, r, g, b: UInt64 + switch hex.count { + case 3: // RGB (12-bit) + (a, r, g, b) = (255, (int >> 8) * 17, (int >> 4 & 0xF) * 17, (int & 0xF) * 17) + case 6: // RGB (24-bit) + (a, r, g, b) = (255, int >> 16, int >> 8 & 0xFF, int & 0xFF) + case 8: // ARGB (32-bit) + (a, r, g, b) = (int >> 24, int >> 16 & 0xFF, int >> 8 & 0xFF, int & 0xFF) + default: + (a, r, g, b) = (255, 0, 0, 0) + } - self.init( - .sRGB, - red: Double(r) / 255, - green: Double(g) / 255, - blue: Double(b) / 255, - opacity: Double(a) / 255 - ) - } + self.init( + .sRGB, + red: Double(r) / 255, + green: Double(g) / 255, + blue: Double(b) / 255, + opacity: Double(a) / 255 + ) + } } diff --git a/Meshtastic/Helpers/GeoJSONOverlayConfig.swift b/Meshtastic/Helpers/GeoJSONOverlayConfig.swift index ddbc30bd..8b301a66 100644 --- a/Meshtastic/Helpers/GeoJSONOverlayConfig.swift +++ b/Meshtastic/Helpers/GeoJSONOverlayConfig.swift @@ -7,337 +7,337 @@ import OSLog // MARK: - Raw GeoJSON Support Only struct GeoJSONFeatureCollection: Codable { - let type: String // Always "FeatureCollection" - let features: [GeoJSONFeature] + let type: String // Always "FeatureCollection" + let features: [GeoJSONFeature] } struct GeoJSONFeature: Codable { - let type: String // Always "Feature" - let id: Int? - let geometry: GeoJSONGeometry - let properties: [String: AnyCodableValue]? + let type: String // Always "Feature" + let id: Int? + let geometry: GeoJSONGeometry + let properties: [String: AnyCodableValue]? - // MARK: - GeoJSON Styling Properties + // MARK: - GeoJSON Styling Properties - /// Extract feature name from properties, defaulting to empty string - var name: String { - // Check for "NAME" first (uppercase), then "name" (lowercase) - if case .string(let value) = properties?["NAME"] { - return value - } - if case .string(let value) = properties?["name"] { - return value - } - return "" - } + /// Extract feature name from properties, defaulting to empty string + var name: String { + // Check for "NAME" first (uppercase), then "name" (lowercase) + if case .string(let value) = properties?["NAME"] { + return value + } + if case .string(let value) = properties?["name"] { + return value + } + return "" + } - /// Extract layer metadata from properties - var layerId: String? { - if case .string(let value) = properties?["layer_id"] { - return value - } - return nil - } + /// Extract layer metadata from properties + var layerId: String? { + if case .string(let value) = properties?["layer_id"] { + return value + } + return nil + } - var layerName: String? { - if case .string(let value) = properties?["layer_name"] { - return value - } - return nil - } + var layerName: String? { + if case .string(let value) = properties?["layer_name"] { + return value + } + return nil + } - var layerDescription: String? { - if case .string(let value) = properties?["description"] { - return value - } - return nil - } + var layerDescription: String? { + if case .string(let value) = properties?["description"] { + return value + } + return nil + } - var isVisible: Bool { - if case .bool(let value) = properties?["visible"] { - return value - } - return true // Default to visible - } + var isVisible: Bool { + if case .bool(let value) = properties?["visible"] { + return value + } + return true // Default to visible + } - // MARK: - Point/Marker Styling + // MARK: - Point/Marker Styling - var markerColor: String? { - if case .string(let value) = properties?["marker-color"] { - return value - } - return nil - } + var markerColor: String? { + if case .string(let value) = properties?["marker-color"] { + return value + } + return nil + } - var markerSize: String? { - if case .string(let value) = properties?["marker-size"] { - return value - } - return "medium" // Default size - } + var markerSize: String? { + if case .string(let value) = properties?["marker-size"] { + return value + } + return "medium" // Default size + } - var markerSymbol: String? { - if case .string(let value) = properties?["marker-symbol"] { - return value - } - return nil - } + var markerSymbol: String? { + if case .string(let value) = properties?["marker-symbol"] { + return value + } + return nil + } - // MARK: - Stroke/Line Styling + // MARK: - Stroke/Line Styling - var strokeColor: String? { - if case .string(let value) = properties?["stroke"] { - return value - } - return nil - } + var strokeColor: String? { + if case .string(let value) = properties?["stroke"] { + return value + } + return nil + } - var strokeWidth: Double { - if case .double(let value) = properties?["stroke-width"] { - return value - } else if case .int(let value) = properties?["stroke-width"] { - return Double(value) - } - return 1.0 // Default width - } + var strokeWidth: Double { + if case .double(let value) = properties?["stroke-width"] { + return value + } else if case .int(let value) = properties?["stroke-width"] { + return Double(value) + } + return 1.0 // Default width + } - var strokeOpacity: Double { - if case .double(let value) = properties?["stroke-opacity"] { - return value - } else if case .int(let value) = properties?["stroke-opacity"] { - return Double(value) - } - return 1.0 // Default opacity - } + var strokeOpacity: Double { + if case .double(let value) = properties?["stroke-opacity"] { + return value + } else if case .int(let value) = properties?["stroke-opacity"] { + return Double(value) + } + return 1.0 // Default opacity + } - var lineDashArray: [Double]? { - if case .array(let values) = properties?["line-dasharray"] { - return values.compactMap { value in - switch value { - case .double(let d): return d - case .int(let i): return Double(i) - default: return nil - } - } - } - return nil - } + var lineDashArray: [Double]? { + if case .array(let values) = properties?["line-dasharray"] { + return values.compactMap { value in + switch value { + case .double(let d): return d + case .int(let i): return Double(i) + default: return nil + } + } + } + return nil + } - // MARK: - Fill Styling + // MARK: - Fill Styling - var fillColor: String? { - if case .string(let value) = properties?["fill"] { - return value - } - return nil - } + var fillColor: String? { + if case .string(let value) = properties?["fill"] { + return value + } + return nil + } - var fillOpacity: Double { - if case .double(let value) = properties?["fill-opacity"] { - return value - } else if case .int(let value) = properties?["fill-opacity"] { - return Double(value) - } - return 0.0 // Default to no fill - } + var fillOpacity: Double { + if case .double(let value) = properties?["fill-opacity"] { + return value + } else if case .int(let value) = properties?["fill-opacity"] { + return Double(value) + } + return 0.0 // Default to no fill + } - // MARK: - Computed Rendering Properties + // MARK: - Computed Rendering Properties - /// Get effective stroke color (fallback to marker color for points) - var effectiveStrokeColor: String { - return strokeColor ?? markerColor ?? "#000000" - } + /// Get effective stroke color (fallback to marker color for points) + var effectiveStrokeColor: String { + return strokeColor ?? markerColor ?? "#000000" + } - /// Get effective fill color (fallback to stroke color if fill opacity > 0) - var effectiveFillColor: String { - if fillOpacity > 0 { - return fillColor ?? effectiveStrokeColor - } - return "#000000" - } + /// Get effective fill color (fallback to stroke color if fill opacity > 0) + var effectiveFillColor: String { + if fillOpacity > 0 { + return fillColor ?? effectiveStrokeColor + } + return "#000000" + } - /// Convert marker size to point radius - var markerRadius: CGFloat { - switch markerSize { - case "small": return 4.0 - case "medium": return 8.0 - case "large": return 12.0 - default: return 4.0 - } - } + /// Convert marker size to point radius + var markerRadius: CGFloat { + switch markerSize { + case "small": return 4.0 + case "medium": return 8.0 + case "large": return 12.0 + default: return 4.0 + } + } } // MARK: - Styled Feature Wrapper /// Wrapper for a GeoJSON feature with its styling properties and metadata struct GeoJSONStyledFeature: Identifiable { - let id = UUID() - let feature: GeoJSONFeature - let overlayId: String + let id = UUID() + let feature: GeoJSONFeature + let overlayId: String - /// Create MKOverlay from this styled feature - func createOverlay() -> MKOverlay? { - do { - // Convert feature to standard GeoJSON format for MKGeoJSONDecoder - let featureDict: [String: Any] = [ - "type": feature.type, - "geometry": [ - "type": feature.geometry.type, - "coordinates": feature.geometry.coordinates.toAnyObject() - ], - "properties": feature.properties?.mapValues { $0.toAnyObject() } ?? [:] - ] + /// Create MKOverlay from this styled feature + func createOverlay() -> MKOverlay? { + do { + // Convert feature to standard GeoJSON format for MKGeoJSONDecoder + let featureDict: [String: Any] = [ + "type": feature.type, + "geometry": [ + "type": feature.geometry.type, + "coordinates": feature.geometry.coordinates.toAnyObject() + ], + "properties": feature.properties?.mapValues { $0.toAnyObject() } ?? [:] + ] - // Creating overlay for geometry + // Creating overlay for geometry - let geojsonData = try JSONSerialization.data(withJSONObject: featureDict) - let mkFeatures = try MKGeoJSONDecoder().decode(geojsonData) + let geojsonData = try JSONSerialization.data(withJSONObject: featureDict) + let mkFeatures = try MKGeoJSONDecoder().decode(geojsonData) - // MKGeoJSONDecoder processing + // MKGeoJSONDecoder processing - if let mkFeature = mkFeatures.first as? MKGeoJSONFeature { - // Processing geometry objects - if let geometry = mkFeature.geometry.first as? MKOverlay { - // Successfully created overlay - return geometry - } - } - } catch { - Logger.services.error("🗺️ GeoJSONStyledFeature: Failed to convert feature to overlay: \(error.localizedDescription)") - } - return nil - } + if let mkFeature = mkFeatures.first as? MKGeoJSONFeature { + // Processing geometry objects + if let geometry = mkFeature.geometry.first as? MKOverlay { + // Successfully created overlay + return geometry + } + } + } catch { + Logger.services.error("🗺️ GeoJSONStyledFeature: Failed to convert feature to overlay: \(error.localizedDescription)") + } + return nil + } - /// Get stroke style for this feature - var strokeStyle: StrokeStyle { - let dashArray = feature.lineDashArray - if let dashArray = dashArray, !dashArray.isEmpty { - return StrokeStyle( - lineWidth: feature.strokeWidth, - lineCap: .round, - lineJoin: .round, - dash: dashArray.map { CGFloat($0) } - ) - } else { - return StrokeStyle( - lineWidth: feature.strokeWidth, - lineCap: .round, - lineJoin: .round - ) - } - } + /// Get stroke style for this feature + var strokeStyle: StrokeStyle { + let dashArray = feature.lineDashArray + if let dashArray = dashArray, !dashArray.isEmpty { + return StrokeStyle( + lineWidth: feature.strokeWidth, + lineCap: .round, + lineJoin: .round, + dash: dashArray.map { CGFloat($0) } + ) + } else { + return StrokeStyle( + lineWidth: feature.strokeWidth, + lineCap: .round, + lineJoin: .round + ) + } + } - /// Get stroke color with opacity - var strokeColor: Color { - return Color(hex: feature.effectiveStrokeColor).opacity(feature.strokeOpacity) - } + /// Get stroke color with opacity + var strokeColor: Color { + return Color(hex: feature.effectiveStrokeColor).opacity(feature.strokeOpacity) + } - /// Get fill color with opacity - var fillColor: Color { - return Color(hex: feature.effectiveFillColor).opacity(feature.fillOpacity) - } + /// Get fill color with opacity + var fillColor: Color { + return Color(hex: feature.effectiveFillColor).opacity(feature.fillOpacity) + } } struct GeoJSONGeometry: Codable { - let type: String // "Point", "LineString", "Polygon", etc. - let coordinates: AnyCodableValue // Flexible coordinate structure + let type: String // "Point", "LineString", "Polygon", etc. + let coordinates: AnyCodableValue // Flexible coordinate structure } // MARK: - Flexible JSON Value Type enum AnyCodableValue: Codable { - case string(String) - case int(Int) - case double(Double) - case bool(Bool) - case array([AnyCodableValue]) - case object([String: AnyCodableValue]) - case null + case string(String) + case int(Int) + case double(Double) + case bool(Bool) + case array([AnyCodableValue]) + case object([String: AnyCodableValue]) + case null - init(from decoder: Decoder) throws { - let container = try decoder.singleValueContainer() + init(from decoder: Decoder) throws { + let container = try decoder.singleValueContainer() - if container.decodeNil() { - self = .null - } else if let value = try? container.decode(Bool.self) { - self = .bool(value) - } else if let value = try? container.decode(Int.self) { - self = .int(value) - } else if let value = try? container.decode(Double.self) { - self = .double(value) - } else if let value = try? container.decode(String.self) { - self = .string(value) - } else if let value = try? container.decode([AnyCodableValue].self) { - self = .array(value) - } else if let value = try? container.decode([String: AnyCodableValue].self) { - self = .object(value) - } else { - throw DecodingError.typeMismatch(AnyCodableValue.self, DecodingError.Context(codingPath: decoder.codingPath, debugDescription: "Unable to decode AnyCodableValue")) - } - } + if container.decodeNil() { + self = .null + } else if let value = try? container.decode(Bool.self) { + self = .bool(value) + } else if let value = try? container.decode(Int.self) { + self = .int(value) + } else if let value = try? container.decode(Double.self) { + self = .double(value) + } else if let value = try? container.decode(String.self) { + self = .string(value) + } else if let value = try? container.decode([AnyCodableValue].self) { + self = .array(value) + } else if let value = try? container.decode([String: AnyCodableValue].self) { + self = .object(value) + } else { + throw DecodingError.typeMismatch(AnyCodableValue.self, DecodingError.Context(codingPath: decoder.codingPath, debugDescription: "Unable to decode AnyCodableValue")) + } + } - func encode(to encoder: Encoder) throws { - var container = encoder.singleValueContainer() + func encode(to encoder: Encoder) throws { + var container = encoder.singleValueContainer() - switch self { - case .null: - try container.encodeNil() - case .bool(let value): - try container.encode(value) - case .int(let value): - try container.encode(value) - case .double(let value): - try container.encode(value) - case .string(let value): - try container.encode(value) - case .array(let value): - try container.encode(value) - case .object(let value): - try container.encode(value) - } - } + switch self { + case .null: + try container.encodeNil() + case .bool(let value): + try container.encode(value) + case .int(let value): + try container.encode(value) + case .double(let value): + try container.encode(value) + case .string(let value): + try container.encode(value) + case .array(let value): + try container.encode(value) + case .object(let value): + try container.encode(value) + } + } - // Helper to convert coordinates to the format expected by MKGeoJSONDecoder - func toAnyObject() -> Any { - switch self { - case .null: - return NSNull() - case .bool(let value): - return value - case .int(let value): - return value - case .double(let value): - return value - case .string(let value): - return value - case .array(let values): - return values.map { $0.toAnyObject() } - case .object(let dict): - return dict.mapValues { $0.toAnyObject() } - } - } + // Helper to convert coordinates to the format expected by MKGeoJSONDecoder + func toAnyObject() -> Any { + switch self { + case .null: + return NSNull() + case .bool(let value): + return value + case .int(let value): + return value + case .double(let value): + return value + case .string(let value): + return value + case .array(let values): + return values.map { $0.toAnyObject() } + case .object(let dict): + return dict.mapValues { $0.toAnyObject() } + } + } - // Helper to convert Point coordinates to CLLocationCoordinate2D - func toCoordinate() -> CLLocationCoordinate2D? { - if case .array(let coords) = self, - coords.count >= 2 { - let lon: Double - let lat: Double + // Helper to convert Point coordinates to CLLocationCoordinate2D + func toCoordinate() -> CLLocationCoordinate2D? { + if case .array(let coords) = self, + coords.count >= 2 { + let lon: Double + let lat: Double - switch coords[0] { - case .double(let d): lon = d - case .int(let i): lon = Double(i) - default: return nil - } + switch coords[0] { + case .double(let d): lon = d + case .int(let i): lon = Double(i) + default: return nil + } - switch coords[1] { - case .double(let d): lat = d - case .int(let i): lat = Double(i) - default: return nil - } + switch coords[1] { + case .double(let d): lat = d + case .int(let i): lat = Double(i) + default: return nil + } - return CLLocationCoordinate2D(latitude: lat, longitude: lon) - } - return nil - } + return CLLocationCoordinate2D(latitude: lat, longitude: lon) + } + return nil + } } diff --git a/Meshtastic/Helpers/GeoJSONOverlayManager.swift b/Meshtastic/Helpers/GeoJSONOverlayManager.swift index a77df91b..82801db0 100644 --- a/Meshtastic/Helpers/GeoJSONOverlayManager.swift +++ b/Meshtastic/Helpers/GeoJSONOverlayManager.swift @@ -4,145 +4,145 @@ import OSLog /// Manager for loading and managing raw GeoJSON feature collections with embedded styling class GeoJSONOverlayManager { - static let shared = GeoJSONOverlayManager() - private init() {} + static let shared = GeoJSONOverlayManager() + private init() {} - private var featureCollection: GeoJSONFeatureCollection? + private var featureCollection: GeoJSONFeatureCollection? - /// Load raw GeoJSON feature collection from user uploads - func loadFeatureCollection() -> GeoJSONFeatureCollection? { - if let cached = featureCollection { - return cached - } + /// Load raw GeoJSON feature collection from user uploads + func loadFeatureCollection() -> GeoJSONFeatureCollection? { + if let cached = featureCollection { + return cached + } - // Load user-uploaded feature collection - if let userFeatures = MapDataManager.shared.loadFeatureCollection() { - featureCollection = userFeatures - return userFeatures - } + // Load user-uploaded feature collection + if let userFeatures = MapDataManager.shared.loadFeatureCollection() { + featureCollection = userFeatures + return userFeatures + } - return nil - } + return nil + } - /// Load styled features for specific enabled configs - func loadStyledFeaturesForConfigs(_ enabledConfigs: Set) -> [GeoJSONStyledFeature] { - // Get files that match the enabled configs - let enabledFiles = MapDataManager.shared.getUploadedFiles().filter { enabledConfigs.contains($0.id) } + /// Load styled features for specific enabled configs + func loadStyledFeaturesForConfigs(_ enabledConfigs: Set) -> [GeoJSONStyledFeature] { + // Get files that match the enabled configs + let enabledFiles = MapDataManager.shared.getUploadedFiles().filter { enabledConfigs.contains($0.id) } - guard !enabledFiles.isEmpty else { - return [] - } + guard !enabledFiles.isEmpty else { + return [] + } - // Load feature collection from enabled files only - guard let collection = MapDataManager.shared.loadFeatureCollectionForFiles(enabledFiles) else { - return [] - } + // Load feature collection from enabled files only + guard let collection = MapDataManager.shared.loadFeatureCollectionForFiles(enabledFiles) else { + return [] + } - var styledFeatures: [GeoJSONStyledFeature] = [] + var styledFeatures: [GeoJSONStyledFeature] = [] - for feature in collection.features { - // Skip invisible features - guard feature.isVisible else { - continue - } + for feature in collection.features { + // Skip invisible features + guard feature.isVisible else { + continue + } - let layerId = feature.layerId ?? "default" - let styledFeature = GeoJSONStyledFeature( - feature: feature, - overlayId: layerId - ) - styledFeatures.append(styledFeature) - } + let layerId = feature.layerId ?? "default" + let styledFeature = GeoJSONStyledFeature( + feature: feature, + overlayId: layerId + ) + styledFeatures.append(styledFeature) + } - return styledFeatures - } + return styledFeatures + } - /// Load styled features for direct rendering (legacy method) - func loadStyledFeatures() -> [GeoJSONStyledFeature] { - guard let collection = loadFeatureCollection() else { - return [] - } + /// Load styled features for direct rendering (legacy method) + func loadStyledFeatures() -> [GeoJSONStyledFeature] { + guard let collection = loadFeatureCollection() else { + return [] + } - var styledFeatures: [GeoJSONStyledFeature] = [] + var styledFeatures: [GeoJSONStyledFeature] = [] - for feature in collection.features { - // Skip invisible features - guard feature.isVisible else { - continue - } + for feature in collection.features { + // Skip invisible features + guard feature.isVisible else { + continue + } - let layerId = feature.layerId ?? "default" - let styledFeature = GeoJSONStyledFeature( - feature: feature, - overlayId: layerId - ) - styledFeatures.append(styledFeature) - } + let layerId = feature.layerId ?? "default" + let styledFeature = GeoJSONStyledFeature( + feature: feature, + overlayId: layerId + ) + styledFeatures.append(styledFeature) + } - return styledFeatures - } + return styledFeatures + } - /// Get all features grouped by layer ID - func getFeaturesByLayer() -> [String: [GeoJSONFeature]] { - guard let collection = loadFeatureCollection() else { return [:] } + /// Get all features grouped by layer ID + func getFeaturesByLayer() -> [String: [GeoJSONFeature]] { + guard let collection = loadFeatureCollection() else { return [:] } - var featuresByLayer: [String: [GeoJSONFeature]] = [:] + var featuresByLayer: [String: [GeoJSONFeature]] = [:] - for feature in collection.features { - let layerId = feature.layerId ?? "default" - if featuresByLayer[layerId] == nil { - featuresByLayer[layerId] = [] - } - featuresByLayer[layerId]?.append(feature) - } + for feature in collection.features { + let layerId = feature.layerId ?? "default" + if featuresByLayer[layerId] == nil { + featuresByLayer[layerId] = [] + } + featuresByLayer[layerId]?.append(feature) + } - return featuresByLayer - } + return featuresByLayer + } - /// Get all available layer IDs from features - func getAvailableLayerIds() -> [String] { - guard let collection = loadFeatureCollection() else { return [] } - let layerIds = Set(collection.features.compactMap { $0.layerId ?? "default" }) - return Array(layerIds).sorted() - } + /// Get all available layer IDs from features + func getAvailableLayerIds() -> [String] { + guard let collection = loadFeatureCollection() else { return [] } + let layerIds = Set(collection.features.compactMap { $0.layerId ?? "default" }) + return Array(layerIds).sorted() + } - /// Clear cached data (useful for testing or memory management) - func clearCache() { - featureCollection = nil - } + /// Clear cached data (useful for testing or memory management) + func clearCache() { + featureCollection = nil + } - /// Check if user-uploaded data is available (regardless of active state) - func hasUserData() -> Bool { - return !MapDataManager.shared.getUploadedFiles().isEmpty - } + /// Check if user-uploaded data is available (regardless of active state) + func hasUserData() -> Bool { + return !MapDataManager.shared.getUploadedFiles().isEmpty + } - /// Check if there are any active files - func hasActiveData() -> Bool { - return MapDataManager.shared.getUploadedFiles().contains { $0.isActive } - } + /// Check if there are any active files + func hasActiveData() -> Bool { + return MapDataManager.shared.getUploadedFiles().contains { $0.isActive } + } - /// Get the active data source name - func getActiveDataSource() -> String { - if hasActiveData() { - return NSLocalizedString("User Uploaded", comment: "Data source label for user uploaded files") - } else if hasUserData() { - return NSLocalizedString("Files Available", comment: "Data source label when files exist but none are active") - } else { - return NSLocalizedString("No Data", comment: "Data source label when no files are available") - } - } + /// Get the active data source name + func getActiveDataSource() -> String { + if hasActiveData() { + return NSLocalizedString("User Uploaded", comment: "Data source label for user uploaded files") + } else if hasUserData() { + return NSLocalizedString("Files Available", comment: "Data source label when files exist but none are active") + } else { + return NSLocalizedString("No Data", comment: "Data source label when no files are available") + } + } - // MARK: - File-based Filtering + // MARK: - File-based Filtering - /// Get all uploaded files with their active states for UI display - func getUploadedFilesWithState() -> [MapDataMetadata] { - return MapDataManager.shared.getUploadedFiles() - } + /// Get all uploaded files with their active states for UI display + func getUploadedFilesWithState() -> [MapDataMetadata] { + return MapDataManager.shared.getUploadedFiles() + } - /// Toggle the active state of an uploaded file - func toggleFileActive(_ fileId: UUID) { - MapDataManager.shared.toggleFileActive(fileId) - // Clear cache to force reload with new file states - clearCache() - } + /// Toggle the active state of an uploaded file + func toggleFileActive(_ fileId: UUID) { + MapDataManager.shared.toggleFileActive(fileId) + // Clear cache to force reload with new file states + clearCache() + } } diff --git a/Meshtastic/Helpers/MapDataManager.swift b/Meshtastic/Helpers/MapDataManager.swift index bad659af..42fec2e0 100644 --- a/Meshtastic/Helpers/MapDataManager.swift +++ b/Meshtastic/Helpers/MapDataManager.swift @@ -5,459 +5,459 @@ import Combine /// Manager for handling user-uploaded map data files class MapDataManager: ObservableObject { - static let shared = MapDataManager() - private init() {} - - // MARK: - Constants - private let maxFileSize: Int64 = 10 * 1024 * 1024 // 10MB - private let mapDataDirectory = "MapData" - private let userUploadedDirectory = "user_uploaded" - private let metadataFileName = "upload_history.json" - - // MARK: - Properties - @Published private var uploadedFiles: [MapDataMetadata] = [] - private var activeFeatureCollection: GeoJSONFeatureCollection? - - // MARK: - File Management - - /// Get the base URL for map data storage - private func getMapDataDirectory() -> URL? { - guard let documentsURL = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first else { - Logger.services.error("🗂️ Could not access documents directory") - return nil - } - return documentsURL.appendingPathComponent(mapDataDirectory) - } - - /// Get the URL for user uploaded files - private func getUserUploadedDirectory() -> URL? { - guard let baseURL = getMapDataDirectory() else { return nil } - return baseURL.appendingPathComponent(userUploadedDirectory) - } - - /// Get the URL for metadata file - private func getMetadataFileURL() -> URL? { - guard let baseURL = getMapDataDirectory() else { return nil } - return baseURL.appendingPathComponent(metadataFileName) - } - - /// Create necessary directories - private func createDirectoriesIfNeeded() -> Bool { - guard let userDir = getUserUploadedDirectory() else { return false } - - do { - try FileManager.default.createDirectory(at: userDir, withIntermediateDirectories: true) - return true - } catch { - Logger.services.error("🗂️ Failed to create directories: \(error.localizedDescription, privacy: .public)") - return false - } - } - - // MARK: - File Upload & Processing - - /// Process and store an uploaded file - func processUploadedFile(from sourceURL: URL) async throws -> MapDataMetadata { - - // 1. Start accessing security-scoped resource - let isAccessing = sourceURL.startAccessingSecurityScopedResource() - defer { - if isAccessing { - sourceURL.stopAccessingSecurityScopedResource() - } - } - - // 2. Validate file - try validateFile(at: sourceURL) - - // 2. Create directories if needed - guard createDirectoriesIfNeeded() else { - throw MapDataError.directoryCreationFailed - } - - // 3. Generate destination filename - let timestamp = Date().timeIntervalSince1970 - let originalName = sourceURL.deletingPathExtension().lastPathComponent - let fileExtension = sourceURL.pathExtension - let newFilename = "\(originalName)_\(Int(timestamp)).\(fileExtension)" - - guard let destURL = getUserUploadedDirectory()?.appendingPathComponent(newFilename) else { - throw MapDataError.invalidDestination - } - - // 4. Copy file to app storage - try FileManager.default.copyItem(at: sourceURL, to: destURL) - - // 5. Process and validate content - let metadata = try await processFileContent(at: destURL, originalName: originalName) - - // 6. Save metadata and update UI on main thread - await MainActor.run { - uploadedFiles.append(metadata) - // Clear cached configuration to force reload - activeFeatureCollection = nil - } - try saveMetadata() - - return metadata - } - - /// Validate uploaded file - private func validateFile(at url: URL) throws { - let fileAttributes = try url.resourceValues(forKeys: [.fileSizeKey, .isRegularFileKey]) - - // Check file size - guard let fileSize = fileAttributes.fileSize, fileSize <= maxFileSize else { - throw MapDataError.fileTooLarge - } - - // Check if it's a regular file - guard fileAttributes.isRegularFile == true else { - throw MapDataError.invalidFileType - } - - // Check file extension - let allowedExtensions = ["json", "geojson"] - let fileExtension = url.pathExtension.lowercased() - guard allowedExtensions.contains(fileExtension) else { - throw MapDataError.unsupportedFormat - } - } - - /// Process file content and extract metadata - private func processFileContent(at url: URL, originalName: String) async throws -> MapDataMetadata { - let fileAttributes = try url.resourceValues(forKeys: [.fileSizeKey, .creationDateKey]) - let fileSize = fileAttributes.fileSize ?? 0 - let uploadDate = fileAttributes.creationDate ?? Date() - - // Read and process file content on background queue - let (_, overlayCount) = try await withCheckedThrowingContinuation { continuation in - Task.detached { - do { - let data = try Data(contentsOf: url) - let overlayCount = try self.getOverlayCount(from: data) - continuation.resume(returning: (data, overlayCount)) - } catch { - continuation.resume(throwing: error) - } - } - } - - // TODO: Add proper GeoJSON schema validation here - // - Validate required properties (type, features) - // - Validate geometry types and coordinates - // - Validate feature structure - // - Consider using JSONSchema validation - // - Ensure coordinates are within valid ranges (lat: -90 to 90, lon: -180 to 180) - // - Validate that feature properties follow expected patterns - - // If this is the first file uploaded, make it active by default - let isFirstFile = uploadedFiles.isEmpty - - return MapDataMetadata( - filename: url.lastPathComponent, - originalName: originalName, - uploadDate: uploadDate, - fileSize: Int64(fileSize), - format: url.pathExtension.lowercased(), - license: nil, // Will be extracted from content if available - attribution: nil, // Will be extracted from content if available - overlayCount: overlayCount, - isActive: isFirstFile - ) - } - - /// Get overlay count from raw GeoJSON data - private func getOverlayCount(from data: Data) throws -> Int { - // Parse as raw GeoJSON FeatureCollection - if let json = try JSONSerialization.jsonObject(with: data) as? [String: Any], - let features = json["features"] as? [[String: Any]] { - return features.count - } - throw MapDataError.invalidContent - } - - /// Load feature collection from a single file - private func loadFeatureCollectionFromFile(_ file: MapDataMetadata) throws -> GeoJSONFeatureCollection? { - guard let fileURL = getUserUploadedDirectory()?.appendingPathComponent(file.filename) else { - throw MapDataError.fileNotFound - } - - let data = try Data(contentsOf: fileURL) - return try JSONDecoder().decode(GeoJSONFeatureCollection.self, from: data) - } - - // MARK: - Configuration Loading - - /// Load combined feature collection from specific files - func loadFeatureCollectionForFiles(_ files: [MapDataMetadata]) -> GeoJSONFeatureCollection? { - guard !files.isEmpty else { - return nil - } - - var allFeatures: [GeoJSONFeature] = [] - - for file in files { - do { - if let featureCollection = try loadFeatureCollectionFromFile(file) { - allFeatures.append(contentsOf: featureCollection.features) - } - } catch { - Logger.services.error("📁 MapDataManager: Failed to load feature collection from \(file.filename, privacy: .public): \(error.localizedDescription, privacy: .public)") - continue - } - } - - guard !allFeatures.isEmpty else { - return nil - } - return GeoJSONFeatureCollection(type: "FeatureCollection", features: allFeatures) - } - - /// Load and combine raw GeoJSON feature collections from all active files - func loadFeatureCollection() -> GeoJSONFeatureCollection? { - if let cached = activeFeatureCollection { - return cached - } - - // Find active user files - let activeFiles = uploadedFiles.filter { $0.isActive } - - guard !activeFiles.isEmpty else { - return nil - } - - var allFeatures: [GeoJSONFeature] = [] - - // Load features from all active files - for activeFile in activeFiles { - - guard let fileURL = getUserUploadedDirectory()?.appendingPathComponent(activeFile.filename) else { - Logger.services.error("📁 MapDataManager: Could not construct file URL for: \(activeFile.filename, privacy: .public)") - continue - } - - // Check if file exists before trying to load it - if !FileManager.default.fileExists(atPath: fileURL.path) { - Logger.services.error("📁 MapDataManager: Active file does not exist at path: \(fileURL.path, privacy: .public)") - - // Remove the missing file from our metadata - if let index = uploadedFiles.firstIndex(where: { $0.filename == activeFile.filename }) { - uploadedFiles.remove(at: index) - do { - try saveMetadata() - } catch { - Logger.services.error("📁 MapDataManager: Failed to save cleaned metadata: \(error.localizedDescription, privacy: .public)") - } - } - continue - } - - do { - let data = try Data(contentsOf: fileURL) - let featureCollection = try JSONDecoder().decode(GeoJSONFeatureCollection.self, from: data) - - allFeatures.append(contentsOf: featureCollection.features) - } catch { - Logger.services.error("📁 MapDataManager: Failed to load feature collection from \(activeFile.filename, privacy: .public): \(error.localizedDescription, privacy: .public)") - } - } - - // Create combined feature collection - let combinedCollection = GeoJSONFeatureCollection( - type: "FeatureCollection", - features: allFeatures - ) - - activeFeatureCollection = combinedCollection - return combinedCollection - } - - // MARK: - File Management - - /// Get all uploaded files - func getUploadedFiles() -> [MapDataMetadata] { - return uploadedFiles - } - - /// Toggle the active state of an uploaded file - func toggleFileActive(_ fileId: UUID) { - if let index = uploadedFiles.firstIndex(where: { $0.id == fileId }) { - uploadedFiles[index].isActive.toggle() - - // Save metadata changes - do { - try saveMetadata() - // Clear cached data to force reload - activeFeatureCollection = nil - } catch { - Logger.services.error("🚨 MapDataManager: FAILED to save metadata after toggling file: \(error.localizedDescription)") - } - } - } - - /// Delete uploaded file - func deleteFile(_ metadata: MapDataMetadata) async throws { - - guard let fileURL = getUserUploadedDirectory()?.appendingPathComponent(metadata.filename) else { - Logger.services.error("🗑️ MapDataManager: Could not construct file URL for: \(metadata.filename, privacy: .public)") - throw MapDataError.fileNotFound - } - - // Check if file exists before trying to delete - if !FileManager.default.fileExists(atPath: fileURL.path) { - Logger.services.warning("🗑️ MapDataManager: File does not exist at path: \(fileURL.path, privacy: .public)") - } - - do { - try FileManager.default.removeItem(at: fileURL) - } catch { - Logger.services.error("🗑️ MapDataManager: Failed to remove file: \(error.localizedDescription, privacy: .public)") - throw error - } - - // Update UI-related properties on main thread - await MainActor.run { - if let index = uploadedFiles.firstIndex(where: { $0.filename == metadata.filename }) { - uploadedFiles.remove(at: index) - } else { - Logger.services.warning("🗑️ MapDataManager: File not found in uploadedFiles array") - } - } - - do { - try saveMetadata() - } catch { - Logger.services.error("🗑️ MapDataManager: Failed to save metadata: \(error.localizedDescription, privacy: .public)") - throw error - } - - // Clear cache if this was the active file - await MainActor.run { - if activeFeatureCollection != nil { - activeFeatureCollection = nil - } - } - - // Clear GeoJSON overlay manager cache - GeoJSONOverlayManager.shared.clearCache() - - // Notify UI components that a file was deleted - await MainActor.run { - NotificationCenter.default.post(name: Foundation.Notification.Name.mapDataFileDeleted, object: metadata.id) - } - - } - - // MARK: - Metadata Persistence - - /// Load metadata from disk - func loadMetadata() { - guard let metadataURL = getMetadataFileURL(), - let data = try? Data(contentsOf: metadataURL), - let files = try? JSONDecoder().decode([MapDataMetadata].self, from: data) else { - uploadedFiles = [] - return - } - - uploadedFiles = files - } - - /// Save metadata to disk - private func saveMetadata() throws { - guard let metadataURL = getMetadataFileURL() else { - throw MapDataError.invalidDestination - } - - let data = try JSONEncoder().encode(uploadedFiles) - try data.write(to: metadataURL) - } - - // MARK: - Initialization - - /// Initialize the manager - func initialize() { - loadMetadata() - } + static let shared = MapDataManager() + private init() {} + + // MARK: - Constants + private let maxFileSize: Int64 = 10 * 1024 * 1024 // 10MB + private let mapDataDirectory = "MapData" + private let userUploadedDirectory = "user_uploaded" + private let metadataFileName = "upload_history.json" + + // MARK: - Properties + @Published private var uploadedFiles: [MapDataMetadata] = [] + private var activeFeatureCollection: GeoJSONFeatureCollection? + + // MARK: - File Management + + /// Get the base URL for map data storage + private func getMapDataDirectory() -> URL? { + guard let documentsURL = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first else { + Logger.services.error("🗂️ Could not access documents directory") + return nil + } + return documentsURL.appendingPathComponent(mapDataDirectory) + } + + /// Get the URL for user uploaded files + private func getUserUploadedDirectory() -> URL? { + guard let baseURL = getMapDataDirectory() else { return nil } + return baseURL.appendingPathComponent(userUploadedDirectory) + } + + /// Get the URL for metadata file + private func getMetadataFileURL() -> URL? { + guard let baseURL = getMapDataDirectory() else { return nil } + return baseURL.appendingPathComponent(metadataFileName) + } + + /// Create necessary directories + private func createDirectoriesIfNeeded() -> Bool { + guard let userDir = getUserUploadedDirectory() else { return false } + + do { + try FileManager.default.createDirectory(at: userDir, withIntermediateDirectories: true) + return true + } catch { + Logger.services.error("🗂️ Failed to create directories: \(error.localizedDescription, privacy: .public)") + return false + } + } + + // MARK: - File Upload & Processing + + /// Process and store an uploaded file + func processUploadedFile(from sourceURL: URL) async throws -> MapDataMetadata { + + // 1. Start accessing security-scoped resource + let isAccessing = sourceURL.startAccessingSecurityScopedResource() + defer { + if isAccessing { + sourceURL.stopAccessingSecurityScopedResource() + } + } + + // 2. Validate file + try validateFile(at: sourceURL) + + // 2. Create directories if needed + guard createDirectoriesIfNeeded() else { + throw MapDataError.directoryCreationFailed + } + + // 3. Generate destination filename + let timestamp = Date().timeIntervalSince1970 + let originalName = sourceURL.deletingPathExtension().lastPathComponent + let fileExtension = sourceURL.pathExtension + let newFilename = "\(originalName)_\(Int(timestamp)).\(fileExtension)" + + guard let destURL = getUserUploadedDirectory()?.appendingPathComponent(newFilename) else { + throw MapDataError.invalidDestination + } + + // 4. Copy file to app storage + try FileManager.default.copyItem(at: sourceURL, to: destURL) + + // 5. Process and validate content + let metadata = try await processFileContent(at: destURL, originalName: originalName) + + // 6. Save metadata and update UI on main thread + await MainActor.run { + uploadedFiles.append(metadata) + // Clear cached configuration to force reload + activeFeatureCollection = nil + } + try saveMetadata() + + return metadata + } + + /// Validate uploaded file + private func validateFile(at url: URL) throws { + let fileAttributes = try url.resourceValues(forKeys: [.fileSizeKey, .isRegularFileKey]) + + // Check file size + guard let fileSize = fileAttributes.fileSize, fileSize <= maxFileSize else { + throw MapDataError.fileTooLarge + } + + // Check if it's a regular file + guard fileAttributes.isRegularFile == true else { + throw MapDataError.invalidFileType + } + + // Check file extension + let allowedExtensions = ["json", "geojson"] + let fileExtension = url.pathExtension.lowercased() + guard allowedExtensions.contains(fileExtension) else { + throw MapDataError.unsupportedFormat + } + } + + /// Process file content and extract metadata + private func processFileContent(at url: URL, originalName: String) async throws -> MapDataMetadata { + let fileAttributes = try url.resourceValues(forKeys: [.fileSizeKey, .creationDateKey]) + let fileSize = fileAttributes.fileSize ?? 0 + let uploadDate = fileAttributes.creationDate ?? Date() + + // Read and process file content on background queue + let (_, overlayCount) = try await withCheckedThrowingContinuation { continuation in + Task.detached { + do { + let data = try Data(contentsOf: url) + let overlayCount = try self.getOverlayCount(from: data) + continuation.resume(returning: (data, overlayCount)) + } catch { + continuation.resume(throwing: error) + } + } + } + + // TODO: Add proper GeoJSON schema validation here + // - Validate required properties (type, features) + // - Validate geometry types and coordinates + // - Validate feature structure + // - Consider using JSONSchema validation + // - Ensure coordinates are within valid ranges (lat: -90 to 90, lon: -180 to 180) + // - Validate that feature properties follow expected patterns + + // If this is the first file uploaded, make it active by default + let isFirstFile = uploadedFiles.isEmpty + + return MapDataMetadata( + filename: url.lastPathComponent, + originalName: originalName, + uploadDate: uploadDate, + fileSize: Int64(fileSize), + format: url.pathExtension.lowercased(), + license: nil, // Will be extracted from content if available + attribution: nil, // Will be extracted from content if available + overlayCount: overlayCount, + isActive: isFirstFile + ) + } + + /// Get overlay count from raw GeoJSON data + private func getOverlayCount(from data: Data) throws -> Int { + // Parse as raw GeoJSON FeatureCollection + if let json = try JSONSerialization.jsonObject(with: data) as? [String: Any], + let features = json["features"] as? [[String: Any]] { + return features.count + } + throw MapDataError.invalidContent + } + + /// Load feature collection from a single file + private func loadFeatureCollectionFromFile(_ file: MapDataMetadata) throws -> GeoJSONFeatureCollection? { + guard let fileURL = getUserUploadedDirectory()?.appendingPathComponent(file.filename) else { + throw MapDataError.fileNotFound + } + + let data = try Data(contentsOf: fileURL) + return try JSONDecoder().decode(GeoJSONFeatureCollection.self, from: data) + } + + // MARK: - Configuration Loading + + /// Load combined feature collection from specific files + func loadFeatureCollectionForFiles(_ files: [MapDataMetadata]) -> GeoJSONFeatureCollection? { + guard !files.isEmpty else { + return nil + } + + var allFeatures: [GeoJSONFeature] = [] + + for file in files { + do { + if let featureCollection = try loadFeatureCollectionFromFile(file) { + allFeatures.append(contentsOf: featureCollection.features) + } + } catch { + Logger.services.error("📁 MapDataManager: Failed to load feature collection from \(file.filename, privacy: .public): \(error.localizedDescription, privacy: .public)") + continue + } + } + + guard !allFeatures.isEmpty else { + return nil + } + return GeoJSONFeatureCollection(type: "FeatureCollection", features: allFeatures) + } + + /// Load and combine raw GeoJSON feature collections from all active files + func loadFeatureCollection() -> GeoJSONFeatureCollection? { + if let cached = activeFeatureCollection { + return cached + } + + // Find active user files + let activeFiles = uploadedFiles.filter { $0.isActive } + + guard !activeFiles.isEmpty else { + return nil + } + + var allFeatures: [GeoJSONFeature] = [] + + // Load features from all active files + for activeFile in activeFiles { + + guard let fileURL = getUserUploadedDirectory()?.appendingPathComponent(activeFile.filename) else { + Logger.services.error("📁 MapDataManager: Could not construct file URL for: \(activeFile.filename, privacy: .public)") + continue + } + + // Check if file exists before trying to load it + if !FileManager.default.fileExists(atPath: fileURL.path) { + Logger.services.error("📁 MapDataManager: Active file does not exist at path: \(fileURL.path, privacy: .public)") + + // Remove the missing file from our metadata + if let index = uploadedFiles.firstIndex(where: { $0.filename == activeFile.filename }) { + uploadedFiles.remove(at: index) + do { + try saveMetadata() + } catch { + Logger.services.error("📁 MapDataManager: Failed to save cleaned metadata: \(error.localizedDescription, privacy: .public)") + } + } + continue + } + + do { + let data = try Data(contentsOf: fileURL) + let featureCollection = try JSONDecoder().decode(GeoJSONFeatureCollection.self, from: data) + + allFeatures.append(contentsOf: featureCollection.features) + } catch { + Logger.services.error("📁 MapDataManager: Failed to load feature collection from \(activeFile.filename, privacy: .public): \(error.localizedDescription, privacy: .public)") + } + } + + // Create combined feature collection + let combinedCollection = GeoJSONFeatureCollection( + type: "FeatureCollection", + features: allFeatures + ) + + activeFeatureCollection = combinedCollection + return combinedCollection + } + + // MARK: - File Management + + /// Get all uploaded files + func getUploadedFiles() -> [MapDataMetadata] { + return uploadedFiles + } + + /// Toggle the active state of an uploaded file + func toggleFileActive(_ fileId: UUID) { + if let index = uploadedFiles.firstIndex(where: { $0.id == fileId }) { + uploadedFiles[index].isActive.toggle() + + // Save metadata changes + do { + try saveMetadata() + // Clear cached data to force reload + activeFeatureCollection = nil + } catch { + Logger.services.error("🚨 MapDataManager: FAILED to save metadata after toggling file: \(error.localizedDescription)") + } + } + } + + /// Delete uploaded file + func deleteFile(_ metadata: MapDataMetadata) async throws { + + guard let fileURL = getUserUploadedDirectory()?.appendingPathComponent(metadata.filename) else { + Logger.services.error("🗑️ MapDataManager: Could not construct file URL for: \(metadata.filename, privacy: .public)") + throw MapDataError.fileNotFound + } + + // Check if file exists before trying to delete + if !FileManager.default.fileExists(atPath: fileURL.path) { + Logger.services.warning("🗑️ MapDataManager: File does not exist at path: \(fileURL.path, privacy: .public)") + } + + do { + try FileManager.default.removeItem(at: fileURL) + } catch { + Logger.services.error("🗑️ MapDataManager: Failed to remove file: \(error.localizedDescription, privacy: .public)") + throw error + } + + // Update UI-related properties on main thread + await MainActor.run { + if let index = uploadedFiles.firstIndex(where: { $0.filename == metadata.filename }) { + uploadedFiles.remove(at: index) + } else { + Logger.services.warning("🗑️ MapDataManager: File not found in uploadedFiles array") + } + } + + do { + try saveMetadata() + } catch { + Logger.services.error("🗑️ MapDataManager: Failed to save metadata: \(error.localizedDescription, privacy: .public)") + throw error + } + + // Clear cache if this was the active file + await MainActor.run { + if activeFeatureCollection != nil { + activeFeatureCollection = nil + } + } + + // Clear GeoJSON overlay manager cache + GeoJSONOverlayManager.shared.clearCache() + + // Notify UI components that a file was deleted + await MainActor.run { + NotificationCenter.default.post(name: Foundation.Notification.Name.mapDataFileDeleted, object: metadata.id) + } + + } + + // MARK: - Metadata Persistence + + /// Load metadata from disk + func loadMetadata() { + guard let metadataURL = getMetadataFileURL(), + let data = try? Data(contentsOf: metadataURL), + let files = try? JSONDecoder().decode([MapDataMetadata].self, from: data) else { + uploadedFiles = [] + return + } + + uploadedFiles = files + } + + /// Save metadata to disk + private func saveMetadata() throws { + guard let metadataURL = getMetadataFileURL() else { + throw MapDataError.invalidDestination + } + + let data = try JSONEncoder().encode(uploadedFiles) + try data.write(to: metadataURL) + } + + // MARK: - Initialization + + /// Initialize the manager + func initialize() { + loadMetadata() + } } // MARK: - Supporting Types /// Metadata for uploaded map data files struct MapDataMetadata: Codable, Identifiable { - let id: UUID - let filename: String - let originalName: String - let uploadDate: Date - let fileSize: Int64 - let format: String - let license: String? - let attribution: String? - let overlayCount: Int - var isActive: Bool + let id: UUID + let filename: String + let originalName: String + let uploadDate: Date + let fileSize: Int64 + let format: String + let license: String? + let attribution: String? + let overlayCount: Int + var isActive: Bool - init(filename: String, originalName: String, uploadDate: Date, fileSize: Int64, format: String, license: String?, attribution: String?, overlayCount: Int, isActive: Bool) { - self.id = UUID() - self.filename = filename - self.originalName = originalName - self.uploadDate = uploadDate - self.fileSize = fileSize - self.format = format - self.license = license - self.attribution = attribution - self.overlayCount = overlayCount - self.isActive = isActive - } + init(filename: String, originalName: String, uploadDate: Date, fileSize: Int64, format: String, license: String?, attribution: String?, overlayCount: Int, isActive: Bool) { + self.id = UUID() + self.filename = filename + self.originalName = originalName + self.uploadDate = uploadDate + self.fileSize = fileSize + self.format = format + self.license = license + self.attribution = attribution + self.overlayCount = overlayCount + self.isActive = isActive + } - var fileSizeString: String { - let formatter = ByteCountFormatter() - formatter.allowedUnits = [.useKB, .useMB] - formatter.countStyle = .file - return formatter.string(fromByteCount: fileSize) - } + var fileSizeString: String { + let formatter = ByteCountFormatter() + formatter.allowedUnits = [.useKB, .useMB] + formatter.countStyle = .file + return formatter.string(fromByteCount: fileSize) + } - var uploadDateString: String { - let formatter = DateFormatter() - formatter.dateStyle = .medium - formatter.timeStyle = .short - return formatter.string(from: uploadDate) - } + var uploadDateString: String { + let formatter = DateFormatter() + formatter.dateStyle = .medium + formatter.timeStyle = .short + return formatter.string(from: uploadDate) + } } /// Errors that can occur during map data operations enum MapDataError: Error, LocalizedError { - case fileTooLarge - case invalidFileType - case unsupportedFormat - case invalidContent - case directoryCreationFailed - case invalidDestination - case fileNotFound - case saveFailed + case fileTooLarge + case invalidFileType + case unsupportedFormat + case invalidContent + case directoryCreationFailed + case invalidDestination + case fileNotFound + case saveFailed - var errorDescription: String? { - switch self { - case .fileTooLarge: - return "File is too large. Maximum size is 10MB." - case .invalidFileType: - return "Invalid file type. Please select a regular file." - case .unsupportedFormat: - return "Unsupported file format. Supported formats: JSON, GeoJSON, KML, KMZ, GZ, ZLIB." - case .invalidContent: - return "Invalid file content. Please check the file format." - case .directoryCreationFailed: - return "Failed to create storage directory." - case .invalidDestination: - return "Invalid destination path." - case .fileNotFound: - return "File not found." - case .saveFailed: - return "Failed to save file." - } - } + var errorDescription: String? { + switch self { + case .fileTooLarge: + return "File is too large. Maximum size is 10MB." + case .invalidFileType: + return "Invalid file type. Please select a regular file." + case .unsupportedFormat: + return "Unsupported file format. Supported formats: JSON, GeoJSON, KML, KMZ, GZ, ZLIB." + case .invalidContent: + return "Invalid file content. Please check the file format." + case .directoryCreationFailed: + return "Failed to create storage directory." + case .invalidDestination: + return "Invalid destination path." + case .fileNotFound: + return "File not found." + case .saveFailed: + return "Failed to save file." + } + } } // MARK: - Notification Names extension Foundation.Notification.Name { - static let mapDataFileDeleted = Foundation.Notification.Name("mapDataFileDeleted") + static let mapDataFileDeleted = Foundation.Notification.Name("mapDataFileDeleted") } diff --git a/Meshtastic/Views/Helpers/ConnectedDevice.swift b/Meshtastic/Views/Helpers/ConnectedDevice.swift index a42d3877..98d2d50e 100644 --- a/Meshtastic/Views/Helpers/ConnectedDevice.swift +++ b/Meshtastic/Views/Helpers/ConnectedDevice.swift @@ -6,79 +6,79 @@ A view draws the indicator used in the upper right corner for views using BLE import SwiftUI struct ConnectedDevice: View { - var bluetoothOn: Bool - var deviceConnected: Bool - var name: String + var bluetoothOn: Bool + var deviceConnected: Bool + var name: String - var mqttProxyConnected: Bool = false - var mqttUplinkEnabled: Bool = false - var mqttDownlinkEnabled: Bool = false - var mqttTopic: String = "" - var phoneOnly: Bool = false + var mqttProxyConnected: Bool = false + var mqttUplinkEnabled: Bool = false + var mqttDownlinkEnabled: Bool = false + var mqttTopic: String = "" + var phoneOnly: Bool = false - var body: some View { - HStack { - if (phoneOnly && UIDevice.current.userInterfaceIdiom == .phone) || !phoneOnly { - if bluetoothOn { - if deviceConnected { - // Create an HStack for connected state with proper accessibility - HStack { - if mqttUplinkEnabled || mqttDownlinkEnabled { - MQTTIcon(connected: mqttProxyConnected, uplink: mqttUplinkEnabled, downlink: mqttDownlinkEnabled, topic: mqttTopic) - .accessibilityHidden(true) - } - Image(systemName: "antenna.radiowaves.left.and.right.circle.fill") - .imageScale(.large) - .foregroundColor(.green) - .symbolRenderingMode(.hierarchical) - .accessibilityHidden(true) - Text(name.addingVariationSelectors) - .font(name.isEmoji() ? .title : .callout) - .foregroundColor(.gray) - .accessibilityHidden(true) - } - .accessibilityElement(children: .ignore) - .accessibilityLabel("Connected to Bluetooth device".localized + ", " + name.formatNodeNameForVoiceOver()) - } else { - // Create a container for disconnected state - HStack { - Image(systemName: "antenna.radiowaves.left.and.right.slash") - .imageScale(.medium) - .foregroundColor(.red) - .symbolRenderingMode(.hierarchical) - .accessibilityHidden(true) - } - .accessibilityElement(children: .ignore) - .accessibilityLabel("No Bluetooth device connected".localized) - } - } else { - // Create a container for Bluetooth off state - HStack { - Text("Bluetooth is off".localized) - .font(.subheadline) - .foregroundColor(.red) - .accessibilityHidden(true) - } - .accessibilityElement(children: .ignore) - .accessibilityLabel("Bluetooth is off".localized) - } - } - } - } + var body: some View { + HStack { + if (phoneOnly && UIDevice.current.userInterfaceIdiom == .phone) || !phoneOnly { + if bluetoothOn { + if deviceConnected { + // Create an HStack for connected state with proper accessibility + HStack { + if mqttUplinkEnabled || mqttDownlinkEnabled { + MQTTIcon(connected: mqttProxyConnected, uplink: mqttUplinkEnabled, downlink: mqttDownlinkEnabled, topic: mqttTopic) + .accessibilityHidden(true) + } + Image(systemName: "antenna.radiowaves.left.and.right.circle.fill") + .imageScale(.large) + .foregroundColor(.green) + .symbolRenderingMode(.hierarchical) + .accessibilityHidden(true) + Text(name.addingVariationSelectors) + .font(name.isEmoji() ? .title : .callout) + .foregroundColor(.gray) + .accessibilityHidden(true) + } + .accessibilityElement(children: .ignore) + .accessibilityLabel("Connected to Bluetooth device".localized + ", " + name.formatNodeNameForVoiceOver()) + } else { + // Create a container for disconnected state + HStack { + Image(systemName: "antenna.radiowaves.left.and.right.slash") + .imageScale(.medium) + .foregroundColor(.red) + .symbolRenderingMode(.hierarchical) + .accessibilityHidden(true) + } + .accessibilityElement(children: .ignore) + .accessibilityLabel("No Bluetooth device connected".localized) + } + } else { + // Create a container for Bluetooth off state + HStack { + Text("Bluetooth is off".localized) + .font(.subheadline) + .foregroundColor(.red) + .accessibilityHidden(true) + } + .accessibilityElement(children: .ignore) + .accessibilityLabel("Bluetooth is off".localized) + } + } + } + } } struct ConnectedDevice_Previews: PreviewProvider { - static var previews: some View { - VStack(alignment: .trailing) { - ConnectedDevice(bluetoothOn: true, deviceConnected: true, name: "MEMO", mqttProxyConnected: true) - ConnectedDevice(bluetoothOn: true, deviceConnected: true, name: "MEMO", mqttProxyConnected: false, mqttUplinkEnabled: true, mqttDownlinkEnabled: true) - ConnectedDevice(bluetoothOn: true, deviceConnected: true, name: "MEMO", mqttProxyConnected: true, mqttUplinkEnabled: true, mqttDownlinkEnabled: true, mqttTopic: "msh/US/2/e/#") - ConnectedDevice(bluetoothOn: true, deviceConnected: true, name: "MEMO", mqttProxyConnected: false, mqttUplinkEnabled: true, mqttDownlinkEnabled: false) - ConnectedDevice(bluetoothOn: true, deviceConnected: true, name: "MEMO", mqttProxyConnected: true, mqttUplinkEnabled: true, mqttDownlinkEnabled: false) - ConnectedDevice(bluetoothOn: true, deviceConnected: true, name: "MEMO", mqttProxyConnected: false, mqttUplinkEnabled: false, mqttDownlinkEnabled: true) - ConnectedDevice(bluetoothOn: true, deviceConnected: true, name: "MEMO", mqttProxyConnected: true, mqttUplinkEnabled: false, mqttDownlinkEnabled: true) - ConnectedDevice(bluetoothOn: true, deviceConnected: true, name: "MEMO", mqttProxyConnected: true) - ConnectedDevice(bluetoothOn: true, deviceConnected: false, name: "MEMO", mqttProxyConnected: false) - }.previewLayout(.fixed(width: 150, height: 275)) - } + static var previews: some View { + VStack(alignment: .trailing) { + ConnectedDevice(bluetoothOn: true, deviceConnected: true, name: "MEMO", mqttProxyConnected: true) + ConnectedDevice(bluetoothOn: true, deviceConnected: true, name: "MEMO", mqttProxyConnected: false, mqttUplinkEnabled: true, mqttDownlinkEnabled: true) + ConnectedDevice(bluetoothOn: true, deviceConnected: true, name: "MEMO", mqttProxyConnected: true, mqttUplinkEnabled: true, mqttDownlinkEnabled: true, mqttTopic: "msh/US/2/e/#") + ConnectedDevice(bluetoothOn: true, deviceConnected: true, name: "MEMO", mqttProxyConnected: false, mqttUplinkEnabled: true, mqttDownlinkEnabled: false) + ConnectedDevice(bluetoothOn: true, deviceConnected: true, name: "MEMO", mqttProxyConnected: true, mqttUplinkEnabled: true, mqttDownlinkEnabled: false) + ConnectedDevice(bluetoothOn: true, deviceConnected: true, name: "MEMO", mqttProxyConnected: false, mqttUplinkEnabled: false, mqttDownlinkEnabled: true) + ConnectedDevice(bluetoothOn: true, deviceConnected: true, name: "MEMO", mqttProxyConnected: true, mqttUplinkEnabled: false, mqttDownlinkEnabled: true) + ConnectedDevice(bluetoothOn: true, deviceConnected: true, name: "MEMO", mqttProxyConnected: true) + ConnectedDevice(bluetoothOn: true, deviceConnected: false, name: "MEMO", mqttProxyConnected: false) + }.previewLayout(.fixed(width: 150, height: 275)) + } } diff --git a/Meshtastic/Views/Settings/MapDataFiles.swift b/Meshtastic/Views/Settings/MapDataFiles.swift index 7651aa30..0dbc204d 100644 --- a/Meshtastic/Views/Settings/MapDataFiles.swift +++ b/Meshtastic/Views/Settings/MapDataFiles.swift @@ -3,252 +3,252 @@ import UniformTypeIdentifiers import OSLog struct MapDataFiles: View { - @Environment(\.managedObjectContext) var context - @EnvironmentObject var bleManager: BLEManager - @ObservedObject private var mapDataManager = MapDataManager.shared + @Environment(\.managedObjectContext) var context + @EnvironmentObject var bleManager: BLEManager + @ObservedObject private var mapDataManager = MapDataManager.shared - @State private var isShowingFilePicker = false - @State private var isProcessing = false - @State private var processingProgress: Double = 0.0 - @State private var showError = false - @State private var errorMessage = "" - @State private var showSuccess = false - @State private var successMessage = "" + @State private var isShowingFilePicker = false + @State private var isProcessing = false + @State private var processingProgress: Double = 0.0 + @State private var showError = false + @State private var errorMessage = "" + @State private var showSuccess = false + @State private var successMessage = "" - var body: some View { - VStack(spacing: 20) { - // Header - VStack(alignment: .leading, spacing: 8) { - Text(NSLocalizedString("Upload Map Data", comment: "Title for map data upload screen")) - .font(.title2) - .fontWeight(.bold) + var body: some View { + VStack(spacing: 20) { + // Header + VStack(alignment: .leading, spacing: 8) { + Text(NSLocalizedString("Upload Map Data", comment: "Title for map data upload screen")) + .font(.title2) + .fontWeight(.bold) - Text("Upload GeoJSON files to display custom map overlays. Files are stored locally and can be up to 10MB.") - .font(.caption) - .foregroundColor(.secondary) - } - .frame(maxWidth: .infinity, alignment: .leading) - .padding(.horizontal) + Text("Upload GeoJSON files to display custom map overlays. Files are stored locally and can be up to 10MB.") + .font(.caption) + .foregroundColor(.secondary) + } + .frame(maxWidth: .infinity, alignment: .leading) + .padding(.horizontal) - // Upload Button - Button(action: { - isShowingFilePicker = true - }) { - HStack { - Image(systemName: "doc.badge.plus") - .font(.title2) - Text(NSLocalizedString("Select Map Data File", comment: "Button text for selecting map data file")) - .fontWeight(.medium) - } - .frame(maxWidth: .infinity) - .padding() - .background(Color.accentColor) - .foregroundColor(.white) - .cornerRadius(10) - } - .disabled(isProcessing) - .padding(.horizontal) + // Upload Button + Button(action: { + isShowingFilePicker = true + }) { + HStack { + Image(systemName: "doc.badge.plus") + .font(.title2) + Text(NSLocalizedString("Select Map Data File", comment: "Button text for selecting map data file")) + .fontWeight(.medium) + } + .frame(maxWidth: .infinity) + .padding() + .background(Color.accentColor) + .foregroundColor(.white) + .cornerRadius(10) + } + .disabled(isProcessing) + .padding(.horizontal) - // Processing Indicator - if isProcessing { - VStack(spacing: 12) { - ProgressView(value: processingProgress) - .progressViewStyle(LinearProgressViewStyle()) - .padding(.horizontal) + // Processing Indicator + if isProcessing { + VStack(spacing: 12) { + ProgressView(value: processingProgress) + .progressViewStyle(LinearProgressViewStyle()) + .padding(.horizontal) - Text("Processing file...") - .font(.caption) - .foregroundColor(.secondary) - } - } + Text("Processing file...") + .font(.caption) + .foregroundColor(.secondary) + } + } - // Current Files Section - VStack(alignment: .leading, spacing: 12) { - Text(NSLocalizedString("Uploaded Files", comment: "Section header for uploaded files")) - .font(.headline) - .padding(.horizontal) + // Current Files Section + VStack(alignment: .leading, spacing: 12) { + Text(NSLocalizedString("Uploaded Files", comment: "Section header for uploaded files")) + .font(.headline) + .padding(.horizontal) - let uploadedFiles = mapDataManager.getUploadedFiles() + let uploadedFiles = mapDataManager.getUploadedFiles() - if uploadedFiles.isEmpty { - VStack(spacing: 8) { - Image(systemName: "doc.text") - .font(.title) - .foregroundColor(.secondary) - Text(NSLocalizedString("No files uploaded yet", comment: "Empty state text when no files are uploaded")) - .font(.caption) - .foregroundColor(.secondary) - } - .frame(maxWidth: .infinity) - .padding(.vertical, 40) - } else { - ScrollView { - LazyVStack(spacing: 8) { - ForEach(uploadedFiles) { file in - MapDataFileRow(file: file) { - deleteFile(file) - } - } - } - .padding(.horizontal) - } - } - } + if uploadedFiles.isEmpty { + VStack(spacing: 8) { + Image(systemName: "doc.text") + .font(.title) + .foregroundColor(.secondary) + Text(NSLocalizedString("No files uploaded yet", comment: "Empty state text when no files are uploaded")) + .font(.caption) + .foregroundColor(.secondary) + } + .frame(maxWidth: .infinity) + .padding(.vertical, 40) + } else { + ScrollView { + LazyVStack(spacing: 8) { + ForEach(uploadedFiles) { file in + MapDataFileRow(file: file) { + deleteFile(file) + } + } + } + .padding(.horizontal) + } + } + } - Spacer() - } - .navigationTitle("Map Data") - .navigationBarTitleDisplayMode(.inline) - .fileImporter( - isPresented: $isShowingFilePicker, - allowedContentTypes: [ - UTType.json, - UTType(filenameExtension: "geojson") ?? UTType.json - ], - allowsMultipleSelection: false - ) { result in - handleFileSelection(result) - } - .alert("Upload Error", isPresented: $showError) { - Button("OK") { } - } message: { - Text(errorMessage) - } - .alert("Upload Success", isPresented: $showSuccess) { - Button("OK") { } - } message: { - Text(successMessage) - } - .onAppear { - // Initialize map data manager if needed - mapDataManager.initialize() - } - } + Spacer() + } + .navigationTitle("Map Data") + .navigationBarTitleDisplayMode(.inline) + .fileImporter( + isPresented: $isShowingFilePicker, + allowedContentTypes: [ + UTType.json, + UTType(filenameExtension: "geojson") ?? UTType.json + ], + allowsMultipleSelection: false + ) { result in + handleFileSelection(result) + } + .alert("Upload Error", isPresented: $showError) { + Button("OK") { } + } message: { + Text(errorMessage) + } + .alert("Upload Success", isPresented: $showSuccess) { + Button("OK") { } + } message: { + Text(successMessage) + } + .onAppear { + // Initialize map data manager if needed + mapDataManager.initialize() + } + } - // MARK: - File Handling + // MARK: - File Handling - private func handleFileSelection(_ result: Result<[URL], Error>) { - do { - guard let selectedFile = try result.get().first else { return } + private func handleFileSelection(_ result: Result<[URL], Error>) { + do { + guard let selectedFile = try result.get().first else { return } - // Start processing - isProcessing = true - processingProgress = 0.0 + // Start processing + isProcessing = true + processingProgress = 0.0 - // Process file asynchronously - Task { - do { - // Simulate progress - await simulateProgress() + // Process file asynchronously + Task { + do { + // Simulate progress + await simulateProgress() - let metadata = try await mapDataManager.processUploadedFile(from: selectedFile) + let metadata = try await mapDataManager.processUploadedFile(from: selectedFile) - await MainActor.run { - isProcessing = false - processingProgress = 1.0 + await MainActor.run { + isProcessing = false + processingProgress = 1.0 - successMessage = "Successfully uploaded '\(metadata.originalName)' with \(metadata.overlayCount) overlays" - showSuccess = true - } - } catch { - await MainActor.run { - isProcessing = false - processingProgress = 0.0 + successMessage = "Successfully uploaded '\(metadata.originalName)' with \(metadata.overlayCount) overlays" + showSuccess = true + } + } catch { + await MainActor.run { + isProcessing = false + processingProgress = 0.0 - errorMessage = error.localizedDescription - showError = true - } - } - } - } catch { - errorMessage = "Failed to access file: \(error.localizedDescription)" - showError = true - } - } + errorMessage = error.localizedDescription + showError = true + } + } + } + } catch { + errorMessage = "Failed to access file: \(error.localizedDescription)" + showError = true + } + } - private func simulateProgress() async { - for i in 1...10 { - await MainActor.run { - processingProgress = Double(i) / 10.0 - } - try? await Task.sleep(nanoseconds: 200_000_000) // 0.2 seconds - } - } + private func simulateProgress() async { + for i in 1...10 { + await MainActor.run { + processingProgress = Double(i) / 10.0 + } + try? await Task.sleep(nanoseconds: 200_000_000) // 0.2 seconds + } + } - private func deleteFile(_ file: MapDataMetadata) { - Task { - do { - try await mapDataManager.deleteFile(file) - } catch { - await MainActor.run { - errorMessage = "Failed to delete file: \(error.localizedDescription)" - showError = true - } - } - } - } + private func deleteFile(_ file: MapDataMetadata) { + Task { + do { + try await mapDataManager.deleteFile(file) + } catch { + await MainActor.run { + errorMessage = "Failed to delete file: \(error.localizedDescription)" + showError = true + } + } + } + } } // MARK: - Supporting Views struct MapDataFileRow: View { - let file: MapDataMetadata - let onDelete: () -> Void + let file: MapDataMetadata + let onDelete: () -> Void - var body: some View { - HStack { - VStack(alignment: .leading, spacing: 4) { - HStack { - Text(file.originalName) - .font(.headline) - .lineLimit(1) + var body: some View { + HStack { + VStack(alignment: .leading, spacing: 4) { + HStack { + Text(file.originalName) + .font(.headline) + .lineLimit(1) - Spacer() - } + Spacer() + } - HStack { - Text(file.format.uppercased()) - .font(.caption) - .padding(.horizontal, 8) - .padding(.vertical, 2) - .background(Color.secondary.opacity(0.2)) - .cornerRadius(4) + HStack { + Text(file.format.uppercased()) + .font(.caption) + .padding(.horizontal, 8) + .padding(.vertical, 2) + .background(Color.secondary.opacity(0.2)) + .cornerRadius(4) - Text(file.fileSizeString) - .font(.caption) - .foregroundColor(.secondary) + Text(file.fileSizeString) + .font(.caption) + .foregroundColor(.secondary) - Text("•") - .font(.caption) - .foregroundColor(.secondary) + Text("•") + .font(.caption) + .foregroundColor(.secondary) - Text("\(file.overlayCount) overlays") - .font(.caption) - .foregroundColor(.secondary) + Text("\(file.overlayCount) overlays") + .font(.caption) + .foregroundColor(.secondary) - Spacer() + Spacer() - Text(file.uploadDateString) - .font(.caption) - .foregroundColor(.secondary) - } - } + Text(file.uploadDateString) + .font(.caption) + .foregroundColor(.secondary) + } + } - Button(action: onDelete) { - Image(systemName: "trash") - .foregroundColor(.red) - } - .buttonStyle(BorderlessButtonStyle()) - } - .padding() - .background(Color(.systemBackground)) - .cornerRadius(8) - .shadow(color: .black.opacity(0.1), radius: 2, x: 0, y: 1) - } + Button(action: onDelete) { + Image(systemName: "trash") + .foregroundColor(.red) + } + .buttonStyle(BorderlessButtonStyle()) + } + .padding() + .background(Color(.systemBackground)) + .cornerRadius(8) + .shadow(color: .black.opacity(0.1), radius: 2, x: 0, y: 1) + } } #Preview { - NavigationView { - MapDataFiles() - } + NavigationView { + MapDataFiles() + } }