From c1aad9d008b9508a3b852e68f205c0529c9ff299 Mon Sep 17 00:00:00 2001 From: Jerrad Thramer Date: Thu, 26 Sep 2019 18:05:27 -0600 Subject: [PATCH 01/89] Initial work, replacing enums and the like --- Directions Example/AppDelegate.h | 7 - Directions Example/AppDelegate.m | 14 - Directions Example/Info.plist | 4 +- Directions Example/ViewController.h | 5 - Directions Example/ViewController.m | 75 ----- Directions Example/main.m | 9 - MapboxDirections.xcodeproj/project.pbxproj | 306 ++++-------------- .../xcschemes/Example (Objective-C).xcscheme | 101 ------ ...mple (Swift).xcscheme => Example.xcscheme} | 34 +- Package.swift | 3 - README.md | 177 +--------- Sources/CMapboxDirections/MBRouteOptions.m | 11 - .../include/CMapboxDirections.h | 4 - .../CMapboxDirections/include/MBAttribute.h | 38 --- .../include/MBLaneIndication.h | 35 -- .../CMapboxDirections/include/MBRoadClasses.h | 40 --- .../include/MBRouteOptions.h | 58 ---- .../MapboxDirections/AttributeOptions.swift | 88 +++++ .../DirectionsProfileIdentifier.swift | 67 ++++ Sources/MapboxDirections/MBAttribute.swift | 50 --- .../MapboxDirections/MBLaneIndication.swift | 35 +- Sources/MapboxDirections/MBRoadClasses.swift | 60 ---- Sources/MapboxDirections/MapboxDirections.h | 4 - .../Match/MBMatchOptions.swift | 10 +- Sources/MapboxDirections/RoadClasses.swift | 105 ++++++ Tests/objc/BridgingTests.m | 83 ----- 26 files changed, 375 insertions(+), 1048 deletions(-) delete mode 100644 Directions Example/AppDelegate.h delete mode 100644 Directions Example/AppDelegate.m delete mode 100644 Directions Example/ViewController.h delete mode 100644 Directions Example/ViewController.m delete mode 100644 Directions Example/main.m delete mode 100644 MapboxDirections.xcodeproj/xcshareddata/xcschemes/Example (Objective-C).xcscheme rename MapboxDirections.xcodeproj/xcshareddata/xcschemes/{Example (Swift).xcscheme => Example.xcscheme} (87%) delete mode 100644 Sources/CMapboxDirections/MBRouteOptions.m delete mode 100644 Sources/CMapboxDirections/include/CMapboxDirections.h delete mode 100644 Sources/CMapboxDirections/include/MBAttribute.h delete mode 100644 Sources/CMapboxDirections/include/MBLaneIndication.h delete mode 100644 Sources/CMapboxDirections/include/MBRoadClasses.h delete mode 100644 Sources/CMapboxDirections/include/MBRouteOptions.h create mode 100644 Sources/MapboxDirections/AttributeOptions.swift create mode 100644 Sources/MapboxDirections/DirectionsProfileIdentifier.swift delete mode 100644 Sources/MapboxDirections/MBAttribute.swift delete mode 100644 Sources/MapboxDirections/MBRoadClasses.swift create mode 100644 Sources/MapboxDirections/RoadClasses.swift delete mode 100644 Tests/objc/BridgingTests.m diff --git a/Directions Example/AppDelegate.h b/Directions Example/AppDelegate.h deleted file mode 100644 index adf30740d..000000000 --- a/Directions Example/AppDelegate.h +++ /dev/null @@ -1,7 +0,0 @@ -@import UIKit; - -@interface AppDelegate : UIResponder - -@property (strong, nonatomic) UIWindow *window; - -@end diff --git a/Directions Example/AppDelegate.m b/Directions Example/AppDelegate.m deleted file mode 100644 index bdb658af7..000000000 --- a/Directions Example/AppDelegate.m +++ /dev/null @@ -1,14 +0,0 @@ -#import "AppDelegate.h" -#import "ViewController.h" - -@implementation AppDelegate - -- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { - self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; - self.window.rootViewController = [[ViewController alloc] initWithNibName:nil bundle:nil]; - [self.window makeKeyAndVisible]; - - return YES; -} - -@end diff --git a/Directions Example/Info.plist b/Directions Example/Info.plist index 5c98453ab..ed09d0841 100644 --- a/Directions Example/Info.plist +++ b/Directions Example/Info.plist @@ -22,6 +22,8 @@ 44 LSRequiresIPhoneOS + NSLocationWhenInUseUsageDescription + Use the user location to fetch a route from their current position. UILaunchStoryboardName Launch Screen UIRequiredDeviceCapabilities @@ -41,7 +43,5 @@ UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight - NSLocationWhenInUseUsageDescription - Use the user location to fetch a route from their current position. diff --git a/Directions Example/ViewController.h b/Directions Example/ViewController.h deleted file mode 100644 index 29e7ff1c8..000000000 --- a/Directions Example/ViewController.h +++ /dev/null @@ -1,5 +0,0 @@ -@import UIKit; - -@interface ViewController : UIViewController - -@end diff --git a/Directions Example/ViewController.m b/Directions Example/ViewController.m deleted file mode 100644 index 9a6950fa4..000000000 --- a/Directions Example/ViewController.m +++ /dev/null @@ -1,75 +0,0 @@ -@import Mapbox; -@import MapboxDirections; - -#import "ViewController.h" - -@interface ViewController () - -@property (nonatomic) MGLMapView *mapView; - -@end - -@implementation ViewController - -- (void)viewDidLoad { - [super viewDidLoad]; - - self.mapView = [[MGLMapView alloc] initWithFrame:self.view.bounds]; - self.mapView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight; - [self.view addSubview:self.mapView]; -} - -- (void)viewDidAppear:(BOOL)animated { - [super viewDidAppear:animated]; - - NSArray *waypoints = @[ - [[MBWaypoint alloc] initWithCoordinate:CLLocationCoordinate2DMake(38.9131752, -77.0324047) coordinateAccuracy:-1 name:@"Mapbox"], - [[MBWaypoint alloc] initWithCoordinate:CLLocationCoordinate2DMake(38.8977, -77.0365) coordinateAccuracy:-1 name:@"White House"], - ]; - MBRouteOptions *options = [[MBRouteOptions alloc] initWithWaypoints:waypoints profileIdentifier:nil]; - options.includesSteps = YES; - - [[MBDirections sharedDirections] calculateDirectionsWithOptions:options completionHandler:^(NSArray * _Nullable waypoints, NSArray * _Nullable routes, NSError * _Nullable error) { - if (error) { - NSLog(@"Error calculating directions: %@", error); - return; - } - - MBRoute *route = routes.firstObject; - MBRouteLeg *leg = route.legs.firstObject; - if (leg) { - NSLog(@"Route via %@:", leg); - - NSLengthFormatter *distanceFormatter = [[NSLengthFormatter alloc] init]; - NSString *formattedDistance = [distanceFormatter stringFromMeters:leg.distance]; - - NSDateComponentsFormatter *travelTimeFormatter = [[NSDateComponentsFormatter alloc] init]; - travelTimeFormatter.unitsStyle = NSDateComponentsFormatterUnitsStyleShort; - NSString *formattedTravelTime = [travelTimeFormatter stringFromTimeInterval:route.expectedTravelTime]; - - NSLog(@"Distance: %@; ETA: %@", formattedDistance, formattedTravelTime); - - for (MBRouteStep *step in leg.steps) { - NSLog(@"%@ [%@ %@]", step.instructions, MBStringFromManeuverType(step.maneuverType), MBStringFromManeuverDirection(step.maneuverDirection)); - NSString *formattedDistance = [distanceFormatter stringFromMeters:step.distance]; - NSLog(@"— %@ for %@ —", MBStringFromTransportType(step.transportType), formattedDistance); - } - - if (route.coordinateCount) { - // Convert the route’s coordinates into a polyline. - CLLocationCoordinate2D *routeCoordinates = malloc(route.coordinateCount * sizeof(CLLocationCoordinate2D)); - [route getCoordinates:routeCoordinates]; - MGLPolyline *routeLine = [MGLPolyline polylineWithCoordinates:routeCoordinates count:route.coordinateCount]; - - // Add the polyline to the map and fit the viewport to the polyline. - [self.mapView addAnnotation:routeLine]; - [self.mapView setVisibleCoordinates:routeCoordinates count:route.coordinateCount edgePadding:UIEdgeInsetsZero animated:YES]; - - // Make sure to free this array to avoid leaking memory. - free(routeCoordinates); - } - } - }]; -} - -@end diff --git a/Directions Example/main.m b/Directions Example/main.m deleted file mode 100644 index b86a93b1f..000000000 --- a/Directions Example/main.m +++ /dev/null @@ -1,9 +0,0 @@ -@import UIKit; - -#import "AppDelegate.h" - -int main(int argc, char * argv[]) { - @autoreleasepool { - return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class])); - } -} diff --git a/MapboxDirections.xcodeproj/project.pbxproj b/MapboxDirections.xcodeproj/project.pbxproj index fb0680dd9..3ef4a066d 100644 --- a/MapboxDirections.xcodeproj/project.pbxproj +++ b/MapboxDirections.xcodeproj/project.pbxproj @@ -7,37 +7,10 @@ objects = { /* Begin PBXBuildFile section */ - 3556CE9D22649CF3009397B5 /* BridgingTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 3556CE9C22649CF3009397B5 /* BridgingTests.m */; }; - 3556CE9E22649CF3009397B5 /* BridgingTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 3556CE9C22649CF3009397B5 /* BridgingTests.m */; }; - 3556CE9F22649CF3009397B5 /* BridgingTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 3556CE9C22649CF3009397B5 /* BridgingTests.m */; }; - 3563928722AAA0AB004A377E /* CMapboxDirections.h in Headers */ = {isa = PBXBuildFile; fileRef = 3563928622AAA0AB004A377E /* CMapboxDirections.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 3563928822AAA0AB004A377E /* CMapboxDirections.h in Headers */ = {isa = PBXBuildFile; fileRef = 3563928622AAA0AB004A377E /* CMapboxDirections.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 3563928922AAA0AB004A377E /* CMapboxDirections.h in Headers */ = {isa = PBXBuildFile; fileRef = 3563928622AAA0AB004A377E /* CMapboxDirections.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 3563928A22AAA0AB004A377E /* CMapboxDirections.h in Headers */ = {isa = PBXBuildFile; fileRef = 3563928622AAA0AB004A377E /* CMapboxDirections.h */; settings = {ATTRIBUTES = (Public, ); }; }; 35828C9E217A003F00ED546E /* OfflineDirections.swift in Sources */ = {isa = PBXBuildFile; fileRef = 35828C9D217A003F00ED546E /* OfflineDirections.swift */; }; 35828C9F217A003F00ED546E /* OfflineDirections.swift in Sources */ = {isa = PBXBuildFile; fileRef = 35828C9D217A003F00ED546E /* OfflineDirections.swift */; }; 35828CA0217A003F00ED546E /* OfflineDirections.swift in Sources */ = {isa = PBXBuildFile; fileRef = 35828C9D217A003F00ED546E /* OfflineDirections.swift */; }; 35828CA1217A003F00ED546E /* OfflineDirections.swift in Sources */ = {isa = PBXBuildFile; fileRef = 35828C9D217A003F00ED546E /* OfflineDirections.swift */; }; - 35C0D78F22563B2B005E05A5 /* MBRoadClasses.h in Headers */ = {isa = PBXBuildFile; fileRef = 35C0D78A22563B2A005E05A5 /* MBRoadClasses.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 35C0D79022563B2B005E05A5 /* MBRoadClasses.h in Headers */ = {isa = PBXBuildFile; fileRef = 35C0D78A22563B2A005E05A5 /* MBRoadClasses.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 35C0D79122563B2B005E05A5 /* MBRoadClasses.h in Headers */ = {isa = PBXBuildFile; fileRef = 35C0D78A22563B2A005E05A5 /* MBRoadClasses.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 35C0D79222563B2B005E05A5 /* MBRoadClasses.h in Headers */ = {isa = PBXBuildFile; fileRef = 35C0D78A22563B2A005E05A5 /* MBRoadClasses.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 35C0D79322563B2B005E05A5 /* MBRouteOptions.h in Headers */ = {isa = PBXBuildFile; fileRef = 35C0D78B22563B2A005E05A5 /* MBRouteOptions.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 35C0D79422563B2B005E05A5 /* MBRouteOptions.h in Headers */ = {isa = PBXBuildFile; fileRef = 35C0D78B22563B2A005E05A5 /* MBRouteOptions.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 35C0D79522563B2B005E05A5 /* MBRouteOptions.h in Headers */ = {isa = PBXBuildFile; fileRef = 35C0D78B22563B2A005E05A5 /* MBRouteOptions.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 35C0D79622563B2B005E05A5 /* MBRouteOptions.h in Headers */ = {isa = PBXBuildFile; fileRef = 35C0D78B22563B2A005E05A5 /* MBRouteOptions.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 35C0D79722563B2B005E05A5 /* MBLaneIndication.h in Headers */ = {isa = PBXBuildFile; fileRef = 35C0D78C22563B2B005E05A5 /* MBLaneIndication.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 35C0D79822563B2B005E05A5 /* MBLaneIndication.h in Headers */ = {isa = PBXBuildFile; fileRef = 35C0D78C22563B2B005E05A5 /* MBLaneIndication.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 35C0D79922563B2B005E05A5 /* MBLaneIndication.h in Headers */ = {isa = PBXBuildFile; fileRef = 35C0D78C22563B2B005E05A5 /* MBLaneIndication.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 35C0D79A22563B2B005E05A5 /* MBLaneIndication.h in Headers */ = {isa = PBXBuildFile; fileRef = 35C0D78C22563B2B005E05A5 /* MBLaneIndication.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 35C0D79B22563B2B005E05A5 /* MBRouteOptions.m in Sources */ = {isa = PBXBuildFile; fileRef = 35C0D78D22563B2B005E05A5 /* MBRouteOptions.m */; }; - 35C0D79C22563B2B005E05A5 /* MBRouteOptions.m in Sources */ = {isa = PBXBuildFile; fileRef = 35C0D78D22563B2B005E05A5 /* MBRouteOptions.m */; }; - 35C0D79D22563B2B005E05A5 /* MBRouteOptions.m in Sources */ = {isa = PBXBuildFile; fileRef = 35C0D78D22563B2B005E05A5 /* MBRouteOptions.m */; }; - 35C0D79E22563B2B005E05A5 /* MBRouteOptions.m in Sources */ = {isa = PBXBuildFile; fileRef = 35C0D78D22563B2B005E05A5 /* MBRouteOptions.m */; }; - 35C0D79F22563B2B005E05A5 /* MBAttribute.h in Headers */ = {isa = PBXBuildFile; fileRef = 35C0D78E22563B2B005E05A5 /* MBAttribute.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 35C0D7A022563B2B005E05A5 /* MBAttribute.h in Headers */ = {isa = PBXBuildFile; fileRef = 35C0D78E22563B2B005E05A5 /* MBAttribute.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 35C0D7A122563B2B005E05A5 /* MBAttribute.h in Headers */ = {isa = PBXBuildFile; fileRef = 35C0D78E22563B2B005E05A5 /* MBAttribute.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 35C0D7A222563B2B005E05A5 /* MBAttribute.h in Headers */ = {isa = PBXBuildFile; fileRef = 35C0D78E22563B2B005E05A5 /* MBAttribute.h */; settings = {ATTRIBUTES = (Public, ); }; }; 35CC310B2285739700EA1966 /* WalkingOptionsTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 35CC310A2285739700EA1966 /* WalkingOptionsTests.swift */; }; 35CC310C2285739700EA1966 /* WalkingOptionsTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 35CC310A2285739700EA1966 /* WalkingOptionsTests.swift */; }; 35CC310D2285739700EA1966 /* WalkingOptionsTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 35CC310A2285739700EA1966 /* WalkingOptionsTests.swift */; }; @@ -66,6 +39,10 @@ 35EFD00C207DFACA00BF3873 /* MBVisualInstruction.swift in Sources */ = {isa = PBXBuildFile; fileRef = 35EFD00A207DFACA00BF3873 /* MBVisualInstruction.swift */; }; 35EFD00D207DFACA00BF3873 /* MBVisualInstruction.swift in Sources */ = {isa = PBXBuildFile; fileRef = 35EFD00A207DFACA00BF3873 /* MBVisualInstruction.swift */; }; 35EFD00E207DFACA00BF3873 /* MBVisualInstruction.swift in Sources */ = {isa = PBXBuildFile; fileRef = 35EFD00A207DFACA00BF3873 /* MBVisualInstruction.swift */; }; + 438BFEC2233D854D00457294 /* DirectionsProfileIdentifier.swift in Sources */ = {isa = PBXBuildFile; fileRef = 438BFEC1233D854D00457294 /* DirectionsProfileIdentifier.swift */; }; + 438BFEC3233D854D00457294 /* DirectionsProfileIdentifier.swift in Sources */ = {isa = PBXBuildFile; fileRef = 438BFEC1233D854D00457294 /* DirectionsProfileIdentifier.swift */; }; + 438BFEC4233D854D00457294 /* DirectionsProfileIdentifier.swift in Sources */ = {isa = PBXBuildFile; fileRef = 438BFEC1233D854D00457294 /* DirectionsProfileIdentifier.swift */; }; + 438BFEC5233D854D00457294 /* DirectionsProfileIdentifier.swift in Sources */ = {isa = PBXBuildFile; fileRef = 438BFEC1233D854D00457294 /* DirectionsProfileIdentifier.swift */; }; 8D381B611FD9F5B1008D5A58 /* noDestinationName.json in Resources */ = {isa = PBXBuildFile; fileRef = 8D381B601FD9F5B1008D5A58 /* noDestinationName.json */; }; 8D381B631FDB01D1008D5A58 /* apiDestinationName.json in Resources */ = {isa = PBXBuildFile; fileRef = 8D381B621FDB01D1008D5A58 /* apiDestinationName.json */; }; 8D381B641FDB0898008D5A58 /* noDestinationName.json in Resources */ = {isa = PBXBuildFile; fileRef = 8D381B601FD9F5B1008D5A58 /* noDestinationName.json */; }; @@ -94,7 +71,7 @@ AEDC212120B6125C0052DED8 /* MBComponentRepresentable.swift in Sources */ = {isa = PBXBuildFile; fileRef = AEDC211C20B6104A0052DED8 /* MBComponentRepresentable.swift */; }; AEDC212220B6125D0052DED8 /* MBComponentRepresentable.swift in Sources */ = {isa = PBXBuildFile; fileRef = AEDC211C20B6104A0052DED8 /* MBComponentRepresentable.swift */; }; AEDC212320B6125E0052DED8 /* MBComponentRepresentable.swift in Sources */ = {isa = PBXBuildFile; fileRef = AEDC211C20B6104A0052DED8 /* MBComponentRepresentable.swift */; }; - C51538CC1E807FF00093FF3E /* MBAttribute.swift in Sources */ = {isa = PBXBuildFile; fileRef = C51538CB1E807FF00093FF3E /* MBAttribute.swift */; }; + C51538CC1E807FF00093FF3E /* AttributeOptions.swift in Sources */ = {isa = PBXBuildFile; fileRef = C51538CB1E807FF00093FF3E /* AttributeOptions.swift */; }; C5247D711E818A24004B6154 /* AnnotationTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = C5247D701E818A24004B6154 /* AnnotationTests.swift */; }; C52552B91FA15D5900B1545C /* MBVisualInstructionBanner.swift in Sources */ = {isa = PBXBuildFile; fileRef = C52552B81FA15D5900B1545C /* MBVisualInstructionBanner.swift */; }; C52552BA1FA15D5E00B1545C /* MBVisualInstructionBanner.swift in Sources */ = {isa = PBXBuildFile; fileRef = C52552B81FA15D5900B1545C /* MBVisualInstructionBanner.swift */; }; @@ -108,9 +85,9 @@ C52CE3901F6AF63D0069963D /* MBSpokenInstruction.swift in Sources */ = {isa = PBXBuildFile; fileRef = C55FB44A1F6AEBF6006BD1E9 /* MBSpokenInstruction.swift */; }; C52CE3911F6AF63E0069963D /* MBSpokenInstruction.swift in Sources */ = {isa = PBXBuildFile; fileRef = C55FB44A1F6AEBF6006BD1E9 /* MBSpokenInstruction.swift */; }; C52CE3931F6AF6E70069963D /* IntructionsTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = C52CE3921F6AF6E70069963D /* IntructionsTests.swift */; }; - C53A02261E92C26E009837BD /* MBAttribute.swift in Sources */ = {isa = PBXBuildFile; fileRef = C51538CB1E807FF00093FF3E /* MBAttribute.swift */; }; - C53A02271E92C26F009837BD /* MBAttribute.swift in Sources */ = {isa = PBXBuildFile; fileRef = C51538CB1E807FF00093FF3E /* MBAttribute.swift */; }; - C53A02281E92C271009837BD /* MBAttribute.swift in Sources */ = {isa = PBXBuildFile; fileRef = C51538CB1E807FF00093FF3E /* MBAttribute.swift */; }; + C53A02261E92C26E009837BD /* AttributeOptions.swift in Sources */ = {isa = PBXBuildFile; fileRef = C51538CB1E807FF00093FF3E /* AttributeOptions.swift */; }; + C53A02271E92C26F009837BD /* AttributeOptions.swift in Sources */ = {isa = PBXBuildFile; fileRef = C51538CB1E807FF00093FF3E /* AttributeOptions.swift */; }; + C53A02281E92C271009837BD /* AttributeOptions.swift in Sources */ = {isa = PBXBuildFile; fileRef = C51538CB1E807FF00093FF3E /* AttributeOptions.swift */; }; C53A02291E92C27A009837BD /* AnnotationTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = C5247D701E818A24004B6154 /* AnnotationTests.swift */; }; C53A022A1E92C27B009837BD /* AnnotationTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = C5247D701E818A24004B6154 /* AnnotationTests.swift */; }; C53A022B1E92C281009837BD /* annotation.json in Resources */ = {isa = PBXBuildFile; fileRef = C5A3D3971E8188FE00D494A0 /* annotation.json */; }; @@ -134,9 +111,9 @@ C57D55051DB566A900B94B74 /* MBIntersection.swift in Sources */ = {isa = PBXBuildFile; fileRef = C57D55001DB5669600B94B74 /* MBIntersection.swift */; }; C57D55081DB58C0200B94B74 /* MBLane.swift in Sources */ = {isa = PBXBuildFile; fileRef = C57D55071DB58C0200B94B74 /* MBLane.swift */; }; C582BA2E2073ED6300647DAA /* Array.swift in Sources */ = {isa = PBXBuildFile; fileRef = C582BA2D2073ED6300647DAA /* Array.swift */; }; - C584E3F71F201C7B00BBC9BB /* MBRoadClasses.swift in Sources */ = {isa = PBXBuildFile; fileRef = C59426061F1EA6C400C8E59C /* MBRoadClasses.swift */; }; - C584E3F81F201C7C00BBC9BB /* MBRoadClasses.swift in Sources */ = {isa = PBXBuildFile; fileRef = C59426061F1EA6C400C8E59C /* MBRoadClasses.swift */; }; - C584E3F91F201C7D00BBC9BB /* MBRoadClasses.swift in Sources */ = {isa = PBXBuildFile; fileRef = C59426061F1EA6C400C8E59C /* MBRoadClasses.swift */; }; + C584E3F71F201C7B00BBC9BB /* RoadClasses.swift in Sources */ = {isa = PBXBuildFile; fileRef = C59426061F1EA6C400C8E59C /* RoadClasses.swift */; }; + C584E3F81F201C7C00BBC9BB /* RoadClasses.swift in Sources */ = {isa = PBXBuildFile; fileRef = C59426061F1EA6C400C8E59C /* RoadClasses.swift */; }; + C584E3F91F201C7D00BBC9BB /* RoadClasses.swift in Sources */ = {isa = PBXBuildFile; fileRef = C59426061F1EA6C400C8E59C /* RoadClasses.swift */; }; C58EA7AA1E9D7EAD008F98CE /* MBCongestion.swift in Sources */ = {isa = PBXBuildFile; fileRef = C58EA7A91E9D7EAD008F98CE /* MBCongestion.swift */; }; C58EA7AB1E9D7F73008F98CE /* MBCongestion.swift in Sources */ = {isa = PBXBuildFile; fileRef = C58EA7A91E9D7EAD008F98CE /* MBCongestion.swift */; }; C58EA7AC1E9D7F74008F98CE /* MBCongestion.swift in Sources */ = {isa = PBXBuildFile; fileRef = C58EA7A91E9D7EAD008F98CE /* MBCongestion.swift */; }; @@ -144,7 +121,7 @@ C59094B5203B5C7F00EB2417 /* MBDrawingView.swift in Sources */ = {isa = PBXBuildFile; fileRef = C59094B4203B5C7F00EB2417 /* MBDrawingView.swift */; }; C59094BF203B800300EB2417 /* MBDirectionsOptions.swift in Sources */ = {isa = PBXBuildFile; fileRef = C59094BE203B800300EB2417 /* MBDirectionsOptions.swift */; }; C59094C1203DE6BC00EB2417 /* MBDirectionsResult.swift in Sources */ = {isa = PBXBuildFile; fileRef = C59094C0203DE6BC00EB2417 /* MBDirectionsResult.swift */; }; - C59426071F1EA6C400C8E59C /* MBRoadClasses.swift in Sources */ = {isa = PBXBuildFile; fileRef = C59426061F1EA6C400C8E59C /* MBRoadClasses.swift */; }; + C59426071F1EA6C400C8E59C /* RoadClasses.swift in Sources */ = {isa = PBXBuildFile; fileRef = C59426061F1EA6C400C8E59C /* RoadClasses.swift */; }; C59666392048A20E00C45CE5 /* RoutableMatchTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = C59666382048A20E00C45CE5 /* RoutableMatchTests.swift */; }; C596663A2048AECD00C45CE5 /* RoutableMatchTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = C59666382048A20E00C45CE5 /* RoutableMatchTests.swift */; }; C596663B2048AECE00C45CE5 /* RoutableMatchTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = C59666382048A20E00C45CE5 /* RoutableMatchTests.swift */; }; @@ -249,12 +226,7 @@ DADD27BA1E5AAAD800D31FAD /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = DADD27B91E5AAAD800D31FAD /* ViewController.swift */; }; DADD27BF1E5AAAD800D31FAD /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = DADD27BE1E5AAAD800D31FAD /* Assets.xcassets */; }; DADD27C81E5AAE3100D31FAD /* Launch Screen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = DADD27C71E5AAE3100D31FAD /* Launch Screen.storyboard */; }; - DADD27E71E5AB02C00D31FAD /* MapboxDirections.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DA6C9D881CAE442B00094FBC /* MapboxDirections.framework */; }; - DADD27EE1E5AB0EB00D31FAD /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = DADD27EA1E5AB0EB00D31FAD /* AppDelegate.m */; }; - DADD27EF1E5AB0EB00D31FAD /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = DADD27EB1E5AB0EB00D31FAD /* main.m */; }; - DADD27F01E5AB0EB00D31FAD /* ViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = DADD27ED1E5AB0EB00D31FAD /* ViewController.m */; }; DADD27F31E5ABD4300D31FAD /* Mapbox.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DADD27F21E5ABD4300D31FAD /* Mapbox.framework */; }; - DADD27F41E5ABD6000D31FAD /* Mapbox.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DADD27F21E5ABD4300D31FAD /* Mapbox.framework */; }; DADD27F71E5AC8E900D31FAD /* MapboxDirections.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DA6C9D881CAE442B00094FBC /* MapboxDirections.framework */; }; DAE33A1B1F215DF600C06039 /* IntersectionTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = DAE33A1A1F215DF600C06039 /* IntersectionTests.swift */; }; DAE33A1C1F215DF600C06039 /* IntersectionTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = DAE33A1A1F215DF600C06039 /* IntersectionTests.swift */; }; @@ -321,14 +293,7 @@ /* Begin PBXFileReference section */ 3556CE9922649CF2009397B5 /* MapboxDirectionsTests-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "MapboxDirectionsTests-Bridging-Header.h"; path = "../objc/MapboxDirectionsTests-Bridging-Header.h"; sourceTree = ""; }; - 3556CE9C22649CF3009397B5 /* BridgingTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = BridgingTests.m; path = ../objc/BridgingTests.m; sourceTree = ""; }; - 3563928622AAA0AB004A377E /* CMapboxDirections.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CMapboxDirections.h; path = include/CMapboxDirections.h; sourceTree = ""; }; 35828C9D217A003F00ED546E /* OfflineDirections.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OfflineDirections.swift; sourceTree = ""; }; - 35C0D78A22563B2A005E05A5 /* MBRoadClasses.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = MBRoadClasses.h; path = Sources/CMapboxDirections/include/MBRoadClasses.h; sourceTree = SOURCE_ROOT; }; - 35C0D78B22563B2A005E05A5 /* MBRouteOptions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = MBRouteOptions.h; path = Sources/CMapboxDirections/include/MBRouteOptions.h; sourceTree = SOURCE_ROOT; }; - 35C0D78C22563B2B005E05A5 /* MBLaneIndication.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = MBLaneIndication.h; path = Sources/CMapboxDirections/include/MBLaneIndication.h; sourceTree = SOURCE_ROOT; }; - 35C0D78D22563B2B005E05A5 /* MBRouteOptions.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = MBRouteOptions.m; path = Sources/CMapboxDirections/MBRouteOptions.m; sourceTree = SOURCE_ROOT; }; - 35C0D78E22563B2B005E05A5 /* MBAttribute.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = MBAttribute.h; path = Sources/CMapboxDirections/include/MBAttribute.h; sourceTree = SOURCE_ROOT; }; 35CC310A2285739700EA1966 /* WalkingOptionsTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WalkingOptionsTests.swift; sourceTree = ""; }; 35D92FEF218203AA000C78CB /* 2018-10-16-Liechtenstein.tar */ = {isa = PBXFileReference; lastKnownFileType = archive.tar; path = "2018-10-16-Liechtenstein.tar"; sourceTree = ""; }; 35DBF004217DF0D90009D2AE /* MBCoordinateBounds.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MBCoordinateBounds.swift; sourceTree = ""; }; @@ -337,6 +302,9 @@ 35DBF013217E199E0009D2AE /* OfflineDirectionsTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OfflineDirectionsTests.swift; sourceTree = ""; }; 35DBF018217F38A30009D2AE /* versions.json */ = {isa = PBXFileReference; lastKnownFileType = text.json; path = versions.json; sourceTree = ""; }; 35EFD00A207DFACA00BF3873 /* MBVisualInstruction.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MBVisualInstruction.swift; sourceTree = ""; }; + 438BFEBC233D7FA900457294 /* Package.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Package.swift; sourceTree = ""; }; + 438BFEC0233D805500457294 /* README.md */ = {isa = PBXFileReference; lastKnownFileType = net.daringfireball.markdown; path = README.md; sourceTree = ""; }; + 438BFEC1233D854D00457294 /* DirectionsProfileIdentifier.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DirectionsProfileIdentifier.swift; sourceTree = ""; }; 8D381B601FD9F5B1008D5A58 /* noDestinationName.json */ = {isa = PBXFileReference; lastKnownFileType = text.json; path = noDestinationName.json; sourceTree = ""; }; 8D381B621FDB01D1008D5A58 /* apiDestinationName.json */ = {isa = PBXFileReference; explicitFileType = text.json; path = apiDestinationName.json; sourceTree = ""; }; 8D381B691FDB101F008D5A58 /* String.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = String.swift; sourceTree = ""; }; @@ -345,7 +313,7 @@ AEAB391020D94699008F4E54 /* subVisualInstructions.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = subVisualInstructions.json; sourceTree = ""; }; AEDC211820B5DBDE0052DED8 /* MBLaneIndicationComponent.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MBLaneIndicationComponent.swift; sourceTree = ""; }; AEDC211C20B6104A0052DED8 /* MBComponentRepresentable.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MBComponentRepresentable.swift; sourceTree = ""; }; - C51538CB1E807FF00093FF3E /* MBAttribute.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MBAttribute.swift; sourceTree = ""; }; + C51538CB1E807FF00093FF3E /* AttributeOptions.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AttributeOptions.swift; sourceTree = ""; }; C5247D701E818A24004B6154 /* AnnotationTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AnnotationTests.swift; sourceTree = ""; }; C52552B81FA15D5900B1545C /* MBVisualInstructionBanner.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MBVisualInstructionBanner.swift; sourceTree = ""; }; C52552BF1FA1628A00B1545C /* MBVisualInstructionComponent.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MBVisualInstructionComponent.swift; sourceTree = ""; }; @@ -361,10 +329,9 @@ C59094B4203B5C7F00EB2417 /* MBDrawingView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MBDrawingView.swift; sourceTree = ""; }; C59094BE203B800300EB2417 /* MBDirectionsOptions.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MBDirectionsOptions.swift; sourceTree = ""; }; C59094C0203DE6BC00EB2417 /* MBDirectionsResult.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MBDirectionsResult.swift; sourceTree = ""; }; - C59426061F1EA6C400C8E59C /* MBRoadClasses.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MBRoadClasses.swift; sourceTree = ""; }; + C59426061F1EA6C400C8E59C /* RoadClasses.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RoadClasses.swift; sourceTree = ""; }; C59666382048A20E00C45CE5 /* RoutableMatchTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RoutableMatchTests.swift; sourceTree = ""; }; C5A3D3971E8188FE00D494A0 /* annotation.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; name = annotation.json; path = v5/annotation.json; sourceTree = ""; }; - C5AD8657202E24F500BF47D5 /* 0E4ACB76-F60D-38A4-A651-CCFD819876A1.bcsymbolmap */ = {isa = PBXFileReference; lastKnownFileType = text; name = "0E4ACB76-F60D-38A4-A651-CCFD819876A1.bcsymbolmap"; path = "Carthage/Build/iOS/0E4ACB76-F60D-38A4-A651-CCFD819876A1.bcsymbolmap"; sourceTree = ""; }; C5AD8658202E24F500BF47D5 /* AWSPolly.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AWSPolly.framework; path = Carthage/Build/iOS/AWSPolly.framework; sourceTree = ""; }; C5AD8659202E24F500BF47D5 /* AWSCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AWSCore.framework; path = Carthage/Build/iOS/AWSCore.framework; sourceTree = ""; }; C5AD865A202E24F500BF47D5 /* Turf.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Turf.framework; path = Carthage/Build/iOS/Turf.framework; sourceTree = ""; }; @@ -405,18 +372,12 @@ DAC05F191CFC077C00FA0071 /* MBRouteLeg.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MBRouteLeg.swift; sourceTree = ""; }; DAC05F1B1CFC1E5300FA0071 /* v5_driving_dc_polyline.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = v5_driving_dc_polyline.json; sourceTree = ""; }; DACCFCA82225359500110FC9 /* v5_driving_oldenburg_polyline.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = v5_driving_oldenburg_polyline.json; sourceTree = ""; }; - DADD27B51E5AAAD800D31FAD /* Example (Swift).app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "Example (Swift).app"; sourceTree = BUILT_PRODUCTS_DIR; }; + DADD27B51E5AAAD800D31FAD /* Example.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Example.app; sourceTree = BUILT_PRODUCTS_DIR; }; DADD27B71E5AAAD800D31FAD /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; DADD27B91E5AAAD800D31FAD /* ViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ViewController.swift; sourceTree = ""; }; DADD27BE1E5AAAD800D31FAD /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; DADD27C31E5AAAD800D31FAD /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; DADD27C71E5AAE3100D31FAD /* Launch Screen.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; path = "Launch Screen.storyboard"; sourceTree = ""; }; - DADD27D01E5AAFFD00D31FAD /* Example (Objective-C).app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "Example (Objective-C).app"; sourceTree = BUILT_PRODUCTS_DIR; }; - DADD27E91E5AB0EB00D31FAD /* AppDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AppDelegate.h; sourceTree = ""; }; - DADD27EA1E5AB0EB00D31FAD /* AppDelegate.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AppDelegate.m; sourceTree = ""; }; - DADD27EB1E5AB0EB00D31FAD /* main.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; - DADD27EC1E5AB0EB00D31FAD /* ViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ViewController.h; sourceTree = ""; }; - DADD27ED1E5AB0EB00D31FAD /* ViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ViewController.m; sourceTree = ""; }; DADD27F21E5ABD4300D31FAD /* Mapbox.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Mapbox.framework; path = Carthage/Build/iOS/Mapbox.framework; sourceTree = ""; }; DAE33A1A1F215DF600C06039 /* IntersectionTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = IntersectionTests.swift; sourceTree = ""; }; DAE9E0F31EB7DE2E001E8E8B /* RouteOptionsTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = RouteOptionsTests.swift; path = Tests/MapboxDirectionsTests/RouteOptionsTests.swift; sourceTree = SOURCE_ROOT; }; @@ -490,15 +451,6 @@ ); runOnlyForDeploymentPostprocessing = 0; }; - DADD27CD1E5AAFFD00D31FAD /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - DADD27E71E5AB02C00D31FAD /* MapboxDirections.framework in Frameworks */, - DADD27F41E5ABD6000D31FAD /* Mapbox.framework in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; E05B24A0DFB05E8378736C51 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; @@ -510,20 +462,6 @@ /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ - 35C0D78922563B1C005E05A5 /* CMapboxDirections */ = { - isa = PBXGroup; - children = ( - 3563928622AAA0AB004A377E /* CMapboxDirections.h */, - 35C0D78E22563B2B005E05A5 /* MBAttribute.h */, - 35C0D78C22563B2B005E05A5 /* MBLaneIndication.h */, - 35C0D78A22563B2A005E05A5 /* MBRoadClasses.h */, - 35C0D78B22563B2A005E05A5 /* MBRouteOptions.h */, - 35C0D78D22563B2B005E05A5 /* MBRouteOptions.m */, - ); - name = CMapboxDirections; - path = ../CMapboxDirections; - sourceTree = ""; - }; 35DBF017217F387F0009D2AE /* Offline */ = { isa = PBXGroup; children = ( @@ -543,6 +481,15 @@ name = "iOS Frameworks"; sourceTree = ""; }; + 438BFEBF233D804600457294 /* Documents */ = { + isa = PBXGroup; + children = ( + 438BFEBC233D7FA900457294 /* Package.swift */, + 438BFEC0233D805500457294 /* README.md */, + ); + name = Documents; + sourceTree = ""; + }; 8D381B5F1FD9F592008D5A58 /* Responses */ = { isa = PBXGroup; children = ( @@ -575,7 +522,6 @@ C5AD8656202E24F400BF47D5 /* Frameworks */ = { isa = PBXGroup; children = ( - C5AD8657202E24F500BF47D5 /* 0E4ACB76-F60D-38A4-A651-CCFD819876A1.bcsymbolmap */, C5AD8659202E24F500BF47D5 /* AWSCore.framework */, C5AD8658202E24F500BF47D5 /* AWSPolly.framework */, C5AD865D202E24F500BF47D5 /* MapboxCoreNavigation.framework */, @@ -619,7 +565,6 @@ DA6C9D891CAE442B00094FBC /* MapboxDirections */ = { isa = PBXGroup; children = ( - 35C0D78922563B1C005E05A5 /* CMapboxDirections */, 8D381B681FDB1009008D5A58 /* Extensions */, C5DAAC9E20191683001F9261 /* Match */, DA6C9D8A1CAE442B00094FBC /* MapboxDirections.h */, @@ -628,15 +573,16 @@ DAC05F171CFC075300FA0071 /* MBRoute.swift */, DAC05F191CFC077C00FA0071 /* MBRouteLeg.swift */, DA2E03EA1CB0E13D00D1269A /* MBRouteOptions.swift */, + 438BFEC1233D854D00457294 /* DirectionsProfileIdentifier.swift */, C59094BE203B800300EB2417 /* MBDirectionsOptions.swift */, DA2E03E81CB0E0B000D1269A /* MBRouteStep.swift */, C57D55001DB5669600B94B74 /* MBIntersection.swift */, C57D55071DB58C0200B94B74 /* MBLane.swift */, DAA76D671DD127CB0015EC78 /* MBLaneIndication.swift */, DAC05F151CFBFAC400FA0071 /* MBWaypoint.swift */, - C51538CB1E807FF00093FF3E /* MBAttribute.swift */, + C51538CB1E807FF00093FF3E /* AttributeOptions.swift */, C58EA7A91E9D7EAD008F98CE /* MBCongestion.swift */, - C59426061F1EA6C400C8E59C /* MBRoadClasses.swift */, + C59426061F1EA6C400C8E59C /* RoadClasses.swift */, DA6C9D8C1CAE442B00094FBC /* Info.plist */, C55FB44A1F6AEBF6006BD1E9 /* MBSpokenInstruction.swift */, C52552B81FA15D5900B1545C /* MBVisualInstructionBanner.swift */, @@ -671,7 +617,6 @@ DA688B3D21B89ECD00C9BB25 /* VisualInstructionComponentTests.swift */, DA6C9D9A1CAE442B00094FBC /* Info.plist */, DA6C9DAD1CAEC93800094FBC /* Fixtures */, - 3556CE9C22649CF3009397B5 /* BridgingTests.m */, 35CC310A2285739700EA1966 /* WalkingOptionsTests.swift */, 3556CE9922649CF2009397B5 /* MapboxDirectionsTests-Bridging-Header.h */, ); @@ -726,7 +671,6 @@ isa = PBXGroup; children = ( DADD27CA1E5AAF4D00D31FAD /* Swift */, - DADD27E81E5AB0DE00D31FAD /* Objective-C */, DADD27CB1E5AAF5600D31FAD /* Supporting Files */, ); path = "Directions Example"; @@ -748,25 +692,14 @@ DADD27BE1E5AAAD800D31FAD /* Assets.xcassets */, DADD27C71E5AAE3100D31FAD /* Launch Screen.storyboard */, DADD27C31E5AAAD800D31FAD /* Info.plist */, - DADD27EB1E5AB0EB00D31FAD /* main.m */, ); name = "Supporting Files"; sourceTree = ""; }; - DADD27E81E5AB0DE00D31FAD /* Objective-C */ = { - isa = PBXGroup; - children = ( - DADD27E91E5AB0EB00D31FAD /* AppDelegate.h */, - DADD27EA1E5AB0EB00D31FAD /* AppDelegate.m */, - DADD27EC1E5AB0EB00D31FAD /* ViewController.h */, - DADD27ED1E5AB0EB00D31FAD /* ViewController.m */, - ); - name = "Objective-C"; - sourceTree = ""; - }; DD6254451AE70C1700017857 = { isa = PBXGroup; children = ( + 438BFEBF233D804600457294 /* Documents */, DADD27B61E5AAAD800D31FAD /* Directions Example */, DA6C9D891CAE442B00094FBC /* MapboxDirections */, DA6C9D971CAE442B00094FBC /* MapboxDirectionsTests */, @@ -789,8 +722,7 @@ DA1A10D51D0101ED009F82FA /* MapboxDirections.framework */, DA1A10DE1D0101ED009F82FA /* MapboxDirectionsTests.xctest */, DA1A10FB1D010361009F82FA /* MapboxDirections.framework */, - DADD27B51E5AAAD800D31FAD /* Example (Swift).app */, - DADD27D01E5AAFFD00D31FAD /* Example (Objective-C).app */, + DADD27B51E5AAAD800D31FAD /* Example.app */, ); name = Products; sourceTree = ""; @@ -820,11 +752,6 @@ isa = PBXHeadersBuildPhase; buildActionMask = 2147483647; files = ( - 35C0D79422563B2B005E05A5 /* MBRouteOptions.h in Headers */, - 35C0D79822563B2B005E05A5 /* MBLaneIndication.h in Headers */, - 35C0D79022563B2B005E05A5 /* MBRoadClasses.h in Headers */, - 3563928822AAA0AB004A377E /* CMapboxDirections.h in Headers */, - 35C0D7A022563B2B005E05A5 /* MBAttribute.h in Headers */, DA1A10C61D00F969009F82FA /* MapboxDirections.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; @@ -833,11 +760,6 @@ isa = PBXHeadersBuildPhase; buildActionMask = 2147483647; files = ( - 35C0D79522563B2B005E05A5 /* MBRouteOptions.h in Headers */, - 35C0D79922563B2B005E05A5 /* MBLaneIndication.h in Headers */, - 35C0D79122563B2B005E05A5 /* MBRoadClasses.h in Headers */, - 3563928922AAA0AB004A377E /* CMapboxDirections.h in Headers */, - 35C0D7A122563B2B005E05A5 /* MBAttribute.h in Headers */, DA1A10EC1D010247009F82FA /* MapboxDirections.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; @@ -846,11 +768,6 @@ isa = PBXHeadersBuildPhase; buildActionMask = 2147483647; files = ( - 35C0D79622563B2B005E05A5 /* MBRouteOptions.h in Headers */, - 35C0D79A22563B2B005E05A5 /* MBLaneIndication.h in Headers */, - 35C0D79222563B2B005E05A5 /* MBRoadClasses.h in Headers */, - 3563928A22AAA0AB004A377E /* CMapboxDirections.h in Headers */, - 35C0D7A222563B2B005E05A5 /* MBAttribute.h in Headers */, DA1A11031D0103A3009F82FA /* MapboxDirections.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; @@ -859,11 +776,6 @@ isa = PBXHeadersBuildPhase; buildActionMask = 2147483647; files = ( - 35C0D79322563B2B005E05A5 /* MBRouteOptions.h in Headers */, - 35C0D79722563B2B005E05A5 /* MBLaneIndication.h in Headers */, - 35C0D78F22563B2B005E05A5 /* MBRoadClasses.h in Headers */, - 3563928722AAA0AB004A377E /* CMapboxDirections.h in Headers */, - 35C0D79F22563B2B005E05A5 /* MBAttribute.h in Headers */, DA6C9D8B1CAE442B00094FBC /* MapboxDirections.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; @@ -997,9 +909,9 @@ productReference = DA6C9D911CAE442B00094FBC /* MapboxDirectionsTests.xctest */; productType = "com.apple.product-type.bundle.unit-test"; }; - DADD27B41E5AAAD800D31FAD /* Example (Swift) */ = { + DADD27B41E5AAAD800D31FAD /* Example */ = { isa = PBXNativeTarget; - buildConfigurationList = DADD27C61E5AAAD800D31FAD /* Build configuration list for PBXNativeTarget "Example (Swift)" */; + buildConfigurationList = DADD27C61E5AAAD800D31FAD /* Build configuration list for PBXNativeTarget "Example" */; buildPhases = ( DADD27B11E5AAAD800D31FAD /* Sources */, DADD27B21E5AAAD800D31FAD /* Frameworks */, @@ -1013,28 +925,9 @@ dependencies = ( DADD27FA1E5AC8E900D31FAD /* PBXTargetDependency */, ); - name = "Example (Swift)"; + name = Example; productName = "Directions Example"; - productReference = DADD27B51E5AAAD800D31FAD /* Example (Swift).app */; - productType = "com.apple.product-type.application"; - }; - DADD27CF1E5AAFFD00D31FAD /* Example (Objective-C) */ = { - isa = PBXNativeTarget; - buildConfigurationList = DADD27E41E5AAFFD00D31FAD /* Build configuration list for PBXNativeTarget "Example (Objective-C)" */; - buildPhases = ( - DADD27CC1E5AAFFD00D31FAD /* Sources */, - DADD27CD1E5AAFFD00D31FAD /* Frameworks */, - DADD27CE1E5AAFFD00D31FAD /* Resources */, - DADD27F61E5AC7FA00D31FAD /* Copy Frameworks */, - DA3DFB09236975E5003AE57F /* Apply Mapbox Access Token */, - ); - buildRules = ( - ); - dependencies = ( - ); - name = "Example (Objective-C)"; - productName = "Directions Example Swift"; - productReference = DADD27D01E5AAFFD00D31FAD /* Example (Objective-C).app */; + productReference = DADD27B51E5AAAD800D31FAD /* Example.app */; productType = "com.apple.product-type.application"; }; /* End PBXNativeTarget section */ @@ -1081,10 +974,6 @@ LastSwiftMigration = 1100; ProvisioningStyle = Automatic; }; - DADD27CF1E5AAFFD00D31FAD = { - CreatedOnToolsVersion = 8.2.1; - ProvisioningStyle = Automatic; - }; }; }; buildConfigurationList = DD6254491AE70C1700017857 /* Build configuration list for PBXProject "MapboxDirections" */; @@ -1100,8 +989,7 @@ projectDirPath = ""; projectRoot = ""; targets = ( - DADD27B41E5AAAD800D31FAD /* Example (Swift) */, - DADD27CF1E5AAFFD00D31FAD /* Example (Objective-C) */, + DADD27B41E5AAAD800D31FAD /* Example */, DA6C9D871CAE442B00094FBC /* MapboxDirections */, DA6C9D901CAE442B00094FBC /* MapboxDirectionsTests */, DA1A10AE1D00F8FF009F82FA /* MapboxDirectionsMac */, @@ -1217,13 +1105,6 @@ ); runOnlyForDeploymentPostprocessing = 0; }; - DADD27CE1E5AAFFD00D31FAD /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; /* End PBXResourcesBuildPhase section */ /* Begin PBXShellScriptBuildPhase section */ @@ -1281,22 +1162,6 @@ shellPath = /bin/sh; shellScript = "/usr/local/bin/carthage copy-frameworks"; }; - DADD27F61E5AC7FA00D31FAD /* Copy Frameworks */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputPaths = ( - "$(SRCROOT)/Carthage/Build/iOS/Mapbox.framework", - "$(SRCROOT)/Carthage/Build/iOS/Polyline.framework", - ); - name = "Copy Frameworks"; - outputPaths = ( - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "/usr/local/bin/carthage copy-frameworks"; - }; /* End PBXShellScriptBuildPhase section */ /* Begin PBXSourcesBuildPhase section */ @@ -1308,14 +1173,14 @@ 35DBF010217E17A30009D2AE /* HTTPURLResponse.swift in Sources */, 8D43467A219E15C3008B7BF3 /* Double.swift in Sources */, C52552C61FA162F900B1545C /* MBVisualInstructionComponent.swift in Sources */, - C53A02261E92C26E009837BD /* MBAttribute.swift in Sources */, + C53A02261E92C26E009837BD /* AttributeOptions.swift in Sources */, DA1A10C91D00F969009F82FA /* MBRouteLeg.swift in Sources */, C52552BA1FA15D5E00B1545C /* MBVisualInstructionBanner.swift in Sources */, 35828C9F217A003F00ED546E /* OfflineDirections.swift in Sources */, C5DAAC9F20195AAE001F9261 /* MBTracepoint.swift in Sources */, C5990B4A2045E72800D7DFD4 /* MBDirectionsResult.swift in Sources */, 35EFD00C207DFACA00BF3873 /* MBVisualInstruction.swift in Sources */, - C584E3F71F201C7B00BBC9BB /* MBRoadClasses.swift in Sources */, + C584E3F71F201C7B00BBC9BB /* RoadClasses.swift in Sources */, C5DAACA220195AB2001F9261 /* MBMatchOptions.swift in Sources */, DA1A10CC1D00F969009F82FA /* MBWaypoint.swift in Sources */, 35DBF006217DF0D90009D2AE /* MBCoordinateBounds.swift in Sources */, @@ -1325,13 +1190,13 @@ DAA76D691DD127CB0015EC78 /* MBLaneIndication.swift in Sources */, AEDC211E20B612530052DED8 /* MBLaneIndicationComponent.swift in Sources */, DA1A10CB1D00F969009F82FA /* MBRouteStep.swift in Sources */, - 35C0D79C22563B2B005E05A5 /* MBRouteOptions.m in Sources */, C57D55031DB566A700B94B74 /* MBIntersection.swift in Sources */, C52CE38F1F6AF63C0069963D /* MBSpokenInstruction.swift in Sources */, C58EA7AB1E9D7F73008F98CE /* MBCongestion.swift in Sources */, 35DBF00B217E172C0009D2AE /* CLLocationCoordinate2D.swift in Sources */, 8D381B6B1FDB3D8A008D5A58 /* String.swift in Sources */, C56516851FE1AB8F00A0AD18 /* MBVisualInstructionType.swift in Sources */, + 438BFEC3233D854D00457294 /* DirectionsProfileIdentifier.swift in Sources */, C54549FC2073F1EF002E273F /* Array.swift in Sources */, C547EC691DB59F8F009817F3 /* MBLane.swift in Sources */, AEDC212120B6125C0052DED8 /* MBComponentRepresentable.swift in Sources */, @@ -1353,7 +1218,6 @@ DAE33A1C1F215DF600C06039 /* IntersectionTests.swift in Sources */, C5DAACB0201AA92B001F9261 /* MatchTests.swift in Sources */, DA1A10CE1D00F972009F82FA /* Fixture.swift in Sources */, - 3556CE9E22649CF3009397B5 /* BridgingTests.m in Sources */, DA1A110C1D01045E009F82FA /* DirectionsTests.swift in Sources */, C5D1D7F31F6AFBD600A1C4F1 /* IntructionsTests.swift in Sources */, DA4F84EE21C08BFB008A0434 /* WaypointTests.swift in Sources */, @@ -1370,14 +1234,14 @@ 35DBF011217E17A30009D2AE /* HTTPURLResponse.swift in Sources */, 8D43467B219E15C4008B7BF3 /* Double.swift in Sources */, C52552C71FA162FA00B1545C /* MBVisualInstructionComponent.swift in Sources */, - C53A02271E92C26F009837BD /* MBAttribute.swift in Sources */, + C53A02271E92C26F009837BD /* AttributeOptions.swift in Sources */, DA1A10EF1D010247009F82FA /* MBRouteLeg.swift in Sources */, C52552BB1FA15D5F00B1545C /* MBVisualInstructionBanner.swift in Sources */, 35828CA0217A003F00ED546E /* OfflineDirections.swift in Sources */, C5DAACA020195AAF001F9261 /* MBTracepoint.swift in Sources */, C5990B4B2045E72900D7DFD4 /* MBDirectionsResult.swift in Sources */, 35EFD00D207DFACA00BF3873 /* MBVisualInstruction.swift in Sources */, - C584E3F81F201C7C00BBC9BB /* MBRoadClasses.swift in Sources */, + C584E3F81F201C7C00BBC9BB /* RoadClasses.swift in Sources */, C5DAACA320195AB2001F9261 /* MBMatchOptions.swift in Sources */, DA1A10F21D010247009F82FA /* MBWaypoint.swift in Sources */, 35DBF007217DF0D90009D2AE /* MBCoordinateBounds.swift in Sources */, @@ -1387,13 +1251,13 @@ DAA76D6A1DD127CB0015EC78 /* MBLaneIndication.swift in Sources */, AEDC211F20B612540052DED8 /* MBLaneIndicationComponent.swift in Sources */, DA1A10F11D010247009F82FA /* MBRouteStep.swift in Sources */, - 35C0D79D22563B2B005E05A5 /* MBRouteOptions.m in Sources */, C57D55041DB566A800B94B74 /* MBIntersection.swift in Sources */, C52CE3901F6AF63D0069963D /* MBSpokenInstruction.swift in Sources */, C58EA7AC1E9D7F74008F98CE /* MBCongestion.swift in Sources */, 35DBF00C217E172C0009D2AE /* CLLocationCoordinate2D.swift in Sources */, 8D381B6C1FDB3D8B008D5A58 /* String.swift in Sources */, C56516861FE1AB9000A0AD18 /* MBVisualInstructionType.swift in Sources */, + 438BFEC4233D854D00457294 /* DirectionsProfileIdentifier.swift in Sources */, C54549FD2073F1F0002E273F /* Array.swift in Sources */, C547EC6A1DB59F90009817F3 /* MBLane.swift in Sources */, AEDC212220B6125D0052DED8 /* MBComponentRepresentable.swift in Sources */, @@ -1415,7 +1279,6 @@ DAE33A1D1F215DF600C06039 /* IntersectionTests.swift in Sources */, C5DAACB1201AA92B001F9261 /* MatchTests.swift in Sources */, DA1A10F51D010251009F82FA /* Fixture.swift in Sources */, - 3556CE9F22649CF3009397B5 /* BridgingTests.m in Sources */, DA1A110D1D01045E009F82FA /* DirectionsTests.swift in Sources */, C5D1D7F41F6AFBD600A1C4F1 /* IntructionsTests.swift in Sources */, DA4F84EF21C08BFB008A0434 /* WaypointTests.swift in Sources */, @@ -1432,14 +1295,14 @@ 35DBF012217E17A30009D2AE /* HTTPURLResponse.swift in Sources */, 8D43467C219E15C6008B7BF3 /* Double.swift in Sources */, C52552C81FA162FB00B1545C /* MBVisualInstructionComponent.swift in Sources */, - C53A02281E92C271009837BD /* MBAttribute.swift in Sources */, + C53A02281E92C271009837BD /* AttributeOptions.swift in Sources */, DA1A11061D0103A3009F82FA /* MBRouteLeg.swift in Sources */, C52552BC1FA15D6000B1545C /* MBVisualInstructionBanner.swift in Sources */, 35828CA1217A003F00ED546E /* OfflineDirections.swift in Sources */, C5DAACA120195AAF001F9261 /* MBTracepoint.swift in Sources */, C5990B4C2045E72A00D7DFD4 /* MBDirectionsResult.swift in Sources */, 35EFD00E207DFACA00BF3873 /* MBVisualInstruction.swift in Sources */, - C584E3F91F201C7D00BBC9BB /* MBRoadClasses.swift in Sources */, + C584E3F91F201C7D00BBC9BB /* RoadClasses.swift in Sources */, C5DAACA420195AB3001F9261 /* MBMatchOptions.swift in Sources */, DA1A11091D0103A3009F82FA /* MBWaypoint.swift in Sources */, 35DBF008217DF0D90009D2AE /* MBCoordinateBounds.swift in Sources */, @@ -1449,13 +1312,13 @@ DAA76D6B1DD127CB0015EC78 /* MBLaneIndication.swift in Sources */, AEDC212020B612560052DED8 /* MBLaneIndicationComponent.swift in Sources */, DA1A11081D0103A3009F82FA /* MBRouteStep.swift in Sources */, - 35C0D79E22563B2B005E05A5 /* MBRouteOptions.m in Sources */, C57D55051DB566A900B94B74 /* MBIntersection.swift in Sources */, C52CE3911F6AF63E0069963D /* MBSpokenInstruction.swift in Sources */, C58EA7AD1E9D7F75008F98CE /* MBCongestion.swift in Sources */, 35DBF00D217E172C0009D2AE /* CLLocationCoordinate2D.swift in Sources */, 8D381B6D1FDB3D8B008D5A58 /* String.swift in Sources */, C56516871FE1AB9100A0AD18 /* MBVisualInstructionType.swift in Sources */, + 438BFEC5233D854D00457294 /* DirectionsProfileIdentifier.swift in Sources */, C54549FE2073F1F1002E273F /* Array.swift in Sources */, C547EC6B1DB59F91009817F3 /* MBLane.swift in Sources */, AEDC212320B6125E0052DED8 /* MBComponentRepresentable.swift in Sources */, @@ -1467,7 +1330,7 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - C51538CC1E807FF00093FF3E /* MBAttribute.swift in Sources */, + C51538CC1E807FF00093FF3E /* AttributeOptions.swift in Sources */, 35DBF00F217E17A30009D2AE /* HTTPURLResponse.swift in Sources */, 8D434679219E1167008B7BF3 /* Double.swift in Sources */, DA2E03EB1CB0E13D00D1269A /* MBRouteOptions.swift in Sources */, @@ -1475,7 +1338,7 @@ C52552B91FA15D5900B1545C /* MBVisualInstructionBanner.swift in Sources */, C52552C01FA1628A00B1545C /* MBVisualInstructionComponent.swift in Sources */, 35828C9E217A003F00ED546E /* OfflineDirections.swift in Sources */, - C59426071F1EA6C400C8E59C /* MBRoadClasses.swift in Sources */, + C59426071F1EA6C400C8E59C /* RoadClasses.swift in Sources */, 35EFD00B207DFACA00BF3873 /* MBVisualInstruction.swift in Sources */, DAC05F161CFBFAC400FA0071 /* MBWaypoint.swift in Sources */, C57D55081DB58C0200B94B74 /* MBLane.swift in Sources */, @@ -1488,13 +1351,13 @@ DAC05F1A1CFC077C00FA0071 /* MBRouteLeg.swift in Sources */, AEDC211920B5DBDE0052DED8 /* MBLaneIndicationComponent.swift in Sources */, C5434B8A200693D00069E887 /* MBTracepoint.swift in Sources */, - 35C0D79B22563B2B005E05A5 /* MBRouteOptions.m in Sources */, DA6C9DA61CAE462800094FBC /* MBDirections.swift in Sources */, C55FB44B1F6AEBF6006BD1E9 /* MBSpokenInstruction.swift in Sources */, C5DAAC9A20191675001F9261 /* MBMatch.swift in Sources */, 35DBF00A217E172C0009D2AE /* CLLocationCoordinate2D.swift in Sources */, C58EA7AA1E9D7EAD008F98CE /* MBCongestion.swift in Sources */, 8D381B6A1FDB101F008D5A58 /* String.swift in Sources */, + 438BFEC2233D854D00457294 /* DirectionsProfileIdentifier.swift in Sources */, C56516841FE1A2DD00A0AD18 /* MBVisualInstructionType.swift in Sources */, C57D55011DB5669600B94B74 /* MBIntersection.swift in Sources */, AEDC211D20B6104B0052DED8 /* MBComponentRepresentable.swift in Sources */, @@ -1516,7 +1379,6 @@ DAE33A1B1F215DF600C06039 /* IntersectionTests.swift in Sources */, C5DAACAF201AA92B001F9261 /* MatchTests.swift in Sources */, DA6C9DB21CAECA0E00094FBC /* Fixture.swift in Sources */, - 3556CE9D22649CF3009397B5 /* BridgingTests.m in Sources */, DA1A110B1D01045E009F82FA /* DirectionsTests.swift in Sources */, C52CE3931F6AF6E70069963D /* IntructionsTests.swift in Sources */, DA4F84ED21C08BFB008A0434 /* WaypointTests.swift in Sources */, @@ -1535,16 +1397,6 @@ ); runOnlyForDeploymentPostprocessing = 0; }; - DADD27CC1E5AAFFD00D31FAD /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - DADD27F01E5AB0EB00D31FAD /* ViewController.m in Sources */, - DADD27EF1E5AB0EB00D31FAD /* main.m in Sources */, - DADD27EE1E5AB0EB00D31FAD /* AppDelegate.m in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; /* End PBXSourcesBuildPhase section */ /* Begin PBXTargetDependency section */ @@ -1934,9 +1786,9 @@ ); INFOPLIST_FILE = "Directions Example/Info.plist"; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; - PRODUCT_BUNDLE_IDENTIFIER = com.mapbox.Directions.Swift; + PRODUCT_BUNDLE_IDENTIFIER = com.mapbox.Directions; PRODUCT_MODULE_NAME = DirectionsExampleSwift; - PRODUCT_NAME = "$(TARGET_NAME)"; + PRODUCT_NAME = Example; SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; SWIFT_SWIFT3_OBJC_INFERENCE = Off; }; @@ -1956,54 +1808,13 @@ ); INFOPLIST_FILE = "Directions Example/Info.plist"; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; - PRODUCT_BUNDLE_IDENTIFIER = com.mapbox.Directions.Swift; + PRODUCT_BUNDLE_IDENTIFIER = com.mapbox.Directions; PRODUCT_MODULE_NAME = DirectionsExampleSwift; - PRODUCT_NAME = "$(TARGET_NAME)"; + PRODUCT_NAME = Example; SWIFT_SWIFT3_OBJC_INFERENCE = Off; }; name = Release; }; - DADD27E51E5AAFFD00D31FAD /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - CLANG_ANALYZER_NONNULL = YES; - CLANG_WARN_DOCUMENTATION_COMMENTS = YES; - DEBUG_INFORMATION_FORMAT = dwarf; - DEVELOPMENT_TEAM = ""; - FRAMEWORK_SEARCH_PATHS = ( - "$(inherited)", - "$(PROJECT_DIR)/Carthage/Build/iOS", - ); - INFOPLIST_FILE = "Directions Example/Info.plist"; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; - PRODUCT_BUNDLE_IDENTIFIER = com.mapbox.Directions.ObjectiveC; - PRODUCT_MODULE_NAME = DirectionsExampleObjectiveC; - PRODUCT_NAME = "$(TARGET_NAME)"; - }; - name = Debug; - }; - DADD27E61E5AAFFD00D31FAD /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - CLANG_ANALYZER_NONNULL = YES; - CLANG_WARN_DOCUMENTATION_COMMENTS = YES; - DEVELOPMENT_TEAM = ""; - FRAMEWORK_SEARCH_PATHS = ( - "$(inherited)", - "$(PROJECT_DIR)/Carthage/Build/iOS", - ); - INFOPLIST_FILE = "Directions Example/Info.plist"; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; - PRODUCT_BUNDLE_IDENTIFIER = com.mapbox.Directions.ObjectiveC; - PRODUCT_MODULE_NAME = DirectionsExampleObjectiveC; - PRODUCT_NAME = "$(TARGET_NAME)"; - }; - name = Release; - }; DD62546B1AE70C1700017857 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { @@ -2185,7 +1996,7 @@ defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; - DADD27C61E5AAAD800D31FAD /* Build configuration list for PBXNativeTarget "Example (Swift)" */ = { + DADD27C61E5AAAD800D31FAD /* Build configuration list for PBXNativeTarget "Example" */ = { isa = XCConfigurationList; buildConfigurations = ( DADD27C41E5AAAD800D31FAD /* Debug */, @@ -2194,15 +2005,6 @@ defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; - DADD27E41E5AAFFD00D31FAD /* Build configuration list for PBXNativeTarget "Example (Objective-C)" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - DADD27E51E5AAFFD00D31FAD /* Debug */, - DADD27E61E5AAFFD00D31FAD /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; DD6254491AE70C1700017857 /* Build configuration list for PBXProject "MapboxDirections" */ = { isa = XCConfigurationList; buildConfigurations = ( diff --git a/MapboxDirections.xcodeproj/xcshareddata/xcschemes/Example (Objective-C).xcscheme b/MapboxDirections.xcodeproj/xcshareddata/xcschemes/Example (Objective-C).xcscheme deleted file mode 100644 index f525f3e02..000000000 --- a/MapboxDirections.xcodeproj/xcshareddata/xcschemes/Example (Objective-C).xcscheme +++ /dev/null @@ -1,101 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/MapboxDirections.xcodeproj/xcshareddata/xcschemes/Example (Swift).xcscheme b/MapboxDirections.xcodeproj/xcshareddata/xcschemes/Example.xcscheme similarity index 87% rename from MapboxDirections.xcodeproj/xcshareddata/xcschemes/Example (Swift).xcscheme rename to MapboxDirections.xcodeproj/xcshareddata/xcschemes/Example.xcscheme index b4114acd8..cbf1867a5 100644 --- a/MapboxDirections.xcodeproj/xcshareddata/xcschemes/Example (Swift).xcscheme +++ b/MapboxDirections.xcodeproj/xcshareddata/xcschemes/Example.xcscheme @@ -15,8 +15,8 @@ @@ -27,6 +27,15 @@ selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB" selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB" shouldUseLaunchSchemeArgsEnv = "YES"> + + + + @@ -39,17 +48,6 @@ - - - - - - - - diff --git a/Package.swift b/Package.swift index f7b809a1f..ab4778171 100644 --- a/Package.swift +++ b/Package.swift @@ -22,9 +22,6 @@ let package = Package( .target( name: "MapboxDirections", dependencies: ["CMapboxDirections", "Polyline"]), - .target( - name: "CMapboxDirections" - ), .testTarget( name: "MapboxDirectionsTests", dependencies: ["MapboxDirections"]), diff --git a/README.md b/README.md index 208fe99b7..71b2548d7 100644 --- a/README.md +++ b/README.md @@ -7,8 +7,6 @@ MapboxDirections.swift makes it easy to connect your iOS, macOS, tvOS, or watchOS application to the [Mapbox Directions](https://docs.mapbox.com/api/navigation/) and [Map Matching](https://docs.mapbox.com/api/navigation/#map-matching) APIs. Quickly get driving, cycling, or walking directions, whether the trip is nonstop or it has multiple stopping points, all using a simple interface reminiscent of MapKit’s `MKDirections` API. Fit a GPX trace to the [OpenStreetMap](https://www.openstreetmap.org/) road network. The Mapbox Directions and Map Matching APIs are powered by the [OSRM](http://project-osrm.org/) routing engine. For more information, see the [Mapbox Navigation](https://www.mapbox.com/navigation/) homepage. -Despite its name, MapboxDirections.swift works in Objective-C and Cocoa-AppleScript code in addition to Swift. - MapboxDirections.swift pairs well with [MapboxGeocoder.swift](https://github.com/mapbox/MapboxGeocoder.swift), [MapboxStatic.swift](https://github.com/mapbox/MapboxStatic.swift), the [Mapbox Navigation SDK for iOS](https://github.com/mapbox/mapbox-navigation-ios/), and the [Mapbox Maps SDK for iOS](https://docs.mapbox.com/ios/maps/) or [macOS SDK](https://mapbox.github.io/mapbox-gl-native/macos/). ## Getting started @@ -35,7 +33,7 @@ Then `import MapboxDirections` or `@import MapboxDirections;`. This library supports a minimum deployment target of iOS 10.0 or above, macOS 10.12.0 or above, tvOS 10.0 or above, or watchOS 2.0 or above. v0.30.0 is the last release of MapboxDirections.swift that supports a minimum deployment target of iOS 9._x_, macOS 10.11._x_, tvOS 9._x_, or watchOS 2._x_. -This repository contains example applications written in Swift and Objective-C that demonstrate how to use the framework. To run them, you need to use [Carthage](https://github.com/Carthage/Carthage) 0.19 or above to install the dependencies. Detailed documentation is available in the [Mapbox API Documentation](https://docs.mapbox.com/api/navigation/#directions). +This repository contains an example application that demonstrates how to use the framework. To run it, you need to use [Carthage](https://github.com/Carthage/Carthage) 0.19 or above to install the dependencies. Detailed documentation is available in the [Mapbox API Documentation](https://docs.mapbox.com/api/navigation/#directions). ## Usage @@ -43,11 +41,11 @@ This repository contains example applications written in Swift and Objective-C t You’ll need a [Mapbox access token](https://docs.mapbox.com/api/#access-tokens-and-token-scopes) in order to use the API. If you’re already using the [Mapbox Maps SDK for iOS](https://docs.mapbox.com/ios/maps/) or [macOS SDK](https://mapbox.github.io/mapbox-gl-native/macos/), MapboxDirections.swift automatically recognizes your access token, as long as you’ve placed it in the `MGLMapboxAccessToken` key of your application’s Info.plist file. -The examples below are each provided in Swift (denoted with `main.swift`), Objective-C (`main.m`), and AppleScript (`AppDelegate.applescript`). For further details, see the [MapboxDirections.swift API reference](https://docs.mapbox.com/ios/api/directions/). +The examples below are each provided in Swift (denoted with `main.swift`), For further details, see the [MapboxDirections.swift API reference](https://docs.mapbox.com/ios/api/directions/). ### Calculating directions between locations -The main directions class is Directions (in Swift) or MBDirections (in Objective-C or AppleScript). Create a directions object using your access token: +The main directions class is `Directions`. Create a directions object using your access token: ```swift // main.swift @@ -56,19 +54,6 @@ import MapboxDirections let directions = Directions(accessToken: "<#your access token#>") ``` -```objc -// main.m -@import MapboxDirections; - -MBDirections *directions = [[MBDirections alloc] initWithAccessToken:@"<#your access token#>"]; -``` - -```applescript --- AppDelegate.applescript -set theDirections to alloc of MBDirections of the current application -tell theDirections to initWithAccessToken:"<#your access token#>" -``` - Alternatively, you can place your access token in the `MGLMapboxAccessToken` key of your application’s Info.plist file, then use the shared directions object: ```swift @@ -76,17 +61,7 @@ Alternatively, you can place your access token in the `MGLMapboxAccessToken` key let directions = Directions.shared ``` -```objc -// main.m -MBDirections *directions = [MBDirections sharedDirections]; -``` - -```applescript --- AppDelegate.applescript -set theDirections to sharedDirections of MBDirections of the current application -``` - -With the directions object in hand, construct a RouteOptions or MBRouteOptions object and pass it into the `Directions.calculate(_:completionHandler:)` method. +With the directions object in hand, construct a RouteOptions object and pass it into the `Directions.calculate(_:completionHandler:)` method. ```swift // main.swift @@ -125,86 +100,7 @@ let task = directions.calculate(options) { (waypoints, routes, error) in } ``` -```objc -// main.m - -NSArray *waypoints = @[ - [[MBWaypoint alloc] initWithCoordinate:CLLocationCoordinate2DMake(38.9131752, -77.0324047) coordinateAccuracy:-1 name:@"Mapbox"], - [[MBWaypoint alloc] initWithCoordinate:CLLocationCoordinate2DMake(38.8977, -77.0365) coordinateAccuracy:-1 name:@"White House"], -]; -MBRouteOptions *options = [[MBRouteOptions alloc] initWithWaypoints:waypoints - profileIdentifier:MBDirectionsProfileIdentifierAutomobileAvoidingTraffic]; -options.includesSteps = YES; - -NSURLSessionDataTask *task = [directions calculateDirectionsWithOptions:options - completionHandler:^(NSArray * _Nullable waypoints, - NSArray * _Nullable routes, - NSError * _Nullable error) { - if (error) { - NSLog(@"Error calculating directions: %@", error); - return; - } - - MBRoute *route = routes.firstObject; - MBRouteLeg *leg = route.legs.firstObject; - if (leg) { - NSLog(@"Route via %@:", leg); - - NSLengthFormatter *distanceFormatter = [[NSLengthFormatter alloc] init]; - NSString *formattedDistance = [distanceFormatter stringFromMeters:leg.distance]; - - NSDateComponentsFormatter *travelTimeFormatter = [[NSDateComponentsFormatter alloc] init]; - travelTimeFormatter.unitsStyle = NSDateComponentsFormatterUnitsStyleShort; - NSString *formattedTravelTime = [travelTimeFormatter stringFromTimeInterval:route.expectedTravelTime]; - - NSLog(@"Distance: %@; ETA: %@", formattedDistance, formattedTravelTime); - - for (MBRouteStep *step in leg.steps) { - NSLog(@"%@", step.instructions); - NSString *formattedDistance = [distanceFormatter stringFromMeters:step.distance]; - NSLog(@"— %@ —", formattedDistance); - } - } -}]; -``` - -```applescript --- AppDelegate.applescript - -set mapbox to alloc of MBWaypoint of the current application -tell mapbox to initWithCoordinate:{38.9131752, -77.0324047} coordinateAccuracy:-1 |name|:"Mapbox" -set theWhiteHouse to alloc of MBWaypoint of the current application -tell theWhiteHouse to initWithCoordinate:{38.8977, -77.0365} coordinateAccuracy:-1 |name|:"White House" -set theWaypoints to {mapbox, theWhiteHouse} - -set theOptions to alloc of MBRouteOptions of the current application -tell theOptions to initWithWaypoints:theWaypoints profileIdentifier:"mapbox/driving-traffic" -set theOptions's includesSteps to true - -set theURL to theDirections's URLForCalculatingDirectionsWithOptions:theOptions -set theData to the current application's NSData's dataWithContentsOfURL:theURL -set theJSON to the current application's NSJSONSerialization's JSONObjectWithData:theData options:0 |error|:(missing value) - -set theRoute to alloc of MBRoute of the current application -tell theRoute to initWithJson:(the first item of theJSON's routes) waypoints:theWaypoints profileIdentifier:"mapbox/driving" -set theLeg to the first item of theRoute's legs - -log "Route via " & theLeg's |name| & ":" - -set theDistanceFormatter to alloc of NSLengthFormatter of the current application -tell theDistanceFormatter to init() -set theDistance to theDistanceFormatter's stringFromMeters:(theLeg's distance) - -log "Distance: " & theDistance - -repeat with theStep in theLeg's steps - log theStep's instructions - set theDistance to theDistanceFormatter's stringFromMeters:(theStep's distance) - log "— " & theDistance & " —" -end repeat -``` - -This library uses version 5 of the Mapbox Directions API by default. To use version 4 instead, replace RouteOptions with RouteOptionsV4 (or MBRouteOptions with MBRouteOptionsV4). +This library uses version 5 of the Mapbox Directions API by default. To use version 4 instead, replace RouteOptions with RouteOptionsV4. ### Matching a trace to the road network @@ -253,55 +149,14 @@ let task = directions.calculate(options) { (matches, error) in } ``` -```objc -// main.m -NSArray *waypoints = @[ - [[MBWaypoint alloc] initWithCoordinate:CLLocationCoordinate2DMake(32.712041, -117.172836) coordinateAccuracy:-1 name:nil], - [[MBWaypoint alloc] initWithCoordinate:CLLocationCoordinate2DMake(32.712256, -117.17291) coordinateAccuracy:-1 name:nil], - [[MBWaypoint alloc] initWithCoordinate:CLLocationCoordinate2DMake(32.712444, -117.17292) coordinateAccuracy:-1 name:nil], - [[MBWaypoint alloc] initWithCoordinate:CLLocationCoordinate2DMake(32.71257, -117.172922) coordinateAccuracy:-1 name:nil], - [[MBWaypoint alloc] initWithCoordinate:CLLocationCoordinate2DMake(32.7126, -117.172985) coordinateAccuracy:-1 name:nil], - [[MBWaypoint alloc] initWithCoordinate:CLLocationCoordinate2DMake(32.712597, -117.173143) coordinateAccuracy:-1 name:nil], - [[MBWaypoint alloc] initWithCoordinate:CLLocationCoordinate2DMake(32.712546, -117.173345) coordinateAccuracy:-1 name:nil], -]; - -MBMatchOptions *matchOptions = [[MBMatchOptions alloc] initWithWaypoints:waypoints profileIdentifier:MBDirectionsProfileIdentifierAutomobile]; -NSURLSessionDataTask *task = [[[MBDirections alloc] initWithAccessToken:MapboxAccessToken] calculateMatchesWithOptions:matchOptions completionHandler:^(NSArray * _Nullable matches, NSError * _Nullable error) { - if (error) { - NSLog(@"Error matching waypoints: %@", error); - return; - } - - MBMatch *match = matches.firstObject; - MBRouteLeg *leg = match.legs.firstObject; - if (leg) { - NSLog(@"Match via %@:", leg); - - NSLengthFormatter *distanceFormatter = [[NSLengthFormatter alloc] init]; - NSString *formattedDistance = [distanceFormatter stringFromMeters:leg.distance]; - NSDateComponentsFormatter *travelTimeFormatter = [[NSDateComponentsFormatter alloc] init]; - travelTimeFormatter.unitsStyle = NSDateComponentsFormatterUnitsStyleShort; - NSString *formattedTravelTime = [travelTimeFormatter stringFromTimeInterval:match.expectedTravelTime]; - - NSLog(@"Distance: %@; ETA: %@", formattedDistance, formattedTravelTime); - - for (MBRouteStep *step in leg.steps) { - NSLog(@"%@", step.instructions); - NSString *formattedDistance = [distanceFormatter stringFromMeters:step.distance]; - NSLog(@"— %@ —", formattedDistance); - } - } -}]; -``` - -You can also use the `Directions.calculateRoutes(matching:completionHandler:)` method in Swift or the `-[MBDirections calculateRoutesMatchingOptions:completionHandler:]` method in Objective-C to get Route objects suitable for use anywhere a standard Directions API response would be used. +You can also use the `Directions.calculateRoutes(matching:completionHandler:)` method to get Route objects suitable for use anywhere a standard Directions API response would be used. ## Usage with other Mapbox libraries ### Drawing the route on a map -With the [Mapbox Maps SDK for iOS](https://docs.mapbox.com/ios/maps/) or [macOS SDK](https://mapbox.github.io/mapbox-gl-native/macos/), you can easily draw the route on a map in Swift or Objective-C: +With the [Mapbox Maps SDK for iOS](https://docs.mapbox.com/ios/maps/) or [macOS SDK](https://mapbox.github.io/mapbox-gl-native/macos/), you can easily draw the route on a map: ```swift // main.swift @@ -317,24 +172,6 @@ if route.coordinateCount > 0 { } ``` -```objc -// main.m - -if (route.coordinateCount) { - // Convert the route’s coordinates into a polyline. - CLLocationCoordinate2D *routeCoordinates = malloc(route.coordinateCount * sizeof(CLLocationCoordinate2D)); - [route getCoordinates:routeCoordinates]; - MGLPolyline *routeLine = [MGLPolyline polylineWithCoordinates:routeCoordinates count:route.coordinateCount]; - - // Add the polyline to the map and fit the viewport to the polyline. - [mapView addAnnotation:routeLine]; - [mapView setVisibleCoordinates:routeCoordinates count:route.coordinateCount edgePadding:UIEdgeInsetsZero animated:YES]; - - // Make sure to free this array to avoid leaking memory. - free(routeCoordinates); -} -``` - ### Displaying a turn-by-turn navigation interface See the [Mapbox Navigation SDK for iOS](https://github.com/mapbox/mapbox-navigation-ios/#usage) documentation for usage examples. diff --git a/Sources/CMapboxDirections/MBRouteOptions.m b/Sources/CMapboxDirections/MBRouteOptions.m deleted file mode 100644 index 34334686a..000000000 --- a/Sources/CMapboxDirections/MBRouteOptions.m +++ /dev/null @@ -1,11 +0,0 @@ -#import "MBRouteOptions.h" - - -MBDirectionsProfileIdentifier const MBDirectionsProfileIdentifierAutomobile = @"mapbox/driving"; -MBDirectionsProfileIdentifier const MBDirectionsProfileIdentifierAutomobileAvoidingTraffic = @"mapbox/driving-traffic"; -MBDirectionsProfileIdentifier const MBDirectionsProfileIdentifierCycling = @"mapbox/cycling"; -MBDirectionsProfileIdentifier const MBDirectionsProfileIdentifierWalking = @"mapbox/walking"; - -const MBDirectionsPriority MBDirectionsPriorityLow = -1.0; -const MBDirectionsPriority MBDirectionsPriorityDefault = 0; -const MBDirectionsPriority MBDirectionsPriorityHigh = 1.0; diff --git a/Sources/CMapboxDirections/include/CMapboxDirections.h b/Sources/CMapboxDirections/include/CMapboxDirections.h deleted file mode 100644 index d7ae267ef..000000000 --- a/Sources/CMapboxDirections/include/CMapboxDirections.h +++ /dev/null @@ -1,4 +0,0 @@ -#import "MBAttribute.h" -#import "MBLaneIndication.h" -#import "MBRoadClasses.h" -#import "MBRouteOptions.h" diff --git a/Sources/CMapboxDirections/include/MBAttribute.h b/Sources/CMapboxDirections/include/MBAttribute.h deleted file mode 100644 index d159fe8e0..000000000 --- a/Sources/CMapboxDirections/include/MBAttribute.h +++ /dev/null @@ -1,38 +0,0 @@ -#import - -/** - Attributes are metadata information for a route leg. - - When any of the attributes are specified, the resulting route leg contains one attribute value for each segment in leg, where a segment is the straight line between two coordinates in the route leg’s full geometry. - */ -typedef NS_OPTIONS(NSUInteger, MBAttributeOptions) { - /** - Distance (in meters) along the segment. - - When this attribute is specified, the `RouteLeg.segmentDistances` property contains one value for each segment in the leg’s full geometry. - */ - MBAttributeDistance = (1 << 1), - - /** - Expected travel time (in seconds) along the segment. - - When this attribute is specified, the `RouteLeg.expectedSegmentTravelTimes` property contains one value for each segment in the leg’s full geometry. - */ - MBAttributeExpectedTravelTime = (1 << 2), - - /** - Current average speed (in meters per second) along the segment. - - When this attribute is specified, the `RouteLeg.segmentSpeeds` property contains one value for each segment in the leg’s full geometry. - */ - MBAttributeSpeed = (1 << 3), - - /** - Traffic congestion level along the segment. - - When this attribute is specified, the `RouteLeg.congestionLevels` property contains one value for each segment in the leg’s full geometry. - - This attribute requires `MBDirectionsProfileIdentifierAutomobileAvoidingTraffic`. Any other profile identifier produces `CongestionLevel.unknown` for each segment along the route. - */ - MBAttributeCongestionLevel = (1 << 4), -}; diff --git a/Sources/CMapboxDirections/include/MBLaneIndication.h b/Sources/CMapboxDirections/include/MBLaneIndication.h deleted file mode 100644 index 525ad70f0..000000000 --- a/Sources/CMapboxDirections/include/MBLaneIndication.h +++ /dev/null @@ -1,35 +0,0 @@ -#import - -/** - Each of these options specifies a maneuver direction for which a given lane can - be used. - - A Lane object has zero or more indications that usually correspond to arrows on - signs or pavement markings. If no options are specified, it may be the case - that no maneuvers are indicated on signage or pavement markings for the lane. - */ -typedef NS_OPTIONS(NSUInteger, MBLaneIndication) { - /// Indicates a sharp turn to the right. - MBLaneIndicationSharpRight = (1 << 1), - - /// Indicates a turn to the right. - MBLaneIndicationRight = (1 << 2), - - /// Indicates a turn to the right. - MBLaneIndicationSlightRight = (1 << 3), - - /// Indicates no turn. - MBLaneIndicationStraightAhead = (1 << 4), - - /// Indicates a slight turn to the left. - MBLaneIndicationSlightLeft = (1 << 5), - - /// Indicates a turn to the left. - MBLaneIndicationLeft = (1 << 6), - - /// Indicates a sharp turn to the left. - MBLaneIndicationSharpLeft = (1 << 7), - - /// Indicates a U-turn. - MBLaneIndicationUTurn = (1 << 8), -}; diff --git a/Sources/CMapboxDirections/include/MBRoadClasses.h b/Sources/CMapboxDirections/include/MBRoadClasses.h deleted file mode 100644 index 0409f5172..000000000 --- a/Sources/CMapboxDirections/include/MBRoadClasses.h +++ /dev/null @@ -1,40 +0,0 @@ -#import - -/** - Option set that contains attributes of a road segment. - */ -typedef NS_OPTIONS(NSUInteger, MBRoadClasses) { - - /** - The road segment is [tolled](https://wiki.openstreetmap.org/wiki/Key:toll). - */ - MBRoadClassesToll = (1 << 1), - - /** - The road segment has access restrictions. - - A road segment may have this class if there are [general access restrictions](https://wiki.openstreetmap.org/wiki/Key:access) or a [high-occupancy vehicle](https://wiki.openstreetmap.org/wiki/Key:hov) restriction. - */ - MBRoadClassesRestricted = (1 << 2), - - /** - The road segment is a [freeway](https://wiki.openstreetmap.org/wiki/Tag:highway%3Dmotorway) or [freeway ramp](https://wiki.openstreetmap.org/wiki/Tag:highway%3Dmotorway_link). - - It may be desirable to suppress the name of the freeway when giving instructions and give instructions at fixed distances before an exit (such as 1 mile or 1 kilometer ahead). - */ - MBRoadClassesMotorway = (1 << 3), - - /** - The user must travel this segment of the route by ferry. - - The user should verify that the ferry is in operation. For driving and cycling directions, the user should also verify that his or her vehicle is permitted onboard the ferry. - - In general, the transport type of the step containing the road segment is also `TransportType.ferry`. - */ - MBRoadClassesFerry = (1 << 4), - - /** - The user must travel this segment of the route through a [tunnel](https://wiki.openstreetmap.org/wiki/Key:tunnel). - */ - MBRoadClassesTunnel = (1 << 5), -}; diff --git a/Sources/CMapboxDirections/include/MBRouteOptions.h b/Sources/CMapboxDirections/include/MBRouteOptions.h deleted file mode 100644 index c3f12179d..000000000 --- a/Sources/CMapboxDirections/include/MBRouteOptions.h +++ /dev/null @@ -1,58 +0,0 @@ -#import - -#pragma mark - Specifying the Routing Profile - -/** - Options determining the primary mode of transportation for the routes. - */ -typedef NSString * MBDirectionsProfileIdentifier NS_EXTENSIBLE_STRING_ENUM; - -/** - The returned directions are appropriate for driving or riding a car, truck, or motorcycle. - - This profile prioritizes fast routes by preferring high-speed roads like highways. A driving route may use a ferry where necessary. - */ -extern MBDirectionsProfileIdentifier const MBDirectionsProfileIdentifierAutomobile; - -/** - The returned directions are appropriate for driving or riding a car, truck, or motorcycle. - - This profile avoids traffic congestion based on current traffic data. A driving route may use a ferry where necessary. - - Traffic data is available in [a number of countries and territories worldwide](https://docs.mapbox.com/help/how-mapbox-works/directions/#traffic-data). Where traffic data is unavailable, this profile prefers high-speed roads like highways, similar to `MBDirectionsProfileIdentifierAutomobile`. - */ -extern MBDirectionsProfileIdentifier const MBDirectionsProfileIdentifierAutomobileAvoidingTraffic; - -/** - The returned directions are appropriate for riding a bicycle. - - This profile prioritizes short, safe routes by avoiding highways and preferring cycling infrastructure, such as bike lanes on surface streets. A cycling route may, where necessary, use other modes of transportation, such as ferries or trains, or require dismounting the bicycle for a distance. - */ -extern MBDirectionsProfileIdentifier const MBDirectionsProfileIdentifierCycling; - -/** - The returned directions are appropriate for walking or hiking. - - This profile prioritizes short routes, making use of sidewalks and trails where available. A walking route may use other modes of transportation, such as ferries or trains, where necessary. - */ -extern MBDirectionsProfileIdentifier const MBDirectionsProfileIdentifierWalking; - -/** - A number that influences whether a route should prefer or avoid roadways or pathways of a given type. - */ -typedef double MBDirectionsPriority NS_TYPED_EXTENSIBLE_ENUM; - -/** - The priority level with which a route avoids a particular type of roadway or pathway. - */ -extern const MBDirectionsPriority MBDirectionsPriorityLow; - -/** - The priority level with which a route neither avoids nor prefers a particular type of roadway or pathway. - */ -extern const MBDirectionsPriority MBDirectionsPriorityDefault; - -/** - The priority level with which a route prefers a particular type of roadway or pathway. - */ -extern const MBDirectionsPriority MBDirectionsPriorityHigh; diff --git a/Sources/MapboxDirections/AttributeOptions.swift b/Sources/MapboxDirections/AttributeOptions.swift new file mode 100644 index 000000000..5d8c9dac2 --- /dev/null +++ b/Sources/MapboxDirections/AttributeOptions.swift @@ -0,0 +1,88 @@ +import Foundation +#if SWIFT_PACKAGE +import CMapboxDirections +#endif + + + +public struct AttributeOptions: OptionSet, CustomStringConvertible { + public typealias RawValue = Int + + public var rawValue: Int + + public init(rawValue: AttributeOptions.RawValue) { + self.rawValue = rawValue + } + + /** + Distance (in meters) along the segment. + + When this attribute is specified, the `RouteLeg.segmentDistances` property contains one value for each segment in the leg’s full geometry. + */ + static let distance = AttributeOptions(rawValue: 1 << 1) + + /** + Expected travel time (in seconds) along the segment. + + When this attribute is specified, the `RouteLeg.expectedSegmentTravelTimes` property contains one value for each segment in the leg’s full geometry. + */ + static let expectedTravelTime = AttributeOptions(rawValue: 1 << 2) + + /** + Current average speed (in meters per second) along the segment. + + When this attribute is specified, the `RouteLeg.segmentSpeeds` property contains one value for each segment in the leg’s full geometry. + */ + static let speed = AttributeOptions(rawValue: 1 << 3) + + /** + Traffic congestion level along the segment. + + When this attribute is specified, the `RouteLeg.congestionLevels` property contains one value for each segment in the leg’s full geometry. + + This attribute requires `MBDirectionsProfileIdentifierAutomobileAvoidingTraffic`. Any other profile identifier produces `CongestionLevel.unknown` for each segment along the route. + */ + static let congestionLevel = AttributeOptions(rawValue: 1 << 4) + + + /** + Creates an AttributeOptions from the given description strings. + */ + public init?(descriptions: [String]) { + var attributeOptions: AttributeOptions = [] + for description in descriptions { + switch description { + case "distance": + attributeOptions.update(with: .distance) + case "duration": + attributeOptions.update(with: .expectedTravelTime) + case "speed": + attributeOptions.update(with: .speed) + case "congestion": + attributeOptions.update(with: .congestionLevel) + case "": + continue + default: + return nil + } + } + self.init(rawValue: attributeOptions.rawValue) + } + + public var description: String { + var descriptions: [String] = [] + if contains(.distance) { + descriptions.append("distance") + } + if contains(.expectedTravelTime) { + descriptions.append("duration") + } + if contains(.speed) { + descriptions.append("speed") + } + if contains(.congestionLevel) { + descriptions.append("congestion") + } + return descriptions.joined(separator: ",") + } +} diff --git a/Sources/MapboxDirections/DirectionsProfileIdentifier.swift b/Sources/MapboxDirections/DirectionsProfileIdentifier.swift new file mode 100644 index 000000000..bff9ed354 --- /dev/null +++ b/Sources/MapboxDirections/DirectionsProfileIdentifier.swift @@ -0,0 +1,67 @@ +import Foundation + +@available(*, deprecated, renamed: "DirectionsProfileIdentifier") +public typealias MBDirectionsProfileIdentifier = DirectionsProfileIdentifier + + +/** +The returned directions are appropriate for driving or riding a car, truck, or motorcycle. + +This profile prioritizes fast routes by preferring high-speed roads like highways. A driving route may use a ferry where necessary. +*/ +public struct DirectionsProfileIdentifier: RawRepresentable { + public init?(rawValue: String) { + self.rawValue = rawValue + } + + public var rawValue: String + + public typealias RawValue = String + + /** + The returned directions are appropriate for driving or riding a car, truck, or motorcycle. + + This profile prioritizes fast routes by preferring high-speed roads like highways. A driving route may use a ferry where necessary. + */ + static let automobile: String = "mapbox/driving" + + /** + The returned directions are appropriate for driving or riding a car, truck, or motorcycle. + + This profile avoids traffic congestion based on current traffic data. A driving route may use a ferry where necessary. + + Traffic data is available in [a number of countries and territories worldwide](https://docs.mapbox.com/help/how-mapbox-works/directions/#traffic-data). Where traffic data is unavailable, this profile prefers high-speed roads like highways, similar to `DirectionsProfileIdentifier.Automobile`. + */ + static let automobileAvoidingTraffic: String = "mapbox/driving-traffic" + + /** + The returned directions are appropriate for riding a bicycle. + + This profile prioritizes short, safe routes by avoiding highways and preferring cycling infrastructure, such as bike lanes on surface streets. A cycling route may, where necessary, use other modes of transportation, such as ferries or trains, or require dismounting the bicycle for a distance. + */ + static let cycling: String = "mapbox/cycling" + + /** + The returned directions are appropriate for walking or hiking. + + This profile prioritizes short routes, making use of sidewalks and trails where available. A walking route may use other modes of transportation, such as ferries or trains, where necessary. + */ + static let walking: String = "mapbox/walking" +} + +@available(*, deprecated, renamed: "DirectionsPriority") +public typealias MBDirectionsPriority = DirectionsPriority + +public struct DirectionsPriority: RawRepresentable { + public init?(rawValue: Double) { + self.rawValue = rawValue + } + + public var rawValue: Double + + public typealias RawValue = Double + + static let low = -1.0 + static let `default` = 0.0 + static let high = 1.0 +} diff --git a/Sources/MapboxDirections/MBAttribute.swift b/Sources/MapboxDirections/MBAttribute.swift deleted file mode 100644 index 2ea2b61b9..000000000 --- a/Sources/MapboxDirections/MBAttribute.swift +++ /dev/null @@ -1,50 +0,0 @@ -import Foundation -#if SWIFT_PACKAGE -import CMapboxDirections -#endif - - -public typealias AttributeOptions = MBAttributeOptions - -extension AttributeOptions: CustomStringConvertible { - /** - Creates an AttributeOptions from the given description strings. - */ - public init?(descriptions: [String]) { - var attributeOptions: AttributeOptions = [] - for description in descriptions { - switch description { - case "distance": - attributeOptions.update(with: .distance) - case "duration": - attributeOptions.update(with: .expectedTravelTime) - case "speed": - attributeOptions.update(with: .speed) - case "congestion": - attributeOptions.update(with: .congestionLevel) - case "": - continue - default: - return nil - } - } - self.init(rawValue: attributeOptions.rawValue) - } - - public var description: String { - var descriptions: [String] = [] - if contains(.distance) { - descriptions.append("distance") - } - if contains(.expectedTravelTime) { - descriptions.append("duration") - } - if contains(.speed) { - descriptions.append("speed") - } - if contains(.congestionLevel) { - descriptions.append("congestion") - } - return descriptions.joined(separator: ",") - } -} diff --git a/Sources/MapboxDirections/MBLaneIndication.swift b/Sources/MapboxDirections/MBLaneIndication.swift index 0b58e6278..72c07979d 100644 --- a/Sources/MapboxDirections/MBLaneIndication.swift +++ b/Sources/MapboxDirections/MBLaneIndication.swift @@ -4,10 +4,41 @@ import CMapboxDirections #endif -public typealias LaneIndication = MBLaneIndication +public struct LaneIndication: OptionSet, CustomStringConvertible { + public var rawValue: Int + + public init(rawValue: Int) { + self.rawValue = rawValue + } + + + public typealias RawValue = Int + /// Indicates a sharp turn to the right. + static let sharpRight = LaneIndication(rawValue: 1 << 1) + + /// Indicates a turn to the right. + static let right = LaneIndication(rawValue: 1 << 2) + + /// Indicates a turn to the right. + static let slightRight = LaneIndication(rawValue: 1 << 3) + + /// Indicates no turn. + static let straightAhead = LaneIndication(rawValue: 1 << 4) + + /// Indicates a slight turn to the left. + static let slightLeft = LaneIndication(rawValue: 1 << 5) + + /// Indicates a turn to the left. + static let left = LaneIndication(rawValue: 1 << 6) + + /// Indicates a sharp turn to the left. + static let sharpLeft = LaneIndication(rawValue: 1 << 7) + + /// Indicates a U-turn. + static let uTurn = LaneIndication(rawValue: 1 << 8) + -extension LaneIndication: CustomStringConvertible { /** Creates a lane indication from the given description strings. */ diff --git a/Sources/MapboxDirections/MBRoadClasses.swift b/Sources/MapboxDirections/MBRoadClasses.swift deleted file mode 100644 index a4cffd973..000000000 --- a/Sources/MapboxDirections/MBRoadClasses.swift +++ /dev/null @@ -1,60 +0,0 @@ -import Foundation -#if SWIFT_PACKAGE -import CMapboxDirections -#endif - - -public typealias RoadClasses = MBRoadClasses - -extension RoadClasses: CustomStringConvertible { - - /** - Creates a `RoadClasses` given an array of strings. - */ - public init?(descriptions: [String]) { - var roadClasses: RoadClasses = [] - for description in descriptions { - switch description { - case "toll": - roadClasses.insert(.toll) - case "restricted": - roadClasses.insert(.restricted) - case "motorway": - roadClasses.insert(.motorway) - case "ferry": - roadClasses.insert(.ferry) - case "tunnel": - roadClasses.insert(.tunnel) - case "none": - break - default: - return nil - } - } - self.init(rawValue: roadClasses.rawValue) - } - - public var description: String { - if isEmpty { - return "" - } - - var descriptions: [String] = [] - if contains(.toll) { - descriptions.append("toll") - } - if contains(.restricted) { - descriptions.append("restricted") - } - if contains(.motorway) { - descriptions.append("motorway") - } - if contains(.ferry) { - descriptions.append("ferry") - } - if contains(.tunnel) { - descriptions.append("tunnel") - } - return descriptions.joined(separator: ",") - } -} diff --git a/Sources/MapboxDirections/MapboxDirections.h b/Sources/MapboxDirections/MapboxDirections.h index 1e8203993..97e6721f7 100644 --- a/Sources/MapboxDirections/MapboxDirections.h +++ b/Sources/MapboxDirections/MapboxDirections.h @@ -6,7 +6,3 @@ FOUNDATION_EXPORT double MapboxDirectionsVersionNumber; //! Project version string for MapboxDirections. FOUNDATION_EXPORT const unsigned char MapboxDirectionsVersionString[]; - -#if !SWIFT_PACKAGE -#import "CMapboxDirections.h" -#endif diff --git a/Sources/MapboxDirections/Match/MBMatchOptions.swift b/Sources/MapboxDirections/Match/MBMatchOptions.swift index 28ee79759..920a4db13 100644 --- a/Sources/MapboxDirections/Match/MBMatchOptions.swift +++ b/Sources/MapboxDirections/Match/MBMatchOptions.swift @@ -10,8 +10,6 @@ import CMapboxDirections Pass an instance of this class into the `Directions.calculate(_:completionHandler:)` method. */ -@objcMembers -@objc(MBMatchOptions) open class MatchOptions: DirectionsOptions { /** @@ -20,7 +18,7 @@ open class MatchOptions: DirectionsOptions { - parameter locations: An array of `CLLocation` objects representing locations to attempt to match against the road network. The array should contain at least two locations (the source and destination) and at most 100 locations. (Some profiles, such as `MBDirectionsProfileIdentifierAutomobileAvoidingTraffic`, [may have lower limits](https://docs.mapbox.com/api/navigation/#directions).) - parameter profileIdentifier: A string specifying the primary mode of transportation for the routes. This parameter, if set, should be set to `MBDirectionsProfileIdentifierAutomobile`, `MBDirectionsProfileIdentifierAutomobileAvoidingTraffic`, `MBDirectionsProfileIdentifierCycling`, or `MBDirectionsProfileIdentifierWalking`. `MBDirectionsProfileIdentifierAutomobile` is used by default. */ - @objc public convenience init(locations: [CLLocation], profileIdentifier: MBDirectionsProfileIdentifier? = nil) { + public convenience init(locations: [CLLocation], profileIdentifier: MBDirectionsProfileIdentifier? = nil) { let waypoints = locations.map { Waypoint(location: $0) } @@ -33,21 +31,21 @@ open class MatchOptions: DirectionsOptions { - parameter coordinates: An array of geographic coordinates representing locations to attempt to match against the road network. The array should contain at least two locations (the source and destination) and at most 100 locations. (Some profiles, such as `MBDirectionsProfileIdentifierAutomobileAvoidingTraffic`, [may have lower limits](https://docs.mapbox.com/api/navigation/#directions).) Each coordinate is converted into a `Waypoint` object. - parameter profileIdentifier: A string specifying the primary mode of transportation for the routes. This parameter, if set, should be set to `MBDirectionsProfileIdentifierAutomobile`, `MBDirectionsProfileIdentifierAutomobileAvoidingTraffic`, `MBDirectionsProfileIdentifierCycling`, or `MBDirectionsProfileIdentifierWalking`. `MBDirectionsProfileIdentifierAutomobile` is used by default. */ - @objc public convenience init(coordinates: [CLLocationCoordinate2D], profileIdentifier: MBDirectionsProfileIdentifier? = nil) { + public convenience init(coordinates: [CLLocationCoordinate2D], profileIdentifier: MBDirectionsProfileIdentifier? = nil) { let waypoints = coordinates.map { Waypoint(coordinate: $0) } self.init(waypoints: waypoints, profileIdentifier: profileIdentifier) } - @objc public required init(waypoints: [Waypoint], profileIdentifier: MBDirectionsProfileIdentifier?) { + public required init(waypoints: [Waypoint], profileIdentifier: MBDirectionsProfileIdentifier?) { super.init(waypoints: waypoints, profileIdentifier: profileIdentifier) } /** If true, the input locations are re-sampled for improved map matching results. The default is `false`. */ - @objc open var resamplesTraces: Bool = false + open var resamplesTraces: Bool = false /** diff --git a/Sources/MapboxDirections/RoadClasses.swift b/Sources/MapboxDirections/RoadClasses.swift new file mode 100644 index 000000000..de439871d --- /dev/null +++ b/Sources/MapboxDirections/RoadClasses.swift @@ -0,0 +1,105 @@ +import Foundation +#if SWIFT_PACKAGE +import CMapboxDirections +#endif + + +/** +Option set that contains attributes of a road segment. +*/ +public struct RoadClasses: OptionSet, CustomStringConvertible { + public var rawValue: Int + + public init(rawValue: Int) { + self.rawValue = rawValue + } + + + public typealias RawValue = Int + + + /** + The road segment is [tolled](https://wiki.openstreetmap.org/wiki/Key:toll). + */ + static let toll = RoadClasses(rawValue: 1 << 1) + + /** + The road segment has access restrictions. + + A road segment may have this class if there are [general access restrictions](https://wiki.openstreetmap.org/wiki/Key:access) or a [high-occupancy vehicle](https://wiki.openstreetmap.org/wiki/Key:hov) restriction. + */ + static let restricted = RoadClasses(rawValue: 1 << 2) + + /** + The road segment is a [freeway](https://wiki.openstreetmap.org/wiki/Tag:highway%3Dmotorway) or [freeway ramp](https://wiki.openstreetmap.org/wiki/Tag:highway%3Dmotorway_link). + + It may be desirable to suppress the name of the freeway when giving instructions and give instructions at fixed distances before an exit (such as 1 mile or 1 kilometer ahead). + */ + static let motorway = RoadClasses(rawValue: 1 << 3) + + /** + The user must travel this segment of the route by ferry. + + The user should verify that the ferry is in operation. For driving and cycling directions, the user should also verify that his or her vehicle is permitted onboard the ferry. + + In general, the transport type of the step containing the road segment is also `TransportType.ferry`. + */ + static let ferry = RoadClasses(rawValue: 1 << 4) + + /** + The user must travel this segment of the route through a [tunnel](https://wiki.openstreetmap.org/wiki/Key:tunnel). + */ + static let tunnel = RoadClasses(rawValue: 1 << 5) + + + + /** + Creates a `RoadClasses` given an array of strings. + */ + public init?(descriptions: [String]) { + var roadClasses: RoadClasses = [] + for description in descriptions { + switch description { + case "toll": + roadClasses.insert(.toll) + case "restricted": + roadClasses.insert(.restricted) + case "motorway": + roadClasses.insert(.motorway) + case "ferry": + roadClasses.insert(.ferry) + case "tunnel": + roadClasses.insert(.tunnel) + case "none": + break + default: + return nil + } + } + self.init(rawValue: roadClasses.rawValue) + } + + public var description: String { + if isEmpty { + return "" + } + + var descriptions: [String] = [] + if contains(.toll) { + descriptions.append("toll") + } + if contains(.restricted) { + descriptions.append("restricted") + } + if contains(.motorway) { + descriptions.append("motorway") + } + if contains(.ferry) { + descriptions.append("ferry") + } + if contains(.tunnel) { + descriptions.append("tunnel") + } + return descriptions.joined(separator: ",") + } +} diff --git a/Tests/objc/BridgingTests.m b/Tests/objc/BridgingTests.m deleted file mode 100644 index 764f98f1a..000000000 --- a/Tests/objc/BridgingTests.m +++ /dev/null @@ -1,83 +0,0 @@ -#import -#import -@import MapboxDirections; - -@interface BridgingTests : XCTestCase -@end - -@implementation BridgingTests - -- (void)testDirections { - NSArray *locations = @[[[CLLocation alloc] initWithLatitude:0 longitude:1], - [[CLLocation alloc] initWithLatitude:2 longitude:3]]; - - MBRouteOptions *options = [[MBRouteOptions alloc] initWithLocations:locations - profileIdentifier:MBDirectionsProfileIdentifierAutomobileAvoidingTraffic]; - - MBDirections *directions = [[MBDirections alloc] initWithAccessToken:@"foo"]; - [directions calculateDirectionsWithOptions:options - completionHandler:^(NSArray * _Nullable waypoints, NSArray * _Nullable routes, NSError * _Nullable error) { - - }]; - - MBMatchOptions *matchOptions = [[MBMatchOptions alloc] initWithLocations:locations profileIdentifier:MBDirectionsProfileIdentifierAutomobileAvoidingTraffic]; - - XCTAssertNotNil(matchOptions); -} - -- (void)testRouteOptions { - NSArray *locations = @[[[CLLocation alloc] initWithLatitude:0 longitude:1], - [[CLLocation alloc] initWithLatitude:2 longitude:3]]; - -// NSArray *coordinates = @[[NSValue valueWithMKCoordinate:CLLocationCoordinate2DMake(0, 1)], -// [NSValue valueWithMKCoordinate:CLLocationCoordinate2DMake(2, 3)]]; - - NSArray *waypoints = @[[[MBWaypoint alloc] initWithCoordinate:CLLocationCoordinate2DMake(0, 1) coordinateAccuracy:-1 name:nil], - [[MBWaypoint alloc] initWithCoordinate:CLLocationCoordinate2DMake(2, 3) coordinateAccuracy:-1 name:nil]]; - - MBRouteOptions *options = nil; - - options = [[MBRouteOptions alloc] initWithLocations:locations profileIdentifier:MBDirectionsProfileIdentifierAutomobileAvoidingTraffic]; -// options = [[MBRouteOptions alloc] initWithCoordinates:coordinates profileIdentifier:MBDirectionsProfileIdentifierAutomobileAvoidingTraffic]; - options = [[MBRouteOptions alloc] initWithWaypoints:waypoints profileIdentifier:MBDirectionsProfileIdentifierAutomobileAvoidingTraffic]; -} - -- (void)testRoute { - NSString *filePath = [[NSBundle bundleForClass:[BridgingTests class]] pathForResource:@"subLaneInstructions" ofType:@"json"]; - NSURL *fileURL = [NSURL fileURLWithPath:filePath]; - NSData *data = [NSData dataWithContentsOfURL:fileURL]; - NSDictionary *response = [NSJSONSerialization JSONObjectWithData:data options:0 error:nil]; - NSArray *routes = [response objectForKey:@"routes"]; - NSDictionary *routeDict = routes[0]; - - NSArray *waypoints = @[[[MBWaypoint alloc] initWithCoordinate:CLLocationCoordinate2DMake(0, 1) coordinateAccuracy:-1 name:nil], - [[MBWaypoint alloc] initWithCoordinate:CLLocationCoordinate2DMake(2, 3) coordinateAccuracy:-1 name:nil]]; - - MBRouteOptions *options = [[MBRouteOptions alloc] initWithWaypoints:waypoints profileIdentifier:MBDirectionsProfileIdentifierAutomobileAvoidingTraffic]; - - MBRoute *route = [[MBRoute alloc] initWithJSON:routeDict waypoints:waypoints routeOptions:options]; - - MBRouteLeg *leg = route.legs[0]; - MBRouteStep *step = leg.steps[0]; - - MBVisualInstructionBanner *banner = step.instructionsDisplayedAlongStep[0]; - MBVisualInstruction *visualInstruction = banner.primaryInstruction; - - MBManeuverType type = visualInstruction.maneuverType; - MBManeuverDirection direction = visualInstruction.maneuverDirection; - - MBVisualInstruction *teriaryInstruction = banner.tertiaryInstruction; - NSArray> *components = teriaryInstruction.components; - - MBLaneIndicationComponent *component = (MBLaneIndicationComponent *)components[0]; - MBLaneIndication indications = component.indications; - - XCTAssertNotNil(leg); - XCTAssertNotNil(step); - XCTAssertNotNil(banner); - XCTAssertEqual(type, MBManeuverTypeTurn); - XCTAssertEqual(direction, MBManeuverDirectionRight); - XCTAssertEqual(indications, MBLaneIndicationStraightAhead); -} - -@end From a4a78e7500e65ee5a3165cb0f985b8046baccffc Mon Sep 17 00:00:00 2001 From: Jerrad Thramer Date: Thu, 26 Sep 2019 18:46:24 -0600 Subject: [PATCH 02/89] Finishing up. Only remaining thing to do is replace `NSSecureCoding` behavior with `Codable`, which is in-flight in #221. --- .../DirectionsProfileIdentifier.swift | 30 +++++---- .../MBComponentRepresentable.swift | 2 +- Sources/MapboxDirections/MBCongestion.swift | 2 +- .../MapboxDirections/MBCoordinateBounds.swift | 11 ++-- Sources/MapboxDirections/MBDirections.swift | 24 +++---- .../MBDirectionsOptions.swift | 40 ++++++------ .../MapboxDirections/MBDirectionsResult.swift | 36 +++++------ Sources/MapboxDirections/MBIntersection.swift | 18 +++--- Sources/MapboxDirections/MBLane.swift | 4 +- .../MBLaneIndicationComponent.swift | 4 +- Sources/MapboxDirections/MBRoute.swift | 8 +-- Sources/MapboxDirections/MBRouteLeg.swift | 34 +++++----- Sources/MapboxDirections/MBRouteOptions.swift | 20 +++--- Sources/MapboxDirections/MBRouteStep.swift | 62 +++++++++---------- .../MBSpokenInstruction.swift | 12 ++-- .../MBVisualInstruction.swift | 16 ++--- .../MBVisualInstructionBanner.swift | 16 ++--- .../MBVisualInstructionComponent.swift | 18 +++--- .../MBVisualInstructionType.swift | 2 +- Sources/MapboxDirections/MBWaypoint.swift | 26 ++++---- Sources/MapboxDirections/Match/MBMatch.swift | 13 ++-- .../Match/MBMatchOptions.swift | 12 ++-- .../MapboxDirections/Match/MBTracepoint.swift | 10 +-- .../MapboxDirections/OfflineDirections.swift | 6 +- .../WalkingOptionsTests.swift | 2 +- 25 files changed, 213 insertions(+), 215 deletions(-) diff --git a/Sources/MapboxDirections/DirectionsProfileIdentifier.swift b/Sources/MapboxDirections/DirectionsProfileIdentifier.swift index bff9ed354..9426945a2 100644 --- a/Sources/MapboxDirections/DirectionsProfileIdentifier.swift +++ b/Sources/MapboxDirections/DirectionsProfileIdentifier.swift @@ -9,21 +9,27 @@ The returned directions are appropriate for driving or riding a car, truck, or m This profile prioritizes fast routes by preferring high-speed roads like highways. A driving route may use a ferry where necessary. */ -public struct DirectionsProfileIdentifier: RawRepresentable { - public init?(rawValue: String) { +public struct DirectionsProfileIdentifier: Equatable, Hashable, RawRepresentable, ExpressibleByStringLiteral { + public typealias StringLiteralType = String + public typealias RawValue = String + + public init(stringLiteral value: Self.StringLiteralType) { + self.init(rawValue: value) + } + + public init(rawValue: String) { self.rawValue = rawValue } public var rawValue: String - public typealias RawValue = String /** The returned directions are appropriate for driving or riding a car, truck, or motorcycle. This profile prioritizes fast routes by preferring high-speed roads like highways. A driving route may use a ferry where necessary. */ - static let automobile: String = "mapbox/driving" + public static let automobile: DirectionsProfileIdentifier = "mapbox/driving" /** The returned directions are appropriate for driving or riding a car, truck, or motorcycle. @@ -32,28 +38,28 @@ public struct DirectionsProfileIdentifier: RawRepresentable { Traffic data is available in [a number of countries and territories worldwide](https://docs.mapbox.com/help/how-mapbox-works/directions/#traffic-data). Where traffic data is unavailable, this profile prefers high-speed roads like highways, similar to `DirectionsProfileIdentifier.Automobile`. */ - static let automobileAvoidingTraffic: String = "mapbox/driving-traffic" + public static let automobileAvoidingTraffic: DirectionsProfileIdentifier = "mapbox/driving-traffic" /** The returned directions are appropriate for riding a bicycle. This profile prioritizes short, safe routes by avoiding highways and preferring cycling infrastructure, such as bike lanes on surface streets. A cycling route may, where necessary, use other modes of transportation, such as ferries or trains, or require dismounting the bicycle for a distance. */ - static let cycling: String = "mapbox/cycling" + public static let cycling: DirectionsProfileIdentifier = "mapbox/cycling" /** The returned directions are appropriate for walking or hiking. This profile prioritizes short routes, making use of sidewalks and trails where available. A walking route may use other modes of transportation, such as ferries or trains, where necessary. */ - static let walking: String = "mapbox/walking" + public static let walking: DirectionsProfileIdentifier = "mapbox/walking" } @available(*, deprecated, renamed: "DirectionsPriority") public typealias MBDirectionsPriority = DirectionsPriority -public struct DirectionsPriority: RawRepresentable { - public init?(rawValue: Double) { +public struct DirectionsPriority: Equatable, Hashable, RawRepresentable { + public init(rawValue: Double) { self.rawValue = rawValue } @@ -61,7 +67,7 @@ public struct DirectionsPriority: RawRepresentable { public typealias RawValue = Double - static let low = -1.0 - static let `default` = 0.0 - static let high = 1.0 + static let low = DirectionsPriority(rawValue: -1.0) + static let `default` = DirectionsPriority(rawValue: 0.0) + static let high = DirectionsPriority(rawValue: 1.0) } diff --git a/Sources/MapboxDirections/MBComponentRepresentable.swift b/Sources/MapboxDirections/MBComponentRepresentable.swift index 717c6f68e..c89f94932 100644 --- a/Sources/MapboxDirections/MBComponentRepresentable.swift +++ b/Sources/MapboxDirections/MBComponentRepresentable.swift @@ -3,5 +3,5 @@ import Foundation /** The component representable protocol that comprises what the instruction banner should display. */ -@objc(MBComponentRepresentable) + public protocol ComponentRepresentable: class, NSSecureCoding { } diff --git a/Sources/MapboxDirections/MBCongestion.swift b/Sources/MapboxDirections/MBCongestion.swift index 5cbc29be6..aba2c5fd7 100644 --- a/Sources/MapboxDirections/MBCongestion.swift +++ b/Sources/MapboxDirections/MBCongestion.swift @@ -3,7 +3,7 @@ import Foundation /** A `CongestionLevel` indicates the level of traffic congestion along a road segment relative to the normal flow of traffic along that segment. You can color-code a route line according to the congestion level along each segment of the route. */ -@objc(MBCongestionLevel) + public enum CongestionLevel: Int, CustomStringConvertible { /** There is not enough data to determine the level of congestion along the road segment. diff --git a/Sources/MapboxDirections/MBCoordinateBounds.swift b/Sources/MapboxDirections/MBCoordinateBounds.swift index bd732b1c8..792665fe5 100644 --- a/Sources/MapboxDirections/MBCoordinateBounds.swift +++ b/Sources/MapboxDirections/MBCoordinateBounds.swift @@ -4,7 +4,7 @@ import CoreLocation /** A bounding box represents a geographic region. */ -@objc(MBCoordinateBounds) + public class CoordinateBounds: NSObject, Codable { let southWest: CLLocationCoordinate2D let northEast: CLLocationCoordinate2D @@ -12,8 +12,7 @@ public class CoordinateBounds: NSObject, Codable { /** Initializes a `BoundingBox` with known bounds. */ - @objc - public init(southWest: CLLocationCoordinate2D, northEast: CLLocationCoordinate2D) { + public init(southWest: CLLocationCoordinate2D, northEast: CLLocationCoordinate2D) { self.southWest = southWest self.northEast = northEast super.init() @@ -22,8 +21,7 @@ public class CoordinateBounds: NSObject, Codable { /** Initializes a `BoundingBox` with known bounds. */ - @objc - public init(northWest: CLLocationCoordinate2D, southEast: CLLocationCoordinate2D) { + public init(northWest: CLLocationCoordinate2D, southEast: CLLocationCoordinate2D) { self.southWest = CLLocationCoordinate2D(latitude: southEast.latitude, longitude: northWest.longitude) self.northEast = CLLocationCoordinate2D(latitude: northWest.latitude, longitude: southEast.longitude) super.init() @@ -32,8 +30,7 @@ public class CoordinateBounds: NSObject, Codable { /** Initializes a `BoundingBox` from an array of `CLLocationCoordinate2D`’s. */ - @objc - convenience public init(coordinates: [CLLocationCoordinate2D]) { + convenience public init(coordinates: [CLLocationCoordinate2D]) { assert(coordinates.count >= 2, "coordinates must consist of at least two coordinates") var maximumLatitude: CLLocationDegrees = -90 diff --git a/Sources/MapboxDirections/MBDirections.swift b/Sources/MapboxDirections/MBDirections.swift index 57fbc9914..b12b2f430 100644 --- a/Sources/MapboxDirections/MBDirections.swift +++ b/Sources/MapboxDirections/MBDirections.swift @@ -66,7 +66,7 @@ let userAgent: String = { Each result produced by the directions object is stored in a `Route` object. Depending on the `RouteOptions` object you provide, each route may include detailed information suitable for turn-by-turn directions, or it may include only high-level information such as the distance, estimated travel time, and name of each leg of the trip. The waypoints that form the request may be conflated with nearby locations, as appropriate; the resulting waypoints are provided to the closure. */ -@objc(MBDirections) + open class Directions: NSObject { /** A closure (block) to be called when a directions request is complete. @@ -96,18 +96,18 @@ open class Directions: NSObject { To use this object, a Mapbox [access token](https://docs.mapbox.com/help/glossary/access-token/) should be specified in the `MGLMapboxAccessToken` key in the main application bundle’s Info.plist. */ - @objc(sharedDirections) + public static let shared = Directions(accessToken: nil) /** The API endpoint to use when requesting directions. */ - @objc public private(set) var apiEndpoint: URL + public private(set) var apiEndpoint: URL /** The Mapbox access token to associate with the request. */ - @objc public let accessToken: String + public let accessToken: String /** Initializes a newly created directions object with an optional access token and host. @@ -115,7 +115,7 @@ open class Directions: NSObject { - parameter accessToken: A Mapbox [access token](https://docs.mapbox.com/help/glossary/access-token/). If an access token is not specified when initializing the directions object, it should be specified in the `MGLMapboxAccessToken` key in the main application bundle’s Info.plist. - parameter host: An optional hostname to the server API. The [Mapbox Directions API](https://docs.mapbox.com/api/navigation/#directions) endpoint is used by default. */ - @objc public init(accessToken: String?, host: String?) { + public init(accessToken: String?, host: String?) { let accessToken = accessToken ?? defaultAccessToken assert(accessToken != nil && !accessToken!.isEmpty, "A Mapbox access token is required. Go to . In Info.plist, set the MGLMapboxAccessToken key to your access token, or use the Directions(accessToken:host:) initializer.") @@ -139,7 +139,7 @@ open class Directions: NSObject { - parameter accessToken: A Mapbox [access token](https://docs.mapbox.com/help/glossary/access-token/). If an access token is not specified when initializing the directions object, it should be specified in the `MGLMapboxAccessToken` key in the main application bundle’s Info.plist. */ - @objc public convenience init(accessToken: String?) { + public convenience init(accessToken: String?) { self.init(accessToken: accessToken, host: nil) } @@ -156,7 +156,7 @@ open class Directions: NSObject { - parameter completionHandler: The closure (block) to call with the resulting routes. This closure is executed on the application’s main thread. - returns: The data task used to perform the HTTP request. If, while waiting for the completion handler to execute, you no longer want the resulting routes, cancel this task. */ - @objc(calculateDirectionsWithOptions:completionHandler:) + @discardableResult open func calculate(_ options: RouteOptions, completionHandler: @escaping RouteCompletionHandler) -> URLSessionDataTask { let fetchStartDate = Date() let task = dataTask(forCalculating: options, completionHandler: { (json) in @@ -184,7 +184,7 @@ open class Directions: NSObject { - parameter completionHandler: The closure (block) to call with the resulting matches. This closure is executed on the application’s main thread. - returns: The data task used to perform the HTTP request. If, while waiting for the completion handler to execute, you no longer want the resulting matches, cancel this task. */ - @objc(calculateMatchesWithOptions:completionHandler:) + @discardableResult open func calculate(_ options: MatchOptions, completionHandler: @escaping MatchCompletionHandler) -> URLSessionDataTask { let fetchStartDate = Date() let task = dataTask(forCalculating: options, completionHandler: { (json) in @@ -212,7 +212,7 @@ open class Directions: NSObject { - parameter completionHandler: The closure (block) to call with the resulting routes. This closure is executed on the application’s main thread. - returns: The data task used to perform the HTTP request. If, while waiting for the completion handler to execute, you no longer want the resulting routes, cancel this task. */ - @objc(calculateRoutesMatchingOptions:completionHandler:) + @discardableResult open func calculateRoutes(matching options: MatchOptions, completionHandler: @escaping RouteCompletionHandler) -> URLSessionDataTask { let fetchStartDate = Date() let task = dataTask(forCalculating: options, completionHandler: { (json) in @@ -274,7 +274,7 @@ open class Directions: NSObject { - parameter options: A `DirectionsOptions` object specifying the requirements for the resulting routes. - returns: The URL to send the request to. */ - @objc(URLForCalculatingDirectionsWithOptions:) + open func url(forCalculating options: DirectionsOptions) -> URL { return url(forCalculating: options, httpMethod: "GET") } @@ -290,7 +290,7 @@ open class Directions: NSObject { - parameter httpMethod: The HTTP method to use. The value of this argument should match the `URLRequest.httpMethod` of the request you send. Currently, only GET and POST requests are supported by the API. - returns: The URL to send the request to. */ - @objc(URLForCalculatingDirectionsWithOptions:HTTPMethod:) + open func url(forCalculating options: DirectionsOptions, httpMethod: String) -> URL { let includesQuery = httpMethod != "POST" var params = (includesQuery ? options.urlQueryItems : []) @@ -316,7 +316,7 @@ open class Directions: NSObject { - parameter options: A `DirectionsOptions` object specifying the requirements for the resulting routes. - returns: A GET or POST HTTP request to calculate the specified options. */ - @objc(URLRequestForCalculatingDirectionsWithOptions:) + open func urlRequest(forCalculating options: DirectionsOptions) -> URLRequest { let getURL = self.url(forCalculating: options, httpMethod: "GET") var request = URLRequest(url: getURL) diff --git a/Sources/MapboxDirections/MBDirectionsOptions.swift b/Sources/MapboxDirections/MBDirectionsOptions.swift index cdc57213a..a3cdeba76 100644 --- a/Sources/MapboxDirections/MBDirectionsOptions.swift +++ b/Sources/MapboxDirections/MBDirectionsOptions.swift @@ -17,7 +17,7 @@ let MaximumURLLength = 1024 * 8 /** A `RouteShapeFormat` indicates the format of a route or match shape in the raw HTTP response. */ -@objc(MBRouteShapeFormat) + public enum RouteShapeFormat: UInt, CustomStringConvertible { /** The route’s shape is delivered in [GeoJSON](http://geojson.org/) format. @@ -89,7 +89,7 @@ extension RouteShapeFormat { /** A `RouteShapeResolution` indicates the level of detail in a route’s shape, or whether the shape is present at all. */ -@objc(MBRouteShapeResolution) + public enum RouteShapeResolution: UInt, CustomStringConvertible { /** The route’s shape is omitted. @@ -140,7 +140,7 @@ public enum RouteShapeResolution: UInt, CustomStringConvertible { /** A system of units of measuring distances and other quantities. */ -@objc(MBMeasurementSystem) + public enum MeasurementSystem: UInt, CustomStringConvertible { /** @@ -183,7 +183,7 @@ public enum MeasurementSystem: UInt, CustomStringConvertible { /** A `RouteShapeFormat` indicates the format of a route’s shape in the raw HTTP response. */ -@objc(MBInstructionFormat) + public enum InstructionFormat: UInt, CustomStringConvertible { /** The route steps’ instructions are delivered in plain text format. @@ -224,8 +224,8 @@ public enum InstructionFormat: UInt, CustomStringConvertible { You do not create instances of this class directly. Instead, create instances of `MatchOptions` or `RouteOptions`. */ -@objcMembers -@objc(MBDirectionsOptions) + + open class DirectionsOptions: NSObject, NSSecureCoding, NSCopying { /** @@ -236,7 +236,7 @@ open class DirectionsOptions: NSObject, NSSecureCoding, NSCopying { - parameter waypoints: An array of `Waypoint` objects representing locations that the route should visit in chronological order. The array should contain at least two waypoints (the source and destination) and at most 25 waypoints. (Some profiles, such as `MBDirectionsProfileIdentifierAutomobileAvoidingTraffic`, [may have lower limits](https://docs.mapbox.com/api/navigation/#directions).) - parameter profileIdentifier: A string specifying the primary mode of transportation for the routes. This parameter, if set, should be set to `MBDirectionsProfileIdentifierAutomobile`, `MBDirectionsProfileIdentifierAutomobileAvoidingTraffic`, `MBDirectionsProfileIdentifierCycling`, or `MBDirectionsProfileIdentifierWalking`. `MBDirectionsProfileIdentifierAutomobile` is used by default. */ - required public init(waypoints: [Waypoint], profileIdentifier: MBDirectionsProfileIdentifier? = nil) { + required public init(waypoints: [Waypoint], profileIdentifier: DirectionsProfileIdentifier? = nil) { self.waypoints = waypoints self.profileIdentifier = profileIdentifier ?? .automobile } @@ -246,7 +246,7 @@ open class DirectionsOptions: NSObject, NSSecureCoding, NSCopying { } // MARK: NSCopying - @objc open func copy(with zone: NSZone? = nil) -> Any { + open func copy(with zone: NSZone? = nil) -> Any { let copy = type(of: self).init(waypoints: waypoints, profileIdentifier: profileIdentifier) copy.includesSteps = includesSteps copy.shapeFormat = shapeFormat @@ -265,7 +265,7 @@ open class DirectionsOptions: NSObject, NSSecureCoding, NSCopying { return isEqual(to: opts) } - @objc(isEqualToDirectionsOptions:) + open func isEqual(to directionsOptions: DirectionsOptions?) -> Bool { guard let other = directionsOptions else { return false } guard type(of: self) == type(of: other) else { return false } @@ -305,7 +305,7 @@ open class DirectionsOptions: NSObject, NSSecureCoding, NSCopying { return nil } - self.profileIdentifier = MBDirectionsProfileIdentifier(rawValue: profileIdentifier) + self.profileIdentifier = DirectionsProfileIdentifier(rawValue: profileIdentifier) includesSteps = decoder.decodeBool(forKey: "includesSteps") @@ -372,7 +372,7 @@ open class DirectionsOptions: NSObject, NSSecureCoding, NSCopying { The array should contain at least two waypoints (the source and destination) and at most 25 waypoints. */ - @objc open var waypoints: [Waypoint] + open var waypoints: [Waypoint] /** The waypoints that separate legs. @@ -389,7 +389,7 @@ open class DirectionsOptions: NSObject, NSSecureCoding, NSCopying { This property should be set to `MBDirectionsProfileIdentifierAutomobile`, `MBDirectionsProfileIdentifierAutomobileAvoidingTraffic`, `MBDirectionsProfileIdentifierCycling`, or `MBDirectionsProfileIdentifierWalking`. The default value of this property is `MBDirectionsProfileIdentifierAutomobile`, which specifies driving directions. */ - open var profileIdentifier: MBDirectionsProfileIdentifier + open var profileIdentifier: DirectionsProfileIdentifier /** A Boolean value indicating whether `MBRouteStep` objects should be included in the response. @@ -400,7 +400,7 @@ open class DirectionsOptions: NSObject, NSSecureCoding, NSCopying { The default value of this property is `false`. */ - @objc open var includesSteps = false + open var includesSteps = false /** Format of the data from which the shapes of the returned route and its steps are derived. @@ -409,7 +409,7 @@ open class DirectionsOptions: NSObject, NSSecureCoding, NSCopying { The default value of this property is `polyline`. */ - @objc open var shapeFormat = RouteShapeFormat.polyline + open var shapeFormat = RouteShapeFormat.polyline /** Resolution of the shape of the returned route. @@ -418,7 +418,7 @@ open class DirectionsOptions: NSObject, NSSecureCoding, NSCopying { The default value of this property is `low`, specifying a low-resolution route shape. */ - @objc open var routeShapeResolution = RouteShapeResolution.low + open var routeShapeResolution = RouteShapeResolution.low /** AttributeOptions for the route. Any combination of `AttributeOptions` can be specified. @@ -436,7 +436,7 @@ open class DirectionsOptions: NSObject, NSSecureCoding, NSCopying { By default, this property is set to the current system locale. */ - @objc open var locale = Locale.autoupdatingCurrent { + open var locale = Locale.autoupdatingCurrent { didSet { self.distanceMeasurementSystem = locale.usesMetric ? .metric : .imperial } @@ -447,7 +447,7 @@ open class DirectionsOptions: NSObject, NSSecureCoding, NSCopying { If this option is set to true, the `RouteStep.instructionsSpokenAlongStep` property is set to an array of `SpokenInstructions`. */ - @objc open var includesSpokenInstructions = false + open var includesSpokenInstructions = false /** The measurement system used in spoken instructions included in route steps. @@ -456,21 +456,21 @@ open class DirectionsOptions: NSObject, NSSecureCoding, NSCopying { You should choose a measurement system appropriate for the current region. You can also allow the user to indicate their preferred measurement system via a setting. */ - @objc open var distanceMeasurementSystem: MeasurementSystem = Locale.autoupdatingCurrent.usesMetric ? .metric : .imperial + open var distanceMeasurementSystem: MeasurementSystem = Locale.autoupdatingCurrent.usesMetric ? .metric : .imperial /** If true, each `RouteStep` will contain the property `visualInstructionsAlongStep`. `visualInstructionsAlongStep` contains an array of `VisualInstruction` objects used for visually conveying information about a given `RouteStep`. */ - @objc open var includesVisualInstructions = false + open var includesVisualInstructions = false /** An array of URL query items to include in an HTTP request. The query items are included in the URL of a GET request or the body of a POST request. */ - @objc(URLQueryItems) + open var urlQueryItems: [URLQueryItem] { var queryItems: [URLQueryItem] = [ URLQueryItem(name: "geometries", value: String(describing: shapeFormat)), diff --git a/Sources/MapboxDirections/MBDirectionsResult.swift b/Sources/MapboxDirections/MBDirectionsResult.swift index 5e9f83ec6..dfb0b5b09 100644 --- a/Sources/MapboxDirections/MBDirectionsResult.swift +++ b/Sources/MapboxDirections/MBDirectionsResult.swift @@ -8,12 +8,12 @@ import CoreLocation You do not create instances of this class directly. Instead, you receive `Route` or `Match` objects when you request directions using the `Directions.calculate(_:completionHandler:)` or `Directions.calculateRoutes(matching:completionHandler:)` method. */ -@objc(MBDirectionsResult) + open class DirectionsResult: NSObject, NSSecureCoding { public var json: [String: Any]? - @objc internal init(json: [String: Any]? = nil, legs: [RouteLeg], distance: CLLocationDistance, expectedTravelTime: TimeInterval, coordinates: [CLLocationCoordinate2D]?, speechLocale: Locale?, options: DirectionsOptions) { + internal init(json: [String: Any]? = nil, legs: [RouteLeg], distance: CLLocationDistance, expectedTravelTime: TimeInterval, coordinates: [CLLocationCoordinate2D]?, speechLocale: Locale?, options: DirectionsOptions) { self.json = json self.directionsOptions = options self.legs = legs @@ -23,7 +23,7 @@ open class DirectionsResult: NSObject, NSSecureCoding { self.speechLocale = speechLocale } - @objc public required init?(coder decoder: NSCoder) { + public required init?(coder decoder: NSCoder) { accessToken = decoder.decodeObject(of: NSString.self, forKey: "accessToken") as String? apiEndpoint = decoder.decodeObject(of: NSURL.self, forKey: "apiEndpoint") as URL? @@ -55,7 +55,7 @@ open class DirectionsResult: NSObject, NSSecureCoding { return true } - @objc public func encode(with coder: NSCoder) { + public func encode(with coder: NSCoder) { coder.encode(accessToken, forKey: "accessToken") coder.encode(apiEndpoint, forKey: "apiEndpoint") @@ -80,7 +80,7 @@ open class DirectionsResult: NSObject, NSSecureCoding { Using the [Mapbox Maps SDK for iOS](https://docs.mapbox.com/ios/maps/) or [Mapbox Maps SDK for macOS](https://mapbox.github.io/mapbox-gl-native/macos/), you can create an `MGLPolyline` object using these coordinates to display an overview of the route on an `MGLMapView`. */ - @objc public let coordinates: [CLLocationCoordinate2D]? + public let coordinates: [CLLocationCoordinate2D]? /** The number of coordinates. @@ -89,7 +89,7 @@ open class DirectionsResult: NSObject, NSSecureCoding { - note: This initializer is intended for Objective-C usage. In Swift code, use the `coordinates.count` property. */ - @objc open var coordinateCount: UInt { + open var coordinateCount: UInt { return UInt(coordinates?.count ?? 0) } @@ -106,7 +106,7 @@ open class DirectionsResult: NSObject, NSSecureCoding { - note: This initializer is intended for Objective-C usage. In Swift code, use the `coordinates` property. */ - @objc open func getCoordinates(_ coordinates: UnsafeMutablePointer) { + open func getCoordinates(_ coordinates: UnsafeMutablePointer) { for i in 0..<(self.coordinates?.count ?? 0) { coordinates.advanced(by: i).pointee = self.coordinates![i] } @@ -119,9 +119,9 @@ open class DirectionsResult: NSObject, NSSecureCoding { To determine the name of the route, concatenate the names of the route’s legs. */ - @objc public let legs: [RouteLeg] + public let legs: [RouteLeg] - @objc open override var description: String { + open override var description: String { return legs.map { $0.name }.joined(separator: " – ") } @@ -132,7 +132,7 @@ open class DirectionsResult: NSObject, NSSecureCoding { The value of this property accounts for the distance that the user must travel to traverse the path of the route. It is the sum of the `distance` properties of the route’s legs, not the sum of the direct distances between the route’s waypoints. You should not assume that the user would travel along this distance at a fixed speed. */ - @objc public let distance: CLLocationDistance + public let distance: CLLocationDistance /** The route’s expected travel time, measured in seconds. @@ -141,28 +141,28 @@ open class DirectionsResult: NSObject, NSSecureCoding { Do not assume that the user would travel along the route at a fixed speed. For more granular travel times, use the `RouteLeg.expectedTravelTime` or `RouteStep.expectedTravelTime`. For even more granularity, specify the `AttributeOptions.expectedTravelTime` option and use the `RouteLeg.expectedSegmentTravelTimes` property. */ - @objc public let expectedTravelTime: TimeInterval + public let expectedTravelTime: TimeInterval /** `RouteOptions` used to create the directions request. The route options object’s profileIdentifier property reflects the primary mode of transportation used for the route. Individual steps along the route might use different modes of transportation as necessary. */ - @objc public let directionsOptions: DirectionsOptions + public let directionsOptions: DirectionsOptions /** The [access token](https://docs.mapbox.com/help/glossary/access-token/) used to make the directions request. This property is set automatically if a request is made via `Directions.calculate(_:completionHandler:)`. */ - @objc open var accessToken: String? + open var accessToken: String? /** The endpoint used to make the directions request. This property is set automatically if a request is made via `Directions.calculate(_:completionHandler:)`. */ - @objc open var apiEndpoint: URL? + open var apiEndpoint: URL? func debugQuickLookObject() -> Any? { if let coordinates = coordinates { @@ -176,14 +176,14 @@ open class DirectionsResult: NSObject, NSSecureCoding { Each route produced by a single call to `Directions.calculate(_:completionHandler:)` has the same route identifier. */ - @objc open var routeIdentifier: String? + open var routeIdentifier: String? /** The locale to use for spoken instructions. This locale is specific to Mapbox Voice API. If `nil` is returned, the instruction should be spoken with an alternative speech synthesizer. */ - @objc open var speechLocale: Locale? + open var speechLocale: Locale? /** The time immediately before a `Directions` object fetched this result. @@ -192,7 +192,7 @@ open class DirectionsResult: NSObject, NSSecureCoding { This property does not persist after encoding and decoding. */ - @objc open var fetchStartDate: Date? + open var fetchStartDate: Date? /** The time immediately before a `Directions` object received the last byte of this result. @@ -201,5 +201,5 @@ open class DirectionsResult: NSObject, NSSecureCoding { This property does not persist after encoding and decoding. */ - @objc open var responseEndDate: Date? + open var responseEndDate: Date? } diff --git a/Sources/MapboxDirections/MBIntersection.swift b/Sources/MapboxDirections/MBIntersection.swift index e80557078..0f3fc8906 100644 --- a/Sources/MapboxDirections/MBIntersection.swift +++ b/Sources/MapboxDirections/MBIntersection.swift @@ -5,12 +5,12 @@ import CoreLocation /** A single cross street along a step. */ -@objc(MBIntersection) + public class Intersection: NSObject, NSSecureCoding { /** The geographic coordinates at the center of the intersection. */ - @objc public let location: CLLocationCoordinate2D + public let location: CLLocationCoordinate2D /** An array of `CLLocationDirection`s indicating the absolute headings of the roads that meet at the intersection. @@ -19,38 +19,38 @@ public class Intersection: NSObject, NSSecureCoding { A single road that passes through this intersection is represented by two items in this array: one for the segment that enters the intersection and one for the segment that exits it. */ - @objc public let headings: [CLLocationDirection] + public let headings: [CLLocationDirection] /** The indices of the items in the `headings` array that correspond to the roads that may be used to leave the intersection. This index set effectively excludes any one-way road that leads toward the intersection. */ - @objc public let outletIndexes: IndexSet + public let outletIndexes: IndexSet /** The index of the item in the `headings` array that corresponds to the road that the containing route step uses to approach the intersection. */ - @objc public let approachIndex: Int + public let approachIndex: Int /** The index of the item in the `headings` array that corresponds to the road that the containing route step uses to leave the intersection. */ - @objc public let outletIndex: Int + public let outletIndex: Int /** An array of `Lane` objects representing all the lanes of the road that the containing route step uses to approach the intersection. If no lane information is available for an intersection, this property’s value is `nil`. The first item corresponds to the leftmost lane, the second item corresponds to the second lane from the left, and so on, regardless of whether the surrounding country drives on the left or on the right. */ - @objc public let approachLanes: [Lane]? + public let approachLanes: [Lane]? /** The indices of the items in the `approachLanes` array that correspond to the roads that may be used to execute the maneuver. If no lane information is available for an intersection, this property’s value is `nil`. */ - @objc public let usableApproachLanes: IndexSet? + public let usableApproachLanes: IndexSet? /** The road classes of the road that the containing step uses to leave the intersection. @@ -127,7 +127,7 @@ public class Intersection: NSObject, NSSecureCoding { public static var supportsSecureCoding = true - @objc public func encode(with coder: NSCoder) { + public func encode(with coder: NSCoder) { coder.encode([ "latitude": location.latitude, "longitude": location.longitude, diff --git a/Sources/MapboxDirections/MBLane.swift b/Sources/MapboxDirections/MBLane.swift index 41b03808d..174f16983 100644 --- a/Sources/MapboxDirections/MBLane.swift +++ b/Sources/MapboxDirections/MBLane.swift @@ -3,8 +3,8 @@ import Foundation /** A lane on the road approaching an intersection. */ -@objcMembers -@objc(MBLane) + + public class Lane: NSObject, NSSecureCoding { /** The lane indications specifying the maneuvers that may be executed from the lane. diff --git a/Sources/MapboxDirections/MBLaneIndicationComponent.swift b/Sources/MapboxDirections/MBLaneIndicationComponent.swift index 6f2ee9d1c..9dbe75600 100644 --- a/Sources/MapboxDirections/MBLaneIndicationComponent.swift +++ b/Sources/MapboxDirections/MBLaneIndicationComponent.swift @@ -4,8 +4,8 @@ import Foundation /** A component that represents a lane representation of an instruction. */ -@objcMembers -@objc(MBLaneIndicationComponent) + + open class LaneIndicationComponent: NSObject, ComponentRepresentable { /** diff --git a/Sources/MapboxDirections/MBRoute.swift b/Sources/MapboxDirections/MBRoute.swift index 701ec9489..c8173fdf1 100644 --- a/Sources/MapboxDirections/MBRoute.swift +++ b/Sources/MapboxDirections/MBRoute.swift @@ -8,11 +8,11 @@ import Polyline Typically, you do not create instances of this class directly. Instead, you receive route objects when you request directions using the `Directions.calculate(_:completionHandler:)` method. However, if you use the `Directions.url(forCalculating:)` method instead, you can pass the results of the HTTP request into this class’s initializer. */ -@objc(MBRoute) + open class Route: DirectionsResult { // MARK: Creating a Route - @objc internal override init(json: [String : Any]? = nil, legs: [RouteLeg], distance: CLLocationDistance, expectedTravelTime: TimeInterval, coordinates: [CLLocationCoordinate2D]?, speechLocale: Locale?, options: DirectionsOptions) { + internal override init(json: [String : Any]? = nil, legs: [RouteLeg], distance: CLLocationDistance, expectedTravelTime: TimeInterval, coordinates: [CLLocationCoordinate2D]?, speechLocale: Locale?, options: DirectionsOptions) { super.init(json: json, legs: legs, distance: distance, expectedTravelTime: expectedTravelTime, coordinates: coordinates, speechLocale: speechLocale, options: options) } @@ -25,7 +25,7 @@ open class Route: DirectionsResult { - parameter waypoints: An array of waypoints that the route visits in chronological order. - parameter options: The options used when requesting the route. */ - @objc(initWithJSON:waypoints:routeOptions:) + public init(json: [String: Any], waypoints: [Waypoint], options: RouteOptions) { // Associate each leg JSON with a source and destination. The sequence of destinations is offset by one from the sequence of sources. let legInfo = zip(zip(waypoints.prefix(upTo: waypoints.endIndex - 1), waypoints.suffix(from: 1)), @@ -50,7 +50,7 @@ open class Route: DirectionsResult { return super.directionsOptions as! RouteOptions } - @objc public required init?(coder decoder: NSCoder) { + public required init?(coder decoder: NSCoder) { super.init(coder: decoder) } diff --git a/Sources/MapboxDirections/MBRouteLeg.swift b/Sources/MapboxDirections/MBRouteLeg.swift index b533df289..8b3f1de3d 100644 --- a/Sources/MapboxDirections/MBRouteLeg.swift +++ b/Sources/MapboxDirections/MBRouteLeg.swift @@ -11,13 +11,13 @@ import CMapboxDirections You do not create instances of this class directly. Instead, you receive route leg objects as part of route objects when you request directions using the `Directions.calculate(_:completionHandler:)` method. */ -@objcMembers -@objc(MBRouteLeg) + + open class RouteLeg: NSObject, NSSecureCoding { // MARK: Creating a Leg - @objc internal init(steps: [RouteStep], json: JSONDictionary, source: Waypoint, destination: Waypoint, options: RouteOptions) { + internal init(steps: [RouteStep], json: JSONDictionary, source: Waypoint, destination: Waypoint, options: RouteOptions) { self.source = source self.destination = destination self.profileIdentifier = options.profileIdentifier @@ -64,7 +64,7 @@ open class RouteLeg: NSObject, NSSecureCoding { - parameter destination: The waypoint at the end of the leg. - parameter options: The options used when requesting the route. */ - @objc(initWithJSON:source:destination:options:) + public convenience init(json: [String: Any], source: Waypoint, destination: Waypoint, options: RouteOptions) { let steps = (json["steps"] as? [JSONDictionary] ?? []).map { RouteStep(json: $0, options: options) } self.init(steps: steps, json: json, source: source, destination: destination, options: options) @@ -95,7 +95,7 @@ open class RouteLeg: NSObject, NSSecureCoding { return nil } - profileIdentifier = MBDirectionsProfileIdentifier(rawValue: decodedProfileIdentifier) + profileIdentifier = DirectionsProfileIdentifier(rawValue: decodedProfileIdentifier) segmentDistances = decoder.decodeObject(of: [NSArray.self, NSNumber.self], forKey: "segmentDistances") as? [CLLocationDistance] expectedSegmentTravelTimes = decoder.decodeObject(of: [NSArray.self, NSNumber.self], forKey: "expectedSegmentTravelTimes") as? [TimeInterval] @@ -103,7 +103,7 @@ open class RouteLeg: NSObject, NSSecureCoding { segmentCongestionLevels = decoder.decodeObject(of: [NSArray.self, NSNumber.self], forKey: "segmentCongestionLevels") as? [CongestionLevel] } - @objc public static var supportsSecureCoding = true + public static var supportsSecureCoding = true public func encode(with coder: NSCoder) { coder.encode(source, forKey: "source") @@ -126,14 +126,14 @@ open class RouteLeg: NSObject, NSSecureCoding { Unless this is the first leg of the route, the source of this leg is the same as the destination of the previous leg. */ - @objc public let source: Waypoint + public let source: Waypoint /** The endpoint of the route leg. Unless this is the last leg of the route, the destination of this leg is the same as the source of the next leg. */ - @objc public let destination: Waypoint + public let destination: Waypoint /** An array of one or more `RouteStep` objects representing the steps for traversing this leg of the route. @@ -142,7 +142,7 @@ open class RouteLeg: NSObject, NSSecureCoding { This array is empty if the `includesSteps` property of the original `RouteOptions` object is set to `false`. */ - @objc public let steps: [RouteStep] + public let steps: [RouteStep] /** @@ -150,7 +150,7 @@ open class RouteLeg: NSObject, NSSecureCoding { This property is set if the `RouteOptions.attributeOptions` property contains `.distance`. */ - @objc public let segmentDistances: [CLLocationDistance]? + public let segmentDistances: [CLLocationDistance]? /** An array containing the expected travel time (measured in seconds) between each coordinate in the route leg geometry. @@ -159,7 +159,7 @@ open class RouteLeg: NSObject, NSSecureCoding { This property is set if the `RouteOptions.attributeOptions` property contains `.expectedTravelTime`. */ - @objc public let expectedSegmentTravelTimes: [TimeInterval]? + public let expectedSegmentTravelTimes: [TimeInterval]? /** An array containing the expected average speed (measured in meters per second) between each coordinate in the route leg geometry. @@ -168,7 +168,7 @@ open class RouteLeg: NSObject, NSSecureCoding { This property is set if the `RouteOptions.attributeOptions` property contains `.speed`. */ - @objc public let segmentSpeeds: [CLLocationSpeed]? + public let segmentSpeeds: [CLLocationSpeed]? /** An array containing the traffic congestion level along each road segment in the route leg geometry. @@ -190,9 +190,9 @@ open class RouteLeg: NSObject, NSSecureCoding { The leg’s name does not identify the start and end points of the leg. To distinguish one leg from another within the same route, concatenate the `name` properties of the `source` and `destination` waypoints. */ - @objc public let name: String + public let name: String - @objc open override var description: String { + open override var description: String { return name } @@ -201,7 +201,7 @@ open class RouteLeg: NSObject, NSSecureCoding { The value of this property accounts for the distance that the user must travel to arrive at the destination from the source. It is not the direct distance between the source and destination, nor should not assume that the user would travel along this distance at a fixed speed. */ - @objc public let distance: CLLocationDistance + public let distance: CLLocationDistance /** The route leg’s expected travel time, measured in seconds. @@ -210,14 +210,14 @@ open class RouteLeg: NSObject, NSSecureCoding { Do not assume that the user would travel along the leg at a fixed speed. For the expected travel time on each individual segment along the leg, use the `RouteStep.expectedTravelTimes` property. For more granularity, specify the `AttributeOptions.expectedTravelTime` option and use the `expectedSegmentTravelTimes` property. */ - @objc public let expectedTravelTime: TimeInterval + public let expectedTravelTime: TimeInterval /** A string specifying the primary mode of transportation for the route leg. The value of this property is `MBDirectionsProfileIdentifierAutomobile`, `MBDirectionsProfileIdentifierAutomobileAvoidingTraffic`, `MBDirectionsProfileIdentifierCycling`, or `MBDirectionsProfileIdentifierWalking`, depending on the `profileIdentifier` property of the original `RouteOptions` object. This property reflects the primary mode of transportation used for the route leg. Individual steps along the route leg might use different modes of transportation as necessary. */ - public let profileIdentifier: MBDirectionsProfileIdentifier + public let profileIdentifier: DirectionsProfileIdentifier func debugQuickLookObject() -> Any? { let coordinates = steps.reduce([], { $0 + ($1.coordinates ?? []) }) diff --git a/Sources/MapboxDirections/MBRouteOptions.swift b/Sources/MapboxDirections/MBRouteOptions.swift index b94093708..346d61abb 100644 --- a/Sources/MapboxDirections/MBRouteOptions.swift +++ b/Sources/MapboxDirections/MBRouteOptions.swift @@ -25,8 +25,6 @@ public let MBMaximumWalkingSpeed: CLLocationSpeed = 6.94 Pass an instance of this class into the `Directions.calculate(_:completionHandler:)` method. */ -@objcMembers -@objc(MBRouteOptions) open class RouteOptions: DirectionsOptions { /** Initializes a route options object for routes between the given locations and an optional profile identifier. @@ -36,7 +34,7 @@ open class RouteOptions: DirectionsOptions { - parameter locations: An array of `CLLocation` objects representing locations that the route should visit in chronological order. The array should contain at least two locations (the source and destination) and at most 25 locations. Each location object is converted into a `Waypoint` object. This class respects the `CLLocation` class’s `coordinate` and `horizontalAccuracy` properties, converting them into the `Waypoint` class’s `coordinate` and `coordinateAccuracy` properties, respectively. - parameter profileIdentifier: A string specifying the primary mode of transportation for the routes. This parameter, if set, should be set to `MBDirectionsProfileIdentifierAutomobile`, `MBDirectionsProfileIdentifierAutomobileAvoidingTraffic`, `MBDirectionsProfileIdentifierCycling`, or `MBDirectionsProfileIdentifierWalking`. `MBDirectionsProfileIdentifierAutomobile` is used by default. */ - public convenience init(locations: [CLLocation], profileIdentifier: MBDirectionsProfileIdentifier? = nil) { + public convenience init(locations: [CLLocation], profileIdentifier: DirectionsProfileIdentifier? = nil) { let waypoints = locations.map { Waypoint(location: $0) } self.init(waypoints: waypoints, profileIdentifier: profileIdentifier) } @@ -47,7 +45,7 @@ open class RouteOptions: DirectionsOptions { - parameter coordinates: An array of geographic coordinates representing locations that the route should visit in chronological order. The array should contain at least two locations (the source and destination) and at most 25 locations. Each coordinate is converted into a `Waypoint` object. - parameter profileIdentifier: A string specifying the primary mode of transportation for the routes. This parameter, if set, should be set to `MBDirectionsProfileIdentifierAutomobile`, `MBDirectionsProfileIdentifierAutomobileAvoidingTraffic`, `MBDirectionsProfileIdentifierCycling`, or `MBDirectionsProfileIdentifierWalking`. `MBDirectionsProfileIdentifierAutomobile` is used by default. */ - public convenience init(coordinates: [CLLocationCoordinate2D], profileIdentifier: MBDirectionsProfileIdentifier? = nil) { + public convenience init(coordinates: [CLLocationCoordinate2D], profileIdentifier: DirectionsProfileIdentifier? = nil) { let waypoints = coordinates.map { Waypoint(coordinate: $0) } self.init(waypoints: waypoints, profileIdentifier: profileIdentifier) } @@ -58,7 +56,7 @@ open class RouteOptions: DirectionsOptions { - parameter waypoints: An array of `Waypoint` objects representing locations that the route should visit in chronological order. The array should contain at least two waypoints (the source and destination) and at most 25 waypoints. (Some profiles, such as `MBDirectionsProfileIdentifierAutomobileAvoidingTraffic`, [may have lower limits](https://docs.mapbox.com/api/navigation/#directions).) - parameter profileIdentifier: A string specifying the primary mode of transportation for the routes. This parameter, if set, should be set to `MBDirectionsProfileIdentifierAutomobile`, `MBDirectionsProfileIdentifierAutomobileAvoidingTraffic`, `MBDirectionsProfileIdentifierCycling`, or `MBDirectionsProfileIdentifierWalking`. `MBDirectionsProfileIdentifierAutomobile` is used by default. */ - public required init(waypoints: [Waypoint], profileIdentifier: MBDirectionsProfileIdentifier? = nil) { + public required init(waypoints: [Waypoint], profileIdentifier: DirectionsProfileIdentifier? = nil) { super.init(waypoints: waypoints, profileIdentifier: profileIdentifier) self.allowsUTurnAtWaypoint = ![MBDirectionsProfileIdentifier.automobile.rawValue, MBDirectionsProfileIdentifier.automobileAvoidingTraffic.rawValue].contains(self.profileIdentifier.rawValue) } @@ -86,8 +84,8 @@ open class RouteOptions: DirectionsOptions { let roadClassesToAvoidDescriptions = decoder.decodeObject(of: NSString.self, forKey: "roadClassesToAvoid") as String? roadClassesToAvoid = RoadClasses(descriptions: roadClassesToAvoidDescriptions?.components(separatedBy: ",") ?? []) ?? [] - alleyPriority = MBDirectionsPriority(rawValue: decoder.decodeDouble(forKey: "alleyPriority")) - walkwayPriority = MBDirectionsPriority(rawValue: decoder.decodeDouble(forKey: "walkwayPriority")) + alleyPriority = DirectionsPriority(rawValue: decoder.decodeDouble(forKey: "alleyPriority")) + walkwayPriority = DirectionsPriority(rawValue: decoder.decodeDouble(forKey: "walkwayPriority")) speed = decoder.decodeDouble(forKey: "speed") } @@ -149,7 +147,7 @@ open class RouteOptions: DirectionsOptions { The value of this property must be at least `MBDirectionsPriority.low` and at most `MBDirectionsPriority.high`. The default value of `MBDirectionsPriority.default` neither prefers nor avoids alleys, while a negative value between `MBDirectionsPriority.low` and `MBDirectionsPriority.default` avoids alleys, and a positive value between `MBDirectionsPriority.default` and `MBDirectionsPriority.high` prefers alleys. A value of 0.9 is suitable for pedestrians who are comfortable with walking down alleys. */ - open var alleyPriority: MBDirectionsPriority = .default + open var alleyPriority: DirectionsPriority = .default /** A number that influences whether the route should prefer or avoid roads or paths that are set aside for pedestrian-only use (walkways or footpaths). @@ -158,7 +156,7 @@ open class RouteOptions: DirectionsOptions { The value of this property must be at least `MBDirectionsPriority.low` and at most `MBDirectionsPriority.high`. The default value of `MBDirectionsPriority.default` neither prefers nor avoids walkways, while a negative value between `MBDirectionsPriority.low` and `MBDirectionsPriority.default` avoids walkways, and a positive value between `MBDirectionsPriority.default` and `MBDirectionsPriority.high` prefers walkways. A value of −0.1 results in less verbose routes in cities where sidewalks and crosswalks are generally mapped as separate footpaths. */ - open var walkwayPriority: MBDirectionsPriority = .default + open var walkwayPriority: DirectionsPriority = .default /** The expected uniform travel speed measured in meters per second. @@ -261,7 +259,7 @@ open class RouteOptions: DirectionsOptions { return isEqual(to: opts) } - @objc(isEqualToRouteOptions:) + open func isEqual(to routeOptions: RouteOptions?) -> Bool { guard let other = routeOptions else { return false } guard super.isEqual(to: routeOptions) else { return false } @@ -302,7 +300,7 @@ open class RouteOptionsV4: RouteOptions { */ open var includesShapes: Bool = true - public required init(waypoints: [Waypoint], profileIdentifier: MBDirectionsProfileIdentifier?) { + public required init(waypoints: [Waypoint], profileIdentifier: DirectionsProfileIdentifier?) { super.init(waypoints: waypoints, profileIdentifier: profileIdentifier) } diff --git a/Sources/MapboxDirections/MBRouteStep.swift b/Sources/MapboxDirections/MBRouteStep.swift index efc392998..fa481d71a 100644 --- a/Sources/MapboxDirections/MBRouteStep.swift +++ b/Sources/MapboxDirections/MBRouteStep.swift @@ -9,7 +9,7 @@ import CMapboxDirections /** A `TransportType` specifies the mode of transportation used for part of a route. */ -@objc(MBTransportType) + public enum TransportType: Int, CustomStringConvertible { // Possible transport types when the `profileIdentifier` is `MBDirectionsProfileIdentifierAutomobile` or `MBDirectionsProfileIdentifierAutomobileAvoidingTraffic` @@ -132,7 +132,7 @@ public func MBStringFromTransportType(transportType: TransportType) -> String { In Swift, you can use pattern matching with a single switch statement on a tuple containing the maneuver type and maneuver direction to avoid a complex series of if-else-if statements or switch statements. */ -@objc(MBManeuverType) + public enum ManeuverType: Int, CustomStringConvertible { /** The step does not have a particular maneuver type associated with it. @@ -370,7 +370,7 @@ public func MBStringFromManeuverType(maneuverType: ManeuverType) -> String { /** A `ManeuverDirection` clarifies a `ManeuverType` with directional information. The exact meaning of the maneuver direction for a given step depends on the step’s maneuver type; see the `ManeuverType` documentation for details. */ -@objc(MBManeuverDirection) + public enum ManeuverDirection: Int, CustomStringConvertible { /** The step does not have a particular maneuver direction associated with it. @@ -480,7 +480,7 @@ public func MBStringFromManeuverDirection(maneuverDirection: ManeuverDirection) /** A `DrivingSide` indicates which side of the road cars and traffic flow. */ -@objc(MBDrivingSide) + public enum DrivingSide: Int, CustomStringConvertible { /** Indicates driving occurs on the `left` side. @@ -586,7 +586,7 @@ struct Road { You do not create instances of this class directly. Instead, you receive route step objects as part of route objects when you request directions using the `Directions.calculate(_:completionHandler:)` method, setting the `includesSteps` option to `true` in the `RouteOptions` object that you pass into that method. */ -@objc(MBRouteStep) + open class RouteStep: NSObject, NSSecureCoding { // MARK: Creating a Step @@ -654,7 +654,7 @@ open class RouteStep: NSObject, NSSecureCoding { - parameter json: A JSON object that conforms to the [route step](https://docs.mapbox.com/api/navigation/#route-step-object) format described in the Directions API documentation. */ - @objc(initWithJSON:options:) + public convenience init(json: [String: Any], options: RouteOptions) { let maneuver = json["maneuver"] as! JSONDictionary let finalHeading = maneuver["bearing_after"] as? Double @@ -793,7 +793,7 @@ open class RouteStep: NSObject, NSSecureCoding { Using the [Mapbox Maps SDK for iOS](https://docs.mapbox.com/ios/maps/) or [Mapbox Maps SDK for macOS](https://mapbox.github.io/mapbox-gl-native/macos/), you can create an `MGLPolyline` object using these coordinates to display a portion of a route on an `MGLMapView`. */ - @objc public let coordinates: [CLLocationCoordinate2D]? + public let coordinates: [CLLocationCoordinate2D]? /** The number of coordinates. @@ -802,7 +802,7 @@ open class RouteStep: NSObject, NSSecureCoding { - note: This initializer is intended for Objective-C usage. In Swift code, use the `coordinates.count` property. */ - @objc open var coordinateCount: UInt { + open var coordinateCount: UInt { return UInt(coordinates?.count ?? 0) } @@ -820,7 +820,7 @@ open class RouteStep: NSObject, NSSecureCoding { - note: This initializer is intended for Objective-C usage. In Swift code, use the `coordinates` property. */ - @objc open func getCoordinates(_ coordinates: UnsafeMutablePointer) -> Bool { + open func getCoordinates(_ coordinates: UnsafeMutablePointer) -> Bool { guard let stepCoordinates = self.coordinates else { return false } @@ -840,7 +840,7 @@ open class RouteStep: NSObject, NSSecureCoding { - note: If you use MapboxDirections.swift with the Mapbox Directions API, this property is formatted and localized for display to the user. If you use OSRM directly, this property contains a basic string that only includes the maneuver type and direction. Use [OSRM Text Instructions](https://github.com/Project-OSRM/osrm-text-instructions.swift/) to construct a complete, localized instruction string for display. */ - @objc public let instructions: String + public let instructions: String /** Instructions about the next step’s maneuver, optimized for speech synthesis. @@ -849,7 +849,7 @@ open class RouteStep: NSObject, NSSecureCoding { This property is non-`nil` if the `RouteOptions.includesSpokenInstructions` option is set to `true`. For instructions designed for display, use the `instructions` property. */ - @objc public let instructionsSpokenAlongStep: [SpokenInstruction]? + public let instructionsSpokenAlongStep: [SpokenInstruction]? /** Instructions about the next step’s maneuver, optimized for display in real time. @@ -858,9 +858,9 @@ open class RouteStep: NSObject, NSSecureCoding { This property is non-`nil` if the `RouteOptions.includesVisualInstructions` option is set to `true`. For instructions designed for speech synthesis, use the `instructionsSpokenAlongStep` property. For instructions designed for display in a static list, use the `instructions` property. */ - @objc public let instructionsDisplayedAlongStep: [VisualInstructionBanner]? + public let instructionsDisplayedAlongStep: [VisualInstructionBanner]? - @objc open override var description: String { + open override var description: String { return instructions } @@ -879,12 +879,12 @@ open class RouteStep: NSObject, NSSecureCoding { /** The type of maneuver required for beginning this step. */ - @objc public let maneuverType: ManeuverType + public let maneuverType: ManeuverType /** Additional directional information to clarify the maneuver type. */ - @objc public let maneuverDirection: ManeuverDirection + public let maneuverDirection: ManeuverDirection /** Which side of a bidirectional road the driver should drive on, also known as the rule of the road. @@ -894,7 +894,7 @@ open class RouteStep: NSObject, NSSecureCoding { /** The location of the maneuver at the beginning of this step. */ - @objc public let maneuverLocation: CLLocationCoordinate2D + public let maneuverLocation: CLLocationCoordinate2D /** The number of exits from the previous maneuver up to and including this step’s maneuver. @@ -912,7 +912,7 @@ open class RouteStep: NSObject, NSSecureCoding { An exit number is an alphanumeric identifier posted at or ahead of a highway off-ramp. Exit numbers may increase or decrease sequentially along a road, or they may correspond to distances from either end of the road. An alphabetic suffix may appear when multiple exits are located in the same interchange. If multiple exits are [combined into a single exit](https://en.wikipedia.org/wiki/Local-express_lanes#Example_of_cloverleaf_interchanges), the step may have multiple exit codes. */ - @objc public let exitCodes: [String]? + public let exitCodes: [String]? /** The names of the roundabout exit. @@ -921,7 +921,7 @@ open class RouteStep: NSObject, NSSecureCoding { If you display a name to the user, you may need to abbreviate common words like “East” or “Boulevard” to ensure that it fits in the allotted space. */ - @objc public let exitNames: [String]? + public let exitNames: [String]? /** A phonetic or phonemic transcription indicating how to pronounce the names in the `exitNames` property. @@ -930,7 +930,7 @@ open class RouteStep: NSObject, NSSecureCoding { The transcription is written in the [International Phonetic Alphabet](https://en.wikipedia.org/wiki/International_Phonetic_Alphabet). */ - @objc public let phoneticExitNames: [String]? + public let phoneticExitNames: [String]? // MARK: Getting Details About the Approach to the Next Maneuver @@ -939,7 +939,7 @@ open class RouteStep: NSObject, NSSecureCoding { The value of this property accounts for the distance that the user must travel to go from this step’s maneuver location to the next step’s maneuver location. It is not the sum of the direct distances between the route’s waypoints, nor should you assume that the user would travel along this distance at a fixed speed. */ - @objc public let distance: CLLocationDistance + public let distance: CLLocationDistance /** The step’s expected travel time, measured in seconds. @@ -948,7 +948,7 @@ open class RouteStep: NSObject, NSSecureCoding { Do not assume that the user would travel along the step at a fixed speed. For the expected travel time on each individual segment along the leg, specify the `AttributeOptions.expectedTravelTime` option and use the `RouteLeg.expectedSegmentTravelTimes` property. */ - @objc public let expectedTravelTime: TimeInterval + public let expectedTravelTime: TimeInterval /** The names of the road or path leading from this step’s maneuver to the next step’s maneuver. @@ -957,7 +957,7 @@ open class RouteStep: NSObject, NSSecureCoding { If the maneuver is a roundabout maneuver, the outlet to take is named in the `exitNames` property; the `names` property is only set for large roundabouts that have their own names. */ - @objc public let names: [String]? + public let names: [String]? /** A phonetic or phonemic transcription indicating how to pronounce the names in the `names` property. @@ -966,7 +966,7 @@ open class RouteStep: NSObject, NSSecureCoding { If the maneuver traverses a large, named roundabout, the `exitPronunciationHints` property contains a hint about how to pronounce the names of the outlet to take. */ - @objc public let phoneticNames: [String]? + public let phoneticNames: [String]? /** Any route reference codes assigned to the road or path leading from this step’s maneuver to the next step’s maneuver. @@ -975,7 +975,7 @@ open class RouteStep: NSObject, NSSecureCoding { If a highway ramp is part of a numbered route, its reference code is contained in this property. On the other hand, guide signage for a highway ramp usually indicates route reference codes of the adjoining road; use the `destinationCodes` property for those route reference codes. */ - @objc public let codes: [String]? + public let codes: [String]? // MARK: Getting Additional Step Details @@ -984,7 +984,7 @@ open class RouteStep: NSObject, NSSecureCoding { This step may use a different mode of transportation than the overall route. */ - @objc public let transportType: TransportType + public let transportType: TransportType /** Any route reference codes that appear on guide signage for the road leading from this step’s maneuver to the next step’s maneuver. @@ -993,21 +993,21 @@ open class RouteStep: NSObject, NSSecureCoding { A route reference code commonly consists of an alphabetic network code, a space or hyphen, and a route number. You should not assume that the network code is globally unique: for example, a network code of “NH” may indicate a “National Highway” or “New Hampshire”. Moreover, a route number may not even uniquely identify a route within a given network. A destination code for a divided road is often suffixed with the cardinal direction of travel, for example “I 80 East”. */ - @objc public let destinationCodes: [String]? + public let destinationCodes: [String]? /** Destinations, such as [control cities](https://en.wikipedia.org/wiki/Control_city), that appear on guide signage for the road leading from this step’s maneuver to the next step’s maneuver. This property is typically available in steps leading to or from a freeway or expressway. */ - @objc public let destinations: [String]? + public let destinations: [String]? /** An array of intersections along the step. Each item in the array corresponds to a cross street, starting with the intersection at the maneuver location indicated by the coordinates property and continuing with each cross street along the step. */ - @objc public let intersections: [Intersection]? + public let intersections: [Intersection]? func debugQuickLookObject() -> Any? { if let coordinates = coordinates { @@ -1065,7 +1065,7 @@ internal class RouteStepV4: RouteStep { } } -func debugQuickLookURL(illustrating coordinates: [CLLocationCoordinate2D], profileIdentifier: MBDirectionsProfileIdentifier = .automobile) -> URL? { +func debugQuickLookURL(illustrating coordinates: [CLLocationCoordinate2D], profileIdentifier: DirectionsProfileIdentifier = .automobile) -> URL? { guard let accessToken = defaultAccessToken else { return nil } @@ -1073,10 +1073,10 @@ func debugQuickLookURL(illustrating coordinates: [CLLocationCoordinate2D], profi let styleIdentifier: String let identifierOfLayerAboveOverlays: String switch profileIdentifier { - case MBDirectionsProfileIdentifier.automobileAvoidingTraffic: + case DirectionsProfileIdentifier.automobileAvoidingTraffic: styleIdentifier = "mapbox/traffic-day-v2" identifierOfLayerAboveOverlays = "poi-driving-scalerank4" - case MBDirectionsProfileIdentifier.cycling, MBDirectionsProfileIdentifier.walking: + case DirectionsProfileIdentifier.cycling, DirectionsProfileIdentifier.walking: styleIdentifier = "mapbox/outdoors-v10" identifierOfLayerAboveOverlays = "housenum-label" default: diff --git a/Sources/MapboxDirections/MBSpokenInstruction.swift b/Sources/MapboxDirections/MBSpokenInstruction.swift index 97ea6f9ff..e3fd29303 100644 --- a/Sources/MapboxDirections/MBSpokenInstruction.swift +++ b/Sources/MapboxDirections/MBSpokenInstruction.swift @@ -9,7 +9,7 @@ import CoreLocation The `distanceAlongStep` property is measured from the beginning of the step associated with this object. By contrast, the `text` and `ssmlText` properties refer to the details in the following step. It is also possible for the instruction to refer to two following steps simultaneously when needed for safe navigation. */ -@objc(MBSpokenInstruction) + open class SpokenInstruction: NSObject, NSSecureCoding { /** @@ -17,7 +17,7 @@ open class SpokenInstruction: NSObject, NSSecureCoding { The distance is measured in meters from the beginning of the associated step. */ - @objc public let distanceAlongStep: CLLocationDistance + public let distanceAlongStep: CLLocationDistance /** @@ -25,7 +25,7 @@ open class SpokenInstruction: NSObject, NSSecureCoding { This representation is appropriate for speech synthesizers that lack support for the [Speech Synthesis Markup Language](https://en.wikipedia.org/wiki/Speech_Synthesis_Markup_Language) (SSML), such as `AVSpeechSynthesizer`. For speech synthesizers that support SSML, use the `ssmlText` property instead. */ - @objc public let text: String + public let text: String /** @@ -33,14 +33,14 @@ open class SpokenInstruction: NSObject, NSSecureCoding { This representation is appropriate for speech synthesizers that support the [Speech Synthesis Markup Language](https://en.wikipedia.org/wiki/Speech_Synthesis_Markup_Language) (SSML), such as [Amazon Polly](https://aws.amazon.com/polly/). Numbers and names are marked up to ensure correct pronunciation. For speech synthesizers that lack SSML support, use the `text` property instead. */ - @objc public let ssmlText: String + public let ssmlText: String /** Initializes a new spoken instruction object based on the given JSON dictionary representation. - parameter json: A JSON object that conforms to the [voice instruction](https://docs.mapbox.com/api/navigation/#voice-instruction-object) format described in the Directions API documentation. */ - @objc(initWithJSON:) + public convenience init(json: [String: Any]) { let distanceAlongStep = json["distanceAlongGeometry"] as! CLLocationDistance let text = json["announcement"] as! String @@ -56,7 +56,7 @@ open class SpokenInstruction: NSObject, NSSecureCoding { - parameter text: A plain-text representation of the speech-optimized instruction. - parameter ssmlText: A formatted representation of the speech-optimized instruction. */ - @objc public init(distanceAlongStep: CLLocationDistance, text: String, ssmlText: String) { + public init(distanceAlongStep: CLLocationDistance, text: String, ssmlText: String) { self.distanceAlongStep = distanceAlongStep self.text = text self.ssmlText = ssmlText diff --git a/Sources/MapboxDirections/MBVisualInstruction.swift b/Sources/MapboxDirections/MBVisualInstruction.swift index 27dfe217c..cae985cd3 100644 --- a/Sources/MapboxDirections/MBVisualInstruction.swift +++ b/Sources/MapboxDirections/MBVisualInstruction.swift @@ -5,8 +5,8 @@ import CoreLocation /** The contents of a banner that should be displayed as added visual guidance for a route. The banner instructions are children of the steps during which they should be displayed, but they refer to the maneuver in the following step. */ -@objcMembers -@objc(MBVisualInstruction) + + open class VisualInstruction: NSObject, NSSecureCoding { public static var supportsSecureCoding = true @@ -19,12 +19,12 @@ open class VisualInstruction: NSObject, NSSecureCoding { /** The type of maneuver required for beginning the step described by the visual instruction. */ - @objc public var maneuverType: ManeuverType + public var maneuverType: ManeuverType /** Additional directional information to clarify the maneuver type. */ - @objc public dynamic var maneuverDirection: ManeuverDirection + public dynamic var maneuverDirection: ManeuverDirection /** A structured representation of the instruction. @@ -38,12 +38,12 @@ open class VisualInstruction: NSObject, NSSecureCoding { This property is only relevant if the `maneuverType` is any of the following values: `ManeuverType.takeRoundabout`, `ManeuverType.takeRotary`, `ManeuverType.turnAtRoundabout`, `ManeuverType.exitRoundabout`, or `ManeuverType.exitRotary`. */ - @objc public var finalHeading: CLLocationDegrees = 180 + public var finalHeading: CLLocationDegrees = 180 /** Initializes a new visual instruction banner object that displays the given information. */ - @objc public init(text: String?, maneuverType: ManeuverType, maneuverDirection: ManeuverDirection, components: [ComponentRepresentable], degrees: CLLocationDegrees = 180) { + public init(text: String?, maneuverType: ManeuverType, maneuverDirection: ManeuverDirection, components: [ComponentRepresentable], degrees: CLLocationDegrees = 180) { self.text = text self.maneuverType = maneuverType self.maneuverDirection = maneuverDirection @@ -56,7 +56,7 @@ open class VisualInstruction: NSObject, NSSecureCoding { - parameter json: A JSON object that conforms to the [banner instruction](https://docs.mapbox.com/api/navigation/#banner-instruction-object) format described in the Directions API documentation. */ - @objc(initWithJSON:) + public convenience init(json: [String: Any]) { let text = json["text"] as? String var components = [ComponentRepresentable]() @@ -89,7 +89,7 @@ open class VisualInstruction: NSObject, NSSecureCoding { self.init(text: text, maneuverType: maneuverType, maneuverDirection: maneuverDirection, components: components, degrees: degrees) } - @objc public required init?(coder decoder: NSCoder) { + public required init?(coder decoder: NSCoder) { text = decoder.decodeObject(of: NSString.self, forKey: "text") as String? guard let maneuverTypeString = decoder.decodeObject(of: NSString.self, forKey: "maneuverType") as String?, let maneuverType = ManeuverType(description: maneuverTypeString) else { diff --git a/Sources/MapboxDirections/MBVisualInstructionBanner.swift b/Sources/MapboxDirections/MBVisualInstructionBanner.swift index 670f36e55..fd8148ec2 100644 --- a/Sources/MapboxDirections/MBVisualInstructionBanner.swift +++ b/Sources/MapboxDirections/MBVisualInstructionBanner.swift @@ -5,35 +5,35 @@ import CoreLocation /** A visual instruction banner contains all the information necessary for creating a visual cue about a given `RouteStep`. */ -@objc(MBVisualInstructionBanner) + open class VisualInstructionBanner: NSObject, NSSecureCoding { /** The distance at which the visual instruction should be shown, measured in meters from the beginning of the step. */ - @objc public let distanceAlongStep: CLLocationDistance + public let distanceAlongStep: CLLocationDistance /** The most important information to convey to the user about the `RouteStep`. */ - @objc public let primaryInstruction: VisualInstruction + public let primaryInstruction: VisualInstruction /** Less important details about the `RouteStep`. */ - @objc public let secondaryInstruction: VisualInstruction? + public let secondaryInstruction: VisualInstruction? /** A visual instruction that is presented simultaneously to provide information about an additional maneuver that occurs in rapid succession. This instruction could either contain the visual layout information or the lane information about the upcoming maneuver. */ - @objc public let tertiaryInstruction: VisualInstruction? + public let tertiaryInstruction: VisualInstruction? /** Which side of a bidirectional road the driver should drive on, also known as the rule of the road. */ - @objc public var drivingSide: DrivingSide + public var drivingSide: DrivingSide /** Initializes a new visual instruction banner object based on the given JSON dictionary representation and a driving side. @@ -41,7 +41,7 @@ open class VisualInstructionBanner: NSObject, NSSecureCoding { - parameter json: A JSON object that conforms to the [primary or secondary banner](https://docs.mapbox.com/api/navigation/#banner-instruction-object) format described in the Directions API documentation. - parameter drivingSide: The side of the road the user should drive on. This value should be consistent with the containing route step. */ - @objc(initWithJSON:drivingSide:) + public convenience init(json: [String: Any], drivingSide: DrivingSide) { let distanceAlongStep = json["distanceAlongGeometry"] as! CLLocationDistance @@ -71,7 +71,7 @@ open class VisualInstructionBanner: NSObject, NSSecureCoding { - parameter secondaryInstruction: Less important details about the `RouteStep`. - parameter drivingSide: Which side of a bidirectional road the driver should drive on. */ - @objc public init(distanceAlongStep: CLLocationDistance, primaryInstruction: VisualInstruction, secondaryInstruction: VisualInstruction?, tertiaryInstruction: VisualInstruction?, drivingSide: DrivingSide) { + public init(distanceAlongStep: CLLocationDistance, primaryInstruction: VisualInstruction, secondaryInstruction: VisualInstruction?, tertiaryInstruction: VisualInstruction?, drivingSide: DrivingSide) { self.distanceAlongStep = distanceAlongStep self.primaryInstruction = primaryInstruction self.secondaryInstruction = secondaryInstruction diff --git a/Sources/MapboxDirections/MBVisualInstructionComponent.swift b/Sources/MapboxDirections/MBVisualInstructionComponent.swift index f4dd0b73b..53af2fcc9 100644 --- a/Sources/MapboxDirections/MBVisualInstructionComponent.swift +++ b/Sources/MapboxDirections/MBVisualInstructionComponent.swift @@ -9,7 +9,7 @@ /** A component of a `VisualInstruction` that represents a single run of similarly formatted text or an image with a textual fallback representation. */ -@objc(MBVisualInstructionComponent) + open class VisualInstructionComponent: NSObject, ComponentRepresentable { /** @@ -17,31 +17,31 @@ open class VisualInstructionComponent: NSObject, ComponentRepresentable { The URL refers to an image that uses the device’s native screen scale. */ - @objc public var imageURL: URL? + public var imageURL: URL? /** An abbreviated representation of the `text` property. */ - @objc public var abbreviation: String? + public var abbreviation: String? /** The priority for which the component should be abbreviated. A component with a lower abbreviation priority value should be abbreviated before a component with a higher abbreviation priority value. */ - @objc public var abbreviationPriority: Int = NSNotFound + public var abbreviationPriority: Int = NSNotFound /** The plain text representation of this component. Use this property if `imageURL` is `nil` or if the URL contained in that property is not yet available. */ - @objc public var text: String? + public var text: String? /** The type of visual instruction component. You can display the component differently depending on its type. */ - @objc public var type: VisualInstructionComponentType + public var type: VisualInstructionComponentType public static var supportsSecureCoding: Bool = true @@ -50,7 +50,7 @@ open class VisualInstructionComponent: NSObject, ComponentRepresentable { - parameter json: A JSON object that conforms to the [banner component](https://docs.mapbox.com/api/navigation/#banner-instruction-object) format described in the Directions API documentation. */ - @objc(initWithJSON:) + public convenience init(json: [String: Any]) { let text = json["text"] as? String let type = VisualInstructionComponentType(description: json["type"] as? String ?? "") ?? .text @@ -83,7 +83,7 @@ open class VisualInstructionComponent: NSObject, ComponentRepresentable { - parameter abbreviation: An abbreviated representation of `text`. - parameter abbreviationPriority: The priority for which the component should be abbreviated. */ - @objc public init(type: VisualInstructionComponentType, text: String?, imageURL: URL?, abbreviation: String?, abbreviationPriority: Int) { + public init(type: VisualInstructionComponentType, text: String?, imageURL: URL?, abbreviation: String?, abbreviationPriority: Int) { self.text = text self.type = type self.imageURL = imageURL @@ -91,7 +91,7 @@ open class VisualInstructionComponent: NSObject, ComponentRepresentable { self.abbreviationPriority = abbreviationPriority } - @objc public required init?(coder decoder: NSCoder) { + public required init?(coder decoder: NSCoder) { self.text = decoder.decodeObject(of: NSString.self, forKey: "text") as String? guard let typeString = decoder.decodeObject(of: NSString.self, forKey: "type") as String?, let type = VisualInstructionComponentType(description: typeString) else { diff --git a/Sources/MapboxDirections/MBVisualInstructionType.swift b/Sources/MapboxDirections/MBVisualInstructionType.swift index 346075f05..f94ef1c7c 100644 --- a/Sources/MapboxDirections/MBVisualInstructionType.swift +++ b/Sources/MapboxDirections/MBVisualInstructionType.swift @@ -3,7 +3,7 @@ import Foundation /** `VisualInstructionComponentType` describes the type of `VisualInstructionComponent`. */ -@objc(MBVisualInstructionComponentType) + public enum VisualInstructionComponentType: Int, CustomStringConvertible { /** diff --git a/Sources/MapboxDirections/MBWaypoint.swift b/Sources/MapboxDirections/MBWaypoint.swift index 82901969d..2336320c3 100644 --- a/Sources/MapboxDirections/MBWaypoint.swift +++ b/Sources/MapboxDirections/MBWaypoint.swift @@ -5,8 +5,8 @@ import CoreLocation /** A `Waypoint` object indicates a location along a route. It may be the route’s origin or destination, or it may be another location that the route visits. A waypoint object indicates the location’s geographic location along with other optional information, such as a name or the user’s direction approaching the waypoint. You create a `RouteOptions` object using waypoint objects and also receive waypoint objects in the completion handler of the `Directions.calculate(_:completionHandler:)` method. */ -@objcMembers -@objc(MBWaypoint) + + open class Waypoint: NSObject, NSCopying, NSSecureCoding { // MARK: Creating a Waypoint Object @@ -57,7 +57,7 @@ open class Waypoint: NSObject, NSCopying, NSSecureCoding { - parameter heading: A `CLHeading` object representing the direction from which the route must approach the waypoint in order to be considered viable. This initializer respects the `CLHeading` class’s `trueHeading` property or `magneticHeading` property, converting it into the `headingAccuracy` property. - parameter name: The name of the waypoint. This parameter does not affect the route but may help you to distinguish one waypoint from another. */ - @objc public init(location: CLLocation, heading: CLHeading? = nil, name: String? = nil) { + public init(location: CLLocation, heading: CLHeading? = nil, name: String? = nil) { coordinate = location.coordinate coordinateAccuracy = location.horizontalAccuracy if let heading = heading { @@ -111,7 +111,7 @@ open class Waypoint: NSObject, NSCopying, NSSecureCoding { return isEqual(to: opts) } - @objc(isEqualToWaypoint:) + open func isEqual(to other: Waypoint?) -> Bool { guard let other = other else { return false } return type(of: self) == type(of: other) && @@ -132,7 +132,7 @@ open class Waypoint: NSObject, NSCopying, NSSecureCoding { /** The geographic coordinate of the waypoint. */ - @objc public internal(set) var coordinate: CLLocationCoordinate2D + public internal(set) var coordinate: CLLocationCoordinate2D /** The radius of uncertainty for the waypoint, measured in meters. @@ -143,7 +143,7 @@ open class Waypoint: NSObject, NSCopying, NSSecureCoding { This property corresponds to the [`radiuses`](https://docs.mapbox.com/api/navigation/#retrieve-directions) query parameter in the Mapbox Directions and Map Matching APIs. */ - @objc open var coordinateAccuracy: CLLocationAccuracy = -1 + open var coordinateAccuracy: CLLocationAccuracy = -1 /** The geographic coordinate of the waypoint’s target. @@ -154,7 +154,7 @@ open class Waypoint: NSObject, NSCopying, NSSecureCoding { This property corresponds to the [`waypoint_targets`](https://docs.mapbox.com/api/navigation/#retrieve-directions) query parameter in the Mapbox Directions and Map Matching APIs. */ - @objc open var targetCoordinate: CLLocationCoordinate2D = kCLLocationCoordinate2DInvalid + open var targetCoordinate: CLLocationCoordinate2D = kCLLocationCoordinate2DInvalid // MARK: Specifying How the User Approaches the Waypoint @@ -173,7 +173,7 @@ open class Waypoint: NSObject, NSCopying, NSSecureCoding { This property corresponds to the angles in the [`bearings`](https://docs.mapbox.com/api/navigation/#retrieve-directions) query parameter in the Mapbox Directions and Map Matching APIs. */ - @objc open var heading: CLLocationDirection = -1 + open var heading: CLLocationDirection = -1 /** The maximum tolerance, in degrees, within which a route’s approach to a waypoint may differ from `heading` in either direction but still be considered viable. @@ -186,7 +186,7 @@ open class Waypoint: NSObject, NSCopying, NSSecureCoding { This property corresponds to the ranges in the [`bearings`](https://docs.mapbox.com/api/navigation/#retrieve-directions) query parameter in the Mapbox Directions and Map Matching APIs. */ - @objc open var headingAccuracy: CLLocationDirection = -1 + open var headingAccuracy: CLLocationDirection = -1 internal var headingDescription: String { return heading >= 0 && headingAccuracy >= 0 ? "\(heading.truncatingRemainder(dividingBy: 360)),\(min(headingAccuracy, 180))" : "" @@ -199,7 +199,7 @@ open class Waypoint: NSObject, NSCopying, NSSecureCoding { This property corresponds to the [`approaches`](https://www.mapbox.com/api-documentation/navigation/#retrieve-directions) query parameter in the Mapbox Directions and Map Matching APIs. */ - @objc open var allowsArrivingOnOppositeSide = true + open var allowsArrivingOnOppositeSide = true // MARK: Identifying the Waypoint @@ -210,7 +210,7 @@ open class Waypoint: NSObject, NSCopying, NSSecureCoding { This property corresponds to the [`waypoint_names`](https://docs.mapbox.com/api/navigation/#retrieve-directions) query parameter in the Mapbox Directions and Map Matching APIs. */ - @objc open var name: String? + open var name: String? /** A Boolean value indicating whether the waypoint is significant enough to appear in the resulting routes as a waypoint separating two legs, along with corresponding guidance instructions. @@ -223,9 +223,9 @@ open class Waypoint: NSObject, NSCopying, NSSecureCoding { This property corresponds to the [`approaches`](https://docs.mapbox.com/api/navigation/#retrieve-directions) query parameter in the Mapbox Directions and Map Matching APIs. */ - @objc open var separatesLegs: Bool = true + open var separatesLegs: Bool = true - @objc open override var description: String { + open override var description: String { return name ?? "" } diff --git a/Sources/MapboxDirections/Match/MBMatch.swift b/Sources/MapboxDirections/Match/MBMatch.swift index 1bc38b628..4769728ad 100644 --- a/Sources/MapboxDirections/Match/MBMatch.swift +++ b/Sources/MapboxDirections/Match/MBMatch.swift @@ -7,7 +7,6 @@ import Polyline Typically, you do not create instances of this class directly. Instead, you receive match objects when you pass a `MatchOptions` object into the `Directions.calculate(_:completionHandler:)` or `Directions.calculateRoutes(matching:completionHandler:)` method. */ -@objc(MBMatch) open class Match: DirectionsResult { init(matchOptions: MatchOptions, legs: [RouteLeg], tracepoints: [Tracepoint], distance: CLLocationDistance, expectedTravelTime: TimeInterval, coordinates: [CLLocationCoordinate2D]?, confidence: Float, speechLocale: Locale?, waypointIndices: IndexSet) { @@ -24,7 +23,6 @@ open class Match: DirectionsResult { - parameter tracepoints: An array of `Tracepoint` that the match found in order. - parameter matchOptions: The `MatchOptions` used to create the request. */ - @objc(initWithJSON:tracepoints:waypointIndices:matchOptions:) public convenience init(json: [String: Any], tracepoints: [Tracepoint], waypointIndices: IndexSet, matchOptions: MatchOptions) { let legInfo = zip(zip(tracepoints.prefix(upTo: tracepoints.endIndex - 1), tracepoints.suffix(from: 1)), json["legs"] as? [JSONDictionary] ?? []) @@ -50,7 +48,7 @@ open class Match: DirectionsResult { /** A number between 0 and 1 that indicates the Map Matching API’s confidence that the match is accurate. A higher confidence means the match is more likely to be accurate. */ - @objc open var confidence: Float + open var confidence: Float /** @@ -58,13 +56,13 @@ open class Match: DirectionsResult { Any outlier tracepoint is omitted from the match. This array represents an outlier tracepoint is a `Tracepoint` object whose `Tracepoint.coordinate` property is `kCLLocationCoordinate2DInvalid`. */ - @objc open var tracepoints: [Tracepoint] + open var tracepoints: [Tracepoint] /** Index of the waypoint inside the matched route. */ - @objc open var waypointIndices: IndexSet? + open var waypointIndices: IndexSet? /** `MatchOptions` used to create the match request. @@ -73,7 +71,7 @@ open class Match: DirectionsResult { return super.directionsOptions as! MatchOptions } - @objc public required init?(coder decoder: NSCoder) { + public required init?(coder decoder: NSCoder) { confidence = decoder.decodeFloat(forKey: "confidence") guard let tracepoints = decoder.decodeObject(of: [NSArray.self, Tracepoint.self], forKey: "tracepoints") as? [Tracepoint] else { @@ -90,7 +88,7 @@ open class Match: DirectionsResult { return true } - @objc public override func encode(with coder: NSCoder) { + public override func encode(with coder: NSCoder) { coder.encode(confidence, forKey: "confidence") coder.encode(tracepoints, forKey: "tracepoints") coder.encode(waypointIndices, forKey: "waypointIndices") @@ -103,7 +101,6 @@ open class Match: DirectionsResult { return isEqual(to: opts) } - @objc(isEqualToMatch:) open func isEqual(to match: Match?) -> Bool { guard let other = match else { return false } guard tracepoints == other.tracepoints, diff --git a/Sources/MapboxDirections/Match/MBMatchOptions.swift b/Sources/MapboxDirections/Match/MBMatchOptions.swift index 920a4db13..7487b6e27 100644 --- a/Sources/MapboxDirections/Match/MBMatchOptions.swift +++ b/Sources/MapboxDirections/Match/MBMatchOptions.swift @@ -18,7 +18,7 @@ open class MatchOptions: DirectionsOptions { - parameter locations: An array of `CLLocation` objects representing locations to attempt to match against the road network. The array should contain at least two locations (the source and destination) and at most 100 locations. (Some profiles, such as `MBDirectionsProfileIdentifierAutomobileAvoidingTraffic`, [may have lower limits](https://docs.mapbox.com/api/navigation/#directions).) - parameter profileIdentifier: A string specifying the primary mode of transportation for the routes. This parameter, if set, should be set to `MBDirectionsProfileIdentifierAutomobile`, `MBDirectionsProfileIdentifierAutomobileAvoidingTraffic`, `MBDirectionsProfileIdentifierCycling`, or `MBDirectionsProfileIdentifierWalking`. `MBDirectionsProfileIdentifierAutomobile` is used by default. */ - public convenience init(locations: [CLLocation], profileIdentifier: MBDirectionsProfileIdentifier? = nil) { + public convenience init(locations: [CLLocation], profileIdentifier: DirectionsProfileIdentifier? = nil) { let waypoints = locations.map { Waypoint(location: $0) } @@ -31,14 +31,14 @@ open class MatchOptions: DirectionsOptions { - parameter coordinates: An array of geographic coordinates representing locations to attempt to match against the road network. The array should contain at least two locations (the source and destination) and at most 100 locations. (Some profiles, such as `MBDirectionsProfileIdentifierAutomobileAvoidingTraffic`, [may have lower limits](https://docs.mapbox.com/api/navigation/#directions).) Each coordinate is converted into a `Waypoint` object. - parameter profileIdentifier: A string specifying the primary mode of transportation for the routes. This parameter, if set, should be set to `MBDirectionsProfileIdentifierAutomobile`, `MBDirectionsProfileIdentifierAutomobileAvoidingTraffic`, `MBDirectionsProfileIdentifierCycling`, or `MBDirectionsProfileIdentifierWalking`. `MBDirectionsProfileIdentifierAutomobile` is used by default. */ - public convenience init(coordinates: [CLLocationCoordinate2D], profileIdentifier: MBDirectionsProfileIdentifier? = nil) { + public convenience init(coordinates: [CLLocationCoordinate2D], profileIdentifier: DirectionsProfileIdentifier? = nil) { let waypoints = coordinates.map { Waypoint(coordinate: $0) } self.init(waypoints: waypoints, profileIdentifier: profileIdentifier) } - public required init(waypoints: [Waypoint], profileIdentifier: MBDirectionsProfileIdentifier?) { + public required init(waypoints: [Waypoint], profileIdentifier: DirectionsProfileIdentifier?) { super.init(waypoints: waypoints, profileIdentifier: profileIdentifier) } @@ -56,7 +56,7 @@ open class MatchOptions: DirectionsOptions { If specified, each index must correspond to a valid index in `coordinates`, and the index set must contain 0 and the last index (one less than `endIndex`) of `coordinates`. */ @available(*, deprecated, message: "Use Waypoint.separatesLegs instead.") - @objc open var waypointIndices: IndexSet? + open var waypointIndices: IndexSet? override var legSeparators: [Waypoint] { if let indices = (self as MatchOptionsDeprecations).waypointIndices { @@ -66,14 +66,14 @@ open class MatchOptions: DirectionsOptions { } } - @objc public required init?(coder decoder: NSCoder) { + public required init?(coder decoder: NSCoder) { resamplesTraces = decoder.decodeBool(forKey: "resampleTraces") super.init(coder: decoder) var deprecations = self as MatchOptionsDeprecations deprecations.waypointIndices = decoder.decodeObject(of: NSIndexSet.self, forKey: "waypointIndices") as IndexSet? } - @objc public override func encode(with coder: NSCoder) { + public override func encode(with coder: NSCoder) { coder.encode(resamplesTraces, forKey: "resampleTraces") coder.encode((self as MatchOptionsDeprecations).waypointIndices, forKey: "waypointIndices") super.encode(with: coder) diff --git a/Sources/MapboxDirections/Match/MBTracepoint.swift b/Sources/MapboxDirections/Match/MBTracepoint.swift index cf281d01f..090a0cffa 100644 --- a/Sources/MapboxDirections/Match/MBTracepoint.swift +++ b/Sources/MapboxDirections/Match/MBTracepoint.swift @@ -5,25 +5,25 @@ import CoreLocation /** A `Tracepoint` represents a location matched to the road network. */ -@objc(MBTracepoint) + public class Tracepoint: Waypoint { /** Number of probable alternative matchings for this tracepoint. A value of zero indicates that this point was matched unambiguously. */ - @objc open var alternateCount: Int = NSNotFound + open var alternateCount: Int = NSNotFound init(coordinate: CLLocationCoordinate2D, alternateCount: Int?, name: String?) { self.alternateCount = alternateCount ?? NSNotFound super.init(coordinate: coordinate, name: name) } - @objc public required init?(coder decoder: NSCoder) { + public required init?(coder decoder: NSCoder) { alternateCount = decoder.decodeInteger(forKey: "alternateCount") super.init(coder: decoder) } - @objc public override func encode(with coder: NSCoder) { + public override func encode(with coder: NSCoder) { coder.encode(alternateCount, forKey: "alternateCount") } @@ -37,7 +37,7 @@ public class Tracepoint: Waypoint { return isEqual(to: opts) } - @objc(isEqualToTracepoint:) + open func isEqual(to other: Tracepoint?) -> Bool { guard let other = other else { return false } return super.isEqual(to: other) && type(of: self) == type(of: other) && diff --git a/Sources/MapboxDirections/OfflineDirections.swift b/Sources/MapboxDirections/OfflineDirections.swift index 5846fac2a..d8378d448 100644 --- a/Sources/MapboxDirections/OfflineDirections.swift +++ b/Sources/MapboxDirections/OfflineDirections.swift @@ -10,7 +10,7 @@ struct AvailableVersionsResponse: Codable { let availableVersions: [String] } -@objc(MBOfflineDirectionsProtocol) + public protocol OfflineDirectionsProtocol { /** @@ -18,7 +18,7 @@ public protocol OfflineDirectionsProtocol { - parameter completionHandler: A closure of type `OfflineVersionsHandler` which will be called when the request completes */ - @objc(fetchAvailableOfflineVersionsWithCompletionHandler:) + func fetchAvailableOfflineVersions(completionHandler: @escaping OfflineVersionsHandler) -> URLSessionDataTask /** @@ -28,7 +28,7 @@ public protocol OfflineDirectionsProtocol { - parameter version: The version to download. Version is represented as a String (yyyy-MM-dd-x) - parameter completionHandler: A closure of type `OfflineDownloaderCompletionHandler` which will be called when the request completes */ - @objc(downloadTilesInCoordinateBounds:version:completionHandler:) + func downloadTiles(in coordinateBounds: CoordinateBounds, version: OfflineVersion, completionHandler: @escaping OfflineDownloaderCompletionHandler) -> URLSessionDownloadTask } diff --git a/Tests/MapboxDirectionsTests/WalkingOptionsTests.swift b/Tests/MapboxDirectionsTests/WalkingOptionsTests.swift index 012e0c220..37b3b84e7 100644 --- a/Tests/MapboxDirectionsTests/WalkingOptionsTests.swift +++ b/Tests/MapboxDirectionsTests/WalkingOptionsTests.swift @@ -12,7 +12,7 @@ class WalkingOptionsTests: XCTestCase { Waypoint(coordinate: CLLocationCoordinate2D(latitude: 2, longitude: 3)) ] - let options = RouteOptions(waypoints: waypoints, profileIdentifier: .walking) + let options = RouteOptions(waypoints: waypoints, profileIdentifier: DirectionsProfileIdentifier.walking) var queryItems = options.urlQueryItems XCTAssertEqual(queryItems.filter { $0.name == "alley_bias" }.first?.value, "0.0") From 55c6948f6927d5e3f7a49d8ee6bacb8756713eda Mon Sep 17 00:00:00 2001 From: Jerrad Thramer Date: Tue, 1 Oct 2019 17:00:46 -0600 Subject: [PATCH 03/89] Starting on Coder integration and setting up proper swift error type Co-authored-by: Fredrik Karlsson --- MapboxDirections.xcodeproj/project.pbxproj | 45 +- .../MapboxDirections/DirectionsError.swift | 78 +++ .../MapboxDirections/DirectionsResponse.swift | 60 ++ .../Extensions/CLLocationCoordinate2D.swift | 26 +- .../MapboxDirections/Extensions/Codable.swift | 53 ++ .../Extensions/CoreLocation.swift | 29 + .../MapboxDirections/Extensions/GeoJSON.swift | 49 ++ Sources/MapboxDirections/MBCongestion.swift | 36 +- Sources/MapboxDirections/MBDirections.swift | 182 +++-- .../MapboxDirections/MBDirectionsResult.swift | 410 ++++++------ Sources/MapboxDirections/MBRoute.swift | 222 +++++-- Sources/MapboxDirections/MBRouteLeg.swift | 3 +- Sources/MapboxDirections/MBRouteOptions.swift | 629 ++++++++++++------ Sources/MapboxDirections/MBWaypoint.swift | 229 ++----- 14 files changed, 1247 insertions(+), 804 deletions(-) create mode 100644 Sources/MapboxDirections/DirectionsError.swift create mode 100644 Sources/MapboxDirections/DirectionsResponse.swift create mode 100644 Sources/MapboxDirections/Extensions/Codable.swift create mode 100644 Sources/MapboxDirections/Extensions/CoreLocation.swift create mode 100644 Sources/MapboxDirections/Extensions/GeoJSON.swift diff --git a/MapboxDirections.xcodeproj/project.pbxproj b/MapboxDirections.xcodeproj/project.pbxproj index 3ef4a066d..ed93cf138 100644 --- a/MapboxDirections.xcodeproj/project.pbxproj +++ b/MapboxDirections.xcodeproj/project.pbxproj @@ -39,10 +39,18 @@ 35EFD00C207DFACA00BF3873 /* MBVisualInstruction.swift in Sources */ = {isa = PBXBuildFile; fileRef = 35EFD00A207DFACA00BF3873 /* MBVisualInstruction.swift */; }; 35EFD00D207DFACA00BF3873 /* MBVisualInstruction.swift in Sources */ = {isa = PBXBuildFile; fileRef = 35EFD00A207DFACA00BF3873 /* MBVisualInstruction.swift */; }; 35EFD00E207DFACA00BF3873 /* MBVisualInstruction.swift in Sources */ = {isa = PBXBuildFile; fileRef = 35EFD00A207DFACA00BF3873 /* MBVisualInstruction.swift */; }; + 43208BA72343F7C300D8BD89 /* Codable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 43208BA62343F7C300D8BD89 /* Codable.swift */; }; + 43208BA92343F7E900D8BD89 /* CoreLocation.Swift in Sources */ = {isa = PBXBuildFile; fileRef = 43208BA82343F7E900D8BD89 /* CoreLocation.Swift */; }; + 43208BAB2343F81900D8BD89 /* GeoJSON.swift in Sources */ = {isa = PBXBuildFile; fileRef = 43208BAA2343F81900D8BD89 /* GeoJSON.swift */; }; + 43208BAD2343FF5500D8BD89 /* DirectionsResponse.swift in Sources */ = {isa = PBXBuildFile; fileRef = 43208BAC2343FF5500D8BD89 /* DirectionsResponse.swift */; }; 438BFEC2233D854D00457294 /* DirectionsProfileIdentifier.swift in Sources */ = {isa = PBXBuildFile; fileRef = 438BFEC1233D854D00457294 /* DirectionsProfileIdentifier.swift */; }; 438BFEC3233D854D00457294 /* DirectionsProfileIdentifier.swift in Sources */ = {isa = PBXBuildFile; fileRef = 438BFEC1233D854D00457294 /* DirectionsProfileIdentifier.swift */; }; 438BFEC4233D854D00457294 /* DirectionsProfileIdentifier.swift in Sources */ = {isa = PBXBuildFile; fileRef = 438BFEC1233D854D00457294 /* DirectionsProfileIdentifier.swift */; }; 438BFEC5233D854D00457294 /* DirectionsProfileIdentifier.swift in Sources */ = {isa = PBXBuildFile; fileRef = 438BFEC1233D854D00457294 /* DirectionsProfileIdentifier.swift */; }; + 439255772344113B006EEE88 /* DirectionsError.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4392557523440EC2006EEE88 /* DirectionsError.swift */; }; + 439255792344113D006EEE88 /* DirectionsError.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4392557523440EC2006EEE88 /* DirectionsError.swift */; }; + 4392557A2344113E006EEE88 /* DirectionsError.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4392557523440EC2006EEE88 /* DirectionsError.swift */; }; + 4392557B2344113F006EEE88 /* DirectionsError.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4392557523440EC2006EEE88 /* DirectionsError.swift */; }; 8D381B611FD9F5B1008D5A58 /* noDestinationName.json in Resources */ = {isa = PBXBuildFile; fileRef = 8D381B601FD9F5B1008D5A58 /* noDestinationName.json */; }; 8D381B631FDB01D1008D5A58 /* apiDestinationName.json in Resources */ = {isa = PBXBuildFile; fileRef = 8D381B621FDB01D1008D5A58 /* apiDestinationName.json */; }; 8D381B641FDB0898008D5A58 /* noDestinationName.json in Resources */ = {isa = PBXBuildFile; fileRef = 8D381B601FD9F5B1008D5A58 /* noDestinationName.json */; }; @@ -302,9 +310,14 @@ 35DBF013217E199E0009D2AE /* OfflineDirectionsTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OfflineDirectionsTests.swift; sourceTree = ""; }; 35DBF018217F38A30009D2AE /* versions.json */ = {isa = PBXFileReference; lastKnownFileType = text.json; path = versions.json; sourceTree = ""; }; 35EFD00A207DFACA00BF3873 /* MBVisualInstruction.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MBVisualInstruction.swift; sourceTree = ""; }; + 43208BA62343F7C300D8BD89 /* Codable.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Codable.swift; sourceTree = ""; }; + 43208BA82343F7E900D8BD89 /* CoreLocation.Swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CoreLocation.Swift; sourceTree = ""; }; + 43208BAA2343F81900D8BD89 /* GeoJSON.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GeoJSON.swift; sourceTree = ""; }; + 43208BAC2343FF5500D8BD89 /* DirectionsResponse.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DirectionsResponse.swift; sourceTree = ""; }; 438BFEBC233D7FA900457294 /* Package.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Package.swift; sourceTree = ""; }; 438BFEC0233D805500457294 /* README.md */ = {isa = PBXFileReference; lastKnownFileType = net.daringfireball.markdown; path = README.md; sourceTree = ""; }; 438BFEC1233D854D00457294 /* DirectionsProfileIdentifier.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DirectionsProfileIdentifier.swift; sourceTree = ""; }; + 4392557523440EC2006EEE88 /* DirectionsError.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DirectionsError.swift; sourceTree = ""; }; 8D381B601FD9F5B1008D5A58 /* noDestinationName.json */ = {isa = PBXFileReference; lastKnownFileType = text.json; path = noDestinationName.json; sourceTree = ""; }; 8D381B621FDB01D1008D5A58 /* apiDestinationName.json */ = {isa = PBXFileReference; explicitFileType = text.json; path = apiDestinationName.json; sourceTree = ""; }; 8D381B691FDB101F008D5A58 /* String.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = String.swift; sourceTree = ""; }; @@ -503,6 +516,9 @@ isa = PBXGroup; children = ( 8D381B691FDB101F008D5A58 /* String.swift */, + 43208BA62343F7C300D8BD89 /* Codable.swift */, + 43208BA82343F7E900D8BD89 /* CoreLocation.Swift */, + 43208BAA2343F81900D8BD89 /* GeoJSON.swift */, C582BA2D2073ED6300647DAA /* Array.swift */, 35DBF009217E172C0009D2AE /* CLLocationCoordinate2D.swift */, 8D434678219E1167008B7BF3 /* Double.swift */, @@ -569,7 +585,9 @@ C5DAAC9E20191683001F9261 /* Match */, DA6C9D8A1CAE442B00094FBC /* MapboxDirections.h */, DD6254731AE70CB700017857 /* MBDirections.swift */, + 4392557523440EC2006EEE88 /* DirectionsError.swift */, C59094C0203DE6BC00EB2417 /* MBDirectionsResult.swift */, + 43208BAC2343FF5500D8BD89 /* DirectionsResponse.swift */, DAC05F171CFC075300FA0071 /* MBRoute.swift */, DAC05F191CFC077C00FA0071 /* MBRouteLeg.swift */, DA2E03EA1CB0E13D00D1269A /* MBRouteOptions.swift */, @@ -1127,25 +1145,6 @@ shellPath = /bin/sh; shellScript = "# Look for a global file named 'mapbox' or '.mapbox' within the home directory\ntoken_file=~/.mapbox\ntoken_file2=~/mapbox\ntoken=\"$(cat $token_file 2>/dev/null || cat $token_file2 2>/dev/null)\"\nif [ \"$token\" ]; then\n plutil -replace MGLMapboxAccessToken -string $token \"$TARGET_BUILD_DIR/$INFOPLIST_PATH\"\nelse\n echo 'warning: Missing Mapbox access token'\n open 'https://account.mapbox.com/access-tokens/'\n echo \"warning: Get an access token from , then create a new file at $token_file or $token_file2 that contains the access token.\"\nfi\n"; }; - DA3DFB09236975E5003AE57F /* Apply Mapbox Access Token */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputFileListPaths = ( - ); - inputPaths = ( - "$(TARGET_BUILD_DIR)/$(INFOPLIST_PATH)", - ); - name = "Apply Mapbox Access Token"; - outputFileListPaths = ( - ); - outputPaths = ( - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "# Look for a global file named 'mapbox' or '.mapbox' within the home directory\ntoken_file=~/.mapbox\ntoken_file2=~/mapbox\ntoken=\"$(cat $token_file 2>/dev/null || cat $token_file2 2>/dev/null)\"\nif [ \"$token\" ]; then\n plutil -replace MGLMapboxAccessToken -string $token \"$TARGET_BUILD_DIR/$INFOPLIST_PATH\"\nelse\n echo 'warning: Missing Mapbox access token'\n open 'https://account.mapbox.com/access-tokens/'\n echo \"warning: Get an access token from , then create a new file at $token_file or $token_file2 that contains the access token.\"\nfi\n"; - }; DADD27F51E5ABD6600D31FAD /* Copy Frameworks */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; @@ -1200,6 +1199,7 @@ C54549FC2073F1EF002E273F /* Array.swift in Sources */, C547EC691DB59F8F009817F3 /* MBLane.swift in Sources */, AEDC212120B6125C0052DED8 /* MBComponentRepresentable.swift in Sources */, + 439255792344113D006EEE88 /* DirectionsError.swift in Sources */, DA1A10C71D00F969009F82FA /* MBDirections.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; @@ -1261,6 +1261,7 @@ C54549FD2073F1F0002E273F /* Array.swift in Sources */, C547EC6A1DB59F90009817F3 /* MBLane.swift in Sources */, AEDC212220B6125D0052DED8 /* MBComponentRepresentable.swift in Sources */, + 4392557A2344113E006EEE88 /* DirectionsError.swift in Sources */, DA1A10ED1D010247009F82FA /* MBDirections.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; @@ -1322,6 +1323,7 @@ C54549FE2073F1F1002E273F /* Array.swift in Sources */, C547EC6B1DB59F91009817F3 /* MBLane.swift in Sources */, AEDC212320B6125E0052DED8 /* MBComponentRepresentable.swift in Sources */, + 4392557B2344113F006EEE88 /* DirectionsError.swift in Sources */, DA1A11041D0103A3009F82FA /* MBDirections.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; @@ -1361,6 +1363,7 @@ C56516841FE1A2DD00A0AD18 /* MBVisualInstructionType.swift in Sources */, C57D55011DB5669600B94B74 /* MBIntersection.swift in Sources */, AEDC211D20B6104B0052DED8 /* MBComponentRepresentable.swift in Sources */, + 439255772344113B006EEE88 /* DirectionsError.swift in Sources */, DA2E03E91CB0E0B000D1269A /* MBRouteStep.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; @@ -1392,8 +1395,12 @@ buildActionMask = 2147483647; files = ( DADD27BA1E5AAAD800D31FAD /* ViewController.swift in Sources */, + 43208BA92343F7E900D8BD89 /* CoreLocation.Swift in Sources */, C59094B5203B5C7F00EB2417 /* MBDrawingView.swift in Sources */, + 43208BA72343F7C300D8BD89 /* Codable.swift in Sources */, DADD27B81E5AAAD800D31FAD /* AppDelegate.swift in Sources */, + 43208BAB2343F81900D8BD89 /* GeoJSON.swift in Sources */, + 43208BAD2343FF5500D8BD89 /* DirectionsResponse.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/Sources/MapboxDirections/DirectionsError.swift b/Sources/MapboxDirections/DirectionsError.swift new file mode 100644 index 000000000..46a1e83fd --- /dev/null +++ b/Sources/MapboxDirections/DirectionsError.swift @@ -0,0 +1,78 @@ +import Foundation +import CoreLocation + + +public enum DirectionsError: RawRepresentable { + public init?(rawValue: String) { + assertionFailure("Do not use init(rawValue:) for DirectionsError.") + return nil + } + + public var rawValue: String { + return """ + Error: \(String(describing: self)) + Failure Reason: \(failureReason) + Recovery Suggestion: \(recoverySuggestion) + """ + } + public var failureReason: String { + switch self { + case .noData: + return "No data was returned from the server." + case .unableToRoute: + return "No route could be found between the specified locations." + case .unableToLocate: + return "A specified location could not be associated with a roadway or pathway." + case .profileNotFound: + return "Unrecognized profile identifier." + case .requestTooLarge: + return "The request is too large." + case let .rateLimited(rateLimitInterval: interval, rateLimit: limit, _): + let intervalFormatter = DateComponentsFormatter() + intervalFormatter.unitsStyle = .full + guard let interval = interval, let limit = limit else { + return "Too many requests." + } + let formattedInterval = intervalFormatter.string(from: interval) ?? "\(interval) seconds" + let formattedCount = NumberFormatter.localizedString(from: NSNumber(value: limit), number: .decimal) + return "More than \(formattedCount) requests have been made with this access token within a period of \(formattedInterval)" + case let .unknown(response: response, underlying: error): + return "Unknown Error. Response: \(response.debugDescription) Underlying Error: \(error.debugDescription)" + + } + } + + public var recoverySuggestion: String { + switch self { + case .noData: + return "Make sure you have an active internet connection." + case .unableToRoute: + return "Make sure it is possible to travel between the locations with the mode of transportation implied by the profileIdentifier option. For example, it is impossible to travel by car from one continent to another without either a land bridge or a ferry connection." + case .unableToLocate: + return "Make sure the locations are close enough to a roadway or pathway. Try setting the coordinateAccuracy property of all the waypoints to a negative value." + case .profileNotFound: + return "Make sure the profileIdentifier option is set to one of the provided constants, such as MBDirectionsProfileIdentifierAutomobile." + case .requestTooLarge: + return "Try specifying fewer waypoints or giving the waypoints shorter names." + case let .rateLimited(rateLimitInterval: _, rateLimit: _, resetTime: reset): + guard let reset = reset else { + return "Wait a little while before retrying." + } + let formattedDate: String = DateFormatter.localizedString(from: reset, dateStyle: .long, timeStyle: .long) + return "Wait until \(formattedDate) before retrying." + case .unknown(_,_): + return "Please contact Mapbox Support." + } + } + public typealias RawValue = String + + + case noData + case unableToRoute + case unableToLocate + case profileNotFound + case requestTooLarge + case rateLimited(rateLimitInterval: TimeInterval?, rateLimit: UInt?, resetTime: Date?) + case unknown(response: URLResponse?, underlying: Error?) + +} diff --git a/Sources/MapboxDirections/DirectionsResponse.swift b/Sources/MapboxDirections/DirectionsResponse.swift new file mode 100644 index 000000000..ea4d886ba --- /dev/null +++ b/Sources/MapboxDirections/DirectionsResponse.swift @@ -0,0 +1,60 @@ +import Foundation + +struct DirectionsResponse: Codable { + + enum CodingKeys: String, CodingKey { + case code + case message + case error + case uuid + case routes + case waypoints + } + + var code: String? + var message: String? + var error: String? + let uuid: String? + let routes: [Route]? + let waypoints: [Waypoint]? + + init(code: String?, message: String?, error: String?) { + self.code = code + self.message = message + self.error = error + self.uuid = nil + self.routes = nil + self.waypoints = nil + } + + init(from decoder: Decoder) throws { + let container = try decoder.container(keyedBy: CodingKeys.self) + + let uuid = try container.decodeIfPresent(String.self, forKey: .uuid) + self.uuid = uuid + + let waypoints = try container.decodeIfPresent([Waypoint].self, forKey: .waypoints) + self.waypoints = waypoints + + let rawRoutes = try container.decodeIfPresent([Route].self, forKey: .routes) + var routesWithDestinations: [Route]? = rawRoutes + if let destinations = waypoints?.dropFirst() { + routesWithDestinations = rawRoutes?.map({ (route) -> Route in + for (leg, destination) in zip(route.legs, destinations) { + if leg.destination?.name?.nonEmptyString == nil { + leg.destination = destination + } + } + return route + }) + } + + let routesWithIdentifiers = routesWithDestinations?.map({ (route) -> Route in + route.routeIdentifier = uuid + return route + }) + + self.routes = routesWithIdentifiers + + } +} diff --git a/Sources/MapboxDirections/Extensions/CLLocationCoordinate2D.swift b/Sources/MapboxDirections/Extensions/CLLocationCoordinate2D.swift index 91ac34cca..efabd1052 100644 --- a/Sources/MapboxDirections/Extensions/CLLocationCoordinate2D.swift +++ b/Sources/MapboxDirections/Extensions/CLLocationCoordinate2D.swift @@ -1,6 +1,7 @@ import Foundation import CoreLocation +#warning("Check this") extension CLLocation { /** Initializes a CLLocation object with the given coordinate pair. @@ -11,30 +12,7 @@ extension CLLocation { } extension CLLocationCoordinate2D { - /** - Initializes a coordinate pair based on the given GeoJSON coordinates array. - */ - internal init(geoJSON array: [Double]) { - assert(array.count == 2) - self.init(latitude: array[1], longitude: array[0]) - } - - /** - Initializes a coordinate pair based on the given GeoJSON point object. - */ - internal init(geoJSON point: JSONDictionary) { - assert(point["type"] as? String == "Point") - self.init(geoJSON: point["coordinates"] as! [Double]) - } - - internal static func coordinates(geoJSON lineString: JSONDictionary) -> [CLLocationCoordinate2D] { - let type = lineString["type"] as? String - assert(type == "LineString" || type == "Point") - let coordinates = lineString["coordinates"] as! [[Double]] - return coordinates.map { self.init(geoJSON: $0) } - } - - /** +/** A string representation of the coordinate suitable for insertion in a Directions API request URL. */ internal var stringForRequestURL: String? { diff --git a/Sources/MapboxDirections/Extensions/Codable.swift b/Sources/MapboxDirections/Extensions/Codable.swift new file mode 100644 index 000000000..001b5e759 --- /dev/null +++ b/Sources/MapboxDirections/Extensions/Codable.swift @@ -0,0 +1,53 @@ +import Foundation +import Polyline +import CoreLocation + + +extension Decodable { + static internal func from(json: String, using encoding: String.Encoding = .utf8) -> T? { + guard let data = json.data(using: encoding) else { return nil } + return from(data: data) as T? + } + + static internal func from(data: Data) -> T? { + let decoder = JSONDecoder() + return try! decoder.decode(T.self, from: data) as T? + } +} + +struct UncertainCodable: Codable { + var t: T? + var u: U? + + var value: Codable? { + return t ?? u + } + + var coordinates: [CLLocationCoordinate2D] { + if let geo = value as? Geometry { + return geo.coordinates + } else if let geo = value as? String { + return decodePolyline(geo, precision: 1e5)! + } else { + return [] + } + } + + init(from decoder: Decoder) throws { + let container = try decoder.singleValueContainer() + t = try? container.decode(T.self) + if t == nil { + u = try? container.decode(U.self) + } + } + + func encode(to encoder: Encoder) throws { + var container = encoder.singleValueContainer() + if let t = t { + try? container.encode(t) + } + if let u = u { + try? container.encode(u) + } + } +} diff --git a/Sources/MapboxDirections/Extensions/CoreLocation.swift b/Sources/MapboxDirections/Extensions/CoreLocation.swift new file mode 100644 index 000000000..7150a90b6 --- /dev/null +++ b/Sources/MapboxDirections/Extensions/CoreLocation.swift @@ -0,0 +1,29 @@ +import Foundation +import CoreLocation + +extension CLLocationCoordinate2D: Codable { + public func encode(to encoder: Encoder) throws { + var container = encoder.unkeyedContainer() + try container.encode(longitude) + try container.encode(latitude) + } + + public init(from decoder: Decoder) throws { + var container = try decoder.unkeyedContainer() + longitude = try container.decode(CLLocationDegrees.self) + latitude = try container.decode(CLLocationDegrees.self) + } + + static func == (lhs: CLLocationCoordinate2D, rhs: CLLocationCoordinate2D) -> Bool { + return lhs.latitude == rhs.latitude && lhs.longitude == rhs.longitude + } +} + +extension CLLocation { + /** + Initializes a CLLocation object with the given coordinate pair. + */ + internal convenience init(coordinate: CLLocationCoordinate2D) { + self.init(latitude: coordinate.latitude, longitude: coordinate.longitude) + } +} diff --git a/Sources/MapboxDirections/Extensions/GeoJSON.swift b/Sources/MapboxDirections/Extensions/GeoJSON.swift new file mode 100644 index 000000000..04fc9293f --- /dev/null +++ b/Sources/MapboxDirections/Extensions/GeoJSON.swift @@ -0,0 +1,49 @@ +import Foundation +import CoreLocation + +struct Geometry: Codable { + enum GeometryType: String, CustomStringConvertible, Codable { + case point = "Point" + case lineString = "LineString" + + var description: String { + switch self { + case .point: + return "Point" + case .lineString: + return "LineString" + } + } + } + + let coordinates: [CLLocationCoordinate2D] + let type: GeometryType + + private enum CodingKeys: String, CodingKey { + case coordinates + case type + } + + public init(from decoder: Decoder) throws { + let container = try decoder.container(keyedBy: CodingKeys.self) + type = try container.decode(GeometryType.self, forKey: .type) + switch type { + case .lineString: + coordinates = try container.decode([CLLocationCoordinate2D].self, forKey: .coordinates) + case .point: + coordinates = [try container.decode(CLLocationCoordinate2D.self, forKey: .coordinates)] + } + } + + public func encode(to encoder: Encoder) throws { + var container = encoder.container(keyedBy: CodingKeys.self) + try container.encode(type, forKey: .type) + + switch type { + case .lineString: + try container.encode(coordinates, forKey: .coordinates) + case .point: + try container.encode(coordinates.first!, forKey: .coordinates) + } + } +} diff --git a/Sources/MapboxDirections/MBCongestion.swift b/Sources/MapboxDirections/MBCongestion.swift index aba2c5fd7..c1a3ee404 100644 --- a/Sources/MapboxDirections/MBCongestion.swift +++ b/Sources/MapboxDirections/MBCongestion.swift @@ -4,7 +4,7 @@ import Foundation A `CongestionLevel` indicates the level of traffic congestion along a road segment relative to the normal flow of traffic along that segment. You can color-code a route line according to the congestion level along each segment of the route. */ -public enum CongestionLevel: Int, CustomStringConvertible { +public enum CongestionLevel: String, Codable{ /** There is not enough data to determine the level of congestion along the road segment. */ @@ -37,38 +37,4 @@ public enum CongestionLevel: Int, CustomStringConvertible { Severe congestion levels are conventionally highlighted in red. */ case severe - - public init?(description: String) { - let level: CongestionLevel - switch description { - case "unknown": - level = .unknown - case "low": - level = .low - case "moderate": - level = .moderate - case "heavy": - level = .heavy - case "severe": - level = .severe - default: - return nil - } - self.init(rawValue: level.rawValue) - } - - public var description: String { - switch self { - case .unknown: - return "unknown" - case .low: - return "low" - case .moderate: - return "moderate" - case .heavy: - return "heavy" - case .severe: - return "severe" - } - } } diff --git a/Sources/MapboxDirections/MBDirections.swift b/Sources/MapboxDirections/MBDirections.swift index b12b2f430..5df3af858 100644 --- a/Sources/MapboxDirections/MBDirections.swift +++ b/Sources/MapboxDirections/MBDirections.swift @@ -79,7 +79,7 @@ open class Directions: NSObject { If the request was canceled or there was an error obtaining the routes, this parameter is `nil`. This is not to be confused with the situation in which no results were found, in which case the array is present but empty. - parameter error: The error that occurred, or `nil` if the placemarks were obtained successfully. */ - public typealias RouteCompletionHandler = (_ waypoints: [Waypoint]?, _ routes: [Route]?, _ error: NSError?) -> Void + public typealias RouteCompletionHandler = (_ waypoints: [Waypoint]?, _ routes: [Route]?, _ error: DirectionsError?) -> Void /** A closure (block) to be called when a map matching request is complete. @@ -144,6 +144,7 @@ open class Directions: NSObject { } // MARK: Getting Directions + /** Begins asynchronously calculating routes using the given options and delivers the results to a closure. @@ -158,19 +159,34 @@ open class Directions: NSObject { */ @discardableResult open func calculate(_ options: RouteOptions, completionHandler: @escaping RouteCompletionHandler) -> URLSessionDataTask { - let fetchStartDate = Date() - let task = dataTask(forCalculating: options, completionHandler: { (json) in - let responseEndDate = Date() - let response = options.response(from: json) - if let routes = response.1 { - self.postprocess(routes, fetchStartDate: fetchStartDate, responseEndDate: responseEndDate, uuid: json["uuid"] as? String) + let fetchStart = Date() + let requestURL = url(forCalculating: options) + let request = URLRequest(url: requestURL) + let requestTask = URLSession.shared.dataTask(with: request) { (possibleData, possibleResponse, possibleError) in + guard let data = possibleData else { + completionHandler(nil, nil, .noData) + } + if let error = possibleError { + completionHandler(nil, nil, .unknown(underlying: error)) } - completionHandler(response.0, response.1, nil) - }) { (error) in - completionHandler(nil, nil, error) + + } - task.resume() - return task + + +// let fetchStartDate = Date() +// let task = dataTask(forCalculating: options, completionHandler: { (json) in +// let responseEndDate = Date() +// let response = options.response(from: json) +// if let routes = response.1 { +// self.postprocess(routes, fetchStartDate: fetchStartDate, responseEndDate: responseEndDate, uuid: json["uuid"] as? String) +// } +// completionHandler(response.0, response.1, nil) +// }) { (error) in +// completionHandler(nil, nil, error) +// } +// task.resume() +// return task } /** @@ -186,19 +202,19 @@ open class Directions: NSObject { */ @discardableResult open func calculate(_ options: MatchOptions, completionHandler: @escaping MatchCompletionHandler) -> URLSessionDataTask { - let fetchStartDate = Date() - let task = dataTask(forCalculating: options, completionHandler: { (json) in - let responseEndDate = Date() - let response = options.response(from: json) - if let matches = response { - self.postprocess(matches, fetchStartDate: fetchStartDate, responseEndDate: responseEndDate, uuid: json["uuid"] as? String) - } - completionHandler(response, nil) - }) { (error) in - completionHandler(nil, error) - } - task.resume() - return task +// let fetchStartDate = Date() +// let task = dataTask(forCalculating: options, completionHandler: { (json) in +// let responseEndDate = Date() +// let response = options.response(from: json) +// if let matches = response { +// self.postprocess(matches, fetchStartDate: fetchStartDate, responseEndDate: responseEndDate, uuid: json["uuid"] as? String) +// } +// completionHandler(response, nil) +// }) { (error) in +// completionHandler(nil, error) +// } +// task.resume() +// return task } /** @@ -214,19 +230,19 @@ open class Directions: NSObject { */ @discardableResult open func calculateRoutes(matching options: MatchOptions, completionHandler: @escaping RouteCompletionHandler) -> URLSessionDataTask { - let fetchStartDate = Date() - let task = dataTask(forCalculating: options, completionHandler: { (json) in - let responseEndDate = Date() - let response = options.response(containingRoutesFrom: json) - if let routes = response.1 { - self.postprocess(routes, fetchStartDate: fetchStartDate, responseEndDate: responseEndDate, uuid: json["uuid"] as? String) - } - completionHandler(response.0, response.1, nil) - }) { (error) in - completionHandler(nil, nil, error) - } - task.resume() - return task +// let fetchStartDate = Date() +// let task = dataTask(forCalculating: options, completionHandler: { (json) in +// let responseEndDate = Date() +// let response = options.response(containingRoutesFrom: json) +// if let routes = response.1 { +// self.postprocess(routes, fetchStartDate: fetchStartDate, responseEndDate: responseEndDate, uuid: json["uuid"] as? String) +// } +// completionHandler(response.0, response.1, nil) +// }) { (error) in +// completionHandler(nil, nil, error) +// } +// task.resume() +// return task } /** @@ -239,31 +255,31 @@ open class Directions: NSObject { - postcondition: The caller must resume the returned task. */ fileprivate func dataTask(forCalculating options: DirectionsOptions, completionHandler: @escaping (_ json: JSONDictionary) -> Void, errorHandler: @escaping (_ error: NSError) -> Void) -> URLSessionDataTask { - let request = urlRequest(forCalculating: options) - return URLSession.shared.dataTask(with: request) { (data, response, error) in - var json: JSONDictionary = [:] - if let data = data, response?.mimeType == "application/json" { - do { - json = try JSONSerialization.jsonObject(with: data, options: []) as! JSONDictionary - } catch { - assert(false, "Invalid data") - } - } - - let apiStatusCode = json["code"] as? String - let apiMessage = json["message"] as? String - guard !json.isEmpty, data != nil, error == nil && ((apiStatusCode == nil && apiMessage == nil) || apiStatusCode == "Ok") else { - let apiError = Directions.informativeError(describing: json, response: response, underlyingError: error as NSError?) - DispatchQueue.main.async { - errorHandler(apiError) - } - return - } - - DispatchQueue.main.async { - completionHandler(json) - } - } +// let request = urlRequest(forCalculating: options) +// return URLSession.shared.dataTask(with: request) { (data, response, error) in +// var json: JSONDictionary = [:] +// if let data = data, response?.mimeType == "application/json" { +// do { +// json = try JSONSerialization.jsonObject(with: data, options: []) as! JSONDictionary +// } catch { +// assert(false, "Invalid data") +// } +// } +// +// let apiStatusCode = json["code"] as? String +// let apiMessage = json["message"] as? String +// guard !json.isEmpty, data != nil, error == nil && ((apiStatusCode == nil && apiMessage == nil) || apiStatusCode == "Ok") else { +// let apiError = Directions.informativeError(describing: json, response: response, underlyingError: error as NSError?) +// DispatchQueue.main.async { +// errorHandler(apiError) +// } +// return +// } +// +// DispatchQueue.main.async { +// completionHandler(json) +// } +// } } /** @@ -335,48 +351,24 @@ open class Directions: NSObject { /** Returns an error that supplements the given underlying error with additional information from the an HTTP response’s body or headers. */ - static func informativeError(describing json: JSONDictionary, response: URLResponse?, underlyingError error: NSError?) -> NSError { - let apiStatusCode = json["code"] as? String - var userInfo = error?.userInfo ?? [:] + static func informativeError(code: String?, response: URLResponse?, underlyingError error: Error?) -> DirectionsError { if let response = response as? HTTPURLResponse { - var failureReason: String? = nil - var recoverySuggestion: String? = nil - switch (response.statusCode, apiStatusCode ?? "") { + switch (response.statusCode, code ?? "") { case (200, "NoRoute"): - failureReason = "No route could be found between the specified locations." - recoverySuggestion = "Make sure it is possible to travel between the locations with the mode of transportation implied by the profileIdentifier option. For example, it is impossible to travel by car from one continent to another without either a land bridge or a ferry connection." + return .unableToRoute case (200, "NoSegment"): - failureReason = "A specified location could not be associated with a roadway or pathway." - recoverySuggestion = "Make sure the locations are close enough to a roadway or pathway. Try setting the coordinateAccuracy property of all the waypoints to a negative value." + return .unableToLocate case (404, "ProfileNotFound"): - failureReason = "Unrecognized profile identifier." - recoverySuggestion = "Make sure the profileIdentifier option is set to one of the provided constants, such as MBDirectionsProfileIdentifierAutomobile." + return .profileNotFound case (413, _): - failureReason = "The request is too large." - recoverySuggestion = "Try specifying fewer waypoints or giving the waypoints shorter names." + return .requestTooLarge case (429, _): - if let timeInterval = response.rateLimitInterval, let maximumCountOfRequests = response.rateLimit { - let intervalFormatter = DateComponentsFormatter() - intervalFormatter.unitsStyle = .full - let formattedInterval = intervalFormatter.string(from: timeInterval) ?? "\(timeInterval) seconds" - let formattedCount = NumberFormatter.localizedString(from: NSNumber(value: maximumCountOfRequests), number: .decimal) - failureReason = "More than \(formattedCount) requests have been made with this access token within a period of \(formattedInterval)." - } - if let rolloverTime = response.rateLimitResetTime { - let formattedDate = DateFormatter.localizedString(from: rolloverTime, dateStyle: .long, timeStyle: .long) - recoverySuggestion = "Wait until \(formattedDate) before retrying." - } + return .rateLimited(rateLimitInterval: response.rateLimitInterval, rateLimit: response.rateLimit, resetTime: response.rateLimitResetTime) default: - // `message` is v4 or v5; `error` is v4 - failureReason = json["message"] as? String ?? json["error"] as? String + return .unknown(response: response, underlying: error) } - userInfo[NSLocalizedFailureReasonErrorKey] = failureReason ?? userInfo[NSLocalizedFailureReasonErrorKey] ?? HTTPURLResponse.localizedString(forStatusCode: error?.code ?? -1) - userInfo[NSLocalizedRecoverySuggestionErrorKey] = recoverySuggestion ?? userInfo[NSLocalizedRecoverySuggestionErrorKey] - } - if let error = error { - userInfo[NSUnderlyingErrorKey] = error } return NSError(domain: error?.domain ?? MBDirectionsErrorDomain, code: error?.code ?? -1, userInfo: userInfo) } diff --git a/Sources/MapboxDirections/MBDirectionsResult.swift b/Sources/MapboxDirections/MBDirectionsResult.swift index dfb0b5b09..9007cf99c 100644 --- a/Sources/MapboxDirections/MBDirectionsResult.swift +++ b/Sources/MapboxDirections/MBDirectionsResult.swift @@ -1,205 +1,205 @@ -import Foundation -import Polyline -import CoreLocation - - -/** - A `DirectionsResult` represents a result returned from either the Mapbox Directions service. - - You do not create instances of this class directly. Instead, you receive `Route` or `Match` objects when you request directions using the `Directions.calculate(_:completionHandler:)` or `Directions.calculateRoutes(matching:completionHandler:)` method. - */ - -open class DirectionsResult: NSObject, NSSecureCoding { - - public var json: [String: Any]? - - internal init(json: [String: Any]? = nil, legs: [RouteLeg], distance: CLLocationDistance, expectedTravelTime: TimeInterval, coordinates: [CLLocationCoordinate2D]?, speechLocale: Locale?, options: DirectionsOptions) { - self.json = json - self.directionsOptions = options - self.legs = legs - self.distance = distance - self.expectedTravelTime = expectedTravelTime - self.coordinates = coordinates - self.speechLocale = speechLocale - } - - public required init?(coder decoder: NSCoder) { - accessToken = decoder.decodeObject(of: NSString.self, forKey: "accessToken") as String? - apiEndpoint = decoder.decodeObject(of: NSURL.self, forKey: "apiEndpoint") as URL? - - let coordinateDictionaries = decoder.decodeObject(of: [NSArray.self, NSDictionary.self, NSString.self, NSNumber.self], forKey: "coordinates") as? [[String: CLLocationDegrees]] - coordinates = coordinateDictionaries?.compactMap({ (coordinateDictionary) -> CLLocationCoordinate2D? in - if let latitude = coordinateDictionary["latitude"], - let longitude = coordinateDictionary["longitude"] { - return CLLocationCoordinate2D(latitude: latitude, longitude: longitude) - } else { - return nil - } - }) - - legs = decoder.decodeObject(of: [NSArray.self, RouteLeg.self], forKey: "legs") as? [RouteLeg] ?? [] - distance = decoder.decodeDouble(forKey: "distance") - expectedTravelTime = decoder.decodeDouble(forKey: "expectedTravelTime") - - guard let options = decoder.decodeObject(of: [DirectionsOptions.self], forKey: "directionsOptions") as? DirectionsOptions else { - return nil - } - directionsOptions = options - - routeIdentifier = decoder.decodeObject(of: NSString.self, forKey: "routeIdentifier") as String? - - speechLocale = decoder.decodeObject(of: NSLocale.self, forKey: "speechLocale") as Locale? - } - - public class var supportsSecureCoding: Bool { - return true - } - - public func encode(with coder: NSCoder) { - coder.encode(accessToken, forKey: "accessToken") - coder.encode(apiEndpoint, forKey: "apiEndpoint") - - let coordinateDictionaries = coordinates?.map { [ - "latitude": $0.latitude, - "longitude": $0.longitude, - ] } - coder.encode(coordinateDictionaries, forKey: "coordinates") - - coder.encode(legs, forKey: "legs") - coder.encode(distance, forKey: "distance") - coder.encode(expectedTravelTime, forKey: "expectedTravelTime") - coder.encode(directionsOptions, forKey: "directionsOptions") - coder.encode(routeIdentifier, forKey: "routeIdentifier") - coder.encode(speechLocale, forKey: "speechLocale") - } - - /** - An array of geographic coordinates defining the path of the route from start to finish. - - This array may be `nil` or simplified depending on the `routeShapeResolution` property of the original `RouteOptions` object. - - Using the [Mapbox Maps SDK for iOS](https://docs.mapbox.com/ios/maps/) or [Mapbox Maps SDK for macOS](https://mapbox.github.io/mapbox-gl-native/macos/), you can create an `MGLPolyline` object using these coordinates to display an overview of the route on an `MGLMapView`. - */ - public let coordinates: [CLLocationCoordinate2D]? - - /** - The number of coordinates. - - The value of this property may be zero or reduced depending on the `routeShapeResolution` property of the original `RouteOptions` object. - - - note: This initializer is intended for Objective-C usage. In Swift code, use the `coordinates.count` property. - */ - open var coordinateCount: UInt { - return UInt(coordinates?.count ?? 0) - } - - /** - Retrieves the coordinates. - - The array may be empty or simplified depending on the `routeShapeResolution` property of the original `RouteOptions` object. - - Using the [Mapbox Maps SDK for iOS](https://docs.mapbox.com/ios/maps/) or [Mapbox Maps SDK for macOS](https://mapbox.github.io/mapbox-gl-native/macos/), you can create an `MGLPolyline` object using these coordinates to display an overview of the route on an `MGLMapView`. - - - parameter coordinates: A pointer to a C array of `CLLocationCoordinate2D` instances. On output, this array contains all the vertices of the overlay. - - - precondition: `coordinates` must be large enough to hold `coordinateCount` instances of `CLLocationCoordinate2D`. - - - note: This initializer is intended for Objective-C usage. In Swift code, use the `coordinates` property. - */ - open func getCoordinates(_ coordinates: UnsafeMutablePointer) { - for i in 0..<(self.coordinates?.count ?? 0) { - coordinates.advanced(by: i).pointee = self.coordinates![i] - } - } - - /** - An array of `RouteLeg` objects representing the legs of the route. - - The number of legs in this array depends on the number of waypoints. A route with two waypoints (the source and destination) has one leg, a route with three waypoints (the source, an intermediate waypoint, and the destination) has two legs, and so on. - - To determine the name of the route, concatenate the names of the route’s legs. - */ - public let legs: [RouteLeg] - - open override var description: String { - return legs.map { $0.name }.joined(separator: " – ") - } - - // MARK: Getting Additional Route Details - - /** - The route’s distance, measured in meters. - - The value of this property accounts for the distance that the user must travel to traverse the path of the route. It is the sum of the `distance` properties of the route’s legs, not the sum of the direct distances between the route’s waypoints. You should not assume that the user would travel along this distance at a fixed speed. - */ - public let distance: CLLocationDistance - - /** - The route’s expected travel time, measured in seconds. - - The value of this property reflects the time it takes to traverse the entire route. It is the sum of the `expectedTravelTime` properties of the route’s legs. If the route was calculated using the `MBDirectionsProfileIdentifierAutomobileAvoidingTraffic` profile, this property reflects current traffic conditions at the time of the request, not necessarily the traffic conditions at the time the user would begin the route. For other profiles, this property reflects travel time under ideal conditions and does not account for traffic congestion. If the route makes use of a ferry or train, the actual travel time may additionally be subject to the schedules of those services. - - Do not assume that the user would travel along the route at a fixed speed. For more granular travel times, use the `RouteLeg.expectedTravelTime` or `RouteStep.expectedTravelTime`. For even more granularity, specify the `AttributeOptions.expectedTravelTime` option and use the `RouteLeg.expectedSegmentTravelTimes` property. - */ - public let expectedTravelTime: TimeInterval - - /** - `RouteOptions` used to create the directions request. - - The route options object’s profileIdentifier property reflects the primary mode of transportation used for the route. Individual steps along the route might use different modes of transportation as necessary. - */ - public let directionsOptions: DirectionsOptions - - /** - The [access token](https://docs.mapbox.com/help/glossary/access-token/) used to make the directions request. - - This property is set automatically if a request is made via `Directions.calculate(_:completionHandler:)`. - */ - open var accessToken: String? - - /** - The endpoint used to make the directions request. - - This property is set automatically if a request is made via `Directions.calculate(_:completionHandler:)`. - */ - open var apiEndpoint: URL? - - func debugQuickLookObject() -> Any? { - if let coordinates = coordinates { - return debugQuickLookURL(illustrating: coordinates, profileIdentifier: directionsOptions.profileIdentifier) - } - return nil - } - - /** - A unique identifier for a directions request. - - Each route produced by a single call to `Directions.calculate(_:completionHandler:)` has the same route identifier. - */ - open var routeIdentifier: String? - - /** - The locale to use for spoken instructions. - - This locale is specific to Mapbox Voice API. If `nil` is returned, the instruction should be spoken with an alternative speech synthesizer. - */ - open var speechLocale: Locale? - - /** - The time immediately before a `Directions` object fetched this result. - - If you manually start fetching a task returned by `Directions.url(forCalculating:)`, this property is set to `nil`; use the `URLSessionTaskTransactionMetrics.fetchStartDate` property instead. This property may also be set to `nil` if you create this result from a JSON object or encoded object. - - This property does not persist after encoding and decoding. - */ - open var fetchStartDate: Date? - - /** - The time immediately before a `Directions` object received the last byte of this result. - - If you manually start fetching a task returned by `Directions.url(forCalculating:)`, this property is set to `nil`; use the `URLSessionTaskTransactionMetrics.responseEndDate` property instead. This property may also be set to `nil` if you create this result from a JSON object or encoded object. - - This property does not persist after encoding and decoding. - */ - open var responseEndDate: Date? -} +//import Foundation +//import Polyline +//import CoreLocation +// +// +///** +// A `DirectionsResult` represents a result returned from either the Mapbox Directions service. +// +// You do not create instances of this class directly. Instead, you receive `Route` or `Match` objects when you request directions using the `Directions.calculate(_:completionHandler:)` or `Directions.calculateRoutes(matching:completionHandler:)` method. +// */ +// +//open class DirectionsResult: NSObject, NSSecureCoding { +// +// public var json: [String: Any]? +// +// internal init(json: [String: Any]? = nil, legs: [RouteLeg], distance: CLLocationDistance, expectedTravelTime: TimeInterval, coordinates: [CLLocationCoordinate2D]?, speechLocale: Locale?, options: DirectionsOptions) { +// self.json = json +// self.directionsOptions = options +// self.legs = legs +// self.distance = distance +// self.expectedTravelTime = expectedTravelTime +// self.coordinates = coordinates +// self.speechLocale = speechLocale +// } +// +// public required init?(coder decoder: NSCoder) { +// accessToken = decoder.decodeObject(of: NSString.self, forKey: "accessToken") as String? +// apiEndpoint = decoder.decodeObject(of: NSURL.self, forKey: "apiEndpoint") as URL? +// +// let coordinateDictionaries = decoder.decodeObject(of: [NSArray.self, NSDictionary.self, NSString.self, NSNumber.self], forKey: "coordinates") as? [[String: CLLocationDegrees]] +// coordinates = coordinateDictionaries?.compactMap({ (coordinateDictionary) -> CLLocationCoordinate2D? in +// if let latitude = coordinateDictionary["latitude"], +// let longitude = coordinateDictionary["longitude"] { +// return CLLocationCoordinate2D(latitude: latitude, longitude: longitude) +// } else { +// return nil +// } +// }) +// +// legs = decoder.decodeObject(of: [NSArray.self, RouteLeg.self], forKey: "legs") as? [RouteLeg] ?? [] +// distance = decoder.decodeDouble(forKey: "distance") +// expectedTravelTime = decoder.decodeDouble(forKey: "expectedTravelTime") +// +// guard let options = decoder.decodeObject(of: [DirectionsOptions.self], forKey: "directionsOptions") as? DirectionsOptions else { +// return nil +// } +// directionsOptions = options +// +// routeIdentifier = decoder.decodeObject(of: NSString.self, forKey: "routeIdentifier") as String? +// +// speechLocale = decoder.decodeObject(of: NSLocale.self, forKey: "speechLocale") as Locale? +// } +// +// public class var supportsSecureCoding: Bool { +// return true +// } +// +// public func encode(with coder: NSCoder) { +// coder.encode(accessToken, forKey: "accessToken") +// coder.encode(apiEndpoint, forKey: "apiEndpoint") +// +// let coordinateDictionaries = coordinates?.map { [ +// "latitude": $0.latitude, +// "longitude": $0.longitude, +// ] } +// coder.encode(coordinateDictionaries, forKey: "coordinates") +// +// coder.encode(legs, forKey: "legs") +// coder.encode(distance, forKey: "distance") +// coder.encode(expectedTravelTime, forKey: "expectedTravelTime") +// coder.encode(directionsOptions, forKey: "directionsOptions") +// coder.encode(routeIdentifier, forKey: "routeIdentifier") +// coder.encode(speechLocale, forKey: "speechLocale") +// } +// +// /** +// An array of geographic coordinates defining the path of the route from start to finish. +// +// This array may be `nil` or simplified depending on the `routeShapeResolution` property of the original `RouteOptions` object. +// +// Using the [Mapbox Maps SDK for iOS](https://docs.mapbox.com/ios/maps/) or [Mapbox Maps SDK for macOS](https://mapbox.github.io/mapbox-gl-native/macos/), you can create an `MGLPolyline` object using these coordinates to display an overview of the route on an `MGLMapView`. +// */ +// public let coordinates: [CLLocationCoordinate2D]? +// +// /** +// The number of coordinates. +// +// The value of this property may be zero or reduced depending on the `routeShapeResolution` property of the original `RouteOptions` object. +// +// - note: This initializer is intended for Objective-C usage. In Swift code, use the `coordinates.count` property. +// */ +// open var coordinateCount: UInt { +// return UInt(coordinates?.count ?? 0) +// } +// +// /** +// Retrieves the coordinates. +// +// The array may be empty or simplified depending on the `routeShapeResolution` property of the original `RouteOptions` object. +// +// Using the [Mapbox Maps SDK for iOS](https://docs.mapbox.com/ios/maps/) or [Mapbox Maps SDK for macOS](https://mapbox.github.io/mapbox-gl-native/macos/), you can create an `MGLPolyline` object using these coordinates to display an overview of the route on an `MGLMapView`. +// +// - parameter coordinates: A pointer to a C array of `CLLocationCoordinate2D` instances. On output, this array contains all the vertices of the overlay. +// +// - precondition: `coordinates` must be large enough to hold `coordinateCount` instances of `CLLocationCoordinate2D`. +// +// - note: This initializer is intended for Objective-C usage. In Swift code, use the `coordinates` property. +// */ +// open func getCoordinates(_ coordinates: UnsafeMutablePointer) { +// for i in 0..<(self.coordinates?.count ?? 0) { +// coordinates.advanced(by: i).pointee = self.coordinates![i] +// } +// } +// +// /** +// An array of `RouteLeg` objects representing the legs of the route. +// +// The number of legs in this array depends on the number of waypoints. A route with two waypoints (the source and destination) has one leg, a route with three waypoints (the source, an intermediate waypoint, and the destination) has two legs, and so on. +// +// To determine the name of the route, concatenate the names of the route’s legs. +// */ +// public let legs: [RouteLeg] +// +// open override var description: String { +// return legs.map { $0.name }.joined(separator: " – ") +// } +// +// // MARK: Getting Additional Route Details +// +// /** +// The route’s distance, measured in meters. +// +// The value of this property accounts for the distance that the user must travel to traverse the path of the route. It is the sum of the `distance` properties of the route’s legs, not the sum of the direct distances between the route’s waypoints. You should not assume that the user would travel along this distance at a fixed speed. +// */ +// public let distance: CLLocationDistance +// +// /** +// The route’s expected travel time, measured in seconds. +// +// The value of this property reflects the time it takes to traverse the entire route. It is the sum of the `expectedTravelTime` properties of the route’s legs. If the route was calculated using the `MBDirectionsProfileIdentifierAutomobileAvoidingTraffic` profile, this property reflects current traffic conditions at the time of the request, not necessarily the traffic conditions at the time the user would begin the route. For other profiles, this property reflects travel time under ideal conditions and does not account for traffic congestion. If the route makes use of a ferry or train, the actual travel time may additionally be subject to the schedules of those services. +// +// Do not assume that the user would travel along the route at a fixed speed. For more granular travel times, use the `RouteLeg.expectedTravelTime` or `RouteStep.expectedTravelTime`. For even more granularity, specify the `AttributeOptions.expectedTravelTime` option and use the `RouteLeg.expectedSegmentTravelTimes` property. +// */ +// public let expectedTravelTime: TimeInterval +// +// /** +// `RouteOptions` used to create the directions request. +// +// The route options object’s profileIdentifier property reflects the primary mode of transportation used for the route. Individual steps along the route might use different modes of transportation as necessary. +// */ +// public let directionsOptions: DirectionsOptions +// +// /** +// The [access token](https://docs.mapbox.com/help/glossary/access-token/) used to make the directions request. +// +// This property is set automatically if a request is made via `Directions.calculate(_:completionHandler:)`. +// */ +// open var accessToken: String? +// +// /** +// The endpoint used to make the directions request. +// +// This property is set automatically if a request is made via `Directions.calculate(_:completionHandler:)`. +// */ +// open var apiEndpoint: URL? +// +// func debugQuickLookObject() -> Any? { +// if let coordinates = coordinates { +// return debugQuickLookURL(illustrating: coordinates, profileIdentifier: directionsOptions.profileIdentifier) +// } +// return nil +// } +// +// /** +// A unique identifier for a directions request. +// +// Each route produced by a single call to `Directions.calculate(_:completionHandler:)` has the same route identifier. +// */ +// open var routeIdentifier: String? +// +// /** +// The locale to use for spoken instructions. +// +// This locale is specific to Mapbox Voice API. If `nil` is returned, the instruction should be spoken with an alternative speech synthesizer. +// */ +// open var speechLocale: Locale? +// +// /** +// The time immediately before a `Directions` object fetched this result. +// +// If you manually start fetching a task returned by `Directions.url(forCalculating:)`, this property is set to `nil`; use the `URLSessionTaskTransactionMetrics.fetchStartDate` property instead. This property may also be set to `nil` if you create this result from a JSON object or encoded object. +// +// This property does not persist after encoding and decoding. +// */ +// open var fetchStartDate: Date? +// +// /** +// The time immediately before a `Directions` object received the last byte of this result. +// +// If you manually start fetching a task returned by `Directions.url(forCalculating:)`, this property is set to `nil`; use the `URLSessionTaskTransactionMetrics.responseEndDate` property instead. This property may also be set to `nil` if you create this result from a JSON object or encoded object. +// +// This property does not persist after encoding and decoding. +// */ +// open var responseEndDate: Date? +//} diff --git a/Sources/MapboxDirections/MBRoute.swift b/Sources/MapboxDirections/MBRoute.swift index c8173fdf1..ecf4e418b 100644 --- a/Sources/MapboxDirections/MBRoute.swift +++ b/Sources/MapboxDirections/MBRoute.swift @@ -1,82 +1,190 @@ -import Foundation -import CoreLocation import Polyline - /** A `Route` object defines a single route that the user can follow to visit a series of waypoints in order. The route object includes information about the route, such as its distance and expected travel time. Depending on the criteria used to calculate the route, the route object may also include detailed turn-by-turn instructions. Typically, you do not create instances of this class directly. Instead, you receive route objects when you request directions using the `Directions.calculate(_:completionHandler:)` method. However, if you use the `Directions.url(forCalculating:)` method instead, you can pass the results of the HTTP request into this class’s initializer. */ - -open class Route: DirectionsResult { - // MARK: Creating a Route +@objc(MBRoute) +open class Route: NSObject, Codable { - internal override init(json: [String : Any]? = nil, legs: [RouteLeg], distance: CLLocationDistance, expectedTravelTime: TimeInterval, coordinates: [CLLocationCoordinate2D]?, speechLocale: Locale?, options: DirectionsOptions) { - super.init(json: json, legs: legs, distance: distance, expectedTravelTime: expectedTravelTime, coordinates: coordinates, speechLocale: speechLocale, options: options) + private enum CodingKeys: String, CodingKey { + case distance + case routeIdentifier + case legs + case v4steps = "steps" + case v4summary = "summary" + case expectedTravelTime = "duration" + case routeOptions + case geometry } - /** - Initializes a new route object with the given JSON dictionary representation and waypoints. - - This initializer is intended for use in conjunction with the `Directions.url(forCalculating:)` method. - - - parameter json: A JSON dictionary representation of the route as returned by the Mapbox Directions API. - - parameter waypoints: An array of waypoints that the route visits in chronological order. - - parameter options: The options used when requesting the route. - */ + public func encode(to encoder: Encoder) throws { + var container = encoder.container(keyedBy: CodingKeys.self) + try container.encode(legs, forKey: .legs) + try container.encode(distance, forKey: .distance) + try container.encode(expectedTravelTime, forKey: .expectedTravelTime) + try container.encode(routeOptions, forKey: .routeOptions) + } - public init(json: [String: Any], waypoints: [Waypoint], options: RouteOptions) { - // Associate each leg JSON with a source and destination. The sequence of destinations is offset by one from the sequence of sources. - let legInfo = zip(zip(waypoints.prefix(upTo: waypoints.endIndex - 1), waypoints.suffix(from: 1)), - json["legs"] as? [JSONDictionary] ?? []) - let legs = legInfo.map { (endpoints, json) -> RouteLeg in - RouteLeg(json: json, source: endpoints.0, destination: endpoints.1, options: options) + public required init(from decoder: Decoder) throws { + let container = try decoder.container(keyedBy: CodingKeys.self) + + if let routeOptions = try container.decodeIfPresent(RouteOptions.self, forKey: .routeOptions) { + self.routeOptions = routeOptions + } else { + self.routeOptions = decoder.userInfo[CodingUserInfoKey.routeOptions!] as! RouteOptions } - let distance = json["distance"] as! Double - let expectedTravelTime = json["duration"] as! Double - let coordinates = options.shapeFormat.coordinates(from: json["geometry"]) + let geometry = try container.decodeIfPresent(UncertainCodable.self, forKey: .geometry) + if let geo = geometry?.value as? String { + if routeOptions is RouteOptionsV4 { + coordinates = decodePolyline(geo, precision: 1e6) + } else { + coordinates = decodePolyline(geo, precision: 1e5) + } + } else if let geo = geometry?.value as? Geometry { + coordinates = geo.coordinates + } else { + coordinates = nil + } + + distance = try container.decode(CLLocationDistance.self, forKey: .distance) + expectedTravelTime = try container.decode(TimeInterval.self, forKey: .expectedTravelTime) - var speechLocale: Locale? - if let locale = json["voiceLocale"] as? String { - speechLocale = Locale(identifier: locale) + if let legs = try container.decodeIfPresent([RouteLeg].self, forKey: .legs) { + self.legs = legs + } else { + // V4 + let legName = try container.decodeIfPresent(String.self, forKey: .v4summary) ?? "" + let steps = try container.decodeIfPresent([RouteStep].self, forKey: .v4steps) + self.legs = [RouteLeg(steps: steps!, source: routeOptions.waypoints.first!, + destination: routeOptions.waypoints.last!, name: legName, distance: distance, + expectedTravelTime: expectedTravelTime, profileIdentifier: routeOptions.profileIdentifier)] } - super.init(json: json, legs: legs, distance: distance, expectedTravelTime: expectedTravelTime, coordinates: coordinates, speechLocale: speechLocale, options: options) + // Associate each leg JSON with a source and destination. The sequence of destinations is offset by one from the sequence of sources. + let waypoints = routeOptions.waypoints + let legInfos = zip(zip(waypoints.prefix(upTo: waypoints.endIndex - 1), waypoints.suffix(from: 1)), legs) + for legInfo in legInfos { + legInfo.1.source = legInfo.0.0 + legInfo.1.destination = legInfo.0.1 + } } - public var routeOptions: RouteOptions { - return super.directionsOptions as! RouteOptions + // MARK: Creating a Route + + @objc internal init(routeOptions: RouteOptions, legs: [RouteLeg], distance: CLLocationDistance, expectedTravelTime: TimeInterval, coordinates: [CLLocationCoordinate2D]?) { + self.routeOptions = routeOptions + self.legs = legs + self.distance = distance + self.expectedTravelTime = expectedTravelTime + self.coordinates = coordinates } - public required init?(coder decoder: NSCoder) { - super.init(coder: decoder) + // MARK: Getting the Route Geometry + + /** + An array of geographic coordinates defining the path of the route from start to finish. + + This array may be `nil` or simplified depending on the `routeShapeResolution` property of the original `RouteOptions` object. + + Using the [Mapbox Maps SDK for iOS](https://www.mapbox.com/ios-sdk/) or [Mapbox Maps SDK for macOS](https://github.com/mapbox/mapbox-gl-native/tree/master/platform/macos/), you can create an `MGLPolyline` object using these coordinates to display an overview of the route on an `MGLMapView`. + */ + @objc open let coordinates: [CLLocationCoordinate2D]? + + /** + The number of coordinates. + + The value of this property may be zero or reduced depending on the `routeShapeResolution` property of the original `RouteOptions` object. + + - note: This initializer is intended for Objective-C usage. In Swift code, use the `coordinates.count` property. + */ + @objc open var coordinateCount: UInt { + return UInt(coordinates?.count ?? 0) } - override public class var supportsSecureCoding: Bool { - return true + /** + Retrieves the coordinates. + + The array may be empty or simplified depending on the `routeShapeResolution` property of the original `RouteOptions` object. + + Using the [Mapbox Maps SDK for iOS](https://www.mapbox.com/ios-sdk/) or [Mapbox Maps SDK for macOS](https://github.com/mapbox/mapbox-gl-native/tree/master/platform/macos/), you can create an `MGLPolyline` object using these coordinates to display an overview of the route on an `MGLMapView`. + + - parameter coordinates: A pointer to a C array of `CLLocationCoordinate2D` instances. On output, this array contains all the vertices of the overlay. + + - precondition: `coordinates` must be large enough to hold `coordinateCount` instances of `CLLocationCoordinate2D`. + + - note: This initializer is intended for Objective-C usage. In Swift code, use the `coordinates` property. + */ + @objc open func getCoordinates(_ coordinates: UnsafeMutablePointer) { + for i in 0..<(self.coordinates?.count ?? 0) { + coordinates.advanced(by: i).pointee = self.coordinates![i] + } } -} - -// MARK: Support for Directions API v4 - -internal class RouteV4: Route { - convenience override init(json: JSONDictionary, waypoints: [Waypoint], options: RouteOptions) { - let leg = RouteLegV4(json: json, source: waypoints.first!, destination: waypoints.last!, options: options) - let distance = json["distance"] as! Double - let expectedTravelTime = json["duration"] as! Double - - var coordinates: [CLLocationCoordinate2D]? - switch json["geometry"] { - case let geometry as JSONDictionary: - coordinates = CLLocationCoordinate2D.coordinates(geoJSON: geometry) - case let geometry as String: - coordinates = decodePolyline(geometry, precision: 1e6)! - default: - coordinates = nil + + /** + An array of `RouteLeg` objects representing the legs of the route. + + The number of legs in this array depends on the number of waypoints. A route with two waypoints (the source and destination) has one leg, a route with three waypoints (the source, an intermediate waypoint, and the destination) has two legs, and so on. + + To determine the name of the route, concatenate the names of the route’s legs. + */ + @objc open let legs: [RouteLeg] + + @objc open override var description: String { + return legs.map { $0.name }.joined(separator: " – ") + } + + // MARK: Getting Additional Route Details + + /** + The route’s distance, measured in meters. + + The value of this property accounts for the distance that the user must travel to traverse the path of the route. It is the sum of the `distance` properties of the route’s legs, not the sum of the direct distances between the route’s waypoints. You should not assume that the user would travel along this distance at a fixed speed. + */ + @objc open let distance: CLLocationDistance + + /** + The route’s expected travel time, measured in seconds. + + The value of this property reflects the time it takes to traverse the entire route. It is the sum of the `expectedTravelTime` properties of the route’s legs. If the route was calculated using the `MBDirectionsProfileIdentifierAutomobileAvoidingTraffic` profile, this property reflects current traffic conditions at the time of the request, not necessarily the traffic conditions at the time the user would begin the route. For other profiles, this property reflects travel time under ideal conditions and does not account for traffic congestion. If the route makes use of a ferry or train, the actual travel time may additionally be subject to the schedules of those services. + + Do not assume that the user would travel along the route at a fixed speed. For more granular travel times, use the `RouteLeg.expectedTravelTime` or `RouteStep.expectedTravelTime`. For even more granularity, specify the `AttributeOptions.expectedTravelTime` option and use the `RouteLeg.expectedSegmentTravelTimes` property. + */ + @objc open let expectedTravelTime: TimeInterval + + /** + `RouteOptions` used to create the directions request. + + The route options object’s profileIdentifier property reflects the primary mode of transportation used for the route. Individual steps along the route might use different modes of transportation as necessary. + */ + @objc open let routeOptions: RouteOptions + + /** + The [access token](https://www.mapbox.com/help/define-access-token/) used to make the directions request. + + This property is set automatically if a request is made via `Directions.calculate(_:completionHandler:)`. + */ + @objc open var accessToken: String? + + /** + The endpoint used to make the directions request. + + This property is set automatically if a request is made via `Directions.calculate(_:completionHandler:)`. + */ + @objc open var apiEndpoint: URL? + + func debugQuickLookObject() -> Any? { + if let coordinates = coordinates { + return debugQuickLookURL(illustrating: coordinates, profileIdentifier: routeOptions.profileIdentifier) } - - self.init(legs: [leg], distance: distance, expectedTravelTime: expectedTravelTime, coordinates: coordinates, speechLocale: nil, options: options) + return nil } -} + + /** + A unique identifier for a directions request. + + Each route produced by a single call to `Directions.calculate(_:completionHandler:)` has the same route identifier. + */ + @objc open var routeIdentifier: String? diff --git a/Sources/MapboxDirections/MBRouteLeg.swift b/Sources/MapboxDirections/MBRouteLeg.swift index 8b3f1de3d..c468f6e35 100644 --- a/Sources/MapboxDirections/MBRouteLeg.swift +++ b/Sources/MapboxDirections/MBRouteLeg.swift @@ -43,7 +43,8 @@ open class RouteLeg: NSObject, NSSecureCoding { } if let congestion = jsonAttributes["congestion"] as? [String] { congestionLevels = congestion.map { - CongestionLevel(description: $0)! + #warning("derail") + return CongestionLevel(rawValue: $0)! } } } diff --git a/Sources/MapboxDirections/MBRouteOptions.swift b/Sources/MapboxDirections/MBRouteOptions.swift index 346d61abb..3dd53cf7d 100644 --- a/Sources/MapboxDirections/MBRouteOptions.swift +++ b/Sources/MapboxDirections/MBRouteOptions.swift @@ -1,31 +1,172 @@ -import Foundation -import CoreLocation -#if SWIFT_PACKAGE -import CMapboxDirections -#endif - - /** - By default, pedestrians are assumed to walk at an average rate of 1.42 meters per second (5.11 kilometers per hour or 3.18 miles per hour), corresponding to a typical preferred walking speed. + A `RouteShapeFormat` indicates the format of a route’s shape in the raw HTTP response. */ -public let MBDefaultWalkingSpeed: CLLocationSpeed = 1.42 +@objc(MBRouteShapeFormat) +public enum RouteShapeFormat: UInt, CustomStringConvertible { + /** + The route’s shape is delivered in [GeoJSON](http://geojson.org/) format. + + This standard format is human-readable and can be parsed straightforwardly, but it is far more verbose than `polyline`. + */ + case geoJSON + /** + The route’s shape is delivered in [encoded polyline algorithm](https://developers.google.com/maps/documentation/utilities/polylinealgorithm) format with 1×10−5 precision. + + This machine-readable format is considerably more compact than `geoJSON` but less precise than `polyline6`. + */ + case polyline + /** + The route’s shape is delivered in [encoded polyline algorithm](https://developers.google.com/maps/documentation/utilities/polylinealgorithm) format with 1×10−6 precision. + + This format is an order of magnitude more precise than `polyline`. + */ + case polyline6 + + public init?(description: String) { + let format: RouteShapeFormat + switch description { + case "geojson": + format = .geoJSON + case "polyline": + format = .polyline + case "polyline6": + format = .polyline6 + default: + return nil + } + self.init(rawValue: format.rawValue) + } + + public var description: String { + switch self { + case .geoJSON: + return "geojson" + case .polyline: + return "polyline" + case .polyline6: + return "polyline6" + } + } +} /** - Pedestrians are assumed to walk no slower than 0.14 meters per second (0.50 kilometers per hour or 0.31 miles per hour) on average. + A `RouteShapeResolution` indicates the level of detail in a route’s shape, or whether the shape is present at all. */ -public let MBMinimumWalkingSpeed: CLLocationSpeed = 0.14 +@objc(MBRouteShapeResolution) +public enum RouteShapeResolution: UInt, CustomStringConvertible { + /** + The route’s shape is omitted. + + Specify this resolution if you do not intend to show the route line to the user or analyze the route line in any way. + */ + case none + /** + The route’s shape is simplified. + + This resolution considerably reduces the size of the response. The resulting shape is suitable for display at a low zoom level, but it lacks the detail necessary for focusing on individual segments of the route. + */ + case low + /** + The route’s shape is as detailed as possible. + + The resulting shape is equivalent to concatenating the shapes of all the route’s consitituent steps. You can focus on individual segments of this route while faithfully representing the path of the route. If you only intend to show a route overview and do not need to analyze the route line in any way, consider specifying `low` instead to considerably reduce the size of the response. + */ + case full + + public init?(description: String) { + let granularity: RouteShapeResolution + switch description { + case "false": + granularity = .none + case "simplified": + granularity = .low + case "full": + granularity = .full + default: + return nil + } + self.init(rawValue: granularity.rawValue) + } + + public var description: String { + switch self { + case .none: + return "false" + case .low: + return "simplified" + case .full: + return "full" + } + } +} /** - Pedestrians are assumed to walk no faster than 6.94 meters per second (25.0 kilometers per hour or 15.5 miles per hour) on average. + A system of units of measuring distances and other quantities. */ -public let MBMaximumWalkingSpeed: CLLocationSpeed = 6.94 +@objc(MBMeasurementSystem) +public enum MeasurementSystem: UInt, CustomStringConvertible { + + /** + U.S. customary and British imperial units. + + Distances are measured in miles and feet. + */ + case imperial + + /** + The metric system. + + Distances are measured in kilometers and meters. + */ + case metric + + public init?(description: String) { + let measurementSystem: MeasurementSystem + switch description { + case "imperial": + measurementSystem = .imperial + case "metric": + measurementSystem = .metric + default: + return nil + } + self.init(rawValue: measurementSystem.rawValue) + } + + public var description: String { + switch self { + case .imperial: + return "imperial" + case .metric: + return "metric" + } + } +} /** A `RouteOptions` object is a structure that specifies the criteria for results returned by the Mapbox Directions API. Pass an instance of this class into the `Directions.calculate(_:completionHandler:)` method. */ -open class RouteOptions: DirectionsOptions { +@objc(MBRouteOptions) +open class RouteOptions: NSObject, Codable, NSCopying { + // MARK: Creating a Route Options Object + + /** + Initializes a route options object for routes between the given waypoints and an optional profile identifier. + + - parameter waypoints: An array of `Waypoint` objects representing locations that the route should visit in chronological order. The array should contain at least two waypoints (the source and destination) and at most 25 waypoints. (Some profiles, such as `MBDirectionsProfileIdentifierAutomobileAvoidingTraffic`, [may have lower limits](https://www.mapbox.com/api-documentation/#directions).) + - parameter profileIdentifier: A string specifying the primary mode of transportation for the routes. This parameter, if set, should be set to `MBDirectionsProfileIdentifierAutomobile`, `MBDirectionsProfileIdentifierAutomobileAvoidingTraffic`, `MBDirectionsProfileIdentifierCycling`, or `MBDirectionsProfileIdentifierWalking`. `MBDirectionsProfileIdentifierAutomobile` is used by default. + */ + @objc public init(waypoints: [Waypoint], profileIdentifier: MBDirectionsProfileIdentifier? = nil) { + assert(waypoints.count >= 2, "A route requires at least a source and destination.") + assert(waypoints.count <= 25, "A route may not have more than 25 waypoints.") + + self.waypoints = waypoints + self.profileIdentifier = profileIdentifier ?? .automobile + self.allowsUTurnAtWaypoint = ![MBDirectionsProfileIdentifier.automobile.rawValue, MBDirectionsProfileIdentifier.automobileAvoidingTraffic.rawValue].contains(self.profileIdentifier.rawValue) + } + /** Initializes a route options object for routes between the given locations and an optional profile identifier. @@ -34,7 +175,7 @@ open class RouteOptions: DirectionsOptions { - parameter locations: An array of `CLLocation` objects representing locations that the route should visit in chronological order. The array should contain at least two locations (the source and destination) and at most 25 locations. Each location object is converted into a `Waypoint` object. This class respects the `CLLocation` class’s `coordinate` and `horizontalAccuracy` properties, converting them into the `Waypoint` class’s `coordinate` and `coordinateAccuracy` properties, respectively. - parameter profileIdentifier: A string specifying the primary mode of transportation for the routes. This parameter, if set, should be set to `MBDirectionsProfileIdentifierAutomobile`, `MBDirectionsProfileIdentifierAutomobileAvoidingTraffic`, `MBDirectionsProfileIdentifierCycling`, or `MBDirectionsProfileIdentifierWalking`. `MBDirectionsProfileIdentifierAutomobile` is used by default. */ - public convenience init(locations: [CLLocation], profileIdentifier: DirectionsProfileIdentifier? = nil) { + @objc public convenience init(locations: [CLLocation], profileIdentifier: MBDirectionsProfileIdentifier? = nil) { let waypoints = locations.map { Waypoint(location: $0) } self.init(waypoints: waypoints, profileIdentifier: profileIdentifier) } @@ -45,64 +186,74 @@ open class RouteOptions: DirectionsOptions { - parameter coordinates: An array of geographic coordinates representing locations that the route should visit in chronological order. The array should contain at least two locations (the source and destination) and at most 25 locations. Each coordinate is converted into a `Waypoint` object. - parameter profileIdentifier: A string specifying the primary mode of transportation for the routes. This parameter, if set, should be set to `MBDirectionsProfileIdentifierAutomobile`, `MBDirectionsProfileIdentifierAutomobileAvoidingTraffic`, `MBDirectionsProfileIdentifierCycling`, or `MBDirectionsProfileIdentifierWalking`. `MBDirectionsProfileIdentifierAutomobile` is used by default. */ - public convenience init(coordinates: [CLLocationCoordinate2D], profileIdentifier: DirectionsProfileIdentifier? = nil) { + @objc public convenience init(coordinates: [CLLocationCoordinate2D], profileIdentifier: MBDirectionsProfileIdentifier? = nil) { let waypoints = coordinates.map { Waypoint(coordinate: $0) } self.init(waypoints: waypoints, profileIdentifier: profileIdentifier) } - /** - Initializes a route options object for routes between the given waypoints and an optional profile identifier. - - - parameter waypoints: An array of `Waypoint` objects representing locations that the route should visit in chronological order. The array should contain at least two waypoints (the source and destination) and at most 25 waypoints. (Some profiles, such as `MBDirectionsProfileIdentifierAutomobileAvoidingTraffic`, [may have lower limits](https://docs.mapbox.com/api/navigation/#directions).) - - parameter profileIdentifier: A string specifying the primary mode of transportation for the routes. This parameter, if set, should be set to `MBDirectionsProfileIdentifierAutomobile`, `MBDirectionsProfileIdentifierAutomobileAvoidingTraffic`, `MBDirectionsProfileIdentifierCycling`, or `MBDirectionsProfileIdentifierWalking`. `MBDirectionsProfileIdentifierAutomobile` is used by default. - */ - public required init(waypoints: [Waypoint], profileIdentifier: DirectionsProfileIdentifier? = nil) { - super.init(waypoints: waypoints, profileIdentifier: profileIdentifier) - self.allowsUTurnAtWaypoint = ![MBDirectionsProfileIdentifier.automobile.rawValue, MBDirectionsProfileIdentifier.automobileAvoidingTraffic.rawValue].contains(self.profileIdentifier.rawValue) + private enum CodingKeys: String, CodingKey { + case waypoints + case allowsUTurnAtWaypoint + case profileIdentifier + case includesAlternativeRoutes + case includesSteps + case shapeFormat + case routeShapeResolution + case attributeOptions + case includesExitRoundaboutManeuver + case locale + case includesSpokenInstructions + case distanceMeasurementSystem + case includesVisualInstructions + case roadClassesToAvoid } - - internal convenience init(matchOptions: MatchOptions) { - self.init(waypoints: matchOptions.waypoints, profileIdentifier: matchOptions.profileIdentifier) - self.includesSteps = matchOptions.includesSteps - self.shapeFormat = matchOptions.shapeFormat - self.attributeOptions = matchOptions.attributeOptions - self.routeShapeResolution = matchOptions.routeShapeResolution - self.locale = matchOptions.locale - self.includesSpokenInstructions = matchOptions.includesSpokenInstructions - self.includesVisualInstructions = matchOptions.includesVisualInstructions + + public func encode(to encoder: Encoder) throws { + var container = encoder.container(keyedBy: CodingKeys.self) + try container.encode(waypoints, forKey: .waypoints) + try container.encode(allowsUTurnAtWaypoint, forKey: .allowsUTurnAtWaypoint) + try container.encode(profileIdentifier.rawValue, forKey: .profileIdentifier) + try container.encode(includesAlternativeRoutes, forKey: .includesAlternativeRoutes) + try container.encode(includesSteps, forKey: .includesSteps) + try container.encode(shapeFormat.rawValue, forKey: .shapeFormat) + try container.encode(routeShapeResolution.rawValue, forKey: .routeShapeResolution) + try container.encode(attributeOptions.rawValue, forKey: .attributeOptions) + try container.encode(includesExitRoundaboutManeuver, forKey: .includesExitRoundaboutManeuver) + try container.encode(locale, forKey: .locale) + try container.encode(includesSpokenInstructions, forKey: .includesSpokenInstructions) + try container.encode(distanceMeasurementSystem.rawValue, forKey: .distanceMeasurementSystem) + try container.encode(includesVisualInstructions, forKey: .includesVisualInstructions) + try container.encode(roadClassesToAvoid, forKey: .roadClassesToAvoid) } - - public required init?(coder decoder: NSCoder) { - super.init(coder: decoder) - - allowsUTurnAtWaypoint = decoder.decodeBool(forKey: "allowsUTurnAtWaypoint") - - includesAlternativeRoutes = decoder.decodeBool(forKey: "includesAlternativeRoutes") - - includesExitRoundaboutManeuver = decoder.decodeBool(forKey: "includesExitRoundaboutManeuver") - - let roadClassesToAvoidDescriptions = decoder.decodeObject(of: NSString.self, forKey: "roadClassesToAvoid") as String? - roadClassesToAvoid = RoadClasses(descriptions: roadClassesToAvoidDescriptions?.components(separatedBy: ",") ?? []) ?? [] - - alleyPriority = DirectionsPriority(rawValue: decoder.decodeDouble(forKey: "alleyPriority")) - walkwayPriority = DirectionsPriority(rawValue: decoder.decodeDouble(forKey: "walkwayPriority")) - speed = decoder.decodeDouble(forKey: "speed") + + public required init(from decoder: Decoder) throws { + let container = try decoder.container(keyedBy: CodingKeys.self) + waypoints = try container.decode([Waypoint].self, forKey: .waypoints) + allowsUTurnAtWaypoint = try container.decode(Bool.self, forKey: .allowsUTurnAtWaypoint) + profileIdentifier = MBDirectionsProfileIdentifier(rawValue: try container.decode(String.self, forKey: .profileIdentifier)) + includesAlternativeRoutes = try container.decode(Bool.self, forKey: .includesAlternativeRoutes) + includesSteps = try container.decode(Bool.self, forKey: .includesSteps) + shapeFormat = RouteShapeFormat(rawValue: try container.decode(UInt.self, forKey: .shapeFormat))! + routeShapeResolution = RouteShapeResolution(rawValue: try container.decode(UInt.self, forKey: .routeShapeResolution))! + attributeOptions = AttributeOptions(rawValue: try container.decode(UInt.self, forKey: .attributeOptions)) + includesExitRoundaboutManeuver = try container.decode(Bool.self, forKey: .includesExitRoundaboutManeuver) + locale = try container.decode(Locale.self, forKey: .locale) + includesSpokenInstructions = try container.decode(Bool.self, forKey: .includesSpokenInstructions) + distanceMeasurementSystem = MeasurementSystem(rawValue: try container.decode(UInt.self, forKey: .distanceMeasurementSystem))! + includesVisualInstructions = try container.decode(Bool.self, forKey: .includesVisualInstructions) + roadClassesToAvoid = try container.decode(RoadClasses.self, forKey: .roadClassesToAvoid) } + + // MARK: Specifying the Path of the Route - public override func encode(with coder: NSCoder) { - super.encode(with: coder) - coder.encode(allowsUTurnAtWaypoint, forKey: "allowsUTurnAtWaypoint") - coder.encode(includesAlternativeRoutes, forKey: "includesAlternativeRoutes") - coder.encode(includesExitRoundaboutManeuver, forKey: "includesExitRoundaboutManeuver") - coder.encode(roadClassesToAvoid.description, forKey: "roadClassesToAvoid") - coder.encode(alleyPriority.rawValue, forKey: "alleyPriority") - coder.encode(walkwayPriority.rawValue, forKey: "walkwayPriority") - coder.encode(speed, forKey: "speed") - } + /** + An array of `Waypoint` objects representing locations that the route should visit in chronological order. - internal override var abridgedPath: String { - return "directions/v5/\(profileIdentifier.rawValue)" - } + A waypoint object indicates a location to visit, as well as an optional heading from which to approach the location. + + The array should contain at least two waypoints (the source and destination) and at most 25 waypoints. + */ + @objc open var waypoints: [Waypoint] /** A Boolean value that indicates whether a returned route may require a point U-turn at an intermediate waypoint. @@ -113,7 +264,18 @@ open class RouteOptions: DirectionsOptions { The default value of this property is `false` when the profile identifier is `MBDirectionsProfileIdentifierAutomobile` or `MBDirectionsProfileIdentifierAutomobileAvoidingTraffic` and `true` otherwise. */ - open var allowsUTurnAtWaypoint: Bool = false + @objc open var allowsUTurnAtWaypoint: Bool + + // MARK: Specifying Transportation Options + + /** + A string specifying the primary mode of transportation for the routes. + + This property should be set to `MBDirectionsProfileIdentifierAutomobile`, `MBDirectionsProfileIdentifierAutomobileAvoidingTraffic`, `MBDirectionsProfileIdentifierCycling`, or `MBDirectionsProfileIdentifierWalking`. The default value of this property is `MBDirectionsProfileIdentifierAutomobile`, which specifies driving directions. + */ + @objc open var profileIdentifier: MBDirectionsProfileIdentifier + + // MARK: Specifying the Response Format /** A Boolean value indicating whether alternative routes should be included in the response. @@ -124,162 +286,253 @@ open class RouteOptions: DirectionsOptions { The default value of this property is `false`. */ - open var includesAlternativeRoutes = false + @objc open var includesAlternativeRoutes = false + + /** + A Boolean value indicating whether `MBRouteStep` objects should be included in the response. + + If the value of this property is `true`, the returned route contains turn-by-turn instructions. Each returned `MBRoute` object contains one or more `MBRouteLeg` object that in turn contains one or more `MBRouteStep` objects. On the other hand, if the value of this property is `false`, the `MBRouteLeg` objects contain no `MBRouteStep` objects. + + If you only want to know the distance or estimated travel time to a destination, set this property to `false` to minimize the size of the response and the time it takes to calculate the response. If you need to display turn-by-turn instructions, set this property to `true`. + + The default value of this property is `false`. + */ + @objc open var includesSteps = false + + /** + Format of the data from which the shapes of the returned route and its steps are derived. + + This property has no effect on the returned shape objects, although the choice of format can significantly affect the size of the underlying HTTP response. + + The default value of this property is `polyline`. + */ + @objc open var shapeFormat = RouteShapeFormat.polyline + + /** + Resolution of the shape of the returned route. + + This property has no effect on the shape of the returned route’s steps. + + The default value of this property is `low`, specifying a low-resolution route shape. + */ + @objc open var routeShapeResolution = RouteShapeResolution.low + + /** + AttributeOptions for the route. Any combination of `AttributeOptions` can be specified. + + By default, no attribute options are specified. It is recommended that `routeShapeResolution` be set to `.full`. + */ + @objc open var attributeOptions: AttributeOptions = [] + + // MARK: Constructing the Request URL + + /** + The path of the request URL, not including the hostname or any parameters. + */ + internal var path: String { + assert(!queries.isEmpty, "No query") + + let queryComponent = queries.joined(separator: ";") + return "directions/v5/\(profileIdentifier.rawValue)/\(queryComponent).json" + } + + /** + An array of directions query strings to include in the request URL. + */ + internal var queries: [String] { + return waypoints.map { "\($0.coordinate.longitude),\($0.coordinate.latitude)" } + } /** A Boolean value indicating whether the route includes a `ManeuverType.exitRoundabout` or `ManeuverType.exitRotary` step when traversing a roundabout or rotary, respectively. If this option is set to `true`, a route that traverses a roundabout includes both a `ManeuverType.takeRoundabout` step and a `ManeuverType.exitRoundabout` step; likewise, a route that traverses a large, named roundabout includes both a `ManeuverType.takeRotary` step and a `ManeuverType.exitRotary` step. Otherwise, it only includes a `ManeuverType.takeRoundabout` or `ManeuverType.takeRotary` step. This option is set to `false` by default. */ - open var includesExitRoundaboutManeuver = false + @objc open var includesExitRoundaboutManeuver = false /** - The route classes that the calculated routes will avoid. + The locale in which the route’s instructions are written. - Currently, you can only specify a single road class to avoid. + If you use MapboxDirections.swift with the Mapbox Directions API, this property affects the sentence contained within the `RouteStep.instructions` property, but it does not affect any road names contained in that property or other properties such as `RouteStep.name`. + + The Directions API can provide instructions in [a number of languages](https://www.mapbox.com/api-documentation/#instructions-languages). Set this property to `Bundle.main.preferredLocalizations.first` or `Locale.autoupdatingCurrent` to match the application’s language or the system language, respectively. + + By default, this property is set to the current system locale. */ - open var roadClassesToAvoid: RoadClasses = [] + @objc open var locale = Locale.autoupdatingCurrent { + didSet { + self.distanceMeasurementSystem = locale.usesMetric ? .metric : .imperial + } + } /** - A number that influences whether the route should prefer or avoid alleys or narrow service roads between buildings. - - This property has no effect unless the profile identifier is set to `MBDirectionsProfileIdentifier.walking`. - - The value of this property must be at least `MBDirectionsPriority.low` and at most `MBDirectionsPriority.high`. The default value of `MBDirectionsPriority.default` neither prefers nor avoids alleys, while a negative value between `MBDirectionsPriority.low` and `MBDirectionsPriority.default` avoids alleys, and a positive value between `MBDirectionsPriority.default` and `MBDirectionsPriority.high` prefers alleys. A value of 0.9 is suitable for pedestrians who are comfortable with walking down alleys. + A Boolean value indicating whether each route step includes an array of `SpokenInstructions`. + + If this option is set to true, the `RouteStep.instructionsSpokenAlongStep` property is set to an array of `SpokenInstructions`. + */ + @objc open var includesSpokenInstructions = false + + /** + The measurement system used in spoken instructions included in route steps. + + If the `includesSpokenInstructions` property is set to `true`, this property determines the units used for measuring the distance remaining until an upcoming maneuver. If the `includesSpokenInstructions` property is set to `false`, this property has no effect. + + You should choose a measurement system appropriate for the current region. You can also allow the user to indicate their preferred measurement system via a setting. */ - open var alleyPriority: DirectionsPriority = .default + @objc open var distanceMeasurementSystem: MeasurementSystem = Locale.autoupdatingCurrent.usesMetric ? .metric : .imperial /** - A number that influences whether the route should prefer or avoid roads or paths that are set aside for pedestrian-only use (walkways or footpaths). + :nodoc: + If true, each `RouteStep` will contain the property `visualInstructionsAlongStep`. - This property has no effect unless the profile identifier is set to `MBDirectionsProfileIdentifier.walking`. You can adjust this property to avoid [sidewalks and crosswalks that are mapped as separate footpaths](https://wiki.openstreetmap.org/wiki/Sidewalks#Sidewalk_as_separate_way), which may be more granular than needed for some forms of pedestrian navigation. + `visualInstructionsAlongStep` contains an array of `VisualInstruction` used for visually conveying information about a given `RouteStep`. + */ + @objc open var includesVisualInstructions = false + + /** + The route classes that the calculated routes will avoid. - The value of this property must be at least `MBDirectionsPriority.low` and at most `MBDirectionsPriority.high`. The default value of `MBDirectionsPriority.default` neither prefers nor avoids walkways, while a negative value between `MBDirectionsPriority.low` and `MBDirectionsPriority.default` avoids walkways, and a positive value between `MBDirectionsPriority.default` and `MBDirectionsPriority.high` prefers walkways. A value of −0.1 results in less verbose routes in cities where sidewalks and crosswalks are generally mapped as separate footpaths. + Currently, you can only specify a single road class to avoid. */ - open var walkwayPriority: DirectionsPriority = .default + @objc open var roadClassesToAvoid: RoadClasses = [] /** - The expected uniform travel speed measured in meters per second. - - This property has no effect unless the profile identifier is set to `MBDirectionsProfileIdentifier.walking`. You can adjust this property to account for running or for faster or slower gaits. When the profile identifier is set to another profile identifier, such as `MBDirectionsProfileIdentifier.driving`, this property is ignored in favor of the expected travel speed on each road along the route. This property may be supported by other routing profiles in the future. - - The value of this property must be at least `MBMinimumWalkingSpeed` and at most `MBMaximumWalkingSpeed`. The default value is `MBDefaultWalkingSpeed`. + An array of URL parameters to include in the request URL. */ - open var speed: CLLocationSpeed = MBDefaultWalkingSpeed - - override open var urlQueryItems: [URLQueryItem] { - var queryItems = super.urlQueryItems - - queryItems.append(contentsOf: [ + internal var params: [URLQueryItem] { + var params: [URLQueryItem] = [ URLQueryItem(name: "alternatives", value: String(includesAlternativeRoutes)), - URLQueryItem(name: "continue_straight", value: String(!allowsUTurnAtWaypoint)) - ]) - + URLQueryItem(name: "geometries", value: String(describing: shapeFormat)), + URLQueryItem(name: "overview", value: String(describing: routeShapeResolution)), + URLQueryItem(name: "steps", value: String(includesSteps)), + URLQueryItem(name: "continue_straight", value: String(!allowsUTurnAtWaypoint)), + URLQueryItem(name: "language", value: locale.identifier) + ] + if includesExitRoundaboutManeuver { - queryItems.append(URLQueryItem(name: "roundabout_exits", value: String(includesExitRoundaboutManeuver))) + params.append(URLQueryItem(name: "roundabout_exits", value: String(includesExitRoundaboutManeuver))) + } + + if includesSpokenInstructions { + params.append(URLQueryItem(name: "voice_instructions", value: String(includesSpokenInstructions))) + params.append(URLQueryItem(name: "voice_units", value: String(describing: distanceMeasurementSystem))) } - if profileIdentifier == .walking { - queryItems.append(URLQueryItem(name: "alley_bias", value: String(alleyPriority.rawValue))) - queryItems.append(URLQueryItem(name: "walkway_bias", value: String(walkwayPriority.rawValue))) - queryItems.append(URLQueryItem(name: "walking_speed", value: String(speed))) + if includesVisualInstructions { + params.append(URLQueryItem(name: "banner_instructions", value: String(includesVisualInstructions))) } - + if !roadClassesToAvoid.isEmpty { let allRoadClasses = roadClassesToAvoid.description.components(separatedBy: ",") if allRoadClasses.count > 1 { assert(false, "`roadClassesToAvoid` only accepts one `RoadClasses`.") } if let firstRoadClass = allRoadClasses.first { - queryItems.append(URLQueryItem(name: "exclude", value: firstRoadClass)) + params.append(URLQueryItem(name: "exclude", value: firstRoadClass)) } } - if waypoints.first(where: { CLLocationCoordinate2DIsValid($0.targetCoordinate) }) != nil { - let targetCoordinates = waypoints.map { $0.targetCoordinate.stringForRequestURL ?? "" }.joined(separator: ";") - queryItems.append(URLQueryItem(name: "waypoint_targets", value: targetCoordinates)) + // Include headings and heading accuracies if any waypoint has a nonnegative heading. + if !waypoints.filter({ $0.heading >= 0 }).isEmpty { + let headings = waypoints.map { $0.headingDescription }.joined(separator: ";") + params.append(URLQueryItem(name: "bearings", value: headings)) } - return queryItems - } - - /** - Returns response objects that represent the given JSON dictionary data. - - - parameter json: The API response in JSON dictionary format. - - returns: A tuple containing an array of waypoints and an array of routes. - */ - public func response(from json: [String: Any]) -> ([Waypoint]?, [Route]?) { - var namedWaypoints: [Waypoint]? - if let jsonWaypoints = (json["waypoints"] as? [JSONDictionary]) { - namedWaypoints = zip(jsonWaypoints, self.waypoints).map { (api, local) -> Waypoint in - let location = api["location"] as! [Double] - let coordinate = CLLocationCoordinate2D(geoJSON: location) - let possibleAPIName = api["name"] as? String - let apiName = possibleAPIName?.nonEmptyString - let waypoint = local.copy() as! Waypoint - waypoint.coordinate = coordinate - waypoint.name = waypoint.name ?? apiName - return waypoint - } + // Include location accuracies if any waypoint has a nonnegative coordinate accuracy. + if !waypoints.filter({ $0.coordinateAccuracy >= 0 }).isEmpty { + let accuracies = waypoints.map { + $0.coordinateAccuracy >= 0 ? String($0.coordinateAccuracy) : "unlimited" + }.joined(separator: ";") + params.append(URLQueryItem(name: "radiuses", value: accuracies)) } - let waypoints = namedWaypoints ?? self.waypoints - waypoints.first?.separatesLegs = true - waypoints.last?.separatesLegs = true - let legSeparators = waypoints.filter { $0.separatesLegs } + if !attributeOptions.isEmpty { + let attributesStrings = String(describing:attributeOptions) - let routes = (json["routes"] as? [JSONDictionary])?.map { - Route(json: $0, waypoints: legSeparators, options: self) + params.append(URLQueryItem(name: "annotations", value: attributesStrings)) } - return (waypoints, routes) - } - override public class var supportsSecureCoding: Bool { - return true + return params } - - + // MARK: NSCopying - override open func copy(with zone: NSZone? = nil) -> Any { - let copy = super.copy(with: zone) as! RouteOptions - copy.allowsUTurnAtWaypoint = allowsUTurnAtWaypoint - copy.includesAlternativeRoutes = includesAlternativeRoutes - copy.includesExitRoundaboutManeuver = includesExitRoundaboutManeuver - copy.roadClassesToAvoid = roadClassesToAvoid - copy.alleyPriority = alleyPriority - copy.walkwayPriority = walkwayPriority - copy.speed = speed - return copy + public func copy(with zone: NSZone? = nil) -> Any { + let data = try! JSONEncoder().encode(self) + return try! JSONDecoder().decode(RouteOptions.self, from: data) } - + //MARK: - OBJ-C Equality open override func isEqual(_ object: Any?) -> Bool { guard let opts = object as? RouteOptions else { return false } return isEqual(to: opts) } - + @objc(isEqualToRouteOptions:) open func isEqual(to routeOptions: RouteOptions?) -> Bool { guard let other = routeOptions else { return false } - guard super.isEqual(to: routeOptions) else { return false } - guard allowsUTurnAtWaypoint == other.allowsUTurnAtWaypoint, - includesAlternativeRoutes == other.includesAlternativeRoutes, + guard waypoints == other.waypoints, + profileIdentifier == other.profileIdentifier, + allowsUTurnAtWaypoint == other.allowsUTurnAtWaypoint, + includesSteps == other.includesSteps, + shapeFormat == other.shapeFormat, + routeShapeResolution == other.routeShapeResolution, + attributeOptions == other.attributeOptions, includesExitRoundaboutManeuver == other.includesExitRoundaboutManeuver, + locale == other.locale, + includesSpokenInstructions == other.includesSpokenInstructions, + includesVisualInstructions == other.includesVisualInstructions, roadClassesToAvoid == other.roadClassesToAvoid, - alleyPriority == other.alleyPriority, - walkwayPriority == other.walkwayPriority, - speed == other.speed else { return false } + distanceMeasurementSystem == other.distanceMeasurementSystem else { return false } return true } } +// MARK: Support for Directions API v4 + +/** + A `RouteShapeFormat` indicates the format of a route’s shape in the raw HTTP response. + */ +@objc(MBInstructionFormat) +public enum InstructionFormat: UInt, CustomStringConvertible { + /** + The route steps’ instructions are delivered in plain text format. + */ + case text + /** + The route steps’ instructions are delivered in HTML format. + + Key phrases are boldfaced. + */ + case html + + public init?(description: String) { + let format: InstructionFormat + switch description { + case "text": + format = .text + case "html": + format = .html + default: + return nil + } + self.init(rawValue: format.rawValue) + } + + public var description: String { + switch self { + case .text: + return "text" + case .html: + return "html" + } + } +} + /** A `RouteOptionsV4` object is a structure that specifies the criteria for results returned by the Mapbox Directions API v4. Pass an instance of this class into the `Directions.calculate(_:completionHandler:)` method. */ -@objcMembers @objc(MBRouteOptionsV4) open class RouteOptionsV4: RouteOptions { // MARK: Specifying the Response Format @@ -289,7 +542,7 @@ open class RouteOptionsV4: RouteOptions { By default, the value of this property is `text`, specifying plain text instructions. */ - open var instructionFormat: InstructionFormat = .text + @objc open var instructionFormat: InstructionFormat = .text /** A Boolean value indicating whether the returned routes and their route steps should include any geographic coordinate data. @@ -298,47 +551,17 @@ open class RouteOptionsV4: RouteOptions { The default value of this property is `true`. */ - open var includesShapes: Bool = true - - public required init(waypoints: [Waypoint], profileIdentifier: DirectionsProfileIdentifier?) { - super.init(waypoints: waypoints, profileIdentifier: profileIdentifier) - } - - public required init?(coder decoder: NSCoder) { - super.init(coder: decoder) - - if let description = decoder.decodeObject(of: NSString.self, forKey: "instructionFormat") as String?, - let format = InstructionFormat(description: description) { - instructionFormat = format - } - - includesShapes = decoder.decodeBool(forKey: "includesShapes") - } - - public override func encode(with coder: NSCoder) { - super.encode(with: coder) - - coder.encode(instructionFormat.description, forKey: "instructionFormat") - coder.encode(includesShapes, forKey: "includesShapes") - } - - override public class var supportsSecureCoding: Bool { - return true - } - - override open func copy(with zone: NSZone? = nil) -> Any { - let copy = super.copy(with: zone) as! RouteOptionsV4 - copy.instructionFormat = instructionFormat - copy.includesShapes = includesShapes - return copy - } - - internal override var abridgedPath: String { + @objc open var includesShapes: Bool = true + + override var path: String { + assert(!queries.isEmpty, "No query") + let profileIdentifier = self.profileIdentifier.rawValue.replacingOccurrences(of: "/", with: ".") - return "v4/directions/\(profileIdentifier)" + let queryComponent = queries.joined(separator: ";") + return "v4/directions/\(profileIdentifier)/\(queryComponent).json" } - override open var urlQueryItems: [URLQueryItem] { + override var params: [URLQueryItem] { return [ URLQueryItem(name: "alternatives", value: String(includesAlternativeRoutes)), URLQueryItem(name: "instructions", value: String(describing: instructionFormat)), @@ -346,15 +569,13 @@ open class RouteOptionsV4: RouteOptions { URLQueryItem(name: "steps", value: String(includesSteps)), ] } +} - override public func response(from json: [String: Any]) -> ([Waypoint]?, [Route]?) { - let sourceWaypoint = Waypoint(geoJSON: json["origin"] as! JSONDictionary)! - let destinationWaypoint = Waypoint(geoJSON: json["destination"] as! JSONDictionary)! - let intermediateWaypoints = (json["waypoints"] as! [JSONDictionary]).compactMap { Waypoint(geoJSON: $0) } - let waypoints = [sourceWaypoint] + intermediateWaypoints + [destinationWaypoint] - let routes = (json["routes"] as? [JSONDictionary])?.map { - RouteV4(json: $0, waypoints: waypoints, options: self) +extension Locale { + fileprivate var usesMetric: Bool { + guard let measurementSystem = (self as NSLocale).object(forKey: .measurementSystem) as? String else { + return false } - return (waypoints, routes) + return measurementSystem == "Metric" } } diff --git a/Sources/MapboxDirections/MBWaypoint.swift b/Sources/MapboxDirections/MBWaypoint.swift index 2336320c3..9437546fb 100644 --- a/Sources/MapboxDirections/MBWaypoint.swift +++ b/Sources/MapboxDirections/MBWaypoint.swift @@ -1,40 +1,50 @@ -import Foundation -import CoreLocation - - /** A `Waypoint` object indicates a location along a route. It may be the route’s origin or destination, or it may be another location that the route visits. A waypoint object indicates the location’s geographic location along with other optional information, such as a name or the user’s direction approaching the waypoint. You create a `RouteOptions` object using waypoint objects and also receive waypoint objects in the completion handler of the `Directions.calculate(_:completionHandler:)` method. */ - - -open class Waypoint: NSObject, NSCopying, NSSecureCoding { +@objc(MBWaypoint) +open class Waypoint: NSObject, Codable { // MARK: Creating a Waypoint Object - - public class var supportsSecureCoding: Bool { - return true + + private enum CodingKeys: String, CodingKey { + case coordinate = "location" + case coordinateAccuracy + case name + } + + public required init(from decoder: Decoder) throws { + let container = try decoder.container(keyedBy: CodingKeys.self) + coordinate = try container.decode(CLLocationCoordinate2D.self, forKey: .coordinate) + coordinateAccuracy = try container.decodeIfPresent(CLLocationAccuracy.self, forKey: .coordinateAccuracy) ?? -1 + + if let name = try container.decodeIfPresent(String.self, forKey: .name), + !name.isEmpty { + self.name = name + } else { + name = nil + } } - + /** Initializes a new waypoint object with the given geographic coordinate and an optional accuracy and name. - + - parameter coordinate: The geographic coordinate of the waypoint. - parameter coordinateAccuracy: The maximum distance away from the waypoint that the route may come and still be considered viable. This parameter is measured in meters. A negative value means the route may be an indefinite number of meters away from the route and still be considered viable. - + It is recommended that the value of this parameter be greater than the `horizontalAccuracy` property of a `CLLocation` object obtained from a `CLLocationManager` object. There is a high likelihood that the user may be located some distance away from a navigable road, for instance if the user is currently on a driveway or inside a building. - parameter name: The name of the waypoint. This parameter does not affect the route but may help you to distinguish one waypoint from another. */ - public init(coordinate: CLLocationCoordinate2D, coordinateAccuracy: CLLocationAccuracy = -1, name: String? = nil) { + @objc public init(coordinate: CLLocationCoordinate2D, coordinateAccuracy: CLLocationAccuracy = -1, name: String? = nil) { self.coordinate = coordinate self.coordinateAccuracy = coordinateAccuracy self.name = name } - + #if os(tvOS) || os(watchOS) /** Initializes a new waypoint object with the given `CLLocation` object and an optional heading value and name. - + - note: This initializer is intended for `CLLocation` objects created using the `CLLocation.init(latitude:longitude:)` initializer. If you intend to use a `CLLocation` object obtained from a `CLLocationManager` object, consider increasing the `horizontalAccuracy` or set it to a negative value to avoid overfitting, since the `Waypoint` class’s `coordinateAccuracy` property represents the maximum allowed deviation from the waypoint. There is a high likelihood that the user may be located some distance away from a navigable road, for instance if the user is currently on a driveway of inside a building. - + - parameter location: A `CLLocation` object representing the waypoint’s location. This initializer respects the `CLLocation` class’s `coordinate` and `horizontalAccuracy` properties, converting them into the `coordinate` and `coordinateAccuracy` properties, respectively. - parameter heading: A `CLLocationDirection` value representing the direction from which the route must approach the waypoint in order to be considered viable. This value is stored in the `headingAccuracy` property. - parameter name: The name of the waypoint. This parameter does not affect the route but may help you to distinguish one waypoint from another. @@ -50,14 +60,14 @@ open class Waypoint: NSObject, NSCopying, NSSecureCoding { #else /** Initializes a new waypoint object with the given `CLLocation` object and an optional `CLHeading` object and name. - + - note: This initializer is intended for `CLLocation` objects created using the `CLLocation.init(latitude:longitude:)` initializer. If you intend to use a `CLLocation` object obtained from a `CLLocationManager` object, consider increasing the `horizontalAccuracy` or set it to a negative value to avoid overfitting, since the `Waypoint` class’s `coordinateAccuracy` property represents the maximum allowed deviation from the waypoint. There is a high likelihood that the user may be located some distance away from a navigable road, for instance if the user is currently on a driveway of inside a building. - + - parameter location: A `CLLocation` object representing the waypoint’s location. This initializer respects the `CLLocation` class’s `coordinate` and `horizontalAccuracy` properties, converting them into the `coordinate` and `coordinateAccuracy` properties, respectively. - parameter heading: A `CLHeading` object representing the direction from which the route must approach the waypoint in order to be considered viable. This initializer respects the `CLHeading` class’s `trueHeading` property or `magneticHeading` property, converting it into the `headingAccuracy` property. - parameter name: The name of the waypoint. This parameter does not affect the route but may help you to distinguish one waypoint from another. */ - public init(location: CLLocation, heading: CLHeading? = nil, name: String? = nil) { + @objc public init(location: CLLocation, heading: CLHeading? = nil, name: String? = nil) { coordinate = location.coordinate coordinateAccuracy = location.horizontalAccuracy if let heading = heading { @@ -66,190 +76,81 @@ open class Waypoint: NSObject, NSCopying, NSSecureCoding { self.name = name } #endif - - public required init?(coder decoder: NSCoder) { - let latitude = decoder.decodeDouble(forKey: "latitude") - let longitude = decoder.decodeDouble(forKey: "longitude") - coordinate = CLLocationCoordinate2D(latitude: latitude, longitude: longitude) - coordinateAccuracy = decoder.decodeDouble(forKey: "coordinateAccuracy") - let targetLatitude = decoder.decodeDouble(forKey: "targetLatitude") - let targetLongitude = decoder.decodeDouble(forKey: "targetLongitude") - targetCoordinate = CLLocationCoordinate2D(latitude: targetLatitude, longitude: targetLongitude) - heading = decoder.decodeDouble(forKey: "heading") - headingAccuracy = decoder.decodeDouble(forKey: "headingAccuracy") - name = decoder.decodeObject(of: NSString.self, forKey: "name") as String? - allowsArrivingOnOppositeSide = decoder.decodeBool(forKey: "allowsArrivingOnOppositeSide") - separatesLegs = decoder.decodeBool(forKey: "separatesLegs") - } - - open func encode(with coder: NSCoder) { - coder.encode(coordinate.latitude, forKey: "latitude") - coder.encode(coordinate.longitude, forKey: "longitude") - coder.encode(coordinateAccuracy, forKey: "coordinateAccuracy") - coder.encode(targetCoordinate.latitude, forKey: "targetLatitude") - coder.encode(targetCoordinate.longitude, forKey: "targetLongitude") - coder.encode(heading, forKey: "heading") - coder.encode(headingAccuracy, forKey: "headingAccuracy") - coder.encode(name, forKey: "name") - coder.encode(allowsArrivingOnOppositeSide, forKey: "allowsArrivingOnOppositeSide") - coder.encode(separatesLegs, forKey: "separatesLegs") - } - + open func copy(with zone: NSZone?) -> Any { let copy = Waypoint(coordinate: coordinate, coordinateAccuracy: coordinateAccuracy, name: name) - copy.targetCoordinate = targetCoordinate copy.heading = heading copy.headingAccuracy = headingAccuracy - copy.allowsArrivingOnOppositeSide = allowsArrivingOnOppositeSide - copy.separatesLegs = separatesLegs return copy } - // MARK: Objective-C equality - open override func isEqual(_ object: Any?) -> Bool { - guard let opts = object as? Waypoint else { return false } - return isEqual(to: opts) - } - + // MARK: Getting the Waypoint’s Location - open func isEqual(to other: Waypoint?) -> Bool { - guard let other = other else { return false } - return type(of: self) == type(of: other) && - coordinate.latitude == other.coordinate.latitude && - coordinate.longitude == other.coordinate.longitude && - coordinateAccuracy == other.coordinateAccuracy && - targetCoordinate.latitude == other.targetCoordinate.latitude && - targetCoordinate.longitude == other.targetCoordinate.longitude && - heading == other.heading && - headingAccuracy == other.headingAccuracy && - name == other.name && - allowsArrivingOnOppositeSide == other.allowsArrivingOnOppositeSide && - separatesLegs && other.separatesLegs - } - - // MARK: Specifying the Waypoint’s Location - /** The geographic coordinate of the waypoint. */ - public internal(set) var coordinate: CLLocationCoordinate2D - + @objc open let coordinate: CLLocationCoordinate2D + /** The radius of uncertainty for the waypoint, measured in meters. - + For a route to be considered viable, it must enter this waypoint’s circle of uncertainty. The `coordinate` property identifies the center of the circle, while this property indicates the circle’s radius. If the value of this property is negative, a route is considered viable regardless of whether it enters this waypoint’s circle of uncertainty, subject to an undefined maximum distance. - + By default, the value of this property is a negative number. - - This property corresponds to the [`radiuses`](https://docs.mapbox.com/api/navigation/#retrieve-directions) query parameter in the Mapbox Directions and Map Matching APIs. - */ - open var coordinateAccuracy: CLLocationAccuracy = -1 - - /** - The geographic coordinate of the waypoint’s target. - - The waypoint’s target affects arrival instructions without affecting the route’s shape. For example, a delivery or ride hailing application may specify a waypoint target that represents a drop-off location. The target determines whether the arrival visual and spoken instructions indicate that the destination is “on the left” or “on the right”. - - By default, this property is set to `kCLLocationCoordinate2DInvalid`, meaning the waypoint has no target. This property is ignored on the first waypoint of a `RouteOptions` object, on any waypoint of a `MatchOptions` object, or on any waypoint of a `RouteOptions` object if `DirectionsOptions.includesSteps` is set to `false`. - - This property corresponds to the [`waypoint_targets`](https://docs.mapbox.com/api/navigation/#retrieve-directions) query parameter in the Mapbox Directions and Map Matching APIs. */ - open var targetCoordinate: CLLocationCoordinate2D = kCLLocationCoordinate2DInvalid - - // MARK: Specifying How the User Approaches the Waypoint - + @objc open var coordinateAccuracy: CLLocationAccuracy = -1 + + // MARK: Getting the Direction of Approach + /** The direction from which a route must approach this waypoint in order to be considered viable. - + This property is measured in degrees clockwise from true north. A value of 0 degrees means due north, 90 degrees means due east, 180 degrees means due south, and so on. If the value of this property is negative, a route is considered viable regardless of the direction from which it approaches this waypoint. - + If this waypoint is the first waypoint (the source waypoint), the route must start out by heading in the direction specified by this property. You should always set the `headingAccuracy` property in conjunction with this property. If the `headingAccuracy` property is set to a negative value, this property is ignored. - + For driving directions, this property can be useful for avoiding a route that begins by going in the direction opposite the current direction of travel. For example, if you know the user is moving eastwardly and the first waypoint is the user’s current location, specifying a heading of 90 degrees and a heading accuracy of 90 degrees for the first waypoint avoids a route that begins with a “head west” instruction. - + You should be certain that the user is in motion before specifying a heading and heading accuracy; otherwise, you may be unnecessarily filtering out the best route. For example, suppose the user is sitting in a car parked in a driveway, facing due north, with the garage in front and the street to the rear. In that case, specifying a heading of 0 degrees and a heading accuracy of 90 degrees may result in a route that begins on the back alley or, worse, no route at all. For this reason, it is recommended that you only specify a heading and heading accuracy when automatically recalculating directions due to the user deviating from the route. - + By default, the value of this property is a negative number, meaning that a route is considered viable regardless of the direction of approach. - - This property corresponds to the angles in the [`bearings`](https://docs.mapbox.com/api/navigation/#retrieve-directions) query parameter in the Mapbox Directions and Map Matching APIs. */ - open var heading: CLLocationDirection = -1 - + @objc open var heading: CLLocationDirection = -1 + /** - The maximum tolerance, in degrees, within which a route’s approach to a waypoint may differ from `heading` in either direction but still be considered viable. - + The maximum amount, in degrees, by which a route’s approach to a waypoint may differ from `heading` in either direction in order to be considered viable. + A value of 0 degrees means that the approach must match the specified `heading` exactly – an unlikely scenario. A value of 180 degrees or more means that the approach may be as much as 180 degrees in either direction from the specified `heading`, effectively allowing a candidate route to approach the waypoint from any direction. - + If you set the `heading` property, you should set this property to a value such as 90 degrees, to avoid filtering out routes whose approaches differ only slightly from the specified `heading`. Otherwise, if the `heading` property is set to a negative value, this property is ignored. - + By default, the value of this property is a negative number, meaning that a route is considered viable regardless of the direction of approach. - - This property corresponds to the ranges in the [`bearings`](https://docs.mapbox.com/api/navigation/#retrieve-directions) query parameter in the Mapbox Directions and Map Matching APIs. */ - open var headingAccuracy: CLLocationDirection = -1 - + @objc open var headingAccuracy: CLLocationDirection = -1 + internal var headingDescription: String { return heading >= 0 && headingAccuracy >= 0 ? "\(heading.truncatingRemainder(dividingBy: 360)),\(min(headingAccuracy, 180))" : "" } - - /** - A boolean value indicating whether arriving on opposite side is allowed. - - This property has no effect if `DirectionsOptions.includesSteps` is set to `false`. - - This property corresponds to the [`approaches`](https://www.mapbox.com/api-documentation/navigation/#retrieve-directions) query parameter in the Mapbox Directions and Map Matching APIs. - */ - open var allowsArrivingOnOppositeSide = true - - // MARK: Identifying the Waypoint - - /** - The name of the waypoint. - - This property does not affect the route, but you can set the name of a waypoint you pass into a `RouteOptions` object to help you distinguish one waypoint from another in the array of waypoints passed into the completion handler of the `Directions.calculate(_:completionHandler:)` method. This property has no effect if `DirectionsOptions.includesSteps` is set to `false`. - - This property corresponds to the [`waypoint_names`](https://docs.mapbox.com/api/navigation/#retrieve-directions) query parameter in the Mapbox Directions and Map Matching APIs. - */ - open var name: String? + + // MARK: Getting the Waypoint’s Name /** - A Boolean value indicating whether the waypoint is significant enough to appear in the resulting routes as a waypoint separating two legs, along with corresponding guidance instructions. - - By default, this property is set to `true`, which means that each resulting route will include a leg that ends by arriving at the waypoint as `RouteLeg.destination` and a subsequent leg that begins by departing from the waypoint as `RouteLeg.source`. Otherwise, if this property is set to `false`, a single leg passes through the waypoint without specifically mentioning it. Regardless of the value of this property, each resulting route passes through the location specified by the `coordinate` property, accounting for approach-related properties such as `heading`. + The name of the waypoint. - With the Mapbox Directions API, set this property to `false` if you want the waypoint’s location to influence the path that the route follows without attaching any meaning to the waypoint object itself. With the Mapbox Map Matching API, use this property when the `DirectionsOptions.includesSteps` property is `true` or when `coordinates` represents a trace with a high sample rate. - - This property has no effect if `DirectionsOptions.includesSteps` is set to `false`, or if `MatchOptions.waypointIndices` is non-nil. - - This property corresponds to the [`approaches`](https://docs.mapbox.com/api/navigation/#retrieve-directions) query parameter in the Mapbox Directions and Map Matching APIs. + This parameter does not affect the route, but you can set the name of a waypoint you pass into a `RouteOptions` object to help you distinguish one waypoint from another in the array of waypoints passed into the completion handler of the `Directions.calculate(_:completionHandler:)` method. */ - open var separatesLegs: Bool = true - - open override var description: String { + @objc open var name: String? + + @objc open override var description: String { return name ?? "" } - + func debugQuickLookObject() -> Any { return CLLocation(coordinate: coordinate, altitude: 0, horizontalAccuracy: coordinateAccuracy, verticalAccuracy: -1, course: heading, speed: -1, timestamp: Date()) } -} - -// MARK: Support for Directions API v4 - -extension Waypoint { - /** - Initializes a new waypoint object with the given GeoJSON point feature data. - - - parameter json: A point feature in GeoJSON format. - */ - internal convenience init?(geoJSON json: JSONDictionary) { - assert(json["type"] as? String == "Feature") - - let coordinate = CLLocationCoordinate2D(geoJSON: json["geometry"] as! JSONDictionary) - - let propertiesJSON = json["properties"] as? JSONDictionary - let name = propertiesJSON?["name"] as? String - - self.init(coordinate: coordinate, name: name) + + open override func isEqual(_ object: Any?) -> Bool { + guard let other = object as? Waypoint else { return false} + return self.coordinate == other.coordinate && self.name == other.name && self.coordinateAccuracy == other.coordinateAccuracy } } From 593efd3d16810cb8f1a4f28c487e5340d0642dff Mon Sep 17 00:00:00 2001 From: Jerrad Thramer Date: Fri, 4 Oct 2019 14:52:55 -0600 Subject: [PATCH 04/89] Completed MBDirectionsOptions, things are really coming along now. --- MapboxDirections.xcodeproj/project.pbxproj | 64 ++- Package.swift | 2 +- .../MapboxDirections/AttributeOptions.swift | 18 +- .../MapboxDirections/DirectionsError.swift | 10 +- .../DirectionsProfileIdentifier.swift | 2 +- .../MapboxDirections/DirectionsResponse.swift | 2 +- Sources/MapboxDirections/DrivingSide.swift | 16 + .../Extensions/CLLocationCoordinate2D.swift | 24 - .../Extensions/CoreLocation.swift | 12 +- .../MapboxDirections/MBCoordinateBounds.swift | 33 +- Sources/MapboxDirections/MBDirections.swift | 28 +- .../MBDirectionsOptions.swift | 414 ++++---------- Sources/MapboxDirections/MBIntersection.swift | 137 +++-- Sources/MapboxDirections/MBLane.swift | 38 +- .../MapboxDirections/MBLaneIndication.swift | 5 +- Sources/MapboxDirections/MBRoute.swift | 25 +- Sources/MapboxDirections/MBRouteLeg.swift | 5 +- Sources/MapboxDirections/MBRouteOptions.swift | 507 +++--------------- Sources/MapboxDirections/MBRouteStep.swift | 48 -- .../MBVisualInstructionBanner.swift | 4 +- Sources/MapboxDirections/MBWaypoint.swift | 58 +- .../Match/MBMatchOptions.swift | 3 - .../MapboxDirections/Match/MBTracepoint.swift | 50 +- Sources/MapboxDirections/RoadClasses.swift | 16 +- 24 files changed, 493 insertions(+), 1028 deletions(-) create mode 100644 Sources/MapboxDirections/DrivingSide.swift delete mode 100644 Sources/MapboxDirections/Extensions/CLLocationCoordinate2D.swift diff --git a/MapboxDirections.xcodeproj/project.pbxproj b/MapboxDirections.xcodeproj/project.pbxproj index ed93cf138..ff7478aa8 100644 --- a/MapboxDirections.xcodeproj/project.pbxproj +++ b/MapboxDirections.xcodeproj/project.pbxproj @@ -21,10 +21,6 @@ 35DBF006217DF0D90009D2AE /* MBCoordinateBounds.swift in Sources */ = {isa = PBXBuildFile; fileRef = 35DBF004217DF0D90009D2AE /* MBCoordinateBounds.swift */; }; 35DBF007217DF0D90009D2AE /* MBCoordinateBounds.swift in Sources */ = {isa = PBXBuildFile; fileRef = 35DBF004217DF0D90009D2AE /* MBCoordinateBounds.swift */; }; 35DBF008217DF0D90009D2AE /* MBCoordinateBounds.swift in Sources */ = {isa = PBXBuildFile; fileRef = 35DBF004217DF0D90009D2AE /* MBCoordinateBounds.swift */; }; - 35DBF00A217E172C0009D2AE /* CLLocationCoordinate2D.swift in Sources */ = {isa = PBXBuildFile; fileRef = 35DBF009217E172C0009D2AE /* CLLocationCoordinate2D.swift */; }; - 35DBF00B217E172C0009D2AE /* CLLocationCoordinate2D.swift in Sources */ = {isa = PBXBuildFile; fileRef = 35DBF009217E172C0009D2AE /* CLLocationCoordinate2D.swift */; }; - 35DBF00C217E172C0009D2AE /* CLLocationCoordinate2D.swift in Sources */ = {isa = PBXBuildFile; fileRef = 35DBF009217E172C0009D2AE /* CLLocationCoordinate2D.swift */; }; - 35DBF00D217E172C0009D2AE /* CLLocationCoordinate2D.swift in Sources */ = {isa = PBXBuildFile; fileRef = 35DBF009217E172C0009D2AE /* CLLocationCoordinate2D.swift */; }; 35DBF00F217E17A30009D2AE /* HTTPURLResponse.swift in Sources */ = {isa = PBXBuildFile; fileRef = 35DBF00E217E17A30009D2AE /* HTTPURLResponse.swift */; }; 35DBF010217E17A30009D2AE /* HTTPURLResponse.swift in Sources */ = {isa = PBXBuildFile; fileRef = 35DBF00E217E17A30009D2AE /* HTTPURLResponse.swift */; }; 35DBF011217E17A30009D2AE /* HTTPURLResponse.swift in Sources */ = {isa = PBXBuildFile; fileRef = 35DBF00E217E17A30009D2AE /* HTTPURLResponse.swift */; }; @@ -39,10 +35,26 @@ 35EFD00C207DFACA00BF3873 /* MBVisualInstruction.swift in Sources */ = {isa = PBXBuildFile; fileRef = 35EFD00A207DFACA00BF3873 /* MBVisualInstruction.swift */; }; 35EFD00D207DFACA00BF3873 /* MBVisualInstruction.swift in Sources */ = {isa = PBXBuildFile; fileRef = 35EFD00A207DFACA00BF3873 /* MBVisualInstruction.swift */; }; 35EFD00E207DFACA00BF3873 /* MBVisualInstruction.swift in Sources */ = {isa = PBXBuildFile; fileRef = 35EFD00A207DFACA00BF3873 /* MBVisualInstruction.swift */; }; - 43208BA72343F7C300D8BD89 /* Codable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 43208BA62343F7C300D8BD89 /* Codable.swift */; }; - 43208BA92343F7E900D8BD89 /* CoreLocation.Swift in Sources */ = {isa = PBXBuildFile; fileRef = 43208BA82343F7E900D8BD89 /* CoreLocation.Swift */; }; - 43208BAB2343F81900D8BD89 /* GeoJSON.swift in Sources */ = {isa = PBXBuildFile; fileRef = 43208BAA2343F81900D8BD89 /* GeoJSON.swift */; }; - 43208BAD2343FF5500D8BD89 /* DirectionsResponse.swift in Sources */ = {isa = PBXBuildFile; fileRef = 43208BAC2343FF5500D8BD89 /* DirectionsResponse.swift */; }; + 431E93BF234664A200A71B44 /* DrivingSide.swift in Sources */ = {isa = PBXBuildFile; fileRef = 431E93BE234664A200A71B44 /* DrivingSide.swift */; }; + 431E93C0234664A200A71B44 /* DrivingSide.swift in Sources */ = {isa = PBXBuildFile; fileRef = 431E93BE234664A200A71B44 /* DrivingSide.swift */; }; + 431E93C1234664A200A71B44 /* DrivingSide.swift in Sources */ = {isa = PBXBuildFile; fileRef = 431E93BE234664A200A71B44 /* DrivingSide.swift */; }; + 431E93C2234664A200A71B44 /* DrivingSide.swift in Sources */ = {isa = PBXBuildFile; fileRef = 431E93BE234664A200A71B44 /* DrivingSide.swift */; }; + 431E93C323466B0E00A71B44 /* GeoJSON.swift in Sources */ = {isa = PBXBuildFile; fileRef = 43208BAA2343F81900D8BD89 /* GeoJSON.swift */; }; + 431E93C423466B0F00A71B44 /* GeoJSON.swift in Sources */ = {isa = PBXBuildFile; fileRef = 43208BAA2343F81900D8BD89 /* GeoJSON.swift */; }; + 431E93C523466B1000A71B44 /* GeoJSON.swift in Sources */ = {isa = PBXBuildFile; fileRef = 43208BAA2343F81900D8BD89 /* GeoJSON.swift */; }; + 431E93C623466B1100A71B44 /* GeoJSON.swift in Sources */ = {isa = PBXBuildFile; fileRef = 43208BAA2343F81900D8BD89 /* GeoJSON.swift */; }; + 431E93C723466B3F00A71B44 /* CoreLocation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 43208BA82343F7E900D8BD89 /* CoreLocation.swift */; }; + 431E93C823466B4000A71B44 /* CoreLocation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 43208BA82343F7E900D8BD89 /* CoreLocation.swift */; }; + 431E93C923466B4100A71B44 /* CoreLocation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 43208BA82343F7E900D8BD89 /* CoreLocation.swift */; }; + 431E93CA23466B4200A71B44 /* CoreLocation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 43208BA82343F7E900D8BD89 /* CoreLocation.swift */; }; + 431E93CB23466C2400A71B44 /* DirectionsResponse.swift in Sources */ = {isa = PBXBuildFile; fileRef = 43208BAC2343FF5500D8BD89 /* DirectionsResponse.swift */; }; + 431E93CC23466C2500A71B44 /* DirectionsResponse.swift in Sources */ = {isa = PBXBuildFile; fileRef = 43208BAC2343FF5500D8BD89 /* DirectionsResponse.swift */; }; + 431E93CD23466C2700A71B44 /* DirectionsResponse.swift in Sources */ = {isa = PBXBuildFile; fileRef = 43208BAC2343FF5500D8BD89 /* DirectionsResponse.swift */; }; + 431E93CE23466C2800A71B44 /* DirectionsResponse.swift in Sources */ = {isa = PBXBuildFile; fileRef = 43208BAC2343FF5500D8BD89 /* DirectionsResponse.swift */; }; + 431E93CF23466D7400A71B44 /* Codable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 43208BA62343F7C300D8BD89 /* Codable.swift */; }; + 431E93D023466D7500A71B44 /* Codable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 43208BA62343F7C300D8BD89 /* Codable.swift */; }; + 431E93D123466D7600A71B44 /* Codable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 43208BA62343F7C300D8BD89 /* Codable.swift */; }; + 431E93D223466D7700A71B44 /* Codable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 43208BA62343F7C300D8BD89 /* Codable.swift */; }; 438BFEC2233D854D00457294 /* DirectionsProfileIdentifier.swift in Sources */ = {isa = PBXBuildFile; fileRef = 438BFEC1233D854D00457294 /* DirectionsProfileIdentifier.swift */; }; 438BFEC3233D854D00457294 /* DirectionsProfileIdentifier.swift in Sources */ = {isa = PBXBuildFile; fileRef = 438BFEC1233D854D00457294 /* DirectionsProfileIdentifier.swift */; }; 438BFEC4233D854D00457294 /* DirectionsProfileIdentifier.swift in Sources */ = {isa = PBXBuildFile; fileRef = 438BFEC1233D854D00457294 /* DirectionsProfileIdentifier.swift */; }; @@ -305,13 +317,13 @@ 35CC310A2285739700EA1966 /* WalkingOptionsTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WalkingOptionsTests.swift; sourceTree = ""; }; 35D92FEF218203AA000C78CB /* 2018-10-16-Liechtenstein.tar */ = {isa = PBXFileReference; lastKnownFileType = archive.tar; path = "2018-10-16-Liechtenstein.tar"; sourceTree = ""; }; 35DBF004217DF0D90009D2AE /* MBCoordinateBounds.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MBCoordinateBounds.swift; sourceTree = ""; }; - 35DBF009217E172C0009D2AE /* CLLocationCoordinate2D.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CLLocationCoordinate2D.swift; sourceTree = ""; }; 35DBF00E217E17A30009D2AE /* HTTPURLResponse.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HTTPURLResponse.swift; sourceTree = ""; }; 35DBF013217E199E0009D2AE /* OfflineDirectionsTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OfflineDirectionsTests.swift; sourceTree = ""; }; 35DBF018217F38A30009D2AE /* versions.json */ = {isa = PBXFileReference; lastKnownFileType = text.json; path = versions.json; sourceTree = ""; }; 35EFD00A207DFACA00BF3873 /* MBVisualInstruction.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MBVisualInstruction.swift; sourceTree = ""; }; + 431E93BE234664A200A71B44 /* DrivingSide.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DrivingSide.swift; sourceTree = ""; }; 43208BA62343F7C300D8BD89 /* Codable.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Codable.swift; sourceTree = ""; }; - 43208BA82343F7E900D8BD89 /* CoreLocation.Swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CoreLocation.Swift; sourceTree = ""; }; + 43208BA82343F7E900D8BD89 /* CoreLocation.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CoreLocation.swift; sourceTree = ""; }; 43208BAA2343F81900D8BD89 /* GeoJSON.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GeoJSON.swift; sourceTree = ""; }; 43208BAC2343FF5500D8BD89 /* DirectionsResponse.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DirectionsResponse.swift; sourceTree = ""; }; 438BFEBC233D7FA900457294 /* Package.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Package.swift; sourceTree = ""; }; @@ -517,10 +529,9 @@ children = ( 8D381B691FDB101F008D5A58 /* String.swift */, 43208BA62343F7C300D8BD89 /* Codable.swift */, - 43208BA82343F7E900D8BD89 /* CoreLocation.Swift */, + 43208BA82343F7E900D8BD89 /* CoreLocation.swift */, 43208BAA2343F81900D8BD89 /* GeoJSON.swift */, C582BA2D2073ED6300647DAA /* Array.swift */, - 35DBF009217E172C0009D2AE /* CLLocationCoordinate2D.swift */, 8D434678219E1167008B7BF3 /* Double.swift */, 35DBF00E217E17A30009D2AE /* HTTPURLResponse.swift */, ); @@ -589,6 +600,7 @@ C59094C0203DE6BC00EB2417 /* MBDirectionsResult.swift */, 43208BAC2343FF5500D8BD89 /* DirectionsResponse.swift */, DAC05F171CFC075300FA0071 /* MBRoute.swift */, + 431E93BE234664A200A71B44 /* DrivingSide.swift */, DAC05F191CFC077C00FA0071 /* MBRouteLeg.swift */, DA2E03EA1CB0E13D00D1269A /* MBRouteOptions.swift */, 438BFEC1233D854D00457294 /* DirectionsProfileIdentifier.swift */, @@ -1168,6 +1180,7 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( + 431E93C0234664A200A71B44 /* DrivingSide.swift in Sources */, C5DAAC9B2019167C001F9261 /* MBMatch.swift in Sources */, 35DBF010217E17A30009D2AE /* HTTPURLResponse.swift in Sources */, 8D43467A219E15C3008B7BF3 /* Double.swift in Sources */, @@ -1177,6 +1190,8 @@ C52552BA1FA15D5E00B1545C /* MBVisualInstructionBanner.swift in Sources */, 35828C9F217A003F00ED546E /* OfflineDirections.swift in Sources */, C5DAAC9F20195AAE001F9261 /* MBTracepoint.swift in Sources */, + 431E93CC23466C2500A71B44 /* DirectionsResponse.swift in Sources */, + 431E93C423466B0F00A71B44 /* GeoJSON.swift in Sources */, C5990B4A2045E72800D7DFD4 /* MBDirectionsResult.swift in Sources */, 35EFD00C207DFACA00BF3873 /* MBVisualInstruction.swift in Sources */, C584E3F71F201C7B00BBC9BB /* RoadClasses.swift in Sources */, @@ -1185,6 +1200,7 @@ 35DBF006217DF0D90009D2AE /* MBCoordinateBounds.swift in Sources */, DA1A10CA1D00F969009F82FA /* MBRouteOptions.swift in Sources */, DA1A10C81D00F969009F82FA /* MBRoute.swift in Sources */, + 431E93D023466D7500A71B44 /* Codable.swift in Sources */, C5990B4D2045E74800D7DFD4 /* MBDirectionsOptions.swift in Sources */, DAA76D691DD127CB0015EC78 /* MBLaneIndication.swift in Sources */, AEDC211E20B612530052DED8 /* MBLaneIndicationComponent.swift in Sources */, @@ -1192,12 +1208,12 @@ C57D55031DB566A700B94B74 /* MBIntersection.swift in Sources */, C52CE38F1F6AF63C0069963D /* MBSpokenInstruction.swift in Sources */, C58EA7AB1E9D7F73008F98CE /* MBCongestion.swift in Sources */, - 35DBF00B217E172C0009D2AE /* CLLocationCoordinate2D.swift in Sources */, 8D381B6B1FDB3D8A008D5A58 /* String.swift in Sources */, C56516851FE1AB8F00A0AD18 /* MBVisualInstructionType.swift in Sources */, 438BFEC3233D854D00457294 /* DirectionsProfileIdentifier.swift in Sources */, C54549FC2073F1EF002E273F /* Array.swift in Sources */, C547EC691DB59F8F009817F3 /* MBLane.swift in Sources */, + 431E93C823466B4000A71B44 /* CoreLocation.swift in Sources */, AEDC212120B6125C0052DED8 /* MBComponentRepresentable.swift in Sources */, 439255792344113D006EEE88 /* DirectionsError.swift in Sources */, DA1A10C71D00F969009F82FA /* MBDirections.swift in Sources */, @@ -1230,6 +1246,7 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( + 431E93C1234664A200A71B44 /* DrivingSide.swift in Sources */, C5DAAC9C2019167D001F9261 /* MBMatch.swift in Sources */, 35DBF011217E17A30009D2AE /* HTTPURLResponse.swift in Sources */, 8D43467B219E15C4008B7BF3 /* Double.swift in Sources */, @@ -1239,6 +1256,8 @@ C52552BB1FA15D5F00B1545C /* MBVisualInstructionBanner.swift in Sources */, 35828CA0217A003F00ED546E /* OfflineDirections.swift in Sources */, C5DAACA020195AAF001F9261 /* MBTracepoint.swift in Sources */, + 431E93CD23466C2700A71B44 /* DirectionsResponse.swift in Sources */, + 431E93C523466B1000A71B44 /* GeoJSON.swift in Sources */, C5990B4B2045E72900D7DFD4 /* MBDirectionsResult.swift in Sources */, 35EFD00D207DFACA00BF3873 /* MBVisualInstruction.swift in Sources */, C584E3F81F201C7C00BBC9BB /* RoadClasses.swift in Sources */, @@ -1247,6 +1266,7 @@ 35DBF007217DF0D90009D2AE /* MBCoordinateBounds.swift in Sources */, DA1A10F01D010247009F82FA /* MBRouteOptions.swift in Sources */, DA1A10EE1D010247009F82FA /* MBRoute.swift in Sources */, + 431E93D123466D7600A71B44 /* Codable.swift in Sources */, C5990B4E2045E74900D7DFD4 /* MBDirectionsOptions.swift in Sources */, DAA76D6A1DD127CB0015EC78 /* MBLaneIndication.swift in Sources */, AEDC211F20B612540052DED8 /* MBLaneIndicationComponent.swift in Sources */, @@ -1254,12 +1274,12 @@ C57D55041DB566A800B94B74 /* MBIntersection.swift in Sources */, C52CE3901F6AF63D0069963D /* MBSpokenInstruction.swift in Sources */, C58EA7AC1E9D7F74008F98CE /* MBCongestion.swift in Sources */, - 35DBF00C217E172C0009D2AE /* CLLocationCoordinate2D.swift in Sources */, 8D381B6C1FDB3D8B008D5A58 /* String.swift in Sources */, C56516861FE1AB9000A0AD18 /* MBVisualInstructionType.swift in Sources */, 438BFEC4233D854D00457294 /* DirectionsProfileIdentifier.swift in Sources */, C54549FD2073F1F0002E273F /* Array.swift in Sources */, C547EC6A1DB59F90009817F3 /* MBLane.swift in Sources */, + 431E93C923466B4100A71B44 /* CoreLocation.swift in Sources */, AEDC212220B6125D0052DED8 /* MBComponentRepresentable.swift in Sources */, 4392557A2344113E006EEE88 /* DirectionsError.swift in Sources */, DA1A10ED1D010247009F82FA /* MBDirections.swift in Sources */, @@ -1292,6 +1312,7 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( + 431E93C2234664A200A71B44 /* DrivingSide.swift in Sources */, C5DAAC9D2019167E001F9261 /* MBMatch.swift in Sources */, 35DBF012217E17A30009D2AE /* HTTPURLResponse.swift in Sources */, 8D43467C219E15C6008B7BF3 /* Double.swift in Sources */, @@ -1301,6 +1322,8 @@ C52552BC1FA15D6000B1545C /* MBVisualInstructionBanner.swift in Sources */, 35828CA1217A003F00ED546E /* OfflineDirections.swift in Sources */, C5DAACA120195AAF001F9261 /* MBTracepoint.swift in Sources */, + 431E93CE23466C2800A71B44 /* DirectionsResponse.swift in Sources */, + 431E93C623466B1100A71B44 /* GeoJSON.swift in Sources */, C5990B4C2045E72A00D7DFD4 /* MBDirectionsResult.swift in Sources */, 35EFD00E207DFACA00BF3873 /* MBVisualInstruction.swift in Sources */, C584E3F91F201C7D00BBC9BB /* RoadClasses.swift in Sources */, @@ -1309,6 +1332,7 @@ 35DBF008217DF0D90009D2AE /* MBCoordinateBounds.swift in Sources */, DA1A11071D0103A3009F82FA /* MBRouteOptions.swift in Sources */, DA1A11051D0103A3009F82FA /* MBRoute.swift in Sources */, + 431E93D223466D7700A71B44 /* Codable.swift in Sources */, C5990B4F2045E74A00D7DFD4 /* MBDirectionsOptions.swift in Sources */, DAA76D6B1DD127CB0015EC78 /* MBLaneIndication.swift in Sources */, AEDC212020B612560052DED8 /* MBLaneIndicationComponent.swift in Sources */, @@ -1316,12 +1340,12 @@ C57D55051DB566A900B94B74 /* MBIntersection.swift in Sources */, C52CE3911F6AF63E0069963D /* MBSpokenInstruction.swift in Sources */, C58EA7AD1E9D7F75008F98CE /* MBCongestion.swift in Sources */, - 35DBF00D217E172C0009D2AE /* CLLocationCoordinate2D.swift in Sources */, 8D381B6D1FDB3D8B008D5A58 /* String.swift in Sources */, C56516871FE1AB9100A0AD18 /* MBVisualInstructionType.swift in Sources */, 438BFEC5233D854D00457294 /* DirectionsProfileIdentifier.swift in Sources */, C54549FE2073F1F1002E273F /* Array.swift in Sources */, C547EC6B1DB59F91009817F3 /* MBLane.swift in Sources */, + 431E93CA23466B4200A71B44 /* CoreLocation.swift in Sources */, AEDC212320B6125E0052DED8 /* MBComponentRepresentable.swift in Sources */, 4392557B2344113F006EEE88 /* DirectionsError.swift in Sources */, DA1A11041D0103A3009F82FA /* MBDirections.swift in Sources */, @@ -1332,6 +1356,7 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( + 431E93BF234664A200A71B44 /* DrivingSide.swift in Sources */, C51538CC1E807FF00093FF3E /* AttributeOptions.swift in Sources */, 35DBF00F217E17A30009D2AE /* HTTPURLResponse.swift in Sources */, 8D434679219E1167008B7BF3 /* Double.swift in Sources */, @@ -1341,6 +1366,8 @@ C52552C01FA1628A00B1545C /* MBVisualInstructionComponent.swift in Sources */, 35828C9E217A003F00ED546E /* OfflineDirections.swift in Sources */, C59426071F1EA6C400C8E59C /* RoadClasses.swift in Sources */, + 431E93CB23466C2400A71B44 /* DirectionsResponse.swift in Sources */, + 431E93C323466B0E00A71B44 /* GeoJSON.swift in Sources */, 35EFD00B207DFACA00BF3873 /* MBVisualInstruction.swift in Sources */, DAC05F161CFBFAC400FA0071 /* MBWaypoint.swift in Sources */, C57D55081DB58C0200B94B74 /* MBLane.swift in Sources */, @@ -1349,6 +1376,7 @@ 35DBF005217DF0D90009D2AE /* MBCoordinateBounds.swift in Sources */, C5434B8C200695A50069E887 /* MBMatchOptions.swift in Sources */, DAA76D681DD127CB0015EC78 /* MBLaneIndication.swift in Sources */, + 431E93CF23466D7400A71B44 /* Codable.swift in Sources */, C59094C1203DE6BC00EB2417 /* MBDirectionsResult.swift in Sources */, DAC05F1A1CFC077C00FA0071 /* MBRouteLeg.swift in Sources */, AEDC211920B5DBDE0052DED8 /* MBLaneIndicationComponent.swift in Sources */, @@ -1356,12 +1384,12 @@ DA6C9DA61CAE462800094FBC /* MBDirections.swift in Sources */, C55FB44B1F6AEBF6006BD1E9 /* MBSpokenInstruction.swift in Sources */, C5DAAC9A20191675001F9261 /* MBMatch.swift in Sources */, - 35DBF00A217E172C0009D2AE /* CLLocationCoordinate2D.swift in Sources */, C58EA7AA1E9D7EAD008F98CE /* MBCongestion.swift in Sources */, 8D381B6A1FDB101F008D5A58 /* String.swift in Sources */, 438BFEC2233D854D00457294 /* DirectionsProfileIdentifier.swift in Sources */, C56516841FE1A2DD00A0AD18 /* MBVisualInstructionType.swift in Sources */, C57D55011DB5669600B94B74 /* MBIntersection.swift in Sources */, + 431E93C723466B3F00A71B44 /* CoreLocation.swift in Sources */, AEDC211D20B6104B0052DED8 /* MBComponentRepresentable.swift in Sources */, 439255772344113B006EEE88 /* DirectionsError.swift in Sources */, DA2E03E91CB0E0B000D1269A /* MBRouteStep.swift in Sources */, @@ -1395,12 +1423,8 @@ buildActionMask = 2147483647; files = ( DADD27BA1E5AAAD800D31FAD /* ViewController.swift in Sources */, - 43208BA92343F7E900D8BD89 /* CoreLocation.Swift in Sources */, C59094B5203B5C7F00EB2417 /* MBDrawingView.swift in Sources */, - 43208BA72343F7C300D8BD89 /* Codable.swift in Sources */, DADD27B81E5AAAD800D31FAD /* AppDelegate.swift in Sources */, - 43208BAB2343F81900D8BD89 /* GeoJSON.swift in Sources */, - 43208BAD2343FF5500D8BD89 /* DirectionsResponse.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/Package.swift b/Package.swift index ab4778171..21b97bccb 100644 --- a/Package.swift +++ b/Package.swift @@ -21,7 +21,7 @@ let package = Package( // Targets can depend on other targets in this package, and on products in packages which this package depends on. .target( name: "MapboxDirections", - dependencies: ["CMapboxDirections", "Polyline"]), + dependencies: ["Polyline"]), .testTarget( name: "MapboxDirectionsTests", dependencies: ["MapboxDirections"]), diff --git a/Sources/MapboxDirections/AttributeOptions.swift b/Sources/MapboxDirections/AttributeOptions.swift index 5d8c9dac2..d90d0134c 100644 --- a/Sources/MapboxDirections/AttributeOptions.swift +++ b/Sources/MapboxDirections/AttributeOptions.swift @@ -1,11 +1,8 @@ import Foundation -#if SWIFT_PACKAGE -import CMapboxDirections -#endif -public struct AttributeOptions: OptionSet, CustomStringConvertible { +public struct AttributeOptions: OptionSet, CustomStringConvertible{ public typealias RawValue = Int public var rawValue: Int @@ -86,3 +83,16 @@ public struct AttributeOptions: OptionSet, CustomStringConvertible { return descriptions.joined(separator: ",") } } + +extension AttributeOptions: Codable { + public func encode(to encoder: Encoder) throws { + var container = encoder.singleValueContainer() + try container.encode(description.components(separatedBy: ",")) + } + + public init(from decoder: Decoder) throws { + let container = try decoder.singleValueContainer() + let descriptions = try container.decode([String].self) + self = AttributeOptions(descriptions: descriptions)! + } +} diff --git a/Sources/MapboxDirections/DirectionsError.swift b/Sources/MapboxDirections/DirectionsError.swift index 46a1e83fd..ad3d13040 100644 --- a/Sources/MapboxDirections/DirectionsError.swift +++ b/Sources/MapboxDirections/DirectionsError.swift @@ -2,7 +2,7 @@ import Foundation import CoreLocation -public enum DirectionsError: RawRepresentable { +public enum DirectionsError: Error, RawRepresentable { public init?(rawValue: String) { assertionFailure("Do not use init(rawValue:) for DirectionsError.") return nil @@ -36,8 +36,8 @@ public enum DirectionsError: RawRepresentable { let formattedInterval = intervalFormatter.string(from: interval) ?? "\(interval) seconds" let formattedCount = NumberFormatter.localizedString(from: NSNumber(value: limit), number: .decimal) return "More than \(formattedCount) requests have been made with this access token within a period of \(formattedInterval)" - case let .unknown(response: response, underlying: error): - return "Unknown Error. Response: \(response.debugDescription) Underlying Error: \(error.debugDescription)" + case let .unknown(response: response, underlying: error, code: code): + return "Unknown Error. Response: \(response.debugDescription) Underlying Error: \(error.debugDescription) Code: \(code.debugDescription)" } } @@ -60,7 +60,7 @@ public enum DirectionsError: RawRepresentable { } let formattedDate: String = DateFormatter.localizedString(from: reset, dateStyle: .long, timeStyle: .long) return "Wait until \(formattedDate) before retrying." - case .unknown(_,_): + case .unknown(_,_,_): return "Please contact Mapbox Support." } } @@ -73,6 +73,6 @@ public enum DirectionsError: RawRepresentable { case profileNotFound case requestTooLarge case rateLimited(rateLimitInterval: TimeInterval?, rateLimit: UInt?, resetTime: Date?) - case unknown(response: URLResponse?, underlying: Error?) + case unknown(response: URLResponse?, underlying: Error?, code: String?) } diff --git a/Sources/MapboxDirections/DirectionsProfileIdentifier.swift b/Sources/MapboxDirections/DirectionsProfileIdentifier.swift index 9426945a2..e76c50b0a 100644 --- a/Sources/MapboxDirections/DirectionsProfileIdentifier.swift +++ b/Sources/MapboxDirections/DirectionsProfileIdentifier.swift @@ -9,7 +9,7 @@ The returned directions are appropriate for driving or riding a car, truck, or m This profile prioritizes fast routes by preferring high-speed roads like highways. A driving route may use a ferry where necessary. */ -public struct DirectionsProfileIdentifier: Equatable, Hashable, RawRepresentable, ExpressibleByStringLiteral { +public struct DirectionsProfileIdentifier: Codable, Equatable, Hashable, RawRepresentable, ExpressibleByStringLiteral { public typealias StringLiteralType = String public typealias RawValue = String diff --git a/Sources/MapboxDirections/DirectionsResponse.swift b/Sources/MapboxDirections/DirectionsResponse.swift index ea4d886ba..efcf07e25 100644 --- a/Sources/MapboxDirections/DirectionsResponse.swift +++ b/Sources/MapboxDirections/DirectionsResponse.swift @@ -41,7 +41,7 @@ struct DirectionsResponse: Codable { if let destinations = waypoints?.dropFirst() { routesWithDestinations = rawRoutes?.map({ (route) -> Route in for (leg, destination) in zip(route.legs, destinations) { - if leg.destination?.name?.nonEmptyString == nil { + if leg.destination.name?.nonEmptyString == nil { leg.destination = destination } } diff --git a/Sources/MapboxDirections/DrivingSide.swift b/Sources/MapboxDirections/DrivingSide.swift new file mode 100644 index 000000000..3d2271fd3 --- /dev/null +++ b/Sources/MapboxDirections/DrivingSide.swift @@ -0,0 +1,16 @@ +import Foundation + +/** + A `DrivingSide` indicates which side of the road cars and traffic flow. + */ +public enum DrivingSide: String, Codable { + /** + Indicates driving occurs on the `left` side. + */ + case left + + /** + Indicates driving occurs on the `right` side. + */ + case right +} diff --git a/Sources/MapboxDirections/Extensions/CLLocationCoordinate2D.swift b/Sources/MapboxDirections/Extensions/CLLocationCoordinate2D.swift deleted file mode 100644 index efabd1052..000000000 --- a/Sources/MapboxDirections/Extensions/CLLocationCoordinate2D.swift +++ /dev/null @@ -1,24 +0,0 @@ -import Foundation -import CoreLocation - -#warning("Check this") -extension CLLocation { - /** - Initializes a CLLocation object with the given coordinate pair. - */ - internal convenience init(coordinate: CLLocationCoordinate2D) { - self.init(latitude: coordinate.latitude, longitude: coordinate.longitude) - } -} - -extension CLLocationCoordinate2D { -/** - A string representation of the coordinate suitable for insertion in a Directions API request URL. - */ - internal var stringForRequestURL: String? { - guard CLLocationCoordinate2DIsValid(self) else { - return nil - } - return "\(longitude.rounded(to: 1e6)),\(latitude.rounded(to: 1e6))" - } -} diff --git a/Sources/MapboxDirections/Extensions/CoreLocation.swift b/Sources/MapboxDirections/Extensions/CoreLocation.swift index 7150a90b6..e0f56736c 100644 --- a/Sources/MapboxDirections/Extensions/CoreLocation.swift +++ b/Sources/MapboxDirections/Extensions/CoreLocation.swift @@ -1,22 +1,26 @@ import Foundation import CoreLocation -extension CLLocationCoordinate2D: Codable { +extension CLLocationCoordinate2D: Codable, Equatable { public func encode(to encoder: Encoder) throws { var container = encoder.unkeyedContainer() - try container.encode(longitude) - try container.encode(latitude) + try container.encode(contentsOf: [longitude, latitude]) } public init(from decoder: Decoder) throws { + self.init() var container = try decoder.unkeyedContainer() longitude = try container.decode(CLLocationDegrees.self) latitude = try container.decode(CLLocationDegrees.self) } - static func == (lhs: CLLocationCoordinate2D, rhs: CLLocationCoordinate2D) -> Bool { + public static func == (lhs: CLLocationCoordinate2D, rhs: CLLocationCoordinate2D) -> Bool { return lhs.latitude == rhs.latitude && lhs.longitude == rhs.longitude } + + internal var jsonDescription: String { + return "\(longitude.rounded(to: 1e6)),\(latitude.rounded(to: 1e6))" + } } extension CLLocation { diff --git a/Sources/MapboxDirections/MBCoordinateBounds.swift b/Sources/MapboxDirections/MBCoordinateBounds.swift index 792665fe5..d6a9b154a 100644 --- a/Sources/MapboxDirections/MBCoordinateBounds.swift +++ b/Sources/MapboxDirections/MBCoordinateBounds.swift @@ -5,17 +5,25 @@ import CoreLocation A bounding box represents a geographic region. */ -public class CoordinateBounds: NSObject, Codable { +public struct CoordinateBounds: Codable { let southWest: CLLocationCoordinate2D let northEast: CLLocationCoordinate2D + enum CodingKeys: String, CodingKey { + case southWest, northEast + } + + public init(from decoder: Decoder) throws { + let container = try decoder.container(keyedBy: CodingKeys.self) + southWest = try container.decode(CLLocationCoordinate2D.self, forKey: .southWest) + northEast = try container.decode(CLLocationCoordinate2D.self, forKey: .northEast) + } /** Initializes a `BoundingBox` with known bounds. */ public init(southWest: CLLocationCoordinate2D, northEast: CLLocationCoordinate2D) { self.southWest = southWest self.northEast = northEast - super.init() } /** @@ -24,13 +32,12 @@ public class CoordinateBounds: NSObject, Codable { public init(northWest: CLLocationCoordinate2D, southEast: CLLocationCoordinate2D) { self.southWest = CLLocationCoordinate2D(latitude: southEast.latitude, longitude: northWest.longitude) self.northEast = CLLocationCoordinate2D(latitude: northWest.latitude, longitude: southEast.longitude) - super.init() } /** Initializes a `BoundingBox` from an array of `CLLocationCoordinate2D`’s. */ - convenience public init(coordinates: [CLLocationCoordinate2D]) { + public init(coordinates: [CLLocationCoordinate2D]) { assert(coordinates.count >= 2, "coordinates must consist of at least two coordinates") var maximumLatitude: CLLocationDegrees = -90 @@ -51,23 +58,7 @@ public class CoordinateBounds: NSObject, Codable { self.init(southWest: southWest, northEast: northEast) } - public override var description: String { + public var description: String { return "\(southWest.longitude),\(southWest.latitude);\(northEast.longitude),\(northEast.latitude)" } } - - -extension CLLocationCoordinate2D: Codable { - public func encode(to encoder: Encoder) throws { - var container = encoder.unkeyedContainer() - try container.encode(longitude) - try container.encode(latitude) - } - - public init(from decoder: Decoder) throws { - var container = try decoder.unkeyedContainer() - let longitude = try container.decode(CLLocationDegrees.self) - let latitude = try container.decode(CLLocationDegrees.self) - self.init(latitude: latitude, longitude: longitude) - } -} diff --git a/Sources/MapboxDirections/MBDirections.swift b/Sources/MapboxDirections/MBDirections.swift index 5df3af858..6119ef591 100644 --- a/Sources/MapboxDirections/MBDirections.swift +++ b/Sources/MapboxDirections/MBDirections.swift @@ -367,22 +367,22 @@ open class Directions: NSObject { case (429, _): return .rateLimited(rateLimitInterval: response.rateLimitInterval, rateLimit: response.rateLimit, resetTime: response.rateLimitResetTime) default: - return .unknown(response: response, underlying: error) + return .unknown(response: response, underlying: error, code: code) } } - return NSError(domain: error?.domain ?? MBDirectionsErrorDomain, code: error?.code ?? -1, userInfo: userInfo) + return .unknown(response: nil, underlying: error, code: code) } - /** - Adds request- or response-specific information to each result in a response. - */ - func postprocess(_ results: [DirectionsResult], fetchStartDate: Date, responseEndDate: Date, uuid: String?) { - for result in results { - result.accessToken = self.accessToken - result.apiEndpoint = self.apiEndpoint - result.routeIdentifier = uuid - result.fetchStartDate = fetchStartDate - result.responseEndDate = responseEndDate - } - } +// /** +// Adds request- or response-specific information to each result in a response. +// */ +// func postprocess(_ results: [DirectionsResult], fetchStartDate: Date, responseEndDate: Date, uuid: String?) { +// for result in results { +// result.accessToken = self.accessToken +// result.apiEndpoint = self.apiEndpoint +// result.routeIdentifier = uuid +// result.fetchStartDate = fetchStartDate +// result.responseEndDate = responseEndDate +// } +// } } diff --git a/Sources/MapboxDirections/MBDirectionsOptions.swift b/Sources/MapboxDirections/MBDirectionsOptions.swift index a3cdeba76..fbb875545 100644 --- a/Sources/MapboxDirections/MBDirectionsOptions.swift +++ b/Sources/MapboxDirections/MBDirectionsOptions.swift @@ -1,9 +1,6 @@ import Foundation import Polyline import CoreLocation -#if SWIFT_PACKAGE -import CMapboxDirections -#endif /** @@ -18,7 +15,7 @@ let MaximumURLLength = 1024 * 8 A `RouteShapeFormat` indicates the format of a route or match shape in the raw HTTP response. */ -public enum RouteShapeFormat: UInt, CustomStringConvertible { +public enum RouteShapeFormat: String, Codable { /** The route’s shape is delivered in [GeoJSON](http://geojson.org/) format. @@ -37,111 +34,38 @@ public enum RouteShapeFormat: UInt, CustomStringConvertible { This format is an order of magnitude more precise than `polyline`. */ case polyline6 - - public init?(description: String) { - let format: RouteShapeFormat - switch description { - case "geojson": - format = .geoJSON - case "polyline": - format = .polyline - case "polyline6": - format = .polyline6 - default: - return nil - } - self.init(rawValue: format.rawValue) - } - - public var description: String { - switch self { - case .geoJSON: - return "geojson" - case .polyline: - return "polyline" - case .polyline6: - return "polyline6" - } - } -} - -extension RouteShapeFormat { - - func coordinates(from geometry: Any?) -> [CLLocationCoordinate2D]? { - switch self { - case .geoJSON: - if let geometry = geometry as? JSONDictionary { - return CLLocationCoordinate2D.coordinates(geoJSON: geometry) - } - case .polyline: - if let geometry = geometry as? String { - return decodePolyline(geometry, precision: 1e5)! - } - case .polyline6: - if let geometry = geometry as? String { - return decodePolyline(geometry, precision: 1e6)! - } - } - return nil - } } /** A `RouteShapeResolution` indicates the level of detail in a route’s shape, or whether the shape is present at all. */ -public enum RouteShapeResolution: UInt, CustomStringConvertible { +public enum RouteShapeResolution: String, Codable { /** The route’s shape is omitted. Specify this resolution if you do not intend to show the route line to the user or analyze the route line in any way. */ - case none + case none = "false" /** The route’s shape is simplified. This resolution considerably reduces the size of the response. The resulting shape is suitable for display at a low zoom level, but it lacks the detail necessary for focusing on individual segments of the route. */ - case low + case low = "simplified" /** The route’s shape is as detailed as possible. The resulting shape is equivalent to concatenating the shapes of all the route’s consitituent steps. You can focus on individual segments of this route while faithfully representing the path of the route. If you only intend to show a route overview and do not need to analyze the route line in any way, consider specifying `low` instead to considerably reduce the size of the response. */ case full - - public init?(description: String) { - let granularity: RouteShapeResolution - switch description { - case "false": - granularity = .none - case "simplified": - granularity = .low - case "full": - granularity = .full - default: - return nil - } - self.init(rawValue: granularity.rawValue) - } - - public var description: String { - switch self { - case .none: - return "false" - case .low: - return "simplified" - case .full: - return "full" - } - } } /** A system of units of measuring distances and other quantities. */ -public enum MeasurementSystem: UInt, CustomStringConvertible { +public enum MeasurementSystem: String, Codable { /** U.S. customary and British imperial units. @@ -156,68 +80,8 @@ public enum MeasurementSystem: UInt, CustomStringConvertible { Distances are measured in kilometers and meters. */ case metric - - public init?(description: String) { - let measurementSystem: MeasurementSystem - switch description { - case "imperial": - measurementSystem = .imperial - case "metric": - measurementSystem = .metric - default: - return nil - } - self.init(rawValue: measurementSystem.rawValue) - } - - public var description: String { - switch self { - case .imperial: - return "imperial" - case .metric: - return "metric" - } - } } -/** - A `RouteShapeFormat` indicates the format of a route’s shape in the raw HTTP response. - */ - -public enum InstructionFormat: UInt, CustomStringConvertible { - /** - The route steps’ instructions are delivered in plain text format. - */ - case text - /** - The route steps’ instructions are delivered in HTML format. - - Key phrases are boldfaced. - */ - case html - - public init?(description: String) { - let format: InstructionFormat - switch description { - case "text": - format = .text - case "html": - format = .html - default: - return nil - } - self.init(rawValue: format.rawValue) - } - - public var description: String { - switch self { - case .text: - return "text" - case .html: - return "html" - } - } -} /** Options for calculating results from the Mapbox Directions service. @@ -226,7 +90,7 @@ public enum InstructionFormat: UInt, CustomStringConvertible { */ -open class DirectionsOptions: NSObject, NSSecureCoding, NSCopying { +open class DirectionsOptions: Codable { // NSSecureCoding, NSCopying { /** Initializes an options object for routes between the given waypoints and an optional profile identifier. @@ -240,129 +104,52 @@ open class DirectionsOptions: NSObject, NSSecureCoding, NSCopying { self.waypoints = waypoints self.profileIdentifier = profileIdentifier ?? .automobile } - - public class var supportsSecureCoding: Bool { - return true - } - - // MARK: NSCopying - open func copy(with zone: NSZone? = nil) -> Any { - let copy = type(of: self).init(waypoints: waypoints, profileIdentifier: profileIdentifier) - copy.includesSteps = includesSteps - copy.shapeFormat = shapeFormat - copy.routeShapeResolution = routeShapeResolution - copy.locale = locale - copy.attributeOptions = attributeOptions - copy.includesSpokenInstructions = includesSpokenInstructions - copy.distanceMeasurementSystem = distanceMeasurementSystem - copy.includesVisualInstructions = includesVisualInstructions - return copy - } - - // MARK: Objective-C equality - open override func isEqual(_ object: Any?) -> Bool { - guard let opts = object as? DirectionsOptions else { return false } - return isEqual(to: opts) - } - - open func isEqual(to directionsOptions: DirectionsOptions?) -> Bool { - guard let other = directionsOptions else { return false } - guard type(of: self) == type(of: other) else { return false } - guard waypoints == other.waypoints, - profileIdentifier == other.profileIdentifier, - includesSteps == other.includesSteps, - shapeFormat == other.shapeFormat, - routeShapeResolution == other.routeShapeResolution, - attributeOptions == other.attributeOptions, - locale == other.locale, - includesSpokenInstructions == other.includesSpokenInstructions, - includesVisualInstructions == other.includesVisualInstructions, - distanceMeasurementSystem == other.distanceMeasurementSystem else { return false } - return true + private enum CodingKeys: String, CodingKey { + case waypoints + case profileIdentifier + case includesSteps + case shapeFormat + case routeShapeResolution + case attributeOptions + case locale + case includesSpokenInstructions + case distanceMeasurementSystem + case includesVisualInstructions } - - public func encode(with coder: NSCoder) { - coder.encode(waypoints, forKey: "waypoints") - coder.encode(profileIdentifier, forKey: "profileIdentifier") - coder.encode(includesSteps, forKey: "includesSteps") - coder.encode(shapeFormat.description, forKey: "shapeFormat") - coder.encode(routeShapeResolution.description, forKey: "routeShapeResolution") - coder.encode(attributeOptions.description, forKey: "attributeOptions") - coder.encode(locale, forKey: "locale") - coder.encode(includesSpokenInstructions, forKey: "includesSpokenInstructions") - coder.encode(distanceMeasurementSystem.description, forKey: "distanceMeasurementSystem") - coder.encode(includesVisualInstructions, forKey: "includesVisualInstructions") - } - - public required init?(coder decoder: NSCoder) { - guard let waypoints = decoder.decodeObject(of: [NSArray.self, Waypoint.self], forKey: "waypoints") as? [Waypoint] else { - return nil - } - self.waypoints = waypoints - - guard let profileIdentifier = decoder.decodeObject(of: NSString.self, forKey: "profileIdentifier") as String? else { - return nil + + public func encode(to encoder: Encoder) throws { + var container = encoder.container(keyedBy: CodingKeys.self) + try container.encode(waypoints, forKey: .waypoints) + try container.encode(profileIdentifier.rawValue, forKey: .profileIdentifier) + try container.encode(includesSteps, forKey: .includesSteps) + try container.encode(shapeFormat.rawValue, forKey: .shapeFormat) + try container.encode(routeShapeResolution.rawValue, forKey: .routeShapeResolution) + try container.encode(attributeOptions.rawValue, forKey: .attributeOptions) + try container.encode(locale, forKey: .locale) + try container.encode(includesSpokenInstructions, forKey: .includesSpokenInstructions) + try container.encode(distanceMeasurementSystem.rawValue, forKey: .distanceMeasurementSystem) + try container.encode(includesVisualInstructions, forKey: .includesVisualInstructions) + try container.encode(includesSpokenInstructions, forKey: .includesSpokenInstructions) + if includesSpokenInstructions { + try container.encode(distanceMeasurementSystem, forKey: .distanceMeasurementSystem) } - self.profileIdentifier = DirectionsProfileIdentifier(rawValue: profileIdentifier) - - includesSteps = decoder.decodeBool(forKey: "includesSteps") - - guard let shapeFormat = RouteShapeFormat(description: decoder.decodeObject(of: NSString.self, forKey: "shapeFormat") as String? ?? "") else { - return nil - } - self.shapeFormat = shapeFormat - - guard let routeShapeResolution = RouteShapeResolution(description: decoder.decodeObject(of: NSString.self, forKey: "routeShapeResolution") as String? ?? "") else { - return nil - } - self.routeShapeResolution = routeShapeResolution - - guard let descriptions = decoder.decodeObject(of: NSString.self, forKey: "attributeOptions") as String?, - let attributeOptions = AttributeOptions(descriptions: descriptions.components(separatedBy: ",")) else { - return nil - } - self.attributeOptions = attributeOptions - - - if let locale = decoder.decodeObject(of: NSLocale.self, forKey: "locale") as Locale? { - self.locale = locale - } - - includesSpokenInstructions = decoder.decodeBool(forKey: "includesSpokenInstructions") - - if let distanceMeasurementSystem = MeasurementSystem(description: decoder.decodeObject(of: NSString.self, forKey: "distanceMeasurementSystem") as String? ?? "") { - self.distanceMeasurementSystem = distanceMeasurementSystem - } - - includesVisualInstructions = decoder.decodeBool(forKey: "includesVisualInstructions") - } - - /** - An array of directions query strings to include in the request URL. - */ - internal var queries: [String] { - return waypoints.compactMap{ $0.coordinate.stringForRequestURL } - } - - /** - The path of the request URL, not including the hostname or any parameters. - */ - internal var path: String { - assert(!queries.isEmpty, "No query") - let queryComponent = queries.joined(separator: ";") - return "\(abridgedPath)/\(queryComponent).json" } - /** - The path of the request URL, not including the hostname, query components, - or any parameters. - */ - internal var abridgedPath: String { - assert(false, "abridgedPath should be overriden by subclass") - return "" + public required init(from decoder: Decoder) throws { + let container = try decoder.container(keyedBy: CodingKeys.self) + waypoints = try container.decode([Waypoint].self, forKey: .waypoints) + profileIdentifier = try container.decode(DirectionsProfileIdentifier.self, forKey: .profileIdentifier) + includesSteps = try container.decode(Bool.self, forKey: .includesSteps) + shapeFormat = try container.decode(RouteShapeFormat.self, forKey: .shapeFormat) + routeShapeResolution = try container.decode(RouteShapeResolution.self, forKey: .routeShapeResolution) + attributeOptions = try container.decode(AttributeOptions.self, forKey: .attributeOptions) + locale = try container.decode(Locale.self, forKey: .locale) + includesSpokenInstructions = try container.decode(Bool.self, forKey: .includesSpokenInstructions) + distanceMeasurementSystem = try container.decode(MeasurementSystem.self, forKey: .distanceMeasurementSystem) + includesVisualInstructions = try container.decode(Bool.self, forKey: .includesVisualInstructions) } /** @@ -438,7 +225,7 @@ open class DirectionsOptions: NSObject, NSSecureCoding, NSCopying { */ open var locale = Locale.autoupdatingCurrent { didSet { - self.distanceMeasurementSystem = locale.usesMetric ? .metric : .imperial + self.distanceMeasurementSystem = locale.usesMetricSystem ? .metric : .imperial } } @@ -456,7 +243,7 @@ open class DirectionsOptions: NSObject, NSSecureCoding, NSCopying { You should choose a measurement system appropriate for the current region. You can also allow the user to indicate their preferred measurement system via a setting. */ - open var distanceMeasurementSystem: MeasurementSystem = Locale.autoupdatingCurrent.usesMetric ? .metric : .imperial + open var distanceMeasurementSystem: MeasurementSystem = Locale.autoupdatingCurrent.usesMetricSystem ? .metric : .imperial /** If true, each `RouteStep` will contain the property `visualInstructionsAlongStep`. @@ -471,7 +258,11 @@ open class DirectionsOptions: NSObject, NSSecureCoding, NSCopying { The query items are included in the URL of a GET request or the body of a POST request. */ - open var urlQueryItems: [URLQueryItem] { +} + +// MARK: - URL Queries +public extension DirectionsOptions { + var urlQueryItems: [URLQueryItem] { var queryItems: [URLQueryItem] = [ URLQueryItem(name: "geometries", value: String(describing: shapeFormat)), URLQueryItem(name: "overview", value: String(describing: routeShapeResolution)), @@ -495,57 +286,86 @@ open class DirectionsOptions: NSObject, NSSecureCoding, NSCopying { } // Include headings and heading accuracies if any waypoint has a nonnegative heading. - if !waypoints.filter({ $0.heading >= 0 }).isEmpty { - let headings = waypoints.map { $0.headingDescription }.joined(separator: ";") - queryItems.append(URLQueryItem(name: "bearings", value: headings)) + if let bearings = self.bearings { + queryItems.append(URLQueryItem(name: "bearings", value: bearings)) } // Include location accuracies if any waypoint has a nonnegative coordinate accuracy. - if !waypoints.filter({ $0.coordinateAccuracy >= 0 }).isEmpty { - let accuracies = waypoints.map { - $0.coordinateAccuracy >= 0 ? String($0.coordinateAccuracy) : "unlimited" - }.joined(separator: ";") - queryItems.append(URLQueryItem(name: "radiuses", value: accuracies)) + if let radiuses = self.radiuses { + queryItems.append(URLQueryItem(name: "radiuses", value: radiuses)) } - if !attributeOptions.isEmpty { - let attributesStrings = String(describing:attributeOptions) + if let annotations = self.annotations { + queryItems.append((URLQueryItem(name: "annotations", value: annotations))) + } - queryItems.append(URLQueryItem(name: "annotations", value: attributesStrings)) + if let waypointIndices = self.waypointIndices { + queryItems.append(URLQueryItem(name: "waypoints", value: waypointIndices)) + } + + if let names = self.waypointNames { + queryItems.append(URLQueryItem(name: "waypoint_names", value: names)) + } + + if let coordinates = self.coordinates { + queryItems.append(URLQueryItem(name: "coordinates", value: coordinates)) } + return queryItems + } + + private var bearings: String? { + if waypoints.filter({$0.heading >= 0}).isEmpty { + return nil + } + return waypoints.map({ $0.headingDescription }).joined(separator: ";") + } + + private var radiuses: String? { + if waypoints.filter({ $0.coordinateAccuracy >= 0 }).isEmpty { + return nil + } + return waypoints.map { + $0.coordinateAccuracy >= 0 ? String($0.coordinateAccuracy) : "unlimited" + }.joined(separator: ";") + } + + private var approaches: String? { + if waypoints.filter( { !$0.allowsArrivingOnOppositeSide }).isEmpty { + return nil + } + return waypoints.map { $0.allowsArrivingOnOppositeSide ? "unrestricted" : "curb" }.joined(separator: ";") + } + + private var annotations: String? { + if attributeOptions.isEmpty { + return nil + } + return attributeOptions.description + } + + private var waypointIndices: String? { var waypointIndices = IndexSet(waypoints.enumerated().filter { $0.element.separatesLegs }.map { $0.offset }) waypointIndices.insert(waypoints.startIndex) waypointIndices.insert(waypoints.endIndex - 1) - if waypointIndices.count < waypoints.count { - queryItems.append(URLQueryItem(name: "waypoints", value: waypointIndices.map { - String(describing: $0) - }.joined(separator: ";"))) + + guard waypointIndices.count < waypoints.count else { + return nil } - - if !waypoints.compactMap({ $0.name }).isEmpty { - let names = legSeparators.map { $0.name ?? "" }.joined(separator: ";") - queryItems.append(URLQueryItem(name: "waypoint_names", value: names)) + let indicesString = waypointIndices.map(String.init(describing:)).joined(separator: ";") + return indicesString + + } + + private var waypointNames: String? { + if waypoints.compactMap({ $0.name }).isEmpty { + return nil } - - return queryItems + return legSeparators.map({ $0.name ?? "" }).joined(separator: ";") } - internal var httpBody: String { - var components = URLComponents() - components.queryItems = urlQueryItems + [ - URLQueryItem(name: "coordinates", value: queries.joined(separator: ";")), - ] - return components.percentEncodedQuery ?? "" + private var coordinates: String? { + return waypoints.map { $0.coordinate.jsonDescription }.joined(separator: ";") } -} - -extension Locale { - fileprivate var usesMetric: Bool { - guard let measurementSystem = (self as NSLocale).object(forKey: .measurementSystem) as? String else { - return false - } - return measurementSystem == "Metric" - } } diff --git a/Sources/MapboxDirections/MBIntersection.swift b/Sources/MapboxDirections/MBIntersection.swift index 0f3fc8906..22c14531a 100644 --- a/Sources/MapboxDirections/MBIntersection.swift +++ b/Sources/MapboxDirections/MBIntersection.swift @@ -1,12 +1,9 @@ import Foundation -import CoreLocation - /** A single cross street along a step. */ - -public class Intersection: NSObject, NSSecureCoding { +public struct Intersection: Codable { /** The geographic coordinates at the center of the intersection. */ @@ -59,89 +56,83 @@ public class Intersection: NSObject, NSSecureCoding { */ public let outletRoadClasses: RoadClasses? - internal init(json: JSONDictionary) { - location = CLLocationCoordinate2D(geoJSON: json["location"] as! [Double]) - headings = json["bearings"] as! [CLLocationDirection] + private enum CodingKeys: String, CodingKey { + case outletIndexes = "entry" + case headings = "bearings" + case location + case approachIndex = "in" + case outletIndex = "out" + case lanes + case approachLanes + case usableApproachLanes + case outletRoadClasses = "classes" + } + + public init(location: CLLocationCoordinate2D, + headings: [CLLocationDirection], + approachIndex: Int, + outletIndex: Int, + outletIndexes: IndexSet, + approachLanes: [Lane]?, + usableApproachLanes: IndexSet?, + outletRoadClasses: RoadClasses?) { + self.location = location + self.headings = headings + self.approachIndex = approachIndex + self.approachLanes = approachLanes + self.outletIndex = outletIndex + self.outletIndexes = outletIndexes + self.usableApproachLanes = usableApproachLanes + self.outletRoadClasses = outletRoadClasses + } + + public func encode(to encoder: Encoder) throws { + var container = encoder.container(keyedBy: CodingKeys.self) + try container.encode(location, forKey: .location) + try container.encode(headings, forKey: .headings) - let outletsArray = json["entry"] as! [Bool] - let outletIndexes = outletsArray.enumerated().filter{ $1 }.map { $0.offset } - self.outletIndexes = IndexSet(outletIndexes) + try container.encode(approachIndex, forKey: .approachIndex) + try container.encode(outletIndex, forKey: .outletIndex) - approachIndex = json["in"] as? Int ?? -1 - outletIndex = json["out"] as? Int ?? -1 + try container.encode(outletIndexes, forKey: .outletIndexes) - if let lanesJSON = json["lanes"] as? [JSONDictionary] { - var lanes: [Lane] = [] - var usableApproachLanes = IndexSet() - - for (i, laneJSON) in lanesJSON.enumerated() { - lanes.append(Lane(json: laneJSON)) - if laneJSON["valid"] as! Bool { - usableApproachLanes.update(with: i) - } - } - self.approachLanes = lanes - self.usableApproachLanes = usableApproachLanes - } else { - approachLanes = nil - usableApproachLanes = nil - } + try container.encode(approachLanes, forKey: .approachLanes) + try container.encode(usableApproachLanes, forKey: .usableApproachLanes) - if let classStrings = json["classes"] as? [String] { - outletRoadClasses = RoadClasses(descriptions: classStrings) - } else { - outletRoadClasses = nil + if let classes = outletRoadClasses?.description.components(separatedBy: ",") { + try container.encode(classes, forKey: .outletRoadClasses) } } - public required init?(coder decoder: NSCoder) { - guard let locationDictionary = decoder.decodeObject(of: [NSDictionary.self, NSString.self, NSNumber.self], forKey: "location") as? [String: CLLocationDegrees], - let latitude = locationDictionary["latitude"], - let longitude = locationDictionary["longitude"] else { - return nil - } - location = CLLocationCoordinate2D(latitude: latitude, longitude: longitude) + public init(from decoder: Decoder) throws { + let container = try decoder.container(keyedBy: CodingKeys.self) + location = try container.decode(CLLocationCoordinate2D.self, forKey: .location) + headings = try container.decode([CLLocationDirection].self, forKey: .headings) - guard let headings = decoder.decodeObject(of: [NSArray.self, NSNumber.self], forKey: "headings") as? [CLLocationDirection] else { - return nil - } - self.headings = headings - - guard let outletIndexes = decoder.decodeObject(of: NSIndexSet.self, forKey: "outletIndexes") else { - return nil + let lanes = try container.decodeIfPresent([Lane].self, forKey: .lanes) + + approachLanes = lanes + var usableApproachLanes = IndexSet() + if let lanes = lanes { + for (i, lane) in lanes.enumerated() { + if lane.isValid { + usableApproachLanes.update(with: i) + } + } } - self.outletIndexes = outletIndexes as IndexSet - approachIndex = decoder.decodeInteger(forKey: "approachIndex") - outletIndex = decoder.decodeInteger(forKey: "outletIndex") + self.usableApproachLanes = usableApproachLanes.isEmpty ? nil : usableApproachLanes - approachLanes = decoder.decodeObject(of: [NSArray.self, Lane.self], forKey: "approachLanes") as? [Lane] - usableApproachLanes = decoder.decodeObject(of: NSIndexSet.self, forKey: "usableApproachLanes") as IndexSet? + outletRoadClasses = try container.decodeIfPresent(RoadClasses.self, forKey: .outletRoadClasses) - if let descriptions = decoder.decodeObject(of: NSString.self, forKey: "outletRoadClasses") as String? { - outletRoadClasses = RoadClasses(descriptions: descriptions.components(separatedBy: ",")) + if let outletIndexes = try? container.decode(IndexSet.self, forKey: .outletIndexes) { + self.outletIndexes = outletIndexes } else { - outletRoadClasses = nil + let outletsArray = try container.decode([Bool].self, forKey: .outletIndexes) + outletIndexes = IndexSet(outletsArray.enumerated().filter { $1 }.map { $0.offset }) } - } - - public static var supportsSecureCoding = true - - public func encode(with coder: NSCoder) { - coder.encode([ - "latitude": location.latitude, - "longitude": location.longitude, - ], forKey: "location") - - coder.encode(headings, forKey: "headings") - coder.encode(outletIndexes, forKey: "outletIndexes") - - coder.encode(approachIndex, forKey: "approachIndex") - coder.encode(outletIndex, forKey: "outletIndex") - - coder.encode(approachLanes, forKey: "approachLanes") - coder.encode(usableApproachLanes, forKey: "usableApproachLanes") - coder.encode(outletRoadClasses?.description, forKey: "outletRoadClasses") + outletIndex = try container.decodeIfPresent(Int.self, forKey: .outletIndex) ?? -1 + approachIndex = try container.decodeIfPresent(Int.self, forKey: .approachIndex) ?? -1 } } diff --git a/Sources/MapboxDirections/MBLane.swift b/Sources/MapboxDirections/MBLane.swift index 174f16983..b61bdf88b 100644 --- a/Sources/MapboxDirections/MBLane.swift +++ b/Sources/MapboxDirections/MBLane.swift @@ -3,38 +3,34 @@ import Foundation /** A lane on the road approaching an intersection. */ - - -public class Lane: NSObject, NSSecureCoding { +public struct Lane: Codable { /** The lane indications specifying the maneuvers that may be executed from the lane. */ public let indications: LaneIndication - /** - Initializes a new `Lane` using the given lane indications. - */ - public init(indications: LaneIndication) { + let isValid: Bool + + internal init(indications: LaneIndication, valid: Bool = false) { self.indications = indications + self.isValid = valid } - internal convenience init(json: JSONDictionary) { - let indications = LaneIndication(descriptions: json["indications"] as! [String]) - - self.init(indications: indications!) + private enum CodingKeys: String, CodingKey { + case indications + case valid } - public required init?(coder decoder: NSCoder) { - guard let descriptions = decoder.decodeObject(of: [NSArray.self, NSString.self], forKey: "indications") as? [String], - let indications = LaneIndication(descriptions: descriptions) else { - return nil - } - self.indications = indications + public func encode(to encoder: Encoder) throws { + var container = encoder.container(keyedBy: CodingKeys.self) + try container.encode(indications, forKey: .indications) + try container.encode(isValid, forKey: .valid) } - public static var supportsSecureCoding = true - - public func encode(with coder: NSCoder) { - coder.encode(indications.description.components(separatedBy: ","), forKey: "indications") + public init(from decoder: Decoder) throws { + let container = try decoder.container(keyedBy: CodingKeys.self) + let descriptions = try container.decode([String].self, forKey: .indications) + indications = LaneIndication(descriptions: descriptions)! + isValid = try container.decode(Bool.self, forKey: .valid) } } diff --git a/Sources/MapboxDirections/MBLaneIndication.swift b/Sources/MapboxDirections/MBLaneIndication.swift index 72c07979d..8042124f3 100644 --- a/Sources/MapboxDirections/MBLaneIndication.swift +++ b/Sources/MapboxDirections/MBLaneIndication.swift @@ -1,10 +1,7 @@ import Foundation -#if SWIFT_PACKAGE -import CMapboxDirections -#endif -public struct LaneIndication: OptionSet, CustomStringConvertible { +public struct LaneIndication: OptionSet, CustomStringConvertible, Codable { public var rawValue: Int public init(rawValue: Int) { diff --git a/Sources/MapboxDirections/MBRoute.swift b/Sources/MapboxDirections/MBRoute.swift index ecf4e418b..beadfcb09 100644 --- a/Sources/MapboxDirections/MBRoute.swift +++ b/Sources/MapboxDirections/MBRoute.swift @@ -74,7 +74,7 @@ open class Route: NSObject, Codable { // MARK: Creating a Route - @objc internal init(routeOptions: RouteOptions, legs: [RouteLeg], distance: CLLocationDistance, expectedTravelTime: TimeInterval, coordinates: [CLLocationCoordinate2D]?) { + internal init(routeOptions: RouteOptions, legs: [RouteLeg], distance: CLLocationDistance, expectedTravelTime: TimeInterval, coordinates: [CLLocationCoordinate2D]?) { self.routeOptions = routeOptions self.legs = legs self.distance = distance @@ -91,7 +91,7 @@ open class Route: NSObject, Codable { Using the [Mapbox Maps SDK for iOS](https://www.mapbox.com/ios-sdk/) or [Mapbox Maps SDK for macOS](https://github.com/mapbox/mapbox-gl-native/tree/master/platform/macos/), you can create an `MGLPolyline` object using these coordinates to display an overview of the route on an `MGLMapView`. */ - @objc open let coordinates: [CLLocationCoordinate2D]? + public let coordinates: [CLLocationCoordinate2D]? /** The number of coordinates. @@ -100,7 +100,7 @@ open class Route: NSObject, Codable { - note: This initializer is intended for Objective-C usage. In Swift code, use the `coordinates.count` property. */ - @objc open var coordinateCount: UInt { + open var coordinateCount: UInt { return UInt(coordinates?.count ?? 0) } @@ -117,7 +117,7 @@ open class Route: NSObject, Codable { - note: This initializer is intended for Objective-C usage. In Swift code, use the `coordinates` property. */ - @objc open func getCoordinates(_ coordinates: UnsafeMutablePointer) { + open func getCoordinates(_ coordinates: UnsafeMutablePointer) { for i in 0..<(self.coordinates?.count ?? 0) { coordinates.advanced(by: i).pointee = self.coordinates![i] } @@ -130,9 +130,9 @@ open class Route: NSObject, Codable { To determine the name of the route, concatenate the names of the route’s legs. */ - @objc open let legs: [RouteLeg] + public let legs: [RouteLeg] - @objc open override var description: String { + open override var description: String { return legs.map { $0.name }.joined(separator: " – ") } @@ -143,7 +143,7 @@ open class Route: NSObject, Codable { The value of this property accounts for the distance that the user must travel to traverse the path of the route. It is the sum of the `distance` properties of the route’s legs, not the sum of the direct distances between the route’s waypoints. You should not assume that the user would travel along this distance at a fixed speed. */ - @objc open let distance: CLLocationDistance + public let distance: CLLocationDistance /** The route’s expected travel time, measured in seconds. @@ -152,28 +152,28 @@ open class Route: NSObject, Codable { Do not assume that the user would travel along the route at a fixed speed. For more granular travel times, use the `RouteLeg.expectedTravelTime` or `RouteStep.expectedTravelTime`. For even more granularity, specify the `AttributeOptions.expectedTravelTime` option and use the `RouteLeg.expectedSegmentTravelTimes` property. */ - @objc open let expectedTravelTime: TimeInterval + public let expectedTravelTime: TimeInterval /** `RouteOptions` used to create the directions request. The route options object’s profileIdentifier property reflects the primary mode of transportation used for the route. Individual steps along the route might use different modes of transportation as necessary. */ - @objc open let routeOptions: RouteOptions + public let routeOptions: RouteOptions /** The [access token](https://www.mapbox.com/help/define-access-token/) used to make the directions request. This property is set automatically if a request is made via `Directions.calculate(_:completionHandler:)`. */ - @objc open var accessToken: String? + open var accessToken: String? /** The endpoint used to make the directions request. This property is set automatically if a request is made via `Directions.calculate(_:completionHandler:)`. */ - @objc open var apiEndpoint: URL? + open var apiEndpoint: URL? func debugQuickLookObject() -> Any? { if let coordinates = coordinates { @@ -187,4 +187,5 @@ open class Route: NSObject, Codable { Each route produced by a single call to `Directions.calculate(_:completionHandler:)` has the same route identifier. */ - @objc open var routeIdentifier: String? + open var routeIdentifier: String? +} diff --git a/Sources/MapboxDirections/MBRouteLeg.swift b/Sources/MapboxDirections/MBRouteLeg.swift index c468f6e35..326ce6705 100644 --- a/Sources/MapboxDirections/MBRouteLeg.swift +++ b/Sources/MapboxDirections/MBRouteLeg.swift @@ -1,9 +1,6 @@ import Foundation import CoreLocation import Polyline -#if SWIFT_PACKAGE -import CMapboxDirections -#endif /** @@ -134,7 +131,7 @@ open class RouteLeg: NSObject, NSSecureCoding { Unless this is the last leg of the route, the destination of this leg is the same as the source of the next leg. */ - public let destination: Waypoint + public var destination: Waypoint /** An array of one or more `RouteStep` objects representing the steps for traversing this leg of the route. diff --git a/Sources/MapboxDirections/MBRouteOptions.swift b/Sources/MapboxDirections/MBRouteOptions.swift index 3dd53cf7d..5e9ebc236 100644 --- a/Sources/MapboxDirections/MBRouteOptions.swift +++ b/Sources/MapboxDirections/MBRouteOptions.swift @@ -1,155 +1,10 @@ -/** - A `RouteShapeFormat` indicates the format of a route’s shape in the raw HTTP response. - */ -@objc(MBRouteShapeFormat) -public enum RouteShapeFormat: UInt, CustomStringConvertible { - /** - The route’s shape is delivered in [GeoJSON](http://geojson.org/) format. - - This standard format is human-readable and can be parsed straightforwardly, but it is far more verbose than `polyline`. - */ - case geoJSON - /** - The route’s shape is delivered in [encoded polyline algorithm](https://developers.google.com/maps/documentation/utilities/polylinealgorithm) format with 1×10−5 precision. - - This machine-readable format is considerably more compact than `geoJSON` but less precise than `polyline6`. - */ - case polyline - /** - The route’s shape is delivered in [encoded polyline algorithm](https://developers.google.com/maps/documentation/utilities/polylinealgorithm) format with 1×10−6 precision. - - This format is an order of magnitude more precise than `polyline`. - */ - case polyline6 - - public init?(description: String) { - let format: RouteShapeFormat - switch description { - case "geojson": - format = .geoJSON - case "polyline": - format = .polyline - case "polyline6": - format = .polyline6 - default: - return nil - } - self.init(rawValue: format.rawValue) - } - - public var description: String { - switch self { - case .geoJSON: - return "geojson" - case .polyline: - return "polyline" - case .polyline6: - return "polyline6" - } - } -} - -/** - A `RouteShapeResolution` indicates the level of detail in a route’s shape, or whether the shape is present at all. - */ -@objc(MBRouteShapeResolution) -public enum RouteShapeResolution: UInt, CustomStringConvertible { - /** - The route’s shape is omitted. - - Specify this resolution if you do not intend to show the route line to the user or analyze the route line in any way. - */ - case none - /** - The route’s shape is simplified. - - This resolution considerably reduces the size of the response. The resulting shape is suitable for display at a low zoom level, but it lacks the detail necessary for focusing on individual segments of the route. - */ - case low - /** - The route’s shape is as detailed as possible. - - The resulting shape is equivalent to concatenating the shapes of all the route’s consitituent steps. You can focus on individual segments of this route while faithfully representing the path of the route. If you only intend to show a route overview and do not need to analyze the route line in any way, consider specifying `low` instead to considerably reduce the size of the response. - */ - case full - - public init?(description: String) { - let granularity: RouteShapeResolution - switch description { - case "false": - granularity = .none - case "simplified": - granularity = .low - case "full": - granularity = .full - default: - return nil - } - self.init(rawValue: granularity.rawValue) - } - - public var description: String { - switch self { - case .none: - return "false" - case .low: - return "simplified" - case .full: - return "full" - } - } -} - -/** - A system of units of measuring distances and other quantities. - */ -@objc(MBMeasurementSystem) -public enum MeasurementSystem: UInt, CustomStringConvertible { - - /** - U.S. customary and British imperial units. - - Distances are measured in miles and feet. - */ - case imperial - - /** - The metric system. - - Distances are measured in kilometers and meters. - */ - case metric - - public init?(description: String) { - let measurementSystem: MeasurementSystem - switch description { - case "imperial": - measurementSystem = .imperial - case "metric": - measurementSystem = .metric - default: - return nil - } - self.init(rawValue: measurementSystem.rawValue) - } - - public var description: String { - switch self { - case .imperial: - return "imperial" - case .metric: - return "metric" - } - } -} /** A `RouteOptions` object is a structure that specifies the criteria for results returned by the Mapbox Directions API. Pass an instance of this class into the `Directions.calculate(_:completionHandler:)` method. */ -@objc(MBRouteOptions) -open class RouteOptions: NSObject, Codable, NSCopying { +open class RouteOptions: DirectionsOptions, Codable { // MARK: Creating a Route Options Object /** @@ -158,13 +13,13 @@ open class RouteOptions: NSObject, Codable, NSCopying { - parameter waypoints: An array of `Waypoint` objects representing locations that the route should visit in chronological order. The array should contain at least two waypoints (the source and destination) and at most 25 waypoints. (Some profiles, such as `MBDirectionsProfileIdentifierAutomobileAvoidingTraffic`, [may have lower limits](https://www.mapbox.com/api-documentation/#directions).) - parameter profileIdentifier: A string specifying the primary mode of transportation for the routes. This parameter, if set, should be set to `MBDirectionsProfileIdentifierAutomobile`, `MBDirectionsProfileIdentifierAutomobileAvoidingTraffic`, `MBDirectionsProfileIdentifierCycling`, or `MBDirectionsProfileIdentifierWalking`. `MBDirectionsProfileIdentifierAutomobile` is used by default. */ - @objc public init(waypoints: [Waypoint], profileIdentifier: MBDirectionsProfileIdentifier? = nil) { + public init(waypoints: [Waypoint], profileIdentifier: DirectionsProfileIdentifier? = nil) { assert(waypoints.count >= 2, "A route requires at least a source and destination.") assert(waypoints.count <= 25, "A route may not have more than 25 waypoints.") self.waypoints = waypoints self.profileIdentifier = profileIdentifier ?? .automobile - self.allowsUTurnAtWaypoint = ![MBDirectionsProfileIdentifier.automobile.rawValue, MBDirectionsProfileIdentifier.automobileAvoidingTraffic.rawValue].contains(self.profileIdentifier.rawValue) + self.allowsUTurnAtWaypoint = ![DirectionsProfileIdentifier.automobile.rawValue, DirectionsProfileIdentifier.automobileAvoidingTraffic.rawValue].contains(self.profileIdentifier.rawValue) } /** @@ -175,7 +30,7 @@ open class RouteOptions: NSObject, Codable, NSCopying { - parameter locations: An array of `CLLocation` objects representing locations that the route should visit in chronological order. The array should contain at least two locations (the source and destination) and at most 25 locations. Each location object is converted into a `Waypoint` object. This class respects the `CLLocation` class’s `coordinate` and `horizontalAccuracy` properties, converting them into the `Waypoint` class’s `coordinate` and `coordinateAccuracy` properties, respectively. - parameter profileIdentifier: A string specifying the primary mode of transportation for the routes. This parameter, if set, should be set to `MBDirectionsProfileIdentifierAutomobile`, `MBDirectionsProfileIdentifierAutomobileAvoidingTraffic`, `MBDirectionsProfileIdentifierCycling`, or `MBDirectionsProfileIdentifierWalking`. `MBDirectionsProfileIdentifierAutomobile` is used by default. */ - @objc public convenience init(locations: [CLLocation], profileIdentifier: MBDirectionsProfileIdentifier? = nil) { + public convenience init(locations: [CLLocation], profileIdentifier: DirectionsProfileIdentifier? = nil) { let waypoints = locations.map { Waypoint(location: $0) } self.init(waypoints: waypoints, profileIdentifier: profileIdentifier) } @@ -186,75 +41,49 @@ open class RouteOptions: NSObject, Codable, NSCopying { - parameter coordinates: An array of geographic coordinates representing locations that the route should visit in chronological order. The array should contain at least two locations (the source and destination) and at most 25 locations. Each coordinate is converted into a `Waypoint` object. - parameter profileIdentifier: A string specifying the primary mode of transportation for the routes. This parameter, if set, should be set to `MBDirectionsProfileIdentifierAutomobile`, `MBDirectionsProfileIdentifierAutomobileAvoidingTraffic`, `MBDirectionsProfileIdentifierCycling`, or `MBDirectionsProfileIdentifierWalking`. `MBDirectionsProfileIdentifierAutomobile` is used by default. */ - @objc public convenience init(coordinates: [CLLocationCoordinate2D], profileIdentifier: MBDirectionsProfileIdentifier? = nil) { + public convenience init(coordinates: [CLLocationCoordinate2D], profileIdentifier: DirectionsProfileIdentifier? = nil) { let waypoints = coordinates.map { Waypoint(coordinate: $0) } self.init(waypoints: waypoints, profileIdentifier: profileIdentifier) } private enum CodingKeys: String, CodingKey { - case waypoints case allowsUTurnAtWaypoint - case profileIdentifier case includesAlternativeRoutes - case includesSteps - case shapeFormat - case routeShapeResolution - case attributeOptions + // case includesSteps + // case shapeFormat + //case routeShapeResolution + // case attributeOptions case includesExitRoundaboutManeuver - case locale - case includesSpokenInstructions - case distanceMeasurementSystem - case includesVisualInstructions + // case locale + // case includesSpokenInstructions + //case distanceMeasurementSystem + //case includesVisualInstructions case roadClassesToAvoid } - public func encode(to encoder: Encoder) throws { + public override func encode(to encoder: Encoder) throws { + try super.encode(to: encoder) var container = encoder.container(keyedBy: CodingKeys.self) - try container.encode(waypoints, forKey: .waypoints) try container.encode(allowsUTurnAtWaypoint, forKey: .allowsUTurnAtWaypoint) - try container.encode(profileIdentifier.rawValue, forKey: .profileIdentifier) try container.encode(includesAlternativeRoutes, forKey: .includesAlternativeRoutes) - try container.encode(includesSteps, forKey: .includesSteps) - try container.encode(shapeFormat.rawValue, forKey: .shapeFormat) - try container.encode(routeShapeResolution.rawValue, forKey: .routeShapeResolution) - try container.encode(attributeOptions.rawValue, forKey: .attributeOptions) try container.encode(includesExitRoundaboutManeuver, forKey: .includesExitRoundaboutManeuver) - try container.encode(locale, forKey: .locale) - try container.encode(includesSpokenInstructions, forKey: .includesSpokenInstructions) - try container.encode(distanceMeasurementSystem.rawValue, forKey: .distanceMeasurementSystem) - try container.encode(includesVisualInstructions, forKey: .includesVisualInstructions) try container.encode(roadClassesToAvoid, forKey: .roadClassesToAvoid) } public required init(from decoder: Decoder) throws { + try super.init(from: decoder) let container = try decoder.container(keyedBy: CodingKeys.self) - waypoints = try container.decode([Waypoint].self, forKey: .waypoints) allowsUTurnAtWaypoint = try container.decode(Bool.self, forKey: .allowsUTurnAtWaypoint) - profileIdentifier = MBDirectionsProfileIdentifier(rawValue: try container.decode(String.self, forKey: .profileIdentifier)) + includesAlternativeRoutes = try container.decode(Bool.self, forKey: .includesAlternativeRoutes) - includesSteps = try container.decode(Bool.self, forKey: .includesSteps) - shapeFormat = RouteShapeFormat(rawValue: try container.decode(UInt.self, forKey: .shapeFormat))! - routeShapeResolution = RouteShapeResolution(rawValue: try container.decode(UInt.self, forKey: .routeShapeResolution))! - attributeOptions = AttributeOptions(rawValue: try container.decode(UInt.self, forKey: .attributeOptions)) + includesExitRoundaboutManeuver = try container.decode(Bool.self, forKey: .includesExitRoundaboutManeuver) - locale = try container.decode(Locale.self, forKey: .locale) - includesSpokenInstructions = try container.decode(Bool.self, forKey: .includesSpokenInstructions) - distanceMeasurementSystem = MeasurementSystem(rawValue: try container.decode(UInt.self, forKey: .distanceMeasurementSystem))! - includesVisualInstructions = try container.decode(Bool.self, forKey: .includesVisualInstructions) + roadClassesToAvoid = try container.decode(RoadClasses.self, forKey: .roadClassesToAvoid) } // MARK: Specifying the Path of the Route - /** - An array of `Waypoint` objects representing locations that the route should visit in chronological order. - - A waypoint object indicates a location to visit, as well as an optional heading from which to approach the location. - - The array should contain at least two waypoints (the source and destination) and at most 25 waypoints. - */ - @objc open var waypoints: [Waypoint] - /** A Boolean value that indicates whether a returned route may require a point U-turn at an intermediate waypoint. @@ -264,16 +93,8 @@ open class RouteOptions: NSObject, Codable, NSCopying { The default value of this property is `false` when the profile identifier is `MBDirectionsProfileIdentifierAutomobile` or `MBDirectionsProfileIdentifierAutomobileAvoidingTraffic` and `true` otherwise. */ - @objc open var allowsUTurnAtWaypoint: Bool - - // MARK: Specifying Transportation Options + open var allowsUTurnAtWaypoint: Bool - /** - A string specifying the primary mode of transportation for the routes. - - This property should be set to `MBDirectionsProfileIdentifierAutomobile`, `MBDirectionsProfileIdentifierAutomobileAvoidingTraffic`, `MBDirectionsProfileIdentifierCycling`, or `MBDirectionsProfileIdentifierWalking`. The default value of this property is `MBDirectionsProfileIdentifierAutomobile`, which specifies driving directions. - */ - @objc open var profileIdentifier: MBDirectionsProfileIdentifier // MARK: Specifying the Response Format @@ -286,115 +107,23 @@ open class RouteOptions: NSObject, Codable, NSCopying { The default value of this property is `false`. */ - @objc open var includesAlternativeRoutes = false - - /** - A Boolean value indicating whether `MBRouteStep` objects should be included in the response. - - If the value of this property is `true`, the returned route contains turn-by-turn instructions. Each returned `MBRoute` object contains one or more `MBRouteLeg` object that in turn contains one or more `MBRouteStep` objects. On the other hand, if the value of this property is `false`, the `MBRouteLeg` objects contain no `MBRouteStep` objects. - - If you only want to know the distance or estimated travel time to a destination, set this property to `false` to minimize the size of the response and the time it takes to calculate the response. If you need to display turn-by-turn instructions, set this property to `true`. - - The default value of this property is `false`. - */ - @objc open var includesSteps = false - - /** - Format of the data from which the shapes of the returned route and its steps are derived. - - This property has no effect on the returned shape objects, although the choice of format can significantly affect the size of the underlying HTTP response. + open var includesAlternativeRoutes = false - The default value of this property is `polyline`. - */ - @objc open var shapeFormat = RouteShapeFormat.polyline - - /** - Resolution of the shape of the returned route. - - This property has no effect on the shape of the returned route’s steps. - - The default value of this property is `low`, specifying a low-resolution route shape. - */ - @objc open var routeShapeResolution = RouteShapeResolution.low - - /** - AttributeOptions for the route. Any combination of `AttributeOptions` can be specified. - - By default, no attribute options are specified. It is recommended that `routeShapeResolution` be set to `.full`. - */ - @objc open var attributeOptions: AttributeOptions = [] - - // MARK: Constructing the Request URL - - /** - The path of the request URL, not including the hostname or any parameters. - */ - internal var path: String { - assert(!queries.isEmpty, "No query") - - let queryComponent = queries.joined(separator: ";") - return "directions/v5/\(profileIdentifier.rawValue)/\(queryComponent).json" - } - - /** - An array of directions query strings to include in the request URL. - */ - internal var queries: [String] { - return waypoints.map { "\($0.coordinate.longitude),\($0.coordinate.latitude)" } - } /** A Boolean value indicating whether the route includes a `ManeuverType.exitRoundabout` or `ManeuverType.exitRotary` step when traversing a roundabout or rotary, respectively. If this option is set to `true`, a route that traverses a roundabout includes both a `ManeuverType.takeRoundabout` step and a `ManeuverType.exitRoundabout` step; likewise, a route that traverses a large, named roundabout includes both a `ManeuverType.takeRotary` step and a `ManeuverType.exitRotary` step. Otherwise, it only includes a `ManeuverType.takeRoundabout` or `ManeuverType.takeRotary` step. This option is set to `false` by default. */ - @objc open var includesExitRoundaboutManeuver = false - - /** - The locale in which the route’s instructions are written. - - If you use MapboxDirections.swift with the Mapbox Directions API, this property affects the sentence contained within the `RouteStep.instructions` property, but it does not affect any road names contained in that property or other properties such as `RouteStep.name`. - - The Directions API can provide instructions in [a number of languages](https://www.mapbox.com/api-documentation/#instructions-languages). Set this property to `Bundle.main.preferredLocalizations.first` or `Locale.autoupdatingCurrent` to match the application’s language or the system language, respectively. - - By default, this property is set to the current system locale. - */ - @objc open var locale = Locale.autoupdatingCurrent { - didSet { - self.distanceMeasurementSystem = locale.usesMetric ? .metric : .imperial - } - } - - /** - A Boolean value indicating whether each route step includes an array of `SpokenInstructions`. - - If this option is set to true, the `RouteStep.instructionsSpokenAlongStep` property is set to an array of `SpokenInstructions`. - */ - @objc open var includesSpokenInstructions = false - - /** - The measurement system used in spoken instructions included in route steps. - - If the `includesSpokenInstructions` property is set to `true`, this property determines the units used for measuring the distance remaining until an upcoming maneuver. If the `includesSpokenInstructions` property is set to `false`, this property has no effect. + open var includesExitRoundaboutManeuver = false - You should choose a measurement system appropriate for the current region. You can also allow the user to indicate their preferred measurement system via a setting. - */ - @objc open var distanceMeasurementSystem: MeasurementSystem = Locale.autoupdatingCurrent.usesMetric ? .metric : .imperial - - /** - :nodoc: - If true, each `RouteStep` will contain the property `visualInstructionsAlongStep`. - - `visualInstructionsAlongStep` contains an array of `VisualInstruction` used for visually conveying information about a given `RouteStep`. - */ - @objc open var includesVisualInstructions = false /** The route classes that the calculated routes will avoid. Currently, you can only specify a single road class to avoid. */ - @objc open var roadClassesToAvoid: RoadClasses = [] + open var roadClassesToAvoid: RoadClasses = [] /** An array of URL parameters to include in the request URL. @@ -402,21 +131,21 @@ open class RouteOptions: NSObject, Codable, NSCopying { internal var params: [URLQueryItem] { var params: [URLQueryItem] = [ URLQueryItem(name: "alternatives", value: String(includesAlternativeRoutes)), - URLQueryItem(name: "geometries", value: String(describing: shapeFormat)), - URLQueryItem(name: "overview", value: String(describing: routeShapeResolution)), - URLQueryItem(name: "steps", value: String(includesSteps)), +// URLQueryItem(name: "geometries", value: String(describing: shapeFormat)), +// URLQueryItem(name: "overview", value: String(describing: routeShapeResolution)), +// URLQueryItem(name: "steps", value: String(includesSteps)), URLQueryItem(name: "continue_straight", value: String(!allowsUTurnAtWaypoint)), - URLQueryItem(name: "language", value: locale.identifier) +// URLQueryItem(name: "language", value: locale.identifier) ] if includesExitRoundaboutManeuver { params.append(URLQueryItem(name: "roundabout_exits", value: String(includesExitRoundaboutManeuver))) } - if includesSpokenInstructions { - params.append(URLQueryItem(name: "voice_instructions", value: String(includesSpokenInstructions))) - params.append(URLQueryItem(name: "voice_units", value: String(describing: distanceMeasurementSystem))) - } +// if includesSpokenInstructions { +// params.append(URLQueryItem(name: "voice_instructions", value: String(includesSpokenInstructions))) +// params.append(URLQueryItem(name: "voice_units", value: String(describing: distanceMeasurementSystem))) +// } if includesVisualInstructions { params.append(URLQueryItem(name: "banner_instructions", value: String(includesVisualInstructions))) @@ -432,59 +161,59 @@ open class RouteOptions: NSObject, Codable, NSCopying { } } - // Include headings and heading accuracies if any waypoint has a nonnegative heading. - if !waypoints.filter({ $0.heading >= 0 }).isEmpty { - let headings = waypoints.map { $0.headingDescription }.joined(separator: ";") - params.append(URLQueryItem(name: "bearings", value: headings)) - } - - // Include location accuracies if any waypoint has a nonnegative coordinate accuracy. - if !waypoints.filter({ $0.coordinateAccuracy >= 0 }).isEmpty { - let accuracies = waypoints.map { - $0.coordinateAccuracy >= 0 ? String($0.coordinateAccuracy) : "unlimited" - }.joined(separator: ";") - params.append(URLQueryItem(name: "radiuses", value: accuracies)) - } - - if !attributeOptions.isEmpty { - let attributesStrings = String(describing:attributeOptions) - - params.append(URLQueryItem(name: "annotations", value: attributesStrings)) - } +// // Include headings and heading accuracies if any waypoint has a nonnegative heading. +// if !waypoints.filter({ $0.heading >= 0 }).isEmpty { +// let headings = waypoints.map { $0.headingDescription }.joined(separator: ";") +// params.append(URLQueryItem(name: "bearings", value: headings)) +// } + +// // Include location accuracies if any waypoint has a nonnegative coordinate accuracy. +// if !waypoints.filter({ $0.coordinateAccuracy >= 0 }).isEmpty { +// let accuracies = waypoints.map { +// $0.coordinateAccuracy >= 0 ? String($0.coordinateAccuracy) : "unlimited" +// }.joined(separator: ";") +// params.append(URLQueryItem(name: "radiuses", value: accuracies)) +// } +// +// if !attributeOptions.isEmpty { +// let attributesStrings = String(describing:attributeOptions) +// +// params.append(URLQueryItem(name: "annotations", value: attributesStrings)) +// } return params } - // MARK: NSCopying - public func copy(with zone: NSZone? = nil) -> Any { - let data = try! JSONEncoder().encode(self) - return try! JSONDecoder().decode(RouteOptions.self, from: data) - } - - //MARK: - OBJ-C Equality - open override func isEqual(_ object: Any?) -> Bool { - guard let opts = object as? RouteOptions else { return false } - return isEqual(to: opts) - } - - @objc(isEqualToRouteOptions:) - open func isEqual(to routeOptions: RouteOptions?) -> Bool { - guard let other = routeOptions else { return false } - guard waypoints == other.waypoints, - profileIdentifier == other.profileIdentifier, - allowsUTurnAtWaypoint == other.allowsUTurnAtWaypoint, - includesSteps == other.includesSteps, - shapeFormat == other.shapeFormat, - routeShapeResolution == other.routeShapeResolution, - attributeOptions == other.attributeOptions, - includesExitRoundaboutManeuver == other.includesExitRoundaboutManeuver, - locale == other.locale, - includesSpokenInstructions == other.includesSpokenInstructions, - includesVisualInstructions == other.includesVisualInstructions, - roadClassesToAvoid == other.roadClassesToAvoid, - distanceMeasurementSystem == other.distanceMeasurementSystem else { return false } - return true - } +// // MARK: NSCopying +// public func copy(with zone: NSZone? = nil) -> Any { +// let data = try! JSONEncoder().encode(self) +// return try! JSONDecoder().decode(RouteOptions.self, from: data) +// } +// +// //MARK: - OBJ-C Equality +// open override func isEqual(_ object: Any?) -> Bool { +// guard let opts = object as? RouteOptions else { return false } +// return isEqual(to: opts) +// } +// +// @objc(isEqualToRouteOptions:) +// open func isEqual(to routeOptions: RouteOptions?) -> Bool { +// guard let other = routeOptions else { return false } +// guard waypoints == other.waypoints, +// profileIdentifier == other.profileIdentifier, +// allowsUTurnAtWaypoint == other.allowsUTurnAtWaypoint, +// includesSteps == other.includesSteps, +// shapeFormat == other.shapeFormat, +// routeShapeResolution == other.routeShapeResolution, +// attributeOptions == other.attributeOptions, +// includesExitRoundaboutManeuver == other.includesExitRoundaboutManeuver, +// locale == other.locale, +// includesSpokenInstructions == other.includesSpokenInstructions, +// includesVisualInstructions == other.includesVisualInstructions, +// roadClassesToAvoid == other.roadClassesToAvoid, +// distanceMeasurementSystem == other.distanceMeasurementSystem else { return false } +// return true +// } } // MARK: Support for Directions API v4 @@ -492,8 +221,7 @@ open class RouteOptions: NSObject, Codable, NSCopying { /** A `RouteShapeFormat` indicates the format of a route’s shape in the raw HTTP response. */ -@objc(MBInstructionFormat) -public enum InstructionFormat: UInt, CustomStringConvertible { +public enum InstructionFormat: String { /** The route steps’ instructions are delivered in plain text format. */ @@ -504,78 +232,5 @@ public enum InstructionFormat: UInt, CustomStringConvertible { Key phrases are boldfaced. */ case html - - public init?(description: String) { - let format: InstructionFormat - switch description { - case "text": - format = .text - case "html": - format = .html - default: - return nil - } - self.init(rawValue: format.rawValue) - } - - public var description: String { - switch self { - case .text: - return "text" - case .html: - return "html" - } - } } -/** - A `RouteOptionsV4` object is a structure that specifies the criteria for results returned by the Mapbox Directions API v4. - - Pass an instance of this class into the `Directions.calculate(_:completionHandler:)` method. - */ -@objc(MBRouteOptionsV4) -open class RouteOptionsV4: RouteOptions { - // MARK: Specifying the Response Format - - /** - The format of the returned route steps’ instructions. - - By default, the value of this property is `text`, specifying plain text instructions. - */ - @objc open var instructionFormat: InstructionFormat = .text - - /** - A Boolean value indicating whether the returned routes and their route steps should include any geographic coordinate data. - - If the value of this property is `true`, the returned routes and their route steps include coordinates; if the value of this property is `false, they do not. - - The default value of this property is `true`. - */ - @objc open var includesShapes: Bool = true - - override var path: String { - assert(!queries.isEmpty, "No query") - - let profileIdentifier = self.profileIdentifier.rawValue.replacingOccurrences(of: "/", with: ".") - let queryComponent = queries.joined(separator: ";") - return "v4/directions/\(profileIdentifier)/\(queryComponent).json" - } - - override var params: [URLQueryItem] { - return [ - URLQueryItem(name: "alternatives", value: String(includesAlternativeRoutes)), - URLQueryItem(name: "instructions", value: String(describing: instructionFormat)), - URLQueryItem(name: "geometry", value: includesShapes ? String(describing: shapeFormat) : String(false)), - URLQueryItem(name: "steps", value: String(includesSteps)), - ] - } -} - -extension Locale { - fileprivate var usesMetric: Bool { - guard let measurementSystem = (self as NSLocale).object(forKey: .measurementSystem) as? String else { - return false - } - return measurementSystem == "Metric" - } -} diff --git a/Sources/MapboxDirections/MBRouteStep.swift b/Sources/MapboxDirections/MBRouteStep.swift index fa481d71a..dfb4a7dcd 100644 --- a/Sources/MapboxDirections/MBRouteStep.swift +++ b/Sources/MapboxDirections/MBRouteStep.swift @@ -1,9 +1,6 @@ import Foundation import CoreLocation import Polyline -#if SWIFT_PACKAGE -import CMapboxDirections -#endif /** @@ -477,51 +474,6 @@ public func MBStringFromManeuverDirection(maneuverDirection: ManeuverDirection) return maneuverDirection.description } -/** - A `DrivingSide` indicates which side of the road cars and traffic flow. - */ - -public enum DrivingSide: Int, CustomStringConvertible { - /** - Indicates driving occurs on the `left` side. - */ - case left - - /** - Indicates driving occurs on the `right` side. - */ - case right - - public init?(description: String) { - var side: DrivingSide - switch description { - case "left": - side = .left - case "right": - side = .right - default: - return nil - } - - self.init(rawValue: side.rawValue) - } - - public var description: String { - switch self { - case .left: - return "left" - case .right: - return "right" - } - } -} - -/** - Returns a string describing the given driving side. - */ -public func MBStringFromDrivingSide(drivingSide: DrivingSide) -> String { - return drivingSide.description -} extension String { internal func tagValues(separatedBy separator: String) -> [String] { diff --git a/Sources/MapboxDirections/MBVisualInstructionBanner.swift b/Sources/MapboxDirections/MBVisualInstructionBanner.swift index fd8148ec2..f2aba6819 100644 --- a/Sources/MapboxDirections/MBVisualInstructionBanner.swift +++ b/Sources/MapboxDirections/MBVisualInstructionBanner.swift @@ -82,7 +82,7 @@ open class VisualInstructionBanner: NSObject, NSSecureCoding { public required init?(coder decoder: NSCoder) { distanceAlongStep = decoder.decodeDouble(forKey: "distanceAlongStep") - if let drivingSideDescription = decoder.decodeObject(of: NSString.self, forKey: "drivingSide") as String?, let drivingSide = DrivingSide(description: drivingSideDescription) { + if let drivingSideDescription = decoder.decodeObject(of: NSString.self, forKey: "drivingSide") as String?, let drivingSide = DrivingSide(rawValue: drivingSideDescription) { self.drivingSide = drivingSide } else { self.drivingSide = .right @@ -103,6 +103,6 @@ open class VisualInstructionBanner: NSObject, NSSecureCoding { coder.encode(primaryInstruction, forKey: "primary") coder.encode(secondaryInstruction, forKey: "secondary") coder.encode(tertiaryInstruction, forKey: "tertiaryInstruction") - coder.encode(drivingSide.description, forKey: "drivingSide") + coder.encode(drivingSide.rawValue, forKey: "drivingSide") } } diff --git a/Sources/MapboxDirections/MBWaypoint.swift b/Sources/MapboxDirections/MBWaypoint.swift index 9437546fb..c443fc257 100644 --- a/Sources/MapboxDirections/MBWaypoint.swift +++ b/Sources/MapboxDirections/MBWaypoint.swift @@ -1,8 +1,8 @@ /** A `Waypoint` object indicates a location along a route. It may be the route’s origin or destination, or it may be another location that the route visits. A waypoint object indicates the location’s geographic location along with other optional information, such as a name or the user’s direction approaching the waypoint. You create a `RouteOptions` object using waypoint objects and also receive waypoint objects in the completion handler of the `Directions.calculate(_:completionHandler:)` method. */ -@objc(MBWaypoint) -open class Waypoint: NSObject, Codable { +public class Waypoint: Codable { + // MARK: Creating a Waypoint Object private enum CodingKeys: String, CodingKey { @@ -11,7 +11,7 @@ open class Waypoint: NSObject, Codable { case name } - public required init(from decoder: Decoder) throws { + required public init(from decoder: Decoder) throws { let container = try decoder.container(keyedBy: CodingKeys.self) coordinate = try container.decode(CLLocationCoordinate2D.self, forKey: .coordinate) coordinateAccuracy = try container.decodeIfPresent(CLLocationAccuracy.self, forKey: .coordinateAccuracy) ?? -1 @@ -33,7 +33,7 @@ open class Waypoint: NSObject, Codable { It is recommended that the value of this parameter be greater than the `horizontalAccuracy` property of a `CLLocation` object obtained from a `CLLocationManager` object. There is a high likelihood that the user may be located some distance away from a navigable road, for instance if the user is currently on a driveway or inside a building. - parameter name: The name of the waypoint. This parameter does not affect the route but may help you to distinguish one waypoint from another. */ - @objc public init(coordinate: CLLocationCoordinate2D, coordinateAccuracy: CLLocationAccuracy = -1, name: String? = nil) { + public init(coordinate: CLLocationCoordinate2D, coordinateAccuracy: CLLocationAccuracy = -1, name: String? = nil) { self.coordinate = coordinate self.coordinateAccuracy = coordinateAccuracy self.name = name @@ -67,7 +67,7 @@ open class Waypoint: NSObject, Codable { - parameter heading: A `CLHeading` object representing the direction from which the route must approach the waypoint in order to be considered viable. This initializer respects the `CLHeading` class’s `trueHeading` property or `magneticHeading` property, converting it into the `headingAccuracy` property. - parameter name: The name of the waypoint. This parameter does not affect the route but may help you to distinguish one waypoint from another. */ - @objc public init(location: CLLocation, heading: CLHeading? = nil, name: String? = nil) { + public init(location: CLLocation, heading: CLHeading? = nil, name: String? = nil) { coordinate = location.coordinate coordinateAccuracy = location.horizontalAccuracy if let heading = heading { @@ -77,8 +77,8 @@ open class Waypoint: NSObject, Codable { } #endif - open func copy(with zone: NSZone?) -> Any { - let copy = Waypoint(coordinate: coordinate, coordinateAccuracy: coordinateAccuracy, name: name) + public func copy(with zone: NSZone?) -> Any { + var copy = Waypoint(coordinate: coordinate, coordinateAccuracy: coordinateAccuracy, name: name) copy.heading = heading copy.headingAccuracy = headingAccuracy return copy @@ -89,7 +89,7 @@ open class Waypoint: NSObject, Codable { /** The geographic coordinate of the waypoint. */ - @objc open let coordinate: CLLocationCoordinate2D + public let coordinate: CLLocationCoordinate2D /** The radius of uncertainty for the waypoint, measured in meters. @@ -98,7 +98,7 @@ open class Waypoint: NSObject, Codable { By default, the value of this property is a negative number. */ - @objc open var coordinateAccuracy: CLLocationAccuracy = -1 + public var coordinateAccuracy: CLLocationAccuracy = -1 // MARK: Getting the Direction of Approach @@ -115,7 +115,7 @@ open class Waypoint: NSObject, Codable { By default, the value of this property is a negative number, meaning that a route is considered viable regardless of the direction of approach. */ - @objc open var heading: CLLocationDirection = -1 + public var heading: CLLocationDirection = -1 /** The maximum amount, in degrees, by which a route’s approach to a waypoint may differ from `heading` in either direction in order to be considered viable. @@ -126,22 +126,40 @@ open class Waypoint: NSObject, Codable { By default, the value of this property is a negative number, meaning that a route is considered viable regardless of the direction of approach. */ - @objc open var headingAccuracy: CLLocationDirection = -1 + public var headingAccuracy: CLLocationDirection = -1 internal var headingDescription: String { return heading >= 0 && headingAccuracy >= 0 ? "\(heading.truncatingRemainder(dividingBy: 360)),\(min(headingAccuracy, 180))" : "" } - // MARK: Getting the Waypoint’s Name + /** + A boolean value indicating whether arriving on opposite side is allowed. + This property has no effect if `DirectionsOptions.includesSteps` is set to `false`. + This property corresponds to the [`approaches`](https://www.mapbox.com/api-documentation/navigation/#retrieve-directions) query parameter in the Mapbox Directions and Map Matching APIs. + */ + @objc open var allowsArrivingOnOppositeSide = true + + // MARK: Identifying the Waypoint /** The name of the waypoint. This parameter does not affect the route, but you can set the name of a waypoint you pass into a `RouteOptions` object to help you distinguish one waypoint from another in the array of waypoints passed into the completion handler of the `Directions.calculate(_:completionHandler:)` method. */ - @objc open var name: String? + public var name: String? - @objc open override var description: String { + /** + A Boolean value indicating whether the waypoint is significant enough to appear in the resulting routes as a waypoint separating two legs, along with corresponding guidance instructions. + + By default, this property is set to `true`, which means that each resulting route will include a leg that ends by arriving at the waypoint as `RouteLeg.destination` and a subsequent leg that begins by departing from the waypoint as `RouteLeg.source`. Otherwise, if this property is set to `false`, a single leg passes through the waypoint without specifically mentioning it. Regardless of the value of this property, each resulting route passes through the location specified by the `coordinate` property, accounting for approach-related properties such as `heading`. + + With the Mapbox Directions API, set this property to `false` if you want the waypoint’s location to influence the path that the route follows without attaching any meaning to the waypoint object itself. With the Mapbox Map Matching API, use this property when the `DirectionsOptions.includesSteps` property is `true` or when `coordinates` represents a trace with a high sample rate. + This property has no effect if `DirectionsOptions.includesSteps` is set to `false`, or if `MatchOptions.waypointIndices` is non-nil. + This property corresponds to the [`approaches`](https://docs.mapbox.com/api/navigation/#retrieve-directions) query parameter in the Mapbox Directions and Map Matching APIs. + */ + public var separatesLegs: Bool = true + + public var description: String { return name ?? "" } @@ -149,8 +167,14 @@ open class Waypoint: NSObject, Codable { return CLLocation(coordinate: coordinate, altitude: 0, horizontalAccuracy: coordinateAccuracy, verticalAccuracy: -1, course: heading, speed: -1, timestamp: Date()) } - open override func isEqual(_ object: Any?) -> Bool { - guard let other = object as? Waypoint else { return false} - return self.coordinate == other.coordinate && self.name == other.name && self.coordinateAccuracy == other.coordinateAccuracy +// public func isEqual(_ object: Any?) -> Bool { +// guard let other = object as? Waypoint else { return false } +// return self.coordinate == other.coordinate && self.name == other.name && self.coordinateAccuracy == other.coordinateAccuracy +// } +} + +extension Waypoint: Equatable { + public static func == (lhs: Waypoint, rhs: Waypoint) -> Bool { + return lhs.coordinate == rhs.coordinate && lhs.name == rhs.name && lhs.coordinateAccuracy == rhs.coordinateAccuracy } } diff --git a/Sources/MapboxDirections/Match/MBMatchOptions.swift b/Sources/MapboxDirections/Match/MBMatchOptions.swift index 7487b6e27..2a4451b96 100644 --- a/Sources/MapboxDirections/Match/MBMatchOptions.swift +++ b/Sources/MapboxDirections/Match/MBMatchOptions.swift @@ -1,8 +1,5 @@ import Foundation import CoreLocation -#if SWIFT_PACKAGE -import CMapboxDirections -#endif /** diff --git a/Sources/MapboxDirections/Match/MBTracepoint.swift b/Sources/MapboxDirections/Match/MBTracepoint.swift index 090a0cffa..1899c45b8 100644 --- a/Sources/MapboxDirections/Match/MBTracepoint.swift +++ b/Sources/MapboxDirections/Match/MBTracepoint.swift @@ -13,34 +13,40 @@ public class Tracepoint: Waypoint { */ open var alternateCount: Int = NSNotFound + private enum CodingKeys: String, CodingKey { + case alternateCount + } + init(coordinate: CLLocationCoordinate2D, alternateCount: Int?, name: String?) { self.alternateCount = alternateCount ?? NSNotFound super.init(coordinate: coordinate, name: name) } + - public required init?(coder decoder: NSCoder) { - alternateCount = decoder.decodeInteger(forKey: "alternateCount") - super.init(coder: decoder) - } - - public override func encode(with coder: NSCoder) { - coder.encode(alternateCount, forKey: "alternateCount") - } - - override public class var supportsSecureCoding: Bool { - return true - } - - // MARK: Objective-C equality - open override func isEqual(_ object: Any?) -> Bool { - guard let opts = object as? Tracepoint else { return false } - return isEqual(to: opts) + required public init(from decoder: Decoder) throws { + try super.init(from: decoder) + let container = try decoder.container(keyedBy: CodingKeys.self) + alternateCount = try container.decode(Int.self, forKey: .alternateCount) } + - - open func isEqual(to other: Tracepoint?) -> Bool { - guard let other = other else { return false } - return super.isEqual(to: other) && type(of: self) == type(of: other) && - alternateCount == other.alternateCount +// // MARK: Objective-C equality +// open override func isEqual(_ object: Any?) -> Bool { +// guard let opts = object as? Tracepoint else { return false } +// return isEqual(to: opts) +// } +// +// +// open func isEqual(to other: Tracepoint?) -> Bool { +// guard let other = other else { return false } +// return super.isEqual(to: other) && type(of: self) == type(of: other) && +// alternateCount == other.alternateCount +// } +} + +extension Tracepoint { //Equatable + public static func ==(lhs: Tracepoint, rhs: Tracepoint) -> Bool { + let superEquals = (lhs as Waypoint == rhs as Waypoint) + return superEquals && lhs.alternateCount == rhs.alternateCount } } diff --git a/Sources/MapboxDirections/RoadClasses.swift b/Sources/MapboxDirections/RoadClasses.swift index de439871d..cc90ee44a 100644 --- a/Sources/MapboxDirections/RoadClasses.swift +++ b/Sources/MapboxDirections/RoadClasses.swift @@ -1,19 +1,27 @@ import Foundation -#if SWIFT_PACKAGE -import CMapboxDirections -#endif /** Option set that contains attributes of a road segment. */ -public struct RoadClasses: OptionSet, CustomStringConvertible { +public struct RoadClasses: OptionSet, Codable, CustomStringConvertible { public var rawValue: Int public init(rawValue: Int) { self.rawValue = rawValue } + public func encode(to encoder: Encoder) throws { + var container = encoder.singleValueContainer() + try container.encode(description.components(separatedBy: ",")) + } + + public init(from decoder: Decoder) throws { + let container = try decoder.singleValueContainer() + let descriptions = try container.decode([String].self) + self = RoadClasses(descriptions: descriptions)! + } + public typealias RawValue = Int From a825113b512bee2def720deee12ec5734f28844e Mon Sep 17 00:00:00 2001 From: Jerrad Thramer Date: Tue, 8 Oct 2019 16:14:40 -0600 Subject: [PATCH 05/89] WIP: DirectionsResult and RouteLeg converted. --- .../MapboxDirections/MBDirectionsResult.swift | 367 ++++++++---------- Sources/MapboxDirections/MBRouteLeg.swift | 256 ++++++------ Sources/MapboxDirections/MBRouteOptions.swift | 2 +- Sources/MapboxDirections/MBRouteStep.swift | 14 - 4 files changed, 312 insertions(+), 327 deletions(-) diff --git a/Sources/MapboxDirections/MBDirectionsResult.swift b/Sources/MapboxDirections/MBDirectionsResult.swift index 9007cf99c..ca16e7de3 100644 --- a/Sources/MapboxDirections/MBDirectionsResult.swift +++ b/Sources/MapboxDirections/MBDirectionsResult.swift @@ -1,205 +1,168 @@ -//import Foundation -//import Polyline -//import CoreLocation -// -// -///** -// A `DirectionsResult` represents a result returned from either the Mapbox Directions service. -// -// You do not create instances of this class directly. Instead, you receive `Route` or `Match` objects when you request directions using the `Directions.calculate(_:completionHandler:)` or `Directions.calculateRoutes(matching:completionHandler:)` method. -// */ -// -//open class DirectionsResult: NSObject, NSSecureCoding { -// -// public var json: [String: Any]? -// -// internal init(json: [String: Any]? = nil, legs: [RouteLeg], distance: CLLocationDistance, expectedTravelTime: TimeInterval, coordinates: [CLLocationCoordinate2D]?, speechLocale: Locale?, options: DirectionsOptions) { -// self.json = json -// self.directionsOptions = options -// self.legs = legs -// self.distance = distance -// self.expectedTravelTime = expectedTravelTime -// self.coordinates = coordinates -// self.speechLocale = speechLocale -// } -// -// public required init?(coder decoder: NSCoder) { -// accessToken = decoder.decodeObject(of: NSString.self, forKey: "accessToken") as String? -// apiEndpoint = decoder.decodeObject(of: NSURL.self, forKey: "apiEndpoint") as URL? -// -// let coordinateDictionaries = decoder.decodeObject(of: [NSArray.self, NSDictionary.self, NSString.self, NSNumber.self], forKey: "coordinates") as? [[String: CLLocationDegrees]] -// coordinates = coordinateDictionaries?.compactMap({ (coordinateDictionary) -> CLLocationCoordinate2D? in -// if let latitude = coordinateDictionary["latitude"], -// let longitude = coordinateDictionary["longitude"] { -// return CLLocationCoordinate2D(latitude: latitude, longitude: longitude) -// } else { -// return nil -// } -// }) -// -// legs = decoder.decodeObject(of: [NSArray.self, RouteLeg.self], forKey: "legs") as? [RouteLeg] ?? [] -// distance = decoder.decodeDouble(forKey: "distance") -// expectedTravelTime = decoder.decodeDouble(forKey: "expectedTravelTime") -// -// guard let options = decoder.decodeObject(of: [DirectionsOptions.self], forKey: "directionsOptions") as? DirectionsOptions else { -// return nil -// } -// directionsOptions = options -// -// routeIdentifier = decoder.decodeObject(of: NSString.self, forKey: "routeIdentifier") as String? -// -// speechLocale = decoder.decodeObject(of: NSLocale.self, forKey: "speechLocale") as Locale? -// } -// -// public class var supportsSecureCoding: Bool { -// return true -// } -// -// public func encode(with coder: NSCoder) { -// coder.encode(accessToken, forKey: "accessToken") -// coder.encode(apiEndpoint, forKey: "apiEndpoint") -// -// let coordinateDictionaries = coordinates?.map { [ -// "latitude": $0.latitude, -// "longitude": $0.longitude, -// ] } -// coder.encode(coordinateDictionaries, forKey: "coordinates") -// -// coder.encode(legs, forKey: "legs") -// coder.encode(distance, forKey: "distance") -// coder.encode(expectedTravelTime, forKey: "expectedTravelTime") -// coder.encode(directionsOptions, forKey: "directionsOptions") -// coder.encode(routeIdentifier, forKey: "routeIdentifier") -// coder.encode(speechLocale, forKey: "speechLocale") -// } -// -// /** -// An array of geographic coordinates defining the path of the route from start to finish. -// -// This array may be `nil` or simplified depending on the `routeShapeResolution` property of the original `RouteOptions` object. -// -// Using the [Mapbox Maps SDK for iOS](https://docs.mapbox.com/ios/maps/) or [Mapbox Maps SDK for macOS](https://mapbox.github.io/mapbox-gl-native/macos/), you can create an `MGLPolyline` object using these coordinates to display an overview of the route on an `MGLMapView`. -// */ -// public let coordinates: [CLLocationCoordinate2D]? -// -// /** -// The number of coordinates. -// -// The value of this property may be zero or reduced depending on the `routeShapeResolution` property of the original `RouteOptions` object. -// -// - note: This initializer is intended for Objective-C usage. In Swift code, use the `coordinates.count` property. -// */ -// open var coordinateCount: UInt { -// return UInt(coordinates?.count ?? 0) -// } -// -// /** -// Retrieves the coordinates. -// -// The array may be empty or simplified depending on the `routeShapeResolution` property of the original `RouteOptions` object. -// -// Using the [Mapbox Maps SDK for iOS](https://docs.mapbox.com/ios/maps/) or [Mapbox Maps SDK for macOS](https://mapbox.github.io/mapbox-gl-native/macos/), you can create an `MGLPolyline` object using these coordinates to display an overview of the route on an `MGLMapView`. -// -// - parameter coordinates: A pointer to a C array of `CLLocationCoordinate2D` instances. On output, this array contains all the vertices of the overlay. -// -// - precondition: `coordinates` must be large enough to hold `coordinateCount` instances of `CLLocationCoordinate2D`. -// -// - note: This initializer is intended for Objective-C usage. In Swift code, use the `coordinates` property. -// */ -// open func getCoordinates(_ coordinates: UnsafeMutablePointer) { -// for i in 0..<(self.coordinates?.count ?? 0) { -// coordinates.advanced(by: i).pointee = self.coordinates![i] -// } -// } -// -// /** -// An array of `RouteLeg` objects representing the legs of the route. -// -// The number of legs in this array depends on the number of waypoints. A route with two waypoints (the source and destination) has one leg, a route with three waypoints (the source, an intermediate waypoint, and the destination) has two legs, and so on. -// -// To determine the name of the route, concatenate the names of the route’s legs. -// */ -// public let legs: [RouteLeg] -// +import Foundation +import Polyline +import CoreLocation + + + +//protocol DirectionsResult: Codable { +// var coordinates: [CLLocationCoordinate2D] { get } +// var legs: [RouteLeg] { get } +// var distance: CLLocationDistance { get } +// var expectedTravelTime: TimeInterval { get } +// var options: DirectionsOptions +//} + +/** + A `DirectionsResult` represents a result returned from either the Mapbox Directions service. + + You do not create instances of this class directly. Instead, you receive `Route` or `Match` objects when you request directions using the `Directions.calculate(_:completionHandler:)` or `Directions.calculateRoutes(matching:completionHandler:)` method. + */ + +open class DirectionsResult: Codable { + + private enum CodingKeys: String, CodingKey { + case coordinates + case legs + case distance + case expectedTravelTime + case directionsOptions + case accessToken + case apiEndpoint + case routeIdentifier + case speechLocale + } + + public required init(from decoder: Decoder) throws { + let container = try decoder.container(keyedBy: CodingKeys.self) + coordinates = try container.decodeIfPresent([CLLocationCoordinate2D].self, forKey: .coordinates) +// legs = try container.decode([RouteLeg.self], forKey: .legs) + distance = try container.decode(CLLocationDistance.self, forKey: .distance) + expectedTravelTime = try container.decode(TimeInterval.self, forKey: .expectedTravelTime) + directionsOptions = try container.decode(DirectionsOptions.self, forKey: .directionsOptions) + accessToken = try container.decodeIfPresent(String.self, forKey: .accessToken) + apiEndpoint = try container.decodeIfPresent(URL.self, forKey: .apiEndpoint) + routeIdentifier = try container.decodeIfPresent(String.self, forKey: .routeIdentifier) + speechLocale = try container.decodeIfPresent(Locale.self, forKey: .speechLocale) + } + + public func encode(to encoder: Encoder) throws { + var container = encoder.container(keyedBy: CodingKeys.self) +// try container.encode(legs, forKey: .legs) + try container.encodeIfPresent(coordinates, forKey: .coordinates) + try container.encode(distance, forKey: .distance) + try container.encode(expectedTravelTime, forKey: .expectedTravelTime) + try container.encode(directionsOptions, forKey: .directionsOptions) + try container.encodeIfPresent(accessToken, forKey: .accessToken) + try container.encodeIfPresent(apiEndpoint, forKey: .apiEndpoint) + try container.encodeIfPresent(routeIdentifier, forKey: .routeIdentifier) + try container.encodeIfPresent(speechLocale, forKey: .speechLocale) + + + + + + + + } + + /** + An array of geographic coordinates defining the path of the route from start to finish. + + This array may be `nil` or simplified depending on the `routeShapeResolution` property of the original `RouteOptions` object. + + Using the [Mapbox Maps SDK for iOS](https://docs.mapbox.com/ios/maps/) or [Mapbox Maps SDK for macOS](https://mapbox.github.io/mapbox-gl-native/macos/), you can create an `MGLPolyline` object using these coordinates to display an overview of the route on an `MGLMapView`. + */ + public let coordinates: [CLLocationCoordinate2D]? + + + /** + An array of `RouteLeg` objects representing the legs of the route. + + The number of legs in this array depends on the number of waypoints. A route with two waypoints (the source and destination) has one leg, a route with three waypoints (the source, an intermediate waypoint, and the destination) has two legs, and so on. + + To determine the name of the route, concatenate the names of the route’s legs. + */ + public let legs: [RouteLeg] + // open override var description: String { // return legs.map { $0.name }.joined(separator: " – ") // } -// -// // MARK: Getting Additional Route Details -// -// /** -// The route’s distance, measured in meters. -// -// The value of this property accounts for the distance that the user must travel to traverse the path of the route. It is the sum of the `distance` properties of the route’s legs, not the sum of the direct distances between the route’s waypoints. You should not assume that the user would travel along this distance at a fixed speed. -// */ -// public let distance: CLLocationDistance -// -// /** -// The route’s expected travel time, measured in seconds. -// -// The value of this property reflects the time it takes to traverse the entire route. It is the sum of the `expectedTravelTime` properties of the route’s legs. If the route was calculated using the `MBDirectionsProfileIdentifierAutomobileAvoidingTraffic` profile, this property reflects current traffic conditions at the time of the request, not necessarily the traffic conditions at the time the user would begin the route. For other profiles, this property reflects travel time under ideal conditions and does not account for traffic congestion. If the route makes use of a ferry or train, the actual travel time may additionally be subject to the schedules of those services. -// -// Do not assume that the user would travel along the route at a fixed speed. For more granular travel times, use the `RouteLeg.expectedTravelTime` or `RouteStep.expectedTravelTime`. For even more granularity, specify the `AttributeOptions.expectedTravelTime` option and use the `RouteLeg.expectedSegmentTravelTimes` property. -// */ -// public let expectedTravelTime: TimeInterval -// -// /** -// `RouteOptions` used to create the directions request. -// -// The route options object’s profileIdentifier property reflects the primary mode of transportation used for the route. Individual steps along the route might use different modes of transportation as necessary. -// */ -// public let directionsOptions: DirectionsOptions -// -// /** -// The [access token](https://docs.mapbox.com/help/glossary/access-token/) used to make the directions request. -// -// This property is set automatically if a request is made via `Directions.calculate(_:completionHandler:)`. -// */ -// open var accessToken: String? -// -// /** -// The endpoint used to make the directions request. -// -// This property is set automatically if a request is made via `Directions.calculate(_:completionHandler:)`. -// */ -// open var apiEndpoint: URL? -// -// func debugQuickLookObject() -> Any? { -// if let coordinates = coordinates { -// return debugQuickLookURL(illustrating: coordinates, profileIdentifier: directionsOptions.profileIdentifier) -// } -// return nil -// } -// -// /** -// A unique identifier for a directions request. -// -// Each route produced by a single call to `Directions.calculate(_:completionHandler:)` has the same route identifier. -// */ -// open var routeIdentifier: String? -// -// /** -// The locale to use for spoken instructions. -// -// This locale is specific to Mapbox Voice API. If `nil` is returned, the instruction should be spoken with an alternative speech synthesizer. -// */ -// open var speechLocale: Locale? -// -// /** -// The time immediately before a `Directions` object fetched this result. -// -// If you manually start fetching a task returned by `Directions.url(forCalculating:)`, this property is set to `nil`; use the `URLSessionTaskTransactionMetrics.fetchStartDate` property instead. This property may also be set to `nil` if you create this result from a JSON object or encoded object. -// -// This property does not persist after encoding and decoding. -// */ -// open var fetchStartDate: Date? -// -// /** -// The time immediately before a `Directions` object received the last byte of this result. -// -// If you manually start fetching a task returned by `Directions.url(forCalculating:)`, this property is set to `nil`; use the `URLSessionTaskTransactionMetrics.responseEndDate` property instead. This property may also be set to `nil` if you create this result from a JSON object or encoded object. -// -// This property does not persist after encoding and decoding. -// */ -// open var responseEndDate: Date? -//} + + // MARK: Getting Additional Route Details + + /** + The route’s distance, measured in meters. + + The value of this property accounts for the distance that the user must travel to traverse the path of the route. It is the sum of the `distance` properties of the route’s legs, not the sum of the direct distances between the route’s waypoints. You should not assume that the user would travel along this distance at a fixed speed. + */ + public let distance: CLLocationDistance + + /** + The route’s expected travel time, measured in seconds. + + The value of this property reflects the time it takes to traverse the entire route. It is the sum of the `expectedTravelTime` properties of the route’s legs. If the route was calculated using the `MBDirectionsProfileIdentifierAutomobileAvoidingTraffic` profile, this property reflects current traffic conditions at the time of the request, not necessarily the traffic conditions at the time the user would begin the route. For other profiles, this property reflects travel time under ideal conditions and does not account for traffic congestion. If the route makes use of a ferry or train, the actual travel time may additionally be subject to the schedules of those services. + + Do not assume that the user would travel along the route at a fixed speed. For more granular travel times, use the `RouteLeg.expectedTravelTime` or `RouteStep.expectedTravelTime`. For even more granularity, specify the `AttributeOptions.expectedTravelTime` option and use the `RouteLeg.expectedSegmentTravelTimes` property. + */ + public let expectedTravelTime: TimeInterval + + /** + `RouteOptions` used to create the directions request. + + The route options object’s profileIdentifier property reflects the primary mode of transportation used for the route. Individual steps along the route might use different modes of transportation as necessary. + */ + public let directionsOptions: DirectionsOptions + + /** + The [access token](https://docs.mapbox.com/help/glossary/access-token/) used to make the directions request. + + This property is set automatically if a request is made via `Directions.calculate(_:completionHandler:)`. + */ + open var accessToken: String? + + /** + The endpoint used to make the directions request. + + This property is set automatically if a request is made via `Directions.calculate(_:completionHandler:)`. + */ + open var apiEndpoint: URL? + + func debugQuickLookObject() -> Any? { + if let coordinates = coordinates { + return debugQuickLookURL(illustrating: coordinates, profileIdentifier: directionsOptions.profileIdentifier) + } + return nil + } + + /** + A unique identifier for a directions request. + + Each route produced by a single call to `Directions.calculate(_:completionHandler:)` has the same route identifier. + */ + open var routeIdentifier: String? + + /** + The locale to use for spoken instructions. + + This locale is specific to Mapbox Voice API. If `nil` is returned, the instruction should be spoken with an alternative speech synthesizer. + */ + open var speechLocale: Locale? + + /** + The time immediately before a `Directions` object fetched this result. + + If you manually start fetching a task returned by `Directions.url(forCalculating:)`, this property is set to `nil`; use the `URLSessionTaskTransactionMetrics.fetchStartDate` property instead. This property may also be set to `nil` if you create this result from a JSON object or encoded object. + + This property does not persist after encoding and decoding. + */ + open var fetchStartDate: Date? + + /** + The time immediately before a `Directions` object received the last byte of this result. + + If you manually start fetching a task returned by `Directions.url(forCalculating:)`, this property is set to `nil`; use the `URLSessionTaskTransactionMetrics.responseEndDate` property instead. This property may also be set to `nil` if you create this result from a JSON object or encoded object. + + This property does not persist after encoding and decoding. + */ + open var responseEndDate: Date? +} diff --git a/Sources/MapboxDirections/MBRouteLeg.swift b/Sources/MapboxDirections/MBRouteLeg.swift index 326ce6705..7ee34405d 100644 --- a/Sources/MapboxDirections/MBRouteLeg.swift +++ b/Sources/MapboxDirections/MBRouteLeg.swift @@ -10,112 +10,157 @@ import Polyline */ -open class RouteLeg: NSObject, NSSecureCoding { - - // MARK: Creating a Leg - - internal init(steps: [RouteStep], json: JSONDictionary, source: Waypoint, destination: Waypoint, options: RouteOptions) { - self.source = source - self.destination = destination - self.profileIdentifier = options.profileIdentifier - self.steps = steps - distance = json["distance"] as! Double - expectedTravelTime = json["duration"] as! Double - self.name = json["summary"] as! String - - var segmentDistances: [CLLocationDistance]? - var expectedSegmentTravelTimes: [TimeInterval]? - var segmentSpeeds: [CLLocationSpeed]? - var congestionLevels: [CongestionLevel]? - - if let jsonAttributes = json["annotation"] as? [String: Any] { - if let distance = jsonAttributes["distance"] { - segmentDistances = distance as? [CLLocationDistance] - } - if let duration = jsonAttributes["duration"] { - expectedSegmentTravelTimes = duration as? [TimeInterval] ?? [] - } - if let speed = jsonAttributes["speed"] { - segmentSpeeds = speed as? [CLLocationSpeed] ?? [] - } - if let congestion = jsonAttributes["congestion"] as? [String] { - congestionLevels = congestion.map { - #warning("derail") - return CongestionLevel(rawValue: $0)! - } - } - } - - self.segmentDistances = segmentDistances - self.expectedSegmentTravelTimes = expectedSegmentTravelTimes - self.segmentSpeeds = segmentSpeeds - self.segmentCongestionLevels = congestionLevels +open class RouteLeg: Codable { + + public enum CodingKeys: String, CodingKey { + case source + case destination + case steps + case segmentDistances + case expectedSegmentTravelTimes + case segmentSpeeds + case segmentCongestionLevels + case name + case distance + case expectedTravelTime + case profileIdentifier } - - /** - Initializes a new route leg object with the given JSON dictionary representation and waypoints. - - Normally, you do not create instances of this class directly. Instead, you receive route leg objects as part of route objects when you request directions using the `Directions.calculateDirections(options:completionHandler:)` method. - - - parameter json: A JSON dictionary representation of a route leg object as returnd by the Mapbox Directions API. - - parameter source: The waypoint at the beginning of the leg. - - parameter destination: The waypoint at the end of the leg. - - parameter options: The options used when requesting the route. - */ - public convenience init(json: [String: Any], source: Waypoint, destination: Waypoint, options: RouteOptions) { - let steps = (json["steps"] as? [JSONDictionary] ?? []).map { RouteStep(json: $0, options: options) } - self.init(steps: steps, json: json, source: source, destination: destination, options: options) - } - - public required init?(coder decoder: NSCoder) { - guard let decodedSource = decoder.decodeObject(of: Waypoint.self, forKey: "source") else { - return nil - } - source = decodedSource - - guard let decodedDestination = decoder.decodeObject(of: Waypoint.self, forKey: "destination") else { - return nil - } - destination = decodedDestination - - steps = decoder.decodeObject(of: [NSArray.self, RouteStep.self], forKey: "steps") as? [RouteStep] ?? [] - - guard let decodedName = decoder.decodeObject(of: NSString.self, forKey: "name") as String? else { - return nil - } - name = decodedName - - distance = decoder.decodeDouble(forKey: "distance") - expectedTravelTime = decoder.decodeDouble(forKey: "expectedTravelTime") - - guard let decodedProfileIdentifier = decoder.decodeObject(of: NSString.self, forKey: "profileIdentifier") as String? else { - return nil - } - - profileIdentifier = DirectionsProfileIdentifier(rawValue: decodedProfileIdentifier) - - segmentDistances = decoder.decodeObject(of: [NSArray.self, NSNumber.self], forKey: "segmentDistances") as? [CLLocationDistance] - expectedSegmentTravelTimes = decoder.decodeObject(of: [NSArray.self, NSNumber.self], forKey: "expectedSegmentTravelTimes") as? [TimeInterval] - segmentSpeeds = decoder.decodeObject(of: [NSArray.self, NSNumber.self], forKey: "segmentSpeeds") as? [CLLocationSpeed] - segmentCongestionLevels = decoder.decodeObject(of: [NSArray.self, NSNumber.self], forKey: "segmentCongestionLevels") as? [CongestionLevel] + + public required init(from decoder: Decoder) throws { + var container = try decoder.container(keyedBy: CodingKeys.self) + source = try container.decode(Waypoint.self, forKey: .source) + destination = try container.decode(Waypoint.self, forKey: .destination) + steps = try container.decode([RouteStep].self, forKey: .steps) + segmentDistances = try container.decodeIfPresent([CLLocationDistance].self, forKey: .segmentDistances) + expectedSegmentTravelTimes = try container.decodeIfPresent([TimeInterval].self, forKey: .expectedSegmentTravelTimes) + segmentSpeeds = try container.decodeIfPresent([CLLocationSpeed].self, forKey: .segmentSpeeds) + segmentCongestionLevels = try container.decodeIfPresent([CongestionLevel].self, forKey: .segmentCongestionLevels) + name = try container.decode(String.self, forKey: .name) + distance = container.decode(CLLocationDistance.self, forKey: .distance) + expectedTravelTime = container.decode(TimeInterval.self, forKey: .expectedTravelTime) + profileIdentifier = container.decode(DirectionsProfileIdentifier.self, forKey: .profileIdentifier) } + public func encode(to encoder: Encoder) throws { + var container = encoder.container(keyedBy: CodingKeys.self) + try container.encode(source, forKey: .source) + try container.encode(destination, forKey: .destination) + try container.encode(steps, forKey: .steps) + try container.encodeIfPresent(segmentDistances, forKey: .segmentDistances) + try container.encodeIfPresent(expectedSegmentTravelTimes, forKey: .expectedSegmentTravelTimes) + try container.encodeIfPresent(segmentSpeeds, forKey: .segmentSpeeds) + try container.encodeIfPresent(segmentCongestionLevels, forKey: .segmentCongestionLevels) + try container.encode(name, forKey: .name) + try container.encode(distance, forKey: .distance) + try container.encode(expectedTravelTime, forKey: .expectedTravelTime) + try container.encode(profileIdentifier, forKey: .profileIdentifier) - public static var supportsSecureCoding = true - - public func encode(with coder: NSCoder) { - coder.encode(source, forKey: "source") - coder.encode(destination, forKey: "destination") - coder.encode(steps, forKey: "steps") - coder.encode(name, forKey: "name") - coder.encode(distance, forKey: "distance") - coder.encode(expectedTravelTime, forKey: "expectedTravelTime") - coder.encode(profileIdentifier, forKey: "profileIdentifier") - coder.encode(segmentDistances, forKey: "segmentDistances") - coder.encode(expectedSegmentTravelTimes, forKey: "expectedSegmentTravelTimes") - coder.encode(segmentSpeeds, forKey: "segmentSpeeds") - coder.encode(segmentCongestionLevels, forKey: "segmentCongestionLevels") } + +// // MARK: Creating a Leg +// +// internal init(steps: [RouteStep], json: JSONDictionary, source: Waypoint, destination: Waypoint, options: RouteOptions) { +// self.source = source +// self.destination = destination +// self.profileIdentifier = options.profileIdentifier +// self.steps = steps +// distance = json["distance"] as! Double +// expectedTravelTime = json["duration"] as! Double +// self.name = json["summary"] as! String +// +// var segmentDistances: [CLLocationDistance]? +// var expectedSegmentTravelTimes: [TimeInterval]? +// var segmentSpeeds: [CLLocationSpeed]? +// var congestionLevels: [CongestionLevel]? +// +// if let jsonAttributes = json["annotation"] as? [String: Any] { +// if let distance = jsonAttributes["distance"] { +// segmentDistances = distance as? [CLLocationDistance] +// } +// if let duration = jsonAttributes["duration"] { +// expectedSegmentTravelTimes = duration as? [TimeInterval] ?? [] +// } +// if let speed = jsonAttributes["speed"] { +// segmentSpeeds = speed as? [CLLocationSpeed] ?? [] +// } +// if let congestion = jsonAttributes["congestion"] as? [String] { +// congestionLevels = congestion.map { +// #warning("derail") +// return CongestionLevel(rawValue: $0)! +// } +// } +// } +// +// self.segmentDistances = segmentDistances +// self.expectedSegmentTravelTimes = expectedSegmentTravelTimes +// self.segmentSpeeds = segmentSpeeds +// self.segmentCongestionLevels = congestionLevels +// } +// +// /** +// Initializes a new route leg object with the given JSON dictionary representation and waypoints. +// +// Normally, you do not create instances of this class directly. Instead, you receive route leg objects as part of route objects when you request directions using the `Directions.calculateDirections(options:completionHandler:)` method. +// +// - parameter json: A JSON dictionary representation of a route leg object as returnd by the Mapbox Directions API. +// - parameter source: The waypoint at the beginning of the leg. +// - parameter destination: The waypoint at the end of the leg. +// - parameter options: The options used when requesting the route. +// */ +// +// public convenience init(json: [String: Any], source: Waypoint, destination: Waypoint, options: RouteOptions) { +// let steps = (json["steps"] as? [JSONDictionary] ?? []).map { RouteStep(json: $0, options: options) } +// self.init(steps: steps, json: json, source: source, destination: destination, options: options) +// } +// +// public required init?(coder decoder: NSCoder) { +// guard let decodedSource = decoder.decodeObject(of: Waypoint.self, forKey: "source") else { +// return nil +// } +// source = decodedSource +// +// guard let decodedDestination = decoder.decodeObject(of: Waypoint.self, forKey: "destination") else { +// return nil +// } +// destination = decodedDestination +// +// steps = decoder.decodeObject(of: [NSArray.self, RouteStep.self], forKey: "steps") as? [RouteStep] ?? [] +// +// guard let decodedName = decoder.decodeObject(of: NSString.self, forKey: "name") as String? else { +// return nil +// } +// name = decodedName +// +// distance = decoder.decodeDouble(forKey: "distance") +// expectedTravelTime = decoder.decodeDouble(forKey: "expectedTravelTime") +// +// guard let decodedProfileIdentifier = decoder.decodeObject(of: NSString.self, forKey: "profileIdentifier") as String? else { +// return nil +// } +// +// profileIdentifier = DirectionsProfileIdentifier(rawValue: decodedProfileIdentifier) +// +// segmentDistances = decoder.decodeObject(of: [NSArray.self, NSNumber.self], forKey: "segmentDistances") as? [CLLocationDistance] +// expectedSegmentTravelTimes = decoder.decodeObject(of: [NSArray.self, NSNumber.self], forKey: "expectedSegmentTravelTimes") as? [TimeInterval] +// segmentSpeeds = decoder.decodeObject(of: [NSArray.self, NSNumber.self], forKey: "segmentSpeeds") as? [CLLocationSpeed] +// segmentCongestionLevels = decoder.decodeObject(of: [NSArray.self, NSNumber.self], forKey: "segmentCongestionLevels") as? [CongestionLevel] +// } +// +// public static var supportsSecureCoding = true +// +// public func encode(with coder: NSCoder) { +// coder.encode(source, forKey: "source") +// coder.encode(destination, forKey: "destination") +// coder.encode(steps, forKey: "steps") +// coder.encode(name, forKey: "name") +// coder.encode(distance, forKey: "distance") +// coder.encode(expectedTravelTime, forKey: "expectedTravelTime") +// coder.encode(profileIdentifier, forKey: "profileIdentifier") +// coder.encode(segmentDistances, forKey: "segmentDistances") +// coder.encode(expectedSegmentTravelTimes, forKey: "expectedSegmentTravelTimes") +// coder.encode(segmentSpeeds, forKey: "segmentSpeeds") +// coder.encode(segmentCongestionLevels, forKey: "segmentCongestionLevels") +// } // MARK: Getting the Leg Geometry @@ -225,12 +270,3 @@ open class RouteLeg: NSObject, NSSecureCoding { return debugQuickLookURL(illustrating: coordinates) } } - -// MARK: Support for Directions API v4 - -internal class RouteLegV4: RouteLeg { - internal convenience init(json: JSONDictionary, source: Waypoint, destination: Waypoint, options: RouteOptions) { - let steps = (json["steps"] as? [JSONDictionary] ?? []).map { RouteStepV4(json: $0) } - self.init(steps: steps, json: json, source: source, destination: destination, options: options) - } -} diff --git a/Sources/MapboxDirections/MBRouteOptions.swift b/Sources/MapboxDirections/MBRouteOptions.swift index 5e9ebc236..ce943aa90 100644 --- a/Sources/MapboxDirections/MBRouteOptions.swift +++ b/Sources/MapboxDirections/MBRouteOptions.swift @@ -4,7 +4,7 @@ Pass an instance of this class into the `Directions.calculate(_:completionHandler:)` method. */ -open class RouteOptions: DirectionsOptions, Codable { +open class RouteOptions: DirectionsOptions { // MARK: Creating a Route Options Object /** diff --git a/Sources/MapboxDirections/MBRouteStep.swift b/Sources/MapboxDirections/MBRouteStep.swift index dfb4a7dcd..ef4bcae4a 100644 --- a/Sources/MapboxDirections/MBRouteStep.swift +++ b/Sources/MapboxDirections/MBRouteStep.swift @@ -1003,20 +1003,6 @@ extension ManeuverDirection { } } -internal class RouteStepV4: RouteStep { - internal convenience init(json: JSONDictionary) { - let maneuver = json["maneuver"] as! JSONDictionary - let heading = maneuver["heading"] as? Double - let maneuverType = ManeuverType(v4Description: maneuver["type"] as! String) ?? .none - let maneuverDirection = ManeuverDirection(v4TypeDescription: maneuver["type"] as! String) ?? .none - let maneuverLocation = CLLocationCoordinate2D(geoJSON: maneuver["location"] as! JSONDictionary) - let drivingSide = DrivingSide(description: json["driving_side"] as? String ?? "") ?? .right - let name = json["way_name"] as! String - - self.init(finalHeading: heading, maneuverType: maneuverType, maneuverDirection: maneuverDirection, drivingSide: drivingSide, maneuverLocation: maneuverLocation, name: name, coordinates: nil, json: json) - } -} - func debugQuickLookURL(illustrating coordinates: [CLLocationCoordinate2D], profileIdentifier: DirectionsProfileIdentifier = .automobile) -> URL? { guard let accessToken = defaultAccessToken else { return nil From 74e08380270d31ac1b0231fa7bcb6d9f2887c733 Mon Sep 17 00:00:00 2001 From: Jerrad Thramer Date: Thu, 10 Oct 2019 15:41:27 -0600 Subject: [PATCH 06/89] Moving right along, trying to tackle visual instructions and route steps. --- .../Extensions/CoreLocation.swift | 2 +- .../MBComponentRepresentable.swift | 70 +- Sources/MapboxDirections/MBDirections.swift | 22 + .../MBDirectionsOptions.swift | 21 +- Sources/MapboxDirections/MBRoute.swift | 6 +- Sources/MapboxDirections/MBRouteOptions.swift | 10 +- Sources/MapboxDirections/MBRouteStep.swift | 625 ++++++------------ .../MBVisualInstruction.swift | 98 +-- .../MBVisualInstructionComponent.swift | 6 +- .../MBVisualInstructionType.swift | 42 +- 10 files changed, 365 insertions(+), 537 deletions(-) diff --git a/Sources/MapboxDirections/Extensions/CoreLocation.swift b/Sources/MapboxDirections/Extensions/CoreLocation.swift index e0f56736c..928829fa3 100644 --- a/Sources/MapboxDirections/Extensions/CoreLocation.swift +++ b/Sources/MapboxDirections/Extensions/CoreLocation.swift @@ -18,7 +18,7 @@ extension CLLocationCoordinate2D: Codable, Equatable { return lhs.latitude == rhs.latitude && lhs.longitude == rhs.longitude } - internal var jsonDescription: String { + internal var requestDescription: String { return "\(longitude.rounded(to: 1e6)),\(latitude.rounded(to: 1e6))" } } diff --git a/Sources/MapboxDirections/MBComponentRepresentable.swift b/Sources/MapboxDirections/MBComponentRepresentable.swift index c89f94932..6a8240939 100644 --- a/Sources/MapboxDirections/MBComponentRepresentable.swift +++ b/Sources/MapboxDirections/MBComponentRepresentable.swift @@ -1,7 +1,75 @@ import Foundation +import UIKit +import CoreGraphics /** The component representable protocol that comprises what the instruction banner should display. */ -public protocol ComponentRepresentable: class, NSSecureCoding { } +public protocol ComponentRepresentable: class { } + +internal struct ComponentCoder: Codable { + let component: ComponentRepresentable + + private enum CodingKeys: String, CodingKey { + case type + case text + case abbreviatedText = "abbr" + case abbreviatedTextPriority = "abbr_priority" + case imageBaseURL + case imageURL + case directions + case isActive = "active" + } + init(component: ComponentRepresentable) { + self.component = component + } + + func encode(to encoder: Encoder) throws { + var container = encoder.container(keyedBy: CodingKeys.self) + + if let lane = component as? LaneIndicationComponent { + try container.encode(lane.indications, forKey: .directions) + try container.encode(lane.isUsable, forKey: .isActive) + } else if let instruction = component as? VisualInstructionComponent { + try container.encodeIfPresent(instruction.text, forKey: .text) + try container.encodeIfPresent(instruction.abbreviation, forKey: .abbreviatedText) + try container.encodeIfPresent(instruction.abbreviationPriority, forKey: .abbreviatedTextPriority) + try container.encodeIfPresent(instruction.imageURL, forKey: .imageURL) + + } + + } + init(from decoder: Decoder) throws { + let container = try decoder.container(keyedBy: CodingKeys.self) + let type = try container.decode(VisualInstructionComponentType.self, forKey: .type) + + switch type { + case .lane: + let indications = try container.decode(LaneIndication.self, forKey: .directions) + let isUsable = try container.decode(Bool.self, forKey: .isActive) + component = LaneIndicationComponent(indications: indications, isUsable: isUsable) + default: + let text = try container.decode(String.self, forKey: .text) + let abbreviatedText = try container.decodeIfPresent(String.self, forKey: .abbreviatedText) + var imageURL: URL? + if let generatedURL = try container.decodeIfPresent(String.self, forKey: .imageURL) { + imageURL = URL(string: generatedURL) + + } else if let imageBaseURL = try container.decodeIfPresent(String.self, forKey: .imageBaseURL), !imageBaseURL.isEmpty { + let scale: CGFloat + #if os(OSX) + scale = NSScreen.main?.backingScaleFactor ?? 1 + #elseif os(watchOS) + scale = WKInterfaceDevice.current().screenScale + #else + scale = UIScreen.main.scale + #endif + imageURL = URL(string: "\(imageBaseURL)@\(Int(scale))x.png") + } + let abbreviationPriority = try container.decodeIfPresent(Int.self, forKey: .abbreviatedTextPriority) + component = VisualInstructionComponent(type: type, text: text, imageURL: imageURL, abbreviation: abbreviatedText, abbreviationPriority: abbreviationPriority) + } + + } +} diff --git a/Sources/MapboxDirections/MBDirections.swift b/Sources/MapboxDirections/MBDirections.swift index 6119ef591..d6d81a2c9 100644 --- a/Sources/MapboxDirections/MBDirections.swift +++ b/Sources/MapboxDirections/MBDirections.swift @@ -386,3 +386,25 @@ open class Directions: NSObject { // } // } } + +extension CodingUserInfoKey { + static let routeOptions = CodingUserInfoKey(rawValue: "options") +} + +/** + A JSONDecoder with an associated `RouteOptions` to use when decoding a directions response. + */ +public class DirectionsDecoder: JSONDecoder { + + /** + Initializes a `DirectionsDecoder` with a given `RouteOption`. + */ + convenience public init(options: RouteOptions) { + self.init(userInfo: [CodingUserInfoKey.routeOptions!: options]) + } + + init(userInfo: [CodingUserInfoKey: Any]) { + super.init() + self.userInfo = userInfo + } +} diff --git a/Sources/MapboxDirections/MBDirectionsOptions.swift b/Sources/MapboxDirections/MBDirectionsOptions.swift index fbb875545..bf5d0dd9c 100644 --- a/Sources/MapboxDirections/MBDirectionsOptions.swift +++ b/Sources/MapboxDirections/MBDirectionsOptions.swift @@ -261,7 +261,24 @@ open class DirectionsOptions: Codable { // NSSecureCoding, NSCopying { } // MARK: - URL Queries -public extension DirectionsOptions { +internal extension DirectionsOptions { + + var abridgedPath: String { + assertionFailure("abridgedPath should be overriden by subclass") + return "" + } + /** + The path of the request URL, not including the hostname or any parameters. + */ + var path: String { + guard let coordinates = coordinates, !coordinates.isEmpty else { + assertionFailure("No query") + return "" + } + return "\(abridgedPath)/\(coordinates).json" + } + + var urlQueryItems: [URLQueryItem] { var queryItems: [URLQueryItem] = [ URLQueryItem(name: "geometries", value: String(describing: shapeFormat)), @@ -365,7 +382,7 @@ public extension DirectionsOptions { } private var coordinates: String? { - return waypoints.map { $0.coordinate.jsonDescription }.joined(separator: ";") + return waypoints.map { $0.coordinate.requestDescription }.joined(separator: ";") } } diff --git a/Sources/MapboxDirections/MBRoute.swift b/Sources/MapboxDirections/MBRoute.swift index beadfcb09..d81b792be 100644 --- a/Sources/MapboxDirections/MBRoute.swift +++ b/Sources/MapboxDirections/MBRoute.swift @@ -38,11 +38,7 @@ open class Route: NSObject, Codable { let geometry = try container.decodeIfPresent(UncertainCodable.self, forKey: .geometry) if let geo = geometry?.value as? String { - if routeOptions is RouteOptionsV4 { - coordinates = decodePolyline(geo, precision: 1e6) - } else { - coordinates = decodePolyline(geo, precision: 1e5) - } + coordinates = decodePolyline(geo, precision: 1e5) } else if let geo = geometry?.value as? Geometry { coordinates = geo.coordinates } else { diff --git a/Sources/MapboxDirections/MBRouteOptions.swift b/Sources/MapboxDirections/MBRouteOptions.swift index ce943aa90..9f3212a9e 100644 --- a/Sources/MapboxDirections/MBRouteOptions.swift +++ b/Sources/MapboxDirections/MBRouteOptions.swift @@ -13,13 +13,11 @@ open class RouteOptions: DirectionsOptions { - parameter waypoints: An array of `Waypoint` objects representing locations that the route should visit in chronological order. The array should contain at least two waypoints (the source and destination) and at most 25 waypoints. (Some profiles, such as `MBDirectionsProfileIdentifierAutomobileAvoidingTraffic`, [may have lower limits](https://www.mapbox.com/api-documentation/#directions).) - parameter profileIdentifier: A string specifying the primary mode of transportation for the routes. This parameter, if set, should be set to `MBDirectionsProfileIdentifierAutomobile`, `MBDirectionsProfileIdentifierAutomobileAvoidingTraffic`, `MBDirectionsProfileIdentifierCycling`, or `MBDirectionsProfileIdentifierWalking`. `MBDirectionsProfileIdentifierAutomobile` is used by default. */ - public init(waypoints: [Waypoint], profileIdentifier: DirectionsProfileIdentifier? = nil) { - assert(waypoints.count >= 2, "A route requires at least a source and destination.") - assert(waypoints.count <= 25, "A route may not have more than 25 waypoints.") + public required init(waypoints: [Waypoint], profileIdentifier: DirectionsProfileIdentifier? = nil) { - self.waypoints = waypoints - self.profileIdentifier = profileIdentifier ?? .automobile - self.allowsUTurnAtWaypoint = ![DirectionsProfileIdentifier.automobile.rawValue, DirectionsProfileIdentifier.automobileAvoidingTraffic.rawValue].contains(self.profileIdentifier.rawValue) + super.init(waypoints: waypoints, profileIdentifier: profileIdentifier) + let profilesDisallowingUTurns: [DirectionsProfileIdentifier] = [.automobile, .automobileAvoidingTraffic] + self.allowsUTurnAtWaypoint = !profilesDisallowingUTurns.contains(self.profileIdentifier) } /** diff --git a/Sources/MapboxDirections/MBRouteStep.swift b/Sources/MapboxDirections/MBRouteStep.swift index ef4bcae4a..6881d9d16 100644 --- a/Sources/MapboxDirections/MBRouteStep.swift +++ b/Sources/MapboxDirections/MBRouteStep.swift @@ -7,7 +7,7 @@ import Polyline A `TransportType` specifies the mode of transportation used for part of a route. */ -public enum TransportType: Int, CustomStringConvertible { +public enum TransportType: String { // Possible transport types when the `profileIdentifier` is `MBDirectionsProfileIdentifierAutomobile` or `MBDirectionsProfileIdentifierAutomobileAvoidingTraffic` /** @@ -22,7 +22,7 @@ public enum TransportType: Int, CustomStringConvertible { This is the usual transport type when the `profileIdentifier` is `MBDirectionsProfileIdentifierAutomobile` or `MBDirectionsProfileIdentifierAutomobileAvoidingTraffic`. */ - case automobile // automobile + case automobile = "driving" // automobile /** The route requires the user to board a ferry. @@ -36,14 +36,14 @@ public enum TransportType: Int, CustomStringConvertible { The user may need to wait for the movable bridge to become passable before continuing. */ - case movableBridge // automobile, cycling + case movableBridge = "movable bridge" // automobile, cycling /** The route becomes impassable at this point. You should not encounter this transport type under normal circumstances. */ - case inaccessible // automobile, walking, cycling + case inaccessible = "unaccessible" // automobile, walking, cycling // Possible transport types when the `profileIdentifier` is `MBDirectionsProfileIdentifierWalking` @@ -69,60 +69,8 @@ public enum TransportType: Int, CustomStringConvertible { The user should consult the train’s timetable. For cycling directions, the user should also verify that bicycles are permitted onboard the train. */ case train // cycling - - public init?(description: String) { - let type: TransportType - switch description { - case "none": - type = .none - case "driving": - type = .automobile - case "ferry": - type = .ferry - case "moveable bridge": - type = .movableBridge - case "unaccessible": - type = .inaccessible - case "walking": - type = .walking - case "cycling": - type = .cycling - case "train": - type = .train - default: - return nil - } - self.init(rawValue: type.rawValue) - } - - public var description: String { - switch self { - case .none: - return "none" - case .automobile: - return "driving" - case .ferry: - return "ferry" - case .movableBridge: - return "moveable bridge" - case .inaccessible: - return "unaccessible" - case .walking: - return "walking" - case .cycling: - return "cycling" - case .train: - return "train" - } - } } -/** - Returns a string describing the given transport type. - */ -public func MBStringFromTransportType(transportType: TransportType) -> String { - return transportType.description -} /** A `ManeuverType` specifies the type of maneuver required to complete the route step. You can pair a maneuver type with a `ManeuverDirection` to choose an appropriate visual or voice prompt to present the user. @@ -130,7 +78,7 @@ public func MBStringFromTransportType(transportType: TransportType) -> String { In Swift, you can use pattern matching with a single switch statement on a tuple containing the maneuver type and maneuver direction to avoid a complex series of if-else-if statements or switch statements. */ -public enum ManeuverType: Int, CustomStringConvertible { +public enum ManeuverType: String, Codable { /** The step does not have a particular maneuver type associated with it. @@ -162,7 +110,7 @@ public enum ManeuverType: Int, CustomStringConvertible { The step’s name contains the road’s new name. To get the road’s old name, use the previous step’s name. */ - case passNameChange + case passNameChange = "new name" /** The step requires the user to merge onto another road. @@ -174,28 +122,28 @@ public enum ManeuverType: Int, CustomStringConvertible { /** The step requires the user to take a entrance ramp (slip road) onto a highway. */ - case takeOnRamp + case takeOnRamp = "on ramp" /** The step requires the user to take an exit ramp (slip road) off a highway. The maneuver direction indicates the side of the highway from which the user must exit. The exit index indicates the number of highway exits from the previous maneuver up to and including the exit that the user must take. */ - case takeOffRamp + case takeOffRamp = "off ramp" /** The step requires the user to choose a fork at a Y-shaped fork in the road. The maneuver direction indicates which fork to take. */ - case reachFork + case reachFork = "fork" /** The step requires the user to turn at either a T-shaped three-way intersection or a sharp bend in the road where the road also changes names. This maneuver type is called out separately so that the user may be able to proceed more confidently, without fear of having overshot the turn. If this distinction is unimportant to you, you may treat the maneuver as an ordinary `turn`. */ - case reachEnd + case reachEnd = "end of road" /** The step requires the user to get into a specific lane in order to continue along the current road. @@ -204,7 +152,7 @@ public enum ManeuverType: Int, CustomStringConvertible { This maneuver type is called out separately so that the application can present the user with lane guidance based on the first element in the `intersections` property. If lane guidance is unimportant to you, you may treat the maneuver as an ordinary `continue` or ignore it. */ - case useLane + case useLane = "use lane" /** The step requires the user to enter and traverse a roundabout (traffic circle or rotary). @@ -213,7 +161,7 @@ public enum ManeuverType: Int, CustomStringConvertible { If `RouteOptions.includesExitRoundaboutManeuver` is set to `true`, this step is followed by an `.exitRoundabout` maneuver. Otherwise, this step represents the entire roundabout maneuver, from the entrance to the exit. */ - case takeRoundabout + case takeRoundabout = "roundabout" /** The step requires the user to enter and traverse a large, named roundabout (traffic circle or rotary). @@ -222,28 +170,28 @@ public enum ManeuverType: Int, CustomStringConvertible { If `RouteOptions.includesExitRoundaboutManeuver` is set to `true`, this step is followed by an `.exitRotary` maneuver. Otherwise, this step represents the entire roundabout maneuver, from the entrance to the exit. */ - case takeRotary + case takeRotary = "rotary" /** The step requires the user to enter and exit a roundabout (traffic circle or rotary) that is compact enough to constitute a single intersection. The step’s name is the name of the road to take after exiting the roundabout. This maneuver type is called out separately because the user may perceive the roundabout as an ordinary intersection with an island in the middle. If this distinction is unimportant to you, you may treat the maneuver as either an ordinary `turn` or as a `takeRoundabout`. */ - case turnAtRoundabout + case turnAtRoundabout = "roundabout turn" /** The step requires the user to exit a roundabout (traffic circle or rotary). This maneuver type follows a `.takeRoundabout` maneuver. It is only used when `RouteOptions.includesExitRoundaboutManeuver` is set to true. */ - case exitRoundabout + case exitRoundabout = "exit roundabout" /** The step requires the user to exit a large, named roundabout (traffic circle or rotary). This maneuver type follows a `.takeRotary` maneuver. It is only used when `RouteOptions.includesExitRoundaboutManeuver` is set to true. */ - case exitRotary + case exitRotary = "exit rotary" /** The step requires the user to respond to a change in travel conditions. @@ -252,7 +200,7 @@ public enum ManeuverType: Int, CustomStringConvertible { Similar changes can occur simultaneously with other maneuvers, such as when the road changes its name at the site of a movable bridge. In such cases, `heedWarning` is suppressed in favor of another maneuver type. */ - case heedWarning + case heedWarning = "notification" /** The step requires the user to arrive at a waypoint. @@ -260,115 +208,13 @@ public enum ManeuverType: Int, CustomStringConvertible { The distance and expected travel time for this step are set to zero, indicating that the route or route leg is complete. The maneuver direction indicates the side of the road on which the waypoint can be found (or whether it is straight ahead). */ case arrive - - /** - The step requires the user to arrive at an intermediate waypoint. - - This maneuver type is only used by version 4 of the Mapbox Directions API. - */ - case passWaypoint // v4 - - public init?(description: String) { - let type: ManeuverType - switch description { - case "depart": - type = .depart - case "turn": - type = .turn - case "continue": - type = .continue - case "new name": - type = .passNameChange - case "merge": - type = .merge - case "on ramp": - type = .takeOnRamp - case "off ramp": - type = .takeOffRamp - case "fork": - type = .reachFork - case "end of road": - type = .reachEnd - case "use lane": - type = .useLane - case "rotary": - type = .takeRotary - case "roundabout": - type = .takeRoundabout - case "roundabout turn": - type = .turnAtRoundabout - case "exit roundabout": - type = .exitRoundabout - case "exit rotary": - type = .exitRotary - case "notification": - type = .heedWarning - case "arrive": - type = .arrive - case "waypoint": // v4 - type = .passWaypoint - default: - type = .none - } - self.init(rawValue: type.rawValue) - } - - public var description: String { - switch self { - case .none: - return "none" - case .depart: - return "depart" - case .turn: - return "turn" - case .continue: - return "continue" - case .passNameChange: - return "new name" - case .merge: - return "merge" - case .takeOnRamp: - return "on ramp" - case .takeOffRamp: - return "off ramp" - case .reachFork: - return "fork" - case .reachEnd: - return "end of road" - case .useLane: - return "use lane" - case .takeRotary: - return "rotary" - case .takeRoundabout: - return "roundabout" - case .turnAtRoundabout: - return "roundabout turn" - case .exitRoundabout: - return "exit roundabout" - case .exitRotary: - return "exit rotary" - case .heedWarning: - return "notification" - case .arrive: - return "arrive" - case .passWaypoint: // v4 - return "waypoint" - } - } -} - -/** - Returns a string describing the given maneuver type. - */ -public func MBStringFromManeuverType(maneuverType: ManeuverType) -> String { - return maneuverType.description } /** A `ManeuverDirection` clarifies a `ManeuverType` with directional information. The exact meaning of the maneuver direction for a given step depends on the step’s maneuver type; see the `ManeuverType` documentation for details. */ -public enum ManeuverDirection: Int, CustomStringConvertible { +public enum ManeuverDirection: String, Codable { /** The step does not have a particular maneuver direction associated with it. @@ -379,7 +225,7 @@ public enum ManeuverDirection: Int, CustomStringConvertible { /** The maneuver requires a sharp turn to the right. */ - case sharpRight + case sharpRight = "sharp right" /** The maneuver requires a turn to the right, a merge to the right, or an exit on the right, or the destination is on the right. @@ -389,17 +235,17 @@ public enum ManeuverDirection: Int, CustomStringConvertible { /** The maneuver requires a slight turn to the right. */ - case slightRight + case slightRight = "slight right" /** The maneuver requires no notable change in direction, or the destination is straight ahead. */ - case straightAhead + case straightAhead = "straight" /** The maneuver requires a slight turn to the left. */ - case slightLeft + case slightLeft = "slight left" /** The maneuver requires a turn to the left, a merge to the left, or an exit on the left, or the destination is on the right. @@ -409,69 +255,14 @@ public enum ManeuverDirection: Int, CustomStringConvertible { /** The maneuver requires a sharp turn to the left. */ - case sharpLeft + case sharpLeft = "sharp left" /** The maneuver requires a U-turn when possible. Use the difference between the step’s initial and final headings to distinguish between a U-turn to the left (typical in countries that drive on the right) and a U-turn on the right (typical in countries that drive on the left). If the difference in headings is greater than 180 degrees, the maneuver requires a U-turn to the left. If the difference in headings is less than 180 degrees, the maneuver requires a U-turn to the right. */ - case uTurn - - public init?(description: String) { - let direction: ManeuverDirection - switch description { - case "sharp right": - direction = .sharpRight - case "right": - direction = .right - case "slight right": - direction = .slightRight - case "straight": - direction = .straightAhead - case "slight left": - direction = .slightLeft - case "left": - direction = .left - case "sharp left": - direction = .sharpLeft - case "uturn": - direction = .uTurn - default: - direction = .none - } - self.init(rawValue: direction.rawValue) - } - - public var description: String { - switch self { - case .none: - return "none" - case .sharpRight: - return "sharp right" - case .right: - return "right" - case .slightRight: - return "slight right" - case .straightAhead: - return "straight" - case .slightLeft: - return "slight left" - case .left: - return "left" - case .sharpLeft: - return "sharp left" - case .uTurn: - return "uturn" - } - } -} - -/** - Returns a string describing the given maneuver direction. - */ -public func MBStringFromManeuverDirection(maneuverDirection: ManeuverDirection) -> String { - return maneuverDirection.description + case uTurn = "uturn" } @@ -542,62 +333,62 @@ struct Road { open class RouteStep: NSObject, NSSecureCoding { // MARK: Creating a Step - internal init(finalHeading: CLLocationDirection?, maneuverType: ManeuverType, maneuverDirection: ManeuverDirection, drivingSide: DrivingSide, maneuverLocation: CLLocationCoordinate2D, name: String, coordinates: [CLLocationCoordinate2D]?, json: JSONDictionary) { - transportType = TransportType(description: json["mode"] as! String) ?? .none - - let road = Road(name: name, ref: json["ref"] as? String, exits: json["exits"] as? String, destination: json["destinations"] as? String, rotaryName: json["rotary_name"] as? String) - if maneuverType == .takeRotary || maneuverType == .takeRoundabout { - names = road.rotaryNames - phoneticNames = (json["rotary_pronunciation"] as? String)?.tagValues(separatedBy: ";") - exitNames = road.names - phoneticExitNames = (json["pronunciation"] as? String)?.tagValues(separatedBy: ";") - } else { - names = road.names - phoneticNames = (json["pronunciation"] as? String)?.tagValues(separatedBy: ";") - exitNames = nil - phoneticExitNames = nil - } - exitCodes = road.exitCodes - codes = road.codes - destinationCodes = road.destinationCodes - destinations = road.destinations - - let maneuver = json["maneuver"] as! JSONDictionary - - if let instructions = maneuver["instruction"] as? String { - self.instructions = instructions - } else if maneuverType != .none, maneuverDirection != .none { - instructions = "\(maneuverType) \(maneuverDirection)" - } else if maneuverType != .none { - instructions = String(describing: maneuverType) - } else if maneuverDirection != .none { - instructions = String(describing: maneuverDirection) - } else { - instructions = "" - } - - distance = json["distance"] as? Double ?? 0 - expectedTravelTime = json["duration"] as? Double ?? 0 - - let intersectionsJSON = json["intersections"] as? [JSONDictionary] - self.intersections = intersectionsJSON?.map { Intersection(json: $0) } - - let voiceInstructionsJSON = json["voiceInstructions"] as? [JSONDictionary] - self.instructionsSpokenAlongStep = voiceInstructionsJSON?.map { SpokenInstruction(json: $0) } - - let instructionsDisplayedAlongStep = json["bannerInstructions"] as? [JSONDictionary] - self.instructionsDisplayedAlongStep = instructionsDisplayedAlongStep?.map { VisualInstructionBanner(json: $0, drivingSide: drivingSide) } - - initialHeading = maneuver["bearing_before"] as? Double - self.finalHeading = finalHeading - self.maneuverType = maneuverType - self.maneuverDirection = maneuverDirection - exitIndex = maneuver["exit"] as? Int - - self.maneuverLocation = maneuverLocation - self.coordinates = coordinates - self.drivingSide = drivingSide - } +// internal init(finalHeading: CLLocationDirection?, maneuverType: ManeuverType, maneuverDirection: ManeuverDirection, drivingSide: DrivingSide, maneuverLocation: CLLocationCoordinate2D, name: String, coordinates: [CLLocationCoordinate2D]?, json: JSONDictionary) { +// transportType = TransportType(description: json["mode"] as! String) ?? .none +// +// let road = Road(name: name, ref: json["ref"] as? String, exits: json["exits"] as? String, destination: json["destinations"] as? String, rotaryName: json["rotary_name"] as? String) +// if maneuverType == .takeRotary || maneuverType == .takeRoundabout { +// names = road.rotaryNames +// phoneticNames = (json["rotary_pronunciation"] as? String)?.tagValues(separatedBy: ";") +// exitNames = road.names +// phoneticExitNames = (json["pronunciation"] as? String)?.tagValues(separatedBy: ";") +// } else { +// names = road.names +// phoneticNames = (json["pronunciation"] as? String)?.tagValues(separatedBy: ";") +// exitNames = nil +// phoneticExitNames = nil +// } +// exitCodes = road.exitCodes +// codes = road.codes +// destinationCodes = road.destinationCodes +// destinations = road.destinations +// +// let maneuver = json["maneuver"] as! JSONDictionary +// +// if let instructions = maneuver["instruction"] as? String { +// self.instructions = instructions +// } else if maneuverType != .none, maneuverDirection != .none { +// instructions = "\(maneuverType) \(maneuverDirection)" +// } else if maneuverType != .none { +// instructions = String(describing: maneuverType) +// } else if maneuverDirection != .none { +// instructions = String(describing: maneuverDirection) +// } else { +// instructions = "" +// } +// +// distance = json["distance"] as? Double ?? 0 +// expectedTravelTime = json["duration"] as? Double ?? 0 +// +// let intersectionsJSON = json["intersections"] as? [JSONDictionary] +// self.intersections = intersectionsJSON?.map { Intersection(json: $0) } +// +// let voiceInstructionsJSON = json["voiceInstructions"] as? [JSONDictionary] +// self.instructionsSpokenAlongStep = voiceInstructionsJSON?.map { SpokenInstruction(json: $0) } +// +// let instructionsDisplayedAlongStep = json["bannerInstructions"] as? [JSONDictionary] +// self.instructionsDisplayedAlongStep = instructionsDisplayedAlongStep?.map { VisualInstructionBanner(json: $0, drivingSide: drivingSide) } +// +// initialHeading = maneuver["bearing_before"] as? Double +// self.finalHeading = finalHeading +// self.maneuverType = maneuverType +// self.maneuverDirection = maneuverDirection +// exitIndex = maneuver["exit"] as? Int +// +// self.maneuverLocation = maneuverLocation +// self.coordinates = coordinates +// self.drivingSide = drivingSide +// } /** Initializes a new route step object based on the given JSON dictionary representation. @@ -607,134 +398,134 @@ open class RouteStep: NSObject, NSSecureCoding { - parameter json: A JSON object that conforms to the [route step](https://docs.mapbox.com/api/navigation/#route-step-object) format described in the Directions API documentation. */ - public convenience init(json: [String: Any], options: RouteOptions) { - let maneuver = json["maneuver"] as! JSONDictionary - let finalHeading = maneuver["bearing_after"] as? Double - let maneuverType = ManeuverType(description: maneuver["type"] as? String ?? "") ?? .none - let maneuverDirection = ManeuverDirection(description: maneuver["modifier"] as? String ?? "") ?? .none - let maneuverLocation = CLLocationCoordinate2D(geoJSON: maneuver["location"] as! [Double]) - let drivingSide = DrivingSide(description: json["driving_side"] as? String ?? "") ?? .right - - let name = json["name"] as! String - - let coordinates = options.shapeFormat.coordinates(from: json["geometry"]) - - self.init(finalHeading: finalHeading, maneuverType: maneuverType, maneuverDirection: maneuverDirection, drivingSide: drivingSide, maneuverLocation: maneuverLocation, name: name, coordinates: coordinates, json: json) - } - - public required init?(coder decoder: NSCoder) { - let coordinateDictionaries = decoder.decodeObject(of: [NSArray.self, NSDictionary.self, NSString.self, NSNumber.self], forKey: "coordinates") as? [[String: CLLocationDegrees]] - - coordinates = coordinateDictionaries?.compactMap({ (coordinateDictionary) -> CLLocationCoordinate2D? in - if let latitude = coordinateDictionary["latitude"], let longitude = coordinateDictionary["longitude"] { - return CLLocationCoordinate2D(latitude: latitude, longitude: longitude) - } else { - return nil - } - }) - - guard let decodedInstructions = decoder.decodeObject(of: NSString.self, forKey: "instructions") as String? else { - return nil - } - instructions = decodedInstructions - - initialHeading = decoder.containsValue(forKey: "initialHeading") ? decoder.decodeDouble(forKey: "initialHeading") : nil - finalHeading = decoder.containsValue(forKey: "finalHeading") ? decoder.decodeDouble(forKey: "finalHeading") : nil - - guard let maneuverTypeDescription = decoder.decodeObject(of: NSString.self, forKey: "maneuverType") as String? else { - return nil - } - maneuverType = ManeuverType(description: maneuverTypeDescription) ?? .none - - let maneuverDirectionDescription = decoder.decodeObject(of: NSString.self, forKey: "maneuverDirection")! as String - maneuverDirection = ManeuverDirection(description: maneuverDirectionDescription) ?? .none - - if let drivingSideDescription = decoder.decodeObject(of: NSString.self, forKey: "drivingSide") as String?, let drivingSide = DrivingSide(description: drivingSideDescription) { - self.drivingSide = drivingSide - } else { - self.drivingSide = .right - } - - if let maneuverLocationDictionary = decoder.decodeObject(of: [NSDictionary.self, NSString.self, NSNumber.self], forKey: "maneuverLocation") as? [String: CLLocationDegrees], - let latitude = maneuverLocationDictionary["latitude"], - let longitude = maneuverLocationDictionary["longitude"] { - maneuverLocation = CLLocationCoordinate2D(latitude: latitude, longitude: longitude) - } else { - maneuverLocation = kCLLocationCoordinate2DInvalid - } - - exitIndex = decoder.containsValue(forKey: "exitIndex") ? decoder.decodeInteger(forKey: "exitIndex") : nil - exitCodes = decoder.decodeObject(of: [NSArray.self, NSString.self], forKey: "exitCodes") as? [String] - exitNames = decoder.decodeObject(of: [NSArray.self, NSString.self], forKey: "exitNames") as? [String] - phoneticExitNames = decoder.decodeObject(of: [NSArray.self, NSString.self], forKey: "phoneticExitNames") as? [String] - distance = decoder.decodeDouble(forKey: "distance") - expectedTravelTime = decoder.decodeDouble(forKey: "expectedTravelTime") - names = decoder.decodeObject(of: [NSArray.self, NSString.self], forKey: "names") as? [String] - phoneticNames = decoder.decodeObject(of: [NSArray.self, NSString.self], forKey: "phoneticNames") as? [String] - - guard let transportTypeDescription = decoder.decodeObject(of: NSString.self, forKey: "transportType") as String? else { - return nil - } - transportType = TransportType(description: transportTypeDescription) ?? .none - - codes = decoder.decodeObject(of: [NSArray.self, NSString.self], forKey: "codes") as? [String] - destinationCodes = decoder.decodeObject(of: [NSArray.self, NSString.self], forKey: "destinationCodes") as? [String] - destinations = decoder.decodeObject(of: [NSArray.self, NSString.self], forKey: "destinations") as? [String] - - intersections = decoder.decodeObject(of: [NSArray.self, Intersection.self], forKey: "intersections") as? [Intersection] - - instructionsSpokenAlongStep = decoder.decodeObject(of: [NSArray.self, SpokenInstruction.self], forKey: "instructionsSpokenAlongStep") as? [SpokenInstruction] - - instructionsDisplayedAlongStep = decoder.decodeObject(of: [NSArray.self, VisualInstructionBanner.self], forKey: "instructionsDisplayedAlongStep") as? [VisualInstructionBanner] - } - - public static var supportsSecureCoding = true - - public func encode(with coder: NSCoder) { - let coordinateDictionaries = coordinates?.map { [ - "latitude": $0.latitude, - "longitude": $0.longitude, - ] } - coder.encode(coordinateDictionaries, forKey: "coordinates") - - coder.encode(instructions, forKey: "instructions") - - if let initialHeading = initialHeading { - coder.encode(initialHeading, forKey: "initialHeading") - } - if let finalHeading = finalHeading { - coder.encode(finalHeading, forKey: "finalHeading") - } - - coder.encode(maneuverType.description, forKey: "maneuverType") - coder.encode(maneuverDirection.description, forKey: "maneuverDirection") - coder.encode(drivingSide.description, forKey: "drivingSide") - - coder.encode(intersections, forKey: "intersections") - - coder.encode([ - "latitude": maneuverLocation.latitude, - "longitude": maneuverLocation.longitude, - ], forKey: "maneuverLocation") - - if let exitIndex = exitIndex { - coder.encode(exitIndex, forKey: "exitIndex") - } - - coder.encode(exitCodes, forKey: "exitCodes") - coder.encode(exitNames, forKey: "exitNames") - coder.encode(phoneticExitNames, forKey: "phoneticExitNames") - coder.encode(distance, forKey: "distance") - coder.encode(expectedTravelTime, forKey: "expectedTravelTime") - coder.encode(names, forKey: "names") - coder.encode(phoneticNames, forKey: "phoneticNames") - coder.encode(transportType.description, forKey: "transportType") - coder.encode(codes, forKey: "codes") - coder.encode(destinationCodes, forKey: "destinationCodes") - coder.encode(destinations, forKey: "destinations") - coder.encode(instructionsSpokenAlongStep, forKey: "instructionsSpokenAlongStep") - coder.encode(instructionsDisplayedAlongStep, forKey: "instructionsDisplayedAlongStep") - } +// public convenience init(json: [String: Any], options: RouteOptions) { +// let maneuver = json["maneuver"] as! JSONDictionary +// let finalHeading = maneuver["bearing_after"] as? Double +// let maneuverType = ManeuverType(description: maneuver["type"] as? String ?? "") ?? .none +// let maneuverDirection = ManeuverDirection(description: maneuver["modifier"] as? String ?? "") ?? .none +// let maneuverLocation = CLLocationCoordinate2D(geoJSON: maneuver["location"] as! [Double]) +// let drivingSide = DrivingSide(description: json["driving_side"] as? String ?? "") ?? .right +// +// let name = json["name"] as! String +// +// let coordinates = options.shapeFormat.coordinates(from: json["geometry"]) +// +// self.init(finalHeading: finalHeading, maneuverType: maneuverType, maneuverDirection: maneuverDirection, drivingSide: drivingSide, maneuverLocation: maneuverLocation, name: name, coordinates: coordinates, json: json) +// } +// +// public required init?(coder decoder: NSCoder) { +// let coordinateDictionaries = decoder.decodeObject(of: [NSArray.self, NSDictionary.self, NSString.self, NSNumber.self], forKey: "coordinates") as? [[String: CLLocationDegrees]] +// +// coordinates = coordinateDictionaries?.compactMap({ (coordinateDictionary) -> CLLocationCoordinate2D? in +// if let latitude = coordinateDictionary["latitude"], let longitude = coordinateDictionary["longitude"] { +// return CLLocationCoordinate2D(latitude: latitude, longitude: longitude) +// } else { +// return nil +// } +// }) +// +// guard let decodedInstructions = decoder.decodeObject(of: NSString.self, forKey: "instructions") as String? else { +// return nil +// } +// instructions = decodedInstructions +// +// initialHeading = decoder.containsValue(forKey: "initialHeading") ? decoder.decodeDouble(forKey: "initialHeading") : nil +// finalHeading = decoder.containsValue(forKey: "finalHeading") ? decoder.decodeDouble(forKey: "finalHeading") : nil +// +// guard let maneuverTypeDescription = decoder.decodeObject(of: NSString.self, forKey: "maneuverType") as String? else { +// return nil +// } +// maneuverType = ManeuverType(description: maneuverTypeDescription) ?? .none +// +// let maneuverDirectionDescription = decoder.decodeObject(of: NSString.self, forKey: "maneuverDirection")! as String +// maneuverDirection = ManeuverDirection(description: maneuverDirectionDescription) ?? .none +// +// if let drivingSideDescription = decoder.decodeObject(of: NSString.self, forKey: "drivingSide") as String?, let drivingSide = DrivingSide(description: drivingSideDescription) { +// self.drivingSide = drivingSide +// } else { +// self.drivingSide = .right +// } +// +// if let maneuverLocationDictionary = decoder.decodeObject(of: [NSDictionary.self, NSString.self, NSNumber.self], forKey: "maneuverLocation") as? [String: CLLocationDegrees], +// let latitude = maneuverLocationDictionary["latitude"], +// let longitude = maneuverLocationDictionary["longitude"] { +// maneuverLocation = CLLocationCoordinate2D(latitude: latitude, longitude: longitude) +// } else { +// maneuverLocation = kCLLocationCoordinate2DInvalid +// } +// +// exitIndex = decoder.containsValue(forKey: "exitIndex") ? decoder.decodeInteger(forKey: "exitIndex") : nil +// exitCodes = decoder.decodeObject(of: [NSArray.self, NSString.self], forKey: "exitCodes") as? [String] +// exitNames = decoder.decodeObject(of: [NSArray.self, NSString.self], forKey: "exitNames") as? [String] +// phoneticExitNames = decoder.decodeObject(of: [NSArray.self, NSString.self], forKey: "phoneticExitNames") as? [String] +// distance = decoder.decodeDouble(forKey: "distance") +// expectedTravelTime = decoder.decodeDouble(forKey: "expectedTravelTime") +// names = decoder.decodeObject(of: [NSArray.self, NSString.self], forKey: "names") as? [String] +// phoneticNames = decoder.decodeObject(of: [NSArray.self, NSString.self], forKey: "phoneticNames") as? [String] +// +// guard let transportTypeDescription = decoder.decodeObject(of: NSString.self, forKey: "transportType") as String? else { +// return nil +// } +// transportType = TransportType(description: transportTypeDescription) ?? .none +// +// codes = decoder.decodeObject(of: [NSArray.self, NSString.self], forKey: "codes") as? [String] +// destinationCodes = decoder.decodeObject(of: [NSArray.self, NSString.self], forKey: "destinationCodes") as? [String] +// destinations = decoder.decodeObject(of: [NSArray.self, NSString.self], forKey: "destinations") as? [String] +// +// intersections = decoder.decodeObject(of: [NSArray.self, Intersection.self], forKey: "intersections") as? [Intersection] +// +// instructionsSpokenAlongStep = decoder.decodeObject(of: [NSArray.self, SpokenInstruction.self], forKey: "instructionsSpokenAlongStep") as? [SpokenInstruction] +// +// instructionsDisplayedAlongStep = decoder.decodeObject(of: [NSArray.self, VisualInstructionBanner.self], forKey: "instructionsDisplayedAlongStep") as? [VisualInstructionBanner] +// } +// +// public static var supportsSecureCoding = true +// +// public func encode(with coder: NSCoder) { +// let coordinateDictionaries = coordinates?.map { [ +// "latitude": $0.latitude, +// "longitude": $0.longitude, +// ] } +// coder.encode(coordinateDictionaries, forKey: "coordinates") +// +// coder.encode(instructions, forKey: "instructions") +// +// if let initialHeading = initialHeading { +// coder.encode(initialHeading, forKey: "initialHeading") +// } +// if let finalHeading = finalHeading { +// coder.encode(finalHeading, forKey: "finalHeading") +// } +// +// coder.encode(maneuverType.description, forKey: "maneuverType") +// coder.encode(maneuverDirection.description, forKey: "maneuverDirection") +// coder.encode(drivingSide.description, forKey: "drivingSide") +// +// coder.encode(intersections, forKey: "intersections") +// +// coder.encode([ +// "latitude": maneuverLocation.latitude, +// "longitude": maneuverLocation.longitude, +// ], forKey: "maneuverLocation") +// +// if let exitIndex = exitIndex { +// coder.encode(exitIndex, forKey: "exitIndex") +// } +// +// coder.encode(exitCodes, forKey: "exitCodes") +// coder.encode(exitNames, forKey: "exitNames") +// coder.encode(phoneticExitNames, forKey: "phoneticExitNames") +// coder.encode(distance, forKey: "distance") +// coder.encode(expectedTravelTime, forKey: "expectedTravelTime") +// coder.encode(names, forKey: "names") +// coder.encode(phoneticNames, forKey: "phoneticNames") +// coder.encode(transportType.description, forKey: "transportType") +// coder.encode(codes, forKey: "codes") +// coder.encode(destinationCodes, forKey: "destinationCodes") +// coder.encode(destinations, forKey: "destinations") +// coder.encode(instructionsSpokenAlongStep, forKey: "instructionsSpokenAlongStep") +// coder.encode(instructionsDisplayedAlongStep, forKey: "instructionsDisplayedAlongStep") +// } // MARK: Getting the Step Geometry diff --git a/Sources/MapboxDirections/MBVisualInstruction.swift b/Sources/MapboxDirections/MBVisualInstruction.swift index cae985cd3..ccd156198 100644 --- a/Sources/MapboxDirections/MBVisualInstruction.swift +++ b/Sources/MapboxDirections/MBVisualInstruction.swift @@ -7,9 +7,7 @@ import CoreLocation */ -open class VisualInstruction: NSObject, NSSecureCoding { - - public static var supportsSecureCoding = true +open class VisualInstruction: Codable { /** A plain text representation of the instruction. @@ -38,7 +36,7 @@ open class VisualInstruction: NSObject, NSSecureCoding { This property is only relevant if the `maneuverType` is any of the following values: `ManeuverType.takeRoundabout`, `ManeuverType.takeRotary`, `ManeuverType.turnAtRoundabout`, `ManeuverType.exitRoundabout`, or `ManeuverType.exitRotary`. */ - public var finalHeading: CLLocationDegrees = 180 + public var finalHeading: CLLocationDegrees? /** Initializes a new visual instruction banner object that displays the given information. @@ -50,71 +48,37 @@ open class VisualInstruction: NSObject, NSSecureCoding { self.components = components self.finalHeading = degrees } - - /** - Initializes a new visual instruction object based on the given JSON dictionary representation. - - - parameter json: A JSON object that conforms to the [banner instruction](https://docs.mapbox.com/api/navigation/#banner-instruction-object) format described in the Directions API documentation. - */ - public convenience init(json: [String: Any]) { - let text = json["text"] as? String - var components = [ComponentRepresentable]() - - var maneuverType: ManeuverType = .none - if let type = json["type"] as? String, let derivedType = ManeuverType(description: type) { - maneuverType = derivedType - } - - var maneuverDirection: ManeuverDirection = .none - if let modifier = json["modifier"] as? String, - let derivedDirection = ManeuverDirection(description: modifier) { - maneuverDirection = derivedDirection - } - - if let dictionary = json["components"] as? [JSONDictionary] { - if let firstComponent = dictionary.first, let type = firstComponent["type"] as? String, type.lowercased() == "lane" { - components = dictionary.map { record in - let indications = LaneIndication(descriptions: record["directions"] as? [String] ?? []) ?? LaneIndication() - let isUsable = record["active"] as? Bool ?? false - return LaneIndicationComponent(indications: indications, isUsable: isUsable) - } - } else { - components = dictionary.map(VisualInstructionComponent.init(json:)) - } - } - - let degrees = json["degrees"] as? CLLocationDegrees ?? 180 - - self.init(text: text, maneuverType: maneuverType, maneuverDirection: maneuverDirection, components: components, degrees: degrees) + + // MARK: - Codable + private enum CodingKeys: String, CodingKey { + case text + case maneuverType = "type" + case maneuverDirection = "modifier" + case components + case finalHeading = "degrees" } - - public required init?(coder decoder: NSCoder) { - text = decoder.decodeObject(of: NSString.self, forKey: "text") as String? - - guard let maneuverTypeString = decoder.decodeObject(of: NSString.self, forKey: "maneuverType") as String?, let maneuverType = ManeuverType(description: maneuverTypeString) else { - return nil - } - self.maneuverType = maneuverType - - guard let direction = decoder.decodeObject(of: NSString.self, forKey: "maneuverDirection") as String?, let maneuverDirection = ManeuverDirection(description: direction) else { - return nil - } - self.maneuverDirection = maneuverDirection - - guard let components = decoder.decodeObject(of: [NSArray.self, VisualInstructionComponent.self, LaneIndicationComponent.self], forKey: "components") as? [ComponentRepresentable] else { - return nil - } - self.components = components - - self.finalHeading = decoder.decodeDouble(forKey: "degrees") + public func encode(to encoder: Encoder) throws { + var container = encoder.container(keyedBy: CodingKeys.self) + try container.encodeIfPresent(text, forKey: .text) + try container.encode(maneuverType, forKey: .maneuverType) + try container.encode(maneuverDirection, forKey: .maneuverDirection) + + let wrappedComponents = components.map(ComponentCoder.init(component:)) + try container.encode(wrappedComponents, forKey: .components) + + try container.encodeIfPresent(finalHeading, forKey: .finalHeading) } - - public func encode(with coder: NSCoder) { - coder.encode(text, forKey: "text") - coder.encode(maneuverType.description, forKey: "maneuverType") - coder.encode(maneuverDirection.description, forKey: "maneuverDirection") - coder.encode(finalHeading, forKey: "degrees") - coder.encode(components, forKey: "components") + + public required init(from decoder: Decoder) throws { + let container = try decoder.container(keyedBy: CodingKeys.self) + text = try container.decodeIfPresent(String.self, forKey: .text) + maneuverType = try container.decode(ManeuverType.self, forKey: .maneuverType) + maneuverDirection = try container.decode(ManeuverDirection.self, forKey: .maneuverDirection) + + let componentsWrapped = try container.decode([ComponentCoder].self, forKey: .components) + components = componentsWrapped.map { $0.component } + + finalHeading = try container.decodeIfPresent(CLLocationDegrees.self, forKey: .finalHeading) } } diff --git a/Sources/MapboxDirections/MBVisualInstructionComponent.swift b/Sources/MapboxDirections/MBVisualInstructionComponent.swift index 53af2fcc9..a39552cf0 100644 --- a/Sources/MapboxDirections/MBVisualInstructionComponent.swift +++ b/Sources/MapboxDirections/MBVisualInstructionComponent.swift @@ -10,7 +10,7 @@ A component of a `VisualInstruction` that represents a single run of similarly formatted text or an image with a textual fallback representation. */ -open class VisualInstructionComponent: NSObject, ComponentRepresentable { +open class VisualInstructionComponent: ComponentRepresentable { /** The URL to an image representation of this component. @@ -29,7 +29,7 @@ open class VisualInstructionComponent: NSObject, ComponentRepresentable { A component with a lower abbreviation priority value should be abbreviated before a component with a higher abbreviation priority value. */ - public var abbreviationPriority: Int = NSNotFound + public var abbreviationPriority: Int? /** The plain text representation of this component. @@ -83,7 +83,7 @@ open class VisualInstructionComponent: NSObject, ComponentRepresentable { - parameter abbreviation: An abbreviated representation of `text`. - parameter abbreviationPriority: The priority for which the component should be abbreviated. */ - public init(type: VisualInstructionComponentType, text: String?, imageURL: URL?, abbreviation: String?, abbreviationPriority: Int) { + public init(type: VisualInstructionComponentType, text: String?, imageURL: URL?, abbreviation: String?, abbreviationPriority: Int?) { self.text = text self.type = type self.imageURL = imageURL diff --git a/Sources/MapboxDirections/MBVisualInstructionType.swift b/Sources/MapboxDirections/MBVisualInstructionType.swift index f94ef1c7c..7b3168743 100644 --- a/Sources/MapboxDirections/MBVisualInstructionType.swift +++ b/Sources/MapboxDirections/MBVisualInstructionType.swift @@ -4,7 +4,7 @@ import Foundation `VisualInstructionComponentType` describes the type of `VisualInstructionComponent`. */ -public enum VisualInstructionComponentType: Int, CustomStringConvertible { +public enum VisualInstructionComponentType: String, Codable { /** The component separates two other destination components. @@ -21,7 +21,7 @@ public enum VisualInstructionComponentType: Int, CustomStringConvertible { /** Component contains an image that should be rendered. */ - case image + case image = "icon" /** The compoment contains the localized word for "exit". @@ -33,39 +33,11 @@ public enum VisualInstructionComponentType: Int, CustomStringConvertible { /** A component contains an exit number. */ - case exitCode + case exitCode = "exit-number" - public init?(description: String) { - let type: VisualInstructionComponentType - switch description { - case "delimiter": - type = .delimiter - case "icon": - type = .image - case "text": - type = .text - case "exit": - type = .exit - case "exit-number": - type = .exitCode - default: - return nil - } - self.init(rawValue: type.rawValue) - } + /** + A component contains a lane. + */ + case lane - public var description: String { - switch self { - case .delimiter: - return "delimiter" - case .image: - return "icon" - case .text: - return "text" - case .exit: - return "exit" - case .exitCode: - return "exit-number" - } - } } From 48406ba633bc56fc07ff6211d21ae97d1d61a96b Mon Sep 17 00:00:00 2001 From: Jerrad Thramer Date: Tue, 15 Oct 2019 16:29:12 -0600 Subject: [PATCH 07/89] Fixing remaining models and `calculate(options:completionHandler:)` (RouteOptions) --- Cartfile | 1 + Cartfile.resolved | 3 +- MapboxDirections.swift.podspec | 1 + MapboxDirections.xcodeproj/project.pbxproj | 30 +- Package.swift | 3 +- .../MapboxDirections/DirectionsError.swift | 6 +- .../Extensions/CoreLocation.swift | 18 +- .../MBComponentRepresentable.swift | 2 +- Sources/MapboxDirections/MBDirections.swift | 89 ++- .../MBDirectionsOptions.swift | 15 +- .../MapboxDirections/MBDirectionsResult.swift | 97 ++- Sources/MapboxDirections/MBRoute.swift | 182 +----- Sources/MapboxDirections/MBRouteLeg.swift | 21 +- Sources/MapboxDirections/MBRouteOptions.swift | 6 +- Sources/MapboxDirections/MBRouteStep.swift | 589 +++++++----------- .../MBSpokenInstruction.swift | 33 +- .../MBVisualInstruction.swift | 4 +- .../MBVisualInstructionBanner.swift | 183 +++--- .../MBVisualInstructionComponent.swift | 71 +-- Sources/MapboxDirections/MBWaypoint.swift | 9 - Sources/MapboxDirections/Match/MBMatch.swift | 148 ++--- .../Match/MBMatchOptions.swift | 43 +- .../Match/MatchResponse.swift | 19 + ...ionsResponse.swift => RouteResponse.swift} | 8 +- 24 files changed, 648 insertions(+), 933 deletions(-) create mode 100644 Sources/MapboxDirections/Match/MatchResponse.swift rename Sources/MapboxDirections/{DirectionsResponse.swift => RouteResponse.swift} (85%) diff --git a/Cartfile b/Cartfile index a1112e8ce..e1306a938 100644 --- a/Cartfile +++ b/Cartfile @@ -1 +1,2 @@ github "raphaelmor/Polyline" ~> 4.2 +github "mapbox/turf-swift" ~> 0.3 diff --git a/Cartfile.resolved b/Cartfile.resolved index 7170eb27b..5f849b3ce 100644 --- a/Cartfile.resolved +++ b/Cartfile.resolved @@ -1,3 +1,4 @@ -binary "https://www.mapbox.com/ios-sdk/Mapbox-iOS-SDK.json" "4.11.1" +binary "https://www.mapbox.com/ios-sdk/Mapbox-iOS-SDK.json" "4.11.2" github "linksmt/OHHTTPStubs" "563f48d3fab84ef04639649c770b00f4fa502cca" +github "mapbox/turf-swift" "v0.3.0" github "raphaelmor/Polyline" "v4.2.1" diff --git a/MapboxDirections.swift.podspec b/MapboxDirections.swift.podspec index bf118db84..af9b15701 100644 --- a/MapboxDirections.swift.podspec +++ b/MapboxDirections.swift.podspec @@ -47,5 +47,6 @@ Pod::Spec.new do |s| s.swift_version = "5.0" s.dependency "Polyline", "~> 4.2" + s.dependency "Turf", "~> 0.3" end diff --git a/MapboxDirections.xcodeproj/project.pbxproj b/MapboxDirections.xcodeproj/project.pbxproj index ff7478aa8..0141cdafb 100644 --- a/MapboxDirections.xcodeproj/project.pbxproj +++ b/MapboxDirections.xcodeproj/project.pbxproj @@ -47,10 +47,10 @@ 431E93C823466B4000A71B44 /* CoreLocation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 43208BA82343F7E900D8BD89 /* CoreLocation.swift */; }; 431E93C923466B4100A71B44 /* CoreLocation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 43208BA82343F7E900D8BD89 /* CoreLocation.swift */; }; 431E93CA23466B4200A71B44 /* CoreLocation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 43208BA82343F7E900D8BD89 /* CoreLocation.swift */; }; - 431E93CB23466C2400A71B44 /* DirectionsResponse.swift in Sources */ = {isa = PBXBuildFile; fileRef = 43208BAC2343FF5500D8BD89 /* DirectionsResponse.swift */; }; - 431E93CC23466C2500A71B44 /* DirectionsResponse.swift in Sources */ = {isa = PBXBuildFile; fileRef = 43208BAC2343FF5500D8BD89 /* DirectionsResponse.swift */; }; - 431E93CD23466C2700A71B44 /* DirectionsResponse.swift in Sources */ = {isa = PBXBuildFile; fileRef = 43208BAC2343FF5500D8BD89 /* DirectionsResponse.swift */; }; - 431E93CE23466C2800A71B44 /* DirectionsResponse.swift in Sources */ = {isa = PBXBuildFile; fileRef = 43208BAC2343FF5500D8BD89 /* DirectionsResponse.swift */; }; + 431E93CB23466C2400A71B44 /* RouteResponse.swift in Sources */ = {isa = PBXBuildFile; fileRef = 43208BAC2343FF5500D8BD89 /* RouteResponse.swift */; }; + 431E93CC23466C2500A71B44 /* RouteResponse.swift in Sources */ = {isa = PBXBuildFile; fileRef = 43208BAC2343FF5500D8BD89 /* RouteResponse.swift */; }; + 431E93CD23466C2700A71B44 /* RouteResponse.swift in Sources */ = {isa = PBXBuildFile; fileRef = 43208BAC2343FF5500D8BD89 /* RouteResponse.swift */; }; + 431E93CE23466C2800A71B44 /* RouteResponse.swift in Sources */ = {isa = PBXBuildFile; fileRef = 43208BAC2343FF5500D8BD89 /* RouteResponse.swift */; }; 431E93CF23466D7400A71B44 /* Codable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 43208BA62343F7C300D8BD89 /* Codable.swift */; }; 431E93D023466D7500A71B44 /* Codable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 43208BA62343F7C300D8BD89 /* Codable.swift */; }; 431E93D123466D7600A71B44 /* Codable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 43208BA62343F7C300D8BD89 /* Codable.swift */; }; @@ -63,6 +63,10 @@ 439255792344113D006EEE88 /* DirectionsError.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4392557523440EC2006EEE88 /* DirectionsError.swift */; }; 4392557A2344113E006EEE88 /* DirectionsError.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4392557523440EC2006EEE88 /* DirectionsError.swift */; }; 4392557B2344113F006EEE88 /* DirectionsError.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4392557523440EC2006EEE88 /* DirectionsError.swift */; }; + 43F89F932350F952007B591E /* MatchResponse.swift in Sources */ = {isa = PBXBuildFile; fileRef = 43F89F922350F952007B591E /* MatchResponse.swift */; }; + 43F89F942350F952007B591E /* MatchResponse.swift in Sources */ = {isa = PBXBuildFile; fileRef = 43F89F922350F952007B591E /* MatchResponse.swift */; }; + 43F89F952350F952007B591E /* MatchResponse.swift in Sources */ = {isa = PBXBuildFile; fileRef = 43F89F922350F952007B591E /* MatchResponse.swift */; }; + 43F89F962350F952007B591E /* MatchResponse.swift in Sources */ = {isa = PBXBuildFile; fileRef = 43F89F922350F952007B591E /* MatchResponse.swift */; }; 8D381B611FD9F5B1008D5A58 /* noDestinationName.json in Resources */ = {isa = PBXBuildFile; fileRef = 8D381B601FD9F5B1008D5A58 /* noDestinationName.json */; }; 8D381B631FDB01D1008D5A58 /* apiDestinationName.json in Resources */ = {isa = PBXBuildFile; fileRef = 8D381B621FDB01D1008D5A58 /* apiDestinationName.json */; }; 8D381B641FDB0898008D5A58 /* noDestinationName.json in Resources */ = {isa = PBXBuildFile; fileRef = 8D381B601FD9F5B1008D5A58 /* noDestinationName.json */; }; @@ -325,11 +329,12 @@ 43208BA62343F7C300D8BD89 /* Codable.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Codable.swift; sourceTree = ""; }; 43208BA82343F7E900D8BD89 /* CoreLocation.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CoreLocation.swift; sourceTree = ""; }; 43208BAA2343F81900D8BD89 /* GeoJSON.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GeoJSON.swift; sourceTree = ""; }; - 43208BAC2343FF5500D8BD89 /* DirectionsResponse.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DirectionsResponse.swift; sourceTree = ""; }; + 43208BAC2343FF5500D8BD89 /* RouteResponse.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RouteResponse.swift; sourceTree = ""; }; 438BFEBC233D7FA900457294 /* Package.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Package.swift; sourceTree = ""; }; 438BFEC0233D805500457294 /* README.md */ = {isa = PBXFileReference; lastKnownFileType = net.daringfireball.markdown; path = README.md; sourceTree = ""; }; 438BFEC1233D854D00457294 /* DirectionsProfileIdentifier.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DirectionsProfileIdentifier.swift; sourceTree = ""; }; 4392557523440EC2006EEE88 /* DirectionsError.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DirectionsError.swift; sourceTree = ""; }; + 43F89F922350F952007B591E /* MatchResponse.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MatchResponse.swift; sourceTree = ""; }; 8D381B601FD9F5B1008D5A58 /* noDestinationName.json */ = {isa = PBXFileReference; lastKnownFileType = text.json; path = noDestinationName.json; sourceTree = ""; }; 8D381B621FDB01D1008D5A58 /* apiDestinationName.json */ = {isa = PBXFileReference; explicitFileType = text.json; path = apiDestinationName.json; sourceTree = ""; }; 8D381B691FDB101F008D5A58 /* String.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = String.swift; sourceTree = ""; }; @@ -575,6 +580,7 @@ children = ( C5434B89200693D00069E887 /* MBTracepoint.swift */, C5434B8B200695A50069E887 /* MBMatchOptions.swift */, + 43F89F922350F952007B591E /* MatchResponse.swift */, C5DAAC9920191675001F9261 /* MBMatch.swift */, ); path = Match; @@ -598,7 +604,7 @@ DD6254731AE70CB700017857 /* MBDirections.swift */, 4392557523440EC2006EEE88 /* DirectionsError.swift */, C59094C0203DE6BC00EB2417 /* MBDirectionsResult.swift */, - 43208BAC2343FF5500D8BD89 /* DirectionsResponse.swift */, + 43208BAC2343FF5500D8BD89 /* RouteResponse.swift */, DAC05F171CFC075300FA0071 /* MBRoute.swift */, 431E93BE234664A200A71B44 /* DrivingSide.swift */, DAC05F191CFC077C00FA0071 /* MBRouteLeg.swift */, @@ -1190,7 +1196,7 @@ C52552BA1FA15D5E00B1545C /* MBVisualInstructionBanner.swift in Sources */, 35828C9F217A003F00ED546E /* OfflineDirections.swift in Sources */, C5DAAC9F20195AAE001F9261 /* MBTracepoint.swift in Sources */, - 431E93CC23466C2500A71B44 /* DirectionsResponse.swift in Sources */, + 431E93CC23466C2500A71B44 /* RouteResponse.swift in Sources */, 431E93C423466B0F00A71B44 /* GeoJSON.swift in Sources */, C5990B4A2045E72800D7DFD4 /* MBDirectionsResult.swift in Sources */, 35EFD00C207DFACA00BF3873 /* MBVisualInstruction.swift in Sources */, @@ -1204,6 +1210,7 @@ C5990B4D2045E74800D7DFD4 /* MBDirectionsOptions.swift in Sources */, DAA76D691DD127CB0015EC78 /* MBLaneIndication.swift in Sources */, AEDC211E20B612530052DED8 /* MBLaneIndicationComponent.swift in Sources */, + 43F89F942350F952007B591E /* MatchResponse.swift in Sources */, DA1A10CB1D00F969009F82FA /* MBRouteStep.swift in Sources */, C57D55031DB566A700B94B74 /* MBIntersection.swift in Sources */, C52CE38F1F6AF63C0069963D /* MBSpokenInstruction.swift in Sources */, @@ -1256,7 +1263,7 @@ C52552BB1FA15D5F00B1545C /* MBVisualInstructionBanner.swift in Sources */, 35828CA0217A003F00ED546E /* OfflineDirections.swift in Sources */, C5DAACA020195AAF001F9261 /* MBTracepoint.swift in Sources */, - 431E93CD23466C2700A71B44 /* DirectionsResponse.swift in Sources */, + 431E93CD23466C2700A71B44 /* RouteResponse.swift in Sources */, 431E93C523466B1000A71B44 /* GeoJSON.swift in Sources */, C5990B4B2045E72900D7DFD4 /* MBDirectionsResult.swift in Sources */, 35EFD00D207DFACA00BF3873 /* MBVisualInstruction.swift in Sources */, @@ -1270,6 +1277,7 @@ C5990B4E2045E74900D7DFD4 /* MBDirectionsOptions.swift in Sources */, DAA76D6A1DD127CB0015EC78 /* MBLaneIndication.swift in Sources */, AEDC211F20B612540052DED8 /* MBLaneIndicationComponent.swift in Sources */, + 43F89F952350F952007B591E /* MatchResponse.swift in Sources */, DA1A10F11D010247009F82FA /* MBRouteStep.swift in Sources */, C57D55041DB566A800B94B74 /* MBIntersection.swift in Sources */, C52CE3901F6AF63D0069963D /* MBSpokenInstruction.swift in Sources */, @@ -1322,7 +1330,7 @@ C52552BC1FA15D6000B1545C /* MBVisualInstructionBanner.swift in Sources */, 35828CA1217A003F00ED546E /* OfflineDirections.swift in Sources */, C5DAACA120195AAF001F9261 /* MBTracepoint.swift in Sources */, - 431E93CE23466C2800A71B44 /* DirectionsResponse.swift in Sources */, + 431E93CE23466C2800A71B44 /* RouteResponse.swift in Sources */, 431E93C623466B1100A71B44 /* GeoJSON.swift in Sources */, C5990B4C2045E72A00D7DFD4 /* MBDirectionsResult.swift in Sources */, 35EFD00E207DFACA00BF3873 /* MBVisualInstruction.swift in Sources */, @@ -1336,6 +1344,7 @@ C5990B4F2045E74A00D7DFD4 /* MBDirectionsOptions.swift in Sources */, DAA76D6B1DD127CB0015EC78 /* MBLaneIndication.swift in Sources */, AEDC212020B612560052DED8 /* MBLaneIndicationComponent.swift in Sources */, + 43F89F962350F952007B591E /* MatchResponse.swift in Sources */, DA1A11081D0103A3009F82FA /* MBRouteStep.swift in Sources */, C57D55051DB566A900B94B74 /* MBIntersection.swift in Sources */, C52CE3911F6AF63E0069963D /* MBSpokenInstruction.swift in Sources */, @@ -1366,7 +1375,7 @@ C52552C01FA1628A00B1545C /* MBVisualInstructionComponent.swift in Sources */, 35828C9E217A003F00ED546E /* OfflineDirections.swift in Sources */, C59426071F1EA6C400C8E59C /* RoadClasses.swift in Sources */, - 431E93CB23466C2400A71B44 /* DirectionsResponse.swift in Sources */, + 431E93CB23466C2400A71B44 /* RouteResponse.swift in Sources */, 431E93C323466B0E00A71B44 /* GeoJSON.swift in Sources */, 35EFD00B207DFACA00BF3873 /* MBVisualInstruction.swift in Sources */, DAC05F161CFBFAC400FA0071 /* MBWaypoint.swift in Sources */, @@ -1380,6 +1389,7 @@ C59094C1203DE6BC00EB2417 /* MBDirectionsResult.swift in Sources */, DAC05F1A1CFC077C00FA0071 /* MBRouteLeg.swift in Sources */, AEDC211920B5DBDE0052DED8 /* MBLaneIndicationComponent.swift in Sources */, + 43F89F932350F952007B591E /* MatchResponse.swift in Sources */, C5434B8A200693D00069E887 /* MBTracepoint.swift in Sources */, DA6C9DA61CAE462800094FBC /* MBDirections.swift in Sources */, C55FB44B1F6AEBF6006BD1E9 /* MBSpokenInstruction.swift in Sources */, diff --git a/Package.swift b/Package.swift index 21b97bccb..32a91ed58 100644 --- a/Package.swift +++ b/Package.swift @@ -14,7 +14,8 @@ let package = Package( ], dependencies: [ // Dependencies declare other packages that this package depends on. - .package(url: "https://github.com/raphaelmor/Polyline.git", from: "4.2.1") + .package(url: "https://github.com/raphaelmor/Polyline.git", from: "4.2.1"), + .package(url: "https://github.com/mapbox/turf-swift.git", from: "0.2") ], targets: [ // Targets are the basic building blocks of a package. A target can define a module or a test suite. diff --git a/Sources/MapboxDirections/DirectionsError.swift b/Sources/MapboxDirections/DirectionsError.swift index ad3d13040..40246e941 100644 --- a/Sources/MapboxDirections/DirectionsError.swift +++ b/Sources/MapboxDirections/DirectionsError.swift @@ -19,6 +19,8 @@ public enum DirectionsError: Error, RawRepresentable { switch self { case .noData: return "No data was returned from the server." + case .invalidResponse: + return "A response was recieved from the server, but it was not of a valid format." case .unableToRoute: return "No route could be found between the specified locations." case .unableToLocate: @@ -38,7 +40,6 @@ public enum DirectionsError: Error, RawRepresentable { return "More than \(formattedCount) requests have been made with this access token within a period of \(formattedInterval)" case let .unknown(response: response, underlying: error, code: code): return "Unknown Error. Response: \(response.debugDescription) Underlying Error: \(error.debugDescription) Code: \(code.debugDescription)" - } } @@ -60,6 +61,8 @@ public enum DirectionsError: Error, RawRepresentable { } let formattedDate: String = DateFormatter.localizedString(from: reset, dateStyle: .long, timeStyle: .long) return "Wait until \(formattedDate) before retrying." + case .invalidResponse: + fallthrough case .unknown(_,_,_): return "Please contact Mapbox Support." } @@ -68,6 +71,7 @@ public enum DirectionsError: Error, RawRepresentable { case noData + case invalidResponse case unableToRoute case unableToLocate case profileNotFound diff --git a/Sources/MapboxDirections/Extensions/CoreLocation.swift b/Sources/MapboxDirections/Extensions/CoreLocation.swift index 928829fa3..a4e5984cf 100644 --- a/Sources/MapboxDirections/Extensions/CoreLocation.swift +++ b/Sources/MapboxDirections/Extensions/CoreLocation.swift @@ -1,23 +1,7 @@ import Foundation import CoreLocation -extension CLLocationCoordinate2D: Codable, Equatable { - public func encode(to encoder: Encoder) throws { - var container = encoder.unkeyedContainer() - try container.encode(contentsOf: [longitude, latitude]) - } - - public init(from decoder: Decoder) throws { - self.init() - var container = try decoder.unkeyedContainer() - longitude = try container.decode(CLLocationDegrees.self) - latitude = try container.decode(CLLocationDegrees.self) - } - - public static func == (lhs: CLLocationCoordinate2D, rhs: CLLocationCoordinate2D) -> Bool { - return lhs.latitude == rhs.latitude && lhs.longitude == rhs.longitude - } - +extension CLLocationCoordinate2D{ internal var requestDescription: String { return "\(longitude.rounded(to: 1e6)),\(latitude.rounded(to: 1e6))" } diff --git a/Sources/MapboxDirections/MBComponentRepresentable.swift b/Sources/MapboxDirections/MBComponentRepresentable.swift index 6a8240939..b4787c88a 100644 --- a/Sources/MapboxDirections/MBComponentRepresentable.swift +++ b/Sources/MapboxDirections/MBComponentRepresentable.swift @@ -8,7 +8,7 @@ The component representable protocol that comprises what the instruction banner public protocol ComponentRepresentable: class { } -internal struct ComponentCoder: Codable { +internal struct Component: Codable { let component: ComponentRepresentable private enum CodingKeys: String, CodingKey { diff --git a/Sources/MapboxDirections/MBDirections.swift b/Sources/MapboxDirections/MBDirections.swift index d6d81a2c9..8a868224b 100644 --- a/Sources/MapboxDirections/MBDirections.swift +++ b/Sources/MapboxDirections/MBDirections.swift @@ -163,15 +163,56 @@ open class Directions: NSObject { let requestURL = url(forCalculating: options) let request = URLRequest(url: requestURL) let requestTask = URLSession.shared.dataTask(with: request) { (possibleData, possibleResponse, possibleError) in + + guard let response = possibleResponse, response.mimeType == "application/json" else { + completionHandler(nil, nil, .invalidResponse) + return + } + guard let data = possibleData else { completionHandler(nil, nil, .noData) + return } + + if let error = possibleError { - completionHandler(nil, nil, .unknown(underlying: error)) + completionHandler(nil, nil, .unknown(response: possibleResponse, underlying: error, code: nil)) + return } + DispatchQueue.global(qos: .userInitiated).async { + do { + let decoder = JSONDecoder() + decoder.userInfo[.options] = options + let result = try decoder.decode(RouteResponse.self, from: data) + guard (result.code == nil && result.message == nil) || result.code == "Ok" else { + let apiError = Directions.informativeError(code: result.code, response: response, underlyingError: possibleError) + completionHandler(nil, nil, apiError) + return + } + result.routes?.forEach { + $0.accessToken = self.accessToken + $0.apiEndpoint = self.apiEndpoint + } + + DispatchQueue.main.async { + completionHandler(result.waypoints, result.routes, nil) + } + } catch { + DispatchQueue.main.async { + completionHandler(nil, nil, .unknown(response: nil, underlying: error, code: nil)) + } + } + + + } } + requestTask.priority = 1 + requestTask.resume() + + return requestTask + } // let fetchStartDate = Date() @@ -187,7 +228,7 @@ open class Directions: NSObject { // } // task.resume() // return task - } + /** Begins asynchronously calculating matches using the given options and delivers the results to a closure. @@ -373,38 +414,20 @@ open class Directions: NSObject { return .unknown(response: nil, underlying: error, code: code) } -// /** -// Adds request- or response-specific information to each result in a response. -// */ -// func postprocess(_ results: [DirectionsResult], fetchStartDate: Date, responseEndDate: Date, uuid: String?) { -// for result in results { -// result.accessToken = self.accessToken -// result.apiEndpoint = self.apiEndpoint -// result.routeIdentifier = uuid -// result.fetchStartDate = fetchStartDate -// result.responseEndDate = responseEndDate -// } -// } -} - -extension CodingUserInfoKey { - static let routeOptions = CodingUserInfoKey(rawValue: "options") -} - -/** - A JSONDecoder with an associated `RouteOptions` to use when decoding a directions response. - */ -public class DirectionsDecoder: JSONDecoder { - /** - Initializes a `DirectionsDecoder` with a given `RouteOption`. + Adds request- or response-specific information to each result in a response. */ - convenience public init(options: RouteOptions) { - self.init(userInfo: [CodingUserInfoKey.routeOptions!: options]) - } - - init(userInfo: [CodingUserInfoKey: Any]) { - super.init() - self.userInfo = userInfo + func postprocess(_ results: inout [DirectionsResult], fetchStartDate: Date, responseEndDate: Date, uuid: String?) { + for result in results { + result.accessToken = self.accessToken + result.apiEndpoint = self.apiEndpoint + result.routeIdentifier = uuid + result.fetchStartDate = fetchStartDate + result.responseEndDate = responseEndDate + } } } + +public extension CodingUserInfoKey { + static let options = CodingUserInfoKey(rawValue: "com.mapbox.directions.coding.routeOptions")! +} diff --git a/Sources/MapboxDirections/MBDirectionsOptions.swift b/Sources/MapboxDirections/MBDirectionsOptions.swift index bf5d0dd9c..724ce7e38 100644 --- a/Sources/MapboxDirections/MBDirectionsOptions.swift +++ b/Sources/MapboxDirections/MBDirectionsOptions.swift @@ -151,6 +151,8 @@ open class DirectionsOptions: Codable { // NSSecureCoding, NSCopying { distanceMeasurementSystem = try container.decode(MeasurementSystem.self, forKey: .distanceMeasurementSystem) includesVisualInstructions = try container.decode(Bool.self, forKey: .includesVisualInstructions) } + + /** An array of `Waypoint` objects representing locations that the route should visit in chronological order. @@ -257,11 +259,10 @@ open class DirectionsOptions: Codable { // NSSecureCoding, NSCopying { The query items are included in the URL of a GET request or the body of a POST request. */ - -} + // MARK: - URL Queries -internal extension DirectionsOptions { + var abridgedPath: String { assertionFailure("abridgedPath should be overriden by subclass") @@ -385,4 +386,12 @@ internal extension DirectionsOptions { return waypoints.map { $0.coordinate.requestDescription }.joined(separator: ";") } + internal var httpBody: String { + guard let coordinates = self.coordinates else { return "" } + var components = URLComponents() + components.queryItems = urlQueryItems + [ + URLQueryItem(name: "coordinates", value: coordinates), + ] + return components.percentEncodedQuery ?? "" + } } diff --git a/Sources/MapboxDirections/MBDirectionsResult.swift b/Sources/MapboxDirections/MBDirectionsResult.swift index ca16e7de3..c73879595 100644 --- a/Sources/MapboxDirections/MBDirectionsResult.swift +++ b/Sources/MapboxDirections/MBDirectionsResult.swift @@ -1,6 +1,7 @@ import Foundation -import Polyline +import struct Polyline.Polyline import CoreLocation +import struct Turf.LineString @@ -19,12 +20,11 @@ import CoreLocation */ open class DirectionsResult: Codable { - private enum CodingKeys: String, CodingKey { - case coordinates + case shape = "geometry" case legs case distance - case expectedTravelTime + case expectedTravelTime = "duration" case directionsOptions case accessToken case apiEndpoint @@ -32,23 +32,64 @@ open class DirectionsResult: Codable { case speechLocale } - public required init(from decoder: Decoder) throws { + + + public required init(from decoder: Decoder) throws { let container = try decoder.container(keyedBy: CodingKeys.self) - coordinates = try container.decodeIfPresent([CLLocationCoordinate2D].self, forKey: .coordinates) -// legs = try container.decode([RouteLeg.self], forKey: .legs) + legs = try container.decode([RouteLeg].self, forKey: .legs) distance = try container.decode(CLLocationDistance.self, forKey: .distance) expectedTravelTime = try container.decode(TimeInterval.self, forKey: .expectedTravelTime) - directionsOptions = try container.decode(DirectionsOptions.self, forKey: .directionsOptions) + + directionsOptions = try container.decodeIfPresent(DirectionsOptions.self, forKey: .directionsOptions) ?? decoder.userInfo[.options] as! DirectionsOptions + + + switch directionsOptions.shapeFormat { + + case .geoJSON: + shape = try container.decodeIfPresent(LineString.self, forKey: .shape) + + case .polyline: + guard let polyString = try container.decodeIfPresent(String.self, forKey: .shape) else { + shape = nil + break + } + let polyline = Polyline(encodedPolyline: polyString, precision: 1e5) + shape = LineString(polyline.coordinates!) + + case .polyline6: + guard let polyString = try container.decodeIfPresent(String.self, forKey: .shape) else { + shape = nil + break + } + let polyline = Polyline(encodedPolyline: polyString, precision: 1e6) + shape = LineString(polyline.coordinates!) + } + accessToken = try container.decodeIfPresent(String.self, forKey: .accessToken) apiEndpoint = try container.decodeIfPresent(URL.self, forKey: .apiEndpoint) routeIdentifier = try container.decodeIfPresent(String.self, forKey: .routeIdentifier) speechLocale = try container.decodeIfPresent(Locale.self, forKey: .speechLocale) } - public func encode(to encoder: Encoder) throws { + public func encode(to encoder: Encoder) throws { var container = encoder.container(keyedBy: CodingKeys.self) -// try container.encode(legs, forKey: .legs) - try container.encodeIfPresent(coordinates, forKey: .coordinates) + try container.encode(legs, forKey: .legs) + switch directionsOptions.shapeFormat { + + case .geoJSON: + try container.encode(shape, forKey: .shape) + + case .polyline: + let coordinates = shape!.coordinates + let polyString = Polyline(coordinates: coordinates, precision: 1e5).encodedPolyline + try container.encode(polyString, forKey: .shape) + + case .polyline6: + let coordinates = shape!.coordinates + let polyString = Polyline(coordinates: coordinates, precision: 1e6).encodedPolyline + try container.encode(polyString, forKey: .shape) + } + try container.encode(distance, forKey: .distance) try container.encode(expectedTravelTime, forKey: .expectedTravelTime) try container.encode(directionsOptions, forKey: .directionsOptions) @@ -56,15 +97,17 @@ open class DirectionsResult: Codable { try container.encodeIfPresent(apiEndpoint, forKey: .apiEndpoint) try container.encodeIfPresent(routeIdentifier, forKey: .routeIdentifier) try container.encodeIfPresent(speechLocale, forKey: .speechLocale) - - - - - - - + + + + + + + } + public let shape: LineString? + /** An array of geographic coordinates defining the path of the route from start to finish. @@ -72,9 +115,9 @@ open class DirectionsResult: Codable { Using the [Mapbox Maps SDK for iOS](https://docs.mapbox.com/ios/maps/) or [Mapbox Maps SDK for macOS](https://mapbox.github.io/mapbox-gl-native/macos/), you can create an `MGLPolyline` object using these coordinates to display an overview of the route on an `MGLMapView`. */ - public let coordinates: [CLLocationCoordinate2D]? + // public let coordinates: [CLLocationCoordinate2D]? + // - /** An array of `RouteLeg` objects representing the legs of the route. @@ -84,9 +127,9 @@ open class DirectionsResult: Codable { */ public let legs: [RouteLeg] -// open override var description: String { -// return legs.map { $0.name }.joined(separator: " – ") -// } + // open override var description: String { + // return legs.map { $0.name }.joined(separator: " – ") + // } // MARK: Getting Additional Route Details @@ -126,13 +169,7 @@ open class DirectionsResult: Codable { This property is set automatically if a request is made via `Directions.calculate(_:completionHandler:)`. */ open var apiEndpoint: URL? - - func debugQuickLookObject() -> Any? { - if let coordinates = coordinates { - return debugQuickLookURL(illustrating: coordinates, profileIdentifier: directionsOptions.profileIdentifier) - } - return nil - } + /** A unique identifier for a directions request. diff --git a/Sources/MapboxDirections/MBRoute.swift b/Sources/MapboxDirections/MBRoute.swift index d81b792be..cdaf96b8b 100644 --- a/Sources/MapboxDirections/MBRoute.swift +++ b/Sources/MapboxDirections/MBRoute.swift @@ -5,183 +5,17 @@ import Polyline Typically, you do not create instances of this class directly. Instead, you receive route objects when you request directions using the `Directions.calculate(_:completionHandler:)` method. However, if you use the `Directions.url(forCalculating:)` method instead, you can pass the results of the HTTP request into this class’s initializer. */ -@objc(MBRoute) -open class Route: NSObject, Codable { - - private enum CodingKeys: String, CodingKey { - case distance - case routeIdentifier - case legs - case v4steps = "steps" - case v4summary = "summary" - case expectedTravelTime = "duration" - case routeOptions - case geometry - } - - public func encode(to encoder: Encoder) throws { - var container = encoder.container(keyedBy: CodingKeys.self) - try container.encode(legs, forKey: .legs) - try container.encode(distance, forKey: .distance) - try container.encode(expectedTravelTime, forKey: .expectedTravelTime) - try container.encode(routeOptions, forKey: .routeOptions) - } - + +open class Route: DirectionsResult { public required init(from decoder: Decoder) throws { - let container = try decoder.container(keyedBy: CodingKeys.self) - - if let routeOptions = try container.decodeIfPresent(RouteOptions.self, forKey: .routeOptions) { - self.routeOptions = routeOptions - } else { - self.routeOptions = decoder.userInfo[CodingUserInfoKey.routeOptions!] as! RouteOptions - } - - let geometry = try container.decodeIfPresent(UncertainCodable.self, forKey: .geometry) - if let geo = geometry?.value as? String { - coordinates = decodePolyline(geo, precision: 1e5) - } else if let geo = geometry?.value as? Geometry { - coordinates = geo.coordinates - } else { - coordinates = nil - } - - distance = try container.decode(CLLocationDistance.self, forKey: .distance) - expectedTravelTime = try container.decode(TimeInterval.self, forKey: .expectedTravelTime) - - if let legs = try container.decodeIfPresent([RouteLeg].self, forKey: .legs) { - self.legs = legs - } else { - // V4 - let legName = try container.decodeIfPresent(String.self, forKey: .v4summary) ?? "" - let steps = try container.decodeIfPresent([RouteStep].self, forKey: .v4steps) - self.legs = [RouteLeg(steps: steps!, source: routeOptions.waypoints.first!, - destination: routeOptions.waypoints.last!, name: legName, distance: distance, - expectedTravelTime: expectedTravelTime, profileIdentifier: routeOptions.profileIdentifier)] - } - - // Associate each leg JSON with a source and destination. The sequence of destinations is offset by one from the sequence of sources. - let waypoints = routeOptions.waypoints - let legInfos = zip(zip(waypoints.prefix(upTo: waypoints.endIndex - 1), waypoints.suffix(from: 1)), legs) - for legInfo in legInfos { - legInfo.1.source = legInfo.0.0 - legInfo.1.destination = legInfo.0.1 - } - } - - // MARK: Creating a Route - - internal init(routeOptions: RouteOptions, legs: [RouteLeg], distance: CLLocationDistance, expectedTravelTime: TimeInterval, coordinates: [CLLocationCoordinate2D]?) { - self.routeOptions = routeOptions - self.legs = legs - self.distance = distance - self.expectedTravelTime = expectedTravelTime - self.coordinates = coordinates - } - - // MARK: Getting the Route Geometry - - /** - An array of geographic coordinates defining the path of the route from start to finish. - - This array may be `nil` or simplified depending on the `routeShapeResolution` property of the original `RouteOptions` object. - - Using the [Mapbox Maps SDK for iOS](https://www.mapbox.com/ios-sdk/) or [Mapbox Maps SDK for macOS](https://github.com/mapbox/mapbox-gl-native/tree/master/platform/macos/), you can create an `MGLPolyline` object using these coordinates to display an overview of the route on an `MGLMapView`. - */ - public let coordinates: [CLLocationCoordinate2D]? - - /** - The number of coordinates. - - The value of this property may be zero or reduced depending on the `routeShapeResolution` property of the original `RouteOptions` object. - - - note: This initializer is intended for Objective-C usage. In Swift code, use the `coordinates.count` property. - */ - open var coordinateCount: UInt { - return UInt(coordinates?.count ?? 0) - } - - /** - Retrieves the coordinates. - - The array may be empty or simplified depending on the `routeShapeResolution` property of the original `RouteOptions` object. - - Using the [Mapbox Maps SDK for iOS](https://www.mapbox.com/ios-sdk/) or [Mapbox Maps SDK for macOS](https://github.com/mapbox/mapbox-gl-native/tree/master/platform/macos/), you can create an `MGLPolyline` object using these coordinates to display an overview of the route on an `MGLMapView`. - - - parameter coordinates: A pointer to a C array of `CLLocationCoordinate2D` instances. On output, this array contains all the vertices of the overlay. - - - precondition: `coordinates` must be large enough to hold `coordinateCount` instances of `CLLocationCoordinate2D`. - - - note: This initializer is intended for Objective-C usage. In Swift code, use the `coordinates` property. - */ - open func getCoordinates(_ coordinates: UnsafeMutablePointer) { - for i in 0..<(self.coordinates?.count ?? 0) { - coordinates.advanced(by: i).pointee = self.coordinates![i] - } - } - - /** - An array of `RouteLeg` objects representing the legs of the route. - - The number of legs in this array depends on the number of waypoints. A route with two waypoints (the source and destination) has one leg, a route with three waypoints (the source, an intermediate waypoint, and the destination) has two legs, and so on. - - To determine the name of the route, concatenate the names of the route’s legs. - */ - public let legs: [RouteLeg] - - open override var description: String { - return legs.map { $0.name }.joined(separator: " – ") + try super.init(from: decoder) } - // MARK: Getting Additional Route Details - - /** - The route’s distance, measured in meters. - - The value of this property accounts for the distance that the user must travel to traverse the path of the route. It is the sum of the `distance` properties of the route’s legs, not the sum of the direct distances between the route’s waypoints. You should not assume that the user would travel along this distance at a fixed speed. - */ - public let distance: CLLocationDistance - - /** - The route’s expected travel time, measured in seconds. - - The value of this property reflects the time it takes to traverse the entire route. It is the sum of the `expectedTravelTime` properties of the route’s legs. If the route was calculated using the `MBDirectionsProfileIdentifierAutomobileAvoidingTraffic` profile, this property reflects current traffic conditions at the time of the request, not necessarily the traffic conditions at the time the user would begin the route. For other profiles, this property reflects travel time under ideal conditions and does not account for traffic congestion. If the route makes use of a ferry or train, the actual travel time may additionally be subject to the schedules of those services. - - Do not assume that the user would travel along the route at a fixed speed. For more granular travel times, use the `RouteLeg.expectedTravelTime` or `RouteStep.expectedTravelTime`. For even more granularity, specify the `AttributeOptions.expectedTravelTime` option and use the `RouteLeg.expectedSegmentTravelTimes` property. - */ - public let expectedTravelTime: TimeInterval - - /** - `RouteOptions` used to create the directions request. - - The route options object’s profileIdentifier property reflects the primary mode of transportation used for the route. Individual steps along the route might use different modes of transportation as necessary. - */ - public let routeOptions: RouteOptions - - /** - The [access token](https://www.mapbox.com/help/define-access-token/) used to make the directions request. - - This property is set automatically if a request is made via `Directions.calculate(_:completionHandler:)`. - */ - open var accessToken: String? - - /** - The endpoint used to make the directions request. - - This property is set automatically if a request is made via `Directions.calculate(_:completionHandler:)`. - */ - open var apiEndpoint: URL? - - func debugQuickLookObject() -> Any? { - if let coordinates = coordinates { - return debugQuickLookURL(illustrating: coordinates, profileIdentifier: routeOptions.profileIdentifier) - } - return nil + public override func encode(to encoder: Encoder) throws { + try super.encode(to: encoder) } - /** - A unique identifier for a directions request. - - Each route produced by a single call to `Directions.calculate(_:completionHandler:)` has the same route identifier. - */ - open var routeIdentifier: String? + public var routeOptions: RouteOptions { + return super.directionsOptions as! RouteOptions + } } diff --git a/Sources/MapboxDirections/MBRouteLeg.swift b/Sources/MapboxDirections/MBRouteLeg.swift index 7ee34405d..fe73acfd7 100644 --- a/Sources/MapboxDirections/MBRouteLeg.swift +++ b/Sources/MapboxDirections/MBRouteLeg.swift @@ -28,7 +28,7 @@ open class RouteLeg: Codable { public required init(from decoder: Decoder) throws { - var container = try decoder.container(keyedBy: CodingKeys.self) + let container = try decoder.container(keyedBy: CodingKeys.self) source = try container.decode(Waypoint.self, forKey: .source) destination = try container.decode(Waypoint.self, forKey: .destination) steps = try container.decode([RouteStep].self, forKey: .steps) @@ -37,9 +37,9 @@ open class RouteLeg: Codable { segmentSpeeds = try container.decodeIfPresent([CLLocationSpeed].self, forKey: .segmentSpeeds) segmentCongestionLevels = try container.decodeIfPresent([CongestionLevel].self, forKey: .segmentCongestionLevels) name = try container.decode(String.self, forKey: .name) - distance = container.decode(CLLocationDistance.self, forKey: .distance) - expectedTravelTime = container.decode(TimeInterval.self, forKey: .expectedTravelTime) - profileIdentifier = container.decode(DirectionsProfileIdentifier.self, forKey: .profileIdentifier) + distance = try container.decode(CLLocationDistance.self, forKey: .distance) + expectedTravelTime = try container.decode(TimeInterval.self, forKey: .expectedTravelTime) + profileIdentifier = try container.decode(DirectionsProfileIdentifier.self, forKey: .profileIdentifier) } public func encode(to encoder: Encoder) throws { var container = encoder.container(keyedBy: CodingKeys.self) @@ -169,7 +169,7 @@ open class RouteLeg: Codable { Unless this is the first leg of the route, the source of this leg is the same as the destination of the previous leg. */ - public let source: Waypoint + public var source: Waypoint /** The endpoint of the route leg. @@ -235,9 +235,6 @@ open class RouteLeg: Codable { */ public let name: String - open override var description: String { - return name - } /** The route leg’s distance, measured in meters. @@ -261,12 +258,4 @@ open class RouteLeg: Codable { The value of this property is `MBDirectionsProfileIdentifierAutomobile`, `MBDirectionsProfileIdentifierAutomobileAvoidingTraffic`, `MBDirectionsProfileIdentifierCycling`, or `MBDirectionsProfileIdentifierWalking`, depending on the `profileIdentifier` property of the original `RouteOptions` object. This property reflects the primary mode of transportation used for the route leg. Individual steps along the route leg might use different modes of transportation as necessary. */ public let profileIdentifier: DirectionsProfileIdentifier - - func debugQuickLookObject() -> Any? { - let coordinates = steps.reduce([], { $0 + ($1.coordinates ?? []) }) - guard !coordinates.isEmpty else { - return nil - } - return debugQuickLookURL(illustrating: coordinates) - } } diff --git a/Sources/MapboxDirections/MBRouteOptions.swift b/Sources/MapboxDirections/MBRouteOptions.swift index 9f3212a9e..9d4c8f4de 100644 --- a/Sources/MapboxDirections/MBRouteOptions.swift +++ b/Sources/MapboxDirections/MBRouteOptions.swift @@ -15,9 +15,9 @@ open class RouteOptions: DirectionsOptions { */ public required init(waypoints: [Waypoint], profileIdentifier: DirectionsProfileIdentifier? = nil) { - super.init(waypoints: waypoints, profileIdentifier: profileIdentifier) let profilesDisallowingUTurns: [DirectionsProfileIdentifier] = [.automobile, .automobileAvoidingTraffic] - self.allowsUTurnAtWaypoint = !profilesDisallowingUTurns.contains(self.profileIdentifier) + allowsUTurnAtWaypoint = !profilesDisallowingUTurns.contains(profileIdentifier ?? .automobile) + super.init(waypoints: waypoints, profileIdentifier: profileIdentifier) } /** @@ -69,7 +69,6 @@ open class RouteOptions: DirectionsOptions { } public required init(from decoder: Decoder) throws { - try super.init(from: decoder) let container = try decoder.container(keyedBy: CodingKeys.self) allowsUTurnAtWaypoint = try container.decode(Bool.self, forKey: .allowsUTurnAtWaypoint) @@ -78,6 +77,7 @@ open class RouteOptions: DirectionsOptions { includesExitRoundaboutManeuver = try container.decode(Bool.self, forKey: .includesExitRoundaboutManeuver) roadClassesToAvoid = try container.decode(RoadClasses.self, forKey: .roadClassesToAvoid) + try super.init(from: decoder) } // MARK: Specifying the Path of the Route diff --git a/Sources/MapboxDirections/MBRouteStep.swift b/Sources/MapboxDirections/MBRouteStep.swift index 6881d9d16..8d6a91c4d 100644 --- a/Sources/MapboxDirections/MBRouteStep.swift +++ b/Sources/MapboxDirections/MBRouteStep.swift @@ -7,7 +7,7 @@ import Polyline A `TransportType` specifies the mode of transportation used for part of a route. */ -public enum TransportType: String { +public enum TransportType: String, Codable { // Possible transport types when the `profileIdentifier` is `MBDirectionsProfileIdentifierAutomobile` or `MBDirectionsProfileIdentifierAutomobileAvoidingTraffic` /** @@ -330,502 +330,343 @@ struct Road { You do not create instances of this class directly. Instead, you receive route step objects as part of route objects when you request directions using the `Directions.calculate(_:completionHandler:)` method, setting the `includesSteps` option to `true` in the `RouteOptions` object that you pass into that method. */ -open class RouteStep: NSObject, NSSecureCoding { - // MARK: Creating a Step - -// internal init(finalHeading: CLLocationDirection?, maneuverType: ManeuverType, maneuverDirection: ManeuverDirection, drivingSide: DrivingSide, maneuverLocation: CLLocationCoordinate2D, name: String, coordinates: [CLLocationCoordinate2D]?, json: JSONDictionary) { -// transportType = TransportType(description: json["mode"] as! String) ?? .none -// -// let road = Road(name: name, ref: json["ref"] as? String, exits: json["exits"] as? String, destination: json["destinations"] as? String, rotaryName: json["rotary_name"] as? String) -// if maneuverType == .takeRotary || maneuverType == .takeRoundabout { -// names = road.rotaryNames -// phoneticNames = (json["rotary_pronunciation"] as? String)?.tagValues(separatedBy: ";") -// exitNames = road.names -// phoneticExitNames = (json["pronunciation"] as? String)?.tagValues(separatedBy: ";") -// } else { -// names = road.names -// phoneticNames = (json["pronunciation"] as? String)?.tagValues(separatedBy: ";") -// exitNames = nil -// phoneticExitNames = nil -// } -// exitCodes = road.exitCodes -// codes = road.codes -// destinationCodes = road.destinationCodes -// destinations = road.destinations -// -// let maneuver = json["maneuver"] as! JSONDictionary -// -// if let instructions = maneuver["instruction"] as? String { -// self.instructions = instructions -// } else if maneuverType != .none, maneuverDirection != .none { -// instructions = "\(maneuverType) \(maneuverDirection)" -// } else if maneuverType != .none { -// instructions = String(describing: maneuverType) -// } else if maneuverDirection != .none { -// instructions = String(describing: maneuverDirection) -// } else { -// instructions = "" -// } -// -// distance = json["distance"] as? Double ?? 0 -// expectedTravelTime = json["duration"] as? Double ?? 0 -// -// let intersectionsJSON = json["intersections"] as? [JSONDictionary] -// self.intersections = intersectionsJSON?.map { Intersection(json: $0) } -// -// let voiceInstructionsJSON = json["voiceInstructions"] as? [JSONDictionary] -// self.instructionsSpokenAlongStep = voiceInstructionsJSON?.map { SpokenInstruction(json: $0) } -// -// let instructionsDisplayedAlongStep = json["bannerInstructions"] as? [JSONDictionary] -// self.instructionsDisplayedAlongStep = instructionsDisplayedAlongStep?.map { VisualInstructionBanner(json: $0, drivingSide: drivingSide) } -// -// initialHeading = maneuver["bearing_before"] as? Double -// self.finalHeading = finalHeading -// self.maneuverType = maneuverType -// self.maneuverDirection = maneuverDirection -// exitIndex = maneuver["exit"] as? Int -// -// self.maneuverLocation = maneuverLocation -// self.coordinates = coordinates -// self.drivingSide = drivingSide -// } - - /** - Initializes a new route step object based on the given JSON dictionary representation. - - Normally, you do not create instances of this class directly. Instead, you receive route step objects as part of route objects when you request directions using the `Directions.calculateDirections(options:completionHandler:)` method, setting the `includesSteps` option to `true` in the `RouteOptions` object that you pass into that method. - - - parameter json: A JSON object that conforms to the [route step](https://docs.mapbox.com/api/navigation/#route-step-object) format described in the Directions API documentation. - */ - -// public convenience init(json: [String: Any], options: RouteOptions) { -// let maneuver = json["maneuver"] as! JSONDictionary -// let finalHeading = maneuver["bearing_after"] as? Double -// let maneuverType = ManeuverType(description: maneuver["type"] as? String ?? "") ?? .none -// let maneuverDirection = ManeuverDirection(description: maneuver["modifier"] as? String ?? "") ?? .none -// let maneuverLocation = CLLocationCoordinate2D(geoJSON: maneuver["location"] as! [Double]) -// let drivingSide = DrivingSide(description: json["driving_side"] as? String ?? "") ?? .right -// -// let name = json["name"] as! String -// -// let coordinates = options.shapeFormat.coordinates(from: json["geometry"]) -// -// self.init(finalHeading: finalHeading, maneuverType: maneuverType, maneuverDirection: maneuverDirection, drivingSide: drivingSide, maneuverLocation: maneuverLocation, name: name, coordinates: coordinates, json: json) -// } -// -// public required init?(coder decoder: NSCoder) { -// let coordinateDictionaries = decoder.decodeObject(of: [NSArray.self, NSDictionary.self, NSString.self, NSNumber.self], forKey: "coordinates") as? [[String: CLLocationDegrees]] -// -// coordinates = coordinateDictionaries?.compactMap({ (coordinateDictionary) -> CLLocationCoordinate2D? in -// if let latitude = coordinateDictionary["latitude"], let longitude = coordinateDictionary["longitude"] { -// return CLLocationCoordinate2D(latitude: latitude, longitude: longitude) -// } else { -// return nil -// } -// }) -// -// guard let decodedInstructions = decoder.decodeObject(of: NSString.self, forKey: "instructions") as String? else { -// return nil -// } -// instructions = decodedInstructions -// -// initialHeading = decoder.containsValue(forKey: "initialHeading") ? decoder.decodeDouble(forKey: "initialHeading") : nil -// finalHeading = decoder.containsValue(forKey: "finalHeading") ? decoder.decodeDouble(forKey: "finalHeading") : nil -// -// guard let maneuverTypeDescription = decoder.decodeObject(of: NSString.self, forKey: "maneuverType") as String? else { -// return nil -// } -// maneuverType = ManeuverType(description: maneuverTypeDescription) ?? .none -// -// let maneuverDirectionDescription = decoder.decodeObject(of: NSString.self, forKey: "maneuverDirection")! as String -// maneuverDirection = ManeuverDirection(description: maneuverDirectionDescription) ?? .none -// -// if let drivingSideDescription = decoder.decodeObject(of: NSString.self, forKey: "drivingSide") as String?, let drivingSide = DrivingSide(description: drivingSideDescription) { -// self.drivingSide = drivingSide -// } else { -// self.drivingSide = .right -// } -// -// if let maneuverLocationDictionary = decoder.decodeObject(of: [NSDictionary.self, NSString.self, NSNumber.self], forKey: "maneuverLocation") as? [String: CLLocationDegrees], -// let latitude = maneuverLocationDictionary["latitude"], -// let longitude = maneuverLocationDictionary["longitude"] { -// maneuverLocation = CLLocationCoordinate2D(latitude: latitude, longitude: longitude) -// } else { -// maneuverLocation = kCLLocationCoordinate2DInvalid -// } -// -// exitIndex = decoder.containsValue(forKey: "exitIndex") ? decoder.decodeInteger(forKey: "exitIndex") : nil -// exitCodes = decoder.decodeObject(of: [NSArray.self, NSString.self], forKey: "exitCodes") as? [String] -// exitNames = decoder.decodeObject(of: [NSArray.self, NSString.self], forKey: "exitNames") as? [String] -// phoneticExitNames = decoder.decodeObject(of: [NSArray.self, NSString.self], forKey: "phoneticExitNames") as? [String] -// distance = decoder.decodeDouble(forKey: "distance") -// expectedTravelTime = decoder.decodeDouble(forKey: "expectedTravelTime") -// names = decoder.decodeObject(of: [NSArray.self, NSString.self], forKey: "names") as? [String] -// phoneticNames = decoder.decodeObject(of: [NSArray.self, NSString.self], forKey: "phoneticNames") as? [String] -// -// guard let transportTypeDescription = decoder.decodeObject(of: NSString.self, forKey: "transportType") as String? else { -// return nil -// } -// transportType = TransportType(description: transportTypeDescription) ?? .none -// -// codes = decoder.decodeObject(of: [NSArray.self, NSString.self], forKey: "codes") as? [String] -// destinationCodes = decoder.decodeObject(of: [NSArray.self, NSString.self], forKey: "destinationCodes") as? [String] -// destinations = decoder.decodeObject(of: [NSArray.self, NSString.self], forKey: "destinations") as? [String] -// -// intersections = decoder.decodeObject(of: [NSArray.self, Intersection.self], forKey: "intersections") as? [Intersection] -// -// instructionsSpokenAlongStep = decoder.decodeObject(of: [NSArray.self, SpokenInstruction.self], forKey: "instructionsSpokenAlongStep") as? [SpokenInstruction] -// -// instructionsDisplayedAlongStep = decoder.decodeObject(of: [NSArray.self, VisualInstructionBanner.self], forKey: "instructionsDisplayedAlongStep") as? [VisualInstructionBanner] -// } -// -// public static var supportsSecureCoding = true -// -// public func encode(with coder: NSCoder) { -// let coordinateDictionaries = coordinates?.map { [ -// "latitude": $0.latitude, -// "longitude": $0.longitude, -// ] } -// coder.encode(coordinateDictionaries, forKey: "coordinates") -// -// coder.encode(instructions, forKey: "instructions") -// -// if let initialHeading = initialHeading { -// coder.encode(initialHeading, forKey: "initialHeading") -// } -// if let finalHeading = finalHeading { -// coder.encode(finalHeading, forKey: "finalHeading") -// } -// -// coder.encode(maneuverType.description, forKey: "maneuverType") -// coder.encode(maneuverDirection.description, forKey: "maneuverDirection") -// coder.encode(drivingSide.description, forKey: "drivingSide") -// -// coder.encode(intersections, forKey: "intersections") -// -// coder.encode([ -// "latitude": maneuverLocation.latitude, -// "longitude": maneuverLocation.longitude, -// ], forKey: "maneuverLocation") -// -// if let exitIndex = exitIndex { -// coder.encode(exitIndex, forKey: "exitIndex") -// } -// -// coder.encode(exitCodes, forKey: "exitCodes") -// coder.encode(exitNames, forKey: "exitNames") -// coder.encode(phoneticExitNames, forKey: "phoneticExitNames") -// coder.encode(distance, forKey: "distance") -// coder.encode(expectedTravelTime, forKey: "expectedTravelTime") -// coder.encode(names, forKey: "names") -// coder.encode(phoneticNames, forKey: "phoneticNames") -// coder.encode(transportType.description, forKey: "transportType") -// coder.encode(codes, forKey: "codes") -// coder.encode(destinationCodes, forKey: "destinationCodes") -// coder.encode(destinations, forKey: "destinations") -// coder.encode(instructionsSpokenAlongStep, forKey: "instructionsSpokenAlongStep") -// coder.encode(instructionsDisplayedAlongStep, forKey: "instructionsDisplayedAlongStep") -// } - - // MARK: Getting the Step Geometry - - /** - An array of geographic coordinates defining the path of the route step from the location of the maneuver to the location of the next step’s maneuver. - - The value of this property may be `nil`, for example when the maneuver type is `arrive`. - - Using the [Mapbox Maps SDK for iOS](https://docs.mapbox.com/ios/maps/) or [Mapbox Maps SDK for macOS](https://mapbox.github.io/mapbox-gl-native/macos/), you can create an `MGLPolyline` object using these coordinates to display a portion of a route on an `MGLMapView`. - */ - public let coordinates: [CLLocationCoordinate2D]? - - /** - The number of coordinates. +import Polyline - The value of this property may be zero, for example when the maneuver type is `arrive`. - - note: This initializer is intended for Objective-C usage. In Swift code, use the `coordinates.count` property. - */ - open var coordinateCount: UInt { - return UInt(coordinates?.count ?? 0) +/** + A `RouteStep` object represents a single distinct maneuver along a route and the approach to the next maneuver. The route step object corresponds to a single instruction the user must follow to complete a portion of the route. For example, a step might require the user to turn then follow a road. + + You do not create instances of this class directly. Instead, you receive route step objects as part of route objects when you request directions using the `Directions.calculate(_:completionHandler:)` method, setting the `includesSteps` option to `true` in the `RouteOptions` object that you pass into that method. + */ +@objc(MBRouteStep) +open class RouteStep: NSObject, Codable { + + private enum CodingKeys: String, CodingKey { + case codes + case geometry + case destinationCodes + case destinations + case distance + case drivingSide = "driving_side" + case exitCodes + case exitIndex + case exitNames + case expectedTravelTime = "duration" + case instructions + case instructionsDisplayedAlongStep = "bannerInstructions" + case instructionsSpokenAlongStep = "voiceInstructions" + case intersections + case maneuver + case name + case v4wayName = "way_name" + case ref + case exits + case phoneticExitNames = "pronunciation" + case phoneticNames = "rotary_pronunciation" + case transportType + case rotaryName = "rotary_name" } - - /** - Retrieves the coordinates. - - The array may be empty, for example when the maneuver type is `arrive`. - - Using the [Mapbox Maps SDK for iOS](https://docs.mapbox.com/ios/maps/) or [Mapbox Maps SDK for macOS](https://mapbox.github.io/mapbox-gl-native/macos/), you can create an `MGLPolyline` object using these coordinates to display a portion of a route on an `MGLMapView`. - - - parameter coordinates: A pointer to a C array of `CLLocationCoordinate2D` instances. On output, this array contains all the vertices of the overlay. - - returns: True if the step has coordinates and `coordinates` has been populated, or false if the step has no coordinates and `coordinates` has not been modified. - - - precondition: `coordinates` must be large enough to hold `coordinateCount` instances of `CLLocationCoordinate2D`. - - - note: This initializer is intended for Objective-C usage. In Swift code, use the `coordinates` property. - */ - open func getCoordinates(_ coordinates: UnsafeMutablePointer) -> Bool { - guard let stepCoordinates = self.coordinates else { - return false + + private enum ManeuverCodingKeys: String, CodingKey { + case instruction + case location + case type + case direction = "modifier" + case initialHeading = "bearing_before" + case finalHeading = "bearing_after" + } + + public func encode(to encoder: Encoder) throws { + var container = encoder.container(keyedBy: CodingKeys.self) + try container.encode(instructionsSpokenAlongStep, forKey: .instructionsSpokenAlongStep) + try container.encode(instructionsDisplayedAlongStep, forKey: .instructionsDisplayedAlongStep) + try container.encode(exitIndex, forKey: .exitIndex) + try container.encode(exitCodes, forKey: .exitCodes) + try container.encode(exitNames, forKey: .exitNames) + try container.encode(phoneticExitNames, forKey: .phoneticExitNames) + try container.encode(phoneticNames, forKey: .phoneticNames) + try container.encode(distance, forKey: .distance) + try container.encode(expectedTravelTime, forKey: .expectedTravelTime) + try container.encode(codes, forKey: .codes) + try container.encode(transportType, forKey: .transportType) + try container.encode(destinationCodes, forKey: .destinationCodes) + try container.encode(destinations, forKey: .destinations) + try container.encode(intersections, forKey: .intersections) + try container.encode(drivingSide, forKey: .drivingSide) + try container.encode(name, forKey: .name) + try container.encode(geometry, forKey: .geometry) + + var maneuver = container.nestedContainer(keyedBy: ManeuverCodingKeys.self, forKey: .maneuver) + try maneuver.encode(instructions, forKey: .instruction) + try maneuver.encodeIfPresent(maneuverType, forKey: .type) + try maneuver.encodeIfPresent(maneuverDirection, forKey: .direction) + try maneuver.encodeIfPresent(maneuverLocation, forKey: .location) + try maneuver.encodeIfPresent(initialHeading, forKey: .initialHeading) + try maneuver.encodeIfPresent(finalHeading, forKey: .finalHeading) + } + + public required init(from decoder: Decoder) throws { + let container = try decoder.container(keyedBy: CodingKeys.self) + let maneuver = try container.nestedContainer(keyedBy: ManeuverCodingKeys.self, forKey: .maneuver) + + if let coordinate = try? maneuver.decode(CLLocationCoordinate2D.self, forKey: .location) { + maneuverLocation = coordinate + } else if let coordinate = try? maneuver.decode(UncertainCodable.self, forKey: .location).coordinates.first, + let maneuverCoordinate = coordinate { + // V4 + maneuverLocation = maneuverCoordinate + } else { + maneuverLocation = CLLocationCoordinate2D() } - for i in 0...self, forKey: .geometry) + coordinates = geometry?.coordinates + + name = try container.decode(String.self, forKey: .name) + + let road = Road(name: name, + ref: try container.decodeIfPresent(String.self, forKey: .ref), + exits: try container.decodeIfPresent(String.self, forKey: .exits), + destination: try container.decodeIfPresent(String.self, forKey: .destinations), + rotaryName: try container.decodeIfPresent(String.self, forKey: .rotaryName)) + + if let instruction = try? maneuver.decode(String.self, forKey: .instruction) { + instructions = instruction + } else if maneuverType != .none, maneuverDirection != .none { + instructions = "\(maneuverType) \(maneuverDirection)" + } else if maneuverType != .none { + instructions = String(describing: maneuverType) + } else if maneuverDirection != .none { + instructions = String(describing: maneuverDirection) + } else { + instructions = "" + } + drivingSide = try container.decode(DrivingSide.self, forKey: .drivingSide) + (decoder as? JSONDecoder)?.userInfo[.drivingSide] = drivingSide + instructionsSpokenAlongStep = try container.decodeIfPresent([SpokenInstruction].self, forKey: .instructionsSpokenAlongStep) + + instructionsDisplayedAlongStep = try container.decodeIfPresent([VisualInstructionBanner].self, forKey: .instructionsDisplayedAlongStep) + + exitIndex = try container.decodeIfPresent(Int.self, forKey: .exitIndex) + exitCodes = try container.decodeIfPresent([String].self, forKey: .exitCodes) + distance = try container.decode(CLLocationDirection.self, forKey: .distance) + expectedTravelTime = try container.decode(TimeInterval.self, forKey: .expectedTravelTime) + + codes = road.codes + transportType = try container.decodeIfPresent(TransportType.self, forKey: .transportType) ?? .none + destinationCodes = road.destinationCodes + + intersections = try container.decodeIfPresent([Intersection].self, forKey: .intersections) + + destinations = road.destinations + + let mType = maneuverType + if mType != .none, + mType == .takeRotary || mType == .takeRoundabout { + names = road.rotaryNames + phoneticNames = try container.decodeIfPresent(String.self, forKey: .phoneticNames)?.tagValues(separatedBy: ";") + exitNames = road.names + phoneticExitNames = try container.decodeIfPresent(String.self, forKey: .phoneticExitNames)?.tagValues(separatedBy: ";") + } else { + names = road.names + phoneticNames = try container.decodeIfPresent(String.self, forKey: .phoneticNames)?.tagValues(separatedBy: ";") + exitNames = nil + phoneticExitNames = nil } - return true } - + + // MARK: Getting the Step Geometry + + /** + An array of geographic coordinates defining the path of the route step from the location of the maneuver to the location of the next step’s maneuver. + + The value of this property may be `nil`, for example when the maneuver type is `arrive`. + + Using the [Mapbox Maps SDK for iOS](https://www.mapbox.com/ios-sdk/) or [Mapbox Maps SDK for macOS](https://github.com/mapbox/mapbox-gl-native/tree/master/platform/macos/), you can create an `MGLPolyline` object using these coordinates to display a portion of a route on an `MGLMapView`. + */ + public let coordinates: [CLLocationCoordinate2D]? + + // MARK: Getting Details About the Maneuver - + /** A string with instructions explaining how to perform the step’s maneuver. - + You can display this string or read it aloud to the user. The string does not include the distance to or from the maneuver. For instructions optimized for real-time delivery during turn-by-turn navigation, set the `RouteOptions.includesSpokenInstructions` option and use the `instructionsSpokenAlongStep` property. If you need customized instructions, you can construct them yourself from the step’s other properties or use [OSRM Text Instructions](https://github.com/Project-OSRM/osrm-text-instructions.swift/). - + - note: If you use MapboxDirections.swift with the Mapbox Directions API, this property is formatted and localized for display to the user. If you use OSRM directly, this property contains a basic string that only includes the maneuver type and direction. Use [OSRM Text Instructions](https://github.com/Project-OSRM/osrm-text-instructions.swift/) to construct a complete, localized instruction string for display. */ public let instructions: String - + + fileprivate let name: String + + fileprivate var geometry: UncertainCodable? + /** Instructions about the next step’s maneuver, optimized for speech synthesis. - + As the user traverses this step, you can give them advance notice of the upcoming maneuver by reading aloud each item in this array in order as the user reaches the specified distances along this step. The text of the spoken instructions refers to the details in the next step, but the distances are measured from the beginning of this step. - + This property is non-`nil` if the `RouteOptions.includesSpokenInstructions` option is set to `true`. For instructions designed for display, use the `instructions` property. */ public let instructionsSpokenAlongStep: [SpokenInstruction]? - - /** + + /** Instructions about the next step’s maneuver, optimized for display in real time. - As the user traverses this step, you can give them advance notice of the upcoming maneuver by displaying each item in this array in order as the user reaches the specified distances along this step. The text and images of the visual instructions refer to the details in the next step, but the distances are measured from the beginning of this step. - This property is non-`nil` if the `RouteOptions.includesVisualInstructions` option is set to `true`. For instructions designed for speech synthesis, use the `instructionsSpokenAlongStep` property. For instructions designed for display in a static list, use the `instructions` property. */ public let instructionsDisplayedAlongStep: [VisualInstructionBanner]? - open override var description: String { - return instructions - } - + /** The user’s heading immediately before performing the maneuver. */ public let initialHeading: CLLocationDirection? - + /** The user’s heading immediately after performing the maneuver. - + The value of this property may differ from the user’s heading after traveling along the road past the maneuver. */ public let finalHeading: CLLocationDirection? - + /** The type of maneuver required for beginning this step. */ public let maneuverType: ManeuverType - + /** Additional directional information to clarify the maneuver type. */ public let maneuverDirection: ManeuverDirection - + /** - Which side of a bidirectional road the driver should drive on, also known as the rule of the road. + Indicates what side of a bidirectional road the driver must be driving on. Also referred to as the rule of the road. */ public let drivingSide: DrivingSide - + /** The location of the maneuver at the beginning of this step. */ - public let maneuverLocation: CLLocationCoordinate2D - + @objc public let maneuverLocation: CLLocationCoordinate2D + /** The number of exits from the previous maneuver up to and including this step’s maneuver. - + If the maneuver takes place on a surface street, this property counts intersections. The number of intersections does not necessarily correspond to the number of blocks. If the maneuver takes place on a grade-separated highway (freeway or motorway), this property counts highway exits but not highway entrances. If the maneuver is a roundabout maneuver, the exit index is the number of exits from the approach to the recommended outlet. For the signposted exit numbers associated with a highway exit, use the `exitCodes` property. - + In some cases, the number of exits leading to a maneuver may be more useful to the user than the distance to the maneuver. */ public let exitIndex: Int? - + /** Any [exit numbers](https://en.wikipedia.org/wiki/Exit_number) assigned to the highway exit at the maneuver. - + This property is only set when the `maneuverType` is `ManeuverType.takeOffRamp`. For the number of exits from the previous maneuver, regardless of the highway’s exit numbering scheme, use the `exitIndex` property. For the route reference codes associated with the connecting road, use the `destinationCodes` property. For the names associated with a roundabout exit, use the `exitNames` property. - + An exit number is an alphanumeric identifier posted at or ahead of a highway off-ramp. Exit numbers may increase or decrease sequentially along a road, or they may correspond to distances from either end of the road. An alphabetic suffix may appear when multiple exits are located in the same interchange. If multiple exits are [combined into a single exit](https://en.wikipedia.org/wiki/Local-express_lanes#Example_of_cloverleaf_interchanges), the step may have multiple exit codes. */ public let exitCodes: [String]? - + /** The names of the roundabout exit. - + This property is only set for roundabout (traffic circle or rotary) maneuvers. For the signposted names associated with a highway exit, use the `destinations` property. For the signposted exit numbers, use the `exitCodes` property. - + If you display a name to the user, you may need to abbreviate common words like “East” or “Boulevard” to ensure that it fits in the allotted space. */ public let exitNames: [String]? - + /** A phonetic or phonemic transcription indicating how to pronounce the names in the `exitNames` property. - + This property is only set for roundabout (traffic circle or rotary) maneuvers. - + The transcription is written in the [International Phonetic Alphabet](https://en.wikipedia.org/wiki/International_Phonetic_Alphabet). */ public let phoneticExitNames: [String]? - + // MARK: Getting Details About the Approach to the Next Maneuver - + /** The step’s distance, measured in meters. - + The value of this property accounts for the distance that the user must travel to go from this step’s maneuver location to the next step’s maneuver location. It is not the sum of the direct distances between the route’s waypoints, nor should you assume that the user would travel along this distance at a fixed speed. */ public let distance: CLLocationDistance - + /** The step’s expected travel time, measured in seconds. - + The value of this property reflects the time it takes to go from this step’s maneuver location to the next step’s maneuver location. If the route was calculated using the `MBDirectionsProfileIdentifierAutomobileAvoidingTraffic` profile, this property reflects current traffic conditions at the time of the request, not necessarily the traffic conditions at the time the user would begin this step. For other profiles, this property reflects travel time under ideal conditions and does not account for traffic congestion. If the step makes use of a ferry or train, the actual travel time may additionally be subject to the schedules of those services. - + Do not assume that the user would travel along the step at a fixed speed. For the expected travel time on each individual segment along the leg, specify the `AttributeOptions.expectedTravelTime` option and use the `RouteLeg.expectedSegmentTravelTimes` property. */ public let expectedTravelTime: TimeInterval - + /** The names of the road or path leading from this step’s maneuver to the next step’s maneuver. - + If the maneuver is a turning maneuver, the step’s names are the name of the road or path onto which the user turns. If you display a name to the user, you may need to abbreviate common words like “East” or “Boulevard” to ensure that it fits in the allotted space. - + If the maneuver is a roundabout maneuver, the outlet to take is named in the `exitNames` property; the `names` property is only set for large roundabouts that have their own names. */ public let names: [String]? - + /** A phonetic or phonemic transcription indicating how to pronounce the names in the `names` property. - + The transcription is written in the [International Phonetic Alphabet](https://en.wikipedia.org/wiki/International_Phonetic_Alphabet). - + If the maneuver traverses a large, named roundabout, the `exitPronunciationHints` property contains a hint about how to pronounce the names of the outlet to take. */ public let phoneticNames: [String]? - + /** Any route reference codes assigned to the road or path leading from this step’s maneuver to the next step’s maneuver. - + A route reference code commonly consists of an alphabetic network code, a space or hyphen, and a route number. You should not assume that the network code is globally unique: for example, a network code of “NH” may indicate a “National Highway” or “New Hampshire”. Moreover, a route number may not even uniquely identify a route within a given network. - + If a highway ramp is part of a numbered route, its reference code is contained in this property. On the other hand, guide signage for a highway ramp usually indicates route reference codes of the adjoining road; use the `destinationCodes` property for those route reference codes. */ public let codes: [String]? - + // MARK: Getting Additional Step Details - + /** The mode of transportation used for the step. - + This step may use a different mode of transportation than the overall route. */ public let transportType: TransportType - + /** Any route reference codes that appear on guide signage for the road leading from this step’s maneuver to the next step’s maneuver. - + This property is typically available in steps leading to or from a freeway or expressway. This property contains route reference codes associated with a road later in the route. If a highway ramp is itself part of a numbered route, its reference code is contained in the `codes` property. For the signposted exit numbers associated with a highway exit, use the `exitCodes` property. - + A route reference code commonly consists of an alphabetic network code, a space or hyphen, and a route number. You should not assume that the network code is globally unique: for example, a network code of “NH” may indicate a “National Highway” or “New Hampshire”. Moreover, a route number may not even uniquely identify a route within a given network. A destination code for a divided road is often suffixed with the cardinal direction of travel, for example “I 80 East”. */ public let destinationCodes: [String]? - + /** Destinations, such as [control cities](https://en.wikipedia.org/wiki/Control_city), that appear on guide signage for the road leading from this step’s maneuver to the next step’s maneuver. - + This property is typically available in steps leading to or from a freeway or expressway. */ public let destinations: [String]? - + /** An array of intersections along the step. - + Each item in the array corresponds to a cross street, starting with the intersection at the maneuver location indicated by the coordinates property and continuing with each cross street along the step. */ public let intersections: [Intersection]? - - func debugQuickLookObject() -> Any? { - if let coordinates = coordinates { - return debugQuickLookURL(illustrating: coordinates) - } - return nil - } -} - -// MARK: Support for Directions API v4 - -extension ManeuverType { - internal init?(v4Description: String) { - let description: String - switch v4Description { - case "bear right", "turn right", "sharp right", "sharp left", "turn left", "bear left", "u-turn": - description = "turn" - case "enter roundabout": - description = "roundabout" - default: - description = v4Description - } - self.init(description: description) - } -} - -extension ManeuverDirection { - internal init?(v4TypeDescription: String) { - let description: String - switch v4TypeDescription { - case "bear right", "bear left": - description = v4TypeDescription.replacingOccurrences(of: "bear", with: "slight") - case "turn right", "turn left": - description = v4TypeDescription.replacingOccurrences(of: "turn ", with: "") - case "u-turn": - description = "uturn" - default: - description = v4TypeDescription - } - self.init(description: description) - } -} - -func debugQuickLookURL(illustrating coordinates: [CLLocationCoordinate2D], profileIdentifier: DirectionsProfileIdentifier = .automobile) -> URL? { - guard let accessToken = defaultAccessToken else { - return nil - } - - let styleIdentifier: String - let identifierOfLayerAboveOverlays: String - switch profileIdentifier { - case DirectionsProfileIdentifier.automobileAvoidingTraffic: - styleIdentifier = "mapbox/traffic-day-v2" - identifierOfLayerAboveOverlays = "poi-driving-scalerank4" - case DirectionsProfileIdentifier.cycling, DirectionsProfileIdentifier.walking: - styleIdentifier = "mapbox/outdoors-v10" - identifierOfLayerAboveOverlays = "housenum-label" - default: - styleIdentifier = "mapbox/streets-v10" - identifierOfLayerAboveOverlays = "housenum-label" - } - let styleIdentifierComponent = "/\(styleIdentifier)/static" - - var allowedCharacterSet = CharacterSet.urlPathAllowed - allowedCharacterSet.remove(charactersIn: "/)") - let encodedPolyline = encodeCoordinates(coordinates, precision: 1e5).addingPercentEncoding(withAllowedCharacters: allowedCharacterSet)! - let overlaysComponent = "/path-10+3802DA-0.6(\(encodedPolyline))" - - let path = "/styles/v1\(styleIdentifierComponent)\(overlaysComponent)/auto/680x360@2x" - - var components = URLComponents() - components.queryItems = [ - URLQueryItem(name: "before_layer", value: identifierOfLayerAboveOverlays), - URLQueryItem(name: "access_token", value: accessToken), - ] - - return URL(string: "https://api.mapbox.com\(path)?\(components.percentEncodedQuery!)") } diff --git a/Sources/MapboxDirections/MBSpokenInstruction.swift b/Sources/MapboxDirections/MBSpokenInstruction.swift index e3fd29303..ec3414bb2 100644 --- a/Sources/MapboxDirections/MBSpokenInstruction.swift +++ b/Sources/MapboxDirections/MBSpokenInstruction.swift @@ -10,7 +10,7 @@ import CoreLocation The `distanceAlongStep` property is measured from the beginning of the step associated with this object. By contrast, the `text` and `ssmlText` properties refer to the details in the following step. It is also possible for the instruction to refer to two following steps simultaneously when needed for safe navigation. */ -open class SpokenInstruction: NSObject, NSSecureCoding { +open class SpokenInstruction: Codable { /** A distance along the associated `RouteStep` at which to read the instruction aloud. @@ -34,20 +34,13 @@ open class SpokenInstruction: NSObject, NSSecureCoding { This representation is appropriate for speech synthesizers that support the [Speech Synthesis Markup Language](https://en.wikipedia.org/wiki/Speech_Synthesis_Markup_Language) (SSML), such as [Amazon Polly](https://aws.amazon.com/polly/). Numbers and names are marked up to ensure correct pronunciation. For speech synthesizers that lack SSML support, use the `text` property instead. */ public let ssmlText: String - - /** - Initializes a new spoken instruction object based on the given JSON dictionary representation. - - - parameter json: A JSON object that conforms to the [voice instruction](https://docs.mapbox.com/api/navigation/#voice-instruction-object) format described in the Directions API documentation. - */ - public convenience init(json: [String: Any]) { - let distanceAlongStep = json["distanceAlongGeometry"] as! CLLocationDistance - let text = json["announcement"] as! String - let ssmlText = json["ssmlAnnouncement"] as! String + private enum CodingKeys: String, CodingKey { + case distanceAlongStep = "distanceAlongGeometry" + case text = "announcement" + case ssmlText = "ssmlAnnouncement" + } - self.init(distanceAlongStep: distanceAlongStep, text: text, ssmlText: ssmlText) - } /** Initialize a `SpokenInstruction`. @@ -61,18 +54,4 @@ open class SpokenInstruction: NSObject, NSSecureCoding { self.text = text self.ssmlText = ssmlText } - - public required init?(coder decoder: NSCoder) { - distanceAlongStep = decoder.decodeDouble(forKey: "distanceAlongStep") - text = decoder.decodeObject(of: NSString.self, forKey: "text")! as String - ssmlText = decoder.decodeObject(of: NSString.self, forKey: "ssmlText")! as String - } - - public static var supportsSecureCoding = true - - public func encode(with coder: NSCoder) { - coder.encode(distanceAlongStep, forKey: "distanceAlongStep") - coder.encode(text, forKey: "text") - coder.encode(ssmlText, forKey: "ssmlText") - } } diff --git a/Sources/MapboxDirections/MBVisualInstruction.swift b/Sources/MapboxDirections/MBVisualInstruction.swift index ccd156198..a778c0c52 100644 --- a/Sources/MapboxDirections/MBVisualInstruction.swift +++ b/Sources/MapboxDirections/MBVisualInstruction.swift @@ -64,7 +64,7 @@ open class VisualInstruction: Codable { try container.encode(maneuverType, forKey: .maneuverType) try container.encode(maneuverDirection, forKey: .maneuverDirection) - let wrappedComponents = components.map(ComponentCoder.init(component:)) + let wrappedComponents = components.map(Component.init(component:)) try container.encode(wrappedComponents, forKey: .components) try container.encodeIfPresent(finalHeading, forKey: .finalHeading) @@ -76,7 +76,7 @@ open class VisualInstruction: Codable { maneuverType = try container.decode(ManeuverType.self, forKey: .maneuverType) maneuverDirection = try container.decode(ManeuverDirection.self, forKey: .maneuverDirection) - let componentsWrapped = try container.decode([ComponentCoder].self, forKey: .components) + let componentsWrapped = try container.decode([Component].self, forKey: .components) components = componentsWrapped.map { $0.component } finalHeading = try container.decodeIfPresent(CLLocationDegrees.self, forKey: .finalHeading) diff --git a/Sources/MapboxDirections/MBVisualInstructionBanner.swift b/Sources/MapboxDirections/MBVisualInstructionBanner.swift index f2aba6819..d8e575d47 100644 --- a/Sources/MapboxDirections/MBVisualInstructionBanner.swift +++ b/Sources/MapboxDirections/MBVisualInstructionBanner.swift @@ -2,12 +2,52 @@ import Foundation import CoreLocation +internal extension CodingUserInfoKey { + static let drivingSide = CodingUserInfoKey(rawValue: "drivingSide")! + } + /** A visual instruction banner contains all the information necessary for creating a visual cue about a given `RouteStep`. */ -open class VisualInstructionBanner: NSObject, NSSecureCoding { +open class VisualInstructionBanner: Codable { + + private enum CodingKeys: String, CodingKey { + case distanceAlongStep = "distanceAlongGeometry" + case primaryInstruction = "primary" + case secondaryInstruction = "secondary" + case tertiaryInstruction = "sub" + case drivingSide + } + public func encode(to encoder: Encoder) throws { + var container = encoder.container(keyedBy: CodingKeys.self) + try container.encode(distanceAlongStep, forKey: .distanceAlongStep) + try container.encode(primaryInstruction, forKey: .primaryInstruction) + try container.encodeIfPresent(secondaryInstruction, forKey: .secondaryInstruction) + try container.encodeIfPresent(tertiaryInstruction, forKey: .tertiaryInstruction) + try container.encode(drivingSide, forKey: .drivingSide) + } + + + required public init(from decoder: Decoder) throws { + let container = try decoder.container(keyedBy: CodingKeys.self) + distanceAlongStep = try container.decode(CLLocationDistance.self, forKey: .distanceAlongStep) + primaryInstruction = try container.decode(VisualInstruction.self, forKey: .primaryInstruction) + secondaryInstruction = try container.decodeIfPresent(VisualInstruction.self, forKey: .secondaryInstruction) + tertiaryInstruction = try container.decodeIfPresent(VisualInstruction.self, forKey: .tertiaryInstruction) + if let directlyEncoded = try container.decodeIfPresent(DrivingSide.self, forKey: .drivingSide) { + drivingSide = directlyEncoded + } else if let drivingSide = decoder.userInfo[.drivingSide] as? DrivingSide { + self.drivingSide = drivingSide + } else { + #warning("make real error") + throw NSError(domain: "directions", code: 500, userInfo: [NSLocalizedDescriptionKey: "Did not supply driving side."]) + } + } + + + /** The distance at which the visual instruction should be shown, measured in meters from the beginning of the step. */ @@ -35,74 +75,75 @@ open class VisualInstructionBanner: NSObject, NSSecureCoding { */ public var drivingSide: DrivingSide - /** - Initializes a new visual instruction banner object based on the given JSON dictionary representation and a driving side. - - - parameter json: A JSON object that conforms to the [primary or secondary banner](https://docs.mapbox.com/api/navigation/#banner-instruction-object) format described in the Directions API documentation. - - parameter drivingSide: The side of the road the user should drive on. This value should be consistent with the containing route step. - */ - - public convenience init(json: [String: Any], drivingSide: DrivingSide) { - let distanceAlongStep = json["distanceAlongGeometry"] as! CLLocationDistance - - let primary = json["primary"] as! JSONDictionary - let secondary = json["secondary"] as? JSONDictionary - let tertiary = json["sub"] as? JSONDictionary - - let primaryInstruction = VisualInstruction(json: primary) - var secondaryInstruction: VisualInstruction? = nil - if let secondary = secondary { - secondaryInstruction = VisualInstruction(json: secondary) - } - - var tertiaryInstruction: VisualInstruction? = nil - if let tertiary = tertiary { - tertiaryInstruction = VisualInstruction(json: tertiary) - } - - self.init(distanceAlongStep: distanceAlongStep, primaryInstruction: primaryInstruction, secondaryInstruction: secondaryInstruction, tertiaryInstruction: tertiaryInstruction, drivingSide: drivingSide) - } - - /** - Initializes a new visual instruction banner object that displays the given information. - - - parameter distanceAlongStep: The distance at which the visual instruction should be shown, measured in meters from the beginning of the step. - - parameter primaryInstruction: The most important information to convey to the user about the `RouteStep`. - - parameter secondaryInstruction: Less important details about the `RouteStep`. - - parameter drivingSide: Which side of a bidirectional road the driver should drive on. - */ - public init(distanceAlongStep: CLLocationDistance, primaryInstruction: VisualInstruction, secondaryInstruction: VisualInstruction?, tertiaryInstruction: VisualInstruction?, drivingSide: DrivingSide) { - self.distanceAlongStep = distanceAlongStep - self.primaryInstruction = primaryInstruction - self.secondaryInstruction = secondaryInstruction - self.tertiaryInstruction = tertiaryInstruction - self.drivingSide = drivingSide - } - - public required init?(coder decoder: NSCoder) { - distanceAlongStep = decoder.decodeDouble(forKey: "distanceAlongStep") - - if let drivingSideDescription = decoder.decodeObject(of: NSString.self, forKey: "drivingSide") as String?, let drivingSide = DrivingSide(rawValue: drivingSideDescription) { - self.drivingSide = drivingSide - } else { - self.drivingSide = .right - } - - guard let primaryInstruction = decoder.decodeObject(of: VisualInstruction.self, forKey: "primary") else { - return nil - } - self.primaryInstruction = primaryInstruction - self.secondaryInstruction = decoder.decodeObject(of: VisualInstruction.self, forKey: "secondary") - self.tertiaryInstruction = decoder.decodeObject(of: VisualInstruction.self, forKey: "tertiaryInstruction") - } - - public static var supportsSecureCoding = true - - public func encode(with coder: NSCoder) { - coder.encode(distanceAlongStep, forKey: "distanceAlongStep") - coder.encode(primaryInstruction, forKey: "primary") - coder.encode(secondaryInstruction, forKey: "secondary") - coder.encode(tertiaryInstruction, forKey: "tertiaryInstruction") - coder.encode(drivingSide.rawValue, forKey: "drivingSide") - } +// /** +// Initializes a new visual instruction banner object based on the given JSON dictionary representation and a driving side. +// +// - parameter json: A JSON object that conforms to the [primary or secondary banner](https://docs.mapbox.com/api/navigation/#banner-instruction-object) format described in the Directions API documentation. +// - parameter drivingSide: The side of the road the user should drive on. This value should be consistent with the containing route step. +// */ +// +// public convenience init(json: [String: Any], drivingSide: DrivingSide) { +// let distanceAlongStep = json["distanceAlongGeometry"] as! CLLocationDistance +// +// let primary = json["primary"] as! JSONDictionary +// let secondary = json["secondary"] as? JSONDictionary +// let tertiary = json["sub"] as? JSONDictionary +// +// let primaryInstruction = VisualInstruction(json: primary) +// var secondaryInstruction: VisualInstruction? = nil +// if let secondary = secondary { +// secondaryInstruction = VisualInstruction(json: secondary) +// } +// +// var tertiaryInstruction: VisualInstruction? = nil +// if let tertiary = tertiary { +// tertiaryInstruction = VisualInstruction(json: tertiary) +// } +// +// self.init(distanceAlongStep: distanceAlongStep, primaryInstruction: primaryInstruction, secondaryInstruction: secondaryInstruction, tertiaryInstruction: tertiaryInstruction, drivingSide: drivingSide) +// } +// +// /** +// Initializes a new visual instruction banner object that displays the given information. +// +// - parameter distanceAlongStep: The distance at which the visual instruction should be shown, measured in meters from the beginning of the step. +// - parameter primaryInstruction: The most important information to convey to the user about the `RouteStep`. +// - parameter secondaryInstruction: Less important details about the `RouteStep`. +// - parameter drivingSide: Which side of a bidirectional road the driver should drive on. +// */ +// public init(distanceAlongStep: CLLocationDistance, primaryInstruction: VisualInstruction, secondaryInstruction: VisualInstruction?, tertiaryInstruction: VisualInstruction?, drivingSide: DrivingSide) { +// self.distanceAlongStep = distanceAlongStep +// self.primaryInstruction = primaryInstruction +// self.secondaryInstruction = secondaryInstruction +// self.tertiaryInstruction = tertiaryInstruction +// self.drivingSide = drivingSide +// } +// +// public required init?(coder decoder: NSCoder) { +// distanceAlongStep = decoder.decodeDouble(forKey: "distanceAlongStep") +// +// if let drivingSideDescription = decoder.decodeObject(of: NSString.self, forKey: "drivingSide") as String?, let drivingSide = DrivingSide(rawValue: drivingSideDescription) { +// self.drivingSide = drivingSide +// } else { +// self.drivingSide = .right +// } +// +// guard let primaryInstruction = decoder.decodeObject(of: VisualInstruction.self, forKey: "primary") else { +// return nil +// } +// self.primaryInstruction = primaryInstruction +// self.secondaryInstruction = decoder.decodeObject(of: VisualInstruction.self, forKey: "secondary") +// self.tertiaryInstruction = decoder.decodeObject(of: VisualInstruction.self, forKey: "tertiaryInstruction") +// } +// +// public static var supportsSecureCoding = true +// +// public func encode(with coder: NSCoder) { +// coder.encode(distanceAlongStep, forKey: "distanceAlongStep") +// coder.encode(primaryInstruction, forKey: "primary") +// coder.encode(secondaryInstruction, forKey: "secondary") +// coder.encode(tertiaryInstruction, forKey: "tertiaryInstruction") +// coder.encode(drivingSide.rawValue, forKey: "drivingSide") +// } +//} } diff --git a/Sources/MapboxDirections/MBVisualInstructionComponent.swift b/Sources/MapboxDirections/MBVisualInstructionComponent.swift index a39552cf0..22f3e534a 100644 --- a/Sources/MapboxDirections/MBVisualInstructionComponent.swift +++ b/Sources/MapboxDirections/MBVisualInstructionComponent.swift @@ -8,6 +8,7 @@ /** A component of a `VisualInstruction` that represents a single run of similarly formatted text or an image with a textual fallback representation. + Note: This class does not conform to Codable because it's serialization is directly handled by `Component` */ open class VisualInstructionComponent: ComponentRepresentable { @@ -42,47 +43,7 @@ open class VisualInstructionComponent: ComponentRepresentable { The type of visual instruction component. You can display the component differently depending on its type. */ public var type: VisualInstructionComponentType - - public static var supportsSecureCoding: Bool = true - - /** - Initializes a new visual instruction component object based on the given JSON dictionary representation. - - - parameter json: A JSON object that conforms to the [banner component](https://docs.mapbox.com/api/navigation/#banner-instruction-object) format described in the Directions API documentation. - */ - public convenience init(json: [String: Any]) { - let text = json["text"] as? String - let type = VisualInstructionComponentType(description: json["type"] as? String ?? "") ?? .text - - let abbreviation = json["abbr"] as? String - let abbreviationPriority = json["abbr_priority"] as? Int ?? NSNotFound - - var imageURL: URL? - if let baseURL = json["imageBaseURL"] as? String, !baseURL.isEmpty { - let scale: CGFloat - #if os(OSX) - scale = NSScreen.main?.backingScaleFactor ?? 1 - #elseif os(watchOS) - scale = WKInterfaceDevice.current().screenScale - #else - scale = UIScreen.main.scale - #endif - imageURL = URL(string: "\(baseURL)@\(Int(scale))x.png") - } - - self.init(type: type, text: text, imageURL: imageURL, abbreviation: abbreviation, abbreviationPriority: abbreviationPriority) - } - - /** - Initializes a new visual instruction component object that displays the given information. - - - parameter type: The type of visual instruction component. - - parameter text: The plain text representation of this component. - - parameter imageURL: The URL to an image representation of this component. - - parameter abbreviation: An abbreviated representation of `text`. - - parameter abbreviationPriority: The priority for which the component should be abbreviated. - */ public init(type: VisualInstructionComponentType, text: String?, imageURL: URL?, abbreviation: String?, abbreviationPriority: Int?) { self.text = text self.type = type @@ -90,34 +51,4 @@ open class VisualInstructionComponent: ComponentRepresentable { self.abbreviation = abbreviation self.abbreviationPriority = abbreviationPriority } - - public required init?(coder decoder: NSCoder) { - self.text = decoder.decodeObject(of: NSString.self, forKey: "text") as String? - - guard let typeString = decoder.decodeObject(of: NSString.self, forKey: "type") as String?, let type = VisualInstructionComponentType(description: typeString) else { - return nil - } - self.type = type - - - guard let imageURL = decoder.decodeObject(of: NSURL.self, forKey: "imageURL") as URL? else { - return nil - } - self.imageURL = imageURL - - guard let abbreviation = decoder.decodeObject(of: NSString.self, forKey: "abbreviation") as String? else { - return nil - } - self.abbreviation = abbreviation - - abbreviationPriority = decoder.decodeInteger(forKey: "abbreviationPriority") - } - - public func encode(with coder: NSCoder) { - coder.encode(text, forKey: "text") - coder.encode(type.description, forKey: "type") - coder.encode(imageURL, forKey: "imageURL") - coder.encode(abbreviation, forKey: "abbreviation") - coder.encode(abbreviationPriority, forKey: "abbreviationPriority") - } } diff --git a/Sources/MapboxDirections/MBWaypoint.swift b/Sources/MapboxDirections/MBWaypoint.swift index c443fc257..e89285ca9 100644 --- a/Sources/MapboxDirections/MBWaypoint.swift +++ b/Sources/MapboxDirections/MBWaypoint.swift @@ -162,15 +162,6 @@ public class Waypoint: Codable { public var description: String { return name ?? "" } - - func debugQuickLookObject() -> Any { - return CLLocation(coordinate: coordinate, altitude: 0, horizontalAccuracy: coordinateAccuracy, verticalAccuracy: -1, course: heading, speed: -1, timestamp: Date()) - } - -// public func isEqual(_ object: Any?) -> Bool { -// guard let other = object as? Waypoint else { return false } -// return self.coordinate == other.coordinate && self.name == other.name && self.coordinateAccuracy == other.coordinateAccuracy -// } } extension Waypoint: Equatable { diff --git a/Sources/MapboxDirections/Match/MBMatch.swift b/Sources/MapboxDirections/Match/MBMatch.swift index 4769728ad..555730798 100644 --- a/Sources/MapboxDirections/Match/MBMatch.swift +++ b/Sources/MapboxDirections/Match/MBMatch.swift @@ -2,49 +2,70 @@ import Foundation import CoreLocation import Polyline +extension CodingUserInfoKey { + static let tracepoints = CodingUserInfoKey(rawValue: "com.mapbox.directions.coding.tracepoints")! +} /** A `Match` object defines a single route that was created from a series of points that were matched against a road network. Typically, you do not create instances of this class directly. Instead, you receive match objects when you pass a `MatchOptions` object into the `Directions.calculate(_:completionHandler:)` or `Directions.calculateRoutes(matching:completionHandler:)` method. */ open class Match: DirectionsResult { + #warning("check this") +// init(matchOptions: MatchOptions, legs: [RouteLeg], tracepoints: [Tracepoint], distance: CLLocationDistance, expectedTravelTime: TimeInterval, coordinates: [CLLocationCoordinate2D]?, confidence: Float, speechLocale: Locale?, waypointIndices: IndexSet) { +// self.confidence = confidence +// self.tracepoints = tracepoints +// self.waypointIndices = waypointIndices +// super.init(legs: legs, distance: distance, expectedTravelTime: expectedTravelTime, coordinates: coordinates, speechLocale: speechLocale, options: matchOptions) +// } - init(matchOptions: MatchOptions, legs: [RouteLeg], tracepoints: [Tracepoint], distance: CLLocationDistance, expectedTravelTime: TimeInterval, coordinates: [CLLocationCoordinate2D]?, confidence: Float, speechLocale: Locale?, waypointIndices: IndexSet) { - self.confidence = confidence - self.tracepoints = tracepoints - self.waypointIndices = waypointIndices - super.init(legs: legs, distance: distance, expectedTravelTime: expectedTravelTime, coordinates: coordinates, speechLocale: speechLocale, options: matchOptions) + private enum CodingKeys: String, CodingKey { + case confidence + case tracepoints + } + public required init(from decoder: Decoder) throws { + let container = try decoder.container(keyedBy: CodingKeys.self) + confidence = try container.decode(Float.self, forKey: .confidence) + tracepoints = try container.decodeIfPresent([Tracepoint].self, forKey: .tracepoints) ?? decoder.userInfo[.tracepoints] as! [Tracepoint] + try super.init(from: decoder) } - /** - Initializes a new match object with the given JSON dictionary representation and tracepoints. - - - parameter json: A JSON dictionary representation of the route as returned by the Mapbox Map Matching API. - - parameter tracepoints: An array of `Tracepoint` that the match found in order. - - parameter matchOptions: The `MatchOptions` used to create the request. - */ - public convenience init(json: [String: Any], tracepoints: [Tracepoint], waypointIndices: IndexSet, matchOptions: MatchOptions) { - let legInfo = zip(zip(tracepoints.prefix(upTo: tracepoints.endIndex - 1), tracepoints.suffix(from: 1)), - json["legs"] as? [JSONDictionary] ?? []) - let legs = legInfo.map { (endpoints, json) -> RouteLeg in - return RouteLeg(json: json, source: endpoints.0, destination: endpoints.1, options: RouteOptions(matchOptions: matchOptions)) - } - - let distance = json["distance"] as! Double - let expectedTravelTime = json["duration"] as! Double - - let coordinates = matchOptions.shapeFormat.coordinates(from: json["geometry"]) - - let confidence = (json["confidence"] as! NSNumber).floatValue - - var speechLocale: Locale? - if let locale = json["voiceLocale"] as? String { - speechLocale = Locale(identifier: locale) - } - - self.init(matchOptions: matchOptions, legs: legs, tracepoints: tracepoints, distance: distance, expectedTravelTime: expectedTravelTime, coordinates: coordinates, confidence: confidence, speechLocale: speechLocale, waypointIndices: waypointIndices) + public override func encode(to encoder: Encoder) throws { + var container = encoder.container(keyedBy: CodingKeys.self) + try container.encode(confidence, forKey: .confidence) + try container.encode(tracepoints, forKey: .tracepoints) + try super.encode(to: encoder) } +// /** +// Initializes a new match object with the given JSON dictionary representation and tracepoints. +// +// - parameter json: A JSON dictionary representation of the route as returned by the Mapbox Map Matching API. +// - parameter tracepoints: An array of `Tracepoint` that the match found in order. +// - parameter matchOptions: The `MatchOptions` used to create the request. +// */ +// public convenience init(json: [String: Any], tracepoints: [Tracepoint], waypointIndices: IndexSet, matchOptions: MatchOptions) { +// let legInfo = zip(zip(tracepoints.prefix(upTo: tracepoints.endIndex - 1), tracepoints.suffix(from: 1)), +// json["legs"] as? [JSONDictionary] ?? []) +// let legs = legInfo.map { (endpoints, json) -> RouteLeg in +// return RouteLeg(json: json, source: endpoints.0, destination: endpoints.1, options: RouteOptions(matchOptions: matchOptions)) +// } +// +// let distance = json["distance"] as! Double +// let expectedTravelTime = json["duration"] as! Double +// +// let coordinates = matchOptions.shapeFormat.coordinates(from: json["geometry"]) +// +// let confidence = (json["confidence"] as! NSNumber).floatValue +// +// var speechLocale: Locale? +// if let locale = json["voiceLocale"] as? String { +// speechLocale = Locale(identifier: locale) +// } +// +// self.init(matchOptions: matchOptions, legs: legs, tracepoints: tracepoints, distance: distance, expectedTravelTime: expectedTravelTime, coordinates: coordinates, confidence: confidence, speechLocale: speechLocale, waypointIndices: waypointIndices) +// } + /** A number between 0 and 1 that indicates the Map Matching API’s confidence that the match is accurate. A higher confidence means the match is more likely to be accurate. */ @@ -59,11 +80,6 @@ open class Match: DirectionsResult { open var tracepoints: [Tracepoint] - /** - Index of the waypoint inside the matched route. - */ - open var waypointIndices: IndexSet? - /** `MatchOptions` used to create the match request. */ @@ -71,41 +87,27 @@ open class Match: DirectionsResult { return super.directionsOptions as! MatchOptions } - public required init?(coder decoder: NSCoder) { - confidence = decoder.decodeFloat(forKey: "confidence") - - guard let tracepoints = decoder.decodeObject(of: [NSArray.self, Tracepoint.self], forKey: "tracepoints") as? [Tracepoint] else { - return nil - } - self.tracepoints = tracepoints - - waypointIndices = decoder.decodeObject(of: NSIndexSet.self, forKey: "waypointIndices") as IndexSet? - - super.init(coder: decoder) - } - - override public class var supportsSecureCoding: Bool { - return true - } - - public override func encode(with coder: NSCoder) { - coder.encode(confidence, forKey: "confidence") - coder.encode(tracepoints, forKey: "tracepoints") - coder.encode(waypointIndices, forKey: "waypointIndices") - super.encode(with: coder) - } - - //MARK: - OBJ-C Equality - open override func isEqual(_ object: Any?) -> Bool { - guard let opts = object as? Match else { return false } - return isEqual(to: opts) - } +// public required init?(coder decoder: NSCoder) { +// confidence = decoder.decodeFloat(forKey: "confidence") +// +// guard let tracepoints = decoder.decodeObject(of: [NSArray.self, Tracepoint.self], forKey: "tracepoints") as? [Tracepoint] else { +// return nil +// } +// self.tracepoints = tracepoints +// +// waypointIndices = decoder.decodeObject(of: NSIndexSet.self, forKey: "waypointIndices") as IndexSet? +// +// super.init(coder: decoder) +// } +// +// override public class var supportsSecureCoding: Bool { +// return true +// } - open func isEqual(to match: Match?) -> Bool { - guard let other = match else { return false } - guard tracepoints == other.tracepoints, - matchOptions == other.matchOptions, - confidence == other.confidence else { return false } - return true - } +// public override func encode(with coder: NSCoder) { +// coder.encode(confidence, forKey: "confidence") +// coder.encode(tracepoints, forKey: "tracepoints") +// coder.encode(waypointIndices, forKey: "waypointIndices") +// super.encode(with: coder) +// } } diff --git a/Sources/MapboxDirections/Match/MBMatchOptions.swift b/Sources/MapboxDirections/Match/MBMatchOptions.swift index 2a4451b96..f912ed8ac 100644 --- a/Sources/MapboxDirections/Match/MBMatchOptions.swift +++ b/Sources/MapboxDirections/Match/MBMatchOptions.swift @@ -38,7 +38,21 @@ open class MatchOptions: DirectionsOptions { public required init(waypoints: [Waypoint], profileIdentifier: DirectionsProfileIdentifier?) { super.init(waypoints: waypoints, profileIdentifier: profileIdentifier) } - + + + private enum CodingKeys: String, CodingKey { + case resamplesTraces = "tidy" + } + public override func encode(to encoder: Encoder) throws { + var container = encoder.container(keyedBy: CodingKeys.self) + try container.encode(resamplesTraces, forKey: .resamplesTraces) + try super.encode(to: encoder) + } + public required init(from decoder: Decoder) throws { + let container = try decoder.container(keyedBy: CodingKeys.self) + resamplesTraces = try container.decode(Bool.self, forKey: .resamplesTraces) + try super.init(from: decoder) + } /** If true, the input locations are re-sampled for improved map matching results. The default is `false`. */ @@ -63,22 +77,19 @@ open class MatchOptions: DirectionsOptions { } } - public required init?(coder decoder: NSCoder) { - resamplesTraces = decoder.decodeBool(forKey: "resampleTraces") - super.init(coder: decoder) - var deprecations = self as MatchOptionsDeprecations - deprecations.waypointIndices = decoder.decodeObject(of: NSIndexSet.self, forKey: "waypointIndices") as IndexSet? - } +// public required init?(coder decoder: NSCoder) { +// resamplesTraces = decoder.decodeBool(forKey: "resampleTraces") +// super.init(coder: decoder) +// var deprecations = self as MatchOptionsDeprecations +// deprecations.waypointIndices = decoder.decodeObject(of: NSIndexSet.self, forKey: "waypointIndices") as IndexSet? +// } +// +// public override func encode(with coder: NSCoder) { +// coder.encode(resamplesTraces, forKey: "resampleTraces") +// coder.encode((self as MatchOptionsDeprecations).waypointIndices, forKey: "waypointIndices") +// super.encode(with: coder) +// } - public override func encode(with coder: NSCoder) { - coder.encode(resamplesTraces, forKey: "resampleTraces") - coder.encode((self as MatchOptionsDeprecations).waypointIndices, forKey: "waypointIndices") - super.encode(with: coder) - } - - public override class var supportsSecureCoding: Bool { - return true - } override open var urlQueryItems: [URLQueryItem] { var queryItems = super.urlQueryItems diff --git a/Sources/MapboxDirections/Match/MatchResponse.swift b/Sources/MapboxDirections/Match/MatchResponse.swift new file mode 100644 index 000000000..b2ce77ef3 --- /dev/null +++ b/Sources/MapboxDirections/Match/MatchResponse.swift @@ -0,0 +1,19 @@ +import Foundation + + +class MatchResponse: Codable { + var matches : [Match] + var tracepoints: [Tracepoint] + + private enum CodingKeys: String, CodingKey { + case matches = "matchings" + case tracepoints + } + + public required init(from decoder: Decoder) throws { + let container = try decoder.container(keyedBy: CodingKeys.self) + tracepoints = try container.decode([Tracepoint].self, forKey: .tracepoints) + (decoder as? JSONDecoder)?.userInfo[.tracepoints] = tracepoints + matches = try container.decode([Match].self, forKey: .matches) + } +} diff --git a/Sources/MapboxDirections/DirectionsResponse.swift b/Sources/MapboxDirections/RouteResponse.swift similarity index 85% rename from Sources/MapboxDirections/DirectionsResponse.swift rename to Sources/MapboxDirections/RouteResponse.swift index efcf07e25..4f75a67f2 100644 --- a/Sources/MapboxDirections/DirectionsResponse.swift +++ b/Sources/MapboxDirections/RouteResponse.swift @@ -1,6 +1,6 @@ import Foundation -struct DirectionsResponse: Codable { +struct RouteResponse: Codable { enum CodingKeys: String, CodingKey { case code @@ -30,6 +30,12 @@ struct DirectionsResponse: Codable { init(from decoder: Decoder) throws { let container = try decoder.container(keyedBy: CodingKeys.self) + self.code = try container.decodeIfPresent(String.self, forKey: .code) + + self.message = try container.decodeIfPresent(String.self, forKey: .message) + + self.error = try container.decodeIfPresent(String.self, forKey: .error) + let uuid = try container.decodeIfPresent(String.self, forKey: .uuid) self.uuid = uuid From e19066ea5a1ef87ac7b76d3126cbe38a1fdb788f Mon Sep 17 00:00:00 2001 From: Jerrad Thramer Date: Wed, 16 Oct 2019 10:34:50 -0600 Subject: [PATCH 08/89] Build Success --- Directions Example/ViewController.swift | 14 +- MapboxDirections.xcodeproj/project.pbxproj | 10 + .../MapboxDirections/DirectionsError.swift | 10 + Sources/MapboxDirections/MBDirections.swift | 326 ++++++++++-------- Sources/MapboxDirections/MBRouteOptions.swift | 11 + Sources/MapboxDirections/Match/MBMatch.swift | 2 +- .../Match/MBMatchOptions.swift | 81 ----- .../Match/MapMatchingResponse.swift | 35 ++ .../Match/MatchResponse.swift | 7 +- 9 files changed, 263 insertions(+), 233 deletions(-) create mode 100644 Sources/MapboxDirections/Match/MapMatchingResponse.swift diff --git a/Directions Example/ViewController.swift b/Directions Example/ViewController.swift index 398563853..7ede37ad4 100644 --- a/Directions Example/ViewController.swift +++ b/Directions Example/ViewController.swift @@ -96,14 +96,15 @@ class ViewController: UIViewController, MBDrawingViewDelegate { } } - if route.coordinateCount > 0 { + if let shape = route.shape, shape.coordinates.count > 0 { // Convert the route’s coordinates into a polyline. - var routeCoordinates = route.coordinates! - let routeLine = MGLPolyline(coordinates: &routeCoordinates, count: route.coordinateCount) + var routeCoordinates = shape.coordinates + let coordCount = UInt(routeCoordinates.count) + let routeLine = MGLPolyline(coordinates: &routeCoordinates, count: coordCount) // Add the polyline to the map and fit the viewport to the polyline. self.mapView.addAnnotation(routeLine) - self.mapView.setVisibleCoordinates(&routeCoordinates, count: route.coordinateCount, edgePadding: .zero, animated: true) + self.mapView?.setVisibleCoordinates(&routeCoordinates, count: coordCount, edgePadding: .zero, animated: true) } } } @@ -145,8 +146,9 @@ class ViewController: UIViewController, MBDrawingViewDelegate { self.mapView.removeAnnotations(annotations) } - var routeCoordinates = match.coordinates! - let routeLine = MGLPolyline(coordinates: &routeCoordinates, count: match.coordinateCount) + var routeCoordinates = match.shape!.coordinates + let coordCount = UInt(routeCoordinates.count) + let routeLine = MGLPolyline(coordinates: &routeCoordinates, count: coordCount) self.mapView.addAnnotation(routeLine) self.drawingView?.reset() } diff --git a/MapboxDirections.xcodeproj/project.pbxproj b/MapboxDirections.xcodeproj/project.pbxproj index 0141cdafb..4a7d2780f 100644 --- a/MapboxDirections.xcodeproj/project.pbxproj +++ b/MapboxDirections.xcodeproj/project.pbxproj @@ -67,6 +67,10 @@ 43F89F942350F952007B591E /* MatchResponse.swift in Sources */ = {isa = PBXBuildFile; fileRef = 43F89F922350F952007B591E /* MatchResponse.swift */; }; 43F89F952350F952007B591E /* MatchResponse.swift in Sources */ = {isa = PBXBuildFile; fileRef = 43F89F922350F952007B591E /* MatchResponse.swift */; }; 43F89F962350F952007B591E /* MatchResponse.swift in Sources */ = {isa = PBXBuildFile; fileRef = 43F89F922350F952007B591E /* MatchResponse.swift */; }; + 43F89F98235778DE007B591E /* MapMatchingResponse.swift in Sources */ = {isa = PBXBuildFile; fileRef = 43F89F97235778DE007B591E /* MapMatchingResponse.swift */; }; + 43F89F99235778DE007B591E /* MapMatchingResponse.swift in Sources */ = {isa = PBXBuildFile; fileRef = 43F89F97235778DE007B591E /* MapMatchingResponse.swift */; }; + 43F89F9A235778DE007B591E /* MapMatchingResponse.swift in Sources */ = {isa = PBXBuildFile; fileRef = 43F89F97235778DE007B591E /* MapMatchingResponse.swift */; }; + 43F89F9B235778DE007B591E /* MapMatchingResponse.swift in Sources */ = {isa = PBXBuildFile; fileRef = 43F89F97235778DE007B591E /* MapMatchingResponse.swift */; }; 8D381B611FD9F5B1008D5A58 /* noDestinationName.json in Resources */ = {isa = PBXBuildFile; fileRef = 8D381B601FD9F5B1008D5A58 /* noDestinationName.json */; }; 8D381B631FDB01D1008D5A58 /* apiDestinationName.json in Resources */ = {isa = PBXBuildFile; fileRef = 8D381B621FDB01D1008D5A58 /* apiDestinationName.json */; }; 8D381B641FDB0898008D5A58 /* noDestinationName.json in Resources */ = {isa = PBXBuildFile; fileRef = 8D381B601FD9F5B1008D5A58 /* noDestinationName.json */; }; @@ -335,6 +339,7 @@ 438BFEC1233D854D00457294 /* DirectionsProfileIdentifier.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DirectionsProfileIdentifier.swift; sourceTree = ""; }; 4392557523440EC2006EEE88 /* DirectionsError.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DirectionsError.swift; sourceTree = ""; }; 43F89F922350F952007B591E /* MatchResponse.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MatchResponse.swift; sourceTree = ""; }; + 43F89F97235778DE007B591E /* MapMatchingResponse.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MapMatchingResponse.swift; sourceTree = ""; }; 8D381B601FD9F5B1008D5A58 /* noDestinationName.json */ = {isa = PBXFileReference; lastKnownFileType = text.json; path = noDestinationName.json; sourceTree = ""; }; 8D381B621FDB01D1008D5A58 /* apiDestinationName.json */ = {isa = PBXFileReference; explicitFileType = text.json; path = apiDestinationName.json; sourceTree = ""; }; 8D381B691FDB101F008D5A58 /* String.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = String.swift; sourceTree = ""; }; @@ -581,6 +586,7 @@ C5434B89200693D00069E887 /* MBTracepoint.swift */, C5434B8B200695A50069E887 /* MBMatchOptions.swift */, 43F89F922350F952007B591E /* MatchResponse.swift */, + 43F89F97235778DE007B591E /* MapMatchingResponse.swift */, C5DAAC9920191675001F9261 /* MBMatch.swift */, ); path = Match; @@ -1192,6 +1198,7 @@ 8D43467A219E15C3008B7BF3 /* Double.swift in Sources */, C52552C61FA162F900B1545C /* MBVisualInstructionComponent.swift in Sources */, C53A02261E92C26E009837BD /* AttributeOptions.swift in Sources */, + 43F89F99235778DE007B591E /* MapMatchingResponse.swift in Sources */, DA1A10C91D00F969009F82FA /* MBRouteLeg.swift in Sources */, C52552BA1FA15D5E00B1545C /* MBVisualInstructionBanner.swift in Sources */, 35828C9F217A003F00ED546E /* OfflineDirections.swift in Sources */, @@ -1259,6 +1266,7 @@ 8D43467B219E15C4008B7BF3 /* Double.swift in Sources */, C52552C71FA162FA00B1545C /* MBVisualInstructionComponent.swift in Sources */, C53A02271E92C26F009837BD /* AttributeOptions.swift in Sources */, + 43F89F9A235778DE007B591E /* MapMatchingResponse.swift in Sources */, DA1A10EF1D010247009F82FA /* MBRouteLeg.swift in Sources */, C52552BB1FA15D5F00B1545C /* MBVisualInstructionBanner.swift in Sources */, 35828CA0217A003F00ED546E /* OfflineDirections.swift in Sources */, @@ -1326,6 +1334,7 @@ 8D43467C219E15C6008B7BF3 /* Double.swift in Sources */, C52552C81FA162FB00B1545C /* MBVisualInstructionComponent.swift in Sources */, C53A02281E92C271009837BD /* AttributeOptions.swift in Sources */, + 43F89F9B235778DE007B591E /* MapMatchingResponse.swift in Sources */, DA1A11061D0103A3009F82FA /* MBRouteLeg.swift in Sources */, C52552BC1FA15D6000B1545C /* MBVisualInstructionBanner.swift in Sources */, 35828CA1217A003F00ED546E /* OfflineDirections.swift in Sources */, @@ -1371,6 +1380,7 @@ 8D434679219E1167008B7BF3 /* Double.swift in Sources */, DA2E03EB1CB0E13D00D1269A /* MBRouteOptions.swift in Sources */, C582BA2E2073ED6300647DAA /* Array.swift in Sources */, + 43F89F98235778DE007B591E /* MapMatchingResponse.swift in Sources */, C52552B91FA15D5900B1545C /* MBVisualInstructionBanner.swift in Sources */, C52552C01FA1628A00B1545C /* MBVisualInstructionComponent.swift in Sources */, 35828C9E217A003F00ED546E /* OfflineDirections.swift in Sources */, diff --git a/Sources/MapboxDirections/DirectionsError.swift b/Sources/MapboxDirections/DirectionsError.swift index 40246e941..b25cbba00 100644 --- a/Sources/MapboxDirections/DirectionsError.swift +++ b/Sources/MapboxDirections/DirectionsError.swift @@ -23,6 +23,10 @@ public enum DirectionsError: Error, RawRepresentable { return "A response was recieved from the server, but it was not of a valid format." case .unableToRoute: return "No route could be found between the specified locations." + case .noMatches: + return "The input did not produce any matches." + case .tooManyCoordinates: + return "There are too many points in the request." case .unableToLocate: return "A specified location could not be associated with a roadway or pathway." case .profileNotFound: @@ -49,6 +53,10 @@ public enum DirectionsError: Error, RawRepresentable { return "Make sure you have an active internet connection." case .unableToRoute: return "Make sure it is possible to travel between the locations with the mode of transportation implied by the profileIdentifier option. For example, it is impossible to travel by car from one continent to another without either a land bridge or a ferry connection." + case .noMatches: + return "Please try again making sure that your tracepoints lie in close proximity to a road or path." + case .tooManyCoordinates: + return "Please try again with 100 coordinates or less." case .unableToLocate: return "Make sure the locations are close enough to a roadway or pathway. Try setting the coordinateAccuracy property of all the waypoints to a negative value." case .profileNotFound: @@ -73,6 +81,8 @@ public enum DirectionsError: Error, RawRepresentable { case noData case invalidResponse case unableToRoute + case noMatches + case tooManyCoordinates case unableToLocate case profileNotFound case requestTooLarge diff --git a/Sources/MapboxDirections/MBDirections.swift b/Sources/MapboxDirections/MBDirections.swift index 8a868224b..426968fa1 100644 --- a/Sources/MapboxDirections/MBDirections.swift +++ b/Sources/MapboxDirections/MBDirections.swift @@ -19,108 +19,108 @@ var skuToken: String? { /// The user agent string for any HTTP requests performed directly within this library. let userAgent: String = { var components: [String] = [] - + if let appName = Bundle.main.infoDictionary?["CFBundleName"] as? String ?? Bundle.main.infoDictionary?["CFBundleIdentifier"] as? String { let version = Bundle.main.infoDictionary?["CFBundleShortVersionString"] as? String ?? "" components.append("\(appName)/\(version)") } - + let libraryBundle: Bundle? = Bundle(for: Directions.self) - + if let libraryName = libraryBundle?.infoDictionary?["CFBundleName"] as? String, let version = libraryBundle?.infoDictionary?["CFBundleShortVersionString"] as? String { components.append("\(libraryName)/\(version)") } - + let system: String #if os(OSX) - system = "macOS" + system = "macOS" #elseif os(iOS) - system = "iOS" + system = "iOS" #elseif os(watchOS) - system = "watchOS" + system = "watchOS" #elseif os(tvOS) - system = "tvOS" + system = "tvOS" #elseif os(Linux) - system = "Linux" + system = "Linux" #endif let systemVersion = ProcessInfo().operatingSystemVersion components.append("\(system)/\(systemVersion.majorVersion).\(systemVersion.minorVersion).\(systemVersion.patchVersion)") - + let chip: String #if arch(x86_64) - chip = "x86_64" + chip = "x86_64" #elseif arch(arm) - chip = "arm" + chip = "arm" #elseif arch(arm64) - chip = "arm64" + chip = "arm64" #elseif arch(i386) - chip = "i386" + chip = "i386" #endif components.append("(\(chip))") - + return components.joined(separator: " ") }() /** A `Directions` object provides you with optimal directions between different locations, or waypoints. The directions object passes your request to the [Mapbox Directions API](https://docs.mapbox.com/api/navigation/#directions) and returns the requested information to a closure (block) that you provide. A directions object can handle multiple simultaneous requests. A `RouteOptions` object specifies criteria for the results, such as intermediate waypoints, a mode of transportation, or the level of detail to be returned. - + Each result produced by the directions object is stored in a `Route` object. Depending on the `RouteOptions` object you provide, each route may include detailed information suitable for turn-by-turn directions, or it may include only high-level information such as the distance, estimated travel time, and name of each leg of the trip. The waypoints that form the request may be conflated with nearby locations, as appropriate; the resulting waypoints are provided to the closure. */ open class Directions: NSObject { /** A closure (block) to be called when a directions request is complete. - + - parameter waypoints: An array of `Waypoint` objects. Each waypoint object corresponds to a `Waypoint` object in the original `RouteOptions` object. The locations and names of these waypoints are the result of conflating the original waypoints to known roads. The waypoints may include additional information that was not specified in the original waypoints. - - If the request was canceled or there was an error obtaining the routes, this parameter may be `nil`. + + If the request was canceled or there was an error obtaining the routes, this parameter may be `nil`. - parameter routes: An array of `Route` objects. The preferred route is first; any alternative routes come next if the `RouteOptions` object’s `includesAlternativeRoutes` property was set to `true`. The preferred route depends on the route options object’s `profileIdentifier` property. - - If the request was canceled or there was an error obtaining the routes, this parameter is `nil`. This is not to be confused with the situation in which no results were found, in which case the array is present but empty. + + If the request was canceled or there was an error obtaining the routes, this parameter is `nil`. This is not to be confused with the situation in which no results were found, in which case the array is present but empty. - parameter error: The error that occurred, or `nil` if the placemarks were obtained successfully. */ public typealias RouteCompletionHandler = (_ waypoints: [Waypoint]?, _ routes: [Route]?, _ error: DirectionsError?) -> Void - + /** A closure (block) to be called when a map matching request is complete. - + If the request was canceled or there was an error obtaining the matches, this parameter is `nil`. This is not to be confused with the situation in which no matches were found, in which case the array is present but empty. - parameter error: The error that occurred, or `nil` if the placemarks were obtained successfully. */ - public typealias MatchCompletionHandler = (_ matches: [Match]?, _ error: NSError?) -> Void - + public typealias MatchCompletionHandler = (_ matches: [Match]?, _ error: DirectionsError?) -> Void + // MARK: Creating a Directions Object - + /** The shared directions object. - + To use this object, a Mapbox [access token](https://docs.mapbox.com/help/glossary/access-token/) should be specified in the `MGLMapboxAccessToken` key in the main application bundle’s Info.plist. */ public static let shared = Directions(accessToken: nil) - + /** The API endpoint to use when requesting directions. */ public private(set) var apiEndpoint: URL - + /** The Mapbox access token to associate with the request. */ public let accessToken: String - + /** Initializes a newly created directions object with an optional access token and host. - + - parameter accessToken: A Mapbox [access token](https://docs.mapbox.com/help/glossary/access-token/). If an access token is not specified when initializing the directions object, it should be specified in the `MGLMapboxAccessToken` key in the main application bundle’s Info.plist. - parameter host: An optional hostname to the server API. The [Mapbox Directions API](https://docs.mapbox.com/api/navigation/#directions) endpoint is used by default. */ public init(accessToken: String?, host: String?) { let accessToken = accessToken ?? defaultAccessToken assert(accessToken != nil && !accessToken!.isEmpty, "A Mapbox access token is required. Go to . In Info.plist, set the MGLMapboxAccessToken key to your access token, or use the Directions(accessToken:host:) initializer.") - + self.accessToken = accessToken! - + if let host = host, !host.isEmpty { var baseURLComponents = URLComponents() baseURLComponents.scheme = "https" @@ -129,30 +129,30 @@ open class Directions: NSObject { } else { apiEndpoint = URL(string:(defaultApiEndPointURLString ?? "https://api.mapbox.com"))! } - + } - + /** Initializes a newly created directions object with an optional access token. - + The directions object sends requests to the [Mapbox Directions API](https://docs.mapbox.com/api/navigation/#directions) endpoint. - + - parameter accessToken: A Mapbox [access token](https://docs.mapbox.com/help/glossary/access-token/). If an access token is not specified when initializing the directions object, it should be specified in the `MGLMapboxAccessToken` key in the main application bundle’s Info.plist. */ public convenience init(accessToken: String?) { self.init(accessToken: accessToken, host: nil) } - + // MARK: Getting Directions - + /** Begins asynchronously calculating routes using the given options and delivers the results to a closure. - + This method retrieves the routes asynchronously from the [Mapbox Directions API](https://www.mapbox.com/api-documentation/navigation/#directions) over a network connection. If a connection error or server error occurs, details about the error are passed into the given completion handler in lieu of the routes. - + Routes may be displayed atop a [Mapbox map](https://www.mapbox.com/maps/). - + - parameter options: A `RouteOptions` object specifying the requirements for the resulting routes. - parameter completionHandler: The closure (block) to call with the resulting routes. This closure is executed on the application’s main thread. - returns: The data task used to perform the HTTP request. If, while waiting for the completion handler to execute, you no longer want the resulting routes, cancel this task. @@ -160,10 +160,9 @@ open class Directions: NSObject { @discardableResult open func calculate(_ options: RouteOptions, completionHandler: @escaping RouteCompletionHandler) -> URLSessionDataTask { let fetchStart = Date() - let requestURL = url(forCalculating: options) - let request = URLRequest(url: requestURL) + let request = urlRequest(forCalculating: options) let requestTask = URLSession.shared.dataTask(with: request) { (possibleData, possibleResponse, possibleError) in - + let responseEndDate = Date() guard let response = possibleResponse, response.mimeType == "application/json" else { completionHandler(nil, nil, .invalidResponse) return @@ -190,21 +189,24 @@ open class Directions: NSObject { completionHandler(nil, nil, apiError) return } - result.routes?.forEach { - $0.accessToken = self.accessToken - $0.apiEndpoint = self.apiEndpoint + + guard let routes = result.routes else { + completionHandler(result.waypoints, nil, .unableToRoute) + return } + self.postprocess(routes, fetchStartDate: fetchStart, responseEndDate: responseEndDate, uuid: result.uuid) + DispatchQueue.main.async { - completionHandler(result.waypoints, result.routes, nil) + completionHandler(result.waypoints, routes, nil) } } catch { DispatchQueue.main.async { completionHandler(nil, nil, .unknown(response: nil, underlying: error, code: nil)) } } - - + + } } @@ -213,116 +215,150 @@ open class Directions: NSObject { return requestTask } - - -// let fetchStartDate = Date() -// let task = dataTask(forCalculating: options, completionHandler: { (json) in -// let responseEndDate = Date() -// let response = options.response(from: json) -// if let routes = response.1 { -// self.postprocess(routes, fetchStartDate: fetchStartDate, responseEndDate: responseEndDate, uuid: json["uuid"] as? String) -// } -// completionHandler(response.0, response.1, nil) -// }) { (error) in -// completionHandler(nil, nil, error) -// } -// task.resume() -// return task - - + + + /** Begins asynchronously calculating matches using the given options and delivers the results to a closure. - + This method retrieves the matches asynchronously from the [Mapbox Map Matching API](https://docs.mapbox.com/api/navigation/#map-matching) over a network connection. If a connection error or server error occurs, details about the error are passed into the given completion handler in lieu of the routes. To get `Route`s based on these matches, use the `calculateRoutes(matching:completionHandler:)` method instead. - + - parameter options: A `MatchOptions` object specifying the requirements for the resulting matches. - parameter completionHandler: The closure (block) to call with the resulting matches. This closure is executed on the application’s main thread. - returns: The data task used to perform the HTTP request. If, while waiting for the completion handler to execute, you no longer want the resulting matches, cancel this task. */ @discardableResult open func calculate(_ options: MatchOptions, completionHandler: @escaping MatchCompletionHandler) -> URLSessionDataTask { -// let fetchStartDate = Date() -// let task = dataTask(forCalculating: options, completionHandler: { (json) in -// let responseEndDate = Date() -// let response = options.response(from: json) -// if let matches = response { -// self.postprocess(matches, fetchStartDate: fetchStartDate, responseEndDate: responseEndDate, uuid: json["uuid"] as? String) -// } -// completionHandler(response, nil) -// }) { (error) in -// completionHandler(nil, error) -// } -// task.resume() -// return task + let fetchStart = Date() + let request = urlRequest(forCalculating: options) + let requestTask = URLSession.shared.dataTask(with: request) { (possibleData, possibleResponse, possibleError) in + let responseEndDate = Date() + guard let response = possibleResponse, response.mimeType == "application/json" else { + completionHandler(nil, .invalidResponse) + return + } + + guard let data = possibleData else { + completionHandler(nil, .noData) + return + } + + + if let error = possibleError { + completionHandler(nil, .unknown(response: possibleResponse, underlying: error, code: nil)) + return + } + + DispatchQueue.global(qos: .userInitiated).async { + do { + let decoder = JSONDecoder() + decoder.userInfo[.options] = options + let result = try decoder.decode(MatchResponse.self, from: data) + guard result.code == "Ok" else { + let apiError = Directions.informativeError(code: result.code, response: response, underlyingError: possibleError) + completionHandler(nil, apiError) + return + } + + guard let matches = result.matches else { + completionHandler(nil, .unableToRoute) + return + } + + self.postprocess(matches, fetchStartDate: fetchStart, responseEndDate: responseEndDate, uuid: nil) + + DispatchQueue.main.async { + completionHandler(matches, nil) + } + } catch { + DispatchQueue.main.async { + completionHandler(nil, .unknown(response: nil, underlying: error, code: nil)) + } + } + + + } + + } + requestTask.priority = 1 + requestTask.resume() + + return requestTask } - + /** Begins asynchronously calculating routes that match the given options and delivers the results to a closure. This method retrieves the routes asynchronously from the [Mapbox Map Matching API](https://docs.mapbox.com/api/navigation/#map-matching) over a network connection. If a connection error or server error occurs, details about the error are passed into the given completion handler in lieu of the routes. To get the `Match`es that these routes are based on, use the `calculate(_:completionHandler:)` method instead. - + - parameter options: A `MatchOptions` object specifying the requirements for the resulting match. - parameter completionHandler: The closure (block) to call with the resulting routes. This closure is executed on the application’s main thread. - returns: The data task used to perform the HTTP request. If, while waiting for the completion handler to execute, you no longer want the resulting routes, cancel this task. */ @discardableResult open func calculateRoutes(matching options: MatchOptions, completionHandler: @escaping RouteCompletionHandler) -> URLSessionDataTask { -// let fetchStartDate = Date() -// let task = dataTask(forCalculating: options, completionHandler: { (json) in -// let responseEndDate = Date() -// let response = options.response(containingRoutesFrom: json) -// if let routes = response.1 { -// self.postprocess(routes, fetchStartDate: fetchStartDate, responseEndDate: responseEndDate, uuid: json["uuid"] as? String) -// } -// completionHandler(response.0, response.1, nil) -// }) { (error) in -// completionHandler(nil, nil, error) -// } -// task.resume() -// return task - } - - /** - Returns a URL session task for calculating routes based on the given options that will run the given closures on completion or error. - - - parameter options: A `DirectionsOptions` object specifying the requirements for the resulting routes. - - parameter completionHandler: The closure to call with the parsed JSON response dictionary. - - parameter errorHandler: The closure to call when there is an error. - - returns: The data task for calculating the routes. - - postcondition: The caller must resume the returned task. - */ - fileprivate func dataTask(forCalculating options: DirectionsOptions, completionHandler: @escaping (_ json: JSONDictionary) -> Void, errorHandler: @escaping (_ error: NSError) -> Void) -> URLSessionDataTask { -// let request = urlRequest(forCalculating: options) -// return URLSession.shared.dataTask(with: request) { (data, response, error) in -// var json: JSONDictionary = [:] -// if let data = data, response?.mimeType == "application/json" { -// do { -// json = try JSONSerialization.jsonObject(with: data, options: []) as! JSONDictionary -// } catch { -// assert(false, "Invalid data") -// } -// } -// -// let apiStatusCode = json["code"] as? String -// let apiMessage = json["message"] as? String -// guard !json.isEmpty, data != nil, error == nil && ((apiStatusCode == nil && apiMessage == nil) || apiStatusCode == "Ok") else { -// let apiError = Directions.informativeError(describing: json, response: response, underlyingError: error as NSError?) -// DispatchQueue.main.async { -// errorHandler(apiError) -// } -// return -// } -// -// DispatchQueue.main.async { -// completionHandler(json) -// } -// } + let fetchStart = Date() + let request = urlRequest(forCalculating: options) + let requestTask = URLSession.shared.dataTask(with: request) { (possibleData, possibleResponse, possibleError) in + let responseEndDate = Date() + guard let response = possibleResponse, response.mimeType == "application/json" else { + completionHandler(nil, nil, .invalidResponse) + return + } + + guard let data = possibleData else { + completionHandler(nil, nil, .noData) + return + } + + + if let error = possibleError { + completionHandler(nil, nil, .unknown(response: possibleResponse, underlying: error, code: nil)) + return + } + + DispatchQueue.global(qos: .userInitiated).async { + do { + let decoder = JSONDecoder() + decoder.userInfo[.options] = options + let result = try decoder.decode(MapMatchingResponse.self, from: data) + guard result.code == "Ok" else { + let apiError = Directions.informativeError(code: result.code, response: response, underlyingError: possibleError) + completionHandler(nil, nil, apiError) + return + } + + guard let routes = result.routes else { + completionHandler(result.waypoints, nil, .unableToRoute) + return + } + + self.postprocess(routes, fetchStartDate: fetchStart, responseEndDate: responseEndDate, uuid: nil) + + DispatchQueue.main.async { + completionHandler(result.waypoints, routes, nil) + } + } catch { + DispatchQueue.main.async { + completionHandler(nil, nil, .unknown(response: nil, underlying: error, code: nil)) + } + } + + + } + + } + requestTask.priority = 1 + requestTask.resume() + + return requestTask } - + + /** The GET HTTP URL used to fetch the routes from the API. @@ -340,7 +376,7 @@ open class Directions: NSObject { The HTTP URL used to fetch the routes from the API using the specified HTTP method. The query part of the URL is generally suitable for GET requests. However, if the URL is exceptionally long, it may be more appropriate to send a POST request to a URL without the query part, relegating the query to the body of the HTTP request. Use the `urlRequest(forCalculating:)` method to get an HTTP request that is a GET or POST request as necessary. - + After requesting the URL returned by this method, you can parse the JSON data in the response and pass it into the `Route.init(json:waypoints:profileIdentifier:)` initializer. Alternatively, you can use the `calculate(_:options:)` method, which automatically sends the request and parses the response. - parameter options: A `DirectionsOptions` object specifying the requirements for the resulting routes. @@ -356,7 +392,7 @@ open class Directions: NSObject { if let skuToken = skuToken { params += [URLQueryItem(name: "sku", value: skuToken)] } - + let unparameterizedURL = URL(string: includesQuery ? options.path : options.abridgedPath, relativeTo: apiEndpoint)! var components = URLComponents(url: unparameterizedURL, resolvingAgainstBaseURL: true)! components.queryItems = params @@ -367,7 +403,7 @@ open class Directions: NSObject { The HTTP request used to fetch the routes from the API. The returned request is a GET or POST request as necessary to accommodate URL length limits. - + After sending the request returned by this method, you can parse the JSON data in the response and pass it into the `Route.init(json:waypoints:profileIdentifier:)` initializer. Alternatively, you can use the `calculate(_:options:)` method, which automatically sends the request and parses the response. - parameter options: A `DirectionsOptions` object specifying the requirements for the resulting routes. @@ -388,7 +424,7 @@ open class Directions: NSObject { request.setValue(userAgent, forHTTPHeaderField: "User-Agent") return request } - + /** Returns an error that supplements the given underlying error with additional information from the an HTTP response’s body or headers. */ @@ -399,12 +435,16 @@ open class Directions: NSObject { return .unableToRoute case (200, "NoSegment"): return .unableToLocate + case (200, "NoMatch"): + return .noMatches + case (200, "TooManyCoordinates"): + return .tooManyCoordinates case (404, "ProfileNotFound"): return .profileNotFound - + case (413, _): return .requestTooLarge - + case (429, _): return .rateLimited(rateLimitInterval: response.rateLimitInterval, rateLimit: response.rateLimit, resetTime: response.rateLimitResetTime) default: @@ -417,7 +457,7 @@ open class Directions: NSObject { /** Adds request- or response-specific information to each result in a response. */ - func postprocess(_ results: inout [DirectionsResult], fetchStartDate: Date, responseEndDate: Date, uuid: String?) { + func postprocess(_ results: [DirectionsResult], fetchStartDate: Date, responseEndDate: Date, uuid: String?) { for result in results { result.accessToken = self.accessToken result.apiEndpoint = self.apiEndpoint diff --git a/Sources/MapboxDirections/MBRouteOptions.swift b/Sources/MapboxDirections/MBRouteOptions.swift index 9d4c8f4de..1d743ecfc 100644 --- a/Sources/MapboxDirections/MBRouteOptions.swift +++ b/Sources/MapboxDirections/MBRouteOptions.swift @@ -80,6 +80,17 @@ open class RouteOptions: DirectionsOptions { try super.init(from: decoder) } + internal convenience init(matchOptions: MatchOptions) { + self.init(waypoints: matchOptions.waypoints, profileIdentifier: matchOptions.profileIdentifier) + self.includesSteps = matchOptions.includesSteps + self.shapeFormat = matchOptions.shapeFormat + self.attributeOptions = matchOptions.attributeOptions + self.routeShapeResolution = matchOptions.routeShapeResolution + self.locale = matchOptions.locale + self.includesSpokenInstructions = matchOptions.includesSpokenInstructions + self.includesVisualInstructions = matchOptions.includesVisualInstructions + } + // MARK: Specifying the Path of the Route /** diff --git a/Sources/MapboxDirections/Match/MBMatch.swift b/Sources/MapboxDirections/Match/MBMatch.swift index 555730798..c108f6d68 100644 --- a/Sources/MapboxDirections/Match/MBMatch.swift +++ b/Sources/MapboxDirections/Match/MBMatch.swift @@ -26,7 +26,7 @@ open class Match: DirectionsResult { public required init(from decoder: Decoder) throws { let container = try decoder.container(keyedBy: CodingKeys.self) confidence = try container.decode(Float.self, forKey: .confidence) - tracepoints = try container.decodeIfPresent([Tracepoint].self, forKey: .tracepoints) ?? decoder.userInfo[.tracepoints] as! [Tracepoint] + tracepoints = try container.decodeIfPresent([Tracepoint].self, forKey: .tracepoints) ?? decoder.userInfo[.tracepoints] as? [Tracepoint] ?? [] try super.init(from: decoder) } diff --git a/Sources/MapboxDirections/Match/MBMatchOptions.swift b/Sources/MapboxDirections/Match/MBMatchOptions.swift index f912ed8ac..438b358e5 100644 --- a/Sources/MapboxDirections/Match/MBMatchOptions.swift +++ b/Sources/MapboxDirections/Match/MBMatchOptions.swift @@ -76,20 +76,6 @@ open class MatchOptions: DirectionsOptions { return super.legSeparators } } - -// public required init?(coder decoder: NSCoder) { -// resamplesTraces = decoder.decodeBool(forKey: "resampleTraces") -// super.init(coder: decoder) -// var deprecations = self as MatchOptionsDeprecations -// deprecations.waypointIndices = decoder.decodeObject(of: NSIndexSet.self, forKey: "waypointIndices") as IndexSet? -// } -// -// public override func encode(with coder: NSCoder) { -// coder.encode(resamplesTraces, forKey: "resampleTraces") -// coder.encode((self as MatchOptionsDeprecations).waypointIndices, forKey: "waypointIndices") -// super.encode(with: coder) -// } - override open var urlQueryItems: [URLQueryItem] { var queryItems = super.urlQueryItems @@ -108,74 +94,7 @@ open class MatchOptions: DirectionsOptions { internal override var abridgedPath: String { return "matching/v5/\(profileIdentifier.rawValue)" } - - internal func response(from json: JSONDictionary) -> [Match]? { - - var waypointIndices = IndexSet() - - let tracepoints = (json["tracepoints"] as! [Any]).map { api -> Tracepoint in - guard let api = api as? JSONDictionary else { - return Tracepoint(coordinate: kCLLocationCoordinate2DInvalid, alternateCount: nil, name: nil) - } - let location = api["location"] as! [Double] - let coordinate = CLLocationCoordinate2D(geoJSON: location) - let alternateCount = api["alternatives_count"] as! Int - let name = api["name"] as? String - if let waypointIndex = api["waypoint_index"] as? Int { - waypointIndices.insert(waypointIndex) - } - return Tracepoint(coordinate: coordinate, alternateCount: alternateCount, name: name) - } - - let matchings = (json["matchings"] as? [JSONDictionary])?.map { - Match(json: $0, tracepoints: tracepoints, waypointIndices: waypointIndices, matchOptions: self) - } - - return matchings - } - - /** - Returns response objects that represent the given JSON dictionary data. - - - parameter json: The API response in JSON dictionary format. - - returns: A tuple containing an array of waypoints and an array of routes. - */ - internal func response(containingRoutesFrom json: JSONDictionary) -> ([Waypoint]?, [Route]?) { - - var namedWaypoints: [Waypoint]? - if let jsonWaypoints = (json["tracepoints"] as? [JSONDictionary]) { - namedWaypoints = zip(jsonWaypoints, self.waypoints).map { (api, local) -> Waypoint in - let location = api["location"] as! [Double] - let coordinate = CLLocationCoordinate2D(geoJSON: location) - let possibleAPIName = api["name"] as? String - let apiName = possibleAPIName?.nonEmptyString - let waypoint = local.copy() as! Waypoint - waypoint.coordinate = coordinate - waypoint.name = waypoint.name ?? apiName - return waypoint - } - } - - let waypoints = namedWaypoints ?? self.waypoints - let opts = RouteOptions(matchOptions: self) - - let legSeparators: [Waypoint] - if let indices = (self as MatchOptionsDeprecations).waypointIndices { - legSeparators = indices.map { waypoints[$0] } - } else { - waypoints.first?.separatesLegs = true - waypoints.last?.separatesLegs = true - legSeparators = waypoints.filter { $0.separatesLegs } - } - - let routes = (json["matchings"] as? [JSONDictionary])?.map { - Route(json: $0, waypoints: legSeparators, options: opts) - } - - return (waypoints, routes) - } } - private protocol MatchOptionsDeprecations { var waypointIndices: IndexSet? { get set } } diff --git a/Sources/MapboxDirections/Match/MapMatchingResponse.swift b/Sources/MapboxDirections/Match/MapMatchingResponse.swift new file mode 100644 index 000000000..1a7f0f996 --- /dev/null +++ b/Sources/MapboxDirections/Match/MapMatchingResponse.swift @@ -0,0 +1,35 @@ +import Foundation + + +class MapMatchingResponse: Decodable { + var code: String + var routes : [Route]? + var waypoints: [Waypoint] + + private enum CodingKeys: String, CodingKey { + case code + case matches = "matchings" + case tracepoints + } + + public required init(from decoder: Decoder) throws { + let options = decoder.userInfo[.options] as? MatchOptions + let container = try decoder.container(keyedBy: CodingKeys.self) + code = try container.decode(String.self, forKey: .code) + let waypoints = try container.decode([Waypoint].self, forKey: .tracepoints) + + if let optionsPoints = options?.waypoints { + let updatedPoints = zip(waypoints, optionsPoints).map { (arg) -> Waypoint in + let (local, api) = arg + + return Waypoint(coordinate: api.coordinate, coordinateAccuracy: local.coordinateAccuracy, name: local.name ?? api.name) + } + self.waypoints = updatedPoints + } else { + self.waypoints = waypoints + } + + routes = try container.decodeIfPresent([Route].self, forKey: .matches) + } + +} diff --git a/Sources/MapboxDirections/Match/MatchResponse.swift b/Sources/MapboxDirections/Match/MatchResponse.swift index b2ce77ef3..60ba81262 100644 --- a/Sources/MapboxDirections/Match/MatchResponse.swift +++ b/Sources/MapboxDirections/Match/MatchResponse.swift @@ -2,18 +2,21 @@ import Foundation class MatchResponse: Codable { - var matches : [Match] + var code: String + var matches : [Match]? var tracepoints: [Tracepoint] private enum CodingKeys: String, CodingKey { + case code case matches = "matchings" case tracepoints } public required init(from decoder: Decoder) throws { let container = try decoder.container(keyedBy: CodingKeys.self) + code = try container.decode(String.self, forKey: .code) tracepoints = try container.decode([Tracepoint].self, forKey: .tracepoints) (decoder as? JSONDecoder)?.userInfo[.tracepoints] = tracepoints - matches = try container.decode([Match].self, forKey: .matches) + matches = try container.decodeIfPresent([Match].self, forKey: .matches) } } From e03e2951c13a4145b8c52e8bbdaf022fa4f6ba5b Mon Sep 17 00:00:00 2001 From: Jerrad Thramer Date: Wed, 16 Oct 2019 13:32:19 -0600 Subject: [PATCH 09/89] Both examples working now. --- Directions Example/ViewController.swift | 23 +++++++-- .../MapboxDirections/DirectionsError.swift | 17 +++++-- Sources/MapboxDirections/MBDirections.swift | 29 +++++------ .../MBDirectionsOptions.swift | 11 ++--- .../MapboxDirections/MBDirectionsResult.swift | 10 +++- Sources/MapboxDirections/MBRoute.swift | 2 + Sources/MapboxDirections/MBRouteLeg.swift | 49 ++++++++++++------- Sources/MapboxDirections/MBRouteOptions.swift | 6 ++- Sources/MapboxDirections/Match/MBMatch.swift | 4 +- .../MapboxDirections/Match/MBTracepoint.swift | 2 +- .../Match/MatchResponse.swift | 7 ++- Sources/MapboxDirections/RouteResponse.swift | 2 +- 12 files changed, 106 insertions(+), 56 deletions(-) diff --git a/Directions Example/ViewController.swift b/Directions Example/ViewController.swift index 7ede37ad4..583b1de53 100644 --- a/Directions Example/ViewController.swift +++ b/Directions Example/ViewController.swift @@ -65,8 +65,8 @@ class ViewController: UIViewController, MBDrawingViewDelegate { func setupDirections() { let wp1 = Waypoint(coordinate: CLLocationCoordinate2D(latitude: 38.9131752, longitude: -77.0324047), name: "Mapbox") let wp2 = Waypoint(coordinate: CLLocationCoordinate2D(latitude: 38.8977, longitude: -77.0365), name: "White House") - wp1.allowsArrivingOnOppositeSide = false - wp2.allowsArrivingOnOppositeSide = false +// wp1.allowsArrivingOnOppositeSide = false +// wp2.allowsArrivingOnOppositeSide = false let options = RouteOptions(waypoints: [wp1, wp2]) options.includesSteps = true @@ -124,8 +124,16 @@ class ViewController: UIViewController, MBDrawingViewDelegate { } func drawingView(drawingView: MBDrawingView, didDrawWithPoints points: [CGPoint]) { + guard points.count > 0 else { return } - let coordinates = points.map { + let ratio: Double = Double(points.count) / 100.0 + let keepEvery = Int(ratio.rounded(.up)) + + let abridgedPoints = points.enumerated().compactMap { index, element -> CGPoint? in + guard index % keepEvery == 0 else { return nil } + return element + } + let coordinates = abridgedPoints.map { mapView.convert($0, toCoordinateFrom: mapView) } makeMatchRequest(locations: coordinates) @@ -136,7 +144,14 @@ class ViewController: UIViewController, MBDrawingViewDelegate { Directions.shared.calculate(matchOptions) { (matches, error) in if let error = error { - print(error.localizedDescription) + let errorString = """ + ⚠️ Error Enountered. ⚠️ + Failure Reason: \(error.failureReason) + Recovery Suggestion: \(error.recoverySuggestion) + + Technical Details: \(error) + """ + print(errorString) return } diff --git a/Sources/MapboxDirections/DirectionsError.swift b/Sources/MapboxDirections/DirectionsError.swift index b25cbba00..7964dff29 100644 --- a/Sources/MapboxDirections/DirectionsError.swift +++ b/Sources/MapboxDirections/DirectionsError.swift @@ -15,10 +15,16 @@ public enum DirectionsError: Error, RawRepresentable { Recovery Suggestion: \(recoverySuggestion) """ } + public var localizedDescription: String { + return failureReason + } + public var failureReason: String { switch self { case .noData: return "No data was returned from the server." + case let .invalidInput(message): + return "The server did not accept the format of the request. Message returned: \(message ?? "")" case .invalidResponse: return "A response was recieved from the server, but it was not of a valid format." case .unableToRoute: @@ -42,8 +48,8 @@ public enum DirectionsError: Error, RawRepresentable { let formattedInterval = intervalFormatter.string(from: interval) ?? "\(interval) seconds" let formattedCount = NumberFormatter.localizedString(from: NSNumber(value: limit), number: .decimal) return "More than \(formattedCount) requests have been made with this access token within a period of \(formattedInterval)" - case let .unknown(response: response, underlying: error, code: code): - return "Unknown Error. Response: \(response.debugDescription) Underlying Error: \(error.debugDescription) Code: \(code.debugDescription)" + case let .unknown(response, underlying: error, code, message): + return "Unknown Error. Response: \(response.debugDescription) Underlying Error: \(error.debugDescription) Code: \(code.debugDescription) Message:\(message.debugDescription)" } } @@ -51,6 +57,8 @@ public enum DirectionsError: Error, RawRepresentable { switch self { case .noData: return "Make sure you have an active internet connection." + case let .invalidInput(message): + return "Please adjust the input according to the message returned from the server. Message Returned: \(message ?? "")" case .unableToRoute: return "Make sure it is possible to travel between the locations with the mode of transportation implied by the profileIdentifier option. For example, it is impossible to travel by car from one continent to another without either a land bridge or a ferry connection." case .noMatches: @@ -71,7 +79,7 @@ public enum DirectionsError: Error, RawRepresentable { return "Wait until \(formattedDate) before retrying." case .invalidResponse: fallthrough - case .unknown(_,_,_): + case .unknown(_,_,_,_): return "Please contact Mapbox Support." } } @@ -79,6 +87,7 @@ public enum DirectionsError: Error, RawRepresentable { case noData + case invalidInput(message: String?) case invalidResponse case unableToRoute case noMatches @@ -87,6 +96,6 @@ public enum DirectionsError: Error, RawRepresentable { case profileNotFound case requestTooLarge case rateLimited(rateLimitInterval: TimeInterval?, rateLimit: UInt?, resetTime: Date?) - case unknown(response: URLResponse?, underlying: Error?, code: String?) + case unknown(response: URLResponse?, underlying: Error?, code: String?, message: String?) } diff --git a/Sources/MapboxDirections/MBDirections.swift b/Sources/MapboxDirections/MBDirections.swift index 426968fa1..998431a0b 100644 --- a/Sources/MapboxDirections/MBDirections.swift +++ b/Sources/MapboxDirections/MBDirections.swift @@ -175,7 +175,7 @@ open class Directions: NSObject { if let error = possibleError { - completionHandler(nil, nil, .unknown(response: possibleResponse, underlying: error, code: nil)) + completionHandler(nil, nil, .unknown(response: possibleResponse, underlying: error, code: nil, message: nil)) return } @@ -185,7 +185,7 @@ open class Directions: NSObject { decoder.userInfo[.options] = options let result = try decoder.decode(RouteResponse.self, from: data) guard (result.code == nil && result.message == nil) || result.code == "Ok" else { - let apiError = Directions.informativeError(code: result.code, response: response, underlyingError: possibleError) + let apiError = Directions.informativeError(code: result.code, message: result.message, response: response, underlyingError: possibleError) completionHandler(nil, nil, apiError) return } @@ -202,7 +202,7 @@ open class Directions: NSObject { } } catch { DispatchQueue.main.async { - completionHandler(nil, nil, .unknown(response: nil, underlying: error, code: nil)) + completionHandler(nil, nil, .unknown(response: response, underlying: error, code: nil, message: nil)) } } @@ -247,7 +247,7 @@ open class Directions: NSObject { if let error = possibleError { - completionHandler(nil, .unknown(response: possibleResponse, underlying: error, code: nil)) + completionHandler(nil, .unknown(response: possibleResponse, underlying: error, code: nil, message: nil)) return } @@ -257,7 +257,7 @@ open class Directions: NSObject { decoder.userInfo[.options] = options let result = try decoder.decode(MatchResponse.self, from: data) guard result.code == "Ok" else { - let apiError = Directions.informativeError(code: result.code, response: response, underlyingError: possibleError) + let apiError = Directions.informativeError(code: result.code, message: result.message, response: response, underlyingError: possibleError) completionHandler(nil, apiError) return } @@ -274,7 +274,7 @@ open class Directions: NSObject { } } catch { DispatchQueue.main.async { - completionHandler(nil, .unknown(response: nil, underlying: error, code: nil)) + completionHandler(nil, .unknown(response: response, underlying: error, code: nil, message: nil)) } } @@ -317,7 +317,7 @@ open class Directions: NSObject { if let error = possibleError { - completionHandler(nil, nil, .unknown(response: possibleResponse, underlying: error, code: nil)) + completionHandler(nil, nil, .unknown(response: possibleResponse, underlying: error, code: nil, message: nil)) return } @@ -327,7 +327,7 @@ open class Directions: NSObject { decoder.userInfo[.options] = options let result = try decoder.decode(MapMatchingResponse.self, from: data) guard result.code == "Ok" else { - let apiError = Directions.informativeError(code: result.code, response: response, underlyingError: possibleError) + let apiError = Directions.informativeError(code: result.code, message:nil, response: response, underlyingError: possibleError) completionHandler(nil, nil, apiError) return } @@ -344,7 +344,7 @@ open class Directions: NSObject { } } catch { DispatchQueue.main.async { - completionHandler(nil, nil, .unknown(response: nil, underlying: error, code: nil)) + completionHandler(nil, nil, .unknown(response: response, underlying: error, code: nil, message: nil)) } } @@ -428,7 +428,7 @@ open class Directions: NSObject { /** Returns an error that supplements the given underlying error with additional information from the an HTTP response’s body or headers. */ - static func informativeError(code: String?, response: URLResponse?, underlyingError error: Error?) -> DirectionsError { + static func informativeError(code: String?, message: String?, response: URLResponse?, underlyingError error: Error?) -> DirectionsError { if let response = response as? HTTPURLResponse { switch (response.statusCode, code ?? "") { case (200, "NoRoute"): @@ -437,21 +437,22 @@ open class Directions: NSObject { return .unableToLocate case (200, "NoMatch"): return .noMatches - case (200, "TooManyCoordinates"): + case (422, "TooManyCoordinates"): return .tooManyCoordinates case (404, "ProfileNotFound"): return .profileNotFound case (413, _): return .requestTooLarge - + case (422, "InvalidInput"): + return .invalidInput(message: message) case (429, _): return .rateLimited(rateLimitInterval: response.rateLimitInterval, rateLimit: response.rateLimit, resetTime: response.rateLimitResetTime) default: - return .unknown(response: response, underlying: error, code: code) + return .unknown(response: response, underlying: error, code: code, message: message) } } - return .unknown(response: nil, underlying: error, code: code) + return .unknown(response: response, underlying: error, code: code, message: message) } /** diff --git a/Sources/MapboxDirections/MBDirectionsOptions.swift b/Sources/MapboxDirections/MBDirectionsOptions.swift index 724ce7e38..b859ba221 100644 --- a/Sources/MapboxDirections/MBDirectionsOptions.swift +++ b/Sources/MapboxDirections/MBDirectionsOptions.swift @@ -282,8 +282,9 @@ open class DirectionsOptions: Codable { // NSSecureCoding, NSCopying { var urlQueryItems: [URLQueryItem] { var queryItems: [URLQueryItem] = [ - URLQueryItem(name: "geometries", value: String(describing: shapeFormat)), - URLQueryItem(name: "overview", value: String(describing: routeShapeResolution)), + URLQueryItem(name: "geometries", value: shapeFormat.rawValue), + URLQueryItem(name: "overview", value: routeShapeResolution.rawValue), + URLQueryItem(name: "steps", value: String(includesSteps)), URLQueryItem(name: "language", value: locale.identifier) ] @@ -296,7 +297,7 @@ open class DirectionsOptions: Codable { // NSSecureCoding, NSCopying { if includesSpokenInstructions { queryItems.append(URLQueryItem(name: "voice_instructions", value: String(includesSpokenInstructions))) - queryItems.append(URLQueryItem(name: "voice_units", value: String(describing: distanceMeasurementSystem))) + queryItems.append(URLQueryItem(name: "voice_units", value: distanceMeasurementSystem.rawValue)) } if includesVisualInstructions { @@ -325,10 +326,6 @@ open class DirectionsOptions: Codable { // NSSecureCoding, NSCopying { queryItems.append(URLQueryItem(name: "waypoint_names", value: names)) } - if let coordinates = self.coordinates { - queryItems.append(URLQueryItem(name: "coordinates", value: coordinates)) - } - return queryItems } diff --git a/Sources/MapboxDirections/MBDirectionsResult.swift b/Sources/MapboxDirections/MBDirectionsResult.swift index c73879595..3bb2139c7 100644 --- a/Sources/MapboxDirections/MBDirectionsResult.swift +++ b/Sources/MapboxDirections/MBDirectionsResult.swift @@ -42,7 +42,7 @@ open class DirectionsResult: Codable { directionsOptions = try container.decodeIfPresent(DirectionsOptions.self, forKey: .directionsOptions) ?? decoder.userInfo[.options] as! DirectionsOptions - + switch directionsOptions.shapeFormat { case .geoJSON: @@ -65,6 +65,14 @@ open class DirectionsResult: Codable { shape = LineString(polyline.coordinates!) } + // Associate each leg JSON with a source and destination. The sequence of destinations is offset by one from the sequence of sources. + let waypoints = directionsOptions.waypoints + let legInfos = zip(zip(waypoints.prefix(upTo: waypoints.endIndex - 1), waypoints.suffix(from: 1)), legs) + for legInfo in legInfos { + legInfo.1.source = legInfo.0.0 + legInfo.1.destination = legInfo.0.1 + } + accessToken = try container.decodeIfPresent(String.self, forKey: .accessToken) apiEndpoint = try container.decodeIfPresent(URL.self, forKey: .apiEndpoint) routeIdentifier = try container.decodeIfPresent(String.self, forKey: .routeIdentifier) diff --git a/Sources/MapboxDirections/MBRoute.swift b/Sources/MapboxDirections/MBRoute.swift index cdaf96b8b..adacec5a7 100644 --- a/Sources/MapboxDirections/MBRoute.swift +++ b/Sources/MapboxDirections/MBRoute.swift @@ -9,6 +9,8 @@ import Polyline open class Route: DirectionsResult { public required init(from decoder: Decoder) throws { try super.init(from: decoder) + + } public override func encode(to encoder: Encoder) throws { diff --git a/Sources/MapboxDirections/MBRouteLeg.swift b/Sources/MapboxDirections/MBRouteLeg.swift index fe73acfd7..82dedb164 100644 --- a/Sources/MapboxDirections/MBRouteLeg.swift +++ b/Sources/MapboxDirections/MBRouteLeg.swift @@ -16,44 +16,55 @@ open class RouteLeg: Codable { case source case destination case steps - case segmentDistances - case expectedSegmentTravelTimes - case segmentSpeeds - case segmentCongestionLevels - case name + case name = "summary" case distance - case expectedTravelTime + case expectedTravelTime = "duration" case profileIdentifier + case annotation + } + + private enum AnnotationCodingKeys: String, CodingKey { + case segmentDistances = "distance" + case expectedSegmentTravelTimes = "duration" + case segmentSpeeds = "speed" + case segmentCongestionLevels = "congestion" } + public required init(from decoder: Decoder) throws { let container = try decoder.container(keyedBy: CodingKeys.self) - source = try container.decode(Waypoint.self, forKey: .source) - destination = try container.decode(Waypoint.self, forKey: .destination) + let options = decoder.userInfo[.options] as? DirectionsOptions + + source = try container.decodeIfPresent(Waypoint.self, forKey: .source) + destination = try container.decodeIfPresent(Waypoint.self, forKey: .destination) steps = try container.decode([RouteStep].self, forKey: .steps) - segmentDistances = try container.decodeIfPresent([CLLocationDistance].self, forKey: .segmentDistances) - expectedSegmentTravelTimes = try container.decodeIfPresent([TimeInterval].self, forKey: .expectedSegmentTravelTimes) - segmentSpeeds = try container.decodeIfPresent([CLLocationSpeed].self, forKey: .segmentSpeeds) - segmentCongestionLevels = try container.decodeIfPresent([CongestionLevel].self, forKey: .segmentCongestionLevels) name = try container.decode(String.self, forKey: .name) distance = try container.decode(CLLocationDistance.self, forKey: .distance) expectedTravelTime = try container.decode(TimeInterval.self, forKey: .expectedTravelTime) - profileIdentifier = try container.decode(DirectionsProfileIdentifier.self, forKey: .profileIdentifier) + profileIdentifier = try container.decodeIfPresent(DirectionsProfileIdentifier.self, forKey: .profileIdentifier) ?? options!.profileIdentifier + + let annotation = try? container.nestedContainer(keyedBy: AnnotationCodingKeys.self, forKey: .annotation) + segmentDistances = try annotation?.decodeIfPresent([CLLocationDistance].self, forKey: .segmentDistances) + expectedSegmentTravelTimes = try annotation?.decodeIfPresent([TimeInterval].self, forKey: .expectedSegmentTravelTimes) + segmentSpeeds = try annotation?.decodeIfPresent([CLLocationSpeed].self, forKey: .segmentSpeeds) + segmentCongestionLevels = try annotation?.decodeIfPresent([CongestionLevel].self, forKey: .segmentCongestionLevels) } public func encode(to encoder: Encoder) throws { var container = encoder.container(keyedBy: CodingKeys.self) try container.encode(source, forKey: .source) try container.encode(destination, forKey: .destination) try container.encode(steps, forKey: .steps) - try container.encodeIfPresent(segmentDistances, forKey: .segmentDistances) - try container.encodeIfPresent(expectedSegmentTravelTimes, forKey: .expectedSegmentTravelTimes) - try container.encodeIfPresent(segmentSpeeds, forKey: .segmentSpeeds) - try container.encodeIfPresent(segmentCongestionLevels, forKey: .segmentCongestionLevels) try container.encode(name, forKey: .name) try container.encode(distance, forKey: .distance) try container.encode(expectedTravelTime, forKey: .expectedTravelTime) try container.encode(profileIdentifier, forKey: .profileIdentifier) + + var annotation = container.nestedContainer(keyedBy: AnnotationCodingKeys.self, forKey: .annotation) + try annotation.encode(segmentDistances, forKey: .segmentDistances) + try annotation.encode(expectedSegmentTravelTimes, forKey: .expectedSegmentTravelTimes) + try annotation.encode(segmentSpeeds, forKey: .segmentSpeeds) + try annotation.encode(segmentCongestionLevels, forKey: .segmentCongestionLevels) } @@ -169,14 +180,14 @@ open class RouteLeg: Codable { Unless this is the first leg of the route, the source of this leg is the same as the destination of the previous leg. */ - public var source: Waypoint + public var source: Waypoint? /** The endpoint of the route leg. Unless this is the last leg of the route, the destination of this leg is the same as the source of the next leg. */ - public var destination: Waypoint + public var destination: Waypoint? /** An array of one or more `RouteStep` objects representing the steps for traversing this leg of the route. diff --git a/Sources/MapboxDirections/MBRouteOptions.swift b/Sources/MapboxDirections/MBRouteOptions.swift index 1d743ecfc..c2959217d 100644 --- a/Sources/MapboxDirections/MBRouteOptions.swift +++ b/Sources/MapboxDirections/MBRouteOptions.swift @@ -93,6 +93,10 @@ open class RouteOptions: DirectionsOptions { // MARK: Specifying the Path of the Route + internal override var abridgedPath: String { + return "directions/v5/\(profileIdentifier.rawValue)" + } + /** A Boolean value that indicates whether a returned route may require a point U-turn at an intermediate waypoint. @@ -190,7 +194,7 @@ open class RouteOptions: DirectionsOptions { // params.append(URLQueryItem(name: "annotations", value: attributesStrings)) // } - return params + return params + super.urlQueryItems } // // MARK: NSCopying diff --git a/Sources/MapboxDirections/Match/MBMatch.swift b/Sources/MapboxDirections/Match/MBMatch.swift index c108f6d68..b0b2d0644 100644 --- a/Sources/MapboxDirections/Match/MBMatch.swift +++ b/Sources/MapboxDirections/Match/MBMatch.swift @@ -26,7 +26,7 @@ open class Match: DirectionsResult { public required init(from decoder: Decoder) throws { let container = try decoder.container(keyedBy: CodingKeys.self) confidence = try container.decode(Float.self, forKey: .confidence) - tracepoints = try container.decodeIfPresent([Tracepoint].self, forKey: .tracepoints) ?? decoder.userInfo[.tracepoints] as? [Tracepoint] ?? [] + tracepoints = try container.decodeIfPresent([Tracepoint?].self, forKey: .tracepoints) ?? decoder.userInfo[.tracepoints] as? [Tracepoint?] ?? [] try super.init(from: decoder) } @@ -77,7 +77,7 @@ open class Match: DirectionsResult { Any outlier tracepoint is omitted from the match. This array represents an outlier tracepoint is a `Tracepoint` object whose `Tracepoint.coordinate` property is `kCLLocationCoordinate2DInvalid`. */ - open var tracepoints: [Tracepoint] + open var tracepoints: [Tracepoint?] /** diff --git a/Sources/MapboxDirections/Match/MBTracepoint.swift b/Sources/MapboxDirections/Match/MBTracepoint.swift index 1899c45b8..dc96fc835 100644 --- a/Sources/MapboxDirections/Match/MBTracepoint.swift +++ b/Sources/MapboxDirections/Match/MBTracepoint.swift @@ -14,7 +14,7 @@ public class Tracepoint: Waypoint { open var alternateCount: Int = NSNotFound private enum CodingKeys: String, CodingKey { - case alternateCount + case alternateCount = "alternatives_count" } init(coordinate: CLLocationCoordinate2D, alternateCount: Int?, name: String?) { diff --git a/Sources/MapboxDirections/Match/MatchResponse.swift b/Sources/MapboxDirections/Match/MatchResponse.swift index 60ba81262..5a0db9c04 100644 --- a/Sources/MapboxDirections/Match/MatchResponse.swift +++ b/Sources/MapboxDirections/Match/MatchResponse.swift @@ -3,11 +3,13 @@ import Foundation class MatchResponse: Codable { var code: String + var message: String? var matches : [Match]? - var tracepoints: [Tracepoint] + var tracepoints: [Tracepoint?]? private enum CodingKeys: String, CodingKey { case code + case message case matches = "matchings" case tracepoints } @@ -15,7 +17,8 @@ class MatchResponse: Codable { public required init(from decoder: Decoder) throws { let container = try decoder.container(keyedBy: CodingKeys.self) code = try container.decode(String.self, forKey: .code) - tracepoints = try container.decode([Tracepoint].self, forKey: .tracepoints) + message = try container.decodeIfPresent(String.self, forKey: .message) + tracepoints = try container.decodeIfPresent([Tracepoint?].self, forKey: .tracepoints) (decoder as? JSONDecoder)?.userInfo[.tracepoints] = tracepoints matches = try container.decodeIfPresent([Match].self, forKey: .matches) } diff --git a/Sources/MapboxDirections/RouteResponse.swift b/Sources/MapboxDirections/RouteResponse.swift index 4f75a67f2..9c8a9a843 100644 --- a/Sources/MapboxDirections/RouteResponse.swift +++ b/Sources/MapboxDirections/RouteResponse.swift @@ -47,7 +47,7 @@ struct RouteResponse: Codable { if let destinations = waypoints?.dropFirst() { routesWithDestinations = rawRoutes?.map({ (route) -> Route in for (leg, destination) in zip(route.legs, destinations) { - if leg.destination.name?.nonEmptyString == nil { + if leg.destination?.name?.nonEmptyString == nil { leg.destination = destination } } From 0d186e03b242a5ca187bf9afbfd686d8b31cbf10 Mon Sep 17 00:00:00 2001 From: Jerrad Thramer Date: Thu, 17 Oct 2019 17:13:20 -0600 Subject: [PATCH 10/89] Continuing to fix tests --- MapboxDirections.xcodeproj/project.pbxproj | 8 -- .../xcshareddata/xcschemes/Example.xcscheme | 5 + .../MapboxDirections/DirectionsError.swift | 4 +- Sources/MapboxDirections/MBDirections.swift | 42 ++++++-- .../MBDirectionsOptions.swift | 44 ++++++-- .../MapboxDirections/MBDirectionsResult.swift | 10 +- Sources/MapboxDirections/MBRouteOptions.swift | 88 +++++++++------ Sources/MapboxDirections/MBWaypoint.swift | 27 +++-- Sources/MapboxDirections/Match/MBMatch.swift | 14 ++- .../Match/MBMatchOptions.swift | 10 ++ .../MapboxDirections/Match/MBTracepoint.swift | 10 +- .../Match/MatchResponse.swift | 9 +- .../AnnotationTests.swift | 4 +- .../DirectionsTests.swift | 33 +++--- .../Fixtures/Match/match.json | 2 +- .../IntersectionTests.swift | 100 +++++++++++++----- Tests/MapboxDirectionsTests/MatchTests.swift | 41 +++---- .../RoutableMatchTests.swift | 9 +- .../RouteOptionsTests.swift | 87 +++------------ .../RouteStepTests.swift | 100 +++++++++--------- Tests/MapboxDirectionsTests/V4Tests.swift | 93 ---------------- Tests/MapboxDirectionsTests/V5Tests.swift | 59 ++++++----- .../VisualInstructionComponentTests.swift | 13 ++- .../WalkingOptionsTests.swift | 8 +- .../MapboxDirectionsTests/WaypointTests.swift | 56 ++++------ 25 files changed, 423 insertions(+), 453 deletions(-) delete mode 100644 Tests/MapboxDirectionsTests/V4Tests.swift diff --git a/MapboxDirections.xcodeproj/project.pbxproj b/MapboxDirections.xcodeproj/project.pbxproj index 4a7d2780f..cb660497f 100644 --- a/MapboxDirections.xcodeproj/project.pbxproj +++ b/MapboxDirections.xcodeproj/project.pbxproj @@ -229,9 +229,6 @@ DA737EE41D05F91E005BDA16 /* v5_driving_dc_geojson.json in Resources */ = {isa = PBXBuildFile; fileRef = DA737EE31D05F91E005BDA16 /* v5_driving_dc_geojson.json */; }; DA737EE51D05F91E005BDA16 /* v5_driving_dc_geojson.json in Resources */ = {isa = PBXBuildFile; fileRef = DA737EE31D05F91E005BDA16 /* v5_driving_dc_geojson.json */; }; DA737EE61D05F91E005BDA16 /* v5_driving_dc_geojson.json in Resources */ = {isa = PBXBuildFile; fileRef = DA737EE31D05F91E005BDA16 /* v5_driving_dc_geojson.json */; }; - DA737EE81D0611CB005BDA16 /* V4Tests.swift in Sources */ = {isa = PBXBuildFile; fileRef = DA737EE71D0611CB005BDA16 /* V4Tests.swift */; }; - DA737EE91D0611CB005BDA16 /* V4Tests.swift in Sources */ = {isa = PBXBuildFile; fileRef = DA737EE71D0611CB005BDA16 /* V4Tests.swift */; }; - DA737EEA1D0611CB005BDA16 /* V4Tests.swift in Sources */ = {isa = PBXBuildFile; fileRef = DA737EE71D0611CB005BDA16 /* V4Tests.swift */; }; DA737EEE1D06175B005BDA16 /* v4_driving_dc_geojson.json in Resources */ = {isa = PBXBuildFile; fileRef = DA737EED1D06175B005BDA16 /* v4_driving_dc_geojson.json */; }; DA737EEF1D06175B005BDA16 /* v4_driving_dc_geojson.json in Resources */ = {isa = PBXBuildFile; fileRef = DA737EED1D06175B005BDA16 /* v4_driving_dc_geojson.json */; }; DA737EF01D06175B005BDA16 /* v4_driving_dc_geojson.json in Resources */ = {isa = PBXBuildFile; fileRef = DA737EED1D06175B005BDA16 /* v4_driving_dc_geojson.json */; }; @@ -397,7 +394,6 @@ DA6C9DAB1CAEC72800094FBC /* V5Tests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = V5Tests.swift; sourceTree = ""; }; DA6C9DB11CAECA0E00094FBC /* Fixture.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Fixture.swift; sourceTree = ""; }; DA737EE31D05F91E005BDA16 /* v5_driving_dc_geojson.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = v5_driving_dc_geojson.json; sourceTree = ""; }; - DA737EE71D0611CB005BDA16 /* V4Tests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = V4Tests.swift; sourceTree = ""; }; DA737EED1D06175B005BDA16 /* v4_driving_dc_geojson.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = v4_driving_dc_geojson.json; sourceTree = ""; }; DA737EF11D061AA2005BDA16 /* v4_driving_dc_polyline.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = v4_driving_dc_polyline.json; sourceTree = ""; }; DA9E1B121E5A675F0081EDC7 /* Polyline.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Polyline.framework; path = Carthage/Build/watchOS/Polyline.framework; sourceTree = ""; }; @@ -646,7 +642,6 @@ F4D785EE1DDD82C100FF4665 /* RouteStepTests.swift */, DAE9E0F31EB7DE2E001E8E8B /* RouteOptionsTests.swift */, DA1A110A1D01045E009F82FA /* DirectionsTests.swift */, - DA737EE71D0611CB005BDA16 /* V4Tests.swift */, DA6C9DAB1CAEC72800094FBC /* V5Tests.swift */, DA6C9DB11CAECA0E00094FBC /* Fixture.swift */, DA4F84EC21C08BFB008A0434 /* WaypointTests.swift */, @@ -1244,7 +1239,6 @@ DA688B3F21B89ECD00C9BB25 /* VisualInstructionComponentTests.swift in Sources */, C596663A2048AECD00C45CE5 /* RoutableMatchTests.swift in Sources */, DA1A10CD1D00F972009F82FA /* V5Tests.swift in Sources */, - DA737EE91D0611CB005BDA16 /* V4Tests.swift in Sources */, DAE33A1C1F215DF600C06039 /* IntersectionTests.swift in Sources */, C5DAACB0201AA92B001F9261 /* MatchTests.swift in Sources */, DA1A10CE1D00F972009F82FA /* Fixture.swift in Sources */, @@ -1312,7 +1306,6 @@ DA688B4021B89ECD00C9BB25 /* VisualInstructionComponentTests.swift in Sources */, C596663B2048AECE00C45CE5 /* RoutableMatchTests.swift in Sources */, DA1A10F41D010251009F82FA /* V5Tests.swift in Sources */, - DA737EEA1D0611CB005BDA16 /* V4Tests.swift in Sources */, DAE33A1D1F215DF600C06039 /* IntersectionTests.swift in Sources */, C5DAACB1201AA92B001F9261 /* MatchTests.swift in Sources */, DA1A10F51D010251009F82FA /* Fixture.swift in Sources */, @@ -1426,7 +1419,6 @@ DA688B3E21B89ECD00C9BB25 /* VisualInstructionComponentTests.swift in Sources */, C59666392048A20E00C45CE5 /* RoutableMatchTests.swift in Sources */, DA6C9DAC1CAEC72800094FBC /* V5Tests.swift in Sources */, - DA737EE81D0611CB005BDA16 /* V4Tests.swift in Sources */, DAE33A1B1F215DF600C06039 /* IntersectionTests.swift in Sources */, C5DAACAF201AA92B001F9261 /* MatchTests.swift in Sources */, DA6C9DB21CAECA0E00094FBC /* Fixture.swift in Sources */, diff --git a/MapboxDirections.xcodeproj/xcshareddata/xcschemes/Example.xcscheme b/MapboxDirections.xcodeproj/xcshareddata/xcschemes/Example.xcscheme index cbf1867a5..61dbcd49f 100644 --- a/MapboxDirections.xcodeproj/xcshareddata/xcschemes/Example.xcscheme +++ b/MapboxDirections.xcodeproj/xcshareddata/xcschemes/Example.xcscheme @@ -46,6 +46,11 @@ BlueprintName = "MapboxDirectionsTests" ReferencedContainer = "container:MapboxDirections.xcodeproj"> + + + + diff --git a/Sources/MapboxDirections/DirectionsError.swift b/Sources/MapboxDirections/DirectionsError.swift index 7964dff29..3ff6b0764 100644 --- a/Sources/MapboxDirections/DirectionsError.swift +++ b/Sources/MapboxDirections/DirectionsError.swift @@ -2,7 +2,7 @@ import Foundation import CoreLocation -public enum DirectionsError: Error, RawRepresentable { +public enum DirectionsError: Error, RawRepresentable, Equatable { public init?(rawValue: String) { assertionFailure("Do not use init(rawValue:) for DirectionsError.") return nil @@ -47,7 +47,7 @@ public enum DirectionsError: Error, RawRepresentable { } let formattedInterval = intervalFormatter.string(from: interval) ?? "\(interval) seconds" let formattedCount = NumberFormatter.localizedString(from: NSNumber(value: limit), number: .decimal) - return "More than \(formattedCount) requests have been made with this access token within a period of \(formattedInterval)" + return "More than \(formattedCount) requests have been made with this access token within a period of \(formattedInterval)." case let .unknown(response, underlying: error, code, message): return "Unknown Error. Response: \(response.debugDescription) Underlying Error: \(error.debugDescription) Code: \(code.debugDescription) Message:\(message.debugDescription)" } diff --git a/Sources/MapboxDirections/MBDirections.swift b/Sources/MapboxDirections/MBDirections.swift index 998431a0b..358eeb4e5 100644 --- a/Sources/MapboxDirections/MBDirections.swift +++ b/Sources/MapboxDirections/MBDirections.swift @@ -163,7 +163,7 @@ open class Directions: NSObject { let request = urlRequest(forCalculating: options) let requestTask = URLSession.shared.dataTask(with: request) { (possibleData, possibleResponse, possibleError) in let responseEndDate = Date() - guard let response = possibleResponse, response.mimeType == "application/json" else { + guard let response = possibleResponse, ["application/json", "text/html"].contains(response.mimeType) else { completionHandler(nil, nil, .invalidResponse) return } @@ -181,8 +181,7 @@ open class Directions: NSObject { DispatchQueue.global(qos: .userInitiated).async { do { - let decoder = JSONDecoder() - decoder.userInfo[.options] = options + let decoder = DirectionsDecoder(options: options) let result = try decoder.decode(RouteResponse.self, from: data) guard (result.code == nil && result.message == nil) || result.code == "Ok" else { let apiError = Directions.informativeError(code: result.code, message: result.message, response: response, underlyingError: possibleError) @@ -202,7 +201,8 @@ open class Directions: NSObject { } } catch { DispatchQueue.main.async { - completionHandler(nil, nil, .unknown(response: response, underlying: error, code: nil, message: nil)) + let bailError = Directions.informativeError(code: nil, message: nil, response: response, underlyingError: error) + completionHandler(nil, nil, bailError) } } @@ -253,8 +253,7 @@ open class Directions: NSObject { DispatchQueue.global(qos: .userInitiated).async { do { - let decoder = JSONDecoder() - decoder.userInfo[.options] = options + let decoder = DirectionsDecoder(options: options) let result = try decoder.decode(MatchResponse.self, from: data) guard result.code == "Ok" else { let apiError = Directions.informativeError(code: result.code, message: result.message, response: response, underlyingError: possibleError) @@ -323,8 +322,7 @@ open class Directions: NSObject { DispatchQueue.global(qos: .userInitiated).async { do { - let decoder = JSONDecoder() - decoder.userInfo[.options] = options + let decoder = DirectionsDecoder(options: options) let result = try decoder.decode(MapMatchingResponse.self, from: data) guard result.code == "Ok" else { let apiError = Directions.informativeError(code: result.code, message:nil, response: response, underlyingError: possibleError) @@ -472,3 +470,31 @@ open class Directions: NSObject { public extension CodingUserInfoKey { static let options = CodingUserInfoKey(rawValue: "com.mapbox.directions.coding.routeOptions")! } + +public class DirectionsDecoder: JSONDecoder { + + /** + Initializes a `DirectionsDecoder` with a given `RouteOption`. + */ + public init(options: DirectionsOptions) { + super.init() + routeOptions = options + } + + + var routeOptions: DirectionsOptions? { + get { + return userInfo[.options] as? DirectionsOptions + } set { + userInfo[.options] = newValue + } + } + + var tracepoints: [Tracepoint?]? { + get { + return userInfo[.tracepoints] as? [Tracepoint?] + } set { + userInfo[.tracepoints] = newValue + } + } +} diff --git a/Sources/MapboxDirections/MBDirectionsOptions.swift b/Sources/MapboxDirections/MBDirectionsOptions.swift index b859ba221..7b2b3db9e 100644 --- a/Sources/MapboxDirections/MBDirectionsOptions.swift +++ b/Sources/MapboxDirections/MBDirectionsOptions.swift @@ -90,7 +90,9 @@ public enum MeasurementSystem: String, Codable { */ -open class DirectionsOptions: Codable { // NSSecureCoding, NSCopying { +open class DirectionsOptions: Codable, Equatable { + + /** Initializes an options object for routes between the given waypoints and an optional profile identifier. @@ -118,17 +120,18 @@ open class DirectionsOptions: Codable { // NSSecureCoding, NSCopying { case includesVisualInstructions } + public func encode(to encoder: Encoder) throws { var container = encoder.container(keyedBy: CodingKeys.self) try container.encode(waypoints, forKey: .waypoints) try container.encode(profileIdentifier.rawValue, forKey: .profileIdentifier) try container.encode(includesSteps, forKey: .includesSteps) - try container.encode(shapeFormat.rawValue, forKey: .shapeFormat) - try container.encode(routeShapeResolution.rawValue, forKey: .routeShapeResolution) - try container.encode(attributeOptions.rawValue, forKey: .attributeOptions) + try container.encode(shapeFormat, forKey: .shapeFormat) + try container.encode(routeShapeResolution, forKey: .routeShapeResolution) + try container.encode(attributeOptions, forKey: .attributeOptions) try container.encode(locale, forKey: .locale) try container.encode(includesSpokenInstructions, forKey: .includesSpokenInstructions) - try container.encode(distanceMeasurementSystem.rawValue, forKey: .distanceMeasurementSystem) + try container.encode(distanceMeasurementSystem, forKey: .distanceMeasurementSystem) try container.encode(includesVisualInstructions, forKey: .includesVisualInstructions) try container.encode(includesSpokenInstructions, forKey: .includesSpokenInstructions) if includesSpokenInstructions { @@ -225,7 +228,7 @@ open class DirectionsOptions: Codable { // NSSecureCoding, NSCopying { By default, this property is set to the current system locale. */ - open var locale = Locale.autoupdatingCurrent { + open var locale = Locale.current { didSet { self.distanceMeasurementSystem = locale.usesMetricSystem ? .metric : .imperial } @@ -245,7 +248,7 @@ open class DirectionsOptions: Codable { // NSSecureCoding, NSCopying { You should choose a measurement system appropriate for the current region. You can also allow the user to indicate their preferred measurement system via a setting. */ - open var distanceMeasurementSystem: MeasurementSystem = Locale.autoupdatingCurrent.usesMetricSystem ? .metric : .imperial + open var distanceMeasurementSystem: MeasurementSystem = Locale.current.usesMetricSystem ? .metric : .imperial /** If true, each `RouteStep` will contain the property `visualInstructionsAlongStep`. @@ -337,12 +340,17 @@ open class DirectionsOptions: Codable { // NSSecureCoding, NSCopying { } private var radiuses: String? { - if waypoints.filter({ $0.coordinateAccuracy >= 0 }).isEmpty { + guard !self.waypoints.filter({ $0.coordinateAccuracy != nil}).isEmpty else { return nil } - return waypoints.map { - $0.coordinateAccuracy >= 0 ? String($0.coordinateAccuracy) : "unlimited" - }.joined(separator: ";") + + let accuracies = self.waypoints.map { (waypoint) -> String in + guard let accuracy = waypoint.coordinateAccuracy else { + return "unlimited" + } + return String(accuracy) + } + return accuracies.joined(separator: ";") } private var approaches: String? { @@ -391,4 +399,18 @@ open class DirectionsOptions: Codable { // NSSecureCoding, NSCopying { ] return components.percentEncodedQuery ?? "" } + + //MARK: - Equatable + public static func == (lhs: DirectionsOptions, rhs: DirectionsOptions) -> Bool { + return lhs.waypoints == rhs.waypoints && + lhs.profileIdentifier == rhs.profileIdentifier && + lhs.includesSteps == rhs.includesSteps && + lhs.shapeFormat == rhs.shapeFormat && + lhs.routeShapeResolution == rhs.routeShapeResolution && + lhs.attributeOptions == rhs.attributeOptions && + lhs.locale.identifier == rhs.locale.identifier && + lhs.includesSpokenInstructions == rhs.includesSpokenInstructions && + lhs.distanceMeasurementSystem == rhs.distanceMeasurementSystem && + lhs.includesVisualInstructions == rhs.includesVisualInstructions + } } diff --git a/Sources/MapboxDirections/MBDirectionsResult.swift b/Sources/MapboxDirections/MBDirectionsResult.swift index 3bb2139c7..013bab135 100644 --- a/Sources/MapboxDirections/MBDirectionsResult.swift +++ b/Sources/MapboxDirections/MBDirectionsResult.swift @@ -40,10 +40,10 @@ open class DirectionsResult: Codable { distance = try container.decode(CLLocationDistance.self, forKey: .distance) expectedTravelTime = try container.decode(TimeInterval.self, forKey: .expectedTravelTime) - directionsOptions = try container.decodeIfPresent(DirectionsOptions.self, forKey: .directionsOptions) ?? decoder.userInfo[.options] as! DirectionsOptions + _directionsOptions = try container.decodeIfPresent(DirectionsOptions.self, forKey: .directionsOptions) ?? decoder.userInfo[.options] as! DirectionsOptions - switch directionsOptions.shapeFormat { + switch _directionsOptions.shapeFormat { case .geoJSON: shape = try container.decodeIfPresent(LineString.self, forKey: .shape) @@ -162,8 +162,12 @@ open class DirectionsResult: Codable { The route options object’s profileIdentifier property reflects the primary mode of transportation used for the route. Individual steps along the route might use different modes of transportation as necessary. */ - public let directionsOptions: DirectionsOptions + public var directionsOptions: DirectionsOptions { + return _directionsOptions + } + + private let _directionsOptions: DirectionsOptions /** The [access token](https://docs.mapbox.com/help/glossary/access-token/) used to make the directions request. diff --git a/Sources/MapboxDirections/MBRouteOptions.swift b/Sources/MapboxDirections/MBRouteOptions.swift index c2959217d..dc4796e37 100644 --- a/Sources/MapboxDirections/MBRouteOptions.swift +++ b/Sources/MapboxDirections/MBRouteOptions.swift @@ -138,31 +138,53 @@ open class RouteOptions: DirectionsOptions { */ open var roadClassesToAvoid: RoadClasses = [] + + /** + A number that influences whether the route should prefer or avoid alleys or narrow service roads between buildings. + + This property has no effect unless the profile identifier is set to `MBDirectionsProfileIdentifier.walking`. + + The value of this property must be at least `MBDirectionsPriority.low` and at most `MBDirectionsPriority.high`. The default value of `MBDirectionsPriority.default` neither prefers nor avoids alleys, while a negative value between `MBDirectionsPriority.low` and `MBDirectionsPriority.default` avoids alleys, and a positive value between `MBDirectionsPriority.default` and `MBDirectionsPriority.high` prefers alleys. A value of 0.9 is suitable for pedestrians who are comfortable with walking down alleys. + */ + open var alleyPriority: MBDirectionsPriority = .default + + /** + A number that influences whether the route should prefer or avoid roads or paths that are set aside for pedestrian-only use (walkways or footpaths). + + This property has no effect unless the profile identifier is set to `MBDirectionsProfileIdentifier.walking`. You can adjust this property to avoid [sidewalks and crosswalks that are mapped as separate footpaths](https://wiki.openstreetmap.org/wiki/Sidewalks#Sidewalk_as_separate_way), which may be more granular than needed for some forms of pedestrian navigation. + + The value of this property must be at least `MBDirectionsPriority.low` and at most `MBDirectionsPriority.high`. The default value of `MBDirectionsPriority.default` neither prefers nor avoids walkways, while a negative value between `MBDirectionsPriority.low` and `MBDirectionsPriority.default` avoids walkways, and a positive value between `MBDirectionsPriority.default` and `MBDirectionsPriority.high` prefers walkways. A value of −0.1 results in less verbose routes in cities where sidewalks and crosswalks are generally mapped as separate footpaths. + */ + open var walkwayPriority: DirectionsPriority = .default + + /** + The expected uniform travel speed measured in meters per second. + + This property has no effect unless the profile identifier is set to `MBDirectionsProfileIdentifier.walking`. You can adjust this property to account for running or for faster or slower gaits. When the profile identifier is set to another profile identifier, such as `MBDirectionsProfileIdentifier.driving`, this property is ignored in favor of the expected travel speed on each road along the route. This property may be supported by other routing profiles in the future. + + The value of this property must be at least `MBMinimumWalkingSpeed` and at most `MBMaximumWalkingSpeed`. The default value is `MBDefaultWalkingSpeed`. + */ + open var speed: CLLocationSpeed = CLLocationSpeed.Mapbox.default + /** An array of URL parameters to include in the request URL. */ - internal var params: [URLQueryItem] { + override var urlQueryItems: [URLQueryItem] { var params: [URLQueryItem] = [ URLQueryItem(name: "alternatives", value: String(includesAlternativeRoutes)), -// URLQueryItem(name: "geometries", value: String(describing: shapeFormat)), -// URLQueryItem(name: "overview", value: String(describing: routeShapeResolution)), -// URLQueryItem(name: "steps", value: String(includesSteps)), URLQueryItem(name: "continue_straight", value: String(!allowsUTurnAtWaypoint)), -// URLQueryItem(name: "language", value: locale.identifier) ] if includesExitRoundaboutManeuver { params.append(URLQueryItem(name: "roundabout_exits", value: String(includesExitRoundaboutManeuver))) } -// if includesSpokenInstructions { -// params.append(URLQueryItem(name: "voice_instructions", value: String(includesSpokenInstructions))) -// params.append(URLQueryItem(name: "voice_units", value: String(describing: distanceMeasurementSystem))) -// } - - if includesVisualInstructions { - params.append(URLQueryItem(name: "banner_instructions", value: String(includesVisualInstructions))) + if profileIdentifier == .walking { + params.append(URLQueryItem(name: "alley_bias", value: String(alleyPriority.rawValue))) + params.append(URLQueryItem(name: "walkway_bias", value: String(walkwayPriority.rawValue))) + params.append(URLQueryItem(name: "walking_speed", value: String(speed))) } + if !roadClassesToAvoid.isEmpty { let allRoadClasses = roadClassesToAvoid.description.components(separatedBy: ",") @@ -173,26 +195,11 @@ open class RouteOptions: DirectionsOptions { params.append(URLQueryItem(name: "exclude", value: firstRoadClass)) } } - -// // Include headings and heading accuracies if any waypoint has a nonnegative heading. -// if !waypoints.filter({ $0.heading >= 0 }).isEmpty { -// let headings = waypoints.map { $0.headingDescription }.joined(separator: ";") -// params.append(URLQueryItem(name: "bearings", value: headings)) -// } - -// // Include location accuracies if any waypoint has a nonnegative coordinate accuracy. -// if !waypoints.filter({ $0.coordinateAccuracy >= 0 }).isEmpty { -// let accuracies = waypoints.map { -// $0.coordinateAccuracy >= 0 ? String($0.coordinateAccuracy) : "unlimited" -// }.joined(separator: ";") -// params.append(URLQueryItem(name: "radiuses", value: accuracies)) -// } -// -// if !attributeOptions.isEmpty { -// let attributesStrings = String(describing:attributeOptions) -// -// params.append(URLQueryItem(name: "annotations", value: attributesStrings)) -// } + + if waypoints.first(where: { $0.targetCoordinate != nil }) != nil { + let targetCoordinates = waypoints.map { $0.targetCoordinate?.requestDescription ?? "" }.joined(separator: ";") + params.append(URLQueryItem(name: "waypoint_targets", value: targetCoordinates)) + } return params + super.urlQueryItems } @@ -247,3 +254,20 @@ public enum InstructionFormat: String { case html } + +extension CLLocationSpeed { + enum Mapbox{ + /** + By default, pedestrians are assumed to walk at an average rate of 1.42 meters per second (5.11 kilometers per hour or 3.18 miles per hour), corresponding to a typical preferred walking speed. + */ + static let minimum: CLLocationSpeed = 0.14 + /** + Pedestrians are assumed to walk no slower than 0.14 meters per second (0.50 kilometers per hour or 0.31 miles per hour) on average. + */ + static let `default`: CLLocationSpeed = 1.42 + /** + Pedestrians are assumed to walk no faster than 6.94 meters per second (25.0 kilometers per hour or 15.5 miles per hour) on average. + */ + static let maximum: CLLocationSpeed = 6.94 + } +} diff --git a/Sources/MapboxDirections/MBWaypoint.swift b/Sources/MapboxDirections/MBWaypoint.swift index e89285ca9..d2d15211e 100644 --- a/Sources/MapboxDirections/MBWaypoint.swift +++ b/Sources/MapboxDirections/MBWaypoint.swift @@ -8,13 +8,15 @@ public class Waypoint: Codable { private enum CodingKeys: String, CodingKey { case coordinate = "location" case coordinateAccuracy + case targetCoordinate case name } required public init(from decoder: Decoder) throws { let container = try decoder.container(keyedBy: CodingKeys.self) coordinate = try container.decode(CLLocationCoordinate2D.self, forKey: .coordinate) - coordinateAccuracy = try container.decodeIfPresent(CLLocationAccuracy.self, forKey: .coordinateAccuracy) ?? -1 + coordinateAccuracy = try container.decodeIfPresent(CLLocationAccuracy.self, forKey: .coordinateAccuracy) + targetCoordinate = try container.decodeIfPresent(CLLocationCoordinate2D.self, forKey: .targetCoordinate) if let name = try container.decodeIfPresent(String.self, forKey: .name), !name.isEmpty { @@ -33,7 +35,7 @@ public class Waypoint: Codable { It is recommended that the value of this parameter be greater than the `horizontalAccuracy` property of a `CLLocation` object obtained from a `CLLocationManager` object. There is a high likelihood that the user may be located some distance away from a navigable road, for instance if the user is currently on a driveway or inside a building. - parameter name: The name of the waypoint. This parameter does not affect the route but may help you to distinguish one waypoint from another. */ - public init(coordinate: CLLocationCoordinate2D, coordinateAccuracy: CLLocationAccuracy = -1, name: String? = nil) { + public init(coordinate: CLLocationCoordinate2D, coordinateAccuracy: CLLocationAccuracy? = nil, name: String? = nil) { self.coordinate = coordinate self.coordinateAccuracy = coordinateAccuracy self.name = name @@ -77,13 +79,6 @@ public class Waypoint: Codable { } #endif - public func copy(with zone: NSZone?) -> Any { - var copy = Waypoint(coordinate: coordinate, coordinateAccuracy: coordinateAccuracy, name: name) - copy.heading = heading - copy.headingAccuracy = headingAccuracy - return copy - } - // MARK: Getting the Waypoint’s Location /** @@ -98,8 +93,18 @@ public class Waypoint: Codable { By default, the value of this property is a negative number. */ - public var coordinateAccuracy: CLLocationAccuracy = -1 + public var coordinateAccuracy: CLLocationAccuracy? + /** + The geographic coordinate of the waypoint’s target. + + The waypoint’s target affects arrival instructions without affecting the route’s shape. For example, a delivery or ride hailing application may specify a waypoint target that represents a drop-off location. The target determines whether the arrival visual and spoken instructions indicate that the destination is “on the left” or “on the right”. + + By default, this property is set to `nil`, meaning the waypoint has no target. This property is ignored on the first waypoint of a `RouteOptions` object, on any waypoint of a `MatchOptions` object, or on any waypoint of a `RouteOptions` object if `DirectionsOptions.includesSteps` is set to `false`. + + This property corresponds to the [`waypoint_targets`](https://docs.mapbox.com/api/navigation/#retrieve-directions) query parameter in the Mapbox Directions and Map Matching APIs. + */ + public var targetCoordinate: CLLocationCoordinate2D? // MARK: Getting the Direction of Approach /** @@ -151,7 +156,7 @@ public class Waypoint: Codable { /** A Boolean value indicating whether the waypoint is significant enough to appear in the resulting routes as a waypoint separating two legs, along with corresponding guidance instructions. - By default, this property is set to `true`, which means that each resulting route will include a leg that ends by arriving at the waypoint as `RouteLeg.destination` and a subsequent leg that begins by departing from the waypoint as `RouteLeg.source`. Otherwise, if this property is set to `false`, a single leg passes through the waypoint without specifically mentioning it. Regardless of the value of this property, each resulting route passes through the location specified by the `coordinate` property, accounting for approach-related properties such as `heading`. + By default, this property is set to `true`, which means that each resulting route will include a leg that ends by arriving at the waypoint as `RouteLeg.destination` and a subsequent leg that begins by departing from the waypoint as `RouteLeg.source`. Otherwise, if this property is set to `false`, a single leg passes through the waypoint without specifically mentioning it. Regardless of the value of this property, each resulting route passes through the location specified by the `coordinate` property, accounting for approach-related properties such as ` heading`. With the Mapbox Directions API, set this property to `false` if you want the waypoint’s location to influence the path that the route follows without attaching any meaning to the waypoint object itself. With the Mapbox Map Matching API, use this property when the `DirectionsOptions.includesSteps` property is `true` or when `coordinates` represents a trace with a high sample rate. This property has no effect if `DirectionsOptions.includesSteps` is set to `false`, or if `MatchOptions.waypointIndices` is non-nil. diff --git a/Sources/MapboxDirections/Match/MBMatch.swift b/Sources/MapboxDirections/Match/MBMatch.swift index b0b2d0644..dd97221f4 100644 --- a/Sources/MapboxDirections/Match/MBMatch.swift +++ b/Sources/MapboxDirections/Match/MBMatch.swift @@ -22,11 +22,13 @@ open class Match: DirectionsResult { private enum CodingKeys: String, CodingKey { case confidence case tracepoints + case matchOptions } public required init(from decoder: Decoder) throws { let container = try decoder.container(keyedBy: CodingKeys.self) confidence = try container.decode(Float.self, forKey: .confidence) - tracepoints = try container.decodeIfPresent([Tracepoint?].self, forKey: .tracepoints) ?? decoder.userInfo[.tracepoints] as? [Tracepoint?] ?? [] + tracepoints = try container.decodeIfPresent([Tracepoint?].self, forKey: .tracepoints) ?? [] + matchOptions = try container.decodeIfPresent(MatchOptions.self, forKey: .matchOptions) ?? decoder.userInfo[.options] as! MatchOptions try super.init(from: decoder) } @@ -34,6 +36,7 @@ open class Match: DirectionsResult { var container = encoder.container(keyedBy: CodingKeys.self) try container.encode(confidence, forKey: .confidence) try container.encode(tracepoints, forKey: .tracepoints) + try container.encode(matchOptions, forKey: .matchOptions) try super.encode(to: encoder) } @@ -75,17 +78,18 @@ open class Match: DirectionsResult { /** Tracepoints on the road network that match the tracepoints in the match options. - Any outlier tracepoint is omitted from the match. This array represents an outlier tracepoint is a `Tracepoint` object whose `Tracepoint.coordinate` property is `kCLLocationCoordinate2DInvalid`. + Any outlier tracepoint is omitted from the match. This array represents an outlier tracepoint if the element is `nil`. */ open var tracepoints: [Tracepoint?] + public override var directionsOptions: DirectionsOptions { + return matchOptions + } /** `MatchOptions` used to create the match request. */ - public var matchOptions: MatchOptions { - return super.directionsOptions as! MatchOptions - } + public let matchOptions: MatchOptions // public required init?(coder decoder: NSCoder) { // confidence = decoder.decodeFloat(forKey: "confidence") diff --git a/Sources/MapboxDirections/Match/MBMatchOptions.swift b/Sources/MapboxDirections/Match/MBMatchOptions.swift index 438b358e5..f89757369 100644 --- a/Sources/MapboxDirections/Match/MBMatchOptions.swift +++ b/Sources/MapboxDirections/Match/MBMatchOptions.swift @@ -99,3 +99,13 @@ private protocol MatchOptionsDeprecations { var waypointIndices: IndexSet? { get set } } extension MatchOptions: MatchOptionsDeprecations {} + +//MARK: - Equatable +public extension MatchOptions { + static func == (lhs: MatchOptions, rhs: MatchOptions) -> Bool { + let isSuperEqual = ((lhs as DirectionsOptions) == (rhs as DirectionsOptions)) + return isSuperEqual && + lhs.abridgedPath == rhs.abridgedPath && + lhs.resamplesTraces == rhs.resamplesTraces + } +} diff --git a/Sources/MapboxDirections/Match/MBTracepoint.swift b/Sources/MapboxDirections/Match/MBTracepoint.swift index dc96fc835..3d41ec895 100644 --- a/Sources/MapboxDirections/Match/MBTracepoint.swift +++ b/Sources/MapboxDirections/Match/MBTracepoint.swift @@ -11,7 +11,7 @@ public class Tracepoint: Waypoint { /** Number of probable alternative matchings for this tracepoint. A value of zero indicates that this point was matched unambiguously. */ - open var alternateCount: Int = NSNotFound + public let alternateCount: Int private enum CodingKeys: String, CodingKey { case alternateCount = "alternatives_count" @@ -24,9 +24,15 @@ public class Tracepoint: Waypoint { required public init(from decoder: Decoder) throws { - try super.init(from: decoder) let container = try decoder.container(keyedBy: CodingKeys.self) alternateCount = try container.decode(Int.self, forKey: .alternateCount) + try super.init(from: decoder) + } + + public override func encode(to encoder: Encoder) throws { + var container = encoder.container(keyedBy: CodingKeys.self) + try container.encode(alternateCount, forKey: .alternateCount) + try super.encode(to: encoder) } diff --git a/Sources/MapboxDirections/Match/MatchResponse.swift b/Sources/MapboxDirections/Match/MatchResponse.swift index 5a0db9c04..1f0b40313 100644 --- a/Sources/MapboxDirections/Match/MatchResponse.swift +++ b/Sources/MapboxDirections/Match/MatchResponse.swift @@ -19,7 +19,14 @@ class MatchResponse: Codable { code = try container.decode(String.self, forKey: .code) message = try container.decodeIfPresent(String.self, forKey: .message) tracepoints = try container.decodeIfPresent([Tracepoint?].self, forKey: .tracepoints) - (decoder as? JSONDecoder)?.userInfo[.tracepoints] = tracepoints matches = try container.decodeIfPresent([Match].self, forKey: .matches) + + if let points = self.tracepoints { + matches?.forEach { + $0.tracepoints = points + } + } + } } + diff --git a/Tests/MapboxDirectionsTests/AnnotationTests.swift b/Tests/MapboxDirectionsTests/AnnotationTests.swift index 6e9d9ba89..81a039227 100644 --- a/Tests/MapboxDirectionsTests/AnnotationTests.swift +++ b/Tests/MapboxDirectionsTests/AnnotationTests.swift @@ -55,8 +55,8 @@ class AnnotationTests: XCTestCase { } XCTAssertNotNil(route) - XCTAssertNotNil(route!.coordinates) - XCTAssertEqual(route!.coordinates!.count, 99) + XCTAssertNotNil(route!.shape) + XCTAssertEqual(route!.shape?.coordinates.count, 99) XCTAssertEqual(route!.routeIdentifier, "cj725hpi30yp2ztm2ehbcipmh") let leg = route!.legs.first! diff --git a/Tests/MapboxDirectionsTests/DirectionsTests.swift b/Tests/MapboxDirectionsTests/DirectionsTests.swift index 0a5cffc2f..aa10e3ba2 100644 --- a/Tests/MapboxDirectionsTests/DirectionsTests.swift +++ b/Tests/MapboxDirectionsTests/DirectionsTests.swift @@ -53,9 +53,10 @@ class DirectionsTests: XCTestCase { let url = directions.url(forCalculating: options, httpMethod: "GET") XCTAssertLessThanOrEqual(url.absoluteString.count, MaximumURLLength, "maximumCoordinateCount is too high") + let components = URLComponents(string: url.absoluteString) XCTAssertEqual(components?.queryItems?.count, 7) - XCTAssertTrue(components?.path.contains(coordinates.compactMap { $0.stringForRequestURL }.joined(separator: ";")) ?? false) + XCTAssertTrue(components?.path.contains(coordinates.compactMap { $0.requestDescription }.joined(separator: ";")) ?? false) let request = directions.urlRequest(forCalculating: options) XCTAssertEqual(request.httpMethod, "GET") @@ -76,16 +77,14 @@ class DirectionsTests: XCTestCase { components.query = String(data: request.httpBody ?? Data(), encoding: .utf8) XCTAssertEqual(components.queryItems?.count, 7) XCTAssertEqual(components.queryItems?.first { $0.name == "coordinates" }?.value, - coordinates.compactMap { $0.stringForRequestURL }.joined(separator: ";")) + coordinates.compactMap { $0.requestDescription }.joined(separator: ";")) } func testKnownBadResponse() { - let pass = "The operation couldn’t be completed. The request is too large." - OHHTTPStubs.stubRequests(passingTest: { (request) -> Bool in return request.url!.absoluteString.contains("https://api.mapbox.com/directions") }) { (_) -> OHHTTPStubsResponse in - return OHHTTPStubsResponse(data: BadResponse.data(using: .utf8)!, statusCode: 413, headers: ["Content-Type" : "text/html"]) + return OHHTTPStubsResponse(data: BadResponse.data(using: .utf8)!, statusCode: 413, headers: ["Content-Type" : "application/json"]) } let expectation = XCTestExpectation(description: "Async callback") let one = CLLocation(coordinate: CLLocationCoordinate2D(latitude: 0.0, longitude: 0.0)) @@ -97,19 +96,16 @@ class DirectionsTests: XCTestCase { expectation.fulfill() XCTAssertNil(routes, "Unexpected route response") XCTAssertNotNil(error, "No error returned") - XCTAssertNil(error?.userInfo[NSUnderlyingErrorKey]) - XCTAssertEqual(error?.localizedDescription, pass, "Wrong type of error received") + XCTAssertEqual(error, .requestTooLarge) }) wait(for: [expectation], timeout: 2.0) } func testUnknownBadResponse() { - let pass = "The operation couldn’t be completed. server error" - + let message = "Enhance your calm, John Spartan." OHHTTPStubs.stubRequests(passingTest: { (request) -> Bool in return request.url!.absoluteString.contains("https://api.mapbox.com/directions") }) { (_) -> OHHTTPStubsResponse in - let message = "Enhance your calm, John Spartan." return OHHTTPStubsResponse(data: message.data(using: .utf8)!, statusCode: 420, headers: ["Content-Type" : "text/plain"]) } let expectation = XCTestExpectation(description: "Async callback") @@ -122,25 +118,26 @@ class DirectionsTests: XCTestCase { expectation.fulfill() XCTAssertNil(routes, "Unexpected route response") XCTAssertNotNil(error, "No error returned") - XCTAssertNil(error?.userInfo[NSUnderlyingErrorKey]) - XCTAssertEqual(error?.localizedDescription, pass, "Wrong type of error received") + switch error { + case .invalidResponse: + break // pass + default: + XCTFail("Wrong type of error.") + } }) wait(for: [expectation], timeout: 2.0) } func testRateLimitErrorParsing() { - let json = ["message" : "Hit rate limit"] - let url = URL(string: "https://api.mapbox.com")! let headerFields = ["X-Rate-Limit-Interval" : "60", "X-Rate-Limit-Limit" : "600", "X-Rate-Limit-Reset" : "1479460584"] let response = HTTPURLResponse(url: url, statusCode: 429, httpVersion: nil, headerFields: headerFields) - let error: NSError? = nil - let resultError = Directions.informativeError(describing: json, response: response, underlyingError: error) + let resultError = Directions.informativeError(code: "429", message: "Hit rate limit", response: response, underlyingError: nil) - XCTAssertEqual(resultError.localizedFailureReason, "More than 600 requests have been made with this access token within a period of 1 minute.") - XCTAssertEqual(resultError.localizedRecoverySuggestion, "Wait until November 18, 2016 at 9:16:24 AM GMT before retrying.") + XCTAssertEqual(resultError.failureReason, "More than 600 requests have been made with this access token within a period of 1 minute.") + XCTAssertEqual(resultError.recoverySuggestion, "Wait until November 18, 2016 at 9:16:24 AM GMT before retrying.") } } #endif diff --git a/Tests/MapboxDirectionsTests/Fixtures/Match/match.json b/Tests/MapboxDirectionsTests/Fixtures/Match/match.json index bd4c2c61a..2a2a1a0be 100644 --- a/Tests/MapboxDirectionsTests/Fixtures/Match/match.json +++ b/Tests/MapboxDirectionsTests/Fixtures/Match/match.json @@ -1 +1 @@ -{"matchings":[{"confidence":0.95,"geometry":"gatfEfidjUk@Lc@@Y?E??L?^Hf@","legs":[{"summary":"North Harbor Drive","weight":2.5,"duration":2.5,"steps":[{"intersections":[{"out":0,"entry":[true],"bearings":[340],"location":[-117.172836,32.712041]}],"driving_side":"right","geometry":"gatfEfidjUUFIBK@","mode":"driving","maneuver":{"bearing_after":340,"bearing_before":0,"location":[-117.172836,32.712041],"type":"depart","instruction":"Head north on North Harbor Drive"},"weight":2.5,"duration":2.5,"name":"North Harbor Drive","distance":25},{"intersections":[{"in":0,"entry":[true],"bearings":[170],"location":[-117.17291,32.712256]}],"driving_side":"right","geometry":"sbtfEtidjU","mode":"driving","maneuver":{"bearing_after":0,"bearing_before":350,"location":[-117.17291,32.712256],"type":"arrive","instruction":"You have arrived at your 1st destination"},"weight":0,"duration":0,"name":"North Harbor Drive","distance":0}],"distance":25},{"summary":"North Harbor Drive","weight":2.1,"duration":2.1,"steps":[{"intersections":[{"out":0,"entry":[true],"bearings":[352],"location":[-117.17291,32.712256]}],"driving_side":"right","geometry":"sbtfEtidjUA?M@G?I?A?","mode":"driving","maneuver":{"bearing_after":352,"bearing_before":0,"location":[-117.17291,32.712256],"type":"depart","instruction":"Head north on North Harbor Drive"},"weight":2.1,"duration":2.1,"name":"North Harbor Drive","distance":21},{"intersections":[{"in":0,"entry":[true],"bearings":[180],"location":[-117.17292,32.712444]}],"driving_side":"right","geometry":"wctfEvidjU","mode":"driving","maneuver":{"bearing_after":0,"bearing_before":0,"location":[-117.17292,32.712444],"type":"arrive","instruction":"You have arrived at your 2nd destination"},"weight":0,"duration":0,"name":"North Harbor Drive","distance":0}],"distance":21},{"summary":"North Harbor Drive","weight":1.4,"duration":1.4,"steps":[{"intersections":[{"out":0,"entry":[true],"bearings":[359],"location":[-117.17292,32.712444]},{"out":0,"in":1,"entry":[true,false,false],"bearings":[0,180,270],"location":[-117.172921,32.712514]}],"driving_side":"right","geometry":"wctfEvidjUM?K?","mode":"driving","maneuver":{"bearing_after":359,"bearing_before":0,"location":[-117.17292,32.712444],"type":"depart","instruction":"Head north on North Harbor Drive"},"weight":1.4,"duration":1.4,"name":"North Harbor Drive","distance":14},{"intersections":[{"in":0,"entry":[true],"bearings":[179],"location":[-117.172922,32.71257]}],"driving_side":"right","geometry":"qdtfEvidjU","mode":"driving","maneuver":{"bearing_after":0,"bearing_before":359,"location":[-117.172922,32.71257],"type":"arrive","instruction":"You have arrived at your 3rd destination"},"weight":0,"duration":0,"name":"North Harbor Drive","distance":0}],"distance":14},{"summary":"North Harbor Drive, West G Street","weight":38.4,"duration":6.5,"steps":[{"intersections":[{"out":0,"entry":[true],"bearings":[0],"location":[-117.172922,32.71257]}],"driving_side":"right","geometry":"qdtfEvidjUE?","mode":"driving","maneuver":{"bearing_after":0,"bearing_before":0,"location":[-117.172922,32.71257],"type":"depart","instruction":"Head north on North Harbor Drive"},"weight":36.3,"duration":5.5,"name":"North Harbor Drive","distance":3.2},{"intersections":[{"out":2,"in":1,"entry":[true,false,true],"bearings":[0,180,270],"location":[-117.172922,32.712599]}],"driving_side":"right","geometry":"wdtfEvidjU?L","mode":"driving","maneuver":{"bearing_after":271,"bearing_before":358,"location":[-117.172922,32.712599],"modifier":"left","type":"turn","instruction":"Turn left onto West G Street"},"weight":2.1,"duration":1,"name":"West G Street","distance":5.9},{"intersections":[{"in":0,"entry":[true],"bearings":[91],"location":[-117.172985,32.7126]}],"driving_side":"right","geometry":"wdtfEdjdjU","mode":"driving","maneuver":{"bearing_after":0,"bearing_before":271,"location":[-117.172985,32.7126],"type":"arrive","instruction":"You have arrived at your 4th destination"},"weight":0,"duration":0,"name":"West G Street","distance":0}],"distance":9.1},{"summary":"West G Street","weight":5.4,"duration":4.9,"steps":[{"intersections":[{"out":0,"entry":[true],"bearings":[273],"location":[-117.172985,32.7126]},{"out":3,"in":1,"entry":[false,false,true,true],"bearings":[0,90,180,270],"location":[-117.173011,32.712601]}],"driving_side":"right","geometry":"wdtfEdjdjU?B?X","mode":"driving","maneuver":{"bearing_after":273,"bearing_before":0,"location":[-117.172985,32.7126],"type":"depart","instruction":"Head west on West G Street"},"weight":5.4,"duration":4.9,"name":"West G Street","distance":14.8},{"intersections":[{"in":0,"entry":[true],"bearings":[88],"location":[-117.173143,32.712597]}],"driving_side":"right","geometry":"wdtfEbkdjU","mode":"driving","maneuver":{"bearing_after":0,"bearing_before":268,"location":[-117.173143,32.712597],"type":"arrive","instruction":"You have arrived at your 5th destination"},"weight":0,"duration":0,"name":"West G Street","distance":0}],"distance":14.8},{"summary":"West G Street","weight":7.2,"duration":7.2,"steps":[{"intersections":[{"out":0,"entry":[true],"bearings":[262],"location":[-117.173143,32.712597]}],"driving_side":"right","geometry":"wdtfEdkdjU@LBLBJ","mode":"driving","maneuver":{"bearing_after":262,"bearing_before":0,"location":[-117.173143,32.712597],"type":"depart","instruction":"Head west on West G Street"},"weight":7.2,"duration":7.2,"name":"West G Street","distance":20},{"intersections":[{"in":0,"entry":[true],"bearings":[61],"location":[-117.173345,32.712546]}],"driving_side":"right","geometry":"mdtfElldjU","mode":"driving","maneuver":{"bearing_after":0,"bearing_before":241,"location":[-117.173345,32.712546],"type":"arrive","instruction":"You have arrived at your destination"},"weight":0,"duration":0,"name":"West G Street","distance":0}],"distance":20}],"weight_name":"routability","weight":57,"duration":24.599999999999998,"distance":103.89999999999999}],"tracepoints":[{"alternatives_count":0,"waypoint_index":0,"matchings_index":0,"name":"North Harbor Drive","location":[-117.172836,32.712041]},{"alternatives_count":0,"waypoint_index":1,"matchings_index":0,"name":"North Harbor Drive","location":[-117.17291,32.712256]},{"alternatives_count":0,"waypoint_index":2,"matchings_index":0,"name":"North Harbor Drive","location":[-117.17292,32.712444]},{"alternatives_count":0,"waypoint_index":3,"matchings_index":0,"name":"North Harbor Drive","location":[-117.172922,32.71257]},{"alternatives_count":0,"waypoint_index":4,"matchings_index":0,"name":"West G Street","location":[-117.172985,32.7126]},{"alternatives_count":0,"waypoint_index":5,"matchings_index":0,"name":"West G Street","location":[-117.173143,32.712597]},{"alternatives_count":1,"waypoint_index":6,"matchings_index":0,"name":"West G Street","location":[-117.173345,32.712546]}],"code":"Ok"} +{"matchings":[{"confidence":0.95,"geometry":"gatfEfidjUk@Lc@@Y?E??L?^Hf@","legs":[{"summary":"North Harbor Drive","weight":2.5,"duration":2.5,"steps":[{"intersections":[{"out":0,"entry":[true],"bearings":[340],"location":[-117.172836,32.712041]}],"driving_side":"right","geometry":"gatfEfidjUUFIBK@","mode":"driving","maneuver":{"bearing_after":340,"bearing_before":0,"location":[-117.172836,32.712041],"type":"depart","instruction":"Head north on North Harbor Drive"},"weight":2.5,"duration":2.5,"name":"North Harbor Drive","distance":25},{"intersections":[{"in":0,"entry":[true],"bearings":[170],"location":[-117.17291,32.712256]}],"driving_side":"right","geometry":"sbtfEtidjU","mode":"driving","maneuver":{"bearing_after":0,"bearing_efore":350,"location":[-117.17291,32.712256],"type":"arrive","instruction":"You have arrived at your 1st destination"},"weight":0,"duration":0,"name":"North Harbor Drive","distance":0}],"distance":25},{"summary":"North Harbor Drive","weight":2.1,"duration":2.1,"steps":[{"intersections":[{"out":0,"entry":[true],"bearings":[352],"location":[-117.17291,32.712256]}],"driving_side":"right","geometry":"sbtfEtidjUA?M@G?I?A?","mode":"driving","maneuver":{"bearing_after":352,"bearing_before":0,"location":[-117.17291,32.712256],"type":"depart","instruction":"Head north on North Harbor Drive"},"weight":2.1,"duration":2.1,"name":"North Harbor Drive","distance":21},{"intersections":[{"in":0,"entry":[true],"bearings":[180],"location":[-117.17292,32.712444]}],"driving_side":"right","geometry":"wctfEvidjU","mode":"driving","maneuver":{"bearing_after":0,"bearing_before":0,"location":[-117.17292,32.712444],"type":"arrive","instruction":"You have arrived at your 2nd destination"},"weight":0,"duration":0,"name":"North Harbor Drive","distance":0}],"distance":21},{"summary":"North Harbor Drive","weight":1.4,"duration":1.4,"steps":[{"intersections":[{"out":0,"entry":[true],"bearings":[359],"location":[-117.17292,32.712444]},{"out":0,"in":1,"entry":[true,false,false],"bearings":[0,180,270],"location":[-117.172921,32.712514]}],"driving_side":"right","geometry":"wctfEvidjUM?K?","mode":"driving","maneuver":{"bearing_after":359,"bearing_before":0,"location":[-117.17292,32.712444],"type":"depart","instruction":"Head north on North Harbor Drive"},"weight":1.4,"duration":1.4,"name":"North Harbor Drive","distance":14},{"intersections":[{"in":0,"entry":[true],"bearings":[179],"location":[-117.172922,32.71257]}],"driving_side":"right","geometry":"qdtfEvidjU","mode":"driving","maneuver":{"bearing_after":0,"bearing_before":359,"location":[-117.172922,32.71257],"type":"arrive","instruction":"You have arrived at your 3rd destination"},"weight":0,"duration":0,"name":"North Harbor Drive","distance":0}],"distance":14},{"summary":"North Harbor Drive, West G Street","weight":38.4,"duration":6.5,"steps":[{"intersections":[{"out":0,"entry":[true],"bearings":[0],"location":[-117.172922,32.71257]}],"driving_side":"right","geometry":"qdtfEvidjUE?","mode":"driving","maneuver":{"bearing_after":0,"bearing_before":0,"location":[-117.172922,32.71257],"type":"depart","instruction":"Head north on North Harbor Drive"},"weight":36.3,"duration":5.5,"name":"North Harbor Drive","distance":3.2},{"intersections":[{"out":2,"in":1,"entry":[true,false,true],"bearings":[0,180,270],"location":[-117.172922,32.712599]}],"driving_side":"right","geometry":"wdtfEvidjU?L","mode":"driving","maneuver":{"bearing_after":271,"bearing_before":358,"location":[-117.172922,32.712599],"modifier":"left","type":"turn","instruction":"Turn left onto West G Street"},"weight":2.1,"duration":1,"name":"West G Street","distance":5.9},{"intersections":[{"in":0,"entry":[true],"bearings":[91],"location":[-117.172985,32.7126]}],"driving_side":"right","geometry":"wdtfEdjdjU","mode":"driving","maneuver":{"bearing_after":0,"bearing_before":271,"location":[-117.172985,32.7126],"type":"arrive","instruction":"You have arrived at your 4th destination"},"weight":0,"duration":0,"name":"West G Street","distance":0}],"distance":9.1},{"summary":"West G Street","weight":5.4,"duration":4.9,"steps":[{"intersections":[{"out":0,"entry":[true],"bearings":[273],"location":[-117.172985,32.7126]},{"out":3,"in":1,"entry":[false,false,true,true],"bearings":[0,90,180,270],"location":[-117.173011,32.712601]}],"driving_side":"right","geometry":"wdtfEdjdjU?B?X","mode":"driving","maneuver":{"bearing_after":273,"bearing_before":0,"location":[-117.172985,32.7126],"type":"depart","instruction":"Head west on West G Street"},"weight":5.4,"duration":4.9,"name":"West G Street","distance":14.8},{"intersections":[{"in":0,"entry":[true],"bearings":[88],"location":[-117.173143,32.712597]}],"driving_side":"right","geometry":"wdtfEbkdjU","mode":"driving","maneuver":{"bearing_after":0,"bearing_before":268,"location":[-117.173143,32.712597],"type":"arrive","instruction":"You have arrived at your 5th destination"},"weight":0,"duration":0,"name":"West G Street","distance":0}],"distance":14.8},{"summary":"West G Street","weight":7.2,"duration":7.2,"steps":[{"intersections":[{"out":0,"entry":[true],"bearings":[262],"location":[-117.173143,32.712597]}],"driving_side":"right","geometry":"wdtfEdkdjU@LBLBJ","mode":"driving","maneuver":{"bearing_after":262,"bearing_before":0,"location":[-117.173143,32.712597],"type":"depart","instruction":"Head west on West G Street"},"weight":7.2,"duration":7.2,"name":"West G Street","distance":20},{"intersections":[{"in":0,"entry":[true],"bearings":[61],"location":[-117.173345,32.712546]}],"driving_side":"right","geometry":"mdtfElldjU","mode":"driving","maneuver":{"bearing_after":0,"bearing_before":241,"location":[-117.173345,32.712546],"type":"arrive","instruction":"You have arrived at your destination"},"weight":0,"duration":0,"name":"West G Street","distance":0}],"distance":20}],"weight_name":"routability","weight":57,"duration":24.599999999999998,"distance":103.89999999999999}],"tracepoints":[{"alternatives_count":0,"waypoint_index":0,"matchings_index":0,"name":"North Harbor Drive","location":[-117.172836,32.712041]},{"alternatives_count":0,"waypoint_index":1,"matchings_index":0,"name":"North Harbor Drive","location":[-117.17291,32.712256]},{"alternatives_count":0,"waypoint_index":2,"matchings_index":0,"name":"North Harbor Drive","location":[-117.17292,32.712444]},{"alternatives_count":0,"waypoint_index":3,"matchings_index":0,"name":"North Harbor Drive","location":[-117.172922,32.71257]},{"alternatives_count":0,"waypoint_index":4,"matchings_index":0,"name":"West G Street","location":[-117.172985,32.7126]},{"alternatives_count":0,"waypoint_index":5,"matchings_index":0,"name":"West G Street","location":[-117.173143,32.712597]},{"alternatives_count":1,"waypoint_index":6,"matchings_index":0,"name":"West G Street","location":[-117.173345,32.712546]}],"code":"Ok"} diff --git a/Tests/MapboxDirectionsTests/IntersectionTests.swift b/Tests/MapboxDirectionsTests/IntersectionTests.swift index 09529497d..8d0a13786 100644 --- a/Tests/MapboxDirectionsTests/IntersectionTests.swift +++ b/Tests/MapboxDirectionsTests/IntersectionTests.swift @@ -3,36 +3,78 @@ import XCTest class IntersectionTests: XCTestCase { func testCoding() { - let json: JSONDictionary = [ - "classes": ["toll", "restricted"], - "out": 0, - "entry": [true], - "bearings": [80.0], - "location": [-122.420018, 37.78009], - ] - let intersection = Intersection(json: json) - // Encode and decode the intersection securely. - // This may raise an Objective-C exception if an error is encountered which will fail the tests. + let intersectionJSON = +""" +[ + { + \"location\" : [ + 13.426579, + 52.508068000000002 + ], + \"in\" : -1, + \"classes\" : [ + \"toll\", + \"restricted\" + ], + \"usableApproachLanes\" : null, + \"bearings\" : [ + 80 + ], + \"entry\" : { + \"indexes\" : [ + { + \"location\" : 0, + \"length\" : 1 + } + ] + }, + \"out\" : 0, + \"approachLanes\" : null + }, + { + \"location\" : [ + 13.426688, + 52.508021999999997 + ], + \"in\" : 2, + \"usableApproachLanes\" : null, + \"bearings\" : [ + 30, + 120, + 300 + ], + \"entry\" : { + \"indexes\" : [ + { + \"location\" : 0, + \"length\" : 2 + } + ] + }, + \"out\" : 1, + \"approachLanes\" : null + } +] +""" +// let json: JSONDictionary = [ +// "classes": ["toll", "restricted"], +// "out": 0, +// "entry": [true], +// "bearings": [80.0], +// "location": [-122.420018, 37.78009], +// ] + let intersections = try! JSONDecoder().decode([Intersection].self, from: intersectionJSON.data(using: .utf8)!) + let intersection = intersections.first! - let encodedData = NSMutableData() - let keyedArchiver = NSKeyedArchiver(forWritingWith: encodedData) - keyedArchiver.requiresSecureCoding = true - keyedArchiver.encode(intersection, forKey: "intersection") - keyedArchiver.finishEncoding() + XCTAssert(intersection.outletRoadClasses == [.toll, .restricted]) + XCTAssert(intersection.headings == [80.0]) + XCTAssert(intersection.location == CLLocationCoordinate2D(latitude: 52.508068, longitude: 13.426579) ) + let encoder = JSONEncoder() + encoder.outputFormatting = [.prettyPrinted] + let encoded = String(data: try! encoder.encode(intersections), encoding: .utf8) - let keyedUnarchiver = NSKeyedUnarchiver(forReadingWith: encodedData as Data) - keyedUnarchiver.requiresSecureCoding = true - let unarchivedIntersection = keyedUnarchiver.decodeObject(of: Intersection.self, forKey: "intersection")! - keyedUnarchiver.finishDecoding() - - XCTAssertNotNil(unarchivedIntersection) - - XCTAssertEqual(unarchivedIntersection.location.latitude, unarchivedIntersection.location.latitude) - XCTAssertEqual(unarchivedIntersection.location.longitude, unarchivedIntersection.location.longitude) - XCTAssertEqual(unarchivedIntersection.headings, unarchivedIntersection.headings) - XCTAssertEqual(unarchivedIntersection.outletIndex, unarchivedIntersection.outletIndex) - XCTAssertEqual(unarchivedIntersection.outletIndexes, unarchivedIntersection.outletIndexes) - XCTAssertEqual(unarchivedIntersection.outletRoadClasses, unarchivedIntersection.outletRoadClasses) - } + XCTAssert(encoded == intersectionJSON) +// } +} } diff --git a/Tests/MapboxDirectionsTests/MatchTests.swift b/Tests/MapboxDirectionsTests/MatchTests.swift index eb1341fcf..107f7ee61 100644 --- a/Tests/MapboxDirectionsTests/MatchTests.swift +++ b/Tests/MapboxDirectionsTests/MatchTests.swift @@ -46,27 +46,26 @@ class MatchTests: XCTestCase { } let opts = match.matchOptions - XCTAssertEqual(opts, matchOptions) + XCTAssert(matchOptions == opts) XCTAssertNotNil(match) - XCTAssertNotNil(match.coordinates) - XCTAssertEqual(match.coordinates!.count, 8) + XCTAssertNotNil(match.shape) + XCTAssertEqual(match.shape!.coordinates.count, 8) XCTAssertEqual(match.accessToken, BogusToken) XCTAssertEqual(match.apiEndpoint, URL(string: "https://api.mapbox.com")) XCTAssertEqual(match.routeIdentifier, nil) let tracePoints = match.tracepoints XCTAssertNotNil(tracePoints) - XCTAssertEqual(tracePoints.first!.alternateCount, 0) - XCTAssertEqual(tracePoints.last!.name, "West G Street") + XCTAssertEqual(tracePoints.first!!.alternateCount, 0) + XCTAssertEqual(tracePoints.last!!.name, "West G Street") // confirming actual decoded values is important because the Directions API // uses an atypical precision level for polyline encoding - XCTAssertEqual(round(match!.coordinates!.first!.latitude), 33) - XCTAssertEqual(round(match!.coordinates!.first!.longitude), -117) + XCTAssertEqual(round(match!.shape!.coordinates.first!.latitude), 33) + XCTAssertEqual(round(match!.shape!.coordinates.first!.longitude), -117) XCTAssertEqual(match!.legs.count, 6) XCTAssertEqual(match!.confidence, 0.95) - XCTAssertEqual(match!.waypointIndices, IndexSet([0, 1, 2, 3, 4, 5, 6])) let leg = match!.legs.first! XCTAssertEqual(leg.name, "North Harbor Drive") @@ -91,7 +90,6 @@ class MatchTests: XCTestCase { XCTAssertNotNil(step.coordinates) XCTAssertEqual(step.coordinates!.count, 4) - XCTAssertEqual(step.coordinates!.count, Int(step.coordinateCount)) let coordinate = step.coordinates!.first! XCTAssertEqual(round(coordinate.latitude), 33) XCTAssertEqual(round(coordinate.longitude), -117) @@ -134,30 +132,21 @@ class MatchTests: XCTestCase { XCTAssertNotNil(match) let tracepoints = match.tracepoints XCTAssertEqual(tracepoints.count, 7) - XCTAssertEqual(tracepoints[0].coordinate.latitude, kCLLocationCoordinate2DInvalid.latitude) - XCTAssertEqual(tracepoints[0].coordinate.longitude, kCLLocationCoordinate2DInvalid.longitude) + XCTAssertEqual(tracepoints.first!, nil) // Encode and decode the match securely. // This may raise an Objective-C exception if an error is encountered which will fail the tests. - let encodedData = NSMutableData() - let keyedArchiver = NSKeyedArchiver(forWritingWith: encodedData) - keyedArchiver.requiresSecureCoding = true - keyedArchiver.encode(match, forKey: "match") - keyedArchiver.finishEncoding() + let encoded = try! JSONEncoder().encode(match) + let encodedString = String(data: encoded, encoding: .utf8)! - let keyedUnarchiver = NSKeyedUnarchiver(forReadingWith: encodedData as Data) - keyedUnarchiver.requiresSecureCoding = true - let unarchivedMatch = keyedUnarchiver.decodeObject(of: Match.self, forKey: "match")! - keyedUnarchiver.finishDecoding() - - XCTAssertNotNil(unarchivedMatch) + let unarchivedMatch = try! JSONDecoder().decode(Match.self, from: encodedString.data(using: .utf8)!) + - XCTAssertEqual(unarchivedMatch.confidence, unarchivedMatch.confidence) - XCTAssertEqual(unarchivedMatch.matchOptions, unarchivedMatch.matchOptions) - XCTAssertEqual(unarchivedMatch.tracepoints, unarchivedMatch.tracepoints) - XCTAssertEqual(unarchivedMatch.waypointIndices, unarchivedMatch.waypointIndices) + XCTAssertEqual(match.confidence, unarchivedMatch.confidence) + XCTAssertEqual(match.matchOptions, unarchivedMatch.matchOptions) + XCTAssertEqual(match.tracepoints, unarchivedMatch.tracepoints) } } #endif diff --git a/Tests/MapboxDirectionsTests/RoutableMatchTests.swift b/Tests/MapboxDirectionsTests/RoutableMatchTests.swift index 0d7987ef1..747f10c21 100644 --- a/Tests/MapboxDirectionsTests/RoutableMatchTests.swift +++ b/Tests/MapboxDirectionsTests/RoutableMatchTests.swift @@ -53,8 +53,8 @@ class RoutableMatchTest: XCTestCase { } XCTAssertNotNil(route) - XCTAssertNotNil(route.coordinates) - XCTAssertEqual(route.coordinates!.count, 8) + XCTAssertNotNil(route.shape) + XCTAssertEqual(route.shape!.coordinates.count, 8) XCTAssertEqual(route.accessToken, BogusToken) XCTAssertEqual(route.apiEndpoint, URL(string: "https://api.mapbox.com")) XCTAssertEqual(route.routeIdentifier, nil) @@ -66,8 +66,8 @@ class RoutableMatchTest: XCTestCase { // confirming actual decoded values is important because the Directions API // uses an atypical precision level for polyline encoding - XCTAssertEqual(round(route!.coordinates!.first!.latitude), 33) - XCTAssertEqual(round(route!.coordinates!.first!.longitude), -117) + XCTAssertEqual(round(route!.shape!.coordinates.first!.latitude), 33) + XCTAssertEqual(round(route!.shape!.coordinates.first!.longitude), -117) XCTAssertEqual(route!.legs.count, 1) let leg = route!.legs.first! @@ -93,7 +93,6 @@ class RoutableMatchTest: XCTestCase { XCTAssertNotNil(step.coordinates) XCTAssertEqual(step.coordinates!.count, 4) - XCTAssertEqual(step.coordinates!.count, Int(step.coordinateCount)) let coordinate = step.coordinates!.first! XCTAssertEqual(round(coordinate.latitude), 33) XCTAssertEqual(round(coordinate.longitude), -117) diff --git a/Tests/MapboxDirectionsTests/RouteOptionsTests.swift b/Tests/MapboxDirectionsTests/RouteOptionsTests.swift index 97962a179..f27d1236f 100644 --- a/Tests/MapboxDirectionsTests/RouteOptionsTests.swift +++ b/Tests/MapboxDirectionsTests/RouteOptionsTests.swift @@ -6,16 +6,12 @@ import CoreLocation class RouteOptionsTests: XCTestCase { func testCoding() { let options = testRouteOptions - let encodedData = NSMutableData() - let keyedArchiver = NSKeyedArchiver(forWritingWith: encodedData) - keyedArchiver.requiresSecureCoding = true - keyedArchiver.encode(options, forKey: "options") - keyedArchiver.finishEncoding() - let keyedUnarchiver = NSKeyedUnarchiver(forReadingWith: encodedData as Data) - keyedUnarchiver.requiresSecureCoding = true - let unarchivedOptions = keyedUnarchiver.decodeObject(of: RouteOptions.self, forKey: "options")! - keyedUnarchiver.finishDecoding() + let encoded: Data = try! JSONEncoder().encode(options) + let optionsString: String = String(data: encoded, encoding: .utf8)! + + let unarchivedOptions: RouteOptions = try! JSONDecoder().decode(RouteOptions.self, from: optionsString.data(using: .utf8)!) + XCTAssertNotNil(unarchivedOptions) @@ -37,45 +33,6 @@ class RouteOptionsTests: XCTestCase { XCTAssertEqual(unarchivedOptions.roadClassesToAvoid, options.roadClassesToAvoid) } - func testCodingV4() { - let options = testRouteOptionsV4 - let encodedData = NSMutableData() - let keyedArchiver = NSKeyedArchiver(forWritingWith: encodedData) - keyedArchiver.requiresSecureCoding = true - keyedArchiver.encode(options, forKey: "options") - keyedArchiver.finishEncoding() - - let keyedUnarchiver = NSKeyedUnarchiver(forReadingWith: encodedData as Data) - keyedUnarchiver.requiresSecureCoding = true - let unarchivedOptions = keyedUnarchiver.decodeObject(of: RouteOptionsV4.self, forKey: "options")! - keyedUnarchiver.finishDecoding() - - XCTAssertNotNil(unarchivedOptions) - - let coordinates = testCoordinates - let unarchivedWaypoints = unarchivedOptions.waypoints - XCTAssertEqual(unarchivedWaypoints.count, coordinates.count) - XCTAssertEqual(unarchivedWaypoints[0].coordinate.latitude, coordinates[0].latitude) - XCTAssertEqual(unarchivedWaypoints[0].coordinate.longitude, coordinates[0].longitude) - XCTAssertEqual(unarchivedWaypoints[1].coordinate.latitude, coordinates[1].latitude) - XCTAssertEqual(unarchivedWaypoints[1].coordinate.longitude, coordinates[1].longitude) - XCTAssertEqual(unarchivedWaypoints[2].coordinate.latitude, coordinates[2].latitude) - XCTAssertEqual(unarchivedWaypoints[2].coordinate.longitude, coordinates[2].longitude) - - XCTAssertEqual(unarchivedOptions.profileIdentifier, options.profileIdentifier) - XCTAssertEqual(unarchivedOptions.instructionFormat, options.instructionFormat) - XCTAssertEqual(unarchivedOptions.includesShapes, options.includesShapes) - XCTAssertEqual(unarchivedOptions.includesSteps, options.includesSteps) - } - - func testCopying() { - let testInstance = testRouteOptions - guard let copy = testInstance.copy() as? RouteOptions else { return XCTFail("RouteOptions copy method should an object of same type") } - XCTAssertNotNil(copy, "Copy should not be nil.") - XCTAssertTrue(testInstance == copy, "Test Instance and copy should be semantically equivalent.") - XCTAssertFalse(testInstance === copy, "Test Instance and copy should not be identical.") - - } //MARK: API Name Handling Tests private static var testWaypoints: [Waypoint] { return [Waypoint(coordinate: CLLocationCoordinate2D(latitude: 39.27664, longitude:-84.41139)), @@ -86,24 +43,25 @@ class RouteOptionsTests: XCTestCase { let testBundle = Bundle(for: type(of: self)) guard let fixtureURL = testBundle.url(forResource:fixtureName, withExtension:"json") else { XCTFail(); return nil } guard let fixtureData = try? Data(contentsOf: fixtureURL, options:.mappedIfSafe) else {XCTFail(); return nil } - guard let fixtureOpaque = try? JSONSerialization.jsonObject(with: fixtureData), let fixture = fixtureOpaque as? JSONDictionary else { XCTFail(); return nil } - + let subject = RouteOptions(waypoints: waypoints) - let response = subject.response(from: fixture) - - guard let waypoints = response.0, let routes = response.1 else { XCTFail("Expected responses not returned from service"); return nil} + let decoder = JSONDecoder() + decoder.userInfo[.options] = subject + let response = try! decoder.decode(RouteResponse.self, from: fixtureData) + + guard let waypoints = response.waypoints, let routes = response.routes else { XCTFail("Expected responses not returned from service"); return nil} guard let primary = routes.first else {XCTFail("Expected a route in response"); return nil} return (waypoints:waypoints, route:primary) } func testResponseWithoutDestinationName() { let response = self.response(for: "noDestinationName")! - XCTAssert(response.route.legs.last!.destination.name == nil, "API waypoint with no name (aka \"\") needs to be represented as `nil`.") + XCTAssert(response.route.legs.last!.destination!.name == nil, "API waypoint with no name (aka \"\") needs to be represented as `nil`.") } func testResponseWithDestinationName() { let response = self.response(for: "apiDestinationName")! - XCTAssert(response.route.legs.last!.destination.name == "testpass", "Waypoint name in fixture response not parsed correctly.") + XCTAssert(response.route.legs.last!.destination!.name == "testpass", "Waypoint name in fixture response not parsed correctly.") } func testResponseWithManuallySetDestinationName() { @@ -111,7 +69,7 @@ class RouteOptionsTests: XCTestCase { manuallySet.last!.name = "manuallyset" let response = self.response(for: "apiDestinationName", waypoints: manuallySet)! - XCTAssert(response.route.legs.last!.destination.name == "manuallyset", "Waypoint with manually set name should override any computed name.") + XCTAssert(response.route.legs.last!.destination!.name == "manuallyset", "Waypoint with manually set name should override any computed name.") } func testApproachesURLQueryParams() { @@ -149,12 +107,8 @@ class RouteOptionsTests: XCTestCase { func testDecimalPrecision() { let start = CLLocationCoordinate2D(latitude: 9.945497000000003, longitude: 53.03218800000006) let end = CLLocationCoordinate2D(latitude: 10.945497000000003, longitude: 54.03218800000006) - - let wpts = [start, end].map { Waypoint(coordinate: $0) } - - let subject = DirectionsOptions(waypoints: wpts) - let answer = subject.queries + let answer = [start.requestDescription, end.requestDescription] let correct = ["53.032188,9.945497", "54.032188,10.945497"] XCTAssert(answer == correct, "Coordinates should be truncated.") @@ -166,7 +120,8 @@ class RouteOptionsTests: XCTestCase { destination.targetCoordinate = CLLocationCoordinate2D(latitude: 39.13115, longitude: -84.51619) let options = RouteOptions(waypoints: [origin, destination]) - XCTAssertEqual(options.queries, ["-84.47182,39.15031", "-84.51638,39.12971"]) +// XCTAssertEqual(options.queries, ["-84.47182,39.15031", "-84.51638,39.12971"]) + XCTFail("Get the path") XCTAssertTrue(options.urlQueryItems.contains(URLQueryItem(name: "waypoint_names", value: "XU;UC"))) XCTAssertTrue(options.urlQueryItems.contains(URLQueryItem(name: "waypoint_targets", value: ";-84.51619,39.13115"))) } @@ -193,11 +148,3 @@ var testRouteOptions: RouteOptions { return opts } - -var testRouteOptionsV4: RouteOptionsV4 { - let options = RouteOptionsV4(coordinates: testCoordinates, profileIdentifier: .automobileAvoidingTraffic) - options.instructionFormat = .html - options.includesShapes = true - options.includesSteps = true - return options -} diff --git a/Tests/MapboxDirectionsTests/RouteStepTests.swift b/Tests/MapboxDirectionsTests/RouteStepTests.swift index b23def21c..0ef45c013 100644 --- a/Tests/MapboxDirectionsTests/RouteStepTests.swift +++ b/Tests/MapboxDirectionsTests/RouteStepTests.swift @@ -106,59 +106,55 @@ class RoadTests: XCTestCase { class RouteStepTests: XCTestCase { func testCoding() { - let coordinates = [ - CLLocationCoordinate2D(latitude: -122.220694, longitude: 37.853913), - CLLocationCoordinate2D(latitude: -122.22044, longitude: 37.854032), - CLLocationCoordinate2D(latitude: -122.220168, longitude: 37.854149), - ] - let json = [ - "mode": "driving", - "maneuver": [ - "instruction": "Keep left at the fork onto CA 24", - "bearing_before": 55, - ], - "distance": 1669.7, - "duration": 75.6, - "pronunciation": "ˈaɪˌfoʊ̯n ˈtɛn", - ] as [String: Any] - - let step = RouteStep(finalHeading: 59, maneuverType: .reachFork, maneuverDirection: .left, drivingSide: .left, maneuverLocation: CLLocationCoordinate2D(latitude: 37.853913, longitude: -122.220694), name: "", coordinates: coordinates, json: json) - - // Encode and decode the route step securely - // This may raise an Obj-C exception if an error is encountered which will fail the tests - - let encodedData = NSMutableData() - let keyedArchiver = NSKeyedArchiver(forWritingWith: encodedData) - keyedArchiver.requiresSecureCoding = true - keyedArchiver.encode(step, forKey: "step") - keyedArchiver.finishEncoding() - - let keyedUnarchiver = NSKeyedUnarchiver(forReadingWith: encodedData as Data) - keyedUnarchiver.requiresSecureCoding = true - let unarchivedStep = keyedUnarchiver.decodeObject(of: RouteStep.self, forKey: "step")! - keyedUnarchiver.finishDecoding() + let step = try! JSONDecoder().decode(RouteStep.self, from: routeStepJSON.data(using: .utf8)!) - XCTAssertNotNil(unarchivedStep) + let encoded = try! JSONEncoder().encode(step) + let roundTripJSON = String(data: encoded, encoding: .utf8) - XCTAssertEqual(unarchivedStep.coordinates?.count, step.coordinates?.count) - XCTAssertEqual(unarchivedStep.coordinates?.first?.latitude, step.coordinates?.first?.latitude) - XCTAssertEqual(unarchivedStep.coordinates?.first?.longitude, step.coordinates?.first?.longitude) - XCTAssertEqual(unarchivedStep.instructions, step.instructions) - XCTAssertEqual(unarchivedStep.initialHeading, step.initialHeading) - XCTAssertEqual(unarchivedStep.finalHeading, step.finalHeading) - XCTAssertEqual(unarchivedStep.maneuverType, step.maneuverType) - XCTAssertEqual(unarchivedStep.maneuverDirection, step.maneuverDirection) - XCTAssertEqual(unarchivedStep.maneuverLocation.latitude, step.maneuverLocation.latitude) - XCTAssertEqual(unarchivedStep.maneuverLocation.longitude, step.maneuverLocation.longitude) - XCTAssertEqual(unarchivedStep.exitIndex, step.exitIndex) - XCTAssertEqual(unarchivedStep.distance, step.distance) - XCTAssertEqual(unarchivedStep.expectedTravelTime, step.expectedTravelTime) - XCTAssertEqual(unarchivedStep.names ?? [], step.names ?? []) - XCTAssertEqual(unarchivedStep.phoneticNames ?? [], step.phoneticNames ?? []) - XCTAssertEqual(unarchivedStep.transportType, step.transportType) - XCTAssertEqual(unarchivedStep.destinations ?? [], step.destinations ?? []) - XCTAssertEqual(unarchivedStep.instructionsSpokenAlongStep ?? [], step.instructionsSpokenAlongStep ?? []) - XCTAssertEqual(unarchivedStep.instructionsDisplayedAlongStep ?? [], step.instructionsDisplayedAlongStep ?? []) - XCTAssertEqual(unarchivedStep.drivingSide, DrivingSide.left) + XCTAssert(roundTripJSON == routeStepJSON) } } + + +let routeStepJSON = """ +{ + "intersections": [ + { + "out": 1, + "location": [ 13.424671, 52.508812 ], + "bearings": [ 120, 210, 300 ], + "entry": [ false, true, true ], + "in": 0, + "lanes": [ + { + "valid": true, + "indications": [ "left" ] + }, + { + "valid": true, + "indications": [ "straight" ] + }, + { + "valid": false, + "indications": [ "right" ] + } + ] + } + ], + "geometry": "asn_Ie_}pAdKxG", + "maneuver": { + "bearing_after": 202, + "type": "turn", + "modifier": "left", + "bearing_before": 299, + "location": [ 13.424671, 52.508812 ], + "instruction": "Turn left onto Adalbertstraße" + }, + "duration": 59.1, + "distance": 236.9, + "driving_side": "right", + "weight": 59.1, + "name": "Adalbertstraße", + "mode": "driving" +} +""" diff --git a/Tests/MapboxDirectionsTests/V4Tests.swift b/Tests/MapboxDirectionsTests/V4Tests.swift deleted file mode 100644 index fe21364cc..000000000 --- a/Tests/MapboxDirectionsTests/V4Tests.swift +++ /dev/null @@ -1,93 +0,0 @@ -import XCTest -#if !SWIFT_PACKAGE -import OHHTTPStubs -@testable import MapboxDirections - -class V4Tests: XCTestCase { - override func tearDown() { - OHHTTPStubs.removeAllStubs() - super.tearDown() - } - - func test(shapeFormat: RouteShapeFormat) { - let expectation = self.expectation(description: "calculating directions should return results") - - let queryParams: [String: String?] = [ - "alternatives": "true", - "instructions": "text", - "geometry": String(describing: shapeFormat), - "steps": "true", - "access_token": BogusToken, - ] - stub(condition: isHost("api.mapbox.com") - && isPath("/v4/directions/mapbox.driving/-122.42,37.78;-77.03,38.91.json") - && containsQueryParams(queryParams)) { _ in - let path = Bundle(for: type(of: self)).path(forResource: "v4_driving_dc_\(shapeFormat)", ofType: "json") - return OHHTTPStubsResponse(fileAtPath: path!, statusCode: 200, headers: ["Content-Type": "application/json"]) - } - - let options = RouteOptionsV4(coordinates: [ - CLLocationCoordinate2D(latitude: 37.78, longitude: -122.42), - CLLocationCoordinate2D(latitude: 38.91, longitude: -77.03), - ]) - XCTAssertEqual(options.shapeFormat, .polyline, "Route shape format should be Polyline by default.") - options.shapeFormat = shapeFormat - options.includesSteps = true - options.includesAlternativeRoutes = true - var route: Route? - let task = Directions(accessToken: BogusToken).calculate(options) { (waypoints, routes, error) in - XCTAssertNil(error, "Error: \(error!)") - - XCTAssertNotNil(routes) - XCTAssertEqual(routes!.count, 2) - route = routes!.first! - - expectation.fulfill() - } - XCTAssertNotNil(task) - - waitForExpectations(timeout: 2) { (error) in - XCTAssertNil(error, "Error: \(error!)") - XCTAssertEqual(task.state, .completed) - } - - XCTAssertNotNil(route) - XCTAssertNotNil(route!.coordinates) - XCTAssertEqual(route!.coordinates!.count, 28375) - XCTAssertEqual(route!.accessToken, BogusToken) - XCTAssertEqual(route!.apiEndpoint, URL(string: "https://api.mapbox.com")) - - XCTAssertEqual(round(route!.coordinates!.first!.latitude), 38) - XCTAssertEqual(round(route!.coordinates!.first!.longitude), -122) - XCTAssertEqual(route!.legs.count, 1) - - let leg = route!.legs.first! - XCTAssertEqual(leg.name, "I 80, I 80;US 30") - XCTAssertEqual(leg.steps.count, 80) - - let step = leg.steps[24] - XCTAssertEqual(step.distance, 223582.0) - XCTAssertEqual(step.expectedTravelTime, 7219.0) - XCTAssertEqual(step.instructions, "Go straight onto I 80;US 93 Alternate, I 80;US 93 ALT becomes I 80;US 93 Alternate") - XCTAssertNotNil(step.names) - XCTAssertEqual(step.names ?? [], ["I 80", "US 93 Alternate"]) - XCTAssertEqual(step.maneuverType, .continue) - XCTAssert(step.maneuverDirection == .none) - XCTAssertNil(step.initialHeading) - XCTAssertNil(step.finalHeading) - - XCTAssertNil(step.coordinates) - XCTAssertEqual(step.coordinateCount, 0) - } - - func testGeoJSON() { - XCTAssertEqual(String(describing: RouteShapeFormat.geoJSON), "geojson") - test(shapeFormat: .geoJSON) - } - - func testPolyline() { - XCTAssertEqual(String(describing: RouteShapeFormat.polyline), "polyline") - test(shapeFormat: .polyline) - } -} -#endif diff --git a/Tests/MapboxDirectionsTests/V5Tests.swift b/Tests/MapboxDirectionsTests/V5Tests.swift index 97983c403..92d87bed7 100644 --- a/Tests/MapboxDirectionsTests/V5Tests.swift +++ b/Tests/MapboxDirectionsTests/V5Tests.swift @@ -75,8 +75,8 @@ class V5Tests: XCTestCase { return } - XCTAssertNotNil(route.coordinates) - XCTAssertEqual(route.coordinates?.count, 30_097) + XCTAssertNotNil(route.shape) + XCTAssertEqual(route.shape!.coordinates.count, 30_097) XCTAssertEqual(route.accessToken, BogusToken) XCTAssertEqual(route.apiEndpoint, URL(string: "https://api.mapbox.com")) XCTAssertEqual(route.routeIdentifier?.count, 25) @@ -85,8 +85,8 @@ class V5Tests: XCTestCase { // confirming actual decoded values is important because the Directions API // uses an atypical precision level for polyline encoding - XCTAssertEqual(route.coordinates?.first?.latitude ?? 0, 38, accuracy: 1) - XCTAssertEqual(route.coordinates?.first?.longitude ?? 0, -122, accuracy: 1) + XCTAssertEqual(route.shape?.coordinates.first?.latitude ?? 0, 38, accuracy: 1) + XCTAssertEqual(route.shape?.coordinates.first?.longitude ?? 0, -122, accuracy: 1) XCTAssertEqual(route.legs.count, 1) let opts = route.routeOptions @@ -121,7 +121,6 @@ class V5Tests: XCTestCase { XCTAssertNotNil(step?.coordinates) XCTAssertEqual(step?.coordinates?.count, 13) - XCTAssertEqual(step?.coordinates?.count, Int(step?.coordinateCount ?? 0)) XCTAssertEqual(step?.coordinates?.first?.latitude ?? 0, 38.9667, accuracy: 1e-4) XCTAssertEqual(step?.coordinates?.first?.longitude ?? 0, -77.1802, accuracy: 1e-4) @@ -270,46 +269,50 @@ class V5Tests: XCTestCase { XCTAssertEqual(route?.legs.count, 1) let leg = route?.legs.first - XCTAssertEqual(leg?.source.name, waypoints[0].name) - XCTAssertEqual(leg?.source.coordinate.latitude ?? 0, waypoints[0].coordinate.latitude, accuracy: 1e-4) - XCTAssertEqual(leg?.source.coordinate.longitude ?? 0, waypoints[0].coordinate.longitude, accuracy: 1e-4) - XCTAssertEqual(leg?.destination.name, waypoints[2].name) - XCTAssertEqual(leg?.destination.coordinate.latitude ?? 0, waypoints[2].coordinate.latitude, accuracy: 1e-4) - XCTAssertEqual(leg?.destination.coordinate.longitude ?? 0, waypoints[2].coordinate.longitude, accuracy: 1e-4) + XCTAssertEqual(leg?.source!.name, waypoints[0].name) + XCTAssertEqual(leg?.source?.coordinate.latitude ?? 0, waypoints[0].coordinate.latitude, accuracy: 1e-4) + XCTAssertEqual(leg?.source?.coordinate.longitude ?? 0, waypoints[0].coordinate.longitude, accuracy: 1e-4) + XCTAssertEqual(leg?.destination!.name, waypoints[2].name) + XCTAssertEqual(leg?.destination?.coordinate.latitude ?? 0, waypoints[2].coordinate.latitude, accuracy: 1e-4) + XCTAssertEqual(leg?.destination?.coordinate.longitude ?? 0, waypoints[2].coordinate.longitude, accuracy: 1e-4) XCTAssertEqual(leg?.name, "Perlen Strasse, Haupt Strasse") } func testCoding() { let path = Bundle(for: type(of: self)).path(forResource: "v5_driving_dc_polyline", ofType: "json") let filePath = URL(fileURLWithPath: path!) - let data = try! Data(contentsOf: filePath, options: []) - let jsonResponse = try! JSONSerialization.jsonObject(with: data, options: []) as! [String: Any] - + let data = try! Data(contentsOf: filePath) let options = RouteOptions(coordinates: [ CLLocationCoordinate2D(latitude: 37.78, longitude: -122.42), CLLocationCoordinate2D(latitude: 38.91, longitude: -77.03), ]) - let routes = options.response(from: jsonResponse).1 + + let decoder = JSONDecoder() + decoder.userInfo[.options] = options + let result = try! decoder.decode(RouteResponse.self, from: data) + + let routes = result.routes let route = routes!.first! route.accessToken = BogusToken route.apiEndpoint = URL(string: "https://api.mapbox.com") - route.routeIdentifier = jsonResponse["uuid"] as? String + route.routeIdentifier = result.uuid + XCTFail("Finish this") // Encode and decode the route securely. // This may raise an Objective-C exception if an error occurs, which will fail the tests. - let encodedData = NSMutableData() - let keyedArchiver = NSKeyedArchiver(forWritingWith: encodedData) - keyedArchiver.requiresSecureCoding = true - keyedArchiver.encode(route, forKey: "route") - keyedArchiver.finishEncoding() - - let keyedUnarchiver = NSKeyedUnarchiver(forReadingWith: encodedData as Data) - keyedUnarchiver.requiresSecureCoding = true - let unarchivedRoute = keyedUnarchiver.decodeObject(of: Route.self, forKey: "route")! - keyedUnarchiver.finishDecoding() - - test(unarchivedRoute, options: options) +// let encodedData = NSMutableData() +// let keyedArchiver = NSKeyedArchiver(forWritingWith: encodedData) +// keyedArchiver.requiresSecureCoding = true +// keyedArchiver.encode(route, forKey: "route") +// keyedArchiver.finishEncoding() +// +// let keyedUnarchiver = NSKeyedUnarchiver(forReadingWith: encodedData as Data) +// keyedUnarchiver.requiresSecureCoding = true +// let unarchivedRoute = keyedUnarchiver.decodeObject(of: Route.self, forKey: "route")! +// keyedUnarchiver.finishDecoding() +// +// test(unarchivedRoute, options: options) } } #endif diff --git a/Tests/MapboxDirectionsTests/VisualInstructionComponentTests.swift b/Tests/MapboxDirectionsTests/VisualInstructionComponentTests.swift index bc4b3a7f0..7be7d68a3 100644 --- a/Tests/MapboxDirectionsTests/VisualInstructionComponentTests.swift +++ b/Tests/MapboxDirectionsTests/VisualInstructionComponentTests.swift @@ -1,12 +1,15 @@ import XCTest -import MapboxDirections +@testable import MapboxDirections +let componentJSON = """ +{ +"text": "Take a hike", +"imageBaseURL: "", +} +""" class VisualInstructionComponentTests: XCTestCase { func testJSONInitialization() { - let component = VisualInstructionComponent(json: [ - "text": "Take a hike", - "imageBaseURL": "", - ]) + let component = try! JSONDecoder().decode(Component.self, from: componentJSON.data(using:.utf8)!).component as! VisualInstructionComponent XCTAssertEqual(component.text, "Take a hike") XCTAssertNil(component.imageURL) } diff --git a/Tests/MapboxDirectionsTests/WalkingOptionsTests.swift b/Tests/MapboxDirectionsTests/WalkingOptionsTests.swift index 37b3b84e7..7504bcc29 100644 --- a/Tests/MapboxDirectionsTests/WalkingOptionsTests.swift +++ b/Tests/MapboxDirectionsTests/WalkingOptionsTests.swift @@ -1,7 +1,7 @@ import XCTest import MapboxDirections import CoreLocation - +@testable import MapboxDirections class WalkingOptionsTests: XCTestCase { @@ -18,9 +18,9 @@ class WalkingOptionsTests: XCTestCase { XCTAssertEqual(queryItems.filter { $0.name == "alley_bias" }.first?.value, "0.0") XCTAssertEqual(queryItems.filter { $0.name == "walkway_bias" }.first?.value, "0.0") XCTAssertEqual(queryItems.filter { $0.name == "walking_speed" }.first?.value, "1.42") - - options.alleyPriority = MBDirectionsPriority(rawValue: 0.4) - options.walkwayPriority = MBDirectionsPriority(rawValue: 0.5) + + options.alleyPriority = DirectionsPriority(rawValue: 0.4) + options.walkwayPriority = DirectionsPriority(rawValue: 0.5) options.speed = 5.2 queryItems = options.urlQueryItems diff --git a/Tests/MapboxDirectionsTests/WaypointTests.swift b/Tests/MapboxDirectionsTests/WaypointTests.swift index 74395c45d..428f10606 100644 --- a/Tests/MapboxDirectionsTests/WaypointTests.swift +++ b/Tests/MapboxDirectionsTests/WaypointTests.swift @@ -3,55 +3,37 @@ import CoreLocation @testable import MapboxDirections class WaypointTests: XCTestCase { - func testCopying() { - let originalWaypoint = Waypoint(coordinate: CLLocationCoordinate2D(latitude: 38.8977, longitude: -77.0365), coordinateAccuracy: 5, name: "White House") - originalWaypoint.targetCoordinate = CLLocationCoordinate2D(latitude: 38.8952261, longitude: -77.0327882) - originalWaypoint.heading = 90 - originalWaypoint.headingAccuracy = 10 - originalWaypoint.allowsArrivingOnOppositeSide = false - - guard let copy = originalWaypoint.copy() as? Waypoint else { - return XCTFail("Waypoint copy method should an object of same type") - } - - XCTAssertEqual(copy.coordinate.latitude, originalWaypoint.coordinate.latitude) - XCTAssertEqual(copy.coordinate.longitude, originalWaypoint.coordinate.longitude) - XCTAssertEqual(copy.coordinateAccuracy, originalWaypoint.coordinateAccuracy) - XCTAssertEqual(copy.targetCoordinate.latitude, originalWaypoint.targetCoordinate.latitude) - XCTAssertEqual(copy.targetCoordinate.longitude, originalWaypoint.targetCoordinate.longitude) - XCTAssertEqual(copy.heading, originalWaypoint.heading) - XCTAssertEqual(copy.headingAccuracy, originalWaypoint.headingAccuracy) - XCTAssertEqual(copy.allowsArrivingOnOppositeSide, originalWaypoint.allowsArrivingOnOppositeSide) - XCTAssertEqual(copy.separatesLegs, originalWaypoint.separatesLegs) - } - func testCoding() { let originalWaypoint = Waypoint(coordinate: CLLocationCoordinate2D(latitude: 38.8977, longitude: -77.0365), coordinateAccuracy: 5, name: "White House") originalWaypoint.targetCoordinate = CLLocationCoordinate2D(latitude: 38.8952261, longitude: -77.0327882) originalWaypoint.heading = 90 originalWaypoint.headingAccuracy = 10 originalWaypoint.allowsArrivingOnOppositeSide = false + + let coded = try! JSONEncoder().encode(originalWaypoint) + let codedString = String(data: coded, encoding: .utf8) +// let encodedData = NSMutableData() +// let coder = NSKeyedArchiver(forWritingWith: encodedData) +// coder.requiresSecureCoding = true +// coder.encode(originalWaypoint, forKey: "waypoint") +// coder.finishEncoding() - let encodedData = NSMutableData() - let coder = NSKeyedArchiver(forWritingWith: encodedData) - coder.requiresSecureCoding = true - coder.encode(originalWaypoint, forKey: "waypoint") - coder.finishEncoding() +// let decoder = NSKeyedUnarchiver(forReadingWith: encodedData as Data) +// decoder.requiresSecureCoding = true +// defer { +// decoder.finishDecoding() +// } +// guard let decodedWaypoint = decoder.decodeObject(of: Waypoint.self, forKey: "waypoint") else { +// return XCTFail("Unable to decode waypoint") +// } - let decoder = NSKeyedUnarchiver(forReadingWith: encodedData as Data) - decoder.requiresSecureCoding = true - defer { - decoder.finishDecoding() - } - guard let decodedWaypoint = decoder.decodeObject(of: Waypoint.self, forKey: "waypoint") else { - return XCTFail("Unable to decode waypoint") - } + let decodedWaypoint = try! JSONDecoder().decode(Waypoint.self, from: (codedString?.data(using: .utf8))!) XCTAssertEqual(decodedWaypoint.coordinate.latitude, originalWaypoint.coordinate.latitude) XCTAssertEqual(decodedWaypoint.coordinate.longitude, originalWaypoint.coordinate.longitude) XCTAssertEqual(decodedWaypoint.coordinateAccuracy, originalWaypoint.coordinateAccuracy) - XCTAssertEqual(decodedWaypoint.targetCoordinate.latitude, originalWaypoint.targetCoordinate.latitude) - XCTAssertEqual(decodedWaypoint.targetCoordinate.longitude, originalWaypoint.targetCoordinate.longitude) + XCTAssert(decodedWaypoint.targetCoordinate == originalWaypoint.targetCoordinate) + XCTAssertEqual(decodedWaypoint.heading, originalWaypoint.heading) XCTAssertEqual(decodedWaypoint.headingAccuracy, originalWaypoint.headingAccuracy) XCTAssertEqual(decodedWaypoint.allowsArrivingOnOppositeSide, originalWaypoint.allowsArrivingOnOppositeSide) From 9cffdd3772668152b8c1e9571fd1687a7d8bd2fd Mon Sep 17 00:00:00 2001 From: Jerrad Thramer Date: Tue, 22 Oct 2019 17:28:50 -0600 Subject: [PATCH 11/89] WIP: Test Fixes --- MapboxDirections.xcodeproj/project.pbxproj | 28 +----------- .../xcshareddata/xcschemes/Example.xcscheme | 5 --- .../xcschemes/MapboxDirections iOS.xcscheme | 26 +++++------ .../Extensions/CoreLocation.swift | 4 +- .../MBDirectionsOptions.swift | 2 +- Sources/MapboxDirections/MBIntersection.swift | 26 ++++++----- Sources/MapboxDirections/MBLane.swift | 3 +- .../MapboxDirections/MBLaneIndication.swift | 27 ++++++++++- Sources/MapboxDirections/MBRouteStep.swift | 45 ++++++++++++------- .../MBVisualInstruction.swift | 13 +++--- .../MBVisualInstructionBanner.swift | 7 +-- .../Fixtures/v4/v4_driving_dc_geojson.json | 1 - .../Fixtures/v4/v4_driving_dc_polyline.json | 1 - .../IntersectionTests.swift | 24 ++++------ .../RouteStepTests.swift | 5 ++- Tests/MapboxDirectionsTests/V5Tests.swift | 10 ++--- .../VisualInstructionComponentTests.swift | 3 +- .../MapboxDirectionsTests/WaypointTests.swift | 1 + 18 files changed, 114 insertions(+), 117 deletions(-) delete mode 100644 Tests/MapboxDirectionsTests/Fixtures/v4/v4_driving_dc_geojson.json delete mode 100644 Tests/MapboxDirectionsTests/Fixtures/v4/v4_driving_dc_polyline.json diff --git a/MapboxDirections.xcodeproj/project.pbxproj b/MapboxDirections.xcodeproj/project.pbxproj index cb660497f..5a7d6adfa 100644 --- a/MapboxDirections.xcodeproj/project.pbxproj +++ b/MapboxDirections.xcodeproj/project.pbxproj @@ -229,12 +229,6 @@ DA737EE41D05F91E005BDA16 /* v5_driving_dc_geojson.json in Resources */ = {isa = PBXBuildFile; fileRef = DA737EE31D05F91E005BDA16 /* v5_driving_dc_geojson.json */; }; DA737EE51D05F91E005BDA16 /* v5_driving_dc_geojson.json in Resources */ = {isa = PBXBuildFile; fileRef = DA737EE31D05F91E005BDA16 /* v5_driving_dc_geojson.json */; }; DA737EE61D05F91E005BDA16 /* v5_driving_dc_geojson.json in Resources */ = {isa = PBXBuildFile; fileRef = DA737EE31D05F91E005BDA16 /* v5_driving_dc_geojson.json */; }; - DA737EEE1D06175B005BDA16 /* v4_driving_dc_geojson.json in Resources */ = {isa = PBXBuildFile; fileRef = DA737EED1D06175B005BDA16 /* v4_driving_dc_geojson.json */; }; - DA737EEF1D06175B005BDA16 /* v4_driving_dc_geojson.json in Resources */ = {isa = PBXBuildFile; fileRef = DA737EED1D06175B005BDA16 /* v4_driving_dc_geojson.json */; }; - DA737EF01D06175B005BDA16 /* v4_driving_dc_geojson.json in Resources */ = {isa = PBXBuildFile; fileRef = DA737EED1D06175B005BDA16 /* v4_driving_dc_geojson.json */; }; - DA737EF21D061AA2005BDA16 /* v4_driving_dc_polyline.json in Resources */ = {isa = PBXBuildFile; fileRef = DA737EF11D061AA2005BDA16 /* v4_driving_dc_polyline.json */; }; - DA737EF31D061AA2005BDA16 /* v4_driving_dc_polyline.json in Resources */ = {isa = PBXBuildFile; fileRef = DA737EF11D061AA2005BDA16 /* v4_driving_dc_polyline.json */; }; - DA737EF41D061AA2005BDA16 /* v4_driving_dc_polyline.json in Resources */ = {isa = PBXBuildFile; fileRef = DA737EF11D061AA2005BDA16 /* v4_driving_dc_polyline.json */; }; DA9E1B131E5A675F0081EDC7 /* Polyline.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DA9E1B121E5A675F0081EDC7 /* Polyline.framework */; }; DAA76D681DD127CB0015EC78 /* MBLaneIndication.swift in Sources */ = {isa = PBXBuildFile; fileRef = DAA76D671DD127CB0015EC78 /* MBLaneIndication.swift */; }; DAA76D691DD127CB0015EC78 /* MBLaneIndication.swift in Sources */ = {isa = PBXBuildFile; fileRef = DAA76D671DD127CB0015EC78 /* MBLaneIndication.swift */; }; @@ -394,8 +388,6 @@ DA6C9DAB1CAEC72800094FBC /* V5Tests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = V5Tests.swift; sourceTree = ""; }; DA6C9DB11CAECA0E00094FBC /* Fixture.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Fixture.swift; sourceTree = ""; }; DA737EE31D05F91E005BDA16 /* v5_driving_dc_geojson.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = v5_driving_dc_geojson.json; sourceTree = ""; }; - DA737EED1D06175B005BDA16 /* v4_driving_dc_geojson.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = v4_driving_dc_geojson.json; sourceTree = ""; }; - DA737EF11D061AA2005BDA16 /* v4_driving_dc_polyline.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = v4_driving_dc_polyline.json; sourceTree = ""; }; DA9E1B121E5A675F0081EDC7 /* Polyline.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Polyline.framework; path = Carthage/Build/watchOS/Polyline.framework; sourceTree = ""; }; DAA76D671DD127CB0015EC78 /* MBLaneIndication.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MBLaneIndication.swift; sourceTree = ""; }; DAC05F151CFBFAC400FA0071 /* MBWaypoint.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MBWaypoint.swift; sourceTree = ""; }; @@ -669,7 +661,6 @@ 8D381B5F1FD9F592008D5A58 /* Responses */, C5D1D7EE1F6AF8FA00A1C4F1 /* Instructions */, C5247D721E818A8D004B6154 /* annotation */, - DA737EEC1D061514005BDA16 /* V4 */, DA737EEB1D0614FA005BDA16 /* V5 */, ); path = Fixtures; @@ -686,16 +677,6 @@ path = v5; sourceTree = ""; }; - DA737EEC1D061514005BDA16 /* V4 */ = { - isa = PBXGroup; - children = ( - DA737EED1D06175B005BDA16 /* v4_driving_dc_geojson.json */, - DA737EF11D061AA2005BDA16 /* v4_driving_dc_polyline.json */, - ); - name = V4; - path = v4; - sourceTree = ""; - }; DA9E1B111E5A675F0081EDC7 /* watchOS Frameworks */ = { isa = PBXGroup; children = ( @@ -1050,7 +1031,6 @@ isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( - DA737EF31D061AA2005BDA16 /* v4_driving_dc_polyline.json in Resources */, DA737EE51D05F91E005BDA16 /* v5_driving_dc_geojson.json in Resources */, DA1A10CF1D00F975009F82FA /* v5_driving_dc_polyline.json in Resources */, C5C0D63520586419003A3B1D /* null-tracepoint.json in Resources */, @@ -1063,7 +1043,6 @@ AEAB391220D9469A008F4E54 /* subVisualInstructions.json in Resources */, DACCFCAA2225359600110FC9 /* v5_driving_oldenburg_polyline.json in Resources */, C5DAACB5201AA9A7001F9261 /* match.json in Resources */, - DA737EEF1D06175B005BDA16 /* v4_driving_dc_geojson.json in Resources */, C53A022B1E92C281009837BD /* annotation.json in Resources */, ); runOnlyForDeploymentPostprocessing = 0; @@ -1079,7 +1058,6 @@ isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( - DA737EF41D061AA2005BDA16 /* v4_driving_dc_polyline.json in Resources */, DA737EE61D05F91E005BDA16 /* v5_driving_dc_geojson.json in Resources */, DA1A10F31D010251009F82FA /* v5_driving_dc_polyline.json in Resources */, C5C0D6362058641B003A3B1D /* null-tracepoint.json in Resources */, @@ -1092,7 +1070,6 @@ AEAB391320D9469A008F4E54 /* subVisualInstructions.json in Resources */, DACCFCAB2225359600110FC9 /* v5_driving_oldenburg_polyline.json in Resources */, C5DAACB6201AA9A7001F9261 /* match.json in Resources */, - DA737EF01D06175B005BDA16 /* v4_driving_dc_geojson.json in Resources */, C53A022C1E92C281009837BD /* annotation.json in Resources */, ); runOnlyForDeploymentPostprocessing = 0; @@ -1115,14 +1092,12 @@ isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( - DA737EF21D061AA2005BDA16 /* v4_driving_dc_polyline.json in Resources */, DA737EE41D05F91E005BDA16 /* v5_driving_dc_geojson.json in Resources */, DAC05F1C1CFC1E5300FA0071 /* v5_driving_dc_polyline.json in Resources */, C5C0D6342058523E003A3B1D /* null-tracepoint.json in Resources */, AEAB390D20D7F4F4008F4E54 /* subLaneInstructions.json in Resources */, C5D1D7F01F6AF91700A1C4F1 /* instructions.json in Resources */, 8D381B611FD9F5B1008D5A58 /* noDestinationName.json in Resources */, - DA737EEE1D06175B005BDA16 /* v4_driving_dc_geojson.json in Resources */, 35DBF019217F38A30009D2AE /* versions.json in Resources */, 35D92FF0218203AB000C78CB /* 2018-10-16-Liechtenstein.tar in Resources */, AEAB391120D9469A008F4E54 /* subVisualInstructions.json in Resources */, @@ -1172,13 +1147,14 @@ inputPaths = ( "$(SRCROOT)/Carthage/Build/iOS/Mapbox.framework", "$(SRCROOT)/Carthage/Build/iOS/Polyline.framework", + "$(SRCROOT)/Carthage/Build/iOS/Turf.framework", ); name = "Copy Frameworks"; outputPaths = ( ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "/usr/local/bin/carthage copy-frameworks"; + shellScript = "/usr/local/bin/carthage copy-frameworks\n"; }; /* End PBXShellScriptBuildPhase section */ diff --git a/MapboxDirections.xcodeproj/xcshareddata/xcschemes/Example.xcscheme b/MapboxDirections.xcodeproj/xcshareddata/xcschemes/Example.xcscheme index 61dbcd49f..cbf1867a5 100644 --- a/MapboxDirections.xcodeproj/xcshareddata/xcschemes/Example.xcscheme +++ b/MapboxDirections.xcodeproj/xcshareddata/xcschemes/Example.xcscheme @@ -46,11 +46,6 @@ BlueprintName = "MapboxDirectionsTests" ReferencedContainer = "container:MapboxDirections.xcodeproj"> - - - - diff --git a/MapboxDirections.xcodeproj/xcshareddata/xcschemes/MapboxDirections iOS.xcscheme b/MapboxDirections.xcodeproj/xcshareddata/xcschemes/MapboxDirections iOS.xcscheme index 13d6153f5..e0d0cf3f0 100644 --- a/MapboxDirections.xcodeproj/xcshareddata/xcschemes/MapboxDirections iOS.xcscheme +++ b/MapboxDirections.xcodeproj/xcshareddata/xcschemes/MapboxDirections iOS.xcscheme @@ -26,8 +26,17 @@ buildConfiguration = "Debug" selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB" selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB" - codeCoverageEnabled = "YES" - shouldUseLaunchSchemeArgsEnv = "YES"> + shouldUseLaunchSchemeArgsEnv = "YES" + codeCoverageEnabled = "YES"> + + + + @@ -40,17 +49,6 @@ - - - - - - - - −5 precision. diff --git a/Sources/MapboxDirections/MBIntersection.swift b/Sources/MapboxDirections/MBIntersection.swift index 22c14531a..9ab93c9d9 100644 --- a/Sources/MapboxDirections/MBIntersection.swift +++ b/Sources/MapboxDirections/MBIntersection.swift @@ -63,8 +63,8 @@ public struct Intersection: Codable { case approachIndex = "in" case outletIndex = "out" case lanes - case approachLanes - case usableApproachLanes +// case approachLanes +// case usableApproachLanes case outletRoadClasses = "classes" } @@ -94,10 +94,15 @@ public struct Intersection: Codable { try container.encode(approachIndex, forKey: .approachIndex) try container.encode(outletIndex, forKey: .outletIndex) - try container.encode(outletIndexes, forKey: .outletIndexes) + var outletArray: [Bool] = Array.init(repeating: false, count: (outletIndexes.max()! + 1)) + + for index in outletIndexes { + outletArray[index] = true + } - try container.encode(approachLanes, forKey: .approachLanes) - try container.encode(usableApproachLanes, forKey: .usableApproachLanes) + try container.encode(outletArray, forKey: .outletIndexes) + + try container.encode(approachLanes, forKey: .lanes) if let classes = outletRoadClasses?.description.components(separatedBy: ",") { try container.encode(classes, forKey: .outletRoadClasses) @@ -125,12 +130,11 @@ public struct Intersection: Codable { outletRoadClasses = try container.decodeIfPresent(RoadClasses.self, forKey: .outletRoadClasses) - if let outletIndexes = try? container.decode(IndexSet.self, forKey: .outletIndexes) { - self.outletIndexes = outletIndexes - } else { - let outletsArray = try container.decode([Bool].self, forKey: .outletIndexes) - outletIndexes = IndexSet(outletsArray.enumerated().filter { $1 }.map { $0.offset }) - } + let outletsArray = try container.decode([Bool].self, forKey: .outletIndexes) + let filtered = outletsArray.enumerated().filter { $1 } + let mapped = filtered.map { $0.offset } + outletIndexes = + IndexSet(mapped) outletIndex = try container.decodeIfPresent(Int.self, forKey: .outletIndex) ?? -1 approachIndex = try container.decodeIfPresent(Int.self, forKey: .approachIndex) ?? -1 diff --git a/Sources/MapboxDirections/MBLane.swift b/Sources/MapboxDirections/MBLane.swift index b61bdf88b..bce833f31 100644 --- a/Sources/MapboxDirections/MBLane.swift +++ b/Sources/MapboxDirections/MBLane.swift @@ -29,8 +29,7 @@ public struct Lane: Codable { public init(from decoder: Decoder) throws { let container = try decoder.container(keyedBy: CodingKeys.self) - let descriptions = try container.decode([String].self, forKey: .indications) - indications = LaneIndication(descriptions: descriptions)! + indications = try container.decode(LaneIndication.self, forKey: .indications) isValid = try container.decode(Bool.self, forKey: .valid) } } diff --git a/Sources/MapboxDirections/MBLaneIndication.swift b/Sources/MapboxDirections/MBLaneIndication.swift index 8042124f3..f9ac72ffa 100644 --- a/Sources/MapboxDirections/MBLaneIndication.swift +++ b/Sources/MapboxDirections/MBLaneIndication.swift @@ -68,9 +68,9 @@ public struct LaneIndication: OptionSet, CustomStringConvertible, Codable { self.init(rawValue: laneIndication.rawValue) } - public var description: String { + public var descriptions: [String] { if isEmpty { - return "none" + return [] } var descriptions: [String] = [] @@ -98,6 +98,29 @@ public struct LaneIndication: OptionSet, CustomStringConvertible, Codable { if contains(.uTurn) { descriptions.append("uturn") } + return descriptions + } + + public var description: String { return descriptions.joined(separator: ",") } + + public init(from decoder: Decoder) throws { + let container = try decoder.singleValueContainer() + let stringValues = try container.decode([String].self) + + self = try LaneIndication.indications(from: stringValues, container: container) + } + + public func encode(to encoder: Encoder) throws { + var container = encoder.singleValueContainer() + try container.encode(descriptions) + } + + static func indications(from strings: [String], container: SingleValueDecodingContainer) throws -> LaneIndication { + guard let indications = self.init(descriptions: strings) else { + throw DecodingError.dataCorruptedError(in: container, debugDescription: "Unable to initialize lane indications from decoded string. This should not happen.") + } + return indications + } } diff --git a/Sources/MapboxDirections/MBRouteStep.swift b/Sources/MapboxDirections/MBRouteStep.swift index 8d6a91c4d..f0b6694c5 100644 --- a/Sources/MapboxDirections/MBRouteStep.swift +++ b/Sources/MapboxDirections/MBRouteStep.swift @@ -378,23 +378,26 @@ open class RouteStep: NSObject, Codable { public func encode(to encoder: Encoder) throws { var container = encoder.container(keyedBy: CodingKeys.self) - try container.encode(instructionsSpokenAlongStep, forKey: .instructionsSpokenAlongStep) - try container.encode(instructionsDisplayedAlongStep, forKey: .instructionsDisplayedAlongStep) - try container.encode(exitIndex, forKey: .exitIndex) - try container.encode(exitCodes, forKey: .exitCodes) - try container.encode(exitNames, forKey: .exitNames) - try container.encode(phoneticExitNames, forKey: .phoneticExitNames) - try container.encode(phoneticNames, forKey: .phoneticNames) - try container.encode(distance, forKey: .distance) - try container.encode(expectedTravelTime, forKey: .expectedTravelTime) - try container.encode(codes, forKey: .codes) - try container.encode(transportType, forKey: .transportType) - try container.encode(destinationCodes, forKey: .destinationCodes) - try container.encode(destinations, forKey: .destinations) - try container.encode(intersections, forKey: .intersections) + try container.encodeIfPresent(instructionsSpokenAlongStep, forKey: .instructionsSpokenAlongStep) + try container.encodeIfPresent(instructionsDisplayedAlongStep, forKey: .instructionsDisplayedAlongStep) + try container.encodeIfPresent(exitIndex, forKey: .exitIndex) + try container.encodeIfPresent(exitCodes, forKey: .exitCodes) + try container.encodeIfPresent(exitNames, forKey: .exitNames) + try container.encodeIfPresent(phoneticExitNames, forKey: .phoneticExitNames) + try container.encodeIfPresent(phoneticNames, forKey: .phoneticNames) + try container.encode(distance.rounded(to: 1e1), forKey: .distance) + try container.encode(expectedTravelTime.rounded(to: 1e1), forKey: .expectedTravelTime) + try container.encodeIfPresent(codes, forKey: .codes) + + if transportType != .none { + try container.encode(transportType, forKey: .transportType) + } + try container.encodeIfPresent(destinationCodes, forKey: .destinationCodes) + try container.encodeIfPresent(destinations, forKey: .destinations) + try container.encodeIfPresent(intersections, forKey: .intersections) try container.encode(drivingSide, forKey: .drivingSide) try container.encode(name, forKey: .name) - try container.encode(geometry, forKey: .geometry) + try container.encodeIfPresent(geometry, forKey: .geometry) var maneuver = container.nestedContainer(keyedBy: ManeuverCodingKeys.self, forKey: .maneuver) try maneuver.encode(instructions, forKey: .instruction) @@ -448,10 +451,18 @@ open class RouteStep: NSObject, Codable { instructions = "" } drivingSide = try container.decode(DrivingSide.self, forKey: .drivingSide) - (decoder as? JSONDecoder)?.userInfo[.drivingSide] = drivingSide + instructionsSpokenAlongStep = try container.decodeIfPresent([SpokenInstruction].self, forKey: .instructionsSpokenAlongStep) - instructionsDisplayedAlongStep = try container.decodeIfPresent([VisualInstructionBanner].self, forKey: .instructionsDisplayedAlongStep) + + if let visuals = try container.decodeIfPresent([VisualInstructionBanner].self, forKey: .instructionsDisplayedAlongStep) { + for instruction in visuals { + instruction.drivingSide = drivingSide + } + instructionsDisplayedAlongStep = visuals + } else { + instructionsDisplayedAlongStep = nil + } exitIndex = try container.decodeIfPresent(Int.self, forKey: .exitIndex) exitCodes = try container.decodeIfPresent([String].self, forKey: .exitCodes) diff --git a/Sources/MapboxDirections/MBVisualInstruction.swift b/Sources/MapboxDirections/MBVisualInstruction.swift index a778c0c52..4e3225bb7 100644 --- a/Sources/MapboxDirections/MBVisualInstruction.swift +++ b/Sources/MapboxDirections/MBVisualInstruction.swift @@ -11,18 +11,19 @@ open class VisualInstruction: Codable { /** A plain text representation of the instruction. + - Note: This is optional despite the API Documentation because it is commonplace for the SDK to return an empty string, which we consder to be equivelent to `null` */ public let text: String? /** The type of maneuver required for beginning the step described by the visual instruction. */ - public var maneuverType: ManeuverType + public var maneuverType: ManeuverType? /** Additional directional information to clarify the maneuver type. */ - public dynamic var maneuverDirection: ManeuverDirection + public dynamic var maneuverDirection: ManeuverDirection? /** A structured representation of the instruction. @@ -61,8 +62,8 @@ open class VisualInstruction: Codable { public func encode(to encoder: Encoder) throws { var container = encoder.container(keyedBy: CodingKeys.self) try container.encodeIfPresent(text, forKey: .text) - try container.encode(maneuverType, forKey: .maneuverType) - try container.encode(maneuverDirection, forKey: .maneuverDirection) + try container.encodeIfPresent(maneuverType, forKey: .maneuverType) + try container.encodeIfPresent(maneuverDirection, forKey: .maneuverDirection) let wrappedComponents = components.map(Component.init(component:)) try container.encode(wrappedComponents, forKey: .components) @@ -73,8 +74,8 @@ open class VisualInstruction: Codable { public required init(from decoder: Decoder) throws { let container = try decoder.container(keyedBy: CodingKeys.self) text = try container.decodeIfPresent(String.self, forKey: .text) - maneuverType = try container.decode(ManeuverType.self, forKey: .maneuverType) - maneuverDirection = try container.decode(ManeuverDirection.self, forKey: .maneuverDirection) + maneuverType = try container.decodeIfPresent(ManeuverType.self, forKey: .maneuverType) + maneuverDirection = try container.decodeIfPresent(ManeuverDirection.self, forKey: .maneuverDirection) let componentsWrapped = try container.decode([Component].self, forKey: .components) components = componentsWrapped.map { $0.component } diff --git a/Sources/MapboxDirections/MBVisualInstructionBanner.swift b/Sources/MapboxDirections/MBVisualInstructionBanner.swift index d8e575d47..7f6459aee 100644 --- a/Sources/MapboxDirections/MBVisualInstructionBanner.swift +++ b/Sources/MapboxDirections/MBVisualInstructionBanner.swift @@ -38,11 +38,6 @@ open class VisualInstructionBanner: Codable { tertiaryInstruction = try container.decodeIfPresent(VisualInstruction.self, forKey: .tertiaryInstruction) if let directlyEncoded = try container.decodeIfPresent(DrivingSide.self, forKey: .drivingSide) { drivingSide = directlyEncoded - } else if let drivingSide = decoder.userInfo[.drivingSide] as? DrivingSide { - self.drivingSide = drivingSide - } else { - #warning("make real error") - throw NSError(domain: "directions", code: 500, userInfo: [NSLocalizedDescriptionKey: "Did not supply driving side."]) } } @@ -73,7 +68,7 @@ open class VisualInstructionBanner: Codable { /** Which side of a bidirectional road the driver should drive on, also known as the rule of the road. */ - public var drivingSide: DrivingSide + public var drivingSide: DrivingSide! // /** // Initializes a new visual instruction banner object based on the given JSON dictionary representation and a driving side. diff --git a/Tests/MapboxDirectionsTests/Fixtures/v4/v4_driving_dc_geojson.json b/Tests/MapboxDirectionsTests/Fixtures/v4/v4_driving_dc_geojson.json deleted file mode 100644 index df9c084de..000000000 --- a/Tests/MapboxDirectionsTests/Fixtures/v4/v4_driving_dc_geojson.json +++ /dev/null @@ -1 +0,0 @@ -{"origin":{"type":"Feature","geometry":{"type":"Point","coordinates":[-122.420018,37.78009]},"properties":{"name":"McAllister Street"}},"destination":{"type":"Feature","geometry":{"type":"Point","coordinates":[-77.030075,38.910067]},"properties":{"name":"Logan Circle Northwest"}},"waypoints":[],"routes":[{"distance":4524571,"duration":162310,"steps":[{"distance":418,"duration":52,"way_name":"McAllister Street","mode":"driving","driving_side":"right","direction":"E","heading":80,"maneuver":{"instruction":"Proceed to McAllister Street, then go right","type":"depart","location":{"type":"Point","coordinates":[-122.420018,37.78009]}}},{"distance":232,"duration":20,"way_name":"Hyde Street","mode":"driving","driving_side":"right","direction":"S","heading":171,"maneuver":{"instruction":"Turn right onto Hyde Street","type":"turn right","location":{"type":"Point","coordinates":[-122.415339,37.780726]}}},{"distance":971,"duration":96,"way_name":"8th Street","mode":"driving","driving_side":"right","direction":"SE","heading":135,"maneuver":{"instruction":"Go straight onto 8th Street, Hyde Street becomes 8th Street","type":"continue","location":{"type":"Point","coordinates":[-122.414763,37.77872]}}},{"distance":38,"duration":8,"way_name":"Bryant Street","mode":"driving","driving_side":"right","direction":"NE","heading":45,"maneuver":{"instruction":"Turn left onto Bryant Street","type":"turn left","location":{"type":"Point","coordinates":[-122.406967,37.77254]}}},{"distance":469,"duration":36,"way_name":"","mode":"driving","driving_side":"right","direction":"N","heading":3,"maneuver":{"instruction":"Take the ramp on the left","type":"turn left","location":{"type":"Point","coordinates":[-122.406665,37.77278]}}},{"distance":1525,"duration":73,"way_name":"James Lick Freeway (I 80)","mode":"driving","driving_side":"right","direction":"NE","heading":50,"maneuver":{"instruction":"Merge slightly left onto James Lick Freeway (I 80)","type":"continue","location":{"type":"Point","coordinates":[-122.404336,37.77638]}}},{"distance":10355,"duration":491,"way_name":"San Francisco – Oakland Bay Bridge (I 80)","mode":"driving","driving_side":"right","direction":"NE","heading":45,"maneuver":{"instruction":"Go straight onto San Francisco – Oakland Bay Bridge (I 80), James Lick Freeway (I 80) becomes San Francisco – Oakland Bay Bridge (I 80)","type":"continue","location":{"type":"Point","coordinates":[-122.391499,37.785488]}}},{"distance":905,"duration":40,"way_name":"I 80","mode":"driving","driving_side":"right","direction":"N","heading":14,"maneuver":{"instruction":"Keep left at the fork onto I 80","type":"bear left","location":{"type":"Point","coordinates":[-122.293906,37.828655]}}},{"distance":122,"duration":5,"way_name":"Nimitz Freeway (I 880)","mode":"driving","driving_side":"right","direction":"NW","heading":339,"maneuver":{"instruction":"Merge slightly right onto Nimitz Freeway (I 880)","type":"continue","location":{"type":"Point","coordinates":[-122.295882,37.836444]}}},{"distance":5233,"duration":209,"way_name":"Eastshore Freeway (I 80;I 580)","mode":"driving","driving_side":"right","direction":"N","heading":348,"maneuver":{"instruction":"Go straight onto Eastshore Freeway (I 80;I 580), Nimitz Freeway (I 880) becomes Eastshore Freeway (I 80;I 580)","type":"continue","location":{"type":"Point","coordinates":[-122.296273,37.83749]}}},{"distance":23353,"duration":891,"way_name":"Eastshore Freeway (I 80)","mode":"driving","driving_side":"right","direction":"N","heading":349,"maneuver":{"instruction":"Keep left at the fork onto Eastshore Freeway (I 80)","type":"bear left","location":{"type":"Point","coordinates":[-122.308377,37.883534]}}},{"distance":24877,"duration":961,"way_name":"Carquinez Bridge (I 80)","mode":"driving","driving_side":"right","direction":"NE","heading":48,"maneuver":{"instruction":"Go straight onto Carquinez Bridge (I 80), Eastshore Freeway (I 80) becomes Carquinez Bridge (I 80)","type":"continue","location":{"type":"Point","coordinates":[-122.227978,38.052197]}}},{"distance":43875,"duration":1669,"way_name":"I 80","mode":"driving","driving_side":"right","direction":"NE","heading":60,"maneuver":{"instruction":"Keep left at the fork onto I 80","type":"bear left","location":{"type":"Point","coordinates":[-122.10876,38.232639]}}},{"distance":13562,"duration":516,"way_name":"I 80","mode":"driving","driving_side":"right","direction":"NE","heading":36,"maneuver":{"instruction":"Keep left at the fork onto I 80","type":"bear left","location":{"type":"Point","coordinates":[-121.7761,38.514106]}}},{"distance":5907,"duration":225,"way_name":"Yolo Causeway (I 80)","mode":"driving","driving_side":"right","direction":"E","heading":77,"maneuver":{"instruction":"Go straight onto Yolo Causeway (I 80), I 80 becomes Yolo Causeway (I 80)","type":"continue","location":{"type":"Point","coordinates":[-121.638814,38.563325]}}},{"distance":20043,"duration":762,"way_name":"I 80","mode":"driving","driving_side":"right","direction":"E","heading":83,"maneuver":{"instruction":"Keep right at the fork onto I 80","type":"bear right","location":{"type":"Point","coordinates":[-121.572512,38.574855]}}},{"distance":281518,"duration":10477,"way_name":"I 80","mode":"driving","driving_side":"right","direction":"E","heading":79,"maneuver":{"instruction":"Keep left at the fork onto I 80","type":"bear left","location":{"type":"Point","coordinates":[-121.386011,38.644511]}}},{"distance":21993,"duration":736,"way_name":"I 80;US 95 Alternate","mode":"driving","driving_side":"right","direction":"NE","heading":32,"maneuver":{"instruction":"Go straight onto I 80;US 95 Alternate, I 80 becomes I 80;US 95 Alternate","type":"continue","location":{"type":"Point","coordinates":[-119.020752,39.79069]}}},{"distance":46675,"duration":1562,"way_name":"I 80;US 95 ALT","mode":"driving","driving_side":"right","direction":"NE","heading":51,"maneuver":{"instruction":"Go straight onto I 80;US 95 ALT, I 80;US 95 Alternate becomes I 80;US 95 ALT","type":"continue","location":{"type":"Point","coordinates":[-118.821198,39.912729]}}},{"distance":36,"duration":1,"way_name":"I-80;US-95","mode":"driving","driving_side":"right","direction":"NE","heading":69,"maneuver":{"instruction":"Go straight onto I-80;US-95, I 80;US 95 ALT becomes I-80;US-95","type":"continue","location":{"type":"Point","coordinates":[-118.448483,40.193251]}}},{"distance":286025,"duration":9575,"way_name":"I 80;US 95","mode":"driving","driving_side":"right","direction":"NE","heading":69,"maneuver":{"instruction":"Go straight onto I 80;US 95, I-80;US-95 becomes I 80;US 95","type":"continue","location":{"type":"Point","coordinates":[-118.448089,40.193369]}}},{"distance":106510,"duration":3613,"way_name":"Carlin Tunnel (I 80)","mode":"driving","driving_side":"right","direction":"SE","heading":126,"maneuver":{"instruction":"Go straight onto Carlin Tunnel (I 80), I 80;US 95 becomes Carlin Tunnel (I 80)","type":"continue","location":{"type":"Point","coordinates":[-116.016294,40.722806]}}},{"distance":471,"duration":16,"way_name":"I-80","mode":"driving","driving_side":"right","direction":"SE","heading":112,"maneuver":{"instruction":"Go straight onto I-80, Carlin Tunnel (I 80) becomes I-80","type":"continue","location":{"type":"Point","coordinates":[-114.957723,41.09939]}}},{"distance":12623,"duration":423,"way_name":"I 80;US 93 ALT","mode":"driving","driving_side":"right","direction":"E","heading":98,"maneuver":{"instruction":"Go straight onto I 80;US 93 ALT, I-80 becomes I 80;US 93 ALT","type":"continue","location":{"type":"Point","coordinates":[-114.952372,41.09815]}}},{"distance":223582,"duration":7219,"way_name":"I 80;US 93 Alternate","mode":"driving","driving_side":"right","direction":"E","heading":90,"maneuver":{"instruction":"Go straight onto I 80;US 93 Alternate, I 80;US 93 ALT becomes I 80;US 93 Alternate","type":"continue","location":{"type":"Point","coordinates":[-114.803538,41.112521]}}},{"distance":50602,"duration":1676,"way_name":"Lincoln Highway (I 80)","mode":"driving","driving_side":"right","direction":"E","heading":104,"maneuver":{"instruction":"Go straight onto Lincoln Highway (I 80), I 80;US 93 Alternate becomes Lincoln Highway (I 80)","type":"continue","location":{"type":"Point","coordinates":[-112.439875,40.683706]}}},{"distance":3326,"duration":118,"way_name":"I 15;I 80","mode":"driving","driving_side":"right","direction":"S","heading":172,"maneuver":{"instruction":"Follow a slight right onto I 15;I 80, Lincoln Highway (I 80) becomes I 15;I 80","type":"bear right","location":{"type":"Point","coordinates":[-111.911259,40.753389]}}},{"distance":8011,"duration":286,"way_name":"I 80","mode":"driving","driving_side":"right","direction":"S","heading":188,"maneuver":{"instruction":"Keep right at the fork onto I 80","type":"bear right","location":{"type":"Point","coordinates":[-111.904565,40.72516]}}},{"distance":278700,"duration":9392,"way_name":"I 80","mode":"driving","driving_side":"right","direction":"E","heading":92,"maneuver":{"instruction":"Keep left at the fork onto I 80","type":"bear left","location":{"type":"Point","coordinates":[-111.820528,40.712478]}}},{"distance":1143,"duration":38,"way_name":"","mode":"driving","driving_side":"right","direction":"NE","heading":28,"maneuver":{"instruction":"Take the ramp","type":"bear right","location":{"type":"Point","coordinates":[-109.244989,41.592662]}}},{"distance":915449,"duration":30717,"way_name":"I 80;US 30;US 191","mode":"driving","driving_side":"right","direction":"NE","heading":27,"maneuver":{"instruction":"Merge slightly left onto I 80;US 30;US 191","type":"continue","location":{"type":"Point","coordinates":[-109.239111,41.601761]}}},{"distance":204860,"duration":6891,"way_name":"I 80","mode":"driving","driving_side":"right","direction":"E","heading":90,"maneuver":{"instruction":"Keep right at the fork onto I 80","type":"bear right","location":{"type":"Point","coordinates":[-99.10717,40.670265]}}},{"distance":10025,"duration":435,"way_name":"Interstate 80 (I 80;US 77)","mode":"driving","driving_side":"right","direction":"NE","heading":37,"maneuver":{"instruction":"Go straight onto Interstate 80 (I 80;US 77), I 80 becomes Interstate 80 (I 80;US 77)","type":"continue","location":{"type":"Point","coordinates":[-96.73886,40.839694]}}},{"distance":82469,"duration":3391,"way_name":"I 80","mode":"driving","driving_side":"right","direction":"E","heading":90,"maneuver":{"instruction":"Keep left at the fork onto I 80","type":"bear left","location":{"type":"Point","coordinates":[-96.652066,40.896687]}}},{"distance":3580,"duration":155,"way_name":"I 29;I 80","mode":"driving","driving_side":"right","direction":"E","heading":92,"maneuver":{"instruction":"Go straight onto I 29;I 80, I 80 becomes I 29;I 80","type":"continue","location":{"type":"Point","coordinates":[-95.88615,41.232383]}}},{"distance":191228,"duration":6871,"way_name":"I 80","mode":"driving","driving_side":"right","direction":"SE","heading":129,"maneuver":{"instruction":"Keep left at the fork onto I 80","type":"bear left","location":{"type":"Point","coordinates":[-95.843738,41.230757]}}},{"distance":22286,"duration":958,"way_name":"I 235","mode":"driving","driving_side":"right","direction":"E","heading":90,"maneuver":{"instruction":"Go straight onto I 235, I 80 becomes I 235","type":"continue","location":{"type":"Point","coordinates":[-93.78615,41.592077]}}},{"distance":415,"duration":32,"way_name":"","mode":"driving","driving_side":"right","direction":"N","heading":5,"maneuver":{"instruction":"Take the ramp","type":"bear right","location":{"type":"Point","coordinates":[-93.575534,41.645919]}}},{"distance":531,"duration":41,"way_name":"","mode":"driving","driving_side":"right","direction":"NE","heading":36,"maneuver":{"instruction":"Keep right at the fork","type":"bear right","location":{"type":"Point","coordinates":[-93.574614,41.649552]}}},{"distance":287182,"duration":10430,"way_name":"I 80","mode":"driving","driving_side":"right","direction":"E","heading":71,"maneuver":{"instruction":"Merge slightly left onto I 80","type":"continue","location":{"type":"Point","coordinates":[-93.569992,41.652762]}}},{"distance":233343,"duration":9009,"way_name":"I 80","mode":"driving","driving_side":"right","direction":"S","heading":181,"maneuver":{"instruction":"Take the ramp","type":"bear right","location":{"type":"Point","coordinates":[-90.329859,41.439691]}}},{"distance":1021,"duration":44,"way_name":"I 80","mode":"driving","driving_side":"right","direction":"E","heading":99,"maneuver":{"instruction":"Keep left at the fork onto I 80","type":"bear left","location":{"type":"Point","coordinates":[-87.684527,41.582537]}}},{"distance":765,"duration":33,"way_name":"I 80","mode":"driving","driving_side":"right","direction":"E","heading":105,"maneuver":{"instruction":"Make a slight left onto I 80","type":"bear left","location":{"type":"Point","coordinates":[-87.673842,41.578205]}}},{"distance":8554,"duration":376,"way_name":"Tri-State Tollway (I 80;I 294)","mode":"driving","driving_side":"right","direction":"E","heading":90,"maneuver":{"instruction":"Go straight onto Tri-State Tollway (I 80;I 294), I 80 becomes Tri-State Tollway (I 80;I 294)","type":"continue","location":{"type":"Point","coordinates":[-87.664707,41.578001]}}},{"distance":3078,"duration":135,"way_name":"Kingery Expressway (I 80;I 94)","mode":"driving","driving_side":"right","direction":"E","heading":90,"maneuver":{"instruction":"Go straight onto Kingery Expressway (I 80;I 94), Tri-State Tollway (I 80;I 294) becomes Kingery Expressway (I 80;I 94)","type":"continue","location":{"type":"Point","coordinates":[-87.562252,41.577641]}}},{"distance":24549,"duration":1080,"way_name":"Borman Expressway (I 80;I 94;US 6)","mode":"driving","driving_side":"right","direction":"E","heading":107,"maneuver":{"instruction":"Go straight onto Borman Expressway (I 80;I 94;US 6), Kingery Expressway (I 80;I 94) becomes Borman Expressway (I 80;I 94;US 6)","type":"continue","location":{"type":"Point","coordinates":[-87.525357,41.576929]}}},{"distance":1406,"duration":108,"way_name":"I 80","mode":"driving","driving_side":"right","direction":"E","heading":72,"maneuver":{"instruction":"Take the ramp","type":"bear right","location":{"type":"Point","coordinates":[-87.235671,41.584378]}}},{"distance":438,"duration":34,"way_name":"I 80","mode":"driving","driving_side":"right","direction":"N","heading":352,"maneuver":{"instruction":"Keep right at the fork onto I 80","type":"bear right","location":{"type":"Point","coordinates":[-87.233563,41.590717]}}},{"distance":218288,"duration":9000,"way_name":"Indiana Toll Road (I 80;I 90)","mode":"driving","driving_side":"right","direction":"SE","heading":113,"maneuver":{"instruction":"Follow a slight right onto Indiana Toll Road (I 80;I 90), I 80 becomes Indiana Toll Road (I 80;I 90)","type":"bear right","location":{"type":"Point","coordinates":[-87.229682,41.591878]}}},{"distance":227653,"duration":8108,"way_name":"Ohio Turnpike (I 80;I 90)","mode":"driving","driving_side":"right","direction":"E","heading":79,"maneuver":{"instruction":"Go straight onto Ohio Turnpike (I 80;I 90), Indiana Toll Road (I 80;I 90) becomes Ohio Turnpike (I 80;I 90)","type":"continue","location":{"type":"Point","coordinates":[-84.805714,41.628414]}}},{"distance":14833,"duration":528,"way_name":"Ohio Turnpike (I 80)","mode":"driving","driving_side":"right","direction":"E","heading":70,"maneuver":{"instruction":"Keep left at the fork onto Ohio Turnpike (I 80)","type":"bear left","location":{"type":"Point","coordinates":[-82.180991,41.386038]}}},{"distance":144997,"duration":5198,"way_name":"Ohio Turnpike (I 80)","mode":"driving","driving_side":"right","direction":"E","heading":94,"maneuver":{"instruction":"Keep left at the fork onto Ohio Turnpike (I 80)","type":"bear left","location":{"type":"Point","coordinates":[-82.010738,41.379381]}}},{"distance":1853,"duration":74,"way_name":"Pennsylvania Turnpike (I 76)","mode":"driving","driving_side":"right","direction":"SE","heading":133,"maneuver":{"instruction":"Go straight onto Pennsylvania Turnpike (I 76), Ohio Turnpike (I 80) becomes Pennsylvania Turnpike (I 76)","type":"continue","location":{"type":"Point","coordinates":[-80.519681,40.911476]}}},{"distance":997,"duration":44,"way_name":"Pennsylvania Turnpike (I 76)","mode":"driving","driving_side":"right","direction":"E","heading":101,"maneuver":{"instruction":"Keep left at the fork onto Pennsylvania Turnpike (I 76)","type":"bear left","location":{"type":"Point","coordinates":[-80.499668,40.905097]}}},{"distance":46612,"duration":1658,"way_name":"Pennsylvania Turnpike (I 76)","mode":"driving","driving_side":"right","direction":"SE","heading":115,"maneuver":{"instruction":"Make a slight left onto Pennsylvania Turnpike (I 76)","type":"bear left","location":{"type":"Point","coordinates":[-80.48835,40.902497]}}},{"distance":147969,"duration":5277,"way_name":"Pennsylvania Turnpike (I 76)","mode":"driving","driving_side":"right","direction":"E","heading":103,"maneuver":{"instruction":"Keep right at the fork onto Pennsylvania Turnpike (I 76)","type":"bear right","location":{"type":"Point","coordinates":[-80.076682,40.655831]}}},{"distance":1855,"duration":82,"way_name":"Allegheny Mountain Tunnel (I 70;I 76)","mode":"driving","driving_side":"right","direction":"SE","heading":120,"maneuver":{"instruction":"Go straight onto Allegheny Mountain Tunnel (I 70;I 76), Pennsylvania Turnpike (I 76) becomes Allegheny Mountain Tunnel (I 70;I 76)","type":"continue","location":{"type":"Point","coordinates":[-78.867271,39.965611]}}},{"distance":60642,"duration":2233,"way_name":"Pennsylvania Turnpike (I 70;I 76)","mode":"driving","driving_side":"right","direction":"SE","heading":114,"maneuver":{"instruction":"Go straight onto Pennsylvania Turnpike (I 70;I 76), Allegheny Mountain Tunnel (I 70;I 76) becomes Pennsylvania Turnpike (I 70;I 76)","type":"continue","location":{"type":"Point","coordinates":[-78.848419,39.957285]}}},{"distance":761,"duration":41,"way_name":"I 70","mode":"driving","driving_side":"right","direction":"E","heading":84,"maneuver":{"instruction":"Take the ramp","type":"bear right","location":{"type":"Point","coordinates":[-78.261804,39.986508]}}},{"distance":576,"duration":25,"way_name":"I 70","mode":"driving","driving_side":"right","direction":"NE","heading":50,"maneuver":{"instruction":"Merge slightly right onto I 70","type":"continue","location":{"type":"Point","coordinates":[-78.255866,39.988425]}}},{"distance":1708,"duration":82,"way_name":"I 70","mode":"driving","driving_side":"right","direction":"E","heading":77,"maneuver":{"instruction":"Make a slight left onto I 70","type":"bear left","location":{"type":"Point","coordinates":[-78.249571,39.990138]}}},{"distance":571,"duration":40,"way_name":"I 70","mode":"driving","driving_side":"right","direction":"N","heading":6,"maneuver":{"instruction":"Keep left at the fork onto I 70","type":"bear left","location":{"type":"Point","coordinates":[-78.233371,39.99653]}}},{"distance":523,"duration":61,"way_name":"Lincoln Highway (US 30;I 70)","mode":"driving","driving_side":"right","direction":"W","heading":264,"maneuver":{"instruction":"Follow a slight right onto Lincoln Highway (US 30;I 70), I 70 becomes Lincoln Highway (US 30;I 70)","type":"bear right","location":{"type":"Point","coordinates":[-78.23275,39.999488]}}},{"distance":37502,"duration":1650,"way_name":"I 70","mode":"driving","driving_side":"right","direction":"S","heading":187,"maneuver":{"instruction":"Turn left onto I 70","type":"turn left","location":{"type":"Point","coordinates":[-78.238869,39.999467]}}},{"distance":1812,"duration":65,"way_name":"Dwight David Eisenhower Highway (I 70;US 522)","mode":"driving","driving_side":"right","direction":"SW","heading":207,"maneuver":{"instruction":"Go straight onto Dwight David Eisenhower Highway (I 70;US 522), I 70 becomes Dwight David Eisenhower Highway (I 70;US 522)","type":"continue","location":{"type":"Point","coordinates":[-78.184936,39.722424]}}},{"distance":82842,"duration":2957,"way_name":"Dwight D Eisenhower Highway (I 70;US 40)","mode":"driving","driving_side":"right","direction":"SE","heading":127,"maneuver":{"instruction":"Go straight onto Dwight D Eisenhower Highway (I 70;US 40), Dwight David Eisenhower Highway (I 70;US 522) becomes Dwight D Eisenhower Highway (I 70;US 40)","type":"continue","location":{"type":"Point","coordinates":[-78.184129,39.707742]}}},{"distance":804,"duration":36,"way_name":"I 70 Exit 53","mode":"driving","driving_side":"right","direction":"E","heading":96,"maneuver":{"instruction":"Take the ramp","type":"bear right","location":{"type":"Point","coordinates":[-77.428929,39.397932]}}},{"distance":36807,"duration":1509,"way_name":"Eisenhower Memorial Highway (I 270)","mode":"driving","driving_side":"right","direction":"SE","heading":145,"maneuver":{"instruction":"Go straight onto Eisenhower Memorial Highway (I 270), I 70 Exit 53 becomes Eisenhower Memorial Highway (I 270)","type":"continue","location":{"type":"Point","coordinates":[-77.421203,39.394571]}}},{"distance":9312,"duration":410,"way_name":"I 270","mode":"driving","driving_side":"right","direction":"SE","heading":146,"maneuver":{"instruction":"Keep left at the fork onto I 270","type":"bear left","location":{"type":"Point","coordinates":[-77.198084,39.120844]}}},{"distance":5794,"duration":255,"way_name":"I 270","mode":"driving","driving_side":"right","direction":"SE","heading":158,"maneuver":{"instruction":"Make a slight left onto I 270","type":"bear left","location":{"type":"Point","coordinates":[-77.150686,39.047289]}}},{"distance":2342,"duration":103,"way_name":"Capital Beltway (I 495)","mode":"driving","driving_side":"right","direction":"SE","heading":126,"maneuver":{"instruction":"Merge slightly right onto Capital Beltway (I 495)","type":"continue","location":{"type":"Point","coordinates":[-77.103196,39.017793]}}},{"distance":287,"duration":22,"way_name":"","mode":"driving","driving_side":"right","direction":"SE","heading":111,"maneuver":{"instruction":"Take the ramp","type":"bear right","location":{"type":"Point","coordinates":[-77.082475,39.005251]}}},{"distance":212,"duration":17,"way_name":"","mode":"driving","driving_side":"right","direction":"SE","heading":133,"maneuver":{"instruction":"Keep right at the fork","type":"bear right","location":{"type":"Point","coordinates":[-77.079319,39.004535]}}},{"distance":3942,"duration":277,"way_name":"Connecticut Avenue (MD 185)","mode":"driving","driving_side":"right","direction":"S","heading":173,"maneuver":{"instruction":"Merge slightly left onto Connecticut Avenue (MD 185)","type":"continue","location":{"type":"Point","coordinates":[-77.077499,39.003374]}}},{"distance":6856,"duration":459,"way_name":"Connecticut Avenue Northwest","mode":"driving","driving_side":"right","direction":"SW","heading":238,"maneuver":{"instruction":"Enter Chevy Chase Circle and take the fourth exit onto Connecticut Avenue Northwest","type":"enter roundabout","location":{"type":"Point","coordinates":[-77.07738,38.967996]}}},{"distance":255,"duration":26,"way_name":"","mode":"driving","driving_side":"right","direction":"S","heading":164,"maneuver":{"instruction":"Make a slight right","type":"bear right","location":{"type":"Point","coordinates":[-77.045155,38.912429]}}},{"distance":26,"duration":6,"way_name":"","mode":"driving","driving_side":"right","direction":"SE","heading":157,"maneuver":{"instruction":"Keep right at the fork","type":"bear right","location":{"type":"Point","coordinates":[-77.043993,38.910322]}}},{"distance":1332,"duration":116,"way_name":"P Street Northwest","mode":"driving","driving_side":"right","direction":"SW","heading":225,"maneuver":{"instruction":"Enter Dupont Circle Northwest and take the sixth exit onto P Street Northwest","type":"enter roundabout","location":{"type":"Point","coordinates":[-77.043975,38.9101]}}},{"distance":331,"duration":25,"way_name":"Logan Circle Northwest","mode":"driving","driving_side":"right","direction":"S","heading":172,"maneuver":{"instruction":"Enter Logan Circle Northwest and exit onto Logan Circle Northwest","type":"enter roundabout","location":{"type":"Point","coordinates":[-77.03033,38.909607]}}},{"distance":0,"duration":0,"way_name":"Logan Circle Northwest","mode":"driving","driving_side":"right","direction":"N","heading":0,"maneuver":{"instruction":"You have arrived at your destination, on the left","type":"arrive","location":{"type":"Point","coordinates":[-77.03007,38.910072]}}}],"geometry":{"type":"LineString","coordinates":[[-122.42002,37.78009],[-122.41982,37.78012],[-122.41953,37.78015],[-122.41901,37.78022],[-122.41875,37.78025],[-122.41861,37.78027],[-122.41848,37.78029],[-122.41808,37.78034],[-122.41756,37.78041],[-122.41736,37.78043],[-122.41712,37.78046],[-122.41707,37.78047],[-122.41699,37.7805],[-122.41692,37.78052],[-122.41687,37.78053],[-122.41616,37.78062],[-122.41598,37.78064],[-122.41534,37.78073],[-122.41518,37.77996],[-122.41515,37.7798],[-122.41512,37.77964],[-122.41499,37.779],[-122.41492,37.77887],[-122.4149,37.77885],[-122.41483,37.77878],[-122.41476,37.77872],[-122.41471,37.77868],[-122.41442,37.77845],[-122.41416,37.77824],[-122.41339,37.77763],[-122.41317,37.77745],[-122.41263,37.77702],[-122.41217,37.77665],[-122.41187,37.77642],[-122.41162,37.77621],[-122.41108,37.77579],[-122.41062,37.77542],[-122.41008,37.77499],[-122.40953,37.77455],[-122.40909,37.7742],[-122.40854,37.77376],[-122.40845,37.77369],[-122.40777,37.77315],[-122.40725,37.77273],[-122.40697,37.77254],[-122.40667,37.77278],[-122.40664,37.77311],[-122.40664,37.77337],[-122.40663,37.77356],[-122.40661,37.77372],[-122.40657,37.77389],[-122.40652,37.77407],[-122.40644,37.77424],[-122.40636,37.77441],[-122.40624,37.77459],[-122.40613,37.77476],[-122.40601,37.77492],[-122.40588,37.77507],[-122.40575,37.77522],[-122.40561,37.77536],[-122.40544,37.77552],[-122.40525,37.7757],[-122.40508,37.77585],[-122.40491,37.77599],[-122.40474,37.77611],[-122.40434,37.77638],[-122.40411,37.77653],[-122.40391,37.77665],[-122.40367,37.77678],[-122.40161,37.77784],[-122.40138,37.77796],[-122.40115,37.7781],[-122.40092,37.77825],[-122.40066,37.77842],[-122.40042,37.77859],[-122.40016,37.77879],[-122.39993,37.77899],[-122.39967,37.77921],[-122.39933,37.7795],[-122.3981,37.78054],[-122.39665,37.78178],[-122.39593,37.7824],[-122.39545,37.7828],[-122.39497,37.78321],[-122.39418,37.78383],[-122.39349,37.78437],[-122.3933,37.7845],[-122.39283,37.78481],[-122.39214,37.78517],[-122.3915,37.78549],[-122.39094,37.78592],[-122.39037,37.78641],[-122.36744,37.80781],[-122.36721,37.80812],[-122.36675,37.80856],[-122.36504,37.81018],[-122.36436,37.81078],[-122.36343,37.81159],[-122.36294,37.81206],[-122.36238,37.81256],[-122.36173,37.81305],[-122.36122,37.81341],[-122.36085,37.81366],[-122.36057,37.81385],[-122.36028,37.81402],[-122.35481,37.81714],[-122.35456,37.81728],[-122.3543,37.81742],[-122.35405,37.81755],[-122.35379,37.81767],[-122.35354,37.81778],[-122.3533,37.81788],[-122.35304,37.81799],[-122.35276,37.8181],[-122.35251,37.81819],[-122.35226,37.81828],[-122.35199,37.81836],[-122.35169,37.81844],[-122.35138,37.81853],[-122.35106,37.81861],[-122.35071,37.81868],[-122.35036,37.81874],[-122.35002,37.8188],[-122.33359,37.82117],[-122.33288,37.82127],[-122.3322,37.82136],[-122.3314,37.82145],[-122.33075,37.82153],[-122.33005,37.8216],[-122.32773,37.82183],[-122.32492,37.82206],[-122.32351,37.82218],[-122.32304,37.82223],[-122.32222,37.82234],[-122.32056,37.82263],[-122.31861,37.82297],[-122.31593,37.82344],[-122.31434,37.82372],[-122.31366,37.82384],[-122.312,37.82412],[-122.31138,37.82423],[-122.31065,37.82434],[-122.30992,37.82443],[-122.3079,37.82464],[-122.30728,37.8247],[-122.30665,37.82478],[-122.30607,37.82488],[-122.30564,37.82496],[-122.30335,37.82548],[-122.30265,37.82563],[-122.30068,37.82607],[-122.29879,37.82649],[-122.29779,37.82671],[-122.29602,37.82713],[-122.29564,37.82723],[-122.2953,37.82738],[-122.29499,37.82754],[-122.29473,37.82773],[-122.29445,37.82795],[-122.2942,37.82822],[-122.294,37.82849],[-122.29391,37.82866],[-122.29373,37.82925],[-122.29365,37.82956],[-122.2936,37.82993],[-122.29359,37.83031],[-122.2936,37.83127],[-122.29365,37.83161],[-122.29373,37.832],[-122.29386,37.83239],[-122.29401,37.83277],[-122.29423,37.83317],[-122.29476,37.83413],[-122.29534,37.83525],[-122.29556,37.83572],[-122.29588,37.83644],[-122.29607,37.83682],[-122.29627,37.83749],[-122.29645,37.83812],[-122.29653,37.83858],[-122.29686,37.84036],[-122.29704,37.84129],[-122.29718,37.84202],[-122.29742,37.84307],[-122.29778,37.84468],[-122.29784,37.84497],[-122.2979,37.84523],[-122.29809,37.84602],[-122.2984,37.84739],[-122.29873,37.84876],[-122.29906,37.85017],[-122.2994,37.85161],[-122.29956,37.85217],[-122.30038,37.8552],[-122.30204,37.8611],[-122.30277,37.86383],[-122.3029,37.86428],[-122.30373,37.86708],[-122.30473,37.87034],[-122.30512,37.87167],[-122.30584,37.87393],[-122.30677,37.87684],[-122.30703,37.87771],[-122.30729,37.87869],[-122.30767,37.88039],[-122.3078,37.88101],[-122.30797,37.88184],[-122.30824,37.88296],[-122.30828,37.88313],[-122.30838,37.88353],[-122.30869,37.88483],[-122.3089,37.88592],[-122.30898,37.88639],[-122.30902,37.88674],[-122.30902,37.88717],[-122.309,37.88763],[-122.30889,37.88822],[-122.30876,37.88862],[-122.30858,37.88909],[-122.30834,37.88956],[-122.30799,37.89015],[-122.30769,37.89081],[-122.30753,37.89119],[-122.30742,37.89165],[-122.30736,37.892],[-122.3073,37.89273],[-122.30735,37.89316],[-122.30747,37.89371],[-122.30769,37.8943],[-122.30801,37.8951],[-122.30884,37.89712],[-122.30918,37.89798],[-122.30942,37.89861],[-122.3096,37.89902],[-122.30978,37.8994],[-122.31001,37.89984],[-122.31026,37.90026],[-122.31054,37.90069],[-122.31086,37.90117],[-122.31164,37.90231],[-122.31236,37.90336],[-122.31413,37.9059],[-122.315,37.90723],[-122.31546,37.90785],[-122.31589,37.90849],[-122.31658,37.90955],[-122.31683,37.91002],[-122.31699,37.91035],[-122.3171,37.91064],[-122.31726,37.91121],[-122.31734,37.91168],[-122.3173,37.91298],[-122.3173,37.91443],[-122.31737,37.91683],[-122.31732,37.9187],[-122.31734,37.91924],[-122.31741,37.91978],[-122.31757,37.92045],[-122.31781,37.9211],[-122.31812,37.92171],[-122.3185,37.9223],[-122.31971,37.92413],[-122.32036,37.92507],[-122.32087,37.9258],[-122.32116,37.92623],[-122.32198,37.92739],[-122.3224,37.92794],[-122.32265,37.92826],[-122.32449,37.93072],[-122.32518,37.93167],[-122.32563,37.93229],[-122.32613,37.93299],[-122.3263,37.93326],[-122.32655,37.93377],[-122.32665,37.93403],[-122.32672,37.93431],[-122.32678,37.93466],[-122.32679,37.93502],[-122.32678,37.93529],[-122.32668,37.93574],[-122.32661,37.93604],[-122.3265,37.93631],[-122.32638,37.93657],[-122.32624,37.93684],[-122.32608,37.93714],[-122.32589,37.93751],[-122.32495,37.93938],[-122.32402,37.94115],[-122.32382,37.94166],[-122.32371,37.94211],[-122.32364,37.94254],[-122.32363,37.94297],[-122.32363,37.94335],[-122.32372,37.94386],[-122.32385,37.94429],[-122.32406,37.94478],[-122.32426,37.9452],[-122.32509,37.9469],[-122.32635,37.94951],[-122.32677,37.95038],[-122.32774,37.95241],[-122.32802,37.95292],[-122.32988,37.9562],[-122.33015,37.95669],[-122.3303,37.95707],[-122.33044,37.95749],[-122.33052,37.95788],[-122.33058,37.95828],[-122.33059,37.95872],[-122.33057,37.95912],[-122.33051,37.95951],[-122.33039,37.95993],[-122.33026,37.9603],[-122.33015,37.9606],[-122.32998,37.96096],[-122.32979,37.96127],[-122.3296,37.96154],[-122.32935,37.96187],[-122.32906,37.96217],[-122.32877,37.96245],[-122.32843,37.96272],[-122.32812,37.96295],[-122.32778,37.96317],[-122.32743,37.96337],[-122.32707,37.96355],[-122.32506,37.96462],[-122.32492,37.96472],[-122.32431,37.96502],[-122.32393,37.96521],[-122.32353,37.96542],[-122.32312,37.96567],[-122.32285,37.96586],[-122.32252,37.9661],[-122.32234,37.96626],[-122.32217,37.96642],[-122.32195,37.96666],[-122.32176,37.96689],[-122.32158,37.96714],[-122.3214,37.96741],[-122.32136,37.96749],[-122.32121,37.96774],[-122.32108,37.96806],[-122.32069,37.96915],[-122.32048,37.96988],[-122.31971,37.97218],[-122.3188,37.97487],[-122.31819,37.97667],[-122.31761,37.97843],[-122.31753,37.97868],[-122.31744,37.97894],[-122.3171,37.97995],[-122.31646,37.98177],[-122.31609,37.98292],[-122.31605,37.98303],[-122.31541,37.98479],[-122.31527,37.98512],[-122.31507,37.98552],[-122.31483,37.98595],[-122.31463,37.98626],[-122.31439,37.9866],[-122.31382,37.98744],[-122.31355,37.9878],[-122.3133,37.98812],[-122.31303,37.98841],[-122.31267,37.9888],[-122.31199,37.98941],[-122.31119,37.99003],[-122.31079,37.99032],[-122.30995,37.99086],[-122.30936,37.9912],[-122.3086,37.99159],[-122.30797,37.99186],[-122.3075,37.99205],[-122.30661,37.99237],[-122.30569,37.99264],[-122.30475,37.99284],[-122.30377,37.99302],[-122.30293,37.99315],[-122.30218,37.99326],[-122.30084,37.99343],[-122.29807,37.99385],[-122.29186,37.99468],[-122.29128,37.99477],[-122.29076,37.99488],[-122.29019,37.99502],[-122.28955,37.99521],[-122.289,37.99539],[-122.28827,37.9957],[-122.28758,37.99604],[-122.2871,37.99632],[-122.28662,37.99663],[-122.28631,37.99685],[-122.28608,37.99702],[-122.28576,37.99728],[-122.28545,37.99758],[-122.28504,37.99799],[-122.28464,37.99841],[-122.28423,37.99884],[-122.28292,38.00028],[-122.27677,38.00698],[-122.27401,38.00989],[-122.27311,38.01085],[-122.27182,38.01225],[-122.27139,38.01274],[-122.26956,38.01472],[-122.26865,38.0157],[-122.26619,38.01831],[-122.26363,38.02115],[-122.26343,38.02135],[-122.2621,38.02271],[-122.25957,38.02548],[-122.25426,38.03115],[-122.24873,38.03712],[-122.24824,38.03766],[-122.24805,38.03786],[-122.24784,38.03807],[-122.24759,38.03832],[-122.24731,38.03855],[-122.24711,38.03872],[-122.24684,38.03892],[-122.24658,38.03911],[-122.2465,38.03917],[-122.24522,38.04007],[-122.24406,38.04089],[-122.24158,38.04262],[-122.2343,38.04777],[-122.23246,38.04905],[-122.22983,38.05089],[-122.22919,38.05134],[-122.22798,38.0522],[-122.22635,38.05334],[-122.22582,38.05373],[-122.22547,38.05406],[-122.2252,38.0544],[-122.22497,38.05478],[-122.22487,38.05502],[-122.22481,38.05522],[-122.22473,38.05549],[-122.22471,38.05576],[-122.22474,38.05624],[-122.22557,38.06553],[-122.22568,38.06651],[-122.22572,38.06677],[-122.2258,38.0672],[-122.22592,38.06755],[-122.22595,38.06768],[-122.22636,38.06851],[-122.22664,38.06913],[-122.2269,38.0696],[-122.22695,38.06969],[-122.22703,38.06984],[-122.22718,38.0701],[-122.22738,38.07043],[-122.22757,38.07071],[-122.22776,38.07102],[-122.2282,38.07155],[-122.2294,38.073],[-122.23047,38.07438],[-122.23127,38.07548],[-122.23146,38.07575],[-122.23166,38.07608],[-122.23194,38.07659],[-122.23205,38.07683],[-122.23226,38.07729],[-122.23241,38.07764],[-122.23254,38.07799],[-122.23266,38.07832],[-122.23278,38.07869],[-122.23288,38.07906],[-122.233,38.07958],[-122.23311,38.08019],[-122.23319,38.08075],[-122.23323,38.08136],[-122.23326,38.0819],[-122.23326,38.08242],[-122.23321,38.08297],[-122.23318,38.08334],[-122.23313,38.08375],[-122.23303,38.08433],[-122.23294,38.08475],[-122.23285,38.08512],[-122.23283,38.08523],[-122.23265,38.08586],[-122.23235,38.08664],[-122.23178,38.08793],[-122.23155,38.0885],[-122.23059,38.09076],[-122.23043,38.09121],[-122.23025,38.09176],[-122.23018,38.09203],[-122.23012,38.09231],[-122.23003,38.0928],[-122.22992,38.09362],[-122.22979,38.09455],[-122.22976,38.09476],[-122.22975,38.09495],[-122.22973,38.09518],[-122.2297,38.09587],[-122.22964,38.10024],[-122.22967,38.10076],[-122.22964,38.10288],[-122.22959,38.10367],[-122.22958,38.10517],[-122.22958,38.10565],[-122.22955,38.10706],[-122.22955,38.11057],[-122.2297,38.11258],[-122.22983,38.11427],[-122.23001,38.11644],[-122.23005,38.11694],[-122.23008,38.11737],[-122.23015,38.11835],[-122.23023,38.11929],[-122.23024,38.11943],[-122.23028,38.12024],[-122.23026,38.12103],[-122.23023,38.12141],[-122.23016,38.12181],[-122.23006,38.12238],[-122.22983,38.12315],[-122.22979,38.12325],[-122.22971,38.12349],[-122.22965,38.12363],[-122.22933,38.12434],[-122.229,38.12495],[-122.22863,38.12554],[-122.22799,38.12645],[-122.22763,38.12705],[-122.22738,38.12747],[-122.22635,38.12903],[-122.22603,38.12952],[-122.22597,38.12961],[-122.22578,38.12993],[-122.2256,38.13023],[-122.22488,38.13135],[-122.22414,38.13248],[-122.22378,38.13306],[-122.22371,38.13318],[-122.22363,38.1333],[-122.22276,38.13465],[-122.22219,38.13554],[-122.22128,38.13697],[-122.22106,38.13729],[-122.2208,38.1377],[-122.22044,38.13824],[-122.22014,38.13872],[-122.21998,38.13898],[-122.21953,38.13964],[-122.21915,38.14022],[-122.21855,38.14115],[-122.21832,38.14151],[-122.21813,38.14181],[-122.21777,38.1424],[-122.21754,38.1428],[-122.21727,38.14336],[-122.21696,38.14415],[-122.21685,38.14454],[-122.21666,38.14529],[-122.2166,38.1457],[-122.21652,38.14643],[-122.21651,38.14683],[-122.21652,38.14744],[-122.21669,38.14915],[-122.21663,38.15035],[-122.21646,38.15127],[-122.21622,38.15209],[-122.21601,38.15263],[-122.21573,38.15323],[-122.21543,38.15377],[-122.21481,38.15474],[-122.21469,38.15492],[-122.21226,38.15831],[-122.21119,38.15981],[-122.20906,38.16279],[-122.20872,38.16319],[-122.20815,38.16373],[-122.20749,38.16425],[-122.20674,38.16478],[-122.20289,38.16728],[-122.20207,38.16784],[-122.19639,38.17176],[-122.19542,38.17239],[-122.19455,38.17303],[-122.19414,38.17333],[-122.19404,38.17342],[-122.19361,38.17379],[-122.19305,38.17434],[-122.19186,38.17571],[-122.19066,38.17713],[-122.19035,38.17746],[-122.18977,38.17803],[-122.18921,38.17851],[-122.18866,38.17893],[-122.18804,38.17935],[-122.18615,38.18047],[-122.18543,38.18092],[-122.18473,38.18143],[-122.184,38.18206],[-122.18339,38.18265],[-122.18285,38.18316],[-122.18248,38.18352],[-122.18206,38.18386],[-122.1816,38.18421],[-122.1811,38.18454],[-122.18028,38.18501],[-122.17997,38.18518],[-122.17965,38.18532],[-122.1787,38.18574],[-122.1782,38.18592],[-122.17762,38.18609],[-122.17581,38.18656],[-122.17498,38.18679],[-122.17413,38.18706],[-122.17319,38.18742],[-122.17256,38.18773],[-122.17189,38.18808],[-122.17133,38.18841],[-122.17054,38.18896],[-122.16983,38.18948],[-122.16854,38.19076],[-122.16785,38.19155],[-122.16729,38.19223],[-122.16527,38.19453],[-122.16458,38.19529],[-122.16339,38.19634],[-122.16067,38.19873],[-122.15926,38.19997],[-122.15706,38.20193],[-122.15687,38.2021],[-122.15598,38.20285],[-122.15496,38.20373],[-122.15331,38.20516],[-122.15093,38.20721],[-122.14999,38.20802],[-122.14923,38.20863],[-122.14689,38.21026],[-122.14542,38.21129],[-122.14417,38.21216],[-122.14111,38.21428],[-122.1387,38.2159],[-122.13674,38.21729],[-122.13653,38.21743],[-122.13593,38.21785],[-122.1339,38.2193],[-122.13233,38.22037],[-122.13055,38.22161],[-122.12734,38.22374],[-122.12493,38.22517],[-122.12403,38.22569],[-122.1233,38.22611],[-122.1226,38.22646],[-122.12243,38.22655],[-122.12162,38.22695],[-122.12024,38.22762],[-122.11981,38.22782],[-122.11907,38.22815],[-122.11754,38.22886],[-122.11629,38.22938],[-122.11391,38.23044],[-122.11321,38.23073],[-122.11256,38.23103],[-122.1123,38.23113],[-122.11163,38.23142],[-122.11088,38.23173],[-122.10996,38.23213],[-122.10876,38.23264],[-122.10674,38.23357],[-122.09893,38.23695],[-122.09719,38.23769],[-122.09667,38.23792],[-122.09338,38.23937],[-122.09113,38.24035],[-122.08804,38.24171],[-122.08541,38.24285],[-122.08266,38.24405],[-122.08173,38.24445],[-122.07901,38.24563],[-122.07802,38.24606],[-122.07687,38.24653],[-122.07623,38.24676],[-122.07478,38.24717],[-122.07414,38.24735],[-122.07296,38.24771],[-122.0727,38.2478],[-122.07206,38.24805],[-122.07104,38.2486],[-122.0699,38.24946],[-122.06958,38.24975],[-122.06936,38.24997],[-122.06884,38.25058],[-122.06533,38.25468],[-122.06501,38.25505],[-122.06445,38.25571],[-122.06417,38.25604],[-122.05956,38.26153],[-122.05834,38.26297],[-122.05357,38.26859],[-122.05292,38.26936],[-122.05232,38.27008],[-122.05189,38.27058],[-122.0501,38.27271],[-122.04704,38.27632],[-122.04493,38.27881],[-122.04366,38.28029],[-122.0427,38.28142],[-122.0411,38.28333],[-122.04059,38.28391],[-122.04044,38.28409],[-122.03896,38.28581],[-122.03792,38.28705],[-122.03723,38.28788],[-122.03654,38.28869],[-122.03578,38.28957],[-122.03515,38.29034],[-122.03491,38.29064],[-122.03476,38.29088],[-122.03459,38.29118],[-122.03449,38.29137],[-122.03426,38.29193],[-122.03418,38.2922],[-122.03406,38.29264],[-122.03396,38.2931],[-122.03393,38.2935],[-122.03391,38.29411],[-122.03389,38.29607],[-122.03388,38.29626],[-122.0338,38.29951],[-122.03378,38.3002],[-122.03376,38.30078],[-122.03375,38.30178],[-122.03369,38.30562],[-122.03367,38.30646],[-122.03363,38.30713],[-122.03357,38.30776],[-122.0335,38.30837],[-122.03344,38.30874],[-122.03339,38.30905],[-122.03315,38.31045],[-122.0329,38.31201],[-122.0327,38.31312],[-122.03266,38.31327],[-122.03259,38.31354],[-122.03245,38.31396],[-122.0324,38.31412],[-122.03217,38.31468],[-122.03193,38.31518],[-122.03181,38.31537],[-122.03164,38.31564],[-122.03127,38.31618],[-122.03082,38.31674],[-122.02973,38.31797],[-122.0257,38.32244],[-122.02545,38.32273],[-122.02501,38.32332],[-122.02424,38.32451],[-122.02388,38.32508],[-122.02364,38.32546],[-122.02277,38.3268],[-122.02214,38.32781],[-122.02171,38.32848],[-122.01912,38.33255],[-122.01868,38.33323],[-122.01723,38.3355],[-122.01703,38.3358],[-122.01646,38.33671],[-122.01604,38.33733],[-122.01582,38.33763],[-122.01571,38.33778],[-122.0152,38.33837],[-122.01491,38.33867],[-122.01443,38.33912],[-122.01384,38.3396],[-122.01382,38.33961],[-122.01319,38.34008],[-122.01268,38.34045],[-122.01205,38.34082],[-122.01143,38.34115],[-122.01139,38.34116],[-122.01073,38.34147],[-122.01038,38.34161],[-122.01001,38.34176],[-122.00947,38.34195],[-122.00846,38.34224],[-122.00749,38.34251],[-122.00657,38.34279],[-122.00637,38.34285],[-122.00492,38.34327],[-122.00399,38.34357],[-122.00323,38.34386],[-122.00223,38.34426],[-122.00169,38.34447],[-122.0015,38.34454],[-122.00076,38.34483],[-121.99641,38.34652],[-121.99451,38.34723],[-121.99383,38.34749],[-121.99269,38.34796],[-121.99074,38.34873],[-121.9893,38.34928],[-121.98686,38.35023],[-121.98572,38.35068],[-121.98514,38.35091],[-121.98469,38.35108],[-121.98342,38.35159],[-121.98176,38.35225],[-121.98127,38.35246],[-121.98087,38.35264],[-121.98048,38.35285],[-121.98008,38.35308],[-121.97968,38.35334],[-121.97901,38.35379],[-121.97843,38.35427],[-121.97792,38.35474],[-121.97762,38.35501],[-121.97678,38.35584],[-121.97661,38.35599],[-121.97631,38.35627],[-121.9757,38.35685],[-121.97396,38.35844],[-121.97357,38.35875],[-121.97317,38.35904],[-121.97196,38.35977],[-121.97046,38.36069],[-121.96951,38.36125],[-121.96889,38.36163],[-121.96673,38.36297],[-121.96633,38.36321],[-121.96611,38.36334],[-121.96542,38.36375],[-121.96476,38.36415],[-121.96439,38.36444],[-121.96433,38.36449],[-121.96415,38.36461],[-121.96392,38.36476],[-121.96364,38.36495],[-121.9627,38.36569],[-121.96148,38.36663],[-121.95995,38.36778],[-121.95964,38.36802],[-121.95838,38.36896],[-121.95631,38.37059],[-121.95515,38.3716],[-121.95421,38.37238],[-121.95314,38.37323],[-121.95287,38.37343],[-121.9521,38.37401],[-121.95136,38.3746],[-121.95123,38.3747],[-121.95077,38.37502],[-121.95037,38.37533],[-121.95014,38.3755],[-121.94871,38.37662],[-121.94698,38.37795],[-121.94507,38.37943],[-121.94334,38.38076],[-121.94161,38.38207],[-121.94142,38.38221],[-121.93895,38.38406],[-121.93827,38.38459],[-121.93766,38.38507],[-121.93655,38.3859],[-121.93648,38.38595],[-121.93505,38.38707],[-121.93496,38.38713],[-121.9345,38.38749],[-121.93257,38.38897],[-121.93115,38.39009],[-121.9308,38.39036],[-121.93017,38.39084],[-121.92731,38.39311],[-121.92666,38.39361],[-121.92568,38.39436],[-121.92556,38.39445],[-121.92447,38.39533],[-121.92036,38.39856],[-121.91885,38.39971],[-121.91784,38.40051],[-121.91719,38.40104],[-121.91696,38.4012],[-121.91662,38.40145],[-121.91555,38.40228],[-121.91504,38.40268],[-121.91288,38.40434],[-121.91223,38.40484],[-121.90866,38.40751],[-121.90674,38.40899],[-121.90161,38.41289],[-121.90093,38.41341],[-121.90053,38.41372],[-121.90007,38.41409],[-121.89696,38.41645],[-121.89447,38.41834],[-121.89347,38.41909],[-121.88873,38.42272],[-121.8876,38.42355],[-121.8864,38.42448],[-121.88609,38.42473],[-121.88233,38.42757],[-121.87953,38.4297],[-121.87832,38.43061],[-121.87734,38.43138],[-121.87627,38.43219],[-121.87574,38.4326],[-121.87502,38.43312],[-121.87305,38.43463],[-121.87258,38.43499],[-121.86933,38.43745],[-121.86857,38.43804],[-121.86799,38.43849],[-121.86344,38.44202],[-121.86177,38.44331],[-121.85933,38.44522],[-121.85871,38.44571],[-121.85832,38.44601],[-121.85813,38.44615],[-121.85795,38.44629],[-121.85727,38.44681],[-121.85681,38.44716],[-121.8562,38.44764],[-121.85479,38.44874],[-121.852,38.45089],[-121.84937,38.45295],[-121.84581,38.45573],[-121.84456,38.45669],[-121.8438,38.45729],[-121.84177,38.45887],[-121.84152,38.45907],[-121.84056,38.4598],[-121.83903,38.46099],[-121.83753,38.46214],[-121.8372,38.4624],[-121.83667,38.46282],[-121.8344,38.46458],[-121.83359,38.46522],[-121.83285,38.46581],[-121.83082,38.46739],[-121.82506,38.47189],[-121.82236,38.474],[-121.82068,38.47532],[-121.81685,38.47831],[-121.81531,38.47955],[-121.81383,38.4807],[-121.80973,38.48394],[-121.80843,38.48495],[-121.80781,38.48545],[-121.80606,38.48684],[-121.80478,38.48785],[-121.80318,38.48908],[-121.80294,38.48928],[-121.80177,38.49022],[-121.8008,38.49108],[-121.79757,38.49415],[-121.79255,38.49879],[-121.7917,38.49958],[-121.7907,38.50049],[-121.78963,38.50148],[-121.78816,38.50286],[-121.78474,38.50607],[-121.78247,38.5082],[-121.78176,38.50886],[-121.77973,38.51071],[-121.7761,38.51411],[-121.7756,38.51464],[-121.77241,38.51758],[-121.7713,38.51861],[-121.76765,38.52205],[-121.76674,38.52291],[-121.76617,38.52345],[-121.76516,38.52433],[-121.76467,38.52472],[-121.7642,38.52506],[-121.76311,38.52576],[-121.76256,38.52611],[-121.76203,38.52644],[-121.76151,38.52672],[-121.76048,38.52725],[-121.75989,38.52752],[-121.75872,38.52801],[-121.75784,38.52835],[-121.7574,38.52852],[-121.75654,38.52878],[-121.75569,38.52903],[-121.75513,38.52919],[-121.75439,38.52939],[-121.75362,38.52955],[-121.75272,38.52971],[-121.75077,38.53006],[-121.74997,38.53028],[-121.74881,38.53065],[-121.74826,38.53085],[-121.74743,38.53117],[-121.74656,38.53157],[-121.74574,38.53197],[-121.74501,38.53238],[-121.74422,38.53286],[-121.74351,38.53335],[-121.74275,38.53393],[-121.74189,38.53464],[-121.74111,38.53531],[-121.74039,38.53593],[-121.73936,38.53677],[-121.73849,38.53752],[-121.73828,38.53769],[-121.7365,38.5392],[-121.73349,38.5417],[-121.73197,38.54292],[-121.7311,38.54351],[-121.72902,38.54457],[-121.72781,38.54509],[-121.7267,38.5455],[-121.72042,38.54697],[-121.7136,38.54854],[-121.69968,38.55166],[-121.6986,38.55186],[-121.69632,38.55215],[-121.6958,38.55221],[-121.69522,38.55231],[-121.69467,38.5524],[-121.69384,38.5526],[-121.69335,38.55274],[-121.69289,38.55287],[-121.69048,38.55366],[-121.69007,38.55379],[-121.68947,38.55397],[-121.68897,38.55411],[-121.67599,38.55705],[-121.66872,38.55857],[-121.65311,38.56075],[-121.64615,38.562],[-121.64325,38.56253],[-121.64055,38.56302],[-121.63881,38.56333],[-121.62834,38.5652],[-121.6197,38.56676],[-121.61232,38.56807],[-121.58303,38.57328],[-121.58226,38.57342],[-121.57947,38.57383],[-121.57788,38.57406],[-121.57706,38.57419],[-121.57548,38.57442],[-121.57251,38.57486],[-121.57036,38.57505],[-121.57007,38.57507],[-121.5698,38.57508],[-121.56947,38.57507],[-121.5691,38.57505],[-121.56872,38.57502],[-121.56789,38.57496],[-121.56746,38.57494],[-121.56698,38.57494],[-121.56666,38.57495],[-121.56637,38.57498],[-121.56608,38.57502],[-121.56578,38.57507],[-121.56546,38.57514],[-121.56514,38.57523],[-121.56488,38.5753],[-121.56467,38.57538],[-121.56441,38.57548],[-121.56418,38.57558],[-121.56389,38.5757],[-121.56366,38.57583],[-121.5631,38.57616],[-121.56259,38.57656],[-121.56205,38.5771],[-121.56125,38.57823],[-121.56081,38.57885],[-121.56063,38.57909],[-121.55861,38.58211],[-121.55718,38.58428],[-121.55687,38.58474],[-121.55485,38.58771],[-121.55434,38.58845],[-121.55294,38.59051],[-121.55211,38.5918],[-121.55184,38.59219],[-121.5513,38.59295],[-121.54461,38.60297],[-121.54235,38.60623],[-121.53969,38.61021],[-121.53844,38.61206],[-121.53827,38.6123],[-121.53805,38.61261],[-121.5378,38.61293],[-121.53754,38.61323],[-121.53726,38.61353],[-121.53697,38.61382],[-121.53666,38.61411],[-121.53633,38.61438],[-121.53595,38.61468],[-121.53534,38.6151],[-121.53477,38.61548],[-121.53446,38.61568],[-121.5341,38.61588],[-121.53375,38.61607],[-121.53338,38.61625],[-121.53129,38.61734],[-121.5301,38.61796],[-121.53006,38.61799],[-121.52769,38.61922],[-121.5275,38.61932],[-121.52567,38.62032],[-121.5241,38.62115],[-121.524,38.6212],[-121.52394,38.62123],[-121.5233,38.62157],[-121.52183,38.62235],[-121.51669,38.62507],[-121.51305,38.62699],[-121.51223,38.62741],[-121.51115,38.62798],[-121.50745,38.62991],[-121.50602,38.63065],[-121.50588,38.63073],[-121.50492,38.63124],[-121.50051,38.63356],[-121.49771,38.63504],[-121.4946,38.63667],[-121.49357,38.6372],[-121.49266,38.63768],[-121.49171,38.63811],[-121.49072,38.63849],[-121.4897,38.63882],[-121.48866,38.63909],[-121.4876,38.63931],[-121.48651,38.63948],[-121.48541,38.63961],[-121.48418,38.63976],[-121.48227,38.64],[-121.478,38.64052],[-121.47782,38.64054],[-121.47412,38.64098],[-121.47383,38.64102],[-121.4735,38.64106],[-121.47076,38.64138],[-121.47004,38.64144],[-121.4694,38.64149],[-121.46885,38.64155],[-121.46829,38.64158],[-121.46737,38.6416],[-121.46276,38.64146],[-121.46127,38.6414],[-121.45162,38.64111],[-121.45095,38.64108],[-121.45028,38.64107],[-121.44945,38.64108],[-121.44912,38.64109],[-121.44807,38.64115],[-121.44752,38.64119],[-121.44725,38.64121],[-121.44702,38.64125],[-121.44628,38.64136],[-121.44601,38.6414],[-121.44447,38.64166],[-121.44295,38.64191],[-121.44057,38.6423],[-121.43652,38.64297],[-121.43622,38.643],[-121.43575,38.64306],[-121.43498,38.64312],[-121.4342,38.64316],[-121.43323,38.64316],[-121.43226,38.64312],[-121.43122,38.64302],[-121.43018,38.64287],[-121.42865,38.64257],[-121.42815,38.64245],[-121.42707,38.64213],[-121.42603,38.64175],[-121.42552,38.64154],[-121.42471,38.64116],[-121.42444,38.64102],[-121.42401,38.64082],[-121.41922,38.63848],[-121.4184,38.63815],[-121.41756,38.63788],[-121.4168,38.63768],[-121.41668,38.63765],[-121.4161,38.63752],[-121.41528,38.63739],[-121.41445,38.6373],[-121.41361,38.63724],[-121.41175,38.63724],[-121.41119,38.63724],[-121.40807,38.63725],[-121.40717,38.63724],[-121.40611,38.63724],[-121.40593,38.63724],[-121.40465,38.63724],[-121.40443,38.63725],[-121.40366,38.63733],[-121.40311,38.63743],[-121.40258,38.63758],[-121.40198,38.63778],[-121.40141,38.63803],[-121.40088,38.63832],[-121.40058,38.63852],[-121.4003,38.63872],[-121.39882,38.63979],[-121.39678,38.64125],[-121.39645,38.64149],[-121.39595,38.64183],[-121.39583,38.64191],[-121.39559,38.64205],[-121.39518,38.64229],[-121.39449,38.64263],[-121.39415,38.64279],[-121.39348,38.64306],[-121.39279,38.64331],[-121.39208,38.64353],[-121.39136,38.64372],[-121.39064,38.64387],[-121.3899,38.64398],[-121.38912,38.64409],[-121.38779,38.64427],[-121.38601,38.64451],[-121.38317,38.64493],[-121.38218,38.64507],[-121.37945,38.6455],[-121.37867,38.64567],[-121.37792,38.64588],[-121.37664,38.64637],[-121.37595,38.64666],[-121.3754,38.64696],[-121.37431,38.64774],[-121.37406,38.64795],[-121.37223,38.6496],[-121.37051,38.6512],[-121.37018,38.6515],[-121.36748,38.65394],[-121.36438,38.6568],[-121.36344,38.65766],[-121.35783,38.66289],[-121.35553,38.66504],[-121.35496,38.66558],[-121.35367,38.66675],[-121.35159,38.66866],[-121.34706,38.67282],[-121.34657,38.67325],[-121.34335,38.67624],[-121.33989,38.67945],[-121.33448,38.68435],[-121.33379,38.68497],[-121.33321,38.68551],[-121.33037,38.68811],[-121.32779,38.69048],[-121.32749,38.69074],[-121.32665,38.69152],[-121.32409,38.69385],[-121.32277,38.69507],[-121.31972,38.69786],[-121.31761,38.69979],[-121.31569,38.70153],[-121.31447,38.70261],[-121.3132,38.70381],[-121.31264,38.70432],[-121.30979,38.70694],[-121.30852,38.70809],[-121.30636,38.71006],[-121.30282,38.7133],[-121.30276,38.71336],[-121.29933,38.7165],[-121.29721,38.71844],[-121.29575,38.71972],[-121.29386,38.72142],[-121.29317,38.72202],[-121.29258,38.72255],[-121.28947,38.72539],[-121.28875,38.72604],[-121.28794,38.72678],[-121.28744,38.72723],[-121.28548,38.72902],[-121.28284,38.73144],[-121.28096,38.73317],[-121.27999,38.73405],[-121.27894,38.73502],[-121.27796,38.73591],[-121.2771,38.7367],[-121.27608,38.73763],[-121.27532,38.73832],[-121.27407,38.73948],[-121.27369,38.73986],[-121.27332,38.74026],[-121.27294,38.7407],[-121.27225,38.74158],[-121.27194,38.74204],[-121.27164,38.7425],[-121.27148,38.74274],[-121.26874,38.74687],[-121.26715,38.7494],[-121.26491,38.75286],[-121.26435,38.75374],[-121.26306,38.75571],[-121.26268,38.75629],[-121.26217,38.75707],[-121.26124,38.75848],[-121.26068,38.75933],[-121.26007,38.76012],[-121.2598,38.76053],[-121.25967,38.76073],[-121.25951,38.76096],[-121.25915,38.7615],[-121.25876,38.7621],[-121.25845,38.76257],[-121.25791,38.76338],[-121.25766,38.76371],[-121.25736,38.76404],[-121.25694,38.76445],[-121.25674,38.76462],[-121.25654,38.76479],[-121.2563,38.76496],[-121.25605,38.76512],[-121.25575,38.76533],[-121.25547,38.7655],[-121.25396,38.76649],[-121.2529,38.76714],[-121.25229,38.76753],[-121.24946,38.76929],[-121.24784,38.77029],[-121.24664,38.77105],[-121.2457,38.77163],[-121.2454,38.77182],[-121.24409,38.77264],[-121.24289,38.77338],[-121.24196,38.77396],[-121.24147,38.77429],[-121.2401,38.77515],[-121.23873,38.77601],[-121.23744,38.77681],[-121.23612,38.77764],[-121.23487,38.77841],[-121.23442,38.7787],[-121.234,38.77896],[-121.23359,38.77924],[-121.23313,38.77958],[-121.23271,38.77991],[-121.23234,38.78022],[-121.23097,38.78136],[-121.22809,38.78378],[-121.22503,38.78636],[-121.22263,38.78838],[-121.2224,38.78856],[-121.21917,38.79129],[-121.219,38.79144],[-121.21019,38.79885],[-121.20982,38.79916],[-121.20878,38.80003],[-121.20741,38.80118],[-121.20539,38.80288],[-121.2021,38.80565],[-121.20063,38.80688],[-121.1987,38.8085],[-121.19687,38.81004],[-121.19536,38.81132],[-121.19341,38.81294],[-121.19236,38.81383],[-121.19175,38.81434],[-121.18911,38.81656],[-121.18841,38.81715],[-121.18674,38.81855],[-121.1847,38.82027],[-121.18345,38.82132],[-121.18275,38.8219],[-121.18092,38.82344],[-121.17822,38.82572],[-121.17515,38.82826],[-121.17188,38.83101],[-121.17152,38.83129],[-121.16874,38.83366],[-121.16834,38.83399],[-121.16448,38.83722],[-121.16089,38.8402],[-121.15862,38.84208],[-121.15644,38.84387],[-121.15538,38.84476],[-121.15473,38.84528],[-121.15332,38.84645],[-121.15225,38.84733],[-121.15031,38.84892],[-121.14384,38.85426],[-121.14055,38.85696],[-121.13566,38.86102],[-121.13508,38.86151],[-121.13458,38.86201],[-121.13416,38.86249],[-121.1338,38.86298],[-121.13351,38.86343],[-121.13312,38.86418],[-121.13281,38.86502],[-121.13266,38.86564],[-121.13249,38.86667],[-121.13223,38.86825],[-121.13211,38.86897],[-121.13195,38.86993],[-121.1315,38.87271],[-121.13135,38.87367],[-121.13128,38.87403],[-121.13123,38.87425],[-121.13121,38.87433],[-121.13118,38.87445],[-121.13108,38.87472],[-121.13089,38.87513],[-121.13081,38.87529],[-121.13066,38.87554],[-121.13045,38.87582],[-121.1302,38.87611],[-121.12996,38.87636],[-121.12971,38.87658],[-121.1293,38.8769],[-121.12899,38.87711],[-121.12865,38.87729],[-121.12823,38.87749],[-121.12793,38.87762],[-121.12762,38.87774],[-121.12716,38.87788],[-121.12673,38.87799],[-121.12639,38.87805],[-121.12604,38.8781],[-121.12565,38.87814],[-121.12557,38.87814],[-121.12341,38.87826],[-121.12096,38.87839],[-121.11866,38.87852],[-121.11812,38.87858],[-121.11756,38.87867],[-121.1171,38.87875],[-121.11662,38.87885],[-121.11614,38.87895],[-121.11547,38.87912],[-121.11125,38.88038],[-121.10713,38.88162],[-121.10655,38.8818],[-121.1061,38.88196],[-121.10567,38.88212],[-121.10516,38.88233],[-121.10457,38.88258],[-121.10405,38.88284],[-121.10349,38.88312],[-121.10266,38.88359],[-121.09928,38.88562],[-121.09859,38.88602],[-121.09768,38.88655],[-121.09698,38.88694],[-121.09643,38.88719],[-121.09592,38.88742],[-121.09548,38.88759],[-121.09533,38.88764],[-121.09514,38.88771],[-121.09464,38.88788],[-121.09365,38.88815],[-121.09205,38.88853],[-121.09134,38.88871],[-121.09063,38.88893],[-121.09,38.88918],[-121.08932,38.8895],[-121.08853,38.88998],[-121.08797,38.8904],[-121.0873,38.89099],[-121.08653,38.89161],[-121.08593,38.89204],[-121.08541,38.89236],[-121.08486,38.89266],[-121.08413,38.89304],[-121.08359,38.89331],[-121.08303,38.8936],[-121.08254,38.89395],[-121.08225,38.89421],[-121.08194,38.89452],[-121.08179,38.89469],[-121.08166,38.89485],[-121.08139,38.89513],[-121.08112,38.89539],[-121.08087,38.89563],[-121.08067,38.89579],[-121.08047,38.89593],[-121.08021,38.89608],[-121.07977,38.89634],[-121.07885,38.89682],[-121.07815,38.89721],[-121.07767,38.89751],[-121.07731,38.89777],[-121.07711,38.89796],[-121.07693,38.89811],[-121.07498,38.89984],[-121.07432,38.90043],[-121.07396,38.90075],[-121.07355,38.90112],[-121.0732,38.90143],[-121.07269,38.90189],[-121.07258,38.902],[-121.07233,38.90226],[-121.07214,38.90246],[-121.07187,38.90284],[-121.07167,38.90316],[-121.07146,38.90352],[-121.07124,38.90417],[-121.07119,38.90444],[-121.07111,38.90497],[-121.07113,38.90519],[-121.07114,38.90551],[-121.07124,38.90622],[-121.07126,38.90652],[-121.07125,38.90672],[-121.07124,38.907],[-121.0712,38.90722],[-121.07114,38.90747],[-121.07108,38.90769],[-121.0709,38.90806],[-121.07071,38.90841],[-121.07052,38.90869],[-121.07028,38.90894],[-121.07008,38.90915],[-121.06985,38.90935],[-121.06926,38.90979],[-121.06834,38.91046],[-121.06775,38.91092],[-121.06751,38.91115],[-121.06732,38.91136],[-121.06625,38.91275],[-121.06598,38.91309],[-121.06579,38.91333],[-121.06557,38.91355],[-121.06535,38.91378],[-121.06478,38.91431],[-121.06399,38.91502],[-121.06326,38.91567],[-121.06292,38.91597],[-121.06145,38.91727],[-121.06086,38.91782],[-121.06058,38.9181],[-121.05997,38.91884],[-121.05963,38.91942],[-121.05923,38.91998],[-121.05777,38.92247],[-121.05737,38.92322],[-121.05717,38.92369],[-121.05677,38.92466],[-121.05652,38.92543],[-121.05643,38.92581],[-121.05637,38.9261],[-121.05587,38.92834],[-121.0556,38.92964],[-121.05511,38.93208],[-121.05496,38.93281],[-121.05488,38.93323],[-121.05471,38.93405],[-121.05463,38.9343],[-121.05455,38.93453],[-121.05451,38.93463],[-121.05444,38.9348],[-121.05432,38.93505],[-121.05416,38.93533],[-121.05385,38.93578],[-121.0536,38.9361],[-121.05313,38.93677],[-121.05266,38.93743],[-121.05211,38.93826],[-121.05175,38.93892],[-121.05142,38.93956],[-121.0512,38.93999],[-121.05096,38.94042],[-121.05071,38.9409],[-121.05023,38.94166],[-121.0495,38.94244],[-121.04909,38.94276],[-121.04892,38.9429],[-121.04833,38.94336],[-121.04737,38.9441],[-121.04604,38.9453],[-121.04387,38.94745],[-121.04287,38.94845],[-121.04247,38.94885],[-121.04189,38.9495],[-121.04078,38.95078],[-121.03989,38.95179],[-121.03905,38.9528],[-121.03855,38.95336],[-121.03817,38.9538],[-121.03734,38.95454],[-121.03702,38.95482],[-121.03668,38.95508],[-121.03604,38.95555],[-121.03555,38.95588],[-121.0334,38.95722],[-121.03101,38.95869],[-121.03009,38.95928],[-121.02662,38.96148],[-121.02477,38.96262],[-121.02284,38.96377],[-121.02229,38.96415],[-121.02186,38.96452],[-121.02159,38.96477],[-121.02106,38.96545],[-121.02058,38.96619],[-121.02029,38.96663],[-121.02001,38.96705],[-121.01943,38.96779],[-121.01897,38.96829],[-121.01857,38.96867],[-121.01764,38.96966],[-121.016,38.97142],[-121.01518,38.9725],[-121.01428,38.9738],[-121.01298,38.97558],[-121.01166,38.97733],[-121.01069,38.97867],[-121.00945,38.98043],[-121.00806,38.9823],[-121.00763,38.9828],[-121.00676,38.98385],[-121.00565,38.98503],[-121.00358,38.98716],[-121.00146,38.98938],[-121.0008,38.99011],[-121.00016,38.99106],[-120.99849,38.99405],[-120.99839,38.99423],[-120.99763,38.99564],[-120.99721,38.99667],[-120.99657,38.99823],[-120.99596,38.99976],[-120.99554,39.00053],[-120.99519,39.0013],[-120.99457,39.00219],[-120.99391,39.00307],[-120.99343,39.00373],[-120.99298,39.00432],[-120.99236,39.00509],[-120.9917,39.00603],[-120.99127,39.00659],[-120.9905,39.00765],[-120.99011,39.00831],[-120.98978,39.00894],[-120.98958,39.01001],[-120.98961,39.0106],[-120.98975,39.01246],[-120.98971,39.01304],[-120.98954,39.01365],[-120.98936,39.01418],[-120.98918,39.01454],[-120.98899,39.01487],[-120.9888,39.01513],[-120.98854,39.01544],[-120.98816,39.0158],[-120.98767,39.01608],[-120.98737,39.01627],[-120.98691,39.01652],[-120.98639,39.01677],[-120.9828,39.01839],[-120.98205,39.01881],[-120.98146,39.01924],[-120.98106,39.0196],[-120.98079,39.01988],[-120.98055,39.02016],[-120.97963,39.02124],[-120.97882,39.02224],[-120.97847,39.02288],[-120.97824,39.02347],[-120.9775,39.026],[-120.97693,39.02795],[-120.97674,39.02879],[-120.97645,39.03026],[-120.97636,39.03072],[-120.97628,39.03112],[-120.97597,39.0327],[-120.97585,39.03311],[-120.97562,39.03362],[-120.97534,39.03412],[-120.97498,39.03463],[-120.97426,39.03565],[-120.97398,39.03607],[-120.9738,39.0364],[-120.97362,39.0368],[-120.97335,39.03758],[-120.97325,39.03802],[-120.97319,39.03847],[-120.97317,39.039],[-120.9732,39.03954],[-120.97329,39.04008],[-120.97343,39.04061],[-120.97361,39.04117],[-120.9738,39.04176],[-120.97405,39.04264],[-120.97411,39.043],[-120.97415,39.04334],[-120.97413,39.04408],[-120.97409,39.04428],[-120.97404,39.04457],[-120.97395,39.04487],[-120.9738,39.04528],[-120.97352,39.0458],[-120.97327,39.04629],[-120.97298,39.04692],[-120.97254,39.04784],[-120.97205,39.04885],[-120.9714,39.05016],[-120.97069,39.05177],[-120.97008,39.05344],[-120.96921,39.05652],[-120.96858,39.05899],[-120.96794,39.06147],[-120.9676,39.06228],[-120.96704,39.06316],[-120.96661,39.06375],[-120.96537,39.06518],[-120.96476,39.06594],[-120.9645,39.06638],[-120.96424,39.0669],[-120.96404,39.06814],[-120.96392,39.07018],[-120.96385,39.07052],[-120.96374,39.07108],[-120.96277,39.07297],[-120.96221,39.07395],[-120.96202,39.07447],[-120.96172,39.07499],[-120.96158,39.07528],[-120.96141,39.07559],[-120.95954,39.07898],[-120.95908,39.07987],[-120.95853,39.0809],[-120.95778,39.08235],[-120.95604,39.0857],[-120.95556,39.08659],[-120.95518,39.08715],[-120.95488,39.08754],[-120.95184,39.0905],[-120.951,39.09147],[-120.95013,39.09291],[-120.94974,39.09405],[-120.94953,39.09548],[-120.9494,39.09661],[-120.94925,39.09791],[-120.94918,39.09844],[-120.94892,39.10029],[-120.9486,39.10175],[-120.94849,39.10274],[-120.94817,39.10448],[-120.94814,39.10464],[-120.94809,39.10485],[-120.94789,39.1054],[-120.94773,39.10583],[-120.94733,39.10667],[-120.94685,39.10756],[-120.94574,39.1101],[-120.94481,39.11253],[-120.94424,39.11414],[-120.94353,39.11584],[-120.9432,39.11643],[-120.94284,39.11695],[-120.94239,39.11753],[-120.94203,39.11804],[-120.94172,39.11853],[-120.9415,39.11907],[-120.94113,39.12052],[-120.9409,39.12166],[-120.94086,39.12182],[-120.94081,39.12196],[-120.94066,39.12231],[-120.94052,39.1226],[-120.94038,39.12286],[-120.94015,39.12324],[-120.93988,39.12367],[-120.93933,39.12457],[-120.93906,39.12504],[-120.93878,39.12551],[-120.9384,39.12612],[-120.9381,39.12661],[-120.93783,39.12707],[-120.93755,39.1276],[-120.93737,39.128],[-120.93719,39.1284],[-120.93707,39.12872],[-120.93696,39.129],[-120.93683,39.12939],[-120.93667,39.12989],[-120.93651,39.13045],[-120.9363,39.13112],[-120.93617,39.13149],[-120.93609,39.13169],[-120.936,39.13189],[-120.93587,39.1321],[-120.9357,39.1323],[-120.93553,39.13247],[-120.93537,39.13262],[-120.93516,39.13279],[-120.93494,39.13293],[-120.93469,39.13307],[-120.93439,39.1332],[-120.93413,39.1333],[-120.93327,39.13356],[-120.93262,39.13377],[-120.9323,39.13388],[-120.93204,39.13399],[-120.93184,39.1341],[-120.93161,39.13425],[-120.93138,39.13442],[-120.9312,39.13458],[-120.93105,39.13475],[-120.93093,39.13489],[-120.93076,39.13512],[-120.9306,39.13536],[-120.93036,39.13572],[-120.93005,39.13617],[-120.92968,39.13671],[-120.92939,39.13717],[-120.9292,39.13746],[-120.929,39.13773],[-120.92889,39.13788],[-120.92876,39.13802],[-120.92858,39.1382],[-120.92841,39.13835],[-120.9282,39.13849],[-120.92796,39.13863],[-120.92773,39.13874],[-120.92739,39.13888],[-120.92707,39.13897],[-120.92677,39.13904],[-120.9264,39.13909],[-120.92605,39.13911],[-120.9257,39.1391],[-120.92434,39.13895],[-120.92302,39.1388],[-120.92183,39.13867],[-120.92102,39.13858],[-120.92069,39.13856],[-120.92034,39.13855],[-120.92001,39.13856],[-120.91973,39.13858],[-120.91943,39.13861],[-120.91912,39.13866],[-120.91876,39.13874],[-120.91837,39.13884],[-120.918,39.13897],[-120.91762,39.13913],[-120.91728,39.13931],[-120.91695,39.13951],[-120.91592,39.14024],[-120.91482,39.14102],[-120.91388,39.14169],[-120.91355,39.14193],[-120.91323,39.14218],[-120.91301,39.14239],[-120.91281,39.14261],[-120.91266,39.1428],[-120.91248,39.14305],[-120.91232,39.1433],[-120.91215,39.14368],[-120.9119,39.14431],[-120.91167,39.14487],[-120.91157,39.14511],[-120.91145,39.14529],[-120.91135,39.14543],[-120.91122,39.14559],[-120.91108,39.14574],[-120.91092,39.14591],[-120.91077,39.14604],[-120.91054,39.14622],[-120.91031,39.14638],[-120.91008,39.14652],[-120.9098,39.14667],[-120.90956,39.14678],[-120.90926,39.14688],[-120.909,39.14696],[-120.90878,39.14701],[-120.90848,39.14707],[-120.90817,39.14711],[-120.90795,39.14712],[-120.90774,39.14712],[-120.9074,39.14711],[-120.90565,39.14703],[-120.90517,39.14704],[-120.90473,39.14709],[-120.90433,39.14715],[-120.90386,39.14728],[-120.90351,39.1474],[-120.90311,39.14754],[-120.9027,39.14772],[-120.90129,39.14843],[-120.90065,39.14873],[-120.89859,39.14966],[-120.89776,39.15005],[-120.89672,39.15054],[-120.89593,39.15095],[-120.89514,39.15128],[-120.89399,39.15182],[-120.89283,39.15239],[-120.89117,39.15314],[-120.88953,39.15388],[-120.88827,39.15446],[-120.88751,39.1548],[-120.88649,39.15526],[-120.88291,39.15683],[-120.87811,39.15849],[-120.87707,39.15903],[-120.87646,39.15952],[-120.87591,39.1601],[-120.87561,39.16065],[-120.87536,39.16122],[-120.87519,39.16184],[-120.87525,39.16271],[-120.8754,39.16381],[-120.87555,39.16445],[-120.87567,39.16516],[-120.87566,39.16606],[-120.87565,39.16634],[-120.87547,39.16701],[-120.87525,39.16746],[-120.87479,39.16822],[-120.87421,39.16895],[-120.87293,39.16992],[-120.87269,39.17006],[-120.87244,39.17019],[-120.87213,39.17032],[-120.87145,39.17057],[-120.87073,39.17079],[-120.86764,39.17149],[-120.86667,39.17173],[-120.86204,39.17275],[-120.86125,39.17299],[-120.8608,39.17316],[-120.8605,39.17329],[-120.86023,39.17343],[-120.85971,39.17373],[-120.85928,39.17402],[-120.85862,39.17456],[-120.85811,39.17499],[-120.85611,39.17667],[-120.85494,39.17764],[-120.854,39.17841],[-120.85257,39.17962],[-120.85073,39.18108],[-120.84981,39.18186],[-120.8495,39.18217],[-120.84901,39.1827],[-120.84834,39.18371],[-120.84784,39.18448],[-120.84746,39.18484],[-120.84704,39.18525],[-120.84666,39.18554],[-120.84638,39.18572],[-120.84562,39.18618],[-120.84439,39.1868],[-120.84207,39.18794],[-120.84107,39.18828],[-120.83954,39.18851],[-120.83764,39.18869],[-120.83708,39.18872],[-120.83613,39.18878],[-120.83557,39.18881],[-120.83495,39.1888],[-120.83452,39.18876],[-120.83387,39.18865],[-120.83322,39.18848],[-120.83242,39.18821],[-120.83094,39.18781],[-120.83013,39.18772],[-120.82971,39.18771],[-120.82931,39.18773],[-120.82475,39.18834],[-120.82365,39.18859],[-120.82236,39.18916],[-120.8203,39.19052],[-120.81886,39.19144],[-120.81785,39.19232],[-120.81746,39.19286],[-120.81707,39.19428],[-120.81682,39.19517],[-120.81636,39.19597],[-120.81562,39.19699],[-120.81455,39.19838],[-120.81419,39.19897],[-120.81409,39.19913],[-120.81348,39.2003],[-120.81321,39.2007],[-120.81286,39.20111],[-120.81219,39.20164],[-120.81189,39.20183],[-120.81102,39.20221],[-120.81022,39.20243],[-120.80888,39.20263],[-120.80589,39.20306],[-120.80467,39.20317],[-120.80356,39.2032],[-120.80187,39.20301],[-120.80015,39.20278],[-120.79941,39.20271],[-120.79847,39.20273],[-120.79794,39.20281],[-120.79744,39.20291],[-120.79691,39.2031],[-120.79636,39.20333],[-120.79572,39.20373],[-120.79523,39.20413],[-120.79472,39.20455],[-120.79402,39.20515],[-120.79321,39.20569],[-120.79195,39.20634],[-120.79061,39.20698],[-120.78967,39.20743],[-120.78879,39.20784],[-120.78735,39.20857],[-120.78658,39.209],[-120.78555,39.20959],[-120.78455,39.21016],[-120.78371,39.21064],[-120.78117,39.21209],[-120.78021,39.21264],[-120.7773,39.2143],[-120.77666,39.21475],[-120.77593,39.21542],[-120.77559,39.21584],[-120.77532,39.21624],[-120.77414,39.21794],[-120.7734,39.21877],[-120.7727,39.21939],[-120.77064,39.22106],[-120.76873,39.22245],[-120.76811,39.22312],[-120.7676,39.22389],[-120.76653,39.22544],[-120.7654,39.22624],[-120.76398,39.22682],[-120.76277,39.22745],[-120.76187,39.22818],[-120.76146,39.22885],[-120.76042,39.23053],[-120.7596,39.23124],[-120.75878,39.23166],[-120.75679,39.23268],[-120.75572,39.23353],[-120.75527,39.23403],[-120.75487,39.23438],[-120.75346,39.23576],[-120.75293,39.23674],[-120.75267,39.23742],[-120.75251,39.23802],[-120.75241,39.23873],[-120.7524,39.23912],[-120.75235,39.24023],[-120.75221,39.24079],[-120.752,39.24125],[-120.75173,39.24166],[-120.75127,39.24218],[-120.75082,39.24255],[-120.74823,39.24404],[-120.74655,39.24468],[-120.74591,39.24497],[-120.74505,39.24536],[-120.74428,39.24595],[-120.74358,39.24664],[-120.74206,39.24822],[-120.74059,39.24972],[-120.73896,39.25142],[-120.73718,39.25318],[-120.73629,39.25366],[-120.73473,39.2543],[-120.73312,39.255],[-120.73233,39.2556],[-120.73188,39.25598],[-120.73151,39.25637],[-120.73111,39.25692],[-120.73053,39.25793],[-120.72933,39.26021],[-120.72857,39.26169],[-120.72701,39.26465],[-120.72623,39.26622],[-120.72593,39.2665],[-120.72547,39.26695],[-120.72496,39.26731],[-120.72456,39.26753],[-120.72052,39.26887],[-120.71758,39.26991],[-120.71649,39.27029],[-120.71551,39.27074],[-120.71454,39.27159],[-120.71436,39.27181],[-120.7142,39.27204],[-120.71406,39.27229],[-120.71394,39.27254],[-120.71385,39.27278],[-120.71379,39.27304],[-120.71373,39.2733],[-120.71371,39.27354],[-120.71371,39.27381],[-120.71372,39.27407],[-120.71381,39.27551],[-120.71386,39.2759],[-120.71387,39.27616],[-120.71387,39.27643],[-120.71384,39.27669],[-120.7138,39.27694],[-120.71373,39.27721],[-120.71366,39.27746],[-120.71356,39.27771],[-120.71346,39.27796],[-120.71333,39.27819],[-120.71317,39.27844],[-120.71301,39.27867],[-120.71284,39.2789],[-120.71264,39.27911],[-120.71244,39.27931],[-120.71222,39.27951],[-120.71198,39.2797],[-120.71175,39.27987],[-120.71148,39.28005],[-120.71121,39.28021],[-120.71093,39.28035],[-120.71064,39.28049],[-120.70981,39.28087],[-120.70786,39.28175],[-120.70758,39.28191],[-120.70393,39.2836],[-120.70351,39.28379],[-120.70095,39.28498],[-120.6997,39.28555],[-120.69886,39.28595],[-120.69267,39.28881],[-120.68773,39.29108],[-120.68745,39.29121],[-120.68716,39.29133],[-120.68687,39.29143],[-120.68654,39.29153],[-120.68623,39.2916],[-120.68589,39.29167],[-120.68554,39.29171],[-120.68523,39.29174],[-120.6849,39.29175],[-120.68373,39.29181],[-120.68338,39.29183],[-120.68304,39.29184],[-120.6827,39.29186],[-120.68237,39.29189],[-120.68202,39.29194],[-120.68167,39.29199],[-120.68133,39.29206],[-120.68099,39.29214],[-120.6807,39.29222],[-120.6804,39.29231],[-120.6801,39.29241],[-120.67982,39.29252],[-120.67961,39.2926],[-120.6794,39.29269],[-120.67907,39.29284],[-120.67878,39.29299],[-120.6785,39.29314],[-120.67823,39.2933],[-120.67796,39.29348],[-120.67593,39.2949],[-120.67574,39.29504],[-120.67557,39.29518],[-120.6754,39.29533],[-120.67524,39.29549],[-120.67511,39.29565],[-120.67498,39.29581],[-120.67484,39.29601],[-120.67471,39.29622],[-120.67417,39.29718],[-120.67404,39.2974],[-120.6739,39.29761],[-120.67372,39.29783],[-120.67353,39.29803],[-120.67332,39.29822],[-120.67311,39.29839],[-120.67287,39.29855],[-120.6726,39.29871],[-120.67233,39.29886],[-120.67207,39.29898],[-120.67182,39.29907],[-120.67156,39.29916],[-120.66841,39.30017],[-120.66809,39.30027],[-120.66775,39.30036],[-120.6674,39.30046],[-120.66663,39.30063],[-120.66561,39.30088],[-120.66309,39.30148],[-120.66129,39.30194],[-120.66054,39.30213],[-120.65743,39.30287],[-120.6557,39.30332],[-120.65443,39.30362],[-120.65232,39.30412],[-120.65009,39.30454],[-120.64886,39.3048],[-120.64818,39.30499],[-120.64747,39.30524],[-120.64638,39.30568],[-120.63958,39.30911],[-120.63747,39.3096],[-120.63455,39.30973],[-120.63383,39.30977],[-120.63292,39.30993],[-120.6318,39.31031],[-120.63083,39.31085],[-120.62756,39.313],[-120.6261,39.31398],[-120.62472,39.31452],[-120.62327,39.31484],[-120.62267,39.3149],[-120.61932,39.31497],[-120.61789,39.31523],[-120.6172,39.31543],[-120.61646,39.31561],[-120.61468,39.31639],[-120.61331,39.31711],[-120.61116,39.3182],[-120.60747,39.32009],[-120.60527,39.32118],[-120.60468,39.32155],[-120.60431,39.32187],[-120.6038,39.32242],[-120.60342,39.32307],[-120.60309,39.32362],[-120.60278,39.32409],[-120.60246,39.32448],[-120.60203,39.32489],[-120.60157,39.32518],[-120.60117,39.32539],[-120.60081,39.32555],[-120.60034,39.32575],[-120.59962,39.3259],[-120.59907,39.32597],[-120.59846,39.32597],[-120.59767,39.32598],[-120.59563,39.32601],[-120.59495,39.32614],[-120.59439,39.32634],[-120.59361,39.3267],[-120.5927,39.32729],[-120.59122,39.32868],[-120.59039,39.32926],[-120.58976,39.32962],[-120.58882,39.32998],[-120.58775,39.33014],[-120.58666,39.33017],[-120.58575,39.33005],[-120.57394,39.32692],[-120.57279,39.32649],[-120.5717,39.32587],[-120.57029,39.32477],[-120.56799,39.32242],[-120.56759,39.322],[-120.56609,39.32068],[-120.56536,39.32018],[-120.56509,39.32001],[-120.56482,39.31986],[-120.56415,39.31953],[-120.56323,39.31914],[-120.56217,39.31872],[-120.56172,39.31857],[-120.56078,39.31821],[-120.55986,39.31773],[-120.55694,39.31576],[-120.55624,39.31542],[-120.55591,39.31532],[-120.55532,39.31512],[-120.55318,39.31448],[-120.55145,39.31381],[-120.5472,39.31142],[-120.54481,39.3101],[-120.54346,39.30934],[-120.54129,39.30792],[-120.53892,39.3063],[-120.53849,39.30604],[-120.53793,39.30576],[-120.53748,39.30558],[-120.53705,39.30543],[-120.53663,39.30531],[-120.53608,39.30517],[-120.53484,39.30486],[-120.53373,39.30457],[-120.53295,39.30441],[-120.53255,39.30437],[-120.53223,39.30434],[-120.53183,39.30434],[-120.53132,39.30437],[-120.53071,39.30446],[-120.52834,39.30506],[-120.52776,39.30516],[-120.52725,39.30522],[-120.5268,39.30524],[-120.52529,39.3052],[-120.52516,39.3052],[-120.5243,39.3052],[-120.52377,39.3052],[-120.52337,39.30524],[-120.52299,39.3053],[-120.52241,39.30546],[-120.52186,39.30563],[-120.52125,39.30595],[-120.52075,39.30627],[-120.52035,39.30664],[-120.51993,39.3071],[-120.5197,39.30746],[-120.51947,39.30792],[-120.5193,39.30844],[-120.5186,39.31015],[-120.51848,39.31041],[-120.51831,39.31069],[-120.51802,39.31106],[-120.51774,39.31139],[-120.51729,39.31181],[-120.51692,39.31207],[-120.51648,39.31237],[-120.51598,39.31263],[-120.51545,39.31286],[-120.51497,39.31302],[-120.5147,39.31309],[-120.51433,39.31318],[-120.51396,39.31325],[-120.51335,39.31333],[-120.51291,39.31335],[-120.5125,39.31335],[-120.51194,39.31332],[-120.51144,39.31327],[-120.51081,39.31313],[-120.50687,39.31215],[-120.50626,39.31201],[-120.50576,39.31194],[-120.5051,39.31183],[-120.50456,39.31178],[-120.50394,39.31174],[-120.50338,39.31172],[-120.50102,39.31169],[-120.49945,39.31168],[-120.49891,39.31167],[-120.49631,39.31162],[-120.49177,39.31158],[-120.49064,39.31157],[-120.48999,39.31161],[-120.48938,39.31168],[-120.48826,39.31185],[-120.48598,39.31221],[-120.47689,39.31361],[-120.4744,39.31364],[-120.47095,39.31348],[-120.47067,39.31348],[-120.46979,39.31347],[-120.46927,39.31346],[-120.46839,39.31355],[-120.46354,39.31491],[-120.46217,39.31515],[-120.46097,39.31518],[-120.45833,39.31484],[-120.45798,39.31479],[-120.45154,39.31382],[-120.44941,39.31366],[-120.44856,39.31366],[-120.44758,39.31374],[-120.44587,39.3141],[-120.44501,39.31427],[-120.44185,39.31489],[-120.43689,39.31582],[-120.43621,39.31595],[-120.43427,39.31652],[-120.43039,39.31789],[-120.41971,39.32206],[-120.41756,39.32287],[-120.41641,39.32333],[-120.4159,39.32352],[-120.41536,39.32369],[-120.41489,39.32378],[-120.41436,39.32382],[-120.41366,39.32385],[-120.41284,39.32377],[-120.4115,39.32344],[-120.40938,39.32268],[-120.40817,39.3223],[-120.40702,39.32208],[-120.40586,39.32198],[-120.40492,39.32203],[-120.40378,39.32214],[-120.40176,39.32261],[-120.39913,39.32323],[-120.39716,39.32369],[-120.39596,39.32395],[-120.39472,39.32425],[-120.39386,39.32448],[-120.39315,39.32473],[-120.39243,39.32509],[-120.3918,39.32542],[-120.39008,39.32634],[-120.38939,39.32671],[-120.38862,39.32706],[-120.38777,39.32734],[-120.3869,39.32747],[-120.38605,39.3275],[-120.38514,39.32739],[-120.38429,39.3272],[-120.38224,39.32666],[-120.38164,39.32658],[-120.38103,39.32644],[-120.38076,39.3264],[-120.37935,39.32621],[-120.37607,39.32618],[-120.37279,39.3267],[-120.37135,39.32712],[-120.36783,39.32869],[-120.36596,39.32957],[-120.35638,39.33422],[-120.35546,39.33477],[-120.35221,39.33735],[-120.35136,39.33794],[-120.35082,39.33825],[-120.35001,39.33859],[-120.34932,39.33883],[-120.34765,39.33931],[-120.34652,39.33962],[-120.34279,39.34072],[-120.33775,39.34214],[-120.33692,39.34238],[-120.3362,39.34254],[-120.33548,39.34266],[-120.33457,39.34277],[-120.33371,39.34283],[-120.33284,39.34284],[-120.33192,39.34279],[-120.32983,39.34269],[-120.32699,39.34255],[-120.326,39.34249],[-120.32532,39.34241],[-120.32469,39.34226],[-120.32413,39.3421],[-120.32351,39.34186],[-120.32218,39.34133],[-120.32138,39.34111],[-120.3207,39.34099],[-120.3199,39.34096],[-120.31909,39.34102],[-120.31823,39.34117],[-120.31633,39.34166],[-120.31577,39.34174],[-120.31522,39.34178],[-120.31469,39.34177],[-120.31421,39.34173],[-120.31368,39.34162],[-120.31318,39.34149],[-120.31263,39.34129],[-120.31213,39.34103],[-120.31146,39.34056],[-120.30797,39.33797],[-120.30721,39.33706],[-120.30684,39.3365],[-120.30656,39.33566],[-120.30605,39.33431],[-120.30503,39.33242],[-120.30279,39.32934],[-120.30244,39.32896],[-120.30225,39.32872],[-120.30186,39.32835],[-120.30147,39.32811],[-120.30124,39.32799],[-120.30099,39.32784],[-120.30077,39.32773],[-120.30034,39.32757],[-120.29904,39.32728],[-120.29814,39.32716],[-120.29695,39.32713],[-120.2965,39.32716],[-120.29601,39.32724],[-120.29564,39.3274],[-120.29529,39.32754],[-120.29446,39.32802],[-120.29369,39.32854],[-120.2924,39.32957],[-120.29233,39.32963],[-120.29188,39.33003],[-120.29111,39.33046],[-120.29024,39.33079],[-120.28947,39.33094],[-120.28872,39.33102],[-120.28808,39.33099],[-120.28759,39.33093],[-120.28706,39.33081],[-120.28663,39.33068],[-120.28591,39.33043],[-120.28462,39.33005],[-120.28402,39.32989],[-120.28259,39.32942],[-120.27649,39.32734],[-120.2752,39.3271],[-120.27295,39.32714],[-120.27168,39.32733],[-120.26832,39.32855],[-120.26659,39.32897],[-120.26446,39.32909],[-120.26299,39.32952],[-120.26012,39.33072],[-120.25939,39.33098],[-120.25832,39.33128],[-120.25758,39.33138],[-120.25661,39.33143],[-120.25464,39.33134],[-120.2511,39.33111],[-120.24934,39.33098],[-120.248,39.33089],[-120.24669,39.33071],[-120.24439,39.33023],[-120.24335,39.32991],[-120.24254,39.32957],[-120.24168,39.32911],[-120.24085,39.32851],[-120.23952,39.3275],[-120.23914,39.32722],[-120.23866,39.32688],[-120.23785,39.32645],[-120.23684,39.32609],[-120.23626,39.32593],[-120.23292,39.32519],[-120.23157,39.32497],[-120.22911,39.32462],[-120.2252,39.32417],[-120.22413,39.32401],[-120.22307,39.32388],[-120.22057,39.32357],[-120.21727,39.32318],[-120.21639,39.32309],[-120.21524,39.32305],[-120.21296,39.32304],[-120.21133,39.32302],[-120.20945,39.32301],[-120.208,39.32299],[-120.20735,39.32298],[-120.20566,39.32297],[-120.20379,39.32294],[-120.20253,39.32295],[-120.20173,39.32299],[-120.20087,39.32311],[-120.20023,39.32324],[-120.19952,39.32341],[-120.19758,39.32386],[-120.1962,39.32419],[-120.1954,39.3244],[-120.1946,39.32466],[-120.19365,39.32506],[-120.19272,39.32554],[-120.19205,39.32596],[-120.19149,39.32637],[-120.19111,39.32669],[-120.19086,39.32692],[-120.19058,39.3272],[-120.19016,39.32761],[-120.18961,39.32816],[-120.18904,39.32869],[-120.1886,39.32907],[-120.18816,39.32945],[-120.18771,39.32981],[-120.18692,39.33038],[-120.18629,39.33079],[-120.18553,39.33128],[-120.18411,39.33212],[-120.17952,39.33471],[-120.17912,39.33493],[-120.17861,39.3352],[-120.17829,39.33535],[-120.17814,39.33542],[-120.17777,39.33557],[-120.17736,39.33573],[-120.1771,39.33583],[-120.17627,39.3361],[-120.17567,39.33625],[-120.17485,39.33641],[-120.17404,39.33656],[-120.17186,39.33696],[-120.17063,39.3372],[-120.17001,39.33735],[-120.16939,39.33752],[-120.16878,39.33773],[-120.16809,39.33802],[-120.16762,39.33825],[-120.16652,39.3389],[-120.16574,39.3394],[-120.16266,39.34185],[-120.15874,39.34507],[-120.15838,39.34536],[-120.14863,39.35314],[-120.14651,39.35494],[-120.14612,39.35526],[-120.14484,39.35624],[-120.14393,39.35691],[-120.14356,39.35714],[-120.14293,39.35756],[-120.14234,39.35787],[-120.14157,39.35827],[-120.13984,39.35894],[-120.12706,39.36252],[-120.12603,39.3628],[-120.1238,39.36336],[-120.12277,39.36355],[-120.11989,39.36373],[-120.11937,39.36376],[-120.11886,39.36385],[-120.11822,39.36403],[-120.11765,39.36428],[-120.11717,39.36451],[-120.11676,39.36483],[-120.116,39.36557],[-120.1156,39.36615],[-120.11527,39.36697],[-120.11517,39.36721],[-120.11479,39.36834],[-120.11472,39.36859],[-120.11464,39.36884],[-120.11387,39.37094],[-120.11364,39.37145],[-120.11319,39.37197],[-120.11241,39.37263],[-120.1115,39.37316],[-120.11021,39.37368],[-120.10922,39.37404],[-120.10805,39.37446],[-120.10687,39.37487],[-120.10576,39.37538],[-120.1051,39.37577],[-120.10441,39.37624],[-120.10369,39.37676],[-120.10121,39.37841],[-120.0978,39.38054],[-120.09439,39.38262],[-120.09352,39.38299],[-120.09259,39.38317],[-120.08901,39.38356],[-120.08521,39.38388],[-120.08438,39.38395],[-120.08357,39.38397],[-120.08203,39.38386],[-120.08164,39.38378],[-120.08123,39.38371],[-120.0802,39.38347],[-120.07916,39.38313],[-120.0785,39.38283],[-120.07801,39.38256],[-120.07632,39.38163],[-120.07481,39.38073],[-120.07334,39.37979],[-120.07282,39.37932],[-120.07262,39.37903],[-120.07164,39.37735],[-120.07116,39.3768],[-120.07056,39.37629],[-120.06962,39.37568],[-120.06702,39.37465],[-120.06673,39.37453],[-120.06373,39.37333],[-120.06249,39.37296],[-120.05996,39.37268],[-120.05421,39.37211],[-120.0528,39.37189],[-120.05183,39.37156],[-120.04947,39.37031],[-120.04848,39.36991],[-120.04713,39.36963],[-120.04544,39.36969],[-120.04167,39.37023],[-120.04038,39.37042],[-120.03902,39.37075],[-120.03422,39.37263],[-120.0333,39.37301],[-120.03261,39.37351],[-120.03213,39.37408],[-120.03128,39.37545],[-120.03054,39.37613],[-120.02863,39.37696],[-120.02569,39.3779],[-120.02451,39.37831],[-120.02412,39.37852],[-120.02376,39.3788],[-120.02296,39.37953],[-120.02262,39.38021],[-120.02244,39.38129],[-120.0226,39.38203],[-120.02289,39.38278],[-120.02388,39.38429],[-120.02434,39.38494],[-120.02477,39.38569],[-120.02487,39.38633],[-120.02479,39.38738],[-120.02452,39.38873],[-120.02455,39.38934],[-120.02479,39.38997],[-120.02536,39.39166],[-120.02555,39.39232],[-120.02562,39.39281],[-120.0256,39.39332],[-120.02554,39.39373],[-120.02543,39.39406],[-120.02526,39.39452],[-120.02513,39.39475],[-120.02497,39.39499],[-120.02482,39.39517],[-120.02461,39.39538],[-120.02397,39.39599],[-120.02334,39.39657],[-120.02292,39.39698],[-120.02258,39.39739],[-120.02235,39.39774],[-120.02216,39.3981],[-120.02202,39.39849],[-120.02193,39.39895],[-120.02189,39.3994],[-120.02194,39.39985],[-120.02203,39.40024],[-120.02236,39.40144],[-120.02253,39.40178],[-120.02275,39.40213],[-120.02304,39.40247],[-120.02337,39.40277],[-120.02376,39.40306],[-120.02425,39.40335],[-120.02449,39.40348],[-120.02492,39.40372],[-120.02527,39.40397],[-120.02548,39.40409],[-120.02589,39.40442],[-120.02632,39.40492],[-120.02662,39.4054],[-120.02681,39.40594],[-120.02687,39.40666],[-120.02704,39.40968],[-120.02714,39.41015],[-120.02776,39.41127],[-120.02806,39.41193],[-120.02832,39.41259],[-120.0286,39.41439],[-120.02873,39.41508],[-120.02913,39.4159],[-120.02966,39.41661],[-120.03156,39.41868],[-120.03281,39.42012],[-120.03334,39.42067],[-120.0347,39.42181],[-120.03509,39.4222],[-120.03534,39.42259],[-120.0356,39.42306],[-120.03573,39.42355],[-120.03577,39.42395],[-120.03573,39.42435],[-120.03564,39.42468],[-120.0356,39.4248],[-120.03436,39.42797],[-120.03381,39.42936],[-120.03352,39.43011],[-120.03313,39.43067],[-120.03267,39.43115],[-120.03199,39.43164],[-120.0303,39.43257],[-120.029,39.43335],[-120.02769,39.43418],[-120.02538,39.4357],[-120.02248,39.43761],[-120.02097,39.43859],[-120.01954,39.43954],[-120.01849,39.44023],[-120.018,39.44051],[-120.0175,39.44073],[-120.01673,39.441],[-120.01586,39.44128],[-120.01431,39.44177],[-120.01354,39.44207],[-120.01313,39.44229],[-120.01269,39.44252],[-120.0123,39.44278],[-120.01192,39.44306],[-120.01158,39.44336],[-120.01123,39.44375],[-120.01095,39.44409],[-120.01076,39.4444],[-120.01049,39.44485],[-120.01035,39.44519],[-120.01027,39.44544],[-120.01018,39.44569],[-120.01008,39.44601],[-120.00988,39.4467],[-120.00968,39.44736],[-120.00927,39.44875],[-120.0092,39.4491],[-120.00913,39.44946],[-120.00911,39.44967],[-120.0091,39.44988],[-120.00909,39.45009],[-120.00909,39.45028],[-120.0091,39.45047],[-120.00912,39.45095],[-120.00919,39.45309],[-120.00925,39.45501],[-120.00927,39.45578],[-120.00927,39.45617],[-120.00924,39.45653],[-120.00919,39.45691],[-120.0091,39.45733],[-120.00899,39.4577],[-120.00888,39.45807],[-120.00869,39.45853],[-120.00786,39.46035],[-120.00763,39.46081],[-120.00737,39.46128],[-120.00704,39.46181],[-120.0063,39.46294],[-120.00357,39.46717],[-120.00332,39.46754],[-120.00304,39.4679],[-120.0027,39.46833],[-120.00064,39.47075],[-120.00042,39.47099],[-120.00017,39.47124],[-119.9999,39.47148],[-119.99962,39.47168],[-119.99928,39.47189],[-119.99887,39.47211],[-119.99844,39.47235],[-119.99825,39.47247],[-119.99803,39.47262],[-119.99792,39.4727],[-119.99772,39.47286],[-119.99754,39.47302],[-119.99744,39.47312],[-119.99729,39.4733],[-119.99714,39.47349],[-119.99701,39.47369],[-119.9969,39.4739],[-119.99679,39.47412],[-119.99671,39.47434],[-119.99603,39.47637],[-119.99558,39.47762],[-119.99436,39.48134],[-119.99417,39.48195],[-119.99407,39.48237],[-119.99399,39.48282],[-119.9939,39.48345],[-119.99387,39.48393],[-119.99386,39.48425],[-119.99386,39.48472],[-119.99386,39.48494],[-119.9939,39.48548],[-119.99393,39.48582],[-119.99399,39.48614],[-119.99408,39.48657],[-119.99409,39.4867],[-119.99414,39.4869],[-119.99415,39.48695],[-119.9942,39.48713],[-119.99429,39.48745],[-119.9944,39.48777],[-119.99447,39.48799],[-119.99521,39.48994],[-119.99565,39.49109],[-119.99595,39.49185],[-119.99645,39.4932],[-119.99648,39.49326],[-119.99727,39.49532],[-119.99743,39.49574],[-119.99755,39.49608],[-119.9977,39.49661],[-119.99778,39.49694],[-119.99791,39.4976],[-119.99807,39.49846],[-119.99827,39.49952],[-119.99854,39.50099],[-119.99866,39.50161],[-119.9991,39.50396],[-119.99913,39.50422],[-119.99915,39.5044],[-119.99916,39.50461],[-119.99915,39.50526],[-119.99915,39.50537],[-119.99905,39.50592],[-119.99895,39.50628],[-119.99893,39.50634],[-119.99875,39.50683],[-119.99865,39.50708],[-119.99849,39.50738],[-119.99832,39.50767],[-119.99812,39.50797],[-119.99795,39.50819],[-119.99771,39.50847],[-119.99747,39.50873],[-119.99746,39.50874],[-119.99711,39.50906],[-119.99691,39.50924],[-119.99661,39.50945],[-119.99628,39.50968],[-119.99602,39.50985],[-119.99567,39.51004],[-119.9956,39.51008],[-119.99519,39.51029],[-119.99484,39.51045],[-119.99394,39.5109],[-119.99333,39.51121],[-119.99242,39.51164],[-119.9918,39.51195],[-119.99069,39.51249],[-119.99042,39.51261],[-119.98989,39.51283],[-119.98979,39.51287],[-119.9894,39.51302],[-119.98888,39.51321],[-119.98862,39.5133],[-119.98801,39.51349],[-119.98796,39.5135],[-119.98754,39.51362],[-119.98676,39.5138],[-119.98635,39.51389],[-119.98577,39.514],[-119.98509,39.51411],[-119.98481,39.51414],[-119.98426,39.51421],[-119.98331,39.51428],[-119.98196,39.51431],[-119.98123,39.5143],[-119.98082,39.51428],[-119.9797,39.51418],[-119.97939,39.51414],[-119.97871,39.51405],[-119.97844,39.514],[-119.9776,39.51383],[-119.97095,39.51227],[-119.96352,39.51053],[-119.96283,39.51039],[-119.96256,39.51036],[-119.96234,39.51033],[-119.96213,39.51031],[-119.96171,39.51028],[-119.96142,39.51027],[-119.96087,39.51028],[-119.96051,39.5103],[-119.96025,39.51032],[-119.95932,39.51046],[-119.95911,39.51049],[-119.95838,39.51062],[-119.95464,39.51128],[-119.95391,39.51141],[-119.95346,39.51149],[-119.95134,39.51186],[-119.95101,39.51192],[-119.95077,39.51195],[-119.95037,39.51199],[-119.95011,39.512],[-119.94945,39.51202],[-119.94928,39.51201],[-119.94902,39.512],[-119.94874,39.51198],[-119.9484,39.51195],[-119.94804,39.51189],[-119.94762,39.5118],[-119.94705,39.51165],[-119.94677,39.51155],[-119.94652,39.51147],[-119.94601,39.51129],[-119.94534,39.51103],[-119.9448,39.51082],[-119.94423,39.5106],[-119.94382,39.51045],[-119.94366,39.51039],[-119.94351,39.51034],[-119.94304,39.5102],[-119.94275,39.51011],[-119.94223,39.50998],[-119.94184,39.5099],[-119.94137,39.50981],[-119.94109,39.50977],[-119.94068,39.50972],[-119.94047,39.5097],[-119.94021,39.50968],[-119.93984,39.50965],[-119.93956,39.50964],[-119.93883,39.50965],[-119.93827,39.50967],[-119.93786,39.5097],[-119.93749,39.50974],[-119.93708,39.50979],[-119.93674,39.50985],[-119.9363,39.50994],[-119.93593,39.51002],[-119.93545,39.51014],[-119.93535,39.51017],[-119.93455,39.51043],[-119.93427,39.51053],[-119.93396,39.51066],[-119.93262,39.51124],[-119.9323,39.51139],[-119.93137,39.51179],[-119.92941,39.51268],[-119.92887,39.51292],[-119.92857,39.51307],[-119.92819,39.51325],[-119.92752,39.5136],[-119.92634,39.51424],[-119.92612,39.51436],[-119.92566,39.51463],[-119.92516,39.5149],[-119.92459,39.5152],[-119.92432,39.51533],[-119.92384,39.51555],[-119.9236,39.51563],[-119.92324,39.51575],[-119.92296,39.51583],[-119.92253,39.51592],[-119.92217,39.51599],[-119.92184,39.51603],[-119.92155,39.51606],[-119.92131,39.51607],[-119.92119,39.51608],[-119.92066,39.51608],[-119.92012,39.51605],[-119.91997,39.51603],[-119.91983,39.51601],[-119.91956,39.51598],[-119.91932,39.51593],[-119.91889,39.51584],[-119.91867,39.51579],[-119.91856,39.51576],[-119.91816,39.51566],[-119.91728,39.51542],[-119.91639,39.51519],[-119.91602,39.51509],[-119.91461,39.5147],[-119.91393,39.51453],[-119.912,39.51401],[-119.91146,39.51388],[-119.91081,39.51373],[-119.91021,39.51362],[-119.90966,39.51352],[-119.90926,39.51346],[-119.90883,39.5134],[-119.90868,39.51338],[-119.90823,39.51333],[-119.90775,39.51329],[-119.90768,39.51328],[-119.90682,39.51322],[-119.90661,39.51321],[-119.90597,39.51319],[-119.90555,39.51318],[-119.90512,39.51319],[-119.90412,39.51322],[-119.90409,39.51322],[-119.90392,39.51323],[-119.90354,39.51326],[-119.90305,39.5133],[-119.90228,39.51338],[-119.90225,39.51339],[-119.90169,39.51347],[-119.90074,39.51363],[-119.90013,39.51372],[-119.89766,39.51413],[-119.89658,39.51431],[-119.89624,39.51436],[-119.89476,39.5146],[-119.89342,39.51482],[-119.89212,39.51503],[-119.88818,39.51568],[-119.88797,39.51571],[-119.88768,39.51575],[-119.88748,39.51578],[-119.88707,39.51585],[-119.88668,39.51592],[-119.88596,39.51604],[-119.88221,39.51669],[-119.88193,39.51674],[-119.87952,39.51714],[-119.87744,39.5175],[-119.87669,39.51763],[-119.87599,39.51779],[-119.87548,39.51791],[-119.87506,39.51801],[-119.87472,39.51812],[-119.87436,39.51823],[-119.874,39.51834],[-119.87324,39.51859],[-119.87164,39.51918],[-119.87041,39.51971],[-119.86983,39.51999],[-119.86921,39.5203],[-119.86862,39.52062],[-119.86844,39.52072],[-119.86731,39.52133],[-119.86492,39.52264],[-119.86287,39.52375],[-119.86205,39.52421],[-119.86124,39.52464],[-119.8608,39.52486],[-119.86012,39.52517],[-119.85969,39.52535],[-119.85921,39.52553],[-119.85873,39.52569],[-119.85828,39.52584],[-119.85774,39.52599],[-119.85721,39.52611],[-119.85671,39.52622],[-119.85622,39.52631],[-119.85568,39.52639],[-119.85528,39.52645],[-119.85477,39.5265],[-119.85426,39.52654],[-119.85369,39.52657],[-119.85246,39.52659],[-119.84981,39.52664],[-119.84718,39.52674],[-119.84141,39.52697],[-119.83858,39.52709],[-119.83825,39.5271],[-119.83754,39.52713],[-119.8364,39.52718],[-119.83599,39.52721],[-119.83566,39.52724],[-119.83502,39.52734],[-119.83464,39.52742],[-119.83431,39.52749],[-119.83394,39.52759],[-119.83356,39.5277],[-119.83317,39.52784],[-119.83281,39.52797],[-119.83245,39.52813],[-119.83209,39.5283],[-119.83176,39.52847],[-119.83142,39.52867],[-119.83088,39.52901],[-119.82992,39.52962],[-119.82912,39.53013],[-119.82883,39.5303],[-119.82851,39.53047],[-119.82817,39.53063],[-119.8278,39.53077],[-119.82745,39.53089],[-119.82571,39.53138],[-119.8247,39.53166],[-119.82397,39.53187],[-119.82369,39.53194],[-119.82345,39.53201],[-119.82314,39.53212],[-119.82278,39.53226],[-119.8214,39.53287],[-119.82001,39.53348],[-119.81959,39.53367],[-119.81947,39.53372],[-119.81933,39.53377],[-119.819,39.53388],[-119.81866,39.53398],[-119.81832,39.53407],[-119.81586,39.53453],[-119.81429,39.53482],[-119.81425,39.53483],[-119.81406,39.53487],[-119.81367,39.53496],[-119.8131,39.53512],[-119.81306,39.53513],[-119.81072,39.5359],[-119.8105,39.53597],[-119.81016,39.53608],[-119.80977,39.53619],[-119.80937,39.53629],[-119.80892,39.53639],[-119.80866,39.53643],[-119.80824,39.5365],[-119.80734,39.5366],[-119.80699,39.53662],[-119.806,39.53662],[-119.80587,39.53661],[-119.80367,39.53657],[-119.80305,39.53656],[-119.80222,39.53654],[-119.79907,39.53649],[-119.79881,39.53648],[-119.79822,39.53647],[-119.79775,39.53647],[-119.79689,39.53645],[-119.79627,39.53646],[-119.7956,39.53649],[-119.79473,39.53657],[-119.79363,39.53668],[-119.79207,39.5368],[-119.79101,39.5369],[-119.7897,39.53702],[-119.78877,39.5371],[-119.78827,39.53714],[-119.78772,39.53719],[-119.78746,39.53721],[-119.78664,39.53727],[-119.78591,39.53732],[-119.78548,39.53731],[-119.7851,39.5373],[-119.7847,39.53727],[-119.78441,39.53725],[-119.78408,39.53721],[-119.78379,39.53717],[-119.78316,39.53706],[-119.78259,39.53694],[-119.78226,39.53685],[-119.78177,39.5367],[-119.78136,39.53657],[-119.78094,39.53641],[-119.78039,39.53618],[-119.7797,39.53584],[-119.77926,39.53561],[-119.77854,39.53524],[-119.77791,39.53495],[-119.77752,39.53479],[-119.77717,39.53467],[-119.77673,39.53454],[-119.77653,39.53449],[-119.77626,39.53443],[-119.77581,39.53434],[-119.77501,39.53422],[-119.77318,39.534],[-119.77204,39.5339],[-119.77136,39.53387],[-119.77052,39.53387],[-119.76984,39.53386],[-119.76873,39.53387],[-119.76733,39.53386],[-119.76589,39.53386],[-119.76517,39.53386],[-119.76291,39.53385],[-119.76169,39.53385],[-119.76093,39.53385],[-119.76051,39.53385],[-119.75844,39.53385],[-119.7576,39.53383],[-119.75684,39.53382],[-119.75487,39.53384],[-119.75394,39.53385],[-119.75338,39.53386],[-119.75297,39.53389],[-119.75265,39.53393],[-119.75247,39.53397],[-119.75168,39.53412],[-119.75092,39.53426],[-119.75033,39.53435],[-119.74987,39.5344],[-119.74927,39.53443],[-119.74867,39.53443],[-119.74726,39.53443],[-119.74549,39.53439],[-119.74436,39.53439],[-119.74289,39.53438],[-119.74254,39.53436],[-119.74211,39.53432],[-119.74161,39.53425],[-119.74112,39.53416],[-119.74036,39.53393],[-119.73973,39.53369],[-119.739,39.53337],[-119.73837,39.53309],[-119.73715,39.53257],[-119.73623,39.53216],[-119.73522,39.53172],[-119.73424,39.53129],[-119.73316,39.53083],[-119.73255,39.53057],[-119.73185,39.53032],[-119.73128,39.53013],[-119.73051,39.52991],[-119.72967,39.52969],[-119.72919,39.52959],[-119.72823,39.52942],[-119.72727,39.52929],[-119.72657,39.52921],[-119.72566,39.52913],[-119.72329,39.52889],[-119.72189,39.52876],[-119.72019,39.52857],[-119.71789,39.52832],[-119.71566,39.5281],[-119.71388,39.52791],[-119.71074,39.52758],[-119.7091,39.52742],[-119.70843,39.52735],[-119.70647,39.52715],[-119.70619,39.52713],[-119.70452,39.52692],[-119.7036,39.52679],[-119.70265,39.52664],[-119.70151,39.52642],[-119.70088,39.52629],[-119.69982,39.52604],[-119.69867,39.52574],[-119.6977,39.52547],[-119.6968,39.52519],[-119.69598,39.52491],[-119.69537,39.5247],[-119.69385,39.52415],[-119.6923,39.52358],[-119.69108,39.52312],[-119.69031,39.52279],[-119.68965,39.52248],[-119.6893,39.52229],[-119.68887,39.52206],[-119.68799,39.52151],[-119.68711,39.52092],[-119.68628,39.52028],[-119.6856,39.51977],[-119.68503,39.51933],[-119.68454,39.51889],[-119.68406,39.51836],[-119.68355,39.51779],[-119.68304,39.51727],[-119.68263,39.51692],[-119.68217,39.51656],[-119.68158,39.51616],[-119.68112,39.51589],[-119.68074,39.51569],[-119.67956,39.51511],[-119.67879,39.51474],[-119.6777,39.51421],[-119.67696,39.51385],[-119.67634,39.51357],[-119.67578,39.51334],[-119.67499,39.51309],[-119.67423,39.51291],[-119.67343,39.51274],[-119.67128,39.51224],[-119.66954,39.51182],[-119.66888,39.51165],[-119.66806,39.51143],[-119.66682,39.51107],[-119.66568,39.51075],[-119.66517,39.51064],[-119.66453,39.51051],[-119.66378,39.51039],[-119.66301,39.51031],[-119.66236,39.51026],[-119.66151,39.51024],[-119.66081,39.51026],[-119.66016,39.51029],[-119.65955,39.51034],[-119.65884,39.51043],[-119.65827,39.51053],[-119.65758,39.51067],[-119.65541,39.51107],[-119.65372,39.51137],[-119.65266,39.51152],[-119.65162,39.51165],[-119.65035,39.51179],[-119.64902,39.51194],[-119.64817,39.51203],[-119.64749,39.51214],[-119.6469,39.51227],[-119.64635,39.51247],[-119.64575,39.51273],[-119.64513,39.51302],[-119.64456,39.51326],[-119.64403,39.51345],[-119.64351,39.51359],[-119.64306,39.51368],[-119.64261,39.51374],[-119.64216,39.51378],[-119.64168,39.5138],[-119.64125,39.5138],[-119.64043,39.51379],[-119.63962,39.5138],[-119.63904,39.51383],[-119.63854,39.5139],[-119.63813,39.51399],[-119.63772,39.51408],[-119.63731,39.5142],[-119.63691,39.51433],[-119.63643,39.51453],[-119.63597,39.51476],[-119.63555,39.515],[-119.63513,39.51527],[-119.63331,39.51659],[-119.63273,39.517],[-119.63204,39.51746],[-119.6312,39.51806],[-119.62984,39.51902],[-119.62945,39.51929],[-119.62703,39.52101],[-119.62544,39.52216],[-119.62368,39.52341],[-119.62284,39.52397],[-119.62099,39.52529],[-119.61883,39.52681],[-119.61704,39.52809],[-119.61635,39.52858],[-119.61593,39.52884],[-119.61557,39.52907],[-119.61512,39.5293],[-119.61459,39.52952],[-119.61415,39.52969],[-119.61362,39.52985],[-119.61305,39.53001],[-119.61181,39.53032],[-119.61055,39.53065],[-119.60943,39.53095],[-119.60894,39.5311],[-119.60852,39.53126],[-119.60802,39.53147],[-119.60753,39.53171],[-119.60712,39.53194],[-119.60672,39.53218],[-119.60639,39.53243],[-119.60597,39.53278],[-119.60557,39.53317],[-119.60495,39.53379],[-119.60376,39.53498],[-119.60229,39.53646],[-119.60093,39.53783],[-119.60006,39.5387],[-119.59865,39.54009],[-119.59672,39.54206],[-119.59623,39.54253],[-119.59578,39.54292],[-119.59548,39.54317],[-119.59499,39.54355],[-119.59455,39.54385],[-119.594,39.5442],[-119.59332,39.54461],[-119.59312,39.54472],[-119.59288,39.54485],[-119.59257,39.545],[-119.59231,39.54513],[-119.59206,39.54524],[-119.59177,39.54537],[-119.59152,39.54547],[-119.59126,39.54557],[-119.591,39.54567],[-119.59062,39.54581],[-119.58984,39.54608],[-119.58906,39.54635],[-119.58842,39.54658],[-119.58751,39.5469],[-119.58686,39.54713],[-119.58659,39.54722],[-119.58635,39.54729],[-119.58606,39.54737],[-119.5858,39.54744],[-119.58552,39.5475],[-119.58525,39.54756],[-119.58497,39.5476],[-119.58469,39.54765],[-119.58384,39.54779],[-119.58219,39.54806],[-119.58176,39.54813],[-119.58133,39.5482],[-119.58081,39.5483],[-119.58025,39.54841],[-119.57933,39.54862],[-119.57863,39.54878],[-119.57808,39.54892],[-119.57753,39.54906],[-119.577,39.5492],[-119.57645,39.54936],[-119.57636,39.54939],[-119.5759,39.54953],[-119.5754,39.5497],[-119.57451,39.55],[-119.57372,39.55029],[-119.5731,39.55053],[-119.57259,39.55073],[-119.57185,39.55105],[-119.571,39.55143],[-119.57026,39.55177],[-119.56976,39.55201],[-119.56902,39.55235],[-119.56781,39.55291],[-119.56659,39.55347],[-119.56547,39.55399],[-119.56389,39.55472],[-119.56328,39.55501],[-119.56292,39.55518],[-119.56255,39.55534],[-119.56206,39.55557],[-119.56084,39.55613],[-119.55986,39.55659],[-119.55924,39.55688],[-119.55835,39.55727],[-119.5542,39.55919],[-119.55111,39.56062],[-119.5506,39.56086],[-119.54979,39.5612],[-119.5491,39.56147],[-119.54856,39.56168],[-119.54805,39.56185],[-119.54763,39.56198],[-119.54719,39.56211],[-119.5466,39.56229],[-119.54599,39.56245],[-119.54549,39.56257],[-119.54494,39.5627],[-119.5444,39.56281],[-119.54381,39.56293],[-119.54322,39.56307],[-119.54252,39.56322],[-119.54191,39.56336],[-119.54149,39.56348],[-119.54111,39.5636],[-119.54066,39.56377],[-119.54023,39.56395],[-119.53983,39.56413],[-119.53948,39.56432],[-119.53913,39.5645],[-119.53888,39.56464],[-119.53866,39.56479],[-119.53833,39.565],[-119.53654,39.56616],[-119.53624,39.56636],[-119.53593,39.56655],[-119.53567,39.56671],[-119.53533,39.56689],[-119.53496,39.56708],[-119.53451,39.56727],[-119.5341,39.56744],[-119.53371,39.56759],[-119.53331,39.56771],[-119.53291,39.56784],[-119.53247,39.56795],[-119.53197,39.56806],[-119.53154,39.56813],[-119.53111,39.56819],[-119.53069,39.56825],[-119.53027,39.56828],[-119.52983,39.56831],[-119.52939,39.56831],[-119.52566,39.56824],[-119.52059,39.56815],[-119.5164,39.56807],[-119.51124,39.56796],[-119.50878,39.56792],[-119.5071,39.56788],[-119.50676,39.56788],[-119.50636,39.56786],[-119.50563,39.56783],[-119.5052,39.5678],[-119.50478,39.56776],[-119.50421,39.5677],[-119.50377,39.56765],[-119.50318,39.56759],[-119.49993,39.56724],[-119.49747,39.56698],[-119.4968,39.5669],[-119.49521,39.56674],[-119.49381,39.56659],[-119.49315,39.56651],[-119.4925,39.56644],[-119.49163,39.56637],[-119.49097,39.56633],[-119.49039,39.5663],[-119.48967,39.56628],[-119.48897,39.56627],[-119.48837,39.56626],[-119.48744,39.56627],[-119.48624,39.56631],[-119.48551,39.56635],[-119.48471,39.56641],[-119.48392,39.56647],[-119.48313,39.56656],[-119.4807,39.5669],[-119.47759,39.56734],[-119.47723,39.56742],[-119.47683,39.56752],[-119.4764,39.56765],[-119.47603,39.56778],[-119.47553,39.568],[-119.4751,39.56821],[-119.47461,39.56853],[-119.47427,39.56876],[-119.47392,39.56905],[-119.47349,39.56946],[-119.47312,39.56986],[-119.47283,39.57028],[-119.47259,39.57069],[-119.4724,39.57111],[-119.47226,39.57152],[-119.47216,39.57194],[-119.47211,39.57235],[-119.47209,39.5728],[-119.47213,39.57338],[-119.4722,39.57474],[-119.47222,39.57515],[-119.47221,39.57548],[-119.47216,39.57597],[-119.47209,39.57636],[-119.47199,39.57679],[-119.47185,39.57722],[-119.47168,39.57767],[-119.4713,39.57848],[-119.47057,39.58014],[-119.46968,39.58215],[-119.46911,39.5834],[-119.46891,39.58375],[-119.46869,39.58407],[-119.46842,39.58441],[-119.46807,39.58477],[-119.46773,39.58507],[-119.46733,39.58537],[-119.46689,39.58566],[-119.46643,39.5859],[-119.46608,39.58607],[-119.46438,39.5868],[-119.46389,39.58705],[-119.46347,39.58729],[-119.46302,39.58757],[-119.462,39.58823],[-119.46126,39.58871],[-119.46077,39.58901],[-119.46042,39.58918],[-119.45994,39.5894],[-119.4594,39.58962],[-119.45887,39.5898],[-119.45835,39.58995],[-119.45779,39.59007],[-119.45738,39.59014],[-119.45686,39.59021],[-119.45642,39.59025],[-119.45597,39.59027],[-119.45554,39.59028],[-119.45513,39.59026],[-119.45471,39.59023],[-119.45361,39.59011],[-119.45138,39.58985],[-119.44904,39.5896],[-119.44663,39.58935],[-119.44468,39.58913],[-119.44324,39.58901],[-119.4422,39.58895],[-119.44103,39.58894],[-119.43801,39.589],[-119.43424,39.58907],[-119.43271,39.58911],[-119.42933,39.58918],[-119.42841,39.5892],[-119.42605,39.58926],[-119.42494,39.58932],[-119.42445,39.58937],[-119.42349,39.58948],[-119.42258,39.58963],[-119.42193,39.58976],[-119.42122,39.58991],[-119.42013,39.59014],[-119.41928,39.59032],[-119.41803,39.59058],[-119.41719,39.59077],[-119.4164,39.59094],[-119.41587,39.59105],[-119.41541,39.59112],[-119.41498,39.59118],[-119.41434,39.59126],[-119.41378,39.59131],[-119.41317,39.59134],[-119.41245,39.59135],[-119.41188,39.59133],[-119.41132,39.59131],[-119.40891,39.59114],[-119.40747,39.59102],[-119.40681,39.59095],[-119.40639,39.59089],[-119.4059,39.59082],[-119.40528,39.59071],[-119.40464,39.59057],[-119.40298,39.59018],[-119.40148,39.58978],[-119.40089,39.58963],[-119.4002,39.58948],[-119.39943,39.58931],[-119.39879,39.5892],[-119.398,39.58907],[-119.39732,39.589],[-119.39655,39.58895],[-119.39585,39.58892],[-119.39502,39.58891],[-119.39433,39.58895],[-119.3938,39.589],[-119.39239,39.58916],[-119.39047,39.58955],[-119.38739,39.59022],[-119.38672,39.59036],[-119.3838,39.59097],[-119.38261,39.59104],[-119.38137,39.59094],[-119.37896,39.59022],[-119.37752,39.58985],[-119.37682,39.58977],[-119.3762,39.58978],[-119.37593,39.58979],[-119.37564,39.58981],[-119.37535,39.58984],[-119.37506,39.58988],[-119.37479,39.58993],[-119.37452,39.58998],[-119.37424,39.59005],[-119.37397,39.59013],[-119.37369,39.5902],[-119.37329,39.59032],[-119.37268,39.59049],[-119.36989,39.5913],[-119.36908,39.59163],[-119.36857,39.5919],[-119.36815,39.5921],[-119.36719,39.59305],[-119.36665,39.59367],[-119.36471,39.59574],[-119.36379,39.59633],[-119.36281,39.5968],[-119.3592,39.59798],[-119.35812,39.59821],[-119.35724,39.59828],[-119.35613,39.59827],[-119.35436,39.59811],[-119.35277,39.59805],[-119.35129,39.59809],[-119.34963,39.59828],[-119.34794,39.59858],[-119.34626,39.59906],[-119.34276,39.60017],[-119.33515,39.60265],[-119.33003,39.60429],[-119.32796,39.60498],[-119.32657,39.60556],[-119.3246,39.60651],[-119.31975,39.60968],[-119.31337,39.61406],[-119.31194,39.61482],[-119.31058,39.61539],[-119.30924,39.61588],[-119.30879,39.61601],[-119.30771,39.61629],[-119.30544,39.61671],[-119.29449,39.61755],[-119.29308,39.61766],[-119.2904,39.61787],[-119.28911,39.61798],[-119.28763,39.61808],[-119.28677,39.61812],[-119.286,39.61814],[-119.28499,39.61816],[-119.2828,39.61814],[-119.28106,39.61803],[-119.2791,39.61781],[-119.27418,39.61714],[-119.27231,39.61689],[-119.27059,39.61665],[-119.26958,39.61651],[-119.26859,39.61638],[-119.26746,39.61623],[-119.26571,39.61598],[-119.26476,39.61585],[-119.26326,39.61563],[-119.2631,39.61561],[-119.26233,39.61552],[-119.2605,39.61528],[-119.26002,39.61522],[-119.25947,39.61516],[-119.25875,39.6151],[-119.25804,39.61506],[-119.2572,39.61501],[-119.25642,39.61498],[-119.25548,39.61497],[-119.25453,39.61498],[-119.25343,39.61499],[-119.25201,39.615],[-119.25053,39.61501],[-119.24927,39.61502],[-119.24799,39.61503],[-119.24671,39.61504],[-119.2451,39.61506],[-119.24376,39.61506],[-119.24287,39.61506],[-119.24231,39.61505],[-119.24178,39.61503],[-119.24123,39.61501],[-119.24062,39.61497],[-119.24009,39.61494],[-119.23958,39.61489],[-119.23907,39.61485],[-119.23842,39.61478],[-119.2379,39.61472],[-119.2373,39.61464],[-119.23661,39.61454],[-119.236,39.61446],[-119.23359,39.61414],[-119.23222,39.61395],[-119.23127,39.61383],[-119.23032,39.61369],[-119.22934,39.61356],[-119.22838,39.61343],[-119.22574,39.61308],[-119.22458,39.61293],[-119.22379,39.61285],[-119.22296,39.61279],[-119.2223,39.61277],[-119.22172,39.61276],[-119.22122,39.61278],[-119.2207,39.61279],[-119.22028,39.61282],[-119.21983,39.61285],[-119.21941,39.61289],[-119.21894,39.61295],[-119.21849,39.61302],[-119.21781,39.61313],[-119.21737,39.61322],[-119.21685,39.61333],[-119.21615,39.6135],[-119.21541,39.61371],[-119.21487,39.61388],[-119.21411,39.61415],[-119.21366,39.61433],[-119.21319,39.61452],[-119.21274,39.61471],[-119.21218,39.61499],[-119.21166,39.61526],[-119.211,39.61564],[-119.21057,39.61591],[-119.21007,39.61624],[-119.20937,39.61674],[-119.20874,39.61721],[-119.20802,39.61774],[-119.20718,39.61835],[-119.2062,39.61909],[-119.20491,39.62005],[-119.20388,39.62081],[-119.2028,39.62162],[-119.20178,39.62237],[-119.20027,39.62349],[-119.19917,39.62431],[-119.19849,39.62482],[-119.19783,39.62531],[-119.19714,39.62581],[-119.19649,39.62629],[-119.19589,39.62674],[-119.19309,39.62882],[-119.19178,39.62979],[-119.19099,39.63037],[-119.19031,39.63088],[-119.18963,39.63138],[-119.18854,39.6322],[-119.18727,39.63314],[-119.18676,39.63351],[-119.18626,39.6339],[-119.18593,39.63414],[-119.18564,39.63436],[-119.18513,39.63474],[-119.18461,39.63511],[-119.18408,39.63551],[-119.18324,39.63613],[-119.18192,39.63707],[-119.18095,39.63778],[-119.18003,39.63849],[-119.17921,39.63916],[-119.17544,39.64227],[-119.17085,39.64622],[-119.1667,39.64962],[-119.16464,39.65134],[-119.15767,39.65717],[-119.15414,39.65957],[-119.15035,39.6621],[-119.14366,39.66664],[-119.14218,39.66764],[-119.13907,39.66982],[-119.13367,39.67343],[-119.13008,39.67599],[-119.12177,39.68156],[-119.11285,39.68774],[-119.11127,39.68902],[-119.10999,39.69022],[-119.1085,39.6917],[-119.10729,39.69309],[-119.10281,39.69827],[-119.09833,39.70351],[-119.09638,39.70564],[-119.08939,39.71211],[-119.06586,39.7337],[-119.06481,39.73464],[-119.06338,39.73605],[-119.06237,39.73716],[-119.06051,39.73936],[-119.05999,39.73995],[-119.05545,39.74525],[-119.05145,39.74991],[-119.04704,39.75512],[-119.04393,39.75899],[-119.03812,39.76688],[-119.02645,39.78276],[-119.0237,39.7866],[-119.02173,39.78922],[-119.02075,39.79069],[-119.02063,39.79084],[-119.01904,39.7928],[-119.01703,39.79511],[-119.0141,39.79821],[-119.01312,39.7995],[-119.00438,39.80878],[-119.00093,39.81237],[-118.99982,39.81364],[-118.99781,39.81565],[-118.99624,39.817],[-118.99425,39.81843],[-118.99255,39.81952],[-118.99021,39.82084],[-118.98186,39.82492],[-118.96612,39.83256],[-118.96503,39.83305],[-118.93686,39.84661],[-118.93478,39.84766],[-118.93315,39.84837],[-118.92813,39.85088],[-118.92808,39.85091],[-118.91091,39.85913],[-118.89752,39.86554],[-118.89221,39.86808],[-118.88781,39.87025],[-118.88642,39.87098],[-118.88513,39.87168],[-118.88151,39.87403],[-118.87796,39.87633],[-118.875,39.87817],[-118.86951,39.88166],[-118.8656,39.88414],[-118.86213,39.88638],[-118.85833,39.88885],[-118.85069,39.89376],[-118.8393,39.90107],[-118.82678,39.90911],[-118.82255,39.91178],[-118.82136,39.91263],[-118.8212,39.91273],[-118.81965,39.9137],[-118.81821,39.91451],[-118.81653,39.91532],[-118.81394,39.91648],[-118.81168,39.91736],[-118.80441,39.92014],[-118.79992,39.92201],[-118.79037,39.92589],[-118.77857,39.9305],[-118.76772,39.93474],[-118.75257,39.94067],[-118.74895,39.94214],[-118.74856,39.94229],[-118.74455,39.94384],[-118.72684,39.95085],[-118.72046,39.95334],[-118.71506,39.95547],[-118.71057,39.95726],[-118.70907,39.95787],[-118.70791,39.95849],[-118.70669,39.95924],[-118.70527,39.96029],[-118.70356,39.96198],[-118.70077,39.96536],[-118.70041,39.9658],[-118.69839,39.96829],[-118.69711,39.97003],[-118.6967,39.97049],[-118.69666,39.97053],[-118.6931,39.97506],[-118.6918,39.9766],[-118.68893,39.98001],[-118.68534,39.98476],[-118.6842,39.98619],[-118.68351,39.98726],[-118.68297,39.9884],[-118.68224,39.99056],[-118.68121,39.99477],[-118.6802,39.99852],[-118.68015,39.99872],[-118.67985,39.99999],[-118.67889,40.0038],[-118.67856,40.0051],[-118.67754,40.00918],[-118.67732,40.01004],[-118.677,40.01137],[-118.67528,40.01821],[-118.67441,40.02163],[-118.67417,40.02239],[-118.67402,40.02282],[-118.67364,40.02381],[-118.67303,40.02515],[-118.6728,40.0256],[-118.67241,40.02632],[-118.67171,40.02756],[-118.67151,40.02789],[-118.66832,40.03346],[-118.66646,40.03669],[-118.6618,40.04476],[-118.65779,40.0517],[-118.65731,40.05256],[-118.65699,40.05311],[-118.65626,40.05431],[-118.65539,40.0556],[-118.65457,40.05669],[-118.65404,40.05748],[-118.65314,40.05857],[-118.65233,40.05949],[-118.65137,40.06052],[-118.65118,40.06073],[-118.65059,40.0613],[-118.64912,40.06262],[-118.64792,40.06369],[-118.64736,40.06414],[-118.64637,40.06495],[-118.64562,40.0655],[-118.64543,40.06565],[-118.63896,40.0701],[-118.63653,40.07177],[-118.63493,40.07287],[-118.63355,40.07376],[-118.63231,40.07452],[-118.63136,40.07509],[-118.62935,40.07622],[-118.6273,40.07728],[-118.62619,40.07781],[-118.62538,40.07818],[-118.62378,40.07889],[-118.62266,40.07937],[-118.61924,40.08084],[-118.61341,40.08337],[-118.60381,40.08753],[-118.60252,40.0881],[-118.59938,40.08945],[-118.58685,40.09488],[-118.58532,40.09554],[-118.58102,40.09741],[-118.57408,40.10041],[-118.56138,40.10591],[-118.55773,40.1075],[-118.55605,40.10827],[-118.55526,40.10867],[-118.5539,40.10941],[-118.55139,40.11089],[-118.54741,40.11323],[-118.54675,40.11362],[-118.54131,40.11685],[-118.53833,40.11859],[-118.53386,40.12122],[-118.52945,40.12387],[-118.52855,40.12438],[-118.5234,40.12745],[-118.52165,40.12852],[-118.51796,40.13091],[-118.51767,40.13109],[-118.51509,40.13274],[-118.51425,40.13329],[-118.51122,40.13525],[-118.51016,40.13597],[-118.50819,40.13724],[-118.50741,40.13778],[-118.50605,40.13874],[-118.50585,40.1389],[-118.50554,40.13913],[-118.50473,40.13978],[-118.50432,40.14016],[-118.50396,40.14051],[-118.50349,40.14092],[-118.50299,40.14137],[-118.50191,40.14247],[-118.50132,40.1431],[-118.50082,40.14367],[-118.50018,40.14444],[-118.49971,40.14503],[-118.49921,40.14569],[-118.49827,40.14696],[-118.49775,40.14766],[-118.49726,40.14834],[-118.49564,40.15056],[-118.49295,40.1542],[-118.49242,40.15491],[-118.49183,40.15576],[-118.49043,40.1582],[-118.49037,40.15831],[-118.48918,40.1602],[-118.48792,40.16236],[-118.48718,40.16366],[-118.48634,40.16508],[-118.48608,40.16548],[-118.4859,40.16573],[-118.48573,40.16594],[-118.48569,40.16599],[-118.48524,40.16653],[-118.48498,40.16681],[-118.4847,40.16708],[-118.48403,40.16767],[-118.48375,40.16788],[-118.48367,40.16794],[-118.4832,40.16827],[-118.48241,40.16877],[-118.48198,40.16903],[-118.48109,40.16947],[-118.48081,40.16961],[-118.47921,40.17033],[-118.47849,40.17067],[-118.47794,40.17097],[-118.47749,40.17123],[-118.47645,40.17195],[-118.47598,40.17232],[-118.47564,40.17261],[-118.47541,40.17283],[-118.47538,40.17286],[-118.4752,40.17303],[-118.47479,40.17348],[-118.47436,40.174],[-118.47401,40.17446],[-118.47268,40.17629],[-118.47248,40.17656],[-118.4721,40.17707],[-118.47155,40.17783],[-118.4712,40.17837],[-118.47094,40.1787],[-118.47028,40.17954],[-118.47016,40.17972],[-118.46992,40.18004],[-118.46937,40.1808],[-118.46877,40.18161],[-118.46777,40.18299],[-118.46722,40.18375],[-118.4663,40.18497],[-118.4662,40.18513],[-118.46561,40.18592],[-118.46523,40.18637],[-118.46505,40.18657],[-118.46501,40.18662],[-118.46489,40.18674],[-118.46447,40.18715],[-118.46417,40.18741],[-118.46401,40.18754],[-118.46394,40.1876],[-118.46337,40.18806],[-118.46321,40.18817],[-118.46291,40.18837],[-118.46223,40.18879],[-118.46164,40.18911],[-118.46141,40.18923],[-118.46065,40.18959],[-118.46021,40.18977],[-118.45969,40.18995],[-118.45932,40.19005],[-118.45868,40.19024],[-118.45697,40.19074],[-118.4561,40.191],[-118.45485,40.19138],[-118.44963,40.19291],[-118.44848,40.19325],[-118.44827,40.19332],[-118.44821,40.19333],[-118.44809,40.19337],[-118.44609,40.19397],[-118.44019,40.19568],[-118.43882,40.19611],[-118.43817,40.19634],[-118.43739,40.19663],[-118.4366,40.19695],[-118.43499,40.19765],[-118.43403,40.19811],[-118.4326,40.19884],[-118.43173,40.19932],[-118.4313,40.19958],[-118.42982,40.20052],[-118.42918,40.20094],[-118.42836,40.20153],[-118.42758,40.20214],[-118.42661,40.20294],[-118.42576,40.20368],[-118.4251,40.20429],[-118.42451,40.20488],[-118.42312,40.20633],[-118.42249,40.207],[-118.421,40.20854],[-118.41331,40.21657],[-118.41245,40.21745],[-118.40618,40.22399],[-118.40512,40.22511],[-118.40458,40.22567],[-118.40445,40.2258],[-118.40347,40.22678],[-118.39739,40.23311],[-118.39581,40.23475],[-118.39433,40.23627],[-118.39273,40.23795],[-118.39162,40.23915],[-118.39018,40.24063],[-118.38911,40.24171],[-118.38602,40.24488],[-118.38394,40.24706],[-118.38173,40.2494],[-118.38007,40.25107],[-118.37998,40.25117],[-118.3778,40.25349],[-118.37772,40.25358],[-118.37673,40.2546],[-118.37644,40.2549],[-118.37606,40.25533],[-118.3752,40.25638],[-118.37493,40.25676],[-118.37389,40.25829],[-118.37347,40.25898],[-118.37243,40.26063],[-118.37187,40.26158],[-118.37152,40.2621],[-118.36672,40.26981],[-118.36585,40.27118],[-118.36576,40.27132],[-118.36352,40.27486],[-118.35981,40.28081],[-118.35953,40.28127],[-118.35908,40.28199],[-118.35855,40.28283],[-118.35809,40.28354],[-118.35662,40.28593],[-118.35526,40.2881],[-118.35429,40.28965],[-118.35335,40.29109],[-118.35226,40.29265],[-118.35195,40.29307],[-118.35165,40.29346],[-118.3514,40.29376],[-118.35118,40.29403],[-118.35051,40.29487],[-118.35015,40.29535],[-118.34856,40.29735],[-118.34088,40.30722],[-118.33573,40.31359],[-118.33408,40.31572],[-118.33282,40.31735],[-118.33103,40.31954],[-118.32704,40.32465],[-118.32466,40.3277],[-118.32215,40.33097],[-118.31944,40.33443],[-118.3193,40.3346],[-118.3174,40.33693],[-118.31457,40.34056],[-118.31415,40.34115],[-118.31378,40.34169],[-118.31327,40.34246],[-118.31295,40.34299],[-118.3126,40.34359],[-118.31226,40.34421],[-118.31189,40.34496],[-118.31168,40.34541],[-118.31115,40.34664],[-118.31105,40.34691],[-118.31084,40.34748],[-118.31068,40.34799],[-118.3106,40.34825],[-118.31037,40.34915],[-118.30985,40.35146],[-118.30965,40.35236],[-118.30931,40.3538],[-118.30889,40.3557],[-118.30828,40.35831],[-118.30785,40.36024],[-118.30774,40.36067],[-118.30752,40.36162],[-118.3074,40.36214],[-118.3058,40.36917],[-118.30545,40.37069],[-118.30524,40.37154],[-118.30521,40.37167],[-118.30445,40.37503],[-118.30415,40.37634],[-118.30376,40.378],[-118.30358,40.37884],[-118.30339,40.37965],[-118.3021,40.38531],[-118.3017,40.38697],[-118.30147,40.388],[-118.30054,40.39208],[-118.29881,40.39969],[-118.29698,40.40761],[-118.29497,40.41627],[-118.29208,40.42906],[-118.29198,40.42947],[-118.29168,40.43074],[-118.29072,40.43485],[-118.28977,40.43893],[-118.28964,40.43954],[-118.28927,40.44116],[-118.28747,40.44901],[-118.28679,40.452],[-118.28652,40.45312],[-118.28629,40.45413],[-118.28608,40.45503],[-118.28588,40.45615],[-118.28571,40.4573],[-118.2853,40.4616],[-118.28477,40.46697],[-118.28476,40.46708],[-118.28474,40.46728],[-118.28435,40.47219],[-118.28316,40.48458],[-118.2807,40.51083],[-118.27737,40.54605],[-118.27649,40.55522],[-118.27625,40.55679],[-118.27593,40.55816],[-118.27552,40.55951],[-118.27505,40.56076],[-118.27449,40.56208],[-118.27396,40.56313],[-118.27311,40.5646],[-118.27212,40.56619],[-118.26664,40.57509],[-118.26255,40.58173],[-118.2566,40.59138],[-118.25441,40.59495],[-118.25423,40.59525],[-118.25191,40.59898],[-118.25092,40.60058],[-118.25018,40.60151],[-118.24954,40.60244],[-118.24861,40.60352],[-118.24798,40.60426],[-118.24703,40.60515],[-118.24608,40.60602],[-118.24449,40.60736],[-118.24334,40.60828],[-118.24286,40.60862],[-118.24205,40.60925],[-118.24175,40.60948],[-118.23978,40.61094],[-118.23909,40.61147],[-118.23873,40.61174],[-118.23838,40.61201],[-118.23815,40.61219],[-118.23716,40.61295],[-118.23652,40.61342],[-118.23593,40.61385],[-118.23426,40.61514],[-118.23339,40.61578],[-118.23266,40.61637],[-118.23227,40.61666],[-118.22935,40.61887],[-118.22884,40.61928],[-118.2281,40.61982],[-118.22556,40.62173],[-118.22495,40.6222],[-118.22342,40.62335],[-118.22246,40.62406],[-118.22202,40.62441],[-118.22166,40.62468],[-118.22107,40.62513],[-118.22008,40.62587],[-118.21829,40.6272],[-118.21775,40.62761],[-118.21723,40.62799],[-118.21711,40.62808],[-118.21666,40.6284],[-118.21606,40.62885],[-118.21572,40.62912],[-118.21267,40.63142],[-118.21156,40.63221],[-118.21067,40.63278],[-118.2092,40.63368],[-118.20883,40.63388],[-118.20745,40.63459],[-118.20623,40.6352],[-118.20512,40.6357],[-118.20509,40.63572],[-118.20167,40.63722],[-118.20089,40.63758],[-118.19909,40.63838],[-118.19846,40.63866],[-118.19554,40.63995],[-118.19495,40.64021],[-118.19456,40.64038],[-118.19453,40.6404],[-118.19437,40.64047],[-118.19377,40.64072],[-118.19322,40.64098],[-118.19288,40.64112],[-118.19138,40.6418],[-118.18931,40.64271],[-118.18852,40.64307],[-118.1876,40.64347],[-118.18468,40.64478],[-118.17889,40.64734],[-118.17783,40.64779],[-118.17618,40.64841],[-118.17555,40.64863],[-118.17448,40.64898],[-118.17365,40.64923],[-118.1726,40.64952],[-118.17145,40.64985],[-118.1699,40.65028],[-118.16928,40.65047],[-118.16803,40.65082],[-118.1668,40.65117],[-118.1653,40.65162],[-118.16347,40.65214],[-118.15701,40.65394],[-118.15195,40.65531],[-118.14611,40.65697],[-118.14575,40.65707],[-118.13968,40.65875],[-118.13745,40.65933],[-118.12121,40.66392],[-118.11468,40.66579],[-118.10618,40.6682],[-118.09299,40.67185],[-118.08578,40.67389],[-118.07977,40.67547],[-118.07658,40.67636],[-118.07333,40.67726],[-118.0709,40.67798],[-118.06979,40.67837],[-118.06901,40.67871],[-118.06868,40.67886],[-118.06805,40.6791],[-118.06698,40.67962],[-118.06612,40.68007],[-118.06492,40.68074],[-118.06403,40.6813],[-118.06272,40.68227],[-118.06199,40.68285],[-118.06085,40.68386],[-118.05993,40.68477],[-118.05902,40.68572],[-118.05838,40.68656],[-118.05756,40.68773],[-118.05342,40.69499],[-118.05322,40.69533],[-118.05078,40.69955],[-118.05058,40.69991],[-118.04949,40.70168],[-118.04583,40.70815],[-118.04135,40.7158],[-118.03657,40.72407],[-118.03168,40.73259],[-118.02766,40.73954],[-118.02326,40.74723],[-118.01918,40.75428],[-118.0145,40.76241],[-118.00964,40.77081],[-118.00559,40.77781],[-118.00196,40.78418],[-118.00167,40.78469],[-117.99994,40.78779],[-117.99975,40.7881],[-117.99817,40.79075],[-117.99652,40.79351],[-117.99346,40.79889],[-117.989,40.80657],[-117.98492,40.81365],[-117.98136,40.81982],[-117.97771,40.82617],[-117.97668,40.828],[-117.97599,40.82916],[-117.97529,40.83021],[-117.97462,40.83122],[-117.97314,40.83312],[-117.96689,40.84048],[-117.96151,40.84679],[-117.95514,40.85431],[-117.95279,40.85713],[-117.9507,40.85964],[-117.94923,40.86137],[-117.9482,40.86258],[-117.94673,40.86433],[-117.94482,40.86657],[-117.94419,40.86731],[-117.94371,40.8679],[-117.94339,40.86827],[-117.94282,40.86894],[-117.94165,40.87031],[-117.94097,40.87113],[-117.94052,40.87165],[-117.93982,40.87241],[-117.93953,40.8727],[-117.93913,40.8731],[-117.93884,40.87337],[-117.93837,40.87382],[-117.9373,40.87475],[-117.93683,40.87514],[-117.9366,40.87531],[-117.93636,40.8755],[-117.9361,40.8757],[-117.93588,40.87587],[-117.93545,40.87616],[-117.93527,40.8763],[-117.93486,40.87659],[-117.93456,40.87679],[-117.9339,40.87721],[-117.93363,40.87738],[-117.93333,40.87757],[-117.93303,40.87774],[-117.93246,40.87808],[-117.93213,40.87826],[-117.93134,40.8787],[-117.93089,40.87893],[-117.92953,40.8796],[-117.92883,40.87991],[-117.92838,40.88011],[-117.92772,40.88041],[-117.9264,40.88098],[-117.92594,40.88119],[-117.92549,40.88138],[-117.92489,40.88165],[-117.9232,40.88239],[-117.92106,40.88335],[-117.91907,40.88422],[-117.91679,40.88523],[-117.91471,40.88615],[-117.91424,40.88635],[-117.91384,40.88654],[-117.91091,40.88782],[-117.91018,40.88815],[-117.90851,40.88888],[-117.90817,40.88904],[-117.90597,40.89001],[-117.90507,40.89041],[-117.89473,40.89495],[-117.88657,40.89857],[-117.86131,40.90975],[-117.85881,40.91075],[-117.85151,40.91315],[-117.81745,40.92411],[-117.81702,40.92425],[-117.80957,40.92666],[-117.80785,40.92722],[-117.80724,40.92744],[-117.80634,40.92779],[-117.80581,40.92801],[-117.80451,40.92857],[-117.8035,40.92905],[-117.80044,40.9306],[-117.79801,40.93184],[-117.7965,40.93261],[-117.7934,40.93417],[-117.78781,40.937],[-117.78325,40.93934],[-117.78099,40.94048],[-117.78047,40.94074],[-117.77961,40.94115],[-117.77921,40.94133],[-117.77789,40.94186],[-117.77747,40.94201],[-117.77719,40.94212],[-117.77656,40.94231],[-117.77528,40.94267],[-117.76634,40.94483],[-117.7655,40.94504],[-117.76459,40.94528],[-117.76427,40.94537],[-117.76356,40.94558],[-117.76294,40.94579],[-117.76218,40.94607],[-117.76148,40.94635],[-117.76097,40.94657],[-117.76052,40.94678],[-117.75966,40.9472],[-117.75952,40.94727],[-117.75868,40.94774],[-117.75847,40.94787],[-117.758,40.94816],[-117.75785,40.94826],[-117.7574,40.94856],[-117.75719,40.9487],[-117.75639,40.94928],[-117.75616,40.94946],[-117.75553,40.94998],[-117.75523,40.95025],[-117.75498,40.95048],[-117.75465,40.9508],[-117.75437,40.9511],[-117.75422,40.95125],[-117.75417,40.95132],[-117.75366,40.95189],[-117.75346,40.95213],[-117.75309,40.95261],[-117.75267,40.95321],[-117.75247,40.95352],[-117.75233,40.95373],[-117.75217,40.954],[-117.75178,40.95469],[-117.75165,40.95495],[-117.75055,40.95729],[-117.74925,40.96005],[-117.74906,40.96043],[-117.7469,40.96505],[-117.74667,40.96553],[-117.74513,40.96883],[-117.74492,40.96925],[-117.7447,40.96964],[-117.74446,40.97003],[-117.74426,40.97033],[-117.74392,40.97078],[-117.74378,40.97096],[-117.74347,40.97132],[-117.74341,40.97138],[-117.74312,40.97169],[-117.7428,40.972],[-117.7426,40.97219],[-117.7424,40.97236],[-117.74196,40.97272],[-117.74161,40.97299],[-117.74136,40.97317],[-117.74097,40.97343],[-117.74009,40.97403],[-117.73746,40.97572],[-117.73643,40.97636],[-117.73595,40.97667],[-117.73478,40.97744],[-117.73408,40.9779],[-117.73369,40.97813],[-117.73305,40.9785],[-117.73253,40.97877],[-117.73218,40.97894],[-117.73151,40.97926],[-117.73116,40.97941],[-117.73069,40.97961],[-117.73012,40.97983],[-117.72945,40.98007],[-117.72888,40.98026],[-117.72853,40.98037],[-117.72744,40.98068],[-117.72675,40.98084],[-117.72612,40.98098],[-117.72555,40.9811],[-117.72541,40.98113],[-117.72355,40.98148],[-117.72151,40.9819],[-117.72008,40.98217],[-117.7017,40.98576],[-117.68772,40.98849],[-117.68533,40.98903],[-117.68397,40.9894],[-117.68089,40.9904],[-117.63893,41.00712],[-117.63621,41.00819],[-117.62618,41.01219],[-117.62352,41.01324],[-117.62058,41.01442],[-117.60433,41.0209],[-117.59359,41.02517],[-117.59244,41.02556],[-117.59114,41.02581],[-117.58971,41.02592],[-117.58824,41.02586],[-117.58701,41.02567],[-117.58634,41.0255],[-117.58532,41.02516],[-117.58467,41.02488],[-117.58357,41.02428],[-117.58272,41.02365],[-117.58131,41.02227],[-117.57865,41.01962],[-117.57846,41.01943],[-117.57676,41.01774],[-117.57567,41.01662],[-117.55495,40.99597],[-117.54605,40.98709],[-117.54487,40.986],[-117.5436,40.98494],[-117.49603,40.95035],[-117.49337,40.94844],[-117.49252,40.94791],[-117.49133,40.94725],[-117.49015,40.9467],[-117.4888,40.94617],[-117.48577,40.94519],[-117.44486,40.93213],[-117.43157,40.92781],[-117.42984,40.92732],[-117.42899,40.92716],[-117.42781,40.92702],[-117.42652,40.92699],[-117.42553,40.92704],[-117.42405,40.92724],[-117.42305,40.92749],[-117.41822,40.92903],[-117.41682,40.92938],[-117.41586,40.92949],[-117.41463,40.92949],[-117.41337,40.92931],[-117.41267,40.92915],[-117.41162,40.92878],[-117.41078,40.92835],[-117.40081,40.92228],[-117.39943,40.92153],[-117.39812,40.92107],[-117.3969,40.92081],[-117.39556,40.92066],[-117.39433,40.92063],[-117.3923,40.92089],[-117.38713,40.92168],[-117.38284,40.92233],[-117.38119,40.92244],[-117.37993,40.92242],[-117.37881,40.92232],[-117.37791,40.92221],[-117.37654,40.92195],[-117.37492,40.92153],[-117.37415,40.92125],[-117.3634,40.91676],[-117.36171,40.91625],[-117.35974,40.91588],[-117.35799,40.91573],[-117.35623,40.91575],[-117.35541,40.91581],[-117.34817,40.91672],[-117.34693,40.91681],[-117.34476,40.91679],[-117.3432,40.91661],[-117.34222,40.91643],[-117.34042,40.91595],[-117.33937,40.91557],[-117.3234,40.90912],[-117.32189,40.9085],[-117.31625,40.90623],[-117.309,40.90267],[-117.30726,40.90176],[-117.3014,40.89889],[-117.29837,40.89735],[-117.298,40.89716],[-117.29725,40.89679],[-117.29196,40.8942],[-117.25299,40.87485],[-117.20762,40.85231],[-117.20606,40.85149],[-117.20366,40.85004],[-117.20189,40.84879],[-117.1941,40.84273],[-117.1912,40.84041],[-117.19083,40.84012],[-117.19076,40.84007],[-117.19029,40.8397],[-117.18677,40.83695],[-117.15198,40.80983],[-117.13302,40.79498],[-117.1291,40.79191],[-117.12879,40.79167],[-117.12768,40.79087],[-117.12492,40.78866],[-117.12266,40.78691],[-117.11592,40.78161],[-117.11127,40.77797],[-117.10324,40.77171],[-117.09207,40.76296],[-117.06907,40.74501],[-117.05917,40.73724],[-117.05536,40.73417],[-117.05521,40.73405],[-117.05236,40.73179],[-117.03477,40.71805],[-117.01822,40.70507],[-117.01786,40.7048],[-116.98652,40.68033],[-116.96281,40.66177],[-116.96184,40.66089],[-116.96086,40.65992],[-116.95992,40.65897],[-116.95911,40.65806],[-116.95854,40.65731],[-116.9576,40.65601],[-116.95584,40.65321],[-116.95537,40.65234],[-116.94827,40.63917],[-116.94774,40.63827],[-116.94719,40.63746],[-116.94623,40.63631],[-116.94551,40.63559],[-116.94412,40.63446],[-116.94223,40.63315],[-116.94176,40.63289],[-116.94101,40.63253],[-116.9391,40.63172],[-116.91838,40.62387],[-116.90936,40.62044],[-116.90214,40.61771],[-116.90023,40.617],[-116.89934,40.61669],[-116.89843,40.61641],[-116.8967,40.6159],[-116.8949,40.61543],[-116.89147,40.61475],[-116.88959,40.61448],[-116.88769,40.61427],[-116.88579,40.61412],[-116.88383,40.61401],[-116.8817,40.6139],[-116.8796,40.61377],[-116.83675,40.6113],[-116.83427,40.61118],[-116.82263,40.61051],[-116.82072,40.61043],[-116.81877,40.61043],[-116.81512,40.61051],[-116.81246,40.61077],[-116.8094,40.61128],[-116.80546,40.61214],[-116.80203,40.61315],[-116.79937,40.6141],[-116.79495,40.61608],[-116.79207,40.61768],[-116.7898,40.61928],[-116.78692,40.62159],[-116.78398,40.62452],[-116.77483,40.63579],[-116.77208,40.63914],[-116.76956,40.64217],[-116.76827,40.64375],[-116.76667,40.64567],[-116.76523,40.64714],[-116.76338,40.64886],[-116.76154,40.65038],[-116.7596,40.65184],[-116.7577,40.65307],[-116.75521,40.65448],[-116.75336,40.65546],[-116.75105,40.65652],[-116.748,40.65777],[-116.73928,40.66124],[-116.73538,40.66281],[-116.735,40.66297],[-116.73198,40.66416],[-116.71714,40.6701],[-116.71519,40.67075],[-116.71231,40.67162],[-116.71104,40.67192],[-116.70979,40.67217],[-116.70735,40.67257],[-116.70601,40.67273],[-116.70472,40.67283],[-116.70226,40.67297],[-116.69672,40.67295],[-116.68305,40.6729],[-116.66376,40.67281],[-116.64729,40.6727],[-116.64482,40.67276],[-116.64285,40.67291],[-116.63981,40.67328],[-116.63708,40.67377],[-116.63403,40.67446],[-116.63133,40.67519],[-116.62276,40.67763],[-116.59576,40.68528],[-116.5634,40.69449],[-116.56217,40.69484],[-116.56091,40.69517],[-116.56014,40.69534],[-116.55724,40.69594],[-116.55677,40.69604],[-116.55035,40.69728],[-116.53823,40.69967],[-116.53673,40.69994],[-116.53628,40.69999],[-116.53581,40.70005],[-116.53525,40.7001],[-116.53444,40.70015],[-116.5341,40.70017],[-116.53322,40.70019],[-116.53257,40.70018],[-116.53227,40.70017],[-116.53146,40.70012],[-116.53073,40.70006],[-116.53025,40.7],[-116.51688,40.69829],[-116.51613,40.69818],[-116.51364,40.69785],[-116.51293,40.69774],[-116.51115,40.69738],[-116.50992,40.69713],[-116.50911,40.69696],[-116.50778,40.69665],[-116.50704,40.69646],[-116.50637,40.69628],[-116.50587,40.69615],[-116.5056,40.69606],[-116.50524,40.69594],[-116.50511,40.6959],[-116.50394,40.69553],[-116.50254,40.69506],[-116.50153,40.69469],[-116.49937,40.6938],[-116.49799,40.69318],[-116.49737,40.69288],[-116.49622,40.69232],[-116.49394,40.69104],[-116.46876,40.67575],[-116.46798,40.67529],[-116.46721,40.67484],[-116.46643,40.67441],[-116.46563,40.67399],[-116.46433,40.67335],[-116.44686,40.6647],[-116.44598,40.66429],[-116.44514,40.66394],[-116.4443,40.66362],[-116.44355,40.66335],[-116.44196,40.66288],[-116.44106,40.66266],[-116.44046,40.66252],[-116.44005,40.66244],[-116.43924,40.66229],[-116.43861,40.66219],[-116.43769,40.66207],[-116.43583,40.66187],[-116.41275,40.65956],[-116.4115,40.65942],[-116.41086,40.65933],[-116.41022,40.65923],[-116.40967,40.65914],[-116.40925,40.65906],[-116.40854,40.65893],[-116.40789,40.65879],[-116.40657,40.6585],[-116.40583,40.65831],[-116.40513,40.65812],[-116.40442,40.65791],[-116.404,40.65779],[-116.40303,40.65747],[-116.40253,40.6573],[-116.37281,40.64682],[-116.37249,40.64671],[-116.372,40.64655],[-116.37111,40.64625],[-116.36708,40.64504],[-116.3637,40.64401],[-116.3629,40.64378],[-116.36137,40.64331],[-116.36068,40.64309],[-116.35993,40.64285],[-116.35926,40.64265],[-116.35864,40.64245],[-116.35818,40.64231],[-116.35701,40.64195],[-116.35625,40.64171],[-116.35484,40.64129],[-116.35408,40.64106],[-116.35281,40.64068],[-116.3522,40.64049],[-116.35156,40.6403],[-116.35081,40.64006],[-116.34853,40.63935],[-116.34778,40.63913],[-116.34702,40.63889],[-116.34653,40.63874],[-116.3447,40.63819],[-116.34396,40.63799],[-116.34364,40.63792],[-116.34317,40.63783],[-116.34253,40.63773],[-116.34227,40.6377],[-116.34144,40.63763],[-116.34079,40.63759],[-116.3402,40.63758],[-116.33997,40.63757],[-116.33952,40.63759],[-116.33879,40.63763],[-116.33829,40.63767],[-116.33798,40.6377],[-116.33769,40.63774],[-116.33733,40.6378],[-116.33663,40.63794],[-116.33619,40.63804],[-116.33566,40.63819],[-116.33517,40.63834],[-116.33459,40.63853],[-116.33403,40.63875],[-116.33353,40.63897],[-116.33325,40.6391],[-116.33239,40.6395],[-116.33186,40.63974],[-116.33081,40.64019],[-116.32972,40.64066],[-116.32958,40.64073],[-116.32897,40.641],[-116.32824,40.64135],[-116.32745,40.64171],[-116.32665,40.64207],[-116.32583,40.64244],[-116.32512,40.64277],[-116.32438,40.6431],[-116.32363,40.64342],[-116.32226,40.64396],[-116.32123,40.64431],[-116.32096,40.64439],[-116.32023,40.64459],[-116.31936,40.6448],[-116.31911,40.64485],[-116.31868,40.64494],[-116.31832,40.64499],[-116.31755,40.64514],[-116.31742,40.64516],[-116.31724,40.64519],[-116.31691,40.64523],[-116.31594,40.64534],[-116.31477,40.64542],[-116.31401,40.6455],[-116.31363,40.64554],[-116.31322,40.64559],[-116.31271,40.64568],[-116.31177,40.64587],[-116.31091,40.64607],[-116.31064,40.64615],[-116.30963,40.64644],[-116.30942,40.64651],[-116.30919,40.64659],[-116.30895,40.64668],[-116.30888,40.64671],[-116.30833,40.64692],[-116.30786,40.64712],[-116.3049,40.64841],[-116.30318,40.64916],[-116.30285,40.64931],[-116.30252,40.64944],[-116.30226,40.64953],[-116.30171,40.64971],[-116.30104,40.64989],[-116.30062,40.65],[-116.29985,40.65014],[-116.29947,40.6502],[-116.29901,40.65025],[-116.29855,40.65028],[-116.29835,40.65029],[-116.29818,40.6503],[-116.29802,40.65031],[-116.29789,40.65031],[-116.29664,40.65032],[-116.2956,40.65033],[-116.29474,40.65038],[-116.29385,40.65044],[-116.29314,40.65057],[-116.29221,40.65077],[-116.27478,40.65536],[-116.26684,40.65739],[-116.26539,40.65779],[-116.26465,40.65798],[-116.26429,40.65806],[-116.2638,40.65817],[-116.26349,40.65823],[-116.26278,40.65835],[-116.26217,40.65847],[-116.26174,40.65854],[-116.26096,40.65861],[-116.26062,40.65864],[-116.26055,40.65865],[-116.25975,40.65871],[-116.25875,40.65875],[-116.25818,40.65874],[-116.25709,40.65872],[-116.25531,40.65867],[-116.2548,40.65865],[-116.25417,40.65864],[-116.25368,40.65866],[-116.25328,40.65868],[-116.25288,40.65871],[-116.25254,40.65874],[-116.25159,40.65888],[-116.25127,40.65894],[-116.25099,40.659],[-116.25058,40.65909],[-116.24931,40.65944],[-116.24842,40.65966],[-116.24619,40.66023],[-116.2425,40.66117],[-116.24116,40.6615],[-116.23983,40.66186],[-116.23925,40.66202],[-116.23865,40.6622],[-116.23731,40.66267],[-116.23675,40.6629],[-116.23593,40.66326],[-116.23526,40.6636],[-116.23444,40.66403],[-116.23401,40.66427],[-116.23324,40.66471],[-116.2328,40.66493],[-116.23189,40.66541],[-116.23084,40.66597],[-116.22999,40.66644],[-116.22787,40.66762],[-116.22685,40.6682],[-116.22475,40.6694],[-116.22364,40.67],[-116.22226,40.67067],[-116.22098,40.6713],[-116.21866,40.67245],[-116.21749,40.67305],[-116.21373,40.67492],[-116.21253,40.67555],[-116.21126,40.67618],[-116.21001,40.67683],[-116.20869,40.67748],[-116.20737,40.67812],[-116.20603,40.67877],[-116.20471,40.67945],[-116.20345,40.68009],[-116.20218,40.68071],[-116.20148,40.68101],[-116.20062,40.68133],[-116.2003,40.68144],[-116.19994,40.68155],[-116.19941,40.68169],[-116.19855,40.68192],[-116.19707,40.68231],[-116.19442,40.68298],[-116.19318,40.68326],[-116.19044,40.68391],[-116.1896,40.68411],[-116.18886,40.68428],[-116.18804,40.6845],[-116.18728,40.68471],[-116.18659,40.68493],[-116.18597,40.68515],[-116.18501,40.68555],[-116.18445,40.6858],[-116.18366,40.68621],[-116.18313,40.68649],[-116.18261,40.68679],[-116.18212,40.68713],[-116.18157,40.68752],[-116.18136,40.68766],[-116.18095,40.68793],[-116.18068,40.68813],[-116.17999,40.68872],[-116.17968,40.68903],[-116.17916,40.68957],[-116.179,40.68973],[-116.17857,40.6902],[-116.17849,40.69032],[-116.17813,40.69078],[-116.17794,40.69103],[-116.17775,40.69129],[-116.17757,40.69156],[-116.17725,40.69208],[-116.17704,40.69246],[-116.17667,40.69314],[-116.17628,40.69384],[-116.17584,40.6946],[-116.17541,40.69536],[-116.17497,40.69614],[-116.1741,40.69766],[-116.17353,40.69845],[-116.17319,40.69888],[-116.17269,40.69949],[-116.17235,40.69989],[-116.17183,40.70046],[-116.17123,40.70104],[-116.17061,40.70157],[-116.16987,40.70212],[-116.16918,40.70262],[-116.16872,40.70293],[-116.16801,40.70338],[-116.16601,40.70448],[-116.15772,40.70907],[-116.14513,40.71601],[-116.14442,40.71637],[-116.14377,40.71666],[-116.14291,40.71702],[-116.14216,40.71729],[-116.14195,40.71736],[-116.14125,40.7176],[-116.14071,40.71775],[-116.13964,40.718],[-116.13932,40.71807],[-116.1386,40.71819],[-116.13834,40.71823],[-116.13819,40.71826],[-116.13749,40.71839],[-116.13684,40.71847],[-116.13595,40.71853],[-116.13489,40.71856],[-116.13385,40.71855],[-116.13321,40.71853],[-116.12664,40.71842],[-116.1236,40.71836],[-116.1222,40.71838],[-116.12068,40.71848],[-116.11897,40.71866],[-116.11757,40.7189],[-116.11692,40.71903],[-116.11663,40.71909],[-116.11575,40.7193],[-116.11521,40.71944],[-116.11453,40.71963],[-116.11405,40.71978],[-116.11265,40.72023],[-116.11205,40.72043],[-116.11138,40.72064],[-116.10965,40.72117],[-116.10377,40.72301],[-116.103,40.72322],[-116.10261,40.72331],[-116.10244,40.72336],[-116.10039,40.72384],[-116.09923,40.72405],[-116.09788,40.72425],[-116.09712,40.72435],[-116.09579,40.72449],[-116.09455,40.72458],[-116.09407,40.7246],[-116.09232,40.72467],[-116.08883,40.72468],[-116.07798,40.72473],[-116.07751,40.72473],[-116.07703,40.72473],[-116.0733,40.72477],[-116.07153,40.72483],[-116.06992,40.72498],[-116.0683,40.7252],[-116.04092,40.72868],[-116.03994,40.72876],[-116.03913,40.72881],[-116.03838,40.72882],[-116.03788,40.72881],[-116.03738,40.7288],[-116.03614,40.72871],[-116.03579,40.72868],[-116.03505,40.72859],[-116.03411,40.72843],[-116.03308,40.72822],[-116.03248,40.72807],[-116.03188,40.7279],[-116.03012,40.72737],[-116.01892,40.72396],[-116.01833,40.72375],[-116.01808,40.72362],[-116.01744,40.72334],[-116.01629,40.72281],[-116.01211,40.72054],[-116.01183,40.72039],[-116.01075,40.71981],[-116.00738,40.71803],[-116.00608,40.71737],[-116.00527,40.71697],[-116.00488,40.71678],[-116.00394,40.71641],[-116.00344,40.71623],[-116.00253,40.71594],[-116.00146,40.71566],[-116.00069,40.71549],[-115.99994,40.71534],[-115.99903,40.71521],[-115.9953,40.71477],[-115.99411,40.71463],[-115.99043,40.71421],[-115.98906,40.71405],[-115.98512,40.71359],[-115.98483,40.71357],[-115.98455,40.71356],[-115.98403,40.71358],[-115.98345,40.71362],[-115.98318,40.71365],[-115.98261,40.71375],[-115.98197,40.71391],[-115.98168,40.71399],[-115.98134,40.71411],[-115.9808,40.71433],[-115.9804,40.71452],[-115.98,40.71475],[-115.97969,40.71497],[-115.97461,40.71879],[-115.9715,40.72114],[-115.971,40.72147],[-115.97016,40.72197],[-115.96974,40.7222],[-115.9693,40.72241],[-115.96663,40.7236],[-115.96589,40.72395],[-115.96194,40.72572],[-115.96085,40.72623],[-115.96001,40.72666],[-115.95964,40.72688],[-115.9591,40.72721],[-115.95843,40.72769],[-115.95784,40.72815],[-115.95744,40.72851],[-115.95539,40.7306],[-115.95418,40.7319],[-115.95355,40.73254],[-115.95249,40.7337],[-115.95207,40.73417],[-115.9515,40.73475],[-115.95101,40.73528],[-115.95056,40.7358],[-115.95031,40.73614],[-115.9497,40.73699],[-115.94948,40.73734],[-115.94893,40.73829],[-115.94355,40.74842],[-115.94292,40.74951],[-115.94246,40.75022],[-115.94166,40.7514],[-115.9412,40.75206],[-115.94072,40.75269],[-115.93984,40.75367],[-115.93886,40.75473],[-115.9375,40.75605],[-115.93654,40.75691],[-115.93598,40.75737],[-115.9346,40.75845],[-115.93311,40.75952],[-115.93252,40.75991],[-115.93175,40.76039],[-115.93072,40.76099],[-115.92941,40.76169],[-115.92463,40.7642],[-115.91584,40.7687],[-115.91195,40.77065],[-115.91105,40.7711],[-115.91005,40.77157],[-115.90916,40.77197],[-115.90843,40.77228],[-115.90713,40.77279],[-115.90624,40.7731],[-115.90494,40.77351],[-115.87501,40.78247],[-115.87335,40.78305],[-115.87268,40.7833],[-115.87153,40.78374],[-115.87136,40.7838],[-115.87086,40.78401],[-115.86841,40.78508],[-115.86546,40.7864],[-115.85248,40.79214],[-115.85135,40.79266],[-115.8505,40.79307],[-115.84875,40.79399],[-115.8311,40.80374],[-115.83013,40.80432],[-115.82807,40.80573],[-115.82673,40.80671],[-115.82627,40.80708],[-115.82581,40.80747],[-115.82468,40.80849],[-115.82432,40.80886],[-115.82403,40.80915],[-115.82318,40.81001],[-115.82276,40.81048],[-115.82237,40.81093],[-115.82094,40.81267],[-115.82052,40.81315],[-115.82013,40.81356],[-115.81951,40.81422],[-115.81871,40.815],[-115.81834,40.8153],[-115.81819,40.81542],[-115.81798,40.8156],[-115.81758,40.81596],[-115.81663,40.81679],[-115.81637,40.81699],[-115.8153,40.81774],[-115.81478,40.81813],[-115.8143,40.81846],[-115.81373,40.81884],[-115.81297,40.81929],[-115.81185,40.81999],[-115.8112,40.82037],[-115.80943,40.82146],[-115.80876,40.82191],[-115.80748,40.82268],[-115.80602,40.82361],[-115.80485,40.82434],[-115.80381,40.82502],[-115.80282,40.8257],[-115.80215,40.82622],[-115.80083,40.82732],[-115.80006,40.82802],[-115.79991,40.82816],[-115.79939,40.82865],[-115.79894,40.8291],[-115.79821,40.82983],[-115.7959,40.8322],[-115.7954,40.83271],[-115.79499,40.83308],[-115.79489,40.83315],[-115.79471,40.8333],[-115.79409,40.83376],[-115.79379,40.83397],[-115.79336,40.83423],[-115.79305,40.83439],[-115.79272,40.83456],[-115.79234,40.83473],[-115.79204,40.83486],[-115.7915,40.83507],[-115.79086,40.83527],[-115.79017,40.83546],[-115.78964,40.83559],[-115.78932,40.83565],[-115.78382,40.83677],[-115.78265,40.83697],[-115.78203,40.83712],[-115.78139,40.83731],[-115.78109,40.83741],[-115.78063,40.83759],[-115.78026,40.83775],[-115.77981,40.83795],[-115.77914,40.83831],[-115.77846,40.83872],[-115.7756,40.84087],[-115.77515,40.84122],[-115.77368,40.84231],[-115.77327,40.84259],[-115.77257,40.84303],[-115.77211,40.84331],[-115.77161,40.84359],[-115.77116,40.84382],[-115.77065,40.84408],[-115.77037,40.8442],[-115.76945,40.84458],[-115.76883,40.84482],[-115.76832,40.84499],[-115.76779,40.84515],[-115.76693,40.8454],[-115.76641,40.84552],[-115.76196,40.84659],[-115.76129,40.84675],[-115.75903,40.84726],[-115.75735,40.84769],[-115.75624,40.848],[-115.75457,40.84858],[-115.75325,40.8491],[-115.75206,40.84961],[-115.75051,40.85035],[-115.74988,40.8507],[-115.74903,40.85119],[-115.74842,40.85157],[-115.74744,40.85222],[-115.74694,40.85256],[-115.74643,40.85293],[-115.74533,40.8538],[-115.74476,40.8543],[-115.74378,40.85524],[-115.74277,40.85612],[-115.73906,40.85968],[-115.73386,40.86454],[-115.73359,40.86479],[-115.7181,40.87926],[-115.71782,40.87954],[-115.71661,40.88078],[-115.71606,40.88151],[-115.71545,40.88243],[-115.71505,40.88314],[-115.71466,40.88397],[-115.71439,40.88468],[-115.71414,40.88547],[-115.71337,40.88843],[-115.71307,40.88936],[-115.71295,40.8897],[-115.71265,40.89048],[-115.71235,40.89117],[-115.71214,40.89159],[-115.71188,40.89208],[-115.71138,40.89293],[-115.71085,40.89376],[-115.70969,40.89533],[-115.70951,40.89553],[-115.70757,40.89755],[-115.7057,40.89951],[-115.70527,40.89998],[-115.70433,40.90096],[-115.70351,40.90188],[-115.70313,40.90228],[-115.69837,40.90746],[-115.69765,40.90811],[-115.69513,40.91085],[-115.69179,40.91442],[-115.69001,40.91632],[-115.68879,40.9175],[-115.68858,40.91771],[-115.68796,40.91828],[-115.68703,40.91909],[-115.68598,40.91994],[-115.68482,40.92079],[-115.68404,40.92132],[-115.68327,40.92187],[-115.66945,40.93114],[-115.66844,40.93182],[-115.66667,40.933],[-115.66582,40.93351],[-115.66553,40.93368],[-115.66429,40.93437],[-115.66349,40.93479],[-115.6623,40.93536],[-115.66058,40.93611],[-115.65098,40.94026],[-115.64036,40.94489],[-115.63315,40.94803],[-115.63218,40.9484],[-115.63145,40.94864],[-115.63075,40.94883],[-115.63004,40.94902],[-115.62957,40.94914],[-115.62865,40.94932],[-115.62751,40.9495],[-115.62696,40.94957],[-115.62595,40.94965],[-115.62486,40.94968],[-115.62439,40.94968],[-115.59934,40.94946],[-115.59435,40.94942],[-115.59378,40.94941],[-115.59166,40.94938],[-115.58928,40.94937],[-115.57294,40.94921],[-115.56219,40.94913],[-115.5568,40.94914],[-115.55161,40.94915],[-115.55119,40.94915],[-115.54563,40.94916],[-115.54492,40.94915],[-115.5448,40.94915],[-115.53414,40.94918],[-115.5337,40.94918],[-115.52966,40.94919],[-115.52925,40.94919],[-115.52729,40.9492],[-115.52564,40.94923],[-115.52484,40.94927],[-115.52344,40.94933],[-115.52272,40.9494],[-115.52133,40.94957],[-115.52015,40.94975],[-115.4824,40.95582],[-115.47074,40.95769],[-115.4664,40.9584],[-115.46603,40.95847],[-115.46456,40.95877],[-115.46264,40.95924],[-115.46202,40.95941],[-115.46134,40.9596],[-115.46058,40.95984],[-115.45959,40.96019],[-115.45856,40.96057],[-115.45722,40.96108],[-115.45663,40.96132],[-115.45577,40.96172],[-115.45473,40.96225],[-115.45402,40.9626],[-115.45306,40.9631],[-115.45145,40.96408],[-115.4508,40.96453],[-115.44992,40.96514],[-115.44898,40.96584],[-115.44859,40.96613],[-115.44792,40.96668],[-115.44685,40.96763],[-115.44597,40.96848],[-115.44513,40.96935],[-115.44419,40.97041],[-115.44387,40.97088],[-115.44323,40.97169],[-115.4428,40.97227],[-115.43422,40.98493],[-115.42388,41.00006],[-115.42347,41.00064],[-115.42283,41.00148],[-115.4223,41.00214],[-115.42196,41.00252],[-115.42061,41.00396],[-115.42034,41.00423],[-115.42027,41.0043],[-115.41831,41.00602],[-115.41756,41.0066],[-115.41675,41.00718],[-115.39556,41.02324],[-115.39397,41.02429],[-115.39314,41.02481],[-115.39187,41.02557],[-115.39052,41.02626],[-115.38652,41.0282],[-115.38251,41.03012],[-115.38223,41.03025],[-115.37804,41.03227],[-115.29866,41.06978],[-115.28902,41.07425],[-115.27279,41.08178],[-115.27244,41.08194],[-115.26816,41.08389],[-115.26722,41.08431],[-115.2665,41.08459],[-115.26593,41.08479],[-115.26534,41.08498],[-115.26457,41.08519],[-115.26328,41.08551],[-115.26285,41.08561],[-115.26241,41.0857],[-115.26186,41.08578],[-115.26124,41.08586],[-115.26045,41.08594],[-115.25966,41.08599],[-115.25911,41.08601],[-115.25817,41.08602],[-115.25784,41.08602],[-115.24122,41.08589],[-115.24088,41.08589],[-115.23183,41.08582],[-115.22874,41.08578],[-115.19256,41.08548],[-115.19215,41.08548],[-115.19054,41.08552],[-115.18906,41.08559],[-115.1878,41.0857],[-115.1868,41.08581],[-115.18507,41.08605],[-115.11602,41.09751],[-115.10781,41.09888],[-115.10501,41.09925],[-115.09155,41.1008],[-115.08999,41.101],[-115.08838,41.10128],[-115.08777,41.10139],[-115.08584,41.10181],[-115.05204,41.10965],[-115.05148,41.10979],[-115.05003,41.1101],[-115.04954,41.11019],[-115.04916,41.11025],[-115.0487,41.11033],[-115.04687,41.11057],[-115.04556,41.11072],[-115.04483,41.11078],[-115.04405,41.11084],[-115.04304,41.11089],[-115.04185,41.11092],[-115.04088,41.11093],[-115.04018,41.11092],[-115.03924,41.11088],[-115.03871,41.11086],[-115.03758,41.11078],[-115.03634,41.11067],[-115.03563,41.11058],[-115.03443,41.11042],[-115.03252,41.11015],[-115.0229,41.10862],[-115.01646,41.10763],[-115.01494,41.10742],[-115.01441,41.10736],[-115.01401,41.10733],[-115.01093,41.10705],[-114.9852,41.10506],[-114.9845,41.10499],[-114.97964,41.10462],[-114.97912,41.10459],[-114.97848,41.10454],[-114.97457,41.10419],[-114.97383,41.10407],[-114.97195,41.10374],[-114.97012,41.10328],[-114.96906,41.10298],[-114.96853,41.10283],[-114.96797,41.10265],[-114.96233,41.10085],[-114.95832,41.09958],[-114.95772,41.09939],[-114.95568,41.09876],[-114.95508,41.09861],[-114.9545,41.09849],[-114.95237,41.09815],[-114.95168,41.09808],[-114.95082,41.09802],[-114.94038,41.09758],[-114.93933,41.09759],[-114.9386,41.09764],[-114.93751,41.09774],[-114.93584,41.09797],[-114.90284,41.10259],[-114.87207,41.1069],[-114.86402,41.10802],[-114.83614,41.11186],[-114.83465,41.11203],[-114.83326,41.11212],[-114.83189,41.11219],[-114.83117,41.1122],[-114.80938,41.11247],[-114.80354,41.11252],[-114.80312,41.11252],[-114.79779,41.11259],[-114.78374,41.11274],[-114.78323,41.11273],[-114.78188,41.11268],[-114.78129,41.11265],[-114.78005,41.11255],[-114.77962,41.11251],[-114.77842,41.11235],[-114.77759,41.11221],[-114.77683,41.11207],[-114.77597,41.11189],[-114.77509,41.11169],[-114.7741,41.11143],[-114.77333,41.11122],[-114.77279,41.11106],[-114.772,41.1108],[-114.71595,41.09192],[-114.71051,41.09008],[-114.71006,41.08993],[-114.70454,41.0881],[-114.66583,41.07501],[-114.66459,41.07462],[-114.66381,41.07439],[-114.66275,41.07411],[-114.6616,41.07383],[-114.66062,41.07363],[-114.65956,41.07343],[-114.64852,41.07163],[-114.6469,41.07142],[-114.64631,41.07136],[-114.64447,41.07122],[-114.64366,41.07118],[-114.64213,41.07114],[-114.6409,41.07115],[-114.63937,41.07117],[-114.63838,41.07121],[-114.62449,41.07185],[-114.62355,41.07189],[-114.62323,41.07189],[-114.62231,41.07185],[-114.6215,41.07177],[-114.62071,41.07166],[-114.62026,41.07156],[-114.61961,41.07139],[-114.6188,41.07114],[-114.61855,41.07105],[-114.6181,41.07086],[-114.61737,41.07052],[-114.61471,41.06912],[-114.61421,41.06888],[-114.61371,41.06866],[-114.61333,41.06849],[-114.613,41.06832],[-114.61239,41.06802],[-114.61184,41.06772],[-114.61001,41.06678],[-114.60967,41.06663],[-114.60938,41.06651],[-114.609,41.06639],[-114.60869,41.06631],[-114.60853,41.06628],[-114.60829,41.06622],[-114.60803,41.06618],[-114.60781,41.06615],[-114.60757,41.06613],[-114.60671,41.06609],[-114.60621,41.06609],[-114.60578,41.0661],[-114.60538,41.06614],[-114.60495,41.06621],[-114.60452,41.06629],[-114.60341,41.0666],[-114.60277,41.06687],[-114.60223,41.06714],[-114.60173,41.06744],[-114.6014,41.06768],[-114.6011,41.06791],[-114.60071,41.06827],[-114.59937,41.0698],[-114.59863,41.07067],[-114.59818,41.07117],[-114.59757,41.07189],[-114.59732,41.07214],[-114.59706,41.07236],[-114.5967,41.07264],[-114.59639,41.07285],[-114.59611,41.07301],[-114.59597,41.07309],[-114.59556,41.07329],[-114.59531,41.0734],[-114.59492,41.07355],[-114.59453,41.07369],[-114.59417,41.07378],[-114.59373,41.07388],[-114.59331,41.07395],[-114.59302,41.07399],[-114.59281,41.07401],[-114.59249,41.07402],[-114.59183,41.07406],[-114.59164,41.07407],[-114.59132,41.0741],[-114.59096,41.07415],[-114.5906,41.07421],[-114.59003,41.07434],[-114.58953,41.07449],[-114.58905,41.07468],[-114.58877,41.0748],[-114.5884,41.07498],[-114.58815,41.07513],[-114.58798,41.07523],[-114.58734,41.07561],[-114.5868,41.07591],[-114.58658,41.07602],[-114.58619,41.07618],[-114.58584,41.07631],[-114.58559,41.0764],[-114.58528,41.0765],[-114.58497,41.07659],[-114.58453,41.07669],[-114.57937,41.07771],[-114.57815,41.07788],[-114.57746,41.07794],[-114.57683,41.07798],[-114.57644,41.07801],[-114.57527,41.07804],[-114.57446,41.07804],[-114.57407,41.07803],[-114.57364,41.07801],[-114.57218,41.07792],[-114.57143,41.07783],[-114.57081,41.07776],[-114.56989,41.07761],[-114.56913,41.07746],[-114.568,41.07721],[-114.56708,41.07694],[-114.56639,41.07672],[-114.56577,41.0765],[-114.56522,41.0763],[-114.5648,41.07613],[-114.56439,41.07597],[-114.56401,41.0758],[-114.56269,41.07521],[-114.56162,41.07471],[-114.56075,41.07437],[-114.56036,41.07421],[-114.55833,41.07353],[-114.55759,41.07334],[-114.55704,41.07321],[-114.55665,41.07313],[-114.55581,41.07296],[-114.55497,41.07282],[-114.55383,41.07266],[-114.55313,41.07258],[-114.55207,41.07244],[-114.55158,41.07238],[-114.55108,41.07232],[-114.55071,41.07227],[-114.54994,41.07217],[-114.54929,41.07208],[-114.54866,41.07197],[-114.54839,41.07191],[-114.54772,41.07176],[-114.54721,41.07163],[-114.54652,41.07142],[-114.54605,41.07125],[-114.54586,41.07118],[-114.54538,41.071],[-114.54477,41.07073],[-114.54393,41.07032],[-114.54354,41.07011],[-114.54309,41.06984],[-114.5427,41.06959],[-114.54217,41.06921],[-114.54172,41.06888],[-114.54132,41.06853],[-114.54019,41.06756],[-114.53969,41.06711],[-114.53907,41.0666],[-114.53864,41.06629],[-114.53813,41.06594],[-114.53779,41.06573],[-114.53727,41.06543],[-114.53674,41.06517],[-114.53613,41.06488],[-114.53553,41.06462],[-114.53519,41.06449],[-114.53474,41.06433],[-114.53434,41.06419],[-114.53369,41.06401],[-114.53308,41.06385],[-114.5312,41.06342],[-114.52815,41.0627],[-114.52777,41.0626],[-114.52739,41.06249],[-114.52659,41.06221],[-114.52577,41.06188],[-114.52514,41.06161],[-114.52488,41.06147],[-114.52429,41.06117],[-114.52372,41.06088],[-114.52322,41.06058],[-114.52281,41.06032],[-114.52208,41.05983],[-114.52166,41.05952],[-114.52102,41.05903],[-114.52033,41.05844],[-114.5202,41.05831],[-114.51991,41.05802],[-114.51952,41.05759],[-114.51911,41.05717],[-114.51385,41.05159],[-114.51299,41.0507],[-114.50443,41.04162],[-114.50217,41.03924],[-114.50088,41.03788],[-114.50036,41.03735],[-114.49991,41.03691],[-114.49914,41.0362],[-114.49857,41.03571],[-114.49802,41.03526],[-114.49735,41.03474],[-114.49691,41.03441],[-114.49629,41.03396],[-114.49347,41.03205],[-114.48991,41.02969],[-114.48948,41.0294],[-114.48559,41.02672],[-114.48327,41.02517],[-114.45882,41.00867],[-114.45001,41.00272],[-114.44413,40.99876],[-114.44363,40.99842],[-114.42075,40.98295],[-114.40448,40.97195],[-114.38685,40.96],[-114.37226,40.95012],[-114.37108,40.94929],[-114.36425,40.9448],[-114.36355,40.94438],[-114.36272,40.94393],[-114.35966,40.94226],[-114.32809,40.92538],[-114.32741,40.92498],[-114.32683,40.92461],[-114.3263,40.92425],[-114.32578,40.92387],[-114.32527,40.92344],[-114.32466,40.92292],[-114.32387,40.9221],[-114.32319,40.92131],[-114.32057,40.91766],[-114.3201,40.91706],[-114.31886,40.91545],[-114.3186,40.91512],[-114.31837,40.91487],[-114.31783,40.91435],[-114.31737,40.91393],[-114.31674,40.91341],[-114.31594,40.91285],[-114.31545,40.91253],[-114.31478,40.91216],[-114.29538,40.90249],[-114.29476,40.9022],[-114.29414,40.90192],[-114.2939,40.90183],[-114.2934,40.90165],[-114.29337,40.90164],[-114.29321,40.90159],[-114.29255,40.90141],[-114.29196,40.90127],[-114.2914,40.90116],[-114.29079,40.90107],[-114.29018,40.90101],[-114.28983,40.90099],[-114.28915,40.90097],[-114.28837,40.901],[-114.28537,40.90119],[-114.28461,40.90119],[-114.28435,40.90119],[-114.28373,40.90117],[-114.28317,40.90113],[-114.28276,40.90109],[-114.28193,40.90095],[-114.28129,40.90081],[-114.28045,40.90058],[-114.2743,40.89868],[-114.27359,40.89844],[-114.27256,40.89806],[-114.27153,40.89768],[-114.26994,40.89704],[-114.26892,40.8966],[-114.26831,40.89632],[-114.26732,40.89585],[-114.26685,40.89563],[-114.26622,40.89533],[-114.26504,40.89472],[-114.26388,40.8941],[-114.26267,40.89338],[-114.26178,40.89284],[-114.26074,40.89218],[-114.25991,40.89163],[-114.25873,40.8908],[-114.2578,40.89011],[-114.25664,40.88921],[-114.25548,40.88821],[-114.25517,40.88796],[-114.25477,40.88762],[-114.25435,40.88723],[-114.25357,40.88649],[-114.2534,40.88633],[-114.25204,40.88498],[-114.25138,40.88431],[-114.25105,40.88398],[-114.25082,40.88373],[-114.25011,40.88303],[-114.24743,40.88033],[-114.24467,40.87756],[-114.24126,40.87412],[-114.2379,40.87074],[-114.23698,40.86983],[-114.2362,40.86903],[-114.23453,40.86735],[-114.23239,40.86521],[-114.23141,40.86422],[-114.22632,40.85913],[-114.22297,40.8558],[-114.2224,40.85522],[-114.21545,40.84822],[-114.21009,40.84276],[-114.20974,40.84241],[-114.20555,40.83822],[-114.1953,40.82786],[-114.19378,40.82634],[-114.1913,40.82381],[-114.1904,40.82291],[-114.18834,40.82088],[-114.18652,40.81904],[-114.18443,40.81692],[-114.18356,40.81605],[-114.18254,40.815],[-114.18072,40.81318],[-114.17986,40.81232],[-114.1792,40.81168],[-114.17839,40.81085],[-114.1762,40.80866],[-114.17375,40.80618],[-114.17346,40.8059],[-114.17306,40.80548],[-114.17128,40.80369],[-114.17035,40.80276],[-114.16823,40.80063],[-114.16751,40.7999],[-114.16676,40.79916],[-114.16455,40.79693],[-114.16367,40.79602],[-114.1626,40.79494],[-114.16108,40.79344],[-114.15997,40.79229],[-114.15938,40.7917],[-114.15868,40.79099],[-114.15725,40.78956],[-114.15617,40.78846],[-114.15403,40.78632],[-114.1531,40.78537],[-114.14998,40.78224],[-114.14928,40.78153],[-114.14857,40.7808],[-114.14817,40.78042],[-114.14709,40.77932],[-114.14361,40.77581],[-114.1419,40.77412],[-114.14108,40.77341],[-114.14,40.7725],[-114.13835,40.77121],[-114.1373,40.77042],[-114.13427,40.76807],[-114.13316,40.7672],[-114.13066,40.76525],[-114.1301,40.76483],[-114.12787,40.76311],[-114.12654,40.76206],[-114.12597,40.76162],[-114.12529,40.76108],[-114.12382,40.75996],[-114.11901,40.75622],[-114.11595,40.75385],[-114.11417,40.75246],[-114.1138,40.75217],[-114.11043,40.74957],[-114.10916,40.74872],[-114.10855,40.74833],[-114.1079,40.74792],[-114.10753,40.7477],[-114.10673,40.74726],[-114.10605,40.74693],[-114.10501,40.74647],[-114.10311,40.74575],[-114.10208,40.74544],[-114.10089,40.74511],[-114.09992,40.74488],[-114.09898,40.74469],[-114.09766,40.74446],[-114.09689,40.74435],[-114.09579,40.74424],[-114.09452,40.74415],[-114.09335,40.7441],[-114.0926,40.7441],[-114.0903,40.74415],[-114.08699,40.74424],[-114.08474,40.74429],[-114.08463,40.74429],[-114.08255,40.74435],[-114.0813,40.74438],[-114.08126,40.74439],[-114.07886,40.74445],[-114.07851,40.74446],[-114.07813,40.74447],[-114.07755,40.74447],[-114.07721,40.74447],[-114.07651,40.74445],[-114.07563,40.7444],[-114.07555,40.7444],[-114.07468,40.74432],[-114.07364,40.7442],[-114.07292,40.74409],[-114.0724,40.74399],[-114.07193,40.7439],[-114.07027,40.74351],[-114.06975,40.74336],[-114.06917,40.74317],[-114.06905,40.74314],[-114.06765,40.7427],[-114.06725,40.74258],[-114.06676,40.74243],[-114.06662,40.74238],[-114.06514,40.74191],[-114.06495,40.74185],[-114.06481,40.74181],[-114.0641,40.74159],[-114.06286,40.74121],[-114.06203,40.74095],[-114.06188,40.7409],[-114.06177,40.74087],[-114.06101,40.74062],[-114.05996,40.7403],[-114.05811,40.73972],[-114.05749,40.73954],[-114.05637,40.73921],[-114.05569,40.73901],[-114.05514,40.73887],[-114.05399,40.73859],[-114.05362,40.73851],[-114.05288,40.73837],[-114.0525,40.7383],[-114.05207,40.73823],[-114.05157,40.73816],[-114.05085,40.73807],[-114.05013,40.73799],[-114.04968,40.73795],[-114.04954,40.73794],[-114.04866,40.73788],[-114.04782,40.73784],[-114.04776,40.73784],[-114.04645,40.73783],[-114.0449,40.73789],[-114.04436,40.73792],[-114.04418,40.73794],[-114.04348,40.738],[-114.04332,40.73801],[-114.04275,40.73808],[-114.04085,40.7384],[-114.03971,40.73863],[-114.03857,40.73892],[-114.03777,40.73916],[-114.03735,40.73928],[-114.0346,40.74023],[-114.02195,40.74474],[-114.01874,40.74565],[-114.01778,40.74584],[-114.01608,40.74618],[-114.01304,40.74659],[-114.01073,40.7469],[-114.00859,40.74703],[-114.00695,40.74707],[-114.00514,40.74707],[-114.00311,40.74696],[-114.00126,40.74685],[-113.99888,40.74656],[-113.99641,40.74614],[-113.9906,40.74508],[-113.98343,40.7438],[-113.97713,40.74284],[-113.97085,40.74205],[-113.96777,40.74174],[-113.96215,40.74125],[-113.9537,40.74072],[-113.93765,40.74015],[-113.90801,40.73954],[-113.87584,40.73888],[-113.86016,40.73859],[-113.85925,40.73856],[-113.85476,40.73846],[-113.85236,40.73841],[-113.84418,40.73823],[-113.82257,40.73794],[-113.82143,40.73791],[-113.78901,40.73708],[-113.77317,40.7369],[-113.75083,40.73633],[-113.7095,40.73555],[-113.63193,40.73389],[-113.62245,40.73369],[-113.61014,40.73338],[-113.5944,40.73301],[-113.54193,40.73179],[-113.52013,40.73133],[-113.50083,40.73085],[-113.49926,40.73089],[-113.48423,40.73048],[-113.46601,40.73017],[-113.44695,40.72971],[-113.4041,40.72866],[-113.40381,40.72866],[-113.3885,40.72828],[-113.37582,40.72797],[-113.31275,40.72738],[-113.30388,40.72729],[-113.28666,40.72679],[-113.27501,40.72663],[-113.26918,40.72657],[-113.26627,40.72653],[-113.26523,40.72652],[-113.26352,40.72647],[-113.25977,40.72647],[-113.25785,40.72644],[-113.25385,40.72641],[-113.25143,40.72637],[-113.25055,40.72638],[-113.22584,40.72607],[-113.20113,40.72579],[-113.19453,40.72569],[-113.18792,40.72562],[-113.17214,40.72542],[-113.16422,40.72533],[-113.1563,40.72523],[-113.14955,40.72515],[-113.14277,40.7251],[-113.14073,40.7252],[-113.13866,40.72538],[-113.13742,40.72552],[-113.13616,40.72569],[-113.13441,40.726],[-113.13268,40.72635],[-113.13095,40.72677],[-113.12924,40.72724],[-113.12582,40.72821],[-113.12217,40.72919],[-113.12036,40.72968],[-113.11855,40.73018],[-113.11767,40.73043],[-113.11544,40.731],[-113.11218,40.73191],[-113.10879,40.73287],[-113.09907,40.73555],[-113.09178,40.73755],[-113.08446,40.73948],[-113.07798,40.74134],[-113.07471,40.74225],[-113.07147,40.74313],[-113.06331,40.74538],[-113.05513,40.74761],[-113.05156,40.74862],[-113.04733,40.74971],[-113.0253,40.75581],[-113.02445,40.75607],[-113.02076,40.75705],[-113.01711,40.75809],[-113.01271,40.75925],[-113.00978,40.76005],[-113.00245,40.76208],[-113.00081,40.7625],[-112.99897,40.76302],[-112.99685,40.76361],[-112.99392,40.76441],[-112.99149,40.76517],[-112.98981,40.76579],[-112.98566,40.76762],[-112.98359,40.76873],[-112.98175,40.76984],[-112.97882,40.7719],[-112.97512,40.77482],[-112.96422,40.78342],[-112.96131,40.78565],[-112.9607,40.78612],[-112.95645,40.78949],[-112.9522,40.79282],[-112.9426,40.80038],[-112.93779,40.80416],[-112.93298,40.8079],[-112.93115,40.80916],[-112.92966,40.81006],[-112.92812,40.8109],[-112.92525,40.8123],[-112.92235,40.81357],[-112.92107,40.81412],[-112.91598,40.81629],[-112.91169,40.81813],[-112.90955,40.81906],[-112.90738,40.81996],[-112.90591,40.82061],[-112.90443,40.82123],[-112.90353,40.82158],[-112.90261,40.82187],[-112.90129,40.8222],[-112.89941,40.82255],[-112.89913,40.82258],[-112.89862,40.82263],[-112.89837,40.82265],[-112.89795,40.82269],[-112.89755,40.8227],[-112.89637,40.8227],[-112.89592,40.8227],[-112.89473,40.82261],[-112.89316,40.82244],[-112.89206,40.82223],[-112.89077,40.82191],[-112.88905,40.82132],[-112.88784,40.82079],[-112.88031,40.81672],[-112.87589,40.81428],[-112.86972,40.811],[-112.85288,40.80175],[-112.83085,40.78972],[-112.82763,40.78796],[-112.81552,40.78128],[-112.79112,40.76801],[-112.78418,40.76416],[-112.78162,40.76276],[-112.78131,40.76258],[-112.77753,40.76044],[-112.77497,40.75926],[-112.77223,40.75829],[-112.76987,40.75762],[-112.76669,40.757],[-112.76224,40.75657],[-112.75591,40.75592],[-112.7489,40.75523],[-112.73958,40.75429],[-112.72226,40.75256],[-112.71702,40.75203],[-112.70551,40.75091],[-112.6894,40.74927],[-112.68623,40.74896],[-112.66521,40.74686],[-112.65972,40.7463],[-112.65317,40.74566],[-112.65259,40.7456],[-112.64686,40.74509],[-112.64469,40.74492],[-112.64267,40.74479],[-112.63809,40.74437],[-112.63674,40.74424],[-112.63568,40.74401],[-112.63319,40.74328],[-112.62614,40.74083],[-112.61669,40.73796],[-112.58485,40.72868],[-112.55926,40.72125],[-112.55599,40.72023],[-112.55408,40.71957],[-112.55199,40.71872],[-112.54727,40.71669],[-112.53644,40.7121],[-112.5316,40.71002],[-112.53013,40.70941],[-112.5295,40.70914],[-112.52872,40.70878],[-112.5263,40.70781],[-112.5226,40.70665],[-112.52016,40.70606],[-112.51762,40.70556],[-112.51623,40.70533],[-112.50092,40.70271],[-112.49302,40.70134],[-112.49095,40.70092],[-112.48911,40.70045],[-112.4868,40.69979],[-112.48491,40.69914],[-112.46799,40.69267],[-112.45704,40.68844],[-112.45267,40.68679],[-112.45095,40.68619],[-112.44956,40.68577],[-112.44641,40.68498],[-112.44281,40.68423],[-112.44068,40.68386],[-112.43988,40.68371],[-112.41735,40.67942],[-112.41544,40.67902],[-112.41317,40.67844],[-112.39795,40.67403],[-112.3764,40.66768],[-112.36814,40.66542],[-112.36506,40.66471],[-112.36195,40.66411],[-112.3577,40.66337],[-112.3537,40.66286],[-112.34842,40.66237],[-112.3437,40.66216],[-112.33722,40.6622],[-112.33272,40.66239],[-112.32963,40.66264],[-112.3256,40.66297],[-112.32184,40.66349],[-112.31878,40.66404],[-112.31558,40.66467],[-112.31238,40.66541],[-112.30948,40.66613],[-112.30528,40.66735],[-112.30277,40.66817],[-112.30076,40.66888],[-112.29766,40.67006],[-112.29297,40.67205],[-112.28826,40.67435],[-112.28567,40.67575],[-112.28022,40.67907],[-112.27509,40.68268],[-112.27021,40.68681],[-112.26737,40.68933],[-112.26425,40.69255],[-112.26174,40.69568],[-112.2609,40.6967],[-112.25955,40.69861],[-112.25868,40.69987],[-112.25781,40.70119],[-112.25638,40.70337],[-112.25546,40.70476],[-112.25501,40.70538],[-112.25444,40.706],[-112.25397,40.70644],[-112.25344,40.70688],[-112.25273,40.70736],[-112.25046,40.70868],[-112.24491,40.71193],[-112.24114,40.71423],[-112.23703,40.71657],[-112.23698,40.71659],[-112.23123,40.72003],[-112.22794,40.72195],[-112.22725,40.72234],[-112.22663,40.72267],[-112.22616,40.72288],[-112.22527,40.72323],[-112.22473,40.72345],[-112.22305,40.72414],[-112.22143,40.72477],[-112.22096,40.72498],[-112.22065,40.72512],[-112.21955,40.72555],[-112.21227,40.72842],[-112.20791,40.73021],[-112.20335,40.73248],[-112.20156,40.7334],[-112.19804,40.73517],[-112.19253,40.73812],[-112.18838,40.74084],[-112.18715,40.74174],[-112.18305,40.74508],[-112.18248,40.74555],[-112.17896,40.74851],[-112.17814,40.74922],[-112.1682,40.75746],[-112.16607,40.75925],[-112.16521,40.75987],[-112.164,40.76073],[-112.16267,40.76175],[-112.15966,40.76421],[-112.15717,40.76628],[-112.15579,40.76744],[-112.15466,40.76834],[-112.15426,40.76864],[-112.15363,40.76903],[-112.15297,40.76938],[-112.15226,40.76968],[-112.1515,40.76996],[-112.15065,40.77021],[-112.14982,40.77039],[-112.14905,40.7705],[-112.14826,40.77058],[-112.14738,40.77063],[-112.13906,40.77068],[-112.12896,40.77067],[-112.07495,40.77083],[-112.07481,40.77083],[-112.07129,40.77085],[-112.05415,40.77085],[-112.03947,40.77094],[-112.03887,40.77094],[-112.03444,40.77093],[-112.02925,40.77093],[-112.02518,40.77093],[-112.02008,40.77094],[-112.01879,40.77094],[-112.01839,40.77094],[-112.01628,40.77093],[-112.01539,40.77092],[-112.01449,40.7709],[-112.0137,40.77086],[-112.01279,40.7708],[-112.01181,40.77071],[-112.01108,40.77062],[-112.01055,40.77055],[-112.00922,40.77037],[-112.00823,40.7702],[-112.00754,40.77007],[-112.00631,40.76981],[-112.00561,40.76964],[-112.0044,40.76933],[-112.00333,40.76904],[-112.00235,40.76872],[-112.00173,40.76851],[-112.0007,40.76812],[-111.99955,40.7677],[-111.99813,40.76709],[-111.99557,40.76604],[-111.99516,40.76587],[-111.9947,40.76572],[-111.99402,40.76552],[-111.9935,40.76536],[-111.99282,40.76518],[-111.99206,40.76501],[-111.99103,40.7648],[-111.98991,40.76463],[-111.98947,40.76458],[-111.98885,40.76452],[-111.98827,40.76448],[-111.98749,40.76443],[-111.9861,40.76441],[-111.98292,40.7644],[-111.97502,40.76439],[-111.97052,40.76441],[-111.96846,40.76441],[-111.96601,40.76455],[-111.96527,40.76457],[-111.96259,40.76471],[-111.9587,40.76492],[-111.95637,40.76504],[-111.9452,40.76576],[-111.94111,40.76603],[-111.93963,40.7661],[-111.93859,40.76612],[-111.93745,40.76605],[-111.93625,40.7659],[-111.93514,40.76574],[-111.93424,40.76559],[-111.9328,40.76536],[-111.93195,40.76522],[-111.92972,40.76486],[-111.92921,40.76478],[-111.92902,40.76475],[-111.92834,40.76465],[-111.92775,40.76458],[-111.92706,40.76454],[-111.92643,40.76453],[-111.92597,40.76452],[-111.92429,40.7645],[-111.92223,40.76448],[-111.92014,40.76447],[-111.91927,40.76446],[-111.91822,40.76447],[-111.9179,40.76444],[-111.9175,40.76438],[-111.9172,40.76429],[-111.91686,40.76416],[-111.91655,40.764],[-111.91642,40.76392],[-111.91594,40.76351],[-111.91563,40.7631],[-111.9155,40.76277],[-111.91545,40.76258],[-111.91535,40.76191],[-111.91514,40.76007],[-111.91492,40.75948],[-111.91474,40.75903],[-111.91449,40.7585],[-111.91407,40.75795],[-111.91353,40.75741],[-111.91321,40.75703],[-111.9128,40.75651],[-111.91243,40.75589],[-111.91202,40.75507],[-111.91126,40.75339],[-111.91107,40.75239],[-111.91098,40.75198],[-111.91087,40.7516],[-111.91047,40.75068],[-111.91002,40.75005],[-111.90937,40.74933],[-111.90856,40.74866],[-111.90797,40.74817],[-111.90708,40.74746],[-111.90624,40.74679],[-111.90603,40.74663],[-111.90547,40.74611],[-111.90512,40.7457],[-111.9048,40.7452],[-111.90453,40.74465],[-111.90433,40.74402],[-111.90425,40.74348],[-111.90422,40.74276],[-111.90428,40.74185],[-111.90432,40.74131],[-111.90454,40.73897],[-111.90479,40.73617],[-111.90483,40.73491],[-111.90482,40.73373],[-111.9048,40.73334],[-111.90457,40.7257],[-111.90457,40.72516],[-111.90479,40.72391],[-111.905,40.72263],[-111.90509,40.72221],[-111.90536,40.72103],[-111.9054,40.72083],[-111.90543,40.72055],[-111.90542,40.72029],[-111.90536,40.71998],[-111.90526,40.71972],[-111.90515,40.71944],[-111.90497,40.71914],[-111.90481,40.71895],[-111.90452,40.71868],[-111.90432,40.71851],[-111.90405,40.71834],[-111.90378,40.71819],[-111.90348,40.71806],[-111.90312,40.71796],[-111.90271,40.71788],[-111.90225,40.71782],[-111.90182,40.71781],[-111.90001,40.71791],[-111.89932,40.71796],[-111.89728,40.71814],[-111.89663,40.71816],[-111.89638,40.71816],[-111.89557,40.71817],[-111.89441,40.71817],[-111.89329,40.71817],[-111.8916,40.71818],[-111.89063,40.71817],[-111.8887,40.71816],[-111.88784,40.71817],[-111.88347,40.71815],[-111.88294,40.71814],[-111.88229,40.71815],[-111.87719,40.71816],[-111.87653,40.71817],[-111.87616,40.71817],[-111.87525,40.71819],[-111.8747,40.71824],[-111.87424,40.71827],[-111.87371,40.71831],[-111.87273,40.71842],[-111.87168,40.71857],[-111.87083,40.71873],[-111.86914,40.71902],[-111.86804,40.71915],[-111.86722,40.71923],[-111.86594,40.71931],[-111.86576,40.71932],[-111.86508,40.71933],[-111.86247,40.71943],[-111.8596,40.7195],[-111.85772,40.71956],[-111.857,40.71957],[-111.85416,40.71956],[-111.85271,40.71955],[-111.85097,40.71956],[-111.84925,40.71955],[-111.84882,40.71955],[-111.84738,40.71949],[-111.8461,40.71938],[-111.8449,40.7192],[-111.84303,40.71885],[-111.84171,40.71856],[-111.8392,40.71798],[-111.83752,40.71759],[-111.83625,40.71733],[-111.83517,40.71701],[-111.83419,40.71658],[-111.83358,40.71627],[-111.83247,40.71575],[-111.83133,40.71534],[-111.8303,40.71505],[-111.82888,40.71466],[-111.82823,40.71449],[-111.8262,40.71392],[-111.82264,40.71294],[-111.82222,40.71283],[-111.82176,40.7127],[-111.82109,40.71256],[-111.82053,40.71248],[-111.81999,40.71246],[-111.81945,40.71248],[-111.81904,40.71253],[-111.81869,40.71261],[-111.81842,40.71269],[-111.81809,40.71281],[-111.81768,40.71303],[-111.81708,40.71342],[-111.81606,40.71401],[-111.8158,40.71415],[-111.81539,40.71434],[-111.81516,40.71442],[-111.81472,40.71451],[-111.81431,40.71457],[-111.81375,40.7146],[-111.80878,40.71438],[-111.80818,40.71434],[-111.8074,40.71423],[-111.8066,40.71405],[-111.80586,40.71385],[-111.80483,40.71344],[-111.8039,40.713],[-111.80302,40.71265],[-111.80221,40.71235],[-111.80056,40.7118],[-111.79897,40.71128],[-111.79828,40.71108],[-111.79793,40.71101],[-111.79757,40.71097],[-111.79714,40.71093],[-111.79662,40.71096],[-111.7962,40.71104],[-111.79585,40.71113],[-111.79481,40.71141],[-111.79408,40.71161],[-111.79374,40.71169],[-111.79336,40.71176],[-111.79293,40.7118],[-111.79259,40.71182],[-111.79233,40.71182],[-111.79141,40.71183],[-111.79089,40.71185],[-111.79037,40.71192],[-111.78995,40.71199],[-111.78937,40.71216],[-111.78838,40.71262],[-111.78716,40.71329],[-111.78583,40.71407],[-111.78523,40.71456],[-111.78484,40.71492],[-111.78451,40.71531],[-111.78428,40.71575],[-111.78411,40.71621],[-111.78362,40.71756],[-111.78329,40.7181],[-111.78304,40.71834],[-111.78206,40.71898],[-111.7817,40.71912],[-111.7793,40.71984],[-111.7787,40.72006],[-111.77813,40.72035],[-111.77666,40.72118],[-111.77632,40.72147],[-111.77587,40.72182],[-111.77516,40.72226],[-111.77427,40.72293],[-111.7721,40.72464],[-111.77123,40.72501],[-111.76999,40.72537],[-111.76903,40.72571],[-111.76831,40.72612],[-111.76776,40.72659],[-111.76713,40.72717],[-111.76647,40.72777],[-111.76579,40.72817],[-111.76514,40.72841],[-111.7645,40.72859],[-111.76365,40.72882],[-111.76301,40.72901],[-111.76228,40.72923],[-111.76117,40.7298],[-111.76051,40.73015],[-111.76009,40.73043],[-111.7591,40.73119],[-111.75874,40.73143],[-111.75853,40.73153],[-111.7574,40.73192],[-111.75679,40.73205],[-111.75589,40.73216],[-111.75414,40.73245],[-111.75261,40.7329],[-111.7519,40.73301],[-111.75112,40.73306],[-111.75029,40.73311],[-111.7499,40.73319],[-111.7486,40.73358],[-111.74835,40.73368],[-111.74803,40.73391],[-111.74775,40.73416],[-111.74744,40.73447],[-111.74708,40.73494],[-111.74678,40.73526],[-111.74641,40.73559],[-111.74566,40.73616],[-111.74452,40.73686],[-111.74391,40.73726],[-111.74346,40.73777],[-111.74307,40.73835],[-111.74274,40.73903],[-111.74255,40.73972],[-111.74215,40.74037],[-111.74152,40.74101],[-111.74096,40.74144],[-111.74011,40.7418],[-111.73931,40.74198],[-111.73877,40.74208],[-111.73773,40.74216],[-111.73366,40.74251],[-111.73292,40.7427],[-111.73218,40.74298],[-111.7318,40.74321],[-111.73012,40.74435],[-111.72919,40.74484],[-111.72744,40.74567],[-111.72178,40.74827],[-111.72102,40.74871],[-111.72042,40.74924],[-111.71919,40.75042],[-111.7184,40.75102],[-111.71768,40.75137],[-111.71677,40.75166],[-111.71597,40.75175],[-111.71517,40.75177],[-111.71455,40.75172],[-111.7141,40.75163],[-111.71354,40.75146],[-111.71292,40.7512],[-111.71238,40.75087],[-111.71049,40.74952],[-111.70974,40.74912],[-111.70889,40.74881],[-111.70798,40.74862],[-111.70699,40.74853],[-111.70616,40.74851],[-111.70435,40.74874],[-111.70325,40.74888],[-111.70228,40.74888],[-111.70122,40.7488],[-111.70029,40.7486],[-111.69932,40.74826],[-111.69837,40.74768],[-111.69695,40.74666],[-111.69605,40.74608],[-111.69521,40.74567],[-111.69281,40.74479],[-111.69169,40.74428],[-111.69011,40.74354],[-111.68927,40.7432],[-111.6884,40.74295],[-111.68758,40.74274],[-111.68665,40.74259],[-111.68574,40.7425],[-111.68494,40.74246],[-111.68408,40.74247],[-111.68327,40.74252],[-111.68265,40.74257],[-111.68147,40.7427],[-111.68073,40.74273],[-111.67984,40.74268],[-111.67897,40.74253],[-111.67754,40.74204],[-111.67681,40.74162],[-111.67623,40.74123],[-111.67481,40.74014],[-111.67402,40.73971],[-111.67333,40.7394],[-111.67289,40.73926],[-111.67244,40.73914],[-111.67158,40.73897],[-111.67042,40.73891],[-111.66954,40.73896],[-111.66883,40.7391],[-111.66823,40.73927],[-111.66747,40.73953],[-111.6662,40.74012],[-111.66129,40.74233],[-111.66034,40.74273],[-111.65931,40.74309],[-111.65855,40.74332],[-111.65758,40.74355],[-111.65663,40.74371],[-111.65589,40.74382],[-111.6545,40.74399],[-111.65343,40.74408],[-111.65254,40.7442],[-111.65167,40.74434],[-111.65078,40.74458],[-111.65,40.74489],[-111.64798,40.74563],[-111.64663,40.74608],[-111.64467,40.74657],[-111.64347,40.74674],[-111.63738,40.74776],[-111.63571,40.74826],[-111.63472,40.74872],[-111.63379,40.74921],[-111.63153,40.7505],[-111.63026,40.75112],[-111.62865,40.75185],[-111.62613,40.75275],[-111.62551,40.75291],[-111.62464,40.75314],[-111.62335,40.75344],[-111.62223,40.75362],[-111.62129,40.7537],[-111.62044,40.75375],[-111.6194,40.75375],[-111.61856,40.75371],[-111.61756,40.75355],[-111.61678,40.75339],[-111.6161,40.7532],[-111.61522,40.75294],[-111.6148,40.7528],[-111.61424,40.75257],[-111.61117,40.75114],[-111.61028,40.75074],[-111.60928,40.75042],[-111.60835,40.75016],[-111.60699,40.7499],[-111.60583,40.7498],[-111.60436,40.74976],[-111.60262,40.74987],[-111.60143,40.75001],[-111.60018,40.75026],[-111.59908,40.7506],[-111.59781,40.75103],[-111.58924,40.75448],[-111.58801,40.75494],[-111.58719,40.75523],[-111.58622,40.7555],[-111.58505,40.75576],[-111.5834,40.756],[-111.58179,40.75604],[-111.58029,40.75601],[-111.57914,40.75591],[-111.57742,40.75559],[-111.5761,40.75527],[-111.57477,40.7548],[-111.57351,40.75425],[-111.57232,40.75364],[-111.57174,40.75328],[-111.57078,40.75264],[-111.56997,40.75195],[-111.56921,40.75122],[-111.56791,40.74983],[-111.56609,40.74788],[-111.55326,40.73438],[-111.54962,40.73054],[-111.54863,40.72969],[-111.54762,40.72909],[-111.54692,40.72868],[-111.54381,40.72723],[-111.54334,40.72702],[-111.54087,40.72585],[-111.53962,40.72539],[-111.53866,40.72511],[-111.53693,40.72467],[-111.52621,40.72207],[-111.52589,40.72199],[-111.52468,40.72171],[-111.5241,40.72162],[-111.52333,40.72152],[-111.5226,40.72147],[-111.52198,40.72145],[-111.52132,40.72147],[-111.52075,40.72152],[-111.5201,40.72158],[-111.51951,40.72169],[-111.51893,40.7218],[-111.51828,40.72197],[-111.51769,40.72216],[-111.51708,40.72238],[-111.51656,40.72261],[-111.51196,40.72475],[-111.50566,40.72772],[-111.49785,40.73133],[-111.49738,40.73154],[-111.49268,40.73372],[-111.48141,40.73892],[-111.47954,40.73977],[-111.47837,40.74035],[-111.47687,40.74113],[-111.47496,40.74223],[-111.47426,40.74272],[-111.47216,40.74402],[-111.47156,40.74469],[-111.47107,40.74537],[-111.4707,40.74617],[-111.47056,40.74736],[-111.47081,40.74883],[-111.47069,40.74995],[-111.47027,40.75124],[-111.46998,40.75201],[-111.46963,40.75307],[-111.46957,40.75351],[-111.46959,40.75392],[-111.46986,40.75466],[-111.47072,40.75576],[-111.47129,40.75646],[-111.4715,40.75715],[-111.47154,40.75772],[-111.47134,40.75855],[-111.47106,40.75911],[-111.47088,40.75978],[-111.47078,40.76148],[-111.4705,40.76418],[-111.47021,40.76476],[-111.46981,40.76522],[-111.46948,40.76562],[-111.46913,40.7659],[-111.46883,40.76622],[-111.46833,40.76704],[-111.46825,40.76787],[-111.46841,40.76862],[-111.46916,40.76977],[-111.46944,40.77031],[-111.46952,40.77066],[-111.46956,40.77112],[-111.46941,40.77187],[-111.4691,40.77258],[-111.46845,40.77406],[-111.46829,40.77488],[-111.46804,40.77606],[-111.46773,40.77656],[-111.46727,40.777],[-111.46617,40.77765],[-111.46488,40.77796],[-111.46312,40.77845],[-111.46163,40.77906],[-111.4604,40.77994],[-111.45957,40.78074],[-111.45887,40.78188],[-111.45845,40.78278],[-111.45808,40.78342],[-111.45753,40.7839],[-111.45684,40.78435],[-111.45537,40.7852],[-111.45419,40.786],[-111.4537,40.78648],[-111.45333,40.78703],[-111.4532,40.78746],[-111.45311,40.7878],[-111.45301,40.78851],[-111.45282,40.7895],[-111.45201,40.7905],[-111.45123,40.79096],[-111.45083,40.79119],[-111.45042,40.79145],[-111.44989,40.79188],[-111.44946,40.79249],[-111.4492,40.79313],[-111.44908,40.79398],[-111.44885,40.79458],[-111.44805,40.79565],[-111.44712,40.79685],[-111.44661,40.79738],[-111.4452,40.79878],[-111.4433,40.80038],[-111.43974,40.80331],[-111.43925,40.80367],[-111.43849,40.80395],[-111.43288,40.80571],[-111.43068,40.80629],[-111.42863,40.80673],[-111.42634,40.8071],[-111.42312,40.80753],[-111.41556,40.80856],[-111.41454,40.80864],[-111.41335,40.80862],[-111.41203,40.8085],[-111.41058,40.80833],[-111.40967,40.80828],[-111.40872,40.80832],[-111.40792,40.80843],[-111.40733,40.80852],[-111.40663,40.8087],[-111.4059,40.80896],[-111.4051,40.80932],[-111.40447,40.80968],[-111.40387,40.8101],[-111.4033,40.81051],[-111.40299,40.81078],[-111.40114,40.81296],[-111.40092,40.81324],[-111.39905,40.81593],[-111.39891,40.81613],[-111.39615,40.81972],[-111.39486,40.82145],[-111.39388,40.82297],[-111.39287,40.82476],[-111.39197,40.82673],[-111.39163,40.82749],[-111.38728,40.84137],[-111.38711,40.84224],[-111.38707,40.84312],[-111.38709,40.84372],[-111.38721,40.84437],[-111.38746,40.84523],[-111.38767,40.8458],[-111.38817,40.84676],[-111.38861,40.84759],[-111.389,40.84842],[-111.3892,40.84918],[-111.38926,40.85001],[-111.38919,40.85092],[-111.38904,40.85148],[-111.3888,40.85209],[-111.38789,40.85387],[-111.3874,40.85501],[-111.38714,40.85602],[-111.38699,40.85709],[-111.38696,40.85806],[-111.38705,40.85925],[-111.38787,40.86322],[-111.38811,40.86422],[-111.38917,40.86902],[-111.39023,40.87399],[-111.39028,40.8742],[-111.39065,40.8758],[-111.39115,40.87816],[-111.39251,40.88429],[-111.39317,40.88726],[-111.39376,40.89008],[-111.39441,40.89342],[-111.39535,40.89813],[-111.39567,40.89949],[-111.39596,40.9005],[-111.3965,40.90208],[-111.39725,40.9039],[-111.39829,40.90597],[-111.39909,40.90757],[-111.40012,40.90919],[-111.40159,40.91153],[-111.40329,40.91375],[-111.4046,40.91535],[-111.40715,40.91791],[-111.40746,40.91824],[-111.40774,40.91852],[-111.4084,40.91927],[-111.40902,40.92008],[-111.40964,40.92094],[-111.41012,40.92184],[-111.41046,40.92263],[-111.41077,40.92393],[-111.41089,40.9248],[-111.41086,40.92605],[-111.41078,40.92665],[-111.41062,40.92735],[-111.40954,40.931],[-111.4086,40.93424],[-111.40841,40.93505],[-111.40837,40.93578],[-111.40845,40.93659],[-111.40876,40.93729],[-111.40921,40.93806],[-111.41081,40.93987],[-111.41155,40.94087],[-111.4121,40.94181],[-111.41263,40.94305],[-111.41289,40.94374],[-111.41304,40.94423],[-111.41333,40.9449],[-111.414,40.9459],[-111.41503,40.94679],[-111.41714,40.948],[-111.41836,40.94869],[-111.42018,40.95007],[-111.42103,40.95082],[-111.42193,40.95203],[-111.42267,40.95319],[-111.42403,40.95611],[-111.42445,40.95692],[-111.4249,40.95766],[-111.42535,40.95821],[-111.42594,40.95876],[-111.42663,40.95924],[-111.43085,40.96171],[-111.43256,40.96288],[-111.43352,40.96356],[-111.43641,40.96532],[-111.43746,40.96603],[-111.43814,40.96674],[-111.43852,40.96735],[-111.4389,40.96812],[-111.43894,40.96839],[-111.43897,40.96863],[-111.43898,40.96891],[-111.43897,40.96916],[-111.43894,40.96942],[-111.43884,40.96981],[-111.43872,40.97014],[-111.43856,40.97046],[-111.43836,40.97075],[-111.43813,40.97101],[-111.43794,40.97121],[-111.4376,40.97148],[-111.43694,40.97191],[-111.43522,40.97288],[-111.43428,40.97343],[-111.43181,40.97483],[-111.43144,40.97502],[-111.42807,40.97695],[-111.42752,40.97726],[-111.42567,40.9783],[-111.41874,40.98225],[-111.41675,40.98323],[-111.41523,40.98391],[-111.41342,40.98466],[-111.41155,40.98541],[-111.41015,40.98601],[-111.40875,40.98669],[-111.40738,40.98742],[-111.4061,40.98816],[-111.40337,40.98988],[-111.40098,40.99175],[-111.40014,40.99242],[-111.39703,40.99539],[-111.39599,40.99626],[-111.39387,40.99792],[-111.39193,40.99923],[-111.38751,41.0021],[-111.38537,41.00368],[-111.37938,41.00839],[-111.37806,41.00931],[-111.37718,41.00971],[-111.37613,41.01],[-111.37333,41.01057],[-111.37201,41.01096],[-111.37103,41.0114],[-111.37004,41.01203],[-111.36928,41.01274],[-111.36888,41.01328],[-111.36847,41.01393],[-111.36813,41.0149],[-111.36742,41.01657],[-111.36691,41.01732],[-111.3662,41.01807],[-111.36516,41.01889],[-111.36406,41.01955],[-111.36288,41.02011],[-111.35879,41.02184],[-111.35299,41.02409],[-111.33763,41.02988],[-111.33647,41.03042],[-111.3355,41.03099],[-111.33456,41.03166],[-111.33382,41.03233],[-111.33283,41.03338],[-111.33274,41.03352],[-111.33148,41.03548],[-111.33085,41.03623],[-111.32977,41.03716],[-111.32785,41.0386],[-111.32611,41.03965],[-111.32428,41.0406],[-111.32275,41.04129],[-111.32036,41.04216],[-111.31617,41.04354],[-111.31457,41.04404],[-111.31297,41.0444],[-111.30988,41.04498],[-111.30765,41.04541],[-111.30629,41.04578],[-111.30478,41.04635],[-111.3032,41.04715],[-111.30164,41.04814],[-111.30021,41.04912],[-111.29912,41.04995],[-111.29836,41.0506],[-111.29286,41.05611],[-111.29177,41.05716],[-111.29068,41.05805],[-111.28986,41.05862],[-111.2852,41.06163],[-111.28218,41.06366],[-111.2808,41.06437],[-111.27919,41.06495],[-111.27737,41.0655],[-111.27596,41.06584],[-111.27127,41.06664],[-111.27009,41.06693],[-111.2692,41.06725],[-111.2682,41.06774],[-111.26623,41.06895],[-111.26411,41.07023],[-111.26109,41.07198],[-111.25743,41.07392],[-111.25429,41.07555],[-111.24972,41.07792],[-111.24739,41.07907],[-111.24567,41.07998],[-111.24376,41.0812],[-111.24009,41.08379],[-111.23928,41.08426],[-111.23842,41.08463],[-111.23749,41.08497],[-111.23482,41.08563],[-111.23332,41.08605],[-111.23232,41.08645],[-111.23131,41.08699],[-111.22682,41.08975],[-111.22469,41.09122],[-111.22353,41.09216],[-111.22154,41.09399],[-111.21891,41.09641],[-111.21736,41.09771],[-111.21504,41.09938],[-111.21334,41.10062],[-111.21211,41.10174],[-111.21054,41.10348],[-111.20853,41.10555],[-111.20658,41.10734],[-111.20458,41.1089],[-111.20227,41.1105],[-111.2009,41.11145],[-111.19873,41.11327],[-111.19718,41.11471],[-111.19559,41.11617],[-111.19388,41.11752],[-111.19253,41.11846],[-111.19043,41.11972],[-111.18911,41.12038],[-111.18676,41.12137],[-111.18588,41.12168],[-111.18471,41.12209],[-111.18265,41.12259],[-111.18029,41.12311],[-111.17743,41.12343],[-111.17457,41.12358],[-111.17276,41.1237],[-111.17113,41.12407],[-111.16967,41.12463],[-111.16239,41.12811],[-111.16033,41.12924],[-111.15932,41.12994],[-111.15825,41.13089],[-111.15732,41.13182],[-111.15663,41.13277],[-111.15331,41.13814],[-111.15234,41.13975],[-111.14958,41.14425],[-111.14794,41.14688],[-111.14642,41.14934],[-111.14541,41.15106],[-111.14497,41.15196],[-111.14441,41.15319],[-111.14429,41.15346],[-111.14377,41.15471],[-111.14348,41.15549],[-111.14309,41.15642],[-111.14255,41.15737],[-111.14205,41.15819],[-111.14148,41.15896],[-111.1396,41.16123],[-111.13838,41.16271],[-111.13763,41.16388],[-111.13726,41.16466],[-111.13691,41.16569],[-111.13669,41.16667],[-111.13608,41.17023],[-111.1356,41.17213],[-111.13525,41.17322],[-111.13411,41.17601],[-111.13255,41.17972],[-111.13115,41.18305],[-111.13065,41.18394],[-111.13004,41.18464],[-111.12958,41.18514],[-111.1292,41.18542],[-111.12852,41.18594],[-111.12833,41.18607],[-111.12752,41.1865],[-111.12571,41.18732],[-111.12218,41.18874],[-111.12015,41.18977],[-111.11859,41.19103],[-111.11486,41.19475],[-111.1143,41.19529],[-111.11412,41.19545],[-111.11349,41.19608],[-111.111,41.19827],[-111.10958,41.19946],[-111.1082,41.20064],[-111.10796,41.20085],[-111.10717,41.20155],[-111.10567,41.20272],[-111.09687,41.2104],[-111.09585,41.21197],[-111.09061,41.22259],[-111.0897,41.224],[-111.08846,41.22547],[-111.08552,41.22865],[-111.08421,41.23006],[-111.07291,41.24205],[-111.07018,41.24472],[-111.06972,41.24511],[-111.06811,41.2463],[-111.06556,41.24774],[-111.06334,41.24862],[-111.06047,41.24928],[-111.05878,41.24957],[-111.05803,41.24962],[-111.05596,41.24968],[-111.05448,41.24962],[-111.05242,41.24936],[-111.05042,41.24891],[-111.04655,41.24758],[-111.04595,41.24737],[-111.04385,41.24675],[-111.04126,41.24639],[-111.03876,41.24624],[-111.03353,41.24629],[-111.02517,41.24637],[-111.02394,41.24638],[-111.02017,41.24663],[-111.01804,41.24702],[-111.01566,41.24744],[-111.01254,41.24828],[-111.01059,41.24902],[-111.00719,41.25055],[-111.00049,41.25372],[-110.9999,41.25401],[-110.9956,41.25604],[-110.99252,41.25743],[-110.98957,41.25883],[-110.98813,41.25955],[-110.98607,41.26051],[-110.98551,41.26077],[-110.98381,41.26151],[-110.98272,41.26189],[-110.98155,41.26213],[-110.98098,41.26223],[-110.97973,41.2622],[-110.9789,41.26207],[-110.97813,41.26189],[-110.97772,41.26177],[-110.97727,41.26161],[-110.97676,41.26141],[-110.97596,41.26093],[-110.97559,41.26069],[-110.97499,41.2603],[-110.97314,41.25924],[-110.97135,41.25853],[-110.97044,41.25832],[-110.96883,41.25814],[-110.96745,41.25812],[-110.96711,41.25813],[-110.96404,41.25838],[-110.96186,41.2586],[-110.95979,41.25897],[-110.95777,41.2597],[-110.95651,41.26035],[-110.9554,41.26109],[-110.95467,41.26177],[-110.95415,41.26236],[-110.95301,41.26384],[-110.95252,41.26443],[-110.95192,41.26515],[-110.95087,41.26601],[-110.95005,41.26646],[-110.94912,41.26683],[-110.94813,41.26705],[-110.94638,41.26729],[-110.9459,41.26734],[-110.94516,41.26743],[-110.94447,41.26749],[-110.944,41.26755],[-110.94294,41.2676],[-110.94135,41.26774],[-110.94047,41.26783],[-110.93895,41.26786],[-110.9383,41.26788],[-110.93762,41.26789],[-110.93676,41.26787],[-110.93563,41.26785],[-110.93405,41.26776],[-110.93217,41.26754],[-110.93121,41.26743],[-110.92889,41.26722],[-110.92678,41.26701],[-110.92127,41.26632],[-110.91504,41.2652],[-110.90709,41.26371],[-110.90172,41.26271],[-110.90001,41.26244],[-110.89967,41.26239],[-110.89836,41.26224],[-110.89702,41.26212],[-110.89529,41.26201],[-110.89366,41.26196],[-110.89231,41.26194],[-110.89073,41.26197],[-110.88789,41.26212],[-110.88589,41.26233],[-110.88253,41.26283],[-110.87844,41.26376],[-110.87552,41.26461],[-110.87267,41.26568],[-110.8706,41.26662],[-110.86228,41.27096],[-110.86159,41.27132],[-110.85972,41.27197],[-110.85797,41.27239],[-110.85765,41.27243],[-110.8559,41.27249],[-110.8548,41.27242],[-110.85346,41.27223],[-110.85295,41.2721],[-110.85191,41.27183],[-110.84191,41.2681],[-110.83993,41.26767],[-110.83799,41.26748],[-110.83564,41.26754],[-110.83306,41.26794],[-110.83113,41.26848],[-110.82983,41.26898],[-110.823,41.27211],[-110.8227,41.27222],[-110.82109,41.27267],[-110.81959,41.27297],[-110.81811,41.27314],[-110.81653,41.27319],[-110.81043,41.27273],[-110.80861,41.27281],[-110.80746,41.27298],[-110.80577,41.27344],[-110.80449,41.27394],[-110.80381,41.27428],[-110.80335,41.27455],[-110.80125,41.27603],[-110.80106,41.27617],[-110.79857,41.27806],[-110.78268,41.29018],[-110.78252,41.29031],[-110.77836,41.29347],[-110.77718,41.29416],[-110.77696,41.29428],[-110.77524,41.29517],[-110.76208,41.30163],[-110.76094,41.30209],[-110.75698,41.30322],[-110.75671,41.30329],[-110.75059,41.30504],[-110.73804,41.30858],[-110.73746,41.30868],[-110.73645,41.30881],[-110.73572,41.30883],[-110.73533,41.30883],[-110.73488,41.30882],[-110.73347,41.30864],[-110.73202,41.30829],[-110.73149,41.30812],[-110.73092,41.30795],[-110.72951,41.30752],[-110.7283,41.30714],[-110.72779,41.30698],[-110.72256,41.30532],[-110.70567,41.30005],[-110.70024,41.29834],[-110.69919,41.29791],[-110.69578,41.29606],[-110.69423,41.29531],[-110.69257,41.29484],[-110.69094,41.29465],[-110.68937,41.29468],[-110.68779,41.29495],[-110.68664,41.29528],[-110.68541,41.29585],[-110.68426,41.29648],[-110.68215,41.29763],[-110.68003,41.29858],[-110.67876,41.29891],[-110.67753,41.29908],[-110.67578,41.29919],[-110.67359,41.29914],[-110.66726,41.29902],[-110.64744,41.29873],[-110.64055,41.2986],[-110.63594,41.29852],[-110.63477,41.29851],[-110.63406,41.29851],[-110.63155,41.29847],[-110.62882,41.29841],[-110.62853,41.2984],[-110.62603,41.29834],[-110.62574,41.29834],[-110.60671,41.29803],[-110.60344,41.29802],[-110.60315,41.29802],[-110.60202,41.29793],[-110.57281,41.29744],[-110.56266,41.29729],[-110.55991,41.29724],[-110.5582,41.29728],[-110.55652,41.29739],[-110.55492,41.2976],[-110.5539,41.2978],[-110.55195,41.29825],[-110.54931,41.29909],[-110.54458,41.30068],[-110.54142,41.30173],[-110.53546,41.30371],[-110.52283,41.30787],[-110.52159,41.30828],[-110.51897,41.30913],[-110.51183,41.3115],[-110.50977,41.31217],[-110.50834,41.31262],[-110.50797,41.31274],[-110.50614,41.31337],[-110.50608,41.31339],[-110.50475,41.31381],[-110.50072,41.31514],[-110.49048,41.3185],[-110.4739,41.32398],[-110.46782,41.32588],[-110.46453,41.32665],[-110.46291,41.32696],[-110.46134,41.32719],[-110.45455,41.32807],[-110.45408,41.32813],[-110.45048,41.32861],[-110.45034,41.32863],[-110.44961,41.32873],[-110.44905,41.3288],[-110.44859,41.32885],[-110.44813,41.3289],[-110.44692,41.32905],[-110.4417,41.3297],[-110.44082,41.3298],[-110.43725,41.3303],[-110.43261,41.33092],[-110.42935,41.33141],[-110.42848,41.33154],[-110.42522,41.33217],[-110.42204,41.33285],[-110.4192,41.33357],[-110.41662,41.33429],[-110.41416,41.33509],[-110.41092,41.33621],[-110.4052,41.33847],[-110.40366,41.33917],[-110.39834,41.34162],[-110.38983,41.34554],[-110.38959,41.34565],[-110.37948,41.35031],[-110.3755,41.35216],[-110.3725,41.3533],[-110.3707,41.35382],[-110.36783,41.35433],[-110.36522,41.35452],[-110.36312,41.35453],[-110.35774,41.35458],[-110.35428,41.35459],[-110.34792,41.35467],[-110.34666,41.35474],[-110.34536,41.35488],[-110.34406,41.35507],[-110.34285,41.35527],[-110.34155,41.35554],[-110.34019,41.35587],[-110.33809,41.35652],[-110.33753,41.35669],[-110.33249,41.35827],[-110.33191,41.35847],[-110.32142,41.36184],[-110.3197,41.36229],[-110.31822,41.36265],[-110.30753,41.36497],[-110.30599,41.3653],[-110.30548,41.36539],[-110.30441,41.36564],[-110.30023,41.36655],[-110.29971,41.36667],[-110.29624,41.36742],[-110.29542,41.36756],[-110.29416,41.36777],[-110.29286,41.36795],[-110.26333,41.37129],[-110.26081,41.37164],[-110.25818,41.37206],[-110.25065,41.3733],[-110.24841,41.3737],[-110.24625,41.37411],[-110.24564,41.37424],[-110.24298,41.37489],[-110.2413,41.37538],[-110.23988,41.37587],[-110.23847,41.37638],[-110.23613,41.37735],[-110.23499,41.37787],[-110.23386,41.37843],[-110.22665,41.3822],[-110.22504,41.38291],[-110.22381,41.38341],[-110.22251,41.38391],[-110.22146,41.38428],[-110.21973,41.38482],[-110.21802,41.3853],[-110.21709,41.38552],[-110.21666,41.38562],[-110.20113,41.38875],[-110.2005,41.38887],[-110.19225,41.39051],[-110.19107,41.39075],[-110.18975,41.39105],[-110.18788,41.39151],[-110.18651,41.39192],[-110.18489,41.39243],[-110.18445,41.39258],[-110.18248,41.39334],[-110.18092,41.39398],[-110.17884,41.39496],[-110.17037,41.39933],[-110.16217,41.40355],[-110.15806,41.40565],[-110.15752,41.4059],[-110.15681,41.40621],[-110.15625,41.40642],[-110.15534,41.40675],[-110.15448,41.40702],[-110.15377,41.40723],[-110.15316,41.40738],[-110.15224,41.4076],[-110.15099,41.40783],[-110.1474,41.40854],[-110.14538,41.40895],[-110.14345,41.40936],[-110.1424,41.40964],[-110.14141,41.40995],[-110.14074,41.41018],[-110.14009,41.41043],[-110.13927,41.41078],[-110.13847,41.41115],[-110.13715,41.41184],[-110.13597,41.4126],[-110.13487,41.4134],[-110.13386,41.41425],[-110.1331,41.41498],[-110.13239,41.41575],[-110.13192,41.41634],[-110.13149,41.41697],[-110.13106,41.41754],[-110.1307,41.41815],[-110.1294,41.42052],[-110.12854,41.42201],[-110.12801,41.42283],[-110.1275,41.42349],[-110.12694,41.42417],[-110.12635,41.42481],[-110.1257,41.42541],[-110.1249,41.42611],[-110.12404,41.42677],[-110.12329,41.42729],[-110.12258,41.42772],[-110.12187,41.42812],[-110.12105,41.42856],[-110.12022,41.42894],[-110.11937,41.42931],[-110.11858,41.42959],[-110.11274,41.43161],[-110.10863,41.43305],[-110.10835,41.43315],[-110.10394,41.43467],[-110.10306,41.43496],[-110.10166,41.43545],[-110.10032,41.43596],[-110.09909,41.43645],[-110.09793,41.43697],[-110.09689,41.43745],[-110.0955,41.43815],[-110.08747,41.44267],[-110.08503,41.44404],[-110.07445,41.45],[-110.0639,41.45592],[-110.05481,41.46106],[-110.05447,41.46125],[-110.04866,41.46449],[-110.04674,41.46558],[-110.04364,41.46734],[-110.04193,41.46836],[-110.04002,41.46966],[-110.03892,41.47047],[-110.03756,41.47158],[-110.03695,41.4721],[-110.03364,41.47518],[-110.03056,41.47804],[-110.02584,41.48247],[-110.02478,41.48345],[-110.02464,41.48359],[-110.02017,41.48776],[-110.01914,41.48869],[-110.0184,41.4893],[-110.01786,41.48975],[-110.01581,41.49142],[-110.01295,41.49377],[-110.01201,41.49455],[-110.00942,41.49666],[-110.00859,41.49726],[-110.00774,41.49785],[-110.0067,41.49854],[-110.00577,41.49912],[-110.00507,41.49954],[-110.00427,41.49998],[-110.0033,41.5005],[-110.00021,41.50202],[-109.99043,41.50691],[-109.98841,41.50791],[-109.98577,41.50922],[-109.98545,41.50937],[-109.98058,41.51179],[-109.97831,41.51293],[-109.95755,41.52327],[-109.95203,41.52598],[-109.94187,41.53104],[-109.93622,41.53383],[-109.92172,41.54102],[-109.92036,41.54167],[-109.91908,41.54222],[-109.91797,41.54263],[-109.91716,41.5429],[-109.91628,41.54316],[-109.91546,41.54337],[-109.91463,41.54356],[-109.91365,41.54375],[-109.91232,41.54396],[-109.91138,41.54408],[-109.91058,41.54416],[-109.90968,41.54423],[-109.90877,41.54425],[-109.90793,41.54427],[-109.90696,41.54426],[-109.90583,41.5442],[-109.9047,41.5441],[-109.9037,41.54399],[-109.90293,41.54387],[-109.90192,41.5437],[-109.90074,41.54347],[-109.89908,41.54316],[-109.89599,41.54255],[-109.89363,41.54213],[-109.89217,41.54191],[-109.89113,41.54178],[-109.89009,41.54166],[-109.88882,41.54155],[-109.88728,41.54145],[-109.88563,41.54139],[-109.88417,41.54138],[-109.88226,41.54143],[-109.87572,41.54162],[-109.87032,41.54176],[-109.86725,41.54185],[-109.8652,41.54191],[-109.85764,41.54213],[-109.85714,41.54214],[-109.84924,41.54235],[-109.84711,41.54242],[-109.83625,41.54273],[-109.83511,41.54274],[-109.83353,41.54275],[-109.8291,41.54273],[-109.82135,41.54271],[-109.82052,41.5427],[-109.81432,41.54268],[-109.80592,41.54266],[-109.79988,41.54264],[-109.79353,41.54262],[-109.79314,41.54262],[-109.78602,41.54261],[-109.75992,41.54251],[-109.75063,41.54248],[-109.71295,41.54233],[-109.69623,41.54226],[-109.69585,41.54226],[-109.69409,41.54226],[-109.6929,41.54226],[-109.68274,41.54222],[-109.67909,41.5422],[-109.6769,41.54223],[-109.67551,41.54228],[-109.67451,41.54233],[-109.65391,41.54336],[-109.65349,41.54338],[-109.61609,41.54528],[-109.61468,41.54536],[-109.61331,41.54548],[-109.61254,41.54559],[-109.61152,41.54575],[-109.6105,41.54597],[-109.60945,41.54622],[-109.60778,41.54675],[-109.60704,41.54701],[-109.60634,41.5473],[-109.60554,41.54764],[-109.60475,41.54802],[-109.60382,41.54851],[-109.6029,41.54902],[-109.60198,41.54959],[-109.60122,41.55002],[-109.5981,41.55177],[-109.59742,41.55216],[-109.59429,41.5539],[-109.59323,41.55441],[-109.59208,41.55488],[-109.59122,41.55518],[-109.59052,41.55541],[-109.58961,41.55567],[-109.5887,41.55589],[-109.58765,41.5561],[-109.58657,41.55629],[-109.58439,41.5566],[-109.58183,41.55697],[-109.57663,41.55774],[-109.57183,41.55847],[-109.57096,41.55864],[-109.56995,41.55887],[-109.56899,41.55914],[-109.56794,41.55947],[-109.56415,41.56089],[-109.56138,41.56201],[-109.55928,41.56283],[-109.55774,41.56341],[-109.55629,41.56382],[-109.55529,41.56402],[-109.55444,41.56417],[-109.55346,41.5643],[-109.55262,41.56437],[-109.5518,41.5644],[-109.55099,41.56438],[-109.54949,41.56429],[-109.54855,41.56418],[-109.54774,41.56404],[-109.54683,41.56385],[-109.54592,41.56361],[-109.54495,41.56328],[-109.54189,41.5621],[-109.54158,41.56199],[-109.54048,41.56164],[-109.53936,41.56133],[-109.53842,41.56111],[-109.53744,41.56091],[-109.53618,41.56072],[-109.52956,41.55993],[-109.52828,41.55978],[-109.52691,41.55963],[-109.52626,41.55952],[-109.52555,41.55937],[-109.52486,41.55922],[-109.52416,41.55904],[-109.52346,41.5588],[-109.52279,41.55856],[-109.52209,41.55826],[-109.51845,41.55661],[-109.51773,41.5563],[-109.51698,41.55603],[-109.51642,41.55584],[-109.51585,41.55568],[-109.51514,41.55551],[-109.51461,41.55539],[-109.51348,41.55519],[-109.50967,41.55484],[-109.50935,41.55481],[-109.50585,41.55446],[-109.49976,41.55387],[-109.49888,41.55376],[-109.49772,41.55355],[-109.4966,41.55329],[-109.49554,41.55302],[-109.49452,41.55271],[-109.4933,41.55226],[-109.49217,41.55176],[-109.4911,41.55125],[-109.49046,41.5509],[-109.48952,41.55032],[-109.48745,41.54905],[-109.48525,41.54773],[-109.48318,41.54643],[-109.48246,41.546],[-109.48177,41.54551],[-109.48147,41.54524],[-109.48119,41.54495],[-109.4809,41.5446],[-109.48041,41.54387],[-109.47943,41.5422],[-109.47909,41.5417],[-109.47865,41.54117],[-109.47824,41.54077],[-109.47788,41.54048],[-109.47732,41.54011],[-109.4765,41.53972],[-109.47489,41.53906],[-109.47471,41.53896],[-109.47441,41.53884],[-109.47319,41.53834],[-109.47121,41.5375],[-109.46973,41.53673],[-109.46906,41.53638],[-109.4686,41.53609],[-109.46801,41.53573],[-109.46463,41.53374],[-109.46179,41.53245],[-109.4594,41.53134],[-109.45912,41.53119],[-109.45834,41.5308],[-109.45735,41.53022],[-109.45218,41.52685],[-109.44992,41.52538],[-109.44953,41.52515],[-109.44924,41.52497],[-109.44888,41.52477],[-109.44845,41.52457],[-109.44799,41.52436],[-109.44733,41.52411],[-109.44688,41.52398],[-109.4461,41.52379],[-109.44542,41.52363],[-109.44501,41.52357],[-109.44447,41.5235],[-109.44397,41.52346],[-109.44356,41.52344],[-109.44298,41.52342],[-109.44218,41.52344],[-109.44119,41.52351],[-109.4401,41.5237],[-109.43922,41.52392],[-109.43837,41.5242],[-109.43705,41.52471],[-109.43356,41.52616],[-109.4327,41.52649],[-109.43206,41.52672],[-109.43125,41.52697],[-109.43063,41.52714],[-109.42992,41.52733],[-109.42928,41.52748],[-109.42866,41.52758],[-109.42771,41.52772],[-109.427,41.5278],[-109.42609,41.52784],[-109.42531,41.52786],[-109.42439,41.52786],[-109.42338,41.52781],[-109.42189,41.52766],[-109.41402,41.52677],[-109.41271,41.52671],[-109.41145,41.5267],[-109.41019,41.52673],[-109.40921,41.52679],[-109.4082,41.52688],[-109.39975,41.52816],[-109.39879,41.52836],[-109.39791,41.52858],[-109.39677,41.52893],[-109.39564,41.52939],[-109.39487,41.52976],[-109.39155,41.5316],[-109.39056,41.53206],[-109.38996,41.53227],[-109.38924,41.5325],[-109.38839,41.53269],[-109.38749,41.53284],[-109.38661,41.53293],[-109.38586,41.53295],[-109.38521,41.53294],[-109.38425,41.53289],[-109.3822,41.53264],[-109.38004,41.53233],[-109.37909,41.5322],[-109.37779,41.53208],[-109.37656,41.53207],[-109.37558,41.53213],[-109.37482,41.53224],[-109.37406,41.53237],[-109.37324,41.53258],[-109.37246,41.53284],[-109.36704,41.53499],[-109.34604,41.54337],[-109.34578,41.54348],[-109.34281,41.54462],[-109.34118,41.54517],[-109.33747,41.54631],[-109.33299,41.54774],[-109.3317,41.54816],[-109.33043,41.5486],[-109.32891,41.54921],[-109.32739,41.54988],[-109.32064,41.55285],[-109.31646,41.55467],[-109.31334,41.55603],[-109.31084,41.55711],[-109.30837,41.55819],[-109.30582,41.55932],[-109.30338,41.56039],[-109.29049,41.566],[-109.28864,41.5668],[-109.28737,41.56726],[-109.27722,41.5711],[-109.26976,41.57385],[-109.26365,41.57611],[-109.26032,41.57737],[-109.25922,41.57777],[-109.25733,41.57857],[-109.25632,41.57913],[-109.25565,41.57953],[-109.25459,41.5802],[-109.25291,41.58149],[-109.25243,41.58194],[-109.25142,41.58303],[-109.25035,41.58439],[-109.24499,41.59266],[-109.24378,41.59433],[-109.24333,41.5948],[-109.24218,41.5957],[-109.24145,41.59644],[-109.24107,41.59705],[-109.24051,41.59787],[-109.24026,41.59851],[-109.23986,41.6003],[-109.23911,41.60176],[-109.23857,41.60257],[-109.23815,41.60319],[-109.23771,41.60372],[-109.23712,41.60426],[-109.23645,41.60475],[-109.23588,41.60508],[-109.23523,41.6054],[-109.23356,41.60604],[-109.23263,41.6064],[-109.23147,41.60686],[-109.2298,41.60749],[-109.22911,41.60777],[-109.22879,41.60789],[-109.22704,41.60856],[-109.22595,41.60897],[-109.22521,41.60926],[-109.22454,41.60952],[-109.22383,41.60972],[-109.22366,41.60977],[-109.22272,41.60996],[-109.22188,41.61009],[-109.22101,41.61017],[-109.21988,41.6102],[-109.21886,41.61015],[-109.21804,41.61007],[-109.21709,41.6099],[-109.21623,41.60969],[-109.21548,41.60946],[-109.21474,41.60919],[-109.21399,41.60889],[-109.21139,41.60751],[-109.21114,41.60738],[-109.20577,41.60456],[-109.20485,41.60405],[-109.20382,41.60335],[-109.20335,41.60295],[-109.20269,41.60234],[-109.20215,41.60169],[-109.20178,41.60117],[-109.20146,41.60059],[-109.2011,41.59991],[-109.20072,41.59899],[-109.20058,41.59865],[-109.20004,41.59746],[-109.19966,41.59679],[-109.19931,41.59626],[-109.19884,41.59568],[-109.19835,41.59514],[-109.19762,41.5945],[-109.19711,41.59411],[-109.19628,41.59358],[-109.19549,41.59315],[-109.19468,41.5928],[-109.19386,41.59249],[-109.19287,41.59221],[-109.1915,41.59193],[-109.19086,41.59182],[-109.19008,41.59177],[-109.18929,41.59175],[-109.18821,41.59177],[-109.18721,41.59187],[-109.18668,41.59193],[-109.18589,41.59209],[-109.18507,41.59231],[-109.18425,41.59257],[-109.1836,41.59284],[-109.1784,41.59511],[-109.17777,41.59533],[-109.17711,41.59551],[-109.17615,41.5957],[-109.1754,41.5958],[-109.17466,41.59587],[-109.1737,41.59589],[-109.16347,41.59618],[-109.16249,41.59627],[-109.16171,41.59637],[-109.16092,41.59653],[-109.15979,41.59679],[-109.15869,41.59712],[-109.15756,41.59756],[-109.15663,41.598],[-109.15576,41.59848],[-109.15505,41.59896],[-109.15432,41.59949],[-109.15358,41.60013],[-109.1527,41.60088],[-109.15012,41.60313],[-109.1491,41.60388],[-109.14801,41.60461],[-109.14704,41.60518],[-109.14595,41.60572],[-109.14478,41.60625],[-109.14405,41.60654],[-109.14241,41.60714],[-109.13354,41.61047],[-109.13172,41.61115],[-109.12749,41.61273],[-109.1271,41.61286],[-109.12107,41.61512],[-109.11014,41.61921],[-109.10132,41.62251],[-109.0952,41.6248],[-109.08499,41.62859],[-109.08387,41.62894],[-109.08274,41.62925],[-109.08126,41.62956],[-109.07966,41.62982],[-109.07669,41.63032],[-109.05565,41.6338],[-109.05226,41.63436],[-109.0477,41.63513],[-109.04561,41.6355],[-109.0444,41.63578],[-109.04321,41.63611],[-109.04207,41.63649],[-109.0406,41.63708],[-109.00039,41.65424],[-108.99574,41.65621],[-108.99553,41.6563],[-108.97476,41.66515],[-108.97343,41.6657],[-108.97273,41.66598],[-108.97167,41.66633],[-108.97069,41.66662],[-108.96971,41.66685],[-108.96892,41.66703],[-108.96783,41.66721],[-108.96595,41.66748],[-108.9641,41.66774],[-108.95794,41.66855],[-108.95633,41.66876],[-108.9554,41.66887],[-108.95438,41.66897],[-108.95315,41.66905],[-108.95191,41.66911],[-108.95088,41.66913],[-108.94003,41.66925],[-108.93838,41.6693],[-108.93741,41.66938],[-108.93599,41.66954],[-108.93409,41.66981],[-108.93035,41.67079],[-108.92993,41.67094],[-108.92917,41.67122],[-108.92792,41.67171],[-108.92725,41.67201],[-108.9266,41.67232],[-108.92601,41.67263],[-108.92541,41.67296],[-108.92506,41.6732],[-108.9246,41.67353],[-108.92418,41.6739],[-108.92382,41.67427],[-108.92349,41.67468],[-108.92324,41.67502],[-108.923,41.67542],[-108.92282,41.67576],[-108.92264,41.6762],[-108.92226,41.67716],[-108.9219,41.67814],[-108.92121,41.68001],[-108.921,41.68046],[-108.92076,41.68093],[-108.92045,41.68149],[-108.92003,41.68213],[-108.9196,41.68268],[-108.91923,41.68314],[-108.91873,41.68367],[-108.91826,41.68413],[-108.91763,41.68467],[-108.91696,41.68521],[-108.91632,41.68565],[-108.91565,41.68606],[-108.91471,41.68658],[-108.9139,41.68696],[-108.91299,41.68735],[-108.90399,41.69084],[-108.90378,41.69092],[-108.90326,41.69109],[-108.90271,41.69126],[-108.9018,41.6915],[-108.9012,41.69163],[-108.9006,41.69174],[-108.89963,41.69189],[-108.89879,41.69198],[-108.8976,41.69204],[-108.89682,41.69205],[-108.89602,41.69203],[-108.89537,41.692],[-108.89463,41.69194],[-108.88574,41.69081],[-108.88462,41.69071],[-108.88406,41.6907],[-108.88344,41.69071],[-108.88287,41.69076],[-108.88218,41.69083],[-108.88123,41.69099],[-108.88035,41.69118],[-108.8723,41.69303],[-108.8711,41.69328],[-108.86994,41.69346],[-108.86913,41.69355],[-108.8683,41.6936],[-108.86725,41.69364],[-108.86646,41.69363],[-108.8659,41.69361],[-108.86534,41.69357],[-108.86466,41.69351],[-108.86388,41.69341],[-108.86315,41.69328],[-108.86224,41.69309],[-108.84322,41.68872],[-108.84299,41.68866],[-108.84209,41.68848],[-108.84119,41.68832],[-108.83999,41.68813],[-108.83875,41.688],[-108.83766,41.68796],[-108.83675,41.68793],[-108.83569,41.68795],[-108.83459,41.68799],[-108.8194,41.68859],[-108.81861,41.68858],[-108.81779,41.68852],[-108.81704,41.68842],[-108.81634,41.68826],[-108.8158,41.6881],[-108.81516,41.68788],[-108.81458,41.68764],[-108.81252,41.6867],[-108.80686,41.68406],[-108.80525,41.68335],[-108.80449,41.68308],[-108.80383,41.68286],[-108.80319,41.68267],[-108.80228,41.68244],[-108.8013,41.68225],[-108.78741,41.67937],[-108.7827,41.67839],[-108.78242,41.67833],[-108.77782,41.67738],[-108.77506,41.67682],[-108.7736,41.67657],[-108.77229,41.67638],[-108.77101,41.67623],[-108.76993,41.67611],[-108.76899,41.67604],[-108.76798,41.67598],[-108.75498,41.67503],[-108.74887,41.67457],[-108.7462,41.67439],[-108.74487,41.67426],[-108.74353,41.67407],[-108.74223,41.67383],[-108.74093,41.67351],[-108.73958,41.6731],[-108.73856,41.67273],[-108.73756,41.67232],[-108.73645,41.6718],[-108.73533,41.67117],[-108.73182,41.66888],[-108.72164,41.66219],[-108.71487,41.65771],[-108.71107,41.65518],[-108.7108,41.65501],[-108.70877,41.65383],[-108.70775,41.65325],[-108.70667,41.65269],[-108.70503,41.65193],[-108.70332,41.65121],[-108.70215,41.65075],[-108.7004,41.65015],[-108.69896,41.64969],[-108.69746,41.64926],[-108.6961,41.64892],[-108.69467,41.64861],[-108.69306,41.64829],[-108.69179,41.64808],[-108.69083,41.64794],[-108.68973,41.64782],[-108.68851,41.6477],[-108.68735,41.6476],[-108.68655,41.64755],[-108.68576,41.64753],[-108.6829,41.64744],[-108.67654,41.64728],[-108.67622,41.64727],[-108.6706,41.6471],[-108.66014,41.64681],[-108.65297,41.64665],[-108.65171,41.64665],[-108.6504,41.64669],[-108.64949,41.64673],[-108.64852,41.64679],[-108.64534,41.64708],[-108.64102,41.64749],[-108.63069,41.64843],[-108.6275,41.64871],[-108.62716,41.64874],[-108.62375,41.64906],[-108.62088,41.64934],[-108.61846,41.64954],[-108.61671,41.6496],[-108.61547,41.64962],[-108.61397,41.6496],[-108.61258,41.64954],[-108.61138,41.64945],[-108.61048,41.64938],[-108.60934,41.64926],[-108.60813,41.64909],[-108.5995,41.648],[-108.5878,41.64651],[-108.58003,41.64553],[-108.57861,41.64538],[-108.57665,41.64525],[-108.57629,41.64524],[-108.57244,41.64502],[-108.53494,41.64277],[-108.52638,41.64225],[-108.51724,41.64171],[-108.51692,41.64169],[-108.48666,41.63985],[-108.48633,41.63984],[-108.48454,41.63974],[-108.48337,41.63965],[-108.46982,41.63884],[-108.46273,41.6384],[-108.46254,41.63839],[-108.41468,41.6355],[-108.41053,41.63532],[-108.41017,41.6353],[-108.4085,41.63521],[-108.4061,41.6351],[-108.39952,41.63463],[-108.3969,41.63442],[-108.39088,41.63401],[-108.38216,41.63348],[-108.37882,41.63327],[-108.37848,41.63325],[-108.37534,41.63306],[-108.35716,41.63197],[-108.35572,41.63187],[-108.35417,41.63179],[-108.3501,41.63165],[-108.34922,41.63162],[-108.348,41.63158],[-108.34772,41.63156],[-108.3308,41.63099],[-108.31389,41.63039],[-108.30632,41.63013],[-108.29211,41.62963],[-108.29002,41.62957],[-108.28885,41.62958],[-108.2878,41.62964],[-108.28647,41.62979],[-108.28526,41.62997],[-108.26865,41.63255],[-108.26579,41.63301],[-108.26189,41.6336],[-108.2616,41.63364],[-108.25722,41.63432],[-108.2407,41.63686],[-108.23742,41.63736],[-108.23585,41.63757],[-108.23421,41.63773],[-108.22823,41.63833],[-108.22089,41.63907],[-108.20682,41.64048],[-108.18924,41.64227],[-108.18318,41.64289],[-108.18108,41.6431],[-108.15905,41.64531],[-108.15716,41.64554],[-108.15629,41.64567],[-108.15512,41.64586],[-108.154,41.64607],[-108.13426,41.65026],[-108.1284,41.65149],[-108.12804,41.65157],[-108.12387,41.65246],[-108.12112,41.65304],[-108.11745,41.65371],[-108.11575,41.65396],[-108.10638,41.65525],[-108.09948,41.65618],[-108.06833,41.66039],[-108.06078,41.66141],[-108.03874,41.66439],[-108.03767,41.66453],[-108.03193,41.6653],[-108.03138,41.66538],[-108.02567,41.66616],[-107.99972,41.66962],[-107.99941,41.66966],[-107.99119,41.67078],[-107.98961,41.67102],[-107.98853,41.67126],[-107.98727,41.67161],[-107.98636,41.67188],[-107.98061,41.67435],[-107.98031,41.67449],[-107.97523,41.67679],[-107.97278,41.67793],[-107.9725,41.67806],[-107.97013,41.67915],[-107.95913,41.68418],[-107.9517,41.68758],[-107.95049,41.68812],[-107.94969,41.68847],[-107.94868,41.68884],[-107.9476,41.68919],[-107.94475,41.69003],[-107.93447,41.6931],[-107.90947,41.70054],[-107.90277,41.70252],[-107.90158,41.70286],[-107.90031,41.70318],[-107.89905,41.70348],[-107.8974,41.70384],[-107.89623,41.70405],[-107.89461,41.70434],[-107.8931,41.70455],[-107.89207,41.70468],[-107.8904,41.70485],[-107.88875,41.705],[-107.88659,41.70511],[-107.87722,41.70542],[-107.87562,41.70547],[-107.86857,41.70569],[-107.86752,41.7057],[-107.86648,41.70568],[-107.86541,41.70564],[-107.86382,41.70552],[-107.86233,41.70535],[-107.86091,41.70513],[-107.84989,41.70314],[-107.84965,41.70309],[-107.84812,41.70283],[-107.847,41.70268],[-107.84589,41.70258],[-107.845,41.70253],[-107.84425,41.70252],[-107.84349,41.70252],[-107.8427,41.70254],[-107.84187,41.7026],[-107.84109,41.70267],[-107.84029,41.70275],[-107.83914,41.70293],[-107.8382,41.70312],[-107.83545,41.70374],[-107.83245,41.70443],[-107.82976,41.70504],[-107.82654,41.70578],[-107.80846,41.70991],[-107.79184,41.71371],[-107.7872,41.71477],[-107.78456,41.71538],[-107.78291,41.71576],[-107.78256,41.71584],[-107.77827,41.71681],[-107.76044,41.72087],[-107.75057,41.72313],[-107.73383,41.72694],[-107.72864,41.72811],[-107.72823,41.72819],[-107.72271,41.72949],[-107.71268,41.73177],[-107.70339,41.73388],[-107.69582,41.7356],[-107.68577,41.73788],[-107.67989,41.73922],[-107.67561,41.74019],[-107.67384,41.74059],[-107.67253,41.74083],[-107.67105,41.74108],[-107.6699,41.74124],[-107.66886,41.74137],[-107.66741,41.74151],[-107.66619,41.7416],[-107.64219,41.7433],[-107.63067,41.74412],[-107.61856,41.74497],[-107.61818,41.745],[-107.58464,41.74736],[-107.58294,41.74753],[-107.58083,41.74778],[-107.57874,41.74807],[-107.57711,41.74835],[-107.57546,41.74865],[-107.57362,41.74904],[-107.5666,41.75059],[-107.56426,41.7511],[-107.55931,41.75219],[-107.55893,41.75227],[-107.55452,41.75325],[-107.52583,41.75954],[-107.52553,41.75961],[-107.51546,41.76182],[-107.50535,41.76402],[-107.49137,41.76716],[-107.46955,41.77205],[-107.46636,41.77276],[-107.46604,41.77283],[-107.46192,41.77376],[-107.45489,41.77533],[-107.43584,41.7796],[-107.41754,41.78369],[-107.41359,41.78455],[-107.41308,41.78463],[-107.4127,41.7847],[-107.4105,41.78505],[-107.41017,41.7851],[-107.40907,41.78526],[-107.40804,41.78539],[-107.40416,41.78582],[-107.38866,41.78754],[-107.38716,41.78767],[-107.38608,41.78772],[-107.385,41.78776],[-107.3838,41.78779],[-107.38257,41.78778],[-107.38138,41.78774],[-107.38017,41.78768],[-107.37917,41.78761],[-107.37834,41.78754],[-107.37741,41.78745],[-107.37561,41.78722],[-107.37489,41.78711],[-107.37359,41.78689],[-107.37218,41.78662],[-107.37182,41.78654],[-107.37038,41.7862],[-107.36896,41.78584],[-107.36383,41.78438],[-107.34035,41.77771],[-107.33887,41.77732],[-107.33737,41.77697],[-107.33607,41.77671],[-107.33472,41.77647],[-107.3333,41.77625],[-107.33218,41.77609],[-107.33069,41.77594],[-107.32945,41.77584],[-107.32848,41.77576],[-107.32722,41.7757],[-107.32691,41.7757],[-107.3255,41.77567],[-107.32408,41.77568],[-107.32309,41.77571],[-107.32207,41.77576],[-107.32027,41.77587],[-107.31826,41.77603],[-107.31123,41.77656],[-107.3109,41.77659],[-107.30405,41.77712],[-107.30153,41.77731],[-107.29049,41.77815],[-107.28839,41.77832],[-107.28572,41.77853],[-107.28421,41.77866],[-107.28265,41.77886],[-107.28218,41.77893],[-107.27535,41.78026],[-107.27521,41.78029],[-107.2669,41.78179],[-107.26547,41.78204],[-107.26469,41.78213],[-107.26405,41.78217],[-107.2634,41.78219],[-107.26283,41.78218],[-107.26219,41.78215],[-107.26158,41.7821],[-107.26096,41.78202],[-107.25972,41.78179],[-107.25914,41.78164],[-107.25848,41.78143],[-107.25718,41.78096],[-107.2565,41.78071],[-107.25307,41.7795],[-107.25215,41.77922],[-107.25123,41.77898],[-107.25076,41.77885],[-107.24992,41.77866],[-107.24908,41.77851],[-107.24856,41.77842],[-107.2478,41.77834],[-107.24722,41.77827],[-107.24667,41.77823],[-107.24598,41.77821],[-107.23354,41.7778],[-107.23171,41.77774],[-107.22998,41.7777],[-107.22938,41.7777],[-107.22877,41.77771],[-107.22818,41.77774],[-107.2276,41.77778],[-107.22685,41.77785],[-107.22608,41.77794],[-107.22542,41.77804],[-107.22463,41.77818],[-107.22346,41.77841],[-107.22263,41.77862],[-107.22174,41.77887],[-107.22096,41.77912],[-107.2202,41.77939],[-107.21929,41.77975],[-107.2185,41.78011],[-107.21712,41.7808],[-107.20669,41.7861],[-107.20648,41.78621],[-107.20443,41.78725],[-107.20374,41.78761],[-107.20235,41.78829],[-107.2019,41.78851],[-107.20142,41.78872],[-107.20068,41.78893],[-107.20007,41.78909],[-107.19945,41.78921],[-107.19906,41.78926],[-107.19856,41.78933],[-107.19801,41.78934],[-107.19736,41.78933],[-107.19664,41.78927],[-107.19559,41.78913],[-107.18884,41.7877],[-107.17677,41.78514],[-107.17439,41.78472],[-107.17228,41.78444],[-107.17027,41.78424],[-107.15361,41.78303],[-107.14365,41.78232],[-107.1365,41.78177],[-107.13193,41.78145],[-107.13087,41.78136],[-107.12985,41.78125],[-107.1289,41.78106],[-107.12806,41.78082],[-107.12742,41.78057],[-107.12715,41.78047],[-107.12653,41.78014],[-107.12582,41.77972],[-107.12512,41.77922],[-107.12454,41.77882],[-107.12312,41.77786],[-107.12196,41.77707],[-107.1198,41.77557],[-107.11915,41.77515],[-107.11846,41.77478],[-107.11785,41.77449],[-107.11708,41.77422],[-107.11621,41.77397],[-107.1155,41.77384],[-107.11482,41.77376],[-107.11415,41.7737],[-107.11336,41.77368],[-107.10503,41.77361],[-107.1039,41.77358],[-107.10289,41.77353],[-107.10113,41.77342],[-107.09853,41.77315],[-107.08962,41.77174],[-107.08875,41.77165],[-107.08772,41.77159],[-107.0867,41.77158],[-107.08523,41.77168],[-107.0839,41.77188],[-107.07905,41.7729],[-107.07815,41.77306],[-107.07723,41.77318],[-107.07638,41.77326],[-107.07544,41.77332],[-107.0743,41.77335],[-107.07326,41.7733],[-107.07196,41.77323],[-107.07068,41.77308],[-107.06953,41.7729],[-107.06396,41.77195],[-107.01763,41.76389],[-106.96684,41.75504],[-106.96169,41.75415],[-106.96132,41.75408],[-106.95881,41.7536],[-106.9571,41.75319],[-106.95613,41.75292],[-106.9493,41.75112],[-106.94824,41.75083],[-106.94331,41.74952],[-106.94301,41.74944],[-106.93233,41.74659],[-106.92984,41.74595],[-106.92793,41.7455],[-106.92659,41.74523],[-106.92522,41.745],[-106.92391,41.74481],[-106.92258,41.74464],[-106.92084,41.74449],[-106.91918,41.74438],[-106.87599,41.74281],[-106.84958,41.74185],[-106.84811,41.7418],[-106.84339,41.74162],[-106.84298,41.74161],[-106.83803,41.74144],[-106.83052,41.74117],[-106.82992,41.74115],[-106.82601,41.74099],[-106.8243,41.74101],[-106.82117,41.74111],[-106.80656,41.74164],[-106.80557,41.74167],[-106.77952,41.74261],[-106.77413,41.7428],[-106.77363,41.74281],[-106.77132,41.74289],[-106.77059,41.74287],[-106.76976,41.74281],[-106.76899,41.74272],[-106.76798,41.74253],[-106.76739,41.74239],[-106.76596,41.74197],[-106.7474,41.73669],[-106.74509,41.73609],[-106.74318,41.73575],[-106.70354,41.73055],[-106.70262,41.73046],[-106.70174,41.73041],[-106.70062,41.73038],[-106.69972,41.73037],[-106.6982,41.7304],[-106.68267,41.73077],[-106.66534,41.73119],[-106.66506,41.7312],[-106.65782,41.73137],[-106.65654,41.73144],[-106.65553,41.73152],[-106.65489,41.7316],[-106.65382,41.73177],[-106.65286,41.73195],[-106.65164,41.73224],[-106.62734,41.73862],[-106.62709,41.73869],[-106.62609,41.7389],[-106.62513,41.73906],[-106.6241,41.73922],[-106.62309,41.73933],[-106.62237,41.73937],[-106.62165,41.73941],[-106.6209,41.73942],[-106.61978,41.73941],[-106.61877,41.73935],[-106.61761,41.73924],[-106.61657,41.7391],[-106.61571,41.73896],[-106.61489,41.73879],[-106.6076,41.73714],[-106.60584,41.73675],[-106.60484,41.73653],[-106.60384,41.73636],[-106.60254,41.73619],[-106.60148,41.7361],[-106.60039,41.73604],[-106.59936,41.73602],[-106.59833,41.73605],[-106.59694,41.73615],[-106.59555,41.73632],[-106.59403,41.73656],[-106.56946,41.74074],[-106.56726,41.74112],[-106.56642,41.74133],[-106.54154,41.7475],[-106.53903,41.74809],[-106.53799,41.74828],[-106.53673,41.74845],[-106.5303,41.74941],[-106.52848,41.74975],[-106.52763,41.74994],[-106.52662,41.75023],[-106.52566,41.75054],[-106.52447,41.75099],[-106.52331,41.7515],[-106.51987,41.75314],[-106.51917,41.75342],[-106.51833,41.75369],[-106.5177,41.75384],[-106.51707,41.75394],[-106.5164,41.75402],[-106.51579,41.75406],[-106.5151,41.7541],[-106.51419,41.75399],[-106.51365,41.75389],[-106.51311,41.75379],[-106.5123,41.75356],[-106.5115,41.75328],[-106.51058,41.75283],[-106.50794,41.75145],[-106.50773,41.75134],[-106.50141,41.74795],[-106.49852,41.74636],[-106.4977,41.74582],[-106.49693,41.74523],[-106.49605,41.74448],[-106.49534,41.74375],[-106.4948,41.74311],[-106.49434,41.74248],[-106.49399,41.74194],[-106.49317,41.74048],[-106.49248,41.73927],[-106.49206,41.73868],[-106.4916,41.73809],[-106.49119,41.7376],[-106.4907,41.7371],[-106.49026,41.73667],[-106.48983,41.7363],[-106.4889,41.73557],[-106.48826,41.73514],[-106.48757,41.73469],[-106.48694,41.73435],[-106.48612,41.73395],[-106.48525,41.73357],[-106.48188,41.73226],[-106.47155,41.72841],[-106.46604,41.72627],[-106.46076,41.72428],[-106.45357,41.72155],[-106.45188,41.72087],[-106.44857,41.71945],[-106.44624,41.71835],[-106.44377,41.71708],[-106.44191,41.71608],[-106.44008,41.71501],[-106.43621,41.71262],[-106.43108,41.70912],[-106.43029,41.70862],[-106.42945,41.70816],[-106.42821,41.70757],[-106.42695,41.70707],[-106.42547,41.70663],[-106.42449,41.70638],[-106.42352,41.70619],[-106.42256,41.70604],[-106.42172,41.70594],[-106.42071,41.70588],[-106.4091,41.70543],[-106.40801,41.70535],[-106.40717,41.70525],[-106.40611,41.70507],[-106.40536,41.70492],[-106.40428,41.70463],[-106.40316,41.70427],[-106.4025,41.70403],[-106.39295,41.7006],[-106.39232,41.70035],[-106.39146,41.69996],[-106.39076,41.6996],[-106.38986,41.69911],[-106.38903,41.69858],[-106.38823,41.69801],[-106.38718,41.69714],[-106.38645,41.69641],[-106.38581,41.69565],[-106.38536,41.69496],[-106.38436,41.69324],[-106.38406,41.6927],[-106.38316,41.69119],[-106.38164,41.6885],[-106.38059,41.68687],[-106.37865,41.68403],[-106.37696,41.68175],[-106.37644,41.68092],[-106.37609,41.68029],[-106.3757,41.67955],[-106.37532,41.6786],[-106.37451,41.67563],[-106.37437,41.67505],[-106.37419,41.67448],[-106.37386,41.67362],[-106.37346,41.67286],[-106.37309,41.67226],[-106.37241,41.67127],[-106.37161,41.67031],[-106.37084,41.66959],[-106.37019,41.66902],[-106.36948,41.66849],[-106.36867,41.66792],[-106.36805,41.66756],[-106.36729,41.66715],[-106.36679,41.66692],[-106.35849,41.66291],[-106.34496,41.65637],[-106.34458,41.65619],[-106.34055,41.65424],[-106.32287,41.64571],[-106.32135,41.64499],[-106.32029,41.64453],[-106.31916,41.64415],[-106.31829,41.64388],[-106.31767,41.64371],[-106.31709,41.64358],[-106.31583,41.64332],[-106.31407,41.64302],[-106.30523,41.64152],[-106.29578,41.63988],[-106.29501,41.63971],[-106.29428,41.63951],[-106.29314,41.63913],[-106.29252,41.6389],[-106.29195,41.63865],[-106.29132,41.63836],[-106.29072,41.63805],[-106.29009,41.63769],[-106.28936,41.63723],[-106.2845,41.63412],[-106.28403,41.63383],[-106.27918,41.63071],[-106.27867,41.63041],[-106.27758,41.62982],[-106.27645,41.62929],[-106.27517,41.62876],[-106.27434,41.62847],[-106.27349,41.6282],[-106.27244,41.62791],[-106.27137,41.62767],[-106.25975,41.62542],[-106.25185,41.62388],[-106.24803,41.62312],[-106.24677,41.62283],[-106.24585,41.62255],[-106.2446,41.62214],[-106.24333,41.62162],[-106.24235,41.62115],[-106.24135,41.62059],[-106.23981,41.61961],[-106.23906,41.61899],[-106.23827,41.61831],[-106.23767,41.61773],[-106.23712,41.61713],[-106.23232,41.61121],[-106.23207,41.6109],[-106.2293,41.60755],[-106.22482,41.60208],[-106.22422,41.60132],[-106.22357,41.60062],[-106.2229,41.60005],[-106.22224,41.59963],[-106.22144,41.59912],[-106.22068,41.59878],[-106.22012,41.59853],[-106.21953,41.59832],[-106.21869,41.59807],[-106.21796,41.59791],[-106.21705,41.59776],[-106.21606,41.59766],[-106.21515,41.59763],[-106.21012,41.59765],[-106.20945,41.59765],[-106.20932,41.59764],[-106.20292,41.59764],[-106.20199,41.59761],[-106.20114,41.59748],[-106.2003,41.59734],[-106.19942,41.5971],[-106.19839,41.59675],[-106.19786,41.59652],[-106.19712,41.59619],[-106.19668,41.59597],[-106.19269,41.59417],[-106.18646,41.5912],[-106.18604,41.59102],[-106.18425,41.5902],[-106.18184,41.589],[-106.17666,41.58604],[-106.15618,41.57411],[-106.15592,41.57396],[-106.14559,41.56795],[-106.14462,41.56741],[-106.14359,41.56689],[-106.14247,41.56639],[-106.14152,41.56604],[-106.14061,41.56572],[-106.13999,41.56553],[-106.13936,41.56536],[-106.13837,41.56512],[-106.13721,41.5649],[-106.13599,41.5647],[-106.13469,41.56452],[-106.1149,41.56181],[-106.11357,41.56158],[-106.11283,41.56145],[-106.11207,41.56127],[-106.11092,41.56094],[-106.10984,41.56059],[-106.10886,41.56022],[-106.10791,41.55983],[-106.1076,41.55969],[-106.10659,41.55918],[-106.09763,41.55436],[-106.09536,41.55313],[-106.0942,41.5525],[-106.09352,41.55208],[-106.09306,41.55175],[-106.09229,41.5512],[-106.09158,41.55065],[-106.09067,41.54986],[-106.08689,41.54616],[-106.08524,41.54456],[-106.08356,41.54295],[-106.08324,41.54264],[-106.07995,41.53936],[-106.07682,41.53624],[-106.07253,41.5319],[-106.07168,41.53103],[-106.07037,41.52966],[-106.06952,41.52881],[-106.06889,41.52828],[-106.06806,41.52768],[-106.06716,41.52714],[-106.0664,41.52674],[-106.06547,41.5263],[-106.06443,41.52592],[-106.06241,41.52518],[-106.06136,41.52477],[-106.06071,41.52445],[-106.06015,41.52413],[-106.05964,41.52379],[-106.05918,41.52345],[-106.05875,41.52308],[-106.05822,41.52258],[-106.0578,41.5221],[-106.05739,41.52152],[-106.05699,41.52088],[-106.05669,41.52025],[-106.05646,41.51956],[-106.05625,41.51884],[-106.05494,41.51367],[-106.05485,41.51326],[-106.05334,41.50745],[-106.05312,41.50676],[-106.05275,41.50583],[-106.05212,41.50455],[-106.05111,41.50273],[-106.0498,41.50039],[-106.04929,41.49962],[-106.04889,41.49908],[-106.04848,41.49859],[-106.04768,41.49772],[-106.04708,41.49714],[-106.0464,41.49654],[-106.04573,41.49597],[-106.04506,41.49547],[-106.04433,41.49498],[-106.04343,41.49446],[-106.03903,41.49186],[-106.02557,41.48465],[-106.02513,41.48442],[-106.00576,41.47414],[-106.00419,41.4733],[-106.00402,41.47322],[-105.99097,41.46625],[-105.98499,41.46309],[-105.98391,41.46247],[-105.98314,41.46193],[-105.98205,41.46105],[-105.98157,41.46059],[-105.97899,41.45799],[-105.97352,41.45238],[-105.97332,41.45217],[-105.96827,41.44711],[-105.96781,41.4467],[-105.96732,41.4463],[-105.9666,41.44579],[-105.96593,41.44537],[-105.96532,41.44506],[-105.96469,41.44474],[-105.96392,41.44441],[-105.96309,41.44411],[-105.96206,41.44377],[-105.96104,41.44354],[-105.9547,41.44214],[-105.95279,41.44176],[-105.94994,41.44133],[-105.94403,41.44045],[-105.94355,41.44039],[-105.93698,41.43942],[-105.91794,41.4366],[-105.90947,41.43537],[-105.89518,41.43324],[-105.89418,41.43305],[-105.89338,41.43286],[-105.89261,41.43266],[-105.89181,41.43242],[-105.89103,41.43217],[-105.89018,41.43183],[-105.88728,41.43068],[-105.87356,41.42499],[-105.86052,41.41962],[-105.85397,41.41691],[-105.8487,41.41473],[-105.84281,41.4123],[-105.84042,41.41129],[-105.83962,41.41088],[-105.83886,41.41046],[-105.83802,41.40994],[-105.83716,41.40936],[-105.83655,41.40891],[-105.83599,41.40845],[-105.83545,41.40797],[-105.83486,41.40739],[-105.83452,41.40702],[-105.8341,41.40656],[-105.83232,41.40444],[-105.82953,41.40115],[-105.82786,41.39914],[-105.82454,41.39524],[-105.82414,41.39478],[-105.82357,41.39408],[-105.82121,41.39125],[-105.81679,41.38602],[-105.81574,41.38476],[-105.81525,41.3842],[-105.81484,41.38374],[-105.81422,41.3831],[-105.8137,41.38261],[-105.81314,41.38213],[-105.81255,41.38166],[-105.81169,41.38105],[-105.81108,41.38064],[-105.81046,41.38026],[-105.80957,41.37978],[-105.77874,41.36429],[-105.77768,41.36378],[-105.77683,41.36341],[-105.77601,41.36309],[-105.77526,41.36283],[-105.77447,41.36257],[-105.77359,41.36233],[-105.77255,41.36205],[-105.75234,41.35665],[-105.74823,41.35555],[-105.74648,41.35509],[-105.7454,41.35482],[-105.74437,41.35463],[-105.74247,41.35434],[-105.74191,41.35425],[-105.70742,41.34932],[-105.70588,41.34911],[-105.70534,41.34906],[-105.70474,41.34902],[-105.7041,41.34901],[-105.70353,41.34903],[-105.70296,41.34907],[-105.70249,41.34911],[-105.70204,41.34918],[-105.70132,41.3493],[-105.70073,41.34944],[-105.69864,41.34996],[-105.69788,41.35014],[-105.69714,41.35029],[-105.69643,41.35039],[-105.6957,41.35045],[-105.69473,41.35047],[-105.66701,41.35054],[-105.66127,41.35055],[-105.65246,41.35058],[-105.6453,41.35057],[-105.64446,41.35056],[-105.64373,41.35052],[-105.64299,41.35043],[-105.64237,41.35035],[-105.64171,41.35022],[-105.64108,41.35009],[-105.64048,41.34994],[-105.63984,41.34975],[-105.63908,41.34948],[-105.63814,41.3491],[-105.63713,41.34864],[-105.63407,41.34726],[-105.63367,41.34707],[-105.6218,41.34169],[-105.62072,41.34118],[-105.62015,41.34088],[-105.6196,41.34056],[-105.61908,41.34022],[-105.61863,41.33985],[-105.61819,41.33941],[-105.61786,41.33904],[-105.61749,41.33851],[-105.61726,41.33812],[-105.61709,41.33778],[-105.61693,41.33734],[-105.6168,41.33688],[-105.61672,41.33646],[-105.61666,41.33604],[-105.61658,41.33515],[-105.61637,41.33267],[-105.61627,41.33169],[-105.61601,41.32812],[-105.6156,41.32365],[-105.61549,41.32259],[-105.61533,41.32037],[-105.61511,41.31791],[-105.61507,41.31745],[-105.61471,41.31353],[-105.61452,41.31144],[-105.61437,41.30933],[-105.61432,41.30874],[-105.61424,41.30799],[-105.61408,41.30613],[-105.61404,41.30581],[-105.61395,41.30546],[-105.61387,41.30502],[-105.61379,41.30483],[-105.61352,41.30428],[-105.61327,41.3039],[-105.61291,41.30348],[-105.61255,41.3031],[-105.61211,41.30272],[-105.6116,41.30236],[-105.61106,41.30206],[-105.61052,41.30179],[-105.60993,41.30156],[-105.60867,41.30121],[-105.6079,41.30101],[-105.60121,41.29922],[-105.59874,41.29854],[-105.59731,41.29815],[-105.59719,41.29812],[-105.595,41.29753],[-105.59429,41.29734],[-105.58926,41.29598],[-105.58802,41.29565],[-105.58104,41.29378],[-105.57685,41.29266],[-105.57565,41.29238],[-105.57432,41.29211],[-105.57318,41.29189],[-105.57175,41.29167],[-105.57007,41.29145],[-105.56848,41.29129],[-105.56729,41.2912],[-105.56658,41.29116],[-105.56567,41.29113],[-105.56467,41.29111],[-105.55668,41.29109],[-105.5458,41.29108],[-105.5379,41.29107],[-105.53054,41.29107],[-105.52984,41.29104],[-105.5293,41.291],[-105.52877,41.29094],[-105.52815,41.29079],[-105.52744,41.29057],[-105.52708,41.29044],[-105.52668,41.29025],[-105.52629,41.29004],[-105.52588,41.28979],[-105.52555,41.28955],[-105.52519,41.28926],[-105.52479,41.28891],[-105.52441,41.28849],[-105.52311,41.28713],[-105.52138,41.28531],[-105.51909,41.28289],[-105.51585,41.27948],[-105.5151,41.27869],[-105.51462,41.27822],[-105.51371,41.27741],[-105.51311,41.27694],[-105.51258,41.27655],[-105.51241,41.27643],[-105.51187,41.27606],[-105.51131,41.27572],[-105.51067,41.27534],[-105.51002,41.27499],[-105.50851,41.27425],[-105.50682,41.27347],[-105.50618,41.27318],[-105.50553,41.27291],[-105.50492,41.27271],[-105.50437,41.27255],[-105.50376,41.27239],[-105.50313,41.27224],[-105.50227,41.27209],[-105.50143,41.27198],[-105.50055,41.27189],[-105.49969,41.27187],[-105.49686,41.27178],[-105.49196,41.27162],[-105.49132,41.27163],[-105.49065,41.27166],[-105.49005,41.2717],[-105.48664,41.27217],[-105.48607,41.27224],[-105.48548,41.27227],[-105.48493,41.27226],[-105.48436,41.27222],[-105.48376,41.27212],[-105.4833,41.272],[-105.4828,41.27185],[-105.48233,41.27167],[-105.4819,41.27146],[-105.48125,41.27103],[-105.48071,41.27062],[-105.4771,41.26754],[-105.47648,41.26703],[-105.47605,41.26672],[-105.4757,41.26651],[-105.47533,41.26632],[-105.47478,41.26608],[-105.47438,41.26594],[-105.47394,41.26582],[-105.4735,41.26571],[-105.47299,41.26563],[-105.47235,41.26558],[-105.47,41.2655],[-105.46958,41.26547],[-105.46905,41.26543],[-105.4686,41.26535],[-105.46814,41.26525],[-105.46769,41.26513],[-105.46723,41.26497],[-105.4668,41.26478],[-105.46605,41.26439],[-105.46415,41.2632],[-105.46372,41.26296],[-105.46322,41.26272],[-105.4626,41.26249],[-105.46188,41.26226],[-105.46005,41.26178],[-105.45906,41.26145],[-105.45808,41.26107],[-105.4571,41.26059],[-105.45635,41.26017],[-105.44841,41.25525],[-105.44782,41.25483],[-105.44735,41.25445],[-105.44694,41.25405],[-105.4464,41.25348],[-105.4459,41.25284],[-105.44542,41.25209],[-105.44408,41.24995],[-105.44061,41.24441],[-105.43877,41.24137],[-105.43851,41.24088],[-105.43826,41.24036],[-105.43801,41.23974],[-105.43778,41.23907],[-105.43763,41.23852],[-105.43716,41.23593],[-105.4369,41.23476],[-105.43684,41.23416],[-105.43684,41.23358],[-105.43689,41.23316],[-105.437,41.23264],[-105.43716,41.23216],[-105.43737,41.23169],[-105.43761,41.23126],[-105.43849,41.22975],[-105.43872,41.22921],[-105.43888,41.22874],[-105.439,41.22824],[-105.43906,41.2277],[-105.43907,41.2272],[-105.43901,41.2266],[-105.4389,41.22611],[-105.43834,41.22378],[-105.43827,41.22325],[-105.43822,41.22268],[-105.43823,41.22223],[-105.43829,41.22178],[-105.4384,41.22118],[-105.43859,41.2206],[-105.43909,41.21907],[-105.44118,41.21289],[-105.4414,41.2122],[-105.44151,41.21159],[-105.44153,41.21119],[-105.44154,41.21081],[-105.44148,41.21029],[-105.4414,41.20989],[-105.4413,41.20952],[-105.44114,41.20912],[-105.44101,41.20878],[-105.44083,41.20846],[-105.44008,41.20726],[-105.43934,41.20608],[-105.43887,41.20545],[-105.43813,41.20461],[-105.4372,41.20362],[-105.43284,41.19893],[-105.42681,41.19245],[-105.42658,41.1922],[-105.42482,41.1903],[-105.42441,41.18974],[-105.42391,41.18901],[-105.42346,41.18824],[-105.42312,41.18748],[-105.42286,41.18683],[-105.42271,41.18631],[-105.42199,41.18308],[-105.42179,41.18231],[-105.42153,41.1816],[-105.42132,41.18106],[-105.42109,41.18054],[-105.42084,41.18003],[-105.42045,41.17931],[-105.42009,41.17878],[-105.41656,41.17389],[-105.41234,41.16802],[-105.41064,41.16567],[-105.40821,41.16243],[-105.40738,41.16147],[-105.40642,41.16046],[-105.40475,41.15886],[-105.40354,41.15778],[-105.40332,41.1576],[-105.40216,41.15673],[-105.40079,41.15576],[-105.39963,41.15498],[-105.3993,41.15477],[-105.39815,41.15409],[-105.39717,41.15353],[-105.39542,41.15263],[-105.38902,41.14933],[-105.38688,41.14822],[-105.38562,41.14759],[-105.38465,41.14716],[-105.38396,41.1469],[-105.38352,41.14673],[-105.38303,41.14657],[-105.38229,41.14634],[-105.38158,41.14613],[-105.37554,41.14438],[-105.37085,41.14302],[-105.36344,41.14088],[-105.36115,41.14021],[-105.35958,41.13977],[-105.3583,41.13939],[-105.35716,41.13902],[-105.35641,41.13873],[-105.35575,41.13846],[-105.3549,41.13807],[-105.35402,41.13764],[-105.35331,41.13722],[-105.35263,41.13682],[-105.35113,41.13586],[-105.34956,41.13486],[-105.34469,41.13179],[-105.34053,41.12917],[-105.33948,41.12856],[-105.3384,41.12801],[-105.3375,41.12761],[-105.33658,41.12725],[-105.33557,41.1269],[-105.33454,41.12659],[-105.33326,41.12628],[-105.33194,41.12602],[-105.33062,41.12584],[-105.32896,41.1257],[-105.3132,41.12541],[-105.31,41.12533],[-105.30876,41.12526],[-105.30793,41.1252],[-105.30612,41.12498],[-105.30538,41.12489],[-105.30489,41.12482],[-105.30173,41.12443],[-105.299,41.12408],[-105.2969,41.12379],[-105.29603,41.12363],[-105.29522,41.12347],[-105.29462,41.12334],[-105.29404,41.1232],[-105.29304,41.12294],[-105.2923,41.12272],[-105.29125,41.12237],[-105.29045,41.12208],[-105.2898,41.12182],[-105.28913,41.12155],[-105.28845,41.12124],[-105.2871,41.12059],[-105.28426,41.11913],[-105.27897,41.11641],[-105.27498,41.11441],[-105.27285,41.11334],[-105.27202,41.11299],[-105.27146,41.11276],[-105.27083,41.11255],[-105.2697,41.11219],[-105.26714,41.11145],[-105.26334,41.11033],[-105.25057,41.10661],[-105.24669,41.10564],[-105.24532,41.10536],[-105.2445,41.10522],[-105.24338,41.10505],[-105.24219,41.1049],[-105.24064,41.10477],[-105.2397,41.10472],[-105.23875,41.1047],[-105.23687,41.10469],[-105.23378,41.10467],[-105.23056,41.10467],[-105.23023,41.10467],[-105.22904,41.10466],[-105.22791,41.10462],[-105.22729,41.10458],[-105.22612,41.10447],[-105.2249,41.10429],[-105.22379,41.10408],[-105.22288,41.10387],[-105.22161,41.10351],[-105.22043,41.1031],[-105.21937,41.10268],[-105.21277,41.0997],[-105.21091,41.09885],[-105.20942,41.09813],[-105.20788,41.09734],[-105.20734,41.09706],[-105.2056,41.09627],[-105.20488,41.09601],[-105.20414,41.09577],[-105.20275,41.09544],[-105.20191,41.09529],[-105.20065,41.09515],[-105.19968,41.0951],[-105.19866,41.0951],[-105.1979,41.09514],[-105.19715,41.09519],[-105.19634,41.0953],[-105.19243,41.09585],[-105.19069,41.09602],[-105.18967,41.0961],[-105.18701,41.09623],[-105.18216,41.09642],[-105.17971,41.09654],[-105.17841,41.09662],[-105.1771,41.09671],[-105.17354,41.09699],[-105.17191,41.09715],[-105.17148,41.09718],[-105.16902,41.09739],[-105.16809,41.09746],[-105.16496,41.09773],[-105.16398,41.09783],[-105.16299,41.09798],[-105.16132,41.09825],[-105.15802,41.09893],[-105.15734,41.09908],[-105.15518,41.09948],[-105.15441,41.0996],[-105.15361,41.0997],[-105.15276,41.09977],[-105.15201,41.09982],[-105.15126,41.09984],[-105.15013,41.09983],[-105.14928,41.0998],[-105.14846,41.09973],[-105.14635,41.09951],[-105.14266,41.09909],[-105.13898,41.09869],[-105.13558,41.09851],[-105.13219,41.09855],[-105.1255,41.0987],[-105.12403,41.09869],[-105.12257,41.09866],[-105.12086,41.09859],[-105.11972,41.09853],[-105.11889,41.09847],[-105.11755,41.09836],[-105.11617,41.09822],[-105.11582,41.09818],[-105.11456,41.09802],[-105.11189,41.09764],[-105.10941,41.09729],[-105.10825,41.09718],[-105.10709,41.09712],[-105.10626,41.09711],[-105.10511,41.09714],[-105.10423,41.0972],[-105.10335,41.0973],[-105.10129,41.09764],[-105.09923,41.09815],[-105.09835,41.09838],[-105.09663,41.09876],[-105.09589,41.0989],[-105.09513,41.09902],[-105.09444,41.0991],[-105.09378,41.09916],[-105.09028,41.09939],[-105.08725,41.09957],[-105.08361,41.0998],[-105.08251,41.09984],[-105.08155,41.09986],[-105.08048,41.09986],[-105.06736,41.09974],[-105.06642,41.09975],[-105.06558,41.0998],[-105.06464,41.09987],[-105.06368,41.09999],[-105.06184,41.10027],[-105.06144,41.10033],[-105.06016,41.10053],[-105.05804,41.10085],[-105.05663,41.10107],[-105.04918,41.10219],[-105.04466,41.10286],[-105.04363,41.10297],[-105.04261,41.10304],[-105.04104,41.1031],[-105.03525,41.1032],[-105.0343,41.10319],[-105.03338,41.10313],[-105.03242,41.10304],[-105.03145,41.1029],[-105.02121,41.10121],[-105.01999,41.10103],[-105.01886,41.10092],[-105.01785,41.10087],[-105.01655,41.10086],[-105.01525,41.10091],[-105.01432,41.10097],[-105.01339,41.10109],[-105.0126,41.10119],[-105.01182,41.10133],[-105.01092,41.10151],[-105.0101,41.10171],[-105.00928,41.10194],[-105.00479,41.10319],[-105.00069,41.10435],[-104.99396,41.10624],[-104.99286,41.10654],[-104.99153,41.10684],[-104.99046,41.10703],[-104.98933,41.10717],[-104.98798,41.10734],[-104.98606,41.10757],[-104.9834,41.1079],[-104.97894,41.10845],[-104.97628,41.10876],[-104.97409,41.10903],[-104.9722,41.10925],[-104.96974,41.10955],[-104.96849,41.10967],[-104.96724,41.10976],[-104.96304,41.11003],[-104.96162,41.11014],[-104.96037,41.11022],[-104.95959,41.11027],[-104.95907,41.11029],[-104.95659,41.11047],[-104.95629,41.11048],[-104.95442,41.11061],[-104.95251,41.11079],[-104.94815,41.11124],[-104.93998,41.1121],[-104.93559,41.11257],[-104.93338,41.11279],[-104.93291,41.11284],[-104.92904,41.11324],[-104.92546,41.11362],[-104.92295,41.11389],[-104.92157,41.11407],[-104.92015,41.11429],[-104.91317,41.11545],[-104.90914,41.1161],[-104.90721,41.11631],[-104.90531,41.11638],[-104.90317,41.11642],[-104.90069,41.11637],[-104.89741,41.1164],[-104.88677,41.1165],[-104.88616,41.1165],[-104.87498,41.11655],[-104.87111,41.11654],[-104.86808,41.11657],[-104.86715,41.11656],[-104.86621,41.11649],[-104.86482,41.11624],[-104.86345,41.11583],[-104.86191,41.11521],[-104.86087,41.11477],[-104.85965,41.11426],[-104.85833,41.11372],[-104.85732,41.11338],[-104.8562,41.11311],[-104.85541,41.11307],[-104.85464,41.11307],[-104.85387,41.11312],[-104.85301,41.11325],[-104.85139,41.11362],[-104.85032,41.11386],[-104.84714,41.11458],[-104.84563,41.11491],[-104.84493,41.11506],[-104.84388,41.11529],[-104.84347,41.11538],[-104.84161,41.11579],[-104.84063,41.11596],[-104.83964,41.11609],[-104.83878,41.11618],[-104.83784,41.11622],[-104.825,41.11624],[-104.82392,41.11626],[-104.82287,41.11633],[-104.82172,41.11645],[-104.81225,41.11782],[-104.8098,41.11819],[-104.80934,41.11825],[-104.80529,41.11883],[-104.80453,41.11895],[-104.80096,41.11948],[-104.80027,41.11955],[-104.79369,41.12054],[-104.79311,41.12063],[-104.78125,41.12236],[-104.77522,41.12324],[-104.77387,41.12343],[-104.7723,41.12364],[-104.77068,41.12379],[-104.77015,41.12382],[-104.76827,41.12395],[-104.75978,41.1241],[-104.75258,41.12423],[-104.74823,41.1243],[-104.74722,41.12432],[-104.74173,41.1244],[-104.74058,41.12442],[-104.73965,41.12445],[-104.73893,41.1245],[-104.7376,41.12458],[-104.73667,41.12467],[-104.73584,41.12476],[-104.7351,41.12485],[-104.73447,41.12493],[-104.73387,41.12502],[-104.73323,41.12512],[-104.73249,41.12524],[-104.73171,41.12539],[-104.73089,41.12556],[-104.73012,41.12572],[-104.72932,41.1259],[-104.72876,41.12605],[-104.72821,41.12619],[-104.72759,41.12636],[-104.72717,41.12649],[-104.72652,41.12668],[-104.72585,41.12688],[-104.72531,41.12706],[-104.72464,41.1273],[-104.72396,41.12753],[-104.72134,41.12845],[-104.71149,41.13194],[-104.71063,41.13226],[-104.70979,41.13256],[-104.70913,41.1328],[-104.7085,41.13304],[-104.7079,41.13328],[-104.70737,41.13351],[-104.7067,41.13382],[-104.70598,41.13417],[-104.70451,41.13492],[-104.70407,41.13513],[-104.69805,41.13825],[-104.69416,41.14026],[-104.69091,41.14193],[-104.68709,41.14389],[-104.68218,41.14642],[-104.67633,41.14944],[-104.6748,41.15022],[-104.67368,41.15079],[-104.67286,41.15119],[-104.67204,41.15157],[-104.67123,41.15193],[-104.67048,41.15226],[-104.66939,41.15272],[-104.66814,41.15321],[-104.66693,41.15368],[-104.66566,41.15412],[-104.66455,41.1545],[-104.66339,41.15486],[-104.66205,41.15527],[-104.66056,41.15568],[-104.65942,41.15598],[-104.65827,41.15625],[-104.65713,41.15652],[-104.65605,41.15675],[-104.65479,41.15698],[-104.65341,41.15723],[-104.65245,41.15739],[-104.65148,41.15754],[-104.65067,41.15765],[-104.64961,41.15778],[-104.64859,41.1579],[-104.64625,41.15812],[-104.6454,41.15818],[-104.6443,41.15825],[-104.64344,41.15829],[-104.64214,41.15833],[-104.6409,41.15836],[-104.6397,41.15835],[-104.62574,41.15826],[-104.61714,41.15818],[-104.58571,41.15807],[-104.56387,41.15801],[-104.56057,41.158],[-104.56021,41.158],[-104.52841,41.15801],[-104.52633,41.15799],[-104.52541,41.15797],[-104.52437,41.15795],[-104.52276,41.15792],[-104.5223,41.15791],[-104.51618,41.15779],[-104.51063,41.15768],[-104.50598,41.15758],[-104.48414,41.15713],[-104.46512,41.15674],[-104.4647,41.15673],[-104.44722,41.15635],[-104.44578,41.15632],[-104.4443,41.15632],[-104.44223,41.15637],[-104.43911,41.1565],[-104.42495,41.15717],[-104.41946,41.15742],[-104.41682,41.15751],[-104.41336,41.15751],[-104.40775,41.15749],[-104.40729,41.15749],[-104.37975,41.1574],[-104.3578,41.15733],[-104.35636,41.15733],[-104.34964,41.15735],[-104.3492,41.15735],[-104.34677,41.15737],[-104.34546,41.1574],[-104.34402,41.15748],[-104.34284,41.15757],[-104.34084,41.15779],[-104.33877,41.15806],[-104.33663,41.15834],[-104.33527,41.15849],[-104.33427,41.15856],[-104.33299,41.15864],[-104.33159,41.15871],[-104.2934,41.15864],[-104.27441,41.15862],[-104.26055,41.15862],[-104.254,41.1586],[-104.25359,41.15861],[-104.24808,41.1586],[-104.23535,41.15857],[-104.23353,41.15857],[-104.23218,41.15851],[-104.23116,41.15844],[-104.23024,41.15839],[-104.2294,41.15831],[-104.22805,41.15815],[-104.22681,41.15798],[-104.22409,41.1575],[-104.22287,41.15724],[-104.20258,41.15208],[-104.20096,41.15168],[-104.19874,41.15118],[-104.1968,41.15077],[-104.19547,41.15051],[-104.19262,41.14995],[-104.1889,41.14933],[-104.18672,41.14901],[-104.18412,41.14867],[-104.1819,41.1484],[-104.17847,41.14804],[-104.1756,41.14782],[-104.17314,41.14766],[-104.17063,41.14754],[-104.16833,41.14747],[-104.16612,41.1474],[-104.16408,41.14739],[-104.16202,41.1474],[-104.15901,41.14744],[-104.15868,41.14745],[-104.15654,41.14754],[-104.15456,41.14763],[-104.12328,41.14951],[-104.12188,41.14965],[-104.12103,41.14976],[-104.1202,41.14989],[-104.11912,41.1501],[-104.11755,41.15047],[-104.11624,41.15087],[-104.11485,41.1514],[-104.11398,41.15175],[-104.11313,41.15216],[-104.11214,41.15267],[-104.10971,41.15406],[-104.10443,41.1571],[-104.09557,41.16214],[-104.09277,41.16374],[-104.09156,41.16443],[-104.0908,41.16488],[-104.09009,41.16533],[-104.08912,41.16602],[-104.08826,41.16667],[-104.08751,41.16737],[-104.08728,41.1676],[-104.08703,41.16785],[-104.08659,41.16833],[-104.08272,41.17262],[-104.08213,41.17325],[-104.0817,41.17363],[-104.08119,41.17401],[-104.08058,41.1744],[-104.08011,41.17466],[-104.07935,41.175],[-104.07887,41.17518],[-104.0783,41.17535],[-104.07769,41.17549],[-104.07694,41.17561],[-104.07606,41.17568],[-104.07548,41.17568],[-104.07488,41.17568],[-104.07373,41.17559],[-104.06939,41.17513],[-104.06822,41.17501],[-104.06671,41.17484],[-104.06573,41.17475],[-104.06508,41.17473],[-104.06441,41.17475],[-104.06368,41.17483],[-104.06296,41.17495],[-104.06246,41.17506],[-104.06191,41.17522],[-104.06138,41.17539],[-104.06078,41.17564],[-104.0602,41.17593],[-104.0598,41.17616],[-104.05933,41.17648],[-104.05672,41.17859],[-104.05625,41.17896],[-104.0557,41.17933],[-104.0552,41.17964],[-104.05472,41.17995],[-104.05416,41.18025],[-104.05336,41.18065],[-104.05276,41.18092],[-104.05222,41.18113],[-104.05172,41.18132],[-104.0512,41.1815],[-104.05067,41.18166],[-104.05034,41.18176],[-104.04936,41.18199],[-104.04878,41.18212],[-104.04496,41.18281],[-104.0414,41.18347],[-104.03819,41.18406],[-104.0331,41.18501],[-104.02402,41.18668],[-104.01781,41.18777],[-104.01187,41.18879],[-104.00572,41.18986],[-103.99633,41.19149],[-103.99525,41.19166],[-103.9932,41.19191],[-103.9913,41.1921],[-103.9897,41.19223],[-103.98825,41.19233],[-103.98667,41.1924],[-103.98471,41.19245],[-103.98319,41.19245],[-103.96609,41.19223],[-103.95471,41.19208],[-103.95421,41.19207],[-103.9375,41.19189],[-103.93133,41.19185],[-103.93088,41.19185],[-103.91251,41.1917],[-103.90456,41.19174],[-103.89927,41.19178],[-103.89565,41.1918],[-103.89179,41.19183],[-103.88669,41.19186],[-103.88514,41.19186],[-103.88393,41.19184],[-103.88307,41.19181],[-103.88193,41.19175],[-103.88049,41.19166],[-103.87921,41.19158],[-103.87829,41.19151],[-103.87518,41.19126],[-103.8738,41.19116],[-103.87287,41.19109],[-103.8675,41.19068],[-103.86491,41.19054],[-103.86335,41.1905],[-103.86196,41.19048],[-103.86057,41.19048],[-103.85989,41.19049],[-103.8591,41.19051],[-103.85857,41.19054],[-103.85729,41.19059],[-103.85591,41.19067],[-103.85438,41.19079],[-103.85068,41.19114],[-103.84581,41.1916],[-103.84431,41.19173],[-103.84296,41.19182],[-103.84192,41.19188],[-103.84037,41.19192],[-103.83833,41.19196],[-103.82714,41.19188],[-103.82012,41.19181],[-103.8125,41.19176],[-103.80511,41.1917],[-103.79829,41.19166],[-103.7964,41.19166],[-103.77949,41.19188],[-103.77812,41.19191],[-103.77736,41.19194],[-103.77642,41.19199],[-103.77504,41.19208],[-103.77395,41.19215],[-103.77223,41.1923],[-103.77097,41.19243],[-103.76971,41.1926],[-103.76847,41.19278],[-103.76725,41.19296],[-103.76612,41.19317],[-103.76456,41.19346],[-103.76368,41.19364],[-103.76186,41.19405],[-103.75963,41.1946],[-103.75001,41.19721],[-103.74752,41.19785],[-103.72059,41.20512],[-103.70774,41.20858],[-103.70138,41.2103],[-103.69669,41.21155],[-103.69483,41.21205],[-103.69357,41.21236],[-103.69234,41.21264],[-103.69103,41.21294],[-103.6903,41.21308],[-103.68919,41.21329],[-103.68746,41.21357],[-103.68592,41.21381],[-103.68468,41.21398],[-103.68357,41.2141],[-103.68164,41.21431],[-103.67232,41.21531],[-103.66982,41.21559],[-103.66818,41.21575],[-103.66363,41.21626],[-103.66293,41.21633],[-103.65646,41.21701],[-103.64404,41.21836],[-103.6322,41.21963],[-103.62964,41.2199],[-103.62587,41.22029],[-103.62544,41.22033],[-103.6214,41.22078],[-103.61962,41.22098],[-103.61835,41.22109],[-103.61714,41.22117],[-103.61482,41.2213],[-103.61358,41.22134],[-103.61275,41.22134],[-103.61137,41.22137],[-103.6098,41.22136],[-103.60063,41.22134],[-103.59621,41.22133],[-103.59182,41.22131],[-103.58711,41.22129],[-103.58665,41.22129],[-103.56689,41.22121],[-103.56335,41.2212],[-103.54737,41.22112],[-103.54128,41.2211],[-103.52934,41.22104],[-103.51582,41.22096],[-103.50016,41.22087],[-103.49668,41.22085],[-103.48961,41.22082],[-103.48532,41.22089],[-103.48013,41.22101],[-103.47782,41.22109],[-103.47562,41.22117],[-103.47396,41.22124],[-103.45871,41.22206],[-103.45764,41.2221],[-103.4561,41.22214],[-103.45464,41.22215],[-103.4433,41.22212],[-103.43764,41.22209],[-103.39584,41.22198],[-103.39111,41.22197],[-103.39002,41.22195],[-103.389,41.22192],[-103.38768,41.22185],[-103.38633,41.22175],[-103.38483,41.22163],[-103.38348,41.22147],[-103.38193,41.22127],[-103.38114,41.22115],[-103.37997,41.22096],[-103.37919,41.22082],[-103.37849,41.22068],[-103.37709,41.22039],[-103.37639,41.22023],[-103.37612,41.22016],[-103.37418,41.21968],[-103.37265,41.21923],[-103.37079,41.21864],[-103.3687,41.21791],[-103.36157,41.21509],[-103.35972,41.21443],[-103.35796,41.21385],[-103.35598,41.21324],[-103.35429,41.21278],[-103.35214,41.21223],[-103.34961,41.21167],[-103.3488,41.2115],[-103.33376,41.20829],[-103.33124,41.20776],[-103.3292,41.20731],[-103.32676,41.20684],[-103.32464,41.2065],[-103.32367,41.20635],[-103.32279,41.20623],[-103.32004,41.20592],[-103.3176,41.20572],[-103.31707,41.20568],[-103.31496,41.20553],[-103.31448,41.20548],[-103.31392,41.20543],[-103.31346,41.20537],[-103.31307,41.20532],[-103.31267,41.20526],[-103.31235,41.20521],[-103.31207,41.20516],[-103.31178,41.2051],[-103.31151,41.20504],[-103.31112,41.20496],[-103.31053,41.20483],[-103.3079,41.2042],[-103.30568,41.20367],[-103.30465,41.20341],[-103.30258,41.20292],[-103.30156,41.20269],[-103.30052,41.20249],[-103.29929,41.20228],[-103.29847,41.20218],[-103.29698,41.20201],[-103.29574,41.2019],[-103.29509,41.20187],[-103.29394,41.20183],[-103.29267,41.20181],[-103.2844,41.20172],[-103.28184,41.20168],[-103.28045,41.20165],[-103.27588,41.20143],[-103.27385,41.20132],[-103.26942,41.2011],[-103.26745,41.20101],[-103.26234,41.20075],[-103.2598,41.20057],[-103.2579,41.20037],[-103.25626,41.20022],[-103.25345,41.19995],[-103.25159,41.19975],[-103.24789,41.1994],[-103.24542,41.1992],[-103.2438,41.19911],[-103.24183,41.19906],[-103.22939,41.19886],[-103.2274,41.19881],[-103.22579,41.1988],[-103.22159,41.19871],[-103.21594,41.19862],[-103.21399,41.19856],[-103.21254,41.19847],[-103.21154,41.1984],[-103.21044,41.19831],[-103.20858,41.19812],[-103.20567,41.19781],[-103.2034,41.19757],[-103.19727,41.19691],[-103.19468,41.19664],[-103.19161,41.1963],[-103.19029,41.19618],[-103.18848,41.19598],[-103.1875,41.19587],[-103.18564,41.19568],[-103.18226,41.19531],[-103.17771,41.19482],[-103.17449,41.19448],[-103.17373,41.19439],[-103.17263,41.19427],[-103.17006,41.19389],[-103.16827,41.19356],[-103.16646,41.1932],[-103.16464,41.19279],[-103.16318,41.19243],[-103.16065,41.19172],[-103.15863,41.1911],[-103.15766,41.19079],[-103.15599,41.19018],[-103.15472,41.18971],[-103.15327,41.18911],[-103.15152,41.18837],[-103.14909,41.18731],[-103.14613,41.18598],[-103.14362,41.18491],[-103.14263,41.18447],[-103.13979,41.18323],[-103.13786,41.1824],[-103.1367,41.18187],[-103.13345,41.18046],[-103.13068,41.17926],[-103.12902,41.17852],[-103.12606,41.17723],[-103.12169,41.17531],[-103.11808,41.17371],[-103.11721,41.1733],[-103.11554,41.17247],[-103.11452,41.17194],[-103.11292,41.17105],[-103.11195,41.17048],[-103.10914,41.16874],[-103.10878,41.16851],[-103.1045,41.16585],[-103.09598,41.16054],[-103.09394,41.15927],[-103.09192,41.15801],[-103.08937,41.15641],[-103.08867,41.15601],[-103.08684,41.15497],[-103.08357,41.15316],[-103.08112,41.15179],[-103.07763,41.14981],[-103.07563,41.14873],[-103.06918,41.14513],[-103.06251,41.14142],[-103.05775,41.13877],[-103.05081,41.13491],[-103.05037,41.13468],[-103.04363,41.13125],[-103.04288,41.13086],[-103.04135,41.1301],[-103.04006,41.12946],[-103.03841,41.12866],[-103.03734,41.12817],[-103.03601,41.12765],[-103.03519,41.12733],[-103.03391,41.12688],[-103.0327,41.12647],[-103.03143,41.12607],[-103.03053,41.12582],[-103.02832,41.12526],[-103.02737,41.12502],[-103.02672,41.12484],[-103.02507,41.12442],[-103.02454,41.12427],[-103.02399,41.12412],[-103.02345,41.12395],[-103.02268,41.12367],[-103.02229,41.12353],[-103.02203,41.12342],[-103.02141,41.12314],[-103.02059,41.12271],[-103.02024,41.12251],[-103.0199,41.1223],[-103.01946,41.12201],[-103.01882,41.12156],[-103.01779,41.12079],[-103.01713,41.12031],[-103.01633,41.11973],[-103.0152,41.11891],[-103.01399,41.11802],[-103.0131,41.11742],[-103.01267,41.11714],[-103.0122,41.11685],[-103.01151,41.11645],[-103.01087,41.11612],[-103.00994,41.11568],[-103.00929,41.11539],[-103.00827,41.115],[-103.00747,41.11472],[-103.00695,41.11456],[-103.00589,41.11427],[-103.00545,41.11416],[-103.00392,41.11386],[-103.00349,41.11378],[-103.00265,41.11367],[-103.00228,41.11362],[-103.00134,41.11354],[-103.00074,41.1135],[-103,41.11347],[-102.99682,41.11341],[-102.99294,41.11338],[-102.98063,41.11322],[-102.9742,41.11314],[-102.9732,41.11313],[-102.95548,41.11292],[-102.95311,41.11287],[-102.94967,41.11284],[-102.94865,41.11282],[-102.94284,41.11276],[-102.92979,41.11269],[-102.92739,41.11269],[-102.92631,41.11269],[-102.92486,41.11271],[-102.92388,41.11273],[-102.92269,41.11278],[-102.92198,41.1128],[-102.91994,41.11294],[-102.91804,41.11312],[-102.91499,41.11342],[-102.90921,41.11401],[-102.90409,41.11452],[-102.90134,41.11479],[-102.89811,41.11512],[-102.89736,41.11518],[-102.8965,41.11523],[-102.89558,41.11529],[-102.89366,41.11537],[-102.89152,41.1154],[-102.89031,41.1154],[-102.88855,41.11537],[-102.88685,41.1153],[-102.88493,41.11518],[-102.88207,41.11497],[-102.87656,41.11459],[-102.8747,41.11446],[-102.86936,41.11408],[-102.86295,41.11364],[-102.85968,41.11341],[-102.85577,41.11314],[-102.85382,41.11301],[-102.85262,41.11295],[-102.8513,41.11291],[-102.84994,41.11289],[-102.84399,41.11287],[-102.84008,41.11286],[-102.83225,41.11284],[-102.8159,41.11281],[-102.76966,41.11291],[-102.75715,41.11293],[-102.71709,41.11305],[-102.66578,41.11323],[-102.63705,41.1135],[-102.62995,41.11353],[-102.62955,41.11353],[-102.62459,41.11359],[-102.62383,41.11359],[-102.61401,41.11368],[-102.61172,41.11369],[-102.61057,41.11367],[-102.60851,41.11363],[-102.59849,41.11334],[-102.59167,41.11316],[-102.58626,41.11302],[-102.58193,41.11289],[-102.57967,41.11284],[-102.57798,41.11279],[-102.57695,41.11273],[-102.57574,41.11266],[-102.57351,41.11248],[-102.57278,41.11241],[-102.57207,41.11233],[-102.5711,41.11222],[-102.57008,41.11209],[-102.56907,41.11194],[-102.56808,41.11178],[-102.56639,41.11148],[-102.56568,41.11135],[-102.56499,41.11121],[-102.56414,41.11103],[-102.56302,41.11078],[-102.56189,41.11051],[-102.56086,41.11025],[-102.56023,41.11008],[-102.55907,41.10975],[-102.55738,41.10925],[-102.55673,41.10904],[-102.55586,41.10875],[-102.55481,41.10839],[-102.55367,41.10797],[-102.55256,41.10754],[-102.55137,41.10706],[-102.55019,41.10657],[-102.54858,41.10584],[-102.54572,41.10452],[-102.54369,41.10359],[-102.54207,41.10282],[-102.5356,41.09987],[-102.53294,41.09867],[-102.52947,41.09706],[-102.52689,41.09589],[-102.52611,41.09552],[-102.52143,41.09339],[-102.52008,41.09279],[-102.51849,41.09213],[-102.51777,41.09183],[-102.51709,41.09158],[-102.51576,41.0911],[-102.5154,41.09097],[-102.51467,41.09073],[-102.51374,41.09043],[-102.51308,41.09023],[-102.51226,41.08998],[-102.51105,41.08963],[-102.50972,41.08926],[-102.50768,41.08875],[-102.5063,41.08844],[-102.50482,41.08813],[-102.50261,41.08767],[-102.49828,41.08675],[-102.49544,41.08614],[-102.48979,41.08495],[-102.48505,41.08393],[-102.48388,41.08364],[-102.48245,41.08327],[-102.48095,41.08287],[-102.48034,41.0827],[-102.47898,41.08225],[-102.47766,41.08182],[-102.47615,41.08128],[-102.47391,41.08043],[-102.47223,41.07973],[-102.47091,41.07914],[-102.46985,41.07864],[-102.46909,41.07828],[-102.46828,41.07786],[-102.46685,41.07711],[-102.46605,41.07668],[-102.46519,41.07619],[-102.46419,41.0756],[-102.46315,41.07496],[-102.46236,41.07446],[-102.45757,41.07144],[-102.45551,41.07014],[-102.45387,41.06911],[-102.45241,41.06819],[-102.44768,41.06521],[-102.44591,41.0641],[-102.44497,41.06354],[-102.44425,41.06313],[-102.44357,41.06275],[-102.44313,41.06251],[-102.44242,41.06214],[-102.44188,41.06186],[-102.44094,41.0614],[-102.43995,41.06094],[-102.43895,41.0605],[-102.43832,41.06024],[-102.43763,41.05995],[-102.43707,41.05972],[-102.43633,41.05945],[-102.43564,41.05919],[-102.435,41.05895],[-102.43422,41.0587],[-102.43314,41.05835],[-102.43223,41.05807],[-102.43125,41.05778],[-102.43041,41.05755],[-102.42993,41.05743],[-102.4291,41.05722],[-102.42818,41.057],[-102.42703,41.05676],[-102.42598,41.05654],[-102.42493,41.05635],[-102.424,41.05619],[-102.42307,41.05604],[-102.41678,41.05519],[-102.41536,41.055],[-102.4132,41.05471],[-102.41028,41.05431],[-102.40588,41.05372],[-102.39992,41.05291],[-102.3937,41.05207],[-102.39188,41.05181],[-102.38602,41.05104],[-102.38327,41.05065],[-102.38124,41.05041],[-102.37915,41.05023],[-102.37817,41.05016],[-102.37688,41.05008],[-102.375,41.04998],[-102.35427,41.04883],[-102.33569,41.04778],[-102.32774,41.04734],[-102.31232,41.04648],[-102.30325,41.04595],[-102.29787,41.04566],[-102.2924,41.04533],[-102.28608,41.04499],[-102.27836,41.04454],[-102.26729,41.04392],[-102.26401,41.04373],[-102.2628,41.04365],[-102.26159,41.04355],[-102.26012,41.0434],[-102.25977,41.04337],[-102.25834,41.0432],[-102.25702,41.04301],[-102.25083,41.04202],[-102.24664,41.04134],[-102.24202,41.04061],[-102.23106,41.0388],[-102.22561,41.03792],[-102.21857,41.03679],[-102.21608,41.03637],[-102.21361,41.03598],[-102.21113,41.03558],[-102.20756,41.03498],[-102.20103,41.03394],[-102.19111,41.03233],[-102.18715,41.03168],[-102.18406,41.03117],[-102.182,41.03084],[-102.18023,41.03056],[-102.17409,41.02955],[-102.16791,41.02853],[-102.16422,41.02794],[-102.1617,41.02756],[-102.16067,41.02737],[-102.15947,41.02717],[-102.15589,41.02658],[-102.15504,41.02646],[-102.15468,41.02641],[-102.1541,41.02638],[-102.15358,41.02637],[-102.15298,41.02638],[-102.15243,41.02643],[-102.15181,41.02652],[-102.1512,41.02665],[-102.15053,41.02685],[-102.14997,41.02707],[-102.14937,41.02736],[-102.14895,41.02762],[-102.14857,41.02787],[-102.14818,41.02819],[-102.14786,41.02849],[-102.14755,41.02884],[-102.14599,41.03096],[-102.14583,41.0312],[-102.14557,41.0315],[-102.14531,41.03175],[-102.14493,41.0321],[-102.14462,41.03233],[-102.14427,41.03256],[-102.14371,41.03288],[-102.14269,41.03342],[-102.14152,41.03401],[-102.14063,41.03439],[-102.13974,41.03475],[-102.13867,41.03514],[-102.13806,41.03533],[-102.1373,41.03557],[-102.13648,41.03581],[-102.13528,41.03612],[-102.13445,41.03632],[-102.13369,41.03647],[-102.13284,41.03662],[-102.13213,41.03674],[-102.13139,41.03685],[-102.13038,41.037],[-102.12821,41.03731],[-102.1272,41.03745],[-102.125,41.03776],[-102.11049,41.03987],[-102.09513,41.04211],[-102.09299,41.04247],[-102.09147,41.04277],[-102.08996,41.04309],[-102.0889,41.04333],[-102.08738,41.04372],[-102.08473,41.04446],[-102.07896,41.04621],[-102.07805,41.04649],[-102.07675,41.04689],[-102.0758,41.04718],[-102.07377,41.04779],[-102.0703,41.04884],[-102.06643,41.05002],[-102.05919,41.05224],[-102.05548,41.05337],[-102.04739,41.05582],[-102.03719,41.05891],[-102.03633,41.05917],[-102.03577,41.05933],[-102.03509,41.05951],[-102.03444,41.05969],[-102.03351,41.05993],[-102.03204,41.06029],[-102.03128,41.06046],[-102.03052,41.06063],[-102.02979,41.06079],[-102.02931,41.06088],[-102.02862,41.06101],[-102.02758,41.06118],[-102.02657,41.06136],[-102.02548,41.06153],[-102.02488,41.06161],[-102.02435,41.06168],[-102.02341,41.0618],[-102.02284,41.06186],[-102.02195,41.06196],[-102.02114,41.06203],[-102.02044,41.06208],[-102.01942,41.06215],[-102.0184,41.06221],[-102.01747,41.06225],[-102.01625,41.0623],[-102.01499,41.06233],[-102.01381,41.06235],[-102.00611,41.06234],[-101.99991,41.06234],[-101.99891,41.06235],[-101.99793,41.06235],[-101.99672,41.06238],[-101.99587,41.06243],[-101.99453,41.06249],[-101.99365,41.06254],[-101.993,41.06259],[-101.99235,41.06265],[-101.99172,41.06271],[-101.9911,41.06277],[-101.98969,41.06292],[-101.98782,41.06316],[-101.98697,41.06329],[-101.98644,41.06338],[-101.98616,41.06342],[-101.98484,41.06364],[-101.9839,41.06383],[-101.98236,41.06414],[-101.98178,41.06427],[-101.98133,41.06437],[-101.98088,41.06446],[-101.98035,41.06459],[-101.97955,41.06477],[-101.97909,41.06487],[-101.97746,41.06524],[-101.97612,41.06553],[-101.97505,41.06577],[-101.97014,41.06688],[-101.96356,41.06836],[-101.95285,41.07077],[-101.94055,41.07352],[-101.92714,41.07652],[-101.9256,41.07681],[-101.92414,41.07706],[-101.9227,41.07729],[-101.92172,41.07741],[-101.92125,41.07746],[-101.92041,41.07756],[-101.91972,41.07764],[-101.91848,41.07775],[-101.91803,41.07779],[-101.91745,41.07784],[-101.91695,41.07787],[-101.91628,41.07792],[-101.91539,41.07798],[-101.91469,41.07801],[-101.91325,41.07806],[-101.91051,41.07815],[-101.89878,41.07856],[-101.89674,41.07864],[-101.89352,41.07877],[-101.89167,41.07888],[-101.89109,41.07893],[-101.88988,41.07905],[-101.88906,41.07913],[-101.88842,41.0792],[-101.88793,41.07927],[-101.88696,41.07939],[-101.88565,41.07958],[-101.88476,41.07973],[-101.8829,41.08006],[-101.88013,41.08063],[-101.87738,41.08129],[-101.87181,41.08265],[-101.86655,41.08392],[-101.86189,41.08506],[-101.85033,41.08788],[-101.83753,41.091],[-101.83466,41.09169],[-101.83269,41.09219],[-101.83101,41.0926],[-101.82925,41.09299],[-101.82826,41.0932],[-101.82706,41.09343],[-101.82633,41.09356],[-101.82538,41.09371],[-101.8243,41.09388],[-101.82322,41.09403],[-101.82233,41.09416],[-101.82168,41.09423],[-101.82108,41.0943],[-101.81994,41.09442],[-101.81928,41.09447],[-101.81731,41.09467],[-101.81617,41.09477],[-101.81134,41.09522],[-101.80709,41.09562],[-101.80629,41.0957],[-101.80536,41.09579],[-101.80493,41.09585],[-101.80393,41.09598],[-101.80284,41.09612],[-101.80134,41.09636],[-101.79048,41.09814],[-101.78987,41.09824],[-101.78339,41.09932],[-101.78235,41.09952],[-101.78111,41.09977],[-101.77956,41.10012],[-101.7786,41.10035],[-101.77779,41.10056],[-101.77661,41.10088],[-101.77565,41.10116],[-101.77506,41.10133],[-101.77461,41.10147],[-101.77384,41.1017],[-101.77318,41.10192],[-101.77226,41.10223],[-101.77139,41.10253],[-101.76503,41.10491],[-101.76137,41.10628],[-101.75885,41.10723],[-101.75339,41.10928],[-101.7518,41.10988],[-101.75049,41.11036],[-101.74818,41.11116],[-101.74726,41.11147],[-101.74612,41.1118],[-101.74502,41.11212],[-101.74269,41.11275],[-101.74123,41.11308],[-101.73967,41.11342],[-101.73872,41.11361],[-101.73759,41.11382],[-101.7364,41.11403],[-101.73517,41.11421],[-101.73441,41.11431],[-101.73339,41.11446],[-101.7328,41.11452],[-101.73208,41.1146],[-101.73151,41.11466],[-101.73075,41.11473],[-101.73017,41.11478],[-101.72982,41.11481],[-101.72918,41.11486],[-101.72828,41.11492],[-101.72696,41.11498],[-101.72582,41.11502],[-101.72494,41.11504],[-101.72292,41.11506],[-101.72175,41.11504],[-101.70953,41.11494],[-101.70832,41.11494],[-101.7072,41.11495],[-101.70648,41.11499],[-101.70548,41.11506],[-101.70453,41.11513],[-101.70356,41.11525],[-101.70271,41.11536],[-101.70205,41.11547],[-101.70135,41.11559],[-101.70082,41.11569],[-101.70018,41.11581],[-101.69948,41.11596],[-101.6987,41.11616],[-101.69795,41.11636],[-101.69713,41.11659],[-101.69589,41.11697],[-101.69385,41.1176],[-101.69272,41.11794],[-101.69195,41.11817],[-101.69139,41.11834],[-101.69054,41.11858],[-101.68943,41.11886],[-101.6886,41.11906],[-101.68751,41.1193],[-101.68644,41.1195],[-101.68599,41.11958],[-101.68543,41.11969],[-101.68443,41.11983],[-101.68352,41.11995],[-101.68286,41.12004],[-101.68182,41.12015],[-101.68126,41.1202],[-101.68057,41.12026],[-101.67992,41.1203],[-101.6793,41.12034],[-101.6787,41.12036],[-101.67789,41.12038],[-101.67731,41.12039],[-101.67669,41.1204],[-101.67612,41.1204],[-101.66342,41.12041],[-101.65305,41.1204],[-101.62626,41.1204],[-101.62449,41.12041],[-101.62248,41.12038],[-101.62144,41.12035],[-101.62035,41.1203],[-101.61902,41.12021],[-101.61813,41.12015],[-101.6172,41.12007],[-101.61636,41.11999],[-101.61513,41.11987],[-101.60889,41.11927],[-101.59928,41.11836],[-101.59777,41.11823],[-101.59685,41.11816],[-101.59572,41.1181],[-101.59403,41.11803],[-101.59259,41.118],[-101.58327,41.11791],[-101.57086,41.11778],[-101.55206,41.11759],[-101.55097,41.11757],[-101.5497,41.11754],[-101.54822,41.11748],[-101.54687,41.1174],[-101.54539,41.11728],[-101.54417,41.11716],[-101.54294,41.11703],[-101.5419,41.1169],[-101.54059,41.11672],[-101.53966,41.11658],[-101.53859,41.1164],[-101.53654,41.11602],[-101.53443,41.11556],[-101.53242,41.11512],[-101.52913,41.11439],[-101.51962,41.11232],[-101.50302,41.10867],[-101.48933,41.10566],[-101.48789,41.10533],[-101.48643,41.10502],[-101.4851,41.10475],[-101.48415,41.10457],[-101.4826,41.10432],[-101.48149,41.10416],[-101.48083,41.10409],[-101.47958,41.10395],[-101.47866,41.10387],[-101.47755,41.10379],[-101.47649,41.10374],[-101.4748,41.10369],[-101.47322,41.1037],[-101.47209,41.10373],[-101.47134,41.10376],[-101.47006,41.10382],[-101.46933,41.10387],[-101.46813,41.10398],[-101.46679,41.10414],[-101.4653,41.10434],[-101.46427,41.10451],[-101.46316,41.10471],[-101.46212,41.10491],[-101.46115,41.10513],[-101.4604,41.1053],[-101.45807,41.10587],[-101.45719,41.10608],[-101.45486,41.10665],[-101.45259,41.10718],[-101.45125,41.10748],[-101.44983,41.10776],[-101.44871,41.10796],[-101.44748,41.10817],[-101.44584,41.10842],[-101.44388,41.10866],[-101.44255,41.1088],[-101.44164,41.10888],[-101.4404,41.10897],[-101.43944,41.10904],[-101.43831,41.10909],[-101.43668,41.10915],[-101.43555,41.10916],[-101.43432,41.10917],[-101.43356,41.10916],[-101.43256,41.10914],[-101.4314,41.1091],[-101.43013,41.10905],[-101.42731,41.10892],[-101.42406,41.10876],[-101.42084,41.10862],[-101.41915,41.10855],[-101.41718,41.10845],[-101.41532,41.10837],[-101.413,41.10826],[-101.41027,41.10813],[-101.40875,41.10807],[-101.40719,41.10801],[-101.4053,41.10791],[-101.40362,41.10784],[-101.39964,41.10766],[-101.39639,41.10751],[-101.39453,41.10743],[-101.39364,41.10741],[-101.39173,41.10738],[-101.38999,41.10742],[-101.38889,41.10746],[-101.38743,41.10753],[-101.38683,41.10757],[-101.3854,41.10766],[-101.38414,41.10777],[-101.38162,41.10805],[-101.37949,41.10829],[-101.37689,41.10858],[-101.37419,41.10889],[-101.36362,41.11008],[-101.36211,41.11026],[-101.35112,41.11149],[-101.34638,41.11203],[-101.33714,41.11306],[-101.33551,41.11325],[-101.3344,41.11336],[-101.33341,41.11345],[-101.33261,41.11352],[-101.33134,41.1136],[-101.32995,41.11368],[-101.32877,41.11374],[-101.32711,41.11383],[-101.32313,41.11406],[-101.32121,41.11416],[-101.31928,41.11426],[-101.30727,41.1149],[-101.29724,41.11543],[-101.29013,41.11582],[-101.28858,41.11589],[-101.28216,41.11624],[-101.27753,41.11649],[-101.27363,41.1167],[-101.27005,41.11687],[-101.26801,41.11699],[-101.2666,41.1171],[-101.26525,41.11722],[-101.26396,41.11737],[-101.26284,41.11751],[-101.26194,41.11764],[-101.26051,41.11788],[-101.25924,41.11812],[-101.258,41.11838],[-101.2562,41.11879],[-101.25457,41.11921],[-101.25317,41.11962],[-101.25226,41.11989],[-101.25137,41.12019],[-101.25082,41.12038],[-101.2497,41.12077],[-101.2487,41.12115],[-101.24772,41.12152],[-101.24531,41.12258],[-101.24442,41.123],[-101.24279,41.12382],[-101.23694,41.12682],[-101.22982,41.13048],[-101.22852,41.13114],[-101.22743,41.13166],[-101.22658,41.13205],[-101.22508,41.13272],[-101.22304,41.13355],[-101.22132,41.1342],[-101.2195,41.13482],[-101.21743,41.13548],[-101.21601,41.13588],[-101.21436,41.13631],[-101.21183,41.13692],[-101.21033,41.13723],[-101.2088,41.13753],[-101.20758,41.13773],[-101.20674,41.13786],[-101.20482,41.13813],[-101.20348,41.13829],[-101.20148,41.13849],[-101.20073,41.13855],[-101.19943,41.13864],[-101.19792,41.13871],[-101.19644,41.13877],[-101.18708,41.13875],[-101.18347,41.13876],[-101.17633,41.13874],[-101.17364,41.13872],[-101.16579,41.13863],[-101.15848,41.13852],[-101.15109,41.13844],[-101.14748,41.13839],[-101.1433,41.13833],[-101.13972,41.13826],[-101.13729,41.13828],[-101.13614,41.13829],[-101.13447,41.13835],[-101.13301,41.13843],[-101.12703,41.13867],[-101.12654,41.1387],[-101.12466,41.13877],[-101.12163,41.13889],[-101.10768,41.13949],[-101.10178,41.13971],[-101.0969,41.13987],[-101.09238,41.14011],[-101.08896,41.14027],[-101.08587,41.14042],[-101.08379,41.14045],[-101.08142,41.14043],[-101.07952,41.14037],[-101.07413,41.14015],[-101.07194,41.14007],[-101.06974,41.13997],[-101.06767,41.13987],[-101.06094,41.13959],[-101.03383,41.13843],[-101.00928,41.13738],[-100.99579,41.13679],[-100.97285,41.1358],[-100.96306,41.13539],[-100.96101,41.13529],[-100.95535,41.13505],[-100.95176,41.13489],[-100.95013,41.13479],[-100.94931,41.13473],[-100.94801,41.13461],[-100.94671,41.13447],[-100.94524,41.13429],[-100.94406,41.13412],[-100.94245,41.13387],[-100.94148,41.1337],[-100.939,41.13322],[-100.92591,41.13021],[-100.91349,41.12736],[-100.90592,41.12562],[-100.9,41.12426],[-100.89275,41.1226],[-100.8911,41.12222],[-100.88998,41.12198],[-100.8889,41.12177],[-100.88644,41.12134],[-100.88511,41.12115],[-100.88377,41.12097],[-100.88136,41.1207],[-100.87388,41.11982],[-100.86437,41.11871],[-100.84274,41.1162],[-100.8396,41.11584],[-100.8377,41.11556],[-100.83455,41.1151],[-100.8316,41.11465],[-100.82022,41.11298],[-100.81869,41.11279],[-100.81669,41.11259],[-100.81493,41.11246],[-100.81306,41.11235],[-100.81176,41.11231],[-100.81059,41.11228],[-100.80955,41.11228],[-100.80058,41.1123],[-100.79267,41.11231],[-100.79155,41.11233],[-100.79042,41.11236],[-100.78869,41.11242],[-100.78756,41.11247],[-100.78487,41.11258],[-100.78247,41.11267],[-100.77869,41.11282],[-100.77744,41.11283],[-100.77679,41.11282],[-100.77659,41.11282],[-100.77587,41.11281],[-100.77504,41.11277],[-100.77419,41.1127],[-100.77256,41.11251],[-100.77114,41.11232],[-100.77002,41.11215],[-100.76907,41.112],[-100.76895,41.11198],[-100.76842,41.1119],[-100.76734,41.11173],[-100.7665,41.11161],[-100.7653,41.11142],[-100.7608,41.11073],[-100.75694,41.11012],[-100.75446,41.10972],[-100.75374,41.10961],[-100.74548,41.10835],[-100.73727,41.10708],[-100.73139,41.10609],[-100.72974,41.10581],[-100.72476,41.10497],[-100.71942,41.10408],[-100.71286,41.10297],[-100.70533,41.10172],[-100.69986,41.1008],[-100.69674,41.10027],[-100.69,41.09913],[-100.68666,41.09858],[-100.68316,41.09798],[-100.67727,41.09698],[-100.67618,41.09681],[-100.66806,41.09543],[-100.66527,41.09495],[-100.66412,41.09474],[-100.66296,41.0945],[-100.66197,41.09427],[-100.66063,41.09396],[-100.65864,41.09343],[-100.65724,41.09303],[-100.65614,41.0927],[-100.65495,41.09232],[-100.65351,41.09183],[-100.6517,41.09116],[-100.65032,41.09061],[-100.6445,41.0882],[-100.64192,41.08713],[-100.64111,41.0868],[-100.64029,41.08649],[-100.63967,41.08628],[-100.63908,41.0861],[-100.63855,41.08595],[-100.63785,41.08577],[-100.63654,41.08549],[-100.6353,41.08529],[-100.63459,41.0852],[-100.63397,41.08514],[-100.63332,41.08509],[-100.63257,41.08505],[-100.6312,41.08502],[-100.62239,41.08478],[-100.62169,41.08476],[-100.62084,41.08471],[-100.62015,41.08466],[-100.61938,41.08457],[-100.61806,41.08436],[-100.61747,41.08426],[-100.61683,41.08412],[-100.61564,41.08381],[-100.61444,41.08344],[-100.614,41.08329],[-100.61276,41.0828],[-100.61228,41.0826],[-100.61189,41.08242],[-100.61147,41.08221],[-100.61112,41.08204],[-100.61042,41.08165],[-100.60979,41.08128],[-100.60921,41.08091],[-100.60603,41.07878],[-100.60532,41.07834],[-100.60422,41.07765],[-100.60204,41.07642],[-100.60091,41.0758],[-100.59962,41.07515],[-100.5977,41.07424],[-100.59682,41.07385],[-100.59601,41.07351],[-100.5955,41.07328],[-100.59294,41.07228],[-100.59089,41.07155],[-100.58289,41.06876],[-100.57551,41.06619],[-100.57054,41.06443],[-100.56517,41.06257],[-100.56129,41.0612],[-100.55983,41.06067],[-100.55461,41.0586],[-100.5505,41.05695],[-100.54927,41.05649],[-100.54748,41.05583],[-100.54627,41.05542],[-100.54542,41.05515],[-100.54297,41.05443],[-100.54201,41.05418],[-100.54026,41.05373],[-100.5385,41.05334],[-100.53508,41.0527],[-100.53274,41.05234],[-100.5322,41.05229],[-100.52989,41.05198],[-100.52641,41.05154],[-100.52459,41.05131],[-100.52267,41.05107],[-100.51981,41.05071],[-100.51491,41.0501],[-100.51397,41.04998],[-100.51295,41.04982],[-100.5116,41.0496],[-100.5092,41.04913],[-100.50693,41.04862],[-100.50501,41.04814],[-100.50279,41.0475],[-100.50089,41.0469],[-100.49847,41.04605],[-100.49673,41.04538],[-100.49549,41.04487],[-100.49052,41.04262],[-100.48043,41.038],[-100.47833,41.03707],[-100.47586,41.03607],[-100.47447,41.03556],[-100.47248,41.03488],[-100.47101,41.03441],[-100.46935,41.03391],[-100.46101,41.03136],[-100.46023,41.03113],[-100.45855,41.0306],[-100.45766,41.03033],[-100.45665,41.03002],[-100.4533,41.02901],[-100.45032,41.02811],[-100.43825,41.02441],[-100.42223,41.01953],[-100.42037,41.01894],[-100.4185,41.01829],[-100.41717,41.01781],[-100.41483,41.0169],[-100.41323,41.01626],[-100.40295,41.01238],[-100.39613,41.00978],[-100.38797,41.00666],[-100.38315,41.00481],[-100.38063,41.00385],[-100.37724,41.00254],[-100.37117,41.00024],[-100.36704,40.99867],[-100.36429,40.99763],[-100.36359,40.9974],[-100.36255,40.99711],[-100.36193,40.99695],[-100.36097,40.99672],[-100.35976,40.99651],[-100.35886,40.99639],[-100.35293,40.99559],[-100.34701,40.99481],[-100.34179,40.99413],[-100.338,40.99362],[-100.33592,40.99335],[-100.33462,40.99316],[-100.33375,40.99302],[-100.33284,40.99286],[-100.32913,40.99215],[-100.32324,40.99099],[-100.32148,40.99066],[-100.31373,40.98915],[-100.31243,40.98889],[-100.31085,40.98854],[-100.30996,40.98829],[-100.3089,40.98795],[-100.30828,40.98771],[-100.30777,40.9875],[-100.30695,40.98715],[-100.30574,40.98655],[-100.30522,40.98626],[-100.30462,40.98591],[-100.30376,40.98536],[-100.30328,40.98502],[-100.30229,40.98429],[-100.30198,40.98402],[-100.30148,40.98356],[-100.30099,40.98307],[-100.30059,40.98265],[-100.29994,40.98191],[-100.29691,40.97834],[-100.29564,40.97686],[-100.29532,40.97651],[-100.29466,40.97577],[-100.29381,40.97489],[-100.29316,40.97423],[-100.29185,40.97301],[-100.2895,40.97099],[-100.28856,40.97021],[-100.28773,40.96959],[-100.28599,40.96834],[-100.28371,40.96683],[-100.28207,40.96583],[-100.2805,40.96494],[-100.27978,40.96455],[-100.27756,40.96341],[-100.27638,40.96285],[-100.27432,40.96194],[-100.27212,40.96105],[-100.27131,40.96075],[-100.2703,40.96039],[-100.26789,40.95948],[-100.26304,40.95769],[-100.25798,40.95579],[-100.25495,40.95466],[-100.25063,40.95303],[-100.24959,40.95261],[-100.24823,40.95203],[-100.2458,40.95103],[-100.24281,40.94979],[-100.24045,40.94881],[-100.23004,40.94444],[-100.22788,40.94353],[-100.22436,40.94205],[-100.1966,40.93045],[-100.19074,40.928],[-100.18957,40.92749],[-100.18889,40.92717],[-100.1883,40.92688],[-100.18763,40.92652],[-100.18749,40.92644],[-100.18715,40.92625],[-100.18634,40.92578],[-100.18562,40.92533],[-100.18503,40.92494],[-100.18362,40.92394],[-100.18165,40.92239],[-100.18073,40.92167],[-100.17884,40.92018],[-100.17818,40.91971],[-100.17757,40.91928],[-100.17754,40.91925],[-100.17703,40.91892],[-100.17646,40.91856],[-100.17586,40.9182],[-100.17531,40.91788],[-100.1744,40.91739],[-100.17352,40.91695],[-100.17239,40.91641],[-100.17183,40.91618],[-100.17133,40.91597],[-100.1704,40.91562],[-100.16664,40.91419],[-100.16368,40.91308],[-100.15913,40.91136],[-100.15631,40.91028],[-100.14604,40.9064],[-100.14445,40.90577],[-100.12422,40.8975],[-100.11815,40.89502],[-100.11538,40.89387],[-100.10947,40.89146],[-100.10598,40.89004],[-100.10253,40.88862],[-100.10206,40.88842],[-100.10101,40.888],[-100.10029,40.88773],[-100.09983,40.88757],[-100.09908,40.88733],[-100.0982,40.88707],[-100.09751,40.88687],[-100.09687,40.88671],[-100.09529,40.88634],[-100.094,40.8861],[-100.09291,40.88588],[-100.09161,40.88563],[-100.08997,40.88532],[-100.08827,40.885],[-100.08709,40.88477],[-100.08549,40.8844],[-100.08503,40.88429],[-100.08378,40.88393],[-100.0829,40.88366],[-100.08226,40.88344],[-100.08108,40.88302],[-100.07962,40.88248],[-100.07701,40.88151],[-100.07275,40.87996],[-100.07028,40.87903],[-100.06791,40.87816],[-100.06414,40.87678],[-100.05981,40.87519],[-100.05774,40.87444],[-100.05278,40.87262],[-100.04678,40.87041],[-100.0402,40.86799],[-100.03636,40.86659],[-100.03477,40.866],[-100.03376,40.8656],[-100.03186,40.86478],[-100.01722,40.85825],[-100.01258,40.85619],[-100.0067,40.85357],[-100.00591,40.85319],[-100.00382,40.8522],[-99.99885,40.84979],[-99.99718,40.84897],[-99.99584,40.84832],[-99.99388,40.84738],[-99.99138,40.84615],[-99.99064,40.8458],[-99.98992,40.84545],[-99.98957,40.84528],[-99.98884,40.84492],[-99.98573,40.84343],[-99.98172,40.84149],[-99.98115,40.84121],[-99.97872,40.84004],[-99.97751,40.83949],[-99.97627,40.83897],[-99.97528,40.83857],[-99.97446,40.83825],[-99.9727,40.83759],[-99.97089,40.83697],[-99.96433,40.83466],[-99.95784,40.83236],[-99.94687,40.8285],[-99.93827,40.82546],[-99.9329,40.82339],[-99.92723,40.82122],[-99.92,40.81846],[-99.9181,40.8177],[-99.91722,40.81735],[-99.91673,40.81715],[-99.91593,40.81685],[-99.91436,40.81622],[-99.91311,40.81574],[-99.91199,40.81529],[-99.91115,40.81496],[-99.91028,40.81463],[-99.90791,40.81368],[-99.90475,40.81244],[-99.90322,40.81183],[-99.9017,40.81119],[-99.90101,40.81087],[-99.90039,40.8106],[-99.89927,40.81007],[-99.89785,40.80938],[-99.89537,40.80808],[-99.89424,40.80749],[-99.88887,40.80469],[-99.88532,40.80278],[-99.88338,40.80172],[-99.88073,40.80016],[-99.87762,40.79835],[-99.87316,40.79572],[-99.86892,40.79321],[-99.86358,40.7901],[-99.85704,40.78651],[-99.85408,40.78493],[-99.84959,40.78249],[-99.8446,40.77979],[-99.84099,40.77782],[-99.83735,40.77585],[-99.83407,40.77407],[-99.83273,40.77335],[-99.83189,40.77293],[-99.83101,40.7725],[-99.8304,40.77221],[-99.82966,40.77184],[-99.82891,40.77149],[-99.82728,40.77081],[-99.81777,40.76689],[-99.80832,40.76301],[-99.79941,40.75934],[-99.79089,40.75583],[-99.78159,40.752],[-99.78097,40.75176],[-99.77985,40.75132],[-99.77897,40.751],[-99.77748,40.75049],[-99.77541,40.74983],[-99.77442,40.74953],[-99.77355,40.74929],[-99.77223,40.74894],[-99.77095,40.74862],[-99.7683,40.74802],[-99.76572,40.74741],[-99.7634,40.74689],[-99.75774,40.74558],[-99.75271,40.74442],[-99.74641,40.74298],[-99.74399,40.74244],[-99.73922,40.74134],[-99.73731,40.74088],[-99.73575,40.74053],[-99.73392,40.74012],[-99.72911,40.739],[-99.72751,40.73859],[-99.7257,40.73808],[-99.72477,40.73779],[-99.72329,40.73731],[-99.72287,40.73717],[-99.72186,40.73682],[-99.72096,40.7365],[-99.71867,40.7356],[-99.71794,40.73529],[-99.71665,40.73473],[-99.71538,40.73415],[-99.71338,40.73315],[-99.71231,40.73258],[-99.71208,40.73246],[-99.71059,40.73163],[-99.70529,40.72844],[-99.70431,40.72785],[-99.70329,40.72723],[-99.70269,40.72687],[-99.70191,40.7264],[-99.69778,40.72391],[-99.69655,40.72315],[-99.69344,40.72128],[-99.69105,40.71983],[-99.68795,40.71793],[-99.68419,40.71566],[-99.68271,40.71481],[-99.68192,40.71436],[-99.68073,40.71373],[-99.67972,40.71322],[-99.67835,40.71256],[-99.67616,40.71158],[-99.67508,40.71114],[-99.67454,40.71092],[-99.67313,40.71038],[-99.6721,40.71],[-99.67127,40.70971],[-99.66986,40.70924],[-99.66866,40.70887],[-99.66777,40.70861],[-99.66668,40.70831],[-99.66534,40.70796],[-99.66414,40.70764],[-99.66308,40.7074],[-99.66154,40.70707],[-99.65981,40.70675],[-99.65884,40.70655],[-99.65459,40.70574],[-99.65016,40.7049],[-99.63589,40.70218],[-99.62937,40.70094],[-99.62705,40.7005],[-99.62533,40.70021],[-99.62434,40.70006],[-99.62251,40.69981],[-99.62023,40.69958],[-99.61559,40.69921],[-99.61358,40.69905],[-99.61292,40.69901],[-99.61032,40.69881],[-99.6064,40.6985],[-99.60559,40.69844],[-99.60402,40.69832],[-99.60249,40.69817],[-99.60033,40.69793],[-99.59859,40.69769],[-99.5982,40.69763],[-99.59761,40.69754],[-99.59615,40.69728],[-99.59466,40.69699],[-99.58854,40.6957],[-99.58653,40.69531],[-99.58572,40.69514],[-99.58462,40.6949],[-99.58053,40.69406],[-99.57897,40.69372],[-99.57762,40.69345],[-99.57507,40.69291],[-99.56964,40.69178],[-99.56735,40.69135],[-99.56618,40.69117],[-99.56526,40.69103],[-99.56331,40.69078],[-99.5624,40.69067],[-99.56132,40.69057],[-99.55937,40.69041],[-99.55745,40.6903],[-99.55622,40.69026],[-99.55415,40.69022],[-99.55288,40.69024],[-99.55093,40.69028],[-99.54968,40.69034],[-99.54905,40.69037],[-99.54736,40.69049],[-99.53473,40.69145],[-99.52996,40.69182],[-99.51718,40.69281],[-99.51659,40.69284],[-99.51244,40.69317],[-99.51035,40.69332],[-99.5092,40.69338],[-99.5075,40.69344],[-99.50639,40.69345],[-99.50461,40.69344],[-99.49618,40.69337],[-99.48368,40.69323],[-99.47659,40.69316],[-99.47462,40.69315],[-99.4733,40.69318],[-99.47273,40.69321],[-99.4711,40.69329],[-99.4694,40.6934],[-99.46626,40.69362],[-99.44913,40.69475],[-99.44744,40.69488],[-99.44452,40.69498],[-99.44312,40.69499],[-99.44145,40.69495],[-99.44013,40.69491],[-99.43809,40.69481],[-99.43694,40.69473],[-99.43484,40.69454],[-99.42809,40.69388],[-99.42753,40.69382],[-99.4213,40.69318],[-99.41673,40.69272],[-99.41395,40.69244],[-99.41285,40.69232],[-99.41252,40.69229],[-99.41027,40.69201],[-99.40528,40.69145],[-99.40331,40.69122],[-99.40243,40.69111],[-99.40002,40.69083],[-99.39803,40.69064],[-99.39602,40.69048],[-99.39215,40.6903],[-99.38977,40.69016],[-99.38618,40.69008],[-99.38213,40.68996],[-99.38006,40.68994],[-99.37787,40.68998],[-99.37272,40.69017],[-99.37023,40.69026],[-99.35929,40.69065],[-99.3577,40.69068],[-99.35235,40.69079],[-99.352,40.6908],[-99.35048,40.69081],[-99.34864,40.69079],[-99.34677,40.69072],[-99.34558,40.69065],[-99.34461,40.69058],[-99.34352,40.69049],[-99.34266,40.6904],[-99.34145,40.69028],[-99.33963,40.69004],[-99.33795,40.68978],[-99.3363,40.68951],[-99.33414,40.68908],[-99.33379,40.689],[-99.33291,40.6888],[-99.33147,40.68846],[-99.33054,40.68823],[-99.32945,40.68793],[-99.32211,40.6859],[-99.31985,40.68534],[-99.31757,40.68486],[-99.31525,40.68444],[-99.31298,40.68407],[-99.31271,40.68404],[-99.30981,40.68366],[-99.30342,40.68282],[-99.29315,40.68147],[-99.29232,40.68135],[-99.29099,40.68116],[-99.28867,40.68082],[-99.28679,40.68047],[-99.28505,40.6801],[-99.28388,40.67983],[-99.28327,40.67968],[-99.28264,40.67952],[-99.28083,40.67905],[-99.27976,40.67879],[-99.27802,40.67839],[-99.27646,40.67807],[-99.27537,40.67788],[-99.27376,40.67761],[-99.27261,40.67744],[-99.27044,40.67717],[-99.26927,40.67702],[-99.26587,40.67671],[-99.26105,40.67625],[-99.25535,40.67569],[-99.25052,40.67524],[-99.23832,40.67406],[-99.22494,40.67277],[-99.22156,40.67243],[-99.22009,40.6723],[-99.21804,40.67219],[-99.21557,40.67212],[-99.21386,40.67211],[-99.21059,40.67217],[-99.19857,40.67238],[-99.1891,40.67251],[-99.18183,40.67262],[-99.1803,40.6726],[-99.17944,40.67256],[-99.1785,40.67253],[-99.17718,40.67246],[-99.17533,40.67232],[-99.16524,40.67147],[-99.16134,40.67115],[-99.15602,40.67067],[-99.1535,40.6705],[-99.15108,40.67025],[-99.15035,40.67021],[-99.14932,40.67012],[-99.14799,40.67006],[-99.14639,40.67001],[-99.14536,40.67],[-99.1436,40.67],[-99.14162,40.67004],[-99.13897,40.67007],[-99.12505,40.67022],[-99.10917,40.67027],[-99.10717,40.67027],[-99.10687,40.67027],[-99.10563,40.67025],[-99.10439,40.67021],[-99.10375,40.67018],[-99.10052,40.67],[-99.09134,40.66942],[-99.08988,40.66933],[-99.08807,40.66923],[-99.0862,40.66917],[-99.08419,40.66917],[-99.083,40.66919],[-99.08092,40.66928],[-99.0785,40.66938],[-99.07415,40.66955],[-99.07253,40.66961],[-99.07149,40.66964],[-99.07007,40.66966],[-99.06583,40.66966],[-99.05001,40.66969],[-99.04602,40.66969],[-99.03738,40.66972],[-99.03474,40.66972],[-99.02784,40.66975],[-99.02427,40.66974],[-99.01975,40.66973],[-99.01917,40.66974],[-99.01861,40.66977],[-99.01812,40.66981],[-99.01744,40.66988],[-99.01659,40.67],[-99.01592,40.67012],[-99.01543,40.67022],[-99.01482,40.67037],[-99.01426,40.67053],[-99.01365,40.67072],[-99.01302,40.67094],[-99.01237,40.67119],[-99.00846,40.67294],[-99.00524,40.67437],[-99.00294,40.67539],[-99.00247,40.67559],[-99.00093,40.67623],[-98.99979,40.67666],[-98.99877,40.67704],[-98.99777,40.6774],[-98.99521,40.67822],[-98.99323,40.67879],[-98.99263,40.67895],[-98.99244,40.67901],[-98.99203,40.67912],[-98.99064,40.67945],[-98.98937,40.67973],[-98.98879,40.67985],[-98.9883,40.67996],[-98.98717,40.68017],[-98.98564,40.68043],[-98.98384,40.68072],[-98.98279,40.68087],[-98.98239,40.68091],[-98.98121,40.68104],[-98.98003,40.68116],[-98.97924,40.68125],[-98.97608,40.68155],[-98.97085,40.68208],[-98.96963,40.68222],[-98.96813,40.68242],[-98.96668,40.68264],[-98.96518,40.6829],[-98.96414,40.68309],[-98.96191,40.68356],[-98.961,40.68378],[-98.96016,40.68399],[-98.95867,40.68438],[-98.95686,40.6849],[-98.95614,40.68512],[-98.95145,40.68657],[-98.94819,40.68758],[-98.94782,40.68769],[-98.94532,40.68847],[-98.94276,40.68926],[-98.94114,40.68969],[-98.94006,40.68994],[-98.93881,40.69019],[-98.93798,40.69034],[-98.93735,40.69043],[-98.93644,40.69055],[-98.93568,40.69063],[-98.93462,40.69072],[-98.93328,40.6908],[-98.93248,40.69082],[-98.93146,40.69083],[-98.92998,40.69079],[-98.92939,40.69077],[-98.92859,40.69072],[-98.92559,40.69045],[-98.9222,40.69013],[-98.92137,40.69007],[-98.92,40.69003],[-98.91967,40.69003],[-98.91927,40.69002],[-98.91822,40.69003],[-98.9166,40.6901],[-98.91589,40.69015],[-98.91452,40.69028],[-98.91003,40.69086],[-98.9067,40.69131],[-98.8992,40.69227],[-98.89746,40.69252],[-98.89567,40.69274],[-98.89374,40.69294],[-98.8899,40.69321],[-98.88731,40.69337],[-98.88535,40.69351],[-98.88397,40.69359],[-98.87731,40.69404],[-98.87596,40.69415],[-98.87397,40.69439],[-98.87222,40.69462],[-98.87067,40.69487],[-98.86888,40.69519],[-98.86623,40.69575],[-98.86478,40.69609],[-98.86399,40.69631],[-98.86279,40.69662],[-98.86064,40.69725],[-98.85749,40.69822],[-98.85693,40.69841],[-98.85464,40.69912],[-98.85268,40.69973],[-98.85109,40.70022],[-98.84783,40.70124],[-98.84744,40.70136],[-98.84449,40.70228],[-98.84122,40.70332],[-98.83583,40.70498],[-98.83464,40.70535],[-98.82933,40.70699],[-98.82601,40.70804],[-98.82089,40.70963],[-98.81893,40.71021],[-98.81703,40.71073],[-98.81511,40.7112],[-98.81264,40.71173],[-98.81123,40.71201],[-98.80788,40.71272],[-98.80409,40.71351],[-98.78967,40.71652],[-98.78823,40.71683],[-98.78488,40.71752],[-98.77894,40.71876],[-98.77541,40.7195],[-98.77348,40.71992],[-98.76812,40.72104],[-98.76682,40.7213],[-98.76473,40.72167],[-98.7635,40.72186],[-98.76121,40.72216],[-98.76005,40.72229],[-98.75847,40.72244],[-98.75749,40.72251],[-98.75637,40.72259],[-98.75537,40.72263],[-98.75395,40.72269],[-98.75234,40.72271],[-98.75063,40.72271],[-98.74623,40.72264],[-98.74453,40.72262],[-98.74118,40.72259],[-98.74011,40.72257],[-98.7366,40.72255],[-98.73327,40.72251],[-98.72764,40.72246],[-98.72736,40.72246],[-98.7266,40.72243],[-98.72327,40.72226],[-98.72241,40.72222],[-98.72154,40.72215],[-98.71362,40.72169],[-98.71116,40.72155],[-98.70927,40.72147],[-98.70783,40.72145],[-98.70638,40.72145],[-98.70493,40.72147],[-98.70379,40.72151],[-98.70219,40.72158],[-98.70055,40.7217],[-98.69902,40.72183],[-98.697,40.72206],[-98.69586,40.7222],[-98.6889,40.72332],[-98.68154,40.72451],[-98.67715,40.72523],[-98.6762,40.72541],[-98.67506,40.72563],[-98.67393,40.72587],[-98.67284,40.72612],[-98.67174,40.72639],[-98.67076,40.72665],[-98.66969,40.72694],[-98.6681,40.72741],[-98.66699,40.72775],[-98.66577,40.72816],[-98.66459,40.72857],[-98.66249,40.72936],[-98.65546,40.73203],[-98.64049,40.73771],[-98.63812,40.7386],[-98.63411,40.74014],[-98.63281,40.74067],[-98.63177,40.74112],[-98.63014,40.74186],[-98.62903,40.74239],[-98.62663,40.74363],[-98.62549,40.74428],[-98.62409,40.74511],[-98.62296,40.74582],[-98.62187,40.74652],[-98.62103,40.74709],[-98.61926,40.74837],[-98.61577,40.75093],[-98.61466,40.75169],[-98.61403,40.75212],[-98.61325,40.75262],[-98.61241,40.75315],[-98.61123,40.75385],[-98.61022,40.75444],[-98.60902,40.7551],[-98.6078,40.75572],[-98.60689,40.75618],[-98.606,40.75661],[-98.60385,40.75757],[-98.60275,40.75803],[-98.60139,40.75856],[-98.60023,40.759],[-98.59893,40.75946],[-98.59796,40.75978],[-98.59671,40.76017],[-98.5953,40.76059],[-98.59309,40.76122],[-98.58736,40.76289],[-98.58332,40.76405],[-98.57559,40.76626],[-98.56722,40.76867],[-98.56438,40.76952],[-98.56159,40.77039],[-98.55896,40.77132],[-98.5565,40.7723],[-98.55304,40.77386],[-98.5389,40.78034],[-98.52495,40.78668],[-98.51251,40.79242],[-98.51137,40.79293],[-98.51026,40.79339],[-98.50774,40.79438],[-98.50682,40.79471],[-98.50561,40.79513],[-98.50401,40.79564],[-98.50266,40.79603],[-98.50156,40.79635],[-98.49859,40.79713],[-98.48965,40.79952],[-98.48138,40.80171],[-98.47529,40.80332],[-98.46982,40.80477],[-98.45737,40.8081],[-98.4489,40.81035],[-98.44433,40.81155],[-98.44274,40.81198],[-98.44134,40.81239],[-98.43225,40.81526],[-98.42477,40.81762],[-98.41335,40.82126],[-98.40973,40.82241],[-98.40849,40.82274],[-98.40678,40.82311],[-98.40573,40.82325],[-98.40467,40.82335],[-98.40386,40.82338],[-98.40297,40.82337],[-98.40213,40.82334],[-98.40107,40.82325],[-98.40005,40.82311],[-98.3989,40.82291],[-98.39799,40.82268],[-98.39742,40.82251],[-98.39618,40.82209],[-98.39398,40.82126],[-98.3934,40.82104],[-98.39175,40.82041],[-98.39107,40.82018],[-98.39077,40.8201],[-98.39028,40.81996],[-98.3894,40.81977],[-98.38878,40.81964],[-98.38793,40.81951],[-98.38726,40.81942],[-98.38649,40.81935],[-98.38599,40.81932],[-98.38509,40.8193],[-98.38437,40.8193],[-98.38362,40.81933],[-98.38287,40.81938],[-98.38214,40.81947],[-98.38158,40.81954],[-98.37944,40.8199],[-98.37673,40.82034],[-98.37199,40.82114],[-98.369,40.82163],[-98.36823,40.82176],[-98.3576,40.82352],[-98.35109,40.82461],[-98.34972,40.82483],[-98.34909,40.82493],[-98.34736,40.82523],[-98.34636,40.82537],[-98.34551,40.82546],[-98.34338,40.82563],[-98.34123,40.82563],[-98.33971,40.82559],[-98.33836,40.82553],[-98.33683,40.8254],[-98.33543,40.8252],[-98.33285,40.82474],[-98.33172,40.82449],[-98.32995,40.82411],[-98.32204,40.82241],[-98.32053,40.82214],[-98.31783,40.82173],[-98.31524,40.82143],[-98.31257,40.82122],[-98.30973,40.82107],[-98.30546,40.82103],[-98.29283,40.82102],[-98.28399,40.82102],[-98.28202,40.82098],[-98.27881,40.82097],[-98.27811,40.82098],[-98.27652,40.82098],[-98.27325,40.82098],[-98.27068,40.82098],[-98.26967,40.82098],[-98.26006,40.821],[-98.25793,40.82101],[-98.25694,40.82101],[-98.25213,40.82101],[-98.24718,40.82102],[-98.24504,40.821],[-98.24385,40.821],[-98.24049,40.82098],[-98.2354,40.82096],[-98.23313,40.82095],[-98.22768,40.82091],[-98.2256,40.82094],[-98.22521,40.82095],[-98.22245,40.82103],[-98.21979,40.82113],[-98.21797,40.82121],[-98.21617,40.82128],[-98.21331,40.8214],[-98.20857,40.82159],[-98.20656,40.82167],[-98.20642,40.82167],[-98.20638,40.82167],[-98.20391,40.82178],[-98.20198,40.82184],[-98.1992,40.82189],[-98.19291,40.82193],[-98.18998,40.82194],[-98.18755,40.82194],[-98.18555,40.82195],[-98.18274,40.82196],[-98.17836,40.82198],[-98.17696,40.82198],[-98.172,40.822],[-98.16859,40.82201],[-98.16234,40.82204],[-98.16037,40.82204],[-98.15501,40.82206],[-98.14955,40.82207],[-98.14445,40.82204],[-98.13899,40.822],[-98.13639,40.82198],[-98.13336,40.82195],[-98.1308,40.82194],[-98.12836,40.82193],[-98.125,40.82193],[-98.12066,40.82191],[-98.11762,40.82192],[-98.10153,40.82189],[-98.10062,40.82189],[-98.09352,40.82189],[-98.08737,40.82187],[-98.08556,40.82187],[-98.08119,40.82186],[-98.07878,40.82188],[-98.07715,40.82187],[-98.0743,40.82186],[-98.07312,40.82185],[-98.06951,40.82184],[-98.0625,40.82184],[-98.05449,40.82183],[-98.05434,40.82183],[-98.05149,40.82184],[-98.05045,40.82184],[-98.04801,40.82183],[-98.04267,40.82182],[-98.04048,40.82182],[-98.03517,40.82181],[-98.03206,40.82182],[-98.03031,40.82181],[-98.02875,40.82182],[-98.02645,40.82182],[-98.02401,40.82183],[-98.02342,40.82183],[-98.01966,40.82183],[-98.01722,40.82184],[-98.01617,40.82184],[-98.01332,40.82185],[-98.01108,40.82187],[-98.01048,40.82187],[-98.00692,40.82187],[-98.00402,40.8219],[-98.00266,40.8219],[-98.00151,40.82191],[-98.00084,40.82191],[-98,40.8219],[-97.99648,40.82194],[-97.9954,40.82194],[-97.99243,40.82195],[-97.99191,40.82195],[-97.98835,40.82197],[-97.98762,40.82197],[-97.98023,40.82201],[-97.97313,40.82203],[-97.96896,40.82202],[-97.96503,40.82202],[-97.96095,40.82201],[-97.95933,40.82202],[-97.95686,40.82202],[-97.95278,40.822],[-97.94996,40.82201],[-97.94867,40.82201],[-97.94461,40.82199],[-97.94315,40.82197],[-97.94208,40.82194],[-97.94136,40.82191],[-97.9403,40.82187],[-97.93967,40.82184],[-97.9393,40.82183],[-97.93866,40.82179],[-97.93571,40.82161],[-97.93299,40.82139],[-97.93007,40.82115],[-97.92848,40.82102],[-97.92577,40.82076],[-97.92335,40.82063],[-97.92242,40.82056],[-97.92177,40.82054],[-97.92137,40.82053],[-97.92035,40.82052],[-97.91916,40.82052],[-97.91825,40.8205],[-97.9126,40.82068],[-97.91015,40.82077],[-97.90941,40.82079],[-97.90871,40.82081],[-97.90649,40.82089],[-97.90478,40.82094],[-97.90366,40.82098],[-97.90289,40.821],[-97.90255,40.821],[-97.90222,40.821],[-97.90174,40.82101],[-97.90108,40.821],[-97.89673,40.82101],[-97.89648,40.82101],[-97.89248,40.82098],[-97.88834,40.82095],[-97.88442,40.82096],[-97.88119,40.82099],[-97.8791,40.82099],[-97.87712,40.82097],[-97.875,40.82094],[-97.8748,40.82093],[-97.87025,40.82094],[-97.8664,40.82091],[-97.86287,40.82091],[-97.85931,40.82092],[-97.85558,40.82091],[-97.84977,40.82094],[-97.8496,40.82094],[-97.84064,40.82097],[-97.83937,40.82096],[-97.83301,40.82099],[-97.82536,40.82101],[-97.81675,40.82102],[-97.81598,40.82102],[-97.814,40.82101],[-97.81277,40.82101],[-97.81018,40.82101],[-97.80942,40.82101],[-97.80881,40.82101],[-97.80719,40.82101],[-97.80589,40.82101],[-97.80308,40.82101],[-97.80135,40.82102],[-97.79882,40.82101],[-97.79395,40.82101],[-97.78881,40.82101],[-97.78782,40.82101],[-97.78376,40.82109],[-97.78051,40.82117],[-97.77716,40.82124],[-97.77603,40.82128],[-97.77499,40.82129],[-97.77332,40.82133],[-97.77072,40.82138],[-97.76864,40.82141],[-97.76797,40.82143],[-97.76602,40.82148],[-97.75806,40.82165],[-97.75721,40.82167],[-97.75581,40.82169],[-97.75407,40.82174],[-97.75138,40.82178],[-97.74895,40.82179],[-97.74869,40.82179],[-97.74413,40.82174],[-97.74152,40.82169],[-97.73965,40.82167],[-97.73836,40.82165],[-97.7355,40.82161],[-97.71741,40.82137],[-97.71335,40.82132],[-97.71074,40.8213],[-97.70452,40.82127],[-97.70073,40.82127],[-97.69878,40.82126],[-97.69016,40.82124],[-97.68767,40.82124],[-97.68517,40.82121],[-97.6816,40.8212],[-97.67919,40.82119],[-97.67742,40.82118],[-97.67464,40.82118],[-97.67277,40.82117],[-97.65941,40.82113],[-97.65056,40.82112],[-97.64581,40.82111],[-97.64145,40.82113],[-97.6395,40.82111],[-97.63741,40.82112],[-97.63475,40.82112],[-97.63034,40.82112],[-97.62779,40.82112],[-97.61452,40.8211],[-97.61259,40.82111],[-97.60539,40.8211],[-97.60318,40.82109],[-97.60105,40.82109],[-97.59945,40.82109],[-97.59813,40.82109],[-97.59653,40.82112],[-97.59616,40.82113],[-97.59346,40.82123],[-97.59158,40.82129],[-97.58325,40.82159],[-97.58,40.82171],[-97.57857,40.82177],[-97.57694,40.82182],[-97.57421,40.82192],[-97.57258,40.82196],[-97.56981,40.82195],[-97.56516,40.82195],[-97.56223,40.82194],[-97.55886,40.82194],[-97.55361,40.82193],[-97.54056,40.8219],[-97.5384,40.82189],[-97.53381,40.82189],[-97.52702,40.82187],[-97.51836,40.82185],[-97.50257,40.82182],[-97.49899,40.82182],[-97.49303,40.82182],[-97.49138,40.82182],[-97.48852,40.82181],[-97.48572,40.82182],[-97.47684,40.82182],[-97.46951,40.82182],[-97.46529,40.82181],[-97.46153,40.82181],[-97.45836,40.82181],[-97.45475,40.82181],[-97.45115,40.82181],[-97.4459,40.8218],[-97.44512,40.82179],[-97.44411,40.82178],[-97.4421,40.82174],[-97.43767,40.82165],[-97.43699,40.82163],[-97.4356,40.82161],[-97.43317,40.82156],[-97.42923,40.82148],[-97.42565,40.8214],[-97.42357,40.82136],[-97.41759,40.82124],[-97.41552,40.8212],[-97.41316,40.82115],[-97.40942,40.82107],[-97.40824,40.82106],[-97.40686,40.82106],[-97.4063,40.82107],[-97.3927,40.82118],[-97.3884,40.82122],[-97.38493,40.82124],[-97.37914,40.82129],[-97.37663,40.82131],[-97.36905,40.82137],[-97.36519,40.82138],[-97.36158,40.82139],[-97.35836,40.82139],[-97.35582,40.82139],[-97.35479,40.82139],[-97.35295,40.8214],[-97.35078,40.8214],[-97.34757,40.82141],[-97.34335,40.82141],[-97.34055,40.82141],[-97.33638,40.82142],[-97.33553,40.82142],[-97.3329,40.82142],[-97.33014,40.82143],[-97.32843,40.82145],[-97.324,40.82151],[-97.31605,40.82161],[-97.31222,40.82166],[-97.30822,40.82171],[-97.3048,40.82176],[-97.30117,40.8218],[-97.2974,40.82185],[-97.29354,40.82189],[-97.29052,40.82194],[-97.28629,40.82199],[-97.28045,40.82206],[-97.27656,40.82211],[-97.27252,40.82216],[-97.26848,40.82221],[-97.26458,40.82225],[-97.26054,40.82231],[-97.25669,40.82235],[-97.25437,40.82238],[-97.2532,40.82239],[-97.24738,40.82238],[-97.24502,40.82238],[-97.24002,40.82237],[-97.23388,40.82236],[-97.22543,40.82234],[-97.22159,40.82233],[-97.21649,40.82233],[-97.21045,40.82231],[-97.2009,40.8223],[-97.19495,40.82229],[-97.19084,40.82228],[-97.18684,40.82227],[-97.17424,40.82224],[-97.16704,40.82222],[-97.14941,40.82218],[-97.14418,40.82217],[-97.13972,40.82216],[-97.13633,40.82214],[-97.13606,40.82214],[-97.13337,40.82212],[-97.12918,40.8221],[-97.12792,40.82209],[-97.11595,40.82207],[-97.11481,40.82206],[-97.11188,40.82206],[-97.11141,40.82207],[-97.11102,40.82207],[-97.10797,40.82205],[-97.10694,40.82205],[-97.10471,40.82205],[-97.10362,40.82203],[-97.10322,40.82203],[-97.10057,40.82201],[-97.10044,40.82201],[-97.09671,40.82202],[-97.09291,40.82199],[-97.08456,40.82196],[-97.08397,40.82196],[-97.08204,40.82196],[-97.08136,40.82196],[-97.07754,40.82191],[-97.07611,40.82191],[-97.07398,40.82191],[-97.07345,40.8219],[-97.07301,40.8219],[-97.07271,40.8219],[-97.06974,40.82189],[-97.06724,40.82191],[-97.06591,40.8219],[-97.06343,40.82186],[-97.06268,40.82186],[-97.0589,40.82186],[-97.05851,40.82185],[-97.05775,40.82181],[-97.05626,40.82174],[-97.05552,40.8217],[-97.05202,40.82157],[-97.04959,40.82148],[-97.0474,40.82139],[-97.04573,40.82128],[-97.04389,40.82119],[-97.04312,40.82115],[-97.04276,40.82113],[-97.03953,40.82105],[-97.0369,40.82093],[-97.03461,40.82083],[-97.03277,40.82081],[-97.03236,40.82081],[-97.03119,40.82081],[-97.02946,40.82083],[-97.02744,40.82082],[-97.02673,40.82083],[-97.02516,40.82084],[-97.02419,40.82084],[-97.02402,40.82084],[-97.02313,40.82084],[-97.02198,40.82084],[-97.01996,40.82083],[-97.01759,40.82084],[-97.01347,40.82085],[-97.00881,40.82086],[-97.00734,40.82086],[-97.00596,40.82087],[-97.00459,40.82088],[-97.00286,40.8209],[-97.00029,40.82093],[-96.99879,40.82094],[-96.99589,40.82096],[-96.99042,40.821],[-96.98628,40.82104],[-96.98413,40.82106],[-96.98019,40.82111],[-96.97588,40.82114],[-96.97509,40.82115],[-96.96816,40.82122],[-96.96775,40.82122],[-96.9669,40.82124],[-96.96453,40.82126],[-96.95943,40.82135],[-96.95521,40.82141],[-96.95322,40.82145],[-96.95115,40.82149],[-96.94842,40.82155],[-96.94527,40.82161],[-96.94446,40.82162],[-96.94414,40.82162],[-96.94093,40.82167],[-96.9395,40.82166],[-96.93816,40.82163],[-96.93672,40.82158],[-96.93478,40.82147],[-96.93084,40.82126],[-96.92882,40.82115],[-96.92784,40.82111],[-96.92501,40.82097],[-96.92118,40.82075],[-96.91848,40.82061],[-96.91745,40.82056],[-96.91628,40.82052],[-96.91414,40.8205],[-96.91047,40.82045],[-96.9064,40.82041],[-96.89232,40.82027],[-96.87929,40.82014],[-96.87322,40.82009],[-96.87188,40.82011],[-96.87094,40.82013],[-96.86961,40.82019],[-96.86859,40.82025],[-96.867,40.82036],[-96.86579,40.82046],[-96.86456,40.8206],[-96.86325,40.82075],[-96.86229,40.82086],[-96.86055,40.8211],[-96.85932,40.82124],[-96.8578,40.8214],[-96.85583,40.82156],[-96.85387,40.82167],[-96.85208,40.82174],[-96.85101,40.82176],[-96.84978,40.82175],[-96.83891,40.82174],[-96.83782,40.82174],[-96.8348,40.82172],[-96.82964,40.82173],[-96.82807,40.82169],[-96.82706,40.82167],[-96.82596,40.82162],[-96.82467,40.82155],[-96.82362,40.82147],[-96.82263,40.82139],[-96.82129,40.82125],[-96.81895,40.82099],[-96.81548,40.82058],[-96.80557,40.81947],[-96.80198,40.81903],[-96.79786,40.81852],[-96.79403,40.81804],[-96.79397,40.81804],[-96.78804,40.81729],[-96.78716,40.81718],[-96.78556,40.81699],[-96.78383,40.81677],[-96.78279,40.81665],[-96.78146,40.81651],[-96.77986,40.81639],[-96.77768,40.8162],[-96.77654,40.81611],[-96.77302,40.81583],[-96.77088,40.81567],[-96.7695,40.81556],[-96.76875,40.8155],[-96.76828,40.81547],[-96.76801,40.81545],[-96.76735,40.81543],[-96.76665,40.81543],[-96.76597,40.81543],[-96.76566,40.81545],[-96.76489,40.81548],[-96.76451,40.81551],[-96.764,40.81555],[-96.7634,40.81562],[-96.76274,40.81573],[-96.76175,40.81591],[-96.75996,40.81624],[-96.75936,40.81637],[-96.75883,40.81648],[-96.75851,40.81657],[-96.75811,40.8167],[-96.75769,40.81685],[-96.75727,40.81702],[-96.75683,40.81723],[-96.75647,40.8174],[-96.75641,40.81744],[-96.75626,40.81753],[-96.75609,40.81763],[-96.75604,40.81767],[-96.7558,40.81783],[-96.75547,40.81807],[-96.75515,40.81832],[-96.75489,40.81853],[-96.75466,40.81877],[-96.75446,40.81898],[-96.75425,40.81921],[-96.75402,40.81952],[-96.75374,40.81991],[-96.75262,40.82159],[-96.74591,40.83139],[-96.74548,40.83203],[-96.74464,40.83319],[-96.74419,40.83383],[-96.74374,40.83443],[-96.74326,40.83504],[-96.74281,40.83559],[-96.74231,40.83617],[-96.74179,40.83674],[-96.74127,40.83729],[-96.73987,40.83869],[-96.73886,40.83969],[-96.73706,40.8415],[-96.73544,40.84312],[-96.73415,40.84442],[-96.7332,40.84536],[-96.73237,40.8462],[-96.7301,40.84847],[-96.72861,40.84995],[-96.72682,40.85169],[-96.72078,40.85773],[-96.72074,40.85777],[-96.72071,40.8578],[-96.72056,40.85796],[-96.72014,40.85841],[-96.71955,40.85899],[-96.71895,40.85956],[-96.71866,40.85983],[-96.7186,40.85988],[-96.71809,40.86034],[-96.71751,40.86083],[-96.71691,40.86132],[-96.71664,40.86153],[-96.71644,40.86169],[-96.71591,40.86209],[-96.71571,40.86224],[-96.71486,40.86285],[-96.71419,40.86331],[-96.7136,40.86369],[-96.71292,40.86412],[-96.71235,40.86446],[-96.71182,40.86477],[-96.71146,40.86497],[-96.71072,40.86538],[-96.71,40.86576],[-96.70905,40.86626],[-96.70799,40.86683],[-96.7061,40.86781],[-96.7038,40.86903],[-96.70028,40.87088],[-96.69951,40.87129],[-96.69879,40.87172],[-96.69843,40.87194],[-96.69804,40.87219],[-96.69771,40.87242],[-96.6972,40.87278],[-96.69673,40.87314],[-96.69632,40.87348],[-96.69595,40.8738],[-96.69218,40.87735],[-96.69135,40.87812],[-96.68949,40.87989],[-96.68888,40.88047],[-96.68806,40.88127],[-96.68733,40.88196],[-96.68662,40.88262],[-96.68523,40.88389],[-96.68475,40.88431],[-96.68421,40.88474],[-96.68383,40.88503],[-96.68351,40.88526],[-96.68305,40.88557],[-96.68229,40.88605],[-96.68106,40.88681],[-96.67994,40.8875],[-96.67902,40.88806],[-96.67861,40.88832],[-96.67784,40.88881],[-96.67671,40.88953],[-96.67601,40.88998],[-96.67417,40.89115],[-96.66767,40.89539],[-96.66731,40.8956],[-96.66695,40.89578],[-96.66662,40.89594],[-96.66627,40.89608],[-96.66592,40.89621],[-96.66556,40.89632],[-96.66519,40.89643],[-96.66484,40.89651],[-96.66443,40.89659],[-96.66401,40.89666],[-96.66362,40.8967],[-96.66323,40.89673],[-96.65207,40.89669],[-96.6443,40.89671],[-96.64278,40.89671],[-96.62997,40.89673],[-96.62848,40.89675],[-96.6251,40.89679],[-96.6217,40.89682],[-96.6149,40.89685],[-96.6023,40.89687],[-96.60082,40.89686],[-96.59827,40.89675],[-96.59713,40.89674],[-96.59587,40.89675],[-96.59485,40.89678],[-96.5937,40.89682],[-96.58729,40.89714],[-96.58707,40.89715],[-96.57617,40.89749],[-96.57551,40.89751],[-96.57498,40.89749],[-96.57454,40.89747],[-96.57411,40.89743],[-96.57372,40.89739],[-96.57332,40.89734],[-96.57288,40.89726],[-96.57258,40.89721],[-96.57227,40.89714],[-96.57183,40.89704],[-96.57145,40.89694],[-96.57098,40.89681],[-96.57033,40.8966],[-96.56985,40.89642],[-96.56881,40.89599],[-96.56732,40.89542],[-96.56711,40.89534],[-96.56648,40.89509],[-96.56569,40.89482],[-96.56517,40.89466],[-96.56448,40.89446],[-96.56376,40.89424],[-96.56323,40.89407],[-96.56296,40.89398],[-96.56268,40.89391],[-96.56243,40.89384],[-96.56217,40.89379],[-96.56187,40.89373],[-96.5616,40.89369],[-96.56115,40.89364],[-96.56088,40.89362],[-96.56056,40.89361],[-96.56029,40.89361],[-96.56001,40.89362],[-96.55975,40.89363],[-96.55947,40.89366],[-96.55899,40.89372],[-96.55868,40.89377],[-96.55841,40.89382],[-96.5582,40.89386],[-96.55784,40.89397],[-96.55758,40.89405],[-96.55456,40.89505],[-96.55344,40.89543],[-96.55242,40.89576],[-96.54546,40.89809],[-96.53998,40.89991],[-96.53884,40.90028],[-96.53775,40.90063],[-96.53703,40.90084],[-96.53558,40.90126],[-96.53441,40.90157],[-96.53343,40.90181],[-96.53137,40.90229],[-96.5303,40.9025],[-96.52947,40.90267],[-96.52856,40.90283],[-96.52809,40.9029],[-96.52089,40.90415],[-96.52016,40.90428],[-96.5021,40.90746],[-96.49238,40.90908],[-96.49155,40.90925],[-96.49073,40.90945],[-96.48992,40.90966],[-96.48912,40.9099],[-96.48833,40.91015],[-96.48756,40.91043],[-96.48679,40.91073],[-96.48031,40.91377],[-96.47961,40.91409],[-96.46927,40.91882],[-96.46858,40.91912],[-96.46336,40.92149],[-96.46236,40.92198],[-96.45578,40.92498],[-96.45182,40.92677],[-96.4493,40.92793],[-96.44892,40.92811],[-96.44263,40.931],[-96.44038,40.932],[-96.43918,40.93263],[-96.43809,40.93331],[-96.43693,40.93414],[-96.4357,40.93511],[-96.42924,40.94066],[-96.42558,40.94385],[-96.42114,40.9477],[-96.42086,40.94794],[-96.41976,40.9489],[-96.41339,40.95441],[-96.40958,40.95768],[-96.40853,40.95858],[-96.40759,40.95936],[-96.4065,40.96011],[-96.40541,40.96087],[-96.40419,40.96167],[-96.40226,40.96282],[-96.39339,40.96831],[-96.39224,40.96899],[-96.38923,40.97088],[-96.38651,40.9726],[-96.38478,40.97365],[-96.38364,40.97442],[-96.38219,40.97546],[-96.38077,40.97659],[-96.3763,40.97996],[-96.37227,40.98302],[-96.37159,40.98359],[-96.37102,40.98403],[-96.36898,40.98557],[-96.36833,40.98609],[-96.36733,40.98683],[-96.3664,40.98748],[-96.36523,40.98817],[-96.36382,40.98888],[-96.3634,40.98907],[-96.36255,40.98943],[-96.36168,40.98976],[-96.35929,40.99056],[-96.35165,40.99305],[-96.3406,40.99671],[-96.32961,41.00028],[-96.32667,41.00126],[-96.32301,41.00246],[-96.3195,41.00359],[-96.31791,41.00411],[-96.31625,41.00477],[-96.31488,41.00539],[-96.3135,41.00616],[-96.31206,41.00711],[-96.31071,41.00817],[-96.30971,41.00915],[-96.30899,41.01003],[-96.30815,41.01111],[-96.30739,41.01225],[-96.30586,41.01473],[-96.30435,41.01721],[-96.30374,41.01832],[-96.30309,41.01939],[-96.30176,41.02123],[-96.30071,41.02242],[-96.29997,41.02322],[-96.29962,41.0236],[-96.29803,41.02527],[-96.29461,41.02889],[-96.2944,41.02909],[-96.29317,41.03046],[-96.29272,41.03101],[-96.29236,41.03148],[-96.29217,41.03179],[-96.29207,41.03195],[-96.29197,41.03217],[-96.29175,41.03265],[-96.29148,41.03324],[-96.29136,41.03377],[-96.2913,41.03432],[-96.29128,41.03468],[-96.29128,41.03519],[-96.29131,41.03577],[-96.29141,41.03633],[-96.29278,41.04058],[-96.29285,41.04082],[-96.29446,41.04575],[-96.29498,41.04729],[-96.29525,41.04813],[-96.2959,41.05006],[-96.29612,41.05084],[-96.29629,41.05169],[-96.29638,41.05241],[-96.29643,41.05323],[-96.29641,41.05418],[-96.29635,41.05491],[-96.29627,41.05552],[-96.29616,41.05607],[-96.29601,41.0567],[-96.29579,41.05745],[-96.29554,41.05811],[-96.29521,41.05888],[-96.29467,41.05992],[-96.29437,41.0604],[-96.29394,41.06103],[-96.29358,41.0615],[-96.2899,41.06596],[-96.2897,41.0662],[-96.28858,41.06759],[-96.28802,41.06824],[-96.28777,41.06856],[-96.28646,41.07013],[-96.28628,41.07033],[-96.28596,41.07074],[-96.28568,41.07106],[-96.28531,41.07154],[-96.28321,41.07406],[-96.28315,41.07414],[-96.2831,41.07419],[-96.28272,41.07479],[-96.28173,41.07597],[-96.28068,41.07727],[-96.27955,41.07863],[-96.2791,41.07914],[-96.27871,41.07958],[-96.27806,41.08024],[-96.2775,41.08079],[-96.27697,41.08128],[-96.27634,41.08184],[-96.27577,41.08231],[-96.27536,41.08264],[-96.27484,41.08305],[-96.27447,41.08333],[-96.27413,41.08357],[-96.27368,41.08389],[-96.27323,41.08419],[-96.27275,41.08451],[-96.27224,41.08484],[-96.27179,41.0851],[-96.27112,41.0855],[-96.27051,41.08584],[-96.26992,41.08615],[-96.26902,41.08661],[-96.26796,41.08714],[-96.26577,41.08823],[-96.26409,41.08906],[-96.26208,41.09007],[-96.26111,41.09055],[-96.25963,41.0913],[-96.25867,41.09178],[-96.25689,41.09268],[-96.25535,41.09344],[-96.2542,41.09403],[-96.25287,41.09469],[-96.25176,41.09524],[-96.2506,41.09582],[-96.24941,41.0964],[-96.24872,41.09674],[-96.24818,41.097],[-96.24615,41.09801],[-96.24412,41.09901],[-96.24317,41.09949],[-96.24204,41.10005],[-96.24097,41.10057],[-96.23849,41.10182],[-96.23587,41.10311],[-96.23389,41.1041],[-96.23213,41.10498],[-96.23159,41.10527],[-96.23101,41.1056],[-96.23044,41.10595],[-96.23002,41.10622],[-96.22961,41.1065],[-96.22926,41.10676],[-96.2274,41.10822],[-96.22538,41.10982],[-96.22442,41.11059],[-96.22419,41.11077],[-96.22286,41.11182],[-96.22074,41.1135],[-96.21893,41.11493],[-96.21753,41.11604],[-96.21632,41.11699],[-96.21494,41.11808],[-96.2147,41.11825],[-96.21436,41.11848],[-96.21403,41.11869],[-96.21369,41.11888],[-96.21335,41.11906],[-96.21305,41.1192],[-96.2127,41.11935],[-96.21234,41.1195],[-96.21197,41.11963],[-96.21156,41.11979],[-96.21124,41.1199],[-96.21058,41.12015],[-96.20771,41.12119],[-96.20556,41.12197],[-96.20145,41.12346],[-96.19834,41.12459],[-96.19698,41.12509],[-96.19504,41.12579],[-96.1916,41.12703],[-96.18931,41.12787],[-96.1884,41.12819],[-96.18089,41.13094],[-96.18009,41.13122],[-96.17768,41.13211],[-96.17524,41.133],[-96.17387,41.1335],[-96.17333,41.1337],[-96.17276,41.13393],[-96.17221,41.13417],[-96.17142,41.13453],[-96.17089,41.13481],[-96.17035,41.1351],[-96.16982,41.13541],[-96.16904,41.1359],[-96.16843,41.13632],[-96.16801,41.13663],[-96.16763,41.13693],[-96.16717,41.13731],[-96.16675,41.13768],[-96.16651,41.13791],[-96.16621,41.1382],[-96.16579,41.13862],[-96.16549,41.13894],[-96.16502,41.13948],[-96.16455,41.14003],[-96.16409,41.14056],[-96.16329,41.14147],[-96.16148,41.14359],[-96.16099,41.14415],[-96.16035,41.14487],[-96.1597,41.14562],[-96.15876,41.14667],[-96.15805,41.14747],[-96.15762,41.14795],[-96.1567,41.14903],[-96.15606,41.14975],[-96.15487,41.15104],[-96.15458,41.15132],[-96.15433,41.15155],[-96.15396,41.15189],[-96.15348,41.15229],[-96.15312,41.15258],[-96.15278,41.15284],[-96.15238,41.15313],[-96.15176,41.15354],[-96.15046,41.15438],[-96.14886,41.15539],[-96.14798,41.15596],[-96.14655,41.15686],[-96.14615,41.15712],[-96.14448,41.1582],[-96.14338,41.1589],[-96.14215,41.15969],[-96.13856,41.16197],[-96.13674,41.16313],[-96.13505,41.16419],[-96.13453,41.16455],[-96.13389,41.16499],[-96.13331,41.16543],[-96.13273,41.16589],[-96.1323,41.16625],[-96.13098,41.16739],[-96.12993,41.16831],[-96.12907,41.16906],[-96.12851,41.16955],[-96.12813,41.16988],[-96.12712,41.17077],[-96.12623,41.17154],[-96.12445,41.1731],[-96.12335,41.17405],[-96.12134,41.1758],[-96.11956,41.17733],[-96.11834,41.17837],[-96.11722,41.17928],[-96.11547,41.18059],[-96.11508,41.18087],[-96.11423,41.18143],[-96.11305,41.18224],[-96.11263,41.18254],[-96.11213,41.18289],[-96.11108,41.18363],[-96.11036,41.18409],[-96.1096,41.18462],[-96.10904,41.18501],[-96.1087,41.18525],[-96.10605,41.18713],[-96.10546,41.1875],[-96.1051,41.18774],[-96.10474,41.18796],[-96.10252,41.18956],[-96.1012,41.19048],[-96.09838,41.1924],[-96.09812,41.19262],[-96.0978,41.19293],[-96.09744,41.19328],[-96.09708,41.1937],[-96.09677,41.19411],[-96.09644,41.19462],[-96.09626,41.19492],[-96.09596,41.19555],[-96.09576,41.19612],[-96.09558,41.19684],[-96.09498,41.20045],[-96.09453,41.20275],[-96.09438,41.20345],[-96.09422,41.20418],[-96.09406,41.20507],[-96.09371,41.20673],[-96.0936,41.20723],[-96.09359,41.20724],[-96.09347,41.20764],[-96.09328,41.20816],[-96.09306,41.20867],[-96.09281,41.20916],[-96.09108,41.2126],[-96.09097,41.21287],[-96.0909,41.2131],[-96.09083,41.21337],[-96.09076,41.21379],[-96.09072,41.2142],[-96.09072,41.21452],[-96.09078,41.215],[-96.09081,41.21553],[-96.09094,41.21624],[-96.09107,41.21771],[-96.09109,41.21811],[-96.09117,41.21886],[-96.09121,41.21936],[-96.0912,41.21972],[-96.09118,41.22001],[-96.09112,41.22031],[-96.09103,41.2206],[-96.09093,41.22088],[-96.09078,41.22118],[-96.09061,41.22151],[-96.09046,41.22174],[-96.09027,41.22198],[-96.09011,41.22218],[-96.08986,41.22244],[-96.08959,41.22267],[-96.08929,41.22291],[-96.08889,41.22318],[-96.08847,41.22342],[-96.08806,41.22362],[-96.08762,41.22378],[-96.08709,41.22394],[-96.08674,41.22403],[-96.08641,41.2241],[-96.08604,41.22416],[-96.0858,41.22419],[-96.08545,41.22422],[-96.08522,41.22424],[-96.08492,41.22424],[-96.08454,41.22423],[-96.08413,41.2242],[-96.08368,41.22415],[-96.08177,41.22389],[-96.07841,41.22334],[-96.07299,41.22255],[-96.07234,41.22246],[-96.0718,41.22238],[-96.07118,41.22233],[-96.07071,41.22229],[-96.07016,41.22225],[-96.06973,41.22223],[-96.06938,41.22221],[-96.06895,41.2222],[-96.06861,41.2222],[-96.06505,41.2222],[-96.06196,41.22221],[-96.05715,41.22221],[-96.05368,41.22221],[-96.05281,41.22221],[-96.05221,41.22222],[-96.05186,41.22223],[-96.05151,41.22225],[-96.05117,41.22228],[-96.05085,41.22232],[-96.05045,41.2224],[-96.05016,41.22246],[-96.04986,41.22253],[-96.04953,41.22262],[-96.04868,41.22285],[-96.04807,41.22301],[-96.04769,41.22311],[-96.04737,41.2232],[-96.04665,41.22339],[-96.04611,41.22353],[-96.04572,41.22361],[-96.04546,41.22367],[-96.04518,41.22372],[-96.04491,41.22376],[-96.04463,41.22379],[-96.0443,41.2238],[-96.04401,41.22381],[-96.04362,41.22381],[-96.0427,41.22381],[-96.0414,41.2238],[-96.04006,41.22378],[-96.03878,41.22377],[-96.03756,41.22376],[-96.03517,41.22376],[-96.03303,41.22375],[-96.03196,41.22375],[-96.03042,41.22374],[-96.02902,41.22374],[-96.02632,41.22372],[-96.02518,41.22372],[-96.02445,41.22371],[-96.02334,41.22371],[-96.02139,41.2237],[-96.02013,41.22367],[-96.0188,41.22366],[-96.01833,41.22366],[-96.01567,41.22365],[-96.0137,41.22364],[-96.01205,41.22364],[-96.01044,41.22364],[-96.00861,41.22363],[-96.00699,41.22362],[-96.00609,41.22361],[-96.0051,41.22361],[-96.00411,41.2236],[-96.00343,41.22359],[-96.0029,41.22358],[-96.00254,41.22357],[-96.0019,41.22354],[-96.00144,41.22351],[-96.00105,41.22348],[-96.00063,41.22343],[-96.00004,41.22336],[-95.99939,41.22328],[-95.99852,41.22317],[-95.99773,41.22307],[-95.9972,41.223],[-95.99656,41.22292],[-95.99522,41.22274],[-95.9945,41.22265],[-95.99405,41.22261],[-95.9936,41.22257],[-95.99302,41.22253],[-95.99239,41.2225],[-95.99192,41.22248],[-95.99148,41.22248],[-95.99072,41.22247],[-95.98973,41.22247],[-95.9892,41.22246],[-95.98685,41.22247],[-95.98482,41.22247],[-95.98428,41.22248],[-95.98387,41.22249],[-95.98355,41.22251],[-95.98326,41.22255],[-95.98294,41.22259],[-95.98264,41.22265],[-95.98238,41.2227],[-95.98197,41.2228],[-95.98158,41.22291],[-95.98122,41.22302],[-95.98043,41.22325],[-95.97967,41.22348],[-95.97863,41.22379],[-95.97804,41.22396],[-95.97765,41.22407],[-95.97726,41.22417],[-95.97684,41.22426],[-95.97647,41.22435],[-95.97631,41.22438],[-95.97538,41.22455],[-95.97463,41.22468],[-95.97314,41.2249],[-95.97216,41.22507],[-95.97058,41.22532],[-95.96944,41.22551],[-95.96665,41.22598],[-95.96333,41.22654],[-95.96291,41.22662],[-95.96249,41.2267],[-95.96206,41.22678],[-95.96183,41.22682],[-95.95891,41.22731],[-95.95838,41.22738],[-95.9581,41.22741],[-95.95785,41.22743],[-95.95744,41.22744],[-95.95653,41.2274],[-95.95597,41.22731],[-95.95578,41.22727],[-95.95564,41.22724],[-95.9551,41.22707],[-95.95487,41.22699],[-95.95367,41.22658],[-95.95328,41.22645],[-95.95272,41.22626],[-95.9524,41.22618],[-95.9522,41.22613],[-95.95187,41.22607],[-95.95158,41.22603],[-95.95138,41.22601],[-95.95114,41.22598],[-95.95079,41.22597],[-95.95046,41.22597],[-95.95016,41.22596],[-95.94704,41.22606],[-95.94547,41.22609],[-95.94514,41.22611],[-95.94353,41.22617],[-95.94316,41.22619],[-95.94287,41.22623],[-95.94256,41.22627],[-95.94184,41.22641],[-95.94156,41.22648],[-95.94126,41.22657],[-95.94095,41.22668],[-95.94071,41.22677],[-95.93994,41.22705],[-95.93918,41.22734],[-95.93756,41.22796],[-95.93713,41.22811],[-95.93677,41.22826],[-95.93667,41.2283],[-95.93599,41.22859],[-95.93465,41.22913],[-95.93435,41.22925],[-95.93406,41.22935],[-95.93378,41.22944],[-95.93349,41.22952],[-95.93331,41.22956],[-95.93256,41.22973],[-95.93227,41.22978],[-95.93197,41.22981],[-95.93179,41.22983],[-95.92732,41.23025],[-95.92625,41.2304],[-95.92547,41.2305],[-95.92461,41.23061],[-95.92413,41.23065],[-95.92341,41.23073],[-95.92277,41.23077],[-95.92139,41.23088],[-95.91635,41.23128],[-95.91085,41.23166],[-95.90844,41.2318],[-95.9071,41.23188],[-95.9056,41.23198],[-95.90483,41.23202],[-95.90411,41.23206],[-95.90319,41.23211],[-95.90188,41.23217],[-95.89864,41.23238],[-95.89584,41.23256],[-95.8951,41.2326],[-95.89478,41.2326],[-95.89401,41.23261],[-95.89152,41.23257],[-95.89091,41.23254],[-95.88927,41.23248],[-95.88752,41.23242],[-95.88615,41.23238],[-95.8851,41.23236],[-95.88287,41.23228],[-95.88123,41.23223],[-95.87979,41.23218],[-95.87902,41.23217],[-95.87756,41.23216],[-95.87631,41.23215],[-95.87473,41.23214],[-95.87303,41.23212],[-95.87194,41.23212],[-95.87019,41.23211],[-95.8654,41.23209],[-95.86447,41.23208],[-95.85971,41.23207],[-95.85807,41.23205],[-95.85294,41.23202],[-95.85188,41.23201],[-95.85017,41.232],[-95.84908,41.23198],[-95.84835,41.23197],[-95.84792,41.23196],[-95.8476,41.23195],[-95.84736,41.23192],[-95.84712,41.23191],[-95.8468,41.23186],[-95.84651,41.23181],[-95.84623,41.23175],[-95.84596,41.23168],[-95.84564,41.2316],[-95.84532,41.2315],[-95.84505,41.23141],[-95.84482,41.23132],[-95.8446,41.23122],[-95.84436,41.23111],[-95.84414,41.23099],[-95.84395,41.23088],[-95.84374,41.23076],[-95.8426,41.23005],[-95.84219,41.22979],[-95.84199,41.22969],[-95.8419,41.22964],[-95.84176,41.22957],[-95.84147,41.22944],[-95.8413,41.22938],[-95.84113,41.22932],[-95.84085,41.22923],[-95.84058,41.22915],[-95.84002,41.22903],[-95.83987,41.229],[-95.83948,41.22895],[-95.83924,41.22892],[-95.83915,41.22892],[-95.83871,41.2289],[-95.83855,41.2289],[-95.8383,41.22891],[-95.83812,41.22892],[-95.83777,41.22895],[-95.83739,41.22899],[-95.83676,41.22913],[-95.8365,41.2292],[-95.83631,41.22925],[-95.83594,41.2294],[-95.83541,41.22967],[-95.83502,41.22984],[-95.83484,41.22992],[-95.83343,41.23066],[-95.83289,41.23095],[-95.8322,41.2313],[-95.83174,41.23151],[-95.83045,41.23217],[-95.82998,41.23241],[-95.82924,41.23279],[-95.8289,41.23298],[-95.82856,41.2332],[-95.8281,41.23354],[-95.82787,41.23374],[-95.82763,41.23397],[-95.8274,41.23422],[-95.82716,41.23452],[-95.82705,41.23467],[-95.8269,41.2349],[-95.82675,41.2352],[-95.82659,41.23552],[-95.82642,41.23591],[-95.82606,41.23681],[-95.82562,41.23785],[-95.82542,41.23834],[-95.82501,41.23933],[-95.8249,41.23957],[-95.82449,41.24057],[-95.8243,41.24099],[-95.82421,41.24118],[-95.8241,41.24136],[-95.82402,41.24149],[-95.82393,41.24164],[-95.82376,41.24188],[-95.82365,41.24201],[-95.82355,41.24212],[-95.82344,41.24223],[-95.8231,41.24257],[-95.82289,41.24275],[-95.82267,41.24292],[-95.82239,41.24311],[-95.82222,41.24322],[-95.82203,41.24333],[-95.82184,41.24344],[-95.82155,41.24359],[-95.8214,41.24366],[-95.82098,41.24384],[-95.82064,41.24397],[-95.82032,41.24408],[-95.82003,41.24417],[-95.81887,41.2446],[-95.81803,41.24494],[-95.81751,41.24516],[-95.81728,41.24526],[-95.81712,41.24533],[-95.81692,41.24543],[-95.81671,41.24555],[-95.81654,41.24566],[-95.81632,41.24579],[-95.81615,41.24591],[-95.8159,41.2461],[-95.81563,41.24631],[-95.81535,41.24656],[-95.81443,41.24736],[-95.81326,41.24839],[-95.81283,41.24877],[-95.81255,41.24904],[-95.81225,41.24934],[-95.81184,41.24981],[-95.81111,41.25072],[-95.80916,41.25314],[-95.80878,41.25363],[-95.80865,41.2538],[-95.80346,41.26024],[-95.80309,41.26069],[-95.80271,41.26119],[-95.80124,41.26299],[-95.8006,41.26377],[-95.80036,41.26405],[-95.79994,41.2645],[-95.79965,41.2648],[-95.79938,41.26506],[-95.79911,41.2653],[-95.79851,41.26583],[-95.79819,41.26609],[-95.79782,41.26638],[-95.79751,41.2666],[-95.79397,41.26916],[-95.79171,41.27079],[-95.79144,41.27099],[-95.79106,41.27129],[-95.7908,41.2715],[-95.79032,41.27191],[-95.79013,41.27208],[-95.78988,41.27232],[-95.78941,41.27278],[-95.78921,41.27299],[-95.78885,41.27339],[-95.78854,41.27375],[-95.78804,41.27438],[-95.78785,41.27465],[-95.78774,41.2748],[-95.78735,41.27538],[-95.78696,41.27601],[-95.78627,41.27703],[-95.78563,41.2781],[-95.78461,41.27973],[-95.78417,41.28042],[-95.78273,41.28269],[-95.78258,41.28293],[-95.78211,41.28362],[-95.78199,41.28379],[-95.78065,41.28598],[-95.77854,41.28933],[-95.77828,41.28973],[-95.77555,41.29405],[-95.77218,41.29938],[-95.77186,41.29986],[-95.77166,41.30015],[-95.7713,41.30063],[-95.77106,41.30093],[-95.77099,41.30101],[-95.76809,41.30442],[-95.765,41.30802],[-95.76295,41.31041],[-95.76199,41.31153],[-95.76069,41.31305],[-95.76032,41.31346],[-95.75984,41.31396],[-95.75978,41.31403],[-95.75932,41.31447],[-95.75668,41.31702],[-95.75544,41.3182],[-95.75502,41.31861],[-95.75369,41.31988],[-95.74583,41.32743],[-95.74532,41.32793],[-95.74467,41.32853],[-95.74394,41.32918],[-95.74033,41.33228],[-95.74014,41.33245],[-95.73985,41.3327],[-95.73979,41.33276],[-95.73586,41.33612],[-95.73529,41.33661],[-95.73164,41.33976],[-95.73114,41.34017],[-95.73074,41.34047],[-95.73032,41.34076],[-95.72988,41.34103],[-95.72952,41.34125],[-95.72905,41.3415],[-95.72882,41.34162],[-95.72833,41.34185],[-95.72809,41.34196],[-95.72755,41.34218],[-95.72703,41.34237],[-95.7269,41.34241],[-95.7265,41.34254],[-95.72597,41.3427],[-95.72569,41.34278],[-95.7254,41.34285],[-95.72482,41.34297],[-95.72424,41.34308],[-95.72126,41.34357],[-95.71111,41.34524],[-95.71062,41.34533],[-95.71014,41.34544],[-95.70966,41.34556],[-95.70918,41.34569],[-95.70871,41.34584],[-95.70825,41.346],[-95.7078,41.34617],[-95.70736,41.34636],[-95.70727,41.3464],[-95.70692,41.34655],[-95.70653,41.34674],[-95.70612,41.34696],[-95.70571,41.34719],[-95.70532,41.34743],[-95.70493,41.34769],[-95.70456,41.34795],[-95.7042,41.34822],[-95.70386,41.3485],[-95.70342,41.34889],[-95.7024,41.34987],[-95.70176,41.35049],[-95.70044,41.35181],[-95.6931,41.35898],[-95.68934,41.36266],[-95.6874,41.36456],[-95.68166,41.37017],[-95.6814,41.37042],[-95.68014,41.37165],[-95.67977,41.37202],[-95.67915,41.37262],[-95.67878,41.37298],[-95.67848,41.37328],[-95.67728,41.37447],[-95.67613,41.37561],[-95.67392,41.37776],[-95.6732,41.37842],[-95.67141,41.38018],[-95.67113,41.38046],[-95.67106,41.38053],[-95.67073,41.38089],[-95.67019,41.38149],[-95.6698,41.38199],[-95.66963,41.38233],[-95.66947,41.38265],[-95.66931,41.38298],[-95.66919,41.3833],[-95.66908,41.3836],[-95.66889,41.38406],[-95.66876,41.38433],[-95.66862,41.38468],[-95.66853,41.38501],[-95.66845,41.38546],[-95.66833,41.38618],[-95.66816,41.38796],[-95.66796,41.38902],[-95.66784,41.39008],[-95.66777,41.39058],[-95.66774,41.391],[-95.6677,41.39139],[-95.66765,41.39186],[-95.66758,41.39231],[-95.66752,41.3926],[-95.66743,41.39287],[-95.66728,41.39322],[-95.66711,41.39355],[-95.66694,41.3939],[-95.66674,41.39424],[-95.66652,41.39457],[-95.66631,41.39486],[-95.666,41.39524],[-95.66567,41.3956],[-95.66533,41.39596],[-95.66496,41.39631],[-95.66362,41.39765],[-95.6627,41.39856],[-95.65691,41.40433],[-95.65613,41.4051],[-95.6548,41.40641],[-95.65077,41.41041],[-95.65005,41.41112],[-95.64913,41.41207],[-95.64835,41.41285],[-95.64644,41.41472],[-95.64538,41.41574],[-95.64392,41.41711],[-95.64299,41.41796],[-95.64138,41.41942],[-95.63951,41.42112],[-95.63785,41.42263],[-95.63305,41.42698],[-95.62875,41.43089],[-95.62844,41.43117],[-95.6258,41.43362],[-95.62542,41.43395],[-95.62502,41.43427],[-95.62482,41.43442],[-95.62439,41.43472],[-95.624,41.43498],[-95.62357,41.43524],[-95.62312,41.43549],[-95.62269,41.43571],[-95.62266,41.43573],[-95.62242,41.43584],[-95.61744,41.43809],[-95.61713,41.43823],[-95.61682,41.43838],[-95.61523,41.43912],[-95.61501,41.43921],[-95.61467,41.43938],[-95.61443,41.43949],[-95.61412,41.43964],[-95.61318,41.44006],[-95.61218,41.44051],[-95.60925,41.44189],[-95.60796,41.44247],[-95.60761,41.44265],[-95.60699,41.44303],[-95.60672,41.44323],[-95.60615,41.44368],[-95.60573,41.44408],[-95.60541,41.44443],[-95.60515,41.44475],[-95.60489,41.44508],[-95.60476,41.44525],[-95.60427,41.44606],[-95.60337,41.44793],[-95.60313,41.44843],[-95.60157,41.4517],[-95.60102,41.45283],[-95.60039,41.45414],[-95.60013,41.45468],[-95.59869,41.45766],[-95.59784,41.45946],[-95.59756,41.46005],[-95.59721,41.46077],[-95.5964,41.46242],[-95.5961,41.46307],[-95.5957,41.4639],[-95.59467,41.46604],[-95.59341,41.46868],[-95.59318,41.46916],[-95.59273,41.47009],[-95.59229,41.47101],[-95.59182,41.47201],[-95.59042,41.47493],[-95.5903,41.47517],[-95.58967,41.47649],[-95.58929,41.47731],[-95.58919,41.47754],[-95.58902,41.478],[-95.58887,41.47844],[-95.58881,41.47867],[-95.58867,41.47918],[-95.58845,41.48016],[-95.58828,41.481],[-95.58774,41.48354],[-95.58756,41.48439],[-95.58734,41.4854],[-95.58714,41.48636],[-95.58686,41.48766],[-95.58637,41.48995],[-95.58626,41.49039],[-95.58609,41.49093],[-95.58599,41.4912],[-95.58584,41.49156],[-95.58571,41.49186],[-95.58566,41.49199],[-95.58538,41.49265],[-95.58531,41.49281],[-95.58522,41.49303],[-95.58505,41.49339],[-95.58493,41.49369],[-95.58484,41.4939],[-95.58467,41.49422],[-95.58457,41.4944],[-95.5844,41.49465],[-95.58431,41.49477],[-95.58409,41.49502],[-95.58387,41.49524],[-95.58363,41.49546],[-95.58347,41.49558],[-95.58334,41.49568],[-95.58323,41.49577],[-95.58297,41.49593],[-95.58252,41.49619],[-95.58169,41.49665],[-95.58124,41.49689],[-95.58093,41.49707],[-95.5808,41.49714],[-95.5798,41.49768],[-95.57961,41.49778],[-95.57942,41.49787],[-95.57895,41.49808],[-95.57858,41.49824],[-95.57843,41.49829],[-95.57824,41.49836],[-95.57791,41.49846],[-95.57764,41.49853],[-95.57732,41.4986],[-95.57679,41.49867],[-95.57618,41.49873],[-95.57367,41.49873],[-95.57164,41.4987],[-95.56773,41.49856],[-95.5671,41.49853],[-95.56167,41.49833],[-95.56076,41.4983],[-95.55924,41.49824],[-95.55619,41.49813],[-95.5553,41.4981],[-95.55279,41.498],[-95.55125,41.49795],[-95.54905,41.49786],[-95.54848,41.49786],[-95.54802,41.49786],[-95.54742,41.49787],[-95.54699,41.49789],[-95.54643,41.49792],[-95.54622,41.49794],[-95.54611,41.49795],[-95.54588,41.49796],[-95.54378,41.49818],[-95.54307,41.49825],[-95.54211,41.49835],[-95.54039,41.49852],[-95.53657,41.49892],[-95.53382,41.4992],[-95.53153,41.49944],[-95.53079,41.49951],[-95.52948,41.49965],[-95.52901,41.4997],[-95.52816,41.49978],[-95.52761,41.49983],[-95.52671,41.49993],[-95.52619,41.49998],[-95.52583,41.50001],[-95.52491,41.50008],[-95.52394,41.50015],[-95.52295,41.50019],[-95.52188,41.50022],[-95.52101,41.50023],[-95.51999,41.50022],[-95.5191,41.5002],[-95.5182,41.50017],[-95.51733,41.50012],[-95.51602,41.50005],[-95.51484,41.49999],[-95.51222,41.49985],[-95.51103,41.49979],[-95.50437,41.49944],[-95.50295,41.49936],[-95.50119,41.49927],[-95.50002,41.49921],[-95.49918,41.49917],[-95.49801,41.4991],[-95.49519,41.49896],[-95.49403,41.49891],[-95.49286,41.49887],[-95.49177,41.49885],[-95.48988,41.49884],[-95.48946,41.49884],[-95.48901,41.49884],[-95.48594,41.4989],[-95.48493,41.49891],[-95.48008,41.49899],[-95.47874,41.49901],[-95.47729,41.49902],[-95.47611,41.49902],[-95.47307,41.49898],[-95.47194,41.49896],[-95.47032,41.49893],[-95.46535,41.49885],[-95.46044,41.49878],[-95.46026,41.49878],[-95.45945,41.49876],[-95.45844,41.49875],[-95.45705,41.49873],[-95.45618,41.49872],[-95.45441,41.49869],[-95.45122,41.49864],[-95.45109,41.49864],[-95.4484,41.4986],[-95.44565,41.49855],[-95.44505,41.49853],[-95.44391,41.4985],[-95.44283,41.49848],[-95.44197,41.49845],[-95.43441,41.49825],[-95.43364,41.49823],[-95.41138,41.49765],[-95.4092,41.49761],[-95.40704,41.49759],[-95.40497,41.49759],[-95.40312,41.49758],[-95.40104,41.49758],[-95.39945,41.49757],[-95.39739,41.49757],[-95.39565,41.49756],[-95.39433,41.49756],[-95.39246,41.49755],[-95.39099,41.49755],[-95.39044,41.49755],[-95.38563,41.49754],[-95.38353,41.49754],[-95.38167,41.49754],[-95.37746,41.49755],[-95.3759,41.49754],[-95.3705,41.49754],[-95.36696,41.49753],[-95.36382,41.49753],[-95.36223,41.49753],[-95.3526,41.49752],[-95.35203,41.49752],[-95.35141,41.49752],[-95.3509,41.49752],[-95.34974,41.49752],[-95.34631,41.49752],[-95.34574,41.49752],[-95.34496,41.49751],[-95.34445,41.49751],[-95.3427,41.49751],[-95.34038,41.49752],[-95.33815,41.49751],[-95.33667,41.4975],[-95.3364,41.4975],[-95.33627,41.4975],[-95.33408,41.4975],[-95.33265,41.49749],[-95.33181,41.4975],[-95.32908,41.4976],[-95.32844,41.4976],[-95.32596,41.49766],[-95.32403,41.49772],[-95.32031,41.4978],[-95.31806,41.49786],[-95.31491,41.49793],[-95.31313,41.49797],[-95.31285,41.49798],[-95.31265,41.49798],[-95.30917,41.49806],[-95.3079,41.4981],[-95.3072,41.49812],[-95.30484,41.49816],[-95.30241,41.49823],[-95.30153,41.49826],[-95.30094,41.49827],[-95.30052,41.49828],[-95.29975,41.4983],[-95.29936,41.49831],[-95.29769,41.49834],[-95.29689,41.49836],[-95.29628,41.49838],[-95.29576,41.49838],[-95.2951,41.49841],[-95.29451,41.49842],[-95.29388,41.49844],[-95.29303,41.49845],[-95.29272,41.49846],[-95.29189,41.49848],[-95.2914,41.49849],[-95.29004,41.49852],[-95.28926,41.49853],[-95.28812,41.49856],[-95.28737,41.49858],[-95.28604,41.4986],[-95.28563,41.4986],[-95.28501,41.49859],[-95.28401,41.49856],[-95.28309,41.49852],[-95.28203,41.49846],[-95.28163,41.49843],[-95.28122,41.49842],[-95.27999,41.49835],[-95.2785,41.49827],[-95.27808,41.49825],[-95.27748,41.49821],[-95.2771,41.49819],[-95.27649,41.49816],[-95.27566,41.49812],[-95.27211,41.49791],[-95.27048,41.49782],[-95.26954,41.49777],[-95.26586,41.49757],[-95.26318,41.49743],[-95.26042,41.49736],[-95.25507,41.49733],[-95.2526,41.49732],[-95.25107,41.49732],[-95.24922,41.49731],[-95.24473,41.4973],[-95.24178,41.49728],[-95.23971,41.49727],[-95.2317,41.49724],[-95.22802,41.49722],[-95.22647,41.49722],[-95.22501,41.49721],[-95.2222,41.49719],[-95.22209,41.49719],[-95.22202,41.49719],[-95.22121,41.49719],[-95.21806,41.49718],[-95.21708,41.49717],[-95.21655,41.49716],[-95.21579,41.49715],[-95.21236,41.49715],[-95.2121,41.49715],[-95.20738,41.49713],[-95.20438,41.49712],[-95.20296,41.49714],[-95.19822,41.49727],[-95.19319,41.49742],[-95.19197,41.49746],[-95.19117,41.49748],[-95.19082,41.49749],[-95.1894,41.49754],[-95.17935,41.49783],[-95.17647,41.49789],[-95.17441,41.49793],[-95.17387,41.49793],[-95.17224,41.49795],[-95.17167,41.49797],[-95.16909,41.498],[-95.16826,41.49801],[-95.16759,41.49802],[-95.16613,41.49804],[-95.16345,41.49808],[-95.1625,41.49809],[-95.16154,41.49811],[-95.16072,41.49812],[-95.15554,41.49819],[-95.15401,41.49821],[-95.14986,41.49822],[-95.14902,41.49824],[-95.14794,41.49824],[-95.14699,41.49826],[-95.14495,41.49831],[-95.14308,41.49835],[-95.14155,41.49839],[-95.14087,41.4984],[-95.13931,41.49843],[-95.13795,41.49843],[-95.13677,41.49845],[-95.13435,41.49846],[-95.13294,41.49845],[-95.13131,41.49835],[-95.12992,41.49824],[-95.12742,41.49799],[-95.12352,41.49756],[-95.12262,41.49747],[-95.11958,41.49717],[-95.11876,41.49708],[-95.11854,41.49706],[-95.11662,41.4969],[-95.11593,41.49685],[-95.11455,41.49683],[-95.1133,41.49687],[-95.11247,41.49693],[-95.11182,41.49698],[-95.11102,41.49705],[-95.10987,41.49717],[-95.10784,41.49732],[-95.10392,41.49768],[-95.1019,41.49786],[-95.10011,41.49806],[-95.09965,41.4981],[-95.09911,41.49816],[-95.09836,41.49821],[-95.09799,41.49822],[-95.0974,41.4982],[-95.09698,41.4982],[-95.09645,41.49819],[-95.09257,41.49796],[-95.09133,41.49786],[-95.08865,41.49765],[-95.08475,41.49735],[-95.08227,41.49718],[-95.08076,41.49705],[-95.08006,41.49699],[-95.07932,41.49696],[-95.07903,41.49695],[-95.07536,41.4969],[-95.07296,41.49686],[-95.07189,41.49686],[-95.06902,41.49683],[-95.06748,41.4968],[-95.0652,41.49677],[-95.06421,41.49677],[-95.06336,41.49676],[-95.06293,41.49675],[-95.06189,41.49674],[-95.06104,41.4967],[-95.06068,41.49669],[-95.05956,41.49669],[-95.0566,41.49671],[-95.05271,41.49677],[-95.04882,41.49677],[-95.0449,41.49682],[-95.04101,41.49688],[-95.04074,41.49688],[-95.03708,41.49692],[-95.03319,41.49694],[-95.02925,41.49698],[-95.02875,41.49699],[-95.02754,41.49703],[-95.02509,41.49704],[-95.02359,41.49706],[-95.02268,41.49707],[-95.02144,41.49709],[-95.01357,41.49715],[-95.01283,41.49714],[-95.01064,41.49717],[-95.00961,41.49718],[-95.00926,41.49717],[-95.0059,41.49719],[-95.00584,41.49719],[-95.00529,41.49721],[-95.00307,41.49721],[-95.00189,41.49719],[-95.0018,41.49719],[-95.00145,41.49719],[-94.99991,41.49718],[-94.99743,41.49718],[-94.99729,41.49718],[-94.99714,41.49718],[-94.99526,41.49716],[-94.99396,41.49717],[-94.99139,41.49717],[-94.99078,41.49719],[-94.9897,41.49718],[-94.98781,41.49716],[-94.9876,41.49715],[-94.98727,41.49714],[-94.98641,41.49714],[-94.98436,41.49708],[-94.98391,41.49709],[-94.9832,41.49708],[-94.98257,41.49709],[-94.98128,41.49708],[-94.97791,41.49708],[-94.97474,41.49707],[-94.9718,41.49707],[-94.97092,41.49706],[-94.96864,41.4971],[-94.96829,41.4971],[-94.96522,41.49706],[-94.96212,41.49707],[-94.959,41.49709],[-94.95573,41.4971],[-94.95534,41.4971],[-94.95261,41.49708],[-94.95038,41.49708],[-94.94967,41.49707],[-94.94929,41.49708],[-94.94822,41.49709],[-94.94703,41.49708],[-94.94648,41.4971],[-94.9459,41.4971],[-94.94549,41.4971],[-94.94501,41.49709],[-94.94152,41.49706],[-94.94023,41.49706],[-94.9375,41.49707],[-94.93625,41.49707],[-94.93494,41.49708],[-94.93433,41.49707],[-94.93407,41.49707],[-94.93303,41.49705],[-94.93172,41.49704],[-94.93103,41.49704],[-94.92994,41.49703],[-94.9285,41.49701],[-94.92794,41.497],[-94.92751,41.497],[-94.92648,41.49704],[-94.9261,41.49706],[-94.92548,41.49706],[-94.9249,41.49706],[-94.92357,41.49704],[-94.9223,41.49702],[-94.92114,41.49699],[-94.92045,41.49702],[-94.9198,41.49703],[-94.91916,41.49704],[-94.91862,41.49705],[-94.91807,41.49702],[-94.91723,41.497],[-94.91692,41.497],[-94.91408,41.49702],[-94.91311,41.49702],[-94.91284,41.49703],[-94.91216,41.49706],[-94.91116,41.49707],[-94.91097,41.49708],[-94.91035,41.49708],[-94.91014,41.49708],[-94.90911,41.4971],[-94.90779,41.49708],[-94.90731,41.49708],[-94.90596,41.49707],[-94.90542,41.49708],[-94.90465,41.49711],[-94.90147,41.49718],[-94.90087,41.49718],[-94.89831,41.49719],[-94.89667,41.49722],[-94.89516,41.49724],[-94.89443,41.49724],[-94.89382,41.49724],[-94.8934,41.49724],[-94.89283,41.49725],[-94.89196,41.49723],[-94.89157,41.49722],[-94.89116,41.49723],[-94.89075,41.49724],[-94.89066,41.49725],[-94.89044,41.49727],[-94.89018,41.49728],[-94.88944,41.49728],[-94.88825,41.49726],[-94.88731,41.4973],[-94.8865,41.4973],[-94.88609,41.4973],[-94.88566,41.49729],[-94.88494,41.49729],[-94.88399,41.49728],[-94.88313,41.49731],[-94.88249,41.49732],[-94.88192,41.49734],[-94.88055,41.49735],[-94.88012,41.49735],[-94.87932,41.49735],[-94.87847,41.49737],[-94.87775,41.49739],[-94.87726,41.49739],[-94.87674,41.49737],[-94.87543,41.49738],[-94.875,41.49738],[-94.87333,41.49737],[-94.87266,41.49737],[-94.87196,41.49735],[-94.8712,41.49734],[-94.87043,41.49732],[-94.86893,41.4973],[-94.86837,41.49729],[-94.86651,41.49725],[-94.86597,41.49723],[-94.86201,41.49716],[-94.86164,41.49715],[-94.86034,41.49715],[-94.85934,41.49714],[-94.85907,41.49714],[-94.85737,41.49707],[-94.85612,41.49704],[-94.85423,41.497],[-94.85295,41.49699],[-94.85275,41.49699],[-94.8506,41.49698],[-94.84852,41.49697],[-94.84806,41.49698],[-94.84702,41.49697],[-94.8456,41.49697],[-94.84411,41.49699],[-94.84311,41.49699],[-94.84194,41.49699],[-94.83869,41.49697],[-94.8379,41.49697],[-94.83632,41.49697],[-94.83599,41.49697],[-94.8352,41.49698],[-94.8347,41.49697],[-94.83421,41.49697],[-94.83222,41.49699],[-94.83059,41.49696],[-94.82806,41.49697],[-94.82623,41.49698],[-94.82436,41.49698],[-94.82152,41.49696],[-94.81724,41.49694],[-94.81616,41.4969],[-94.81579,41.4969],[-94.81433,41.49689],[-94.81276,41.49686],[-94.81251,41.49684],[-94.81164,41.49684],[-94.80884,41.49673],[-94.80291,41.49662],[-94.80188,41.4966],[-94.80159,41.49659],[-94.7982,41.49649],[-94.79435,41.4964],[-94.79369,41.49639],[-94.79047,41.49631],[-94.78922,41.49631],[-94.78905,41.4963],[-94.78846,41.49626],[-94.78528,41.49616],[-94.78475,41.49614],[-94.78326,41.49614],[-94.78142,41.4962],[-94.78029,41.49627],[-94.77802,41.49635],[-94.77764,41.49637],[-94.7764,41.49645],[-94.77617,41.49647],[-94.77434,41.49654],[-94.77237,41.49661],[-94.77136,41.49669],[-94.76977,41.49675],[-94.76959,41.49676],[-94.76809,41.49685],[-94.76678,41.49687],[-94.76602,41.49689],[-94.76506,41.49692],[-94.76379,41.49695],[-94.76277,41.49693],[-94.76143,41.49692],[-94.76076,41.4969],[-94.7592,41.49686],[-94.75881,41.49686],[-94.75688,41.4968],[-94.75635,41.49678],[-94.75402,41.49676],[-94.75243,41.49673],[-94.75189,41.49671],[-94.75,41.49666],[-94.74905,41.49664],[-94.74807,41.49665],[-94.74615,41.49661],[-94.74462,41.49658],[-94.74359,41.49655],[-94.74231,41.49651],[-94.74107,41.49648],[-94.73756,41.49652],[-94.73469,41.49655],[-94.73386,41.49656],[-94.73211,41.49661],[-94.73023,41.49664],[-94.72837,41.49662],[-94.72686,41.49665],[-94.7257,41.49668],[-94.72515,41.4967],[-94.72394,41.4967],[-94.72321,41.4967],[-94.72254,41.49669],[-94.72128,41.4967],[-94.72079,41.49673],[-94.71957,41.49676],[-94.71857,41.49672],[-94.71677,41.49677],[-94.71497,41.49679],[-94.71475,41.4968],[-94.71344,41.49682],[-94.71139,41.4968],[-94.71031,41.49681],[-94.70875,41.49686],[-94.70781,41.49685],[-94.70656,41.49682],[-94.70527,41.49684],[-94.70407,41.49684],[-94.70301,41.49685],[-94.70263,41.49685],[-94.70182,41.49684],[-94.70047,41.49683],[-94.69971,41.49682],[-94.69117,41.49682],[-94.68889,41.49682],[-94.68747,41.49675],[-94.68606,41.49653],[-94.6845,41.49607],[-94.67928,41.49403],[-94.67805,41.49361],[-94.67664,41.49327],[-94.67497,41.49307],[-94.67334,41.49304],[-94.66745,41.49308],[-94.66149,41.49306],[-94.65779,41.49306],[-94.65602,41.49306],[-94.65255,41.4931],[-94.65133,41.4931],[-94.64727,41.49307],[-94.64495,41.49307],[-94.64151,41.49307],[-94.64029,41.49307],[-94.63612,41.49308],[-94.6267,41.49307],[-94.61549,41.49308],[-94.60995,41.49306],[-94.60586,41.49309],[-94.60027,41.49306],[-94.59926,41.49312],[-94.59809,41.49327],[-94.59696,41.49348],[-94.58931,41.49485],[-94.58426,41.49576],[-94.57991,41.4965],[-94.57883,41.49661],[-94.57759,41.49665],[-94.57367,41.49666],[-94.57089,41.49667],[-94.56636,41.4967],[-94.56426,41.49669],[-94.55967,41.4967],[-94.55656,41.49663],[-94.54766,41.49651],[-94.53716,41.49631],[-94.52951,41.49619],[-94.52466,41.4961],[-94.52025,41.49608],[-94.51971,41.49608],[-94.51648,41.49607],[-94.51399,41.49608],[-94.50958,41.49606],[-94.50326,41.49603],[-94.4945,41.49601],[-94.4849,41.49597],[-94.4741,41.49589],[-94.46861,41.49585],[-94.46592,41.49581],[-94.4632,41.49585],[-94.456,41.49581],[-94.45312,41.49581],[-94.45116,41.49581],[-94.44674,41.49583],[-94.44208,41.49581],[-94.43243,41.49581],[-94.42823,41.4958],[-94.42475,41.4958],[-94.41738,41.49583],[-94.41328,41.49583],[-94.40564,41.49588],[-94.40016,41.49589],[-94.39394,41.4959],[-94.38296,41.49595],[-94.37435,41.49595],[-94.37082,41.49597],[-94.36955,41.49589],[-94.36825,41.49568],[-94.36699,41.49534],[-94.36572,41.49488],[-94.36216,41.49364],[-94.36109,41.49333],[-94.35996,41.4931],[-94.35884,41.49297],[-94.35768,41.49295],[-94.35294,41.49295],[-94.34196,41.49295],[-94.33647,41.49292],[-94.3303,41.49291],[-94.32324,41.49291],[-94.31372,41.49291],[-94.30727,41.49289],[-94.3,41.49287],[-94.29323,41.4929],[-94.28551,41.49291],[-94.27847,41.49295],[-94.27015,41.49295],[-94.26205,41.49296],[-94.25856,41.493],[-94.2536,41.493],[-94.25148,41.49302],[-94.24915,41.49307],[-94.24609,41.49317],[-94.24125,41.49333],[-94.24006,41.49337],[-94.23681,41.49346],[-94.23047,41.4937],[-94.22564,41.49385],[-94.22411,41.49394],[-94.2234,41.49403],[-94.22295,41.49411],[-94.22225,41.49427],[-94.22176,41.49441],[-94.22129,41.49456],[-94.22034,41.49493],[-94.21977,41.4952],[-94.21923,41.49547],[-94.21885,41.49572],[-94.21826,41.4961],[-94.21739,41.49676],[-94.21525,41.49844],[-94.21228,41.5008],[-94.21011,41.50249],[-94.20812,41.50409],[-94.20661,41.5053],[-94.202,41.50885],[-94.19966,41.51069],[-94.19628,41.51336],[-94.19368,41.51543],[-94.19336,41.51568],[-94.19277,41.51607],[-94.1918,41.5166],[-94.19143,41.51677],[-94.1904,41.51716],[-94.18965,41.51737],[-94.1885,41.51762],[-94.18655,41.51776],[-94.18616,41.51776],[-94.18542,41.51776],[-94.18019,41.51776],[-94.17719,41.51777],[-94.17344,41.51776],[-94.17194,41.51775],[-94.1693,41.51774],[-94.16816,41.51774],[-94.16703,41.51773],[-94.1659,41.51773],[-94.16365,41.51772],[-94.15537,41.51768],[-94.15423,41.51767],[-94.15234,41.51765],[-94.15083,41.51764],[-94.14444,41.51763],[-94.1422,41.51764],[-94.14108,41.51761],[-94.14034,41.5176],[-94.13885,41.51758],[-94.13772,41.51758],[-94.13698,41.51757],[-94.13585,41.51757],[-94.12908,41.51753],[-94.12756,41.51752],[-94.12718,41.51752],[-94.12373,41.51751],[-94.12307,41.5175],[-94.12271,41.5175],[-94.12159,41.5175],[-94.11972,41.5175],[-94.11861,41.51749],[-94.11749,41.51749],[-94.1169,41.51749],[-94.11562,41.51748],[-94.11112,41.51746],[-94.10209,41.51745],[-94.10059,41.51745],[-94.09909,41.51745],[-94.09422,41.51744],[-94.09346,41.51744],[-94.09158,41.51754],[-94.09009,41.51775],[-94.08972,41.51781],[-94.08899,41.51793],[-94.08643,41.51832],[-94.08496,41.51854],[-94.08349,41.51877],[-94.08202,41.51899],[-94.08165,41.51905],[-94.081,41.51915],[-94.07907,41.51945],[-94.07214,41.52052],[-94.07134,41.52064],[-94.06733,41.52138],[-94.06664,41.5216],[-94.06433,41.52256],[-94.064,41.5227],[-94.06169,41.52368],[-94.06004,41.52438],[-94.05873,41.52494],[-94.05548,41.52631],[-94.05451,41.52673],[-94.05024,41.52854],[-94.04664,41.53008],[-94.03945,41.53315],[-94.03387,41.53553],[-94.03255,41.53609],[-94.03157,41.5365],[-94.02792,41.53793],[-94.02579,41.53849],[-94.02286,41.53898],[-94.01915,41.53939],[-94.01835,41.53947],[-94.01319,41.54004],[-94.01221,41.54015],[-94.00875,41.54053],[-94.00578,41.54085],[-94.00391,41.54106],[-94.00019,41.54147],[-93.99908,41.5416],[-93.99162,41.5424],[-93.99087,41.54249],[-93.98901,41.5427],[-93.98864,41.54274],[-93.98678,41.54294],[-93.98603,41.54302],[-93.98566,41.54306],[-93.98528,41.5431],[-93.98336,41.54331],[-93.98232,41.54342],[-93.98048,41.54362],[-93.979,41.54379],[-93.97788,41.54391],[-93.97602,41.54411],[-93.97339,41.5444],[-93.97189,41.54456],[-93.9704,41.54473],[-93.9681,41.54498],[-93.96623,41.54519],[-93.96224,41.54573],[-93.96034,41.54618],[-93.95867,41.54657],[-93.95726,41.54692],[-93.95584,41.54727],[-93.95442,41.54762],[-93.95406,41.54771],[-93.95264,41.54807],[-93.95122,41.54842],[-93.94981,41.54877],[-93.94874,41.54904],[-93.94732,41.54939],[-93.94625,41.54966],[-93.94554,41.54982],[-93.94081,41.55078],[-93.93936,41.55107],[-93.93499,41.55197],[-93.93158,41.55265],[-93.92893,41.55316],[-93.92819,41.55329],[-93.92769,41.55339],[-93.92677,41.55356],[-93.92606,41.55371],[-93.92498,41.55392],[-93.92281,41.55435],[-93.9185,41.55521],[-93.91778,41.55535],[-93.9149,41.55592],[-93.91237,41.55642],[-93.90949,41.557],[-93.90806,41.55728],[-93.90519,41.55785],[-93.89832,41.55923],[-93.89508,41.55988],[-93.89004,41.56086],[-93.88617,41.56162],[-93.88322,41.56221],[-93.88286,41.56228],[-93.87814,41.5631],[-93.87557,41.56347],[-93.87447,41.56363],[-93.87301,41.56385],[-93.87117,41.56412],[-93.87081,41.56417],[-93.86862,41.56449],[-93.86642,41.56482],[-93.86423,41.56514],[-93.86097,41.56572],[-93.86072,41.5658],[-93.8596,41.56615],[-93.85862,41.56653],[-93.8583,41.56667],[-93.85737,41.56713],[-93.85556,41.56809],[-93.85433,41.56871],[-93.85371,41.56901],[-93.851,41.57045],[-93.84964,41.57114],[-93.84808,41.57192],[-93.84656,41.57267],[-93.84121,41.57549],[-93.83766,41.57729],[-93.83257,41.57986],[-93.82748,41.5825],[-93.82467,41.58392],[-93.82179,41.5854],[-93.81896,41.5869],[-93.81841,41.58717],[-93.81657,41.5881],[-93.81496,41.58893],[-93.81176,41.59057],[-93.81119,41.59086],[-93.81076,41.59104],[-93.81036,41.5912],[-93.80998,41.59133],[-93.80947,41.59149],[-93.80878,41.59168],[-93.80836,41.59176],[-93.80789,41.59184],[-93.80734,41.59192],[-93.80678,41.59197],[-93.80619,41.59201],[-93.80572,41.59202],[-93.80442,41.59203],[-93.80275,41.59204],[-93.80191,41.59202],[-93.79807,41.59206],[-93.79747,41.59206],[-93.79073,41.59207],[-93.78661,41.59207],[-93.78615,41.59208],[-93.78439,41.59209],[-93.77912,41.5921],[-93.77813,41.59209],[-93.77778,41.59209],[-93.77674,41.5921],[-93.77528,41.59212],[-93.76835,41.59214],[-93.76357,41.59215],[-93.76099,41.59215],[-93.75918,41.59215],[-93.7538,41.59217],[-93.75208,41.59217],[-93.75121,41.59218],[-93.74634,41.59218],[-93.74526,41.59221],[-93.74419,41.5922],[-93.74365,41.59221],[-93.74312,41.59223],[-93.74266,41.59227],[-93.74238,41.59229],[-93.73889,41.59257],[-93.73645,41.59275],[-93.73576,41.59281],[-93.73484,41.59288],[-93.73389,41.59295],[-93.73267,41.59305],[-93.73158,41.59314],[-93.7303,41.59323],[-93.72967,41.59327],[-93.72895,41.59328],[-93.72839,41.59329],[-93.72758,41.59328],[-93.72701,41.59328],[-93.7244,41.59328],[-93.72299,41.59327],[-93.72261,41.59329],[-93.72129,41.59328],[-93.71825,41.59326],[-93.71566,41.59327],[-93.71445,41.59328],[-93.71353,41.59329],[-93.7123,41.59328],[-93.711,41.59324],[-93.71052,41.59325],[-93.70955,41.59322],[-93.70805,41.59322],[-93.70728,41.5932],[-93.70654,41.59316],[-93.70356,41.59301],[-93.69995,41.59282],[-93.69942,41.5928],[-93.69908,41.59278],[-93.69837,41.59274],[-93.69729,41.59267],[-93.69446,41.59253],[-93.69441,41.59252],[-93.69266,41.59243],[-93.6906,41.59231],[-93.68832,41.5922],[-93.68774,41.59218],[-93.68349,41.59195],[-93.68197,41.59173],[-93.67986,41.59134],[-93.67982,41.59133],[-93.6797,41.59131],[-93.67949,41.59128],[-93.67892,41.59122],[-93.67881,41.5912],[-93.67792,41.59122],[-93.6753,41.59121],[-93.67443,41.59121],[-93.67381,41.59123],[-93.67359,41.59125],[-93.67329,41.5913],[-93.67298,41.59136],[-93.67269,41.59144],[-93.67229,41.59157],[-93.67129,41.59192],[-93.67014,41.5924],[-93.66957,41.59263],[-93.66947,41.59267],[-93.66897,41.59282],[-93.66834,41.59296],[-93.66795,41.59302],[-93.66721,41.59308],[-93.66663,41.59309],[-93.66557,41.59308],[-93.6645,41.59307],[-93.66388,41.59306],[-93.65917,41.593],[-93.65719,41.593],[-93.65591,41.59303],[-93.65483,41.59306],[-93.65466,41.59309],[-93.65423,41.59316],[-93.65365,41.59328],[-93.65279,41.59349],[-93.65204,41.59372],[-93.65092,41.59414],[-93.65024,41.5944],[-93.6484,41.59508],[-93.64813,41.59516],[-93.64756,41.59534],[-93.64668,41.59554],[-93.64598,41.59564],[-93.64558,41.59569],[-93.64482,41.59575],[-93.64399,41.59577],[-93.64238,41.59579],[-93.64215,41.59579],[-93.64132,41.5958],[-93.63689,41.59588],[-93.63585,41.59589],[-93.63495,41.59592],[-93.63411,41.59591],[-93.63167,41.59584],[-93.63056,41.59578],[-93.62952,41.59572],[-93.62708,41.59568],[-93.62542,41.59568],[-93.62428,41.59568],[-93.6225,41.59568],[-93.6206,41.59565],[-93.61961,41.59562],[-93.61907,41.59558],[-93.61856,41.59554],[-93.61757,41.59551],[-93.617,41.59548],[-93.61631,41.59541],[-93.61543,41.59536],[-93.61382,41.59531],[-93.61262,41.59522],[-93.61198,41.59519],[-93.61167,41.59517],[-93.60855,41.59502],[-93.60847,41.59502],[-93.60836,41.59501],[-93.60645,41.5949],[-93.60592,41.59487],[-93.6055,41.59485],[-93.60443,41.5949],[-93.60376,41.59498],[-93.60303,41.5951],[-93.60263,41.59518],[-93.60074,41.59557],[-93.5987,41.59599],[-93.59664,41.59639],[-93.59657,41.59641],[-93.59596,41.59654],[-93.59525,41.59668],[-93.59433,41.59689],[-93.59379,41.59703],[-93.59324,41.59719],[-93.59147,41.59787],[-93.58981,41.59857],[-93.58616,41.60015],[-93.58472,41.60074],[-93.5842,41.60097],[-93.58319,41.60141],[-93.58227,41.60186],[-93.58196,41.60204],[-93.58166,41.60222],[-93.58154,41.60232],[-93.58096,41.60273],[-93.5807,41.60296],[-93.58045,41.6032],[-93.58021,41.60345],[-93.57987,41.60386],[-93.57974,41.60404],[-93.57948,41.60444],[-93.57923,41.60494],[-93.57909,41.60527],[-93.57891,41.6058],[-93.57885,41.60612],[-93.57881,41.60633],[-93.57877,41.60661],[-93.57875,41.60688],[-93.57873,41.60804],[-93.57871,41.60902],[-93.57872,41.60982],[-93.57869,41.6107],[-93.57863,41.61119],[-93.57814,41.61301],[-93.57746,41.61474],[-93.57726,41.61522],[-93.57715,41.61551],[-93.57688,41.61622],[-93.57669,41.61705],[-93.57641,41.61886],[-93.57635,41.61922],[-93.57614,41.62065],[-93.57593,41.62191],[-93.57584,41.62254],[-93.5756,41.62401],[-93.57518,41.62667],[-93.57501,41.62752],[-93.57493,41.62816],[-93.57491,41.62831],[-93.57487,41.62877],[-93.57488,41.62969],[-93.57505,41.63113],[-93.5751,41.63201],[-93.57539,41.63422],[-93.57552,41.63538],[-93.57555,41.63602],[-93.57557,41.6368],[-93.57558,41.63694],[-93.57558,41.63697],[-93.57557,41.63873],[-93.57557,41.64388],[-93.57557,41.64429],[-93.57557,41.64477],[-93.57553,41.64592],[-93.57542,41.64693],[-93.57537,41.64753],[-93.57527,41.6481],[-93.57518,41.64843],[-93.57499,41.6489],[-93.57481,41.64924],[-93.57461,41.64955],[-93.57418,41.65001],[-93.57337,41.65076],[-93.57277,41.65125],[-93.57209,41.65174],[-93.5715,41.65211],[-93.57108,41.65234],[-93.57082,41.65246],[-93.57059,41.65254],[-93.56999,41.65276],[-93.56954,41.65288],[-93.56925,41.65293],[-93.5687,41.65304],[-93.56129,41.65412],[-93.56022,41.65428],[-93.5553,41.65501],[-93.54733,41.65617],[-93.54628,41.65633],[-93.54546,41.65646],[-93.53507,41.65798],[-93.53374,41.65818],[-93.53107,41.65859],[-93.52946,41.65882],[-93.52241,41.65983],[-93.5145,41.661],[-93.51362,41.66113],[-93.50966,41.6617],[-93.50899,41.66177],[-93.50823,41.66184],[-93.5075,41.66189],[-93.50676,41.66193],[-93.50606,41.66194],[-93.50543,41.66195],[-93.5009,41.66191],[-93.49513,41.66182],[-93.49416,41.66181],[-93.48773,41.66171],[-93.48728,41.6617],[-93.48557,41.66168],[-93.48398,41.6617],[-93.4836,41.66174],[-93.48352,41.66175],[-93.48239,41.66185],[-93.48061,41.66216],[-93.48025,41.66224],[-93.47931,41.66248],[-93.47853,41.66271],[-93.47479,41.66394],[-93.47255,41.66467],[-93.46886,41.66588],[-93.46598,41.66681],[-93.46503,41.66711],[-93.46388,41.6675],[-93.46092,41.66845],[-93.45922,41.66899],[-93.45707,41.66954],[-93.45401,41.67017],[-93.45247,41.67042],[-93.44892,41.67099],[-93.43885,41.67261],[-93.4371,41.6729],[-93.43641,41.67302],[-93.43499,41.67328],[-93.43338,41.6736],[-93.43251,41.67379],[-93.42957,41.67442],[-93.42582,41.67524],[-93.42012,41.67648],[-93.41275,41.67806],[-93.40641,41.67943],[-93.40523,41.67969],[-93.4044,41.67987],[-93.40394,41.67996],[-93.40338,41.68005],[-93.40293,41.68012],[-93.40183,41.68025],[-93.40132,41.6803],[-93.40092,41.68032],[-93.4,41.68038],[-93.39933,41.68038],[-93.39818,41.68039],[-93.39668,41.68038],[-93.39125,41.68036],[-93.39005,41.68035],[-93.38711,41.68034],[-93.38692,41.68034],[-93.38201,41.68032],[-93.3779,41.6803],[-93.37484,41.68027],[-93.374,41.68027],[-93.37164,41.68026],[-93.36915,41.68025],[-93.36813,41.68025],[-93.36695,41.68027],[-93.35919,41.68048],[-93.34873,41.68073],[-93.34814,41.68074],[-93.34576,41.68083],[-93.34104,41.68094],[-93.33704,41.68104],[-93.33269,41.68114],[-93.32732,41.68128],[-93.32171,41.68141],[-93.31706,41.68153],[-93.31155,41.68167],[-93.30306,41.68186],[-93.30038,41.68194],[-93.29913,41.68206],[-93.29766,41.68229],[-93.29632,41.68259],[-93.29487,41.68301],[-93.29375,41.68339],[-93.29243,41.68379],[-93.29096,41.6842],[-93.28995,41.68445],[-93.28896,41.68466],[-93.28761,41.68488],[-93.28621,41.68503],[-93.28424,41.68519],[-93.28106,41.68543],[-93.27902,41.68561],[-93.27661,41.68582],[-93.27562,41.68595],[-93.27466,41.68611],[-93.27317,41.68641],[-93.27137,41.68679],[-93.26757,41.68759],[-93.26048,41.68907],[-93.2543,41.69036],[-93.24837,41.69165],[-93.24401,41.69257],[-93.2421,41.69295],[-93.23776,41.69386],[-93.23594,41.69429],[-93.23473,41.69454],[-93.2341,41.69467],[-93.23253,41.69501],[-93.23055,41.69542],[-93.22935,41.69567],[-93.22775,41.69599],[-93.22532,41.69651],[-93.22229,41.69715],[-93.21931,41.69777],[-93.21745,41.69816],[-93.21704,41.69824],[-93.21644,41.69837],[-93.21463,41.69876],[-93.21199,41.69931],[-93.21092,41.69948],[-93.21034,41.69955],[-93.20948,41.69964],[-93.20851,41.69969],[-93.20773,41.6997],[-93.20692,41.69968],[-93.20586,41.69961],[-93.20441,41.69944],[-93.20366,41.69931],[-93.20273,41.69911],[-93.202,41.69893],[-93.20114,41.69867],[-93.2006,41.69848],[-93.19864,41.69772],[-93.1976,41.69732],[-93.19683,41.69704],[-93.19462,41.69619],[-93.19361,41.69579],[-93.19255,41.69538],[-93.18975,41.6943],[-93.18531,41.6926],[-93.18435,41.69222],[-93.1839,41.69204],[-93.18384,41.69202],[-93.1809,41.69088],[-93.17919,41.69022],[-93.17885,41.6901],[-93.17735,41.68951],[-93.1766,41.68922],[-93.1755,41.68879],[-93.17437,41.68835],[-93.17191,41.6874],[-93.17086,41.68699],[-93.16964,41.68656],[-93.16936,41.68647],[-93.16874,41.6863],[-93.16829,41.68617],[-93.16744,41.68596],[-93.16632,41.68573],[-93.16474,41.6855],[-93.15837,41.68466],[-93.15782,41.68457],[-93.15704,41.68442],[-93.1566,41.68435],[-93.15457,41.68412],[-93.1535,41.68402],[-93.15274,41.68397],[-93.15111,41.6839],[-93.15088,41.68389],[-93.15063,41.68388],[-93.15007,41.68382],[-93.14908,41.68369],[-93.1482,41.68362],[-93.14692,41.68353],[-93.14632,41.68349],[-93.14565,41.68341],[-93.14504,41.68336],[-93.14434,41.68332],[-93.14361,41.68325],[-93.14313,41.6832],[-93.14194,41.68308],[-93.14136,41.68303],[-93.14071,41.68297],[-93.13968,41.6829],[-93.13945,41.68289],[-93.13822,41.68282],[-93.13741,41.68276],[-93.13648,41.68268],[-93.13448,41.68247],[-93.13264,41.6823],[-93.13055,41.68217],[-93.12917,41.68204],[-93.12782,41.68195],[-93.12677,41.68186],[-93.12636,41.68183],[-93.12461,41.68167],[-93.12181,41.68146],[-93.1211,41.68144],[-93.12004,41.68139],[-93.11715,41.68129],[-93.11701,41.68129],[-93.11529,41.68125],[-93.1145,41.68123],[-93.11144,41.68114],[-93.1086,41.68107],[-93.10665,41.681],[-93.10261,41.68088],[-93.10078,41.68084],[-93.1001,41.68081],[-93.09858,41.68076],[-93.09736,41.68076],[-93.09607,41.68083],[-93.09471,41.68095],[-93.09415,41.68103],[-93.09189,41.68139],[-93.08581,41.68227],[-93.08524,41.68236],[-93.0845,41.68247],[-93.08361,41.68258],[-93.08131,41.68289],[-93.07939,41.68311],[-93.07792,41.68328],[-93.07702,41.68338],[-93.07667,41.68342],[-93.07595,41.6835],[-93.07474,41.68363],[-93.07396,41.68365],[-93.07227,41.68368],[-93.07148,41.68368],[-93.06981,41.68368],[-93.06541,41.68368],[-93.05909,41.68366],[-93.05838,41.68365],[-93.05751,41.68365],[-93.05488,41.68365],[-93.05254,41.68364],[-93.05157,41.68364],[-93.05126,41.68364],[-93.05101,41.68364],[-93.05021,41.68363],[-93.04928,41.68359],[-93.04892,41.68358],[-93.04835,41.68356],[-93.04747,41.68351],[-93.04506,41.6834],[-93.04458,41.68337],[-93.04383,41.68334],[-93.04234,41.68327],[-93.04038,41.68318],[-93.04007,41.68317],[-93.03922,41.68313],[-93.03874,41.68311],[-93.03827,41.68309],[-93.03673,41.68302],[-93.03507,41.68294],[-93.0344,41.68291],[-93.03374,41.6829],[-93.03342,41.6829],[-93.03213,41.68289],[-93.02618,41.68288],[-93.02397,41.68287],[-93.02076,41.68288],[-93.0181,41.68286],[-93.01606,41.68285],[-93.01499,41.68286],[-93.01407,41.68288],[-93.01372,41.68288],[-93.01313,41.68288],[-93.01287,41.68288],[-93.01212,41.68287],[-93.01108,41.68286],[-93.00966,41.68283],[-93.00878,41.68281],[-93.00796,41.68278],[-93.00754,41.68276],[-93.00711,41.68274],[-93.00585,41.68269],[-93.00396,41.68263],[-93.00019,41.68247],[-92.99955,41.68246],[-92.99783,41.68239],[-92.99531,41.68229],[-92.99367,41.68221],[-92.99318,41.68219],[-92.99188,41.68215],[-92.98591,41.68191],[-92.98481,41.68186],[-92.98339,41.68181],[-92.98269,41.68178],[-92.98048,41.68169],[-92.97803,41.68159],[-92.97605,41.68153],[-92.97536,41.6815],[-92.97176,41.68135],[-92.97094,41.68131],[-92.96877,41.68124],[-92.96645,41.68113],[-92.96435,41.68101],[-92.9624,41.68091],[-92.96096,41.68084],[-92.95942,41.68075],[-92.9586,41.6807],[-92.95722,41.68062],[-92.95634,41.68057],[-92.95469,41.68049],[-92.95361,41.68043],[-92.95215,41.68035],[-92.95144,41.68031],[-92.94922,41.68019],[-92.94702,41.68007],[-92.94458,41.67993],[-92.94279,41.67985],[-92.94245,41.67983],[-92.9416,41.67984],[-92.94097,41.67986],[-92.9407,41.67987],[-92.9397,41.67991],[-92.939,41.67998],[-92.93839,41.68002],[-92.93373,41.68034],[-92.93299,41.68038],[-92.92992,41.6806],[-92.92482,41.68093],[-92.92304,41.68106],[-92.91976,41.68127],[-92.91838,41.68137],[-92.91742,41.68143],[-92.91594,41.68154],[-92.91508,41.6816],[-92.9125,41.68176],[-92.91131,41.68185],[-92.91014,41.68193],[-92.90567,41.68223],[-92.90367,41.68234],[-92.90321,41.68238],[-92.9026,41.68241],[-92.90221,41.68243],[-92.90081,41.68257],[-92.89912,41.68266],[-92.89619,41.68287],[-92.89584,41.68288],[-92.89426,41.68303],[-92.8934,41.68313],[-92.89313,41.68317],[-92.8927,41.68327],[-92.89183,41.68347],[-92.89101,41.6837],[-92.88962,41.68419],[-92.88856,41.68458],[-92.88791,41.68481],[-92.88682,41.68521],[-92.88567,41.68561],[-92.88495,41.68587],[-92.88382,41.68625],[-92.88347,41.68638],[-92.88286,41.6866],[-92.88253,41.68673],[-92.88101,41.68727],[-92.88032,41.68751],[-92.87929,41.68789],[-92.87845,41.68819],[-92.87536,41.6893],[-92.87342,41.68999],[-92.86923,41.69149],[-92.86782,41.69197],[-92.86497,41.69303],[-92.86408,41.69335],[-92.86289,41.69376],[-92.8615,41.69426],[-92.86065,41.69452],[-92.86013,41.69466],[-92.85962,41.69476],[-92.85923,41.69481],[-92.85852,41.6949],[-92.85816,41.69492],[-92.85795,41.69494],[-92.85719,41.69496],[-92.85577,41.69496],[-92.85471,41.69498],[-92.85283,41.69499],[-92.851,41.69498],[-92.8493,41.69501],[-92.84808,41.69502],[-92.84656,41.695],[-92.84472,41.695],[-92.84451,41.695],[-92.84441,41.69499],[-92.84417,41.69498],[-92.84396,41.69499],[-92.84341,41.69502],[-92.84249,41.69502],[-92.84134,41.69501],[-92.83957,41.69504],[-92.83766,41.69506],[-92.83467,41.69507],[-92.83278,41.69508],[-92.83138,41.69506],[-92.83023,41.69508],[-92.82933,41.69508],[-92.82865,41.6951],[-92.82626,41.6951],[-92.82556,41.69512],[-92.8248,41.69511],[-92.82409,41.69509],[-92.82342,41.69508],[-92.82277,41.69509],[-92.82153,41.69511],[-92.82034,41.69511],[-92.81949,41.69512],[-92.81898,41.69511],[-92.81627,41.69515],[-92.81494,41.69515],[-92.81406,41.69516],[-92.81302,41.69515],[-92.81225,41.69515],[-92.81207,41.69515],[-92.81079,41.69515],[-92.8099,41.69517],[-92.80676,41.6952],[-92.80549,41.6952],[-92.80515,41.6952],[-92.80386,41.69518],[-92.80324,41.69519],[-92.80313,41.69519],[-92.80082,41.69522],[-92.79844,41.69522],[-92.79649,41.69523],[-92.79394,41.69524],[-92.79151,41.69526],[-92.78985,41.69525],[-92.78763,41.69524],[-92.78485,41.69526],[-92.78217,41.69526],[-92.78179,41.69527],[-92.78071,41.69529],[-92.78043,41.69529],[-92.77659,41.6953],[-92.77413,41.6953],[-92.77267,41.69531],[-92.76848,41.69534],[-92.76571,41.69532],[-92.76368,41.69529],[-92.76252,41.69526],[-92.76224,41.69526],[-92.76156,41.69525],[-92.76091,41.69525],[-92.75715,41.6952],[-92.75333,41.69515],[-92.75251,41.69512],[-92.74989,41.69509],[-92.74941,41.69507],[-92.7487,41.69506],[-92.74763,41.69506],[-92.74705,41.69507],[-92.74646,41.69508],[-92.74537,41.69513],[-92.74298,41.69526],[-92.74091,41.69539],[-92.73672,41.69564],[-92.73441,41.69579],[-92.73134,41.69597],[-92.72913,41.69609],[-92.7284,41.69612],[-92.72794,41.69614],[-92.7274,41.69615],[-92.7268,41.69615],[-92.7262,41.69613],[-92.72566,41.69611],[-92.72198,41.69586],[-92.72131,41.69582],[-92.72102,41.6958],[-92.72076,41.69579],[-92.71928,41.69569],[-92.7192,41.69568],[-92.71884,41.69566],[-92.70965,41.69506],[-92.70828,41.695],[-92.70778,41.69499],[-92.70682,41.69497],[-92.7005,41.69512],[-92.69891,41.69516],[-92.69458,41.69527],[-92.69321,41.69528],[-92.69172,41.69529],[-92.69044,41.69529],[-92.68823,41.69529],[-92.68567,41.69534],[-92.67631,41.69541],[-92.67159,41.69545],[-92.6693,41.69548],[-92.66906,41.69548],[-92.6655,41.69551],[-92.66495,41.69552],[-92.6571,41.69562],[-92.65015,41.6957],[-92.64965,41.69571],[-92.64672,41.69571],[-92.64612,41.69571],[-92.64562,41.69571],[-92.64432,41.69572],[-92.64196,41.69572],[-92.63976,41.69572],[-92.63058,41.69574],[-92.62927,41.69575],[-92.62426,41.69571],[-92.62239,41.69571],[-92.61919,41.69569],[-92.61908,41.69569],[-92.61643,41.69568],[-92.59797,41.69571],[-92.59605,41.69571],[-92.59195,41.69572],[-92.58266,41.69572],[-92.58134,41.69572],[-92.57989,41.69574],[-92.57844,41.69578],[-92.57188,41.69607],[-92.56321,41.69646],[-92.5614,41.6965],[-92.56128,41.6965],[-92.55967,41.69651],[-92.55911,41.6965],[-92.55283,41.69642],[-92.55185,41.69641],[-92.54574,41.69635],[-92.54378,41.69633],[-92.54335,41.69633],[-92.54076,41.69631],[-92.53799,41.69628],[-92.53507,41.69625],[-92.53335,41.69622],[-92.53302,41.69622],[-92.53269,41.69621],[-92.53259,41.69621],[-92.5319,41.69619],[-92.52823,41.69596],[-92.52344,41.69564],[-92.51157,41.69488],[-92.50813,41.69465],[-92.5067,41.69457],[-92.50598,41.69453],[-92.5057,41.69452],[-92.50491,41.6945],[-92.50333,41.69449],[-92.4994,41.69454],[-92.49717,41.69457],[-92.49264,41.69462],[-92.4903,41.69465],[-92.48818,41.69468],[-92.48577,41.6947],[-92.48255,41.69475],[-92.48158,41.69476],[-92.47687,41.6948],[-92.47453,41.69483],[-92.47422,41.69484],[-92.47342,41.69486],[-92.4692,41.6949],[-92.45635,41.69506],[-92.45575,41.69507],[-92.4552,41.69509],[-92.45464,41.69511],[-92.45409,41.69515],[-92.45353,41.69518],[-92.45298,41.69523],[-92.45258,41.69526],[-92.45042,41.69542],[-92.44771,41.69562],[-92.44552,41.6958],[-92.44496,41.69584],[-92.44398,41.69591],[-92.44346,41.69594],[-92.44276,41.69597],[-92.44213,41.69599],[-92.4415,41.696],[-92.44093,41.696],[-92.43866,41.69601],[-92.43741,41.69602],[-92.43656,41.69602],[-92.41962,41.69606],[-92.41922,41.69606],[-92.41785,41.69606],[-92.41633,41.69608],[-92.41551,41.69607],[-92.41377,41.69608],[-92.4123,41.69607],[-92.40593,41.69608],[-92.40429,41.69608],[-92.40209,41.69608],[-92.39948,41.69608],[-92.39684,41.69607],[-92.39447,41.69607],[-92.39298,41.69605],[-92.38753,41.69593],[-92.38657,41.69591],[-92.37895,41.69573],[-92.37513,41.69566],[-92.37368,41.69562],[-92.37186,41.69559],[-92.37045,41.69557],[-92.36921,41.69556],[-92.3679,41.69555],[-92.36092,41.69552],[-92.35812,41.69549],[-92.35733,41.69548],[-92.3569,41.69549],[-92.35597,41.6955],[-92.35318,41.69549],[-92.35082,41.69547],[-92.34766,41.69545],[-92.34544,41.69545],[-92.34168,41.69544],[-92.33858,41.69541],[-92.33531,41.69542],[-92.33325,41.69543],[-92.33212,41.69544],[-92.32821,41.69549],[-92.3277,41.69549],[-92.32415,41.69551],[-92.32256,41.69553],[-92.31937,41.69556],[-92.31297,41.6956],[-92.30652,41.69566],[-92.30568,41.69566],[-92.30334,41.69567],[-92.3005,41.69568],[-92.29979,41.69568],[-92.29635,41.69573],[-92.29458,41.69576],[-92.29291,41.69578],[-92.29166,41.6958],[-92.29019,41.69582],[-92.28716,41.69587],[-92.28499,41.6959],[-92.28315,41.69592],[-92.28053,41.69595],[-92.27983,41.69596],[-92.27935,41.69597],[-92.27797,41.696],[-92.2764,41.69602],[-92.27173,41.69608],[-92.26991,41.6961],[-92.2625,41.69621],[-92.26173,41.69621],[-92.26102,41.69622],[-92.26029,41.69621],[-92.25946,41.69621],[-92.25846,41.69618],[-92.25533,41.69609],[-92.25415,41.69604],[-92.25076,41.69595],[-92.25,41.69592],[-92.24915,41.69591],[-92.24396,41.69573],[-92.24216,41.69568],[-92.24048,41.69566],[-92.23986,41.69565],[-92.23895,41.69566],[-92.23677,41.69566],[-92.23284,41.69569],[-92.23133,41.69569],[-92.22789,41.69571],[-92.22424,41.69573],[-92.22192,41.69574],[-92.2201,41.69576],[-92.21791,41.69576],[-92.21535,41.69578],[-92.21413,41.69578],[-92.2088,41.69581],[-92.20585,41.69584],[-92.20346,41.69586],[-92.19895,41.69593],[-92.19543,41.69596],[-92.19342,41.696],[-92.19125,41.69603],[-92.18951,41.69603],[-92.18314,41.6961],[-92.18233,41.69611],[-92.18109,41.6961],[-92.17793,41.69604],[-92.17345,41.69601],[-92.16913,41.69596],[-92.16569,41.69592],[-92.16278,41.69589],[-92.16232,41.69589],[-92.16072,41.69587],[-92.15855,41.69585],[-92.15539,41.69582],[-92.15424,41.69579],[-92.15323,41.69578],[-92.14959,41.69575],[-92.14779,41.69573],[-92.14693,41.69572],[-92.14604,41.6957],[-92.14563,41.69568],[-92.14526,41.69566],[-92.14495,41.69565],[-92.14444,41.69561],[-92.1433,41.69551],[-92.13962,41.69519],[-92.13851,41.69508],[-92.13813,41.69505],[-92.13731,41.69498],[-92.1361,41.69489],[-92.13522,41.6948],[-92.1338,41.69467],[-92.13289,41.69459],[-92.13205,41.69452],[-92.13084,41.69441],[-92.12969,41.69431],[-92.12866,41.69422],[-92.12751,41.69412],[-92.12613,41.694],[-92.12513,41.69392],[-92.12472,41.69388],[-92.12292,41.69372],[-92.1217,41.69361],[-92.12095,41.69354],[-92.11968,41.69343],[-92.11898,41.69337],[-92.11793,41.69327],[-92.11677,41.69317],[-92.11636,41.69314],[-92.11537,41.69305],[-92.11337,41.69287],[-92.11276,41.69281],[-92.11202,41.69275],[-92.11107,41.69266],[-92.11016,41.69259],[-92.10929,41.6925],[-92.10871,41.69245],[-92.10795,41.69239],[-92.10485,41.69212],[-92.10166,41.69183],[-92.10038,41.69172],[-92.09901,41.6916],[-92.09769,41.69148],[-92.09526,41.69126],[-92.09278,41.69104],[-92.09065,41.69086],[-92.08954,41.69076],[-92.08802,41.69062],[-92.0857,41.69042],[-92.08512,41.69037],[-92.08434,41.6903],[-92.08364,41.69023],[-92.08155,41.69005],[-92.07726,41.68966],[-92.07589,41.68954],[-92.07508,41.68947],[-92.07272,41.68926],[-92.07043,41.68906],[-92.06747,41.68879],[-92.06336,41.68842],[-92.06279,41.68838],[-92.06223,41.68833],[-92.06118,41.68824],[-92.0599,41.68813],[-92.05828,41.68798],[-92.0571,41.68787],[-92.05594,41.68777],[-92.05458,41.68765],[-92.05419,41.68761],[-92.05257,41.68747],[-92.05095,41.68733],[-92.05,41.68724],[-92.04903,41.68717],[-92.04836,41.68714],[-92.04767,41.68711],[-92.04626,41.6871],[-92.03809,41.68708],[-92.03417,41.68707],[-92.03018,41.68706],[-92.02625,41.68705],[-92.02275,41.68704],[-92.02233,41.68704],[-92.02094,41.68704],[-92.01847,41.68703],[-92.01719,41.68703],[-92.01601,41.68702],[-92.0157,41.68702],[-92.01089,41.68701],[-92.00899,41.68701],[-92.00862,41.68701],[-92.00774,41.68701],[-92.00664,41.687],[-92.00436,41.68699],[-92.00211,41.68699],[-91.99975,41.68698],[-91.99735,41.68698],[-91.99688,41.68697],[-91.99478,41.68696],[-91.99215,41.68695],[-91.99077,41.68695],[-91.98939,41.68695],[-91.98812,41.68695],[-91.98317,41.68693],[-91.98036,41.68692],[-91.97829,41.68692],[-91.97644,41.68691],[-91.97018,41.68689],[-91.96802,41.68689],[-91.9621,41.68687],[-91.95948,41.68686],[-91.95693,41.68686],[-91.95616,41.68688],[-91.95533,41.6869],[-91.95266,41.68705],[-91.9498,41.68723],[-91.94728,41.68737],[-91.94479,41.68752],[-91.94324,41.68762],[-91.94057,41.68777],[-91.93986,41.68782],[-91.93897,41.68785],[-91.93829,41.68787],[-91.93748,41.68788],[-91.93543,41.68785],[-91.93293,41.68782],[-91.93046,41.68779],[-91.9257,41.68773],[-91.92028,41.68766],[-91.91816,41.68763],[-91.91537,41.6876],[-91.9128,41.68757],[-91.91215,41.68755],[-91.91009,41.68753],[-91.90702,41.68749],[-91.90391,41.68745],[-91.90347,41.68745],[-91.90149,41.68742],[-91.89789,41.68737],[-91.89222,41.68729],[-91.89196,41.68729],[-91.89181,41.68729],[-91.89089,41.68727],[-91.88998,41.68727],[-91.88903,41.68725],[-91.88807,41.68723],[-91.88616,41.68721],[-91.88443,41.68719],[-91.88271,41.68717],[-91.87823,41.68715],[-91.87552,41.68715],[-91.87452,41.68715],[-91.87352,41.68715],[-91.87113,41.68715],[-91.86604,41.68714],[-91.86504,41.68714],[-91.86422,41.68715],[-91.86182,41.68715],[-91.85862,41.68714],[-91.85675,41.68714],[-91.85557,41.68714],[-91.85428,41.68714],[-91.85184,41.68715],[-91.85113,41.68715],[-91.85015,41.68715],[-91.84714,41.68716],[-91.84139,41.68715],[-91.83569,41.68716],[-91.83416,41.68718],[-91.82846,41.68729],[-91.82714,41.68731],[-91.82201,41.6874],[-91.8186,41.68747],[-91.81843,41.68747],[-91.81812,41.68748],[-91.81343,41.68756],[-91.81294,41.68757],[-91.8128,41.68758],[-91.81014,41.68762],[-91.80887,41.68765],[-91.80725,41.68767],[-91.80616,41.68767],[-91.8045,41.68766],[-91.80417,41.68765],[-91.80368,41.68765],[-91.80322,41.68765],[-91.80221,41.68764],[-91.7969,41.68757],[-91.79674,41.68757],[-91.79478,41.68755],[-91.79303,41.68753],[-91.78919,41.68749],[-91.78524,41.68745],[-91.78507,41.68745],[-91.78457,41.68744],[-91.78125,41.6874],[-91.78062,41.68741],[-91.78004,41.68744],[-91.77961,41.68747],[-91.77916,41.68751],[-91.77901,41.68752],[-91.7784,41.68759],[-91.77794,41.68766],[-91.77742,41.68774],[-91.77554,41.68809],[-91.77306,41.68853],[-91.77222,41.68869],[-91.7688,41.68931],[-91.75675,41.6915],[-91.75445,41.69191],[-91.74398,41.69381],[-91.7407,41.6944],[-91.74002,41.69451],[-91.73941,41.69459],[-91.73861,41.69466],[-91.73792,41.6947],[-91.73762,41.69472],[-91.72404,41.69503],[-91.71868,41.69516],[-91.71762,41.69517],[-91.71671,41.69517],[-91.71628,41.69516],[-91.71576,41.69515],[-91.69927,41.69471],[-91.69233,41.69452],[-91.68937,41.69444],[-91.68746,41.69439],[-91.67995,41.69419],[-91.67837,41.69415],[-91.67298,41.694],[-91.67266,41.69399],[-91.6676,41.69385],[-91.66578,41.6938],[-91.66283,41.69373],[-91.66206,41.69372],[-91.66119,41.69374],[-91.65933,41.69379],[-91.6591,41.6938],[-91.65896,41.6938],[-91.65207,41.69402],[-91.64928,41.6941],[-91.64729,41.69416],[-91.64656,41.69419],[-91.64633,41.69419],[-91.64544,41.69422],[-91.64443,41.69425],[-91.64311,41.69427],[-91.64234,41.69427],[-91.64131,41.69427],[-91.63923,41.69427],[-91.63818,41.69427],[-91.63792,41.69427],[-91.63555,41.69427],[-91.63287,41.69428],[-91.63206,41.69428],[-91.6306,41.69428],[-91.62903,41.69427],[-91.62778,41.69425],[-91.62712,41.69425],[-91.62599,41.69424],[-91.62198,41.69416],[-91.62162,41.69416],[-91.61895,41.6941],[-91.61853,41.69409],[-91.61656,41.69405],[-91.61314,41.69399],[-91.60916,41.69391],[-91.60898,41.6939],[-91.60806,41.69389],[-91.60444,41.69381],[-91.60371,41.6938],[-91.60265,41.69377],[-91.60198,41.69374],[-91.60128,41.69368],[-91.6006,41.69362],[-91.59991,41.69353],[-91.59935,41.69345],[-91.59859,41.69332],[-91.59853,41.6933],[-91.59795,41.69318],[-91.59759,41.69311],[-91.59614,41.69274],[-91.59467,41.69235],[-91.59287,41.69188],[-91.58776,41.69053],[-91.58421,41.6896],[-91.58226,41.68909],[-91.58189,41.68899],[-91.58178,41.68896],[-91.58155,41.6889],[-91.58121,41.68881],[-91.58027,41.68856],[-91.57973,41.68841],[-91.5748,41.68713],[-91.57351,41.68682],[-91.57257,41.68663],[-91.57126,41.68637],[-91.57121,41.68637],[-91.57108,41.68634],[-91.56988,41.68615],[-91.56863,41.68597],[-91.56686,41.68577],[-91.56566,41.68567],[-91.56507,41.68563],[-91.56499,41.68562],[-91.56439,41.68559],[-91.56396,41.68557],[-91.56314,41.68554],[-91.56234,41.68552],[-91.55999,41.6855],[-91.55806,41.68549],[-91.55617,41.68547],[-91.55247,41.68547],[-91.54965,41.68544],[-91.54889,41.68544],[-91.54845,41.68546],[-91.5479,41.68549],[-91.54734,41.68554],[-91.54684,41.6856],[-91.54637,41.68566],[-91.54022,41.68652],[-91.53936,41.68663],[-91.53625,41.68709],[-91.53538,41.6872],[-91.53476,41.68728],[-91.53428,41.68733],[-91.53383,41.68738],[-91.53333,41.68742],[-91.53293,41.68743],[-91.53229,41.68743],[-91.53161,41.68744],[-91.52502,41.68728],[-91.5238,41.68726],[-91.52218,41.68723],[-91.52153,41.68721],[-91.52109,41.6872],[-91.51872,41.68712],[-91.51421,41.68701],[-91.5109,41.68693],[-91.50811,41.68688],[-91.50643,41.68685],[-91.50201,41.68674],[-91.50028,41.6867],[-91.49826,41.68666],[-91.49633,41.68661],[-91.49323,41.68655],[-91.49179,41.68651],[-91.48984,41.68647],[-91.48915,41.68644],[-91.48845,41.68638],[-91.48767,41.68631],[-91.48697,41.68621],[-91.48622,41.68609],[-91.48563,41.68599],[-91.48511,41.68588],[-91.48437,41.6857],[-91.48361,41.6855],[-91.48287,41.68528],[-91.48249,41.68516],[-91.48188,41.68495],[-91.47907,41.68392],[-91.47747,41.68333],[-91.47502,41.68243],[-91.47099,41.68092],[-91.46307,41.678],[-91.4591,41.67653],[-91.45647,41.67555],[-91.45363,41.67451],[-91.4511,41.67358],[-91.44882,41.67274],[-91.44802,41.67244],[-91.44329,41.67072],[-91.4429,41.67057],[-91.44171,41.67012],[-91.44057,41.6697],[-91.43973,41.66939],[-91.43911,41.66917],[-91.43877,41.66905],[-91.43846,41.66896],[-91.43815,41.66886],[-91.43784,41.66876],[-91.43754,41.66868],[-91.43687,41.6685],[-91.43634,41.66838],[-91.4358,41.66826],[-91.43507,41.66811],[-91.43415,41.66797],[-91.43378,41.66792],[-91.43317,41.66784],[-91.43272,41.6678],[-91.43163,41.66772],[-91.43016,41.66768],[-91.42967,41.66766],[-91.42525,41.66753],[-91.42446,41.66752],[-91.42136,41.66744],[-91.42056,41.66742],[-91.41679,41.6673],[-91.41624,41.66729],[-91.41062,41.66713],[-91.40728,41.66704],[-91.39754,41.66677],[-91.39582,41.66673],[-91.39496,41.66673],[-91.39433,41.66673],[-91.39368,41.66674],[-91.39319,41.66676],[-91.39263,41.6668],[-91.39172,41.66686],[-91.39114,41.6669],[-91.39031,41.66698],[-91.3857,41.66736],[-91.38089,41.66775],[-91.38034,41.6678],[-91.37983,41.66785],[-91.37917,41.66788],[-91.3788,41.6679],[-91.37833,41.66791],[-91.37795,41.66791],[-91.37736,41.6679],[-91.37684,41.66789],[-91.37643,41.66786],[-91.37574,41.66782],[-91.37507,41.66775],[-91.37467,41.66771],[-91.37425,41.66766],[-91.3738,41.6676],[-91.37333,41.66752],[-91.37279,41.66742],[-91.37214,41.66729],[-91.36854,41.6665],[-91.36632,41.66599],[-91.36402,41.66548],[-91.36323,41.66532],[-91.3595,41.6645],[-91.35839,41.66427],[-91.35738,41.6641],[-91.35614,41.66396],[-91.35524,41.66389],[-91.35402,41.66385],[-91.35219,41.66385],[-91.35125,41.66386],[-91.35057,41.66386],[-91.3488,41.66389],[-91.34772,41.6639],[-91.3455,41.66392],[-91.34489,41.66393],[-91.34279,41.66395],[-91.34049,41.66397],[-91.33757,41.66401],[-91.33688,41.66402],[-91.33548,41.66404],[-91.33404,41.66405],[-91.32955,41.66406],[-91.32799,41.66402],[-91.3262,41.66395],[-91.32353,41.66378],[-91.31245,41.66308],[-91.31043,41.66294],[-91.30915,41.66287],[-91.30847,41.66285],[-91.30783,41.66284],[-91.30703,41.66282],[-91.30626,41.66283],[-91.30426,41.66286],[-91.30302,41.6629],[-91.30214,41.66291],[-91.29625,41.66308],[-91.29189,41.66322],[-91.29001,41.66326],[-91.28882,41.66331],[-91.2883,41.66332],[-91.28744,41.66334],[-91.28562,41.66339],[-91.28459,41.6634],[-91.28368,41.66342],[-91.28323,41.66343],[-91.28253,41.66344],[-91.28167,41.66344],[-91.27902,41.66343],[-91.27778,41.66343],[-91.27553,41.6634],[-91.26145,41.66332],[-91.25765,41.6633],[-91.25554,41.66331],[-91.25419,41.6633],[-91.25257,41.66329],[-91.25059,41.66328],[-91.25001,41.66328],[-91.24895,41.66329],[-91.24848,41.66329],[-91.2452,41.66327],[-91.24494,41.66327],[-91.24249,41.66326],[-91.24174,41.66326],[-91.24042,41.66324],[-91.23946,41.6632],[-91.23868,41.66312],[-91.23805,41.66307],[-91.23711,41.66295],[-91.22677,41.66145],[-91.22401,41.66104],[-91.22296,41.6609],[-91.21255,41.6594],[-91.20592,41.65844],[-91.20402,41.65817],[-91.20184,41.65785],[-91.19797,41.65729],[-91.1971,41.65716],[-91.19648,41.65704],[-91.19576,41.65689],[-91.19535,41.65678],[-91.19482,41.65663],[-91.1943,41.65646],[-91.19328,41.65609],[-91.19167,41.65547],[-91.19017,41.65491],[-91.18895,41.65444],[-91.1875,41.65387],[-91.18476,41.65283],[-91.18393,41.65252],[-91.18237,41.65192],[-91.18178,41.6517],[-91.18093,41.6514],[-91.17914,41.6508],[-91.17805,41.65047],[-91.16756,41.64726],[-91.16725,41.64716],[-91.16689,41.64707],[-91.16594,41.64684],[-91.16516,41.64668],[-91.16473,41.64661],[-91.16369,41.64645],[-91.16312,41.64638],[-91.16215,41.64628],[-91.16137,41.64624],[-91.15686,41.64609],[-91.15521,41.64605],[-91.15304,41.64599],[-91.15088,41.64592],[-91.14675,41.6458],[-91.13503,41.64545],[-91.13464,41.64544],[-91.13341,41.6454],[-91.13329,41.6454],[-91.13234,41.64538],[-91.13145,41.64536],[-91.12498,41.64518],[-91.11532,41.64495],[-91.11488,41.64494],[-91.11422,41.64493],[-91.11322,41.64491],[-91.10975,41.64483],[-91.10819,41.64478],[-91.10748,41.64474],[-91.10698,41.64472],[-91.10673,41.64471],[-91.1045,41.64469],[-91.09655,41.64451],[-91.09396,41.64449],[-91.09163,41.64447],[-91.0904,41.64445],[-91.08807,41.64445],[-91.08196,41.64439],[-91.08085,41.64438],[-91.08028,41.64436],[-91.07977,41.64432],[-91.0793,41.64428],[-91.07591,41.6439],[-91.07537,41.64382],[-91.07454,41.64371],[-91.07313,41.6435],[-91.07247,41.64339],[-91.07095,41.6431],[-91.06636,41.64228],[-91.06549,41.64212],[-91.06441,41.64192],[-91.06388,41.64183],[-91.06301,41.64166],[-91.0604,41.64118],[-91.05826,41.64081],[-91.05699,41.64057],[-91.05549,41.64028],[-91.05343,41.6399],[-91.05115,41.63941],[-91.04979,41.63914],[-91.04811,41.63879],[-91.0464,41.63845],[-91.04455,41.63807],[-91.04274,41.63768],[-91.04067,41.63719],[-91.03957,41.63694],[-91.03808,41.63661],[-91.03415,41.6357],[-91.03171,41.63516],[-91.03056,41.63489],[-91.02897,41.63452],[-91.02695,41.63403],[-91.02618,41.63386],[-91.02553,41.63373],[-91.02422,41.63354],[-91.0232,41.63341],[-91.02255,41.63335],[-91.02164,41.6333],[-91.02063,41.63327],[-91.01088,41.63326],[-91.00473,41.6333],[-91.00002,41.63334],[-90.99608,41.63338],[-90.98513,41.63346],[-90.98007,41.63346],[-90.95387,41.63346],[-90.95131,41.63348],[-90.95091,41.63349],[-90.94964,41.63352],[-90.94779,41.6336],[-90.93662,41.63402],[-90.93256,41.63416],[-90.93018,41.63424],[-90.92918,41.63426],[-90.92837,41.63425],[-90.92699,41.63419],[-90.92628,41.63415],[-90.92398,41.63403],[-90.92342,41.634],[-90.92219,41.63393],[-90.91557,41.63357],[-90.91192,41.63338],[-90.90606,41.63305],[-90.90531,41.63301],[-90.90427,41.63296],[-90.90286,41.6329],[-90.90164,41.63287],[-90.90068,41.63287],[-90.8837,41.63289],[-90.87426,41.63287],[-90.86423,41.63289],[-90.86101,41.63291],[-90.85542,41.63289],[-90.85256,41.63288],[-90.8462,41.6329],[-90.8398,41.6329],[-90.83863,41.63285],[-90.83772,41.63273],[-90.83688,41.63258],[-90.83645,41.63247],[-90.83554,41.6322],[-90.83502,41.63201],[-90.81933,41.62673],[-90.81136,41.62408],[-90.81031,41.6237],[-90.79893,41.61988],[-90.79834,41.61969],[-90.7973,41.61939],[-90.79619,41.6191],[-90.79556,41.61895],[-90.79371,41.61856],[-90.78667,41.61716],[-90.77934,41.61566],[-90.77891,41.61557],[-90.77544,41.61486],[-90.77305,41.61438],[-90.76804,41.61337],[-90.76265,41.61227],[-90.7589,41.61154],[-90.75803,41.61136],[-90.75234,41.6102],[-90.74738,41.60921],[-90.74049,41.6078],[-90.73883,41.60744],[-90.73737,41.60711],[-90.73602,41.60681],[-90.73546,41.60669],[-90.73426,41.60642],[-90.73305,41.60616],[-90.72488,41.60435],[-90.72318,41.60399],[-90.72262,41.60388],[-90.72151,41.60374],[-90.72073,41.60366],[-90.72029,41.60365],[-90.71969,41.60361],[-90.71888,41.60361],[-90.71347,41.60362],[-90.71306,41.60362],[-90.70775,41.60361],[-90.70075,41.60362],[-90.6977,41.60364],[-90.69415,41.60363],[-90.68766,41.60362],[-90.68698,41.60363],[-90.68672,41.60362],[-90.68558,41.60363],[-90.68491,41.60364],[-90.68398,41.60363],[-90.6835,41.60359],[-90.68272,41.60352],[-90.68161,41.60337],[-90.67976,41.60306],[-90.67866,41.60289],[-90.67656,41.60274],[-90.67577,41.60273],[-90.6751,41.60273],[-90.67401,41.60279],[-90.67336,41.60286],[-90.67272,41.60295],[-90.67154,41.60314],[-90.67089,41.60328],[-90.67016,41.60338],[-90.66925,41.60348],[-90.66842,41.60355],[-90.66776,41.60358],[-90.66703,41.60359],[-90.6665,41.60358],[-90.6652,41.60351],[-90.66457,41.60346],[-90.66174,41.60314],[-90.6598,41.60295],[-90.65752,41.60271],[-90.65617,41.60256],[-90.65512,41.60247],[-90.65137,41.60207],[-90.64685,41.60159],[-90.64606,41.60152],[-90.64168,41.60105],[-90.63707,41.60058],[-90.63431,41.60028],[-90.63354,41.6002],[-90.6327,41.60012],[-90.63163,41.60003],[-90.63065,41.59997],[-90.62967,41.59992],[-90.62809,41.59989],[-90.62623,41.59988],[-90.62506,41.59986],[-90.62342,41.59984],[-90.62133,41.59983],[-90.61808,41.5998],[-90.61272,41.59977],[-90.59873,41.59967],[-90.59688,41.59965],[-90.59429,41.59962],[-90.59348,41.5996],[-90.59249,41.59954],[-90.59163,41.59946],[-90.59031,41.59931],[-90.58879,41.59907],[-90.58779,41.59891],[-90.58519,41.5985],[-90.58332,41.59819],[-90.58258,41.59808],[-90.57911,41.59751],[-90.57734,41.59724],[-90.5749,41.59685],[-90.57121,41.59626],[-90.56903,41.5959],[-90.56544,41.59534],[-90.5632,41.59498],[-90.56203,41.59479],[-90.56134,41.59468],[-90.55996,41.5945],[-90.55896,41.59444],[-90.558,41.59442],[-90.55655,41.59447],[-90.5552,41.59458],[-90.5531,41.59473],[-90.55132,41.59488],[-90.54392,41.59552],[-90.5399,41.59584],[-90.53871,41.59593],[-90.53835,41.59596],[-90.53749,41.59599],[-90.53103,41.59604],[-90.5272,41.59608],[-90.52602,41.59608],[-90.52526,41.59609],[-90.5229,41.59611],[-90.52141,41.59613],[-90.51927,41.59614],[-90.51684,41.59615],[-90.50819,41.59622],[-90.50625,41.59624],[-90.49902,41.59633],[-90.49449,41.59637],[-90.49313,41.59639],[-90.48719,41.59645],[-90.4837,41.5965],[-90.48223,41.59652],[-90.47797,41.59662],[-90.47342,41.59671],[-90.46756,41.59686],[-90.45989,41.59703],[-90.45942,41.59704],[-90.45864,41.59706],[-90.45012,41.59725],[-90.4485,41.59729],[-90.44799,41.5973],[-90.4477,41.5973],[-90.44591,41.59733],[-90.44358,41.59735],[-90.4425,41.59737],[-90.44138,41.59737],[-90.43783,41.5974],[-90.43506,41.59742],[-90.43469,41.59742],[-90.43441,41.59742],[-90.43364,41.59744],[-90.4311,41.59745],[-90.43091,41.59745],[-90.43021,41.59746],[-90.42967,41.59747],[-90.42899,41.59746],[-90.42441,41.59751],[-90.4212,41.59753],[-90.41988,41.59755],[-90.41154,41.5976],[-90.41094,41.5976],[-90.40974,41.59756],[-90.4092,41.59754],[-90.40867,41.59749],[-90.40593,41.59719],[-90.40474,41.59706],[-90.40187,41.59676],[-90.40041,41.59659],[-90.40012,41.59656],[-90.39752,41.59628],[-90.39647,41.59617],[-90.39506,41.59601],[-90.38856,41.59532],[-90.38387,41.59482],[-90.37931,41.59433],[-90.37773,41.59414],[-90.37711,41.59406],[-90.37683,41.59402],[-90.37613,41.59383],[-90.37558,41.59366],[-90.37488,41.59339],[-90.37427,41.59309],[-90.37369,41.59277],[-90.37329,41.5925],[-90.3727,41.59202],[-90.37241,41.59174],[-90.37204,41.5913],[-90.37187,41.59104],[-90.37171,41.5908],[-90.37168,41.59075],[-90.37128,41.59022],[-90.37102,41.58978],[-90.37084,41.58945],[-90.37002,41.58818],[-90.36821,41.58538],[-90.36757,41.58435],[-90.36723,41.58384],[-90.36703,41.58354],[-90.36671,41.58307],[-90.3665,41.58276],[-90.36631,41.58246],[-90.36601,41.58195],[-90.36568,41.5814],[-90.36536,41.58087],[-90.36498,41.58024],[-90.36456,41.57956],[-90.36426,41.57905],[-90.36342,41.57764],[-90.36282,41.57665],[-90.36254,41.57618],[-90.36224,41.57566],[-90.36221,41.57562],[-90.36216,41.57552],[-90.36211,41.57543],[-90.36205,41.57533],[-90.36199,41.57522],[-90.36193,41.57513],[-90.36187,41.57503],[-90.36181,41.57493],[-90.36175,41.57483],[-90.36169,41.57473],[-90.36164,41.57464],[-90.36157,41.57454],[-90.36151,41.57444],[-90.36145,41.57434],[-90.36139,41.57424],[-90.36133,41.57415],[-90.36126,41.57404],[-90.3612,41.57394],[-90.36114,41.57383],[-90.36108,41.57375],[-90.36102,41.57364],[-90.36096,41.57354],[-90.3609,41.57344],[-90.36084,41.57334],[-90.36077,41.57324],[-90.36071,41.57314],[-90.3606,41.57296],[-90.36053,41.57285],[-90.36046,41.57274],[-90.3604,41.57264],[-90.36035,41.57255],[-90.36029,41.57245],[-90.36023,41.57235],[-90.36016,41.57225],[-90.3601,41.57215],[-90.36004,41.57206],[-90.35998,41.57196],[-90.35991,41.57186],[-90.35985,41.57177],[-90.35978,41.57167],[-90.35971,41.57158],[-90.35964,41.57148],[-90.35956,41.57138],[-90.35934,41.5711],[-90.35926,41.571],[-90.3592,41.57092],[-90.35913,41.57083],[-90.35904,41.57073],[-90.35896,41.57064],[-90.35887,41.57054],[-90.35871,41.57037],[-90.35863,41.57028],[-90.35855,41.5702],[-90.35847,41.57012],[-90.35837,41.57002],[-90.35829,41.56994],[-90.3582,41.56985],[-90.35811,41.56977],[-90.35804,41.5697],[-90.35793,41.5696],[-90.35785,41.56953],[-90.35776,41.56944],[-90.35768,41.56937],[-90.35759,41.56928],[-90.35748,41.5692],[-90.35739,41.56911],[-90.3573,41.56904],[-90.35721,41.56896],[-90.35711,41.56888],[-90.35701,41.5688],[-90.35692,41.56873],[-90.35682,41.56864],[-90.35671,41.56856],[-90.35662,41.56849],[-90.35653,41.56843],[-90.35642,41.56834],[-90.35632,41.56827],[-90.35623,41.5682],[-90.35613,41.56813],[-90.35602,41.56805],[-90.35592,41.56798],[-90.3558,41.5679],[-90.35567,41.56781],[-90.35548,41.56768],[-90.35536,41.56761],[-90.35525,41.56754],[-90.35515,41.56747],[-90.35504,41.5674],[-90.35493,41.56733],[-90.35482,41.56726],[-90.35468,41.56719],[-90.35457,41.56712],[-90.35447,41.56706],[-90.35434,41.56699],[-90.35423,41.56693],[-90.35412,41.56686],[-90.354,41.5668],[-90.35387,41.56673],[-90.35375,41.56666],[-90.35364,41.5666],[-90.35352,41.56654],[-90.3534,41.56648],[-90.35329,41.56642],[-90.35315,41.56635],[-90.35304,41.5663],[-90.35293,41.56624],[-90.35279,41.56618],[-90.35267,41.56612],[-90.35254,41.56606],[-90.3524,41.566],[-90.35229,41.56595],[-90.35215,41.56588],[-90.35202,41.56583],[-90.35192,41.56578],[-90.35178,41.56572],[-90.35156,41.56562],[-90.35141,41.56556],[-90.35127,41.5655],[-90.35115,41.56545],[-90.35092,41.56535],[-90.3508,41.5653],[-90.35065,41.56523],[-90.35051,41.56517],[-90.35039,41.56512],[-90.35026,41.56506],[-90.35014,41.565],[-90.35002,41.56494],[-90.34992,41.5649],[-90.34978,41.56483],[-90.34965,41.56477],[-90.34942,41.56465],[-90.3493,41.56459],[-90.34917,41.56451],[-90.34906,41.56445],[-90.34894,41.56439],[-90.34882,41.56432],[-90.3487,41.56425],[-90.34859,41.56419],[-90.34847,41.56411],[-90.34836,41.56405],[-90.34827,41.56399],[-90.34814,41.56391],[-90.34802,41.56383],[-90.34792,41.56377],[-90.3478,41.5637],[-90.34768,41.56362],[-90.34757,41.56354],[-90.34748,41.56347],[-90.34736,41.56339],[-90.34726,41.56331],[-90.34717,41.56325],[-90.34705,41.56316],[-90.34694,41.56308],[-90.34685,41.56301],[-90.34675,41.56293],[-90.34664,41.56284],[-90.34655,41.56276],[-90.34645,41.56268],[-90.34635,41.5626],[-90.34625,41.56252],[-90.34616,41.56244],[-90.34605,41.56235],[-90.34596,41.56227],[-90.34587,41.56219],[-90.34577,41.56209],[-90.34569,41.56202],[-90.34559,41.56192],[-90.3455,41.56184],[-90.34542,41.56176],[-90.34532,41.56167],[-90.34523,41.56157],[-90.34514,41.56148],[-90.34506,41.56139],[-90.34496,41.5613],[-90.34488,41.56121],[-90.3448,41.56112],[-90.34472,41.56102],[-90.34464,41.56094],[-90.34455,41.56084],[-90.34441,41.56067],[-90.34433,41.56057],[-90.34425,41.56046],[-90.34419,41.56039],[-90.34412,41.56029],[-90.34399,41.56012],[-90.3439,41.56],[-90.34384,41.55991],[-90.34376,41.5598],[-90.34364,41.55961],[-90.34357,41.55952],[-90.34351,41.55942],[-90.34346,41.55934],[-90.34341,41.55926],[-90.34332,41.55912],[-90.34327,41.55902],[-90.34322,41.55893],[-90.34316,41.55882],[-90.34311,41.55873],[-90.34305,41.55863],[-90.343,41.55852],[-90.34294,41.55841],[-90.34289,41.55831],[-90.34284,41.55822],[-90.34279,41.55811],[-90.34275,41.55802],[-90.3427,41.55791],[-90.34266,41.55781],[-90.34261,41.5577],[-90.34257,41.5576],[-90.34252,41.5575],[-90.34248,41.55739],[-90.34244,41.55728],[-90.3424,41.55718],[-90.34237,41.55708],[-90.34233,41.55697],[-90.3423,41.55686],[-90.34226,41.55676],[-90.34223,41.55666],[-90.34217,41.55647],[-90.34214,41.55633],[-90.34211,41.55622],[-90.34209,41.55613],[-90.34206,41.55602],[-90.34203,41.55591],[-90.34201,41.55579],[-90.34199,41.55569],[-90.34196,41.55557],[-90.34195,41.55548],[-90.34193,41.55538],[-90.34191,41.55526],[-90.34189,41.55516],[-90.34188,41.55505],[-90.34186,41.55494],[-90.34185,41.55483],[-90.34184,41.55471],[-90.34183,41.55461],[-90.34182,41.5545],[-90.34181,41.55438],[-90.3418,41.55429],[-90.3418,41.55418],[-90.34179,41.55407],[-90.34179,41.55395],[-90.34179,41.55384],[-90.34179,41.55374],[-90.34179,41.55363],[-90.34179,41.55352],[-90.34179,41.55341],[-90.34179,41.5533],[-90.34178,41.55319],[-90.34178,41.55308],[-90.34178,41.55298],[-90.34178,41.55288],[-90.34178,41.55276],[-90.34178,41.55264],[-90.34178,41.55255],[-90.34178,41.55244],[-90.34178,41.55234],[-90.34178,41.55223],[-90.34178,41.5521],[-90.34178,41.552],[-90.34178,41.55189],[-90.34178,41.55179],[-90.34178,41.55168],[-90.34178,41.55157],[-90.34178,41.55145],[-90.34178,41.55135],[-90.34178,41.55125],[-90.34178,41.55112],[-90.34178,41.55103],[-90.34178,41.55091],[-90.34178,41.5508],[-90.34178,41.55069],[-90.34178,41.55058],[-90.34178,41.55047],[-90.34178,41.55036],[-90.34178,41.55026],[-90.34178,41.55015],[-90.34178,41.55004],[-90.34178,41.54994],[-90.34178,41.54981],[-90.34178,41.5497],[-90.34178,41.54961],[-90.34178,41.54951],[-90.34178,41.54941],[-90.34178,41.54928],[-90.34178,41.54917],[-90.34178,41.54906],[-90.34178,41.54895],[-90.34178,41.54885],[-90.34178,41.54873],[-90.34178,41.54862],[-90.34178,41.54852],[-90.34178,41.54841],[-90.34178,41.5483],[-90.34178,41.54819],[-90.34178,41.54787],[-90.34178,41.54776],[-90.34178,41.54767],[-90.34178,41.54753],[-90.34178,41.54743],[-90.34178,41.54732],[-90.34178,41.5472],[-90.34178,41.5471],[-90.34178,41.54698],[-90.34178,41.54687],[-90.34178,41.54677],[-90.34179,41.54668],[-90.34178,41.54655],[-90.34178,41.54644],[-90.34178,41.54626],[-90.34178,41.54612],[-90.34178,41.54604],[-90.34178,41.54591],[-90.34178,41.54578],[-90.34178,41.54567],[-90.34178,41.54556],[-90.34178,41.54546],[-90.34178,41.54535],[-90.34178,41.54523],[-90.34178,41.54512],[-90.34178,41.54501],[-90.34178,41.54489],[-90.34178,41.54479],[-90.34178,41.54468],[-90.34178,41.54458],[-90.34178,41.54447],[-90.34177,41.54435],[-90.34178,41.54424],[-90.34178,41.54414],[-90.34177,41.54403],[-90.34177,41.54392],[-90.34177,41.54382],[-90.34177,41.54369],[-90.34177,41.54359],[-90.34177,41.54348],[-90.34177,41.54337],[-90.34177,41.54327],[-90.34177,41.54316],[-90.34177,41.54304],[-90.34177,41.54293],[-90.34177,41.54282],[-90.34177,41.5427],[-90.34177,41.54258],[-90.34178,41.54117],[-90.34177,41.54106],[-90.34177,41.54096],[-90.34177,41.54085],[-90.34177,41.54074],[-90.34177,41.54062],[-90.34177,41.54029],[-90.34179,41.53632],[-90.34179,41.53626],[-90.34178,41.53572],[-90.34178,41.53519],[-90.34178,41.53401],[-90.34177,41.5305],[-90.34176,41.52458],[-90.34176,41.52261],[-90.34179,41.52003],[-90.34179,41.51954],[-90.34176,41.51767],[-90.34177,41.51702],[-90.34177,41.51651],[-90.34169,41.51429],[-90.34161,41.51316],[-90.34146,41.51237],[-90.34124,41.51144],[-90.34112,41.51101],[-90.34086,41.51034],[-90.34079,41.51013],[-90.3402,41.5085],[-90.33932,41.50637],[-90.33895,41.50475],[-90.33882,41.49957],[-90.33888,41.4916],[-90.33885,41.49087],[-90.3388,41.48948],[-90.33886,41.48772],[-90.33885,41.48653],[-90.33885,41.48642],[-90.33888,41.48553],[-90.33888,41.48518],[-90.33887,41.48457],[-90.33889,41.48382],[-90.33888,41.48228],[-90.3389,41.48148],[-90.33891,41.47934],[-90.3389,41.47881],[-90.3389,41.47829],[-90.33888,41.4756],[-90.33889,41.46978],[-90.33891,41.46354],[-90.33864,41.46064],[-90.33826,41.45915],[-90.33791,41.45777],[-90.33756,41.45671],[-90.3357,41.45249],[-90.33548,41.45207],[-90.33349,41.44817],[-90.33311,41.44739],[-90.33195,41.44492],[-90.33086,41.44265],[-90.33031,41.44107],[-90.33022,41.44075],[-90.32996,41.43994],[-90.32986,41.43969],[-90.32987,41.43931],[-90.32991,41.43906],[-90.33004,41.43882],[-90.33018,41.43865],[-90.3304,41.4385],[-90.33081,41.43838],[-90.3313,41.43839],[-90.33157,41.43849],[-90.33185,41.43865],[-90.33209,41.43896],[-90.33215,41.43917],[-90.33211,41.43946],[-90.33195,41.43974],[-90.33181,41.43988],[-90.33157,41.44003],[-90.33112,41.44014],[-90.33022,41.44022],[-90.32928,41.44021],[-90.32738,41.44018],[-90.32223,41.44011],[-90.31948,41.44005],[-90.31908,41.44005],[-90.31607,41.44002],[-90.30265,41.44009],[-90.27428,41.44014],[-90.27374,41.44014],[-90.24857,41.44023],[-90.24331,41.44029],[-90.23647,41.44042],[-90.2205,41.44067],[-90.2019,41.44072],[-90.20136,41.44072],[-90.19757,41.44072],[-90.18322,41.44066],[-90.18174,41.44063],[-90.18027,41.44054],[-90.17876,41.44037],[-90.17712,41.44009],[-90.17583,41.4398],[-90.17484,41.43949],[-90.1736,41.43907],[-90.17264,41.43873],[-90.17198,41.43843],[-90.17001,41.43742],[-90.16828,41.43646],[-90.16117,41.43233],[-90.16058,41.43198],[-90.15998,41.43165],[-90.15892,41.43105],[-90.15805,41.43053],[-90.15745,41.43019],[-90.15492,41.42871],[-90.15436,41.42838],[-90.14947,41.42556],[-90.14573,41.42337],[-90.14316,41.42191],[-90.13614,41.41796],[-90.13453,41.41723],[-90.1329,41.41664],[-90.13052,41.41592],[-90.12895,41.4156],[-90.12769,41.41546],[-90.12623,41.41536],[-90.12339,41.41529],[-90.11834,41.41519],[-90.09102,41.41459],[-90.09047,41.41458],[-90.08623,41.41454],[-90.06829,41.4141],[-90.06783,41.41409],[-90.04057,41.41352],[-90.03809,41.41339],[-90.03697,41.41327],[-90.03464,41.41294],[-90.03287,41.41267],[-90.03063,41.41225],[-90.02817,41.41165],[-90.02177,41.41004],[-90.02027,41.40967],[-90.02004,41.40962],[-90.01666,41.40879],[-90.01425,41.40821],[-90.01273,41.40782],[-90.01055,41.40727],[-90.00882,41.40681],[-90.00473,41.40583],[-90.00011,41.40514],[-89.99723,41.40486],[-89.9936,41.40477],[-89.98716,41.40493],[-89.98374,41.40509],[-89.98071,41.40519],[-89.9792,41.40522],[-89.97772,41.40533],[-89.9756,41.40557],[-89.97431,41.40583],[-89.97211,41.40645],[-89.97096,41.4069],[-89.96961,41.40742],[-89.96782,41.40836],[-89.96597,41.40957],[-89.96542,41.40997],[-89.96496,41.41038],[-89.96423,41.41094],[-89.96353,41.41148],[-89.96154,41.41293],[-89.95992,41.41385],[-89.95823,41.41467],[-89.95649,41.41533],[-89.95473,41.41584],[-89.95216,41.41635],[-89.95036,41.41656],[-89.94967,41.41662],[-89.94802,41.41667],[-89.93922,41.41653],[-89.9382,41.41647],[-89.93716,41.41634],[-89.9354,41.41604],[-89.93356,41.41559],[-89.93152,41.41494],[-89.92977,41.41424],[-89.91793,41.40909],[-89.91724,41.40879],[-89.9111,41.40612],[-89.90891,41.40533],[-89.90851,41.40523],[-89.90616,41.40467],[-89.90389,41.40415],[-89.9023,41.40382],[-89.90022,41.40332],[-89.89454,41.40202],[-89.88111,41.39895],[-89.87129,41.39671],[-89.85687,41.39344],[-89.84032,41.3897],[-89.83944,41.38949],[-89.83784,41.38915],[-89.83743,41.38907],[-89.83619,41.38885],[-89.83528,41.38872],[-89.83436,41.38859],[-89.83361,41.38849],[-89.83268,41.38837],[-89.83174,41.38827],[-89.82889,41.38796],[-89.82853,41.38792],[-89.81784,41.38687],[-89.81455,41.38654],[-89.81348,41.38643],[-89.81315,41.3864],[-89.81174,41.38626],[-89.8108,41.38619],[-89.80938,41.38609],[-89.80891,41.38607],[-89.80797,41.38603],[-89.8075,41.38601],[-89.80655,41.38598],[-89.80512,41.38596],[-89.80418,41.38596],[-89.79162,41.38607],[-89.79119,41.38607],[-89.78442,41.38615],[-89.78377,41.38616],[-89.78068,41.38619],[-89.77994,41.3862],[-89.76783,41.38633],[-89.7663,41.38636],[-89.76519,41.38639],[-89.76377,41.38645],[-89.75858,41.38667],[-89.75678,41.38675],[-89.75526,41.38682],[-89.75242,41.38694],[-89.74628,41.38721],[-89.74439,41.38729],[-89.74194,41.3874],[-89.74015,41.38748],[-89.73873,41.38753],[-89.73731,41.38757],[-89.73541,41.38756],[-89.73399,41.38753],[-89.73295,41.38748],[-89.73288,41.38747],[-89.73201,41.38741],[-89.73107,41.38734],[-89.73013,41.38726],[-89.72965,41.38721],[-89.72872,41.3871],[-89.72825,41.38704],[-89.72639,41.38676],[-89.72547,41.3866],[-89.72455,41.38643],[-89.72226,41.38598],[-89.72126,41.3858],[-89.7202,41.38565],[-89.719,41.38554],[-89.71758,41.38547],[-89.71616,41.3855],[-89.71498,41.38554],[-89.71379,41.38565],[-89.71147,41.38599],[-89.70869,41.38642],[-89.70684,41.38667],[-89.70561,41.3868],[-89.70464,41.38689],[-89.70409,41.38692],[-89.70315,41.38698],[-89.70261,41.38701],[-89.70065,41.38704],[-89.69986,41.38706],[-89.692,41.38699],[-89.68471,41.38695],[-89.68189,41.38696],[-89.68123,41.38696],[-89.68094,41.38697],[-89.68057,41.38699],[-89.68019,41.38701],[-89.67962,41.38705],[-89.67897,41.38711],[-89.67855,41.38716],[-89.67794,41.38724],[-89.67748,41.38731],[-89.67711,41.38737],[-89.67665,41.38745],[-89.6762,41.38755],[-89.67556,41.38769],[-89.6751,41.3878],[-89.67457,41.38794],[-89.67395,41.38812],[-89.67343,41.38829],[-89.67232,41.38866],[-89.6712,41.38905],[-89.67068,41.38923],[-89.66963,41.38955],[-89.66928,41.38966],[-89.66892,41.38975],[-89.66838,41.38988],[-89.66784,41.39001],[-89.66738,41.3901],[-89.66673,41.39022],[-89.66636,41.39028],[-89.66581,41.39036],[-89.66535,41.39041],[-89.66521,41.39043],[-89.66298,41.39066],[-89.66242,41.39071],[-89.6582,41.39114],[-89.65726,41.39125],[-89.65605,41.3914],[-89.65549,41.39147],[-89.65364,41.39175],[-89.64715,41.39283],[-89.64428,41.39329],[-89.64362,41.39338],[-89.6425,41.39351],[-89.64185,41.39358],[-89.64081,41.39368],[-89.63959,41.39377],[-89.63901,41.3938],[-89.63873,41.39382],[-89.63844,41.39382],[-89.6375,41.39386],[-89.63627,41.39389],[-89.59292,41.39447],[-89.58182,41.39452],[-89.5814,41.39452],[-89.57441,41.39455],[-89.57359,41.39455],[-89.57217,41.39454],[-89.56848,41.39457],[-89.568,41.39456],[-89.56714,41.39452],[-89.56677,41.39449],[-89.5663,41.39445],[-89.56583,41.3944],[-89.56536,41.39435],[-89.56471,41.39425],[-89.56435,41.39419],[-89.56415,41.39416],[-89.56369,41.39408],[-89.56314,41.39396],[-89.56269,41.39386],[-89.56215,41.39373],[-89.5617,41.39361],[-89.56126,41.39349],[-89.56057,41.39326],[-89.56029,41.39317],[-89.56013,41.39312],[-89.55962,41.39293],[-89.55903,41.3927],[-89.55846,41.39246],[-89.55808,41.39229],[-89.55805,41.39228],[-89.55757,41.39205],[-89.55709,41.39181],[-89.55678,41.39164],[-89.55632,41.39138],[-89.55595,41.39117],[-89.555,41.39058],[-89.55448,41.39027],[-89.55372,41.38984],[-89.5531,41.38952],[-89.55272,41.38933],[-89.55263,41.38929],[-89.55214,41.38907],[-89.55181,41.38892],[-89.55154,41.38881],[-89.55114,41.38865],[-89.55046,41.3884],[-89.54984,41.38819],[-89.54938,41.38804],[-89.54888,41.38789],[-89.5485,41.38779],[-89.54805,41.38767],[-89.54758,41.38756],[-89.54711,41.38746],[-89.54667,41.38737],[-89.54623,41.38729],[-89.54576,41.38721],[-89.54524,41.38713],[-89.54481,41.38708],[-89.54433,41.38702],[-89.54384,41.38697],[-89.54337,41.38693],[-89.54293,41.38691],[-89.54242,41.38689],[-89.54148,41.38687],[-89.5341,41.38676],[-89.53343,41.38676],[-89.53251,41.38676],[-89.53155,41.38677],[-89.53059,41.38681],[-89.53011,41.38684],[-89.52963,41.38686],[-89.5287,41.38693],[-89.52786,41.38699],[-89.52678,41.38711],[-89.52632,41.38716],[-89.52492,41.38735],[-89.52398,41.38751],[-89.52304,41.38767],[-89.5224,41.38779],[-89.52164,41.38795],[-89.52122,41.38804],[-89.52059,41.38819],[-89.52013,41.3883],[-89.51986,41.38836],[-89.51888,41.38861],[-89.51826,41.38878],[-89.51755,41.38899],[-89.51694,41.38918],[-89.51616,41.38943],[-89.51538,41.3897],[-89.51469,41.38995],[-89.51401,41.3902],[-89.5128,41.39068],[-89.51071,41.39153],[-89.50888,41.39225],[-89.50777,41.39269],[-89.50638,41.39324],[-89.50573,41.39351],[-89.50538,41.39363],[-89.50483,41.39383],[-89.504,41.39413],[-89.50316,41.39441],[-89.5027,41.39455],[-89.50184,41.39481],[-89.5005,41.39518],[-89.50006,41.39529],[-89.49933,41.39548],[-89.49917,41.39552],[-89.49829,41.39572],[-89.49732,41.39593],[-89.49649,41.39609],[-89.4961,41.39617],[-89.49563,41.39625],[-89.49511,41.39635],[-89.49471,41.39641],[-89.49372,41.39657],[-89.49288,41.39668],[-89.4919,41.39681],[-89.49119,41.39689],[-89.49016,41.39699],[-89.48668,41.39734],[-89.47464,41.39863],[-89.46953,41.39921],[-89.46543,41.39963],[-89.46478,41.39971],[-89.46424,41.39977],[-89.46054,41.40017],[-89.45966,41.40026],[-89.45873,41.40034],[-89.45776,41.4004],[-89.45682,41.40045],[-89.45588,41.40048],[-89.45494,41.4005],[-89.45305,41.40048],[-89.45109,41.40039],[-89.45092,41.40038],[-89.44926,41.40025],[-89.44749,41.40005],[-89.44557,41.39976],[-89.44379,41.39944],[-89.44177,41.39898],[-89.44126,41.39886],[-89.43873,41.39822],[-89.43762,41.39794],[-89.43654,41.39766],[-89.43518,41.39733],[-89.43435,41.39718],[-89.43279,41.39697],[-89.43088,41.39682],[-89.42901,41.39681],[-89.42707,41.39693],[-89.4252,41.39717],[-89.42336,41.39754],[-89.41967,41.39842],[-89.41797,41.39883],[-89.41612,41.39921],[-89.41521,41.39937],[-89.41429,41.39952],[-89.41335,41.39966],[-89.41262,41.39975],[-89.41147,41.39988],[-89.40963,41.40002],[-89.40775,41.40011],[-89.40582,41.40014],[-89.40533,41.40014],[-89.40018,41.40013],[-89.3886,41.40011],[-89.38488,41.40011],[-89.38153,41.40011],[-89.38071,41.4001],[-89.37816,41.40009],[-89.37692,41.40009],[-89.37438,41.40009],[-89.37375,41.40009],[-89.37113,41.40008],[-89.36927,41.40005],[-89.36729,41.39999],[-89.36547,41.39992],[-89.36166,41.39975],[-89.36064,41.39971],[-89.35978,41.39968],[-89.35859,41.39965],[-89.35679,41.39962],[-89.35604,41.39961],[-89.35408,41.3996],[-89.35217,41.39962],[-89.35121,41.39964],[-89.34931,41.39969],[-89.34836,41.39972],[-89.34647,41.3998],[-89.34327,41.39995],[-89.34272,41.39998],[-89.34211,41.4],[-89.34082,41.40005],[-89.33959,41.40008],[-89.33893,41.40009],[-89.33702,41.40012],[-89.33192,41.40015],[-89.33003,41.40016],[-89.32757,41.40017],[-89.32068,41.40021],[-89.32007,41.40021],[-89.31915,41.4002],[-89.3181,41.40017],[-89.31724,41.40013],[-89.3163,41.40007],[-89.31536,41.4],[-89.31438,41.3999],[-89.3135,41.3998],[-89.31256,41.39967],[-89.31162,41.39953],[-89.31052,41.39935],[-89.30979,41.39921],[-89.30888,41.39902],[-89.308,41.39883],[-89.30715,41.39863],[-89.3062,41.39838],[-89.30529,41.39813],[-89.30421,41.3978],[-89.30335,41.39752],[-89.30265,41.39728],[-89.30172,41.39695],[-89.30088,41.39663],[-89.29937,41.39601],[-89.29754,41.39528],[-89.29609,41.39468],[-89.29196,41.39301],[-89.28127,41.38869],[-89.27962,41.388],[-89.27847,41.38751],[-89.27616,41.38647],[-89.27459,41.38575],[-89.273,41.38499],[-89.2714,41.38419],[-89.26959,41.38327],[-89.26828,41.38257],[-89.26515,41.38089],[-89.26164,41.379],[-89.26135,41.37884],[-89.25833,41.37722],[-89.25792,41.377],[-89.25735,41.37669],[-89.25687,41.37644],[-89.25531,41.37567],[-89.25367,41.37494],[-89.25208,41.3743],[-89.25035,41.37368],[-89.2485,41.37309],[-89.2467,41.37259],[-89.24488,41.37215],[-89.243,41.37178],[-89.24116,41.37145],[-89.23866,41.37102],[-89.23802,41.37091],[-89.23491,41.37037],[-89.23399,41.37021],[-89.22938,41.36941],[-89.22477,41.36861],[-89.22368,41.36842],[-89.22297,41.3683],[-89.22219,41.36818],[-89.21452,41.36684],[-89.21343,41.36665],[-89.21159,41.36634],[-89.20808,41.36573],[-89.20625,41.36541],[-89.20373,41.36497],[-89.20253,41.36478],[-89.20188,41.36468],[-89.20092,41.36453],[-89.19975,41.36443],[-89.19777,41.36434],[-89.19401,41.36434],[-89.18769,41.36437],[-89.18688,41.36436],[-89.18273,41.36437],[-89.18217,41.36437],[-89.18024,41.36442],[-89.17505,41.3644],[-89.17316,41.36441],[-89.16838,41.36447],[-89.16462,41.36454],[-89.15905,41.36463],[-89.15855,41.36464],[-89.15708,41.36466],[-89.15138,41.36477],[-89.14664,41.36484],[-89.14565,41.36486],[-89.14275,41.36494],[-89.13759,41.36499],[-89.13237,41.3651],[-89.13156,41.36511],[-89.12738,41.36517],[-89.12424,41.36522],[-89.12046,41.36529],[-89.12034,41.3653],[-89.11668,41.36535],[-89.11551,41.36546],[-89.11428,41.36559],[-89.11197,41.36613],[-89.11067,41.36663],[-89.11019,41.36688],[-89.10954,41.36716],[-89.10873,41.36758],[-89.1063,41.36927],[-89.10599,41.36946],[-89.1055,41.36981],[-89.10481,41.3702],[-89.10426,41.37053],[-89.10377,41.37076],[-89.10304,41.37105],[-89.10239,41.3713],[-89.10181,41.37148],[-89.10084,41.37177],[-89.09975,41.372],[-89.09868,41.37214],[-89.09793,41.3722],[-89.09666,41.37229],[-89.09652,41.37229],[-89.09532,41.37225],[-89.09286,41.37216],[-89.09223,41.37213],[-89.09171,41.3721],[-89.08988,41.37202],[-89.08899,41.37198],[-89.08692,41.37188],[-89.08554,41.37182],[-89.08415,41.37176],[-89.08381,41.37175],[-89.08012,41.37163],[-89.07887,41.37156],[-89.07786,41.37146],[-89.07701,41.37134],[-89.07636,41.37121],[-89.07588,41.37108],[-89.07194,41.37004],[-89.06739,41.36884],[-89.06538,41.36831],[-89.06404,41.36805],[-89.06164,41.3678],[-89.06015,41.36778],[-89.05923,41.36777],[-89.05854,41.36777],[-89.05365,41.3678],[-89.05234,41.3678],[-89.05085,41.36781],[-89.0505,41.36781],[-89.0491,41.36781],[-89.04736,41.36781],[-89.04457,41.36782],[-89.04073,41.36782],[-89.03656,41.36783],[-89.02943,41.36787],[-89.02822,41.36787],[-89.02738,41.36787],[-89.02528,41.36787],[-89.02436,41.36784],[-89.02242,41.36775],[-89.01747,41.36753],[-89.01713,41.36752],[-89.01652,41.36751],[-89.01224,41.36753],[-89.00296,41.36759],[-88.99794,41.36762],[-88.98862,41.36768],[-88.97992,41.36773],[-88.97198,41.36781],[-88.965,41.36784],[-88.9577,41.36788],[-88.94831,41.36794],[-88.94066,41.36799],[-88.93162,41.36804],[-88.92431,41.36808],[-88.91527,41.36814],[-88.90484,41.3682],[-88.90225,41.36824],[-88.89441,41.36826],[-88.88815,41.3683],[-88.88045,41.36837],[-88.87551,41.3684],[-88.87097,41.36842],[-88.86193,41.36846],[-88.86045,41.36858],[-88.85917,41.36871],[-88.85759,41.369],[-88.85614,41.36932],[-88.85456,41.3698],[-88.85327,41.37028],[-88.85202,41.37081],[-88.85129,41.37118],[-88.85059,41.37154],[-88.84869,41.37265],[-88.84749,41.37328],[-88.84673,41.37368],[-88.84551,41.3742],[-88.84423,41.37466],[-88.84296,41.37507],[-88.84163,41.37539],[-88.84022,41.37565],[-88.83856,41.37589],[-88.83701,41.37601],[-88.83544,41.37602],[-88.83175,41.37607],[-88.83128,41.37607],[-88.82548,41.37615],[-88.82052,41.37622],[-88.81856,41.37624],[-88.81657,41.37627],[-88.81217,41.37643],[-88.80816,41.37684],[-88.80721,41.37692],[-88.80627,41.37701],[-88.80519,41.37706],[-88.80343,41.37713],[-88.80205,41.37718],[-88.79792,41.37724],[-88.79712,41.37723],[-88.79627,41.37724],[-88.79357,41.3773],[-88.79064,41.37728],[-88.78891,41.37715],[-88.78719,41.37702],[-88.78581,41.37691],[-88.78477,41.37684],[-88.78438,41.37681],[-88.78269,41.37668],[-88.77611,41.37616],[-88.77572,41.37613],[-88.77266,41.37589],[-88.7699,41.37569],[-88.76748,41.37553],[-88.76609,41.37547],[-88.76051,41.37538],[-88.75286,41.37538],[-88.74939,41.37538],[-88.74032,41.37537],[-88.73268,41.37536],[-88.72886,41.37536],[-88.72851,41.37536],[-88.72504,41.37536],[-88.72435,41.37536],[-88.72332,41.37536],[-88.72158,41.37535],[-88.72124,41.37535],[-88.71985,41.37535],[-88.71881,41.37535],[-88.71637,41.37535],[-88.71047,41.37534],[-88.70801,41.37533],[-88.7025,41.37533],[-88.70103,41.37532],[-88.69198,41.37531],[-88.68746,41.37532],[-88.68294,41.37536],[-88.677,41.37541],[-88.67247,41.37546],[-88.66863,41.37549],[-88.66026,41.37556],[-88.65015,41.37566],[-88.64492,41.37575],[-88.63865,41.37582],[-88.63656,41.37584],[-88.63482,41.37586],[-88.63412,41.37586],[-88.62855,41.37589],[-88.61984,41.37599],[-88.61044,41.37611],[-88.60346,41.37624],[-88.59893,41.37634],[-88.59276,41.37646],[-88.58578,41.3766],[-88.58195,41.37669],[-88.58173,41.37669],[-88.57851,41.37675],[-88.57672,41.37681],[-88.57213,41.37684],[-88.56489,41.37694],[-88.56266,41.37696],[-88.56153,41.37698],[-88.55069,41.37713],[-88.54687,41.37717],[-88.54162,41.37722],[-88.5368,41.37729],[-88.53582,41.37731],[-88.53015,41.37738],[-88.52388,41.37746],[-88.50558,41.37769],[-88.50187,41.37775],[-88.50165,41.37775],[-88.4933,41.37784],[-88.49271,41.37785],[-88.48937,41.37791],[-88.48055,41.378],[-88.47638,41.37806],[-88.47172,41.37812],[-88.4671,41.37814],[-88.46663,41.37815],[-88.46361,41.37822],[-88.46133,41.37824],[-88.45642,41.37829],[-88.45213,41.37835],[-88.447,41.37841],[-88.44577,41.37845],[-88.44415,41.37858],[-88.44303,41.37874],[-88.44283,41.37876],[-88.44135,41.37906],[-88.44032,41.37933],[-88.43917,41.37966],[-88.43837,41.37994],[-88.43691,41.3805],[-88.43576,41.38104],[-88.43486,41.38151],[-88.43363,41.38222],[-88.43339,41.38235],[-88.43212,41.38306],[-88.43038,41.38403],[-88.4299,41.3843],[-88.42778,41.3855],[-88.42764,41.38558],[-88.42696,41.38596],[-88.42634,41.38629],[-88.42615,41.3864],[-88.41953,41.39015],[-88.418,41.391],[-88.41748,41.39128],[-88.41388,41.39333],[-88.41287,41.3939],[-88.41167,41.39457],[-88.4068,41.3973],[-88.40507,41.3983],[-88.40444,41.39864],[-88.40366,41.39907],[-88.40227,41.39988],[-88.40152,41.40028],[-88.40095,41.40061],[-88.40054,41.40084],[-88.40021,41.40102],[-88.40009,41.40109],[-88.39986,41.40122],[-88.39978,41.40126],[-88.39969,41.40131],[-88.39953,41.4014],[-88.39936,41.4015],[-88.39681,41.40294],[-88.39285,41.40517],[-88.39002,41.40676],[-88.38766,41.40807],[-88.38589,41.40907],[-88.3842,41.41004],[-88.38216,41.41117],[-88.3773,41.41392],[-88.37426,41.41565],[-88.37213,41.41684],[-88.37053,41.41775],[-88.36765,41.41939],[-88.3655,41.42054],[-88.36289,41.42205],[-88.36155,41.42281],[-88.36071,41.42328],[-88.35947,41.42398],[-88.35778,41.42493],[-88.35498,41.4265],[-88.35215,41.42808],[-88.35116,41.42862],[-88.35092,41.42876],[-88.35057,41.42896],[-88.34998,41.42929],[-88.34958,41.42955],[-88.34887,41.43],[-88.34779,41.4307],[-88.3471,41.43122],[-88.34603,41.43203],[-88.34413,41.43351],[-88.34282,41.43451],[-88.34157,41.43543],[-88.33998,41.43669],[-88.33825,41.43804],[-88.33747,41.43863],[-88.33208,41.44278],[-88.33065,41.44388],[-88.32992,41.44443],[-88.32698,41.44671],[-88.32381,41.44914],[-88.32069,41.45156],[-88.31794,41.45369],[-88.31766,41.45388],[-88.31748,41.45405],[-88.31673,41.45462],[-88.31634,41.45491],[-88.31557,41.45549],[-88.31442,41.45631],[-88.31355,41.45683],[-88.31298,41.45718],[-88.31261,41.45738],[-88.31167,41.4579],[-88.3102,41.45858],[-88.30973,41.45879],[-88.30903,41.4591],[-88.30761,41.45961],[-88.30748,41.45966],[-88.30734,41.45971],[-88.30653,41.45998],[-88.3058,41.46019],[-88.30523,41.46035],[-88.30496,41.46042],[-88.30412,41.46063],[-88.30296,41.46087],[-88.30211,41.46105],[-88.30061,41.46127],[-88.29992,41.46135],[-88.29939,41.46141],[-88.29772,41.46153],[-88.29644,41.46159],[-88.29427,41.46164],[-88.28788,41.46181],[-88.28405,41.46189],[-88.28114,41.46198],[-88.27889,41.46204],[-88.27854,41.46204],[-88.27374,41.46216],[-88.27332,41.46217],[-88.27193,41.4622],[-88.27123,41.46222],[-88.26794,41.46229],[-88.26647,41.46233],[-88.26497,41.46236],[-88.25971,41.46249],[-88.25601,41.46257],[-88.25471,41.46262],[-88.25388,41.46267],[-88.25321,41.46273],[-88.2525,41.46284],[-88.25205,41.46292],[-88.2512,41.46311],[-88.25043,41.46332],[-88.24945,41.46364],[-88.24827,41.46412],[-88.24741,41.46455],[-88.24669,41.46496],[-88.24583,41.46553],[-88.24501,41.46616],[-88.24446,41.46666],[-88.24379,41.46735],[-88.24035,41.47083],[-88.2358,41.47547],[-88.23015,41.48119],[-88.22941,41.48194],[-88.22838,41.48275],[-88.22774,41.4832],[-88.22699,41.48364],[-88.22604,41.48411],[-88.22505,41.48454],[-88.22413,41.48485],[-88.22315,41.48512],[-88.22201,41.48536],[-88.22094,41.48551],[-88.21965,41.48562],[-88.21866,41.48563],[-88.2119,41.48571],[-88.21081,41.48572],[-88.20546,41.4858],[-88.20522,41.4858],[-88.20393,41.48588],[-88.20344,41.48591],[-88.20249,41.48598],[-88.19998,41.48615],[-88.19803,41.4862],[-88.19684,41.48622],[-88.19677,41.48623],[-88.1962,41.48625],[-88.19307,41.48632],[-88.18807,41.48643],[-88.18652,41.48646],[-88.18611,41.48647],[-88.18337,41.48652],[-88.18133,41.4866],[-88.17974,41.48672],[-88.17819,41.48696],[-88.17681,41.48724],[-88.17522,41.48765],[-88.17371,41.48814],[-88.17268,41.48855],[-88.17162,41.48903],[-88.17145,41.48912],[-88.17057,41.48958],[-88.16973,41.49006],[-88.16878,41.49067],[-88.16747,41.49164],[-88.16708,41.49195],[-88.16594,41.49293],[-88.16299,41.49536],[-88.16061,41.49735],[-88.15785,41.49962],[-88.15522,41.5018],[-88.15279,41.50379],[-88.15164,41.50464],[-88.15023,41.50557],[-88.14866,41.5065],[-88.14696,41.50735],[-88.14547,41.50802],[-88.14404,41.50859],[-88.14381,41.50867],[-88.14329,41.50885],[-88.14207,41.50925],[-88.14043,41.50972],[-88.13914,41.51002],[-88.13747,41.51036],[-88.13613,41.51056],[-88.13468,41.51074],[-88.13384,41.51082],[-88.13341,41.51086],[-88.13215,41.51093],[-88.13044,41.51099],[-88.12806,41.51106],[-88.12503,41.51114],[-88.1248,41.51115],[-88.12356,41.51118],[-88.1199,41.51128],[-88.1195,41.51129],[-88.11518,41.51142],[-88.11496,41.51143],[-88.11446,41.51144],[-88.11181,41.51151],[-88.1094,41.51157],[-88.10638,41.51169],[-88.10417,41.51176],[-88.10271,41.51179],[-88.10206,41.51185],[-88.10093,41.51217],[-88.10034,41.5123],[-88.0999,41.51243],[-88.09909,41.51262],[-88.09879,41.51267],[-88.09814,41.51277],[-88.09705,41.51277],[-88.09578,41.51262],[-88.09515,41.5124],[-88.09483,41.51232],[-88.09351,41.51195],[-88.0903,41.51118],[-88.08987,41.51108],[-88.08952,41.51102],[-88.08918,41.51097],[-88.08881,41.51093],[-88.08844,41.51091],[-88.08798,41.5109],[-88.08759,41.51092],[-88.0872,41.51095],[-88.08631,41.51105],[-88.08243,41.51159],[-88.08227,41.51161],[-88.08163,41.5117],[-88.08142,41.51173],[-88.08002,41.51194],[-88.07827,41.51217],[-88.07673,41.51237],[-88.07592,41.51248],[-88.07491,41.51265],[-88.07326,41.51287],[-88.07266,41.51294],[-88.0714,41.51305],[-88.0699,41.51309],[-88.06479,41.51321],[-88.0637,41.51322],[-88.06291,41.5132],[-88.06226,41.51317],[-88.06008,41.51296],[-88.05879,41.51283],[-88.05747,41.51274],[-88.05622,41.51274],[-88.04799,41.51291],[-88.03641,41.51315],[-88.03226,41.51321],[-88.02154,41.51344],[-88.01019,41.51367],[-88.0038,41.5138],[-88.00217,41.51395],[-88.0007,41.51417],[-87.99941,41.51451],[-87.99835,41.51487],[-87.9971,41.51539],[-87.99671,41.51559],[-87.99589,41.51603],[-87.99518,41.51646],[-87.99437,41.51707],[-87.99421,41.5172],[-87.99359,41.51771],[-87.99273,41.51863],[-87.99222,41.5193],[-87.99202,41.5196],[-87.99184,41.51986],[-87.99167,41.52011],[-87.99113,41.52109],[-87.99099,41.52142],[-87.99083,41.52184],[-87.99061,41.52256],[-87.98995,41.52483],[-87.98969,41.52582],[-87.98927,41.52674],[-87.98872,41.5276],[-87.98819,41.52836],[-87.98754,41.52916],[-87.98683,41.5299],[-87.98613,41.5305],[-87.98525,41.5312],[-87.98421,41.53188],[-87.98312,41.53248],[-87.982,41.53299],[-87.98099,41.53339],[-87.98002,41.53371],[-87.97864,41.53406],[-87.97527,41.53485],[-87.97003,41.53605],[-87.96893,41.53629],[-87.96412,41.53739],[-87.95851,41.53871],[-87.95342,41.53985],[-87.95056,41.54051],[-87.94713,41.5413],[-87.94,41.54292],[-87.93269,41.54462],[-87.93181,41.54483],[-87.92681,41.54597],[-87.92548,41.54632],[-87.92411,41.54677],[-87.92299,41.54721],[-87.92167,41.5478],[-87.91725,41.54993],[-87.91568,41.55066],[-87.91454,41.55108],[-87.9132,41.5515],[-87.91178,41.5518],[-87.91056,41.55196],[-87.90994,41.552],[-87.90941,41.55204],[-87.90638,41.55206],[-87.89874,41.55219],[-87.89351,41.55226],[-87.89047,41.5523],[-87.88309,41.55243],[-87.87646,41.55252],[-87.86952,41.55262],[-87.86235,41.55273],[-87.86177,41.55274],[-87.85651,41.55283],[-87.85373,41.55288],[-87.85231,41.55288],[-87.84733,41.55297],[-87.84632,41.55297],[-87.8429,41.55302],[-87.83825,41.55306],[-87.83635,41.55304],[-87.83521,41.553],[-87.8339,41.55291],[-87.83228,41.5527],[-87.83088,41.55241],[-87.82954,41.55208],[-87.8268,41.55125],[-87.8257,41.55096],[-87.82471,41.55076],[-87.82325,41.55057],[-87.82216,41.5505],[-87.82101,41.55048],[-87.81601,41.55057],[-87.8072,41.5507],[-87.79923,41.5508],[-87.79878,41.55081],[-87.79316,41.55089],[-87.79149,41.55092],[-87.79057,41.55093],[-87.78463,41.55101],[-87.78233,41.55104],[-87.78096,41.55106],[-87.77986,41.55112],[-87.77864,41.55122],[-87.77754,41.55137],[-87.77596,41.55166],[-87.77437,41.55205],[-87.77285,41.55254],[-87.7713,41.55314],[-87.76933,41.55404],[-87.76528,41.55586],[-87.75964,41.55837],[-87.75503,41.56045],[-87.75141,41.56209],[-87.7504,41.56253],[-87.74959,41.56284],[-87.74729,41.56354],[-87.74659,41.56372],[-87.74494,41.56416],[-87.74448,41.56431],[-87.7436,41.56461],[-87.74266,41.56507],[-87.74185,41.56556],[-87.74066,41.56645],[-87.73988,41.56698],[-87.73898,41.56751],[-87.73764,41.56825],[-87.73706,41.56851],[-87.73561,41.56915],[-87.73417,41.56982],[-87.73273,41.57044],[-87.73071,41.57136],[-87.72898,41.57214],[-87.72702,41.573],[-87.72143,41.57549],[-87.71668,41.57763],[-87.7117,41.57987],[-87.70973,41.58075],[-87.70869,41.58117],[-87.70756,41.5816],[-87.70682,41.58183],[-87.70613,41.58203],[-87.70525,41.58224],[-87.70451,41.5824],[-87.70373,41.58255],[-87.70285,41.58269],[-87.70193,41.58279],[-87.7001,41.58291],[-87.69906,41.58293],[-87.69478,41.58294],[-87.6941,41.58294],[-87.68894,41.58296],[-87.68813,41.58296],[-87.68756,41.58294],[-87.68705,41.58291],[-87.68655,41.58287],[-87.68532,41.58268],[-87.68453,41.58254],[-87.68412,41.58249],[-87.68335,41.5823],[-87.68288,41.58217],[-87.68221,41.58197],[-87.68164,41.58176],[-87.68103,41.58153],[-87.68056,41.58132],[-87.68007,41.58111],[-87.67954,41.58083],[-87.67907,41.58058],[-87.67794,41.57989],[-87.67742,41.57958],[-87.67714,41.57943],[-87.67678,41.57924],[-87.6764,41.57906],[-87.67583,41.57881],[-87.67529,41.57862],[-87.67441,41.57834],[-87.67384,41.57821],[-87.67327,41.57809],[-87.67249,41.57797],[-87.67178,41.5779],[-87.67101,41.57786],[-87.66989,41.57786],[-87.66866,41.57787],[-87.66677,41.57789],[-87.6658,41.57791],[-87.66515,41.57796],[-87.66471,41.578],[-87.66125,41.57799],[-87.65465,41.57805],[-87.65025,41.57807],[-87.6465,41.57809],[-87.64572,41.57809],[-87.64566,41.57809],[-87.636,41.57815],[-87.6335,41.57824],[-87.62828,41.57913],[-87.62777,41.57917],[-87.62657,41.57928],[-87.62416,41.57934],[-87.6202,41.57934],[-87.61133,41.57936],[-87.60597,41.57938],[-87.6048,41.57934],[-87.60376,41.57926],[-87.60271,41.57913],[-87.60158,41.57895],[-87.59977,41.57869],[-87.59911,41.57859],[-87.59691,41.57827],[-87.59569,41.57812],[-87.59546,41.57808],[-87.59458,41.57796],[-87.59325,41.57778],[-87.59214,41.57767],[-87.59124,41.57762],[-87.59049,41.5776],[-87.58963,41.57759],[-87.5886,41.5776],[-87.58753,41.5776],[-87.58485,41.57761],[-87.58181,41.57762],[-87.58114,41.57762],[-87.57995,41.57762],[-87.57833,41.57763],[-87.57655,41.57763],[-87.57127,41.57764],[-87.56823,41.57765],[-87.56503,41.57765],[-87.56225,41.57764],[-87.5579,41.57765],[-87.55111,41.57766],[-87.5487,41.57766],[-87.54758,41.57766],[-87.54462,41.57766],[-87.54288,41.57766],[-87.54167,41.57767],[-87.53975,41.57768],[-87.53902,41.57769],[-87.53694,41.57769],[-87.53308,41.5777],[-87.53206,41.57769],[-87.53132,41.57769],[-87.53058,41.57766],[-87.52991,41.57762],[-87.5292,41.57756],[-87.52854,41.57749],[-87.52797,41.57742],[-87.5271,41.57728],[-87.52638,41.57715],[-87.52589,41.57705],[-87.52536,41.57693],[-87.52503,41.57685],[-87.52455,41.57673],[-87.52385,41.57654],[-87.52273,41.57624],[-87.52187,41.576],[-87.52004,41.5755],[-87.51798,41.57493],[-87.51765,41.57485],[-87.51712,41.57472],[-87.51663,41.57461],[-87.51597,41.57447],[-87.51518,41.57433],[-87.51404,41.57418],[-87.51331,41.5741],[-87.51264,41.57404],[-87.51197,41.57399],[-87.51127,41.57396],[-87.51067,41.57395],[-87.50987,41.57395],[-87.50853,41.57397],[-87.50679,41.57398],[-87.5049,41.57398],[-87.50002,41.57403],[-87.49151,41.57412],[-87.48592,41.57413],[-87.48554,41.57413],[-87.48545,41.57413],[-87.48328,41.57415],[-87.48239,41.57414],[-87.48161,41.57413],[-87.48079,41.57412],[-87.47948,41.57411],[-87.47435,41.57408],[-87.46937,41.57405],[-87.4671,41.57405],[-87.46629,41.57404],[-87.45854,41.57401],[-87.45683,41.57398],[-87.45128,41.57396],[-87.4506,41.57395],[-87.44994,41.57392],[-87.44927,41.57389],[-87.44861,41.57383],[-87.44799,41.57377],[-87.44733,41.57369],[-87.44659,41.57358],[-87.44603,41.57348],[-87.44527,41.57333],[-87.44459,41.57318],[-87.44397,41.57303],[-87.44346,41.57289],[-87.44284,41.5727],[-87.4419,41.5724],[-87.44097,41.57206],[-87.44019,41.57176],[-87.43946,41.5715],[-87.43872,41.57125],[-87.43803,41.57104],[-87.43732,41.57084],[-87.43658,41.57065],[-87.43578,41.57047],[-87.43512,41.57034],[-87.43429,41.5702],[-87.43344,41.57008],[-87.43297,41.57003],[-87.43244,41.56997],[-87.43193,41.56993],[-87.43112,41.56989],[-87.43041,41.56986],[-87.42858,41.56985],[-87.42743,41.56985],[-87.42436,41.56985],[-87.42226,41.56984],[-87.41961,41.56984],[-87.41592,41.56983],[-87.41261,41.56981],[-87.4108,41.5698],[-87.40602,41.56979],[-87.39983,41.56976],[-87.39738,41.56974],[-87.39182,41.5697],[-87.38488,41.56966],[-87.37776,41.56962],[-87.37113,41.56959],[-87.36578,41.56955],[-87.36367,41.56955],[-87.36292,41.56954],[-87.36194,41.5695],[-87.3612,41.56947],[-87.36038,41.56942],[-87.35969,41.56937],[-87.35857,41.56926],[-87.358,41.56919],[-87.35726,41.5691],[-87.35641,41.56899],[-87.35553,41.56885],[-87.35412,41.56862],[-87.3527,41.56838],[-87.35068,41.56804],[-87.34988,41.56793],[-87.3492,41.56783],[-87.34806,41.56768],[-87.34689,41.56757],[-87.34602,41.5675],[-87.3451,41.56744],[-87.34422,41.56741],[-87.34349,41.56738],[-87.34104,41.56737],[-87.33816,41.56736],[-87.33596,41.56734],[-87.33202,41.56733],[-87.32917,41.5673],[-87.32451,41.56727],[-87.31942,41.56723],[-87.31757,41.56724],[-87.3165,41.56724],[-87.31542,41.56723],[-87.31424,41.56724],[-87.3134,41.56726],[-87.31227,41.56732],[-87.31151,41.56736],[-87.31046,41.56745],[-87.30961,41.56753],[-87.30886,41.56761],[-87.30783,41.56774],[-87.30676,41.5679],[-87.30562,41.56809],[-87.30476,41.56826],[-87.30302,41.56858],[-87.29975,41.56919],[-87.29657,41.5698],[-87.29268,41.57053],[-87.29248,41.57057],[-87.29192,41.57067],[-87.29049,41.57095],[-87.28767,41.57148],[-87.28428,41.57211],[-87.28334,41.57228],[-87.28254,41.57244],[-87.27913,41.57308],[-87.27829,41.57324],[-87.27415,41.57402],[-87.27216,41.57438],[-87.26829,41.57513],[-87.26638,41.57551],[-87.26478,41.57586],[-87.26357,41.57613],[-87.26236,41.57642],[-87.26086,41.5768],[-87.25967,41.57713],[-87.25841,41.57749],[-87.25693,41.57792],[-87.2546,41.57863],[-87.25158,41.57955],[-87.24737,41.58083],[-87.24489,41.58157],[-87.24115,41.58271],[-87.24007,41.58303],[-87.23678,41.58403],[-87.23567,41.58438],[-87.23466,41.58463],[-87.23253,41.58533],[-87.23062,41.58617],[-87.23043,41.58623],[-87.23027,41.58625],[-87.23008,41.58624],[-87.2299,41.5862],[-87.22975,41.58613],[-87.22961,41.58603],[-87.22951,41.58589],[-87.22947,41.58575],[-87.22947,41.58559],[-87.22953,41.58542],[-87.22962,41.58531],[-87.22976,41.58522],[-87.22992,41.58515],[-87.23011,41.58511],[-87.23029,41.5851],[-87.23047,41.58513],[-87.23063,41.58519],[-87.2308,41.5853],[-87.23093,41.58544],[-87.23117,41.58575],[-87.2317,41.58643],[-87.23205,41.58691],[-87.23229,41.58734],[-87.23244,41.58766],[-87.23257,41.58801],[-87.23295,41.58904],[-87.23312,41.58949],[-87.23356,41.59072],[-87.23361,41.59098],[-87.23362,41.59114],[-87.23359,41.59128],[-87.23354,41.59138],[-87.23344,41.59148],[-87.23331,41.59158],[-87.23238,41.59212],[-87.23222,41.5922],[-87.23205,41.59226],[-87.23187,41.59229],[-87.23169,41.5923],[-87.23148,41.59228],[-87.23076,41.59211],[-87.23009,41.59194],[-87.22968,41.59188],[-87.22911,41.5917],[-87.2285,41.5915],[-87.22782,41.59127],[-87.22627,41.59076],[-87.22149,41.58918],[-87.21894,41.58833],[-87.21774,41.58795],[-87.21692,41.58771],[-87.216,41.58745],[-87.21508,41.58723],[-87.21432,41.58706],[-87.21354,41.58691],[-87.21261,41.58675],[-87.21192,41.58666],[-87.21105,41.58655],[-87.21034,41.58648],[-87.20877,41.58633],[-87.20733,41.58619],[-87.2066,41.58611],[-87.20599,41.58602],[-87.2054,41.58591],[-87.20491,41.58579],[-87.20439,41.58563],[-87.20386,41.58543],[-87.20346,41.58525],[-87.20294,41.585],[-87.20256,41.58477],[-87.20227,41.58459],[-87.2021,41.58448],[-87.20116,41.5838],[-87.20066,41.58343],[-87.19995,41.58293],[-87.19948,41.58263],[-87.19907,41.58239],[-87.19866,41.58218],[-87.19827,41.58201],[-87.19789,41.58185],[-87.19754,41.58173],[-87.19721,41.58162],[-87.19657,41.58146],[-87.19603,41.58135],[-87.19542,41.58125],[-87.19456,41.58114],[-87.19217,41.58088],[-87.19018,41.58067],[-87.1887,41.58053],[-87.18742,41.58042],[-87.18616,41.58033],[-87.18475,41.58025],[-87.18367,41.5802],[-87.18297,41.58017],[-87.18191,41.58014],[-87.17994,41.5801],[-87.17696,41.58006],[-87.17385,41.57999],[-87.17306,41.57998],[-87.16884,41.57994],[-87.16839,41.57993],[-87.16717,41.57991],[-87.16671,41.5799],[-87.16601,41.57985],[-87.16546,41.57979],[-87.16489,41.57972],[-87.16441,41.57964],[-87.16387,41.57954],[-87.16329,41.5794],[-87.1628,41.57928],[-87.16231,41.57913],[-87.16176,41.57895],[-87.16127,41.57877],[-87.16076,41.57856],[-87.16033,41.57837],[-87.15978,41.5781],[-87.1593,41.57785],[-87.15883,41.57757],[-87.1585,41.57736],[-87.15805,41.57705],[-87.15767,41.57676],[-87.15723,41.57641],[-87.15688,41.57613],[-87.15634,41.57568],[-87.15604,41.57544],[-87.15561,41.57508],[-87.15515,41.5747],[-87.15472,41.57437],[-87.15431,41.57406],[-87.15386,41.57376],[-87.15343,41.5735],[-87.15298,41.57326],[-87.15264,41.57309],[-87.15232,41.57295],[-87.15195,41.57279],[-87.15137,41.57258],[-87.15083,41.57241],[-87.1502,41.57225],[-87.14953,41.5721],[-87.14888,41.572],[-87.14828,41.57193],[-87.14774,41.5719],[-87.14708,41.57188],[-87.14634,41.57187],[-87.13975,41.57185],[-87.1339,41.57183],[-87.13157,41.57183],[-87.13091,41.57184],[-87.13055,41.57186],[-87.13023,41.57188],[-87.12966,41.57194],[-87.12907,41.57203],[-87.12868,41.5721],[-87.12811,41.57223],[-87.1276,41.57237],[-87.12711,41.57252],[-87.12647,41.57275],[-87.12601,41.57295],[-87.12564,41.57313],[-87.12523,41.57333],[-87.12472,41.57362],[-87.12413,41.57399],[-87.12228,41.57517],[-87.12162,41.57559],[-87.12086,41.57607],[-87.12033,41.57639],[-87.11989,41.57665],[-87.11932,41.57695],[-87.11882,41.57719],[-87.11818,41.57747],[-87.11756,41.5777],[-87.11701,41.57788],[-87.11646,41.57804],[-87.11583,41.5782],[-87.11521,41.57834],[-87.11458,41.57845],[-87.11401,41.57853],[-87.1133,41.5786],[-87.11263,41.57865],[-87.11179,41.57868],[-87.1109,41.57868],[-87.10543,41.57869],[-87.10499,41.57869],[-87.10367,41.57869],[-87.10237,41.5787],[-87.10124,41.57873],[-87.09996,41.57877],[-87.09817,41.57885],[-87.09711,41.57891],[-87.09608,41.57899],[-87.09514,41.57905],[-87.09321,41.57921],[-87.09203,41.57929],[-87.09109,41.57934],[-87.08942,41.57941],[-87.08793,41.57946],[-87.08636,41.57949],[-87.08485,41.57949],[-87.07651,41.57942],[-87.07502,41.5794],[-87.07401,41.57935],[-87.0735,41.57931],[-87.07292,41.57925],[-87.07219,41.57915],[-87.07147,41.57902],[-87.07081,41.57888],[-87.07016,41.57873],[-87.06956,41.57856],[-87.06865,41.57826],[-87.06789,41.57799],[-87.06425,41.57661],[-87.06359,41.57637],[-87.06267,41.57605],[-87.06171,41.57576],[-87.06073,41.57549],[-87.06008,41.57533],[-87.05946,41.57519],[-87.05846,41.57498],[-87.05745,41.57481],[-87.05656,41.57468],[-87.05529,41.57451],[-87.05326,41.57424],[-87.05008,41.57381],[-87.04655,41.57333],[-87.04278,41.57283],[-87.0415,41.57265],[-87.03962,41.57241],[-87.03883,41.57232],[-87.03753,41.57219],[-87.03652,41.5721],[-87.03552,41.57201],[-87.03427,41.57192],[-87.03188,41.57178],[-87.02991,41.5717],[-87.02873,41.57167],[-87.02082,41.57156],[-87.01864,41.57152],[-87.01814,41.57151],[-87.01265,41.57143],[-87.00888,41.57137],[-87.00754,41.57133],[-87.00663,41.57129],[-87.00576,41.57125],[-87.00479,41.5712],[-87.00388,41.57114],[-87.00315,41.57109],[-87.00194,41.57099],[-87.00071,41.57088],[-86.9992,41.57073],[-86.99878,41.57069],[-86.99747,41.57057],[-86.99689,41.57052],[-86.99629,41.57048],[-86.99553,41.57043],[-86.99454,41.57039],[-86.99358,41.57036],[-86.99281,41.57035],[-86.99182,41.57035],[-86.99095,41.57037],[-86.99016,41.57039],[-86.98947,41.57042],[-86.98906,41.57045],[-86.9882,41.57051],[-86.98735,41.57058],[-86.98645,41.57067],[-86.98548,41.57079],[-86.98454,41.57091],[-86.98367,41.57105],[-86.98294,41.57117],[-86.98204,41.57134],[-86.98117,41.57151],[-86.97662,41.57246],[-86.97384,41.57304],[-86.96915,41.57402],[-86.96797,41.57427],[-86.96682,41.57454],[-86.96564,41.57481],[-86.96448,41.5751],[-86.96351,41.57536],[-86.96226,41.57571],[-86.96107,41.57605],[-86.95984,41.57642],[-86.95869,41.57678],[-86.9576,41.57713],[-86.95667,41.57746],[-86.95589,41.57772],[-86.95515,41.57799],[-86.95426,41.57832],[-86.95349,41.57861],[-86.95248,41.57901],[-86.95052,41.57979],[-86.94679,41.58131],[-86.94583,41.58169],[-86.94507,41.582],[-86.9441,41.58237],[-86.94319,41.58269],[-86.94233,41.58299],[-86.94159,41.58323],[-86.94061,41.58352],[-86.93957,41.58381],[-86.93872,41.58403],[-86.93758,41.5843],[-86.93641,41.58455],[-86.93539,41.58474],[-86.93421,41.58494],[-86.93308,41.5851],[-86.93011,41.58552],[-86.91991,41.58696],[-86.91123,41.58818],[-86.91022,41.58833],[-86.90876,41.58855],[-86.90798,41.58868],[-86.90635,41.58896],[-86.90007,41.59001],[-86.89901,41.59019],[-86.896,41.5907],[-86.8924,41.59131],[-86.88917,41.59186],[-86.88007,41.59338],[-86.87567,41.59412],[-86.87484,41.59427],[-86.87398,41.59444],[-86.87315,41.59464],[-86.87237,41.59487],[-86.87143,41.59519],[-86.87069,41.59548],[-86.8699,41.59583],[-86.86918,41.59619],[-86.86845,41.59662],[-86.86773,41.59708],[-86.86709,41.59755],[-86.86658,41.59796],[-86.86617,41.59833],[-86.86576,41.59872],[-86.86544,41.59905],[-86.86478,41.59976],[-86.86442,41.60015],[-86.86343,41.60122],[-86.86264,41.60205],[-86.86177,41.60297],[-86.86131,41.60343],[-86.86082,41.60387],[-86.86028,41.60432],[-86.85973,41.60474],[-86.85919,41.60512],[-86.85855,41.60554],[-86.85786,41.60596],[-86.8572,41.60632],[-86.85664,41.60662],[-86.85599,41.60692],[-86.85538,41.60719],[-86.85472,41.60746],[-86.8542,41.60766],[-86.85352,41.60789],[-86.85284,41.60811],[-86.84824,41.60951],[-86.84565,41.61031],[-86.84086,41.61179],[-86.83727,41.61288],[-86.83687,41.613],[-86.83414,41.61384],[-86.83081,41.61486],[-86.82803,41.61571],[-86.8255,41.6165],[-86.82333,41.61716],[-86.82066,41.61798],[-86.81358,41.62015],[-86.81018,41.62119],[-86.80852,41.6217],[-86.80753,41.62201],[-86.80666,41.62232],[-86.80577,41.62266],[-86.80484,41.62302],[-86.80382,41.62348],[-86.80301,41.62389],[-86.80225,41.62429],[-86.80135,41.62481],[-86.8005,41.62534],[-86.79973,41.62586],[-86.79904,41.62636],[-86.79847,41.6268],[-86.79786,41.62731],[-86.79735,41.62774],[-86.79683,41.62822],[-86.79596,41.62905],[-86.7956,41.62941],[-86.79476,41.63018],[-86.79398,41.63088],[-86.79298,41.63175],[-86.79188,41.63267],[-86.79112,41.63328],[-86.79008,41.6341],[-86.78925,41.63473],[-86.78841,41.63535],[-86.78762,41.63592],[-86.78681,41.63649],[-86.78592,41.63708],[-86.78465,41.63793],[-86.7827,41.63922],[-86.7819,41.63974],[-86.78102,41.64036],[-86.7803,41.64089],[-86.77958,41.64145],[-86.77882,41.64207],[-86.77808,41.6427],[-86.77741,41.64331],[-86.77682,41.64387],[-86.77603,41.64466],[-86.77225,41.64843],[-86.7717,41.64895],[-86.77122,41.6494],[-86.77034,41.65018],[-86.76954,41.65083],[-86.76898,41.65127],[-86.76846,41.65167],[-86.76775,41.65219],[-86.76727,41.65253],[-86.76628,41.65319],[-86.76533,41.65378],[-86.76465,41.65419],[-86.76362,41.65476],[-86.7631,41.65504],[-86.76187,41.65568],[-86.76109,41.65606],[-86.76032,41.65641],[-86.75904,41.65696],[-86.75765,41.65751],[-86.75642,41.65794],[-86.75519,41.65835],[-86.75386,41.65875],[-86.752,41.65926],[-86.75109,41.65952],[-86.7494,41.66],[-86.74769,41.66048],[-86.74398,41.66153],[-86.74217,41.66208],[-86.7404,41.66264],[-86.73891,41.66315],[-86.7386,41.66326],[-86.73713,41.66379],[-86.73638,41.66408],[-86.7355,41.66442],[-86.7346,41.66478],[-86.732,41.66589],[-86.7306,41.66648],[-86.72707,41.66799],[-86.72617,41.66838],[-86.72522,41.66877],[-86.72432,41.66913],[-86.72326,41.66953],[-86.72224,41.66991],[-86.72125,41.67025],[-86.72041,41.67053],[-86.71976,41.67073],[-86.71915,41.67093],[-86.71777,41.67135],[-86.71674,41.67163],[-86.7154,41.67199],[-86.71401,41.67233],[-86.71255,41.67266],[-86.71155,41.67287],[-86.71065,41.67305],[-86.7098,41.6732],[-86.70872,41.67338],[-86.70784,41.67353],[-86.70689,41.67367],[-86.70591,41.6738],[-86.70497,41.67392],[-86.70381,41.67404],[-86.70305,41.67412],[-86.70217,41.6742],[-86.70129,41.67427],[-86.70004,41.67434],[-86.69961,41.67437],[-86.69877,41.67441],[-86.69806,41.67444],[-86.69712,41.67447],[-86.69611,41.67448],[-86.69526,41.67449],[-86.69442,41.67448],[-86.69354,41.67447],[-86.69261,41.67444],[-86.69162,41.6744],[-86.69048,41.67435],[-86.68913,41.67427],[-86.68554,41.67406],[-86.68273,41.6739],[-86.67991,41.67373],[-86.67813,41.67363],[-86.67725,41.67359],[-86.67645,41.67359],[-86.67577,41.67362],[-86.67504,41.67369],[-86.67429,41.67383],[-86.67359,41.67401],[-86.67279,41.67426],[-86.6722,41.67448],[-86.67155,41.6748],[-86.67095,41.67513],[-86.67043,41.67549],[-86.66996,41.67585],[-86.66958,41.67619],[-86.66925,41.67651],[-86.66868,41.67712],[-86.66721,41.67876],[-86.66678,41.67921],[-86.66622,41.67978],[-86.66577,41.68021],[-86.66525,41.68065],[-86.66464,41.68112],[-86.66408,41.68154],[-86.66333,41.68203],[-86.66254,41.68251],[-86.66195,41.68284],[-86.66127,41.68319],[-86.66047,41.68356],[-86.65965,41.6839],[-86.65293,41.68647],[-86.65163,41.68697],[-86.65074,41.68733],[-86.64986,41.68772],[-86.64906,41.6881],[-86.64825,41.68851],[-86.64747,41.68893],[-86.64673,41.68937],[-86.64591,41.68989],[-86.64516,41.69041],[-86.64446,41.69092],[-86.6438,41.69144],[-86.64286,41.69222],[-86.6415,41.69337],[-86.63913,41.69537],[-86.63804,41.69629],[-86.63723,41.69692],[-86.63649,41.69748],[-86.63554,41.69813],[-86.63488,41.69858],[-86.63402,41.69913],[-86.63335,41.69953],[-86.6328,41.69985],[-86.63213,41.70023],[-86.6308,41.70094],[-86.62968,41.70154],[-86.62892,41.70193],[-86.62791,41.70248],[-86.62725,41.70285],[-86.62622,41.70347],[-86.62568,41.70382],[-86.62489,41.70434],[-86.62439,41.70468],[-86.62369,41.70519],[-86.62312,41.70561],[-86.62247,41.70611],[-86.62157,41.70685],[-86.62056,41.70768],[-86.61924,41.70875],[-86.61642,41.71105],[-86.61361,41.71337],[-86.61201,41.71475],[-86.61117,41.71551],[-86.61002,41.7166],[-86.60953,41.71707],[-86.60478,41.72178],[-86.60408,41.72247],[-86.60373,41.7228],[-86.60335,41.72312],[-86.60298,41.72341],[-86.60252,41.72375],[-86.60203,41.72407],[-86.60157,41.72434],[-86.60103,41.72464],[-86.60051,41.7249],[-86.59986,41.72518],[-86.59934,41.7254],[-86.59877,41.7256],[-86.59821,41.72577],[-86.59767,41.72592],[-86.59711,41.72606],[-86.59651,41.72619],[-86.59595,41.72628],[-86.59535,41.72636],[-86.59476,41.72643],[-86.59419,41.72647],[-86.59361,41.7265],[-86.59301,41.72651],[-86.58367,41.72665],[-86.58326,41.72665],[-86.57938,41.72671],[-86.57543,41.72677],[-86.5744,41.7268],[-86.57335,41.72687],[-86.57219,41.72698],[-86.57118,41.72712],[-86.57031,41.72726],[-86.56956,41.7274],[-86.56878,41.72756],[-86.56801,41.72775],[-86.56725,41.72795],[-86.56648,41.72818],[-86.56544,41.72851],[-86.56449,41.72886],[-86.56382,41.72913],[-86.56312,41.72944],[-86.56066,41.73052],[-86.55995,41.73084],[-86.5592,41.73115],[-86.55847,41.73144],[-86.55774,41.73171],[-86.55711,41.73192],[-86.55621,41.73221],[-86.55545,41.73243],[-86.55472,41.73262],[-86.5539,41.73282],[-86.55308,41.733],[-86.55223,41.73316],[-86.55117,41.73333],[-86.55017,41.73348],[-86.54887,41.73368],[-86.54777,41.73389],[-86.54676,41.73411],[-86.54599,41.7343],[-86.54528,41.7345],[-86.54449,41.73473],[-86.54378,41.73496],[-86.54312,41.73519],[-86.54242,41.73545],[-86.54184,41.73568],[-86.54129,41.7359],[-86.54077,41.73613],[-86.53736,41.73765],[-86.53554,41.73847],[-86.53466,41.73885],[-86.53371,41.73925],[-86.53286,41.73958],[-86.53195,41.73992],[-86.53112,41.7402],[-86.53035,41.74046],[-86.52942,41.74074],[-86.52826,41.74107],[-86.52716,41.74136],[-86.52608,41.74161],[-86.52537,41.74177],[-86.52466,41.74191],[-86.52426,41.74199],[-86.52339,41.74215],[-86.52262,41.74228],[-86.52183,41.7424],[-86.52113,41.7425],[-86.52008,41.74262],[-86.519,41.74274],[-86.51786,41.74283],[-86.51679,41.74289],[-86.51603,41.74292],[-86.51531,41.74294],[-86.51433,41.74296],[-86.51147,41.74299],[-86.50926,41.74302],[-86.50749,41.74304],[-86.50689,41.74305],[-86.5064,41.74306],[-86.50575,41.74308],[-86.50513,41.74311],[-86.50455,41.74316],[-86.50393,41.74321],[-86.5033,41.74327],[-86.5027,41.74334],[-86.50219,41.7434],[-86.50142,41.74352],[-86.50067,41.74364],[-86.50016,41.74374],[-86.49961,41.74384],[-86.49908,41.74395],[-86.49856,41.74406],[-86.49782,41.74424],[-86.49733,41.74436],[-86.49682,41.7445],[-86.49591,41.74476],[-86.4954,41.74492],[-86.48928,41.74686],[-86.4855,41.74807],[-86.48086,41.74954],[-86.47671,41.75086],[-86.47319,41.75198],[-86.4691,41.75327],[-86.46678,41.754],[-86.46469,41.75467],[-86.46349,41.75503],[-86.46308,41.75515],[-86.46271,41.75524],[-86.46233,41.75533],[-86.46195,41.75541],[-86.46137,41.75552],[-86.46086,41.7556],[-86.46046,41.75566],[-86.45987,41.75573],[-86.45925,41.75578],[-86.45858,41.75582],[-86.45796,41.75584],[-86.45746,41.75584],[-86.45701,41.75583],[-86.45659,41.75581],[-86.45605,41.75578],[-86.45552,41.75574],[-86.45489,41.75567],[-86.45441,41.75561],[-86.4538,41.75551],[-86.45318,41.75539],[-86.45258,41.75526],[-86.45199,41.75511],[-86.45136,41.75493],[-86.45077,41.75474],[-86.45034,41.75459],[-86.44993,41.75443],[-86.4495,41.75426],[-86.44912,41.75409],[-86.44873,41.75392],[-86.44824,41.75367],[-86.44788,41.75349],[-86.44745,41.75325],[-86.447,41.75299],[-86.44493,41.7517],[-86.44408,41.75118],[-86.44379,41.75101],[-86.44349,41.75085],[-86.44296,41.75058],[-86.44254,41.75038],[-86.44224,41.75024],[-86.4417,41.75001],[-86.44122,41.74982],[-86.44085,41.74969],[-86.44048,41.74956],[-86.44002,41.74942],[-86.43949,41.74927],[-86.43897,41.74912],[-86.43845,41.749],[-86.43807,41.74892],[-86.4375,41.74881],[-86.43715,41.74876],[-86.43657,41.74867],[-86.43609,41.74861],[-86.43573,41.74858],[-86.43535,41.74854],[-86.43472,41.7485],[-86.43425,41.74849],[-86.43347,41.74848],[-86.42967,41.74847],[-86.42853,41.74847],[-86.42032,41.74847],[-86.41531,41.74847],[-86.4148,41.74846],[-86.41432,41.74845],[-86.41391,41.74843],[-86.41351,41.7484],[-86.41294,41.74836],[-86.41251,41.74832],[-86.41214,41.74828],[-86.41174,41.74823],[-86.41132,41.74817],[-86.41092,41.74811],[-86.4101,41.74796],[-86.40951,41.74784],[-86.40902,41.74773],[-86.40839,41.74757],[-86.40792,41.74744],[-86.40753,41.74733],[-86.4072,41.74722],[-86.4067,41.74706],[-86.40604,41.74682],[-86.40553,41.74663],[-86.40492,41.74637],[-86.40434,41.74611],[-86.40378,41.74584],[-86.40325,41.74557],[-86.40286,41.74535],[-86.40243,41.7451],[-86.40196,41.74482],[-86.40149,41.74451],[-86.40043,41.74379],[-86.39838,41.74236],[-86.3967,41.7412],[-86.39442,41.73961],[-86.39178,41.73779],[-86.3902,41.73669],[-86.38932,41.7361],[-86.38865,41.73568],[-86.38791,41.73524],[-86.38711,41.7348],[-86.38663,41.73455],[-86.38617,41.73431],[-86.38548,41.73398],[-86.38489,41.73371],[-86.38439,41.73349],[-86.38367,41.73319],[-86.38302,41.73294],[-86.38235,41.73269],[-86.38163,41.73244],[-86.381,41.73224],[-86.38023,41.732],[-86.37952,41.7318],[-86.37875,41.7316],[-86.37779,41.73137],[-86.37713,41.73122],[-86.3764,41.73108],[-86.3757,41.73096],[-86.37498,41.73084],[-86.37447,41.73077],[-86.37405,41.73071],[-86.37355,41.73065],[-86.373,41.73059],[-86.37225,41.73052],[-86.37175,41.73048],[-86.37134,41.73046],[-86.37048,41.73041],[-86.36978,41.73039],[-86.36892,41.73037],[-86.36426,41.73033],[-86.36074,41.73029],[-86.36048,41.73029],[-86.35881,41.73027],[-86.35577,41.73024],[-86.35314,41.73022],[-86.35102,41.73021],[-86.34795,41.73023],[-86.33886,41.73027],[-86.3299,41.7303],[-86.32306,41.73033],[-86.31449,41.73036],[-86.31398,41.73036],[-86.31337,41.73034],[-86.3128,41.73031],[-86.31222,41.73027],[-86.31162,41.73022],[-86.31105,41.73015],[-86.31053,41.73009],[-86.30981,41.72998],[-86.30926,41.72988],[-86.30861,41.72975],[-86.30796,41.7296],[-86.30734,41.72944],[-86.30681,41.72929],[-86.30612,41.72907],[-86.30559,41.72889],[-86.30507,41.7287],[-86.30464,41.72853],[-86.30401,41.72828],[-86.30348,41.72804],[-86.3028,41.72771],[-86.30249,41.72755],[-86.30202,41.72729],[-86.30146,41.72697],[-86.29876,41.72533],[-86.29818,41.72499],[-86.2976,41.72465],[-86.2972,41.72444],[-86.29678,41.72423],[-86.29637,41.72404],[-86.29594,41.72384],[-86.29549,41.72366],[-86.29505,41.72349],[-86.29462,41.72334],[-86.29407,41.72316],[-86.29356,41.72301],[-86.29309,41.72288],[-86.29251,41.72274],[-86.29202,41.72263],[-86.29166,41.72256],[-86.29124,41.72249],[-86.29086,41.72243],[-86.29017,41.72233],[-86.28977,41.72229],[-86.28926,41.72225],[-86.28877,41.72221],[-86.28834,41.72219],[-86.2878,41.72219],[-86.28705,41.72219],[-86.2712,41.72236],[-86.26966,41.72237],[-86.26809,41.72238],[-86.26631,41.72241],[-86.26259,41.72245],[-86.26067,41.72247],[-86.259,41.7225],[-86.25612,41.72252],[-86.25553,41.72252],[-86.25322,41.72256],[-86.25239,41.72257],[-86.25202,41.72257],[-86.25155,41.72256],[-86.2512,41.72255],[-86.2509,41.72253],[-86.25044,41.72248],[-86.25001,41.72242],[-86.24962,41.72235],[-86.24924,41.72227],[-86.2487,41.72213],[-86.24833,41.72201],[-86.24788,41.72185],[-86.24738,41.72163],[-86.24697,41.72142],[-86.24664,41.72124],[-86.24624,41.721],[-86.24563,41.72061],[-86.24549,41.72051],[-86.24504,41.72023],[-86.24425,41.7197],[-86.24273,41.71872],[-86.2425,41.71856],[-86.24193,41.71821],[-86.24155,41.71797],[-86.24121,41.71778],[-86.24086,41.7176],[-86.24045,41.71741],[-86.24007,41.71725],[-86.23967,41.71712],[-86.23928,41.717],[-86.23891,41.7169],[-86.23846,41.7168],[-86.23795,41.7167],[-86.2375,41.71665],[-86.23715,41.71661],[-86.2366,41.71657],[-86.23601,41.71655],[-86.23558,41.71653],[-86.23229,41.71643],[-86.22223,41.71609],[-86.2162,41.71589],[-86.21446,41.71583],[-86.21359,41.71582],[-86.21282,41.71581],[-86.21198,41.7158],[-86.21107,41.7158],[-86.21025,41.71581],[-86.20683,41.71586],[-86.20016,41.71596],[-86.19714,41.71599],[-86.19609,41.716],[-86.19224,41.71606],[-86.18869,41.7161],[-86.1803,41.71622],[-86.17819,41.71625],[-86.17726,41.71627],[-86.17648,41.71628],[-86.17575,41.71631],[-86.17502,41.71636],[-86.17419,41.71642],[-86.17322,41.71653],[-86.17246,41.71663],[-86.17184,41.71672],[-86.17125,41.71682],[-86.17054,41.71695],[-86.16986,41.7171],[-86.16893,41.71731],[-86.1682,41.7175],[-86.16739,41.71773],[-86.1669,41.71788],[-86.16634,41.71806],[-86.16582,41.71823],[-86.16533,41.71841],[-86.16479,41.71861],[-86.16428,41.71881],[-86.16367,41.71906],[-86.16305,41.71934],[-86.16259,41.71956],[-86.16208,41.71981],[-86.16153,41.72009],[-86.16084,41.72046],[-86.1603,41.72077],[-86.14941,41.72734],[-86.14639,41.72916],[-86.14495,41.73002],[-86.14412,41.73051],[-86.14354,41.73081],[-86.14295,41.7311],[-86.14242,41.73135],[-86.14189,41.73157],[-86.14104,41.73191],[-86.1407,41.73203],[-86.14009,41.73224],[-86.13953,41.73241],[-86.13899,41.73257],[-86.13857,41.73268],[-86.13797,41.73282],[-86.13739,41.73295],[-86.1368,41.73307],[-86.136,41.7332],[-86.13535,41.73329],[-86.13476,41.73337],[-86.13378,41.73345],[-86.13322,41.73349],[-86.1327,41.73351],[-86.13215,41.73352],[-86.13041,41.73354],[-86.12926,41.73355],[-86.11718,41.73367],[-86.11316,41.73372],[-86.11233,41.73372],[-86.1115,41.73371],[-86.11073,41.7337],[-86.10997,41.73367],[-86.10904,41.73362],[-86.10817,41.73357],[-86.10749,41.73351],[-86.10672,41.73343],[-86.10571,41.73332],[-86.10488,41.73321],[-86.10393,41.73308],[-86.10263,41.73288],[-86.09882,41.73226],[-86.096,41.73182],[-86.09512,41.73169],[-86.09435,41.73159],[-86.09338,41.73148],[-86.09243,41.73139],[-86.09143,41.73131],[-86.09051,41.73125],[-86.08962,41.73121],[-86.08879,41.73119],[-86.08781,41.73118],[-86.07056,41.73115],[-86.06245,41.73114],[-86.05504,41.73113],[-86.05264,41.73113],[-86.05177,41.73115],[-86.05101,41.73119],[-86.05016,41.73125],[-86.04946,41.73134],[-86.04867,41.73145],[-86.04778,41.7316],[-86.04713,41.73172],[-86.04616,41.73195],[-86.04459,41.73235],[-86.04389,41.7325],[-86.04339,41.73261],[-86.04288,41.7327],[-86.04224,41.7328],[-86.04159,41.73288],[-86.0409,41.73297],[-86.04036,41.73301],[-86.03953,41.73307],[-86.03888,41.73309],[-86.03815,41.73309],[-86.03241,41.73311],[-86.03083,41.73309],[-86.02969,41.73307],[-86.02872,41.73304],[-86.0279,41.733],[-86.02688,41.73296],[-86.02535,41.73285],[-86.02397,41.73273],[-86.02285,41.73261],[-86.02086,41.73239],[-86.01954,41.73226],[-86.01863,41.73219],[-86.01787,41.73214],[-86.0171,41.73209],[-86.0164,41.73206],[-86.01572,41.73205],[-86.01494,41.73204],[-86.01405,41.73204],[-86.0102,41.73208],[-86.00444,41.73214],[-86.00263,41.73212],[-86.00064,41.73208],[-85.99957,41.73203],[-85.99861,41.73199],[-85.99726,41.73192],[-85.99534,41.73179],[-85.99161,41.73153],[-85.99028,41.73145],[-85.98837,41.73136],[-85.98713,41.73131],[-85.9866,41.7313],[-85.98403,41.73121],[-85.98333,41.73119],[-85.97496,41.73092],[-85.97188,41.73083],[-85.97043,41.73081],[-85.96762,41.7308],[-85.96662,41.73081],[-85.95961,41.73083],[-85.9574,41.73082],[-85.95594,41.73081],[-85.95481,41.73078],[-85.95349,41.73074],[-85.9515,41.73067],[-85.94718,41.73049],[-85.94662,41.73047],[-85.9382,41.73013],[-85.92641,41.72966],[-85.9194,41.72937],[-85.91504,41.72919],[-85.91323,41.72914],[-85.91187,41.72911],[-85.90919,41.72908],[-85.90794,41.72909],[-85.90679,41.7291],[-85.90516,41.72913],[-85.90406,41.72916],[-85.90274,41.72921],[-85.90168,41.72925],[-85.90014,41.72932],[-85.89875,41.7294],[-85.89818,41.72944],[-85.89362,41.72978],[-85.89196,41.7299],[-85.88884,41.73013],[-85.88537,41.73039],[-85.88412,41.73047],[-85.88221,41.73057],[-85.88062,41.73064],[-85.87939,41.73068],[-85.87795,41.73072],[-85.87459,41.73079],[-85.86402,41.73101],[-85.85611,41.73118],[-85.84935,41.73132],[-85.84826,41.73135],[-85.8473,41.73141],[-85.84643,41.7315],[-85.84563,41.73161],[-85.84475,41.73175],[-85.84375,41.73194],[-85.84205,41.73237],[-85.84166,41.73247],[-85.83968,41.73298],[-85.82946,41.73559],[-85.82881,41.73575],[-85.82804,41.73593],[-85.82729,41.73608],[-85.82624,41.73625],[-85.82536,41.73636],[-85.82438,41.73644],[-85.82352,41.73649],[-85.82254,41.73651],[-85.82164,41.7365],[-85.82063,41.73645],[-85.81975,41.73639],[-85.81887,41.73628],[-85.81756,41.73609],[-85.81355,41.73546],[-85.81191,41.73521],[-85.81027,41.73494],[-85.80873,41.73471],[-85.80799,41.7346],[-85.80726,41.73452],[-85.80662,41.73445],[-85.80586,41.73441],[-85.80522,41.73438],[-85.80436,41.73437],[-85.80348,41.73439],[-85.80179,41.73447],[-85.79965,41.73457],[-85.79697,41.73471],[-85.79291,41.73492],[-85.78903,41.73512],[-85.78726,41.7352],[-85.78667,41.73523],[-85.78611,41.73522],[-85.78557,41.7352],[-85.78493,41.73514],[-85.78433,41.73504],[-85.78384,41.73494],[-85.7834,41.73482],[-85.78298,41.73469],[-85.78259,41.73455],[-85.78213,41.73436],[-85.78174,41.73418],[-85.78124,41.73391],[-85.78083,41.73366],[-85.78035,41.73334],[-85.7798,41.73299],[-85.77779,41.73168],[-85.77741,41.73143],[-85.77629,41.7307],[-85.77578,41.73039],[-85.77526,41.73011],[-85.77474,41.72986],[-85.77416,41.72962],[-85.77349,41.72938],[-85.77294,41.72921],[-85.77232,41.72906],[-85.77177,41.72894],[-85.77106,41.72883],[-85.77033,41.72875],[-85.7696,41.72872],[-85.7689,41.72871],[-85.76806,41.72876],[-85.76722,41.72886],[-85.76644,41.72899],[-85.76579,41.72914],[-85.76169,41.73025],[-85.75382,41.73239],[-85.75258,41.73274],[-85.75101,41.7332],[-85.74942,41.73368],[-85.74767,41.73423],[-85.74537,41.735],[-85.74337,41.7357],[-85.74113,41.73652],[-85.7386,41.73749],[-85.73592,41.73859],[-85.73349,41.73964],[-85.73065,41.74087],[-85.72924,41.74145],[-85.72846,41.74177],[-85.72794,41.74196],[-85.72754,41.74211],[-85.72668,41.74243],[-85.72585,41.74271],[-85.7247,41.74308],[-85.72368,41.74341],[-85.72265,41.74372],[-85.72169,41.74399],[-85.72066,41.74427],[-85.71973,41.7445],[-85.71837,41.74483],[-85.71726,41.74508],[-85.71602,41.74534],[-85.71496,41.74554],[-85.71367,41.74578],[-85.71218,41.74601],[-85.711,41.74618],[-85.70972,41.74633],[-85.70848,41.74647],[-85.70698,41.74662],[-85.70557,41.74672],[-85.70451,41.74679],[-85.70342,41.74684],[-85.70213,41.74689],[-85.70058,41.74691],[-85.69769,41.74694],[-85.69254,41.74698],[-85.68882,41.74701],[-85.6855,41.74704],[-85.68172,41.74707],[-85.68038,41.74709],[-85.67939,41.74712],[-85.67837,41.74716],[-85.67748,41.7472],[-85.67643,41.74727],[-85.67529,41.74735],[-85.67383,41.74749],[-85.67257,41.74762],[-85.67119,41.74779],[-85.66928,41.74807],[-85.66782,41.74831],[-85.66638,41.74858],[-85.66393,41.74909],[-85.662,41.74955],[-85.66066,41.7499],[-85.65946,41.75024],[-85.65852,41.75052],[-85.65764,41.75079],[-85.65652,41.75115],[-85.65465,41.7518],[-85.65239,41.75258],[-85.65176,41.75279],[-85.6512,41.75295],[-85.65077,41.75307],[-85.65029,41.75319],[-85.64981,41.7533],[-85.64923,41.75343],[-85.64867,41.75354],[-85.64802,41.75364],[-85.64743,41.75373],[-85.64665,41.75382],[-85.64599,41.75388],[-85.64532,41.75392],[-85.64464,41.75395],[-85.64389,41.75396],[-85.64309,41.75395],[-85.64242,41.75392],[-85.64157,41.75387],[-85.64079,41.7538],[-85.64004,41.7537],[-85.63928,41.75359],[-85.63842,41.75344],[-85.63725,41.75321],[-85.63541,41.75286],[-85.63405,41.7526],[-85.63293,41.7524],[-85.63195,41.75224],[-85.63095,41.75209],[-85.62964,41.7519],[-85.62856,41.75177],[-85.62718,41.75163],[-85.62569,41.75149],[-85.62454,41.7514],[-85.62339,41.75133],[-85.62209,41.75127],[-85.62093,41.75123],[-85.62,41.75122],[-85.61881,41.75121],[-85.61767,41.75122],[-85.61638,41.75124],[-85.61526,41.75128],[-85.61396,41.75135],[-85.61256,41.75144],[-85.61016,41.75158],[-85.60491,41.75191],[-85.60358,41.752],[-85.60238,41.75207],[-85.60132,41.75214],[-85.59996,41.75222],[-85.59807,41.75234],[-85.59577,41.75249],[-85.59396,41.7526],[-85.59178,41.75273],[-85.58973,41.75287],[-85.58756,41.753],[-85.58436,41.7532],[-85.581,41.75341],[-85.58014,41.75346],[-85.57876,41.75355],[-85.57787,41.7536],[-85.57716,41.75362],[-85.57631,41.75362],[-85.57558,41.7536],[-85.57491,41.75356],[-85.57422,41.75351],[-85.57361,41.75344],[-85.5729,41.75335],[-85.5722,41.75325],[-85.57142,41.7531],[-85.57075,41.75296],[-85.56994,41.75277],[-85.56916,41.75255],[-85.56807,41.75221],[-85.56615,41.7516],[-85.56447,41.75108],[-85.56207,41.75032],[-85.56066,41.74988],[-85.55958,41.74955],[-85.55788,41.74907],[-85.55659,41.74872],[-85.55482,41.74827],[-85.55307,41.74787],[-85.55142,41.74751],[-85.54946,41.74713],[-85.54816,41.74688],[-85.54697,41.74669],[-85.54597,41.74653],[-85.5441,41.74625],[-85.5424,41.74603],[-85.54091,41.74587],[-85.53912,41.74568],[-85.53741,41.74553],[-85.53587,41.74543],[-85.53448,41.74536],[-85.53304,41.74529],[-85.53161,41.74525],[-85.53042,41.74523],[-85.52875,41.74521],[-85.52706,41.74523],[-85.52506,41.74527],[-85.52208,41.74533],[-85.51923,41.7454],[-85.51388,41.74552],[-85.5124,41.74556],[-85.51079,41.74565],[-85.50921,41.74578],[-85.50785,41.74593],[-85.50632,41.74615],[-85.50469,41.74642],[-85.50328,41.74669],[-85.50209,41.74696],[-85.50046,41.74735],[-85.49838,41.74792],[-85.49633,41.74845],[-85.49342,41.74923],[-85.49003,41.75012],[-85.48847,41.75053],[-85.48677,41.75098],[-85.48504,41.75143],[-85.48127,41.75242],[-85.4801,41.75269],[-85.47902,41.75288],[-85.47784,41.75307],[-85.47681,41.75319],[-85.47616,41.75327],[-85.47521,41.75335],[-85.47391,41.75341],[-85.47273,41.75342],[-85.47121,41.75339],[-85.46997,41.75334],[-85.46691,41.75322],[-85.46481,41.75312],[-85.46326,41.75307],[-85.46224,41.75305],[-85.46126,41.75304],[-85.46016,41.75304],[-85.45883,41.75305],[-85.45775,41.75307],[-85.45708,41.75308],[-85.45554,41.75312],[-85.45295,41.75317],[-85.45063,41.75323],[-85.4487,41.75327],[-85.44738,41.7533],[-85.44388,41.75338],[-85.44126,41.75344],[-85.43943,41.75348],[-85.43671,41.75354],[-85.43372,41.75361],[-85.4315,41.75365],[-85.4272,41.75375],[-85.42643,41.75377],[-85.41893,41.75394],[-85.41834,41.75395],[-85.41529,41.75402],[-85.41216,41.75409],[-85.41102,41.75411],[-85.41002,41.75413],[-85.40918,41.75412],[-85.40848,41.7541],[-85.40768,41.75406],[-85.40688,41.754],[-85.40618,41.75394],[-85.40537,41.75385],[-85.40446,41.75373],[-85.40364,41.7536],[-85.40282,41.75345],[-85.40199,41.75327],[-85.40123,41.7531],[-85.40049,41.7529],[-85.4,41.75277],[-85.39944,41.75261],[-85.39897,41.75246],[-85.3985,41.75231],[-85.39789,41.75209],[-85.39636,41.75158],[-85.39552,41.75131],[-85.39476,41.75109],[-85.39378,41.75083],[-85.39304,41.75066],[-85.39234,41.75051],[-85.39161,41.75037],[-85.39094,41.75025],[-85.39033,41.75016],[-85.3897,41.75008],[-85.38906,41.75],[-85.38797,41.74989],[-85.38674,41.74976],[-85.38526,41.7496],[-85.38387,41.74946],[-85.38114,41.74917],[-85.37744,41.74879],[-85.37629,41.74867],[-85.37499,41.74857],[-85.37372,41.74848],[-85.37223,41.74839],[-85.3711,41.74834],[-85.36959,41.74828],[-85.36886,41.74826],[-85.36784,41.74825],[-85.36673,41.74823],[-85.36557,41.74823],[-85.36397,41.74826],[-85.36224,41.74831],[-85.35997,41.74841],[-85.35401,41.74865],[-85.35162,41.74875],[-85.34988,41.74882],[-85.34868,41.74886],[-85.34777,41.74888],[-85.3467,41.74888],[-85.34549,41.74885],[-85.34443,41.74881],[-85.34351,41.74876],[-85.34268,41.7487],[-85.34179,41.74861],[-85.3408,41.74851],[-85.3399,41.74839],[-85.33904,41.74827],[-85.3381,41.74813],[-85.33698,41.74793],[-85.33596,41.74773],[-85.33481,41.74747],[-85.33364,41.74718],[-85.33285,41.74697],[-85.33066,41.74636],[-85.32837,41.74572],[-85.32704,41.74535],[-85.32532,41.74489],[-85.32367,41.74447],[-85.32274,41.74424],[-85.32037,41.74368],[-85.31918,41.74342],[-85.31735,41.74303],[-85.31567,41.74269],[-85.31373,41.74232],[-85.31173,41.74197],[-85.31009,41.74169],[-85.3086,41.74146],[-85.30696,41.74123],[-85.30518,41.74099],[-85.30359,41.74079],[-85.30168,41.74057],[-85.3007,41.74047],[-85.29906,41.74031],[-85.29767,41.74019],[-85.29608,41.74006],[-85.29468,41.73997],[-85.2932,41.73987],[-85.29278,41.73985],[-85.29081,41.73976],[-85.28902,41.73969],[-85.28733,41.73965],[-85.28532,41.73962],[-85.28429,41.73962],[-85.28355,41.73962],[-85.28278,41.73964],[-85.28198,41.73971],[-85.28115,41.73985],[-85.28025,41.74009],[-85.27948,41.74035],[-85.27869,41.74069],[-85.27797,41.74111],[-85.27732,41.74157],[-85.27677,41.74203],[-85.27628,41.74252],[-85.27585,41.74301],[-85.27493,41.74415],[-85.27377,41.74557],[-85.2717,41.74808],[-85.27137,41.7485],[-85.27124,41.74867],[-85.27025,41.74987],[-85.26961,41.75062],[-85.26922,41.75103],[-85.26899,41.75127],[-85.26858,41.75166],[-85.26817,41.752],[-85.26768,41.75238],[-85.26716,41.75271],[-85.26664,41.75301],[-85.26595,41.75336],[-85.26534,41.75362],[-85.26461,41.75388],[-85.26391,41.75409],[-85.26323,41.75426],[-85.2624,41.75443],[-85.26169,41.75452],[-85.26097,41.75458],[-85.26024,41.75462],[-85.25952,41.75462],[-85.25353,41.7546],[-85.24866,41.75458],[-85.24282,41.75456],[-85.23984,41.75455],[-85.23775,41.75454],[-85.23626,41.75453],[-85.23535,41.75455],[-85.23445,41.75459],[-85.23414,41.7546],[-85.23354,41.75466],[-85.23278,41.75474],[-85.23191,41.75485],[-85.23112,41.75497],[-85.2308,41.75503],[-85.23048,41.75509],[-85.23014,41.75516],[-85.22953,41.7553],[-85.22882,41.75547],[-85.22756,41.75579],[-85.22698,41.75593],[-85.22636,41.75606],[-85.22564,41.75621],[-85.22451,41.7564],[-85.22336,41.75654],[-85.22234,41.75662],[-85.22135,41.75668],[-85.2206,41.7567],[-85.21957,41.75669],[-85.21809,41.75666],[-85.21515,41.75659],[-85.21291,41.75653],[-85.20612,41.75637],[-85.20383,41.75632],[-85.19574,41.75613],[-85.18769,41.75594],[-85.18482,41.75589],[-85.18183,41.75586],[-85.17274,41.75577],[-85.17217,41.75576],[-85.16598,41.75569],[-85.14669,41.75549],[-85.13949,41.75541],[-85.12788,41.75529],[-85.12679,41.75528],[-85.12603,41.75525],[-85.1253,41.75521],[-85.12451,41.75514],[-85.12381,41.75507],[-85.12317,41.75498],[-85.12251,41.75487],[-85.12185,41.75474],[-85.12102,41.75456],[-85.11644,41.75341],[-85.115,41.75305],[-85.1137,41.75272],[-85.11329,41.75261],[-85.11196,41.75228],[-85.11126,41.7521],[-85.11055,41.75193],[-85.10962,41.75171],[-85.10879,41.75154],[-85.10783,41.75134],[-85.10667,41.75114],[-85.10554,41.75097],[-85.10438,41.75081],[-85.10269,41.75058],[-85.09312,41.74928],[-85.08814,41.74861],[-85.08631,41.74836],[-85.08531,41.74825],[-85.08431,41.74814],[-85.08328,41.74804],[-85.08194,41.74792],[-85.08029,41.74779],[-85.07784,41.74764],[-85.07742,41.74761],[-85.07432,41.74743],[-85.07179,41.74727],[-85.06829,41.74705],[-85.06561,41.74689],[-85.06423,41.74681],[-85.06307,41.74677],[-85.06196,41.74674],[-85.06071,41.74675],[-85.06,41.74676],[-85.0593,41.74679],[-85.05821,41.74684],[-85.057,41.74692],[-85.05577,41.74702],[-85.04976,41.74746],[-85.04839,41.74756],[-85.04737,41.74762],[-85.04599,41.74769],[-85.04452,41.74775],[-85.04314,41.74778],[-85.0418,41.74779],[-85.04031,41.7478],[-85.03883,41.74777],[-85.03731,41.74773],[-85.03385,41.74759],[-85.02887,41.74739],[-85.02798,41.74734],[-85.02724,41.74729],[-85.02653,41.7472],[-85.02583,41.74707],[-85.02526,41.74694],[-85.02465,41.74677],[-85.02395,41.74654],[-85.02329,41.74627],[-85.02286,41.74607],[-85.02248,41.74587],[-85.02191,41.74554],[-85.02136,41.74517],[-85.02047,41.74454],[-85.02002,41.74423],[-85.0179,41.74275],[-85.01312,41.73942],[-85.01197,41.73861],[-85.01143,41.73824],[-85.01086,41.73787],[-85.01026,41.73753],[-85.0097,41.73724],[-85.00913,41.73698],[-85.00857,41.73674],[-85.00794,41.73651],[-85.00737,41.73633],[-85.00663,41.73612],[-85.00591,41.73595],[-85.00521,41.73581],[-85.00447,41.7357],[-85.00373,41.73562],[-85.00309,41.73557],[-85.00245,41.73554],[-85.0016,41.73553],[-85.00092,41.73553],[-84.99996,41.73551],[-84.99919,41.73551],[-84.99571,41.73548],[-84.99422,41.73547],[-84.99368,41.73546],[-84.98974,41.73543],[-84.98436,41.73539],[-84.98194,41.73536],[-84.98012,41.73534],[-84.97946,41.73531],[-84.97878,41.73525],[-84.97811,41.73514],[-84.97747,41.735],[-84.97688,41.73484],[-84.97621,41.73459],[-84.97552,41.73428],[-84.97488,41.73392],[-84.97428,41.73351],[-84.97373,41.73306],[-84.9732,41.73254],[-84.9722,41.73147],[-84.9712,41.7304],[-84.97086,41.73005],[-84.96967,41.72877],[-84.96607,41.72491],[-84.96456,41.7233],[-84.96362,41.72229],[-84.96237,41.72095],[-84.96192,41.72049],[-84.96151,41.7201],[-84.96096,41.71962],[-84.96041,41.71921],[-84.95979,41.71879],[-84.95906,41.71836],[-84.95837,41.718],[-84.95763,41.71766],[-84.95646,41.71717],[-84.95461,41.71641],[-84.95046,41.71469],[-84.94824,41.71375],[-84.94534,41.71257],[-84.94468,41.7123],[-84.94267,41.71146],[-84.9407,41.71065],[-84.9401,41.7104],[-84.93744,41.7093],[-84.93625,41.70881],[-84.92771,41.70528],[-84.92459,41.70398],[-84.92367,41.70359],[-84.92277,41.70317],[-84.92184,41.70273],[-84.92078,41.70219],[-84.91954,41.7015],[-84.91852,41.70089],[-84.91709,41.69999],[-84.91211,41.69675],[-84.91112,41.69614],[-84.91018,41.69559],[-84.90923,41.69507],[-84.90842,41.69465],[-84.90739,41.69414],[-84.90633,41.69365],[-84.90546,41.69328],[-84.90444,41.69286],[-84.90311,41.69236],[-84.90082,41.69155],[-84.89454,41.6893],[-84.89141,41.68819],[-84.89008,41.6877],[-84.88915,41.68732],[-84.8883,41.68695],[-84.88734,41.68651],[-84.88637,41.68605],[-84.88551,41.68562],[-84.88464,41.68515],[-84.88375,41.68464],[-84.88318,41.68429],[-84.88226,41.68373],[-84.88138,41.68314],[-84.88052,41.68254],[-84.87658,41.67965],[-84.87564,41.67896],[-84.87258,41.6767],[-84.87156,41.67596],[-84.87026,41.67506],[-84.86954,41.67458],[-84.86836,41.67381],[-84.86753,41.67328],[-84.86648,41.67264],[-84.86528,41.67193],[-84.86438,41.67141],[-84.86304,41.67067],[-84.86219,41.67022],[-84.86124,41.66972],[-84.86009,41.66914],[-84.85786,41.66805],[-84.85535,41.66684],[-84.8534,41.66591],[-84.85263,41.66553],[-84.85071,41.66458],[-84.84966,41.66407],[-84.84905,41.66375],[-84.84845,41.66341],[-84.84789,41.66304],[-84.8473,41.66259],[-84.84701,41.66233],[-84.84673,41.66206],[-84.84646,41.66177],[-84.84621,41.66149],[-84.84579,41.66092],[-84.84547,41.6604],[-84.84528,41.66005],[-84.84509,41.65961],[-84.84493,41.65916],[-84.84485,41.65887],[-84.84476,41.65847],[-84.84427,41.65572],[-84.84368,41.65233],[-84.84338,41.65064],[-84.84326,41.65006],[-84.84314,41.64959],[-84.84296,41.64907],[-84.84277,41.64863],[-84.84251,41.64818],[-84.84221,41.64775],[-84.8419,41.64737],[-84.84163,41.64709],[-84.8414,41.64687],[-84.84104,41.64656],[-84.84063,41.64626],[-84.8402,41.64597],[-84.83973,41.64569],[-84.8388,41.64515],[-84.8377,41.64453],[-84.83567,41.64336],[-84.83502,41.64298],[-84.83409,41.64242],[-84.83282,41.64162],[-84.83204,41.64112],[-84.83065,41.64019],[-84.82914,41.63913],[-84.82839,41.63858],[-84.82763,41.63802],[-84.82691,41.63747],[-84.82609,41.63683],[-84.82291,41.63426],[-84.81922,41.63126],[-84.81857,41.63075],[-84.81799,41.63032],[-84.81769,41.6301],[-84.81734,41.62988],[-84.81705,41.62971],[-84.81666,41.62949],[-84.81625,41.62929],[-84.81566,41.62902],[-84.81496,41.62877],[-84.81446,41.6286],[-84.81388,41.62843],[-84.81322,41.62828],[-84.81259,41.62816],[-84.81198,41.62807],[-84.8113,41.628],[-84.81066,41.62796],[-84.80987,41.62795],[-84.80923,41.62797],[-84.80849,41.62803],[-84.80791,41.6281],[-84.80706,41.62822],[-84.80571,41.62841],[-84.80362,41.62871],[-84.80201,41.62895],[-84.80089,41.62911],[-84.79814,41.62953],[-84.7948,41.63],[-84.79343,41.6302],[-84.7925,41.63034],[-84.79183,41.63043],[-84.79139,41.6305],[-84.79053,41.6306],[-84.7901,41.63062],[-84.78909,41.63068],[-84.78822,41.63066],[-84.78711,41.63067],[-84.78625,41.63062],[-84.7856,41.63059],[-84.7847,41.63054],[-84.78372,41.63049],[-84.78153,41.6304],[-84.78052,41.63036],[-84.77825,41.63024],[-84.77771,41.63021],[-84.77619,41.63014],[-84.77445,41.63005],[-84.77388,41.63003],[-84.77208,41.62992],[-84.77063,41.62987],[-84.7694,41.62981],[-84.76819,41.62975],[-84.76635,41.62966],[-84.76601,41.62965],[-84.76519,41.62961],[-84.76259,41.62949],[-84.76183,41.62945],[-84.76084,41.6294],[-84.75947,41.62933],[-84.75819,41.62929],[-84.75437,41.62908],[-84.75084,41.62892],[-84.75078,41.62892],[-84.74941,41.62886],[-84.74843,41.62882],[-84.74569,41.62868],[-84.74453,41.62862],[-84.74236,41.62851],[-84.74092,41.62844],[-84.7377,41.62831],[-84.73659,41.62825],[-84.73498,41.62817],[-84.73233,41.62804],[-84.73056,41.62796],[-84.72895,41.62788],[-84.72817,41.62786],[-84.72572,41.62773],[-84.72409,41.62764],[-84.72258,41.62758],[-84.72135,41.62751],[-84.71831,41.62737],[-84.7173,41.62731],[-84.71642,41.62725],[-84.71544,41.62717],[-84.71463,41.62709],[-84.71398,41.62702],[-84.71257,41.62685],[-84.71177,41.62674],[-84.71115,41.62666],[-84.71099,41.62664],[-84.71027,41.62653],[-84.70993,41.62648],[-84.709,41.62633],[-84.70856,41.62626],[-84.70709,41.62597],[-84.70545,41.62563],[-84.70395,41.62529],[-84.70244,41.62492],[-84.70151,41.62468],[-84.69967,41.62419],[-84.69795,41.62371],[-84.69755,41.6236],[-84.6942,41.6227],[-84.6908,41.62177],[-84.68287,41.61967],[-84.6799,41.6189],[-84.67838,41.61862],[-84.67447,41.61808],[-84.67304,41.61796],[-84.66829,41.61768],[-84.6604,41.61733],[-84.65807,41.61726],[-84.64916,41.61683],[-84.64439,41.61661],[-84.63936,41.61639],[-84.63672,41.61635],[-84.63317,41.61643],[-84.6306,41.61654],[-84.62505,41.61679],[-84.62278,41.61697],[-84.61205,41.61788],[-84.60983,41.6181],[-84.6079,41.61825],[-84.60602,41.61833],[-84.60484,41.61835],[-84.6035,41.61833],[-84.60302,41.61833],[-84.60147,41.61827],[-84.5969,41.61788],[-84.59509,41.61774],[-84.59307,41.61757],[-84.59207,41.61749],[-84.59106,41.61741],[-84.58969,41.61732],[-84.58898,41.61726],[-84.5843,41.61685],[-84.58285,41.61671],[-84.58154,41.6166],[-84.57991,41.61647],[-84.57893,41.61639],[-84.57811,41.61632],[-84.57643,41.61618],[-84.57581,41.61612],[-84.57452,41.616],[-84.57353,41.61593],[-84.57256,41.61586],[-84.57161,41.61578],[-84.57062,41.61569],[-84.56963,41.61561],[-84.56666,41.61536],[-84.56567,41.61527],[-84.56466,41.61519],[-84.56364,41.61511],[-84.56261,41.61503],[-84.56157,41.61494],[-84.56115,41.6149],[-84.56041,41.61485],[-84.55926,41.61475],[-84.55802,41.61465],[-84.55696,41.61456],[-84.55582,41.61447],[-84.55466,41.61436],[-84.55388,41.61429],[-84.55346,41.61426],[-84.55276,41.61421],[-84.55164,41.61411],[-84.5494,41.61392],[-84.54827,41.61383],[-84.54724,41.61375],[-84.54607,41.61366],[-84.54518,41.61357],[-84.54418,41.61347],[-84.54348,41.61339],[-84.54261,41.61329],[-84.54176,41.61317],[-84.54065,41.61301],[-84.53955,41.61286],[-84.53845,41.6127],[-84.53664,41.61244],[-84.53607,41.61236],[-84.53524,41.61224],[-84.53452,41.61213],[-84.53412,41.61208],[-84.5332,41.61194],[-84.53132,41.61167],[-84.53041,41.61154],[-84.52949,41.61141],[-84.52857,41.61128],[-84.52765,41.61114],[-84.5275,41.61112],[-84.52452,41.61068],[-84.52281,41.61043],[-84.52181,41.61029],[-84.51947,41.60995],[-84.51582,41.60942],[-84.51439,41.60922],[-84.51229,41.60891],[-84.51009,41.60861],[-84.50852,41.60837],[-84.50745,41.60821],[-84.50713,41.60817],[-84.50577,41.608],[-84.50391,41.60782],[-84.50234,41.60772],[-84.50092,41.60766],[-84.50074,41.60766],[-84.49968,41.60761],[-84.49865,41.60757],[-84.49672,41.60752],[-84.49391,41.60743],[-84.49317,41.6074],[-84.49185,41.60736],[-84.49164,41.60735],[-84.48397,41.60708],[-84.48132,41.60698],[-84.47716,41.60684],[-84.47195,41.60666],[-84.46825,41.60653],[-84.46682,41.60647],[-84.46348,41.60636],[-84.46179,41.6063],[-84.45716,41.60614],[-84.45608,41.6061],[-84.45515,41.60606],[-84.45418,41.60603],[-84.45214,41.60596],[-84.45141,41.60593],[-84.45009,41.60588],[-84.44953,41.60587],[-84.44823,41.60581],[-84.44705,41.60577],[-84.44501,41.6057],[-84.44444,41.60568],[-84.44342,41.60565],[-84.44285,41.60563],[-84.44164,41.60558],[-84.44048,41.60554],[-84.4336,41.60529],[-84.42986,41.60516],[-84.42934,41.60514],[-84.42156,41.60486],[-84.42104,41.60484],[-84.41934,41.60479],[-84.41732,41.60471],[-84.41545,41.60465],[-84.41476,41.60462],[-84.41388,41.60458],[-84.41293,41.60455],[-84.41251,41.60454],[-84.41134,41.6045],[-84.41019,41.60446],[-84.4098,41.60444],[-84.40889,41.60441],[-84.40743,41.60436],[-84.40508,41.60428],[-84.4036,41.60422],[-84.40293,41.60419],[-84.40258,41.60418],[-84.40148,41.60414],[-84.40047,41.60411],[-84.4,41.60409],[-84.39836,41.60404],[-84.39691,41.60398],[-84.39591,41.60392],[-84.39491,41.60385],[-84.39372,41.60376],[-84.3924,41.60364],[-84.39129,41.60352],[-84.38993,41.60335],[-84.38894,41.60321],[-84.38814,41.60309],[-84.38795,41.60306],[-84.38704,41.60292],[-84.38607,41.60274],[-84.38511,41.60256],[-84.38442,41.60242],[-84.38331,41.60219],[-84.38158,41.60178],[-84.3812,41.60169],[-84.38028,41.60145],[-84.37987,41.60134],[-84.37864,41.601],[-84.37779,41.60075],[-84.37682,41.60046],[-84.37582,41.60014],[-84.3753,41.59997],[-84.37467,41.59976],[-84.37393,41.59949],[-84.37335,41.59928],[-84.37286,41.5991],[-84.37229,41.59889],[-84.37082,41.59831],[-84.36999,41.59796],[-84.36918,41.59763],[-84.36829,41.59725],[-84.36762,41.59696],[-84.36691,41.59666],[-84.36597,41.59627],[-84.36469,41.59572],[-84.36225,41.59469],[-84.36159,41.5944],[-84.36092,41.59413],[-84.36021,41.59383],[-84.35951,41.59353],[-84.35871,41.5932],[-84.35828,41.59301],[-84.35779,41.5928],[-84.3574,41.59263],[-84.35696,41.59244],[-84.35278,41.59067],[-84.35169,41.59022],[-84.35136,41.59008],[-84.35079,41.58985],[-84.35038,41.58967],[-84.34985,41.58944],[-84.34951,41.58931],[-84.34905,41.58911],[-84.3488,41.58901],[-84.34811,41.58872],[-84.34742,41.58843],[-84.34691,41.58822],[-84.34652,41.58807],[-84.34619,41.58797],[-84.34581,41.58785],[-84.34559,41.58779],[-84.34536,41.58773],[-84.34509,41.58767],[-84.34481,41.58761],[-84.34449,41.58755],[-84.34424,41.5875],[-84.34398,41.58747],[-84.34366,41.58743],[-84.34339,41.58741],[-84.34309,41.58738],[-84.34291,41.58737],[-84.34257,41.58735],[-84.34216,41.58734],[-84.3419,41.58734],[-84.34141,41.58736],[-84.34098,41.58739],[-84.34051,41.58743],[-84.34009,41.58748],[-84.3397,41.58754],[-84.33941,41.5876],[-84.33902,41.58768],[-84.33853,41.58778],[-84.33786,41.58791],[-84.33693,41.58813],[-84.33453,41.58873],[-84.33246,41.5892],[-84.33164,41.58939],[-84.32828,41.59017],[-84.32723,41.59041],[-84.32678,41.59051],[-84.32554,41.59077],[-84.32453,41.59096],[-84.32333,41.59115],[-84.32235,41.59129],[-84.32144,41.59139],[-84.32064,41.59148],[-84.31888,41.59163],[-84.31787,41.59169],[-84.3166,41.59174],[-84.316,41.59175],[-84.31469,41.59176],[-84.31377,41.59174],[-84.31247,41.5917],[-84.3111,41.59162],[-84.31041,41.59158],[-84.30832,41.59145],[-84.30801,41.59143],[-84.30584,41.5913],[-84.29385,41.59059],[-84.29259,41.59052],[-84.29067,41.59044],[-84.28872,41.59041],[-84.28273,41.59043],[-84.27062,41.59051],[-84.25854,41.59053],[-84.24856,41.59057],[-84.22916,41.59065],[-84.21725,41.59069],[-84.21184,41.5907],[-84.19346,41.59076],[-84.18142,41.5908],[-84.17612,41.59082],[-84.17539,41.59083],[-84.17466,41.59084],[-84.1742,41.59085],[-84.17272,41.59091],[-84.17189,41.59095],[-84.17131,41.59099],[-84.17101,41.59102],[-84.17071,41.59103],[-84.16985,41.5911],[-84.16897,41.59118],[-84.1684,41.59124],[-84.16753,41.59133],[-84.16694,41.59139],[-84.16621,41.59147],[-84.16408,41.59171],[-84.16129,41.59203],[-84.15911,41.59227],[-84.15779,41.59242],[-84.15679,41.59253],[-84.15604,41.59262],[-84.15489,41.59275],[-84.15402,41.59285],[-84.15371,41.59288],[-84.15226,41.59304],[-84.15167,41.59311],[-84.1511,41.59318],[-84.15037,41.59326],[-84.14965,41.59334],[-84.14918,41.59339],[-84.14872,41.59344],[-84.14799,41.59352],[-84.14751,41.59358],[-84.14718,41.59362],[-84.14679,41.59366],[-84.1465,41.59369],[-84.14606,41.59372],[-84.14561,41.59373],[-84.14515,41.59374],[-84.14474,41.59374],[-84.14445,41.59373],[-84.14401,41.59371],[-84.14371,41.59369],[-84.14342,41.59366],[-84.14326,41.59365],[-84.14209,41.59354],[-84.14182,41.59351],[-84.14143,41.59348],[-84.14094,41.59342],[-84.13719,41.59305],[-84.13667,41.593],[-84.1362,41.59296],[-84.13379,41.59271],[-84.13352,41.59269],[-84.13326,41.59266],[-84.13252,41.59258],[-84.13178,41.59251],[-84.13105,41.59244],[-84.12946,41.59228],[-84.12801,41.59214],[-84.1221,41.59155],[-84.1208,41.59142],[-84.1155,41.59088],[-84.11524,41.59086],[-84.11502,41.59085],[-84.11404,41.59074],[-84.1135,41.59069],[-84.11278,41.59062],[-84.11217,41.59057],[-84.1116,41.59053],[-84.11101,41.5905],[-84.11029,41.59046],[-84.10969,41.59044],[-84.1091,41.59043],[-84.10836,41.59042],[-84.10763,41.59042],[-84.10192,41.59054],[-84.08779,41.5908],[-84.06454,41.59126],[-84.05584,41.59143],[-84.0511,41.59152],[-84.05012,41.59154],[-84.04962,41.59155],[-84.04927,41.59156],[-84.04759,41.59159],[-84.04708,41.5916],[-84.0465,41.59161],[-84.04593,41.59162],[-84.04538,41.59163],[-84.04477,41.59164],[-84.0442,41.59165],[-84.04362,41.59167],[-84.04294,41.59168],[-84.04176,41.5917],[-84.03787,41.59177],[-84.0374,41.59178],[-84.03293,41.59187],[-84.03243,41.59188],[-84.0318,41.5919],[-84.03023,41.59199],[-84.02898,41.59215],[-84.02748,41.59243],[-84.02617,41.59276],[-84.02537,41.593],[-84.02393,41.59352],[-84.01935,41.59536],[-84.01892,41.59554],[-84.01685,41.59636],[-84.01504,41.59708],[-84.01436,41.59736],[-84.0137,41.5976],[-84.01334,41.59773],[-84.01321,41.59777],[-84.01306,41.59782],[-84.01259,41.59795],[-84.01221,41.59804],[-84.01208,41.59808],[-84.01179,41.59813],[-84.01134,41.59821],[-84.01103,41.59826],[-84.01048,41.59833],[-84.01003,41.59836],[-84.0097,41.59838],[-84.0093,41.59838],[-84.00866,41.59838],[-84.00796,41.59835],[-83.99826,41.59792],[-83.99186,41.59764],[-83.99064,41.5976],[-83.99009,41.59759],[-83.98948,41.59758],[-83.98905,41.59758],[-83.98844,41.59758],[-83.98775,41.59759],[-83.98714,41.5976],[-83.98655,41.59762],[-83.98594,41.59763],[-83.98534,41.59765],[-83.98478,41.59768],[-83.98343,41.59775],[-83.983,41.59777],[-83.98244,41.59779],[-83.98204,41.59782],[-83.97641,41.5981],[-83.97324,41.59826],[-83.95153,41.59936],[-83.95078,41.5994],[-83.94898,41.59949],[-83.94761,41.59956],[-83.94613,41.59962],[-83.94524,41.59964],[-83.94464,41.59965],[-83.94377,41.59966],[-83.94287,41.59966],[-83.94199,41.59966],[-83.92779,41.5997],[-83.91325,41.59974],[-83.9028,41.59977],[-83.90209,41.59977],[-83.90024,41.59978],[-83.89951,41.59979],[-83.89576,41.59977],[-83.89426,41.59977],[-83.89278,41.59978],[-83.89129,41.59978],[-83.88995,41.59978],[-83.88877,41.59979],[-83.8876,41.59979],[-83.88678,41.5998],[-83.88568,41.59979],[-83.8845,41.59979],[-83.88292,41.5998],[-83.87726,41.59983],[-83.86556,41.59988],[-83.84817,41.59995],[-83.8255,41.60158],[-83.82506,41.60161],[-83.81498,41.60231],[-83.81207,41.60252],[-83.81086,41.60249],[-83.80978,41.60235],[-83.80887,41.60214],[-83.80732,41.60168],[-83.80659,41.60147],[-83.80408,41.60076],[-83.80351,41.6006],[-83.79945,41.59941],[-83.7988,41.59923],[-83.79056,41.59689],[-83.78726,41.59614],[-83.78423,41.59553],[-83.78154,41.59503],[-83.77812,41.59455],[-83.76444,41.59304],[-83.75344,41.59179],[-83.74152,41.59051],[-83.74086,41.59047],[-83.73993,41.59048],[-83.73883,41.59051],[-83.73773,41.59063],[-83.73722,41.59068],[-83.73292,41.59114],[-83.7325,41.59118],[-83.72908,41.59155],[-83.72661,41.59172],[-83.72393,41.59184],[-83.71382,41.59186],[-83.6964,41.59185],[-83.69021,41.59188],[-83.68962,41.59188],[-83.68199,41.59188],[-83.67614,41.59189],[-83.66717,41.59189],[-83.66638,41.59187],[-83.66569,41.59185],[-83.66513,41.59182],[-83.66441,41.59177],[-83.66304,41.59167],[-83.65894,41.5912],[-83.65711,41.59098],[-83.65589,41.59089],[-83.64477,41.59063],[-83.64291,41.59051],[-83.64163,41.59039],[-83.641,41.59031],[-83.64046,41.59022],[-83.64021,41.59017],[-83.63901,41.58996],[-83.63512,41.58894],[-83.63253,41.58826],[-83.63132,41.58796],[-83.62535,41.58638],[-83.61576,41.58392],[-83.61215,41.58301],[-83.61127,41.58271],[-83.61052,41.58241],[-83.60979,41.58205],[-83.60887,41.58153],[-83.60474,41.57898],[-83.60435,41.57871],[-83.60377,41.57837],[-83.6032,41.57806],[-83.60272,41.57782],[-83.60221,41.57759],[-83.60188,41.57747],[-83.60126,41.57723],[-83.59875,41.57628],[-83.59815,41.57607],[-83.59686,41.57558],[-83.59619,41.57532],[-83.59409,41.57453],[-83.59311,41.57415],[-83.59188,41.57363],[-83.59133,41.5734],[-83.58884,41.57234],[-83.58683,41.57148],[-83.58622,41.57122],[-83.58522,41.57079],[-83.58086,41.56893],[-83.58014,41.56863],[-83.57667,41.56714],[-83.5756,41.56669],[-83.57512,41.56648],[-83.57452,41.5662],[-83.57407,41.56598],[-83.57353,41.56569],[-83.57292,41.56535],[-83.56988,41.56365],[-83.5651,41.56094],[-83.5644,41.56055],[-83.55775,41.55681],[-83.55711,41.55645],[-83.556,41.55579],[-83.55554,41.55554],[-83.5535,41.55439],[-83.55281,41.55403],[-83.55192,41.55358],[-83.55126,41.55326],[-83.55049,41.55291],[-83.54972,41.55257],[-83.54899,41.55226],[-83.54803,41.55188],[-83.54498,41.55073],[-83.5347,41.54685],[-83.52742,41.5441],[-83.5249,41.54315],[-83.52228,41.54217],[-83.52152,41.5419],[-83.5207,41.54163],[-83.51997,41.54141],[-83.51925,41.5412],[-83.51851,41.54101],[-83.51777,41.54083],[-83.51702,41.54066],[-83.51633,41.54052],[-83.51552,41.54038],[-83.5147,41.54024],[-83.51393,41.54013],[-83.51281,41.54],[-83.51171,41.53984],[-83.51049,41.5397],[-83.50257,41.53877],[-83.49949,41.53841],[-83.49819,41.53825],[-83.49737,41.53813],[-83.49637,41.53797],[-83.49538,41.5378],[-83.49456,41.53764],[-83.49364,41.53744],[-83.4924,41.53713],[-83.49123,41.53682],[-83.4899,41.53646],[-83.48876,41.5361],[-83.4874,41.53563],[-83.48562,41.53496],[-83.4849,41.53467],[-83.48418,41.53435],[-83.48343,41.53402],[-83.48294,41.53379],[-83.48245,41.53356],[-83.48189,41.53329],[-83.47959,41.53222],[-83.47842,41.53167],[-83.47765,41.53133],[-83.47698,41.53104],[-83.47597,41.53064],[-83.47469,41.53014],[-83.46801,41.52761],[-83.46525,41.52656],[-83.4636,41.52594],[-83.46266,41.52558],[-83.46237,41.52547],[-83.45918,41.52427],[-83.45778,41.52375],[-83.45698,41.52345],[-83.45393,41.52229],[-83.45366,41.52219],[-83.45163,41.52142],[-83.44891,41.52038],[-83.44217,41.51782],[-83.4397,41.5169],[-83.43585,41.51545],[-83.43523,41.51521],[-83.43379,41.51466],[-83.43168,41.51386],[-83.43087,41.51357],[-83.43005,41.5133],[-83.42916,41.51302],[-83.42838,41.51279],[-83.42754,41.51255],[-83.42658,41.5123],[-83.42573,41.51209],[-83.42487,41.5119],[-83.42407,41.51171],[-83.42305,41.51151],[-83.42103,41.51115],[-83.41899,41.51083],[-83.41804,41.51068],[-83.41488,41.51015],[-83.4143,41.51006],[-83.41339,41.50989],[-83.41293,41.5098],[-83.41242,41.50968],[-83.4117,41.5095],[-83.41119,41.50935],[-83.41075,41.50921],[-83.41026,41.50904],[-83.40977,41.50887],[-83.40929,41.50869],[-83.40876,41.50847],[-83.40829,41.50827],[-83.40767,41.50799],[-83.40341,41.50606],[-83.40177,41.50531],[-83.39755,41.5034],[-83.397,41.50315],[-83.39468,41.50211],[-83.39417,41.50187],[-83.39392,41.50175],[-83.39159,41.50069],[-83.39082,41.50033],[-83.38258,41.49658],[-83.38055,41.49564],[-83.37338,41.49241],[-83.36444,41.48832],[-83.36345,41.48786],[-83.36251,41.48743],[-83.3607,41.48662],[-83.36027,41.4864],[-83.35983,41.48621],[-83.3593,41.48597],[-83.35881,41.48575],[-83.35833,41.48553],[-83.35613,41.48453],[-83.35062,41.48203],[-83.34691,41.48034],[-83.33922,41.47683],[-83.33877,41.47662],[-83.33739,41.476],[-83.33459,41.47473],[-83.33362,41.47429],[-83.33295,41.47399],[-83.33227,41.4737],[-83.33175,41.47349],[-83.33127,41.4733],[-83.33062,41.47307],[-83.32992,41.47282],[-83.32929,41.47264],[-83.32888,41.47252],[-83.3282,41.47231],[-83.3277,41.47215],[-83.32697,41.47196],[-83.32407,41.47125],[-83.3161,41.46931],[-83.31433,41.46888],[-83.30867,41.4675],[-83.30761,41.46723],[-83.30284,41.46608],[-83.29914,41.46518],[-83.29863,41.46505],[-83.29824,41.46494],[-83.29768,41.46477],[-83.29708,41.46457],[-83.29664,41.46441],[-83.29627,41.46427],[-83.29584,41.4641],[-83.29543,41.46393],[-83.29491,41.4637],[-83.29445,41.46348],[-83.29395,41.46323],[-83.29292,41.46269],[-83.29242,41.46243],[-83.29069,41.46156],[-83.28981,41.4611],[-83.28883,41.4606],[-83.28422,41.45824],[-83.28419,41.45823],[-83.28358,41.45791],[-83.28228,41.45724],[-83.28198,41.45709],[-83.28042,41.45627],[-83.27879,41.45545],[-83.27596,41.45415],[-83.27338,41.4531],[-83.26916,41.45152],[-83.26411,41.44963],[-83.26181,41.44875],[-83.26042,41.44825],[-83.26001,41.4481],[-83.25938,41.44787],[-83.25691,41.44695],[-83.25299,41.44548],[-83.25079,41.44466],[-83.24854,41.44386],[-83.24653,41.44321],[-83.24361,41.44234],[-83.23775,41.4406],[-83.23634,41.44018],[-83.23359,41.43937],[-83.22474,41.43673],[-83.22359,41.43639],[-83.21626,41.43421],[-83.21448,41.43368],[-83.21185,41.4329],[-83.21111,41.43268],[-83.21083,41.4326],[-83.20885,41.43201],[-83.20798,41.43175],[-83.20116,41.42972],[-83.1888,41.4261],[-83.18831,41.42595],[-83.18726,41.42559],[-83.18548,41.42507],[-83.18348,41.42451],[-83.18261,41.42429],[-83.18209,41.42416],[-83.17996,41.42367],[-83.17726,41.42311],[-83.17538,41.42272],[-83.17364,41.42237],[-83.17185,41.422],[-83.17125,41.42187],[-83.17067,41.42174],[-83.17008,41.4216],[-83.16891,41.42131],[-83.16774,41.421],[-83.16659,41.42067],[-83.16654,41.42066],[-83.16549,41.42034],[-83.16443,41.42001],[-83.16338,41.41966],[-83.16287,41.41949],[-83.16183,41.41912],[-83.16132,41.41893],[-83.1603,41.41854],[-83.15929,41.41813],[-83.15828,41.41772],[-83.15729,41.41729],[-83.15631,41.41684],[-83.15582,41.41661],[-83.15401,41.41574],[-83.15257,41.41503],[-83.15068,41.41411],[-83.14889,41.41324],[-83.14755,41.41258],[-83.14636,41.412],[-83.14319,41.41057],[-83.14125,41.40978],[-83.13979,41.40924],[-83.13872,41.40887],[-83.1382,41.40869],[-83.13706,41.4083],[-83.13602,41.40799],[-83.13552,41.40784],[-83.13198,41.40683],[-83.1288,41.40592],[-83.12801,41.4057],[-83.12445,41.40466],[-83.11958,41.40326],[-83.11886,41.40306],[-83.11834,41.40289],[-83.118,41.40279],[-83.1167,41.40244],[-83.11115,41.40086],[-83.10982,41.40048],[-83.10946,41.40038],[-83.10855,41.40012],[-83.10622,41.39947],[-83.10558,41.39928],[-83.10368,41.39873],[-83.10182,41.3982],[-83.09865,41.39731],[-83.0969,41.39679],[-83.09492,41.39627],[-83.09274,41.39575],[-83.09081,41.39535],[-83.08846,41.39492],[-83.08834,41.3949],[-83.08303,41.39394],[-83.0818,41.39372],[-83.08043,41.39348],[-83.06657,41.39102],[-83.06601,41.39092],[-83.05671,41.38921],[-83.05087,41.38815],[-83.04905,41.38783],[-83.04731,41.38747],[-83.04428,41.38682],[-83.04362,41.38666],[-83.03825,41.38544],[-83.02828,41.38319],[-83.02737,41.38297],[-83.0249,41.38251],[-83.02215,41.38207],[-83.01775,41.3815],[-83.01715,41.38142],[-83.01226,41.38081],[-83.01151,41.38073],[-83.00906,41.38044],[-83.00674,41.38014],[-83.00419,41.37975],[-83.00207,41.37937],[-83.00084,41.37914],[-82.99937,41.37879],[-82.99703,41.37823],[-82.99618,41.37801],[-82.9833,41.37481],[-82.97919,41.3738],[-82.97828,41.37356],[-82.97392,41.37247],[-82.97336,41.37234],[-82.96786,41.37096],[-82.96462,41.37014],[-82.96353,41.36987],[-82.96221,41.36951],[-82.96134,41.3693],[-82.96063,41.36912],[-82.96062,41.36912],[-82.95504,41.36773],[-82.95384,41.36741],[-82.95335,41.36727],[-82.95181,41.3669],[-82.95134,41.36677],[-82.95102,41.36668],[-82.95057,41.36655],[-82.94983,41.36631],[-82.9491,41.36607],[-82.94837,41.36583],[-82.94749,41.36551],[-82.94557,41.36482],[-82.94418,41.36435],[-82.94242,41.36381],[-82.9409,41.36341],[-82.93984,41.36315],[-82.93863,41.36289],[-82.93656,41.3625],[-82.9351,41.36228],[-82.93154,41.3619],[-82.93099,41.36185],[-82.92913,41.36159],[-82.91694,41.36019],[-82.9052,41.35884],[-82.90322,41.35861],[-82.89901,41.35812],[-82.89753,41.35793],[-82.89663,41.35785],[-82.89526,41.35766],[-82.89448,41.35753],[-82.89326,41.35729],[-82.89243,41.35712],[-82.89179,41.357],[-82.88957,41.35651],[-82.8861,41.35577],[-82.88021,41.35445],[-82.87836,41.35407],[-82.87688,41.35382],[-82.87519,41.35354],[-82.87306,41.35327],[-82.86824,41.35275],[-82.86474,41.35239],[-82.86169,41.35205],[-82.85967,41.35183],[-82.85758,41.35162],[-82.85558,41.3514],[-82.84882,41.35068],[-82.8467,41.35046],[-82.84504,41.35028],[-82.83644,41.34938],[-82.83391,41.3491],[-82.82894,41.34856],[-82.8269,41.34835],[-82.82536,41.34825],[-82.82369,41.34816],[-82.81945,41.34794],[-82.81153,41.34754],[-82.80525,41.34724],[-82.80392,41.34719],[-82.80236,41.34712],[-82.80189,41.3471],[-82.79933,41.34686],[-82.79643,41.3465],[-82.79319,41.34604],[-82.7868,41.34481],[-82.78617,41.34468],[-82.78459,41.34437],[-82.78384,41.34422],[-82.78084,41.34357],[-82.78008,41.34342],[-82.77178,41.34176],[-82.7708,41.34159],[-82.7664,41.34097],[-82.76514,41.3408],[-82.76123,41.34034],[-82.75906,41.34004],[-82.75612,41.33967],[-82.75153,41.33911],[-82.74764,41.33867],[-82.74719,41.33862],[-82.74391,41.33825],[-82.73963,41.33776],[-82.73321,41.33688],[-82.72853,41.33638],[-82.72514,41.33616],[-82.71425,41.33592],[-82.70002,41.33564],[-82.69948,41.33563],[-82.69384,41.33553],[-82.69334,41.33552],[-82.68742,41.33536],[-82.68227,41.33504],[-82.67759,41.3345],[-82.67539,41.33419],[-82.67342,41.33381],[-82.66756,41.33255],[-82.66215,41.3314],[-82.65705,41.33036],[-82.65682,41.3303],[-82.65257,41.3294],[-82.64804,41.32849],[-82.64689,41.32829],[-82.64648,41.32822],[-82.64522,41.32803],[-82.64347,41.32779],[-82.64342,41.32779],[-82.63954,41.32721],[-82.63665,41.32671],[-82.63502,41.32634],[-82.63207,41.32574],[-82.63137,41.32559],[-82.63087,41.32548],[-82.63061,41.32541],[-82.62544,41.32427],[-82.62211,41.32352],[-82.61941,41.32312],[-82.61673,41.32288],[-82.61585,41.32283],[-82.61517,41.3228],[-82.61362,41.32278],[-82.61212,41.3228],[-82.6101,41.32294],[-82.60871,41.32303],[-82.60813,41.32309],[-82.60632,41.32338],[-82.6049,41.32361],[-82.60264,41.32403],[-82.60156,41.32419],[-82.6005,41.32432],[-82.59937,41.32441],[-82.59789,41.32445],[-82.59615,41.32441],[-82.59489,41.32429],[-82.59386,41.32417],[-82.59129,41.3239],[-82.58827,41.32359],[-82.58779,41.32353],[-82.58762,41.32351],[-82.58695,41.32344],[-82.5868,41.32341],[-82.58519,41.3232],[-82.58377,41.32309],[-82.58273,41.32305],[-82.58062,41.32297],[-82.57994,41.32298],[-82.57904,41.32298],[-82.57742,41.32301],[-82.57707,41.32304],[-82.57443,41.32321],[-82.57145,41.32343],[-82.56889,41.32359],[-82.56715,41.32373],[-82.56639,41.32378],[-82.56431,41.32394],[-82.56238,41.3241],[-82.56086,41.32419],[-82.55855,41.32435],[-82.55653,41.32449],[-82.55504,41.3246],[-82.55286,41.32477],[-82.552,41.32483],[-82.55119,41.32486],[-82.54862,41.32506],[-82.54692,41.32518],[-82.54498,41.32534],[-82.54347,41.32539],[-82.54231,41.32544],[-82.54015,41.32546],[-82.53569,41.32551],[-82.52787,41.3256],[-82.52379,41.32564],[-82.52045,41.32589],[-82.51643,41.32629],[-82.5124,41.32687],[-82.51029,41.32725],[-82.50777,41.32759],[-82.50476,41.32803],[-82.50373,41.32815],[-82.50318,41.32823],[-82.50272,41.32828],[-82.4994,41.32855],[-82.49826,41.3286],[-82.49663,41.32869],[-82.49368,41.32878],[-82.49318,41.32878],[-82.49204,41.32877],[-82.48821,41.32878],[-82.48559,41.32877],[-82.48367,41.32876],[-82.48179,41.32879],[-82.48112,41.32881],[-82.47912,41.32896],[-82.47814,41.32901],[-82.4776,41.32905],[-82.47311,41.32933],[-82.46952,41.32959],[-82.46714,41.32975],[-82.46372,41.33003],[-82.45534,41.33058],[-82.45495,41.33061],[-82.45266,41.33075],[-82.44282,41.33142],[-82.43853,41.33164],[-82.43524,41.33181],[-82.42749,41.33233],[-82.424,41.33257],[-82.41701,41.33304],[-82.41643,41.33308],[-82.41026,41.3335],[-82.40828,41.33364],[-82.40761,41.33367],[-82.4047,41.33381],[-82.40178,41.334],[-82.38769,41.33492],[-82.38574,41.33496],[-82.38371,41.33489],[-82.37383,41.33422],[-82.37219,41.33424],[-82.3707,41.33435],[-82.36915,41.33463],[-82.36776,41.33509],[-82.35989,41.33826],[-82.35682,41.3395],[-82.35506,41.3401],[-82.35168,41.34115],[-82.35009,41.34166],[-82.3484,41.34216],[-82.34698,41.34263],[-82.345,41.34317],[-82.34323,41.34359],[-82.3421,41.34384],[-82.34158,41.34393],[-82.34083,41.34407],[-82.33985,41.34423],[-82.33908,41.34435],[-82.33813,41.34447],[-82.33673,41.34462],[-82.33525,41.34476],[-82.3335,41.3449],[-82.33187,41.34503],[-82.33047,41.34516],[-82.32879,41.34535],[-82.32726,41.34555],[-82.32578,41.34577],[-82.3233,41.34621],[-82.32185,41.34651],[-82.32056,41.34678],[-82.3193,41.34709],[-82.31795,41.34743],[-82.31567,41.34807],[-82.314,41.3486],[-82.31274,41.34901],[-82.31138,41.3495],[-82.30998,41.35003],[-82.30951,41.35022],[-82.30756,41.35098],[-82.30015,41.35391],[-82.29984,41.35404],[-82.29908,41.35434],[-82.29526,41.35585],[-82.29245,41.35695],[-82.29049,41.35773],[-82.28124,41.36138],[-82.28038,41.36172],[-82.27903,41.3623],[-82.27859,41.3625],[-82.27787,41.36287],[-82.27682,41.36347],[-82.27604,41.36397],[-82.27519,41.36458],[-82.27436,41.36525],[-82.27349,41.36601],[-82.27262,41.3669],[-82.27069,41.36884],[-82.26696,41.37257],[-82.26648,41.37301],[-82.26597,41.37343],[-82.26571,41.37362],[-82.26542,41.37383],[-82.26524,41.37396],[-82.26475,41.37427],[-82.26392,41.37475],[-82.26337,41.37501],[-82.26265,41.37532],[-82.26195,41.3756],[-82.26114,41.37586],[-82.26049,41.37603],[-82.25974,41.37621],[-82.25906,41.37634],[-82.25834,41.37644],[-82.25767,41.37651],[-82.25703,41.37655],[-82.25299,41.3767],[-82.25245,41.37672],[-82.24842,41.37687],[-82.24795,41.37688],[-82.23926,41.37719],[-82.23914,41.3772],[-82.23736,41.37726],[-82.23488,41.37735],[-82.23317,41.3774],[-82.23144,41.37751],[-82.23019,41.37761],[-82.22926,41.37772],[-82.22883,41.37777],[-82.22826,41.37783],[-82.22714,41.37799],[-82.22464,41.3784],[-82.22121,41.37895],[-82.21987,41.37917],[-82.21908,41.37929],[-82.21539,41.37989],[-82.21052,41.3807],[-82.20994,41.38079],[-82.20883,41.38097],[-82.20814,41.38108],[-82.20262,41.38197],[-82.20152,41.38216],[-82.19634,41.38299],[-82.1899,41.38401],[-82.1885,41.38423],[-82.18722,41.38446],[-82.18646,41.38461],[-82.18565,41.38478],[-82.18493,41.38495],[-82.18411,41.38514],[-82.18335,41.38536],[-82.18227,41.38567],[-82.18099,41.38604],[-82.17943,41.38647],[-82.17927,41.38652],[-82.17569,41.38755],[-82.17478,41.38779],[-82.17394,41.38799],[-82.17311,41.38817],[-82.17208,41.38836],[-82.17065,41.38856],[-82.16934,41.3887],[-82.16683,41.38888],[-82.16335,41.38912],[-82.15194,41.38991],[-82.14985,41.39005],[-82.14913,41.3901],[-82.14626,41.39029],[-82.14403,41.39046],[-82.14351,41.39049],[-82.13906,41.39079],[-82.13802,41.39086],[-82.13566,41.39103],[-82.13296,41.39121],[-82.13104,41.39135],[-82.13052,41.39138],[-82.12994,41.39141],[-82.12798,41.39156],[-82.12583,41.3917],[-82.12518,41.39174],[-82.12471,41.39177],[-82.12421,41.39176],[-82.12377,41.39175],[-82.12315,41.3917],[-82.12279,41.39165],[-82.12244,41.3916],[-82.12202,41.39151],[-82.12169,41.39143],[-82.12137,41.39134],[-82.12115,41.39127],[-82.12083,41.39117],[-82.12053,41.39106],[-82.1188,41.39036],[-82.11698,41.38961],[-82.11667,41.38949],[-82.11624,41.38932],[-82.11528,41.38892],[-82.11076,41.38712],[-82.10936,41.38653],[-82.10839,41.38612],[-82.10741,41.38571],[-82.10704,41.38556],[-82.10625,41.38527],[-82.10599,41.38518],[-82.10523,41.38494],[-82.10466,41.38477],[-82.10415,41.38465],[-82.10367,41.38453],[-82.10327,41.38444],[-82.1027,41.38433],[-82.10209,41.3842],[-82.10168,41.38413],[-82.10098,41.38403],[-82.10012,41.38394],[-82.09983,41.38391],[-82.0994,41.38388],[-82.09895,41.38385],[-82.09845,41.38383],[-82.09811,41.38382],[-82.09738,41.38381],[-82.09693,41.38381],[-82.09634,41.38383],[-82.09593,41.38385],[-82.09549,41.38387],[-82.09464,41.38394],[-82.09421,41.38399],[-82.09365,41.38407],[-82.09322,41.38413],[-82.09237,41.38427],[-82.09192,41.38436],[-82.08503,41.38571],[-82.08412,41.38588],[-82.08268,41.38617],[-82.08168,41.38636],[-82.08126,41.38642],[-82.08096,41.38647],[-82.08064,41.3865],[-82.0804,41.38653],[-82.07977,41.38656],[-82.07936,41.38658],[-82.07907,41.38658],[-82.07873,41.38657],[-82.07846,41.38656],[-82.078,41.38652],[-82.07778,41.38649],[-82.07743,41.38646],[-82.07716,41.38642],[-82.07657,41.38631],[-82.07607,41.3862],[-82.07579,41.38613],[-82.07511,41.38592],[-82.07447,41.3857],[-82.0742,41.38559],[-82.07388,41.38544],[-82.07335,41.38518],[-82.073,41.38499],[-82.07284,41.3849],[-82.07251,41.3847],[-82.07209,41.3844],[-82.07172,41.38412],[-82.07132,41.3838],[-82.07084,41.38338],[-82.07008,41.38274],[-82.06917,41.38199],[-82.06898,41.38183],[-82.06867,41.38159],[-82.06839,41.3814],[-82.06765,41.38091],[-82.06726,41.38067],[-82.06658,41.38028],[-82.0658,41.37989],[-82.06507,41.37955],[-82.06427,41.37923],[-82.06368,41.37901],[-82.06294,41.37877],[-82.06244,41.37861],[-82.06134,41.37834],[-82.06074,41.3782],[-82.0601,41.37808],[-82.05948,41.37798],[-82.0589,41.37791],[-82.0583,41.37784],[-82.05783,41.37781],[-82.05719,41.37777],[-82.05641,41.37775],[-82.05581,41.37775],[-82.0553,41.37776],[-82.05478,41.37778],[-82.05349,41.37786],[-82.05277,41.37792],[-82.04857,41.37823],[-82.04451,41.37852],[-82.04012,41.37884],[-82.03595,41.37914],[-82.0324,41.3794],[-82.02793,41.37973],[-82.02633,41.37982],[-82.02572,41.37984],[-82.02527,41.37986],[-82.02386,41.3799],[-82.02273,41.37992],[-82.02259,41.37992],[-82.02097,41.37991],[-82.01953,41.37987],[-82.01851,41.37984],[-82.01074,41.37938],[-82.00802,41.37923],[-82.00678,41.37918],[-82.00628,41.37917],[-82.00452,41.37914],[-82.00383,41.37914],[-81.99501,41.37911],[-81.99476,41.37912],[-81.99398,41.37912],[-81.99335,41.3791],[-81.99273,41.37907],[-81.99222,41.37903],[-81.99169,41.37898],[-81.99143,41.37896],[-81.99088,41.3789],[-81.99034,41.37882],[-81.98992,41.37874],[-81.98952,41.37867],[-81.98915,41.37859],[-81.98848,41.37846],[-81.98814,41.37838],[-81.98759,41.37824],[-81.98733,41.37817],[-81.98632,41.37787],[-81.98604,41.37777],[-81.98551,41.37759],[-81.98498,41.37739],[-81.9841,41.37703],[-81.9835,41.37676],[-81.9829,41.37647],[-81.98237,41.37618],[-81.98156,41.37577],[-81.98053,41.3751],[-81.97563,41.37163],[-81.97451,41.37087],[-81.97397,41.37054],[-81.97319,41.3701],[-81.97252,41.36977],[-81.97187,41.36947],[-81.97114,41.36917],[-81.97101,41.36912],[-81.97074,41.36902],[-81.96911,41.36851],[-81.96746,41.36812],[-81.96585,41.36786],[-81.96427,41.36772],[-81.96245,41.36769],[-81.96096,41.36775],[-81.94908,41.36907],[-81.94695,41.36924],[-81.94524,41.36929],[-81.94356,41.36924],[-81.94186,41.36913],[-81.94002,41.36886],[-81.93013,41.36705],[-81.92897,41.36676],[-81.92728,41.36621],[-81.92568,41.36547],[-81.92222,41.36352],[-81.91482,41.35939],[-81.91374,41.35886],[-81.91246,41.35834],[-81.91127,41.35795],[-81.91023,41.35767],[-81.90879,41.35738],[-81.90752,41.35722],[-81.90611,41.35713],[-81.8963,41.35696],[-81.89546,41.35695],[-81.89315,41.3569],[-81.8925,41.35689],[-81.88936,41.35681],[-81.88698,41.35665],[-81.88419,41.35632],[-81.88155,41.35587],[-81.87886,41.35526],[-81.87679,41.35472],[-81.87532,41.35426],[-81.87325,41.35352],[-81.87054,41.35236],[-81.86502,41.34998],[-81.86004,41.34789],[-81.85838,41.34724],[-81.85743,41.34691],[-81.85578,41.34635],[-81.85469,41.34595],[-81.84507,41.34262],[-81.84427,41.34239],[-81.84355,41.34225],[-81.84301,41.34218],[-81.84246,41.34211],[-81.84189,41.34207],[-81.84106,41.34208],[-81.83751,41.34228],[-81.83664,41.34233],[-81.83623,41.34236],[-81.83557,41.34239],[-81.83381,41.34246],[-81.83296,41.34244],[-81.83211,41.34238],[-81.83124,41.34225],[-81.8303,41.34205],[-81.82955,41.34182],[-81.8288,41.34154],[-81.82803,41.34123],[-81.82737,41.34086],[-81.82664,41.34041],[-81.82595,41.33991],[-81.82469,41.33867],[-81.8235,41.33736],[-81.82272,41.33651],[-81.82167,41.33531],[-81.82116,41.33485],[-81.81985,41.33396],[-81.81918,41.33358],[-81.8184,41.33326],[-81.81503,41.33218],[-81.81042,41.33079],[-81.80808,41.33016],[-81.80571,41.32956],[-81.79918,41.32811],[-81.79591,41.32739],[-81.79431,41.327],[-81.79275,41.32655],[-81.79098,41.32592],[-81.78933,41.32521],[-81.78773,41.32447],[-81.7863,41.32368],[-81.78062,41.3209],[-81.77821,41.31991],[-81.7737,41.31829],[-81.77152,41.31762],[-81.7626,41.31506],[-81.76,41.31421],[-81.75749,41.31312],[-81.75656,41.31265],[-81.75561,41.31215],[-81.75505,41.31183],[-81.74589,41.30613],[-81.74511,41.30573],[-81.74424,41.30528],[-81.74237,41.30454],[-81.74022,41.30398],[-81.73882,41.30372],[-81.73766,41.30352],[-81.73636,41.30334],[-81.73546,41.30327],[-81.73197,41.30324],[-81.71882,41.30306],[-81.7111,41.30296],[-81.70795,41.30267],[-81.70612,41.3024],[-81.70509,41.30213],[-81.70348,41.30171],[-81.70206,41.30128],[-81.70074,41.30086],[-81.69887,41.30011],[-81.6943,41.29823],[-81.68922,41.29655],[-81.68413,41.29501],[-81.67896,41.29349],[-81.67762,41.2931],[-81.67018,41.29093],[-81.6664,41.28983],[-81.66495,41.2892],[-81.66354,41.28843],[-81.66138,41.28694],[-81.65795,41.28468],[-81.6562,41.28354],[-81.65437,41.28254],[-81.65238,41.28167],[-81.65035,41.28084],[-81.64633,41.27915],[-81.64051,41.277],[-81.63873,41.27637],[-81.63825,41.27622],[-81.63699,41.27578],[-81.63572,41.27539],[-81.63465,41.27505],[-81.63339,41.27464],[-81.62961,41.27351],[-81.62804,41.2731],[-81.62765,41.27298],[-81.62706,41.2728],[-81.62664,41.27265],[-81.62647,41.27258],[-81.62589,41.27234],[-81.62556,41.2722],[-81.62521,41.27206],[-81.62473,41.27187],[-81.62389,41.27144],[-81.62339,41.27115],[-81.62297,41.27088],[-81.62273,41.27075],[-81.62142,41.26985],[-81.62118,41.26966],[-81.62101,41.26953],[-81.61884,41.26811],[-81.61782,41.26743],[-81.61424,41.26503],[-81.61379,41.26473],[-81.61279,41.26405],[-81.61079,41.2627],[-81.60978,41.26202],[-81.6091,41.26158],[-81.60854,41.26123],[-81.60751,41.26059],[-81.60629,41.25986],[-81.60496,41.25912],[-81.60285,41.25801],[-81.60144,41.25733],[-81.60024,41.25677],[-81.59939,41.2564],[-81.59846,41.256],[-81.59775,41.25571],[-81.59688,41.25537],[-81.59588,41.255],[-81.59484,41.25465],[-81.59428,41.25446],[-81.59391,41.25434],[-81.59301,41.25407],[-81.59207,41.25381],[-81.59195,41.25378],[-81.59118,41.25358],[-81.59087,41.2535],[-81.59073,41.25347],[-81.59042,41.25339],[-81.59003,41.2533],[-81.58924,41.25313],[-81.58884,41.25304],[-81.58749,41.25277],[-81.58689,41.25268],[-81.58542,41.25246],[-81.58434,41.2523],[-81.58341,41.2522],[-81.58257,41.25212],[-81.58168,41.25204],[-81.58014,41.25195],[-81.57914,41.25192],[-81.57823,41.2519],[-81.57723,41.2519],[-81.57629,41.25191],[-81.57546,41.25194],[-81.57455,41.25198],[-81.57417,41.25201],[-81.5737,41.25203],[-81.57332,41.25206],[-81.57211,41.25216],[-81.57106,41.25227],[-81.57077,41.25231],[-81.56985,41.25243],[-81.56947,41.25249],[-81.56844,41.25265],[-81.56807,41.25271],[-81.56727,41.25286],[-81.56576,41.25312],[-81.56453,41.25335],[-81.5635,41.25359],[-81.56274,41.25376],[-81.56207,41.25393],[-81.56107,41.25418],[-81.56059,41.25432],[-81.55962,41.25458],[-81.55787,41.25521],[-81.55618,41.25575],[-81.55556,41.25595],[-81.55214,41.25689],[-81.55168,41.25704],[-81.55131,41.25716],[-81.5509,41.25728],[-81.55059,41.25736],[-81.5503,41.25744],[-81.55003,41.2575],[-81.54978,41.25754],[-81.54947,41.25759],[-81.5491,41.25762],[-81.54879,41.25765],[-81.5485,41.25767],[-81.54815,41.25768],[-81.54782,41.25767],[-81.54741,41.25766],[-81.54694,41.25763],[-81.54643,41.25754],[-81.54538,41.25735],[-81.54468,41.25724],[-81.5443,41.25716],[-81.54313,41.25695],[-81.54262,41.25686],[-81.5421,41.25679],[-81.54155,41.25673],[-81.54119,41.2567],[-81.54077,41.25666],[-81.53998,41.25661],[-81.53952,41.25659],[-81.53945,41.25659],[-81.5384,41.25657],[-81.53797,41.25658],[-81.53761,41.25659],[-81.53711,41.25661],[-81.53456,41.25674],[-81.53389,41.25678],[-81.53302,41.25682],[-81.52826,41.25708],[-81.52705,41.25714],[-81.5201,41.25752],[-81.51217,41.25795],[-81.50979,41.25808],[-81.50827,41.25816],[-81.50746,41.2582],[-81.50671,41.25824],[-81.50521,41.25832],[-81.5035,41.25841],[-81.50278,41.25845],[-81.50208,41.25849],[-81.50152,41.25851],[-81.49969,41.25852],[-81.49883,41.25851],[-81.49761,41.2585],[-81.49617,41.25842],[-81.4943,41.25827],[-81.49329,41.25816],[-81.49191,41.25798],[-81.49057,41.25778],[-81.48955,41.25762],[-81.48744,41.2573],[-81.48695,41.25723],[-81.48439,41.25683],[-81.48387,41.25675],[-81.48278,41.25658],[-81.48243,41.25653],[-81.48166,41.25641],[-81.48132,41.25636],[-81.48024,41.25619],[-81.47963,41.2561],[-81.47875,41.25596],[-81.47776,41.25582],[-81.47725,41.25575],[-81.47629,41.25562],[-81.47547,41.25552],[-81.47438,41.25541],[-81.47371,41.25535],[-81.47306,41.2553],[-81.47275,41.25527],[-81.47252,41.25525],[-81.47132,41.25517],[-81.4709,41.25514],[-81.46979,41.25509],[-81.46876,41.25505],[-81.46802,41.25503],[-81.46351,41.25496],[-81.46314,41.25496],[-81.4627,41.25495],[-81.46161,41.25493],[-81.46117,41.25492],[-81.45816,41.25488],[-81.45778,41.25487],[-81.45735,41.25486],[-81.45322,41.25479],[-81.4507,41.25476],[-81.44587,41.25468],[-81.44562,41.25467],[-81.44513,41.25467],[-81.44461,41.25467],[-81.444,41.25465],[-81.44392,41.25465],[-81.44161,41.25462],[-81.44084,41.25459],[-81.44054,41.25459],[-81.43934,41.25455],[-81.43818,41.25449],[-81.4368,41.2544],[-81.43384,41.25417],[-81.4289,41.25379],[-81.42748,41.25368],[-81.42521,41.25351],[-81.42365,41.25338],[-81.4228,41.25332],[-81.42182,41.25324],[-81.42112,41.25319],[-81.42078,41.25317],[-81.41972,41.25308],[-81.41921,41.25304],[-81.41852,41.25299],[-81.418,41.25294],[-81.41655,41.25284],[-81.4151,41.25275],[-81.41384,41.25271],[-81.41268,41.2527],[-81.41198,41.2527],[-81.41099,41.25273],[-81.41035,41.25275],[-81.4097,41.25278],[-81.40818,41.25288],[-81.4073,41.25296],[-81.40709,41.25298],[-81.40452,41.25318],[-81.40356,41.25326],[-81.40338,41.25328],[-81.40273,41.25332],[-81.40226,41.25337],[-81.40195,41.25338],[-81.39931,41.25361],[-81.39879,41.25366],[-81.39724,41.25378],[-81.39543,41.25392],[-81.39175,41.25422],[-81.38699,41.2546],[-81.38634,41.25466],[-81.3855,41.25474],[-81.38441,41.25483],[-81.38316,41.25494],[-81.38184,41.25504],[-81.37934,41.25521],[-81.37816,41.25532],[-81.3742,41.25565],[-81.37286,41.25574],[-81.37205,41.25582],[-81.37163,41.25587],[-81.37017,41.25599],[-81.36962,41.25603],[-81.36925,41.25606],[-81.36894,41.25607],[-81.36798,41.25614],[-81.36682,41.25618],[-81.36561,41.25622],[-81.36475,41.25622],[-81.36405,41.25618],[-81.36344,41.25613],[-81.36254,41.25605],[-81.36216,41.25601],[-81.36173,41.25597],[-81.36123,41.2559],[-81.36116,41.25589],[-81.36074,41.25583],[-81.3603,41.25577],[-81.35989,41.25571],[-81.35906,41.25555],[-81.35818,41.25537],[-81.3575,41.25524],[-81.35689,41.25512],[-81.35587,41.25492],[-81.35492,41.25475],[-81.35309,41.25442],[-81.35208,41.25423],[-81.35107,41.25403],[-81.35004,41.25383],[-81.34899,41.25362],[-81.34793,41.25342],[-81.34686,41.25323],[-81.34568,41.25304],[-81.34519,41.25295],[-81.34379,41.25274],[-81.34305,41.25264],[-81.34245,41.25256],[-81.34146,41.25245],[-81.33958,41.25227],[-81.33862,41.25219],[-81.33764,41.25212],[-81.33645,41.25201],[-81.33587,41.25196],[-81.33502,41.25189],[-81.33243,41.25168],[-81.33156,41.25161],[-81.33066,41.25154],[-81.32967,41.25146],[-81.32871,41.25138],[-81.3279,41.25131],[-81.32554,41.251],[-81.3246,41.25088],[-81.32333,41.25069],[-81.32301,41.25065],[-81.32238,41.25055],[-81.32189,41.25048],[-81.32148,41.25042],[-81.32126,41.25036],[-81.32104,41.25031],[-81.32079,41.25027],[-81.32049,41.25023],[-81.32009,41.25017],[-81.31979,41.25013],[-81.31938,41.25006],[-81.31885,41.24998],[-81.31826,41.24989],[-81.31697,41.2497],[-81.31617,41.24956],[-81.31585,41.24951],[-81.31552,41.24947],[-81.31518,41.24941],[-81.31485,41.24936],[-81.31456,41.24932],[-81.31409,41.24926],[-81.3134,41.24915],[-81.31295,41.24908],[-81.31237,41.249],[-81.31187,41.24893],[-81.31135,41.24886],[-81.3102,41.24874],[-81.30989,41.24871],[-81.30931,41.24865],[-81.30888,41.24861],[-81.30856,41.24858],[-81.30825,41.24856],[-81.30743,41.24852],[-81.30669,41.24849],[-81.30532,41.24844],[-81.30431,41.2484],[-81.30275,41.24836],[-81.30154,41.24834],[-81.30022,41.24833],[-81.29872,41.24829],[-81.29854,41.24829],[-81.29591,41.24821],[-81.29468,41.2482],[-81.29137,41.24813],[-81.28987,41.24811],[-81.28912,41.24809],[-81.28758,41.24808],[-81.28641,41.24806],[-81.2856,41.24804],[-81.28451,41.24802],[-81.28427,41.24801],[-81.2835,41.24799],[-81.28233,41.24795],[-81.28128,41.24793],[-81.28042,41.2479],[-81.27942,41.24787],[-81.27739,41.24783],[-81.27624,41.2478],[-81.27591,41.24779],[-81.27541,41.24777],[-81.2747,41.24772],[-81.27407,41.24769],[-81.27329,41.24762],[-81.27264,41.24758],[-81.27126,41.24742],[-81.26997,41.24728],[-81.26871,41.24715],[-81.26735,41.24701],[-81.26618,41.2469],[-81.26554,41.24683],[-81.26385,41.24667],[-81.26089,41.24637],[-81.25965,41.24627],[-81.25822,41.24616],[-81.25692,41.24607],[-81.25627,41.24603],[-81.25531,41.24599],[-81.25105,41.24577],[-81.2506,41.24574],[-81.24918,41.24568],[-81.24785,41.24561],[-81.24272,41.24532],[-81.23449,41.24488],[-81.23032,41.24466],[-81.2296,41.24463],[-81.22782,41.24453],[-81.22481,41.24438],[-81.21053,41.24362],[-81.19614,41.24357],[-81.18795,41.24353],[-81.18465,41.24348],[-81.18169,41.24348],[-81.18062,41.24347],[-81.18005,41.24346],[-81.17824,41.24347],[-81.17164,41.24341],[-81.16208,41.24335],[-81.16018,41.24335],[-81.1545,41.24329],[-81.15373,41.24327],[-81.15211,41.2432],[-81.1491,41.24299],[-81.14735,41.24289],[-81.14678,41.24286],[-81.14546,41.24277],[-81.14186,41.24255],[-81.13826,41.24231],[-81.13682,41.24224],[-81.13517,41.2422],[-81.13451,41.24219],[-81.13243,41.24219],[-81.12985,41.24228],[-81.11525,41.24301],[-81.11324,41.24313],[-81.11085,41.24321],[-81.10575,41.24348],[-81.09994,41.24375],[-81.09762,41.24388],[-81.09649,41.24392],[-81.09436,41.24402],[-81.09338,41.24403],[-81.09042,41.24404],[-81.08901,41.24403],[-81.08756,41.24399],[-81.08546,41.24388],[-81.08239,41.24365],[-81.08118,41.24354],[-81.07936,41.24336],[-81.07554,41.24304],[-81.07144,41.24273],[-81.07018,41.24266],[-81.06667,41.24238],[-81.06618,41.24234],[-81.06485,41.24223],[-81.06305,41.2421],[-81.0615,41.242],[-81.06032,41.24195],[-81.05615,41.24189],[-81.05249,41.24186],[-81.04915,41.24182],[-81.04853,41.24181],[-81.04704,41.24179],[-81.04555,41.24177],[-81.04196,41.2417],[-81.04144,41.24171],[-81.03996,41.24168],[-81.03927,41.24168],[-81.03825,41.24166],[-81.03698,41.24164],[-81.03566,41.24161],[-81.03441,41.24161],[-81.03319,41.24156],[-81.03187,41.24157],[-81.03045,41.24155],[-81.03007,41.24153],[-81.02748,41.24153],[-81.026,41.24153],[-81.02467,41.24151],[-81.02321,41.24148],[-81.02173,41.24146],[-81.02078,41.24145],[-81.02058,41.24145],[-81.01949,41.24143],[-81.01839,41.24142],[-81.01728,41.24141],[-81.0162,41.2414],[-81.01516,41.24139],[-81.01414,41.24137],[-81.01317,41.24135],[-81.0122,41.24135],[-81.01117,41.24135],[-81.01009,41.24133],[-81.00901,41.24131],[-81.00789,41.2413],[-81.0068,41.24128],[-81.0057,41.24126],[-81.0046,41.24125],[-81.00353,41.24124],[-81.00247,41.24123],[-81.0014,41.24121],[-80.99983,41.24118],[-80.99836,41.24116],[-80.9969,41.24114],[-80.9962,41.24112],[-80.99545,41.24108],[-80.99535,41.24108],[-80.99467,41.24103],[-80.99392,41.24095],[-80.99315,41.24086],[-80.99264,41.24079],[-80.99216,41.24072],[-80.99168,41.24064],[-80.99122,41.24055],[-80.99072,41.24045],[-80.99022,41.24034],[-80.98972,41.24022],[-80.98927,41.24011],[-80.98884,41.23999],[-80.98836,41.23986],[-80.98762,41.23963],[-80.98734,41.23951],[-80.98614,41.2391],[-80.98582,41.23898],[-80.98548,41.23884],[-80.98468,41.23849],[-80.98425,41.2383],[-80.98355,41.23795],[-80.98293,41.23763],[-80.98234,41.2373],[-80.98164,41.23688],[-80.98143,41.23675],[-80.98113,41.23656],[-80.98034,41.23603],[-80.97869,41.23491],[-80.97672,41.23356],[-80.96949,41.22868],[-80.96868,41.22812],[-80.9674,41.22723],[-80.96229,41.22377],[-80.96195,41.22354],[-80.96133,41.22311],[-80.96052,41.22256],[-80.95798,41.2208],[-80.95751,41.22048],[-80.95691,41.22008],[-80.95626,41.21966],[-80.95407,41.21818],[-80.95324,41.2176],[-80.95288,41.21733],[-80.95274,41.21721],[-80.95199,41.21646],[-80.95185,41.2163],[-80.95167,41.21608],[-80.95152,41.21587],[-80.95136,41.21563],[-80.95122,41.21539],[-80.9511,41.21518],[-80.951,41.21498],[-80.95082,41.21456],[-80.95074,41.21433],[-80.95062,41.21394],[-80.95044,41.21331],[-80.94935,41.2096],[-80.94898,41.20835],[-80.94892,41.20813],[-80.94829,41.20599],[-80.94816,41.20556],[-80.94746,41.20314],[-80.9473,41.20261],[-80.94728,41.20255],[-80.9471,41.20194],[-80.94688,41.20128],[-80.94669,41.20076],[-80.9465,41.20029],[-80.94645,41.20017],[-80.94581,41.19883],[-80.94522,41.19775],[-80.94469,41.19688],[-80.94423,41.19622],[-80.94359,41.19537],[-80.94306,41.19472],[-80.9428,41.19441],[-80.94257,41.19414],[-80.94226,41.19381],[-80.94172,41.19324],[-80.94112,41.19266],[-80.94054,41.19213],[-80.93629,41.18832],[-80.9358,41.1879],[-80.93473,41.18694],[-80.93384,41.18616],[-80.93361,41.18596],[-80.93313,41.18556],[-80.93222,41.18483],[-80.93115,41.18403],[-80.92938,41.18276],[-80.92931,41.18269],[-80.92926,41.18265],[-80.92865,41.18221],[-80.92809,41.18183],[-80.92329,41.17838],[-80.92222,41.1776],[-80.92148,41.17703],[-80.92094,41.1766],[-80.92026,41.17603],[-80.92,41.17579],[-80.91918,41.17506],[-80.91776,41.17375],[-80.91631,41.17242],[-80.91619,41.17231],[-80.91089,41.16746],[-80.90984,41.16648],[-80.90948,41.16614],[-80.90578,41.16277],[-80.90028,41.15773],[-80.89863,41.15621],[-80.89843,41.15603],[-80.89823,41.15584],[-80.89756,41.15523],[-80.89723,41.15491],[-80.8963,41.15405],[-80.89604,41.15382],[-80.89601,41.15378],[-80.89561,41.15347],[-80.89482,41.15279],[-80.89427,41.15234],[-80.89344,41.15168],[-80.89308,41.1514],[-80.89214,41.15069],[-80.89142,41.15016],[-80.89095,41.14983],[-80.88974,41.149],[-80.88866,41.1483],[-80.88763,41.14766],[-80.88633,41.14688],[-80.88217,41.14438],[-80.88207,41.14433],[-80.88206,41.14432],[-80.88116,41.14378],[-80.87886,41.1424],[-80.87882,41.14238],[-80.87876,41.14234],[-80.87838,41.14211],[-80.87815,41.14195],[-80.87788,41.14178],[-80.87763,41.14163],[-80.87712,41.14133],[-80.87656,41.14101],[-80.87513,41.14016],[-80.87354,41.13921],[-80.8735,41.13919],[-80.87046,41.13736],[-80.87037,41.13731],[-80.86851,41.13619],[-80.86756,41.13558],[-80.86724,41.13539],[-80.86563,41.13444],[-80.86353,41.1332],[-80.86141,41.13193],[-80.86136,41.1319],[-80.85908,41.13053],[-80.85873,41.13033],[-80.85744,41.12952],[-80.85695,41.12922],[-80.85596,41.12863],[-80.85555,41.12838],[-80.85461,41.12782],[-80.85379,41.12731],[-80.85311,41.12687],[-80.85252,41.12646],[-80.85193,41.12603],[-80.85139,41.12561],[-80.85103,41.12532],[-80.85068,41.12502],[-80.85064,41.12499],[-80.85022,41.12462],[-80.8496,41.12406],[-80.84953,41.12399],[-80.84924,41.12371],[-80.84885,41.12332],[-80.84825,41.12268],[-80.84774,41.1221],[-80.84738,41.12166],[-80.84598,41.11997],[-80.84449,41.11813],[-80.84435,41.11792],[-80.8429,41.11606],[-80.84035,41.11283],[-80.83943,41.1117],[-80.83893,41.11109],[-80.83834,41.11035],[-80.83761,41.10943],[-80.83716,41.10887],[-80.83677,41.10839],[-80.8361,41.10755],[-80.8351,41.10629],[-80.83502,41.10619],[-80.83471,41.10578],[-80.83461,41.10566],[-80.8343,41.10529],[-80.8341,41.10504],[-80.83253,41.10307],[-80.83168,41.10201],[-80.8305,41.10053],[-80.83015,41.10009],[-80.83007,41.1],[-80.82983,41.09971],[-80.82825,41.09773],[-80.82713,41.09631],[-80.82687,41.096],[-80.82649,41.09555],[-80.82611,41.09511],[-80.82588,41.09486],[-80.82551,41.09445],[-80.82496,41.09388],[-80.82464,41.09355],[-80.82403,41.09297],[-80.82349,41.09248],[-80.82331,41.09231],[-80.82267,41.09175],[-80.82205,41.09123],[-80.82112,41.0905],[-80.82041,41.08997],[-80.81967,41.08944],[-80.81727,41.0878],[-80.81682,41.08752],[-80.81639,41.08724],[-80.81599,41.08693],[-80.81326,41.08507],[-80.81204,41.08423],[-80.81192,41.08414],[-80.81132,41.08373],[-80.8111,41.08359],[-80.81081,41.0834],[-80.81017,41.08296],[-80.80913,41.08226],[-80.80858,41.0819],[-80.808,41.08155],[-80.8077,41.08137],[-80.80719,41.08108],[-80.80669,41.08081],[-80.80622,41.08057],[-80.80569,41.0803],[-80.80498,41.07996],[-80.80345,41.07928],[-80.80296,41.07905],[-80.80231,41.07873],[-80.80166,41.0784],[-80.80127,41.07819],[-80.80088,41.07796],[-80.80051,41.07775],[-80.80017,41.07753],[-80.79952,41.07711],[-80.79913,41.07684],[-80.79875,41.07657],[-80.79813,41.07609],[-80.79754,41.07562],[-80.79703,41.07517],[-80.79632,41.07452],[-80.79539,41.07365],[-80.79245,41.07092],[-80.79144,41.06997],[-80.79104,41.0696],[-80.79064,41.06922],[-80.79023,41.06883],[-80.78947,41.06814],[-80.78899,41.06769],[-80.78878,41.06748],[-80.78829,41.06703],[-80.78776,41.06656],[-80.78553,41.06447],[-80.7847,41.06376],[-80.78415,41.06319],[-80.78251,41.06166],[-80.77714,41.05665],[-80.77438,41.05409],[-80.77108,41.05103],[-80.76848,41.0486],[-80.76641,41.04666],[-80.76518,41.04553],[-80.76458,41.04501],[-80.76409,41.04459],[-80.76405,41.04455],[-80.76333,41.04397],[-80.76256,41.04338],[-80.76163,41.0427],[-80.76098,41.04225],[-80.76002,41.04162],[-80.75915,41.04109],[-80.75835,41.04062],[-80.75765,41.04023],[-80.75647,41.0396],[-80.75608,41.0394],[-80.7553,41.03903],[-80.75441,41.03861],[-80.75335,41.03816],[-80.75194,41.03758],[-80.73711,41.03169],[-80.73268,41.02991],[-80.73204,41.02964],[-80.73141,41.02936],[-80.73047,41.02894],[-80.73001,41.02872],[-80.72955,41.0285],[-80.72869,41.02806],[-80.7285,41.02796],[-80.72751,41.02742],[-80.72676,41.02698],[-80.72582,41.02642],[-80.72524,41.02605],[-80.72462,41.02564],[-80.71925,41.02193],[-80.71861,41.02149],[-80.71838,41.02131],[-80.7164,41.01993],[-80.71555,41.01934],[-80.71461,41.01864],[-80.71396,41.01813],[-80.71334,41.01763],[-80.71267,41.01705],[-80.71205,41.01648],[-80.71151,41.01598],[-80.71105,41.01553],[-80.71063,41.01509],[-80.7102,41.01464],[-80.70975,41.01414],[-80.70932,41.01364],[-80.70906,41.01333],[-80.70903,41.0133],[-80.7086,41.01278],[-80.69472,40.9959],[-80.69382,40.9948],[-80.69221,40.99283],[-80.69155,40.99204],[-80.69147,40.99193],[-80.68992,40.99005],[-80.68839,40.98823],[-80.68811,40.98787],[-80.68766,40.98733],[-80.68658,40.98615],[-80.68531,40.98491],[-80.6838,40.98357],[-80.68359,40.9834],[-80.68341,40.98326],[-80.68285,40.98281],[-80.68241,40.98247],[-80.68197,40.98214],[-80.68138,40.98172],[-80.68094,40.98141],[-80.68011,40.98086],[-80.67977,40.98063],[-80.67931,40.98035],[-80.67839,40.97979],[-80.67729,40.97917],[-80.67652,40.97876],[-80.67588,40.97842],[-80.67303,40.97693],[-80.67019,40.97544],[-80.66956,40.97512],[-80.66907,40.97486],[-80.668,40.97429],[-80.66706,40.97379],[-80.66635,40.97343],[-80.66558,40.97303],[-80.66278,40.97156],[-80.66101,40.97063],[-80.6603,40.97023],[-80.65901,40.96945],[-80.65829,40.96899],[-80.65811,40.96886],[-80.6572,40.96829],[-80.65667,40.96792],[-80.65636,40.9677],[-80.65584,40.96734],[-80.65537,40.96697],[-80.65461,40.96642],[-80.65429,40.96615],[-80.65418,40.96606],[-80.65367,40.9657],[-80.65319,40.96536],[-80.65253,40.96489],[-80.6524,40.96481],[-80.65135,40.96404],[-80.6512,40.96392],[-80.6478,40.96143],[-80.64614,40.96023],[-80.64001,40.95567],[-80.63892,40.95494],[-80.63846,40.95459],[-80.63718,40.95367],[-80.63683,40.95341],[-80.63577,40.95263],[-80.63521,40.95221],[-80.63493,40.95201],[-80.63457,40.95176],[-80.63437,40.9516],[-80.63377,40.95112],[-80.63336,40.95082],[-80.63161,40.94957],[-80.63137,40.9494],[-80.63072,40.94896],[-80.63005,40.94854],[-80.6298,40.94839],[-80.62924,40.94807],[-80.62887,40.94788],[-80.62847,40.94767],[-80.62803,40.94746],[-80.6273,40.94715],[-80.62649,40.9468],[-80.62597,40.94661],[-80.62514,40.94632],[-80.62423,40.94605],[-80.62366,40.9459],[-80.62286,40.94571],[-80.62282,40.9457],[-80.62177,40.94549],[-80.59243,40.94046],[-80.59157,40.94031],[-80.59087,40.9402],[-80.58957,40.93997],[-80.5861,40.93938],[-80.58506,40.93919],[-80.58465,40.93911],[-80.5839,40.93894],[-80.58343,40.93883],[-80.583,40.93871],[-80.58239,40.93854],[-80.5817,40.93831],[-80.58112,40.93809],[-80.5806,40.9379],[-80.58022,40.93774],[-80.57954,40.93744],[-80.57899,40.93718],[-80.57834,40.93685],[-80.57827,40.93681],[-80.57787,40.93659],[-80.57744,40.93635],[-80.57704,40.9361],[-80.5767,40.9359],[-80.57626,40.93562],[-80.57409,40.93425],[-80.5722,40.93306],[-80.57176,40.93279],[-80.56935,40.93128],[-80.56724,40.92996],[-80.56424,40.92807],[-80.56322,40.92744],[-80.56248,40.92699],[-80.56187,40.92663],[-80.56126,40.92628],[-80.56052,40.92589],[-80.55969,40.92546],[-80.55919,40.92521],[-80.558,40.92465],[-80.55737,40.92438],[-80.557,40.92422],[-80.55662,40.92406],[-80.55609,40.92384],[-80.55555,40.92364],[-80.55486,40.92338],[-80.55438,40.92321],[-80.55387,40.92303],[-80.55318,40.9228],[-80.5527,40.92265],[-80.55166,40.92233],[-80.55111,40.92218],[-80.55038,40.92198],[-80.53142,40.91716],[-80.52959,40.9167],[-80.52903,40.91654],[-80.52861,40.91642],[-80.52793,40.91619],[-80.52754,40.91606],[-80.52707,40.91588],[-80.52645,40.91563],[-80.52611,40.91549],[-80.52575,40.91533],[-80.52525,40.91509],[-80.52486,40.9149],[-80.52455,40.91473],[-80.52413,40.9145],[-80.52388,40.91436],[-80.52321,40.91395],[-80.52247,40.91346],[-80.51968,40.91148],[-80.51876,40.91082],[-80.51822,40.91045],[-80.51775,40.91016],[-80.51715,40.90981],[-80.51668,40.90955],[-80.51624,40.90932],[-80.51581,40.90911],[-80.51526,40.90886],[-80.51471,40.90862],[-80.51411,40.90838],[-80.51361,40.9082],[-80.51305,40.908],[-80.51237,40.9078],[-80.51183,40.90764],[-80.51119,40.90747],[-80.51067,40.90735],[-80.51009,40.90722],[-80.50957,40.90712],[-80.50882,40.90696],[-80.50532,40.90626],[-80.50345,40.90588],[-80.50252,40.90568],[-80.50159,40.90549],[-80.50138,40.90544],[-80.49967,40.9051],[-80.49893,40.90499],[-80.4977,40.90476],[-80.49636,40.90452],[-80.49527,40.90432],[-80.49445,40.90415],[-80.49359,40.90397],[-80.49306,40.90386],[-80.49229,40.90366],[-80.49172,40.90352],[-80.49112,40.90336],[-80.49054,40.9032],[-80.48967,40.90295],[-80.48852,40.90257],[-80.48835,40.9025],[-80.48751,40.9022],[-80.48685,40.90196],[-80.48546,40.90143],[-80.484,40.90089],[-80.48192,40.90012],[-80.48054,40.89961],[-80.48028,40.89951],[-80.47953,40.89924],[-80.4794,40.89919],[-80.47126,40.89619],[-80.46411,40.89355],[-80.46212,40.89282],[-80.46122,40.89249],[-80.46072,40.89232],[-80.4604,40.89221],[-80.45963,40.89197],[-80.45898,40.89176],[-80.45844,40.89161],[-80.45785,40.89145],[-80.45742,40.89133],[-80.45706,40.89124],[-80.45638,40.89107],[-80.45556,40.89088],[-80.45484,40.89072],[-80.45412,40.89058],[-80.44535,40.88888],[-80.44217,40.88826],[-80.4365,40.88716],[-80.43342,40.88656],[-80.43296,40.88647],[-80.43249,40.88635],[-80.43207,40.88625],[-80.43165,40.88613],[-80.43123,40.88598],[-80.43089,40.88586],[-80.43042,40.88567],[-80.43005,40.8855],[-80.42975,40.88536],[-80.42928,40.88512],[-80.4289,40.8849],[-80.4286,40.88472],[-80.42825,40.88449],[-80.42587,40.88293],[-80.42318,40.88115],[-80.4197,40.87886],[-80.4174,40.87736],[-80.41728,40.87727],[-80.411,40.87314],[-80.40826,40.87133],[-80.40445,40.86883],[-80.40399,40.86852],[-80.4037,40.8683],[-80.40337,40.86805],[-80.40312,40.86786],[-80.4029,40.86767],[-80.40262,40.86742],[-80.40232,40.86714],[-80.40202,40.86685],[-80.40172,40.86653],[-80.40135,40.8661],[-80.40103,40.86571],[-80.40072,40.8653],[-80.40051,40.865],[-80.40035,40.86475],[-80.40015,40.86443],[-80.3999,40.86397],[-80.39971,40.86359],[-80.39954,40.86317],[-80.39938,40.86279],[-80.39918,40.86215],[-80.39889,40.86118],[-80.39854,40.86004],[-80.39773,40.85735],[-80.39693,40.85472],[-80.39649,40.85326],[-80.39634,40.85283],[-80.39616,40.85235],[-80.39592,40.85176],[-80.39572,40.85129],[-80.39557,40.85098],[-80.39539,40.85062],[-80.39517,40.8502],[-80.39496,40.84982],[-80.39474,40.84945],[-80.39445,40.849],[-80.39416,40.84856],[-80.39384,40.8481],[-80.39357,40.84774],[-80.39321,40.84728],[-80.39294,40.84696],[-80.39268,40.84665],[-80.39226,40.84618],[-80.39183,40.84573],[-80.39134,40.84524],[-80.39089,40.84481],[-80.39043,40.8444],[-80.38997,40.84402],[-80.38959,40.84371],[-80.38922,40.84342],[-80.38879,40.8431],[-80.38843,40.84284],[-80.388,40.84255],[-80.38738,40.84213],[-80.38675,40.84175],[-80.38624,40.84145],[-80.38543,40.84099],[-80.38453,40.84048],[-80.38346,40.8399],[-80.38188,40.83901],[-80.38088,40.83845],[-80.38022,40.8381],[-80.37769,40.83667],[-80.37668,40.83609],[-80.37627,40.83587],[-80.37579,40.83562],[-80.37501,40.83527],[-80.37449,40.83508],[-80.37383,40.83486],[-80.37326,40.8347],[-80.37265,40.83457],[-80.37225,40.83448],[-80.37185,40.83441],[-80.37128,40.83433],[-80.37069,40.83427],[-80.36965,40.83417],[-80.36834,40.83404],[-80.36784,40.83399],[-80.3674,40.83393],[-80.36673,40.83381],[-80.36604,40.83366],[-80.36514,40.8334],[-80.3643,40.83307],[-80.36326,40.8326],[-80.36106,40.83147],[-80.35993,40.8309],[-80.35897,40.83046],[-80.35834,40.8302],[-80.35758,40.82995],[-80.35593,40.82956],[-80.35472,40.8293],[-80.35345,40.82901],[-80.35301,40.8289],[-80.35262,40.82878],[-80.35227,40.82866],[-80.3519,40.82851],[-80.35152,40.82835],[-80.35122,40.8282],[-80.35092,40.82804],[-80.35067,40.82789],[-80.35043,40.82774],[-80.35014,40.82754],[-80.34991,40.82737],[-80.34969,40.8272],[-80.34943,40.82696],[-80.34923,40.82677],[-80.34475,40.82184],[-80.34442,40.82151],[-80.34412,40.82126],[-80.34369,40.82094],[-80.34335,40.82072],[-80.34296,40.82051],[-80.3426,40.82033],[-80.34223,40.82018],[-80.34186,40.82005],[-80.34137,40.8199],[-80.34078,40.81976],[-80.33873,40.81945],[-80.33837,40.81939],[-80.33583,40.819],[-80.33522,40.81887],[-80.33484,40.81877],[-80.33447,40.81866],[-80.33409,40.81853],[-80.33378,40.81841],[-80.3334,40.81824],[-80.33298,40.81805],[-80.33172,40.81741],[-80.33059,40.81685],[-80.3294,40.81626],[-80.32781,40.81545],[-80.32586,40.81447],[-80.32508,40.81408],[-80.3248,40.81393],[-80.32441,40.81373],[-80.32416,40.81362],[-80.32348,40.81329],[-80.32254,40.81285],[-80.3222,40.81271],[-80.32173,40.81252],[-80.32123,40.81234],[-80.31619,40.81049],[-80.3149,40.81001],[-80.31427,40.80976],[-80.30982,40.80813],[-80.30572,40.80663],[-80.30435,40.80613],[-80.30389,40.80596],[-80.30342,40.80576],[-80.30306,40.8056],[-80.30269,40.80543],[-80.30233,40.80524],[-80.30193,40.80502],[-80.30163,40.80484],[-80.30124,40.80459],[-80.30071,40.80423],[-80.30033,40.80394],[-80.29991,40.8036],[-80.29934,40.80312],[-80.29875,40.80263],[-80.29777,40.80183],[-80.29689,40.80111],[-80.29663,40.8009],[-80.29642,40.80074],[-80.29616,40.80056],[-80.29594,40.80041],[-80.29564,40.80021],[-80.29528,40.8],[-80.29482,40.79974],[-80.29448,40.79956],[-80.29411,40.79938],[-80.29373,40.79921],[-80.29328,40.79902],[-80.29279,40.79883],[-80.29237,40.79869],[-80.29188,40.79853],[-80.29148,40.79842],[-80.29141,40.7984],[-80.29103,40.7983],[-80.29066,40.79822],[-80.29028,40.79814],[-80.28971,40.79803],[-80.28898,40.7979],[-80.28867,40.79784],[-80.28749,40.79762],[-80.28697,40.79752],[-80.28649,40.79741],[-80.28615,40.79731],[-80.28585,40.79721],[-80.28553,40.7971],[-80.28492,40.79687],[-80.28305,40.79613],[-80.28096,40.79532],[-80.27965,40.79483],[-80.27721,40.79387],[-80.27505,40.79303],[-80.27448,40.79281],[-80.27263,40.79208],[-80.27156,40.79166],[-80.27111,40.79149],[-80.27067,40.79134],[-80.27016,40.79117],[-80.26966,40.79102],[-80.26908,40.79086],[-80.26849,40.79071],[-80.26716,40.79041],[-80.26585,40.79011],[-80.2645,40.7898],[-80.26303,40.78947],[-80.26126,40.78907],[-80.25929,40.78862],[-80.25723,40.78815],[-80.25538,40.78774],[-80.25385,40.78739],[-80.2524,40.78706],[-80.25057,40.78664],[-80.24903,40.78629],[-80.24706,40.78585],[-80.24482,40.78534],[-80.24408,40.78517],[-80.24363,40.78505],[-80.24329,40.78495],[-80.24294,40.78481],[-80.24264,40.78468],[-80.24239,40.78456],[-80.24215,40.78443],[-80.24193,40.78429],[-80.24173,40.78417],[-80.24141,40.78393],[-80.24119,40.78373],[-80.24097,40.78352],[-80.2408,40.78333],[-80.24064,40.78315],[-80.24051,40.78295],[-80.24035,40.78271],[-80.24024,40.78249],[-80.24011,40.78222],[-80.24003,40.78201],[-80.23996,40.78178],[-80.23992,40.7816],[-80.23988,40.78137],[-80.23983,40.78109],[-80.23969,40.77979],[-80.23957,40.77872],[-80.23942,40.77733],[-80.23934,40.77662],[-80.23928,40.77611],[-80.23923,40.77566],[-80.23918,40.77525],[-80.23911,40.77491],[-80.23904,40.77467],[-80.23898,40.77444],[-80.2389,40.77422],[-80.23883,40.774],[-80.23874,40.77381],[-80.23863,40.77356],[-80.23854,40.77338],[-80.23843,40.77317],[-80.23832,40.77298],[-80.23813,40.77269],[-80.23793,40.7724],[-80.23785,40.77229],[-80.23749,40.77181],[-80.2367,40.77076],[-80.2361,40.76996],[-80.23584,40.76962],[-80.23546,40.76912],[-80.23496,40.76846],[-80.23398,40.76715],[-80.23346,40.76646],[-80.2331,40.76598],[-80.23252,40.76521],[-80.23183,40.7643],[-80.23124,40.76351],[-80.23091,40.76307],[-80.23044,40.76246],[-80.22994,40.76179],[-80.22921,40.76082],[-80.22833,40.75965],[-80.22773,40.75886],[-80.22749,40.75857],[-80.22732,40.75839],[-80.22709,40.75817],[-80.22688,40.75799],[-80.22668,40.75783],[-80.22645,40.75767],[-80.22622,40.75751],[-80.22598,40.75736],[-80.22559,40.75715],[-80.22531,40.75701],[-80.22502,40.75689],[-80.22466,40.75675],[-80.22418,40.7566],[-80.2238,40.7565],[-80.22324,40.75636],[-80.22108,40.75582],[-80.21897,40.75529],[-80.21839,40.75514],[-80.21792,40.755],[-80.21757,40.7549],[-80.21721,40.75478],[-80.2168,40.75464],[-80.21634,40.75448],[-80.21592,40.75432],[-80.2155,40.75416],[-80.21501,40.75395],[-80.21439,40.75367],[-80.21394,40.75344],[-80.21349,40.75321],[-80.2131,40.753],[-80.21274,40.75279],[-80.21238,40.75259],[-80.21142,40.75203],[-80.21054,40.75151],[-80.20951,40.75091],[-80.20814,40.75011],[-80.2036,40.74746],[-80.20339,40.74734],[-80.20036,40.74556],[-80.19932,40.74495],[-80.19838,40.7444],[-80.19657,40.74335],[-80.19465,40.74224],[-80.19339,40.7416],[-80.19253,40.7412],[-80.1916,40.74083],[-80.19069,40.7405],[-80.18977,40.74022],[-80.18896,40.74],[-80.18819,40.73982],[-80.18533,40.7392],[-80.18232,40.73854],[-80.17824,40.73764],[-80.17688,40.73731],[-80.17598,40.73706],[-80.17542,40.73689],[-80.17472,40.73667],[-80.17367,40.7363],[-80.17295,40.73603],[-80.17218,40.73573],[-80.17094,40.73518],[-80.17021,40.73484],[-80.16882,40.73412],[-80.16804,40.73372],[-80.16521,40.73191],[-80.16425,40.73116],[-80.16327,40.73035],[-80.16254,40.72969],[-80.16186,40.72906],[-80.16129,40.72852],[-80.1609,40.72816],[-80.16079,40.72805],[-80.16049,40.72776],[-80.15957,40.72693],[-80.15916,40.72659],[-80.1589,40.72637],[-80.15856,40.72612],[-80.15821,40.72586],[-80.1579,40.72567],[-80.15764,40.72551],[-80.15735,40.72534],[-80.15702,40.72517],[-80.15671,40.725],[-80.1563,40.7248],[-80.15568,40.72452],[-80.15502,40.72426],[-80.1541,40.72388],[-80.15166,40.72288],[-80.1502,40.72229],[-80.14753,40.72119],[-80.14662,40.72082],[-80.14602,40.72057],[-80.13879,40.71763],[-80.13809,40.71733],[-80.13766,40.71713],[-80.13708,40.71685],[-80.13654,40.71657],[-80.13595,40.71624],[-80.13531,40.71585],[-80.13474,40.71547],[-80.13388,40.71485],[-80.13313,40.71427],[-80.13277,40.71397],[-80.12925,40.71118],[-80.12842,40.71053],[-80.1274,40.70973],[-80.12657,40.70903],[-80.1259,40.70846],[-80.12524,40.70785],[-80.12481,40.70743],[-80.1239,40.70651],[-80.12306,40.70559],[-80.12197,40.70431],[-80.12101,40.70301],[-80.1197,40.70116],[-80.11856,40.69954],[-80.11794,40.69868],[-80.11777,40.69842],[-80.1177,40.69832],[-80.11654,40.69669],[-80.11602,40.69597],[-80.1156,40.69537],[-80.11434,40.69364],[-80.11321,40.69203],[-80.11182,40.69007],[-80.11172,40.68993],[-80.11083,40.68869],[-80.1102,40.68778],[-80.10889,40.68599],[-80.1079,40.68458],[-80.10675,40.68295],[-80.10618,40.68213],[-80.10594,40.68179],[-80.10562,40.68132],[-80.10529,40.68081],[-80.10487,40.68013],[-80.10462,40.67971],[-80.10442,40.67934],[-80.10419,40.67891],[-80.10405,40.67864],[-80.10386,40.67828],[-80.1033,40.67722],[-80.10257,40.67582],[-80.10234,40.6754],[-80.10171,40.6742],[-80.0995,40.66992],[-80.09771,40.66653],[-80.09766,40.66642],[-80.09679,40.66478],[-80.09647,40.6643],[-80.09614,40.66387],[-80.09562,40.66336],[-80.09508,40.66295],[-80.09461,40.66266],[-80.0943,40.66248],[-80.09401,40.66234],[-80.09142,40.66116],[-80.08739,40.65931],[-80.08474,40.65811],[-80.0831,40.65736],[-80.08266,40.65719],[-80.0822,40.65702],[-80.08165,40.65682],[-80.08108,40.65664],[-80.08044,40.65647],[-80.07987,40.65633],[-80.07921,40.65619],[-80.07868,40.6561],[-80.07809,40.65601],[-80.07787,40.65598],[-80.07731,40.65591],[-80.07668,40.65583],[-80.07628,40.65576],[-80.07589,40.65569],[-80.0753,40.65557],[-80.07453,40.65542],[-80.07427,40.65537],[-80.0736,40.65525],[-80.07243,40.65511],[-80.07174,40.65503],[-80.07109,40.65496],[-80.06946,40.65485],[-80.06864,40.65471],[-80.06742,40.65448],[-80.06267,40.65306],[-80.0621,40.6529],[-80.06167,40.65279],[-80.06135,40.65271],[-80.06095,40.65263],[-80.06054,40.65257],[-80.06017,40.65253],[-80.05987,40.6525],[-80.05951,40.65249],[-80.05894,40.65247],[-80.05476,40.65244],[-80.05416,40.65243],[-80.04947,40.6524],[-80.04648,40.65238],[-80.04598,40.65237],[-80.04558,40.65234],[-80.04519,40.65231],[-80.04476,40.65226],[-80.04419,40.65218],[-80.04368,40.65209],[-80.0432,40.65198],[-80.04267,40.65185],[-80.04234,40.65175],[-80.04184,40.65159],[-80.04141,40.65143],[-80.04102,40.65128],[-80.04057,40.65108],[-80.04014,40.65087],[-80.03982,40.6507],[-80.03955,40.65055],[-80.03937,40.65044],[-80.03906,40.65025],[-80.03866,40.64998],[-80.03832,40.64971],[-80.03795,40.64942],[-80.03328,40.64546],[-80.03277,40.64502],[-80.03231,40.64465],[-80.03204,40.64443],[-80.03179,40.64426],[-80.03158,40.64412],[-80.03133,40.64397],[-80.03103,40.64381],[-80.03075,40.64367],[-80.03043,40.64353],[-80.03011,40.64341],[-80.02978,40.6433],[-80.0295,40.64321],[-80.02925,40.64315],[-80.02895,40.64308],[-80.02868,40.64303],[-80.02834,40.64298],[-80.02809,40.64294],[-80.02775,40.64292],[-80.02738,40.64291],[-80.02695,40.64291],[-80.02658,40.64292],[-80.02622,40.64295],[-80.02582,40.643],[-80.02534,40.64309],[-80.02473,40.64322],[-80.02115,40.64404],[-80.02064,40.64414],[-80.02029,40.64419],[-80.01993,40.64424],[-80.01966,40.64426],[-80.01933,40.64428],[-80.01886,40.64428],[-80.0185,40.64426],[-80.01823,40.64424],[-80.01792,40.64421],[-80.01757,40.64416],[-80.01723,40.64409],[-80.01679,40.64398],[-80.01641,40.64387],[-80.0161,40.64377],[-80.01581,40.64365],[-80.01555,40.64354],[-80.0152,40.64337],[-80.01477,40.64314],[-80.01062,40.64092],[-80.01033,40.64077],[-80.01002,40.64063],[-80.00971,40.64049],[-80.00941,40.64038],[-80.00913,40.64029],[-80.00886,40.64021],[-80.00857,40.64013],[-80.00827,40.64007],[-80.00801,40.64001],[-80.0077,40.63997],[-80.00735,40.63992],[-80.007,40.6399],[-80.00667,40.63988],[-80.00626,40.63988],[-80.00588,40.63989],[-80.00543,40.63993],[-80.00042,40.64032],[-79.99985,40.64035],[-79.99954,40.64036],[-79.99917,40.64037],[-79.99878,40.64036],[-79.99839,40.64034],[-79.99804,40.64029],[-79.9977,40.64023],[-79.99733,40.64016],[-79.99714,40.64012],[-79.99691,40.64006],[-79.99661,40.63995],[-79.99619,40.63978],[-79.99578,40.63961],[-79.99551,40.63948],[-79.99526,40.63936],[-79.99495,40.63917],[-79.99469,40.639],[-79.99446,40.63882],[-79.9942,40.63862],[-79.9921,40.63672],[-79.99002,40.63483],[-79.98804,40.633],[-79.98763,40.63261],[-79.98702,40.63196],[-79.98652,40.6314],[-79.98599,40.63075],[-79.98561,40.63025],[-79.98526,40.62977],[-79.98489,40.62921],[-79.98455,40.62868],[-79.98432,40.62826],[-79.98392,40.62754],[-79.98368,40.62704],[-79.98341,40.62645],[-79.98315,40.6258],[-79.9828,40.62475],[-79.98257,40.62396],[-79.98169,40.6199],[-79.98157,40.61943],[-79.98145,40.61901],[-79.98131,40.61869],[-79.98118,40.6184],[-79.98099,40.61808],[-79.98079,40.61779],[-79.9806,40.61754],[-79.98037,40.61729],[-79.98012,40.61704],[-79.97987,40.6168],[-79.97951,40.61653],[-79.97914,40.61628],[-79.97874,40.61605],[-79.97827,40.61581],[-79.97783,40.61563],[-79.97743,40.61547],[-79.9769,40.6153],[-79.97413,40.61439],[-79.97276,40.61393],[-79.97088,40.61332],[-79.97046,40.61319],[-79.97014,40.61309],[-79.96978,40.613],[-79.96941,40.61293],[-79.96893,40.61287],[-79.96845,40.61283],[-79.96798,40.6128],[-79.96748,40.6128],[-79.96717,40.61281],[-79.9667,40.61285],[-79.96613,40.61293],[-79.96481,40.61315],[-79.96355,40.61337],[-79.96203,40.61362],[-79.96114,40.61376],[-79.96054,40.61385],[-79.95986,40.61393],[-79.95951,40.61394],[-79.95913,40.61395],[-79.95884,40.61394],[-79.95852,40.61392],[-79.9582,40.61389],[-79.9579,40.61385],[-79.95759,40.6138],[-79.95721,40.61372],[-79.95688,40.61363],[-79.95639,40.61348],[-79.95608,40.61336],[-79.95587,40.61327],[-79.95566,40.61318],[-79.95547,40.61309],[-79.95494,40.61281],[-79.95289,40.61168],[-79.95208,40.61123],[-79.9512,40.61075],[-79.95075,40.61051],[-79.95042,40.61035],[-79.95007,40.61018],[-79.9497,40.61001],[-79.94917,40.60978],[-79.94867,40.60958],[-79.94803,40.60933],[-79.94754,40.60914],[-79.94701,40.60894],[-79.94572,40.60845],[-79.94534,40.6083],[-79.94473,40.60808],[-79.94418,40.60787],[-79.94347,40.6076],[-79.94268,40.6073],[-79.94212,40.60709],[-79.94164,40.60687],[-79.94136,40.60674],[-79.94101,40.60655],[-79.94076,40.60641],[-79.94057,40.6063],[-79.94034,40.60615],[-79.9398,40.6058],[-79.93936,40.60551],[-79.93861,40.60502],[-79.93788,40.60455],[-79.93704,40.60398],[-79.93535,40.60288],[-79.93329,40.60154],[-79.93177,40.60053],[-79.93071,40.59986],[-79.93042,40.5997],[-79.9302,40.59958],[-79.92995,40.59948],[-79.92965,40.59936],[-79.9294,40.59927],[-79.92911,40.59919],[-79.92882,40.59911],[-79.92857,40.59906],[-79.92828,40.59902],[-79.92798,40.59898],[-79.92774,40.59896],[-79.92745,40.59895],[-79.92708,40.59894],[-79.92644,40.59894],[-79.92528,40.59896],[-79.92464,40.59897],[-79.92428,40.59896],[-79.92389,40.59893],[-79.92357,40.59891],[-79.92331,40.59888],[-79.92304,40.59885],[-79.92265,40.59879],[-79.92226,40.59872],[-79.922,40.59866],[-79.92172,40.59859],[-79.92153,40.59854],[-79.92137,40.5985],[-79.92117,40.59844],[-79.92098,40.59839],[-79.92078,40.59832],[-79.92059,40.59826],[-79.92032,40.59816],[-79.9201,40.59808],[-79.91989,40.598],[-79.91974,40.59794],[-79.91945,40.5978],[-79.91919,40.59767],[-79.91722,40.5967],[-79.91683,40.59651],[-79.91659,40.59639],[-79.9164,40.5963],[-79.91609,40.59617],[-79.91585,40.59606],[-79.91555,40.59594],[-79.91527,40.59583],[-79.91499,40.59571],[-79.91467,40.59559],[-79.91434,40.59548],[-79.91401,40.59537],[-79.91364,40.59525],[-79.91321,40.59512],[-79.91292,40.59503],[-79.91254,40.59493],[-79.91213,40.59482],[-79.91164,40.5947],[-79.91134,40.59464],[-79.91104,40.59458],[-79.91074,40.59452],[-79.91039,40.59446],[-79.91001,40.59439],[-79.90961,40.59433],[-79.90924,40.59428],[-79.90889,40.59424],[-79.90858,40.5942],[-79.90826,40.59417],[-79.90776,40.59413],[-79.90737,40.5941],[-79.90695,40.59408],[-79.90655,40.59406],[-79.90616,40.59406],[-79.90569,40.59405],[-79.90522,40.59406],[-79.90479,40.59407],[-79.90432,40.59409],[-79.90389,40.59412],[-79.903,40.59417],[-79.9,40.59438],[-79.89936,40.59442],[-79.89869,40.59446],[-79.89831,40.59448],[-79.89798,40.59449],[-79.89767,40.59449],[-79.89738,40.59449],[-79.89716,40.59448],[-79.89696,40.59447],[-79.8967,40.59445],[-79.89644,40.59442],[-79.89624,40.5944],[-79.89588,40.59435],[-79.8956,40.5943],[-79.89533,40.59426],[-79.89512,40.59421],[-79.8949,40.59416],[-79.89469,40.5941],[-79.89444,40.59403],[-79.89425,40.59398],[-79.89405,40.59391],[-79.89378,40.59382],[-79.89358,40.59374],[-79.89336,40.59366],[-79.8932,40.59359],[-79.893,40.5935],[-79.8928,40.5934],[-79.89259,40.59329],[-79.89236,40.59317],[-79.8921,40.59302],[-79.89178,40.59282],[-79.89152,40.59264],[-79.89131,40.59249],[-79.89112,40.59234],[-79.89064,40.59196],[-79.89037,40.59173],[-79.89012,40.59152],[-79.88983,40.59129],[-79.88945,40.59098],[-79.88915,40.59074],[-79.88898,40.59059],[-79.88878,40.59043],[-79.88859,40.59028],[-79.88838,40.59013],[-79.88816,40.58998],[-79.88798,40.58987],[-79.88782,40.58978],[-79.88746,40.58959],[-79.88715,40.58945],[-79.88694,40.58936],[-79.88669,40.58927],[-79.88642,40.58917],[-79.88611,40.58907],[-79.88533,40.58885],[-79.88337,40.58829],[-79.87989,40.58731],[-79.87957,40.58722],[-79.87917,40.5871],[-79.87889,40.58701],[-79.87861,40.58693],[-79.87835,40.58683],[-79.87807,40.58673],[-79.87775,40.58661],[-79.87747,40.5865],[-79.87715,40.58635],[-79.87685,40.58622],[-79.87658,40.58609],[-79.87639,40.58599],[-79.8761,40.58583],[-79.87585,40.58569],[-79.87559,40.58554],[-79.87537,40.5854],[-79.87507,40.5852],[-79.87479,40.58501],[-79.87458,40.58486],[-79.87437,40.5847],[-79.87413,40.58451],[-79.87389,40.5843],[-79.87366,40.58411],[-79.87346,40.58393],[-79.87323,40.58371],[-79.8722,40.58265],[-79.87198,40.58242],[-79.87175,40.58219],[-79.87148,40.58191],[-79.87122,40.58165],[-79.87096,40.58138],[-79.87049,40.58089],[-79.86994,40.58033],[-79.86968,40.58005],[-79.86909,40.57945],[-79.86843,40.57877],[-79.86756,40.57789],[-79.86723,40.57754],[-79.86695,40.57726],[-79.8666,40.5769],[-79.86627,40.57656],[-79.86578,40.57605],[-79.86529,40.57555],[-79.86503,40.57528],[-79.8648,40.57504],[-79.86458,40.57482],[-79.8644,40.57463],[-79.86414,40.57439],[-79.86403,40.57428],[-79.86386,40.57414],[-79.86366,40.57397],[-79.8634,40.57377],[-79.86313,40.57358],[-79.86289,40.57341],[-79.86256,40.5732],[-79.86218,40.57299],[-79.85995,40.5718],[-79.85955,40.57158],[-79.85918,40.57138],[-79.85892,40.57124],[-79.85871,40.57112],[-79.85863,40.57107],[-79.85849,40.571],[-79.85825,40.57085],[-79.85794,40.57063],[-79.85763,40.5704],[-79.85735,40.57018],[-79.85715,40.57],[-79.85699,40.56986],[-79.85679,40.56966],[-79.85662,40.56949],[-79.85644,40.56928],[-79.85628,40.5691],[-79.85613,40.56893],[-79.85598,40.56872],[-79.85588,40.56858],[-79.85573,40.56836],[-79.85559,40.56814],[-79.85529,40.56768],[-79.85505,40.56733],[-79.85486,40.56704],[-79.85474,40.56686],[-79.85461,40.56666],[-79.85444,40.56641],[-79.85428,40.56615],[-79.85415,40.56597],[-79.854,40.56576],[-79.85388,40.56561],[-79.85374,40.56542],[-79.8536,40.56524],[-79.85342,40.56503],[-79.85326,40.56483],[-79.85307,40.56462],[-79.8519,40.56332],[-79.85171,40.56309],[-79.85155,40.56289],[-79.85139,40.56269],[-79.85127,40.5625],[-79.85115,40.56233],[-79.85101,40.56212],[-79.85079,40.56175],[-79.85054,40.5613],[-79.85026,40.56077],[-79.85009,40.56043],[-79.8499,40.56007],[-79.84969,40.55965],[-79.84958,40.55946],[-79.84936,40.55906],[-79.84889,40.55815],[-79.84876,40.55791],[-79.84861,40.55765],[-79.84845,40.5574],[-79.84831,40.5572],[-79.84815,40.55701],[-79.84802,40.55685],[-79.84788,40.55671],[-79.84765,40.5565],[-79.84748,40.55634],[-79.8473,40.5562],[-79.84709,40.55604],[-79.84687,40.55589],[-79.84682,40.55586],[-79.8466,40.55571],[-79.84634,40.55557],[-79.84615,40.55547],[-79.84591,40.55535],[-79.84566,40.55524],[-79.84536,40.55512],[-79.84517,40.55505],[-79.8449,40.55497],[-79.84459,40.55488],[-79.84431,40.55481],[-79.84406,40.55476],[-79.84379,40.55471],[-79.8435,40.55467],[-79.84326,40.55464],[-79.84303,40.55462],[-79.84255,40.55458],[-79.84089,40.55449],[-79.83943,40.55441],[-79.83901,40.55438],[-79.83866,40.55435],[-79.83839,40.55432],[-79.83812,40.55429],[-79.83785,40.55425],[-79.83759,40.55421],[-79.83733,40.55416],[-79.83702,40.55409],[-79.83671,40.55402],[-79.83638,40.55394],[-79.8361,40.55386],[-79.83575,40.55374],[-79.83545,40.55364],[-79.83511,40.55351],[-79.83461,40.55332],[-79.83349,40.55289],[-79.83133,40.55206],[-79.83036,40.55168],[-79.82978,40.55146],[-79.82873,40.55105],[-79.82825,40.55086],[-79.82782,40.55069],[-79.82761,40.5506],[-79.82741,40.55051],[-79.82729,40.55045],[-79.82702,40.55032],[-79.82678,40.55018],[-79.82651,40.55001],[-79.82623,40.54981],[-79.82594,40.54959],[-79.82574,40.54942],[-79.82552,40.5492],[-79.8253,40.54896],[-79.82516,40.54879],[-79.82501,40.5486],[-79.82487,40.54839],[-79.82473,40.54816],[-79.8246,40.54792],[-79.82453,40.54777],[-79.82445,40.54758],[-79.82438,40.54738],[-79.82431,40.54717],[-79.82425,40.54688],[-79.82422,40.54673],[-79.82419,40.54653],[-79.82411,40.54586],[-79.82397,40.54465],[-79.8239,40.54408],[-79.82382,40.54354],[-79.82377,40.54325],[-79.82372,40.54293],[-79.82348,40.54157],[-79.82333,40.54078],[-79.82302,40.53929],[-79.82204,40.53441],[-79.82185,40.53343],[-79.82177,40.53302],[-79.8217,40.53268],[-79.82167,40.53237],[-79.82165,40.53203],[-79.82165,40.53166],[-79.82166,40.53103],[-79.82167,40.52979],[-79.82166,40.52951],[-79.82165,40.52937],[-79.82162,40.52914],[-79.82159,40.52893],[-79.82156,40.52877],[-79.8215,40.52854],[-79.82143,40.52829],[-79.82134,40.52806],[-79.82121,40.5277],[-79.82055,40.52593],[-79.82022,40.52506],[-79.82012,40.52483],[-79.81998,40.52459],[-79.81987,40.52442],[-79.8197,40.52418],[-79.81954,40.524],[-79.81939,40.52384],[-79.81927,40.5237],[-79.81914,40.52359],[-79.819,40.52346],[-79.81888,40.52337],[-79.81875,40.52328],[-79.81864,40.5232],[-79.81852,40.52312],[-79.81839,40.52303],[-79.81822,40.52294],[-79.81807,40.52285],[-79.81785,40.52275],[-79.81769,40.52267],[-79.81751,40.5226],[-79.81736,40.52254],[-79.81708,40.52246],[-79.81644,40.52227],[-79.81524,40.52193],[-79.81279,40.52122],[-79.8125,40.52114],[-79.81224,40.52108],[-79.81187,40.52099],[-79.81162,40.52094],[-79.8114,40.52091],[-79.81109,40.52087],[-79.81087,40.52084],[-79.8105,40.52082],[-79.81008,40.5208],[-79.80986,40.5208],[-79.80686,40.5207],[-79.80644,40.52068],[-79.80619,40.52066],[-79.80601,40.52064],[-79.80583,40.52061],[-79.80563,40.52058],[-79.80539,40.52053],[-79.80517,40.52048],[-79.805,40.52044],[-79.80476,40.52036],[-79.80449,40.52026],[-79.80426,40.52017],[-79.80406,40.52007],[-79.80385,40.51997],[-79.80369,40.51987],[-79.80354,40.51978],[-79.80338,40.51967],[-79.80321,40.51955],[-79.80308,40.51946],[-79.803,40.51938],[-79.80289,40.51929],[-79.80274,40.51916],[-79.80257,40.51898],[-79.80245,40.51885],[-79.80228,40.51864],[-79.80208,40.5184],[-79.80156,40.51776],[-79.80144,40.51762],[-79.80133,40.51748],[-79.80118,40.51731],[-79.80107,40.5172],[-79.80091,40.51705],[-79.80079,40.51694],[-79.80065,40.51682],[-79.80049,40.51669],[-79.80035,40.51658],[-79.80023,40.5165],[-79.80009,40.5164],[-79.79992,40.51629],[-79.79978,40.5162],[-79.79962,40.5161],[-79.79944,40.51601],[-79.79925,40.5159],[-79.79895,40.51576],[-79.79726,40.51491],[-79.79322,40.51287],[-79.79266,40.51259],[-79.79256,40.51253],[-79.79214,40.51229],[-79.79157,40.51189],[-79.79137,40.51173],[-79.791,40.51138],[-79.7908,40.51117],[-79.79053,40.51083],[-79.79026,40.51042],[-79.79017,40.51024],[-79.78997,40.50983],[-79.78991,40.50964],[-79.78977,40.50918],[-79.78971,40.50888],[-79.78967,40.50863],[-79.78965,40.50828],[-79.78949,40.50544],[-79.78945,40.50518],[-79.78935,40.50469],[-79.78927,40.50443],[-79.78912,40.50405],[-79.78895,40.50368],[-79.78877,40.50336],[-79.78858,40.50305],[-79.78835,40.50273],[-79.78804,40.50235],[-79.78788,40.50217],[-79.78772,40.50198],[-79.78737,40.5016],[-79.787,40.5012],[-79.78674,40.5009],[-79.78642,40.50054],[-79.78611,40.5002],[-79.78593,40.49999],[-79.78579,40.49982],[-79.78568,40.49968],[-79.78556,40.49951],[-79.78544,40.49933],[-79.78531,40.49913],[-79.78519,40.49891],[-79.78504,40.49862],[-79.78495,40.49841],[-79.78426,40.49687],[-79.78393,40.49618],[-79.78358,40.49546],[-79.78334,40.49492],[-79.78306,40.49427],[-79.78276,40.49351],[-79.78246,40.49281],[-79.7822,40.49221],[-79.78103,40.48962],[-79.78088,40.4893],[-79.78073,40.48901],[-79.7806,40.48881],[-79.7805,40.48864],[-79.78037,40.48846],[-79.78023,40.48827],[-79.78008,40.48808],[-79.77989,40.48787],[-79.77969,40.48768],[-79.77947,40.48747],[-79.77926,40.48728],[-79.77902,40.48709],[-79.77876,40.4869],[-79.77854,40.48676],[-79.7783,40.4866],[-79.77798,40.48642],[-79.7774,40.48612],[-79.77731,40.48607],[-79.7768,40.4858],[-79.77543,40.48509],[-79.77412,40.48441],[-79.77338,40.48401],[-79.7731,40.48385],[-79.77292,40.48374],[-79.7727,40.4836],[-79.77243,40.48341],[-79.77212,40.48317],[-79.77188,40.48298],[-79.77168,40.4828],[-79.77143,40.48255],[-79.7713,40.4824],[-79.77117,40.48225],[-79.77101,40.48205],[-79.77092,40.48192],[-79.77077,40.4817],[-79.7706,40.48143],[-79.77042,40.48114],[-79.77018,40.48073],[-79.76868,40.47817],[-79.76827,40.47746],[-79.7677,40.47647],[-79.76713,40.47551],[-79.76684,40.47498],[-79.76664,40.47458],[-79.76637,40.47404],[-79.76584,40.47294],[-79.76545,40.47213],[-79.76496,40.47108],[-79.76459,40.47031],[-79.7639,40.46889],[-79.76368,40.46841],[-79.76334,40.46771],[-79.76304,40.46709],[-79.7627,40.46637],[-79.76191,40.46473],[-79.7615,40.46384],[-79.76091,40.46264],[-79.76073,40.46227],[-79.76043,40.46165],[-79.76027,40.46132],[-79.76007,40.46097],[-79.75983,40.46056],[-79.75957,40.46015],[-79.7593,40.45976],[-79.75883,40.4591],[-79.75847,40.45863],[-79.75777,40.45768],[-79.7572,40.4569],[-79.75678,40.45634],[-79.75644,40.45588],[-79.75606,40.45536],[-79.7557,40.45487],[-79.75554,40.45465],[-79.75535,40.45435],[-79.75516,40.45404],[-79.75498,40.45371],[-79.75486,40.45348],[-79.75477,40.45328],[-79.75464,40.453],[-79.75453,40.45269],[-79.75442,40.45238],[-79.75435,40.45217],[-79.75424,40.45181],[-79.75414,40.45132],[-79.75409,40.451],[-79.75404,40.45062],[-79.754,40.4501],[-79.75385,40.44794],[-79.75378,40.44691],[-79.75361,40.44451],[-79.75358,40.44425],[-79.75354,40.44398],[-79.75351,40.4438],[-79.75346,40.44358],[-79.7534,40.44335],[-79.75334,40.44315],[-79.75328,40.44297],[-79.75321,40.44279],[-79.75314,40.4426],[-79.75304,40.44239],[-79.75293,40.44215],[-79.75272,40.44177],[-79.75246,40.44134],[-79.75241,40.44124],[-79.75107,40.43902],[-79.75072,40.43845],[-79.75016,40.43753],[-79.74998,40.43723],[-79.74895,40.4355],[-79.74837,40.43462],[-79.74811,40.43427],[-79.74768,40.43367],[-79.74728,40.43324],[-79.74686,40.43281],[-79.7458,40.43194],[-79.74259,40.4296],[-79.73976,40.42752],[-79.73926,40.42703],[-79.73876,40.42646],[-79.7382,40.42561],[-79.73753,40.42437],[-79.73716,40.42367],[-79.73678,40.42305],[-79.7361,40.42218],[-79.73405,40.42034],[-79.73329,40.41964],[-79.73281,40.4192],[-79.73235,40.41865],[-79.73087,40.41623],[-79.72917,40.41343],[-79.72867,40.41274],[-79.72845,40.4125],[-79.72779,40.41187],[-79.72679,40.41123],[-79.72436,40.40989],[-79.72414,40.40977],[-79.72271,40.40899],[-79.72184,40.40853],[-79.71818,40.40652],[-79.71744,40.40612],[-79.71645,40.4057],[-79.71519,40.4053],[-79.71463,40.40515],[-79.71382,40.40501],[-79.71282,40.40484],[-79.71214,40.40472],[-79.71134,40.40457],[-79.71052,40.40439],[-79.70934,40.40407],[-79.70854,40.40378],[-79.70765,40.40341],[-79.70674,40.40296],[-79.70588,40.40256],[-79.70505,40.40221],[-79.70408,40.40178],[-79.70328,40.40142],[-79.70188,40.40078],[-79.70134,40.40054],[-79.70034,40.40008],[-79.69943,40.39966],[-79.69853,40.39925],[-79.69754,40.3988],[-79.69696,40.39852],[-79.69604,40.3981],[-79.69515,40.3977],[-79.69445,40.39741],[-79.69393,40.39717],[-79.69358,40.39701],[-79.69314,40.39679],[-79.69253,40.39641],[-79.69184,40.3959],[-79.69134,40.39545],[-79.69065,40.39474],[-79.68987,40.39387],[-79.68922,40.39323],[-79.68841,40.39237],[-79.68787,40.3918],[-79.68743,40.39132],[-79.68712,40.39102],[-79.6867,40.39058],[-79.68606,40.38995],[-79.68548,40.3894],[-79.6848,40.38878],[-79.68408,40.38816],[-79.68329,40.38749],[-79.6826,40.38689],[-79.68231,40.38663],[-79.68185,40.38627],[-79.68118,40.38563],[-79.68052,40.38508],[-79.6798,40.38447],[-79.67904,40.38381],[-79.6783,40.38317],[-79.67773,40.38267],[-79.67717,40.38223],[-79.67665,40.38175],[-79.67628,40.38133],[-79.67586,40.38073],[-79.67562,40.38026],[-79.67544,40.37979],[-79.67535,40.37933],[-79.67535,40.37882],[-79.67538,40.3782],[-79.67554,40.37759],[-79.67573,40.37718],[-79.67598,40.37679],[-79.6764,40.37617],[-79.67682,40.3755],[-79.67731,40.37475],[-79.67771,40.3741],[-79.678,40.37358],[-79.67823,40.37301],[-79.67848,40.37222],[-79.67862,40.37128],[-79.67867,40.3703],[-79.67873,40.36916],[-79.67877,40.3659],[-79.67881,40.3652],[-79.67882,40.36418],[-79.67886,40.3632],[-79.6789,40.36268],[-79.679,40.36214],[-79.67912,40.36164],[-79.67933,40.36109],[-79.67975,40.36032],[-79.68028,40.35962],[-79.68065,40.35914],[-79.68119,40.35847],[-79.68132,40.35831],[-79.68359,40.35547],[-79.68399,40.35494],[-79.68441,40.35431],[-79.68468,40.35378],[-79.68594,40.35097],[-79.68647,40.34991],[-79.68679,40.34938],[-79.68714,40.34886],[-79.6879,40.34787],[-79.69028,40.34483],[-79.69084,40.34405],[-79.69137,40.34321],[-79.69165,40.3426],[-79.6919,40.342],[-79.69214,40.34118],[-79.69227,40.34061],[-79.69238,40.33986],[-79.69241,40.33926],[-79.69239,40.33855],[-79.69225,40.33737],[-79.69185,40.33591],[-79.69141,40.33492],[-79.69103,40.33426],[-79.69066,40.33368],[-79.68991,40.33266],[-79.68953,40.33214],[-79.68924,40.33176],[-79.68895,40.33139],[-79.68857,40.33093],[-79.68825,40.33055],[-79.688,40.33027],[-79.68755,40.32973],[-79.68645,40.32839],[-79.68596,40.32776],[-79.68567,40.32739],[-79.68559,40.32728],[-79.68477,40.32624],[-79.68426,40.32561],[-79.683,40.32402],[-79.68007,40.3203],[-79.67946,40.31952],[-79.67917,40.31914],[-79.67896,40.31887],[-79.67879,40.31861],[-79.67863,40.31832],[-79.67852,40.31808],[-79.6784,40.31778],[-79.67832,40.31751],[-79.67826,40.31729],[-79.67824,40.31719],[-79.67822,40.31709],[-79.67819,40.31685],[-79.67817,40.31665],[-79.67817,40.31639],[-79.67817,40.31616],[-79.6782,40.31594],[-79.67822,40.31578],[-79.67825,40.31563],[-79.67833,40.31523],[-79.67843,40.31467],[-79.67852,40.31421],[-79.67857,40.31396],[-79.6786,40.31376],[-79.67863,40.31353],[-79.67864,40.31333],[-79.67864,40.3131],[-79.67864,40.31288],[-79.67861,40.31265],[-79.67858,40.31241],[-79.67854,40.31222],[-79.67848,40.31199],[-79.67838,40.31172],[-79.67828,40.31145],[-79.67818,40.31123],[-79.67802,40.31093],[-79.67787,40.31069],[-79.67772,40.31047],[-79.67756,40.31027],[-79.67739,40.31007],[-79.67721,40.30987],[-79.67674,40.30936],[-79.67624,40.30884],[-79.67579,40.30836],[-79.67554,40.30808],[-79.67521,40.30773],[-79.67493,40.30741],[-79.67472,40.30716],[-79.67452,40.3069],[-79.67429,40.30661],[-79.67411,40.30634],[-79.67391,40.30602],[-79.67374,40.30574],[-79.67361,40.3055],[-79.67346,40.30522],[-79.67336,40.30498],[-79.67324,40.30471],[-79.67316,40.30449],[-79.67309,40.30429],[-79.67301,40.30404],[-79.67292,40.30372],[-79.67284,40.30341],[-79.67276,40.30306],[-79.67268,40.30274],[-79.67258,40.30232],[-79.67245,40.30179],[-79.67227,40.30104],[-79.67217,40.30061],[-79.67207,40.30018],[-79.67193,40.29963],[-79.67175,40.29889],[-79.67152,40.29791],[-79.67123,40.2967],[-79.67112,40.29626],[-79.671,40.29576],[-79.67085,40.29512],[-79.67072,40.29458],[-79.67062,40.29415],[-79.67043,40.2934],[-79.67028,40.29275],[-79.67008,40.2919],[-79.66998,40.29134],[-79.66992,40.29092],[-79.66987,40.29048],[-79.66984,40.29004],[-79.66963,40.28742],[-79.6695,40.28589],[-79.66929,40.28323],[-79.66894,40.27892],[-79.66854,40.27402],[-79.66832,40.27129],[-79.66823,40.27023],[-79.66818,40.26986],[-79.66813,40.26956],[-79.66805,40.26927],[-79.66796,40.26899],[-79.66785,40.26873],[-79.66773,40.26848],[-79.66762,40.26829],[-79.66747,40.26805],[-79.66733,40.26785],[-79.6672,40.26768],[-79.66704,40.26749],[-79.66684,40.26729],[-79.66667,40.26711],[-79.66642,40.26689],[-79.66612,40.26664],[-79.66584,40.26645],[-79.66556,40.26627],[-79.66533,40.26614],[-79.66507,40.266],[-79.66476,40.26585],[-79.66443,40.26571],[-79.66417,40.26561],[-79.66377,40.26548],[-79.66339,40.26538],[-79.66251,40.26515],[-79.66109,40.2648],[-79.65739,40.26389],[-79.65657,40.26368],[-79.65538,40.26339],[-79.65378,40.263],[-79.65168,40.26247],[-79.65054,40.26219],[-79.64961,40.26196],[-79.64753,40.26144],[-79.64711,40.26133],[-79.64693,40.26128],[-79.64669,40.2612],[-79.64634,40.26108],[-79.64607,40.26096],[-79.64583,40.26085],[-79.64552,40.2607],[-79.64519,40.26051],[-79.64492,40.26034],[-79.64464,40.26014],[-79.64441,40.25996],[-79.64418,40.25975],[-79.64398,40.25956],[-79.64379,40.25935],[-79.64359,40.25911],[-79.6434,40.25885],[-79.64329,40.25868],[-79.64318,40.25849],[-79.64307,40.25826],[-79.64294,40.25797],[-79.64286,40.25774],[-79.64278,40.25744],[-79.64273,40.2572],[-79.64269,40.25697],[-79.64266,40.25662],[-79.64264,40.2562],[-79.64259,40.25481],[-79.64254,40.25349],[-79.64251,40.25294],[-79.6425,40.25264],[-79.64248,40.25248],[-79.64245,40.2523],[-79.64242,40.25211],[-79.64236,40.25187],[-79.64228,40.2516],[-79.64221,40.2514],[-79.64212,40.25119],[-79.64199,40.25092],[-79.64184,40.25066],[-79.64169,40.25042],[-79.64137,40.24994],[-79.64017,40.24815],[-79.63954,40.24724],[-79.63893,40.24637],[-79.63832,40.24548],[-79.63787,40.24482],[-79.63751,40.24433],[-79.63718,40.24393],[-79.63697,40.24369],[-79.63677,40.24348],[-79.63645,40.24318],[-79.63617,40.24293],[-79.63583,40.24264],[-79.6355,40.2424],[-79.63513,40.24214],[-79.63471,40.24189],[-79.63441,40.24172],[-79.63404,40.24153],[-79.63351,40.2413],[-79.63287,40.24104],[-79.63229,40.24085],[-79.6319,40.24074],[-79.6315,40.24064],[-79.63102,40.24054],[-79.63054,40.24046],[-79.62974,40.24035],[-79.62891,40.24024],[-79.62847,40.24017],[-79.62808,40.2401],[-79.62772,40.24002],[-79.62738,40.23993],[-79.627,40.23981],[-79.62658,40.23966],[-79.62627,40.23953],[-79.62594,40.23938],[-79.62569,40.23926],[-79.62546,40.23913],[-79.62527,40.23902],[-79.625,40.23885],[-79.62475,40.23868],[-79.62455,40.23854],[-79.62436,40.23839],[-79.62415,40.23821],[-79.62399,40.23806],[-79.6238,40.23788],[-79.62363,40.23771],[-79.62347,40.23753],[-79.62322,40.23722],[-79.62243,40.23623],[-79.62101,40.23443],[-79.62078,40.23413],[-79.62058,40.23388],[-79.6204,40.23366],[-79.62022,40.23345],[-79.62003,40.23323],[-79.61983,40.23303],[-79.61958,40.23278],[-79.61929,40.23253],[-79.61898,40.23228],[-79.61872,40.23208],[-79.61843,40.23188],[-79.6181,40.23166],[-79.61636,40.23053],[-79.61288,40.2283],[-79.6106,40.22682],[-79.60927,40.22597],[-79.60899,40.22582],[-79.6081,40.22524],[-79.60723,40.22468],[-79.60693,40.22447],[-79.60667,40.22426],[-79.60643,40.22406],[-79.60633,40.22398],[-79.60608,40.22377],[-79.60588,40.22358],[-79.6057,40.2234],[-79.60554,40.22322],[-79.60536,40.22302],[-79.60513,40.22274],[-79.60478,40.22231],[-79.6042,40.22154],[-79.60329,40.22032],[-79.60299,40.21993],[-79.60284,40.21975],[-79.6027,40.21957],[-79.6025,40.21934],[-79.6023,40.21914],[-79.60209,40.21894],[-79.60185,40.21875],[-79.60158,40.21855],[-79.60125,40.21834],[-79.6007,40.21803],[-79.59912,40.21739],[-79.59795,40.21693],[-79.59728,40.21666],[-79.59687,40.21645],[-79.59628,40.21598],[-79.59553,40.21511],[-79.5948,40.21426],[-79.5943,40.2138],[-79.5938,40.21348],[-79.59281,40.213],[-79.59194,40.2127],[-79.59095,40.21251],[-79.5899,40.21241],[-79.58824,40.21243],[-79.58486,40.2125],[-79.58399,40.21249],[-79.58308,40.21238],[-79.58222,40.21217],[-79.5813,40.21186],[-79.5772,40.20984],[-79.57362,40.20808],[-79.57162,40.20713],[-79.56841,40.20598],[-79.5658,40.205],[-79.56425,40.20427],[-79.56308,40.20364],[-79.55956,40.20177],[-79.55699,40.20038],[-79.55403,40.19875],[-79.55073,40.19705],[-79.54745,40.19528],[-79.54569,40.19439],[-79.54498,40.19413],[-79.54139,40.19305],[-79.53893,40.19231],[-79.53771,40.19183],[-79.53695,40.19145],[-79.53609,40.19091],[-79.5354,40.19038],[-79.53479,40.18979],[-79.53399,40.18892],[-79.53337,40.18809],[-79.53164,40.18516],[-79.53077,40.18416],[-79.52993,40.18353],[-79.52933,40.18319],[-79.5227,40.18039],[-79.5224,40.18026],[-79.52059,40.1795],[-79.51684,40.1779],[-79.51558,40.17746],[-79.51329,40.17678],[-79.50932,40.17558],[-79.50837,40.17524],[-79.50791,40.17506],[-79.50734,40.17476],[-79.50421,40.1729],[-79.50141,40.1712],[-79.49765,40.16895],[-79.49553,40.16783],[-79.49473,40.16746],[-79.49381,40.16716],[-79.49157,40.16662],[-79.49114,40.16653],[-79.49063,40.16642],[-79.48964,40.16619],[-79.48881,40.16596],[-79.48818,40.1657],[-79.48771,40.1654],[-79.48718,40.16498],[-79.48672,40.16454],[-79.48584,40.1634],[-79.48463,40.16189],[-79.48431,40.16157],[-79.4836,40.161],[-79.48296,40.16054],[-79.48066,40.15927],[-79.47819,40.15795],[-79.47609,40.15682],[-79.47351,40.15547],[-79.47299,40.15524],[-79.47239,40.15504],[-79.47103,40.15455],[-79.47,40.15418],[-79.46922,40.15375],[-79.46849,40.15317],[-79.4677,40.1526],[-79.467,40.15217],[-79.46634,40.15185],[-79.46545,40.15156],[-79.46393,40.15117],[-79.46131,40.15055],[-79.45979,40.15019],[-79.45879,40.15006],[-79.45738,40.14997],[-79.45545,40.14999],[-79.45284,40.15003],[-79.45095,40.15006],[-79.44962,40.15014],[-79.44887,40.15025],[-79.44824,40.15047],[-79.44745,40.15085],[-79.44661,40.1515],[-79.44599,40.15209],[-79.44534,40.15288],[-79.44471,40.15335],[-79.44429,40.15361],[-79.44364,40.1539],[-79.44234,40.15431],[-79.44109,40.15463],[-79.43987,40.15493],[-79.43926,40.15502],[-79.43843,40.15509],[-79.43581,40.15524],[-79.4349,40.15522],[-79.43432,40.15513],[-79.43369,40.15488],[-79.43289,40.15444],[-79.43247,40.15415],[-79.43208,40.15376],[-79.43023,40.15173],[-79.42981,40.1512],[-79.42901,40.14993],[-79.42864,40.14944],[-79.42811,40.14886],[-79.42783,40.1486],[-79.4261,40.14749],[-79.42531,40.1469],[-79.42461,40.14617],[-79.42392,40.1456],[-79.42336,40.14519],[-79.42258,40.14475],[-79.42103,40.14392],[-79.41666,40.14161],[-79.41456,40.14056],[-79.41316,40.13988],[-79.41202,40.13926],[-79.41122,40.13871],[-79.41065,40.13817],[-79.4101,40.13744],[-79.4097,40.13662],[-79.4095,40.1358],[-79.40915,40.13347],[-79.40899,40.13231],[-79.40876,40.13076],[-79.40862,40.13012],[-79.40844,40.12948],[-79.40813,40.12892],[-79.40778,40.12841],[-79.40728,40.12789],[-79.4067,40.1275],[-79.40622,40.12713],[-79.4057,40.12679],[-79.40452,40.126],[-79.40228,40.1245],[-79.40095,40.12356],[-79.4003,40.12314],[-79.40007,40.12295],[-79.3995,40.12239],[-79.39908,40.12181],[-79.39887,40.12146],[-79.39867,40.12099],[-79.39854,40.12044],[-79.3984,40.11971],[-79.3983,40.11923],[-79.39815,40.11873],[-79.39799,40.11832],[-79.39764,40.11768],[-79.39741,40.11732],[-79.39719,40.11701],[-79.39695,40.11673],[-79.39668,40.11645],[-79.3963,40.11611],[-79.39592,40.11579],[-79.3956,40.11558],[-79.39518,40.11531],[-79.3948,40.11509],[-79.39446,40.11493],[-79.39407,40.11475],[-79.39347,40.11449],[-79.39233,40.11399],[-79.3908,40.11334],[-79.38972,40.11286],[-79.38304,40.10995],[-79.38154,40.10931],[-79.38124,40.10918],[-79.38022,40.10873],[-79.37938,40.10837],[-79.37904,40.10825],[-79.37864,40.10812],[-79.37818,40.10798],[-79.37757,40.10783],[-79.37653,40.1076],[-79.37525,40.1073],[-79.37387,40.10698],[-79.37284,40.10685],[-79.37195,40.10685],[-79.37094,40.10696],[-79.3702,40.10713],[-79.36933,40.10744],[-79.36864,40.10783],[-79.36658,40.10922],[-79.36567,40.10974],[-79.3644,40.11036],[-79.36314,40.11088],[-79.36109,40.11152],[-79.35903,40.11207],[-79.35611,40.11283],[-79.34504,40.11572],[-79.33741,40.11779],[-79.33021,40.11974],[-79.32914,40.11996],[-79.32816,40.12012],[-79.3222,40.12101],[-79.31768,40.12167],[-79.31664,40.12182],[-79.31388,40.12221],[-79.30936,40.12285],[-79.30448,40.12351],[-79.30353,40.12371],[-79.30215,40.12415],[-79.29988,40.12539],[-79.29593,40.12765],[-79.2945,40.12844],[-79.29366,40.12873],[-79.29275,40.12892],[-79.29152,40.12893],[-79.29071,40.12879],[-79.29008,40.12864],[-79.28762,40.12757],[-79.2845,40.12619],[-79.28256,40.1253],[-79.28156,40.12467],[-79.28094,40.12413],[-79.28036,40.12343],[-79.27986,40.12255],[-79.27923,40.12101],[-79.27893,40.12052],[-79.2785,40.12003],[-79.2779,40.11955],[-79.27741,40.11924],[-79.27619,40.11875],[-79.27475,40.11857],[-79.27143,40.11854],[-79.27044,40.11852],[-79.26942,40.1184],[-79.26824,40.11821],[-79.26499,40.1177],[-79.2634,40.11741],[-79.26177,40.11691],[-79.26039,40.11625],[-79.25942,40.11573],[-79.25695,40.11438],[-79.25494,40.11372],[-79.25275,40.11327],[-79.25078,40.11295],[-79.24893,40.11231],[-79.24754,40.11141],[-79.24483,40.10938],[-79.24257,40.10788],[-79.24046,40.10641],[-79.23904,40.10549],[-79.23866,40.10529],[-79.23793,40.10491],[-79.23699,40.1045],[-79.23599,40.1042],[-79.23513,40.10401],[-79.23403,40.10394],[-79.23284,40.10404],[-79.23202,40.1042],[-79.23104,40.10448],[-79.22935,40.10514],[-79.22449,40.10741],[-79.22333,40.10766],[-79.22235,40.10775],[-79.22159,40.10778],[-79.22073,40.10769],[-79.21936,40.10744],[-79.21633,40.1066],[-79.21297,40.10563],[-79.2119,40.10534],[-79.21033,40.10491],[-79.20776,40.1042],[-79.20623,40.10374],[-79.20535,40.10336],[-79.20417,40.10267],[-79.2034,40.10183],[-79.20266,40.10077],[-79.20244,40.0999],[-79.20237,40.09908],[-79.20257,40.09667],[-79.20293,40.09412],[-79.20304,40.09336],[-79.20302,40.09284],[-79.20299,40.09239],[-79.20287,40.0918],[-79.20274,40.09111],[-79.20224,40.09018],[-79.20147,40.08916],[-79.20029,40.08811],[-79.19804,40.08641],[-79.19725,40.08582],[-79.19663,40.08542],[-79.19563,40.08494],[-79.19287,40.0839],[-79.19001,40.08282],[-79.18901,40.08236],[-79.18822,40.08191],[-79.18673,40.08071],[-79.18429,40.07889],[-79.18313,40.07814],[-79.18193,40.07756],[-79.18058,40.07706],[-79.17891,40.07658],[-79.1774,40.07632],[-79.17601,40.07615],[-79.17438,40.07615],[-79.17184,40.07627],[-79.17035,40.07635],[-79.16914,40.07636],[-79.16764,40.07623],[-79.16619,40.07594],[-79.1654,40.07574],[-79.16394,40.0752],[-79.1628,40.07459],[-79.16147,40.07359],[-79.15881,40.07062],[-79.15767,40.06951],[-79.15666,40.06881],[-79.15528,40.06805],[-79.15378,40.06764],[-79.14804,40.06624],[-79.1469,40.06598],[-79.14486,40.06548],[-79.14357,40.06496],[-79.14286,40.06454],[-79.14236,40.06417],[-79.14159,40.06335],[-79.14114,40.06262],[-79.14026,40.06058],[-79.13989,40.05996],[-79.13929,40.0594],[-79.13834,40.05871],[-79.13736,40.05834],[-79.1357,40.05791],[-79.13492,40.05772],[-79.13424,40.05747],[-79.13367,40.05722],[-79.13304,40.05688],[-79.13229,40.05635],[-79.12786,40.05347],[-79.12702,40.05286],[-79.12656,40.05254],[-79.12591,40.05198],[-79.12541,40.05139],[-79.12468,40.05042],[-79.12348,40.04875],[-79.12217,40.04697],[-79.12154,40.04617],[-79.12066,40.04509],[-79.11972,40.04429],[-79.11878,40.04364],[-79.11684,40.0426],[-79.1146,40.04148],[-79.11396,40.04123],[-79.11324,40.04109],[-79.11228,40.04102],[-79.11123,40.04105],[-79.10887,40.04128],[-79.10776,40.04128],[-79.10629,40.04103],[-79.10515,40.04066],[-79.10428,40.04011],[-79.1034,40.03941],[-79.10067,40.03705],[-79.0996,40.03607],[-79.0978,40.03438],[-79.09565,40.03256],[-79.09472,40.03171],[-79.0942,40.03115],[-79.09351,40.03017],[-79.0924,40.02876],[-79.09175,40.02787],[-79.09137,40.02735],[-79.091,40.02685],[-79.09003,40.02555],[-79.08918,40.02444],[-79.08864,40.02392],[-79.08838,40.02368],[-79.08805,40.02342],[-79.08772,40.02318],[-79.08743,40.02299],[-79.08712,40.02279],[-79.08689,40.02265],[-79.08644,40.02241],[-79.08583,40.02211],[-79.08579,40.02209],[-79.08362,40.02124],[-79.0829,40.02096],[-79.0822,40.02068],[-79.0812,40.02029],[-79.08043,40.01998],[-79.08006,40.01983],[-79.07976,40.01973],[-79.07943,40.0196],[-79.07916,40.01947],[-79.07884,40.01931],[-79.07861,40.01919],[-79.07844,40.0191],[-79.07818,40.01894],[-79.078,40.01882],[-79.07758,40.01853],[-79.07734,40.01833],[-79.07707,40.01809],[-79.07644,40.01747],[-79.07559,40.01659],[-79.07505,40.01592],[-79.07405,40.015],[-79.07371,40.01467],[-79.07354,40.01449],[-79.07336,40.0143],[-79.07217,40.01307],[-79.07128,40.01214],[-79.06988,40.01066],[-79.069,40.00976],[-79.06786,40.00895],[-79.06665,40.00836],[-79.06587,40.00804],[-79.06497,40.0078],[-79.06158,40.00705],[-79.0575,40.00626],[-79.05555,40.00581],[-79.05398,40.00528],[-79.05257,40.00445],[-79.05184,40.00391],[-79.05144,40.00351],[-79.05093,40.00301],[-79.05023,40.00231],[-79.04944,40.00162],[-79.04871,40.00111],[-79.04757,40.00058],[-79.04699,40.00035],[-79.04288,39.99901],[-79.04111,39.99842],[-79.03918,39.99778],[-79.03606,39.99673],[-79.03088,39.995],[-79.02728,39.99396],[-79.02578,39.99369],[-79.02423,39.9936],[-79.02136,39.9934],[-79.02024,39.99334],[-79.01831,39.99323],[-79.01679,39.99314],[-79.01529,39.99305],[-79.01504,39.99303],[-79.01372,39.99297],[-79.00731,39.99259],[-79.00482,39.99243],[-79.00335,39.99237],[-79.00084,39.99212],[-78.99772,39.99186],[-78.99425,39.99159],[-78.99226,39.99141],[-78.98924,39.99111],[-78.98828,39.99104],[-78.98497,39.99049],[-78.98333,39.99021],[-78.97881,39.98936],[-78.97543,39.98877],[-78.96933,39.98757],[-78.96471,39.98676],[-78.96125,39.986],[-78.95911,39.98555],[-78.95666,39.98469],[-78.95313,39.98357],[-78.94945,39.98227],[-78.94925,39.9822],[-78.94773,39.98164],[-78.94581,39.981],[-78.94048,39.97916],[-78.93859,39.97855],[-78.93741,39.97823],[-78.93648,39.97798],[-78.93414,39.97746],[-78.93229,39.97717],[-78.93042,39.9769],[-78.93023,39.97687],[-78.9288,39.97668],[-78.92325,39.97589],[-78.91769,39.97511],[-78.91329,39.97449],[-78.91297,39.97444],[-78.90408,39.97318],[-78.90023,39.97264],[-78.89673,39.97215],[-78.89338,39.97168],[-78.89134,39.97138],[-78.88786,39.9709],[-78.88594,39.97062],[-78.88109,39.96994],[-78.87876,39.96961],[-78.87685,39.96933],[-78.8766,39.9693],[-78.8758,39.96919],[-78.87546,39.96914],[-78.87515,39.96908],[-78.87477,39.969],[-78.87439,39.96891],[-78.87403,39.96881],[-78.87373,39.96872],[-78.87348,39.96864],[-78.8731,39.9685],[-78.87278,39.96838],[-78.87248,39.96825],[-78.8722,39.96813],[-78.87194,39.968],[-78.87159,39.96781],[-78.87114,39.96757],[-78.86989,39.96687],[-78.8696,39.96672],[-78.86939,39.96661],[-78.86885,39.96633],[-78.86833,39.96609],[-78.86788,39.96588],[-78.86727,39.96561],[-78.84878,39.95742],[-78.84858,39.95734],[-78.84842,39.95729],[-78.84826,39.95723],[-78.84812,39.95719],[-78.84795,39.95714],[-78.84781,39.95711],[-78.84766,39.95708],[-78.84748,39.95705],[-78.84733,39.95704],[-78.84712,39.95702],[-78.84694,39.95702],[-78.84675,39.95702],[-78.84656,39.95703],[-78.84638,39.95705],[-78.84619,39.95708],[-78.84599,39.95711],[-78.84581,39.95716],[-78.84552,39.95724],[-78.84528,39.95734],[-78.84503,39.95745],[-78.84482,39.95757],[-78.84463,39.95769],[-78.84441,39.95785],[-78.84413,39.95807],[-78.84342,39.95867],[-78.84304,39.95899],[-78.8426,39.95935],[-78.84217,39.95971],[-78.84099,39.9607],[-78.83846,39.96282],[-78.83824,39.96299],[-78.83808,39.96311],[-78.83792,39.96322],[-78.83771,39.96336],[-78.83747,39.96349],[-78.83722,39.96362],[-78.83694,39.96374],[-78.83663,39.96386],[-78.83639,39.96393],[-78.83602,39.96403],[-78.83577,39.96408],[-78.83545,39.96413],[-78.83511,39.96416],[-78.83478,39.96418],[-78.83448,39.96418],[-78.83417,39.96417],[-78.83391,39.96414],[-78.83364,39.96411],[-78.83328,39.96405],[-78.83298,39.96397],[-78.83268,39.96389],[-78.83231,39.96377],[-78.83184,39.96362],[-78.83141,39.96346],[-78.83103,39.9633],[-78.83079,39.96318],[-78.83052,39.96302],[-78.83019,39.96279],[-78.82991,39.96259],[-78.82948,39.96225],[-78.82806,39.96111],[-78.82717,39.96034],[-78.82654,39.95977],[-78.82569,39.95895],[-78.82362,39.95682],[-78.8233,39.95649],[-78.82311,39.95632],[-78.82288,39.95612],[-78.82264,39.95593],[-78.82232,39.95571],[-78.82212,39.95558],[-78.82185,39.95543],[-78.82155,39.95529],[-78.82131,39.95519],[-78.82107,39.95509],[-78.82083,39.95501],[-78.82057,39.95494],[-78.82028,39.95487],[-78.81983,39.95478],[-78.81963,39.95475],[-78.81938,39.95473],[-78.81906,39.9547],[-78.81852,39.95468],[-78.81807,39.9547],[-78.81719,39.95482],[-78.81677,39.95491],[-78.81645,39.95499],[-78.81605,39.95513],[-78.81566,39.95529],[-78.81532,39.95546],[-78.81498,39.95565],[-78.81463,39.95587],[-78.81405,39.95635],[-78.81384,39.95657],[-78.81353,39.95693],[-78.8133,39.95728],[-78.81298,39.95787],[-78.81264,39.9586],[-78.81239,39.9591],[-78.81179,39.96037],[-78.81125,39.96155],[-78.81049,39.96317],[-78.81037,39.96343],[-78.8102,39.9637],[-78.81005,39.96391],[-78.80986,39.96416],[-78.80969,39.96435],[-78.80944,39.96459],[-78.80911,39.96485],[-78.80861,39.96517],[-78.80785,39.96563],[-78.80763,39.96578],[-78.80745,39.96591],[-78.80723,39.96608],[-78.80705,39.96624],[-78.80687,39.96643],[-78.80658,39.96678],[-78.80632,39.96715],[-78.80574,39.96809],[-78.8053,39.96883],[-78.80438,39.97033],[-78.80356,39.9717],[-78.80322,39.97223],[-78.8029,39.97274],[-78.80247,39.97341],[-78.80219,39.97376],[-78.80194,39.97401],[-78.80177,39.97419],[-78.80135,39.97453],[-78.80101,39.97481],[-78.80026,39.9754],[-78.79939,39.97612],[-78.79882,39.97658],[-78.7983,39.97697],[-78.79777,39.97734],[-78.79742,39.9776],[-78.79684,39.97797],[-78.79608,39.97845],[-78.79533,39.9789],[-78.79453,39.97935],[-78.79412,39.97957],[-78.79299,39.98019],[-78.79246,39.98054],[-78.79199,39.98087],[-78.79137,39.98135],[-78.79104,39.98171],[-78.79045,39.98226],[-78.78992,39.98281],[-78.78965,39.98304],[-78.78944,39.98322],[-78.78915,39.98339],[-78.7888,39.98361],[-78.78849,39.98378],[-78.78763,39.98426],[-78.78727,39.98451],[-78.78693,39.98474],[-78.78652,39.9851],[-78.78595,39.9856],[-78.78556,39.98595],[-78.78524,39.98619],[-78.78501,39.98633],[-78.78468,39.98652],[-78.78434,39.98668],[-78.78387,39.98684],[-78.78353,39.98695],[-78.78314,39.98704],[-78.78275,39.98709],[-78.78237,39.98714],[-78.78214,39.98715],[-78.78164,39.98716],[-78.78127,39.98712],[-78.78085,39.98707],[-78.78054,39.98701],[-78.78013,39.98691],[-78.77986,39.98682],[-78.77968,39.98676],[-78.77943,39.98666],[-78.7793,39.98659],[-78.77894,39.98642],[-78.77625,39.98497],[-78.7747,39.98416],[-78.77343,39.98347],[-78.77248,39.98296],[-78.7711,39.98222],[-78.76885,39.98101],[-78.76671,39.97988],[-78.76501,39.97891],[-78.76429,39.97859],[-78.7636,39.97831],[-78.76286,39.97804],[-78.76186,39.97782],[-78.76078,39.97771],[-78.76022,39.97765],[-78.75972,39.97761],[-78.75938,39.97758],[-78.75798,39.97747],[-78.75758,39.97744],[-78.75465,39.97718],[-78.7538,39.97712],[-78.75282,39.97708],[-78.75216,39.97709],[-78.7516,39.97712],[-78.75109,39.97718],[-78.75067,39.97724],[-78.75022,39.97731],[-78.75018,39.97732],[-78.74977,39.9774],[-78.74972,39.97741],[-78.74909,39.97754],[-78.74752,39.97783],[-78.74602,39.97812],[-78.74488,39.97834],[-78.74373,39.97856],[-78.74306,39.97869],[-78.74216,39.97886],[-78.74123,39.97905],[-78.74108,39.97908],[-78.74094,39.97911],[-78.74091,39.97912],[-78.73756,39.97975],[-78.73542,39.98017],[-78.73397,39.98045],[-78.72986,39.98123],[-78.72786,39.98163],[-78.72285,39.9826],[-78.72076,39.98301],[-78.7192,39.9833],[-78.71842,39.98345],[-78.71726,39.98367],[-78.71638,39.98385],[-78.71363,39.98437],[-78.71264,39.98456],[-78.71116,39.98484],[-78.71062,39.98496],[-78.71016,39.98507],[-78.71001,39.98511],[-78.70988,39.98515],[-78.70968,39.98522],[-78.70946,39.98528],[-78.70919,39.98538],[-78.70893,39.98547],[-78.70851,39.98564],[-78.70809,39.98583],[-78.70774,39.98602],[-78.7075,39.98614],[-78.70717,39.98633],[-78.70692,39.98649],[-78.70663,39.98669],[-78.70634,39.9869],[-78.70611,39.98707],[-78.70584,39.9873],[-78.70564,39.98746],[-78.70528,39.98782],[-78.70479,39.98831],[-78.70378,39.98931],[-78.7028,39.99029],[-78.70277,39.99032],[-78.70212,39.99095],[-78.70145,39.99162],[-78.70085,39.99222],[-78.7002,39.99287],[-78.69967,39.99338],[-78.69855,39.99452],[-78.69769,39.99537],[-78.697,39.99606],[-78.69622,39.99682],[-78.69536,39.99768],[-78.69459,39.99845],[-78.69354,39.99948],[-78.69219,40.00083],[-78.69188,40.00115],[-78.69096,40.00206],[-78.68978,40.00322],[-78.68913,40.00387],[-78.6887,40.00424],[-78.68846,40.00444],[-78.68825,40.00462],[-78.68786,40.00492],[-78.68744,40.00524],[-78.68691,40.00563],[-78.68668,40.00577],[-78.68649,40.0059],[-78.68632,40.00601],[-78.68609,40.00616],[-78.68583,40.00632],[-78.68508,40.00676],[-78.68472,40.00696],[-78.68434,40.00717],[-78.68382,40.00743],[-78.68331,40.00767],[-78.68243,40.00805],[-78.68209,40.00819],[-78.68173,40.00832],[-78.68132,40.00848],[-78.68072,40.00868],[-78.68059,40.00873],[-78.67983,40.00896],[-78.67933,40.00911],[-78.6787,40.00927],[-78.67815,40.0094],[-78.67772,40.0095],[-78.67742,40.00956],[-78.67713,40.00961],[-78.67673,40.00968],[-78.67636,40.00975],[-78.67601,40.0098],[-78.67559,40.00986],[-78.67527,40.0099],[-78.67488,40.00995],[-78.67456,40.00998],[-78.67395,40.01003],[-78.67359,40.01006],[-78.67298,40.01009],[-78.67196,40.01013],[-78.66999,40.01022],[-78.6694,40.01024],[-78.66754,40.01033],[-78.66638,40.01038],[-78.66505,40.01044],[-78.66302,40.01053],[-78.66142,40.01061],[-78.66065,40.01064],[-78.65839,40.01074],[-78.65707,40.0108],[-78.6563,40.01084],[-78.65514,40.01089],[-78.65453,40.01092],[-78.65423,40.01093],[-78.65375,40.01095],[-78.65309,40.01099],[-78.65243,40.01105],[-78.65183,40.01112],[-78.65147,40.01116],[-78.65101,40.01123],[-78.65061,40.01129],[-78.65021,40.01137],[-78.6497,40.01147],[-78.64901,40.01162],[-78.64862,40.01172],[-78.64774,40.01194],[-78.64639,40.01229],[-78.64461,40.01276],[-78.6443,40.01283],[-78.64345,40.01305],[-78.64285,40.0132],[-78.64145,40.01357],[-78.64067,40.01377],[-78.63902,40.0142],[-78.63798,40.01447],[-78.63737,40.01462],[-78.63661,40.01482],[-78.63549,40.01511],[-78.63115,40.01623],[-78.63077,40.01633],[-78.63035,40.01644],[-78.62797,40.01705],[-78.62696,40.01731],[-78.6263,40.01748],[-78.62565,40.01765],[-78.62538,40.01772],[-78.62485,40.01785],[-78.62474,40.01788],[-78.62436,40.01797],[-78.62381,40.01812],[-78.6236,40.01818],[-78.62323,40.01827],[-78.62262,40.01842],[-78.62224,40.01852],[-78.62208,40.01856],[-78.62165,40.01868],[-78.62064,40.01894],[-78.62035,40.01901],[-78.61988,40.01912],[-78.61968,40.01916],[-78.61928,40.01923],[-78.61892,40.01927],[-78.61852,40.01931],[-78.61807,40.01934],[-78.61783,40.01934],[-78.6174,40.01933],[-78.61715,40.01932],[-78.61671,40.01928],[-78.61638,40.01925],[-78.61587,40.01917],[-78.61569,40.01913],[-78.61528,40.01904],[-78.6149,40.01894],[-78.61431,40.01875],[-78.6137,40.0185],[-78.6134,40.01836],[-78.61322,40.01827],[-78.61318,40.01824],[-78.61288,40.01809],[-78.61282,40.01805],[-78.61276,40.01801],[-78.61259,40.01791],[-78.61239,40.01777],[-78.61204,40.01752],[-78.61175,40.01729],[-78.61162,40.01717],[-78.61149,40.01705],[-78.61131,40.01688],[-78.6112,40.01677],[-78.61086,40.01638],[-78.61076,40.01625],[-78.6105,40.01587],[-78.61037,40.01567],[-78.61026,40.01546],[-78.61005,40.01505],[-78.60996,40.01481],[-78.60989,40.01461],[-78.60979,40.01423],[-78.60975,40.01406],[-78.6097,40.01383],[-78.60966,40.01342],[-78.6096,40.01237],[-78.60957,40.01204],[-78.60951,40.01166],[-78.60947,40.01149],[-78.60932,40.01113],[-78.6092,40.01089],[-78.60905,40.01066],[-78.60883,40.01038],[-78.60872,40.01025],[-78.60859,40.01011],[-78.60842,40.00997],[-78.60831,40.00986],[-78.60815,40.00975],[-78.60789,40.00958],[-78.6077,40.00947],[-78.60752,40.00937],[-78.60733,40.00928],[-78.60715,40.0092],[-78.60682,40.00907],[-78.60663,40.00901],[-78.60642,40.00896],[-78.60624,40.00892],[-78.60603,40.00887],[-78.60586,40.00884],[-78.60551,40.0088],[-78.60514,40.00878],[-78.60493,40.00878],[-78.60464,40.00879],[-78.60437,40.00881],[-78.60418,40.00884],[-78.60393,40.00888],[-78.60367,40.00893],[-78.60351,40.00897],[-78.60333,40.00902],[-78.60312,40.00909],[-78.60281,40.0092],[-78.60264,40.00928],[-78.60226,40.00946],[-78.60179,40.00971],[-78.60146,40.00988],[-78.60057,40.01041],[-78.59969,40.0109],[-78.59694,40.01246],[-78.59456,40.01379],[-78.59417,40.01402],[-78.59141,40.01558],[-78.59085,40.01591],[-78.58972,40.01656],[-78.589,40.01696],[-78.58878,40.01708],[-78.5886,40.01718],[-78.58836,40.01732],[-78.58814,40.01747],[-78.58784,40.01767],[-78.58758,40.01785],[-78.58723,40.01811],[-78.58695,40.01833],[-78.58652,40.0187],[-78.58626,40.01892],[-78.58601,40.01919],[-78.58548,40.0197],[-78.58498,40.02019],[-78.58409,40.02106],[-78.58335,40.02178],[-78.58277,40.02235],[-78.58215,40.02295],[-78.58105,40.02401],[-78.58021,40.02484],[-78.57927,40.02576],[-78.57815,40.02685],[-78.57696,40.02801],[-78.57609,40.02886],[-78.57492,40.03],[-78.57432,40.03058],[-78.57379,40.0311],[-78.57338,40.03149],[-78.57303,40.03185],[-78.57216,40.03269],[-78.57173,40.03311],[-78.57063,40.03419],[-78.56939,40.03539],[-78.56816,40.03659],[-78.56762,40.03714],[-78.56669,40.03802],[-78.56547,40.03922],[-78.56391,40.04073],[-78.56255,40.04205],[-78.56225,40.04234],[-78.56059,40.04397],[-78.55942,40.0451],[-78.55913,40.04536],[-78.55884,40.0456],[-78.55852,40.04583],[-78.5581,40.04612],[-78.55779,40.04633],[-78.55743,40.04654],[-78.55698,40.04678],[-78.55638,40.04707],[-78.55588,40.04729],[-78.55534,40.04749],[-78.5549,40.04764],[-78.55414,40.04784],[-78.55363,40.04796],[-78.55324,40.04803],[-78.5529,40.0481],[-78.55094,40.04841],[-78.55057,40.04847],[-78.5487,40.04876],[-78.54773,40.04892],[-78.54675,40.04907],[-78.54482,40.04938],[-78.54157,40.0499],[-78.54031,40.0501],[-78.53964,40.05021],[-78.53893,40.05032],[-78.53868,40.05035],[-78.53832,40.0504],[-78.53776,40.05047],[-78.53734,40.05051],[-78.53627,40.05059],[-78.53567,40.05061],[-78.53526,40.05062],[-78.53516,40.05062],[-78.53505,40.05062],[-78.53448,40.05061],[-78.53408,40.0506],[-78.53344,40.05057],[-78.53259,40.05051],[-78.53186,40.05044],[-78.5305,40.05032],[-78.5298,40.05025],[-78.52864,40.05016],[-78.52692,40.05001],[-78.5254,40.04987],[-78.52485,40.04982],[-78.52342,40.0497],[-78.52255,40.04966],[-78.52221,40.04966],[-78.52186,40.04967],[-78.52156,40.04969],[-78.52118,40.0497],[-78.5209,40.04972],[-78.5202,40.04977],[-78.5185,40.04989],[-78.51824,40.04991],[-78.51794,40.04993],[-78.51779,40.04993],[-78.51762,40.04995],[-78.51697,40.04999],[-78.51642,40.05003],[-78.51593,40.05006],[-78.51537,40.0501],[-78.51522,40.05011],[-78.51508,40.05011],[-78.51469,40.05012],[-78.51449,40.05012],[-78.51408,40.0501],[-78.51387,40.05008],[-78.51368,40.05006],[-78.51357,40.05005],[-78.51341,40.05004],[-78.51305,40.04998],[-78.51251,40.04986],[-78.51225,40.04979],[-78.51198,40.04971],[-78.51171,40.04963],[-78.51146,40.04954],[-78.51122,40.04945],[-78.51096,40.04935],[-78.51059,40.04917],[-78.5103,40.04901],[-78.50987,40.04872],[-78.50958,40.04851],[-78.50926,40.04826],[-78.50905,40.04808],[-78.50879,40.04783],[-78.50782,40.04687],[-78.50766,40.04671],[-78.50743,40.04645],[-78.50718,40.04616],[-78.50696,40.04586],[-78.50677,40.04557],[-78.50664,40.04537],[-78.50648,40.0451],[-78.50638,40.0449],[-78.50628,40.04467],[-78.50614,40.04435],[-78.50606,40.04414],[-78.50576,40.04318],[-78.50557,40.04266],[-78.50543,40.04235],[-78.50526,40.04204],[-78.50513,40.04185],[-78.50477,40.04133],[-78.50446,40.0409],[-78.50411,40.04043],[-78.50387,40.04012],[-78.50369,40.03991],[-78.5035,40.03971],[-78.50326,40.03947],[-78.50285,40.03909],[-78.50245,40.03874],[-78.50183,40.03819],[-78.50139,40.03781],[-78.50033,40.03687],[-78.49987,40.03646],[-78.49949,40.03612],[-78.49871,40.03544],[-78.49839,40.03513],[-78.49786,40.03461],[-78.49771,40.03444],[-78.49748,40.03421],[-78.49709,40.03376],[-78.49667,40.03329],[-78.4961,40.03268],[-78.49584,40.03242],[-78.49539,40.03203],[-78.49457,40.03146],[-78.49381,40.031],[-78.49344,40.03081],[-78.49316,40.03067],[-78.49306,40.03062],[-78.49184,40.03011],[-78.4917,40.03005],[-78.49053,40.02956],[-78.4892,40.029],[-78.48844,40.02868],[-78.48807,40.02852],[-78.48768,40.02833],[-78.4869,40.02794],[-78.48622,40.02757],[-78.4853,40.02701],[-78.48449,40.02645],[-78.48352,40.02571],[-78.48267,40.02503],[-78.4816,40.02417],[-78.48149,40.02409],[-78.47918,40.02223],[-78.47759,40.02097],[-78.47641,40.02003],[-78.47618,40.01984],[-78.47574,40.01949],[-78.47506,40.01894],[-78.47487,40.01879],[-78.47456,40.01854],[-78.47386,40.01796],[-78.47311,40.0173],[-78.47252,40.01668],[-78.47168,40.01574],[-78.47162,40.01569],[-78.47066,40.01464],[-78.47064,40.0146],[-78.47043,40.0144],[-78.47031,40.01427],[-78.47,40.01401],[-78.46967,40.01375],[-78.46905,40.01331],[-78.46819,40.01284],[-78.46777,40.01263],[-78.46744,40.01248],[-78.46705,40.01232],[-78.46667,40.01219],[-78.46616,40.01202],[-78.46601,40.01197],[-78.46543,40.01181],[-78.46493,40.01172],[-78.46474,40.01168],[-78.46443,40.01164],[-78.46415,40.01159],[-78.4637,40.01155],[-78.46342,40.01152],[-78.46302,40.0115],[-78.46277,40.01149],[-78.46222,40.01148],[-78.4615,40.01148],[-78.45963,40.01148],[-78.45867,40.01149],[-78.45865,40.01149],[-78.45837,40.01149],[-78.45666,40.0115],[-78.45278,40.01152],[-78.45224,40.01151],[-78.44974,40.01153],[-78.44719,40.01153],[-78.44607,40.01153],[-78.44561,40.01153],[-78.44523,40.01152],[-78.44493,40.01149],[-78.44454,40.01144],[-78.44423,40.0114],[-78.44383,40.01131],[-78.44357,40.01125],[-78.44319,40.01114],[-78.4429,40.01103],[-78.44252,40.01089],[-78.44202,40.01066],[-78.4417,40.01048],[-78.44148,40.01036],[-78.44104,40.01006],[-78.44022,40.00945],[-78.43981,40.00914],[-78.43858,40.00823],[-78.43825,40.00799],[-78.43808,40.00786],[-78.43774,40.00762],[-78.43735,40.00732],[-78.43683,40.00694],[-78.43636,40.00658],[-78.43623,40.00649],[-78.43559,40.00602],[-78.43544,40.00591],[-78.43518,40.00573],[-78.43398,40.00484],[-78.43352,40.0045],[-78.43321,40.00427],[-78.43289,40.00405],[-78.43266,40.0039],[-78.43233,40.00371],[-78.43196,40.00353],[-78.43135,40.00327],[-78.43109,40.00318],[-78.43068,40.00305],[-78.43042,40.00299],[-78.43013,40.0029],[-78.4296,40.0028],[-78.42943,40.00277],[-78.42904,40.00273],[-78.42876,40.00271],[-78.42847,40.00269],[-78.42821,40.00268],[-78.42792,40.00268],[-78.42764,40.00269],[-78.42719,40.00271],[-78.42677,40.00276],[-78.42624,40.00282],[-78.42567,40.0029],[-78.42333,40.00318],[-78.42323,40.00319],[-78.42313,40.0032],[-78.42287,40.00323],[-78.42174,40.00336],[-78.42168,40.00337],[-78.42051,40.00353],[-78.42023,40.00356],[-78.41923,40.00369],[-78.41892,40.00373],[-78.41765,40.00389],[-78.417,40.00397],[-78.41644,40.00408],[-78.41592,40.00421],[-78.41533,40.00439],[-78.41476,40.00461],[-78.41444,40.00477],[-78.4141,40.00495],[-78.41371,40.00517],[-78.41327,40.00545],[-78.41314,40.00554],[-78.41293,40.00568],[-78.41262,40.00594],[-78.41236,40.00617],[-78.412,40.00654],[-78.4119,40.00663],[-78.41175,40.00682],[-78.41153,40.00711],[-78.4113,40.00745],[-78.41097,40.00806],[-78.41043,40.00912],[-78.41033,40.0093],[-78.41016,40.00961],[-78.4099,40.01],[-78.40968,40.01028],[-78.40942,40.01056],[-78.40909,40.01088],[-78.40879,40.01112],[-78.4085,40.01133],[-78.40814,40.01156],[-78.40768,40.01181],[-78.40732,40.01197],[-78.40696,40.01212],[-78.40624,40.01234],[-78.40582,40.01245],[-78.40551,40.01251],[-78.40525,40.01255],[-78.40493,40.01259],[-78.40461,40.01261],[-78.4045,40.01262],[-78.40414,40.01263],[-78.40372,40.01263],[-78.40343,40.01262],[-78.40311,40.01259],[-78.40276,40.01254],[-78.40244,40.01249],[-78.40205,40.01241],[-78.40196,40.01239],[-78.40163,40.0123],[-78.4009,40.01207],[-78.3996,40.01164],[-78.39834,40.01123],[-78.39776,40.01105],[-78.39737,40.01095],[-78.39711,40.0109],[-78.39661,40.01081],[-78.39624,40.01075],[-78.39587,40.01071],[-78.39557,40.01068],[-78.3951,40.01066],[-78.39458,40.01064],[-78.39387,40.0106],[-78.3933,40.01056],[-78.39288,40.01051],[-78.39257,40.01047],[-78.39212,40.01038],[-78.3918,40.01031],[-78.39149,40.01023],[-78.39071,40.00997],[-78.39061,40.00994],[-78.39028,40.0098],[-78.39,40.00967],[-78.38977,40.00956],[-78.38948,40.00941],[-78.38879,40.00898],[-78.38866,40.00889],[-78.38623,40.00734],[-78.3849,40.00648],[-78.38371,40.0057],[-78.38329,40.00544],[-78.38304,40.00528],[-78.3826,40.005],[-78.38249,40.00493],[-78.3822,40.00474],[-78.38172,40.00446],[-78.38125,40.00421],[-78.3809,40.00405],[-78.38053,40.00389],[-78.38035,40.00382],[-78.38013,40.00373],[-78.37965,40.00356],[-78.379,40.00337],[-78.37884,40.00332],[-78.37846,40.00322],[-78.37813,40.00314],[-78.37777,40.00307],[-78.37761,40.00304],[-78.37733,40.00299],[-78.37691,40.00293],[-78.37641,40.00287],[-78.37619,40.00285],[-78.37431,40.00268],[-78.37326,40.00258],[-78.37306,40.00257],[-78.37269,40.00254],[-78.37181,40.00246],[-78.37156,40.00243],[-78.37015,40.00231],[-78.36966,40.00226],[-78.3693,40.00223],[-78.36729,40.00205],[-78.36675,40.00199],[-78.36647,40.00195],[-78.36591,40.00187],[-78.36588,40.00186],[-78.36564,40.00182],[-78.36511,40.0017],[-78.36455,40.00157],[-78.36405,40.00143],[-78.36228,40.00097],[-78.36119,40.00068],[-78.36098,40.00063],[-78.3605,40.00052],[-78.36009,40.00045],[-78.35968,40.00039],[-78.35897,40.00031],[-78.35854,40.00029],[-78.35815,40.00028],[-78.35758,40.00028],[-78.35724,40.00029],[-78.35641,40.00036],[-78.35361,40.00066],[-78.35322,40.0007],[-78.35293,40.00073],[-78.35155,40.00087],[-78.35104,40.00093],[-78.35032,40.001],[-78.35024,40.00101],[-78.34988,40.00103],[-78.34966,40.00104],[-78.34939,40.00104],[-78.34867,40.00103],[-78.3485,40.00101],[-78.34829,40.00099],[-78.34815,40.00098],[-78.34779,40.00093],[-78.3475,40.00088],[-78.34731,40.00084],[-78.34507,40.00035],[-78.34097,39.99942],[-78.34021,39.99925],[-78.33972,39.99913],[-78.33953,39.99908],[-78.33924,39.99899],[-78.33885,39.99885],[-78.33857,39.99873],[-78.33828,39.9986],[-78.33803,39.99848],[-78.33786,39.99838],[-78.33727,39.99801],[-78.3371,39.9979],[-78.33668,39.99762],[-78.33641,39.99746],[-78.33624,39.99735],[-78.33595,39.99719],[-78.33552,39.99698],[-78.33536,39.99691],[-78.33504,39.99678],[-78.33443,39.99659],[-78.33423,39.99654],[-78.33402,39.99648],[-78.33373,39.99642],[-78.33092,39.99592],[-78.33023,39.99579],[-78.32991,39.99571],[-78.32969,39.99566],[-78.32958,39.99563],[-78.3294,39.99557],[-78.32925,39.99552],[-78.32908,39.99546],[-78.32872,39.99532],[-78.32841,39.99519],[-78.3281,39.99504],[-78.32772,39.99485],[-78.3276,39.99478],[-78.32642,39.99413],[-78.32235,39.99196],[-78.32188,39.9917],[-78.32163,39.99157],[-78.3214,39.99144],[-78.32121,39.99134],[-78.32102,39.99124],[-78.32062,39.99103],[-78.32022,39.99084],[-78.31998,39.99074],[-78.31973,39.99065],[-78.31956,39.99059],[-78.31925,39.9905],[-78.31892,39.99043],[-78.31858,39.99036],[-78.31825,39.99031],[-78.3181,39.99029],[-78.31784,39.99027],[-78.31751,39.99025],[-78.31704,39.99025],[-78.31556,39.99024],[-78.31436,39.99023],[-78.31416,39.99023],[-78.3127,39.99022],[-78.31194,39.99017],[-78.31128,39.99007],[-78.31093,39.99001],[-78.31057,39.98991],[-78.30994,39.98972],[-78.3096,39.98959],[-78.30894,39.98929],[-78.30845,39.98907],[-78.30769,39.98872],[-78.3072,39.98848],[-78.30476,39.98739],[-78.30348,39.98679],[-78.30286,39.98656],[-78.30238,39.9864],[-78.30174,39.98622],[-78.30094,39.98609],[-78.30043,39.98604],[-78.29997,39.986],[-78.29888,39.98592],[-78.29714,39.98582],[-78.29547,39.98572],[-78.29446,39.98564],[-78.29362,39.9855],[-78.29297,39.98536],[-78.29234,39.98519],[-78.29175,39.98498],[-78.29113,39.98473],[-78.29002,39.98428],[-78.28838,39.9836],[-78.28782,39.9834],[-78.28708,39.98318],[-78.28671,39.98309],[-78.28634,39.98301],[-78.28572,39.98289],[-78.2851,39.98282],[-78.28456,39.98277],[-78.28386,39.98274],[-78.28161,39.98272],[-78.27992,39.9827],[-78.2783,39.98268],[-78.27742,39.9827],[-78.27657,39.98276],[-78.27556,39.98288],[-78.2747,39.98303],[-78.27388,39.98322],[-78.27,39.98433],[-78.26814,39.98486],[-78.26487,39.98579],[-78.26425,39.98597],[-78.26333,39.98618],[-78.2631,39.98624],[-78.2618,39.98651],[-78.26116,39.98656],[-78.26089,39.98658],[-78.26066,39.98659],[-78.2604,39.98659],[-78.26013,39.98657],[-78.2599,39.98654],[-78.2597,39.98649],[-78.2595,39.98643],[-78.2593,39.98636],[-78.25913,39.98627],[-78.25898,39.9862],[-78.25851,39.98591],[-78.25829,39.98576],[-78.25814,39.98568],[-78.25801,39.98564],[-78.25786,39.9856],[-78.25773,39.98559],[-78.25757,39.9856],[-78.25741,39.98564],[-78.25726,39.98569],[-78.25712,39.98576],[-78.25703,39.98583],[-78.25695,39.9859],[-78.25689,39.98596],[-78.25684,39.98605],[-78.2568,39.98613],[-78.25673,39.98642],[-78.25662,39.98692],[-78.25649,39.98745],[-78.25647,39.98761],[-78.25644,39.98775],[-78.25641,39.98786],[-78.25637,39.98796],[-78.25632,39.98805],[-78.25626,39.98812],[-78.25619,39.9882],[-78.25611,39.98827],[-78.25597,39.98836],[-78.25587,39.98843],[-78.25565,39.98856],[-78.25538,39.98872],[-78.25513,39.98884],[-78.25484,39.98896],[-78.25437,39.98912],[-78.25368,39.98933],[-78.2529,39.98956],[-78.2524,39.98971],[-78.25229,39.98974],[-78.2522,39.98976],[-78.25214,39.98978],[-78.252,39.98981],[-78.25177,39.98986],[-78.25141,39.98992],[-78.25101,39.98997],[-78.25046,39.99004],[-78.24991,39.9901],[-78.24957,39.99014],[-78.2493,39.99019],[-78.24892,39.99026],[-78.24859,39.9903],[-78.24808,39.99037],[-78.24743,39.99041],[-78.24628,39.99046],[-78.24163,39.99061],[-78.24111,39.99064],[-78.24073,39.99067],[-78.2403,39.99073],[-78.23998,39.99079],[-78.23956,39.99089],[-78.23919,39.99099],[-78.23878,39.99113],[-78.23843,39.99126],[-78.23806,39.99143],[-78.23779,39.99156],[-78.23723,39.99189],[-78.23672,39.99226],[-78.23625,39.99269],[-78.23574,39.99321],[-78.23539,39.99358],[-78.23499,39.99401],[-78.23488,39.99413],[-78.23456,39.99451],[-78.23411,39.99502],[-78.2339,39.99531],[-78.23375,39.99555],[-78.23361,39.99586],[-78.23347,39.99621],[-78.23337,39.99653],[-78.23327,39.99726],[-78.23327,39.998],[-78.2333,39.9993],[-78.23331,39.99962],[-78.23332,39.99972],[-78.2333,39.99981],[-78.23328,39.9999],[-78.23325,39.99996],[-78.23317,40.00004],[-78.23308,40.00011],[-78.23298,40.00016],[-78.23286,40.00019],[-78.23272,40.0002],[-78.23261,40.00019],[-78.23253,40.00017],[-78.23246,40.00015],[-78.23238,40.00011],[-78.23233,40.00007],[-78.23224,39.99999],[-78.23221,39.99992],[-78.23219,39.99983],[-78.2322,39.99977],[-78.23223,39.99971],[-78.23226,39.99968],[-78.2323,39.99965],[-78.23241,39.9996],[-78.23256,39.99954],[-78.23275,39.99949],[-78.23306,39.99946],[-78.23333,39.99944],[-78.2336,39.99942],[-78.23403,39.99939],[-78.23429,39.99937],[-78.23438,39.99936],[-78.23473,39.99935],[-78.23505,39.99935],[-78.23539,39.99935],[-78.23591,39.99936],[-78.23609,39.99936],[-78.23692,39.99939],[-78.23718,39.9994],[-78.23727,39.99941],[-78.23775,39.99942],[-78.23789,39.99943],[-78.2382,39.99946],[-78.23838,39.99946],[-78.23866,39.99946],[-78.23876,39.99946],[-78.23887,39.99947],[-78.2389,39.99928],[-78.23898,39.99894],[-78.23925,39.99815],[-78.2394,39.99783],[-78.23952,39.99758],[-78.23976,39.99714],[-78.24008,39.99656],[-78.24029,39.99617],[-78.24062,39.99561],[-78.24064,39.99558],[-78.24128,39.99444],[-78.24165,39.99381],[-78.24194,39.99327],[-78.24197,39.99322],[-78.24219,39.99276],[-78.24243,39.99215],[-78.24258,39.99159],[-78.24267,39.99122],[-78.24276,39.99084],[-78.24285,39.99041],[-78.24289,39.9902],[-78.24293,39.98997],[-78.24296,39.98975],[-78.24309,39.98901],[-78.24352,39.98634],[-78.24386,39.98452],[-78.24408,39.98321],[-78.24424,39.98245],[-78.2444,39.98154],[-78.24486,39.97891],[-78.24488,39.97882],[-78.24492,39.97863],[-78.24524,39.97685],[-78.24529,39.9766],[-78.24532,39.97644],[-78.24553,39.9752],[-78.24577,39.97383],[-78.2458,39.97374],[-78.24609,39.97212],[-78.2464,39.97036],[-78.24643,39.97022],[-78.24663,39.96901],[-78.2467,39.96862],[-78.2469,39.96754],[-78.24736,39.96497],[-78.24738,39.96489],[-78.24746,39.9643],[-78.24747,39.96366],[-78.2474,39.9629],[-78.24729,39.96215],[-78.24717,39.96126],[-78.24717,39.96117],[-78.2471,39.96066],[-78.24708,39.96064],[-78.2468,39.95889],[-78.24671,39.95857],[-78.24659,39.95824],[-78.24644,39.95789],[-78.2463,39.95762],[-78.24609,39.95731],[-78.24591,39.95706],[-78.24569,39.9568],[-78.24541,39.95651],[-78.24517,39.95629],[-78.24492,39.95608],[-78.24483,39.95602],[-78.24471,39.95593],[-78.24446,39.95577],[-78.24349,39.95519],[-78.23903,39.95258],[-78.23655,39.95114],[-78.23604,39.95084],[-78.23579,39.9507],[-78.23556,39.95058],[-78.23531,39.95046],[-78.23507,39.95035],[-78.23481,39.95025],[-78.23422,39.95003],[-78.2329,39.94956],[-78.23201,39.94923],[-78.23183,39.94916],[-78.23168,39.9491],[-78.23153,39.94903],[-78.23107,39.94878],[-78.23074,39.94859],[-78.23045,39.94839],[-78.23023,39.94823],[-78.23005,39.94808],[-78.22987,39.94791],[-78.22973,39.94778],[-78.22957,39.94762],[-78.22944,39.94747],[-78.22931,39.9473],[-78.22915,39.94709],[-78.22902,39.9469],[-78.22887,39.94663],[-78.2287,39.94628],[-78.22847,39.94574],[-78.22752,39.94352],[-78.22744,39.94331],[-78.22738,39.9431],[-78.22732,39.94288],[-78.22728,39.94267],[-78.22725,39.94245],[-78.22723,39.94223],[-78.22723,39.942],[-78.22723,39.94191],[-78.22723,39.94183],[-78.22723,39.94169],[-78.22725,39.94148],[-78.22729,39.94126],[-78.22735,39.94095],[-78.22746,39.94061],[-78.22758,39.94031],[-78.22773,39.94],[-78.22801,39.93939],[-78.22832,39.93877],[-78.22868,39.938],[-78.22936,39.93659],[-78.22966,39.93598],[-78.23023,39.93478],[-78.23076,39.93367],[-78.23146,39.93224],[-78.23171,39.93171],[-78.23199,39.93114],[-78.23226,39.93057],[-78.23238,39.93032],[-78.23243,39.93019],[-78.23291,39.92904],[-78.2333,39.928],[-78.23352,39.92733],[-78.23358,39.92717],[-78.23383,39.92628],[-78.23388,39.92612],[-78.23404,39.92548],[-78.23404,39.92535],[-78.23413,39.92507],[-78.23428,39.92441],[-78.23499,39.92127],[-78.23506,39.92085],[-78.23513,39.92063],[-78.23536,39.91959],[-78.23542,39.9194],[-78.23546,39.91918],[-78.23564,39.91838],[-78.23689,39.91282],[-78.23715,39.91167],[-78.23731,39.91072],[-78.23746,39.91025],[-78.23766,39.90938],[-78.2378,39.90895],[-78.2378,39.90873],[-78.23811,39.90739],[-78.23816,39.90709],[-78.23821,39.90695],[-78.23822,39.90689],[-78.23837,39.90625],[-78.23873,39.90484],[-78.2398,39.90063],[-78.2402,39.89957],[-78.24035,39.89919],[-78.24082,39.89804],[-78.24093,39.89772],[-78.24398,39.89038],[-78.24484,39.88829],[-78.24494,39.8878],[-78.24497,39.88722],[-78.2449,39.88677],[-78.24488,39.88662],[-78.24486,39.88653],[-78.24483,39.88644],[-78.24469,39.8861],[-78.24448,39.88557],[-78.24424,39.88498],[-78.24417,39.8848],[-78.24416,39.88475],[-78.24409,39.88447],[-78.24406,39.88427],[-78.24404,39.88412],[-78.24397,39.88377],[-78.24405,39.88337],[-78.24408,39.88322],[-78.24418,39.88285],[-78.24442,39.88225],[-78.24451,39.8821],[-78.24464,39.88191],[-78.24481,39.88172],[-78.24503,39.88152],[-78.24562,39.88089],[-78.2481,39.87821],[-78.24973,39.87624],[-78.25002,39.87593],[-78.25104,39.87465],[-78.25299,39.87231],[-78.25329,39.87197],[-78.25379,39.87149],[-78.25414,39.87118],[-78.25453,39.87088],[-78.25844,39.86865],[-78.25894,39.86834],[-78.25917,39.86816],[-78.2594,39.86805],[-78.25988,39.86769],[-78.26004,39.86759],[-78.26344,39.86424],[-78.26422,39.86334],[-78.2647,39.86274],[-78.2652,39.86206],[-78.26582,39.86113],[-78.27147,39.85195],[-78.27231,39.85052],[-78.27265,39.84989],[-78.27316,39.84884],[-78.27522,39.84421],[-78.27555,39.84336],[-78.27588,39.84227],[-78.27609,39.84138],[-78.27616,39.84105],[-78.27618,39.84093],[-78.27628,39.84025],[-78.27636,39.83934],[-78.27639,39.83866],[-78.27639,39.8382],[-78.27632,39.83706],[-78.27624,39.83636],[-78.27617,39.8359],[-78.27608,39.83543],[-78.27591,39.83473],[-78.27508,39.83173],[-78.27493,39.83116],[-78.27368,39.82667],[-78.27367,39.82662],[-78.27309,39.8245],[-78.27237,39.82189],[-78.272,39.82055],[-78.2719,39.82011],[-78.27161,39.81831],[-78.27158,39.81761],[-78.27158,39.81697],[-78.27163,39.81624],[-78.27173,39.81543],[-78.2719,39.81459],[-78.27207,39.81394],[-78.27228,39.81329],[-78.27284,39.81179],[-78.27297,39.81135],[-78.27304,39.81091],[-78.27306,39.81048],[-78.27305,39.81009],[-78.27301,39.80975],[-78.2729,39.80931],[-78.27282,39.80903],[-78.27267,39.80868],[-78.27234,39.80807],[-78.27216,39.80781],[-78.27176,39.80735],[-78.27137,39.80697],[-78.27089,39.8066],[-78.27055,39.80636],[-78.27007,39.80609],[-78.2697,39.80592],[-78.26879,39.80556],[-78.26658,39.80478],[-78.26246,39.80331],[-78.26136,39.80291],[-78.26013,39.80249],[-78.25868,39.80197],[-78.25828,39.80182],[-78.25495,39.80064],[-78.25416,39.80036],[-78.25286,39.79992],[-78.25204,39.79969],[-78.25102,39.79947],[-78.24964,39.79917],[-78.24931,39.79911],[-78.24846,39.79899],[-78.24743,39.79889],[-78.24604,39.79874],[-78.24568,39.79871],[-78.24353,39.79849],[-78.24317,39.79845],[-78.24229,39.79833],[-78.24204,39.79829],[-78.24158,39.79821],[-78.24083,39.79805],[-78.23417,39.79663],[-78.23358,39.79652],[-78.23272,39.79631],[-78.2305,39.79584],[-78.22876,39.79546],[-78.2266,39.79511],[-78.22654,39.7951],[-78.22337,39.79474],[-78.21656,39.79398],[-78.21599,39.79383],[-78.2154,39.79364],[-78.21507,39.79351],[-78.21472,39.79335],[-78.21387,39.79286],[-78.21328,39.79241],[-78.21302,39.79217],[-78.21289,39.79203],[-78.21278,39.79189],[-78.21264,39.79174],[-78.2124,39.79142],[-78.21228,39.79125],[-78.21208,39.79088],[-78.2119,39.79049],[-78.21176,39.79008],[-78.21144,39.78889],[-78.21122,39.78809],[-78.21088,39.7868],[-78.21062,39.78583],[-78.21056,39.78562],[-78.2104,39.78521],[-78.2102,39.78481],[-78.21008,39.78461],[-78.20994,39.78442],[-78.20964,39.78406],[-78.20948,39.78389],[-78.20912,39.78356],[-78.20872,39.78327],[-78.20851,39.78313],[-78.20784,39.78276],[-78.2055,39.78164],[-78.20504,39.78141],[-78.20461,39.78115],[-78.20424,39.78085],[-78.20392,39.78051],[-78.20364,39.78016],[-78.20119,39.77678],[-78.20116,39.7767],[-78.20111,39.77663],[-78.20098,39.77647],[-78.20066,39.77601],[-78.20048,39.77566],[-78.2003,39.77528],[-78.2002,39.77502],[-78.20014,39.77481],[-78.20005,39.77439],[-78.20002,39.77418],[-78.2,39.77375],[-78.20003,39.77327],[-78.20004,39.77313],[-78.20064,39.76854],[-78.20067,39.76809],[-78.20066,39.76764],[-78.20061,39.76718],[-78.20056,39.76696],[-78.20037,39.76629],[-78.2002,39.76586],[-78.19986,39.76523],[-78.19959,39.76483],[-78.19929,39.76445],[-78.19876,39.76391],[-78.19818,39.76342],[-78.19705,39.76261],[-78.19195,39.75892],[-78.19035,39.75776],[-78.19012,39.75759],[-78.18871,39.75656],[-78.18678,39.75517],[-78.18627,39.75479],[-78.18587,39.75446],[-78.18551,39.75415],[-78.18514,39.75381],[-78.1848,39.75347],[-78.18439,39.75302],[-78.18403,39.7526],[-78.18371,39.75219],[-78.18344,39.75181],[-78.18319,39.75142],[-78.18295,39.75102],[-78.18274,39.75063],[-78.18254,39.75023],[-78.18235,39.7498],[-78.18218,39.74936],[-78.18204,39.74893],[-78.18191,39.7485],[-78.1818,39.74802],[-78.18172,39.74758],[-78.18164,39.74707],[-78.1816,39.74659],[-78.18158,39.74609],[-78.18141,39.74302],[-78.18137,39.74182],[-78.18139,39.74064],[-78.18142,39.73998],[-78.18149,39.7392],[-78.18162,39.738],[-78.18215,39.7332],[-78.18232,39.73171],[-78.18275,39.7278],[-78.18286,39.72686],[-78.18293,39.72642],[-78.183,39.7261],[-78.1831,39.72576],[-78.18323,39.72537],[-78.18341,39.72492],[-78.18361,39.72453],[-78.18382,39.72414],[-78.18403,39.7238],[-78.1844,39.72323],[-78.18494,39.72242],[-78.18619,39.72052],[-78.18646,39.72011],[-78.18678,39.71962],[-78.1871,39.71913],[-78.18735,39.71874],[-78.18758,39.71836],[-78.18775,39.71802],[-78.18791,39.71767],[-78.18802,39.71742],[-78.18809,39.71722],[-78.18819,39.71692],[-78.18832,39.71646],[-78.18839,39.71613],[-78.18845,39.7158],[-78.18849,39.71547],[-78.18851,39.7151],[-78.18852,39.71477],[-78.18851,39.71438],[-78.18849,39.71407],[-78.18843,39.71368],[-78.1884,39.71348],[-78.18838,39.71337],[-78.18836,39.71326],[-78.18832,39.71311],[-78.18812,39.71246],[-78.18793,39.71196],[-78.1878,39.71168],[-78.18766,39.7114],[-78.18748,39.71108],[-78.18731,39.7108],[-78.18706,39.71044],[-78.18678,39.71008],[-78.18654,39.70978],[-78.18622,39.70943],[-78.1859,39.70912],[-78.18562,39.70885],[-78.18513,39.70845],[-78.18477,39.70818],[-78.18445,39.70796],[-78.18413,39.70774],[-78.18371,39.7075],[-78.18331,39.70729],[-78.18297,39.70712],[-78.18266,39.70699],[-78.18227,39.70683],[-78.18186,39.70669],[-78.18117,39.70648],[-78.18013,39.70619],[-78.17963,39.70605],[-78.17517,39.70483],[-78.17218,39.704],[-78.17161,39.70385],[-78.17111,39.70372],[-78.1706,39.7036],[-78.17009,39.70349],[-78.16947,39.70336],[-78.1689,39.70325],[-78.16813,39.70312],[-78.16752,39.70304],[-78.16021,39.702],[-78.15971,39.70193],[-78.15926,39.70183],[-78.1588,39.70173],[-78.15836,39.70161],[-78.15789,39.70145],[-78.15747,39.70128],[-78.15703,39.70108],[-78.15666,39.70087],[-78.1563,39.70064],[-78.1559,39.70034],[-78.1556,39.70006],[-78.15535,39.69981],[-78.15512,39.69953],[-78.15479,39.69913],[-78.15405,39.69818],[-78.15373,39.69777],[-78.15333,39.69732],[-78.153,39.69699],[-78.15272,39.69675],[-78.15237,39.69648],[-78.15209,39.6963],[-78.1517,39.69607],[-78.15134,39.69589],[-78.15093,39.6957],[-78.15044,39.69553],[-78.15002,39.69539],[-78.14948,39.69523],[-78.14337,39.69338],[-78.1428,39.69323],[-78.14215,39.69305],[-78.1415,39.6929],[-78.14091,39.69277],[-78.1403,39.69264],[-78.13954,39.6925],[-78.13843,39.69229],[-78.13373,39.6914],[-78.13315,39.69129],[-78.13266,39.69118],[-78.1321,39.69104],[-78.13147,39.69085],[-78.13099,39.69069],[-78.12857,39.68983],[-78.12757,39.68947],[-78.12709,39.68931],[-78.12666,39.68918],[-78.1261,39.68904],[-78.12563,39.68892],[-78.12515,39.68883],[-78.1246,39.68873],[-78.12411,39.68865],[-78.10553,39.68557],[-78.10498,39.68546],[-78.10437,39.68534],[-78.1038,39.6852],[-78.10328,39.68505],[-78.10288,39.68493],[-78.10251,39.68481],[-78.10169,39.68453],[-78.10114,39.68431],[-78.1006,39.68408],[-78.10002,39.6838],[-78.09949,39.68354],[-78.09899,39.68327],[-78.09868,39.68309],[-78.0982,39.68279],[-78.09294,39.67929],[-78.09217,39.6788],[-78.09162,39.67845],[-78.09096,39.67805],[-78.0904,39.67773],[-78.08499,39.67464],[-78.0844,39.67431],[-78.08395,39.67407],[-78.08346,39.67382],[-78.08299,39.6736],[-78.08257,39.67342],[-78.08212,39.67322],[-78.08167,39.67305],[-78.08125,39.67289],[-78.08084,39.67275],[-78.08043,39.67262],[-78.07994,39.67247],[-78.07938,39.6723],[-78.07698,39.67161],[-78.07652,39.67147],[-78.07597,39.67129],[-78.07544,39.67108],[-78.07504,39.67092],[-78.07456,39.6707],[-78.0741,39.67048],[-78.07094,39.66879],[-78.07037,39.66846],[-78.06993,39.66819],[-78.0695,39.66791],[-78.06908,39.66761],[-78.06857,39.66723],[-78.05964,39.66031],[-78.05851,39.65946],[-78.058,39.6591],[-78.0575,39.65877],[-78.05694,39.65841],[-78.05635,39.65805],[-78.05579,39.65773],[-78.05448,39.65696],[-78.05081,39.65481],[-78.05041,39.65458],[-78.04978,39.6542],[-78.04939,39.65396],[-78.04894,39.65365],[-78.04854,39.65334],[-78.04814,39.65301],[-78.04714,39.65214],[-78.04624,39.65135],[-78.04065,39.64646],[-78.04026,39.64613],[-78.03975,39.64575],[-78.0392,39.64536],[-78.03869,39.64502],[-78.03825,39.64475],[-78.03772,39.64443],[-78.03045,39.64017],[-78.03,39.63989],[-78.02955,39.63959],[-78.02902,39.6392],[-78.0285,39.63879],[-78.02804,39.63841],[-78.0276,39.63802],[-78.02721,39.63766],[-78.0268,39.63723],[-78.02266,39.63272],[-78.02226,39.63233],[-78.02185,39.63196],[-78.02148,39.63164],[-78.02098,39.63123],[-78.02037,39.63077],[-78.01935,39.63002],[-78.0145,39.62644],[-78.01396,39.62604],[-78.01364,39.62583],[-78.01313,39.62551],[-78.01271,39.62527],[-78.01217,39.62499],[-78.01173,39.62478],[-78.01124,39.62457],[-78.01079,39.62439],[-78.01037,39.62424],[-78.0099,39.62408],[-78.00934,39.62392],[-78.00886,39.6238],[-78.00839,39.6237],[-78.00792,39.6236],[-78.00737,39.62351],[-78.00694,39.62346],[-78.00644,39.6234],[-78.00581,39.62336],[-78.00525,39.62334],[-78.00459,39.62333],[-78.00401,39.62335],[-78.00345,39.62338],[-78.00289,39.62344],[-78.00234,39.62351],[-78.00178,39.6236],[-78.00122,39.62371],[-77.98536,39.62679],[-77.9848,39.62689],[-77.98411,39.62699],[-77.9834,39.62708],[-77.98269,39.62715],[-77.98199,39.62719],[-77.98142,39.62722],[-77.98071,39.62723],[-77.97474,39.62721],[-77.97402,39.62721],[-77.97345,39.62723],[-77.97274,39.62728],[-77.97204,39.62736],[-77.97147,39.62744],[-77.97091,39.62755],[-77.97023,39.62769],[-77.96956,39.62788],[-77.96891,39.62808],[-77.96826,39.62831],[-77.96776,39.62852],[-77.96727,39.62874],[-77.96679,39.62898],[-77.96633,39.62923],[-77.96576,39.62956],[-77.95536,39.63638],[-77.9546,39.63687],[-77.95373,39.63743],[-77.9524,39.63826],[-77.94331,39.64383],[-77.94272,39.64418],[-77.9421,39.64452],[-77.9415,39.64485],[-77.94096,39.64512],[-77.94021,39.64546],[-77.93963,39.64572],[-77.939,39.64598],[-77.93843,39.6462],[-77.93773,39.64646],[-77.93087,39.64892],[-77.92883,39.64963],[-77.92821,39.64983],[-77.92368,39.65129],[-77.92289,39.65153],[-77.92234,39.65167],[-77.92168,39.65184],[-77.92108,39.65196],[-77.92042,39.65209],[-77.91983,39.65218],[-77.91901,39.65229],[-77.91842,39.65236],[-77.91785,39.6524],[-77.91711,39.65245],[-77.91631,39.65247],[-77.91513,39.65246],[-77.91422,39.65242],[-77.91353,39.65237],[-77.90903,39.65198],[-77.90872,39.65195],[-77.90253,39.65144],[-77.90169,39.65138],[-77.90083,39.65133],[-77.9001,39.65129],[-77.89928,39.65125],[-77.89851,39.65122],[-77.89764,39.65119],[-77.89658,39.65117],[-77.89558,39.65116],[-77.88888,39.6511],[-77.88846,39.65109],[-77.88068,39.65103],[-77.87926,39.65101],[-77.87821,39.65099],[-77.87706,39.65096],[-77.87632,39.65093],[-77.8756,39.65089],[-77.86593,39.65049],[-77.86517,39.65047],[-77.86428,39.65045],[-77.86322,39.65043],[-77.85428,39.65033],[-77.85367,39.65031],[-77.85315,39.65028],[-77.8522,39.6502],[-77.85143,39.65011],[-77.85079,39.65001],[-77.8502,39.64991],[-77.84954,39.64978],[-77.84876,39.6496],[-77.84816,39.64944],[-77.84744,39.64923],[-77.84676,39.649],[-77.84616,39.6488],[-77.84544,39.64851],[-77.84316,39.64757],[-77.84241,39.64727],[-77.84127,39.64683],[-77.84043,39.64654],[-77.83967,39.64628],[-77.83877,39.646],[-77.83795,39.64576],[-77.83702,39.64548],[-77.83646,39.6453],[-77.83588,39.6451],[-77.83523,39.64486],[-77.83457,39.6446],[-77.83401,39.64435],[-77.8336,39.64416],[-77.83303,39.64387],[-77.83251,39.6436],[-77.83198,39.64329],[-77.83165,39.64309],[-77.83123,39.64282],[-77.83088,39.64258],[-77.83005,39.64201],[-77.82911,39.64133],[-77.82735,39.64009],[-77.82667,39.63962],[-77.82614,39.63929],[-77.82563,39.63899],[-77.8251,39.6387],[-77.82463,39.63845],[-77.8241,39.6382],[-77.82352,39.63794],[-77.82295,39.63771],[-77.82094,39.63691],[-77.82021,39.63662],[-77.81969,39.6364],[-77.81904,39.6361],[-77.81852,39.63584],[-77.81797,39.63555],[-77.81739,39.63521],[-77.81672,39.6348],[-77.81608,39.63437],[-77.8155,39.63394],[-77.81477,39.63336],[-77.81427,39.63296],[-77.81358,39.63242],[-77.81311,39.63208],[-77.81262,39.63174],[-77.81208,39.63138],[-77.81153,39.63105],[-77.81098,39.63073],[-77.81047,39.63045],[-77.80995,39.63017],[-77.80934,39.62986],[-77.80877,39.6296],[-77.808,39.62927],[-77.80727,39.62897],[-77.80395,39.62762],[-77.79258,39.62304],[-77.79213,39.62284],[-77.79165,39.62262],[-77.79129,39.62245],[-77.79094,39.62226],[-77.79051,39.62201],[-77.79018,39.6218],[-77.78993,39.62164],[-77.7893,39.62118],[-77.7889,39.62087],[-77.7885,39.62051],[-77.7882,39.62023],[-77.78781,39.61982],[-77.78753,39.61951],[-77.7873,39.61923],[-77.78695,39.61875],[-77.78589,39.61726],[-77.78542,39.6166],[-77.78275,39.6128],[-77.78256,39.61253],[-77.78219,39.61202],[-77.78149,39.61107],[-77.78122,39.61076],[-77.78086,39.61036],[-77.78048,39.60999],[-77.78009,39.60964],[-77.77968,39.60931],[-77.7793,39.60901],[-77.77892,39.60874],[-77.77861,39.60853],[-77.77794,39.60814],[-77.77748,39.60789],[-77.77697,39.60764],[-77.77647,39.60742],[-77.77599,39.60723],[-77.77548,39.60704],[-77.77492,39.60686],[-77.77445,39.60672],[-77.77376,39.60654],[-77.77327,39.60644],[-77.77276,39.60635],[-77.77213,39.60625],[-77.77152,39.60618],[-77.77084,39.60613],[-77.77023,39.60611],[-77.76947,39.60611],[-77.76234,39.60626],[-77.7552,39.60641],[-77.75459,39.60642],[-77.75396,39.60644],[-77.75284,39.60645],[-77.75208,39.60643],[-77.75146,39.6064],[-77.75081,39.60635],[-77.75023,39.6063],[-77.74482,39.60565],[-77.74443,39.60561],[-77.74279,39.60543],[-77.74209,39.60535],[-77.74134,39.60528],[-77.74065,39.60522],[-77.73987,39.60517],[-77.73911,39.60513],[-77.73841,39.60511],[-77.73761,39.60509],[-77.73687,39.60508],[-77.73601,39.60509],[-77.73509,39.60511],[-77.72944,39.6053],[-77.72879,39.60532],[-77.72678,39.60538],[-77.72602,39.60539],[-77.7256,39.60538],[-77.72496,39.60537],[-77.72427,39.60534],[-77.72362,39.6053],[-77.72298,39.60525],[-77.72243,39.6052],[-77.72183,39.60513],[-77.72119,39.60505],[-77.72061,39.60497],[-77.72005,39.60488],[-77.71951,39.60478],[-77.71897,39.60468],[-77.71845,39.60458],[-77.71779,39.60443],[-77.71721,39.60428],[-77.71652,39.6041],[-77.716,39.60395],[-77.71549,39.6038],[-77.71493,39.60363],[-77.71442,39.60345],[-77.71262,39.60281],[-77.71188,39.60255],[-77.70693,39.60081],[-77.70594,39.60047],[-77.70548,39.60031],[-77.70501,39.60016],[-77.70455,39.60003],[-77.70407,39.5999],[-77.70364,39.59979],[-77.70316,39.59968],[-77.70267,39.59957],[-77.70204,39.59945],[-77.70167,39.59939],[-77.70127,39.59933],[-77.70074,39.59926],[-77.70027,39.59921],[-77.69977,39.59916],[-77.69914,39.59911],[-77.69858,39.59909],[-77.69793,39.59907],[-77.69738,39.59906],[-77.69679,39.59908],[-77.69608,39.59911],[-77.68818,39.59956],[-77.68258,39.5999],[-77.68197,39.59993],[-77.6763,39.60026],[-77.67326,39.60044],[-77.67273,39.60047],[-77.67217,39.60048],[-77.67152,39.60048],[-77.67095,39.60047],[-77.67024,39.60044],[-77.66963,39.60039],[-77.66899,39.60033],[-77.66832,39.60025],[-77.66773,39.60017],[-77.66699,39.60003],[-77.66624,39.59988],[-77.6656,39.59973],[-77.66505,39.59959],[-77.66437,39.59939],[-77.66375,39.59919],[-77.66314,39.59897],[-77.66259,39.59876],[-77.66209,39.59856],[-77.66155,39.59832],[-77.661,39.59806],[-77.66048,39.5978],[-77.65991,39.59748],[-77.65946,39.59723],[-77.65588,39.59499],[-77.65549,39.59475],[-77.64621,39.58896],[-77.6457,39.58866],[-77.64514,39.58832],[-77.64463,39.58804],[-77.64399,39.58769],[-77.64346,39.58742],[-77.64278,39.58707],[-77.64239,39.58688],[-77.64149,39.58646],[-77.64089,39.58619],[-77.64017,39.58586],[-77.63964,39.58562],[-77.6367,39.58428],[-77.63615,39.58402],[-77.63562,39.58375],[-77.63497,39.58341],[-77.63436,39.58305],[-77.63388,39.58275],[-77.63338,39.58242],[-77.63279,39.58199],[-77.63228,39.58161],[-77.63185,39.58125],[-77.63138,39.58084],[-77.63089,39.58036],[-77.63043,39.5799],[-77.62922,39.57865],[-77.62888,39.5783],[-77.6268,39.57618],[-77.6261,39.57547],[-77.62556,39.57491],[-77.62513,39.57443],[-77.62472,39.57398],[-77.6242,39.57336],[-77.62365,39.57267],[-77.62316,39.57202],[-77.62249,39.57107],[-77.62205,39.57038],[-77.61759,39.56373],[-77.61738,39.56342],[-77.61474,39.55948],[-77.61114,39.5541],[-77.61087,39.55366],[-77.61057,39.55311],[-77.61037,39.55268],[-77.61021,39.55229],[-77.61005,39.55187],[-77.60992,39.55142],[-77.60983,39.55104],[-77.60974,39.55054],[-77.60959,39.54953],[-77.60943,39.54862],[-77.6093,39.54802],[-77.60917,39.5475],[-77.609,39.54699],[-77.60882,39.54647],[-77.60861,39.54597],[-77.60837,39.54543],[-77.60817,39.54498],[-77.60797,39.54453],[-77.60679,39.54189],[-77.60666,39.54158],[-77.60652,39.54119],[-77.6064,39.54078],[-77.60631,39.54042],[-77.60624,39.54003],[-77.60619,39.53963],[-77.60617,39.53931],[-77.60616,39.53903],[-77.60617,39.53866],[-77.60618,39.53837],[-77.60622,39.53807],[-77.60628,39.53763],[-77.60656,39.53597],[-77.6066,39.53573],[-77.60663,39.5354],[-77.60664,39.53507],[-77.60661,39.53476],[-77.60658,39.53448],[-77.60653,39.53419],[-77.60646,39.53394],[-77.60637,39.53369],[-77.60622,39.53333],[-77.60608,39.53306],[-77.60585,39.5327],[-77.6056,39.53236],[-77.60482,39.53135],[-77.60458,39.53102],[-77.60424,39.53056],[-77.60398,39.53012],[-77.60374,39.52961],[-77.60357,39.5292],[-77.60344,39.5288],[-77.60334,39.52839],[-77.60269,39.52494],[-77.60259,39.52452],[-77.60246,39.52411],[-77.6023,39.52371],[-77.60209,39.52327],[-77.60189,39.52289],[-77.60167,39.52254],[-77.60146,39.52225],[-77.60114,39.52184],[-77.5973,39.51734],[-77.59697,39.51693],[-77.59671,39.51658],[-77.59641,39.51614],[-77.59612,39.5157],[-77.59593,39.51538],[-77.59575,39.51505],[-77.59554,39.51467],[-77.59529,39.51414],[-77.59453,39.5125],[-77.59338,39.51007],[-77.59323,39.50981],[-77.59308,39.50958],[-77.59291,39.50937],[-77.59273,39.50916],[-77.59246,39.50891],[-77.59215,39.50865],[-77.59189,39.50848],[-77.5916,39.5083],[-77.59125,39.50814],[-77.59089,39.50798],[-77.59052,39.50786],[-77.59016,39.50776],[-77.58983,39.50768],[-77.58945,39.50759],[-77.58517,39.50657],[-77.58471,39.50646],[-77.58402,39.50626],[-77.5836,39.50612],[-77.58309,39.50592],[-77.58271,39.50575],[-77.5823,39.50555],[-77.58194,39.50536],[-77.5816,39.50516],[-77.58119,39.5049],[-77.57519,39.50085],[-77.57201,39.49873],[-77.56863,39.49645],[-77.5678,39.49588],[-77.5672,39.49544],[-77.56644,39.49486],[-77.56574,39.49431],[-77.56328,39.49233],[-77.56265,39.49183],[-77.56043,39.49004],[-77.55997,39.48967],[-77.55775,39.4879],[-77.55725,39.48754],[-77.55683,39.48726],[-77.55643,39.48703],[-77.55597,39.48679],[-77.55558,39.48659],[-77.55513,39.48641],[-77.55468,39.48624],[-77.55423,39.4861],[-77.5538,39.48597],[-77.55332,39.48586],[-77.55285,39.48577],[-77.55228,39.48567],[-77.55025,39.48537],[-77.54766,39.48499],[-77.54665,39.48483],[-77.54603,39.4847],[-77.54555,39.48459],[-77.54516,39.48448],[-77.54474,39.48435],[-77.5443,39.48419],[-77.54387,39.48402],[-77.54344,39.48382],[-77.54294,39.48356],[-77.54255,39.48334],[-77.54219,39.48312],[-77.54179,39.48284],[-77.54141,39.48255],[-77.54103,39.48222],[-77.53943,39.48076],[-77.53866,39.48007],[-77.53541,39.47711],[-77.53487,39.4766],[-77.5343,39.47611],[-77.53367,39.47559],[-77.53303,39.47508],[-77.53231,39.47454],[-77.53147,39.47394],[-77.51929,39.46554],[-77.51466,39.46234],[-77.51401,39.46188],[-77.51356,39.46154],[-77.51304,39.46114],[-77.51261,39.4608],[-77.51217,39.46044],[-77.50947,39.45815],[-77.50911,39.45784],[-77.5068,39.45588],[-77.50626,39.45534],[-77.50604,39.45508],[-77.50582,39.45479],[-77.50557,39.45442],[-77.50536,39.45404],[-77.50519,39.45369],[-77.50507,39.45337],[-77.50496,39.45303],[-77.50487,39.45264],[-77.50372,39.44809],[-77.5036,39.44766],[-77.50347,39.44728],[-77.50327,39.44684],[-77.50308,39.4465],[-77.50282,39.44611],[-77.5026,39.44581],[-77.50228,39.44545],[-77.50196,39.44512],[-77.50156,39.44479],[-77.50103,39.44441],[-77.50067,39.44417],[-77.5003,39.44396],[-77.49972,39.44367],[-77.49783,39.44276],[-77.49404,39.44092],[-77.4935,39.44065],[-77.49312,39.44044],[-77.49277,39.44021],[-77.49238,39.43993],[-77.49206,39.43968],[-77.49174,39.43938],[-77.49149,39.43912],[-77.49121,39.43881],[-77.49098,39.4385],[-77.4907,39.43806],[-77.49053,39.43776],[-77.49032,39.43734],[-77.49015,39.43693],[-77.48999,39.43648],[-77.48987,39.43606],[-77.48978,39.43561],[-77.48971,39.43519],[-77.48967,39.43475],[-77.48965,39.43423],[-77.48967,39.43269],[-77.4897,39.4307],[-77.48969,39.43008],[-77.48965,39.42953],[-77.48959,39.42909],[-77.48953,39.42869],[-77.48944,39.42822],[-77.48931,39.42769],[-77.48915,39.42714],[-77.48898,39.42666],[-77.48879,39.42617],[-77.48857,39.42568],[-77.48833,39.42521],[-77.4881,39.4248],[-77.48787,39.4244],[-77.48754,39.4239],[-77.48721,39.42345],[-77.48678,39.4229],[-77.48637,39.42243],[-77.48606,39.42211],[-77.48557,39.42163],[-77.48527,39.42135],[-77.48498,39.42109],[-77.48456,39.42074],[-77.48413,39.42041],[-77.48365,39.42006],[-77.48318,39.41976],[-77.48271,39.41946],[-77.4816,39.41881],[-77.4808,39.41835],[-77.48022,39.41801],[-77.47973,39.41771],[-77.47924,39.4174],[-77.47869,39.41703],[-77.47808,39.41658],[-77.47761,39.4162],[-77.47713,39.41579],[-77.47668,39.41538],[-77.47625,39.41496],[-77.4758,39.41449],[-77.47534,39.41396],[-77.47481,39.41329],[-77.47447,39.41281],[-77.47413,39.4123],[-77.47312,39.4107],[-77.47274,39.41014],[-77.47238,39.40967],[-77.47202,39.40923],[-77.47168,39.40885],[-77.47132,39.40847],[-77.47092,39.40808],[-77.47047,39.40769],[-77.47001,39.40732],[-77.46964,39.40704],[-77.46914,39.40669],[-77.46866,39.40638],[-77.46818,39.40609],[-77.4677,39.40582],[-77.46725,39.40559],[-77.46674,39.40534],[-77.46625,39.40512],[-77.46573,39.40491],[-77.46523,39.40473],[-77.46464,39.40453],[-77.46405,39.40435],[-77.46344,39.40419],[-77.46284,39.40404],[-77.46236,39.40395],[-77.46173,39.40383],[-77.46111,39.40375],[-77.46047,39.40367],[-77.45715,39.4033],[-77.45492,39.40306],[-77.45145,39.40268],[-77.45085,39.40261],[-77.45025,39.40253],[-77.44961,39.40242],[-77.4489,39.40228],[-77.44815,39.40211],[-77.44744,39.40193],[-77.44661,39.40167],[-77.44622,39.40156],[-77.44559,39.40134],[-77.4447,39.40099],[-77.44412,39.40075],[-77.44237,39.39995],[-77.44206,39.3998],[-77.44126,39.39944],[-77.44108,39.39937],[-77.44036,39.39909],[-77.4399,39.39894],[-77.43942,39.39879],[-77.43891,39.39864],[-77.4384,39.39851],[-77.43787,39.39839],[-77.43744,39.39831],[-77.43701,39.39823],[-77.4365,39.39815],[-77.43599,39.39809],[-77.4354,39.39803],[-77.43474,39.39798],[-77.43349,39.39793],[-77.42893,39.39793],[-77.42796,39.39786],[-77.42751,39.39784],[-77.42702,39.39781],[-77.4266,39.39777],[-77.42619,39.3977],[-77.42584,39.39763],[-77.42547,39.39754],[-77.42511,39.39743],[-77.42476,39.3973],[-77.42427,39.39709],[-77.42394,39.39693],[-77.4236,39.39673],[-77.42327,39.39652],[-77.42298,39.3963],[-77.42267,39.39604],[-77.42236,39.39576],[-77.4212,39.39457],[-77.41336,39.38585],[-77.41196,39.38429],[-77.4105,39.38266],[-77.40985,39.38193],[-77.40945,39.3815],[-77.40862,39.38047],[-77.40823,39.38004],[-77.40763,39.37919],[-77.40727,39.3786],[-77.40693,39.37806],[-77.40606,39.37625],[-77.40572,39.3754],[-77.40506,39.37376],[-77.40426,39.3721],[-77.40407,39.37176],[-77.40313,39.3701],[-77.40251,39.36905],[-77.40231,39.36871],[-77.40138,39.3671],[-77.40039,39.36531],[-77.39965,39.36402],[-77.39819,39.36143],[-77.39551,39.35672],[-77.3945,39.35498],[-77.39406,39.35406],[-77.39376,39.35316],[-77.39372,39.353],[-77.3935,39.35234],[-77.39321,39.35161],[-77.3924,39.35018],[-77.39151,39.34899],[-77.38382,39.34015],[-77.38284,39.33914],[-77.38136,39.33795],[-77.37873,39.33608],[-77.37703,39.33484],[-77.37572,39.33373],[-77.3745,39.33255],[-77.37165,39.32938],[-77.37065,39.32847],[-77.3692,39.32742],[-77.36826,39.32686],[-77.36721,39.32631],[-77.36633,39.32593],[-77.36547,39.3256],[-77.36426,39.32523],[-77.36335,39.325],[-77.35839,39.32394],[-77.35758,39.32371],[-77.35681,39.32336],[-77.35658,39.32324],[-77.35604,39.32295],[-77.35533,39.32242],[-77.35482,39.32192],[-77.35427,39.32118],[-77.35367,39.31982],[-77.35105,39.31309],[-77.35069,39.31246],[-77.35018,39.31167],[-77.34967,39.31108],[-77.34899,39.31043],[-77.34768,39.30951],[-77.34412,39.30705],[-77.34183,39.30554],[-77.34107,39.30498],[-77.34042,39.30441],[-77.33989,39.3037],[-77.33956,39.30297],[-77.33926,39.30197],[-77.3391,39.30125],[-77.3388,39.30052],[-77.33851,39.29987],[-77.33796,39.29909],[-77.33707,39.29813],[-77.33577,39.29707],[-77.33461,39.29621],[-77.33414,39.29579],[-77.33399,39.29564],[-77.33373,39.29534],[-77.33343,39.29494],[-77.33327,39.29469],[-77.33299,39.29418],[-77.3328,39.29365],[-77.3326,39.29293],[-77.33247,39.29222],[-77.33222,39.29095],[-77.33197,39.29024],[-77.33175,39.2898],[-77.33153,39.2894],[-77.33113,39.28881],[-77.33062,39.28824],[-77.33003,39.28765],[-77.32866,39.28631],[-77.32759,39.28512],[-77.32709,39.28444],[-77.32612,39.2829],[-77.32571,39.28219],[-77.32529,39.28133],[-77.32494,39.28046],[-77.32446,39.27931],[-77.32416,39.27866],[-77.32379,39.27799],[-77.3235,39.27759],[-77.32331,39.27738],[-77.32275,39.2767],[-77.32201,39.276],[-77.32093,39.27507],[-77.3198,39.27413],[-77.31805,39.27312],[-77.31703,39.27259],[-77.31616,39.27205],[-77.3154,39.27138],[-77.31492,39.27083],[-77.31456,39.27019],[-77.31425,39.26946],[-77.31408,39.2687],[-77.31374,39.26722],[-77.31342,39.26637],[-77.31296,39.26551],[-77.31284,39.26535],[-77.31243,39.26478],[-77.31089,39.26284],[-77.3095,39.26105],[-77.30812,39.25926],[-77.30755,39.25851],[-77.30586,39.2567],[-77.30394,39.25476],[-77.30306,39.25379],[-77.30191,39.25218],[-77.30033,39.2495],[-77.2991,39.24763],[-77.29738,39.24571],[-77.29504,39.24322],[-77.29223,39.24016],[-77.29063,39.23842],[-77.28959,39.23728],[-77.28751,39.23483],[-77.2871,39.23439],[-77.28641,39.23363],[-77.2858,39.23294],[-77.28517,39.23196],[-77.28453,39.23095],[-77.2823,39.22697],[-77.28219,39.22673],[-77.28045,39.22304],[-77.27866,39.21875],[-77.27779,39.21622],[-77.27729,39.21443],[-77.27722,39.21413],[-77.27671,39.21237],[-77.27652,39.21184],[-77.2764,39.21152],[-77.2763,39.21127],[-77.27609,39.21081],[-77.27579,39.21019],[-77.27546,39.20958],[-77.27514,39.20907],[-77.27432,39.20797],[-77.2737,39.20712],[-77.27219,39.20551],[-77.26884,39.20278],[-77.26776,39.20183],[-77.26668,39.20086],[-77.26572,39.19997],[-77.2639,39.19819],[-77.26362,39.19785],[-77.26153,39.19525],[-77.26073,39.19368],[-77.25997,39.1922],[-77.25936,39.19073],[-77.25884,39.18963],[-77.25846,39.1889],[-77.25816,39.18838],[-77.25779,39.18782],[-77.25743,39.18731],[-77.25705,39.18683],[-77.25673,39.18646],[-77.25616,39.18583],[-77.2544,39.18394],[-77.25169,39.18101],[-77.24975,39.17868],[-77.24875,39.17745],[-77.24722,39.17538],[-77.24697,39.17503],[-77.24597,39.17357],[-77.24482,39.17186],[-77.24432,39.17106],[-77.24394,39.17042],[-77.24252,39.16815],[-77.24154,39.16678],[-77.24085,39.16605],[-77.24012,39.16534],[-77.23931,39.16462],[-77.23845,39.16398],[-77.23748,39.16334],[-77.23657,39.16279],[-77.23558,39.16227],[-77.23464,39.16181],[-77.2329,39.16097],[-77.23258,39.16082],[-77.23219,39.16062],[-77.2318,39.16042],[-77.23118,39.16009],[-77.23049,39.15968],[-77.22979,39.15928],[-77.22858,39.15852],[-77.22767,39.15789],[-77.22665,39.15715],[-77.22459,39.15556],[-77.22312,39.15441],[-77.22184,39.15341],[-77.22059,39.15237],[-77.21935,39.15125],[-77.21869,39.1506],[-77.21806,39.1499],[-77.21737,39.14917],[-77.21718,39.14896],[-77.21712,39.14889],[-77.21682,39.1485],[-77.2168,39.14847],[-77.21653,39.1481],[-77.21614,39.14755],[-77.21558,39.14672],[-77.2152,39.14614],[-77.21426,39.1442],[-77.21333,39.1418],[-77.2129,39.14079],[-77.21265,39.1402],[-77.21246,39.13974],[-77.2115,39.13786],[-77.21078,39.13667],[-77.21072,39.13657],[-77.21037,39.136],[-77.20949,39.13476],[-77.20802,39.13284],[-77.20496,39.12957],[-77.20342,39.12804],[-77.20273,39.12718],[-77.20146,39.12553],[-77.20014,39.12367],[-77.19879,39.1218],[-77.19852,39.12142],[-77.19824,39.12105],[-77.19808,39.12084],[-77.1973,39.11993],[-77.19567,39.11809],[-77.19266,39.11524],[-77.19102,39.1137],[-77.18848,39.11133],[-77.18441,39.10751],[-77.18348,39.10661],[-77.18229,39.10524],[-77.18125,39.10391],[-77.18029,39.10247],[-77.17942,39.10092],[-77.17868,39.09928],[-77.17772,39.09703],[-77.17642,39.09399],[-77.1758,39.09249],[-77.17489,39.08999],[-77.17439,39.08854],[-77.17332,39.08537],[-77.17252,39.08313],[-77.17174,39.08156],[-77.17098,39.08042],[-77.17022,39.07934],[-77.16869,39.0774],[-77.16754,39.0762],[-77.16622,39.07503],[-77.16286,39.0724],[-77.16116,39.07099],[-77.15994,39.06979],[-77.15883,39.06842],[-77.1581,39.06728],[-77.15784,39.0668],[-77.15721,39.06543],[-77.15623,39.06232],[-77.15577,39.06072],[-77.15481,39.05735],[-77.15421,39.05556],[-77.15352,39.05364],[-77.15277,39.05185],[-77.15069,39.04729],[-77.14792,39.04195],[-77.14585,39.03801],[-77.14571,39.03774],[-77.14481,39.03602],[-77.1446,39.03561],[-77.14429,39.03518],[-77.14391,39.03459],[-77.14363,39.03424],[-77.14325,39.03385],[-77.14292,39.0336],[-77.14261,39.03341],[-77.1422,39.03317],[-77.14177,39.03298],[-77.14124,39.0328],[-77.14061,39.03265],[-77.14003,39.03256],[-77.13929,39.03249],[-77.13593,39.03218],[-77.13506,39.03208],[-77.13414,39.03196],[-77.13322,39.03181],[-77.13218,39.03162],[-77.12669,39.0306],[-77.12235,39.02986],[-77.11684,39.02907],[-77.11574,39.02886],[-77.11477,39.02861],[-77.11392,39.02834],[-77.11308,39.02798],[-77.1123,39.02762],[-77.11141,39.02714],[-77.11041,39.02648],[-77.10959,39.02583],[-77.10946,39.0257],[-77.10877,39.02504],[-77.10793,39.02409],[-77.10696,39.02292],[-77.10656,39.02241],[-77.10643,39.02224],[-77.10627,39.02194],[-77.106,39.02137],[-77.10585,39.02092],[-77.1057,39.02047],[-77.10558,39.02018],[-77.10546,39.01993],[-77.1053,39.01963],[-77.10509,39.01933],[-77.10492,39.01911],[-77.1047,39.01889],[-77.10443,39.01864],[-77.10416,39.01842],[-77.10388,39.01823],[-77.1032,39.01779],[-77.10269,39.0175],[-77.10227,39.01729],[-77.10171,39.01704],[-77.10126,39.01687],[-77.10073,39.01671],[-77.09976,39.01648],[-77.09863,39.01615],[-77.09786,39.01595],[-77.09745,39.01583],[-77.09711,39.01571],[-77.09677,39.01559],[-77.09641,39.01543],[-77.09605,39.01523],[-77.09579,39.01507],[-77.09551,39.01486],[-77.09527,39.01466],[-77.09506,39.01446],[-77.09483,39.01421],[-77.09464,39.01395],[-77.09442,39.01362],[-77.09394,39.01286],[-77.09375,39.01258],[-77.09353,39.01233],[-77.09328,39.01209],[-77.09302,39.01189],[-77.09269,39.0117],[-77.0923,39.01152],[-77.09196,39.01139],[-77.09144,39.01122],[-77.0911,39.0111],[-77.09062,39.01093],[-77.09025,39.01078],[-77.08999,39.01065],[-77.08977,39.01052],[-77.08951,39.01035],[-77.08928,39.01016],[-77.08909,39.00998],[-77.08888,39.00975],[-77.08866,39.00947],[-77.08813,39.00869],[-77.08792,39.00842],[-77.08772,39.00819],[-77.08746,39.00794],[-77.08721,39.00774],[-77.08694,39.00756],[-77.08657,39.00735],[-77.08396,39.00591],[-77.08356,39.0057],[-77.08318,39.00552],[-77.08288,39.00539],[-77.08248,39.00525],[-77.0822,39.00517],[-77.08185,39.00509],[-77.08146,39.00503],[-77.08105,39.00499],[-77.08081,39.00497],[-77.08061,39.00495],[-77.08041,39.00492],[-77.08021,39.00489],[-77.07995,39.00481],[-77.07974,39.00474],[-77.07955,39.00466],[-77.07932,39.00454],[-77.07887,39.00421],[-77.07864,39.00409],[-77.07849,39.00402],[-77.07832,39.00397],[-77.07787,39.00383],[-77.07779,39.0038],[-77.07774,39.00377],[-77.07769,39.00374],[-77.07762,39.00365],[-77.0775,39.00337],[-77.0774,39.00281],[-77.07733,39.0024],[-77.07723,39.00175],[-77.0772,39.00158],[-77.07706,39.00081],[-77.07699,39.00023],[-77.07697,38.99984],[-77.07699,38.99971],[-77.07703,38.99931],[-77.07723,38.99748],[-77.07724,38.99613],[-77.07724,38.99594],[-77.07724,38.99567],[-77.07724,38.99544],[-77.07724,38.99488],[-77.07725,38.99467],[-77.07724,38.99424],[-77.07724,38.99399],[-77.07724,38.9939],[-77.07724,38.99351],[-77.07724,38.99272],[-77.07724,38.99244],[-77.07724,38.99217],[-77.07724,38.99172],[-77.07724,38.99154],[-77.07722,38.99089],[-77.07721,38.99044],[-77.0772,38.98994],[-77.07721,38.9897],[-77.07722,38.9891],[-77.07722,38.989],[-77.07723,38.98834],[-77.07722,38.9879],[-77.07722,38.98707],[-77.07723,38.98628],[-77.07723,38.98547],[-77.07723,38.98458],[-77.07723,38.98424],[-77.07723,38.98421],[-77.07723,38.98378],[-77.07723,38.983],[-77.07723,38.9822],[-77.07722,38.98117],[-77.07722,38.98098],[-77.07722,38.98081],[-77.07722,38.97977],[-77.07722,38.97795],[-77.07722,38.97785],[-77.07723,38.9767],[-77.07723,38.97617],[-77.07723,38.97573],[-77.07722,38.97483],[-77.07722,38.97386],[-77.07722,38.97367],[-77.07722,38.97257],[-77.07722,38.97203],[-77.07722,38.97203],[-77.07723,38.97119],[-77.07722,38.97025],[-77.07722,38.97025],[-77.07722,38.96937],[-77.07722,38.96936],[-77.07722,38.96875],[-77.07722,38.9684],[-77.07723,38.96833],[-77.07724,38.96827],[-77.07726,38.9682],[-77.0773,38.96813],[-77.07735,38.96805],[-77.07738,38.968],[-77.07745,38.96796],[-77.07754,38.9679],[-77.07758,38.96786],[-77.07763,38.96779],[-77.07765,38.96774],[-77.07766,38.96768],[-77.07767,38.9676],[-77.07765,38.96752],[-77.07763,38.96748],[-77.0776,38.96743],[-77.07757,38.9674],[-77.07753,38.96735],[-77.07748,38.96732],[-77.07741,38.96728],[-77.07738,38.96726],[-77.07735,38.96725],[-77.07732,38.96724],[-77.0773,38.96724],[-77.07721,38.96722],[-77.07717,38.96722],[-77.077,38.9671],[-77.07694,38.96707],[-77.07689,38.96703],[-77.07686,38.967],[-77.07684,38.96698],[-77.07674,38.96681],[-77.07672,38.96678],[-77.0767,38.96676],[-77.07662,38.96671],[-77.0765,38.9665],[-77.07628,38.96612],[-77.07614,38.96587],[-77.07609,38.96579],[-77.07605,38.96573],[-77.07586,38.9654],[-77.07557,38.9649],[-77.07528,38.96439],[-77.07513,38.96415],[-77.07505,38.964],[-77.07469,38.96338],[-77.07452,38.96309],[-77.07393,38.96208],[-77.07331,38.96102],[-77.0729,38.96032],[-77.07254,38.95969],[-77.07215,38.95903],[-77.07177,38.95836],[-77.07141,38.95774],[-77.07111,38.95722],[-77.07098,38.957],[-77.07041,38.95603],[-77.0702,38.95567],[-77.07016,38.9556],[-77.07007,38.95544],[-77.06974,38.95488],[-77.06964,38.95469],[-77.06943,38.95434],[-77.06924,38.95402],[-77.06914,38.95385],[-77.06904,38.95368],[-77.06887,38.95338],[-77.06883,38.95331],[-77.06877,38.95322],[-77.06875,38.95318],[-77.06818,38.9522],[-77.06812,38.9521],[-77.06792,38.95175],[-77.06773,38.95142],[-77.06733,38.95073],[-77.06675,38.94975],[-77.06671,38.94968],[-77.06668,38.94962],[-77.06625,38.94889],[-77.06622,38.94883],[-77.06618,38.94877],[-77.06607,38.94857],[-77.06574,38.948],[-77.06568,38.9479],[-77.06563,38.94781],[-77.06536,38.94734],[-77.06513,38.94695],[-77.06505,38.94681],[-77.06501,38.94674],[-77.06497,38.94668],[-77.06437,38.94563],[-77.06428,38.94548],[-77.06377,38.94462],[-77.06361,38.94434],[-77.06356,38.94425],[-77.06352,38.94419],[-77.06298,38.94326],[-77.06292,38.94315],[-77.06287,38.94307],[-77.06226,38.94202],[-77.06172,38.94108],[-77.06168,38.94101],[-77.06161,38.94089],[-77.06157,38.94083],[-77.06152,38.94074],[-77.06118,38.94017],[-77.06073,38.93939],[-77.06063,38.93922],[-77.06056,38.9391],[-77.06036,38.93875],[-77.06023,38.93851],[-77.06009,38.93827],[-77.06006,38.93823],[-77.06002,38.93816],[-77.06,38.93813],[-77.05979,38.93776],[-77.0595,38.93726],[-77.0594,38.93709],[-77.05933,38.93697],[-77.0593,38.93693],[-77.05923,38.9368],[-77.05885,38.93615],[-77.05859,38.9357],[-77.05856,38.93565],[-77.05851,38.93557],[-77.05837,38.93533],[-77.05813,38.93491],[-77.05796,38.93461],[-77.05774,38.93424],[-77.05765,38.93408],[-77.05731,38.93351],[-77.05724,38.93338],[-77.05705,38.93306],[-77.05634,38.93184],[-77.05626,38.9317],[-77.05618,38.93157],[-77.05559,38.93054],[-77.05555,38.93047],[-77.05528,38.92997],[-77.05527,38.92995],[-77.0552,38.92984],[-77.05508,38.92967],[-77.05472,38.92904],[-77.05433,38.92837],[-77.05416,38.92809],[-77.05381,38.92748],[-77.05328,38.92657],[-77.05268,38.92554],[-77.05236,38.92493],[-77.05226,38.92476],[-77.05222,38.9247],[-77.05159,38.92366],[-77.05151,38.92353],[-77.05145,38.92341],[-77.05116,38.92291],[-77.04914,38.91946],[-77.04906,38.91932],[-77.04894,38.91911],[-77.04887,38.91899],[-77.04883,38.91894],[-77.0488,38.9189],[-77.04876,38.91888],[-77.04871,38.91886],[-77.04865,38.91883],[-77.04856,38.9188],[-77.04831,38.91873],[-77.04795,38.91862],[-77.04784,38.91859],[-77.04779,38.91857],[-77.04774,38.91855],[-77.04771,38.91853],[-77.04769,38.91852],[-77.04765,38.91849],[-77.04763,38.91847],[-77.0476,38.91843],[-77.04757,38.91839],[-77.04752,38.91831],[-77.04744,38.91814],[-77.04724,38.91774],[-77.04719,38.91765],[-77.0469,38.91708],[-77.04677,38.91684],[-77.04674,38.91677],[-77.04671,38.91664],[-77.04658,38.9164],[-77.04654,38.91629],[-77.04649,38.91617],[-77.04645,38.91602],[-77.04643,38.91591],[-77.04642,38.91586],[-77.04639,38.91564],[-77.04632,38.91485],[-77.04631,38.91476],[-77.04629,38.91461],[-77.04626,38.91449],[-77.04622,38.91434],[-77.04616,38.9142],[-77.04611,38.91409],[-77.04606,38.91397],[-77.04589,38.91368],[-77.04559,38.91316],[-77.04532,38.91268],[-77.04529,38.91263],[-77.04528,38.91261],[-77.04523,38.91254],[-77.04516,38.91243],[-77.04507,38.91218],[-77.04489,38.91186],[-77.04447,38.91113],[-77.04399,38.91032],[-77.04394,38.91023],[-77.04394,38.91018],[-77.04395,38.91014],[-77.04398,38.9101],[-77.04401,38.91008],[-77.04404,38.91005],[-77.04407,38.91003],[-77.04409,38.91],[-77.04412,38.90997],[-77.04413,38.90995],[-77.04415,38.90992],[-77.04416,38.9099],[-77.04418,38.90987],[-77.04419,38.90985],[-77.0442,38.90982],[-77.04421,38.9098],[-77.04422,38.90976],[-77.04423,38.90972],[-77.04423,38.90969],[-77.04424,38.90965],[-77.04423,38.90961],[-77.04423,38.90957],[-77.04422,38.90953],[-77.04421,38.9095],[-77.0442,38.90946],[-77.04418,38.90942],[-77.04416,38.90938],[-77.04414,38.90935],[-77.04411,38.90931],[-77.04408,38.90928],[-77.04405,38.90925],[-77.04402,38.90922],[-77.04398,38.90919],[-77.04394,38.90916],[-77.04392,38.90915],[-77.04389,38.90913],[-77.04385,38.90911],[-77.0438,38.90909],[-77.04376,38.90908],[-77.0437,38.90906],[-77.04365,38.90905],[-77.04359,38.90904],[-77.04354,38.90903],[-77.04348,38.90903],[-77.04343,38.90903],[-77.04338,38.90903],[-77.04332,38.90903],[-77.04327,38.90904],[-77.04322,38.90905],[-77.04317,38.90906],[-77.04312,38.90908],[-77.04311,38.90908],[-77.04307,38.9091],[-77.04303,38.90912],[-77.04298,38.90914],[-77.04294,38.90917],[-77.04291,38.90919],[-77.04288,38.90921],[-77.04285,38.90923],[-77.04282,38.90926],[-77.0428,38.90928],[-77.04278,38.9093],[-77.04277,38.90931],[-77.04275,38.90934],[-77.04272,38.90939],[-77.0427,38.90942],[-77.04268,38.90946],[-77.04267,38.9095],[-77.04261,38.90956],[-77.04257,38.90959],[-77.04252,38.90961],[-77.04247,38.90963],[-77.04238,38.90965],[-77.04177,38.90965],[-77.04168,38.90965],[-77.04159,38.90965],[-77.04024,38.90965],[-77.03956,38.90965],[-77.03861,38.90965],[-77.03853,38.90965],[-77.0385,38.90965],[-77.03838,38.90965],[-77.03727,38.90965],[-77.03721,38.90966],[-77.03665,38.90966],[-77.03652,38.90966],[-77.03641,38.90966],[-77.03549,38.90966],[-77.03465,38.90966],[-77.03456,38.90966],[-77.034,38.90966],[-77.03262,38.90966],[-77.03212,38.90967],[-77.03203,38.90967],[-77.03195,38.90967],[-77.03187,38.90967],[-77.03181,38.90967],[-77.03137,38.90967],[-77.0309,38.90967],[-77.0305,38.90967],[-77.03033,38.90961],[-77.03032,38.90957],[-77.03032,38.90954],[-77.0303,38.90948],[-77.03029,38.90945],[-77.03027,38.90942],[-77.03025,38.90939],[-77.03024,38.90938],[-77.03023,38.90936],[-77.03021,38.90934],[-77.03019,38.90931],[-77.03016,38.90928],[-77.03006,38.90921],[-77.03001,38.90918],[-77.02999,38.90917],[-77.02994,38.90915],[-77.02987,38.90913],[-77.0298,38.90911],[-77.02971,38.9091],[-77.02963,38.90909],[-77.0296,38.90909],[-77.02954,38.90909],[-77.02949,38.9091],[-77.02944,38.90911],[-77.02939,38.90912],[-77.02932,38.90914],[-77.02925,38.90917],[-77.02921,38.90919],[-77.02916,38.90922],[-77.02913,38.90924],[-77.0291,38.90927],[-77.02906,38.9093],[-77.02903,38.90933],[-77.029,38.90937],[-77.02898,38.9094],[-77.02894,38.90947],[-77.02893,38.90951],[-77.02891,38.90958],[-77.02891,38.90961],[-77.0289,38.90971],[-77.02892,38.90975],[-77.02892,38.90977],[-77.02893,38.9098],[-77.02896,38.90985],[-77.02897,38.90987],[-77.02901,38.90992],[-77.02903,38.90996],[-77.02904,38.91],[-77.02917,38.9101],[-77.02937,38.91016],[-77.02943,38.91018],[-77.0295,38.91019],[-77.02957,38.9102],[-77.02962,38.9102],[-77.02963,38.9102],[-77.02969,38.9102],[-77.02976,38.91019],[-77.02981,38.91018],[-77.02986,38.91016],[-77.02991,38.91015],[-77.02995,38.91013],[-77.02998,38.91012],[-77.03003,38.91009],[-77.03007,38.91007]]},"summary":"I 80, I 80;US 30"},{"distance":4769450,"duration":178318,"steps":[{"distance":418,"duration":52,"way_name":"McAllister Street","mode":"driving","driving_side":"right","direction":"E","heading":80,"maneuver":{"instruction":"Proceed to McAllister Street, then go right","type":"depart","location":{"type":"Point","coordinates":[-122.420018,37.78009]}}},{"distance":232,"duration":20,"way_name":"Hyde Street","mode":"driving","driving_side":"right","direction":"S","heading":171,"maneuver":{"instruction":"Turn right onto Hyde Street","type":"turn right","location":{"type":"Point","coordinates":[-122.415339,37.780726]}}},{"distance":971,"duration":96,"way_name":"8th Street","mode":"driving","driving_side":"right","direction":"SE","heading":135,"maneuver":{"instruction":"Go straight onto 8th Street, Hyde Street becomes 8th Street","type":"continue","location":{"type":"Point","coordinates":[-122.414763,37.77872]}}},{"distance":38,"duration":8,"way_name":"Bryant Street","mode":"driving","driving_side":"right","direction":"NE","heading":45,"maneuver":{"instruction":"Turn left onto Bryant Street","type":"turn left","location":{"type":"Point","coordinates":[-122.406967,37.77254]}}},{"distance":469,"duration":36,"way_name":"","mode":"driving","driving_side":"right","direction":"N","heading":3,"maneuver":{"instruction":"Take the ramp on the left","type":"turn left","location":{"type":"Point","coordinates":[-122.406665,37.77278]}}},{"distance":1525,"duration":73,"way_name":"James Lick Freeway (I 80)","mode":"driving","driving_side":"right","direction":"NE","heading":50,"maneuver":{"instruction":"Merge slightly left onto James Lick Freeway (I 80)","type":"continue","location":{"type":"Point","coordinates":[-122.404336,37.77638]}}},{"distance":9216,"duration":441,"way_name":"San Francisco – Oakland Bay Bridge (I 80)","mode":"driving","driving_side":"right","direction":"NE","heading":45,"maneuver":{"instruction":"Go straight onto San Francisco – Oakland Bay Bridge (I 80), James Lick Freeway (I 80) becomes San Francisco – Oakland Bay Bridge (I 80)","type":"continue","location":{"type":"Point","coordinates":[-122.391499,37.785488]}}},{"distance":1510,"duration":66,"way_name":"","mode":"driving","driving_side":"right","direction":"E","heading":78,"maneuver":{"instruction":"Take the ramp","type":"bear right","location":{"type":"Point","coordinates":[-122.305644,37.824963]}}},{"distance":25748,"duration":979,"way_name":"MacArthur Freeway (I 580)","mode":"driving","driving_side":"right","direction":"E","heading":94,"maneuver":{"instruction":"Go straight onto MacArthur Freeway (I 580), street becomes MacArthur Freeway (I 580)","type":"continue","location":{"type":"Point","coordinates":[-122.289247,37.826344]}}},{"distance":47212,"duration":1795,"way_name":"Arthur H. Breed, Jr. Freeway (I 580)","mode":"driving","driving_side":"right","direction":"E","heading":91,"maneuver":{"instruction":"Go straight onto Arthur H. Breed, Jr. Freeway (I 580), MacArthur Freeway (I 580) becomes Arthur H. Breed, Jr. Freeway (I 580)","type":"continue","location":{"type":"Point","coordinates":[-122.089438,37.690439]}}},{"distance":17852,"duration":638,"way_name":"William Elton \"Brownie\" Brown Freeway (I 580)","mode":"driving","driving_side":"right","direction":"E","heading":95,"maneuver":{"instruction":"Keep right at the fork onto William Elton \"Brownie\" Brown Freeway (I 580)","type":"bear right","location":{"type":"Point","coordinates":[-121.574044,37.741737]}}},{"distance":9471,"duration":342,"way_name":"William Elton \"Brownie\" Brown Freeway (I 580)","mode":"driving","driving_side":"right","direction":"SE","heading":127,"maneuver":{"instruction":"Keep left at the fork onto William Elton \"Brownie\" Brown Freeway (I 580)","type":"bear left","location":{"type":"Point","coordinates":[-121.414439,37.646096]}}},{"distance":310115,"duration":11040,"way_name":"West Side Freeway (I 5)","mode":"driving","driving_side":"right","direction":"SE","heading":134,"maneuver":{"instruction":"Merge slightly left onto West Side Freeway (I 5)","type":"continue","location":{"type":"Point","coordinates":[-121.333309,37.590453]}}},{"distance":362,"duration":52,"way_name":"","mode":"driving","driving_side":"right","direction":"SE","heading":139,"maneuver":{"instruction":"Take the ramp","type":"bear right","location":{"type":"Point","coordinates":[-119.340027,35.357634]}}},{"distance":14811,"duration":668,"way_name":"Stockdale Highway","mode":"driving","driving_side":"right","direction":"E","heading":88,"maneuver":{"instruction":"Turn left onto Stockdale Highway","type":"turn left","location":{"type":"Point","coordinates":[-119.338099,35.354937]}}},{"distance":7429,"duration":301,"way_name":"Westside Parkway","mode":"driving","driving_side":"right","direction":"NE","heading":65,"maneuver":{"instruction":"Go straight onto Westside Parkway, Stockdale Highway becomes Westside Parkway","type":"continue","location":{"type":"Point","coordinates":[-119.175008,35.355288]}}},{"distance":352,"duration":44,"way_name":"","mode":"driving","driving_side":"right","direction":"NE","heading":53,"maneuver":{"instruction":"Take the ramp","type":"bear right","location":{"type":"Point","coordinates":[-119.095241,35.36356]}}},{"distance":1202,"duration":106,"way_name":"Coffee Road","mode":"driving","driving_side":"right","direction":"S","heading":176,"maneuver":{"instruction":"Turn right onto Coffee Road","type":"turn right","location":{"type":"Point","coordinates":[-119.091979,35.365068]}}},{"distance":4442,"duration":296,"way_name":"Stockdale Highway","mode":"driving","driving_side":"right","direction":"E","heading":90,"maneuver":{"instruction":"Turn left onto Stockdale Highway","type":"turn left","location":{"type":"Point","coordinates":[-119.092373,35.354298]}}},{"distance":158,"duration":37,"way_name":"South Real Road","mode":"driving","driving_side":"right","direction":"SW","heading":203,"maneuver":{"instruction":"Turn right onto South Real Road","type":"turn right","location":{"type":"Point","coordinates":[-119.043412,35.354092]}}},{"distance":120,"duration":5,"way_name":"SR 58","mode":"driving","driving_side":"right","direction":"E","heading":91,"maneuver":{"instruction":"Take the ramp on the left","type":"turn left","location":{"type":"Point","coordinates":[-119.043403,35.352693]}}},{"distance":185,"duration":7,"way_name":"SR 58","mode":"driving","driving_side":"right","direction":"E","heading":97,"maneuver":{"instruction":"Keep left at the fork onto SR 58","type":"bear left","location":{"type":"Point","coordinates":[-119.042082,35.352662]}}},{"distance":932,"duration":35,"way_name":"Barstow-Bakersfield Highway (SR 58)","mode":"driving","driving_side":"right","direction":"E","heading":90,"maneuver":{"instruction":"Go straight onto Barstow-Bakersfield Highway (SR 58), SR 58 becomes Barstow-Bakersfield Highway (SR 58)","type":"continue","location":{"type":"Point","coordinates":[-119.040055,35.352558]}}},{"distance":200721,"duration":7734,"way_name":"Barstow-Bakersfield Highway (CA 58)","mode":"driving","driving_side":"right","direction":"E","heading":90,"maneuver":{"instruction":"Go straight onto Barstow-Bakersfield Highway (CA 58), Barstow-Bakersfield Highway (SR 58) becomes Barstow-Bakersfield Highway (CA 58)","type":"continue","location":{"type":"Point","coordinates":[-119.029784,35.352467]}}},{"distance":2064,"duration":158,"way_name":"","mode":"driving","driving_side":"right","direction":"SE","heading":139,"maneuver":{"instruction":"Keep left at the fork","type":"bear left","location":{"type":"Point","coordinates":[-117.080482,34.87434]}}},{"distance":5219,"duration":186,"way_name":"Barstow Freeway; Mojave Freeway (I 15)","mode":"driving","driving_side":"right","direction":"NE","heading":44,"maneuver":{"instruction":"Merge slightly left onto Barstow Freeway; Mojave Freeway (I 15)","type":"continue","location":{"type":"Point","coordinates":[-117.067582,34.878457]}}},{"distance":1765,"duration":63,"way_name":"I 40","mode":"driving","driving_side":"right","direction":"E","heading":92,"maneuver":{"instruction":"Keep right at the fork onto I 40","type":"bear right","location":{"type":"Point","coordinates":[-117.013164,34.885809]}}},{"distance":2963,"duration":106,"way_name":"Needles Freeway (I 40)","mode":"driving","driving_side":"right","direction":"E","heading":99,"maneuver":{"instruction":"Go straight onto Needles Freeway (I 40), I 40 becomes Needles Freeway (I 40)","type":"continue","location":{"type":"Point","coordinates":[-116.99392,34.886361]}}},{"distance":705474,"duration":25912,"way_name":"Needles Freeway (I 40;CR 66)","mode":"driving","driving_side":"right","direction":"SE","heading":133,"maneuver":{"instruction":"Go straight onto Needles Freeway (I 40;CR 66), Needles Freeway (I 40) becomes Needles Freeway (I 40;CR 66)","type":"continue","location":{"type":"Point","coordinates":[-116.964864,34.875632]}}},{"distance":311944,"duration":11671,"way_name":"Holbrook-Lupton Highway (I 40;AZ 77)","mode":"driving","driving_side":"right","direction":"NE","heading":57,"maneuver":{"instruction":"Go straight onto Holbrook-Lupton Highway (I 40;AZ 77), Needles Freeway (I 40;CR 66) becomes Holbrook-Lupton Highway (I 40;AZ 77)","type":"continue","location":{"type":"Point","coordinates":[-110.148349,34.915441]}}},{"distance":44493,"duration":1490,"way_name":"I-40 (I 40)","mode":"driving","driving_side":"right","direction":"E","heading":91,"maneuver":{"instruction":"Go straight onto I-40 (I 40), Holbrook-Lupton Highway (I 40;AZ 77) becomes I-40 (I 40)","type":"continue","location":{"type":"Point","coordinates":[-107.256886,34.993142]}}},{"distance":643937,"duration":23868,"way_name":"Coronado Freeway (I 40)","mode":"driving","driving_side":"right","direction":"NE","heading":59,"maneuver":{"instruction":"Go straight onto Coronado Freeway (I 40), I-40 (I 40) becomes Coronado Freeway (I 40)","type":"continue","location":{"type":"Point","coordinates":[-106.787302,35.065048]}}},{"distance":237698,"duration":10284,"way_name":"Korean War Veterans Memorial Highway (I 40)","mode":"driving","driving_side":"right","direction":"E","heading":87,"maneuver":{"instruction":"Go straight onto Korean War Veterans Memorial Highway (I 40), Coronado Freeway (I 40) becomes Korean War Veterans Memorial Highway (I 40)","type":"continue","location":{"type":"Point","coordinates":[-100.000288,35.226798]}}},{"distance":7980,"duration":326,"way_name":"Korean War Veterans Memorial Highway (I 40;US 270)","mode":"driving","driving_side":"right","direction":"E","heading":82,"maneuver":{"instruction":"Keep left at the fork onto Korean War Veterans Memorial Highway (I 40;US 270)","type":"bear left","location":{"type":"Point","coordinates":[-97.55705,35.461354]}}},{"distance":36769,"duration":1394,"way_name":"Vietnam Veteran's Memorial Highway (I 40;US 270)","mode":"driving","driving_side":"right","direction":"NE","heading":68,"maneuver":{"instruction":"Keep left at the fork onto Vietnam Veteran's Memorial Highway (I 40;US 270)","type":"bear left","location":{"type":"Point","coordinates":[-97.472422,35.463448]}}},{"distance":392,"duration":14,"way_name":"Vietnam Veteran's Memorial Highway (OK 3;I 40;US 270)","mode":"driving","driving_side":"right","direction":"E","heading":89,"maneuver":{"instruction":"Go straight onto Vietnam Veteran's Memorial Highway (OK 3;I 40;US 270), Vietnam Veteran's Memorial Highway (I 40;US 270) becomes Vietnam Veteran's Memorial Highway (OK 3;I 40;US 270)","type":"continue","location":{"type":"Point","coordinates":[-97.09397,35.383847]}}},{"distance":7762,"duration":277,"way_name":"Vietnam Veteran's Memorial Highway (I 40;US 270;OK 3;OK 102)","mode":"driving","driving_side":"right","direction":"E","heading":90,"maneuver":{"instruction":"Go straight onto Vietnam Veteran's Memorial Highway (I 40;US 270;OK 3;OK 102), Vietnam Veteran's Memorial Highway (OK 3;I 40;US 270) becomes Vietnam Veteran's Memorial Highway (I 40;US 270;OK 3;OK 102)","type":"continue","location":{"type":"Point","coordinates":[-97.089653,35.383885]}}},{"distance":95292,"duration":3392,"way_name":"Vietnam Veteran's Memorial Highway (I 40;OK 3E)","mode":"driving","driving_side":"right","direction":"E","heading":78,"maneuver":{"instruction":"Go straight onto Vietnam Veteran's Memorial Highway (I 40;OK 3E), Vietnam Veteran's Memorial Highway (I 40;US 270;OK 3;OK 102) becomes Vietnam Veteran's Memorial Highway (I 40;OK 3E)","type":"continue","location":{"type":"Point","coordinates":[-97.006274,35.38263]}}},{"distance":2312,"duration":82,"way_name":"Tim Vandiver Memorial Highway (I 40)","mode":"driving","driving_side":"right","direction":"E","heading":100,"maneuver":{"instruction":"Go straight onto Tim Vandiver Memorial Highway (I 40), Vietnam Veteran's Memorial Highway (I 40;OK 3E) becomes Tim Vandiver Memorial Highway (I 40)","type":"continue","location":{"type":"Point","coordinates":[-95.97046,35.431943]}}},{"distance":155485,"duration":5535,"way_name":"Vietnam Veteran's Memorial Highway (I 40)","mode":"driving","driving_side":"right","direction":"E","heading":79,"maneuver":{"instruction":"Go straight onto Vietnam Veteran's Memorial Highway (I 40), Tim Vandiver Memorial Highway (I 40) becomes Vietnam Veteran's Memorial Highway (I 40)","type":"continue","location":{"type":"Point","coordinates":[-95.945366,35.432061]}}},{"distance":236528,"duration":8527,"way_name":"Interstate Highway 40 (I 40;US 71)","mode":"driving","driving_side":"right","direction":"E","heading":81,"maneuver":{"instruction":"Go straight onto Interstate Highway 40 (I 40;US 71), Vietnam Veteran's Memorial Highway (I 40) becomes Interstate Highway 40 (I 40;US 71)","type":"continue","location":{"type":"Point","coordinates":[-94.317847,35.455424]}}},{"distance":200987,"duration":7282,"way_name":"I 40","mode":"driving","driving_side":"right","direction":"E","heading":97,"maneuver":{"instruction":"Keep right at the fork onto I 40","type":"bear right","location":{"type":"Point","coordinates":[-92.236251,34.776971]}}},{"distance":6756,"duration":260,"way_name":"I 40","mode":"driving","driving_side":"right","direction":"E","heading":108,"maneuver":{"instruction":"Keep left at the fork onto I 40","type":"bear left","location":{"type":"Point","coordinates":[-90.151803,35.155768]}}},{"distance":3463,"duration":153,"way_name":"Hernando de Soto Bridge (I 40)","mode":"driving","driving_side":"right","direction":"E","heading":90,"maneuver":{"instruction":"Go straight onto Hernando de Soto Bridge (I 40), I 40 becomes Hernando de Soto Bridge (I 40)","type":"continue","location":{"type":"Point","coordinates":[-90.078194,35.153037]}}},{"distance":144,"duration":12,"way_name":"","mode":"driving","driving_side":"right","direction":"SE","heading":117,"maneuver":{"instruction":"Take the ramp","type":"bear right","location":{"type":"Point","coordinates":[-90.040421,35.1514]}}},{"distance":188,"duration":15,"way_name":"","mode":"driving","driving_side":"right","direction":"SW","heading":240,"maneuver":{"instruction":"Keep right at the fork","type":"bear right","location":{"type":"Point","coordinates":[-90.039988,35.150463]}}},{"distance":592,"duration":45,"way_name":"North Danny Thomas Boulevard (US 51)","mode":"driving","driving_side":"right","direction":"NE","heading":40,"maneuver":{"instruction":"Merge slightly left onto North Danny Thomas Boulevard (US 51)","type":"continue","location":{"type":"Point","coordinates":[-90.040946,35.151265]}}},{"distance":5032,"duration":232,"way_name":"North Parkway","mode":"driving","driving_side":"right","direction":"E","heading":98,"maneuver":{"instruction":"Turn right onto North Parkway","type":"turn right","location":{"type":"Point","coordinates":[-90.037589,35.155695]}}},{"distance":146,"duration":13,"way_name":"","mode":"driving","driving_side":"right","direction":"E","heading":100,"maneuver":{"instruction":"Take the ramp on the left","type":"bear left","location":{"type":"Point","coordinates":[-89.982711,35.151039]}}},{"distance":203,"duration":35,"way_name":"East Parkway North (US 64;US 70;US 79)","mode":"driving","driving_side":"right","direction":"S","heading":188,"maneuver":{"instruction":"Merge slightly left onto East Parkway North (US 64;US 70;US 79)","type":"continue","location":{"type":"Point","coordinates":[-89.981463,35.15045]}}},{"distance":9707,"duration":469,"way_name":"Sam Cooper Boulevard","mode":"driving","driving_side":"right","direction":"SE","heading":125,"maneuver":{"instruction":"Turn left onto Sam Cooper Boulevard","type":"turn left","location":{"type":"Point","coordinates":[-89.98178,35.14864]}}},{"distance":316003,"duration":11718,"way_name":"I 40","mode":"driving","driving_side":"right","direction":"NE","heading":42,"maneuver":{"instruction":"Merge slightly right onto I 40","type":"continue","location":{"type":"Point","coordinates":[-89.88026,35.155544]}}},{"distance":3553,"duration":170,"way_name":"I 40","mode":"driving","driving_side":"right","direction":"NE","heading":56,"maneuver":{"instruction":"Keep right at the fork onto I 40","type":"bear right","location":{"type":"Point","coordinates":[-86.802831,36.17145]}}},{"distance":1564,"duration":69,"way_name":"I 40","mode":"driving","driving_side":"right","direction":"E","heading":97,"maneuver":{"instruction":"Keep left at the fork onto I 40","type":"bear left","location":{"type":"Point","coordinates":[-86.780469,36.148403]}}},{"distance":615,"duration":27,"way_name":"I 40","mode":"driving","driving_side":"right","direction":"NE","heading":64,"maneuver":{"instruction":"Keep right at the fork onto I 40","type":"bear right","location":{"type":"Point","coordinates":[-86.764497,36.153216]}}},{"distance":2786,"duration":123,"way_name":"I 24;I 40","mode":"driving","driving_side":"right","direction":"SE","heading":113,"maneuver":{"instruction":"Go straight onto I 24;I 40, I 40 becomes I 24;I 40","type":"continue","location":{"type":"Point","coordinates":[-86.758079,36.153889]}}},{"distance":335039,"duration":12574,"way_name":"I 40","mode":"driving","driving_side":"right","direction":"SE","heading":110,"maneuver":{"instruction":"Keep left at the fork onto I 40","type":"bear left","location":{"type":"Point","coordinates":[-86.731927,36.140597]}}},{"distance":239722,"duration":8653,"way_name":"I 81","mode":"driving","driving_side":"right","direction":"NE","heading":68,"maneuver":{"instruction":"Keep left at the fork onto I 81","type":"bear left","location":{"type":"Point","coordinates":[-83.388758,36.067021]}}},{"distance":1395,"duration":50,"way_name":"I 77;I 81;US 52","mode":"driving","driving_side":"right","direction":"SE","heading":135,"maneuver":{"instruction":"Go straight onto I 77;I 81;US 52, I 81 becomes I 77;I 81;US 52","type":"continue","location":{"type":"Point","coordinates":[-81.057288,36.956804]}}},{"distance":11201,"duration":399,"way_name":"I 77;I 81;US 11;US 52","mode":"driving","driving_side":"right","direction":"E","heading":107,"maneuver":{"instruction":"Go straight onto I 77;I 81;US 11;US 52, I 77;I 81;US 52 becomes I 77;I 81;US 11;US 52","type":"continue","location":{"type":"Point","coordinates":[-81.049739,36.946379]}}},{"distance":20813,"duration":741,"way_name":"I 81;US 11","mode":"driving","driving_side":"right","direction":"E","heading":77,"maneuver":{"instruction":"Go straight onto I 81;US 11, I 77;I 81;US 11;US 52 becomes I 81;US 11","type":"continue","location":{"type":"Point","coordinates":[-80.929018,36.948116]}}},{"distance":5410,"duration":193,"way_name":"I 81;SR 100","mode":"driving","driving_side":"right","direction":"N","heading":11,"maneuver":{"instruction":"Go straight onto I 81;SR 100, I 81;US 11 becomes I 81;SR 100","type":"continue","location":{"type":"Point","coordinates":[-80.729555,37.02575]}}},{"distance":151337,"duration":5580,"way_name":"I 81;VA 100","mode":"driving","driving_side":"right","direction":"NE","heading":22,"maneuver":{"instruction":"Go straight onto I 81;VA 100, I 81;SR 100 becomes I 81;VA 100","type":"continue","location":{"type":"Point","coordinates":[-80.705349,37.069543]}}},{"distance":47875,"duration":1716,"way_name":"I 64;I 81","mode":"driving","driving_side":"right","direction":"NE","heading":24,"maneuver":{"instruction":"Go straight onto I 64;I 81, I 81;VA 100 becomes I 64;I 81","type":"continue","location":{"type":"Point","coordinates":[-79.393437,37.797654]}}},{"distance":127023,"duration":4608,"way_name":"I 81","mode":"driving","driving_side":"right","direction":"NE","heading":40,"maneuver":{"instruction":"Go straight onto I 81, I 64;I 81 becomes I 81","type":"continue","location":{"type":"Point","coordinates":[-79.05083,38.117956]}}},{"distance":590,"duration":45,"way_name":"","mode":"driving","driving_side":"right","direction":"E","heading":70,"maneuver":{"instruction":"Take the ramp","type":"bear right","location":{"type":"Point","coordinates":[-78.301016,39.007978]}}},{"distance":75457,"duration":2720,"way_name":"I 66","mode":"driving","driving_side":"right","direction":"SE","heading":130,"maneuver":{"instruction":"Go straight onto I 66, street becomes I 66","type":"continue","location":{"type":"Point","coordinates":[-78.294677,39.007245]}}},{"distance":43320,"duration":1906,"way_name":"Custis Memorial Parkway (I 66)","mode":"driving","driving_side":"right","direction":"E","heading":85,"maneuver":{"instruction":"Go straight onto Custis Memorial Parkway (I 66), I 66 becomes Custis Memorial Parkway (I 66)","type":"continue","location":{"type":"Point","coordinates":[-77.519426,38.801374]}}},{"distance":223,"duration":15,"way_name":"North Lynn Street (US 29)","mode":"driving","driving_side":"right","direction":"N","heading":4,"maneuver":{"instruction":"Turn left onto North Lynn Street (US 29)","type":"turn left","location":{"type":"Point","coordinates":[-77.070762,38.898483]}}},{"distance":403,"duration":32,"way_name":"Francis Scott Key Bridge (US 29)","mode":"driving","driving_side":"right","direction":"N","heading":20,"maneuver":{"instruction":"Follow a slight right onto Francis Scott Key Bridge (US 29), North Lynn Street (US 29) becomes Francis Scott Key Bridge (US 29)","type":"bear right","location":{"type":"Point","coordinates":[-77.070771,38.900478]}}},{"distance":288,"duration":22,"way_name":"US 29","mode":"driving","driving_side":"right","direction":"NE","heading":57,"maneuver":{"instruction":"Take the ramp on the right","type":"bear right","location":{"type":"Point","coordinates":[-77.069159,38.903874]}}},{"distance":697,"duration":32,"way_name":"Whitehurst Freeway (US 29)","mode":"driving","driving_side":"right","direction":"SE","heading":115,"maneuver":{"instruction":"Go straight onto Whitehurst Freeway (US 29), US 29 becomes Whitehurst Freeway (US 29)","type":"continue","location":{"type":"Point","coordinates":[-77.065954,38.903392]}}},{"distance":178,"duration":10,"way_name":"Whitehurst Freeway (US 29)","mode":"driving","driving_side":"right","direction":"E","heading":87,"maneuver":{"instruction":"Keep left at the fork onto Whitehurst Freeway (US 29)","type":"bear left","location":{"type":"Point","coordinates":[-77.05813,38.902415]}}},{"distance":1521,"duration":97,"way_name":"K Street Northwest (US 29)","mode":"driving","driving_side":"right","direction":"E","heading":89,"maneuver":{"instruction":"Go straight onto K Street Northwest (US 29), Whitehurst Freeway (US 29) becomes K Street Northwest (US 29)","type":"continue","location":{"type":"Point","coordinates":[-77.056079,38.902412]}}},{"distance":351,"duration":41,"way_name":"K Street Northwest","mode":"driving","driving_side":"right","direction":"SE","heading":131,"maneuver":{"instruction":"Make a slight right onto K Street Northwest","type":"bear right","location":{"type":"Point","coordinates":[-77.038518,38.902523]}}},{"distance":601,"duration":56,"way_name":"15th Street Northwest","mode":"driving","driving_side":"right","direction":"N","heading":359,"maneuver":{"instruction":"Turn left onto 15th Street Northwest","type":"turn left","location":{"type":"Point","coordinates":[-77.034578,38.902523]}}},{"distance":378,"duration":25,"way_name":"Rhode Island Avenue Northwest","mode":"driving","driving_side":"right","direction":"NE","heading":65,"maneuver":{"instruction":"Turn right onto Rhode Island Avenue Northwest","type":"turn right","location":{"type":"Point","coordinates":[-77.034564,38.907925]}}},{"distance":35,"duration":5,"way_name":"","mode":"driving","driving_side":"right","direction":"E","heading":87,"maneuver":{"instruction":"Make a slight right","type":"bear right","location":{"type":"Point","coordinates":[-77.030585,38.909317]}}},{"distance":295,"duration":23,"way_name":"Logan Circle Northwest","mode":"driving","driving_side":"right","direction":"SE","heading":141,"maneuver":{"instruction":"Enter Logan Circle Northwest and exit onto Logan Circle Northwest","type":"enter roundabout","location":{"type":"Point","coordinates":[-77.030188,38.909312]}}},{"distance":0,"duration":0,"way_name":"Logan Circle Northwest","mode":"driving","driving_side":"right","direction":"N","heading":0,"maneuver":{"instruction":"You have arrived at your destination, on the left","type":"arrive","location":{"type":"Point","coordinates":[-77.03007,38.910072]}}}],"geometry":{"type":"LineString","coordinates":[[-122.42002,37.78009],[-122.41982,37.78012],[-122.41953,37.78015],[-122.41901,37.78022],[-122.41875,37.78025],[-122.41861,37.78027],[-122.41848,37.78029],[-122.41808,37.78034],[-122.41756,37.78041],[-122.41736,37.78043],[-122.41712,37.78046],[-122.41707,37.78047],[-122.41699,37.7805],[-122.41692,37.78052],[-122.41687,37.78053],[-122.41616,37.78062],[-122.41598,37.78064],[-122.41534,37.78073],[-122.41518,37.77996],[-122.41515,37.7798],[-122.41512,37.77964],[-122.41499,37.779],[-122.41492,37.77887],[-122.4149,37.77885],[-122.41483,37.77878],[-122.41476,37.77872],[-122.41471,37.77868],[-122.41442,37.77845],[-122.41416,37.77824],[-122.41339,37.77763],[-122.41317,37.77745],[-122.41263,37.77702],[-122.41217,37.77665],[-122.41187,37.77642],[-122.41162,37.77621],[-122.41108,37.77579],[-122.41062,37.77542],[-122.41008,37.77499],[-122.40953,37.77455],[-122.40909,37.7742],[-122.40854,37.77376],[-122.40845,37.77369],[-122.40777,37.77315],[-122.40725,37.77273],[-122.40697,37.77254],[-122.40667,37.77278],[-122.40664,37.77311],[-122.40664,37.77337],[-122.40663,37.77356],[-122.40661,37.77372],[-122.40657,37.77389],[-122.40652,37.77407],[-122.40644,37.77424],[-122.40636,37.77441],[-122.40624,37.77459],[-122.40613,37.77476],[-122.40601,37.77492],[-122.40588,37.77507],[-122.40575,37.77522],[-122.40561,37.77536],[-122.40544,37.77552],[-122.40525,37.7757],[-122.40508,37.77585],[-122.40491,37.77599],[-122.40474,37.77611],[-122.40434,37.77638],[-122.40411,37.77653],[-122.40391,37.77665],[-122.40367,37.77678],[-122.40161,37.77784],[-122.40138,37.77796],[-122.40115,37.7781],[-122.40092,37.77825],[-122.40066,37.77842],[-122.40042,37.77859],[-122.40016,37.77879],[-122.39993,37.77899],[-122.39967,37.77921],[-122.39933,37.7795],[-122.3981,37.78054],[-122.39665,37.78178],[-122.39593,37.7824],[-122.39545,37.7828],[-122.39497,37.78321],[-122.39418,37.78383],[-122.39349,37.78437],[-122.3933,37.7845],[-122.39283,37.78481],[-122.39214,37.78517],[-122.3915,37.78549],[-122.39094,37.78592],[-122.39037,37.78641],[-122.36744,37.80781],[-122.36721,37.80812],[-122.36675,37.80856],[-122.36504,37.81018],[-122.36436,37.81078],[-122.36343,37.81159],[-122.36294,37.81206],[-122.36238,37.81256],[-122.36173,37.81305],[-122.36122,37.81341],[-122.36085,37.81366],[-122.36057,37.81385],[-122.36028,37.81402],[-122.35481,37.81714],[-122.35456,37.81728],[-122.3543,37.81742],[-122.35405,37.81755],[-122.35379,37.81767],[-122.35354,37.81778],[-122.3533,37.81788],[-122.35304,37.81799],[-122.35276,37.8181],[-122.35251,37.81819],[-122.35226,37.81828],[-122.35199,37.81836],[-122.35169,37.81844],[-122.35138,37.81853],[-122.35106,37.81861],[-122.35071,37.81868],[-122.35036,37.81874],[-122.35002,37.8188],[-122.33359,37.82117],[-122.33288,37.82127],[-122.3322,37.82136],[-122.3314,37.82145],[-122.33075,37.82153],[-122.33005,37.8216],[-122.32773,37.82183],[-122.32492,37.82206],[-122.32351,37.82218],[-122.32304,37.82223],[-122.32222,37.82234],[-122.32056,37.82263],[-122.31861,37.82297],[-122.31593,37.82344],[-122.31434,37.82372],[-122.31366,37.82384],[-122.312,37.82412],[-122.31138,37.82423],[-122.31065,37.82434],[-122.30992,37.82443],[-122.3079,37.82464],[-122.30728,37.8247],[-122.30665,37.82478],[-122.30607,37.82488],[-122.30564,37.82496],[-122.3031,37.8254],[-122.30261,37.82548],[-122.30145,37.82569],[-122.30062,37.82585],[-122.29972,37.82604],[-122.29775,37.82646],[-122.29711,37.82663],[-122.29667,37.82676],[-122.29624,37.82691],[-122.29568,37.82714],[-122.29525,37.82731],[-122.29494,37.82739],[-122.29463,37.82746],[-122.29433,37.8275],[-122.29401,37.82753],[-122.2937,37.82753],[-122.29337,37.82752],[-122.29306,37.82748],[-122.29275,37.82741],[-122.29244,37.82733],[-122.29215,37.82723],[-122.29189,37.82712],[-122.29138,37.82688],[-122.2911,37.82676],[-122.29078,37.82665],[-122.29048,37.82655],[-122.29008,37.82646],[-122.28965,37.82639],[-122.28925,37.82634],[-122.2889,37.82633],[-122.2885,37.82632],[-122.28811,37.82634],[-122.28774,37.82638],[-122.28686,37.8265],[-122.28436,37.82702],[-122.2834,37.82721],[-122.2831,37.82726],[-122.28278,37.82729],[-122.28246,37.82731],[-122.28216,37.82732],[-122.28184,37.82731],[-122.28153,37.82729],[-122.28121,37.82724],[-122.28088,37.82719],[-122.27993,37.82697],[-122.27872,37.82668],[-122.2781,37.82653],[-122.27776,37.82646],[-122.27548,37.82593],[-122.27499,37.82581],[-122.27367,37.82548],[-122.27252,37.82521],[-122.27204,37.8251],[-122.27062,37.82476],[-122.26998,37.82461],[-122.26952,37.8245],[-122.26877,37.82432],[-122.26776,37.82408],[-122.26623,37.82372],[-122.26568,37.82359],[-122.26531,37.82351],[-122.26387,37.8232],[-122.26221,37.82285],[-122.26175,37.82274],[-122.26136,37.82264],[-122.26097,37.82252],[-122.26057,37.82239],[-122.26018,37.82225],[-122.25989,37.82215],[-122.2596,37.82204],[-122.2593,37.82192],[-122.25887,37.82174],[-122.25842,37.82155],[-122.25792,37.82132],[-122.25743,37.82108],[-122.25698,37.82085],[-122.25658,37.82063],[-122.25617,37.8204],[-122.25571,37.82013],[-122.25528,37.81987],[-122.25489,37.81961],[-122.25436,37.81925],[-122.25413,37.81908],[-122.25389,37.8189],[-122.25365,37.81871],[-122.25339,37.8185],[-122.25312,37.81827],[-122.25288,37.81802],[-122.25267,37.81778],[-122.25246,37.81752],[-122.25226,37.81726],[-122.25207,37.81696],[-122.2519,37.81666],[-122.25175,37.81636],[-122.25163,37.81606],[-122.25153,37.81579],[-122.25144,37.8155],[-122.25127,37.81481],[-122.25078,37.81315],[-122.25059,37.81248],[-122.25053,37.81229],[-122.25046,37.81209],[-122.25038,37.81191],[-122.25028,37.81173],[-122.25016,37.81154],[-122.25003,37.81137],[-122.24986,37.81117],[-122.24967,37.81098],[-122.2495,37.81083],[-122.24929,37.81069],[-122.24906,37.81055],[-122.24876,37.81039],[-122.24846,37.81026],[-122.24809,37.81011],[-122.24772,37.80999],[-122.24632,37.8096],[-122.24562,37.8094],[-122.24433,37.80904],[-122.24288,37.80864],[-122.24239,37.80849],[-122.24194,37.80833],[-122.24148,37.80817],[-122.24104,37.808],[-122.24063,37.80783],[-122.24023,37.80765],[-122.2385,37.80685],[-122.23617,37.80577],[-122.23577,37.80557],[-122.2354,37.80538],[-122.23499,37.80516],[-122.23459,37.80493],[-122.23418,37.80469],[-122.23379,37.80444],[-122.23349,37.80421],[-122.2332,37.804],[-122.23283,37.80371],[-122.23088,37.80212],[-122.23063,37.80193],[-122.2304,37.80176],[-122.23017,37.80161],[-122.22994,37.80147],[-122.22968,37.80133],[-122.22943,37.8012],[-122.22914,37.80106],[-122.22883,37.80093],[-122.22852,37.80081],[-122.22822,37.80071],[-122.22793,37.80062],[-122.2276,37.80054],[-122.22725,37.80045],[-122.22666,37.80033],[-122.22329,37.79964],[-122.22147,37.79926],[-122.22012,37.79897],[-122.21937,37.79879],[-122.21856,37.7986],[-122.2173,37.79828],[-122.21538,37.7978],[-122.21256,37.79709],[-122.21216,37.79699],[-122.21173,37.79686],[-122.21133,37.79673],[-122.21093,37.79658],[-122.21054,37.79642],[-122.21022,37.79628],[-122.20757,37.79504],[-122.2072,37.79487],[-122.20685,37.79471],[-122.20636,37.79446],[-122.20578,37.79414],[-122.20548,37.79394],[-122.20517,37.79373],[-122.20487,37.79351],[-122.20455,37.79324],[-122.20429,37.79303],[-122.20404,37.79279],[-122.20378,37.79251],[-122.2017,37.79026],[-122.20136,37.78992],[-122.20099,37.78958],[-122.20065,37.78928],[-122.20026,37.78899],[-122.19989,37.78874],[-122.19949,37.78849],[-122.19912,37.78827],[-122.19867,37.78804],[-122.19617,37.7868],[-122.19586,37.78664],[-122.19495,37.78619],[-122.19443,37.78593],[-122.19388,37.78569],[-122.19354,37.78555],[-122.19318,37.78541],[-122.19285,37.78529],[-122.19248,37.78516],[-122.19206,37.78502],[-122.19166,37.7849],[-122.19122,37.78478],[-122.19082,37.78467],[-122.19044,37.78458],[-122.1901,37.78451],[-122.18971,37.78443],[-122.18932,37.78436],[-122.18895,37.7843],[-122.1886,37.78425],[-122.18817,37.7842],[-122.18778,37.78415],[-122.18725,37.78411],[-122.18687,37.78409],[-122.18643,37.78406],[-122.18505,37.78402],[-122.1809,37.78388],[-122.18052,37.78387],[-122.17996,37.78385],[-122.17964,37.78382],[-122.17932,37.78379],[-122.179,37.78373],[-122.17866,37.78366],[-122.17832,37.78357],[-122.17801,37.78346],[-122.17771,37.78334],[-122.17742,37.78321],[-122.17717,37.78308],[-122.17689,37.78292],[-122.17529,37.78189],[-122.17482,37.78159],[-122.17437,37.78132],[-122.17398,37.78109],[-122.1737,37.78094],[-122.17342,37.78078],[-122.17283,37.78047],[-122.17081,37.77943],[-122.16901,37.77849],[-122.16857,37.77826],[-122.16811,37.77804],[-122.16764,37.77783],[-122.16438,37.77635],[-122.16404,37.77619],[-122.16359,37.77598],[-122.16313,37.77575],[-122.16259,37.77549],[-122.16176,37.77507],[-122.16016,37.77425],[-122.15929,37.7738],[-122.1589,37.7736],[-122.15856,37.77339],[-122.15818,37.77316],[-122.15783,37.77293],[-122.15747,37.77268],[-122.15714,37.77243],[-122.15682,37.77217],[-122.15652,37.77191],[-122.15622,37.77163],[-122.15594,37.77136],[-122.15566,37.77106],[-122.15541,37.77078],[-122.15519,37.77051],[-122.15496,37.77022],[-122.15476,37.76994],[-122.15458,37.76969],[-122.15442,37.76943],[-122.1541,37.76891],[-122.15378,37.76838],[-122.15351,37.76793],[-122.1528,37.76677],[-122.15263,37.76649],[-122.15243,37.76619],[-122.15222,37.7659],[-122.15199,37.76562],[-122.15179,37.76537],[-122.15111,37.76456],[-122.15087,37.76427],[-122.15068,37.76402],[-122.1505,37.76378],[-122.15031,37.76352],[-122.15013,37.76326],[-122.14908,37.76167],[-122.14892,37.76142],[-122.14878,37.7612],[-122.14863,37.76092],[-122.14848,37.76063],[-122.14835,37.76035],[-122.14825,37.76012],[-122.14816,37.75987],[-122.14808,37.75961],[-122.14802,37.75936],[-122.14798,37.75909],[-122.14796,37.75883],[-122.14797,37.75853],[-122.148,37.75824],[-122.14805,37.75796],[-122.14812,37.75768],[-122.14822,37.75743],[-122.14833,37.75717],[-122.14847,37.75691],[-122.14862,37.75667],[-122.14879,37.75644],[-122.14898,37.75623],[-122.14917,37.75603],[-122.14938,37.75582],[-122.15053,37.75477],[-122.15073,37.75458],[-122.15092,37.75439],[-122.15109,37.75418],[-122.15125,37.75398],[-122.15139,37.75376],[-122.15152,37.75354],[-122.15163,37.75327],[-122.15172,37.75304],[-122.15178,37.75281],[-122.15185,37.75257],[-122.15191,37.75231],[-122.15194,37.75206],[-122.15196,37.75182],[-122.15196,37.75159],[-122.15193,37.75134],[-122.15189,37.75111],[-122.15184,37.75088],[-122.15179,37.75068],[-122.15172,37.75048],[-122.15164,37.75026],[-122.15154,37.75004],[-122.14978,37.74645],[-122.14964,37.74616],[-122.14953,37.74595],[-122.1494,37.74574],[-122.14926,37.74552],[-122.1491,37.7453],[-122.1489,37.74506],[-122.14869,37.74484],[-122.14848,37.74464],[-122.14826,37.74443],[-122.14802,37.74424],[-122.14777,37.74405],[-122.1475,37.74386],[-122.14677,37.74334],[-122.14656,37.74319],[-122.1464,37.74307],[-122.14624,37.74294],[-122.1461,37.74281],[-122.14597,37.74269],[-122.14584,37.74256],[-122.14571,37.74243],[-122.14559,37.74228],[-122.14547,37.74212],[-122.14534,37.74196],[-122.14445,37.74076],[-122.14427,37.74054],[-122.14407,37.74032],[-122.14389,37.74012],[-122.1437,37.73993],[-122.14347,37.73973],[-122.14322,37.73952],[-122.14184,37.73843],[-122.14165,37.73826],[-122.14146,37.73809],[-122.14129,37.7379],[-122.14118,37.73778],[-122.14109,37.73766],[-122.14098,37.73752],[-122.14083,37.73731],[-122.14068,37.73707],[-122.14056,37.73684],[-122.14045,37.73661],[-122.14036,37.73637],[-122.14029,37.73613],[-122.14023,37.7359],[-122.13995,37.73469],[-122.13987,37.73432],[-122.13969,37.73355],[-122.13956,37.73298],[-122.13945,37.73257],[-122.13934,37.73215],[-122.13905,37.73115],[-122.13887,37.73049],[-122.1387,37.72991],[-122.1386,37.72955],[-122.13852,37.72925],[-122.13845,37.72899],[-122.13839,37.72874],[-122.13835,37.72859],[-122.13832,37.72842],[-122.13828,37.72819],[-122.13823,37.72793],[-122.13797,37.72621],[-122.13794,37.72599],[-122.1379,37.72579],[-122.13785,37.72559],[-122.13779,37.72539],[-122.13773,37.7252],[-122.13766,37.72499],[-122.13758,37.72479],[-122.13749,37.72458],[-122.13738,37.72439],[-122.13727,37.72418],[-122.13714,37.72396],[-122.13701,37.72376],[-122.13687,37.72356],[-122.13599,37.72242],[-122.13523,37.72145],[-122.135,37.72114],[-122.13479,37.72085],[-122.1346,37.72058],[-122.13441,37.72031],[-122.13425,37.72004],[-122.13409,37.71979],[-122.13394,37.71954],[-122.13378,37.71929],[-122.13364,37.71905],[-122.13349,37.71878],[-122.13326,37.71833],[-122.13299,37.71779],[-122.13267,37.71708],[-122.13201,37.71563],[-122.13188,37.71537],[-122.13173,37.7151],[-122.1316,37.71487],[-122.13145,37.71464],[-122.1313,37.71442],[-122.13111,37.71416],[-122.13091,37.71391],[-122.13072,37.71369],[-122.13049,37.71344],[-122.13026,37.71321],[-122.13,37.71297],[-122.12975,37.71275],[-122.12948,37.71254],[-122.12921,37.71234],[-122.12894,37.71215],[-122.12867,37.71197],[-122.12842,37.71182],[-122.12814,37.71166],[-122.12787,37.71152],[-122.12759,37.71137],[-122.12726,37.71121],[-122.12621,37.71073],[-122.12589,37.71057],[-122.12558,37.71041],[-122.1253,37.71025],[-122.12501,37.71009],[-122.12474,37.70991],[-122.12452,37.70976],[-122.1243,37.7096],[-122.12409,37.70944],[-122.12307,37.70865],[-122.12216,37.70792],[-122.1219,37.70772],[-122.12162,37.7075],[-122.12132,37.7073],[-122.12103,37.70712],[-122.12073,37.70696],[-122.12042,37.70681],[-122.11956,37.70643],[-122.11862,37.70601],[-122.11823,37.70583],[-122.11784,37.70565],[-122.1175,37.70549],[-122.11714,37.70531],[-122.11673,37.70509],[-122.11635,37.70489],[-122.11596,37.70467],[-122.11556,37.70444],[-122.11513,37.70418],[-122.11463,37.70387],[-122.11391,37.70342],[-122.11345,37.70313],[-122.11295,37.70281],[-122.11253,37.70255],[-122.10999,37.70097],[-122.10968,37.70078],[-122.10939,37.70057],[-122.10911,37.70036],[-122.10886,37.70016],[-122.10861,37.69994],[-122.10845,37.69979],[-122.1083,37.69965],[-122.10816,37.69951],[-122.10798,37.69933],[-122.10781,37.69914],[-122.10623,37.6974],[-122.10524,37.69629],[-122.10469,37.69569],[-122.10434,37.69531],[-122.10295,37.69377],[-122.10191,37.69261],[-122.1016,37.69227],[-122.10141,37.69208],[-122.10123,37.6919],[-122.10103,37.69173],[-122.10084,37.69156],[-122.10063,37.69139],[-122.10041,37.69123],[-122.10017,37.69108],[-122.09993,37.69093],[-122.09966,37.69079],[-122.09939,37.69066],[-122.09914,37.69055],[-122.09887,37.69045],[-122.09859,37.69035],[-122.0983,37.69026],[-122.09801,37.69018],[-122.09772,37.69012],[-122.09743,37.69006],[-122.09716,37.69002],[-122.0969,37.68998],[-122.09664,37.68996],[-122.09636,37.68993],[-122.09608,37.68992],[-122.09578,37.68992],[-122.0955,37.68992],[-122.09524,37.68994],[-122.09496,37.68996],[-122.0947,37.68998],[-122.09343,37.69012],[-122.09247,37.69022],[-122.09168,37.6903],[-122.09069,37.69037],[-122.08944,37.69044],[-122.08856,37.69042],[-122.08733,37.69043],[-122.08224,37.69049],[-122.0804,37.69051],[-122.07876,37.69052],[-122.07403,37.69056],[-122.07341,37.69056],[-122.07205,37.6906],[-122.06974,37.69081],[-122.06863,37.69097],[-122.06823,37.69103],[-122.06672,37.69134],[-122.06486,37.69184],[-122.06468,37.69189],[-122.06421,37.69203],[-122.06096,37.69295],[-122.06034,37.69311],[-122.0595,37.69331],[-122.05892,37.69342],[-122.05826,37.6935],[-122.05767,37.69355],[-122.05718,37.69356],[-122.05669,37.69356],[-122.05599,37.69353],[-122.05539,37.69349],[-122.0535,37.69327],[-122.05225,37.69321],[-122.05156,37.69323],[-122.05093,37.69328],[-122.05027,37.69335],[-122.04962,37.69348],[-122.04903,37.69361],[-122.04839,37.69379],[-122.04784,37.69397],[-122.04725,37.69419],[-122.04668,37.69443],[-122.04614,37.69469],[-122.04568,37.69493],[-122.0452,37.69522],[-122.04488,37.69545],[-122.04457,37.69568],[-122.04424,37.69595],[-122.04346,37.69666],[-122.04235,37.6977],[-122.04067,37.69924],[-122.04034,37.69953],[-122.03999,37.6998],[-122.03962,37.70007],[-122.03924,37.7003],[-122.03884,37.70053],[-122.03843,37.70075],[-122.03798,37.70096],[-122.03756,37.70114],[-122.03708,37.70131],[-122.03657,37.70147],[-122.03614,37.70159],[-122.0357,37.70169],[-122.03515,37.70179],[-122.03468,37.70187],[-122.0342,37.70192],[-122.03378,37.70195],[-122.03329,37.70197],[-122.03276,37.70199],[-122.03214,37.70197],[-122.03133,37.7019],[-122.0306,37.70177],[-122.03018,37.70166],[-122.02972,37.70155],[-122.02825,37.70114],[-122.02779,37.70102],[-122.02724,37.7009],[-122.02663,37.70079],[-122.02596,37.70071],[-122.0253,37.70067],[-122.02464,37.70065],[-122.02399,37.70067],[-122.02333,37.70071],[-122.02269,37.7008],[-122.02204,37.70091],[-122.02137,37.70106],[-122.0211,37.70114],[-122.02084,37.70121],[-122.0202,37.70143],[-122.01871,37.70199],[-122.0181,37.7022],[-122.01749,37.70237],[-122.01685,37.70252],[-122.01621,37.70263],[-122.01557,37.70271],[-122.01491,37.70275],[-122.00291,37.70332],[-122.00228,37.70335],[-122.00162,37.70336],[-122.00097,37.70335],[-122.00028,37.70332],[-121.99965,37.70327],[-121.99898,37.70321],[-121.99834,37.70313],[-121.99768,37.70303],[-121.99705,37.70291],[-121.99641,37.70277],[-121.99578,37.70262],[-121.99515,37.70245],[-121.99455,37.70226],[-121.99394,37.70206],[-121.99334,37.70183],[-121.99276,37.7016],[-121.99217,37.70134],[-121.99015,37.70046],[-121.98957,37.70021],[-121.98896,37.7],[-121.98835,37.69982],[-121.98772,37.69966],[-121.98707,37.69954],[-121.98642,37.69944],[-121.98397,37.69918],[-121.98332,37.6991],[-121.98267,37.69901],[-121.98203,37.69891],[-121.98136,37.6988],[-121.97974,37.69852],[-121.97925,37.69844],[-121.9747,37.69765],[-121.97347,37.69744],[-121.97216,37.69727],[-121.97083,37.69714],[-121.96958,37.69707],[-121.96829,37.69704],[-121.96703,37.69706],[-121.96571,37.69712],[-121.96439,37.69724],[-121.96302,37.69742],[-121.96165,37.69765],[-121.95922,37.69807],[-121.9586,37.69816],[-121.95794,37.69822],[-121.95732,37.69825],[-121.95664,37.69825],[-121.94579,37.69817],[-121.94217,37.69811],[-121.93963,37.69814],[-121.93682,37.69811],[-121.93629,37.6981],[-121.93578,37.69811],[-121.93526,37.69814],[-121.93475,37.69818],[-121.93425,37.69824],[-121.93378,37.6983],[-121.9333,37.69838],[-121.93281,37.69848],[-121.93237,37.69858],[-121.93187,37.6987],[-121.9312,37.69887],[-121.93098,37.6989],[-121.92842,37.69949],[-121.92654,37.69992],[-121.92512,37.70025],[-121.92424,37.70046],[-121.92326,37.70068],[-121.92244,37.70087],[-121.92051,37.70129],[-121.92012,37.70137],[-121.91971,37.70146],[-121.91933,37.70152],[-121.91898,37.70158],[-121.9176,37.7017],[-121.91737,37.70171],[-121.91651,37.70174],[-121.91185,37.70168],[-121.91161,37.70163],[-121.91047,37.70159],[-121.90728,37.70156],[-121.90656,37.70155],[-121.90403,37.70149],[-121.90014,37.70147],[-121.89813,37.70147],[-121.89754,37.70146],[-121.89304,37.70141],[-121.89094,37.70143],[-121.88845,37.70138],[-121.88778,37.70136],[-121.88659,37.70135],[-121.88311,37.70134],[-121.87927,37.70136],[-121.8789,37.70137],[-121.87699,37.70136],[-121.87107,37.70135],[-121.86904,37.70132],[-121.86672,37.70129],[-121.85395,37.70114],[-121.84905,37.70111],[-121.84759,37.70111],[-121.8436,37.7011],[-121.83673,37.70104],[-121.83297,37.701],[-121.82285,37.70087],[-121.82031,37.70089],[-121.81611,37.70081],[-121.80909,37.70077],[-121.80825,37.70077],[-121.80429,37.70076],[-121.80325,37.70075],[-121.80163,37.70073],[-121.7999,37.7007],[-121.79903,37.70069],[-121.79747,37.7007],[-121.79682,37.70069],[-121.79589,37.70066],[-121.79528,37.70067],[-121.79452,37.70063],[-121.79417,37.70058],[-121.79386,37.70053],[-121.79356,37.70047],[-121.79018,37.69973],[-121.78976,37.69964],[-121.78944,37.69958],[-121.7891,37.69953],[-121.78873,37.69949],[-121.7884,37.69946],[-121.78808,37.69944],[-121.78773,37.69942],[-121.7874,37.69942],[-121.78706,37.69943],[-121.78668,37.69945],[-121.7863,37.69947],[-121.78591,37.6995],[-121.78497,37.69959],[-121.78436,37.69964],[-121.78261,37.69979],[-121.77863,37.70014],[-121.77752,37.70023],[-121.77637,37.70036],[-121.77522,37.70051],[-121.77407,37.70068],[-121.77352,37.70077],[-121.7699,37.70136],[-121.76421,37.70232],[-121.7633,37.70246],[-121.76231,37.70259],[-121.76138,37.70268],[-121.76047,37.70275],[-121.75952,37.70279],[-121.75906,37.7028],[-121.75793,37.7028],[-121.75662,37.70276],[-121.75525,37.70271],[-121.7499,37.70248],[-121.74527,37.70226],[-121.74427,37.70224],[-121.74344,37.70223],[-121.74252,37.70225],[-121.74169,37.7023],[-121.74093,37.70239],[-121.7402,37.7025],[-121.73952,37.70264],[-121.7389,37.70277],[-121.73818,37.70295],[-121.73753,37.70315],[-121.73689,37.70337],[-121.73666,37.70345],[-121.73324,37.70491],[-121.72971,37.7064],[-121.72837,37.70693],[-121.72781,37.70718],[-121.72464,37.70851],[-121.72156,37.70985],[-121.71981,37.71055],[-121.719,37.71089],[-121.71599,37.71218],[-121.71448,37.71283],[-121.71167,37.714],[-121.70948,37.71496],[-121.70719,37.71594],[-121.70587,37.71644],[-121.70469,37.71679],[-121.7033,37.71711],[-121.70113,37.71759],[-121.70013,37.7178],[-121.69698,37.71845],[-121.69545,37.71875],[-121.6879,37.72026],[-121.68716,37.72043],[-121.68642,37.72061],[-121.68351,37.72136],[-121.6829,37.72151],[-121.68227,37.72163],[-121.6816,37.72172],[-121.68098,37.72176],[-121.68035,37.72175],[-121.67969,37.7217],[-121.67678,37.72138],[-121.67613,37.7213],[-121.67552,37.72117],[-121.67495,37.721],[-121.6744,37.72079],[-121.67383,37.72051],[-121.6733,37.72019],[-121.67232,37.71953],[-121.67178,37.71918],[-121.67123,37.71888],[-121.67064,37.71861],[-121.67004,37.71839],[-121.66938,37.71819],[-121.66875,37.71804],[-121.66807,37.71793],[-121.66745,37.71787],[-121.66678,37.71784],[-121.66605,37.71786],[-121.66537,37.71793],[-121.66471,37.71804],[-121.66405,37.71819],[-121.66338,37.71838],[-121.65867,37.7197],[-121.65679,37.72026],[-121.65344,37.72135],[-121.65051,37.72229],[-121.64289,37.72477],[-121.63713,37.72666],[-121.63544,37.72745],[-121.63419,37.7285],[-121.63354,37.72933],[-121.63286,37.73023],[-121.63208,37.73107],[-121.63117,37.73178],[-121.63046,37.73226],[-121.62916,37.73295],[-121.62871,37.73315],[-121.62806,37.73341],[-121.62739,37.73353],[-121.62633,37.7337],[-121.61917,37.73415],[-121.61243,37.73464],[-121.6104,37.73492],[-121.60809,37.73542],[-121.60614,37.73594],[-121.60224,37.73701],[-121.6011,37.73734],[-121.60009,37.73757],[-121.59781,37.73802],[-121.59115,37.73926],[-121.58606,37.74022],[-121.58557,37.74031],[-121.58192,37.74092],[-121.58124,37.74104],[-121.5803,37.74118],[-121.57847,37.74137],[-121.57699,37.74151],[-121.57549,37.74165],[-121.57404,37.74174],[-121.57354,37.7417],[-121.57252,37.74172],[-121.57214,37.74174],[-121.57058,37.7418],[-121.56971,37.74184],[-121.56865,37.74181],[-121.56758,37.74173],[-121.56489,37.74135],[-121.56302,37.74109],[-121.56221,37.74095],[-121.5614,37.74078],[-121.56073,37.74056],[-121.55986,37.74024],[-121.55903,37.73988],[-121.55826,37.73941],[-121.55758,37.73898],[-121.55709,37.7386],[-121.55634,37.73797],[-121.555,37.73686],[-121.55276,37.73496],[-121.55201,37.73431],[-121.55144,37.73377],[-121.55082,37.73325],[-121.54851,37.73114],[-121.54699,37.72981],[-121.54385,37.72699],[-121.54214,37.72543],[-121.54155,37.72493],[-121.54016,37.72363],[-121.53876,37.72237],[-121.53682,37.72064],[-121.53606,37.72001],[-121.53491,37.71918],[-121.5334,37.71816],[-121.53234,37.71749],[-121.53164,37.71706],[-121.53038,37.71631],[-121.52796,37.71483],[-121.5251,37.71311],[-121.52439,37.71267],[-121.52154,37.71095],[-121.51694,37.70821],[-121.51561,37.70738],[-121.51502,37.70701],[-121.51391,37.70634],[-121.51368,37.7062],[-121.51123,37.70472],[-121.5091,37.70345],[-121.50801,37.70279],[-121.50739,37.70243],[-121.50666,37.70199],[-121.50616,37.70168],[-121.50328,37.69991],[-121.50299,37.69975],[-121.49915,37.69745],[-121.49459,37.69464],[-121.49229,37.69325],[-121.48998,37.69188],[-121.48278,37.68753],[-121.48017,37.68596],[-121.47996,37.68583],[-121.47803,37.68468],[-121.4753,37.68305],[-121.47446,37.68253],[-121.47219,37.68117],[-121.46815,37.67871],[-121.4649,37.67674],[-121.46394,37.67615],[-121.46006,37.67375],[-121.45916,37.67324],[-121.45506,37.67072],[-121.45378,37.66995],[-121.45341,37.66975],[-121.45251,37.66922],[-121.45088,37.66821],[-121.44996,37.66766],[-121.44892,37.667],[-121.44598,37.66521],[-121.4401,37.6617],[-121.43935,37.66122],[-121.43852,37.66073],[-121.43596,37.65917],[-121.42303,37.65133],[-121.42122,37.65022],[-121.4198,37.64937],[-121.41444,37.6461],[-121.40338,37.63941],[-121.40296,37.63915],[-121.402,37.63857],[-121.39527,37.63449],[-121.39397,37.63369],[-121.39081,37.63179],[-121.38578,37.62874],[-121.38456,37.628],[-121.38393,37.62765],[-121.38154,37.62618],[-121.3795,37.62496],[-121.37853,37.62435],[-121.37613,37.62291],[-121.37414,37.62168],[-121.37356,37.62131],[-121.37263,37.62068],[-121.37197,37.62021],[-121.37053,37.61918],[-121.36953,37.61839],[-121.36507,37.61495],[-121.365,37.61489],[-121.3647,37.61465],[-121.36248,37.61293],[-121.36141,37.61213],[-121.35369,37.60619],[-121.35321,37.60582],[-121.34924,37.60277],[-121.3454,37.59982],[-121.34328,37.59816],[-121.3403,37.59589],[-121.33796,37.59404],[-121.33769,37.59384],[-121.33331,37.59045],[-121.33104,37.58872],[-121.32881,37.58699],[-121.32757,37.58605],[-121.32624,37.58502],[-121.32361,37.58299],[-121.31983,37.58008],[-121.31956,37.57987],[-121.30514,37.56876],[-121.30116,37.56572],[-121.30084,37.56546],[-121.29891,37.56396],[-121.29641,37.56203],[-121.29456,37.56059],[-121.29333,37.55966],[-121.28332,37.55193],[-121.27876,37.54842],[-121.27073,37.54223],[-121.26899,37.54087],[-121.2687,37.54064],[-121.26803,37.54013],[-121.26766,37.53985],[-121.26634,37.53884],[-121.26581,37.53844],[-121.26472,37.53759],[-121.26326,37.53647],[-121.2601,37.53401],[-121.25921,37.5333],[-121.25822,37.53247],[-121.25533,37.53001],[-121.25471,37.52949],[-121.25034,37.52577],[-121.2475,37.52336],[-121.2436,37.52006],[-121.23877,37.51595],[-121.23859,37.5158],[-121.23522,37.51293],[-121.23042,37.50885],[-121.22808,37.50685],[-121.22448,37.50386],[-121.22375,37.5033],[-121.22209,37.50207],[-121.21723,37.49851],[-121.21236,37.49494],[-121.21156,37.49429],[-121.21062,37.49347],[-121.20853,37.49143],[-121.20832,37.49121],[-121.20417,37.4871],[-121.19645,37.47944],[-121.19625,37.47924],[-121.19064,37.47368],[-121.18928,37.47231],[-121.18842,37.47151],[-121.1877,37.47071],[-121.18691,37.46991],[-121.1861,37.46903],[-121.18551,37.46845],[-121.18495,37.46794],[-121.18358,37.46662],[-121.18259,37.46562],[-121.18066,37.46374],[-121.18043,37.46347],[-121.17982,37.46279],[-121.17924,37.46209],[-121.17867,37.46135],[-121.17806,37.46045],[-121.17744,37.45956],[-121.17512,37.4563],[-121.1738,37.45436],[-121.17313,37.45341],[-121.17241,37.45246],[-121.17205,37.45201],[-121.17175,37.45157],[-121.17146,37.45108],[-121.17055,37.44982],[-121.16986,37.44886],[-121.16928,37.44804],[-121.16819,37.4467],[-121.16754,37.44591],[-121.16437,37.44157],[-121.16381,37.44079],[-121.16269,37.43923],[-121.16182,37.43794],[-121.16081,37.43613],[-121.15938,37.43339],[-121.15854,37.43143],[-121.15748,37.42949],[-121.1563,37.42721],[-121.15571,37.42589],[-121.15441,37.42324],[-121.15412,37.42267],[-121.15336,37.42113],[-121.15315,37.42077],[-121.15081,37.41608],[-121.15021,37.41488],[-121.1494,37.41343],[-121.14858,37.41203],[-121.14738,37.41018],[-121.14594,37.40812],[-121.14475,37.40642],[-121.14296,37.40385],[-121.14082,37.40079],[-121.13859,37.39758],[-121.13832,37.39719],[-121.13708,37.39543],[-121.13626,37.39423],[-121.13577,37.39355],[-121.13454,37.39176],[-121.13183,37.38789],[-121.13059,37.38607],[-121.13028,37.38555],[-121.12987,37.38485],[-121.12939,37.38393],[-121.12882,37.3826],[-121.12787,37.3797],[-121.12697,37.37698],[-121.12499,37.37091],[-121.12232,37.3627],[-121.11831,37.35045],[-121.11783,37.34905],[-121.11765,37.34843],[-121.11698,37.34621],[-121.11623,37.34386],[-121.11594,37.3431],[-121.11572,37.34243],[-121.11482,37.33981],[-121.1145,37.33893],[-121.11372,37.33626],[-121.11283,37.3336],[-121.11141,37.32926],[-121.11117,37.32849],[-121.11102,37.32805],[-121.10971,37.32399],[-121.10926,37.32264],[-121.10802,37.31899],[-121.10792,37.31865],[-121.10756,37.31718],[-121.10735,37.31645],[-121.10711,37.31572],[-121.10647,37.31362],[-121.10584,37.31152],[-121.10508,37.30864],[-121.104,37.30441],[-121.10391,37.30407],[-121.10382,37.30379],[-121.10314,37.30064],[-121.10287,37.29974],[-121.10227,37.29768],[-121.0985,37.28281],[-121.09845,37.28258],[-121.09569,37.27185],[-121.09449,37.26702],[-121.09411,37.26577],[-121.09285,37.26087],[-121.09211,37.25785],[-121.09075,37.25265],[-121.09033,37.25098],[-121.09008,37.25],[-121.08909,37.24612],[-121.08854,37.24395],[-121.08823,37.24274],[-121.08811,37.24229],[-121.08788,37.24138],[-121.08756,37.24013],[-121.08723,37.23885],[-121.08687,37.23741],[-121.08654,37.23617],[-121.08634,37.23535],[-121.08602,37.23411],[-121.0857,37.23288],[-121.08541,37.23176],[-121.08521,37.23097],[-121.08487,37.22966],[-121.08426,37.2272],[-121.08392,37.22592],[-121.0837,37.22505],[-121.08327,37.22338],[-121.08294,37.2221],[-121.08262,37.22083],[-121.08232,37.21965],[-121.08209,37.21874],[-121.08189,37.21797],[-121.08106,37.21472],[-121.08073,37.21342],[-121.08039,37.21207],[-121.08006,37.21083],[-121.07972,37.20952],[-121.0791,37.20704],[-121.07862,37.20515],[-121.07802,37.20285],[-121.07772,37.20167],[-121.07739,37.20041],[-121.07723,37.19984],[-121.07705,37.19928],[-121.07685,37.19876],[-121.07657,37.19803],[-121.076,37.19681],[-121.0753,37.19555],[-121.07445,37.19421],[-121.07362,37.19294],[-121.07195,37.19039],[-121.07111,37.18912],[-121.0699,37.18726],[-121.06907,37.186],[-121.06823,37.18471],[-121.06743,37.18348],[-121.06652,37.18207],[-121.06576,37.18093],[-121.06492,37.17966],[-121.06351,37.17748],[-121.06335,37.17724],[-121.06286,37.17646],[-121.06202,37.17517],[-121.06122,37.17398],[-121.06041,37.17274],[-121.05959,37.17147],[-121.05876,37.17023],[-121.05788,37.16888],[-121.05748,37.16829],[-121.05611,37.16616],[-121.05541,37.16507],[-121.05463,37.16388],[-121.05376,37.1626],[-121.05298,37.16138],[-121.05219,37.16017],[-121.05147,37.15912],[-121.05118,37.15864],[-121.05084,37.15813],[-121.04793,37.15367],[-121.04724,37.1526],[-121.04675,37.15187],[-121.04598,37.15069],[-121.04515,37.14941],[-121.04435,37.1482],[-121.04365,37.14711],[-121.04234,37.14512],[-121.04186,37.14436],[-121.0402,37.14184],[-121.03779,37.13815],[-121.03698,37.13691],[-121.03549,37.13461],[-121.03443,37.133],[-121.03293,37.1307],[-121.03235,37.1298],[-121.03221,37.12959],[-121.0321,37.12942],[-121.03159,37.12865],[-121.03101,37.12776],[-121.0305,37.12699],[-121.02956,37.12554],[-121.02904,37.12476],[-121.02869,37.1242],[-121.02843,37.12378],[-121.02761,37.12255],[-121.02586,37.11991],[-121.02344,37.11615],[-121.02269,37.11501],[-121.02172,37.11357],[-121.02066,37.11206],[-121.01963,37.11076],[-121.01879,37.10971],[-121.01805,37.1088],[-121.01782,37.10854],[-121.01563,37.10581],[-121.01502,37.10506],[-121.01466,37.10464],[-121.01431,37.1042],[-121.01213,37.10155],[-121.01179,37.10113],[-121.00716,37.09546],[-121.00671,37.0949],[-121.00613,37.09421],[-121.00541,37.09336],[-121.00479,37.09265],[-121.00372,37.0915],[-121.00263,37.09036],[-120.99893,37.08655],[-120.99319,37.08062],[-120.99293,37.08034],[-120.99257,37.07996],[-120.99202,37.07938],[-120.99037,37.07767],[-120.99017,37.07748],[-120.98512,37.07226],[-120.98096,37.06797],[-120.97984,37.06682],[-120.97295,37.0597],[-120.97065,37.05731],[-120.97047,37.05709],[-120.97037,37.05699],[-120.96977,37.05639],[-120.96817,37.05476],[-120.96624,37.05278],[-120.96064,37.04696],[-120.96035,37.04668],[-120.95816,37.0444],[-120.95254,37.03858],[-120.94742,37.03336],[-120.94288,37.02866],[-120.94263,37.02839],[-120.94223,37.02799],[-120.94065,37.02636],[-120.93988,37.02557],[-120.93911,37.02481],[-120.93799,37.02359],[-120.93766,37.02324],[-120.93664,37.02219],[-120.93588,37.02142],[-120.93548,37.02101],[-120.93513,37.02064],[-120.9332,37.01864],[-120.93237,37.01777],[-120.93051,37.01587],[-120.92896,37.01425],[-120.92875,37.01404],[-120.92666,37.01187],[-120.92566,37.01083],[-120.92415,37.00927],[-120.92317,37.00823],[-120.92266,37.00772],[-120.92202,37.00708],[-120.92102,37.00606],[-120.91943,37.0044],[-120.91887,37.00381],[-120.91729,37.00219],[-120.91658,37.00144],[-120.91568,37.00041],[-120.91425,36.99876],[-120.91303,36.99743],[-120.911,36.99511],[-120.91003,36.99401],[-120.90952,36.99336],[-120.9086,36.99228],[-120.90772,36.9913],[-120.90684,36.99033],[-120.9061,36.98946],[-120.90369,36.98669],[-120.90263,36.98555],[-120.9014,36.98413],[-120.90032,36.9829],[-120.89849,36.98078],[-120.89748,36.97958],[-120.89524,36.97702],[-120.89353,36.9751],[-120.89295,36.97444],[-120.89198,36.97333],[-120.89021,36.97131],[-120.88997,36.97103],[-120.88969,36.97073],[-120.88919,36.97022],[-120.88873,36.96977],[-120.8884,36.96945],[-120.888,36.9691],[-120.88754,36.96867],[-120.88724,36.96842],[-120.88675,36.96802],[-120.8862,36.96756],[-120.88511,36.96667],[-120.88267,36.96468],[-120.88085,36.96319],[-120.87963,36.96219],[-120.87909,36.96175],[-120.87843,36.9612],[-120.87384,36.95746],[-120.87348,36.95716],[-120.87305,36.95682],[-120.87239,36.95623],[-120.8697,36.95407],[-120.86857,36.95314],[-120.86715,36.95198],[-120.86642,36.95138],[-120.86556,36.9507],[-120.86486,36.95012],[-120.86438,36.94972],[-120.86374,36.94922],[-120.86324,36.94878],[-120.86258,36.94825],[-120.86228,36.94801],[-120.86089,36.94688],[-120.86016,36.94628],[-120.85996,36.94612],[-120.85976,36.94596],[-120.85955,36.94578],[-120.85913,36.94544],[-120.85892,36.94527],[-120.85867,36.94506],[-120.85817,36.94466],[-120.85791,36.94444],[-120.85748,36.94409],[-120.8572,36.94386],[-120.85692,36.94364],[-120.85669,36.94345],[-120.85654,36.94332],[-120.85637,36.94319],[-120.85596,36.94286],[-120.85487,36.94194],[-120.85433,36.9415],[-120.85203,36.93959],[-120.84962,36.93763],[-120.84782,36.93615],[-120.8474,36.93586],[-120.84678,36.93535],[-120.84621,36.93488],[-120.8455,36.93429],[-120.8447,36.93362],[-120.84431,36.9333],[-120.84361,36.93272],[-120.84208,36.93147],[-120.84189,36.93131],[-120.84147,36.93092],[-120.83943,36.92911],[-120.83859,36.92833],[-120.8375,36.92726],[-120.83743,36.92719],[-120.83642,36.92622],[-120.83557,36.9254],[-120.83344,36.92326],[-120.83255,36.92242],[-120.83205,36.92192],[-120.8306,36.92047],[-120.83019,36.92008],[-120.82904,36.91892],[-120.8283,36.91823],[-120.82798,36.9179],[-120.8275,36.91745],[-120.82721,36.91719],[-120.82692,36.91696],[-120.82681,36.91685],[-120.82661,36.91666],[-120.82632,36.91637],[-120.8254,36.91555],[-120.82437,36.91462],[-120.82406,36.91435],[-120.8225,36.91296],[-120.82207,36.91259],[-120.82172,36.91227],[-120.8213,36.91192],[-120.82097,36.91161],[-120.8206,36.91127],[-120.82035,36.91102],[-120.81999,36.91069],[-120.81947,36.91017],[-120.81908,36.9098],[-120.81858,36.90927],[-120.81832,36.90901],[-120.81769,36.90832],[-120.81704,36.90757],[-120.81615,36.90652],[-120.81532,36.9056],[-120.81166,36.90141],[-120.80618,36.89511],[-120.80431,36.89298],[-120.80288,36.89131],[-120.80267,36.89108],[-120.80234,36.8907],[-120.8003,36.88817],[-120.79876,36.88605],[-120.79722,36.88376],[-120.79578,36.88167],[-120.79406,36.87919],[-120.79228,36.87664],[-120.79074,36.87436],[-120.78925,36.87219],[-120.78781,36.8701],[-120.78556,36.86687],[-120.78427,36.86497],[-120.7829,36.86296],[-120.78126,36.86058],[-120.78073,36.85982],[-120.78051,36.8595],[-120.7795,36.85807],[-120.7782,36.85616],[-120.77733,36.85495],[-120.77697,36.85441],[-120.77645,36.85365],[-120.77303,36.8487],[-120.77251,36.84795],[-120.76374,36.83521],[-120.74303,36.80509],[-120.74273,36.80466],[-120.72679,36.78147],[-120.72324,36.77627],[-120.72167,36.774],[-120.71317,36.76154],[-120.70986,36.75672],[-120.68493,36.72037],[-120.68046,36.71421],[-120.67422,36.70618],[-120.67116,36.70219],[-120.67008,36.7008],[-120.66602,36.69546],[-120.66249,36.69091],[-120.66021,36.6879],[-120.65985,36.68745],[-120.65832,36.68547],[-120.65698,36.68369],[-120.65676,36.68337],[-120.65631,36.68285],[-120.65118,36.67616],[-120.65078,36.67564],[-120.65003,36.67468],[-120.64267,36.66504],[-120.64064,36.66244],[-120.63842,36.65957],[-120.63269,36.65207],[-120.63234,36.65162],[-120.62565,36.6429],[-120.62536,36.64252],[-120.62066,36.63639],[-120.62033,36.63596],[-120.61537,36.62943],[-120.61239,36.62555],[-120.61103,36.62396],[-120.60971,36.62262],[-120.6083,36.62145],[-120.60588,36.61957],[-120.6021,36.61676],[-120.59527,36.61159],[-120.58953,36.60727],[-120.58897,36.60686],[-120.58805,36.60617],[-120.58741,36.6057],[-120.58553,36.60429],[-120.58462,36.60362],[-120.58368,36.60287],[-120.5832,36.6025],[-120.58153,36.60128],[-120.5748,36.59617],[-120.54183,36.57127],[-120.53884,36.56901],[-120.53545,36.56646],[-120.51828,36.55349],[-120.51262,36.54921],[-120.50984,36.5471],[-120.50669,36.54473],[-120.5043,36.54293],[-120.50139,36.54071],[-120.49729,36.53762],[-120.49478,36.53573],[-120.49403,36.53515],[-120.49154,36.53327],[-120.49114,36.53295],[-120.48942,36.53166],[-120.48797,36.53059],[-120.48649,36.52947],[-120.48612,36.52919],[-120.4855,36.52871],[-120.48509,36.5284],[-120.48205,36.52609],[-120.47572,36.5213],[-120.47362,36.51948],[-120.47165,36.51752],[-120.46698,36.51295],[-120.4599,36.50593],[-120.45079,36.49684],[-120.45003,36.49607],[-120.44927,36.49534],[-120.44828,36.49432],[-120.44598,36.49169],[-120.44185,36.48697],[-120.43827,36.48276],[-120.43359,36.47758],[-120.43165,36.47569],[-120.43079,36.4748],[-120.42805,36.47191],[-120.42635,36.47018],[-120.41944,36.4629],[-120.41388,36.45713],[-120.41126,36.45434],[-120.41093,36.454],[-120.40788,36.45072],[-120.4026,36.44488],[-120.40046,36.44251],[-120.39655,36.43814],[-120.39568,36.43716],[-120.3953,36.43675],[-120.39377,36.43507],[-120.39262,36.43381],[-120.39186,36.43291],[-120.39157,36.4326],[-120.38993,36.43073],[-120.38544,36.42569],[-120.37927,36.4188],[-120.37897,36.41842],[-120.37765,36.41703],[-120.37445,36.41343],[-120.37064,36.40915],[-120.3672,36.40529],[-120.36145,36.3989],[-120.36114,36.39854],[-120.35705,36.394],[-120.35288,36.38929],[-120.34965,36.38573],[-120.34544,36.381],[-120.34087,36.37589],[-120.33639,36.37089],[-120.33377,36.36796],[-120.32968,36.36339],[-120.32564,36.35887],[-120.31991,36.35244],[-120.31956,36.35206],[-120.31699,36.34918],[-120.31344,36.34518],[-120.3109,36.34236],[-120.30764,36.33869],[-120.30456,36.33525],[-120.30025,36.33042],[-120.29536,36.32475],[-120.28988,36.31816],[-120.2858,36.31333],[-120.28288,36.30989],[-120.27967,36.30641],[-120.27633,36.30264],[-120.27276,36.29874],[-120.27129,36.29705],[-120.27086,36.29653],[-120.2702,36.29558],[-120.26893,36.29353],[-120.26759,36.29147],[-120.2673,36.29102],[-120.26423,36.28615],[-120.25735,36.27529],[-120.25612,36.27327],[-120.24643,36.2579],[-120.24319,36.25276],[-120.24188,36.25069],[-120.24099,36.24927],[-120.24026,36.24814],[-120.23476,36.23939],[-120.2298,36.23156],[-120.2295,36.23105],[-120.22041,36.21657],[-120.21612,36.20973],[-120.21146,36.20234],[-120.20707,36.19539],[-120.19842,36.18165],[-120.19814,36.1812],[-120.1972,36.1797],[-120.19644,36.17869],[-120.19571,36.17776],[-120.19485,36.17681],[-120.19433,36.17624],[-120.18584,36.16698],[-120.18527,36.16635],[-120.16213,36.14107],[-120.15745,36.13593],[-120.15711,36.13556],[-120.1346,36.11096],[-120.12485,36.1003],[-120.11877,36.09362],[-120.11845,36.09328],[-120.11832,36.09314],[-120.11287,36.08715],[-120.11194,36.08612],[-120.10633,36.08003],[-120.10518,36.07896],[-120.10453,36.07841],[-120.10392,36.07794],[-120.10322,36.07742],[-120.10252,36.07694],[-120.10192,36.07655],[-120.10078,36.07586],[-120.09905,36.07483],[-120.0984,36.07441],[-120.0954,36.07261],[-120.09261,36.07094],[-120.08976,36.06921],[-120.08674,36.06742],[-120.08371,36.06557],[-120.07771,36.06196],[-120.07325,36.05927],[-120.0708,36.05778],[-120.06761,36.05587],[-120.06401,36.05371],[-120.06104,36.0519],[-120.05837,36.0503],[-120.05666,36.04927],[-120.05404,36.04769],[-120.05258,36.04682],[-120.04582,36.0431],[-120.04166,36.04079],[-120.03827,36.03891],[-120.03453,36.03686],[-120.03118,36.03504],[-120.02769,36.0331],[-120.02502,36.03164],[-120.02304,36.03047],[-120.02138,36.02945],[-120.01969,36.02837],[-120.01862,36.02769],[-120.0175,36.02692],[-120.01583,36.02588],[-120.01421,36.02483],[-120.01318,36.02415],[-120.01116,36.02286],[-120.00992,36.02205],[-120.00816,36.02094],[-120.00395,36.01821],[-120.00009,36.01572],[-119.99922,36.01515],[-119.99767,36.01416],[-119.99617,36.0132],[-119.99411,36.01191],[-119.99218,36.01062],[-119.9893,36.00879],[-119.98863,36.00839],[-119.98811,36.00803],[-119.98772,36.00776],[-119.98724,36.00742],[-119.9868,36.00707],[-119.98624,36.00662],[-119.98572,36.00618],[-119.98542,36.00589],[-119.98496,36.00547],[-119.98453,36.00506],[-119.98399,36.00455],[-119.98352,36.0041],[-119.98313,36.00371],[-119.98286,36.00346],[-119.98264,36.00324],[-119.9821,36.00271],[-119.98172,36.00232],[-119.98152,36.00211],[-119.98078,36.00143],[-119.98024,36.00089],[-119.97971,36.0004],[-119.97844,35.99914],[-119.97639,35.99708],[-119.97539,35.99613],[-119.97458,35.99535],[-119.97382,35.9946],[-119.97334,35.99412],[-119.97275,35.99358],[-119.9724,35.99325],[-119.96679,35.98774],[-119.96316,35.98421],[-119.96076,35.98187],[-119.96011,35.98124],[-119.95783,35.97904],[-119.95681,35.97797],[-119.94846,35.96985],[-119.94666,35.9681],[-119.94592,35.96739],[-119.94454,35.96604],[-119.94275,35.96427],[-119.94181,35.96336],[-119.94127,35.96283],[-119.93535,35.95713],[-119.93017,35.95201],[-119.92864,35.95053],[-119.92566,35.94767],[-119.92255,35.94457],[-119.92052,35.94259],[-119.91941,35.94152],[-119.91828,35.9404],[-119.91655,35.93873],[-119.9155,35.93771],[-119.91516,35.9374],[-119.91453,35.93685],[-119.91387,35.9362],[-119.91243,35.9347],[-119.91087,35.93325],[-119.91037,35.93275],[-119.90985,35.93219],[-119.90898,35.93132],[-119.90544,35.92787],[-119.90192,35.92443],[-119.89657,35.91919],[-119.89414,35.9168],[-119.89162,35.91436],[-119.88977,35.91253],[-119.88756,35.91036],[-119.88565,35.90848],[-119.88375,35.90667],[-119.88298,35.90592],[-119.88214,35.90509],[-119.87987,35.90287],[-119.87857,35.90163],[-119.87684,35.89994],[-119.87565,35.89878],[-119.87433,35.89746],[-119.87268,35.89586],[-119.87165,35.89485],[-119.87072,35.89396],[-119.86951,35.89276],[-119.8688,35.89208],[-119.86691,35.89022],[-119.86583,35.88914],[-119.86339,35.88665],[-119.86136,35.88447],[-119.85757,35.88047],[-119.85564,35.87843],[-119.85308,35.87577],[-119.85118,35.87378],[-119.84943,35.87191],[-119.84898,35.87146],[-119.84514,35.86743],[-119.84246,35.86453],[-119.84159,35.8636],[-119.83733,35.85912],[-119.8338,35.85536],[-119.83001,35.85134],[-119.82596,35.84647],[-119.82326,35.84316],[-119.82144,35.84098],[-119.81969,35.83877],[-119.81442,35.83227],[-119.78278,35.78987],[-119.77537,35.77997],[-119.75825,35.75702],[-119.74235,35.73574],[-119.73702,35.72866],[-119.73027,35.71949],[-119.71769,35.70258],[-119.69062,35.6663],[-119.65687,35.62089],[-119.65121,35.61329],[-119.64662,35.60706],[-119.64579,35.60601],[-119.64516,35.60528],[-119.64453,35.60461],[-119.64379,35.60381],[-119.64304,35.60305],[-119.64027,35.60017],[-119.6387,35.59856],[-119.63396,35.59362],[-119.62672,35.58603],[-119.6138,35.5725],[-119.61075,35.56948],[-119.60724,35.56625],[-119.59628,35.55629],[-119.58664,35.54743],[-119.57178,35.5337],[-119.56671,35.52914],[-119.55891,35.52187],[-119.55165,35.51525],[-119.5441,35.50829],[-119.53946,35.50406],[-119.5377,35.50243],[-119.53414,35.49915],[-119.53279,35.49791],[-119.53036,35.49568],[-119.52924,35.49477],[-119.52876,35.49439],[-119.52819,35.49395],[-119.52687,35.49296],[-119.51708,35.48588],[-119.50384,35.47627],[-119.47787,35.4574],[-119.4756,35.45581],[-119.47053,35.45207],[-119.4643,35.44757],[-119.45779,35.44282],[-119.45624,35.44168],[-119.45276,35.43915],[-119.42732,35.42065],[-119.42179,35.41663],[-119.41986,35.41521],[-119.40235,35.40237],[-119.39948,35.40023],[-119.39893,35.39983],[-119.3978,35.399],[-119.39695,35.39841],[-119.39504,35.39702],[-119.38732,35.39139],[-119.38137,35.38709],[-119.37626,35.38341],[-119.37108,35.37971],[-119.36665,35.37647],[-119.36244,35.37346],[-119.35809,35.3704],[-119.35351,35.36716],[-119.34909,35.36402],[-119.34346,35.36002],[-119.34003,35.35763],[-119.33971,35.35734],[-119.33947,35.35714],[-119.3391,35.35685],[-119.33868,35.35646],[-119.33847,35.35624],[-119.33829,35.35598],[-119.33818,35.35571],[-119.33811,35.35543],[-119.3381,35.355],[-119.3381,35.35494],[-119.33751,35.35495],[-119.33667,35.35495],[-119.33541,35.35495],[-119.33463,35.35494],[-119.33381,35.35488],[-119.33305,35.35486],[-119.33222,35.35484],[-119.33058,35.35485],[-119.3236,35.35481],[-119.30562,35.35469],[-119.29678,35.35464],[-119.26946,35.3545],[-119.25213,35.35437],[-119.23705,35.35432],[-119.23434,35.35431],[-119.23212,35.35431],[-119.21655,35.35434],[-119.20764,35.35436],[-119.19875,35.35441],[-119.19595,35.35443],[-119.18988,35.35445],[-119.18748,35.35443],[-119.18426,35.35444],[-119.18098,35.35441],[-119.18024,35.35441],[-119.17922,35.35441],[-119.17824,35.35449],[-119.17701,35.35466],[-119.17583,35.35497],[-119.17501,35.35529],[-119.17448,35.35549],[-119.17032,35.35778],[-119.16879,35.35845],[-119.16728,35.35888],[-119.16562,35.35921],[-119.16441,35.35937],[-119.16298,35.35946],[-119.15483,35.35945],[-119.15348,35.35953],[-119.15226,35.35966],[-119.15082,35.35992],[-119.14553,35.36096],[-119.14248,35.36163],[-119.1413,35.36181],[-119.13973,35.36187],[-119.13819,35.36185],[-119.12644,35.36186],[-119.12329,35.36185],[-119.11929,35.36185],[-119.11481,35.3618],[-119.11303,35.36179],[-119.11066,35.36178],[-119.10857,35.36185],[-119.10171,35.36186],[-119.10033,35.36188],[-119.09934,35.36195],[-119.09824,35.36215],[-119.09741,35.36239],[-119.09673,35.3627],[-119.09595,35.36311],[-119.09524,35.36356],[-119.09467,35.36391],[-119.09401,35.36439],[-119.09354,35.36477],[-119.09331,35.36488],[-119.09312,35.36494],[-119.09287,35.365],[-119.09198,35.36507],[-119.09189,35.36406],[-119.09184,35.36311],[-119.09183,35.363],[-119.09183,35.3629],[-119.09183,35.36267],[-119.09186,35.3624],[-119.0919,35.36204],[-119.09194,35.36189],[-119.09211,35.36125],[-119.09222,35.36079],[-119.09227,35.3605],[-119.09231,35.3602],[-119.09233,35.35992],[-119.09234,35.35957],[-119.09233,35.35895],[-119.09233,35.35794],[-119.09238,35.35445],[-119.09237,35.3543],[-119.09218,35.3543],[-119.09207,35.3543],[-119.0899,35.3543],[-119.08738,35.35429],[-119.08652,35.35429],[-119.08293,35.35428],[-119.08275,35.35428],[-119.07877,35.35426],[-119.07827,35.35426],[-119.07779,35.35427],[-119.07576,35.35425],[-119.07565,35.35425],[-119.07469,35.35425],[-119.07443,35.35424],[-119.07365,35.35423],[-119.07344,35.35423],[-119.07212,35.35423],[-119.06942,35.35421],[-119.06927,35.35421],[-119.06714,35.3542],[-119.06405,35.35419],[-119.06397,35.35419],[-119.06308,35.35419],[-119.06242,35.35417],[-119.06138,35.35416],[-119.06126,35.35416],[-119.06107,35.35416],[-119.06094,35.35416],[-119.05767,35.35416],[-119.05752,35.35415],[-119.0547,35.35415],[-119.05461,35.35415],[-119.05452,35.35415],[-119.0524,35.35413],[-119.05229,35.35413],[-119.05219,35.35413],[-119.05151,35.35413],[-119.05122,35.35412],[-119.05096,35.35413],[-119.05049,35.35414],[-119.04997,35.35412],[-119.04954,35.35412],[-119.04895,35.35412],[-119.04802,35.35412],[-119.04787,35.35411],[-119.04771,35.35411],[-119.04672,35.35411],[-119.04507,35.3541],[-119.04358,35.35409],[-119.04341,35.35409],[-119.04347,35.35399],[-119.04346,35.3528],[-119.0434,35.35269],[-119.0425,35.35268],[-119.04208,35.35266],[-119.04145,35.3526],[-119.0412,35.35258],[-119.04091,35.35256],[-119.04006,35.35256],[-119.03849,35.35255],[-119.03513,35.35253],[-119.03425,35.35251],[-119.02978,35.35247],[-119.02755,35.35246],[-119.02696,35.35246],[-119.02561,35.35245],[-119.02527,35.35245],[-119.02246,35.35243],[-119.01526,35.35238],[-119.01216,35.35236],[-119.01161,35.35235],[-119.00747,35.35233],[-119.00214,35.35227],[-118.99958,35.35227],[-118.99444,35.35226],[-118.99393,35.35226],[-118.98952,35.35227],[-118.98889,35.35228],[-118.98563,35.35227],[-118.98497,35.35227],[-118.98097,35.3523],[-118.97952,35.35229],[-118.97867,35.35229],[-118.97675,35.35228],[-118.97659,35.35228],[-118.97615,35.35229],[-118.97556,35.3523],[-118.97454,35.35233],[-118.97402,35.35236],[-118.9737,35.35238],[-118.97307,35.35242],[-118.97216,35.35249],[-118.97113,35.3526],[-118.97061,35.35265],[-118.96975,35.35272],[-118.9689,35.35278],[-118.96785,35.35285],[-118.96722,35.35287],[-118.9665,35.35287],[-118.9653,35.35289],[-118.96428,35.35285],[-118.96316,35.35279],[-118.96229,35.35274],[-118.96211,35.35273],[-118.96125,35.35268],[-118.96023,35.35262],[-118.95931,35.35257],[-118.95789,35.35247],[-118.9565,35.35237],[-118.95606,35.35234],[-118.95563,35.35232],[-118.95534,35.3523],[-118.9541,35.35223],[-118.95254,35.35215],[-118.95143,35.3521],[-118.95013,35.35208],[-118.94952,35.35208],[-118.94829,35.3521],[-118.94289,35.35211],[-118.94138,35.35212],[-118.94051,35.35213],[-118.93618,35.35213],[-118.92736,35.35219],[-118.9235,35.3522],[-118.92299,35.3522],[-118.92001,35.35223],[-118.91708,35.35223],[-118.91606,35.35221],[-118.91504,35.35218],[-118.9144,35.35215],[-118.91392,35.35211],[-118.91308,35.35206],[-118.90853,35.35173],[-118.90536,35.35153],[-118.90028,35.35118],[-118.89977,35.35113],[-118.89926,35.35106],[-118.89875,35.35099],[-118.89825,35.3509],[-118.89775,35.35079],[-118.89726,35.35068],[-118.89677,35.35055],[-118.89623,35.35039],[-118.88327,35.34658],[-118.88199,35.34618],[-118.88133,35.34599],[-118.88067,35.34582],[-118.87999,35.34567],[-118.87914,35.3455],[-118.87407,35.34471],[-118.87294,35.34453],[-118.8698,35.34402],[-118.86406,35.34311],[-118.86322,35.34296],[-118.86255,35.34283],[-118.86188,35.34268],[-118.86066,35.34238],[-118.85657,35.34139],[-118.85225,35.34035],[-118.84698,35.3391],[-118.8436,35.33827],[-118.84282,35.33808],[-118.83751,35.33682],[-118.82492,35.33377],[-118.81121,35.33044],[-118.80805,35.32969],[-118.80711,35.32947],[-118.80686,35.32941],[-118.80653,35.32932],[-118.8062,35.32924],[-118.80587,35.32914],[-118.80554,35.32904],[-118.80522,35.32894],[-118.8049,35.32883],[-118.80458,35.32872],[-118.80396,35.32849],[-118.80331,35.3282],[-118.80303,35.32807],[-118.80273,35.32792],[-118.80244,35.32777],[-118.80215,35.32762],[-118.80186,35.32746],[-118.80157,35.32729],[-118.80129,35.32712],[-118.80102,35.32695],[-118.80075,35.32677],[-118.80048,35.32659],[-118.80022,35.3264],[-118.79996,35.32621],[-118.7997,35.32602],[-118.79945,35.32581],[-118.79921,35.32561],[-118.79854,35.32503],[-118.79111,35.31864],[-118.78638,35.31449],[-118.7855,35.31376],[-118.78235,35.31101],[-118.77969,35.30873],[-118.7791,35.30822],[-118.77074,35.30097],[-118.77056,35.30082],[-118.76959,35.29997],[-118.76924,35.29973],[-118.76863,35.29929],[-118.76798,35.29887],[-118.76731,35.29846],[-118.76663,35.29808],[-118.76608,35.29779],[-118.76521,35.29736],[-118.76353,35.29666],[-118.76347,35.29664],[-118.75774,35.29439],[-118.75713,35.29415],[-118.75681,35.29403],[-118.75484,35.29326],[-118.75299,35.29252],[-118.75239,35.29227],[-118.74907,35.29097],[-118.74754,35.29035],[-118.74697,35.29012],[-118.74205,35.28813],[-118.73447,35.28511],[-118.73409,35.28493],[-118.73364,35.2847],[-118.733,35.28436],[-118.73059,35.28299],[-118.7281,35.28153],[-118.72548,35.28004],[-118.72441,35.27952],[-118.72316,35.27902],[-118.72176,35.27858],[-118.72017,35.27822],[-118.71982,35.27815],[-118.7194,35.27809],[-118.7178,35.27788],[-118.71727,35.27781],[-118.71695,35.27776],[-118.71623,35.27764],[-118.71551,35.27749],[-118.71485,35.27733],[-118.71451,35.27723],[-118.71354,35.27692],[-118.71294,35.2767],[-118.71237,35.27646],[-118.71185,35.27623],[-118.71132,35.27597],[-118.71074,35.27567],[-118.70719,35.27359],[-118.70683,35.27338],[-118.70636,35.2731],[-118.7044,35.27196],[-118.70232,35.27072],[-118.70009,35.26943],[-118.69997,35.26934],[-118.69975,35.26922],[-118.69952,35.26911],[-118.69923,35.26898],[-118.69869,35.26877],[-118.6984,35.26868],[-118.69771,35.26849],[-118.69726,35.26839],[-118.69671,35.2683],[-118.69638,35.26827],[-118.696,35.26824],[-118.69547,35.26821],[-118.69517,35.26822],[-118.69463,35.26824],[-118.69411,35.26828],[-118.69383,35.26832],[-118.69312,35.26844],[-118.69282,35.26852],[-118.69248,35.26861],[-118.69201,35.26876],[-118.69139,35.26898],[-118.69038,35.26932],[-118.68978,35.26951],[-118.68935,35.26962],[-118.68874,35.26976],[-118.68847,35.26981],[-118.68748,35.26995],[-118.68679,35.27001],[-118.68577,35.27006],[-118.68542,35.27005],[-118.68441,35.27002],[-118.6828,35.26992],[-118.68206,35.26988],[-118.68158,35.26986],[-118.68127,35.26985],[-118.68017,35.26979],[-118.67924,35.2697],[-118.6788,35.26964],[-118.678,35.2695],[-118.67714,35.2693],[-118.6739,35.26837],[-118.67218,35.26784],[-118.66801,35.2666],[-118.66754,35.26646],[-118.66706,35.26632],[-118.66601,35.266],[-118.66213,35.26488],[-118.66116,35.26462],[-118.66021,35.26441],[-118.65952,35.26429],[-118.65834,35.26416],[-118.65792,35.26413],[-118.65565,35.26403],[-118.65517,35.26402],[-118.64781,35.26375],[-118.64632,35.2637],[-118.64574,35.26365],[-118.64546,35.26361],[-118.64491,35.26352],[-118.64396,35.26328],[-118.64237,35.26291],[-118.64191,35.26281],[-118.64122,35.26272],[-118.64073,35.2627],[-118.64034,35.2627],[-118.64004,35.26271],[-118.63973,35.26272],[-118.63945,35.26274],[-118.63927,35.26275],[-118.63909,35.26277],[-118.63892,35.26279],[-118.63854,35.26285],[-118.63545,35.26351],[-118.63509,35.26356],[-118.63475,35.26359],[-118.63378,35.26364],[-118.63322,35.26365],[-118.63049,35.26369],[-118.62989,35.26371],[-118.62851,35.26374],[-118.62807,35.26373],[-118.62784,35.2637],[-118.62756,35.26366],[-118.62741,35.26362],[-118.62729,35.26359],[-118.62637,35.26334],[-118.62499,35.26292],[-118.62467,35.26283],[-118.62416,35.26271],[-118.62355,35.26259],[-118.62251,35.26241],[-118.622,35.26232],[-118.6215,35.2622],[-118.62122,35.26212],[-118.62059,35.26189],[-118.62044,35.26182],[-118.62027,35.26173],[-118.61989,35.26147],[-118.61928,35.26099],[-118.61884,35.26066],[-118.61854,35.26046],[-118.61813,35.26021],[-118.61748,35.25984],[-118.61645,35.2593],[-118.61539,35.25868],[-118.6151,35.2585],[-118.6148,35.25827],[-118.61407,35.25764],[-118.61368,35.25733],[-118.61301,35.25683],[-118.61273,35.25664],[-118.61238,35.25645],[-118.61215,35.25634],[-118.61194,35.25625],[-118.61164,35.25615],[-118.61152,35.25612],[-118.61035,35.25592],[-118.60978,35.25581],[-118.60946,35.25571],[-118.6092,35.25561],[-118.60883,35.25542],[-118.60848,35.25519],[-118.60817,35.25497],[-118.60765,35.25453],[-118.60748,35.2544],[-118.60626,35.25338],[-118.60488,35.25216],[-118.60415,35.25158],[-118.60225,35.25025],[-118.60184,35.24999],[-118.6015,35.24984],[-118.60108,35.24967],[-118.6007,35.24955],[-118.59635,35.24855],[-118.59587,35.2484],[-118.59566,35.24834],[-118.59551,35.24828],[-118.59511,35.24808],[-118.59467,35.24779],[-118.5944,35.24757],[-118.59413,35.24727],[-118.59387,35.24692],[-118.59353,35.24654],[-118.59297,35.24589],[-118.59258,35.2455],[-118.59237,35.24532],[-118.59214,35.24515],[-118.59134,35.24467],[-118.59087,35.2444],[-118.59042,35.24411],[-118.59016,35.24387],[-118.58981,35.24346],[-118.58962,35.24319],[-118.58944,35.24291],[-118.58922,35.24254],[-118.58868,35.24181],[-118.58829,35.24144],[-118.58802,35.24123],[-118.58764,35.24098],[-118.58724,35.24076],[-118.58691,35.24066],[-118.58644,35.24051],[-118.58448,35.24018],[-118.58233,35.23985],[-118.58006,35.23951],[-118.57989,35.23947],[-118.57943,35.23936],[-118.57927,35.23931],[-118.57898,35.2392],[-118.57869,35.23906],[-118.57861,35.23902],[-118.57826,35.23881],[-118.57793,35.23856],[-118.57766,35.23833],[-118.57746,35.2381],[-118.57723,35.23779],[-118.57664,35.23669],[-118.57604,35.23557],[-118.57545,35.23453],[-118.57527,35.23426],[-118.57513,35.23406],[-118.57485,35.23375],[-118.57458,35.2335],[-118.57427,35.23329],[-118.5739,35.23309],[-118.57321,35.23276],[-118.57055,35.23135],[-118.57018,35.23114],[-118.56985,35.23089],[-118.56964,35.23071],[-118.56946,35.23055],[-118.56928,35.23035],[-118.5691,35.2301],[-118.56897,35.22988],[-118.56885,35.22961],[-118.56873,35.22928],[-118.56866,35.22883],[-118.56858,35.22692],[-118.56853,35.22604],[-118.56852,35.22587],[-118.56845,35.22555],[-118.56841,35.22542],[-118.56838,35.22529],[-118.56831,35.2251],[-118.56822,35.22491],[-118.56811,35.22474],[-118.56793,35.22445],[-118.56777,35.22426],[-118.56764,35.22412],[-118.5675,35.22398],[-118.56734,35.22384],[-118.56719,35.22372],[-118.56707,35.22363],[-118.56673,35.22343],[-118.56657,35.22335],[-118.56636,35.22325],[-118.56623,35.2232],[-118.56602,35.22312],[-118.56582,35.22305],[-118.56564,35.22301],[-118.56536,35.22294],[-118.56515,35.2229],[-118.56492,35.22287],[-118.5634,35.22268],[-118.56168,35.22247],[-118.56121,35.22243],[-118.56086,35.22238],[-118.56055,35.22231],[-118.56016,35.22222],[-118.55987,35.22212],[-118.55969,35.22205],[-118.55952,35.22198],[-118.55926,35.22187],[-118.55891,35.2217],[-118.55858,35.2215],[-118.55817,35.2212],[-118.55771,35.22087],[-118.55669,35.22015],[-118.55497,35.21895],[-118.55443,35.21856],[-118.55422,35.21839],[-118.55391,35.21813],[-118.55356,35.21777],[-118.5533,35.21749],[-118.55314,35.21729],[-118.55241,35.21631],[-118.55184,35.21559],[-118.55155,35.21527],[-118.55139,35.21512],[-118.55123,35.215],[-118.5509,35.21478],[-118.55031,35.21445],[-118.5489,35.21373],[-118.54617,35.21233],[-118.54393,35.21123],[-118.54125,35.20985],[-118.54021,35.20935],[-118.53954,35.20909],[-118.53733,35.2083],[-118.53711,35.20822],[-118.53644,35.208],[-118.53572,35.20773],[-118.53539,35.20756],[-118.53496,35.20728],[-118.53322,35.20591],[-118.53113,35.20428],[-118.53033,35.20367],[-118.53011,35.20354],[-118.52899,35.20299],[-118.52827,35.20268],[-118.52485,35.20121],[-118.52367,35.20072],[-118.52217,35.20005],[-118.51991,35.19906],[-118.51953,35.19884],[-118.51921,35.19865],[-118.51887,35.19842],[-118.51359,35.1948],[-118.51058,35.19275],[-118.50658,35.19007],[-118.50624,35.18981],[-118.50592,35.18952],[-118.50587,35.18947],[-118.50551,35.1891],[-118.50539,35.18894],[-118.50464,35.1878],[-118.50421,35.18719],[-118.504,35.18695],[-118.50359,35.18652],[-118.50316,35.18613],[-118.50269,35.18576],[-118.50166,35.18507],[-118.50108,35.18471],[-118.50047,35.18433],[-118.4994,35.18379],[-118.49675,35.18254],[-118.49608,35.18225],[-118.49582,35.18214],[-118.49556,35.18207],[-118.49508,35.18195],[-118.4948,35.1819],[-118.49446,35.18186],[-118.49299,35.18171],[-118.49111,35.18148],[-118.49049,35.18141],[-118.49006,35.18134],[-118.4898,35.1813],[-118.48948,35.18122],[-118.48922,35.18114],[-118.48897,35.18105],[-118.48854,35.18083],[-118.48832,35.18069],[-118.48811,35.18053],[-118.48689,35.17966],[-118.48655,35.17944],[-118.48625,35.17929],[-118.4858,35.17908],[-118.48394,35.17837],[-118.48301,35.17796],[-118.48266,35.17778],[-118.48238,35.1776],[-118.48209,35.17739],[-118.4818,35.17716],[-118.48159,35.17697],[-118.48121,35.17656],[-118.48106,35.17639],[-118.4808,35.176],[-118.48063,35.17571],[-118.47999,35.17465],[-118.47972,35.17423],[-118.47969,35.1742],[-118.47949,35.17393],[-118.47932,35.17372],[-118.47909,35.17349],[-118.47757,35.17218],[-118.47714,35.17179],[-118.47674,35.17139],[-118.47575,35.17037],[-118.47572,35.17033],[-118.47475,35.16934],[-118.47458,35.16915],[-118.47441,35.16896],[-118.47419,35.16867],[-118.47405,35.16843],[-118.47393,35.16818],[-118.47385,35.16797],[-118.47374,35.1675],[-118.4737,35.16701],[-118.47339,35.16416],[-118.47339,35.16408],[-118.47339,35.1639],[-118.47342,35.16344],[-118.47348,35.16307],[-118.47385,35.16183],[-118.47391,35.16162],[-118.474,35.16116],[-118.47402,35.16093],[-118.47403,35.16065],[-118.47396,35.15788],[-118.47395,35.1571],[-118.47394,35.15693],[-118.47388,35.15661],[-118.47379,35.15628],[-118.47367,35.15598],[-118.47356,35.15576],[-118.4706,35.15146],[-118.47053,35.15136],[-118.47012,35.15077],[-118.46989,35.15035],[-118.46971,35.14994],[-118.46962,35.14965],[-118.46957,35.14946],[-118.46949,35.14905],[-118.46948,35.14899],[-118.46947,35.14887],[-118.46946,35.14872],[-118.46946,35.14838],[-118.46946,35.14831],[-118.46948,35.14818],[-118.46953,35.1478],[-118.4697,35.14695],[-118.46978,35.14659],[-118.46987,35.14619],[-118.46993,35.1459],[-118.46996,35.14565],[-118.46998,35.14523],[-118.46995,35.14484],[-118.4699,35.14452],[-118.4698,35.1441],[-118.4697,35.14384],[-118.46961,35.14362],[-118.46944,35.14329],[-118.46927,35.14297],[-118.46902,35.14265],[-118.46884,35.14245],[-118.46842,35.14201],[-118.46814,35.14178],[-118.46781,35.14154],[-118.46754,35.14136],[-118.4673,35.14123],[-118.46702,35.14109],[-118.46662,35.14091],[-118.46626,35.14078],[-118.46582,35.14065],[-118.46533,35.14055],[-118.4644,35.14039],[-118.46348,35.14023],[-118.46132,35.13987],[-118.46058,35.13976],[-118.4599,35.13969],[-118.45923,35.13965],[-118.4581,35.13964],[-118.45558,35.13964],[-118.44595,35.13963],[-118.43658,35.13962],[-118.43606,35.13961],[-118.4354,35.13955],[-118.43485,35.13947],[-118.43424,35.13934],[-118.43357,35.13916],[-118.43318,35.13902],[-118.43241,35.1387],[-118.41476,35.13103],[-118.41446,35.13089],[-118.41419,35.13075],[-118.41381,35.13052],[-118.41339,35.13022],[-118.41308,35.12996],[-118.41282,35.12972],[-118.41249,35.12936],[-118.41222,35.12901],[-118.41204,35.12873],[-118.41188,35.12846],[-118.41172,35.1281],[-118.4116,35.12782],[-118.41127,35.127],[-118.41106,35.12648],[-118.41075,35.1259],[-118.41057,35.12563],[-118.41032,35.12529],[-118.41009,35.12502],[-118.40985,35.12476],[-118.40952,35.12444],[-118.40911,35.1241],[-118.40886,35.12391],[-118.40845,35.12364],[-118.40821,35.1235],[-118.40787,35.12332],[-118.40714,35.12298],[-118.40691,35.12291],[-118.40645,35.12275],[-118.40537,35.12247],[-118.40288,35.1218],[-118.37913,35.1155],[-118.37846,35.11535],[-118.37786,35.11526],[-118.37747,35.11522],[-118.37705,35.11519],[-118.37587,35.11514],[-118.37386,35.11507],[-118.37244,35.11503],[-118.37016,35.11496],[-118.36819,35.1149],[-118.36694,35.11477],[-118.3664,35.11467],[-118.36572,35.1145],[-118.36025,35.11293],[-118.35715,35.11204],[-118.35304,35.11087],[-118.35251,35.11074],[-118.35189,35.11061],[-118.35121,35.11049],[-118.35051,35.11039],[-118.34978,35.11032],[-118.34899,35.11027],[-118.34816,35.11025],[-118.32717,35.11022],[-118.32682,35.11022],[-118.32605,35.11022],[-118.32514,35.11022],[-118.32491,35.11022],[-118.32469,35.11022],[-118.32445,35.11021],[-118.32419,35.11019],[-118.324,35.11017],[-118.3238,35.11015],[-118.3236,35.11013],[-118.32341,35.1101],[-118.32321,35.11006],[-118.32299,35.11001],[-118.32281,35.10997],[-118.32263,35.10993],[-118.3224,35.10986],[-118.32196,35.10974],[-118.32158,35.10959],[-118.32118,35.10942],[-118.32086,35.10927],[-118.32053,35.10909],[-118.31995,35.10871],[-118.31806,35.10743],[-118.31773,35.10721],[-118.31603,35.10605],[-118.31595,35.106],[-118.31529,35.10555],[-118.31522,35.1055],[-118.31455,35.10505],[-118.31447,35.10499],[-118.3139,35.1046],[-118.31379,35.10453],[-118.31258,35.10371],[-118.31185,35.10322],[-118.3112,35.10278],[-118.3108,35.1025],[-118.31046,35.10222],[-118.31027,35.10206],[-118.31008,35.10187],[-118.3097,35.10143],[-118.30952,35.10121],[-118.30935,35.10097],[-118.30865,35.09992],[-118.3084,35.09957],[-118.3082,35.09928],[-118.30797,35.099],[-118.30778,35.09879],[-118.30753,35.09856],[-118.30718,35.09828],[-118.30674,35.09799],[-118.30649,35.09784],[-118.30621,35.09769],[-118.30595,35.09757],[-118.30563,35.09745],[-118.30533,35.09734],[-118.30503,35.09726],[-118.30472,35.09718],[-118.30439,35.09712],[-118.3041,35.09707],[-118.30378,35.09704],[-118.30332,35.09701],[-118.30298,35.09701],[-118.30244,35.09705],[-118.30197,35.09711],[-118.3017,35.09717],[-118.30138,35.09724],[-118.30031,35.0975],[-118.29825,35.09801],[-118.29662,35.09841],[-118.29575,35.09863],[-118.28984,35.10008],[-118.2876,35.10063],[-118.28666,35.10086],[-118.28576,35.10106],[-118.28458,35.10133],[-118.28381,35.10151],[-118.28235,35.10187],[-118.28136,35.10213],[-118.27714,35.10316],[-118.2733,35.10409],[-118.27208,35.10435],[-118.27135,35.10447],[-118.27092,35.10455],[-118.2705,35.10461],[-118.26892,35.10481],[-118.26828,35.10487],[-118.26704,35.10497],[-118.26587,35.10502],[-118.26447,35.10503],[-118.26374,35.10502],[-118.26238,35.10497],[-118.26086,35.10488],[-118.26012,35.10485],[-118.25936,35.10482],[-118.25855,35.10483],[-118.25766,35.10487],[-118.25681,35.10494],[-118.25624,35.105],[-118.25546,35.10512],[-118.25442,35.10532],[-118.2539,35.10544],[-118.25337,35.10557],[-118.25185,35.106],[-118.24996,35.10654],[-118.24934,35.10673],[-118.24884,35.1069],[-118.24835,35.10709],[-118.24772,35.10735],[-118.24645,35.10794],[-118.24423,35.10896],[-118.24091,35.11049],[-118.24008,35.11087],[-118.2388,35.11146],[-118.23727,35.11216],[-118.23659,35.11247],[-118.23536,35.11304],[-118.23393,35.1137],[-118.23058,35.11525],[-118.22712,35.11684],[-118.22668,35.11704],[-118.22625,35.11722],[-118.22579,35.11739],[-118.22542,35.11751],[-118.22507,35.11762],[-118.22473,35.11771],[-118.22418,35.11784],[-118.22371,35.11793],[-118.22329,35.118],[-118.22291,35.11805],[-118.22251,35.11809],[-118.2221,35.11813],[-118.22176,35.11814],[-118.22145,35.11815],[-118.22102,35.11816],[-118.22036,35.11813],[-118.21989,35.11809],[-118.2192,35.11803],[-118.21762,35.11789],[-118.21613,35.11775],[-118.21471,35.11764],[-118.21338,35.11755],[-118.21103,35.11738],[-118.2016,35.11672],[-118.20048,35.11664],[-118.19667,35.11637],[-118.19396,35.11618],[-118.19218,35.11601],[-118.19014,35.11578],[-118.1877,35.11544],[-118.18649,35.11523],[-118.18542,35.11503],[-118.18411,35.11478],[-118.18309,35.11455],[-118.17335,35.11173],[-118.17122,35.11092],[-118.17017,35.1105],[-118.16913,35.11006],[-118.16741,35.10928],[-118.15873,35.10526],[-118.15021,35.10132],[-118.14446,35.09865],[-118.13804,35.09566],[-118.13435,35.09397],[-118.13344,35.09355],[-118.13134,35.09258],[-118.12926,35.09161],[-118.12762,35.09074],[-118.12624,35.08993],[-118.12535,35.08934],[-118.12435,35.08865],[-118.12224,35.08696],[-118.12143,35.08624],[-118.12068,35.08551],[-118.12013,35.08494],[-118.11959,35.08437],[-118.11886,35.0835],[-118.11813,35.08258],[-118.11745,35.08162],[-118.11659,35.0803],[-118.11602,35.0793],[-118.11572,35.07875],[-118.11533,35.07792],[-118.11488,35.07691],[-118.11459,35.07616],[-118.11432,35.07541],[-118.11383,35.07371],[-118.11369,35.07307],[-118.11323,35.07011],[-118.11316,35.06898],[-118.11315,35.06784],[-118.11312,35.06037],[-118.11309,35.05126],[-118.11304,35.05023],[-118.11297,35.04958],[-118.11289,35.04893],[-118.11279,35.04837],[-118.11271,35.04794],[-118.11255,35.04724],[-118.11219,35.04598],[-118.11159,35.04438],[-118.11129,35.04373],[-118.11099,35.0431],[-118.11052,35.04225],[-118.11003,35.04142],[-118.10968,35.04089],[-118.10933,35.04039],[-118.10864,35.03948],[-118.10822,35.03898],[-118.10707,35.03772],[-118.1065,35.03716],[-118.1061,35.03679],[-118.10569,35.03643],[-118.10496,35.03582],[-118.1042,35.03524],[-118.10309,35.03446],[-118.1025,35.03408],[-118.10102,35.03329],[-118.09911,35.03235],[-118.09715,35.03153],[-118.09529,35.03091],[-118.09346,35.03038],[-118.09158,35.03002],[-118.0895,35.02966],[-118.08685,35.02925],[-118.08211,35.02854],[-118.07841,35.02797],[-118.07486,35.02743],[-118.06909,35.02655],[-118.06601,35.02609],[-118.06295,35.02563],[-118.06192,35.02547],[-118.06028,35.02522],[-118.05966,35.02512],[-118.05843,35.02489],[-118.05802,35.0248],[-118.0564,35.02444],[-118.05578,35.02431],[-118.05489,35.02414],[-118.05396,35.02398],[-118.05341,35.0239],[-118.05166,35.02363],[-118.04897,35.02323],[-118.04591,35.02277],[-118.04447,35.02254],[-118.04251,35.02224],[-118.03358,35.02087],[-118.0305,35.02042],[-118.0276,35.01997],[-118.02605,35.01973],[-118.02487,35.01956],[-118.02356,35.01939],[-118.0225,35.0193],[-118.01939,35.01908],[-118.0189,35.01905],[-118.01788,35.01898],[-118.01638,35.01889],[-118.01557,35.01882],[-118.01328,35.01866],[-118.0081,35.0183],[-118.0054,35.01812],[-118.00242,35.01792],[-118.00167,35.01787],[-118.00001,35.01776],[-117.99729,35.01756],[-117.99433,35.01736],[-117.99304,35.01728],[-117.99136,35.01718],[-117.99097,35.01714],[-117.98941,35.01703],[-117.98652,35.0168],[-117.98169,35.01651],[-117.97711,35.01619],[-117.97609,35.01612],[-117.97396,35.01596],[-117.97246,35.01586],[-117.97136,35.01578],[-117.97072,35.01573],[-117.96401,35.01528],[-117.95585,35.01472],[-117.95415,35.0146],[-117.95191,35.01444],[-117.94151,35.01373],[-117.93202,35.01307],[-117.92916,35.01287],[-117.92127,35.01233],[-117.91692,35.01202],[-117.9152,35.01191],[-117.91107,35.01163],[-117.9089,35.01149],[-117.90277,35.01105],[-117.89868,35.01077],[-117.89665,35.01062],[-117.89051,35.0102],[-117.88676,35.00995],[-117.88549,35.00984],[-117.88149,35.00958],[-117.88077,35.00953],[-117.87825,35.00937],[-117.87663,35.00924],[-117.86419,35.00839],[-117.8631,35.00832],[-117.85742,35.00794],[-117.85065,35.00746],[-117.84555,35.0071],[-117.84006,35.00671],[-117.83917,35.00664],[-117.83752,35.00653],[-117.8359,35.00642],[-117.83385,35.00627],[-117.83002,35.006],[-117.82005,35.0053],[-117.8169,35.00507],[-117.8105,35.00463],[-117.80859,35.0045],[-117.80411,35.00421],[-117.79767,35.00375],[-117.79385,35.00349],[-117.79129,35.00329],[-117.78824,35.00308],[-117.77992,35.0025],[-117.77795,35.00238],[-117.77622,35.00239],[-117.77503,35.00247],[-117.77435,35.00252],[-117.77353,35.00262],[-117.77038,35.00298],[-117.76795,35.00324],[-117.76247,35.00392],[-117.75751,35.00448],[-117.75413,35.0049],[-117.75174,35.00518],[-117.75027,35.00537],[-117.74621,35.00583],[-117.74396,35.0061],[-117.74182,35.00636],[-117.74041,35.00654],[-117.73973,35.00662],[-117.73949,35.00664],[-117.73875,35.00668],[-117.73864,35.00669],[-117.73785,35.00671],[-117.73463,35.00668],[-117.73283,35.00667],[-117.72312,35.00664],[-117.72201,35.00665],[-117.71897,35.00665],[-117.71418,35.00664],[-117.71164,35.00661],[-117.70861,35.00661],[-117.70393,35.00661],[-117.70369,35.00661],[-117.70304,35.0066],[-117.7029,35.0066],[-117.70236,35.00659],[-117.70021,35.00658],[-117.69743,35.00658],[-117.69463,35.00657],[-117.69398,35.00656],[-117.69128,35.00658],[-117.69041,35.00656],[-117.68718,35.00656],[-117.67934,35.00653],[-117.67346,35.00652],[-117.67278,35.00651],[-117.66854,35.00648],[-117.66761,35.00648],[-117.66744,35.00649],[-117.66614,35.00654],[-117.66531,35.00663],[-117.66492,35.00668],[-117.6641,35.00681],[-117.66327,35.00698],[-117.66258,35.00714],[-117.662,35.0073],[-117.66148,35.00747],[-117.66036,35.00788],[-117.65761,35.00892],[-117.65681,35.00918],[-117.65651,35.0093],[-117.65627,35.00938],[-117.65536,35.0096],[-117.6548,35.00973],[-117.65433,35.00981],[-117.65312,35.00999],[-117.65267,35.01003],[-117.65206,35.01007],[-117.6515,35.01008],[-117.6509,35.01008],[-117.65026,35.01007],[-117.64948,35.01006],[-117.64887,35.01005],[-117.64776,35.01005],[-117.64767,35.01005],[-117.64632,35.01004],[-117.6447,35.01003],[-117.64209,35.01001],[-117.63519,35.01],[-117.63253,35.00999],[-117.62768,35.00998],[-117.62738,35.00998],[-117.62696,35.00997],[-117.62639,35.00994],[-117.62575,35.00988],[-117.62499,35.00979],[-117.62434,35.00965],[-117.62351,35.00941],[-117.62278,35.00912],[-117.62198,35.00875],[-117.6211,35.00824],[-117.62033,35.00771],[-117.61968,35.00712],[-117.61919,35.00662],[-117.61866,35.00596],[-117.61841,35.00556],[-117.61798,35.00485],[-117.61766,35.00411],[-117.61731,35.00319],[-117.61699,35.00243],[-117.61668,35.00188],[-117.61631,35.00131],[-117.61599,35.00089],[-117.61556,35.00042],[-117.61508,34.99997],[-117.61467,34.99963],[-117.61394,34.99912],[-117.61309,34.99861],[-117.61276,34.99846],[-117.6126,34.99839],[-117.612,34.99814],[-117.61148,34.99794],[-117.61097,34.99777],[-117.61047,34.99765],[-117.60983,34.99753],[-117.60933,34.99744],[-117.60848,34.99734],[-117.60719,34.99726],[-117.60585,34.99718],[-117.59704,34.99669],[-117.59018,34.99631],[-117.5895,34.99622],[-117.58899,34.9961],[-117.58844,34.9959],[-117.5884,34.99587],[-117.58808,34.9957],[-117.58752,34.99533],[-117.5873,34.99518],[-117.5867,34.99486],[-117.58607,34.99463],[-117.58545,34.9945],[-117.58448,34.99443],[-117.58256,34.99434],[-117.58043,34.99426],[-117.57941,34.99422],[-117.57779,34.99412],[-117.5764,34.99407],[-117.57158,34.99384],[-117.56254,34.9934],[-117.56184,34.99336],[-117.55893,34.99321],[-117.5569,34.99311],[-117.55359,34.99295],[-117.55306,34.99293],[-117.54838,34.99269],[-117.54784,34.99267],[-117.54601,34.99257],[-117.54498,34.99251],[-117.54404,34.99247],[-117.5416,34.99235],[-117.53959,34.9922],[-117.53631,34.99188],[-117.53474,34.99173],[-117.52679,34.99092],[-117.52633,34.99088],[-117.5242,34.99066],[-117.52321,34.9906],[-117.52216,34.99054],[-117.51981,34.9904],[-117.51798,34.99029],[-117.51725,34.99026],[-117.51494,34.99011],[-117.51119,34.98989],[-117.5085,34.98974],[-117.50742,34.98968],[-117.50182,34.98934],[-117.49922,34.98919],[-117.49653,34.98904],[-117.4958,34.98896],[-117.4952,34.98886],[-117.49464,34.98869],[-117.49411,34.98851],[-117.48609,34.98437],[-117.47707,34.97968],[-117.46673,34.97432],[-117.45728,34.96944],[-117.45368,34.96758],[-117.44516,34.96319],[-117.44435,34.96283],[-117.44174,34.96175],[-117.44017,34.96108],[-117.43935,34.96066],[-117.43442,34.95806],[-117.43232,34.95703],[-117.42729,34.95438],[-117.42514,34.95327],[-117.42448,34.95293],[-117.42338,34.95237],[-117.42275,34.95204],[-117.42186,34.9515],[-117.42021,34.95053],[-117.4196,34.95019],[-117.41873,34.94972],[-117.4181,34.94944],[-117.41728,34.9491],[-117.41619,34.94868],[-117.4148,34.94819],[-117.40421,34.94481],[-117.40148,34.94387],[-117.39799,34.94265],[-117.39746,34.94248],[-117.38371,34.93814],[-117.37592,34.93567],[-117.37153,34.93426],[-117.37068,34.93399],[-117.36625,34.9326],[-117.36466,34.93208],[-117.36121,34.93103],[-117.35677,34.92959],[-117.35441,34.92884],[-117.34365,34.92542],[-117.34289,34.92521],[-117.34218,34.92503],[-117.34134,34.92487],[-117.34045,34.92473],[-117.33965,34.92465],[-117.33839,34.92457],[-117.32988,34.92433],[-117.3245,34.92417],[-117.31808,34.92398],[-117.31214,34.92382],[-117.30959,34.92377],[-117.30494,34.9236],[-117.30342,34.92352],[-117.30075,34.92334],[-117.29769,34.92322],[-117.2943,34.92311],[-117.29187,34.92305],[-117.28904,34.92295],[-117.28846,34.92293],[-117.27658,34.92258],[-117.26955,34.92236],[-117.26795,34.9223],[-117.26404,34.92219],[-117.26324,34.92217],[-117.26242,34.92215],[-117.26029,34.92209],[-117.25944,34.92208],[-117.25858,34.92212],[-117.25643,34.92227],[-117.25489,34.9223],[-117.25211,34.92223],[-117.25096,34.92218],[-117.25073,34.92218],[-117.25036,34.92216],[-117.24157,34.92192],[-117.23105,34.92177],[-117.22747,34.92175],[-117.22418,34.92174],[-117.2198,34.92172],[-117.21833,34.92171],[-117.21534,34.92168],[-117.21308,34.92167],[-117.21102,34.92168],[-117.20858,34.92169],[-117.20663,34.9217],[-117.20337,34.92171],[-117.19778,34.92171],[-117.19561,34.92171],[-117.19328,34.92175],[-117.18904,34.92174],[-117.18018,34.9219],[-117.17798,34.92191],[-117.17673,34.92193],[-117.17586,34.92194],[-117.1714,34.922],[-117.16262,34.92203],[-117.15821,34.92203],[-117.15377,34.92203],[-117.14488,34.92206],[-117.14292,34.922],[-117.14244,34.92199],[-117.14212,34.92196],[-117.1417,34.92189],[-117.14126,34.92181],[-117.13524,34.92049],[-117.12076,34.91727],[-117.1191,34.9169],[-117.11897,34.91687],[-117.11884,34.91684],[-117.11839,34.91674],[-117.11095,34.91512],[-117.10934,34.91477],[-117.10778,34.91443],[-117.10718,34.91425],[-117.10581,34.91388],[-117.10456,34.91352],[-117.10442,34.91348],[-117.1032,34.91315],[-117.10221,34.91291],[-117.1015,34.91274],[-117.10087,34.91255],[-117.10015,34.91229],[-117.09956,34.91203],[-117.09892,34.9117],[-117.09828,34.91128],[-117.09771,34.91088],[-117.09729,34.91051],[-117.09689,34.91012],[-117.0965,34.90969],[-117.09616,34.90931],[-117.09584,34.90888],[-117.09549,34.90831],[-117.09528,34.90792],[-117.09499,34.90721],[-117.09478,34.90668],[-117.0945,34.90595],[-117.09428,34.90521],[-117.09414,34.90459],[-117.09406,34.90397],[-117.09401,34.90327],[-117.09395,34.90216],[-117.09397,34.89917],[-117.09404,34.8969],[-117.09403,34.89507],[-117.09404,34.89333],[-117.09404,34.89279],[-117.09405,34.89227],[-117.09403,34.89124],[-117.09403,34.89015],[-117.094,34.88963],[-117.09391,34.88912],[-117.09374,34.88851],[-117.09349,34.88789],[-117.09322,34.88742],[-117.09297,34.88698],[-117.09259,34.88639],[-117.09189,34.88551],[-117.09145,34.88496],[-117.09071,34.88424],[-117.09006,34.88364],[-117.08951,34.88311],[-117.08829,34.88194],[-117.08731,34.88101],[-117.08624,34.88002],[-117.08551,34.87926],[-117.08425,34.87806],[-117.08295,34.87677],[-117.08222,34.87608],[-117.08125,34.87513],[-117.08048,34.87434],[-117.0792,34.87311],[-117.07845,34.87241],[-117.0775,34.87153],[-117.07686,34.8709],[-117.07629,34.87043],[-117.07598,34.87022],[-117.07551,34.87001],[-117.07508,34.86987],[-117.07468,34.86979],[-117.07421,34.86975],[-117.07369,34.86973],[-117.07326,34.86977],[-117.07272,34.86988],[-117.07222,34.87007],[-117.07178,34.87028],[-117.07135,34.87057],[-117.07092,34.87096],[-117.07066,34.87131],[-117.07041,34.87177],[-117.07027,34.87223],[-117.07021,34.8727],[-117.07027,34.87325],[-117.07038,34.87417],[-117.07041,34.87482],[-117.07031,34.87535],[-117.0701,34.87582],[-117.06978,34.87628],[-117.06935,34.87678],[-117.06885,34.87726],[-117.06825,34.8778],[-117.06758,34.87846],[-117.06375,34.88175],[-117.06284,34.88251],[-117.0624,34.8828],[-117.06185,34.88311],[-117.06118,34.88342],[-117.0605,34.88369],[-117.06005,34.88384],[-117.05959,34.88398],[-117.05906,34.8841],[-117.05851,34.88421],[-117.05673,34.8845],[-117.05597,34.88462],[-117.05385,34.88492],[-117.05005,34.88533],[-117.0478,34.88557],[-117.04733,34.88562],[-117.04666,34.88569],[-117.04523,34.88584],[-117.04292,34.88596],[-117.03559,34.88597],[-117.02945,34.88592],[-117.02231,34.88584],[-117.01758,34.88581],[-117.01316,34.88581],[-117.01183,34.88578],[-117.01057,34.88583],[-117.00962,34.88594],[-117.00782,34.88623],[-117.00663,34.88642],[-117.00535,34.88656],[-117.00401,34.88664],[-117.00212,34.88664],[-116.9987,34.88662],[-116.99816,34.88661],[-116.99667,34.88658],[-116.99558,34.88652],[-116.99392,34.88636],[-116.99369,34.88633],[-116.99285,34.8862],[-116.99206,34.88606],[-116.9885,34.88521],[-116.97586,34.88196],[-116.97392,34.88144],[-116.97333,34.88125],[-116.97246,34.8809],[-116.97184,34.88062],[-116.97133,34.88036],[-116.97058,34.87992],[-116.97007,34.87958],[-116.96873,34.87857],[-116.96825,34.87822],[-116.96645,34.87686],[-116.96486,34.87563],[-116.96172,34.87323],[-116.95805,34.87042],[-116.9554,34.86887],[-116.95476,34.86858],[-116.95414,34.86832],[-116.9537,34.86816],[-116.95274,34.86785],[-116.95166,34.86755],[-116.93667,34.86445],[-116.9355,34.86421],[-116.93246,34.86358],[-116.93205,34.8635],[-116.9075,34.85835],[-116.90208,34.85731],[-116.89555,34.85595],[-116.89504,34.85584],[-116.88426,34.85362],[-116.88204,34.85316],[-116.87795,34.85231],[-116.87415,34.85152],[-116.86562,34.84977],[-116.85603,34.84778],[-116.85505,34.8476],[-116.85097,34.84706],[-116.82199,34.84336],[-116.80884,34.84172],[-116.80694,34.84148],[-116.80674,34.84145],[-116.80369,34.84106],[-116.80313,34.84099],[-116.79874,34.84043],[-116.79728,34.84025],[-116.79562,34.84004],[-116.79038,34.83936],[-116.78618,34.83884],[-116.7821,34.83831],[-116.78023,34.83808],[-116.77984,34.83803],[-116.77473,34.83737],[-116.76165,34.83571],[-116.76144,34.83568],[-116.75887,34.83538],[-116.75468,34.83502],[-116.74788,34.83443],[-116.74745,34.83439],[-116.73897,34.83368],[-116.73848,34.83364],[-116.71823,34.8319],[-116.71782,34.83184],[-116.70796,34.83101],[-116.70191,34.83048],[-116.7016,34.83045],[-116.69884,34.83021],[-116.6945,34.82983],[-116.69372,34.82976],[-116.69091,34.82952],[-116.6896,34.82941],[-116.68824,34.82926],[-116.6739,34.82747],[-116.6724,34.82728],[-116.67143,34.82712],[-116.66723,34.82638],[-116.66539,34.82605],[-116.66333,34.82568],[-116.65916,34.82494],[-116.65506,34.82421],[-116.65092,34.82347],[-116.64679,34.82273],[-116.64264,34.82199],[-116.63849,34.82125],[-116.6344,34.82051],[-116.63029,34.81978],[-116.62621,34.81905],[-116.62214,34.81832],[-116.61805,34.81759],[-116.61629,34.81727],[-116.614,34.81686],[-116.6121,34.81652],[-116.61142,34.8164],[-116.60654,34.81553],[-116.60337,34.81496],[-116.52948,34.8017],[-116.5262,34.80111],[-116.52201,34.80036],[-116.51795,34.79961],[-116.51383,34.79889],[-116.51075,34.79833],[-116.50663,34.79725],[-116.50284,34.79621],[-116.49465,34.79397],[-116.48773,34.79209],[-116.48677,34.79185],[-116.48575,34.79166],[-116.4776,34.7907],[-116.47197,34.79007],[-116.47121,34.78998],[-116.45725,34.78839],[-116.45296,34.78789],[-116.45256,34.78785],[-116.45112,34.78768],[-116.44808,34.78733],[-116.44701,34.78721],[-116.44458,34.78693],[-116.43628,34.78597],[-116.428,34.78501],[-116.41997,34.78409],[-116.41895,34.78397],[-116.4176,34.78374],[-116.41618,34.78345],[-116.40794,34.78157],[-116.4061,34.78114],[-116.40388,34.78064],[-116.39582,34.77879],[-116.39169,34.77785],[-116.386,34.77655],[-116.38196,34.77564],[-116.37794,34.77471],[-116.37126,34.77317],[-116.37067,34.77304],[-116.3684,34.77251],[-116.36798,34.7724],[-116.36757,34.77227],[-116.36719,34.77216],[-116.36646,34.77191],[-116.36581,34.77166],[-116.36524,34.77143],[-116.36456,34.77111],[-116.36363,34.77065],[-116.36237,34.76991],[-116.36174,34.76948],[-116.361,34.76894],[-116.3594,34.76775],[-116.3554,34.76477],[-116.35186,34.76214],[-116.34788,34.75916],[-116.34704,34.75856],[-116.34677,34.75835],[-116.3441,34.75634],[-116.34018,34.75344],[-116.33805,34.75193],[-116.33656,34.75102],[-116.32911,34.74717],[-116.32196,34.74346],[-116.31513,34.74005],[-116.31364,34.73941],[-116.31236,34.73891],[-116.31136,34.73856],[-116.31046,34.73828],[-116.30893,34.73784],[-116.3078,34.73756],[-116.30533,34.737],[-116.30134,34.73608],[-116.2888,34.73319],[-116.2859,34.73252],[-116.2833,34.73193],[-116.27768,34.73067],[-116.27561,34.73025],[-116.2728,34.72984],[-116.24575,34.72665],[-116.2429,34.72634],[-116.2348,34.72588],[-116.23132,34.72568],[-116.2272,34.72546],[-116.21929,34.72504],[-116.21913,34.72503],[-116.21891,34.72502],[-116.20512,34.72427],[-116.20383,34.7242],[-116.20367,34.7242],[-116.20246,34.72413],[-116.19771,34.72388],[-116.19734,34.72386],[-116.19712,34.72385],[-116.19698,34.72385],[-116.19627,34.72385],[-116.19528,34.72385],[-116.18701,34.72421],[-116.18098,34.7245],[-116.17988,34.72455],[-116.17939,34.72456],[-116.17563,34.72474],[-116.16867,34.72506],[-116.16818,34.72508],[-116.16784,34.72509],[-116.16336,34.7253],[-116.16294,34.72532],[-116.15811,34.72554],[-116.14609,34.72609],[-116.14442,34.72616],[-116.14269,34.72624],[-116.14199,34.72626],[-116.14141,34.72628],[-116.14089,34.72629],[-116.09125,34.72728],[-116.09079,34.72728],[-116.08505,34.7274],[-116.08427,34.7274],[-116.08389,34.72738],[-116.08332,34.72737],[-116.0824,34.7273],[-116.08205,34.72726],[-116.08158,34.7272],[-116.08119,34.72714],[-116.08079,34.72705],[-116.07944,34.72676],[-116.07903,34.72665],[-116.07855,34.72651],[-116.07757,34.72617],[-116.07724,34.72606],[-116.07649,34.72573],[-116.07568,34.72535],[-116.07337,34.72424],[-116.07005,34.72267],[-116.06716,34.72128],[-116.06497,34.72031],[-116.06408,34.71994],[-116.06205,34.71921],[-116.05863,34.71823],[-116.05171,34.71629],[-116.04655,34.71484],[-116.04425,34.71444],[-116.04193,34.71428],[-116.03245,34.71491],[-116.03197,34.71495],[-116.03087,34.71502],[-116.02992,34.71511],[-116.02889,34.71526],[-116.02794,34.71545],[-116.02198,34.71679],[-116.01894,34.71746],[-116.01729,34.71782],[-116.01608,34.71809],[-116.01515,34.7183],[-116.01372,34.71862],[-116.01252,34.71889],[-116.01158,34.71911],[-116.01105,34.71925],[-116.01044,34.71945],[-116.00962,34.71974],[-116.00893,34.72004],[-116.00667,34.721],[-116.00562,34.72144],[-116.00462,34.72178],[-116.00395,34.72196],[-116.00315,34.72214],[-116.00239,34.72227],[-116.00143,34.72238],[-116.0006,34.72243],[-115.99956,34.72243],[-115.99857,34.72237],[-115.9976,34.72224],[-115.99717,34.72216],[-115.99641,34.72201],[-115.99541,34.72174],[-115.99411,34.72132],[-115.99325,34.72107],[-115.9924,34.72087],[-115.99178,34.72074],[-115.9911,34.72062],[-115.9908,34.72056],[-115.99004,34.72045],[-115.98899,34.72034],[-115.98808,34.72029],[-115.98711,34.72026],[-115.98606,34.72027],[-115.98246,34.72041],[-115.98093,34.72047],[-115.97959,34.72051],[-115.97843,34.72057],[-115.9774,34.72066],[-115.97708,34.7207],[-115.97585,34.72084],[-115.96786,34.72196],[-115.96453,34.72244],[-115.96261,34.72272],[-115.96096,34.72295],[-115.95993,34.72308],[-115.95923,34.72317],[-115.95842,34.72326],[-115.95751,34.72335],[-115.95642,34.72343],[-115.95506,34.72351],[-115.95392,34.72354],[-115.95157,34.72361],[-115.94759,34.7237],[-115.94333,34.72381],[-115.94033,34.72388],[-115.93741,34.72396],[-115.93533,34.72401],[-115.93265,34.72407],[-115.92989,34.72413],[-115.92782,34.72418],[-115.92683,34.72421],[-115.92574,34.72427],[-115.92417,34.72443],[-115.92292,34.72463],[-115.92183,34.72482],[-115.92091,34.72501],[-115.91961,34.72535],[-115.91762,34.72596],[-115.9152,34.72678],[-115.91291,34.72756],[-115.91141,34.72805],[-115.90973,34.72854],[-115.90853,34.72882],[-115.90708,34.72913],[-115.90454,34.72966],[-115.90239,34.73014],[-115.90057,34.7306],[-115.89914,34.73099],[-115.89756,34.73146],[-115.89624,34.73189],[-115.89562,34.73209],[-115.89439,34.73249],[-115.89226,34.73321],[-115.89123,34.73351],[-115.89026,34.73376],[-115.88936,34.73395],[-115.88857,34.73409],[-115.88761,34.73424],[-115.88669,34.73436],[-115.88578,34.73444],[-115.8847,34.7345],[-115.88373,34.7345],[-115.88298,34.73449],[-115.882,34.73445],[-115.88108,34.73436],[-115.88019,34.73427],[-115.8793,34.73411],[-115.8781,34.73392],[-115.8768,34.73368],[-115.87542,34.73349],[-115.87401,34.73335],[-115.87282,34.73329],[-115.87142,34.73326],[-115.86904,34.73323],[-115.86813,34.7332],[-115.867,34.73313],[-115.86589,34.73303],[-115.86503,34.73292],[-115.86392,34.73276],[-115.86089,34.73229],[-115.8584,34.7319],[-115.85429,34.73126],[-115.85022,34.73062],[-115.84627,34.73],[-115.84216,34.72936],[-115.83814,34.72872],[-115.83398,34.72807],[-115.83202,34.72775],[-115.82918,34.72732],[-115.82722,34.72702],[-115.82577,34.72675],[-115.8247,34.72653],[-115.82346,34.72623],[-115.82226,34.7259],[-115.82072,34.72541],[-115.81927,34.72493],[-115.81531,34.72363],[-115.81129,34.72232],[-115.81038,34.72203],[-115.80923,34.72164],[-115.80848,34.72141],[-115.80725,34.72105],[-115.80619,34.72076],[-115.80513,34.72053],[-115.80368,34.72023],[-115.80216,34.71999],[-115.80104,34.71985],[-115.79984,34.71974],[-115.79801,34.71964],[-115.79575,34.71953],[-115.79177,34.71936],[-115.79107,34.71931],[-115.79043,34.71927],[-115.78948,34.71921],[-115.7872,34.71911],[-115.78616,34.71902],[-115.78483,34.71889],[-115.78294,34.71862],[-115.78188,34.71847],[-115.77901,34.71798],[-115.77724,34.71769],[-115.77523,34.71741],[-115.7741,34.71728],[-115.77248,34.71712],[-115.77099,34.717],[-115.76983,34.71693],[-115.76844,34.71686],[-115.76707,34.71682],[-115.76289,34.71674],[-115.76106,34.7167],[-115.75881,34.71666],[-115.75466,34.71658],[-115.75266,34.71654],[-115.75058,34.7165],[-115.74649,34.71643],[-115.74466,34.71639],[-115.74278,34.71634],[-115.74244,34.71634],[-115.74085,34.71634],[-115.73943,34.71637],[-115.73696,34.71648],[-115.73482,34.71662],[-115.73075,34.71692],[-115.72661,34.71722],[-115.72546,34.7173],[-115.72517,34.71733],[-115.72429,34.71739],[-115.72049,34.71765],[-115.71724,34.71788],[-115.71305,34.71818],[-115.70895,34.71848],[-115.70794,34.71855],[-115.70752,34.71858],[-115.70081,34.71907],[-115.6991,34.71918],[-115.69781,34.71926],[-115.69268,34.71965],[-115.69201,34.71969],[-115.68938,34.71989],[-115.68731,34.72003],[-115.68561,34.72015],[-115.68443,34.72025],[-115.68174,34.72046],[-115.67863,34.72071],[-115.67818,34.72074],[-115.67093,34.72136],[-115.67055,34.72139],[-115.66685,34.7217],[-115.66521,34.72184],[-115.6624,34.72224],[-115.66045,34.72264],[-115.65802,34.72312],[-115.65688,34.72336],[-115.65601,34.72351],[-115.65477,34.72364],[-115.65361,34.72372],[-115.6446,34.72339],[-115.64158,34.72328],[-115.64086,34.72326],[-115.64007,34.72325],[-115.63934,34.72326],[-115.63868,34.72328],[-115.63829,34.7233],[-115.63767,34.72334],[-115.63595,34.72347],[-115.63211,34.72399],[-115.63051,34.72422],[-115.62409,34.72513],[-115.61886,34.72585],[-115.61621,34.72621],[-115.61051,34.72701],[-115.60194,34.72821],[-115.60165,34.72825],[-115.58936,34.72997],[-115.58413,34.73067],[-115.58182,34.73099],[-115.57968,34.73116],[-115.57661,34.73129],[-115.56417,34.73186],[-115.56203,34.73214],[-115.56078,34.73237],[-115.55899,34.73272],[-115.55819,34.73291],[-115.55691,34.73328],[-115.55617,34.73352],[-115.55543,34.73378],[-115.55399,34.73431],[-115.55267,34.73482],[-115.54913,34.73616],[-115.52818,34.74407],[-115.50239,34.75385],[-115.48644,34.75985],[-115.48297,34.76125],[-115.48074,34.76236],[-115.47919,34.76327],[-115.47268,34.76726],[-115.47216,34.76755],[-115.47075,34.76841],[-115.46674,34.77084],[-115.46552,34.77144],[-115.46434,34.77198],[-115.46322,34.77244],[-115.46038,34.77345],[-115.45794,34.77431],[-115.45515,34.77523],[-115.45447,34.77547],[-115.43171,34.78324],[-115.42369,34.78599],[-115.42318,34.78617],[-115.42161,34.78684],[-115.42082,34.78721],[-115.41874,34.78826],[-115.41244,34.79214],[-115.41197,34.79237],[-115.41089,34.79285],[-115.4093,34.79339],[-115.40706,34.79392],[-115.40305,34.79472],[-115.39972,34.79539],[-115.39925,34.79549],[-115.38745,34.7979],[-115.3857,34.79832],[-115.38345,34.7989],[-115.38143,34.79952],[-115.37895,34.80037],[-115.37647,34.80121],[-115.3749,34.80175],[-115.37439,34.80192],[-115.37352,34.80219],[-115.37249,34.80246],[-115.37157,34.80269],[-115.37088,34.80284],[-115.37021,34.80296],[-115.36931,34.80311],[-115.36828,34.80324],[-115.36632,34.8034],[-115.36602,34.80339],[-115.36546,34.80341],[-115.36115,34.80343],[-115.35754,34.80343],[-115.35701,34.80343],[-115.35546,34.80345],[-115.35462,34.80344],[-115.34975,34.80336],[-115.34615,34.8032],[-115.34557,34.80315],[-115.33475,34.8021],[-115.33081,34.8017],[-115.32858,34.80145],[-115.32794,34.80139],[-115.32666,34.80125],[-115.32468,34.80105],[-115.32311,34.80089],[-115.3208,34.80078],[-115.31993,34.80076],[-115.31895,34.80074],[-115.31785,34.80077],[-115.31708,34.80079],[-115.31465,34.80096],[-115.31403,34.80099],[-115.30754,34.80156],[-115.30665,34.80164],[-115.29263,34.80284],[-115.2917,34.8029],[-115.27913,34.80398],[-115.2778,34.80408],[-115.2771,34.80413],[-115.27591,34.80424],[-115.27219,34.80457],[-115.27013,34.80475],[-115.26845,34.80488],[-115.26175,34.80545],[-115.25752,34.80579],[-115.25658,34.80588],[-115.25557,34.80596],[-115.25501,34.806],[-115.25465,34.80604],[-115.24857,34.80656],[-115.24294,34.80703],[-115.24217,34.8071],[-115.24149,34.80716],[-115.23425,34.80777],[-115.2304,34.80808],[-115.22953,34.80815],[-115.22741,34.80832],[-115.22536,34.8085],[-115.22421,34.80861],[-115.2236,34.80866],[-115.22324,34.80869],[-115.21997,34.80897],[-115.21799,34.80914],[-115.21663,34.80924],[-115.21629,34.80927],[-115.21575,34.80932],[-115.21518,34.80936],[-115.21393,34.80947],[-115.21333,34.80951],[-115.21058,34.80974],[-115.2069,34.81007],[-115.1999,34.81075],[-115.19961,34.81078],[-115.19837,34.81091],[-115.1972,34.81105],[-115.19682,34.81111],[-115.19616,34.81119],[-115.19331,34.81154],[-115.1905,34.81188],[-115.19003,34.81194],[-115.18706,34.81232],[-115.18472,34.81259],[-115.18396,34.81268],[-115.18358,34.81273],[-115.17243,34.81414],[-115.15171,34.81671],[-115.14251,34.81785],[-115.13945,34.81824],[-115.13402,34.8189],[-115.12702,34.81978],[-115.09937,34.8232],[-115.08571,34.82491],[-115.07196,34.82661],[-115.06263,34.82783],[-115.05768,34.82873],[-115.05674,34.82892],[-115.05662,34.82894],[-115.05578,34.82911],[-115.05539,34.8292],[-115.05379,34.82951],[-115.05253,34.82977],[-115.05195,34.82989],[-115.0515,34.82997],[-115.05125,34.83002],[-115.05067,34.83013],[-115.05058,34.83014],[-115.04967,34.83026],[-115.04877,34.83034],[-115.04815,34.83038],[-115.04741,34.83039],[-115.0463,34.83037],[-115.046,34.83035],[-115.04542,34.8303],[-115.04493,34.83026],[-115.04408,34.83019],[-115.04045,34.8299],[-115.03781,34.8297],[-115.03443,34.82942],[-115.03275,34.8293],[-115.02988,34.82913],[-115.02853,34.82917],[-115.02793,34.82924],[-115.02738,34.82929],[-115.02674,34.82938],[-115.02592,34.82952],[-115.02521,34.8297],[-115.02449,34.82988],[-115.01795,34.8317],[-115.01435,34.8327],[-115.0124,34.83325],[-115.01089,34.83367],[-115.00409,34.83558],[-115.00065,34.83654],[-114.99742,34.83743],[-114.99259,34.83878],[-114.99203,34.83893],[-114.9917,34.83902],[-114.99067,34.83932],[-114.98633,34.84053],[-114.98299,34.84144],[-114.97958,34.84242],[-114.97796,34.84286],[-114.97761,34.84296],[-114.9754,34.84357],[-114.97478,34.84375],[-114.97123,34.84475],[-114.96983,34.84512],[-114.96634,34.8461],[-114.96617,34.84614],[-114.96517,34.84642],[-114.96203,34.8473],[-114.9611,34.84757],[-114.94056,34.85327],[-114.92549,34.85747],[-114.92381,34.85779],[-114.92279,34.85791],[-114.92176,34.85799],[-114.92095,34.85801],[-114.91969,34.85797],[-114.91824,34.85784],[-114.9163,34.85763],[-114.91078,34.85705],[-114.9089,34.85685],[-114.90668,34.85661],[-114.90551,34.85648],[-114.90318,34.85624],[-114.90269,34.85618],[-114.89781,34.85567],[-114.89677,34.85556],[-114.89487,34.85536],[-114.89166,34.85501],[-114.89096,34.85495],[-114.89033,34.85493],[-114.88977,34.85492],[-114.88926,34.85493],[-114.88875,34.85496],[-114.88785,34.85504],[-114.88724,34.85513],[-114.88649,34.85527],[-114.88413,34.85584],[-114.8765,34.85771],[-114.87536,34.85798],[-114.87438,34.85817],[-114.87371,34.85826],[-114.8731,34.85832],[-114.87235,34.85836],[-114.87043,34.85835],[-114.86966,34.85836],[-114.86911,34.85839],[-114.86835,34.85846],[-114.86735,34.85863],[-114.86394,34.85922],[-114.86196,34.85958],[-114.86149,34.85966],[-114.86092,34.85976],[-114.86045,34.85987],[-114.85963,34.86007],[-114.85886,34.8603],[-114.85822,34.86051],[-114.85744,34.86081],[-114.85664,34.86117],[-114.85538,34.86177],[-114.85433,34.8623],[-114.85324,34.86283],[-114.85014,34.86437],[-114.8482,34.86531],[-114.84716,34.86578],[-114.84621,34.86615],[-114.84557,34.86636],[-114.84492,34.86655],[-114.84425,34.86673],[-114.84351,34.8669],[-114.84275,34.86702],[-114.84158,34.86719],[-114.83997,34.86731],[-114.83948,34.86734],[-114.83705,34.8675],[-114.83611,34.86757],[-114.83505,34.86767],[-114.83416,34.86781],[-114.83316,34.86801],[-114.83253,34.86816],[-114.83151,34.86845],[-114.83047,34.86879],[-114.83014,34.86889],[-114.82871,34.86935],[-114.82696,34.86989],[-114.8253,34.87041],[-114.82466,34.87061],[-114.82411,34.87079],[-114.82228,34.87136],[-114.82045,34.87194],[-114.81871,34.87248],[-114.81701,34.87302],[-114.80789,34.87587],[-114.8071,34.87612],[-114.80477,34.87685],[-114.80434,34.87698],[-114.80328,34.87732],[-114.79788,34.87901],[-114.79543,34.87978],[-114.79248,34.8807],[-114.79046,34.88134],[-114.78949,34.88161],[-114.78858,34.88183],[-114.78779,34.882],[-114.78716,34.88213],[-114.78643,34.88224],[-114.78508,34.88243],[-114.7837,34.88254],[-114.78291,34.88258],[-114.78197,34.88261],[-114.78108,34.8826],[-114.78006,34.88257],[-114.77895,34.8825],[-114.77811,34.88241],[-114.77724,34.8823],[-114.77644,34.88218],[-114.7753,34.88196],[-114.77406,34.88168],[-114.77319,34.88144],[-114.76514,34.87915],[-114.76396,34.87882],[-114.76282,34.87854],[-114.76187,34.87835],[-114.76047,34.87812],[-114.75942,34.87801],[-114.75885,34.87795],[-114.75801,34.87789],[-114.75671,34.87786],[-114.75548,34.87788],[-114.75449,34.87792],[-114.75348,34.87804],[-114.75231,34.87818],[-114.75171,34.87827],[-114.75098,34.87841],[-114.7503,34.87856],[-114.74986,34.87866],[-114.74892,34.87886],[-114.74506,34.87971],[-114.73387,34.88222],[-114.73348,34.8823],[-114.73074,34.88292],[-114.72667,34.88382],[-114.71975,34.8855],[-114.71111,34.88806],[-114.70353,34.89037],[-114.70242,34.89071],[-114.70153,34.89095],[-114.70068,34.89111],[-114.70009,34.89119],[-114.69997,34.8912],[-114.69965,34.89122],[-114.69906,34.89126],[-114.69838,34.89128],[-114.69752,34.89126],[-114.69657,34.89116],[-114.69578,34.89102],[-114.69489,34.89083],[-114.69406,34.89054],[-114.68045,34.88615],[-114.67362,34.88393],[-114.67163,34.88322],[-114.66947,34.88226],[-114.66753,34.8813],[-114.66425,34.87923],[-114.66386,34.87896],[-114.66092,34.87698],[-114.66052,34.87672],[-114.65866,34.87548],[-114.65807,34.87508],[-114.65779,34.87489],[-114.6544,34.87261],[-114.65105,34.87037],[-114.6505,34.87],[-114.64044,34.86322],[-114.64005,34.86295],[-114.63904,34.86228],[-114.63866,34.86202],[-114.63071,34.85668],[-114.63001,34.85621],[-114.62801,34.85489],[-114.62732,34.85441],[-114.62672,34.85401],[-114.62458,34.85257],[-114.62184,34.85083],[-114.62127,34.85046],[-114.6202,34.84977],[-114.6198,34.84953],[-114.61835,34.84864],[-114.6177,34.84824],[-114.61651,34.84752],[-114.61625,34.84735],[-114.61602,34.84722],[-114.61554,34.84686],[-114.61514,34.84652],[-114.61451,34.84581],[-114.6141,34.84519],[-114.61374,34.84441],[-114.61295,34.8427],[-114.61257,34.84188],[-114.61243,34.84156],[-114.61151,34.83956],[-114.61134,34.83921],[-114.61093,34.83831],[-114.61048,34.83734],[-114.61025,34.83694],[-114.61,34.83656],[-114.60964,34.83606],[-114.60917,34.83553],[-114.60888,34.83523],[-114.60858,34.83496],[-114.6081,34.83456],[-114.60761,34.83421],[-114.60715,34.83392],[-114.60667,34.83365],[-114.606,34.83331],[-114.60452,34.83261],[-114.60384,34.83228],[-114.60344,34.83205],[-114.6033,34.83198],[-114.60295,34.83175],[-114.60252,34.83144],[-114.60206,34.83107],[-114.6018,34.83084],[-114.6015,34.83055],[-114.60116,34.83018],[-114.60102,34.83002],[-114.6007,34.82962],[-114.60037,34.82915],[-114.60004,34.82871],[-114.5998,34.82837],[-114.59957,34.82804],[-114.59949,34.82792],[-114.5994,34.82779],[-114.59922,34.82754],[-114.59877,34.82692],[-114.59824,34.8262],[-114.59784,34.8256],[-114.59755,34.82514],[-114.59723,34.82454],[-114.59707,34.82422],[-114.59683,34.82356],[-114.59662,34.82294],[-114.59614,34.82148],[-114.59592,34.82075],[-114.59563,34.81972],[-114.59432,34.81553],[-114.59419,34.81512],[-114.58881,34.79812],[-114.58863,34.79755],[-114.5874,34.79369],[-114.58661,34.79112],[-114.58645,34.79065],[-114.58318,34.78034],[-114.58158,34.77519],[-114.58143,34.7747],[-114.58023,34.77123],[-114.57973,34.77014],[-114.57943,34.76953],[-114.57906,34.76883],[-114.57861,34.768],[-114.57838,34.76764],[-114.57748,34.76627],[-114.57713,34.76581],[-114.57679,34.76535],[-114.57621,34.76462],[-114.57412,34.76213],[-114.57302,34.76082],[-114.57176,34.75935],[-114.56787,34.75472],[-114.56766,34.75446],[-114.56742,34.75417],[-114.56398,34.75006],[-114.56394,34.75001],[-114.56375,34.74979],[-114.56275,34.74861],[-114.55814,34.74318],[-114.55787,34.74286],[-114.55412,34.7384],[-114.5539,34.73813],[-114.5496,34.73302],[-114.54947,34.73288],[-114.54571,34.72839],[-114.54445,34.72694],[-114.54383,34.72631],[-114.54323,34.72579],[-114.54221,34.72502],[-114.54131,34.72448],[-114.54045,34.72399],[-114.53877,34.72306],[-114.53696,34.72205],[-114.53633,34.72167],[-114.53161,34.71899],[-114.53066,34.71856],[-114.52984,34.71822],[-114.52881,34.71785],[-114.5275,34.71748],[-114.52541,34.71705],[-114.5225,34.71691],[-114.51515,34.71716],[-114.50869,34.71744],[-114.50623,34.71752],[-114.50042,34.71778],[-114.49956,34.71776],[-114.49853,34.71769],[-114.49764,34.71758],[-114.49643,34.71744],[-114.49529,34.7173],[-114.49414,34.71716],[-114.49298,34.71702],[-114.4925,34.71698],[-114.49193,34.71695],[-114.49147,34.71695],[-114.49098,34.71697],[-114.4899,34.71703],[-114.48785,34.71714],[-114.48565,34.71726],[-114.48363,34.71739],[-114.4828,34.71747],[-114.48158,34.71759],[-114.48034,34.71776],[-114.47981,34.71782],[-114.47934,34.71789],[-114.47736,34.71808],[-114.47652,34.71813],[-114.4758,34.71815],[-114.47508,34.71816],[-114.4743,34.71816],[-114.47333,34.71815],[-114.47215,34.71816],[-114.47122,34.71818],[-114.47009,34.71821],[-114.46803,34.71831],[-114.46576,34.71846],[-114.46369,34.71865],[-114.46104,34.71896],[-114.45915,34.71918],[-114.45471,34.7197],[-114.44996,34.72025],[-114.44886,34.72038],[-114.4474,34.72056],[-114.44477,34.72087],[-114.44323,34.72105],[-114.44192,34.7212],[-114.44127,34.72129],[-114.44059,34.72136],[-114.4397,34.72146],[-114.43873,34.72157],[-114.43588,34.72191],[-114.43484,34.72204],[-114.43122,34.72246],[-114.42907,34.72271],[-114.42811,34.72282],[-114.42765,34.72287],[-114.4272,34.72292],[-114.42693,34.72295],[-114.426,34.72308],[-114.42405,34.72329],[-114.42203,34.72354],[-114.42099,34.72367],[-114.41944,34.72385],[-114.41852,34.72395],[-114.41702,34.72413],[-114.41651,34.72419],[-114.4157,34.72428],[-114.41498,34.72437],[-114.41434,34.72444],[-114.41327,34.72457],[-114.41217,34.7247],[-114.41085,34.72486],[-114.40923,34.72504],[-114.40636,34.72538],[-114.4042,34.72563],[-114.40155,34.72594],[-114.3988,34.72624],[-114.3968,34.72641],[-114.3951,34.72651],[-114.39465,34.72653],[-114.39461,34.72653],[-114.39147,34.72665],[-114.39141,34.72666],[-114.39047,34.72669],[-114.38802,34.72678],[-114.38686,34.72683],[-114.38588,34.72686],[-114.38582,34.72686],[-114.38329,34.72696],[-114.38075,34.72706],[-114.3807,34.72706],[-114.37907,34.72712],[-114.37901,34.72712],[-114.37723,34.72719],[-114.37719,34.72719],[-114.37553,34.72725],[-114.37546,34.72725],[-114.37335,34.72733],[-114.37328,34.72733],[-114.37151,34.7274],[-114.37144,34.7274],[-114.36971,34.72747],[-114.36963,34.72747],[-114.36767,34.72755],[-114.36271,34.72773],[-114.36238,34.72775],[-114.35811,34.7279],[-114.3557,34.72799],[-114.35554,34.72799],[-114.3527,34.7281],[-114.34799,34.72828],[-114.34776,34.72829],[-114.34768,34.72829],[-114.34347,34.72845],[-114.34333,34.72845],[-114.34016,34.72856],[-114.33992,34.72857],[-114.33513,34.72875],[-114.33505,34.72876],[-114.33234,34.72885],[-114.32963,34.72895],[-114.32958,34.72896],[-114.32733,34.72904],[-114.32522,34.72912],[-114.32515,34.72912],[-114.32421,34.72916],[-114.32311,34.7292],[-114.32205,34.72923],[-114.32097,34.72927],[-114.32069,34.72928],[-114.32042,34.72929],[-114.31987,34.72932],[-114.3186,34.72937],[-114.31683,34.72943],[-114.31342,34.72954],[-114.31316,34.72955],[-114.31246,34.72957],[-114.31025,34.72963],[-114.3099,34.72964],[-114.30145,34.72989],[-114.30113,34.7299],[-114.29896,34.72995],[-114.29452,34.73008],[-114.29399,34.7301],[-114.28856,34.73025],[-114.28801,34.73027],[-114.28524,34.73035],[-114.27897,34.73056],[-114.27595,34.73078],[-114.27396,34.73096],[-114.27151,34.73126],[-114.27058,34.73139],[-114.26772,34.73186],[-114.26361,34.73269],[-114.26334,34.73275],[-114.26268,34.73291],[-114.26171,34.73315],[-114.25954,34.73371],[-114.25773,34.73423],[-114.25531,34.73502],[-114.25316,34.73578],[-114.25243,34.73604],[-114.25211,34.73615],[-114.25066,34.73672],[-114.25011,34.73693],[-114.24845,34.73761],[-114.2464,34.73859],[-114.24408,34.73969],[-114.23072,34.74667],[-114.23032,34.74688],[-114.22951,34.7473],[-114.22491,34.74972],[-114.22268,34.75088],[-114.21984,34.75247],[-114.21655,34.75447],[-114.20722,34.76111],[-114.20634,34.76175],[-114.19367,34.77083],[-114.19345,34.77099],[-114.18445,34.7774],[-114.18416,34.77761],[-114.18161,34.77947],[-114.17509,34.78413],[-114.17159,34.78662],[-114.16823,34.78903],[-114.1641,34.79198],[-114.16277,34.79296],[-114.16213,34.79347],[-114.16196,34.7936],[-114.16174,34.79378],[-114.16145,34.79402],[-114.16081,34.79457],[-114.16029,34.79499],[-114.15916,34.79601],[-114.15803,34.79708],[-114.15637,34.79873],[-114.15598,34.79916],[-114.15541,34.79985],[-114.15435,34.80103],[-114.15248,34.80352],[-114.15106,34.80564],[-114.15082,34.80602],[-114.15009,34.80724],[-114.14869,34.8099],[-114.14816,34.81101],[-114.14767,34.81213],[-114.1469,34.81415],[-114.14654,34.81517],[-114.14622,34.81619],[-114.14609,34.81667],[-114.14578,34.81783],[-114.14537,34.81945],[-114.14527,34.82],[-114.14516,34.82055],[-114.14485,34.82257],[-114.14472,34.82388],[-114.14461,34.82529],[-114.14458,34.82583],[-114.14455,34.82694],[-114.14455,34.82809],[-114.14457,34.82887],[-114.14466,34.83068],[-114.14474,34.83183],[-114.14482,34.83318],[-114.14499,34.83548],[-114.14508,34.83676],[-114.14545,34.84194],[-114.14549,34.84256],[-114.14601,34.85048],[-114.14612,34.85205],[-114.14641,34.85626],[-114.14641,34.85632],[-114.14656,34.85835],[-114.14664,34.85949],[-114.1467,34.86042],[-114.14671,34.86064],[-114.14682,34.86231],[-114.14687,34.86299],[-114.14687,34.86308],[-114.14708,34.86614],[-114.14709,34.8662],[-114.14719,34.86765],[-114.14735,34.87022],[-114.14746,34.87162],[-114.14755,34.87294],[-114.14763,34.87399],[-114.14768,34.87502],[-114.14771,34.87528],[-114.14773,34.87563],[-114.14777,34.87623],[-114.14785,34.87732],[-114.14791,34.87844],[-114.14808,34.88058],[-114.14818,34.88127],[-114.14831,34.88196],[-114.14843,34.88254],[-114.14852,34.88303],[-114.14854,34.88311],[-114.14857,34.88322],[-114.14874,34.88369],[-114.14892,34.8843],[-114.14931,34.88522],[-114.14974,34.88614],[-114.15003,34.88672],[-114.15046,34.88744],[-114.15085,34.88806],[-114.15144,34.88893],[-114.15184,34.88955],[-114.15255,34.89069],[-114.1529,34.89126],[-114.15322,34.89183],[-114.15381,34.89303],[-114.15406,34.89368],[-114.15426,34.89426],[-114.15444,34.89486],[-114.15459,34.89548],[-114.15474,34.8961],[-114.15484,34.89673],[-114.15494,34.89739],[-114.155,34.89836],[-114.15501,34.89923],[-114.15495,34.90029],[-114.15485,34.90107],[-114.15472,34.90175],[-114.15464,34.90223],[-114.15323,34.90989],[-114.15274,34.91254],[-114.15249,34.91386],[-114.15236,34.91451],[-114.15224,34.91515],[-114.15157,34.91878],[-114.15149,34.91917],[-114.15123,34.92049],[-114.1482,34.93676],[-114.14817,34.93695],[-114.14656,34.94556],[-114.14656,34.94559],[-114.14508,34.95348],[-114.14507,34.95351],[-114.14324,34.96338],[-114.14315,34.96387],[-114.14199,34.97006],[-114.14198,34.97011],[-114.14122,34.97418],[-114.14121,34.97424],[-114.13976,34.98203],[-114.13974,34.9821],[-114.13816,34.9906],[-114.13815,34.99066],[-114.1364,34.99998],[-114.13601,35.00209],[-114.13593,35.00251],[-114.13391,35.01336],[-114.13246,35.02111],[-114.13192,35.02401],[-114.1319,35.0241],[-114.131,35.02896],[-114.1307,35.03055],[-114.13025,35.03292],[-114.12971,35.0358],[-114.1295,35.03696],[-114.12914,35.03885],[-114.12913,35.03893],[-114.12906,35.03935],[-114.12886,35.04038],[-114.12865,35.04146],[-114.12864,35.04153],[-114.128,35.04492],[-114.12754,35.04741],[-114.12692,35.05064],[-114.12673,35.0517],[-114.12647,35.05307],[-114.12644,35.05322],[-114.12595,35.05592],[-114.12479,35.06213],[-114.12389,35.06691],[-114.12388,35.06695],[-114.12354,35.06874],[-114.12308,35.07124],[-114.12304,35.07141],[-114.12248,35.07444],[-114.12246,35.07453],[-114.12195,35.07724],[-114.12149,35.07969],[-114.12107,35.08193],[-114.12099,35.08236],[-114.11981,35.08875],[-114.11979,35.08884],[-114.11912,35.09242],[-114.1183,35.09679],[-114.11753,35.10084],[-114.11687,35.10442],[-114.11662,35.10545],[-114.11661,35.1055],[-114.11627,35.10694],[-114.11535,35.11037],[-114.11532,35.1105],[-114.11509,35.11121],[-114.11486,35.11199],[-114.1148,35.11218],[-114.11465,35.1127],[-114.11422,35.11403],[-114.11357,35.11601],[-114.11355,35.11608],[-114.11348,35.1163],[-114.11261,35.11861],[-114.11185,35.12038],[-114.11147,35.12123],[-114.11109,35.12204],[-114.11057,35.12309],[-114.10998,35.12421],[-114.10947,35.12513],[-114.10902,35.1259],[-114.10796,35.12768],[-114.10785,35.12784],[-114.10766,35.12811],[-114.1071,35.129],[-114.1065,35.12989],[-114.10631,35.13017],[-114.10562,35.13114],[-114.10545,35.13138],[-114.10498,35.13205],[-114.1045,35.13273],[-114.10402,35.13342],[-114.10358,35.13403],[-114.10337,35.13433],[-114.10315,35.13465],[-114.10266,35.13535],[-114.10234,35.13577],[-114.10203,35.13621],[-114.10037,35.13861],[-114.10031,35.13871],[-114.09991,35.13928],[-114.09949,35.13988],[-114.09916,35.14037],[-114.09885,35.14079],[-114.09839,35.14146],[-114.09736,35.14292],[-114.09516,35.14608],[-114.09467,35.14679],[-114.09326,35.14878],[-114.09246,35.14977],[-114.09192,35.1504],[-114.09165,35.15072],[-114.09136,35.15104],[-114.09081,35.15162],[-114.09037,35.15207],[-114.08978,35.15265],[-114.08964,35.15278],[-114.08859,35.15374],[-114.08769,35.15447],[-114.08718,35.15489],[-114.08618,35.15564],[-114.08534,35.15624],[-114.08415,35.15703],[-114.08367,35.15732],[-114.08315,35.15764],[-114.08259,35.15797],[-114.08178,35.15841],[-114.08121,35.15872],[-114.08012,35.15927],[-114.0785,35.16],[-114.07693,35.1607],[-114.07608,35.1612],[-114.07544,35.16169],[-114.07503,35.16209],[-114.07458,35.16263],[-114.07416,35.16337],[-114.07391,35.16415],[-114.07379,35.16479],[-114.07377,35.16538],[-114.0738,35.166],[-114.07403,35.16689],[-114.0746,35.16895],[-114.07491,35.17013],[-114.07512,35.17125],[-114.07522,35.1723],[-114.07523,35.17343],[-114.07518,35.1739],[-114.07503,35.17488],[-114.07467,35.17616],[-114.07432,35.17701],[-114.07395,35.17774],[-114.07346,35.17858],[-114.07285,35.17945],[-114.0715,35.18094],[-114.07026,35.18238],[-114.06899,35.184],[-114.06836,35.18501],[-114.06816,35.18538],[-114.06774,35.18627],[-114.06744,35.18697],[-114.06729,35.18773],[-114.0672,35.18824],[-114.06702,35.18934],[-114.06698,35.19064],[-114.06695,35.19109],[-114.06692,35.19234],[-114.06683,35.19525],[-114.06675,35.19751],[-114.06668,35.19809],[-114.06653,35.19869],[-114.0663,35.19942],[-114.06603,35.20001],[-114.06569,35.2006],[-114.06509,35.20143],[-114.06429,35.2023],[-114.06356,35.20312],[-114.06311,35.20361],[-114.06103,35.20593],[-114.06002,35.20706],[-114.0596,35.20751],[-114.05838,35.20875],[-114.05768,35.20937],[-114.056,35.21057],[-114.05455,35.21141],[-114.05361,35.21187],[-114.05208,35.21263],[-114.05061,35.21329],[-114.04894,35.21395],[-114.04774,35.21436],[-114.04584,35.21493],[-114.04425,35.21536],[-114.04231,35.21579],[-114.04125,35.21601],[-114.03922,35.21643],[-114.03737,35.21682],[-114.03633,35.21699],[-114.03572,35.21707],[-114.03516,35.21713],[-114.03405,35.21724],[-114.03253,35.2173],[-114.031,35.2173],[-114.02941,35.2172],[-114.02741,35.21705],[-114.02625,35.21697],[-114.02499,35.2169],[-114.02458,35.21688],[-114.02322,35.21685],[-114.0222,35.21685],[-114.01924,35.2169],[-114.01568,35.21696],[-114.01124,35.21703],[-114.01055,35.21704],[-114.00766,35.21711],[-114.00648,35.21714],[-114.00404,35.21718],[-114.00093,35.21723],[-113.99861,35.21718],[-113.99851,35.21717],[-113.99676,35.21706],[-113.99507,35.21687],[-113.99306,35.21657],[-113.99146,35.21627],[-113.98877,35.21564],[-113.98587,35.21496],[-113.98321,35.21428],[-113.98008,35.21354],[-113.97729,35.21286],[-113.97428,35.21211],[-113.97026,35.21112],[-113.96109,35.20892],[-113.95596,35.20766],[-113.94191,35.20423],[-113.93065,35.20148],[-113.92456,35.20001],[-113.92277,35.19957],[-113.91988,35.1989],[-113.91872,35.1987],[-113.91731,35.19843],[-113.9161,35.19827],[-113.91443,35.1981],[-113.9138,35.19805],[-113.91232,35.19797],[-113.90884,35.19778],[-113.90441,35.19756],[-113.90162,35.1974],[-113.89925,35.19728],[-113.89798,35.19722],[-113.89756,35.19719],[-113.89569,35.1971],[-113.85364,35.19487],[-113.84855,35.1946],[-113.84766,35.19455],[-113.8421,35.19431],[-113.84023,35.19418],[-113.83738,35.19405],[-113.83525,35.19391],[-113.8342,35.19381],[-113.83214,35.19355],[-113.83133,35.19344],[-113.83017,35.19323],[-113.82852,35.19292],[-113.82715,35.19251],[-113.82559,35.19207],[-113.82439,35.19168],[-113.82266,35.19105],[-113.81876,35.18934],[-113.81647,35.18833],[-113.79919,35.18059],[-113.79532,35.17885],[-113.79088,35.17685],[-113.79059,35.17672],[-113.78775,35.17546],[-113.78591,35.17463],[-113.78541,35.1744],[-113.78514,35.17428],[-113.7848,35.17413],[-113.78424,35.17389],[-113.78384,35.17372],[-113.78358,35.17362],[-113.78334,35.17352],[-113.78298,35.17338],[-113.78228,35.1731],[-113.78194,35.17299],[-113.78064,35.17253],[-113.77961,35.17222],[-113.77922,35.17209],[-113.77883,35.17199],[-113.77835,35.17186],[-113.77799,35.17175],[-113.77758,35.17165],[-113.77724,35.17157],[-113.77687,35.17149],[-113.77623,35.17135],[-113.77569,35.17123],[-113.77528,35.17116],[-113.77481,35.17106],[-113.77398,35.17092],[-113.77333,35.17082],[-113.77069,35.17041],[-113.76551,35.1696],[-113.73561,35.16493],[-113.71215,35.16129],[-113.70813,35.16065],[-113.70525,35.1602],[-113.70101,35.15955],[-113.70009,35.15941],[-113.69945,35.15932],[-113.69888,35.15925],[-113.69764,35.15916],[-113.69694,35.15912],[-113.69661,35.15911],[-113.6962,35.1591],[-113.69573,35.1591],[-113.6953,35.15911],[-113.69501,35.15911],[-113.69451,35.15913],[-113.6941,35.15915],[-113.69358,35.15917],[-113.69305,35.15921],[-113.69243,35.15928],[-113.69138,35.15939],[-113.69062,35.15947],[-113.68976,35.15956],[-113.68588,35.15995],[-113.66992,35.16166],[-113.66903,35.16176],[-113.66692,35.16198],[-113.66575,35.16208],[-113.6645,35.16215],[-113.6631,35.1622],[-113.66188,35.16218],[-113.66037,35.1621],[-113.65877,35.16197],[-113.65742,35.1618],[-113.65607,35.16157],[-113.655,35.16137],[-113.65351,35.16104],[-113.65194,35.16067],[-113.65009,35.16034],[-113.64831,35.16014],[-113.6463,35.16],[-113.64393,35.15999],[-113.6376,35.16002],[-113.63647,35.16002],[-113.63593,35.16002],[-113.63552,35.16003],[-113.63151,35.16005],[-113.61887,35.1601],[-113.61584,35.16011],[-113.61305,35.16014],[-113.61082,35.1602],[-113.60855,35.1603],[-113.60652,35.16043],[-113.60496,35.16054],[-113.60106,35.16085],[-113.59704,35.16117],[-113.59172,35.16159],[-113.58629,35.16202],[-113.58443,35.1621],[-113.58337,35.16211],[-113.58229,35.16209],[-113.58071,35.16205],[-113.57881,35.16192],[-113.57753,35.16179],[-113.57666,35.16168],[-113.57523,35.16147],[-113.57372,35.16121],[-113.57258,35.16098],[-113.57139,35.1607],[-113.57092,35.16059],[-113.57021,35.16041],[-113.5672,35.15957],[-113.5668,35.15944],[-113.56557,35.15913],[-113.56436,35.1589],[-113.56271,35.15866],[-113.56188,35.15861],[-113.56084,35.15855],[-113.55975,35.15857],[-113.55868,35.15862],[-113.55768,35.15871],[-113.5567,35.15885],[-113.55534,35.1591],[-113.54863,35.16047],[-113.54767,35.16066],[-113.54641,35.16092],[-113.54517,35.1611],[-113.54428,35.16119],[-113.54331,35.16125],[-113.53878,35.16128],[-113.53774,35.1613],[-113.5372,35.16134],[-113.53667,35.1614],[-113.53575,35.16157],[-113.53512,35.16174],[-113.53461,35.1619],[-113.53399,35.16213],[-113.53338,35.16242],[-113.53288,35.16268],[-113.53239,35.16297],[-113.53137,35.16373],[-113.52736,35.16706],[-113.52588,35.16831],[-113.52485,35.1691],[-113.52431,35.16947],[-113.52389,35.16972],[-113.52348,35.16993],[-113.52246,35.17033],[-113.52177,35.1705],[-113.52111,35.17064],[-113.52039,35.17071],[-113.51953,35.17073],[-113.51875,35.17069],[-113.5159,35.17049],[-113.51489,35.17044],[-113.5139,35.17047],[-113.51294,35.17056],[-113.51212,35.17068],[-113.5112,35.17087],[-113.51044,35.17108],[-113.50977,35.1713],[-113.5083,35.17178],[-113.50778,35.17193],[-113.50714,35.17207],[-113.50654,35.17221],[-113.50585,35.17233],[-113.50454,35.17258],[-113.50333,35.17284],[-113.50253,35.17309],[-113.50178,35.1734],[-113.50103,35.17372],[-113.50008,35.17413],[-113.49965,35.17429],[-113.49908,35.17446],[-113.4982,35.17465],[-113.49715,35.17482],[-113.49568,35.17509],[-113.49445,35.1754],[-113.49348,35.17568],[-113.49208,35.17616],[-113.49127,35.17646],[-113.4905,35.1767],[-113.48962,35.17693],[-113.48867,35.17712],[-113.48777,35.17726],[-113.48669,35.17736],[-113.48566,35.1774],[-113.48446,35.17738],[-113.48324,35.17727],[-113.48198,35.17708],[-113.4801,35.17669],[-113.47917,35.17656],[-113.47828,35.17654],[-113.47752,35.17661],[-113.47671,35.17676],[-113.47599,35.17698],[-113.4753,35.17729],[-113.47465,35.17764],[-113.47398,35.17804],[-113.47307,35.17863],[-113.47204,35.17923],[-113.47133,35.17962],[-113.47066,35.17993],[-113.47008,35.18015],[-113.46894,35.18052],[-113.46809,35.18074],[-113.4664,35.18104],[-113.46439,35.18109],[-113.4629,35.18099],[-113.46127,35.18086],[-113.46041,35.18086],[-113.46009,35.18087],[-113.45975,35.18088],[-113.45932,35.1809],[-113.45902,35.18093],[-113.45876,35.18095],[-113.4585,35.18097],[-113.45817,35.18101],[-113.45787,35.18106],[-113.45748,35.18112],[-113.45724,35.18116],[-113.45703,35.1812],[-113.45649,35.18131],[-113.4561,35.1814],[-113.45578,35.18148],[-113.45529,35.18162],[-113.45474,35.1818],[-113.45397,35.18203],[-113.4528,35.18258],[-113.45187,35.18308],[-113.45071,35.1838],[-113.44881,35.18536],[-113.44644,35.18729],[-113.44588,35.18772],[-113.44532,35.18811],[-113.44477,35.18845],[-113.44432,35.18871],[-113.44363,35.18905],[-113.44307,35.1893],[-113.44212,35.18964],[-113.44114,35.18995],[-113.44068,35.19007],[-113.44009,35.19019],[-113.43916,35.19032],[-113.43843,35.19042],[-113.43606,35.1904],[-113.43455,35.19023],[-113.43362,35.19014],[-113.43263,35.19004],[-113.42973,35.18976],[-113.42771,35.18959],[-113.42627,35.18947],[-113.42496,35.18932],[-113.4244,35.18925],[-113.42271,35.18898],[-113.42154,35.1887],[-113.4202,35.18836],[-113.41757,35.18767],[-113.40607,35.18561],[-113.40294,35.18503],[-113.39481,35.18362],[-113.39341,35.18347],[-113.39229,35.18339],[-113.39121,35.18336],[-113.39003,35.1834],[-113.38892,35.18348],[-113.38691,35.18376],[-113.38496,35.18424],[-113.38342,35.18472],[-113.38227,35.18518],[-113.3814,35.18559],[-113.38034,35.18616],[-113.37595,35.1885],[-113.3746,35.18909],[-113.37384,35.18937],[-113.37235,35.18985],[-113.37169,35.19003],[-113.37091,35.19019],[-113.37019,35.19034],[-113.36957,35.19044],[-113.36924,35.19049],[-113.36845,35.19059],[-113.36745,35.19065],[-113.36617,35.19068],[-113.36531,35.19069],[-113.36166,35.19072],[-113.35938,35.19074],[-113.35226,35.19081],[-113.33737,35.19092],[-113.33571,35.19091],[-113.33378,35.19081],[-113.33208,35.19061],[-113.33047,35.1904],[-113.32678,35.18967],[-113.32366,35.18906],[-113.32241,35.1889],[-113.32068,35.18884],[-113.31964,35.18889],[-113.31833,35.18902],[-113.31759,35.18918],[-113.31699,35.18931],[-113.3164,35.18946],[-113.31481,35.18995],[-113.3137,35.19041],[-113.31258,35.19094],[-113.31145,35.19162],[-113.31053,35.19232],[-113.30967,35.19302],[-113.30882,35.19389],[-113.30763,35.19528],[-113.30292,35.2007],[-113.3012,35.20247],[-113.3008,35.2028],[-113.30037,35.20318],[-113.2989,35.20424],[-113.29754,35.205],[-113.29719,35.20519],[-113.29528,35.20606],[-113.29344,35.20666],[-113.29228,35.20694],[-113.29155,35.2071],[-113.29073,35.20723],[-113.2904,35.20727],[-113.28947,35.20739],[-113.28829,35.20749],[-113.28715,35.20753],[-113.27931,35.20727],[-113.27819,35.20723],[-113.27734,35.20724],[-113.27606,35.20727],[-113.27456,35.20739],[-113.27298,35.2076],[-113.27181,35.20781],[-113.27066,35.20805],[-113.26951,35.20835],[-113.26829,35.20871],[-113.26703,35.20917],[-113.26546,35.20982],[-113.26403,35.21051],[-113.26081,35.21231],[-113.25555,35.2152],[-113.24707,35.21981],[-113.2451,35.22091],[-113.24319,35.2219],[-113.24097,35.22317],[-113.23948,35.22399],[-113.2384,35.22453],[-113.23621,35.22554],[-113.23448,35.22617],[-113.23337,35.22657],[-113.21963,35.23132],[-113.21428,35.23315],[-113.21282,35.2337],[-113.21157,35.23424],[-113.20904,35.23549],[-113.20588,35.23716],[-113.19215,35.24459],[-113.18762,35.24701],[-113.18722,35.24721],[-113.18348,35.24927],[-113.18097,35.25062],[-113.17849,35.25194],[-113.17694,35.25279],[-113.17523,35.25373],[-113.17418,35.25426],[-113.17092,35.25604],[-113.16379,35.25989],[-113.16317,35.26023],[-113.13124,35.27748],[-113.13019,35.27811],[-113.12833,35.27948],[-113.12726,35.28047],[-113.12594,35.28176],[-113.12451,35.28298],[-113.12323,35.28399],[-113.12199,35.28472],[-113.12103,35.28523],[-113.12005,35.28566],[-113.11932,35.28599],[-113.11811,35.28644],[-113.11723,35.28673],[-113.11567,35.28712],[-113.11383,35.28739],[-113.11212,35.28749],[-113.1109,35.28749],[-113.10921,35.28736],[-113.10791,35.28718],[-113.10539,35.28664],[-113.1005,35.28568],[-113.09914,35.28552],[-113.09752,35.28553],[-113.09597,35.28576],[-113.09453,35.28612],[-113.0929,35.28682],[-113.09169,35.28741],[-113.09079,35.28785],[-113.08983,35.28828],[-113.08846,35.28882],[-113.08716,35.28928],[-113.08518,35.28993],[-113.08342,35.29042],[-113.08094,35.29096],[-113.08,35.29112],[-113.0793,35.29123],[-113.07796,35.29142],[-113.07545,35.29167],[-113.07365,35.29176],[-113.07211,35.29178],[-113.05478,35.29198],[-113.04321,35.29212],[-113.04103,35.29215],[-113.03689,35.2922],[-113.03611,35.29224],[-113.0354,35.29231],[-113.03465,35.29243],[-113.03376,35.2926],[-113.03246,35.29298],[-113.0316,35.2933],[-113.03099,35.29355],[-113.03014,35.29401],[-113.02932,35.29448],[-113.02843,35.29511],[-113.02733,35.29594],[-113.02476,35.29784],[-113.02306,35.29902],[-113.02131,35.29996],[-113.02005,35.30052],[-113.01897,35.30092],[-113.01797,35.30122],[-113.01708,35.30144],[-113.01565,35.30174],[-113.01379,35.302],[-113.01227,35.30208],[-113.00648,35.30231],[-113.00533,35.30239],[-113.00402,35.30252],[-113.0024,35.30273],[-113.00027,35.3031],[-112.99815,35.30357],[-112.99692,35.30392],[-112.99597,35.30419],[-112.98879,35.30668],[-112.98858,35.30675],[-112.9836,35.30848],[-112.97423,35.31176],[-112.97398,35.31185],[-112.96957,35.31339],[-112.96238,35.31591],[-112.95871,35.31703],[-112.95541,35.31797],[-112.95309,35.31854],[-112.94964,35.3194],[-112.94724,35.31987],[-112.94507,35.32027],[-112.94168,35.32085],[-112.93669,35.32156],[-112.93227,35.32202],[-112.92904,35.32226],[-112.92511,35.32247],[-112.92282,35.32253],[-112.91871,35.32256],[-112.91525,35.32248],[-112.91084,35.32226],[-112.90683,35.32194],[-112.90302,35.32154],[-112.89711,35.32069],[-112.89358,35.32012],[-112.88746,35.319],[-112.86827,35.31531],[-112.86675,35.31492],[-112.86531,35.31449],[-112.86427,35.31413],[-112.86257,35.31352],[-112.8613,35.31299],[-112.85948,35.31213],[-112.8585,35.31167],[-112.85722,35.31097],[-112.85605,35.31031],[-112.8557,35.31011],[-112.85196,35.30793],[-112.85162,35.30773],[-112.84879,35.30615],[-112.84841,35.30593],[-112.83502,35.29824],[-112.83354,35.2974],[-112.83324,35.29723],[-112.82791,35.29426],[-112.82665,35.29361],[-112.82443,35.29255],[-112.82296,35.29188],[-112.82139,35.29122],[-112.8199,35.29061],[-112.81841,35.29005],[-112.81749,35.28972],[-112.81709,35.28957],[-112.816,35.2892],[-112.81504,35.28889],[-112.8134,35.28837],[-112.81162,35.28786],[-112.8076,35.28672],[-112.80184,35.28507],[-112.79462,35.28301],[-112.79384,35.28279],[-112.78629,35.28066],[-112.76641,35.275],[-112.76315,35.27407],[-112.76151,35.27367],[-112.7597,35.27328],[-112.75781,35.27298],[-112.75657,35.27282],[-112.75542,35.2727],[-112.75324,35.27255],[-112.74996,35.27249],[-112.74153,35.27235],[-112.74003,35.27232],[-112.73893,35.27228],[-112.73765,35.27214],[-112.73703,35.27206],[-112.7363,35.27193],[-112.73555,35.27179],[-112.7349,35.27162],[-112.73444,35.2715],[-112.73356,35.27125],[-112.73249,35.27087],[-112.7313,35.27038],[-112.72984,35.26965],[-112.72913,35.26923],[-112.72715,35.26784],[-112.72635,35.26715],[-112.72367,35.26473],[-112.7222,35.26352],[-112.72027,35.26208],[-112.71763,35.26045],[-112.71613,35.25964],[-112.71398,35.25861],[-112.71202,35.25779],[-112.70953,35.2569],[-112.68898,35.24937],[-112.66767,35.24155],[-112.66462,35.24056],[-112.6612,35.23955],[-112.65982,35.23918],[-112.65638,35.23832],[-112.65372,35.23774],[-112.65128,35.23727],[-112.64807,35.23673],[-112.64492,35.2363],[-112.63736,35.2354],[-112.62721,35.23425],[-112.60998,35.23227],[-112.60969,35.23223],[-112.60783,35.23202],[-112.60336,35.2315],[-112.59653,35.23071],[-112.59333,35.23034],[-112.58977,35.22992],[-112.58807,35.22971],[-112.58679,35.22952],[-112.5856,35.22932],[-112.58315,35.22888],[-112.58088,35.22842],[-112.57333,35.22693],[-112.56723,35.22572],[-112.56625,35.22553],[-112.55146,35.2226],[-112.54342,35.22103],[-112.54231,35.2209],[-112.53972,35.22085],[-112.53918,35.22085],[-112.52757,35.22084],[-112.52267,35.22082],[-112.51205,35.2208],[-112.51045,35.22079],[-112.50836,35.22075],[-112.50788,35.22073],[-112.50522,35.22066],[-112.50372,35.22062],[-112.50088,35.22052],[-112.49928,35.22042],[-112.49801,35.22029],[-112.49734,35.22021],[-112.49666,35.22012],[-112.49581,35.22],[-112.4928,35.21944],[-112.49178,35.21926],[-112.49042,35.21909],[-112.48884,35.21895],[-112.4884,35.21892],[-112.48773,35.21889],[-112.48645,35.21888],[-112.48496,35.2189],[-112.48376,35.21898],[-112.4824,35.2191],[-112.48079,35.21934],[-112.48013,35.21945],[-112.47815,35.21987],[-112.47611,35.22045],[-112.47551,35.22064],[-112.47447,35.22093],[-112.47378,35.22109],[-112.47288,35.22126],[-112.47201,35.22139],[-112.47097,35.22149],[-112.46994,35.22151],[-112.46884,35.22147],[-112.46791,35.2214],[-112.46701,35.22126],[-112.46604,35.22107],[-112.46512,35.2209],[-112.46441,35.22077],[-112.46427,35.22074],[-112.46273,35.22046],[-112.46169,35.2203],[-112.46082,35.22017],[-112.45932,35.22001],[-112.45811,35.21991],[-112.45643,35.21982],[-112.4541,35.21974],[-112.45285,35.21969],[-112.45016,35.21949],[-112.44769,35.21918],[-112.44561,35.21881],[-112.44474,35.2186],[-112.44322,35.21822],[-112.44028,35.21736],[-112.43901,35.21696],[-112.43879,35.21689],[-112.43449,35.21559],[-112.43383,35.21539],[-112.4326,35.21504],[-112.4314,35.21476],[-112.42949,35.21447],[-112.42833,35.21438],[-112.42808,35.21436],[-112.42788,35.21434],[-112.42458,35.2141],[-112.42425,35.21407],[-112.41157,35.21319],[-112.41073,35.21315],[-112.40997,35.21316],[-112.40882,35.21323],[-112.40755,35.2134],[-112.40682,35.21355],[-112.40611,35.21373],[-112.40532,35.21396],[-112.40454,35.21425],[-112.40132,35.21557],[-112.40066,35.21582],[-112.39974,35.2161],[-112.39894,35.21631],[-112.39819,35.21646],[-112.39742,35.21656],[-112.39641,35.21665],[-112.39582,35.21667],[-112.39525,35.21666],[-112.39406,35.21659],[-112.39315,35.21645],[-112.39216,35.21627],[-112.3907,35.21599],[-112.38996,35.21586],[-112.38919,35.21577],[-112.38857,35.21572],[-112.38793,35.21571],[-112.38319,35.21583],[-112.38144,35.21588],[-112.37989,35.21599],[-112.37856,35.21613],[-112.37845,35.21614],[-112.37809,35.21618],[-112.37738,35.21627],[-112.37666,35.21635],[-112.37377,35.2167],[-112.37293,35.2168],[-112.3721,35.21686],[-112.37136,35.21686],[-112.37056,35.21682],[-112.36965,35.21674],[-112.36894,35.21664],[-112.36815,35.21647],[-112.36281,35.21523],[-112.36198,35.21505],[-112.36126,35.21493],[-112.36047,35.21481],[-112.35961,35.21473],[-112.35855,35.21469],[-112.35732,35.21472],[-112.35649,35.21478],[-112.35581,35.21486],[-112.35502,35.21498],[-112.35448,35.21509],[-112.35386,35.21522],[-112.35348,35.21531],[-112.35241,35.21565],[-112.34979,35.21668],[-112.34877,35.21706],[-112.34768,35.21736],[-112.3468,35.21756],[-112.34584,35.21771],[-112.3408,35.21856],[-112.33964,35.21882],[-112.33895,35.21902],[-112.33809,35.21931],[-112.3374,35.21959],[-112.3367,35.21991],[-112.33591,35.22033],[-112.33478,35.22091],[-112.33365,35.2214],[-112.33283,35.22169],[-112.33216,35.22188],[-112.33154,35.22204],[-112.33084,35.22218],[-112.32929,35.22244],[-112.32778,35.22269],[-112.32669,35.22284],[-112.32578,35.22292],[-112.32451,35.22294],[-112.32432,35.22294],[-112.3234,35.22288],[-112.32256,35.22279],[-112.32175,35.22266],[-112.31954,35.22219],[-112.31326,35.22081],[-112.31008,35.22012],[-112.30879,35.21985],[-112.3077,35.21968],[-112.30662,35.21958],[-112.30533,35.21953],[-112.30406,35.21959],[-112.3026,35.21975],[-112.30023,35.22018],[-112.29909,35.2203],[-112.29791,35.22036],[-112.29677,35.22035],[-112.29537,35.22024],[-112.29378,35.21999],[-112.29159,35.2195],[-112.29004,35.21921],[-112.28808,35.21895],[-112.28648,35.21883],[-112.2852,35.21881],[-112.28312,35.21888],[-112.28171,35.21899],[-112.28037,35.21917],[-112.27964,35.2193],[-112.27873,35.21947],[-112.27762,35.21972],[-112.27626,35.2201],[-112.27616,35.22012],[-112.27585,35.22021],[-112.27417,35.2207],[-112.27219,35.22114],[-112.2706,35.22139],[-112.2693,35.22156],[-112.26811,35.22165],[-112.2661,35.22173],[-112.25496,35.22214],[-112.2511,35.22229],[-112.24947,35.22235],[-112.24444,35.22253],[-112.24337,35.2226],[-112.2423,35.22276],[-112.24114,35.22306],[-112.24017,35.22342],[-112.23938,35.22381],[-112.23889,35.22408],[-112.23843,35.22438],[-112.23783,35.22483],[-112.23755,35.22507],[-112.23726,35.22534],[-112.23682,35.22583],[-112.23639,35.22636],[-112.23612,35.22673],[-112.23583,35.22716],[-112.23572,35.22731],[-112.23456,35.22909],[-112.23303,35.23096],[-112.23229,35.23171],[-112.23172,35.23223],[-112.23117,35.23269],[-112.23059,35.23315],[-112.22989,35.23364],[-112.22913,35.23412],[-112.22823,35.23463],[-112.2275,35.23501],[-112.227,35.23526],[-112.22604,35.23567],[-112.22472,35.23621],[-112.22206,35.23736],[-112.22118,35.23785],[-112.22043,35.23833],[-112.21984,35.23879],[-112.21939,35.23916],[-112.21908,35.23941],[-112.21869,35.23977],[-112.21799,35.24056],[-112.21595,35.24335],[-112.21547,35.24399],[-112.21516,35.24438],[-112.2147,35.2449],[-112.21413,35.24549],[-112.21328,35.24628],[-112.21278,35.24669],[-112.21182,35.24748],[-112.21094,35.24814],[-112.21034,35.24863],[-112.20984,35.24898],[-112.20922,35.24951],[-112.20863,35.24999],[-112.20791,35.25054],[-112.20673,35.2515],[-112.20585,35.25213],[-112.20454,35.25305],[-112.20361,35.25359],[-112.20246,35.25422],[-112.20204,35.25442],[-112.20152,35.25467],[-112.19983,35.2555],[-112.19845,35.25617],[-112.19664,35.25708],[-112.19432,35.25823],[-112.1929,35.25893],[-112.19247,35.25914],[-112.19193,35.25941],[-112.19031,35.26021],[-112.18902,35.26086],[-112.18766,35.26154],[-112.18652,35.26209],[-112.1861,35.26228],[-112.18534,35.26257],[-112.18453,35.26289],[-112.18354,35.26317],[-112.18284,35.26336],[-112.1816,35.26359],[-112.18085,35.26367],[-112.17994,35.26375],[-112.17901,35.26378],[-112.17682,35.2638],[-112.17588,35.26382],[-112.17419,35.26384],[-112.17311,35.26386],[-112.17275,35.26387],[-112.17223,35.26387],[-112.16815,35.2639],[-112.16675,35.26393],[-112.1656,35.26394],[-112.16455,35.26395],[-112.16367,35.26391],[-112.16298,35.26386],[-112.16259,35.26382],[-112.162,35.26375],[-112.16136,35.26366],[-112.16052,35.2635],[-112.1599,35.26337],[-112.15949,35.26327],[-112.15866,35.26305],[-112.1571,35.26253],[-112.15672,35.26239],[-112.15609,35.26216],[-112.15481,35.26167],[-112.15336,35.26112],[-112.15241,35.26077],[-112.15162,35.26047],[-112.15105,35.26025],[-112.14928,35.25962],[-112.14825,35.25924],[-112.14727,35.25891],[-112.14641,35.25866],[-112.14584,35.25851],[-112.14551,35.25844],[-112.14444,35.25823],[-112.14355,35.25809],[-112.1423,35.25795],[-112.14086,35.25789],[-112.1397,35.25789],[-112.13538,35.25792],[-112.12952,35.25799],[-112.12805,35.25798],[-112.12543,35.258],[-112.12262,35.25805],[-112.12077,35.25808],[-112.11704,35.25811],[-112.11494,35.25812],[-112.11149,35.25818],[-112.10649,35.25822],[-112.10122,35.25828],[-112.096,35.25831],[-112.09408,35.25822],[-112.08851,35.25797],[-112.08543,35.25782],[-112.08407,35.25777],[-112.08279,35.25782],[-112.08132,35.25795],[-112.08013,35.25814],[-112.07888,35.25839],[-112.07784,35.25868],[-112.07632,35.25916],[-112.07518,35.25962],[-112.07239,35.26091],[-112.07156,35.26126],[-112.07036,35.2618],[-112.06795,35.26274],[-112.0661,35.26332],[-112.06385,35.26388],[-112.06238,35.26417],[-112.06074,35.26444],[-112.05863,35.26464],[-112.05722,35.26471],[-112.05646,35.26472],[-112.05589,35.26474],[-112.05412,35.2647],[-112.05282,35.26463],[-112.05178,35.26452],[-112.05039,35.26435],[-112.04935,35.26418],[-112.04678,35.26365],[-112.04351,35.26284],[-112.04109,35.26227],[-112.03899,35.26177],[-112.03511,35.26085],[-112.03333,35.26043],[-112.03057,35.25976],[-112.02656,35.25882],[-112.0217,35.25766],[-112.01669,35.25646],[-112.01077,35.25503],[-112.00844,35.25448],[-112.00266,35.25309],[-112.00152,35.25281],[-112.00049,35.25252],[-111.99942,35.25222],[-111.99828,35.25183],[-111.99609,35.25109],[-111.99334,35.25011],[-111.99068,35.24921],[-111.98804,35.24853],[-111.98683,35.24825],[-111.98555,35.248],[-111.98304,35.24763],[-111.98106,35.24744],[-111.97937,35.24733],[-111.97779,35.24731],[-111.97634,35.24732],[-111.97457,35.24738],[-111.97227,35.24759],[-111.97025,35.24787],[-111.96845,35.24817],[-111.96452,35.24909],[-111.96166,35.24977],[-111.96007,35.25016],[-111.95839,35.25059],[-111.95682,35.25095],[-111.95344,35.25178],[-111.95033,35.25253],[-111.9483,35.25309],[-111.947,35.25344],[-111.94553,35.25382],[-111.94411,35.25416],[-111.9436,35.25428],[-111.94231,35.25459],[-111.94148,35.25479],[-111.94068,35.25499],[-111.93975,35.25521],[-111.93901,35.25539],[-111.93734,35.2558],[-111.93652,35.256],[-111.9357,35.25619],[-111.9344,35.2565],[-111.93326,35.25671],[-111.93204,35.25686],[-111.93127,35.25691],[-111.93029,35.25696],[-111.9291,35.25695],[-111.92786,35.25687],[-111.92675,35.25675],[-111.92563,35.25654],[-111.92452,35.25629],[-111.92306,35.25592],[-111.91158,35.25305],[-111.90886,35.25262],[-111.90698,35.25245],[-111.90438,35.25235],[-111.90267,35.25221],[-111.9011,35.25195],[-111.89987,35.25166],[-111.89872,35.25132],[-111.8973,35.25083],[-111.89645,35.25048],[-111.89542,35.24998],[-111.89358,35.2491],[-111.8923,35.24849],[-111.89152,35.24818],[-111.89046,35.2478],[-111.88922,35.24745],[-111.88819,35.2472],[-111.88697,35.24698],[-111.88595,35.24685],[-111.88481,35.24676],[-111.88367,35.24672],[-111.88287,35.24673],[-111.88196,35.24676],[-111.88115,35.24682],[-111.87987,35.24699],[-111.87614,35.24767],[-111.87466,35.2479],[-111.87274,35.24814],[-111.87015,35.24839],[-111.86822,35.24852],[-111.86675,35.24856],[-111.86487,35.2486],[-111.86278,35.24857],[-111.86082,35.24848],[-111.85925,35.24838],[-111.85808,35.24827],[-111.85582,35.24801],[-111.85382,35.24772],[-111.85187,35.24739],[-111.85001,35.24701],[-111.84805,35.24655],[-111.84609,35.24603],[-111.84407,35.24542],[-111.84222,35.2448],[-111.84037,35.24412],[-111.83848,35.24335],[-111.83633,35.2424],[-111.83468,35.24161],[-111.8323,35.2405],[-111.82821,35.23857],[-111.82763,35.23829],[-111.82022,35.2348],[-111.81925,35.23433],[-111.8187,35.23406],[-111.81795,35.23371],[-111.79922,35.22487],[-111.79752,35.22401],[-111.79608,35.2232],[-111.79526,35.22272],[-111.79375,35.2218],[-111.7926,35.22103],[-111.79113,35.21997],[-111.78943,35.2186],[-111.78833,35.21773],[-111.78759,35.21721],[-111.78688,35.21674],[-111.78599,35.21622],[-111.78499,35.2157],[-111.78389,35.21521],[-111.78298,35.21486],[-111.77981,35.2138],[-111.77915,35.21359],[-111.7776,35.21308],[-111.77639,35.21266],[-111.77574,35.21238],[-111.77511,35.21203],[-111.77419,35.21138],[-111.77364,35.21092],[-111.77312,35.21037],[-111.77265,35.20977],[-111.77207,35.20882],[-111.77153,35.20797],[-111.77106,35.20719],[-111.77045,35.20636],[-111.76969,35.20555],[-111.76906,35.20498],[-111.76831,35.2044],[-111.7675,35.20389],[-111.76649,35.20336],[-111.76572,35.20305],[-111.76427,35.20253],[-111.76211,35.20186],[-111.76104,35.20149],[-111.75463,35.19947],[-111.75294,35.1991],[-111.75173,35.19891],[-111.75069,35.19882],[-111.74916,35.19866],[-111.74709,35.19846],[-111.7456,35.19823],[-111.74456,35.19802],[-111.74337,35.19769],[-111.74203,35.19718],[-111.741,35.19674],[-111.73985,35.19609],[-111.73892,35.19545],[-111.73845,35.19514],[-111.73709,35.19421],[-111.73625,35.19376],[-111.73535,35.19337],[-111.73019,35.19175],[-111.72729,35.19085],[-111.72619,35.19052],[-111.72511,35.19019],[-111.72461,35.19002],[-111.72398,35.18983],[-111.71559,35.1872],[-111.7139,35.1867],[-111.71251,35.18625],[-111.71032,35.18555],[-111.70963,35.18533],[-111.70424,35.18365],[-111.70268,35.18318],[-111.70186,35.18293],[-111.69935,35.18228],[-111.69579,35.18145],[-111.69489,35.18123],[-111.69399,35.18101],[-111.68677,35.1793],[-111.68526,35.17895],[-111.68427,35.17873],[-111.6794,35.17759],[-111.67615,35.17677],[-111.67553,35.17658],[-111.67491,35.17638],[-111.67377,35.17599],[-111.67306,35.17573],[-111.67195,35.1753],[-111.67156,35.17513],[-111.67001,35.17452],[-111.66956,35.17433],[-111.66908,35.17414],[-111.66823,35.17379],[-111.66763,35.17355],[-111.66704,35.17331],[-111.66595,35.17286],[-111.66484,35.17242],[-111.66436,35.17224],[-111.66409,35.17215],[-111.66386,35.17206],[-111.66356,35.17197],[-111.66318,35.17186],[-111.66282,35.17176],[-111.66274,35.17173],[-111.662,35.17154],[-111.66125,35.17138],[-111.66089,35.17129],[-111.66045,35.17123],[-111.65988,35.17114],[-111.65956,35.17109],[-111.65903,35.17104],[-111.6586,35.171],[-111.6573,35.17094],[-111.65663,35.17092],[-111.6561,35.17094],[-111.65519,35.17099],[-111.65441,35.17104],[-111.65315,35.17121],[-111.65256,35.17131],[-111.65198,35.17143],[-111.65148,35.17154],[-111.65112,35.17163],[-111.65068,35.17174],[-111.65022,35.17186],[-111.64997,35.17194],[-111.6493,35.17217],[-111.6488,35.17236],[-111.64841,35.17251],[-111.64805,35.17266],[-111.64743,35.17292],[-111.647,35.17313],[-111.64629,35.17349],[-111.64579,35.17377],[-111.64538,35.174],[-111.64493,35.17429],[-111.6444,35.17464],[-111.64381,35.17506],[-111.64319,35.17554],[-111.64284,35.17583],[-111.64247,35.17609],[-111.64143,35.17701],[-111.64124,35.17718],[-111.64073,35.17761],[-111.64026,35.178],[-111.63979,35.17839],[-111.63942,35.1787],[-111.6389,35.17913],[-111.63814,35.17978],[-111.63758,35.18026],[-111.63694,35.18082],[-111.63624,35.18143],[-111.63553,35.18203],[-111.63506,35.18244],[-111.63439,35.18301],[-111.63378,35.18353],[-111.63328,35.18393],[-111.63241,35.18468],[-111.63197,35.18505],[-111.63136,35.18553],[-111.63068,35.18603],[-111.6302,35.18637],[-111.62959,35.18679],[-111.62919,35.18705],[-111.62862,35.1874],[-111.62804,35.18774],[-111.62767,35.18795],[-111.62728,35.18818],[-111.62663,35.18855],[-111.62596,35.18891],[-111.62531,35.18927],[-111.62494,35.18948],[-111.62428,35.18987],[-111.62377,35.19015],[-111.62332,35.19042],[-111.62273,35.19078],[-111.62232,35.19103],[-111.62169,35.19143],[-111.62139,35.19163],[-111.62056,35.19219],[-111.62004,35.19259],[-111.61953,35.19297],[-111.619,35.19337],[-111.61843,35.1938],[-111.6173,35.19465],[-111.6168,35.19504],[-111.61614,35.19554],[-111.61574,35.19584],[-111.61557,35.19596],[-111.61523,35.19622],[-111.61478,35.19657],[-111.61442,35.19684],[-111.61397,35.19718],[-111.61358,35.19747],[-111.61299,35.19793],[-111.61222,35.19852],[-111.61156,35.19901],[-111.61084,35.19955],[-111.61009,35.20012],[-111.60941,35.20063],[-111.60884,35.20106],[-111.60824,35.20153],[-111.60774,35.2019],[-111.60726,35.20227],[-111.60686,35.20257],[-111.60613,35.20311],[-111.60545,35.20363],[-111.60476,35.20416],[-111.60381,35.20487],[-111.60315,35.20538],[-111.60265,35.20575],[-111.60208,35.20618],[-111.6016,35.20655],[-111.60116,35.20688],[-111.60059,35.20731],[-111.60008,35.2077],[-111.5995,35.20815],[-111.59887,35.2086],[-111.5983,35.20901],[-111.59761,35.20948],[-111.59698,35.20989],[-111.59631,35.21032],[-111.59577,35.21065],[-111.59503,35.21109],[-111.59434,35.21148],[-111.59358,35.21189],[-111.59287,35.21227],[-111.59233,35.21255],[-111.59166,35.21287],[-111.59102,35.21318],[-111.59029,35.21352],[-111.58941,35.2139],[-111.58875,35.21417],[-111.58815,35.21441],[-111.58736,35.21472],[-111.58673,35.21496],[-111.58635,35.21508],[-111.58625,35.21511],[-111.58589,35.21524],[-111.58536,35.21542],[-111.58475,35.21562],[-111.58429,35.21577],[-111.58383,35.21591],[-111.58344,35.21602],[-111.58308,35.21613],[-111.58257,35.21628],[-111.58203,35.21642],[-111.58159,35.21653],[-111.58076,35.21674],[-111.58012,35.21688],[-111.57959,35.217],[-111.57893,35.21715],[-111.57853,35.21722],[-111.57759,35.21739],[-111.57687,35.21751],[-111.57579,35.21767],[-111.57488,35.21781],[-111.57445,35.21787],[-111.574,35.21792],[-111.57334,35.21799],[-111.57276,35.21804],[-111.57227,35.21808],[-111.57173,35.21809],[-111.56955,35.21823],[-111.56521,35.21821],[-111.56233,35.21804],[-111.5581,35.21751],[-111.55427,35.21673],[-111.55297,35.21647],[-111.54238,35.21424],[-111.53166,35.21176],[-111.52817,35.21095],[-111.52395,35.20997],[-111.52335,35.20981],[-111.52286,35.20971],[-111.52058,35.20917],[-111.51841,35.20867],[-111.517,35.20833],[-111.51334,35.20748],[-111.51244,35.20729],[-111.51129,35.20707],[-111.51066,35.20696],[-111.50996,35.20686],[-111.50956,35.20681],[-111.50891,35.20671],[-111.50826,35.20665],[-111.50759,35.20658],[-111.50637,35.20646],[-111.50472,35.20631],[-111.50318,35.20616],[-111.50262,35.2061],[-111.50223,35.20605],[-111.50189,35.20602],[-111.50155,35.20597],[-111.50069,35.20586],[-111.49907,35.20557],[-111.49821,35.20542],[-111.49721,35.20522],[-111.49512,35.20481],[-111.49306,35.20443],[-111.4912,35.20407],[-111.48826,35.20351],[-111.4854,35.20297],[-111.48369,35.20263],[-111.48106,35.20213],[-111.48012,35.20195],[-111.4791,35.20179],[-111.47866,35.20174],[-111.47808,35.20167],[-111.47706,35.20158],[-111.47591,35.2015],[-111.47485,35.20149],[-111.47409,35.20149],[-111.47308,35.20153],[-111.47136,35.20167],[-111.47061,35.20177],[-111.46996,35.20185],[-111.46856,35.20201],[-111.46787,35.20207],[-111.46741,35.2021],[-111.46523,35.20222],[-111.46327,35.20223],[-111.46,35.20213],[-111.45639,35.20202],[-111.44928,35.20183],[-111.44254,35.20163],[-111.43301,35.20135],[-111.42862,35.20122],[-111.42603,35.20116],[-111.42477,35.20118],[-111.42364,35.20124],[-111.42251,35.20138],[-111.4187,35.20202],[-111.41655,35.20235],[-111.41518,35.20248],[-111.41402,35.20252],[-111.41192,35.20246],[-111.41081,35.20234],[-111.40989,35.2022],[-111.40895,35.20203],[-111.4076,35.2017],[-111.40599,35.2012],[-111.40099,35.19914],[-111.40005,35.19875],[-111.39791,35.19789],[-111.3933,35.196],[-111.38235,35.19151],[-111.37686,35.18929],[-111.37135,35.18712],[-111.31893,35.16642],[-111.30109,35.15939],[-111.29824,35.15827],[-111.2967,35.15785],[-111.29515,35.15757],[-111.29348,35.15749],[-111.29186,35.15755],[-111.29013,35.15781],[-111.28848,35.15828],[-111.28643,35.15904],[-111.28538,35.15944],[-111.28497,35.15961],[-111.28432,35.15987],[-111.28068,35.16125],[-111.27899,35.16161],[-111.27867,35.16167],[-111.27836,35.16172],[-111.27799,35.16176],[-111.27776,35.16179],[-111.27687,35.16184],[-111.2761,35.16186],[-111.27546,35.16185],[-111.27466,35.16179],[-111.27371,35.16166],[-111.27313,35.16155],[-111.27223,35.16132],[-111.27082,35.16086],[-111.26598,35.15907],[-111.26536,35.15885],[-111.26463,35.15857],[-111.25503,35.15505],[-111.25024,35.15329],[-111.20576,35.13698],[-111.19669,35.13365],[-111.19397,35.13265],[-111.19014,35.13124],[-111.1899,35.13115],[-111.18813,35.13053],[-111.18653,35.12994],[-111.18392,35.12896],[-111.18357,35.12885],[-111.18162,35.12813],[-111.17878,35.12707],[-111.17603,35.12607],[-111.17268,35.12485],[-111.17202,35.12461],[-111.17151,35.12443],[-111.17087,35.12421],[-111.17022,35.124],[-111.16941,35.12374],[-111.16878,35.12355],[-111.16818,35.12336],[-111.16638,35.12284],[-111.16556,35.12262],[-111.16513,35.12251],[-111.16452,35.12235],[-111.16362,35.12213],[-111.16302,35.12199],[-111.16228,35.12182],[-111.16106,35.12155],[-111.16057,35.12145],[-111.16002,35.12133],[-111.15971,35.12127],[-111.15934,35.1212],[-111.1588,35.1211],[-111.15817,35.12098],[-111.15753,35.12088],[-111.15698,35.12079],[-111.15451,35.12039],[-111.14263,35.11922],[-111.12744,35.11778],[-111.11402,35.11655],[-111.11153,35.11634],[-111.11046,35.11628],[-111.10938,35.11628],[-111.10823,35.11634],[-111.1072,35.11645],[-111.10016,35.11746],[-111.09941,35.11756],[-111.09852,35.11767],[-111.09776,35.11776],[-111.09709,35.11782],[-111.09675,35.11783],[-111.09621,35.11785],[-111.09555,35.11785],[-111.09516,35.11785],[-111.09444,35.11782],[-111.09383,35.11777],[-111.09321,35.11772],[-111.09269,35.11766],[-111.09047,35.11732],[-111.09,35.11724],[-111.08937,35.11715],[-111.08682,35.11677],[-111.08544,35.11655],[-111.08473,35.11643],[-111.082,35.11602],[-111.07984,35.11568],[-111.07156,35.11442],[-111.06465,35.11366],[-111.03633,35.11069],[-111.03077,35.11011],[-111.02952,35.10997],[-111.02843,35.10985],[-111.02687,35.10966],[-111.02472,35.10936],[-111.02264,35.10904],[-111.02098,35.10878],[-111.02021,35.10864],[-111.0189,35.10839],[-111.01686,35.10799],[-111.01257,35.10707],[-111.00931,35.10637],[-111.00781,35.10605],[-110.99747,35.10383],[-110.99449,35.10318],[-110.99316,35.10289],[-110.98999,35.10221],[-110.98926,35.10205],[-110.98808,35.1018],[-110.98626,35.10141],[-110.98246,35.10059],[-110.98114,35.10031],[-110.98064,35.10021],[-110.9799,35.10008],[-110.97884,35.0999],[-110.97787,35.09977],[-110.97709,35.09967],[-110.97606,35.09955],[-110.97533,35.09947],[-110.97399,35.09936],[-110.97322,35.0993],[-110.97168,35.09917],[-110.96814,35.09888],[-110.96483,35.09861],[-110.96395,35.09854],[-110.96118,35.09833],[-110.95476,35.09764],[-110.94502,35.09622],[-110.93537,35.09478],[-110.93449,35.09464],[-110.93093,35.09413],[-110.93059,35.09408],[-110.92523,35.0933],[-110.92446,35.09317],[-110.92297,35.09293],[-110.92163,35.0927],[-110.92046,35.09249],[-110.91993,35.09241],[-110.91472,35.0913],[-110.90828,35.08961],[-110.90325,35.08807],[-110.89499,35.08524],[-110.88805,35.08287],[-110.88489,35.0818],[-110.8817,35.08081],[-110.86093,35.07475],[-110.85822,35.07396],[-110.85606,35.07332],[-110.85347,35.07257],[-110.85201,35.07214],[-110.85076,35.07177],[-110.84758,35.07084],[-110.84474,35.07001],[-110.84308,35.06953],[-110.84138,35.06902],[-110.84007,35.06865],[-110.83827,35.06813],[-110.83546,35.0673],[-110.83035,35.06579],[-110.83013,35.06573],[-110.82901,35.0654],[-110.82742,35.06494],[-110.8257,35.06445],[-110.82492,35.06421],[-110.82416,35.06399],[-110.82302,35.06366],[-110.81783,35.06214],[-110.8171,35.06193],[-110.81339,35.06084],[-110.81152,35.06029],[-110.81064,35.06002],[-110.80717,35.05902],[-110.80312,35.05783],[-110.79987,35.05689],[-110.79771,35.05625],[-110.79636,35.05585],[-110.79006,35.05401],[-110.77829,35.05057],[-110.76917,35.04788],[-110.75597,35.04402],[-110.75441,35.04356],[-110.75155,35.04272],[-110.75012,35.0423],[-110.74868,35.0419],[-110.74653,35.04134],[-110.74434,35.04079],[-110.74214,35.0403],[-110.74008,35.03985],[-110.73462,35.0387],[-110.73267,35.03836],[-110.73148,35.03819],[-110.73031,35.03802],[-110.72833,35.03785],[-110.72674,35.03775],[-110.72515,35.03767],[-110.72265,35.03769],[-110.72067,35.03777],[-110.71903,35.0379],[-110.71749,35.03803],[-110.71438,35.03844],[-110.71108,35.03888],[-110.70969,35.03906],[-110.70927,35.0391],[-110.70842,35.03917],[-110.70823,35.03918],[-110.70763,35.03921],[-110.70734,35.03922],[-110.70678,35.03925],[-110.70584,35.03927],[-110.70462,35.03928],[-110.70402,35.03928],[-110.70179,35.03931],[-110.69898,35.03933],[-110.69845,35.03934],[-110.69738,35.03932],[-110.69699,35.03932],[-110.69634,35.03927],[-110.69549,35.03916],[-110.69469,35.03904],[-110.69405,35.03887],[-110.69372,35.03878],[-110.69347,35.03871],[-110.69324,35.03865],[-110.69298,35.03856],[-110.69269,35.03845],[-110.69225,35.03829],[-110.6918,35.03809],[-110.69121,35.03781],[-110.69073,35.03755],[-110.69039,35.03736],[-110.69034,35.03732],[-110.68985,35.037],[-110.68959,35.03682],[-110.68938,35.03668],[-110.68921,35.03655],[-110.68894,35.03635],[-110.68862,35.03607],[-110.68828,35.03577],[-110.68805,35.03554],[-110.68784,35.03532],[-110.68762,35.03506],[-110.68736,35.03477],[-110.68705,35.03438],[-110.68665,35.03378],[-110.68648,35.03349],[-110.68629,35.03315],[-110.68611,35.03284],[-110.68583,35.03223],[-110.68523,35.03106],[-110.68505,35.03067],[-110.68479,35.03018],[-110.68452,35.02963],[-110.68421,35.029],[-110.68352,35.02763],[-110.68313,35.02683],[-110.68232,35.0252],[-110.68197,35.02448],[-110.6818,35.02417],[-110.68162,35.02386],[-110.68148,35.02359],[-110.68128,35.0233],[-110.68106,35.02293],[-110.68079,35.02255],[-110.68042,35.02208],[-110.67998,35.0216],[-110.67997,35.02159],[-110.67977,35.02136],[-110.67952,35.02109],[-110.67908,35.02067],[-110.67879,35.0204],[-110.67847,35.02013],[-110.67805,35.0198],[-110.67762,35.01949],[-110.6772,35.01921],[-110.67689,35.01902],[-110.67642,35.01873],[-110.67604,35.01852],[-110.67555,35.01827],[-110.67511,35.01805],[-110.67483,35.01794],[-110.67448,35.01778],[-110.67412,35.01764],[-110.67379,35.01752],[-110.67345,35.0174],[-110.67311,35.01729],[-110.6726,35.01714],[-110.67117,35.01675],[-110.67061,35.01659],[-110.66994,35.01642],[-110.66924,35.01623],[-110.66793,35.01587],[-110.66561,35.01524],[-110.66332,35.01461],[-110.66241,35.01437],[-110.66001,35.01372],[-110.65786,35.01314],[-110.65474,35.01227],[-110.65152,35.01141],[-110.64937,35.01082],[-110.6485,35.01059],[-110.64542,35.00974],[-110.64213,35.00885],[-110.63612,35.00723],[-110.6337,35.00675],[-110.63294,35.00665],[-110.63114,35.00649],[-110.62974,35.00642],[-110.62842,35.00642],[-110.62704,35.00649],[-110.62346,35.00671],[-110.6223,35.00676],[-110.62115,35.00673],[-110.62028,35.00667],[-110.61906,35.00654],[-110.61777,35.00631],[-110.61645,35.006],[-110.61485,35.00549],[-110.61072,35.00411],[-110.60949,35.00368],[-110.60726,35.00291],[-110.57987,34.99356],[-110.56589,34.98875],[-110.55241,34.98418],[-110.54465,34.98153],[-110.54314,34.98101],[-110.54166,34.9805],[-110.54049,34.98012],[-110.53942,34.97975],[-110.53843,34.9794],[-110.5377,34.97915],[-110.5371,34.97895],[-110.53636,34.9787],[-110.53537,34.97837],[-110.53416,34.97796],[-110.53349,34.97773],[-110.53242,34.97736],[-110.53127,34.97697],[-110.52991,34.97655],[-110.52897,34.97626],[-110.52792,34.97596],[-110.52709,34.97574],[-110.52589,34.97542],[-110.52551,34.97533],[-110.52349,34.97484],[-110.52184,34.9745],[-110.52098,34.97434],[-110.51737,34.97371],[-110.51641,34.97356],[-110.51561,34.97345],[-110.51498,34.97338],[-110.51497,34.97338],[-110.51428,34.9733],[-110.5134,34.9732],[-110.51237,34.97309],[-110.51156,34.97301],[-110.51096,34.97297],[-110.50979,34.97287],[-110.50931,34.97285],[-110.50819,34.97279],[-110.5066,34.97271],[-110.50393,34.97259],[-110.49993,34.97242],[-110.49774,34.97231],[-110.49632,34.97225],[-110.495,34.9722],[-110.49319,34.97212],[-110.49154,34.97205],[-110.48927,34.97194],[-110.4879,34.97187],[-110.48625,34.9718],[-110.48499,34.97175],[-110.48395,34.9717],[-110.48243,34.97163],[-110.47988,34.97152],[-110.47719,34.97139],[-110.47459,34.97128],[-110.47312,34.97121],[-110.47095,34.97111],[-110.47016,34.97107],[-110.46811,34.97099],[-110.46547,34.97087],[-110.46053,34.97064],[-110.45641,34.97045],[-110.45396,34.97034],[-110.44716,34.97004],[-110.44602,34.96999],[-110.44452,34.96992],[-110.44361,34.96988],[-110.44271,34.96984],[-110.44189,34.9698],[-110.43938,34.96967],[-110.43791,34.96956],[-110.43658,34.96943],[-110.43565,34.96933],[-110.43488,34.96925],[-110.43399,34.96914],[-110.43362,34.96909],[-110.43168,34.96882],[-110.43071,34.96866],[-110.42992,34.96854],[-110.42936,34.96845],[-110.4286,34.96833],[-110.42738,34.96813],[-110.42531,34.96781],[-110.42204,34.96729],[-110.41958,34.96691],[-110.41768,34.9666],[-110.41544,34.96625],[-110.4147,34.96613],[-110.41101,34.96555],[-110.4078,34.96504],[-110.40742,34.96498],[-110.40211,34.96414],[-110.40081,34.96393],[-110.39537,34.96306],[-110.39221,34.96256],[-110.39054,34.96231],[-110.38785,34.96188],[-110.3863,34.96163],[-110.37942,34.96054],[-110.37426,34.95972],[-110.37223,34.9594],[-110.36349,34.95801],[-110.3604,34.95751],[-110.35918,34.95733],[-110.35828,34.95718],[-110.35719,34.95701],[-110.35146,34.9561],[-110.35072,34.95598],[-110.34924,34.95574],[-110.34832,34.95559],[-110.34319,34.95478],[-110.34254,34.95468],[-110.342,34.95459],[-110.34143,34.9545],[-110.34101,34.95445],[-110.3406,34.9544],[-110.33992,34.95434],[-110.3395,34.9543],[-110.33859,34.95427],[-110.33795,34.95426],[-110.33285,34.95426],[-110.33141,34.95426],[-110.33012,34.95427],[-110.32847,34.95426],[-110.32767,34.9543],[-110.32688,34.95435],[-110.32591,34.95445],[-110.32542,34.95453],[-110.32394,34.9548],[-110.3226,34.95505],[-110.32167,34.9552],[-110.32102,34.95526],[-110.32021,34.95529],[-110.31965,34.95527],[-110.31872,34.95519],[-110.31768,34.95502],[-110.31653,34.95475],[-110.31577,34.9545],[-110.31335,34.95352],[-110.30882,34.95164],[-110.30565,34.95028],[-110.29602,34.94632],[-110.29529,34.94601],[-110.29157,34.94448],[-110.28841,34.94318],[-110.2869,34.94254],[-110.28485,34.94169],[-110.28265,34.94077],[-110.28182,34.94037],[-110.28109,34.93995],[-110.28024,34.93936],[-110.2796,34.93885],[-110.2792,34.93849],[-110.27774,34.93696],[-110.27591,34.9347],[-110.27487,34.93348],[-110.2739,34.93234],[-110.2734,34.93182],[-110.27281,34.93129],[-110.27218,34.93079],[-110.27131,34.93017],[-110.26966,34.92902],[-110.26679,34.92702],[-110.26355,34.92478],[-110.25874,34.92142],[-110.25692,34.92014],[-110.25592,34.91944],[-110.25445,34.91842],[-110.25294,34.91744],[-110.25117,34.91632],[-110.24934,34.91528],[-110.24826,34.91469],[-110.24715,34.91411],[-110.24541,34.91327],[-110.24464,34.91291],[-110.2437,34.91252],[-110.24295,34.91223],[-110.24221,34.91194],[-110.24065,34.9114],[-110.23964,34.91109],[-110.23875,34.91083],[-110.23794,34.91062],[-110.23708,34.9104],[-110.23615,34.9102],[-110.23537,34.91004],[-110.23434,34.90986],[-110.2334,34.90971],[-110.23134,34.90945],[-110.22832,34.90909],[-110.21844,34.90792],[-110.21718,34.90776],[-110.21464,34.90745],[-110.21262,34.90724],[-110.20693,34.90656],[-110.20119,34.90588],[-110.19914,34.90564],[-110.19371,34.905],[-110.1929,34.90492],[-110.19229,34.90488],[-110.19141,34.90486],[-110.19052,34.90489],[-110.18949,34.90497],[-110.18887,34.90505],[-110.18832,34.90514],[-110.18731,34.90534],[-110.18598,34.9057],[-110.18548,34.90587],[-110.18488,34.90609],[-110.18287,34.9069],[-110.1795,34.90826],[-110.17853,34.90864],[-110.17785,34.9089],[-110.17715,34.90915],[-110.17598,34.90952],[-110.17499,34.90977],[-110.17428,34.90995],[-110.17355,34.91011],[-110.17259,34.91028],[-110.1715,34.91045],[-110.17047,34.91057],[-110.16927,34.91069],[-110.16881,34.91073],[-110.16554,34.91104],[-110.16161,34.91146],[-110.15959,34.91178],[-110.15828,34.91204],[-110.15731,34.91226],[-110.15669,34.91241],[-110.15421,34.91311],[-110.15305,34.91349],[-110.15169,34.91399],[-110.15054,34.91446],[-110.14906,34.91511],[-110.14835,34.91544],[-110.14636,34.91649],[-110.14547,34.91701],[-110.14415,34.91783],[-110.14347,34.91829],[-110.14195,34.91937],[-110.14046,34.92054],[-110.13934,34.92155],[-110.13847,34.92238],[-110.13731,34.92357],[-110.13558,34.92564],[-110.13441,34.92725],[-110.13353,34.92862],[-110.13277,34.92995],[-110.1319,34.93173],[-110.13149,34.93269],[-110.13092,34.93425],[-110.13048,34.93557],[-110.13015,34.93643],[-110.12979,34.93728],[-110.1294,34.93805],[-110.12869,34.93928],[-110.12812,34.94017],[-110.12739,34.94116],[-110.12669,34.942],[-110.12567,34.94308],[-110.12471,34.94399],[-110.12385,34.94474],[-110.12225,34.9461],[-110.12141,34.94684],[-110.11719,34.9505],[-110.11515,34.95227],[-110.11353,34.95367],[-110.11118,34.9557],[-110.10762,34.95879],[-110.10365,34.96226],[-110.10284,34.96295],[-110.10019,34.9652],[-110.09883,34.96627],[-110.09721,34.96747],[-110.09581,34.96841],[-110.09405,34.96952],[-110.09143,34.97101],[-110.09002,34.97174],[-110.08691,34.97318],[-110.08653,34.97333],[-110.08457,34.97412],[-110.08183,34.97508],[-110.08067,34.97543],[-110.08001,34.97563],[-110.07899,34.97594],[-110.07776,34.97625],[-110.07579,34.97672],[-110.074,34.97708],[-110.06692,34.97834],[-110.06326,34.979],[-110.05988,34.97959],[-110.05748,34.98002],[-110.05253,34.98088],[-110.05158,34.98106],[-110.03977,34.98317],[-110.03245,34.98443],[-110.0247,34.98581],[-110.00232,34.98977],[-110.00011,34.99016],[-109.99821,34.99045],[-109.99715,34.99059],[-109.99686,34.99062],[-109.99528,34.99079],[-109.99333,34.99095],[-109.99099,34.99106],[-109.98921,34.9911],[-109.98664,34.99108],[-109.98357,34.99093],[-109.98301,34.99091],[-109.97886,34.99071],[-109.97694,34.99061],[-109.97472,34.99055],[-109.97254,34.99054],[-109.97033,34.99057],[-109.96798,34.99068],[-109.96651,34.99077],[-109.95626,34.99174],[-109.95003,34.99234],[-109.94862,34.99248],[-109.943,34.99306],[-109.94173,34.99321],[-109.93848,34.99365],[-109.93625,34.99399],[-109.93302,34.99455],[-109.929,34.99528],[-109.92303,34.99635],[-109.9154,34.99772],[-109.91267,34.99821],[-109.91251,34.99824],[-109.90907,34.99884],[-109.9072,34.99917],[-109.90466,34.99963],[-109.90142,35.00021],[-109.9007,35.00035],[-109.90056,35.00037],[-109.89746,35.00093],[-109.89415,35.00157],[-109.89122,35.00218],[-109.88785,35.003],[-109.88214,35.00467],[-109.88015,35.00532],[-109.87643,35.00668],[-109.8741,35.00759],[-109.87167,35.00863],[-109.86711,35.01077],[-109.86514,35.01179],[-109.86305,35.01293],[-109.86172,35.0137],[-109.85801,35.0159],[-109.85072,35.02032],[-109.84873,35.02151],[-109.84726,35.02235],[-109.84499,35.02362],[-109.84276,35.02493],[-109.82047,35.0377],[-109.80089,35.04892],[-109.78724,35.05673],[-109.78367,35.05878],[-109.78262,35.05937],[-109.78128,35.06015],[-109.77957,35.0611],[-109.77798,35.06194],[-109.77648,35.06269],[-109.77567,35.06307],[-109.77484,35.06344],[-109.77289,35.06432],[-109.77109,35.06508],[-109.76867,35.06601],[-109.76604,35.06692],[-109.76278,35.06793],[-109.75911,35.06902],[-109.7553,35.07015],[-109.75167,35.07122],[-109.74888,35.07204],[-109.74486,35.07324],[-109.74124,35.0743],[-109.73894,35.07497],[-109.73726,35.07548],[-109.73591,35.07589],[-109.73178,35.0771],[-109.72989,35.07767],[-109.72758,35.07834],[-109.72547,35.07897],[-109.72337,35.07958],[-109.71954,35.08072],[-109.71576,35.08182],[-109.71385,35.08241],[-109.71173,35.08303],[-109.7085,35.08399],[-109.70784,35.08418],[-109.70688,35.08446],[-109.70637,35.08462],[-109.70298,35.08561],[-109.68473,35.09099],[-109.6775,35.0931],[-109.67378,35.09412],[-109.67051,35.09487],[-109.66876,35.09523],[-109.6668,35.09557],[-109.65361,35.0975],[-109.64723,35.09842],[-109.64654,35.09854],[-109.64571,35.09864],[-109.64511,35.09872],[-109.64446,35.09883],[-109.64219,35.09916],[-109.64058,35.0994],[-109.63716,35.09986],[-109.63654,35.09995],[-109.63123,35.10072],[-109.62999,35.10089],[-109.62807,35.10118],[-109.62556,35.10157],[-109.6203,35.10235],[-109.61772,35.10278],[-109.61595,35.10311],[-109.61201,35.104],[-109.60803,35.1051],[-109.60468,35.10619],[-109.60132,35.10735],[-109.59678,35.10892],[-109.5923,35.11047],[-109.58946,35.11144],[-109.5889,35.11164],[-109.57586,35.11616],[-109.57122,35.11776],[-109.56798,35.11887],[-109.56406,35.12023],[-109.562,35.12094],[-109.55734,35.12254],[-109.55105,35.12475],[-109.54909,35.12557],[-109.54822,35.12592],[-109.54727,35.12632],[-109.54501,35.12734],[-109.54352,35.12803],[-109.54236,35.12859],[-109.54184,35.12886],[-109.54096,35.1293],[-109.53721,35.13129],[-109.53656,35.13166],[-109.53539,35.13236],[-109.5336,35.13345],[-109.53132,35.1349],[-109.52943,35.13614],[-109.52786,35.13716],[-109.52589,35.13844],[-109.5245,35.13934],[-109.52101,35.14162],[-109.51718,35.14412],[-109.51113,35.14804],[-109.50897,35.14945],[-109.50696,35.15076],[-109.5067,35.15093],[-109.50455,35.15233],[-109.50288,35.15342],[-109.50137,35.1544],[-109.49961,35.15554],[-109.49763,35.15683],[-109.49585,35.15798],[-109.49411,35.15912],[-109.49056,35.16142],[-109.48904,35.16242],[-109.48818,35.16298],[-109.48677,35.1639],[-109.48564,35.16463],[-109.48386,35.16578],[-109.48266,35.16656],[-109.48094,35.16768],[-109.479,35.16893],[-109.47666,35.17046],[-109.47498,35.17155],[-109.47311,35.17277],[-109.47115,35.17404],[-109.46933,35.17523],[-109.46436,35.17845],[-109.46264,35.17953],[-109.46092,35.18055],[-109.45922,35.18151],[-109.45827,35.18202],[-109.45735,35.1825],[-109.45536,35.18348],[-109.45356,35.18431],[-109.45162,35.18515],[-109.44971,35.18592],[-109.4477,35.18667],[-109.44544,35.18746],[-109.44352,35.18806],[-109.44178,35.18859],[-109.44087,35.18886],[-109.44005,35.18909],[-109.43897,35.1894],[-109.43804,35.18965],[-109.43629,35.19011],[-109.43557,35.19028],[-109.43494,35.19045],[-109.43301,35.19091],[-109.43103,35.19135],[-109.42682,35.19224],[-109.42562,35.19249],[-109.42143,35.19338],[-109.38373,35.20131],[-109.37898,35.20231],[-109.37498,35.20315],[-109.36787,35.20464],[-109.36261,35.20575],[-109.35939,35.20642],[-109.35429,35.20755],[-109.35308,35.20788],[-109.34936,35.20892],[-109.34629,35.20993],[-109.34385,35.21078],[-109.34308,35.21108],[-109.34013,35.21229],[-109.33805,35.21321],[-109.33689,35.21376],[-109.33528,35.21455],[-109.33385,35.21529],[-109.33213,35.21618],[-109.33063,35.21702],[-109.32902,35.21799],[-109.32794,35.21866],[-109.3277,35.2188],[-109.32491,35.22066],[-109.32201,35.22276],[-109.31952,35.22474],[-109.31885,35.22527],[-109.31835,35.22566],[-109.31225,35.23045],[-109.30682,35.23469],[-109.30541,35.23583],[-109.30487,35.23627],[-109.29878,35.24105],[-109.29853,35.24124],[-109.29169,35.24659],[-109.2914,35.24682],[-109.28929,35.24846],[-109.28731,35.25006],[-109.28064,35.25587],[-109.28011,35.25638],[-109.27888,35.25742],[-109.27813,35.25804],[-109.27705,35.25898],[-109.27355,35.26203],[-109.27103,35.26417],[-109.2597,35.27414],[-109.25871,35.275],[-109.25768,35.27578],[-109.25569,35.27685],[-109.25418,35.27752],[-109.25276,35.278],[-109.25065,35.27851],[-109.24612,35.27975],[-109.24347,35.28046],[-109.24,35.28142],[-109.23974,35.2815],[-109.23772,35.282],[-109.23595,35.28233],[-109.23499,35.28244],[-109.2341,35.28256],[-109.23305,35.28264],[-109.23123,35.28271],[-109.21628,35.28271],[-109.21562,35.28271],[-109.21323,35.2827],[-109.21231,35.28268],[-109.21176,35.28266],[-109.21084,35.28263],[-109.20978,35.28259],[-109.20893,35.28255],[-109.20801,35.28251],[-109.20725,35.28245],[-109.20642,35.2824],[-109.20475,35.28227],[-109.20027,35.28183],[-109.19643,35.28142],[-109.1943,35.2812],[-109.19133,35.28092],[-109.1865,35.28039],[-109.18299,35.28006],[-109.18217,35.27999],[-109.18127,35.27992],[-109.18046,35.27991],[-109.17967,35.27996],[-109.17873,35.28005],[-109.17788,35.28019],[-109.17717,35.28034],[-109.17642,35.28055],[-109.1757,35.28079],[-109.175,35.28107],[-109.17424,35.28138],[-109.16744,35.28429],[-109.1671,35.28444],[-109.16237,35.28641],[-109.16155,35.28676],[-109.15785,35.28833],[-109.15402,35.28995],[-109.15346,35.29018],[-109.15046,35.29144],[-109.14599,35.29336],[-109.14025,35.29587],[-109.13675,35.29739],[-109.1323,35.29932],[-109.132,35.29944],[-109.12771,35.30132],[-109.12099,35.30423],[-109.12072,35.30433],[-109.11753,35.30574],[-109.11024,35.30889],[-109.10697,35.31034],[-109.10664,35.31049],[-109.10384,35.3117],[-109.09948,35.31374],[-109.09641,35.31539],[-109.09475,35.3163],[-109.09305,35.3173],[-109.09152,35.31824],[-109.08959,35.31949],[-109.08936,35.31964],[-109.08829,35.32036],[-109.08698,35.32127],[-109.08495,35.32274],[-109.08088,35.32597],[-109.07902,35.32758],[-109.07878,35.32779],[-109.07677,35.32972],[-109.07315,35.3331],[-109.07148,35.3347],[-109.07068,35.33545],[-109.06818,35.33781],[-109.06797,35.33804],[-109.06545,35.34057],[-109.06421,35.34191],[-109.06349,35.34276],[-109.06203,35.34466],[-109.06075,35.34647],[-109.05791,35.35067],[-109.05676,35.35235],[-109.05592,35.35363],[-109.05538,35.35436],[-109.05468,35.35511],[-109.05426,35.35554],[-109.05383,35.35595],[-109.05339,35.35634],[-109.05306,35.35662],[-109.05231,35.35721],[-109.05186,35.35753],[-109.05139,35.35786],[-109.05041,35.35859],[-109.04959,35.35928],[-109.04932,35.35953],[-109.04855,35.36028],[-109.04765,35.36132],[-109.04679,35.36245],[-109.0463,35.3631],[-109.0458,35.3639],[-109.0454,35.3647],[-109.04507,35.36549],[-109.04478,35.36617],[-109.04433,35.36723],[-109.04416,35.36759],[-109.04396,35.36792],[-109.04371,35.36829],[-109.04349,35.36858],[-109.04315,35.369],[-109.04266,35.3695],[-109.04223,35.3699],[-109.04189,35.37017],[-109.04147,35.37047],[-109.04112,35.37069],[-109.04052,35.37102],[-109.04003,35.37125],[-109.03857,35.37196],[-109.03526,35.37353],[-109.03425,35.37401],[-109.03384,35.37419],[-109.02805,35.37689],[-109.02496,35.37834],[-109.02404,35.37875],[-109.01931,35.381],[-109.01821,35.38151],[-109.01722,35.38204],[-109.01618,35.38269],[-109.0156,35.38312],[-109.01495,35.38362],[-109.01428,35.38419],[-109.01357,35.38484],[-109.01296,35.38551],[-109.01234,35.38625],[-109.01189,35.38681],[-109.01148,35.38742],[-109.01063,35.38883],[-109.00937,35.391],[-109.00768,35.39388],[-109.00669,35.39553],[-109.0059,35.39685],[-109.00524,35.39802],[-109.00321,35.40148],[-109.00226,35.40308],[-109.0021,35.40336],[-109.00122,35.40485],[-108.99975,35.40732],[-108.99863,35.40914],[-108.99753,35.41067],[-108.99703,35.41133],[-108.9965,35.41197],[-108.99586,35.41271],[-108.9951,35.41361],[-108.99444,35.41438],[-108.99422,35.41463],[-108.99351,35.41546],[-108.99301,35.41603],[-108.99135,35.41795],[-108.99,35.41954],[-108.98915,35.42048],[-108.98876,35.42087],[-108.98821,35.42136],[-108.98777,35.42174],[-108.98703,35.42234],[-108.98633,35.42282],[-108.98294,35.42512],[-108.9769,35.42921],[-108.97195,35.43256],[-108.97006,35.43384],[-108.96618,35.43644],[-108.96438,35.43769],[-108.96347,35.43829],[-108.96271,35.43881],[-108.96215,35.43919],[-108.96156,35.4396],[-108.96083,35.44016],[-108.96014,35.44074],[-108.95953,35.44131],[-108.95879,35.4421],[-108.95835,35.44262],[-108.95742,35.44384],[-108.95625,35.44531],[-108.9558,35.4459],[-108.95539,35.44649],[-108.95499,35.44695],[-108.95397,35.44826],[-108.95233,35.45038],[-108.95184,35.45102],[-108.95122,35.45183],[-108.95043,35.45283],[-108.94926,35.45431],[-108.94871,35.45497],[-108.948,35.45577],[-108.94746,35.45633],[-108.94577,35.45802],[-108.94462,35.45913],[-108.94287,35.46079],[-108.94206,35.46156],[-108.93963,35.46391],[-108.93863,35.46483],[-108.93759,35.46574],[-108.93663,35.46652],[-108.93569,35.46723],[-108.93461,35.468],[-108.93295,35.46905],[-108.93166,35.46979],[-108.93019,35.47063],[-108.92883,35.4714],[-108.9278,35.472],[-108.92599,35.47302],[-108.9257,35.47319],[-108.92182,35.47541],[-108.91936,35.47681],[-108.91293,35.48048],[-108.91241,35.48077],[-108.91128,35.48142],[-108.91028,35.48197],[-108.90963,35.48232],[-108.90806,35.48326],[-108.9065,35.48407],[-108.90504,35.4848],[-108.90381,35.48535],[-108.90289,35.48572],[-108.9015,35.48625],[-108.90021,35.48668],[-108.89887,35.4871],[-108.89733,35.48754],[-108.89518,35.48807],[-108.894,35.48837],[-108.89263,35.48871],[-108.89218,35.48883],[-108.89115,35.48909],[-108.88733,35.49005],[-108.88317,35.49108],[-108.88166,35.49146],[-108.8774,35.49252],[-108.87219,35.49383],[-108.86687,35.49515],[-108.86579,35.49542],[-108.86472,35.4957],[-108.86333,35.49604],[-108.86275,35.49618],[-108.86209,35.49633],[-108.86087,35.49657],[-108.85957,35.49676],[-108.85888,35.49684],[-108.85833,35.4969],[-108.85681,35.49701],[-108.85518,35.49711],[-108.85392,35.49719],[-108.85268,35.49729],[-108.85169,35.4974],[-108.85072,35.49752],[-108.84952,35.49771],[-108.84781,35.49801],[-108.84735,35.4981],[-108.84626,35.49829],[-108.84412,35.49867],[-108.84219,35.49901],[-108.84055,35.49928],[-108.83928,35.49952],[-108.8385,35.49969],[-108.83773,35.49991],[-108.83689,35.50021],[-108.8363,35.50048],[-108.83556,35.5009],[-108.83492,35.50134],[-108.83437,35.50176],[-108.83397,35.50211],[-108.83328,35.5028],[-108.83271,35.50341],[-108.83205,35.50412],[-108.83139,35.5048],[-108.83122,35.50497],[-108.83073,35.50549],[-108.83037,35.50588],[-108.82774,35.50868],[-108.82732,35.50913],[-108.82696,35.50953],[-108.82673,35.50977],[-108.82654,35.50996],[-108.82639,35.51011],[-108.82623,35.51026],[-108.82599,35.51046],[-108.82577,35.51063],[-108.82553,35.51079],[-108.82522,35.51098],[-108.82488,35.51118],[-108.82461,35.51133],[-108.82423,35.51152],[-108.8239,35.51167],[-108.82348,35.51185],[-108.82308,35.51199],[-108.82257,35.51215],[-108.82211,35.51227],[-108.82167,35.51237],[-108.82128,35.51243],[-108.82105,35.51247],[-108.82085,35.51249],[-108.8205,35.51253],[-108.82008,35.51255],[-108.81947,35.51258],[-108.81742,35.51266],[-108.8136,35.51282],[-108.81314,35.51283],[-108.80993,35.51297],[-108.80924,35.51303],[-108.80854,35.51311],[-108.80801,35.51319],[-108.80737,35.5133],[-108.80673,35.51342],[-108.80626,35.51352],[-108.8054,35.51373],[-108.80468,35.51394],[-108.80408,35.51414],[-108.8035,35.51434],[-108.80292,35.51455],[-108.80232,35.51481],[-108.80173,35.51506],[-108.80071,35.51558],[-108.79945,35.51619],[-108.79834,35.51672],[-108.79786,35.51698],[-108.79747,35.51718],[-108.79706,35.51739],[-108.79669,35.51755],[-108.79618,35.51774],[-108.79526,35.51803],[-108.79326,35.51863],[-108.78744,35.52035],[-108.78302,35.52166],[-108.77961,35.52266],[-108.77918,35.52278],[-108.77241,35.52481],[-108.76816,35.52607],[-108.76614,35.52665],[-108.76468,35.52706],[-108.76305,35.52757],[-108.76202,35.52784],[-108.76074,35.5281],[-108.76034,35.52818],[-108.7595,35.52829],[-108.75832,35.52842],[-108.75773,35.52845],[-108.75706,35.52848],[-108.75588,35.52848],[-108.7543,35.52849],[-108.7535,35.52849],[-108.75312,35.52848],[-108.75237,35.52849],[-108.75182,35.52849],[-108.75138,35.52852],[-108.75097,35.52856],[-108.75052,35.52862],[-108.75003,35.52871],[-108.74952,35.52882],[-108.74909,35.52894],[-108.74854,35.5291],[-108.74709,35.52956],[-108.7457,35.53],[-108.74535,35.53011],[-108.74414,35.53046],[-108.7438,35.53055],[-108.74327,35.53067],[-108.74265,35.53078],[-108.74189,35.53087],[-108.74074,35.53096],[-108.74037,35.531],[-108.73995,35.53106],[-108.73954,35.53113],[-108.7391,35.53122],[-108.73865,35.53133],[-108.73822,35.53146],[-108.7351,35.53247],[-108.73478,35.53256],[-108.73428,35.5327],[-108.73371,35.53284],[-108.73324,35.53292],[-108.73273,35.533],[-108.73216,35.53307],[-108.73176,35.53311],[-108.73072,35.53316],[-108.72425,35.53316],[-108.72174,35.53316],[-108.72093,35.53316],[-108.72033,35.53315],[-108.71965,35.53312],[-108.71907,35.53308],[-108.7183,35.53301],[-108.71783,35.53294],[-108.71687,35.5328],[-108.71578,35.53264],[-108.7139,35.53236],[-108.71295,35.53224],[-108.71232,35.53218],[-108.71152,35.53213],[-108.71081,35.5321],[-108.71027,35.53211],[-108.70948,35.53213],[-108.70884,35.53216],[-108.7066,35.53235],[-108.69918,35.53292],[-108.6906,35.53363],[-108.68244,35.53432],[-108.68182,35.53436],[-108.68138,35.53439],[-108.68083,35.5344],[-108.68019,35.53437],[-108.67955,35.53431],[-108.67889,35.53421],[-108.67834,35.53409],[-108.67781,35.53396],[-108.67736,35.53382],[-108.67686,35.53364],[-108.67636,35.53343],[-108.67594,35.53323],[-108.6755,35.53299],[-108.67496,35.53268],[-108.67398,35.53203],[-108.67179,35.53068],[-108.67155,35.53053],[-108.67051,35.52988],[-108.67013,35.52966],[-108.66977,35.52947],[-108.66942,35.52932],[-108.66905,35.52918],[-108.66861,35.52906],[-108.66811,35.52892],[-108.6676,35.52884],[-108.66717,35.52879],[-108.66713,35.52878],[-108.66655,35.52876],[-108.66607,35.52877],[-108.66561,35.52882],[-108.66512,35.52888],[-108.66469,35.52898],[-108.66412,35.52912],[-108.6629,35.52946],[-108.65955,35.53043],[-108.65516,35.53162],[-108.65468,35.53173],[-108.65405,35.53186],[-108.65345,35.53196],[-108.65277,35.53207],[-108.6519,35.53216],[-108.65087,35.53225],[-108.64994,35.53228],[-108.64906,35.53227],[-108.64834,35.53225],[-108.64533,35.53209],[-108.63577,35.53148],[-108.62594,35.5309],[-108.61547,35.53025],[-108.60494,35.52963],[-108.60438,35.5296],[-108.60262,35.52949],[-108.60191,35.52943],[-108.60133,35.52937],[-108.60067,35.52927],[-108.59997,35.52916],[-108.59938,35.52904],[-108.59878,35.52891],[-108.59817,35.52876],[-108.5974,35.52852],[-108.59635,35.52822],[-108.59442,35.52763],[-108.5938,35.52744],[-108.59351,35.52736],[-108.59304,35.52721],[-108.59165,35.5268],[-108.58407,35.5245],[-108.5837,35.52438],[-108.58208,35.52389],[-108.57285,35.52111],[-108.57263,35.52105],[-108.56217,35.51787],[-108.55258,35.51496],[-108.54779,35.51352],[-108.54645,35.5131],[-108.54532,35.51273],[-108.54427,35.51236],[-108.54108,35.51114],[-108.53605,35.50923],[-108.5343,35.50857],[-108.52463,35.50488],[-108.51758,35.5022],[-108.5168,35.50192],[-108.51416,35.50091],[-108.50381,35.49701],[-108.49674,35.49432],[-108.49562,35.49392],[-108.49472,35.49358],[-108.49395,35.49333],[-108.49287,35.493],[-108.49173,35.49268],[-108.4909,35.49246],[-108.49024,35.49232],[-108.48823,35.49186],[-108.48609,35.4914],[-108.48437,35.49098],[-108.48126,35.49028],[-108.47259,35.4883],[-108.462,35.48593],[-108.45087,35.4834],[-108.44108,35.48119],[-108.43656,35.48017],[-108.43373,35.47953],[-108.42935,35.47855],[-108.42869,35.47839],[-108.42778,35.47815],[-108.42707,35.47795],[-108.42634,35.4777],[-108.42572,35.47748],[-108.42506,35.4772],[-108.42455,35.47696],[-108.4241,35.47675],[-108.42348,35.4764],[-108.42288,35.47608],[-108.42233,35.47576],[-108.42176,35.47537],[-108.42124,35.47499],[-108.42075,35.47464],[-108.41507,35.4703],[-108.41065,35.46693],[-108.41,35.46647],[-108.40911,35.4659],[-108.40855,35.46558],[-108.40798,35.46528],[-108.40731,35.46494],[-108.40653,35.46457],[-108.40557,35.46413],[-108.39959,35.46135],[-108.38999,35.45688],[-108.38854,35.45625],[-108.38753,35.45582],[-108.3836,35.45423],[-108.37978,35.4527],[-108.36942,35.44854],[-108.3653,35.44691],[-108.36273,35.44586],[-108.36018,35.44475],[-108.35921,35.44431],[-108.35096,35.44072],[-108.34095,35.43634],[-108.33119,35.43208],[-108.32554,35.42961],[-108.32411,35.42887],[-108.32304,35.4283],[-108.32229,35.42795],[-108.32105,35.42739],[-108.31565,35.42502],[-108.31261,35.42368],[-108.30943,35.4223],[-108.30758,35.42149],[-108.29764,35.41716],[-108.28747,35.41271],[-108.27705,35.40815],[-108.27568,35.40757],[-108.27405,35.40695],[-108.27246,35.40641],[-108.27082,35.40593],[-108.26955,35.4056],[-108.26835,35.40532],[-108.26716,35.40509],[-108.26566,35.40477],[-108.25628,35.40287],[-108.24534,35.40061],[-108.23439,35.39836],[-108.23015,35.39749],[-108.22458,35.39634],[-108.22418,35.39626],[-108.22013,35.39543],[-108.2138,35.39414],[-108.20829,35.39302],[-108.20787,35.39292],[-108.19806,35.39089],[-108.19387,35.39002],[-108.19272,35.38978],[-108.19175,35.38959],[-108.19093,35.38943],[-108.19031,35.38934],[-108.18947,35.38922],[-108.18879,35.38916],[-108.18813,35.38912],[-108.18723,35.38908],[-108.17654,35.38867],[-108.16599,35.38824],[-108.16525,35.38821],[-108.16457,35.38816],[-108.16358,35.38808],[-108.16263,35.38798],[-108.16146,35.38782],[-108.15981,35.38762],[-108.15939,35.38757],[-108.15616,35.3871],[-108.14601,35.38561],[-108.1458,35.38558],[-108.13101,35.38347],[-108.13021,35.38334],[-108.12958,35.38322],[-108.12902,35.38309],[-108.12827,35.38291],[-108.12747,35.38268],[-108.12675,35.38243],[-108.1196,35.37999],[-108.1195,35.37995],[-108.11677,35.379],[-108.11511,35.37844],[-108.11403,35.3781],[-108.11313,35.37783],[-108.11216,35.37756],[-108.11143,35.3774],[-108.1099,35.37706],[-108.10938,35.37698],[-108.10744,35.37658],[-108.10084,35.37534],[-108.08041,35.37153],[-108.08002,35.37144],[-108.0712,35.36976],[-108.07006,35.36957],[-108.06891,35.36934],[-108.06818,35.36919],[-108.06758,35.36906],[-108.06689,35.36888],[-108.06619,35.36866],[-108.06537,35.36838],[-108.06442,35.36802],[-108.06349,35.36765],[-108.06024,35.36633],[-108.0559,35.36458],[-108.05252,35.36322],[-108.04839,35.36155],[-108.04531,35.36031],[-108.03468,35.35601],[-108.01568,35.34831],[-108.01497,35.34799],[-108.0145,35.34778],[-108.01383,35.34743],[-108.01317,35.34705],[-108.01261,35.34672],[-108.01205,35.34636],[-108.01147,35.34594],[-108.01091,35.34551],[-108.01018,35.34488],[-108.00954,35.34429],[-108.00908,35.34381],[-108.00842,35.34303],[-108.00775,35.34216],[-108.00719,35.34128],[-108.00674,35.34048],[-108.00173,35.33158],[-107.99913,35.32701],[-107.99669,35.32264],[-107.99402,35.31791],[-107.99295,35.31603],[-107.99278,35.31568],[-107.99262,35.31533],[-107.99246,35.31497],[-107.99229,35.31452],[-107.99217,35.31414],[-107.99206,35.31374],[-107.99192,35.31321],[-107.99179,35.31253],[-107.99001,35.30162],[-107.98982,35.30048],[-107.98872,35.29531],[-107.9877,35.29068],[-107.98666,35.28598],[-107.98572,35.2816],[-107.9849,35.27779],[-107.98478,35.27738],[-107.98466,35.27701],[-107.98453,35.27659],[-107.98439,35.27617],[-107.98424,35.27581],[-107.98403,35.27533],[-107.98379,35.27481],[-107.98351,35.27425],[-107.9831,35.27351],[-107.98069,35.26901],[-107.97859,35.26504],[-107.97822,35.26441],[-107.97803,35.26416],[-107.97728,35.26301],[-107.97682,35.2624],[-107.97602,35.26136],[-107.97565,35.26092],[-107.97522,35.26041],[-107.97462,35.25973],[-107.97408,35.25918],[-107.97324,35.25834],[-107.97166,35.25684],[-107.96669,35.25228],[-107.96169,35.24764],[-107.95812,35.24376],[-107.95766,35.24328],[-107.91245,35.1957],[-107.90801,35.19102],[-107.90352,35.18633],[-107.90336,35.18616],[-107.90299,35.18573],[-107.90264,35.18523],[-107.90237,35.18482],[-107.90217,35.18448],[-107.90197,35.18409],[-107.9018,35.18371],[-107.90162,35.18326],[-107.90146,35.1826],[-107.90135,35.18206],[-107.90111,35.18021],[-107.90093,35.17855],[-107.90027,35.17259],[-107.90018,35.17211],[-107.90012,35.17167],[-107.90001,35.17118],[-107.89988,35.17077],[-107.89973,35.17031],[-107.8995,35.16966],[-107.89926,35.16911],[-107.89888,35.16842],[-107.89858,35.16796],[-107.89826,35.16751],[-107.898,35.16717],[-107.89768,35.16676],[-107.89731,35.16633],[-107.89682,35.16585],[-107.8963,35.16537],[-107.8959,35.16501],[-107.89549,35.16469],[-107.89494,35.16433],[-107.89443,35.16398],[-107.89371,35.16355],[-107.89308,35.16322],[-107.89234,35.16286],[-107.88612,35.15974],[-107.87945,35.15639],[-107.87827,35.1558],[-107.8762,35.15478],[-107.87555,35.15446],[-107.87467,35.15401],[-107.87351,35.15344],[-107.87161,35.15245],[-107.87039,35.15176],[-107.86722,35.1499],[-107.86544,35.14884],[-107.85941,35.14579],[-107.85623,35.14422],[-107.85467,35.14338],[-107.85355,35.14269],[-107.8523,35.14176],[-107.85106,35.14068],[-107.84877,35.1386],[-107.8466,35.13664],[-107.84407,35.13438],[-107.84244,35.13291],[-107.84152,35.13207],[-107.84053,35.1312],[-107.83941,35.13036],[-107.83475,35.12726],[-107.82988,35.12401],[-107.82382,35.12007],[-107.77473,35.08777],[-107.7736,35.08708],[-107.77226,35.08609],[-107.77022,35.08454],[-107.76837,35.08306],[-107.76689,35.08189],[-107.76607,35.08123],[-107.76348,35.07921],[-107.76095,35.0772],[-107.76024,35.07664],[-107.75969,35.07623],[-107.75905,35.07583],[-107.75844,35.07549],[-107.75787,35.07516],[-107.75735,35.07488],[-107.75679,35.07461],[-107.75619,35.07434],[-107.75563,35.07412],[-107.75529,35.07398],[-107.75414,35.0736],[-107.74597,35.07108],[-107.73652,35.06819],[-107.73525,35.0678],[-107.73455,35.06759],[-107.73404,35.06747],[-107.73345,35.06733],[-107.73286,35.06721],[-107.73224,35.06709],[-107.73155,35.06699],[-107.73088,35.06692],[-107.7299,35.06683],[-107.72876,35.06676],[-107.72154,35.06618],[-107.72066,35.0661],[-107.71995,35.06601],[-107.71925,35.06589],[-107.71857,35.06575],[-107.70834,35.06348],[-107.70481,35.06265],[-107.70343,35.06236],[-107.70266,35.06218],[-107.70194,35.06204],[-107.7014,35.06195],[-107.7007,35.06184],[-107.69997,35.06179],[-107.69922,35.06176],[-107.69853,35.06176],[-107.69777,35.06179],[-107.69696,35.06185],[-107.69631,35.06192],[-107.69542,35.06204],[-107.6946,35.0622],[-107.69385,35.06238],[-107.69311,35.06261],[-107.6925,35.06283],[-107.6919,35.06307],[-107.69134,35.0633],[-107.69069,35.06361],[-107.68988,35.06403],[-107.68405,35.06738],[-107.68285,35.06805],[-107.68221,35.06838],[-107.68145,35.06875],[-107.68072,35.06909],[-107.67988,35.06941],[-107.67915,35.06966],[-107.67847,35.06987],[-107.67775,35.07006],[-107.67694,35.07026],[-107.67562,35.07053],[-107.67423,35.07081],[-107.66879,35.07187],[-107.6631,35.073],[-107.66175,35.07328],[-107.65596,35.07443],[-107.65303,35.07498],[-107.65179,35.07521],[-107.65085,35.0754],[-107.64966,35.07561],[-107.64825,35.07582],[-107.64709,35.07595],[-107.64608,35.07605],[-107.64478,35.07615],[-107.64219,35.07618],[-107.64001,35.07613],[-107.63449,35.07603],[-107.62458,35.07574],[-107.61457,35.07549],[-107.6045,35.07522],[-107.59819,35.07506],[-107.59763,35.07504],[-107.59718,35.07502],[-107.59367,35.07496],[-107.58878,35.07483],[-107.58485,35.07472],[-107.57509,35.07447],[-107.56776,35.0743],[-107.56632,35.07426],[-107.56475,35.07422],[-107.56233,35.07415],[-107.5603,35.07411],[-107.55861,35.07406],[-107.55638,35.07401],[-107.55586,35.074],[-107.55318,35.07393],[-107.55159,35.07388],[-107.5489,35.07381],[-107.54132,35.07361],[-107.54042,35.0736],[-107.53968,35.07356],[-107.53895,35.07349],[-107.53802,35.07337],[-107.53706,35.07318],[-107.53628,35.07298],[-107.53557,35.07276],[-107.53496,35.07255],[-107.5343,35.07228],[-107.53386,35.07208],[-107.53313,35.07172],[-107.53263,35.07146],[-107.53173,35.07089],[-107.53123,35.07055],[-107.53089,35.07028],[-107.53054,35.07],[-107.53003,35.0695],[-107.52963,35.06909],[-107.52912,35.06853],[-107.52882,35.0682],[-107.52856,35.06786],[-107.52826,35.0674],[-107.52798,35.06696],[-107.52774,35.06655],[-107.52751,35.06606],[-107.52722,35.06542],[-107.52702,35.06489],[-107.52648,35.06365],[-107.52585,35.06221],[-107.5253,35.06094],[-107.52498,35.06019],[-107.52474,35.05968],[-107.52443,35.05911],[-107.52396,35.05842],[-107.52342,35.05768],[-107.52272,35.05681],[-107.5218,35.05584],[-107.52094,35.05505],[-107.52005,35.05435],[-107.51886,35.05353],[-107.51748,35.05271],[-107.51629,35.05208],[-107.51142,35.0495],[-107.50677,35.04695],[-107.50602,35.04655],[-107.50427,35.04563],[-107.50146,35.04412],[-107.499,35.04278],[-107.49868,35.04262],[-107.49536,35.0408],[-107.49352,35.03993],[-107.49217,35.03931],[-107.4911,35.03887],[-107.49006,35.03845],[-107.48892,35.03805],[-107.48759,35.03765],[-107.48616,35.03724],[-107.48101,35.0358],[-107.47734,35.03475],[-107.4734,35.03363],[-107.47034,35.03278],[-107.46338,35.03083],[-107.45728,35.02911],[-107.45555,35.02863],[-107.45424,35.0283],[-107.45316,35.02807],[-107.45233,35.0279],[-107.45138,35.02772],[-107.45032,35.02755],[-107.44921,35.02741],[-107.44818,35.02731],[-107.4468,35.02718],[-107.44528,35.02711],[-107.44404,35.02706],[-107.436,35.0269],[-107.42662,35.02669],[-107.41662,35.02649],[-107.40586,35.02627],[-107.40225,35.02617],[-107.40191,35.02616],[-107.39906,35.02611],[-107.39766,35.02609],[-107.39695,35.02608],[-107.39622,35.02612],[-107.39542,35.02619],[-107.39473,35.02626],[-107.39404,35.02636],[-107.39325,35.02649],[-107.39254,35.02664],[-107.39188,35.0268],[-107.3911,35.02703],[-107.39037,35.02724],[-107.38977,35.02745],[-107.38916,35.02767],[-107.38838,35.02799],[-107.38768,35.02833],[-107.38477,35.02976],[-107.37942,35.03233],[-107.37379,35.03514],[-107.37058,35.0367],[-107.36897,35.0375],[-107.36807,35.03794],[-107.36747,35.03818],[-107.36695,35.03839],[-107.36634,35.03857],[-107.36558,35.03873],[-107.36485,35.03882],[-107.36414,35.03891],[-107.36351,35.03892],[-107.36277,35.0389],[-107.36215,35.03886],[-107.36131,35.03873],[-107.3595,35.03835],[-107.35775,35.03799],[-107.35263,35.03695],[-107.34603,35.0356],[-107.34401,35.03518],[-107.34312,35.03495],[-107.34229,35.03467],[-107.34145,35.03425],[-107.34082,35.03389],[-107.34024,35.03345],[-107.33969,35.03293],[-107.33923,35.0324],[-107.33827,35.03107],[-107.33785,35.03048],[-107.33641,35.02839],[-107.3347,35.02595],[-107.3332,35.02383],[-107.3315,35.02143],[-107.33046,35.01993],[-107.32984,35.01904],[-107.32921,35.01819],[-107.32878,35.01765],[-107.32825,35.01704],[-107.32771,35.0165],[-107.32712,35.01596],[-107.32617,35.01519],[-107.32445,35.01377],[-107.32285,35.01246],[-107.32158,35.01141],[-107.31952,35.00973],[-107.31623,35.007],[-107.31079,35.00252],[-107.30699,34.99932],[-107.30562,34.99821],[-107.30481,34.99759],[-107.3042,34.99716],[-107.30362,34.99677],[-107.30293,34.99637],[-107.30212,34.99598],[-107.30123,34.99554],[-107.30048,34.99521],[-107.29966,34.99491],[-107.29895,34.99467],[-107.29821,34.99444],[-107.29752,34.99426],[-107.29682,34.9941],[-107.29617,34.99396],[-107.29552,34.99386],[-107.29477,34.99375],[-107.29392,34.99367],[-107.29318,34.99361],[-107.29259,34.99359],[-107.29182,34.99358],[-107.29072,34.99357],[-107.286,34.99352],[-107.2853,34.99351],[-107.27414,34.99337],[-107.26348,34.99323],[-107.25776,34.99316],[-107.25689,34.99314],[-107.25254,34.99307],[-107.24355,34.99295],[-107.23709,34.99287],[-107.23589,34.99284],[-107.23493,34.9928],[-107.23405,34.99272],[-107.2332,34.99263],[-107.23223,34.99253],[-107.23104,34.99237],[-107.22995,34.99221],[-107.22307,34.99114],[-107.21259,34.98951],[-107.20252,34.98798],[-107.19265,34.98647],[-107.18241,34.98489],[-107.17603,34.9839],[-107.17419,34.98363],[-107.17109,34.98311],[-107.16591,34.98234],[-107.15863,34.98122],[-107.14819,34.9796],[-107.14021,34.97835],[-107.13863,34.97812],[-107.13763,34.97795],[-107.13686,34.97788],[-107.13615,34.97779],[-107.1353,34.97774],[-107.13409,34.97773],[-107.13192,34.97789],[-107.12982,34.97821],[-107.12787,34.9787],[-107.11495,34.98283],[-107.10007,34.9876],[-107.09135,34.99039],[-107.08406,34.99273],[-107.08219,34.99334],[-107.07834,34.99454],[-107.07494,34.99562],[-107.07164,34.99668],[-107.06848,34.99768],[-107.06523,34.99872],[-107.0619,34.99978],[-107.05875,35.00075],[-107.0556,35.00177],[-107.05328,35.00256],[-107.0509,35.00327],[-107.04942,35.00372],[-107.04696,35.00453],[-107.04497,35.00518],[-107.04099,35.00643],[-107.03893,35.0071],[-107.03685,35.00775],[-107.03538,35.00824],[-107.03208,35.00928],[-107.02438,35.01174],[-107.02205,35.01247],[-107.02036,35.01301],[-107.01551,35.01454],[-107.01414,35.015],[-107.01207,35.01567],[-107.01015,35.01627],[-107.00491,35.01792],[-107.00369,35.01832],[-107.00311,35.0185],[-107.00192,35.01888],[-106.99901,35.01979],[-106.99748,35.02023],[-106.99646,35.02046],[-106.98877,35.02221],[-106.98621,35.02278],[-106.98345,35.02342],[-106.98057,35.02408],[-106.97733,35.02482],[-106.97414,35.02551],[-106.97044,35.02636],[-106.96712,35.02711],[-106.96409,35.0278],[-106.96191,35.02831],[-106.9581,35.02916],[-106.95758,35.0293],[-106.95508,35.02987],[-106.94948,35.03114],[-106.94631,35.03186],[-106.94239,35.03274],[-106.9414,35.03297],[-106.93756,35.03387],[-106.92119,35.03761],[-106.87629,35.04773],[-106.86678,35.04983],[-106.86202,35.05088],[-106.86196,35.05089],[-106.8061,35.05951],[-106.80235,35.06007],[-106.80022,35.06038],[-106.79825,35.0607],[-106.79763,35.06081],[-106.79701,35.06094],[-106.79634,35.0611],[-106.79564,35.06128],[-106.79496,35.06149],[-106.79462,35.0616],[-106.79377,35.06192],[-106.79361,35.06199],[-106.79252,35.06244],[-106.79137,35.06299],[-106.79112,35.06311],[-106.7873,35.06505],[-106.78411,35.06665],[-106.78146,35.06798],[-106.78056,35.06844],[-106.77069,35.07341],[-106.76977,35.07387],[-106.76656,35.07549],[-106.76349,35.07704],[-106.76324,35.07717],[-106.75998,35.07881],[-106.75665,35.08049],[-106.75332,35.08214],[-106.74744,35.08512],[-106.7468,35.08542],[-106.74439,35.08663],[-106.74225,35.08773],[-106.74148,35.08809],[-106.74079,35.08844],[-106.73795,35.08988],[-106.73738,35.09017],[-106.73723,35.09025],[-106.73538,35.09117],[-106.73072,35.0935],[-106.72992,35.09391],[-106.72803,35.09488],[-106.72621,35.09577],[-106.72262,35.09759],[-106.71843,35.09969],[-106.71653,35.10065],[-106.71496,35.10144],[-106.71127,35.10329],[-106.71068,35.10359],[-106.70984,35.104],[-106.70736,35.10525],[-106.70643,35.10572],[-106.70602,35.10591],[-106.7055,35.10613],[-106.70479,35.10637],[-106.70417,35.10654],[-106.7036,35.10666],[-106.70294,35.10678],[-106.70233,35.10685],[-106.70156,35.1069],[-106.70091,35.10692],[-106.7005,35.10693],[-106.7,35.10691],[-106.6975,35.10671],[-106.69637,35.10662],[-106.69437,35.10643],[-106.69013,35.10608],[-106.68454,35.10565],[-106.68408,35.10562],[-106.68156,35.10542],[-106.67826,35.10514],[-106.6775,35.10507],[-106.67732,35.10505],[-106.67574,35.10489],[-106.67407,35.10483],[-106.67338,35.10481],[-106.67304,35.10482],[-106.67283,35.10482],[-106.67175,35.10491],[-106.67106,35.10498],[-106.67038,35.1051],[-106.6669,35.10577],[-106.66658,35.10583],[-106.66613,35.10592],[-106.66548,35.10605],[-106.66522,35.10609],[-106.66476,35.10615],[-106.6645,35.10618],[-106.66402,35.10624],[-106.6633,35.10627],[-106.66269,35.10624],[-106.66057,35.10617],[-106.65988,35.10615],[-106.6593,35.10614],[-106.65877,35.10615],[-106.6585,35.10617],[-106.65819,35.10618],[-106.65789,35.10621],[-106.65767,35.10623],[-106.65681,35.10635],[-106.65668,35.10637],[-106.65613,35.10647],[-106.65524,35.10663],[-106.65345,35.10691],[-106.6533,35.10692],[-106.65278,35.10697],[-106.65245,35.10698],[-106.65181,35.10692],[-106.65054,35.10671],[-106.6499,35.10657],[-106.64948,35.10647],[-106.64927,35.10642],[-106.64858,35.10628],[-106.6478,35.10611],[-106.64708,35.10595],[-106.64692,35.10592],[-106.64617,35.10581],[-106.6456,35.10572],[-106.64194,35.10528],[-106.64089,35.10519],[-106.64042,35.10516],[-106.63734,35.10503],[-106.63689,35.10501],[-106.63464,35.10496],[-106.63325,35.10496],[-106.63197,35.105],[-106.63145,35.10502],[-106.62915,35.10519],[-106.62795,35.10533],[-106.62739,35.10541],[-106.62485,35.10581],[-106.62418,35.10595],[-106.62353,35.10609],[-106.62106,35.1067],[-106.61981,35.10702],[-106.61873,35.10723],[-106.61786,35.10736],[-106.61665,35.10741],[-106.61536,35.1074],[-106.61429,35.10725],[-106.61328,35.10702],[-106.61309,35.10699],[-106.61231,35.10681],[-106.61118,35.10656],[-106.60957,35.10618],[-106.6084,35.1059],[-106.60811,35.10583],[-106.6042,35.10496],[-106.60275,35.10463],[-106.60199,35.10446],[-106.60129,35.10433],[-106.60072,35.10422],[-106.59929,35.10403],[-106.5988,35.10399],[-106.59823,35.10396],[-106.59547,35.10389],[-106.59336,35.10377],[-106.5916,35.1037],[-106.58718,35.10362],[-106.58652,35.10361],[-106.58596,35.10358],[-106.58549,35.10355],[-106.58505,35.1035],[-106.5847,35.10345],[-106.58425,35.10336],[-106.58395,35.10329],[-106.58354,35.10318],[-106.58304,35.10302],[-106.58243,35.1028],[-106.5813,35.10233],[-106.57975,35.10171],[-106.57342,35.09914],[-106.573,35.09896],[-106.57052,35.09802],[-106.56884,35.09735],[-106.56868,35.09728],[-106.56854,35.09723],[-106.56413,35.09539],[-106.56361,35.09518],[-106.56226,35.09463],[-106.56069,35.09402],[-106.55653,35.09229],[-106.55405,35.09134],[-106.55063,35.08993],[-106.5466,35.08841],[-106.54599,35.08818],[-106.54363,35.08724],[-106.54019,35.0859],[-106.53738,35.08481],[-106.53519,35.08401],[-106.53263,35.08303],[-106.52858,35.08146],[-106.52721,35.08093],[-106.52457,35.07994],[-106.52379,35.07965],[-106.52267,35.07921],[-106.5205,35.0784],[-106.51096,35.07475],[-106.50438,35.07225],[-106.49954,35.07044],[-106.49731,35.06959],[-106.49652,35.06929],[-106.49429,35.06843],[-106.49348,35.06813],[-106.48718,35.06568],[-106.48671,35.06547],[-106.48597,35.06512],[-106.48515,35.06471],[-106.48484,35.06454],[-106.48424,35.06422],[-106.4837,35.06392],[-106.48313,35.06362],[-106.48259,35.06339],[-106.48219,35.06324],[-106.48179,35.06311],[-106.48122,35.06295],[-106.48067,35.06282],[-106.48015,35.06274],[-106.47943,35.06265],[-106.47875,35.06261],[-106.47803,35.06262],[-106.47739,35.06265],[-106.47616,35.06275],[-106.47539,35.06281],[-106.47529,35.06281],[-106.47368,35.06296],[-106.47201,35.06306],[-106.47154,35.06308],[-106.47111,35.06308],[-106.47063,35.06307],[-106.47025,35.06305],[-106.46991,35.06304],[-106.46957,35.063],[-106.46935,35.06298],[-106.46913,35.06296],[-106.46894,35.06294],[-106.46881,35.06293],[-106.46879,35.06293],[-106.4684,35.06287],[-106.46829,35.06285],[-106.46799,35.0628],[-106.46728,35.06266],[-106.46686,35.06256],[-106.46611,35.06237],[-106.46586,35.06228],[-106.46503,35.06199],[-106.46428,35.06173],[-106.46391,35.06159],[-106.46343,35.06142],[-106.46295,35.06128],[-106.46235,35.06112],[-106.46206,35.06106],[-106.46179,35.061],[-106.46128,35.06091],[-106.46097,35.06089],[-106.46068,35.06086],[-106.4604,35.06083],[-106.46015,35.06083],[-106.45992,35.06082],[-106.45908,35.06084],[-106.45883,35.06085],[-106.45813,35.06088],[-106.45663,35.06097],[-106.45608,35.06099],[-106.45508,35.06106],[-106.45452,35.06111],[-106.45449,35.06111],[-106.454,35.06114],[-106.45375,35.06115],[-106.45298,35.06119],[-106.45187,35.06123],[-106.45036,35.06132],[-106.45025,35.06132],[-106.4488,35.06141],[-106.44778,35.06145],[-106.44694,35.06149],[-106.44637,35.06153],[-106.44612,35.06155],[-106.44574,35.06159],[-106.44529,35.06166],[-106.44487,35.06174],[-106.44472,35.06178],[-106.44439,35.06187],[-106.44382,35.062],[-106.44354,35.06208],[-106.44346,35.06211],[-106.44221,35.06251],[-106.4415,35.06274],[-106.44097,35.06292],[-106.44035,35.06309],[-106.43976,35.06325],[-106.43906,35.06343],[-106.43828,35.06362],[-106.43808,35.06367],[-106.43776,35.06375],[-106.43751,35.0638],[-106.43708,35.06389],[-106.43691,35.06393],[-106.43678,35.06396],[-106.43647,35.06402],[-106.43537,35.06421],[-106.43431,35.06437],[-106.43336,35.06448],[-106.43242,35.06459],[-106.43046,35.06476],[-106.42989,35.0648],[-106.42888,35.06487],[-106.42786,35.06495],[-106.42755,35.06499],[-106.42715,35.06505],[-106.42696,35.06508],[-106.42679,35.06511],[-106.42668,35.06513],[-106.42642,35.06519],[-106.42625,35.06523],[-106.42609,35.06527],[-106.42572,35.06536],[-106.4254,35.06545],[-106.42507,35.06556],[-106.42498,35.0656],[-106.42479,35.06568],[-106.42444,35.06582],[-106.42413,35.06597],[-106.42375,35.06616],[-106.42342,35.06635],[-106.42303,35.0666],[-106.42269,35.06686],[-106.42242,35.06709],[-106.42211,35.06738],[-106.42185,35.06761],[-106.42165,35.06777],[-106.4214,35.06797],[-106.42103,35.06831],[-106.41823,35.0707],[-106.41747,35.07135],[-106.41698,35.0718],[-106.41563,35.07294],[-106.41493,35.07356],[-106.41346,35.07481],[-106.41242,35.0757],[-106.41135,35.07661],[-106.41012,35.07766],[-106.40954,35.07818],[-106.40919,35.07849],[-106.40877,35.07886],[-106.40843,35.07916],[-106.40816,35.07938],[-106.40782,35.07962],[-106.40746,35.07985],[-106.40717,35.08001],[-106.40688,35.08015],[-106.40659,35.08028],[-106.40633,35.08038],[-106.40603,35.08049],[-106.40574,35.08058],[-106.40534,35.08067],[-106.40488,35.08077],[-106.40439,35.08084],[-106.40395,35.08087],[-106.40366,35.08088],[-106.40331,35.08088],[-106.40309,35.08087],[-106.40284,35.08086],[-106.40235,35.08081],[-106.40182,35.08072],[-106.40113,35.08063],[-106.40054,35.08056],[-106.40009,35.08052],[-106.3996,35.08049],[-106.39914,35.08047],[-106.3983,35.08046],[-106.39682,35.08048],[-106.39625,35.08049],[-106.39613,35.08049],[-106.39349,35.08054],[-106.39207,35.08055],[-106.39115,35.08057],[-106.39055,35.0806],[-106.38991,35.08067],[-106.38929,35.08077],[-106.38858,35.08091],[-106.38808,35.08104],[-106.38789,35.08109],[-106.3872,35.08132],[-106.38683,35.08147],[-106.38627,35.08171],[-106.38597,35.08185],[-106.38561,35.08203],[-106.38522,35.08224],[-106.38501,35.08237],[-106.38464,35.08261],[-106.38419,35.08292],[-106.384,35.08306],[-106.38387,35.08315],[-106.38369,35.08328],[-106.38328,35.08357],[-106.38294,35.08381],[-106.38271,35.08398],[-106.38215,35.08437],[-106.38187,35.08457],[-106.3814,35.08491],[-106.38063,35.08546],[-106.3801,35.08584],[-106.37995,35.08594],[-106.37946,35.08629],[-106.37906,35.08657],[-106.3784,35.08706],[-106.37803,35.08733],[-106.37793,35.08741],[-106.37771,35.08761],[-106.37757,35.08778],[-106.37732,35.08806],[-106.37721,35.08819],[-106.3767,35.08879],[-106.37668,35.08881],[-106.37658,35.08894],[-106.37634,35.08924],[-106.37615,35.08945],[-106.376,35.08964],[-106.37583,35.08981],[-106.37567,35.08997],[-106.37527,35.0903],[-106.37495,35.09052],[-106.3747,35.09068],[-106.37418,35.091],[-106.37394,35.09114],[-106.37362,35.09132],[-106.37331,35.09151],[-106.37303,35.0917],[-106.37269,35.09197],[-106.37252,35.09214],[-106.37233,35.09234],[-106.37214,35.09252],[-106.37194,35.09274],[-106.37172,35.09303],[-106.37153,35.0933],[-106.37136,35.09362],[-106.37121,35.09394],[-106.37103,35.09438],[-106.37086,35.09479],[-106.37057,35.09549],[-106.37032,35.09605],[-106.37018,35.09634],[-106.37003,35.09657],[-106.36988,35.0968],[-106.36977,35.09694],[-106.36949,35.09727],[-106.36932,35.09746],[-106.36915,35.09763],[-106.36888,35.09788],[-106.36849,35.09819],[-106.36803,35.09847],[-106.36783,35.09858],[-106.36733,35.09882],[-106.36711,35.09891],[-106.36691,35.09899],[-106.36642,35.09914],[-106.36607,35.09922],[-106.36599,35.09923],[-106.36549,35.09933],[-106.36522,35.09938],[-106.36434,35.09952],[-106.36401,35.09957],[-106.36394,35.09958],[-106.36327,35.09968],[-106.36316,35.0997],[-106.35999,35.10022],[-106.3594,35.10032],[-106.35859,35.10044],[-106.35705,35.10068],[-106.3559,35.10087],[-106.3555,35.10093],[-106.35456,35.1011],[-106.3541,35.10117],[-106.35398,35.10119],[-106.35343,35.10128],[-106.35291,35.10136],[-106.35205,35.10151],[-106.35138,35.10165],[-106.35099,35.10176],[-106.3507,35.10183],[-106.35022,35.10198],[-106.34983,35.1021],[-106.34952,35.10221],[-106.34926,35.10228],[-106.34868,35.10251],[-106.34794,35.10284],[-106.34725,35.10316],[-106.34678,35.1034],[-106.34579,35.10388],[-106.34512,35.10418],[-106.3443,35.10457],[-106.34389,35.10479],[-106.34342,35.10503],[-106.34265,35.10544],[-106.34178,35.10593],[-106.34103,35.10637],[-106.34037,35.1068],[-106.33949,35.10739],[-106.339,35.10773],[-106.33843,35.10813],[-106.33749,35.10886],[-106.33686,35.10935],[-106.33615,35.10994],[-106.33544,35.11048],[-106.33481,35.11095],[-106.33338,35.11196],[-106.33249,35.11253],[-106.33182,35.11299],[-106.33126,35.11337],[-106.33077,35.11369],[-106.33041,35.11393],[-106.33009,35.11412],[-106.32971,35.11435],[-106.32945,35.11448],[-106.32909,35.11465],[-106.32882,35.11477],[-106.32855,35.11486],[-106.32827,35.11495],[-106.32793,35.11505],[-106.32754,35.11513],[-106.32713,35.11521],[-106.32702,35.11522],[-106.32701,35.11522],[-106.32656,35.11525],[-106.32629,35.11526],[-106.32595,35.11526],[-106.32556,35.11525],[-106.32449,35.11516],[-106.32397,35.11513],[-106.32327,35.11507],[-106.32229,35.11499],[-106.32154,35.11493],[-106.32091,35.11487],[-106.32054,35.11482],[-106.32009,35.11476],[-106.31981,35.11469],[-106.31954,35.11462],[-106.31924,35.11452],[-106.31891,35.1144],[-106.3186,35.11427],[-106.31829,35.11412],[-106.318,35.11396],[-106.31771,35.11379],[-106.31724,35.11346],[-106.31676,35.11314],[-106.31649,35.11299],[-106.31603,35.11275],[-106.31578,35.11265],[-106.31539,35.1125],[-106.31491,35.11233],[-106.3126,35.11157],[-106.31157,35.11123],[-106.31141,35.11118],[-106.3112,35.1111],[-106.31099,35.11104],[-106.31076,35.11095],[-106.31042,35.11085],[-106.31004,35.11071],[-106.30929,35.11047],[-106.30908,35.11038],[-106.30896,35.11034],[-106.30853,35.11019],[-106.30829,35.11013],[-106.30787,35.10999],[-106.30759,35.10988],[-106.30705,35.10963],[-106.30662,35.10942],[-106.30639,35.1093],[-106.30584,35.10896],[-106.30558,35.10877],[-106.30529,35.10856],[-106.30497,35.1083],[-106.30468,35.10804],[-106.30423,35.10766],[-106.30401,35.10745],[-106.30365,35.10713],[-106.30335,35.10691],[-106.30312,35.10671],[-106.30265,35.10631],[-106.3025,35.10617],[-106.30197,35.10574],[-106.30158,35.10545],[-106.30105,35.1051],[-106.30028,35.1047],[-106.3001,35.10459],[-106.29986,35.10451],[-106.29946,35.10434],[-106.29925,35.10427],[-106.29898,35.10417],[-106.29856,35.10404],[-106.29818,35.10394],[-106.29781,35.10385],[-106.29741,35.10373],[-106.29717,35.10368],[-106.29558,35.10326],[-106.29463,35.10303],[-106.29437,35.10296],[-106.29352,35.10276],[-106.29294,35.10261],[-106.29238,35.10247],[-106.29184,35.10236],[-106.29154,35.10229],[-106.29099,35.1022],[-106.29069,35.10217],[-106.29029,35.10213],[-106.28998,35.10211],[-106.28972,35.10208],[-106.28887,35.10202],[-106.28839,35.10199],[-106.28793,35.10194],[-106.28762,35.1019],[-106.28733,35.10185],[-106.28695,35.10179],[-106.28645,35.10168],[-106.28594,35.10157],[-106.28503,35.1013],[-106.28467,35.10118],[-106.28392,35.10091],[-106.28377,35.10085],[-106.28337,35.10068],[-106.28231,35.10021],[-106.28071,35.09944],[-106.27971,35.09894],[-106.27891,35.09854],[-106.27882,35.09849],[-106.27784,35.09798],[-106.27738,35.09775],[-106.27704,35.09757],[-106.27663,35.09735],[-106.27601,35.09703],[-106.27565,35.09685],[-106.27464,35.09638],[-106.27384,35.09602],[-106.27177,35.0952],[-106.27114,35.09498],[-106.27023,35.09461],[-106.26891,35.09409],[-106.26764,35.09356],[-106.26614,35.09295],[-106.26398,35.09208],[-106.26232,35.0914],[-106.26018,35.09052],[-106.25929,35.09017],[-106.25829,35.08978],[-106.25776,35.08957],[-106.2572,35.08935],[-106.25644,35.08902],[-106.25327,35.08775],[-106.25284,35.08758],[-106.25223,35.08733],[-106.25154,35.08707],[-106.25082,35.08676],[-106.25002,35.08643],[-106.24795,35.08561],[-106.24642,35.08499],[-106.2455,35.0846],[-106.24428,35.08412],[-106.24129,35.08281],[-106.2324,35.0792],[-106.22868,35.07775],[-106.21598,35.07262],[-106.20519,35.06865],[-106.19631,35.0654],[-106.19176,35.06376],[-106.19111,35.06351],[-106.18928,35.06285],[-106.18921,35.06282],[-106.18791,35.06234],[-106.18595,35.06159],[-106.17657,35.05816],[-106.17241,35.05659],[-106.16811,35.0549],[-106.1614,35.0522],[-106.15403,35.0492],[-106.13948,35.04328],[-106.12785,35.03854],[-106.12245,35.0362],[-106.11204,35.03155],[-106.09786,35.02525],[-106.08916,35.02135],[-106.08602,35.01998],[-106.08404,35.01921],[-106.07423,35.01575],[-106.07078,35.01455],[-106.06874,35.01383],[-106.06477,35.01245],[-106.06095,35.01112],[-106.05885,35.01038],[-106.05702,35.00982],[-106.05505,35.00932],[-106.05296,35.00887],[-106.05067,35.00852],[-106.04905,35.00833],[-106.0482,35.00826],[-106.0396,35.00775],[-106.03719,35.00762],[-106.02747,35.00706],[-106.0257,35.00693],[-106.02348,35.00657],[-106.01614,35.00485],[-106.01474,35.00466],[-106.01228,35.00444],[-106.00401,35.0045],[-106.00283,35.0045],[-105.98791,35.00452],[-105.9794,35.00457],[-105.97329,35.00458],[-105.95886,35.00459],[-105.94461,35.00464],[-105.94044,35.00468],[-105.93825,35.0048],[-105.93569,35.00508],[-105.93359,35.00541],[-105.93118,35.00583],[-105.92901,35.00622],[-105.92748,35.0064],[-105.92511,35.0066],[-105.92329,35.00666],[-105.91757,35.00652],[-105.91112,35.00637],[-105.90965,35.00633],[-105.89977,35.00609],[-105.88633,35.00572],[-105.87278,35.00536],[-105.86495,35.00516],[-105.86155,35.0051],[-105.8588,35.00513],[-105.85549,35.00513],[-105.8472,35.00513],[-105.84469,35.00513],[-105.8313,35.00504],[-105.829,35.00502],[-105.82047,35.00496],[-105.81868,35.00494],[-105.81219,35.00487],[-105.79839,35.00475],[-105.78464,35.00463],[-105.77088,35.00449],[-105.75714,35.00437],[-105.74343,35.00424],[-105.73052,35.00412],[-105.7234,35.00405],[-105.72192,35.0042],[-105.72034,35.00459],[-105.7168,35.00632],[-105.7128,35.00849],[-105.71155,35.00914],[-105.71023,35.00967],[-105.7087,35.01011],[-105.70775,35.01034],[-105.70607,35.01053],[-105.70379,35.0105],[-105.69996,35.01027],[-105.69459,35.00998],[-105.68918,35.00967],[-105.67579,35.00889],[-105.6746,35.00883],[-105.67332,35.00879],[-105.67125,35.00868],[-105.66922,35.00856],[-105.66584,35.00837],[-105.66286,35.00819],[-105.66078,35.00808],[-105.65873,35.00796],[-105.65056,35.00745],[-105.6378,35.0067],[-105.6262,35.00604],[-105.6222,35.0058],[-105.61539,35.00538],[-105.60123,35.00457],[-105.58762,35.00374],[-105.57374,35.00297],[-105.55966,35.00213],[-105.55588,35.00189],[-105.555,35.00183],[-105.55418,35.00181],[-105.55338,35.00185],[-105.55233,35.00194],[-105.5516,35.00201],[-105.55068,35.00218],[-105.54997,35.00234],[-105.54918,35.00256],[-105.54797,35.00296],[-105.54676,35.0035],[-105.54579,35.00402],[-105.54467,35.00457],[-105.54371,35.005],[-105.54264,35.00541],[-105.54173,35.00561],[-105.54009,35.00579],[-105.53307,35.00619],[-105.5318,35.00621],[-105.53024,35.00622],[-105.52844,35.00615],[-105.52462,35.00596],[-105.5162,35.00556],[-105.50235,35.00484],[-105.49607,35.00454],[-105.49422,35.00441],[-105.49248,35.0042],[-105.48959,35.00374],[-105.47564,35.00154],[-105.47149,35.0009],[-105.46413,34.99974],[-105.46237,34.99954],[-105.46189,34.99949],[-105.46136,34.99945],[-105.46036,34.99938],[-105.45861,34.9993],[-105.45681,34.99921],[-105.45238,34.99901],[-105.44797,34.9988],[-105.44414,34.99862],[-105.44277,34.99855],[-105.44163,34.9985],[-105.44045,34.99844],[-105.4384,34.99835],[-105.43639,34.99825],[-105.42989,34.99794],[-105.42664,34.99778],[-105.42343,34.99763],[-105.42036,34.99748],[-105.41724,34.99733],[-105.4111,34.99705],[-105.40936,34.99696],[-105.4024,34.99663],[-105.3955,34.9963],[-105.386,34.99584],[-105.38312,34.9957],[-105.38164,34.99563],[-105.38012,34.99556],[-105.37707,34.9954],[-105.37143,34.99514],[-105.35754,34.99446],[-105.34331,34.99378],[-105.33112,34.9932],[-105.31736,34.99251],[-105.30399,34.99188],[-105.29802,34.99159],[-105.29195,34.99131],[-105.28933,34.99116],[-105.28709,34.99103],[-105.26194,34.98979],[-105.23362,34.98841],[-105.22442,34.988],[-105.21865,34.98772],[-105.21729,34.98763],[-105.20592,34.98709],[-105.1782,34.98568],[-105.16763,34.98522],[-105.15088,34.98439],[-105.12314,34.98299],[-105.09554,34.98158],[-105.09006,34.98136],[-105.0889,34.98132],[-105.08719,34.98123],[-105.07938,34.98083],[-105.07873,34.98079],[-105.06993,34.98033],[-105.06261,34.97998],[-105.05814,34.97968],[-105.03061,34.97826],[-105.00737,34.97714],[-105.00042,34.9768],[-104.99596,34.97657],[-104.99491,34.97652],[-104.98723,34.97613],[-104.98351,34.97593],[-104.97982,34.97574],[-104.95487,34.97442],[-104.92776,34.97302],[-104.89946,34.97155],[-104.87369,34.97023],[-104.87138,34.97017],[-104.86497,34.96984],[-104.85908,34.96946],[-104.8399,34.96925],[-104.81193,34.96898],[-104.79513,34.96882],[-104.78796,34.96875],[-104.7874,34.96871],[-104.78596,34.96856],[-104.78431,34.96827],[-104.77989,34.96723],[-104.7774,34.96676],[-104.77595,34.9666],[-104.76862,34.96652],[-104.76722,34.96645],[-104.75423,34.96524],[-104.74605,34.96437],[-104.74427,34.96412],[-104.74176,34.96358],[-104.73863,34.96268],[-104.73623,34.96179],[-104.72434,34.95514],[-104.71776,34.95129],[-104.71743,34.95109],[-104.71297,34.94849],[-104.71155,34.94769],[-104.71031,34.9471],[-104.70995,34.94695],[-104.70892,34.94655],[-104.70787,34.9462],[-104.70665,34.94588],[-104.70616,34.94577],[-104.70562,34.94566],[-104.705,34.94556],[-104.70443,34.94547],[-104.70365,34.94537],[-104.70179,34.94522],[-104.69921,34.94531],[-104.69525,34.94599],[-104.6871,34.9477],[-104.68667,34.94778],[-104.68414,34.94836],[-104.68355,34.94847],[-104.68314,34.9485],[-104.68252,34.94849],[-104.68181,34.94842],[-104.68113,34.9483],[-104.68032,34.94809],[-104.67967,34.94783],[-104.6789,34.94745],[-104.67828,34.94713],[-104.67344,34.94482],[-104.67262,34.94445],[-104.67135,34.94389],[-104.67072,34.94368],[-104.67002,34.94351],[-104.6694,34.94339],[-104.66892,34.94333],[-104.66863,34.94329],[-104.668,34.94324],[-104.66739,34.9432],[-104.66679,34.94323],[-104.66624,34.94326],[-104.66574,34.94332],[-104.66464,34.94351],[-104.64851,34.94628],[-104.64478,34.94689],[-104.64194,34.94753],[-104.6413,34.94769],[-104.64032,34.94795],[-104.63875,34.94842],[-104.63782,34.94875],[-104.63669,34.94915],[-104.635,34.94987],[-104.6285,34.95292],[-104.62214,34.95596],[-104.61236,34.96061],[-104.60261,34.96533],[-104.59962,34.96676],[-104.59203,34.9704],[-104.58736,34.97263],[-104.57838,34.97693],[-104.56947,34.98119],[-104.55486,34.98819],[-104.5435,34.99361],[-104.54049,34.99505],[-104.53284,34.99878],[-104.523,35.00348],[-104.52269,35.00363],[-104.5185,35.00561],[-104.51762,35.006],[-104.51595,35.00665],[-104.5146,35.00705],[-104.50671,35.009],[-104.50221,35.01017],[-104.4986,35.01106],[-104.49745,35.01127],[-104.49631,35.01141],[-104.49514,35.0115],[-104.49416,35.01152],[-104.4924,35.0115],[-104.4781,35.01129],[-104.46726,35.01115],[-104.46639,35.01117],[-104.4658,35.01121],[-104.46522,35.01128],[-104.46455,35.01139],[-104.46255,35.01181],[-104.45719,35.0129],[-104.44695,35.01501],[-104.44476,35.01565],[-104.44357,35.01614],[-104.44231,35.01659],[-104.44093,35.01715],[-104.43944,35.01779],[-104.43242,35.02096],[-104.42546,35.02408],[-104.41731,35.02767],[-104.41539,35.02857],[-104.4123,35.02991],[-104.41202,35.03004],[-104.40495,35.03304],[-104.39933,35.03551],[-104.39774,35.03626],[-104.39685,35.0367],[-104.39444,35.03796],[-104.38901,35.04087],[-104.38331,35.0439],[-104.37915,35.04612],[-104.378,35.04671],[-104.37727,35.047],[-104.37658,35.04723],[-104.37574,35.04744],[-104.37498,35.04756],[-104.37336,35.04775],[-104.36483,35.04868],[-104.34888,35.05054],[-104.33886,35.05172],[-104.33672,35.05207],[-104.33492,35.05249],[-104.32831,35.05428],[-104.31678,35.0575],[-104.30357,35.06106],[-104.30155,35.06157],[-104.2997,35.06194],[-104.29777,35.06226],[-104.29419,35.06264],[-104.28638,35.06343],[-104.277,35.06445],[-104.27252,35.06496],[-104.27091,35.06513],[-104.26772,35.06548],[-104.26321,35.06596],[-104.25985,35.06632],[-104.2593,35.06637],[-104.25222,35.06713],[-104.2421,35.0682],[-104.23446,35.06902],[-104.22801,35.06968],[-104.22612,35.06983],[-104.22371,35.06997],[-104.22118,35.07003],[-104.21953,35.06997],[-104.21743,35.06985],[-104.2123,35.06924],[-104.21193,35.0692],[-104.18999,35.06644],[-104.18792,35.06627],[-104.18659,35.06623],[-104.1837,35.06618],[-104.18018,35.06644],[-104.17848,35.06665],[-104.17683,35.0669],[-104.17535,35.0672],[-104.15915,35.07126],[-104.14799,35.07407],[-104.13837,35.07644],[-104.12785,35.07905],[-104.11927,35.08112],[-104.10769,35.08409],[-104.10325,35.08519],[-104.09713,35.0867],[-104.09347,35.08761],[-104.08798,35.08896],[-104.08426,35.08988],[-104.07713,35.09164],[-104.07649,35.09179],[-104.07612,35.09189],[-104.07294,35.09265],[-104.07221,35.09282],[-104.07052,35.09314],[-104.06929,35.09325],[-104.06463,35.09354],[-104.06313,35.09377],[-104.06149,35.09419],[-104.05982,35.0948],[-104.0589,35.09524],[-104.05169,35.0987],[-104.05027,35.09928],[-104.04909,35.0997],[-104.04746,35.10014],[-104.03768,35.10276],[-104.0227,35.10674],[-104.00491,35.1115],[-103.98622,35.1165],[-103.96816,35.12132],[-103.96783,35.12141],[-103.96663,35.12173],[-103.96118,35.1232],[-103.95712,35.12437],[-103.95534,35.12485],[-103.95322,35.12523],[-103.95097,35.12556],[-103.94731,35.1258],[-103.94466,35.12584],[-103.94318,35.12576],[-103.94103,35.12559],[-103.93852,35.12527],[-103.9272,35.12368],[-103.91519,35.12188],[-103.90423,35.12035],[-103.89898,35.11955],[-103.89728,35.11931],[-103.89025,35.11829],[-103.88886,35.11811],[-103.88178,35.11709],[-103.875,35.11606],[-103.87403,35.11596],[-103.87321,35.11594],[-103.87208,35.11601],[-103.87017,35.11634],[-103.86937,35.11655],[-103.869,35.11666],[-103.86858,35.11679],[-103.86818,35.11692],[-103.86776,35.11709],[-103.86745,35.11721],[-103.86714,35.11735],[-103.86678,35.11752],[-103.86632,35.11776],[-103.86564,35.11813],[-103.86512,35.11842],[-103.86082,35.12077],[-103.85901,35.12166],[-103.84858,35.12741],[-103.83189,35.13663],[-103.82842,35.13854],[-103.82759,35.13899],[-103.82727,35.13916],[-103.82695,35.13932],[-103.8266,35.1395],[-103.82624,35.13966],[-103.82586,35.13983],[-103.82549,35.13999],[-103.8251,35.14014],[-103.82468,35.1403],[-103.82431,35.14042],[-103.82388,35.14056],[-103.82343,35.1407],[-103.82287,35.14086],[-103.82007,35.14159],[-103.81696,35.1424],[-103.81149,35.14383],[-103.80821,35.14467],[-103.80585,35.14528],[-103.80298,35.14604],[-103.80124,35.14649],[-103.8008,35.14659],[-103.80039,35.14668],[-103.79993,35.14677],[-103.79934,35.14687],[-103.79902,35.14691],[-103.79836,35.14701],[-103.79484,35.14743],[-103.79434,35.14749],[-103.79196,35.14779],[-103.79079,35.14794],[-103.79024,35.14801],[-103.78522,35.14865],[-103.78389,35.14882],[-103.78351,35.14887],[-103.78317,35.14892],[-103.78287,35.14897],[-103.7827,35.149],[-103.78241,35.14905],[-103.78218,35.1491],[-103.78193,35.14915],[-103.78169,35.1492],[-103.78146,35.14926],[-103.78122,35.14931],[-103.78096,35.14938],[-103.78066,35.14946],[-103.78042,35.14953],[-103.78016,35.14961],[-103.77991,35.14968],[-103.77969,35.14975],[-103.77946,35.14983],[-103.77925,35.1499],[-103.779,35.14998],[-103.77874,35.15008],[-103.77847,35.15019],[-103.77813,35.15033],[-103.77777,35.15048],[-103.77732,35.15068],[-103.77685,35.1509],[-103.77648,35.15109],[-103.77604,35.15132],[-103.77528,35.15171],[-103.77161,35.15359],[-103.76907,35.1549],[-103.76842,35.15524],[-103.76816,35.15538],[-103.76792,35.1555],[-103.76768,35.15561],[-103.76747,35.1557],[-103.76723,35.15581],[-103.76699,35.15591],[-103.76676,35.15599],[-103.76653,35.15607],[-103.76628,35.15615],[-103.76601,35.15623],[-103.76573,35.15631],[-103.76549,35.15636],[-103.76522,35.15642],[-103.765,35.15646],[-103.76479,35.1565],[-103.76456,35.15654],[-103.76434,35.15657],[-103.76414,35.1566],[-103.76393,35.15662],[-103.76374,35.15663],[-103.76354,35.15664],[-103.76335,35.15665],[-103.76306,35.15665],[-103.76279,35.15664],[-103.76257,35.15664],[-103.76235,35.15663],[-103.76211,35.15661],[-103.76187,35.15659],[-103.76168,35.15657],[-103.76155,35.15656],[-103.76138,35.15653],[-103.76124,35.15651],[-103.76103,35.15648],[-103.76082,35.15644],[-103.76055,35.15639],[-103.76035,35.15634],[-103.76015,35.1563],[-103.75995,35.15625],[-103.75974,35.15619],[-103.7596,35.15615],[-103.75471,35.15461],[-103.75327,35.15415],[-103.75146,35.15359],[-103.74906,35.15284],[-103.74795,35.1525],[-103.74726,35.15231],[-103.7468,35.15218],[-103.74632,35.15207],[-103.74598,35.152],[-103.74541,35.15189],[-103.74478,35.15179],[-103.74442,35.15173],[-103.74401,35.15168],[-103.74363,35.15163],[-103.74323,35.15159],[-103.74278,35.15156],[-103.74231,35.15153],[-103.74188,35.15152],[-103.74145,35.15151],[-103.7391,35.15149],[-103.7311,35.15144],[-103.72534,35.1514],[-103.72466,35.1514],[-103.71873,35.15136],[-103.71767,35.15136],[-103.7172,35.15136],[-103.71666,35.15138],[-103.71619,35.1514],[-103.71576,35.15143],[-103.71539,35.15146],[-103.71505,35.15149],[-103.71475,35.15153],[-103.71437,35.15158],[-103.71403,35.15163],[-103.71365,35.15168],[-103.71324,35.15176],[-103.71279,35.15185],[-103.71242,35.15192],[-103.71195,35.15203],[-103.71157,35.15213],[-103.71118,35.15224],[-103.71076,35.15237],[-103.71016,35.15256],[-103.70961,35.15275],[-103.70926,35.15289],[-103.70902,35.15299],[-103.70876,35.15309],[-103.70847,35.15322],[-103.70774,35.15354],[-103.70662,35.15405],[-103.70632,35.15419],[-103.69765,35.15824],[-103.69632,35.15887],[-103.6946,35.15966],[-103.6882,35.16263],[-103.68657,35.1634],[-103.68609,35.16364],[-103.68568,35.16385],[-103.68543,35.16399],[-103.68516,35.16414],[-103.68483,35.16433],[-103.68443,35.16459],[-103.68409,35.16481],[-103.68242,35.16592],[-103.68157,35.1665],[-103.6806,35.16715],[-103.67895,35.16826],[-103.67854,35.16853],[-103.67819,35.16875],[-103.6779,35.16895],[-103.67764,35.16911],[-103.67741,35.16924],[-103.67705,35.16946],[-103.67661,35.1697],[-103.6763,35.16985],[-103.67607,35.16997],[-103.67582,35.17009],[-103.67545,35.17026],[-103.67497,35.17047],[-103.67441,35.1707],[-103.67405,35.17084],[-103.6737,35.17096],[-103.67323,35.17111],[-103.6728,35.17125],[-103.67248,35.17134],[-103.67217,35.17142],[-103.67183,35.17151],[-103.67124,35.17164],[-103.67081,35.17173],[-103.67057,35.17177],[-103.67001,35.17187],[-103.66966,35.17193],[-103.66939,35.17197],[-103.66886,35.17203],[-103.66841,35.17207],[-103.66802,35.1721],[-103.66759,35.17213],[-103.66708,35.17215],[-103.66665,35.17216],[-103.66624,35.17217],[-103.66382,35.17218],[-103.64896,35.17224],[-103.63683,35.1723],[-103.62824,35.17232],[-103.62464,35.17234],[-103.61927,35.17237],[-103.61881,35.17237],[-103.61378,35.17239],[-103.61363,35.17239],[-103.59036,35.17249],[-103.57829,35.17257],[-103.57792,35.17259],[-103.57151,35.17284],[-103.56346,35.17323],[-103.55743,35.17335],[-103.54548,35.1731],[-103.52966,35.17314],[-103.52053,35.17318],[-103.50054,35.17324],[-103.49711,35.17324],[-103.49088,35.17327],[-103.48984,35.17323],[-103.48812,35.17304],[-103.48624,35.17273],[-103.48451,35.17226],[-103.48344,35.17186],[-103.48232,35.17142],[-103.48085,35.17073],[-103.47882,35.1694],[-103.47648,35.16801],[-103.47447,35.16673],[-103.46834,35.16282],[-103.46265,35.15919],[-103.45878,35.15678],[-103.45529,35.1546],[-103.45427,35.15383],[-103.45254,35.15255],[-103.44831,35.1501],[-103.4453,35.14819],[-103.44386,35.14735],[-103.44253,35.14666],[-103.44048,35.14582],[-103.43763,35.14465],[-103.43722,35.14449],[-103.43008,35.14143],[-103.42519,35.1394],[-103.42016,35.13737],[-103.41973,35.1372],[-103.41146,35.13385],[-103.40601,35.13174],[-103.40315,35.13056],[-103.40053,35.12949],[-103.39824,35.12856],[-103.39202,35.126],[-103.38967,35.12506],[-103.38318,35.12239],[-103.37551,35.11924],[-103.36367,35.11441],[-103.36132,35.11344],[-103.36102,35.11333],[-103.36075,35.11322],[-103.3604,35.11308],[-103.3601,35.11297],[-103.35981,35.11287],[-103.35951,35.11277],[-103.3592,35.11267],[-103.35891,35.11258],[-103.35861,35.11249],[-103.35827,35.1124],[-103.3579,35.1123],[-103.35758,35.11223],[-103.35719,35.11214],[-103.35677,35.11206],[-103.35635,35.11198],[-103.35597,35.11192],[-103.35557,35.11186],[-103.35504,35.11179],[-103.35457,35.11174],[-103.3541,35.1117],[-103.35367,35.11167],[-103.35325,35.11165],[-103.35282,35.11164],[-103.35229,35.11163],[-103.35173,35.11164],[-103.34512,35.11174],[-103.33647,35.11188],[-103.33468,35.1119],[-103.33141,35.11196],[-103.33082,35.11197],[-103.32658,35.11203],[-103.32553,35.11205],[-103.32154,35.11211],[-103.31631,35.11219],[-103.31354,35.11223],[-103.31052,35.11228],[-103.30653,35.11234],[-103.30612,35.11234],[-103.29617,35.11249],[-103.29112,35.11258],[-103.28762,35.11263],[-103.28546,35.11276],[-103.28339,35.11297],[-103.28168,35.11321],[-103.27939,35.11364],[-103.27753,35.11408],[-103.27509,35.1147],[-103.26999,35.11622],[-103.25301,35.12103],[-103.25051,35.12177],[-103.24909,35.1222],[-103.24628,35.12306],[-103.24321,35.12421],[-103.23862,35.12599],[-103.23839,35.1261],[-103.2362,35.12714],[-103.23015,35.12988],[-103.22657,35.13134],[-103.20926,35.13731],[-103.17417,35.14931],[-103.15233,35.15683],[-103.13831,35.16163],[-103.12627,35.16577],[-103.12127,35.16746],[-103.11769,35.16847],[-103.10892,35.17081],[-103.10859,35.1709],[-103.10743,35.1712],[-103.10506,35.17182],[-103.10322,35.17231],[-103.10166,35.17275],[-103.10071,35.17304],[-103.09849,35.17375],[-103.09638,35.17443],[-103.09417,35.17509],[-103.08112,35.17933],[-103.07551,35.18115],[-103.07311,35.18181],[-103.07054,35.18232],[-103.06881,35.18262],[-103.06715,35.18286],[-103.06587,35.18299],[-103.06379,35.18313],[-103.06155,35.18316],[-103.05775,35.18299],[-103.0569,35.18296],[-103.04246,35.1824],[-103.03945,35.18229],[-103.03854,35.18223],[-103.03726,35.18214],[-103.03583,35.18198],[-103.02806,35.18093],[-103.02726,35.18087],[-103.02596,35.18083],[-103.02503,35.18084],[-103.02383,35.18091],[-103.02035,35.18132],[-103.01793,35.1816],[-103.01544,35.18189],[-103.00958,35.18257],[-103.0083,35.18271],[-103.00486,35.18311],[-103.00426,35.18318],[-103.00122,35.18354],[-103.00035,35.18363],[-103.00031,35.18363],[-102.99262,35.18452],[-102.9899,35.18483],[-102.98904,35.18494],[-102.98747,35.18514],[-102.98642,35.1853],[-102.9856,35.18547],[-102.98397,35.18587],[-102.98258,35.18629],[-102.98132,35.18673],[-102.97691,35.1883],[-102.97394,35.18935],[-102.97137,35.19026],[-102.9679,35.19151],[-102.96299,35.19324],[-102.96018,35.19427],[-102.95754,35.19519],[-102.95547,35.19588],[-102.95314,35.19672],[-102.95075,35.19759],[-102.94821,35.19848],[-102.94513,35.19955],[-102.94298,35.20033],[-102.94223,35.2006],[-102.94147,35.20091],[-102.94089,35.20118],[-102.939,35.20203],[-102.93449,35.20407],[-102.93067,35.2058],[-102.92567,35.20806],[-102.92387,35.20888],[-102.92129,35.21005],[-102.91935,35.21093],[-102.9178,35.21162],[-102.91638,35.21227],[-102.91017,35.21507],[-102.90862,35.21576],[-102.90778,35.21605],[-102.90679,35.21632],[-102.90396,35.21703],[-102.89905,35.21824],[-102.8895,35.22061],[-102.88643,35.22137],[-102.87955,35.22308],[-102.87534,35.22411],[-102.87246,35.22482],[-102.86883,35.22571],[-102.86795,35.22595],[-102.86734,35.22613],[-102.86658,35.22639],[-102.8626,35.22784],[-102.85871,35.22922],[-102.85399,35.23093],[-102.85254,35.23145],[-102.84944,35.23255],[-102.84459,35.2343],[-102.84136,35.23548],[-102.83807,35.23666],[-102.83752,35.23686],[-102.83709,35.23701],[-102.83496,35.23777],[-102.83235,35.23872],[-102.83163,35.23894],[-102.82518,35.24128],[-102.82389,35.24174],[-102.81921,35.24342],[-102.81821,35.24379],[-102.81732,35.24408],[-102.81668,35.24425],[-102.81579,35.24444],[-102.8149,35.24459],[-102.81403,35.24469],[-102.81264,35.2448],[-102.81178,35.24488],[-102.81083,35.24494],[-102.80934,35.2451],[-102.80687,35.24529],[-102.80562,35.24539],[-102.80483,35.24545],[-102.80343,35.2456],[-102.80253,35.24566],[-102.80161,35.24573],[-102.80086,35.2458],[-102.80034,35.24589],[-102.79962,35.24606],[-102.79728,35.24676],[-102.79584,35.24715],[-102.79476,35.24749],[-102.79249,35.24809],[-102.79166,35.24834],[-102.79139,35.24843],[-102.79089,35.24859],[-102.78917,35.24908],[-102.78886,35.24916],[-102.7886,35.24923],[-102.78747,35.24953],[-102.78675,35.24965],[-102.78469,35.24993],[-102.78268,35.25018],[-102.77994,35.2506],[-102.77882,35.25076],[-102.77749,35.25095],[-102.77668,35.2511],[-102.77588,35.25129],[-102.7749,35.25155],[-102.77402,35.25183],[-102.77323,35.25212],[-102.7722,35.25256],[-102.7709,35.25316],[-102.77039,35.25339],[-102.76573,35.2555],[-102.76288,35.25678],[-102.76194,35.25722],[-102.76114,35.25757],[-102.76032,35.2579],[-102.75963,35.25816],[-102.75788,35.25879],[-102.75458,35.25996],[-102.75245,35.26071],[-102.75113,35.26118],[-102.75034,35.26145],[-102.74911,35.26189],[-102.74866,35.26205],[-102.74791,35.26231],[-102.74695,35.26264],[-102.74516,35.26328],[-102.74372,35.26379],[-102.74326,35.26395],[-102.74016,35.26503],[-102.73883,35.2655],[-102.73725,35.26607],[-102.73569,35.26661],[-102.73436,35.26709],[-102.7332,35.26747],[-102.73148,35.26799],[-102.7306,35.26822],[-102.72981,35.26842],[-102.72902,35.2686],[-102.72774,35.26885],[-102.72667,35.26904],[-102.72589,35.26915],[-102.72508,35.26926],[-102.72399,35.26939],[-102.72339,35.26945],[-102.72231,35.26954],[-102.7216,35.26958],[-102.71961,35.26964],[-102.7177,35.2697],[-102.71506,35.26978],[-102.68547,35.27064],[-102.68463,35.27064],[-102.6833,35.27056],[-102.68269,35.2705],[-102.68222,35.27044],[-102.68161,35.27036],[-102.6808,35.27021],[-102.67962,35.26997],[-102.67878,35.2698],[-102.67805,35.26968],[-102.67709,35.26955],[-102.67664,35.2695],[-102.6759,35.26945],[-102.67472,35.26941],[-102.66682,35.26963],[-102.66654,35.26963],[-102.66245,35.26975],[-102.66024,35.26982],[-102.65833,35.26987],[-102.6564,35.26994],[-102.6552,35.26996],[-102.65437,35.27002],[-102.65354,35.27011],[-102.65289,35.27019],[-102.65121,35.2705],[-102.65043,35.27071],[-102.64959,35.27094],[-102.64923,35.27104],[-102.64882,35.27115],[-102.6482,35.2713],[-102.64729,35.27147],[-102.64678,35.27156],[-102.6458,35.27169],[-102.64497,35.27177],[-102.64431,35.27181],[-102.64278,35.27185],[-102.64016,35.27193],[-102.6357,35.27207],[-102.63291,35.27214],[-102.63136,35.27219],[-102.62643,35.27234],[-102.62534,35.27235],[-102.62243,35.27245],[-102.61509,35.27266],[-102.60844,35.27284],[-102.6002,35.2731],[-102.59636,35.27319],[-102.59133,35.27335],[-102.58779,35.27347],[-102.58599,35.27346],[-102.58429,35.2734],[-102.58421,35.27339],[-102.58297,35.27331],[-102.58175,35.27319],[-102.5801,35.27298],[-102.57857,35.27274],[-102.56515,35.27019],[-102.56486,35.27014],[-102.56396,35.26993],[-102.56273,35.26961],[-102.56148,35.26921],[-102.56044,35.26889],[-102.55963,35.26869],[-102.55882,35.26852],[-102.55736,35.26831],[-102.55635,35.26819],[-102.55492,35.2681],[-102.55385,35.268],[-102.5523,35.26776],[-102.55129,35.26755],[-102.55028,35.26733],[-102.54668,35.26667],[-102.54441,35.26626],[-102.53617,35.26471],[-102.53181,35.2639],[-102.52215,35.26207],[-102.51924,35.26152],[-102.5108,35.25993],[-102.50645,35.25911],[-102.50492,35.25881],[-102.50415,35.25865],[-102.504,35.25862],[-102.50307,35.25836],[-102.50167,35.25798],[-102.50102,35.25779],[-102.50033,35.25763],[-102.50007,35.25757],[-102.49951,35.25746],[-102.49874,35.25732],[-102.49512,35.25679],[-102.49069,35.25614],[-102.48842,35.25571],[-102.48832,35.25569],[-102.48624,35.2553],[-102.48606,35.25527],[-102.47894,35.25392],[-102.47647,35.25345],[-102.47399,35.25299],[-102.47153,35.25252],[-102.46905,35.25205],[-102.46653,35.25157],[-102.46402,35.2511],[-102.46152,35.25061],[-102.45912,35.25017],[-102.45779,35.24993],[-102.45707,35.24978],[-102.45666,35.2497],[-102.4552,35.2494],[-102.45437,35.24921],[-102.45349,35.24897],[-102.45324,35.2489],[-102.45228,35.24858],[-102.45131,35.24822],[-102.45026,35.24776],[-102.4494,35.24734],[-102.4489,35.24706],[-102.44781,35.24644],[-102.44388,35.24437],[-102.44259,35.24365],[-102.44127,35.24293],[-102.43992,35.24222],[-102.43862,35.24151],[-102.43726,35.24079],[-102.43658,35.24042],[-102.4359,35.24005],[-102.4345,35.2393],[-102.43448,35.23929],[-102.43356,35.23882],[-102.43318,35.23862],[-102.43207,35.2381],[-102.43081,35.23761],[-102.43007,35.23734],[-102.42959,35.2372],[-102.4285,35.23692],[-102.42759,35.23671],[-102.42656,35.23652],[-102.42553,35.23637],[-102.42449,35.23628],[-102.42329,35.23623],[-102.42212,35.23622],[-102.42093,35.23625],[-102.42085,35.23626],[-102.4196,35.23639],[-102.417,35.23681],[-102.41695,35.23682],[-102.41558,35.23705],[-102.41283,35.23749],[-102.41144,35.23771],[-102.41006,35.23792],[-102.40865,35.23814],[-102.40583,35.23858],[-102.40526,35.23867],[-102.40504,35.2387],[-102.40473,35.23874],[-102.40399,35.23882],[-102.40343,35.23886],[-102.40267,35.2389],[-102.40215,35.23891],[-102.40077,35.2389],[-102.39995,35.23885],[-102.39862,35.23869],[-102.39809,35.23862],[-102.39679,35.23838],[-102.39388,35.23782],[-102.39247,35.23756],[-102.39106,35.23728],[-102.38963,35.23701],[-102.38818,35.23672],[-102.38526,35.23619],[-102.38378,35.23592],[-102.38231,35.23565],[-102.38083,35.23537],[-102.37935,35.23508],[-102.37787,35.2348],[-102.37639,35.23452],[-102.37533,35.23433],[-102.37336,35.23396],[-102.37125,35.23357],[-102.36915,35.23316],[-102.36705,35.23278],[-102.36498,35.23238],[-102.36425,35.23225],[-102.36389,35.23217],[-102.36309,35.23203],[-102.36106,35.23165],[-102.35904,35.23127],[-102.35501,35.2305],[-102.349,35.22939],[-102.347,35.229],[-102.34098,35.22787],[-102.33898,35.22749],[-102.33276,35.22633],[-102.32711,35.22527],[-102.32498,35.22485],[-102.32401,35.22468],[-102.32285,35.22446],[-102.32072,35.22406],[-102.31859,35.22367],[-102.31434,35.22286],[-102.30796,35.22167],[-102.3016,35.22046],[-102.29524,35.21927],[-102.29312,35.21887],[-102.28889,35.21808],[-102.28812,35.21793],[-102.28678,35.21768],[-102.28043,35.21648],[-102.26774,35.21411],[-102.26562,35.21371],[-102.2635,35.21332],[-102.26139,35.21292],[-102.25927,35.21252],[-102.25724,35.21212],[-102.25524,35.21177],[-102.25328,35.21139],[-102.24897,35.21057],[-102.24827,35.21048],[-102.24785,35.21043],[-102.24737,35.21039],[-102.2463,35.21034],[-102.24361,35.21027],[-102.24094,35.21021],[-102.23874,35.21016],[-102.23669,35.21012],[-102.23574,35.21011],[-102.23037,35.20997],[-102.22776,35.20992],[-102.2252,35.20987],[-102.22272,35.20981],[-102.2204,35.20974],[-102.21984,35.20974],[-102.21804,35.20971],[-102.21658,35.20966],[-102.21633,35.20965],[-102.21557,35.20959],[-102.21426,35.20943],[-102.21393,35.20941],[-102.21315,35.20936],[-102.21226,35.20934],[-102.20988,35.20929],[-102.20761,35.20923],[-102.20534,35.20918],[-102.20237,35.2091],[-102.20159,35.20909],[-102.19874,35.20903],[-102.19672,35.20898],[-102.196,35.20898],[-102.19557,35.20899],[-102.19396,35.20908],[-102.19281,35.20916],[-102.19221,35.2092],[-102.19149,35.2092],[-102.19015,35.20919],[-102.18579,35.20909],[-102.18491,35.20906],[-102.17896,35.20892],[-102.1767,35.20886],[-102.17444,35.20882],[-102.17222,35.20876],[-102.16964,35.20872],[-102.16858,35.20865],[-102.16795,35.20858],[-102.16746,35.2085],[-102.16713,35.20845],[-102.16663,35.20837],[-102.16592,35.20823],[-102.16357,35.20768],[-102.16128,35.20713],[-102.15901,35.20659],[-102.15679,35.20604],[-102.1546,35.20552],[-102.15063,35.20456],[-102.15027,35.20447],[-102.14863,35.20406],[-102.14591,35.20339],[-102.1359,35.201],[-102.13353,35.20043],[-102.13125,35.19987],[-102.12929,35.1994],[-102.12533,35.19844],[-102.12383,35.19808],[-102.12219,35.19769],[-102.11921,35.19698],[-102.11766,35.1966],[-102.11522,35.196],[-102.11343,35.19557],[-102.11159,35.19512],[-102.10871,35.19445],[-102.10752,35.19415],[-102.10579,35.19372],[-102.10448,35.19332],[-102.10312,35.19288],[-102.10191,35.19253],[-102.10076,35.19228],[-102.10002,35.19217],[-102.09914,35.19207],[-102.09835,35.192],[-102.09529,35.19193],[-102.09222,35.19187],[-102.08315,35.19165],[-102.07414,35.19145],[-102.07117,35.19137],[-102.07064,35.19136],[-102.06826,35.19132],[-102.0643,35.19122],[-102.06357,35.1912],[-102.06138,35.19116],[-102.06006,35.19112],[-102.05814,35.19107],[-102.057,35.19104],[-102.05405,35.19098],[-102.05111,35.1909],[-102.04799,35.19083],[-102.04485,35.19075],[-102.04173,35.1907],[-102.03552,35.19053],[-102.0293,35.19039],[-102.0262,35.19033],[-102.0231,35.19025],[-102.02001,35.19016],[-102.01618,35.19008],[-102.01391,35.19003],[-102.01058,35.18998],[-102.00974,35.18995],[-102.00405,35.18977],[-102.00033,35.18968],[-101.99789,35.18961],[-101.98309,35.18927],[-101.98114,35.18921],[-101.98052,35.18917],[-101.98019,35.18913],[-101.97985,35.18908],[-101.97922,35.18896],[-101.9785,35.18878],[-101.97787,35.18856],[-101.97736,35.18835],[-101.97577,35.18767],[-101.97528,35.18749],[-101.97466,35.18731],[-101.97362,35.18709],[-101.97318,35.18703],[-101.97194,35.18698],[-101.97119,35.18699],[-101.97024,35.18706],[-101.96895,35.1872],[-101.9685,35.18724],[-101.96766,35.18732],[-101.96533,35.18753],[-101.96474,35.18757],[-101.96404,35.18759],[-101.96304,35.1876],[-101.96222,35.18758],[-101.96093,35.18754],[-101.95851,35.1875],[-101.95663,35.18746],[-101.95593,35.18744],[-101.9556,35.18744],[-101.95374,35.18737],[-101.95138,35.1873],[-101.94846,35.18723],[-101.94283,35.1871],[-101.94224,35.18708],[-101.94201,35.18708],[-101.93788,35.18697],[-101.9371,35.18695],[-101.9359,35.18695],[-101.93411,35.1869],[-101.92961,35.1868],[-101.92905,35.18677],[-101.92622,35.18669],[-101.9248,35.18666],[-101.9217,35.18658],[-101.92086,35.18656],[-101.91989,35.18654],[-101.91947,35.18654],[-101.919,35.18655],[-101.91854,35.18657],[-101.91787,35.18662],[-101.91717,35.18668],[-101.91638,35.18678],[-101.91543,35.18694],[-101.91492,35.18705],[-101.91424,35.1872],[-101.91351,35.1874],[-101.91288,35.18758],[-101.9121,35.18784],[-101.91189,35.18792],[-101.91105,35.18822],[-101.91052,35.18842],[-101.90883,35.18901],[-101.90797,35.18931],[-101.9077,35.18939],[-101.90727,35.18952],[-101.90657,35.18972],[-101.90596,35.18985],[-101.9055,35.18995],[-101.90481,35.19008],[-101.90407,35.19019],[-101.90349,35.19025],[-101.90296,35.19031],[-101.90195,35.1904],[-101.90106,35.19046],[-101.90033,35.19055],[-101.89951,35.19062],[-101.89814,35.19073],[-101.89599,35.19093],[-101.89515,35.19099],[-101.89415,35.19107],[-101.89373,35.1911],[-101.89186,35.19128],[-101.89071,35.19138],[-101.89013,35.1914],[-101.8891,35.1914],[-101.88791,35.19141],[-101.88438,35.19139],[-101.88364,35.19139],[-101.88128,35.19138],[-101.88013,35.19138],[-101.87953,35.19138],[-101.87919,35.19137],[-101.87802,35.19137],[-101.87746,35.19137],[-101.87692,35.19141],[-101.87632,35.19151],[-101.87574,35.19163],[-101.87534,35.19174],[-101.87484,35.19191],[-101.87449,35.19208],[-101.87395,35.19238],[-101.87238,35.19331],[-101.87203,35.19352],[-101.87132,35.19396],[-101.87095,35.19417],[-101.87057,35.19437],[-101.87035,35.19447],[-101.86993,35.19463],[-101.86956,35.19476],[-101.86916,35.19488],[-101.86877,35.19498],[-101.86835,35.19506],[-101.86796,35.19512],[-101.86724,35.19517],[-101.86664,35.19519],[-101.86588,35.19519],[-101.86479,35.19519],[-101.86283,35.19519],[-101.8605,35.19519],[-101.85986,35.19519],[-101.85819,35.19519],[-101.85755,35.19519],[-101.85544,35.19518],[-101.85492,35.19517],[-101.8543,35.19511],[-101.85197,35.19482],[-101.85038,35.19463],[-101.84779,35.19435],[-101.84518,35.19399],[-101.84385,35.19382],[-101.84277,35.19369],[-101.8412,35.19347],[-101.84069,35.19339],[-101.83955,35.19323],[-101.83446,35.19247],[-101.83403,35.1924],[-101.83355,35.19235],[-101.8332,35.19233],[-101.83273,35.19233],[-101.83223,35.19233],[-101.82965,35.19231],[-101.82729,35.19232],[-101.82654,35.19233],[-101.82487,35.19233],[-101.82417,35.19233],[-101.82353,35.19234],[-101.81934,35.1924],[-101.81762,35.19252],[-101.81691,35.19257],[-101.81441,35.1928],[-101.81259,35.19292],[-101.80982,35.19313],[-101.80978,35.19313],[-101.80875,35.19319],[-101.80797,35.19321],[-101.80745,35.19321],[-101.80599,35.19324],[-101.80539,35.19324],[-101.80197,35.19325],[-101.80021,35.19325],[-101.79976,35.19325],[-101.79795,35.19325],[-101.79742,35.19323],[-101.79696,35.1932],[-101.79639,35.19313],[-101.79574,35.19304],[-101.79305,35.1927],[-101.79172,35.19253],[-101.79166,35.19252],[-101.79143,35.19251],[-101.79103,35.19248],[-101.7873,35.19247],[-101.78664,35.19247],[-101.78558,35.19247],[-101.78367,35.19249],[-101.78305,35.1925],[-101.7806,35.19248],[-101.77914,35.19251],[-101.77847,35.19253],[-101.77557,35.19257],[-101.77341,35.19258],[-101.76885,35.19261],[-101.76431,35.19259],[-101.76278,35.19259],[-101.76031,35.19258],[-101.75979,35.19258],[-101.755,35.19264],[-101.74643,35.19266],[-101.74262,35.19264],[-101.74192,35.19264],[-101.73849,35.19267],[-101.73713,35.19267],[-101.73661,35.19267],[-101.73506,35.19267],[-101.73125,35.1927],[-101.73096,35.1927],[-101.72926,35.19271],[-101.72465,35.19274],[-101.72432,35.19275],[-101.72404,35.19275],[-101.72013,35.19272],[-101.71757,35.19272],[-101.71441,35.19273],[-101.7131,35.19271],[-101.71252,35.19267],[-101.71225,35.19266],[-101.71079,35.19263],[-101.70944,35.19259],[-101.70727,35.19258],[-101.70673,35.19258],[-101.70407,35.1926],[-101.70108,35.19261],[-101.70081,35.19261],[-101.70065,35.19261],[-101.69901,35.19263],[-101.6985,35.19262],[-101.6983,35.19263],[-101.69661,35.19265],[-101.69613,35.1927],[-101.69565,35.19278],[-101.69532,35.19286],[-101.69489,35.19295],[-101.69446,35.19305],[-101.69393,35.19323],[-101.69319,35.19349],[-101.69289,35.19361],[-101.69168,35.1943],[-101.69152,35.19441],[-101.69121,35.19464],[-101.69002,35.19567],[-101.68947,35.19611],[-101.68886,35.19661],[-101.68761,35.19769],[-101.68611,35.19892],[-101.68457,35.20024],[-101.68223,35.20218],[-101.68187,35.20241],[-101.68145,35.20268],[-101.68115,35.20284],[-101.68068,35.20309],[-101.6801,35.20335],[-101.67963,35.20352],[-101.67891,35.20375],[-101.6785,35.20385],[-101.67794,35.20397],[-101.67751,35.20404],[-101.67648,35.20418],[-101.6719,35.20481],[-101.67136,35.20488],[-101.66792,35.20538],[-101.6669,35.20552],[-101.6667,35.20554],[-101.66045,35.20642],[-101.65859,35.20669],[-101.65788,35.20676],[-101.65744,35.2068],[-101.65677,35.20683],[-101.65392,35.20685],[-101.65335,35.20684],[-101.65249,35.20683],[-101.6484,35.20682],[-101.62299,35.20677],[-101.62259,35.2068],[-101.62093,35.20705],[-101.62025,35.20724],[-101.61906,35.20767],[-101.61795,35.20824],[-101.61731,35.20865],[-101.60346,35.21892],[-101.60232,35.21962],[-101.60113,35.22013],[-101.60071,35.22027],[-101.59944,35.22057],[-101.59851,35.22071],[-101.5977,35.22076],[-101.58681,35.22067],[-101.57772,35.22057],[-101.57282,35.2206],[-101.57133,35.22061],[-101.5692,35.22063],[-101.56876,35.22063],[-101.56492,35.22065],[-101.56277,35.22067],[-101.56053,35.22068],[-101.55634,35.22071],[-101.55198,35.22073],[-101.54774,35.22075],[-101.5456,35.22077],[-101.54396,35.22078],[-101.54212,35.22079],[-101.53912,35.22081],[-101.53834,35.22081],[-101.53693,35.22083],[-101.53474,35.22086],[-101.53255,35.22088],[-101.53035,35.22091],[-101.52815,35.22094],[-101.52375,35.22101],[-101.51711,35.22107],[-101.51318,35.22113],[-101.50826,35.22119],[-101.5063,35.22121],[-101.50387,35.22124],[-101.50166,35.22127],[-101.50109,35.22127],[-101.50034,35.2213],[-101.49955,35.22132],[-101.49642,35.22137],[-101.49214,35.22138],[-101.4855,35.22138],[-101.48326,35.22139],[-101.47554,35.22139],[-101.47244,35.22141],[-101.47065,35.22141],[-101.46877,35.22142],[-101.46542,35.22143],[-101.4587,35.22145],[-101.44859,35.22148],[-101.44522,35.22149],[-101.44185,35.22148],[-101.42624,35.22153],[-101.42004,35.22154],[-101.41692,35.22156],[-101.4138,35.22156],[-101.40121,35.2216],[-101.39856,35.22161],[-101.39781,35.22157],[-101.39748,35.22154],[-101.39676,35.22148],[-101.39615,35.22141],[-101.39576,35.22135],[-101.39497,35.22121],[-101.39408,35.22103],[-101.39343,35.22087],[-101.39284,35.2207],[-101.39198,35.22043],[-101.39095,35.22006],[-101.38931,35.2194],[-101.38744,35.21866],[-101.38344,35.21706],[-101.38141,35.21624],[-101.38021,35.21576],[-101.37767,35.21475],[-101.37535,35.21384],[-101.36829,35.21103],[-101.36542,35.20988],[-101.36372,35.2092],[-101.36246,35.20873],[-101.36151,35.20844],[-101.36006,35.20809],[-101.35969,35.20802],[-101.35881,35.20787],[-101.35746,35.20771],[-101.35598,35.20763],[-101.35428,35.20762],[-101.34983,35.20763],[-101.34695,35.20762],[-101.33563,35.20761],[-101.32895,35.20761],[-101.3276,35.20761],[-101.31684,35.20759],[-101.30798,35.20757],[-101.30373,35.20757],[-101.29919,35.20755],[-101.29429,35.20756],[-101.28492,35.20755],[-101.28051,35.20754],[-101.27657,35.20755],[-101.27526,35.20754],[-101.27104,35.20753],[-101.26662,35.20753],[-101.25798,35.20752],[-101.25364,35.20752],[-101.25035,35.20751],[-101.24715,35.20752],[-101.24169,35.20752],[-101.24035,35.20752],[-101.23205,35.20751],[-101.22375,35.2075],[-101.22293,35.20751],[-101.22217,35.20754],[-101.22095,35.20764],[-101.21997,35.20773],[-101.21905,35.20778],[-101.21901,35.20778],[-101.21767,35.2078],[-101.21668,35.20778],[-101.21557,35.2077],[-101.21409,35.20756],[-101.21352,35.20752],[-101.21295,35.20751],[-101.21066,35.20748],[-101.20598,35.20748],[-101.2014,35.20747],[-101.19659,35.20747],[-101.19162,35.20746],[-101.18189,35.20743],[-101.17927,35.20743],[-101.17683,35.20742],[-101.17501,35.20743],[-101.17196,35.20743],[-101.17047,35.20742],[-101.16908,35.20742],[-101.16774,35.20741],[-101.16489,35.20741],[-101.16138,35.2074],[-101.15791,35.2074],[-101.15,35.20739],[-101.14883,35.20742],[-101.14723,35.20749],[-101.14513,35.20765],[-101.14404,35.20775],[-101.14296,35.2079],[-101.14192,35.20806],[-101.14066,35.20829],[-101.13994,35.20844],[-101.13569,35.20925],[-101.13314,35.20973],[-101.13106,35.21013],[-101.12523,35.21123],[-101.12348,35.21156],[-101.12039,35.21215],[-101.11744,35.2127],[-101.11678,35.21282],[-101.11505,35.21315],[-101.11484,35.21319],[-101.11418,35.21328],[-101.11355,35.21336],[-101.1128,35.21341],[-101.11201,35.21343],[-101.11101,35.21342],[-101.10986,35.21333],[-101.10904,35.21322],[-101.10893,35.2132],[-101.10819,35.21307],[-101.10758,35.21294],[-101.10679,35.21273],[-101.10648,35.21264],[-101.10606,35.21251],[-101.10563,35.21236],[-101.10539,35.21228],[-101.10466,35.21197],[-101.10367,35.2115],[-101.10252,35.21085],[-101.09975,35.20927],[-101.09916,35.20893],[-101.09878,35.20871],[-101.09855,35.20858],[-101.09662,35.20747],[-101.09531,35.20668],[-101.09451,35.20615],[-101.09373,35.20559],[-101.09296,35.20504],[-101.09172,35.20406],[-101.0901,35.2027],[-101.08993,35.20256],[-101.08901,35.20178],[-101.08836,35.20121],[-101.08738,35.20039],[-101.08622,35.19936],[-101.08491,35.19841],[-101.08454,35.19815],[-101.08339,35.19737],[-101.08274,35.19702],[-101.08203,35.19666],[-101.08137,35.19637],[-101.08044,35.19598],[-101.07947,35.19563],[-101.07852,35.19533],[-101.07791,35.19516],[-101.07715,35.19498],[-101.0746,35.19451],[-101.07112,35.19389],[-101.06151,35.19214],[-101.05793,35.19148],[-101.05058,35.19018],[-101.03495,35.18733],[-101.02178,35.18494],[-101.01515,35.18374],[-101.01388,35.1835],[-101.01326,35.18341],[-101.01248,35.18332],[-101.01161,35.18323],[-101.01033,35.18309],[-101.00876,35.18296],[-101.00777,35.18287],[-101.00707,35.1828],[-101.00627,35.18271],[-101.00446,35.18254],[-101.00229,35.18235],[-101.00119,35.18224],[-101.00062,35.18218],[-101.00033,35.18213],[-100.99739,35.18191],[-100.99251,35.18145],[-100.98931,35.18115],[-100.98866,35.18111],[-100.98802,35.18109],[-100.98737,35.18109],[-100.98672,35.18112],[-100.98608,35.18116],[-100.98544,35.18123],[-100.98483,35.18131],[-100.98092,35.18192],[-100.97981,35.1821],[-100.97618,35.18268],[-100.97555,35.18276],[-100.97497,35.18282],[-100.97438,35.18285],[-100.97399,35.18289],[-100.97391,35.1829],[-100.97376,35.18289],[-100.95951,35.18292],[-100.93932,35.18293],[-100.92,35.18293],[-100.91782,35.18293],[-100.9169,35.18293],[-100.91442,35.18292],[-100.9143,35.18292],[-100.91122,35.18292],[-100.90984,35.18289],[-100.90939,35.18285],[-100.90911,35.18283],[-100.90839,35.18274],[-100.9082,35.18272],[-100.90766,35.18264],[-100.9075,35.18261],[-100.90697,35.18252],[-100.90665,35.18246],[-100.90618,35.18237],[-100.9053,35.18212],[-100.90414,35.1818],[-100.90215,35.18118],[-100.90163,35.18101],[-100.89989,35.18047],[-100.89728,35.17965],[-100.89684,35.17953],[-100.89593,35.17934],[-100.89496,35.17914],[-100.89388,35.17899],[-100.89247,35.17886],[-100.89138,35.17884],[-100.88871,35.17882],[-100.88668,35.17882],[-100.8853,35.17881],[-100.88453,35.17884],[-100.88419,35.17888],[-100.88273,35.17904],[-100.87971,35.17975],[-100.87789,35.18037],[-100.87383,35.18184],[-100.87223,35.18236],[-100.87209,35.18241],[-100.87138,35.18265],[-100.87089,35.1828],[-100.86976,35.18306],[-100.86924,35.18317],[-100.86818,35.18337],[-100.86631,35.18356],[-100.86505,35.18361],[-100.86359,35.18358],[-100.863,35.18353],[-100.86132,35.18335],[-100.86054,35.18323],[-100.85967,35.18309],[-100.8591,35.18301],[-100.85561,35.18253],[-100.85277,35.18215],[-100.85014,35.18179],[-100.84794,35.18139],[-100.84681,35.18119],[-100.84554,35.18095],[-100.8433,35.18054],[-100.84114,35.18013],[-100.83969,35.17989],[-100.83777,35.17956],[-100.83715,35.17947],[-100.83562,35.17927],[-100.83355,35.1792],[-100.8317,35.17928],[-100.83033,35.17944],[-100.82894,35.17972],[-100.82718,35.18015],[-100.825,35.18094],[-100.82314,35.18185],[-100.8204,35.18324],[-100.81488,35.18611],[-100.81233,35.18746],[-100.80961,35.1889],[-100.80844,35.18961],[-100.80784,35.18998],[-100.80728,35.19041],[-100.80655,35.19099],[-100.80466,35.19257],[-100.80198,35.19477],[-100.8014,35.19524],[-100.79788,35.19815],[-100.79529,35.2002],[-100.79454,35.20069],[-100.79383,35.20111],[-100.79367,35.2012],[-100.79225,35.20198],[-100.78996,35.20292],[-100.78901,35.2033],[-100.78856,35.20349],[-100.78701,35.20416],[-100.78589,35.20463],[-100.78402,35.20543],[-100.78264,35.20621],[-100.78209,35.20658],[-100.78152,35.20692],[-100.78126,35.2071],[-100.78116,35.20717],[-100.78038,35.20776],[-100.77998,35.20809],[-100.77879,35.20924],[-100.7779,35.21017],[-100.77684,35.21132],[-100.77634,35.21184],[-100.77581,35.21236],[-100.77551,35.21263],[-100.77516,35.21286],[-100.77476,35.21314],[-100.77431,35.21343],[-100.77385,35.21368],[-100.7737,35.21375],[-100.77314,35.21402],[-100.77238,35.21429],[-100.7719,35.21442],[-100.77131,35.21459],[-100.77078,35.21467],[-100.76957,35.2148],[-100.76894,35.2148],[-100.76808,35.21478],[-100.76748,35.21474],[-100.76683,35.21463],[-100.765,35.21417],[-100.76298,35.21363],[-100.76096,35.21309],[-100.75911,35.21272],[-100.75749,35.2125],[-100.75691,35.21247],[-100.75565,35.21241],[-100.75507,35.21242],[-100.75368,35.21248],[-100.75299,35.21254],[-100.75234,35.21261],[-100.7518,35.21268],[-100.75033,35.21296],[-100.74933,35.21318],[-100.74567,35.21406],[-100.74523,35.21416],[-100.74337,35.2146],[-100.74248,35.21483],[-100.74171,35.21496],[-100.74104,35.21506],[-100.74055,35.21512],[-100.7398,35.21517],[-100.73848,35.21518],[-100.73768,35.21517],[-100.73713,35.21516],[-100.7369,35.21517],[-100.73333,35.21517],[-100.73309,35.21518],[-100.73218,35.21517],[-100.73039,35.21517],[-100.72974,35.21514],[-100.72911,35.21509],[-100.72811,35.21494],[-100.72702,35.21471],[-100.72431,35.21407],[-100.723,35.21377],[-100.72207,35.21358],[-100.72182,35.21354],[-100.72055,35.21338],[-100.71976,35.21334],[-100.71941,35.21333],[-100.71903,35.21333],[-100.71801,35.21335],[-100.71767,35.21338],[-100.71497,35.21367],[-100.71026,35.21408],[-100.70861,35.21423],[-100.70562,35.21451],[-100.7031,35.21473],[-100.70093,35.21491],[-100.699,35.21507],[-100.69641,35.21529],[-100.69611,35.21532],[-100.69401,35.21551],[-100.6748,35.21722],[-100.67365,35.21732],[-100.67329,35.21735],[-100.67286,35.2174],[-100.67207,35.2175],[-100.67162,35.21757],[-100.67129,35.21762],[-100.67052,35.21777],[-100.66832,35.2184],[-100.66781,35.21858],[-100.66372,35.21984],[-100.65757,35.22176],[-100.65269,35.22327],[-100.65162,35.2236],[-100.64804,35.22472],[-100.64285,35.22633],[-100.64121,35.22684],[-100.64114,35.22686],[-100.64018,35.22715],[-100.63887,35.22756],[-100.63864,35.22763],[-100.63673,35.22822],[-100.63672,35.22822],[-100.6355,35.22854],[-100.63494,35.22864],[-100.63401,35.22878],[-100.63317,35.22886],[-100.63215,35.22891],[-100.63171,35.22892],[-100.6315,35.22892],[-100.63047,35.22889],[-100.62958,35.22881],[-100.62565,35.22826],[-100.62229,35.22781],[-100.62151,35.2277],[-100.61929,35.22742],[-100.61839,35.22729],[-100.61814,35.22727],[-100.6169,35.22709],[-100.61581,35.22694],[-100.61518,35.22687],[-100.61456,35.22682],[-100.61369,35.22679],[-100.60873,35.2268],[-100.60621,35.22678],[-100.60491,35.22678],[-100.6033,35.22675],[-100.60114,35.22676],[-100.59841,35.22674],[-100.59723,35.22674],[-100.59712,35.22674],[-100.59678,35.22673],[-100.59604,35.2267],[-100.59507,35.22667],[-100.59453,35.22665],[-100.59393,35.22662],[-100.59221,35.22654],[-100.59211,35.22654],[-100.59189,35.22653],[-100.59151,35.22651],[-100.59002,35.22646],[-100.58792,35.22646],[-100.58701,35.22647],[-100.5791,35.22651],[-100.57419,35.2265],[-100.56683,35.22657],[-100.55634,35.2266],[-100.55437,35.2266],[-100.54607,35.22659],[-100.54006,35.22658],[-100.53757,35.22659],[-100.53293,35.22662],[-100.53064,35.22667],[-100.52961,35.22672],[-100.52554,35.2268],[-100.52375,35.22681],[-100.5098,35.22681],[-100.50413,35.22681],[-100.50301,35.22681],[-100.50172,35.22681],[-100.50034,35.2268],[-100.49828,35.22679],[-100.4896,35.22681],[-100.48524,35.22681],[-100.44612,35.22683],[-100.43764,35.22683],[-100.43348,35.22682],[-100.43221,35.22681],[-100.43072,35.22682],[-100.42723,35.22681],[-100.41354,35.22686],[-100.39083,35.22682],[-100.3858,35.22681],[-100.38495,35.22683],[-100.38422,35.22689],[-100.38366,35.22698],[-100.38313,35.22708],[-100.38255,35.22723],[-100.38175,35.22748],[-100.37978,35.22821],[-100.37899,35.22846],[-100.3783,35.22867],[-100.37809,35.22872],[-100.37714,35.22893],[-100.37637,35.22905],[-100.37534,35.22915],[-100.37476,35.22918],[-100.37441,35.22919],[-100.37396,35.2292],[-100.37362,35.22919],[-100.37302,35.22917],[-100.37184,35.22906],[-100.37062,35.22896],[-100.36814,35.22875],[-100.36603,35.22858],[-100.36483,35.22847],[-100.36048,35.22813],[-100.3565,35.22779],[-100.35624,35.22776],[-100.35587,35.22769],[-100.35555,35.22762],[-100.35526,35.22754],[-100.35421,35.22728],[-100.35316,35.22702],[-100.35245,35.22689],[-100.35216,35.22686],[-100.35179,35.22681],[-100.35025,35.22681],[-100.34816,35.22678],[-100.34489,35.22677],[-100.34409,35.22677],[-100.34236,35.22676],[-100.34199,35.22676],[-100.33851,35.22678],[-100.33754,35.22679],[-100.33535,35.22679],[-100.33306,35.22679],[-100.32846,35.2268],[-100.32268,35.2268],[-100.31578,35.22677],[-100.31358,35.22676],[-100.30686,35.22677],[-100.3045,35.22677],[-100.30219,35.22675],[-100.29877,35.22675],[-100.29535,35.22674],[-100.29349,35.22675],[-100.28859,35.22675],[-100.28529,35.22674],[-100.28167,35.22675],[-100.28103,35.22678],[-100.28029,35.22684],[-100.27874,35.22701],[-100.27755,35.22716],[-100.27614,35.22736],[-100.27524,35.22748],[-100.27097,35.22807],[-100.26968,35.22826],[-100.26876,35.22838],[-100.26638,35.22871],[-100.26513,35.22887],[-100.26405,35.22901],[-100.26318,35.22911],[-100.26177,35.22927],[-100.26079,35.22939],[-100.25953,35.22956],[-100.25946,35.22957],[-100.25714,35.22984],[-100.25523,35.23008],[-100.25194,35.23049],[-100.25034,35.23067],[-100.24996,35.23071],[-100.24951,35.23077],[-100.24818,35.2309],[-100.24762,35.23096],[-100.24599,35.23119],[-100.24547,35.23124],[-100.24465,35.23131],[-100.24394,35.23133],[-100.24301,35.23135],[-100.24228,35.23131],[-100.24192,35.23128],[-100.24041,35.23116],[-100.24007,35.23112],[-100.23953,35.231],[-100.23864,35.23084],[-100.23708,35.23048],[-100.23685,35.23043],[-100.23158,35.22918],[-100.23148,35.22916],[-100.23073,35.22899],[-100.23001,35.22883],[-100.22749,35.22828],[-100.2269,35.22814],[-100.22605,35.22794],[-100.22361,35.22736],[-100.22281,35.22719],[-100.22235,35.22711],[-100.22203,35.22705],[-100.22125,35.22693],[-100.22047,35.22683],[-100.21968,35.22675],[-100.21914,35.22671],[-100.21862,35.22668],[-100.2181,35.22666],[-100.2173,35.22665],[-100.21071,35.22667],[-100.19167,35.22674],[-100.17345,35.22672],[-100.16696,35.22671],[-100.16589,35.22671],[-100.16468,35.2267],[-100.1599,35.22667],[-100.15844,35.22667],[-100.1578,35.22667],[-100.15151,35.2267],[-100.13994,35.22669],[-100.13823,35.22669],[-100.13111,35.22665],[-100.12974,35.22664],[-100.12934,35.22664],[-100.12534,35.22662],[-100.12168,35.22663],[-100.12001,35.22664],[-100.1126,35.22663],[-100.10917,35.22663],[-100.10253,35.22662],[-100.10162,35.22662],[-100.09008,35.22659],[-100.08295,35.22662],[-100.07723,35.22662],[-100.0766,35.22662],[-100.06164,35.2266],[-100.0579,35.22658],[-100.05097,35.22661],[-100.04622,35.2266],[-100.04153,35.22664],[-100.03677,35.22664],[-100.03214,35.22666],[-100.03113,35.22667],[-100.02754,35.22668],[-100.02297,35.22666],[-100.00232,35.22673],[-100.00029,35.2268],[-99.99924,35.22684],[-99.99821,35.22689],[-99.99717,35.22696],[-99.99614,35.22703],[-99.99507,35.22712],[-99.99416,35.2272],[-99.99339,35.22727],[-99.99169,35.22745],[-99.99124,35.2275],[-99.98727,35.22803],[-99.98688,35.22808],[-99.96496,35.2311],[-99.96383,35.23125],[-99.96287,35.23136],[-99.96209,35.23144],[-99.9611,35.23153],[-99.96019,35.23159],[-99.95936,35.23165],[-99.95858,35.23169],[-99.95779,35.23173],[-99.95664,35.23176],[-99.95548,35.23177],[-99.95417,35.23176],[-99.95326,35.23174],[-99.9524,35.23171],[-99.95118,35.23165],[-99.95023,35.23159],[-99.94962,35.23154],[-99.94903,35.23149],[-99.9479,35.23138],[-99.94732,35.23131],[-99.94655,35.23122],[-99.94554,35.23108],[-99.9448,35.23097],[-99.94392,35.23083],[-99.94317,35.2307],[-99.94221,35.23053],[-99.92871,35.22787],[-99.92703,35.22756],[-99.92569,35.22734],[-99.92437,35.22714],[-99.92279,35.22693],[-99.92138,35.22677],[-99.9198,35.22661],[-99.91816,35.22648],[-99.91763,35.22645],[-99.91661,35.22639],[-99.9156,35.22634],[-99.91448,35.2263],[-99.91212,35.22627],[-99.91175,35.22627],[-99.90838,35.22626],[-99.90768,35.22625],[-99.89422,35.2262],[-99.89375,35.2262],[-99.8774,35.22614],[-99.87556,35.22614],[-99.87501,35.22612],[-99.87136,35.22612],[-99.87065,35.22612],[-99.86636,35.22611],[-99.86541,35.2261],[-99.86062,35.22608],[-99.85765,35.22608],[-99.85568,35.22611],[-99.85461,35.22614],[-99.85356,35.22616],[-99.85086,35.22627],[-99.84922,35.22635],[-99.84881,35.22638],[-99.84727,35.22647],[-99.8452,35.22663],[-99.84379,35.22675],[-99.84244,35.22687],[-99.8413,35.22698],[-99.83989,35.22713],[-99.83816,35.22731],[-99.835,35.22765],[-99.83377,35.22778],[-99.83371,35.22779],[-99.8323,35.22794],[-99.82592,35.22862],[-99.82447,35.22878],[-99.82324,35.2289],[-99.82203,35.22903],[-99.82089,35.22913],[-99.81977,35.22923],[-99.81902,35.22928],[-99.81762,35.22939],[-99.81597,35.2295],[-99.81447,35.22959],[-99.81303,35.22965],[-99.81158,35.22971],[-99.80978,35.22976],[-99.80675,35.22981],[-99.80476,35.22981],[-99.8033,35.22981],[-99.80159,35.22981],[-99.80019,35.22982],[-99.7982,35.22982],[-99.79725,35.22981],[-99.79659,35.22982],[-99.79478,35.22981],[-99.79445,35.22981],[-99.79406,35.22982],[-99.79295,35.22983],[-99.79184,35.22986],[-99.79075,35.22991],[-99.78983,35.22997],[-99.78945,35.23001],[-99.78839,35.2301],[-99.7877,35.23017],[-99.78669,35.23029],[-99.78585,35.2304],[-99.7848,35.23056],[-99.78368,35.23075],[-99.78269,35.23094],[-99.78235,35.23101],[-99.78133,35.23123],[-99.78015,35.23151],[-99.7792,35.23176],[-99.77818,35.23204],[-99.77681,35.23246],[-99.77573,35.23282],[-99.77467,35.23318],[-99.77284,35.23388],[-99.77148,35.23445],[-99.77008,35.23509],[-99.76869,35.23577],[-99.76699,35.23668],[-99.76636,35.23703],[-99.76281,35.23902],[-99.75683,35.24233],[-99.75317,35.24436],[-99.75271,35.24462],[-99.74899,35.2467],[-99.74086,35.25122],[-99.73976,35.25182],[-99.73886,35.25232],[-99.73773,35.25292],[-99.73562,35.25397],[-99.73358,35.25491],[-99.73186,35.25565],[-99.73029,35.25628],[-99.72872,35.25688],[-99.72717,35.25742],[-99.7258,35.25788],[-99.72504,35.25813],[-99.72422,35.25838],[-99.72364,35.25855],[-99.72272,35.25881],[-99.72178,35.25907],[-99.72043,35.25942],[-99.71919,35.25972],[-99.71758,35.26008],[-99.71635,35.26033],[-99.71518,35.26056],[-99.71392,35.26078],[-99.71286,35.26096],[-99.71159,35.26114],[-99.71032,35.26131],[-99.70908,35.26146],[-99.70786,35.26159],[-99.7063,35.26173],[-99.7052,35.2618],[-99.70402,35.26188],[-99.70305,35.26192],[-99.70172,35.26197],[-99.7005,35.26199],[-99.68217,35.26194],[-99.65838,35.26185],[-99.65767,35.26185],[-99.652,35.26183],[-99.65126,35.26184],[-99.6505,35.26184],[-99.64989,35.26187],[-99.64884,35.26193],[-99.64818,35.26198],[-99.64729,35.26208],[-99.6463,35.26222],[-99.64541,35.26237],[-99.64433,35.26257],[-99.64318,35.26284],[-99.64247,35.26302],[-99.64155,35.26328],[-99.64074,35.26354],[-99.64001,35.26379],[-99.63908,35.26415],[-99.6382,35.2645],[-99.63698,35.26506],[-99.63595,35.26557],[-99.63517,35.266],[-99.63424,35.26654],[-99.63346,35.26704],[-99.63249,35.26771],[-99.63175,35.26825],[-99.63115,35.26874],[-99.63052,35.26927],[-99.62979,35.26992],[-99.62904,35.27067],[-99.62827,35.27149],[-99.62762,35.27225],[-99.62676,35.27338],[-99.62644,35.27382],[-99.62597,35.27454],[-99.62555,35.27522],[-99.625,35.27622],[-99.62477,35.2767],[-99.62452,35.27721],[-99.62418,35.27798],[-99.62379,35.279],[-99.62353,35.27985],[-99.62262,35.28281],[-99.62151,35.28646],[-99.62103,35.28805],[-99.62075,35.28898],[-99.61992,35.29169],[-99.61918,35.2941],[-99.61906,35.29447],[-99.61888,35.29507],[-99.61565,35.30572],[-99.61501,35.30788],[-99.61443,35.30974],[-99.6142,35.31046],[-99.61365,35.31229],[-99.61338,35.31308],[-99.61254,35.31517],[-99.61222,35.31585],[-99.61202,35.31626],[-99.6118,35.31666],[-99.61128,35.31758],[-99.61104,35.31799],[-99.61063,35.31866],[-99.61015,35.31941],[-99.60962,35.32019],[-99.60919,35.32078],[-99.6087,35.3214],[-99.60796,35.3223],[-99.6073,35.32306],[-99.6065,35.32401],[-99.60452,35.32635],[-99.60254,35.3287],[-99.60056,35.33103],[-99.59858,35.33336],[-99.59816,35.33386],[-99.59777,35.3343],[-99.59739,35.33468],[-99.5972,35.33486],[-99.59708,35.33498],[-99.59663,35.33538],[-99.5962,35.33575],[-99.59561,35.33622],[-99.59496,35.33671],[-99.59418,35.3373],[-99.5934,35.33788],[-99.5927,35.33836],[-99.59212,35.33874],[-99.59158,35.33909],[-99.59108,35.33939],[-99.59027,35.33989],[-99.5898,35.34015],[-99.58943,35.34036],[-99.5811,35.3449],[-99.5804,35.34529],[-99.57613,35.34762],[-99.56513,35.35363],[-99.56252,35.35506],[-99.56145,35.3557],[-99.56027,35.35644],[-99.55904,35.3573],[-99.55829,35.35783],[-99.55749,35.3584],[-99.556,35.35946],[-99.55485,35.3603],[-99.54645,35.36632],[-99.54491,35.36741],[-99.5441,35.36795],[-99.54336,35.36842],[-99.54254,35.36892],[-99.54161,35.36945],[-99.54037,35.37013],[-99.53823,35.37128],[-99.52505,35.37845],[-99.5199,35.38124],[-99.5187,35.38189],[-99.51807,35.38223],[-99.51738,35.38259],[-99.51662,35.38295],[-99.516,35.38321],[-99.51538,35.38347],[-99.51463,35.38376],[-99.51413,35.38394],[-99.51377,35.38406],[-99.51293,35.38433],[-99.51223,35.38452],[-99.51131,35.38476],[-99.51057,35.38493],[-99.50993,35.38506],[-99.50911,35.3852],[-99.5083,35.38532],[-99.50744,35.38543],[-99.50658,35.3855],[-99.50576,35.38555],[-99.50524,35.38557],[-99.50443,35.38559],[-99.50181,35.38559],[-99.50092,35.38559],[-99.47631,35.3856],[-99.47453,35.38561],[-99.47269,35.38566],[-99.47027,35.38573],[-99.46927,35.38577],[-99.46803,35.38583],[-99.46642,35.38592],[-99.46544,35.38599],[-99.4636,35.38611],[-99.46204,35.38624],[-99.46061,35.38632],[-99.4593,35.38637],[-99.458,35.3864],[-99.4564,35.38642],[-99.45547,35.38641],[-99.45421,35.38638],[-99.45302,35.38635],[-99.45248,35.38633],[-99.45173,35.38629],[-99.45089,35.38624],[-99.44995,35.38618],[-99.44877,35.38608],[-99.44625,35.38591],[-99.44474,35.38582],[-99.44364,35.38577],[-99.4425,35.38572],[-99.44012,35.38564],[-99.43843,35.38561],[-99.43754,35.3856],[-99.43089,35.38559],[-99.42976,35.38558],[-99.42883,35.38558],[-99.42789,35.38558],[-99.42688,35.38558],[-99.42598,35.38558],[-99.42106,35.38557],[-99.41744,35.38558],[-99.41447,35.38558],[-99.4136,35.38561],[-99.41274,35.38567],[-99.41198,35.38574],[-99.41105,35.38587],[-99.41026,35.38601],[-99.40943,35.38619],[-99.40897,35.3863],[-99.40857,35.38641],[-99.40804,35.38656],[-99.40746,35.38674],[-99.40721,35.38682],[-99.40697,35.3869],[-99.40654,35.38707],[-99.40565,35.38743],[-99.40551,35.38749],[-99.40484,35.3878],[-99.4042,35.38813],[-99.40357,35.38847],[-99.40297,35.38883],[-99.40249,35.38914],[-99.40204,35.38946],[-99.4016,35.38978],[-99.40116,35.39012],[-99.40042,35.39074],[-99.39993,35.39121],[-99.39905,35.39206],[-99.39752,35.39354],[-99.39709,35.39395],[-99.39404,35.39695],[-99.39101,35.3999],[-99.38901,35.40183],[-99.38868,35.40215],[-99.38645,35.40433],[-99.38583,35.40494],[-99.38521,35.40554],[-99.38279,35.40791],[-99.38251,35.40818],[-99.37929,35.41132],[-99.37879,35.41181],[-99.37796,35.4126],[-99.37743,35.41313],[-99.3769,35.41361],[-99.37624,35.41417],[-99.37569,35.41464],[-99.37553,35.41477],[-99.37517,35.41505],[-99.37438,35.41562],[-99.37402,35.41589],[-99.37349,35.41624],[-99.37288,35.41661],[-99.37256,35.41681],[-99.3718,35.41725],[-99.37076,35.41778],[-99.36931,35.4185],[-99.36804,35.41904],[-99.36763,35.4192],[-99.36662,35.41956],[-99.36528,35.41997],[-99.36438,35.42023],[-99.36395,35.42034],[-99.36263,35.42065],[-99.36198,35.42077],[-99.36121,35.42091],[-99.36049,35.42102],[-99.35981,35.42111],[-99.359,35.4212],[-99.35834,35.42126],[-99.35765,35.42131],[-99.35695,35.42135],[-99.35619,35.42137],[-99.35542,35.42138],[-99.32926,35.42145],[-99.31145,35.42152],[-99.30701,35.42153],[-99.30611,35.42156],[-99.30564,35.42159],[-99.3051,35.42163],[-99.30454,35.42169],[-99.30405,35.42176],[-99.30332,35.42187],[-99.30248,35.42204],[-99.30178,35.4222],[-99.30103,35.42239],[-99.30044,35.42257],[-99.29987,35.42276],[-99.29933,35.42294],[-99.29872,35.42318],[-99.29807,35.42345],[-99.29732,35.42377],[-99.29654,35.4241],[-99.29588,35.42436],[-99.29516,35.42463],[-99.29448,35.42486],[-99.29394,35.42504],[-99.29351,35.42517],[-99.29291,35.42534],[-99.29233,35.42549],[-99.29159,35.42567],[-99.29099,35.4258],[-99.28998,35.42599],[-99.289,35.42615],[-99.28804,35.42627],[-99.28728,35.42635],[-99.28655,35.4264],[-99.28578,35.42644],[-99.285,35.42647],[-99.28426,35.42648],[-99.28324,35.42646],[-99.28248,35.42643],[-99.28178,35.42638],[-99.28111,35.42632],[-99.2805,35.42626],[-99.27983,35.42618],[-99.27924,35.42609],[-99.27825,35.42593],[-99.27762,35.4258],[-99.27692,35.42565],[-99.27603,35.42544],[-99.2755,35.42529],[-99.2745,35.425],[-99.27368,35.42473],[-99.27294,35.42447],[-99.27181,35.42405],[-99.27028,35.4235],[-99.26906,35.42306],[-99.26796,35.42268],[-99.26722,35.42245],[-99.26648,35.42225],[-99.26561,35.42205],[-99.26442,35.42184],[-99.26351,35.42172],[-99.26278,35.42165],[-99.26202,35.4216],[-99.26126,35.42157],[-99.25109,35.42157],[-99.24099,35.42158],[-99.23241,35.42157],[-99.23126,35.42159],[-99.23042,35.4216],[-99.22973,35.42163],[-99.22903,35.42168],[-99.22829,35.42175],[-99.22732,35.42185],[-99.22663,35.42194],[-99.22572,35.42207],[-99.22491,35.42221],[-99.22397,35.4224],[-99.22319,35.42256],[-99.22277,35.42266],[-99.22169,35.42294],[-99.22078,35.4232],[-99.21989,35.42348],[-99.219,35.42379],[-99.21783,35.42424],[-99.21697,35.42459],[-99.21621,35.42492],[-99.21564,35.42519],[-99.21527,35.42537],[-99.2144,35.42582],[-99.21408,35.42599],[-99.2134,35.42638],[-99.21277,35.42674],[-99.21078,35.42794],[-99.20094,35.43388],[-99.20017,35.43434],[-99.19936,35.4348],[-99.19864,35.43518],[-99.19781,35.43561],[-99.19681,35.4361],[-99.1959,35.43653],[-99.19477,35.43703],[-99.19378,35.43744],[-99.1926,35.4379],[-99.19175,35.4382],[-99.19098,35.43848],[-99.19019,35.43874],[-99.18936,35.439],[-99.18836,35.43929],[-99.18744,35.43955],[-99.1863,35.43984],[-99.18541,35.44005],[-99.18371,35.44041],[-99.18049,35.44105],[-99.17867,35.44142],[-99.17727,35.44172],[-99.17637,35.44193],[-99.17515,35.44226],[-99.17435,35.44249],[-99.17366,35.44269],[-99.17302,35.44291],[-99.1723,35.44317],[-99.17098,35.44365],[-99.17035,35.44391],[-99.16883,35.44457],[-99.16815,35.44488],[-99.16749,35.44522],[-99.16689,35.44553],[-99.16604,35.44599],[-99.16516,35.44649],[-99.16426,35.44703],[-99.16347,35.44753],[-99.16255,35.44816],[-99.16147,35.44895],[-99.16044,35.44976],[-99.1595,35.45056],[-99.15854,35.45141],[-99.15068,35.45836],[-99.14724,35.4614],[-99.14472,35.46363],[-99.1423,35.46575],[-99.14116,35.46675],[-99.14048,35.46732],[-99.13966,35.46795],[-99.13872,35.46865],[-99.1377,35.46933],[-99.13679,35.46992],[-99.13603,35.47038],[-99.1351,35.47092],[-99.1341,35.47145],[-99.13308,35.47196],[-99.132,35.47246],[-99.13056,35.47309],[-99.12672,35.47474],[-99.12315,35.47627],[-99.12188,35.47681],[-99.11967,35.47776],[-99.11872,35.47818],[-99.11791,35.47851],[-99.11733,35.47872],[-99.11678,35.4789],[-99.11624,35.47907],[-99.11558,35.47925],[-99.11496,35.47941],[-99.11427,35.47956],[-99.11387,35.47964],[-99.11327,35.47974],[-99.11269,35.47982],[-99.11212,35.47989],[-99.11144,35.47995],[-99.11058,35.48],[-99.10962,35.48001],[-99.10512,35.48],[-99.10173,35.48],[-99.08166,35.47996],[-99.06394,35.47994],[-99.05665,35.47993],[-99.05419,35.47993],[-99.05131,35.47991],[-99.05084,35.47991],[-99.04778,35.47992],[-99.03849,35.4799],[-99.03197,35.47989],[-99.03129,35.47991],[-99.03042,35.47994],[-99.02963,35.47998],[-99.02897,35.48003],[-99.02783,35.48015],[-99.02704,35.48025],[-99.02629,35.48035],[-99.02583,35.48043],[-99.02524,35.48054],[-99.02465,35.48065],[-99.02423,35.48074],[-99.02391,35.48081],[-99.02321,35.48097],[-99.02261,35.48112],[-99.02214,35.48124],[-99.02147,35.48144],[-99.0203,35.4818],[-99.01965,35.48202],[-99.01885,35.48231],[-99.01781,35.48272],[-99.0167,35.4832],[-99.01601,35.48353],[-99.01507,35.484],[-99.0141,35.48452],[-99.01306,35.48513],[-99.01225,35.48564],[-99.01138,35.48623],[-99.01057,35.48682],[-99.00946,35.48768],[-99.00808,35.48878],[-99.00685,35.48975],[-99.00601,35.49036],[-99.00535,35.49081],[-99.00459,35.4913],[-99.00371,35.49184],[-99.00285,35.49231],[-99.00196,35.49278],[-99.00116,35.49317],[-99.00002,35.49368],[-98.99902,35.49408],[-98.9979,35.4945],[-98.99695,35.49482],[-98.9958,35.49517],[-98.99485,35.49543],[-98.99391,35.49565],[-98.99309,35.49584],[-98.99251,35.49595],[-98.99107,35.49622],[-98.99023,35.49638],[-98.98537,35.49732],[-98.98261,35.49785],[-98.98167,35.49803],[-98.97924,35.4985],[-98.97856,35.49863],[-98.97719,35.49889],[-98.97591,35.49914],[-98.97479,35.49935],[-98.97359,35.49959],[-98.97241,35.49981],[-98.97164,35.49994],[-98.97112,35.50003],[-98.97043,35.50012],[-98.9699,35.50019],[-98.96913,35.50027],[-98.96795,35.50038],[-98.96723,35.50043],[-98.96664,35.50046],[-98.96595,35.50048],[-98.96504,35.5005],[-98.96488,35.5005],[-98.96443,35.5005],[-98.96353,35.50049],[-98.96273,35.50046],[-98.96207,35.50043],[-98.96129,35.50037],[-98.96046,35.50032],[-98.95875,35.50019],[-98.9566,35.50002],[-98.95531,35.49993],[-98.95448,35.49989],[-98.95371,35.49988],[-98.95311,35.49989],[-98.95225,35.49993],[-98.95155,35.49998],[-98.95097,35.50004],[-98.95023,35.50014],[-98.94972,35.50022],[-98.94932,35.5003],[-98.94841,35.50049],[-98.94774,35.50066],[-98.94693,35.5009],[-98.94628,35.50111],[-98.94544,35.50142],[-98.94478,35.50169],[-98.94406,35.50201],[-98.9431,35.50246],[-98.94128,35.50331],[-98.92355,35.51161],[-98.92131,35.51265],[-98.92076,35.51291],[-98.9202,35.51317],[-98.91964,35.51342],[-98.91906,35.51366],[-98.91841,35.51392],[-98.9178,35.51414],[-98.91724,35.51434],[-98.91668,35.51453],[-98.91594,35.51475],[-98.91507,35.51499],[-98.91418,35.51521],[-98.91321,35.51543],[-98.9124,35.51558],[-98.91158,35.51572],[-98.91081,35.51583],[-98.91017,35.51591],[-98.90978,35.51595],[-98.90929,35.516],[-98.9087,35.51604],[-98.90781,35.51609],[-98.90692,35.51612],[-98.90583,35.51613],[-98.87634,35.51608],[-98.87402,35.51608],[-98.87079,35.51608],[-98.86967,35.51607],[-98.86645,35.51607],[-98.86466,35.51606],[-98.8593,35.51606],[-98.85661,35.51605],[-98.85517,35.51605],[-98.854,35.51605],[-98.85323,35.51607],[-98.85249,35.5161],[-98.85173,35.51616],[-98.85095,35.51624],[-98.85049,35.5163],[-98.85001,35.51636],[-98.84912,35.51651],[-98.84805,35.51672],[-98.84684,35.51702],[-98.846,35.51722],[-98.84509,35.51747],[-98.84056,35.51867],[-98.83835,35.51926],[-98.83708,35.5196],[-98.8358,35.51994],[-98.83489,35.52018],[-98.83308,35.52065],[-98.83198,35.52091],[-98.8313,35.52107],[-98.83067,35.5212],[-98.82982,35.52137],[-98.82894,35.52152],[-98.82819,35.52165],[-98.82737,35.52177],[-98.82649,35.52189],[-98.82563,35.522],[-98.82467,35.5221],[-98.82374,35.52218],[-98.8226,35.52226],[-98.82158,35.52232],[-98.82061,35.52235],[-98.81947,35.52237],[-98.80782,35.52231],[-98.80203,35.52227],[-98.79624,35.52224],[-98.79123,35.52222],[-98.78663,35.52219],[-98.78227,35.52216],[-98.78194,35.52216],[-98.76443,35.5221],[-98.75001,35.52204],[-98.74137,35.52201],[-98.74053,35.522],[-98.73967,35.52198],[-98.739,35.52194],[-98.73841,35.5219],[-98.73788,35.52186],[-98.73727,35.5218],[-98.73693,35.52177],[-98.73636,35.5217],[-98.73525,35.52157],[-98.73449,35.52145],[-98.7323,35.5211],[-98.7308,35.52085],[-98.7289,35.52055],[-98.7279,35.5204],[-98.72721,35.52032],[-98.72678,35.52028],[-98.72604,35.52024],[-98.72525,35.52023],[-98.72461,35.52023],[-98.72398,35.52024],[-98.72327,35.52028],[-98.72231,35.52038],[-98.72162,35.52046],[-98.72083,35.52057],[-98.71903,35.52085],[-98.71817,35.52099],[-98.71764,35.52107],[-98.71699,35.52116],[-98.71639,35.52124],[-98.71535,35.52134],[-98.71497,35.52138],[-98.71434,35.52143],[-98.71325,35.5215],[-98.71277,35.52152],[-98.71228,35.52154],[-98.71129,35.52156],[-98.70915,35.52156],[-98.70797,35.52155],[-98.7075,35.52156],[-98.70079,35.52156],[-98.69988,35.52157],[-98.69937,35.52157],[-98.69882,35.5216],[-98.69806,35.52168],[-98.69779,35.52172],[-98.69748,35.52177],[-98.69708,35.52185],[-98.69677,35.52192],[-98.69627,35.52206],[-98.69582,35.52221],[-98.69541,35.52236],[-98.69502,35.52251],[-98.69463,35.52269],[-98.69441,35.52281],[-98.69414,35.52295],[-98.69392,35.52308],[-98.6937,35.52321],[-98.69338,35.52343],[-98.69304,35.52366],[-98.69277,35.52387],[-98.69254,35.52407],[-98.69219,35.52438],[-98.692,35.52457],[-98.69162,35.52497],[-98.69109,35.52555],[-98.69065,35.52602],[-98.69001,35.52675],[-98.68917,35.5277],[-98.68862,35.52828],[-98.68819,35.52872],[-98.68791,35.52898],[-98.6875,35.52937],[-98.68692,35.52985],[-98.68635,35.53028],[-98.68587,35.53063],[-98.68544,35.53092],[-98.6852,35.53108],[-98.68294,35.5326],[-98.68057,35.5342],[-98.6799,35.53463],[-98.67939,35.53493],[-98.67908,35.53509],[-98.67878,35.53523],[-98.6784,35.53539],[-98.67803,35.53553],[-98.67775,35.53564],[-98.67741,35.53574],[-98.67712,35.53582],[-98.67684,35.5359],[-98.67649,35.53598],[-98.67617,35.53604],[-98.67567,35.53613],[-98.67517,35.53618],[-98.6748,35.5362],[-98.67441,35.53622],[-98.67346,35.53623],[-98.66536,35.53623],[-98.66297,35.53623],[-98.66202,35.53623],[-98.65878,35.53624],[-98.6552,35.53624],[-98.65488,35.53624],[-98.65365,35.53625],[-98.64243,35.53626],[-98.63993,35.53626],[-98.62637,35.53627],[-98.62012,35.53627],[-98.60052,35.53625],[-98.59025,35.53625],[-98.58728,35.53625],[-98.58636,35.53625],[-98.58277,35.53626],[-98.57957,35.53626],[-98.57911,35.53626],[-98.5711,35.53627],[-98.57063,35.53627],[-98.56686,35.53628],[-98.56382,35.53629],[-98.56105,35.5363],[-98.56013,35.5363],[-98.5595,35.53629],[-98.55889,35.53627],[-98.55842,35.53626],[-98.55759,35.53622],[-98.55687,35.53618],[-98.55618,35.53613],[-98.55518,35.53604],[-98.55439,35.53597],[-98.55366,35.53588],[-98.55305,35.53581],[-98.55219,35.53568],[-98.55122,35.53554],[-98.55022,35.53537],[-98.54931,35.53519],[-98.54831,35.53498],[-98.54766,35.53484],[-98.54674,35.53462],[-98.54521,35.53423],[-98.54373,35.53384],[-98.5357,35.53174],[-98.53527,35.53163],[-98.53437,35.53139],[-98.53339,35.53114],[-98.53274,35.53096],[-98.53197,35.53076],[-98.53108,35.53054],[-98.53021,35.53033],[-98.52916,35.53011],[-98.52859,35.53],[-98.52801,35.5299],[-98.52716,35.52977],[-98.52603,35.52962],[-98.52555,35.52958],[-98.52504,35.52953],[-98.52401,35.52946],[-98.52317,35.52941],[-98.52252,35.52939],[-98.52105,35.52939],[-98.5198,35.52938],[-98.51846,35.52938],[-98.51041,35.52937],[-98.48265,35.52934],[-98.46986,35.52932],[-98.46923,35.52932],[-98.46617,35.52931],[-98.46494,35.52931],[-98.46447,35.52931],[-98.46359,35.5293],[-98.46213,35.52927],[-98.46067,35.52922],[-98.45931,35.52917],[-98.45826,35.52913],[-98.45724,35.52911],[-98.45611,35.52908],[-98.45444,35.52907],[-98.45289,35.52907],[-98.4511,35.52906],[-98.44721,35.52905],[-98.44057,35.52904],[-98.43844,35.52904],[-98.43747,35.52905],[-98.43676,35.52907],[-98.43612,35.52908],[-98.43552,35.5291],[-98.43447,35.52915],[-98.43342,35.52918],[-98.43257,35.5292],[-98.43141,35.52922],[-98.43003,35.52923],[-98.41148,35.5292],[-98.40993,35.52919],[-98.40909,35.52919],[-98.40851,35.52918],[-98.40753,35.52917],[-98.40638,35.52915],[-98.40546,35.52913],[-98.40471,35.52911],[-98.40403,35.52908],[-98.40317,35.52905],[-98.4021,35.52902],[-98.40175,35.52902],[-98.40045,35.529],[-98.39937,35.52901],[-98.39842,35.52903],[-98.39741,35.52905],[-98.3966,35.52908],[-98.39537,35.52911],[-98.39453,35.52913],[-98.39367,35.52914],[-98.3912,35.52915],[-98.39009,35.52915],[-98.38804,35.52915],[-98.38596,35.52914],[-98.38561,35.52914],[-98.375,35.52912],[-98.36433,35.5291],[-98.35848,35.52908],[-98.35648,35.52908],[-98.35398,35.52907],[-98.35085,35.52906],[-98.35047,35.52906],[-98.347,35.52906],[-98.33681,35.52902],[-98.33528,35.52901],[-98.33433,35.52899],[-98.33356,35.52895],[-98.33281,35.5289],[-98.33198,35.52883],[-98.33136,35.52877],[-98.33037,35.52864],[-98.32958,35.52851],[-98.32889,35.52839],[-98.32788,35.52819],[-98.32686,35.52796],[-98.31957,35.52614],[-98.31568,35.52516],[-98.31192,35.52423],[-98.31058,35.52388],[-98.30901,35.5235],[-98.30791,35.52322],[-98.30705,35.52303],[-98.30647,35.52293],[-98.30606,35.52286],[-98.30513,35.52273],[-98.30471,35.52268],[-98.30425,35.52264],[-98.30377,35.52262],[-98.30303,35.52259],[-98.30259,35.52258],[-98.30173,35.52259],[-98.30119,35.52262],[-98.30055,35.52266],[-98.29985,35.52273],[-98.2993,35.52279],[-98.29864,35.52289],[-98.29772,35.52306],[-98.29714,35.5232],[-98.29643,35.52337],[-98.29584,35.52354],[-98.29515,35.52376],[-98.2946,35.52395],[-98.2942,35.5241],[-98.29383,35.52425],[-98.29309,35.52456],[-98.29223,35.52498],[-98.29146,35.52539],[-98.29057,35.52591],[-98.28795,35.52745],[-98.28104,35.53152],[-98.27543,35.53483],[-98.27479,35.5352],[-98.27428,35.53547],[-98.27377,35.53571],[-98.27324,35.53593],[-98.27268,35.53614],[-98.27212,35.53631],[-98.27154,35.53647],[-98.27096,35.5366],[-98.27039,35.53671],[-98.27009,35.53675],[-98.2695,35.53683],[-98.26889,35.53687],[-98.2683,35.53689],[-98.26769,35.5369],[-98.25774,35.53669],[-98.25714,35.53667],[-98.25653,35.53665],[-98.25574,35.5366],[-98.25503,35.53654],[-98.25443,35.53648],[-98.25354,35.53637],[-98.25264,35.53624],[-98.25205,35.53615],[-98.25088,35.53593],[-98.24519,35.53471],[-98.24196,35.53402],[-98.23802,35.53318],[-98.23283,35.53206],[-98.22808,35.53105],[-98.22569,35.53053],[-98.22341,35.53004],[-98.22195,35.52973],[-98.22075,35.52947],[-98.21932,35.52919],[-98.21813,35.52899],[-98.21723,35.52885],[-98.21635,35.52873],[-98.21545,35.52861],[-98.21455,35.52851],[-98.21304,35.52838],[-98.21153,35.52829],[-98.21031,35.52824],[-98.20913,35.52822],[-98.2079,35.52822],[-98.2067,35.52825],[-98.20247,35.52838],[-98.20193,35.52839],[-98.20066,35.52844],[-98.19914,35.52852],[-98.19733,35.52863],[-98.19614,35.52872],[-98.19458,35.52886],[-98.19235,35.52907],[-98.19178,35.52912],[-98.19103,35.52918],[-98.19012,35.52925],[-98.18922,35.5293],[-98.18831,35.52935],[-98.18741,35.52938],[-98.18651,35.52941],[-98.1858,35.52943],[-98.18412,35.52945],[-98.18288,35.52946],[-98.18075,35.5295],[-98.17878,35.52958],[-98.17764,35.52965],[-98.17609,35.52975],[-98.17475,35.52983],[-98.17359,35.52989],[-98.17232,35.52993],[-98.17142,35.52996],[-98.17051,35.52998],[-98.16881,35.52997],[-98.16749,35.52995],[-98.16712,35.52994],[-98.16678,35.52993],[-98.16235,35.52977],[-98.15811,35.52964],[-98.1563,35.52959],[-98.15449,35.52956],[-98.15267,35.52953],[-98.15086,35.52951],[-98.14845,35.5295],[-98.13186,35.52955],[-98.12362,35.52957],[-98.12211,35.52956],[-98.12076,35.52954],[-98.11794,35.52947],[-98.11726,35.52945],[-98.11531,35.52936],[-98.11423,35.52931],[-98.11075,35.5291],[-98.10907,35.529],[-98.10729,35.52888],[-98.10397,35.52868],[-98.10247,35.52859],[-98.10095,35.52853],[-98.09944,35.52849],[-98.09792,35.52848],[-98.09651,35.5285],[-98.09549,35.52853],[-98.09417,35.52859],[-98.09291,35.52866],[-98.09157,35.52876],[-98.08976,35.52894],[-98.08767,35.52916],[-98.08585,35.52931],[-98.08465,35.5294],[-98.08375,35.52946],[-98.08253,35.52952],[-98.08085,35.5296],[-98.07885,35.52965],[-98.06115,35.5297],[-98.05826,35.5297],[-98.05472,35.52971],[-98.05386,35.52971],[-98.04983,35.52972],[-98.04807,35.52973],[-98.04717,35.52972],[-98.04628,35.5297],[-98.04603,35.52968],[-98.04558,35.52965],[-98.04508,35.52961],[-98.04434,35.52952],[-98.04397,35.52947],[-98.04373,35.52943],[-98.04329,35.52935],[-98.04249,35.52919],[-98.04173,35.52901],[-98.04128,35.52889],[-98.04076,35.52874],[-98.03996,35.52849],[-98.03484,35.52661],[-98.02697,35.52372],[-98.0232,35.52234],[-98.02161,35.52176],[-98.00926,35.51722],[-98.00636,35.51616],[-98.0042,35.51537],[-98.0032,35.515],[-98.00224,35.51466],[-98.00097,35.51425],[-98.00032,35.51406],[-97.99961,35.51387],[-97.99854,35.5136],[-97.99763,35.5134],[-97.99648,35.51318],[-97.99555,35.51304],[-97.99437,35.51287],[-97.9929,35.51267],[-97.99151,35.51246],[-97.98974,35.51216],[-97.98798,35.51184],[-97.9866,35.51156],[-97.98521,35.51126],[-97.98412,35.51103],[-97.98329,35.51083],[-97.9825,35.51064],[-97.98144,35.51038],[-97.97973,35.50993],[-97.9783,35.50953],[-97.97696,35.50914],[-97.97595,35.50883],[-97.97434,35.50833],[-97.97275,35.50779],[-97.97088,35.50713],[-97.96902,35.50643],[-97.9601,35.50305],[-97.95932,35.50275],[-97.95849,35.50244],[-97.95754,35.50211],[-97.95684,35.5019],[-97.956,35.50169],[-97.95508,35.50148],[-97.95474,35.50142],[-97.9539,35.5013],[-97.95328,35.50123],[-97.95253,35.50115],[-97.95173,35.50111],[-97.95098,35.5011],[-97.95047,35.5011],[-97.94978,35.5011],[-97.94626,35.50111],[-97.94303,35.50111],[-97.93826,35.50113],[-97.93755,35.50112],[-97.93677,35.50112],[-97.93534,35.50113],[-97.93213,35.50114],[-97.92531,35.50115],[-97.92476,35.50115],[-97.9194,35.50116],[-97.91797,35.50114],[-97.91646,35.50109],[-97.91531,35.50106],[-97.91419,35.501],[-97.9129,35.50093],[-97.91092,35.50079],[-97.90893,35.50064],[-97.9067,35.50052],[-97.90452,35.50046],[-97.90343,35.50044],[-97.90278,35.50043],[-97.90226,35.50042],[-97.90163,35.50042],[-97.8997,35.50044],[-97.89852,35.50046],[-97.89674,35.50053],[-97.89372,35.50069],[-97.89235,35.50079],[-97.89138,35.50087],[-97.89009,35.50097],[-97.88872,35.50106],[-97.88701,35.50115],[-97.88616,35.50118],[-97.88535,35.5012],[-97.88388,35.50122],[-97.88273,35.50122],[-97.88151,35.50121],[-97.87975,35.50115],[-97.87862,35.5011],[-97.87445,35.50084],[-97.87359,35.50079],[-97.86645,35.50033],[-97.86117,35.5],[-97.85963,35.49993],[-97.85809,35.49989],[-97.85663,35.49987],[-97.85519,35.49988],[-97.8539,35.4999],[-97.85244,35.49995],[-97.84879,35.50008],[-97.84501,35.50021],[-97.84425,35.50024],[-97.84361,35.50026],[-97.83095,35.5007],[-97.8242,35.50094],[-97.82163,35.50099],[-97.81918,35.50102],[-97.8181,35.50101],[-97.81672,35.501],[-97.81306,35.50099],[-97.80964,35.50098],[-97.79943,35.50095],[-97.79822,35.50093],[-97.7976,35.5009],[-97.79693,35.50086],[-97.79628,35.50081],[-97.79556,35.50074],[-97.79502,35.50069],[-97.79431,35.5006],[-97.79368,35.50052],[-97.79281,35.50039],[-97.79194,35.50024],[-97.79132,35.50012],[-97.79069,35.49999],[-97.78976,35.49979],[-97.78872,35.49953],[-97.78782,35.49927],[-97.78686,35.49898],[-97.78591,35.49867],[-97.7852,35.49841],[-97.78449,35.49815],[-97.78356,35.49778],[-97.7825,35.49732],[-97.78009,35.49621],[-97.7781,35.49529],[-97.77769,35.4951],[-97.77616,35.49439],[-97.77478,35.49376],[-97.76796,35.4906],[-97.76663,35.48997],[-97.76529,35.48932],[-97.76429,35.4888],[-97.76352,35.48842],[-97.76251,35.4879],[-97.76115,35.48718],[-97.76052,35.48684],[-97.75997,35.48654],[-97.75858,35.48577],[-97.75721,35.485],[-97.75649,35.48458],[-97.75474,35.48355],[-97.7504,35.48088],[-97.7497,35.48046],[-97.74903,35.48007],[-97.74774,35.47935],[-97.74714,35.47901],[-97.74642,35.47862],[-97.7454,35.47809],[-97.74405,35.47739],[-97.74267,35.47672],[-97.73895,35.47496],[-97.73586,35.47351],[-97.73357,35.47244],[-97.73133,35.47137],[-97.72972,35.47057],[-97.72823,35.46982],[-97.72621,35.46875],[-97.72487,35.46802],[-97.72469,35.46793],[-97.72418,35.46765],[-97.72331,35.46716],[-97.7222,35.46653],[-97.72049,35.46553],[-97.71961,35.46504],[-97.71873,35.46457],[-97.71783,35.46412],[-97.71708,35.46377],[-97.71621,35.46339],[-97.71526,35.463],[-97.71474,35.4628],[-97.71393,35.4625],[-97.7131,35.46221],[-97.71149,35.46172],[-97.7112,35.46164],[-97.71029,35.4614],[-97.70961,35.46122],[-97.70804,35.46089],[-97.70749,35.46078],[-97.70693,35.46068],[-97.70602,35.46053],[-97.70514,35.46041],[-97.70433,35.46032],[-97.70354,35.46024],[-97.70204,35.46013],[-97.70043,35.46007],[-97.69954,35.46005],[-97.69838,35.46006],[-97.69608,35.46007],[-97.6896,35.4601],[-97.68863,35.46011],[-97.68188,35.46015],[-97.68007,35.46015],[-97.67729,35.46017],[-97.67211,35.46019],[-97.67015,35.4602],[-97.66732,35.46021],[-97.65921,35.46025],[-97.65817,35.46026],[-97.65024,35.4603],[-97.64978,35.4603],[-97.63863,35.46035],[-97.63769,35.46035],[-97.63436,35.46036],[-97.63364,35.46036],[-97.6328,35.46035],[-97.63189,35.46033],[-97.63071,35.4603],[-97.62913,35.46024],[-97.62765,35.46019],[-97.62607,35.46014],[-97.62428,35.46008],[-97.62365,35.46006],[-97.62221,35.46003],[-97.62115,35.46001],[-97.61921,35.46001],[-97.61851,35.46001],[-97.61514,35.46001],[-97.60568,35.46],[-97.60439,35.46],[-97.60147,35.46],[-97.60077,35.46],[-97.5945,35.45999],[-97.58895,35.45999],[-97.58652,35.45999],[-97.58369,35.45999],[-97.58299,35.45999],[-97.58181,35.45999],[-97.58062,35.45999],[-97.58027,35.45999],[-97.57901,35.45999],[-97.57848,35.45999],[-97.57778,35.46001],[-97.5749,35.46013],[-97.57178,35.46028],[-97.57047,35.46037],[-97.57002,35.4604],[-97.56863,35.46049],[-97.56777,35.46053],[-97.5674,35.46055],[-97.56602,35.46061],[-97.56525,35.46064],[-97.56371,35.4607],[-97.56245,35.46076],[-97.56143,35.46084],[-97.56045,35.46093],[-97.55987,35.46099],[-97.55936,35.46106],[-97.55884,35.46112],[-97.5582,35.46121],[-97.55705,35.46135],[-97.55667,35.4614],[-97.5561,35.46146],[-97.55518,35.46153],[-97.55428,35.46159],[-97.55301,35.46163],[-97.55205,35.46164],[-97.55135,35.46164],[-97.54806,35.46163],[-97.54713,35.46161],[-97.5462,35.4616],[-97.54568,35.46156],[-97.54497,35.4615],[-97.5445,35.46143],[-97.54381,35.46129],[-97.54312,35.46115],[-97.54288,35.46108],[-97.54185,35.46084],[-97.54102,35.46063],[-97.53993,35.46037],[-97.53952,35.46027],[-97.5387,35.46007],[-97.53601,35.45943],[-97.53454,35.45907],[-97.53337,35.45879],[-97.53185,35.45841],[-97.53119,35.45826],[-97.53055,35.45811],[-97.53028,35.45804],[-97.52977,35.45792],[-97.52906,35.45775],[-97.52841,35.45759],[-97.52711,35.45728],[-97.52555,35.45689],[-97.52523,35.45682],[-97.5247,35.4567],[-97.52398,35.45653],[-97.52354,35.45645],[-97.52335,35.45641],[-97.5229,35.45635],[-97.52254,35.4563],[-97.52217,35.45626],[-97.52176,35.45623],[-97.52134,35.45621],[-97.52067,35.4562],[-97.51968,35.45618],[-97.51789,35.45623],[-97.51749,35.45622],[-97.51632,35.4562],[-97.51365,35.45616],[-97.51283,35.45615],[-97.51248,35.45616],[-97.5122,35.45618],[-97.51172,35.45622],[-97.51115,35.45629],[-97.51075,35.45636],[-97.51024,35.45647],[-97.51002,35.45652],[-97.50975,35.4566],[-97.5093,35.45673],[-97.50879,35.45692],[-97.50841,35.45707],[-97.50803,35.45724],[-97.50754,35.45748],[-97.50708,35.45776],[-97.50656,35.4581],[-97.50618,35.45839],[-97.50584,35.45866],[-97.50543,35.45903],[-97.50449,35.45989],[-97.50422,35.46013],[-97.50401,35.4603],[-97.50377,35.46049],[-97.50352,35.46069],[-97.50311,35.46095],[-97.50272,35.46118],[-97.50224,35.46142],[-97.50203,35.46151],[-97.50177,35.46162],[-97.50162,35.46168],[-97.50134,35.46179],[-97.50104,35.46188],[-97.50057,35.46202],[-97.5002,35.4621],[-97.49983,35.46218],[-97.49948,35.46223],[-97.49934,35.46225],[-97.499,35.46229],[-97.49865,35.46232],[-97.49836,35.46233],[-97.4981,35.46233],[-97.49754,35.46233],[-97.49705,35.46231],[-97.49574,35.46227],[-97.4944,35.46228],[-97.49387,35.46227],[-97.49276,35.46226],[-97.4919,35.46225],[-97.49124,35.46224],[-97.48958,35.46221],[-97.48924,35.46221],[-97.48776,35.46219],[-97.48683,35.46219],[-97.48589,35.46221],[-97.4851,35.46224],[-97.48439,35.46227],[-97.4839,35.46231],[-97.48334,35.46235],[-97.48196,35.46247],[-97.48071,35.46259],[-97.47892,35.46274],[-97.47846,35.46279],[-97.47722,35.4629],[-97.47644,35.46296],[-97.47545,35.46305],[-97.47508,35.46308],[-97.47427,35.46315],[-97.47376,35.46321],[-97.47345,35.46325],[-97.47292,35.46334],[-97.47242,35.46345],[-97.47199,35.46359],[-97.47179,35.46367],[-97.47163,35.46373],[-97.47149,35.46379],[-97.47139,35.46384],[-97.4711,35.464],[-97.47079,35.46419],[-97.47051,35.46436],[-97.46944,35.46501],[-97.4692,35.46516],[-97.46894,35.46528],[-97.46868,35.46539],[-97.46853,35.46544],[-97.46839,35.46548],[-97.46828,35.46551],[-97.46791,35.46558],[-97.46781,35.4656],[-97.46757,35.46562],[-97.46737,35.46563],[-97.46721,35.46564],[-97.46702,35.46564],[-97.46677,35.46562],[-97.46644,35.46557],[-97.46614,35.4655],[-97.46586,35.46541],[-97.46565,35.46533],[-97.46537,35.46521],[-97.46492,35.46498],[-97.46478,35.46491],[-97.46393,35.46446],[-97.4629,35.46384],[-97.4625,35.46359],[-97.46186,35.46315],[-97.46136,35.46279],[-97.46077,35.46235],[-97.45852,35.46049],[-97.45783,35.45995],[-97.45701,35.45928],[-97.45669,35.45901],[-97.4564,35.45878],[-97.45601,35.45851],[-97.45587,35.45841],[-97.45558,35.45823],[-97.45516,35.458],[-97.45483,35.45783],[-97.45449,35.45767],[-97.45422,35.45756],[-97.45395,35.45745],[-97.45358,35.45731],[-97.45325,35.4572],[-97.45272,35.45705],[-97.45217,35.45693],[-97.45157,35.45681],[-97.44687,35.4559],[-97.44521,35.45558],[-97.44316,35.45519],[-97.44272,35.4551],[-97.44225,35.45499],[-97.44174,35.45484],[-97.44135,35.45472],[-97.44111,35.45463],[-97.44059,35.45442],[-97.44022,35.45424],[-97.4399,35.45407],[-97.43863,35.45339],[-97.43812,35.4531],[-97.43506,35.45144],[-97.43462,35.4512],[-97.4341,35.45092],[-97.43213,35.44987],[-97.43149,35.44952],[-97.42964,35.44849],[-97.42918,35.44824],[-97.42824,35.44772],[-97.42679,35.44694],[-97.42531,35.44613],[-97.42385,35.44534],[-97.42344,35.44512],[-97.42308,35.44492],[-97.42253,35.44462],[-97.42196,35.44428],[-97.42145,35.44395],[-97.42115,35.44375],[-97.42091,35.44356],[-97.42062,35.44337],[-97.41932,35.44243],[-97.41804,35.44149],[-97.41634,35.44025],[-97.41532,35.43952],[-97.41341,35.43813],[-97.41305,35.43784],[-97.41261,35.43747],[-97.41209,35.437],[-97.41174,35.43664],[-97.41086,35.4357],[-97.41068,35.43551],[-97.41041,35.43527],[-97.41013,35.43504],[-97.40993,35.4349],[-97.40963,35.43472],[-97.40939,35.4346],[-97.40914,35.4345],[-97.40886,35.4344],[-97.40863,35.43434],[-97.40835,35.43429],[-97.40804,35.43425],[-97.40782,35.43423],[-97.40752,35.43421],[-97.40694,35.43421],[-97.40638,35.43421],[-97.40564,35.43421],[-97.40368,35.43421],[-97.40115,35.4342],[-97.4002,35.43422],[-97.39763,35.4342],[-97.39688,35.43422],[-97.3965,35.43427],[-97.39612,35.43436],[-97.39557,35.43455],[-97.3953,35.43465],[-97.39509,35.43471],[-97.39486,35.43478],[-97.39462,35.43484],[-97.39441,35.43488],[-97.39412,35.43492],[-97.39395,35.43493],[-97.39373,35.43494],[-97.39309,35.43494],[-97.38837,35.43493],[-97.38748,35.43491],[-97.38684,35.43488],[-97.38627,35.43484],[-97.38552,35.43479],[-97.38476,35.43474],[-97.38354,35.43466],[-97.38274,35.43461],[-97.38147,35.43453],[-97.38067,35.43448],[-97.37944,35.4344],[-97.3789,35.43435],[-97.37854,35.4343],[-97.37815,35.43423],[-97.37768,35.43414],[-97.3771,35.43401],[-97.37663,35.43388],[-97.3762,35.43375],[-97.37567,35.43358],[-97.37526,35.43343],[-97.3747,35.43323],[-97.36712,35.4305],[-97.36656,35.4303],[-97.36207,35.4287],[-97.36065,35.42819],[-97.35967,35.42785],[-97.35861,35.42748],[-97.35679,35.42686],[-97.35425,35.42603],[-97.35324,35.42571],[-97.33519,35.41999],[-97.33196,35.41897],[-97.33112,35.4187],[-97.33017,35.4184],[-97.32112,35.41552],[-97.31814,35.41457],[-97.31777,35.41446],[-97.31325,35.41302],[-97.31283,35.41288],[-97.312,35.41261],[-97.31075,35.41217],[-97.30953,35.41173],[-97.30831,35.41127],[-97.30588,35.4103],[-97.30471,35.40982],[-97.30356,35.40932],[-97.29578,35.40597],[-97.29192,35.40431],[-97.2914,35.40408],[-97.28563,35.40158],[-97.28149,35.3998],[-97.26506,35.39272],[-97.2647,35.39257],[-97.26383,35.39219],[-97.2636,35.39209],[-97.26,35.39053],[-97.25974,35.39042],[-97.25531,35.38851],[-97.25324,35.38761],[-97.25207,35.38711],[-97.25126,35.38677],[-97.25051,35.38649],[-97.24987,35.38626],[-97.24919,35.38604],[-97.24842,35.3858],[-97.24744,35.38554],[-97.24655,35.38531],[-97.24566,35.38512],[-97.2447,35.38494],[-97.24288,35.38468],[-97.2419,35.38457],[-97.24185,35.38457],[-97.2408,35.3845],[-97.23994,35.38446],[-97.23898,35.38445],[-97.23056,35.38442],[-97.22005,35.38439],[-97.21857,35.38438],[-97.21307,35.38435],[-97.21273,35.38435],[-97.20712,35.38434],[-97.20655,35.38434],[-97.19518,35.3843],[-97.19447,35.3843],[-97.19356,35.38429],[-97.19242,35.38426],[-97.19126,35.38421],[-97.19018,35.38415],[-97.18826,35.38402],[-97.18723,35.38395],[-97.18634,35.38391],[-97.18498,35.38385],[-97.18385,35.38383],[-97.17836,35.38379],[-97.1783,35.38379],[-97.17681,35.38379],[-97.17545,35.38381],[-97.17421,35.38383],[-97.17304,35.38388],[-97.17185,35.38396],[-97.17032,35.38405],[-97.16882,35.38412],[-97.16734,35.38417],[-97.1661,35.38419],[-97.16512,35.3842],[-97.16428,35.3842],[-97.16104,35.38419],[-97.16057,35.38419],[-97.14207,35.3841],[-97.1249,35.38404],[-97.10897,35.38397],[-97.10784,35.38394],[-97.10724,35.38392],[-97.10672,35.3839],[-97.10565,35.38385],[-97.1042,35.38375],[-97.10305,35.38369],[-97.10217,35.38364],[-97.1011,35.38361],[-97.1003,35.38359],[-97.09956,35.3836],[-97.09873,35.38362],[-97.09766,35.38367],[-97.09646,35.38374],[-97.09539,35.38379],[-97.09462,35.38382],[-97.09397,35.38385],[-97.09168,35.38389],[-97.08965,35.38389],[-97.08929,35.38389],[-97.08654,35.38387],[-97.0861,35.38387],[-97.08383,35.38384],[-97.08273,35.3838],[-97.08207,35.38377],[-97.08142,35.38374],[-97.08001,35.38364],[-97.07858,35.3835],[-97.07698,35.38332],[-97.0759,35.38319],[-97.07498,35.38305],[-97.07367,35.38283],[-97.07236,35.3826],[-97.0717,35.38247],[-97.0715,35.38243],[-97.07068,35.38225],[-97.06928,35.38192],[-97.06849,35.38173],[-97.06731,35.38143],[-97.06612,35.38108],[-97.06519,35.3808],[-97.06347,35.38024],[-97.06175,35.37963],[-97.06137,35.37948],[-97.05964,35.3788],[-97.05943,35.37872],[-97.05797,35.37818],[-97.0569,35.37783],[-97.0557,35.37749],[-97.05483,35.37727],[-97.05437,35.37716],[-97.05395,35.37707],[-97.05248,35.37679],[-97.05164,35.37667],[-97.05081,35.37656],[-97.04968,35.37645],[-97.04861,35.37637],[-97.04786,35.37635],[-97.04683,35.37633],[-97.04601,35.37634],[-97.04528,35.37636],[-97.0447,35.37639],[-97.04414,35.37644],[-97.04329,35.37651],[-97.04226,35.37662],[-97.04134,35.37676],[-97.03888,35.37717],[-97.03636,35.3776],[-97.03549,35.37774],[-97.03091,35.37852],[-97.02823,35.37896],[-97.01841,35.38061],[-97.00971,35.38206],[-97.00908,35.38217],[-97.00805,35.38234],[-97.00627,35.38263],[-97.00393,35.38302],[-97.00306,35.38315],[-97.00213,35.38327],[-97.00145,35.38335],[-97.00095,35.3834],[-97.00036,35.38345],[-96.99971,35.38349],[-96.99905,35.38353],[-96.99879,35.38355],[-96.99781,35.38359],[-96.99532,35.38361],[-96.96529,35.38381],[-96.96431,35.38383],[-96.96209,35.3838],[-96.96062,35.38377],[-96.95813,35.38366],[-96.95691,35.3836],[-96.95569,35.38355],[-96.95313,35.38349],[-96.95112,35.38352],[-96.94318,35.38369],[-96.93885,35.38379],[-96.93577,35.38384],[-96.93441,35.38385],[-96.9335,35.38386],[-96.9299,35.38385],[-96.92577,35.38383],[-96.92451,35.38383],[-96.92205,35.38382],[-96.9171,35.3838],[-96.91649,35.38379],[-96.9159,35.38379],[-96.91571,35.38379],[-96.9126,35.38378],[-96.91159,35.38378],[-96.90893,35.38376],[-96.90675,35.38376],[-96.90534,35.38375],[-96.90204,35.38373],[-96.89876,35.38373],[-96.89835,35.38372],[-96.89747,35.38373],[-96.89648,35.38375],[-96.89547,35.38378],[-96.89454,35.38382],[-96.89341,35.38388],[-96.89283,35.38392],[-96.89227,35.38396],[-96.89121,35.38405],[-96.89,35.38415],[-96.88907,35.38426],[-96.88808,35.38437],[-96.88708,35.3845],[-96.88595,35.38465],[-96.88503,35.38479],[-96.88346,35.38505],[-96.88149,35.38539],[-96.87838,35.38592],[-96.87667,35.38622],[-96.87411,35.38668],[-96.87155,35.38716],[-96.86845,35.38777],[-96.86617,35.38824],[-96.86504,35.38847],[-96.8619,35.38912],[-96.8605,35.3894],[-96.85978,35.38954],[-96.85891,35.38969],[-96.85792,35.38983],[-96.85707,35.38994],[-96.85641,35.39001],[-96.8556,35.39007],[-96.85498,35.39011],[-96.8541,35.39016],[-96.85339,35.39017],[-96.85255,35.39017],[-96.85192,35.39017],[-96.85142,35.39015],[-96.85066,35.39012],[-96.85014,35.39008],[-96.84957,35.39004],[-96.84876,35.38997],[-96.84823,35.38991],[-96.84753,35.38982],[-96.84677,35.38971],[-96.84583,35.38955],[-96.84479,35.38935],[-96.84362,35.38911],[-96.83691,35.38773],[-96.83339,35.38701],[-96.82878,35.38606],[-96.82637,35.38556],[-96.82496,35.38528],[-96.82366,35.38505],[-96.82276,35.38492],[-96.82186,35.38478],[-96.82088,35.38464],[-96.81916,35.38446],[-96.81779,35.38434],[-96.81637,35.38424],[-96.81507,35.38418],[-96.81379,35.38414],[-96.81252,35.38412],[-96.81109,35.3841],[-96.80729,35.38406],[-96.80686,35.38405],[-96.80223,35.38401],[-96.79581,35.38393],[-96.78945,35.38386],[-96.78575,35.38382],[-96.78371,35.38383],[-96.78203,35.38384],[-96.77979,35.3839],[-96.77753,35.38397],[-96.77674,35.384],[-96.77393,35.3841],[-96.77113,35.38419],[-96.76968,35.38422],[-96.76824,35.38425],[-96.76706,35.38427],[-96.76314,35.38431],[-96.76114,35.38431],[-96.75943,35.38431],[-96.75482,35.3843],[-96.7441,35.3843],[-96.74239,35.3843],[-96.74173,35.3843],[-96.73867,35.38427],[-96.73719,35.38423],[-96.73643,35.38421],[-96.73566,35.38417],[-96.7343,35.3841],[-96.73297,35.38401],[-96.73199,35.38395],[-96.73136,35.38392],[-96.73026,35.38388],[-96.72969,35.38386],[-96.72912,35.38385],[-96.72745,35.38385],[-96.72636,35.38387],[-96.72384,35.38395],[-96.72252,35.38398],[-96.71692,35.38415],[-96.71552,35.38419],[-96.71375,35.3842],[-96.71213,35.38418],[-96.71094,35.38415],[-96.70976,35.3841],[-96.70838,35.38403],[-96.70768,35.38398],[-96.70678,35.38393],[-96.70582,35.38386],[-96.70467,35.38379],[-96.70374,35.38376],[-96.70277,35.38373],[-96.70218,35.38371],[-96.70103,35.3837],[-96.70023,35.38369],[-96.69945,35.3837],[-96.69791,35.38374],[-96.69654,35.3838],[-96.69481,35.38389],[-96.69256,35.38407],[-96.69143,35.38416],[-96.69059,35.38422],[-96.68984,35.38426],[-96.68921,35.38428],[-96.6887,35.3843],[-96.68811,35.3843],[-96.68747,35.38431],[-96.687,35.3843],[-96.6862,35.38429],[-96.68538,35.38425],[-96.68437,35.38419],[-96.6838,35.38415],[-96.68307,35.38408],[-96.68133,35.38389],[-96.68045,35.3838],[-96.6793,35.3837],[-96.67857,35.38365],[-96.67783,35.38361],[-96.67637,35.38354],[-96.67515,35.38351],[-96.67161,35.38349],[-96.66936,35.38348],[-96.66686,35.38347],[-96.66649,35.38347],[-96.6633,35.38346],[-96.66188,35.38345],[-96.65766,35.38344],[-96.65652,35.38345],[-96.65538,35.38347],[-96.65426,35.3835],[-96.65325,35.38355],[-96.65247,35.38359],[-96.65169,35.38364],[-96.65063,35.38372],[-96.64963,35.3838],[-96.64846,35.38391],[-96.64727,35.38405],[-96.64649,35.38414],[-96.64572,35.38425],[-96.63857,35.38522],[-96.63775,35.38533],[-96.63649,35.38549],[-96.6347,35.38565],[-96.63406,35.38569],[-96.63261,35.38574],[-96.6317,35.38575],[-96.63082,35.38574],[-96.62995,35.38572],[-96.62913,35.38568],[-96.62836,35.38563],[-96.62733,35.38554],[-96.62529,35.38533],[-96.62457,35.38526],[-96.62371,35.38519],[-96.62277,35.38511],[-96.62117,35.385],[-96.61958,35.38491],[-96.61818,35.38485],[-96.61737,35.38483],[-96.61581,35.38479],[-96.61423,35.38478],[-96.61325,35.38477],[-96.61135,35.38478],[-96.60825,35.38478],[-96.60606,35.38477],[-96.60069,35.38477],[-96.60033,35.38477],[-96.5971,35.38477],[-96.59425,35.38476],[-96.59188,35.38476],[-96.59036,35.38475],[-96.58766,35.38472],[-96.58587,35.38468],[-96.58362,35.38463],[-96.57936,35.38448],[-96.56545,35.38382],[-96.56497,35.38381],[-96.56341,35.38372],[-96.56213,35.38363],[-96.5607,35.38351],[-96.55926,35.38335],[-96.55839,35.38325],[-96.5573,35.38312],[-96.55625,35.38297],[-96.55506,35.38279],[-96.5545,35.3827],[-96.55381,35.38258],[-96.5526,35.38236],[-96.55199,35.38224],[-96.55133,35.3821],[-96.55056,35.38194],[-96.54982,35.38178],[-96.5493,35.38166],[-96.54822,35.38142],[-96.54719,35.38121],[-96.54551,35.38091],[-96.54429,35.38073],[-96.54325,35.38059],[-96.5422,35.38047],[-96.54087,35.38035],[-96.53974,35.38027],[-96.53894,35.38022],[-96.53817,35.38019],[-96.53715,35.38017],[-96.53561,35.38017],[-96.53476,35.38018],[-96.53404,35.38019],[-96.53323,35.38023],[-96.53211,35.3803],[-96.53139,35.38035],[-96.53072,35.38041],[-96.52985,35.3805],[-96.52893,35.3806],[-96.52809,35.38072],[-96.52677,35.38092],[-96.52553,35.38112],[-96.52448,35.3813],[-96.52335,35.38149],[-96.5211,35.38187],[-96.51764,35.38245],[-96.51467,35.38295],[-96.5117,35.38345],[-96.50881,35.38394],[-96.50599,35.3844],[-96.50476,35.3846],[-96.50323,35.38483],[-96.50249,35.38493],[-96.5014,35.38505],[-96.50057,35.38513],[-96.49991,35.38519],[-96.49908,35.38525],[-96.49847,35.38528],[-96.49802,35.38531],[-96.49762,35.38532],[-96.49694,35.38534],[-96.49593,35.38536],[-96.4949,35.38536],[-96.4934,35.38534],[-96.49215,35.38528],[-96.49116,35.38522],[-96.48727,35.38496],[-96.48342,35.38471],[-96.48121,35.38462],[-96.479,35.38457],[-96.47765,35.38456],[-96.47681,35.38456],[-96.47589,35.38457],[-96.47416,35.3846],[-96.47249,35.38466],[-96.47081,35.38474],[-96.46872,35.38488],[-96.46764,35.38496],[-96.46656,35.38505],[-96.46504,35.3852],[-96.46409,35.38531],[-96.46315,35.38542],[-96.45593,35.38643],[-96.4549,35.38659],[-96.45349,35.38679],[-96.45278,35.38688],[-96.45205,35.38697],[-96.45126,35.38704],[-96.45052,35.3871],[-96.44956,35.38717],[-96.44877,35.3872],[-96.44785,35.38723],[-96.44718,35.38725],[-96.4465,35.38725],[-96.44552,35.38723],[-96.44456,35.3872],[-96.44385,35.38716],[-96.44276,35.38709],[-96.44173,35.387],[-96.44062,35.3869],[-96.43854,35.38672],[-96.43741,35.38662],[-96.43374,35.38629],[-96.43289,35.38621],[-96.43054,35.386],[-96.42988,35.38595],[-96.42924,35.38592],[-96.42836,35.38588],[-96.42757,35.38588],[-96.42655,35.38588],[-96.42589,35.38591],[-96.42497,35.38595],[-96.42401,35.38603],[-96.42356,35.38607],[-96.4227,35.38616],[-96.42198,35.38626],[-96.42143,35.38634],[-96.4208,35.38644],[-96.4198,35.38662],[-96.41906,35.38678],[-96.41832,35.38695],[-96.41751,35.38716],[-96.41673,35.38737],[-96.4162,35.38753],[-96.41555,35.38773],[-96.4148,35.38798],[-96.41378,35.38836],[-96.41315,35.38861],[-96.41262,35.38883],[-96.40821,35.39078],[-96.4063,35.39164],[-96.40539,35.39205],[-96.40226,35.39344],[-96.39723,35.39569],[-96.39632,35.39608],[-96.39493,35.39671],[-96.39391,35.39716],[-96.39285,35.39763],[-96.39121,35.39835],[-96.39037,35.39871],[-96.38936,35.39912],[-96.38788,35.39968],[-96.38663,35.40012],[-96.38516,35.40061],[-96.38411,35.40094],[-96.38335,35.40115],[-96.38257,35.40137],[-96.38159,35.40163],[-96.38046,35.40191],[-96.37924,35.40219],[-96.37809,35.40244],[-96.37612,35.40289],[-96.37307,35.40358],[-96.37256,35.40369],[-96.37093,35.40406],[-96.36937,35.40442],[-96.36882,35.40455],[-96.36816,35.40471],[-96.36748,35.40488],[-96.367,35.405],[-96.3663,35.40518],[-96.36544,35.40541],[-96.36451,35.40565],[-96.36359,35.4059],[-96.36286,35.4061],[-96.36241,35.40623],[-96.36165,35.40644],[-96.36062,35.40675],[-96.35943,35.4071],[-96.35896,35.40724],[-96.35833,35.40744],[-96.3568,35.40792],[-96.35535,35.40839],[-96.35393,35.40887],[-96.35294,35.40919],[-96.35085,35.40991],[-96.3499,35.41023],[-96.348,35.41088],[-96.34625,35.41147],[-96.34497,35.41189],[-96.34273,35.41266],[-96.34103,35.41324],[-96.33981,35.41365],[-96.33913,35.41388],[-96.33859,35.41406],[-96.33787,35.41427],[-96.33738,35.41441],[-96.33651,35.41464],[-96.33566,35.41484],[-96.33511,35.41496],[-96.3345,35.41509],[-96.33374,35.41523],[-96.33283,35.41539],[-96.33198,35.41551],[-96.33145,35.41558],[-96.33116,35.41561],[-96.33029,35.4157],[-96.32973,35.41576],[-96.32896,35.41581],[-96.32834,35.41585],[-96.32721,35.41589],[-96.32602,35.41592],[-96.32508,35.41596],[-96.32431,35.41601],[-96.32336,35.41611],[-96.32234,35.41624],[-96.32131,35.4164],[-96.32042,35.41657],[-96.31968,35.41674],[-96.31888,35.41694],[-96.31822,35.41711],[-96.31763,35.41728],[-96.31726,35.41739],[-96.3165,35.41765],[-96.31511,35.41818],[-96.31452,35.41843],[-96.31395,35.41869],[-96.31253,35.41935],[-96.31182,35.41967],[-96.31128,35.4199],[-96.31072,35.42013],[-96.31024,35.4203],[-96.3097,35.4205],[-96.30916,35.42067],[-96.30809,35.421],[-96.30736,35.4212],[-96.30671,35.42136],[-96.30565,35.42158],[-96.30515,35.42168],[-96.30396,35.42187],[-96.30295,35.42199],[-96.30234,35.42205],[-96.30178,35.42209],[-96.29989,35.42219],[-96.29951,35.4222],[-96.29521,35.42231],[-96.29316,35.42237],[-96.29132,35.42241],[-96.28951,35.42247],[-96.28827,35.42251],[-96.28734,35.42254],[-96.28619,35.42261],[-96.28526,35.42268],[-96.2841,35.42278],[-96.28313,35.42287],[-96.28225,35.42297],[-96.28097,35.42314],[-96.28001,35.42328],[-96.27901,35.42345],[-96.27784,35.42366],[-96.27672,35.42388],[-96.275,35.42425],[-96.27361,35.42455],[-96.27323,35.42464],[-96.26776,35.42582],[-96.26658,35.42607],[-96.26546,35.42629],[-96.26456,35.42646],[-96.26422,35.42652],[-96.26347,35.42665],[-96.26284,35.42675],[-96.26145,35.42699],[-96.26056,35.42713],[-96.25964,35.42727],[-96.25821,35.42746],[-96.25712,35.42759],[-96.25595,35.42772],[-96.25486,35.42783],[-96.25358,35.42794],[-96.25174,35.42808],[-96.25106,35.42813],[-96.25,35.42819],[-96.24833,35.42829],[-96.24705,35.42833],[-96.2467,35.42833],[-96.24493,35.42836],[-96.24371,35.42836],[-96.24261,35.42836],[-96.2414,35.42835],[-96.24018,35.42831],[-96.23775,35.42824],[-96.23289,35.42811],[-96.22715,35.42795],[-96.22369,35.42785],[-96.2224,35.42782],[-96.221,35.42782],[-96.21991,35.42784],[-96.21902,35.42786],[-96.21823,35.4279],[-96.2176,35.42793],[-96.21668,35.42799],[-96.21634,35.42801],[-96.21526,35.4281],[-96.21437,35.42819],[-96.21312,35.42832],[-96.21171,35.42851],[-96.21147,35.42854],[-96.21035,35.42869],[-96.20966,35.42878],[-96.2081,35.42897],[-96.20703,35.42912],[-96.2056,35.4293],[-96.20458,35.42943],[-96.20324,35.42961],[-96.20212,35.42975],[-96.20116,35.42986],[-96.20009,35.42996],[-96.19938,35.43003],[-96.19873,35.43008],[-96.19777,35.43014],[-96.19641,35.4302],[-96.19566,35.43023],[-96.1944,35.43027],[-96.19377,35.43026],[-96.19238,35.43025],[-96.19122,35.43021],[-96.19021,35.43017],[-96.1893,35.43011],[-96.18789,35.43],[-96.1872,35.42992],[-96.18639,35.42981],[-96.18556,35.42971],[-96.18433,35.42953],[-96.1833,35.42935],[-96.18227,35.42919],[-96.18131,35.42902],[-96.1805,35.42887],[-96.17921,35.42867],[-96.17802,35.42851],[-96.17686,35.42836],[-96.17605,35.42827],[-96.17506,35.42818],[-96.1734,35.42805],[-96.17235,35.428],[-96.17157,35.42796],[-96.17081,35.42792],[-96.17002,35.42789],[-96.16839,35.42779],[-96.16661,35.42771],[-96.1649,35.42762],[-96.16311,35.42752],[-96.16249,35.42749],[-96.16078,35.42743],[-96.15942,35.42741],[-96.1582,35.42742],[-96.1568,35.42745],[-96.15584,35.42749],[-96.15493,35.42753],[-96.15404,35.42759],[-96.15341,35.42764],[-96.15228,35.42774],[-96.15097,35.42788],[-96.14992,35.42801],[-96.14875,35.42817],[-96.14769,35.42834],[-96.14668,35.42851],[-96.14575,35.42867],[-96.14488,35.42882],[-96.14474,35.42885],[-96.14371,35.42903],[-96.14144,35.42941],[-96.13927,35.42978],[-96.13522,35.43048],[-96.13446,35.43062],[-96.13364,35.43075],[-96.1325,35.43095],[-96.13138,35.43112],[-96.13051,35.43123],[-96.12963,35.43133],[-96.12901,35.4314],[-96.12817,35.43147],[-96.12757,35.43152],[-96.12648,35.43159],[-96.12572,35.43162],[-96.125,35.43164],[-96.12417,35.43167],[-96.12333,35.43167],[-96.12295,35.43167],[-96.12152,35.43164],[-96.12069,35.43162],[-96.11985,35.43157],[-96.11873,35.43149],[-96.1171,35.43133],[-96.11576,35.43118],[-96.11499,35.43107],[-96.11411,35.43094],[-96.11306,35.43077],[-96.11185,35.43054],[-96.10888,35.42996],[-96.10763,35.42972],[-96.10552,35.42932],[-96.10156,35.42856],[-96.10042,35.42836],[-96.09967,35.42824],[-96.09827,35.42804],[-96.09755,35.42796],[-96.0966,35.42786],[-96.09551,35.42776],[-96.09433,35.42767],[-96.09275,35.42759],[-96.09223,35.42758],[-96.09162,35.42757],[-96.08781,35.42754],[-96.08746,35.42754],[-96.08165,35.4275],[-96.07244,35.42746],[-96.07078,35.42744],[-96.06917,35.42744],[-96.06811,35.42743],[-96.06715,35.42745],[-96.06635,35.42747],[-96.06558,35.42749],[-96.06471,35.42753],[-96.06386,35.42759],[-96.06285,35.42766],[-96.06203,35.42773],[-96.06115,35.42782],[-96.05996,35.42795],[-96.05925,35.42804],[-96.05885,35.4281],[-96.05798,35.42822],[-96.05713,35.42835],[-96.0561,35.42853],[-96.05359,35.42901],[-96.05226,35.42926],[-96.05056,35.42958],[-96.04889,35.4299],[-96.04564,35.43052],[-96.04431,35.43077],[-96.04296,35.43103],[-96.04125,35.43137],[-96.03984,35.43162],[-96.03909,35.43174],[-96.03842,35.43184],[-96.03782,35.43192],[-96.03718,35.432],[-96.03629,35.43209],[-96.03565,35.43215],[-96.03497,35.43221],[-96.03398,35.43226],[-96.03312,35.4323],[-96.03219,35.43233],[-96.03111,35.43233],[-96.0282,35.43231],[-96.02585,35.43229],[-96.02476,35.43229],[-96.02366,35.43232],[-96.02256,35.43238],[-96.02118,35.43247],[-96.02026,35.43255],[-96.01926,35.43265],[-96.01841,35.43275],[-96.01748,35.43287],[-96.01716,35.43292],[-96.01659,35.433],[-96.01546,35.43318],[-96.01464,35.4333],[-96.01238,35.43364],[-96.01081,35.43382],[-96.01023,35.43387],[-96.00966,35.43392],[-96.00874,35.43396],[-96.00773,35.434],[-96.00706,35.43401],[-96.00594,35.43401],[-96.00492,35.43398],[-96.00383,35.43392],[-96.00274,35.43384],[-96.00128,35.43371],[-95.99981,35.43359],[-95.99808,35.43344],[-95.99424,35.4331],[-95.99365,35.43305],[-95.993,35.433],[-95.99236,35.43294],[-95.99116,35.43285],[-95.99023,35.4328],[-95.98873,35.43271],[-95.98795,35.43268],[-95.98611,35.43262],[-95.98552,35.43261],[-95.98536,35.43261],[-95.98461,35.4326],[-95.98306,35.43259],[-95.98169,35.43259],[-95.98113,35.43259],[-95.97876,35.43258],[-95.97824,35.43257],[-95.97726,35.43254],[-95.97606,35.43249],[-95.97511,35.43242],[-95.97464,35.43239],[-95.97419,35.43236],[-95.97345,35.43229],[-95.97265,35.43222],[-95.97185,35.43213],[-95.97129,35.43206],[-95.97046,35.43194],[-95.9664,35.43137],[-95.96521,35.43119],[-95.96071,35.43054],[-95.96011,35.43047],[-95.95952,35.43041],[-95.95931,35.43039],[-95.95872,35.43035],[-95.95805,35.43031],[-95.95748,35.43029],[-95.95642,35.43029],[-95.95576,35.4303],[-95.95522,35.43033],[-95.95448,35.43037],[-95.95406,35.43041],[-95.95331,35.43049],[-95.95261,35.43058],[-95.95222,35.43064],[-95.95183,35.43071],[-95.95101,35.43086],[-95.94963,35.43117],[-95.94871,35.43138],[-95.94769,35.43161],[-95.94666,35.43182],[-95.94537,35.43206],[-95.94481,35.43215],[-95.94403,35.43227],[-95.94314,35.43239],[-95.94236,35.43247],[-95.94138,35.43256],[-95.94059,35.43262],[-95.93981,35.43267],[-95.93911,35.4327],[-95.93838,35.43273],[-95.93766,35.43273],[-95.93681,35.43274],[-95.93549,35.43271],[-95.93466,35.43268],[-95.93374,35.43262],[-95.93305,35.43257],[-95.93224,35.4325],[-95.93136,35.4324],[-95.93037,35.43228],[-95.91925,35.43081],[-95.91563,35.43033],[-95.91517,35.43027],[-95.91084,35.4297],[-95.90995,35.4296],[-95.90925,35.42954],[-95.90863,35.42949],[-95.90807,35.42945],[-95.90744,35.42941],[-95.9069,35.42939],[-95.90603,35.42936],[-95.90518,35.42935],[-95.90399,35.42937],[-95.90335,35.42939],[-95.90272,35.42942],[-95.90192,35.42946],[-95.90127,35.42951],[-95.90022,35.42961],[-95.89966,35.42967],[-95.89913,35.42973],[-95.89838,35.42984],[-95.89769,35.42995],[-95.89713,35.43004],[-95.89286,35.4308],[-95.89207,35.43093],[-95.89127,35.43105],[-95.89055,35.43116],[-95.88968,35.43127],[-95.88886,35.43137],[-95.88818,35.43145],[-95.88655,35.43162],[-95.88561,35.4317],[-95.88449,35.43178],[-95.88247,35.43189],[-95.8816,35.43192],[-95.88059,35.43195],[-95.87982,35.43197],[-95.87875,35.43198],[-95.87744,35.43197],[-95.87553,35.43193],[-95.87534,35.43192],[-95.87254,35.43187],[-95.87127,35.43187],[-95.86954,35.4319],[-95.86775,35.43199],[-95.86624,35.43209],[-95.865,35.4322],[-95.86379,35.43232],[-95.86243,35.43247],[-95.86156,35.43255],[-95.86038,35.43262],[-95.85945,35.43267],[-95.85848,35.43271],[-95.85757,35.43272],[-95.85691,35.43273],[-95.8563,35.43272],[-95.85459,35.43268],[-95.85323,35.43262],[-95.85233,35.4326],[-95.85167,35.43261],[-95.85098,35.43263],[-95.85006,35.43269],[-95.84947,35.43275],[-95.84872,35.43284],[-95.84808,35.43293],[-95.84753,35.43303],[-95.84688,35.43316],[-95.84641,35.43327],[-95.84596,35.43338],[-95.84556,35.43349],[-95.84471,35.43373],[-95.84387,35.43397],[-95.84055,35.43493],[-95.84007,35.43507],[-95.83871,35.43547],[-95.83805,35.43565],[-95.83764,35.43576],[-95.83718,35.43587],[-95.83661,35.436],[-95.83599,35.43613],[-95.83533,35.43624],[-95.83472,35.43635],[-95.83409,35.43643],[-95.83353,35.4365],[-95.83309,35.43655],[-95.83239,35.43661],[-95.83191,35.43664],[-95.83054,35.4367],[-95.82961,35.4367],[-95.82885,35.43669],[-95.82785,35.43664],[-95.82702,35.43657],[-95.82608,35.43647],[-95.82529,35.43637],[-95.82447,35.43624],[-95.82333,35.43601],[-95.82224,35.43576],[-95.81884,35.43488],[-95.81624,35.43422],[-95.81356,35.43354],[-95.81281,35.43337],[-95.81196,35.4332],[-95.81149,35.43312],[-95.81085,35.43301],[-95.81001,35.43289],[-95.80945,35.43283],[-95.80894,35.43278],[-95.80813,35.43271],[-95.80744,35.43267],[-95.80687,35.43265],[-95.80631,35.43264],[-95.8055,35.43264],[-95.80495,35.43265],[-95.80442,35.43267],[-95.8037,35.4327],[-95.80314,35.43275],[-95.80246,35.4328],[-95.80189,35.43287],[-95.80134,35.43294],[-95.80065,35.43304],[-95.79996,35.43316],[-95.79922,35.4333],[-95.79878,35.4334],[-95.79802,35.43357],[-95.79734,35.43374],[-95.79664,35.43394],[-95.7961,35.4341],[-95.79537,35.43433],[-95.7946,35.43459],[-95.794,35.43483],[-95.79341,35.43506],[-95.79305,35.43522],[-95.79265,35.43539],[-95.79203,35.43568],[-95.79165,35.43586],[-95.79135,35.43601],[-95.79042,35.43649],[-95.78898,35.43726],[-95.78761,35.43797],[-95.78656,35.43852],[-95.78517,35.43925],[-95.78381,35.43996],[-95.78323,35.44025],[-95.78249,35.44058],[-95.78185,35.44086],[-95.78118,35.44111],[-95.78025,35.44144],[-95.77962,35.44165],[-95.77904,35.44182],[-95.77814,35.44207],[-95.77742,35.44226],[-95.77644,35.44255],[-95.77544,35.44286],[-95.77461,35.44314],[-95.77372,35.44346],[-95.77291,35.44377],[-95.77179,35.44421],[-95.76757,35.44589],[-95.76653,35.44629],[-95.76526,35.44673],[-95.76425,35.44706],[-95.76311,35.4474],[-95.7617,35.44779],[-95.76088,35.448],[-95.76001,35.44821],[-95.7594,35.44834],[-95.75855,35.44852],[-95.75768,35.44869],[-95.75638,35.44891],[-95.7555,35.44905],[-95.75413,35.44923],[-95.75333,35.44933],[-95.75286,35.44938],[-95.75216,35.44944],[-95.75144,35.4495],[-95.75074,35.44955],[-95.75003,35.44959],[-95.74892,35.44964],[-95.74607,35.44971],[-95.74321,35.44978],[-95.74035,35.44986],[-95.73754,35.44997],[-95.73639,35.45002],[-95.73327,35.45019],[-95.73201,35.45027],[-95.72981,35.45043],[-95.72761,35.45061],[-95.72415,35.45093],[-95.72241,35.45109],[-95.72178,35.45115],[-95.72064,35.45125],[-95.71964,35.45133],[-95.7189,35.45138],[-95.7181,35.45144],[-95.71656,35.45153],[-95.71621,35.45154],[-95.71504,35.4516],[-95.71387,35.45164],[-95.71198,35.45169],[-95.71137,35.4517],[-95.70972,35.45171],[-95.70835,35.45173],[-95.70664,35.45177],[-95.70577,35.4518],[-95.70489,35.45183],[-95.70261,35.45195],[-95.70147,35.45203],[-95.70036,35.4521],[-95.69909,35.45221],[-95.69776,35.45233],[-95.69606,35.4525],[-95.69361,35.45277],[-95.69054,35.45311],[-95.689,35.45328],[-95.68821,35.45335],[-95.68731,35.45344],[-95.68557,35.45359],[-95.68462,35.45367],[-95.68388,35.45372],[-95.68241,35.45382],[-95.6809,35.45391],[-95.67937,35.45399],[-95.67784,35.45406],[-95.6764,35.45411],[-95.67494,35.45415],[-95.67348,35.45417],[-95.67203,35.45418],[-95.66429,35.45418],[-95.66041,35.45417],[-95.65656,35.45417],[-95.65523,35.45419],[-95.65455,35.45421],[-95.65394,35.45423],[-95.65274,35.45429],[-95.65167,35.45436],[-95.65078,35.45442],[-95.64956,35.45452],[-95.64875,35.45459],[-95.64741,35.45474],[-95.64611,35.4549],[-95.64562,35.45496],[-95.64429,35.45515],[-95.64352,35.45528],[-95.64268,35.45541],[-95.64238,35.45547],[-95.64032,35.45585],[-95.6389,35.45615],[-95.63756,35.45645],[-95.63554,35.45691],[-95.63372,35.45732],[-95.63204,35.45771],[-95.63081,35.45798],[-95.62927,35.45833],[-95.62859,35.45847],[-95.62786,35.45861],[-95.62701,35.45876],[-95.62603,35.45892],[-95.62511,35.45905],[-95.62423,35.45915],[-95.62334,35.45926],[-95.62249,35.45934],[-95.62176,35.4594],[-95.62113,35.45944],[-95.62,35.4595],[-95.61864,35.45955],[-95.61759,35.45956],[-95.61629,35.45955],[-95.61517,35.45952],[-95.61429,35.45949],[-95.61339,35.45943],[-95.61258,35.45937],[-95.61151,35.45927],[-95.61017,35.45915],[-95.60862,35.459],[-95.59848,35.45804],[-95.59733,35.45793],[-95.59637,35.45783],[-95.59438,35.45764],[-95.59273,35.45749],[-95.58869,35.45711],[-95.58822,35.45708],[-95.5872,35.45701],[-95.58626,35.45694],[-95.58496,35.45689],[-95.58368,35.45684],[-95.5824,35.45683],[-95.57994,35.45683],[-95.57866,35.45686],[-95.57734,35.45691],[-95.57461,35.45705],[-95.57298,35.45715],[-95.57014,35.4573],[-95.56639,35.45751],[-95.56342,35.45767],[-95.56043,35.45783],[-95.55764,35.45798],[-95.55721,35.458],[-95.55555,35.4581],[-95.55396,35.45818],[-95.55337,35.45821],[-95.55145,35.45829],[-95.55024,35.45833],[-95.5493,35.45835],[-95.54783,35.45838],[-95.54541,35.45839],[-95.54433,35.45839],[-95.54293,35.45838],[-95.54048,35.45832],[-95.53989,35.45831],[-95.53807,35.45823],[-95.53553,35.45812],[-95.53471,35.45807],[-95.53389,35.45801],[-95.52989,35.45772],[-95.52903,35.45766],[-95.52813,35.45761],[-95.52785,35.45758],[-95.52656,35.4575],[-95.52536,35.45745],[-95.52409,35.45741],[-95.52283,35.4574],[-95.52223,35.45741],[-95.52132,35.45742],[-95.52037,35.45745],[-95.51937,35.45749],[-95.5184,35.45756],[-95.51728,35.45765],[-95.51459,35.45786],[-95.51295,35.45794],[-95.51166,35.45798],[-95.50997,35.45798],[-95.50907,35.45795],[-95.50813,35.45792],[-95.50703,35.45786],[-95.50583,35.45776],[-95.50475,35.45767],[-95.50395,35.45758],[-95.50294,35.45745],[-95.50125,35.4572],[-95.4996,35.45696],[-95.49869,35.45684],[-95.49757,35.45672],[-95.49672,35.45664],[-95.49579,35.45656],[-95.49437,35.45647],[-95.49374,35.45644],[-95.49301,35.45641],[-95.49176,35.45638],[-95.49022,35.45637],[-95.4788,35.45642],[-95.468,35.45648],[-95.46319,35.4565],[-95.46191,35.45652],[-95.46066,35.45655],[-95.45896,35.4566],[-95.45777,35.45664],[-95.45694,35.45668],[-95.45551,35.45674],[-95.45167,35.45693],[-95.44807,35.4571],[-95.44744,35.45713],[-95.44573,35.45722],[-95.44062,35.4574],[-95.43952,35.45741],[-95.43644,35.45747],[-95.43337,35.45747],[-95.43164,35.45747],[-95.42916,35.45742],[-95.42643,35.45735],[-95.42533,35.45731],[-95.42439,35.45727],[-95.42299,35.45721],[-95.42258,35.45719],[-95.42145,35.45714],[-95.42036,35.45708],[-95.41933,35.45702],[-95.41698,35.45687],[-95.41573,35.4568],[-95.41494,35.45676],[-95.41417,35.45671],[-95.41276,35.45663],[-95.41184,35.45657],[-95.41106,35.45652],[-95.4102,35.45647],[-95.40905,35.4564],[-95.40792,35.45634],[-95.40677,35.45627],[-95.40574,35.45622],[-95.40406,35.45616],[-95.40235,35.45612],[-95.40025,35.45611],[-95.39893,35.45612],[-95.39715,35.45616],[-95.39603,35.45619],[-95.39346,35.45632],[-95.39221,35.45641],[-95.39105,35.4565],[-95.3898,35.45661],[-95.38837,35.45675],[-95.38623,35.45696],[-95.38495,35.4571],[-95.38364,35.45723],[-95.38112,35.45749],[-95.38055,35.45755],[-95.3802,35.45759],[-95.37788,35.45783],[-95.3766,35.45796],[-95.37567,35.45805],[-95.37482,35.45815],[-95.37398,35.45823],[-95.3733,35.4583],[-95.37242,35.45841],[-95.37136,35.45856],[-95.37047,35.4587],[-95.36962,35.45885],[-95.36864,35.45903],[-95.36783,35.45919],[-95.36641,35.45951],[-95.36534,35.45978],[-95.36468,35.45996],[-95.36363,35.46026],[-95.36207,35.46073],[-95.36102,35.46108],[-95.36031,35.46134],[-95.35969,35.46157],[-95.35875,35.46195],[-95.35759,35.46242],[-95.35673,35.46279],[-95.354,35.46406],[-95.35327,35.46441],[-95.35149,35.46524],[-95.35062,35.46565],[-95.34989,35.46597],[-95.34923,35.46626],[-95.34848,35.46657],[-95.34762,35.46691],[-95.34688,35.4672],[-95.34591,35.46756],[-95.34496,35.46789],[-95.34377,35.46829],[-95.34255,35.46867],[-95.34176,35.4689],[-95.34103,35.46911],[-95.3403,35.46931],[-95.33945,35.46952],[-95.33836,35.46979],[-95.3371,35.47006],[-95.33636,35.47022],[-95.32925,35.47177],[-95.32768,35.47211],[-95.32734,35.47218],[-95.32623,35.47243],[-95.31338,35.47523],[-95.31208,35.47551],[-95.30817,35.47637],[-95.30669,35.47669],[-95.30662,35.47671],[-95.30592,35.47686],[-95.30031,35.47808],[-95.30008,35.47813],[-95.29932,35.47829],[-95.2976,35.47866],[-95.29686,35.47882],[-95.29547,35.47913],[-95.29436,35.47937],[-95.29313,35.47963],[-95.29196,35.47988],[-95.2905,35.48017],[-95.28893,35.48047],[-95.28809,35.48061],[-95.28728,35.48074],[-95.28615,35.48092],[-95.28477,35.48112],[-95.28345,35.4813],[-95.28175,35.48151],[-95.28058,35.48164],[-95.27941,35.48175],[-95.27786,35.48188],[-95.27659,35.48198],[-95.27614,35.48201],[-95.27436,35.48212],[-95.27402,35.48213],[-95.27266,35.48218],[-95.27137,35.48222],[-95.26922,35.48226],[-95.26378,35.48227],[-95.25598,35.4823],[-95.25404,35.4823],[-95.24667,35.48232],[-95.24593,35.48233],[-95.24262,35.48234],[-95.24084,35.48235],[-95.24046,35.48235],[-95.23884,35.48236],[-95.23799,35.48236],[-95.23701,35.48236],[-95.23604,35.48235],[-95.23521,35.48234],[-95.23445,35.48232],[-95.234,35.4823],[-95.23326,35.48227],[-95.23245,35.48222],[-95.23163,35.48217],[-95.23085,35.48212],[-95.23002,35.48205],[-95.22863,35.48193],[-95.2279,35.48185],[-95.22721,35.48178],[-95.22606,35.48164],[-95.22495,35.48152],[-95.22393,35.4814],[-95.22305,35.4813],[-95.22223,35.48122],[-95.2214,35.48116],[-95.22057,35.48112],[-95.21973,35.48109],[-95.21893,35.48109],[-95.21814,35.48109],[-95.21677,35.48112],[-95.21583,35.48117],[-95.21524,35.48122],[-95.21466,35.48127],[-95.21384,35.48135],[-95.21282,35.48148],[-95.21196,35.4816],[-95.21112,35.48174],[-95.21025,35.48191],[-95.20939,35.48209],[-95.20784,35.48242],[-95.20668,35.48267],[-95.20554,35.48292],[-95.20493,35.48305],[-95.20436,35.48317],[-95.20388,35.48328],[-95.2035,35.48336],[-95.20302,35.48346],[-95.20096,35.48391],[-95.19907,35.48432],[-95.19564,35.48506],[-95.18931,35.48644],[-95.18802,35.48671],[-95.187,35.48693],[-95.18616,35.48711],[-95.18533,35.48728],[-95.18458,35.4874],[-95.18375,35.48752],[-95.18271,35.48765],[-95.18209,35.48771],[-95.18117,35.48778],[-95.18031,35.48783],[-95.17951,35.48786],[-95.17854,35.48787],[-95.17753,35.48786],[-95.17633,35.48781],[-95.1757,35.48777],[-95.17509,35.48772],[-95.17432,35.48764],[-95.17367,35.48756],[-95.17308,35.48749],[-95.17247,35.48739],[-95.17208,35.48733],[-95.17163,35.48725],[-95.17076,35.48708],[-95.17007,35.48693],[-95.16835,35.48656],[-95.16695,35.48624],[-95.16505,35.48583],[-95.16131,35.48503],[-95.15949,35.48459],[-95.15732,35.48411],[-95.15624,35.48386],[-95.15515,35.48364],[-95.15366,35.48335],[-95.15301,35.48323],[-95.15232,35.48311],[-95.15111,35.48291],[-95.14985,35.48273],[-95.14913,35.48263],[-95.14787,35.48248],[-95.14664,35.48234],[-95.14517,35.48221],[-95.14311,35.48206],[-95.14115,35.48196],[-95.13965,35.48191],[-95.13622,35.48188],[-95.13223,35.48187],[-95.1237,35.48183],[-95.12003,35.48181],[-95.11866,35.48182],[-95.11769,35.48184],[-95.11683,35.48188],[-95.11596,35.48193],[-95.11524,35.48198],[-95.11477,35.48202],[-95.114,35.4821],[-95.11316,35.48219],[-95.11217,35.48233],[-95.11156,35.48243],[-95.11076,35.48256],[-95.11004,35.48269],[-95.10909,35.48288],[-95.10822,35.48307],[-95.10744,35.48326],[-95.1067,35.48345],[-95.10581,35.4837],[-95.10494,35.48395],[-95.10379,35.48432],[-95.10292,35.48462],[-95.10156,35.48512],[-95.10034,35.48559],[-95.09392,35.48798],[-95.09283,35.48837],[-95.09225,35.48856],[-95.0916,35.48877],[-95.09109,35.48891],[-95.09055,35.48904],[-95.08997,35.48917],[-95.08938,35.48929],[-95.08878,35.4894],[-95.08806,35.4895],[-95.08728,35.48958],[-95.08659,35.48964],[-95.08589,35.48967],[-95.08504,35.48968],[-95.08454,35.48968],[-95.08355,35.48963],[-95.0825,35.48954],[-95.08179,35.48945],[-95.08109,35.48934],[-95.08015,35.4892],[-95.07958,35.48912],[-95.07906,35.48907],[-95.07842,35.489],[-95.07749,35.48892],[-95.07686,35.48887],[-95.07616,35.48883],[-95.0756,35.48881],[-95.07508,35.48879],[-95.0746,35.48878],[-95.07388,35.48877],[-95.07313,35.48878],[-95.07193,35.48881],[-95.07116,35.48884],[-95.07056,35.48888],[-95.06999,35.48892],[-95.06943,35.48897],[-95.06891,35.48902],[-95.06847,35.48907],[-95.06783,35.48914],[-95.06702,35.48925],[-95.06641,35.48935],[-95.06579,35.48945],[-95.06464,35.48964],[-95.06327,35.48988],[-95.06159,35.49017],[-95.05888,35.49063],[-95.05774,35.49082],[-95.0569,35.49094],[-95.05629,35.49102],[-95.05553,35.49109],[-95.0547,35.49115],[-95.05393,35.49119],[-95.05301,35.49122],[-95.05225,35.49121],[-95.0514,35.49118],[-95.05066,35.49114],[-95.04995,35.49109],[-95.04928,35.49103],[-95.04871,35.49096],[-95.04797,35.49086],[-95.04714,35.49071],[-95.04623,35.49054],[-95.04528,35.49032],[-95.04438,35.49011],[-95.04368,35.48995],[-95.04305,35.48983],[-95.04232,35.4897],[-95.04163,35.48959],[-95.04086,35.48947],[-95.03998,35.48936],[-95.03904,35.48927],[-95.03838,35.48922],[-95.03771,35.48917],[-95.03694,35.48914],[-95.03614,35.48912],[-95.03545,35.48911],[-95.03459,35.48913],[-95.03378,35.48916],[-95.0331,35.4892],[-95.03244,35.48925],[-95.03175,35.4893],[-95.03103,35.48939],[-95.02905,35.48965],[-95.02707,35.48992],[-95.02626,35.49003],[-95.0254,35.49015],[-95.02298,35.4905],[-95.02162,35.49068],[-95.0209,35.49077],[-95.01999,35.4909],[-95.01858,35.49109],[-95.01738,35.49126],[-95.01635,35.49141],[-95.01583,35.49151],[-95.01531,35.4916],[-95.01435,35.49179],[-95.01362,35.49195],[-95.01302,35.49209],[-95.01243,35.49223],[-95.01188,35.49237],[-95.01119,35.49257],[-95.01051,35.49275],[-95.00996,35.49289],[-95.00951,35.49299],[-95.00906,35.49308],[-95.00871,35.49314],[-95.00815,35.4932],[-95.00763,35.49324],[-95.00716,35.49325],[-95.00667,35.49324],[-95.00623,35.49322],[-95.00572,35.49317],[-95.00524,35.49311],[-95.00474,35.49302],[-95.00427,35.49292],[-95.00371,35.49277],[-95.00319,35.49259],[-95.00265,35.49238],[-95.00208,35.49213],[-95.00127,35.49171],[-95.00046,35.4913],[-94.99999,35.49106],[-94.99957,35.49084],[-94.99918,35.49066],[-94.99877,35.49048],[-94.99826,35.49027],[-94.9977,35.49006],[-94.9972,35.48989],[-94.99634,35.48963],[-94.99586,35.48951],[-94.99535,35.4894],[-94.99477,35.48928],[-94.9942,35.48918],[-94.99322,35.48904],[-94.99276,35.48899],[-94.99225,35.48896],[-94.99147,35.48893],[-94.99075,35.48893],[-94.99006,35.48894],[-94.98956,35.48897],[-94.98879,35.48904],[-94.98769,35.48914],[-94.9862,35.48925],[-94.98555,35.48929],[-94.98502,35.48932],[-94.98453,35.48934],[-94.98413,35.48935],[-94.98348,35.48937],[-94.98231,35.48938],[-94.98123,35.48937],[-94.98016,35.48934],[-94.97905,35.48929],[-94.97878,35.48927],[-94.97754,35.4892],[-94.97692,35.48916],[-94.97639,35.48912],[-94.97569,35.48906],[-94.97488,35.48896],[-94.9741,35.48886],[-94.97347,35.48876],[-94.9731,35.4887],[-94.9726,35.48861],[-94.9719,35.48847],[-94.97112,35.48831],[-94.97034,35.48812],[-94.96932,35.48786],[-94.96845,35.4876],[-94.96738,35.48726],[-94.9668,35.48705],[-94.96627,35.48686],[-94.9653,35.48648],[-94.96463,35.48619],[-94.964,35.48591],[-94.96365,35.48575],[-94.96286,35.48537],[-94.9624,35.48513],[-94.96193,35.48488],[-94.96096,35.48432],[-94.96028,35.48393],[-94.95956,35.48347],[-94.95912,35.48317],[-94.95854,35.48277],[-94.95646,35.48131],[-94.95582,35.48086],[-94.95412,35.47967],[-94.95227,35.47836],[-94.94485,35.47316],[-94.94335,35.47211],[-94.93749,35.46801],[-94.93688,35.4676],[-94.93626,35.46719],[-94.9358,35.46688],[-94.93532,35.46658],[-94.93478,35.46623],[-94.93403,35.46577],[-94.93257,35.4649],[-94.93103,35.46404],[-94.93023,35.46362],[-94.9294,35.46318],[-94.92853,35.46274],[-94.92768,35.46232],[-94.92588,35.46148],[-94.92455,35.46089],[-94.92326,35.46036],[-94.92258,35.46009],[-94.92195,35.45983],[-94.92081,35.4594],[-94.92031,35.45922],[-94.9191,35.4588],[-94.91791,35.45839],[-94.9163,35.45788],[-94.91547,35.45763],[-94.91468,35.45741],[-94.91352,35.45708],[-94.912,35.45669],[-94.91103,35.45645],[-94.91001,35.45621],[-94.90869,35.45593],[-94.90739,35.45567],[-94.90605,35.45542],[-94.90486,35.45523],[-94.90427,35.45513],[-94.9037,35.45505],[-94.90264,35.4549],[-94.90157,35.45476],[-94.90092,35.45469],[-94.90025,35.45461],[-94.8988,35.45447],[-94.89808,35.45441],[-94.89736,35.45435],[-94.89625,35.45428],[-94.89481,35.4542],[-94.89408,35.45418],[-94.89332,35.45415],[-94.8904,35.45409],[-94.88924,35.45406],[-94.88833,35.45404],[-94.88761,35.45403],[-94.88537,35.45398],[-94.88486,35.45397],[-94.88175,35.4539],[-94.88065,35.45388],[-94.88034,35.45387],[-94.87826,35.45383],[-94.87667,35.45382],[-94.87508,35.45383],[-94.87352,35.45387],[-94.87205,35.45392],[-94.8707,35.45399],[-94.86956,35.45405],[-94.86738,35.4542],[-94.86628,35.4543],[-94.86528,35.45439],[-94.86432,35.45449],[-94.86247,35.45469],[-94.85862,35.45511],[-94.85685,35.4553],[-94.85626,35.45536],[-94.8552,35.45546],[-94.85433,35.45552],[-94.85355,35.45555],[-94.85267,35.45557],[-94.85178,35.45558],[-94.85086,35.45556],[-94.85011,35.45553],[-94.84961,35.4555],[-94.8491,35.45547],[-94.84839,35.45541],[-94.84765,35.45534],[-94.84719,35.45528],[-94.84681,35.45524],[-94.84601,35.45513],[-94.84521,35.455],[-94.84441,35.45485],[-94.84354,35.45468],[-94.84211,35.45436],[-94.84081,35.45406],[-94.8398,35.45382],[-94.83815,35.45344],[-94.83455,35.45261],[-94.83307,35.45227],[-94.83194,35.45199],[-94.83076,35.45173],[-94.82922,35.45139],[-94.82813,35.45113],[-94.82583,35.4506],[-94.8248,35.45035],[-94.82258,35.44985],[-94.82127,35.44955],[-94.82018,35.4493],[-94.81902,35.44906],[-94.81796,35.44886],[-94.81741,35.44877],[-94.81684,35.44867],[-94.8156,35.44849],[-94.8144,35.44834],[-94.81293,35.44819],[-94.81198,35.44812],[-94.81119,35.44807],[-94.81004,35.44802],[-94.80967,35.448],[-94.8093,35.44799],[-94.80795,35.44797],[-94.80575,35.44797],[-94.8053,35.44797],[-94.80199,35.44798],[-94.80106,35.44798],[-94.80057,35.44798],[-94.79974,35.44797],[-94.79908,35.44795],[-94.79879,35.44794],[-94.79835,35.44791],[-94.79782,35.44788],[-94.79707,35.44782],[-94.7966,35.44778],[-94.79616,35.44774],[-94.79562,35.44767],[-94.79493,35.44759],[-94.79392,35.44744],[-94.79305,35.44729],[-94.7922,35.44712],[-94.79145,35.44699],[-94.79092,35.4469],[-94.79029,35.44682],[-94.78972,35.44676],[-94.78909,35.44671],[-94.78828,35.44669],[-94.78777,35.44669],[-94.78701,35.44671],[-94.78618,35.44677],[-94.78532,35.44688],[-94.78467,35.44697],[-94.78417,35.44707],[-94.78349,35.44722],[-94.78275,35.44742],[-94.78201,35.44764],[-94.78092,35.44798],[-94.77987,35.44829],[-94.77947,35.44839],[-94.77874,35.44855],[-94.77785,35.44871],[-94.77733,35.44879],[-94.77672,35.44887],[-94.77591,35.44894],[-94.77498,35.44901],[-94.77346,35.44904],[-94.77173,35.44912],[-94.77059,35.44918],[-94.76956,35.44926],[-94.7669,35.44951],[-94.76463,35.44977],[-94.76411,35.44983],[-94.76285,35.44998],[-94.76155,35.45014],[-94.76063,35.45025],[-94.7587,35.45047],[-94.75833,35.45052],[-94.7578,35.45058],[-94.75714,35.45065],[-94.75666,35.45069],[-94.75613,35.45073],[-94.75565,35.45075],[-94.75522,35.45074],[-94.75486,35.45074],[-94.75423,35.4507],[-94.75373,35.45066],[-94.7533,35.45062],[-94.75278,35.45056],[-94.75232,35.45049],[-94.75166,35.45036],[-94.75096,35.4502],[-94.75041,35.45005],[-94.74999,35.44993],[-94.74925,35.44969],[-94.74875,35.4495],[-94.74821,35.44927],[-94.7478,35.44908],[-94.74741,35.4489],[-94.7468,35.44858],[-94.74613,35.44819],[-94.74569,35.44792],[-94.74534,35.44767],[-94.74353,35.44637],[-94.74135,35.44486],[-94.74042,35.44419],[-94.73983,35.44377],[-94.73907,35.44323],[-94.73792,35.44241],[-94.73724,35.44193],[-94.7362,35.4412],[-94.73548,35.4407],[-94.73331,35.43917],[-94.73096,35.43751],[-94.72945,35.43645],[-94.72871,35.43592],[-94.72749,35.43506],[-94.72712,35.4348],[-94.72616,35.43412],[-94.7254,35.43359],[-94.7247,35.43312],[-94.72345,35.43232],[-94.7222,35.43155],[-94.72089,35.4308],[-94.72006,35.43035],[-94.71881,35.42969],[-94.71801,35.42929],[-94.7148,35.42762],[-94.71378,35.42708],[-94.71266,35.42647],[-94.71007,35.42506],[-94.7091,35.42451],[-94.70881,35.42435],[-94.70724,35.42347],[-94.70578,35.42265],[-94.70426,35.4218],[-94.702,35.42054],[-94.70096,35.41994],[-94.69969,35.4192],[-94.6987,35.41862],[-94.69862,35.41858],[-94.69823,35.41835],[-94.69729,35.41777],[-94.69609,35.41706],[-94.69502,35.41639],[-94.69244,35.41477],[-94.69134,35.41409],[-94.68987,35.41318],[-94.68791,35.41196],[-94.68623,35.41094],[-94.68594,35.41077],[-94.6849,35.41014],[-94.68382,35.40949],[-94.68294,35.40897],[-94.67892,35.40661],[-94.67792,35.40602],[-94.67696,35.40545],[-94.67637,35.40511],[-94.67585,35.4048],[-94.67499,35.4043],[-94.67366,35.40353],[-94.67279,35.403],[-94.67223,35.40266],[-94.67097,35.40187],[-94.66836,35.40019],[-94.66667,35.39908],[-94.66556,35.39834],[-94.66509,35.39803],[-94.66438,35.39756],[-94.66378,35.39717],[-94.66294,35.39666],[-94.66253,35.39644],[-94.66183,35.39609],[-94.66139,35.39587],[-94.66089,35.39565],[-94.65957,35.39513],[-94.65889,35.39489],[-94.65795,35.39461],[-94.6573,35.39443],[-94.65647,35.39423],[-94.65563,35.39406],[-94.65515,35.39398],[-94.65439,35.39388],[-94.65365,35.39379],[-94.65268,35.39372],[-94.65213,35.39369],[-94.65159,35.39367],[-94.64991,35.39367],[-94.63782,35.39366],[-94.63767,35.39366],[-94.62276,35.39364],[-94.62222,35.39364],[-94.61837,35.39363],[-94.61677,35.39362],[-94.61535,35.39361],[-94.61364,35.39358],[-94.60596,35.3934],[-94.60335,35.39333],[-94.60226,35.39331],[-94.60119,35.39328],[-94.60067,35.39327],[-94.59795,35.39321],[-94.59757,35.3932],[-94.59377,35.3931],[-94.58451,35.39288],[-94.57804,35.39271],[-94.57712,35.39271],[-94.5764,35.39271],[-94.57547,35.39275],[-94.57482,35.39279],[-94.57425,35.39284],[-94.57343,35.39292],[-94.5729,35.39299],[-94.57234,35.39307],[-94.57186,35.39314],[-94.57129,35.39325],[-94.57045,35.39342],[-94.56978,35.39357],[-94.56917,35.39372],[-94.56856,35.39389],[-94.56774,35.39414],[-94.56715,35.39433],[-94.56658,35.39452],[-94.56376,35.39544],[-94.56336,35.39557],[-94.5625,35.39584],[-94.56167,35.39606],[-94.56073,35.39631],[-94.5597,35.39655],[-94.55889,35.39672],[-94.55766,35.39694],[-94.55673,35.39709],[-94.55561,35.39724],[-94.5542,35.39739],[-94.55252,35.3975],[-94.55112,35.39753],[-94.54893,35.39754],[-94.54849,35.39754],[-94.54675,35.39755],[-94.5459,35.39757],[-94.54506,35.39763],[-94.54397,35.39773],[-94.54314,35.39782],[-94.54244,35.39793],[-94.54176,35.39804],[-94.54086,35.39822],[-94.54017,35.39837],[-94.5396,35.3985],[-94.53903,35.39866],[-94.53834,35.39885],[-94.53755,35.3991],[-94.53643,35.39948],[-94.53559,35.39982],[-94.53457,35.40027],[-94.53405,35.40052],[-94.53342,35.40083],[-94.53272,35.4012],[-94.53207,35.40157],[-94.53101,35.40217],[-94.52957,35.40298],[-94.52866,35.40351],[-94.52751,35.40419],[-94.5262,35.40495],[-94.52539,35.4054],[-94.52398,35.40619],[-94.52288,35.40683],[-94.52202,35.40731],[-94.52086,35.40797],[-94.51997,35.40849],[-94.51882,35.40915],[-94.51728,35.41004],[-94.51611,35.41075],[-94.5148,35.41155],[-94.51359,35.41229],[-94.51228,35.41311],[-94.51056,35.41419],[-94.50896,35.41519],[-94.50747,35.41613],[-94.50666,35.41663],[-94.50572,35.41723],[-94.50487,35.41776],[-94.50397,35.41831],[-94.50332,35.41872],[-94.50279,35.41907],[-94.50213,35.41949],[-94.50119,35.42014],[-94.50049,35.42065],[-94.49943,35.42144],[-94.49862,35.4221],[-94.49799,35.42263],[-94.49726,35.42326],[-94.49676,35.42369],[-94.49595,35.42441],[-94.49492,35.42534],[-94.49391,35.42625],[-94.49281,35.42723],[-94.49149,35.4284],[-94.4907,35.42912],[-94.49011,35.42965],[-94.48951,35.43016],[-94.48892,35.43064],[-94.48831,35.43109],[-94.48767,35.43154],[-94.48707,35.43193],[-94.48642,35.43231],[-94.4858,35.43267],[-94.48543,35.43287],[-94.48516,35.43301],[-94.4845,35.43334],[-94.48395,35.43358],[-94.48338,35.43383],[-94.48265,35.43413],[-94.48204,35.43436],[-94.48143,35.43457],[-94.48069,35.4348],[-94.48,35.435],[-94.47946,35.43515],[-94.47839,35.43545],[-94.47775,35.43563],[-94.47613,35.43607],[-94.4701,35.43775],[-94.46907,35.43806],[-94.46837,35.43827],[-94.4677,35.43851],[-94.46701,35.43877],[-94.46635,35.43904],[-94.46568,35.43933],[-94.46509,35.4396],[-94.46448,35.4399],[-94.46393,35.4402],[-94.46324,35.44058],[-94.46234,35.44112],[-94.46165,35.44157],[-94.46095,35.44207],[-94.46038,35.44248],[-94.45976,35.44298],[-94.45922,35.44341],[-94.45874,35.44379],[-94.45826,35.44413],[-94.45779,35.44446],[-94.45727,35.4448],[-94.45672,35.44513],[-94.45625,35.44539],[-94.45574,35.44565],[-94.45519,35.44591],[-94.45468,35.44614],[-94.45401,35.44642],[-94.45346,35.44663],[-94.45295,35.4468],[-94.45229,35.44701],[-94.45166,35.44719],[-94.45075,35.44742],[-94.44848,35.44799],[-94.44777,35.44816],[-94.44711,35.44835],[-94.4465,35.44855],[-94.44583,35.44879],[-94.44554,35.4489],[-94.44492,35.44918],[-94.44419,35.44952],[-94.44382,35.44971],[-94.44349,35.44989],[-94.44307,35.45014],[-94.44269,35.45037],[-94.44236,35.4506],[-94.44196,35.45088],[-94.44168,35.45109],[-94.44138,35.45131],[-94.44099,35.45163],[-94.44071,35.45187],[-94.4399,35.45265],[-94.43901,35.45348],[-94.43849,35.45398],[-94.43518,35.4571],[-94.43459,35.45762],[-94.43403,35.45806],[-94.43354,35.45842],[-94.43304,35.45876],[-94.43256,35.45905],[-94.43204,35.45937],[-94.43162,35.4596],[-94.43097,35.45992],[-94.43021,35.46027],[-94.42901,35.46075],[-94.42766,35.46115],[-94.42635,35.46149],[-94.4254,35.46166],[-94.42426,35.46181],[-94.42064,35.46209],[-94.41573,35.46246],[-94.41158,35.46278],[-94.41007,35.4629],[-94.40904,35.46292],[-94.40791,35.46281],[-94.40682,35.46256],[-94.40574,35.46216],[-94.40417,35.46133],[-94.4025,35.46046],[-94.40109,35.45994],[-94.39998,35.45961],[-94.39872,35.45933],[-94.39707,35.45914],[-94.39596,35.45906],[-94.39554,35.45908],[-94.39475,35.4591],[-94.39375,35.45919],[-94.39258,35.45937],[-94.39122,35.45968],[-94.38989,35.46011],[-94.389,35.46043],[-94.38796,35.46097],[-94.38718,35.4614],[-94.38556,35.46257],[-94.38422,35.46357],[-94.38309,35.46436],[-94.38221,35.46484],[-94.38092,35.46526],[-94.37994,35.46544],[-94.37882,35.46551],[-94.37761,35.46543],[-94.37312,35.46482],[-94.3655,35.46375],[-94.36043,35.46305],[-94.35702,35.46259],[-94.35612,35.46248],[-94.3527,35.46205],[-94.3515,35.46189],[-94.34284,35.46106],[-94.33813,35.4606],[-94.33673,35.46045],[-94.33545,35.46023],[-94.33343,35.45975],[-94.33224,35.45934],[-94.33102,35.45886],[-94.32755,35.45735],[-94.32668,35.45697],[-94.32443,35.45601],[-94.32362,35.45567],[-94.32272,35.45541],[-94.32167,35.45522],[-94.32099,35.45517],[-94.32048,35.45515],[-94.31994,35.45517],[-94.31957,35.45519],[-94.31911,35.45525],[-94.31834,35.45535],[-94.31785,35.45542],[-94.31595,35.45568],[-94.30986,35.45655],[-94.30322,35.45742],[-94.30188,35.45765],[-94.30033,35.45805],[-94.2992,35.45829],[-94.29785,35.45863],[-94.29598,35.4592],[-94.29151,35.4609],[-94.28823,35.46215],[-94.28569,35.46307],[-94.27906,35.46557],[-94.26922,35.46929],[-94.26252,35.47186],[-94.26024,35.4727],[-94.2588,35.47319],[-94.25708,35.47379],[-94.25513,35.47445],[-94.25426,35.4748],[-94.25323,35.47531],[-94.25245,35.47579],[-94.25099,35.47677],[-94.24861,35.47842],[-94.24782,35.47893],[-94.24666,35.47973],[-94.24525,35.48062],[-94.24228,35.48249],[-94.24029,35.48374],[-94.23738,35.48561],[-94.23688,35.4859],[-94.23632,35.48623],[-94.23524,35.48674],[-94.23413,35.48718],[-94.23283,35.48752],[-94.23174,35.48775],[-94.23108,35.48789],[-94.23078,35.48795],[-94.22845,35.48841],[-94.22646,35.48882],[-94.22568,35.48899],[-94.22476,35.48916],[-94.22384,35.48934],[-94.2211,35.48987],[-94.20729,35.49255],[-94.20613,35.49272],[-94.20491,35.49284],[-94.2039,35.49288],[-94.2029,35.49287],[-94.20183,35.49282],[-94.20003,35.49269],[-94.19831,35.49247],[-94.18989,35.49151],[-94.18876,35.49142],[-94.18778,35.49136],[-94.1865,35.49135],[-94.18512,35.4914],[-94.1839,35.49154],[-94.18256,35.49175],[-94.18137,35.492],[-94.18018,35.49233],[-94.17912,35.49267],[-94.17731,35.49339],[-94.17281,35.49527],[-94.17187,35.4956],[-94.17104,35.49586],[-94.17035,35.49606],[-94.16917,35.49634],[-94.16854,35.49646],[-94.16754,35.49661],[-94.16629,35.49675],[-94.16153,35.49713],[-94.1588,35.49736],[-94.15769,35.49747],[-94.15648,35.49764],[-94.15536,35.49786],[-94.15393,35.49823],[-94.15279,35.4986],[-94.15159,35.49905],[-94.14989,35.49988],[-94.14674,35.50149],[-94.14244,35.50368],[-94.14112,35.50434],[-94.13994,35.50488],[-94.1393,35.50516],[-94.13814,35.50563],[-94.13603,35.50647],[-94.13122,35.50836],[-94.12713,35.50998],[-94.12386,35.51127],[-94.11972,35.51291],[-94.11908,35.51317],[-94.11645,35.51421],[-94.11016,35.51669],[-94.10741,35.51779],[-94.10629,35.51829],[-94.10446,35.51916],[-94.10342,35.51964],[-94.10213,35.52023],[-94.10014,35.52109],[-94.09888,35.52157],[-94.09746,35.5221],[-94.09638,35.52247],[-94.09515,35.52287],[-94.09369,35.52332],[-94.0919,35.5238],[-94.0896,35.52435],[-94.08794,35.52473],[-94.08269,35.52593],[-94.07605,35.52746],[-94.07479,35.52774],[-94.07352,35.52801],[-94.07281,35.52812],[-94.07196,35.52823],[-94.07098,35.5283],[-94.06999,35.52833],[-94.06855,35.52832],[-94.06453,35.52825],[-94.05709,35.52815],[-94.0525,35.52807],[-94.04149,35.5279],[-94.03816,35.52786],[-94.03624,35.52783],[-94.03158,35.52775],[-94.01681,35.52754],[-94.01623,35.52753],[-94.01049,35.52744],[-94.00976,35.52742],[-94.00884,35.52736],[-94.00756,35.52727],[-94.00599,35.5271],[-94.0001,35.52649],[-93.98999,35.52543],[-93.98938,35.52536],[-93.98864,35.5253],[-93.98769,35.52528],[-93.98701,35.5253],[-93.98614,35.52537],[-93.98544,35.52546],[-93.98491,35.52555],[-93.98433,35.52567],[-93.98373,35.52582],[-93.98297,35.52606],[-93.98174,35.52652],[-93.97525,35.52922],[-93.97426,35.52959],[-93.97332,35.52989],[-93.97242,35.53014],[-93.97165,35.53035],[-93.9709,35.53052],[-93.9703,35.53063],[-93.96942,35.53079],[-93.9683,35.53094],[-93.96744,35.53103],[-93.96678,35.53108],[-93.96643,35.53111],[-93.96531,35.53114],[-93.96468,35.53115],[-93.9633,35.5311],[-93.96237,35.53105],[-93.96164,35.53097],[-93.96092,35.53089],[-93.95747,35.53035],[-93.95684,35.53026],[-93.95636,35.5302],[-93.95568,35.53015],[-93.95518,35.53013],[-93.95457,35.53013],[-93.95403,35.53015],[-93.95347,35.53019],[-93.95266,35.53028],[-93.95219,35.53036],[-93.95139,35.53051],[-93.94186,35.53269],[-93.94111,35.53285],[-93.94023,35.533],[-93.93968,35.53307],[-93.939,35.53314],[-93.93841,35.53318],[-93.93776,35.5332],[-93.93698,35.53319],[-93.93605,35.53315],[-93.93539,35.53309],[-93.93457,35.53299],[-93.93362,35.53283],[-93.93272,35.53262],[-93.93191,35.53239],[-93.9314,35.53223],[-93.93076,35.53201],[-93.9301,35.53175],[-93.92504,35.52942],[-93.92449,35.52915],[-93.92303,35.52849],[-93.92234,35.52821],[-93.92182,35.528],[-93.92071,35.5276],[-93.92,35.52737],[-93.91943,35.52721],[-93.91854,35.52697],[-93.91789,35.52682],[-93.91712,35.52665],[-93.91629,35.52649],[-93.9155,35.52636],[-93.91448,35.52624],[-93.91348,35.52614],[-93.91228,35.52605],[-93.91134,35.52604],[-93.91012,35.52605],[-93.90934,35.52608],[-93.90845,35.52614],[-93.90729,35.52625],[-93.90584,35.52646],[-93.90228,35.52706],[-93.89543,35.52821],[-93.89431,35.52839],[-93.89334,35.52855],[-93.89276,35.52861],[-93.89204,35.52866],[-93.89075,35.52869],[-93.8897,35.52862],[-93.889,35.52853],[-93.88836,35.52843],[-93.88777,35.52831],[-93.88682,35.52806],[-93.88583,35.52771],[-93.88513,35.52743],[-93.88399,35.52686],[-93.88284,35.52621],[-93.87931,35.52424],[-93.8763,35.52257],[-93.87574,35.52227],[-93.87519,35.52201],[-93.87457,35.52175],[-93.87382,35.52148],[-93.8727,35.52117],[-93.87181,35.52098],[-93.87099,35.52086],[-93.8702,35.52078],[-93.86967,35.52076],[-93.86912,35.52074],[-93.86856,35.52074],[-93.86565,35.52095],[-93.86458,35.52102],[-93.85981,35.52137],[-93.85467,35.52175],[-93.85389,35.52175],[-93.85346,35.52173],[-93.85297,35.52166],[-93.8523,35.52153],[-93.85174,35.52137],[-93.85116,35.52113],[-93.85052,35.52084],[-93.85007,35.52057],[-93.84946,35.52008],[-93.84797,35.51863],[-93.84733,35.51801],[-93.84661,35.51748],[-93.84569,35.51693],[-93.84463,35.51652],[-93.8435,35.51625],[-93.84276,35.51616],[-93.84183,35.51613],[-93.83896,35.51635],[-93.83821,35.51641],[-93.83609,35.51659],[-93.83007,35.51705],[-93.82908,35.51708],[-93.82802,35.51703],[-93.82667,35.51692],[-93.82569,35.51678],[-93.82474,35.51662],[-93.82383,35.51641],[-93.82268,35.5161],[-93.82176,35.5158],[-93.81777,35.5144],[-93.81417,35.51315],[-93.8125,35.51257],[-93.80882,35.51131],[-93.8077,35.51093],[-93.8057,35.51037],[-93.80279,35.50972],[-93.80239,35.50964],[-93.79865,35.50886],[-93.79378,35.50786],[-93.79128,35.50737],[-93.7897,35.50716],[-93.78841,35.50706],[-93.7853,35.50693],[-93.77818,35.50658],[-93.76757,35.50605],[-93.76624,35.50599],[-93.7637,35.50571],[-93.76155,35.50542],[-93.75398,35.50444],[-93.74516,35.50329],[-93.74231,35.50295],[-93.74099,35.50285],[-93.73969,35.50281],[-93.73875,35.50281],[-93.73182,35.50298],[-93.73028,35.50284],[-93.72989,35.50277],[-93.72948,35.50268],[-93.72854,35.50242],[-93.72628,35.50158],[-93.72425,35.50087],[-93.7222,35.50037],[-93.72036,35.50002],[-93.71788,35.49972],[-93.71578,35.49962],[-93.71404,35.49966],[-93.71047,35.49983],[-93.70825,35.49994],[-93.70549,35.5001],[-93.69908,35.50042],[-93.69157,35.50083],[-93.6874,35.50102],[-93.68317,35.50124],[-93.67994,35.50138],[-93.67858,35.5014],[-93.67713,35.50131],[-93.67609,35.50117],[-93.67494,35.50097],[-93.67389,35.50075],[-93.67274,35.50042],[-93.67207,35.50022],[-93.67172,35.50009],[-93.67109,35.49984],[-93.6704,35.4996],[-93.66955,35.49925],[-93.66912,35.49906],[-93.66706,35.49825],[-93.66583,35.4978],[-93.66493,35.49752],[-93.66392,35.49733],[-93.66317,35.49724],[-93.66277,35.4972],[-93.6623,35.49719],[-93.66201,35.4972],[-93.66073,35.49722],[-93.66027,35.49723],[-93.65954,35.49725],[-93.65704,35.49739],[-93.65424,35.49751],[-93.65198,35.49759],[-93.65035,35.49762],[-93.64798,35.49772],[-93.64442,35.49782],[-93.64291,35.49783],[-93.64238,35.49781],[-93.64124,35.49775],[-93.64038,35.49766],[-93.63933,35.4975],[-93.6376,35.49714],[-93.63648,35.49687],[-93.63518,35.49657],[-93.63452,35.49642],[-93.63229,35.49593],[-93.63053,35.49553],[-93.62926,35.49524],[-93.62726,35.49482],[-93.62606,35.49455],[-93.62566,35.49447],[-93.625,35.49436],[-93.62389,35.49416],[-93.62329,35.49409],[-93.62171,35.49388],[-93.62109,35.49379],[-93.61974,35.49361],[-93.61678,35.49324],[-93.61589,35.49311],[-93.61547,35.49306],[-93.61381,35.49286],[-93.61284,35.49272],[-93.61203,35.4926],[-93.60981,35.49233],[-93.60953,35.49229],[-93.60835,35.49211],[-93.60638,35.49188],[-93.60473,35.49167],[-93.60404,35.49159],[-93.60194,35.49131],[-93.60115,35.49118],[-93.60042,35.49102],[-93.5999,35.49092],[-93.59961,35.49084],[-93.59923,35.49074],[-93.59893,35.49066],[-93.5971,35.49004],[-93.59635,35.48975],[-93.59512,35.48917],[-93.59422,35.48869],[-93.59337,35.48824],[-93.59014,35.48642],[-93.58994,35.48631],[-93.58982,35.48624],[-93.58796,35.48536],[-93.58713,35.48503],[-93.58553,35.48447],[-93.5847,35.48423],[-93.58375,35.48394],[-93.58367,35.48392],[-93.58137,35.48345],[-93.57979,35.48322],[-93.57726,35.48285],[-93.57503,35.48252],[-93.57326,35.48226],[-93.57008,35.48181],[-93.56564,35.48118],[-93.56301,35.48081],[-93.56029,35.4804],[-93.55796,35.48004],[-93.55758,35.48],[-93.55603,35.47981],[-93.55461,35.47961],[-93.55447,35.47959],[-93.55361,35.47944],[-93.55289,35.47925],[-93.5522,35.47906],[-93.55168,35.47891],[-93.5506,35.47851],[-93.55033,35.4784],[-93.5501,35.47831],[-93.54885,35.47772],[-93.54641,35.4766],[-93.54595,35.47639],[-93.5453,35.47608],[-93.54346,35.47518],[-93.54258,35.47478],[-93.53662,35.47201],[-93.53372,35.47066],[-93.53184,35.46978],[-93.53136,35.46955],[-93.53118,35.46947],[-93.52766,35.46786],[-93.52443,35.46634],[-93.52216,35.46529],[-93.52169,35.46508],[-93.52131,35.46491],[-93.52024,35.46438],[-93.51793,35.46334],[-93.51726,35.46301],[-93.51705,35.46291],[-93.51497,35.46193],[-93.5134,35.46123],[-93.51262,35.46088],[-93.51221,35.46071],[-93.51104,35.46028],[-93.51015,35.46002],[-93.50937,35.45983],[-93.50817,35.45955],[-93.50716,35.4594],[-93.50652,35.45933],[-93.50602,35.45927],[-93.5053,35.45923],[-93.50434,35.4592],[-93.50206,35.45919],[-93.49746,35.45922],[-93.49663,35.45924],[-93.49602,35.45925],[-93.49269,35.45926],[-93.49011,35.45927],[-93.48894,35.45925],[-93.48862,35.45925],[-93.48837,35.45925],[-93.4876,35.45921],[-93.48662,35.45912],[-93.48604,35.45906],[-93.48442,35.45876],[-93.48337,35.45849],[-93.48308,35.45841],[-93.48246,35.45821],[-93.48212,35.45811],[-93.48138,35.45787],[-93.4798,35.45733],[-93.47857,35.45688],[-93.47642,35.45615],[-93.46915,35.45372],[-93.46785,35.45327],[-93.4659,35.45258],[-93.46556,35.45248],[-93.46473,35.4522],[-93.4637,35.45186],[-93.463,35.4516],[-93.4614,35.45107],[-93.46005,35.45061],[-93.45951,35.45046],[-93.4586,35.45025],[-93.45766,35.45003],[-93.45692,35.44989],[-93.45659,35.44984],[-93.45631,35.44979],[-93.45465,35.44955],[-93.45394,35.44949],[-93.4527,35.4494],[-93.45222,35.44936],[-93.45048,35.44934],[-93.44927,35.44938],[-93.44822,35.44944],[-93.44711,35.44954],[-93.44568,35.44973],[-93.44516,35.44982],[-93.4437,35.45011],[-93.44165,35.4506],[-93.44047,35.45081],[-93.43857,35.45122],[-93.43824,35.45128],[-93.43793,35.45132],[-93.43756,35.45138],[-93.4365,35.45146],[-93.43558,35.45146],[-93.43452,35.45138],[-93.43396,35.45131],[-93.4334,35.4512],[-93.43267,35.45103],[-93.43201,35.45083],[-93.43124,35.45055],[-93.43069,35.45029],[-93.43057,35.45023],[-93.43007,35.44998],[-93.42949,35.4496],[-93.4289,35.44919],[-93.42829,35.44869],[-93.42794,35.44836],[-93.42713,35.44751],[-93.42646,35.44685],[-93.42587,35.4462],[-93.42531,35.44561],[-93.42486,35.44515],[-93.42377,35.44397],[-93.42293,35.44305],[-93.42269,35.4428],[-93.42253,35.44264],[-93.42123,35.44127],[-93.421,35.44104],[-93.4202,35.44023],[-93.41981,35.4398],[-93.41943,35.43941],[-93.41934,35.43932],[-93.41895,35.43896],[-93.41857,35.43859],[-93.41816,35.43824],[-93.41729,35.43752],[-93.41679,35.4371],[-93.4166,35.43696],[-93.4163,35.43673],[-93.41493,35.43571],[-93.41487,35.43567],[-93.41347,35.43471],[-93.41289,35.4343],[-93.41055,35.43265],[-93.40821,35.43099],[-93.40561,35.42914],[-93.4034,35.4276],[-93.40255,35.42701],[-93.4007,35.42568],[-93.39634,35.42257],[-93.39562,35.42209],[-93.39469,35.42138],[-93.39413,35.42097],[-93.39359,35.42058],[-93.39263,35.41997],[-93.39066,35.41858],[-93.38719,35.4161],[-93.38623,35.41543],[-93.38563,35.41498],[-93.38531,35.41474],[-93.3846,35.41425],[-93.38393,35.41378],[-93.3836,35.41355],[-93.38294,35.41303],[-93.38261,35.41274],[-93.3823,35.41246],[-93.38199,35.41214],[-93.38176,35.41189],[-93.38151,35.41158],[-93.38084,35.41064],[-93.3805,35.41008],[-93.38014,35.40931],[-93.37985,35.40861],[-93.37975,35.40832],[-93.37969,35.40815],[-93.37958,35.40771],[-93.37945,35.40708],[-93.37933,35.40577],[-93.37926,35.40517],[-93.37921,35.40471],[-93.37913,35.404],[-93.37896,35.40277],[-93.37882,35.40187],[-93.37873,35.40102],[-93.37864,35.40052],[-93.37849,35.40004],[-93.3783,35.39956],[-93.37814,35.39921],[-93.37802,35.39893],[-93.37784,35.39867],[-93.37759,35.39828],[-93.3773,35.39798],[-93.37701,35.39767],[-93.37689,35.39754],[-93.37656,35.39723],[-93.37582,35.39672],[-93.3755,35.39653],[-93.37502,35.39627],[-93.374,35.39577],[-93.37208,35.39486],[-93.37011,35.39393],[-93.36737,35.39264],[-93.36632,35.39214],[-93.36571,35.39187],[-93.36439,35.39125],[-93.3633,35.39073],[-93.36245,35.39021],[-93.36203,35.38992],[-93.3617,35.38966],[-93.36122,35.38929],[-93.36074,35.38881],[-93.36029,35.38837],[-93.3601,35.38814],[-93.35916,35.387],[-93.35888,35.38664],[-93.35842,35.38607],[-93.35832,35.38593],[-93.35675,35.38403],[-93.35628,35.38345],[-93.35574,35.38279],[-93.35543,35.38239],[-93.35527,35.38217],[-93.35478,35.38156],[-93.35438,35.38107],[-93.35391,35.38048],[-93.35219,35.37839],[-93.35135,35.37732],[-93.34941,35.37495],[-93.34841,35.37374],[-93.34737,35.3724],[-93.34691,35.37182],[-93.34513,35.36967],[-93.34504,35.36956],[-93.34477,35.36922],[-93.34416,35.36849],[-93.34329,35.36743],[-93.34316,35.36727],[-93.34282,35.36677],[-93.34251,35.36638],[-93.34125,35.36482],[-93.34121,35.36477],[-93.34121,35.36477],[-93.34075,35.36414],[-93.34068,35.36404],[-93.3404,35.36363],[-93.34006,35.36302],[-93.33977,35.36242],[-93.3395,35.36181],[-93.33947,35.36173],[-93.33851,35.35919],[-93.33631,35.35337],[-93.33552,35.35127],[-93.33534,35.35083],[-93.33499,35.35027],[-93.33474,35.34991],[-93.33436,35.34945],[-93.33375,35.34886],[-93.33331,35.34852],[-93.33273,35.34816],[-93.3327,35.34814],[-93.33226,35.34789],[-93.33188,35.34773],[-93.33138,35.34754],[-93.33077,35.34733],[-93.32988,35.34708],[-93.3275,35.34647],[-93.32678,35.34629],[-93.32511,35.34586],[-93.32268,35.3452],[-93.32238,35.34512],[-93.32031,35.34459],[-93.31923,35.34428],[-93.3184,35.34395],[-93.3172,35.34346],[-93.31649,35.34312],[-93.3156,35.34265],[-93.31504,35.34236],[-93.3128,35.34122],[-93.31024,35.33993],[-93.30925,35.33946],[-93.30849,35.33917],[-93.30789,35.33895],[-93.30702,35.33865],[-93.3061,35.33839],[-93.30513,35.33818],[-93.30353,35.33783],[-93.30305,35.33774],[-93.30128,35.33739],[-93.29949,35.33704],[-93.29884,35.3369],[-93.2957,35.33627],[-93.29403,35.33593],[-93.29055,35.33542],[-93.28837,35.33523],[-93.28634,35.33515],[-93.28243,35.33523],[-93.27882,35.33538],[-93.27534,35.33551],[-93.27307,35.33559],[-93.26931,35.33575],[-93.26627,35.33586],[-93.26286,35.33598],[-93.25981,35.33609],[-93.25833,35.33617],[-93.25557,35.33625],[-93.25486,35.33625],[-93.25356,35.33621],[-93.25064,35.33606],[-93.24937,35.3359],[-93.24794,35.33572],[-93.24512,35.33521],[-93.24266,35.33459],[-93.23262,35.33139],[-93.22148,35.32789],[-93.21586,35.32612],[-93.21411,35.32564],[-93.2127,35.32531],[-93.21012,35.32482],[-93.20697,35.32429],[-93.20581,35.3241],[-93.20246,35.32357],[-93.19986,35.32313],[-93.19534,35.32234],[-93.19043,35.32151],[-93.1874,35.3211],[-93.18638,35.32097],[-93.1855,35.32085],[-93.18232,35.32059],[-93.18015,35.32047],[-93.17425,35.32025],[-93.17043,35.32008],[-93.16909,35.31991],[-93.16763,35.31957],[-93.16627,35.31905],[-93.16498,35.31842],[-93.16383,35.31762],[-93.16265,35.31658],[-93.16008,35.31411],[-93.15836,35.31253],[-93.15716,35.31153],[-93.15617,35.31093],[-93.15548,35.3106],[-93.15406,35.31005],[-93.15272,35.30966],[-93.15111,35.3092],[-93.14931,35.30876],[-93.14233,35.30692],[-93.13932,35.30613],[-93.13728,35.30554],[-93.13436,35.30453],[-93.13381,35.30431],[-93.13106,35.30307],[-93.12933,35.30214],[-93.12835,35.30154],[-93.1267,35.30045],[-93.12408,35.29869],[-93.12174,35.29713],[-93.11988,35.29589],[-93.11865,35.29509],[-93.118,35.29472],[-93.1171,35.29426],[-93.11657,35.294],[-93.11565,35.29361],[-93.11472,35.29327],[-93.11185,35.29234],[-93.10799,35.2911],[-93.10588,35.29041],[-93.1051,35.29013],[-93.10434,35.28982],[-93.10359,35.28949],[-93.10267,35.28901],[-93.10191,35.28858],[-93.0991,35.28676],[-93.09629,35.28494],[-93.09441,35.28372],[-93.09288,35.28272],[-93.0921,35.28222],[-93.08913,35.28028],[-93.08862,35.27998],[-93.08799,35.27963],[-93.08739,35.27932],[-93.08478,35.27802],[-93.07655,35.274],[-93.07516,35.27322],[-93.07398,35.27247],[-93.07283,35.27154],[-93.07196,35.27079],[-93.07124,35.27003],[-93.07038,35.26899],[-93.06958,35.26792],[-93.06939,35.26767],[-93.06818,35.26605],[-93.0667,35.26423],[-93.06594,35.26353],[-93.06535,35.26301],[-93.06463,35.2625],[-93.06404,35.26216],[-93.06352,35.26184],[-93.0621,35.26116],[-93.05877,35.26006],[-93.05695,35.25948],[-93.05553,35.25887],[-93.05295,35.25759],[-93.04893,35.2556],[-93.04827,35.25528],[-93.04038,35.25146],[-93.03931,35.25102],[-93.03787,35.25048],[-93.03579,35.24979],[-93.03475,35.24949],[-93.03368,35.24921],[-93.0326,35.24895],[-93.03155,35.24873],[-93.03028,35.2485],[-93.02855,35.24823],[-93.02629,35.24796],[-93.02523,35.2479],[-93.02263,35.24781],[-93.02013,35.24778],[-93.01675,35.24773],[-93.01134,35.24768],[-93.00986,35.24756],[-93.0093,35.2475],[-93.00846,35.2474],[-93.00645,35.24706],[-93.00026,35.24584],[-92.99804,35.24547],[-92.99621,35.24527],[-92.99414,35.24509],[-92.99101,35.24497],[-92.98698,35.24491],[-92.965,35.24457],[-92.95962,35.24444],[-92.95779,35.24443],[-92.95626,35.24451],[-92.95477,35.24468],[-92.95348,35.24493],[-92.95239,35.24522],[-92.9515,35.24547],[-92.95074,35.24575],[-92.9495,35.24623],[-92.94914,35.24637],[-92.94797,35.24692],[-92.94719,35.24733],[-92.94512,35.24868],[-92.9437,35.24969],[-92.94243,35.25053],[-92.94135,35.25117],[-92.94065,35.25152],[-92.93981,35.25191],[-92.93834,35.25244],[-92.93682,35.25283],[-92.93598,35.25299],[-92.93465,35.25317],[-92.93391,35.25319],[-92.93316,35.25319],[-92.93142,35.25314],[-92.9287,35.25304],[-92.92488,35.25288],[-92.9198,35.25265],[-92.91126,35.25225],[-92.90172,35.25181],[-92.89915,35.25169],[-92.89551,35.25152],[-92.89288,35.25128],[-92.89085,35.25096],[-92.88927,35.25067],[-92.88606,35.25008],[-92.88456,35.2498],[-92.87527,35.24806],[-92.87299,35.24765],[-92.87086,35.24727],[-92.86967,35.24695],[-92.86849,35.24657],[-92.86675,35.24593],[-92.86544,35.24528],[-92.86383,35.24436],[-92.85705,35.2393],[-92.85541,35.23808],[-92.85422,35.23719],[-92.8464,35.23137],[-92.8437,35.22934],[-92.84022,35.22677],[-92.83443,35.22245],[-92.83399,35.22212],[-92.83342,35.22163],[-92.83153,35.22021],[-92.83037,35.21934],[-92.8299,35.21899],[-92.82708,35.21688],[-92.82584,35.21604],[-92.82537,35.2157],[-92.82297,35.21391],[-92.82036,35.21197],[-92.81881,35.21079],[-92.81804,35.21018],[-92.81505,35.20775],[-92.80184,35.19701],[-92.80129,35.19659],[-92.80126,35.19658],[-92.80071,35.19621],[-92.80013,35.19585],[-92.79955,35.19554],[-92.79896,35.19525],[-92.79837,35.19498],[-92.79682,35.19437],[-92.79118,35.19226],[-92.7715,35.1849],[-92.7714,35.18486],[-92.7713,35.18483],[-92.75612,35.17915],[-92.75524,35.17882],[-92.75253,35.1778],[-92.749,35.17647],[-92.74846,35.17625],[-92.74617,35.17549],[-92.74579,35.17535],[-92.74575,35.17534],[-92.74466,35.17501],[-92.74379,35.1748],[-92.7432,35.17468],[-92.74254,35.17457],[-92.74191,35.17448],[-92.74067,35.17435],[-92.73955,35.1743],[-92.73876,35.17428],[-92.73794,35.17426],[-92.73583,35.17423],[-92.73527,35.17423],[-92.73516,35.17423],[-92.72696,35.17414],[-92.72385,35.17411],[-92.71958,35.17405],[-92.71836,35.17403],[-92.71291,35.17395],[-92.71126,35.17397],[-92.70763,35.17393],[-92.70755,35.17393],[-92.70689,35.17391],[-92.70622,35.17387],[-92.70589,35.17385],[-92.70524,35.17378],[-92.70458,35.1737],[-92.70334,35.17349],[-92.70242,35.17329],[-92.70121,35.17296],[-92.70032,35.17267],[-92.69915,35.17222],[-92.68781,35.1673],[-92.68507,35.16611],[-92.68073,35.16426],[-92.68001,35.16396],[-92.67897,35.16362],[-92.6782,35.1634],[-92.67734,35.16319],[-92.6764,35.16301],[-92.67574,35.1629],[-92.67474,35.16278],[-92.67407,35.16272],[-92.67339,35.16268],[-92.67109,35.16263],[-92.6648,35.1625],[-92.66022,35.16241],[-92.65877,35.1624],[-92.65733,35.16241],[-92.64822,35.16263],[-92.64721,35.16265],[-92.64632,35.16266],[-92.64172,35.16282],[-92.6408,35.16282],[-92.63641,35.16292],[-92.63454,35.16295],[-92.63392,35.16297],[-92.63296,35.16299],[-92.62997,35.16306],[-92.62951,35.16307],[-92.62519,35.16317],[-92.62412,35.16317],[-92.62376,35.16316],[-92.62304,35.16314],[-92.62125,35.16304],[-92.6188,35.1628],[-92.61219,35.16213],[-92.60792,35.16169],[-92.60128,35.16101],[-92.5903,35.15988],[-92.57721,35.15854],[-92.57404,35.15821],[-92.5727,35.15804],[-92.57104,35.15779],[-92.56973,35.15754],[-92.56812,35.15718],[-92.56757,35.15704],[-92.56718,35.15695],[-92.56638,35.15674],[-92.56495,35.15634],[-92.56101,35.15523],[-92.55804,35.15436],[-92.55131,35.15243],[-92.55035,35.15211],[-92.54877,35.15158],[-92.54804,35.15128],[-92.54714,35.1509],[-92.54613,35.15043],[-92.5447,35.14975],[-92.54105,35.14784],[-92.53502,35.14469],[-92.52535,35.13963],[-92.52496,35.13942],[-92.52415,35.13898],[-92.52329,35.13847],[-92.52247,35.13791],[-92.52195,35.13753],[-92.5212,35.13692],[-92.52049,35.13628],[-92.51964,35.13541],[-92.51546,35.13104],[-92.51435,35.12987],[-92.51142,35.1268],[-92.51094,35.12638],[-92.50972,35.12553],[-92.5088,35.12495],[-92.50791,35.12446],[-92.50607,35.12365],[-92.50414,35.12308],[-92.50171,35.12268],[-92.49969,35.12237],[-92.49829,35.12215],[-92.49226,35.12122],[-92.49048,35.12096],[-92.48892,35.12077],[-92.48746,35.12061],[-92.486,35.1205],[-92.48391,35.12034],[-92.48117,35.12017],[-92.47627,35.11986],[-92.47247,35.11962],[-92.46833,35.11936],[-92.46695,35.11926],[-92.46539,35.11917],[-92.46343,35.11905],[-92.45963,35.11879],[-92.45653,35.1186],[-92.45466,35.11847],[-92.45385,35.11842],[-92.45313,35.11833],[-92.4525,35.11823],[-92.45185,35.11804],[-92.45119,35.11779],[-92.4507,35.11755],[-92.45019,35.11726],[-92.44977,35.11693],[-92.44917,35.11646],[-92.44846,35.11587],[-92.44787,35.11537],[-92.44704,35.11469],[-92.44657,35.11434],[-92.44615,35.11408],[-92.44566,35.11386],[-92.44514,35.11364],[-92.44447,35.11342],[-92.44363,35.11326],[-92.44269,35.11313],[-92.44174,35.11304],[-92.43943,35.1128],[-92.43796,35.11263],[-92.43719,35.11248],[-92.43667,35.11232],[-92.43619,35.11216],[-92.4357,35.11192],[-92.4353,35.1117],[-92.43496,35.11149],[-92.4344,35.11107],[-92.43394,35.11063],[-92.43367,35.11031],[-92.4334,35.10992],[-92.43314,35.10946],[-92.43293,35.10901],[-92.43278,35.10847],[-92.43266,35.10782],[-92.43266,35.1073],[-92.43268,35.10649],[-92.43275,35.1041],[-92.43272,35.10355],[-92.43265,35.10298],[-92.43248,35.10224],[-92.43225,35.10167],[-92.43199,35.1011],[-92.43166,35.10054],[-92.43124,35.09992],[-92.43094,35.09956],[-92.43059,35.09919],[-92.42987,35.09846],[-92.42908,35.09771],[-92.42718,35.09584],[-92.42639,35.09506],[-92.42594,35.09462],[-92.42456,35.09325],[-92.42317,35.0919],[-92.4225,35.09125],[-92.42156,35.09032],[-92.42051,35.08928],[-92.41956,35.08836],[-92.41885,35.08763],[-92.41795,35.08675],[-92.41721,35.08604],[-92.41626,35.08511],[-92.41572,35.08458],[-92.41522,35.08402],[-92.41491,35.08361],[-92.41444,35.08283],[-92.41401,35.08187],[-92.41383,35.08107],[-92.41373,35.08047],[-92.41369,35.07998],[-92.41369,35.07944],[-92.41374,35.07886],[-92.41385,35.07829],[-92.41396,35.07782],[-92.41419,35.07717],[-92.41456,35.07642],[-92.41599,35.07364],[-92.41635,35.07294],[-92.41669,35.07219],[-92.41698,35.07148],[-92.41729,35.07064],[-92.41755,35.06974],[-92.41772,35.06907],[-92.41789,35.06816],[-92.41802,35.06736],[-92.4181,35.06659],[-92.41815,35.06528],[-92.41812,35.06436],[-92.4181,35.06395],[-92.41801,35.06307],[-92.41788,35.06221],[-92.41773,35.06143],[-92.41741,35.06023],[-92.41663,35.05768],[-92.41581,35.05488],[-92.41513,35.05253],[-92.41434,35.04993],[-92.41406,35.04893],[-92.41336,35.0465],[-92.41238,35.0432],[-92.41127,35.03931],[-92.41001,35.03503],[-92.4095,35.03338],[-92.40919,35.03231],[-92.40894,35.03034],[-92.40891,35.02917],[-92.40897,35.0283],[-92.40914,35.02684],[-92.4095,35.02459],[-92.4096,35.02382],[-92.40981,35.02246],[-92.40999,35.02118],[-92.41013,35.01945],[-92.41029,35.01666],[-92.41032,35.01357],[-92.41033,35.01126],[-92.41035,35.00984],[-92.41048,35.00835],[-92.41064,35.00702],[-92.41101,35.00536],[-92.41128,35.00419],[-92.41161,35.00314],[-92.4121,35.00172],[-92.41287,34.99969],[-92.41308,34.99909],[-92.4135,34.99792],[-92.41415,34.9963],[-92.4148,34.99443],[-92.41544,34.99207],[-92.41553,34.99177],[-92.41578,34.99095],[-92.41603,34.98988],[-92.41628,34.98866],[-92.41643,34.98777],[-92.41653,34.98687],[-92.41665,34.98564],[-92.41679,34.98344],[-92.41692,34.98183],[-92.41703,34.98007],[-92.41719,34.97855],[-92.41734,34.97732],[-92.41756,34.97611],[-92.41794,34.97465],[-92.41818,34.97367],[-92.41843,34.9729],[-92.419,34.97122],[-92.41971,34.96919],[-92.42031,34.96747],[-92.42045,34.96704],[-92.42094,34.96561],[-92.42123,34.96453],[-92.42183,34.96232],[-92.42209,34.96075],[-92.4223,34.95942],[-92.42248,34.95773],[-92.42247,34.95599],[-92.4226,34.95146],[-92.42267,34.94881],[-92.42279,34.94608],[-92.42279,34.94486],[-92.42269,34.94365],[-92.42252,34.94255],[-92.42221,34.9414],[-92.42181,34.94036],[-92.42135,34.93944],[-92.42114,34.93899],[-92.42067,34.93814],[-92.42002,34.93717],[-92.41932,34.93629],[-92.41877,34.93567],[-92.41829,34.93519],[-92.41747,34.9344],[-92.41617,34.93319],[-92.4145,34.93162],[-92.41419,34.93133],[-92.41382,34.93098],[-92.41295,34.93017],[-92.41218,34.92946],[-92.41133,34.92865],[-92.41108,34.92839],[-92.41082,34.92812],[-92.41054,34.9278],[-92.41027,34.92749],[-92.40992,34.92705],[-92.40961,34.92662],[-92.40937,34.92629],[-92.40917,34.92599],[-92.40899,34.92569],[-92.40879,34.92533],[-92.40859,34.92499],[-92.40841,34.92463],[-92.40821,34.92423],[-92.40808,34.92394],[-92.40788,34.92347],[-92.40779,34.92324],[-92.40768,34.92294],[-92.40753,34.9225],[-92.4074,34.92204],[-92.40702,34.92053],[-92.40652,34.91848],[-92.40627,34.91747],[-92.4052,34.91311],[-92.4043,34.90946],[-92.40414,34.90881],[-92.40393,34.90795],[-92.40265,34.90274],[-92.40244,34.90189],[-92.40234,34.90148],[-92.40232,34.9014],[-92.40222,34.901],[-92.40209,34.90046],[-92.4019,34.89971],[-92.40182,34.89935],[-92.40128,34.8972],[-92.40119,34.89689],[-92.40107,34.89658],[-92.40096,34.8963],[-92.40083,34.89603],[-92.40064,34.89567],[-92.40048,34.8954],[-92.40017,34.89495],[-92.39996,34.89467],[-92.39973,34.89439],[-92.39948,34.89413],[-92.39922,34.89387],[-92.3989,34.89358],[-92.39857,34.8933],[-92.39827,34.89308],[-92.39796,34.89286],[-92.39775,34.89273],[-92.39744,34.89254],[-92.39707,34.89234],[-92.39666,34.89214],[-92.39642,34.89203],[-92.39611,34.8919],[-92.39579,34.89179],[-92.39543,34.89167],[-92.39493,34.89152],[-92.39422,34.89135],[-92.39403,34.89131],[-92.39311,34.8911],[-92.39124,34.89067],[-92.39119,34.89066],[-92.38704,34.88972],[-92.38611,34.8895],[-92.38583,34.88943],[-92.3854,34.8893],[-92.38513,34.88921],[-92.3847,34.88906],[-92.38432,34.8889],[-92.38394,34.88873],[-92.38359,34.88854],[-92.38324,34.88835],[-92.38308,34.88825],[-92.38291,34.88814],[-92.3828,34.88807],[-92.38246,34.88783],[-92.38224,34.88767],[-92.38193,34.88742],[-92.38172,34.88724],[-92.38153,34.88706],[-92.3793,34.88485],[-92.37899,34.88455],[-92.37829,34.88386],[-92.37762,34.88317],[-92.37631,34.88191],[-92.37527,34.88088],[-92.37518,34.88079],[-92.37425,34.87986],[-92.37342,34.87901],[-92.37263,34.87814],[-92.37202,34.87741],[-92.37151,34.87677],[-92.37071,34.87571],[-92.36912,34.87354],[-92.36878,34.8731],[-92.36842,34.87267],[-92.36821,34.87244],[-92.36816,34.87239],[-92.36769,34.87189],[-92.36734,34.87153],[-92.36697,34.87119],[-92.36678,34.87102],[-92.36659,34.87086],[-92.36605,34.87042],[-92.36551,34.87001],[-92.36512,34.86973],[-92.36221,34.86772],[-92.35765,34.86458],[-92.35683,34.86402],[-92.35539,34.86303],[-92.35489,34.86267],[-92.3546,34.86244],[-92.35432,34.86221],[-92.35405,34.86197],[-92.35375,34.86168],[-92.35352,34.86144],[-92.35327,34.86116],[-92.35302,34.86083],[-92.35276,34.86049],[-92.35253,34.86013],[-92.35239,34.85989],[-92.35219,34.85953],[-92.35206,34.85928],[-92.3519,34.85891],[-92.35171,34.85841],[-92.35159,34.85802],[-92.35149,34.85763],[-92.35143,34.85737],[-92.35132,34.85668],[-92.35117,34.85527],[-92.35108,34.85446],[-92.35092,34.85283],[-92.35085,34.85222],[-92.35075,34.85139],[-92.35029,34.84739],[-92.35014,34.84611],[-92.35007,34.84546],[-92.34989,34.84397],[-92.34984,34.84353],[-92.34978,34.84304],[-92.34975,34.84275],[-92.34966,34.84199],[-92.34954,34.84125],[-92.3494,34.8405],[-92.34924,34.83971],[-92.3491,34.83914],[-92.34905,34.83892],[-92.34899,34.8387],[-92.34888,34.8383],[-92.34851,34.83691],[-92.34814,34.83562],[-92.34803,34.83523],[-92.34665,34.82996],[-92.34584,34.82704],[-92.34572,34.82661],[-92.34559,34.82615],[-92.34547,34.8258],[-92.34537,34.82557],[-92.34522,34.82523],[-92.34511,34.82505],[-92.34503,34.82491],[-92.3449,34.82469],[-92.34468,34.82438],[-92.34453,34.82417],[-92.34429,34.82387],[-92.34402,34.82358],[-92.34375,34.82332],[-92.34337,34.82299],[-92.34307,34.82275],[-92.34287,34.8226],[-92.34245,34.82233],[-92.34212,34.82214],[-92.34178,34.82197],[-92.3414,34.82179],[-92.34002,34.82118],[-92.33975,34.82107],[-92.33931,34.82088],[-92.3383,34.82044],[-92.33662,34.81971],[-92.33395,34.81853],[-92.33324,34.8182],[-92.33234,34.81781],[-92.33153,34.81747],[-92.33014,34.81686],[-92.32856,34.81617],[-92.32817,34.816],[-92.32753,34.81573],[-92.32697,34.81547],[-92.32634,34.81521],[-92.32566,34.81491],[-92.32507,34.81465],[-92.32443,34.81438],[-92.32392,34.81414],[-92.32303,34.81367],[-92.32265,34.81344],[-92.32235,34.81324],[-92.32191,34.81296],[-92.32117,34.8124],[-92.3204,34.81175],[-92.31982,34.81118],[-92.31932,34.81065],[-92.31874,34.80992],[-92.31869,34.80987],[-92.31865,34.80981],[-92.31849,34.80959],[-92.31585,34.80601],[-92.3153,34.80524],[-92.31461,34.80438],[-92.31372,34.8034],[-92.31307,34.8028],[-92.31231,34.80216],[-92.31143,34.80152],[-92.31094,34.80118],[-92.30996,34.80059],[-92.30918,34.80018],[-92.30861,34.7999],[-92.30783,34.79956],[-92.30733,34.79932],[-92.3057,34.79866],[-92.30395,34.79794],[-92.30297,34.79751],[-92.30249,34.79727],[-92.30183,34.79689],[-92.30143,34.7966],[-92.30079,34.79612],[-92.30029,34.79564],[-92.29988,34.79519],[-92.29966,34.79489],[-92.29946,34.79459],[-92.29842,34.79314],[-92.2977,34.7922],[-92.29722,34.79155],[-92.29615,34.79008],[-92.29585,34.78968],[-92.29565,34.78946],[-92.29552,34.78933],[-92.29544,34.78922],[-92.29534,34.78913],[-92.29516,34.78895],[-92.2949,34.78872],[-92.29468,34.78853],[-92.29446,34.78837],[-92.29422,34.7882],[-92.29386,34.78796],[-92.29355,34.78778],[-92.29329,34.78764],[-92.29298,34.78749],[-92.29265,34.78735],[-92.29233,34.78722],[-92.29225,34.78719],[-92.29206,34.78712],[-92.29173,34.78701],[-92.29152,34.78695],[-92.29128,34.78689],[-92.29117,34.78686],[-92.29088,34.7868],[-92.29046,34.78672],[-92.28988,34.78664],[-92.28942,34.78661],[-92.28904,34.78659],[-92.28818,34.78657],[-92.28756,34.78656],[-92.28438,34.7865],[-92.28324,34.78648],[-92.28279,34.78647],[-92.28221,34.78646],[-92.28184,34.78643],[-92.28147,34.7864],[-92.28119,34.78636],[-92.28096,34.78634],[-92.28076,34.78631],[-92.2805,34.78626],[-92.28026,34.78621],[-92.2797,34.78607],[-92.27923,34.78593],[-92.27881,34.78578],[-92.27842,34.78563],[-92.27797,34.78542],[-92.27772,34.7853],[-92.27743,34.78515],[-92.27697,34.78489],[-92.2766,34.78464],[-92.27607,34.78425],[-92.27497,34.78341],[-92.27472,34.78323],[-92.27449,34.78308],[-92.27433,34.78299],[-92.27405,34.78284],[-92.27377,34.7827],[-92.27352,34.78259],[-92.27333,34.78252],[-92.273,34.7824],[-92.27234,34.7822],[-92.26916,34.78162],[-92.2687,34.78155],[-92.26834,34.78147],[-92.26792,34.78137],[-92.26759,34.78128],[-92.26713,34.78113],[-92.2668,34.781],[-92.26641,34.78084],[-92.26563,34.78048],[-92.26545,34.78039],[-92.26522,34.78028],[-92.26508,34.7802],[-92.26482,34.78006],[-92.26433,34.77977],[-92.26399,34.77956],[-92.26368,34.77935],[-92.26348,34.77921],[-92.26335,34.7791],[-92.26316,34.77899],[-92.26279,34.77873],[-92.26262,34.77861],[-92.26241,34.77847],[-92.26225,34.77835],[-92.26204,34.77821],[-92.26182,34.77808],[-92.26158,34.77795],[-92.26137,34.77784],[-92.26108,34.77771],[-92.26076,34.7776],[-92.26045,34.77753],[-92.26014,34.77746],[-92.2598,34.7774],[-92.2596,34.77737],[-92.25938,34.77735],[-92.25927,34.77735],[-92.25906,34.77734],[-92.25853,34.77736],[-92.25792,34.77741],[-92.25746,34.77746],[-92.25699,34.77753],[-92.25645,34.77763],[-92.25407,34.77803],[-92.25359,34.77811],[-92.2533,34.77815],[-92.25304,34.77818],[-92.25276,34.77821],[-92.25252,34.77823],[-92.25227,34.77824],[-92.25223,34.77824],[-92.25184,34.77825],[-92.25138,34.77825],[-92.25114,34.77824],[-92.25067,34.77822],[-92.24606,34.77782],[-92.24194,34.77746],[-92.24088,34.77737],[-92.2391,34.77721],[-92.23625,34.77697],[-92.23426,34.77677],[-92.23363,34.77673],[-92.23285,34.77671],[-92.23255,34.77671],[-92.23214,34.77672],[-92.23179,34.77673],[-92.23108,34.77677],[-92.23082,34.77679],[-92.23069,34.7768],[-92.23016,34.77685],[-92.22978,34.77689],[-92.22937,34.77695],[-92.22866,34.77706],[-92.22826,34.77713],[-92.22781,34.77723],[-92.22649,34.77751],[-92.22285,34.77834],[-92.2226,34.7784],[-92.22189,34.77857],[-92.21848,34.77935],[-92.21844,34.77936],[-92.21808,34.77944],[-92.21776,34.7795],[-92.21737,34.77955],[-92.21691,34.77961],[-92.21625,34.77967],[-92.21608,34.77969],[-92.21555,34.77971],[-92.21513,34.77972],[-92.21473,34.77971],[-92.21431,34.7797],[-92.21407,34.77968],[-92.21393,34.77967],[-92.21271,34.77954],[-92.20995,34.7793],[-92.20827,34.77915],[-92.20756,34.7791],[-92.2039,34.77876],[-92.20282,34.77866],[-92.19756,34.77813],[-92.19724,34.77811],[-92.19526,34.77793],[-92.19502,34.77792],[-92.19396,34.77787],[-92.19327,34.77786],[-92.19279,34.77787],[-92.19208,34.7779],[-92.19163,34.77792],[-92.19114,34.77797],[-92.18586,34.77853],[-92.18326,34.77882],[-92.18123,34.77904],[-92.17103,34.78014],[-92.16274,34.78104],[-92.15719,34.78164],[-92.15314,34.78208],[-92.14911,34.78252],[-92.14871,34.78256],[-92.14645,34.78281],[-92.14192,34.7833],[-92.14014,34.7835],[-92.13683,34.78386],[-92.13446,34.78411],[-92.13377,34.78418],[-92.12854,34.78476],[-92.12449,34.78518],[-92.12088,34.78558],[-92.12005,34.78567],[-92.11869,34.78582],[-92.1178,34.78592],[-92.11445,34.78628],[-92.10982,34.78679],[-92.10768,34.78702],[-92.10266,34.78756],[-92.10216,34.78762],[-92.10074,34.78777],[-92.09638,34.78824],[-92.09103,34.78882],[-92.0888,34.78906],[-92.08428,34.78955],[-92.08168,34.78983],[-92.0791,34.79011],[-92.07737,34.79029],[-92.07653,34.79038],[-92.0755,34.79046],[-92.06318,34.79121],[-92.05652,34.79159],[-92.04721,34.79216],[-92.04562,34.79231],[-92.04469,34.79244],[-92.0437,34.79257],[-92.04201,34.79287],[-92.04065,34.79319],[-92.0397,34.79342],[-92.03867,34.79369],[-92.03542,34.79471],[-92.03337,34.79539],[-92.02598,34.79775],[-92.02468,34.79818],[-92.0219,34.79909],[-92.02044,34.7995],[-92.01961,34.79971],[-92.01721,34.80022],[-92.01487,34.80057],[-92.01229,34.80079],[-92.00311,34.80121],[-91.9998,34.80134],[-91.99575,34.80151],[-91.9937,34.8016],[-91.99153,34.80168],[-91.98954,34.80174],[-91.9867,34.80186],[-91.97857,34.80222],[-91.97641,34.80233],[-91.96816,34.80268],[-91.96589,34.80276],[-91.95495,34.80322],[-91.95138,34.80339],[-91.94919,34.80346],[-91.93307,34.80345],[-91.93208,34.80345],[-91.92318,34.80345],[-91.92068,34.80345],[-91.91606,34.80344],[-91.91329,34.80344],[-91.90866,34.80348],[-91.90844,34.80348],[-91.89951,34.80369],[-91.89844,34.80372],[-91.89365,34.80383],[-91.89257,34.80385],[-91.88738,34.80399],[-91.88594,34.80402],[-91.88322,34.80408],[-91.87735,34.80423],[-91.87392,34.8043],[-91.87034,34.80439],[-91.86853,34.80437],[-91.867,34.80431],[-91.86531,34.80418],[-91.86353,34.80397],[-91.86184,34.8037],[-91.85814,34.80303],[-91.8525,34.80199],[-91.85008,34.80154],[-91.84713,34.80099],[-91.84365,34.80036],[-91.84112,34.79989],[-91.83976,34.79971],[-91.83824,34.79952],[-91.83706,34.79943],[-91.83586,34.79936],[-91.83457,34.79933],[-91.83248,34.79931],[-91.82585,34.79931],[-91.824,34.79929],[-91.82033,34.79917],[-91.81367,34.79895],[-91.81171,34.79888],[-91.80733,34.79873],[-91.80287,34.79864],[-91.79501,34.79857],[-91.79312,34.79852],[-91.78799,34.79839],[-91.78242,34.79825],[-91.78214,34.79824],[-91.77505,34.79797],[-91.77245,34.79794],[-91.77019,34.79803],[-91.76822,34.79821],[-91.76341,34.79875],[-91.7563,34.79958],[-91.75414,34.79982],[-91.75325,34.79991],[-91.75251,34.80001],[-91.7514,34.80013],[-91.75042,34.80024],[-91.749,34.8004],[-91.74771,34.80056],[-91.746,34.80076],[-91.7447,34.8009],[-91.74263,34.80114],[-91.73426,34.80205],[-91.73154,34.80239],[-91.729,34.80258],[-91.72747,34.80264],[-91.72571,34.80264],[-91.71362,34.80231],[-91.70264,34.802],[-91.69871,34.8019],[-91.69798,34.80191],[-91.69712,34.80196],[-91.69519,34.80223],[-91.69323,34.80261],[-91.69084,34.80333],[-91.68798,34.80457],[-91.67637,34.80964],[-91.67235,34.81139],[-91.668,34.81328],[-91.66328,34.81536],[-91.66138,34.81619],[-91.66083,34.8164],[-91.66035,34.81658],[-91.66006,34.81668],[-91.65962,34.81682],[-91.65924,34.81694],[-91.65884,34.81706],[-91.65819,34.81722],[-91.65759,34.81735],[-91.65703,34.81748],[-91.6557,34.81766],[-91.65526,34.81772],[-91.65472,34.81777],[-91.65428,34.8178],[-91.6539,34.81782],[-91.65347,34.81783],[-91.6481,34.81787],[-91.64496,34.81789],[-91.64342,34.8179],[-91.64121,34.8179],[-91.63884,34.81792],[-91.63757,34.81793],[-91.63262,34.81797],[-91.63007,34.81798],[-91.62844,34.81799],[-91.6259,34.81798],[-91.62452,34.81801],[-91.62311,34.81802],[-91.62048,34.81803],[-91.61836,34.81804],[-91.61686,34.81805],[-91.61574,34.81806],[-91.61464,34.81806],[-91.60646,34.8181],[-91.60519,34.81811],[-91.60466,34.81813],[-91.60419,34.81815],[-91.60356,34.81817],[-91.60122,34.81829],[-91.59914,34.81838],[-91.59575,34.81854],[-91.59281,34.81869],[-91.58986,34.81883],[-91.58699,34.81898],[-91.58599,34.81903],[-91.58475,34.81907],[-91.58421,34.81908],[-91.58371,34.81908],[-91.58191,34.81906],[-91.57588,34.81901],[-91.5743,34.819],[-91.5726,34.81895],[-91.57062,34.81895],[-91.56889,34.81894],[-91.56663,34.81892],[-91.5655,34.8189],[-91.56345,34.81889],[-91.55871,34.81882],[-91.54615,34.81874],[-91.54569,34.81873],[-91.53762,34.81862],[-91.53198,34.81859],[-91.52851,34.81856],[-91.5242,34.81853],[-91.52332,34.81854],[-91.52255,34.81858],[-91.52179,34.81862],[-91.5212,34.81869],[-91.52055,34.81878],[-91.51985,34.81889],[-91.51926,34.819],[-91.51872,34.81912],[-91.518,34.81932],[-91.51677,34.8197],[-91.51362,34.82066],[-91.51252,34.82102],[-91.51046,34.82166],[-91.50767,34.82255],[-91.50013,34.8249],[-91.49844,34.82542],[-91.4945,34.82665],[-91.4924,34.82743],[-91.49034,34.82833],[-91.48846,34.82925],[-91.48154,34.83315],[-91.48106,34.83339],[-91.48063,34.8336],[-91.48018,34.83379],[-91.47941,34.83409],[-91.479,34.83425],[-91.47835,34.83446],[-91.478,34.83458],[-91.47746,34.83473],[-91.47692,34.83487],[-91.47536,34.83524],[-91.46898,34.8368],[-91.46828,34.83694],[-91.46715,34.83722],[-91.46637,34.83741],[-91.46469,34.8378],[-91.46359,34.83807],[-91.4615,34.83857],[-91.45274,34.84066],[-91.43945,34.84376],[-91.4339,34.84511],[-91.4327,34.84537],[-91.43202,34.8455],[-91.42982,34.84585],[-91.42849,34.84597],[-91.42621,34.84614],[-91.4238,34.8462],[-91.41877,34.84614],[-91.41013,34.846],[-91.39287,34.84575],[-91.38693,34.84566],[-91.38215,34.84557],[-91.37961,34.84561],[-91.37773,34.84576],[-91.37593,34.84596],[-91.37431,34.84619],[-91.37171,34.84666],[-91.36127,34.84852],[-91.35874,34.84896],[-91.35532,34.84957],[-91.35365,34.84979],[-91.352,34.84996],[-91.34405,34.85078],[-91.3422,34.85106],[-91.34066,34.85137],[-91.33792,34.85214],[-91.33633,34.85269],[-91.33507,34.85321],[-91.33382,34.85379],[-91.33232,34.85454],[-91.33105,34.85517],[-91.3161,34.86238],[-91.31467,34.86306],[-91.313,34.86382],[-91.31157,34.86439],[-91.3099,34.86494],[-91.30789,34.86544],[-91.30142,34.86703],[-91.30083,34.86717],[-91.29442,34.8687],[-91.28963,34.86984],[-91.28234,34.87156],[-91.28017,34.8722],[-91.27808,34.87295],[-91.27574,34.87395],[-91.27348,34.87506],[-91.27138,34.87627],[-91.26957,34.87748],[-91.2679,34.87869],[-91.25961,34.88492],[-91.25901,34.88537],[-91.25897,34.8854],[-91.24989,34.89229],[-91.24431,34.89648],[-91.24279,34.89755],[-91.24073,34.89887],[-91.23824,34.90032],[-91.23589,34.90155],[-91.23383,34.90251],[-91.23144,34.90353],[-91.22917,34.90438],[-91.22689,34.90518],[-91.22453,34.90583],[-91.22223,34.90642],[-91.21946,34.90704],[-91.21784,34.90734],[-91.21641,34.90755],[-91.21416,34.9078],[-91.21174,34.90804],[-91.20922,34.90818],[-91.20291,34.90842],[-91.19679,34.90869],[-91.19401,34.90879],[-91.19141,34.90891],[-91.19031,34.90894],[-91.18673,34.90906],[-91.18418,34.90925],[-91.18185,34.90953],[-91.1793,34.90992],[-91.17705,34.9104],[-91.17517,34.91087],[-91.17314,34.91143],[-91.17111,34.91208],[-91.16873,34.91296],[-91.16367,34.91496],[-91.16178,34.91566],[-91.16091,34.91593],[-91.1591,34.91646],[-91.15721,34.9169],[-91.15529,34.91728],[-91.15243,34.91776],[-91.15099,34.91799],[-91.14585,34.91883],[-91.14374,34.91925],[-91.14128,34.91991],[-91.13889,34.92067],[-91.13709,34.92137],[-91.13015,34.92403],[-91.12628,34.92558],[-91.12561,34.92582],[-91.12407,34.92641],[-91.12186,34.92712],[-91.11992,34.92762],[-91.11788,34.92799],[-91.11227,34.9288],[-91.10428,34.92998],[-91.09071,34.93191],[-91.08806,34.93239],[-91.08613,34.93282],[-91.08439,34.93331],[-91.08273,34.93382],[-91.08101,34.93444],[-91.0787,34.93529],[-91.07257,34.93757],[-91.06448,34.94056],[-91.06231,34.9413],[-91.06043,34.9418],[-91.05793,34.94239],[-91.04938,34.94394],[-91.04747,34.94435],[-91.04556,34.94483],[-91.04375,34.94535],[-91.041,34.94618],[-91.02144,34.95219],[-91.01916,34.95288],[-91.01402,34.95448],[-90.9995,34.95891],[-90.98793,34.96248],[-90.97875,34.96528],[-90.96934,34.96816],[-90.95419,34.97281],[-90.95227,34.97331],[-90.94973,34.97382],[-90.94784,34.97412],[-90.94509,34.97444],[-90.9356,34.97541],[-90.92403,34.97662],[-90.92225,34.97686],[-90.92064,34.97721],[-90.91863,34.97782],[-90.91509,34.97929],[-90.90859,34.98199],[-90.90208,34.9847],[-90.89498,34.98764],[-90.88875,34.99022],[-90.88621,34.99128],[-90.87839,34.99454],[-90.87629,34.99537],[-90.8735,34.99637],[-90.8711,34.99719],[-90.85967,35.00122],[-90.85761,35.00198],[-90.85578,35.00278],[-90.85411,35.0036],[-90.8522,35.00467],[-90.85026,35.00587],[-90.84523,35.00894],[-90.83473,35.01543],[-90.8255,35.02111],[-90.82153,35.02358],[-90.82058,35.02417],[-90.81532,35.02731],[-90.81412,35.02806],[-90.81082,35.03014],[-90.80928,35.03101],[-90.80772,35.03182],[-90.80697,35.03217],[-90.8048,35.03314],[-90.80334,35.03367],[-90.80226,35.03404],[-90.79988,35.03476],[-90.79725,35.03534],[-90.79565,35.03563],[-90.79476,35.03577],[-90.79399,35.03586],[-90.79315,35.03596],[-90.79225,35.03605],[-90.7904,35.03622],[-90.79022,35.03623],[-90.78923,35.03632],[-90.78913,35.03632],[-90.78338,35.03682],[-90.7779,35.03733],[-90.77715,35.03738],[-90.77501,35.03748],[-90.77228,35.03749],[-90.77166,35.03748],[-90.76862,35.03743],[-90.76298,35.03736],[-90.75986,35.03731],[-90.7586,35.03722],[-90.75725,35.03707],[-90.75488,35.0366],[-90.75052,35.03558],[-90.74945,35.03534],[-90.74527,35.03438],[-90.73999,35.03315],[-90.73689,35.03243],[-90.73495,35.03214],[-90.73318,35.03203],[-90.73148,35.03202],[-90.72976,35.03214],[-90.72797,35.03242],[-90.72608,35.03283],[-90.72406,35.03351],[-90.72267,35.03417],[-90.72169,35.03468],[-90.72105,35.03505],[-90.71903,35.03636],[-90.71566,35.03874],[-90.71284,35.0407],[-90.70693,35.0448],[-90.70321,35.04738],[-90.69867,35.05057],[-90.69687,35.05175],[-90.69499,35.05285],[-90.69008,35.05576],[-90.68731,35.05742],[-90.68578,35.05833],[-90.68352,35.05966],[-90.68057,35.06141],[-90.67912,35.06232],[-90.66545,35.07184],[-90.6643,35.07261],[-90.6527,35.08066],[-90.64882,35.08331],[-90.64742,35.08421],[-90.64596,35.08509],[-90.64434,35.08596],[-90.64266,35.08675],[-90.64072,35.08757],[-90.63873,35.08829],[-90.63023,35.09104],[-90.62292,35.09348],[-90.61512,35.09601],[-90.60709,35.09862],[-90.58804,35.10481],[-90.58421,35.10606],[-90.57571,35.1088],[-90.5752,35.10896],[-90.56337,35.11311],[-90.56253,35.1134],[-90.55641,35.11554],[-90.55432,35.11628],[-90.54826,35.11841],[-90.54784,35.11855],[-90.54199,35.12057],[-90.53553,35.12284],[-90.52857,35.12526],[-90.52325,35.12713],[-90.52054,35.12808],[-90.52014,35.12822],[-90.51657,35.12948],[-90.51471,35.13008],[-90.51305,35.13054],[-90.51134,35.13096],[-90.5094,35.13132],[-90.50729,35.13164],[-90.50551,35.13181],[-90.5047,35.1319],[-90.502,35.13202],[-90.49971,35.13211],[-90.49419,35.13228],[-90.48969,35.13242],[-90.4896,35.13243],[-90.48749,35.1325],[-90.48728,35.13251],[-90.4859,35.13254],[-90.48104,35.1327],[-90.47993,35.13275],[-90.46813,35.13315],[-90.46379,35.1333],[-90.45476,35.13361],[-90.45234,35.13367],[-90.44201,35.134],[-90.44028,35.13413],[-90.43888,35.13434],[-90.43742,35.13464],[-90.4359,35.13506],[-90.43463,35.13552],[-90.43326,35.1361],[-90.43104,35.13719],[-90.42563,35.13979],[-90.41363,35.14554],[-90.40905,35.14772],[-90.4065,35.14895],[-90.40493,35.14966],[-90.4042,35.14993],[-90.40264,35.15043],[-90.40156,35.15074],[-90.40004,35.15102],[-90.39862,35.15118],[-90.39775,35.15123],[-90.3968,35.15128],[-90.39049,35.151],[-90.37579,35.1503],[-90.35548,35.14934],[-90.35494,35.14931],[-90.33743,35.14851],[-90.33693,35.14849],[-90.32862,35.14806],[-90.32798,35.14804],[-90.32404,35.14789],[-90.31985,35.14784],[-90.31937,35.14784],[-90.30191,35.14776],[-90.30143,35.14775],[-90.29761,35.14774],[-90.29491,35.14776],[-90.29325,35.14774],[-90.29227,35.14773],[-90.28945,35.1477],[-90.28685,35.14765],[-90.28161,35.14756],[-90.27164,35.14744],[-90.26807,35.14737],[-90.26659,35.14761],[-90.26464,35.14821],[-90.26451,35.14825],[-90.26406,35.14839],[-90.25553,35.15103],[-90.25349,35.15166],[-90.24921,35.15293],[-90.24663,35.15369],[-90.24623,35.15382],[-90.23949,35.15589],[-90.23306,35.15786],[-90.23048,35.15867],[-90.22992,35.15884],[-90.22869,35.15919],[-90.223,35.16094],[-90.21968,35.16196],[-90.2144,35.16356],[-90.21088,35.16463],[-90.21014,35.16486],[-90.20756,35.16563],[-90.20626,35.16602],[-90.20291,35.16704],[-90.20058,35.16776],[-90.19984,35.16805],[-90.19897,35.16842],[-90.19815,35.16893],[-90.19686,35.16974],[-90.19613,35.17014],[-90.19552,35.17042],[-90.19517,35.17054],[-90.19458,35.17073],[-90.19418,35.17082],[-90.1936,35.17091],[-90.19297,35.17094],[-90.19244,35.17092],[-90.1916,35.17082],[-90.19111,35.17071],[-90.19093,35.17064],[-90.19053,35.17051],[-90.18995,35.17032],[-90.18642,35.16898],[-90.18597,35.16884],[-90.18419,35.16819],[-90.18308,35.16775],[-90.18118,35.16699],[-90.17939,35.16629],[-90.17785,35.16572],[-90.17692,35.16535],[-90.17533,35.16476],[-90.17456,35.16448],[-90.17386,35.16422],[-90.17064,35.16297],[-90.16654,35.16138],[-90.16459,35.16066],[-90.16421,35.16052],[-90.16262,35.1599],[-90.15818,35.15819],[-90.15766,35.15799],[-90.15417,35.15665],[-90.15282,35.15613],[-90.1518,35.15577],[-90.15087,35.15551],[-90.15008,35.15534],[-90.14902,35.15518],[-90.14836,35.15514],[-90.14784,35.15512],[-90.1474,35.15513],[-90.14689,35.15516],[-90.14639,35.15523],[-90.14583,35.15531],[-90.14491,35.15548],[-90.14426,35.1556],[-90.14357,35.15571],[-90.14313,35.15575],[-90.14252,35.15579],[-90.14107,35.15587],[-90.1368,35.15613],[-90.13575,35.15618],[-90.133,35.15632],[-90.13227,35.15637],[-90.12701,35.15667],[-90.12516,35.15677],[-90.12399,35.15677],[-90.12272,35.15664],[-90.11572,35.15541],[-90.11341,35.15499],[-90.11033,35.15444],[-90.10737,35.1539],[-90.10645,35.15374],[-90.10352,35.15323],[-90.10187,35.15306],[-90.10085,35.15301],[-90.09812,35.15301],[-90.08918,35.153],[-90.0853,35.153],[-90.07819,35.15304],[-90.06848,35.15304],[-90.05789,35.15304],[-90.05688,35.15305],[-90.05405,35.15303],[-90.05231,35.15305],[-90.05084,35.15305],[-90.04948,35.15307],[-90.04889,35.15306],[-90.04872,35.15305],[-90.04847,35.15303],[-90.04819,35.15297],[-90.04812,35.15295],[-90.04802,35.15293],[-90.04791,35.15292],[-90.04758,35.15285],[-90.04738,35.15281],[-90.04707,35.15273],[-90.0467,35.15262],[-90.04585,35.1523],[-90.04522,35.15208],[-90.04478,35.15193],[-90.04428,35.1518],[-90.04382,35.15171],[-90.04343,35.15167],[-90.04265,35.15161],[-90.04169,35.15154],[-90.04104,35.15147],[-90.04042,35.1514],[-90.04003,35.15124],[-90.03992,35.15118],[-90.03985,35.15113],[-90.0398,35.15106],[-90.03976,35.15097],[-90.03974,35.1509],[-90.03974,35.15083],[-90.03974,35.15074],[-90.03979,35.15066],[-90.03984,35.1506],[-90.0399,35.15054],[-90.03999,35.15046],[-90.04011,35.1504],[-90.04025,35.15036],[-90.04039,35.15034],[-90.04054,35.15034],[-90.04069,35.15036],[-90.04081,35.1504],[-90.04092,35.15044],[-90.04101,35.15054],[-90.04108,35.15063],[-90.04112,35.15074],[-90.04111,35.15083],[-90.04105,35.15102],[-90.04095,35.15127],[-90.04087,35.15134],[-90.04066,35.15153],[-90.04052,35.15171],[-90.03985,35.15231],[-90.03945,35.15269],[-90.03919,35.15296],[-90.03909,35.15305],[-90.03882,35.15331],[-90.03864,35.15349],[-90.03857,35.15357],[-90.03828,35.1539],[-90.0381,35.15417],[-90.03792,35.15449],[-90.03779,35.15486],[-90.0377,35.15517],[-90.03759,35.1557],[-90.0367,35.15559],[-90.03535,35.15548],[-90.03348,35.1555],[-90.03269,35.15544],[-90.03196,35.15538],[-90.03118,35.15515],[-90.02868,35.15495],[-90.02511,35.15464],[-90.02219,35.1544],[-90.02152,35.15435],[-90.02066,35.15427],[-90.02056,35.15425],[-90.01962,35.15413],[-90.01776,35.15396],[-90.01628,35.15383],[-90.01575,35.15378],[-90.01438,35.15374],[-90.01318,35.15364],[-90.01269,35.15356],[-90.01147,35.15325],[-90.01095,35.1532],[-90.01042,35.15326],[-90.00934,35.15343],[-90.00891,35.1535],[-90.00837,35.15353],[-90.00792,35.15349],[-90.00723,35.15343],[-90.00562,35.15326],[-90.00384,35.15307],[-90.00209,35.15291],[-90.002,35.15291],[-90.00191,35.1529],[-89.99956,35.15266],[-89.99763,35.15246],[-89.99754,35.15246],[-89.99745,35.15245],[-89.99232,35.15195],[-89.99215,35.15193],[-89.98775,35.1515],[-89.98709,35.15144],[-89.98599,35.15133],[-89.98271,35.15104],[-89.98202,35.15094],[-89.98177,35.15089],[-89.98162,35.1508],[-89.98156,35.15073],[-89.98146,35.15045],[-89.98151,35.1502],[-89.98164,35.1494],[-89.98175,35.1488],[-89.98178,35.14864],[-89.98167,35.14858],[-89.98157,35.14854],[-89.98129,35.14848],[-89.981,35.14845],[-89.98059,35.1484],[-89.98002,35.14832],[-89.97962,35.14824],[-89.97907,35.14808],[-89.97862,35.14793],[-89.97759,35.14748],[-89.97694,35.14723],[-89.97638,35.14706],[-89.97579,35.14694],[-89.97515,35.14685],[-89.97393,35.14674],[-89.97335,35.14666],[-89.97282,35.14656],[-89.97214,35.14638],[-89.97168,35.14627],[-89.97119,35.14615],[-89.9707,35.14606],[-89.97023,35.14601],[-89.96697,35.14582],[-89.96551,35.14572],[-89.96481,35.14571],[-89.96432,35.14573],[-89.96375,35.14584],[-89.96338,35.14594],[-89.96309,35.14602],[-89.96254,35.14619],[-89.9621,35.14628],[-89.96131,35.14638],[-89.95802,35.14675],[-89.95709,35.14687],[-89.95673,35.14694],[-89.9564,35.14701],[-89.95602,35.1471],[-89.95545,35.14725],[-89.95445,35.14752],[-89.95383,35.14767],[-89.9528,35.14791],[-89.95222,35.14801],[-89.95166,35.14807],[-89.95118,35.14809],[-89.94996,35.14808],[-89.94694,35.14803],[-89.94686,35.14803],[-89.94481,35.148],[-89.94428,35.14799],[-89.94253,35.14796],[-89.94128,35.14792],[-89.94056,35.14783],[-89.94003,35.14769],[-89.93992,35.14767],[-89.93919,35.14742],[-89.93815,35.14702],[-89.93763,35.14686],[-89.93708,35.14671],[-89.9365,35.14662],[-89.93572,35.14658],[-89.93327,35.14655],[-89.93198,35.14654],[-89.929,35.1465],[-89.92786,35.14647],[-89.92671,35.14641],[-89.92406,35.14619],[-89.92264,35.14607],[-89.92224,35.14604],[-89.91897,35.14573],[-89.91801,35.14566],[-89.91706,35.14561],[-89.91634,35.14558],[-89.91587,35.14557],[-89.91265,35.14547],[-89.91151,35.14544],[-89.91031,35.14541],[-89.90955,35.14544],[-89.9088,35.1455],[-89.9081,35.14558],[-89.90698,35.14575],[-89.90474,35.14609],[-89.90279,35.1464],[-89.89916,35.14697],[-89.89809,35.14713],[-89.89709,35.14727],[-89.89484,35.14761],[-89.89314,35.14787],[-89.89086,35.14822],[-89.88981,35.1484],[-89.88908,35.14855],[-89.88826,35.1488],[-89.8876,35.1491],[-89.88701,35.14945],[-89.88644,35.14987],[-89.88545,35.15073],[-89.88427,35.15184],[-89.8835,35.15256],[-89.88285,35.15316],[-89.88204,35.15391],[-89.88101,35.1549],[-89.88026,35.15554],[-89.87984,35.15593],[-89.87887,35.1568],[-89.87779,35.15776],[-89.87711,35.15831],[-89.87626,35.15891],[-89.87606,35.15905],[-89.8751,35.15965],[-89.87412,35.16017],[-89.87264,35.16086],[-89.86761,35.16282],[-89.86646,35.16325],[-89.86172,35.16509],[-89.86106,35.16537],[-89.8577,35.16663],[-89.85046,35.1694],[-89.85001,35.16958],[-89.84465,35.17168],[-89.84255,35.17245],[-89.84035,35.17336],[-89.83714,35.17479],[-89.83375,35.17631],[-89.82808,35.17886],[-89.82641,35.17959],[-89.82315,35.18108],[-89.81926,35.18282],[-89.81755,35.18362],[-89.81732,35.18372],[-89.81438,35.18502],[-89.81353,35.18539],[-89.81292,35.18567],[-89.81118,35.18645],[-89.80864,35.18758],[-89.80426,35.1895],[-89.80358,35.18981],[-89.80276,35.19021],[-89.80204,35.19057],[-89.8003,35.19134],[-89.79764,35.19252],[-89.79307,35.19458],[-89.79222,35.19496],[-89.7879,35.19688],[-89.78767,35.19697],[-89.77975,35.20055],[-89.77769,35.20154],[-89.77509,35.20285],[-89.77276,35.20402],[-89.77162,35.2046],[-89.7698,35.20553],[-89.7676,35.20666],[-89.76698,35.20697],[-89.75975,35.21067],[-89.75745,35.21184],[-89.74971,35.2157],[-89.74715,35.21716],[-89.74412,35.2189],[-89.74129,35.22063],[-89.73932,35.22179],[-89.73704,35.22315],[-89.73447,35.22468],[-89.73115,35.22665],[-89.72473,35.23057],[-89.71565,35.23586],[-89.70519,35.24127],[-89.70281,35.24258],[-89.69446,35.24692],[-89.6942,35.24707],[-89.68543,35.25152],[-89.68497,35.25176],[-89.68428,35.25211],[-89.67733,35.25567],[-89.67627,35.25618],[-89.67567,35.25649],[-89.66982,35.25963],[-89.66806,35.26053],[-89.66495,35.26211],[-89.662,35.26371],[-89.6611,35.26417],[-89.65689,35.26637],[-89.65043,35.26971],[-89.65012,35.26989],[-89.6381,35.27622],[-89.63736,35.27656],[-89.62513,35.28303],[-89.61874,35.28637],[-89.61663,35.28741],[-89.61531,35.28822],[-89.61209,35.29037],[-89.60114,35.2983],[-89.60018,35.29896],[-89.59905,35.2998],[-89.59791,35.30063],[-89.59316,35.30403],[-89.59276,35.30432],[-89.58439,35.31037],[-89.58397,35.31066],[-89.5821,35.31202],[-89.5816,35.31238],[-89.56179,35.32669],[-89.55699,35.33011],[-89.55523,35.33131],[-89.55346,35.33242],[-89.54946,35.33445],[-89.54908,35.33464],[-89.54472,35.33664],[-89.53264,35.34224],[-89.53209,35.34247],[-89.52168,35.34728],[-89.51605,35.34988],[-89.47793,35.36746],[-89.47161,35.37039],[-89.46924,35.37142],[-89.46872,35.37164],[-89.4682,35.37185],[-89.46729,35.3722],[-89.4653,35.37288],[-89.45872,35.37493],[-89.4522,35.3769],[-89.43412,35.38238],[-89.4323,35.38293],[-89.42473,35.38542],[-89.42295,35.38614],[-89.42075,35.38707],[-89.41688,35.38911],[-89.41441,35.39057],[-89.40951,35.3936],[-89.3987,35.40027],[-89.39141,35.40478],[-89.37863,35.41268],[-89.36428,35.4215],[-89.36381,35.42177],[-89.35713,35.42592],[-89.34239,35.43501],[-89.34108,35.43579],[-89.33265,35.44101],[-89.32651,35.44498],[-89.32278,35.44754],[-89.31858,35.45041],[-89.31581,35.45226],[-89.31413,35.45327],[-89.31288,35.45403],[-89.30752,35.45725],[-89.29797,35.46295],[-89.29166,35.46671],[-89.28764,35.46912],[-89.28142,35.47286],[-89.27846,35.47459],[-89.27696,35.4757],[-89.27596,35.47665],[-89.27493,35.47788],[-89.27443,35.4786],[-89.27384,35.47948],[-89.27323,35.4809],[-89.27287,35.48179],[-89.27179,35.48654],[-89.27134,35.48813],[-89.27065,35.49022],[-89.26922,35.49455],[-89.26788,35.49875],[-89.26649,35.50303],[-89.26586,35.50484],[-89.26565,35.50548],[-89.26432,35.50952],[-89.26418,35.51001],[-89.26333,35.51256],[-89.26297,35.51361],[-89.25957,35.52404],[-89.25925,35.52496],[-89.25815,35.52838],[-89.2568,35.53247],[-89.25648,35.53345],[-89.25589,35.53457],[-89.25531,35.5353],[-89.25458,35.53598],[-89.25366,35.53662],[-89.25298,35.53697],[-89.25237,35.53722],[-89.25207,35.5373],[-89.25064,35.53766],[-89.25023,35.53774],[-89.24628,35.53864],[-89.24577,35.53875],[-89.23783,35.54045],[-89.22453,35.54334],[-89.2227,35.54398],[-89.20616,35.55045],[-89.19965,35.55297],[-89.19405,35.55523],[-89.19225,35.55589],[-89.1913,35.55622],[-89.18679,35.55755],[-89.1751,35.561],[-89.17098,35.5621],[-89.15426,35.56708],[-89.12986,35.57426],[-89.12029,35.57709],[-89.11883,35.57755],[-89.10278,35.58232],[-89.09967,35.58321],[-89.09632,35.58413],[-89.0946,35.58463],[-89.09013,35.58599],[-89.08293,35.58812],[-89.07281,35.59107],[-89.06077,35.59462],[-89.05874,35.59531],[-89.05704,35.59595],[-89.05215,35.59788],[-89.03483,35.60469],[-89.02655,35.60792],[-89.02096,35.61011],[-89.01742,35.61141],[-89.00414,35.61562],[-89.00006,35.61698],[-88.99753,35.61779],[-88.99225,35.61948],[-88.9823,35.62266],[-88.98022,35.62333],[-88.97434,35.62521],[-88.96342,35.62872],[-88.95239,35.63205],[-88.94856,35.63317],[-88.94518,35.63414],[-88.93648,35.63673],[-88.92463,35.64013],[-88.91785,35.64207],[-88.90009,35.6472],[-88.89894,35.64754],[-88.89509,35.64873],[-88.89026,35.65053],[-88.8889,35.65107],[-88.87697,35.65569],[-88.87661,35.65583],[-88.87529,35.65638],[-88.87453,35.65669],[-88.8738,35.65699],[-88.87063,35.65821],[-88.85766,35.66243],[-88.85451,35.66345],[-88.85373,35.6637],[-88.85054,35.66474],[-88.83764,35.66892],[-88.8365,35.66929],[-88.83591,35.66946],[-88.83551,35.66956],[-88.83488,35.66971],[-88.83389,35.66991],[-88.83015,35.67054],[-88.82987,35.67059],[-88.82962,35.67063],[-88.82937,35.67067],[-88.82605,35.67124],[-88.82336,35.6717],[-88.81373,35.67334],[-88.80608,35.67465],[-88.8024,35.67529],[-88.79871,35.67592],[-88.79809,35.67602],[-88.79006,35.67741],[-88.78969,35.67748],[-88.78756,35.67783],[-88.77302,35.68033],[-88.77211,35.68045],[-88.77113,35.68054],[-88.77023,35.68058],[-88.74542,35.68084],[-88.74226,35.68091],[-88.73966,35.68093],[-88.73733,35.68099],[-88.73607,35.68107],[-88.73475,35.68126],[-88.73335,35.68155],[-88.73125,35.68213],[-88.72989,35.6827],[-88.71869,35.68759],[-88.71267,35.69001],[-88.70715,35.69215],[-88.68872,35.69933],[-88.67936,35.70296],[-88.67055,35.70638],[-88.66619,35.70802],[-88.66289,35.70905],[-88.65042,35.71292],[-88.63715,35.71707],[-88.6309,35.71902],[-88.62497,35.72084],[-88.61769,35.7231],[-88.61014,35.72542],[-88.60725,35.7263],[-88.60166,35.72805],[-88.59911,35.72898],[-88.59648,35.73017],[-88.59207,35.73245],[-88.58558,35.73591],[-88.57449,35.74179],[-88.5729,35.7426],[-88.57004,35.74384],[-88.56832,35.74445],[-88.56689,35.7449],[-88.56548,35.74531],[-88.56373,35.74575],[-88.55824,35.74675],[-88.5487,35.74838],[-88.54021,35.74985],[-88.53424,35.75087],[-88.52431,35.7526],[-88.51671,35.7539],[-88.50952,35.75515],[-88.50791,35.75541],[-88.50532,35.75593],[-88.4974,35.75795],[-88.49475,35.75862],[-88.48771,35.7604],[-88.47471,35.76372],[-88.47093,35.76469],[-88.46568,35.76601],[-88.45022,35.76997],[-88.44206,35.77201],[-88.43877,35.77284],[-88.43517,35.7739],[-88.43127,35.77532],[-88.41643,35.78087],[-88.4091,35.78364],[-88.40128,35.78653],[-88.39844,35.78755],[-88.39654,35.78816],[-88.39542,35.78845],[-88.38811,35.78968],[-88.38544,35.79016],[-88.3823,35.79067],[-88.3813,35.7909],[-88.38005,35.79125],[-88.37836,35.79187],[-88.37348,35.79373],[-88.36471,35.79711],[-88.36268,35.79779],[-88.36073,35.79831],[-88.35858,35.7988],[-88.35245,35.79968],[-88.34728,35.80039],[-88.34507,35.80069],[-88.3302,35.80283],[-88.32965,35.8029],[-88.32522,35.8035],[-88.32314,35.80381],[-88.32077,35.80426],[-88.31864,35.8049],[-88.31615,35.80576],[-88.30988,35.80798],[-88.30779,35.80863],[-88.30574,35.80919],[-88.3031,35.80981],[-88.30015,35.81044],[-88.29701,35.81116],[-88.29386,35.81186],[-88.28477,35.8139],[-88.27898,35.81522],[-88.27408,35.81634],[-88.26964,35.81734],[-88.26696,35.81793],[-88.26582,35.8182],[-88.26427,35.81846],[-88.26304,35.81857],[-88.26057,35.81863],[-88.25761,35.81839],[-88.25629,35.81826],[-88.2483,35.81746],[-88.24466,35.8171],[-88.2362,35.81619],[-88.22861,35.81545],[-88.22003,35.81459],[-88.21636,35.81436],[-88.21279,35.81425],[-88.20929,35.81437],[-88.20572,35.81467],[-88.19809,35.81577],[-88.19213,35.81666],[-88.1885,35.81722],[-88.17903,35.81858],[-88.17809,35.81872],[-88.17766,35.81879],[-88.17191,35.81969],[-88.16998,35.81986],[-88.16765,35.81989],[-88.15208,35.81865],[-88.14939,35.81853],[-88.14799,35.81861],[-88.14673,35.81874],[-88.14419,35.81916],[-88.1372,35.82098],[-88.13161,35.82241],[-88.12586,35.82392],[-88.12169,35.82499],[-88.11825,35.82591],[-88.11511,35.82671],[-88.10981,35.82811],[-88.10754,35.82886],[-88.10537,35.82988],[-88.10311,35.83114],[-88.10001,35.83278],[-88.08859,35.83896],[-88.08247,35.84226],[-88.0744,35.84662],[-88.0594,35.8547],[-88.05418,35.85752],[-88.04929,35.86016],[-88.03785,35.86634],[-88.03532,35.86767],[-88.03345,35.86867],[-88.03218,35.86922],[-88.031,35.86961],[-88.02995,35.86995],[-88.02784,35.87039],[-88.02624,35.8706],[-88.02435,35.87072],[-88.02153,35.87062],[-88.00012,35.86946],[-87.99011,35.86889],[-87.98242,35.86847],[-87.98057,35.86842],[-87.9761,35.86853],[-87.97166,35.86859],[-87.96984,35.86859],[-87.96608,35.8686],[-87.96429,35.86865],[-87.96261,35.86882],[-87.95993,35.86934],[-87.95767,35.86978],[-87.95584,35.87001],[-87.95419,35.87008],[-87.95182,35.87003],[-87.94988,35.8698],[-87.94786,35.86937],[-87.9454,35.86861],[-87.93691,35.8661],[-87.93541,35.86568],[-87.93439,35.86547],[-87.93325,35.86537],[-87.93203,35.86548],[-87.92962,35.86592],[-87.9259,35.86659],[-87.92466,35.86673],[-87.92273,35.8667],[-87.92051,35.86656],[-87.91869,35.8664],[-87.91692,35.86599],[-87.9138,35.86461],[-87.91199,35.86399],[-87.91083,35.86378],[-87.9095,35.86369],[-87.90826,35.86365],[-87.90776,35.86371],[-87.90751,35.86375],[-87.90323,35.86439],[-87.90094,35.8646],[-87.89867,35.86467],[-87.89445,35.86459],[-87.89222,35.86467],[-87.89031,35.86493],[-87.88865,35.86527],[-87.88651,35.86589],[-87.88178,35.86749],[-87.88039,35.86794],[-87.87901,35.86827],[-87.87755,35.86845],[-87.87599,35.86849],[-87.87075,35.86822],[-87.86944,35.86833],[-87.86823,35.86855],[-87.86717,35.86882],[-87.86641,35.8691],[-87.86605,35.86927],[-87.86549,35.86954],[-87.86508,35.86973],[-87.86206,35.8716],[-87.85946,35.87313],[-87.85795,35.87401],[-87.85644,35.87479],[-87.85505,35.87538],[-87.85225,35.87633],[-87.85074,35.8769],[-87.84928,35.87755],[-87.84737,35.87868],[-87.84518,35.88015],[-87.84385,35.8808],[-87.84223,35.88127],[-87.84082,35.8815],[-87.83974,35.88154],[-87.83937,35.88154],[-87.83885,35.88154],[-87.83511,35.88152],[-87.83294,35.88154],[-87.82469,35.88162],[-87.81297,35.8817],[-87.81113,35.88165],[-87.8095,35.88149],[-87.80769,35.88114],[-87.80503,35.88045],[-87.8,35.87914],[-87.79875,35.87889],[-87.79772,35.87878],[-87.79719,35.87875],[-87.79494,35.87883],[-87.78257,35.88095],[-87.77376,35.88251],[-87.76704,35.8837],[-87.76477,35.88376],[-87.76248,35.88334],[-87.7611,35.88284],[-87.75341,35.87953],[-87.75102,35.87853],[-87.74952,35.87799],[-87.74798,35.87764],[-87.74621,35.87731],[-87.74154,35.87678],[-87.73126,35.87569],[-87.7142,35.87386],[-87.71262,35.87377],[-87.71021,35.8739],[-87.70875,35.87413],[-87.70697,35.87457],[-87.70611,35.87482],[-87.70407,35.87569],[-87.69848,35.87862],[-87.69306,35.88149],[-87.69173,35.88218],[-87.68982,35.88296],[-87.68767,35.88355],[-87.68575,35.88385],[-87.68356,35.88398],[-87.66987,35.88449],[-87.66724,35.88469],[-87.66543,35.885],[-87.66362,35.88543],[-87.66091,35.88628],[-87.65743,35.88764],[-87.65673,35.88793],[-87.65438,35.8889],[-87.64448,35.89294],[-87.64372,35.89325],[-87.6422,35.89383],[-87.64186,35.89397],[-87.64012,35.89472],[-87.63845,35.89555],[-87.63807,35.89574],[-87.63684,35.89647],[-87.63588,35.89704],[-87.63071,35.90002],[-87.6247,35.90349],[-87.61852,35.90709],[-87.61616,35.90863],[-87.61427,35.9101],[-87.60904,35.91439],[-87.60682,35.91621],[-87.60457,35.918],[-87.6003,35.92153],[-87.59828,35.92316],[-87.59705,35.924],[-87.59581,35.92469],[-87.59437,35.92538],[-87.59249,35.92607],[-87.59115,35.92646],[-87.58786,35.9272],[-87.58697,35.9275],[-87.58617,35.92788],[-87.58514,35.92847],[-87.58396,35.92937],[-87.58298,35.93049],[-87.58218,35.9317],[-87.58092,35.93357],[-87.57972,35.93465],[-87.57884,35.93531],[-87.57779,35.93581],[-87.57637,35.93632],[-87.57382,35.9369],[-87.57226,35.93743],[-87.57095,35.93808],[-87.56992,35.93882],[-87.5687,35.93993],[-87.56742,35.94158],[-87.56621,35.94284],[-87.56498,35.94399],[-87.5634,35.94511],[-87.56037,35.94698],[-87.55829,35.94833],[-87.55704,35.94933],[-87.55588,35.95041],[-87.55483,35.95172],[-87.55403,35.95287],[-87.55226,35.95623],[-87.55082,35.95873],[-87.55029,35.95947],[-87.54982,35.95999],[-87.5494,35.96045],[-87.549,35.96086],[-87.54859,35.96128],[-87.54763,35.96212],[-87.54628,35.96307],[-87.54483,35.96393],[-87.54374,35.96447],[-87.5425,35.96501],[-87.53996,35.96586],[-87.5387,35.96636],[-87.53747,35.96694],[-87.53547,35.96807],[-87.53426,35.96892],[-87.53307,35.96991],[-87.53191,35.9708],[-87.53088,35.97153],[-87.53007,35.97202],[-87.52792,35.97309],[-87.52648,35.97367],[-87.52483,35.97413],[-87.51618,35.97634],[-87.50587,35.97886],[-87.50516,35.97907],[-87.50444,35.97929],[-87.50404,35.97945],[-87.50368,35.97958],[-87.50302,35.97984],[-87.50194,35.98031],[-87.50013,35.9813],[-87.49799,35.98282],[-87.49589,35.98455],[-87.49384,35.98621],[-87.49287,35.98692],[-87.49148,35.98772],[-87.4899,35.98847],[-87.48813,35.98916],[-87.48519,35.99026],[-87.47699,35.99333],[-87.47006,35.99591],[-87.46894,35.99626],[-87.46761,35.99662],[-87.46666,35.99685],[-87.465,35.9971],[-87.4634,35.99723],[-87.46194,35.99726],[-87.46048,35.99721],[-87.45722,35.99679],[-87.45056,35.99579],[-87.446,35.99511],[-87.44278,35.99466],[-87.44102,35.99446],[-87.43994,35.99441],[-87.43884,35.99439],[-87.43746,35.99438],[-87.43481,35.9947],[-87.43298,35.99508],[-87.43102,35.99571],[-87.42784,35.99707],[-87.42294,35.99937],[-87.41863,36.00136],[-87.40935,36.00566],[-87.40796,36.00618],[-87.40642,36.00663],[-87.40478,36.00696],[-87.40329,36.00716],[-87.40141,36.00735],[-87.40078,36.00743],[-87.39938,36.00759],[-87.39749,36.00779],[-87.3896,36.00863],[-87.38692,36.0091],[-87.38477,36.00961],[-87.37952,36.01134],[-87.37451,36.01313],[-87.37334,36.01355],[-87.37133,36.01444],[-87.36797,36.01609],[-87.36586,36.0171],[-87.36422,36.0178],[-87.36217,36.01841],[-87.36019,36.01868],[-87.35631,36.01871],[-87.35291,36.0187],[-87.34827,36.01864],[-87.3431,36.01862],[-87.34176,36.0187],[-87.33962,36.01893],[-87.3371,36.01936],[-87.33532,36.01964],[-87.33223,36.02014],[-87.32326,36.0216],[-87.31305,36.02313],[-87.30962,36.02338],[-87.30658,36.02351],[-87.29783,36.02371],[-87.29734,36.02371],[-87.29659,36.02369],[-87.29228,36.02359],[-87.29126,36.02358],[-87.29076,36.02358],[-87.29033,36.02359],[-87.28991,36.0236],[-87.28952,36.02362],[-87.28913,36.02365],[-87.28873,36.02368],[-87.28831,36.02372],[-87.28781,36.02378],[-87.28729,36.02386],[-87.28639,36.02401],[-87.28527,36.02421],[-87.28437,36.02437],[-87.28179,36.02484],[-87.28134,36.02491],[-87.28097,36.02496],[-87.28068,36.02499],[-87.28036,36.02502],[-87.28004,36.02505],[-87.27975,36.02506],[-87.27943,36.02506],[-87.27916,36.02505],[-87.27886,36.02504],[-87.27857,36.02502],[-87.27825,36.02499],[-87.27786,36.02494],[-87.27752,36.02489],[-87.27718,36.02483],[-87.27687,36.02476],[-87.27659,36.0247],[-87.27631,36.02462],[-87.27547,36.02438],[-87.27078,36.023],[-87.26587,36.02157],[-87.26457,36.02119],[-87.26397,36.021],[-87.26297,36.02071],[-87.2622,36.02047],[-87.26013,36.01987],[-87.25838,36.01935],[-87.25744,36.01905],[-87.25648,36.01877],[-87.25534,36.01844],[-87.25462,36.01823],[-87.25414,36.0181],[-87.25365,36.01798],[-87.25307,36.01785],[-87.25265,36.01777],[-87.25206,36.01766],[-87.25153,36.01757],[-87.25089,36.01748],[-87.25033,36.01743],[-87.24972,36.01737],[-87.24913,36.01732],[-87.24832,36.01729],[-87.24753,36.01728],[-87.24705,36.01729],[-87.24656,36.0173],[-87.24605,36.01733],[-87.2455,36.01737],[-87.24451,36.01747],[-87.24414,36.01751],[-87.24384,36.01755],[-87.24326,36.01765],[-87.24281,36.01773],[-87.24253,36.01778],[-87.24187,36.01791],[-87.24072,36.01816],[-87.23918,36.01849],[-87.23459,36.01946],[-87.23398,36.0196],[-87.23342,36.01973],[-87.23298,36.01984],[-87.23262,36.01994],[-87.2321,36.0201],[-87.2317,36.02023],[-87.23123,36.02039],[-87.23085,36.02053],[-87.23051,36.02067],[-87.23004,36.02086],[-87.22961,36.02105],[-87.22806,36.02177],[-87.22628,36.02261],[-87.22546,36.02299],[-87.22496,36.02321],[-87.22452,36.0234],[-87.22373,36.02372],[-87.21921,36.02547],[-87.21847,36.02577],[-87.21793,36.026],[-87.21734,36.02626],[-87.21678,36.02651],[-87.21624,36.02677],[-87.21576,36.027],[-87.2152,36.02728],[-87.21333,36.02821],[-87.21146,36.02915],[-87.21114,36.0293],[-87.21081,36.02946],[-87.21049,36.0296],[-87.21017,36.02971],[-87.20994,36.02979],[-87.20973,36.02985],[-87.20943,36.02993],[-87.20921,36.02998],[-87.20901,36.03002],[-87.20884,36.03004],[-87.20849,36.03008],[-87.20811,36.03011],[-87.20774,36.03012],[-87.20741,36.03012],[-87.20705,36.0301],[-87.20671,36.03007],[-87.20645,36.03003],[-87.2061,36.02997],[-87.20578,36.0299],[-87.20542,36.0298],[-87.20518,36.02972],[-87.20485,36.0296],[-87.20459,36.02949],[-87.20434,36.02938],[-87.20372,36.0291],[-87.20307,36.02881],[-87.19988,36.02734],[-87.19915,36.02701],[-87.19867,36.02679],[-87.1981,36.02656],[-87.19757,36.02635],[-87.19711,36.02619],[-87.19672,36.02605],[-87.19626,36.02589],[-87.19214,36.02456],[-87.19,36.02387],[-87.18945,36.02371],[-87.18909,36.02361],[-87.18874,36.02353],[-87.1884,36.02347],[-87.1881,36.02342],[-87.18788,36.0234],[-87.18772,36.02339],[-87.1876,36.02337],[-87.18737,36.02337],[-87.18708,36.02337],[-87.18684,36.02337],[-87.18665,36.02338],[-87.18642,36.02339],[-87.18615,36.02342],[-87.1859,36.02346],[-87.18568,36.0235],[-87.18538,36.02356],[-87.18502,36.02365],[-87.18474,36.02373],[-87.18444,36.02383],[-87.18413,36.02395],[-87.18377,36.02411],[-87.18329,36.02435],[-87.18242,36.02479],[-87.1762,36.02796],[-87.1718,36.0302],[-87.17063,36.0308],[-87.17007,36.03105],[-87.16905,36.0315],[-87.16853,36.03173],[-87.16788,36.03205],[-87.16714,36.03242],[-87.16567,36.03317],[-87.16103,36.03554],[-87.15869,36.03673],[-87.15553,36.03833],[-87.15419,36.03901],[-87.1512,36.04054],[-87.15055,36.04087],[-87.15016,36.0411],[-87.14976,36.04134],[-87.14934,36.0416],[-87.14879,36.04197],[-87.14837,36.04227],[-87.14787,36.04265],[-87.14738,36.04306],[-87.14704,36.04335],[-87.14645,36.04389],[-87.14594,36.04442],[-87.14548,36.04493],[-87.14512,36.04538],[-87.14478,36.04582],[-87.14446,36.04626],[-87.14412,36.04676],[-87.14385,36.04719],[-87.1434,36.04795],[-87.14324,36.04822],[-87.14245,36.04954],[-87.14025,36.05318],[-87.13968,36.05412],[-87.1394,36.05456],[-87.13909,36.055],[-87.1388,36.05539],[-87.13851,36.05575],[-87.13817,36.05615],[-87.13785,36.05651],[-87.13746,36.05691],[-87.13706,36.05729],[-87.13669,36.05765],[-87.13586,36.05843],[-87.13213,36.06191],[-87.13158,36.06243],[-87.1312,36.06281],[-87.13062,36.06339],[-87.13007,36.06399],[-87.12878,36.06543],[-87.12765,36.0667],[-87.12576,36.06881],[-87.12359,36.07123],[-87.12318,36.0717],[-87.12296,36.07194],[-87.12259,36.07233],[-87.12222,36.07269],[-87.12184,36.07304],[-87.12148,36.07335],[-87.12107,36.07369],[-87.12058,36.07406],[-87.12013,36.07439],[-87.11965,36.07471],[-87.11933,36.07492],[-87.11865,36.07532],[-87.11704,36.07622],[-87.11409,36.07788],[-87.11226,36.07893],[-87.10992,36.08025],[-87.10953,36.08047],[-87.10892,36.08077],[-87.10833,36.08104],[-87.10783,36.08126],[-87.10745,36.08142],[-87.10684,36.08164],[-87.10637,36.0818],[-87.10592,36.08195],[-87.10527,36.08214],[-87.10466,36.08229],[-87.10406,36.08243],[-87.10363,36.08252],[-87.10309,36.08262],[-87.1024,36.08274],[-87.10194,36.08282],[-87.09814,36.08344],[-87.09645,36.08372],[-87.09516,36.08393],[-87.09433,36.08407],[-87.09283,36.08432],[-87.09122,36.08458],[-87.09041,36.08471],[-87.08841,36.08504],[-87.0759,36.08723],[-87.07217,36.08765],[-87.06875,36.08782],[-87.06556,36.08777],[-87.06304,36.08761],[-87.06088,36.0875],[-87.05656,36.08735],[-87.05353,36.0871],[-87.05182,36.08655],[-87.05031,36.08575],[-87.04863,36.08474],[-87.04159,36.08055],[-87.03838,36.0787],[-87.03641,36.07795],[-87.03488,36.07756],[-87.03333,36.07738],[-87.03315,36.07735],[-87.03136,36.07718],[-87.02883,36.07694],[-87.02724,36.07682],[-87.02529,36.07682],[-87.02418,36.07683],[-87.02057,36.07692],[-87.01993,36.07693],[-87.01817,36.07698],[-87.01597,36.07696],[-87.00995,36.07715],[-87.0079,36.0772],[-87.00429,36.07736],[-87.00108,36.07751],[-86.99746,36.07768],[-86.99481,36.07784],[-86.99412,36.07787],[-86.99239,36.07792],[-86.99052,36.07794],[-86.98867,36.07782],[-86.98708,36.07757],[-86.98505,36.07701],[-86.98333,36.0764],[-86.98241,36.07606],[-86.98114,36.07561],[-86.97882,36.0748],[-86.97717,36.07425],[-86.97547,36.07392],[-86.97457,36.07386],[-86.97361,36.07389],[-86.97268,36.07399],[-86.9718,36.07411],[-86.97043,36.07448],[-86.96916,36.07499],[-86.96798,36.07553],[-86.9653,36.07684],[-86.96009,36.07938],[-86.9566,36.08105],[-86.956,36.08134],[-86.95143,36.08352],[-86.94982,36.08427],[-86.94419,36.08705],[-86.94356,36.0874],[-86.94252,36.0881],[-86.94158,36.08889],[-86.94049,36.08984],[-86.93986,36.09056],[-86.9393,36.09132],[-86.93863,36.09235],[-86.93793,36.09374],[-86.93623,36.09748],[-86.9348,36.10052],[-86.9341,36.1017],[-86.93333,36.10269],[-86.93264,36.10351],[-86.93182,36.1043],[-86.93164,36.10446],[-86.93102,36.10499],[-86.93026,36.10564],[-86.92593,36.10884],[-86.92288,36.11111],[-86.92241,36.11145],[-86.91981,36.1134],[-86.91729,36.1153],[-86.91507,36.11696],[-86.91379,36.11807],[-86.91166,36.12027],[-86.90905,36.12305],[-86.90778,36.12405],[-86.90574,36.12514],[-86.90336,36.1263],[-86.90264,36.12668],[-86.90243,36.12682],[-86.90195,36.12716],[-86.90127,36.12781],[-86.8988,36.13045],[-86.89826,36.13106],[-86.89732,36.13207],[-86.89637,36.13307],[-86.89548,36.13389],[-86.89471,36.13449],[-86.88804,36.13944],[-86.88521,36.14154],[-86.88474,36.1419],[-86.88031,36.1452],[-86.87683,36.14771],[-86.87523,36.14857],[-86.87478,36.14877],[-86.87362,36.14921],[-86.87323,36.14934],[-86.87219,36.1496],[-86.87123,36.14982],[-86.87019,36.15],[-86.86921,36.15012],[-86.86598,36.15049],[-86.86488,36.15067],[-86.86396,36.15085],[-86.86242,36.15117],[-86.86186,36.15129],[-86.85897,36.15197],[-86.85738,36.15233],[-86.85603,36.15262],[-86.85512,36.1528],[-86.8544,36.15291],[-86.8537,36.15303],[-86.85249,36.1532],[-86.85195,36.15328],[-86.85056,36.15344],[-86.8498,36.15349],[-86.84888,36.15353],[-86.84835,36.15355],[-86.84568,36.1536],[-86.84258,36.15372],[-86.84199,36.15374],[-86.83703,36.15391],[-86.8368,36.15392],[-86.83612,36.15393],[-86.83491,36.15401],[-86.83439,36.15406],[-86.83307,36.15426],[-86.83153,36.1546],[-86.82995,36.15505],[-86.82862,36.15542],[-86.82802,36.1556],[-86.82729,36.15581],[-86.82602,36.15617],[-86.82503,36.15645],[-86.82408,36.15672],[-86.82334,36.15706],[-86.82292,36.15739],[-86.82232,36.15809],[-86.82183,36.15898],[-86.82165,36.15935],[-86.8214,36.15987],[-86.82124,36.16012],[-86.82092,36.16077],[-86.82067,36.16128],[-86.81995,36.16267],[-86.81946,36.16354],[-86.81842,36.16499],[-86.81804,36.16537],[-86.81785,36.16558],[-86.81758,36.16589],[-86.81703,36.16648],[-86.81668,36.16679],[-86.81602,36.16739],[-86.81531,36.1679],[-86.81468,36.16828],[-86.81405,36.16861],[-86.81338,36.16888],[-86.81287,36.16907],[-86.81229,36.16925],[-86.81212,36.1693],[-86.8112,36.16949],[-86.81067,36.16957],[-86.80998,36.16967],[-86.80954,36.16973],[-86.80651,36.17014],[-86.8054,36.17034],[-86.80496,36.17044],[-86.80437,36.17064],[-86.80376,36.1709],[-86.80334,36.17114],[-86.80302,36.17133],[-86.80283,36.17145],[-86.80201,36.17189],[-86.80178,36.17198],[-86.80149,36.17205],[-86.80117,36.1721],[-86.80087,36.17212],[-86.80055,36.1721],[-86.8002,36.17203],[-86.79989,36.17194],[-86.79933,36.17169],[-86.79893,36.17144],[-86.79863,36.17116],[-86.79844,36.17097],[-86.7981,36.17054],[-86.796,36.16753],[-86.79538,36.16668],[-86.79489,36.16597],[-86.79455,36.16542],[-86.79441,36.16515],[-86.79428,36.16491],[-86.79413,36.16458],[-86.79402,36.1643],[-86.79397,36.16412],[-86.7939,36.16396],[-86.79383,36.16372],[-86.79372,36.16326],[-86.79364,36.16275],[-86.7935,36.16199],[-86.79339,36.16143],[-86.79334,36.16121],[-86.79324,36.16098],[-86.79312,36.16071],[-86.79303,36.16053],[-86.79289,36.16027],[-86.79267,36.15992],[-86.79247,36.15965],[-86.7921,36.15919],[-86.79144,36.15843],[-86.79073,36.1576],[-86.79013,36.15685],[-86.78983,36.15647],[-86.78945,36.15592],[-86.78885,36.15499],[-86.7884,36.15431],[-86.78797,36.15364],[-86.78741,36.15278],[-86.78701,36.15216],[-86.78674,36.1518],[-86.78651,36.15153],[-86.7862,36.15119],[-86.78599,36.15101],[-86.78545,36.1505],[-86.78495,36.15014],[-86.78465,36.14994],[-86.78408,36.1496],[-86.78373,36.14942],[-86.78314,36.14914],[-86.78264,36.14895],[-86.78225,36.14881],[-86.78172,36.14864],[-86.78125,36.14853],[-86.78047,36.1484],[-86.78015,36.14837],[-86.77973,36.14831],[-86.77934,36.14828],[-86.77881,36.14826],[-86.77846,36.14827],[-86.77773,36.1483],[-86.77702,36.14837],[-86.77626,36.14849],[-86.77588,36.14857],[-86.77517,36.14875],[-86.77482,36.14884],[-86.77436,36.14899],[-86.77412,36.14907],[-86.77328,36.14943],[-86.77298,36.14955],[-86.77279,36.14962],[-86.77062,36.15056],[-86.76828,36.15157],[-86.7645,36.15322],[-86.76328,36.1537],[-86.7623,36.15406],[-86.7615,36.15431],[-86.76108,36.15441],[-86.76075,36.15446],[-86.76035,36.15446],[-86.75993,36.15442],[-86.7593,36.15426],[-86.75808,36.15389],[-86.75715,36.15357],[-86.75649,36.15332],[-86.75605,36.15315],[-86.75515,36.15277],[-86.75432,36.15243],[-86.7535,36.15211],[-86.75243,36.1517],[-86.75106,36.15117],[-86.75071,36.15103],[-86.74994,36.15069],[-86.74947,36.15047],[-86.749,36.15027],[-86.74802,36.14974],[-86.74699,36.14917],[-86.74656,36.14891],[-86.74593,36.14852],[-86.74334,36.14683],[-86.74088,36.14529],[-86.73926,36.14434],[-86.73801,36.14361],[-86.73643,36.14274],[-86.73516,36.14205],[-86.73386,36.14139],[-86.73311,36.14106],[-86.73226,36.14072],[-86.73193,36.1406],[-86.73067,36.14023],[-86.73,36.14008],[-86.72943,36.13999],[-86.72806,36.13986],[-86.72734,36.13984],[-86.72538,36.13989],[-86.72406,36.13999],[-86.72153,36.14038],[-86.71763,36.14098],[-86.7135,36.14166],[-86.70377,36.14323],[-86.70154,36.14358],[-86.69873,36.144],[-86.69695,36.14417],[-86.69575,36.14419],[-86.69434,36.14416],[-86.693,36.14403],[-86.69218,36.14392],[-86.68762,36.14328],[-86.68547,36.14297],[-86.68524,36.14293],[-86.68481,36.14287],[-86.68201,36.14243],[-86.6799,36.14214],[-86.67793,36.14195],[-86.67685,36.14187],[-86.67608,36.14181],[-86.67127,36.14149],[-86.66961,36.14138],[-86.66618,36.14111],[-86.66445,36.14101],[-86.6603,36.14079],[-86.65902,36.14078],[-86.65826,36.14081],[-86.65704,36.14091],[-86.65576,36.14109],[-86.65412,36.14143],[-86.65288,36.14175],[-86.65157,36.14218],[-86.65064,36.14253],[-86.64962,36.143],[-86.64864,36.14353],[-86.64738,36.14424],[-86.64494,36.14584],[-86.64162,36.1478],[-86.63842,36.14986],[-86.63627,36.15119],[-86.63391,36.15271],[-86.63332,36.15308],[-86.62901,36.15567],[-86.62464,36.15846],[-86.6217,36.16028],[-86.62005,36.16129],[-86.6192,36.16181],[-86.61482,36.16454],[-86.61432,36.16485],[-86.61351,36.16533],[-86.61122,36.16678],[-86.61046,36.16725],[-86.60982,36.16758],[-86.60862,36.16819],[-86.60641,36.16905],[-86.60543,36.16933],[-86.60404,36.16969],[-86.60241,36.16995],[-86.60145,36.17006],[-86.59983,36.17016],[-86.59744,36.17009],[-86.596,36.17003],[-86.59425,36.16997],[-86.59072,36.16978],[-86.58756,36.16962],[-86.58438,36.16948],[-86.58034,36.16928],[-86.5763,36.16908],[-86.57147,36.16884],[-86.57085,36.16881],[-86.56867,36.1687],[-86.56186,36.16838],[-86.55359,36.16796],[-86.54453,36.16751],[-86.53465,36.16702],[-86.53334,36.16703],[-86.532,36.16709],[-86.5301,36.16732],[-86.52747,36.1679],[-86.52278,36.16905],[-86.52214,36.16919],[-86.52157,36.16934],[-86.51764,36.17026],[-86.51278,36.17136],[-86.50688,36.17209],[-86.50415,36.17236],[-86.49683,36.17311],[-86.49115,36.17371],[-86.46157,36.17758],[-86.45651,36.17826],[-86.45164,36.17891],[-86.41332,36.18405],[-86.40631,36.1849],[-86.40533,36.18496],[-86.39912,36.18483],[-86.38611,36.18446],[-86.37516,36.18419],[-86.36697,36.18398],[-86.36229,36.18385],[-86.35616,36.18368],[-86.34618,36.18342],[-86.34159,36.18329],[-86.33812,36.1832],[-86.33762,36.18319],[-86.33352,36.18307],[-86.33231,36.18301],[-86.32122,36.18272],[-86.32054,36.1827],[-86.31524,36.18257],[-86.30527,36.18229],[-86.30241,36.18222],[-86.30192,36.18221],[-86.30044,36.18217],[-86.29825,36.18211],[-86.29592,36.18221],[-86.29555,36.18223],[-86.29407,36.18248],[-86.29001,36.18338],[-86.28221,36.18514],[-86.27668,36.1864],[-86.27265,36.18728],[-86.27072,36.18773],[-86.27023,36.18785],[-86.26948,36.18802],[-86.26882,36.18816],[-86.26616,36.18878],[-86.24748,36.193],[-86.24649,36.19318],[-86.24545,36.19333],[-86.24414,36.19344],[-86.24324,36.19348],[-86.23832,36.19356],[-86.23739,36.19357],[-86.22866,36.19373],[-86.22786,36.19374],[-86.22004,36.19387],[-86.20467,36.19413],[-86.20295,36.19416],[-86.20199,36.19407],[-86.19986,36.19387],[-86.19458,36.19305],[-86.18147,36.19118],[-86.18091,36.1911],[-86.17291,36.1899],[-86.171,36.18966],[-86.16894,36.18921],[-86.16807,36.18897],[-86.16747,36.18878],[-86.1659,36.18818],[-86.16167,36.18625],[-86.15386,36.18263],[-86.14109,36.1766],[-86.13068,36.17173],[-86.1291,36.17116],[-86.12792,36.17083],[-86.12667,36.17066],[-86.12487,36.17057],[-86.11871,36.17066],[-86.11699,36.17048],[-86.11562,36.17017],[-86.11013,36.16847],[-86.10425,36.16674],[-86.1027,36.16645],[-86.10137,36.16643],[-86.10008,36.16653],[-86.0986,36.16678],[-86.09751,36.16714],[-86.09418,36.16851],[-86.08176,36.17391],[-86.07972,36.17457],[-86.07801,36.17487],[-86.07614,36.17497],[-86.07446,36.17488],[-86.0727,36.17461],[-86.07204,36.17446],[-86.06693,36.17338],[-86.06545,36.17301],[-86.06393,36.17237],[-86.06298,36.17182],[-86.05996,36.16986],[-86.05914,36.16941],[-86.05809,36.16903],[-86.05698,36.1687],[-86.05605,36.16854],[-86.05432,36.16846],[-86.05294,36.16858],[-86.05118,36.16889],[-86.04395,36.17035],[-86.02758,36.17372],[-86.02385,36.1745],[-86.02086,36.17502],[-86.0176,36.17554],[-86.01648,36.1757],[-86.01061,36.17655],[-86.00719,36.17705],[-86.00498,36.17748],[-86.00461,36.17757],[-86.00383,36.17775],[-85.99747,36.17921],[-85.9932,36.18024],[-85.99187,36.18044],[-85.99054,36.18048],[-85.98891,36.18039],[-85.98222,36.17984],[-85.9695,36.17888],[-85.96873,36.17882],[-85.96267,36.17833],[-85.96149,36.17833],[-85.96052,36.17845],[-85.95623,36.1793],[-85.95443,36.17958],[-85.95316,36.17961],[-85.95179,36.17953],[-85.95085,36.17938],[-85.94794,36.17899],[-85.94732,36.17889],[-85.94405,36.17835],[-85.93553,36.17707],[-85.93472,36.17693],[-85.92806,36.17584],[-85.92445,36.17513],[-85.92222,36.17452],[-85.92123,36.17426],[-85.92068,36.17405],[-85.91796,36.17301],[-85.91028,36.16975],[-85.90922,36.16928],[-85.90394,36.16698],[-85.90092,36.16579],[-85.89849,36.16502],[-85.89535,36.16424],[-85.89396,36.16394],[-85.89348,36.16382],[-85.8907,36.16316],[-85.88786,36.1625],[-85.88728,36.16231],[-85.88675,36.16209],[-85.88618,36.16182],[-85.88569,36.16154],[-85.88471,36.16078],[-85.88277,36.15873],[-85.88067,36.15651],[-85.875,36.15167],[-85.87015,36.14762],[-85.86909,36.14706],[-85.86835,36.14673],[-85.86782,36.14657],[-85.86727,36.14643],[-85.86642,36.14628],[-85.86567,36.14621],[-85.86508,36.14619],[-85.86411,36.1462],[-85.86257,36.14621],[-85.85488,36.14631],[-85.8542,36.14629],[-85.85366,36.14624],[-85.85302,36.14613],[-85.85255,36.14602],[-85.85217,36.14589],[-85.85144,36.14562],[-85.84897,36.1445],[-85.84437,36.14247],[-85.84338,36.14208],[-85.84194,36.14161],[-85.84159,36.1415],[-85.84071,36.14125],[-85.83971,36.14101],[-85.83845,36.14075],[-85.83734,36.14057],[-85.83617,36.14042],[-85.83414,36.14023],[-85.83196,36.14004],[-85.8306,36.13992],[-85.82028,36.13898],[-85.81864,36.13883],[-85.81624,36.13861],[-85.81272,36.13832],[-85.81099,36.13829],[-85.81019,36.13833],[-85.8089,36.13843],[-85.80652,36.13883],[-85.80328,36.13971],[-85.80296,36.13982],[-85.80193,36.14007],[-85.79938,36.14074],[-85.79796,36.14096],[-85.79609,36.14107],[-85.79446,36.14096],[-85.79296,36.14072],[-85.7915,36.14022],[-85.79066,36.13984],[-85.79003,36.13952],[-85.78838,36.13837],[-85.78799,36.13804],[-85.78625,36.13643],[-85.78213,36.13264],[-85.77996,36.1306],[-85.77884,36.12911],[-85.77813,36.12763],[-85.77777,36.12651],[-85.77755,36.12524],[-85.77746,36.12391],[-85.77773,36.12036],[-85.77766,36.11959],[-85.77738,36.11862],[-85.77678,36.11758],[-85.7761,36.11665],[-85.77492,36.11561],[-85.77193,36.1129],[-85.7714,36.11217],[-85.77075,36.11101],[-85.76977,36.10921],[-85.76912,36.10841],[-85.76826,36.10775],[-85.76648,36.10673],[-85.76517,36.10607],[-85.76432,36.10579],[-85.7623,36.10533],[-85.76009,36.105],[-85.75723,36.10458],[-85.75565,36.1042],[-85.75221,36.10337],[-85.74994,36.10269],[-85.74833,36.10205],[-85.74599,36.10096],[-85.74384,36.09978],[-85.73344,36.09385],[-85.72799,36.09078],[-85.72687,36.09029],[-85.72642,36.09014],[-85.72591,36.09002],[-85.72531,36.08992],[-85.72478,36.08986],[-85.72432,36.08984],[-85.72383,36.08985],[-85.72329,36.0899],[-85.72275,36.08999],[-85.72236,36.09008],[-85.72168,36.09026],[-85.72052,36.09074],[-85.71983,36.09123],[-85.71801,36.09279],[-85.71533,36.09506],[-85.71395,36.09614],[-85.71187,36.09754],[-85.70956,36.09888],[-85.70473,36.10151],[-85.693,36.10809],[-85.68962,36.10996],[-85.68874,36.11052],[-85.6882,36.11094],[-85.68726,36.11184],[-85.68662,36.11278],[-85.68611,36.11365],[-85.68578,36.11449],[-85.68556,36.1153],[-85.68512,36.11919],[-85.68481,36.12011],[-85.6843,36.12134],[-85.68372,36.12223],[-85.6828,36.12342],[-85.68185,36.12422],[-85.68037,36.12519],[-85.67917,36.12573],[-85.67728,36.12635],[-85.66949,36.12862],[-85.65861,36.13183],[-85.64928,36.13469],[-85.6488,36.13482],[-85.64563,36.13557],[-85.6428,36.13602],[-85.63761,36.13647],[-85.63234,36.13706],[-85.62897,36.13736],[-85.62831,36.13742],[-85.62511,36.13774],[-85.62248,36.13793],[-85.61823,36.13836],[-85.61583,36.13873],[-85.61332,36.13923],[-85.60943,36.13996],[-85.60617,36.14037],[-85.60336,36.14053],[-85.60124,36.14051],[-85.59531,36.1402],[-85.58841,36.13982],[-85.57484,36.13907],[-85.57229,36.1388],[-85.57042,36.1384],[-85.56815,36.13769],[-85.56628,36.13714],[-85.56596,36.13703],[-85.56186,36.13576],[-85.56012,36.13535],[-85.55819,36.13512],[-85.55665,36.13503],[-85.55399,36.1351],[-85.54976,36.13543],[-85.54598,36.13573],[-85.54289,36.13588],[-85.53661,36.13595],[-85.5344,36.13603],[-85.53321,36.13603],[-85.5269,36.13614],[-85.52335,36.13614],[-85.51759,36.13625],[-85.51579,36.1362],[-85.50691,36.13539],[-85.50552,36.1353],[-85.50336,36.13522],[-85.5025,36.1352],[-85.50137,36.13522],[-85.49938,36.13527],[-85.49734,36.13531],[-85.4929,36.1355],[-85.49105,36.13543],[-85.48562,36.13497],[-85.48469,36.13488],[-85.48135,36.13457],[-85.47889,36.13446],[-85.47659,36.13443],[-85.47473,36.13453],[-85.47427,36.13455],[-85.47179,36.13484],[-85.47099,36.13493],[-85.46331,36.13588],[-85.46067,36.13612],[-85.45902,36.13618],[-85.45741,36.13613],[-85.45448,36.136],[-85.45269,36.13594],[-85.4509,36.13599],[-85.44918,36.13632],[-85.44652,36.13709],[-85.4419,36.1384],[-85.43899,36.13918],[-85.4364,36.1396],[-85.43114,36.13982],[-85.42852,36.13994],[-85.42722,36.14],[-85.42639,36.14004],[-85.42494,36.1401],[-85.42398,36.14021],[-85.42312,36.14038],[-85.42243,36.14057],[-85.42181,36.1408],[-85.42115,36.14109],[-85.42045,36.14148],[-85.41983,36.14194],[-85.41704,36.14412],[-85.41644,36.14453],[-85.41574,36.14493],[-85.41501,36.1453],[-85.4142,36.14565],[-85.41332,36.14597],[-85.4124,36.14618],[-85.41141,36.14639],[-85.41012,36.14649],[-85.40892,36.14649],[-85.40794,36.14642],[-85.4069,36.14625],[-85.40599,36.14604],[-85.39663,36.14311],[-85.39395,36.14222],[-85.39183,36.14164],[-85.39011,36.14139],[-85.38201,36.14155],[-85.38023,36.14168],[-85.37945,36.14181],[-85.3785,36.14208],[-85.37497,36.14331],[-85.37383,36.14368],[-85.3728,36.14388],[-85.37185,36.14395],[-85.37104,36.1439],[-85.37025,36.1438],[-85.36954,36.14363],[-85.3685,36.14325],[-85.36782,36.1429],[-85.36721,36.14245],[-85.36669,36.14196],[-85.3663,36.14153],[-85.36593,36.14097],[-85.36504,36.13935],[-85.36467,36.13868],[-85.36422,36.13802],[-85.36378,36.13752],[-85.36202,36.13566],[-85.36146,36.13507],[-85.3603,36.13369],[-85.3596,36.13283],[-85.35892,36.1321],[-85.35828,36.13154],[-85.35759,36.13104],[-85.35687,36.13062],[-85.35607,36.13022],[-85.35523,36.12989],[-85.35444,36.12966],[-85.35343,36.12944],[-85.35264,36.12935],[-85.35169,36.12929],[-85.35085,36.12932],[-85.34978,36.1294],[-85.34877,36.1296],[-85.34777,36.12987],[-85.34713,36.13009],[-85.34639,36.13043],[-85.34452,36.13135],[-85.34188,36.13263],[-85.34075,36.13318],[-85.33973,36.13369],[-85.33858,36.13425],[-85.33755,36.1347],[-85.33666,36.13505],[-85.33571,36.13535],[-85.33475,36.13564],[-85.33376,36.13588],[-85.33301,36.13602],[-85.33184,36.1362],[-85.33062,36.13633],[-85.32963,36.13638],[-85.32864,36.1364],[-85.32763,36.13637],[-85.32666,36.13631],[-85.32458,36.13604],[-85.31901,36.13526],[-85.31788,36.1351],[-85.31707,36.13501],[-85.31637,36.13498],[-85.31574,36.135],[-85.31491,36.13509],[-85.31425,36.13524],[-85.3136,36.13544],[-85.31301,36.13571],[-85.31256,36.13594],[-85.31209,36.13621],[-85.31161,36.13657],[-85.31125,36.13689],[-85.30891,36.13919],[-85.30845,36.13957],[-85.30801,36.13988],[-85.30754,36.14015],[-85.30697,36.14041],[-85.30648,36.1406],[-85.30581,36.14078],[-85.30525,36.14089],[-85.30464,36.14096],[-85.30403,36.14098],[-85.30322,36.14093],[-85.30254,36.14083],[-85.30154,36.14063],[-85.29928,36.14017],[-85.29773,36.13985],[-85.29685,36.13973],[-85.29608,36.13967],[-85.29529,36.13966],[-85.29457,36.1397],[-85.29291,36.13985],[-85.29124,36.14003],[-85.29047,36.14009],[-85.28971,36.14011],[-85.28882,36.14006],[-85.28808,36.13997],[-85.28721,36.13985],[-85.28653,36.13977],[-85.28634,36.13975],[-85.28533,36.13961],[-85.28397,36.13944],[-85.28336,36.13939],[-85.28275,36.13939],[-85.28216,36.13942],[-85.28142,36.1395],[-85.28041,36.13966],[-85.27863,36.13993],[-85.27851,36.13995],[-85.27746,36.1401],[-85.27662,36.1402],[-85.27539,36.14027],[-85.27434,36.14026],[-85.2734,36.1402],[-85.2726,36.14012],[-85.27146,36.13994],[-85.27001,36.13959],[-85.26902,36.13928],[-85.26833,36.13903],[-85.26726,36.13856],[-85.26674,36.1383],[-85.26592,36.13785],[-85.26475,36.13711],[-85.26448,36.13685],[-85.26363,36.13616],[-85.2631,36.13568],[-85.26259,36.13515],[-85.26215,36.13465],[-85.25927,36.13079],[-85.25846,36.12969],[-85.25712,36.12791],[-85.25506,36.12506],[-85.25248,36.12168],[-85.2518,36.1209],[-85.24997,36.1192],[-85.24523,36.11494],[-85.24442,36.11423],[-85.24375,36.11364],[-85.24272,36.11272],[-85.24199,36.11199],[-85.24139,36.11122],[-85.24111,36.11077],[-85.24066,36.11006],[-85.24019,36.10886],[-85.23983,36.10763],[-85.23971,36.10712],[-85.23908,36.10478],[-85.23856,36.1034],[-85.23807,36.10237],[-85.23748,36.10136],[-85.23704,36.10073],[-85.23658,36.10009],[-85.23628,36.0997],[-85.23593,36.09933],[-85.23397,36.09734],[-85.22988,36.09321],[-85.22813,36.09145],[-85.2272,36.09059],[-85.22605,36.08961],[-85.22493,36.08873],[-85.22425,36.08823],[-85.22365,36.08781],[-85.2231,36.08746],[-85.22176,36.08664],[-85.21244,36.08104],[-85.21135,36.08032],[-85.20859,36.07879],[-85.20782,36.07833],[-85.20691,36.07779],[-85.20521,36.07678],[-85.20377,36.07593],[-85.203,36.07549],[-85.20221,36.07506],[-85.2006,36.07422],[-85.19839,36.07312],[-85.19677,36.07223],[-85.19417,36.07067],[-85.19349,36.07022],[-85.19282,36.06975],[-85.19149,36.06879],[-85.19031,36.06782],[-85.18973,36.06732],[-85.18918,36.06682],[-85.188,36.06573],[-85.18684,36.06457],[-85.1844,36.06201],[-85.18212,36.05986],[-85.1807,36.05857],[-85.1791,36.05724],[-85.17732,36.05607],[-85.17615,36.05536],[-85.17488,36.05472],[-85.17348,36.05408],[-85.1725,36.0537],[-85.1715,36.05333],[-85.17041,36.05298],[-85.1693,36.05267],[-85.16748,36.05226],[-85.16358,36.0516],[-85.15865,36.05079],[-85.15295,36.04988],[-85.14882,36.04921],[-85.14562,36.04865],[-85.14086,36.04789],[-85.13849,36.04748],[-85.1361,36.047],[-85.13055,36.04585],[-85.12504,36.04471],[-85.11835,36.04332],[-85.11634,36.04275],[-85.11464,36.04207],[-85.11324,36.0414],[-85.10952,36.03958],[-85.10761,36.03852],[-85.09801,36.03267],[-85.08801,36.02654],[-85.08303,36.0235],[-85.08054,36.02197],[-85.07808,36.02037],[-85.06925,36.01454],[-85.06867,36.01416],[-85.06811,36.01375],[-85.0635,36.01071],[-85.06122,36.00919],[-85.05888,36.00769],[-85.05719,36.00671],[-85.05513,36.00565],[-85.05493,36.00555],[-85.04898,36.00249],[-85.04845,36.00223],[-85.04268,35.99914],[-85.04116,35.99834],[-85.04015,35.99779],[-85.036,35.99567],[-85.03544,35.99538],[-85.03424,35.99477],[-85.0313,35.99313],[-85.02643,35.99059],[-85.02398,35.98929],[-85.01997,35.98681],[-85.01671,35.98465],[-85.01354,35.98255],[-85.01184,35.98144],[-85.01137,35.98113],[-85.00987,35.98014],[-85.00474,35.97674],[-85.00078,35.97413],[-84.99402,35.96967],[-84.99176,35.96823],[-84.98985,35.96692],[-84.98518,35.96383],[-84.9794,35.96003],[-84.979,35.95976],[-84.97827,35.95932],[-84.97761,35.95897],[-84.97692,35.95866],[-84.97622,35.95838],[-84.97522,35.95805],[-84.97446,35.95786],[-84.97341,35.95765],[-84.97252,35.95753],[-84.97172,35.95746],[-84.97068,35.95742],[-84.96492,35.95728],[-84.96318,35.95723],[-84.96261,35.9572],[-84.96196,35.95711],[-84.96139,35.95699],[-84.96079,35.95681],[-84.96026,35.9566],[-84.95979,35.95638],[-84.95609,35.95442],[-84.95394,35.9533],[-84.95165,35.9522],[-84.94972,35.95136],[-84.94579,35.94943],[-84.94558,35.94933],[-84.9442,35.94866],[-84.94293,35.94807],[-84.94125,35.94727],[-84.94003,35.94667],[-84.93538,35.94449],[-84.93245,35.94265],[-84.92965,35.93979],[-84.92862,35.93853],[-84.92678,35.9367],[-84.9235,35.93332],[-84.91902,35.92943],[-84.91625,35.92686],[-84.91477,35.92571],[-84.91389,35.92492],[-84.91122,35.92251],[-84.90744,35.91915],[-84.90376,35.9165],[-84.90251,35.91577],[-84.90151,35.91537],[-84.89641,35.91313],[-84.89373,35.91209],[-84.89282,35.91174],[-84.89201,35.91142],[-84.89,35.91058],[-84.88925,35.91026],[-84.87963,35.90624],[-84.87657,35.90496],[-84.87405,35.90407],[-84.87333,35.90377],[-84.87222,35.9033],[-84.87078,35.90271],[-84.87021,35.9025],[-84.86967,35.90234],[-84.86909,35.90217],[-84.86852,35.90199],[-84.86809,35.90189],[-84.86689,35.90169],[-84.86631,35.90162],[-84.8657,35.90156],[-84.86521,35.90152],[-84.86472,35.90151],[-84.86431,35.90152],[-84.86353,35.9015],[-84.86251,35.90154],[-84.86177,35.90157],[-84.86085,35.90158],[-84.86026,35.9016],[-84.8597,35.90162],[-84.85902,35.90154],[-84.85864,35.90146],[-84.85826,35.90137],[-84.85775,35.90118],[-84.85728,35.90097],[-84.8547,35.8994],[-84.85339,35.8986],[-84.85271,35.89819],[-84.85228,35.89793],[-84.85181,35.89769],[-84.85138,35.8975],[-84.85093,35.89733],[-84.85044,35.89718],[-84.84994,35.89707],[-84.84931,35.89695],[-84.84879,35.89689],[-84.84757,35.89678],[-84.84662,35.89665],[-84.84585,35.89648],[-84.84509,35.89619],[-84.84472,35.89601],[-84.84437,35.89581],[-84.84382,35.89541],[-84.84343,35.89504],[-84.84316,35.89471],[-84.84255,35.89372],[-84.84218,35.89308],[-84.84112,35.89126],[-84.84044,35.89025],[-84.83974,35.88947],[-84.83882,35.88882],[-84.83829,35.88853],[-84.83773,35.88832],[-84.8367,35.88803],[-84.83388,35.88759],[-84.82957,35.88692],[-84.8276,35.8865],[-84.82625,35.88613],[-84.82497,35.88572],[-84.82208,35.88459],[-84.81919,35.88343],[-84.81838,35.88317],[-84.81768,35.883],[-84.81696,35.88292],[-84.81654,35.88287],[-84.81565,35.88291],[-84.81457,35.88307],[-84.81376,35.88333],[-84.8113,35.88426],[-84.81074,35.88448],[-84.8082,35.88543],[-84.80696,35.8859],[-84.80637,35.88619],[-84.80581,35.8865],[-84.80471,35.88724],[-84.8038,35.88806],[-84.80297,35.88885],[-84.80213,35.88961],[-84.80144,35.89013],[-84.80094,35.89045],[-84.79997,35.89092],[-84.79862,35.89169],[-84.79801,35.89217],[-84.79749,35.89273],[-84.79717,35.89318],[-84.79691,35.89365],[-84.7967,35.89423],[-84.79659,35.89484],[-84.79642,35.89612],[-84.7964,35.89648],[-84.7963,35.89702],[-84.79613,35.89753],[-84.79573,35.8982],[-84.79523,35.8988],[-84.79482,35.89917],[-84.7944,35.89947],[-84.79382,35.8998],[-84.79323,35.90006],[-84.79253,35.90025],[-84.79182,35.90036],[-84.79106,35.90041],[-84.79027,35.90042],[-84.78923,35.90043],[-84.77662,35.90048],[-84.77511,35.90044],[-84.77395,35.90023],[-84.77316,35.90001],[-84.77075,35.89933],[-84.76508,35.89756],[-84.76213,35.89665],[-84.76055,35.89617],[-84.75549,35.89459],[-84.75402,35.89413],[-84.75269,35.89372],[-84.75122,35.89327],[-84.75016,35.89295],[-84.74984,35.89286],[-84.74855,35.89255],[-84.74731,35.8923],[-84.74607,35.89212],[-84.74481,35.89199],[-84.74253,35.89184],[-84.74041,35.89184],[-84.738,35.89209],[-84.73745,35.89216],[-84.73585,35.89243],[-84.73377,35.89291],[-84.73232,35.89333],[-84.73094,35.89375],[-84.73068,35.89385],[-84.7284,35.89476],[-84.72733,35.89513],[-84.7271,35.89521],[-84.72686,35.8953],[-84.72403,35.89628],[-84.72205,35.89701],[-84.72029,35.89757],[-84.71851,35.89792],[-84.71679,35.89819],[-84.71572,35.89829],[-84.71463,35.89836],[-84.71267,35.89837],[-84.7115,35.89829],[-84.71029,35.89818],[-84.70803,35.89783],[-84.70643,35.89745],[-84.70488,35.89698],[-84.70423,35.89676],[-84.70212,35.89593],[-84.70121,35.89545],[-84.69998,35.89475],[-84.69834,35.89369],[-84.69755,35.89304],[-84.69655,35.89215],[-84.69509,35.89057],[-84.69344,35.88873],[-84.69216,35.88738],[-84.69144,35.88678],[-84.6907,35.88632],[-84.6899,35.88595],[-84.68946,35.88577],[-84.68895,35.8856],[-84.68844,35.88547],[-84.68805,35.8854],[-84.68748,35.88532],[-84.68683,35.88528],[-84.68629,35.8853],[-84.68564,35.88536],[-84.68498,35.88543],[-84.68399,35.88565],[-84.68313,35.8859],[-84.68239,35.88619],[-84.68161,35.88649],[-84.67911,35.88774],[-84.67593,35.8894],[-84.67488,35.88996],[-84.67446,35.89023],[-84.6737,35.89085],[-84.67294,35.89135],[-84.67249,35.89162],[-84.67198,35.89183],[-84.67122,35.89213],[-84.66951,35.89272],[-84.66874,35.893],[-84.66813,35.89331],[-84.66713,35.89382],[-84.66652,35.89412],[-84.66589,35.89437],[-84.66541,35.89449],[-84.66495,35.89457],[-84.66439,35.89464],[-84.66319,35.89472],[-84.66199,35.89483],[-84.66126,35.895],[-84.66053,35.8952],[-84.65892,35.89565],[-84.65776,35.89586],[-84.65667,35.89605],[-84.65587,35.89621],[-84.65516,35.89638],[-84.65442,35.89663],[-84.65368,35.89698],[-84.65285,35.89739],[-84.65225,35.89768],[-84.65164,35.89792],[-84.6509,35.89816],[-84.65024,35.89832],[-84.64966,35.89844],[-84.64911,35.89851],[-84.64725,35.89869],[-84.64352,35.89903],[-84.63905,35.89942],[-84.63794,35.89961],[-84.63574,35.89995],[-84.63424,35.90021],[-84.63129,35.90109],[-84.62954,35.90161],[-84.62853,35.90202],[-84.62768,35.90252],[-84.62604,35.9035],[-84.62537,35.90379],[-84.62446,35.90407],[-84.62335,35.90421],[-84.6223,35.90433],[-84.62145,35.90449],[-84.62069,35.90466],[-84.61973,35.90499],[-84.6189,35.90534],[-84.61729,35.90621],[-84.61474,35.90765],[-84.61246,35.90911],[-84.6111,35.90993],[-84.60946,35.91087],[-84.60849,35.91128],[-84.60758,35.91156],[-84.60643,35.91184],[-84.60458,35.91228],[-84.60304,35.91265],[-84.60237,35.91279],[-84.60155,35.91287],[-84.60018,35.91284],[-84.59769,35.9127],[-84.59665,35.91259],[-84.59578,35.91243],[-84.59535,35.91233],[-84.59501,35.91222],[-84.5944,35.91199],[-84.5935,35.91162],[-84.59203,35.91089],[-84.59136,35.9106],[-84.59064,35.91039],[-84.5894,35.91008],[-84.58884,35.90995],[-84.58682,35.90951],[-84.58653,35.90944],[-84.58558,35.90925],[-84.58478,35.90915],[-84.58405,35.90912],[-84.58313,35.90916],[-84.58163,35.90927],[-84.58081,35.9093],[-84.57994,35.90928],[-84.5791,35.90914],[-84.57819,35.90884],[-84.5774,35.90846],[-84.57673,35.90793],[-84.57618,35.9074],[-84.57567,35.90667],[-84.57481,35.90507],[-84.57435,35.90441],[-84.57375,35.90379],[-84.57306,35.9033],[-84.57221,35.90286],[-84.57117,35.90253],[-84.57013,35.90237],[-84.56091,35.90113],[-84.55976,35.90098],[-84.55637,35.90052],[-84.55549,35.90039],[-84.55476,35.90025],[-84.55411,35.90003],[-84.55337,35.89968],[-84.55263,35.8992],[-84.55211,35.89873],[-84.55166,35.89817],[-84.55101,35.89728],[-84.55066,35.89684],[-84.55035,35.89652],[-84.54988,35.89615],[-84.54933,35.8958],[-84.54869,35.89549],[-84.54795,35.89525],[-84.54725,35.89509],[-84.54661,35.89501],[-84.5459,35.89501],[-84.54522,35.89507],[-84.54452,35.89518],[-84.54186,35.89566],[-84.54113,35.89578],[-84.54057,35.89584],[-84.53993,35.89587],[-84.5393,35.89585],[-84.53859,35.89578],[-84.53796,35.89567],[-84.53726,35.89551],[-84.53663,35.89529],[-84.53594,35.89499],[-84.53512,35.89459],[-84.53468,35.89437],[-84.52918,35.89169],[-84.52653,35.89039],[-84.52242,35.88838],[-84.51934,35.88686],[-84.51418,35.88429],[-84.51297,35.88361],[-84.50908,35.88138],[-84.50868,35.88113],[-84.50819,35.88085],[-84.50729,35.88035],[-84.50496,35.87907],[-84.50369,35.87832],[-84.50272,35.87767],[-84.50187,35.87697],[-84.49983,35.87498],[-84.49884,35.8741],[-84.49795,35.87353],[-84.49684,35.87297],[-84.49561,35.87248],[-84.49452,35.87216],[-84.49319,35.8719],[-84.49163,35.87178],[-84.49015,35.87185],[-84.48592,35.87203],[-84.48094,35.87228],[-84.47676,35.87247],[-84.47149,35.87272],[-84.46672,35.87291],[-84.4594,35.87324],[-84.45842,35.87328],[-84.45639,35.87339],[-84.45502,35.87339],[-84.45385,35.87338],[-84.45254,35.87331],[-84.45104,35.87316],[-84.45,35.87301],[-84.44833,35.8727],[-84.44711,35.87242],[-84.44536,35.87194],[-84.44423,35.87153],[-84.44359,35.87129],[-84.44178,35.87054],[-84.44071,35.87002],[-84.43705,35.86812],[-84.4344,35.86673],[-84.43338,35.86634],[-84.43233,35.86601],[-84.43124,35.86579],[-84.42639,35.86509],[-84.41684,35.86376],[-84.41569,35.86357],[-84.41431,35.86324],[-84.41342,35.86294],[-84.41151,35.8621],[-84.41005,35.86144],[-84.40874,35.86095],[-84.40749,35.86058],[-84.40685,35.86043],[-84.4055,35.86021],[-84.40423,35.86008],[-84.40308,35.86005],[-84.40165,35.86015],[-84.40057,35.86028],[-84.39926,35.86056],[-84.39815,35.86088],[-84.39701,35.86129],[-84.39572,35.86189],[-84.39078,35.86429],[-84.38704,35.86612],[-84.38452,35.86735],[-84.37891,35.87013],[-84.37355,35.87271],[-84.37231,35.87331],[-84.37066,35.87409],[-84.36612,35.87626],[-84.36406,35.87731],[-84.36178,35.87833],[-84.3565,35.87991],[-84.35504,35.88024],[-84.35335,35.88053],[-84.35178,35.88073],[-84.35027,35.88087],[-84.34868,35.88096],[-84.34716,35.88099],[-84.34549,35.88097],[-84.34366,35.88085],[-84.34179,35.88067],[-84.33958,35.88033],[-84.338,35.87999],[-84.33588,35.87946],[-84.33481,35.87914],[-84.33348,35.8787],[-84.33297,35.87851],[-84.33221,35.87822],[-84.32909,35.87683],[-84.32766,35.8762],[-84.32464,35.87484],[-84.32412,35.8746],[-84.32112,35.87327],[-84.32034,35.87289],[-84.32012,35.87278],[-84.31998,35.87272],[-84.3191,35.87234],[-84.31682,35.87129],[-84.31585,35.87088],[-84.31262,35.86977],[-84.31162,35.86948],[-84.30993,35.86909],[-84.30793,35.86877],[-84.30649,35.86863],[-84.30499,35.86855],[-84.30346,35.86853],[-84.30196,35.86859],[-84.30037,35.86871],[-84.29976,35.86876],[-84.29499,35.86918],[-84.28103,35.87033],[-84.27477,35.87087],[-84.26993,35.87126],[-84.2693,35.87131],[-84.26861,35.87136],[-84.26789,35.87138],[-84.26715,35.87138],[-84.26629,35.87133],[-84.26516,35.87117],[-84.26426,35.87099],[-84.26318,35.87069],[-84.26269,35.87055],[-84.26196,35.8703],[-84.2604,35.8698],[-84.25919,35.86939],[-84.25844,35.86918],[-84.258,35.86909],[-84.25735,35.86899],[-84.25672,35.86897],[-84.25628,35.86898],[-84.25551,35.86906],[-84.25471,35.86921],[-84.25406,35.86941],[-84.25355,35.86963],[-84.25235,35.87027],[-84.25109,35.87111],[-84.24998,35.87177],[-84.2484,35.87272],[-84.2437,35.87508],[-84.24281,35.8755],[-84.24061,35.87656],[-84.23996,35.87688],[-84.23613,35.87871],[-84.23384,35.87982],[-84.2326,35.88039],[-84.2323,35.88054],[-84.22523,35.88393],[-84.22351,35.88468],[-84.2221,35.88522],[-84.221,35.88566],[-84.21803,35.88678],[-84.21634,35.88738],[-84.21508,35.88781],[-84.21358,35.88837],[-84.21267,35.88871],[-84.21199,35.88896],[-84.21052,35.8895],[-84.20814,35.89027],[-84.20659,35.89072],[-84.20527,35.89109],[-84.2029,35.89169],[-84.1961,35.89338],[-84.19422,35.89381],[-84.19032,35.89483],[-84.18558,35.89599],[-84.18139,35.89702],[-84.1813,35.89705],[-84.17863,35.89772],[-84.17535,35.89856],[-84.17488,35.89868],[-84.17172,35.89944],[-84.17129,35.89954],[-84.16917,35.90008],[-84.16415,35.90134],[-84.16058,35.90221],[-84.15693,35.90312],[-84.15382,35.9039],[-84.15037,35.90476],[-84.14884,35.90513],[-84.14644,35.90574],[-84.14489,35.90611],[-84.14293,35.90655],[-84.13907,35.9074],[-84.13844,35.90751],[-84.13566,35.90813],[-84.13224,35.90888],[-84.12948,35.90951],[-84.12631,35.9102],[-84.12456,35.91058],[-84.1228,35.91098],[-84.11744,35.91215],[-84.11663,35.91232],[-84.11166,35.9134],[-84.10906,35.91397],[-84.10751,35.91431],[-84.10344,35.91522],[-84.09746,35.91652],[-84.09655,35.91674],[-84.09112,35.91797],[-84.09022,35.91814],[-84.08215,35.91991],[-84.07588,35.9213],[-84.07459,35.92159],[-84.06957,35.92269],[-84.06884,35.92286],[-84.06424,35.92388],[-84.0639,35.92395],[-84.05663,35.92553],[-84.05334,35.92625],[-84.05235,35.92647],[-84.05162,35.92663],[-84.04335,35.92846],[-84.04256,35.92863],[-84.03977,35.92925],[-84.03914,35.92939],[-84.03717,35.92982],[-84.03658,35.92995],[-84.03362,35.9306],[-84.0321,35.93093],[-84.03018,35.93135],[-84.02312,35.93291],[-84.02256,35.93303],[-84.01859,35.9339],[-84.01706,35.93432],[-84.0164,35.93454],[-84.01577,35.93476],[-84.0149,35.93512],[-84.0143,35.93538],[-84.0137,35.93568],[-84.00955,35.93785],[-84.00883,35.93823],[-84.00662,35.93941],[-84.00263,35.94149],[-84.00213,35.94175],[-84.00099,35.94234],[-83.99972,35.94313],[-83.99907,35.94358],[-83.99873,35.94384],[-83.99821,35.94425],[-83.99757,35.94477],[-83.99682,35.94535],[-83.99634,35.94568],[-83.99575,35.94607],[-83.99517,35.94642],[-83.9942,35.94691],[-83.99338,35.9473],[-83.99235,35.94772],[-83.99124,35.94816],[-83.98906,35.94883],[-83.98697,35.94948],[-83.98458,35.95021],[-83.98379,35.95047],[-83.98243,35.95099],[-83.98204,35.95116],[-83.98106,35.95161],[-83.97704,35.95376],[-83.97461,35.95503],[-83.97274,35.95594],[-83.97166,35.9565],[-83.96958,35.95759],[-83.96852,35.95811],[-83.96785,35.95838],[-83.96709,35.95862],[-83.96632,35.9588],[-83.96561,35.95892],[-83.9648,35.95899],[-83.96418,35.95903],[-83.96243,35.95908],[-83.96082,35.95916],[-83.95999,35.95926],[-83.959,35.95948],[-83.95806,35.95975],[-83.9572,35.96008],[-83.95559,35.96085],[-83.95331,35.96198],[-83.95219,35.96252],[-83.95121,35.963],[-83.95049,35.96329],[-83.94972,35.96349],[-83.94894,35.9636],[-83.94834,35.96362],[-83.94774,35.96359],[-83.94719,35.96353],[-83.94645,35.9634],[-83.94602,35.96331],[-83.94578,35.96326],[-83.94538,35.96318],[-83.94505,35.96311],[-83.94286,35.96265],[-83.94255,35.9626],[-83.94217,35.96255],[-83.94144,35.96255],[-83.94081,35.96262],[-83.94015,35.96276],[-83.93958,35.96294],[-83.93917,35.96305],[-83.93657,35.96393],[-83.93617,35.96407],[-83.93564,35.96426],[-83.93433,35.96471],[-83.93373,35.96496],[-83.93309,35.96531],[-83.93263,35.96562],[-83.93217,35.96598],[-83.93155,35.96653],[-83.93088,35.96718],[-83.93049,35.96751],[-83.93007,35.96781],[-83.9296,35.9681],[-83.92915,35.96836],[-83.92866,35.96858],[-83.92818,35.96879],[-83.92771,35.96898],[-83.92659,35.9694],[-83.9251,35.96994],[-83.92381,35.97037],[-83.92326,35.97062],[-83.9227,35.97092],[-83.92204,35.97137],[-83.92145,35.97187],[-83.92099,35.97235],[-83.92078,35.97261],[-83.92031,35.97315],[-83.91945,35.97414],[-83.9189,35.97483],[-83.91858,35.97527],[-83.91845,35.97547],[-83.91834,35.97569],[-83.91815,35.97618],[-83.91806,35.97659],[-83.91803,35.97699],[-83.91805,35.97738],[-83.9181,35.97791],[-83.91838,35.97906],[-83.91844,35.97942],[-83.91847,35.9796],[-83.91851,35.97984],[-83.91855,35.98032],[-83.91851,35.98078],[-83.91842,35.98118],[-83.91822,35.98175],[-83.91803,35.98214],[-83.91777,35.98253],[-83.91749,35.98286],[-83.91715,35.98323],[-83.91674,35.98355],[-83.91615,35.98389],[-83.91572,35.98409],[-83.91515,35.98429],[-83.91475,35.98443],[-83.91425,35.98457],[-83.9135,35.98478],[-83.9124,35.9851],[-83.91091,35.98548],[-83.91017,35.98573],[-83.9095,35.98597],[-83.90861,35.98635],[-83.9074,35.98695],[-83.90679,35.98733],[-83.90606,35.98785],[-83.90411,35.98929],[-83.90362,35.98964],[-83.90237,35.99051],[-83.90107,35.99145],[-83.90069,35.99175],[-83.9002,35.99209],[-83.89809,35.99362],[-83.894,35.99653],[-83.89019,35.99927],[-83.88878,36.00024],[-83.88754,36.001],[-83.88646,36.00161],[-83.8857,36.00201],[-83.88479,36.00247],[-83.88418,36.00274],[-83.87792,36.00548],[-83.87405,36.00715],[-83.8736,36.00734],[-83.87339,36.00743],[-83.87091,36.00857],[-83.86914,36.00934],[-83.8674,36.01008],[-83.86598,36.01072],[-83.86501,36.01114],[-83.86298,36.01203],[-83.86111,36.01289],[-83.8602,36.01322],[-83.85952,36.01339],[-83.85916,36.01346],[-83.85882,36.01349],[-83.85827,36.01351],[-83.85768,36.01349],[-83.85676,36.01338],[-83.85454,36.01299],[-83.85415,36.01292],[-83.85063,36.01238],[-83.84862,36.0121],[-83.84666,36.01186],[-83.84479,36.01163],[-83.844,36.01146],[-83.84335,36.01126],[-83.84272,36.01103],[-83.84182,36.01058],[-83.8414,36.01036],[-83.8388,36.00899],[-83.83853,36.00886],[-83.83779,36.00848],[-83.837,36.00808],[-83.836,36.00761],[-83.83509,36.00732],[-83.83428,36.00715],[-83.83352,36.00707],[-83.83289,36.00705],[-83.83212,36.00711],[-83.83137,36.00721],[-83.83066,36.00739],[-83.82952,36.00769],[-83.82843,36.00798],[-83.82748,36.00826],[-83.82563,36.00875],[-83.82458,36.009],[-83.82387,36.00918],[-83.82337,36.00929],[-83.8228,36.00937],[-83.82242,36.00941],[-83.82171,36.00946],[-83.82113,36.00946],[-83.82028,36.00943],[-83.81935,36.00932],[-83.8187,36.00918],[-83.81735,36.00883],[-83.81451,36.00802],[-83.8134,36.00771],[-83.81267,36.00751],[-83.81134,36.00718],[-83.81024,36.00694],[-83.80866,36.00664],[-83.80769,36.0065],[-83.80399,36.00594],[-83.80024,36.00539],[-83.79492,36.0046],[-83.79068,36.00397],[-83.78487,36.00313],[-83.78305,36.00291],[-83.78096,36.00275],[-83.78019,36.00272],[-83.77804,36.0027],[-83.7758,36.00277],[-83.7748,36.00283],[-83.77394,36.00291],[-83.77187,36.00311],[-83.77116,36.00322],[-83.76835,36.00354],[-83.76705,36.00368],[-83.76641,36.00375],[-83.76568,36.00383],[-83.75747,36.00475],[-83.75456,36.00498],[-83.75183,36.00505],[-83.75043,36.00502],[-83.74934,36.00495],[-83.74752,36.00482],[-83.74631,36.00468],[-83.74524,36.00454],[-83.74362,36.00424],[-83.74233,36.00399],[-83.74083,36.00364],[-83.73982,36.00337],[-83.73851,36.003],[-83.73679,36.00242],[-83.73538,36.0019],[-83.73414,36.0014],[-83.72983,35.99968],[-83.72872,35.99927],[-83.72774,35.99893],[-83.72632,35.99849],[-83.725,35.99813],[-83.72267,35.99759],[-83.7221,35.99747],[-83.72156,35.99737],[-83.72011,35.99714],[-83.71912,35.99699],[-83.71728,35.99681],[-83.71594,35.9967],[-83.71415,35.99662],[-83.71241,35.99662],[-83.70696,35.99658],[-83.7041,35.99656],[-83.6999,35.99654],[-83.6993,35.99654],[-83.69459,35.99649],[-83.69186,35.99638],[-83.69002,35.99624],[-83.68928,35.99618],[-83.68839,35.9961],[-83.68598,35.99585],[-83.6846,35.99566],[-83.68275,35.99539],[-83.68114,35.99513],[-83.68053,35.99503],[-83.67864,35.99466],[-83.67628,35.99415],[-83.67475,35.99378],[-83.67247,35.99319],[-83.67106,35.99279],[-83.66941,35.99229],[-83.66791,35.99179],[-83.66002,35.98907],[-83.65841,35.98852],[-83.65645,35.98791],[-83.65494,35.98747],[-83.65293,35.98695],[-83.65145,35.98657],[-83.65016,35.98629],[-83.64866,35.98596],[-83.64673,35.98558],[-83.64488,35.98526],[-83.64435,35.98518],[-83.63495,35.98364],[-83.63258,35.98326],[-83.63174,35.98313],[-83.628,35.98251],[-83.62733,35.98241],[-83.62671,35.98233],[-83.62601,35.98225],[-83.62536,35.98218],[-83.62444,35.9821],[-83.62339,35.98203],[-83.62228,35.98198],[-83.62128,35.98196],[-83.62019,35.98196],[-83.61876,35.982],[-83.61757,35.98207],[-83.61681,35.98212],[-83.61495,35.98233],[-83.61387,35.98251],[-83.61214,35.9827],[-83.60292,35.98397],[-83.59976,35.98437],[-83.59648,35.98459],[-83.59392,35.98474],[-83.59136,35.98491],[-83.58992,35.98504],[-83.58903,35.98517],[-83.58827,35.9853],[-83.58723,35.98549],[-83.58639,35.98566],[-83.58485,35.98608],[-83.58435,35.98624],[-83.58207,35.98706],[-83.57679,35.98914],[-83.56481,35.99385],[-83.56434,35.99404],[-83.53415,36.00585],[-83.52515,36.00941],[-83.52267,36.01036],[-83.52055,36.0111],[-83.51924,36.01151],[-83.51786,36.01192],[-83.51597,36.01243],[-83.50698,36.01477],[-83.49688,36.0174],[-83.48646,36.02012],[-83.48007,36.02179],[-83.47654,36.02272],[-83.47575,36.02293],[-83.47053,36.02427],[-83.46785,36.02507],[-83.46447,36.02635],[-83.46215,36.02754],[-83.45973,36.02894],[-83.45734,36.03068],[-83.45547,36.03179],[-83.45446,36.03244],[-83.45258,36.0332],[-83.45112,36.0338],[-83.44527,36.03625],[-83.44078,36.03819],[-83.43966,36.03866],[-83.43605,36.04015],[-83.43059,36.0425],[-83.42759,36.04382],[-83.42543,36.04486],[-83.42246,36.04637],[-83.41858,36.04853],[-83.41807,36.04883],[-83.41631,36.04989],[-83.41426,36.05121],[-83.4095,36.05427],[-83.3972,36.06215],[-83.39658,36.06255],[-83.39431,36.064],[-83.39138,36.06587],[-83.39091,36.06616],[-83.39058,36.06635],[-83.39031,36.06649],[-83.38998,36.06663],[-83.38957,36.06678],[-83.38927,36.06688],[-83.38901,36.06695],[-83.38876,36.06702],[-83.38835,36.06715],[-83.38783,36.06729],[-83.38751,36.06737],[-83.38696,36.06751],[-83.38666,36.06761],[-83.38629,36.06774],[-83.38606,36.06784],[-83.3856,36.06806],[-83.38525,36.06824],[-83.38493,36.06842],[-83.3846,36.06864],[-83.38431,36.06885],[-83.38408,36.06903],[-83.38378,36.06929],[-83.38351,36.06956],[-83.38323,36.06989],[-83.38285,36.07039],[-83.38236,36.07105],[-83.38209,36.0714],[-83.38184,36.07171],[-83.38154,36.07201],[-83.38133,36.0722],[-83.38106,36.07242],[-83.38072,36.07266],[-83.38008,36.07308],[-83.37496,36.07636],[-83.37379,36.07711],[-83.37221,36.07813],[-83.37034,36.07931],[-83.36965,36.07974],[-83.36613,36.08187],[-83.36375,36.08331],[-83.36302,36.08379],[-83.36225,36.08429],[-83.36127,36.08497],[-83.36048,36.08552],[-83.35981,36.08603],[-83.35855,36.08696],[-83.3576,36.08771],[-83.35699,36.08821],[-83.35616,36.08891],[-83.35518,36.08974],[-83.3543,36.09051],[-83.35366,36.09109],[-83.353,36.0917],[-83.35196,36.09271],[-83.35076,36.09393],[-83.34933,36.09539],[-83.34806,36.09667],[-83.34632,36.09846],[-83.34491,36.09988],[-83.34265,36.10221],[-83.33887,36.10606],[-83.33767,36.10726],[-83.3364,36.10856],[-83.33589,36.10908],[-83.33384,36.11113],[-83.33184,36.11317],[-83.33089,36.11411],[-83.32742,36.11762],[-83.32671,36.11831],[-83.32602,36.11896],[-83.32536,36.11956],[-83.32469,36.12015],[-83.32404,36.1207],[-83.32329,36.12132],[-83.3224,36.12201],[-83.32156,36.12266],[-83.32084,36.12318],[-83.31982,36.1239],[-83.31905,36.12441],[-83.31798,36.12511],[-83.31677,36.12584],[-83.31603,36.12628],[-83.31517,36.12676],[-83.3145,36.12712],[-83.31362,36.12759],[-83.31281,36.128],[-83.31177,36.12851],[-83.31109,36.12882],[-83.31027,36.1292],[-83.30949,36.12954],[-83.30853,36.12993],[-83.30742,36.13037],[-83.30709,36.13049],[-83.30617,36.13084],[-83.30536,36.13113],[-83.30426,36.1315],[-83.30329,36.13181],[-83.30228,36.13212],[-83.30097,36.13249],[-83.29994,36.13277],[-83.29859,36.13311],[-83.2976,36.13335],[-83.29673,36.13355],[-83.29539,36.13384],[-83.29438,36.13403],[-83.29329,36.13421],[-83.28752,36.13523],[-83.28656,36.13539],[-83.28546,36.13559],[-83.28303,36.13602],[-83.2826,36.1361],[-83.28022,36.13652],[-83.27856,36.13685],[-83.2768,36.13724],[-83.27529,36.13761],[-83.2739,36.13797],[-83.27287,36.13825],[-83.27205,36.13848],[-83.27158,36.13862],[-83.27032,36.13899],[-83.26915,36.13937],[-83.26804,36.13974],[-83.26696,36.14011],[-83.26571,36.14056],[-83.26483,36.14089],[-83.26354,36.1414],[-83.26282,36.14169],[-83.26169,36.14217],[-83.26034,36.14276],[-83.25946,36.14317],[-83.25806,36.14383],[-83.25709,36.14432],[-83.2562,36.14477],[-83.25527,36.14525],[-83.25494,36.14543],[-83.25368,36.14612],[-83.25273,36.14667],[-83.25159,36.14734],[-83.25034,36.14811],[-83.24738,36.14995],[-83.24453,36.15173],[-83.23784,36.15589],[-83.2334,36.15865],[-83.22898,36.16139],[-83.22311,36.16504],[-83.22255,36.1654],[-83.22181,36.16584],[-83.21548,36.16977],[-83.21167,36.17214],[-83.20285,36.17762],[-83.19331,36.18352],[-83.19284,36.18382],[-83.18958,36.18585],[-83.18775,36.18698],[-83.18705,36.18741],[-83.18639,36.18779],[-83.18544,36.18833],[-83.18465,36.18876],[-83.18377,36.18922],[-83.183,36.18961],[-83.18209,36.19005],[-83.18127,36.19044],[-83.18032,36.19086],[-83.17938,36.19127],[-83.17873,36.19154],[-83.17797,36.19184],[-83.17713,36.19216],[-83.17602,36.19257],[-83.17532,36.19282],[-83.17466,36.19304],[-83.17367,36.19336],[-83.17318,36.19351],[-83.17225,36.19378],[-83.17127,36.19406],[-83.17017,36.19435],[-83.1691,36.19462],[-83.16801,36.19488],[-83.16709,36.19508],[-83.16626,36.19524],[-83.16541,36.1954],[-83.16446,36.19558],[-83.16335,36.19575],[-83.16226,36.19591],[-83.16078,36.1961],[-83.16009,36.19619],[-83.15803,36.19644],[-83.15701,36.19657],[-83.15257,36.19712],[-83.15192,36.1972],[-83.14638,36.19787],[-83.14079,36.19857],[-83.13237,36.1996],[-83.13219,36.19962],[-83.12421,36.2006],[-83.12371,36.20067],[-83.12007,36.20112],[-83.11682,36.20152],[-83.11054,36.20229],[-83.10953,36.20242],[-83.10854,36.20255],[-83.10731,36.20274],[-83.10566,36.20299],[-83.09968,36.20389],[-83.0988,36.20402],[-83.09768,36.20422],[-83.09696,36.20437],[-83.09604,36.20456],[-83.09509,36.20479],[-83.0938,36.20513],[-83.09305,36.20534],[-83.09208,36.20564],[-83.09155,36.20582],[-83.09086,36.20607],[-83.08947,36.20655],[-83.08645,36.20763],[-83.08104,36.20954],[-83.07919,36.21019],[-83.07655,36.21112],[-83.06649,36.2147],[-83.06591,36.21489],[-83.04477,36.22235],[-83.03997,36.22404],[-83.03923,36.2243],[-83.03864,36.22452],[-83.03769,36.22485],[-83.03615,36.22539],[-83.03341,36.22636],[-83.03129,36.22711],[-83.02612,36.22892],[-83.02096,36.23075],[-83.01655,36.2323],[-83.00452,36.23654],[-83.00221,36.23735],[-82.99383,36.2403],[-82.99194,36.24096],[-82.98969,36.24176],[-82.98739,36.24257],[-82.98436,36.24364],[-82.98123,36.24474],[-82.97732,36.24612],[-82.97673,36.24634],[-82.97599,36.24663],[-82.97491,36.24708],[-82.97389,36.24754],[-82.97278,36.24807],[-82.97227,36.24833],[-82.97116,36.24892],[-82.96894,36.25011],[-82.96671,36.25131],[-82.96245,36.2536],[-82.95803,36.25596],[-82.95299,36.25867],[-82.94352,36.26374],[-82.93981,36.26573],[-82.93912,36.26609],[-82.93849,36.26642],[-82.93795,36.2667],[-82.93737,36.26698],[-82.93663,36.26734],[-82.93573,36.26777],[-82.93476,36.2682],[-82.9339,36.26859],[-82.92797,36.27121],[-82.92211,36.27382],[-82.91919,36.27511],[-82.917,36.27609],[-82.91613,36.27647],[-82.91512,36.27694],[-82.91402,36.27746],[-82.91331,36.27781],[-82.91135,36.27882],[-82.91045,36.27932],[-82.90972,36.27972],[-82.90866,36.28033],[-82.90708,36.28127],[-82.90599,36.28194],[-82.90456,36.28284],[-82.89357,36.28974],[-82.88468,36.29532],[-82.87728,36.29995],[-82.87692,36.30018],[-82.87621,36.30058],[-82.87565,36.3009],[-82.87505,36.30123],[-82.87426,36.30163],[-82.87333,36.30208],[-82.87202,36.30268],[-82.86555,36.30565],[-82.86086,36.3078],[-82.85599,36.31003],[-82.85403,36.31094],[-82.853,36.31144],[-82.85177,36.31208],[-82.85112,36.31245],[-82.85001,36.31311],[-82.84044,36.31879],[-82.83865,36.31985],[-82.83334,36.32299],[-82.83066,36.32459],[-82.82941,36.32532],[-82.82798,36.32612],[-82.8248,36.32783],[-82.81984,36.33052],[-82.81495,36.33316],[-82.81097,36.3353],[-82.81052,36.33554],[-82.81015,36.33573],[-82.80923,36.33621],[-82.80835,36.33664],[-82.80718,36.33719],[-82.80625,36.33762],[-82.80489,36.33822],[-82.8039,36.33865],[-82.80284,36.33908],[-82.80166,36.33955],[-82.80022,36.34008],[-82.7993,36.34041],[-82.79778,36.34093],[-82.7969,36.34122],[-82.79539,36.34169],[-82.78473,36.34495],[-82.77512,36.34789],[-82.769,36.34975],[-82.76725,36.35028],[-82.76633,36.35055],[-82.76522,36.35085],[-82.76403,36.35116],[-82.76261,36.35151],[-82.76194,36.35167],[-82.76113,36.35185],[-82.76,36.35209],[-82.75891,36.3523],[-82.75784,36.3525],[-82.75672,36.3527],[-82.75558,36.35288],[-82.75478,36.353],[-82.75391,36.35313],[-82.75347,36.35319],[-82.75263,36.35329],[-82.7513,36.35345],[-82.75042,36.35354],[-82.74957,36.35362],[-82.74846,36.35372],[-82.74768,36.35377],[-82.74644,36.35385],[-82.74543,36.35391],[-82.7441,36.35397],[-82.73296,36.35453],[-82.72393,36.35498],[-82.72289,36.35501],[-82.72177,36.35507],[-82.71905,36.35521],[-82.71829,36.35525],[-82.71751,36.3553],[-82.71687,36.35534],[-82.71621,36.35539],[-82.71551,36.35545],[-82.71498,36.3555],[-82.71421,36.35558],[-82.71325,36.35569],[-82.71244,36.35579],[-82.7117,36.35589],[-82.7107,36.35604],[-82.70983,36.35618],[-82.70898,36.35632],[-82.70825,36.35645],[-82.70718,36.35666],[-82.70651,36.35679],[-82.70562,36.35699],[-82.70475,36.35719],[-82.70421,36.35731],[-82.70324,36.35755],[-82.7021,36.35786],[-82.70105,36.35817],[-82.70029,36.35839],[-82.69968,36.35858],[-82.69915,36.35875],[-82.69867,36.35889],[-82.69795,36.35913],[-82.69669,36.35956],[-82.69534,36.36006],[-82.69463,36.36033],[-82.69332,36.36085],[-82.69203,36.36139],[-82.69073,36.36197],[-82.68992,36.36234],[-82.68935,36.36262],[-82.68808,36.36325],[-82.68675,36.36394],[-82.68556,36.3646],[-82.68419,36.3654],[-82.68301,36.36612],[-82.6818,36.3669],[-82.68049,36.36777],[-82.67892,36.36889],[-82.6778,36.36975],[-82.67664,36.37066],[-82.67553,36.37159],[-82.67425,36.37271],[-82.67352,36.37339],[-82.67254,36.37433],[-82.67185,36.37502],[-82.67084,36.37607],[-82.66993,36.37704],[-82.66564,36.38163],[-82.66302,36.38442],[-82.66125,36.38632],[-82.65949,36.38819],[-82.6592,36.3885],[-82.65213,36.39603],[-82.6497,36.39862],[-82.6484,36.40003],[-82.64807,36.40037],[-82.64771,36.40071],[-82.64725,36.40112],[-82.64675,36.4015],[-82.64631,36.40181],[-82.64587,36.4021],[-82.64538,36.40239],[-82.64485,36.40267],[-82.64429,36.40295],[-82.64382,36.40315],[-82.64322,36.40338],[-82.64266,36.40356],[-82.64198,36.40376],[-82.64138,36.40391],[-82.64077,36.40403],[-82.64015,36.40412],[-82.63953,36.4042],[-82.63889,36.40425],[-82.63834,36.40427],[-82.63781,36.40428],[-82.63723,36.40426],[-82.6367,36.40423],[-82.63616,36.40417],[-82.63542,36.40408],[-82.6318,36.40358],[-82.63043,36.4034],[-82.62761,36.40301],[-82.62103,36.40211],[-82.6202,36.40201],[-82.61951,36.40193],[-82.61899,36.4019],[-82.61836,36.40187],[-82.61784,36.40185],[-82.61731,36.40185],[-82.61672,36.40186],[-82.61627,36.40188],[-82.61555,36.40192],[-82.61507,36.40197],[-82.61472,36.402],[-82.61412,36.40208],[-82.61351,36.40218],[-82.61303,36.40226],[-82.61236,36.4024],[-82.61184,36.40252],[-82.61135,36.40264],[-82.61083,36.40279],[-82.61031,36.40294],[-82.60992,36.40307],[-82.60943,36.40324],[-82.60896,36.40342],[-82.60852,36.40359],[-82.608,36.40382],[-82.60747,36.40406],[-82.60707,36.40427],[-82.60651,36.40456],[-82.60581,36.40495],[-82.59876,36.40912],[-82.59674,36.41031],[-82.5949,36.4114],[-82.59387,36.412],[-82.59289,36.41254],[-82.5916,36.41321],[-82.58846,36.41484],[-82.58763,36.41529],[-82.5865,36.41592],[-82.58577,36.41636],[-82.58505,36.4168],[-82.58429,36.4173],[-82.58334,36.41798],[-82.58198,36.41896],[-82.57633,36.42303],[-82.57481,36.42412],[-82.57378,36.42487],[-82.57324,36.42527],[-82.57281,36.42558],[-82.5722,36.42601],[-82.57122,36.42673],[-82.57049,36.4273],[-82.5701,36.42762],[-82.56944,36.42817],[-82.56904,36.42852],[-82.5683,36.4292],[-82.56758,36.42986],[-82.56316,36.43393],[-82.5625,36.43453],[-82.56224,36.43477],[-82.55673,36.43983],[-82.5563,36.44022],[-82.55589,36.44059],[-82.55555,36.44086],[-82.55527,36.44107],[-82.55499,36.44125],[-82.55473,36.4414],[-82.55438,36.44159],[-82.55403,36.44176],[-82.55374,36.44188],[-82.55344,36.442],[-82.55309,36.44211],[-82.55277,36.44221],[-82.55236,36.44231],[-82.55206,36.44237],[-82.55147,36.44248],[-82.549,36.44292],[-82.54376,36.44387],[-82.54089,36.44438],[-82.54034,36.44449],[-82.53975,36.44461],[-82.53917,36.44474],[-82.53863,36.44488],[-82.53802,36.44505],[-82.53756,36.4452],[-82.53718,36.44533],[-82.53676,36.44548],[-82.53644,36.44559],[-82.5361,36.44571],[-82.53554,36.44595],[-82.53506,36.44618],[-82.53454,36.44643],[-82.53404,36.44669],[-82.53342,36.44704],[-82.53317,36.44718],[-82.53274,36.44745],[-82.53215,36.44784],[-82.52819,36.45042],[-82.52649,36.45152],[-82.52608,36.45181],[-82.52348,36.45351],[-82.52326,36.45363],[-82.5224,36.45419],[-82.52199,36.45447],[-82.52031,36.45557],[-82.51811,36.45702],[-82.51126,36.46147],[-82.50838,36.46337],[-82.50463,36.46588],[-82.50228,36.46743],[-82.49892,36.46962],[-82.49848,36.46992],[-82.49793,36.47028],[-82.4953,36.4721],[-82.4936,36.47328],[-82.4931,36.47363],[-82.49221,36.47425],[-82.49159,36.47464],[-82.49106,36.47496],[-82.49032,36.47537],[-82.48962,36.47577],[-82.48599,36.47781],[-82.48355,36.47919],[-82.48255,36.47978],[-82.48153,36.48042],[-82.48048,36.48112],[-82.47826,36.48264],[-82.47747,36.48316],[-82.47484,36.48496],[-82.47405,36.48551],[-82.46929,36.48877],[-82.46803,36.48962],[-82.46631,36.49081],[-82.46375,36.49254],[-82.46243,36.49345],[-82.45835,36.49624],[-82.4578,36.49663],[-82.4574,36.49691],[-82.45641,36.49754],[-82.45528,36.49824],[-82.45404,36.49896],[-82.45351,36.49926],[-82.45182,36.50017],[-82.45091,36.50063],[-82.45011,36.50102],[-82.44898,36.50154],[-82.44784,36.50205],[-82.44676,36.5025],[-82.44511,36.50315],[-82.44362,36.50369],[-82.44296,36.50392],[-82.44207,36.50422],[-82.44101,36.50455],[-82.44021,36.50479],[-82.43922,36.50508],[-82.43814,36.50538],[-82.4362,36.50592],[-82.43199,36.50709],[-82.42868,36.50802],[-82.42658,36.5086],[-82.42232,36.50979],[-82.42187,36.50992],[-82.42133,36.51008],[-82.42081,36.51024],[-82.42035,36.51039],[-82.41967,36.51061],[-82.41899,36.51085],[-82.41837,36.51109],[-82.4177,36.51134],[-82.41717,36.51156],[-82.41649,36.51185],[-82.41577,36.51218],[-82.41517,36.51246],[-82.41454,36.51277],[-82.41393,36.51309],[-82.41315,36.5135],[-82.41261,36.51381],[-82.41201,36.51415],[-82.41125,36.51461],[-82.41055,36.51507],[-82.40996,36.51546],[-82.40938,36.51586],[-82.40884,36.51625],[-82.4079,36.51696],[-82.40695,36.51773],[-82.40553,36.51888],[-82.40412,36.52004],[-82.40287,36.52105],[-82.40173,36.52196],[-82.40018,36.52322],[-82.39863,36.52448],[-82.39734,36.52552],[-82.39593,36.52667],[-82.39435,36.52796],[-82.39266,36.52933],[-82.39185,36.53],[-82.39138,36.53039],[-82.39047,36.53111],[-82.38919,36.53215],[-82.38868,36.53255],[-82.38805,36.53302],[-82.38765,36.53331],[-82.38698,36.53376],[-82.38643,36.53411],[-82.3858,36.5345],[-82.38523,36.53482],[-82.38457,36.53518],[-82.38406,36.53545],[-82.38369,36.53563],[-82.38324,36.53585],[-82.38274,36.53608],[-82.38218,36.53632],[-82.38162,36.53656],[-82.38096,36.53681],[-82.38028,36.53706],[-82.37965,36.53727],[-82.37893,36.53751],[-82.3783,36.53769],[-82.37765,36.53787],[-82.37693,36.53806],[-82.37619,36.53823],[-82.37559,36.53836],[-82.37493,36.53848],[-82.37436,36.53858],[-82.37371,36.53868],[-82.37306,36.53877],[-82.37236,36.53886],[-82.3717,36.53892],[-82.3709,36.53898],[-82.37018,36.53903],[-82.36949,36.53904],[-82.36865,36.53906],[-82.36803,36.53905],[-82.36753,36.53904],[-82.36682,36.53902],[-82.36625,36.53898],[-82.36558,36.53894],[-82.36493,36.53888],[-82.36424,36.53882],[-82.36252,36.53866],[-82.36207,36.53862],[-82.35893,36.53833],[-82.35848,36.53829],[-82.35798,36.53826],[-82.35737,36.53823],[-82.35679,36.5382],[-82.35601,36.53819],[-82.35527,36.53819],[-82.35462,36.53821],[-82.35413,36.53823],[-82.35349,36.53826],[-82.35283,36.53831],[-82.35216,36.53837],[-82.35166,36.53842],[-82.35092,36.53851],[-82.35021,36.53861],[-82.34957,36.53872],[-82.34913,36.53879],[-82.3485,36.53892],[-82.34804,36.53902],[-82.34771,36.53909],[-82.34706,36.53924],[-82.34656,36.53937],[-82.3459,36.53955],[-82.34528,36.53974],[-82.34464,36.53994],[-82.344,36.54016],[-82.34338,36.54039],[-82.34293,36.54056],[-82.34232,36.54081],[-82.34163,36.5411],[-82.34062,36.54156],[-82.33979,36.54197],[-82.33588,36.54393],[-82.33525,36.54424],[-82.3345,36.54462],[-82.33199,36.54587],[-82.33015,36.54679],[-82.32842,36.54765],[-82.32693,36.54839],[-82.3233,36.55021],[-82.322,36.55085],[-82.32123,36.55124],[-82.32085,36.55144],[-82.3203,36.55176],[-82.31989,36.552],[-82.31926,36.55241],[-82.31888,36.55266],[-82.3184,36.55302],[-82.31808,36.55326],[-82.31755,36.5537],[-82.31722,36.55399],[-82.31673,36.55444],[-82.31638,36.5548],[-82.31604,36.55515],[-82.31571,36.55553],[-82.31533,36.55598],[-82.31508,36.5563],[-82.31451,36.55708],[-82.31406,36.55771],[-82.31342,36.55859],[-82.31315,36.55896],[-82.31279,36.55943],[-82.31253,36.55973],[-82.31224,36.56006],[-82.312,36.56032],[-82.3117,36.56063],[-82.3114,36.56093],[-82.31109,36.56121],[-82.31071,36.56156],[-82.31031,36.56189],[-82.30983,36.56227],[-82.30947,36.56254],[-82.30906,36.56283],[-82.30861,36.56311],[-82.30822,36.56336],[-82.30784,36.56359],[-82.30744,36.56381],[-82.30708,36.564],[-82.30667,36.56421],[-82.30639,36.56434],[-82.30593,36.56456],[-82.296,36.56921],[-82.29119,36.57146],[-82.28628,36.57376],[-82.27644,36.57835],[-82.27561,36.57874],[-82.27443,36.57931],[-82.2734,36.57984],[-82.27206,36.58054],[-82.27114,36.58105],[-82.27011,36.58163],[-82.26848,36.58259],[-82.26692,36.5835],[-82.26602,36.58404],[-82.26566,36.58425],[-82.26523,36.5845],[-82.26341,36.58564],[-82.2607,36.58725],[-82.25932,36.58805],[-82.25883,36.58833],[-82.2583,36.58862],[-82.25794,36.5888],[-82.257,36.58929],[-82.25598,36.58982],[-82.25525,36.5902],[-82.25317,36.5912],[-82.25114,36.59216],[-82.24955,36.59292],[-82.24855,36.59338],[-82.24683,36.59414],[-82.24507,36.59492],[-82.24468,36.59508],[-82.24338,36.59565],[-82.24333,36.59568],[-82.24323,36.59572],[-82.24291,36.59586],[-82.24171,36.5964],[-82.23942,36.59741],[-82.23757,36.59823],[-82.23712,36.59843],[-82.23698,36.5985],[-82.23631,36.5988],[-82.23537,36.59921],[-82.23514,36.59932],[-82.23482,36.59946],[-82.23377,36.59992],[-82.23344,36.60007],[-82.23305,36.60024],[-82.23215,36.60064],[-82.2315,36.60094],[-82.23087,36.60122],[-82.22992,36.60165],[-82.22908,36.60201],[-82.22846,36.6023],[-82.22394,36.60429],[-82.22334,36.60456],[-82.22253,36.6049],[-82.21956,36.60622],[-82.21792,36.60697],[-82.21724,36.60726],[-82.2165,36.60759],[-82.21429,36.60857],[-82.21364,36.60885],[-82.21308,36.60911],[-82.21221,36.6095],[-82.21022,36.61037],[-82.20984,36.61054],[-82.20929,36.61077],[-82.20891,36.61093],[-82.20722,36.61171],[-82.20682,36.61188],[-82.20635,36.61207],[-82.20259,36.61374],[-82.20183,36.61408],[-82.2008,36.61457],[-82.20004,36.61496],[-82.19955,36.61523],[-82.19854,36.61583],[-82.19805,36.61613],[-82.19741,36.61649],[-82.19704,36.61673],[-82.19671,36.61698],[-82.19533,36.61791],[-82.19492,36.61818],[-82.19296,36.61949],[-82.19233,36.61989],[-82.19187,36.62016],[-82.19138,36.62041],[-82.19082,36.62068],[-82.19038,36.62088],[-82.1897,36.6211],[-82.18933,36.62125],[-82.18854,36.62155],[-82.18799,36.62176],[-82.18644,36.62234],[-82.18518,36.62288],[-82.1847,36.62305],[-82.18436,36.62318],[-82.18376,36.62339],[-82.18252,36.62382],[-82.18166,36.62412],[-82.18056,36.62453],[-82.17981,36.62481],[-82.17898,36.62514],[-82.17797,36.62553],[-82.17736,36.62574],[-82.17699,36.62587],[-82.1764,36.62604],[-82.17594,36.62616],[-82.17588,36.62618],[-82.17473,36.62643],[-82.17395,36.62658],[-82.1738,36.6266],[-82.17269,36.62677],[-82.17245,36.62679],[-82.17204,36.62683],[-82.17148,36.62687],[-82.17082,36.62691],[-82.17037,36.62692],[-82.16985,36.62693],[-82.1695,36.62692],[-82.16938,36.62692],[-82.16877,36.62688],[-82.16823,36.62684],[-82.16743,36.62675],[-82.16639,36.62663],[-82.16546,36.62653],[-82.16502,36.62647],[-82.16442,36.62641],[-82.1636,36.62633],[-82.16291,36.6263],[-82.16215,36.62628],[-82.16136,36.62627],[-82.15876,36.62626],[-82.15717,36.62625],[-82.15648,36.62623],[-82.15619,36.62621],[-82.15524,36.62616],[-82.15417,36.62606],[-82.15352,36.62602],[-82.15188,36.62588],[-82.15046,36.62575],[-82.15017,36.62572],[-82.14961,36.62565],[-82.14935,36.62563],[-82.1482,36.62552],[-82.14748,36.62546],[-82.14685,36.62542],[-82.14535,36.62528],[-82.14454,36.6252],[-82.14413,36.62516],[-82.14311,36.62508],[-82.14196,36.62497],[-82.14106,36.62489],[-82.14039,36.62485],[-82.13985,36.62483],[-82.13916,36.62483],[-82.13875,36.62483],[-82.13806,36.62486],[-82.13748,36.62489],[-82.13718,36.62492],[-82.13688,36.62496],[-82.1362,36.62507],[-82.13558,36.62517],[-82.13484,36.62529],[-82.13408,36.62545],[-82.13357,36.62557],[-82.1328,36.62578],[-82.1323,36.62593],[-82.13181,36.62605],[-82.13145,36.62617],[-82.13113,36.62628],[-82.12993,36.62681],[-82.12918,36.62712],[-82.12844,36.62741],[-82.12707,36.62797],[-82.12697,36.62801],[-82.1267,36.62813],[-82.12312,36.6296],[-82.12264,36.62979],[-82.12183,36.63012],[-82.12131,36.63032],[-82.12074,36.63058],[-82.11759,36.63181],[-82.1168,36.63217],[-82.1163,36.63238],[-82.1157,36.63263],[-82.11393,36.63335],[-82.11334,36.63359],[-82.1126,36.63389],[-82.11209,36.63412],[-82.11198,36.63416],[-82.11081,36.63466],[-82.11021,36.63489],[-82.10835,36.63561],[-82.10558,36.63675],[-82.10208,36.63818],[-82.10019,36.63895],[-82.09933,36.63931],[-82.0983,36.63977],[-82.0973,36.64028],[-82.09641,36.64078],[-82.09608,36.64096],[-82.09593,36.64105],[-82.09535,36.64143],[-82.09438,36.64209],[-82.09392,36.64243],[-82.09379,36.64253],[-82.09322,36.64298],[-82.0926,36.6435],[-82.092,36.64403],[-82.09073,36.64519],[-82.09002,36.64585],[-82.08928,36.64652],[-82.0879,36.64778],[-82.08726,36.64835],[-82.08675,36.64878],[-82.08649,36.64899],[-82.08625,36.64917],[-82.08565,36.64962],[-82.08519,36.64995],[-82.08468,36.65029],[-82.08405,36.65069],[-82.08389,36.65079],[-82.08314,36.65123],[-82.08272,36.65145],[-82.08221,36.65173],[-82.08128,36.65218],[-82.08047,36.65254],[-82.07993,36.65276],[-82.07926,36.65302],[-82.07867,36.65324],[-82.07832,36.65336],[-82.0772,36.65376],[-82.0757,36.65428],[-82.07474,36.65463],[-82.07404,36.6549],[-82.07349,36.65512],[-82.07284,36.65541],[-82.07198,36.65581],[-82.07112,36.65625],[-82.07044,36.65663],[-82.06955,36.65717],[-82.06872,36.6577],[-82.06792,36.65828],[-82.06712,36.65889],[-82.06658,36.65935],[-82.06596,36.65987],[-82.06553,36.6603],[-82.06329,36.66246],[-82.06239,36.66331],[-82.06184,36.6638],[-82.06099,36.66452],[-82.06022,36.66513],[-82.05948,36.66568],[-82.05869,36.66625],[-82.05812,36.66664],[-82.05766,36.66694],[-82.05659,36.66762],[-82.05486,36.66863],[-82.05324,36.66957],[-82.05194,36.67033],[-82.05126,36.67072],[-82.04551,36.67407],[-82.04502,36.67437],[-82.04444,36.67472],[-82.04364,36.67522],[-82.04273,36.67581],[-82.04138,36.67672],[-82.03992,36.67778],[-82.03935,36.67819],[-82.03854,36.67874],[-82.03812,36.67903],[-82.03796,36.67915],[-82.03721,36.67969],[-82.03439,36.68171],[-82.03382,36.68211],[-82.03221,36.6832],[-82.03114,36.68389],[-82.03096,36.68401],[-82.03034,36.6844],[-82.02962,36.68483],[-82.02881,36.68532],[-82.02811,36.68572],[-82.02733,36.68616],[-82.02503,36.68744],[-82.02406,36.68799],[-82.02328,36.68843],[-82.0231,36.68853],[-82.0201,36.6902],[-82.01825,36.69123],[-82.01742,36.69168],[-82.01694,36.69192],[-82.0165,36.69212],[-82.01615,36.69228],[-82.01574,36.69245],[-82.01532,36.69262],[-82.01442,36.69295],[-82.01392,36.69311],[-82.01342,36.69326],[-82.01294,36.69339],[-82.01266,36.69346],[-82.01255,36.69349],[-82.01172,36.69366],[-82.01165,36.69368],[-82.01142,36.69374],[-82.01111,36.6938],[-82.01055,36.6939],[-82.01038,36.69392],[-82.01011,36.69396],[-82.00887,36.6941],[-82.00834,36.69416],[-82.00795,36.69421],[-82.00647,36.69437],[-82.00594,36.69443],[-82.00454,36.69458],[-82.00397,36.69464],[-82.00352,36.69469],[-82.00189,36.69488],[-82.00096,36.69498],[-81.99955,36.69514],[-81.99835,36.69526],[-81.9957,36.69556],[-81.99416,36.69573],[-81.99308,36.69586],[-81.99244,36.69595],[-81.99194,36.69604],[-81.99138,36.69615],[-81.99106,36.69622],[-81.99057,36.69633],[-81.99029,36.69641],[-81.99004,36.69647],[-81.98958,36.6966],[-81.98902,36.69678],[-81.98848,36.69696],[-81.9881,36.6971],[-81.98725,36.69743],[-81.98649,36.69773],[-81.98566,36.69806],[-81.98508,36.69827],[-81.98467,36.69842],[-81.98422,36.69856],[-81.98403,36.69862],[-81.98386,36.69867],[-81.9836,36.69875],[-81.98308,36.69889],[-81.98258,36.69901],[-81.98209,36.69912],[-81.98138,36.69925],[-81.98091,36.69933],[-81.9804,36.6994],[-81.97987,36.69946],[-81.97912,36.69954],[-81.97898,36.69955],[-81.97886,36.69956],[-81.97854,36.69958],[-81.97797,36.6996],[-81.97763,36.69961],[-81.97715,36.69962],[-81.97676,36.69961],[-81.97622,36.6996],[-81.9759,36.69958],[-81.97544,36.69955],[-81.97488,36.6995],[-81.97425,36.69945],[-81.97285,36.69934],[-81.97259,36.69931],[-81.97146,36.69922],[-81.97089,36.69919],[-81.97061,36.69918],[-81.97042,36.69918],[-81.96955,36.69917],[-81.96914,36.69918],[-81.96853,36.69921],[-81.96782,36.69926],[-81.9674,36.6993],[-81.96694,36.69935],[-81.96648,36.69941],[-81.96616,36.69946],[-81.96544,36.69958],[-81.96501,36.69966],[-81.96439,36.6998],[-81.96375,36.69996],[-81.96332,36.70008],[-81.9629,36.70021],[-81.96254,36.70032],[-81.9622,36.70043],[-81.96155,36.70067],[-81.96118,36.70081],[-81.96061,36.70105],[-81.96009,36.70128],[-81.95957,36.70152],[-81.95921,36.70172],[-81.95893,36.70185],[-81.95855,36.70208],[-81.95788,36.70247],[-81.9542,36.70484],[-81.95388,36.70506],[-81.95245,36.70594],[-81.95225,36.70607],[-81.95196,36.70626],[-81.95173,36.7064],[-81.95107,36.70677],[-81.95014,36.70727],[-81.94906,36.70783],[-81.94812,36.70827],[-81.94777,36.70842],[-81.94751,36.70855],[-81.9469,36.70881],[-81.94618,36.7091],[-81.94609,36.70914],[-81.94537,36.70941],[-81.94378,36.71],[-81.94003,36.71137],[-81.93979,36.71145],[-81.93855,36.71189],[-81.93815,36.71203],[-81.9377,36.7122],[-81.93705,36.71245],[-81.93622,36.71276],[-81.93585,36.71289],[-81.9356,36.71299],[-81.93522,36.71312],[-81.9348,36.71326],[-81.93467,36.7133],[-81.9344,36.71341],[-81.93431,36.71346],[-81.93338,36.71379],[-81.9329,36.71395],[-81.93232,36.71416],[-81.93203,36.71428],[-81.93142,36.71451],[-81.93065,36.7148],[-81.9303,36.71492],[-81.92999,36.71503],[-81.92967,36.71513],[-81.92904,36.71538],[-81.92829,36.71566],[-81.92778,36.71584],[-81.92766,36.71589],[-81.92753,36.71594],[-81.92704,36.71611],[-81.92678,36.7162],[-81.92478,36.71694],[-81.92293,36.71761],[-81.92238,36.71782],[-81.92182,36.71805],[-81.92123,36.71831],[-81.92051,36.71865],[-81.91958,36.71911],[-81.91901,36.71943],[-81.91878,36.71956],[-81.91843,36.71976],[-81.91811,36.71994],[-81.91735,36.72043],[-81.91712,36.72058],[-81.9166,36.72095],[-81.91607,36.72133],[-81.91558,36.72171],[-81.9151,36.7221],[-81.91455,36.72258],[-81.91409,36.72299],[-81.91387,36.72319],[-81.913,36.724],[-81.91255,36.72442],[-81.9121,36.72484],[-81.91175,36.72517],[-81.91157,36.72532],[-81.91139,36.7255],[-81.91122,36.72565],[-81.91104,36.72582],[-81.91088,36.72597],[-81.91033,36.72648],[-81.90981,36.72699],[-81.90964,36.72716],[-81.90898,36.72787],[-81.90859,36.72832],[-81.90813,36.7289],[-81.90797,36.7291],[-81.90752,36.72972],[-81.90697,36.73054],[-81.90657,36.7312],[-81.90629,36.73169],[-81.90618,36.7319],[-81.90596,36.73227],[-81.9057,36.73268],[-81.90549,36.73298],[-81.9052,36.73339],[-81.90483,36.73382],[-81.90461,36.73407],[-81.90446,36.73422],[-81.90417,36.73452],[-81.90399,36.73469],[-81.90361,36.73503],[-81.90329,36.7353],[-81.90293,36.73557],[-81.90268,36.73576],[-81.9024,36.73595],[-81.90219,36.73609],[-81.90161,36.73645],[-81.90112,36.73672],[-81.90072,36.73692],[-81.89935,36.73757],[-81.89836,36.73803],[-81.89617,36.73907],[-81.89533,36.73948],[-81.89458,36.73987],[-81.89401,36.74017],[-81.8933,36.74058],[-81.89252,36.74104],[-81.89214,36.74128],[-81.89175,36.74152],[-81.89095,36.74205],[-81.89021,36.74256],[-81.88937,36.74317],[-81.88863,36.74375],[-81.88655,36.74537],[-81.88628,36.74558],[-81.8859,36.74588],[-81.88546,36.74622],[-81.88336,36.74786],[-81.88266,36.74839],[-81.88219,36.74874],[-81.88178,36.74901],[-81.88154,36.74917],[-81.88112,36.74942],[-81.88057,36.74973],[-81.87999,36.75003],[-81.87942,36.75028],[-81.87886,36.75052],[-81.87839,36.7507],[-81.87787,36.75088],[-81.87664,36.75127],[-81.8752,36.75172],[-81.87383,36.75215],[-81.86709,36.75428],[-81.8658,36.75468],[-81.86287,36.75561],[-81.8572,36.7574],[-81.85675,36.75754],[-81.85322,36.75865],[-81.8476,36.76043],[-81.84668,36.76073],[-81.84508,36.76127],[-81.83749,36.7638],[-81.83442,36.76482],[-81.83317,36.76524],[-81.83303,36.76529],[-81.83275,36.76539],[-81.83163,36.76576],[-81.8304,36.76617],[-81.82928,36.76654],[-81.82883,36.76668],[-81.8278,36.76698],[-81.82689,36.76723],[-81.82598,36.76746],[-81.82516,36.76765],[-81.82496,36.76769],[-81.82426,36.76783],[-81.82346,36.76799],[-81.82262,36.76813],[-81.82217,36.7682],[-81.82115,36.76834],[-81.82063,36.76841],[-81.82015,36.76847],[-81.8196,36.76852],[-81.81899,36.76858],[-81.81849,36.76862],[-81.81791,36.76866],[-81.81743,36.76868],[-81.81411,36.76885],[-81.80888,36.7691],[-81.80775,36.76916],[-81.80478,36.76931],[-81.80363,36.76937],[-81.79381,36.76985],[-81.79278,36.76994],[-81.79216,36.76998],[-81.79158,36.77002],[-81.79026,36.77014],[-81.78976,36.7702],[-81.7891,36.77029],[-81.7884,36.77038],[-81.78733,36.77056],[-81.7866,36.77069],[-81.78425,36.77115],[-81.78122,36.77178],[-81.78068,36.77189],[-81.77743,36.7725],[-81.77631,36.77273],[-81.77522,36.77293],[-81.77367,36.77324],[-81.773,36.77338],[-81.77262,36.77347],[-81.7721,36.77359],[-81.77171,36.77369],[-81.77072,36.77395],[-81.76992,36.77418],[-81.76916,36.77441],[-81.76837,36.77468],[-81.76828,36.77471],[-81.76757,36.77496],[-81.76499,36.77595],[-81.76182,36.77715],[-81.76121,36.77737],[-81.76061,36.77757],[-81.75993,36.77778],[-81.7594,36.77793],[-81.7588,36.77809],[-81.75823,36.77823],[-81.75762,36.77837],[-81.75683,36.77853],[-81.75628,36.77863],[-81.75431,36.77893],[-81.75381,36.779],[-81.75116,36.7794],[-81.74945,36.77965],[-81.7466,36.78007],[-81.74634,36.78011],[-81.74596,36.78017],[-81.74434,36.78041],[-81.74414,36.78044],[-81.74397,36.78047],[-81.74294,36.78062],[-81.74233,36.78072],[-81.74164,36.78084],[-81.741,36.78097],[-81.74044,36.78108],[-81.73974,36.78124],[-81.73909,36.78139],[-81.73856,36.78153],[-81.73786,36.78172],[-81.73762,36.7818],[-81.7372,36.78194],[-81.73696,36.78203],[-81.73668,36.78214],[-81.73634,36.78228],[-81.73599,36.78244],[-81.73565,36.7826],[-81.73549,36.78268],[-81.73531,36.78277],[-81.7348,36.78304],[-81.73454,36.78318],[-81.73429,36.78332],[-81.73292,36.78406],[-81.73229,36.7844],[-81.7319,36.7846],[-81.7314,36.78484],[-81.73073,36.78513],[-81.73033,36.7853],[-81.72997,36.78544],[-81.72986,36.78548],[-81.72933,36.78567],[-81.72886,36.78583],[-81.72824,36.78601],[-81.72769,36.78616],[-81.72726,36.78627],[-81.72691,36.78635],[-81.72634,36.78648],[-81.72552,36.78662],[-81.7243,36.78682],[-81.72364,36.78692],[-81.71994,36.78749],[-81.71933,36.78758],[-81.71872,36.78768],[-81.71462,36.78831],[-81.71401,36.7884],[-81.71351,36.78846],[-81.71288,36.78853],[-81.71245,36.78856],[-81.71206,36.78859],[-81.7117,36.78861],[-81.71117,36.78862],[-81.71074,36.78862],[-81.71037,36.78862],[-81.70979,36.78861],[-81.70927,36.78858],[-81.70869,36.78854],[-81.70819,36.78849],[-81.70765,36.78843],[-81.707,36.78833],[-81.70649,36.78824],[-81.70557,36.78806],[-81.70479,36.78788],[-81.70437,36.78776],[-81.70373,36.78758],[-81.70341,36.78748],[-81.7029,36.7873],[-81.7025,36.78716],[-81.70162,36.78681],[-81.70119,36.78663],[-81.7007,36.78644],[-81.70044,36.78634],[-81.70018,36.78625],[-81.69996,36.78618],[-81.69964,36.78609],[-81.6992,36.78598],[-81.69891,36.78592],[-81.69889,36.78592],[-81.69851,36.78585],[-81.69807,36.7858],[-81.69752,36.78575],[-81.69723,36.78574],[-81.69684,36.78573],[-81.69654,36.78574],[-81.69616,36.78576],[-81.69573,36.7858],[-81.69531,36.78586],[-81.6949,36.78593],[-81.69455,36.786],[-81.69413,36.7861],[-81.69384,36.78619],[-81.69336,36.78634],[-81.69288,36.7865],[-81.69228,36.78671],[-81.69166,36.78695],[-81.69104,36.7872],[-81.69051,36.78743],[-81.68983,36.78774],[-81.68928,36.78801],[-81.68862,36.78835],[-81.68811,36.78864],[-81.68752,36.78898],[-81.68706,36.78926],[-81.68695,36.78933],[-81.68684,36.7894],[-81.68639,36.78969],[-81.68583,36.79007],[-81.6854,36.79039],[-81.68484,36.79082],[-81.68453,36.79107],[-81.68399,36.79151],[-81.68358,36.79185],[-81.68324,36.79215],[-81.68284,36.79251],[-81.6826,36.79272],[-81.68082,36.79428],[-81.68036,36.79468],[-81.67998,36.79501],[-81.67957,36.79538],[-81.67901,36.79585],[-81.67878,36.79603],[-81.67868,36.79612],[-81.67829,36.79646],[-81.67676,36.79779],[-81.67596,36.7985],[-81.67521,36.79914],[-81.67475,36.79952],[-81.67402,36.80008],[-81.67209,36.80149],[-81.66881,36.80387],[-81.66812,36.80436],[-81.66766,36.80466],[-81.66708,36.80504],[-81.66627,36.80555],[-81.66568,36.8059],[-81.66365,36.80707],[-81.66324,36.80728],[-81.66284,36.80753],[-81.66264,36.80765],[-81.66238,36.80779],[-81.66189,36.80805],[-81.66156,36.80821],[-81.66115,36.80839],[-81.66062,36.8086],[-81.66017,36.80876],[-81.65972,36.80891],[-81.65918,36.80907],[-81.65873,36.80918],[-81.65847,36.80924],[-81.65802,36.80933],[-81.65738,36.80944],[-81.65691,36.8095],[-81.65644,36.80955],[-81.65597,36.80958],[-81.65546,36.8096],[-81.65495,36.80961],[-81.65493,36.80961],[-81.65161,36.80958],[-81.65062,36.80955],[-81.64996,36.80953],[-81.64908,36.80948],[-81.64826,36.80941],[-81.64745,36.80934],[-81.64636,36.80922],[-81.6446,36.80897],[-81.64298,36.80873],[-81.64204,36.80859],[-81.64003,36.80829],[-81.63719,36.80786],[-81.63613,36.80769],[-81.63384,36.80731],[-81.63278,36.80713],[-81.63192,36.80699],[-81.62962,36.8066],[-81.62852,36.80644],[-81.62817,36.8064],[-81.62758,36.80634],[-81.62701,36.8063],[-81.62644,36.80627],[-81.62633,36.80627],[-81.6252,36.80626],[-81.62432,36.80629],[-81.62323,36.8064],[-81.622,36.80656],[-81.62097,36.80678],[-81.62078,36.80682],[-81.62044,36.8069],[-81.61967,36.80711],[-81.61925,36.80724],[-81.61866,36.80744],[-81.61764,36.80783],[-81.61722,36.808],[-81.61658,36.8083],[-81.61617,36.8085],[-81.61574,36.80873],[-81.61555,36.80884],[-81.61537,36.80894],[-81.61484,36.80925],[-81.61455,36.80944],[-81.61405,36.80976],[-81.61377,36.80994],[-81.61227,36.81091],[-81.61188,36.81115],[-81.6115,36.81136],[-81.61117,36.81154],[-81.61076,36.81173],[-81.61046,36.81185],[-81.61008,36.812],[-81.60967,36.81214],[-81.60937,36.81223],[-81.60901,36.81233],[-81.60864,36.81241],[-81.60821,36.81249],[-81.60787,36.81255],[-81.60694,36.81265],[-81.60628,36.81268],[-81.60269,36.81275],[-81.59525,36.8129],[-81.59264,36.81294],[-81.59004,36.81299],[-81.58901,36.813],[-81.5881,36.81299],[-81.58726,36.81297],[-81.58619,36.81292],[-81.58575,36.81289],[-81.58544,36.81286],[-81.5843,36.81277],[-81.58361,36.8127],[-81.58247,36.81255],[-81.58157,36.81243],[-81.58091,36.81232],[-81.58065,36.81227],[-81.57868,36.81196],[-81.57834,36.8119],[-81.57594,36.81152],[-81.57492,36.81136],[-81.5741,36.81126],[-81.57362,36.81123],[-81.57311,36.8112],[-81.57262,36.8112],[-81.57215,36.8112],[-81.57169,36.81123],[-81.57122,36.81126],[-81.57072,36.81132],[-81.57021,36.81139],[-81.56969,36.81148],[-81.56917,36.81158],[-81.56844,36.81174],[-81.56552,36.81235],[-81.56362,36.81274],[-81.56311,36.81285],[-81.56266,36.81297],[-81.56226,36.81309],[-81.56211,36.81314],[-81.56163,36.8133],[-81.56109,36.81351],[-81.56073,36.81367],[-81.56037,36.81384],[-81.55985,36.81412],[-81.55936,36.81441],[-81.55913,36.81456],[-81.559,36.81465],[-81.55821,36.81523],[-81.55807,36.81534],[-81.5567,36.81634],[-81.55619,36.81666],[-81.5559,36.81684],[-81.55556,36.81703],[-81.55539,36.81712],[-81.55475,36.81743],[-81.55421,36.81767],[-81.55387,36.81779],[-81.55343,36.81796],[-81.5521,36.8184],[-81.55172,36.81852],[-81.55028,36.81899],[-81.54967,36.8192],[-81.54872,36.81949],[-81.54813,36.81968],[-81.54721,36.82],[-81.54685,36.82012],[-81.54646,36.82025],[-81.54519,36.82066],[-81.54485,36.82077],[-81.54406,36.821],[-81.54327,36.8212],[-81.54254,36.82137],[-81.54233,36.82141],[-81.54169,36.82154],[-81.54115,36.82164],[-81.54058,36.82173],[-81.54041,36.82176],[-81.54022,36.82178],[-81.53954,36.82187],[-81.53892,36.82193],[-81.53764,36.82204],[-81.53729,36.82207],[-81.53589,36.82218],[-81.53586,36.82218],[-81.53558,36.82219],[-81.53425,36.82228],[-81.53393,36.8223],[-81.53355,36.82234],[-81.53037,36.82257],[-81.52949,36.82264],[-81.52855,36.82269],[-81.52799,36.82271],[-81.52745,36.82272],[-81.52725,36.82273],[-81.52609,36.82273],[-81.52551,36.82273],[-81.52511,36.82272],[-81.51875,36.82267],[-81.51831,36.82267],[-81.51806,36.82267],[-81.5173,36.82268],[-81.51679,36.82271],[-81.51641,36.82274],[-81.51558,36.82283],[-81.51504,36.82291],[-81.51467,36.82296],[-81.51409,36.82307],[-81.51355,36.82319],[-81.51307,36.82332],[-81.51261,36.82345],[-81.51256,36.82346],[-81.51207,36.82362],[-81.51168,36.82375],[-81.5113,36.82389],[-81.51095,36.82403],[-81.51033,36.82425],[-81.50956,36.82464],[-81.50893,36.82502],[-81.50845,36.8253],[-81.50809,36.82553],[-81.50773,36.82577],[-81.50742,36.82599],[-81.50736,36.82603],[-81.50707,36.82626],[-81.50684,36.8264],[-81.50636,36.82683],[-81.50619,36.82701],[-81.50448,36.82865],[-81.50389,36.82921],[-81.50341,36.82968],[-81.50323,36.82984],[-81.50303,36.83002],[-81.50287,36.83018],[-81.50265,36.83038],[-81.50249,36.83054],[-81.50188,36.83111],[-81.50153,36.83146],[-81.50114,36.83185],[-81.50088,36.83215],[-81.5004,36.83272],[-81.50023,36.83293],[-81.5001,36.83311],[-81.50002,36.83321],[-81.49965,36.83374],[-81.49958,36.83385],[-81.49929,36.8343],[-81.49852,36.83548],[-81.49827,36.83583],[-81.49788,36.83634],[-81.49758,36.83671],[-81.4973,36.83703],[-81.49703,36.83732],[-81.4967,36.83767],[-81.49633,36.83802],[-81.49504,36.83928],[-81.49497,36.83934],[-81.49464,36.83966],[-81.49407,36.84023],[-81.49276,36.8415],[-81.49212,36.84213],[-81.49121,36.84303],[-81.49093,36.84328],[-81.48709,36.84704],[-81.48677,36.84735],[-81.48653,36.84759],[-81.48407,36.84997],[-81.48381,36.85022],[-81.48348,36.85052],[-81.48338,36.8506],[-81.48313,36.85079],[-81.48288,36.85096],[-81.48261,36.85113],[-81.48232,36.85129],[-81.48203,36.85143],[-81.48173,36.85156],[-81.48143,36.85168],[-81.48117,36.85177],[-81.48085,36.85186],[-81.48053,36.85195],[-81.48013,36.85202],[-81.47979,36.85207],[-81.47946,36.85211],[-81.47905,36.85213],[-81.47864,36.85214],[-81.47834,36.85212],[-81.47796,36.85209],[-81.47758,36.85205],[-81.4772,36.85199],[-81.47698,36.85195],[-81.47495,36.8516],[-81.47467,36.85156],[-81.47425,36.85151],[-81.47408,36.8515],[-81.47367,36.85148],[-81.47339,36.85148],[-81.47303,36.8515],[-81.47267,36.85152],[-81.47232,36.85156],[-81.47196,36.85162],[-81.47161,36.85168],[-81.47134,36.85175],[-81.471,36.85184],[-81.47066,36.85194],[-81.47034,36.85206],[-81.47002,36.85219],[-81.46946,36.85245],[-81.46748,36.8535],[-81.46689,36.85381],[-81.46564,36.85445],[-81.46448,36.85501],[-81.46351,36.85544],[-81.46267,36.8558],[-81.462,36.85608],[-81.46179,36.85616],[-81.46146,36.85629],[-81.46097,36.85648],[-81.45595,36.85848],[-81.45536,36.85874],[-81.45003,36.86086],[-81.44909,36.86121],[-81.44884,36.86129],[-81.44854,36.86138],[-81.44804,36.86153],[-81.44771,36.86161],[-81.44718,36.86173],[-81.44657,36.86184],[-81.44616,36.86191],[-81.44581,36.86195],[-81.44524,36.86201],[-81.44085,36.86237],[-81.43824,36.86259],[-81.43648,36.86274],[-81.43445,36.86291],[-81.4338,36.86299],[-81.43287,36.86305],[-81.43156,36.86318],[-81.43084,36.86326],[-81.4296,36.86342],[-81.42934,36.86345],[-81.42778,36.86367],[-81.4268,36.86383],[-81.42541,36.86406],[-81.42425,36.86428],[-81.42322,36.86448],[-81.42299,36.86452],[-81.4224,36.86465],[-81.42177,36.86478],[-81.42059,36.86504],[-81.41929,36.86535],[-81.41837,36.86558],[-81.41721,36.86589],[-81.41613,36.86619],[-81.41512,36.86648],[-81.41451,36.86667],[-81.41339,36.86701],[-81.41226,36.86738],[-81.41148,36.86764],[-81.41026,36.86807],[-81.40974,36.86826],[-81.40891,36.86857],[-81.40859,36.8687],[-81.40815,36.86886],[-81.40558,36.86988],[-81.40507,36.87007],[-81.40356,36.87068],[-81.40317,36.87084],[-81.40275,36.87103],[-81.40237,36.87123],[-81.40192,36.87148],[-81.40143,36.87179],[-81.40112,36.872],[-81.40069,36.87233],[-81.40004,36.8729],[-81.39957,36.87337],[-81.39933,36.87365],[-81.39909,36.87394],[-81.39881,36.87433],[-81.39796,36.87548],[-81.39721,36.87642],[-81.39688,36.87681],[-81.39668,36.87705],[-81.39632,36.87741],[-81.39596,36.87775],[-81.39567,36.87801],[-81.39526,36.87835],[-81.39483,36.87867],[-81.39444,36.87893],[-81.39411,36.87914],[-81.39378,36.87934],[-81.39331,36.87959],[-81.39284,36.87984],[-81.39236,36.88005],[-81.39207,36.88018],[-81.39127,36.88049],[-81.39121,36.88052],[-81.38976,36.88108],[-81.38481,36.88305],[-81.38395,36.88339],[-81.37705,36.88612],[-81.37569,36.88666],[-81.37491,36.88696],[-81.37222,36.88803],[-81.3716,36.88828],[-81.37106,36.88849],[-81.37075,36.88861],[-81.36756,36.88988],[-81.36395,36.89131],[-81.3587,36.89338],[-81.35826,36.89355],[-81.35808,36.89362],[-81.35745,36.89385],[-81.35655,36.89416],[-81.35569,36.89445],[-81.3548,36.89473],[-81.35391,36.895],[-81.35287,36.89529],[-81.35199,36.89552],[-81.35116,36.89573],[-81.35026,36.89594],[-81.34903,36.8962],[-81.34851,36.89631],[-81.34828,36.89635],[-81.34772,36.89646],[-81.34063,36.89777],[-81.33766,36.89831],[-81.33333,36.89911],[-81.33213,36.89933],[-81.33103,36.89955],[-81.32981,36.8998],[-81.32804,36.90017],[-81.32778,36.90023],[-81.32749,36.90029],[-81.32659,36.90049],[-81.32513,36.90084],[-81.32328,36.90131],[-81.32194,36.90166],[-81.31971,36.90227],[-81.31841,36.90263],[-81.31747,36.90291],[-81.31643,36.90323],[-81.31477,36.90375],[-81.31308,36.90432],[-81.31232,36.90459],[-81.31133,36.90494],[-81.31045,36.90527],[-81.30961,36.90558],[-81.30925,36.90572],[-81.30818,36.90612],[-81.30677,36.90664],[-81.30566,36.90704],[-81.30431,36.9075],[-81.30332,36.90783],[-81.30237,36.90813],[-81.30102,36.90855],[-81.29956,36.90898],[-81.29793,36.90945],[-81.29667,36.90981],[-81.29497,36.9103],[-81.29422,36.91051],[-81.2937,36.91067],[-81.29268,36.91096],[-81.29254,36.91099],[-81.29049,36.91158],[-81.28971,36.9118],[-81.2892,36.91195],[-81.28882,36.91205],[-81.28814,36.91225],[-81.28778,36.91236],[-81.28083,36.91434],[-81.2798,36.91463],[-81.27916,36.91479],[-81.27825,36.91502],[-81.27816,36.91504],[-81.27707,36.91527],[-81.27626,36.91543],[-81.27533,36.91559],[-81.27467,36.9157],[-81.274,36.91579],[-81.27347,36.91587],[-81.27307,36.91592],[-81.27283,36.91594],[-81.27204,36.91603],[-81.2712,36.9161],[-81.27027,36.91619],[-81.26966,36.91624],[-81.26742,36.91645],[-81.26593,36.91658],[-81.26291,36.91685],[-81.25984,36.91713],[-81.2597,36.91714],[-81.25943,36.91717],[-81.2578,36.91732],[-81.25659,36.91743],[-81.25537,36.91756],[-81.25387,36.91773],[-81.25293,36.91785],[-81.25091,36.91813],[-81.24862,36.91845],[-81.24849,36.91847],[-81.24145,36.91946],[-81.23621,36.9202],[-81.23464,36.92043],[-81.23323,36.92065],[-81.23232,36.9208],[-81.23136,36.92098],[-81.23031,36.92117],[-81.22965,36.9213],[-81.22819,36.9216],[-81.22665,36.92193],[-81.22582,36.92211],[-81.22508,36.92228],[-81.21173,36.92523],[-81.20118,36.92756],[-81.20069,36.92767],[-81.19795,36.92828],[-81.18991,36.93005],[-81.18845,36.93038],[-81.18793,36.9305],[-81.18701,36.93072],[-81.18623,36.93092],[-81.17834,36.93305],[-81.17599,36.93368],[-81.16907,36.93555],[-81.16846,36.93571],[-81.16825,36.93576],[-81.16758,36.93593],[-81.16583,36.93632],[-81.16553,36.93638],[-81.16494,36.93649],[-81.16393,36.93666],[-81.16342,36.93674],[-81.15987,36.93722],[-81.1591,36.93733],[-81.15847,36.93745],[-81.15795,36.93756],[-81.15744,36.93769],[-81.15714,36.93777],[-81.1566,36.93793],[-81.15656,36.93795],[-81.15623,36.93806],[-81.15568,36.93826],[-81.15521,36.93845],[-81.15484,36.93861],[-81.15438,36.93883],[-81.1542,36.93892],[-81.15404,36.93901],[-81.15376,36.93915],[-81.15333,36.9394],[-81.15302,36.93959],[-81.15263,36.93984],[-81.15239,36.94001],[-81.15203,36.94026],[-81.15167,36.94054],[-81.15129,36.94087],[-81.15074,36.94136],[-81.15069,36.94141],[-81.14966,36.94241],[-81.14795,36.94413],[-81.14777,36.94428],[-81.14736,36.94468],[-81.14729,36.94475],[-81.14723,36.94481],[-81.14677,36.94528],[-81.14656,36.94546],[-81.14621,36.94578],[-81.14592,36.94603],[-81.14567,36.94624],[-81.14525,36.94656],[-81.14483,36.94685],[-81.14463,36.94698],[-81.14419,36.94725],[-81.1438,36.94747],[-81.14346,36.94765],[-81.14342,36.94767],[-81.14289,36.94792],[-81.14238,36.94814],[-81.14224,36.9482],[-81.14184,36.94834],[-81.1413,36.94853],[-81.14072,36.9487],[-81.14024,36.94882],[-81.13981,36.94892],[-81.13947,36.94899],[-81.139,36.94907],[-81.13839,36.94915],[-81.13774,36.94922],[-81.13528,36.94942],[-81.13451,36.9495],[-81.13412,36.94955],[-81.13359,36.94963],[-81.13292,36.94974],[-81.13239,36.94985],[-81.13187,36.94997],[-81.13161,36.95003],[-81.13122,36.95013],[-81.13063,36.9503],[-81.13044,36.95036],[-81.12967,36.95061],[-81.12891,36.95086],[-81.12324,36.95272],[-81.12191,36.95316],[-81.11983,36.95384],[-81.11887,36.95413],[-81.11712,36.95465],[-81.11307,36.95582],[-81.10427,36.95838],[-81.10353,36.95858],[-81.10299,36.95873],[-81.1023,36.95894],[-81.1019,36.95907],[-81.10106,36.95932],[-81.10063,36.95944],[-81.10002,36.95962],[-81.09912,36.95988],[-81.0983,36.96013],[-81.09353,36.96151],[-81.09186,36.96199],[-81.09177,36.96202],[-81.09083,36.96229],[-81.08954,36.96267],[-81.08933,36.96273],[-81.08626,36.96362],[-81.08561,36.96381],[-81.08455,36.96412],[-81.08373,36.96436],[-81.08342,36.96446],[-81.08213,36.96483],[-81.08044,36.96531],[-81.07994,36.96543],[-81.07992,36.96543],[-81.07971,36.96547],[-81.07954,36.96551],[-81.07932,36.96555],[-81.07894,36.96559],[-81.07838,36.96561],[-81.07813,36.96561],[-81.07811,36.96561],[-81.07768,36.9656],[-81.07722,36.96556],[-81.07696,36.96553],[-81.07666,36.96548],[-81.07624,36.9654],[-81.07601,36.96534],[-81.07555,36.96521],[-81.07516,36.96507],[-81.075,36.96501],[-81.07453,36.96482],[-81.07276,36.96407],[-81.07232,36.96388],[-81.07145,36.96351],[-81.07137,36.96347],[-81.07086,36.96326],[-81.06893,36.96244],[-81.06868,36.96233],[-81.06651,36.96141],[-81.06568,36.96106],[-81.06514,36.96084],[-81.06424,36.96045],[-81.06219,36.95957],[-81.0607,36.95894],[-81.06013,36.95869],[-81.05962,36.95845],[-81.0594,36.95833],[-81.05897,36.95809],[-81.05856,36.95784],[-81.05824,36.95762],[-81.05812,36.95754],[-81.05793,36.9574],[-81.05769,36.95721],[-81.05729,36.9568],[-81.05714,36.95668],[-81.05691,36.95646],[-81.05672,36.95627],[-81.05657,36.9561],[-81.05655,36.95608],[-81.05634,36.95583],[-81.05612,36.95555],[-81.056,36.95539],[-81.05597,36.95535],[-81.05582,36.95514],[-81.05565,36.95489],[-81.05537,36.9544],[-81.05525,36.95419],[-81.05511,36.9539],[-81.05496,36.95357],[-81.05488,36.95337],[-81.05474,36.95298],[-81.05465,36.95269],[-81.05455,36.9523],[-81.0545,36.95209],[-81.05417,36.95087],[-81.05409,36.95057],[-81.05398,36.95018],[-81.0539,36.94995],[-81.05379,36.94969],[-81.05366,36.9494],[-81.05352,36.94912],[-81.05345,36.94902],[-81.0534,36.94892],[-81.05338,36.9489],[-81.05322,36.94869],[-81.05317,36.94863],[-81.05311,36.94856],[-81.05297,36.94839],[-81.05268,36.94808],[-81.05252,36.94793],[-81.05227,36.94771],[-81.05204,36.94753],[-81.05182,36.94737],[-81.05144,36.94713],[-81.05112,36.94694],[-81.05077,36.94677],[-81.05069,36.94673],[-81.0504,36.94661],[-81.05008,36.94649],[-81.04974,36.94638],[-81.04906,36.94621],[-81.04804,36.94604],[-81.04785,36.94601],[-81.0466,36.94581],[-81.04626,36.94576],[-81.04559,36.94569],[-81.04507,36.94566],[-81.04442,36.94563],[-81.04406,36.94563],[-81.0436,36.94564],[-81.04304,36.94567],[-81.04267,36.9457],[-81.04219,36.94575],[-81.0418,36.9458],[-81.04095,36.94594],[-81.04049,36.94602],[-81.03808,36.94642],[-81.03741,36.94651],[-81.03703,36.94654],[-81.03668,36.94655],[-81.03638,36.94656],[-81.03596,36.94656],[-81.03558,36.94654],[-81.03522,36.94651],[-81.03482,36.94647],[-81.0343,36.9464],[-81.03367,36.94628],[-81.03235,36.94595],[-81.03169,36.94581],[-81.0294,36.94527],[-81.02858,36.94506],[-81.02828,36.94496],[-81.02786,36.94481],[-81.02751,36.94466],[-81.02703,36.94441],[-81.02682,36.94429],[-81.02656,36.94412],[-81.02616,36.94381],[-81.02595,36.94364],[-81.02572,36.94342],[-81.02532,36.94306],[-81.02443,36.94222],[-81.02403,36.94188],[-81.02379,36.94171],[-81.02375,36.94168],[-81.0236,36.94158],[-81.02356,36.94155],[-81.02328,36.9414],[-81.02304,36.94128],[-81.02276,36.94116],[-81.02248,36.94105],[-81.02225,36.94098],[-81.02194,36.9409],[-81.02173,36.94085],[-81.02142,36.9408],[-81.02116,36.94077],[-81.02087,36.94074],[-81.02058,36.94073],[-81.02022,36.94073],[-81.01546,36.94083],[-81.01468,36.94084],[-81.01449,36.94084],[-81.01268,36.94085],[-81.01083,36.94085],[-81.00941,36.94085],[-81.00883,36.94084],[-81.0086,36.94083],[-81.00793,36.94076],[-81.00771,36.94072],[-81.00726,36.94062],[-81.00698,36.94054],[-81.00663,36.94044],[-81.00639,36.94035],[-81.00609,36.94023],[-81.00546,36.93995],[-81.00323,36.93892],[-81.00291,36.93878],[-81.00246,36.93861],[-81.00217,36.93851],[-81.0018,36.93839],[-81.00141,36.93828],[-81.00107,36.9382],[-81.00065,36.93811],[-81.00036,36.93806],[-80.99992,36.93798],[-80.99689,36.9375],[-80.99559,36.9373],[-80.99503,36.93723],[-80.99437,36.93716],[-80.994,36.93713],[-80.9933,36.93709],[-80.99058,36.93699],[-80.9898,36.93696],[-80.98916,36.93695],[-80.98841,36.93695],[-80.98788,36.93696],[-80.98736,36.93699],[-80.98677,36.93703],[-80.98608,36.93709],[-80.98557,36.93715],[-80.98478,36.93727],[-80.9843,36.93736],[-80.98357,36.93751],[-80.98285,36.93767],[-80.98239,36.93779],[-80.98187,36.93794],[-80.98124,36.93814],[-80.98095,36.93823],[-80.98071,36.93832],[-80.97949,36.93877],[-80.97898,36.93896],[-80.97754,36.93949],[-80.9739,36.94085],[-80.97283,36.94125],[-80.9727,36.9413],[-80.9724,36.94141],[-80.97178,36.94161],[-80.97117,36.94179],[-80.97066,36.94193],[-80.97028,36.94203],[-80.96988,36.94212],[-80.96875,36.94233],[-80.96153,36.94356],[-80.9613,36.9436],[-80.96085,36.94367],[-80.95809,36.94415],[-80.95675,36.94437],[-80.9547,36.94472],[-80.95393,36.94485],[-80.95351,36.94492],[-80.95339,36.94494],[-80.95165,36.94524],[-80.95122,36.94531],[-80.95062,36.94541],[-80.9499,36.94553],[-80.9489,36.9457],[-80.94867,36.94574],[-80.94815,36.94583],[-80.94805,36.94585],[-80.94772,36.9459],[-80.94733,36.94597],[-80.9464,36.94612],[-80.94537,36.94626],[-80.94503,36.94629],[-80.94471,36.9463],[-80.94381,36.94636],[-80.94313,36.94638],[-80.94258,36.94642],[-80.94229,36.94643],[-80.94115,36.94648],[-80.94078,36.94649],[-80.94014,36.94652],[-80.93963,36.94655],[-80.93877,36.94663],[-80.93798,36.94674],[-80.93729,36.94685],[-80.93302,36.94751],[-80.92965,36.94802],[-80.92902,36.94812],[-80.92854,36.94821],[-80.92824,36.94825],[-80.92784,36.9483],[-80.92725,36.94837],[-80.92692,36.9484],[-80.92614,36.94845],[-80.92575,36.94846],[-80.92476,36.94845],[-80.92393,36.94842],[-80.92324,36.94837],[-80.9228,36.94833],[-80.92168,36.9482],[-80.92125,36.94814],[-80.92074,36.94805],[-80.92032,36.94797],[-80.9197,36.94784],[-80.91965,36.94783],[-80.91912,36.9477],[-80.9153,36.94679],[-80.91425,36.94655],[-80.91372,36.94643],[-80.9133,36.94635],[-80.91262,36.94623],[-80.91203,36.94615],[-80.9117,36.94611],[-80.91115,36.94605],[-80.91038,36.94599],[-80.90952,36.94595],[-80.90875,36.94594],[-80.90789,36.94596],[-80.90734,36.94598],[-80.90625,36.94607],[-80.90164,36.94647],[-80.90111,36.94652],[-80.90053,36.94658],[-80.89974,36.94669],[-80.89961,36.94671],[-80.89852,36.94691],[-80.89675,36.94726],[-80.8962,36.94737],[-80.89363,36.94788],[-80.89267,36.94806],[-80.89144,36.94831],[-80.89142,36.94831],[-80.88934,36.94872],[-80.88446,36.94969],[-80.884,36.94978],[-80.88342,36.94989],[-80.88168,36.95023],[-80.88072,36.95042],[-80.87798,36.95096],[-80.87305,36.95193],[-80.87246,36.95205],[-80.8721,36.95212],[-80.87115,36.95231],[-80.86937,36.95266],[-80.86864,36.95282],[-80.86796,36.95299],[-80.8673,36.95317],[-80.86692,36.95329],[-80.8663,36.9535],[-80.86568,36.95372],[-80.8652,36.95391],[-80.8648,36.95408],[-80.86422,36.95434],[-80.86375,36.95457],[-80.86329,36.9548],[-80.86314,36.95488],[-80.86262,36.95518],[-80.86242,36.95529],[-80.86196,36.95558],[-80.86142,36.95593],[-80.86106,36.95619],[-80.86081,36.95637],[-80.86032,36.95674],[-80.86003,36.95697],[-80.8596,36.95734],[-80.85929,36.95762],[-80.85902,36.95788],[-80.859,36.9579],[-80.85867,36.95823],[-80.8574,36.95957],[-80.85685,36.96016],[-80.85509,36.96203],[-80.85429,36.96289],[-80.85412,36.96307],[-80.85353,36.9637],[-80.85234,36.96497],[-80.85096,36.96643],[-80.85044,36.96699],[-80.84915,36.96837],[-80.84592,36.9718],[-80.84568,36.97206],[-80.84534,36.97241],[-80.84499,36.97275],[-80.8449,36.97283],[-80.84445,36.97324],[-80.84416,36.97348],[-80.84385,36.97373],[-80.84358,36.97395],[-80.84328,36.97417],[-80.84266,36.97461],[-80.84234,36.97481],[-80.84202,36.97502],[-80.84168,36.97522],[-80.84136,36.97541],[-80.8408,36.97571],[-80.84064,36.9758],[-80.83728,36.97759],[-80.83644,36.97804],[-80.83501,36.97882],[-80.83481,36.97892],[-80.83412,36.97929],[-80.83336,36.97969],[-80.82725,36.98295],[-80.82631,36.98345],[-80.82154,36.986],[-80.82065,36.98648],[-80.81856,36.98759],[-80.81793,36.9879],[-80.81741,36.98814],[-80.81672,36.98843],[-80.81621,36.98864],[-80.81571,36.98882],[-80.81522,36.98899],[-80.8145,36.9892],[-80.81397,36.98935],[-80.81321,36.98954],[-80.81277,36.98963],[-80.812,36.98978],[-80.81159,36.98984],[-80.8104,36.99001],[-80.80884,36.99022],[-80.80762,36.99039],[-80.80725,36.99044],[-80.80206,36.99114],[-80.80067,36.99133],[-80.80014,36.99142],[-80.79962,36.99152],[-80.79929,36.99159],[-80.79866,36.99173],[-80.79813,36.99187],[-80.79761,36.99202],[-80.79756,36.99204],[-80.79625,36.99245],[-80.79318,36.99344],[-80.79236,36.9937],[-80.78921,36.99471],[-80.78584,36.99581],[-80.78553,36.99592],[-80.7784,36.99822],[-80.77752,36.9985],[-80.77188,37.00032],[-80.77126,37.00051],[-80.77058,37.00069],[-80.77009,37.00082],[-80.76985,37.00088],[-80.7616,37.00285],[-80.76113,37.00297],[-80.76073,37.00308],[-80.76066,37.0031],[-80.75993,37.00333],[-80.75932,37.00353],[-80.75898,37.00365],[-80.75851,37.00383],[-80.75806,37.00402],[-80.75734,37.00435],[-80.75686,37.00458],[-80.75641,37.00481],[-80.75627,37.00489],[-80.75582,37.00514],[-80.75471,37.00576],[-80.75213,37.00721],[-80.74913,37.0089],[-80.74831,37.00935],[-80.74779,37.00962],[-80.74728,37.00987],[-80.74677,37.01011],[-80.74617,37.01036],[-80.7457,37.01055],[-80.74521,37.01072],[-80.74121,37.01212],[-80.74067,37.01231],[-80.7403,37.01247],[-80.73993,37.01263],[-80.73958,37.0128],[-80.73932,37.01295],[-80.73893,37.01317],[-80.73859,37.0134],[-80.73817,37.0137],[-80.73789,37.01391],[-80.73765,37.01412],[-80.73727,37.01447],[-80.73708,37.01466],[-80.7369,37.01486],[-80.73651,37.01532],[-80.73257,37.02006],[-80.73228,37.02041],[-80.73193,37.02086],[-80.73166,37.02123],[-80.7314,37.02162],[-80.73112,37.02206],[-80.73074,37.02274],[-80.73066,37.02288],[-80.73056,37.02307],[-80.73043,37.02336],[-80.73021,37.02384],[-80.72998,37.0244],[-80.72983,37.02482],[-80.72968,37.0253],[-80.72956,37.02575],[-80.72939,37.02641],[-80.72902,37.02789],[-80.72878,37.02883],[-80.72863,37.02942],[-80.72846,37.03014],[-80.72835,37.03053],[-80.72809,37.03155],[-80.72797,37.03198],[-80.72782,37.03243],[-80.72774,37.03264],[-80.72753,37.03315],[-80.72733,37.03357],[-80.72699,37.0342],[-80.72678,37.03455],[-80.72659,37.03484],[-80.72634,37.03521],[-80.72607,37.03557],[-80.72572,37.036],[-80.72539,37.03637],[-80.72514,37.03664],[-80.72469,37.03708],[-80.72446,37.03729],[-80.72349,37.03812],[-80.72097,37.04025],[-80.71939,37.04161],[-80.71886,37.04209],[-80.71843,37.0425],[-80.71808,37.04287],[-80.71779,37.04319],[-80.71749,37.04353],[-80.7172,37.04389],[-80.71688,37.04431],[-80.71651,37.04483],[-80.71611,37.04542],[-80.71581,37.04589],[-80.71557,37.04637],[-80.71529,37.04706],[-80.715,37.04776],[-80.71475,37.04845],[-80.71444,37.0493],[-80.71397,37.05055],[-80.71381,37.05096],[-80.71344,37.05181],[-80.71326,37.05219],[-80.713,37.05273],[-80.71286,37.05302],[-80.71254,37.05363],[-80.7122,37.05423],[-80.71098,37.05636],[-80.70962,37.05872],[-80.70912,37.05962],[-80.70892,37.06003],[-80.70873,37.06043],[-80.70834,37.06127],[-80.70811,37.06182],[-80.7079,37.06236],[-80.70769,37.06291],[-80.70724,37.06423],[-80.70682,37.06545],[-80.70664,37.06599],[-80.70579,37.0685],[-80.70559,37.06906],[-80.70551,37.06921],[-80.70535,37.06954],[-80.70518,37.06988],[-80.70506,37.07009],[-80.7049,37.07041],[-80.7047,37.07077],[-80.70455,37.071],[-80.70438,37.07123],[-80.70415,37.07153],[-80.70334,37.07244],[-80.70281,37.07293],[-80.70256,37.07316],[-80.7023,37.07336],[-80.70212,37.0735],[-80.70182,37.07372],[-80.7013,37.07408],[-80.70098,37.07428],[-80.70063,37.07448],[-80.7003,37.07466],[-80.70025,37.07468],[-80.69967,37.07498],[-80.69926,37.07519],[-80.69799,37.07583],[-80.6954,37.07715],[-80.69456,37.07757],[-80.69413,37.07778],[-80.69375,37.07795],[-80.69308,37.07824],[-80.6923,37.07853],[-80.69219,37.07857],[-80.69127,37.07889],[-80.69078,37.07902],[-80.69023,37.07917],[-80.6898,37.07928],[-80.68937,37.07938],[-80.68894,37.07947],[-80.68853,37.07955],[-80.68815,37.07961],[-80.6875,37.07971],[-80.68733,37.07973],[-80.68708,37.07976],[-80.68659,37.07982],[-80.68555,37.07989],[-80.68465,37.07993],[-80.68403,37.07992],[-80.68269,37.07989],[-80.68236,37.07987],[-80.68017,37.07976],[-80.67752,37.07965],[-80.66901,37.07927],[-80.6682,37.07925],[-80.66747,37.07926],[-80.66675,37.07929],[-80.66598,37.07935],[-80.66514,37.07944],[-80.66471,37.0795],[-80.66426,37.07957],[-80.6637,37.07966],[-80.66329,37.07975],[-80.66224,37.07997],[-80.66123,37.0802],[-80.66087,37.08029],[-80.65811,37.0809],[-80.65699,37.08116],[-80.65575,37.08151],[-80.65441,37.08196],[-80.65333,37.08238],[-80.65289,37.08263],[-80.65184,37.08317],[-80.65067,37.08379],[-80.64854,37.08491],[-80.64761,37.08535],[-80.64655,37.08579],[-80.64612,37.08592],[-80.6459,37.08602],[-80.64501,37.08632],[-80.64422,37.08658],[-80.64253,37.08705],[-80.64127,37.08731],[-80.63968,37.08758],[-80.63843,37.08773],[-80.63735,37.08781],[-80.63675,37.08784],[-80.63603,37.08787],[-80.63578,37.08787],[-80.63499,37.08788],[-80.63379,37.08785],[-80.63249,37.08782],[-80.63146,37.08778],[-80.63089,37.08773],[-80.62973,37.08763],[-80.6285,37.08747],[-80.62713,37.08723],[-80.62558,37.08691],[-80.6255,37.08689],[-80.62479,37.08677],[-80.62402,37.08667],[-80.62298,37.08657],[-80.62169,37.08649],[-80.62022,37.0865],[-80.61859,37.08659],[-80.61747,37.08665],[-80.61593,37.08674],[-80.60899,37.08712],[-80.60842,37.08715],[-80.60786,37.08717],[-80.60731,37.08718],[-80.60654,37.08718],[-80.60597,37.08718],[-80.6054,37.08717],[-80.60462,37.08715],[-80.6035,37.08709],[-80.60269,37.08703],[-80.60198,37.08697],[-80.60036,37.0868],[-80.5976,37.08648],[-80.59436,37.0861],[-80.59358,37.08602],[-80.59331,37.08599],[-80.5931,37.08598],[-80.59242,37.08595],[-80.5918,37.08593],[-80.59126,37.08594],[-80.59072,37.08596],[-80.59003,37.08601],[-80.58961,37.08605],[-80.58907,37.08612],[-80.58877,37.08617],[-80.58836,37.08623],[-80.58797,37.08631],[-80.58745,37.08642],[-80.58691,37.08655],[-80.5864,37.08669],[-80.586,37.08681],[-80.58537,37.08703],[-80.5851,37.08713],[-80.5847,37.08728],[-80.58437,37.08743],[-80.58358,37.08777],[-80.58267,37.0881],[-80.57876,37.0898],[-80.57784,37.09019],[-80.57539,37.09125],[-80.57313,37.09216],[-80.57259,37.09235],[-80.57209,37.09252],[-80.57175,37.09265],[-80.57158,37.09272],[-80.57152,37.09274],[-80.57121,37.09287],[-80.56916,37.09365],[-80.56868,37.09383],[-80.56831,37.09398],[-80.56522,37.09515],[-80.56514,37.09518],[-80.565,37.09523],[-80.56458,37.09539],[-80.56385,37.09569],[-80.5632,37.09597],[-80.56237,37.09635],[-80.56155,37.09676],[-80.56121,37.09694],[-80.55748,37.09898],[-80.55715,37.09915],[-80.5568,37.09932],[-80.55677,37.09934],[-80.55669,37.09937],[-80.55643,37.09948],[-80.55626,37.09955],[-80.55605,37.09964],[-80.55564,37.09979],[-80.55504,37.09998],[-80.55448,37.10009],[-80.55361,37.10026],[-80.55299,37.10032],[-80.55219,37.10036],[-80.55159,37.10036],[-80.55101,37.10032],[-80.54982,37.10022],[-80.54819,37.10006],[-80.5457,37.09985],[-80.54444,37.09974],[-80.54308,37.09956],[-80.54181,37.0994],[-80.53884,37.0989],[-80.53712,37.09859],[-80.53549,37.09841],[-80.53462,37.09835],[-80.53364,37.09832],[-80.5325,37.09835],[-80.52904,37.09852],[-80.52748,37.09856],[-80.52617,37.09857],[-80.52473,37.09855],[-80.52286,37.09848],[-80.52138,37.09838],[-80.51974,37.09825],[-80.5188,37.09815],[-80.51583,37.09779],[-80.51447,37.09758],[-80.51297,37.09732],[-80.51114,37.09695],[-80.51071,37.09687],[-80.51043,37.09681],[-80.50426,37.09538],[-80.50282,37.09504],[-80.50131,37.09469],[-80.49958,37.0944],[-80.49883,37.0943],[-80.49768,37.09421],[-80.49703,37.09416],[-80.49634,37.09411],[-80.49377,37.0941],[-80.49198,37.09414],[-80.48902,37.09421],[-80.4854,37.09429],[-80.483,37.09435],[-80.48169,37.09441],[-80.48087,37.09449],[-80.47979,37.09467],[-80.4793,37.09479],[-80.47845,37.09501],[-80.47772,37.09527],[-80.47685,37.0956],[-80.47618,37.09593],[-80.47567,37.09619],[-80.47335,37.09744],[-80.46821,37.10028],[-80.46643,37.10124],[-80.46503,37.10204],[-80.46321,37.10305],[-80.4618,37.10378],[-80.46004,37.10464],[-80.45659,37.10611],[-80.45262,37.10791],[-80.44726,37.1103],[-80.44277,37.1123],[-80.44039,37.11333],[-80.43968,37.11362],[-80.43893,37.11388],[-80.43736,37.11439],[-80.43644,37.11461],[-80.4357,37.11476],[-80.43491,37.1149],[-80.43393,37.11502],[-80.42522,37.11571],[-80.42314,37.1159],[-80.42234,37.11596],[-80.41881,37.11627],[-80.41779,37.11635],[-80.41693,37.11648],[-80.4159,37.11669],[-80.41494,37.11691],[-80.41393,37.1172],[-80.40792,37.1193],[-80.39916,37.12244],[-80.3961,37.12353],[-80.39516,37.12383],[-80.39449,37.12401],[-80.39379,37.12416],[-80.39307,37.12427],[-80.39181,37.12432],[-80.38622,37.1244],[-80.3853,37.12444],[-80.38459,37.1245],[-80.38348,37.12461],[-80.38256,37.12475],[-80.3817,37.12491],[-80.3811,37.12506],[-80.38005,37.12532],[-80.3792,37.12558],[-80.37841,37.12587],[-80.37532,37.12706],[-80.37233,37.12819],[-80.37049,37.1289],[-80.3698,37.12918],[-80.36782,37.12993],[-80.36221,37.1325],[-80.36022,37.1334],[-80.35951,37.13379],[-80.35891,37.13417],[-80.35808,37.13484],[-80.35752,37.13552],[-80.35692,37.13642],[-80.35642,37.13722],[-80.3561,37.13776],[-80.35577,37.13824],[-80.35508,37.13938],[-80.3542,37.14047],[-80.35368,37.14096],[-80.35315,37.14139],[-80.35245,37.14186],[-80.35183,37.14219],[-80.35167,37.14228],[-80.35074,37.14269],[-80.3496,37.14315],[-80.34861,37.14354],[-80.34785,37.14385],[-80.34714,37.14414],[-80.34264,37.14593],[-80.33617,37.1485],[-80.3351,37.14895],[-80.333,37.14988],[-80.33074,37.15102],[-80.32736,37.1529],[-80.32666,37.15331],[-80.3261,37.15375],[-80.32542,37.15447],[-80.32495,37.15507],[-80.32458,37.15564],[-80.32412,37.15652],[-80.32362,37.15748],[-80.32331,37.15803],[-80.32176,37.16111],[-80.32052,37.1633],[-80.31994,37.16404],[-80.3193,37.16473],[-80.31868,37.16532],[-80.31752,37.16621],[-80.31669,37.16671],[-80.31457,37.16765],[-80.31366,37.16799],[-80.30519,37.17101],[-80.30443,37.17137],[-80.3039,37.17166],[-80.30306,37.17222],[-80.30243,37.17269],[-80.3011,37.17378],[-80.30012,37.17487],[-80.29694,37.1801],[-80.2964,37.18076],[-80.29597,37.18123],[-80.29522,37.18182],[-80.29446,37.18223],[-80.29389,37.18248],[-80.29328,37.18271],[-80.29248,37.18298],[-80.29116,37.18334],[-80.28827,37.18414],[-80.28599,37.1848],[-80.28464,37.18531],[-80.2834,37.18598],[-80.28272,37.18641],[-80.28018,37.18816],[-80.27871,37.18917],[-80.27762,37.18987],[-80.27373,37.1926],[-80.27297,37.19312],[-80.27153,37.19406],[-80.26995,37.19522],[-80.26953,37.19562],[-80.26929,37.19593],[-80.26895,37.1963],[-80.2687,37.19669],[-80.26842,37.19715],[-80.2682,37.19763],[-80.26804,37.19807],[-80.26779,37.19889],[-80.26756,37.19965],[-80.26723,37.20057],[-80.26701,37.20114],[-80.26675,37.20201],[-80.26639,37.2031],[-80.26618,37.20375],[-80.26593,37.20429],[-80.26569,37.20473],[-80.26533,37.20521],[-80.26481,37.20583],[-80.26411,37.20637],[-80.26321,37.20696],[-80.26237,37.20741],[-80.26166,37.20786],[-80.26101,37.20835],[-80.26046,37.20892],[-80.26007,37.20955],[-80.25974,37.21014],[-80.2596,37.21067],[-80.25942,37.21241],[-80.25927,37.21514],[-80.25919,37.21566],[-80.259,37.21635],[-80.25862,37.21731],[-80.25817,37.21829],[-80.25554,37.22318],[-80.2552,37.22374],[-80.25472,37.22429],[-80.25391,37.22491],[-80.2529,37.22552],[-80.25195,37.22595],[-80.25122,37.22617],[-80.25047,37.22634],[-80.24952,37.22643],[-80.24843,37.22652],[-80.24719,37.2267],[-80.24627,37.2269],[-80.24521,37.22721],[-80.2446,37.22743],[-80.24335,37.22794],[-80.24265,37.22832],[-80.24192,37.22872],[-80.24053,37.22973],[-80.23971,37.23047],[-80.23909,37.23124],[-80.2388,37.23157],[-80.23814,37.23236],[-80.23719,37.23344],[-80.2362,37.23466],[-80.23593,37.23502],[-80.23562,37.23536],[-80.23512,37.23588],[-80.23397,37.23676],[-80.23275,37.23751],[-80.23137,37.23811],[-80.23029,37.23848],[-80.22926,37.23874],[-80.2203,37.24072],[-80.21477,37.24199],[-80.21323,37.24229],[-80.21198,37.24282],[-80.21144,37.24307],[-80.21087,37.24343],[-80.20987,37.24431],[-80.20832,37.24595],[-80.20719,37.24686],[-80.20604,37.24759],[-80.20469,37.24828],[-80.20415,37.24852],[-80.20382,37.24864],[-80.20335,37.2488],[-80.20282,37.24896],[-80.2025,37.24905],[-80.20174,37.24923],[-80.20128,37.24932],[-80.20083,37.2494],[-80.20027,37.24947],[-80.19976,37.24952],[-80.1993,37.24956],[-80.19849,37.24959],[-80.19341,37.2498],[-80.18903,37.24997],[-80.18863,37.24999],[-80.18822,37.25003],[-80.18766,37.25009],[-80.18716,37.25016],[-80.18672,37.25024],[-80.18602,37.25038],[-80.18562,37.25049],[-80.18513,37.25062],[-80.18469,37.25076],[-80.18427,37.25091],[-80.18383,37.25108],[-80.18338,37.25127],[-80.18304,37.25143],[-80.1827,37.25159],[-80.18229,37.25181],[-80.18198,37.25198],[-80.18147,37.2523],[-80.18128,37.25243],[-80.18053,37.25294],[-80.17893,37.25404],[-80.17757,37.25497],[-80.17742,37.25507],[-80.17717,37.25524],[-80.17678,37.25552],[-80.17608,37.25597],[-80.17559,37.25634],[-80.17447,37.25711],[-80.17377,37.25756],[-80.17338,37.25781],[-80.17281,37.25814],[-80.17231,37.25843],[-80.17188,37.25866],[-80.17174,37.25873],[-80.17126,37.25897],[-80.17071,37.25924],[-80.16964,37.25972],[-80.16914,37.25993],[-80.16852,37.26017],[-80.16837,37.26022],[-80.16813,37.26031],[-80.16778,37.26044],[-80.16624,37.26103],[-80.16574,37.26122],[-80.16521,37.26143],[-80.16453,37.26168],[-80.16363,37.26203],[-80.16261,37.26242],[-80.16234,37.26253],[-80.16015,37.26336],[-80.15726,37.26447],[-80.1556,37.2651],[-80.15531,37.26521],[-80.1496,37.2674],[-80.14921,37.26754],[-80.14858,37.26779],[-80.14754,37.26818],[-80.1471,37.26835],[-80.14676,37.26848],[-80.14631,37.26867],[-80.146,37.26881],[-80.14586,37.26887],[-80.14552,37.26904],[-80.14513,37.26922],[-80.14482,37.2694],[-80.14444,37.26963],[-80.14403,37.2699],[-80.14361,37.27023],[-80.14331,37.27046],[-80.1431,37.27063],[-80.14294,37.27077],[-80.14273,37.27095],[-80.14238,37.27128],[-80.14205,37.27162],[-80.14174,37.27197],[-80.14136,37.27242],[-80.14011,37.27393],[-80.13981,37.27429],[-80.13912,37.27521],[-80.13877,37.27561],[-80.13855,37.27585],[-80.13829,37.27611],[-80.13801,37.27636],[-80.13772,37.2766],[-80.13742,37.27683],[-80.13711,37.27705],[-80.13668,37.27732],[-80.13567,37.27793],[-80.13436,37.27872],[-80.13303,37.27953],[-80.13259,37.27979],[-80.13241,37.2799],[-80.1307,37.28093],[-80.12788,37.28263],[-80.12767,37.28275],[-80.12741,37.28292],[-80.12596,37.28379],[-80.12507,37.28433],[-80.12412,37.2849],[-80.12307,37.28553],[-80.12123,37.28664],[-80.12064,37.28696],[-80.12033,37.28713],[-80.12015,37.28723],[-80.11992,37.28735],[-80.11961,37.28749],[-80.11927,37.28765],[-80.11916,37.2877],[-80.11856,37.28796],[-80.11805,37.28816],[-80.11753,37.28835],[-80.1169,37.28856],[-80.11652,37.28868],[-80.11562,37.28893],[-80.11291,37.28969],[-80.1115,37.29008],[-80.11045,37.29037],[-80.11011,37.29046],[-80.10626,37.29154],[-80.10612,37.29158],[-80.1046,37.292],[-80.10386,37.29221],[-80.10141,37.29289],[-80.10127,37.29293],[-80.09982,37.29332],[-80.09918,37.2935],[-80.0981,37.29381],[-80.09667,37.2942],[-80.09524,37.29458],[-80.09293,37.29516],[-80.09154,37.29551],[-80.09113,37.29559],[-80.09064,37.29572],[-80.08999,37.2959],[-80.08876,37.29621],[-80.08857,37.29625],[-80.08661,37.29675],[-80.08587,37.29695],[-80.08518,37.29716],[-80.08452,37.29739],[-80.08422,37.2975],[-80.0838,37.29767],[-80.08316,37.29794],[-80.08295,37.29803],[-80.08228,37.29834],[-80.08192,37.29853],[-80.08161,37.29869],[-80.08107,37.29899],[-80.08054,37.29931],[-80.08022,37.29952],[-80.07887,37.30041],[-80.07852,37.30064],[-80.07759,37.30126],[-80.07737,37.3014],[-80.07631,37.3021],[-80.07416,37.30352],[-80.07343,37.30401],[-80.07294,37.30433],[-80.07253,37.30461],[-80.06882,37.30706],[-80.0675,37.30793],[-80.06681,37.30838],[-80.06532,37.30928],[-80.06433,37.30988],[-80.06363,37.31025],[-80.06273,37.31075],[-80.06201,37.31112],[-80.06125,37.3115],[-80.06079,37.31173],[-80.05921,37.31247],[-80.05897,37.31259],[-80.05815,37.31297],[-80.05466,37.31462],[-80.05449,37.3147],[-80.05414,37.31487],[-80.05396,37.31496],[-80.0531,37.31536],[-80.05263,37.31558],[-80.05211,37.31583],[-80.05174,37.31601],[-80.05132,37.3162],[-80.05112,37.31629],[-80.05072,37.31647],[-80.05043,37.31661],[-80.04938,37.31708],[-80.04895,37.31725],[-80.04841,37.31748],[-80.04773,37.31773],[-80.04728,37.31789],[-80.04683,37.31804],[-80.04613,37.31825],[-80.04578,37.31835],[-80.04501,37.31855],[-80.04424,37.31874],[-80.04378,37.31884],[-80.04305,37.31898],[-80.04125,37.3193],[-80.04071,37.3194],[-80.04037,37.31948],[-80.04009,37.31955],[-80.03955,37.31971],[-80.03914,37.31986],[-80.03882,37.31998],[-80.03873,37.32002],[-80.03854,37.32011],[-80.03807,37.32033],[-80.03793,37.3204],[-80.03773,37.32049],[-80.03764,37.32055],[-80.03741,37.32068],[-80.03702,37.32093],[-80.0367,37.32115],[-80.03647,37.32132],[-80.03614,37.32158],[-80.03593,37.32177],[-80.03573,37.32195],[-80.03549,37.32219],[-80.03541,37.32227],[-80.03505,37.32266],[-80.03425,37.32357],[-80.0341,37.32373],[-80.03339,37.32451],[-80.03309,37.3248],[-80.03277,37.32513],[-80.03248,37.32544],[-80.03194,37.32595],[-80.03154,37.32632],[-80.03124,37.32659],[-80.03084,37.32691],[-80.03043,37.32724],[-80.02998,37.32761],[-80.02966,37.3279],[-80.02905,37.32836],[-80.02827,37.32892],[-80.02783,37.32923],[-80.02743,37.3295],[-80.02662,37.33002],[-80.02585,37.3305],[-80.02489,37.33104],[-80.02445,37.33129],[-80.02367,37.33169],[-80.023,37.33202],[-80.02251,37.33226],[-80.02175,37.33261],[-80.02106,37.33291],[-80.02033,37.33321],[-80.0195,37.33354],[-80.01911,37.33368],[-80.01819,37.334],[-80.01506,37.33506],[-80.01391,37.33545],[-80.01282,37.33582],[-80.00827,37.33736],[-80.00736,37.33767],[-80.00669,37.33789],[-80.00627,37.33803],[-80.00618,37.33806],[-80.00598,37.33811],[-80.00436,37.33864],[-80.00336,37.33895],[-80.00249,37.33919],[-80.00226,37.33926],[-80.00206,37.33931],[-80.0017,37.33943],[-80.00148,37.3395],[-80.0006,37.33973],[-79.99955,37.34001],[-79.99898,37.34017],[-79.99856,37.34031],[-79.99816,37.34046],[-79.99785,37.34058],[-79.99762,37.34068],[-79.99724,37.34086],[-79.99681,37.34109],[-79.99647,37.34127],[-79.99627,37.34139],[-79.99605,37.34152],[-79.99561,37.34182],[-79.99528,37.34206],[-79.99497,37.34231],[-79.9946,37.34263],[-79.99386,37.34332],[-79.99372,37.34343],[-79.99361,37.34351],[-79.99291,37.34415],[-79.99224,37.34474],[-79.99165,37.34524],[-79.99138,37.34547],[-79.99109,37.3457],[-79.99085,37.34589],[-79.99054,37.34615],[-79.99005,37.34653],[-79.98937,37.34703],[-79.9888,37.34744],[-79.98821,37.34786],[-79.98525,37.34997],[-79.98457,37.35046],[-79.9835,37.35121],[-79.98329,37.35136],[-79.98122,37.35284],[-79.981,37.353],[-79.98063,37.35326],[-79.98048,37.35337],[-79.98015,37.3536],[-79.97939,37.35415],[-79.97565,37.35682],[-79.97486,37.35739],[-79.97446,37.35767],[-79.97426,37.35781],[-79.97375,37.35814],[-79.97343,37.35833],[-79.97312,37.35851],[-79.9729,37.35864],[-79.97254,37.35882],[-79.9722,37.359],[-79.9717,37.35922],[-79.97121,37.35943],[-79.97071,37.35963],[-79.97019,37.35981],[-79.9698,37.35993],[-79.96941,37.36005],[-79.96875,37.36023],[-79.96834,37.36032],[-79.96793,37.36041],[-79.9674,37.36051],[-79.96684,37.3606],[-79.96642,37.36065],[-79.96601,37.3607],[-79.96586,37.36071],[-79.96544,37.36075],[-79.96516,37.36076],[-79.96474,37.36078],[-79.96376,37.36082],[-79.9628,37.36085],[-79.96224,37.36087],[-79.96197,37.36087],[-79.96157,37.36089],[-79.96129,37.3609],[-79.96074,37.36091],[-79.95996,37.36094],[-79.95858,37.36098],[-79.95733,37.36103],[-79.95662,37.36107],[-79.95607,37.36112],[-79.95536,37.36118],[-79.95467,37.36125],[-79.95399,37.36132],[-79.95316,37.36143],[-79.95261,37.36152],[-79.95219,37.36158],[-79.9515,37.3617],[-79.95138,37.36171],[-79.95068,37.36184],[-79.95,37.36198],[-79.94933,37.36212],[-79.94826,37.36236],[-79.94739,37.36257],[-79.94598,37.36291],[-79.94512,37.36312],[-79.94186,37.36389],[-79.94124,37.36404],[-79.94017,37.36429],[-79.93975,37.36438],[-79.93897,37.36455],[-79.93888,37.36457],[-79.9384,37.36466],[-79.93763,37.36478],[-79.9369,37.36489],[-79.93641,37.36495],[-79.93564,37.36503],[-79.9349,37.3651],[-79.93121,37.36538],[-79.93023,37.36546],[-79.92958,37.36551],[-79.92892,37.36556],[-79.92863,37.36559],[-79.92822,37.36564],[-79.92777,37.36571],[-79.92694,37.36586],[-79.92642,37.36597],[-79.92602,37.36607],[-79.92545,37.36623],[-79.92495,37.36638],[-79.92466,37.36648],[-79.92434,37.36659],[-79.9239,37.36675],[-79.92355,37.3669],[-79.92353,37.36691],[-79.92318,37.36706],[-79.92269,37.36728],[-79.92226,37.3675],[-79.92183,37.36773],[-79.92147,37.36794],[-79.92107,37.36818],[-79.92074,37.36839],[-79.92066,37.36844],[-79.92044,37.3686],[-79.91915,37.36951],[-79.9158,37.37189],[-79.91548,37.37211],[-79.91485,37.37256],[-79.91455,37.37278],[-79.91394,37.37325],[-79.91325,37.37381],[-79.91269,37.37431],[-79.91242,37.37456],[-79.91215,37.37481],[-79.91188,37.37508],[-79.91162,37.37534],[-79.91129,37.3757],[-79.91103,37.37598],[-79.91056,37.37652],[-79.91018,37.37699],[-79.90999,37.37725],[-79.90967,37.37766],[-79.90959,37.37779],[-79.90948,37.37792],[-79.90926,37.37826],[-79.90924,37.37828],[-79.90912,37.37847],[-79.90892,37.3788],[-79.9086,37.37931],[-79.90843,37.37962],[-79.90826,37.37993],[-79.9081,37.38025],[-79.90794,37.38056],[-79.9077,37.38108],[-79.90609,37.38482],[-79.90583,37.38544],[-79.90556,37.38606],[-79.90505,37.38722],[-79.90474,37.38799],[-79.90446,37.38855],[-79.90435,37.38878],[-79.90391,37.38969],[-79.90365,37.3902],[-79.90339,37.39072],[-79.90297,37.39148],[-79.90274,37.39189],[-79.90239,37.39251],[-79.90198,37.39323],[-79.90166,37.39378],[-79.89982,37.3969],[-79.89863,37.39891],[-79.89722,37.40132],[-79.89655,37.40244],[-79.89637,37.40275],[-79.89592,37.40345],[-79.89565,37.40384],[-79.89529,37.40434],[-79.89486,37.40493],[-79.89441,37.40553],[-79.89393,37.40612],[-79.8934,37.40676],[-79.89323,37.40697],[-79.89178,37.40872],[-79.88866,37.41247],[-79.88707,37.41437],[-79.88519,37.41664],[-79.88426,37.41777],[-79.88342,37.41883],[-79.88062,37.42239],[-79.88015,37.42297],[-79.87897,37.42448],[-79.87808,37.42561],[-79.87694,37.42705],[-79.87317,37.43182],[-79.87294,37.43212],[-79.87271,37.43241],[-79.87165,37.43376],[-79.87125,37.43425],[-79.87085,37.43477],[-79.87056,37.43513],[-79.87023,37.43555],[-79.87001,37.43584],[-79.86954,37.43642],[-79.86931,37.43672],[-79.86746,37.43906],[-79.86684,37.43983],[-79.86652,37.44021],[-79.86638,37.44036],[-79.86619,37.44058],[-79.86559,37.44124],[-79.86533,37.44151],[-79.86453,37.44233],[-79.86388,37.44294],[-79.86359,37.4432],[-79.86321,37.44354],[-79.86282,37.44388],[-79.86243,37.44421],[-79.86209,37.44449],[-79.86176,37.44475],[-79.86137,37.44506],[-79.86107,37.44529],[-79.86102,37.44532],[-79.86025,37.44588],[-79.85954,37.44638],[-79.859,37.44673],[-79.85858,37.44701],[-79.85792,37.44741],[-79.85748,37.44768],[-79.85735,37.44775],[-79.85715,37.44787],[-79.85681,37.44807],[-79.8562,37.44841],[-79.85579,37.44863],[-79.85534,37.44887],[-79.85469,37.44922],[-79.85416,37.44945],[-79.84957,37.45169],[-79.84639,37.45322],[-79.84625,37.45329],[-79.84262,37.45505],[-79.84097,37.45585],[-79.84014,37.45625],[-79.83896,37.45679],[-79.83848,37.45701],[-79.83714,37.45758],[-79.83652,37.45784],[-79.83575,37.45815],[-79.83539,37.45829],[-79.83425,37.45874],[-79.83338,37.45907],[-79.83317,37.45915],[-79.83189,37.45961],[-79.8317,37.45968],[-79.83093,37.45994],[-79.82939,37.46048],[-79.82744,37.46114],[-79.82639,37.46152],[-79.82433,37.46223],[-79.82343,37.46255],[-79.82141,37.46324],[-79.82063,37.46354],[-79.81973,37.4639],[-79.81889,37.46428],[-79.81806,37.46467],[-79.81769,37.46487],[-79.81717,37.46514],[-79.81711,37.46518],[-79.81669,37.46542],[-79.81631,37.46564],[-79.81532,37.46625],[-79.81417,37.46699],[-79.81414,37.467],[-79.81281,37.46784],[-79.81225,37.46818],[-79.81179,37.46843],[-79.81129,37.46871],[-79.81121,37.46875],[-79.81038,37.46919],[-79.80965,37.46954],[-79.80892,37.46988],[-79.8083,37.47015],[-79.80779,37.47037],[-79.80718,37.4706],[-79.80654,37.47084],[-79.80576,37.47112],[-79.8044,37.47159],[-79.8037,37.47184],[-79.80294,37.4721],[-79.80254,37.47225],[-79.80137,37.47265],[-79.80045,37.47298],[-79.80008,37.47311],[-79.79945,37.47333],[-79.79869,37.47366],[-79.79705,37.47433],[-79.79571,37.47492],[-79.79483,37.47529],[-79.79324,37.47598],[-79.79199,37.4765],[-79.79124,37.4768],[-79.79036,37.47716],[-79.788,37.4781],[-79.78573,37.47901],[-79.78472,37.47945],[-79.78454,37.47953],[-79.78429,37.47964],[-79.78377,37.47989],[-79.78296,37.48029],[-79.78228,37.48063],[-79.78131,37.48116],[-79.78028,37.48176],[-79.77962,37.48216],[-79.77731,37.48366],[-79.77678,37.48401],[-79.77602,37.48452],[-79.77526,37.48501],[-79.77425,37.48569],[-79.7733,37.4863],[-79.76991,37.48854],[-79.76927,37.48896],[-79.76829,37.4896],[-79.76697,37.49046],[-79.76641,37.49081],[-79.76572,37.49121],[-79.76503,37.49161],[-79.7642,37.49205],[-79.76343,37.49244],[-79.76278,37.49277],[-79.76192,37.49316],[-79.76131,37.49343],[-79.76047,37.49378],[-79.75912,37.49433],[-79.75811,37.49473],[-79.75382,37.49645],[-79.75282,37.49686],[-79.75245,37.49702],[-79.75187,37.49734],[-79.75141,37.49761],[-79.75086,37.49798],[-79.75057,37.49819],[-79.75038,37.49834],[-79.75019,37.49849],[-79.75015,37.49852],[-79.74996,37.49868],[-79.74976,37.49886],[-79.74948,37.49914],[-79.74922,37.49941],[-79.74905,37.4996],[-79.74897,37.49969],[-79.7488,37.4999],[-79.74854,37.50025],[-79.74821,37.5007],[-79.74773,37.50131],[-79.74737,37.5018],[-79.74605,37.50355],[-79.74567,37.50402],[-79.74514,37.50475],[-79.74431,37.50585],[-79.744,37.50626],[-79.74312,37.50741],[-79.74255,37.50808],[-79.74214,37.50854],[-79.74171,37.509],[-79.74119,37.50952],[-79.74082,37.50987],[-79.74054,37.51013],[-79.74016,37.51045],[-79.73976,37.51079],[-79.73926,37.51118],[-79.73884,37.5115],[-79.7382,37.51196],[-79.73766,37.51232],[-79.73722,37.51261],[-79.73666,37.51295],[-79.73614,37.51325],[-79.7356,37.51356],[-79.73498,37.51389],[-79.73428,37.51428],[-79.73399,37.51443],[-79.73341,37.51475],[-79.73268,37.51513],[-79.73234,37.51531],[-79.73184,37.51555],[-79.7311,37.5159],[-79.73047,37.51618],[-79.72973,37.5165],[-79.72899,37.5168],[-79.72845,37.51701],[-79.72785,37.51723],[-79.72655,37.51769],[-79.72588,37.51791],[-79.72539,37.51806],[-79.72485,37.51823],[-79.72121,37.51936],[-79.7179,37.5204],[-79.71685,37.52074],[-79.71542,37.52123],[-79.71374,37.52183],[-79.71213,37.52244],[-79.71178,37.52257],[-79.71027,37.52315],[-79.70767,37.52412],[-79.70742,37.52423],[-79.70596,37.52478],[-79.70522,37.52505],[-79.70406,37.5255],[-79.70261,37.52605],[-79.70134,37.52652],[-79.70056,37.52679],[-79.69926,37.52724],[-79.69744,37.52785],[-79.69452,37.52883],[-79.69353,37.52916],[-79.69302,37.52934],[-79.69251,37.52952],[-79.69188,37.52976],[-79.69138,37.52997],[-79.69077,37.53025],[-79.69074,37.53026],[-79.69039,37.53043],[-79.68982,37.53073],[-79.68946,37.53092],[-79.68901,37.53118],[-79.68892,37.53123],[-79.68851,37.53149],[-79.68791,37.53189],[-79.68722,37.53238],[-79.68718,37.53241],[-79.68665,37.53283],[-79.68537,37.53391],[-79.68502,37.53423],[-79.68456,37.53461],[-79.68403,37.53507],[-79.68395,37.53514],[-79.6838,37.53527],[-79.68364,37.53539],[-79.68271,37.53617],[-79.68233,37.53648],[-79.68112,37.5374],[-79.68066,37.53773],[-79.67996,37.53821],[-79.67865,37.53909],[-79.67759,37.5398],[-79.67705,37.54016],[-79.67636,37.54059],[-79.67567,37.541],[-79.67521,37.54125],[-79.67463,37.54155],[-79.67415,37.54177],[-79.67202,37.5428],[-79.67114,37.54322],[-79.6708,37.54338],[-79.67047,37.54355],[-79.67006,37.54377],[-79.66974,37.54396],[-79.66963,37.54403],[-79.66929,37.54426],[-79.66889,37.54456],[-79.66849,37.54489],[-79.66804,37.54532],[-79.66789,37.54547],[-79.66755,37.54585],[-79.66728,37.54619],[-79.66701,37.54658],[-79.66683,37.54688],[-79.66657,37.54739],[-79.66628,37.54808],[-79.66617,37.54835],[-79.66602,37.54877],[-79.66587,37.54913],[-79.66583,37.54923],[-79.66575,37.54945],[-79.66552,37.55003],[-79.66539,37.55032],[-79.66533,37.55044],[-79.66525,37.55058],[-79.66512,37.55079],[-79.66497,37.551],[-79.66483,37.55117],[-79.6646,37.55142],[-79.6644,37.55162],[-79.66383,37.55213],[-79.66291,37.55299],[-79.66245,37.55345],[-79.6622,37.55373],[-79.66181,37.5542],[-79.6616,37.55446],[-79.66118,37.55502],[-79.66109,37.55515],[-79.66024,37.55625],[-79.65961,37.55707],[-79.65909,37.5578],[-79.65847,37.5587],[-79.65824,37.55906],[-79.65776,37.55976],[-79.6573,37.56045],[-79.65705,37.56077],[-79.65679,37.56109],[-79.65668,37.56122],[-79.65617,37.56172],[-79.65482,37.56288],[-79.65448,37.56319],[-79.65429,37.56338],[-79.65402,37.56368],[-79.65387,37.56387],[-79.65365,37.56417],[-79.65164,37.56699],[-79.65135,37.56739],[-79.65045,37.56866],[-79.65017,37.56905],[-79.6499,37.56944],[-79.64957,37.56994],[-79.64908,37.57074],[-79.64881,37.5712],[-79.64722,37.57382],[-79.64624,37.57544],[-79.64605,37.57575],[-79.64588,37.57604],[-79.64522,37.57712],[-79.64476,37.57789],[-79.64426,37.57871],[-79.64407,37.57903],[-79.64382,37.57943],[-79.64333,37.58026],[-79.64319,37.58047],[-79.64289,37.58096],[-79.64264,37.58137],[-79.64231,37.58186],[-79.64197,37.58238],[-79.64169,37.58277],[-79.64141,37.58316],[-79.64113,37.58352],[-79.64058,37.58421],[-79.64027,37.58458],[-79.63964,37.58532],[-79.63878,37.58624],[-79.63845,37.58659],[-79.63817,37.58686],[-79.6379,37.58712],[-79.63745,37.58756],[-79.63707,37.5879],[-79.63669,37.58823],[-79.63611,37.58874],[-79.6352,37.58947],[-79.63489,37.58972],[-79.63427,37.59018],[-79.63418,37.59025],[-79.63313,37.591],[-79.6328,37.59122],[-79.63269,37.5913],[-79.62945,37.59355],[-79.62678,37.59542],[-79.62638,37.59573],[-79.626,37.59607],[-79.62582,37.59624],[-79.62555,37.59651],[-79.62521,37.59687],[-79.62496,37.59715],[-79.62469,37.59742],[-79.62414,37.59801],[-79.62368,37.5985],[-79.62341,37.59878],[-79.62323,37.59898],[-79.62212,37.60015],[-79.62162,37.60069],[-79.6209,37.60139],[-79.61959,37.60258],[-79.61941,37.60275],[-79.61914,37.60303],[-79.61889,37.60329],[-79.6185,37.60376],[-79.61813,37.60425],[-79.61787,37.60464],[-79.61759,37.60506],[-79.61717,37.6057],[-79.61701,37.60593],[-79.61613,37.60726],[-79.61592,37.60755],[-79.61561,37.60794],[-79.61527,37.60831],[-79.61502,37.60854],[-79.61486,37.60868],[-79.61457,37.60891],[-79.61421,37.60917],[-79.61406,37.60927],[-79.61373,37.60947],[-79.61343,37.60963],[-79.61304,37.60982],[-79.6127,37.60997],[-79.6123,37.61012],[-79.61198,37.61023],[-79.61161,37.61033],[-79.61123,37.61043],[-79.61089,37.61049],[-79.61035,37.61058],[-79.6101,37.61061],[-79.61,37.61062],[-79.60947,37.61065],[-79.60694,37.61074],[-79.60483,37.6108],[-79.6038,37.61084],[-79.60263,37.61088],[-79.60201,37.6109],[-79.60076,37.61094],[-79.60003,37.61097],[-79.59932,37.61099],[-79.59806,37.611],[-79.59765,37.61101],[-79.59725,37.61102],[-79.59686,37.61105],[-79.59646,37.6111],[-79.59605,37.61116],[-79.59563,37.61124],[-79.59538,37.6113],[-79.59523,37.61134],[-79.59451,37.61157],[-79.59432,37.61164],[-79.59414,37.61171],[-79.59366,37.61192],[-79.59337,37.61206],[-79.59292,37.61231],[-79.59262,37.61251],[-79.59249,37.6126],[-79.59189,37.61305],[-79.59182,37.61311],[-79.59132,37.6136],[-79.5913,37.61361],[-79.59007,37.61485],[-79.5893,37.61572],[-79.58877,37.6164],[-79.58838,37.61693],[-79.58789,37.61762],[-79.58739,37.61845],[-79.58621,37.62053],[-79.58484,37.62299],[-79.5844,37.6237],[-79.58425,37.6239],[-79.58412,37.62405],[-79.5839,37.62431],[-79.58375,37.62446],[-79.58341,37.6248],[-79.58318,37.625],[-79.5828,37.62528],[-79.58264,37.62539],[-79.58229,37.62562],[-79.58194,37.62582],[-79.58159,37.626],[-79.58125,37.62614],[-79.58051,37.62642],[-79.58008,37.62655],[-79.57964,37.62666],[-79.57928,37.62675],[-79.57694,37.62723],[-79.57648,37.62734],[-79.57604,37.62746],[-79.57559,37.6276],[-79.57507,37.62778],[-79.57482,37.62788],[-79.57475,37.62791],[-79.57423,37.62814],[-79.57365,37.62841],[-79.57297,37.62876],[-79.57267,37.62892],[-79.57236,37.6291],[-79.57173,37.62954],[-79.5714,37.62979],[-79.57115,37.63002],[-79.57089,37.63024],[-79.5706,37.63051],[-79.57024,37.63085],[-79.56989,37.63121],[-79.56919,37.632],[-79.56849,37.63278],[-79.56702,37.63441],[-79.56499,37.63671],[-79.56203,37.63983],[-79.56175,37.64012],[-79.56125,37.64062],[-79.56039,37.64153],[-79.55737,37.64468],[-79.55618,37.64592],[-79.55568,37.64644],[-79.55506,37.6471],[-79.55461,37.64755],[-79.5541,37.6481],[-79.55356,37.64863],[-79.55311,37.64906],[-79.55287,37.64927],[-79.55256,37.64953],[-79.55188,37.65006],[-79.55161,37.65027],[-79.55119,37.65056],[-79.55084,37.65079],[-79.55034,37.65111],[-79.55006,37.65128],[-79.5494,37.65165],[-79.54882,37.65195],[-79.54824,37.65223],[-79.54773,37.65246],[-79.54634,37.65306],[-79.54605,37.65318],[-79.54519,37.65355],[-79.54438,37.6539],[-79.54246,37.65474],[-79.54104,37.65536],[-79.54022,37.65571],[-79.53956,37.656],[-79.53817,37.65661],[-79.53726,37.657],[-79.53439,37.65824],[-79.53284,37.65892],[-79.53074,37.65981],[-79.53019,37.66006],[-79.52795,37.66101],[-79.52757,37.66116],[-79.52739,37.66124],[-79.52672,37.6615],[-79.52506,37.66213],[-79.52382,37.66258],[-79.5226,37.66299],[-79.52138,37.66339],[-79.52012,37.6638],[-79.51818,37.66444],[-79.51433,37.6657],[-79.51368,37.66592],[-79.51199,37.66647],[-79.51133,37.6667],[-79.51084,37.66689],[-79.50991,37.66727],[-79.50941,37.66749],[-79.50937,37.66751],[-79.50858,37.66789],[-79.5079,37.66824],[-79.50753,37.66843],[-79.50684,37.66881],[-79.50593,37.66932],[-79.50527,37.66976],[-79.50507,37.66989],[-79.50453,37.67027],[-79.50385,37.67079],[-79.50345,37.67111],[-79.50222,37.67217],[-79.50118,37.67309],[-79.50071,37.6735],[-79.49805,37.67584],[-79.49714,37.67665],[-79.49575,37.67788],[-79.49438,37.67912],[-79.49401,37.67946],[-79.49191,37.68138],[-79.49145,37.6818],[-79.48716,37.68574],[-79.48542,37.68734],[-79.48488,37.68784],[-79.48368,37.68892],[-79.48262,37.68982],[-79.48205,37.6903],[-79.48145,37.69076],[-79.48053,37.69144],[-79.47978,37.69195],[-79.47925,37.69231],[-79.4785,37.69279],[-79.47772,37.69326],[-79.47739,37.69346],[-79.47706,37.69364],[-79.4766,37.69391],[-79.47549,37.69453],[-79.47439,37.69519],[-79.47245,37.6964],[-79.47201,37.69668],[-79.47093,37.69739],[-79.47016,37.69798],[-79.46963,37.69833],[-79.46807,37.69939],[-79.46759,37.69971],[-79.46665,37.70037],[-79.4658,37.70096],[-79.46516,37.70141],[-79.46481,37.70165],[-79.46411,37.70214],[-79.46229,37.70341],[-79.46089,37.70441],[-79.46071,37.70454],[-79.46057,37.70464],[-79.46043,37.70474],[-79.45946,37.70544],[-79.45873,37.70598],[-79.45814,37.70642],[-79.45743,37.70695],[-79.45621,37.7079],[-79.45566,37.70833],[-79.45509,37.70878],[-79.45443,37.70929],[-79.45338,37.71013],[-79.45218,37.71104],[-79.45161,37.71149],[-79.4509,37.71202],[-79.44967,37.713],[-79.44844,37.71395],[-79.44775,37.7145],[-79.44738,37.71479],[-79.44671,37.71532],[-79.44619,37.71572],[-79.44551,37.71625],[-79.44484,37.71677],[-79.44434,37.71718],[-79.4442,37.71728],[-79.44347,37.71783],[-79.44325,37.71801],[-79.44252,37.71855],[-79.44196,37.71896],[-79.44161,37.71922],[-79.4401,37.72036],[-79.43908,37.72111],[-79.43776,37.72207],[-79.437,37.72265],[-79.4367,37.72289],[-79.4363,37.72324],[-79.436,37.72351],[-79.43552,37.72398],[-79.4353,37.7242],[-79.43492,37.72462],[-79.4346,37.72499],[-79.43398,37.72575],[-79.43369,37.72613],[-79.43332,37.7266],[-79.4332,37.72676],[-79.43318,37.72678],[-79.43295,37.72706],[-79.43266,37.72744],[-79.43236,37.72781],[-79.43213,37.72811],[-79.43161,37.72876],[-79.4313,37.72917],[-79.43117,37.72933],[-79.42916,37.73187],[-79.42833,37.73293],[-79.42722,37.73431],[-79.42681,37.73483],[-79.42498,37.73709],[-79.42313,37.73935],[-79.42209,37.74064],[-79.42187,37.74091],[-79.42139,37.74151],[-79.42056,37.7425],[-79.4199,37.74331],[-79.41924,37.74414],[-79.41844,37.74515],[-79.41771,37.74606],[-79.41586,37.74839],[-79.41471,37.74981],[-79.41335,37.75151],[-79.41291,37.75207],[-79.41224,37.75289],[-79.41148,37.75382],[-79.41097,37.75451],[-79.41083,37.75472],[-79.41015,37.75574],[-79.40963,37.75658],[-79.40933,37.75715],[-79.408,37.75968],[-79.40763,37.76047],[-79.40719,37.76137],[-79.40691,37.76199],[-79.40661,37.76261],[-79.40636,37.76315],[-79.40621,37.76345],[-79.40592,37.76408],[-79.40529,37.7654],[-79.40382,37.7685],[-79.40327,37.76964],[-79.40303,37.77017],[-79.40249,37.77129],[-79.40189,37.77257],[-79.40171,37.77296],[-79.40135,37.77388],[-79.40121,37.77438],[-79.40098,37.77491],[-79.40074,37.77562],[-79.40063,37.7762],[-79.40053,37.77703],[-79.40048,37.77926],[-79.40045,37.78152],[-79.40046,37.78267],[-79.40038,37.78322],[-79.40037,37.78328],[-79.40019,37.78415],[-79.39994,37.78506],[-79.39977,37.78553],[-79.3995,37.78621],[-79.39924,37.78678],[-79.39858,37.78804],[-79.39814,37.78892],[-79.39793,37.78931],[-79.3972,37.79056],[-79.39621,37.79237],[-79.39589,37.79297],[-79.39493,37.79472],[-79.39452,37.79549],[-79.39406,37.79633],[-79.39344,37.79765],[-79.39333,37.79784],[-79.3922,37.79991],[-79.39019,37.80358],[-79.38991,37.80411],[-79.3897,37.80448],[-79.38953,37.80478],[-79.38933,37.80516],[-79.38827,37.80713],[-79.38796,37.80769],[-79.38757,37.80837],[-79.38724,37.80894],[-79.38694,37.80941],[-79.38652,37.81009],[-79.38615,37.81068],[-79.38602,37.81086],[-79.38556,37.81157],[-79.38479,37.81269],[-79.38455,37.81303],[-79.38443,37.8132],[-79.38408,37.81368],[-79.38336,37.81464],[-79.38292,37.81522],[-79.38137,37.81718],[-79.38101,37.81763],[-79.38066,37.81808],[-79.38033,37.81849],[-79.37545,37.82467],[-79.37538,37.82476],[-79.37427,37.82617],[-79.37382,37.82678],[-79.37338,37.82742],[-79.37311,37.8278],[-79.37267,37.8285],[-79.37231,37.82909],[-79.37228,37.82914],[-79.37213,37.82939],[-79.3718,37.83],[-79.37158,37.83041],[-79.37127,37.83102],[-79.37093,37.83175],[-79.37,37.83377],[-79.36894,37.83607],[-79.36881,37.83636],[-79.36787,37.83841],[-79.36736,37.8395],[-79.36701,37.84023],[-79.36683,37.84063],[-79.36665,37.841],[-79.3665,37.84131],[-79.36623,37.84194],[-79.36612,37.84218],[-79.36589,37.84263],[-79.36573,37.84297],[-79.36565,37.84315],[-79.36521,37.8441],[-79.36462,37.84532],[-79.36446,37.84571],[-79.36402,37.84667],[-79.36388,37.84694],[-79.36339,37.84796],[-79.3631,37.84845],[-79.36275,37.84896],[-79.36246,37.8493],[-79.36199,37.84981],[-79.36151,37.85026],[-79.36092,37.85071],[-79.3604,37.85109],[-79.35976,37.8515],[-79.35886,37.852],[-79.35797,37.85251],[-79.35776,37.85262],[-79.35679,37.85316],[-79.35613,37.85351],[-79.35435,37.85451],[-79.35339,37.85507],[-79.35187,37.85591],[-79.35003,37.85694],[-79.34932,37.85733],[-79.3484,37.85785],[-79.34744,37.8584],[-79.34612,37.85917],[-79.3453,37.85965],[-79.34456,37.8601],[-79.34365,37.86065],[-79.34219,37.86156],[-79.34143,37.86205],[-79.34105,37.86229],[-79.3403,37.86278],[-79.33963,37.86322],[-79.33907,37.86359],[-79.33841,37.86405],[-79.33749,37.86465],[-79.33688,37.86506],[-79.33563,37.8659],[-79.33525,37.86615],[-79.3348,37.86645],[-79.33402,37.86692],[-79.33321,37.86735],[-79.33232,37.86779],[-79.33086,37.86839],[-79.33004,37.86868],[-79.32914,37.86896],[-79.32831,37.86919],[-79.32775,37.86932],[-79.32717,37.86943],[-79.32665,37.86952],[-79.32591,37.86964],[-79.32497,37.86976],[-79.32354,37.86989],[-79.32212,37.87006],[-79.32076,37.8703],[-79.31989,37.87048],[-79.31884,37.87074],[-79.31786,37.87107],[-79.3175,37.8712],[-79.31675,37.87147],[-79.31643,37.8716],[-79.31636,37.87163],[-79.31562,37.87196],[-79.3154,37.87206],[-79.31445,37.87248],[-79.31253,37.87332],[-79.3101,37.87442],[-79.30843,37.87517],[-79.30686,37.87582],[-79.3066,37.87593],[-79.30627,37.87609],[-79.30545,37.87645],[-79.3041,37.87708],[-79.30335,37.87741],[-79.30301,37.87754],[-79.30265,37.87771],[-79.30155,37.87819],[-79.3002,37.8788],[-79.29975,37.87901],[-79.29947,37.87914],[-79.29843,37.87961],[-79.2981,37.87975],[-79.29716,37.88017],[-79.29611,37.88064],[-79.29392,37.8816],[-79.29307,37.88198],[-79.29197,37.88247],[-79.29125,37.88276],[-79.29034,37.88317],[-79.28937,37.8836],[-79.28846,37.88403],[-79.28576,37.88524],[-79.2856,37.88531],[-79.28526,37.88545],[-79.28489,37.88562],[-79.28421,37.88592],[-79.28375,37.88614],[-79.28307,37.88648],[-79.28216,37.88697],[-79.28153,37.88734],[-79.28112,37.88756],[-79.2809,37.8877],[-79.28069,37.88784],[-79.27991,37.88839],[-79.27927,37.88888],[-79.27882,37.88923],[-79.27833,37.88965],[-79.27787,37.89006],[-79.27737,37.89054],[-79.27709,37.89082],[-79.27651,37.89145],[-79.27619,37.89185],[-79.27579,37.89238],[-79.27537,37.89296],[-79.27474,37.89385],[-79.27442,37.89436],[-79.27403,37.89492],[-79.27363,37.89549],[-79.27351,37.89565],[-79.27332,37.89591],[-79.27287,37.8965],[-79.27252,37.89694],[-79.27209,37.89744],[-79.27153,37.89808],[-79.27114,37.89852],[-79.27062,37.89906],[-79.27029,37.8994],[-79.26993,37.89976],[-79.26948,37.90019],[-79.26913,37.90052],[-79.26463,37.90451],[-79.26416,37.90492],[-79.26363,37.90541],[-79.26303,37.90593],[-79.26063,37.90806],[-79.2596,37.90898],[-79.25926,37.90928],[-79.25787,37.91054],[-79.25687,37.91137],[-79.2558,37.91227],[-79.25479,37.91312],[-79.25387,37.91386],[-79.25351,37.91414],[-79.25253,37.91492],[-79.25135,37.91584],[-79.25095,37.91614],[-79.25058,37.91642],[-79.24982,37.917],[-79.24925,37.91741],[-79.24859,37.9179],[-79.24809,37.91827],[-79.24788,37.91842],[-79.24726,37.91884],[-79.24524,37.92025],[-79.2431,37.92169],[-79.24216,37.92231],[-79.24055,37.92336],[-79.23989,37.9238],[-79.23914,37.92429],[-79.239,37.92438],[-79.23814,37.92499],[-79.2372,37.92561],[-79.23637,37.92617],[-79.2356,37.92668],[-79.23479,37.92721],[-79.23372,37.92792],[-79.23344,37.9281],[-79.23283,37.92852],[-79.23152,37.92945],[-79.23096,37.9299],[-79.23007,37.93057],[-79.22903,37.93139],[-79.22859,37.93175],[-79.22846,37.93185],[-79.22793,37.93228],[-79.22571,37.93419],[-79.22515,37.93468],[-79.22392,37.93583],[-79.22353,37.93621],[-79.22253,37.93723],[-79.22231,37.93748],[-79.22164,37.93821],[-79.22081,37.93911],[-79.2195,37.94055],[-79.2191,37.94102],[-79.21878,37.94139],[-79.21832,37.94195],[-79.21783,37.94249],[-79.21674,37.94376],[-79.21647,37.94407],[-79.21455,37.94631],[-79.21365,37.94736],[-79.21241,37.94881],[-79.21199,37.94929],[-79.21169,37.94964],[-79.21135,37.95004],[-79.2107,37.95078],[-79.2093,37.95242],[-79.20866,37.95319],[-79.20856,37.95329],[-79.20787,37.95408],[-79.20714,37.95495],[-79.20697,37.95515],[-79.20644,37.95575],[-79.20594,37.95634],[-79.20527,37.95712],[-79.20487,37.95757],[-79.20407,37.9585],[-79.20378,37.95883],[-79.20334,37.95933],[-79.20294,37.95982],[-79.20251,37.96031],[-79.20208,37.96082],[-79.20165,37.96131],[-79.19938,37.96397],[-79.19879,37.96463],[-79.19795,37.96556],[-79.19735,37.9662],[-79.197,37.96657],[-79.19597,37.96763],[-79.19511,37.96848],[-79.19263,37.97076],[-79.19232,37.97105],[-79.19135,37.97193],[-79.18975,37.97337],[-79.18808,37.97488],[-79.18719,37.97573],[-79.18668,37.97624],[-79.18617,37.97678],[-79.1856,37.9774],[-79.18513,37.97794],[-79.18477,37.97838],[-79.18436,37.97889],[-79.18417,37.97911],[-79.18408,37.97921],[-79.1832,37.98046],[-79.18283,37.98102],[-79.18256,37.98143],[-79.18232,37.98182],[-79.18209,37.9822],[-79.18185,37.98261],[-79.18132,37.9836],[-79.18096,37.98433],[-79.18062,37.98506],[-79.17981,37.98701],[-79.17922,37.98842],[-79.17875,37.98962],[-79.17811,37.99117],[-79.17797,37.99148],[-79.17773,37.99212],[-79.17681,37.99436],[-79.17637,37.99542],[-79.17628,37.99563],[-79.17586,37.99656],[-79.17545,37.9974],[-79.17491,37.9984],[-79.17456,37.99901],[-79.17425,37.9995],[-79.17394,38],[-79.17353,38.00059],[-79.17341,38.00077],[-79.173,38.00134],[-79.17251,38.002],[-79.17198,38.00266],[-79.17129,38.00348],[-79.17095,38.00386],[-79.17072,38.00411],[-79.17036,38.00449],[-79.16976,38.0051],[-79.16898,38.00586],[-79.16833,38.00644],[-79.1676,38.00708],[-79.16701,38.00756],[-79.16653,38.00795],[-79.16583,38.00848],[-79.16542,38.00878],[-79.1648,38.00921],[-79.16417,38.00964],[-79.16367,38.00995],[-79.16329,38.0102],[-79.15736,38.01402],[-79.15554,38.01519],[-79.15112,38.01802],[-79.15046,38.01845],[-79.14759,38.02029],[-79.14694,38.02071],[-79.14604,38.02128],[-79.14579,38.02143],[-79.14551,38.0216],[-79.14507,38.02189],[-79.14454,38.02223],[-79.14413,38.02249],[-79.14327,38.02306],[-79.14297,38.02325],[-79.14259,38.02348],[-79.1422,38.02374],[-79.14122,38.02438],[-79.14101,38.02451],[-79.14013,38.02507],[-79.13932,38.02559],[-79.13918,38.02568],[-79.13784,38.02654],[-79.13722,38.02694],[-79.13687,38.02716],[-79.13633,38.0275],[-79.13554,38.02804],[-79.13502,38.0284],[-79.13467,38.02866],[-79.13396,38.02919],[-79.13371,38.0294],[-79.13315,38.02985],[-79.13251,38.03038],[-79.13172,38.03108],[-79.1309,38.03186],[-79.13032,38.03244],[-79.1298,38.03298],[-79.12922,38.03361],[-79.12868,38.03423],[-79.12823,38.03477],[-79.12778,38.03532],[-79.12718,38.03611],[-79.1268,38.03669],[-79.12636,38.03735],[-79.12569,38.0384],[-79.1248,38.03981],[-79.12419,38.04076],[-79.12375,38.04143],[-79.12357,38.04172],[-79.12294,38.04273],[-79.12269,38.04313],[-79.12158,38.04487],[-79.12146,38.04503],[-79.12091,38.04588],[-79.12051,38.04653],[-79.12014,38.04709],[-79.11965,38.04788],[-79.1185,38.0497],[-79.11731,38.05156],[-79.11599,38.05365],[-79.11563,38.05421],[-79.11516,38.05496],[-79.11424,38.05636],[-79.11395,38.05679],[-79.11364,38.05721],[-79.11275,38.05836],[-79.11189,38.05942],[-79.11146,38.0599],[-79.11128,38.06009],[-79.1108,38.06059],[-79.11042,38.06097],[-79.10959,38.06178],[-79.10891,38.06241],[-79.10826,38.06297],[-79.10725,38.06379],[-79.10649,38.06438],[-79.10518,38.06533],[-79.1049,38.06553],[-79.10392,38.06615],[-79.10328,38.06654],[-79.10223,38.06714],[-79.10115,38.06773],[-79.10015,38.06829],[-79.09816,38.06939],[-79.09743,38.0698],[-79.09551,38.07088],[-79.09491,38.07122],[-79.09442,38.07149],[-79.0934,38.07204],[-79.09215,38.0727],[-79.09148,38.07308],[-79.09123,38.07322],[-79.09107,38.07332],[-79.09046,38.0737],[-79.08958,38.07426],[-79.08866,38.07487],[-79.08813,38.07523],[-79.0876,38.07561],[-79.08721,38.07591],[-79.08656,38.07641],[-79.08555,38.07724],[-79.08489,38.07782],[-79.08462,38.07807],[-79.08452,38.07817],[-79.08416,38.07849],[-79.0837,38.07895],[-79.08339,38.07924],[-79.0831,38.07956],[-79.08264,38.08004],[-79.08212,38.08062],[-79.08175,38.08105],[-79.08147,38.0814],[-79.08116,38.08176],[-79.08084,38.08216],[-79.08038,38.08279],[-79.07996,38.08339],[-79.07913,38.08461],[-79.07908,38.08471],[-79.07867,38.08538],[-79.07829,38.08605],[-79.07819,38.08628],[-79.0779,38.08682],[-79.0774,38.08785],[-79.07674,38.08923],[-79.07611,38.09053],[-79.07584,38.0911],[-79.07539,38.09203],[-79.07512,38.0926],[-79.07475,38.09336],[-79.07455,38.09376],[-79.07432,38.09419],[-79.07382,38.09507],[-79.0735,38.09558],[-79.07325,38.09596],[-79.07299,38.09634],[-79.07272,38.09673],[-79.07238,38.0972],[-79.07193,38.09777],[-79.07163,38.09814],[-79.07125,38.09858],[-79.07088,38.099],[-79.07041,38.09949],[-79.06966,38.10024],[-79.06916,38.10072],[-79.06878,38.10107],[-79.06777,38.10202],[-79.06658,38.1031],[-79.06617,38.10348],[-79.06535,38.1043],[-79.06507,38.10456],[-79.06445,38.10514],[-79.06391,38.10565],[-79.06338,38.10615],[-79.06294,38.10657],[-79.06251,38.10697],[-79.0618,38.10762],[-79.06066,38.10868],[-79.05955,38.10976],[-79.0574,38.11178],[-79.05705,38.11211],[-79.05681,38.11234],[-79.05659,38.11253],[-79.0557,38.11337],[-79.05386,38.11511],[-79.05291,38.116],[-79.05235,38.11654],[-79.0521,38.11677],[-79.05083,38.11796],[-79.05001,38.11873],[-79.04972,38.119],[-79.04851,38.12014],[-79.0483,38.12034],[-79.04778,38.12082],[-79.04764,38.12094],[-79.0472,38.12135],[-79.0464,38.12205],[-79.04601,38.12237],[-79.04547,38.1228],[-79.04499,38.12317],[-79.0445,38.12354],[-79.0438,38.12403],[-79.04288,38.12465],[-79.04221,38.12507],[-79.04153,38.12548],[-79.04051,38.12608],[-79.03947,38.12667],[-79.03895,38.12698],[-79.03838,38.1273],[-79.03674,38.12823],[-79.03612,38.12858],[-79.03566,38.12884],[-79.03302,38.13035],[-79.03159,38.13117],[-79.03108,38.13146],[-79.03039,38.13185],[-79.02961,38.13232],[-79.02872,38.13293],[-79.02792,38.13357],[-79.02743,38.13398],[-79.02678,38.13446],[-79.02639,38.13487],[-79.026,38.1353],[-79.02548,38.1359],[-79.02477,38.13677],[-79.02405,38.13765],[-79.02304,38.13887],[-79.02212,38.13999],[-79.02116,38.14116],[-79.02041,38.14208],[-79.0202,38.14236],[-79.01912,38.14382],[-79.01851,38.14488],[-79.018,38.14587],[-79.01764,38.14707],[-79.01721,38.14853],[-79.01679,38.14998],[-79.01611,38.15236],[-79.01593,38.15301],[-79.01556,38.15433],[-79.01506,38.15608],[-79.01469,38.15736],[-79.01455,38.15815],[-79.01441,38.1587],[-79.01408,38.1597],[-79.01352,38.16137],[-79.01308,38.16262],[-79.01274,38.16332],[-79.01212,38.16436],[-79.0114,38.16526],[-79.01113,38.16552],[-79.01091,38.16573],[-79.01033,38.16629],[-79.00997,38.16662],[-79.00817,38.16828],[-79.00758,38.16882],[-79.00668,38.16966],[-79.00632,38.16998],[-79.00608,38.17017],[-79.00555,38.17067],[-79.00489,38.17128],[-79.00451,38.17166],[-79.0038,38.17243],[-79.0035,38.17278],[-79.00321,38.17312],[-79.0031,38.17326],[-79.00273,38.17372],[-79.00244,38.17411],[-79.00227,38.17435],[-79.00174,38.17514],[-79.00127,38.17593],[-79.00099,38.17644],[-79.00074,38.17692],[-79.00049,38.17745],[-79.00023,38.17802],[-79.00012,38.17832],[-78.99997,38.17869],[-78.99971,38.17944],[-78.99953,38.18004],[-78.99944,38.1804],[-78.99891,38.18255],[-78.99885,38.18276],[-78.99873,38.18329],[-78.99844,38.18446],[-78.99803,38.18613],[-78.99786,38.18684],[-78.99737,38.18881],[-78.99725,38.1893],[-78.99715,38.18965],[-78.99707,38.19],[-78.99698,38.19042],[-78.99678,38.19119],[-78.99673,38.19136],[-78.99666,38.19171],[-78.99607,38.19404],[-78.99592,38.19464],[-78.99571,38.19553],[-78.99552,38.19627],[-78.99545,38.19651],[-78.99514,38.1978],[-78.99491,38.1988],[-78.99481,38.19926],[-78.99462,38.20003],[-78.99412,38.20206],[-78.99401,38.20246],[-78.99365,38.20391],[-78.99361,38.20409],[-78.99347,38.20463],[-78.99273,38.20764],[-78.99209,38.21025],[-78.99202,38.21053],[-78.99188,38.21114],[-78.99156,38.21238],[-78.99153,38.21245],[-78.99139,38.2129],[-78.99117,38.21352],[-78.99099,38.21396],[-78.99084,38.21429],[-78.99064,38.21472],[-78.99046,38.21506],[-78.99017,38.21557],[-78.98998,38.21587],[-78.98963,38.2164],[-78.98935,38.2168],[-78.98911,38.21711],[-78.98886,38.21742],[-78.98859,38.21774],[-78.98822,38.21816],[-78.98781,38.21859],[-78.98743,38.21896],[-78.98694,38.2194],[-78.98613,38.22009],[-78.98577,38.22041],[-78.98308,38.2227],[-78.98199,38.22362],[-78.98169,38.22387],[-78.98113,38.22436],[-78.98047,38.22492],[-78.97983,38.22545],[-78.97937,38.22585],[-78.97778,38.22721],[-78.97643,38.22836],[-78.97581,38.22888],[-78.97542,38.22922],[-78.97494,38.22962],[-78.97214,38.23202],[-78.97131,38.23272],[-78.96992,38.2339],[-78.96743,38.23601],[-78.9672,38.23622],[-78.96629,38.23699],[-78.96584,38.23739],[-78.96537,38.23782],[-78.96463,38.23857],[-78.9639,38.23932],[-78.9635,38.23973],[-78.96317,38.24011],[-78.96279,38.24054],[-78.96202,38.24147],[-78.96116,38.24253],[-78.96053,38.24328],[-78.96011,38.24381],[-78.95903,38.24514],[-78.95869,38.24554],[-78.95815,38.24621],[-78.95764,38.24685],[-78.95715,38.24743],[-78.95699,38.24764],[-78.95674,38.24797],[-78.95569,38.24927],[-78.95479,38.25035],[-78.95366,38.2516],[-78.95329,38.25203],[-78.95268,38.25267],[-78.95243,38.2529],[-78.95218,38.25314],[-78.95186,38.25347],[-78.95138,38.25398],[-78.95097,38.25442],[-78.95081,38.25462],[-78.9505,38.25492],[-78.95002,38.25538],[-78.94886,38.25646],[-78.94822,38.25704],[-78.9476,38.25762],[-78.94613,38.25896],[-78.9455,38.25955],[-78.94369,38.26122],[-78.94348,38.2614],[-78.943,38.26185],[-78.94245,38.26235],[-78.94199,38.26277],[-78.94149,38.26325],[-78.94119,38.26355],[-78.94079,38.26398],[-78.94056,38.26425],[-78.9401,38.26481],[-78.93979,38.26522],[-78.93968,38.26538],[-78.93939,38.26582],[-78.93927,38.266],[-78.93918,38.26616],[-78.93886,38.26668],[-78.93869,38.267],[-78.93843,38.26753],[-78.93826,38.2679],[-78.9381,38.26829],[-78.93789,38.26887],[-78.93765,38.26961],[-78.93748,38.27029],[-78.93739,38.27078],[-78.9373,38.27132],[-78.93701,38.27319],[-78.93696,38.27372],[-78.9369,38.27408],[-78.93674,38.27503],[-78.93666,38.27544],[-78.93646,38.27635],[-78.93644,38.27645],[-78.93639,38.27663],[-78.93611,38.27765],[-78.93486,38.28198],[-78.9341,38.28455],[-78.93374,38.28575],[-78.93367,38.28596],[-78.93349,38.28667],[-78.93271,38.28934],[-78.932,38.29179],[-78.93191,38.29207],[-78.93183,38.29234],[-78.93166,38.29287],[-78.93154,38.29332],[-78.93144,38.29369],[-78.93136,38.29402],[-78.93021,38.29797],[-78.93002,38.29867],[-78.92995,38.29897],[-78.92983,38.29958],[-78.92971,38.30028],[-78.92966,38.30071],[-78.92963,38.30099],[-78.92958,38.30163],[-78.92956,38.30197],[-78.92955,38.30272],[-78.92958,38.30358],[-78.92978,38.30688],[-78.92978,38.30693],[-78.92979,38.30702],[-78.92994,38.30957],[-78.93018,38.31335],[-78.93024,38.31426],[-78.93039,38.31671],[-78.93053,38.31879],[-78.93062,38.31977],[-78.93068,38.32034],[-78.93072,38.32074],[-78.93079,38.32128],[-78.93099,38.32258],[-78.93111,38.3233],[-78.93125,38.3242],[-78.93142,38.32528],[-78.93194,38.32845],[-78.93205,38.32921],[-78.93234,38.33096],[-78.93238,38.33128],[-78.93248,38.33183],[-78.93252,38.33216],[-78.93257,38.33243],[-78.93268,38.3331],[-78.93284,38.33406],[-78.93301,38.33507],[-78.93352,38.33826],[-78.93367,38.33925],[-78.9337,38.33947],[-78.93378,38.34023],[-78.9338,38.34067],[-78.93381,38.34111],[-78.93382,38.34166],[-78.93381,38.3421],[-78.93379,38.34243],[-78.93377,38.34274],[-78.93375,38.34303],[-78.93373,38.34319],[-78.93369,38.34352],[-78.93364,38.34385],[-78.93358,38.34429],[-78.9335,38.34472],[-78.93346,38.34492],[-78.93339,38.34526],[-78.93333,38.34551],[-78.93327,38.34573],[-78.93318,38.34603],[-78.93302,38.34656],[-78.93288,38.34698],[-78.93276,38.3473],[-78.93257,38.34779],[-78.93234,38.34835],[-78.93215,38.34876],[-78.93195,38.34917],[-78.93183,38.34939],[-78.93173,38.34959],[-78.93127,38.35041],[-78.93119,38.35053],[-78.93102,38.35081],[-78.93069,38.35131],[-78.93046,38.35163],[-78.92906,38.35376],[-78.92884,38.35411],[-78.92864,38.35443],[-78.92857,38.35453],[-78.92721,38.3566],[-78.92631,38.35796],[-78.92511,38.35977],[-78.92499,38.35994],[-78.92482,38.36019],[-78.92391,38.36155],[-78.9237,38.36188],[-78.92296,38.36299],[-78.92258,38.3636],[-78.92227,38.36418],[-78.92203,38.3646],[-78.92176,38.3651],[-78.9215,38.36561],[-78.92127,38.3661],[-78.92106,38.36655],[-78.92074,38.36728],[-78.92057,38.36771],[-78.92029,38.36845],[-78.91996,38.36941],[-78.91982,38.36984],[-78.9197,38.37027],[-78.91953,38.37092],[-78.91942,38.37136],[-78.91811,38.37704],[-78.91777,38.37852],[-78.91678,38.38278],[-78.9166,38.3835],[-78.9164,38.38418],[-78.9163,38.3845],[-78.91605,38.38525],[-78.9159,38.38568],[-78.91562,38.38641],[-78.91549,38.38673],[-78.91535,38.38705],[-78.91501,38.3878],[-78.91467,38.3885],[-78.91409,38.3897],[-78.91405,38.38977],[-78.91385,38.39019],[-78.91238,38.39317],[-78.91206,38.39383],[-78.91187,38.3942],[-78.91176,38.3944],[-78.91165,38.39461],[-78.91151,38.3949],[-78.91097,38.39601],[-78.91062,38.39676],[-78.91035,38.39732],[-78.91014,38.39774],[-78.90999,38.39805],[-78.90984,38.39836],[-78.90962,38.39877],[-78.90945,38.39907],[-78.90922,38.39947],[-78.90903,38.39978],[-78.90886,38.40004],[-78.90878,38.40017],[-78.90859,38.40045],[-78.90847,38.40062],[-78.90846,38.40063],[-78.90814,38.40105],[-78.908,38.40124],[-78.90784,38.40145],[-78.90769,38.40164],[-78.90758,38.40178],[-78.90724,38.40218],[-78.90704,38.40241],[-78.90692,38.40255],[-78.90685,38.40263],[-78.90663,38.40286],[-78.90636,38.40315],[-78.90576,38.40376],[-78.90565,38.40387],[-78.90536,38.40413],[-78.90532,38.40418],[-78.90507,38.4044],[-78.90485,38.40459],[-78.90465,38.40476],[-78.90448,38.40491],[-78.90418,38.40515],[-78.904,38.40529],[-78.90376,38.40547],[-78.90371,38.40552],[-78.90338,38.40576],[-78.90307,38.40598],[-78.90277,38.40619],[-78.90245,38.40641],[-78.90205,38.40667],[-78.90169,38.4069],[-78.9014,38.40708],[-78.90105,38.40729],[-78.90072,38.40748],[-78.90036,38.40767],[-78.90001,38.40787],[-78.89943,38.40817],[-78.89906,38.40835],[-78.89873,38.40852],[-78.89837,38.40871],[-78.89779,38.40901],[-78.89743,38.4092],[-78.89698,38.40943],[-78.89674,38.40955],[-78.89615,38.40986],[-78.8958,38.41004],[-78.89511,38.41039],[-78.8944,38.41076],[-78.89367,38.41114],[-78.89332,38.41132],[-78.89287,38.41156],[-78.8924,38.4118],[-78.89171,38.41215],[-78.89082,38.41261],[-78.8903,38.41287],[-78.88996,38.41306],[-78.8895,38.41332],[-78.8893,38.41344],[-78.88901,38.41362],[-78.88872,38.4138],[-78.88853,38.41393],[-78.88835,38.41405],[-78.88825,38.41412],[-78.88798,38.41431],[-78.8877,38.41451],[-78.88761,38.41458],[-78.88743,38.41471],[-78.88726,38.41485],[-78.88708,38.41499],[-78.8868,38.41523],[-78.88633,38.41564],[-78.88606,38.41589],[-78.88568,38.41626],[-78.88539,38.41656],[-78.88529,38.41667],[-78.88511,38.41686],[-78.88504,38.41693],[-78.88488,38.41712],[-78.88464,38.41741],[-78.8845,38.41758],[-78.88428,38.41785],[-78.88424,38.4179],[-78.88394,38.41829],[-78.88376,38.41852],[-78.88326,38.41916],[-78.88296,38.41954],[-78.88178,38.42106],[-78.88144,38.42149],[-78.88106,38.42198],[-78.88046,38.42275],[-78.88034,38.42291],[-78.88015,38.42316],[-78.87994,38.42342],[-78.87989,38.42349],[-78.87956,38.42388],[-78.87942,38.42406],[-78.87884,38.4248],[-78.87869,38.425],[-78.87837,38.42541],[-78.87817,38.42566],[-78.87756,38.42644],[-78.87735,38.42672],[-78.87692,38.4273],[-78.87671,38.42756],[-78.87614,38.42829],[-78.87593,38.42856],[-78.87563,38.42895],[-78.87557,38.42903],[-78.87548,38.42916],[-78.87519,38.42951],[-78.87499,38.42976],[-78.87494,38.42982],[-78.87474,38.43005],[-78.8745,38.43032],[-78.87445,38.43037],[-78.87424,38.43058],[-78.87404,38.43079],[-78.87376,38.43105],[-78.87348,38.43131],[-78.87319,38.43155],[-78.87298,38.43172],[-78.87285,38.43182],[-78.87261,38.43201],[-78.8722,38.4323],[-78.87188,38.43252],[-78.87165,38.43266],[-78.87123,38.43292],[-78.87101,38.43305],[-78.87062,38.43326],[-78.87042,38.43337],[-78.87004,38.43356],[-78.86956,38.43378],[-78.86907,38.43399],[-78.86889,38.43406],[-78.86871,38.43413],[-78.86832,38.43428],[-78.86802,38.43438],[-78.86777,38.43447],[-78.86751,38.43455],[-78.86712,38.43466],[-78.86694,38.43471],[-78.86672,38.43477],[-78.86632,38.43487],[-78.86578,38.43499],[-78.86537,38.43507],[-78.86497,38.43514],[-78.8647,38.43518],[-78.86442,38.43522],[-78.86405,38.43527],[-78.86373,38.4353],[-78.86359,38.43531],[-78.8633,38.43534],[-78.86304,38.43535],[-78.86276,38.43537],[-78.86234,38.43539],[-78.86192,38.4354],[-78.8615,38.4354],[-78.85969,38.43542],[-78.85941,38.43543],[-78.85891,38.43545],[-78.85853,38.43547],[-78.85814,38.4355],[-78.85788,38.43552],[-78.85744,38.43556],[-78.85722,38.43558],[-78.85703,38.43561],[-78.85658,38.43567],[-78.85612,38.43575],[-78.85558,38.43586],[-78.85492,38.43601],[-78.8546,38.4361],[-78.85431,38.43618],[-78.85417,38.43623],[-78.85351,38.43644],[-78.85313,38.43658],[-78.85264,38.43676],[-78.85217,38.43695],[-78.85182,38.4371],[-78.85109,38.43745],[-78.85075,38.43762],[-78.85058,38.4377],[-78.85027,38.43788],[-78.85022,38.43791],[-78.85012,38.43798],[-78.85008,38.438],[-78.85002,38.43804],[-78.84998,38.43807],[-78.84956,38.43833],[-78.84914,38.43861],[-78.84884,38.43883],[-78.84843,38.43911],[-78.84804,38.43943],[-78.84796,38.43949],[-78.84747,38.43993],[-78.84743,38.43997],[-78.84697,38.44042],[-78.84691,38.44049],[-78.84673,38.44068],[-78.84646,38.44096],[-78.84622,38.44123],[-78.84589,38.44156],[-78.84555,38.44192],[-78.84522,38.44225],[-78.84488,38.44261],[-78.84412,38.44339],[-78.84386,38.44367],[-78.84335,38.4442],[-78.843,38.44455],[-78.84283,38.44472],[-78.84264,38.44493],[-78.84225,38.44532],[-78.84207,38.44551],[-78.84115,38.44646],[-78.84098,38.44664],[-78.84085,38.44677],[-78.84061,38.44701],[-78.8403,38.44734],[-78.84002,38.44763],[-78.8398,38.44784],[-78.83938,38.44827],[-78.83915,38.4485],[-78.83901,38.44864],[-78.83869,38.44895],[-78.83814,38.44948],[-78.83738,38.45022],[-78.83708,38.4505],[-78.83689,38.45068],[-78.83644,38.4511],[-78.83618,38.45133],[-78.836,38.4515],[-78.83537,38.45207],[-78.83484,38.45255],[-78.83463,38.45272],[-78.83435,38.45297],[-78.83392,38.45335],[-78.83258,38.45453],[-78.82574,38.46052],[-78.82569,38.46056],[-78.82523,38.46097],[-78.82496,38.46123],[-78.8246,38.46159],[-78.8244,38.46179],[-78.82372,38.46252],[-78.82128,38.46521],[-78.81821,38.46859],[-78.81722,38.46969],[-78.81586,38.47118],[-78.81554,38.47154],[-78.8153,38.47182],[-78.81494,38.47227],[-78.81457,38.47274],[-78.81409,38.47341],[-78.81371,38.474],[-78.81335,38.47459],[-78.81323,38.4748],[-78.81312,38.47499],[-78.81295,38.4753],[-78.81275,38.4757],[-78.8126,38.47601],[-78.81236,38.47653],[-78.81214,38.47705],[-78.81201,38.47737],[-78.81186,38.47778],[-78.81087,38.48065],[-78.8104,38.48192],[-78.81014,38.48254],[-78.80975,38.48336],[-78.80958,38.48368],[-78.80942,38.48397],[-78.8092,38.48437],[-78.80902,38.48466],[-78.80883,38.48496],[-78.80864,38.48526],[-78.80836,38.48566],[-78.80798,38.48618],[-78.80737,38.48691],[-78.80715,38.48717],[-78.80678,38.48759],[-78.8061,38.4883],[-78.80518,38.48925],[-78.80456,38.4899],[-78.80424,38.49025],[-78.80391,38.49058],[-78.80354,38.49097],[-78.80313,38.49139],[-78.80235,38.4922],[-78.80209,38.49245],[-78.80169,38.49288],[-78.80146,38.49311],[-78.80129,38.49329],[-78.80068,38.49392],[-78.80023,38.49439],[-78.79919,38.49545],[-78.79849,38.49617],[-78.79759,38.49704],[-78.79707,38.49752],[-78.79651,38.49803],[-78.79578,38.49867],[-78.7951,38.49925],[-78.79471,38.49956],[-78.79425,38.49993],[-78.7913,38.5023],[-78.79098,38.50256],[-78.7891,38.50408],[-78.7889,38.50424],[-78.78851,38.50456],[-78.7877,38.50523],[-78.78737,38.50551],[-78.78691,38.50593],[-78.78673,38.50609],[-78.78618,38.50661],[-78.78558,38.50721],[-78.78523,38.50756],[-78.78496,38.50786],[-78.78458,38.50826],[-78.78426,38.50862],[-78.78342,38.50962],[-78.78326,38.50982],[-78.78312,38.50999],[-78.7826,38.51069],[-78.78254,38.51076],[-78.78214,38.51132],[-78.78151,38.51224],[-78.78134,38.51251],[-78.78103,38.51301],[-78.78095,38.51316],[-78.78073,38.51354],[-78.77909,38.51636],[-78.77892,38.51666],[-78.77827,38.51778],[-78.77697,38.52003],[-78.77653,38.52077],[-78.77437,38.52451],[-78.77389,38.52533],[-78.77368,38.52569],[-78.77295,38.52696],[-78.77275,38.5273],[-78.77237,38.52796],[-78.77097,38.53038],[-78.77064,38.53096],[-78.76991,38.53217],[-78.7693,38.53312],[-78.76894,38.53364],[-78.76847,38.53428],[-78.76809,38.53478],[-78.76755,38.53545],[-78.76679,38.53634],[-78.76619,38.53699],[-78.76543,38.53778],[-78.76459,38.53863],[-78.76381,38.53941],[-78.76367,38.53956],[-78.76324,38.54],[-78.76271,38.54051],[-78.76218,38.54106],[-78.76198,38.54126],[-78.75952,38.54374],[-78.75789,38.54536],[-78.75773,38.54553],[-78.75744,38.54583],[-78.7567,38.54658],[-78.75559,38.54768],[-78.75486,38.54844],[-78.75357,38.54973],[-78.75279,38.55053],[-78.75203,38.55129],[-78.75157,38.55175],[-78.75059,38.55274],[-78.75016,38.55318],[-78.74936,38.55402],[-78.74889,38.55456],[-78.74866,38.55484],[-78.7483,38.5553],[-78.74788,38.55585],[-78.74761,38.55623],[-78.74729,38.55672],[-78.74694,38.55729],[-78.74687,38.5574],[-78.74671,38.5577],[-78.74644,38.55819],[-78.74599,38.55906],[-78.74591,38.55922],[-78.74581,38.55945],[-78.74542,38.56045],[-78.74526,38.56092],[-78.74516,38.56129],[-78.74507,38.56159],[-78.74475,38.56265],[-78.74458,38.56317],[-78.7444,38.56379],[-78.7437,38.56604],[-78.74356,38.56643],[-78.74343,38.56685],[-78.74315,38.56772],[-78.74291,38.56839],[-78.74266,38.56905],[-78.74244,38.56958],[-78.74188,38.57083],[-78.74171,38.5712],[-78.74129,38.57201],[-78.74107,38.5724],[-78.74084,38.57281],[-78.74054,38.5733],[-78.74026,38.57375],[-78.74017,38.5739],[-78.73943,38.57497],[-78.73927,38.57519],[-78.73853,38.57619],[-78.73758,38.57742],[-78.73625,38.57916],[-78.73562,38.57997],[-78.73532,38.58036],[-78.73101,38.58599],[-78.73062,38.58651],[-78.73042,38.58675],[-78.7282,38.58965],[-78.72769,38.59032],[-78.72712,38.59107],[-78.72659,38.59175],[-78.72561,38.59303],[-78.72483,38.59405],[-78.72319,38.59619],[-78.72204,38.59768],[-78.72161,38.59825],[-78.72075,38.59937],[-78.71742,38.6037],[-78.71697,38.60427],[-78.71634,38.60502],[-78.7157,38.60573],[-78.71518,38.60628],[-78.71479,38.60668],[-78.71409,38.60736],[-78.71283,38.60852],[-78.71064,38.61053],[-78.70922,38.61184],[-78.70784,38.61312],[-78.70732,38.61364],[-78.70674,38.61425],[-78.70642,38.61461],[-78.70597,38.61515],[-78.70559,38.61562],[-78.70517,38.6162],[-78.70469,38.61689],[-78.70431,38.61751],[-78.70415,38.61776],[-78.70136,38.62242],[-78.701,38.62301],[-78.70088,38.62322],[-78.70079,38.62337],[-78.70034,38.62411],[-78.70016,38.6244],[-78.69989,38.62479],[-78.69954,38.62526],[-78.69916,38.62574],[-78.69871,38.62626],[-78.69845,38.62654],[-78.69767,38.62731],[-78.69711,38.62781],[-78.69694,38.62795],[-78.69662,38.62821],[-78.69631,38.62845],[-78.69568,38.6289],[-78.69493,38.62941],[-78.69376,38.63019],[-78.68709,38.63461],[-78.6865,38.63503],[-78.68635,38.63513],[-78.68596,38.63542],[-78.68575,38.63558],[-78.68508,38.63611],[-78.68467,38.63645],[-78.6838,38.63724],[-78.68335,38.6377],[-78.68323,38.63782],[-78.68274,38.63833],[-78.68228,38.63886],[-78.68189,38.63933],[-78.6811,38.64038],[-78.68024,38.64167],[-78.67994,38.64214],[-78.67797,38.64512],[-78.67741,38.64598],[-78.67614,38.64793],[-78.67575,38.64853],[-78.67422,38.65089],[-78.67255,38.6534],[-78.6704,38.65672],[-78.67017,38.65706],[-78.66986,38.65754],[-78.66798,38.66042],[-78.66738,38.66137],[-78.66684,38.66232],[-78.6665,38.66294],[-78.66625,38.66345],[-78.66527,38.66563],[-78.66313,38.67093],[-78.66111,38.67581],[-78.66074,38.67669],[-78.65913,38.68069],[-78.65829,38.68267],[-78.65827,38.68271],[-78.65805,38.6833],[-78.65767,38.68425],[-78.65759,38.68446],[-78.65743,38.68484],[-78.65626,38.68766],[-78.65593,38.6885],[-78.65517,38.6903],[-78.65467,38.69185],[-78.65439,38.69326],[-78.65437,38.69337],[-78.65425,38.69424],[-78.65413,38.69576],[-78.65415,38.69655],[-78.65419,38.69731],[-78.65425,38.69806],[-78.65434,38.69865],[-78.65447,38.6994],[-78.65458,38.69991],[-78.65459,38.69998],[-78.65461,38.70006],[-78.65476,38.7006],[-78.65494,38.70122],[-78.65501,38.70146],[-78.65539,38.70249],[-78.65573,38.7034],[-78.65627,38.70483],[-78.65648,38.70538],[-78.65669,38.70591],[-78.65681,38.70629],[-78.65705,38.7069],[-78.65757,38.70829],[-78.65793,38.7092],[-78.65875,38.71139],[-78.65956,38.71361],[-78.65971,38.71409],[-78.65983,38.71447],[-78.65987,38.71465],[-78.65993,38.71489],[-78.6601,38.71567],[-78.66021,38.71646],[-78.66024,38.71678],[-78.66026,38.71758],[-78.66024,38.7186],[-78.66021,38.71894],[-78.66013,38.71963],[-78.66008,38.71991],[-78.65999,38.72036],[-78.65982,38.72103],[-78.65945,38.72215],[-78.6593,38.72252],[-78.65908,38.72301],[-78.65902,38.72315],[-78.65884,38.72352],[-78.65849,38.72414],[-78.65846,38.72419],[-78.65823,38.72453],[-78.65796,38.72493],[-78.65743,38.7257],[-78.65696,38.7263],[-78.65637,38.72696],[-78.65624,38.7271],[-78.65574,38.72762],[-78.65379,38.7297],[-78.6523,38.73128],[-78.65204,38.73157],[-78.6518,38.73187],[-78.65163,38.73213],[-78.65158,38.7322],[-78.65134,38.73253],[-78.65096,38.73314],[-78.65072,38.73371],[-78.65055,38.73423],[-78.65041,38.73492],[-78.65037,38.73531],[-78.65036,38.73576],[-78.65039,38.73671],[-78.65041,38.73704],[-78.65049,38.73798],[-78.6508,38.74077],[-78.65092,38.7423],[-78.65093,38.74285],[-78.6509,38.7435],[-78.65088,38.74376],[-78.65081,38.74437],[-78.65068,38.7451],[-78.65047,38.74594],[-78.65036,38.74632],[-78.65011,38.74699],[-78.64991,38.74748],[-78.6497,38.74793],[-78.64944,38.74844],[-78.64919,38.74883],[-78.64856,38.7498],[-78.6485,38.74989],[-78.64823,38.75026],[-78.64797,38.7506],[-78.64794,38.75064],[-78.64767,38.75096],[-78.64739,38.75127],[-78.64647,38.75218],[-78.64646,38.75219],[-78.64613,38.75248],[-78.64566,38.75286],[-78.64346,38.75453],[-78.63656,38.75979],[-78.63437,38.76148],[-78.63367,38.76202],[-78.63291,38.7626],[-78.63014,38.76469],[-78.62819,38.76621],[-78.62745,38.76677],[-78.62618,38.76785],[-78.62502,38.76887],[-78.6246,38.76924],[-78.62394,38.76984],[-78.62315,38.77058],[-78.62294,38.77077],[-78.62248,38.77122],[-78.62195,38.77174],[-78.62128,38.77243],[-78.62101,38.77269],[-78.62054,38.77319],[-78.61994,38.77384],[-78.61886,38.77505],[-78.61879,38.77512],[-78.61794,38.77612],[-78.61721,38.777],[-78.61629,38.77817],[-78.61594,38.77864],[-78.61525,38.77957],[-78.61424,38.781],[-78.61351,38.78212],[-78.61311,38.78275],[-78.61226,38.78413],[-78.61218,38.78426],[-78.61186,38.78484],[-78.61139,38.78567],[-78.61103,38.78638],[-78.61094,38.78655],[-78.6102,38.78796],[-78.60899,38.79054],[-78.6072,38.79436],[-78.60717,38.79442],[-78.60598,38.79696],[-78.60424,38.80071],[-78.60358,38.80213],[-78.60338,38.80254],[-78.60303,38.80321],[-78.60266,38.80387],[-78.60186,38.80516],[-78.60138,38.80587],[-78.6011,38.80628],[-78.60056,38.80701],[-78.59988,38.80783],[-78.59925,38.8086],[-78.59834,38.80961],[-78.59809,38.80986],[-78.59792,38.81003],[-78.59746,38.8105],[-78.59724,38.81071],[-78.59694,38.81099],[-78.59584,38.81202],[-78.59446,38.81339],[-78.59132,38.81617],[-78.58737,38.81979],[-78.58448,38.82242],[-78.58251,38.82423],[-78.58128,38.82533],[-78.58098,38.82561],[-78.57821,38.82819],[-78.57754,38.82881],[-78.57712,38.82917],[-78.57603,38.83016],[-78.57513,38.83099],[-78.57438,38.83162],[-78.57397,38.83195],[-78.57319,38.83253],[-78.573,38.83266],[-78.57227,38.83316],[-78.57138,38.83369],[-78.57102,38.83391],[-78.5702,38.83441],[-78.56917,38.83507],[-78.56903,38.83516],[-78.56678,38.83653],[-78.5636,38.83847],[-78.56333,38.83864],[-78.56243,38.83921],[-78.55957,38.84097],[-78.55803,38.84189],[-78.5568,38.84266],[-78.5555,38.84347],[-78.5534,38.84476],[-78.54879,38.84758],[-78.54783,38.84815],[-78.54585,38.84935],[-78.54531,38.8497],[-78.54472,38.85006],[-78.54438,38.85029],[-78.54339,38.8509],[-78.54244,38.85154],[-78.54126,38.8524],[-78.54023,38.85319],[-78.53878,38.85445],[-78.53814,38.85504],[-78.53779,38.85541],[-78.53725,38.85595],[-78.53644,38.85678],[-78.53584,38.85744],[-78.53486,38.85864],[-78.53375,38.86021],[-78.53318,38.86108],[-78.5331,38.8612],[-78.53271,38.86186],[-78.53269,38.8619],[-78.53243,38.86234],[-78.53167,38.8637],[-78.53111,38.8647],[-78.53088,38.86512],[-78.53014,38.86651],[-78.52885,38.86889],[-78.52826,38.86995],[-78.5279,38.87054],[-78.5276,38.87114],[-78.52755,38.87124],[-78.5272,38.87187],[-78.52666,38.87294],[-78.52656,38.87311],[-78.52556,38.8749],[-78.52466,38.87659],[-78.52426,38.8773],[-78.52408,38.87761],[-78.52354,38.87861],[-78.52331,38.87904],[-78.52254,38.88043],[-78.52177,38.88189],[-78.52027,38.88461],[-78.51973,38.88547],[-78.5196,38.8857],[-78.51938,38.88606],[-78.51901,38.88664],[-78.51872,38.88707],[-78.5187,38.88711],[-78.51776,38.88849],[-78.51757,38.88877],[-78.51667,38.89005],[-78.51477,38.89247],[-78.51444,38.89287],[-78.51401,38.89338],[-78.51362,38.89383],[-78.51275,38.89482],[-78.51105,38.89663],[-78.50968,38.89801],[-78.50793,38.89971],[-78.50308,38.90442],[-78.50183,38.90569],[-78.50126,38.90629],[-78.50015,38.9075],[-78.49912,38.90866],[-78.49832,38.9096],[-78.49682,38.91141],[-78.49634,38.912],[-78.49536,38.91321],[-78.49505,38.91362],[-78.49465,38.91408],[-78.48979,38.9201],[-78.4888,38.92144],[-78.48847,38.92185],[-78.48802,38.92235],[-78.4873,38.92322],[-78.48701,38.92347],[-78.48569,38.92497],[-78.48475,38.92595],[-78.48434,38.92638],[-78.48356,38.9272],[-78.48179,38.92891],[-78.48048,38.93009],[-78.47925,38.93113],[-78.47879,38.93153],[-78.47727,38.93286],[-78.47617,38.93383],[-78.47573,38.93419],[-78.47528,38.9346],[-78.47483,38.93496],[-78.47457,38.93521],[-78.47348,38.93614],[-78.47257,38.9369],[-78.46889,38.94011],[-78.46754,38.94123],[-78.46505,38.94337],[-78.46459,38.94377],[-78.46286,38.94529],[-78.4619,38.94612],[-78.46,38.94776],[-78.45871,38.94888],[-78.45752,38.9499],[-78.45636,38.95089],[-78.45537,38.9517],[-78.45484,38.95211],[-78.45402,38.95278],[-78.45301,38.95353],[-78.45283,38.95366],[-78.45214,38.95417],[-78.45197,38.95428],[-78.45161,38.95454],[-78.45081,38.9551],[-78.45051,38.95532],[-78.44591,38.95854],[-78.43996,38.96276],[-78.43683,38.96494],[-78.43624,38.96538],[-78.43545,38.96595],[-78.43453,38.96662],[-78.4334,38.96749],[-78.43251,38.96819],[-78.43166,38.96889],[-78.43048,38.96989],[-78.4301,38.97021],[-78.42958,38.97067],[-78.42931,38.97092],[-78.428,38.97212],[-78.42702,38.97309],[-78.42638,38.97372],[-78.42514,38.97502],[-78.42393,38.97633],[-78.4234,38.97695],[-78.42259,38.97791],[-78.41926,38.98207],[-78.41909,38.98228],[-78.41842,38.98306],[-78.4175,38.98405],[-78.4168,38.98475],[-78.41595,38.98556],[-78.41551,38.98595],[-78.41443,38.98687],[-78.41385,38.98734],[-78.41286,38.98808],[-78.41246,38.98837],[-78.41204,38.98866],[-78.41129,38.98917],[-78.41015,38.9899],[-78.40936,38.99037],[-78.40876,38.99071],[-78.40798,38.99113],[-78.40754,38.99136],[-78.40713,38.99157],[-78.40598,38.99213],[-78.40482,38.99267],[-78.40453,38.9928],[-78.40367,38.99321],[-78.40256,38.99372],[-78.39758,38.99603],[-78.39569,38.99692],[-78.39407,38.99768],[-78.38861,39.00022],[-78.38582,39.00152],[-78.38426,39.00225],[-78.38317,39.00275],[-78.37767,39.00531],[-78.37333,39.00731],[-78.37273,39.00759],[-78.36842,39.0096],[-78.36447,39.01144],[-78.36256,39.01234],[-78.36187,39.01266],[-78.36107,39.01303],[-78.36099,39.01306],[-78.36098,39.01307],[-78.35931,39.01384],[-78.35888,39.01403],[-78.35846,39.01417],[-78.35806,39.01429],[-78.35749,39.01446],[-78.35682,39.0146],[-78.35619,39.01471],[-78.35552,39.01479],[-78.35461,39.01482],[-78.35387,39.01481],[-78.35293,39.01474],[-78.35215,39.01463],[-78.35142,39.01447],[-78.35037,39.01417],[-78.34878,39.01357],[-78.34807,39.0133],[-78.34507,39.0121],[-78.3447,39.01196],[-78.34072,39.0104],[-78.33873,39.00962],[-78.33676,39.00885],[-78.33636,39.0087],[-78.33489,39.00812],[-78.33336,39.00752],[-78.33256,39.0072],[-78.32934,39.00595],[-78.32718,39.0051],[-78.32635,39.0048],[-78.32583,39.00463],[-78.32535,39.00448],[-78.32458,39.00427],[-78.32411,39.00415],[-78.32287,39.00387],[-78.32225,39.00377],[-78.32193,39.00372],[-78.32173,39.00369],[-78.32115,39.00362],[-78.32028,39.00354],[-78.3197,39.0035],[-78.31909,39.00347],[-78.31851,39.00346],[-78.3178,39.00346],[-78.31737,39.00347],[-78.3165,39.00351],[-78.31566,39.00358],[-78.31495,39.00366],[-78.31439,39.00374],[-78.31383,39.00383],[-78.31341,39.00391],[-78.3132,39.00395],[-78.31256,39.00408],[-78.31176,39.00428],[-78.31136,39.00439],[-78.31069,39.00459],[-78.31016,39.00477],[-78.30818,39.00545],[-78.30752,39.00568],[-78.30599,39.00623],[-78.30454,39.00674],[-78.30372,39.00703],[-78.30152,39.00779],[-78.30102,39.00798],[-78.3001,39.00824],[-78.29966,39.00837],[-78.29893,39.00842],[-78.29806,39.00845],[-78.29679,39.00821],[-78.29603,39.00798],[-78.29573,39.00782],[-78.29554,39.00773],[-78.29535,39.00762],[-78.29468,39.00725],[-78.29429,39.00699],[-78.29384,39.00669],[-78.29339,39.00636],[-78.29277,39.00595],[-78.28974,39.00395],[-78.28891,39.00341],[-78.28818,39.00294],[-78.28776,39.00268],[-78.28742,39.0025],[-78.28685,39.00221],[-78.28626,39.00194],[-78.28602,39.00184],[-78.28561,39.00168],[-78.28524,39.00154],[-78.2847,39.00137],[-78.28419,39.00122],[-78.283,39.00092],[-78.28103,39.00044],[-78.2805,39.00031],[-78.27923,39],[-78.27398,38.9987],[-78.27322,38.99851],[-78.27208,38.99823],[-78.27157,38.99811],[-78.27092,38.99794],[-78.2704,38.99782],[-78.27014,38.99775],[-78.26941,38.99757],[-78.26766,38.99714],[-78.26656,38.99686],[-78.26574,38.99666],[-78.26535,38.99657],[-78.26414,38.99628],[-78.26337,38.99612],[-78.26244,38.99594],[-78.26151,38.99577],[-78.26046,38.99561],[-78.2571,38.99512],[-78.25658,38.99503],[-78.25592,38.99491],[-78.25585,38.99489],[-78.25561,38.99484],[-78.255,38.9947],[-78.25461,38.99461],[-78.25411,38.99447],[-78.25373,38.99436],[-78.2531,38.99417],[-78.25266,38.99402],[-78.25236,38.99391],[-78.25165,38.99363],[-78.25093,38.99333],[-78.25036,38.99306],[-78.25016,38.99296],[-78.25002,38.99289],[-78.24957,38.99266],[-78.24912,38.99241],[-78.24803,38.99181],[-78.2466,38.99101],[-78.24495,38.99009],[-78.24155,38.9882],[-78.24053,38.98764],[-78.23858,38.98654],[-78.23781,38.98613],[-78.23637,38.98533],[-78.23536,38.98476],[-78.23385,38.98392],[-78.23165,38.9827],[-78.23021,38.98193],[-78.22872,38.98114],[-78.22834,38.98094],[-78.22752,38.98052],[-78.22673,38.98012],[-78.22575,38.97962],[-78.22438,38.97893],[-78.22147,38.97744],[-78.21975,38.97656],[-78.21485,38.97407],[-78.21393,38.97359],[-78.21303,38.97312],[-78.21178,38.97244],[-78.21149,38.97228],[-78.2109,38.97194],[-78.21014,38.9715],[-78.20966,38.97121],[-78.20907,38.97086],[-78.20674,38.96942],[-78.20648,38.96926],[-78.20307,38.96712],[-78.20135,38.96605],[-78.20012,38.96528],[-78.1995,38.9649],[-78.19907,38.96463],[-78.19661,38.96309],[-78.19654,38.96304],[-78.19553,38.96243],[-78.19544,38.96237],[-78.19476,38.96194],[-78.19318,38.96095],[-78.19256,38.96056],[-78.19064,38.95937],[-78.18965,38.95874],[-78.18877,38.95816],[-78.18813,38.95773],[-78.18684,38.95685],[-78.18622,38.95642],[-78.1857,38.95606],[-78.18509,38.95564],[-78.18468,38.95535],[-78.18466,38.95534],[-78.18429,38.95508],[-78.18354,38.95455],[-78.18257,38.95391],[-78.18213,38.95363],[-78.18144,38.95323],[-78.18095,38.95298],[-78.18051,38.95277],[-78.17988,38.95248],[-78.17967,38.9524],[-78.17924,38.95223],[-78.17873,38.95204],[-78.17834,38.95191],[-78.17795,38.95179],[-78.17754,38.95168],[-78.17713,38.95157],[-78.17646,38.95141],[-78.17507,38.95113],[-78.1748,38.95108],[-78.17413,38.95094],[-78.1737,38.95085],[-78.17279,38.95067],[-78.17095,38.95029],[-78.16908,38.94991],[-78.1688,38.94985],[-78.16769,38.94962],[-78.16339,38.94873],[-78.16212,38.94848],[-78.16102,38.94825],[-78.15864,38.94778],[-78.15261,38.94656],[-78.15146,38.94632],[-78.15105,38.94623],[-78.15018,38.94602],[-78.14938,38.94581],[-78.14874,38.94564],[-78.1478,38.94535],[-78.14689,38.94508],[-78.14044,38.94293],[-78.13844,38.94226],[-78.13618,38.94151],[-78.13594,38.94142],[-78.13555,38.94127],[-78.13501,38.94104],[-78.13463,38.94085],[-78.13426,38.94066],[-78.13389,38.94044],[-78.13352,38.94021],[-78.13316,38.93997],[-78.13286,38.93975],[-78.1325,38.93946],[-78.13223,38.93923],[-78.13199,38.939],[-78.13169,38.93871],[-78.1315,38.93851],[-78.13118,38.93814],[-78.13096,38.93786],[-78.13077,38.9376],[-78.13069,38.93748],[-78.1304,38.937],[-78.13027,38.93678],[-78.13008,38.93641],[-78.12999,38.9362],[-78.12984,38.93583],[-78.12971,38.93547],[-78.1296,38.93509],[-78.12951,38.9347],[-78.12946,38.93436],[-78.1294,38.93394],[-78.1294,38.9339],[-78.12938,38.93364],[-78.12938,38.93327],[-78.12938,38.93296],[-78.12941,38.93256],[-78.12977,38.92931],[-78.12986,38.92832],[-78.12988,38.92797],[-78.12988,38.92756],[-78.12986,38.92723],[-78.12983,38.92695],[-78.12982,38.92688],[-78.12978,38.92656],[-78.12969,38.92614],[-78.12961,38.92581],[-78.12949,38.92541],[-78.12939,38.92514],[-78.12917,38.92464],[-78.12896,38.9242],[-78.12887,38.92404],[-78.12862,38.92363],[-78.12839,38.92329],[-78.12818,38.92302],[-78.1281,38.92291],[-78.12754,38.92227],[-78.1274,38.92213],[-78.12713,38.92186],[-78.12674,38.92152],[-78.12635,38.9212],[-78.12601,38.92095],[-78.12549,38.9206],[-78.12506,38.92034],[-78.12469,38.92014],[-78.12436,38.91997],[-78.12368,38.91966],[-78.12355,38.9196],[-78.1234,38.91954],[-78.12322,38.91947],[-78.12258,38.91926],[-78.12241,38.9192],[-78.12185,38.91903],[-78.12136,38.91891],[-78.12092,38.91882],[-78.12045,38.91873],[-78.11994,38.91865],[-78.11935,38.91856],[-78.11568,38.91797],[-78.11143,38.9173],[-78.10523,38.91631],[-78.10426,38.91616],[-78.10399,38.91611],[-78.10371,38.91607],[-78.09955,38.91541],[-78.09897,38.91531],[-78.09456,38.91461],[-78.09408,38.91452],[-78.09371,38.91444],[-78.09318,38.9143],[-78.0927,38.91415],[-78.09222,38.91399],[-78.09172,38.9138],[-78.09147,38.91369],[-78.09092,38.91343],[-78.08803,38.91204],[-78.08752,38.91181],[-78.08716,38.91166],[-78.08695,38.91158],[-78.08643,38.91141],[-78.08603,38.91129],[-78.08565,38.9112],[-78.08522,38.9111],[-78.08475,38.91102],[-78.08443,38.91097],[-78.08398,38.91092],[-78.08352,38.91088],[-78.08315,38.91086],[-78.08275,38.91085],[-78.08239,38.91086],[-78.08192,38.91088],[-78.08154,38.91091],[-78.08111,38.91095],[-78.08098,38.91097],[-78.07786,38.91139],[-78.0773,38.91145],[-78.07686,38.91149],[-78.07609,38.91154],[-78.07592,38.91155],[-78.07547,38.91157],[-78.07503,38.91157],[-78.07446,38.91157],[-78.0738,38.91155],[-78.07359,38.91155],[-78.07293,38.91151],[-78.0718,38.9114],[-78.07068,38.91128],[-78.06985,38.91119],[-78.06557,38.91075],[-78.06533,38.91073],[-78.0648,38.91068],[-78.06179,38.91036],[-78.0609,38.91028],[-78.0601,38.91023],[-78.05941,38.91019],[-78.05857,38.91015],[-78.05774,38.91014],[-78.05671,38.91012],[-78.05649,38.91012],[-78.05579,38.91011],[-78.05534,38.91011],[-78.05353,38.91009],[-78.05302,38.91008],[-78.05245,38.91007],[-78.05202,38.91007],[-78.05103,38.91006],[-78.05042,38.91006],[-78.04677,38.91002],[-78.04424,38.90997],[-78.04342,38.90995],[-78.04259,38.90991],[-78.04201,38.90988],[-78.04136,38.90982],[-78.04067,38.90976],[-78.04011,38.90971],[-78.03927,38.90961],[-78.03835,38.90949],[-78.03815,38.90946],[-78.03782,38.90941],[-78.03709,38.9093],[-78.0364,38.90918],[-78.03551,38.90904],[-78.0322,38.90851],[-78.03155,38.9084],[-78.03046,38.90823],[-78.02964,38.90809],[-78.02881,38.90796],[-78.02796,38.90781],[-78.0279,38.9078],[-78.02708,38.90768],[-78.02606,38.90752],[-78.02503,38.90735],[-78.02275,38.90698],[-78.02167,38.90679],[-78.02082,38.90666],[-78.01999,38.90654],[-78.01878,38.90639],[-78.01857,38.90636],[-78.01832,38.90635],[-78.01828,38.90635],[-78.01775,38.9063],[-78.01656,38.90624],[-78.01572,38.90621],[-78.01453,38.90621],[-78.0134,38.90626],[-78.01079,38.9064],[-78.00976,38.90645],[-78.00951,38.90647],[-78.00723,38.90658],[-78.00589,38.90665],[-78.00571,38.90666],[-78.00568,38.90666],[-78.00509,38.90669],[-78.00388,38.90675],[-78.00302,38.9068],[-78.00131,38.90689],[-77.99893,38.907],[-77.9981,38.90705],[-77.99748,38.90708],[-77.99489,38.90722],[-77.99395,38.90726],[-77.99377,38.90727],[-77.99264,38.90733],[-77.99223,38.90735],[-77.98944,38.9075],[-77.98805,38.90763],[-77.98693,38.90779],[-77.98645,38.90786],[-77.98622,38.9079],[-77.98558,38.90802],[-77.98474,38.90819],[-77.98366,38.90845],[-77.9818,38.90889],[-77.98139,38.90899],[-77.98088,38.90909],[-77.98026,38.9092],[-77.97978,38.90928],[-77.97947,38.90932],[-77.97847,38.9094],[-77.97827,38.90942],[-77.97757,38.90943],[-77.97716,38.90944],[-77.97686,38.90943],[-77.97627,38.90941],[-77.97528,38.90933],[-77.97478,38.90926],[-77.97471,38.90925],[-77.97426,38.90918],[-77.97353,38.90906],[-77.97324,38.909],[-77.97276,38.90889],[-77.97221,38.90875],[-77.9715,38.90856],[-77.97048,38.9083],[-77.97032,38.90827],[-77.96955,38.90809],[-77.96921,38.90803],[-77.96894,38.90799],[-77.96864,38.90795],[-77.968,38.9079],[-77.96756,38.90789],[-77.96712,38.90789],[-77.96654,38.90792],[-77.9662,38.90795],[-77.96563,38.90802],[-77.9655,38.90804],[-77.96515,38.9081],[-77.96488,38.90816],[-77.96467,38.90819],[-77.96387,38.90833],[-77.96306,38.90846],[-77.96268,38.9085],[-77.9622,38.90854],[-77.96182,38.90856],[-77.96127,38.90854],[-77.96058,38.9085],[-77.96014,38.90843],[-77.95977,38.90837],[-77.95966,38.90835],[-77.9592,38.90825],[-77.95855,38.90806],[-77.9563,38.90735],[-77.95551,38.9071],[-77.9524,38.90612],[-77.95055,38.90553],[-77.94923,38.90511],[-77.94791,38.90469],[-77.94734,38.90451],[-77.94682,38.90435],[-77.94554,38.90395],[-77.94513,38.90382],[-77.94406,38.90348],[-77.94372,38.90337],[-77.94277,38.90307],[-77.94249,38.90298],[-77.94214,38.90287],[-77.94182,38.90279],[-77.94106,38.90259],[-77.93984,38.90237],[-77.93952,38.90232],[-77.9391,38.90226],[-77.93833,38.9022],[-77.93811,38.90218],[-77.93744,38.90216],[-77.93614,38.90218],[-77.93554,38.90218],[-77.93415,38.9022],[-77.93356,38.9022],[-77.93293,38.90217],[-77.93232,38.90215],[-77.93209,38.90214],[-77.93126,38.90208],[-77.92958,38.90191],[-77.9288,38.90179],[-77.92807,38.90167],[-77.92744,38.90155],[-77.92682,38.90142],[-77.92608,38.90123],[-77.92566,38.90112],[-77.92511,38.90099],[-77.92439,38.90079],[-77.92382,38.90061],[-77.92312,38.90037],[-77.92242,38.90012],[-77.92173,38.89984],[-77.92092,38.8995],[-77.92027,38.8992],[-77.91946,38.8988],[-77.91878,38.89845],[-77.91811,38.89807],[-77.91768,38.89781],[-77.91698,38.89738],[-77.91646,38.89704],[-77.91603,38.89673],[-77.91562,38.89644],[-77.91503,38.89599],[-77.91449,38.89555],[-77.91381,38.89496],[-77.91299,38.8942],[-77.91113,38.89244],[-77.90903,38.89042],[-77.9087,38.89007],[-77.90853,38.88988],[-77.90838,38.88971],[-77.90827,38.88957],[-77.90815,38.88943],[-77.90791,38.88911],[-77.90768,38.88878],[-77.90743,38.88838],[-77.90724,38.88805],[-77.90703,38.88763],[-77.90688,38.88728],[-77.90686,38.88724],[-77.90668,38.88677],[-77.90655,38.88639],[-77.90648,38.88617],[-77.90636,38.88567],[-77.90628,38.88523],[-77.90623,38.8849],[-77.90621,38.88463],[-77.90621,38.88455],[-77.90613,38.88389],[-77.90605,38.88297],[-77.90589,38.88137],[-77.90581,38.88076],[-77.90574,38.88039],[-77.90567,38.88014],[-77.90557,38.87984],[-77.90542,38.87947],[-77.90528,38.87917],[-77.90515,38.87892],[-77.90498,38.87866],[-77.90481,38.8784],[-77.90462,38.87816],[-77.90443,38.87793],[-77.90426,38.87775],[-77.90401,38.8775],[-77.90373,38.87726],[-77.90344,38.87702],[-77.90317,38.87682],[-77.90289,38.87664],[-77.90232,38.8763],[-77.90197,38.8761],[-77.90137,38.87577],[-77.89913,38.87449],[-77.89787,38.87379],[-77.89737,38.8735],[-77.8953,38.87233],[-77.8942,38.8717],[-77.894,38.87159],[-77.89287,38.87093],[-77.89215,38.8705],[-77.89107,38.86988],[-77.88943,38.86895],[-77.88908,38.86875],[-77.88883,38.86861],[-77.88815,38.86822],[-77.88485,38.86635],[-77.88399,38.86587],[-77.88313,38.86537],[-77.88074,38.86402],[-77.87913,38.8631],[-77.87856,38.86279],[-77.87797,38.8625],[-77.87738,38.86221],[-77.87678,38.86193],[-77.87617,38.86167],[-77.87555,38.86142],[-77.87488,38.86117],[-77.87421,38.86093],[-77.87352,38.86071],[-77.87263,38.86045],[-77.87201,38.86027],[-77.87167,38.86018],[-77.86497,38.8583],[-77.86436,38.85814],[-77.86386,38.85803],[-77.86336,38.85792],[-77.86278,38.8578],[-77.86223,38.85771],[-77.86179,38.85764],[-77.86123,38.85757],[-77.86057,38.8575],[-77.86002,38.85745],[-77.85947,38.85742],[-77.85876,38.8574],[-77.85814,38.85739],[-77.85752,38.8574],[-77.85635,38.85745],[-77.85614,38.85746],[-77.85413,38.85757],[-77.85112,38.85774],[-77.84734,38.85795],[-77.84466,38.8581],[-77.84332,38.85816],[-77.84181,38.85825],[-77.84076,38.85831],[-77.83989,38.85834],[-77.83824,38.85839],[-77.83741,38.8584],[-77.83648,38.8584],[-77.83537,38.8584],[-77.83403,38.85838],[-77.83367,38.85837],[-77.83324,38.85836],[-77.83224,38.85833],[-77.83048,38.85825],[-77.82948,38.85819],[-77.8282,38.85809],[-77.81887,38.85741],[-77.8172,38.85729],[-77.81574,38.85719],[-77.81102,38.85683],[-77.80981,38.85671],[-77.80862,38.85655],[-77.80791,38.85645],[-77.8076,38.8564],[-77.80703,38.85631],[-77.8063,38.85618],[-77.80482,38.85587],[-77.8042,38.85573],[-77.8025,38.85531],[-77.80117,38.85492],[-77.80025,38.85463],[-77.80006,38.85457],[-77.79955,38.8544],[-77.79879,38.85414],[-77.79782,38.85377],[-77.79733,38.85358],[-77.79652,38.85324],[-77.7959,38.85297],[-77.7957,38.85288],[-77.79526,38.85268],[-77.79384,38.852],[-77.79276,38.85148],[-77.78992,38.85008],[-77.78926,38.84976],[-77.78795,38.84912],[-77.78717,38.84875],[-77.78676,38.84858],[-77.78628,38.84839],[-77.786,38.84828],[-77.78595,38.84826],[-77.78552,38.84811],[-77.78502,38.84795],[-77.78459,38.84782],[-77.78452,38.84781],[-77.78394,38.84766],[-77.78348,38.84755],[-77.78289,38.84743],[-77.7823,38.84733],[-77.78182,38.84726],[-77.78122,38.84719],[-77.78079,38.84715],[-77.78025,38.84711],[-77.7797,38.84709],[-77.77905,38.84709],[-77.77487,38.84716],[-77.76843,38.84729],[-77.76655,38.84732],[-77.76456,38.84737],[-77.76353,38.84736],[-77.76242,38.84732],[-77.7618,38.8473],[-77.76137,38.84728],[-77.76106,38.84725],[-77.76042,38.84718],[-77.76007,38.84713],[-77.75949,38.84704],[-77.75889,38.84694],[-77.75828,38.84681],[-77.7578,38.8467],[-77.75769,38.84668],[-77.75716,38.84654],[-77.7568,38.84645],[-77.75652,38.84637],[-77.75576,38.84612],[-77.7557,38.8461],[-77.75493,38.84583],[-77.7545,38.84567],[-77.75349,38.84525],[-77.7531,38.84507],[-77.75246,38.84475],[-77.75201,38.84451],[-77.75156,38.84425],[-77.75119,38.84403],[-77.75072,38.84373],[-77.75036,38.84349],[-77.74965,38.84298],[-77.74525,38.83955],[-77.74428,38.83877],[-77.74334,38.83798],[-77.7426,38.83734],[-77.74186,38.8367],[-77.74178,38.83661],[-77.74078,38.83571],[-77.73989,38.83488],[-77.73894,38.83395],[-77.73772,38.83274],[-77.7373,38.83235],[-77.73677,38.83189],[-77.73638,38.83158],[-77.73596,38.83126],[-77.7355,38.83093],[-77.73502,38.83061],[-77.73445,38.83025],[-77.73384,38.82989],[-77.73354,38.82973],[-77.73307,38.82947],[-77.73266,38.82928],[-77.73218,38.82906],[-77.73201,38.82898],[-77.73147,38.82876],[-77.73085,38.82851],[-77.73043,38.82836],[-77.7299,38.82818],[-77.72944,38.82804],[-77.72898,38.8279],[-77.72823,38.8277],[-77.72295,38.82635],[-77.72247,38.82622],[-77.71983,38.82555],[-77.71623,38.82462],[-77.71593,38.82455],[-77.7149,38.82429],[-77.71457,38.82422],[-77.71413,38.82413],[-77.71358,38.82403],[-77.71303,38.82395],[-77.71246,38.82389],[-77.712,38.82384],[-77.71143,38.8238],[-77.71095,38.82379],[-77.71056,38.82377],[-77.71012,38.82376],[-77.70992,38.82376],[-77.7096,38.82376],[-77.70931,38.82377],[-77.70869,38.82378],[-77.7077,38.82383],[-77.70715,38.82386],[-77.70659,38.82391],[-77.70575,38.82399],[-77.70481,38.82411],[-77.70364,38.82428],[-77.70317,38.82434],[-77.70267,38.82438],[-77.70225,38.82441],[-77.70182,38.82442],[-77.70128,38.82443],[-77.70086,38.82442],[-77.70035,38.82439],[-77.69991,38.82436],[-77.69984,38.82435],[-77.69933,38.8243],[-77.6988,38.82422],[-77.69827,38.82413],[-77.69796,38.82407],[-77.69562,38.82359],[-77.69316,38.82307],[-77.69194,38.82284],[-77.69159,38.82277],[-77.69084,38.82264],[-77.69071,38.82262],[-77.68966,38.82245],[-77.68859,38.82229],[-77.6876,38.82216],[-77.68642,38.82202],[-77.68589,38.82197],[-77.68544,38.82192],[-77.68441,38.82183],[-77.68339,38.82175],[-77.68258,38.8217],[-77.68133,38.82164],[-77.68024,38.8216],[-77.67977,38.82159],[-77.67856,38.82156],[-77.67779,38.82155],[-77.67692,38.82154],[-77.67562,38.82151],[-77.67515,38.82151],[-77.66688,38.82138],[-77.66557,38.82136],[-77.66444,38.82134],[-77.66415,38.82134],[-77.65878,38.82125],[-77.65861,38.82125],[-77.65803,38.82125],[-77.65759,38.82124],[-77.65753,38.82124],[-77.65471,38.82119],[-77.65345,38.82117],[-77.65253,38.82112],[-77.65149,38.82103],[-77.65107,38.821],[-77.65047,38.82093],[-77.64962,38.82081],[-77.649,38.82072],[-77.64845,38.82062],[-77.64779,38.82049],[-77.64727,38.82038],[-77.64638,38.82017],[-77.64603,38.82008],[-77.64521,38.81985],[-77.64458,38.81967],[-77.64375,38.81939],[-77.64312,38.81916],[-77.64241,38.81888],[-77.64179,38.81863],[-77.64117,38.81836],[-77.64059,38.81808],[-77.64033,38.81796],[-77.64021,38.8179],[-77.63985,38.81773],[-77.63672,38.81623],[-77.6357,38.81573],[-77.63371,38.81478],[-77.63271,38.8143],[-77.63185,38.81389],[-77.62981,38.81291],[-77.62891,38.81248],[-77.62703,38.81158],[-77.6236,38.80993],[-77.62218,38.80924],[-77.62086,38.80859],[-77.61946,38.80788],[-77.61817,38.80722],[-77.61451,38.80531],[-77.61341,38.80473],[-77.61338,38.80472],[-77.61245,38.80426],[-77.61199,38.80405],[-77.61143,38.80379],[-77.61138,38.80376],[-77.61105,38.80361],[-77.60983,38.80308],[-77.60942,38.80291],[-77.60841,38.8025],[-77.60742,38.80212],[-77.60639,38.80175],[-77.60567,38.8015],[-77.60526,38.80136],[-77.60473,38.80119],[-77.60381,38.80091],[-77.60302,38.80068],[-77.60251,38.80054],[-77.60165,38.80033],[-77.60137,38.80026],[-77.60056,38.80007],[-77.59976,38.7999],[-77.59957,38.79987],[-77.59933,38.79982],[-77.59796,38.79958],[-77.59771,38.79954],[-77.59704,38.79943],[-77.59121,38.7986],[-77.58869,38.79827],[-77.58637,38.79794],[-77.58524,38.79779],[-77.58466,38.79771],[-77.58352,38.79759],[-77.5826,38.79751],[-77.58173,38.79747],[-77.58065,38.79742],[-77.57985,38.79741],[-77.57938,38.79739],[-77.57933,38.79739],[-77.57835,38.79739],[-77.57699,38.7974],[-77.57601,38.79745],[-77.57537,38.7975],[-77.57114,38.7978],[-77.56929,38.79792],[-77.56555,38.79819],[-77.56166,38.79845],[-77.55589,38.7988],[-77.55376,38.79895],[-77.55089,38.79915],[-77.5503,38.79919],[-77.54841,38.79933],[-77.54595,38.79949],[-77.54106,38.79981],[-77.53934,38.79995],[-77.53655,38.80015],[-77.53228,38.80045],[-77.52914,38.80067],[-77.52586,38.8009],[-77.52317,38.80108],[-77.52013,38.80132],[-77.51943,38.80137],[-77.51859,38.80144],[-77.51466,38.8017],[-77.51275,38.80183],[-77.51226,38.80188],[-77.51176,38.80195],[-77.51124,38.80203],[-77.51073,38.80213],[-77.51024,38.80225],[-77.50976,38.80237],[-77.50928,38.80251],[-77.50876,38.80269],[-77.50825,38.80287],[-77.50324,38.80485],[-77.50187,38.80538],[-77.49854,38.8067],[-77.49285,38.80893],[-77.49259,38.80904],[-77.49141,38.8095],[-77.49073,38.80977],[-77.49039,38.8099],[-77.48985,38.81013],[-77.48976,38.81016],[-77.48959,38.81023],[-77.48813,38.81081],[-77.48798,38.81088],[-77.48794,38.81089],[-77.48761,38.81103],[-77.48689,38.81131],[-77.48552,38.81184],[-77.48102,38.81361],[-77.48003,38.81399],[-77.47953,38.81418],[-77.47828,38.81467],[-77.47778,38.81486],[-77.4767,38.81528],[-77.47631,38.81544],[-77.47085,38.81759],[-77.47,38.81793],[-77.46911,38.81831],[-77.46826,38.81869],[-77.46779,38.81891],[-77.46682,38.81938],[-77.46648,38.81956],[-77.46598,38.81981],[-77.46589,38.81986],[-77.46508,38.8203],[-77.46469,38.82052],[-77.46392,38.82098],[-77.46357,38.82118],[-77.46282,38.82165],[-77.46217,38.82207],[-77.46152,38.8225],[-77.46074,38.82305],[-77.45997,38.82362],[-77.45945,38.82401],[-77.45883,38.82451],[-77.45804,38.82516],[-77.45799,38.8252],[-77.45772,38.82544],[-77.45746,38.82567],[-77.45717,38.82591],[-77.45649,38.82655],[-77.45593,38.82709],[-77.45561,38.82741],[-77.45535,38.82766],[-77.45529,38.82774],[-77.45476,38.82829],[-77.45369,38.82949],[-77.45117,38.83231],[-77.45009,38.83355],[-77.4496,38.83407],[-77.4484,38.83541],[-77.44832,38.8355],[-77.44707,38.83688],[-77.44657,38.83746],[-77.44498,38.83924],[-77.44496,38.83926],[-77.44448,38.83977],[-77.44393,38.84037],[-77.44312,38.84115],[-77.44252,38.84168],[-77.44205,38.84208],[-77.44156,38.84247],[-77.44121,38.84273],[-77.44084,38.84299],[-77.44035,38.8433],[-77.43936,38.8439],[-77.43881,38.84419],[-77.43841,38.84439],[-77.43815,38.84451],[-77.43759,38.84477],[-77.43695,38.84504],[-77.43613,38.84536],[-77.43539,38.84561],[-77.43484,38.84578],[-77.43446,38.84589],[-77.43407,38.84599],[-77.43359,38.8461],[-77.4326,38.84631],[-77.43198,38.84642],[-77.43189,38.84644],[-77.43166,38.84648],[-77.43013,38.84677],[-77.42864,38.84705],[-77.42767,38.8472],[-77.4269,38.84734],[-77.42661,38.84739],[-77.42395,38.84787],[-77.42318,38.84802],[-77.42258,38.84813],[-77.42173,38.84828],[-77.41978,38.84865],[-77.41803,38.84898],[-77.41653,38.84925],[-77.4152,38.84948],[-77.41415,38.84967],[-77.41369,38.84976],[-77.413,38.84989],[-77.41025,38.85039],[-77.40835,38.85073],[-77.406,38.85117],[-77.40455,38.85142],[-77.4031,38.85168],[-77.40243,38.8518],[-77.40151,38.85195],[-77.39988,38.85225],[-77.39953,38.85231],[-77.39879,38.85244],[-77.39845,38.85251],[-77.39809,38.85258],[-77.39709,38.85277],[-77.39683,38.85282],[-77.39635,38.85291],[-77.39443,38.85328],[-77.3938,38.85339],[-77.39306,38.85351],[-77.39283,38.85356],[-77.38886,38.85427],[-77.38813,38.85441],[-77.38446,38.85506],[-77.38378,38.85519],[-77.38334,38.85526],[-77.38219,38.85546],[-77.38134,38.85561],[-77.38007,38.85583],[-77.37979,38.85588],[-77.37892,38.85605],[-77.3788,38.85608],[-77.37828,38.85618],[-77.37814,38.8562],[-77.37761,38.8563],[-77.37631,38.85654],[-77.37544,38.85671],[-77.37471,38.85684],[-77.37175,38.85738],[-77.37131,38.85746],[-77.37029,38.85764],[-77.36979,38.85774],[-77.36937,38.85781],[-77.3651,38.85859],[-77.36447,38.85871],[-77.36395,38.8588],[-77.36383,38.85881],[-77.36369,38.85883],[-77.36306,38.85896],[-77.35875,38.85973],[-77.35804,38.85987],[-77.35711,38.86004],[-77.3552,38.86038],[-77.35387,38.86064],[-77.35356,38.8607],[-77.3534,38.86072],[-77.35322,38.86075],[-77.35231,38.8609],[-77.3513,38.8611],[-77.35087,38.86117],[-77.34989,38.86135],[-77.34898,38.86153],[-77.34853,38.86163],[-77.34602,38.86207],[-77.34561,38.86215],[-77.34473,38.86231],[-77.34385,38.86246],[-77.34265,38.86266],[-77.34257,38.86268],[-77.3415,38.86288],[-77.34009,38.86315],[-77.33821,38.8635],[-77.33769,38.86359],[-77.33677,38.86374],[-77.33654,38.86377],[-77.33646,38.86379],[-77.33633,38.86381],[-77.3348,38.86407],[-77.33369,38.86427],[-77.33299,38.86441],[-77.33258,38.86448],[-77.32922,38.86511],[-77.3264,38.86558],[-77.32482,38.86586],[-77.32217,38.86634],[-77.32201,38.86637],[-77.32168,38.86643],[-77.32058,38.86664],[-77.32,38.86675],[-77.31902,38.86693],[-77.31862,38.867],[-77.31795,38.86712],[-77.31752,38.8672],[-77.31591,38.86749],[-77.31461,38.86773],[-77.31223,38.86815],[-77.31021,38.8685],[-77.30984,38.86857],[-77.30924,38.86867],[-77.30916,38.86869],[-77.30884,38.86875],[-77.30877,38.86876],[-77.30859,38.8688],[-77.30749,38.86899],[-77.3054,38.86937],[-77.30388,38.86963],[-77.3029,38.86981],[-77.30129,38.8701],[-77.30068,38.8702],[-77.29933,38.87043],[-77.29835,38.8706],[-77.2975,38.87077],[-77.29724,38.87082],[-77.2968,38.8709],[-77.29631,38.871],[-77.2959,38.87109],[-77.29533,38.87121],[-77.29452,38.87141],[-77.29403,38.87155],[-77.29281,38.8719],[-77.29113,38.87239],[-77.29091,38.87246],[-77.29003,38.87272],[-77.28909,38.87299],[-77.28753,38.87345],[-77.28685,38.87365],[-77.28582,38.87396],[-77.28455,38.87432],[-77.28319,38.87471],[-77.28285,38.87481],[-77.28277,38.87484],[-77.28176,38.87514],[-77.28087,38.8754],[-77.28022,38.8756],[-77.27973,38.87574],[-77.27912,38.87592],[-77.2784,38.87613],[-77.2782,38.87619],[-77.27737,38.87643],[-77.27696,38.87654],[-77.27625,38.87671],[-77.27547,38.87687],[-77.27499,38.87696],[-77.27479,38.877],[-77.27464,38.87703],[-77.27353,38.87722],[-77.27141,38.87757],[-77.27133,38.87759],[-77.27064,38.8777],[-77.26961,38.87788],[-77.26858,38.87805],[-77.26796,38.87814],[-77.26746,38.87821],[-77.2674,38.87821],[-77.26695,38.87826],[-77.26689,38.87827],[-77.26633,38.87832],[-77.266,38.87835],[-77.2653,38.87839],[-77.2644,38.87845],[-77.2636,38.87849],[-77.26281,38.87854],[-77.26204,38.87858],[-77.26077,38.87866],[-77.2595,38.87873],[-77.25776,38.87883],[-77.25523,38.87897],[-77.25361,38.87907],[-77.25301,38.8791],[-77.25212,38.87915],[-77.25155,38.87919],[-77.24971,38.87929],[-77.24858,38.87935],[-77.24842,38.87936],[-77.24689,38.87946],[-77.24676,38.87946],[-77.2465,38.87948],[-77.24549,38.87954],[-77.2451,38.87956],[-77.24438,38.8796],[-77.24404,38.87962],[-77.24377,38.87963],[-77.24331,38.87966],[-77.24264,38.8797],[-77.24244,38.8797],[-77.24206,38.87972],[-77.24176,38.87974],[-77.24155,38.87976],[-77.24134,38.87977],[-77.24066,38.87983],[-77.24022,38.87988],[-77.23977,38.87993],[-77.23933,38.88],[-77.23871,38.8801],[-77.23856,38.88013],[-77.23798,38.88024],[-77.23757,38.88033],[-77.2371,38.88044],[-77.23659,38.88057],[-77.23599,38.88074],[-77.23442,38.88122],[-77.2331,38.88162],[-77.23268,38.88176],[-77.23187,38.882],[-77.23148,38.88212],[-77.22966,38.88267],[-77.22887,38.88291],[-77.22861,38.88299],[-77.22858,38.88301],[-77.22852,38.88302],[-77.22818,38.88312],[-77.22793,38.8832],[-77.22715,38.88343],[-77.22646,38.88363],[-77.22616,38.88374],[-77.2257,38.88388],[-77.22536,38.88398],[-77.2247,38.88419],[-77.22448,38.88426],[-77.22405,38.88439],[-77.22338,38.88461],[-77.22266,38.88484],[-77.22185,38.88512],[-77.22078,38.8855],[-77.21939,38.88607],[-77.2189,38.88629],[-77.21837,38.88654],[-77.2179,38.88676],[-77.21759,38.88691],[-77.21727,38.88708],[-77.21681,38.88731],[-77.21605,38.88767],[-77.21533,38.88807],[-77.21487,38.88833],[-77.21483,38.88834],[-77.21459,38.88848],[-77.21366,38.889],[-77.21304,38.88936],[-77.2127,38.88956],[-77.21104,38.89052],[-77.21045,38.89086],[-77.21032,38.89093],[-77.20953,38.89139],[-77.20774,38.89242],[-77.20714,38.89277],[-77.207,38.89285],[-77.20608,38.89338],[-77.20541,38.89374],[-77.20464,38.89417],[-77.20436,38.89434],[-77.20379,38.89466],[-77.20342,38.89487],[-77.20204,38.89568],[-77.20093,38.89632],[-77.20016,38.89673],[-77.19974,38.89698],[-77.19935,38.89721],[-77.19889,38.89749],[-77.19838,38.89779],[-77.19797,38.89803],[-77.19717,38.89849],[-77.19703,38.89856],[-77.19639,38.89889],[-77.19596,38.89909],[-77.19536,38.89934],[-77.19495,38.89949],[-77.19451,38.89965],[-77.19403,38.8998],[-77.19361,38.89992],[-77.19328,38.9],[-77.19297,38.90008],[-77.19259,38.90016],[-77.19211,38.90025],[-77.19175,38.90031],[-77.19152,38.90034],[-77.19134,38.90036],[-77.19113,38.90039],[-77.19085,38.90042],[-77.19052,38.90045],[-77.1901,38.90048],[-77.18959,38.9005],[-77.18921,38.90051],[-77.18899,38.90051],[-77.18896,38.90051],[-77.1889,38.90051],[-77.18871,38.90051],[-77.18833,38.90051],[-77.18793,38.90049],[-77.18791,38.90049],[-77.18771,38.90047],[-77.18748,38.90045],[-77.1871,38.90041],[-77.18662,38.90036],[-77.18602,38.90028],[-77.1858,38.90025],[-77.18526,38.90015],[-77.18468,38.90002],[-77.18419,38.89989],[-77.18399,38.89982],[-77.18377,38.89975],[-77.18367,38.89972],[-77.18333,38.89959],[-77.1829,38.89944],[-77.18258,38.89934],[-77.1816,38.89902],[-77.18043,38.89863],[-77.17826,38.89792],[-77.178,38.89783],[-77.17715,38.89753],[-77.1766,38.89735],[-77.17569,38.89703],[-77.1752,38.89687],[-77.17451,38.89664],[-77.17433,38.89657],[-77.17399,38.89645],[-77.17303,38.89612],[-77.17256,38.89593],[-77.17224,38.8958],[-77.17199,38.89568],[-77.17161,38.8955],[-77.17115,38.89524],[-77.17099,38.89515],[-77.17084,38.89506],[-77.17052,38.89485],[-77.17037,38.89474],[-77.17011,38.89455],[-77.1696,38.89414],[-77.16915,38.89377],[-77.168,38.8928],[-77.16779,38.89262],[-77.16663,38.89162],[-77.16597,38.89109],[-77.16456,38.88988],[-77.16393,38.88938],[-77.16263,38.88837],[-77.16215,38.88802],[-77.16183,38.88783],[-77.16158,38.88767],[-77.16141,38.88758],[-77.16089,38.88727],[-77.1605,38.8871],[-77.16038,38.88704],[-77.16018,38.88695],[-77.15965,38.88672],[-77.15923,38.88656],[-77.15816,38.8862],[-77.1576,38.88602],[-77.15662,38.88568],[-77.15598,38.88548],[-77.15418,38.88489],[-77.1532,38.88457],[-77.15157,38.88401],[-77.14624,38.88225],[-77.14599,38.88216],[-77.14308,38.88123],[-77.13922,38.87994],[-77.139,38.87987],[-77.13797,38.87953],[-77.13735,38.87939],[-77.13668,38.87927],[-77.13612,38.87922],[-77.1356,38.87919],[-77.13469,38.87916],[-77.12855,38.87931],[-77.12816,38.87933],[-77.12798,38.87935],[-77.1278,38.87938],[-77.12751,38.87942],[-77.12685,38.87956],[-77.12582,38.87986],[-77.1253,38.88004],[-77.12491,38.88021],[-77.12447,38.88043],[-77.12373,38.88084],[-77.1222,38.88167],[-77.12216,38.88169],[-77.12195,38.88183],[-77.12144,38.88216],[-77.1208,38.88267],[-77.12066,38.8828],[-77.12062,38.88283],[-77.12058,38.88287],[-77.12054,38.8829],[-77.12042,38.88302],[-77.12004,38.88347],[-77.11972,38.88389],[-77.11947,38.88423],[-77.11924,38.88456],[-77.11872,38.88527],[-77.11858,38.88545],[-77.11838,38.88572],[-77.11811,38.886],[-77.11786,38.88624],[-77.11776,38.88633],[-77.11758,38.88649],[-77.11692,38.88698],[-77.11624,38.8874],[-77.11585,38.88758],[-77.11543,38.88774],[-77.11516,38.88782],[-77.11466,38.88796],[-77.11436,38.88803],[-77.11423,38.88807],[-77.11405,38.88811],[-77.11326,38.88832],[-77.11238,38.88854],[-77.11132,38.88876],[-77.11117,38.88879],[-77.111,38.88883],[-77.11093,38.88885],[-77.10858,38.88945],[-77.10841,38.88949],[-77.10817,38.88955],[-77.10704,38.88983],[-77.10574,38.89015],[-77.10474,38.89039],[-77.10419,38.89052],[-77.1038,38.89063],[-77.10363,38.89068],[-77.10348,38.89071],[-77.10322,38.89082],[-77.10278,38.89101],[-77.10226,38.89131],[-77.10209,38.89144],[-77.10203,38.89149],[-77.10142,38.89202],[-77.10112,38.89238],[-77.10088,38.89275],[-77.10062,38.89347],[-77.10027,38.89417],[-77.09986,38.89489],[-77.09937,38.8955],[-77.09907,38.89579],[-77.09889,38.89594],[-77.09853,38.89622],[-77.0983,38.89638],[-77.09786,38.89665],[-77.09727,38.89693],[-77.09672,38.89713],[-77.09578,38.89737],[-77.09481,38.89758],[-77.09379,38.89774],[-77.09293,38.89785],[-77.09192,38.89797],[-77.08929,38.89825],[-77.08867,38.89829],[-77.088,38.89831],[-77.0874,38.89825],[-77.08665,38.89808],[-77.08583,38.89781],[-77.08499,38.8974],[-77.08447,38.89715],[-77.08411,38.897],[-77.08369,38.89685],[-77.08324,38.89675],[-77.08284,38.89669],[-77.08242,38.89667],[-77.08202,38.89669],[-77.08163,38.89675],[-77.08123,38.89682],[-77.08087,38.89693],[-77.07929,38.8976],[-77.07853,38.89792],[-77.07792,38.89814],[-77.07756,38.89826],[-77.07707,38.89839],[-77.07649,38.89851],[-77.07593,38.89861],[-77.07533,38.89868],[-77.07461,38.89872],[-77.07374,38.89869],[-77.0736,38.89869],[-77.07333,38.89867],[-77.07313,38.89866],[-77.07298,38.89865],[-77.07261,38.89862],[-77.07249,38.89862],[-77.07237,38.89861],[-77.07203,38.89859],[-77.07202,38.89859],[-77.07149,38.89856],[-77.07124,38.89854],[-77.07103,38.89852],[-77.07099,38.89851],[-77.07076,38.89848],[-77.07072,38.89898],[-77.07072,38.89906],[-77.07072,38.89917],[-77.07072,38.89927],[-77.07072,38.89945],[-77.07072,38.89968],[-77.07073,38.8998],[-77.07076,38.89989],[-77.07079,38.9],[-77.07082,38.90012],[-77.07083,38.90023],[-77.07077,38.90048],[-77.06935,38.90346],[-77.06916,38.90387],[-77.06904,38.90393],[-77.06899,38.90394],[-77.06888,38.90395],[-77.06872,38.90395],[-77.06858,38.90394],[-77.06794,38.90381],[-77.06712,38.90365],[-77.06629,38.90347],[-77.06595,38.90339],[-77.06541,38.9032],[-77.06478,38.90297],[-77.06445,38.90287],[-77.06393,38.90275],[-77.06329,38.90261],[-77.06285,38.90255],[-77.06252,38.90253],[-77.06202,38.90253],[-77.06062,38.90253],[-77.05933,38.90253],[-77.05877,38.90253],[-77.05865,38.90253],[-77.05843,38.9025],[-77.05813,38.90242],[-77.05802,38.90242],[-77.05789,38.90241],[-77.05726,38.90241],[-77.05682,38.90241],[-77.05628,38.90241],[-77.05608,38.90241],[-77.05591,38.90241],[-77.05564,38.90244],[-77.05541,38.90248],[-77.05532,38.90248],[-77.05481,38.90248],[-77.05347,38.90248],[-77.05291,38.90249],[-77.05152,38.90249],[-77.05131,38.90249],[-77.05103,38.90249],[-77.04978,38.90249],[-77.04919,38.90249],[-77.04892,38.90248],[-77.04855,38.90248],[-77.04707,38.90249],[-77.04665,38.90253],[-77.04647,38.90253],[-77.04629,38.90253],[-77.04612,38.90253],[-77.04582,38.90253],[-77.04528,38.90253],[-77.04507,38.90253],[-77.0449,38.90253],[-77.04442,38.90253],[-77.0438,38.90252],[-77.04353,38.90252],[-77.04346,38.90252],[-77.04332,38.90252],[-77.04295,38.90252],[-77.04219,38.90252],[-77.04209,38.90252],[-77.04171,38.90252],[-77.04155,38.90252],[-77.04123,38.90252],[-77.04045,38.90252],[-77.03949,38.90252],[-77.03939,38.90252],[-77.03872,38.90252],[-77.03852,38.90252],[-77.03834,38.90241],[-77.03735,38.90241],[-77.03668,38.9024],[-77.03654,38.9024],[-77.03641,38.9024],[-77.03551,38.9024],[-77.03474,38.90241],[-77.03458,38.90252],[-77.03458,38.90264],[-77.03458,38.9027],[-77.03458,38.90374],[-77.03457,38.90469],[-77.03457,38.90565],[-77.03456,38.90613],[-77.03457,38.90656],[-77.03457,38.9067],[-77.03457,38.90724],[-77.03456,38.90755],[-77.03456,38.90783],[-77.03456,38.90793],[-77.03441,38.90798],[-77.03391,38.90816],[-77.03212,38.90878],[-77.03204,38.90881],[-77.03195,38.90884],[-77.03187,38.90886],[-77.03179,38.90889],[-77.03163,38.90895],[-77.03059,38.90932],[-77.03049,38.90932],[-77.03044,38.90932],[-77.03038,38.90933],[-77.03032,38.90933],[-77.03026,38.90932],[-77.03019,38.90931],[-77.03016,38.90928],[-77.03006,38.90921],[-77.03001,38.90918],[-77.02999,38.90917],[-77.02994,38.90915],[-77.02987,38.90913],[-77.0298,38.90911],[-77.02971,38.9091],[-77.02963,38.90909],[-77.0296,38.90909],[-77.02954,38.90909],[-77.02949,38.9091],[-77.02944,38.90911],[-77.02939,38.90912],[-77.02932,38.90914],[-77.02925,38.90917],[-77.02921,38.90919],[-77.02916,38.90922],[-77.02913,38.90924],[-77.0291,38.90927],[-77.02906,38.9093],[-77.02903,38.90933],[-77.029,38.90937],[-77.02898,38.9094],[-77.02894,38.90947],[-77.02893,38.90951],[-77.02891,38.90958],[-77.02891,38.90961],[-77.0289,38.90971],[-77.02892,38.90975],[-77.02892,38.90977],[-77.02893,38.9098],[-77.02896,38.90985],[-77.02897,38.90987],[-77.02901,38.90992],[-77.02903,38.90996],[-77.02904,38.91],[-77.02917,38.9101],[-77.02937,38.91016],[-77.02943,38.91018],[-77.0295,38.91019],[-77.02957,38.9102],[-77.02962,38.9102],[-77.02963,38.9102],[-77.02969,38.9102],[-77.02976,38.91019],[-77.02981,38.91018],[-77.02986,38.91016],[-77.02991,38.91015],[-77.02995,38.91013],[-77.02998,38.91012],[-77.03003,38.91009],[-77.03007,38.91007]]},"summary":"I 40, I 81"}]} diff --git a/Tests/MapboxDirectionsTests/Fixtures/v4/v4_driving_dc_polyline.json b/Tests/MapboxDirectionsTests/Fixtures/v4/v4_driving_dc_polyline.json deleted file mode 100644 index 053cae470..000000000 --- a/Tests/MapboxDirectionsTests/Fixtures/v4/v4_driving_dc_polyline.json +++ /dev/null @@ -1 +0,0 @@ -{"origin":{"type":"Feature","geometry":{"type":"Point","coordinates":[-122.420018,37.78009]},"properties":{"name":"McAllister Street"}},"destination":{"type":"Feature","geometry":{"type":"Point","coordinates":[-77.030075,38.910067]},"properties":{"name":"Logan Circle Northwest"}},"waypoints":[],"routes":[{"distance":4524571,"duration":162310,"steps":[{"distance":418,"duration":52,"way_name":"McAllister Street","mode":"driving","driving_side":"right","direction":"E","heading":80,"maneuver":{"instruction":"Proceed to McAllister Street, then go right","type":"depart","location":{"type":"Point","coordinates":[-122.420018,37.78009]}}},{"distance":232,"duration":20,"way_name":"Hyde Street","mode":"driving","driving_side":"right","direction":"S","heading":171,"maneuver":{"instruction":"Turn right onto Hyde Street","type":"turn right","location":{"type":"Point","coordinates":[-122.415339,37.780726]}}},{"distance":971,"duration":96,"way_name":"8th Street","mode":"driving","driving_side":"right","direction":"SE","heading":135,"maneuver":{"instruction":"Go straight onto 8th Street, Hyde Street becomes 8th Street","type":"continue","location":{"type":"Point","coordinates":[-122.414763,37.77872]}}},{"distance":38,"duration":8,"way_name":"Bryant Street","mode":"driving","driving_side":"right","direction":"NE","heading":45,"maneuver":{"instruction":"Turn left onto Bryant Street","type":"turn left","location":{"type":"Point","coordinates":[-122.406967,37.77254]}}},{"distance":469,"duration":36,"way_name":"","mode":"driving","driving_side":"right","direction":"N","heading":3,"maneuver":{"instruction":"Take the ramp on the left","type":"turn left","location":{"type":"Point","coordinates":[-122.406665,37.77278]}}},{"distance":1525,"duration":73,"way_name":"James Lick Freeway (I 80)","mode":"driving","driving_side":"right","direction":"NE","heading":50,"maneuver":{"instruction":"Merge slightly left onto James Lick Freeway (I 80)","type":"continue","location":{"type":"Point","coordinates":[-122.404336,37.77638]}}},{"distance":10355,"duration":491,"way_name":"San Francisco – Oakland Bay Bridge (I 80)","mode":"driving","driving_side":"right","direction":"NE","heading":45,"maneuver":{"instruction":"Go straight onto San Francisco – Oakland Bay Bridge (I 80), James Lick Freeway (I 80) becomes San Francisco – Oakland Bay Bridge (I 80)","type":"continue","location":{"type":"Point","coordinates":[-122.391499,37.785488]}}},{"distance":905,"duration":40,"way_name":"I 80","mode":"driving","driving_side":"right","direction":"N","heading":14,"maneuver":{"instruction":"Keep left at the fork onto I 80","type":"bear left","location":{"type":"Point","coordinates":[-122.293906,37.828655]}}},{"distance":122,"duration":5,"way_name":"Nimitz Freeway (I 880)","mode":"driving","driving_side":"right","direction":"NW","heading":339,"maneuver":{"instruction":"Merge slightly right onto Nimitz Freeway (I 880)","type":"continue","location":{"type":"Point","coordinates":[-122.295882,37.836444]}}},{"distance":5233,"duration":209,"way_name":"Eastshore Freeway (I 80;I 580)","mode":"driving","driving_side":"right","direction":"N","heading":348,"maneuver":{"instruction":"Go straight onto Eastshore Freeway (I 80;I 580), Nimitz Freeway (I 880) becomes Eastshore Freeway (I 80;I 580)","type":"continue","location":{"type":"Point","coordinates":[-122.296273,37.83749]}}},{"distance":23353,"duration":891,"way_name":"Eastshore Freeway (I 80)","mode":"driving","driving_side":"right","direction":"N","heading":349,"maneuver":{"instruction":"Keep left at the fork onto Eastshore Freeway (I 80)","type":"bear left","location":{"type":"Point","coordinates":[-122.308377,37.883534]}}},{"distance":24877,"duration":961,"way_name":"Carquinez Bridge (I 80)","mode":"driving","driving_side":"right","direction":"NE","heading":48,"maneuver":{"instruction":"Go straight onto Carquinez Bridge (I 80), Eastshore Freeway (I 80) becomes Carquinez Bridge (I 80)","type":"continue","location":{"type":"Point","coordinates":[-122.227978,38.052197]}}},{"distance":43875,"duration":1669,"way_name":"I 80","mode":"driving","driving_side":"right","direction":"NE","heading":60,"maneuver":{"instruction":"Keep left at the fork onto I 80","type":"bear left","location":{"type":"Point","coordinates":[-122.10876,38.232639]}}},{"distance":13562,"duration":516,"way_name":"I 80","mode":"driving","driving_side":"right","direction":"NE","heading":36,"maneuver":{"instruction":"Keep left at the fork onto I 80","type":"bear left","location":{"type":"Point","coordinates":[-121.7761,38.514106]}}},{"distance":5907,"duration":225,"way_name":"Yolo Causeway (I 80)","mode":"driving","driving_side":"right","direction":"E","heading":77,"maneuver":{"instruction":"Go straight onto Yolo Causeway (I 80), I 80 becomes Yolo Causeway (I 80)","type":"continue","location":{"type":"Point","coordinates":[-121.638814,38.563325]}}},{"distance":20043,"duration":762,"way_name":"I 80","mode":"driving","driving_side":"right","direction":"E","heading":83,"maneuver":{"instruction":"Keep right at the fork onto I 80","type":"bear right","location":{"type":"Point","coordinates":[-121.572512,38.574855]}}},{"distance":281518,"duration":10477,"way_name":"I 80","mode":"driving","driving_side":"right","direction":"E","heading":79,"maneuver":{"instruction":"Keep left at the fork onto I 80","type":"bear left","location":{"type":"Point","coordinates":[-121.386011,38.644511]}}},{"distance":21993,"duration":736,"way_name":"I 80;US 95 Alternate","mode":"driving","driving_side":"right","direction":"NE","heading":32,"maneuver":{"instruction":"Go straight onto I 80;US 95 Alternate, I 80 becomes I 80;US 95 Alternate","type":"continue","location":{"type":"Point","coordinates":[-119.020752,39.79069]}}},{"distance":46675,"duration":1562,"way_name":"I 80;US 95 ALT","mode":"driving","driving_side":"right","direction":"NE","heading":51,"maneuver":{"instruction":"Go straight onto I 80;US 95 ALT, I 80;US 95 Alternate becomes I 80;US 95 ALT","type":"continue","location":{"type":"Point","coordinates":[-118.821198,39.912729]}}},{"distance":36,"duration":1,"way_name":"I-80;US-95","mode":"driving","driving_side":"right","direction":"NE","heading":69,"maneuver":{"instruction":"Go straight onto I-80;US-95, I 80;US 95 ALT becomes I-80;US-95","type":"continue","location":{"type":"Point","coordinates":[-118.448483,40.193251]}}},{"distance":286025,"duration":9575,"way_name":"I 80;US 95","mode":"driving","driving_side":"right","direction":"NE","heading":69,"maneuver":{"instruction":"Go straight onto I 80;US 95, I-80;US-95 becomes I 80;US 95","type":"continue","location":{"type":"Point","coordinates":[-118.448089,40.193369]}}},{"distance":106510,"duration":3613,"way_name":"Carlin Tunnel (I 80)","mode":"driving","driving_side":"right","direction":"SE","heading":126,"maneuver":{"instruction":"Go straight onto Carlin Tunnel (I 80), I 80;US 95 becomes Carlin Tunnel (I 80)","type":"continue","location":{"type":"Point","coordinates":[-116.016294,40.722806]}}},{"distance":471,"duration":16,"way_name":"I-80","mode":"driving","driving_side":"right","direction":"SE","heading":112,"maneuver":{"instruction":"Go straight onto I-80, Carlin Tunnel (I 80) becomes I-80","type":"continue","location":{"type":"Point","coordinates":[-114.957723,41.09939]}}},{"distance":12623,"duration":423,"way_name":"I 80;US 93 ALT","mode":"driving","driving_side":"right","direction":"E","heading":98,"maneuver":{"instruction":"Go straight onto I 80;US 93 ALT, I-80 becomes I 80;US 93 ALT","type":"continue","location":{"type":"Point","coordinates":[-114.952372,41.09815]}}},{"distance":223582,"duration":7219,"way_name":"I 80;US 93 Alternate","mode":"driving","driving_side":"right","direction":"E","heading":90,"maneuver":{"instruction":"Go straight onto I 80;US 93 Alternate, I 80;US 93 ALT becomes I 80;US 93 Alternate","type":"continue","location":{"type":"Point","coordinates":[-114.803538,41.112521]}}},{"distance":50602,"duration":1676,"way_name":"Lincoln Highway (I 80)","mode":"driving","driving_side":"right","direction":"E","heading":104,"maneuver":{"instruction":"Go straight onto Lincoln Highway (I 80), I 80;US 93 Alternate becomes Lincoln Highway (I 80)","type":"continue","location":{"type":"Point","coordinates":[-112.439875,40.683706]}}},{"distance":3326,"duration":118,"way_name":"I 15;I 80","mode":"driving","driving_side":"right","direction":"S","heading":172,"maneuver":{"instruction":"Follow a slight right onto I 15;I 80, Lincoln Highway (I 80) becomes I 15;I 80","type":"bear right","location":{"type":"Point","coordinates":[-111.911259,40.753389]}}},{"distance":8011,"duration":286,"way_name":"I 80","mode":"driving","driving_side":"right","direction":"S","heading":188,"maneuver":{"instruction":"Keep right at the fork onto I 80","type":"bear right","location":{"type":"Point","coordinates":[-111.904565,40.72516]}}},{"distance":278700,"duration":9392,"way_name":"I 80","mode":"driving","driving_side":"right","direction":"E","heading":92,"maneuver":{"instruction":"Keep left at the fork onto I 80","type":"bear left","location":{"type":"Point","coordinates":[-111.820528,40.712478]}}},{"distance":1143,"duration":38,"way_name":"","mode":"driving","driving_side":"right","direction":"NE","heading":28,"maneuver":{"instruction":"Take the ramp","type":"bear right","location":{"type":"Point","coordinates":[-109.244989,41.592662]}}},{"distance":915449,"duration":30717,"way_name":"I 80;US 30;US 191","mode":"driving","driving_side":"right","direction":"NE","heading":27,"maneuver":{"instruction":"Merge slightly left onto I 80;US 30;US 191","type":"continue","location":{"type":"Point","coordinates":[-109.239111,41.601761]}}},{"distance":204860,"duration":6891,"way_name":"I 80","mode":"driving","driving_side":"right","direction":"E","heading":90,"maneuver":{"instruction":"Keep right at the fork onto I 80","type":"bear right","location":{"type":"Point","coordinates":[-99.10717,40.670265]}}},{"distance":10025,"duration":435,"way_name":"Interstate 80 (I 80;US 77)","mode":"driving","driving_side":"right","direction":"NE","heading":37,"maneuver":{"instruction":"Go straight onto Interstate 80 (I 80;US 77), I 80 becomes Interstate 80 (I 80;US 77)","type":"continue","location":{"type":"Point","coordinates":[-96.73886,40.839694]}}},{"distance":82469,"duration":3391,"way_name":"I 80","mode":"driving","driving_side":"right","direction":"E","heading":90,"maneuver":{"instruction":"Keep left at the fork onto I 80","type":"bear left","location":{"type":"Point","coordinates":[-96.652066,40.896687]}}},{"distance":3580,"duration":155,"way_name":"I 29;I 80","mode":"driving","driving_side":"right","direction":"E","heading":92,"maneuver":{"instruction":"Go straight onto I 29;I 80, I 80 becomes I 29;I 80","type":"continue","location":{"type":"Point","coordinates":[-95.88615,41.232383]}}},{"distance":191228,"duration":6871,"way_name":"I 80","mode":"driving","driving_side":"right","direction":"SE","heading":129,"maneuver":{"instruction":"Keep left at the fork onto I 80","type":"bear left","location":{"type":"Point","coordinates":[-95.843738,41.230757]}}},{"distance":22286,"duration":958,"way_name":"I 235","mode":"driving","driving_side":"right","direction":"E","heading":90,"maneuver":{"instruction":"Go straight onto I 235, I 80 becomes I 235","type":"continue","location":{"type":"Point","coordinates":[-93.78615,41.592077]}}},{"distance":415,"duration":32,"way_name":"","mode":"driving","driving_side":"right","direction":"N","heading":5,"maneuver":{"instruction":"Take the ramp","type":"bear right","location":{"type":"Point","coordinates":[-93.575534,41.645919]}}},{"distance":531,"duration":41,"way_name":"","mode":"driving","driving_side":"right","direction":"NE","heading":36,"maneuver":{"instruction":"Keep right at the fork","type":"bear right","location":{"type":"Point","coordinates":[-93.574614,41.649552]}}},{"distance":287182,"duration":10430,"way_name":"I 80","mode":"driving","driving_side":"right","direction":"E","heading":71,"maneuver":{"instruction":"Merge slightly left onto I 80","type":"continue","location":{"type":"Point","coordinates":[-93.569992,41.652762]}}},{"distance":233343,"duration":9009,"way_name":"I 80","mode":"driving","driving_side":"right","direction":"S","heading":181,"maneuver":{"instruction":"Take the ramp","type":"bear right","location":{"type":"Point","coordinates":[-90.329859,41.439691]}}},{"distance":1021,"duration":44,"way_name":"I 80","mode":"driving","driving_side":"right","direction":"E","heading":99,"maneuver":{"instruction":"Keep left at the fork onto I 80","type":"bear left","location":{"type":"Point","coordinates":[-87.684527,41.582537]}}},{"distance":765,"duration":33,"way_name":"I 80","mode":"driving","driving_side":"right","direction":"E","heading":105,"maneuver":{"instruction":"Make a slight left onto I 80","type":"bear left","location":{"type":"Point","coordinates":[-87.673842,41.578205]}}},{"distance":8554,"duration":376,"way_name":"Tri-State Tollway (I 80;I 294)","mode":"driving","driving_side":"right","direction":"E","heading":90,"maneuver":{"instruction":"Go straight onto Tri-State Tollway (I 80;I 294), I 80 becomes Tri-State Tollway (I 80;I 294)","type":"continue","location":{"type":"Point","coordinates":[-87.664707,41.578001]}}},{"distance":3078,"duration":135,"way_name":"Kingery Expressway (I 80;I 94)","mode":"driving","driving_side":"right","direction":"E","heading":90,"maneuver":{"instruction":"Go straight onto Kingery Expressway (I 80;I 94), Tri-State Tollway (I 80;I 294) becomes Kingery Expressway (I 80;I 94)","type":"continue","location":{"type":"Point","coordinates":[-87.562252,41.577641]}}},{"distance":24549,"duration":1080,"way_name":"Borman Expressway (I 80;I 94;US 6)","mode":"driving","driving_side":"right","direction":"E","heading":107,"maneuver":{"instruction":"Go straight onto Borman Expressway (I 80;I 94;US 6), Kingery Expressway (I 80;I 94) becomes Borman Expressway (I 80;I 94;US 6)","type":"continue","location":{"type":"Point","coordinates":[-87.525357,41.576929]}}},{"distance":1406,"duration":108,"way_name":"I 80","mode":"driving","driving_side":"right","direction":"E","heading":72,"maneuver":{"instruction":"Take the ramp","type":"bear right","location":{"type":"Point","coordinates":[-87.235671,41.584378]}}},{"distance":438,"duration":34,"way_name":"I 80","mode":"driving","driving_side":"right","direction":"N","heading":352,"maneuver":{"instruction":"Keep right at the fork onto I 80","type":"bear right","location":{"type":"Point","coordinates":[-87.233563,41.590717]}}},{"distance":218288,"duration":9000,"way_name":"Indiana Toll Road (I 80;I 90)","mode":"driving","driving_side":"right","direction":"SE","heading":113,"maneuver":{"instruction":"Follow a slight right onto Indiana Toll Road (I 80;I 90), I 80 becomes Indiana Toll Road (I 80;I 90)","type":"bear right","location":{"type":"Point","coordinates":[-87.229682,41.591878]}}},{"distance":227653,"duration":8108,"way_name":"Ohio Turnpike (I 80;I 90)","mode":"driving","driving_side":"right","direction":"E","heading":79,"maneuver":{"instruction":"Go straight onto Ohio Turnpike (I 80;I 90), Indiana Toll Road (I 80;I 90) becomes Ohio Turnpike (I 80;I 90)","type":"continue","location":{"type":"Point","coordinates":[-84.805714,41.628414]}}},{"distance":14833,"duration":528,"way_name":"Ohio Turnpike (I 80)","mode":"driving","driving_side":"right","direction":"E","heading":70,"maneuver":{"instruction":"Keep left at the fork onto Ohio Turnpike (I 80)","type":"bear left","location":{"type":"Point","coordinates":[-82.180991,41.386038]}}},{"distance":144997,"duration":5198,"way_name":"Ohio Turnpike (I 80)","mode":"driving","driving_side":"right","direction":"E","heading":94,"maneuver":{"instruction":"Keep left at the fork onto Ohio Turnpike (I 80)","type":"bear left","location":{"type":"Point","coordinates":[-82.010738,41.379381]}}},{"distance":1853,"duration":74,"way_name":"Pennsylvania Turnpike (I 76)","mode":"driving","driving_side":"right","direction":"SE","heading":133,"maneuver":{"instruction":"Go straight onto Pennsylvania Turnpike (I 76), Ohio Turnpike (I 80) becomes Pennsylvania Turnpike (I 76)","type":"continue","location":{"type":"Point","coordinates":[-80.519681,40.911476]}}},{"distance":997,"duration":44,"way_name":"Pennsylvania Turnpike (I 76)","mode":"driving","driving_side":"right","direction":"E","heading":101,"maneuver":{"instruction":"Keep left at the fork onto Pennsylvania Turnpike (I 76)","type":"bear left","location":{"type":"Point","coordinates":[-80.499668,40.905097]}}},{"distance":46612,"duration":1658,"way_name":"Pennsylvania Turnpike (I 76)","mode":"driving","driving_side":"right","direction":"SE","heading":115,"maneuver":{"instruction":"Make a slight left onto Pennsylvania Turnpike (I 76)","type":"bear left","location":{"type":"Point","coordinates":[-80.48835,40.902497]}}},{"distance":147969,"duration":5277,"way_name":"Pennsylvania Turnpike (I 76)","mode":"driving","driving_side":"right","direction":"E","heading":103,"maneuver":{"instruction":"Keep right at the fork onto Pennsylvania Turnpike (I 76)","type":"bear right","location":{"type":"Point","coordinates":[-80.076682,40.655831]}}},{"distance":1855,"duration":82,"way_name":"Allegheny Mountain Tunnel (I 70;I 76)","mode":"driving","driving_side":"right","direction":"SE","heading":120,"maneuver":{"instruction":"Go straight onto Allegheny Mountain Tunnel (I 70;I 76), Pennsylvania Turnpike (I 76) becomes Allegheny Mountain Tunnel (I 70;I 76)","type":"continue","location":{"type":"Point","coordinates":[-78.867271,39.965611]}}},{"distance":60642,"duration":2233,"way_name":"Pennsylvania Turnpike (I 70;I 76)","mode":"driving","driving_side":"right","direction":"SE","heading":114,"maneuver":{"instruction":"Go straight onto Pennsylvania Turnpike (I 70;I 76), Allegheny Mountain Tunnel (I 70;I 76) becomes Pennsylvania Turnpike (I 70;I 76)","type":"continue","location":{"type":"Point","coordinates":[-78.848419,39.957285]}}},{"distance":761,"duration":41,"way_name":"I 70","mode":"driving","driving_side":"right","direction":"E","heading":84,"maneuver":{"instruction":"Take the ramp","type":"bear right","location":{"type":"Point","coordinates":[-78.261804,39.986508]}}},{"distance":576,"duration":25,"way_name":"I 70","mode":"driving","driving_side":"right","direction":"NE","heading":50,"maneuver":{"instruction":"Merge slightly right onto I 70","type":"continue","location":{"type":"Point","coordinates":[-78.255866,39.988425]}}},{"distance":1708,"duration":82,"way_name":"I 70","mode":"driving","driving_side":"right","direction":"E","heading":77,"maneuver":{"instruction":"Make a slight left onto I 70","type":"bear left","location":{"type":"Point","coordinates":[-78.249571,39.990138]}}},{"distance":571,"duration":40,"way_name":"I 70","mode":"driving","driving_side":"right","direction":"N","heading":6,"maneuver":{"instruction":"Keep left at the fork onto I 70","type":"bear left","location":{"type":"Point","coordinates":[-78.233371,39.99653]}}},{"distance":523,"duration":61,"way_name":"Lincoln Highway (US 30;I 70)","mode":"driving","driving_side":"right","direction":"W","heading":264,"maneuver":{"instruction":"Follow a slight right onto Lincoln Highway (US 30;I 70), I 70 becomes Lincoln Highway (US 30;I 70)","type":"bear right","location":{"type":"Point","coordinates":[-78.23275,39.999488]}}},{"distance":37502,"duration":1650,"way_name":"I 70","mode":"driving","driving_side":"right","direction":"S","heading":187,"maneuver":{"instruction":"Turn left onto I 70","type":"turn left","location":{"type":"Point","coordinates":[-78.238869,39.999467]}}},{"distance":1812,"duration":65,"way_name":"Dwight David Eisenhower Highway (I 70;US 522)","mode":"driving","driving_side":"right","direction":"SW","heading":207,"maneuver":{"instruction":"Go straight onto Dwight David Eisenhower Highway (I 70;US 522), I 70 becomes Dwight David Eisenhower Highway (I 70;US 522)","type":"continue","location":{"type":"Point","coordinates":[-78.184936,39.722424]}}},{"distance":82842,"duration":2957,"way_name":"Dwight D Eisenhower Highway (I 70;US 40)","mode":"driving","driving_side":"right","direction":"SE","heading":127,"maneuver":{"instruction":"Go straight onto Dwight D Eisenhower Highway (I 70;US 40), Dwight David Eisenhower Highway (I 70;US 522) becomes Dwight D Eisenhower Highway (I 70;US 40)","type":"continue","location":{"type":"Point","coordinates":[-78.184129,39.707742]}}},{"distance":804,"duration":36,"way_name":"I 70 Exit 53","mode":"driving","driving_side":"right","direction":"E","heading":96,"maneuver":{"instruction":"Take the ramp","type":"bear right","location":{"type":"Point","coordinates":[-77.428929,39.397932]}}},{"distance":36807,"duration":1509,"way_name":"Eisenhower Memorial Highway (I 270)","mode":"driving","driving_side":"right","direction":"SE","heading":145,"maneuver":{"instruction":"Go straight onto Eisenhower Memorial Highway (I 270), I 70 Exit 53 becomes Eisenhower Memorial Highway (I 270)","type":"continue","location":{"type":"Point","coordinates":[-77.421203,39.394571]}}},{"distance":9312,"duration":410,"way_name":"I 270","mode":"driving","driving_side":"right","direction":"SE","heading":146,"maneuver":{"instruction":"Keep left at the fork onto I 270","type":"bear left","location":{"type":"Point","coordinates":[-77.198084,39.120844]}}},{"distance":5794,"duration":255,"way_name":"I 270","mode":"driving","driving_side":"right","direction":"SE","heading":158,"maneuver":{"instruction":"Make a slight left onto I 270","type":"bear left","location":{"type":"Point","coordinates":[-77.150686,39.047289]}}},{"distance":2342,"duration":103,"way_name":"Capital Beltway (I 495)","mode":"driving","driving_side":"right","direction":"SE","heading":126,"maneuver":{"instruction":"Merge slightly right onto Capital Beltway (I 495)","type":"continue","location":{"type":"Point","coordinates":[-77.103196,39.017793]}}},{"distance":287,"duration":22,"way_name":"","mode":"driving","driving_side":"right","direction":"SE","heading":111,"maneuver":{"instruction":"Take the ramp","type":"bear right","location":{"type":"Point","coordinates":[-77.082475,39.005251]}}},{"distance":212,"duration":17,"way_name":"","mode":"driving","driving_side":"right","direction":"SE","heading":133,"maneuver":{"instruction":"Keep right at the fork","type":"bear right","location":{"type":"Point","coordinates":[-77.079319,39.004535]}}},{"distance":3942,"duration":277,"way_name":"Connecticut Avenue (MD 185)","mode":"driving","driving_side":"right","direction":"S","heading":173,"maneuver":{"instruction":"Merge slightly left onto Connecticut Avenue (MD 185)","type":"continue","location":{"type":"Point","coordinates":[-77.077499,39.003374]}}},{"distance":6856,"duration":459,"way_name":"Connecticut Avenue Northwest","mode":"driving","driving_side":"right","direction":"SW","heading":238,"maneuver":{"instruction":"Enter Chevy Chase Circle and take the fourth exit onto Connecticut Avenue Northwest","type":"enter roundabout","location":{"type":"Point","coordinates":[-77.07738,38.967996]}}},{"distance":255,"duration":26,"way_name":"","mode":"driving","driving_side":"right","direction":"S","heading":164,"maneuver":{"instruction":"Make a slight right","type":"bear right","location":{"type":"Point","coordinates":[-77.045155,38.912429]}}},{"distance":26,"duration":6,"way_name":"","mode":"driving","driving_side":"right","direction":"SE","heading":157,"maneuver":{"instruction":"Keep right at the fork","type":"bear right","location":{"type":"Point","coordinates":[-77.043993,38.910322]}}},{"distance":1332,"duration":116,"way_name":"P Street Northwest","mode":"driving","driving_side":"right","direction":"SW","heading":225,"maneuver":{"instruction":"Enter Dupont Circle Northwest and take the sixth exit onto P Street Northwest","type":"enter roundabout","location":{"type":"Point","coordinates":[-77.043975,38.9101]}}},{"distance":331,"duration":25,"way_name":"Logan Circle Northwest","mode":"driving","driving_side":"right","direction":"S","heading":172,"maneuver":{"instruction":"Enter Logan Circle Northwest and exit onto Logan Circle Northwest","type":"enter roundabout","location":{"type":"Point","coordinates":[-77.03033,38.909607]}}},{"distance":0,"duration":0,"way_name":"Logan Circle Northwest","mode":"driving","driving_side":"right","direction":"N","heading":0,"maneuver":{"instruction":"You have arrived at your destination, on the left","type":"arrive","location":{"type":"Point","coordinates":[-77.03007,38.910072]}}}],"geometry":"sf|`gAfr|nhF{@oK{@cQkCo_@{@gOg@wGg@cGcB_XkCo_@g@oK{@_NScB{@_Dg@kCScBsDkk@g@gJsD_g@bo@_I~H{@~H{@~f@cGbGkCf@g@jCkCvBkCnAcBjMcQbLgObe@co@fJwLzYw`@bVw[jMwQbLsNfYw`@bVw[zYw`@nZka@zToZnZka@jCsDv`@oi@fYo_@zJoP_NwQsS{@gO?{JS_Ig@sIoAgJcBsI_DsI_DgJoFsI{E_IoFkHcGkHcGwGwG_IsIgJ{JkHsIwGsIoFsI{O_XkHkMoFoKcG_NgaAw_CoFkMwGkMkHkMsIgOsI_NoKgOoKkMwLgOcQgT_`A{kAolAsyAwe@_l@_X_]sX_]we@kp@w`@cj@cG{JkRk\\oUcj@_S_g@{Y_b@s]sb@oxh@cxk@kRkMoZw[gdB{iBod@oi@sq@cy@k\\s]g^_b@s]sg@oU{^sNcV{JoPsIcQ_bE{tIwGsNwGgOcGsNoFgO{EsNgE_N{EgO{EoPsDsNsDsN_D{O_DwQsDkR_D_SkC{TwB{TwBgTcsC{a_@gEkk@sDoi@sD_q@_Dsg@kCwj@kM_pCkMsnDoFcwAcBk\\{Egr@cQwfBgT{xBk\\ofDoPkbBoFoi@oPwfB{Ewe@{Esl@sDsl@cLg}BwBwe@_Dkf@gEgc@_D{Yo_@cnCkHwj@oZczBgYcuBwLo}@gYsmBgEwVkHgT_IkR{JgOwLoP{OsN{OoKsIsD{c@gJkR_DcVcBwVS_{@RgTbBkW~CkWbGwVjH_XvL_{@b`@_eAfc@k\\vL_l@~RwVzJ{h@nKkf@fJw[~CgnBrScy@fJsl@vGs`A~MscBnUcQvBgOvBkp@zJstAjRstArScwArS_yAfT_b@~Hk|Dfr@woJvfBsiDrl@c[bG_nDzr@wjEn}@crAjWglC~k@{tDby@ku@fOg|@fOgiBvVwe@bG{r@rI_eAzOsInA_XfEgpAjRccAbLk\\~C{TnA{Y?w[g@{c@{E_XcGk\\gJk\\_N{c@{Tgh@wQwV_Iw[{E{TwBsl@wB{YbBka@nF{c@vL_q@~Rg}Bzr@wt@fTkf@~MsXfJwVfJoZjMgYrN{YnP_]~RgfAvo@s`A~k@w}CrmBcrAju@we@v[_g@zYgaAbj@k\\rNsS~HcQzEsb@~Hk\\~CgpAoAsyA?_uCjC{sBcBw`@f@w`@jC{h@~Hsg@~Mce@jR{c@vVkqBrjAwy@rg@sl@z^{YbQogAfr@ka@fY_SrNwxC~qBkz@bj@we@b[wj@f^{OrI{^rNgOfEoPjC{TvBoUR{OSc[gEwQkC{O{EgOoF{OwGwQ_IcV{J{sBwy@smBcy@{^oKc[{E{YkC{YSwV?{^rD{YbGs]bLgYnKgiBzr@cbDvmAku@fY{}Br{@{^nP_lEfsBs]zOwVjHgYvGkW~C_XvBoZR_Xg@kWwBgYoFcVcGwQ{EoUsIkR{J{O{JsSsNwQcQoPcQ{OgTkMkRwLgToK{TgJoU{aAs|BgEwGwQce@{JwVcL_XsNsX{J{O_NsS_IgJ_IsI_NwLkM{JsNgJ{OgJ_DoAsNkH_ScGccAkWsl@cLwnCco@cgD{w@ooBce@_mBgc@sN_DgOsDc~@gTwpB_g@{fAcV{EoA_mB_g@sSwG_XoK{Y_NkRoKgT_Nos@sb@oU{O_SsNcQ{OkWoUce@oi@we@_q@cQ_Xw`@os@gT{c@kWon@{Okf@{Jk\\_Ssv@{Oox@oKwy@gJg|@cGos@{E{m@sIwrAgYclD{r@ccKsDgc@{Eo_@wGsb@{J_g@gJka@kRsl@gTcj@oP_]kR_]wLkRsIkMgO_SwQkRsXsXgY_X{YsX_yA{pAwaLk_K{tDokD_{@gw@ovAsoAs]{YwzBkqBg|@{w@cbDwxCopD__DoKoK_tAcrAclDc}CkaJ{jIctJsxIw`@s]oK{JcLcLsNsNkMoPsIoKoK{O{JgOwB_Dgw@_oAgr@ogAckB_zC{`I_fM_oA_rB_rBkcDc[_g@wt@sjAgfA{dBkWc`@sS{TgT{OwVkM_NgEoKwB{O_D{Og@_]z@scQzr@g|@zEgOnA{Y~C{TnFcGz@{r@rXwe@nPk\\fOsDbBkH~CgOjHsSnKoPzJkRzJc`@nZsyA~iAguAzaAwcA~p@{OzJsSnK{^nP_NzEw[bL{TjH{TbGsSnFcVnFcVfEo_@nFce@zE_b@~Cce@nAw`@z@o_@?ka@cBcV{@sXcBgc@gEgYsDcVsD{Eg@kf@gJwo@wQsoAsb@sb@kMglC_{@c[_Ika@gJ{OkCoPwBs]sDgr@{Ecy@cGcL{@{JSkMg@cj@{@cpGwBo_@z@ocC{@kp@cBw|AS_]?cwA{@kzE?s|BjHshBbGsfCfJg^nA{Yz@g|@jCwy@~CwGRsq@nAkp@g@wV{@_XkCsb@gEco@kMgEoA_N_DwGwBkk@_Sce@sS{c@cV{w@_g@od@oUgYsNo`Bk_As]_SsDwB_S{JwQgJ_eA_l@seAgm@gc@oUoFkCoF_DksAku@sv@sb@kxA{w@_SwLsXgOw`@oU_]wQgO_Igh@c[gc@wVcy@od@oUkMwQ{J{c@oU_XkM_b@{Okp@kRkW{E{m@{JsXwBsl@_D_XSce@R{iBrI_jAwBox@sIgr@_Nw`@cLod@oPw`@wQs{@we@gJoF{rE{vCw|A{aAgyDcdC_XgTw`@sb@o_@gh@c`@{m@g{CsoF_b@gr@_tF_bJkf@s{@_g@ku@wQsXsDgEcV{Yka@_b@stAkiAwwA_jAsSkRsb@gc@_]_b@gYka@gYwe@_eAcuBc[_l@{^wj@kf@sl@{c@ce@{^w`@oUcVgTgY{Tw[sSg^k\\gr@sIkRwG_SgYkz@gJg^sIgc@k\\cpBkM{r@{Oct@oUwy@kRkf@{T{h@sS_b@ka@kp@o_@kk@_oAsoAkp@cj@oi@_b@wnCg}Bon@cj@s`AkiAktC_iDolAcwAoyBohCsI{J{m@sv@_v@w~@kxAcfBc_CwsCsq@wy@ce@on@{dBgqCk_A{zAku@cmAocCg~DgdBsuC{uAoyBwGcLgYod@syA{}B{aAcaBolAgnBcdCsgEkxAsuCo_@gw@gYsl@{Twj@sDsI_Xsq@{h@guAoK{YsSgm@kk@s~Ao_@cmAgaAwsCcQwj@wQsg@gEgOcQ{h@kR{m@_Xox@{^_jAcy@g}BgrEcgNgm@wkBkMo_@syAslEg|@skC_tAc`EgfAkcD_jA{jD_Xcy@whA_iD{Y{|@k\\{fAkM_g@sXsyAgJ_g@oUwhAsDgOsN_g@ka@w~@wt@gfAcQ_SwLwLce@o_@g_GkzEcV_Sgh@_b@sSoPcvIc_H_yAgkAg~IciHco@sg@_l@od@g^{YcdC{nBs`Fg~DszC{bCo{AknAseA_{@kvB_cBgc@{^gJkHojBo{AolA_`A{r@cj@sq@cj@_v@on@co@kf@wQ_N_NkHwQsI{JgE_b@kM{O_DoZoFw[gE_X{@ce@g@oyBg@{JScjE_Dcj@g@gc@g@o}@S_oFwBos@g@{h@oAkf@wBce@kCcVwBkRcBovA_No`BsNkdAoKkHoA{OkCgYwG_IcB_b@kMg^_N{JoF{OsIw`@cV_b@c[{kAccAkvG{zFcQsN{c@oZkiAco@sb@oUwV_NwrAku@c~@kf@{h@{Yk}F{`Doi@oZ{lCsyAwQoK{w@sb@we@gYwQwLkH{E{c@{^wQcQc[_]_]{c@Sg@k\\kf@cV{^cVkf@sSwe@SoAkRgh@wG{TkHcV{Jw`@cQc~@{Os{@oPox@wBoKgYsyAwQcy@cQon@_Xo}@cLw`@kC{JcQgm@shB{nGkk@wuBgOoi@k\\gfAco@{xBka@_yAkz@owCc[gfAkMgc@sIc[{^knAgh@wfBcLs]gJ_XcLkWkM_XgO_Xc[{h@_]gc@k\\{^{OwQ{r@os@kHsIoPwQgc@ce@kbBwkBkRkWcQ_Xsl@sjAox@w|A_b@kz@wVwe@wrA_fC_N_XcGwLsXcj@_Xgh@cQcVcBwBoFgJkHkM{JoPgm@wy@wy@gkA{fAs~A_NkRwy@wmA{dBk`Cc~@ogAwo@wy@ct@{aAoK{Ogc@co@{c@gm@gEcG_Sw[kR_XsIkM_eAkxAcrAckBo{AkvBcrAckB{pAckBwG{JsrBkyCc`@oi@_]ce@{r@kdAcBkC_eAkxAwBsDoUw[o{AswB_eAwwA{O{T_]kf@{lCwqDg^sg@{m@g|@sDoF_v@ccA{hE{_G{fAk}A_q@c~@c`@sg@_IkMsNgT{r@{aA_X{^wfB_fCg^sg@{eDc~Eo{A_wBwrFs_Io_@oi@kR_XcVw[orCkaEcuBszC{m@o}@{aFggH{r@seAcy@_jAsNkRopD_jFcdC_nD{w@sjAco@g|@sq@{aAsXc`@o_@_l@k}AczBoUk\\wxCcjE{c@on@c[gc@s{Ek{GsoAkgBkvBowCs]we@wQkWwG{JwGgJo_@oi@{Tw[_]ce@wcAcwAkeCkmDw_CkcDwlDo}E_{@cmAod@on@waB{}BoKsNsl@_{@kiAs~A{fAw|AgOsSgYc`@_mB{lC_g@sq@{c@gm@waB{}BgxG_gJ{bCwgDoqA_hB{yDknFolAg_B{fAo{AoiEg_Gc~@gpAg^we@{uAklBc~@_oA{kA_cBoK_Nwy@chAwt@s{@{~D{hE_aHwxHkp@ct@{w@o}@{|@{aAguA{zAsgEwtEcdC{lCgh@kk@srB{}BosE{aFc`@g^wvDkfEk_AkdA_vEccFwt@{w@w`@sb@_v@c~@kWs]gTk\\wj@ccA{Tka@sSc`@oPo_@c`@k_A{O{c@s]chAgT_v@sIoZgOwt@sNct@_I_b@oKgm@_Ico@_Igw@{T{xBwL_q@cVogAoKka@_S{r@_Xku@_Xgr@sXsl@_]kp@s]kk@gc@on@kk@wt@{h@wo@we@_l@os@k_A{m@ku@sIcLk}AgnBg{Cc{DgkA_~A{c@ku@gaA_aCo_@sjAsXkdA{zAogKcaBgiL_bE_eZoKobAcQomCwBo_@gEgc@sDka@oK{r@wGs]cGw[kp@suCcGsXgJod@wGg^wvDgjX_~AkeMggCsn]cmA_rLc`@gtDs]wgDkRwkB{sBkmSo`B_{O{pAglMsdIsex@wGco@sXkmDkMkbBcGgr@kMwaBoZsxD{JkeCg@cQS{ORsSf@cVz@wVvB{r@f@{Y?_]S_S{@cQoAcQcBwQkC_SsD_SkCgO_DcLgEgOgEkMoFcQcGkMsS_b@_X{^w`@w`@seA_q@we@oZ_NgJw{Dg}BsfCkxAw[kRsxDg}Bgm@{^w_CovAsoA{r@kW{Oon@w`@gqRcaLwjEglCwwFgeDsrBcmA_NsIkRwL_SsNwQgOwQoPcQcQcQkR{OsSwQwVgYce@wVsb@oKkRoKoU{J{TgJcVccAsaCwe@kiA{@oA{kAcsCgE{Jo}@kqB{r@caBcBgE{@wBgT_g@wo@{zA_iDg`I_wBobFgYgr@sb@obAswBgfFgm@kxA_DwG{^_{@_pCsrGo{A_nD{dBkaEc`@k_A_]{w@{Ykz@wV{|@sSw~@{O_`AwLgaAsIccAcGwcAkH{kA_NkvBo_@{iGg@gJoZgfFoAcQoAsS_SgjDwB_l@cB_g@wBka@{@_b@g@ox@vGc_HvBc|AbQczQz@{h@R{h@S{r@SsSwBs`AoAka@g@{OoAkM{Egm@oA{OgOg_BsN_~AkWwsC{h@c|F{@wQwBk\\wBco@oAwo@?s{@nAs{@fE_`AjH_`AvQs~AnFg^~RobAvV_`AbL{^vVsq@vG{OnK{YfqCkjHrSgr@zOos@nKon@z@oFbGgc@bGgr@rD{r@vBos@?gsB?_b@S_bERgw@?gaA?gJ?_oASwL_Dco@gEka@kHc`@oKod@sNsb@cQc`@oKwQoKoP{aAo{AgzAo~B_NsSgTg^_DoFwG_N_NsXgTcj@_IgT{O{h@sNcj@wLkk@{J_l@kH_l@{Egm@{Ewo@gJcrA_NgnBgYopDwG{|@{YsiDsIwo@cL{m@s]_oAcQcj@wQka@wo@ccAcLsNcfBkqB_cBojBwQsSowCwgDwqDw`Ewt@wy@{eIs}IkeCwnCw`@sb@chAsoAkvB_aC_cGczG{Ys]{yDghEsgEgwEgqHcqIwe@cj@w`@gc@oaDopDcsCg`DgOwQwo@os@spC__DgkAoqAkmDs}DswB{bCwkB_wBobAgkA_jAknA{^_b@wbDcqD{fAknAczB_fCoiEg|EwBwBgcEkuEgxBocC_oAgzAgiBcuBod@cj@c`@{c@opDkaEsg@_l@gm@sq@c[g^{nBoyBgvC_dDckBotB_v@s{@s{@s`Asv@g|@kp@wt@cy@w~@cj@on@ogAcmAwVwV_XcVoZwV_v@cj@w[kRw[wQ_N_IcaGgjDc}CkbBgwE_kC_v@_b@czBsoAgc@wVwo@{^cwAcy@ct@_b@kp@ce@sX{OoKcGkM_Iw`@oUod@kWk\\kRsq@w`@sSsNsSwQsXgYsIoKsIoKsI_N_IsNcLwQsIoP{|@k}Asg@gaAkWce@_mB{oDo}@gdBon@_jAgc@wy@{JwQgr@{pAgm@_jAgc@cy@sSs]wt@stAwt@stA_q@soA{r@oqAco@cmAcQc[gOgYoPsXgTw[sSgYkRcVgfAstAgvC_sDg`Dg~Dg}B_uCgJkMsiD{hEkHsIcnMsePkRcVku@_`A{fAstAgiBg}BclDslE{kA{zAgdBswBg_BkqB_oAk}AgdB{xBsv@s`A{^ce@wiC_dD{c@wj@ovAkgBojBo~Bs`AcmAgc@wj@g_BkqBomCwgDw}C{~D{jDkkEoPoUcsCwlDsS_X{hEgpFgyDk_FotB{lC{nBggCsv@gaAo_@sg@chAcwA_v@{aAkbBgxBwlIksKwgDslEw|FspHs]gc@g^g^_]gYs]oUc[cQ{m@kWos@kRwe@kHk_AsIwaBgO_l@oF_{@_IwlDc[_{@kHoUkCwLcB_Dg@oF{@{OgEsX{J_I_DsNkHoPcLcQsNsN_NwLsN_SsXcLkRgJgToKgYcGwQoFkRwGw[{E{YwBgTcB{ToAkW?_DoF_fCcGcxCcGwnCwBw`@sD_b@_Dw[gE_]gE_]sI{h@wmAwfGolAo`GgJgc@_Ic[_I{YcL{^sN{c@gOo_@oP_b@k\\{r@{}BgrE_Xcj@c`@{w@kWwj@sNka@kM{^sIoZcBkHkC{JsIg^{O{|@wV_cBgJkk@wLkk@sNkf@_Soi@_]kp@gY_b@{c@{h@we@co@{Yod@_So_@wQka@wVsl@{Ow`@cQ_b@{Ts]gOcQkRkRsIkH_IcGoP{OgO{O_NsN_IoKwGoKkHgOgOoZ_]ox@kWwj@wQ_]gOoU{JoKkHgJckB{xB{c@gh@_SoUcVsXkR{Tw[{^{E{EgOsNoK{JwV{O_SoKoUcLsg@wL{OcBc`@_DwLf@_SRkk@fEwQf@oKSoPSwLoAsNwBwLwBcVgJ{T{JoP{JsN_NcLoKoKkMoZ{c@{h@ox@w[{c@kM_NcL{J{uA{aAgT{O_N{JwLwLkMwLc`@sb@kk@kp@sg@sl@wQgTgpA{zAka@{c@oPoPgm@ce@gc@gT_b@_XszCgzA{m@_Xk\\oKs{@_Xco@sNwVsDcQwB_kCg^gpA{OowCs]sl@kHgY_Dgr@sIsN_DkM_DgEoAsIkCsNoFoP_Ic[kR_SsN{h@k\\gh@k\\{r@ka@gh@oU_g@sS{YwL{Y_N_]sNon@_]wo@sl@_SsXwGsIw[{c@gm@_{@_jAcrAkeCsfCo}@o}@_X_Xsg@gc@_oAkdAc~@sv@c~@os@_b@g^oZwVgm@{r@oP_SgOgTk\\_g@sSs]wrAkeC{zAktC{c@ox@ohC{wEgfAsrB{fAswBwVka@cV{YsN{Ooi@c`@gm@_]oZcQgYoPgm@gc@g^w[wV_X{|@cy@_mBoeBobAgr@gpAgw@gnBgpAklBoqAwrAs{@_mBolA{sB{uAg^{Ys`Aku@whAkdAcdCk`CwiCocCsl@gh@kz@_g@{yDkgBgJgEcwAon@k_AgYo`B_g@s~Ace@co@gYco@{Tsv@we@_v@gh@gh@_]{c@c[co@we@wy@gh@_b@{YgaAco@gh@kWkf@sS{aAoK{c@z@gsBvGgc@oAce@sIc`@gJoUgJsS{JgO{JkRgOoUwVoPs]{JwQsNw[sNo_@gdBk_FgY{m@{Y{c@oU_XoP{OoP_NobAox@o}@sq@_g@{T{c@kMc}Cgm@{xBsb@os@{J{zAcQw[sD_X_DwaBkRsXoF{^kMg^oP{^oUw~@_l@gYoPsSgJ_XgJwo@{OoZgEc[wBc`@g@w`@z@w`@rDc`@vG_b@fJ{c@zJ_v@rNoUvBgTnAgm@g@oKoAcQcBwQsDsXkHo_@oPs]sNkf@cQox@oZc~@s]{pAsg@scBkk@kgBce@o_Eku@kyCkf@_zC_g@sq@gT_v@_b@{c@{YkxAolAon@ce@oZgOo_@gOolAoKo~BoFgTkC_b@{EcuBs{@g|@_b@o_@{Jo_@wQcQwGkRsI{rE{sBsv@w[k_Aka@syA{m@kpEwkBsv@_]_b@wVkWwQ_xD_}Ds{@os@_yAku@gfAkWkxAcLseAcGgpAkHc`@kCsrBgOgzA_S{|@{EwkB_S_I{@cLcBka@oK{Y_Ios@_Xsv@_]w}CkdA{vCcy@scBsb@giBkk@{c@sSo_@oUgc@c[{^oUs]kRw`@wLsyAcVgfAkM_IoAwGcB{TkHcQwGgOwGwVkM{Y{Ogw@ka@k\\{Ok\\oPce@wVs]wQw[{Oc`@oP_XgJ_XgJ_SoFoP{EkWcGg^_I_b@_I{h@cLcVcGoK_DoKsDcLcGoKsIsIsIkH_IsIcLwGwLwGsNcGwQgEgOgOwt@cLsg@{E_S{EgO{EoKkHkMsIkM_IgJsIkHwGoFkMsI_N_IoU_Nc[kRw`@cVw[cQcQ{J{OoKkH{EwGcGgJgJkHsIwGcLwG_N{EkMwGgTsD_SkCwQcBcVg@{TR{TjH_tAjHoqAbGkiArDsq@f@sSR{TSsSg@oP{@wQcBkR_DoUgEkWcGcV_IwVgJgToKsSsl@k_Awo@wcA{h@wy@_NsSsN_ScLwLwLoK{JkHsNgJsN_IwVsIkf@sN_b@kM_NgEgJoFwGgE_IcGkHwGsI_IcGkHgJkM_IkMwGkMkHoP{E_NgEwQ_DgOcBwLwBwQoAkRSwL?cLRgT~CklBS_]cBoZwB_XcGk\\oF{TwG_XgJsXkk@cwAwQ_g@cy@w_CkW{r@s]_`AsXkp@sSkp@w`@{fAsb@ogA{m@wfBgm@oeBgc@wmAgTon@w[w~@caBw~EwfB_kHw`@_`As]ce@gc@ka@ka@wQsb@sNwe@sIku@vBwcAjH_g@jHkk@nFgw@SoPS{h@gJc[wLon@w[sl@gc@s{@_oAwG_NcGsNcGkRsNoi@wL_l@wj@c`E_Ns{@w~@k`H_Nkp@sIc[cGwQwG{OwQo_@cQ{Yw`@gh@{Y{^_hB_|Bs{@chAco@wy@sjAkxAgzA_rBwo@ox@kRkRc`@s]c~@{h@co@g^oUwVsXgYcQwVgJoPw[on@we@{kAgfA_pCgTo}@kMs~AgJwuB{@_b@wBkz@{@_b@Rwe@nA{YzEsg@rIsg@zO_q@~Wo{ArDsq@RgYg@_Xce@_|GsNwcAsb@soA_tAw_Cox@_yA_v@c~@w`@kWwwAkWsv@sN_q@w[w~@gm@{uA{aA{c@oU_IgEchAce@_X{OsX{Tc`@{h@{JwQwVku@wL_q@oKwrA{Y{yD{EgkA{@kdAzJshBjMojBjCgm@g@wy@_Dc`@gEg^{Jc`@kMka@_X_g@_Xs]gY{^od@wj@w`@sq@sg@wmA_g@wrAc[wy@sX_v@sl@_yA{Yco@{c@k_Asb@o}@_]os@syAw}Cka@_{@wfB{tDc[_g@{h@sl@gYgT_X{OgiBwhA{r@gm@we@wj@kgBw_C{uAkvB{h@we@co@{^{_B{aA_q@seAgc@wwAkf@sjAsl@gw@{h@sX_hB_`Akk@gr@gYgr@w~@k{Bct@{aAg^c[{T_XguAcwAg|@c`@oi@gOod@_Ikk@gEkWSkdAcB_b@wGw[cLsX{Oo_@w[cVc[c|A{`D_g@_hBcQ_g@kWwt@{c@co@cj@wj@waB_~Aw|A{zAgiB{dB_mBgnB_]sv@_g@o`Bwj@scBod@kp@wVc[kWcVka@_Xc~@gc@omC_jAo{Aon@_xDo`BcaBwo@oPwQc[w[oU{^wL_XwrAo{F_`AwvDwVccAc[g|@ct@s{@wLgJkM_IsNwGsNoF_NsDgOwBgOwB_Ng@{O?gOR_yArDkWbBgOR{O?gO{@sNoA{OkCsNkCsNgEsNgEkMcGsN_IkM_IkMsIcLoKoKoKoKwL{J_NsIkMgJ{O_I{OwGoPwGcQwV{r@_v@{xB_IoPshBccF{JgYkiA__Dsb@cmA_Xos@wqD{aK{lCwsHcGoPoFcQgEcQgEsSkCkRkCgToA{T{@kRSsSwBchAg@{TSgTg@gT{@sScB{TcB{TkCgT_DgT_DcQsDwQgEwQ{EoP_DcLsDcLkHsSkHcQkHoP_I{OgJ{OwwA{}BwG{JwGsIkHsI_I_I_IcG_IcGoKwGcLcG_{@w`@wLcGcLwGwLgJoK{J{JcLsIcL_I_N_I{OkH{OoFgOsDsNsDgOc~@{cEgE_SsDgTgE{TsIco@sNw~@od@o|Cw[ooB{J{m@gm@kaEc[ckBwQknAg^{bCgYkjCgO{kA{Joi@sNkk@oZccAkuE_hLs]{bCcGouDoA_l@_I{w@wV_eAw`@s{@keCkkEg|@gzAw`@guA_SsyAwBod@kCkpEgOkxAoKcj@gJgm@wo@gnB_l@stAccAkeCcuBseFccAohCcV{c@_ScVka@{^sg@wVka@sSk\\kRkW_SsX{YcQw[cL_X_IoUoKk\\kH_l@kCka@?ce@Skp@{@o~BcGoi@oK_b@oUwo@{c@{w@{uAo{Agc@{r@oUkf@oUwy@_I{aA{@ccAnF{w@rbEcaVzY{fAve@ccAvcAcwAzqCwnCfY_XnqAw|Af^sl@rI{OjH{OrS{h@jWox@fYgaAjHc[nUwy@~\\ox@bzBouDfTwj@fEsSnK{c@~f@wdCzh@ckBjtCshGnqAktCnn@ksAvwAsfCfdBcsCfO{YnP_b@fJc[jH{YnFgYvGka@jRolAbQkdA~Hwo@nA_Xz@_S?_X{@{^sDce@od@csCgEgc@wB{^g@c[nAk}A?cG?wt@?c`@oA_XwBwV_Igc@sIka@_Sce@_Sg^cV_Xw[gYoUkMw[kMo_@sI{iBwj@gOoFoPsIcVcQsSoPgYc[gOcVwQoZgOg^kMc`@_I_]kC{OsDcVkCcV_Dce@g@oZ?sXz@_b@bBg^vGkf@f|@guFvGce@jCg^zEgh@bBw`@nAwe@f@_b@z@orCRcaBRw`@bBoaDnAwzGRseAoAsg@kCce@sI_eAoUomCovAcwP{@szC~HsvE?oPR_v@Ro_@sD_v@_tAcnH_NstA{@_jAfT_dDbB{Tr{@oqK~HcdC?ct@_Dg|@oU{iBsIwt@we@odEcy@_uHcGoi@sb@gxBstAoqFscGozSsq@keCw[{fA{J{^sIw`@sDk\\oAc`@{@wj@~Cgr@rSwrAnn@ocCvVsjAvL{fAfEogAcBwy@{EgfAk\\g}Bwe@kcDw[czBgO_jAwQolAkMwt@sNkk@oU_l@sSkf@ox@ojBcVcj@{Tco@oPct@cGku@{@ct@zE{w@zJct@v`@c_C~Cod@vGce@nA{OzJcwAz@_lEo_@_lEgY_yAcaB_{E_v@{sBsaHwuQka@ox@g`DcjE{c@ct@kRw`@gTsq@_Ncj@_]kgBkRseAwcAchFwwA_zH_N{r@_I_l@oF_l@{E{w@wBwt@Sku@bBox@fEsaCvGopDvB{|@~Coi@jHkf@~H_b@~Mwe@b`@crAvL_q@nFoi@z@_q@wBsq@kHwt@s]wuB_D_b@oAka@Rc`@nA_]zEc`@bGg^nKka@fOg^j\\{h@z`DcyEzw@on@~a@cVns@oPjsA{^buBw~@n_E_kCvV{T~M{JbVkW~MkWnFkMjHsNzEwL~H{YbQgpAnFgw@z@kiA{@c[_Ds]_IcVwG{T_]{r@o_@co@k_AsoAwBkC_Xc[{Yco@sSku@kHco@_D{m@z@_g@vBs]nFc`@bG{YrN_l@vVsoA~Hod@j\\kxA~`Cg|J~MsoAoAskC{JknAgkA_qEgYckBoFcdC{Y{zA_jAkrDgOsl@wQ{aAgEgm@cBs{@rDczBjMg|EbG_mBrDwrAfJ{pA~\\wnC~R_`AfTsq@v[wt@nd@{r@b~@crAnPwVfT_]zYsq@nUc~@~Hgc@fm@woEvLksAzTwxCb[ksF~H{aAbGgaAjRg{CjWgmErD_v@nA{fARomCf@{dBRotBf@syARsg@RshBz@{sBSwmAoA_q@oFwt@cG_g@sIkk@c[gxBsSguAcL_q@gO_q@_Xkz@_]cy@gY{h@sX_b@_SwVkMsNoPoPsXgYka@ka@c`@sb@wVoZwVoZoUc[sb@kp@sXkf@s]on@os@wwA{`D{}GwL_X{O{^kH_SkCkHkHcV_IsXgEgO{O{r@kHod@_Igr@kHsq@_XggC_N{kAkHwe@sIwe@cLce@cQcj@kMk\\sg@wcAg^wo@cxCo_EghE_tFcQoUgeNk`RooBocC_SkWg|@_oA{h@{w@kMcVgYkf@kR{c@_Xco@{h@ckBw~Ew}WoPk_A_b@kjC{Jk_AgJ_sD{@o_@sD{^gJ_g@sNsb@kM_]_SsXgm@on@gc@_Xgr@sS_NgEseAwVsNkCsN_DgbCco@{^kMo_@c[gh@wo@c`@{w@o_@soAoU{|@gYchAsXwhA{^kdAkWgh@k\\cj@o_@_l@cfB_zCcdCctE_aCctEcVku@gJcy@kWw~E_SolFkC{r@g@sq@zEg_B~CkWjCsX~Mk_AfT_`AvQgh@zOs]by@shBfw@k}Avy@{zAj\\o_@bQoK~gBg|@ja@_]z^od@be@wy@j_AoaDnFcQ~iAozDbVolAnPc}Crb@kfJvLcwArSs{@bmAorC~W{|@nPksAwBshBw`@sjF{JsoAsS_tAotB_kHwVox@g^cj@sb@_]stAct@oi@gm@{r@kvBwy@wvDsXwhAcLkWoPoUsl@_q@oi@gTobAgJgm@~H{m@bQk}Az|@sg@v[{m@zY_g@fEs`A_DksA{Oce@z@kf@~MshBrb@gh@zJs]jC{^g@sXwBsS{Ew[sIkMcG_N_IgJkHcLcLce@_g@gc@kf@sXgYsXgT{TkMoU{JkWwGw[sDc[oAc[bBkWrD_jArSgTrI{TvLgTbQwQrScQjWcQr]cG~M_NzYsNzToFbLsSrXg^zY_]vQw`@zJ_l@vBw{DrIk\\fE_eAve@gh@vQgh@fOooBnPcj@bGgr@~Wkk@b`@k`CvuB_yAbmAka@b`@gfA~sAkWjWkWrNk\\fOs]bG_XnA_XoAsSsDoFoAceEolA{uAka@{m@cQ_b@kW_]w[s]oi@cy@shBwo@gpA{r@{pA_~AkoCkvBgtDg|@k}Akz@kxAcj@s`AoPs]wLg^{Oco@oPku@s]{_BwQco@wLsXkMoZgOkWoPwVwQgTkW{TgToPkR{Jc[{OgTwGsN_DsNsD_SgEcj@oKgh@oK{uAsX{TkCoUkCcLg@cLScLS{J?{JR_]f@wdCjC_wBvBco@f@kW?oU{@wVcBgYsDcV{EcV{Ew[{JwpB{r@w[kMk\\gOc`@sSseAgm@kgGsiDcVsNoUoP{YgTgvCw_C_NwLsNsN_N{OoKoPcLgTwLsX_N{YoF{JkHwL_D{E_IoK_IgJgEgEgJkH{JkHoKcGcL{EwL{EwL_D{}Boi@cmAc[ogFgkAce@{JgYgEc[_Dkf@sD_]{@_SSk\\?wL?w`@nAgTz@_SvB{YrDcGRoKbBcBRgJbB_SrD_SzEwLjC{xBfm@{fAnZon@vQksAf^wBz@w_Cjp@gY~HgTnFc`@jHsS~Cgh@bGwt@~HgaAnK{zAzOwe@nF{qCnZgOz@gJf@cLRsg@S{E?ka@gEoUgEwBg@s]gJsNgEwQ_IcQsIwQoKwLsIoP_NgO_NSS_S{TgJoKcLwQkMsSsIgO{J{ToAkCcLsX_I{Tc[gw@kRce@{Y{w@kRwe@w`@kdAoF{OwLc`@oAgEkHkW{Jo_@sDgO{Jce@ScBoFgYgJwo@sDsX{Egc@{Eoi@{@oPkCka@kCkz@{@ksARsl@f@sXfE_eAnAkRrDoi@bB{OrIos@n`Bs~KvkBkoMvGcj@z@{Oz@wLf@cLz@gYRcQSka@g@oUg@gOwGcy@{@cLcGsl@gh@whFcGsl@_Dc[cVocCwBsS{@_NoA_XSgOg@gh@RsIRgOf@oPz@gTvBoUrDgYjHsb@fEoP~CsNfJ{^fO{h@bLw`@vLsb@jHsXvB_IbBkHvGk\\rDcQbGo_@~CkWrDk\\nAoPbBsXf@cLf@gOz@cVRoPSsl@g@_b@{@sXoAcVcBsXwBgTsDoZ_DcVoF_]{@gEgO_q@gEoPcGkRgc@wrAkH_S_Xcy@sv@oyB_Nw`@kHwQgJwV{T{h@_g@whAoFwL{Ow[{Og^wQsb@cG{OwL_]_D_NoFoU_DoPsD{YkCoUoAsS{@cQS_NSoF?c`@z@w`@f@kHf@wGz@{ObB_NrD{YbBwLz@{EfE_X~M_v@jMsv@fEcVjWcwArIoi@n_@swBbGw`@jHsg@zEod@fEka@vB_XvB{Yf@kHbBc[nA_]RkCvBwt@RcLf@_g@RgYS{Y{@o}@?{@SsI{@wVoAs]_Dco@S{@_D_b@_Ikz@sDce@sXkyCgJobAcBgT_No{AwLwrAcLgpAsg@guF{@cLoAcQ{@oKkCsXkCkWoF_l@sg@kiFcBoP_XsuCoU_aCcG{m@_Iwj@oF{^gEgY{EgT{EoU{EoUsNon@{c@_cBc`@{kAoPgc@kRwe@_S{c@gEgJce@seA{pAktCkdAc_Cw[gr@{Ysq@wLoZkRoi@gJ{YgJ_]_I_]kHc[kHw`@oFc`@{Eg^sDs]_Dw`@wB_XcB{^oA{^{@sb@g@{kAcBsdDgEkcDkMsgJoF{oDSsS{@kk@cBgfA{@sX{@sSgE_g@_DwVkCsSgEcV{EwVwGkWcGoU_IoUsIoUsIsSoKgTgTw`@ce@_{@{^_q@sIcQsI_S_IgTwGcVoF{Ts]wkBoPc~@cLsl@kCoPkC_N{EkRwGoUce@guAce@{uA{JgYcBoFcBwG{EsSgEgTsDgTw[wxCcQcaBSoAoA{JsDkW_Isb@SoAco@gqCkCwL{EgT{EkWgE_XgEc[oAgOkCgYgEgw@g@{T?{|@RcGnAohCRwe@f@{r@bB{cERgOR{c@?k\\f@wt@Swe@{@{h@_Dku@{EwcAoFo`BgEgaAoF{pA_Dcy@oAg^cBka@g@gOwBgr@cBsl@R{YRwVz@_Xf@cQnAsSnAcQzEkf@nFsb@rDsSjHs]bGsX~HgYjMka@fTcj@jMoZbV_l@bQkf@~HkWnF{TbGoZbBoKvB{OrDc[nF_q@vLkqBfEgfAz@oi@?os@Roi@SkdARovA?_yA?_l@RglC?gkA?on@?gY?k`Cf@os@Ron@g@czBScy@S_b@{@sXoA_SoAgJkHkp@wGon@sD{c@cBw[{@od@?od@?cwAnAsmB?seAR{zAf@{TnA{YjCg^rDs]jMon@~Mkf@~Rsl@nPkf@n_@gkArXox@nZc~@zYg|@v[obAfOce@rNwj@zJsb@vLco@vLos@fE_]rI_{@bG_{@~Cwj@~C{w@~McsCbGovAzJgiBrNwnCvLkjCzJgnBrSgcE~HoeBjC{h@nKoyBf@oPbLkgBbGox@jHkz@vLgfAbGkf@rNgaAvQ{fAzOs{@nPgw@nPgr@bLce@ja@_~Arb@{_Bv[gkArSco@jRgh@zJ{TjM{Yja@_v@zc@_v@~f@{r@z^oi@nZsb@nZs]b`@_]rb@{^n_@{^zTsXnUw[~W{c@zOw[nKwVfc@whAbVco@b`@ccAnUgm@nPwe@jM_b@rNkp@fJon@rI_q@f^keCfYwkBrIgh@vLgr@nUolA~RgfAzE{^bG_g@nF{m@~Cco@bBsg@f@ct@g@wj@{@sg@cBce@sDkk@gEsb@wGcj@_XsfCwQshBkHgaAcG_`AwGknAkHcrAsDct@{Eoi@cG{c@oKka@gOod@cQwe@_Nsb@{Jc`@wGo_@sDc[wBc[oAc[g@_]?{YRgr@Ssq@{@gc@kCg^sDsXsDsXoFsXcG_XoK_]kMw[_NgY{OgYoqAwpBsXgc@w[cj@od@os@_{@_tA{OkWojBgvC{fAkbBcmA_mB_b@os@oqAsrB_~A_fC_oA{nBs]cj@gOgYkMoUkMc[wLc`@sIoZ_Ic`@_Isb@kRolAsSwmAwQ_eAkHs]_IgYcLg^_Ns]kMsX_N_XsNsS{TgYkW_Xwe@we@kiAkiAo{A{zAstA_tAku@ku@{uAcwAczBswBk\\s]kWc[sNwQwVs]wQoZ{Tka@sXoi@{EoKcG_NkHkRcGgO{EsNcGcQgEsNgEgOgEgOwGwV{Owo@{Owo@kM_g@_S{w@kMsg@sD{OkC_N_DcQkCgOwBoPwB{OoAoPcBoPwGct@{OcfBkC{YkC{YgEo_@{E_b@cLox@_Iwj@wGka@wGka@wGc`@_Ika@{@sDwGw[sIg^wQsv@cQkp@_Nwe@oK{^_Sgm@wVct@gTgm@_Ng^gTgm@_b@sjA_b@gkAo_@_eAsl@waBcQce@sIoU_IcVkMs]_b@gkAw[g|@cQwe@kWsv@_wBkbGkxAc`E_N{^gTsq@{Ocj@cLw`@sI{^cGgYcGoZgJ{c@_Ice@oFg^cGka@{Ew`@oF{c@wG{c@kHwj@wGce@oFgYoFwVsIc[gJ{YgJ_X{J{TgJ{TwGsNkHwLcLsSogA{nBoKwQ{JkR_IgOgJgT{JcV{Jc[sIsXkHkWoF_XcG_X{EoZ{Eg^kC{YwB{YwBgY{@gY{@oZ?oZjCchFrD{{H~C{dGzEoaInAwxCnA_hB?gTf@_Xz@sl@z@{YnAgYvBsb@bBoZvB{c@zTcjEfOwxC~C{h@~HkbBjHovA~Cgh@jCsg@jCku@nAgh@z@gc@f@_l@Rwj@Rod@Scy@oA_jAoAsl@wB_q@wBkp@sDkp@gT{vCoZkaE_DoUgE_XcG{YcGcVwLg^cL{Y_Ss]kMgTcQ{TsX{Y_XcVgYcQsX_NgY{JsXwGgYgEsXcBc[g@gc@nA_tAjCsXf@sSSs]cBkWkC{YgE{YwGc[sIsq@wVwfBsl@s|Bsv@cmAsb@{ToK_SwLgT{OoU{TwQgTwQ_XcQoZ_Nw[sI{Tsl@giBsNs]_NgYoPc[gh@w~@_]gm@wQs]sI{TwL_]wLw`@gJc`@kHo_@oF_b@kCsXkCo_@oAoZg@c[S{Yf@sXz@gYnFwcAfOkjCrNgqCrNsuCvL{xBnF_yAvB_`ARchAwBw{DkCsjFoAs~AkCgrEg@ox@wBorCwBkdAcBs]{E_{@kH{w@cGsg@kHkk@kMccAgJct@gOcmA{Jos@sIkp@{Ec`@kCw[wB{Y_D_g@cB_b@{@ce@S_l@f@sb@f@_b@rIsuCnF_yAjCgh@vBgYjCs]zEwe@vG_g@jWwfB~Ww|AjH{c@jHcj@rIco@zE_g@bGkp@jCoi@bBco@z@wj@R{r@oAcj@cBc`@_IcwAkW_wB{h@o_EwG{h@ce@ouDkCkiAfEolA~k@suCbV_yA~Cwj@Swe@S{Og@cQ{@cQoAcQcB{OcB{OkCoP_D{OkCoPoF_XsIce@sq@kmDsSsq@{O{^oKgYkz@_{@we@w`@k`CgxB{c@ox@k\\g|@whAs`FkMobAkC_v@RkdA~HsmBvBkbBoAo{A{JwfBwQshB_]_hBkdAwyE_zCszMoeB__Icj@k`Cgc@{uAkz@czBceEcnHwpGwmKon@kxAsb@_tAs]wrAcGc[oPobAgY{lCos@kkT{EcwAcLofD{EsoAgEo{AoAwt@g@co@g@c~@f@{gCzEwkBvLoyBzh@orHrN{sB~MojBvGc~@bG{|@jHseArNklBbGkz@vLw|Af@_IrDco@~MkqBvB_]vBka@vB_l@nAkk@bBos@z@wo@Rwy@Skz@SwcASwwASo{ASwmAS_oAS_oAg@scB?wrA?sv@R_b@f@c`@f@ka@nAce@z@c`@bB{^nA{^jCsg@vBo_@~Cod@fEcj@~Cce@~RsuCzJstAnFkz@vGkz@bGg|@bG_{@zT_dDjHogA~Ckp@vB{r@f@gh@Rgc@g@g^So_@{@gY{@c[oAgYwBk\\kCc[{Eoi@sDoZ{Eo_@sIwj@cLgm@sIw`@{Oon@gJc[{Jk\\{Jc[oP_b@{Oo_@wVgh@{O{YsSg^g^wj@k\\kf@c`@_l@ce@os@gm@g|@_{@soAon@k_Asq@obA{m@w~@_eAk}Agr@wcA{^oi@s]gh@g^cj@_]sg@c[od@_aC_nDs{@{pAgc@kp@{^oi@g^oi@gr@ccAwy@knAcV{^kWg^_NsSwLcQwV{^cVo_@_Xc`@we@os@wy@oqAkk@s{@kk@ox@{h@gr@kaEsjF{uF{}GosEkbGojBw_CkkJsrL_uCs{Ec}C{kFwzGcaLo}@o{AggCkaEs`FopI__Dk_Fc{IkfOgaKolP_oAwaB_jA_oAo{Ac|A{uAsjAwbI_wGofI_wGcdC{xBksK{sLkdi@s}l@wy@s`AcwAkxAkdAc~@ohCgsB{c@o_@gjIwzGgbH_yFsdIsrG{pFkaEclNcjJo_^kxU_oF{jDwbDczB{zAg|@kHoFoyBkbBkoCs|Bw`EcvDsoAg|@_cQgaPk_FsvEknAkdAs|Bs|BksAcaBkxAk{BccAgiBoqAgqC_~F{hOo|Mwv]s]ccAonYs_v@s`A_aCkk@{dB{{CwxH{@cBw`Ocp`@soK{cYw}C{jIsfC_rGsl@{uAwj@soA{qCgaFwnC{|E_rB_xDcyEcvI_zCksF_kC{wEkyColF{qHo|M{gM{fUouNomW{eDkgGct@kiAgE_Is{@{_Bsq@_yAsq@_hBogA{`D_v@glCwlDkeM{sBswGoqF{sQc_Ho`V_hGceTsqJ{q\\{zAgaFkHkW{_BsyFcuL{qa@szCwmKcdCopI{nBswGce@w|Awe@ogA{m@gkAs`AwwAshB{iBgrEkmDoZoUszCg}BwkB_oAw[sXoAoAczGo}Eg_BgpActEkrD{gHk_FkxAgfA{aAcj@gfAw`@_fCsl@cfGk_AkiFc~@oKcBknAwQcmF_{@gpAsS_~Fw~@wt@wLcrA_SojLojBwtEku@on@_N{YkH{|@wVwrAce@c[kM_l@kWolAwj@sSoKc{IkfE{hEgsBkwNgbHwpLsyFwt@_]ka@_S_jAsl@soAku@ccAgr@kp@c`@ccAgw@ox@sq@k_A_{@cL{Jsb@{c@oqA{zA{aA_jAc[_b@sq@{|@ka@{m@kH{JcuGksKkgB{vCwcA_cBsv@guAon@olAsb@kz@seAs|BgaAc_Cc`@kdAcVsq@kk@_cB_]_eA{zAwtEc}CkkJ_cG_wQsb@soAksAgcEkrIcnWgh@s~A{sBwkGozDwpLwvIwxWkbBccFco@_hB_Xkp@gm@_tAo{A{{CgqCwwFkWgh@{hE_sIwkBgyDkcDkvGsdDsrG{^gw@{~D{`I{aAklBktCseFgJcQcfBg`Dka@os@oyBk|D_l@gaAknAczBw`@wo@_{@_tA_IoKkMkRsg@sq@wVsX{ToUsXk\\c[g^wcAobAkf@{c@sb@g^co@_g@{c@k\\gh@g^knAwy@wj@o_@oi@s]wiCgdBobFcgDkk@c`@ct@{c@owCovA{EwBcuBkiA_fCwmAgpAgm@wwAos@_XgOsNgJcLsIcBoAw`@c[oPgO{OoP{c@{h@cLoPwB_DsSk\\g^kp@gO{YoZsv@wGoP_l@_cBgT_l@wQka@gOc[_l@_`AcVk\\cQgTwLkM{@{@sIgJc[sXo_@{Yw[{TkqBcrA{OoK{^wVon@ka@w`@{TsSgOos@gh@gJoF_S_Non@ka@sq@od@guAo}@on@ka@gkAox@_IgEkp@{c@c[wVoKgJcBoAoFoFsXgYgOwQcG_IwBkCw[sb@{E_IoKwQgYoi@_S{c@oFkMoUon@gJoZgJo_@gEcV{J_g@g^{iBgOku@wVcmAs~AgeIgT{fAkCcLSwBoAoFod@_|B{iBwoJ{YstAkMsg@cQwo@_Skp@wj@scBw[_{@sl@kxA_]ku@gO{Ywy@o{AgY_g@{c@gr@ce@wo@_q@s{@gm@ct@ce@gh@{c@{c@syA{uA{h@kf@g_Bc|A{tNs_N_v@wt@wwK{fK_eAgaA_b@w`@cGcGg|@g|@sjK_{JoeBwaB_~Ao{A_hB_cB_jAkdAo{A_yAobA{aAceEc`EggC_aCgqCciCkgBwfBgEsD_pCggCsD_Dw~@{|@wQcQ{YwVs`Awt@wV{Os~A_`Acj@gYcfB_`Akz@_b@o_@{T{`N_kHstAku@wGsDg|E_kC{rJ{fFw[oP_l@c[os@c`@kk@w[ktC{zAsfC_tA{_Bs{@_yAwy@o`BccAgYkRkWwQwQsN{OwLos@{h@_]oU_|BkbB{gR__NcmK{`IcdCcfB{dBwmA{gC{nBk~HkxFs}DwsCkkE{{CgwEkhDsIwGspCwuB{aF{oD{c@gYw`@cVco@{^c`@_Sod@{Twe@gT{m@cVc[cL{kAc`@{OgEsb@cL{^_IgO_Dgw@kMkoCo_@gw@oK_yAgTwuBgYcbDce@swB{Y{Y{Ekz@wLo_@oFkvL_cB_~A{Tct@cLcG{@_qEon@{pAwQwfBkWos@gJsq@{Jw`JsoAwfB_Xk_AkM_~Fcy@szMckB_nNkqBg|Os|Bk~WssDsXgEknAwQ{_G_{@_~Fkz@ce@cGgdBcVsiNooB{yDoi@_eA{Oc~@kMgw@cL_eAoK{fAsIwkGsXsnIc`@{ESoKg@{qHkWkeWkiAsgr@wxCgxcAcoEc|P_v@caB_NstA_SksAsXcmAk\\oqA_b@s`Ac`@{zAct@kbB{|@gkPouI_~Ks~FczQ{rJc~E{gCwQgJchF_pC_cB{|@cy@gm@cy@_g@obAcy@gm@kf@sv@kz@ku@kz@wrAkbBox@{fAgT_]kf@sq@kMwQgzAczBc`@cj@{OoU{O{TgJkMon@{|@k\\_g@{Y{c@soAkgB_g@ku@{c@sl@cQkWciCouDsX{^w`@gm@kvBw}Ck\\ce@{fAs~Akk@_{@{ToZ{OoUc[{c@gm@{|@crA{nBsXw`@wVo_@sDoF_Sc[c[od@{OgTwnCs}Dkp@kdAsb@sv@gw@{zAoKcVkk@guAce@gkAg^kdAg@{@w|AwtEoUwo@_q@ooBoPkf@soAouDgO{c@sIkWg@{@kC_IsNod@gOka@wGgToi@w|A{w@k`CoUkp@_Xox@{pAouD__D{hJc[gaAwe@cfBwLkf@{T{aAsN{r@cQs`AsS{fA{Y{_B{Jwe@{TcmA{T{kAc[w|Ao_@kqBooBwrKstAg{HwfB_lJgEoU_hBkzJgc@kjC{}G_v^{sBcwKsuCgrOccFkwXo~BsaMwaBsvJsv@kfEgw@cjE_l@{vCkWkdAgTwo@kHsS_Nkf@o_@{aAc[wt@{h@_jA_b@sv@s{@{pAgc@sl@c~@gfA{w@ox@kz@{w@os@_g@chAgr@wdMwaGgToKwfGowCoUoKsmBccAksKwcFc}M_wG{cOwiHosOspHkqLgzFs_N_rGswL_~Fc{NocH_lOwnHotLc|FcmK{aF{^cQw`EckBkR{JsdDwaBokDcfBgoIg~D__NwuGoyL_~Fs`Ko}E{kKccFkqBk_AogAcj@s`Awj@c~@{h@wuBo{A_kMseKkiKgoI_uMcmKgoD{qC{{CsaCckB{zAsjAk_AklB{zA_kCkvBgm@kf@{c@_]cV_S{h@sb@stAchAgr@oi@o_@c[on@wj@cQcQ_X_X{OcQc[k\\cy@{aAkWk\\sIkM{J_NoKgOsIwLcQ{YwGgJcQsXoKwQgYgh@sI{O{JwQsIwQgTsb@gJsSoZkp@kMc[{h@_tAkRwj@oKc[wQgh@sb@oqAcLw[{Jc[{Ood@gm@shB_{@wdCku@k{Bc~@omCox@_aCoKk\\{J_X_oAcvDsSsl@sl@kgB_IgTs{@ohC_Xgw@wzGgeSgaF_}NwyTwip@o}@g{C_uCggM_lTwoaAwG{YsuCspM_b@ojBwLce@{Tgw@wLc`@_b@gpA_]c~@{_Bg~DolA{vCco@k}Ao`Bw`E{oDk|IgqC_|GgfAglCgOo_@sXwt@gJ_Xc`@oqAkHgY{EoP{Jkf@oU_oA_fCwmPcLos@_N{w@sD_ScLkk@cLwe@oPon@oPwj@wL{^cLc[gYwt@kCwGk\\os@cGcLcQk\\gEkHwQc[wGcLgc@_q@gJkMo_@kf@{OwQkMsN_SsSwQoPkHkHkCcBsb@{^_NoK_]cVod@gYkRoKcLwG{O_Icj@kWgOcGgqCwcAokDgpAwV{Jw_H_fC_]kMgmEg_BgYcLkWwLkW_NwQoKc[gTgJwGoUkRwBwBkRcQkR_S{JoKsIoKoUoZ{O{TgJsNgOkWod@_v@shBkcD_g@k_AkR_]co@chAw[wj@kMkWcV_g@{Oo_@sI{T_S{h@kH{ToKk\\wLsb@_N{h@{Jsb@{E{TkRccA_Icj@wGkf@oFsb@{@wG{TgsBgYo~B{OkxAk_Fw{b@siDwhZw`@ktCcV_tAo}@o_E_t_@o}pA{aA_iD_yF{qRs`AgeDwhAwvD_tKsv^{iGg~SkW{fAsNgpA{EkxAvB{zAzJ{kArI{h@fTw~@nPsg@nd@wcAjf@ct@fuAcwArdDgeDzJ{JrhBgiB~dAccArig@_ng@~iPgkPbcAwhAfaAknAzpbAc|{AjvBgeDb`@ct@fh@kiAja@whAb`@ksAf|@k|DfoX{{nA~lGs}Xr]ckB~Hct@vGwhAz@soAcB{|@oKo{AsNo}@g_B{lH{TovA{E_{@?{kAfJwmA~Hwj@bVs`AzYos@jzJcnRzm@guAv[{pAfOgkAjHwrAz@{kAgO{}Bkp@cbIsg@ckG{EcfBf@wmAfE_eAzEgw@fOstAfYgdBnPco@rwG{~Sz^shBbVczBjHklBg@_mBwBgr@{w@ocMsDolAf@sfCfJo`BfJg|@~\\ooBvVs`AbrKce^ve@k}AzlCo_Jn}EcdMzw@wkBjrDgmJf_Bk|DzJcVbV{m@z`DsiIjxd@sbkAv_k@srwAfr@o`BryA_uCbmAsmBvyJ{eN~oCgtDbQcVbBkCbVk\\zjD_{E~}s@k}bAb_\\_`d@z~D_tF~MkR~p@kdAbiCokDjlBglCfjIgdLnbFsaHffK{tNzaPcyTz`b@o|k@rdNwiRz~DcmFnFkHflCcqDvyYkja@fjXki_@zOoUjxn@we|@~fc@{hm@~u@s{@r{@g|@jz@wy@zw@sq@zm@sb@fpAwy@~mD_mBju@k\\bvXwzLfw@c`@rq@ka@zfA_{@~k@_l@reA{uAzpAcuBfOk\\nU{m@rq@kvBriN_ng@juEwrPriDgbMjk@kvBjRsv@nP{w@z^ckBj\\ooBni@kuEzOotBbLwuBjHwuBzEoyBzEcdCbGgbCjyCcurAnF_zCzh@ovU~CkvB?{xB_DccFgOgeD{^g~Dwt@guFc~@kuEkz@geDwzBgsG_cB_sD_cB{lCkoC_sDcvDwvDk_U{zPkpE{jDk|Do|CwaBsoA_wB_cB{zA_yAojBsrB_~A_rBgzAgxB{kAwuBcwAszCg|@srBgaAkoCcmAs}D{wE_`PcaBwrF_IwVkiAw{DgrJo~[sg@{xBku@_sDwQknAsNcmA_XowC_IwrAgEsoAwGwxCf@gyIbBkuYrDstd@zEkd_@wBkyCkHczBcV_}Ds]siDcj@s}Dsl@wgDowCsvOc}Movs@s~Poe~@{T{kAsSwmAsIco@od@gtDgEk\\olAgpKktCotV{Ow|AcBc[wBk\\cB_b@cBsq@g@gTg@_v@Rsg@RwQbBsq@vBsl@vB_]ziBsbYzE{m@rSszCzEkk@nUgnBrN{kArIsq@jRcrAzJgm@fJ{h@bGg^rD{OnFoUnAcGbVchAj\\ovAbVc~@rv@_fCve@guAvQwe@~a@{fA~nAomCrz\\wdp@v[wo@b[co@zYwo@fY_q@~f@gpAr{O{ba@rX_v@zTos@~Ros@zO{m@j\\kbBvLgw@vGod@~CsXjHsq@fEkf@nFox@nKgsBjoCoal@vGcmArD_g@fE_g@rDka@~CgYbGkk@vGsg@bQoqAzJgm@zJwj@bLkk@nFgY~Rs{@rIg^~mSo`y@zE_S~Hs]vQsv@rjA{zFj_AgrEjM_q@j\\s~AvLcj@~M{m@nK{h@nKwe@vGw[nUchA~Mon@fYcwAjMon@vVknAzJce@zJ_g@~M{m@jk@omCvL{m@~Mon@jHs]ja@kqBnKgm@jC_SrDk\\fE_g@z@gOjC{r@nAsg@R{c@RkMg@c[oAsl@oAg^{@kRoAcQwBoUwGwj@gEoZkHc`@kHs]{Jgc@wL_b@wLg^cGoP_Xwt@_Nc`@c[s`Ak\\ccAkCwG{Oce@{Tsl@oUkp@oU_q@cVgr@sSkk@sSgm@_S{m@w`@stA{Tk_A_D{OoKsl@cLku@cBsNsD{YcBoUkHco@g@cG{@gJoAsS{Es{@_DchA_Don@oAwVcBsXsD{^{Jwy@oKwt@_D{OcQc~@kCcL_DkMsD_N{@kCcLka@oKk\\soA_xD{m@ojBkHsScGsSsDgOgJka@gJ{h@{EgYwGco@wBwVcBw[{@w[SoKSsIS_I?cGScmAS_`AcBwt@wBsv@cGkk@oKcy@{}Gk`a@{}BgoN_XsyA{Jgm@_DoU{Es]wBkRoFkk@oFce@kC{YkCwo@{@gTSkCwB_q@oAo}@Rsb@f@ccAbBgnBf@{^Rkf@g@s]g@_X{@_X{@gTwGkz@wB_SwBoPsDsX{TknAwLsv@sb@kjCwy@seFsSwrAoUcrA_Igc@gJod@k\\wrAkM_b@oUgr@gT{h@{Ygr@_N{YoZco@wLoZ_]{w@_b@s`Ak\\ct@whAocCgc@w~@_jAgbCod@kdA{h@guAkf@_oA{fA_pCod@chA{sB_jFkf@_jAkf@knAsg@cmAsg@oqA_g@oqAsg@wrAoi@oqA_g@wmAwe@knAwQwj@_Swt@{E_S{EoUwGc`@kMwt@kWo{A{h@sdDoPolAsg@gjDoKos@sIgm@wLgr@cLon@wLcj@wLwe@_X_{@sN_b@sXkp@oPc`@wQo_@gTs]kWka@wGcL{OsXoK{O{c@cj@kRkRw`@o_@_I_Ik\\{YoF_Dw[oUsN{JgO{J{OgJo_@_SwVcLoi@cVwj@kWon@oZon@{Ywo@oZ_~Aku@kp@sb@{YgTce@g^_XgTsb@o_@gc@od@c`@we@ka@gm@g^cj@kRw[c[kk@wcA_|B{}GceOwpL{qWoUkk@cQsg@oUwt@{O{m@kCcL_Nwj@kHw`@sN{aAkC_SoF_l@oAgO{@kHcGwj@_Dsg@wBsv@{@gaAR_`Af@_g@zEsyKvB_}Dg@ovAgE_~AgJ{iB_NovAcGsg@wBcQcL_v@wGw`@{Joi@kH_]c[ovAoKod@cL{h@c`@ckB_rBonJcLco@sDkWcBsI_]c_CcLogAoKksAgEon@wGcrAsDolAg@_]kCklBScyEcBceT?k\\?_]oAchFwBsmBkHscBwLgdBoxEgnt@_Dg|@cBsq@S{m@Rg^Rg^rDolAz@{TrDgm@~Hwy@bLk_AjHod@rIod@b`@_mBbtE_{TbL{c@bGsNnP_g@b`@{fAzlCgdGjHoPfc@obAfnBsqEfh@gpA~Wsq@zJkWbVwy@fJg^bQ{w@nP{aArIco@jH{m@bG{w@nZchFvGkiAfY_eF~HstAv[guFf@cQRoPg@o_@oAgc@{@{OgEsb@_I_g@_DcQoFgTwLw`@{J_XkM_XwLkRwmFo|H{qCkaEsSg^g^os@kMgYcLoZkiA{eD{Tgm@smB{uF{^ccA{Yos@wLcVsSw`@_]{h@w[{c@oU_XsaCc_CgpAsjA_g@kf@ogAgaAk\\gYgc@sb@c`@s]o_@c[gTsNct@ce@{TwLkz@ka@cxRgoIccAkf@kk@w[whA_q@gh@w[kf@_]g|@_v@gaAg|@oqA_tAwt@_{@w[_b@obAguA{aAc|AkW{c@_]co@od@k_Awj@{pA{{CwiHgxGkdP{xBcrFc[gw@k\\o}@_Xsv@kRsl@{^gpAkRsv@sXgpA_oPsmy@gc@wfBsN{h@oZ{fAwBsIcLg^{aAcxCoqAkwDweJgjXo_@seAsXct@ox@klBk`Rcna@gc@s{@cwAw_Cg|@wrAcVw[kWw[w~@seAcVoUcQcQwt@ct@k\\gYc[kWwkBkxA_]gYsXkWgh@we@wo@_q@wQcVoFkHgJcLoU_X{r@kz@oKgO{m@{aAkWo_@sS_]wVsb@c[on@wj@_eAwVsg@ccAsmBc[{h@co@_oAcy@gzAsl@chAoi@_`Aoi@{|@o_@{h@wcAoqAwj@co@wGkHs]o_@c[c[sl@sl@csCkoC{^g^cVsXkCgEkHgJw[we@cLwQgO{Y_IkRsIsSsIwVcGwQcLw`@oK_g@{Jcj@cGc`@wB_S_eAwvIoKchAkHwe@{J_g@gEwQgJw[_IcVoKc[oU{h@sXoi@keCwqD{Tc[ccA{zAoPsXoZwj@oPw[oPg^kMc[gO{^oFoPwVox@_Nwe@sI{^_Ic`@sNwt@oFo_@{aAcuG_I{h@{^glC{Y_hBkRkdAgc@kgBo_@oqA{^kiAgm@{_B{Tkf@s]ct@wVce@sg@g|@gTg^cV{^ku@wcAg^sb@wy@g|@_v@c~@o}E{fFwnH_dIsN{Okg[cg]oPoPolAsjAsl@ka@ox@ce@kk@_X{r@kWkk@{Okp@sN_xDco@cy@wQgToFwo@wQcj@wQgYcLs]gOct@g^{r@c`@caBogAoKgJg}BgxBoyB{sBk\\{Yg|@wy@ox@gr@_XwVwbIohHsg@_l@gjDo|Cc~EwoEwuBgnBwhAgkAcLcLsb@we@sq@cy@ct@s`Act@ogAc`@wo@ka@co@kbQw~Yoi@c~@whAsmB{^ct@sIcQcj@olAgY_q@sb@kiA{m@ojBkbG_wQk`HwvSgcEsaMcVs{@_Nsl@{Jwj@{Jkk@oFk\\gJox@gJgfAkCka@_Dc~@{@ccA?k\\vLs|o@nA{vHRsb@z@ocCRwsC~Hg|^~C{~SS{oISkcI?gYSozIRkk@?oF{@gyS?oZSo{F?sXSoyB{@cfBoA_q@wBovAkC_l@sI{uAgJwhAkzJkvhA{sBwwUkk@gnGkCcVwQ{zAk\\_wBsIwe@{Joi@_Non@{T{|@wVk_A{^wrA_N{c@_Xwt@c`@_`A{Tkk@g^_{@g|@scBc[sg@ce@_v@wj@wy@cQkWka@{h@kz@{aAct@_v@ku@os@gaAwy@k\\_Ssq@_g@gc@{YgvWgwOsp\\geSgc@sXos@_g@gh@c`@wVgT_yAksA{O{OkCkCojBoyBgc@{m@gc@sq@wj^kkh@s`AkbBo_@{r@on@knAcj@ksAgxB_yF_wBsyFcGoPg}B{dGkghAg`zCkvGoyQsuMku^_I{T{xBojGgYwy@oP_l@oKsb@{J{c@cLco@_SsoAgE{YsDoZ_Dka@_Dwe@_Dkp@cBkp@g@ka@Swy@?sSbGwm_@?gTjCstPnAc`EvQgteA?sXoAscBkCo{A{EwmA{Eo}@_NckBgkUszeCstAc`OcV_nD{_BghYoKo`BoPscB{Ece@gYswB_iNo_aAwG_b@kRsyAsDs]wBwV_Dw[_NkqBkH{pAwBsl@wBwo@cBc~@{@kiASs{@Rwj@nAwy@f@c`@~CseAzEolArDkk@~H_jAzOkvBr~AgxQz|@oqKbL_~AvBc`@z@_XnPo_Ej{Bcgq@jCwj@bVwnHz@o_@bB_g@zTksFnFgm@rSotBv[kqBvQgaAjHc`@fJ_b@noBo_JjnAsyFzJod@jf@o~BjHod@nFgc@fTcdCjCcj@vBwt@nZokSSs`AcBsl@gEccAkMkgBw_Hom_AklGcb{@_eAcvN_oFomu@sIc|AsD{uAkCstAS_l@{O{pi@cB_lJ?gYkCclIkHcmZR{^bBksAz@{c@fEolAnA{Y~H_jAvG{r@vGon@fJwt@nK_v@fO{|@bLco@~Hw`@fOkp@~zc@cnlB~qB_sIjHc[jqB_xIbqXkrjAjWolAjMwo@nPgaAnP{fAnKg|@nKgaAnoB_qTbLgdBvB{c@vG_rBnAsq@nAs~AS{kAg@s~AoA{|@_g@ccZoAwy@?_SnAox@~Csq@zEkp@fEc[rIsg@rNsq@rDsNzJc[fTsl@nvAgeD~Mg^vLg^rIwVrIsSvQce@vQka@vy@kqBjHgTnFcQnFwV~CkRz@_IvB_NnAgOz@wLf@_NnAwt@?g^S{YoA_XkC{Y_D{YkRkdA{O_g@{Ow`@wQg^_NsSkMwQoUkWs~AwrAku@gm@g^c[_l@ce@sNsNwLgOoPoUcLkR_IoP_DwGoKsX{EsNkHkWwGkWsDoUgEoZkCgYoAcQg@cLS_SoAgh@S{J{@_ScBoUwBoUcGsb@kHg^{J_]oFoPgJcVkHsNgEsIwV_g@wQw`@{EwL_IkWcG{TsDsNgEkRsDkRgEoZw~@oaIsIgkAwBcj@oAkf@{@kW{@chA?sq@RkWf@{YrDgzArD{m@jCwe@jHox@jHon@rNseAzOox@vLcj@vLwe@nKka@rIgY~HsXrIwVzc@oqAf^{aAfTku@~HkWni@{}BzJgm@bGka@~CkWrIos@vGos@~HgfA~Cwj@vGgaAvBs]vBg^bBcVfEco@rDsg@zEkf@vB{OjH{h@bG{^bLcj@rIk\\jC{JfJ_]zOce@rXos@bLkWzOc[rNkWvVc`@rSc[zT_Xr{@seAb[g^z^we@jR{YzT{^bLgTvQo_@fOc`@bQce@fOod@bGgT~Hc[vG_XfJsg@~Hce@zYotB~k@s}DfEwVzEwVnP_q@rSgr@zOkf@vGgOvQ{c@bQsb@vQg^fOsXr]sl@jRgYr]_g@zc@cj@bGcGbQcQzYkWfYsXv{IwgIrv@wt@nvP_vOvsCglC~sAsoAb`@o_@nZc[jk@co@r]sb@b[ka@n_@{h@rSoZb[we@jvBgoDnrCo}EbQ{YnfDcrFz_B_pCff_@cwn@zrJsePnvFonJfTg^ze]_uk@nnT{w^ziV{la@nhR{n[zr@whArwG{iLfYwj@b[{r@jgBg~D~}_@ct|@~Woi@bVgc@nUc`@vVo_@zY{^n_@ce@fr@kp@jp@oi@bcFwbDnd@k\\rcBolArSgOrNkMn_@w`@fYw[n_@kf@~a@_q@~Rs]bV{h@j{Qo{d@bQwe@nPwe@rD_NfJg^R{@bB_IfJgh@vG{c@zE_b@rDce@vBce@f@{Tf@oi@{@wo@{JozD?on@?gOf@we@nA_b@nAsXvG{r@vG_g@jMos@vuBk_K~Mkk@vVk_AvVk_A~f@kbBnZw~@nPce@j\\{|@vLk\\vQkf@be@whAve@ogA~k@sjAv`@sv@fh@_`Aja@{r@zr@whAbj@cy@fw@ogAn}@ogArNkRfT_XjWgYfm@wo@~HsIjsA_tAzh@gh@rSsSrNkMvj@kk@vgDofDblDokD~uEctEfrE_qEzw@ox@~p@wo@~gBkgBvdCwdCz|@g|@b}Hc}HboEkpEfc@sb@ntLkqLftI_nIzT{TzdG{dGnfSs_S~}A_~Ab}C_zCfw@gw@z}Bw_C~qBwpBncCsaCju@ku@r`Aw~@vpBwpBvt@wt@~f@gh@zr@sq@zgC{gC~yCcxCnPcQfY_XznBgnBby@cy@bdCocCrl@_l@fm@{m@jjCciCzw@_v@nbA{aAv|A_~AzfAkdAzc@{c@jk@wj@jxAkxAvcAobAvdCwdCjz@cy@rbE_bEjk@wj@rl@kk@vV_XvcAobAjzEoxErhB{iBjk@gr@zw@obAroAcfBjp@s`AzqCk|Dju@kdAzxBg{CfY_b@njBkjCr`AcrAnZsb@v`@oi@~dA{zAvhFskHbsCg~DzuAgnBbQcVnaDsqEbt@knAjWce@rXsg@vLcVnZ_q@rSoi@v[_`A~k@wuBjRk_ArSkiAjMs{@zJwy@jMoqAzEco@zEwcArDknAbBchA?{m@cBwnCsD{mEcBskC?{EwB_aC{@cmASoAwB_uCS{TSwV?gc@?gTf@wj@bB_v@?_D~Cku@nF_`AzE_l@fEo_@rDk\\jWwfBjHo_@zJgc@z@oFnZovAnF_XjHs]bBwGj\\o{AvB{JnAwGvLkk@vVolAfO{r@bBkHz@{ErNon@~Rs`Afc@srBfJwe@rS_eAnKoi@vGka@nP{fA~CcVvGgm@jCwVjC{YjCg^rD_l@~C_l@nAc[RwGvB_v@nAos@?wBR{pAwB{_B{@w`@g@gJwBwj@S_IkCsb@_SwuBkMgfAcQgfA_N_q@oFgYkz@{jD{xGsuW{w@sgE{J_{@gTgiBsX_}DkRkoCcGwdCoAoeB?cpBzE{}BzEsrBbQwsCfYkyCfaAcjJ~nAc_M~z@whKjp@ogKjRo_Er]g~Ib`@coOrb@cj^be@o{x@fh@sy}@bQ_s]z@{w@fEswGbB_uCfJg~NbQsei@z@gfAzr@gi~@fJ_}]rb@gsj@vo@cvoAvfBcovCnKooQjRk`WbVwv]fkAkneBv[oqi@~\\gud@oAcaBrXkj\\jRwqb@v[gfd@r`AcurA?cQvV{{\\jRowWzc@{dzBrDkiPf^gs`@~HcwUvBkkJnA{tDR_`AbB{iB?kiFz@_wBz@_yFnAgvCS_v@jRkgo@nPkgo@fEo{KjCc|KnKgy]rD_nNfE_nN~C{dLbBwfLgEo~BgJk`CwGolAsIwmAkRklB{TckBgYckBk\\{iBs{@wtEg|@ccFs]cpBg^cpBsN_v@sb@kjC{w@wjE_{@{rEofDo~Q_|BsfMswBohMgsB_tK{w@kkE_v@oiEskC_}NkjCg~Nc~@c~EccAkgGg|J{_j@gOct@g|@seF_`AccFogA_rG_q@cvD{}BciMgYoeBo_@_rB{c@ocC_q@cvDon@{vCwe@_hBkqBkbGkdAk`CkdA_rBw_CcvDouDgfFoxOghTkjC{tDk\\ce@sqEshGcoEshGowM_wQgkFskHwhFskHwmAkqBgw@c|Aos@g_BovAkrDknAgtDka@_oAsfCc}H_rBckGcy@wdCgw@sfCsg@{zAwe@o{A{Tgw@cQox@sSoqA{TotB{@oPcB{^g@sNoAgYS_X?whA?c[rDkiArIcaBbLwcA~RsoAzc@ojBb`@sjAj}FsuMnwCgsG~kEs`KbaQo{_@znV{_j@~lBghEn`L{sVj|X_tn@roFwpLnvA__DfJkRvdCgkFvhA__Dr{@gjDzh@orCve@weEzYcuGrg@sjKbj@cuLvy@oeQbkBoy`@b`@ofI~dAknUneB{m^jRceEfbCw`h@~a@cvI~f@kxKvBgc@z^ceJrIsfCbGg}BfYg}GbGksAjMgaArl@szCbxCswLjrDsmQ~bQ_e}@joMk~p@v~@kkEfh@kvBbt@saCz}B_fHz}G{cT~`ComHbe@{zAzOkf@nUwo@r{@gvCngAgfFzc@owCf^w}CjM{uAvbD{{\\rtAwlNfYk`Cj\\_rBfh@koCrg@cuBjsKo``@jgGkkTbfBcpGnd@ojBfY{uAjp@{cEzm@_`FbVcdCjH_q@bkGc_k@~WkvBfc@{lCrrGgv\\zkK{ai@flCgcOjk@o_End@kaEfm@shGz^_yFr]_iIbL_fHoA_tK{JgxGsNc`EsS{zFo_@_jFka@g~Dkf@_gEgm@_gE_l@gtDgkAoeGgr@{{Ckk@s|BwhAw`Ek{BcdHwnCkeHovA{`DonEssIs`Fs_IcaG_pHo|CopDghE_bEsbE{{Cw~@os@kvBksAwmAku@oqAku@ggCkxA{uAox@we@c[we@sb@oZk\\oZc`@_]kk@oqA{lCcjE{yIwnCsjFgqC{_Gg@cB_vEkfJ_wBslEkWcj@sSwe@cLk\\{Tsv@wLw`@cj@_hBkf@gdBcLk\\wGkR{YwcAkrD_fM{nBooG{lC_|Gox@{nBsmB_{EkwDkwI_iDkbGgw@{kAwoEg_Gk\\sb@_xD_{Ekk@gr@_bOglR{nBcdCwe@wt@wt@sjAw~@crAwxCc{Dk`CszCogAguAgw@seAwQ_XkWkf@{Tgh@wQkk@oPon@sNct@gJ{r@{Eco@_Dkp@cB_v@cB_gORgvR_IsnhB?wGg@_{E?gn`@sDot[?od@R{sG?kcI?k}FSw}H?soA?_XR{bCRsv@f@gw@nAkp@vB{w@rDg|@rDsl@jCc`@fJcrArI{|@bGcj@fO{kArIwj@jRsjAbQ{aA~Rg|@bLwe@jWk_AfY{fAbe@wwAr`A__DrIsXjHw[nKoi@~Ho_@fJoi@rIon@bLk_ArI_eAbBoZvBwe@nAgc@bBwo@f@{uARweERwlNg@gxG?w_CwGcxCg@gm@wGofDcLcrFoFspC_l@cyT{Os~FkCo{Ag@_`AjCgfAjH_jA~HkdAjHgw@jM_yAvGct@nUkjC~C{^z@{JfEoi@jC{c@nAcj@Rkf@Rw[f@_hBf@w_CRsaCRku@Ss`Az@_SvB_XrDwQbGgT~HkR~CcGrX_]rXkRrScGzJcBzh@gE~qBcLzc@wLb[gJb`@sNja@gYv`@w`@vV_Sn_@sXve@cVfr@sX~gBon@n}@{JrXsDvV{Enx@_Xjf@c[~k@sg@zh@sq@r]{c@jk@sv@zh@os@~HcLn_@_b@rX{Tf^_Sja@{Ojf@oKv`@_D~k@{@zw@vBv`@nAfqCvL~mDrNvmAnAvhASjWg@n|MkMv`@?bmAvL~nAbLfYrDvhAzOnKnAnPz@fOSjRwBfOgEnP{EvQgJzJ_IzOcQrIoKrI{OjH{ObGwQfEoU~CsXvBw[R{YgEcpBcBcj@gJo~Bg@sg@?sNSsq@?ogA?_eASshBRs{@RswBSwt@f@cpGRc`@Ssg@Sw}HSgh@?cVg@{w@cBka@{@w[oAc`@{Eg|@kHs`A_Ict@cQshBcGwcA_Dgr@_D_oASgJSoi@gEcbDkCkrDwBotBS_l@RopDRsyASwkBRojB?{YvB_yAzE_oAfJ_jAzT{sBbQoqAfc@{{CjW_hBfOknA~RobAzYg|@jRce@n_@kdArXgfAbQk_AjWwwArIsg@rb@{}Bf|@o}EzEgYbGw[vG{h@~C_b@f@w`@g@w`@cBsX_D{T_D{OoFsSwLsXkWod@{c@w~@wGgO{JsX_DkMsDoZwBsX{@_b@vLsuHnAod@zEwo@fJ_q@nKgm@rXk_AnZcy@zT_v@vQsq@ja@cfBn_@kbBnKcj@jC{TnAoUnA{Y{@o_@_DgYsD{ToP_`AoKsl@_DgTkCwVoA{Yg@gT?gOSox@g@o_@kCo_@kCgYsIgc@w[{|@{h@gkAwo@crAs]od@oUkWkWsSoZkMw[sIksAs]w`@sS_NsN_g@g|@wGoU_l@_uCwLod@cQsb@{r@{zAcQgT{Tc[oZkk@{h@sv@{iBsfCcVku@oUolAgT_{@sX_l@k\\ka@gc@kf@od@gh@_Xoi@_Nsg@gJ_g@kMct@{J_g@wLsl@sb@kdA{Tgh@oPgYon@{|@_NoUgEcLkWseAcGce@{Egw@cQklBc[s~A{Ekk@cBwo@cB{r@_DkWkWgpAgEsNkM_SsNoPkRkRk\\oU_SwQsScVsb@{m@wj@gfA_Xce@{^c[gc@kWoi@sScj@{Jsg@_X_g@kf@{Y_b@oUct@gJ_q@gEw`@_D_`A{Tk}F{Jgm@oPgm@kMwVgfA_hBs]cy@{r@klBoaDw`JoZon@c`@od@whA{kAod@kp@{T_l@cQ{w@sD_q@g@_q@bBwe@rDc[rI_b@fOwe@rSw`@jsAcuB~W{m@jRct@zJ{w@rD{|@f@{r@kMcpBwGwcA?s{@~CgaAnKcy@fTs{@fc@kz@v~@wwAfc@gw@rXos@~u@_uCz^_eAfm@waBfTos@rNku@bLgr@jHcy@rD{w@nA_q@Swt@cBsq@cBwe@cGwhA{@gm@bBsv@jHku@r]kxAfYsl@jWgc@bcAwwAzYkp@jRcj@vGoZnFc[rIwt@vBogAcB_v@wGkk@sIod@gOon@{c@knAciC{qH_Xkz@oUk_AkMon@kMs{@_Ikz@{Egm@sI{uAsD{aAoFsv@wGku@_Nsv@kRwo@gm@g}Bc[ksAs]oyBsI_jAw~@s{Jg^kgBw[{|@s]cy@soAglCwe@knAsl@scBgw@o|C_Iwe@kMku@wQsoAgJ_eA_Dwy@cBct@?_`AnAos@~Ho}@~Hwo@zJoi@fO_v@vGgYjM_b@jxA{~D~Wsv@~Ro}@fOcy@fO_tAfEogAnA{zA{EwkBwGkiAsNcmAgTwcA{YknAsvEsvOw[{kAcQgr@{Os{@gOchA_NcfBoAscBz@w|AfE{fA~RojB~RoqAj\\crAja@wmAbe@kiAnUgc@~f@_{@bj@sq@rl@on@zuAgpAzxBwpBvjY{`X~nFobFbt@{|@nd@c~@rXwj@ryAkaEbLk\\bhAkyCv[cmAnP_{@nZckBnaD_}S~C_SnPsjArDgc@fEco@bBsl@f@we@g@gh@cBsb@wBsg@{E{c@{Egc@sIsg@{J{c@wLce@kMo_@wdCo~GsxDwhKs`FcgNcLk\\ggCwdH_dIk_Uct@{sBgc@chAwo@w|AwcAkvBs]wj@gpAgbC{h@od@oi@s]_q@cVkiAwG{zArN_eAoFsoAgYco@cQgaA{ToZwBsXf@gm@zOwcAvt@wj@rb@cj@bLsb@nA{r@oK_b@oP{h@gJgiBgEwgDoPgc@cQw[_X_XsSoP{T_SwQgr@g^{r@_D{m@~H{fAzm@w`@nP{T~Cw[nA{m@kHkk@kRo{Asg@gr@_IwhAsNg^kRoZw[sg@wcAkRsoAs]_mBce@c|A_v@{kA_q@{r@gfAwj@gw@gY_g@cV_]ka@c[cj@ct@{zA_q@whA_]s]ka@cV{YcGgTsDkk@gE{|@{Jo}@sq@w[wo@kM_XgOsX{Yc`@ce@{Y_g@gOct@oFod@kM{aA_q@_jAcy@c`@{^ovAcwA_cBwuBcvDo}EoUs]oPon@_mBs}Igc@ohCoZc_CcVcnC{YghEk_AowM_Dw~@f@kiAnFoqArIsyAbB{w@oAkz@{E_q@sD{c@gJwj@gOsl@oU_q@oUkf@gYod@sXsb@{OkRggCsrBoPwLcgD{sBoKwGk_FokDckBsoA_~Ag|@{nBc~@czBgw@on@gTobZ{nGku@sI_v@oAod@f@sg@nFwt@rNsb@bL_{@f^{r@nZ{r@jWon@nK{r@vB{w@kC_b@kHce@_NgnB{w@gfAs]c~@gO{aAkHs{@{@kiArDcwFfr@o}@~M_kHfaAsuHfaAcLbB_cBbVorCf^c~J~sAsxDfh@goDzc@woErg@keHvy@_tA~Rc~@bQwaBv`@wpBzm@k`C~_A_cB~p@gdBj_AgqCzzAwiCfiB_cBzpA__Dj~CsSjRoPnP{m@fh@sq@ve@wt@ve@gw@~\\kp@fTgpAjRku@nFcmA{@od@_Dwj@_IccFobAoiEwy@sq@{Jsl@oAsq@~Cwj@jRco@b[cpB~bBo}@fm@wy@ja@olAb`@cj@fOs]jH{h@bQo}@zh@sv@j_AsjAzbCcj@fkAguAvpB{m@bt@sjAfw@ogAfm@ouD~sAsq@fYgm@b[ka@b[ka@zc@_]bj@kyCvfGchAziBoi@~z@_mBrsDkk@r`Akk@ni@ce@vVco@vV{OnA_Nz@oPRsNSgO{@kWgEsSoF_S_IcQoKgOkMoK{J{OgT{Ygh@s{@ojBka@wy@ovAkyC{JcVswBsqEkRka@_`AsrB{uFcpLg|@k{Boi@_~A{m@cpB{m@{sBod@ovAoi@ovAsl@stAgm@_oAojBsiD{sBktC{h@os@sxDkaEku@_`AwfBocC{pAgxBkrDgsGwaBwdCkeHkuJox@oqA_X_v@cQs`Asb@_nDkWoqAoZg|@kf@{|@kk@on@w`@_Xsg@sXs{@gTkgBkk@{m@{^{m@kk@gr@_`Agh@wcA_b@whAckBs~FskCoiJ{hJ__]w`@ogAsb@s{@{h@wy@{h@gm@s`A{|@wGsDoyBwmA{m@kf@cy@obA_yA_wBs`AwkBkz@kqBcj@s~Aku@ktCguA{dGg^_cBoU_cBgc@c`E{YkjCcV_tAsb@k}A_q@waB{|@o`Bg|@kxA{r@ccAsg@on@kwIwvIs`AccAsv@ccAsb@gr@c{DgbH{}Bw{Dkk@guAgc@scBka@wpBgTcwA_q@cdHcQwhA_Ssv@s]o}@sjAczB_oAocCklBw{DgxBwcF{dBgcEcsCs|G{fAspC{w@ojBgkAkvB{`DkdFk\\sq@cVwt@gTcy@gh@{eDgYw|A_Xo}@w`@c~@okDswG{zAcdCwy@ogAkqBk{BgvCkcDgpA{_BkgB_pColAgiB_eA{kAwkBcaBk`Cs|B{nB{xBo`B_|B_cBkoCkz@stAwpBsfC_yA{_BgzAkbBksA{iBwy@ksAwmAgbCgh@oqA{|@{qCkR_v@sXchAg^w_Co_@orC_SwqDkHwqDoFcpBcV{dB_b@gzAoxE_fMseAw_Cwj@c~@kz@{aAcy@cy@kz@cj@snIonEscBs{@gxGokDkcDoeBwxC_~AojBc~@gw@oZ{kA_b@{OoFcmAo_@wo@cQcy@kWkz@w`@gr@g^co@sb@{lCotBo{AgkAchA{m@wo@cVk_A{Tg|@wLo}Ece@wuB_]ccA{TkmDgfA{fFo`BcoEovAsv@g^wj@ce@g^w[oPwVo_@oi@cG{J{Ysq@gr@cpBwwAs{Ek_A{}BwmAo`BogFchFw`@_b@_IgJkf@kf@{gCszCkiAwwAwhAguAcL_Nwj@kp@chAw|A__N_ePcaBw~@wvSofIcwA{w@{zAolAweEwvDcwA{pAklVgaU{eDsiDkWw[kiAscB_yAk~C_v@wiCgh@krDcQshBcB{m@wBk`CvBo{AfOw_Cb[_|BbrA{pFbLod@ve@gbCnU{`DjHg{CcB{eI_DoiOS{kAsNsjFkWcdCgYwsCos@_bEgm@{xBs~AosEceEwaLcQ{c@{}BwkG{uAo_EovAkwD_l@_yA_{@w_CgO_b@gm@giBwVccA_NchAgEsb@z@cmAbG{r@fJco@nFsX~Hc[nK{^~\\_q@~McVjWod@faAsrBjk@{nBbL{w@fJscBf@guASgTsN{~DwLggCcVk`Csl@g}Bsg@wmAgm@kdAoi@sl@{c@o_@o{AgfA{c@s]_l@od@wt@s`Ac[gr@cVcy@wL{|@_NklBcB_]sDgm@wBcj@wBk\\cBgaAwGkbBsD_v@{@_~Ag@sg@Soi@f@wt@f@seArDwaBvLotBzE_{@bL_pCbL{bCbj@kwI~dAkdKb|A{oNn}@snIzO{iBbBgTjH{pAnFwrAzEckBbB{dBf@ksA{@waBkHopDcL_|Bg^_qEcy@s~Fct@ouD{aAcqDwy@k`CgnG_gOoUcj@sg@{sBgYklBoA_SwBklBjCwcAzJwrAbG{^zO_`AbhF_pRzYwzBzJgxBwB{qC_Xg`Dw`@swBg^gpAsbE{iL{EwQc[scBwQw|AsIo{AcBwaBv[g|J_DwpBsI{fAw[shBg^_oAgToi@{Ow[o{AgbCwG{JcuBszCotVc`^cG_IodE_cGcj@whAoFwLsv@ojBwrKouXw[gfAseAovFkC{OklBo}Jg|EkoWgEgc@cGc~@g@sl@?kWRc[fJcwAzTsyArIc`@rIsb@zYcwAvVsjA~H{^vfB{eIjhIs~_@ziBkrIzYs`ArrBctEzm@{_Bj\\wfBzJ{dB{@caB{OwaBsS{fAsb@{kAkf@{fA{fA{bCkz@ocCsSknAsI{kA{EklBbB{gCnFsjKbQwue@bGsmL~Cc_HRchA?kk@nA{{CvBsiDRcQvBg{C?cQjRkdd@RkkE?cQrDseAr]s`x@jHkyRbB{jDoA{iB{E_hBcL_cBoKw~@c[{xBos@_dDkbBsfHs`AodEwzBosJ_cGktWsXolAct@wbDcsCg}L{h@w_Cc[kxAoFcVkf@kqBg@wBgYcrAcrA{zF_qE__SouIgk_@wuB_{Jco@slEkRgdBkMcaB_v@kgLwBk\\_]_`Fg@wGgEsl@kC_b@cBw[cBw[kHsjAsg@geIgE_v@g^c~Ewe@_aHs]wjEcGku@kf@wjEoi@weE_l@opD_l@g`D_q@wxC_eAoiEglCodJwj@g_BcxCokI_tF{rO{E_NgbH{vRsrBwwFgfAozDo_@ooB{^krD{JcbDSgbCcBgoISgwE_DolKkCwmAwGgpA{JgpAoKsjA{OgpAsS_tAsg@gbCsI_b@waB_zHoKgc@sqEsnSc[ojBoUo{A_pCc{SsSg_BsD{^sN{aA{w@gdGoFo_@{m@{wEwGgr@cLwmAgJgpAwoEstx@{To|CgYkcDolAsuM_X_kCsX_fCcGce@sg@geDs]_hBs]wwA{^cwAs{@gqCo_@gfA_b@seAsjFsaMkk@scBg^{kAg^gpAcVs`Aw`@ckB_]{iBwLcy@gE{YsbEsi]oFkf@oeBsbO_NwhAwQoqAw[{sBsXstA{^gdBkHoZon@czB_g@o`Bg|@_aCcpGkpOwfGo_OgbC{_GsNw`@kRkk@cL_b@sS{w@{Owt@cLkk@kHce@wLox@kMcmAkk@k_FsXg}BsXswBoPs`AkR{|@kM{h@sNsg@{Tgr@cV_q@cj@oqAon@whA_q@wcAct@c~@sl@on@co@kk@{c@k\\kf@{Ysb@{Yce@oUcsCgpAc|Awt@gr@c`@gh@{^oi@_b@_g@{c@od@sg@wj@_q@gh@wt@o_@{m@{Ykk@_Xkk@oZgr@wV{r@cVct@oPkp@g}B_lJ_yA{_GgEoP_~AsrGcQ_v@s]ovA{^wrAs]{kAo_@ogA_]_`Awj@{uAoyG{tNstAowCosJgtS_qJkrSg`IcwP{JgToiEcjJccA_wB_mBw`Ew~@{iBgpAkvBsq@wcAkdA_tAo_@ce@o_E{mEwqDo_E{sG_fHg|@gaAwGwGscGkvGcy@k_Ace@gm@c[w`@kgBc_C{qCwqDwo@wy@{bC{`Dod@{r@{c@ct@cj@_`Agc@cy@gYwj@oZ_q@o_@s{@_~Ac`EspHgbRo}@g}B{pA_dDkH_SgvCkoHgfA{lCgeSopg@khD_xIg{H_zRkmDc`Jk`Mgi[sg@_tAka@_oAsXkdA{Osq@gO_v@cLgr@{J{r@{Jg|@cLcrAoFwy@_D_q@kCgw@g@{w@g@os@Rs{@vBseAfEseAzEo}@nFco@rIc~@jMwhAjRwfBbe@c`EfYorCvLgzAbG_`AnF_`AzEknAfEg_BvBcfBRgzAcBkvB{JwwKwGopIsD{~DwBc_CwLowMSg^cLwlNkCcdCkRweTSgfASwaBf@{sGf@kcNR{r@f@obKf@_lOf@oxJf@{kK?kWR_|LfEg~q@z@scQjH_rhAjC_t_@?wV?_mB?kiAnA_zRf@ccF{@{gCcB{uAcBo}@k_Aofg@g@gYwuBo`hA_DcwAoFstA{Eco@_Iw~@wLw~@sNs`Ac`@kgBgOgm@cQwj@gT_q@wVkp@s]cy@{^ox@sb@ox@{Yon@klB_bEkWoi@wkBsbE{^gaAk\\{fAwQwt@kMwj@gO{w@wL{w@cLs`A{JobAkRggCcV__Dco@_dIsl@_kHsIku@kMc~@{O_{@sSs`AwwA{kF_eAclDgr@gbCgc@g_BsXsyAoKo}@kHct@cGg|@kCos@{@gr@f@sq@rDw|AzEwy@vGsq@zJ{w@~M{w@rSs{@vhAg~DzEkRzTwcAjR_eAvLwy@nKg|@zJwmAjp@w|KjH_oAjHstAzEsg@jHkk@jHcj@fJwj@~Mwj@~M{h@vQwj@bfBobFjR_l@zO{m@zJ_b@~Hsb@rIkk@nFc`@nKseAzTcmFz@_SzTwyEzc@s{JzE_v@bLogAfO_eAzOgaAjRw~@b[gkAf^seAz^{aAzT_g@fc@wy@jnAk`CnqAohCfpAk`CzY_l@r]cj@zOwQbQoPzTcQrl@s]jgBg|@f^gTb`@oZ~WsXbQoUbV_b@jWgr@fh@scBfEgJnFwQf^gkAns@wzBbo@o{AzT{h@bQw[nU{c@j{BgrEroAopDjdAktCjHoPjWwo@fc@{|@rqEcbIzzAglCjMkWfJcQnKoUnK{YbLw[rNgh@bGc[zJwo@~Hoi@vBsXjCw`@nAg^f@sXf@gc@g@_q@kC{|@{JccAwL_v@oPct@{^oqAsyAcyEsSwt@kM_g@sNsq@sIwe@{Jkk@kH_g@gEwe@wGkz@_Dkk@oA{w@g@wo@?ox@bBc~@jHc|Arv@{jNvB{pARwmA{@wmAwBg|@sDc~@_oAcoOoK_{@wL_v@{TgfAw[seAcVco@_rBonEw[{|@cLod@kM_l@{Jct@kHgw@sD_v@g@{m@Rsg@bB_{@rNc_CjR_fCbGkz@nFgpAR{kAwBg|@{Eon@cGon@cLgr@gOwo@keCwqIwjOo_h@{EgOgfAsxDka@{dBgfA{fFkxA_wGgYsoAoZknAce@_~A{h@_~AsxD{dLwpBgdG_tA_bEobAg{CobAkyCseAk~C{aAowCs}IsdX_q@srBw[knA_oFkyR{jDgqMglC{|JwmAcoE_XwcA_q@cuB_b@c~@_X{h@{h@gaAsoA_hBc[_]ccAc~@_tA{aA{cO_nIkgBsjAk\\c[gw@{fAgm@sl@ce@wVgr@_b@_g@sN{nB_XgzA{m@sq@w`@we@gYc`@oZw`@{c@s]{h@sSsb@_Ssg@_g@kgBoUcy@w[ogAkf@kgBoPcj@oF_S{h@klBsXccAcQgm@gO{h@oKkk@cBsI{Jwy@cGos@_Dku@{@seAbBw~@~Cgr@rIkz@bLwt@jM{m@zOgm@vQ{m@fuAoaDbGsNfoDsnIz^ox@vj@k_A~Wk\\be@gh@rg@w`@n_@cVfc@_Sni@oUnx@wVfTwGjiAw`@zh@wVb`@{Tfc@k\\v`@s]~f@sl@jW{^b`@{r@zYkp@zTsq@jRgr@nP{|@nPstAzE_g@bBwo@f@kp@g@obAgEo}@wBc`@_Ikp@wLgr@gOgr@{Osg@{lC_dIwLkf@gJgh@{J_{@gE{m@kCgm@g@_{@cQk~RsDg|@gEwo@_Ikp@gOseAsSwcAoZseAoZcy@_]ku@_]kk@c`@sl@_g@gm@{m@_v@skCg`D{m@w~@sl@ccAsb@s{@w`@ccAc`@chAcQsl@od@oeBcoEkiPoi@wpBwaBkgGcGkWglC{wJs~FcjTgmEgfPcnCo}J{kFc}R{T_eAkRseAkRo{AgO_cBg^sxDoxE_bh@_b@{rEco@_|GcVsaCoPsjAsSkiAwVgfA{c@{zAoo`@cpmAczBsaHsDcLchPcqg@ka@crAoPwj@{TgaAcQg|@kMg|@gJkp@gJccA{OotBgOsrBsq@_`KcLscB{Ecy@gEw~@_D{kAwBolAg@k_AoFceTcBcfB_Ds{@_IwwA{OwuBg|@whFkHgYoPon@s]cmAwQ{h@kRsg@kR{c@sSod@_N{TsSw[cVgYcVoUsXsSgTsN_X_NgTgJoZgJ_{@wVg|@oU{sBcj@c[cLk\\_N_b@kR_g@gYka@{Yw[cVc`@g^w[k\\w`@kf@w`@{h@oZ_g@sX{h@o_@wy@wVsq@kW{w@cyEoqP_DcLsIo_@sIka@_N{w@cGod@{Eod@kHs{@sDos@wBkiASwo@f@_q@z@sg@vBgm@reAsjPfE_eAR_b@Swe@cBsb@kCcj@_Ikz@{J_v@srBcvNsN_jAgJogAsDsq@cB{r@oAs`ARkp@f@_b@nA_b@vBoi@fEwo@bGsl@zJ{w@bpGwcd@vBkMfJgw@~Hgw@zJ_jAbGolAnAccAz@{w@g@gaAoAwcAod@kt\\Rkp@vBgr@fE{m@~Hwj@~Hw`@vL_g@~Mgc@vy@w_C~cDw`Jjk@scBzOon@vLgh@zJ_g@jM{w@zJg|@~rDccZf|@keHvBoPjz@o~G~a@okDrNgzAzJ{pAjH_oAnFobAjCwy@vBc~@jz@okXv[{|JfJ{eDbGcrAzJwrA~MgpA~RgpArXksAbVw~@rXo}@n_@kdAjf@_eAbnCkzEbaLg{R~vGcfLb}ColFrI{OvhA{}Bfc@w~@~a@obAnn@oeB~k@{iBv[chAnd@klBv[_yAzYw|AfT_tAjRkxA~RscBbLknAvG_{@nFwcAnFgkAfEogAbB_q@f@kp@rDwqD~HolKR_SrIg~IbQwlS~Hc_M?wmAoA{pAoA{w@wBs{@cQweEsX_mGwy@sdSoPkfE{@gT_SctEoPkrDoKgvCwBklBg@olAf@w|AvB{uArD_jAjCgw@nFgfArIsjAbcAkzOb|AgzUf|@sdNjHwwAbGoyBRoUvLsoFrkCwfhAn_@_vOv`@gzPf@_S~qBgbz@RsSfE{nBrDchArq@{mYnZczLR{JrsDgn|AfJkbGf@oUrDkgBzE_uCj\\gzKbLwbDrXgwJb`@_`PbLwoEf@gTzJgcEbcAgob@fE_yA~C{_BvGk}Fz@_v@nAgkAf@oPrb@o``@nd@{_`@fOcxMf^cwZvBsaCSchAwBs`AkHcrAgJsjAg`Dcm_@w[wqD{c@wrFoAcQoi@wpGw}Cog_@g^_lEcLcaB_IoeBod@wtJgm@wiMcwAknZ{nBwia@we@wyJcLgbCciC{_j@kMcuBcGku@{JchAcL_eA{dGwpe@{kAgmJ_DoUsv@scGgc@{jD{h@kdFsNgiBsoAshQcy@gnLcfG{y{@w~@{vMgyDo`j@wG{aAco@weJ_Dka@wo@{cJgwE{tq@oAkR_eAw`O_NwaB_NobA{TwmA{O{w@kyCkfJwGwQwnCo|HgfAcxCcGoPccAcsCkyHonTosEkoMw`@sjA{T_q@cVc~@{TobAos@cqD{~DoaS_pMoyo@wzBwaLgTkiA_SknAwQwmAoUcfBcLchAcQgdBcLk}AcGk_AsIkgBkHcfB{E_fCkRshQcB_cBwLswLSs`Af@_`AnA{aAnFkbBrIc|AvLwwAj{BwoTbB_NfOs~AjH_eAfEkdAbBsv@R{m@?on@g@kp@wB{r@kCwo@_D_q@gJ{fA{Jwy@we@{jDcj@ozDce@cgDgm@ghEcaG_ib@olFwm_@gaA_aHce@_dDwVcfB_D{Ts{@ckGw|Fkya@glC{gRcmFgu_@chAkcI_DsXgpA_xIomC{qR{bCscQojBcxMomCcsRwrAonJs{@ojG_XsmB_N{pAsNo{A_I{fAcG_`AwGsyAsDgkAgiB_{m@gr@_oUct@{sV{@wVorCgo`AsIgiBsN{bCcQsaCoP{dBwQcfBkW_rB{_BwuL{^gqCccAktH_DwVg|@srGchKc`w@kCwQciCktRohC{vRgcEwhZspHwri@kk@kfEkC_Scy@o`GcaBkvL{iGsed@s~Fwvb@wt@{uF_D{^kCwV{TohCcBsS_IwcAcGk_A{YoqFojBwg]cGw|AcBobAoAobA{@_jAR{kAnAkiAvBsjAjCo}@jC{r@rDcy@jMooBzE_l@vLgpAzOcwA~CoUfT_yAnUwwAfzAs_Iz_Lozl@jWo{AzTw|AfOgpA~MksAvLwwA~H_eAjHc|AfEolA~Cs{@vBwmA?kRz@cwASwwA{@{|@cBw~@{EooB_Is|Bc`@kvL{@sSc`@ckL{Jo|Cos@_qTsIgbCcL{eDcGk}AoKo`BkCk\\crA{iL{@wGw|AkfOsNkxAsDwo@oA_g@g@sg@Rsb@z@_g@bBce@~Cwe@jMolAjHgc@bLgh@j\\gpArNoi@rjAkuEnPox@~Mox@bGk\\zJos@jHos@rDo_@~Con@jCgc@nAka@f@cj@rXohWvBkqBnAckB?od@Sce@{@{c@oAgc@kC{m@sDco@gEgh@wGkp@kMchAcL{r@sNsv@sNwo@{Oon@oU{w@oUkp@cj@guAgjI{jS{EcL_`Ac_CoUcj@oi@{uAwLc[cL_]cLgm@_Ice@oFwe@cBkWkCg^Ska@Rsg@vB_l@vGs`AjxA{dL~~CkqVfYwsCnP{bCnKs|BrjAgp_@jk@omRja@{}L~Rs|GrDgaAzEw~@zJkz@~Mos@rN_g@fE{OrSwe@fYkk@f^wj@~Wgc@~z@wwAjp@ogAv|A_fCfYsg@bVcj@bQce@zOco@rNku@bGkk@~Coi@vB{h@f@kp@jCsgOz@seAbBc~@zE_mBzOoaDbwA{kPrDku@vBk_ARw~@gE{zAoKcrAw~@cnH_Igw@oFox@_Dct@wBwy@{@gfAbB_`AjCgpAjH_oAfJ{fAjz@c{IvvNsnyAbhPkebBrv@{`IjCcV~\\{{CrX{iBzOs{@noB{iLbQgaAzpAcsH~CwQbqDozS~f@szCb[kvBzOwrAjMstAzJ{pArIcrAjHwkBzEwfBbaBkjsA~z@sqr@bB{zAfJ_fHRsXrIktHzOktMf@od@~HksFg@{iBgEsbEc`@cp[{@{|@wy@c{q@{J{oISg^_DkoCf@sl@vB{r@rDco@zJc~@vG{c@fYkxA~hI_gc@nd@koCfTkvB~cIollArDox@bB_v@z@_eARgw@{@_~AcVsi]gYcz`@SoPsIocMkC_oA_Dc~@_D_g@sI{aAgJ_{@cQgkAwmKwmn@kCsNcLo}@_I_{@_Ik_A{Ec~@oA_l@oA_l@S{m@R_eAvBc~@zEogAvG_`AvGwt@rIgr@bfBsfMjW_mBvLo}@rIo}@rIgpArDgaAvBccAf@k_A{@k_AgE{uAsI{uA_N_~AgdGs~n@wVohCcLos@s`K_ro@{c@{{C{J_`AsIwmA_{@{pKgTwpB{Jct@cQc~@kR_{@c[kiA{^ogAoeB_vEoPwj@{Oos@kHkf@gEkf@_D{h@oAce@oAcj@zE{w@fEw`@fEw`@jMsq@nP_q@b[ox@fuA_dDzEcLzrE_jKjbBssDv`@gr@zc@co@zm@_v@rl@kk@~f@w`@jf@w[v`@{TfzAgr@rjAcj@zc@gYzc@w[r]sXf^s]zYoZbV{Yrl@cy@zY_g@b[cj@fTkf@~Wgr@vVku@zpAsqEroFsdSvdCkwIj{B_iIriDk`Mni@shBvwA{mEvcAspCjnAkyCn}@gsBzaAkqBjtC{pFvyEs_If^kp@v[os@zc@olAf^wmAnZo{ArNg|@zJs{@jH_{@fEos@vBc~@b[stU~CccAfEos@fJgaAjH{m@bQobAnU_eA~Mgh@juE{sQrNkf@jWwt@nUwj@r]gw@b`@{r@rb@_q@ju@s`Arl@sl@nn@_g@bj@c[njBo}@v`@wQj}Agw@bgD_~AzdBs`AnpDgxBnmCshBzr@o_@jf@{Tfm@kWjz@wVrxDsq@fc@wGrb@gJvt@sSnn@_Xnd@cVz|@oi@~z@_q@~k@co@rb@sg@b`@kk@rb@sq@nUwe@rXon@jMg^ryFweOvwKslYfJwVzxB{zFbtO_pa@~k@_~Av[gaAvVseAzOku@rIwe@bGgc@fOwmAvQ_mBv|AogPneBsmQrIco@nKsl@vVgfAjMwe@rNsb@bQkf@jRod@nUkf@v[sl@jaEwnHbQk\\~aEcnHvQ{^zc@ccAb`@seAb`@_oAbQ{r@zOct@bQs`A~M{aArkCguUf_BwlNnn@wmFbQwmAnPox@rXcmAn_@knAj\\g|@~a@o}@f|@g_Bve@{m@ni@kp@fc@od@nd@ka@~pJ_kHjRsNjpEclDztI_wGnn@od@vj@sg@rb@{h@fYgh@z^_q@fTon@rN_b@bL{c@rNos@~Hsl@jH{w@fE{|@z@{w@g@kyH?{h@RcG?_oKz@cy@bGct@vGos@~M_v@zTk_AjMc`@rSgm@vLoZnoBkxFrxDkdKfJgYfr@{nB~iAsuC~wDwbIrhV__g@jHgOrvJsdSv`@s{@n_@k_Af^_eAzTkz@~R{w@zJwe@rIkf@~M{|@vLogAnKgkAfJgpAjhD{se@jMcrAbGgm@fJon@rS{fAzTobAbVg|@jWkz@vGkRz^c~@flH_oPzkA{lCjf@ogAfYoi@rSw[ja@co@ja@kk@jp@{w@ffFgkF~bBcfBrcB_hBjR_S~kEslE~aEsbEfnGckGju@ct@rtA{pAbt@ct@b`@kf@nd@{r@v`@gw@~Won@nZcy@vV_`Afm@g}BrXs`A~Rsg@~R_b@fT{^fTw[bV{Yf^c`@~\\gYfc@sX~f@_Xjf@wQbj@kM~k@cLbbI{pArXsDbjJk}Abj@wLby@cV~nAkf@vpBc~@fqC{pAbo@{^v`@_Xr]sXju@_q@fc@od@nd@oi@rb@{h@f^{h@r]sl@n_@gw@naD_rGraMghYjMoZnaSsyd@ns@caB~CsIrrLsnXndEwtJve@obAv`@co@~u@ccAv[_]naDg`Dr}I{tIbLoKf{HszHrXw[~Ws]z^_l@fY{h@jRce@~Rkf@rSco@vQ{r@fTk_AjMw~@nvAgkKvVkvBzYcqD~u@kpJvB_]r{@syKfoD_ed@zkAkpObdCc|ZzJo}@zJ_q@nKco@~M_q@rNwo@fTct@zfAgtDrbJoxYrnI_nXjhDkxKfgCkhIzvCcoJb~@ktCrX_q@fYon@n_@os@fc@wt@b[ce@v[_b@~\\w`@fc@{c@bVgTv[gYncCgnBrlEkmDr|BkgBvrFonEv[_Xvj@sb@zoDorCzeIgsGvmAs`A~a@s]v[sX~f@we@r]o_@~\\_b@j\\{c@be@wt@rXce@vVwe@~\\sv@bg]{e{@z^gaAbVct@~Rgr@fO{m@fOkp@~M_v@nP_`AnpIcnf@vcA{_Gv[klBzOobAzJk_AbQwuBrD_b@bsHsjbAbLg_BbBw`@nAod@R_g@g@sb@oAsb@oAk\\kCc[oF_l@wG{c@o_@saCgJon@kHgm@gEkk@wBsl@g@s{@kCocu@SweJ{@sePRo~LRos@nAsl@rDgm@~Cwe@bGgh@bGkf@jHod@zJ_g@zOon@vVwy@v[c~@fuAg~DzJ_XfoI{dVz^obAvQsb@~Rka@fTo_@bVc[nZoZbVsSb`@cVjWkMfTsInZ_Iv[cGfY_DfYwBrv@_D~yCcLf|@gEb~EgOjvGsXfaA{EviC_IvxCwLv[oA~sFoUraC{JzbCkHzc@cBzm@_DfsB_I~RoAzTsDnZ_DzJ_Dja@{OvVsNfYoUvVoUvVoZnU{^vQw`@zOw`@jM{c@zTwmAnKco@znBcaLni@kyCjWkxAz@oFzc@{gCzJkk@~sAkyHrSolAzsBgsL~dA{dGnP_jAzOcrAvLgfAvLkxAvL_hB~HkbBrDkiAnAkk@z@{w@f@o}@f@krNR_gTRwlN?_kMz@wj@nAw`@vBc`@jHwe@vLkk@bGoUzJ_XbLkWrNsX~MsSbQoUzT_XfYwV~sAgpAvpBckBfvCcnCbtEoiEjp@{m@j\\_]rq@{w@j\\od@jWc`@nFsIbVw`@fT_b@vV_g@zTsg@fm@k}Avo@shBbQ_g@zOsg@nKce@~Hka@~Hce@jHkf@jHwt@zEos@rD_v@f@wt@rD{oD~HgqHS_g@{@{h@oAod@k\\ctEkCsb@{@{c@Rka@nAsb@fEod@nFw[jHg^fJk\\bL{YzYsg@rXw`@n_Es`Fz^we@jR{YbL{TzJcV~Mka@vG_XnFoZzEoZ~C{^bB_g@~C{qCz@gYnAc`@~Cc[fEw[nFc[~Hw[zJ{YjW{m@jiAwuB~M{Y~Mg^jMwe@jM_l@~\\kqBrS{|@vVg|@~\\g|@fY{m@nrHgoNfY{c@vVk\\~WsXrb@w`@~f@g^zm@_]vdCwrAfyI{wE~|D_rBr]gOn_@sNve@sNzh@kMja@kHz`Dk\\bhAgOnd@wBfc@?fYbBn_@zE~\\~Hj\\bLzY~Mj}A~u@v`@jMj\\~Hf^nFv`@vBf^Rnd@wBr]{ErpC_b@b`@kCrb@cBb[Rb[vBnd@zEfc@zJr~Af^faKraCbj@vLbe@zE~Wf@vVRn_@wB~W_DbVgE~W_IfTcG~RgJ~iA{m@vhAgm@jf@k\\ns@gm@z|@cy@bdHooG~sK{wJrNkMvuB_mB~a@sXrl@g^bo@c[nn@gTrg@gOn_@kHzhE_l@bo@oKjk@gOv`@cLn_@kMz^sN~k@kWb`@oUrpHs{EzmJwfGzqCgiBniE{vC~z@{r@b~@_{@~bBkgBnbAsjAfJwLju@ogAr{@stAvo@ogAbLsSni@{fA~a@g|@fw@klBfmE_oKjdAwdCjf@wmAzYs{@fOcj@rIoZ~Hs]jMgm@bLkk@jlBoxJ~sAcdHvdCcnMzh@cnCnZcaBvV_oAbVgfAbQ{m@zOgh@jWct@zY_v@fYkk@~Woi@~z@w|An}@caBz~DkoHvbD_cGbe@s`Aja@obA~Wgw@nUox@zTc~@jRk_AjR_oAfOoqAfJoqAvGwfBbQ_x]~C_gEjColAvB{r@vLcpBrDgm@jCs]jWodEzTsiDbQgbC~Hku@~Hsq@bGod@vGgc@fOo}@vLgm@zTs`AbQ_q@fOsg@zO{h@jRoi@rg@ksAfzAopD~hDsiI~{BkxFzaAcdCzT{r@jM_b@bLkf@nUseAfm@__D~dAolFngFc}Wr{@oqFnPstAvGgr@rI_eAjHkiAbG{_BbBwy@f@kz@RotBf@c`E?ghE?sSRkiAnAseAnAwe@zEchAfJgkAbLkdAbL{w@nUknArXwhAfYgaAfyDo{Kbt@gsB~k@c|Ajp@g_BnPw`@jp@wkBfO_l@~Mgm@rS{uAjHos@vGwmAbBs{@?w~@oAon@cB{m@{Esq@ka@ksFsIwkB_Dw~@cGgeD{JcnHoFcxC_DgpAsD{pAoPo}E_I{dB{@{YcLwxCkCcy@{OsbEgEg|@kH{|@{OkgBoi@gmEkHoi@_X_fCoFco@gE_q@kCct@cB{m@g@{m@RseAz@ct@jCgr@vL{bCfYseF~W_eFfJosEoA{rEkHcaLR{zAz@gzAjC{iBvBgfAvB{r@zEwrAvGguAnA{T~HwmAvV{eDzT_zCzEogAvBogAR{r@{@{fAwB_v@gE_v@gTw_C{^w_CkM_v@wVojBwGgm@oFon@_Dcj@wBgh@kMwyEgJk|DkMobFoAwcAg@_{@?{aAnF_sXSwy@cBos@kCwy@oF_{@oP_rBwB_XoK_oA_SocCwLcwA_eAspM{h@oyG{Ek_AkCw~@wBcaBgE{hJRkz@vBox@rD_{@vGs{@rhB__SfJgkAzEseAbBc~@RgpAcBgpAwBcy@oFcy@gEkp@wGwo@gJgw@oKgr@kMgr@cmAswGogAg_GcuBscLwQwcAwQcrA{J{aAwGseAsIksAkM_wBsSgeDka@wuGkRgeD{O{gCwLcuBwQwxCoFcmAsDcmA{OoeG{EwwA_DcmAcBwo@g@o_@gJ_zCSwQcG{sBgJkvBc[ooGwt@s}Nk\\kqGwLciCcBk\\_X{pFwVw~E{O{{CgJguAwLwwAogAgsLsg@{zFcLswBkCwuBoAwdCbB_zC{@_lEgE_xS?ce@cBwyTR{pF{@k|DRcy@jCwy@rN{uArXstAve@g_BnZ_`Az^gkAv`@oqAfTc~@zO_eAnAkp@?co@cBco@cGwt@cVgdB_N{aA_l@weEsSk}AkHwj@kMs`AsDsXsXgsBsIg|@cG{|@sDwt@oAwy@g@oaXg@obAkCs`AoF{fAstA{nQcVcxCwBw[gc@c|FoFon@c`@c~EkCcj@{|@gzKsDgc@ckBgdV_v@{wJ{JksAcLcaBkHgdB{@c`@cGotBkHsqOcG_aMkC{nGg@c~@_DcvIg@{fA{@cy@cB_l@_DcrAsDcy@sD{r@sDgm@_Dkf@sDod@gE_g@oFgm@kHwo@sIgr@_Ico@gJ_q@kH_b@wGka@sIwe@cGgY{Jsg@oK{h@gJw`@_N{h@kMoi@ox@wbDcyEsfR_Swt@wQos@_Ngh@_Nkf@_Nod@kMc`@kR{h@{T_l@{m@{zAcLoZ_bEgwJs|BcrFkgBcjEoyBwmFc}C{qHw{DslJwo@s~Asb@_eA_Xgr@wVgr@oUsq@sS{m@w[ccAs]cmAk\\sjAoZknAwVkdAoUogAsXwrAsXc|AwQgfA{O{fA{OgfAkMobAkMwmAsNguA_I_{@kHs{@{Esq@cGgaAoFw~@wLgqCwBct@kCwcAoAwt@oAgpA{@olAR_jArDogZ~CoxOzEkk|@vB_ti@RgmE?oUSob}@f@_aCf@ox@f@_`Az@scBRw[nFo}JzE{yIfEsaHb[_ti@jWwcd@RgYvVoca@z@_yA?o{AcBk`CcG_bE{h@_tZsNcvIsD_dD?gwEf@s}I?w[rDgxt@jC{zi@?_yAg@_cL?oZg@{vC{@{pA_D_yAsDwhAwL_|B{Ok`CoPwdCkH_tAkCo}@_D_oAkCovAjC{qiAf@{ad@?gaZf@kxKSsXRkwIz@szW?wpBvBksAjCw~@bBox@~Cos@~HksArIolA~\\_iDfOgkAnaIcsf@~WgdBf^wiCrXgxBfOcrA~a@cqDve@ogF~RggCfToaDzOwiCnUkuEvLkrD~HwxCnF{{CjCwnCjCciCRo~BSw_CoAc{DSsSsDwdCsDwzBotB_b|@wGovA{Ect@cG{r@cLobAcVcaB_X{pAc`@{uA{Tku@sXct@{^{|@{uA{vC_}D_iI_zHwhP_cB_nDcj@sjAc[on@c[kk@cj@s{@sg@wt@wj@{m@kMkMsNsN_]oZckG{pFkf@{c@wV{YwV{^kWce@gOk\\gTon@gJ_]sIsb@wGce@oF{m@kC_v@?gc@?od@rD{fAv[gnGnFchArIk}ArDg|@f@sg@g@{h@_Dsl@oF_l@{Eg^_Ika@sIc`@sNod@cQgc@kM_X_Sk\\{bCcbDcVk\\cVka@kRg^kR_]wQ_b@_X_q@{Ood@cLw`@{Jg^gJo_@_Ic`@gEsSkMg|@cGgc@cj@wmFgh@o}E{c@sgEkz@c}HkgBovPccAccKw~@grJ{aAk_K{dB{iQsIobAsNc_C{JwuBcG_cBgEsyAkCwaBcBoyB?_~AvLwk`@jHgfURg^fJks_@nAs`K?c[jHc{b@oA{oNoAsiIg@gaF{@gpF{@w}H?{_Bf@sjAz@wt@vBgfArD_yA~C_oAjCox@rNkaEfEguAjCcy@rXsnIvG{`DnAo`Bf@{uA?{uASoi@g@kp@{@c`@cB_oA_DguAoFs~A{TgfFw[koHcGw|AsDksAwB_`AoA{_BoAo~B~CkzTjCwuLbBg{MvB{lMnAgiL?cuBwL{_`@{@stA{@on@cBwy@sDguAkCccAkHojBcGwmAsIwmAgJolAgJgkAcLseAcQo`BgJ_v@sXwpBka@kjCcbDgxQ_g@szCkeMcrs@gwEcbXojBolKcmAcdHg^gsBkRwmAoP{kAwQ{pAwGsl@cLkdAoPckB_Ng_BsIolAoFkdAcLswBo}@oeQoPg{C_IoeB{^k{GkCwj@oi@ksKksAggWknA_cV{O__DkWsjFoA{Yc[o{FoKgnB{EknA_DsjAcG_pCoAolA?{r@{@guARcaBf@c|PRgsGf@kqGf@keH?w[~C_re@Rg|E~Cwe^f@s{JvBgiV~C_lYrDwq]f@oxEz@{xLkCckGoFkcI_DkoC_DohCkCwfBgr@cx\\oA{aAoAg_BSgzAz@wcUz@w`JzEospARsfHf@ccAz@w~@jCoqAfEksAnFw|A~HksAnK{_BnFkp@zJchAvGwo@vGwj@bQovA~Hwj@jC{O~\\gxBb[s~Azc@gsBrl@saCfoDs|Lfh@srBfc@_mBbe@wzBv[shBja@keC~a@c}CrIsq@rgE_k\\b`@o|Cb[o~Bj\\owCfTocCjHs{@nF_v@jR{jDnKowCnAc`@jH{bCbB_]bB_b@vBw[bBkWvB_XbB_SbBoPvBcQvB{O~CkWbG{c@jf@kcDb`@wiCfOk_Ar]k`CjMw~@nK_`AbL{kAfEgr@rIc|AzEolAz@sg@nA{fAf@knArD{cOnA__Dz@{uAvLs|GzE{}BvL{sGrDczBfOk~HfJw}CnKwuBjHoeBzOsnDnKgsBzTgfFnKkyCrDgdBbBczBnKohWbBk{BRscBrDoeGrDc`JvB{xBrDsyAjCo}@rDwcAzJgsBjR{tD~M{lCfh@c~JzO{`DfT{~DnFoqAnKcpBzEg|@zJgsBbVgrEr]k{GfTghErDon@nFwcAvVs_DrS{nBnUcpBrXwpBnUgzAjk@c}Cve@g}BjRs{@be@kgBj\\knAnd@syAfm@klBfaA{vCbrA_xDzaA{{CnZ{|@nlAopDzr@swBb`@ogAbwAcjE~iAclDfm@wfBroA_xD~vBcpG~bBs`FrXku@zr@kgBb`@w~@rv@_cBrb@s{@vkBsnDjMoUfeDojGzjIosOjnAo~BvmAg}B~bBk~C~Wwj@~_AkqBbpBkkErtAcxCvzBcyEnbA_|B~_FcrKzfF{_LrdDohHfpFwpLjMoZjuEgdLjW{m@nn@s~A~f@soA~p@cfBr]{aAn_@crA~Rgr@b[_oArXsjA~WknArNgw@~a@ciC~Mkz@fJsg@fYcfBjHc`@jHka@rIw`@nPco@vGkWzEgOnPwe@zYgr@nK{TbLgTbQoZb[_g@bo@k_A~\\gh@fc@_q@fr@seArv@sjAnd@sv@nP{YbQk\\~Wcj@rS_g@nZcy@bQsg@jWw~@nP_q@~Ho_@bQgaAzEoZvQs~A~C{YzEos@bBcV~Cwy@nAod@z@gm@vBweEz@oqF~Hk`W~C{pKRo}@bLora@bBcsCz@_vEf@w~@vBcjJjCsnX?_uC?obAg@syAg@g|@cBkiAg@kk@wGo~BgJwuBwQs}D{c@ghJ{^__I{O{jDsS{hEwB{m@cBwt@wBox@_D_wB{@wdC?sjAz@_mBjCgiBnF_wBbLwqDvVkwIbGgsBvVwlInZsoKjMkkEzOksFbG{xBvB_jAnAoqAf@_tAf@{rJRksFf@khNz@{|^gE_iyAg@{lWoFwfmAgJ{ecB{Osbw@{@wzL?_XwB_uH?on@sDwdRScnCf@{fAnAw_CbQgqRfJgiLvGcqIbGsmGbBglCbBshBvBk_AjCsjAfJkjCjCsl@~Ckk@zEs{@bGw~@jHc~@~H{|@vQshBbGkk@vGcj@fJct@rN_eAzOseAfOk_ArIkf@rSogAf^shBbLsg@bQku@nUs`AfYgfAzYkdA~\\kiAr]whArl@scBnqAwqDby@{}Bbo@gdBjwDksK~iAgeDrcB{wEbhAg`DbVwo@bdCocHnd@ksAfh@kbBvQ_l@rNoi@~\\crAbGoU~Msl@vQcy@nKgh@rNgr@zTsjAbVcrAz^o~BjRguAjRo{Av[ciCnx@smGbe@opDjiAc`Jv~@ggHbQchAbVkxA~Ww|ArIce@b[_tAzYoqAv`@k}Abt@_kCvj@_hBzc@oqAf^gaAnUon@fYsq@zm@kxAzY_q@r]wt@zc@o}@~f@_`Af^kp@v{DkjHfpAw_Cj_AoeBnx@gzAfyDsfHjdAsmB~a@wy@rX_l@vVoi@~MoZbVkk@nPw`@v[wy@v[{|@nZo}@fOkf@bQcj@jM_b@zOgm@fOcj@~M_g@rNwo@zTobAnP{w@bQg|@jMos@nF_]bL{r@vLox@~M{fAvLs`AzJs`A~Hcy@jHcy@bt@chKzJwwAbQ_fC~WouDzc@_rGrq@osJns@wcKfOwpBbo@gmJjW{jD~M{}BfJsaCjCg|@~CsoAfEotBzfAsng@r`Aghc@nZ{oNvt@wb]b`@{uPbQgoIrS{tIfT_jKb[oaNve@{rTzJ_lE~CsjAfEsjAjH{zAz@{TrIkxAzJoqAz|@{aKni@{dGrl@w_HbpB_lT~u@ssIreA_wLfYszCjWkyC~W_zCnd@c~E~_AcwKrcB_kRrg@ovFz^c`ErSw_CnPsmBb~@w~Jv~@gaKzc@seFvVo|CzJk_AnK_jAzc@w~EnFct@bBoUz@gc@Ro_@Sod@cBka@sDwe@cGce@oK{h@wL_b@cQod@gOgYsNwV_SkWwQ_S{TkRocCo`B_N_IwQgOsNgO{TwVkMkRkM{T_S_b@w`@w~@{c@chAwVsv@oUsv@kW{aA{Jce@_Non@_Ngr@kR_jAoK{r@kHon@kHct@oFkk@{Egm@kHc~@kRsfCwGc~@kRohC{bC{i[_kC__]oUwdCwQ_~A_Sk}A_NgaAkW_~Agm@sdDklBsgJoP{w@_XgpAcQkz@ce@{}Bs`A{wEwhA{pFwiCocMseA{fFcxCsxNc`Eo|RgOwt@_I_b@gJoi@gJsg@_Ncy@oU{zAsIon@sIon@_Isl@sD_]cGcj@sI_`AgJc~@sIccA_Dod@kCc`@oFwy@wBsb@gEsv@kCsq@cBwj@kCw~@wBw~@oAcy@cBgkA{@wmAg@whARg`N?obKSo}@?g|@{@sjAcBct@wBwrAcB_v@cBsg@wBsg@wBkf@wBwe@kHcwA_N{sBcGct@sDc`@oAoPwLoqA{Jwy@kRg_BcGgc@gEc[sDc[cGc`@gJ_q@gEw[cV{dBcQwrA_N{aAkdA{qHo{AgzKsuCk|S{jDw_WozDceYcQg_BsNgzAkM_yAoFg|@cBk\\gEos@_Dcj@{EolAoAc[cBgc@{@g^cB{h@wBsv@{@wj@cB_yAsDgjDsXc|U_Do~BcGghE{EsrBcBgc@oFsjA_Dgr@kC_g@kCs]oFs{@{J{pAkHsv@sSgsBsb@clDgh@{jD_tAc{IknAwgIgfAgbHgoDoqU_bE__Xcj@krDg^czBsX_hBkW_mBcL{|@kM_jAcGsl@kHkz@sIobAkHobAcGsv@kCsg@kCod@oFgfAcBgh@oKczBgEgfAc[{lH_XshG_D_q@sDcy@wB{YcGo}@wGccA_Nw|AgnBweTgEce@obA_tKoK_`AsNolA{T{_BkM_{@cLsq@_SwhAoP_{@sI{c@wGc[kMco@wLgh@kRox@wQku@wsColKstAwcFkz@o|Cc_CgtIod@kbB_]{pA_q@koCkRox@sSgfA_SwcAkf@spCsSgzAgTo`B{Jkz@cLseAcLkiAgJ{kAgEon@kHw~@wB{c@_D_l@wBsb@kCon@cBgc@{@{TcB_g@wBgw@wBoqAoAgfAg@_v@g@g}Bf@chAfEwzV?sjAS_eAoA_l@kCo}@kCkz@oFs{@{Ect@{Egh@oFwj@gEc`@oF_g@kHwj@oKwo@oK{m@kMgr@wVolAkf@o~BgTseAkMco@sI_b@_Nct@oPkdAoK{r@_NccAoK{aA_Dc[{E_b@wGo}@oF{w@sDgh@{E_`AcB_b@wBcj@oAsg@oAwe@g@od@g@sq@Sgc@Swe@?sb@SwxWRcgS?kis@SsmBz@s|Bz@_`AbBccArDcrAvBsv@~Ccy@~Cos@nF{kAnd@_eKzw@swQbGk}AjCox@vBseAjCshBz@_yArDoeQbGsfWzJ_vc@f@ccAz@knAvBo{A~CksAnFo{AnFgkAbG{kAbG_`AfJ{pAvGcy@fJ{aAvVc_Cv[{bCnZs|Brl@slEj`CkqQbcFol_@b{DsvYrS_yAjRgzAzOcrAfJkz@rN{_B~HkdAjCgh@vGcmA~Cox@~CkdAbBgaAbBshBSwaB{@seA{@{m@wB_oAcBsl@{E_jA_IwrAoKc|AsIk_AoKkdAoK_`AwLs{@sI{m@sb@spCcL_v@sb@spCc`@{lCwQwrAoPwwAoK_eAcL{kAsNoeB_NoyBwGcrA_D{w@sDolAkC_{@cBseAwB{dBSseAS{kARon@f@o}@nAogAbBknAbGgoD~HcjEvGghEjCshBfEczB~CgsBzE_pCbGsiDvB_~AvBo`BfEcuBjC_hBfJwwFjHcjE~CgsBf@sv@z@kvBoAwkBoAwcAkCgzAoAod@sDkxA{EwmAoPo|C_NcdCcQoaDkRwgDkiAssSgJk}A{kA{mTw`@ggHk_Ao`Q{J{dB{EkdAsD{|@kC_q@_DknA_D{uAwBwhAsDwfBkMwwFgE_wBgEswB_g@smVc`@{qRkWk{LkC{_B{TgpKsNk`HcLwrFsIw~EoFo~B{EcwAoFksAkHsoAwG_eAcGgw@_NkxA_NknAgOolAsXooBgY{dBsXovA{O{w@wQsv@{Jka@kW_eAwVo}@cVg|@gaAsuCgYsv@gr@{dBozDslJwcF_|Lgh@gpAo_@ccAkWct@{h@w|A{r@o~Bsg@ojBwe@wpBgh@k`C_XwwA{YcfBce@c}CkRw|AwQs~AoKgkAcGos@{O_wB_IwrAoK_|BwB{m@sDgpAkCk}AwBo{Af@_hQSs`Ff@g}Lf@cgDrDsiNzE{gM~C{lMbBs`FvBgdGjCw~Eg@{vCS{fAwBkgB_DgzA_NwtJ{@s]kCotBoFk|Dod@{fZwLwoJ_I_pH_NoyG_IwtEkHc`E{@_aCf@csCvBwuBvL{oI~C{gCfEohCfEk`CnPscLngAk}s@r`Ak}n@zc@cjYz|@wxk@rX{bRfEc_C~Mw`J~Hk_FfE{dBvBgr@nFgpAvGgpAfJ{zArIwhArNscBrIs{@~\\_zCb{DcqXbqDggWvkBcxM~sA_qJvfBcdMvVcfB~M_eAbLobAzYwxCzJcrAfJwrAzOsuC~u@orMjdAkqQz{C{fi@nUgcEnPwuBv[{cEb[kwDjgBgfUzJs~AnK_|BbG_mBzE{sBnAgpAz@chA?_`Ag@soPSkmNg@_eA{@seAwBckBcBseA{EcgDsD_uCkHgkFScmARsg@?oKR_l@nA{r@jCct@zJ{dBzJwwArI_eAjHkz@f@oF~Cc`@rIobAnFos@zJ_jAbj@gxGbe@gpF~W_zCzE_l@vmAgcOjnAc`Oz|@onJnPcfBns@gvHrv@wlIjdA_yKbmAsuMnx@{tIb`@_bEffAgdLja@woEnd@wyEn}@coJrIccAfuAozN~\\kmDbL{fA~MogAjM{|@jRwrAb`@k{B~WovArSwcAvVkiAr]_yAzh@cpBja@guAruCwjJzaAg`DrSsq@jRgr@bLwe@fJ{c@jHc`@fJwj@nP{pAnKolArDkk@vBwe@bBsg@nA{m@z@stA~MsePf@wj@bBct@bBcj@rDco@bLoqAfE{c@vG_g@jRkiAbV_jAjHoZr]olAnK_]fJkWbLgYrI{TjWwj@bVkf@bVgc@bdCweEnZkk@bj@wcAzkAggCve@seArg@soAzw@_wBjW_v@fTsq@jM{^n}@__Drl@c_CjmD_sNr_DglM~lBsuHfsBsnIrtAoqFb`@gzAj`CgeIbfB{_Gv[{kAfh@{nBrXsjAzOct@~k@cxCrN_{@b[klBjW_mB~f@wtEnUgqCbBw`@jRkoCnZoxEjMwpB~M_wBnUwqDbe@gqHnFwy@~Hw~@vLksAj\\_uCz^{lC~\\_wB~f@wiCnd@wuBbt@gvCzh@wkBz^olArkCsuHv_HsuRby@gbCn}@kyCz^{uAni@k{Bj\\{zAf^wfBj~CghOjMwo@b`@_hBzOsv@jRc~@b~@kpEfw@gyDffFkqV~oHgh^zc@gsBrg@{sB~\\crAzw@gqC~f@_cBnqFoaSnaDgiL~aE_}NrrBglH~z@o|CzpA{rEvnCkzJbaBcaG~_A{jDjMwj@bQ_`A~Hwe@jM_{@bLsjAnFgw@~p@sqJvo@_qJni@geIz^{kFzO_aCzJgpAvGku@~H{w@jk@{fFngAcoJrS_mBj}AkcNfOgpAzTwaBrNsv@fTgaA~Mwe@bL{^zTgr@nd@sjAbQo_@zTod@ja@wt@fT_]rl@{|@zOkRv[g^r]s]fY_Xfm@sg@b~Ek|Dn{AknAzT_Sfm@gh@~u@ct@fh@sg@fkA{pAf}B{qCvo@wy@ve@{r@bmAwkBj}AomCn}@oeBrv@caBjW_l@ffAwiC~a@whAzw@w_Crv@ohCvQsq@nUc~@zw@suCznBcnHvuBg{HreAk|DzdB_mGfY_`Afc@_tAn}@{vCnlA{yDf|@orCbpGsiSzw@_fCn{A_{E~sU_fu@bxCgmJz^chA~Roi@bQ{c@nU{h@~CwGzJgTj\\sq@b[_l@jW{c@n}@cwAz_BczB~k@ox@b|AcuBj\\gh@zYce@z@{@rS{^nUsb@nUod@~Rka@r]{w@nZ_v@v`@seAjM_b@bLg^zTcy@jxA_jFjdA_xDnjBk{GnbAgoDnqF{`Sjf@kbBzcOkof@~yCkzJzfAclDruCkpJvwAcyEvwAsvEnKk\\fYs`AzO_l@~Hw[~M{m@fO_v@nKcj@~H_g@bVwaB~MsoAvLccArNgpAjRoeB~RgiBjMwhAbV_cBzEw[nUcmAzO_v@vL_g@fYwhAv`@gzAr{@cbDz_BgiGby@kyCju@csCfuAsjFjbBsmGzm@k`CvpB_uHbiC_vJfvCgzKnvA_oFzc@kbB~Wc~@fr@wuBbwK_r[v_C_aHvbDonJvVkp@z|@saCruCsuHfr@kgBrg@wrAvy@oyBzkAg{CzTgm@zT_l@rI{TnUsl@b|AkaEfxBsyFnPsb@bhA{vCja@sjAn_@olA~W{|@~Rgr@fh@_mBve@cpBjoC_yKvnCstKfpFslT~|DoxOj`CsnIrfCkaJnkD{bMnn@wuBzT_v@nKs]vQ_q@jf@caB~\\cmAb[_eArSos@rSku@jz@csCnlAodEbe@s~A~f@_~A~Rcj@zOwe@b`@_eAbj@wwAfpA_zCzc@seA~mDsnIjvB{|EfaAgxBn`BsdDbpBkaEjcDwuGz{C_hGjaEwlIj_FwwKvaB_xDnwCswGvgD{vHbzBs`FbzBobFfnB_lE~k@wrAfYos@zY_v@bQce@bVgm@zT{m@ni@{dB~sFkqQnqFsmQjdF{kPjzEosOjnFgdQ~Mwe@nZ_eA~R_v@z^c|Afh@k`CvQ{|@~Mku@zToqA~R_oAnd@sdDbe@g`Dn_@_pCzpAw`JngAkyH~xAwhKv`@gvCvcAciHv[kvBzTo`BrXkqB~dAskHrX_cBz^cpBbQcy@~\\o{AvGgYzTc~@~Rgw@fw@cnCjRsl@~a@soAfc@knAn}@_|Brb@{aAnFkMzr@c|AjfEgjIzc@g|@ve@w~@nUod@j\\wo@rzCcaGnn@{kAzsBkaEryAktCvuBw`EzlC_jFbt@o{Ab[kp@jf@kiAz^c~@fh@stAf|@{gCnZobAvLw`@v`@cwAvVk_AbQ{r@j\\cwAbV_jAfOsv@vQccAzTwrA~R_jA~MgaArSg_B~RckBnKs{@rq@shGns@{sG~hD{zZnlAovKnZ_pCbQojBjH{|@rNkqBjMomCbV_aH~Hs|BnAgh@nKoaDjR_tFvBsq@nFcaBjHs~A~M_fC~MwkBvBkWrD{c@fOgzAbQc|AroAo}JjWs|BrIsq@~MwcAns@s~FfTo`BzOksAv`@k~CreAkrIzYcnCfJchAvGox@rN{xBzE{w@fEobA~H{xBzE_wBnA{kAnAk`Cg@knAoA{xBwBcmA{@kf@oFshB_{@ktWcVciH{|@w}W{@{c@sSkbGkHsaCwB{fAwBgiBSkdARgnBjC{mOvGglWjCczLRczB{@oqA{@sb@_D{dB{EgiBwLgcEseAsm`@cGshBgEouDSovAnAkgBnAoqAfEo~B~C{fAzJgbCfh@{dLvB_b@~f@kdKv[s|GnPwlDnFwcAz@sSnPskC~a@{vHjMczBzE_v@nPsuCzJk{B~Hs|BfJ{pFvGwsC~Ck_FnFc|Ff@k`CoA{gC{J{`IsDszCkWwjT{@kbB{EkmIS{TS_~Af@_rBjC{sBjCkiAjCs{@rDccArDwt@nFsjA~MwpBfO_hBzOcfBzY_fC~C{TnK_v@fT_yAjMcy@vQccAz}BwiM~a@glC~\\omCfY_pCbV{lCz@{OvVgtDns@knKjsA{`SnF{r@zJcrAfT_pCzTotBbVwkBzOchAjHce@~Hkf@j\\cpBfO{aA~WwkB~Ro`BzJccAzOscBrI{fAzOsfCjHchAjRosEv[glH~a@gcJb[{lHvhAoyVroAgcYfTgrEbG{zAzEc_CjCkyCR{iBwBkkEcLgnVcG{nQ{EkeMf@s~AnAwt@z@wy@jCoqAvGsrBbt@suR~RwrF~\\okIrIo|CrNgvCnAsl@rDk_AvBcrAbB_cBRk_A?_mBoAwzB{@sdDkH_eZcBo_^?_|B?wQf@olAnAolAz@_g@fJ{hEfc@w|PrDgzAfEcpBvB{sB?s|Bg@kiAsD_aCgEgvCsI{nGwBgdB{@_`Ag@wwA?_hG{@w{]?kxF{@_{O?_dD{@gnLRc~ERoyGSgc@{@_b@oAs]kCoi@oFct@oF{h@gEs]kHce@_I_b@{Jce@wLkf@sNsg@klBksFkxAghEw~@wnCoKk\\_g@g_B{YgfAwVw~@oUo}@gr@__Dsb@wzB_Iod@wB{J{EsXsS{uAoPknAoFgc@{Es]cLseAgOs~AcQooBkHs`AoA_XcGwhAoFwhAsDkp@wQodEc`@{eIwGgkAoKw|AwLsyAgOw|A{J_`Ak\\kjCwL{w@cLos@kWc|Ao_@cpBwL_l@syAcdHc~@wjE{EcVwo@g{Ckp@__D{YgdBsNobAsNcmAkH{r@sDkf@oF{w@_Don@sDgaA_DwrAg@_q@Sw~@nAo{Af@{c@bB_q@zOozD~R{rEvB{r@nAstA?sSR_XSs`AkCgdBcBkk@cGstAgc@swGc[coE_{@wsMsNwkBwL{nBoKswB{O_oF_I{`DwGoyB_DguAc[g_L{EksA_Nk{BkMklBsN{_B_S{nB_b@sdDgTsyAwLkp@kR_jAkf@keCs{@{cE{J_b@kk@cnCce@oyBs]kbBw~@wjEoFkWox@kwD_`AkkEwfB{oIcVkiAoeB{jIs`AonEkbB__Igc@oyBo_@wuBk\\_wBc`@kyCoPcwAkk@kpEkp@{kFc{Dgd[kR_yAcj@kpEolAgrJgm@s{EgYswB_eA_nIgOgpAcVsaC{J{kAwQcnCcGogAkHwaBkCg|@_D_eAoAo}@wBwwAg@scB?{iBjC_rGf@giBz@kpEf@{aAf@kzEnAcoEbB{~I?oPz@on@rIcoEnAwt@jCku@v[_nNvGwxC~CcuBf@_yA?syAg@syAoAgfAkC_cBoFoeBcGs~AkMg}BwGgfA_eA_rLkiA_kM_l@kqGgJkz@wLgfA_NseAsNccA{OwcAgOg|@cQ{aAk\\kbBgTkdAsXgkAsXwhAkp@gbC{eDkvL_bJsf\\sv@csCg_BsyFc`@gpAc[_`Agm@{dBc`@kdAolA_uCsg@gfA{r@ovAkk@seAwj@ccAsb@os@_oAsmB__DcyEon@kdA{Ykf@g^wo@c`@os@wj@whA{c@c~@gh@_jAwe@gkAw[{w@{Ysv@_{@keCw[wcAc`@_tAoZogAw[gpA_Ss{@kWcmAgYcwAkf@ciCkgBceJogAo{FciCcbNsuCcjOct@opDku@kmDcy@kcDg|@wxCo`BgwE_tKwrZgkK{fZweJohW{^gfAw[kdA{|@o|CsSox@gYsjA{^_cBkWksA_SwcAwo@sxDktCwmP{gC{cOscBs{JsyA{tIcoEciWskCkpO_jAs|G{YkbBsXovAkrDcwPorCorMobFwhU{fAgaFsSolAcV{iBwGs`AgEgaA{@sq@Rsv@z@os@rDgaAvGw~@nK{fAjM{w@rIsb@fYolAzr@ohCvLgc@jf@cfBjMoi@~CwQvGs]zJ_v@bGwe@bGct@rD{h@jCco@z@g^f@gw@?_l@{@{m@cB{m@sDsl@kC_b@oUwdCoZkhD_q@ggHs]{yDcGco@_mBkwSccA{uKwLstAgEkf@wQckBwGo}@sDct@sIcdC?keCnA_~AvBksAbGs~AnKovAv[g`DrNseAvVsmBfiBkmNzOk}ArXwgDvQ{`DbL{eDjHopDnA{iGRktW?ogPnAczBRsgESwj@?kbB?kkE?s_D?c~@g@swQScdC?{|@?skHSktHf@wdC?kiAf@_qEf@c}HR{lCnAssI{@_aCSkW_DokDgEgeD_DwpBkCooBoFwqD{JggH_Ds|B?wG?oA{EkyCwBswBcBwlDoAchKScvD?{vCS_|BSsnDg@wpG?ovAg@_uHSctE{@seK?czBg@_nISgtIz@w}HnAgtIf@oaDz@k|DR__DRowC?_qEf@gnGS_}Dz@sl^?{w@?wzLf@k_K?cpBRcpGg@suCR{dBRcqDRwhARs`F?cuLRssN?kHScqD?_`ARowCRwlI?{gCR{jISkaERklBSo`B?wnCSowC?{c@?_jFSowC?s`AScqDg@_kC?od@?o}E{@gtD?_tAS{fA?{h@Ros@oA_{E?obASsxD?o_@g@o}E?sl@oA{lMg@wzLRscG?stFR_~FSgdB?kyCf@_~FSgoD?soAf@w|Ff@gzAz@{aAz@_l@nAgaAz@kf@RcVnA_g@fJkwDvL_iD~MouDbGkbBfOkhDbGgvCjCcy@f@sg@R_XRw~@?kiAf@{w@gJc`JsDcxCg@gm@g@wj@_DwiCcB{iBoA_eAg@co@?gT?sSS_]Rgh@S{nG?sNz@_yFz@waGS_tF{@{hE?saCf@wzBz@ocCRoKSk{Gz@soF?s{ESo}ERchF{@cjJ?sI{@_oPRknA{@olKg@c}MScyO?co@RwzB?{kA?{`D?on@?ce@?gdB?gpA?snDSckBRc}C?koH?g`I?{|@_Dw|F_DcjEkCkpEoAseAS_`AoAkgBcBoaD{@_aCg@{h@cB{xBsIopNg@ct@g@ovAcBwkBoAcgDS{vC?gObB_|GbBcbDf@{sBf@soAnAwqD~Msib@bBw|Ff@cbDz@wcK?{kFR{xBf@wyO?szCz@g{CRc~ERsuCRsmB?wlDR{sBnA_bYRchPR{gHg@ooGf@{xBSsaC?geD?srG?k~Cf@k|XSswBR_aMRciC?cdC?_cB?oqA{@_cBScVgEwgDwBotBwQsgOoFcjEwBkxAcB{dBgEsiDoA{dBRclD?saHRcvD?sqERcgIz@snXR_fC?{}Gf@kgLf@g|Oz@{y]?w~E?osJ?cfBRwqDS_nD?_jP?ciMRwfG?_jF?ceE?s`F?_`FRcgIRwo@Rc~@nAs|BrD{sGf@oi@f@{uAbB{vC~CguF~Cw~EnA_aCnFwtJnAk`CbBorC~CwhFRwhA?guAS_b@{E_qYoAwkGg@{wEcB{hJg@{{CwBwxMSgpFSs`F?ghE?w}C?k_AS_rB?sfCSsgE?wfG?_nDSscG?ct@?kcDSokDg@{iBwB{sGgE{oNcBknFcB_yFcBwtEoA{aFcBsjFoAgpFcBw{DcBkgGkC_lJcBcrFcBo{FcBo{FoAwrFwBo{FoAsoF{@_pCSchARwjJ?orCRowHRw~Jf@coOR_oF?w}Hf@oxJR{sQR{rJR{_GR_yFz@orWf@_aMnA{la@R{eIRwuGf@{rE?{Of@cgDf@{dGRwmAf@ckVRgfA?cvDSk\\?kWf@s}D?k_A?kjCf@ccA?_Xf@sdD?cGSchFz@olFz@{hO?{c@?swB?oi@bBwmF?kxA?cdCRc`@?oZ?wQRsxDg@g{CRcrAnA_zC?{m@?gkFRkWnAon@jCc|AnAgm@bGwyErD{vCrD{gCzEkgBrD_rBnAco@f@oU~C{hEnFkcDfEcnCf@_rB?sX?chAg@ckBRg}BSkk@ScaB?s{@?sI?sv@?{fARg}BScsCSo`GSgbH?{zASguASstAg@ckB{@s_DSw|Ag@gtDoA{tIoAwaGg@keCcBguF{@klGSkp@kCcpL?sXg@ct@g@csCsDw}HwBwfGoAk{BoAk`CwBsiDwB{cESsq@?_ScBsgERkxAz@wrAbB_yAzEgxBbLguFzEg}BnAg|@vG{oDvLknFvGwgDbBk_AnAchAf@wdCbBkdFnAk}FvG_oZbGkmXbBkzJg@wrAg@wy@wBcrAwBw~@{EkbBgEsjAwG{kAkH{pA{E_{@_NwkBwG{kA_I_~A_IczB{EoyBkC{nBg@{aAR{kARkfT?ccAf@w{DSoaInAcaBf@c~@bBwcAjCsoA~Cs`A~C{|@vGwrAfOgqCrX{wEjdAkjRnZk_Fz^o`G~\\knF?wBzm@sqJzE_v@zJ_cBvLckBnF_`AvGcrAnF_cBzJggCrDgfAnP_{E~HwdCzEguAvB{m@z@k\\f@{Of@gh@?wj@?oi@g@kR{@co@{@wVoA{^kCod@{Egh@gJ{|@sS{nBcGod@{Ec`@sD_ScG_XkHgYsIgYcLoZsIoUoAwBsDkHgEsIoAcB_I_N_NsSsN_ScLgO_NkMcLoKkMcLkRkMkWoP_hB_eAocRkbL_g@{YogAos@_g@c[od@c[ce@_]ka@c[gc@g^sb@o_@ka@o_@ovAovAo}@c~@cpBooBgdBgdBgpAsoAwy@kz@os@{r@{lC{lCo{Ac|AwkB{nBoxJoxJoAoA{@{@_IkHc[gYgc@{c@sb@od@{OcQcBwBw[{^s]gc@s]od@cL{O_IoK_Xc`@kHoKce@ct@w[{h@wV{c@{Yoi@gTsb@kRc`@oKoUsXgm@wV_l@g^kz@sb@gaAg|@cuBgkAwnCsrB_{EsXco@{Y_l@wLoUsNkWkMsSoU{^oUk\\gTsX_ScV{|EsjFco@{r@smBgsBgc@ce@_q@gr@cj@sl@gh@kk@knA{uAgY_]{Yw`@cQwVkM_SkRw[_]on@on@{kAcj@_eA_b@ox@gOsXs]co@_l@seAc[wj@chA_rB_hGguKcLoUgJoU_IsSwG{TcG{T{EoU{EcV_D{T_DsXkCgYoAkW{@kWnAoxTg@sdN?_~Ag@s_Xg@c|AoAgrE{@osE{@_hLg@orWRo{AzEk~CRgfASwmA{@w~@oA{fA_SsoKSwLgTghTg@gh@f@c`@f@oZnA{YnAkWbB_X~CoZbBwQjCkRfEoZfEwVbGk\\bLsg@fJ_]zY_`Arb@c|A~CcLrNkf@zOkp@~Ho_@nKcj@vL_l@rIc`@rD{OjCoPjCsNbBgOvBwQnA{ObBc[f@{OR_S?{OSoPSgO{@oPwB_]cBkRcB{OoAcL{EoU_DgOo}@w{DwV_eAsSw~@spC_rLwpBouIcVgfA{TccAcL_l@gYsyAkRchA_Ng|@_]w_CcL{aAsI{r@_I{w@kCk\\cmA_aMcGsl@weEwgb@gdBo~QsI{r@oKgr@cLsq@_N_q@sNkp@oPco@wQco@_}D_tK_Swj@sfHgeSwQcj@csCgeIs]o}@ozDgzK{nBovFogAo|CgJwVssDchKo}@skCkf@_jAoi@ccA{r@ogAs{@{kA{yIwrKkfEwcFsoFotG_NoP_{@wcAkwIcmKkkEcmFgw@s`Awo@wy@{m@ccAon@ccA_q@gkA{fAswBcvIkiPoi@{fAcuBc{DojB_iDs`AckBco@gfA_`AsyAseAwwAsqEkvGg~D{zFsb@oi@oZsb@g_Bo~Bo_@sg@gm@o}@sg@cy@cj@chAkk@cwA{JgYoUct@sSku@_q@ktCszCo|MwcFsqTc~E{mTg|@wvD_jAwcFseAkzEo_@kbBgh@wfBwe@stAco@guAkz@_yAgaAksAg|@o}@_v@_l@obAos@gfAon@_zCs~A_zCk}AkdAce@{aAsg@_rBcrAkiAs`A_q@gm@wV{TkgBkbBgaFwtEoKcLstA{kAka@c[k\\oUkR{J_IgEwLgE_]wL{c@{Oc`@oFka@wBoUg@{^?gc@z@_b@fEshGrtA_NjCcsHrcBg_Bn_@os@zOswBrg@wo@vLct@rI_l@rDgr@bBkz@g@sl@wBce@_Dka@{Ekf@kH{m@wLgh@sNco@sS_`Aw`@_]wQkf@{Yk\\oUwuG_eF_NoK{uA_eAsg@_b@_SsNcaB{pAoKgJsX_S_SoP_]cVo|CgbC_DwBcBcBod@wVwhA{|@gpAs`A_tAseA{^c[oZkWgh@sg@ka@_b@s]c`@_b@kf@k\\sb@sSsXsXo_@oPcV_NgT_Sc[wQc[_S_]sS{^gOc[_X{h@gTce@kR{c@w[gw@c`@gaAccA{gC{r@_hBc~@s|B_]s{@{m@o{A_]_{@gw@gnBon@g_B{c@{fAgh@crAka@kdAgc@ogAgc@kiAgTcj@gOw`@c~@{}Bo}@{}B_]kz@_b@seAo_@{aAcmA_zCsoAwbD{|@wzB_v@_mBcQw`@sSgc@{Tsb@{OgYoPsXgO{TgzAgsB_cBg}Bco@_{@gJkMs`AcrA_hBocCkxAcpBkdAovAkz@sjAccAguAsI_NkMgTcLsS{JgTgJgTwGwQkH{TkHoUcGcV_IsX{E_SsNgh@_`AkrDwo@keCc|A{_GseAkaEg^_tAwj@gxBolA_vEos@cnC_S{w@{jDktMoP_q@sv@suCsv@owCg^stAoKw`@kMsb@_Nka@oUkp@oPc`@cQw`@kRc`@s]wo@gYce@kRgYwQwVwVw[cVgYkM_NcQwQgYgY_SwQw`@k\\ka@k\\c`@w[{w@_q@ocCcpB_b@s]_l@_g@{m@sg@s`Awy@_q@kk@_]{YobAox@_l@_g@soAkiAoPcQkMsNgTcV_X_]cQoUgOgTcQ_XsXwe@os@gpAc~@_cBsb@_v@gw@kxAgO_XobAkgBwj@wcAkp@{kAomCk_FogAwpBgaAshBoUo_@oZ_g@oZgc@w[gc@oU{YgfAoqAox@s`A{m@wt@s]_b@sSwVsv@c~@co@sv@o`BgnBkz@wcAklBs|Bs~AgnB_`AgkA{w@_eA{pAklBoPkW_b@ct@sq@whAwQgY{Tg^gm@s`Aw[_l@c`@on@kW_b@_NgTotBsdDcV{c@_NoUwLoU_cBwiCox@oqA_wBgoDwLgOkR_S{ToUgYoUsXkR{^sSwQgJkf@wQsb@oK_l@gJs`Fod@wnCc[wj@kHsl@_Isv@_IwfB{Tg^{ESS_XoFo_@{J{^wLs]sN_vEckB{O{EkMkC{OkCgYkCsXoA_S?_]vBc`@z@kk@bG{zAbG_Xf@{m@~Cg^nAoUScQg@wQwBcQsDoPgEwQkHsSsIkMkH_N{JoK_IgOsNkM{O_NwQ{O_X_NgYoKsX_IoZ_Ic`@sD{TkCsSwBcV{@_N{@{Tg@kM?wQRwVz@sXbBc[fOkvBja@_qEjp@wqIrDsg@~Cw`@bBwe@nAk\\nAka@f@{Yf@{TR{Y?gT?o}ESc`E?skH?{wE?ku@Sod@S{Tg@{T{@gToA_S_D_XwBcQkCwQsDsSkMct@_Ice@gEwVsD_S{J_l@wGw`@_DkWwBgOcBoPoA{O{@oPSsSScQ?kW?ox@RgpAf@wrAR_oARgkA?ktCRwdC?{aARg_B?ovAf@wgD?gfARsl@?kdAR{xBz@wmARcrA?k\\RgeDRczB?cfB?scBRkqBRgdBRgw@?{|@R{|@Roi@Rc`@RoUz@_g@z@w[z@kWbBgYjC{c@~Csg@zEku@fEkp@jCc`@~C_g@fJwrArD_l@nAc[nAc[nAgc@z@kf@f@k\\?oZRon@?{|@Rc`@S{qC?{}BSw`@SsXg@_SoAcQoA_SwBwQcBgOgEsX{EkW{EoUkMkp@kMon@kR_`AsI{c@{EkWgEkWsDgYsDcV{@_IsIcy@cG{m@wLc|AsIg|@sNwaB{JgfAk\\kmD_b@onE_DgY_DgY_D{YoAkMs]ouDkCc`@{@oPg@sNSsXnA{w@rD_b@nA{Jz@wGrIw`@~CkMrX_jAbGkWzJ_b@~C_SbBoKvBsSnAcQf@oKz@_NR{T?sSRwQgE_bE{@caBg@sSwBscBg@cVoAcQoAkRwG_l@kCoPsDwQ{EkRsD_NoPco@cQon@we@gdBkH{YkHoUoAgEcQoi@w`@wrAoFwQgEcQsDoP_DcQoAgJsI{m@cBcQ{@wQg@gJgYkvGkH{aAgEwo@{Ewt@oA_]_D_l@oA_g@{EguA_X_zHwVwvIwGsuC_DwrAgEw|AoAco@oA_l@cBox@wB{pAcLoiEgJ_nDoAgm@?_SSco@nAszCz@ce@vBoeBvBklBnAstAf@s`A~CkjCbBoeBbB_yARco@RgzARcmARwaBf@giB?ccARklBf@kjHRcy@RohHf@oeBz@s_IRgaAR{iBf@ccARsl@R{YR_Sz@_NR_NbB_SbBcQvBoPjC{O~C_SfE_SrD{OrDkMfEwLzE_NnFwLzE{JnFcLjk@gfAfOsXfEoKbBsDjCwGbGcQvBsIvBsIrDoP~C{OnF_b@z@kHbBkWz@_N?sDf@oZ?_ISsNSgJ{@{ToAwVwGkf@kCgOcB{JkHcV{Oc`@sIkW_DgJgm@cwAcQw`@{Tcj@cLw[gh@soA_Nk\\wVgm@{JgTwLgTgTw[oKkMkM_NsNkMwQ_NkH{EkMkHwQkH_S_IkWsIgw@oU_`AoZs]oK{|@sX_N{Eo}@sXgY{J{JsDgJ{EcG_DkHsD_NsIcG{E{EgE{E{EgTgTgJcLsIwL{JoP{EsI{E{J{E{JkHcQkCkHgJgYcGgT{E_SsDcQ{YogAgTos@wLo_@gEkMkC_IgEoKoFcL{EsIcGwLoFsI{JsNcL{OsNoP_q@ox@k_AchAwV{Y{OoPwQwQk\\sX{w@sl@gvC{xBs]wVsIcGoqKkcIc[cVg^wVooB{zAwo@_g@oP_Nc[gYwQcQgO{O_N{Oc`@od@gO_ScQcVwLkR__Dg|E{dBglCoK{OwQwVcLgOsX_]sI{J_NsNw[k\\cLoK_XoUoUkRkf@g^{O{JkH{Egc@kWkf@kWw~@cj@{aA_g@{dBw~@cj@oZ{lC_yA_NkHcj@k\\sIoF{gCwrAkpE{bC_XgO_mGsiDclIsqE_]_ScQoK_]oUwQ_N_DkCctEgtD_`Fc`EktCc_C_eA_{@_~AgpAsXcVg^_]kCwBoZw[k~C_dDwhAolAsXgYknAcrA{vMgjNg^{^od@sg@sg@sl@w`Es`FsI{JsNcQwBwB_qEstFs]sb@{cEccFsXg^wQ_XcQgY{OoZwLoUsNk\\oFkMkMs]{E_NwLw`@{Jo_@oAcGcG_X_Ic`@_DoPkCcQoFgc@{Egc@s]gyDkgBkyRsDs]{E_]oF_]cG_]kHk\\_Iw[sIc[{JoZoAsDkH{T{JkWwLsXkMsX_NkWgOkWgOcV{OoUoPgTkWoZg|@w~@we@_g@oqAoqAc_MwiM_eF_jFwuBgxBs}IweJsNgO{kAwmAcVcVod@we@oUcVwQwQkiA_jAgfA{fAkeCciCgh@_l@_mB{nBoPoPkCkCoUsSod@w`@g^kWgTsI_S_IsS_I_SoFwQ{Ew[{J{OcG{TwGsSsDc[_D_l@oFgnBsIgaAoKgaAoFg^kCgY{@kWoAk\\cBc[kCcQwB{OsD{TkHsSsI{TsIgToKsSwLcQcLwVkRoUsSoUgT{TcVwrAwrA{w@ox@sgJ{hJco@wo@{pAcrA_yF{zFkk@_l@kz@ox@wo@wo@{sBkvBw~@gaAstAgzAct@cy@gzAscBgiB{sBk}AwfB{nG_kHksFwkGoPkRcxC_dDsSwV_S_XkHoKwQ{YgOkWgO{YsNc[wL{Yg@{@{E_NskCgvHwGkRkHkRgm@kbBsDwLsIgT{E_NkHkRgYwy@c[o}@guAcvDgc@soAgJ{TwVwe@oK{Oc[sb@_XgY{T_S_SgOsSgOsIcGsq@s]{sBgw@g^_NkkEo`BseAka@{pAkf@w`@gOgyD_yAooBct@{c@oP_l@{TcfBsq@sg@wQ{r@_XwdCk_A_dDwmA_]kMcy@c[ox@oZo}@k\\ouDovA_NoFoqAkf@gr@wVkMgEw[sIoZkHkMwB{^wGg|@wLos@sIw}Cw`@ct@gJc~@wL_{@oKgpAoPcnCs]oZ{Ew`@sI{OgEoUkHwQcGcGcBgh@oP_IkCwLsDoUsIwQoFcLsD_SsIgJgEsNsIoFsDsNwLwLwLwL_NoF_IgEcGsD{E_IgOgOc[w[{r@_Nc[gJkRkCcGw`@o}@gE{JsD{JcLk\\_IcVcBkHkC{JgEsSkC{OkC_SkCc`@wBce@?{{Cz@{}BvGksFz@kf@nKkrIz@{w@vB_~AzEs}Dz@sv@fE{{CbBg_BrDohC?sb@?w[Sod@g@{Y{@_b@g@cLS{ESkMwLgbCkCkk@gE_{@sIojB_XwmFoP{jD_NcnCkCgm@wG{pAcBk\\_Dct@cBka@gEgw@cBo_@{@oUkCox@kCs{@oA{|@{@{aASku@Rw~@f@sv@z@gw@bBku@jC{pAvBwhAvGwbDvBkiAzTg_L~CwwArD_mBvBchAnAos@jCchAvGgoDbBogAnAchAf@ccARcuB?gY?c[wB{~DSc~@_DcnHg@wrASsyA?whAnA_}Df@seAz@gdB~CsuHjC{qH?gJf@sq@Rc~@f@{uARku@z@smBbBkfE?cGnAcgDbB{jDf@od@z@gfAf@obAz@wt@nKowMf@co@fc@gnj@nAggCf@_fC?k`CRsrB?_aCRkbB?w_CRwkB?oqAR{sB?{zA?ka@RskH?gbC?gsBScfGRo`B?opIRg|E?gcE?kbBR{xQ?sb@?we@?{^?ogA?kuE?sb@Rwo@?{^?klBS_pCRkjCRo{A?{O?cG?{gCRkxASos@gEsiD?_g@wB_zCwBswB_DogFwBskCkC{cEoAgnBSoP?oK_DoxEoAknAg@wj@oAorCkC{vC{@_v@S{c@SgYg@co@SkW{@kgBg@_q@g@ce@?o_@{@gh@S{c@g@kf@Sct@SkRg@{r@Ss]{@_tASwo@{@gfAg@{m@g@crA?sXRwe@z@o}@nAox@vBgaAz@_XRsXjC{kA~Cc|Af@gYnAod@f@wVz@ce@nA{r@bL{|ErD{dBbBwy@nK_eFvGofDjCokDz@kmIRkyC?s~ARsrBRswGf@kwDRk`Cz@ssNf@_eF?{_BRgzAf@snD?{E?kC?sq@R{cERg|@Rc`@Ron@?kuE?gOf@_fHRozDg@wwAcGggHkHkyHoAgkAg@_q@S{TcBwwAcQcsRwB_sDoAw_C?w`@g@{dBg@sb@{@g`DS{r@S{h@g@gzAoAofDSkz@g@_{@Sgr@kCwbIg@s~ASkbGg@os@?obAg@kz@cBo~BoA{sBoAs~ASoi@{@o`B?_tAg@whASgvCRcwAfE{dBzE{uArNg{CzYwrFrDgw@vQ_}DrDgr@f@wL~H_wBbBcj@f@guAoAcmAwB{r@cBsg@kC_q@oF{fAkH{}BoU_tFgJg}BoK{nBoAw[wBw`@cB{m@ScVf@{c@?gYRc`@jMoqFfEolAbLofDvQwrFrI_zCbGk}AvBwj@z@gm@RcQbBkdFnA_uC?{aAz@krDz@g_Bz@omC?{|@Rct@R{YR_`AnAct@RoU?_eAg@_xDwBcrF?crFcB_tFwBcrF?{OoAwcFg@crFoAguFSg^oAsjAScxCg@w|AS{w@g@olAwB{jNRgm@{@{gCSk_AR{Tg@_qE?wBg@ka@?wiCf@whA?sD?{TRg_B?_zC?wG?kHf@otBSgpA?s_Dg@ce@RobAf@cuBRcLRsS?wt@vBc_CSc[Rkk@Skf@RsoA?sqERceE?wvDR_v@oAomC?{TnA{~DSw`Eg@_bESkkE?kWf@siD?kjCRkk@SwVS{aARkiAg@ka@?gc@?sXR_]z@cyE?soASsiD?cmAS{pARce@?gOf@_`AR{pA?cj@RccAf@_yAR_b@?{YoAk_Ag@wV?we@?gc@f@crAf@knAz@ogA{@cj@Ssg@S_g@Sw`@z@ka@f@os@?kRg@opD?s{@S{O{@oi@So}@S{J?we@?cLg@k_Af@oqA?_]RksASw`@{@co@kCweE?od@S__D{@oeBg@k}A?sl@?ce@?gYSsb@f@ku@RkWSsXSsXSsDg@wLSgO?gm@f@kiAoAwy@?sq@?sXR{Y?_l@Rkz@{@wt@S_g@g@sb@SstA?{Y?_q@g@ct@g@_l@?s]f@o_@S{pA?{YRkgB?{h@f@wj@Ron@f@co@f@w|AR_b@nAgsBf@w`@jCovFRcV?gpARo}@?{OjCgiBz@cmAnAcuBR_oA?oKRkeCR_aCSw[R_`A?wwAg@c|A?o}@?chAf@cjE?kp@?waB?sSSkp@Rg^?s]g@k{Bz@{dBSc}CSkqB?{sBf@opDf@ojGnAobA?cVRgzAz@caBf@sN?ku@zE_nDzEsqJf@k_ARcQfE{rErDsoFRgh@~CghE?cmARsInA{c@fEweEf@c`@?c|AwB_rBkCseA_D{lCg@wV_DolAg@kMkCkqBkCczB_Dc~@wBkbBSgJsDw|Ag@{pAg@on@{@_{@{@knAf@w~@RwrAf@{h@nAo`B?kWvBswBf@c`@f@spCz@kbBf@w`@bBcuBf@kz@Sg|@nA_wBz@s~Az@k_AnA_oAz@olAoAkzE{@krDS{r@cBklB{@otBf@gsB{@k}A{@ogAg@ka@?sjA?sl@R{h@SwmA{@s]{@gkAnAo}@cBooBg@ooBSwLg@{pAf@c_CSobAcBo`BRwy@z@cmAg@soA?_jASgaA?wVRsq@RksARon@?wtO?omCjCwwAvLcwAv[o`Bn~BgeIfY{kAfTcwAnKkgBz@{dBoAcoJf@osJ?gfF?smBoA{wE?gkAz@w|F?_pC?_vE?gkASscGRwkQSs{Tf@gyI{@s~Fz@k|IwBc~@kHchAcLseAstAc}M{w@szHgm@{nG{EobAoAolAS_tFSwlD{@czGRgbCS{}GjCkaEnFgkPnKgoSnFc}MrDcnHf@srG?w`@R{hESszCf@srGz@_jKf@obPnA_wQ~C_bTnAcvInAcgDoA_iDnA_aM?_sD?oyBg@gsGf@gbH?czQRoeG?oxE{@skM?g_GcBo|MSouISwcKcBgmT?cyOg@s{E~CknAbLgpAfTwmAv[knAnlAo}EjR{aAjMseAbG_eAf@ogA?ggH?gmTz@cvIRs`K?gxL?_rQf@crKf@keM{@cfLSoaNoA_wL?_gOSgyNoAcyE?_uHg@ocCcBspCgEg~D_IomHoAkiAsDcjE_NgkKkH{lHsDs~AsDkk@_Dc[_Iwj@wGs]kHk\\cVkz@{Osb@{Ow`@sNwVwV{c@gh@ku@_hBwdCorCsxDshBsfC_cBk{BsjAk}A{|Ec_H_rBgqC{eDgrEk`CoaDsN_SkW{c@c`@s{@sIcVkWk_AcL{m@sN{fAwG{xB?kW?gm@?{eISozDRkiFRw|AR_dD?gfARseA?seARskCnAodORgfAf@cuBRk}ARknKS_kCz@_eARgm@f@c|A?seARgm@?seAnAcfLR_~A?wVRsvERgh@?oU?_eA?{sBRkdA?_eA?{c@R_oAf@gxGRksP?w|A?w|ARkoH?on@gEotBcLc|AwBcVoFsl@kW__DwL{zAkM{zAwL{zAwBcVgEsg@wQswB{aAcpLoF_q@gm@syFwLcj@_{@koCwGsSg|@koCwj@cfB_b@{pAstAcjEgYs{@cpB{iGg_B_`F{~Dk`MwsCw{I_b@oqAsXg|@kxAccF_b@cdCs]cvDsX{fF_D_q@sb@oaI{Eg|@wVgwE_SsxDcL{sBsXogFcGkdA_q@gqMsD{m@cLgsBoAcVoKgsB_D{m@oAcVoAwVcL_wB{E_`AoK_rBsIo{AoF_eAoKgsBcQkcD_Iw|AsIc|AsNwnCcL{sBw`@kxFc[wuBkWkgB{TcwA{TwwA{TwwAsDoUoUwwA{TwwA{TcwA{O{aA{TwwA{O{aA_Ikk@_{@sfHcQsyAgw@cpGoi@ctE{^sdDcGgm@gEg^sIox@kHkk@cLobA{YsfCwt@klGwG_l@sb@_sDg^c}Cgc@_sDoPkxAsb@krDguAklLsg@oiEg|@_zHon@{pF{c@kwDkCoUgr@_fHcVs_D_IwcAwLgzA{O_rBcBoU_S{gCsSohC_S{gCgc@wjE_DsN{T_eAwVg|@wG_Sw[cy@_{@cpBwe@{kAwQwe@_yAkhDcj@_tAwo@o`B{m@_~AgoDkmIooB{|Es_Dc}H_dDc}HwwAsnDo{A_sDw|A{oD{Oka@cy@_rB{r@scBoeB_gEcQsb@gJ{Y_I_XcGwV_I{^{Jcj@_DgY_Dk\\_Dka@cB_b@oA{c@Sk\\SgpASkgBf@os@oA_oF?od@SgdL?o`GSw[S_mBSkhIR{|@?{TS_`Ag@gzAg@cpLSwiH?g`D?cpBg@goI?ojBSku@?koH{@obAR{aASw`@g@c`@oAw[g@oPoPcyEgJowCwBcj@kCox@kCkz@gEgkAsDccAsD_oAoAkf@S_l@S_b@Rsq@?sb@?cbDRcwAg@wVRoqAf@_}DS{`DSsjASox@R{kAnAgpAS_]z@s{@?w|Af@co@nAgm@jHgyDzJs`Ff@c`@f@gTnAkk@jCobAvG{oDRcBrDklBnFw_CzEomCf@gc@jMshGvL_~AjW{bCRoAf@oFz@cLvBsb@f@{Eg@sv@RwbD?ku@g@we@g@wLcBwQwBkR_DcQcG_X{To}@_]{fAkMsb@oAgEkHg^wGkf@wBkWwBgm@Sgc@RgaAR{aARwe@vBkeH?wzB{@_oA{@obA{@sIkC{YoFgc@cLwt@kM{m@gY_eAgOoi@oi@_rB_D{OgJsb@oK_v@gEwj@cB_XwBon@g@{r@g@scB?kMS{r@_D{sGS_`A{@gw@Ros@jCowCvBkdAvB_`AnAowC?wfB?gfA?gnBz@wuBz@{|@nAw`@nA{^z@{|@z@sb@jCcj@bB_v@bBscBrD_jAz@_g@f@kRjH_bE?_DR{EzEkvBz@c`@f@gYcB{aA_D{h@oFsl@_D_XkWcuBgYo~B_Xw_Cg@kCcGce@wGkk@cLox@wGw`@_Ika@oi@smBwj@wfBwaBccF{c@_yAkMo_@oZc~@c[ox@gJkRgJwQgEoFsXgc@kMgO_NsNsN_NsXgTgJcG_XgOg^sNsSwGc`@gJ_SwBcLoAoPoA{Og@ogAg@g|@g@_q@R_v@{@s]wBwpBs]ckBoi@_]oKcQ{Ekk@{O{r@{JcpBoPoUwBkxAcLwmAcLkf@sD{zA_NgeDgYct@sI_g@_DkHg@w[oAox@R_yArI_v@bBciCbQogAbG_g@z@wo@f@wGR{@?_mBS{`I?sX?_]?{fAoAc~@{Eod@cBsb@gEsSsDk\\{JgTgJkRoKw[{Y{m@sq@s]od@s]oi@cV{c@kMgYoFgO_DkMwLod@oFc[cBcQ{Eka@obAcnM_I{aAsl@orHogAcqN_Is`AcGgr@_~AkhSoKcrAsX{eDkMscBc~@swLchAkmNcG_v@sb@ovFkC{h@kCon@cBsl@oAgm@Swj@Skf@nAczGrDsgJRs{@fE{pKRc[f@{iBg@kbBoAwVS_DgEseAkRgnB_DoU_Nwy@kMwo@{kAwhFsl@_kCsjAseFcy@_sDwQkz@kW{fAkz@_xDw`@giBka@keCkf@g~DsNg_Bsb@{|EgdBktRcQklBoFcj@gOwwA_SscB{Jku@kf@wvDgr@kiFolAgcJwaBskMstAgkKgOwhAgJ{r@sDw[sD_b@kCc[cGwcAcB{^g@_XwBox@?{h@S{fARw|Af@krIR_jARwvD?{Jf@{qHf@{_Gz@g~D?os@RorCRszC?w~@g@whAcL_dNsNwlSS{c@sDwsC{E_fHgE_yFgE{nGwGsnIcGs}IoFsaHwGkwI{JsqO_DofDoFcmAkM{zAwQwrAgYsyAwV_eA_XoqAsX{zAsNc~@cL{|@wLksAkHovA_IczB_NweEgJo~BcLsuCcG{|@_I_{@wQc|AwVooB_q@olFo{AczLsoAgaKsoAsqJox@ooGwVkvB{w@gnG{YwpBsNsjAcGkf@gTcaBsXwzBsN_jA_S_cBo_@{vC_g@k|Dwe@gyDkWgsB_DsXcGod@kWcpBka@_dDsI{aAkCgc@sDwt@cBs{@Swo@f@sq@jCgaArIsyAbG{m@nKcy@fJsl@fOwt@zJw`@nn@oyB~W_`AnPco@bt@ciC~Wc~@rXgaAnbA_nDfiBotGvV_{@fJc[f@wBffAwvDfh@{iBnFgTzc@w|AbQ{m@zYwcAnZseAjz@wxCrXs`AzYgkArDoPrIwe@bGc[bLct@jM_eAjMwaBns@cmKrDka@jHwo@jCoZjM{}BfE{aAbBon@jC{dBRkMRsNvB_b@bG{|@jC_v@rD_oAnAod@~C{h@bBce@nAwj@jCsl@bB_]nFkiAbBgc@vBsg@jCk_ARkMjC{kAvBsq@~Ccy@bL_|BrI_rBbGsaCbGguArDksArDs`Az@sX~HklBbL_nDf@kk@bBgaAfEssD?wGnAojBf@kp@rDg~DjCopDjC{xBnFo{FnAkqBz@oi@bB_~A?gkAkCsoAoF_tA_D_b@oUglC_v@_{JsDsb@{Egm@{Esv@kRwnCwL_wBsI{zAgEgw@oA{T_D_l@cGsjAg@wo@{@shB?kp@?kgB?_rGf@_jKRkk@?ku@?kcDRgqC?s{@?kR?sNR_q@nAcy@RoUf@sb@bB_v@zEsuCz@_]z@{m@jCc|ArDoyBRkRnAct@f@_]f@k\\jCg_B~CwfBz@{h@Rgh@?_SRsoAR{rJRciCSsgEf@geDRo~BS{aAg@ox@?{T?{c@?gOR{m@R_`Az@wwAf@_v@z@gr@f@gYf@{YbBwmAvBcuB~HsjFR_g@jCojBfEo|C~CoeBf@s]nAgpA~MctJbBwcAbBwwAz@wj@rDciCfEcxCvBwzBz@cj@jH_`FnAgr@jCsfCzE_pCnFgbCfE{xBjC_yArDg_BbBgr@~CguAbB_v@~CcfBvBobA~CgzAnAkk@nFwiCnFohCvGowC~C{nBf@gTSct@g@kf@S{OoAo}@kCwj@oAce@_SgbHoAgm@wL{~DsSw}HcGgnBcL_lEgEguAwB_{@{Eo{AwBwt@_Ig`DsDkiA_DchAwQkvG{E_|BoAw[{@ce@g@kWwGovAsDshBcLcvDS{TkHwaBgEwt@oA{OgE{YoKku@kMgr@s]{uAkWgaAkMsg@_XccA_X{fAgO_l@wVseAcG{TwLce@cGsSw`@_~A_Ncj@wVk_AwQos@kdAc`Ecj@gxBw|A{dG_]cwAgaAcqD_Ssv@sXkiAg^{uAgOct@wGo_@gE{^cBkWsDkk@g@oUg@cLg@on@?wwAg@gaASotBRkqB{@giBSgkAf@_~A?_rB?cLRgER_NScL{@ka@?ox@R{fA{@smBg@kvBS{yDScuBf@ovAg@{fA?gw@g@oi@?ktCg@wj@Ron@f@kk@R{h@Ssg@g@olA?kiASct@R{^oAkhD?crAS_v@R_`A?co@?gJ?_oAg@sv@{@gcE?knA?gTf@soASwe@?{E{@koC?wsCS{xBSk~Cg@{vCRwfBRwiCg@wlD?ofDSwVg@obA?oPS_oF?wxCSgzA{@{dGf@clDz@{}Bz@ogA?oPRoi@?sg@bB_jFbBwmFz@gr@z@wbDf@_]Rkk@?{aASgc@S{c@cBccAcGktCcGk`CsN{dGkHkoCgJ{~DoFciC{@sl@g@w[Sw`@?od@f@od@f@w`@rN_eFnA{h@f@cQRgOfEo{AR_Df@oUnd@k}PvBstARg^f@_{@kH_jKoAkbB{EsmGSstASc|A?_oA?ciCcB__DkC_hQoA_fH{@cnC?_N{@o}ESka@gEsiN_DkqLSg^?cvD?od@?g^SgpA?orC?ohCg@w|PS{pAnAcxH?{sBf@_gE?{ERsdD{@w`c@?_wBSg_G?scQ?oqAg@syAoAsyAcQ_yKkW{|OoAcpB?oFSscBR_b@~CogKRg|@vB{|Jf@oyB?{Yf@{`Dz@clDz@ouDz@ojB?sSRsS?gEf@cj@jMkdF~RkjHnn@{dVjM_vE~CkxAnA_l@RoPf@kp@RwaBcBstF{@kjCcBczG{@gqC{@ocCg@suCcBghESs{@oAkeH{@gqCSkRg@_q@oAwfG_IcbXSod@g@ka@g@_b@oAka@{@_b@cBka@{@_X_I_fCoKkhDgJ{gCoA_b@kCg|@{@o_@{@wj@g@kf@Skf@?sb@S{lCScmA?ct@oAwa`@?_X?stAg@_~ARgr@SwkBR{zAScmK?oeB?ohC?cbDR_dD?csCf@c|AnFssIf@_{@fJg{MjCwmFnAsyAz@wpBf@cwARolAR{pAz@gsLz@_nDRkp@S{YScy@RkmDf@orCf@odE?wiCR_jFz@w`ESkkESw_CSseAcBksF?{^g@{|Eg@kbB{@kfEoA_oKwBcrK?os@SgqCSopD?kk@cB_vE{@smBg@kgBg@cmAg@{zAcBk|D{@sfCg@_rB{@wbDSwj@S_]{@guAg@caBwB{bHg@wpB{EcnM?co@Skk@Rsl@?{r@z@o}@rDsbEbBwhArD{rEz@on@Rct@fJkcIbBooBf@_hBRwe@S{w@?ggC{@stF?k}Ag@_vEg@ccFS_pCg@wpB?{gCg@__D?gkA{@clI{@kwDg@ktCkC{xG{@_{EoAs|B{@sfC?wkBkCcmKSsq@RolAvBodEz@_wGbB_mGnA_vEz@{tD?w[f@_cBf@sfCz@odEz@{fARc~@z@obFf@ooBRwt@f@sv@f@sXf@cVRkRnA{^fEgfA~R_eFzEkdAz@wVjCgr@rDsjArD_v@bGwwA~C{w@jCos@zEsjAfE{fArDk_AfE{fAnFguA~Co}@nAsX~HooBzEgkAjC{m@zEknAvBwj@fEs`AfEogAz@sXrD{|@fJ_|BvBce@vBgm@rDkz@jC{w@rDku@bBgc@vBon@zOw`EbQkfEzE_oAnFstAnFoqAvL{vCvL_zCfJcdCfEkdAvG_~AnK_pCbBgc@jCwo@jCwj@fJsaCjWckGnFstAjCsq@bLorCnKcnCzO_xDbV{_GnAsb@bB_b@rDs`AzE_oAjHgdBzEwhAfEogAnF_tAnAkWvGgdBvGgdBrDkz@jCs{@z@{h@z@cj@RcwAf@s}NR_tFRkxFRstFRwyE?gY?{uARkyC?_oARwhA?kRRskH?wuB?cV?_v@RwcARomC?skCRorC?_uCRk\\RgbCRkcD?guA?guA?knAf@ktHRsnD?k`CRsrBf@gfK?_fCf@_qJRwbD?k~Cg@co@g@{r@kH{eDgJwqDwGo|CkHszCgE{_BkH{eDcBkk@{@sv@g@oi@Ssq@z@c_Cz@g{Cz@kyCvBohHjCwqIz@ocCz@kmDz@s_Df@sg@f@w_CnA{~DnAkaE?oZz@wzBbB_`F~CkaJ?gO?kHf@ox@?{w@f@kz@f@_{@f@kvBf@ckBf@ojBf@_wG?khD?o}@?o}@?ktCRc}H?o}@Sgr@?_uCR_gE?{sB?whA?soASowC?kk@?g|@Sc{DRkfJSgcJg@s~A{EgcJg@oqAsDs_IkCctE?sISkR_DcdHSs]SwGoAgeD{@knAg@gdB?ccARwfBRsS?s]?w[Rc~@jC{jI?_If@oyBf@klBnA_oFnA{uF?sIRg^nAonESkf@{@gc@{@{YoAc[SkHkCce@kCw[_Do_@{TotBoZ_zC_Ios@we@wtE{gCcpVsXwnCwuBkmS{c@_lE{Eoi@_Dce@kC_q@oAcj@g@wQkRwoYcG_nISgaA?{w@R{YRo_@nZse_@zJwpL~C_xDbBkvBnKktMnAwaBjH{oIR_SvGg{HbBwpBjCkwDRco@g@ku@cBgsBSkM?wGwLsmL_DkmDwBk{B{@sl@?kM{@sv@{@c~@g@oqA?co@?k_A?_aC?s`A?gO?csCSofD?sq@?gzARcaBf@cmA?gh@RseA~CsyF?oUvB{eDRgYnAczBvBwtE~CwwFRgJRox@~CgaFRsl@z@gaAz@{h@vBwj@vBoi@rDcj@~C_b@bGon@f@wBnFgc@jCoUbVsyAjW{zAj\\ooBjsAk~Hby@{|Ez^{xBfEcVz@{EvBkMrDgTrNwy@jHw`@~nAcsHjRsoAzJwy@fO{pA?cBz@cGzJ_jAfJcmAnKsmBfE_jAnA{c@R_Dz@od@f@{Yz@gr@f@_q@f@{qCRswBf@cuB?gfFz@goD?on@g@oZ{@ka@cB_b@wBg^wBk\\wt@k_K{Ewt@w[kaE{Eku@_Dwe@cB_]cBc[oAg^S_X?_g@Soi@~H{zKf@gkAz@gdBf@sg@RoZ~CcsCzE{xG~C{mEbBkmDz@_hBzEgsGnAckBnAg}BbBswBvBw`EnA_yAnA{xBz@cj@vBwj@jCwo@fEwj@nF{m@fE{c@zEo_@fJgm@nKon@vLgm@nFwVbLce@j_AsnDzc@_cBfw@cxCj}A{zFnuD_nNzzAcwFf|@kcD~_AopDby@c}Cns@omCvQ_q@njBsfHjHkWb[kiAfYgfAjRos@vLwe@nFgTrDkRfEkRfEkR~CwQfJ{h@nFc`@nFw`@jHsl@vGox@bBcV~Cce@nAc[~CccAnA{zAf@s]bGgsGRkp@~Cw`Ef@_q@nFsjFRka@~Hg~IrDwoEzOw_RnAojB?wt@?kf@Ssg@g@s]oA_b@wB{w@oAgc@_D{r@wVc_HkWskHcBka@cB{^{@gh@g@cVSk\\?wVR{c@Ro_@z@sXnAcj@jC{h@nA_XbBgYvBc[~Ck\\fEw`@bGsg@jp@_`Fz^wiCz^wnC~Hkp@fr@chFjMkdArIc~@vGolAjCgw@nAgkA?kqBSwy@?oi@{@smBSobAg@wiCSce@g@gbCg@wnCoAouDScj@g@ovAS_yASswGnAo`BjC{nBrI{eDvj@osTvGg}BjC_oAf@oi@R_g@f@_q@Sco@{@_|BoAolAS_v@sIcoJwGooGoAotBcBkiASo_@g@wt@cBwpBSk_Ag@{w@Sc[Swj@?wt@RsdD?olAz@skC~C_oZf@olFS{bCRksARgdBRwzB?gc@SgaA?k\\f@_lE?gORcxC?{m@f@oqAnA_{@~Cwo@bBkf@nFwy@v|AgeSrXokDvGs`Av|AsiS~z@k}KzOwuB~RggC~a@{pFbGku@nFwe@jH_l@zEsXjHc`@rIo_@bVw~@ve@scB~a@w|Aj\\gkArb@syA~_AgjDjR{r@nd@o`BvL{c@vQct@nd@{nBrSccArgEsnSfEkRrDoUjMkz@~Hwo@jC{Y~H_`AjCsb@fEs{@nAwo@jH{xGnAcfBvBsfCjC_fCnFcaGzTo{URkWnA{kA?oFf@kz@f@sv@fJksKjMwzQRoZRgh@f@o}@~C{wEbBo`BnAkk@f@g^RsNf@kjCfJ{oNf@{`Df@spCf@{kA?spCvB{|JRkdAf@sb@nA{^nAk\\vV{rE~Cw`@zE{r@bLcwAzEgh@bQ_~Afr@{}G~Hku@nKobArDc`@rIku@~\\cbDbVwdC~MknAbQw|AvVw_Cr]omCzO_tAzT_hBfT{iBvVsrBjWcpBr]k`CrNwcArSc|Azw@stFv`@owCzO{fAbVkbBr]g}BrIco@bGsg@zJ{pAbGw~@vBsg@bB{w@z@c~@Rk`RoAk_KoAkeHoAguF_DkkT?g{H?odr@g@__DS_X{@knA_DsrBgYcyTwGw|F_DwsCg@o}@Rsq@vBguAnAkk@nFwnCz@_b@jC{kAnUw|KzJccFrSgmJnA{m@bB_`AvBcwAz@gkA?_{@g@gd`@f@_mQg@{qRg@ghEf@k|IRwqDg@olK?_oKbBchAnF{w@jHos@zE{YzO{w@zJo_@~hIss]rdDcqNvVs`AvmFgfUzJ{c@vQ_`AbQkdAjHkf@jWsrBnvA_wLv|AciMrD{Yjk@{wE~\\ktCb~@cxHvcA{oIrl@kiFfJku@ngAsbJz|@_uHbwAsmLnUwfBrSgzAvQksAnF_b@zO_jAfOsjAbpBs}NnUgiBzE_b@vGkdA~Cwo@RoZnAod@?sq@ScqI?sXR{jISotLg@s}DR{|ERstKSoi@RgOSgfAS{h@Rcy@nA_]jCwo@jHkdAjRsrBrIwcAjHgbCRkp@?{h@wBccAkCsg@sD_g@{JwhAwGsg@gEsl@gE{w@kC{r@{@gh@Ssl@Rc`@jCgpAbBkf@~R{oDzJgxB~MomCjHksArDs`A~WkiF~\\oyGjCkp@j\\wpGj\\c_HvQokD~Cco@~Cos@rD{aAvBg|@bBg|@z@waBRgsBf@chAf@oeBRsaCz@cjEz@_nIfEkiZf@srBz@{`Df@sq@vB{|@~Cwt@jHoqA~M_~A~Ho}@rXoaDjR{sBzEgm@rb@{wEzOsmBjWowCzc@seFnUggC~a@k_FnU_kCzJchAzEcj@fJguAvBo}@f@_{@cBsyA{EksAkHgbCkHgnB_g@omM_SgzFsDkiA{@oU{@wt@cBwrKoAknF?whASon@g@orCg@c|ASwdCS{vCkCs{Og@gxBsD{bMoAczGg@_tAwBgrJcBcyEg@{zAgEgiGsDk{GkHgmJsIk~MSk\\g@wo@{JosOoAgdBS{^?cQ{@{nBg@spCg@obA?_eA{@{|Eg@clD?cV?oPg@co@Sw}C?{JSwj@Sw`@Roi@cBg}Gg@sgEg@oqAcBghO?od@nA_jAf@w`@bBc`@vQgjDbGkiAvQkrDrIgzAz@cQnPoaDzEs`A~HcwAbj@guKf^cdHr]_|GzJwaB~Cwe@nAoPzJwj@rIka@zOwj@vQce@~Rgc@zO_X~\\{c@nPcQnZcVfOsI~M_IbB{@b`@_XnZgOrSgJjnAgr@~mDcpBj_A_g@z^gTvQoKj\\_SjRcLvQ{Jz^wQja@sSb`@_Sjf@wVni@gYz^wQbwAos@z|@od@j\\oPn_@wQnA{@fEcBrDcBfEwBzEwBrDwBfEwBfEwBfEwBfEwBrDcBfEkCfEwBfEwBfEwBrDwBzEkCfEwBzEwB~CwBzEwBfEwBfEwBfEwBfEkCfEwBfJ{EzEkCzEkCfEwBrDcBfEwBfEwBfEkCfEwBrDwBfEwBfEkCrDwBfEkCrDkCfEkCfE_DnPwLfE_D~CwBrDkCfEsDrD_DfEsDrI_IrD_D~C_D~C_DfEgE~C_DrDsD~CsDjCkCfE{EjC_DrDsDjC_DrDsD~C{ErDsDjCsD~CsD~CgE~CgEjCsDrDgE~C{EjCsDvBsDrD{EjCgEjCsDjCgE~C{EjCgE~CoFrDcGbG{JjCoFjC{EjCgEjC{EjC{EjC{EjCwGjC{EvBgEjCcGvB{EjC{EvBoFjCcGjCoFvB{EvBoFvBoFvB{EjCwGbB{EvB{EvBwGvBoFvBcGvBwGbB{EjCwGbBcGbBgEvBwGfEwLvBkHvBwGbBoFfEkMbBoFjCkHvBwGbBoFvBcGvBoFvBoFnAgEjCwGvBcGnFkMvBoF~CcGvB{EvBoFjCoFjCoFvB{E~CoFvB{EvBsD~CcG~CoFvBgEjCoF~CoF~C{EjCsD~CoF~CgEvBsDrDoF~C{EjCsD~CgErD{E~CsD~CgE~CgE~CgE~CsDrD{E~CsD~CsDfEgEjC_DfEgE~CsD~C_DrDgEfEsDrDsDrD_DrDgErD_DrD_DfE_D~C_DfEsDrIwGfE_DzE_DjCwBfEkCrIcGnFsDrDwBzE_DzJoFrDkCfEwB~CcB~CcBvGsDfEcBrDcBzEwBrDcBfEwBzEcBzEwBfEcBrDcBzEcBrDoAzEcBfEoAzEcBfEoAfEcBzEoAzEoAfEoAfE{@zEoAzE{@fEoAfE{@zJwBvG{@zE{@rDg@zE{@zE{@nFg@fEg@nF{@rDSfEg@nFg@fEg@zESzEg@zESnFSfESzESnFSrDSzE?zESnF?zE?fE?zE?zE?zE?zE?zESzE?fE?fE?nF?nF?rD?zE?fE?zE?bG?fE?zE?fE?zE?zE?nF?fE?fE?bG?rD?nF?zE?zE?zE?zE?zE?fE?zE?zE?fE?bG?zE?rD?fE?fE?bG?zE?zE?zE?fE?nF?zE?fE?zE?zE?zE?~R?zE?rD?vG?fE?zE?nF?fE?nF?zE?fE?rDRbGSzE?fJ?vG?~C?bG?bG?zE?zE?fE?zE?nF?zE?zE?nF?fE?zE?fE?zE?nFSzERfE?zESzE?fE?bG?fE?zE?zE?fE?zE?nF?zE?zE?nF?nF?bwARzESfE?zE?zE?nF?rS?bwFf@vB?v`@Sb`@?vhA?jzES~pJSbzB?f`Dz@r]?zsB{@rg@Rz^?viC_DreA_Djp@kHby@wLzYoFzh@gObLkCzdB{c@bdC_v@fdBcVvbIcGbqNvBrl@{@zuAcB~lBvBjiASzE?rv@z@zT?be@Szm@f@f_BS~p@f@vdCRb`@Sn_@?bgDg@vjJR~dKf@ftD{Ob|AwVfuA{TfaA{TvfGgsBfYwLvrFk{Bvo@wVjyCogAzlCccAvaBka@~RsDrq@gOrNgEvVRrNnA~MbGrIvGjHvLnFrXSr]gEzO_InPkR~McLvBcQoAoP_IwGwGkH_N{Ec[_Dgw@Rwy@z@wuBjC{`IvB{jD?_Xz@c{DkCweYcBclv@?w`@sDcdp@wBwgIcGojLsNce^cBoic@?w`@?{kFvB{_[z@o{ArD{zArIk}AnPoeBbQsoAjR{|@fYolAfT_{@vQgh@b~@czB~z@ckBbaGk{LzT{c@rSod@nd@gaAn_@ku@fTod@n{Ac}CrS_b@foDspHzgCwhFfzAs_DzuFwuLrl@scBzc@{dB~k@wsC~RcaBvGwmAfEgzAjCopDfEszHnd@ojt@Rka@nA_hGnZg`b@Rw[rb@wft@bG_zCnF_eArSspCzOsmBfY_kCnd@wxCrcB_oKbVw|AbBkMzr@grEfc@suCjW_~Aja@ggCv[ckBf|@s~Fbj@w_HnP_sDrD{aF_IoqK_IwtEgEk|D{@k}A{Eo{A_NocCgOsoAwe@ohCc[{fAo_@ksAwy@{nBsjAsrB_Xka@sXw[_b@sl@w`@wj@syAk{Box@gdBgr@shBgh@wkB{^_mB{^s_DcLooBwBcj@cBcfBvG_ePvBw~@bG_`AvQ_mBb[_rBrg@o~Bvj@klBz`I_cVvQcj@zeDw~Jjp@{gCfE_X~a@{qCn_@{lCrSkbBf^_aCfpA_bJz~DkfY~jCwdRjkEgd[vhFki_@bL_v@fT_cB~CsXvLolAbG{w@bGox@fE{m@nFcy@fEwy@jRcqDnAoUr`Ac{SrSslEzE{aAz@sSvGcwAjCwy@fEwwAf@k\\nAwy@f@k\\z@kz@f@kxA?wy@{E_pW?{Y_DcfLSsg@{@c`ESgm@cG{sV{@s~A{@kdAwBwwAwLkcI_DooBkC_~AoFopD{Ow~J_DcuB{EcxC_D{nBcBwwAoAwwARwuBz@wwAbB_`ARkCvBku@jCwy@~Cwy@bB_]zEcy@vBk\\nPgsB~Hox@rIox@b[cnCfJo}@jHgaAzE_jAjCwwA{@wwAoAwhA{EkiAgT_pC{YwlDsNsrBcG{kAsDs{@{@ka@wBwy@{@w`@{@oyBg@kp@jCgjNnAsfMSgoD?gh@ScQg@cVg@wVoAsb@wBsg@cBgY_Dce@kCw[wBcV_Dw[gEc[wG_g@{Ew[wGc`@gJwe@sIo_@cVkdAkW_eAgJo_@_Ss`A{E{TsDoUcGw`@cGw`@sDw[oFsg@wBcV_Dka@cBw[g@wGkMkjCcB_b@{YwfG{Ewy@kHsjAkC_b@oPsrBobAstKw[krDsDgh@cG_eAkCsg@gE_`AsDgkA{@gc@g@oP?cQoAwy@{@{kAgc@ktsAcBwtT?gY{@{sL?gr@RwwA{@seFR_]nAwt@z@cVnAk\\bBk\\bBk\\fEsg@vBoUz@oK~Cw[nFka@fEc[bGw`@nFc[nFoZjMcj@rDoPbB_IzJ{^jM{c@~Msb@rIwVR{@jM_]~M_]rIkRfOw[bLcVzc@kz@jRo_@zYon@~Rwe@zJwVnAsDvLs]jHsSzE{O~H_XrNoi@bLwe@jHw[jHg^fEwVnFc[zEk\\fEk\\rDoZ~CoZ~Ck\\~Co_@bB{YvB_]bBs]nAk\\f@oZf@{^f@wy@zEglM?{h@?ox@S_{@oA_{@{@_]g@_]kCcy@wBos@oFobAcBw[{JovA_Iwy@_Iwy@oF_g@_Ion@sDgYkHkf@{Ew[wB{OsNg|@sIwe@cLkk@{Jce@sNwo@{Owo@sNcj@sNoi@_]sjAct@saC_l@kqBoZkdAka@{uA{Osg@oF{ToKka@wQ{r@oPos@wGw[gOwt@cVwrA{EoZ{Jsl@oA_IoK_v@cLs{@_I{r@_DkW_Dk\\gEo_@wB_X_I{|@{Eos@cGg|@_Dkk@gEk_A{ToxEsoAooVgc@k~HgYg_G_Dsg@wBw`@_XgfFsD_v@_Dcy@wBs{@cBwy@{@wy@g@wy@f@cuBrDoyBRsIbGwfBnKsmBbQ_wB~RgnBv[g}BnF{^~f@c}CnPkdAnPobArS_tAjH{r@bLo`BjHkvBR{sBoFgxB_N{sBcV_rB_v@seFsXgiBwVsrB_I{w@kHox@wGwy@sDsl@cG{fAwG_rBsDotB{@swB?s]R{`If@wrU?ogF?kpERgr@Rk~C?olA?w}C?kf@RwbDz@gsBvBwzBjCwpBrIcmFnAw~@z@wt@z@kiAz@ooBR{m@RoyBg@kvBg@_{@cBwuB{@kz@_DcuBkH_gE{@ka@g@ce@cBsoA{@{kASgh@{@kvB{@w}HScuBSwxCoAsmL?ce@Rox@z@s`AnAwt@vBwy@jCwy@fEg|@fE_v@bGwy@vGwy@fJwcAvGsl@zJ{w@zJ_v@nKct@rNkz@rN{w@rSobAnPwt@~Mwj@rScy@~Ros@ve@k}Arl@kqBnd@syAjgBcaG~lGc{Sbj@cfBr]{fA~_AkoC~k@caBnn@kbB~p@_cBnx@cpBvj@{pA~gBsbEbuBkzE~HcQfdBw{DvLsXjRsb@rN_]bo@o`Brl@oeB~f@kbBve@ckBzc@srBf^ooBnZwpBbVotBrS_rBzYg{CzE_g@v`@kaE~Hox@~p@c_H~p@c_HzJccAnFkk@nFwo@vrAk~MzJccAjR_rBbe@kzE~RkqBnZo|CzJ_jAfEsg@jH_{@fEchArDwzB?_jF{@_jKRsq@SkbG?_b@cBswBf@kcIScuBwBwiHkC_jFsDc{ISg^g@{zA{EgcJkCggHg@{|@_DgtDcBoaI{EgeISsq@wBgdGcBgcEkCgkFSoFcBwcF{EchAcG{kAw`@koCg^gpAsN_]oPsg@gYsq@shB{vC{JkR{Ts]kWcj@sSka@kMs]cQsl@sNsg@gJgc@cQs{@kMccAwG{aAwB{m@sDknA?wGnA_jArDwxCz@kf@z@o_@~CkqBnAsv@fEk`CvBguAvB{uARgTnFseFjCcmAfEc~@nFct@bGsg@bG_]~_AguF~iAk{Gb`@s|BfOwrArN_uCf@c|ARox@?cj@{@spH?{pASc|A?{T?ovA?wkBSkmD?_oFSscGoAs|L?sjA?os@?gbCz@ox@rDgxBvLktHRgTRce@g@ojGwB_cQ{@wxHwBoeQcBw~O_DgoN{@gsLoAggMwB{iQcBc}McB_tPoA{gMwB_tPwB{jSoA{`Dg@_iNoAgfKkCg`N{@wsHg@wzGoA_tPoFo{AcG_oAcQwaB_SsyA_]waB_]soAc`@cmAcVsl@oUwj@kdAwuBkf@_jA_Xon@o_@gkAw[_oAsXknA_ScrAgOcwA_NwfBoF{_BScaBcBseF?k\\_DoiJkC_uHg@oyB{@k{B_I_rGsXsyF_Dkz@sDwy@cBobAkC_mBcBguAwBcaGR_q@Sct@wBwgDf@cvDbGckBbGojBzEguAjC_`Az@kWbGshBn_@gzKz@kW~Mg~DnKokD~HgvCvB{uArDw{I?c}M?{wER{uPRo|M?wmF?{T?{wE?cj@?k_ARwkB?gT?{uA?_`A?owCRwoJRwxC?kwIR{zARstPSoyGoAoyGcBgrJcBczG{@_oFkCcjOgE{vRsD{eIkC{fKg@saCg@wkB?wj@{@c{IgEk_PoFojQcGgsLgEczGoFs`KwGgsLsDknF?wLwBghEwB{nB{@{}GgEocMg@kjCg@seAkHodToAwmFcBcgIkCglHg@g|@kCkaJ_D{fKkMwvb@wB{fF?wLsD{hOS{c@wBwoEsDgfPwBscGwBgbHg@w_HSk\\kCw{Dg@omCcB{qHwBckGwBs_IoA{kAcGgdB_I_eAg@oKwQo{A{Ok_AsS{fAoP_q@_b@gzAw`@{fAk\\gw@kk@{kAcG_Nkk@knAs{@wkB{O_]_jAocC_DwGwVoi@sSwe@{E{JkiFw|Kct@s~AoPo_@c_C_`Fsb@c~@{h@_jAsiDkoHo}@ckBgTkf@{Ywo@sq@{uA_X{m@sSsb@kMsXgJsSkCoFcGkMoA_DcBsDsD_IgEsI_yAk~CkjCovFkbB{oD{pAorCo}@smBs{@shBseAo~B{jDwnHckB_}DkiAcdC{w@_cBoeB_sD{fAkeCk}AcbDon@wrAk\\os@wj@olAkz@shBcaB_nDwaB{oDw`@{|@wG_NoK{TsS{c@gO_Xc[kk@wj@obAo_@cj@sq@{aAo{AwuBo}@{pAox@cmAwmAkbBksAckB{c@wo@kbG{oIwcAkxAka@sl@omCwvD{vCceEgvC_bEcdC{jD{JoPsIgJsb@{m@cQkWgc@co@gr@{fAo_@ku@{Tsb@oKcVo_@wy@oi@{zAcLk\\kRwj@{^wwAcBcGcBwG{Osq@cLsl@_Isb@kC{OcLos@_NogAgJct@wLw|A_Dcj@wBc`@oFkgBwB_oAcBsfCsIknK_DknFsD{tDwBskC?{ToF_kHSgY{@{uAg@wj@kCslEoA{zA{@w|AcGwgI_DgfFcBgpAcB{r@wB{h@{Ekk@_Dc[{Jct@cLco@_Sg|@_]whA{Ywt@sX_l@sb@wt@kf@gr@g^ka@cj@{h@oxE_vE_aHk{GodJc`J{m@gm@sq@k_Ac[_g@oZ{m@k\\kz@{Y{|@kRox@{Og|@_NgfAkH{aA{EsoAS{|@_DoeLSccA_DkmI?_N_DsoA{@s]kCkz@sI{{CcB{xBg@kiASkCg@sb@kCsbE{EowH{@{_BSsXcBgjD_Do~BoFkbB_N{_BoPguAsXkbBs]k}AsXk_A_]gaAsDsIw[_v@_]os@ce@kz@s{@{pAkRkWg|@gfA{vCkwDk{BwsC{lCokDggCkcDk{B{vCct@{fAcy@cwAcy@caBct@giB{h@c|Asb@kxA_DkMgJo_@_XgkAk\\oeBwQsoAgTkgBoKwrAgJsyA_Dos@oA{YkCwmAwB{iBkCwsC_Dk|DSkM{@olAgEwcFS_XcG_mGSwLSg^kCsdDwBsuCoFw{DkCciC{@gzAwBsg@_SseAcG{c@cGoZ{Jsq@cBwQgEsg@?ccAjHknAvLkf@~C_SbVoqAbo@sgEfE{YvB{TbBgTnAcVf@cVRw[g@kW{@kWgEsv@w`@oqFg@_IsD_g@{@cLcLovAkMklBoKg_B{Esq@sIc~@wLcfBkCod@{EwmAoAw|AoFk~HSccAf@kp@z@sg@bLggCbGsoArDoqA?cmAsIkaO_NwrUwBkbGkM_}SkMkdUcGknKkH{dBwL{zAgTsoAoUgaAo_@cmAoKkWoZgr@{Ykk@ce@sq@cG_I{^we@ox@wt@{h@{^wQoKgOgJsNsIg|@w`@sSwGgY_I_l@wL{lCgh@{|@gOox@gYwt@ka@on@c`@_q@sg@gm@kk@od@wj@wj@_v@oi@_`Aod@ccA{^_eA_Xc~@_Ss{@{TguAkp@sqE_jAofI_NwcAwcAskHoqAs}IgfAc}Hgh@wqDkp@kuEgdBs|LgiB{gMcL_v@gfAowH{TcrAc[stAoZ_eA{c@oqAcdCgsGsl@caBgYgfAgYwrAwQwwA_IgkAoAwe@oAc`@g@k|DcGo|MkC{eIoA_}DcGglMsDk}KgEwpL{Ec_MSgc@sDwgIcBwlD?wwAsDgvH?c~@cBwtEoAsaHf@wuBnAgfArD{pAbLgdBbQovArSwrAzr@gjDbQwcAnK{|@zJgzAjCccAf@{fAsDowHcGsePgEcqNSc[_Dg~I{@kgBSox@_DgrJ{@wnCg@stAwBwcAgEgkAkHwcAcQwaBkWkbBs]_~Aod@{_Bgw@czBwpBc|F{{Co_J_aCc_HoeBgaFoZc~@kRsq@wj@wnCgJwj@oZcfBkHw[wQ_v@w[wy@s]sq@sv@kiAc`@wo@c`@gw@gm@wrAgOgc@_g@syA{h@_yAwe@_yAox@g}Bwo@ckBwt@oyBszCk|IwdC{gH_kCgvH_v@czBgY_`A{YseAkMgm@oKcj@cL_v@_Igm@kHwo@wG_v@gEox@oFkqBg@_`ASojG?oi@g@oaI?sq@f@sb@z@{^nAg^zJ{kAvGkp@bBsXzJco@bGk\\nK{h@bLsb@jMce@bLk\\bLs]nPc`@rNk\\bj@seAjRo_@jHoPzJoUfJwVrNsb@zJw`@nP_v@bGsb@nFsb@nFwo@jCkk@nAco@?_eAS{kAg@cuBg@s{@cBsg@oAoZRgwEwBo{Kg@_rGg@kiF?wo@?wBwBwzQsDg{Csv@geIoA{^{E_jAwBsuC?ovFg@kiPg@_nInAchA~C_`AbGs`AfJseAfOcpBfEgh@~RohCjHgkAnAkMnF_v@fJcrAzEkdAbBgw@f@{m@Rwt@Sk_A?{aASofDS_}D?{h@?kiASgdB?gnBS_iIS_}D?_gERwlDS{nGSkgL?suC?_eA?_xD?wkBSsjAS_wBSsl@?_aCSgpFRw~@?gm@z@gm@nA{h@vBkk@jCgh@jCsb@vGku@bG_l@fEs]nFc`@~CsSnF_]zJwj@vQ_eA~Mwt@f^kqBrb@w_C~CsSbGc`@zEs]vGgh@vGkp@jHgfA~Csl@vB{h@bB{h@z@wj@Rod@?_q@g@wrASwkB?cuBcB_pHsD{rOSk|I?wV?sDg@sfCRsv@Rwo@Rgr@R{pAz@s_Iz@gvH?{lCRsq@z@kcNz@{iBf@{yIRoi@z@gh@z@{h@vBgh@vBwe@~Cgh@zEgm@fE_b@jHon@jHoi@jHwe@vG{^zJwe@vQwy@fTcy@vQwo@fOsl@rNgm@bLcj@nKkk@zJgm@fJ_q@bGgh@vG{r@nFct@bBk\\vBc`@nA{^nAsq@z@kk@RkqB?{fA?{~DRgbC?sdDRseFf@{mERcpBRwiHz@{aKf@cxCnAozInAwpLnA_|Lz@k}KnAkmI?{bCR{m@nAg|@z@gm@bBgr@bBcj@zE_eAjCsb@rDgm@zEct@vG_v@jMcwA~MwwAfTg}BzE_q@fEoi@jHgfAzEchAjCku@vBox@z@_v@z@sl@RcxCR_sDf@ohCRguFz@cqDz@gbHnAc}HSsrB?{aARobASwhAg@os@wBseAoAon@sDs`A_Dct@_D{m@cGk_A_I{aA{JgfAsIwt@_SwkBce@kkEce@weEsl@crFoAoKgE_b@oPkxAc`@goDkf@{rEsIwy@_I_q@_g@ctE_Ios@wo@waGoUk{B{m@{pFwVkvB{T_cB{OsjAcQsjAwVw|AsSkiAoUwmA{Yo{Akk@spCox@w{D_oAcfGgm@_zCgfAwhF_SobAo}@slE{TkdAsNc~@wj@cdCos@kvBwB{Jg@_IR{JnAgJjCkHfEwGvGgEvGoA~H?rIvBzErDrDvGjC~HnAzJRfJ{@fJwB~H{ErIwGbGkR~Moi@b`@_]zT{Y~M_SjH{TbGk_AvVc[rI{kAnZgObB_IRwG{@gEcBgEgEgEcGw`@cy@_D_IwBsI{@gJSgJf@cLrI_l@rI{h@vBsXfJsb@nKce@jMoi@z^{_BvaBwiHbt@k~CvV_jA~Mgr@fOox@vLox@rIon@jHwo@~Hcy@rDcj@zEku@jCkk@jHcaBvG_yA~Csl@rDce@zE{c@nFs]~Ho_@nKc`@fJ_XrNo_@jMwVfJcQzEsIni@wy@bVg^f^kk@vQk\\~MsXbLsXrIkW~HwVnF{TzEsS~H_g@zEw`@fEce@zEwt@fOktCbLk{BvGo{AzE_oArDwmA~CcwAbBobAz@wj@z@gaAnAczBnAgyDjCkaERkp@nAwfGRc[f@gkARw[bBwj@vBka@jCsb@~C_]fEw`@vGgc@nFs]jHs]fJka@fJs]bL{^zJ{YzOka@rN_]nPk\\bLsSjRc[bQwVzToZnP{Tb[w`@~MwQnU{YvVw[rS{YjRsXvQc[fO{Y~Mc[rIgTvG_S~HcVbLgc@rIw`@~Hkf@jH{h@fEsg@jCod@z@w`@f@gh@Rgm@f@{zKf@slJ?spCSgh@g@oUg@_SwBsb@sD{c@kCkWcGsb@wG{^kHs]kM_g@oKw[gJcVoKsXcQ{^cV{c@whAsrBgYgh@_]on@_Sc`@gOoZwQsb@_Ng^oP_g@kMwe@gJka@_Ika@_Ikf@wGwe@{Ekf@_Dsb@kCkk@cB{h@{@os@?sv@S{tI?oZ?oqASgpA{@seAoA_oA_D{nBwBgaA_Dk_AwBwy@_IswB_DwhAcBwy@kCkgBcBc|A{@caB?k}AjCghOf@c|AbBc~@nA{^vBgc@fEsl@bG_l@vGgh@jHsg@rIod@vQ{w@zOon@fuAobF~Mgh@~Rox@bQ_{@zOg|@~Hsg@vGwe@bLo}@rIc~@bGsv@rIknAzO{}BzYweE~\\s{Ef^sjFfJ_oA~MotBrDkp@bGgpArDc~@rDo}@rDcmAvGktC~CczBz@whAzEkmNnAggCRg^~CcvIvBsjFnAwrAnA{w@nAku@bBs{@vB{w@bBsl@fEsjAzE{kAjHk}AnAgYnF{pAbBgc@nAod@bBon@nA{|@z@_{@Rco@?{|@g@ku@g@kp@{@cj@{@sXwBwt@kCct@sDgw@oFs{@oFwy@wGku@oFsl@sIgw@sIku@kz@k{Ggc@wlDg|@cdHsNwhA{O{fA{OwhAcQogAgOs{@{TcmAgTkiAcV{kAoU{fA{TccAsScy@gOwo@{Ogm@sSsv@cQco@_Xc~@wo@oyB_~AchFwV_{@kRon@cVs{@_S{w@wQwt@_Ngm@cQg|@cQ_`AwLct@{OgfAsNchA{Jw~@oKwhA_IseAgYsxD_yAo|RgkAo}OkHc~@wLgzAcGwo@oP{dBs`AogKgJgaA{^c{Dce@_`Fka@{hE_~AwwPgm@_rGkH{r@sIwt@oK{r@kMwo@_Swy@cQgm@{Tkp@oU_l@{Ysl@w[_l@k\\_g@sX{^cVsXkWsXsS_Skk@gh@kWoU{aA{|@{r@kp@ox@ku@w[w[oZs]c[w`@gYka@wVw`@gY_g@gYcj@oUgh@wQ_b@wQsg@{Oce@{Ogh@oKo_@kMoi@wLoi@ovAo~G_q@{`Do{AkjHccAk_FoF_Xos@siDw~@coEct@wlDkp@c}Cgh@sfCgr@{eDsfCoyL_`AosE{^wfBkR{|@kRku@gTsv@oUcy@w[w~@sXsq@_Xon@o_@gw@c`@ct@o_@co@g^cj@oZsb@{^ce@{Y{^_]o_@{r@ku@oUoUco@os@wj@wo@ku@o}@ox@wcAce@on@gr@_`Akf@{r@we@os@sb@kp@sb@sq@{c@sv@ct@knAsoA{xBo_@_q@we@_v@c`@_l@_b@_l@we@on@kf@gm@ce@{h@_b@{c@kp@kp@sjFgkFo_@ka@c[_]wo@_v@sg@_q@oZ_b@_Xo_@o_@kk@gT_]gh@{|@{c@kz@sXoi@sb@k_AoPo_@_g@{kAwVwo@{Tco@ka@_oAka@{uA{Y{kAsX{kA_XcrA{^gsBgO{w@_]shB_]{iBs`A{fFka@cpB_b@smB{^c|A{EkRc`@{zAcQ{m@gT_v@oUgw@kdAoaD{c@ovAk}As{EkWgw@kWkz@oUgw@_XgaAwVw~@gT{|@oPos@oKsg@oKce@gYguAoPk_AoUwrAgT{uAsSgzAcLo}@gJgw@kHct@gJobAkH_v@wGkz@cGg|@oFwy@oFogA_Don@_D_v@kC_v@kCcmA{@{YoAos@{@kk@{@wy@Sc~@Sct@Ros@R_v@z@cy@nA{|@bBgfA~CksAbLk_F~HsnDrIgoDfEgnBnA_v@?_q@{@oi@kCsl@wG{m@gJwj@sN_q@wL{c@_Ssg@sSod@oUo_@oUk\\gTwV_SsSce@sb@oeB{zAc[{Ysb@_b@{Yc[oZo_@k\\ce@gY_b@s]{m@_]kp@sS{c@{Toi@cV_q@gTgr@s_D_cLg^gpAoUsv@kW_v@wV_q@sXsq@gYwo@oZgm@o_@gr@o_@{m@{^wj@o_@gh@wo@wy@{fA_tA_|BcsCox@ccAkf@sq@_b@gm@sg@kz@c[gh@ka@wt@_X{h@_Ska@wV{h@kk@crAod@_eAkWon@ka@c~@cVgh@we@k_A{Tw`@o_@kp@gTg^{^wj@gYsb@g^sg@gm@gw@{r@c~@{aAoqAwnCgoD_pCsnDguA_cBon@os@ccA{fAk\\s]keH{gHcj@wj@sS{T_SwVcQcVgTw[_Ss]{Ow[wQw`@gOo_@oPsg@wLo_@oKsb@sI_b@kHw`@wG_b@cGod@sD_b@_Dod@kC{c@oAsb@{@gc@Sod@wGwfQ?sXwBoqFwB{uF{@k_AkCs`A{EogAwGc~@wGku@wG{m@_Iwo@{Jco@oKon@kMco@sS_`A{Tkz@{O{h@kRwj@obAwxC_Skk@kR{m@cQsl@{Osl@cLkf@cQgw@wLon@{Jsl@oKgr@gJgr@_Ict@sIgaAkHo}@oKgpAcLwcAwLc~@{Jco@oKkk@kMkp@kMkk@kMgh@gOwj@kMgc@wLka@kMo_@_~ActEgr@wpBwV_v@_Xkz@sSct@gT{w@oP{r@gOco@oPcy@sSogAcQwcAsNobA_Ikk@wGkk@_D_X_Iku@cGco@oFkp@gEwj@oFs`AoFobAsDgfAwB{aA{@on@g@_l@g@g|@{@wqD{@ciCg@smBSod@Ss]g@sg@{@we@cBgc@cBwe@wBkf@kCod@wB{^oFco@oF{m@gE{^gEka@{Ec`@{Eo_@gJgm@oFs]wG{^gO{w@_I{^gxBo}JsjAgkF{zA_aHoqAkbG_eA_{EsoAs~Fsl@_pC{h@saCoU_jAoFsXsDcVsDwV_DwV{Egc@_D{^wB_XkC{c@cBwe@oA{h@g@we@?g^Rc[f@gYz@w`@nAc`@jCkf@vB_]fEce@nFwe@bGod@jH{c@fJkf@zJ{c@jH{Y~HsXrI{YrIwVrIkWrNs]fJoU~M{YfOc[roAk`Cn_@ct@rIcQ~HwQzOc`@nKgYvGwQjMw`@zJ_]bGcVbGcVvGw[jHc`@jHo_@nFo_@~CwVzEsb@bB{TrDgc@vB_]z@oUnAwVnAkf@Rk\\Rwo@RolF?gfA?c`O?cxHR{^R_]f@sXz@_XnAsb@nA{YnAcVbB_XvBgYvB_XjHgr@nF{c@zEs]~Hkf@bGk\\zEkWzEsS~Hg^~Mgh@zJ{^fOce@fOgc@zO_b@zOc`@vLkWrN{YnPk\\jRk\\~k@gaAjxAc_CngA_hBjbBomCvpB_dDvcAwaBzc@_v@fY{h@nZgm@nZ_q@rN_]~Mw[rScj@zO{c@vLg^vQ_l@rNsg@rN{h@rN_l@nKkf@~Mco@nKkk@nKco@jM_{@jHgh@vGsl@nFwj@nF_l@jC{^vBgYvBg^vBka@jC{m@nAg^f@sXbBwt@f@wj@f@wt@nAgbHnA_{E?gOf@kgBz@_}Df@kcDRocCg@{~DoAcwP{@_oP{@ojL{@svO?{^f@ce@z@sb@nAgc@bBod@jCsb@vBo_@zE_l@fEka@bGsg@jHsg@~Hwe@jHc`@vLcj@fJc`@zJo_@rI{YrNkf@~Mc`@rSoi@~HkRfOk\\~R_b@neBwgDfTgc@fTgc@bL_XbLgYzJsXnK{YfJc[rIoZjH{YfJka@jH{^bGk\\vGgc@zEs]jCoUjCgYvBwVfEcj@nA_XnA{^nAs]f@{Y?w`@?{m@sIs}]Sg_BScaB{@gnBoAogFg@_wB{@kgBg@_sD?{c@oAkoCS{r@?cVRk\\R{Tf@wQbBw[vB{YjCkW~CwVvGw`@nFcV~Hc[vLg^bLsXfJsS~M_XjWce@fEwGnPc[b`@kp@f|@_~A~HkMzTsb@~MwVzJgTfJ{TzJsX~HwVbG_XnFkWfEcVfEc[fE{^bBc[nA{TnAka@f@{c@f@{YfEslEfTwsRnK{wJvBwkBRku@Rco@Ros@?{w@Sgr@cBwtEgE{_L{@w{DSs`AwBsoFoA{|EoFkkO{@{bCg@cy@Swo@{@sl@cBsl@wB{r@{Es{@gEon@sDwe@gE{c@cGkk@kHoi@cLcy@{Jsl@kMsq@kHs]gJ_b@sIo_@gJs]oKw`@oK{^sNce@oPwe@wLw[sN{^oPka@cVcj@kRw`@syKsgTwpBw{Dwt@_yAs]{r@wQgc@cQ{c@sNc`@wLc`@gTct@oFgTcLce@sI_b@_Iw`@{EgYwGod@cGgc@oF{c@cG_q@sDsg@_D{c@_Dg|@oA_b@g@o_@Ska@g@wkBS{fAoF_rVcBgzF?{r@R{r@Rco@z@on@bBcy@bBku@vBoi@~Cco@zEc~@zE{r@bGkz@nKgpAve@cmFnZgoDbG_v@fEco@zEs{@rDkz@~Co}@vBox@nAsv@f@{r@Rg|@z@cu`@R{yNRcnM?_uCg@ku@oAon@wBct@sDwj@{Ekp@kHsv@oFsg@kMs{@_XcaBkHwj@{Eg^sD{^gE_g@_Dsg@sDcj@oAw`@wB{r@g@sg@?sl@g@weJf@waBf@gfAz@s{@nAgr@nAw~@zEs~AnFguAnF_eAvLk{BbGoqAjC{w@bBon@bBco@z@wj@Roi@Rwo@?sv@oAsoFwB_gJf@cpBnAk{BbB{aAnA_{@jCksAbG_wBfOchF~CcrArDkvBbBolARc`@rDs_Df@wj@zOcjOrDo_Ef@syARsnDSo}@g@cuLRciCRgzAz@seAnAoqAjCk{BfJ_mGf@_b@fTgmOj\\{_VbQcuLfJooGbBcpBz@_tAz@ofDScmAS{fA{@{dB{@wcAcBoqAoAgaAkCg_B_D{uAoAsb@gT_|GoFwfBkM_bEgO{wE_DcmAgEkvBkCkbBoA{kAoA_yAkC_qEwLssSsIkmNwGoeL{@ccAwB_{@sDku@{E_q@wG_v@{Jo}@{YgiBgEkW{^wzBcbDw}R_Isg@gJco@kH{m@sIs`A{E_v@_Dg|@cBwt@g@g|@Rgw@bBc~@vB_v@zE_v@zJ{pAjf@syFrNoeBzOoeBjMg_BzEgm@~Csl@jC_g@nAon@z@_g@Rwt@g@_v@_DshBgEwdCwGofDcLw|FoKoqF_DsmB{@{c@R_b@f@w`@vB_g@fEod@fEs]nFoZbGgYvGkWzJw[fJkWzOg^rNsX~R_]zTka@zpAs|BrNwVrl@_eAjR{^nPo_@rNo_@~Mgc@~M{h@rIka@jHwe@nFka@zEkk@~Csl@z@sl@Rwj@cBos@gEos@cGwo@kHsg@kdAg_GwdC{jN{TolAw[caB_]kbBka@klBco@wnCwj@_|Bgr@_kCs{@c}CwcAofDs`A{vC{kAopDgc@cwA_Swo@{Jo_@kH_X_Swt@oP{r@cV{fAsSw~@kRk_A{O_{@oPk_AkMcy@sS_tAsNkdAgOolAoKgaA_NsoAkMc|AsIwhAkH_oAwGolAkHw|AgEcwAkCgaAcBccAcBsoAg@{_B{@ssDoA{`I{@ogF{@onE{@gkFg@wrA{@{|@oAw~@oAsv@kCs`A_DgfAwGgzAcGwmAsIguAoPkvB_NgzA{O_yA{^cxCw[swB{TwrAgT_jAoPwy@{O_v@oU_eAsg@{sBwo@glCcLkf@_I_b@oF{YoF_]{E_]cGgc@{E_b@gEsg@sD{c@sDwo@wBgh@oA{h@{@oi@S{m@R_q@z@{h@bBct@jCwo@fE{m@zEon@jHwt@jMchAzT_rBfO_tAnK_eA~Hg|@jHo}@zJ{pAbGobAvGguAvGc|ArD{fAjC{fAvBgpAnAogARcy@RkiASgfAg@soAoA_eAkCgpAsDovAwG_uCsScgIsDcrAkC_jAkCgaA_D_tAoFcuBkHwnC{EcpBcGggCwGc_CcGsfCoK_gEcL_qEcBwt@sDguAcBsv@g@kk@?ct@f@sl@nA{h@bBcj@jCce@rDkk@fEwj@jHwo@vG{h@zJsq@vLwo@fTccAbe@_wBn_@_hBnn@_uCnZcwArSobA~\\giBzTsoAb[smB~WklBnUcfBvVoyBrNgpAzJkiA~Ho}@nP{sBvLgiB~Hc|AzJ{nBjH{iBfEg_BjC{uAjC_yAnAkxAf@kiAf@kgBg@shBoA_|BwBgyDkCcqDoFkmIoAo{AsDscBcGwaBkH_tAwLs~A{O{dB{OcwA{OkiAkW{dBsb@_aCc`@c_Cwo@{tDsv@{rEsXo`Bc[giBc[ckB{|@sjF{OchA{JobA{JwhAoFk_A_Dsg@_Dkz@wBgpASwhAz@_~AbBolAnFg~DfEgbCbB{_Bf@w~@Rg|@?wcAScrAg@obAS{h@oAg_BcB{`DwB_pCoAswB{@oqA_DwyEwBwbDoAkqBwB_iDkC{yDoAwiCgEwkGg@co@sIwsMS{c@kCs}DkCsbEg@gfAg@o}@Ros@f@wj@nA_q@vB_q@vBwj@rDsq@nF{w@bGgr@jHgr@fJ{r@rIon@nKgm@bGs]~H_b@jHk\\jHk\\vLce@z^s~AzOos@vLon@fOg|@rIgm@jHwj@vGsl@nF{h@rDce@~Ckf@~C_g@zEccAbG{kA~Ho{AvG{uAbQsiDvVgfFnF{fAfEgpArDknArDc|AbBseAvBk}Af@sl@Rw~@f@kdA?ogA{@_cBcBckBgE{lC_NosJgEktCkCwkBoA_jAg@{w@?{aAz@sjAnAgaAbBox@vB{r@rDsv@fE{|@nFgw@nFwt@vGwy@nK_eAnKw~@fO{fAbQchAbLkp@be@{gC~f@cnCbVcrAv[ojBfYcfBjMcy@~a@csCfOkiAjWkqBfT_hBbVgxBzT_|BnPoeBjMc|AjMoeB~MgnBnKkbBvLkvBfEg|@~HoeBnF{uAbGkbBrDovAfEo{Af@gYrDczBjC{nBnAshBz@s|B?k_A?gm@g@co@kC_q@wG{r@_Ngw@gOco@gTkp@gY_l@w[sg@w[ka@s]s]s]{YgfAox@wwAogA{{Ck`CgYsSsIcG_jA{|@{m@_g@sXkW_NkMkWsXgTsXwVs]sSo_@wQo_@{Tcj@gOce@gOsl@cLwj@sIoi@sI{r@sDkk@wB_l@oAsl@?_l@f@kuJf@koHf@_lJRgyDRsaCRc|Ag@{w@oAgw@SkRwBod@_Don@{Eku@oFkp@wB_SwB_SkCgTwGce@sIkk@_SwmAwGgc@cGwe@kH_l@{JseAwG{fA_Dw~@wB{|@g@{m@Rk_Az@o{AjCwvDvB_kC~HkgLbBcnCzJsxNzJcvNbBkrDz@{yDrDcwPRsb@jC{aKnKstd@~C_aMnFstURccAz@on@nAsl@jCkp@jCwj@rD_g@zEgh@bGgh@fJ{r@zfAg}GnU_yArSgpAzEsXrScrAfJwj@rIkk@vLcy@rI{r@nK_{@nKogArIseA~HogAjMshBfpAcuQzh@gvHrNkqBzEo}@zEo}@fEk_AnFwrAbGcfBjHcxCz@gYfJw`E~Hc}CvLwyE~HofD~CguAnAogAz@kdAScmASkk@{@wj@cBccA_DsjAgE{kAoZsvJgEstAwBw~@kCguAwB{zA{@guASwrASc|Az@o{AnA_~AvGgwEnKgvHbBsv@bBgm@rDkk@bGwj@bGsb@rIce@jMwj@zOgh@nK{YnKwVrSsb@bVka@jf@sv@jRc[n{AocCboEwiHrq@{fAbVw`@bVsb@fTod@bQ_b@fOsb@~M_b@jMkf@fJsb@bLgm@rI_l@vGwj@zEgm@~Cgm@bB_g@z@_g@Rct@?oi@f@_{@?co@z@oxERc|ARw`@z@guFnAgoIz@gvCf@wpBz@gh@vBoi@zE{h@vG_g@~H{c@rN{h@jRcj@nU_g@rXod@b[ka@n_@c`@zaAo}@zaAo}@zTgT~nAkiAfpF_`FrcBk}Ab~@wy@vrAcmAv[c[jWsX~\\ka@rXka@fYwe@zYsl@nUcj@fTgm@r]chAnn@srBnjBkbGvy@wiCvhAgtDzOgh@ns@s|Brq@czBrNod@vcAgeDr]kiAr{EwtOfpA_bEjWox@fYgw@nZcy@v`@gaAbj@olAbe@w~@fw@kxAniEgvHbe@{|@ja@wy@n_@kz@fYsq@z^k_Ar]gaAbVku@fYw~@f^crArq@cnCrkCogKjdAsbEr]crAvVcy@bVct@nZ_{@v[s{@zYwt@j\\ku@z^sv@zTsb@~a@ox@zc@_v@nd@wt@rsDguFbj@wy@flCg~Dfm@w~@fw@gpA~\\_l@bo@whAb`@{r@~f@s`Ajk@_jAn_@gw@fm@wrAb[ct@f^kz@fc@{fAbcAkjCrjA{{Cby@{xBvVco@jz@_wBz^s`A~Rce@fTod@bV_b@b[{c@fOcQzOoPbQ{OnPsNrb@gYn_@_SzT{JnZ{Jb[_IbQ_D~WsDzjDs]zrE{c@rhBwQfc@oFj\\oFn_@gJnZ{Jb[gOzYwQvVkRnP{OvLkMjRoUvQsXbQ{YnPk\\v`@cy@ve@wcAbhA{}BvVsg@~a@cy@~p@knAf^wo@by@{uAfaAk}Aja@{m@~a@on@ja@_l@~f@gr@r_DweEnzDseFz^sg@zYgc@vLwQvL{TrIcQvLkWnKsXzO{c@rNwj@rIg^rIgc@jHgh@nFkf@rDce@jCoi@nA_g@Rkp@g@_g@wBgm@kCgc@oFct@{JksAwQsaC_NscB_I_eAgY{jDk\\woEoKstAwGcy@sD{h@kCoZgEwt@g@{YwBc~@f@ku@SkdAbBwt@z@sg@bBgw@bBg|@rD{gCnAc~@nF{lCz@w`@jC_~ArDwkBf@sb@zEooBbBsyAvB{kAvBsjArD_rBRgTnAgr@nFoaDnAon@bB{|@jCstAnA_oAbLwmF~Hs{E?wBvBstAnAg|@vGgjDvBogAzEsfCjC_yAbGghEvBkdA~CscBbGsdD~CsmB~CscBf@wo@bGcxCrD{dBvBk}AjC{kAvG_}DvBc~@vB_v@~Cg|@~Csq@jCsg@rIcwAzE_q@~Cwe@f@_IzE_l@bBgTjHcy@jCoZbQ{zAfToeBfTw|AbVk}A~Mcy@r]_rB~\\ojBzE_Xfw@kpEby@osEfbCsnNbo@sxDnP_~Av`@ksFnFkxAnP{gHzTclNjCspCzY{kPvLciHvLkyHnA_dD_D{|E{Es_DsN{yIgJ{lC{w@s}SwLwiCkHswB_DotBg@whAf@wrA?_]vB{_BjWs|GvGcpBrIg}B~Co}@~Cc~@rDstAvBkk@rXocHvGsyAzE{pAbG{dB~Cg|@jCgr@vG_hBvBwe@nFsoAjC{|@jCs{@~Ckz@rD{|@~C{|@rNsxDrD{|@~Cc~@~Cw~@~Ck_ArD_`AnAgYbBgm@fE{fAfEolArDgaArDgfAzEogAjCwo@z@gYbBwj@fE_eAzJ_kCrDseA~Ck_ArDchArDsv@fEo}@~Cwj@fEku@nFct@~HkdAjHwcA~HwcAfOcpB~Csb@nF{r@zE_l@bB_XvGox@zOotBbG{w@bGox@bGox@vGox@f@kHnZgyDrN{iBvGo}@fTgqCb`@ccFnKkxAjRgbCvQohC~McaB~H{aAnA_SrI_tAfJgsBfEcaBvBwwA?gJbBgaAnAk_AbBswBrDsnDz@gm@nAoqARcLzOk~MfEsdDvG_cGfJsdIbGgfFvBkxAzEwoEvBshB~Hk`HnAobAnAcy@z@s{@jCo~Bz@sl@bBoqAR_b@vBgpAnAwhAjCo~Bf@sb@z@w~@f@sb@bBsjAnAogArN_mLbGwhFf@o_@nPgeNf@o_@bBgiB~Cg}BvB{sBz@cj@nA_v@z@kz@RgYnAchAnA{fAf@kWz@{w@bBgzA~C{qCvBo{Az@{h@R{TnAwcAz@c~@f@k\\bBoeBvBsyAvBo}@jCo}@rDkiAnFoqAnFkdArI_tAvG{|@nF_q@z@{JvG{w@fJs{@fJ_{@vGcj@jMkdArXckBrDwV~Mox@zEsXfT{kArNct@bQs{@~Ro}@rIo_@bLkf@zOgm@bLgc@fJs]bLsb@fc@{zAzT{r@rSsq@vVsv@bQ{h@vQkk@jWwy@ja@_oAj_AowCbQgh@zO{h@vQkk@vQwj@rS_q@zJ{YbLs]rIkWzJoZrmBgdGb[ccAvGsSjMsb@fJsXjMc`@bGgTnKw[fEsNbQcj@bQcj@bL{^jHkWfEsSnFwVvBwLvBkMvB{OvBoPvB_SbBsNz@gOnA_Sf@{Oz@wQRgJf@gTRsX?gOg@s]{@{YoAk\\cBgYwBkWwBcQ_DkWgEs]cG{h@wLcy@od@_uCk\\k`C{Jgr@wo@_qE_Ns`AgEc[gOolA{Jc~@{J_jAwGg|@gE{w@sD_q@kH_mBwBc~@cBknASod@S{pAf@ox@nAgpA~CstAnAcj@bGsaCf@kRbGsfCjk@klVjCwmA~C_wBz@{xBg@kuJ_D{sVg@_rVoAwnR_Do{d@oAkgVScqIwBw{b@oAooVg@gjISsl@Ssl@Sw[wBo{AoA{r@oAgc@{@wQSwQkCwt@_D_v@wBsb@sDku@wB{c@_Dsl@_NcdC_SkmD_NggCkHoqA{Eo}@sD{m@cG{fAgEku@{@kR_IsyAkC{c@kCsb@_Dsl@_D_l@cBk\\cBw[_Dsl@wB_]oAsSoAkW{@cQ{@oZSc[Sw[?sXRcQf@oZf@wQz@cQR_IzEchAz@{Oz@kWvBs]bVkiFbBo_@nAk\\rNsuCf@{Oz@gO~Cgm@jCgm@jCsl@~HkbBvGsyAzc@kpJbGgpAv`@gjIf@gORwLzEg|@bBw`@jC_l@bBce@nAsb@z@{c@nA_l@f@od@R{c@Rgm@?sl@oF{cJgOcrZw[cll@sIw~OsDggHg@g|@Sg^S{T{@_hBS{^Sgc@Ssb@Ska@Sce@Ssb@g@gc@Soi@g@whAkCcrFSk\\sDkvGSg^g@kf@sDcaB_IcmAoPw|AsS{pA_N_q@o_@_yA_rBg}GgJ{Ygr@k`C_l@cpBoPoi@_Ngh@cGoUoAcGcBkHcGk\\sDwVoAcGcBcQ_Dc[cBkRkCka@{@c[g@sS?_X?_g@z@wj@zYg}QnP_oKnAgkARka@Rce@?{Y?ce@Scj@Sce@g@{c@Sce@g@od@{@_b@kCksAg@{Yg@_b@{@_XoP{~I_IceEwcA{ki@oA{m@sDooBkCstAwBo{Ag@sv@Sod@Sku@?gw@?_v@oAovZoAwk[{@clS?kk@SsrBSsl@f@kiF?w|ASo{A?c|A?wrASwhA?chASgr@RwcA?whASwaB{@w`JcBgzUkC{}`@{dB{gk@{@oZwj@_uRcL{tDz@sjAvGobAbL{w@v[{_BbLsl@jk@{{C~Hsb@jiAw|FfJsg@fqC_bOzm@gmEbe@k|Df^cgD~\\wtEj}A_vYbmAonT~nA_hVnAgh@Scy@{@wcAoFwcAcB{^w[wkGoAgYcVwtEsIkyCoFofDg@{vRRw_a@{@{aK?{c@?{{MSslJ?soPf@kp@f@cj@z@_b@bB_l@fEstAj\\g_GvLkqBrDgkAfO_vTnFgsBnF_oA~Ckf@rDw`@bBsNbL_jAv~@crFni@{`DvQsjAvaBctJvxCkvQzw@s`FvQ_v@vQ{m@nUsl@n_@ox@j~CcaGzOkWfTgc@jRsb@~M_]jM{^nFsS~Mwe@jz@{{CbLod@r]soAfO{h@jp@gbCvVg|@n_@{kAjMka@faAszCvt@s|BfOce@zYo}@fsBooGvQ_l@b|A{wEb[{aAbL_]nPod@vLc[bQw`@fTce@fiB_}DjhDwiHjWwj@vhFs~KnU_g@fh@kdArNw[zfAo~BnUcj@b[sv@~Rgh@zTco@fTco@jRsl@vV_{@zfAs}DnqFoaSzjD_fMjz@o|Cf|@wbDzOon@zOgr@vLsl@bL_l@zJgm@fJgm@rI{m@vGcj@vGsq@vGgr@zEco@bG_eA~HwcAvGgkAby@_nNnUo_E~HgpAnFgr@~Ho}@rI{|@~Hgr@nKox@jRolAjRchAnUcrAnUgfAj\\_tAzh@gnBbQ_l@~R_l@rS{m@jMs]jMs]zO_b@zaAwnCja@chAfTco@bQ{h@~Wc~@f^_oAb}Co`Lr`AokDve@cfBnUwy@zEcQ~iAkfEn_@ovAvQ_q@ngAs}DfE{Obo@{}B~_A_iD~~CgdLnx@kyCryAsoF~Mwe@ja@_yA~p@{bCbQsq@zOgr@nPsv@jMwo@~Mos@rN_{@bLct@zJwt@zJ_q@nKw~@nUg}B~Ro~BjHkz@b`@odErDgc@rI{w@rDw[nF{^fJ_l@jH{^vGoZrIs]rIs]fJ_]vLc`@nKk\\nPwe@rwBgiGzm@oeBjvBwfGrNka@~_A_pC~M{^nFsNfaAspCnUco@jiF_bOvy@{}BzhEc_Mr~FwmPv[{|@zYwy@rq@cpBvL{YzJoZ~Mc`@vLs]vL_]n}@ohCf{CkwIrhB{fFjzEs_NbLc[ve@guAjnA_nDnZs{@vQ{h@bQoi@bLo_@zJ_]jMsg@rNwj@fJkf@nFsXbLoi@~Hg^zJsl@jk@gtDfxBcqNzYsmBfuAw`JzOgaAzfAciHfw@gfFbG{^zEkWrI_b@nKod@~HoZvGcVrI{YrIsXjMo_@vLw[rNg^v`@k_AfOg^ju@ckBv[_v@f^g|@nrCc_HR{@~Rce@zh@gpAjHwQfr@o`Bfr@{dBfpA{oDr`Ag`DvaBwfGbuBszH~u@wnCf^{uAjHsXjMkf@nx@kyCzzA_tFfr@ohC~p@skCrg@s|Bju@ouDvkBgmJfYcwArq@{jD~cDchPfT{fAfgCciMb`@gnBvo@kcDvLgm@~CoPzc@wzBfOku@z}BgiLfaFocWjHs]nUs`An_@gnB~a@_|BvLku@bGo_@r]cdC~a@wgDjWotBzTwkBbV{nBbGod@bGgc@vG{c@bQchAjRchArS{fARcB~Rs`ArSgaAzTs`ArI{^bV_`AzJ{^jWw~@rXc~@rXc~@zY{|@b[g|@jMs]ju@cpBjk@_yAnx@cuBju@{nBfh@wrAfc@kiAjxAceEjp@gxBv`@gzAbV{aAfJo_@jWgfAjR_`AjHg^b~@g|Ezw@weEvLkp@~_Ao}EnvAkoHnK_l@rIo_@fEgTzTgpAvaB{yIvVcrAfEoUfO{w@rg@spCzJ_g@ja@wuBb`@gsBrv@ceEn_@klBn_@wzBn_@ggC~WswBzY{qCf@oF~z@{jIvL{kA~MstAvxCgaZfE_b@ziBgdQfaA_lJ~RwpBnUwkBrg@k|D~Hgh@fkAsnIrkCcnRvL{w@v[kyCnZ{jDrb@_rG~Cod@be@spH~C{m@bQcxCvQ_pCjWk~CvVocCjM{kAzT{zA~a@gqCvLct@~fE_dXb~@{_G~M{w@bcAooGbG_b@fuAwvIfr@oiEzOccAnUoqAbLku@fJkk@?SzuAw{I~R_jAvGs]bVg_BbGk\\rD_SbGc[~Mgm@~Msl@~Msl@~R_v@bj@_wBj\\{uAv`@_mB~W_~AfOgaAfOsjAjWk`CvLgzAvVo}EbBka@fOgsBnvA{xVjsAw|UjMwzBr]cfGzJo{A~Cgw@zJstAbGwo@~MgkArI{r@nF_g@r]wiCfm@{wEnqAcoJvVsrBrNo{AnPshBzOcdCn_@glHnUwyEfTs}DvLg}BbLsaCvL_|B~k@oeLvLocCfJwfBfw@oxOnPc}Cv`@suHbLo~BfEg_BrDkgBvL_hG~W_nNvQogKbBcrAjCo`Bf@k\\~M__DnUgtDv[oiEzkAknKbGkf@jRwaBjH{m@rg@ozDjHon@vfBweOrIg|@ve@_rGrIwmAv[ksFvQsfCbVwvD~a@{}GnZcrFbBc[bV_lEr]ojG~u@gpKf^ocHvL{rE~MsgTnPkxZRw`@fEo_JRg^~H_qJ~R{`Iv`@ocHjRohCvVczBvmAgmJzfAcqI~_Aw}HvBkMfw@shGzw@czGnK{fAjCsXzJwmA~MklB?cBfc@oqFf^ssDbV{dBnd@kwDjHwj@zEg^jCgOffAcbIzm@coE~WwgD~MofDbB_v@z@oi@f@{_Bg@w|AwGg}BsD{uAwBgc@cQcpBkMwwAgYglC_IobAcGgaAsDseAoAo{AnAwkBnFwmAnFk_AzOs_DjRw{DvB_]f@sIjC{h@z@kHbLscBzEwwAnA_`A~C{bCSoi@?gw@{@gdB{@{TsI_dDwLgyD_I__DwGwkBcBon@_I_aC_IswBsD_~A_IkoCwGg}B{Ec|AsIggCwBwt@{@sq@oKs_DoFgiB_IgxBcBk}AcBogAg@_fCcBwuGsDwgNoA_~FsNwoE_XgzFgc@{zFwV{bCgTo|CoZc{DoFk_A_Dka@cBw[{OonEcBgfAsD{dBsDkwD?g^RgfASknFRwbDR_wB{@otBg@{h@kH_|BcBg|@oAw`@oPswGgOk_F_IwsCoPwtEka@wjO{@kWwGcnC{h@_fRwLckGsIslEo_@kcN_NcyEk\\{sLoAgc@gYs`KwGwzB{@{h@wG{tD{JouDox@soZoA{xBjC{}Bzh@ohRg@oeB{Ec|AoP{_Bw[{uAceE{jNolA{~Dod@_mBs`AgrE{^kbBg^shBk\\wwAw`@wzBgYsmBsNseAsDo_@wG{m@_Ig|@oFco@oFkz@kHovAwGo{AwGklBcG{dBcGovA{J_hBoKs~AwLo{AoZ_zCwQsyA{OsoAkRwmAgTksA_g@omCc`@kgBsXwmAs]_tAc`@ovA{Jk\\on@{xBcvDcnMcGkRwQon@k}AwmFwcAsnDwo@oyBccFcaQgTwt@gc@ksAoKoZcV_l@od@s`Ag^wo@ce@ct@{h@{r@on@ku@sv@ku@gxBswBchFchFoZ_]gY{^{JgOcLcQcGgJkRs]_]{r@gOka@kR_l@oPwj@gOsq@sIsg@gJ{m@cGoi@gE_l@kC{h@oA_g@kHo{Fg@w`@kH{zFSk\\kRc~OSoFwBgnBsD_zCcB{iB{EckBgEcmA{Ecy@cB{YwBsb@_I_eAsXg{Cka@kuEwLwrAoFkp@od@seFsq@koHsDgc@gJkdA{Ecj@sv@_xI{JwcA{r@wbIw~@oqKwLovAkM_oAkHon@sIsq@sI_l@{Jgr@wLon@kRobAcV_oA{Yo`BcB_Ik_Aw~E_N{w@oKos@gJ{r@{Jk_AoKkxAwG{pAgJ{{C_NoxEkp@chUwGsaCcB_l@{JkrDsIkjC{@o_@wQcuGkC_`AsIorCgJwgDwG_wB{@o_@{@gc@kHoyBwGkeCoAsg@{@k\\Rg^RoZbBwe@bBoUbB{TrDgY~CsSrD_SjCwLfE_SzEwQvj@ckBzm@wpBnFkRrI{Y~W_{@noBoyGzc@ovArXs{@rXg|@jHcVbQkp@rDgO~Mon@rIsb@nF{^nF_]rD_XzEsb@bGce@jCsXfEwj@rDwt@z@cQz@{Yz@c[f@g^RgTRsl@?c[g@{c@g@sXg@oZkCct@cB{Y_D_b@wB{YwGct@sDc[ksAsmLsI{w@cQ_yA{Jo}@wBgYcBwQ{@_S{@_N{@kf@g@sX?cQRgTR{OnAw[z@wLz@{TnA{OzE{c@zEg^jCoPbLoi@vL_g@zE{OjH_SfOc`@zJ{TrD_InKsSvQgYnPcV~R_XfY_]~f@on@zm@{w@~H{J~MkRzJoPr]gm@~MkWjWoi@jWwo@fTsl@~R_q@vL{c@~Mgm@~Hg^zOwcAvGod@nF_g@fEwe@jCgc@jCod@z@k\\nA_g@f@wo@?od@S{^g@o_@_DsoAwB_l@kRoeGcQw|F_SkqGwQscGgO{|EsSkvGsD_cBg@ce@g@c[oAcwAg@seA?wGRgdBnA_yAz@w~@v[sdNjH_iDbBolARg^z@_mB?cj@z@gfPSsN?wo@f@kf@z@we@nA{^bBc`@f@gOvBka@~Cw`@~CgYjC_X~CcVbG{h@~CgTvGka@jCgOvQc~@fEoPfJc`@nKc`@nU_v@zOod@bQod@bQc`@rXsq@zh@k_AzwEgqHnn@_eArSw`@nZwo@rS{h@vQsg@vQsl@bBcGfE{Oz^{dBjWcfBfOscBvGwaBz@wpBwBc|AoqAoeVsIcdCcB{iBbB_hBzEgiBzO_rBbpBciRbQogAja@shBfm@_cBzxBgwEbaGomMb`@obAn_@_oAjWkiAnP_`AbQ_yA~HknArDcwArIcdRRos@bBkoCRsg@~CgcE~HwsCrSkmDb[_dDbe@cgDv`@k`Cv[{zAfm@k`CngAkhDvsC_xIraCgvHrg@wfBrSkz@~a@cfB~WccAboEgxQjM_q@vG_l@jCw`@jCka@nAsb@S{r@oK{|EcBku@{@sX{@gh@kC_mBf@ct@vBct@bGku@nKwy@jM{m@nP{m@jRco@bVgh@b[sl@f^cj@nlAwmAzpAkiAbt@wo@~iAs`Av[{^rv@{pAvV{h@~Rwo@nbAsqEzuAc_Hjf@gqCnd@csCryAcwK~k@kkEjW_cBb[o`Bjf@smBjk@cfBfm@_cBjp@kxAvlD_bJz|@suCfdB{xGzh@ggC~~ColPbt@oaDbcA{{Cj\\cy@f^kz@~R_b@fcJo{P~Wwo@b[ku@fm@{sB~a@keCfOovAnKogAfJgpAjCgw@z@cyEfJ{tXfEoaNbQ{cEzOkqBzOk_AfYscBzYwwAfYoqAzm@{sBntBs|G~gBo|Hf_Bc}H~}AcbIjWwrArfC_pMvcAgkFjf@syAbo@cwAb|A_fCflCkuEffAklBn}@kqBju@k{Bzr@{}BrhBgzFjeCwjJjf@gnBjH_]nZwmAjWknAfT{aArXwmAreAgkFrXcaBnFkWfJ{c@jHgYjCsI~Mgc@vGsSvG{TzJ_]zYos@bQg^zOgYbG_Nfw@{pAzJ_NbGsIvwAsfCni@w~@~tCw~EvQc[ni@o}@jsA_|Bni@c~@nZoi@zT_b@~f@k_Arl@gkAfm@crAjdA{bCni@cwA~a@_jAbVct@~Wcy@bQkk@fTku@bVo}@zT_`AzJ_b@nFcVzOgw@fOwy@z@oFnKco@~CkRz@wG~CkRrDkWrIkp@rD_XzOksArDod@vL{zA~HobAfEcy@~Cos@~Csv@rDg_Bz@o}@f@{w@?o}@Swy@{@{r@oA{w@{@wVg@k\\{@wVgEsjA{Es`AoAcQoFox@wBwV_Ik_AwBcVkH_q@gOk}AkM{kA_Nk_AsIon@sI{h@sNo}@wG_]gOs{@kf@klBw`@shBoKwe@wy@wtEkHw[oFcVoFsX_DkR_DcQwB{OoAsNcBkR{@cV{@kRg@cQS{TRsSRsXz@k\\rD{^zJs`AzEwj@~CwVbLchArD{^jCo_@vBka@z@oUnAgYbBkp@f@w[?kCf@s`AS{YSoUg@g^cGk~CoA{h@oAku@gOohHwBsjAwVkqL{YsnNcGwsC_D_~AoAsq@oA{m@_Dw|AsD{iBoA_l@oAwj@g@_b@SkqBRwt@RgkA~C_yAjH{sBzEc~@fJguAnKwrA~Hw~@~R{bCjCs]~W__D~Co_@rIccAbB{TnFco@bBgTrIobArDce@vG_v@vG{|@jC{^bG_{@fEgr@zEccAvB{h@bBsg@z@kRf@kM~C_jAz@gYbBkdAnAk_Af@gm@jC{xG?cVRoZf@ccARoZnAc{DRwVR{YjCcaGz@o|C~C{lHRsN?s]?o_@f@ce@?_Dz@koCz@co@?wQnA_jAvBogArDguAjM_xDvVwsHzEwwArI{lCbGo`BvBct@~Cg|@bBwj@f@gTrDgaAnA{^bBcj@bBo_@fEsyArDsyAnAwmARogA?wj@{@{|@g@_g@{@sg@gE_~A_D_v@g@cLoKs_D_D_{@g@gJoAsg@cBk\\SkRkM_dDcBo_@oF{_BwGcpBwQ_eFwVohHwBsg@_Dos@sDccA{EcmAgEoqAsIg{C{EwhAsSovFsDwrA_Dsq@cBgYoFgzAoAka@{@cVSkRkC_{@oAogAoAsjA?wt@nAwj@bBce@~Cgw@nAwVnA{YjCg^RkCvBgYvBoZvBsX~H{r@fJ_v@bGoi@nFce@nKw~@rIkz@rSkqBzJc~@nKc~@nKk_AbLs`AnKgaAzJ{aAzJwhArDs]bLovAfEgm@~Cod@zE{|@fJotB~C_{@jCg|@zEkiAbBgc@jCct@bL{`DjCku@jCgw@~C{|@~C_{@jCsq@jRorCnFwy@zJknAnA_SfEkf@jCs]vBsXvBwLbBwLnAsNnAwQvB_XnAwQjCsX~Cc`@rD{c@zJsoAvG_q@bB_SnAsSvBgTbBsSnAcQvBk\\zEcj@jCc[~Cgc@jCg^jCo_@nF{fAz@kRvBgc@nA{Yz@_Sf@kRnAgr@z@gm@bBstAnAc~@nAo`Bf@sjARoqAnAw|A?gJ~CkcDR{kAjC{mEf@w|Af@{m@Rg_Bf@chAf@sq@f@ccAR_Nf@co@nAchAf@s`Az@wt@z@o}@nA{}Bz@{fARsSf@g^bBkk@z@kf@jCwo@nAsg@~HguAvGsoAbGwmAvG_tAzEchAjC_g@~HshBvQ_xDfEolAzEkxArDgpAnAsg@nA_{@vLgiGz@c[vBwwAjCcrAbQs_InZkaOvLscGz@_l@fEgnBjHc{Dnn@o{ZbBkb[nA{~NbBgmE?_xDR{aARsb@ScpBvBo{KvBotQ?wuBvB_bJf@co@jCgdBbLc{DfEklBz@sb@rDoqAvL_`F~M_`FjC_yAnAcfBRgh@?_aCsDg`Dsl@oo[oFs|B_DktC{Ow}H{OcjJcG_pCoAseAgEcdCSg|@S_xDRcwAnAsyAzEgbCjM{~DzEsjAfJwpB~RwmFjRg_GjCwmAnPkzEnAs]zEcrAbGooBfE{_BbBwhAvBscGz@wcFnAwoERwe@f@c|Af@c|AjCk_FSo_@z@o{A?cj@f@w~@f@knAz@oqA?cmAbBgkASoqAf@wwAf@wV?{`D?o{Af@crAz@gzAf@o{ARkz@?oKf@ccARwcARkdARobAR_`Af@w~@f@s{@?s{@?k_Af@obAf@obAR_eAf@ccAf@wcARwcAR{aARgaAf@{aAz@caBf@{zAf@gzAf@wj@nA{m@?gEbBoi@~C{m@rDco@jC{^jC_]~C_]rDw[fEg^zEg^nFg^zEc[nF{YbG_]jMgm@nFoPrX_jAnF_SvGgTzT_q@zJ{YzTwj@~Rwe@rS{c@fYwj@bGcLzJwQb`@kp@~dAcfBjsAczB~oH{bM~a@sq@rv@_oAfwEk~HjMgTzYwe@ja@sq@~lBw}C~Rk\\~Wod@fYsg@n{A{gCfc@{r@zOoUnFwGzm@{m@~HwGvLgJbLkH~M_I~MwGbLoFnKgEfYgJjM_DjWoFjf@gJzfFccAbmAcVvLwBvdCkf@zYcGfvCwj@b`@_IvBg@be@gJfh@wLn_@{Jj\\{JnFcBvrA_g@nbA{c@ju@c`@fh@w[bt@_g@rg@c`@jRgOzOkMrSkRrb@w`@fc@od@b`@gc@bmFshGfYs]~z@{aAvo@sv@nKkM~W_]rl@{w@~p@{aAjnAsmBjCkCnAcBnZce@vV_b@rvE_kHvo@{aArb@gm@zYw`@rb@oi@~MgOrl@gr@zpAwwAbrAsyAzEoFbnHgjIf|@s`AfToUrqEgfF~yHwvI~}AcfBfJoKzJoKbe@{h@~RsSvt@cy@jMgOnA{@jR_Xni@kp@b[ka@fh@{r@nPoUjk@wy@b`@_l@rSk\\zr@sjAvj@obA~f@k_Avo@gpAf{C_cGbBgERSv`@gw@fuAwnCf@oAnAwBjMwV~HkMrI{OjHsNvQ{^~R_b@bt@kxAjz@kbBf@oAjqB_}DbBsD~dAgsBbe@kz@zJ_Sjz@scBnlAgbCjnAocCz@cBrtAomCnK{Trq@soAvQs]zc@{|@rNsX~a@wy@z^gr@nZoi@rX{c@zY{c@fYw`@bQoUvQ{Tz@oAbVgY~a@we@jCkCnPcQjWkW~f@od@fc@{^nZoUrhBovA~qBc|AbLwGfsBsyAzhEk~CreAox@be@g^fm@{c@nx@sl@~a@c[~\\kWns@{h@vmAo}@fE_DrXkRnFgEbVkRrNoKbzBcaBfaAct@n{AwhAnZ{TrD_DbQ_NvzBwaBvwA_eAjRgOb[wVnZwVrNkMrXcVrb@ka@rS_Sfc@ce@r]w`@rIgJ~a@_g@n_@we@rl@cy@b`@kk@b`@gm@neB_uCnPc[nP{YjR_XfsBsiDns@gkArDoFrXod@vGwLzJcQnZ_g@vj@_`AnUka@zTgc@fJwQbQ{^zOg^~Mk\\zOc`@fTkk@ni@s~AjMs]~Rsg@rSsg@bLkWjMkWbLcVvLgTfYsg@zOkWzOwV~\\we@j\\{c@b[{^rg@kk@ju@cy@riDwvDjz@c~@bV_XvV_XjWsXbj@on@b[_]bLcLb[s]j\\c`@raCkjCjk@{r@rb@ka@r~AoeBbxHsnI~~CokDf~DgmEzvCoaDfxBk`CreA{kAn_@od@fYs]nAoAfc@_l@zc@co@ni@cy@b[sg@jf@_{@b`@ku@j\\_q@jWwj@jf@whAnKkWbVwo@fYsv@b[gaAfc@cwAboJ{}[fnB{sGzO_g@nPkf@fYwy@vLw[vLw[nZwt@fE{Jv`@{|@nZ{m@~a@wy@bVgc@rXwe@zfFsnInZ_g@fJkMfuAwzBzc@ct@vj@wy@z^sg@f^we@fc@{h@rb@we@f^w`@b[w[nZgYb[{Yf^c[f^{YjRgOz@{@n_@{Y~}_@obZvcAgw@bzBscBjp@gh@zE_DntB{_BvpBs~AnUoPv`@c[vhAobAnlAknAvrAk}ArIcLvGgJb[_b@fToZrSoZfY{c@jRoZja@{r@jMgTnPw[~a@ox@ve@wcArXco@fT_g@b|AcqDb|AopD~Rkf@fOs]rb@{aAf^wy@nUkk@~Wco@zzA_nDby@smB~Wkk@vo@soAv[_l@bGgJrb@{w@bVc`@vLkRnUo_@bVk\\ja@on@zO_SrD{EnU{^fT_]j\\gh@~CcGbo@s`AnFkHrzCosE~iAwfB~{Gc~Jrl@ccAzTw[nx@_oAfO{Tvo@gaAfY_b@nKoPrNoU~HoK~\\od@vQsXbmAklBrI_NnZsg@fY{h@jHsN~R_b@zJcVbL_XbLoZjRsl@zTsq@zJo_@bQ{r@zO{w@jHsb@zJ_q@RoAbLs`AjyHwhx@jHwt@zEwj@jMgpAzc@{wEzJ_`A~CsXrI{m@zEk\\nF{YrIce@jMcj@vLgc@zJo_@~HwVvQoi@fOka@rSsg@nAkCvL_X~M{YrN_XnKgTnPoZrtAsfCjiAcuBzOoZj}AsuCnqA{bCbuBozDjf@w~@b[gm@nUce@zTce@jWgm@zY{r@rNg^~a@kiAzOkf@~HcV~HwVvLc`@nKw`@fOcj@rI_]fJ{^jMcj@jH_]~R_`AjHka@nKsl@flH_`d@v[kqB~H_b@nFgYjMoi@bGkWfJk\\rNwe@vGgT~HoU~Mg^zJkWrIkRjMgYvGsNrX{h@r]gm@vzBkmDfh@ox@bVw`@bQk\\zTod@fOk\\jMoZbL{YrNka@~Mka@~Mod@fJg^nK_b@nKoi@~Hw`@rI_g@nFo_@bGgc@fEo_@~H{m@vj@wyEvV{sBnKcy@zJcy@bBcLfT{iBzEgm@jM{kA~MwrAnKccArIgr@fJwt@zEc`@nKco@vGsb@~Hod@~Hgc@rNku@vV{fAjCsIvQos@~Mgh@b`@{uAv`@gzAbo@_aCz^guAfEgOzO{m@bBcGnzDw{N~cD{}Lrl@k{BrSgw@rIg^zE_S~Mco@bLsg@jHw`@~H{c@nF{YrDoUrIoi@zJgr@~H_l@vG_l@fiBccPve@weEvcAkaJnd@o_ErDw[nFk\\fEgYnFgYjHgYnFgTzJk\\rIcVvGwQ~Mk\\vLwVfJwQjM{Tn`BwsCfnBcgDbnCoxEv|AwnCrDoFbaGogKbpBgjDf{CcmFjRw[vLcQrNsSzJsNzJwLrNoPnPwQbQwQ~RwQzYcVjW_SrXkRvQcLrN_I~RoKv[sNvV{JfYsIvV_I~f@oKr{@cQffA{TbgDsq@jcD_q@fzAoZzYkH~\\gJzc@_Nj\\oKjRkHnUgJfYwLvVcLbVwLb[cQnZcQv[_SnU{Ov[oU~R{OjRgOj\\gYb[{Yr]s]zYc[rXw[vVw[jRwVbQcV~R{YfOoUbQ{YfYwe@vVkf@vQ{^v[sq@z^gw@fc@{aArv@waB~a@o}@zTgh@jxAc}Cfc@c~@vLsXrN_]zTwo@zJo_@vLgh@~Hsb@bGce@rD_XjC_X~Csb@vB{c@fE_`AbG{pAbBg^vBoZnF{h@jHcj@fOgw@rSos@j\\_`AreAohCrb@seAnZ_{@fOkf@rNon@jWcfBfOsjAbQknAzEoZnFkWnF{TjHcV~HwVjHwQ~HwQjHsNjH_NnKcQrIkMrIwL~MgOzJoKbsH_wGrSsSrNwQ~R{YvLgTbLkWfJoUjHcVbGcVjHs]vG{c@jRc_CvBoUjWw}CbGce@fEwVzEcVbGwVnFkRrIwVzJgY~f@wmA~a@seAzc@kiArq@kbBf|@{xBjWwo@jHoPnKkWzEsNrSoi@nZwy@vGgTzJk\\fJg^rrB_zH~\\soArNkf@zdBcuGv|Ag_Gf^stArIw[nKk\\~HoUrIcVzJoUvL_XfJwQrNkWnUc`@bQwVfTgY~\\sb@r]{c@~p@g|@~k@_v@bLgO~HcLfJgOjHwLnKwQbLoUfOw[fJgTfJcVrIwVzJc[zJs]vGgY~Hs]zE_Xf@kCfEwV~CcV~CwVzEsb@bGsl@vBkRvLwhAfEo_@zE_]fEgTfEwQzE_SjMce@fm@{sBrq@saCr]{pA~z@owCns@_fCvLsb@rl@srBfY{aArIc[jHoZrI{^jHg^~Hgc@jH{c@vQcrAvQ{pAjRksArS{zA~WsmBb[czBj\\w_CrXsrBzTs~ArSsyAfYkqBzTg_BnZczBz^_kCrIgm@nFc[fEgTvG{TbGwQnFsNbG_NvGwLnFoK~M_SnKwLbLwLzJsIfJ_InKcG~M_IvL{EzOcGbL_DjMkCfJoAjMoAnPcBfpAwGzaAoFzuAkHjk@_Dz^wBb[cBrXcBfTkC~MkCjMwBvL_DvLkCzJsDrN{EfJsDbL{EzJ{EbQ{JbQoKzE_D~\\oUr`Akp@~p@od@fTgOf^wVfh@g^zpAg|@bj@o_@~\\oUbo@gc@zw@cj@jp@{c@nZsSbe@k\\zh@g^r{@sl@bhA_v@jp@od@bQ_NfJsIvLkMfJcL~HoK~HkM~HkMjH_NbLkWvGoPnFcQvGoUjH_]fEwVvG_b@v`@_fCb`@{bCjHgc@vGk\\fE{TnFoUvGsX~Hw[~HgY~HgYbLs]nPwe@jMc[jMc[bLkWbLoUnKoU~a@_{@n_@_v@nd@k_A~p@stArdDwzGnFcLfnBk|Dbe@_`Aja@wy@r`AcpBjdA_wB~f@wmA~Wwt@bVcy@rS{w@nPox@vLsq@fJco@ve@wqDfh@c{Dfw@_~FrS_tArNgw@rI_b@vLwj@bVs`AzO_l@vQco@ja@olAfTsl@~k@{uA~Wwo@bpB{oDzm@_{@rq@g|@fh@sl@jf@oi@v`@sb@nUkWzE{EbQwQzr@ox@fTsXvLgOrNgTfO{TzJkR~HgOrIcQrIsSrIkRnKsXnPwe@fOgh@vVox@n}@owCzc@gzAvcA{eDbV{w@rNod@vvD{bMvQwj@nK{YnPgc@nPw`@rS{c@jW_g@vVsb@ve@wt@fc@{m@vQoUjmD_{Erg@{r@~p@w~@vj@{r@rb@{h@be@gh@fY{Ynx@{w@nx@os@~nAccAfpA_{@rrB{pAfdBgfAvt@we@fOsIfEkCzdBogA~k@o_@nd@gYbkBwmArcBseAnyB{uAvGgEnlAsv@zw@kf@znB{pAbwA{|@zdB{fAfr@sb@fT_Nj\\_Sz^sSni@gYfYsNbVoKzYkMzOwGnU{JfaA_b@nvAsl@fYkM~iAkf@njGciCzrE{nBzEcBneBku@~\\_SzYsSz^o_@rXw`@bQk\\fJkRvGcQvhA{`DrrB{zF~iAsdDzm@oeBrIoZrIw[nKka@fJsb@rI_g@vGsb@vGgh@rDc`@rD{c@z@wLjC_b@~Ckf@jC_XjCkWnF{c@jHco@bBgOnF{h@vGchA~Ccj@jCsg@zE{dBvGgr@jMgkAvwA{gH~Hsb@zE{Y~C_S~C_XvBsXnAcVz@wQRoUf@sb@z@gdGRod@z@cdHf@{yDRg^z@_Xz@kWbB{Y~Csb@rD{^zE_]bGc`@fEsS~Hg^~H{YjHkWnKc[bL{YrI_SjH{OzEgJzJkRzO_XzOgTbQcVnvF{bHnZ{^bVw[vL{OrIsNvGcLjHsN~HwQvGoPvG_SnF_SzEsSrDoPvBsNjCwQbB{ObBgTnAsNf@gTRcV?{YScV{@oUcB_XsD_]cGce@gr@w~EgE{^cB{TcBoUg@{Og@sS?k\\f@oUf@{Oz@kRbB{TjCgTzEoZzEwVfEkRnFcQzEgOrI{TjM{YviCkbGjHcQvGkRvGkRzEwQrDoP~C{O~CcQvBwQvBgOnAkRbB{Tf@{Tf@sS?sXSwVoAc[kWcxH{@sb@SkRScVRkWf@kWbB{TvBgTjCcVnA{JvBkMzEwQrIgYrIsXbG{OnFsNzJkRrIgOfJkMnKgOvuBgbCbuB_aCjqBwzBjWsXrg@ce@~a@g^rg@c`@f^wV~\\{T~a@cVb`@gTfYkM~k@_Xf^_Nzc@{Org@gOr`A{Tjp@kMv|F_v@j\\oFfYoF~RwGbQcG~R{JbQoKrN{JrNkMrNsN~MsNzOoUrNcVjM_X~Mk\\fJoZ~H_XrIc`@zw@clDv[stAbe@otBbGgYfE_SrDoUjCcVvB_]nA_]z@k\\?g^SkRoAk\\_Dsb@wLoqAwLwmAsN_~AwGsv@sDod@_Doi@S{TSwVRcQf@_Sz@_SnAwQbBkR~CwVrDsSjHs]nFkRrDcLrDcLrD{JnPc`@reAc_Cb[sq@~\\_v@~Mc[~HsSrI{TrIcVjMc`@nKg^rN_g@zJs]nKc`@r]soAjHwVvLce@bLka@zOkk@vQkp@bL_b@vL_]bGoPzJ{TvGsNzE{JjHkMzTw`@bQoZr]{m@j\\sl@rb@os@vcAshBvrAw_Cb~@_~Azh@gaA~HcQnFwLfEsNnFwQrDsN~CcQ~CcQbBsNnAcQnAwQf@_NRcQRcV?_g@g@ogAS_g@RoUz@kWf@_Sz@gOz@{OvBkWjCkWvBgOjCoPbB{JnA_IvBoKbB{JjCoKvB{JfE{O~CwL~CcLvBkHvGcQbGgOr{@czBzJkWnF_NrD{JbGkRzE_NnFwQzEoPnFoPnF_SzEsSzEsSnFcVbG{YrDcQfEwVzEsXnFs]vBwQvBwQvBwQvB{TjCwVvB_XbBcVnA{TnAkRz@_SnAg^z@kWf@gYf@_X?kWRk\\Sk\\S{Yg@k\\{@{YcBsv@cLozDoA_g@oA{h@g@wVSsS?kR?cQRwLRoKf@gOz@gOf@oKbBoUbBoPnA{ObBcLbBwLvBcLjCsNbB{JjCoKrD{O~CoK~CwLjC_IrDoKfEoKzEcLnFkMjHgOnK_SfJgOjHcLjH{JvV_]jM{ObLsNjMcQjRwV~MwQjHsI~HoKjH{JjHcLjHwLzEgJrD_IzJoUvGkRrDcLrDsNfE{OfEkRvLwo@~a@oyBf|@oxErD_SnF_XrDoP~CoPfEgOfEoPnF_SzEoPjH_SbGwQbG{OfE{J~HcQvGsNjHgOvGwLnKwQzJoPjHcL~HcLzJ_NbL_NzJkMfJoKvLkMfaAk_AjMwLjMkMnP{OfOgOzOgOr]k\\~a@ka@nPgOnd@{c@ni@gh@~u@ku@zTsSnPoPnU{TfTsSz^s]f^s]zOgO~MkMvLwLzJgJ~MgOzE{EvGsIrIoKnKgOzJ{OrI_NbLsSbLwVjiAkjCvL_XnKcVvGgOnFcLbB_DjCwGjH_NvLkRjMkRvLoPfJoKvG_InKoKrIsIbLgJfJ_IrIkHbLkHvGgEvLkHvLwGv[wQzT_NbQ{JfJoFnKcGrNsIfO_IfJcGbLkHjHoFzJwGfJwGbLgJnK_IbL{JfpAchAjM{JnK_InK_IzJoFrIoFbLwGbVwLb[sNb`@oPfTsInU{JfYcLzJ{E~WwLzw@k\\~McGfOkHrN_InKwGzJ_I~HcGvGwGbLkM~HsIvGgJ~HcLjHwLz@cBjHwLvGgOfE{JnF_NzEsNnFwQjC{J~C{OrDkRjCoPbBsNbB{OnAcQz@_Nf@kMnA_]rDwfB~CgzAz@gYz@{Tz@{Oz@{OnA{OnAgObBgOjCkRjCkR~CsS~CoPnF{TfEwQbGgTzJg^zY_eAzr@_fCvVs{@vLgc@rXs`AzJ_]rI{YrDcLrDoKvBoFbG{OvG_NrI{OnKoPvLcQrIoKvLwL~MwLrIwGzJkHbLwGjMwG~McGjHkCzJ_DnKkCbLkCbQwBjH{@nK{@zh@_DrjAwGrb@kCv`@_DbQcB~RcB~sA_Njp@kHb|AkR~oHg|@f|@{JrX_DfTkCjR{@fTg@bV?jf@RnlARnPSvGSjM{@bL{@~H{@jMwBrNkCjMsDnUcGrmBgh@ju@sSjMgE~MwGrI{E~MsIfJ_I~HkHvGoFzEcGbGwGrDoFrDcG~C{E~CoFrDcGrDsIrDkHfEwL~C_IjCgJvBkH~CoPzJ_g@fT_jAjk@cxC~CcQvBgOrDcVbBsNz@wLnAkRz@wLf@cVf@gY?wLfEozDf@gYf@sNf@gJz@gJz@oKbB_NbBwLnAsI~C_NfE{OrDkMfEoKfEcLfE_IrDkHzE_InFsIrDcG~C_DrD{EbGkHfJsIbGoFbLsI~MoK~f@o_@vGoFvG{ErIkHzE{EjH_IzEoFnFwGbG_IzEwG~CoFfEwGzEsIrDwGfE_IrDgJzE{JvGwQbt@shBn~Bo{FnP_b@vBgE~MgY~Wsb@~HoKzTcVbLoKfT{OrX{OfJsDrXoKzJwBv[wGvQwBrNoAzTg@npD_IfOoAr]gEfO_DvVkHbVsI~RgJjR{J~RkMvVkRfJ_IzJ_IvV{T~WcVvQgOnU_SfTkRbLgJrIwGvG{ErIoFfJoFnKcGvLoFbQkHbLsDf_Bcj@bj@sS~k@{Tv`@_Nrg@oPnn@wQvj@wQnd@gOz`DchA~RkHbQkHnKcGrIgEfJcGzJwGzJkHbL{JzJoKbLwLzJcLzJ_NzJgOvGwL~H_NfJ_SvQgc@bBsDzO{^jk@stAni@{pA~Wgm@~HoPzEgJvGwLzJ{O~MkRzJ_NfJoKrNsNjHcGjHcGnK_IbGsDvLkHzOsIbQgJrX_N~~Cw|Ajk@sXz|@sb@~z@sb@b`@cQ~WoKv`@{OvcAc`@rq@kWr`As]bo@cVvwAcj@~\\wLvj@gTve@wQ~k@gTneBkp@rv@sX~iA{c@bVgJve@wQrS_IzToKrX_NrXgOjW{Ofh@k\\j\\oUjz@wj@vo@sb@~a@gYv[gTn_@wVr]oUvL_IvQ{JjR{JrSgJjMoFnKsDnPcGjR{EjR{EbLkCnU{Er]gE~RcBvVcBn_@oA~eCkHj_AkC~tCsIfO{@zOoAfJ{@vLcBjMwBnKwBfJwBfJkCzJkCbLgE~M{EvVcLzYgOfEcBviCwrArb@{Tnx@_b@vQgJbkBk_A~u@gc@zTgOnd@{YzY_XzYgYju@gaAfqCsgE~`C{oDr]g^rb@g^bt@_b@nlA{h@vj@cVve@wVju@oi@~qBc_Cvj@on@nZ_]ja@w[fvCo{A~mDgiBbj@g^~MwLjf@gh@~f@o}@vrA{vCnFwLvo@kxAv[ku@r|BwcF~Wgm@fY{|@~WwmAjH_b@vGsq@rIo}@nFoi@jH_q@fJgr@~RwhAbQ_q@bVsv@b[{w@~Wwt@zT{r@zYs{@nU_q@~f@ovA~Mw`@v[o}@fY{w@rXgw@b[{|@nPgc@fYox@~Wsv@bQwj@~Mo_@~H{TvLoZvVce@z^cj@b[g^jk@cj@ju@wo@~f@sg@vt@sq@rb@w`@~\\oZvQkRnZgYjf@_g@ja@gc@ve@oi@ve@_l@zh@kp@nd@cj@fOcQnUw[~f@{h@ja@gh@be@_l@fh@on@~f@gm@f^sb@nZ_b@~\\o_@fYcVnd@gYj\\_Nj\\gJv[sDz^?ve@z@be@~HrXzJjWrNve@fYzh@fYzm@r]rg@~Wn_@bQrb@jMjp@rNvy@vGf|@bBffAvBvjEnAvj@nAv~@Rf|@nAn_@nAv`@fEf^nFja@bLbo@fYvj@b`@~\\bVzh@v`@~HbGnpDzlCb`@~Wjf@fYb`@zOrnDvmAfaAb`@b`@~Rn_@zTz|@nn@~|DvsCvo@~a@ns@b`@be@nPnd@rNfr@~Mrb@bGzm@zEnd@z@jk@g@vhAwGfzA_Xz|@oZfh@wVfc@cVv~@{m@n_@wVvVcQbVcQv[wVvV_SnPsNv`@c[vrAwcAjf@s]bVcQzE_D~_Agr@jf@{^jbBwmAngFcvDvo@ce@vVcQzOcLfOsIbQ_I~M{EvQoFzO_DvLwBfEg@fEg@~M{@nKg@fO?jM?vLz@~Hf@jHz@~W~C~a@fEv[rDrNbBnKz@jMz@nKRjM?vL?jM{@~M{@zJoAjMwBzOgEzOgEvLgEvQ_I~MkHvLkHnK_InKsInKgJz^k\\n_@g^~\\c[nPsNzTsS~RoPrNcLfOoKbQkMzOgJ~RoKnPsI~McGnPkH~MgEzOoFvL_DnKkCrN_D~RsDjR_DzT_D~R_DfYgEb`@cGzm@gJzYgEzYgEja@wGfm@gJf|@kMrjAcQnZ{Ef^oF~f@kHv`@cGzYgEzm@{Jrg@kHbt@oK~a@gEfYwBnZcBnZ{@vbDcLr~AcGfeDcLjlG{TfqH_XriDwLfaAsDbVcBvQcBbQ_DnPsDfO{ErNoFzJ{E~MkHnKwGrIcGzJ_InKoKfJsIvLsNrNwQzJoPfJoPbGkMvGgOjHkRvGsSfEgObG_XfEwVjM_v@zTwwAzw@gfFbLgr@bQkiAjW_cBb`@gbCnPgfAjMcy@n_@_aCzEgYbBgJ~C_NnF{TnF{OzE_NjHkRzJsSrI{OnKoPfJkMbLkMzJoKbL{J~MoKfO{JrI{EzJ{EjM{EbQcGjM_DvQ_D~McBjMoAzT{@fYg@zuAcBnqAcBja@{@vQS~Hg@fJ{@zJ{@~MwBzO_DnKkCbLsDzOcGfOkH~MkH~\\_SznB_jAzw@kf@ju@ce@rv@ce@fh@c[r]oU~WsS~McLbLoKvQ_SrNoPbQgT~MsSfOcVrNgYrIwQzJcVjMc`@fO_g@zJgc@zEkWfE_XfE_]~C_]zE_q@zE{r@jCoZjCkW~CoUrDgTnFwVjHgYbGkRjHsSnFsNbGkMzE{JrI{OrIsNvGoKjH{JfJcLjH_IfJ{JrIsIfJ_IjRsNz|@kp@noBwwAvQkMrNoKvLgJbLgJvL{JnKoKrNsNrNcQrNkRnKgOnKcQvLsSreAwkBjjCoxEn{AomCbt@crAjHoPfc@sv@~a@ku@bLwQbLgOnK_N~CgEbLsNzJoKfJgJfJ_InKgJnPkMzY{Tbo@gc@fkA{w@jWwQfJkHfJwGjMoKnKoKnKcLzJ_NnK{ObLsSjRka@~f@waBv[chAzO{h@bLsXj\\{c@ju@{m@bt@sl@v[g^~Rg^~\\{|@vQku@zJ{|@fEs`Ag@wfBkCgrERku@zE{w@bLwt@jRox@f}Bg_G~lBw~Ejz@_|BzfAsgEf|@cbDrl@{_Bjf@chAzsB_{EzuAs_DzdB_xDfiBgmErmB_lErv@_mBfOkk@nbAk_Ffm@wxC~\\gkAvVon@v`@wt@b`@cj@zc@ce@ju@_q@zr@we@bvDckBn}@ku@jf@os@fTod@~mDk}KbGwQnn@cpB~bBkiFnZwmAni@cnC~iAcwFfTkz@fJw[vQsb@fsBsbEfiB_nDrkC_jF~dAocCbV_q@vQox@v`@_kCrD{YzE{^jM{|@jM{r@fOkf@vQk\\fYc`@nZw[ffA_v@j}AsjA~R_Srb@kk@v[_g@jnAwnCnqAkyCreAgbCjsAg`DjMo_@nKod@r]_tAbVk_AzYwo@fc@sl@rb@kp@zYwj@~Rgh@bQsv@jW_~Ave@wbDnU_~AbGo}@rDcwAg@swBoAcbD{@cuB_DcrA{E{m@wLkf@wVkp@sg@os@{c@we@kp@sg@k\\kf@gOgYcQsg@sXgpA_ScmAwQgkAsDce@kC{r@kHwbDf@{w@rDgc@rNkf@nZ_q@bQgYjWkWz}BsrBb`@gYjnA_q@r]cVfc@c`@fOoPjdAckBzc@kp@rl@wj@rb@cj@rX_b@nZwo@zr@{_BjoCcpGr`AgbCni@ovAve@gfAja@_q@v`@sb@rl@ka@fr@_Xfr@oKrpC{TngA_Iz_BkM~f@wG~f@gJ~a@kRz^{Tn_@g^jWgc@bV_]fTo_@jp@whAv|A_kCvy@crAfYsg@zJkM~a@sb@fc@gYzTcLj\\oKja@cGrl@wG~\\gEf^kHrX_I~f@{TnUkMjRwLnP_NnP{OfTwV~RwVbL_SzOgYvLwV~HgTfJkWfOod@f^gfArg@s~A~\\obAztDo`L~f@w|AbGwQb[w~@nUos@nFgTbG_XvGw[jHce@jM_`AvQ_oA~RguAbGk_A?sv@{Ec~@sIgm@kRku@kWcj@{uAw_Co_@{w@we@knAo_@wmA_g@c_Cka@w_Con@ouDssD{rTk`C{{M{xB_aMwL{aA_Ig|@sv@osJgh@oyGkH_`AkWokD_g@oyGgh@_pHoKkz@oZguAolA{lCglC{uFkp@kxAcQos@{J{w@S{kAvGsq@jHkf@zaAwxCfuA_bErv@gxBjf@o}@v`@we@vj@gc@~u@g^f_Bkf@r]wQr]{Y~\\od@jRs]r]gkAfJ_yAz@onEf@{|@nFw~@zJwhAz^cjEbQkbBf^{dBfh@guAn_@s{@jsAkyCfh@s|Bb[{gC~RczB~f@srBfw@{uAz}BkhDv|AglCzzA{bCnx@wwAnKwVvVsl@rXwy@vQo}@zJwt@jCwcAgEkiA_Igr@oPg|@gh@shB{lCwnHsNogAsDg|@{@on@rDwt@rNstAns@k|Dr{@_qEbQ{aAzYcaBjk@s_Dv[s~AvV_v@bj@whAns@co@faAgm@ju@wLfr@kCruCnKj~CnUnn@zEn_@g@b[{@zc@oFbj@cGby@g^v~@co@r`AwhAfiBskCzc@kp@~Wwe@~\\o}@~_AokDnbAwqDv[o}@b[kp@~iAc|AvpBowCzm@ogAfc@_jAf^ksA~\\kgBfOk}ArI{uA?{dBoFw}C_Dc|ASsjAbGw|AbQsyAnKkp@v`@gzAbe@gfAn}@crArxDgeDjdAgfAvj@c~@nn@guArXw|AnvAweJfOgfAf^o~Bn_@soAfYkk@bVg^fr@co@rl@c[n~B_v@ve@cV~a@od@bj@kz@bVg|@zYwfBzJwo@rNoi@rNsb@fTkf@b`@{m@~rD{sGbe@os@~Rw[~a@sg@zc@g^r{@sl@jgB_jAfnB{pA~p@kf@nbA_v@~p@wy@rg@wy@~_AgxB~dA_kCrN_g@vG_l@jC_{@{@s`AkMorC?kdArN{zAbVgfAja@ku@vj@_v@nrCsiDf|@{aArhBooBvpBkeCbt@cy@~a@o_@f|@cj@bwAkdArv@sg@n_@wVf^cVfpAs{@jdAct@n_@w`@~MgOfOsS~MsSzJcQnKkRvGkM~Mc[vQce@f@oAbt@sfCnP_l@nPwj@jWo}@jRco@jHcVfEwQbGsSbG{O~H_SnFkMrDsI~HgOnFgJbQgYnK_N~M{Ove@kf@~u@ct@zh@w`@nx@o}@rSgTfJsIzJgJzkAkiAby@sv@n{AovAfw@_v@rq@gfAzc@sjA~Rwo@~Mgw@zm@{rEjp@_~Fb[{xBb`@caBzr@cwAv`@sl@~W_Xf^{^vj@wj@bj@kp@z^sl@b`@gfAjMgc@vrA{_Gzc@smB~f@swBr`A_bEbkBwbI~_A_`FzOw|ArD{_BnKkrDvB_eAzEswBrD_~ArDw|Af@sNvBoqAvVsoK~HszCvB{zArN{{CfO_bEzO{wEfJk{BvQw{DjC_{@ja@{mEnPoeBbt@oyGzc@grE~iAg|Jrq@w_Hnn@gwEb[wdCvt@cxC~dAs{EfpA_eFjCoK~a@_~A~f@_wB~qBclIbe@cuB~RwhArNcy@n_@gqCbQsrBzO{sBz@{JzJkxAjp@{yIvo@ozIve@_rGbB_SvmAsjPv`@soFr]wyEj\\kpEvQo~B~\\oxEnP_wBni@cnHrSspCnPkvBz@sNzE_q@bBgTvBkR~CwVrDwVfEoUrDwQ~CsNvGwVnF_SbGwQnFoPbGgOzJ{T~Mc[vj@cmAjHcQzEcLnPw`@~Mo_@bLc[zOce@z~Nsbc@~CoKbB_IvB_InAwGbBsIz@wGz@kHz@gJRkHf@cL?gJ?{JS{Jg@gJ{@{J{@oKcBgJ_DcQgE_N{EsNoFcLoF{J_IwLwLoPod@kk@_SwVoUoZoU{Y{|@whAocCc}CsIwLoF_I{E_IwGcLcG_NcGsNoFoPoFkRkC_NgEcVcBsNcB_S{@gTg@sS?wQRkRz@gOz@{OvBoU~CwQ~CwQnFcVjHk\\~H{Y~HwVnF_N~H{OjMsSnKoPfT{YffAwwAbo@sv@rb@kf@fr@ct@bdCk`CrS_SrI{JnKkMzJ_NvL_SbGoKjH{OvGwQfE_NfE_N~C_NjCgOjCcQrDc[z@oKf@sNz@_Sf@w`@g@c[oF_v@sDgY_D_SwG_X_IkWsIgT{JgTwL{T_]gc@wLcLoUkR{TkM{c@_Ssl@gTg^sNknAod@whAw`@gdBon@gOoF{OsIcLkHsN{J{JsI_NsNgOsS_Sg^w[on@kHwLcGgJsIwL_IgJ{JgJ{TcQcVgOwy@gc@gm@oZw|Aox@stAgr@c`@gT{^_S{h@{Y{ToPsNsNgJsIgTgYoPgT{c@{m@_l@ku@w[sb@kWo_@cVc`@gO{TcVgc@_]on@c[{m@c[_q@wLsXwe@seA{Tc`@sSk\\_]we@oUsSka@{c@ka@c`@kM{OgJcLsIcQwL{TsIkR_]wt@sNoUkMgToUsXg^sb@{TkW_N_SwGkM{JsS_IgT_Ik\\{EgTsDkWcBkWcBwVSkMSg^nAcVbBgYvBkRfEsXrD{OvBgJfEsNjCcGrIoUryAcgDrq@{_Bbj@knAz^kz@fm@guArjAskCreAwdCr{@giB~R_l@nPcj@zOgm@vLo}@zEobAvB_b@nAg^z@gTzEovAz@_XfOcvDvBct@nAg|@Sgh@{@_b@wB{^wBgYkCc[SoA_DsXScBcGkf@cQcaBcQw|AwLgfAwL{fAcG{h@sIgw@{Jcy@{@kH{@wGS{@kf@kpEgYwdCoPsyAwo@{_G_X_|Bs{@cxHsXsaCcQo`BkHwo@wLogAgJ_v@o_@{jD{J{|@oPo{AoFw`@{Ew[oAkHoAcGkCoKwBwLgE{OsDgOsIgY{JgY{J{ToF_N{JsS_IsNoKcQcLcQsIkMkM{O_IoKoUoUs]s]o}@c~@g|@g|@{@{@kf@sg@{h@{h@od@od@sg@sg@{^c`@gfA_eAct@wt@cj@cj@on@wo@wt@wt@co@co@k_As`AksAksA_SkR{w@ox@ogAwhAsg@sg@cV{YoK_NgJcLwQkW_SgYkWc`@wGkMcG{J{EsIkHkM_IgOoZ{m@oKoUcLwVgOo_@_N{^wV_v@wGgTcGoU_IsXoKod@cBcGkMon@kHg^_Ikf@cGka@gE{YwBwQcBcQkC_XkCcVcB{TwBgYoA_ScBkW{@_ScBce@{@oU{@ce@oAw~@sDczBg@{c@sDgsBcBogAwBcrAsD{}B_D_cB{@co@gEglCwBoqAoAco@cBogA{@ce@SwQg@_]oAgh@wBgh@kCod@oAoUkCw[wB_X_D_XgE{^kHcj@gEkWwL_v@{TksAk\\gnBkCkRwLct@kHod@cVovAoKwo@{YcfB{O_`AkHce@oKon@cQ_eA_eAgnGgEwV{EgYce@wsCgOc~@sIgh@sIsg@kC{OcGc`@{@{EsDwVkHka@wBcLsDcVkHce@gEwVoA_IoF{YgOc~@kCcQ{Ek\\oAoKkC_XoAoUoA_X{@c[?_NR{YRsNnAoZz@sS~C{^nAgJrDsXfEwVzJ{c@rNce@vGwQrDgJz@oAjHwQnAwBnAwBfEsIvGoKrN{TjMcQnFcGnFcGrIgJzE{EjWgTbGgEvVgOnKcGbL{ErXcL~MsDnKkCvVgErIoAjMcBrXoAr`AwBrS{@vVwBrIoAnUkH~MoFjMkHnPwLbG{EvGcGvGsIzE{EzE_IrIgOzE{JfEgJrD{J~CgJbGsSvB{JbBcLnAgJbBcLz@sInA{Tf@cV?cLScQg@{O{@{JoAsNcBgOoA_IcBgJkCcL{EkR_DsIgJwVsNk\\sIsSc`@sv@s]_v@o`B{jDcrAwsCkMkWo`BokDsS_b@sg@seA_X_l@oFwLgEgJwG_NkHwLoKwQgJgOgO{TwLoPcV{YwLgO{OsN{^c`@s]g^ku@sv@_l@gm@sb@gc@od@we@gaAwcA{r@os@ox@wy@ccA_eAogAkiAct@ku@gfAchAgc@od@o_@c`@kWsXoU{Tos@ku@gY{YobAwcA_jAolA_jA{kAka@w`@_v@cy@_jAgkAk}Ao`BoqA_tAcQwQ{dBwfBseAchAgOcQ_NcQkM_ScQgYcLkRcLoU_Nc[cQod@wLg^oKw`@kHoZoKon@oF{^kCkWkCgTkRoyBwBcVcQ{sB_Is{@kHg|@kRswBo_@cjEoKwmA{E{h@{Ekk@{@sNcBoUkC_b@oAgY_D{aAg@od@SsX?gE?{ERsb@R_Xz@_g@vBct@jCsl@nF_tAjCwj@rDogAjHojBvG_~AbBka@nFkxAnAku@?gTS{Tg@wQSwVg@oPcBwj@oFgiBg@gOg@wQ?kHg@sIoAsg@oAka@{@s]oA_b@SkH?wGSkW?oKf@sXf@cLf@{JR{ER_IvBoUnFw`@jCgO~C{O~C{OrDsNrD_NfEgOfJcV~HcQbQ{YbLcQrN_SfJcLrNgO~z@s{@~H_IfOkMbQsNvQwLbQ{JnKcGzO_InKgEjMgE~RwGbL_D~z@wQn_@{JjRwGjRsIzJcGn_@oUzYkRj\\{TjR_NbLgJnK{J~M_NvVsXzT_Xja@we@vVoZvy@gaArXw[fTwVni@wo@jR_Sn_@c`@rIkHjMkMb[kWj\\gYbe@sb@fOgOjWc[rb@gr@v[on@zJcVvGoPbBgEz^gkAvBwGr]chA~a@crA~Ron@~HcVzJkWjWwo@bVoi@~a@ox@~a@sq@fm@s{@ni@ct@vt@{aA~C{EfsBkoCvmAkbBvy@whAzJkMzToZja@oi@jH{JrNkRfc@wj@fh@{m@ve@{c@vy@os@bBwBr`A_{@nAg@nKcLbGoFfOkRfOsSnZwe@j\\wt@bLgYjHsS~HkWbGwVrI{^bBkH~Hgc@rDg^nA{JnAkRbBoPnAc[z@oPf@_XRsNRka@?_l@?{sBS_{@?g@?oPS{iBg@oqFRw`@g@g{C?k~C?_eA?w[RwVz@wQbBkWnAkRrD_XvBgOzEwVzEcQvGwVjMg^fJ_SnFwLvQoZbe@gr@jRsXzw@{kA~MsSbGsI~MgTvQkWvVo_@nUk\\rDcGj\\_g@zEkHfJgOrv@_jAfTw[jMkRvL_SjHkMzJsSfJcVfOce@rDgObGsXvBgOrDcQfEc`@z@sInAkWf@oPf@cQRgO?cQSoPg@c[cBgYwBc`@_Dsb@oPgqCSgESgE{@gOcGseASwB_IchA{@oPcGo}@oAkR_IknA_Dsg@{E_b@cGo_@gJ{c@wLsb@_I_SgJgTwLkWoPoZsDcGwGcLgOkRkMgOcVoUsDgE{JkHcQwLgTkMce@sSgaAw`@gJgEkRsIkWgOoPwLoPgO_SsS_NwQcLcQkMoUsNw[_IoUkHoUwL_l@{EgYwBkRoAgOoA_Sg@_SS{ESoU?gYRcQz@_SbB{TbB_S~CkWf@sDrDsSjMsl@zYgpArXwmAfJgc@fEkWbBgOrDg^vBcVnAcVz@wQf@k\\f@o_@nAkk@nAsb@bBgYnAkRrDc[jC_S~CkRfOwo@z@gEvGsSbGoPzEkMjHcQzYcj@rDcGz_B{vCvt@crAvo@kiAfOgY~HsNnPoZjC{EzJcQnP_]rNk\\~H{T~HcVjCgJrDwLrI_]zJsg@bB_IfEwV~CsSjCoUz@_IbBoPvBgYvBg^f@wLrIotBfEs`ARoKz@cV~C_v@z@sNnFcwAbBs]z@oUfJs|BvBw`@nAoP~C_b@R{@nA_NnFc`@bG_b@vGg^v[smBbQccAbBcLzE_]jCsXvBsX~Ckk@f@{YRkW?sb@SgTkC{r@wQ_nDoAkW{@cQwGguAwB{^kC_l@S_Dg@oUSwL?{OR_l@f@sIf@cLRwGbBoUbBcQnA{Jr]_kCby@g_GrIon@nFs]bB{JrDcQvGkWnFoPbGcQnFsNfEsIbV{c@zEsInPgY~H{OzEsI~HcQbL{YjC_IbG_SzJce@bBoKvBcLvBcQf^snDbGcj@~C_SbBwLz@{EvBgJbBkHvBsIvGoUbGkRjHkRzJwVjCoFrg@whArfCk}FfOk\\bGsNbGkMfE{JfE{JbL_XzJ_XfE_NrDsNvBsIrDkRjCsSjCgTbBsSf@kHf@gOf@sS?k\\Ro{AR_jA?oKRgzAbBon@fEgh@vB{TfEoUzJkf@bGgTvQgh@vLs]zTon@~Ms]bcAowCnd@_oAjMwe@~H_]fJ_g@bG_q@bB{^nAw[~CccAfEwkBfEkgB~Cc~@vGos@vGsg@rIkf@bL{c@rNwe@b[kdAni@oeBnK_b@vLgm@rDcV~CcVnFwe@jCwe@bBw`@z@wj@f@skCf@shBf@gdBg@_v@wBct@oFc~@kHwt@{Jgr@kdAoqFc`@gsBcy@kkEgJwe@cLox@wBkM{OgpAcB_g@g@{OSkM?gOf@{Oz@kMbBoKvBoKjCoKrDsIjCkHbQk\\jHwL~CkHnAcGnAkHRcGS_IoA_IcBkHkCwGkCsDkC_DwBwBsDcB_DoAcQkCg^{Ec`@cG_Ig@wG{@{E{@gEoAsDcBkCwB_DkCkC_DsDwGkCgEcGwL_I{OoFsNoFcQ_Ik\\cLcj@kMwo@kHg^{@{Eg@sDg@wB{@wGcBkMwBoUcB_XkCka@wBka@oAgTcB{OkCwVoAsSkC{^oAsg@cB{fAkHsaH{@o_@{@wVwB{YwB_SgEgYgEcVwGsXcG{TsIcVcG{OsS_b@cV{^{Yk\\o_@{^cV{T{Y_XoF{EwV_S{^c[cQcL_NkHkRwG{TwG_SgEsl@gEgm@?gpAz@_SRgERsDg@sDg@wB{@_D_DkCsDcBgE{@oFSwGR{Ef@_Df@kCnA_DnAcB~CsDjC{@rDg@vBRvBz@z@z@z@nAbBzEvBjHbBzJz@jRf@zOf@zOz@zYf@fORrDRzT?~R?fTSn_@?fJ{@zr@SfOSrDS~\\SvG{@jR?fJ?nP?fESzEzJz@fT~Cjp@zO~RjHrNnFnZ~Mfc@~RjWbL~a@rSz@f@ffA~f@jf@bVv`@bQbBz@v[vLbe@~M~a@jHbVrDvVrDzYrDbLnAjMnAvLz@fm@bGzeDzYvpBfTzpAvLnn@~Hzw@~HjcDv[rDf@zJnAfnB~RrNbB~Hz@nlAbLrtA~MrDz@fdBbQ~lBjRvGz@rjAnKjWjCnbAnKr_Dv[~Cf@zc@~C~f@Rnn@kCzm@{Erv@oFrD?z^kCf@g@jlBoP~RsDrSoFzTkHzOwGjRcLrNgJfOwLbQoPvL_NbLsNvBsDrDoF~HsNfc@s{@bbDwuG~xA_zCvQ{^vGsNnFkMnFsNzE_NfEgOvL{c@j\\oqArSsv@jCgJvBkHjCkHrNw[zJsSnKcQ~HwLjHgJrIgJbGwG~H_IjHcGrIcGbL_IzJcGzOkHzTsIv`@kMviCkz@bL_DbLwBvLwBbLoAvL{@vLg@jM?rD?~C?vG?bLf@vLnAjRvBfTzEvQnFjRjHbe@nPve@jRbo@nUbwAni@be@vQ~iArb@jdAb`@jxAvj@b`@rNrb@nPrb@zOrNnFbGbBzfA~\\~_AjWzh@vL~HvBrv@rN~HbB~f@~HbG?nPrDfh@jHfcEjk@fYjCvLjC~_AjMzJvBvLnA~p@fJnzIbmAzfAfOjz@~Hj\\jHju@nKzYvGvL?vrAjRvQbBvGbBvBR~f@jHbwAnUbfGzaAfaA~WvVjHzfAj\\~RzEviMr}DraCvt@r]fEfc@z@b[kCjHg@rDg@rD{@fTwGb`@cLzc@_NfJkCbBSnPkCnK{@jHg@zTkC~W~CjHz@bVfEnd@~MjHrDzJbGzJrInKvLjf@zc@nfD~yCbzBzdBjRbQ~nAv~@fqCzxBfTvQ~\\f^jRzTvQjWjjCjsFjRf^fJjMzEjMnU~\\fE~HjpEnsEfw@vo@nd@~\\ni@f^by@ve@v|Pb`JjxAns@jf@fTr`Az^j`Hv_Cbt@rSbcArSrv@bLrSjCnFf@ni@fEzw@~Cni@z@v[?ffAkCvj@_Dv[kCj\\sDvj@sInzD{r@rb@kHrwGcmAbBSncCgc@bbD_l@vrAcVnZgEnoBcQvj@{@~f@?rl@bBrq@fEns@rIrg@rIrg@bLv|A~a@nZbGnZjCzYf@jWSfToAnZ{EnP_DzTkHbe@sSfOgJv[_XvVkWbV_]~MgTzO_]rIcVnU{w@vo@ciCzzAo`G~WwcAfY{kAn_@syAjH_XvhAcoEnPkp@nZgpAjMgr@vLw~@vQguAvBsSnFct@fEk_AjH{uAz@oUvLkeCnAoUnF_v@nAsN~Cw[~H{m@vwAg_LzE{c@bLwt@j\\wiCvVwkBzT_fCRwBnUceEnn@shLjHsb@zJ{c@bGsS~H{Tr]ct@b[{c@~MgOvGcGvG{EjHwG~R_NrIoFbVoKjWgJrXwGjiA_S~p@wLroAgTr{@gObLwBrX_I~WoKnKoFzJwGnUwQrI_IrSoUbQ_XvGcLbV{h@~dAgqCjMw[fO{YvQcVfT_SzToPfrEcxC~C{@jCcB~HcGv[_SzTgJvVgJfOgEbLwBfYsDbL{@zYg@~\\z@vGRz}Gnd@b[z@b[Sv[cBvLcBzh@{JzYsIjf@gT~W{OvVwQv`@c`@r]gc@rq@seAreFw}HngA_cBrIkMj_AcwAzuAswBvV{^rS_XjRoUfTcVfTgTb[sXfYoUrX_SvV{OjWsN~W_NjWcL~WoKzY{JnZsIzYwGzYcG~\\{EnZ_Dz^_D~\\oAf^g@z~DsI~iAoAvhAf@fh@z@vo@jC~iAbG~jHb`@b|ArIjsFzYvy@zEnZjC~RjCfTfEjWbGb[fJjWnKjWbLfTbLrb@bVrq@v`@vuBbmArXzOr]~Rr]~RjWrNvVjMfTrIzT~HrNzEnKjCvQfEv[bGrSjCrSvBrSnAbVf@rSRjWSjRg@jWwBnK{@zEg@zEg@jHoArg@oKf^{JnPcGnPwG~RgJnPsInUsNnUoPvQ_NzT_SjR_SzOoP~Ws]zOoUvL_SvL_S~MgYbL_XrIgTbGkR~HkWvGsXbLcj@bQ_`AvGg^fkAwuGzr@{yDjHsb@bGg^nF{^zE{^bGwe@zEsb@bGco@~Cce@~_A{gMjCg^fEc[fEw[nFoZ~Hk\\rIgYnKoZbLcVjMoUvQ_XnPwQrNsNnPkM~WsSjz@gm@rX_Sb[_XrSsS~MoPzO{TfJoPjMkWfJoUzJsXrIs]vGgY~Hw`@rrB{|JjHsb@fJsg@jHsg@bG{c@bGce@vGon@bLkdArv@wdHzEgc@zEs]vG_b@zJkf@~H_]vt@gvCnUo}@~H_]bG{YvG_b@nFk\\rD_]fEka@~Cs]n_Eghc@zEka@nFce@vGsb@jHo_@nF_XnFcVnPgr@vLka@jMw`@nPgc@fOc`@zOg^fJkRvQ_]vyEwgIr]co@zTka@~Wgh@~R_b@b`EcqIrS{c@~Mc[rNs]vLk\\fJgYnKc[rIc[~HgYvGsXbGsXjHs]rI_b@bj@_uCvGw[fJka@bLc`@~H_XvL_]vLw[rhBodErSsb@zOoZnP{YvQgYvV{^noLcmPbt@seAnU{^rSg^nU_b@nU{c@~R_b@bo@{pAjeCkdFjM_XvVkf@~MkWjRc[jR_XrS_Xju@o}@jp@gw@rpHk|IrSkWvV{^jWka@fT{^zOoZ~Rc`@fiGkeMnPc[vQc[jWc`@rXo_@vVw[jWoZnUkWzYsXzxGwaGjW_XbVsX~RcVrXg^v[ce@zm@w~@v~EcnH~Ww`@bL_S~R{^~MgYnPw`@bLoZbLs]fJc[jHgY~Hk\\~H_b@nF_]fEk\\fEk\\rDka@bB{YvBg^nAkf@f@_b@Rgh@g@gc@{@_b@wB_b@kCka@sD_b@{E_b@o_Eg~]gE_b@gEcj@sDkk@kCkk@oAwj@{@sb@Skk@f@ctJ?_l@g@sb@cBkk@_Dwj@_Dsb@{E_b@wGoi@{J{h@oKsg@kMsg@cLg^wLs]_N_]sNw[sSsb@giL_iSs]on@_b@ku@{r@crAc{IcwP{T{c@gTwe@sSod@{Ow`@gT{m@gOgc@gOkf@wLsb@gOwj@wxCwkLkk@o~BoKwe@gzAczG_Nkp@wGka@sIgh@oFod@cGgh@sD{c@{Egr@kC{c@oAsb@cBgm@g@_q@RwhAnA{w@bBcj@jWgxGz@kRz^{aKvBos@bBwt@nAsl@nAgr@z@co@z@ku@f@gaARo}@vBwaLRgYvBgeNf@wwAf@s`Az@{fAz@gm@nA_l@~Wk{Qf@on@f@sv@f@gaAfEwmPf@ce@z@o_@~Ckz@rDco@fE_g@fE{c@bGgh@fJwo@~Hod@bL_l@jMoi@nKod@bQ_l@vy@omCvQ{m@nZgfAbQos@fOon@nPgw@~Mgr@nPcy@fJ_b@nKgc@~Msg@fOgh@rN_b@zJsXbQsb@zOo_@jRc`@nKsSzOgY~M{Trb@{r@ni@wy@nlA_mBj\\oi@rSc`@vQ{^bQc`@rNk\\rNc`@fOgc@jMsb@~p@s|BbQsl@vLo_@vQsg@fOo_@bQka@fTgc@rX{h@zY_g@zYgc@fc@sl@~Wg^v`@cj@fTk\\fTs]nUw`@rSka@~Rka@nP{^nPo_@jRce@fOsb@rSco@vQsl@jsAonEf}GseUnKc[vL_]rIoUzJ{TrN{YbLsS~HsNv[kf@jR_XnU_XnPwQrXkWjRoPnPkM~\\{Tb|AgaAfh@k\\nlF{eDzO{Jz^cVjz@wj@jR{O~WoUbVwVzTkWrSsXvQwVzOwVbLkRjW{h@rNw[rN{^vLg^zJ_]zJ{^fJ_b@vGk\\fJcj@fEs]rD{^fEkf@jCce@bBoi@f@ce@?on@kHs|LkHg}LSce@g@kf@S_eAf@on@z@we@bBsg@bBgc@rg@cqInAkWfJoeB~Cwj@jC{m@vBcj@bBwo@nAon@f@wj@f@_q@Rgm@Swt@g@ox@{Jc`Jg@sg@wBs|BSon@RgYR_g@z@cj@nAsg@bB_g@bBka@jCod@~C_g@~Cgc@rD_b@fEw`@fEw`@fEo_@jHgh@jHgc@fJcj@jHo_@jH{^rI_b@fJ{^~f@ooBfOgm@vkBktHfT{|@~Hw[jHk\\bGw[bG_]zE{YzE_]zEs]nFkf@vBcVvB_XjCc`@bBk\\bBg^bBkf@f@_b@f@sg@Rka@g@{c@{@kk@c[wlNgT_}I{@ce@sSkaJgJ_}D{@c`@S_b@?sg@Rsb@z@kk@bBce@vB_g@~C{h@~C{c@vGgm@jH{m@jH_g@vGka@nKoi@nKwe@vLce@bLka@nKg^~Mw`@fOka@fOo_@~Rsb@rNc[~jCw~E~MkWzhJ_cQvQ{^fT_b@nP{^zT_g@zOc`@zToi@zJkWfYgw@zOod@rS_l@~Mc`@vrAwvDfOka@zOc`@fTsg@nUce@vQ_]rSg^zY{c@vV{^nU{YrXk\\~\\s]v[w[bmAsjAzTgTncC_aCjk@wj@~a@w`@~\\{Yb[sXve@o_@bj@ka@rg@s]jz@{h@bj@oZr~KwuGjRcLfuF_dDfoI_`FnZ{Oja@wQzYoKjW_IfY_Ib[cGvVsDf^sDb~@kHzw@_Ind@cGn_@cGz^sIn_@gJf^cLv`@_Nb[oKb[oK~cDwhAjRcGjWwGrXoFnUsDjWkC~WcB~Rg@nPSbVRbQRvQnAnZvBvfBnP~MnArSz@rSRjR{@nP{@bQcBrNkCrNsDnUkHzOwGnUkMfTsNb~@wo@rS_Nv[gTnZgOz^_NrXsI~WcGrXgErvEsg@fYgErXcG~W_InZcLvVoKzTwLbQcLrX_SfxG_oFrXsSzTgOnZwQnZcQ~R{JrSgJvVcLb`@sNneBon@zvC{fAfOkHjMkHbLsIbLgJrN{OfOkRrIgOfJcQ~H{T~HoUnFcVfEoU~CsSrDwVv~@ojGzEw[nKcj@vGgYnK{^rIwVnKsXzJoUnKgTfOsXb|F_vJncCweEnmCgrErb@{r@nZod@fc@on@ja@wj@vzBwxCf^kf@znBwiCbVw[rmBwiCnUg^nPgYjM_X~Mw[nKkWfJc[rIc[vGc[bG{YzE_]rDk\\fEsb@vQ{}BvV{`D~Hc~@bGwe@zE_]zEkWbGgY~HoZrI{YnK{YfOg^vLkWvLoUnP_XbQwVrSwVfzA_cBbj@co@~wDcjEz^w`@r]sb@n_@kf@z^_g@v`@_l@nd@os@~kOgxV~fEk`Hv[sg@fTc[~Wo_@fT{YnUoZbnCwgDjRoUnyBkoCv`@w`@fOwLbQwLbVsNvVcLzTsI~RoFfT{EjWsDj{G{fAzYoFvVcGnZoKfT{JjWgOvQwLnU_SrS_SrS_XvVc`@~MoUbLcVbQgc@zw@cuB~qB{kFzOw`@bLwVjM{TnPkWrN_SvQ_SfOsNjRoPjRkMnZoPvQsIfYcLrXsIb[_IfYoFb[sDfYkCnZoAn_@g@f_Bf@j{Bz@ve@Sja@oAnZwB~WwBj\\sDb`@cGja@_I~\\sIr]{Jr]wLj\\_NrXkM~WkMf^sSb[sSja@{Yj\\sX~RkR~\\s]nPwQfOcQzTgYrS{YzT_]vQk\\vQk\\rg@kdAv[_q@fTgc@vQs]jRs]bVka@b[ce@vVk\\rX_]rXc[fY{Yj\\c[b`@w[zh@c`@~\\gTz^gT~bBc~@~a@wVj\\oUnZoUvVgTvVoUjW_XjWc[bVw[nPcVzTg^jR_]bQ_]zO_]jMc[rN{^vLs]bLo_@fJg^nK{c@fJ{c@~Hce@jHod@rD_]nFkf@~Cwe@~C_g@bVonE~MkjCvV{wEjCod@~Cod@zE_g@vGkk@rI{m@fJkk@fO{r@zEkWvLkf@zTsv@~Mgc@~p@klBjHkRnU_q@jCgJnP_l@jHw[jH_]jH{^bG{^nFc`@~C{Y~C{Y~C{^vB{^vB{c@bBgh@bBcmA?_|GjCs{@f@c[z@s]nAgYjCsXjC{TrDcVzEoUbG{TbLs]~HsSnKgTbLsSvLcQfOkRnPkRjiAogA~_P_iNn`BovAzdBgzArl@sg@zY_Xj_A{r@zYkWbt@od@zc@oUv`@gTbpBku@bt@gTneBgh@vfB_q@fT{JvfBwy@r`Awe@fToKrcBcy@znB{|@roAgm@z`DgzAjeHofDvkBc~@nx@oZfw@wQ~HoAfh@wLrl@cQjxAsq@jiAsv@ngPs_Nb~@g|@jiAo{AzsBkcDnlAgiBjdA{pAvhAgkAbeEcqDzw@o}@r`AsyA~a@wy@ja@s`AvV_v@rSwt@bVsjAjM{w@faA_uHjMsq@zTco@nFkMbQw`@b`@kk@f^{^fm@ka@~sAod@rcLwbDjf@oUjp@{^zc@{^rg@oi@nx@{pAvxCo}Ej}AcnC~a@on@rb@sg@jk@c`@rl@sSn}@wQ~k@_Irl@wQrg@cQvo@ka@~z@sv@faAgpAvt@ogAfYk\\jHkHvQgO~WwQrN_Iz^oPb`@{J~k@oKjk@cGjnAsNjk@sNnZwL~WwLzc@_Xrb@{^zc@{c@vrAstAjiA{aAni@g^f_Bs{@jk@sXvt@gYju@{TzfA_]rg@wQzh@cV~WcQbL{Jni@_b@vj@gm@by@obAvy@seAb~@klBb`@w~@v`@ku@zh@on@ja@_]~f@oUrl@kRnn@sIn{AgTbt@_Svt@w[~HoFrb@sXfxBg_BznB{uAznBguAzm@sb@bpBshBfxB_wBr{@_v@rcB{fAnfDwaBzsB{kA~vBojBrzCgqCf~DsnDvkB_cBffA_`AbxC_aCnZsXnn@cj@bj@ce@f|@kf@b~@_g@vwFkjC~M{EreFwkBbkG{nBb}Cku@znBg^vQkC~lB{^b`@{J~RoFrNgEv[cLve@wQbe@sSz^_SvcAgr@bt@we@rcBk}AriDkpEjz@obAr{@obArv@_{@fnBwpBfToPnaDsaCbaB_q@n{Aon@zzAce@vcAo_@rl@wVn_@wQ~a@cVz^oU~\\wVbV_Sjf@sb@buB_mBbvDkhDrpCgxBzkAo}@j`Cs~AzTsNfzAo}@ziB{fA~p@g^~f@wVzlCwwArtAg|@rl@cj@jk@sl@~k@sq@~f@wt@~f@s{@ja@{w@n_@{|@v[wy@ns@wkBjH_SnKkWnKkWrSwe@rXcj@~Wwj@nn@sjAjf@{w@fm@w~@jbBw_CzfA{zAn}@_oA~_AcmA~dAolArg@gh@vj@kf@rl@cj@bL{JjCwBjWwQz@g@bV{Oja@kWzr@_b@fc@wVfxBwy@~tCcy@b~@{Yzc@sNv[{JntB_{@jiA_l@fEwBrb@{TnlA_v@~vB{zAjkEg~Dr~Ag_Bvt@cj@bfBknAfsBoqAzsBksAvV{ObVoPbL_Izw@wo@~qB{dBbqDc{Df_BoeBbsCw}CvmFk}Ffw@cy@rtAkiAbrA_`A~xA_{@z_Bku@neBgm@rkC_{@~|DgpAv|Awe@f{C{w@ryAg^beE{aA~jC_q@baBwo@ffAon@nbAon@fxBs~A~iA{fAbhAoqAjcD_qEbwAgiB~iAgkArtAkdAffAsl@~\\gOrtAkf@jaEg|@~bBw[rqE_{@znBod@~vBcj@znB{m@~{G_aCvlIclDfuFk`CzOwGnjBgw@rXcLzYkRzc@wVzToPjWwVrNsSzJkR~MsXzJ{YfJc`@jHkf@rDgc@jCgm@jR_qEfEku@nFox@jHox@zJ_`Av~@cvIfm@gnGjp@kwIbLwcArNs{@zOct@nUos@nUwo@~\\sv@fh@o}@rg@gr@bGcGfh@cj@jz@os@bhAs{@z^_XrIcGvQ_Irb@{Ob[kHb[kHbQoFrNoFvQ_IvQcLvLsIvLwLrN{OvL{OzJoPnZoi@bQ{^bLgYrN_b@rIc[~Hc`@jMs{@rSseAnKco@nFsXnFgTnFgT~HoUnKoU~HgObLoPnK_NnKcLrNkMfO{JrSwLnn@_]nP{JrNwL~MsNnKgOzJsSfJkWbGgTrIo_@nFgTrI_]jHcVbGgObGwLrIgOzJkMfJ{JjMcLnPwLvo@c`@zOcLjMoKrNgOnKsNfJ{ObLcV~xAcbDbL_XfJwVbGwQvG_X~CoP~C{TvBkWnAsXf@_Nf@oKz@oKz@oK~CgOjCcL~C{JnFkMrSc[nFkMjCkHbBsIvGc[z@_Dz@cBz@cBrDkCnPoF~a@gErXkCrg@gErI{@bo@wGfc@kCjWg@bGf@~WnAjqBnKjsARzJ?zO?jM?~a@?bLRzYSrN?rD?jW?jp@?nP?zO?b[?fJ?rg@g@b[Sf^S~MRnd@RfE?fh@RnZSzr@?jp@Rrq@?rv@?fT?z@?zY?vo@?~p@?j_ASzJ?rI?~_A?vpB?fE?zfARb`@?nZ?fw@Sr{@?zJ?vcA?v`@???ns@Rvy@S??~u@?R?be@?zT?jCRvBRjCf@jCnA~CbBbBz@nAjCvBrDnAnAjCbBbBf@vBR~CR~Cg@nAg@bB{@z@{@bBoAz@cBnAkCf@{@R{@R{@?g@f@sD?oAnFsIz@wBnAcBz@{@f@g@rIgEz@g@f@g@bB_DbLoFvVwLrNwG~CcBvBoArS{Jf^cQz^cQ~MkHjH_Dve@oUbQsIb~@{c@faAwe@vj@sXjf@oUfh@kWzh@wVve@oUn_@wQvLcGr{@sb@nUcLjCoA~HsD~a@sSzJgEzTcL~R{JrIgErIgEvQsIjCoArDwBnAg@f|@sb@fEwBzToKrS{Jbj@_Xf|@gc@jCoAvB{@rl@{YvB{@vBoAnK{Erb@sSfEwBrDcBj\\{OjWkMvG_DjCoAvBoAr`Aod@jHsDvt@{^nP_IrDcBvBoAby@w`@zEwB~CcBr`Ace@vy@w`@jCoAnFkCvBoArDcBrb@gTvo@c[rIgEnFkCzToK~McG~MwGnA{@jCoAz@g@bVcLf^cQrIgEnFkCnA{@bGkCrg@wVb[gObB{@~CcB~MwGfY_NvQsIbVwL~HsDrb@gTbGkC~R{JfkAkk@vG_DbG_Dj_A{c@jCoAf^{Of@SzEkCrIoFjf@oUzh@kWnPsIbe@{Tzw@c`@j_Aod@be@_SrIgEvBoA~_Akf@bG_DnFwBf^cQrvEg}BvG_DbLoFnFkCbBoAnA{@f@oAf@cBz@wBz@sDjCsNzEoUz@{Ef@cBf@cBf@{@Rg@z@oAf@g@nA{@nA{@~CcBrI_D~WoKrDcBrb@cQ~McGjC{@bG{@~McGzEoAnFcBjHoAzEg@bBSvL{@jp@kCrDSjHg@nF{@jHoAvGwBzEcBnFcBbQsIn_@wQ~\\{ObB{@f@SjCcBzEkCrNsD~RgJrl@gYrq@_]rDcBbB?nARnAz@f@z@z@z@f@z@z@f@z@z@f@Rz@f@f@Rz@f@f@Rz@Rf@RnARnARz@?nARnASnA?nASz@SnASnAg@nAg@z@g@nA{@z@{@z@{@z@{@z@oAz@oARg@f@{@f@oAf@cBRoAf@wBRcBRwBRcB?wB?cB?cB?wBScBScBScBg@cB?Sg@oAg@oAg@cB{@oAg@{@g@{@g@{@{@{@g@g@g@g@SS{@g@cB{@{@g@oAg@oASwBwB{@oAg@cBg@cBg@sD?ce@?sD?sD?ksA?oi@?kz@?_D?{@?oF?kdASwB?_b@?cG?{E?ox@?os@?sD?_b@?guASg^?sD?_D?_D?wB?oZ?k\\?_XvBsInASz@?vBg@z@Sz@g@z@g@RSf@Sf@g@z@g@z@{@jCgEz@cBRg@f@cBf@kCf@kCRsDR_D?{@?wBScBScBScBg@kC{@kCg@oA{@cBg@{@{@{@{@oA{@{@oA{@{@g@kCoAoASkCg@{@?gESoAf@g@?{@RcBz@g@RcBnAoAf@oARgEbGwBnKg@vBSjCSjC?bB?R?vBRjCRbBf@bBRbBf@nARz@z@bBf@nA","summary":"I 80, I 80;US 30"},{"distance":4769450,"duration":178318,"steps":[{"distance":418,"duration":52,"way_name":"McAllister Street","mode":"driving","driving_side":"right","direction":"E","heading":80,"maneuver":{"instruction":"Proceed to McAllister Street, then go right","type":"depart","location":{"type":"Point","coordinates":[-122.420018,37.78009]}}},{"distance":232,"duration":20,"way_name":"Hyde Street","mode":"driving","driving_side":"right","direction":"S","heading":171,"maneuver":{"instruction":"Turn right onto Hyde Street","type":"turn right","location":{"type":"Point","coordinates":[-122.415339,37.780726]}}},{"distance":971,"duration":96,"way_name":"8th Street","mode":"driving","driving_side":"right","direction":"SE","heading":135,"maneuver":{"instruction":"Go straight onto 8th Street, Hyde Street becomes 8th Street","type":"continue","location":{"type":"Point","coordinates":[-122.414763,37.77872]}}},{"distance":38,"duration":8,"way_name":"Bryant Street","mode":"driving","driving_side":"right","direction":"NE","heading":45,"maneuver":{"instruction":"Turn left onto Bryant Street","type":"turn left","location":{"type":"Point","coordinates":[-122.406967,37.77254]}}},{"distance":469,"duration":36,"way_name":"","mode":"driving","driving_side":"right","direction":"N","heading":3,"maneuver":{"instruction":"Take the ramp on the left","type":"turn left","location":{"type":"Point","coordinates":[-122.406665,37.77278]}}},{"distance":1525,"duration":73,"way_name":"James Lick Freeway (I 80)","mode":"driving","driving_side":"right","direction":"NE","heading":50,"maneuver":{"instruction":"Merge slightly left onto James Lick Freeway (I 80)","type":"continue","location":{"type":"Point","coordinates":[-122.404336,37.77638]}}},{"distance":9216,"duration":441,"way_name":"San Francisco – Oakland Bay Bridge (I 80)","mode":"driving","driving_side":"right","direction":"NE","heading":45,"maneuver":{"instruction":"Go straight onto San Francisco – Oakland Bay Bridge (I 80), James Lick Freeway (I 80) becomes San Francisco – Oakland Bay Bridge (I 80)","type":"continue","location":{"type":"Point","coordinates":[-122.391499,37.785488]}}},{"distance":1510,"duration":66,"way_name":"","mode":"driving","driving_side":"right","direction":"E","heading":78,"maneuver":{"instruction":"Take the ramp","type":"bear right","location":{"type":"Point","coordinates":[-122.305644,37.824963]}}},{"distance":25748,"duration":979,"way_name":"MacArthur Freeway (I 580)","mode":"driving","driving_side":"right","direction":"E","heading":94,"maneuver":{"instruction":"Go straight onto MacArthur Freeway (I 580), street becomes MacArthur Freeway (I 580)","type":"continue","location":{"type":"Point","coordinates":[-122.289247,37.826344]}}},{"distance":47212,"duration":1795,"way_name":"Arthur H. Breed, Jr. Freeway (I 580)","mode":"driving","driving_side":"right","direction":"E","heading":91,"maneuver":{"instruction":"Go straight onto Arthur H. Breed, Jr. Freeway (I 580), MacArthur Freeway (I 580) becomes Arthur H. Breed, Jr. Freeway (I 580)","type":"continue","location":{"type":"Point","coordinates":[-122.089438,37.690439]}}},{"distance":17852,"duration":638,"way_name":"William Elton \"Brownie\" Brown Freeway (I 580)","mode":"driving","driving_side":"right","direction":"E","heading":95,"maneuver":{"instruction":"Keep right at the fork onto William Elton \"Brownie\" Brown Freeway (I 580)","type":"bear right","location":{"type":"Point","coordinates":[-121.574044,37.741737]}}},{"distance":9471,"duration":342,"way_name":"William Elton \"Brownie\" Brown Freeway (I 580)","mode":"driving","driving_side":"right","direction":"SE","heading":127,"maneuver":{"instruction":"Keep left at the fork onto William Elton \"Brownie\" Brown Freeway (I 580)","type":"bear left","location":{"type":"Point","coordinates":[-121.414439,37.646096]}}},{"distance":310115,"duration":11040,"way_name":"West Side Freeway (I 5)","mode":"driving","driving_side":"right","direction":"SE","heading":134,"maneuver":{"instruction":"Merge slightly left onto West Side Freeway (I 5)","type":"continue","location":{"type":"Point","coordinates":[-121.333309,37.590453]}}},{"distance":362,"duration":52,"way_name":"","mode":"driving","driving_side":"right","direction":"SE","heading":139,"maneuver":{"instruction":"Take the ramp","type":"bear right","location":{"type":"Point","coordinates":[-119.340027,35.357634]}}},{"distance":14811,"duration":668,"way_name":"Stockdale Highway","mode":"driving","driving_side":"right","direction":"E","heading":88,"maneuver":{"instruction":"Turn left onto Stockdale Highway","type":"turn left","location":{"type":"Point","coordinates":[-119.338099,35.354937]}}},{"distance":7429,"duration":301,"way_name":"Westside Parkway","mode":"driving","driving_side":"right","direction":"NE","heading":65,"maneuver":{"instruction":"Go straight onto Westside Parkway, Stockdale Highway becomes Westside Parkway","type":"continue","location":{"type":"Point","coordinates":[-119.175008,35.355288]}}},{"distance":352,"duration":44,"way_name":"","mode":"driving","driving_side":"right","direction":"NE","heading":53,"maneuver":{"instruction":"Take the ramp","type":"bear right","location":{"type":"Point","coordinates":[-119.095241,35.36356]}}},{"distance":1202,"duration":106,"way_name":"Coffee Road","mode":"driving","driving_side":"right","direction":"S","heading":176,"maneuver":{"instruction":"Turn right onto Coffee Road","type":"turn right","location":{"type":"Point","coordinates":[-119.091979,35.365068]}}},{"distance":4442,"duration":296,"way_name":"Stockdale Highway","mode":"driving","driving_side":"right","direction":"E","heading":90,"maneuver":{"instruction":"Turn left onto Stockdale Highway","type":"turn left","location":{"type":"Point","coordinates":[-119.092373,35.354298]}}},{"distance":158,"duration":37,"way_name":"South Real Road","mode":"driving","driving_side":"right","direction":"SW","heading":203,"maneuver":{"instruction":"Turn right onto South Real Road","type":"turn right","location":{"type":"Point","coordinates":[-119.043412,35.354092]}}},{"distance":120,"duration":5,"way_name":"SR 58","mode":"driving","driving_side":"right","direction":"E","heading":91,"maneuver":{"instruction":"Take the ramp on the left","type":"turn left","location":{"type":"Point","coordinates":[-119.043403,35.352693]}}},{"distance":185,"duration":7,"way_name":"SR 58","mode":"driving","driving_side":"right","direction":"E","heading":97,"maneuver":{"instruction":"Keep left at the fork onto SR 58","type":"bear left","location":{"type":"Point","coordinates":[-119.042082,35.352662]}}},{"distance":932,"duration":35,"way_name":"Barstow-Bakersfield Highway (SR 58)","mode":"driving","driving_side":"right","direction":"E","heading":90,"maneuver":{"instruction":"Go straight onto Barstow-Bakersfield Highway (SR 58), SR 58 becomes Barstow-Bakersfield Highway (SR 58)","type":"continue","location":{"type":"Point","coordinates":[-119.040055,35.352558]}}},{"distance":200721,"duration":7734,"way_name":"Barstow-Bakersfield Highway (CA 58)","mode":"driving","driving_side":"right","direction":"E","heading":90,"maneuver":{"instruction":"Go straight onto Barstow-Bakersfield Highway (CA 58), Barstow-Bakersfield Highway (SR 58) becomes Barstow-Bakersfield Highway (CA 58)","type":"continue","location":{"type":"Point","coordinates":[-119.029784,35.352467]}}},{"distance":2064,"duration":158,"way_name":"","mode":"driving","driving_side":"right","direction":"SE","heading":139,"maneuver":{"instruction":"Keep left at the fork","type":"bear left","location":{"type":"Point","coordinates":[-117.080482,34.87434]}}},{"distance":5219,"duration":186,"way_name":"Barstow Freeway; Mojave Freeway (I 15)","mode":"driving","driving_side":"right","direction":"NE","heading":44,"maneuver":{"instruction":"Merge slightly left onto Barstow Freeway; Mojave Freeway (I 15)","type":"continue","location":{"type":"Point","coordinates":[-117.067582,34.878457]}}},{"distance":1765,"duration":63,"way_name":"I 40","mode":"driving","driving_side":"right","direction":"E","heading":92,"maneuver":{"instruction":"Keep right at the fork onto I 40","type":"bear right","location":{"type":"Point","coordinates":[-117.013164,34.885809]}}},{"distance":2963,"duration":106,"way_name":"Needles Freeway (I 40)","mode":"driving","driving_side":"right","direction":"E","heading":99,"maneuver":{"instruction":"Go straight onto Needles Freeway (I 40), I 40 becomes Needles Freeway (I 40)","type":"continue","location":{"type":"Point","coordinates":[-116.99392,34.886361]}}},{"distance":705474,"duration":25912,"way_name":"Needles Freeway (I 40;CR 66)","mode":"driving","driving_side":"right","direction":"SE","heading":133,"maneuver":{"instruction":"Go straight onto Needles Freeway (I 40;CR 66), Needles Freeway (I 40) becomes Needles Freeway (I 40;CR 66)","type":"continue","location":{"type":"Point","coordinates":[-116.964864,34.875632]}}},{"distance":311944,"duration":11671,"way_name":"Holbrook-Lupton Highway (I 40;AZ 77)","mode":"driving","driving_side":"right","direction":"NE","heading":57,"maneuver":{"instruction":"Go straight onto Holbrook-Lupton Highway (I 40;AZ 77), Needles Freeway (I 40;CR 66) becomes Holbrook-Lupton Highway (I 40;AZ 77)","type":"continue","location":{"type":"Point","coordinates":[-110.148349,34.915441]}}},{"distance":44493,"duration":1490,"way_name":"I-40 (I 40)","mode":"driving","driving_side":"right","direction":"E","heading":91,"maneuver":{"instruction":"Go straight onto I-40 (I 40), Holbrook-Lupton Highway (I 40;AZ 77) becomes I-40 (I 40)","type":"continue","location":{"type":"Point","coordinates":[-107.256886,34.993142]}}},{"distance":643937,"duration":23868,"way_name":"Coronado Freeway (I 40)","mode":"driving","driving_side":"right","direction":"NE","heading":59,"maneuver":{"instruction":"Go straight onto Coronado Freeway (I 40), I-40 (I 40) becomes Coronado Freeway (I 40)","type":"continue","location":{"type":"Point","coordinates":[-106.787302,35.065048]}}},{"distance":237698,"duration":10284,"way_name":"Korean War Veterans Memorial Highway (I 40)","mode":"driving","driving_side":"right","direction":"E","heading":87,"maneuver":{"instruction":"Go straight onto Korean War Veterans Memorial Highway (I 40), Coronado Freeway (I 40) becomes Korean War Veterans Memorial Highway (I 40)","type":"continue","location":{"type":"Point","coordinates":[-100.000288,35.226798]}}},{"distance":7980,"duration":326,"way_name":"Korean War Veterans Memorial Highway (I 40;US 270)","mode":"driving","driving_side":"right","direction":"E","heading":82,"maneuver":{"instruction":"Keep left at the fork onto Korean War Veterans Memorial Highway (I 40;US 270)","type":"bear left","location":{"type":"Point","coordinates":[-97.55705,35.461354]}}},{"distance":36769,"duration":1394,"way_name":"Vietnam Veteran's Memorial Highway (I 40;US 270)","mode":"driving","driving_side":"right","direction":"NE","heading":68,"maneuver":{"instruction":"Keep left at the fork onto Vietnam Veteran's Memorial Highway (I 40;US 270)","type":"bear left","location":{"type":"Point","coordinates":[-97.472422,35.463448]}}},{"distance":392,"duration":14,"way_name":"Vietnam Veteran's Memorial Highway (OK 3;I 40;US 270)","mode":"driving","driving_side":"right","direction":"E","heading":89,"maneuver":{"instruction":"Go straight onto Vietnam Veteran's Memorial Highway (OK 3;I 40;US 270), Vietnam Veteran's Memorial Highway (I 40;US 270) becomes Vietnam Veteran's Memorial Highway (OK 3;I 40;US 270)","type":"continue","location":{"type":"Point","coordinates":[-97.09397,35.383847]}}},{"distance":7762,"duration":277,"way_name":"Vietnam Veteran's Memorial Highway (I 40;US 270;OK 3;OK 102)","mode":"driving","driving_side":"right","direction":"E","heading":90,"maneuver":{"instruction":"Go straight onto Vietnam Veteran's Memorial Highway (I 40;US 270;OK 3;OK 102), Vietnam Veteran's Memorial Highway (OK 3;I 40;US 270) becomes Vietnam Veteran's Memorial Highway (I 40;US 270;OK 3;OK 102)","type":"continue","location":{"type":"Point","coordinates":[-97.089653,35.383885]}}},{"distance":95292,"duration":3392,"way_name":"Vietnam Veteran's Memorial Highway (I 40;OK 3E)","mode":"driving","driving_side":"right","direction":"E","heading":78,"maneuver":{"instruction":"Go straight onto Vietnam Veteran's Memorial Highway (I 40;OK 3E), Vietnam Veteran's Memorial Highway (I 40;US 270;OK 3;OK 102) becomes Vietnam Veteran's Memorial Highway (I 40;OK 3E)","type":"continue","location":{"type":"Point","coordinates":[-97.006274,35.38263]}}},{"distance":2312,"duration":82,"way_name":"Tim Vandiver Memorial Highway (I 40)","mode":"driving","driving_side":"right","direction":"E","heading":100,"maneuver":{"instruction":"Go straight onto Tim Vandiver Memorial Highway (I 40), Vietnam Veteran's Memorial Highway (I 40;OK 3E) becomes Tim Vandiver Memorial Highway (I 40)","type":"continue","location":{"type":"Point","coordinates":[-95.97046,35.431943]}}},{"distance":155485,"duration":5535,"way_name":"Vietnam Veteran's Memorial Highway (I 40)","mode":"driving","driving_side":"right","direction":"E","heading":79,"maneuver":{"instruction":"Go straight onto Vietnam Veteran's Memorial Highway (I 40), Tim Vandiver Memorial Highway (I 40) becomes Vietnam Veteran's Memorial Highway (I 40)","type":"continue","location":{"type":"Point","coordinates":[-95.945366,35.432061]}}},{"distance":236528,"duration":8527,"way_name":"Interstate Highway 40 (I 40;US 71)","mode":"driving","driving_side":"right","direction":"E","heading":81,"maneuver":{"instruction":"Go straight onto Interstate Highway 40 (I 40;US 71), Vietnam Veteran's Memorial Highway (I 40) becomes Interstate Highway 40 (I 40;US 71)","type":"continue","location":{"type":"Point","coordinates":[-94.317847,35.455424]}}},{"distance":200987,"duration":7282,"way_name":"I 40","mode":"driving","driving_side":"right","direction":"E","heading":97,"maneuver":{"instruction":"Keep right at the fork onto I 40","type":"bear right","location":{"type":"Point","coordinates":[-92.236251,34.776971]}}},{"distance":6756,"duration":260,"way_name":"I 40","mode":"driving","driving_side":"right","direction":"E","heading":108,"maneuver":{"instruction":"Keep left at the fork onto I 40","type":"bear left","location":{"type":"Point","coordinates":[-90.151803,35.155768]}}},{"distance":3463,"duration":153,"way_name":"Hernando de Soto Bridge (I 40)","mode":"driving","driving_side":"right","direction":"E","heading":90,"maneuver":{"instruction":"Go straight onto Hernando de Soto Bridge (I 40), I 40 becomes Hernando de Soto Bridge (I 40)","type":"continue","location":{"type":"Point","coordinates":[-90.078194,35.153037]}}},{"distance":144,"duration":12,"way_name":"","mode":"driving","driving_side":"right","direction":"SE","heading":117,"maneuver":{"instruction":"Take the ramp","type":"bear right","location":{"type":"Point","coordinates":[-90.040421,35.1514]}}},{"distance":188,"duration":15,"way_name":"","mode":"driving","driving_side":"right","direction":"SW","heading":240,"maneuver":{"instruction":"Keep right at the fork","type":"bear right","location":{"type":"Point","coordinates":[-90.039988,35.150463]}}},{"distance":592,"duration":45,"way_name":"North Danny Thomas Boulevard (US 51)","mode":"driving","driving_side":"right","direction":"NE","heading":40,"maneuver":{"instruction":"Merge slightly left onto North Danny Thomas Boulevard (US 51)","type":"continue","location":{"type":"Point","coordinates":[-90.040946,35.151265]}}},{"distance":5032,"duration":232,"way_name":"North Parkway","mode":"driving","driving_side":"right","direction":"E","heading":98,"maneuver":{"instruction":"Turn right onto North Parkway","type":"turn right","location":{"type":"Point","coordinates":[-90.037589,35.155695]}}},{"distance":146,"duration":13,"way_name":"","mode":"driving","driving_side":"right","direction":"E","heading":100,"maneuver":{"instruction":"Take the ramp on the left","type":"bear left","location":{"type":"Point","coordinates":[-89.982711,35.151039]}}},{"distance":203,"duration":35,"way_name":"East Parkway North (US 64;US 70;US 79)","mode":"driving","driving_side":"right","direction":"S","heading":188,"maneuver":{"instruction":"Merge slightly left onto East Parkway North (US 64;US 70;US 79)","type":"continue","location":{"type":"Point","coordinates":[-89.981463,35.15045]}}},{"distance":9707,"duration":469,"way_name":"Sam Cooper Boulevard","mode":"driving","driving_side":"right","direction":"SE","heading":125,"maneuver":{"instruction":"Turn left onto Sam Cooper Boulevard","type":"turn left","location":{"type":"Point","coordinates":[-89.98178,35.14864]}}},{"distance":316003,"duration":11718,"way_name":"I 40","mode":"driving","driving_side":"right","direction":"NE","heading":42,"maneuver":{"instruction":"Merge slightly right onto I 40","type":"continue","location":{"type":"Point","coordinates":[-89.88026,35.155544]}}},{"distance":3553,"duration":170,"way_name":"I 40","mode":"driving","driving_side":"right","direction":"NE","heading":56,"maneuver":{"instruction":"Keep right at the fork onto I 40","type":"bear right","location":{"type":"Point","coordinates":[-86.802831,36.17145]}}},{"distance":1564,"duration":69,"way_name":"I 40","mode":"driving","driving_side":"right","direction":"E","heading":97,"maneuver":{"instruction":"Keep left at the fork onto I 40","type":"bear left","location":{"type":"Point","coordinates":[-86.780469,36.148403]}}},{"distance":615,"duration":27,"way_name":"I 40","mode":"driving","driving_side":"right","direction":"NE","heading":64,"maneuver":{"instruction":"Keep right at the fork onto I 40","type":"bear right","location":{"type":"Point","coordinates":[-86.764497,36.153216]}}},{"distance":2786,"duration":123,"way_name":"I 24;I 40","mode":"driving","driving_side":"right","direction":"SE","heading":113,"maneuver":{"instruction":"Go straight onto I 24;I 40, I 40 becomes I 24;I 40","type":"continue","location":{"type":"Point","coordinates":[-86.758079,36.153889]}}},{"distance":335039,"duration":12574,"way_name":"I 40","mode":"driving","driving_side":"right","direction":"SE","heading":110,"maneuver":{"instruction":"Keep left at the fork onto I 40","type":"bear left","location":{"type":"Point","coordinates":[-86.731927,36.140597]}}},{"distance":239722,"duration":8653,"way_name":"I 81","mode":"driving","driving_side":"right","direction":"NE","heading":68,"maneuver":{"instruction":"Keep left at the fork onto I 81","type":"bear left","location":{"type":"Point","coordinates":[-83.388758,36.067021]}}},{"distance":1395,"duration":50,"way_name":"I 77;I 81;US 52","mode":"driving","driving_side":"right","direction":"SE","heading":135,"maneuver":{"instruction":"Go straight onto I 77;I 81;US 52, I 81 becomes I 77;I 81;US 52","type":"continue","location":{"type":"Point","coordinates":[-81.057288,36.956804]}}},{"distance":11201,"duration":399,"way_name":"I 77;I 81;US 11;US 52","mode":"driving","driving_side":"right","direction":"E","heading":107,"maneuver":{"instruction":"Go straight onto I 77;I 81;US 11;US 52, I 77;I 81;US 52 becomes I 77;I 81;US 11;US 52","type":"continue","location":{"type":"Point","coordinates":[-81.049739,36.946379]}}},{"distance":20813,"duration":741,"way_name":"I 81;US 11","mode":"driving","driving_side":"right","direction":"E","heading":77,"maneuver":{"instruction":"Go straight onto I 81;US 11, I 77;I 81;US 11;US 52 becomes I 81;US 11","type":"continue","location":{"type":"Point","coordinates":[-80.929018,36.948116]}}},{"distance":5410,"duration":193,"way_name":"I 81;SR 100","mode":"driving","driving_side":"right","direction":"N","heading":11,"maneuver":{"instruction":"Go straight onto I 81;SR 100, I 81;US 11 becomes I 81;SR 100","type":"continue","location":{"type":"Point","coordinates":[-80.729555,37.02575]}}},{"distance":151337,"duration":5580,"way_name":"I 81;VA 100","mode":"driving","driving_side":"right","direction":"NE","heading":22,"maneuver":{"instruction":"Go straight onto I 81;VA 100, I 81;SR 100 becomes I 81;VA 100","type":"continue","location":{"type":"Point","coordinates":[-80.705349,37.069543]}}},{"distance":47875,"duration":1716,"way_name":"I 64;I 81","mode":"driving","driving_side":"right","direction":"NE","heading":24,"maneuver":{"instruction":"Go straight onto I 64;I 81, I 81;VA 100 becomes I 64;I 81","type":"continue","location":{"type":"Point","coordinates":[-79.393437,37.797654]}}},{"distance":127023,"duration":4608,"way_name":"I 81","mode":"driving","driving_side":"right","direction":"NE","heading":40,"maneuver":{"instruction":"Go straight onto I 81, I 64;I 81 becomes I 81","type":"continue","location":{"type":"Point","coordinates":[-79.05083,38.117956]}}},{"distance":590,"duration":45,"way_name":"","mode":"driving","driving_side":"right","direction":"E","heading":70,"maneuver":{"instruction":"Take the ramp","type":"bear right","location":{"type":"Point","coordinates":[-78.301016,39.007978]}}},{"distance":75457,"duration":2720,"way_name":"I 66","mode":"driving","driving_side":"right","direction":"SE","heading":130,"maneuver":{"instruction":"Go straight onto I 66, street becomes I 66","type":"continue","location":{"type":"Point","coordinates":[-78.294677,39.007245]}}},{"distance":43320,"duration":1906,"way_name":"Custis Memorial Parkway (I 66)","mode":"driving","driving_side":"right","direction":"E","heading":85,"maneuver":{"instruction":"Go straight onto Custis Memorial Parkway (I 66), I 66 becomes Custis Memorial Parkway (I 66)","type":"continue","location":{"type":"Point","coordinates":[-77.519426,38.801374]}}},{"distance":223,"duration":15,"way_name":"North Lynn Street (US 29)","mode":"driving","driving_side":"right","direction":"N","heading":4,"maneuver":{"instruction":"Turn left onto North Lynn Street (US 29)","type":"turn left","location":{"type":"Point","coordinates":[-77.070762,38.898483]}}},{"distance":403,"duration":32,"way_name":"Francis Scott Key Bridge (US 29)","mode":"driving","driving_side":"right","direction":"N","heading":20,"maneuver":{"instruction":"Follow a slight right onto Francis Scott Key Bridge (US 29), North Lynn Street (US 29) becomes Francis Scott Key Bridge (US 29)","type":"bear right","location":{"type":"Point","coordinates":[-77.070771,38.900478]}}},{"distance":288,"duration":22,"way_name":"US 29","mode":"driving","driving_side":"right","direction":"NE","heading":57,"maneuver":{"instruction":"Take the ramp on the right","type":"bear right","location":{"type":"Point","coordinates":[-77.069159,38.903874]}}},{"distance":697,"duration":32,"way_name":"Whitehurst Freeway (US 29)","mode":"driving","driving_side":"right","direction":"SE","heading":115,"maneuver":{"instruction":"Go straight onto Whitehurst Freeway (US 29), US 29 becomes Whitehurst Freeway (US 29)","type":"continue","location":{"type":"Point","coordinates":[-77.065954,38.903392]}}},{"distance":178,"duration":10,"way_name":"Whitehurst Freeway (US 29)","mode":"driving","driving_side":"right","direction":"E","heading":87,"maneuver":{"instruction":"Keep left at the fork onto Whitehurst Freeway (US 29)","type":"bear left","location":{"type":"Point","coordinates":[-77.05813,38.902415]}}},{"distance":1521,"duration":97,"way_name":"K Street Northwest (US 29)","mode":"driving","driving_side":"right","direction":"E","heading":89,"maneuver":{"instruction":"Go straight onto K Street Northwest (US 29), Whitehurst Freeway (US 29) becomes K Street Northwest (US 29)","type":"continue","location":{"type":"Point","coordinates":[-77.056079,38.902412]}}},{"distance":351,"duration":41,"way_name":"K Street Northwest","mode":"driving","driving_side":"right","direction":"SE","heading":131,"maneuver":{"instruction":"Make a slight right onto K Street Northwest","type":"bear right","location":{"type":"Point","coordinates":[-77.038518,38.902523]}}},{"distance":601,"duration":56,"way_name":"15th Street Northwest","mode":"driving","driving_side":"right","direction":"N","heading":359,"maneuver":{"instruction":"Turn left onto 15th Street Northwest","type":"turn left","location":{"type":"Point","coordinates":[-77.034578,38.902523]}}},{"distance":378,"duration":25,"way_name":"Rhode Island Avenue Northwest","mode":"driving","driving_side":"right","direction":"NE","heading":65,"maneuver":{"instruction":"Turn right onto Rhode Island Avenue Northwest","type":"turn right","location":{"type":"Point","coordinates":[-77.034564,38.907925]}}},{"distance":35,"duration":5,"way_name":"","mode":"driving","driving_side":"right","direction":"E","heading":87,"maneuver":{"instruction":"Make a slight right","type":"bear right","location":{"type":"Point","coordinates":[-77.030585,38.909317]}}},{"distance":295,"duration":23,"way_name":"Logan Circle Northwest","mode":"driving","driving_side":"right","direction":"SE","heading":141,"maneuver":{"instruction":"Enter Logan Circle Northwest and exit onto Logan Circle Northwest","type":"enter roundabout","location":{"type":"Point","coordinates":[-77.030188,38.909312]}}},{"distance":0,"duration":0,"way_name":"Logan Circle Northwest","mode":"driving","driving_side":"right","direction":"N","heading":0,"maneuver":{"instruction":"You have arrived at your destination, on the left","type":"arrive","location":{"type":"Point","coordinates":[-77.03007,38.910072]}}}],"geometry":"sf|`gAfr|nhF{@oK{@cQkCo_@{@gOg@wGg@cGcB_XkCo_@g@oK{@_NScB{@_Dg@kCScBsDkk@g@gJsD_g@bo@_I~H{@~H{@~f@cGbGkCf@g@jCkCvBkCnAcBjMcQbLgObe@co@fJwLzYw`@bVw[jMwQbLsNfYw`@bVw[zYw`@nZka@zToZnZka@jCsDv`@oi@fYo_@zJoP_NwQsS{@gO?{JS_Ig@sIoAgJcBsI_DsI_DgJoFsI{E_IoFkHcGkHcGwGwG_IsIgJ{JkHsIwGsIoFsI{O_XkHkMoFoKcG_NgaAw_CoFkMwGkMkHkMsIgOsI_NoKgOoKkMwLgOcQgT_`A{kAolAsyAwe@_l@_X_]sX_]we@kp@w`@cj@cG{JkRk\\oUcj@_S_g@{Y_b@s]sb@oxh@cxk@kRkMoZw[gdB{iBod@oi@sq@cy@k\\s]g^_b@s]sg@oU{^sNcV{JoPsIcQ_bE{tIwGsNwGgOcGsNoFgO{EsNgE_N{EgO{EoPsDsNsDsN_D{O_DwQsDkR_D_SkC{TwB{TwBgTcsC{a_@gEkk@sDoi@sD_q@_Dsg@kCwj@kM_pCkMsnDoFcwAcBk\\{Egr@cQwfBgT{xBk\\ofDoPkbBoFoi@oPwfB{Ewe@{Esl@sDsl@cLg}BwBwe@_Dkf@gEgc@_D{YoZw}C_Ds]cLogA_I{r@{Jgw@gYczBsI_g@cGoZkH{YkM_b@sI{Y_DkRkCkRoAwQ{@_S?kRRsSnAkRjCkR~CkRfEcQzEgO~M{^nFoPzE_SfEwQrD_XjC{YbB_XR{TR_Xg@kWoAcVoF_v@o_@g{C{J_{@cBwQ{@_Sg@_SSwQR_Sf@kRbB_SbBsSvLkz@bQsjAjHwe@jCgTb`@omCnFs]rSoqAzO{fAzE_]fTwwAjH_g@zEw[fJ{m@~Mc~@nUs~AbGka@~CcVjR_yAzTwfBzEw[fEkWnFkWbG_XvGkWfEcQzEcQnFwQfJ{YzJc[jMg^~Ms]jMc[vL_XjMsXzOw[fO{YfOkWnUc`@rIkMfJ_NzJ_NbLgOjM{OrN_N~McLfOcLfOoKvQ{JvQsIvQkHvQoFzOgEbQsDbj@sIvfBs]zh@{JzJwBnKkCfJ_DfJgEzJoFrIcGnKsIzJ{JjHsIvGcLvGkM~HwQbGwQjHcVnFcVjWovAnKwj@nUsoA~WsyAjHs]~Hc[~Hw[rIoZrIsXfJ_X~p@ckBnbAspCnK_XzJcVvLsXjM_X~MsXrNkWjMwQbLcQbQcVjbB{xBzJsNrIkMjHkMvGkMvGgObGsNvGcQbGkRnFkRfEwQrDcQ~CsSrD{TnF{c@bj@sqEvVwpBbQksAfJ{m@zJsq@~RwmA~\\_wBjk@goDfE_XbG{YbG_XjH_X~HkWvG_SnlAsdDrIcV~H{TrNs]~Rgc@nKwQbLkRvLwQzO_SbLgO~MsNnPgOrkC_aCfTgTfTcVvQgTbQkWrNcVrN_XvLcVjMc[nlAg{C~HkRb[{w@fOo_@~Mka@vGgTvGoUnFsSbGcVvGgYnF_XnFoZzE_XrDwVjCgT~CkWjCkWvBcVbB{TbB{YbBkWnAc`@f@wVz@oZnAguAvGkbGRwVf@_b@z@_Sz@_SvB_SjCgTrDgTzEkRnFwQbGcQbGsN~HoPj_A_cBvQk\\zOc[jMkWjHoP~HoPjR{c@~_Ag}Bvy@ooBjMoZvLw[bLk\\n{AwjE~HgTbLc[jMw[fOw`@fY{r@fr@_cBb[ku@nKkWbLgTjMwVjM{TrNoUrNsSfO_SfOwQnPwQzOoPvQoPnPsNzOwLbQkMnPoKrNgJfO_In_@_Sb`@_Sb[{OngAkk@nPsIvQoKbQcLnPkMrNoKrq@oi@bQ_NrN{J~MgJfO{JfOgJjbBs`ArN_IvLwGnPkHbQkHnPcGjMgErNsDfO_DrNwBzOoAfOg@vQRbQz@nPbBnPjCrNfEfOzEfOvG~MjHjMrIbLzJnKzJbLbLr`AzfAzJnKzJzJbLrInK~HvLvGvLbGzOzEjMrDjMvB~MjCfOvBrNz@~Mf@jM?rN{@jMoAjMcBnKcBnKkCvL_DvLgEj_F_mBbQwGbL{EbLcGvLwGvL_I~MoKvLcLnKcLbLwLzJ_NzJsNzJ{On_@sl@jHcLnF_IbG_IbGwGnFcGbGcGbGcGjHoF~HoF~HcG~iAsv@vLgJvLoKnKgJzJ{JnKkMbLsNbcAguArI{JrI{JzJsInF{EnFsDvG{EbLkH~MkHjMoFjM{E~MsD~MkCjMwBrjAoPbV_Dbo@gJrb@cGrX{EfY{En}@cQfh@gJfc@sInUgEvQ_DfOkCrNwBjHoArI{@jMoAfOcBnjBgOvL{@nKoAnKcBnKwBzJwBbLkCnK_DbLsDzJ{EbL{EvLcGnKcGnKwGffA_v@r{@on@jRkMbQcLzO{JzO{JzO_IrN_IrNkHrN_I~MwGzOkHb[kMv`@{Ojk@_SryAgh@fOcGzOkHjMcGjMkHvLkHfO{JrNoKvL{JrNkMjMkM~MgOvLsNbL{OnK{OzJ{OfJ{OjHsN~HoPvG{OjHoP~HsS~\\s`A~H_S~HkR~HoP~HcQfJ{OjHwL~HwL~HcLjp@w~@rl@{w@nKgOvLoPnKwQfJcQ~HwQjHkRvVwt@fYwy@fJkWfJkW~HgTfJoUvLsXnKwVvLkWjM_XfO{YjRg^b[_l@bQw[~Rg^fOgYvaBw}CzJkRbLcQbLoPnKsNvLsNjH_IvGkHvGwGfJgJzJsIvkBwaBjdA{|@nd@ka@vV{Tf_B{uAngA_`AfTkRzJ{JfJgJrIoKrI{JrIcL~HwLjH_NjH_NvG{ObG{OzEsNfE{OfEoPrDcQ~CcQvBcQvBcQnA{OnAgOf@gOz@oPRoP?wQ?oPg@gOg@oPg@gOwGknAgE_{@_Dkp@kC{|@kCcmAf@_v@S{kAwBc}Hg@_rBSoeBoAsfH?we@oA_tAcLkoC_IkdAwB_XkRk}Ag^gsBcBgJwGk\\ox@cjE_Iwe@oKos@{Egc@_Dgh@cB{c@Ss]?s]z@wj@nAod@vLcuBvBcmAg@cj@cBkf@kCgh@cGsg@cG{c@gJ_g@gJka@wL{c@_Nsb@gOw`@_Nw[cQ_]kM_SkMkR{OsSkk@wo@_`AkdAg_B_hBcQsS{O{T{OcVkMwVkM_XwLsXcLc[gJgYsI_]_I{^oF{YgEoZgEka@_Dk\\cB_]{@gYg@s]g@c`@f@we@jCsq@bGsl@zEgYzEw[rX{zAnFw[nFka@zEce@~C{h@nAgh@f@gh@g@sg@oAgh@sD_g@{Esg@kH{h@_D{OkCgOwL_g@_b@c|AcLce@sIce@kH_g@{E_g@_D_g@oAgh@sb@_mV{@kf@Sgh@Rsg@z@cj@bBkf@vB{h@~C_g@fEgh@nFkf@vG_g@jHkf@rIkf@zJod@nKce@jMod@jMgc@fO{c@~u@g}BrNgc@bLce@fJce@~Hkf@nFsg@fEsg@fOcxC~Csg@rDsg@fE_g@zE{h@nPgdB~Cs]jp@k{GbL{kArI{pAbGcrAjCcmAz@soAg@wmAwBoqAoFoqAgJstAkMstAgY{vCsDwe@wBgh@{@we@?oi@~CceTvBgaF{@w}Cz@snDRc`@S{^{@o_@oA{^wBg^wBk\\_D_]gEs]gEoZoFg^sI{h@{@wL{c@__D{YotBsSwwAcL_v@wLg|@{Jgr@gYswB_DkWsDsXwBwVwB{ToFguASkM{@wt@vBgbHbB_NnAgfAz@kfER_l@vBc}Cf@crF?s|BR{c@bBgxGg@gbCbBszCf@{h@RkiARoxEg@_oFScVRkvBR_qJz@{}Bz@_pCjHc}Wz@gqH?gzARkxFvBklLnA_jFbGowRg@w}C~CoeGnAwuL?os@RovFR_`Af@gdBz@ckBRku@So`BRsg@z@cy@Sce@nAon@bB{TbBkRvBwQfm@grErDgYvB_SbBgTnAcVz@sSf@_Sf@{T?sSSgTg@wVg@wV{@kWsDwy@cBce@kHklB{TwwFsDkdAcG{fAkH{fAsI{fAsDka@{c@gaF_{@sbJwG{w@cG{|@sDcy@kC{w@oAkz@Sw[?seAnA{pAbBstAjMkmIvLk`Hf@o}@R{r@g@ox@cB{r@sDon@{Esl@wGoi@cGwe@gJ_l@oKsg@wL_g@_DkMgzAwtEc|As{Ec`@wrAsN_b@crAceEwrAo_Ewj@klBgTsq@soAc{Dsg@k}AchAsnD_{@{gCg|@cnCg^oqA{TwhA_S{uA_]sfCcLo}@sg@{cEwQs~Ak}A{vMsIgm@gJgm@{m@{tDkHce@oFkf@sD{h@oAwe@Rkf@bBgh@~R{tD~Csg@bGce@rIsb@bLka@nPsb@~Rc`@fh@g|@zTw`@vQka@zO{c@vLod@nKgh@jHkf@zEoi@vBwe@z@{h@g@sl@kCoi@{Egh@kHgh@{J{h@oqAkeH_b@otBccAkpEwy@cvD_zCg{McuB_gJkp@shBs`AcmA{r@sg@gw@oi@os@wo@kk@{w@_]kk@cj@gpAoKc[gOsg@oF{h@sIgaAc[o~Ls]gdLoP{}Bg^koCo_@{xB{aAwrFsSgfAkMc~@c[omColAg_L_{@c}HsDs]ce@ccFoFoi@wGwy@{JkqBwGo{AwGw|AsDsyAnAg^g@w~@g@wVwBo`BoAku@z@gaA~C{aAvVcgDfO{sBvGsq@rIsq@vL{h@~Rku@nU{r@j\\co@zYoi@vVs]jf@{m@jdAwrAvuB_kCrg@{m@v`@sb@n_@we@zbCkoCbrA_~AfoDgcEn`B{iBf^{c@fpA{uAvmAovAbkBgxBjf@on@zr@{fAv~@k}Azh@gaAzYwj@zm@wmAn{AgvCnjBwqDnZkk@njBcqDfjDo~Gzr@crAbV{c@zh@kdAvGkMn{AcxCjnAcdCfh@ccAnUwe@nZsl@jRg^rmB_sD~HcQvnC_oFrnD_|GzuAwnCrtAkoCznG_aMbaBcbDbGcLzfAswBzdBsiDn_@os@~sA{lCvxCo{FbzBcjEzc@_{@~tCoqFz^gw@n|Cg_Gbo@_oAnKcVb`@gw@b~@{dBja@ox@fh@_`AznBwvDjzEonJ~\\{m@r]{r@n`B__D~hNcgXjdAcpBbt@wwAjkE_nIbaLgrTfOgYfc@_{@~}FscL~p@gpAvuBodEr}DkyHfm@gkAzTkf@zzAktCfkAo~Bbe@s{@~xA_uCzkAk{BbVgc@jf@cy@j\\gh@j_A_yAjp@o}@~uEwuGvBkC~MwQnjBwiC~p@{aAfrJoaNbV_]r}DcwFjwD_oFvfBocCzlCgyDrrBgqCnK{OzrEwpGbkB{lCbkBkjCvy@olAj_AcrAz}BkcDztDgkFbL{OjuTgd[~|DwwFfO_Sv|AswBrwBg{C~xAsrBby@{kAbbNspRjzE_|GzaK{tN~sAwkBjMcQz^{h@nPcVb~@oqA~Wc`@bt@ccA~dAgzAvxCodEjk@sv@zr@{|@vxCssDn_@we@ngFcpGruCopDfmEwrFz_G{lHjHgJjrDsqE~}F_kH~{BgqCzyD_`F~a@sl@zkAwfBn}EwnHb~EkoHrg@_q@fr@wy@n~BsaCvLcLz_GkbGv}MoaNnKoKnzIs}IrtA_tA~p@wt@~p@_l@~p@kp@~u@sq@fc@{c@z^_b@nqAstAn}@{|@ntBswBzOkMni@ce@vj@gc@fm@sb@fw@ce@rv@we@vjE_pCfxBoqAjz@{h@jz@_l@b[oUnZwQr]cQvmA{w@~z@cj@fr@gc@vrAccAjp@sg@fnGceEvo@_b@n`B_eAroAku@bpBc~@fjDkxAnyBos@fxBgaAnmCwhAnqA{c@rdDgpArb@cQf_Bon@nUcLbdHgqC~iAod@ryAsq@nvAgr@rrB_jAv_C_yAfiBkiAr_D{nBf~DwdCrgEkjCjW{O~lBolA~iAgr@ni@s]znB{kAzpFkhDvpBolAn_@kRvj@sXnx@_]brAsb@ftDkz@~hDgw@jzJwzBb`O{eDr|VsyFnvA_]ve@gJviC{h@zqC{m@nn@cQzh@wLvbDgw@~u@_SzeDwo@feDsv@fnGwwAbo@_NnZkHv|F{pAjsAc[bcFolAfTgEzzAoUrl@cLrl@_NfbC_g@fbCkf@~rDon@jgGobAfTsDnPsDzcEoi@fw@{Ov_Cod@j`\\sjFjMcBr}SokDzlH_jAbmAwVfqHwmAv{Dgm@~cI_tAjgBgYf|@sNnqF{|@rfCka@rjAkRb[oFzw@kMbmA_S~nAsS~xAoUnlAsSfr@oKnlA_SzkA_S~dAcQjp@oKzpAgTvxCce@~nAgTju@wLjgB{Y~nAsSjnA_SvhAwQzw@kMbo@oKbjE{r@fpAsSjsAgTnlAsSzpAgT~yCwe@buB_]vnCod@vhAwQvmAsSrb@_I~a@gJn_@oKrl@oPfkAsb@vmAwj@vrAct@jnA{r@j~CkgBjnAos@fsBsjAvmA{r@roAos@zkA_q@bwA{w@ffAon@jnAos@fgCcwA~M_Ivo@s]roAos@jiA_q@nlAsq@jnAgr@nlA{r@jsA_v@zc@_XbdCstAbcAwj@jiAwo@~nAku@fkAwo@rjAkp@r`A_l@~\\cQz^gTvuG{tDzaAcj@rl@s]vhAco@~nA{r@rjA_q@bcAwj@j{B{pAnn@_]n|CwfBreFsuCnlAsq@vnCc|ArcBgaAvnCw|Afw@gc@bLwGrI{Ebo@{^rv@gc@bo@{^ryAwy@vo@o_@~a@{TfYgOzkAgr@~cDklB~iFgvCffA{m@~xAs{@j}AgaAfpAk_Ar`Aos@zw@gm@fOkMriD{gCzm@ce@fYoUnZ{TrdDggCfYgTjaJk`H~a@c[bj@gc@bt@_l@jk@we@zfA{aAffAccAbmFgfFrqJweJnPgOvVoUfc@ka@ziBcfBzJoKfeIszHbkG_cGzfA_eA~{LsmLjtCwnCvLgJfEgEnd@od@zdB_cBvzBswBvjJ_}InPcQnmC{gCvjJg~IfeI__IvdHwzGzOsN~W_XzdBwaBjp@co@nn@co@fkA_eAzTsSr`Aw~@bo@on@rX_XbV{T~{BswBju@{r@vuBgsBfdB{_BbLcLrfCsaC~_Ao}@n`Bk}A~_Ag|@z^{^~f@_g@v~@o}@vfBkbBzc@_b@fdBwaBzm@kk@j_Agw@bfBkxAbrAgkA~oC{}BvcAs{@rg@{^nbAox@f|@_v@r{@_v@ju@gm@blDsuCffAgaAvwA{kAzkAobAncCkqB~iAc~@~~C_kC~vB{iBfh@gc@jdAs{@f}BsmBnP_NvQoPz^g^b[w[~RsSzT_XzYw[rNwQ~Ws]v[ka@rv@ccAj{BowCb|AwpBn}@gkAnZw`@ja@gh@vhF{}GvQoUfT{Yzc@gh@~eCcgDby@seAngAwwAnd@sl@ni@wt@fc@wj@~W_]f^_g@nZg^b`@gh@~MwQreA{uAnd@sl@~HoK~HoKfJcLfTgYrIcLbLsN~Wg^vLgOzT{YjMoPvLoPzJkMbGkHbGsIrSsXnx@ccAnZw`@jvBwnCnyBsuCn{AooBbQgYz^we@j\\sb@zc@kk@zh@_q@~RkWfc@wj@bmAs~A~H{JjWgYbpBo~Bvo@os@zaAccAjCkCr{@c~@fr@ct@vdCcdCns@sv@f^g^ryAsyAjWsXngA{fAbj@gm@rS_Sb[_]fOcQjMcQzE{EzJoKbQcQfr@ox@by@k_AzOkRzuAo`BbV{Y~R{TzTgYjRsSfTcVrNsNrSoUn_@o_@bVkWb`@g^fOgObj@kf@zm@sg@r`Asv@nx@{r@zdGwcFvhKouIbdC{sBjgBkxAjMcLvVsSb}Co~BncCg_BbnCg_BraC_yA~yCojBj~CgnBnmCg_BrfCc|AraC_yAzhEskCvuBsoAr|BstAvsCoeBnn@c`@~RwLjxAc~@jvBgpArjAku@v`@oUnn@o_@jtHwtEzm@o_@f{WccPnyy@kmg@zYwQjhl@gc^~cI{|EzlCcaBviWgrOflH{mEz~eAcuo@~_KkvGztN_eKjxFg~DzuAobAvlIw|Fj{Gs{Eb{DomCb[oUvzBs~AfnBwrA~RwLn_@c[baLs_In_@_X~z@{m@nyQ_kMnaD{}BjrDwiCvsMceJb[{T~_PcaLvVcQb~JwdHzYsSbwK_uHnqFgyDjbB_tAvrAoqAbhAcwAntBgvCrnDgkFbbI{iL~lGweJrX_b@bj@ox@j\\_g@bwAotBzh@{w@zm@wy@bV_]fkAkgBj~HscLfso@sk_AflC{yDj~C{rEriXcp`@njGw`JzbCwlDbsC{cEnoBktCviC{tDb`Eg_GbuB{{Cfc@{m@ntBszC~R_XroAojBzaAsyA~dAo{AnPcV~\\we@jRsXjoC_}DjjHsjKvpBgbCnyBczBr|G{bHvuLoyLbwPkxPbo@on@rl@on@v~@{|@jcDwnC~eHcaGbfGw~EvbIocHbuBgxBrv@wt@rsDgjDbkBgiB~eM{nLrgJozIjmDwbDfTsS~kEs}D~kJ_iIbsCwdCbpGksFf|@ku@rXwV~gBs~AvmA{fAfw@on@jRcQzsBoeB~yHswGrmLs`KvVwQzuAoqA~_F_gEnjGcmFfpF_vEjnKkfJnUkRvzGs~FjeHscGn}E{hErfHcfGj~Hs|GnwH_wGbvDwbDr|Gs~FnyGo{FzpKceJvV{T~rDs_D~xF{|EfoDw}CjdFwjE~uEo_EzlHklGjaJspHzzKouIzlH_~F~uEouDnxEsgErjFwoEvrFc~ErhB{zAn_@{Yjz@gh@b_CknAv_CwrAb[cQjoH{~DveT_mLf}B{kAr_]s|Qf`IoiEj`C{pAvwAsv@reAsl@zaPwvIjhN_uHz^wQ~g[cwPnjLckGzlMgbHjqLkqGvyYs{Ob[oPv|Awy@b~@on@by@sl@jz@wt@rb@o_@vaQsqOjf@sb@~jp@gel@f`IocHbVgTn`o@{}j@fySk`Rn`L_{JfT_SvGcGjuJssIj_Acy@r{Js}IzaA{fAja@sg@j\\ce@n_@wj@~\\wj@jWod@bj@gfAj_AckBfYsg@noBozDjgBkmDbkBcqDznBw{DrrBk|Dr`F_vJbgDwuGb|AcxCjvBkfE~eC_`FbpBsxD~bB{eDj_A{iBvaBwbDju@gzAngFoeLjoC_cGntB{rEb_CwhFvpBkpEfxBcyEfzA{eDbhAwzBv~@wfBnbAshBni@{aAbo@_eA~_AkgBr`AgdBni@k_AroAg}Brq@olAjdA_mBriDcfGrzCgpFrb@ku@z|@{_B~z@w|AroAw_CroAswBjqB_sD~W{h@nUo_@zOkWfT_]zToZb[_b@nZo_@bQwQfYw[rX{Yz^w`@b[k\\jWkWrN{OvLwLb`@w`@jWwVbLoKni@gm@v`@w`@r]c`@vmAknAv_Cc_Cjz@o}@vo@sq@zm@on@~\\_]v`@{c@rS{TjwIs}Ir{E{aFfqC_uCjf@sg@nhComCzaAw~@nzN{hOjlBooBjk@gm@jsAguArmB{nBzw@wy@b`@w`@fcJ_qJ~~HwbIn{As~AvqDgyDv`EkaEvzB{}BzaAkdA~dAseAjgBckBv~@s`AjRgTja@kf@rg@gh@v|A_yAryAo`Bf^g^~a@o_@ju@ku@rvEg|E~uE_{EnfIkmIjtC{vCnwCo|CjqBsrBrfCciCntBkvBbpBwuBzm@co@zr@os@viC{lCnlAgpArhBckBngAkiAnqAoqA~bBcfBb~@k_Arv@cy@~iAsjAni@kk@fsBcuBnbAobArzCowCfgC{}B~xF{kFn~BswBfeD__Dj{BwuBzsBklBb[c[zzF_oFftDofDby@ku@~vGgiG~iFs{EfzF{kFjoHc|FzmEwgDfgCwpBbiCklBfuKkhI~xqAox|@viRcnMjyk@_m`@~ph@w`^nyLclIb|P{dLz_`@gqWnzeA{zs@buwAk|`A~yMw`JjdK{}Gr`A{r@rl@kf@zh@kf@~p@gm@nn@{m@~rDclDrcBcaBvsHggHjyMocMrlYofXv{Ds}DzhEkzEnmR_lTvhPoyQbyYw_\\~{G{{HjeMofNv|KwdM~qL{vMjgG_aHzdB_mB~kEo}EnlAksAjjC{vCzw@_eAvV_]nZsb@z|@oqAnyL{bRrwQozXjzc@cvq@jbB{lCvhF{{HfxGkdKzgH{uKffA{_Bb}CoxEfcc@_up@fzFsxIvwAswBnaXkea@vdCkrD~Wka@zr@seAzc@ct@zuAkvBz~IoaNvkG{rJ~dFk~HffFwbIniE{sGb{DcfGf~D{nGniEg}GfcEgsG~xF{~IjtCkuEbQ_SnK_NbQcVjWgYvLcLfOgJzO{EnPkCzYSvB?S{c@?os@?wmARwo@vBgr@f@on@f@{r@SoeBnAgsLnFwbb@bBogPvGojt@bGcz`@bBom\\RkhD?wiC{@cl]g@{kPcBsjPg@_nDg@kzJf@_uCSghEz@_lE?gm@?w~@_Dg|@sI{kAkRwhA_Sgr@oKc`@cnC_cG{h@s~A{Yk}AsSwfB_IsjAsDkxARk|N_DksAcGgkAgO_yA_`AsiI{h@s}DgJwhAwBcaBf@g_BSk}UR{cE?_yFbB_wGRgnBRcsCkCsaCSwkLg@guAkC{|@oKwcA_N{r@kRoi@sXwo@c[kk@{Tsb@_]gh@wVk\\{EkMwB{JwBsNkCsv@b~@sDjz@cBzESfE?jM?zOz@nUnAjHnA~f@rIv[zEbQbBvQnAnPf@zTRve@Sb~@?byEbBjHS?{J?{E?sfCRo|C?wt@Rk_F?gJf@wwF?g^S_]f@{}B?{E?_{@RgORwo@?cL?oqAf@wgD?kHRcdCRc`E?_D?sv@f@gh@R_`A?oF?{J?cG?kkERkH?goD?sD?sDf@ocC?{E?gE?oi@RcQSgOSk\\f@o_@?{Y?{c@?cy@RkH?_I?{|@RcfBRc|A?sIfEvBjiASzEwBRgw@f@gYvBkf@f@sNf@cQ?ct@RcaBf@_qEf@_v@nAkvGRkjC?{c@RksA?gTf@snDbB_aMf@w`ERka@f@waGvBclI?__DRg`I?{^SsrGSkf@RwjE?gh@{@_yFRsyA?ct@R_wB?_ISoZS{c@{@w~@{@o_@g@_SoAkf@kC{w@{Ek_AcBo_@kCwt@wBct@kCs`Ag@kf@?_l@g@_jAnAw~@vB_eAbBku@RgJbBwt@vBw~@bBox@fEwwAfE{uAz@oZf@{Yf@cQjColA~Co`BbBkdAf@gpA?ce@g@{kASopISk}ASku@?smGwBgfPSgpF?{^{@gyD?cvDf@w~@z@w~@z@_g@nA_]bBos@rSk{GnKceEzTo|HbB{^jC{^jC{^rDg^zEg^zEs]bGs]~Hw`@bmF_iX~W_oAzJgh@rIgh@jHoi@rIct@jp@{{HfJseAz^gcEzw@weJjHos@bG{h@jH{h@vQgkAz|@s~F~_A_mGbmAkhIzr@grEzJwo@vmA{jIr}D{qWboE{wYzm@odEvLwy@vBsNrDsS~CsSfEsSfEsSfE_SzE_SzE_SjMwe@bQsg@bGoPjHwQjHcQjHcQ~HcQrIcQrIoPrI{OfJ{OfJ{OzJgOzJgOzJgObLsNnK_Nfc@{h@jnKkoMjbGsfHrl@_v@zjD{cEnmCgeDz^{c@bdMoiOjHgJbt@s{@~M{TnZce@fYsg@rX{h@vVoi@bQka@zYku@vj@_hBf@wBrkCceJ~Mce@nF_Sbo@czBfm@srBrNod@fpAonEve@s~AjMsb@j{BorHv{DwxMfJwVjMc[fT_g@rtAsuCfzAszCb|AwbDn_@{aAf^cmAnZovAnUkbBjC{TvBgYbL_cBjCc`@bB_SnF_l@jH_l@~Hgh@fEgTjRs{@vLod@~Msb@jMo_@fOc`@vQgc@~`C{|EbLoUnPk\\ffAoyBnlA_aCroAkjCrDoFnFwLzEkMbGcQbLw`@rDcQzJcj@fEc[rDka@z@sSz@wVz@c`@SwQg@w`@oAo_@oAoPoFkk@_DwQsDgTkHk\\wLwe@gTc~@{Jod@{E{YwGce@cB{OwG{|@wBcj@cBw~@R{Tz@c~@fEscBnAgm@f@_]RkRvBwcArDcy@vBoZvG_q@nKwt@by@oiEb`@ojBnlAscGvGk\\vG_]~Rs`A~dAoqFfOs{@bLkz@nFcj@bGwhAz@gYfE{lCR_]zO_kMbBc|AbBgc@nAoPrDka@~Mkz@bVkbBfEw[rDcj@f@s]?kWSwQSkRg@oPSgJg@gJg@sIwBwVgh@c`EcBoU{@gTcBs{@S_b@oAsiDg@od@{@guARoZz@kMnAoPnAkHz@oFrNox@fYguArD_SnF{^nFce@fJ_`ArD{^nFg^~CoPjMkf@jCkHrDsIfOwV~\\ce@rSoZnKwQrNsXbVsg@v`@k_Ave@gaAfJcQjMwQjf@sl@jRkWf^{h@zJoPzJ{TzEkMrDcLfEwQz@oFnKchAzEsb@fE_SfEgOzJcVjM{TvLkRnZo_@bGsIv~@gkAfkAguAfc@sl@brAwuBfOsXjHgTrIgYnFwVn}@{nGjH_]vBcLvBkHnK_XbQoZvL{OvQ{OzTgOvVgTrg@_b@jWkWfJcLrIkM~\\_q@zOk\\bQc[~MgOrX{TzO{JnPgJbVwLrl@w`@bVkWbL{OrNwVvL_XfEsSjHk\\rSoyBrSkeCfT{lCnAsIzEw[bB_IzEcQvGcQnA_DbL{TrNsSjM{OjMoKjRkMvcA{c@~dAod@~_A{c@zOgJnKwGjRoPrN{ObLkRnKcVrScj@bwAgeDbLcVrNsSfJcL~HgJnKgJrNgJvLcGzOoFrSoFb[kCjvB_D~u@cBrIS~RkCbGoAbG{@zJkCzJsDrI{EbQgJzJ_IvGcGvGwGvG_InFkHrDoFnKgT~C_IfEcLbBcG~CcLjCoKnAgJjCoPnAcLz@kMzJ_~AbLojBnAk\\bB{TjCkRrDkWfEcQjCgJjCsIzEgOrI{TnKsSvQsXrSw[~k@w~@~iAojBjWw`@rIcLfOkRnU{TnPgOnK_If|@sl@~k@sb@~RcQjH_InF_IvLsSrS{c@~k@cwAnvAsiDvcA_kCfuAofDf^_`AfO{h@jp@ciC~CwLvL{h@zO_l@rIsSnP{YrtAwkBzdBsaCbe@_q@bGwLja@_eAjR_l@zzAwtEr]whAzh@w|Az|@glCvLwVzJ_SjMgTfaF_iIb_Cc{DnfD_yFfOgTbQ_SbBcBbVoU~HoFffA{m@be@{Y~McLzYsXjW{YbVk\\bj@k_AnUgc@vVce@v`@{aAbmAsdDbQ{h@zEgOjCgOnF_]bBoPnAgTjH{zAjMotBjCwe@jC{YnAgO~C_S~CgOrDsNvL{YvGwL~HcLju@gkAvLgTjHwQbLc[jk@gsBrXcy@fJ{TfJoPbLcQjMcQzJcLrXwVrIkHjWgObQsIfaA_g@fY{Oz@{@zOoKbLsIjMkMzpA_~AjW{Y~W_Xv~@{|@nA{@z|@s{@zJsIzJsIbQwL~MwGrNoFbL_Dj\\{Er]oAbqDkR~C?fJ?v[z@bVvBnlAbVbLvBv[rDjMf@nPRblDkCvo@SrIS~RwBrSsDvQoFvL{EvkG_xDfEkCzc@sXfYkMrXgJbQsDzJcBrX_DvBSnFSjHSfT?jC?bGf@vVbBbt@rInU~C~WrDbQvBrNz@fYf@jW{@~RcBfYgEfOgEvLsDrSsI~RsI~RsNnKgJnZgYjMoP~MsSfJ{ObG_NvGoPfJ_XbGoUbGoZfEs]~Hcy@~Hox@nU_fCzEgm@jCoi@nA{h@RseA?o|CR{xQRshQRo_@vBgh@~Cka@bGce@fJ{h@vGkW~Rco@j~Mcna@vGwQvG{OjMwVvQgYfOkR~MgOnUsSzT{OnPgJzO_InU_InPoFfr@sSn_@cLfc@kRzOgJfTsNzOkMfO_N~RsSfTsXzJsNzOsXvG_NfJgTfTsl@jCkM~Hw[nPobAzh@szCvhKkkm@jH{h@rDod@nAkWz@gYbBwhAjCs|BnAwwAjComCvBczBbGcmAfEw`@rIoi@baB{tIrv@w`EbhA{_GbGc`@bGwe@nFoi@fEwj@jCsl@bBkp@f@{r@z@{~g@?{T?co@?{w@?kM?wLR_Nf@gOf@{Jf@oKf@oKz@{JnAoKbBwLnAgJnAgJjCkMnFoZjHwVrI_XjH_SfJsSvVgc@~nAcuBvLsSngAgiBbB_Db[gh@bBkCb[{h@vB_DjWsb@jC{Efr@sjAr]sl@nZsg@nP_XnPgT~H{JzJ{JnZwVvLgJ~MsIr`Awj@zTsNbQoKnPkMbL{JjMsNnP{TbQoZjHsNjHoPnFgOnF_SzEwQ~CwQ~CkRvBsSbBcQz@_Sz@w[?gToAw`@wBk\\wB{OkC_SgO{aA{^w_C_X{dBwLku@syAkpJka@_kCkMwy@oKgw@{OwhAgJco@oUgzAgO{|@k_AwfGcy@_oFgOgkAoFsl@_D{YwBgYoKwaBwB_g@gEolAcBchASovARsl@bB_tArD_~Az@gm@z@on@Ssq@oAsv@kCct@wBsb@oFwo@oK_`AoFo_@cGc`@{Y_~Aw`@cuB{Jwe@sIg^{Js]gOkf@{c@knAw~@wiCs~AonEwV{r@{c@_oAwj@s~AkRoi@sb@{kAgh@kxA{_BkpEkbBgwEoKoZgJ{YsIw[oFcV{E{TsDgTcGka@sDk\\kCgYcBwVoA_XoAsXSgTSkRS{Yz@gh@nAk\\vBcj@vGwaBvGc|AzEwwArDcrArI{qCfh@klQ~C_eAzOcmFzJkhDrIgnBjMo~BfTowCbLsjAnK{aArN{pAjMw~@foDw_Rrq@cdCfYs`AnZ_`Avo@ojBfzFo}OfuFosOzeDkfJzyDgpKrhBseFfY{w@r{@gbCr{@_aCju@oeBrq@guAzc@sv@bj@o}@rhB{bC~k@sq@rl@{m@rb@ka@rb@w`@ju@sl@nx@sl@~z@oi@nqAwt@n}@sb@ja@wQzr@kWb~@c[zm@cQzm@{OfiBs]~f@wG~wDw[reAkCffASzqM{@jxP{@j_AcBrg@kCrg@_D~a@gEzY_Dvj@_IvmAoU~bBod@rg@wQjf@wQbt@k\\zr@s]b`@{Tf^{Tzw@cj@f^gYvmA{fA~a@sb@bV_XnUsXbe@sl@fc@on@vo@kdAvV{c@jp@o{Avy@kvBfr@oyBve@gsBb`@kqBnUotBnU_aCrXsdDjk@ggHrb@gfFv`@{|E~u@sgJv[o_Ev[g~D~Hk_ArNoeBfEwe@jM{kArDsXnUgdBbGwe@rIsv@~Hcy@~Cka@zOklB~WcgDv[g~DjM_yAvQoyBrtAcmPb[o_Eb[gtD~M{_BrIwhArI{pArDgaAvLkaEz@s]jCw~@rDw|AjCsq@~HcnCnUwbIfJwgDnKgyDbB{m@zEwfBnK_iDnK_xD~CsoAfE_hBnAkWzEo`BjMssDbQ{lH~Rg}GjCw~@~HcdCfEw|A~CwcAbB_g@b[kbL~a@_}NnFgiB~H_kCjk@_iSfh@cpQnKwqDv`@clNjR{nGzEojBnPcaGvGsfCnZc~JnPs~FjH{}BfYw~JrNkiFzEknAfO_yFbB_l@~Ho|CbGgdBbt@ohWjCccAvV_bJ~\\cfLnUw}HjWcvIjCsv@zEcfBzEgdBjHc_CzOknFvj@cnRjM{cEnZ_oKbGkvBbQ_wGv[oqKfOwmFnK__DbLs}Dfc@_gOnFczBSckB_DkiAcBoi@gEgr@oU{cEgO{vCoi@ouI_b@_uHgYgrEoPktC{J{zAw[w|F{OskCgOwdCgJcwA_Doi@g@_NoAgm@S{Eg@kp@z@ghERooBz@{}QSkdA?_}DRkjHz@w}C?k|D?ocH?_NRsg@?wGRw`@RkeC?wlDR_nDRsg@g@wgDf@ku@?{hEz@_iNRonJRoi@z@_hG?cy@SsIcBgpAsD{r@cBkWcGgr@sI{r@_Icj@_Igc@sIo_@sX_eA_`A{jDgO_q@oFwQ_D_NwL{w@cG_b@_Dk\\gJsjAoAc[oAce@S_b@?od@R_g@Rwo@Rce@?kdA?sDRksARgdBf@cbDRgnLRgeDRcnH?wQRgYz@sb@vB_g@rDon@vGsg@~M{r@bQsl@bV_q@z^_v@b`@co@zc@sg@f^s]fh@c`@~WsNjk@{Yfm@_Snx@{Tnn@_Sja@kRrb@cVfY_Sj\\{Yb[_]fTsXz^sl@z^ct@jHsSjC_IrNod@nKo_@rI{^nFg^nF_g@rDg^fEct@~CsoA~CwrAr]sePvVwkLrDoi@nF{^nKka@z@oArI_SbV_b@jHwL~Rod@jMkf@bGwe@jCs{@rD_wB~CcdCnAw~@fEgdBbB{uAjMglHnZ_tPnAwj@jH{tDfE{}B~H{mEf@c`@~MocHf@w`@fEkqBvBk_AnAwy@nFowCjHs|B~R_lEjHcaBrq@{oNnAw[vLcdCvB{|@vBs`AvG{qCzEkqBz@sl@jHkoCvLkiFjHcgDvBobAfT_}IjHoaDjHcgD~Csl@fEod@rI_b@fJc`@vaGgtNbdHwrP~mIgeS~oHsmQfsB_`FjqGosOnUsq@nbAcbDzh@caBfYgr@naDcsHj_AgbCrdDkyHjdAkeCfTgh@~a@wcArSkf@v`@sv@r{@cfBfTce@j\\ku@nPkf@fTgr@fYccAr]{uAfrE{tSvy@siDfkAcyErIc`@fnGkzYjyC{eNbwAkqGzOct@zuA{sGn_@kbBr`AsvE~xAotGzm@orCvtEo_TbLon@fJkk@~Hos@vGsv@~C_q@~CwmA~M{rO~HgoIzJgpK~HgrJbBk~CrIsaH~C_~AfJ{eDnFg~DzE{rEvB{vCfE{oDf@gc@zToeVvLkvLvB_cBzEksFf@_q@f@gr@vBcdCRct@oAwt@kHkeC{@g_BjCwlDbB{fA?kMf@cV~MkdPjHopSf@w~ERslEf@wpGR{zAz@{yDRglCSw_CSowCS{xBSwjE?k|I?sfCoAspCR_hG_IwhPSohCg@cmASku@wBwuG{@wcP?srG?otG{@sjPvBoyBR_]z@_SjCgY~CoZnqAgwJfhE_h[bVwfBz@cGz@cGfEc[fdB_pMzTscBfTo`BfJod@bVstAnUcmAnAwGrSgkA~M{|@rIkk@zJkf@fO_l@fO{c@rS_g@fY_g@~Wsb@bVgYjW_XzYkWvVgTzY_Srb@{TjWcLjk@cQb`@cLrl@oPfm@wLve@wGve@_Dvj@cBjdAwBzyDf@zlCjCjqBSvkBRv`@?n_@Rj_Ag@bcA?n_@{@z^sDbe@sIve@sNj\\{OnZsNzc@wV~u@wj@ja@oZ~k@gm@nd@sg@b`@ka@bhAgkAby@g|@z|@{aAnn@sl@~iAwmAroAgpAbj@sl@jz@s{@jp@co@zkA_oAvj@{m@~u@kz@jf@_g@j\\sb@bLkRbLk\\vG{Y~C_XnAk\\f@o_@oA{Y{Ew`@{Jg^cLoZcQ{YkW{Y{TgOw[sNw[wGk\\wBka@vBox@zEsg@z@c`@gEk\\cLw[_Sg^{Y_]g^w`@od@gh@{h@slEknFon@{w@cQoZkRka@kR{h@{Ooi@kHc[wGw[oFc`@{Eka@cQgnBoFon@wQocCsXolF_NskCcBk\\kC{h@kHkxAoFkoCSciMbBw~J~Cg}Lz@sfH?gsGz@crAcBwmA{Ekz@cQooB{JkiAwG_oA_DwrA?cuBf@wtERw`@z@c|AvBccA~HwfBz@kMbGos@vGkp@bt@o}EbjE_uWn_@gxBzJ{c@zTku@nPwe@fO{^nZ{m@fT{^b~@wrAzT_]~sAooBzkAkbB~tCgcErnDkdFz_BsdDbQ_g@fOwe@~HoZjR_{@vQobAv`E{g\\~MchAjf@_}D~CsXz`Ik}n@~_AwqI~sAcwKzE{^viCw`Tv[wiCbt@s~Fjp@olFjlBctOj{BkvQfJg|@v`@_~FffFgrw@neB{tX~MwuBz@oKjWs}DjC_b@~a@kqGfJgzAbLwfBni@ofIn_@oeGb`@_~FjM{sBbBkWfh@k~HvfBopXz@cLvQs_DnU{dGzc@_hLnA{Yjk@_qOnAs]vkBspf@vBsXzr@ggRb`@cyJz@kR~MokDvVgnGjCwo@~MsnDzE{pAjH_tAznBg_[zJw|A~Hs{@fm@oeGrS_rBbVw_Cfm@scGrl@g_Gfm@waGfm@caGfm@kbGfm@kbGfm@s~Frl@{_Grl@_~Frl@k}Frl@s~F~R_mBrXcnCfTwuBnFoi@ju@_pHrb@ceEv{XcioCzc@_lEzm@{dGzm@w|F~k@o`G~a@o_EnbAo`G~_A{kF~jC{~NntBooL~M_{@zJw~@~z@k|Njf@{~IrDon@jbBogZf^ckGnA_XrI_yAzT_}DnF{aAnP{vC~z@weO~z@odOnx@{tNnFw~@jMksAbQwwAntB_bOzY_rBf^wiCrrBwvNvy@caGfpAsbJzw@o{Fby@gzFf_Bo`LbG{c@b`@{lCzEgYbGsXzEwVrNsl@rNsg@jMsb@~Roi@v[cy@fm@wmAzYkf@v`@gm@jiA_cBfyD_yFjcDg|EfyDwwFnd@os@bL{Or|B{eDftD_tFj}AcdCzw@c|AroFspMzfF{}LbtE{iL~f@c|Af^_oAzTo}@nPgw@nZs~AnPseA~a@kyCnx@kxFrsDwnWzh@gtDzc@oaDvmAg~IfYk`CrXsnDjfEsys@jRcqDv[gyNnKoxEvLo`GfYkmNR_IRwLzm@{|YjCsoA?_IjCsjArN{gHf@cVRwL?wG?kk@?{|@oU{cOcQ{wJcBwcASs]gJ_jF_S_rLg@s]SgTcL_wGg@gYwL{lHka@gnVkCkgB_DckBg@wj@g@gc@So_@{|@o}_B?w[oFweJ?wo@f@wVRsb@jCox@nA{TvBk\\vBkWrD_XbQksAzEsXvG_]fTg|@zEsSrS{m@vVsq@jdAkoCbaBonEzuAssDr{@{gCbVsv@rl@{}Bf|@wtEfxBooLryAoaI~WwnC~H_pCkf@ooQoA_]kCwcAsDkz@kHk_A{Jkz@wrAosJ{h@_}DoUcfB{OsjAcLcy@_SkxA{O_jAwLwy@wGc`@oKce@cQgr@wQcj@_{@glCoZs`AgTo}@gJ{h@gJ_q@cGon@{E_{@cB{r@?_`AvB{|@bGs{@~C{YjHon@zOo}@fYgpArNwt@nKct@bGwe@nFoi@vBwQzEon@zEs`AbB{w@z@s{@Ss`AwG_`FwBs~AoAwrAwBogAsDk_AoA_SwG{kA_eAkrN_]coEoP_wBkMcfBcGk_AsDwj@sDsq@sD{w@_DccA_D_tA{@gfAkC{qCsDwwF{EgiGkCozD_DouDcB_aCwBofDwBokDcBk`C{@{|@wBccA_IcaBoKcmA{JccA{Jox@gTgpAce@k{Bgr@gvCwo@cnCs]w|As]_hBoP_jAkRsyAc`@w}C_]keCw[wpBkWkxAk\\waB{YoqAoKwe@_X{kA_l@cdCwQk_AsNs{@{Jgw@wGkp@kH_{@oFox@_D{w@wBobA?s{@R{m@nAg|@rDox@rDsv@~Hsv@zJ_jA~MgpAzJguAvGcwAvBkiAz@ovAz@wsCz@{w@jCseAfEkdAzEwt@~HkdAj\\k|DjWszC~f@{_G~f@k}Fve@{uF~f@{_G~f@gzFrg@_cG~RoyBzYopDvQoyBzOsyAvL{aAvQolArS_jAr]g_B~\\syAfpAovFzpAgzFbQ{w@jW{fAjM{m@nU{kAbQgaAjMgaAvQsyA~M_~AvG_eAzE_jAfEkqBzEglCrIwwFbBwj@nA_g@vBkz@fEomCrD_`AbGcrAzOcuBjHgaAr]krDbQsmBnPs|BbGseA~HgdBnFc|AjCogAjC{uAnAstA~CgdGnAkqBnAskC~CkbGnA_|BnA_aCjCs~FnAkqBbBotB?gT?kbB{@wwA{EkyCwGwdCwQk}FwQwaG_D{fA{@cQwB_v@gOolFkMcjEwQ{dGwQg_GkCc~@{@gYs]kbL{E{iB_DsoAkWs_IoA{h@oKkcDwGk`CoFgiBgEwhAcLcgDsNkaE{@c[we@cdM{@wVkRgfFwGoeB_XsnD_X{xB_]{vC_NgfAkHku@cGolA_DogArScrPzEw{Df@_l@Rkp@Ssl@g@gh@g@kWoAwe@cGojBo_@_oFkM_cB{w@gpK_l@{eIoUsdD_q@gcJ_jAsvOoAcQojBc_Wwj@{eI_SkoCsIwdCcG{~Dsb@ohWoPwdCkMcmA{T{nB{J_q@cV_oA_Ngm@gOgm@c`@_yA{^oqAwrAg|EkmNk|g@gbR{jq@_vJ{c^ovA{wEkdAkjC{w@{_BkxF{uKcQo_@wt@cwA{vCsyFod@gkAw`@whAw[_eAc~@opDwt@owCox@kmD_Noi@sdNomk@{jDgtNgJ{^{h@caBcVkp@s`A_aCoqFwhKkMk\\_]obAw`@kbBc`@_kC_q@syF{h@coEgEk\\suCo`VgYklBgc@skCwe@g}Bct@_zCos@_zCw`@caBsI{^{Oku@{Ok_AkMox@kHcj@oF{h@kHgw@cGk_A_IoyBRwQg@_b@g@klG?s`F?c`@g@{_BRos@~CkoH~H_`FbBgc@r`AgcT~WguFrNkjCvB_g@vG_oAnKwzB~HcaBzEkoCf@ku@f@g|@{@wcAg@co@sI{vC{@we@sb@stK_Dsv@_jAgkZwBcy@obAspWgEcrAcBwj@{EkiAsSogFgJw_CcG_hBsb@waLgTkgGsDwy@_Dc~@oA_b@oAoUo_@_{Jk\\{~IkCco@wBoi@ce@ocMkRsoFkCku@sIocCgJc_C{E{fAcBce@{@oUoPkkEsIwzBgE_tA{@gTcBw`@oAsb@{EcmAoAod@kM{jDsS_eFoi@otL{@cQcGolAwGchAwBwV_Dgh@{TcqDgTsnDwBk\\wVsxD{OgqCsDon@cBwVcwA{wTs_D_ng@gfA_~PkWg~Dgh@krI_v@otLwtEc_u@{iBwtYgiBkzYgkAcfQgw@ktH{Jwy@g@oFsIos@sDkWkR_cBgOwmAoFgc@_Dc[cBsN{Egc@SsDoF{w@_Dgw@oAwe@Sgm@f@kdAf@wQbBgc@nAs]jCct@bQ{aFnK_dDnPgrEnF_hBrIkrDoAksAkCod@cBka@sD_g@wGgr@gJkk@gJ_l@wpBwwKo}@_`Fka@{xBgYk}AkvB_hL_{@_vEsv@{hEksA{lHkH_b@sDsSwQk_AsjAgnG{w@woEg|@ctEoZgdBgE{Tce@ciCgJwe@o}@{|EcVovAg|@cyEoAsIoPo}@_v@gcE{Ocy@gcJwbg@oeG{l\\_S_hBoFw~@_Dk_Ag@sq@nAwmAbGsyAbLgxBfc@_xInKotB~MwiCbGchA~MspCvBs]z^_pHzE_`AnKwuBzTsgEvBwj@f@kf@R_b@S{^{@{^_Dgw@sDce@wG{m@sb@orC{sB{{M{OgfA{Jg|@sD{h@wBce@oA{m@R_wBSco@{@ka@kCon@sIo}@{c@ctEoUwzB_Dk\\gEsb@{Ek\\oKgr@kMco@cL_g@wQwo@oU_q@od@wmAc`@s`Ac`@ccAg_Bw`Ewy@gxBk\\_`AcVkz@cL_g@{Jsg@gJ{h@sIgm@oFon@sIchAoFscB{@s]_I{vCkCwy@gEgaAwGsv@oKo}@kHkf@cQw~@gT_`AgEsSw[kxAw`@klBo_@wfBoK_g@gJka@sb@kqBgc@kqBw`@wkBw`@giBcqD_yPsNkp@sl@spCcG{YgTgaAshBopIco@cxCox@kwD_g@g}B{Os{@wL{w@sIkp@cGkf@{Esl@{JksA{EguAoAkp@{@wy@Rsv@z@w~@jCkdArDos@zEku@nF_q@vLgfAnPolA~Mku@bnCcvNrSwhAnPgfAzJkz@jMovAzEs`AvBsb@vBos@z@gpAg@{kAoA{|@oFc~@wGchAsDod@wGsl@kHoi@gEoZoKwy@ct@gpF{{CkzT_DkWwe@gjDgw@k}F_hBooL__D_{OkoCwxMgTkdA_Nsv@_Ict@_D{c@SoFg@_SoA{c@g@oi@f@wt@fEkz@vGkp@zJsv@bQ{r@jqGsqYviC{iLjk@k{B~z@_fC~z@gxBj`C_lEzOkWvzBwvDfO_XnlAgsB~W{c@zJoPnmC{rE~jCkpEbVka@vfLwsRzOkWzh@c~@fOwVvlI{oNj\\wj@nqA_|B~\\cj@~Wod@~xAwdCvkBgjDbVsb@bj@{aA~M_Xrv@syA~Wsg@~k@kiArIgObGkMnU_]fT_Xjk@kf@ve@sXvo@oUziBkp@fr@wV~RwG~{Box@zTsIfw@sXr{@c[~WkMvVsNf^oUb`@k\\vQcQzOwQ~W_]zTs]bQw[zO_]fT{h@vj@o{ArSoi@jM_XjCwGjM{TjR{YbVw[jMgObQwQbVgT~HwG~W_Sj\\sSnZsSfT_NrSkMnF_DbGsDrNgJve@c[~k@c`@nd@_Xv[cQnd@_S~R_Ifh@_Nve@cLfzA_]rl@wLj_AcQzdG{pArXcGne`@goIrb@gJfpF{kAr_Dkp@j\\_IjcSkkEz`I_cBr]kHzwE_jAbcAg^be@wQvj@cVzr@c[nUkMrtAgw@v[{Tv[gTrl@gc@rzCsaCzpAwcAzzAwmAj`HcrFfOcLbQ_Nz_G_vEbBoAvL{JvhAo}@jrIc_H~R{OvuGkiFzOwLj~HwkGvGcGrwG_jFryAwmAjf@we@n_@od@bo@w~@v`@gw@r]wt@by@_hBb~@cpBvVkf@nfD_fHzYkz@fTgr@bVk_AbV{pAzYsaCvG{tDsNkjMoPwrK_DwxCgOcjJf@wt@jCk_AzEsv@vGsjAvGgfAvG{fAvGogAnA_]z@sb@?w[g@s]wBobA{Ec_CoFohCcGg}B_D{r@oFgkAsIolAwBc`@kCk\\{JwzBcBos@g@_l@S_l@?wo@Rs{@SwhAg@cy@{@seAgEw_CkH{lC{Jk`CkRsdDwLcuBo_@otGka@{gHcGwcAgJgzAkRkcDgJg_BkH{pAsDsg@kCoi@gEsv@{Es{@gTcqDcG_`AgYgaFsNkeC{E_{@cBw[cBc[{@{OcGcy@cL{xBsNg}BcG_`AgJ{_BgEox@gJw|AwB{^sDsq@sD_l@kC_g@cG{aAcGwcA_IoqAgJgdBgTkrDsN_fCkRsdDwQ{jDsI_|BgEgiBg@c[?oAoFgcESwB{@wy@sDcxCcBogA{@g|@?wBgEc}CgEw}C?cBwB{dB?wBkCgnB?oAwBwfB?kC_D{bC?kCkCsmB?kCkCckB?_D_DoyBgJ_uHg@sSkH{iGsDsuC?_I{EopDgJkeHSkM?_D_IcfG?wG{EceES_NgJkjHS_DsDkhDgEkhDScB_DskC_D{bC?kCoAwy@oAwcA{@gaAoAobASoPS{O{@ka@cBknAwBsmB{EctESgOg@wj@wBciCS{TsNcoOS_ScBsfCcGotGg@c`@kHkrIg@ka@_DclDcL{fKwLw{DgJk{BwQcxCcGcy@k\\wqD{r@{_GwB{O_Igh@_Ns{@_b@sfCo_@cpBkp@gvCon@keCgOsl@{E_Ssb@syAcLka@oi@wfBg|@c_CwcA_pCgsL_bYcL_XgYsq@gvCo~GogAkjCkbBopD_|BslE_~KcfQ_g@_v@ovP{vW_IwLsoKoqPcLcQgsBk~CgbHovKszCwyEsuC_qEkwDcaGg|@crA{^_g@cGsIgJwL_NcQka@_g@gYo_@w~@seA{aAseAcfBwfB{YkWcj@sb@whAgaAszC{sBocCwwAwV_NgkAsl@geDovAkdAc`@_eAs]g}Bco@w~@oUw~@_S_]cGogAkRgdBsXka@gEka@{Eg}BkR{pAcGcwA{Ew`@{@kdA{@{fA?wo@f@cpBrD{fA~CksA~CwnCrI_oArDwbIbVwe@nA_nNn_@caBzEcfGbQwB?{}BjHgfA~Ccy@vBwLRkgBzEoi@bBsD?g~DbLwBRsyAfEs_D~HovAzEoqArDs`A~Ck_AbBgOz@{Tf@od@nAccA~C_eAvBwdCrIcj@fEcj@bGgc@nFs]rD_Df@{Ez@k\\rIce@fJox@jWox@zYgc@bQ_l@zYwe@jWku@zc@we@~WgfAjk@sb@zTsb@~R_jAzc@sg@rNgc@nKod@fJwe@jHwe@jHkf@fEgh@fEs{@vBku@RgaAwBwo@gEoi@cG_]_Dw}McwAsdDs]oqAsNsg@cG_g@oF{aF{h@kW_DoqAgO{w^k|D{J{@cyOscB{@?clNo{A{@S{gRkqBs]sD{aKogAcBSk}Fon@wBS{eNsyAkCg@grOwaBwBSoeQklB{bCkWgY_DceTg}BkcNsyAgtDw`@sDg@wnHgw@kbBwQcsCc[_sDw`@ogAcLcuBoU_DSgYkCk_AoKobAcLkCS{rE_g@szCw[{hEwe@gaA{JstAgOkH{@wgDs]ccKogAwiHgw@oAS{nBgTg{Cw[sIoAk|D_b@sDg@khD{^cxCw[_kCgY{Y_DknKwhAsDg@w~E{h@cpGgr@c|Fco@w~Egh@k_AsNcBS_yAgTkuEox@cG{@kk@kMwo@kM{JwBo_@kHcrA{YwzBsg@kCg@wLkCkoCku@smBon@ct@wVsq@wVs`Ao_@_eA{c@ox@{^co@c[gnBgaA_I{E{O{Jsv@_b@sv@od@oP{Js{@cj@_NsI{h@k\\oi@_]cj@_]ce@oZwQcL_SwLwj@s]gY_SoZkR_uCwfBgEwBsb@_Xod@gYs]sSgYkR{h@w[gzAk_AodEohCkk@s]k{BcwA{|@_q@kf@w`@_S{O_ScQgc@ka@c[oZgc@{c@cGwG_{@s`Asl@gw@gY{^{m@o}@od@os@kp@kiAcQ_]_So_@sS_b@oZsq@kRsb@ka@ccAsl@gdBwj@caBg^ct@s]_g@_XsXw`@c[gm@gYwo@sN_g@oF{c@g@we@z@sv@jMw_Crb@whAjR_eAbLs`AfEseARk\\cBg|@kH_oAoUct@{Tsl@cVos@s]ku@ce@c|AksA_yAolAgdBknAc~@kf@cVoKsv@gYwj@wQon@kH{^sDwcAgJgpAoAc[{@cmA{@{tDsDglC_Dgc@kCod@kHsl@kM{c@{O{c@gT{r@od@ku@_q@gr@sl@s]c[_pC_aCseAc~@c[gYolAgkAwe@wj@_jA_hBos@syAw[wy@on@s~Agh@{zAgh@kgBsX_jAsb@wuB{YkbB{YgxBwLgaAgY{}BkWsrBsI_`A_Dce@wB_b@{EkdAwB_~A?s~AfEkbBjH_|B~CogAjCwmAf@sXz@_tA?w~@cB_xDwBo}EkCotGScj@kCssD{@whAoAowCcBkaEbB_pCRgEzEklBzJshBvQs|BvQ_cBjf@cgDni@gtDni@geDfm@sbEni@kmDzm@c{Dz|@gzFnhCc|PvmAs_IjuEcmZzjDw~TzzAs{JnZ{nBzh@ssDnKogAzOcwA~HsjArIkgBbBkf@~Co{AzJoxEvL{sG~HkmDnFcsCvBknAz@gYrD{sBjjCccqAzOc}HbBsv@~MozIbG{sBbGcqDvGcdCfEs`AfOw_CzEsq@bLogAjRcfBrXstAnZo`BjW_jAjf@ckBziBwrFb~@cnCvbN_w`@vkB{pF~{BotGbGcQvmAopDzr@_rBjMg^nF{OjHgT~M_b@rI_XfEgOfE_NvGoUnPwj@zEgTv[gpAjRk_AbGkWfEkWbG_]zEoUfEsX~CgT~CcVvG_g@nFw`@jCsXfEk\\vG{r@fEsg@rX_dDrq@wbIzbHwky@nbFgyl@~f@gzFb[_sDrg@_hGvGox@rD_g@jCsb@rDolAnAwj@RsSRsX?k\\S{Y?cQg@g^g@sXg@o_@oAc`@kCwe@{Es`A_Don@sDwt@kWoqF{iBod^gEsv@wL{bCgEchAkCcmAcBovAf@gkA~Ck}AbG_cBrIksAjMksAnK{aArSc|AbVcaBrSsrBnKgnBvGs|BRcsC{@sjK?seA?w`@SsXg@syFcB_uWSk|D{@kmDwBkjCgE{lCcG{}B{Eo`BkRwrF_SgzFgYokI{YkrI_DgsBSgaAf@obAnAwaBbGwuBbG_oAzEku@bLkxAfOk}AjMgfAnPkiAzEk\\fJkk@ns@c{DbG_XjR{kAjMsjA~McfBbB{r@vB_`Ag@ccAcB{aAsDo}@wGg|@sN_tAstAkbL{J_{@gOwmAgJolAsDsv@wBs{@{@czGg@_`AoAw`@wBc`@sIox@sIkf@_I{^kMwe@cQce@gOg^cQs]on@w~@coEsyFcmAo{Akp@k_AcVw`@sNgYcLsX_Xw~@sIcj@wGgh@kC_l@g@wt@nAwo@nKcqDbBc~@{@{|@sD_{@oFgr@{Jox@cLon@wL{h@_]{zAkHo_@wG_g@wGod@oFcj@sN{pAgOsjAsN_q@kR{m@_S{m@sXkz@_I{YsIsb@{J_v@sIs`A{O{zAkR{kAoPs{@_]ovAwQsq@_Nco@kM_v@{Jkz@wGgw@gEobAoAk_Af@_jAzEgkAzJwmAjWotBbGcy@f@sv@kCon@kHsq@wL_l@kRcj@{Tsg@_X{h@{c@{w@od@k_AkWkk@kR{h@wLgc@cVgfAwLct@wQshBcBs|BfEc|AbG{dB?wt@S_SSgTg@{Y{@wQg@gOg@gOoAsScBwQwBkWoA_NoAcL{Ew`@sDkW_D_SwGs]gJka@kMco@ka@chAg^cy@_l@ogAo`BwuBswBcsC{Y_b@kW_b@gTka@gOc[gTcj@sN_b@gTkz@kRg|@oFw[oF{c@cGcy@gEsl@f@csCrIk}ArDcy@fE{|@nPgtDrIg}BnF_yAjH{pAjC_b@zOshBnPchAfTwrAbj@kcDv_CwmUfc@sbEbwAc{NjHovA~C_eAz@obAoAwhA_DkdAoPs|B_]{xB_]g_Bw[{fAsXku@sb@gaAgqCkqG{c@ksAoPon@_]c|AgJgh@_Iwo@kH_l@gEwe@cBsSgEkp@wBo}@{@_oASwt@{@ccFg@omCkC_|L{Esa\\RwfBfEswBnKgiBbLscBrl@seFbe@_bE~HcmAvBckBcB_`AcG{pA_Igm@cGod@kH{c@s]kbBw[kdAc`@_eAoi@seAwj@ox@wj@wt@ku@ct@{uAkiAwqIkeHsmBojBsS_XwV{YgaA{zAon@_tA{J{Tku@kvBod@_rBoPogA_Isl@cGgr@oAsSoFcy@gEwhAoAgfAfO_iNnA_eASct@{@_oAoFw|AcLwaBcLchA_N{fAwQ{fAoUgkAw[wmAsg@caBcj@kxAooBghEssDwgIc_H_qOwcAczB{|@kvBknAwiCgr@c|Aw`@obAc~@{gCkf@ckB_XkdA{gHwyYkqBkmIka@gzAw`@cmAcmAc}CkgBodEkoMcyYgvCczGoK_Xw_CwhFksA{{CoqA_zCct@{_Bwy@{iBc`@s`AgnBwjEsoFs|LgTwe@cu`@sj}@kf@s`AstAgsB{|@{aAsoAoqAgkAkxAc~@_oAsl@olA{^_{@{Yg|@sSsl@c[sjAcQ_v@kWo`B{O_rBgE{iB?gkAbGshBfJgpAv`@o|C~z@spH~H_tASgdBkM{_BoU_yAwj@{dB{c@sjAoZgw@{Y_{@w`@stAw[gpAsg@wzBs]_mBw`@_zC_Iwy@{Ewj@{JwrAsN{{CsDooBg@g_BoKcz`@wGcrU{@ggCcBwaGoAwo@kCkk@oF{m@sIsv@wVgpA_Swt@sNce@w[ct@k\\gr@kf@sv@{r@wcAwuBs_DwhAgiBwy@klB_b@wmA_XobAwQo}@wLsv@wQkxAgOgsB_D_~AkM{hJ_D{fAcG{pAcLgdBcVcdCk\\ocC{T{kA{Okz@szCw_MkCcLckBgvH_lEshQsDsNg_BsrGo|Ck`M_eAkdFwy@gmEsb@_pCwt@svEk\\_uC_XsfCgc@{rEkk@{vHw[gsG_N{hEcLstFwBcnC{@{_G~CgwEvLsrG~RsyF~WcmFbt@kpJrb@s{E~dAo}JreFknd@jW_~AzY_yAnU_`Abe@giBb`@knAvt@wpBv[g|@vj@_oAfh@chAnK{TfgCwhFnKgTvaB{oDvLwVr_N{cYns@o{ArIwQrxDclIrg@wmAfaAwiCzh@{zAfh@caBbe@c|A~a@c|ArSox@jH_XbVccAjR_{@n_@oeBz^gnBffAgzFbfB_gJv_CgbMvLwo@bdC{vMv`Joye@by@wjE~WoeBjWcpBvQcuB~HolAnF{fAjHggCvB_lEvG{mOz@w|AnAwcAvG_oA~Cwe@bGsl@vG{m@rIsg@nFw[rN_v@vV{aAr]kiArl@gzAfYkk@zuAwzBbj@_q@fvCofDrjA{zA~xAswBzdB_dDrq@w|Aj_AkeCfr@oyBrv@szCruMkcg@vgN{rh@z|@s}Db~@wtEbVguAvt@_vEfc@geDj\\owCv`@sgEzY{cEfw@owMzfAkyRvzB{s`@nAcQbLgsBn_@kvGjp@{iLbV_gEfYo}EbLgiBzJ_oAnKkiAnZcxCv[{lCb|A{vMrjAg|JzJg|@bvDk{[baBouNbGkdAbB{`D?w`@RstUf@gqHf@wvSR_cBnAsaCf@_]jCgeDnAw|AfEopDfE_cBbGknA~C{h@rDoi@nFct@~a@c{DfJw~@rI_tAvGwaBz@oZz@{h@R_oAg@c|A_D_jAoF_tA_NscB{Egh@gYwzBgc@o~B{Jod@cQ_`A_Icj@sIgw@cGku@gE_`Ag@k_AnAwcAjCcy@vGgw@zJs{@rIox@bGkk@z@wGnPg_B~H_`AbGku@~Hw|AfEsjArD_hB~CspCbBcmAnKcgDjRkyCbV_aCbLku@vV_~Avt@wvD~WknAjCwLfpAwkGnKgh@zT{kAnP_jAbQkvBrDogAf@sNf@oK~MgmEz@sS~u@owWnAos@Son@kC{fAsIknAkHsl@gJkk@kMkp@cQwo@oqAghEsNgh@oPox@cL_q@kH{m@gEco@sDc~@g@{c@Rsb@jCkiAvG{w@fJ{|@nPgzAbGgm@rDco@bBwe@R_g@oFggHcBklB{E{_BwGcrAS{EoAoUsDkk@_D_l@{TssDgEos@wB{r@?gm@nA_q@~C{w@fEkk@rIkp@nlAwlIfJ{r@nF_l@nFkp@~Cwt@nAgaA{@{kAwB{r@_Doi@oFkp@{Ew`@cGwe@sDwVgT{aAk_AwbDwVw~@wQccAoK_v@kH_{@ct@_zHgOogAoKcj@cQwt@oPcj@_Swj@gYkp@gc@seAs]seAcQgr@{J{h@_Iwe@wGwj@gO{_BsNk}AkHccA_D{w@g@knA?{JvBox@rDos@bGsq@j\\ciCfuAogKbj@weEzOsoArIccAfEobAbBsoAwBknA_IgzA{YcsCoFgfAwBwhARgfAzEovArNkbBr]{gCbQ{_BfOoyBnF_cBf@_oAkC_aC{EcwAgJwrAcGsl@sI{w@sNkdAwV_tAg@gEsDkRs]_hBoZwzBsNkbBsIgpAsDkiA_Ds|BsXgwTkHgpFwB{dBgJkyHkC{aA_I{aAwQogAoUs{@kWkp@{Os]wQw[c[od@_NoP{OcQs]oZc`@{YcV{O{YcQkH{EgnBogA{sBs~A{m@gm@o_@sb@w[ka@w[gc@s]wj@_]on@{^gw@wVsl@sNg^sX_{@w`@oqA{fAgeDs]_v@_]{m@w[{c@cVc[sNkRoUkWkp@wj@kmDo~B_g@_]kWkRo_@w[{c@sb@kp@ct@sXg^kp@_{@gh@_v@s]od@{Tg^c`@we@_]{c@ka@_l@_{@whAkf@_v@ox@{pAw`@cy@kf@{fAoKgYsNo_@{r@shB{h@guA{w@cpB{fA_pCwj@wwAcL{Y{Ow`@_q@gdBsg@soAoi@_tAka@gfA{JgYcQon@_Ssq@oP{|@{Jwj@kMolA_D{m@_D{w@{@cy@g@{gCg@wy@g@shBg@obASoU?o_@{@_~F{@ovAS{fASs`AnA_v@bBcj@nAkWjC{c@rD_g@~Hos@bGwe@fEsXvL{r@n_@o`BvGwVjMkf@r]_oAja@syAzTkz@vQkp@vLsb@jf@smBvVk_ArSg|@rNwt@jHsb@jCsSbL{aAvGsv@vGcmAvB_yA?ogA{@_mGkCgmJR{zAg@wbDcBsnD{@srB{@chFSgbCwBsvEoAowHwBkhI{@geIrD_wBrNc{IjHo_EbB_tAcB_oAcG{zA{JkiAsNcmAcQ_`A_]_~Aw[gfAsoAkmD{T{r@w`@_jAwy@suCgc@srB_b@skCcQ{zA{OoeBoK{bCkCcwASon@g@sb@nAsmBjCgpAzE_`ArI{uArI_`Ab`@s_Drq@kkErb@gvCf^gbCnx@oqFfYgnBzh@okDvy@syFngAwnH~iAcxHjxA_qJja@spCzuAghJnPgfAbQk_AvQ{aAjWgfAfm@{gCf|@{jDfw@geDni@_dDnPsjArN_oAbV{{CzJwzBzEshBf@waBSsyAwBsmBcLwnCoPg}BwQooBox@stFoi@wqDkWkbB{Y_hBoUcaB{r@grE{m@kaE_b@{}B{TgpAwV{zAgTwwAoF{^kRsoAoK{r@oK_q@wLcy@gJgm@sXkgBoKgr@{Jgr@kRgpAcLgfAkHgkAcBco@cBg|@RkiA~ColAnFkdAbL_eArNkdAbVgzAjrDolUzY_iDrIotBfEoaDvG{iBfOcaBbQ{kAfT{fAr]wwAzTct@f^k_A~u@_rBbe@_oAjRwo@vVgaAzTolArNk_AvLgkAbGw~@rDgfAnAgfAS_q@{@{w@wBsq@sI_oAoi@chFkMo{A_N_wBsN{`DcGswBoA{zAoAotBz@saCrDoyBfEcaBzEchAfOglCbQ_|BrS{xBvVgsBv[oyBn_@oyBbe@g}Bve@srBni@srBbo@cuBjz@keCjp@cfBjdAwsCrwBs~FnPgc@byEcnMj\\s{@zOka@zT{m@ngPsqc@vt@giBrq@_yA~\\gr@nx@k}Abo@{fAfaA{zArtAgiBju@wcAn_@gm@j\\kk@n_@sv@n_@o}@r]wcAzT{w@faAceEbLgh@z^{_BfYsjAnPsg@zTkf@rg@ox@v[ka@ja@o_@nd@k\\jz@gc@bt@w`@vo@k\\zr@ce@rq@on@rb@kf@fc@{m@z^sq@b`@c~@jRco@n_@syAzh@_fCbV{aAf}BsoKbVshBzJsjArD_`A~Hs~AnKk`CjMc|AbL_`ArSkiAz^wrAnZk_Arg@{fA~f@cy@jRk\\by@_tAb[os@jWgw@fdBoaIfw@gtDrSwcArSobArIg^zJkf@jcDkkOf^shBb[{uAvj@{gCvLcj@~gB{oIj\\o`BrNgr@rg@{{Czr@o}EvLgw@vLgw@ziBgbMzTk}AvL{|@ffAkoHfr@cjEzJwe@nKwe@jWgfAfOkk@zYkdArIkWbe@{_BzJc[zJ_]zTct@~Mod@~M{c@b[ccAnZkdAfJ_]rD{OrDkMrDwQzEwVfEoUz@_DzJgm@~H{m@rDoUvBoZrDsb@bB_SbBc`@nA{YvBgpAf@{h@g@c`@cB{w@cBwo@sIwmAgE{c@oFgc@{Eg^sDoU{EoZoFw[_DsNkM{h@{Jg^kHkWkHoUgOwe@cL{YoUkk@oPg^kMsXcQc[{Tc`@gY{c@_]we@cQ{TgOcVox@_`AsI{J{Y{^kWk\\kWk\\kRcV{Yo_@sg@on@_]_b@_b@_g@ce@wj@od@kk@sXk\\sb@{h@o_@ce@_Xg^{m@ku@cVoZ_]ce@g^oi@gT_]gYce@gO_X{Tsb@gTgc@cLcVkMkWcVsg@oU{h@oUsg@cLcVkWgh@oP{^{Oc[oU{c@sNsX_Xkf@oKwQ_b@{r@_Xo_@wV{^_Xc`@{Ysb@ct@seAkWg^g^gh@wQ_XoFsIgOgT{Tc[{OoUgTc[cQkWw[{c@{c@co@s]gh@w`@_l@sb@{m@{^oi@{Ysb@k\\od@cVg^cV_]wQ_Xw`@sl@o_@oi@c`@cj@kk@kz@{^gh@cVg^{Ysb@cV_]sSoZ{Ysb@kW{^c[gc@c[kf@sXsb@k\\cj@sXkf@{Y{h@sSw`@oZgm@kWcj@sXon@wVkk@oPw`@_S{h@kR_g@gTsl@wV_v@{Ogh@_Nod@kRkp@_Nkf@oFwV{@gEcGoUgJc`@oKce@kHw[wGw[{EkW{EoUkH{^wGw`@{EoZcL{r@wG_g@oFc`@kHgh@kC_XsIwy@oF_l@_IobAwG{w@wB{YcBc[kCgh@cBgc@oAs]Sw`@wGggCf@gnGrI_sDb`@kgGvo@knFfOgpAjjC{tS~yC_}Srq@cyEf|@wfG~Hod@fEs]v`@omCf^sfCfTcwAbt@wcFzJgw@vL{fAzEkf@fEwj@bB_XfEsg@vBsg@jC{h@nFgkAjHcfBjHg_BvB_b@bBkWz@gTbBgTzEwt@bQgdBjHwt@nKo}@rXsaCvVw_CnUgsB~a@wvDv`@wqDfT{iBf^kcDfJwy@~Hw~@bBoZjCgc@rDw~@~C{fARgaA?on@oAc~@wGojBgE{m@_Dsg@_IovAwBcj@{@w[oFggCSoyBfEkkEzEs`FzJk{LnKgdLnPsrQbGkqGvB{`Dg@wmAwBseAwGseA_g@cmFsSkeCcGstAoAogAvBgbCnFkdAvGox@rIwy@rSksAf^scBv_CowHjWwy@vt@wdCbuBc_HrwGkkTviCcvIrfCkwIvlg@gkeBjvL_za@~dAcqDfYg_BnP{_B~CkgBwBgdBgOckBk\\cfBon@c_C_Xs`AsIsXgOsg@guAobFoUshBwB_ScBkRoAcV{@kMcBsv@g@co@R_g@vB_q@bGkz@zEgc@jMgw@v[cwAznBomHvLwe@nPsl@~zE_wQ~lBkjHjz^_{uAboE{uPn}@_iDbwAknFrD_Nve@smBzc@_cBf|@cbDzE{T~k@{xBfaAopDn}@{jDfkAkpE~Mgh@fJ{^vL_g@bLsg@fOsq@zJkf@zJod@n_@ooBvLgr@zE{Y~Hce@vLgw@vGod@rIgm@zOgkAfEs]nFka@vBkRjCcVfEw`@nFkf@fE_g@rDka@~WkyCbhAoeV~xAkt\\zkAweYbLszCvB{aA?obAwB{fA{Ek_Ac~@_wLgE{m@{Esv@sDon@wB{h@SgTg@w`@?gh@?kWz@_l@bBce@bBwe@vBo_@fTwiC~Ck\\rDkf@vVk~CvLguAnFkk@rXsiDfT_fCvmAodOnn@{nLrxD_iv@fc@ozIvGcmAnFccAzJo`BvQkeC~R_aCfOwfBvGco@rN{pA~Wo~Bnx@ckGvj@wjE~Rw|AviCgeSrg@gyDbQcrAni@ceE~Hsl@rNwhAjWwpBfr@olFnPoqAfEg^bGgm@fJgaAbGs{@fEwo@nFk_A~Csl@zEwrAvBco@bGg_BbQg|EzO{mEjC_v@bLclDbj@gpKvwAw_R~xAczQvG_v@z^o}EbBgTvo@_nIbGco@~Mc|AjMwrAbLchA~Cc`@jdAsdIrhBoqKf_BkyHzoDgcObsCwpLzaAodEz|@kfEvyJcqg@jp@khD~f@_fCzm@{`DzYgzAbVcmAby@weEzr@opD~\\wfBz^giBbV{pAn_@ooBzr@snDj}Ak~HvBwLrS_eAv[kbBr]ojB~Mwo@vLon@rSgfA~}AkcIbLsl@bcA{fFja@{sBzO_v@n}@{wEjiAc|Fvy@cjE~f@_fC~WksA~qBwhK~uEs~UbgD_yPfpF_xXv[o`Bns@wqDfYkxA~W_yA~a@keCja@{gCr]ohCb[w_CzfAgtIfT{xBrIkiArIchArIwzBfEkbB~CkbBg@g{C_DwzBcGoeBcGg_BsXkaEoZgmEgJ{uAoAgYkCct@S{J{@od@ScQ{@_b@g@wy@SgkA?od@{@kjCg@snDSc`@f@{aA?kWbBsg@zEct@nF_q@rI_g@rDsSjCsNvBkMrDgOzEcQ~HoZnKc[nP{c@fO_]zJgTnAcB~Rs]fJgOvGcLbGsInK{OnP_SvQgTjMkMvLcLfOwLbQgOjWkRnd@_XbQsIfT{JjRgJbe@oPbhAod@jWgJr]gOja@{Ojf@kRrtAcj@~p@kWzdBsq@~k@{TjRsIjRgJzOwGbQoKbVwLvV{Oj\\cV~\\oZRSjMoKzOsNfYoZzOcQzO_SrSgYjR{YnPgYzJkRbQk\\bLwVrNs]vLoZzEoP~H{TvGoUnFsSnFgTzEgTjH{^jWkxA~H_b@rI{h@zJwj@nU{pAjf@_pCjf@cnC~M{w@rg@_uCfc@keCju@_bEvt@ghEzc@keCjMku@bt@o_Erv@slEfdBsvJ~\\gvCfEon@~HooBjCovA?oqAkCguAwLw~EcBogAz@{fAvBku@bGgkAjMsoAjRoqAz^_cBfuAcaGzY{kAbo@kjCjgQ{nt@rkHwhZr|GoiYrdD_dNn_@k}Az^o{AvVchAbV{aAzT{|@rNsl@nKod@rNgm@rS{|@rXsjAjM{h@bV{aAjW{fAfY_tAbQwy@vQs`AvL{r@~R_jArDwVr]g}BfTcfB~Hwt@jf@s`FjH_{@zE_q@jCkf@?S~Ccj@fE_v@zEk_A~Csq@nAod@fEchAf@_]vB_eA~CkbBnF{eDrI_yFzE{gCvBwwAbBoqA~CcpBjCcfBzE{lCjCstAjCcfBbBwmAbB_`AjC_~AzEk~CbGcgDzEoaDjC{zAfEsfCnAkp@~Cc_CnF_dDjMwsHzJo`GzEcxCvQ_hLbBgfAjCw|AnA{w@nAgw@nAgr@bG{{CzE{zAbGcrAfEcy@~Cco@zEsv@bBcVzOgxB~Hs{@nFkp@rD_b@nFon@nKgkA~Rk`Cn_@kkEvVwxCjRwuBzT_kCnFgm@fc@seFz^sgEvBwVns@{jIbLgpAju@_sIf^odErNkgBzYcgDrN{_BbcA_mLfr@oaI~R{}BzuAgaPf^c`EfJgkAjHgw@rIccAzw@ceJnFgm@~Mo{AjHox@rq@s_IfEsg@rDw`@rDsb@bBgYbBsXvBoi@nAgYz@{w@R_g@?w}H?_yASsoARcfBoA_q@cBkp@gEs{@_Ds]{Oo{AsNwrAkHcy@wBsg@{@sq@f@_b@~Ccy@rI_`AzO{fArNon@f|@gvCntBczG~sAceEnvF{xQjRsl@r~AogFfpAodE~f@k}Abt@c_Cnx@ohC~W{r@fYsl@zc@ct@z^_g@nU_Xr~AgzAflCkqBfkA_`AffAs{@n_@g^b`@{c@f^kf@ve@ku@zfAcfB~{BkrD~jCoiE~pEskH~nAwpBvj@o}@v~@{zAf|@k}A~dAsmB~_AkqBzc@obAfc@kdAns@wkBnUco@jWwy@bQ{m@bQgm@v`@o`BjRc~@fOsv@bLsq@vLwt@nKcy@~Hwo@fJk_AjHwy@fOw_CnUw{DbhAohR~HwmAjRw}CbLg}Bni@sbJni@weJ~Mc_C~f@krI~Csq@nAce@f@_v@{@sv@_Dk_A_Dwe@sDka@oKc~@oUcrAsIg^wLod@sq@s|B_tAsqEwVs{@gOoi@sNwj@cVchAsN{|@gJkk@_Isl@sI_{@sIccAoFk_AoF_jAoAw[kRkkEgYstF_Sg}BgO{pAwLs{@kHwe@wj@_zCwVogAg^_tAk\\{fAsg@o{AsSkk@s`Ak{Bo_@sv@gr@oqAw[oi@obA_~AchAc|Ac~@_eA{r@ku@kiAogAk`CckBscBchAstA_v@crAon@gnBku@_{@sXo`Bsb@oqAoZwt@sSct@oUco@kW{kAkk@sv@sb@{|@sl@os@wj@obAw~@{w@_{@{m@wt@_tA_cBgm@os@wcFwfGsmBo~BovAgdB{}B{qCc`Eo}E{wEcwFcj@sq@skCsdD{aA_tA_jAgdBwy@ovAkdA_mBc|AwbDsl@cwA_yAkaEkHwVkp@oyB_{@gjD{TogAoKgh@kRw~@kR{kAk\\czBoU{nBwmAoyLgh@wcF{c@grE{Y_uCwt@ktHgJkz@{bCcaVwmAohMguAkcNovFwuj@kWciCcQwuBwGgaA{@cQsIwaB_I{xB{EgqCoAgnBf@s_DjH{~Df@_b@nKkbGfE_wBvBwiCRggC{@ciC{E{qCsD{zAs{@s_Sod@kdKwGcwAgc@g~IkHknAoZcjEgTkjC_b@{hEsl@gzF{aActJstA{{Ms]siD{@_Iod@_vEsS{sBw[w}Cgc@oiEwG_l@g@wG_b@w`E_g@{mEce@cvDgr@sqEkgB{cJsg@k{B_tAogF{w@spC_`A{vCwdC_|Gw~@czBgfAsaCco@crAohC{fFgsGsfMkiAk{Bos@{zAknA{lC{pAkjCc}Wcpj@g|Twfe@cgNctYc_Cc~E{c@s`Awo@wrAkz@{iBos@kbB{m@w|AwVsq@cV{r@_v@{xBon@ooBcy@gvC{w@kcDc~@wjEccAkdFseAcmF{aA{aFgr@kmD_jAgzFgaAgaF{h@wnC{^_hBsXksAsjAcaGsb@cuB{h@koCkf@{bCce@gbCgfAknFwcAgkF{c@kvBwe@ocC_{@{hE{Jgh@oP_{@_I{^{|@{rEgoIssb@{bC{bMw~@ogF{m@kkEoUklBgToyBswBkwXox@wmKoFcj@gE{r@_Dod@{Esg@sS{lC_NscBw[wtEsDwe@co@{jIsIolAcQ_wBkW{{Cwo@wgI{Yg`DsSsmBsv@guFwcAwwFccAkpEogA_qEcaBwzG{_B_wGs{@opDoK_b@oyG_nX_cB_aHkdAoiE_tA_tFkk@w_C_cBgbHciCchKgr@oyB{Tku@_Xkz@w~@glCcj@c|A_b@ogA{Oo_@oZ_v@k{BkiFcVsg@wj@chAccA{nBsyAomColAcuBw~@caB_oAczBgw@{uAomCcyEg{CknF_tFcyJcwA_fC{pAs|BsIgOovAkeCccAkgBg|@k}AgfA_mBsoAwzB{fAgnBgfAwkBwnC{|Eo}@_~A_b@wt@ox@cwAsl@seA{fAgnBwo@_jA_eAojBcmAgxBs~AgqCccA_hBgkA{sBknAoyBkiAwpBghEsuHobAojBw~@ojB_{@giB{^kz@_]ox@g|@k{B{r@ooBos@gxBco@kvB{m@s|Bkp@glCod@_wBc`@wkB{O{w@kMgr@kRobAsNcy@w[klBsI_l@sIkf@w[swBoZwzBsv@cfGsN_jAsv@{dGsnNgshAo}@{gHos@_yFc|Ak{LkdAwgI{h@ghEseAw}HsSsjA_`AogFc~@{~Dct@owCwQco@sjAkwDox@_aCka@ogAkp@scBgm@kxAsv@ojBos@w|As{@scB{h@obAwG_NgsBkmDgbCgtDwzBszCc`@{h@kWg^kjHg|J_hGkrIgfAcwAoZw`@wiHs{J{JsNkmIojLkMcQoeB{bC_cBwzBcjJ{_L{^c`@_`A{kAwe@{m@wy@obAs}DwyEwdCo|CcnRccUwt@{|@wo@k_A{aAk{B{h@k}A_]wwA{^{bColAczGkk@sdD_{@{wE_DgOg^g}BsSsmB{E_{@oFsv@_Ds`AkCwpB?ke\\?gh@RktCf@ox@f@ka@z@ox@nAgaAnAct@nAox@vBon@bB{r@bGkgBnZ_wGrX_oFvLcdCnPsxDb`@{lHrSkzEjCgr@jCgw@Rsq@cBkp@sDwy@wGct@kHkk@cL{m@_N_l@oPwj@kRon@{tD_hLkHgTczBsfH{Tgr@caBgfFgdBknFkM_b@wmAozD_wBkvG{{CweJ_~AwyEswBcuGoFwQotBckG{tD_cLgE{OcwAkfE{cEsfMsyAkkEkHsSsjA_nDo~BooGcfB{~D{w@wfBo}@giBwy@s~AcmAswBkHkM_l@{aA{w@{pA{zA{}B{hEk}FscBgsBcL_NswBs|BgrEgaF_cBkgB{m@_q@orCg{CkMcLc}Co|CwrAolAct@_l@wuBgzAcpB_oAoeGopD_hB{fA_oAos@sl@w`@{m@wj@{YgYsX{YkWoZoPsS{c@{m@_Sc[sSk\\sl@g|@cj@gr@sN{O{m@co@_`Agw@seAwt@sg@s]_q@g^_q@_Xkp@sSoi@cQgaAc[oUsIsSoKcVsNcQwLgYgTg^s]_X{Y{OgTwQgYwL{TsSod@kMs]kk@gzAcaB{mE_]c~@gJsXwgD{hJsyAc`EsXox@skCsfH{^wcAc`@{|@sg@_`A{Ygc@g^sg@sb@{h@sg@kk@{h@ce@gm@we@_b@c[ce@sXcwAct@sfCwmA_sDshBcfB{|@oqAkp@chAgh@gwE{}B_cBkz@oP_Ic|A_v@kyC{zAwpB_eAs~AwcAgh@g^_g@c`@gm@_g@gw@on@co@gh@sNwL{r@kk@sb@g^_wBwfBkbBksAwy@ct@kWkWs]ka@wVoZod@gm@_]wj@wnC{rEs~FoxJkpEktH_oAcuBoaDoqFcmAooBod@{w@o_@on@wV_b@sX{c@_b@sl@gc@cj@sb@ce@kp@gm@o_@oZgkAcy@{zAchA{c@c[{c@sXw[_X{pAw~@ocCoeB_g@s]sq@we@o}@kp@o{AchAgh@ka@_q@kk@_b@w`@shBshBkdA{fAwfBklBco@sq@{qC{vCox@o}@{w@_`Awo@_{@kk@wy@co@obAs`AwfBgm@soAos@{zAco@_tAod@k_Aw~@cpBsIcQwiCoqFovAwxCkdF{pKcQo_@sg@seAka@o}@{Tsg@wy@caBsq@o`Bsl@gzAka@{kAcVox@c`@{uA{YsoAgYwrAoZg_Bc`@keCwQwhAgTstAoFc[gOk_A_{@wmFk_A_cGwVk}AgaAgiG{pAsdIoqAokI{OobAoP{aAgT{uAwGgc@kHgh@_NgkA{JgpA_Dcj@wBka@{E_~AgE{dB_DwmAgEolA{E{|@oFs{@{J_jAwQ{iBsDw[{JccAwVwdCgTswB{OoeB_NknAsIwo@wLco@wQos@{O{c@gYgm@oZ_g@gYka@{T_Xcj@cj@ce@sb@kk@gh@oi@gh@sIsIo_@s]kWoU_nDkcDc[gY_XoU_NkM{J{JkHkHkH_IoK_NsIwL_I_N{JkRoKgTkH{O{JwVkHsSgJgYwG_X_I{^oFw[gEoZwBkWoAkMg@oKoA{Tg@gY{@ce@_Dc_C_IwmFSw[wGsgEwBcj@_Dwj@_Dc`@{E_g@oF_g@gEk\\cLwt@cL_l@oKod@oKgc@cLgc@gOod@sN{c@o_@w~@ce@wmAc`@kdAgO_]oKkWcLsX_IcV{J{^cQox@od@_|BojBwjJ{pAgsGo}@ctEoF{Y{}BcfLwmAshGgc@g}BsXgzA{^{dB{Ok_AgO_oA_D_X{Eos@cGwhA{@{c@{@{h@?whASwaB?_q@RwVS{m@?ka@{@oZoAsXwBc[sDs]{E{^oF{Y_Ika@w[syAoZ{uA{E{T{TsjAsDgToFc`@{Ewe@sDon@sD{fAoAcVwBgYkCsXsDoZ{Ec[cG{Yc~@_bEsD_SwGg^wGsb@_Dk\\_D{^kCsb@oA_XcB_`A?ksK?{{C?sq@Rod@z@oi@nAgc@jCco@jCk\\vG_{@~HccAnPotBnFkz@vBkf@bB_q@z@kk@Sw`@g@kp@{@_g@{J_kCsb@wnMkk@gwOcj@_}NoAwe@{@oZSka@z@_g@vB_g@fEgh@nFka@bGc`@vGc[fJg^bLg^nKgY~MoZjRw`@rg@g|@jsA{gCjH_Nrg@_`AvLwVzJoUjH{TvGcVnFoZvGg^~C{^bB{YRoAf@gc@S_]cBw[wBs]gE{YwGsb@gTgkAs{@kpEkiAkqG{E_]cGkf@gEod@{Eoi@sDku@sDk_A{@cy@R_v@f@_l@~Hc{Dbe@otQfc@keRrg@kmSve@cqSz@_b@zE_mBvBkk@vBgc@fEgh@zEwj@nF{c@bGod@jHce@~Mco@vQs`Azc@swBzJwe@~CcQjHk\\rX{uAvnCwxMnFcVr]gdBvlD{_QvBwLveEwlSztDkvQ~xAkjHfYwrAbVseAbVs`AfkAkfEjvBkyHfh@klBreFk{QnfDswLnPwo@b~@_dDvrF{eSbgD{xL~W_eAfTgw@rNco@rSobA~RgfAvL{r@vGgh@v[s|Bv[wdCfYojBvj@kaEvzB{|ObsC{tSb}CsvTbiC{bRv~@oyG~f@{oDf|@wpG~Hgh@~M{w@nKkk@rNsl@vLwe@nPgh@~M{^bLc[zTwe@~Rod@~Rka@jWsb@vVo_@zTs]fnG_bJrqEgsGv[sg@rb@sv@~R_b@vQsb@fT{h@bVwo@nZ_{@vlDwtJjvG_wQjf@syAzYc~@jbBstFr~AwmF~bGofSzdBo`Gr`As_DjdAk~CnZs{@j_FsbOvpGspRfiG_aRjyCc`Jfm@kxArb@{aAzT{m@~a@olAbsCopIvrA_}DfuAweErq@srBrmGglRbuGszR~{GgjSfc@stAve@{dBv`@kbB~\\oeBrSknAnP_jAjMkiA~Rw|AvuBgiQflCwjTrkCkkTju@_hGzfAc{I~C_Xzr@c|FroAsjK~dAkwIfEgYz}BcdRju@{dG~M{fAzJs{@~Hgr@rDwe@nFos@vBoi@nAgh@nAgw@rXc{SzYkrSz@gm@bBoi@~C{|@fEkz@~HchAnKcfBbBgYj\\{hEb|AkyRz@cLzbCk{[bG_q@nFkf@bG_b@fJ{m@jM_q@rN_l@nwC{}LnAgEjz@siD~a@wfBfTobAzOgw@zOs{@~Hsl@fTs~A~Co_@~WgxBnlAo{KbmF{{f@rDkW~gBgfPzJgfAjM{fAjHsl@bGod@fJcj@vLwj@nPgr@nUkz@bVcy@nqAcjEjlBgnG~sAgrEjgBcaGnlAo_EvkGkwSf`Nobd@~Rkk@bLk\\zT{h@vVgh@rS_b@nU_b@fYgc@zY_b@jf@sl@zc@_g@~\\w[vo@gh@ju@{h@~u@_b@~p@c[fkPcxHr|GoaDbpGowCrfH{eDntB{aAzTsIzT_InU_Ib[sIvVoF~W{Eb`@wGni@cGzhTgnBffA{JbbIwcAj`Hw~@vdH_`AvpGwy@bmFgr@rXoFbVoFfYcGfYwGnUkH~\\cLn_@_N~a@oPfm@sXfxGsuCbwFgbCjf@cVrN{JzfA{m@be@w[~_A_q@nZcVz^{Yni@od@ja@w`@ns@os@v|AwaB~{GsuH~`HowHnqFc~E~\\w[v|{AshwAncHotGbdHswGrI_IzYcVf^{TrX{OfToKjWoKvVsIb[gJfh@_Iv`@{ErrB_NvfBgJnsJgh@~\\sDnZwBr]{ErXcGv[kHrg@kMja@_Nbj@wVv[wQb[_SfTgOrX_SzYcV~\\s]~\\o_@nU_X~RsXnUka@zT{^zY_l@rSkf@nUgm@~aEwcKjpE{_Lzc@whAv~@k`C~Rsg@b[_v@rb@ogAz|@wuBbj@gkAfsBceEfaAgnBr}D{wJbaBweEns@o`Bbj@_eAby@cmAnbAolA~`CcnCnyBsfCflCc}CzzA{dBns@ox@ju@{|@ns@_eAv`EgbHbjEkoHfuFwyJva~@c{~Abj@seAz|@wrAz_Bo~Bn{AsrBbhAo{Afh@gr@f}B{`Dr|Bc}C~a@kk@rXka@~W_g@fTce@rSsb@nPo_@zO_b@zOod@vL_b@vGgTvV{fAn|Cs}NrsDsmQjWknAbLwj@nF{^vG{c@nF{c@nFwe@fEcj@jC{h@rDg|@jCgfAfc@gbM~C_v@rDkk@nFwj@vGoi@zlCk~Rzr@s{EbQguAfJco@vG_l@rDw`@zEwj@bBsl@z@{m@?cj@{@on@wBsq@kCsg@oFsv@_Igr@gJ{m@kMgm@wLce@_Nod@kM_b@kRsg@gYsq@kpEkkJ{h@_jAsS_g@cVon@gTsl@_Sos@sNsl@cLoi@{J_l@oKsq@{OoqAoP{uAgaA_sIseAsbJoPksA{fA{hJka@cvDkMolA{Jwy@cLkiAcLcwAcGogAgEc~@gEgpA{@{`DbBggCfE_xIbQkjRrNspRzOktR~HkiKf@_b@f@c[vBkzEbGspHzEstFrN_aRrIciMnA_yAnAcaBjCgvCnA{}BbBshBbBkjCRo_@jCofDbBkbBjCcgDnKwxMRgw@nAgm@jCsl@nFcy@zJ_{@nKwo@vLkk@bLce@zOgh@nKoZnUsl@fOg^rb@gw@fTg^zOgTnP{Tf^{^rX_X~a@{^rSwQfTgOv[wQnZoPrX_Nr]kM~f@cQb`@oKnlAw`@~xAkf@jnAka@zm@_Sz^_Nrb@kRbj@k\\fm@w`@ju@wj@r{@ox@jp@wt@vj@sv@fr@kiAfr@guAjf@kiAf`DkoHj~CsaH~W{m@nx@klBj}AsnDvrAwxC~H_SvpBonEju@_rBve@ksAnZ{aAfY_`A~WgfA~WcrArXkxA~xA{`Ir`AkdF~dAguFbt@g~DzxB_rLnjBg|J~\\ckBrS{pAjMobArI{r@fJkz@rIgaAvGkdAfEk_AbGguAjC_~AbBolA~HouNbLgiQnK_pRvLo_TfEs`FRgTbBcqDf@ovARkk@oAsl@kC_q@kCcj@gEcj@cGkp@kHkk@_Igh@kMwo@cLsl@cLod@wLce@_Swo@gTwj@kxA{tDs_DkmIsnD{~Io`BsgE_q@scBoZgw@_Nod@cLo_@gJce@_Ion@sDsl@sDkk@Skf@f@gm@nAwe@bGos@vVcpBnUklB~_A__IjsAo{KfYg}BjMsv@nP{r@fYos@nUkf@nZgc@n_@ka@b`@w[brA_{@zc@gYraC_yAnwC{iBncCw|A~tCgiBv|A_`Arv@we@bt@kf@v`@{Ybe@c`@v`@w`@v`@{c@bo@kz@vwAojBzpA_cBr`AknA~gBw_CriDslE~vG_sI~fEolFjdAstAve@sq@zYce@jWgc@~Wcj@jWsq@nZsv@rS{m@vQgr@~Mkk@jMgm@fJcj@~Hwj@vGsg@fEsg@zE{m@~Cct@vBgm@f@{c@Rco@RwcAbB_fHRwj@vGoxTvGgySjCodJf@ku@jC{nGnF{pP~CwrKz@_jAnA_{@~C_v@rDct@fEs{@~HkiA~HccAzaA_mLzdB_nSr~AktRj}A{gRvaB__Sz|@wmKzO_rBn_@w`Ebo@wbI~dA_fMfdBokSbmAwqNjMwaBrIo}@jCco@rDkk@bBct@RsjA_IsfC_SgbCs]{xBcaGofXciH_a\\kmD_`PgqCsfMce@{sB_jAsoFobAosEgaAgmEo}@odE_`AcjEgaAcoEs{@{cEw~@{cEkp@_pCkk@wsCc[o{Asq@wxCsg@k{BcmAwwF{h@w_Csg@_aCs]{zA_`AgmEwxCg`Nsl@spCw`@shBs~AcnHw[stA{h@k`Cod@_wBcfBofI_XgkAgJgc@wVkiA{w@{tDoZs~AkMw~@klBs_Nsb@__D_g@okDgh@_sDgm@oiEcj@kfEct@gfF{m@onEcj@k|D{^ggCct@cmFwGo_@sb@g{CknA_}I_l@ceE_v@_tFkM{|@gw@_oFwhFc~^owRguvAgbCkqQs`AohHSwBwyOgblB_b@kiFkRcdC_SczB{Ewe@cGwe@_I{h@gJwj@cLoi@{EgT_Sct@kC_Ic[ccAka@{fAoFsNgxBwmF_cBkfEcrAsdDw[gw@suH{gRw[ox@gdBsgE{_B{~DcGsNoeBwjE_hBcoEcfBcoEgyDonJwQ_g@sjAsuCwcAwdCoUco@{Tcj@_yAopDcQsb@_DkHox@srBspCgbHsX_q@s{@cuBsv@wpBwpBk_FgbC{dG_{@wuBkp@caBsrBseFwQ{c@sXos@cmA_zCk\\cy@{JsXwLo_@_Nkk@sIwe@oFsb@oFgh@kCce@cBco@g@sg@SsXf@g^nKg{CrDseAzJ_|BzT_hGzYk|Iz@w[nKo|CnPgmEjCon@f@gJ~HwaBvBkgBf@cj@SgT?cLsDobAkCcj@oFoi@{h@oxEwB_SsDc[cGsg@oAgOwBw[{@gOwB_]{@_l@z@ce@jCocCf@cj@Rgc@Sc`@g@{OSkR{@wQg@wLoFwt@g@cGgEka@_Isv@oP{nBSkHcBo_@SsSvB_g@bLknAvG_g@fEgYbBcLvGcj@rIwo@~H_l@z@_IzE{m@rDsb@nZwcFrDs`Az@k\\bGo_Ef@c[bBskC?{uAoA_oAg@o_@sIwnCwG_jA_D_b@_Xw}CwG{h@wGsg@ce@kyC_ScmAcLobAcGku@cBsjARsoAjH{aAjMc~@z@{JfJwo@rNseAvVscBnPchAjCcQju@ksFrSsyArIon@bGwj@zEsb@zJkxAnAs]z@sb@jCokDnF{bCjC_mB~CgsGRgh@z@_b@z@k\\bBoZbB{TrDc[jCwQzEsX~Hg^vLce@j\\seAve@{_Br_DsjKfJgYvy@_zCzh@_hBjC_IbBwG~qBsrGbLo_@ja@ksAbe@caBbkB_cGjz@_zCbwAwtE~}A{zFjMce@vy@orCvrA_vEbcAsnD~p@{gCf|@__DbaBc|Fb`@stAz|@_dDbQwo@nZ_eArq@sfCbcFgsQf{CgzKbpBomHbt@kjCvQkp@vt@kjCvQsq@bxCwhKbLk\\zTgm@rXgr@rIkR~Rod@vQw`@vQsb@jMw`@jH_XbG_X~Hsb@bGka@~Co_@rD_l@nAoi@S_l@{@_g@gE{kAwBco@?gEkHscBgEkgBg@k\\?{YR_]f@wVRgTnAgTf@wLf@wLf@{JRcG?g@vBkWf@{EbBwQvGkk@fEgYzJ{m@rDsNbQ{r@fO{m@vGcVrI_]vG_]~Hod@vBcQvB{OrD{^f@kRz@cQz@oP?sNRkMg@os@SsN{@wj@sDw|Ag@ka@kCo}@cB_b@?{@{@s]SsNoAco@oAkdAsDk}A?{EsDsyAoAw~@oAos@oAsb@g@sNoAwVkCc[_DgYoAkHsDsScGsb@_DoP{@_D_XcmAkMkk@gJc`@sIwe@_I{c@gJwj@{Jwo@cBoK_D_ScBsNsD{YoAsI{@cGwBkR{JwcA_IgaA{Ekz@{Ewy@sIoyBoAsb@kCc~@_Dw~@oAkRwB_X{@{J{@sIg@{EwBgOoAsIoA_IsDcVsD_S{EsSoAsD_D{JwG{TkHkR{JwV{JsSsNkWgOgTkM{OcQkRkMgO_IoKoKsNgTcVktC_nDsg@on@c[s]gfAksAwe@wj@cmA{zAsv@_`A{w@{aAs`A{kAo_@gc@kR{TcVgYwQgTwL{O_NgTkMoU_IcQwGcQcGcQgEgO{EwQsDcQsD_XgEw[kCs]{@oZScQ?{TRwLRsNbBs]rDc`@rDcj@jC{c@nAc[z@s]f@w[Ros@g@o{ASsb@?oFcB_dDSwwAg@ox@{@od@kC_g@gEwe@wGkk@cGg^cB{JkMcj@kHcV_N_b@wGwQgJoUcLkWcGcL_NcVkRc[wG{JsDcGcGgJcQsX_NgTsIkMkW_b@oKoPgTk\\ka@co@wVc`@gEkH{Ts]oP_Xs]gh@{OcV_DgEoKwLsIwGoPsNcG{Eod@{^g@g@cGgEwQ_NcL{J{JkHsIsI_I_IsS_XwL_S_IsN_So_@wG_NgJ_S{JkR{JoP{OgTsIsIoK{JgJ{JwLoKcQwL{O{J_SsI_SkHoZgJsXsIwj@cQ_b@sNcQwGkMkHkMkHwG{EsSoP{JsIsIsIsN{OkRkWoPw[{EoK_Ng^sDwL_DoKkHs]_D{TS_DgEg^cB{OwG_v@cBsSSkCgE{h@g@{Eo_@ceEgE{c@oFsq@_Ng_B{J{fAwB_XsIwy@kCw[g@oFsDka@_Do_@kHwt@wG{h@{EkWkCcQkH_]oFkW{EkRkCgOkMgc@sSgm@_Scj@_Nk\\_]{|@wQ{h@kWgr@wLsX_Nk\\sXco@s]ku@oZ{m@{Ygh@{c@_v@gTs]_Xsb@sl@wy@s]kf@{c@kk@w`@kk@k\\kf@c~@kxAsb@sv@w[{h@wV_b@_Ss]_NoU{J_SkMwVcGgOsIoUoF{OsD{OsDoPgEgT_DkW_DsXS{E?S{@c[S{O?gTRkWrD{aAz@o_@vBwj@~Cg|@vB{m@vBkf@bBcVvBc[jCoPjC{OfEwQnFsSbGkRjHkR~HcQrIcQrSk\\~R_]jH{O~Mw[fEsNjHkWrI_]nn@koCfTk_AbB_I~CcLvBcLrDkMfEgTvGwV~M{m@rDcLnAoFjH{YvB_NvGgYzEoPrNw`@bL{YnFkMfTka@zJgObLcQfO_SfOcQvVc[bLwL~RoUvLwQnKkM~Wk\\vGkHzYc`@bQkWzTc`@~Wco@zEgJ~C_NrI_XjCcLfE{ObGgYfEwVrDcVnF_XbB_NfYkbBjMkz@jCgOnKct@jHgc@vG_b@zEw`@jCwQrDka@z@wQnA_Xf@kRz@gOvBct@z@_]bBw[nAkRbBcQvBwVzEg^zE{^zO{w@nFoUzO{m@vBkHrI_Xj\\gaAbo@_cBf^o}@~W_q@bBsDz^g|@jMw[fJgTvLsX~Rwe@fJoUj\\c~@nU_q@fr@k`CvLkf@bV{w@n_@oqAb`@knAbe@w|Aju@_fCni@wfB~u@wdCzTsv@jWo}@bLc`@vL_b@rSon@jnAceErI{YrNce@fOcj@jR_l@rS_q@fr@k`Cve@s~AjWox@~\\gkAzpA{yDr`FsjPryAogFr_IwxWbwFkaTbjE_jPneBk{GrNsg@fh@kqBz@kC~\\gpAzm@oyBjuEgiQbaB_cGrhBwkGvgDkbLnzDskM~pJkl[fgH{uUfqCopIraHsiSvhKguZvrFw~OrtAgcEbo@wzBfwEcdR~iAsvE~k@o~BfuAcwFbrAwmFfm@gbC~a@kqBf^czBb[saCzTcnCzJgdBjCct@z^oxObGsuC~a@o~QbGsmBnUwiCnjBwiMzJovAvLwxCwB{cO?whAg@oc\\cB{rOS{|JS{d[cBsyZoAscGoF{gCoP__DsSgbCgYsuCkWsfCgJs~AoKcsCwBwpBvGodJjHcrKnA{zA~MohRbV_gYnU{mYnKkhNvBosE{@{jD?{mE?ceO?{{CrD{cYf@wnCvBctOf@{nBjCstKnFo}YnFkzYvG_{YnFwyYbG{wYnF{eXjC_|LkHo{AkWwaBckBg|EsfC_yFsg@cmAc`@oqAoZs~AkMkz@{J_hBz@omCjMknFbQsnIjRcqIvo@{cYvBkiAnA_oAzEk`CnF{}BzJgrEfJgyDzE_aCnFc_Cz^s}Nzm@o|Wfh@_tU~M_yFfYshLrq@_tZzr@sqYbo@obZns@_oZ~MgkFvB_v@f@gr@oA_q@sDs`AkCsl@sIox@_Ikk@wLkp@_XsjAw`@sjAo_@s{@ka@_eA{Y_{@sX{aAoK{w@gJoeB_XwuLg@knASo`BjCooBzJwmF~WgmO~k@s`ZvQogKbGsrBbLwkBv[ssDnhC{fZ~f@kbGngA_kMnK_mBbB_]nAc`@jCo}@~CklBrDooBnK{sGbLsrGfJknFjCstAbBgfAvBwhArDc_CfEs|BjRguK~HcjEjHsgEjH{~DjH_bEnPw~JrDwkBrS_rLrSgnLv[wpQvG_sDjCo{AjC_~A~Hs}DfOo_Jni@ccZni@kxZfc@{xVbj@_{Yjf@sbYbQctJnPkzJjHwbDbG_kCnlA{bp@fuA_iv@rX_~PnPsgJrD_tAv`@seUbwAocu@v[ssSzr@{u_@nvAwdu@bwA_|t@vLouInAogArD{iB~WcgNnAsg@v[_ePzTohMvQkvGvwAswt@~dAokl@fTkqLjMwuGbBs`AjW__NnKogFzJseFnqAkvo@nvAk}s@zzAwgv@nqAsiq@vBkoCrSsoKvVcoJbLwmd@zOcsu@~H_y_@jCc_MnA_b@jH_yAbQcfB~_AgsGj\\szC~HsyA~CciMjCovArjA{jXju@g~NrNgnBv`@{{Cfw@sbErv@_uCr~KcfVroFgzKnKsSnaDwuG~p@wwAzc@olAjHoU~Wk_AzTs`A~RgkAzEs]zEw`@fEwe@rDsb@fEwo@jHgsBsDg`Doi@ovF{iBk|N_D{Ygc@c}C{E{c@{@sXRwe@jCkk@nFoi@bLsq@fOsg@vVco@~Rwe@joComHbVgr@~a@knAbLkf@rIwj@nFwe@vB_]nAcQbBkf@nAce@{@od@{@ka@wBg^{JwcAclDco^ce@chF_g@opD_I_g@gOg|@k\\caBsScy@_XseA_l@shBs}DguK_}DolKsaHgbR_fHk`RkxA{yDobFkyMkjC{bHwkGgpPgiG{kPotLcp[wqI_eU_yAc{DchFc}MwdH_fRkHkRwzB{dGkW_v@sg@kgB_XksA{xBclNchAgxGsv@s`FcL{fAwGgfAsDchAg@g|@f@_mBbLw|ZvGodTg@ku@oA{c@kCgc@{E{h@gY_|BccA_nI{bC__S_g@{gCs]kiAc[wmA_b@guA_g@c|AceEwuL_bE_rLk_Fk|Ngw@_wBwrAc`EcGoPozD{xLkyCg~I{m@kbBoZsv@wmAsuC{tDkrIk|DgcJwiC_cG{c@{fAcQsl@kMcj@cLos@oFon@{JgdBcy@ctOgsB{c^whAgqR{TwdCgYooB{nBc|KghEsoUo}EsxX{^g}BcVsrB_SswBwVw~Ekp@cgNw~@giQ{^_wGsIscB{TkfE_]{xGoU_qEcBka@on@oyL{aAowRgr@o|Mgh@crKkHcuBwGsuCwBc}CvBcfBnFgbCbe@s_InAcVnkDgzi@rIk`CnAcrAbBssDgO_{EcLgiBsNcfBwQo{Aw|Fos^snDoxTcsCgxQcbDopSk`CgwOsxDwrUwcAotGk}Ao}J{w@wcFksAcvIox@ogF_mBs|LkH_g@gEcVon@weEsIsl@_SshB{E{kAcQgbHkMw|AgYoeBce@kgBoZox@gwEsaMgc@wwAgYwhAoZ{dBwbDgbRwwFgg\\ohH{va@owHcoc@glHwgb@sDsS_S_jA{zAssIchAw|F_]gnBwVocCsSskC_NwcFoAsdD~Co{ArIkeC~R{{CjbBobUnoBsmVr~A_lT~p@cgI~MgiBv~@kvLfJ{uAv~@oyLj_AwfLfEs{@f@gr@kCseAsSkvBcL_q@{EcVcGgYcG_XsIgYoFkRwGkRsIoU_Nw[cVoi@cQo_@{qCwkGsv@cpBkfJ{jSg_Qcr_@kvB{wEc[{r@sI_S_I_SgJ{T_IoUsIwV_IcVkHkW_IgYoFcVwG{YwGc[_I_b@sl@_nDsq@kaEkxA{tIos@_lEce@orCon@krDc[wkBgEoZsDsXsDw[gE{c@oA_SgEgh@gY_{EwBg^wQwsCkHchAkCka@_g@wxHsIcrAcBwVcBgTcBwQ{@sIcBcQcBkMcBsNcB_NwBkMcB_NkCgO_DwQkC_N_DgOkCsNkCwL_DkMkCcL_DsNgEgO{E{OwGgTkHoUoKc[wLk\\{JcVkMoZkWon@otBkdF{pAw}CgTsg@wGgOoF_N{E_NsDcL{E_NgE_N_DkM_DkM_DsN_D{O_DoPcB_NwB{OoAwLoAcLoAkM{@wL{@oKg@cLS{JSoKS{J?cQR{O?wLRwLf@_Nf@_Nf@{JRcGz@sIf@wGz@cLnAcLbB{ObBoKnAoKbBoKvBcLnAwGf_BspHv[_yA~a@cpBzm@_uCfTkdAzJcj@bGw[zE_]jCgTzEsb@fEkf@vBoUbBsXbBwVnA_Xz@c[z@k\\R{YR{Yf@{qCbB_sNnA_gJ?oi@nAsqJ?gaA?k\\g@w`@g@k\\{@{Y{@cV{@gToAwQcBwVcBgTcBwV_DsXsDc[kCcV{Ek\\gEwV{EkWcGgY{Jod@{Jka@wG{TgE_NgEgOcGcQ_Ssl@{^_eAwGwQc|F{|Okf@crAkp@ojBsxD_oKco@{dB_N_]cLsXwGsNkH{O{JsSgO_XwLgTkdAkgBgc@ct@sg@s{@kdAcfB{OsXwL{ToKcQ_IgOcGkMwLoU_NoZkHkRoFkMoFsNsIcVcL_]kM_b@wGoUoF{TkHk\\wG{YsD_S_DkRsDgTcG{c@sD{YoA_NgE_b@wB{ToA{OwBc`@oAc[{@kW{@{Yg@{^S{YSsXSgvCwBw_\\wBcuVg@{wOg@_`F{@snI?w[g@kyH?kHgEkml@_DkqVg@cVsNsoKkWcvNoF{wJrN{iVoAw{]oAsyPwBk`f@?kuE{@kdKnA_`AzJojBjRotBj\\ckB~W{aAnZ_eAbj@{zAbrA{}BzuAgqC~nAs|BjsFc~JzaFsbJruC{pFfgCcyEbo@w~@~nAckBbxCkgGjvBc{Dns@_yAbj@crAns@c_CbhAcqD~HsXf~Dg}Lz}BspHz}BkyHrI{YjpE{cOzbCssIvhAwqDzaAwbDby@cnC~~CwcKvy@{qCzeDstKzcEk~MzlH_cVr{@{qCzEwQzE{OvG{TzEwQfEcQfEwQfEkRrDcQrDwQrDgTfEcVjC_SrDkW~CgY~CgYvBwVvB_XjCc`@bBk\\nAk\\z@{Yf@gYR{YRc`@S_b@gEc|KwGs{Og@{nBwBkkES{c@wB_hGg@s`AwBkxF_D{eIoAclDcBw{DwBkxF?sXkH{lRsDszHcBwyEcG_fCcLk`C_N{iB{YcnCoZgsBwe@owC_~Aw}HskHgd`@gm@g{C{YwwAwt@snD{fA{~DgnB{}G{EkM_`A{gCgjDcyJgzAw~EctJ{x`@_mVcpcA_uM_ti@_kHgkZwaGooVshBowHc~@w~EgqCccPsDsSwQogAwe@csCs]_rBoZo`BcQkz@kk@wiCoi@{bCgh@ciC_hGsnXwpBs}Igh@_uC{^s_DwQckB_NwfBcG_oAwG_aC{@_kCrIolFz@ct@~a@oe[zEc{DvB{w@rD_oA~HkxAr`AsdNvB_q@nAgpAScy@kC_jAsXoxEoPgvCcQszCoi@gmJwG_oA_X_vEkCod@oU_}DsDku@?oAsv@s_NkR_iD{Ewt@oKcaB_Is`AsIgr@_X{dBgY{uAoZwmAcaBsrGs`AsxD{w@s_DcmA{wEckB{qHk_AsnDox@_dDcj@k`Cos@spCku@ktCsv@w}C{aAo_Ewo@keC{O{m@kRon@{Ogc@ct@cuBo~B{xGckBwmFglCowHgr@ooBchAg`D_v@gxBcj@{_Bsg@wwA_nDccKcj@{_BcQos@{O{|@kk@{oDsjA{qHcsC{sQon@{~D{iB_mLk_AcfGkk@_sDsv@{aF_N_v@gJce@gOon@syAwwFguAcrF{iB_fHo_@syAwcAw`EklBcnHwhA{hEwhAslEoKka@kH{Yon@cdCkz@cbDwL_l@gqCcrKw[soA_hBocHcVo}@cQsv@sI_g@{Jsv@kHsv@gEku@{E{uA_Dwt@wBkz@_Ic|A{JkyCgEcmAwBkp@kHovAwBgw@kCox@kC{m@sDo_@sI_l@wj@gqCkW_yAgTobAod@{lCsN{r@sD{O_Ig^s]ojB_DkRkCgOwQseAoF_l@oPw_CsNs|BgYgjD_I_eA{JcrAkHsq@{J_q@gOg|@oP_v@cQkp@oZk_Aod@gpAkM{^{bCgbH_oAcqDoZwy@{T_q@sSgr@gOcj@kf@klBchAgmE{m@cdCk\\oqA{Okp@oZ{kA_Ic[gO{m@sS_{@_g@{nB{^_yA_Iw[obAw`Ek\\crAsb@waBw`@o`B_]crAwVogAo_@ojBkM_v@oKkp@gJkp@sN_oA{J{aA{Ewo@{Esq@cGccAwBod@sDobAoAkk@wBk{BwBkvB_D_dDwt@kxx@?os@~CcrAvBce@vBk\\~Cce@jHsq@~MwhArIos@nFsl@bG_{@bBc[bBgm@nAwhAwLwlN?oPoFs~FkCciCcBkvBkCswBg@_jAwB{r@sD{r@_Dsg@kR_hBcLwo@kMos@gEoU{EsXkHwe@sI{w@sD{^cGg|@_D{r@oAgh@oAs~A_DwbDwGwuGkCkmDcB{_BkHcsHSccAgE{tDcLwiMgJs~KgO_bOsD_oF_IkyHoFg|ERooBvBgiBR_D~ColAnFgkAbLcfB~Ms~Aj~CweYbBcQbLgw@~R{kA~WcmA~R_`AnKsq@rIsq@bLgzAnFc~@rDkxAfE{aA~M{_BbLc~@vLc~@fh@_`FrX{lCz_B_bOrq@ooGjqBwzQja@{tDjbBonOfr@{nGvQs~A~Hco@z@kHfOcy@vVovAzJsg@~Hcj@vBgOzE_b@vGco@b`@gaFrg@{sGzY{lCf@gEjW_aCz@gJjsA_|Lj\\kyCv[_zCj\\wxCj\\_zC~\\o|Cj\\{{Cr]g{CnZ_uC~McrAjH_l@~CsXvQgzAzJ{r@~M_v@jCsN~R_{@nUs{@v[s`AfYwt@nPg^ve@ccAj`CstF~k@soA~k@oqAjk@ksAjk@gpA~k@_tAbVoi@bVoi@zm@ovARg@j\\ox@nKwVn_@kdAr]wmAzOgm@vG_]nPccAbL{w@zJk_AjHk_ArD_`AbB_jARchA{@kiAS_DcGcmAgYoaDScBkMstAoZ{jDwL{uAcLguAwLcwAoZgoDsDsb@{@wLoAkR_Dgm@oA_b@oAon@So_@RguAbBgr@~HcrAjCc`@~MgpA~a@{tDfOcwAnPcwAzOkxAbQsyAb`@ouDzOo{AzO{zAnPo{AbQo{AnPo{AnPo{AzJgaAbVczBjW{bCrXgbCvVgbC~Wk`CbGsl@~CoUvG_q@vV{}BvVg}Bbo@{zFjdAsvJjW_|BreAgwJvV_|BngAwcKfaAc`JfYcdCrIs{@vLogA~WcdCjWcdCrq@shGjiAwmKrjAolKjiAolK~WocCjp@kgGjHco@rNwrA~iA{kKbsCcxW~WocCjWocC~W{bC~WocC~W{}BzT_|BvVoyBfr@klGrDwj@bBgYnA_]bB{aAjCcgDvB{eDbBohCnAc_CRkz@vGsnIbBcbDbB__DvB_zCjC_pC?_b@z@ooBbBgzARsNvBon@~H{pAf@sSbBwo@f@sv@bBwsCvB{lCbB{lC~CsxDRwo@vBcqDbBg}B?_l@S{YsDscB_D{fAoAod@?_l@RwrAfEooGz@_v@vG{rJvBglCnAglCvBwiCnAg`DjCgaAjCkf@~Cs]bBsS~Cg^vGkk@ja@{qCja@cnCv`@{lCja@wiCn_@{gC~z@cwFrDoUrXoeBzh@_iDjtCspRrb@csC~a@omCj\\oyB~z@ovFnUw|AjWoeBjk@gyDvV{_Bnd@owCzY{nBb[_rBzh@_sDvQkiAzYckB~W{pAnZ_tAzTsjArN{fAzEgm@fE_v@jCkp@jCg~DvB{~DvL{uPnKcrP~CsxDRc`@nAwsCfEovFf@sl@nA{gCnAoqAbB_wBz@gfAvBkwD~CwvDjC_bE~CgcEbB_bErIccKvGwcKvBw`E~Cw`ErDc`E~CknFbB{lCbBcoEz@os@fJsbJrDogFjCowCfT_|[vB{xBnAwe@nAsSbBgTnFkf@fJ_l@vLkf@bL{^ni@kbBfJs]fJwe@vL_`AvBoZbBolAS{m@kCkz@wGsoAoAc[_Dos@cLspCoA{c@g@wj@So}@f@gr@nAsoAnAgvCnAotBf@wj@?sSjCgsBjCorCjCouDbG{~If@{c@?kMzEcaGf@wo@?_jAbB{nBfEgxGz@_b@~C{oDz@wwA~Cw`Ef@os@f@s{@?gYSk\\g@w[cB{h@wBwj@gEkp@_Ikz@{E{^kHoi@oKsl@gJkf@gOwo@_DcLwQos@oKc`@{c@shBwQwt@_D{OcG{YoKwj@cGce@gEw[cGcj@{Egm@wBgc@wBc`@sDc~@wBsv@sDsl@kCgr@{EstAoKkeCwBos@_Do}@{@gYgJ{sBgE{fAg@gc@?k_ASkiAf@s{E?gm@RorC?{fA?od@RgT?chA?_b@oAw`@gEod@oFgc@{E_XsIg^sI{TwQw`@cy@caBcL{ToZkk@cLcVoKwVgEwL_IgYcGcVoF_XgEkW_DgYwBkWcB_l@g@od@?on@?ccA?oyB?spC?_g@?kgB?_g@R{bCRo_@vBwe@bQspCzJkbBnP{`DnUcbDrIcrAbGobAvLcaB~C{^~HgfAnn@c}HjC{YbB_]f@{T?k\\?g^f@g`DSorCS{m@?kgB?wj@S_g@wB{dGoFojBcBkk@kMg{CoFwpBcLclD?oAwBk_Ag@wo@?o_@{@gzA?od@SwtE?_mB?c[?cpBf@c`@z@w[jCsb@rDsg@fTcgDrIcrARwBRkMz@_XRchF?gh@?gaAg@kvBSwe@f@cxC{@gzAg@{h@oAgtDS_fC{@_|Gf@wzG?s~ARkyC?o_@wBkjHg@svOf@cmF?wj@{@kuE?_tA?o_@?{_B{@cmF?cQSgiB{@c_HSsS?oPz@ksF?__DSodEf@{pAnAgc@R{Oz@gzAnAksARsfC?w`@g@geDS{yD?{O?_Ig@oeBR{^SoKg@shBcB_]_D_]_DsSsD{YgE{YgJc`@gOgm@oFwQcj@sjA{E_IkMkRk_AkiAoZka@g^ce@obAcmA{kAw|AoqAg_BgxBgqCkMoU{OgY_IwQsNk\\gOgc@sIk\\kM_l@gEsXoF_b@kC{YwGk_Akf@g}GkCw`@g^_vEwGw~@g@oK_v@seK{OgsBkCkk@oAoZ{@{h@g@cqDRsb@Rwt@Rs~FbBcsp@{@_XsNwfB{Joi@{YkiAsb@kdAsX_g@{`Ss`Zwj@gfA{^kiAwGgYwQknAwGcy@cBsq@rDsgTfEcwP{@gqHSc|Ag@cdC?oZg@_oFg@keCS_kC{@{dGg@ooGg@_hGg@wdCSoeBS_rBg@ozD?wo@g@cwA{@{gCg@{gC{@ohC{@ohCkC_rGwB_~KwBstFwBorHg@oyB{@{vC{@ciC?sb@{@{m@g@kp@cBsbESojG?_~KS_kC?oaNg@w`E?{nBSotBSkpEg@_cL{@{vRSsqERsqEcBsn]SobKg@_bE?_bEoA{qWSsdDnA{m@z@sSvB_l@jCce@vBkWvGkp@fJsv@~Hsg@rI{c@zOwt@bVk_Afh@oeBfm@{sB~bB_yFfr@{}B~\\_jAb~@w}Czw@_pCrnDgxLzfAkrDni@giBj\\wmAbQkz@zTsyAjCcVjH_v@~HksA~Co{ARgiBScuGR_sDRobU?o`L?ksAf@o_Tf@whP?shGf@wzGSgqHRshQRsrGSguFR{pARwfG?gsGR_{O?gnGRslES_gE?gtI?wrARweORweOSgr@{@on@gEgkAsDg|@cBox@?oAg@wrAf@{|@~CkdAvGo{AnAsb@Rsb@z@cnC?ocHRg}G?skHRsuHz@c_R?wbDRowCSwpB?s}DRc|A?{uARwrA?cqDRkzE?{wERkmN{@chAkC_cB_IgbCgEccAkHobA_I_`AkMwmAkH_l@sq@shG_]k~C_X_aCwcAkkJsSklB{c@c`Eka@kwDoFgh@sSckBoAcLsDgh@_Dkf@cB{m@g@kp@Ro}@rD{fAzEgr@f@{EbGgm@bGce@bLkp@rDkRbGgYjH{Y~C_NjRsl@j\\{|@rg@{fAvaBclDfT{c@vLwVbGkMjdAswBjp@{pAb`@_q@~a@wo@ja@co@f|@olA~sAgdBvGsIvo@ox@rb@sg@fr@g|@j_AogAjz@{pAfOcVvo@{fAzTsg@nUkk@bQgh@jWcy@zTs{@vQkz@rIce@fJon@j\\k~Cve@oxEjlBswQfh@w~EfpAkjMbqD{o]jtCcvX~iAk}K~MknArDwe@rDwo@rDku@vG_oAbGcaBrD{|@jCwj@rD_q@rIcpBzJsfCzEwcAvBsb@bBcQvLwvDv[_pHvQ_gEnAsg@f@_g@?sg@{@sg@oA_g@kC_g@_Dce@ce@ksFgJkdAgc@{aF_Dkf@wBgc@{@{c@oAkWS_DRkH{@syZS{lf@?ovd@?ggC?ox@R_zC?oF?o_Ez@guAnAc[f@oPrD_l@f@{J~Cw`@z@_IrDc`@vB_SrDk\\rN_v@~RogAve@k{BrIo_@v`@wkBfr@cbDnFoZzJ{w@nKs{@jHobAbGcwAf@ccAf@{eD?{}BRguA{@co@oAgT_IgzAkk@w{Dwe@wpB{zAw|Fo_@_cBcBwG_Nkk@kHs]gOseA{Eo_@oKgaA{J{sBcBwmAz@gzAbB{c@fJ_hBnFwo@vGku@~Csb@~\\cyEvVopDnUkcD~WohCnKseA~MknArX_kCrX_fC~MsyArS_wBrDwe@nKs~AjCk`C_DsrB_IstAoP{uA{Y_mBkp@ggC{w@gsB{uAgjDkrD_xIksAk~C_yA_iDkk@chAcVod@{Y_b@gc@sl@waBcuBohCofDk\\gc@{tD_{Ec_C{`Ds]{m@gYkk@sD_Iwo@wwAwy@cnCwVkz@{Jc[{h@{_Bk\\_eA_q@{sBwo@guAcVka@gTsb@gJgOkCgE{c@wo@sS_X{fAkiAcy@sv@{fAgaAo_@g^o_@c`@{OwQkM{ToP_XcQc[sNw[kCkH{O_b@{Oon@cG_]sI{c@_Dc`@cGsjA?kf@f@wt@nAod@zEsg@v[kqBv`@g}Bv`@g}BbVsrBvLgdBz@gc@vBwmASgc@wB{uAwBcj@kCsg@kCw`@oP{zAwLo}@_v@wcFgEoZoZgsBkMsv@cGco@gE{h@wBs]cB{m@SoqAR_q@Rka@SkM?c~ES_NR{w@?{nBz@sg@bBkf@jHo}@jMccA~f@khDvQ{pAzJcy@nAsN~HknAnAkp@R{T?wVg@w~@{@gTcQwgDsXkeHkHcfBoP{yDwLo|CgJsfC_IswBwL{`D{@wQ{JgbC{iBsod@gE{fA{@oUcB{YgEkp@kCc[cBsSkHco@kf@ohCgJ{^wmAs~F_wBk_Kk}A_pHsS{aA_eAw~EscBkcI{^oeBg@kCcQ_{@sX{pAkCkM{c@kvB?S_SgkAgE_b@wGcy@_Dos@cBw~@SoZ?cLz@k_A~Csv@ja@stFb[_qEzEwo@nPwiCbGgw@f@sNfJolAjHccAjCkf@bBwe@z@ku@S_uHf@o|C?gpAz@scBS_fCf@siD?whA?{ERgTz@gm@z@s{@f@w`@z@od@~CojB?gERwLf@wVbBc|A?gbCS{w@oAkmNR{qHkC_kM{@snS?czBRweORsvJSszC{@_aHcBcnCcBk_A_Dk}FS{nB?{fZ?kaJ?_eA?soARguARw_Cg@o}O?ooGg@_lkA?_qOR_cGRknASc|ARcyEcBsvYnAkjk@RkyHg@ct@wBsl@sD_b@gEc`@kHgc@sN_q@sl@czBsNkp@cLcj@cBcLcLkz@oFco@gEk_A{@gc@S{TSc[RgTf@od@zEwhAfEgkAbL_zCrI{bCzE_jAfT{nGfTwwFz@gOjCcVjC_S~CcQfOs`AfOs`AbGkk@z@cQbBcV?g_Bz@saCRkkE?_q@RckB?cVg@oxESs{@?{gC?cnCSo~G?ghJz@gnLRohCS_cL?orCf@koC?wtERwtESgsB?gqHRgmESgaF{@_g@wBgm@sI{_BkHkiAoKcwAoFgw@{c@{iG{JsoAoFox@sSwsC_IcmAwGobAgEku@_IcwAoFg|@sIwmASkC{O_pC_NkvBsXslEgJ_cBoAwVwBc[cGcrAwB_b@kM{dBcBo_@kCgr@g@kk@g@cy@nAsl@z@oUnFk}AnAgTnFw`@~Hsv@nUo`BbBkMbmAkhIf@gErI{m@~H_l@ja@o|CvG{c@nKct@fc@owCrI_q@~Cw[vB_SnFwo@fEwo@~Ckp@nAw`@z@o_@f@o_@R_q@g@{zKkC_ed@f@wqb@RstK?{aARsjAz@wiH?gzA?_g@{@chKRcrU?{iBnA_|LRstA?_Xf@_yFSwcFSkgBRcnM?kuER_~K?{w@z@gpU{@s|L?odJ?kf@f@_f\\f@whF{@cpLR{gHoAcdH?ohHg@k`HSc~@Sk_Ff@s|GkCsig@kC{}BoAs`AcBk_AkC_`AkCk_AsD{aA_D{w@kCco@gJgiBcBc[c`@cwFcBkWw{D_yi@kHseA{E_{@_Dwo@sD{|@wB{w@wB{r@oAwo@oAkp@{@{fASogAR{pAf@{w@z@wt@vBgkAvBkz@bBce@bB{c@zEseAjCgc@rDco@vGc~@zEgm@vG_v@bG{m@rI_{@feDwjYjR_hBvLwrAnKoqAbLwaB~HcwA~HwaBbGoeBz@c`@vBw~@bBc~@nA_eAz@orC?cVRsqERwj@bBghY?k\\vB{|^?_rBf@ka@?ccF?kk@RckGRkz@f@kjH?sxD{@czB{@{aAg@s`A{EwgD_DoeB{@sXsDg_B_Ik`CoFcwAoFksA{EgfAkHcwAgJckBgTodEcG{kASwBkHcwAoi@wmK_IsyAoF{kAcGsjAgEgfAgE_eAcB{m@{EovA{EcfBsDw|AwB_yAwBsyAcBooBcBk|D?k{B?gzA?{iBSovA?k{BRkz@Sgh@RcpB?sSSkWSkdA{@kdAcBccAwBox@oAwVsDgaAkCcj@oFc~@{Eos@_Is`A{J_eA{J{|@kCgTwLw~@oPwhAsNkz@oPw~@gYstAoUobAoUgaAwj@kqBsb@_tA_g@ovAoi@{uA{w@giB{Tkf@k{B{|E{mEwtJ{}BwcFgOw[_aCogFoyGc{Nod@wcAg^gw@od@seAs`A{bCwy@o~Bgm@ojBkf@caBod@caBw`@{_Bw[stAsNon@sNgr@sIgc@gOox@gOwy@{TksAwQolAoUscBsN{kAkMchAwLwmAgJgaAgJknAsIknAkHolAcGgkAwGo`BkCwcA_DwhAoAs{@cBcrAg@gkAbBsxb@rD{mm@?kk@f@kaJSgm@?on@{@ce@wBs`AcBgh@gEsv@wG{|@kHsv@oKobA{O{fAgJkk@gOox@gOsq@sNsl@oUcy@{T_v@_b@gkA{^k_A{Ywo@w`@cy@g^wo@{h@s{@w`@gm@s]od@c`@kf@sg@sl@{m@{m@gr@co@on@sg@seAwt@oZ_S_l@k\\oi@gYo}@ka@_]kM{^sNco@gTw~@kWct@gO_xD{w@ccFkdAkbB_]cy@oPkhD{r@suCgm@cVoFod@gJsxS{hE_fC_g@gsBgc@_l@kMkqBka@kp@{OsaCos@oi@_SsXoK_XwLox@o_@sX_N{h@sX{m@_]wo@c`@{c@{Ywe@s]gw@gm@on@gh@kz@_q@gqCwzB{qCwzBspCwzBspCwzBg^gYoZkWwVwVgJ{JoFoF_Xc[cV{Yk\\{c@s]sg@{c@wo@gc@wo@_]wj@wVgc@{Tw`@wQg^g^sq@gOk\\cLcVwzGsgOkWwj@spC{iGsvJonTkxAcbD_g@{aAgm@whAwt@{kAc`@{m@sb@_q@gaAc|Aos@{fAgwJ_lOccAg_Bw`@sq@k\\gm@g^gr@c`@cy@oi@olA{fAwdCc_MwvXkmD{`Isg@_jAgTkf@oUcj@oUon@gOwe@gOwe@cQ{m@gJg^oFoU{Oos@{Jwj@_Nox@sIgm@cG_g@wGgr@oFsq@{Ewt@kCwt@cBgr@g@o_@g@sq@?wbD?sv@Scao@SgnBcB_rBkCgvCoAo}@wBolAsDscBkCg|@oF_rBcGo`B_DkxAcB{pA{@gpAg@_cBRcy@z@wmAz@kiAf@w`@nA{m@bBos@vBwy@fEwhArIo|CrDk}AbBwcAbBgfA~CwsCz@shBRsv@Rs~KRseA?cy@?wy@?c~@?gw@RorHSgaF?sxD{@ku@wBwt@kCon@cGcy@wGkp@gJ{r@{Ew[{E_XkHc`@gJgc@_DsN_D_NsI{YoUsv@wBwGkR{h@sS_g@gTkf@oUod@kR_]_Sc[_SoZgToZwe@gm@k\\s]ct@_v@o{As~AsX{YozDs}DkwDk|DswB_|B_SsSggCkjCce@we@od@we@csCgvC{OoPgcEghEs]g^kp@{r@c`@c`@_]c`@_b@gh@k\\ka@cG_IoPoUsb@kp@{OoU{Tc`@cVce@oK_SoZon@c`@_`A_l@syAw`@knA_IsXoUc~@sXwrAgOgw@{E{YkRoqAoFsg@wGco@{E_l@sDoi@sDsq@wBgh@cBcj@oAwj@g@on@Sco@kC_br@kCcxa@SotG{@gw@{@k\\oAw`@wB_b@kCs]{Esl@sIos@_Iwj@{J{m@gJ{c@{Jsb@gJw`@_Nce@{Osg@_S{m@sSwo@gOgh@{O_l@kMoi@gJw`@cG{YsIod@kHgc@gJgm@cGod@{Jc~@_Ig|@oF_{@_Don@cBsl@oAco@{@wo@Sgm@f@w~@z@on@bBwj@vB{h@vBce@~C{h@rD{c@~H{|@bGkf@jHwj@bLsv@jHc`@bQo}@zOgr@fOgm@fYseAja@s~AnZgkAvVwcAjMgm@nKgm@nKku@bLkiAnF{w@jCsl@bBon@z@on@?szRSgvRRgwOg@{fASos@{@cj@cBwj@kCgm@gEs{@sDcj@cG{w@wGsq@{Jwy@_Iwo@gEgYoPobAgO{w@oPsv@kRsv@c[chA{Twt@sSon@{Osb@gJcVc[ku@sI_SkWoi@oUkf@_jAk{BgrJ_fRw[co@w[sq@wV_l@{Y{r@s]o}@{Y{w@g^seAsX{|@w[whAwQct@oPco@gOkp@gO{r@cQo}@gOox@cQgfAcLsv@oUgiB_g@ghEcVwpBwQovAcLgw@sSgkAkM_q@oKcj@wL_g@gO_l@_]oqAgOkf@gh@_~AkRoi@gTgh@kRod@w[ct@g^_v@w`@gw@g^kp@kf@ox@kp@obAsq@k_A_q@wy@ct@_{@kqLgjN_}D_vEkjCo|CocCgvCo}@gfAsb@oi@kf@gr@wj@wy@oi@w~@{c@{w@w[on@w`@cy@c`@o}@{^w~@g^obAkf@_yAcfB_oFs~Ac~Ew`@knAkz@ciCgYkz@sSsq@cLgc@gJka@sIw`@gJgh@_Iwe@kHcj@_D_XgEod@_Dgc@kCsb@wBoi@cBwt@S_{@RgxG?{rEnAkef@f@ora@RsfM?wxCf@_sD?k\\Sg~Df@scQRovKg@oi@{@ku@oAkp@cBgh@oFgfAgEkp@gE{m@_Dw[{E{c@{E{c@sDgYkC_S_Iwj@kHod@oFk\\oK{h@oUchAwLsg@cQ_q@sX_`A_]kdAsScj@k\\wy@o_@s{@ce@_`A{^sq@{c@ku@{c@sq@wt@kdAwcAguAs{@{kAce@os@c[gh@s]on@w`@_v@k\\wt@k\\sv@kW_q@{^gfA_Xo}@gY_eA_Skz@{T{fAgOkz@wLwy@{Jgr@{Egc@{O_yA_Ios@wy@wnHc`@okDgJwy@k\\{vCcGoi@gOstAsN_oAcL_eA_N_jAwLwhAcGco@sDo_@sDcj@kCc`@_Dco@{EwhAcB_l@{@{c@g@cj@g@{w@?_I?c[Rgw@z@_q@z@gh@vBwo@bB{r@bG{iBrIkeCrDsoAnA{r@Rco@Sod@oAwt@cBwj@wBgc@gEgm@_D{^_D_X{J{w@sI{h@_Nsq@cLsg@kRos@{Ogh@_S_l@c[_{@ct@wpBweOcsa@_`A_kCgOka@gO_b@sN_b@_Ngc@gOsg@wLce@oK_b@{J_b@wLgm@_Nku@wLsv@wLs{@kHsq@wGgr@{Eco@_D_g@oAkWcBs]oA{c@cBsv@{@sv@SccAbBcrx@?_pC?{hER_eA?ghER{nB?_nIRcgD?_yA?chAg@co@{@gm@wBon@_Dwo@wBw[wB_]kHsv@cL{aAwQsjAoKos@sN{w@_jAczG{c@ciCgTknAgT_oA_N{w@k\\cpBgOwcA_Ioi@cGkf@sIct@kH_v@cG{m@oFgr@oF_v@{Ewt@gE_{@_Dcy@_DgfAwBw~@{@s{@g@gfAvBcwUnA{hJz@{hJf@cxHz@o~Gz@ooG?sSvBkea@vBgd[z@_{ORos@f@wt@nA{h@nA{c@nAc`@vBce@z@gTjCsb@bGkdAnFon@zT{gCrNw|AvQwuBjHo}@~Ccj@nA{YnAgm@Rkp@?_g@Skf@oAkk@gE_{@_Dcj@{Ekp@oPooBwGwt@_Dc`@sDsg@_Dod@gE_`AoAwVcBkf@kCccAg@_]g@s]g@{|@?wdCRwhASk\\?kbLS{w@?{^{@ka@_Don@oA{OcBkR_D_XkCkRwGg^kHc[kHsXkHkWgJkWoFwLwG{OcGwLcGwLwL_SkMgTcL{OoKkMkR{T{J{J_XwVgc@c`@k\\oZsl@_g@kz@os@gc@ka@oZ{YgOoPkWsX_]gc@{Ysb@{T_]cQ{Y_I_N_~AglC_cBcsC{Y{h@wQ{^_IkRwGwQ_IwVwGcV{EoPgEgT_DcQ_DoP_D{TwB_SsDg^cBg^g@cVg@kWSkz@?gyN?ktC?kz@SoiE?w~E?_SS{kASg|T?g{CSonY?seKf@_he@?{`S?sxD?ox@Sk_F?_gE?w[SssN?k\\SsjFS_}DSclD?ox@Rkf@f@ce@Rk\\nA{r@nA_l@bBcj@rDo}@jCkp@rDsl@jCce@bGwt@vGs{@rIo}@fJ{w@bLo}@vGsg@vLox@jWs~AjWo{AfbC{tNzE{Y~Mgw@rNg|@fJsg@nKco@vLsv@bLku@vLs`AzEsb@fEgc@bGct@jHseAnA_]bB{^jCk_AbBos@f@sg@?{zARcmA?wrARcvNz@_fu@f@k~W?kf@Rg~D?{kA?k\\R_v@z@gzAbBgzAbB_tAnAs`Af@w~@z@seARkgB?{_BR{nBRcrFR_~K?cdCSs{@g@kk@S_g@g@od@cBs`A{@s`Ag@ct@g@ogASguAz@kfc@R{_B?os@Rgc@Rg|@f@{fAf@ox@f@{m@z@oi@z@wt@z@{aA?{Tf@gpASobAg@kz@g@c~@{@sq@{@{kAg@os@Swt@SkyC?kdA?c_CR_aC?{Tf@cvSf@{ySf@slJ?_|BRg{CRsbE?wV?{wEnA{{RRs~Af@kz@nAco@bB{m@jC{r@vBwe@bG{|@bGkp@nFcj@nKc~@jMw~@vpBsfMf|@crFby@_jFzTwrAvVcaBnPwcAzJwt@fEgc@jCsXbGcy@bBgYnAw[f@_]z@gm@RoZSwt@{@w`@oA_g@kCwj@wBka@gEgh@sIox@wGgc@sIkk@sI{c@wLcj@{Jka@kH_XkHcVkRgm@gYwt@sXco@o_@sv@g_BwbDk}F{nL{mEs}IcV_g@{O{^_N{^wLc`@cL_b@sI_b@_Igc@cGgc@{Esb@oAwQ_D{c@oAce@g@{c@Sce@bL{lRf@od@f@ce@bBkp@vBkk@vBod@zEsv@bGgw@rD{c@vLchAfkAsbJbj@{hEns@guF~dAkcIb~@{gHn_@ktCr]omCjRgzAfO_jAnPkxAnKkiAvGgw@nF_v@nFgw@fEgw@bGk}ArDk}AbBgkAf@whA?{kA{@_jAcGkgGSw`@cBknA_D_~A{EcpBsDkiAwGo`BcLkjCcBsb@wB{m@kC{w@cBgw@cB{w@{@gw@{@gw@g@kk@g@_hBSolAoAcdC_DczBkCgfAgE{_B_DwrAwBogAoAknA{@gw@g@{w@RgiBf@oqARcVRgT~H{sGbG_hGbBcpBz@cpBz@wpBf@cpBRsuCcB{k_@g@_bORk}Af@ksAjCgoDf@oi@rD{xBbBobAbLoxEfE_hBnFgnBnKonErDw|AvB_~AnAk}AR_~Ag@cwA{@w~@wBoqAkCwmAgEwrAgJcpBwLsaCkHwpBsD_jAwBgw@wBgkA_D_hBcB_|BcBgqa@?ssDSg|E?wt@S{zFS_mBRgw@f@sv@f@sNz@c[nAg^rDgm@bBcVnA_N~CoZ~H_q@fJon@nFc[jHo_@rN_q@ntB__IrsD{jNfuAsjFfc@kbBvzG{bWfaAgtDjp@_fCbVo}@fT_{@rXknAzJsg@zJkk@zO{aAnK{w@vL{fAvGcy@rIwhAnK{zAbL{uAvQsmB~R_mBnPguAvQ{uAjMccAnK{r@zJkp@fOgaAb[{iB~WkxAjWwrAjRc~@f^scBv`@kbBfh@{sBvj@gsBfrEolPvQwo@jR{r@rSkz@bLwj@bLos@bLox@vBgTnFos@jCwe@~C{m@nA_q@R{m@?{^?cj@S_{E?{hEg@ciHRkk@?wo@SkxASsgESgiL?ka@S_nIf@kxAbBk}Az@{fAvB_eAjCsoAvGwzBjHk{BnFkjCvBggCf@ccARsg@Ro_@?kf@g@swBg@whAkCgnB_Iw{DgEstA_Ds{@gEsoAsDstAsD{iB{@ct@g@sq@g@{zA?{fARgkAvB_mBbBseAfOscGbBwt@v[g}LrS_iIjCg_BnAg_Bf@gzAS_yAg@soAcBgzAcGccFcGgkF{@on@g@_g@oZgvW_N{dLcBs_D{@cxCRobARguARwcFRwtEz@c}Rf@sjAz@we@nA{h@bBsg@jC_l@bBw`@rDkk@~Ckf@bGku@jHku@nFwe@bGkf@nKcy@fO_`AfOgw@bQ_{@jRkz@fOkk@fOkk@bVcy@v[gaAjdAsuCnx@k{BzJsXjk@s~Ajf@guAndEgiLjf@crArg@wrAn_@o}@vVco@n_@c~@~k@_tAfTkf@vQka@bo@{uAbo@stAfY_l@j_AklBzeDgnGfYwj@jW{h@~k@soAfTod@jW_l@b`@w~@vj@ksAzh@guA~lBogFryAc`EzaAcnCzaA_kC~p@scBzm@c|AzaAg}Brl@wrArDgJnP{^r]ku@jf@kdAn}@{iBr]_v@j\\_v@b[gw@zT{m@vVku@jWkz@nKo_@vQsq@bQ{r@r]scB~CcQ~M{w@fJoi@rScaBzEka@fE_b@jH{w@nF_v@rDsq@~Ckp@zEw|AvBscBf@sv@SogASwnC{@_tKSs{@oA{dL?cpBg@wlDg@wbISoyBS{oDoA{yNS_`AoAsnN?w[cB{wT?wy@ScoE?_l@Ros@f@{w@z@whAvBwaBbBo{AbBwaBvB{nBf@kf@z@_yAf@gaA?gxB?wj@?sqERgnQ?soA?ouD?wj@R{fK?{yI?{vC?{oD?wj@?whA?kiA?{T?wmA?c`@g@wj@oF_sDkH_bEsD{pA{@c[sD{uAoAwt@g@cVwBguA{@co@wBg_BwBwmA_Dw~@sDg|@wBgc@kC{^wBo_@sD_g@wG{fAcBwVwBsb@kCox@wBgw@oAknAS_{@?wj@RslEf@cy@Rcy@nAo_@vBkk@jCk\\vGcj@vGcj@jC_N~Mk_AbL{r@fOccAfEsXnKgr@~f@cgDnU{zAnPchAvV_~AjHgh@jH_g@jC{OnF{^rIkk@~Hsg@jRgpAjWo`BjC_SnFc`@rI_l@~CoZnA{JvBc[bBoUnAcVz@sXf@gYR{h@f@{|@cB{nBR_Xf@chAnA{eDRgr@S{Tg@oPoA_]kCsb@kC_X{E{^cBwL_D{OcGc[{J{^kHwVsIwV_Ns]oPw[gTo_@cQwV{OgTcVsXwt@wy@_N{OsIcL{J_NoKsNgOsXkMkW_N_]sDcL{EgOwBkH{EoPsDwQwGk\\_DcV_DcVcB{Tg@wGoAgT{@{TScQ?gO?_b@f@s]nA{pASwrARc`@RkdARwt@Rgh@z@wfB?gTf@o{A?cy@g@wy@{@kp@{@kk@oAs]oA_b@oFguAoFcmAkH{nBcBw[{EolAwBwo@sD{|@{@cVkCsq@wB{^oAkRsDc`@{Eg^wG{Y_DoKwB_IwBwGcBgE_IcQ{JkRsIoPsg@{aAkH_NoFgO{EgOcBkHoAwG{@{EkCcVg@gEg@_NSoKS_I?{Jf@sNbBsSjCwQrDoP~CcLnFoPjMc[jCwGb[ct@ve@k_ArN_XnZ_g@nUg^nZ{c@fsBskCv`@cj@zh@gr@zO_SjMcQzOkWfEwGfJcQjMgYrIsS~HgTzE{OzE{OvGcVzEsSjHc`@nFka@nFod@zw@wdH~RwfBjWc_CrDoZzEk\\jH{^nFkWrD_NbLo_@fJcVrI_Sni@knAbQ{^vfBg~D~MoZnPo_@r`AczBzT_g@j_AsrBrNw[n_@wy@vo@syArq@o{Ajp@gzAvLsXnKoUvQka@fTsb@rS{^nKwQzJ_NzJcQvy@gpAvy@_oAnlAgiBrl@w~@zuAkvBbQoUbVoZj\\o_@nU{Tvy@_v@zJgJ~M{OjMoPvGoKfJwQnF_NfEsNfEoPvBkMbBoPnAkRf@wLf@wQ?gc@?_b@?gm@?oyBRc}Cg@kz@f@s_Dg@{m@cBwVsDwV{Jka@gE{OwBcLkCkMwB_NoAcLoAcQSsISwL?_g@R_fHf@sv@z@_g@nAsb@bB{m@bBon@~CgkAbB_q@~CknAbB_q@~C{kAbBw`@bBoUjCkWrDk\\bGgc@bGk\\bG{YrIc`@jHsXnK_b@riDwxMnK_b@~bBswGz^wwAfTg|@bVgaAve@wpBzr@w}C~Rc~@ndJcgb@v~@{hEzOos@vQkz@~rDstPjz@gyDzEcV~xAoyGvGgYzO{r@nZcmAnZgkAv[gkAr{@{vC~\\chAf^{fAjpEgeNvfBgpFjMo_@f{CsgJfnBwaGnyL{a_@jHoUvVku@fEkMn`B_`FzEgOjvB{sGfw@k`Cf^chAfTsq@nP{m@jM_g@vLoi@~Mco@fOg|@jMsv@zJsv@fJ_{@fOwpBzEg|@?cBjCs`AnAwt@R_{@z@gmOz@{oSRo{Az@wvI?gTRs}I?sb@nAseU?kk@R{w@z@gfAbBogAvBobAbG_wBjCk_AnAsv@vB_tAf@seAnAcvI?wB?c|Ag@_tAg@olAcBchA_DkiAsDs~AkCw|AcBo{Ag@olASg|@?os@RoiE?k\\rDgcc@vBcp`@jCsb^z@seAf@od@f@o_@bB{aAfEsyAvB{fAbB_v@z@{aAf@_q@Sgm@g@{r@cB{aAkC_jAcB{aA{@co@{@sg@oAcnC?{}B?oUf@{jD?oZz@{lCnAwcAz@gh@z@sg@fEcwAvGkxAfJ_cBbGobAvGox@vL{pAjM{pAbGgh@nAoKfJgr@rSovAzJkp@vQwhAzTkiAnPcy@~a@ojBbe@ojBjHwVni@ckB~CcLv`@gzAzT{aAfT_jAvLku@zEw[rDgYnP{zAnFos@zE{r@zEseA~C{aAf@{m@f@k_ASgr@g@sl@{@gc@cB_b@kCct@{Ek_AwGox@sXwxC{Yo|CwGku@wo@g}GoZofDcfBwdRsyAw~O{Ekf@sIk_AcQgnBkWgqCcGku@oFcy@_Doi@cBg^cB{c@oAsg@oAgh@g@gOoAg|@g@szCoK{sy@g@g|@z@wiCz@{zAzEszCvBgkAbBgkAvB__D{@s|BsIgoNgEsmGcBo_ES_tAS{w@R_`Ff@caG?wmARwxCf@ktHRce@?{c@?{JRkaE?c~@f@geD?ggCRcwAf@gmE?_lERsXS_v@g@{|@{@c~@oAcy@wBseAoAgc@oA_b@sDgaAgEsjA{Ecy@{E{|@cGo}@kHseAwGox@gOcaBgTczBc`@kaEwQ{iBw[__D_]__Dce@w`Ek\\omCkMseAsg@gcEoPovAwG_l@kHku@wG{|@{Ect@kCgh@wBsq@oAwe@cB_v@Skk@?os@?kf@f@g^z@on@nAo_@nAsb@jCsq@vBc`@rDwj@zEon@~Hwy@nK_`A~MchAfuAkbL~k@_{Ejz@c_Hf^suCnPcwAjMgpAbGgw@vGgw@vGg|@fJojBnFstAfEwwAvBgpAnA_oAf@knAf@kxAnAolFR{YnAk`H~CgpKjColKnAgfFSo~BS_hBwB_kCkCglC{@kp@gEsnDsD_nD{@syA{@_yAg@whAoA_tF?_|B?{iBRc_H?_}S?{iB?gh@z@g~DnAo{Af@on@nAco@jC_tArDcrAvBg|@z@kf@nAwcAf@sb@Rsb@?kgBg@ccA_Do|C{@oqAsI_}IoAovASsmBf@gdBz@kiAbBwhAjCguAbBwj@bBgw@jC_{@jC{fAz@cy@z@s{@f@{c@R{fAR_q@Swo@oAg_BwBstAsDckBgJskCsDseAwBos@oA{m@g@kf@g@{^?{c@S_g@Rk\\R_q@nAgr@vBc~@nAsb@jCsl@zJwkBrD_v@fE{fAbBsl@nAgm@jCgzAz@gkAf@g|ERskCRg{C?cVRkfERwwARwfGSgfAg@gfA{@_eAcBc~@oAwo@cBwo@_DgaA_Do}@{EchAwGkiAsDwo@{Eco@s{@{}L{Egr@_IwmA_I{nBoA_g@cBsyAS{w@R_v@f@ku@nAgr@bBco@rDk_AbLo~BjC_l@jCwt@~Cwy@zE_cBrDkbBvBovAf@sq@nAo`BRwaBRg|@SwuB?w`ER{gC?snI?oU?{hERcqD?csCR_~Az@wgDnA{nBbBskCjHgiGfh@kdZR_]rDo`BrD_oAnFkxA~H_yAfEku@bGccAjHs`AfJkiArD_b@nFcj@vLsjAnFce@vGgh@~Hco@~Hgm@nFo_@~MobAbLk_AvQ_hBfJgkAvG_`AnFs`AnFcrA~CseAbB_q@z@co@f@w~@?g_BSct@S_l@oAsq@kC_eAcB_l@wB{h@sDku@gEox@oFos@oKoqAoKolAgJs`A{JseAwVskCgc@gwEg^sxDg^sxDs]ssDw[goDoK{kAkMs~AgEgm@oFccA_D{r@wBgh@wB{r@{@ce@{@c[S_Xg@oi@g@c~@?k_Af@w|AvBcmAvB{|@fOcrFrNsoFrDciCbBciCRksA?os@Sox@{@ckBwBkgB_D_hBwGsaC_DobAsDobAkH_~A{Ekz@{Ewy@c~@gbM_Ik_AoKcwAsDkk@sDsl@kCkp@wBgm@kC_{@{@kp@{@ox@g@{h@?oi@f@g|@z@_{@nAkk@jCccArDk_AfEkdAfJ_aCfEseArSkdF~Cct@bL{qCbBgh@z@_g@nA_v@?kp@?w~@{@gh@oAox@_D_{@oAc[sDwt@gE_l@_Dka@gEkf@gJo}@_Igm@sIgm@cLsq@cLwo@_Ic`@oKsg@sN{m@wVw~@sNkf@wLc`@{xBsrGwt@kvBsX{w@{uAsbEskCkyHkW{w@kf@{uAc[w~@k\\gaA_l@oeBoUos@sXc~@_b@o{AoZcmAs]{zAsSs`AcLon@wLwo@gOg|@oPseAoPgkAsN{fAc[czBcj@s}D{E{^cV{dBoUo`BcGka@_Igh@sIoi@oF_]gJwj@kMwt@_Ncy@sNox@oKsl@cGc[cLon@kRk_A{TkiAwGk\\oKkf@_]s~Ak\\syA_]wwA_S{|@_l@saC_Skz@sg@wuB{c@klBgY_oAco@_kCgc@giBsXgkAkMoi@gJw`@cL_l@wGs]kMku@oKct@oFka@cGce@wGon@_I{w@oFct@kCc`@{@cQsDku@wB_b@cBco@oAwe@oAseA{@kiAoAwy@cBco@gEkz@cGw~@_Ik_AsIsv@sIgm@oK_q@sIgh@sI{c@{EcVgOon@c`@{uAsN{c@gOsb@gh@wwA_Skk@kMw`@kM_b@sI_]oKw`@sIw`@sS{aAoKsl@_Isg@wLgaAgEg^{JkiAoFc~@wBce@oA_b@gEcuBSwV{EwkGwBc_CoA_rBwBcpBoAolA{@cy@kC{fAkCcy@gEogAsDs{@gE_v@sI_oAwG_{@sIo}@cLchAwL_eAcVojBwQ{uAsDwVwhA{tIsNwhAwL_eAsIgw@wBgTcG{m@gEkf@_N{uAwGsv@wGox@{JkxAcGccAcGchA{EccA{E_oAwG_rBcBoi@wBgaAgEkgBoA_oA?{T{@smB?gkA?wcARsjAnAgkAjC{vCbGwnH~HweJfEgwEz@soA?ovAg@ccAg@sv@oAkp@{@kf@wBox@g@gTsDobAsDsv@cGcmA{JcwA{@_NkH_eAsDcj@{Jo`BkH{aAgJkxAcGw~@gJwrAwG_eA{E_{@gE{aAkCkk@cBsg@wB_{@wB_tA{@{m@oAwmARkf@R{uAnAogAnAc~@vB{w@zEcwA~Ccj@zEsq@fE{r@fJ{kAfJk_A~Hk_ArI_{@jHsq@nKsoA~HkiAjHogArDsq@rD{|@bGwfBbBs`AnAwo@nAon@z@kp@fE{dB~CgnBrD{iBfE{nBz@we@vB{iBf@_tASgkA{@ovAoA_{@oA{w@wBsv@cBkf@gEseAwG{pAcGs`A_IchAsIgaAsIc~@_Icy@kHku@{@wGgJk_AwV{lCcVsfCwj@c|FwGon@cGgr@oKgfAsI_eA{Eku@gE_v@kCwe@kCos@cBod@kCccA{@on@g@_l@{@{r@?os@?wVz@kxAf@{r@bBos@~C_eA~H{dBjHwrAzEco@bG_v@rIs`AjMsjAfc@sxD~McmA~W{bCnn@ovFnKgfAnF{m@nKovA~C_l@fEkz@fEccArDwhA~CwaBRo_@Rce@z@cmF?{TnAcjJnAs~Pf@wfB?scBRgaAg@_{@g@_q@g@co@oAku@wBct@kCc~@kCgr@sD_v@cGkiAsDkk@wB_XoFku@cGct@gJk_A_]{{CsNcrA_SgiB_SkgBwe@cjEsNcrAgOksAgT{iBsNcwAoF{m@gE{h@_Dod@_D_g@sDsv@wB_g@wBoi@cB{|@oAwt@{@cy@?obAf@{tDf@{qC?ccA{@wcAwBwcAsDguA_Dox@gEo}@gEct@oFcy@cB_S_Dsb@gJseAoFgr@gTglCgJcaBcBgc@cBsb@oAox@oAc~@S{h@?_eAz@w~@vBccA~CccAbGgzAnF{zAjHckBfT_oFbB{c@bBsg@vB_g@rD_jAbBcy@rDw|Az@wo@vB_rBR{c@?_IR{m@R{_B?stA?_b@RcsCRo_@z@g|@bB_jAjCkz@z@k\\z@c[jCgm@jC_q@rD_q@jC_b@nF{r@rb@w|FfJkiArg@gxGjCod@vB{c@f@cLnA{c@nA{h@f@sb@?gaASgh@{@w`@oAgm@oAgY_D{m@sDwj@wBkWkCkWkHgr@kRguAcLox@kMw~@cLk_A_NsoAsD_b@oFwo@oFsv@_Dwo@sDg|@wBkp@cBwo@{@wj@{@sl@?_l@Sct@z@oqAz@{r@vBox@bBcj@jCsq@fE_v@nF{|@zzA_vT~\\gaFvBw[rb@smGfEsv@vBwj@bBwe@nA_b@nAkf@f@w`@z@ku@Rct@g@kiAg@_g@{@kf@oA_q@cBsg@gEs`AwB_b@wBc`@{E{m@{Ecj@sD_b@on@{iGcGkp@oF_q@{E_l@{Eku@gEgr@_Doi@sI{dB_Dwy@_D_eA{Eg}B{@ku@{@c~@g@co@S{aAR{pAnAkvBR{JbB_nD?knA{@ckBsD{nBgEk}A{EolAoFsjAkH_tA_Dku@kCwhAcBcy@oAs{@S{w@Sgh@Rce@nA{iBvB_tAf@gw@Sgh@g@cj@wBox@wB{c@sD{m@sD_g@gEka@cGsg@{Ek\\{Ec[{E_X_Nct@_Nos@_{@onEwG_]_X_tAgJgh@{EsX{Ew[cGsb@cGwe@{Egh@{Ece@_Dkf@kC_b@cBoZwBwj@{@_]wBstA?cy@Ron@bBo}@jC{r@fEwy@fEkp@bGgr@jMgfArNccA~u@osEfh@oaDni@ofDrI{m@rIct@~Ck\\zE_g@nFos@vB_b@bB{^jCsq@nAcj@f@sb@R_b@?sq@Ska@g@c`@{@_l@cB_b@cBoi@kCsb@kCka@gEcj@oFcj@wGgm@gEoZsIon@sIoi@oKwj@_Iw`@kMsl@gOco@_Nod@kM{c@_IoUsI_XcQwe@gJwVkHwQ_]cy@co@_yAkk@stAka@s`Asl@{uAkk@_tAcQgc@sSgm@oP_g@sN{h@sScy@cLkf@sIgc@sNgw@{J_l@cQg|@kRo}@oP{r@_Ssv@kRsq@oZ_eA_hBwfG_X_`AoZknAsSc~@gTgfAkWcwAcLgr@cLku@cGce@gJct@sIku@wLgpAwG_v@gJstAgE_q@cBk\\wBwj@wB_l@cBwj@oAkk@cBkdAkCcqDkCwqD_DwqD{EsnDcB{fAsI_bE_DwmA_IohCgJohC_SgwE_IwkBwBkf@gEgfA_Do}@cBgm@wB_q@sDg_BS{TwBchAoAchAcBcuBSce@ScfBg@stAoA{iB{@ku@{@_v@oFomC_DgfAkCkdA{EknAoFcrAsIgiB{OcxCgT{~DsIg_BkCkp@sDgw@kHwkB_Dkz@cBgm@gE{zAsDk}A_Ds~AkCs~AcB_yAoAgzAg@gzASsyA?wbNRoqF?soFg@crAg@oi@g@ce@wB_jAkC{aAwBsv@gEgkAkCsq@kHwrA_IgpAwBs]{JcrAcGco@cGos@wBwQwVw_CwQwwAwQwrAw[g}BsXwpBkW_hB{O{kA{Tg_BwGoi@wGsl@kHct@_Ig|@cGox@gE_v@{Esv@_Dct@wBsl@oAkf@wBseAcB_tASs`ARgpAz@_eAz@_v@vBgw@vBsq@fE{aAnFwrAjH{_B~z@wxRzE{fAfE_{@zJk{BjHcfBvVo{Fz@k\\jCw~@jCwy@bBgpAbB_oAR_oA?wxC{@_oAcBoqAwGsiDgE{dBkHopDcLkiF_IsxD_I{yDkHkmDg@{YgEwfB_DkbB{@{c@_D_wBoAsjAg@wy@{@{zASgvC?obARovAvBcxCR{c@~CwpBzEw}CbBgr@vBgr@bQ_yFvBwt@bBgw@z@oP~CsoAbB_jAnAknARwmASod@S{w@{@kz@oAo}@kCs{@sD_eAcLcgD_DoeBoAsoA?shBz@gw@z@wy@vBwcAfE_jArDobArD_q@bGc~@rNshB~McfBnF{w@nF_eA~Cct@~Ccy@rDwwAz@kf@z@sl@z@cmARg_BcBwhUwB_bTg@skHg@_oA{@cmAcBgiBoAkiAoA{r@wBkxA{J_oFsI_`F{@kf@sD{iBgJk~HSwcAwBo_E?{~D?ckBbB_zCjCsiDnAwcAnAwy@vBovAf@sXbBseAvBccAvBk_AjH{qCjCcmAnAkp@bBco@~CcwAvBox@bBwo@bBwt@jC{fAvBseAjC{fAbBk_AvB_hBnA{iBRgbCSoqAoAgnB{@_eAcGs_DsDcmAsDogA{EcmAwGkxAcLwdCwG_oAcG{pAgOo|CwBsb@oA{T_N_pCcG_oAsDcy@gEct@_Dos@kCoi@{E_v@kHgaAwGsv@kHct@gJg|@_Isq@_SwwA{O{aAgJgh@wQs`Ak\\o`B{Ts`AgOkk@kMwe@wVwy@k\\ogAcVwt@knAsiD{Tsl@{r@gnBsXku@_Ssl@cQgh@kR{m@gTwt@cQgm@oUs{@sSkz@_XkiAwVgkAkMkp@cLsl@oKsl@cLct@{OccA{OwmA_Igm@{_Bk{LgTcaBkCgTsNkdA_nDcbXoPgpAwt@ksF_So{Ag@kCkHwj@gkAs}IcBkM_Ion@cVojB_Igm@kR{uA_NkdAgO{kAsNchAcQgzAwQcaBwGos@cGsq@gJseAoKguAgJoqAcLgiBcGchA{EchAcG{_BgEknA{@c[{EgnBSgTcB_tAoAsoAoAkeCS_sI{@ofN?gxBg@skMSgm@S{mESgnB?wVSgdB?ct@?g|@Rs{@R{r@f@on@f@c[z@gm@bBsq@bBgr@bBwo@jC{r@nF{uA~Csl@jCcj@vG{fAnFkdAnFw~@fE_v@~Cgr@vB{r@nA{r@z@os@?_q@?kp@{@stAcBwy@cB{c@cBgc@_Dgr@cGw~@oFwt@wGos@sIku@gJwt@sS{_BsNogAsNgfAcGce@oFsb@{E_]_DwVgE_]c[w_CsXcuBgm@kuEguAsjK{OsoAwLw~@gJos@sI{r@oF{m@oF{r@cG_`AwBwe@kCox@cBwt@{@_q@Ss{@Rc~@bB_jAnAkf@bBce@~Cco@~Csg@jC{c@fEce@vBkW~Cc[rIku@jHcj@bVojB~RovArXwuB~p@whFnZwpB~\\sfCrNobAvLccAbQc|AnFsg@nFcj@nKsjAfJwmAfE_l@jHwmAvG{kAbG{zAjHw_CfEoyBbBw|Az@kuERkxFnActOf@kdFSstAg@s{@oAwt@cBku@cB_l@oAk\\_Dco@sDos@wG{|@gEce@cG_q@cG_l@{Jkz@{Jku@{Jwo@{Jgm@sNsv@sNku@cV{fAwQku@g^_tAk\\gkAktCgpKkWccA{Jgc@cLsg@wG{^cGw`@cGgc@oF{c@{Eod@gE_l@_Dwo@wBcj@{@wj@Sct@?g^bB{|@rDs`ArDkk@zEwj@vGwy@~Csb@bBo_@jC_g@~Ccy@bBkf@nAwj@f@_b@f@o_@R_]R_l@S{m@{@_jA{@co@oAod@oAsb@cB_b@cBo_@cBoZkC_g@{Esq@gEce@gEwe@{J{fA_NstAcQ_hBw[khD{JgfAoFos@_Dce@kCon@wB{r@oAco@{@ox@Ron@z@ct@nAgm@bBkk@vB{h@jCsb@fEgm@jH{r@rI{w@vLkz@bLgw@~Hwj@nFkf@bGsl@zEcj@nFco@zE_v@rDwy@bBgh@bB{h@z@co@f@_q@Rcj@g@wt@{@sq@oAoi@cBgh@cBcj@sD_l@gOwzB{OwzB{Esq@oFwt@{TgvCgJ_tAsD_l@cG{w@{JcwAsI_jAkHk_AgEo_@sDo_@{J_{@_Isl@wGod@wG{c@wGka@oKcj@gJoi@wGka@gEc[sDc[wB{TwB_b@oAo_@Sk\\Rs]f@oZbB{^vB_]rDg^fEk\\jH_b@fJo_@bLw`@rNsb@fYsq@rXsq@~Mk\\vLgYfJkWfJsXbL{^bL_b@rIg^fOwt@nF_]zE{^nFgc@fEsb@vGg|@bBw[z@{^z@wo@?_l@Scj@{@g^kCco@gEwcA{Ec|AoAsg@{@c`@g@s]S_Xg@sg@SchARobAz@{aAbBkdAf@{OjColAnAwe@nAc`@vBwj@fEsq@fEwo@fEkf@vBcVrDg^vGwj@~Hwo@zJwo@fOw~@fOku@fT{aAbLgc@zJc`@vVs{@bQ{h@nPkf@~H{TvVkp@~Mw[rNk\\~a@s{@jWoi@v[_l@vQoZ~Wgc@fzA_aCb[_g@jiAgiBzpAsrB~cIwnMr`Aw|Af_GgmJrXce@rXwe@jRw[vQ_]zTw`@v[{m@ju@gzAvt@g_BfY_q@nZ{r@nZku@fYct@ns@ooBzc@crAb`@soAzOoi@fOkf@zYgfAfJg^fYsjArXkiAz^scBrN{r@vLkp@rSogAjW_~A~Ms{@~Mw~@nPoqAfOgpArNwrAzJkiAfE{c@~Csb@jHgaAvG{aAjCsg@~C{h@vGsyAvB_l@vB_l@jCkdA~C_yAf@sl@z@on@vBouDz@ogAf@{w@R_l@bB_kCR{^jCkaEf@wcARkRnA_aCRkbBSkbBoAo`BcB{zAkCksAwBgfAkHggCgEwcAsDo}@gE_{@oKsrBgYsoF{JsmBwB{c@gEgaAwBku@{@wo@g@_v@Ssv@f@ox@z@{m@z@g^z@{^vBkk@jCgm@vBw[nAwVzE_q@bG_q@jH_q@rIku@~RkxAvQgpA~Mc~@vVcfBzr@_`FfTo{AnPseAfOwhAfTg_BfOccAb`@wnCrNk_Af^wiCvQ{pArNccA~MogAnKgaArDka@fEsb@fJolAjH_jAjH{zAjCkz@bBkp@bB{fAf@cVRcVf@ksA?ohC?c[S{mE?cy@?s]R{r@f@gh@RcQz@oZz@c`@vB{m@nAk\\nAoZjCw`@~Ccj@jHc~@jHku@rIct@bG{m@rDc`@~Ckf@vBsb@bBkf@f@sq@?{^g@on@wB{r@{Ewt@sDsg@gEg^kHoi@oKgm@wLgm@gTccAkRs`AgE_X_Isl@_Isv@_Do_@_Dce@kCsq@kCcy@{@_~A_DckBwBgfA_Dk_AsNgeDgO{lCwBo_@kHwmA_IgpA{Eox@wLswBcBcVwBc`@kCgh@oA_]oAc`@g@_]R{Y?oUnAkf@nAg^nA{YvBo_@jCw[bGgh@~Hwj@jHka@nFgY~Mgm@zJg^jMw`@zJsXfJkW~Rce@jW{h@zOoZrN{TfpAcpBj}AggCzh@cy@fY{c@v`@on@fr@{fA~\\oi@rl@_`Af^_l@r~AsfCvfB{qCfaAk}Ab`@gm@vt@gkAfOcVni@_{@b`@on@j\\wj@~p@cmAbo@cmAzm@{pAb[{r@fh@cmA~W_q@jgBsgEv`@w~@be@_eAbwA{`Dja@s{@~HcQ~u@caBfr@gzAbt@_~AvmAglCnd@_`Afm@knAfc@{|@nA_DjMkWfc@wy@jk@_jAzh@{aAfdBg`Dni@wcAzw@{zAfkAoyBv~@_hBrIcQjf@_`Arg@obAn_@_v@nrCgzFzc@o}@rb@_{@fT{c@jRo_@f^wt@bo@crAb`@ku@fT_b@jp@wmA~gBcbDjdAshBfm@kdAjRk\\j\\kk@jWod@z^os@vLsXzTwj@vLoZvLg^n_@oqA~Moi@nPwy@fJsg@nK{r@rIos@~C_]fEon@rDgm@jCs{@z@ka@f@w`@?_hBRsrV?kHf@{b\\?w`@RsoFR_cBRwwAz@{iBfJ__NjCcbDf@ccAz@{aARo_@vB_iDRwVfEolFvLwaQrIksK?ox@?_l@oAcy@oAsg@cBsb@_Dgr@kCc`@_D_b@kC_]{Esb@sIos@kH{h@kHce@sIce@sNgr@{J{c@{Jsb@ox@goDcG_X{Owt@wL{r@sNwy@_Nk_AsIsq@wL{kAkHcy@kH_eAkHcwA{E_hB{@ovAS{gC?oZSwkBg@ct@wBos@gEccAsD{r@{Ewj@{Eoi@gJgw@kHcj@cGsb@_Isb@{Jcj@sNkp@wV_eAgTos@c[w~@sNo_@kRkf@cVwj@cVsg@od@gaAsq@_yAc`@{w@oi@{fAon@{pAc[sq@kp@cwA_g@wcA_]wt@gh@ogAo_@sv@gh@{fAsv@g_Bkk@chA_q@{pAgm@sjAgr@{pAobAojBo}@_cBwy@c|Ag^sq@od@wy@c`@ct@ka@gw@sXsg@{Tc`@gYgh@sg@wy@{^wj@kp@gaAgh@sq@c`@kf@kf@sl@{Yg^_l@sq@cy@k_A{w@c~@g|@wcAchAoqA_l@kp@c`@{c@{^od@_]{c@c[ce@c[_g@kWod@wVsg@oUwe@oKcVwG{OsSgh@_Nka@sNsb@wQsl@kMce@cLce@kMgm@oKcj@kHw`@wQ{aAgJ_g@oZgdB_hB{wJkRk_AcLwj@_N{h@gOcj@{Ogh@cQ{h@{O{c@wQce@wQka@wVcj@w`@gw@c[cj@g^wj@sXsb@g^we@{Yw`@wV_]gT_]sSk\\gTo_@sSka@gOk\\gO{^gOka@kM{^oP{h@cLka@sI{^cLgh@gJkf@kM{w@sb@{lCsIkk@{Jgh@oKce@_N{h@{EcQoPwe@gTsl@{JcVgJsSsNgYkMwVkMsSoP_XcLoPwLwQ_SkW_NoPwo@sq@{r@sv@g^o_@_bE{mEo_@{c@oZ_b@oUs]gTg^cQ_]_So_@kMgY_Ssg@{Ton@_]_jA_XksAgT{pAsIkz@kHgfAoPgaFcV{qH_SkbGoFk}Ag@k_AzEseArNccA~WobAzr@caBju@kgBn_@cwArSkdAnPwmAzJcfB~CkdAg@gYg@kp@sDo}@gJchAkR_tA{YcrA_Ssv@w`@_`A{Ywo@chAgdBo}@wrAkp@seA_]_v@gYsoAgJg|@kC_eA~CsjAbe@swGzaAg{Mvj@{{Hv[ctEzEgw@zYwtE~H_jAzr@g|Ov[keHjHovAvL_oA~\\g}BrXkiA~\\gkAj}A{wEvVku@~z@skCfTsq@fOgw@zJs`AbBoi@f@{^g@w`@g@cVwBw[gEco@kCs]gOwuBku@s{Jku@_~KkMwrA_X{_B_NseAgTksAsb@{sBgiBkvGcmA_lEox@w}Cg{Ck}KogF_fRs_DwaLos@omCs]_yAod@ojBgh@{xB{Tku@{^k_A_]wo@g|@gzAcfBwsC{^kp@_q@ogAsv@cwA{sBsxDcmAk{B{sB{tDcQg^sS_b@{^obAoZkdAgTgpAkMccAwGgh@wBwQw[spCsXk{BsIwo@sIox@gJox@c`@gjDofDc~YsIogAoFgkAoAc~@Ro}@bB{aAbGooBvLojB~z@gmOrDseAvBg|@R_oAcBguAwGgkAcLwrAsNkiAsSkiAgTgaA_l@cpBotBgxGsSwy@gO{r@oKcj@oPwhAoFkf@kHo}@wGcmAwVohHkMsiD{EkdAsIsjAwL_eAcVkxAcVgfAc[_jA{r@giBscB{cE{gCwkGgh@oqAw`@whAoP_g@k\\ogAos@{bCcuBskHgdBs~FsoAkkEoeBwaGgO_g@_`AkcD_zCchKwcA{jDg^_eAku@kqB_]_`A{c@soAwt@k{B_]wmAc`@wwAcVobA_X{kAc[gzA_]{nBka@wnCwVwfB_jAcgIs~A_~KoPwmA{OknA{Ekk@{Ect@kCg|@{@{|@R_yAjCgzFfE_pM~C{}GrIcoTnAcoEz@_wB~CgbHbLcz[Rgc@rDweJf@sl@vBox@rD_oArIcaBbe@coJfaA{vRjCce@vBgm@f@kz@g@oi@kCku@sDwj@sDc`@oFgc@kHod@_Non@w[{kAwgDstKcV{|@wQwy@sNgw@cLco@sI{m@{Eod@_I_v@kH_eAsDwt@cBgh@{@{T{@_eASkf@bBguAbBcy@~Csl@~C_l@v`@svErDkf@vB_]bBoi@f@g^?ce@g@w`@oA_b@sDsq@_Dk\\kH_q@ggCsrQ_I{m@kH_v@kCka@kCoi@oA{c@g@sg@Rwo@nAcy@vBgh@fEgr@~Hkz@bLgw@jMsq@~H{^vL_g@fOgh@rpCg{HzOka@fh@gzAnPcj@bLo_@~WkdAjMkk@~Hsb@~Msv@jHsg@rIco@~H{r@bGkp@nFw~@fEo}@rD_jARwy@SgkA{@wo@wBsv@{EogAcLsyAod@o}E{fAckLgJ_eA_Is{@wBgc@cB_l@{@soAjCs`ArDwj@fE_g@nF{c@rNkz@zT{|@nPwj@rb@gfArg@{fAbzBs{EjgBc{DvQ_b@fOka@fOwe@zO{m@jR_eAzJsv@nFgr@~Ckp@f@c`@f@ka@?_b@cL{tDkC{aA{TciHwVg`I?wo@f@{YjCs]bG{h@~H_b@~Mgc@bQ_g@zOc[r]ce@ryAc|Ave@_g@b`@_l@ja@ox@rXgaAzOseArDgm@z@cy@wLkrDwB{m@gJocCw[gwJ{@{|@bBgaAzEksAvGg|@~Hkz@bL{w@jR{fAvQox@nvAkxFbmA_`Ffc@kgBvmA_eFvV_eA~a@_|Brg@{tD~C_Xvo@whFn}@koHr]g{CbLwaBfEsoAbGkaEzT_|Lb`@cvSvBcrAnPw}CbQkeCf|@cxMzfAgfPfTcqDfEoqAnAgpA?wy@sIcpLvGg_BjCkWrDsXfOwy@ns@glCjk@{}Bf^c_CzT_rBvQ_zCfEgbCoAwkBsIc~E{EwiC_IokD_SsoKsXktM{JscGwLkgGwG{hEg@_tArDsyAvG_`AnK{fAvLs`ArS{fAnK{h@bG{TrNkf@~Mcj@zTct@zJ{Yrq@w_Cb[{kAnPgw@zJc~@rD{m@nA_XRk\\ScQg@_oASw[g@sl@wGg{CoF_nD_DglC{@{dBgEcsCgEo}ESk}Af@c`@vBgfArDwt@~Hs`AnUckBzO_eAvQgpAjHgh@r]kjC~W_mBbQknAfY_|BzO_jA~C_XzEgh@nKkdAjCod@bLwaBrDwe@fJksAbV_xDbGsv@bBgYnKwfBvGs{@nFsq@zOwiCnAoPfJwhAjMczBbLcfB~Ccj@nPgbCbGkp@~Hsl@fEo_@~CcQfEwV~CwQve@kqBbQ{m@fc@{kA~\\gw@b[ct@vpB{hEzEoKjCoF~u@gsBrS{r@~a@_cB~M{r@bQkz@f@_Dj\\wnCjMwaBbVc}CrSkjCfOsmBb[weEjf@otGbVkcDrX_iDnUspCnAwVzJ{_BnKwwAf@wGjHwt@zJ_l@zJcj@jHo_@~WobAzE{OrDkMzc@cmA~dAowCbLw[jRsg@fw@_rB~W_v@blDosJjsAgtD~u@otBjM_]~CgJrcB_{E~}A{hEr`A{lCbLk\\rIwVb`@{aA~_AkoCrS{h@fEcLf|@_aCvj@caBzTwo@rIsXzYchAfOsv@zJwo@nP_jAjHc~@jC_g@vBg^nA_l@z@_{@RomC{@o~Gg@{r@Sce@ScoESg`Df@chA?_S?sNnAco@rDg|@vBgc@vQgdBzOs`A~CcQnKwe@fEgT~Mgm@v`@waBb[{kArl@keCzvCkeMb[gpAbj@{xBfEgTnP{r@fTk_AfOwj@b`@_cBv[ksAjHw`@bL{w@vLwy@vGgm@bBsSbBoP~MwfBvBkk@rDolAnA_]f@wkBoAsjAwBs`AgEkdA{JkxAsDo_@cQgzAs]c_CcLwhAsXwuBwBsSoAkRwBcV_DgaA?ox@~CgaAjC_b@zE_b@rIsl@nKgh@nPco@fOka@vBoFrNg^vVgc@rX{c@f^ce@rS{Tbt@sq@fh@{h@rg@{c@zc@_b@v[c[vhAccAnx@os@rN_N~H_IrtAgpAjMkMrq@_q@zYkWjWwVrDsDnUkWbVwVzTsX~k@ku@fYg^vG{JjMwQv~@stAnAwB~z@ovArXgc@bfBgqCvfBgqCrrBoaDf_BciCzc@ct@brAsrBjaEooG~\\_l@jk@cy@rX_b@jWw`@be@_{@zuAczB~yC{wEzh@_{@b[od@~M_Sr]kk@j\\{h@jMsSn_@gh@bQsSnPkR~RkRrNkMjRsNvy@{h@~a@gTbo@oUvj@cQbQgErIwBnZ{Ejf@cGzpAoFnd@kCv[cBjk@_DzkAsIfw@wGbt@sDf^sD~\\kH~\\{JzT_InPoFfOgJjWsNvQcQjRcQbGoFjRsSz^gm@zJ_SfO_]f^w~@zw@_wBby@czBroAgjDf^s`AzOce@ve@oqAn_@ccAn_@ct@bQgYfOsSbV_]~\\_]nZc[jM{JffAwy@nUoPrb@w[vGgEvuBcaBfc@k\\fh@w`@~WkRvL_Ibe@s]r]_Xzc@k\\raCojBzaAos@bsCgxBrjAo}@vrA_`Afc@w[jeCgnBzEsDfT{Orl@ce@faAku@~HcGf^gTjWkRn`BwmAbBoA??jf@w[fEkCrXoPbe@gTnd@cQbe@{O~C{@v}C_{@vjJohCfbCkp@nZgJ~a@{TnUsNv[wVzc@ce@fToZnUgc@f@{@rNoZ~HwVzJg^bLce@rNsv@be@wsCfJ_l@zYkgBfh@{vC~CwQb`@k`CjRobArS{r@r]_jAfTkk@j\\sv@bQ_b@ffA_kCroA__Dj\\{|@bQon@vLod@vQku@fOox@bLs{@zT_cBrD_]zTsmBzT{nBvGsg@jf@gcEfTkgBz^oxEzJggC~C{}B_DksFkHs`FcGoxE_D{lC_I_jF{E_}DoFctE{Es}D_Do{A_DokD?kk@nAgpAjHouD~HknAfJkxAz^goDve@wxC~fEorRvyEgwTrmBg~I~\\klBrScwAr]g`Db`@{cEzJogAb`@kpEnZoaDjp@oyGzr@{qHrXk|DbGw~@nF_v@fOweEnFsfCvLwoJrIwmFrIwrAfTgzAn_@_tAjf@soA~p@{fA~_AwhAjyCs_DvaBojBn}@_jAnd@{|@rScj@ja@wwAjWwrAv[scBnZooB~qBgsLjp@c{Dzc@o~Bb~@ouDvLka@nlA{jDby@ckBnd@g|@bcAcfB~lBwbDn`BgqCnlAgsB~p@{kAbVsg@v[gw@fOc`@jWox@fTcy@by@krDnlAgpFbj@{bCnPwo@jRon@rS{m@~\\ox@zYon@vpBsnDvpBsnDfkAotBn}@s~Af^wo@fxBsxDvQ{^zTkf@jRod@fpAcbDfzFkaOvo@{uAzm@whAby@{fAzm@ku@nn@_l@~_Awt@zaA_q@rN{JfdBsjAvpBo{Avj@on@n_@{c@z^_l@fT{c@~Ro_@ni@wwAvcAcoEfc@wpBbe@wwA~nAg`Dj{BgzF~Rgh@vmFclNnZ{aAv`@_yAbj@_aCvQ_`AnP{aAfOobAvLs`AjMknAzOckBzOglCvBgaArDoaDz@g{CbBgrEbBcqInFo{AvB_b@fEos@fTs|BfkA{aKbVwiCnKkqBfJk`CnFsbEvB{zFfTw|i@bGgoIRkqB_Ds~AsIc|AsNsoAcQccAsNsv@oPon@_]olAwGoUka@chAsXwo@ksAk`Cc~@wwAos@knA_g@obA{Twj@kWos@c`@{zAkW_~A_Ios@gJcrAg@gm@?{m@bBwkBfE_iD~HwmFjMo|H~WwtOnZgsQnFs_DrIobF~MkcD~R{}BbQwaBzc@sgEnPw|AvkBscQrXomCvVcdC~RkiAvVwhA~f@wkBrg@{pAnx@scBf{HwfLfkAoeBrv@kiAvjJwgNz}BwgDr_DoxE~lG{hJrSoZr]sb@vwAcuBju@ogAzTk\\zbCgoDns@olAfTk\\znB_uCfxBcbDvhA{_Bbe@co@zvC{yDf~SsxXfYka@R{@bVka@nUgc@jRgc@bQ{c@zO{c@be@{_BzbCo_J~jM_me@nAgEz@gE~aJws\\rS_v@v~@khDbrAs{EvLw`@nn@cnCvGwVRoArSccAbLku@nF{c@zEgh@rDkf@bGolAbB_eAf@kp@f@gr@z@{bC?_b@?{ErDo_Oz@kaEvB{iGf@gkA~CssIg@cfBnA{aF?_Df@gh@nA{h@f@sSjCsg@~Cgh@bLolAnKox@rSsjAbQsv@b[chAnrHwcUjiAgjDrrBgnGvQ_l@fT_`AvLco@bLwt@fJwy@zEgh@nFo}@vB{h@nAoi@bBwnCbGchKrDg}GRsyAS_yAwLkxPg@c~@Ssv@_Io~G?ox@gEkqG{@{sBg@we@g@_{@kC{yDSw[gE_mG?{aARoUf@_l@fE{nB~McxCzh@c|KnZ{iGni@_~KreAgmTvrAcqXrSceErIwrArNwfBrN{pAnUscBvGka@rDkWbL_q@~WkxAjdAguFju@sxDrwBscL~R_{@b`@waBvQsl@vVgw@j\\c~@ni@kxAjvBccFzcE{wJf{Hk{QbLkWnZsq@z^wt@~a@gr@vVo_@be@{m@~f@kk@ju@ct@bpGgdGbhAkdAz~DcvDfY_]bt@gkAfc@ox@r]sv@rq@_rBrb@swB~W{vCjRg}BvLovAby@{wJfOgnBzJo`B~HgzAzEgzA~HsaCrIgjDjRgqH~MolFfOwaGfEguArDo`BnFoyBfOolFzJw`EbG{sBbBsq@rD_l@fEkf@zJsg@rNgh@~Ms]bQ{^rSgYj\\od@zc@kk@f^{c@ni@{r@zTk\\fOgYvLs]vLo_@vL{h@~Hos@bGwy@rDkz@~MkoCrI{zAjHco@~Ho_@~H_]~Ms]vL_XbLgTfY_b@nZw[~R{OjW{Ov[gOb[cLv`@kHrg@oFn_@?rq@f@jtCjCja@{@rb@kCfm@sIrb@kMrb@gO~a@sSve@gYnUwQbV{Trl@_l@zm@kp@zsBwuBvo@kp@nZc[rtAguAjsA{uArg@{h@by@wy@~_As`Anx@kz@rl@kk@~u@gw@jk@gm@by@kz@b`@w`@~a@g^rXkRvo@k\\~z@{Y~p@gJnd@gEr]oAv`@?fc@bBrb@zEj\\zErg@jMzm@bVvlDjxAvj@nUzm@fTjk@bQns@jRfw@fOzh@rIzw@rI~p@bGbo@~CzpAbBnx@{@rXg@~u@sDvt@cGvo@kH~iA_Sj~Cwo@~mDgr@zqCoi@naDkp@n}@oPzvCwj@fmEg|@brFkdAnjGwmAbfB{^zaAkRbzBsNbhA{@ju@vBfzArIrkCnUbo@fE~sAbL~nAfJbkBvGjmD~Hb`Ez@joCRvwAf@b|AbGbrA~HvfBbVbhAzOr`ArSvwAr]z}Bbo@nd@bLbhAfYfdBrg@zsBrg@nrC~f@vQrDfr@rNzaArNfkArNrv@jHfw@fEzkAnFnhCvGrcBbG~lBzE~}A~HzkAjHrjAvLfzAvVf|@~Mbo@rN~gBrb@z}Bjk@njBnd@zYvGjxAr]nbAbQbiCnd@baBfObrAbLrhBfJvkBSbzGbGrdDjCriDnFfkA?rjAgEvcAsIzfAkR~_A_Xnx@w[b[cLbt@k\\r{@sg@~u@wj@ve@ka@~\\_]jp@gr@rjAgpAbaBkgBbQkRzTcVrq@ku@jk@co@rq@ct@fOsNzOgO~RoPjR{OnZ{TzYkRrS_NvQoKvQgJnUoKfToKnUgJ~WoKbQcGj\\oKjMsDvQ{EnZkHv[cGj}AwVb_Cg^b~@sNnoG{aAbcFgw@rg@_Ivt@cLrdI_oAbt@cLrXgE~Cg@~WgEv`@cGzm@{JnU_DjeCw`@jRsDjRoFnP{EzOcGnU{JzO_Ib[kRnPcLnPkMfOsNfOgObQ_SnPsSvLwQvLkRbGcLzJkRnKcVnKsXzE_NbGkRzE_SnFoUjHg^rIkk@nA{JbLox@zY{sBRcBvy@kbGvLcy@jCoPbG{YrD{OjH{Y~HwVrIwVzJ{TzJ{TfE_IzEsIjC{E~MgT~HwLrNkRfJcLfJ{JbiCkjCvQkRbj@wj@bj@{h@vmA{pAj_A_`ArDsDby@cy@bt@{r@ju@kp@rl@ce@~f@{^faA_q@rfCkbBnZgTzYoUjMcLbBcBf^k\\nU{TfTcVrI{J~H{JnZw`@rXw`@nPkWr|B{tDfcE_|G~a@gr@z|@_yAnUg^jMcQjMoP~M{ObQwQ~MkMnPsNrSsNfTgOnUkM~MwGnUoKrNcGbV_If^{JjWoFjWgEfOwBbj@{EbwAkHrq@sDzdB_Ibe@kCzr@gE~xFw[~nAkHrg@kCb|AgJnZcBr]wBbQ{@nn@sDfm@oFzm@wGjp@_Irb@wGvLcBvLwB~W{EzuAcVroAcVjW{EjhIguAnuDsq@zYoFv[cGzToFjMgEfTkHfJ{EvG_DvLcGjRwLbLkHvQ_NbQ{OfO{OrSwV~MwQjHoKzOgYzJsSrIgTfJwVbe@guAzE{OzJoZnZc~@rl@_hBvhA{eDrSkk@jWgw@fTsq@be@{uAbj@waBrIkWzO_g@fO_b@fOkf@vQoi@fO{c@zO_g@~M{^j\\sv@jMwVnKwQnPoZ~a@gm@rg@co@rb@gc@b`@g^rl@gc@bBcBvBoAvL_Iv~E_dDbo@ka@vt@cj@f|@sv@nd@sg@~f@on@~f@_v@fTs]zc@g|@rXwo@nPsb@fTwo@~Mg^fh@{dB~k@klBzYg|@~M_]vVgh@bQ_X~\\_g@~\\g^b[sXvQwLvQoKryA_`Avy@_l@rg@_]zzA{aA~WwQvLoKbGcGzE_DrDgEfJgJjMgOzJwL~HwLrI_N~MoUfJkRvGgOjHkRvGsSbG_Sz@_DjC{JzEsSvBcLvB_Nz@{EvBcQ~CgY~Cgc@z@w[f@wVf@wt@Rwe@vBweEf@gfARc[Rgc@z@cVz@cVnAoPf@kMz@oKbBgObB_NvG_b@vGk\\jHgYjHkWbLc[nFsNjHcQfOw[rNcVjWc`@ns@wcAfJsNjHkMrD_IjHoPvGoPzEsNjC{JnFsSnKgh@fc@weEjCw[~CoUfEgYrDsSjHw[bGsS~HkWnUwo@rDgJzEkM~CwGvGgObQs]bLgTbLkRvGoKzEcGzE{JfOcVnFsIvGcLnF_IvGcLbGwLbG_NzEcLbGcQzE_SjCkRjCkRvBgTz@oKf@wL?{ERcLg@c`@cBce@cBw[kCk\\gEw`@_XwsC_D_]oAcQ{@gO{@oPg@_NSsN?oASkW?w[R_Nf@k\\~Wc_HnUo`GrDgaA~HgnB~McqDnKk{BnAkf@f@wo@?wQSsXS{ToAkk@g@gOScGcBc`@oAwVwBsX{Ekk@kC_XgEc[oPoqA{r@obFwBsNsIkk@wo@ctESoA_DoUwB_ScBkWwBw[wBgh@g@sIg@c`@SgYR_XRgYf@_NRwGbGgkA~MokDjH_hBbBkk@fTwcFfEobAb`@wgIf@_SfJwzBR_NbBgaARcj@S_]{@kk@g@c[cBs]_b@_iIcQoaDwL{}BwcAo|Rgw@ceOod@{yIoZc|FoZ{zFoA_XsNglCs]czGoKgnBoU{mEsNcsCkCcj@gc@{eIgYc|F_Xs`FsD{r@kH_tAgEsv@oUkpE{^k`HkMwdCw`@wxHwBg^kHwwAk\\ooGgc@kmI_NkjCs]oyGoPoaDoPg`DgJckBsDos@_Dk_A{m@_aWwVg_Lsb@{dQkHkbBcGcy@cG{|@wQshB_S_tAkMkz@{Ok_Aw~@cjEoi@c_CorC{lM{YgpA{w@wlDsXgzAcL{r@{^_uC{TgqCwLg`DgYw|PcG{mEsIc|FsDc_C_DsfCwBk{BoFopDoUc{N{E_fC{TsbO_D{lCw[wjTsIc~EkC{gCRon^?{|@?gkP?g{CRw_H?clDoAk`H?wLcLcmP{@{aA{EkjHg@obAwGkcI{@_yAwB_iDkH{mJkCkuEsDw~Ef@cpBvBs~AbGshBbLgnBzOshBzh@gfF~_Ao_Jb[gvCja@kwDjf@oxEj\\c}CfJ_tAzJ_~ArDwhAjC_jAz@soAf@saC?k}Kf@srBnFkdFvLg_LjCoyBjHwpGrDwuGjCgjNbBcuBbGs_IvGc{IRoPzOczLz@oaDsDglCgJczBw`@skH{r@k{L_N_fCsDsv@gEgm@oFkdA{Eg|@_IwwA_IsoAoK{iBwGgpA_Nk`C{w@cjOgT_iD{Jw}CwBs~A?_mBrSsrVjRgmTfEstFSsl@cBwt@{OswBwVoyB_l@ktColAwqD{{HstUklBgzFcuB{nG_aC_fH{r@wuBcLka@gJ_]gEcQwGoZoFwVoF_X_Isg@cGod@cG_b@gJcrAwBoZcBw`@{@oZg@wVS{YoAsnIg@gcESg_B?ciCg@csCSknAoAktHSk~CS{dBRw}C{@guAScwASkcDSocCSw|AS_eA?wcAoAg~NSknAg@c`@g@k\\g@kf@oFgqCsD_aC_I{rEkHwvDwGkwDkHkrDcBo}@oAolASw`@?g^f@ooBbB{wJRwaBbBgiB?wzBRckBf@glCf@seARc_CjCggH~C_pWRw[zEkwNz@o_Jz@{wEz@klGS_v@oAco@oAon@kC{c@sDsg@{Ewj@{E{c@oFw`@oK_l@wV{kA_{@{cEoUwcA_g@w_Csv@kmD{qCgvMo_@shB{kAguFwo@gbCgw@w_Cox@otBwrFooL_N_]cL{Y{Jc[wQco@_IsXcLsg@oF{TkHw`@wGw`@cVo`Bo`BwmKwGwj@oPseA{Jwo@kW_hB{OwcAg^saCsaCobPw`Es}XksA{yIgO_jAcGoi@{TohCoFcrAsIomCwBsuCvBkyHvG_{OrNwu`@rDgrJrDwiHoAw}CkHotBoKooBkMgdBk\\oaDgsBokSoZc}Cce@wtEwLkgBsIcfBgr@{oNoPsrBkRg_Bco@gjDka@kbBo_@wmAgc@cmA{m@w|Akf@knAsaMke\\oi@kxAon@kgBsb@kxAka@kgBg^s|BkbBksKwG{c@s~AsoKgfAkjHojBsfM_g@sfC{m@saCo}@gqCkdAglCsjAgbCsjAcpBsjAkgBkdKceOc[od@{@oAsmLovP{dGw{I{aA_~AoqAw_CsyAszC{kA{qC_{@w_Cw~@ktCct@{lC_q@omCsg@orC{c@wnCwe@clDwQgdBcLkxAsNskC_NgvCwGo|C_NkiK{Oo}JgEwlDoFoaD{@wcAoFw~E{Jk~CoPspCkWk~C_]skCk\\otB_b@{}Bsg@{}B_v@wsC_|Bg{Hwj@cuB{Oku@c`@cpBoZcuBwV_wB_]wqDkM_yAos@g`IgY{bCgh@wxCon@ktCwj@ooBgeDwpL{_B{pF_N{h@{c@g_Bkk@ciCg^gxBcVo~Bsq@s}IwhAkrNswBcoY_]sdD{YswBs]wkB{^wfBwe@ojBct@koComCc~J{yDsxNgm@sfCg^otB{c@g{C{_BkuOsXkvB_]kvBo_@cpB{r@{jDsvJoee@cj@omC_cBg`I{sGoj[c~EcrU_nDw|P_sDckQsaH{q\\g^_wB{^w}CwQcuB_S{jDs{@cpQsjAcrU_NgnB{TscBce@s|B{zAg|EwgDguKkhD{uKwvDwzLg`DkdKgaAw}CwjEwgN{r@gbCo}@kmDgr@_uC{zFkiUon@w_C_q@kqBgr@kgB{aAkvB_jAgxB{~DkyHstKgoS_bJ{_QkyCcwF{c@kz@gcEwgI{m@_jA_aCgmEku@g_Bsq@o`B{T{m@s{@sfCc`@gzAcVobA_l@wsCgc@kcDcQ_cBwGsv@sDco@gEos@sDgw@sIsrBSgJsD{|@?gEg^kfJ{^ouIcB{m@gEwdCSsiDRwe@bB_}DjCo_JbB_bErDwmAjHksAj\\csCv~@ooG~M{aA~z@gdGzkA_iI~k@w`EbQgxBzEsmBRgiBoFojBoP{nBsXcuBoi@g}Bgh@{uA{^g|@cV_g@{pAg}BwsCsqEoyBgoDg_GkpJg`DogFkfEwzGwhAooBwcAotB{tD{qHwfBclD{w@s~AcrAglCklBkwD{w@syA_rQkuYco@{fAcvN_tUsdDoqFgw@ovA_v@gzAku@gdBkp@_hBgr@gxB_l@k{B{jDgrOowC{gMc}CofNcbD{tN{aKsed@cmAknFgjDgrO_I{^kbGkbVcQos@wdCo}Jgm@saCcdCwyJwGgYg}BslJ{lCwrKgvC_rL{sBokIkz@khDwG_XwmAc~Eod@gsBw[wfBgY{iBoUgxB_S{bCsIgnBsDsq@oFwgDsDcnCsI_xIwGgxGSsDkC{bCScL{@guA_IwnHcBkdA_Xo`VkHgnGkRksPwBgvCsSsdScGckBcLovAwQgzAgY_~Aw[knAgc@stAccAwiCoaDcqIkfJ_mVggCg}G{kAk~Ckk@caB{Osl@g^o`BkRobAoP_~A_IwwAcBku@cBkz@nPkiKvj@wu[~z@ktf@z@w`@~p@kea@f@g^zYkfOf@_g@jHguFbB{dG?_]~Cgba@R_]RwmFg@wgDf@wfBRg|@z@goDbBoaDrDofInFcnRjCc~E_No{Aod@{xBoAcGwGc[_dDctOkf@o~BknAojGon@g`DcG_Xk`CgdLczB{pKsq@g`DsI_b@{T{kAklBsbJw~@onE_cB_iI{aA_{EkMgm@co@g`DkWgpAw~@kpE_l@spCcQgm@cVku@{^gr@sq@soA_Xsl@oPce@oF{T{J{c@sD_XsDgc@{@kf@f@c`@fEos@zEs]jCgJbG_XzJgc@vrAs{EvGc[rg@gnBnZkdAnn@wuBvj@{nBrb@g_BbVcy@zc@kbBnPco@fOwj@bmAghEjbBg_G~k@{xBvGwVve@kbBziBotGnKo_@vrAcyEn_@ksAnUw~@fOcy@rIkp@~HgaAnAgh@f@o_@SoZ{@{^kCg^_D_b@sIox@oFsg@{Ecj@oAoZoAce@_DsyAgO{iGcBs`AwG{jDcBsl@wQwgIgEsrB?chAbGknAzkAotLfYkoCja@o_Ev`@_xD~Hox@z^cvDrIcfBbBw~@?siDRwmP?oqFoAk{L?{}Q?{tSSc~@f@{oDg@wkB?{zAg@_tAR{c@RsIf@sNvBoPf@kCf@gER{EjCsSnAoK~CkRzEcV~Rct@vLkf@jHoZbGg^rDw[nAkWvBwo@jC_{@jCsg@jCwe@~HkWvB{EbBkCjCcBrDoAjCg@jC?rD?~CbBvBbBvBvB~CrDvBnFnAvGf@vG?jHg@jHoAnFoAzEgErDsDjC{EnAsDS{JwBsNgEkC_D{JcLgJwGod@{h@wV_X{OgOsDgEgO{OgJgJ_DkCsScQ{OgJ_SgJcVcGkRsDc`@{EzEsv@zEksAg@{sBvBkp@vBsl@jMwo@nKg{CjRc~E~MouDbB{h@~Cwt@f@gEnFwy@rIgsBbGo{AbBc`@nAstAfE_jA~Cs]jRgkAbBo_@wBc`@sIobAkC{Y{@w`@nAc[vBcj@rIscBzJgnB~HklB?sDRsD~M{qCnKswB?sDRsDf^s_If@sIzY_rGvBgh@zEwcAbQ_lEfEcj@bBsNrDkHjCwBnPgErNbB~p@bGnd@zE~Hz@vB{EnAgEvBoPz@cQbBsX~Csb@~C_X~Hka@jHc[b[k_ArNsg@rI_b@nF{c@rD_g@zEgkA~Cgc@fEc`@fJoi@zEw[nFs]rDs]bBk\\zJwjEfEgzARwj@g@s]{Esb@gEcV_DcQsIka@sDoZgEkp@cVslEoFcy@kCoUkCsSsDwVkHsb@{Oo}@kHwe@_Nk_AgEgc@wB_b@g@_]RgkAbBw{D?_Dz@c_CRc`@z@klBnAcmArD_l@vGc`@f@{ErNsl@~W_`A~Ho_@jHka@rDgc@nAwo@z@cxCRsoAnAgyDz@gfAvB{fAvLsdDnFwwAz@_XjRkkEjC_{@bBkz@z@_l@Rk\\fEghEz@gfAz@_jA{@on@wB{m@_Dwj@sI_eAgT_kCkR{xBsb@{aF_I{aAwGo}@gTskCgOgiB{TomCgJs`AkHsl@sNgr@wQgh@{T{c@gYsb@wt@{|@kdAwhA_l@co@od@sg@{m@sq@{|@k_A_g@{m@kWgYku@s{@_{@obAka@oi@od@ct@wGoKod@_{@o_@g|@cj@o{AoyBkyH{Y{fA_rBggHoPgh@wmA_qEclDocMgJc[gbC_nIco@gbC{w@ohCkxAsgE_~A{rEk~CkaJsl@kgBc|AwjEwkBcrF_q@{iBgEkMgpAwvDcVct@oPce@wo@wkBseAw}C_wBwpGkRoi@_Xgr@oU_l@co@wkBwhAgeDw_Cs|GwVct@_wB_mGsDkMw~E_nN{|@w_C{pAoaDchAspCgc@gfAcy@wpBseAohCkRwe@gfF{bMchAwnCgpFwbNgzA__DwkBk|DckB{oDogAczB_tAomCs~As_DczBonE_tFgpKsiIovPcqIwlS{pAwsCgnG{hOkHgOcuGccP_Nw[{Tcj@o}EkqL{^gaAkRod@gcEslJgw@_mBwaBkaE_cBkwDw[gw@ohCcfGwoEwrKgJkRsjKgnVgTgm@ksKk{VwoEknK_`A{bCsq@oqAkeCghEsnNkkTgh@_{@os@seA{r@gfAosE{gHcQ_XcyJcjOcQgY_tA{sBoUg^k}Zcue@wtE_kH_jA_mBkdAsmB{}B_yF{JwV_|BooG_}I_rVkMka@skHsiSoaD{~Iwia@omiAcvD_jKk_AcsCwLo_@cLo_@{T{w@oi@k{Bc_CgzKczBovKouI_ib@ka@wpBszCcxM_l@gnBcy@ohCo~B{pFgzAkyCk|DgqH{_LsbT{xGsfMwlNw}WgfP{_[{Ok\\kbGo`LcwPgx[wo@{pAgeI{mOcwFw~J__DchFkrDoeGsrBclDc~@_hBon@cmAghE_nIgcJ{sQ_jFkiKsuCgzFwhFwcKckB_xDkdAw|Akz@o}@{kAk_A_l@g^_v@{c@wwAce@sv@oU{gHobAkbBc[saCcj@smGkxAoeGwrAojG{uAcpBkf@_g@cLo{FcrAs]wGk~Cct@s`AoU{jSosEox@_SwtEwcAs~FksAg|@_S_eA{c@sl@gc@oi@sl@_g@ox@{Toi@sNce@_DwQoUkxA_DsXgw@{uF{E{^giBgoNssDg~X_g@kqBksKwh_@o|C{uKglC_}Igh@ooBsSkz@crA{xGsvEsyUwcAo`GgvH_t_@w_M_tn@{oDcuQw[gzAciHcj^sv@kaEox@kpEg^ojB_tAkvGcdC_aMkwDowR{|EooVcj@{}B_g@giBswBspHshLoy`@{hEodO{gCk|IgpAg|EcfG_}X_tA_~Fsq@c}CshB_iIweE{lR{h@_aCotBonJkzEoiTcoEkpT_eAknFs{@grE{`Dw~OosEscVgxBwfLs_I_ua@gT{fAkiAsoFooB{lHw`@_tAw_HshVwGoUka@oqAkRon@wQsl@gkAceEwfGsiXw~@{cEsNwo@_`AkfEgdGgeXcVgfAsI{c@gE_XkHkf@oK{|@kf@whFcBoPoAsNoAsNsb@onEw[cgDoeB{xQ{pAc}M_g@_eFkf@seFgEwe@{uA{tNkCcV{TcdCg{Cwk[oF{w@sDg|@oAgw@gOsmo@kCodEg@oaDwBspC_DwmA{JoqAcQovAgc@gbCsb@_tAspH_{TgvCgwJwdC_xIw_M{~b@{aF_hQwtEsePoeBooGk_AgmE{pFkjWkbGk|X{xBseKwpBsqJglC_fM_pC{vM_v@ssDklBk|Icy@k~CkiAkcDomCsrGgwEstKonJctTsq@kbBolAwqDce@ojBc[kxAsXcwAoZklBo}@cvI{dBgsQ{zAsqOw~@ctJckBskRgpA_zMcmAk`MgOscBo_@{`Dg}B_nN{h@sdDgnB_wLonEokXs{@gkFoqAcgIovFge]o~B_}N{r@slEgaA_`FwwAwrF{yIo~[clDciMssDwgNw~@opDce@wuBcQ_eA{kA{gM_]{eD{^gcEkMo}@{TcmAwe@shBgsB_pHgrEccPoi@{}Bo_@{xBs]keC_v@c~Jkk@cbIwQciCwdCk`\\kCka@od@{sGkR_aCc[csC_g@cdCwt@szCwiC{fKsg@saC_b@c_Cwe@_dDkf@kwD_l@gcEwj@{cEo~BcwPoqA{hJ_eAgqHo}@otG{c@ofD{OgfAgO{_B{E{kAwBkyC~M_xDbGoqA~p@krNnUobFzw@woOfm@kyMvt@gwOjMkdFzEc~EoFwyEwQc~EwcA{{Msv@osJ_b@{aF_tA{nQwGwy@kC{Ygw@kfJsIswB{@spCnlAcl]nFcgD_DovAcGwmAgYw}CwpB{sLkxAk|Ik}AkfJ{aAscGox@_vE_q@gcEovAgjI{m@{lCw~@sfCwmAglCoeBw`EgaKwhUgmEo}JooGkwN_xNoh\\goDgeI_dDspHgaK_jUcrAc}Co}@{sBka@knAkWwhAgTs`AoZ{bCcL_cBoFcuBfEgoDngAcyh@rb@spRfYs_NbBsrB{EkvGwBotG?wpBS_jFcB{nBsI_hBo_@ofDoZglCkMkqBkCcfBbBcsCjMgxBzYg}Bnn@wxCz{CsqOfYw|AbLw~@fEgfA{EgkAoZsuC{h@ogFwGolAz@swBvGwiC~HwpBrXsmBfuA_bEve@cpBbLogArDcrAnAolAwBg^oAsN_g@ojGcLcnCkC{lC~CwfG_DkjCgOkvBgTwfBwe@wdC_cBsfHc[{uAsSguAgJgzAoAo`BzOofI{E{pAwLsjA{OgaAoPon@sIoU{O_b@{JsX{sBw{Ds~AoaD_v@k}Awo@k}A{c@{uAkz@_nDsb@k}Asg@gzAseAkvB{zA{gCsg@crAk\\gdBkMcwAoAobA?cV?o_@f@whFg@sfC_DsbO_Do{UbB_rB~H{dBzTcpBbj@geDzpAkyHrNcmAzEk_Az@c`@_DskCocCcdWo`BsePkiA_cLwB{lCfYcnCf^guAzmEs_Nn}@ktCv`@w|AzTg_BrSsmBb`@{bHbcAoaSjqBgi`@rDwaBcGsuCkMgzAoZgnBsNwt@ku@o~BcvDk|IkrDwqIcj@crAwo@kvB{c@keCwQ_wBcG{gC{^svYoKkcDkRcpB{YcpBct@khD_tAoxEcQwj@s{@{qCo{FwiRkRon@gc@_~AwGgT{m@wkB{r@kgB{JwVsl@{kAsb@_{@gyDcbI{wEsvJ_`FgaKg_BorC{zAcuBckG{eIwpBwiC{nBskCs{E{iG{dBg}Bos@{kAcj@olAcj@_yAcj@otBkWwrAgm@slEwQsv@wV_q@{c@k_Agw@whA_eAg|@sjA_q@{sBwmAobA_jAgh@_v@g^s`A{^wwAgc@k~Cc`@o`Bsg@{pAgm@k_AkdAgkAcfB_oAwmAsjA{fA{kA_eAwaB{sBk|DksA_aCo}@cmAobAogA{pAs`A{fA_q@_qEsmBg{C_yAgm@c`@o_@k\\w[gYsX_XgYsXos@_{@kz@ksAwt@syAw`@ccAw`@olAct@w}Cg^wmAgc@{kAseA_|Bct@sjA{|@kiAsv@ogAsl@k_As]sq@{aAkeCgc@_yAw[cfBciCs{Oo|CkcScLkk@wL_l@_I_XcGoUgOgh@k\\obA{|@cpB_~AwdCckBgbCwfBc_Ckk@s{@_q@{uA{m@waBcj@smBwcAwvD{~Do_Og`DcpL{T_eAoUcrAkMkz@sNwfBcG_cB{@gzAbBgzAfYwjEn}@g_Lni@_|Gb[ghEnK_mBbBobAf@wcARguA_SsdDwVkqBkf@oyB_tAweEwnCgqHk{BklGwkG_cQo_@{uAc[g_BsSoeBoKc|A{JotB_Dkf@_IovAoKcuBos@clNk\\ofD{^keCckBcgI{nBcxHgYchAsv@s|BcfB_qEc~@{bCwj@oeBce@c_C{OwzB{@oqFRosEvB_aHf@cbI_DwrAkMwdC{Yo|CoPgnBg^c`EgzAsoPs~Ac}RsNkuEcG_}DoK{aP?s]f@{m@fEklGRw~@?g^S{YSgYg@kW{@kW{@_XoAgYwBg^_Do_@kHgw@oK_eA_Igw@k\\g`DkCc[cBcV{@cQ{@_S{@_SScQ?_SR{ORwQf@cQz@_SbBkWbBgTvBgTjCkRvBoP~CoP~Mos@fuAcdHjxA{qHvVgpAzJod@bQo}@~Mco@nd@k`Cn_@klBvQwy@nP_{@rSgfAbL_l@bG_]nFs]bGgc@~CgYzE{c@rDc`@rD_g@bB_b@vBce@bB{c@z@sq@Rkp@S_]Ss]{@{^oAka@gE{|@oAcVoAwQgEgc@_Dc[cBoPcGgh@sN{fAsSg_Bs{@{}GwGce@cG_b@{EoZgEoU_Io_@cG_X_Ik\\wGwVwGgT{Jk\\{J{Y_l@{_Bos@gnBwVgr@wLg^{JoZ_Skp@klBoyGwQgm@kMw`@gO{c@sN_b@gOw`@kM_]oP_b@cy@{sBwy@{sBkH_S_IsSwG_S{E_S_DkMwBcL_DwQcBwLoAoKg@sIoA{T{@wVScV?sSf@oUz@gTnAgOvB{TjC_SfEoU~C_NnFsSzEgOzEsNnPwe@bQsg@zzAkfErSsl@vL_]jMsb@bLc`@~Hw[vGkW~Hw[brAo`Gbj@wdC~Hka@fEoU~C{TvBgTbBwQf@wLR_If@oF?kM?cQ?_NS{JSkM{@{OoAsNoAwLwBwQsDoU_DoPgEwQoFkR_IoU_N_]oZku@ceEwcK_kC_rGod@chAsN_b@c[w~@kMo_@_Ssg@cVgm@{m@{zAcsC_aHkiAgqC_cBodEoi@wrAs~A{yDsSsg@kMkW_N_XgOgYcVka@wQgYwVg^sXs]cQgTw`@{c@c`@{^{^w[c[oUoZgToZ_Sg^gT{Y{Oon@c[{O_IoqAkp@obFohCwy@sb@oZoPoZkRkWcQoUcQ_XgToU_S_XkWwV_XoUcVwo@{r@oxEchFo_@ka@wVwVgc@gc@od@ka@_yAsoAknAseA{bCcuBgvCsfCk\\sX_NwLkWcVoUcV{TwVkRoUgTsXcVs]sSc[_S_]cL_S_Xoi@gw@scBwfBkwDs`AkqBoqAgqCwLkWwQce@{O{c@wLg^_IwVwLce@_Ik\\kHc[{Jsg@kHce@wGod@sD{YgEw`@oFcj@_Dw[we@olFoPshBcLsoAwG{r@sNw|AgOscBcGsq@sS_|B{gC{lWgYchFsIwtEbBkfE~Ho|CzE_fCjH_mGrNk|Dja@{iB~p@k}Ab~@_hBzdG_wLrrBsgEzm@czBjWs~AfJ{_Bz@gJrI{nB~Mc}CnFkbB?{xBSkdAsDs`FS_g@cB_mBf@ohC{JgwJcBc_C_Is`FkHsgEsIgaF_IsdD{@cj@cBckBg@{sBnFsrBrNkbB~a@{}Bbe@ojBfTox@b[knArq@_pCja@cfBrSgiBvBgw@{@_{@gEcy@oF_v@cVstA{^knAw`@whA{pAofDw}CsdIkgBcyEcQod@ggCs|G{m@scBwlD{~I{Tkf@wj@_`Akp@wy@kz@ccA_l@kf@on@_b@k_A{h@{uAwj@whFgiB_}DkxAwhAwj@{|@co@gr@cj@kp@gr@_IgJc`@we@sg@on@_gEsmG{lCs}DgTk\\{xBoaDwuBo|CwfBwiCkdA_oAohCcdCwlDcbDo}@knAccAo~BogAwsCwV_l@wGcLgT_]sg@oi@_dDkyCce@w`@c~@wy@o}@kz@gr@sv@od@co@ktH{_LgbC{oDoUk\\gmE{sG{{CoxEwt@_cBoKc[oZogAcGkWgO_`AwL_{@gJ_`AoFg|@cV{hEgJwcAgJox@_Sg_BoF_b@oi@ssDoUkbBcQksAgJ{w@{E_l@oFwj@sIsjA_Dw`@_I{uAcBon@oAox@g@c`@cB{eDoFw`Eg@{c@sI_uHSkMSoi@_DsjAcBo_@oKoqAgTg_Bc[waBcVcrAgJod@cLsl@oUknAoP{|@{Okz@gTgm@sSgYwj@od@sv@s]cVgJo_@sNsN_Isg@_S{^sN{uA_l@ku@s]syA_`AwVwVcL{JkR{O{c@ka@kR{Tod@gh@{^kk@wVkf@sSkf@{O{h@{J{^gJgc@cBsI{Jox@_Dc`@gEcj@wBoZsXk|DoKkdAgEoZoK{c@gOce@_NgY{J_SoF{JoZgr@sDkMkCcQcB_Sg@wQf@_SjC{TrDkRrN_b@rN_XnPwQzJ{JzYgTb{DgbCbt@we@jk@s]ja@gTzOwG~McGrSkHnP{EfJcB~HkC~MkCv[{Ez^_Dnn@wG~a@{EvLcBjMgEzOoFfJsDfOwGzTwLzOoKv[cVnn@gh@zr@kk@zm@od@vVwQja@wVby@od@ni@c[zh@{Yvt@_b@ve@_XnU{OzOkMfTkRfJcLz^w`@nUg^nKwQfTsb@fJ{TnP{c@zJg^vGkWrIc`@zEk\\bGwo@z@_SvBgYz@kWf@c`@S{T{@sl@kCkk@oFon@_DwVgJkk@sD{TkHw[_D_NoUos@oFwQkC{Jwy@sfCc~@gqCcfBgkF_]gkAoUg|@sN_q@gEgYcBsS?_XnAgY~Hkf@bVgkA~Rcy@rNgh@rIoZvVgw@fT{r@~Rgr@rX{aAb`@stAvG{TfTco@vLk\\nKk\\b`@g|@rb@k_AfO{YjWkf@rhB{`Df_BwxCjz@gdBrl@cmAju@waBbj@knAfh@gpArS{m@fTct@nFsSbVwmAjH{h@rDsb@bGstAf@_l@cBoyBgEoqAkWc}Cod@wrFoi@caGcaBc_R{TkjCgYsnDsIgnBg@_jAz@cwAbGwrAzEgr@~f@_|GjRkeCnAkMvB{YnZ_nDbQ{bCzJczB~CobAvBco@~RskHzEwfBzOkuEfEckBvLkbGR_oA{@on@gEgkAgJ_oAgToeB_SolA{Y{pA{Tcy@k\\w~@c`@g|@kk@wmA_cBowCoyBonEw_C_gEcrAkeC_~AorCcV{c@{`DklGkmDcpGwpBwvDc~@cfBo_@ct@siDwpGkRg^_]sq@syAcnCk\\on@sS_g@ce@_jAwt@ciCoPg|@oU{uAgO{dB{E_{@gEgdBjCktCvB_yAvBklBzJs{E~HodEvGweEnKo{FnKo{F~M{lHz@we@zEggC~RshLfY{cOb[guPr]ohRS{pAwBwrAkMwuBgc@kcD{fAcdHwG_g@kHsb@ox@stFwcAwnHsl@woJ{OsiD{m@ohMod@_bJ{pFwwx@oi@g{Hsg@koHg`I_ziAct@cuLwBg|@bGccKbVclXzOkkTbL{~NbGocHrIc~JfOwnRbG{}GrD{wERg^nFg_GvBsjAbQctTf@oi@bGgjInPcnRjCwqDRs]nAo{AvB{gCgEspCg@cVsNo{Agw@w|F_mBofNwmAsxI_v@{zFc[swBoFs]sI{m@wGgh@we@geDwfGonc@gJ{|@kH_`A{E{pAoAgw@_DorHScy@_Is`PS_q@cGwgNgOs_]{@ojBrD_{@nKcdCfr@_iIzsBkrX~C_b@~iA_sN~MkvBb[w_C~Mku@zJod@nd@caBrwBkgGfaFcgNzwJc}WjoHsiSrb@waBrSwhArIcmArDooBsD_`KfJojBjRstAfiBcvIbkBonJbQ{_Bf@crAgEsoAsNo{AoUccAstAcoEopIggWgh@o~BwQ{iBgE{sBrD_hBzO_mBjHgh@nbAk~HbVo{A~f@_~Aja@kz@nyBw{Db[gr@vVs`ArSkdA~Hcy@~CckBoFguAkR_mBgzA{bMsqEc~^wo@chFo_@{yDo_@wjE_I_eAct@{mJg^wtE{YciCsDcVgJwo@gzAolKk_A{iGoKcrAoAcrArD{dBja@caL~z@_zWvBco@r]wyJ?whAoFs{@ct@ckGoPooB{@knA~CstAjHwy@jW{tDfEwe@v`@kkE~nAosOvGsq@bcAg_Ljk@s`Fbe@kjCfO{|@bLka@~_A_iDvjE__Nj\\gaAvnC_iIjiAw{Dbo@{vCvo@gcEvQ{uAnF_]fh@wlDfh@opDzJgc@vLc`@zOsb@nPs]nn@g|@b_CgxBviCgbCnmHkaJb|FcnH~a@gaArSgm@~Hc`@vGka@jHct@jC{m@f@{c@Ss{@Sg_BgEs_Nf@oi@bBw`@zE_g@zEk\\bGwVzOsl@~dAkyCz}Bo~GjW{|@j\\_yAzE{TrN_v@~Mo}@fOwmAfJkdAjHchAzJ{}BzJggCnF_tAvy@_dSjHoeBvL_uCbQ_{Ez@ckBoA_q@gEsoA_XwsC_v@oiE{E_SsNk_A{h@k~CwLwwA{E{sBzE{dB~Mw|Af^gzAvVos@~Rkf@zfAcfBrSkWrcBwkBzkFo`Gn~BsfCb|A_eAn{Akk@~dAoUjnAwLbrAsDz|EzObo@kCr{@oP~_Aod@by@oi@~_AwhAjhD{yDrl@c`@ngAsg@noBg|@~p@sg@fh@wt@v~@gnBfh@{pAnPct@v[g}BrSciCfYwqDvVwaBzr@_vEni@{lC~f@scBbcAgqCvhAkeCrqJ_iSz~DssIr]_eAjHc[nF{^fEod@vBc`@f@w[Ss]cBw`@sDw`@sDkWgJoi@_]ogAs]cj@o`BwpB{lCofDobAguAovA_aCwrAkoCkcD{lHgzKc|U{sBgrE_b@_v@gYw`@gw@wy@wy@_g@ku@{^os@sSsq@wLcrFoZox@kR{kA{^sv@gc@kiAox@_q@kz@s{@o{Aw`@_jAwe@cuB{lC{eNsgE_gTwqDcfQcG_]{m@ceEc[{oDc[kcI{c@khIwQsqEwBgh@_S_gE{JkcD{YshGcV_uCg^{{Csl@crFsXwjE_IsnDf@ocCjRsqJvVgnLzm@coYzOk~C~W{sBjk@{lCja@{sBzE_SjnAg_GrXwkBjMswBrDg_BkCgeDsSkgGwQgkFkHc`EkCogK_DciC?kiA{EkiK?{|E{E_gJbBooBrq@_jPrD{uA~C_fCf@wt@g@seAcBk{BoAo~B{JotGjCsrBv[krIrDcy@jRwoEzEwxCz@wnCgEgsBg@w[cQ_zCsD_q@kz@__N_N_dDwBcfBbBscBbGcvDvB{nBcB{nBsSojBco@geD{pAw_Hwo@{tDgY{`DwLwgIoFwbDwBgpAoA{r@wBsyA{E_{@sIwt@{Jcj@kMwe@cQgh@kWwj@w[we@ggCkmDsXod@_Xwj@cVsl@{Tsq@_S_v@cLox@cL{|@gEsoA?_jAjCg|@rI_`AbL{w@bvD_hQrv@ofDfc@ocCrNojB_IgyNcGgnBcGwo@{Okz@{kAs{EcVgfAoKk_AkCkz@bBsq@fEkp@rIkk@vV_`AzToi@b[ce@r]o_@zYkW~a@cVfdBsv@zh@cVfh@c[f^oZfsB_mBzc@_b@fuAogAvt@wj@rl@oi@~a@_g@f^cj@fY_l@~W_q@rSos@jMkp@vLc~@rDkp@vBkz@{@os@_D{aAoKc~@{Oo}@wL_g@gTgm@ox@{sB_oA_dDka@seA{^w~@_b@{fAc[k_A{Tsv@wQkz@cQ_{@_N{|@wG{m@gJchAcGgkAcB{|@g@{|@z@c~@vBs{@zO_aCvo@c{I~HseArDsq@z@wj@g@kf@sD{r@kHgh@oKsg@{O{c@kMc[{Ok\\oU_]_SoUwnCgqCwVw[kRoZ{Ok\\gOsb@{Js]gJ{h@{E_b@kCce@g@ce@bBsq@fEoi@nKo}@v[glC~R{_BnF_v@vBco@Rkp@oA_l@kHwfBgJkgBwBco@g@on@bBsv@rDgm@nFku@~Coi@f@{JvGc~@rI_tAbBce@?ce@{@{c@_Dgm@_Ic~@{OgnBg@oFkHs`AgEos@kC{kARs`AvBwy@~C_q@fJgfAzTsyAjR{|@rNcj@j\\{aAfOo_@b[gr@fm@chAfO{Obj@ct@~\\c`@b`@{^f^oZfpF_sDvcAsq@fnBwrAbqDw_CfrEg`Dvo@oi@fiBkqBfiGggHjk@sq@zc@{h@nx@k_Arl@sl@bo@od@b[oPjk@c[~iAk\\zkAoUz^oFfqCkf@fuAo_@j_As]b~@{c@jf@oZ~f@w[jWwQbV{Tj{BoyBbaGs~F~lBklBvt@cy@f|@{fA~u@_eAf^oi@fYod@zTka@fr@wrA~|IoeQ~k@ccAr~AokDv[co@v`@{w@b~@giBbt@_yAnZco@zYkp@ns@scBvcAciCrv@gdBn`BoaDb[oi@j\\{h@~z@crAr{@whAf^gc@f^ka@bcAwhAngAogA~~CowCjeComCroAwwAbrA_cBbhAgnBjk@chA~f@knA~f@ovAvVg|@bVo}@zTccAjRkdArXwpBfh@wrFrq@csHzw@gcJzh@caG~a@_gEnn@ohHrXcsC~\\ktCzfA{yIffAkwIzuAcaLrb@s|Bni@giBzh@ovAvpBogFfaAkvBrlJ_wQb~J_pR~|DgvHr~AszC~bBwxCjkJ{fPvVgc@rX_b@~|Dc_H~}AomCv|AgqCf|@shBfaAw_CfEoKf~D{rJfOc`@b`EsgJ~p@_~Aja@c~@ncCkbGbQ_b@be@_jAneBwvDv}CkoHfpAcxC~yCsyF~eCwjEfbCceEjdAgiBjRk\\z|@w|AnsEs_IbbDovFvuGoeL~xAglCzpAkvBb`E{bHnlFghJzO_XnZsl@zTgh@jRcj@nPwj@rSo}@zJon@bLs`AnFsv@jC_q@nA_`AvG_gJbBwkBz@sb@rDsg@nFsb@fJod@bLc`@vLk\\nyBgfF~dAkeCvcAcnCns@swBrwBstFfEcLzh@guAzc@knA~p@_hBnd@gkAfgCsaH~qBcvDvqD_nDvmAk_AjqB_rBfrE_lEbrF_wGr_DclDzfAo{Ajp@_v@ruC{eD~pEgkFrdD_eFrl@cmA~Wo}@~jCw}H~_AofDzT{w@~Rsq@ns@s|B~R{m@fzFgxQ~nAg~Drv@o|CvQ_l@j\\kdAzc@_yAbLsb@~Hw`@rIgc@fJsb@fE{YnK_jAjCgc@vBce@nAs]Rs]SsXf@wo@oAw~@{@gm@Sox@g@{c@g@_b@~Coi@~CwVrDwVzJ{^bLk\\baBg`D~p@{pArXoi@fO{Y~Mk\\zJ{YrIc[jHs]zEg^nFkf@vBo_@zEgkAbGkz@rIco@bQon@fJcVnK{T~Wka@bVkWrS{Oz|@ce@~f@cVvpBgaAb~@oi@vo@wj@rg@ox@bQc`@bL_b@bQk_AnZgoDzh@klGfYczBbVksArX_oAreAssDngAssDfOsq@rIwj@~C_l@bBgYoAsv@_IobAgOsq@cy@wxCwL_b@kz@w}Ck\\olAcQ{c@kR_b@gm@wcAgr@{w@kp@{r@on@os@o_@cj@_Sg^k\\s{@co@ksA_]ce@_b@o_@c[_Sk\\gOgc@cLce@{E_oAsIoUg@w`@gE{^sI{h@_Xod@g^cVsXwQgYsSgc@gO{c@{Jwj@{Ekk@cBon@Skp@S_`AcBcsWnAk}AbLogAvLkp@ni@suCrmBkaJzw@kwD~\\waBvaBg{Hv[{zArXcrAb[{zA~RgaArD_SjRsoArNolAfJolAbGwmAjHomC?ocCsNsuCkCka@{O_cB_]_aCgYsyAgYguAgEgO{w@omCcV{aA_DkMsD_Ng|@{oDsl@wzB_b@_mB{TgnB{OojBgE{aAkCccASoyB~CchAzEsjAzTglCvV_cBj\\{_BvLsg@zr@{bC~\\{w@vj@{kAfaAoeBrg@kp@rv@o}@vaBgzA~qBcfBjsA_oAnd@_l@v[gm@bV_q@fJoZrI{^bG{^jCkW~Csb@nAsg@g@w`@wBsg@kCgh@wL{|@sNwt@cQgm@wQwo@cmAg{CwfBweE_b@s`A{OgYwe@on@g^on@{Oc[cL{^wQon@{c@{iBoPco@kRce@{^o}@wQce@sNkf@oF_]_Dw[kC_b@_D_jA{E_jAsIsl@oKsl@c[scBcLogA{JccA_I_q@sIkk@sNgm@{Tgm@sX{r@cQod@_Nce@_Ngm@_Igh@oFgc@kCka@gJgsBgTchFkWkvG{JkdAgTohCgOw|A_v@kwDo_@klBsXc~@g^ct@g|@oeBcQ{h@oP{w@wGkdAoFs`A_Ict@sIon@sS_{@{T{r@ku@scB_yAk~CgzAomCgr@_tAwy@oeBsXs{@oP{w@oP{fAoZsrBcVg_BwG{h@_Dgr@z@stAvGszCzE_`A~Hku@fE{YzEgTjMce@bVgw@rl@{zAbQ{h@bL_l@jRolAbG_b@nZg}BjCcQzJkz@fE_q@z@sl@oAox@{Ew|A{@gr@f@ku@vGos@vQ{w@vVkp@b`@{h@b`@ka@rl@{^~bBwt@fh@w[ve@od@r]cj@nZct@rS_`A~H_`AnlAg_QjH{fAv[{rEbG_v@vGsl@vLsg@zTgm@~\\gm@j\\o_@~a@c[rv@sg@nZ{T~RkRbVk\\zTka@jR_g@~Mgm@~Hwj@~C_g@?kk@wBoi@{Ewj@_]geDoFsl@wB_b@{@_g@f@kf@jCkk@zEkf@~Hwj@vLkf@vQcj@~Wgr@vLoZnfDwvIfpAsdDr|B{_G~}Ao_Er_DoaIni@sjAjjCcrFrN_XnPs]f^gw@~nAspCzm@knArg@s{@vj@ct@j{Bo~B~u@{|@rb@sv@~a@kdAr]{kA~RccAfOcrAnFo`BkCo{AgJkgGsNgvH{JgdGsNkhI{JciHsSohMoAg|@{E{}B?stARchAjC{pAjHw|AjH_`AjRkgBnPgkA~\\klBrXseA~M_g@zm@cpBn_@{aAvuBwcFzuAsdDjWw~@rSs`AvLccAvj@cnHbrA{sQzJ{fArSguAvQsv@ns@kvBfh@gzAr]{pAbVcmAjH_g@vLksAbGknAz@{fAgEkxAcGobAoP{pA_SkdAsXgfAod@soA_uCwsHkqBwhF{kAo|CwlDs}Ig`D_nIod@olAwo@cfBsfCwzGs`Aw_Cw~@omCwaB_iIsSgzAcQshBoKcaBwGk}AsDkbB{@_~Af@kgBnFkqBfJ{sBfTciCfTwaBb`@ocC~R{aAnZcrAzJ{^bQon@zuA_bEjf@kxA~sAw{D~Mo_@brAozDvVwo@zEwLvBwGvV_v@r`AomCrXs{@jdA{hEbQo}@jWshB~R_|BvG_yA~Cw|Af@s~AwBw|AoFkbBcBce@gYciH{fAogZw`@gfKkWomHcBkf@cBcj@g@_l@?gm@bBwt@~HseAfJgw@vQobAvGs]rNsl@f^o`BrXsjAbL{m@rDoZfEsg@f@kf@SoZ_Dco@kH_q@oKsg@wL{^_g@_jAos@wmAgh@kdAkz@waBorCwdHgYsv@gaAohC_Ssg@kqBknFkdAcnCsb@olAkHwQ{rE{xL{m@ojBw`@cwAoZwcA_eAsxDod@shB{YwmA_b@w|AgT{w@sNoi@w`@{zAco@wsCc[{_BcVoqAod@csCshB_hL{YotBw~@wrFogAggHk_A{dG{@sD{h@{eDos@_lEoFk\\on@odEgE{Yw`@ocCwmAwxHku@c~E{w@ccFwo@kaEwt@svEcVs~Ace@_uCcV{_BoZoyBct@gpF{Ekf@we@wlD{m@wtEkf@okDcj@ceEwVklB_X_mBchA_nIsIsq@obAsuHsb@oaDgT{_B{w@k}FgpAwtJwL{w@{kAkrIsIgw@smBkwN{uA{fKcQsoAwcAwxHsIsl@w~@o~GkCgTwaBkeM_l@slEwL{|@_Isl@kqB{cOsIkp@we@kmDwGkf@{YczBcG{c@sg@_xDsS_~AgY_wBo`BgxLoF_b@ku@cwFgYs~AwLgh@wLkf@oUku@gOod@wQod@sfCkbGwV_l@whAciC_aCkxFgOg^{c@gfAkp@knAc[sg@gOgTsXo_@o_@_g@gc@{m@sS_]kW{c@{Tgc@s]s{@kWgr@gYk_AoZkdA{h@ggCsg@saCsl@ktCgOkp@o_@_tAsIkWc[g|@keCgzFknA{vC{w@{sB_b@obAccA_aCo_@gaA{O{h@_Non@gJco@oFkk@kCsq@oAwe@cBklB_DscBgE{r@wL{|@{Owy@sSwt@co@scBseAomCw`@_eA_]g|@cQ_l@oKco@{Ewo@g@od@z@od@vBka@bGgm@rD{YbB_N~C_XjCsSv[{gCbBkRbBwV?sl@kCkf@wGgh@gJsb@{EsX_v@oaDwG_X{Jc`@c[{pAsNod@{T_g@kRw[oUw[ka@we@sg@{h@sSkWwQgYcQk\\gOc[wLs]cL_]{Jk\\gY_eAw`@c|A{YsoAsNka@wQ_b@c[gh@g^{c@_]w[gOcLw`@k\\{|@wt@cj@ka@oZ_SoKcGwL{Es]{JsXsD_X{@kWf@c`@bB{fAnPoUvBgJz@_NnA_]nAw[oA_XsDsb@oKkW{JkWgOsSoPcVgT_SsXgT{c@oK{YoKsb@wG_XwGg^cL{m@_SwcAwVc|AsNgm@_N{h@wVsv@od@sjAwVce@o_@sl@_yA{xB{Ts]ku@cmAwy@gpAwQwVgTs]s~A{bC{tDs~FgjDcmFs{@cwAon@olAce@obA_Xon@w[{w@{Oce@gjDgfKkgB{pF{Jc[sDcLgfA_zCco@smBgm@wkB_g@wwAgYs{@sv@{}Bwt@{sBsS{w@sIoi@kCoU{@gTg@ka@f@{c@zEox@jWwiCjCkWv`@_{EnPs|B~MoyBjM{sBrIkp@nKsg@jMkf@b[gw@vLgYrtAoaDbG{OvVgm@~Wkp@j\\o}@bQ{w@rIsq@~Con@f@kf@wBco@gE{m@gJkk@wQgfAcQccAoPkz@s]srBsNs`AgJkk@{Eg^_Dsb@oAwVcBkk@?gc@z@ct@zEcy@vGsg@zTksArq@opDjRkdAnKsl@rScrA~MwcAvQwaBvGs{@~a@gfFja@kiFjp@okIjf@_hGns@cjJvLwpB~HsaCz@co@f@keCkC_kCwBo}@_Dwt@oKk`C{Ekk@_SsnDwGgpAkC_g@_Dsl@ox@c`OkM{tDkCsiDz@ovAjCccAbGwpBvGsjAvG{aAvQgdBrNsoAzTw|AzOc~@bV{pAfc@ojBn_@cwAf^olAnjBklGrXkdAfTg|@nZwwAnUoqAv`@spCnFsb@fEw`@jMsyAjH{|@fJ_rBzEwrA~C{nB?wkBnAssIf@wqDf@oeG?od@bBkeHzEsiDvG_rBvBgm@~Csv@rNsuCzJguAzOsrBfOscBfEce@bVcuBz^orCbVs~Azc@omC~WcwAf^cfBf^w|A~hDclNja@scBbe@oyBnZk}An_@s|BvVo{AnPsoArSw|AvVswB~RsrB~Cc`@f_BojQvVcsCbGos@ve@whFfE{h@~Cwe@~Cwj@jCsg@~Cox@jCs`AbBkdAf@o}@?ccAoAkxAkCkiAcBon@cLgsBgJobA{JckBknAg_Q_XodEwL_lEkH__DsI__DcG_yAcGsv@cGon@{J_`AsIos@gYg_B_Ig^gr@omC_aC_iIkeHwkV{Jk\\caV{}y@o}EoqPkz@_zCgm@ocCsX{pAsXguA{^cuBgqC{pPkcDgvR_iDgjSkgBknKcy@s{EcLkp@wrAgeI_q@ofD_oAgrEkiA_pCovAgvCwkBktCkdA{sBsg@c~@on@otBod@gzAcxCslJgxBswGk\\_eAc|As`F{qCgtIoqAozD_`A_fCk}AsxD_fCoqFwQ{^gaA_mBoqAc_Cg~DohHokNw_W_Xwe@syA{lC{sBcvDcQk\\{JsSwG{OwGsSkHsXgEwQkCgOkCsNcGsXwGo_@_D_SwGka@gEwQcGcVgEkMwLw[gJ{TgJ_SwLsScLcQgJkMgOwQ{O{OsSoPg^wVgh@s]{T{OkRsNwQwQ{JcLwL{O_NgTgY_g@_lE__I{m@chAw~@waBwhA{sB{Ycj@cdC_{E_yAwsC_]sl@g^co@oi@g|@ka@kp@{^{h@cy@wmA{m@kz@g^ce@wj@{r@{r@g|@co@_v@gc@_g@ce@gh@c~@_`AgkA_jAgzAkxA_oAknA{nBwkBwwAcwAspCglCsoFgkF_jA_jAgpAknAo_@{^c_Cc_Co~B_|Bwy@kz@kzE{wEcj@kk@sg@cj@od@gh@{c@{h@ka@sg@we@{m@cj@sv@sg@os@o_@_l@_l@w~@{^co@wj@{aAsl@sjAoZgm@_]wt@oU{h@k\\_v@sXsq@{^_`AkRoi@wVgr@gTwo@kW_{@oZkdAoFsS{Tox@cQsq@cVwcAkRs{@kRc~@cV{pAoPk_AgTksA_N{|@oKku@cQwrA{Jc~@gJccAw~@sgJ_I_{@oKwcA{Y{vC_D{YgYwsCsSwfBkW_mBcVk}AoU{uAoPk_AkMgr@wGk\\cVwmAwVchAcVkdAcVobAc[cmAsS_v@{^soAcQ_l@_]seA{c@ksAsX_v@gh@ovAs]s{@c[sv@_]cy@gJsScj@wmAka@kz@{h@gfAco@cmA_rB_xDgnBcqD_cGcaLokDotGgjDgsGccF{mJoU_b@oZgm@stFsjKcsCcmFouIgfPwoJgsQwQk\\{}BwjEseAkqB{Ywj@wVgh@w`@kz@{Ykp@w[_v@kWco@oZ{w@kWgr@gYkz@sXwy@{Osg@wQon@_Sos@sXkdAsNwj@wLgh@_S{|@kHs]{Ocy@oPg|@cQwcA{O{aAgOccAoKox@_I{r@_Ict@gJkz@sIkdA_IccA{Jo{AsDcj@sNw_CcGw~@ka@otG_Dsg@{h@gyIwj@k|Ik_AgmOg@gJg|@wqNkCg^c[obF_XcjEco@ogKcGc~@cG{|@{J{kAsNcfBgw@wtJcG_v@oK_eAkH_l@{Jox@kMkz@gTsoAcL{m@wQs{@gJc`@sNcj@_]{uAobAw{DkvBcqIsg@srBcy@_dDw~EwsR{Jgc@gqMghh@shB_kHgOgm@wL{c@sSkz@w`@g_Bs{@gjD{m@ocCcpBcbIkqBoaI{_BsrG_hG{nVsq@koCkwDwjOgh@cuB_q@skCsq@wnC{aAk|DwcAsbEguAksFwL{c@cQgm@c[obAw[w~@c`@kdAgO{^{c@kdAkiAwiC_jAkjCcnCgiGorCgsGkhD_zH{{H{nQk{B{fFoUcj@sSkf@oPw`@oPgc@oUgm@{Ygw@{Ys{@kWwt@wbDsqJcbDgmJsoAouDg|@{gCwVku@k\\c~@o_@wcA{Tkk@c~@oyBg^gw@_Xsl@ce@gaAwy@waB{h@ccAgw@kxAgnL{mTw{IsjPk`HomMkMoU_Xkk@_S_b@sSod@_Xkp@c[cy@od@{pAsxDksKkeCcdHkjCkoH{w@oyBg^k_A_g@{kAcVsg@gh@kdA_bJcuQgaA{nBgcE{jI_cBofDsl@cmA_q@kxA{iBweEcgD_uH_dDspHwdCwwF_Nc[{JcV_]ox@{Y_v@ka@chA{Ycy@od@_tA{Y{|@{YgaAk\\whAc`@_yAsSox@o_@_~AcQ_v@k\\k}AwjEgySwvDswQgsBo}Jc`@klB{Oox@wQkdAkRkiA{TwwA_I{h@gJsq@_NseAcLccAoK{aAoK_eAgJgfAoF_q@cGku@wBoZgEos@_IcrAsD_v@_Dct@gEkdAcBwo@_DolAwBc~@wBcrA_b@gwTc[ksP{@_`AwB_eAwG_iDoAon@cBwo@oA_g@cBgh@wBwj@cBc`@_Dco@{E_{@gEsq@gEgm@kHo}@wGku@wGct@cGsl@cL{aAcG{h@oKsv@oKku@oFw`@_Ns{@kRgfAkRs`AwLon@{Jce@sIc`@wG_]_N_l@{YwmAg^ksA{Okk@o_@{pAw`@soAgc@gpAcVsq@oPsb@kf@knAcj@crAgh@kiA_q@stA_l@whAwo@sjAku@{pA_eAcaBwt@_eA{w@ogAcy@kdA_eA_oAoi@sl@wy@g|@cj@cj@s`Ac~@s{@{w@{}GckGkmDwbDwuBsmB{sB_mBkRcQsuM{xL{`D{vCcwAgpAgTsSgToUsXw[wVg^kRoZcQoZcQs]oPc`@oP_b@oKk\\kMod@gJ_b@oKoi@kHod@oFce@sDwe@_Dwe@cB_g@g@ka@Sc`@f@gc@z@c`@vBw`@rDgm@f^gaFfJstAjWgoDfw@gzKfE{r@~Ccj@z@o_@z@kf@f@o_@?c`@S{c@g@c[oA_l@cB_]{@{T_Dod@gEce@_D_]wG{h@oFo_@oFs]kHo_@kHo_@cGkWsIs]gJk\\sIoZkMo_@_Nc`@cL_XcQ_b@kWwj@scGswLkiAg}BccA_rBod@k_Aw`@g|@{h@soA{dBgcEc[{r@kf@seAoZsl@oZ_l@g^on@oi@kz@g|@_tAk}Fc`JccA_~A{m@k_A_Xw`@kR{Y{Yce@_l@g|@sb@sl@_SkWka@gh@{T_Xoi@gm@gh@_l@k}FgsGod@gh@_NgOg{HkwIkW{YcVsX{OgTcLoPgJoPkHgO{J{TsI{ToFcQoFwQ{E{TgE_SgEsXwBwQ{E{c@oZkyCkz@ofI{^krD{Eka@oF{c@cGgc@wGw`@sIce@kHw[cGwVkHgY{E_SoFgT_N_b@kM_]sNo_@gOg^{Twe@wGsN{O{YkW{c@g`DovFwcAgiBcQsXgiBoaDoFwL_b@wt@oPsXwcA_hBsyAohCcuGckLwuB_sD{{CkiF{_B{qC{gC_qEwQoZoUka@wpBkcDwhAgiB{Tg^we@sv@kWwe@_Sc`@sXgm@_Xwj@o~B{aFguAowC{c@o}@_g@w~@wj@s`A_~AwiCo_@kp@ooBkcDka@kp@wjEohHct@wmAkiAojBckB__D{w@oqAkmD_~FkWka@oP_Xkf@{|@wj@seA_l@olAwQc`@{w@shBw[{w@kW_q@o_@seA{^gfAc[obAsg@cfBw`@c|AkMgh@wQsv@sSgaA_N_q@cQ{|@wQobAw`@gxBchAcfGcy@{mEgc@gbCkiAgiGcGc[_Iw`@_Io_@kHw[wLoi@_Noi@_Nwe@sN{h@wLc`@cQoi@sS_l@oPod@kRkf@_Sce@sXwo@kRw`@gTod@w[on@w[wj@kW{c@_Xgc@kWw`@kk@wy@co@kz@{fAwwAogAcwAc~@cmA{w@gfAwmA{_BwmA{_B_`AsoA{fAcwAsoAwaBstAshB{h@sq@kWk\\_l@{w@_`A_oA_X{^k\\kf@cQ_Xc[{h@{Tka@kWkf@_Ssb@oUgh@{O{^gJcVwLc[kMg^_N_b@_N_b@sNgh@sNoi@cLkf@_N_l@gJkf@gJsg@{J_l@sIgm@cGod@oFgh@gEsb@gEsg@sDsg@sDwj@wBgh@wB_q@cB_l@Scj@g@os@Rwe@Rg^f@kk@nAsb@nA{h@vBsg@vBcj@~HojBnAc[bQgcEnAc[z@g^z@ce@z@gc@Rwo@?gm@g@sg@g@s]{@_g@cBgh@wB{h@cBg^sDgm@gEkk@{E_g@kCoZcGkf@gEw[kCsSkHsg@cGg^gJgh@{Jwe@oK_g@wL_g@kMwe@sIc[sNce@cQcj@w[c~@sX{r@oyBksFkRkf@wV{m@cmA{{Cox@_rBwt@ckBgm@c|AwpB{aF_g@gpAkWco@oKwV_Ska@_NsXsXkf@sNwVoU_]_N_SoZc`@cQsSc[s]oU{T{TgTwVsSc[wV_SsNwo@sb@kf@c[_v@_g@cV{Ok\\oUwQgOsScQgO_NkRwQwQwQoPkR{TwVsS_XwV_]{OoUcQsXoPc[sNkWkMwVwL_X{JoUcLsXcGoPwLw[saHskRskCskHwnC{qH{}G_fRkW{r@sb@whAc`@k_Awj@wrA{^ox@gc@k_A_{@{dB{w@o`Bw`@gw@cLoUsN{YgfAwpBscBkhD_q@guAoPs]cQc`@gJoUs]wy@c`@w~@wVsl@o}@_aC_{@{}Bon@kbBw[o}@on@ojBwo@_mB_IkWsb@gpA{@cBoAgEwG_Sw`@_jAc~@cnCgr@srBoKc[kCwGwQ{h@sXwy@{EkMwG_Sw[s`AkHsSsIkW_Xgw@wQsg@oPkf@{Ykz@oUos@cQwe@k{BoyG{Ood@gTsq@oqAsxD{m@oeBcQoi@sSgm@g|@ciCoPsg@gO_b@kWku@ku@k{BsIwVkMka@_IwVwo@shBsI_X{Jk\\kgB_jFgTon@s]k_AkWon@{Os]od@c~@wQs]oU_g@_NcVsNsScy@guA{OsX{pAoyB_Xkf@{Ow[sNs]{O_b@oKoZwLoi@kHcVwQkp@cLka@gc@{_Bw`@wmAsI_]cGgTcLod@{YolAwQwt@sXwcAoP{m@sS{r@kWc~@cLce@cGcVsI{c@oFw[g@wBsN{fAkHwo@g@kHsIkdAg@_NoAsXoA_b@oAgh@Sc[So_@R{T?oFnAce@nAw`@rD_q@nF_`AfEcy@vBoZvBod@~Cgr@z@cj@f@on@Rkp@RoaDRkbBf@cj@f@cQbBkz@fE{aAnAsg@vGoeBbGwwAz@cQjC_b@f@gOzE{fAvB_l@nAkf@vGw|A~Csq@nAsX~Cw~@zE{fA~Cgw@nA{h@f@w`@?cj@?sX{@cj@{@gc@{@wQoAwQ{Eoi@gEwe@oFgm@_Ion@oF{^cLco@kHg^oFs]oFoU{E_Sc`@_jAkR{m@cQgm@_b@stAoAgEoF{O{zAw~E{J_]sSsq@oKo_@gOsb@{kA{cEoUkp@cLg^sNod@_l@smB_N{c@wQgm@kM{^oA{Eg^chAkMod@_l@gsBgfAclDkxAwyEco@cuBoUwt@w[k_A{^o}@g^sv@gJsSsDkHwVgc@gh@s{@gTw[gEcGc[sb@o_@we@c`@od@ogAknAgh@kk@{h@gm@wmAguAsb@_g@{Y{^cLgOgJ_Nc[od@sSw[gT{^_Xkf@gE_IoZ{m@wLgYoP{^c[cy@oUsq@wLw`@gO{h@wL{c@oF{T_X_eAo_@w|A{T_{@{Owj@wLka@cQsg@_Xwt@oZwt@wVoi@w`@sv@c`@{r@gc@_q@ce@_q@w[w`@o_@we@{Y{Y_fC_kCct@gw@s]ka@_l@ct@ce@co@ka@gm@sb@kp@kWsb@wQw[oi@{aAc~@ckBwy@gdBon@gpAkWoi@kpEkfJwQs]{Tgc@g^_q@{c@{w@{w@ksAgaAgzAsXsb@ka@sq@cQgYoF_Iw`@{m@g}BgoD_Xsb@ccAscBcj@{aAoFgJkWwe@{Y_l@s]sq@_Xwj@oZwo@_oAwnCka@s{@oZwo@gEgJkgBozDk_AsrBc[{r@_N_]oKoZ_I{TsIsXsIgYsSgw@_Ig^kHg^cG_]kCoP{@{EsI{r@g@kCwBkMwBkRgE_b@g@sIoA{OwGolAwBc`@cBkW_Io{AwBc`@kHovAwBsb@cBc[{J{dBgEcy@_IcwAoF_jAwQsdDsIg_BcGobAsD_g@sDg^{E_b@kC_S{Es]_DoPwBsNcGw[gJ_b@gJw`@wGwVsSct@wQon@sS{r@cLgc@kHsXwGc[wB{JcBsI_DgOwGo_@oFg^{Es]cGkk@_Dk\\kC{^wBc`@_D{m@SwGSoFg@_Sg@sb@SgTS_]RkWRw`@f@_Sz@w[bB_b@bBkf@zEovAz@gOrDseAz@sb@RoP?{JRku@SsX{@ce@cBkk@oAgYcBw[wBw[cB_SoF_l@_D{YwGwe@_I_g@oF{YcGgY{EoU{EgT_Nsg@wGcV_Nsb@kMo_@_No_@oKoUcGoPkMwVkW{h@csC_eFwL_S_v@kxAcGoK{JcQwGkMcVgh@g^cy@_b@obAoZwy@kH{TcGgOgOce@cQ_l@oAsD{O_l@{c@kbBstAkiF_D_NoZolAwG_XsIc[sNsg@kR{r@cGcVgEsNcGwVwGgYoAcG{E{OcBsDsScy@_I_]cLgc@oFcQkMce@cQco@oF{T{EkRgE_SsNkf@oP{m@gJ{^cBoFcBcGsIs]sDgOgm@_|B{h@srBcLka@kM_b@gO{c@gT_l@w[cy@_Ssb@cGkMoK{TgJ_Ss]on@kHkMcVo_@wVc`@wVs]kW_]_]ka@sXw[oKwLsq@ku@gYc[gYc[sS{TkHgJgJgJkHsIsIgJkH_I{^ka@{^o_@sIsIkk@gh@c[kWgc@w[oK_Iwe@c[gr@ka@gh@_Xs]oPcL{EcVwLsXgOwQcLsXcQ{YcVsNwLkHkHwQcQsIgJgTwV{O_S{OoU{JsN{JoPwGcLoUgc@{Os]oK_Xsg@stAw[{|@_`A{gCsXos@kW{m@wQsb@sXkk@w[wo@_NwV_NkWc`@_q@{^gm@ce@os@gc@gm@gdB_aCcL{OwQwVgToZoeBgbCc`@wj@{Tk\\{OsX_I_NsNgYkRka@wQgc@sNsb@_N_b@gJk\\gJo_@kW{kAc[_yA{YstAcdCgdL_XsoAcy@cvD{nBkaJwGc[kdAs{EgnBg~IwQox@w`@_cBc}CkyMw~@{~DgYcmAcBwGgEoPcV_eAsX{kAcV_eAwGc[wQk_AsN{w@kM{w@{Jgr@oAoKwGwj@_I_q@wGos@kCc[wGw~@kCo_@wB_]cBka@wBce@oAg^oAgc@g@_]sIonEsN{eIwBseAkHsxDwB{fA_]wdRsDk_AoAwe@oAgc@oFoqAwBg^sDgh@sDwj@gJ{aAcGsl@w[{qCkf@k|D{Ew`@ce@cjEkM_eAoKccAkR{_BwG{h@sDwVoFo_@gEkWgO{|@kM_q@kMon@{Okp@{@sDsNkk@{|@g`D_jAceEwLce@oKod@cLoi@kHc`@_Iod@wGsb@wGce@_Ikp@gEka@wQczBkCg^_XsdDsN{iBgYcqDoAgOwBwV_NgdB{@oK{@sIkHk_AgEce@oFcj@cG_g@{E_b@_Iwj@kHsg@wGc`@{Jwj@_D_NwGgYsD_N{EoPwGgT_I{T_IgT_D_IsDgJ{O{^wGgOwGsNgm@stAgTkf@oKkW_Ng^cQ{h@sI_XwGoUoA{E{Jc`@_Ik\\gJwe@kHka@{E{Y_D{TcGsb@wGgr@oKgkAgEgh@sb@gfFsDce@gEce@kf@g_GsDce@wBg^kCkf@{@{Y{@kWg@oUSc`@?{Y?cVRgc@z@o_@nAgc@bBg^vBw`@fEsg@rD{^fJox@fJwo@nFgYfJ_g@fE_SfJ{^vG_XzT_v@fJ{YzJs]fEgOrDgOjCwLrD_SzEoZvBcQ?g@jCwVbBoZbBka@RcQRkWSwQg@wVoA{YwBgYkCsXkC{TgEgYsDcQkH_]_I_]cLod@_Nwe@sNwe@kMc`@kRoi@{Oka@gTgh@cQ{^gT{c@oPw[kC{EkC{EcQc[wV_b@_S{Y{Y_b@sNkRoZw`@gTsXwQgToU_XcL_No`BgnB_Xw[sSwVcVsXk\\_b@gJkMsDgEgTkWcrAs~Akk@_q@_g@{m@wVw[_b@sl@cwAswBwsC_lEs]cj@wQw[wVgc@{^sq@{T{c@chA{}BcLsXsN_XoFoKwGgOgOs]_IsSgJsXcLc`@_Ic[kHc[_Iw`@{Ec[wBgOsDc[{E_g@wBk\\cBk\\{@k\\g@{^S{^?g@z@onEz@{|@f@gh@bB_v@jCgr@jCsq@nFccArN_mB~MgdBvGwy@vQs|BzYopDrIgaAvVcnCfJgaAvGwt@jWwnC~HwcAnA{TvB{c@nAsb@z@sb@?{ERseA{@_v@{EccA_I{kAwLk_AoA{J_DgTcLco@cGgYoK{c@kWw~@sIgYwQ_g@oKsXkM{Y{E{JgEgJkRc`@{JcQ_Sg^gJoPs{@w|A_NkWcLwVgJsS{JsXoFwQkHwVwGsXsDwQgEoU_DcV_D{YwBgTgEcy@{@gh@kCk_FkH_pMoAcbDcBoaDSk_AR{w@f@os@bB{aAz@oZz@kRrDgfAjCcj@jHgfAnFgw@zEgh@bBgOjRczBvBgTvV_uC~Hw~@fEgr@z@_]z@{^?s]?k\\{@w[{@k\\wBg^kC{^sDo_@gEo_@_Isl@ce@ouDkWwuB{E{^oFc[oF_XcBkH_I_]cLw`@_IoUsIoUoPo_@cQs]kHkMsDcGgc@kp@{EwGo}@stA_S{^gJcQ{JgTsDsIkR_g@_Nw`@oFgTsIoZoZcrAoFwVk\\_yAcLce@cQkz@{J{c@_Sox@oFoUcGkWsXknA{EgTkMkp@oKkp@sIsl@oAcLcG_g@gEw`@sDsb@{@sIg@{JsDoi@wBwe@{E_oA{@{T{EovA?{@SoPsDcrAg@_SoAwVkMweEkC_v@cBwy@g@_b@Sw`@SoK?ogA?gc@R_XbBolK?oZ?sNSon@{@{^{@wVsD{r@_Dw`@cBcV{Egc@oFw`@cG_]cGw[ScB_Is]cGkWwGwVwG{TwLwe@kWco@wVkf@oP_]kMoU_NoUwLkRoAwBkMcQwGkM{Y_]gJsIoeB{iB_b@{c@k\\_]_IgJgJoK_I_IoKwL_I_Isb@ce@{T{TkWkWwQgOsb@_]cLsIgJcGgE_Dc`@cV{EkCc[cQwhAco@{TsN{^kWcVwQ_SoPcQ{O{TsS{TcVwmAsoAwBkC_SsSsb@sb@knA{pAkf@_g@gw@{w@sNoP_jF_oFkR_S_N_NwsCwxCsNgOwQsS_DgE{JsNsIsNsI{O_IcQwGcQcGwQoFwQsDgOsD_SsD_SkC_XcBgToAsSg@sXSsXf@wQz@wVnAwVvBwVnAwLzT{}BnAoPbBgYRsIf@sX?oPg@oUg@oUoA{TwBoUwB{TkC{OsDgTgEgToF_ScG_SgO_b@s`AwzBkR{c@_g@cmA_b@ogA{Ys{@oUos@oP{h@_DcLcGsS{Js]_|BwxHgO{c@ocCclI{Twy@_DsNsDwQkHg^_DsSoFc`@{Ece@kCsXoA{TwBsb@oUkqGwLcbDkH_mBsI{}B_Dsg@wBcy@cG{pA_D_l@_IolA{@gOwLo`B_Ig|@kM{uAwLogAoKk_AoAkMcG{c@cGkf@gOwhAkRgpAkMox@kRogAwQobAcQc~@{Jce@gT_eAcVseAgOwo@{YgkA{Jo_@kR{r@cG_S_IoZw~@s_D{J{^ce@k}A_IkW{JgYoKwVsNc[kRs]cLkRsS{Ysb@sg@k\\k\\oP_NcQ_NkWoP{fAct@wy@{m@kWsS_NoKoUoUgToUgOcQgTsX_S{YgOkWcLsSoKsSsNk\\sNk\\cL_]cGcQkR_q@{@wB_b@syAczBktHgTwt@siDgnLw`@_tAwQwo@{aAcgDsNwe@cLw`@oFkRknAkfEkxAs`Fk`CcgIsIoZkCgJkMkf@kRgw@cQwt@oPsv@{Osv@cQ_`AkM_v@cL{r@cLgw@gO{kA{Eo_@oAkM{E_b@{pAczLw`@sxD_q@smGwL_jAwLwcAsNgkAcVsmBwBgOwBcQoKgw@{TgzAk\\srB{TwrAce@kjCoUgpAoPwy@_S_`Ao_@wfBsb@shB{Oon@{T{|@sS_v@kRos@wGoU_X{aAo_@cwA_XkdAw[ksAsS{|@wQkz@gYksA{YgzAk\\{dBoUwmAs]giBcL{m@_Io_@cQw~@{@wG{c@c_CwLwo@kH{^gEwVoKoi@{EoUwzBkqLcQk_A_I_g@kM{w@g@sDkMccA_Isq@_Icy@{Egh@sD{h@_Dc`@cB_Xg@_NsDkp@kCos@sDcy@cBce@cL_kCcGc|A{Ow{DoP{~DSwG{@{OkH{dB{EsjAcGgkAsIw|AoFwy@oPg}B_ScnCg@cG{|@_wLgm@ofIkMcaBwLcwAkH{w@gJ_{@{Js`AcGgh@wQgzAsSg_BgJ{r@sIgm@kwDkaYspCkrS{Es]ce@gjDsmBouNsSgzAoFo_@wLox@oKwo@cdCclNkf@{qC{sBooL_Ice@cBcLsI{h@kWklBwBwQ{E{c@sIc~@_D{^_]{|E{Eco@oFkf@{Eo_@cG{^_DwQ_Iw`@g@oA{EsSoKka@{Jk\\_IcVwLw[sDgJsD_IwGoPsN{Y{JkRsNkWsI_NsNoUoPoUsSwVs]ka@cBcBo}@k_AojB{iBkHgJ_XsXkCkCwBwBk\\w[gJcL_S{TsNcQcLsN_SgYcQgYcGoK{OoZwLkWgJgTg@oAsNc`@wL{^wBwGwG_X{Jw`@sIgc@oF_]gE{YkCgT_Dk\\_Dce@kCsg@oKwxC_Dco@cBkW_Dc`@{E{h@{Ec`@oFo_@wBgOgEkWsI{c@wB{JsNco@sNon@gsBkaJoZcrAoi@_aCcQ_{@o_@klBchAc|F__D_ePoKgm@kHw`@cLcj@cG_XsNos@oF{YgJce@gOgw@sNgr@guAciH_]kgB{@sD{Owy@wVsoAwBcLsv@{~D{Jsg@kRgaA_Ngr@gEkRcVsoA_]shBoFg^?g@oAcLoAsIoAwLoAwVg@_b@?sN?g@R{YnAw[z@gObBwQ~CgYvBkMbGw[vGkWvB_IzJk\\zm@smBzJoZbVku@nA_DbL{^fr@swBzEsNnx@sfCzT{r@vLw`@jWgw@~u@c_Cjf@c|ArNsb@~M{^nFwL~M{YrNsXvL_S~CoFvG{JzJ_NrX_XnFkHvLkMzJ{JrIkHf@g@rNcLnPwL~HoFnA{@bLkHrNsIr]oPbLoFbQwGrSkHnK_DjWwGbQsDjWgEbLcBfkAsSvQ_DjW{EjM_DfO{EbQcGnPwGfEkCfEcBf@g@bL_IvBcBjCwBrIwGjRcQjH_IvLsNfJkM~HwL~MwVzJ_SrI{TnA_DnFcQnF_SzEgTrIoi@rIw~@z@{JnKcmAbBgTjC{h@z@o_@z@sg@?oUSw[{@_b@{@cVcB_]cBkWwGct@_Dw[_XsuCsD{h@{@wVS{TSwQ?gYf@wVz@oUnA_XjCo_@nFkf@rSoqAvGgh@v`@cnCbLgr@fEwQjHgYjH{TrN_]nFcLrIgOjR_XrIcLvLkMnU_Xns@sv@fT_XrI_Nz@oAfEkHz@oAjHoPnF_NnFoPzEoPjCkM~CkRbBcLbBkRz@gOz@cQRcQ?oUgEohHSwo@?{JScpB?srB?wwARgc@RkMjC{h@nAwLfEc[~CoPfE{TrD_NnFwQnPkf@j_AkjCvG_SrIc[fEcQnFcVzEkW~CgTrDgYbBcQ~CoZ~\\k|DnKgpAjC_b@jCgh@z@cVnAwj@fE_iDz@wo@R_g@?{m@Sc`@{@o_@oA{c@wBcj@wB{^oFkp@sD_]kHsl@_I_l@oFw[kHo_@oKkf@sDcQsD_Nc[gkA{J{^c`@_yA_tAobF_X{aAcBcG{EwQoKwe@gJce@wG{^gEwVsD_XcLseA{kAgbMoAkMkCc[_]okDwLwrA{Tc_CcGco@kCgYg@oFwQwkBkC{YgEod@oF_l@sIo}@oAkMsDo_@g@gEcBsSkCkWkHcy@wGk_A{@gTS_SwBgw@g@oi@oAka@ScQcBgfAScV{@_g@{@{^_Dwt@{Ekp@{Ecj@gh@{iG{^sqEgEkf@sD_]oAwQcB_XkC{c@{@sScBwo@SkWR{|@z@{r@bBcj@nAoZbG_eAvB{YrD{^~CgYbGwe@RcBbGc`@zw@wmF~Ms`AnFc`@~CgYnFoi@~C{c@nAsSvBka@vBco@nAwt@Rco@g@wt@g@ka@sDccA_Xc_HcBc`@wBgc@{Ekp@g@cGoKccA{TsmB{Eka@{^s_DgJ_{@sN{kA?g@sX_aCs{@_pHsDw[{Egc@gTwkB{J_{@w`@gjDs{@csHoF{c@kCoU{Jkz@{TgnB_Isl@sIoi@gJgh@oFwVcLwe@wLwe@{J_]sI_XgOgc@kMk\\kMw[_DkHwQo_@{EoKcQw[{Tw`@gOoUgJsNcVs]kMcQcV{YoPkRgO{Og@g@sSsSwrAknA{c@ka@{sB_mBwt@_q@gJsIkf@{c@knAkiAgzAguA_b@o_@guAsoAkuE{hEgO_N{TgTgT{T_DsDsXc[_NcQsNkRwL{OwLwQoZwe@oK_ScL_SoKgT{J_SwQ_b@sD_I{nB_qEc[os@wo@kxAgEoKcVcj@_Xon@wjE{|Jg^wy@k~CciH_]sv@kdAsaCkRkf@_No_@cQcj@cL{^gJg^sIs]cL_l@kHc`@{Jon@sDoZkHco@wBsXsIkiAcLo`BsIgkAcBcVwj@kcI{J{uAsDc`@gEo_@kCsSwGkf@wGc`@kHo_@g@cBsX{pA{|@{~DgOgr@c~@{cEwcAsqE{EkRwnCs|LoP_v@wpBo_J{Jwe@gJoi@cGs]wB_NczBsbOoFk\\{E_Xg@kCkMsl@oKce@oFgTgJk\\{Jc[sS_l@kM_]kMc[_DwGsNc[we@kdAsyAg`DshBozDc[gr@{Oo_@sN{^_N{^sNod@{Jk\\sIs]ovA_yF{Jw`@_IcV_IcVsI{TkHgOwLkWkMgTwQgYcLoPcL_N{TwV{J{JoKgJw[kWggHguF{TcQc[{TcV{OkWgOoZoPoi@wVwG_D{JgEcQcG_]wL_b@kMgYkH_]kHc[oFgh@sIo{AcVwy@_N{c@kH_l@sIkW{Ew~@gO{YoFc[kHcL_D{^cLgYoKkf@gT{TcLcQ{JcVsNoU{O{Y{TcVsS{OsNoZc[cLkM{r@s{@cdCo|C_tAwaB_]c`@sX{YcV{T_ScQgTwQoUcQgY_So_@cV{c@_Xk\\wQ_]_Ncj@oPwj@cQcj@sNct@kRcmAk\\sX_Ict@cVwVgJw`@gOcQwGce@_Sod@gTcdCgkAorC_tAgw@g^sXoK_X{Jos@kWka@kMw`@cLka@cLoqAc[gkAgYw`@gJ{{Cct@_b@oKkH_DsS_IgTsIcLoF_S_IoUoKkMkHkMsIwQkM{w@sq@s]c`@kMsNoKgOwGgJwLwQoUo_@oK_SoK{TgJsSg@cBwQgc@cLsX_g@knAoqA{`DgYos@cL{YsIwVcQ{h@cQwo@oA{E_Sox@cGs]kHka@{E{YgE{YsD{Y_DsXwBwVgEsg@g@sI{@sNwBs]kC_`AoAgw@Rwe@z@wrAf@sSzE{gCzEsdDvV{rOf@sq@Ssl@{@_l@wBco@sDos@wB{YkCc[sD_b@sDsXwLs`AkMc~@sDoUce@okDgO_eA{TolAc[wrAgYobAsNoZw`@s`Awe@chA_eAcdCoZcy@oZgaAcG{YgEwLwQsv@gOkp@k\\shBgOwmA{OkbBkHcmA_DobA{@od@{@_l@?sNSkp@z@_jAz@gpAnAk_AbBsb@fEogA~H{kA~MstA~R{_Bf@_DnFkk@fEco@fE_`A~CsoAS{zAsD{dBwB_eAsDg_BwVwpL{@sb@g@_b@Ska@?co@?sb@Rsb@f@wo@vB_eAvBsq@vBkk@rIgdB~RokDvVoiE~Cwo@z@{ORcLz@oi@f@we@Sw`@g@w`@cBcj@oAgYkCw`@cBwQwBsX_DkW{Eo_@cGw`@wG{^oF_XwLkf@gE{OkH_XkHsSgTkp@sS{w@giBksFkWox@gaAcxC{w@glC{Jw`@sIg^cGgTkCsIg@wBcGkRwo@c_CgJ_]kHcVchAc`E{@_DcBwG_IgYwQsl@oPsg@wV{r@sXgr@gJgTo~BchFsIsSsI{Tg@{@{@_D{EgOkCsIsDcLkHsX{Jod@{E_b@sIku@wBwe@oA_q@?od@nAgc@fEkiA~H{dBbLszCzEwmAfJ_tA~HknAf^sxDjRojBfJ{dBvBku@z@g|@{@gfAsIgwEoAo`BS{pAf@_yAjC{sBfEo{AbGoeBfEwy@nUsxDbL_tAfOw|AbVkqB~C{YvBoPjxAs`KfT_yAzTk}AbQckBfE{m@rD{fAbBsg@bBcj@Rs_DoA{nBkC_xD_DgaFwB_uCwB{pA_Dgr@gJobAoFs]wLct@gOsl@sSku@sS{h@gO{^cmA_pCopDg`I_{@gnB_q@ovAc~@wpBsl@cwAwt@_mB{zAsvEooBcwFktC_nI_|BswGk_AwsCcQkk@gO{m@{^caBwLox@kHgm@wGkp@oFg|@cj@k_P{J_aCwB_q@kRs{E_Dw~@cGwt@cLk_AwL_{@cQc~@gbCsvJgcEobPccAg~DwQwy@gJ{h@kHwj@{E_l@cBwmA_Dk|IoAox@wBkk@{EkdAwGox@_Iwt@kHod@gOs`AgOct@cQkp@kiAc`EseA{yDkk@_rBoPcj@{m@wzBs_Ds}Igw@k{BkWkk@wVod@{h@{r@oi@_b@gw@od@_q@g^w`@_S_]sSgfAcj@ccA_v@s]o_@{Yc`@k\\wj@sSwe@sD_IsXcy@w[gfAkW{|@kRon@cQkk@{nBgxGs_DksKc[{aAcy@gbCgfAglCotBgrEsXwj@oZ_b@_l@oi@od@k\\sb@cV_v@w[_{@g^ka@kRo_E{_B{gColAgm@gc@cj@_g@{c@we@sv@ogAg^{r@wy@ocCgT{w@w{DkpOoUon@cQc`@_b@os@k\\kf@ccAcrAccAg|@{eIweEgh@w`@k\\{Y{c@{m@sXon@sNsb@kMce@{O_q@oUoqA_q@ssDgh@omC{^ksA{h@olA{Yoi@klBw}Cc~@{zAwj@ccAsiDcrFo_@on@wy@_yAogAwaB_XgYkR_NcVgTkWsNw[oP_]wLoZ_Igr@sNon@kMox@sSsb@wLku@gOccAoUsg@cLw`@sNoZ_N_]oUwe@o_@w`@wj@{c@gw@c[os@c[kk@s]sg@sb@ka@kf@kW{c@sSc`@wGwkBgJsiDkHo_@_Dcj@{J_{@wVg|@c[spHkcD_b@gTka@_]we@sq@ce@c~@{Ykz@wLsl@sI{m@sDkz@sDccAgJolAoKox@kRgaAwLce@{^cmAwVwj@_Xsl@c~@{uAgm@gr@co@we@sScQkp@gh@obAkz@gkA{|@oU{OgTkRo_@g^_v@{fA{m@gkAod@guAcVobAgOk_AwzB_oPknAsxIwQg_Bc`@cmAsNw`@oUsb@_v@o}@oeB{_B{w@seAsl@{fAcj@ksA_Nw`@oFsS_Ik\\_Ic`@sD_SgJon@sDw[_Dc[kC_b@cB{^oAw[{@sq@cLo|HsIwpGg@_XoAsXwB_b@kCg^_DoZwGwj@{E_XcGs]wGoZkHgYsIoZ{Jc[_IgT_IgTwLsXsIkR_S{^cG{J{^{m@wcA_cBcy@_tAgEkHsIsNoPkWc[wj@cVs]co@_eAc[wj@sNkWsSsb@cQg^kM{YkCwG_N_]{Oka@_]{aAcLg^_Nwe@cBkHsD_NcG{T{c@g_B{Jg^cLc`@sNoi@{Tgw@kWw~@{E{O{r@{gCkdAssDkf@wfB{EcQ{gC{cJwGkWsNkf@kW_`AsIoZcGgT{Jc[wGkRwBwGsIgTgJkWgJkRkMwV{OsXsSgYkMwQsIcLwG_IgJcLsS{TgTsS{TkRc[wVk}AcmAoUwQox@cj@_X{T_NwLgOgOsNoP_NcQkMwQwLkR{O{Yce@c~@kp@{pAsq@crAgOoZ{EgJk_A{iBgiBgoDoFcLsIgOku@syAw`@sv@sb@kz@kf@s`AkdA_rB_S{c@sIkRgEgJoFkMwGkR_IgTcB{EgOod@oK{^{Jo_@cLkf@oFwVsNgw@on@khDkWcwAcQs`AsDgTobAsoFoAwGgY_~AcLgm@oi@cxCoAwGkWsyAgJ_g@kRobAkWkxAwVkxAgc@koC{T{uA_DsXcGs]gJsg@kR{kAoA{Jg^oyBoKgm@cLcj@kMgh@{EwQsIgY{O_g@sDcLkR{h@{JoU_IkRwQw`@_Sc`@cL_Ssv@ksAkM{Twe@cy@wGwLwj@gaAwwAkeCs]sl@_Ss]oPsXcxC{fFku@oqAc[cj@gw@c|Aod@{|@cVwj@g^gw@cV_l@wVon@kMw[gm@waBoF_NwVgr@cfBcyE_DsIsI{TsDgJ_Xwt@wLk\\sNo_@gJcV{JgYsDoKgJ_XwGcQk\\s`AsI{YkMw`@sNoi@_Ic[kHc[cLwj@gE{ToKco@{Jco@gEw[wGsl@_SooBgEw`@_DgTkCoP_Iw`@kHsXoF_SoAsDsD{JwLk\\kCwGsDoKwBsDcGkMsNkWwL_SsIkMgOsS{JcLgJoK_N_N_D_DkWoU{w@_q@_IkHwo@kk@cQwQsS_SkRcQ{^w`@cV_X{OwQ_S_XsSsXcVc[cQ_Sw[ce@_b@wo@kRoZ{O_Xo_@sq@_]co@w`@_{@sNoZ_Xwo@sS{h@_Ns]{Ton@wQcj@wQsl@sS{r@wGkW_Sox@gaAsbEkW{fAcVccAg_Bk{GkR{w@wL{h@wGgY{@sDcBoKc`@gdBkRo}@_Nku@kCkMcBoKoFoUkCwLkM_v@oPs`A_Isb@wGgYkH_XoFkRgEkMgJwVkM{YgJgToFoKcGwLwQoZ_NsSsNkR_ScVcj@gm@{EwG_D{E_g@wj@{c@{h@g^{c@kM{OkMcQ{J_NgOkRwVs]g^oi@sXsb@gY{c@{bC_xDs]oi@{m@{aAkHcLo{Ak`C_IwLgOcV{EkHkMsSka@on@{eDwhFsb@kp@oP_XwGoKsS{^{J_SgJkRcGwLgJoUgJgTwLg^cLs]oKg^gJo_@oFkWoFkWgJgh@sDsXsDsXgEc`@sD_b@cBgYcBsXSkHoAgYSoPg@gYoAg|@{@_{@g@_b@?{Og@_XSoPSka@{@wo@oAguAcBcmAoAkk@cBka@wBkk@kCcj@kCoi@{E{r@sDka@wBgYoFcj@SoFcGwj@wGoi@wG{h@_N{aAcLku@gTcwAcLwt@co@wjEkHwe@sN{aAsDgYsIwo@g@sDsD_]oFco@{Esl@wBs]_Dco@kCgm@oPseF_Dg|@cBsg@cBgh@{@cQcBsXkCc[kH{r@{Eo_@gE_X_Isb@kHg^gEcQ{E_S_IoZkH{TSg@kH{TwLs]wL{YkM{YcLoU_N_XcLsScB_D_IwL{w@soAwsCkpEwL_Sc[kf@wLwQk\\ce@_b@cj@g^_b@sN{OsN{O{O{OgOgOoUsSoPgOw`@k\\k\\wVgO{JsX_ScG_DcG{EgTwLg@g@{JoFsSoK{^_SkRsIkRsI_S_IkR_Io_@_NwhFscBwe@gOwe@{OogA{^co@kR_b@oPkM{E{w@oZ{^gOo_@gOon@gYsXkMwe@{T_l@sXka@_S_bE_rBs|BkiAsuCcwA_eA{h@kRgJwj@c[kW{Og^oU{c@{Yod@c[{c@_]_g@c`@cLsIklBsyAkiF_bEwuBkbB{lCotBseAcy@gaAos@o}E_nDgc@k\\k}AwhAseAsv@_yAgfAciHsjFwQkMcQkMksAgaAs]_Xo_@_XoUcQgYsScQwLgc@k\\wQkMgqCsrBco@we@wV_SkHwGwL{Jgh@od@{OgOgr@_q@ce@sg@gOcQgTwVgTkWsSkWoPgTgOsSkRkWkMwQ{@cB_b@co@g^kk@{Tw`@oPgY_Xgh@{OoZkCcGoFoKoKgTgTce@wLsX_Nc[{Tsg@kMc`@_kC{}Gs~AweEkCwG_mB{aF_q@cfB_X{r@w`@whAwL_]sb@wrAgOwe@kRco@wGoUc[gfAsSku@_DcLw[_oAkC{JgOco@w`@g_Bgh@{xBwVs`Akk@w_C_Sgw@cj@g}BwQwo@oUgw@wVos@kW{r@oKcV{Oo_@oAwB_NgYwLwVce@{|@gm@{fAS{@os@crAgT_b@sNw[oPg^oA_DoZ{r@{Tsl@gTsl@{Owe@wL{^kMce@_N_g@oPwo@k\\_tAsNwj@gOon@kH_X_XchAsSox@cGcVwLkf@sSon@{h@oeB{c@wrAcV_v@cj@kbBo_@cmAwQ{m@oU_v@wy@orC{w@{lCoZc~@_DgJ{EsNsNo_@_Xsq@gToi@c`@s{@od@k_A_Xgh@w|AkoC{Tc`@{^on@s]on@oi@c~@ce@kz@_kC{rEgY_g@_g@g|@wt@oqA{T_b@_Xcj@_Xcj@oZ{r@kWco@sSsg@kWwt@{Oce@{Tos@ka@ksA_Xc~@ojBckGsXo}@_IcV_Sgc@{Ow[cVka@cLcQkH{JkH{J{@oA_I{JgJoKoPoP{OgO{JsIsD_DcLsI{TgOc[sSce@_]s]oUklBoqAk\\wVsl@c`@wcA{r@sXkR{fA_v@{h@sb@w[sXw[{Yo_@o_@{TcVgOoP_SwVgT_XkWg^_SgYw[_g@oUw`@cQoZgT_b@wQo_@kRw`@sSwe@kWwj@kHcQ_Sgc@wVsl@gJgT_Ng^{Tgm@oPkf@_Sgm@wQgm@cLw`@wLod@w[gpAwL{h@kHs]sIw`@seAobF_`A{mEgTs`As]kxAod@_hBce@scBcG{Tgc@k}As{@oaD{EsNka@gzA{Ogm@c[ogAka@syAk\\knA{Owo@c[gpAce@wpBg|@ouDsS{|@gJ{^gJ{^_Nkf@cLg^oPce@S{@sI{TwQsb@{JoUgOc[cBsDgOsX_Xod@s]cj@{@oAgYc`@obA_oA_S{TwVw[w[c`@kC_DcGkHoF_Iwo@cy@kRwVox@sjAsSw[_]wj@_v@{pAkk@gaAoUw`@{Ycj@sXcj@sNw[wQgc@wL_]k_AcdCgY_v@_IgTsIsSwLsX{J_SkC{EkMgTwQ_XsS_X{Yc[kHkHwVgTgT{OkW{OwQgJ{^gOcj@cQ{O{EgYkHoUkHgEoAwL_Dgc@kMcQcGoFwBwG_DcLcGcLkHsIwGsNkMoKoK{^sb@wt@ox@w[w[oPsNk\\kWgOcL_b@gYcGsDwcAct@gr@kf@sl@o_@gw@we@oUkMwj@_]cj@w[_SsN_SgOcG{Eg^{^ogAksAkRgT{J{JwQ{O{JkHwQwLgoDs|B_XcQknAgw@kWoPkW{Og^sS_q@s]w[{OwbDkbBgdBg|@kR{JcQsIobAgh@co@w[gr@g^_S{J_XsN{r@s]cLwGs]wQsXsNs]sSo_@gTkWoPkWoPoUoPcj@ka@cVkRgm@kf@ox@wt@{TsS{OoPgO{OoZc[gTwVsSwV{^gc@sl@{w@sNkRw[we@kCsD{m@s`AwLsS_D{EskCoiE{sB{eDkR_XgTwVsIgJ{O{OoUgToPsN{O{O{c@ka@s]w[oP{OoKgJchAkdAw`@g^wj@_l@kiA{pAsIgJoP{OgOsNk\\kWs]cVkWgOgYoP_g@gYkM_IcrA_v@cQcLkWkRcVgTkMsNwG_IkMcQgOoUgEkHoKsS_IwQ{JkWkHgTkH_X{E_SgEcVgEwVwBgTsDw`@{@sNSgE{@c`@sDc}CwB{bCoAk_AoAchAg@we@oAcmA{@sl@g@kk@SwmASsXS_X{@kWcB_XwBsX_DgYwBsNoAkHkM_l@kC{JkCgJcL_]wGcQsNc[oKwQsDcGc[od@wBkCs]g^Sg@olA{kAku@co@oi@c`@c`@kWcj@s]{r@g^_aCwhAwxCstAkk@oZoKkHkHcGgOwLkHkHgTgToKkMoPwV{E_IkM{ToK{TgJ{TwGgToPgm@cG{Y{EoZsDoU_]gqC{Ew[oFoZwGc[gJo_@gEsN{@kCkMo_@{Ogc@{Toi@_IwQgJkRoZkf@sNsSkMsNwLgO{OcQgToUoU{Tkp@wj@wo@wj@{dB{zAwnC{}B_bE_xDcQoPg^g^{w@wt@{cEw{DolAkiAo_@g^gh@we@c[c[ka@{^c`@w`@{Yc[cL_NgOkRc`@oi@cL{OcQgYkM{T_Sg^sIoPcVgh@wQgc@oPgc@kM{^od@{uAoFcQcVwt@{Tsq@os@_wBwe@wwA{Tgr@cQgh@ce@{uAkW{w@olAkrDoi@{_Bsv@gbCsNka@kz@_kCkHwV_DgJgO{h@kf@wfBc[olAsXgkA_XgkAsXwmA_g@gxBwmAsoFwLsg@ka@shBkMgh@{Js]wVcy@wLg^g@oAwVkp@{Toi@{JcVwVcj@{^{w@oZgh@cGoKwVw`@o_@oi@_S_XgaA{kAox@_`AsXk\\gqCgeDsq@{w@{kA{uAolAstAgTcV_wBgbCgYw[guFckG_cBwkBg^w`@obA_jAgw@gaA_]sb@w[od@oi@ox@{^{m@oUc`@_]{m@k\\wo@oKsSgJsS{Ow[we@kdAgh@wcAsjAgxBoPoZkk@obA{c@co@{Tc`@gaAo`B_S_]gh@wy@{c@ct@c[_g@_N{Ts]wj@knAwpBo}@ovAcGgJgEwGgEwGwj@s{@w`@sl@oZ{c@c`@kk@kz@gkA{Yka@c[sb@{^gh@os@s`A{w@_jAc[sb@c`@kk@g|@{kAkz@{kAka@cj@cQcVc`@{h@_Xo_@c`@oi@o_@{h@sXg^gEwGka@sl@gJwLw`@sl@sX_b@gO{TgfAk}A{m@w~@_{@oqAgc@on@_NwQ{T_X{OwQk\\_]wLwLgYwVcV_Son@we@wVcQk\\cV_IoFg@g@oPkMwVcQcVwQwQkMsg@o_@sXkR_IcGw}Cs|BgaA{r@guAkdAo_@sXglCkqBglCsrBsoA_`A{OwLod@_]{|@{r@sq@gh@{r@gh@c~@_q@{w@sl@spCsrBwwA{fAgiB_tA_b@oZgr@{h@cy@on@cj@{^cLwGw~@oi@os@o_@sb@wQc}CcrAkp@cVgw@oZwe@oPwe@wQw`@sNwQkHkf@cQoqAkf@w`E{zAgfAka@c`@_N_eAw`@_oAod@kWgJox@oUg^wGc`@kMkk@_Ngc@{E{r@gEkjCcBglC{@{fARka@_DwBSku@gJ{w@sNk\\sIoi@{Osb@gOwmAgh@_v@oZkWcLcmAsl@cpB{|@od@_SklB_{@co@sXos@w[oqAwe@{J{Ek`CseAkdFs|Bc`@oPcVcLwQsIwVoKczBgaA_b@kRoi@kWsb@sSk\\wQoi@gY{c@cVgJcGkk@w[_eAco@gT_NsIoF_]{T_{@_l@gc@oZoyB{_Bc[oUc[{TsXsSgaK_pHsDkCcwAkdAce@c[_g@oZwV{Owj@oZ{c@oUcB{@sNkHce@sSsXwLce@kRsl@gTg}Bcy@wnCgaAcQcGc_Cwy@ccA{^sl@{T_XgJcVgJkRkHkf@{O_N{Ec[kMgT_IgJ_Dkz@oZgkA{c@kW_I_{@oZ{OwGw~@s]s]cQ{^{TgTcQ{^k\\c[_]c[{c@wVo_@sX_g@g^gw@{^sv@{EcLw`@s{@{Tgh@o}@gnB_b@_{@os@_~Ak_A_rBkWkk@o_@ox@ka@_{@co@oqA_]gr@c[gm@ka@{w@{w@gzAs]on@_NwVs]{m@oZ{h@cV_b@w[gh@od@ox@sXce@os@cmAsNwVwQc[k\\wo@{Ysq@oZsv@od@gzAcQgr@oPgw@kM{r@cG_b@{Egc@sDo_@oFgm@oFwy@cGkxAsIwwA_N_tAgJku@gOs`AsSg|@cGoU{O{m@cG_S{@kCsSgm@gEwLgYkz@os@_wBwcA{vC{m@kgBsg@caB{EgO_IsSoUgr@kf@ksAsS{m@cGgTsIoU_]wcAce@ksAcLc[cGoPk\\_`AwGsSgYwy@k\\s`A_{@{gCwVct@s]wcAcQ_l@sX{w@{Ys{@{Y{w@sjAwgDkC_IwGgTsIcVwQoi@wLw[gToi@s]{w@cVkf@wLsXwGwLwGcLka@wo@s]_g@{Tc[gYs]sXw[_]g^oPoPkf@gc@_X_Sc`@_Xgc@gYsv@kf@{^_S_b@kWsb@_X_IoFgO{J{c@c[oZ{Tg^{Y_g@_b@oZkWw`@o_@gTsSoUoU{Yc[sS{TkxFgxGsXk\\s]c`@o_@od@cdC_uCox@k_AwQgTwmA{uA{r@o}@gw@{aAct@c~@gm@ox@oPoUwo@g|@ox@whAwQ_XoPcVgc@on@sXsb@s]gh@cVg^kHcLgYwe@cwAg}B_yAwdCwe@wy@s`AscBoZgh@s]{m@sDwGce@wt@we@wy@_b@{r@{^co@c`@sq@kk@{aAgJoPgYce@cy@{pAc[_b@{h@sv@gr@_`AoUoZgEcG{Yc`@kvBwiCs]_b@{fA{kAwVkWw~@o}@sNwLsl@{h@gw@{r@_yA{pAk\\_XcV_S_b@w[w`@s]knAccAkR{O_kC_wBs`Agw@syAolA_]gY{TwQ_XgTgm@sg@oeBovAco@_g@gEgEkp@cj@ku@sl@oKsIod@c`@{c@g^wo@{h@c[_Xcy@_q@sScQg^oZs]_Xs]{Y{^{Ys]{YgeD{lCgh@{c@cy@os@_g@od@cV{TgaAk_Act@wt@omC_zCcQkR_v@s{@_yA_cBk}AkgBct@sv@{^{^w`@{^we@sb@w`@k\\oZoU{^sXwL{JgEsDcmA_v@_b@cVsX{OkW_NwVkMsX_N{|@c`@sl@oUsl@gT{xBsq@cwA{c@_jAk\\{_B_g@kRwG_g@_N_kCox@gaAoZcLsDcy@gYos@sXo}@w`@ce@{Ts]kRg^kR{c@sXgJoFsb@sXgh@s]gh@c`@gr@cj@wVgTsNkMwVoUce@od@on@wo@gc@sg@_g@sl@_]{c@kW_]c`@wj@wQsX{Ywe@{Ykf@kRg^sNwVwmFsqJchAwpB{oDgsG{Ygh@_rBkrDgYsg@sb@gw@kHsNsIoPcQoZgTc`@gOsXsb@wt@{JwQkMwVgOkW_g@g|@cGcL_b@_v@o_@sq@sDwGwt@wrA_Xwe@wL{TgTw`@w`@kp@oUo_@gO{Tc`@kk@cLsNc[_b@c`@_g@wj@kp@wo@gr@gc@gc@w`@o_@kf@gc@we@w`@w`@c[ka@c[kp@od@gc@wVgh@oZs`A{h@cwAsv@kz@ce@{h@oZcQgJc~@kf@_XsNwkBkdA_IoFct@ka@sg@_X_b@cVkp@s]wpB{fAgsBkiAsaCoqA_b@oU{m@k\\ovAox@{YcQgYkR{fAsv@gaAwt@_]{Y{JgJg^_]wVwVsq@{r@kf@oi@_b@sg@gr@c~@{c@on@kz@{pAoKoPwe@g|@kW_g@od@s`A{c@obA_b@o}@wcAk{BsXsl@obA_wBgTod@{Os]ka@w~@gh@cmAwV{h@wGsNgE_IwVce@_b@_v@ce@ox@oUc`@wVc`@wQkWg^sg@{r@c~@gc@gh@sN{OgEgE_SoUw[w[cQkR_ScQ_]w[gc@o_@{YcV{ToPoUkR_X_Skf@w[od@gYgkA{r@gEcB{h@sX{h@wVkMgEw`@cQk_Ag^guAgh@gpAkf@sb@{Ocy@c[sb@{Oon@cV_XoK{YkM_v@g^{^_SwVsNwVgOkW{Ok\\gTsb@c[cVwQoZwVgYcVs]k\\{m@{m@_]g^{TwVkz@c~@obAkiAwVsXgr@gr@gOoPgc@we@{^w`@g^c`@gYoZ_X{Ysg@kk@gaAgfAobAkdAg}BkeCsS{TkM_N{JwLos@sv@wkB_rBsv@kz@w`@_b@kMsNkiAknAco@gr@{OcQgfAsjAoKcL_]o_@oFwGsXoZwj@_q@_SkW{Yw`@cV_]cVs]s]wj@we@ox@gY{h@sXoi@od@w~@{c@_`AkRo_@_Ssb@cy@oeB{Twe@gOw[k}A_dDgr@kxAcQ{^kWcj@k\\wo@ce@sv@_g@_q@sXs]_]sg@sXkW{YkWod@o_@ku@kk@_v@_l@gkAc~@_eAox@chA_{@ox@{m@oPcLgzAobAgaAce@{|@{^_jAoUgzA{YsyAgYwsCoi@sg@gJoqAcVklBg^_oAcVkp@wGka@wGo}@sSkgB_b@cmAoZwj@gT_`Awe@gw@_l@gO{OcLwL_b@gc@sSoUwfBooBw`@{c@os@gw@_SoU{J_Ng^c`@ce@gh@wVwVco@kk@{TwQgTcQwG{Ew[cVkWcQ_NsIkp@c`@kp@k\\{^oP_]sNc`@sNsb@gOwQ{EcVkH{m@gOod@gJoUsDkeCc`@cLwBc`@oFchAcQkgBsXkk@sIczBs]s]oF{TgE{T_DgYsDco@oKsIcB{TkCspC{c@od@kHsv@cLgm@{J_NkCsoAkRo}@kMw[gEco@{J{}Bg^_X{EsyAoUgJoAw`@wGc{Dgm@cbD_g@oPkCce@wGolA_SkC{@c[wGwe@wLoZgJsSkH{YoKgTgJ{^cQwQ{Jc`@{T_XoPkR_NkRsN_S{OgYcV{YsXcVwVoZs]cj@sq@_SoUcnCcgDox@ccAsNwQs]_b@_b@gh@c`@_g@_Xw[_tAkbB{fAksAo_@we@gTkW_X_]_uC_nDwj@{r@whA{uA{bCszCcLkMco@{w@_Xc[{Yk\\{m@gm@{m@sl@sX_XwVsS{YwVcy@co@gaAwt@{m@kf@c`@gYcrAobA_XgT{h@w`@_g@{^gc@s]cL_IsSsNgpAs`AobAgw@cmAseA{YcV_g@ce@kMsN_NsNsS_S{^_]oZsXoK_IwQkRw[_]obAogAgc@_g@gc@we@wrA{zA{c@kf@kgBcpBgJcLc[_]g^ka@gYw[_]g^wQwQ{Y_X{OkM_b@w[sXkR_I{EoZcQgJoF_IsDo_@_S_SsIc`@gOcVsIkW_Igc@cLgm@_Noi@sIs]sDw`@sD{sBcQc`@cBoUwBkz@_IsX_D{w@oKgEg@gJcBw~@oPsmGcmAs_Don@_jAoUcLkCkk@gJ{eDwo@cxCkk@oPsD{O_Dc`@sIc[oFcVgEsS_D{uF{fAwj@{JwQkCce@oFwj@oF{YcBoP{@_g@cBgTg@{m@Swt@z@gmEnKcB?sDRk~CjHgkF~M{w@vBcxCjH_aCvGg|@rDsb@vB_XnAw`@jCgpAnK_l@nFgw@vGobArIceEn_@on@zEklBbQ_SnAka@fEsSnA{ObB{h@zE_{@~Hc~@rIkfEz^{|@jHwLz@on@~CoZf@oZRka@RoZSsSg@kRg@cQg@_Ig@sSoAsScBoZwB{Y_DoKoAgTkCsNwBwLwBwQsDc`@_IgYwG_SoFs]{J_b@kMsX{JsXoKwLoFoKgEgr@w[oF_DoPsIg^sS_SkMcdCovA{TwL_SoKgEkCk`C_tA_tAgw@cpB_jAsIoFsNsI_tA{w@sScLkdAgm@ce@wVgc@kRgY_Ng^{O{^gOs]kMc[cLsl@_S{YsIgm@oP_{@sS{YwG{YoFsg@sIoZ{E_bJ{pAo{AgTgiG{|@_l@gJoi@oK_SgE{m@sN{YkHsl@oP_ScG_SwG{m@gTwj@gT_jAgc@kCoAgYoKgyD{zAgh@_ScV{JoK{EcL{EcQwGkdAw`@{m@{T_b@{OgYcLkRkHkRkHsXwLwQsI_XkMkR{JgOsIcG_DoP{JsIoFSSgY_S{JwGcL_I{JkHwG{E_XgTkMoKwGoF_DkCkMwLcQ{Oce@od@{E{EgOcQcBoAwLsN{JwLsIoKkHsI_NwQwGgJgJ_NcBcB_NsSwLkRcLwQwL_SgO_XkMoUgJcQcL{T{JsS{JoUoK{TwQgc@gJcVsIsS{JoUwQgc@{JoUkMc[oF_NkR{c@gJ{T{Tcj@cVkk@wVsl@gJ{T_Nc[_Nk\\{Tcj@w[sv@gOo_@{JgTgOw[oFoKgJcQgJcQcG{JoFgJkCgE{J{OoKoPkCsDcGgJwGsIwGgJ_NoPsXk\\sN{OcVwVwQcQ{EgE{JgJkCkC{J_IcQ_NsIwG{OwLcBoAkWwQkMgJ_g@g^wVwQ_~AwhA{YgTs]wVco@od@_IoFsN{JgOcLkCcBkWsSgJwGgm@gc@oKkHsX_SsNoKwo@ce@oPcLgc@{YgOcLsl@sb@{OcLkWwQ_DwBcGsD{TcQsNoKwBcBkMoK{O_NcBcBcLcLcLoKgOoPgOoP_NcQsIcLgEcG{J_NcQsXwL_SwGkMgOgYcGwLcLkW{EoK{JwVwL_]cLs]kCgJkCgJkHkWgEwQsDsN_DgO{EkWcBgJwBwLgE_XoFw`@_DsXkC_XoA{OoAoPcBcV{@_SSwG{@cQSgOg@oPg@gYSgY?gYg@cpBSoPg@g^g@wV{@kWg@gOoAoZg@wL{@{JwBc[_Dw[{Ew`@kHgh@sD_S_DcQcBwGcLgh@wGwVgJs]{Jk\\kH{T{Tsl@sIgT_DsIgJkR{@cBkCgEg@oAoAwB{@oAgOgYoPgYwLwQoPsX_SkWwB_DoZs]oAoAc[w[kCwB{JgJoP{O{O_NsSsSoUgTsSsSoUgTwo@on@oPgOc`@{^{T{TsIsIcL{JkWkW{JgJkz@ox@gJsIcGcG_N_NsSkRcQoPcLwL{YgYkMkMwGwGkR_Sc`@ka@gm@on@oPwQgJ{JgYc[kMgOsIgJsb@kf@_]c`@sIcLsNoPwV{YwhAwrAkuJojLoAcBsXw[gO{OoUoUoKoKsl@oi@cgDowCgrE{~DwcA{|@c|A_tAoU_SoP_Nc[oUk\\cV{h@_]{c@wV{c@oUcLoF{J{EkRsI_XoKkRkHo_@_No_@wL_ScGsXkHkrD{|@knAk\\we@gOgr@kW_SsIcQ_I_XwLcQgJwQ{JwQ{J_XoPo_@wVsl@ce@gOwLgYcVkk@oi@kz@ox@sg@we@{T_SsSsSkWcVgYsXsq@wo@sNgO{Y_XkMkMgJsIkf@ce@k\\c[gaA_`A_l@wj@ku@gw@_]o_@{^_b@_g@sl@gc@oi@kRkWcVw[csCkwDgO_S_~AotB_IoK_SkW{h@sq@oPsSgYw[_IgJo_@ka@od@od@{T{TwQ{O_XwVoU_So}@os@oK_IsIwGwj@o_@kCwB_b@_Xox@kf@{OsIg^kRkH_DwVwLgoDoeBwQsI_eAsg@skCgpAgm@oZwhF_fCgr@_]oUcLknAsl@gToKgh@wVgvCovAgc@sSsjAsl@kz@ce@o_@oU_g@k\\g^wV{h@w`@sv@on@sg@od@kp@on@ct@os@wo@wo@kHwGoZ{Y{^c`@ka@c`@oKoK_zCwxCgdB{dBsI_IwQcQ{m@gm@wcAkdAon@sl@soAsoA_q@wo@on@on@w[w[{|@g|@oZ{Yos@_q@w`@k\\oPkMw[oUka@gYwV{Os]_Ssb@{T{EkCwQ_Is]{Oku@c[_I_DkMgEo}@kWk\\_IcVgEwQsDgaA_So_@sIwe@gJskCwj@kWwGgYcGku@oP{h@_Ngh@sNc`@wLcmA_b@cVsIsq@gYkWwLsXkMs]wQc[oPkHsD{aAgm@wL_Io}@gm@{kAkz@wkBcrAsq@kf@kWwQ{~IklGo_@kW_NoKgtDwiC{h@{^{m@sb@oi@c`@_oAg|@w~@wo@wdCoeBc|A{fAsb@{Y_eAwt@smGcoEsb@c[{m@kf@kk@_g@ka@o_@_XkWoi@wj@ogAwmAs|B{gC{pAwwA_oAguAo_@o_@ce@gc@oU_Sw`@c[k\\wVgc@gYcj@_]we@wVsN_IgbHkmD{c@oUcLoFkHsDgm@c[cQgJkW{Ok\\{T_]wVo_@c[oPgOco@wo@g^_b@wGsIgO_S_NkRc[kf@{^{m@wo@chAgsG{_LgY{c@gEkHcQkW_IcLc`@{h@gTsXkp@ku@w[c[oFoF{^s]c`@w[k\\kWs`Akp@soAwt@k\\wQgyDczBwt@_b@{xBknAod@kWorCs~A{{CkgBonEkeCgTkM_]kR_sDotBkz@od@kz@w`@we@gT{^sNggCg|@gjIwdC_pHg}B_v@cV_yFscBwzBos@oAg@{c@wLkz@wVcL_DwV_IgoDchAos@sSooBon@{_Bg^cwAoP{Eg@ku@oF_~AoFkp@f@on@nA{m@vB{c@rD{m@bG{^zEkCR_Df@w`@jHwe@fJ_NjCk_AvV{w@fTkxAv`@ka@bLc`@bLwVnFce@~M{uAn_@{w@nU{gCfr@wiCrq@_]jHwVnFgJnA_NvBwo@rIkp@zE_Sz@_q@f@w~@g@gT{@cj@_DoPcBc[sD{h@sI_eAcVcVkHs]wLwGwBcVgJwe@{TcB{@gTkM_X{Oco@c`@od@k\\gh@{c@wGcGo_@g^_aC{xBwaBc|AcQgOwQ_NgOsIkCcBsS_Nce@wVsb@_No_@sIcj@wGkWoAc[Skz@z@sSf@wy@~CkmDjRs~AnFka@Rsg@{@gOg@ce@kCsl@cGos@cLwV{E{h@sNs]oKc[cL{^gOkWsNs{@kf@sDwBcV{OgTgOoA{@_S{OkRoP{w@ox@SScQsSwVk\\kgBohCwgIgnLshB{gCw`@wj@gc@on@saCclD_~A{xB_b@gm@obAknAw~@ogAcVgYod@gh@gm@kp@{JcLc[w[o_@c`@cj@{h@gO{Og^k\\sg@od@sjAobAkCkCo}@ct@_v@sl@chAox@k\\{Tcy@cj@kxAc~@_eAsl@kf@_XguAct@cG_Dgc@_S{r@k\\kk@oUsIsDcwAgm@g`DsjAwmF{nBwB{@w}CkiAkiFwkBwwAgh@sXoK{h@{Tgh@cVsoA_q@kk@_]sXoPsl@w`@gr@oi@co@kf@c~@{w@sNsNsIsIk\\w[cLwLoPwQk_AwcAstAguAwlDgcEgaF{uFkcDssDcpBczBwcA{kAoPwQg`DclDwe@{h@oUgY{|@ccA{r@gw@kf@{m@sSsXgc@wo@cG{Jg^sl@c`@sv@wLoUg^gr@gh@k_AsDwGstAskCgxBweEsI{Osb@gw@_mBwqDox@g_Bco@{kAsq@gpAsoAgbCgoDc_Hsb@_{@_jAwzB{Tw`@oU{c@kMgTce@{|@_g@kz@wt@whAkp@k_AwmAsyA{c@_g@cV{Tw`@w`@{r@sq@gh@od@_jAg|@caBkdAku@sb@oF_Dgh@kWoAg@oZgO_tAon@o}@_b@gYkM{uAgm@wsCsoAgaA{c@{c@oUod@wQgEcBkf@{T{aAw`@sIgE{nBo}@shBgw@kk@_XkRgJo}@w`@{YkM{uAco@gzAco@_iDw|Awt@w`@kMcGoUwLgc@cV{YcQoAg@guAwy@oP{J_oAgw@gvCwuB_XsS{^{Yc[kW{|@ku@cpBgiBguAstAgiBklBkeHcnHknAcmAod@sb@sjAkdAogAk_Awy@_q@cpBw|A{c@_]sjAg|@sXkRw[_XgwJwnHwrA{|@sXsSg^c[ku@_l@sNcQw|AoqAg|@wy@{YsXgr@wo@{iBsmBwhA{pA_`A{kA_Xw[crA_~As{@wcAoUoZsXc[oUc[sNgOcy@ccAon@{w@sgE_eF_eAksAwdCszC_Xw[_~AckB{r@_{@oeBwuB_eAsoAw~@kiA{|@ogAsq@{|@sXc`@{h@gr@{m@c~@cGgJ{^cj@{EsIgOoU_b@_q@wLwQghEo~GwfG{rJggCsbEoZ{c@sb@kp@{h@ox@ku@seAwj@sv@wj@ct@o}@whA_SwVw[o_@sN{O_jA{pAs{@g|@kf@_g@gpAolA{pAsjAwe@c`@_{@sq@_cGcoEcLsIwo@{h@{|@ox@wj@wj@sq@ct@kWoZox@obAk\\gc@gm@{|@cQ_XcQgY{^{m@sl@gfAk\\kp@gTod@gYwo@kMoZcLsX_b@{fAw`@ogAcGcQsXwt@{^kdAkoCgvHsv@cuBon@gdBw}CgtIgpAkmDsl@o`Bg^ccA__DwvI_|BgnGoPod@s|BklG_rB{uFgw@kvB_Scj@cV_q@{@_DSSco@kgB{J{YwGgYoF_XsIsb@wG{h@{Ekf@_D{h@{@{w@Rgm@jCwy@zEwo@~Hsl@vQs`And@kbBzOkk@~iAozDvGcVn`BwwFvo@k{Bbo@czBjH_Xfc@{zAnd@s~A~R_q@bmAghEbt@_fCvQ{r@rIo_@jH_]bLco@nFk\\nPolAfEwe@bB_Sz@oKjCgc@~Cku@nAgc@z@ce@Rgc@?kk@S{YoAku@kCos@_Dkk@_D_b@sD_b@_DgYoAcLcG_g@oK_q@{E_XoK{h@gJc`@oi@wzBkMgh@ka@s~A{^syAcQgr@on@ohC{Jg^gOox@cGoZcBsl@{@ku@~MknAjMon@~HwQrD{JzE{JbV{h@fOkWvQc[rSc[rXwe@~{Bk|Dv`@{r@j\\sl@fOgYfJgTbQsb@zO{c@fE_N~HsXvGcVrIw`@jH{^vQkiA~\\czBbGc`@jRknAfpAcgIzJon@nPgfAnF{^rIsg@nFo_@jCgOfJsl@zYklBnPwcAnKgr@rDkWbQsjA~Hco@fJcy@rIcy@~Hs`Ar]_qErDo_@nFgh@f@kCbB_NvGce@rDkWvGg^zEwVzJkf@jHoZzEwQnPkk@vQ_l@zOsb@fEoKjCwGjMc[rNc[nd@ccA~p@kxAnx@cfBbuBosE~a@w~@vcA{xBrXco@~p@_yArb@c~@ns@k}AfkAohCbo@_yAjp@c|AnKwVfYgr@~Wkp@f^g|@bj@stAb|A{tD~u@ojBrzCgqH~\\ox@j\\gw@ni@cmA~HcQfT{c@nZon@bQ_]zT{c@~xAspC~HgOvdCctEzaAojBbo@{kAvVwe@zO{Yf_BwxCbBkCbe@c~@vBsDzYoi@z|@waBjWwe@jiA_wBjf@{|@fc@_v@zY_g@~u@soAzYwe@nUo_@fYce@bQsXRg@fOcVb`@{m@~f@s{@nPoZ~Wcj@rNs]bLoZbQkf@~CcLrI{YzJ{^bGkWnFkWzEsXzEsX~H{h@nP{uAbB{OvG{h@rD{YfJ{w@vV_rBvV{sBvBoPjMkdArv@wkGrNknAjMwcAj\\wsCfkA{wJ~M{fArDsXbLku@bL_q@rI_g@bQwy@zO{w@jeCcrKzh@_|Bzm@glCrD_NjHkWjMw`@zJwVzJcVvLcVjMcV~MoUvLwQbQoUjM{OjM_NbQwQnK{JbV_SnPwLfO{JnF_D~\\cQvLcGbV{JbLsDbVkHnUcGvV{EjWsDfTcBfYwBnA?fOg@bV?jR?~Wz@bjEnUz|@rDzTf@rX?rSg@nP{@jCS~RoAfYsDrS_D~WoFzOgEf^wLnZcL~HsDrXsNfTkMzOcLzE_D~f@_b@vGwGzO{OfTkW~RkWrNgTzTo_@fO{YnKcVrIsSjRoi@vBcGvBkHjCgJbL_g@vBsIrI_b@nFs]rDoZrDk\\~C{^rD{c@zc@kdFzh@shGz|@obKjHs{@bB{OnAoPfh@_cGfEgc@vj@srGrD_]~CcVvGc`@jH_]~H_]zJg^zEsNfOka@zuAssDjM{^jHoU~CcLrIo_@nF_XrDwVfE{Y~Ck\\bB_SbBc[nAw[f@cVR_XSoUg@k\\{@wVoA{Yg@cGgY_bEwB_b@oAoZcBco@SsIg@c[?oZ?sb@f@gh@?cLnAgh@zEseAnF_eArD{r@nZojGf@_NbBc`@~Rc{D~Csv@bB_q@nAcj@nAos@R{r@f@k_A?wLRwj@?c[f@cpBR{^Rsb@?{YR{|@?ce@nAccFbBc}Cf@gr@nA{r@z@gc@vBsg@vBcj@bB_b@fEos@nFox@z@oKbBsSzEsl@nFcj@vGsv@b`@{mEzEsg@rIccAvGgr@bG{r@jHct@RwBnFgr@~Hw~@rIk_AbVomCzJobAbGct@nF{r@jHsjAz@cLRsN?oAbBc`@vBkiAz@os@?kiAcBseAwGcbDcBk_Ag@sN{EomCkCwrASgJ?{@{@{c@wBsjAcBwt@sD{iB{EwsCcB{r@{@we@wG{`DoAwy@SgJwBseAg@sXkHkmDcG{uA_I_eAkC_]oAkMoF_g@sIos@gOobAoZgsBgEsXgE{^{Ewe@_D_]oAkR_Do}@g@oKSwj@SsXRwQf@{c@~C{|@jCg^RkCjCc[nFsl@vBcQzE_]vGka@zJkk@fOw~@z@_IfJco@vBgTnA{OnAwQbB_g@RoZ?oZ{@gc@{@gTkCsb@g@cGwB{TwB{O{@cLwG_q@cGsq@oAwVoA_]g@wVf@ka@nAcj@jCoZvBcVf@{EfEw[zJsg@jk@skCrNkp@f|@kaEzc@srBfYoqAfYoqAfJsb@~Ho_@~W_oAbGsXfT{aAzEgTvQkz@rDoPzE{T~C_SnKon@vLgkAbB_SvBgYvBco@f@wLf@{h@g@gpA?od@g@{uA?{c@z@kf@f@ce@RkMvB{r@rI_hBnFwo@nFsl@nFkf@bGwe@zJgm@zEgYbGka@nK_l@fJsb@~Mwj@rNwj@nPcj@fTsq@vQsg@~Wsq@zToi@vV{h@fO{YzYwj@fTo_@jR{YbQsXb[{c@nZw`@zc@oi@nn@gr@~lBgsBf}BgbCzTsSzJsIrIkHvG{EvGoF~R_NrSkM~WsNrS{JfYcLzTkHnAg@j\\gJvVcGvLkCf^oFnZ_DrScBzOg@~C?fh@_Dnx@_D~bB_Ibe@_DbVkCrNkCvQgEbVkHvQwGrNcGfOsIfOsI~M{JjM{JfJsIrNsN~MoP~McQnK{OfJoPfTsb@nK{TrSod@~nA_kCvj@wmAbQg^bhAk`Cjf@wcAzEoKfh@seAzY_l@ve@obAby@oeBnK{TvGsNjWoi@zsBgmE~\\wt@f^wt@jsAktCnx@scBjRsb@bQ{c@bQ{c@nPod@fOce@rNwe@rN{h@~M{h@vLcj@fOsv@fJwe@rDgTntBwaL~Hce@zEg^zEg^nFgc@rDka@jCoZjC_b@jCgh@bBka@z@ka@f@kk@Rwe@Swe@cBchAScL{Es|BsIc{DcLgkFkHofDwBwrAsDk}AwBs`A{@ku@cBcfBS{r@?cy@?kdAf@wrARoUR{Yz@o}@~C_mBvBo}@fE_oAni@cfQnFkgBfEgzAnU_fHnFsjA~HkiAfEkk@bBkRrDsb@bGsl@jRo{AvGwe@fYgiBjWcrAbQox@vB{JrI{^fOon@bVs{@zJs]fTsq@zOwe@rDoKnKoZni@wwAn_@obAnvAopD~Rgh@~f@{pAbVwo@rIsXzJ_]zEoPf@cBjH{Y~Hg^bG{YRkCjHgc@zEw[nF{c@fE{c@jC_]jCod@nA{YnAw`@f@ka@?sg@kCgdGcGoqK{@otBcBk{BRk_AnAkdAf@we@f@{Yz@kRjC_g@bB{TrDgc@fEod@bGce@zE_]f@{EvGc`@rDoU~CoPrNon@f@wBzOco@~H{YfYc~@fJkW~R_g@~Mc[fOc[vLcVvQk\\~MoUz^kk@juE_rGvo@s{@jp@wy@~f@gm@~f@gm@rD_Dfw@o}@zr@sv@by@kz@rjAgkAjWgYv[c`@jRkW~RgYrSw[~R_]nUsb@nUce@~HwQfOk\\zJsXvL_]~CsIvLw`@rNwe@jHgYfJc`@vGw[vGw[nK{m@jsA_iIbG_]zh@_dDby@_`FjCwQfOk_AjCsSrDoZfEka@~Cka@vBsb@bBw[nAsb@R_]f@kWRoZ?oK?_SScQSwe@cB{|@{@ka@cB_b@_Dos@oFwy@sIchAwBk\\oAg^{@gYS{YSw`@RgYz@{^z@oZRkCbB{^~Cc`@rDc`@vBkR~\\gqCn_@wxCjMgkAjC{TbG{m@f@cGrIs`A~H{aAbG{|@vGwhAbBc`@bBc[rDk_A~Cw~@bBsq@vBcmAnAccARk\\z@sjARco@Rku@z@gpA?k\\bG{cOf@{pAf@seA?cQrDsnI?sI?gc@RoZ?wBbBgoDf@wmAbBox@rD_`Az@gYjCod@nFct@rDwe@fEka@bGgh@zEo_@bLsv@rD{TjMgr@fJkf@nP{r@jMkf@nPkk@rNwe@zOwe@nPgc@nFgOvBoFrIoUv|AsbEf^w~@jz@k{B~\\o}@rXwt@f|@o~BzYgw@fw@otBbfBkuEbj@wwArg@oqAjk@ovAfh@soAjvBwcFfc@wcAR{@v[cy@bLw[fO_b@z@cBjHsSb`@gkArIsXrXc~@vV{|@bVk_ArN_l@vGsXrIc`@nPox@jMkp@vG{^bLwt@jCoPzJsq@rI_q@z@{JbB_N~MstAnAsNzE{h@zr@kkJrSo|CrS_pCjHseA~Cgc@nFgfA~Cox@nAku@bBobAR_q@f@k\\?cB?g|@S_tAcBg|@cB_g@wQkgGoFsrB{OwhFgOcrF{TsgJkHcdCoKkrDoA{c@wGcuB_IwxC_SspHwGojBoKkmDwQ{iGwLgcEkM_lEgJcgD_N_}DcBwj@kCos@gOstFcGkvBcBs]kCg^_Do_@gE{^oFs]oF_]wG_]gJo_@gJ{^wzBcxHc`@stAoqAcoEkjCsbJ{EgOw[whA{Ooi@cGgTkMw`@{@sDkCsIgc@gzAkCkHSoAwGsSoP_l@c`@stAsmBgxGwV{|@{Jg^s]cmA{Jg^gYobA_IkWkeCgtIgTct@wVsv@wVct@wLk\\k\\s{@gJgTsNg^cBsDoZsq@wLkWw[co@oK{Tk\\{m@gYsg@{Ysg@ka@wo@sb@co@kWo_@g^we@sg@kp@oAcB_N{OkMgO_NcQ_g@oi@w`@_b@_S_SsNgO_DwBka@c`@_jA{aAgoDo|ColAobAo_@s]wrA_jAsD_DguAcmAgc@g^gnBkbBg@g@{^_]od@ka@wo@sq@c`@od@_Xk\\kWs]gO{TgOcVkRs]od@{|@cQka@oK_XoFgOgO_b@{O_g@_Sgr@sNgm@sIka@{EwVgEkW{E_]cL{|@{Ewe@g@sDoAkMcQs~AoPc|AkHs{@wGco@cBcQ_]geDkHco@{Eod@kHct@cV{xBsSklB{Ow|AkMcrA{Js`AsDw[cGcj@g^{jDgTwuBoZ{qCsNsyAgOsyAoF{h@kHox@wQ{dBwB{TcGgm@kCgTkCoU{Jo}@cBgOsD_]cV_wB{Ekf@oFgm@cBkMkk@cwFwGsl@sg@kdFcGoi@kCoZoK{fAkHct@wLknAcBoPsIku@{@oFgEo_@g@wGgEc`@_NgpAsIku@cGsl@w`@_xD_DoZgJw~@gEg^kCgYwo@{iGoFkf@sDo_@SoFg@wGcGkf@co@klGwGkk@sIcy@gTkvBgOcrAwBkRg@_I{@gJkH{w@oKc~@kC{YgJg|@gJ{w@gEc[oZ{{C_DsX_I_v@kH_v@oK_jAg@_DoK{aA{OcwA{TotBsDo_@kHox@{@kMg@_Dg@cGgOs~AoKkdAwGwj@kCsXkf@_qEk\\goDoPwaB_]sdD{@_IwBsScLwcA{Egc@gJg|@kC_XoF{h@_D{YcQscB_NgpAgYwsC{Tg}BkCcVgEod@g@_DwB_SSkCoAgJ{JwcAwVsaCgO_~AgJg|@cQscBgEce@kMksAsIg|@sIct@cBgO_DoZgEs]sDsXoFsb@oKsq@wGs]{TgkAs]_hBkCwLgO_v@{Owy@w[o`BoKoi@kRk_AoUknAkW_tAgEgT{@_DwQc~@gOsv@oKsg@wGs]gJce@cL_l@wBoK_N{r@{EsXsIkk@_Iwo@sD_]oAoK{@kH{JkdA{TocCg@_D{Ecj@gJk_AsIk_AsDwe@kCg^?wBcBc[SwBcB_b@{@sSoAwj@wBgw@oA_q@cBkp@oAco@_DknAkCknAgEwkBwGc}CgEgdB{@od@cBsv@oAsb@gE_rBwBseAS_IgEs~A?cGg@gOwBc~@g@kWoA_l@g@gTS{O{@w[oA{h@?oKg@wVg@wQg@cLScLwBoi@cBoZcBc[kCoZgEwe@{@kH{Egc@sDsX{Ek\\cG{^sIod@_]caB_XoqAwGgY_Nsq@oFkWka@wpB_Nkp@_DgOg@{@SwBgEgT_DsNkMwo@oKcj@{EwQwGw[gEgTcLgh@kCwLcG{YwL{h@kM_l@oPsq@wV{aAsb@{uAwLs]sNc`@wLk\\kHkRsI_SkMw[oUon@_X_l@gOw[SoAwG_No_@cy@oUwe@oKgT_{@wfBgT{c@kCcGw[kp@k_A{nB{Tod@_DwGc`@ox@oU{h@{Yco@sIoP_Ssb@cLcVsq@guA_g@kdAsXco@sNgYkMkWoPw[wQ{^_NsXw[_q@kCwGsS_g@oK{YsNod@kHsX_IoZkH_]oFgY_DsS_DkR_DwVsD_]wBoU{@kMg@gJ{@cL{@oP{@sS{@gYg@{^SwV?wL?{@?wB?{J?wVf@_X?g@f@oKf@kMnAwVbB_]~Cod@z@wLfEw`@bGgc@bGs]jCoKjCwLz@gEbGgTjH{YfE_S~Rg|@jWchAjk@sfCrDgOvQct@fJka@~R{w@~Hs]jMcj@jCgJnFgTrS_{@zJk\\bG_SnFsNfJwVfOw[rD_IrDkHbL_SzEkHzJgOrX{^bVc[r{@{fAfJcLn}@ogAb`@gh@rjAcwAf^kf@b~@gpAzT_]zJ_S~HsNrDsIjRo_@rIkWvBoFrDoKjMc`@~HgYnU{aAfJ_b@fTg|@nK_g@zc@ooB~Rg|@~a@{dB~lBclIrDsNby@{tDroAgpFjCwLfTk_AvGwe@nF{h@bB_b@z@o_@z@{w@kHw~Jg@kWg@gJ{@gJoAcQwGgh@wQk_AgJo_@sIkWwLoZsXgm@{r@s~Ag@oAwGcLsS{^{^_g@cGwG{@oAoAoA{@oAoFoFc[wVgY_SgTsNsSkMkk@o_@gJwG{OoKoP{O_NsNsDgE_IgJs]gh@gYoi@gJkW_IgY_D{OwGg^kCwQoAcGoAgJcLkp@wL_v@wLgaA{@kHoAsIg@kCod@{qCoAsIwB_NoPseA_SgpA_No}@cGka@{EkWcBsI{@kH{EgO{JoZwQo_@cGsIcBwBc`@ce@oUwQcV_N_l@gOwj@{T_l@sXce@s]cQwQkHgJoPoU_IkM{OoZoP{c@oKka@_Nwy@cLs{@_Iw~@{Ewt@oFc~@oPkcDoAwe@g@{h@vBod@rI{m@zOgr@rXos@rNo_@jHoUjHgYfEc[vB_Xf@gYg@_XwBkWkC_X{EoU{h@waB_Son@wLce@oFoUcGs]oFgc@gE_b@kCod@oA_l@z@ku@?wGf@{ORoKRkHz@cV?oFRoFf@gT?Sz@c`@f@sNf@cLRoAz@kMg^oA_D?{E?gE?gJ?kM?oFRsDz@{Ez@oFz@{ERsNwBgyDwwAsX{JwBoFScBS{E?_IRwGbG_g@~Hgr@fJ{r@~CgTzJw`@jMkf@fEsSnFo_@vG_g@vBoZf@sS?g^?ovA?soA?_b@?oFz@wL~CwQ?{ERcG?kf@?oZ?w`@?oK?sI{@{OoAkM?sD?{^?wrAS_b@?{uA?cL?oP?cmA?{c@R{O?cVSo{AoAgY?gJ?gJ?sI?wQ?w`@?cL?sI?_]Rwe@?{O?kC?wG?cV?on@?gE?wV?_I?_S?wo@?_{@?gE?{h@?oKzEgJ?{|@R{h@?wG?cG?gw@Sco@{E_IoF?wB?_`A?kz@S_{@?_]S{YRwG?w`@?kRSoP?gE?cBkHgJg^we@{nB{@_D{@sDg@_D{@_DwB_IcV_`A?gE?cBSwB?wBRwBRkCz@{@jCgEz@cBRg@f@cBf@kCf@kCRsDR_D?{@?wBScBScBScBg@kC{@kCg@oA{@cBg@{@{@{@{@oA{@{@oA{@{@g@kCoAoASkCg@{@?gESoAf@g@?{@RcBz@g@RcBnAoAf@oARgEbGwBnKg@vBSjCSjC?bB?R?vBRjCRbBf@bBRbBf@nARz@z@bBf@nA","summary":"I 40, I 81"}]} diff --git a/Tests/MapboxDirectionsTests/IntersectionTests.swift b/Tests/MapboxDirectionsTests/IntersectionTests.swift index 8d0a13786..a46cad900 100644 --- a/Tests/MapboxDirectionsTests/IntersectionTests.swift +++ b/Tests/MapboxDirectionsTests/IntersectionTests.swift @@ -21,14 +21,9 @@ class IntersectionTests: XCTestCase { \"bearings\" : [ 80 ], - \"entry\" : { - \"indexes\" : [ - { - \"location\" : 0, - \"length\" : 1 - } - ] - }, + \"entry\" : [ + true + ], \"out\" : 0, \"approachLanes\" : null }, @@ -44,14 +39,11 @@ class IntersectionTests: XCTestCase { 120, 300 ], - \"entry\" : { - \"indexes\" : [ - { - \"location\" : 0, - \"length\" : 2 - } - ] - }, + \"entry\" : [ + false, + true, + true + ], \"out\" : 1, \"approachLanes\" : null } diff --git a/Tests/MapboxDirectionsTests/RouteStepTests.swift b/Tests/MapboxDirectionsTests/RouteStepTests.swift index 0ef45c013..2451224f0 100644 --- a/Tests/MapboxDirectionsTests/RouteStepTests.swift +++ b/Tests/MapboxDirectionsTests/RouteStepTests.swift @@ -106,9 +106,12 @@ class RoadTests: XCTestCase { class RouteStepTests: XCTestCase { func testCoding() { + let step = try! JSONDecoder().decode(RouteStep.self, from: routeStepJSON.data(using: .utf8)!) - let encoded = try! JSONEncoder().encode(step) + let encoder = JSONEncoder() + encoder.outputFormatting = [.prettyPrinted] + let encoded = try! encoder.encode(step) let roundTripJSON = String(data: encoded, encoding: .utf8) XCTAssert(roundTripJSON == routeStepJSON) diff --git a/Tests/MapboxDirectionsTests/V5Tests.swift b/Tests/MapboxDirectionsTests/V5Tests.swift index 92d87bed7..aae343fec 100644 --- a/Tests/MapboxDirectionsTests/V5Tests.swift +++ b/Tests/MapboxDirectionsTests/V5Tests.swift @@ -17,7 +17,7 @@ class V5Tests: XCTestCase { let queryParams: [String: String?] = [ "alternatives": "true", - "geometries": String(describing: shapeFormat), + "geometries": shapeFormat.rawValue, "overview": "full", "steps": "true", "continue_straight": "true", @@ -26,7 +26,7 @@ class V5Tests: XCTestCase { stub(condition: isHost("api.mapbox.com") && isPath("/directions/v5/mapbox/driving/-122.42,37.78;-77.03,38.91.json") && containsQueryParams(queryParams)) { _ in - let path = Bundle(for: type(of: self)).path(forResource: filePath ?? "v5_driving_dc_\(shapeFormat)", ofType: "json") + let path = Bundle(for: type(of: self)).path(forResource: filePath ?? "v5_driving_dc_\(shapeFormat.rawValue)", ofType: "json") let filePath = URL(fileURLWithPath: path!) let data = try! Data(contentsOf: filePath, options: []) let jsonObject = try! JSONSerialization.jsonObject(with: data, options: []) @@ -157,17 +157,17 @@ class V5Tests: XCTestCase { } func testGeoJSON() { - XCTAssertEqual(String(describing: RouteShapeFormat.geoJSON), "geojson") + XCTAssertEqual(RouteShapeFormat.geoJSON.rawValue, "geojson") test(shapeFormat: .geoJSON) } func testPolyline() { - XCTAssertEqual(String(describing: RouteShapeFormat.polyline), "polyline") + XCTAssertEqual(RouteShapeFormat.polyline.rawValue, "polyline") test(shapeFormat: .polyline) } func testPolyline6() { - XCTAssertEqual(String(describing: RouteShapeFormat.polyline6), "polyline6") + XCTAssertEqual(RouteShapeFormat.polyline6.rawValue, "polyline6") // Transform polyline5 to polyline6 let transformer: JSONTransformer = { json in diff --git a/Tests/MapboxDirectionsTests/VisualInstructionComponentTests.swift b/Tests/MapboxDirectionsTests/VisualInstructionComponentTests.swift index 7be7d68a3..6b5b990e6 100644 --- a/Tests/MapboxDirectionsTests/VisualInstructionComponentTests.swift +++ b/Tests/MapboxDirectionsTests/VisualInstructionComponentTests.swift @@ -3,8 +3,9 @@ import XCTest let componentJSON = """ { +"type": "text", "text": "Take a hike", -"imageBaseURL: "", +"imageBaseURL": "", } """ class VisualInstructionComponentTests: XCTestCase { diff --git a/Tests/MapboxDirectionsTests/WaypointTests.swift b/Tests/MapboxDirectionsTests/WaypointTests.swift index 428f10606..dc251fa49 100644 --- a/Tests/MapboxDirectionsTests/WaypointTests.swift +++ b/Tests/MapboxDirectionsTests/WaypointTests.swift @@ -12,6 +12,7 @@ class WaypointTests: XCTestCase { let coded = try! JSONEncoder().encode(originalWaypoint) let codedString = String(data: coded, encoding: .utf8) + XCTFail("finish this") // let encodedData = NSMutableData() // let coder = NSKeyedArchiver(forWritingWith: encodedData) // coder.requiresSecureCoding = true From 496c4e6eab582df5afb1bc98c5c9a3c2a26e1d81 Mon Sep 17 00:00:00 2001 From: Jerrad Thramer Date: Wed, 23 Oct 2019 16:29:11 -0600 Subject: [PATCH 12/89] Fixed all tests but V5 tests, which are the only ones remaining. --- .../MBDirectionsOptions.swift | 4 +- Sources/MapboxDirections/MBWaypoint.swift | 39 ++++- .../IntersectionTests.swift | 149 +++++++++++------- .../IntructionsTests.swift | 2 +- .../RoutableMatchTests.swift | 2 +- .../RouteOptionsTests.swift | 5 +- .../RouteStepTests.swift | 65 +++++++- .../MapboxDirectionsTests/WaypointTests.swift | 47 ++++-- 8 files changed, 224 insertions(+), 89 deletions(-) diff --git a/Sources/MapboxDirections/MBDirectionsOptions.swift b/Sources/MapboxDirections/MBDirectionsOptions.swift index 2681c0249..edba2f53b 100644 --- a/Sources/MapboxDirections/MBDirectionsOptions.swift +++ b/Sources/MapboxDirections/MBDirectionsOptions.swift @@ -333,7 +333,7 @@ open class DirectionsOptions: Codable, Equatable { } private var bearings: String? { - if waypoints.filter({$0.heading >= 0}).isEmpty { + if waypoints.compactMap({ $0.heading }).isEmpty { return nil } return waypoints.map({ $0.headingDescription }).joined(separator: ";") @@ -387,7 +387,7 @@ open class DirectionsOptions: Codable, Equatable { return legSeparators.map({ $0.name ?? "" }).joined(separator: ";") } - private var coordinates: String? { + internal var coordinates: String? { return waypoints.map { $0.coordinate.requestDescription }.joined(separator: ";") } diff --git a/Sources/MapboxDirections/MBWaypoint.swift b/Sources/MapboxDirections/MBWaypoint.swift index d2d15211e..bfa7643c0 100644 --- a/Sources/MapboxDirections/MBWaypoint.swift +++ b/Sources/MapboxDirections/MBWaypoint.swift @@ -1,3 +1,5 @@ +import CoreLocation + /** A `Waypoint` object indicates a location along a route. It may be the route’s origin or destination, or it may be another location that the route visits. A waypoint object indicates the location’s geographic location along with other optional information, such as a name or the user’s direction approaching the waypoint. You create a `RouteOptions` object using waypoint objects and also receive waypoint objects in the completion handler of the `Directions.calculate(_:completionHandler:)` method. */ @@ -9,15 +11,34 @@ public class Waypoint: Codable { case coordinate = "location" case coordinateAccuracy case targetCoordinate + case heading + case headingAccuracy + case separatesLegs case name + case allowsArrivingOnOppositeSide } required public init(from decoder: Decoder) throws { let container = try decoder.container(keyedBy: CodingKeys.self) + coordinate = try container.decode(CLLocationCoordinate2D.self, forKey: .coordinate) + coordinateAccuracy = try container.decodeIfPresent(CLLocationAccuracy.self, forKey: .coordinateAccuracy) + targetCoordinate = try container.decodeIfPresent(CLLocationCoordinate2D.self, forKey: .targetCoordinate) + heading = try container.decodeIfPresent(CLLocationDirection.self, forKey: .heading) + + headingAccuracy = try container.decodeIfPresent(CLLocationDirection.self, forKey: .headingAccuracy) + + if let separates = try container.decodeIfPresent(Bool.self, forKey: .separatesLegs) { + separatesLegs = separates + } + + if let allows = try container.decodeIfPresent(Bool.self, forKey: .allowsArrivingOnOppositeSide) { + allowsArrivingOnOppositeSide = allows + } + if let name = try container.decodeIfPresent(String.self, forKey: .name), !name.isEmpty { self.name = name @@ -91,7 +112,7 @@ public class Waypoint: Codable { For a route to be considered viable, it must enter this waypoint’s circle of uncertainty. The `coordinate` property identifies the center of the circle, while this property indicates the circle’s radius. If the value of this property is negative, a route is considered viable regardless of whether it enters this waypoint’s circle of uncertainty, subject to an undefined maximum distance. - By default, the value of this property is a negative number. + By default, the value of this property is `nil`. */ public var coordinateAccuracy: CLLocationAccuracy? @@ -112,15 +133,15 @@ public class Waypoint: Codable { This property is measured in degrees clockwise from true north. A value of 0 degrees means due north, 90 degrees means due east, 180 degrees means due south, and so on. If the value of this property is negative, a route is considered viable regardless of the direction from which it approaches this waypoint. - If this waypoint is the first waypoint (the source waypoint), the route must start out by heading in the direction specified by this property. You should always set the `headingAccuracy` property in conjunction with this property. If the `headingAccuracy` property is set to a negative value, this property is ignored. + If this waypoint is the first waypoint (the source waypoint), the route must start out by heading in the direction specified by this property. You should always set the `headingAccuracy` property in conjunction with this property. If the `headingAccuracy` property is set to `nil`, this property is ignored. For driving directions, this property can be useful for avoiding a route that begins by going in the direction opposite the current direction of travel. For example, if you know the user is moving eastwardly and the first waypoint is the user’s current location, specifying a heading of 90 degrees and a heading accuracy of 90 degrees for the first waypoint avoids a route that begins with a “head west” instruction. You should be certain that the user is in motion before specifying a heading and heading accuracy; otherwise, you may be unnecessarily filtering out the best route. For example, suppose the user is sitting in a car parked in a driveway, facing due north, with the garage in front and the street to the rear. In that case, specifying a heading of 0 degrees and a heading accuracy of 90 degrees may result in a route that begins on the back alley or, worse, no route at all. For this reason, it is recommended that you only specify a heading and heading accuracy when automatically recalculating directions due to the user deviating from the route. - By default, the value of this property is a negative number, meaning that a route is considered viable regardless of the direction of approach. + By default, the value of this property is `nil`, meaning that a route is considered viable regardless of the direction of approach. */ - public var heading: CLLocationDirection = -1 + public var heading: CLLocationDirection? = nil /** The maximum amount, in degrees, by which a route’s approach to a waypoint may differ from `heading` in either direction in order to be considered viable. @@ -129,12 +150,16 @@ public class Waypoint: Codable { If you set the `heading` property, you should set this property to a value such as 90 degrees, to avoid filtering out routes whose approaches differ only slightly from the specified `heading`. Otherwise, if the `heading` property is set to a negative value, this property is ignored. - By default, the value of this property is a negative number, meaning that a route is considered viable regardless of the direction of approach. + By default, the value of this property is `nil`, meaning that a route is considered viable regardless of the direction of approach. */ - public var headingAccuracy: CLLocationDirection = -1 + public var headingAccuracy: CLLocationDirection? = nil internal var headingDescription: String { - return heading >= 0 && headingAccuracy >= 0 ? "\(heading.truncatingRemainder(dividingBy: 360)),\(min(headingAccuracy, 180))" : "" + guard let heading = self.heading, let accuracy = self.headingAccuracy else { + return "" + } + + return "\(heading.truncatingRemainder(dividingBy: 360)),\(min(accuracy, 180))" } /** diff --git a/Tests/MapboxDirectionsTests/IntersectionTests.swift b/Tests/MapboxDirectionsTests/IntersectionTests.swift index a46cad900..67b00faf6 100644 --- a/Tests/MapboxDirectionsTests/IntersectionTests.swift +++ b/Tests/MapboxDirectionsTests/IntersectionTests.swift @@ -2,60 +2,98 @@ import XCTest @testable import MapboxDirections class IntersectionTests: XCTestCase { + + let intersectionJSON = + """ + [ + { + "location" : [ + 13.426579, + 52.508068 + ], + "in" : -1, + "classes" : [ + "toll", + "restricted" + ], + "usableApproachLanes" : null, + "bearings" : [ + 80 + ], + "entry" : [ + true + ], + "out" : 0, + "approachLanes" : null + }, + { + "location" : [ + 13.426688, + 52.508022 + ], + "in" : 2, + "usableApproachLanes" : null, + "bearings" : [ + 30, + 120, + 300 + ], + "entry" : [ + false, + true, + true + ], + "out" : 1, + "approachLanes" : null + } + ] + """ + + let pass = """ + [ + { + \"location\" : [ + 13.426579, + 52.508068000000002 + ], + \"in\" : -1, + \"classes\" : [ + \"toll\", + \"restricted\" + ], + \"bearings\" : [ + 80 + ], + \"entry\" : [ + true + ], + \"lanes\" : null, + \"out\" : 0 + }, + { + \"entry\" : [ + false, + true, + true + ], + \"in\" : 2, + \"out\" : 1, + \"lanes\" : null, + \"location\" : [ + 13.426688, + 52.508021999999997 + ], + \"bearings\" : [ + 30, + 120, + 300 + ] + } + ] + """ + func testCoding() { - let intersectionJSON = -""" -[ - { - \"location\" : [ - 13.426579, - 52.508068000000002 - ], - \"in\" : -1, - \"classes\" : [ - \"toll\", - \"restricted\" - ], - \"usableApproachLanes\" : null, - \"bearings\" : [ - 80 - ], - \"entry\" : [ - true - ], - \"out\" : 0, - \"approachLanes\" : null - }, - { - \"location\" : [ - 13.426688, - 52.508021999999997 - ], - \"in\" : 2, - \"usableApproachLanes\" : null, - \"bearings\" : [ - 30, - 120, - 300 - ], - \"entry\" : [ - false, - true, - true - ], - \"out\" : 1, - \"approachLanes\" : null - } -] -""" -// let json: JSONDictionary = [ -// "classes": ["toll", "restricted"], -// "out": 0, -// "entry": [true], -// "bearings": [80.0], -// "location": [-122.420018, 37.78009], -// ] let intersections = try! JSONDecoder().decode([Intersection].self, from: intersectionJSON.data(using: .utf8)!) let intersection = intersections.first! @@ -63,10 +101,9 @@ class IntersectionTests: XCTestCase { XCTAssert(intersection.headings == [80.0]) XCTAssert(intersection.location == CLLocationCoordinate2D(latitude: 52.508068, longitude: 13.426579) ) let encoder = JSONEncoder() - encoder.outputFormatting = [.prettyPrinted] + encoder.outputFormatting = [.prettyPrinted] let encoded = String(data: try! encoder.encode(intersections), encoding: .utf8) - XCTAssert(encoded == intersectionJSON) -// } -} + XCTAssert(encoded == pass) + } } diff --git a/Tests/MapboxDirectionsTests/IntructionsTests.swift b/Tests/MapboxDirectionsTests/IntructionsTests.swift index 6b67f70b3..2f1b6e72d 100644 --- a/Tests/MapboxDirectionsTests/IntructionsTests.swift +++ b/Tests/MapboxDirectionsTests/IntructionsTests.swift @@ -92,7 +92,7 @@ class SpokenInstructionsTests: XCTestCase { XCTAssertEqual(visualInstructions?.first?.primaryInstruction.text, "Page Street") XCTAssertEqual(visualInstructionComponent.text, "Page Street") XCTAssertEqual(visualInstructions?.first?.distanceAlongStep, 1107.1) - XCTAssertEqual(visualInstructions?.first?.primaryInstruction.finalHeading, 180.0) + XCTAssertEqual(visualInstructions?.first?.primaryInstruction.finalHeading, nil) XCTAssertEqual(visualInstructions?.first?.primaryInstruction.maneuverType, .turn) XCTAssertEqual(visualInstructions?.first?.primaryInstruction.maneuverDirection, .left) XCTAssertEqual(visualInstructionComponent.type, .text) diff --git a/Tests/MapboxDirectionsTests/RoutableMatchTests.swift b/Tests/MapboxDirectionsTests/RoutableMatchTests.swift index 747f10c21..0cd095eb7 100644 --- a/Tests/MapboxDirectionsTests/RoutableMatchTests.swift +++ b/Tests/MapboxDirectionsTests/RoutableMatchTests.swift @@ -68,7 +68,7 @@ class RoutableMatchTest: XCTestCase { // uses an atypical precision level for polyline encoding XCTAssertEqual(round(route!.shape!.coordinates.first!.latitude), 33) XCTAssertEqual(round(route!.shape!.coordinates.first!.longitude), -117) - XCTAssertEqual(route!.legs.count, 1) + XCTAssertEqual(route!.legs.count, 6) let leg = route!.legs.first! XCTAssertEqual(leg.name, "North Harbor Drive") diff --git a/Tests/MapboxDirectionsTests/RouteOptionsTests.swift b/Tests/MapboxDirectionsTests/RouteOptionsTests.swift index f27d1236f..26242b61b 100644 --- a/Tests/MapboxDirectionsTests/RouteOptionsTests.swift +++ b/Tests/MapboxDirectionsTests/RouteOptionsTests.swift @@ -119,9 +119,8 @@ class RouteOptionsTests: XCTestCase { let destination = Waypoint(coordinate: CLLocationCoordinate2D(latitude: 39.12971, longitude: -84.51638), name: "UC") destination.targetCoordinate = CLLocationCoordinate2D(latitude: 39.13115, longitude: -84.51619) let options = RouteOptions(waypoints: [origin, destination]) - -// XCTAssertEqual(options.queries, ["-84.47182,39.15031", "-84.51638,39.12971"]) - XCTFail("Get the path") + XCTAssertEqual(options.coordinates, "-84.47182,39.15031;-84.51638,39.12971") +// XCTFail("Get the path") XCTAssertTrue(options.urlQueryItems.contains(URLQueryItem(name: "waypoint_names", value: "XU;UC"))) XCTAssertTrue(options.urlQueryItems.contains(URLQueryItem(name: "waypoint_targets", value: ";-84.51619,39.13115"))) } diff --git a/Tests/MapboxDirectionsTests/RouteStepTests.swift b/Tests/MapboxDirectionsTests/RouteStepTests.swift index 2451224f0..0a8a282ae 100644 --- a/Tests/MapboxDirectionsTests/RouteStepTests.swift +++ b/Tests/MapboxDirectionsTests/RouteStepTests.swift @@ -114,12 +114,12 @@ class RouteStepTests: XCTestCase { let encoded = try! encoder.encode(step) let roundTripJSON = String(data: encoded, encoding: .utf8) - XCTAssert(roundTripJSON == routeStepJSON) + XCTAssert(roundTripJSON == pass) } } -let routeStepJSON = """ +fileprivate let routeStepJSON = """ { "intersections": [ { @@ -161,3 +161,64 @@ let routeStepJSON = """ "mode": "driving" } """ + +fileprivate let pass = """ +{ + \"intersections\" : [ + { + \"entry\" : [ + false, + true, + true + ], + \"in\" : 0, + \"out\" : 1, + \"lanes\" : [ + { + \"valid\" : true, + \"indications\" : [ + \"left\" + ] + }, + { + \"valid\" : true, + \"indications\" : [ + \"straight\" + ] + }, + { + \"valid\" : false, + \"indications\" : [ + \"right\" + ] + } + ], + \"location\" : [ + 13.424671, + 52.508811999999999 + ], + \"bearings\" : [ + 120, + 210, + 300 + ] + } + ], + \"distance\" : 236.90000000000001, + \"geometry\" : \"asn_Ie_}pAdKxG\", + \"maneuver\" : { + \"location\" : [ + 13.424671, + 52.508811999999999 + ], + \"bearing_after\" : 202, + \"bearing_before\" : 299, + \"type\" : \"turn\", + \"modifier\" : \"left\", + \"instruction\" : \"Turn left onto Adalbertstraße\" + }, + \"driving_side\" : \"right\", + \"duration\" : 59.100000000000001, + \"name\" : \"Adalbertstraße\" +} +""" diff --git a/Tests/MapboxDirectionsTests/WaypointTests.swift b/Tests/MapboxDirectionsTests/WaypointTests.swift index dc251fa49..aa2b6a336 100644 --- a/Tests/MapboxDirectionsTests/WaypointTests.swift +++ b/Tests/MapboxDirectionsTests/WaypointTests.swift @@ -10,25 +10,19 @@ class WaypointTests: XCTestCase { originalWaypoint.headingAccuracy = 10 originalWaypoint.allowsArrivingOnOppositeSide = false - let coded = try! JSONEncoder().encode(originalWaypoint) - let codedString = String(data: coded, encoding: .utf8) - XCTFail("finish this") -// let encodedData = NSMutableData() -// let coder = NSKeyedArchiver(forWritingWith: encodedData) -// coder.requiresSecureCoding = true -// coder.encode(originalWaypoint, forKey: "waypoint") -// coder.finishEncoding() + let encoder = JSONEncoder() + encoder.outputFormatting = [.prettyPrinted] -// let decoder = NSKeyedUnarchiver(forReadingWith: encodedData as Data) -// decoder.requiresSecureCoding = true -// defer { -// decoder.finishDecoding() -// } -// guard let decodedWaypoint = decoder.decodeObject(of: Waypoint.self, forKey: "waypoint") else { -// return XCTFail("Unable to decode waypoint") -// } + let encodedData = try! encoder.encode(originalWaypoint) + let encodedString = String(data: encodedData, encoding: .utf8)! - let decodedWaypoint = try! JSONDecoder().decode(Waypoint.self, from: (codedString?.data(using: .utf8))!) + XCTAssertEqual(encodedString, pass) + + + let decoder = JSONDecoder() + + + let decodedWaypoint = try! decoder.decode(Waypoint.self, from: encodedData) XCTAssertEqual(decodedWaypoint.coordinate.latitude, originalWaypoint.coordinate.latitude) XCTAssertEqual(decodedWaypoint.coordinate.longitude, originalWaypoint.coordinate.longitude) @@ -64,3 +58,22 @@ class WaypointTests: XCTestCase { XCTAssertEqual(matchOptions.urlQueryItems.first { $0.name == "waypoints" }?.value, "0;2;3") } } + +fileprivate let pass = """ +{ + \"headingAccuracy\" : 10, + \"location\" : [ + -77.036500000000004, + 38.8977 + ], + \"targetCoordinate\" : [ + -77.032788199999999, + 38.895226100000002 + ], + \"coordinateAccuracy\" : 5, + \"allowsArrivingOnOppositeSide\" : false, + \"heading\" : 90, + \"separatesLegs\" : true, + \"name\" : \"White House\" +} +""" From 6149c154b6ef6f21cdbc07c5c695c5dd3266d855 Mon Sep 17 00:00:00 2001 From: Jerrad Thramer Date: Fri, 25 Oct 2019 13:11:45 -0600 Subject: [PATCH 13/89] Fixing tests. One remains. --- .../MapboxDirections/Extensions/Codable.swift | 14 ++++++++- .../MBComponentRepresentable.swift | 2 ++ .../MapboxDirections/MBDirectionsResult.swift | 16 +++++++--- Sources/MapboxDirections/MBRoute.swift | 21 ++++++++----- Sources/MapboxDirections/MBRouteStep.swift | 30 ++++++++++++++----- Tests/MapboxDirectionsTests/MatchTests.swift | 4 ++- .../RouteStepTests.swift | 8 ++++- Tests/MapboxDirectionsTests/V5Tests.swift | 25 +++++++--------- 8 files changed, 83 insertions(+), 37 deletions(-) diff --git a/Sources/MapboxDirections/Extensions/Codable.swift b/Sources/MapboxDirections/Extensions/Codable.swift index 001b5e759..357a3f02b 100644 --- a/Sources/MapboxDirections/Extensions/Codable.swift +++ b/Sources/MapboxDirections/Extensions/Codable.swift @@ -19,6 +19,8 @@ struct UncertainCodable: Codable { var t: T? var u: U? + var options: DirectionsOptions + var value: Codable? { return t ?? u } @@ -27,18 +29,26 @@ struct UncertainCodable: Codable { if let geo = value as? Geometry { return geo.coordinates } else if let geo = value as? String { - return decodePolyline(geo, precision: 1e5)! + return decodePolyline(geo, precision: options.shapeFormat == .polyline6 ? 1e6 : 1e5)! } else { return [] } } init(from decoder: Decoder) throws { + + guard let options = decoder.userInfo[.options] as? DirectionsOptions else { + let error: Error = "Directions options object not found." + throw error + } + self.options = options + let container = try decoder.singleValueContainer() t = try? container.decode(T.self) if t == nil { u = try? container.decode(U.self) } + } func encode(to encoder: Encoder) throws { @@ -51,3 +61,5 @@ struct UncertainCodable: Codable { } } } + +extension String: Error {} diff --git a/Sources/MapboxDirections/MBComponentRepresentable.swift b/Sources/MapboxDirections/MBComponentRepresentable.swift index b4787c88a..017726cca 100644 --- a/Sources/MapboxDirections/MBComponentRepresentable.swift +++ b/Sources/MapboxDirections/MBComponentRepresentable.swift @@ -31,11 +31,13 @@ internal struct Component: Codable { if let lane = component as? LaneIndicationComponent { try container.encode(lane.indications, forKey: .directions) try container.encode(lane.isUsable, forKey: .isActive) + try container.encode(VisualInstructionComponentType.lane, forKey: .type) } else if let instruction = component as? VisualInstructionComponent { try container.encodeIfPresent(instruction.text, forKey: .text) try container.encodeIfPresent(instruction.abbreviation, forKey: .abbreviatedText) try container.encodeIfPresent(instruction.abbreviationPriority, forKey: .abbreviatedTextPriority) try container.encodeIfPresent(instruction.imageURL, forKey: .imageURL) + try container.encode(instruction.type, forKey: .type) } diff --git a/Sources/MapboxDirections/MBDirectionsResult.swift b/Sources/MapboxDirections/MBDirectionsResult.swift index 013bab135..899b2bb37 100644 --- a/Sources/MapboxDirections/MBDirectionsResult.swift +++ b/Sources/MapboxDirections/MBDirectionsResult.swift @@ -29,7 +29,7 @@ open class DirectionsResult: Codable { case accessToken case apiEndpoint case routeIdentifier - case speechLocale + case speechLocale = "voiceLocale" } @@ -40,7 +40,7 @@ open class DirectionsResult: Codable { distance = try container.decode(CLLocationDistance.self, forKey: .distance) expectedTravelTime = try container.decode(TimeInterval.self, forKey: .expectedTravelTime) - _directionsOptions = try container.decodeIfPresent(DirectionsOptions.self, forKey: .directionsOptions) ?? decoder.userInfo[.options] as! DirectionsOptions + _directionsOptions = decoder.userInfo[.options] as! DirectionsOptions switch _directionsOptions.shapeFormat { @@ -76,7 +76,16 @@ open class DirectionsResult: Codable { accessToken = try container.decodeIfPresent(String.self, forKey: .accessToken) apiEndpoint = try container.decodeIfPresent(URL.self, forKey: .apiEndpoint) routeIdentifier = try container.decodeIfPresent(String.self, forKey: .routeIdentifier) - speechLocale = try container.decodeIfPresent(Locale.self, forKey: .speechLocale) + + do { + speechLocale = try container.decodeIfPresent(Locale.self, forKey: .speechLocale) + } catch let DecodingError.typeMismatch(mismatchedType, context){ + guard mismatchedType == Dictionary.self else { + throw DecodingError.typeMismatch(mismatchedType, context) + } + let identifier = try container.decode(String.self, forKey: .speechLocale) + speechLocale = Locale(identifier: identifier) + } } public func encode(to encoder: Encoder) throws { @@ -100,7 +109,6 @@ open class DirectionsResult: Codable { try container.encode(distance, forKey: .distance) try container.encode(expectedTravelTime, forKey: .expectedTravelTime) - try container.encode(directionsOptions, forKey: .directionsOptions) try container.encodeIfPresent(accessToken, forKey: .accessToken) try container.encodeIfPresent(apiEndpoint, forKey: .apiEndpoint) try container.encodeIfPresent(routeIdentifier, forKey: .routeIdentifier) diff --git a/Sources/MapboxDirections/MBRoute.swift b/Sources/MapboxDirections/MBRoute.swift index adacec5a7..d2793e681 100644 --- a/Sources/MapboxDirections/MBRoute.swift +++ b/Sources/MapboxDirections/MBRoute.swift @@ -6,18 +6,23 @@ import Polyline Typically, you do not create instances of this class directly. Instead, you receive route objects when you request directions using the `Directions.calculate(_:completionHandler:)` method. However, if you use the `Directions.url(forCalculating:)` method instead, you can pass the results of the HTTP request into this class’s initializer. */ +private enum CodingKeys: String, CodingKey { + case routeOptions +} + open class Route: DirectionsResult { public required init(from decoder: Decoder) throws { + if let matchOptions = decoder.userInfo[.options] as? MatchOptions { + routeOptions = RouteOptions(matchOptions: matchOptions) + } else { + routeOptions = decoder.userInfo[.options] as! RouteOptions + } + try super.init(from: decoder) - - } - public override func encode(to encoder: Encoder) throws { - try super.encode(to: encoder) + public override var directionsOptions: DirectionsOptions { + return routeOptions as DirectionsOptions } - - public var routeOptions: RouteOptions { - return super.directionsOptions as! RouteOptions - } + public var routeOptions: RouteOptions } diff --git a/Sources/MapboxDirections/MBRouteStep.swift b/Sources/MapboxDirections/MBRouteStep.swift index f0b6694c5..130712a6d 100644 --- a/Sources/MapboxDirections/MBRouteStep.swift +++ b/Sources/MapboxDirections/MBRouteStep.swift @@ -338,8 +338,7 @@ import Polyline You do not create instances of this class directly. Instead, you receive route step objects as part of route objects when you request directions using the `Directions.calculate(_:completionHandler:)` method, setting the `includesSteps` option to `true` in the `RouteOptions` object that you pass into that method. */ -@objc(MBRouteStep) -open class RouteStep: NSObject, Codable { +open class RouteStep: Codable { private enum CodingKeys: String, CodingKey { case codes @@ -387,16 +386,16 @@ open class RouteStep: NSObject, Codable { try container.encodeIfPresent(phoneticNames, forKey: .phoneticNames) try container.encode(distance.rounded(to: 1e1), forKey: .distance) try container.encode(expectedTravelTime.rounded(to: 1e1), forKey: .expectedTravelTime) - try container.encodeIfPresent(codes, forKey: .codes) + try container.encodeIfPresent(codes?.joined(separator: "; "), forKey: .ref) if transportType != .none { try container.encode(transportType, forKey: .transportType) } - try container.encodeIfPresent(destinationCodes, forKey: .destinationCodes) - try container.encodeIfPresent(destinations, forKey: .destinations) + + try container.encodeIfPresent(destinationString, forKey: .destinations) try container.encodeIfPresent(intersections, forKey: .intersections) try container.encode(drivingSide, forKey: .drivingSide) - try container.encode(name, forKey: .name) + try container.encodeIfPresent(name, forKey: .name) try container.encodeIfPresent(geometry, forKey: .geometry) var maneuver = container.nestedContainer(keyedBy: ManeuverCodingKeys.self, forKey: .maneuver) @@ -433,10 +432,12 @@ open class RouteStep: NSObject, Codable { name = try container.decode(String.self, forKey: .name) + let dest = try container.decodeIfPresent(String.self, forKey: .destinations) + let road = Road(name: name, ref: try container.decodeIfPresent(String.self, forKey: .ref), exits: try container.decodeIfPresent(String.self, forKey: .exits), - destination: try container.decodeIfPresent(String.self, forKey: .destinations), + destination: dest, rotaryName: try container.decodeIfPresent(String.self, forKey: .rotaryName)) if let instruction = try? maneuver.decode(String.self, forKey: .instruction) { @@ -471,6 +472,7 @@ open class RouteStep: NSObject, Codable { codes = road.codes transportType = try container.decodeIfPresent(TransportType.self, forKey: .transportType) ?? .none + destinationCodes = road.destinationCodes intersections = try container.decodeIfPresent([Intersection].self, forKey: .intersections) @@ -492,6 +494,20 @@ open class RouteStep: NSObject, Codable { } } + private var destinationString: String? { + let destCodeString = destinationCodes?.joined(separator: ", ") + let destString = destinations?.joined(separator: ", ") + + if let destCodes = destCodeString { + guard let dests = destString else { + return destCodes + } + return destCodes + ": " + dests + } else { + return destString ?? nil + } + } + // MARK: Getting the Step Geometry /** diff --git a/Tests/MapboxDirectionsTests/MatchTests.swift b/Tests/MapboxDirectionsTests/MatchTests.swift index 107f7ee61..d525b97bc 100644 --- a/Tests/MapboxDirectionsTests/MatchTests.swift +++ b/Tests/MapboxDirectionsTests/MatchTests.swift @@ -141,7 +141,9 @@ class MatchTests: XCTestCase { let encoded = try! JSONEncoder().encode(match) let encodedString = String(data: encoded, encoding: .utf8)! - let unarchivedMatch = try! JSONDecoder().decode(Match.self, from: encodedString.data(using: .utf8)!) + let decoder = JSONDecoder() + decoder.userInfo[.options] = matchOptions + let unarchivedMatch = try! decoder.decode(Match.self, from: encodedString.data(using: .utf8)!) XCTAssertEqual(match.confidence, unarchivedMatch.confidence) diff --git a/Tests/MapboxDirectionsTests/RouteStepTests.swift b/Tests/MapboxDirectionsTests/RouteStepTests.swift index 0a8a282ae..fa65c9afc 100644 --- a/Tests/MapboxDirectionsTests/RouteStepTests.swift +++ b/Tests/MapboxDirectionsTests/RouteStepTests.swift @@ -107,7 +107,13 @@ class RoadTests: XCTestCase { class RouteStepTests: XCTestCase { func testCoding() { - let step = try! JSONDecoder().decode(RouteStep.self, from: routeStepJSON.data(using: .utf8)!) + let options = RouteOptions(coordinates: [CLLocationCoordinate2D(latitude: 0, longitude: 0), CLLocationCoordinate2D(latitude: 1, longitude: 1)]) + options.shapeFormat = .polyline + + let decoder = JSONDecoder() + decoder.userInfo[.options] = options + + let step = try! decoder.decode(RouteStep.self, from: routeStepJSON.data(using: .utf8)!) let encoder = JSONEncoder() encoder.outputFormatting = [.prettyPrinted] diff --git a/Tests/MapboxDirectionsTests/V5Tests.swift b/Tests/MapboxDirectionsTests/V5Tests.swift index aae343fec..6bb708c50 100644 --- a/Tests/MapboxDirectionsTests/V5Tests.swift +++ b/Tests/MapboxDirectionsTests/V5Tests.swift @@ -124,7 +124,7 @@ class V5Tests: XCTestCase { XCTAssertEqual(step?.coordinates?.first?.latitude ?? 0, 38.9667, accuracy: 1e-4) XCTAssertEqual(step?.coordinates?.first?.longitude ?? 0, -77.1802, accuracy: 1e-4) - XCTAssertNil(leg?.steps[32].names) + XCTAssertEqual(leg?.steps[32].names, nil) XCTAssertEqual(leg?.steps[32].codes, ["I-80"]) XCTAssertEqual(leg?.steps[32].destinationCodes, ["I-80 East", "I-90"]) XCTAssertEqual(leg?.steps[32].destinations, ["Toll Road"]) @@ -242,6 +242,7 @@ class V5Tests: XCTestCase { let options = RouteOptions(waypoints: waypoints) XCTAssertEqual(options.shapeFormat, .polyline, "Route shape format should be Polyline by default.") + options.shapeFormat = .polyline options.includesSteps = true options.routeShapeResolution = .full @@ -297,22 +298,16 @@ class V5Tests: XCTestCase { route.apiEndpoint = URL(string: "https://api.mapbox.com") route.routeIdentifier = result.uuid - XCTFail("Finish this") // Encode and decode the route securely. - // This may raise an Objective-C exception if an error occurs, which will fail the tests. -// let encodedData = NSMutableData() -// let keyedArchiver = NSKeyedArchiver(forWritingWith: encodedData) -// keyedArchiver.requiresSecureCoding = true -// keyedArchiver.encode(route, forKey: "route") -// keyedArchiver.finishEncoding() -// -// let keyedUnarchiver = NSKeyedUnarchiver(forReadingWith: encodedData as Data) -// keyedUnarchiver.requiresSecureCoding = true -// let unarchivedRoute = keyedUnarchiver.decodeObject(of: Route.self, forKey: "route")! -// keyedUnarchiver.finishDecoding() -// -// test(unarchivedRoute, options: options) + let encoder = JSONEncoder() + encoder.outputFormatting = [.prettyPrinted] + + let jsonData = try! encoder.encode(route) + + let newRoute = try! decoder.decode(Route.self, from: jsonData) + test(newRoute, options: options) + } } #endif From 298cd42eb487e2094140092bd372bd1753be30f3 Mon Sep 17 00:00:00 2001 From: Jerrad Thramer Date: Fri, 25 Oct 2019 14:55:56 -0600 Subject: [PATCH 14/89] Fixing last outstanding test. I hope. --- Sources/MapboxDirections/MBDirectionsResult.swift | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/Sources/MapboxDirections/MBDirectionsResult.swift b/Sources/MapboxDirections/MBDirectionsResult.swift index 899b2bb37..ef1a0cee8 100644 --- a/Sources/MapboxDirections/MBDirectionsResult.swift +++ b/Sources/MapboxDirections/MBDirectionsResult.swift @@ -66,11 +66,13 @@ open class DirectionsResult: Codable { } // Associate each leg JSON with a source and destination. The sequence of destinations is offset by one from the sequence of sources. - let waypoints = directionsOptions.waypoints - let legInfos = zip(zip(waypoints.prefix(upTo: waypoints.endIndex - 1), waypoints.suffix(from: 1)), legs) - for legInfo in legInfos { - legInfo.1.source = legInfo.0.0 - legInfo.1.destination = legInfo.0.1 + + let waypoints = directionsOptions.legSeparators //we don't want to name via points + let legInfo = zip(zip(waypoints.prefix(upTo: waypoints.endIndex - 1), waypoints.suffix(from: 1)), legs) + + for (endpoints, leg) in legInfo { + leg.source = endpoints.0 + leg.destination = endpoints.1 } accessToken = try container.decodeIfPresent(String.self, forKey: .accessToken) From 41e3d64828cf87018492f6323cd78defc35f78f2 Mon Sep 17 00:00:00 2001 From: Jerrad Thramer Date: Fri, 25 Oct 2019 15:11:34 -0600 Subject: [PATCH 15/89] Fixing CI test failures --- Sources/MapboxDirections/DirectionsProfileIdentifier.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Sources/MapboxDirections/DirectionsProfileIdentifier.swift b/Sources/MapboxDirections/DirectionsProfileIdentifier.swift index e76c50b0a..0d16a0876 100644 --- a/Sources/MapboxDirections/DirectionsProfileIdentifier.swift +++ b/Sources/MapboxDirections/DirectionsProfileIdentifier.swift @@ -13,7 +13,7 @@ public struct DirectionsProfileIdentifier: Codable, Equatable, Hashable, RawRepr public typealias StringLiteralType = String public typealias RawValue = String - public init(stringLiteral value: Self.StringLiteralType) { + public init(stringLiteral value: StringLiteralType) { self.init(rawValue: value) } From e08c4bc027c5f4db90e8cffbbcb85a514b4c2921 Mon Sep 17 00:00:00 2001 From: Jerrad Thramer Date: Fri, 25 Oct 2019 15:42:26 -0600 Subject: [PATCH 16/89] Fixing CI test failures --- Sources/MapboxDirections/MBVisualInstruction.swift | 2 +- Tests/MapboxDirectionsTests/DirectionsTests.swift | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Sources/MapboxDirections/MBVisualInstruction.swift b/Sources/MapboxDirections/MBVisualInstruction.swift index 4e3225bb7..075972e83 100644 --- a/Sources/MapboxDirections/MBVisualInstruction.swift +++ b/Sources/MapboxDirections/MBVisualInstruction.swift @@ -23,7 +23,7 @@ open class VisualInstruction: Codable { /** Additional directional information to clarify the maneuver type. */ - public dynamic var maneuverDirection: ManeuverDirection? + public var maneuverDirection: ManeuverDirection? /** A structured representation of the instruction. diff --git a/Tests/MapboxDirectionsTests/DirectionsTests.swift b/Tests/MapboxDirectionsTests/DirectionsTests.swift index aa10e3ba2..afbce5844 100644 --- a/Tests/MapboxDirectionsTests/DirectionsTests.swift +++ b/Tests/MapboxDirectionsTests/DirectionsTests.swift @@ -119,7 +119,7 @@ class DirectionsTests: XCTestCase { XCTAssertNil(routes, "Unexpected route response") XCTAssertNotNil(error, "No error returned") switch error { - case .invalidResponse: + case .invalidResponse?: break // pass default: XCTFail("Wrong type of error.") From 22feb9d2fb6686c55eaa0fb74724ad6a04c616f5 Mon Sep 17 00:00:00 2001 From: Jerrad Thramer Date: Fri, 25 Oct 2019 16:56:33 -0600 Subject: [PATCH 17/89] Fixing import issue --- Sources/MapboxDirections/MBComponentRepresentable.swift | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/Sources/MapboxDirections/MBComponentRepresentable.swift b/Sources/MapboxDirections/MBComponentRepresentable.swift index 017726cca..9886e6a81 100644 --- a/Sources/MapboxDirections/MBComponentRepresentable.swift +++ b/Sources/MapboxDirections/MBComponentRepresentable.swift @@ -1,7 +1,14 @@ import Foundation -import UIKit import CoreGraphics +#if os(OSX) +import Cocoa +#elseif os(watchOS) +import WatchKit +#else +import UIKit +#endif + /** The component representable protocol that comprises what the instruction banner should display. */ From 7bb96139f78552f68772fca200afd1bc8c70c905 Mon Sep 17 00:00:00 2001 From: Jerrad Thramer Date: Mon, 28 Oct 2019 16:42:01 -0600 Subject: [PATCH 18/89] hopefully fixing SPM issue once and for all --- Package.resolved | 9 +++++++++ Package.swift | 4 ++-- 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/Package.resolved b/Package.resolved index f29475a58..fc32f1dd0 100644 --- a/Package.resolved +++ b/Package.resolved @@ -9,6 +9,15 @@ "revision": "011fbc1b0f27a3398bd0fb7c5e2cf5c62ae82717", "version": "4.2.1" } + }, + { + "package": "Turf", + "repositoryURL": "https://github.com/mapbox/turf-swift.git", + "state": { + "branch": null, + "revision": "40079b9133402b1fd57a9845f8785cca19beb472", + "version": "0.3.0" + } } ] }, diff --git a/Package.swift b/Package.swift index 32a91ed58..f8e35ac80 100644 --- a/Package.swift +++ b/Package.swift @@ -15,14 +15,14 @@ let package = Package( dependencies: [ // Dependencies declare other packages that this package depends on. .package(url: "https://github.com/raphaelmor/Polyline.git", from: "4.2.1"), - .package(url: "https://github.com/mapbox/turf-swift.git", from: "0.2") + .package(url: "https://github.com/mapbox/turf-swift.git", from: "0.2.0") ], targets: [ // Targets are the basic building blocks of a package. A target can define a module or a test suite. // Targets can depend on other targets in this package, and on products in packages which this package depends on. .target( name: "MapboxDirections", - dependencies: ["Polyline"]), + dependencies: ["Polyline", "Turf"]), .testTarget( name: "MapboxDirectionsTests", dependencies: ["MapboxDirections"]), From 6baadd561d24cbd303a4b22a5f078b5e896998d1 Mon Sep 17 00:00:00 2001 From: Jerrad Thramer Date: Mon, 28 Oct 2019 17:01:29 -0600 Subject: [PATCH 19/89] Fixing build error --- Sources/MapboxDirections/MBRouteStep.swift | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/Sources/MapboxDirections/MBRouteStep.swift b/Sources/MapboxDirections/MBRouteStep.swift index 130712a6d..e68289040 100644 --- a/Sources/MapboxDirections/MBRouteStep.swift +++ b/Sources/MapboxDirections/MBRouteStep.swift @@ -413,10 +413,9 @@ open class RouteStep: Codable { if let coordinate = try? maneuver.decode(CLLocationCoordinate2D.self, forKey: .location) { maneuverLocation = coordinate - } else if let coordinate = try? maneuver.decode(UncertainCodable.self, forKey: .location).coordinates.first, - let maneuverCoordinate = coordinate { + } else if let coordinate = try? maneuver.decode(UncertainCodable.self, forKey: .location).coordinates.first { // V4 - maneuverLocation = maneuverCoordinate + maneuverLocation = coordinate } else { maneuverLocation = CLLocationCoordinate2D() } From eab78de93eb3a059fbb92a8ba850d782ef28b658 Mon Sep 17 00:00:00 2001 From: Jerrad Thramer Date: Tue, 29 Oct 2019 14:50:23 -0600 Subject: [PATCH 20/89] Clean-up --- Directions Example/ViewController.swift | 2 - .../MapboxDirections/MBDirectionsResult.swift | 17 +----- Sources/MapboxDirections/MBIntersection.swift | 2 - Sources/MapboxDirections/MBRouteOptions.swift | 39 ------------ Sources/MapboxDirections/MBRouteStep.swift | 2 +- Sources/MapboxDirections/Match/MBMatch.swift | 61 ------------------- .../MapboxDirections/Match/MBTracepoint.swift | 14 ----- .../RouteOptionsTests.swift | 1 - 8 files changed, 2 insertions(+), 136 deletions(-) diff --git a/Directions Example/ViewController.swift b/Directions Example/ViewController.swift index 583b1de53..c94c6bca2 100644 --- a/Directions Example/ViewController.swift +++ b/Directions Example/ViewController.swift @@ -65,8 +65,6 @@ class ViewController: UIViewController, MBDrawingViewDelegate { func setupDirections() { let wp1 = Waypoint(coordinate: CLLocationCoordinate2D(latitude: 38.9131752, longitude: -77.0324047), name: "Mapbox") let wp2 = Waypoint(coordinate: CLLocationCoordinate2D(latitude: 38.8977, longitude: -77.0365), name: "White House") -// wp1.allowsArrivingOnOppositeSide = false -// wp2.allowsArrivingOnOppositeSide = false let options = RouteOptions(waypoints: [wp1, wp2]) options.includesSteps = true diff --git a/Sources/MapboxDirections/MBDirectionsResult.swift b/Sources/MapboxDirections/MBDirectionsResult.swift index ef1a0cee8..f8fc25f91 100644 --- a/Sources/MapboxDirections/MBDirectionsResult.swift +++ b/Sources/MapboxDirections/MBDirectionsResult.swift @@ -3,16 +3,6 @@ import struct Polyline.Polyline import CoreLocation import struct Turf.LineString - - -//protocol DirectionsResult: Codable { -// var coordinates: [CLLocationCoordinate2D] { get } -// var legs: [RouteLeg] { get } -// var distance: CLLocationDistance { get } -// var expectedTravelTime: TimeInterval { get } -// var options: DirectionsOptions -//} - /** A `DirectionsResult` represents a result returned from either the Mapbox Directions service. @@ -132,9 +122,7 @@ open class DirectionsResult: Codable { This array may be `nil` or simplified depending on the `routeShapeResolution` property of the original `RouteOptions` object. Using the [Mapbox Maps SDK for iOS](https://docs.mapbox.com/ios/maps/) or [Mapbox Maps SDK for macOS](https://mapbox.github.io/mapbox-gl-native/macos/), you can create an `MGLPolyline` object using these coordinates to display an overview of the route on an `MGLMapView`. - */ - // public let coordinates: [CLLocationCoordinate2D]? - // + */ /** An array of `RouteLeg` objects representing the legs of the route. @@ -145,9 +133,6 @@ open class DirectionsResult: Codable { */ public let legs: [RouteLeg] - // open override var description: String { - // return legs.map { $0.name }.joined(separator: " – ") - // } // MARK: Getting Additional Route Details diff --git a/Sources/MapboxDirections/MBIntersection.swift b/Sources/MapboxDirections/MBIntersection.swift index 9ab93c9d9..f85a77a11 100644 --- a/Sources/MapboxDirections/MBIntersection.swift +++ b/Sources/MapboxDirections/MBIntersection.swift @@ -63,8 +63,6 @@ public struct Intersection: Codable { case approachIndex = "in" case outletIndex = "out" case lanes -// case approachLanes -// case usableApproachLanes case outletRoadClasses = "classes" } diff --git a/Sources/MapboxDirections/MBRouteOptions.swift b/Sources/MapboxDirections/MBRouteOptions.swift index dc4796e37..1649ba84a 100644 --- a/Sources/MapboxDirections/MBRouteOptions.swift +++ b/Sources/MapboxDirections/MBRouteOptions.swift @@ -47,15 +47,7 @@ open class RouteOptions: DirectionsOptions { private enum CodingKeys: String, CodingKey { case allowsUTurnAtWaypoint case includesAlternativeRoutes - // case includesSteps - // case shapeFormat - //case routeShapeResolution - // case attributeOptions case includesExitRoundaboutManeuver - // case locale - // case includesSpokenInstructions - //case distanceMeasurementSystem - //case includesVisualInstructions case roadClassesToAvoid } @@ -203,37 +195,6 @@ open class RouteOptions: DirectionsOptions { return params + super.urlQueryItems } - -// // MARK: NSCopying -// public func copy(with zone: NSZone? = nil) -> Any { -// let data = try! JSONEncoder().encode(self) -// return try! JSONDecoder().decode(RouteOptions.self, from: data) -// } -// -// //MARK: - OBJ-C Equality -// open override func isEqual(_ object: Any?) -> Bool { -// guard let opts = object as? RouteOptions else { return false } -// return isEqual(to: opts) -// } -// -// @objc(isEqualToRouteOptions:) -// open func isEqual(to routeOptions: RouteOptions?) -> Bool { -// guard let other = routeOptions else { return false } -// guard waypoints == other.waypoints, -// profileIdentifier == other.profileIdentifier, -// allowsUTurnAtWaypoint == other.allowsUTurnAtWaypoint, -// includesSteps == other.includesSteps, -// shapeFormat == other.shapeFormat, -// routeShapeResolution == other.routeShapeResolution, -// attributeOptions == other.attributeOptions, -// includesExitRoundaboutManeuver == other.includesExitRoundaboutManeuver, -// locale == other.locale, -// includesSpokenInstructions == other.includesSpokenInstructions, -// includesVisualInstructions == other.includesVisualInstructions, -// roadClassesToAvoid == other.roadClassesToAvoid, -// distanceMeasurementSystem == other.distanceMeasurementSystem else { return false } -// return true -// } } // MARK: Support for Directions API v4 diff --git a/Sources/MapboxDirections/MBRouteStep.swift b/Sources/MapboxDirections/MBRouteStep.swift index e68289040..e37cc5cb5 100644 --- a/Sources/MapboxDirections/MBRouteStep.swift +++ b/Sources/MapboxDirections/MBRouteStep.swift @@ -413,7 +413,7 @@ open class RouteStep: Codable { if let coordinate = try? maneuver.decode(CLLocationCoordinate2D.self, forKey: .location) { maneuverLocation = coordinate - } else if let coordinate = try? maneuver.decode(UncertainCodable.self, forKey: .location).coordinates.first { + } else if let coordinate = try? maneuver.decode(UncertainCodable.self, forKey: .location).coordinates.first { // V4 maneuverLocation = coordinate } else { diff --git a/Sources/MapboxDirections/Match/MBMatch.swift b/Sources/MapboxDirections/Match/MBMatch.swift index dd97221f4..58c42cdd2 100644 --- a/Sources/MapboxDirections/Match/MBMatch.swift +++ b/Sources/MapboxDirections/Match/MBMatch.swift @@ -11,14 +11,6 @@ extension CodingUserInfoKey { Typically, you do not create instances of this class directly. Instead, you receive match objects when you pass a `MatchOptions` object into the `Directions.calculate(_:completionHandler:)` or `Directions.calculateRoutes(matching:completionHandler:)` method. */ open class Match: DirectionsResult { - #warning("check this") -// init(matchOptions: MatchOptions, legs: [RouteLeg], tracepoints: [Tracepoint], distance: CLLocationDistance, expectedTravelTime: TimeInterval, coordinates: [CLLocationCoordinate2D]?, confidence: Float, speechLocale: Locale?, waypointIndices: IndexSet) { -// self.confidence = confidence -// self.tracepoints = tracepoints -// self.waypointIndices = waypointIndices -// super.init(legs: legs, distance: distance, expectedTravelTime: expectedTravelTime, coordinates: coordinates, speechLocale: speechLocale, options: matchOptions) -// } - private enum CodingKeys: String, CodingKey { case confidence case tracepoints @@ -40,35 +32,6 @@ open class Match: DirectionsResult { try super.encode(to: encoder) } -// /** -// Initializes a new match object with the given JSON dictionary representation and tracepoints. -// -// - parameter json: A JSON dictionary representation of the route as returned by the Mapbox Map Matching API. -// - parameter tracepoints: An array of `Tracepoint` that the match found in order. -// - parameter matchOptions: The `MatchOptions` used to create the request. -// */ -// public convenience init(json: [String: Any], tracepoints: [Tracepoint], waypointIndices: IndexSet, matchOptions: MatchOptions) { -// let legInfo = zip(zip(tracepoints.prefix(upTo: tracepoints.endIndex - 1), tracepoints.suffix(from: 1)), -// json["legs"] as? [JSONDictionary] ?? []) -// let legs = legInfo.map { (endpoints, json) -> RouteLeg in -// return RouteLeg(json: json, source: endpoints.0, destination: endpoints.1, options: RouteOptions(matchOptions: matchOptions)) -// } -// -// let distance = json["distance"] as! Double -// let expectedTravelTime = json["duration"] as! Double -// -// let coordinates = matchOptions.shapeFormat.coordinates(from: json["geometry"]) -// -// let confidence = (json["confidence"] as! NSNumber).floatValue -// -// var speechLocale: Locale? -// if let locale = json["voiceLocale"] as? String { -// speechLocale = Locale(identifier: locale) -// } -// -// self.init(matchOptions: matchOptions, legs: legs, tracepoints: tracepoints, distance: distance, expectedTravelTime: expectedTravelTime, coordinates: coordinates, confidence: confidence, speechLocale: speechLocale, waypointIndices: waypointIndices) -// } - /** A number between 0 and 1 that indicates the Map Matching API’s confidence that the match is accurate. A higher confidence means the match is more likely to be accurate. */ @@ -90,28 +53,4 @@ open class Match: DirectionsResult { `MatchOptions` used to create the match request. */ public let matchOptions: MatchOptions - -// public required init?(coder decoder: NSCoder) { -// confidence = decoder.decodeFloat(forKey: "confidence") -// -// guard let tracepoints = decoder.decodeObject(of: [NSArray.self, Tracepoint.self], forKey: "tracepoints") as? [Tracepoint] else { -// return nil -// } -// self.tracepoints = tracepoints -// -// waypointIndices = decoder.decodeObject(of: NSIndexSet.self, forKey: "waypointIndices") as IndexSet? -// -// super.init(coder: decoder) -// } -// -// override public class var supportsSecureCoding: Bool { -// return true -// } - -// public override func encode(with coder: NSCoder) { -// coder.encode(confidence, forKey: "confidence") -// coder.encode(tracepoints, forKey: "tracepoints") -// coder.encode(waypointIndices, forKey: "waypointIndices") -// super.encode(with: coder) -// } } diff --git a/Sources/MapboxDirections/Match/MBTracepoint.swift b/Sources/MapboxDirections/Match/MBTracepoint.swift index 3d41ec895..086ef0d32 100644 --- a/Sources/MapboxDirections/Match/MBTracepoint.swift +++ b/Sources/MapboxDirections/Match/MBTracepoint.swift @@ -34,20 +34,6 @@ public class Tracepoint: Waypoint { try container.encode(alternateCount, forKey: .alternateCount) try super.encode(to: encoder) } - - -// // MARK: Objective-C equality -// open override func isEqual(_ object: Any?) -> Bool { -// guard let opts = object as? Tracepoint else { return false } -// return isEqual(to: opts) -// } -// -// -// open func isEqual(to other: Tracepoint?) -> Bool { -// guard let other = other else { return false } -// return super.isEqual(to: other) && type(of: self) == type(of: other) && -// alternateCount == other.alternateCount -// } } extension Tracepoint { //Equatable diff --git a/Tests/MapboxDirectionsTests/RouteOptionsTests.swift b/Tests/MapboxDirectionsTests/RouteOptionsTests.swift index 26242b61b..a640835bb 100644 --- a/Tests/MapboxDirectionsTests/RouteOptionsTests.swift +++ b/Tests/MapboxDirectionsTests/RouteOptionsTests.swift @@ -120,7 +120,6 @@ class RouteOptionsTests: XCTestCase { destination.targetCoordinate = CLLocationCoordinate2D(latitude: 39.13115, longitude: -84.51619) let options = RouteOptions(waypoints: [origin, destination]) XCTAssertEqual(options.coordinates, "-84.47182,39.15031;-84.51638,39.12971") -// XCTFail("Get the path") XCTAssertTrue(options.urlQueryItems.contains(URLQueryItem(name: "waypoint_names", value: "XU;UC"))) XCTAssertTrue(options.urlQueryItems.contains(URLQueryItem(name: "waypoint_targets", value: ";-84.51619,39.13115"))) } From f3c7ed5010e5050264e0c5e35f55d4b017a0fbc4 Mon Sep 17 00:00:00 2001 From: Jerrad Thramer Date: Tue, 29 Oct 2019 14:56:19 -0600 Subject: [PATCH 21/89] fixing issues with protection level re: OptionSets --- .../MapboxDirections/AttributeOptions.swift | 8 +- .../MapboxDirections/MBLaneIndication.swift | 16 +-- Sources/MapboxDirections/MBRouteLeg.swift | 105 ------------------ Sources/MapboxDirections/RoadClasses.swift | 10 +- 4 files changed, 17 insertions(+), 122 deletions(-) diff --git a/Sources/MapboxDirections/AttributeOptions.swift b/Sources/MapboxDirections/AttributeOptions.swift index d90d0134c..e34ba1dd9 100644 --- a/Sources/MapboxDirections/AttributeOptions.swift +++ b/Sources/MapboxDirections/AttributeOptions.swift @@ -16,21 +16,21 @@ public struct AttributeOptions: OptionSet, CustomStringConvertible{ When this attribute is specified, the `RouteLeg.segmentDistances` property contains one value for each segment in the leg’s full geometry. */ - static let distance = AttributeOptions(rawValue: 1 << 1) + public static let distance = AttributeOptions(rawValue: 1 << 1) /** Expected travel time (in seconds) along the segment. When this attribute is specified, the `RouteLeg.expectedSegmentTravelTimes` property contains one value for each segment in the leg’s full geometry. */ - static let expectedTravelTime = AttributeOptions(rawValue: 1 << 2) + public static let expectedTravelTime = AttributeOptions(rawValue: 1 << 2) /** Current average speed (in meters per second) along the segment. When this attribute is specified, the `RouteLeg.segmentSpeeds` property contains one value for each segment in the leg’s full geometry. */ - static let speed = AttributeOptions(rawValue: 1 << 3) + public static let speed = AttributeOptions(rawValue: 1 << 3) /** Traffic congestion level along the segment. @@ -39,7 +39,7 @@ public struct AttributeOptions: OptionSet, CustomStringConvertible{ This attribute requires `MBDirectionsProfileIdentifierAutomobileAvoidingTraffic`. Any other profile identifier produces `CongestionLevel.unknown` for each segment along the route. */ - static let congestionLevel = AttributeOptions(rawValue: 1 << 4) + public static let congestionLevel = AttributeOptions(rawValue: 1 << 4) /** diff --git a/Sources/MapboxDirections/MBLaneIndication.swift b/Sources/MapboxDirections/MBLaneIndication.swift index f9ac72ffa..18042fb3b 100644 --- a/Sources/MapboxDirections/MBLaneIndication.swift +++ b/Sources/MapboxDirections/MBLaneIndication.swift @@ -12,28 +12,28 @@ public struct LaneIndication: OptionSet, CustomStringConvertible, Codable { public typealias RawValue = Int /// Indicates a sharp turn to the right. - static let sharpRight = LaneIndication(rawValue: 1 << 1) + public static let sharpRight = LaneIndication(rawValue: 1 << 1) /// Indicates a turn to the right. - static let right = LaneIndication(rawValue: 1 << 2) + public static let right = LaneIndication(rawValue: 1 << 2) /// Indicates a turn to the right. - static let slightRight = LaneIndication(rawValue: 1 << 3) + public static let slightRight = LaneIndication(rawValue: 1 << 3) /// Indicates no turn. - static let straightAhead = LaneIndication(rawValue: 1 << 4) + public static let straightAhead = LaneIndication(rawValue: 1 << 4) /// Indicates a slight turn to the left. - static let slightLeft = LaneIndication(rawValue: 1 << 5) + public static let slightLeft = LaneIndication(rawValue: 1 << 5) /// Indicates a turn to the left. - static let left = LaneIndication(rawValue: 1 << 6) + public static let left = LaneIndication(rawValue: 1 << 6) /// Indicates a sharp turn to the left. - static let sharpLeft = LaneIndication(rawValue: 1 << 7) + public static let sharpLeft = LaneIndication(rawValue: 1 << 7) /// Indicates a U-turn. - static let uTurn = LaneIndication(rawValue: 1 << 8) + public static let uTurn = LaneIndication(rawValue: 1 << 8) /** diff --git a/Sources/MapboxDirections/MBRouteLeg.swift b/Sources/MapboxDirections/MBRouteLeg.swift index 82dedb164..80e6d814b 100644 --- a/Sources/MapboxDirections/MBRouteLeg.swift +++ b/Sources/MapboxDirections/MBRouteLeg.swift @@ -67,111 +67,6 @@ open class RouteLeg: Codable { try annotation.encode(segmentCongestionLevels, forKey: .segmentCongestionLevels) } - -// // MARK: Creating a Leg -// -// internal init(steps: [RouteStep], json: JSONDictionary, source: Waypoint, destination: Waypoint, options: RouteOptions) { -// self.source = source -// self.destination = destination -// self.profileIdentifier = options.profileIdentifier -// self.steps = steps -// distance = json["distance"] as! Double -// expectedTravelTime = json["duration"] as! Double -// self.name = json["summary"] as! String -// -// var segmentDistances: [CLLocationDistance]? -// var expectedSegmentTravelTimes: [TimeInterval]? -// var segmentSpeeds: [CLLocationSpeed]? -// var congestionLevels: [CongestionLevel]? -// -// if let jsonAttributes = json["annotation"] as? [String: Any] { -// if let distance = jsonAttributes["distance"] { -// segmentDistances = distance as? [CLLocationDistance] -// } -// if let duration = jsonAttributes["duration"] { -// expectedSegmentTravelTimes = duration as? [TimeInterval] ?? [] -// } -// if let speed = jsonAttributes["speed"] { -// segmentSpeeds = speed as? [CLLocationSpeed] ?? [] -// } -// if let congestion = jsonAttributes["congestion"] as? [String] { -// congestionLevels = congestion.map { -// #warning("derail") -// return CongestionLevel(rawValue: $0)! -// } -// } -// } -// -// self.segmentDistances = segmentDistances -// self.expectedSegmentTravelTimes = expectedSegmentTravelTimes -// self.segmentSpeeds = segmentSpeeds -// self.segmentCongestionLevels = congestionLevels -// } -// -// /** -// Initializes a new route leg object with the given JSON dictionary representation and waypoints. -// -// Normally, you do not create instances of this class directly. Instead, you receive route leg objects as part of route objects when you request directions using the `Directions.calculateDirections(options:completionHandler:)` method. -// -// - parameter json: A JSON dictionary representation of a route leg object as returnd by the Mapbox Directions API. -// - parameter source: The waypoint at the beginning of the leg. -// - parameter destination: The waypoint at the end of the leg. -// - parameter options: The options used when requesting the route. -// */ -// -// public convenience init(json: [String: Any], source: Waypoint, destination: Waypoint, options: RouteOptions) { -// let steps = (json["steps"] as? [JSONDictionary] ?? []).map { RouteStep(json: $0, options: options) } -// self.init(steps: steps, json: json, source: source, destination: destination, options: options) -// } -// -// public required init?(coder decoder: NSCoder) { -// guard let decodedSource = decoder.decodeObject(of: Waypoint.self, forKey: "source") else { -// return nil -// } -// source = decodedSource -// -// guard let decodedDestination = decoder.decodeObject(of: Waypoint.self, forKey: "destination") else { -// return nil -// } -// destination = decodedDestination -// -// steps = decoder.decodeObject(of: [NSArray.self, RouteStep.self], forKey: "steps") as? [RouteStep] ?? [] -// -// guard let decodedName = decoder.decodeObject(of: NSString.self, forKey: "name") as String? else { -// return nil -// } -// name = decodedName -// -// distance = decoder.decodeDouble(forKey: "distance") -// expectedTravelTime = decoder.decodeDouble(forKey: "expectedTravelTime") -// -// guard let decodedProfileIdentifier = decoder.decodeObject(of: NSString.self, forKey: "profileIdentifier") as String? else { -// return nil -// } -// -// profileIdentifier = DirectionsProfileIdentifier(rawValue: decodedProfileIdentifier) -// -// segmentDistances = decoder.decodeObject(of: [NSArray.self, NSNumber.self], forKey: "segmentDistances") as? [CLLocationDistance] -// expectedSegmentTravelTimes = decoder.decodeObject(of: [NSArray.self, NSNumber.self], forKey: "expectedSegmentTravelTimes") as? [TimeInterval] -// segmentSpeeds = decoder.decodeObject(of: [NSArray.self, NSNumber.self], forKey: "segmentSpeeds") as? [CLLocationSpeed] -// segmentCongestionLevels = decoder.decodeObject(of: [NSArray.self, NSNumber.self], forKey: "segmentCongestionLevels") as? [CongestionLevel] -// } -// -// public static var supportsSecureCoding = true -// -// public func encode(with coder: NSCoder) { -// coder.encode(source, forKey: "source") -// coder.encode(destination, forKey: "destination") -// coder.encode(steps, forKey: "steps") -// coder.encode(name, forKey: "name") -// coder.encode(distance, forKey: "distance") -// coder.encode(expectedTravelTime, forKey: "expectedTravelTime") -// coder.encode(profileIdentifier, forKey: "profileIdentifier") -// coder.encode(segmentDistances, forKey: "segmentDistances") -// coder.encode(expectedSegmentTravelTimes, forKey: "expectedSegmentTravelTimes") -// coder.encode(segmentSpeeds, forKey: "segmentSpeeds") -// coder.encode(segmentCongestionLevels, forKey: "segmentCongestionLevels") -// } // MARK: Getting the Leg Geometry diff --git a/Sources/MapboxDirections/RoadClasses.swift b/Sources/MapboxDirections/RoadClasses.swift index cc90ee44a..97cfc7ed3 100644 --- a/Sources/MapboxDirections/RoadClasses.swift +++ b/Sources/MapboxDirections/RoadClasses.swift @@ -29,21 +29,21 @@ public struct RoadClasses: OptionSet, Codable, CustomStringConvertible { /** The road segment is [tolled](https://wiki.openstreetmap.org/wiki/Key:toll). */ - static let toll = RoadClasses(rawValue: 1 << 1) + public static let toll = RoadClasses(rawValue: 1 << 1) /** The road segment has access restrictions. A road segment may have this class if there are [general access restrictions](https://wiki.openstreetmap.org/wiki/Key:access) or a [high-occupancy vehicle](https://wiki.openstreetmap.org/wiki/Key:hov) restriction. */ - static let restricted = RoadClasses(rawValue: 1 << 2) + public static let restricted = RoadClasses(rawValue: 1 << 2) /** The road segment is a [freeway](https://wiki.openstreetmap.org/wiki/Tag:highway%3Dmotorway) or [freeway ramp](https://wiki.openstreetmap.org/wiki/Tag:highway%3Dmotorway_link). It may be desirable to suppress the name of the freeway when giving instructions and give instructions at fixed distances before an exit (such as 1 mile or 1 kilometer ahead). */ - static let motorway = RoadClasses(rawValue: 1 << 3) + public static let motorway = RoadClasses(rawValue: 1 << 3) /** The user must travel this segment of the route by ferry. @@ -52,12 +52,12 @@ public struct RoadClasses: OptionSet, Codable, CustomStringConvertible { In general, the transport type of the step containing the road segment is also `TransportType.ferry`. */ - static let ferry = RoadClasses(rawValue: 1 << 4) + public static let ferry = RoadClasses(rawValue: 1 << 4) /** The user must travel this segment of the route through a [tunnel](https://wiki.openstreetmap.org/wiki/Key:tunnel). */ - static let tunnel = RoadClasses(rawValue: 1 << 5) + public static let tunnel = RoadClasses(rawValue: 1 << 5) From f916f833f9e2fa6715c7c3fbd088de15f9caba6d Mon Sep 17 00:00:00 2001 From: Jerrad Thramer Date: Tue, 29 Oct 2019 15:14:26 -0600 Subject: [PATCH 22/89] Adding protocol scheme that allows nav to extend DirectionsError --- .../MapboxDirections/DirectionsError.swift | 7 ++- Sources/MapboxDirections/MBDirections.swift | 52 ++++++++++++------- 2 files changed, 38 insertions(+), 21 deletions(-) diff --git a/Sources/MapboxDirections/DirectionsError.swift b/Sources/MapboxDirections/DirectionsError.swift index 3ff6b0764..4a603b1a3 100644 --- a/Sources/MapboxDirections/DirectionsError.swift +++ b/Sources/MapboxDirections/DirectionsError.swift @@ -2,7 +2,12 @@ import Foundation import CoreLocation -public enum DirectionsError: Error, RawRepresentable, Equatable { +public protocol DirectionsError: Error { + var failureReason: String { get } + var recoverySuggestion: String { get } +} + +public enum MapboxDirectionsError: DirectionsError, RawRepresentable, Equatable { public init?(rawValue: String) { assertionFailure("Do not use init(rawValue:) for DirectionsError.") return nil diff --git a/Sources/MapboxDirections/MBDirections.swift b/Sources/MapboxDirections/MBDirections.swift index 358eeb4e5..cf946fc6b 100644 --- a/Sources/MapboxDirections/MBDirections.swift +++ b/Sources/MapboxDirections/MBDirections.swift @@ -89,6 +89,14 @@ open class Directions: NSObject { */ public typealias MatchCompletionHandler = (_ matches: [Match]?, _ error: DirectionsError?) -> Void + + ///:nodoc: + typealias MapboxRouteCompletionHandler = (_ waypoints: [Waypoint]?, _ routes: [Route]?, _ error: MapboxDirectionsError?) -> Void + + ///:nodoc: + typealias MapboxMatchCompletionHandler = (_ matches: [Match]?, _ error: MapboxDirectionsError?) -> Void + + // MARK: Creating a Directions Object /** @@ -158,24 +166,26 @@ open class Directions: NSObject { - returns: The data task used to perform the HTTP request. If, while waiting for the completion handler to execute, you no longer want the resulting routes, cancel this task. */ + @discardableResult open func calculate(_ options: RouteOptions, completionHandler: @escaping RouteCompletionHandler) -> URLSessionDataTask { + let completion = completionHandler as MapboxRouteCompletionHandler let fetchStart = Date() let request = urlRequest(forCalculating: options) let requestTask = URLSession.shared.dataTask(with: request) { (possibleData, possibleResponse, possibleError) in let responseEndDate = Date() guard let response = possibleResponse, ["application/json", "text/html"].contains(response.mimeType) else { - completionHandler(nil, nil, .invalidResponse) + completion(nil, nil, .invalidResponse) return } guard let data = possibleData else { - completionHandler(nil, nil, .noData) + completion(nil, nil, .noData) return } if let error = possibleError { - completionHandler(nil, nil, .unknown(response: possibleResponse, underlying: error, code: nil, message: nil)) + completion(nil, nil, .unknown(response: possibleResponse, underlying: error, code: nil, message: nil)) return } @@ -185,24 +195,24 @@ open class Directions: NSObject { let result = try decoder.decode(RouteResponse.self, from: data) guard (result.code == nil && result.message == nil) || result.code == "Ok" else { let apiError = Directions.informativeError(code: result.code, message: result.message, response: response, underlyingError: possibleError) - completionHandler(nil, nil, apiError) + completion(nil, nil, apiError) return } guard let routes = result.routes else { - completionHandler(result.waypoints, nil, .unableToRoute) + completion(result.waypoints, nil, .unableToRoute) return } self.postprocess(routes, fetchStartDate: fetchStart, responseEndDate: responseEndDate, uuid: result.uuid) DispatchQueue.main.async { - completionHandler(result.waypoints, routes, nil) + completion(result.waypoints, routes, nil) } } catch { DispatchQueue.main.async { let bailError = Directions.informativeError(code: nil, message: nil, response: response, underlyingError: error) - completionHandler(nil, nil, bailError) + completion(nil, nil, bailError) } } @@ -231,23 +241,24 @@ open class Directions: NSObject { */ @discardableResult open func calculate(_ options: MatchOptions, completionHandler: @escaping MatchCompletionHandler) -> URLSessionDataTask { + let completion = completionHandler as MapboxMatchCompletionHandler let fetchStart = Date() let request = urlRequest(forCalculating: options) let requestTask = URLSession.shared.dataTask(with: request) { (possibleData, possibleResponse, possibleError) in let responseEndDate = Date() guard let response = possibleResponse, response.mimeType == "application/json" else { - completionHandler(nil, .invalidResponse) + completion(nil, .invalidResponse) return } guard let data = possibleData else { - completionHandler(nil, .noData) + completion(nil, .noData) return } if let error = possibleError { - completionHandler(nil, .unknown(response: possibleResponse, underlying: error, code: nil, message: nil)) + completion(nil, .unknown(response: possibleResponse, underlying: error, code: nil, message: nil)) return } @@ -257,23 +268,23 @@ open class Directions: NSObject { let result = try decoder.decode(MatchResponse.self, from: data) guard result.code == "Ok" else { let apiError = Directions.informativeError(code: result.code, message: result.message, response: response, underlyingError: possibleError) - completionHandler(nil, apiError) + completion(nil, apiError) return } guard let matches = result.matches else { - completionHandler(nil, .unableToRoute) + completion(nil, .unableToRoute) return } self.postprocess(matches, fetchStartDate: fetchStart, responseEndDate: responseEndDate, uuid: nil) DispatchQueue.main.async { - completionHandler(matches, nil) + completion(matches, nil) } } catch { DispatchQueue.main.async { - completionHandler(nil, .unknown(response: response, underlying: error, code: nil, message: nil)) + completion(nil, .unknown(response: response, underlying: error, code: nil, message: nil)) } } @@ -300,23 +311,24 @@ open class Directions: NSObject { */ @discardableResult open func calculateRoutes(matching options: MatchOptions, completionHandler: @escaping RouteCompletionHandler) -> URLSessionDataTask { + let completion = completionHandler as MapboxRouteCompletionHandler let fetchStart = Date() let request = urlRequest(forCalculating: options) let requestTask = URLSession.shared.dataTask(with: request) { (possibleData, possibleResponse, possibleError) in let responseEndDate = Date() guard let response = possibleResponse, response.mimeType == "application/json" else { - completionHandler(nil, nil, .invalidResponse) + completion(nil, nil, .invalidResponse) return } guard let data = possibleData else { - completionHandler(nil, nil, .noData) + completion(nil, nil, .noData) return } if let error = possibleError { - completionHandler(nil, nil, .unknown(response: possibleResponse, underlying: error, code: nil, message: nil)) + completion(nil, nil, .unknown(response: possibleResponse, underlying: error, code: nil, message: nil)) return } @@ -331,7 +343,7 @@ open class Directions: NSObject { } guard let routes = result.routes else { - completionHandler(result.waypoints, nil, .unableToRoute) + completion(result.waypoints, nil, .unableToRoute) return } @@ -342,7 +354,7 @@ open class Directions: NSObject { } } catch { DispatchQueue.main.async { - completionHandler(nil, nil, .unknown(response: response, underlying: error, code: nil, message: nil)) + completion(nil, nil, .unknown(response: response, underlying: error, code: nil, message: nil)) } } @@ -426,7 +438,7 @@ open class Directions: NSObject { /** Returns an error that supplements the given underlying error with additional information from the an HTTP response’s body or headers. */ - static func informativeError(code: String?, message: String?, response: URLResponse?, underlyingError error: Error?) -> DirectionsError { + static func informativeError(code: String?, message: String?, response: URLResponse?, underlyingError error: Error?) -> MapboxDirectionsError { if let response = response as? HTTPURLResponse { switch (response.statusCode, code ?? "") { case (200, "NoRoute"): From 01fae5ee723398a15ab0fe421b2bf8204ac886c0 Mon Sep 17 00:00:00 2001 From: Jerrad Thramer Date: Tue, 29 Oct 2019 17:14:07 -0600 Subject: [PATCH 23/89] WIP: Implementing Equatable --- .../MapboxDirections/Extensions/Codable.swift | 7 +- .../MBComponentRepresentable.swift | 77 ++++++++++++++--- Sources/MapboxDirections/MBIntersection.swift | 17 +++- Sources/MapboxDirections/MBLane.swift | 2 +- .../MBLaneIndicationComponent.swift | 23 ++--- Sources/MapboxDirections/MBRouteLeg.swift | 20 ++++- Sources/MapboxDirections/MBRouteStep.swift | 31 ++++++- .../MBSpokenInstruction.swift | 10 ++- .../MBVisualInstruction.swift | 21 +++-- .../MBVisualInstructionBanner.swift | 85 +++---------------- .../MBVisualInstructionComponent.swift | 12 ++- 11 files changed, 182 insertions(+), 123 deletions(-) diff --git a/Sources/MapboxDirections/Extensions/Codable.swift b/Sources/MapboxDirections/Extensions/Codable.swift index 357a3f02b..42c4aa5fc 100644 --- a/Sources/MapboxDirections/Extensions/Codable.swift +++ b/Sources/MapboxDirections/Extensions/Codable.swift @@ -15,7 +15,7 @@ extension Decodable { } } -struct UncertainCodable: Codable { +struct UncertainCodable: Codable, Equatable { var t: T? var u: U? @@ -43,6 +43,7 @@ struct UncertainCodable: Codable { } self.options = options + let container = try decoder.singleValueContainer() t = try? container.decode(T.self) if t == nil { @@ -63,3 +64,7 @@ struct UncertainCodable: Codable { } extension String: Error {} + + +public StepGeometry +// make this a varient transform that's used instead of MBDirectionsResult:38-55, do equatable here, have computed property `shape` that always returns a Polyline no matter the backing data diff --git a/Sources/MapboxDirections/MBComponentRepresentable.swift b/Sources/MapboxDirections/MBComponentRepresentable.swift index 9886e6a81..eb959bed5 100644 --- a/Sources/MapboxDirections/MBComponentRepresentable.swift +++ b/Sources/MapboxDirections/MBComponentRepresentable.swift @@ -12,11 +12,58 @@ import UIKit /** The component representable protocol that comprises what the instruction banner should display. */ +public enum Component: Equatable { + public static func == (lhs: Component, rhs: Component) -> Bool { + switch lhs { + case let .lane(left): + switch rhs { + case let .lane(right): + return left == right + default: + return false + } + case let .visual(left): + switch rhs { + case let .visual(right): + return left == right + default: + return false + } + } + } + + case lane(_ component: LaneIndicationComponent) + case visual(_ component: VisualInstructionComponent) + + +} +//public typealias ComponentRepresentable = Representable & Equatable +//public protocol Representable: class { +// +//} + +//public struct SomeRepreentable: Representable, Equatable { +// +//} + +//public extension ComponentRepresentable { +// static func == (lhs: Self, rhs: Self) -> Bool { +// +// } +//} + +//public extension Equatable where Self: ComponentRepresentable { +// public static func == (lhs: ComponentRepresentable, rhs: ComponentRepresentable) -> Bool { +// +// } +//} -public protocol ComponentRepresentable: class { } +//public func == (lhs: ComponentRepresentable, rhs: ComponentRepresentable) -> Bool { +// +//} -internal struct Component: Codable { - let component: ComponentRepresentable +internal struct ComponentSerializer: Codable { + let component: Component private enum CodingKeys: String, CodingKey { case type @@ -28,24 +75,24 @@ internal struct Component: Codable { case directions case isActive = "active" } - init(component: ComponentRepresentable) { + init(component: Component) { self.component = component } func encode(to encoder: Encoder) throws { var container = encoder.container(keyedBy: CodingKeys.self) - if let lane = component as? LaneIndicationComponent { + switch component { + case let .lane(lane): try container.encode(lane.indications, forKey: .directions) try container.encode(lane.isUsable, forKey: .isActive) try container.encode(VisualInstructionComponentType.lane, forKey: .type) - } else if let instruction = component as? VisualInstructionComponent { - try container.encodeIfPresent(instruction.text, forKey: .text) - try container.encodeIfPresent(instruction.abbreviation, forKey: .abbreviatedText) - try container.encodeIfPresent(instruction.abbreviationPriority, forKey: .abbreviatedTextPriority) - try container.encodeIfPresent(instruction.imageURL, forKey: .imageURL) - try container.encode(instruction.type, forKey: .type) - + case let .visual(instruction): + try container.encodeIfPresent(instruction.text, forKey: .text) + try container.encodeIfPresent(instruction.abbreviation, forKey: .abbreviatedText) + try container.encodeIfPresent(instruction.abbreviationPriority, forKey: .abbreviatedTextPriority) + try container.encodeIfPresent(instruction.imageURL, forKey: .imageURL) + try container.encode(instruction.type, forKey: .type) } } @@ -57,7 +104,8 @@ internal struct Component: Codable { case .lane: let indications = try container.decode(LaneIndication.self, forKey: .directions) let isUsable = try container.decode(Bool.self, forKey: .isActive) - component = LaneIndicationComponent(indications: indications, isUsable: isUsable) + let comp = LaneIndicationComponent(indications: indications, isUsable: isUsable) + component = .lane(comp) default: let text = try container.decode(String.self, forKey: .text) let abbreviatedText = try container.decodeIfPresent(String.self, forKey: .abbreviatedText) @@ -77,7 +125,8 @@ internal struct Component: Codable { imageURL = URL(string: "\(imageBaseURL)@\(Int(scale))x.png") } let abbreviationPriority = try container.decodeIfPresent(Int.self, forKey: .abbreviatedTextPriority) - component = VisualInstructionComponent(type: type, text: text, imageURL: imageURL, abbreviation: abbreviatedText, abbreviationPriority: abbreviationPriority) + let comp = VisualInstructionComponent(type: type, text: text, imageURL: imageURL, abbreviation: abbreviatedText, abbreviationPriority: abbreviationPriority) + component = .visual(comp) } } diff --git a/Sources/MapboxDirections/MBIntersection.swift b/Sources/MapboxDirections/MBIntersection.swift index f85a77a11..612601946 100644 --- a/Sources/MapboxDirections/MBIntersection.swift +++ b/Sources/MapboxDirections/MBIntersection.swift @@ -3,7 +3,8 @@ import Foundation /** A single cross street along a step. */ -public struct Intersection: Codable { +public struct Intersection: Codable, Equatable { + /** The geographic coordinates at the center of the intersection. */ @@ -137,4 +138,18 @@ public struct Intersection: Codable { outletIndex = try container.decodeIfPresent(Int.self, forKey: .outletIndex) ?? -1 approachIndex = try container.decodeIfPresent(Int.self, forKey: .approachIndex) ?? -1 } + + //MARK: - Equatable + + public static func == (lhs: Intersection, rhs: Intersection) -> Bool { + return lhs.location == rhs.location && + lhs.headings == rhs.headings && + lhs.outletIndexes == rhs.outletIndexes && + lhs.approachIndex == rhs.approachIndex && + lhs.outletIndex == rhs.outletIndex && + lhs.approachLanes == rhs.approachLanes && + lhs.usableApproachLanes == rhs.usableApproachLanes && + lhs.outletRoadClasses == rhs.outletRoadClasses + } + } diff --git a/Sources/MapboxDirections/MBLane.swift b/Sources/MapboxDirections/MBLane.swift index bce833f31..469711b5c 100644 --- a/Sources/MapboxDirections/MBLane.swift +++ b/Sources/MapboxDirections/MBLane.swift @@ -3,7 +3,7 @@ import Foundation /** A lane on the road approaching an intersection. */ -public struct Lane: Codable { +public struct Lane: Codable, Equatable { /** The lane indications specifying the maneuvers that may be executed from the lane. */ diff --git a/Sources/MapboxDirections/MBLaneIndicationComponent.swift b/Sources/MapboxDirections/MBLaneIndicationComponent.swift index 9dbe75600..45e9ce777 100644 --- a/Sources/MapboxDirections/MBLaneIndicationComponent.swift +++ b/Sources/MapboxDirections/MBLaneIndicationComponent.swift @@ -6,7 +6,7 @@ A component that represents a lane representation of an instruction. */ -open class LaneIndicationComponent: NSObject, ComponentRepresentable { +open class LaneIndicationComponent: Equatable { /** An array indicating which directions you can go from a lane (left, right, or straight). @@ -22,8 +22,6 @@ open class LaneIndicationComponent: NSObject, ComponentRepresentable { */ public var isUsable: Bool = false - public static var supportsSecureCoding: Bool = true - /** Initializes a new visual instruction component object that displays the given information. @@ -35,20 +33,9 @@ open class LaneIndicationComponent: NSObject, ComponentRepresentable { self.isUsable = isUsable } - public required init?(coder decoder: NSCoder) { - guard let directions = decoder.decodeObject(of: [NSArray.self, NSString.self], forKey: "indications") as? [String], let indications = LaneIndication(descriptions: directions) else { - return nil - } - self.indications = indications - - guard let isUsable = decoder.decodeObject(forKey: "isUsable") as? Bool else { - return nil - } - self.isUsable = isUsable - } - - public func encode(with coder: NSCoder) { - coder.encode(indications.description, forKey: "indications") - coder.encode(isUsable, forKey: "isUsable") + // MARK: - Codable + public static func == (lhs: LaneIndicationComponent, rhs: LaneIndicationComponent) -> Bool { + return lhs.indications == rhs.indications && + lhs.isUsable == rhs.isUsable } } diff --git a/Sources/MapboxDirections/MBRouteLeg.swift b/Sources/MapboxDirections/MBRouteLeg.swift index 80e6d814b..f0e050cb0 100644 --- a/Sources/MapboxDirections/MBRouteLeg.swift +++ b/Sources/MapboxDirections/MBRouteLeg.swift @@ -10,8 +10,8 @@ import Polyline */ -open class RouteLeg: Codable { - +open class RouteLeg: Codable, Equatable { + public enum CodingKeys: String, CodingKey { case source case destination @@ -164,4 +164,20 @@ open class RouteLeg: Codable { The value of this property is `MBDirectionsProfileIdentifierAutomobile`, `MBDirectionsProfileIdentifierAutomobileAvoidingTraffic`, `MBDirectionsProfileIdentifierCycling`, or `MBDirectionsProfileIdentifierWalking`, depending on the `profileIdentifier` property of the original `RouteOptions` object. This property reflects the primary mode of transportation used for the route leg. Individual steps along the route leg might use different modes of transportation as necessary. */ public let profileIdentifier: DirectionsProfileIdentifier + + // MARK: - Equatable Conformance + + public static func == (lhs: RouteLeg, rhs: RouteLeg) -> Bool { + return lhs.source == rhs.source && + lhs.destination == rhs.destination && + lhs.steps == rhs.steps && + lhs.segmentDistances == rhs.segmentDistances && + lhs.expectedSegmentTravelTimes == rhs.expectedSegmentTravelTimes && + lhs.segmentSpeeds == rhs.segmentSpeeds && + lhs.segmentCongestionLevels == rhs.segmentCongestionLevels && + lhs.name == rhs.name && + lhs.distance == rhs.distance && + lhs.expectedTravelTime == rhs.expectedTravelTime && + lhs.profileIdentifier == rhs.profileIdentifier + } } diff --git a/Sources/MapboxDirections/MBRouteStep.swift b/Sources/MapboxDirections/MBRouteStep.swift index e37cc5cb5..911aff53b 100644 --- a/Sources/MapboxDirections/MBRouteStep.swift +++ b/Sources/MapboxDirections/MBRouteStep.swift @@ -338,8 +338,8 @@ import Polyline You do not create instances of this class directly. Instead, you receive route step objects as part of route objects when you request directions using the `Directions.calculate(_:completionHandler:)` method, setting the `includesSteps` option to `true` in the `RouteOptions` object that you pass into that method. */ -open class RouteStep: Codable { - +open class RouteStep: Codable, Equatable { + private enum CodingKeys: String, CodingKey { case codes case geometry @@ -357,7 +357,6 @@ open class RouteStep: Codable { case intersections case maneuver case name - case v4wayName = "way_name" case ref case exits case phoneticExitNames = "pronunciation" @@ -695,4 +694,30 @@ open class RouteStep: Codable { Each item in the array corresponds to a cross street, starting with the intersection at the maneuver location indicated by the coordinates property and continuing with each cross street along the step. */ public let intersections: [Intersection]? + + // MARK: - Equality + public static func == (lhs: RouteStep, rhs: RouteStep) -> Bool { + return lhs.codes == rhs.codes && + lhs.geometry == rhs.geometry && + lhs.destinationCodes == rhs.destinationCodes && + lhs.destinations == rhs.destinations && + lhs.distance == rhs.distance && + lhs.drivingSide == rhs.drivingSide && + lhs.exitNames == rhs.exitNames && + lhs.exitCodes == rhs.exitCodes && + lhs.exitIndex == rhs.exitIndex && + lhs.exitNames == rhs.exitNames && + lhs.expectedTravelTime == rhs.expectedTravelTime && + lhs.instructions == rhs.instructions && + lhs.instructionsDisplayedAlongStep == rhs.instructionsDisplayedAlongStep && + lhs.instructionsSpokenAlongStep == rhs.instructionsSpokenAlongStep && + lhs.intersections == rhs.intersections && + lhs.maneuverType == rhs.maneuverType && + lhs.maneuverLocation == rhs.maneuverLocation && + lhs.maneuverDirection == rhs.maneuverDirection && + lhs.name == rhs.name && + lhs.phoneticNames == rhs.phoneticNames && + lhs.phoneticExitNames == rhs.phoneticExitNames && + lhs.transportType == rhs.transportType + } } diff --git a/Sources/MapboxDirections/MBSpokenInstruction.swift b/Sources/MapboxDirections/MBSpokenInstruction.swift index ec3414bb2..815060bac 100644 --- a/Sources/MapboxDirections/MBSpokenInstruction.swift +++ b/Sources/MapboxDirections/MBSpokenInstruction.swift @@ -10,8 +10,7 @@ import CoreLocation The `distanceAlongStep` property is measured from the beginning of the step associated with this object. By contrast, the `text` and `ssmlText` properties refer to the details in the following step. It is also possible for the instruction to refer to two following steps simultaneously when needed for safe navigation. */ -open class SpokenInstruction: Codable { - +open class SpokenInstruction: Codable, Equatable { /** A distance along the associated `RouteStep` at which to read the instruction aloud. @@ -54,4 +53,11 @@ open class SpokenInstruction: Codable { self.text = text self.ssmlText = ssmlText } + + //MARK: - Equatable + public static func == (lhs: SpokenInstruction, rhs: SpokenInstruction) -> Bool { + return lhs.distanceAlongStep == rhs.distanceAlongStep && + lhs.text == rhs.text && + lhs.ssmlText == rhs.ssmlText + } } diff --git a/Sources/MapboxDirections/MBVisualInstruction.swift b/Sources/MapboxDirections/MBVisualInstruction.swift index 075972e83..0a4462e18 100644 --- a/Sources/MapboxDirections/MBVisualInstruction.swift +++ b/Sources/MapboxDirections/MBVisualInstruction.swift @@ -7,7 +7,7 @@ import CoreLocation */ -open class VisualInstruction: Codable { +open class VisualInstruction: Codable, Equatable { /** A plain text representation of the instruction. @@ -28,7 +28,7 @@ open class VisualInstruction: Codable { /** A structured representation of the instruction. */ - public let components: [ComponentRepresentable] + public let components: [Component] /** The heading at which the user exits a roundabout (traffic circle or rotary). @@ -42,7 +42,7 @@ open class VisualInstruction: Codable { /** Initializes a new visual instruction banner object that displays the given information. */ - public init(text: String?, maneuverType: ManeuverType, maneuverDirection: ManeuverDirection, components: [ComponentRepresentable], degrees: CLLocationDegrees = 180) { + public init(text: String?, maneuverType: ManeuverType, maneuverDirection: ManeuverDirection, components: [Component], degrees: CLLocationDegrees = 180) { self.text = text self.maneuverType = maneuverType self.maneuverDirection = maneuverDirection @@ -65,7 +65,7 @@ open class VisualInstruction: Codable { try container.encodeIfPresent(maneuverType, forKey: .maneuverType) try container.encodeIfPresent(maneuverDirection, forKey: .maneuverDirection) - let wrappedComponents = components.map(Component.init(component:)) + let wrappedComponents = components.map(ComponentSerializer.init(component:)) try container.encode(wrappedComponents, forKey: .components) try container.encodeIfPresent(finalHeading, forKey: .finalHeading) @@ -77,9 +77,20 @@ open class VisualInstruction: Codable { maneuverType = try container.decodeIfPresent(ManeuverType.self, forKey: .maneuverType) maneuverDirection = try container.decodeIfPresent(ManeuverDirection.self, forKey: .maneuverDirection) - let componentsWrapped = try container.decode([Component].self, forKey: .components) + let componentsWrapped = try container.decode([ComponentSerializer].self, forKey: .components) components = componentsWrapped.map { $0.component } finalHeading = try container.decodeIfPresent(CLLocationDegrees.self, forKey: .finalHeading) } + + // MARK: - Equatable + public static func == (lhs: VisualInstruction, rhs: VisualInstruction) -> Bool { + return lhs.text == rhs.text && + lhs.maneuverType == rhs.maneuverType && + lhs.maneuverDirection == rhs.maneuverDirection && + + + lhs.components == rhs.components && + lhs.finalHeading == rhs.finalHeading + } } diff --git a/Sources/MapboxDirections/MBVisualInstructionBanner.swift b/Sources/MapboxDirections/MBVisualInstructionBanner.swift index 7f6459aee..847be370b 100644 --- a/Sources/MapboxDirections/MBVisualInstructionBanner.swift +++ b/Sources/MapboxDirections/MBVisualInstructionBanner.swift @@ -10,8 +10,8 @@ internal extension CodingUserInfoKey { A visual instruction banner contains all the information necessary for creating a visual cue about a given `RouteStep`. */ -open class VisualInstructionBanner: Codable { - +open class VisualInstructionBanner: Codable, Equatable { + private enum CodingKeys: String, CodingKey { case distanceAlongStep = "distanceAlongGeometry" case primaryInstruction = "primary" @@ -69,76 +69,13 @@ open class VisualInstructionBanner: Codable { Which side of a bidirectional road the driver should drive on, also known as the rule of the road. */ public var drivingSide: DrivingSide! - -// /** -// Initializes a new visual instruction banner object based on the given JSON dictionary representation and a driving side. -// -// - parameter json: A JSON object that conforms to the [primary or secondary banner](https://docs.mapbox.com/api/navigation/#banner-instruction-object) format described in the Directions API documentation. -// - parameter drivingSide: The side of the road the user should drive on. This value should be consistent with the containing route step. -// */ -// -// public convenience init(json: [String: Any], drivingSide: DrivingSide) { -// let distanceAlongStep = json["distanceAlongGeometry"] as! CLLocationDistance -// -// let primary = json["primary"] as! JSONDictionary -// let secondary = json["secondary"] as? JSONDictionary -// let tertiary = json["sub"] as? JSONDictionary -// -// let primaryInstruction = VisualInstruction(json: primary) -// var secondaryInstruction: VisualInstruction? = nil -// if let secondary = secondary { -// secondaryInstruction = VisualInstruction(json: secondary) -// } -// -// var tertiaryInstruction: VisualInstruction? = nil -// if let tertiary = tertiary { -// tertiaryInstruction = VisualInstruction(json: tertiary) -// } -// -// self.init(distanceAlongStep: distanceAlongStep, primaryInstruction: primaryInstruction, secondaryInstruction: secondaryInstruction, tertiaryInstruction: tertiaryInstruction, drivingSide: drivingSide) -// } -// -// /** -// Initializes a new visual instruction banner object that displays the given information. -// -// - parameter distanceAlongStep: The distance at which the visual instruction should be shown, measured in meters from the beginning of the step. -// - parameter primaryInstruction: The most important information to convey to the user about the `RouteStep`. -// - parameter secondaryInstruction: Less important details about the `RouteStep`. -// - parameter drivingSide: Which side of a bidirectional road the driver should drive on. -// */ -// public init(distanceAlongStep: CLLocationDistance, primaryInstruction: VisualInstruction, secondaryInstruction: VisualInstruction?, tertiaryInstruction: VisualInstruction?, drivingSide: DrivingSide) { -// self.distanceAlongStep = distanceAlongStep -// self.primaryInstruction = primaryInstruction -// self.secondaryInstruction = secondaryInstruction -// self.tertiaryInstruction = tertiaryInstruction -// self.drivingSide = drivingSide -// } -// -// public required init?(coder decoder: NSCoder) { -// distanceAlongStep = decoder.decodeDouble(forKey: "distanceAlongStep") -// -// if let drivingSideDescription = decoder.decodeObject(of: NSString.self, forKey: "drivingSide") as String?, let drivingSide = DrivingSide(rawValue: drivingSideDescription) { -// self.drivingSide = drivingSide -// } else { -// self.drivingSide = .right -// } -// -// guard let primaryInstruction = decoder.decodeObject(of: VisualInstruction.self, forKey: "primary") else { -// return nil -// } -// self.primaryInstruction = primaryInstruction -// self.secondaryInstruction = decoder.decodeObject(of: VisualInstruction.self, forKey: "secondary") -// self.tertiaryInstruction = decoder.decodeObject(of: VisualInstruction.self, forKey: "tertiaryInstruction") -// } -// -// public static var supportsSecureCoding = true -// -// public func encode(with coder: NSCoder) { -// coder.encode(distanceAlongStep, forKey: "distanceAlongStep") -// coder.encode(primaryInstruction, forKey: "primary") -// coder.encode(secondaryInstruction, forKey: "secondary") -// coder.encode(tertiaryInstruction, forKey: "tertiaryInstruction") -// coder.encode(drivingSide.rawValue, forKey: "drivingSide") -// } -//} + + //MARK: - Equatable + public static func == (lhs: VisualInstructionBanner, rhs: VisualInstructionBanner) -> Bool { + return lhs.distanceAlongStep == rhs.distanceAlongStep && + lhs.primaryInstruction == rhs.primaryInstruction && + lhs.secondaryInstruction == rhs.secondaryInstruction && + lhs.tertiaryInstruction == rhs.tertiaryInstruction && + lhs.drivingSide == rhs.drivingSide + } } diff --git a/Sources/MapboxDirections/MBVisualInstructionComponent.swift b/Sources/MapboxDirections/MBVisualInstructionComponent.swift index 22f3e534a..748d12896 100644 --- a/Sources/MapboxDirections/MBVisualInstructionComponent.swift +++ b/Sources/MapboxDirections/MBVisualInstructionComponent.swift @@ -11,8 +11,7 @@ Note: This class does not conform to Codable because it's serialization is directly handled by `Component` */ -open class VisualInstructionComponent: ComponentRepresentable { - +open class VisualInstructionComponent: Equatable { /** The URL to an image representation of this component. @@ -51,4 +50,13 @@ open class VisualInstructionComponent: ComponentRepresentable { self.abbreviation = abbreviation self.abbreviationPriority = abbreviationPriority } + + // MARK: - Equatable + public static func == (lhs: VisualInstructionComponent, rhs: VisualInstructionComponent) -> Bool { + return lhs.imageURL == rhs.imageURL && + lhs.abbreviation == rhs.abbreviation && + lhs.abbreviationPriority == rhs.abbreviationPriority && + lhs.text == rhs.text && + lhs.type == rhs.type + } } From 064828c9ccf46773c4851e0a5f5cc8d155ff06ab Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Minh=20Nguye=CC=82=CC=83n?= Date: Tue, 29 Oct 2019 17:13:41 -0700 Subject: [PATCH 24/89] Hashable types are equatable --- Sources/MapboxDirections/DirectionsProfileIdentifier.swift | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Sources/MapboxDirections/DirectionsProfileIdentifier.swift b/Sources/MapboxDirections/DirectionsProfileIdentifier.swift index 0d16a0876..408ee442b 100644 --- a/Sources/MapboxDirections/DirectionsProfileIdentifier.swift +++ b/Sources/MapboxDirections/DirectionsProfileIdentifier.swift @@ -9,7 +9,7 @@ The returned directions are appropriate for driving or riding a car, truck, or m This profile prioritizes fast routes by preferring high-speed roads like highways. A driving route may use a ferry where necessary. */ -public struct DirectionsProfileIdentifier: Codable, Equatable, Hashable, RawRepresentable, ExpressibleByStringLiteral { +public struct DirectionsProfileIdentifier: Codable, Hashable, RawRepresentable, ExpressibleByStringLiteral { public typealias StringLiteralType = String public typealias RawValue = String @@ -58,7 +58,7 @@ public struct DirectionsProfileIdentifier: Codable, Equatable, Hashable, RawRepr @available(*, deprecated, renamed: "DirectionsPriority") public typealias MBDirectionsPriority = DirectionsPriority -public struct DirectionsPriority: Equatable, Hashable, RawRepresentable { +public struct DirectionsPriority: Hashable, RawRepresentable { public init(rawValue: Double) { self.rawValue = rawValue } From ef7dad0e38a193883bc5eeb0cd92da6133a7560f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Minh=20Nguye=CC=82=CC=83n?= Date: Tue, 29 Oct 2019 19:22:32 -0700 Subject: [PATCH 25/89] Streamline geometry conversion MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Replaced UncertainCodable with PolyLineString, which is an associated value enumeration, Swift’s mechanism for a variant or union. DirectionsResult and RouteStep now store a LineString for faster access than a Polyline-encoded string. Added initializers to streamline conversion between JSON and LineString-backed storage. --- .../MapboxDirections/Extensions/Codable.swift | 78 ++++++------------- .../MapboxDirections/Extensions/GeoJSON.swift | 61 +++++++-------- .../MBComponentRepresentable.swift | 32 +------- .../MapboxDirections/MBDirectionsResult.swift | 55 +++---------- Sources/MapboxDirections/MBRouteOptions.swift | 2 +- Sources/MapboxDirections/MBRouteStep.swift | 28 +++---- 6 files changed, 78 insertions(+), 178 deletions(-) diff --git a/Sources/MapboxDirections/Extensions/Codable.swift b/Sources/MapboxDirections/Extensions/Codable.swift index 42c4aa5fc..1bc513f6d 100644 --- a/Sources/MapboxDirections/Extensions/Codable.swift +++ b/Sources/MapboxDirections/Extensions/Codable.swift @@ -1,70 +1,42 @@ import Foundation import Polyline -import CoreLocation +import struct Turf.LineString - -extension Decodable { - static internal func from(json: String, using encoding: String.Encoding = .utf8) -> T? { - guard let data = json.data(using: encoding) else { return nil } - return from(data: data) as T? - } - - static internal func from(data: Data) -> T? { - let decoder = JSONDecoder() - return try! decoder.decode(T.self, from: data) as T? - } -} - -struct UncertainCodable: Codable, Equatable { - var t: T? - var u: U? - - var options: DirectionsOptions +enum PolyLineString: Codable { + case lineString(_ lineString: LineString) + case polyline(_ encodedPolyline: String, precision: Double) - var value: Codable? { - return t ?? u - } - - var coordinates: [CLLocationCoordinate2D] { - if let geo = value as? Geometry { - return geo.coordinates - } else if let geo = value as? String { - return decodePolyline(geo, precision: options.shapeFormat == .polyline6 ? 1e6 : 1e5)! - } else { - return [] + init(lineString: LineString, shapeFormat: RouteShapeFormat) { + switch shapeFormat { + case .geoJSON: + self = .lineString(lineString) + case .polyline, .polyline6: + let precision = shapeFormat == .polyline6 ? 1e6 : 1e5 + let encodedPolyline = encodeCoordinates(lineString.coordinates, precision: precision) + self = .polyline(encodedPolyline, precision: precision) } } init(from decoder: Decoder) throws { - - guard let options = decoder.userInfo[.options] as? DirectionsOptions else { - let error: Error = "Directions options object not found." - throw error - } - self.options = options - - let container = try decoder.singleValueContainer() - t = try? container.decode(T.self) - if t == nil { - u = try? container.decode(U.self) + let options = decoder.userInfo[.options] as? DirectionsOptions + switch options?.shapeFormat ?? .polyline { + case .geoJSON: + self = .lineString(try container.decode(LineString.self)) + case .polyline, .polyline6: + let precision = options?.shapeFormat == .polyline6 ? 1e6 : 1e5 + let encodedPolyline = try container.decode(String.self) + self = .polyline(encodedPolyline, precision: precision) } - } func encode(to encoder: Encoder) throws { var container = encoder.singleValueContainer() - if let t = t { - try? container.encode(t) - } - if let u = u { - try? container.encode(u) + switch self { + case let .lineString(lineString): + try container.encode(lineString) + case let .polyline(encodedPolyline, precision: _): + try container.encode(encodedPolyline) } } } - -extension String: Error {} - - -public StepGeometry -// make this a varient transform that's used instead of MBDirectionsResult:38-55, do equatable here, have computed property `shape` that always returns a Polyline no matter the backing data diff --git a/Sources/MapboxDirections/Extensions/GeoJSON.swift b/Sources/MapboxDirections/Extensions/GeoJSON.swift index 04fc9293f..39b2bc35c 100644 --- a/Sources/MapboxDirections/Extensions/GeoJSON.swift +++ b/Sources/MapboxDirections/Extensions/GeoJSON.swift @@ -1,49 +1,40 @@ import Foundation import CoreLocation +import Polyline +import struct Turf.LineString -struct Geometry: Codable { - enum GeometryType: String, CustomStringConvertible, Codable { - case point = "Point" - case lineString = "LineString" - - var description: String { - switch self { - case .point: - return "Point" - case .lineString: - return "LineString" - } +extension LineString { + init(polyLineString: PolyLineString) throws { + switch polyLineString { + case let .lineString(lineString): + self = lineString + case let .polyline(encodedPolyline, precision: precision): + self = try LineString(encodedPolyline: encodedPolyline, precision: precision) } } - let coordinates: [CLLocationCoordinate2D] - let type: GeometryType - - private enum CodingKeys: String, CodingKey { - case coordinates - case type + init(encodedPolyline: String, precision: Double) throws { + guard let coordinates = decodePolyline(encodedPolyline, precision: precision) as [CLLocationCoordinate2D]? else { + throw GeometryError.cannotDecodePolyline(precision: precision) + } + self.init(coordinates) } +} + +public enum GeometryError: DirectionsError { + case cannotDecodePolyline(precision: Double) - public init(from decoder: Decoder) throws { - let container = try decoder.container(keyedBy: CodingKeys.self) - type = try container.decode(GeometryType.self, forKey: .type) - switch type { - case .lineString: - coordinates = try container.decode([CLLocationCoordinate2D].self, forKey: .coordinates) - case .point: - coordinates = [try container.decode(CLLocationCoordinate2D.self, forKey: .coordinates)] + public var failureReason: String { + switch self { + case let .cannotDecodePolyline(precision): + return "Unable to decode the string as a polyline with precision \(precision)" } } - public func encode(to encoder: Encoder) throws { - var container = encoder.container(keyedBy: CodingKeys.self) - try container.encode(type, forKey: .type) - - switch type { - case .lineString: - try container.encode(coordinates, forKey: .coordinates) - case .point: - try container.encode(coordinates.first!, forKey: .coordinates) + public var recoverySuggestion: String { + switch self { + case .cannotDecodePolyline: + return "Choose the precision that the string was encoded with." } } } diff --git a/Sources/MapboxDirections/MBComponentRepresentable.swift b/Sources/MapboxDirections/MBComponentRepresentable.swift index eb959bed5..6f0e92749 100644 --- a/Sources/MapboxDirections/MBComponentRepresentable.swift +++ b/Sources/MapboxDirections/MBComponentRepresentable.swift @@ -13,6 +13,9 @@ import UIKit The component representable protocol that comprises what the instruction banner should display. */ public enum Component: Equatable { + case lane(_ component: LaneIndicationComponent) + case visual(_ component: VisualInstructionComponent) + public static func == (lhs: Component, rhs: Component) -> Bool { switch lhs { case let .lane(left): @@ -31,36 +34,7 @@ public enum Component: Equatable { } } } - - case lane(_ component: LaneIndicationComponent) - case visual(_ component: VisualInstructionComponent) - - } -//public typealias ComponentRepresentable = Representable & Equatable -//public protocol Representable: class { -// -//} - -//public struct SomeRepreentable: Representable, Equatable { -// -//} - -//public extension ComponentRepresentable { -// static func == (lhs: Self, rhs: Self) -> Bool { -// -// } -//} - -//public extension Equatable where Self: ComponentRepresentable { -// public static func == (lhs: ComponentRepresentable, rhs: ComponentRepresentable) -> Bool { -// -// } -//} - -//public func == (lhs: ComponentRepresentable, rhs: ComponentRepresentable) -> Bool { -// -//} internal struct ComponentSerializer: Codable { let component: Component diff --git a/Sources/MapboxDirections/MBDirectionsResult.swift b/Sources/MapboxDirections/MBDirectionsResult.swift index f8fc25f91..c1f7cd8aa 100644 --- a/Sources/MapboxDirections/MBDirectionsResult.swift +++ b/Sources/MapboxDirections/MBDirectionsResult.swift @@ -11,7 +11,7 @@ import struct Turf.LineString open class DirectionsResult: Codable { private enum CodingKeys: String, CodingKey { - case shape = "geometry" + case geometry = "geometry" case legs case distance case expectedTravelTime = "duration" @@ -32,27 +32,10 @@ open class DirectionsResult: Codable { _directionsOptions = decoder.userInfo[.options] as! DirectionsOptions - - switch _directionsOptions.shapeFormat { - - case .geoJSON: - shape = try container.decodeIfPresent(LineString.self, forKey: .shape) - - case .polyline: - guard let polyString = try container.decodeIfPresent(String.self, forKey: .shape) else { - shape = nil - break - } - let polyline = Polyline(encodedPolyline: polyString, precision: 1e5) - shape = LineString(polyline.coordinates!) - - case .polyline6: - guard let polyString = try container.decodeIfPresent(String.self, forKey: .shape) else { - shape = nil - break - } - let polyline = Polyline(encodedPolyline: polyString, precision: 1e6) - shape = LineString(polyline.coordinates!) + if let polyLineString = try container.decodeIfPresent(PolyLineString.self, forKey: .geometry) { + lineString = try LineString(polyLineString: polyLineString) + } else { + lineString = nil } // Associate each leg JSON with a source and destination. The sequence of destinations is offset by one from the sequence of sources. @@ -83,39 +66,18 @@ open class DirectionsResult: Codable { public func encode(to encoder: Encoder) throws { var container = encoder.container(keyedBy: CodingKeys.self) try container.encode(legs, forKey: .legs) - switch directionsOptions.shapeFormat { - - case .geoJSON: - try container.encode(shape, forKey: .shape) - - case .polyline: - let coordinates = shape!.coordinates - let polyString = Polyline(coordinates: coordinates, precision: 1e5).encodedPolyline - try container.encode(polyString, forKey: .shape) - - case .polyline6: - let coordinates = shape!.coordinates - let polyString = Polyline(coordinates: coordinates, precision: 1e6).encodedPolyline - try container.encode(polyString, forKey: .shape) + if let lineString = lineString { + let polyLineString = PolyLineString(lineString: lineString, shapeFormat: directionsOptions.shapeFormat) + try container.encode(polyLineString, forKey: .geometry) } - try container.encode(distance, forKey: .distance) try container.encode(expectedTravelTime, forKey: .expectedTravelTime) try container.encodeIfPresent(accessToken, forKey: .accessToken) try container.encodeIfPresent(apiEndpoint, forKey: .apiEndpoint) try container.encodeIfPresent(routeIdentifier, forKey: .routeIdentifier) try container.encodeIfPresent(speechLocale, forKey: .speechLocale) - - - - - - - } - public let shape: LineString? - /** An array of geographic coordinates defining the path of the route from start to finish. @@ -123,6 +85,7 @@ open class DirectionsResult: Codable { Using the [Mapbox Maps SDK for iOS](https://docs.mapbox.com/ios/maps/) or [Mapbox Maps SDK for macOS](https://mapbox.github.io/mapbox-gl-native/macos/), you can create an `MGLPolyline` object using these coordinates to display an overview of the route on an `MGLMapView`. */ + public let lineString: LineString? /** An array of `RouteLeg` objects representing the legs of the route. diff --git a/Sources/MapboxDirections/MBRouteOptions.swift b/Sources/MapboxDirections/MBRouteOptions.swift index 1649ba84a..80f0ec897 100644 --- a/Sources/MapboxDirections/MBRouteOptions.swift +++ b/Sources/MapboxDirections/MBRouteOptions.swift @@ -138,7 +138,7 @@ open class RouteOptions: DirectionsOptions { The value of this property must be at least `MBDirectionsPriority.low` and at most `MBDirectionsPriority.high`. The default value of `MBDirectionsPriority.default` neither prefers nor avoids alleys, while a negative value between `MBDirectionsPriority.low` and `MBDirectionsPriority.default` avoids alleys, and a positive value between `MBDirectionsPriority.default` and `MBDirectionsPriority.high` prefers alleys. A value of 0.9 is suitable for pedestrians who are comfortable with walking down alleys. */ - open var alleyPriority: MBDirectionsPriority = .default + open var alleyPriority: DirectionsPriority = .default /** A number that influences whether the route should prefer or avoid roads or paths that are set aside for pedestrian-only use (walkways or footpaths). diff --git a/Sources/MapboxDirections/MBRouteStep.swift b/Sources/MapboxDirections/MBRouteStep.swift index 911aff53b..cff06aa8a 100644 --- a/Sources/MapboxDirections/MBRouteStep.swift +++ b/Sources/MapboxDirections/MBRouteStep.swift @@ -1,7 +1,7 @@ import Foundation import CoreLocation import Polyline - +import struct Turf.LineString /** A `TransportType` specifies the mode of transportation used for part of a route. @@ -395,7 +395,10 @@ open class RouteStep: Codable, Equatable { try container.encodeIfPresent(intersections, forKey: .intersections) try container.encode(drivingSide, forKey: .drivingSide) try container.encodeIfPresent(name, forKey: .name) - try container.encodeIfPresent(geometry, forKey: .geometry) + if let lineString = lineString, let shapeFormat = encoder.userInfo[.options] as? RouteShapeFormat { + let polyLineString = PolyLineString(lineString: lineString, shapeFormat: shapeFormat) + try container.encode(polyLineString, forKey: .geometry) + } var maneuver = container.nestedContainer(keyedBy: ManeuverCodingKeys.self, forKey: .maneuver) try maneuver.encode(instructions, forKey: .instruction) @@ -412,9 +415,6 @@ open class RouteStep: Codable, Equatable { if let coordinate = try? maneuver.decode(CLLocationCoordinate2D.self, forKey: .location) { maneuverLocation = coordinate - } else if let coordinate = try? maneuver.decode(UncertainCodable.self, forKey: .location).coordinates.first { - // V4 - maneuverLocation = coordinate } else { maneuverLocation = CLLocationCoordinate2D() } @@ -425,8 +425,11 @@ open class RouteStep: Codable, Equatable { initialHeading = try maneuver.decodeIfPresent(CLLocationDirection.self, forKey: .initialHeading) finalHeading = try maneuver.decodeIfPresent(CLLocationDirection.self, forKey: .finalHeading) - geometry = try container.decodeIfPresent(UncertainCodable.self, forKey: .geometry) - coordinates = geometry?.coordinates + if let polyLineString = try container.decodeIfPresent(PolyLineString.self, forKey: .geometry) { + lineString = try LineString(polyLineString: polyLineString) + } else { + lineString = nil + } name = try container.decode(String.self, forKey: .name) @@ -509,14 +512,13 @@ open class RouteStep: Codable, Equatable { // MARK: Getting the Step Geometry /** - An array of geographic coordinates defining the path of the route step from the location of the maneuver to the location of the next step’s maneuver. + The path of the route step from the location of the maneuver to the location of the next step’s maneuver. The value of this property may be `nil`, for example when the maneuver type is `arrive`. - Using the [Mapbox Maps SDK for iOS](https://www.mapbox.com/ios-sdk/) or [Mapbox Maps SDK for macOS](https://github.com/mapbox/mapbox-gl-native/tree/master/platform/macos/), you can create an `MGLPolyline` object using these coordinates to display a portion of a route on an `MGLMapView`. + Using the [Mapbox Maps SDK for iOS](https://www.mapbox.com/ios-sdk/) or [Mapbox Maps SDK for macOS](https://github.com/mapbox/mapbox-gl-native/tree/master/platform/macos/), you can create an `MGLPolyline` object using the `LineString.coordinates` property to display a portion of a route on an `MGLMapView`. */ - public let coordinates: [CLLocationCoordinate2D]? - + public var lineString: LineString? // MARK: Getting Details About the Maneuver @@ -531,8 +533,6 @@ open class RouteStep: Codable, Equatable { fileprivate let name: String - fileprivate var geometry: UncertainCodable? - /** Instructions about the next step’s maneuver, optimized for speech synthesis. @@ -698,7 +698,7 @@ open class RouteStep: Codable, Equatable { // MARK: - Equality public static func == (lhs: RouteStep, rhs: RouteStep) -> Bool { return lhs.codes == rhs.codes && - lhs.geometry == rhs.geometry && + lhs.lineString == rhs.lineString && lhs.destinationCodes == rhs.destinationCodes && lhs.destinations == rhs.destinations && lhs.distance == rhs.distance && From d1e65882d7acf6dbebeed60083953fc3537d8b8c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Minh=20Nguye=CC=82=CC=83n?= Date: Wed, 30 Oct 2019 00:00:22 -0700 Subject: [PATCH 26/89] Simplified index set creation --- .../MapboxDirections/Extensions/Array.swift | 9 ++++++++ .../MBDirectionsOptions.swift | 2 +- Sources/MapboxDirections/MBIntersection.swift | 21 +++---------------- 3 files changed, 13 insertions(+), 19 deletions(-) diff --git a/Sources/MapboxDirections/Extensions/Array.swift b/Sources/MapboxDirections/Extensions/Array.swift index 9b71df210..08c70f6f3 100644 --- a/Sources/MapboxDirections/Extensions/Array.swift +++ b/Sources/MapboxDirections/Extensions/Array.swift @@ -7,3 +7,12 @@ extension Array { } #endif } + +extension Collection { + /** + Returns an index set containing the indices that satisfy the given predicate. + */ + func indices(where predicate: (Element) throws -> Bool) rethrows -> IndexSet { + return IndexSet(try enumerated().filter { try predicate($0.element) }.map { $0.offset }) + } +} diff --git a/Sources/MapboxDirections/MBDirectionsOptions.swift b/Sources/MapboxDirections/MBDirectionsOptions.swift index edba2f53b..13825305e 100644 --- a/Sources/MapboxDirections/MBDirectionsOptions.swift +++ b/Sources/MapboxDirections/MBDirectionsOptions.swift @@ -368,7 +368,7 @@ open class DirectionsOptions: Codable, Equatable { } private var waypointIndices: String? { - var waypointIndices = IndexSet(waypoints.enumerated().filter { $0.element.separatesLegs }.map { $0.offset }) + var waypointIndices = waypoints.indices { $0.separatesLegs } waypointIndices.insert(waypoints.startIndex) waypointIndices.insert(waypoints.endIndex - 1) diff --git a/Sources/MapboxDirections/MBIntersection.swift b/Sources/MapboxDirections/MBIntersection.swift index 612601946..c82f70f73 100644 --- a/Sources/MapboxDirections/MBIntersection.swift +++ b/Sources/MapboxDirections/MBIntersection.swift @@ -113,27 +113,12 @@ public struct Intersection: Codable, Equatable { location = try container.decode(CLLocationCoordinate2D.self, forKey: .location) headings = try container.decode([CLLocationDirection].self, forKey: .headings) - let lanes = try container.decodeIfPresent([Lane].self, forKey: .lanes) - - approachLanes = lanes - var usableApproachLanes = IndexSet() - if let lanes = lanes { - for (i, lane) in lanes.enumerated() { - if lane.isValid { - usableApproachLanes.update(with: i) - } - } - } - - self.usableApproachLanes = usableApproachLanes.isEmpty ? nil : usableApproachLanes - + approachLanes = try container.decodeIfPresent([Lane].self, forKey: .lanes) + usableApproachLanes = approachLanes?.indices { $0.isValid } outletRoadClasses = try container.decodeIfPresent(RoadClasses.self, forKey: .outletRoadClasses) let outletsArray = try container.decode([Bool].self, forKey: .outletIndexes) - let filtered = outletsArray.enumerated().filter { $1 } - let mapped = filtered.map { $0.offset } - outletIndexes = - IndexSet(mapped) + outletIndexes = outletsArray.indices { $0 } outletIndex = try container.decodeIfPresent(Int.self, forKey: .outletIndex) ?? -1 approachIndex = try container.decodeIfPresent(Int.self, forKey: .approachIndex) ?? -1 From 9ed02300d60a98410bfc4c4ab8a0245f785ee6cc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Minh=20Nguye=CC=82=CC=83n?= Date: Wed, 30 Oct 2019 00:02:09 -0700 Subject: [PATCH 27/89] Import CoreLocation where used --- Sources/MapboxDirections/MBIntersection.swift | 1 + Sources/MapboxDirections/MBRouteOptions.swift | 1 + 2 files changed, 2 insertions(+) diff --git a/Sources/MapboxDirections/MBIntersection.swift b/Sources/MapboxDirections/MBIntersection.swift index c82f70f73..3a3511011 100644 --- a/Sources/MapboxDirections/MBIntersection.swift +++ b/Sources/MapboxDirections/MBIntersection.swift @@ -1,4 +1,5 @@ import Foundation +import CoreLocation /** A single cross street along a step. diff --git a/Sources/MapboxDirections/MBRouteOptions.swift b/Sources/MapboxDirections/MBRouteOptions.swift index 80f0ec897..49828b918 100644 --- a/Sources/MapboxDirections/MBRouteOptions.swift +++ b/Sources/MapboxDirections/MBRouteOptions.swift @@ -1,3 +1,4 @@ +import CoreLocation /** A `RouteOptions` object is a structure that specifies the criteria for results returned by the Mapbox Directions API. From 78b529da8673c4eb6986a0911dfd63f4f540f217 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Minh=20Nguye=CC=82=CC=83n?= Date: Wed, 30 Oct 2019 02:42:06 -0700 Subject: [PATCH 28/89] Updated enum references in documentation --- Sources/MapboxDirections/AttributeOptions.swift | 2 +- Sources/MapboxDirections/DirectionsError.swift | 2 +- Sources/MapboxDirections/MBDirections.swift | 6 +++--- .../MapboxDirections/MBDirectionsOptions.swift | 9 +++------ .../MapboxDirections/MBDirectionsResult.swift | 2 +- Sources/MapboxDirections/MBRouteLeg.swift | 4 ++-- Sources/MapboxDirections/MBRouteOptions.swift | 16 ++++++++-------- Sources/MapboxDirections/MBRouteStep.swift | 14 +++++++------- Sources/MapboxDirections/MBWaypoint.swift | 12 ++++++------ .../MapboxDirections/Match/MBMatchOptions.swift | 8 ++++---- 10 files changed, 36 insertions(+), 39 deletions(-) diff --git a/Sources/MapboxDirections/AttributeOptions.swift b/Sources/MapboxDirections/AttributeOptions.swift index e34ba1dd9..fce376460 100644 --- a/Sources/MapboxDirections/AttributeOptions.swift +++ b/Sources/MapboxDirections/AttributeOptions.swift @@ -37,7 +37,7 @@ public struct AttributeOptions: OptionSet, CustomStringConvertible{ When this attribute is specified, the `RouteLeg.congestionLevels` property contains one value for each segment in the leg’s full geometry. - This attribute requires `MBDirectionsProfileIdentifierAutomobileAvoidingTraffic`. Any other profile identifier produces `CongestionLevel.unknown` for each segment along the route. + This attribute requires `DirectionsProfileIdentifier.automobileAvoidingTraffic`. Any other profile identifier produces `CongestionLevel.unknown` for each segment along the route. */ public static let congestionLevel = AttributeOptions(rawValue: 1 << 4) diff --git a/Sources/MapboxDirections/DirectionsError.swift b/Sources/MapboxDirections/DirectionsError.swift index 4a603b1a3..6006c7ada 100644 --- a/Sources/MapboxDirections/DirectionsError.swift +++ b/Sources/MapboxDirections/DirectionsError.swift @@ -73,7 +73,7 @@ public enum MapboxDirectionsError: DirectionsError, RawRepresentable, Equatable case .unableToLocate: return "Make sure the locations are close enough to a roadway or pathway. Try setting the coordinateAccuracy property of all the waypoints to a negative value." case .profileNotFound: - return "Make sure the profileIdentifier option is set to one of the provided constants, such as MBDirectionsProfileIdentifierAutomobile." + return "Make sure the profileIdentifier option is set to one of the provided constants, such as DirectionsProfileIdentifier.automobile." case .requestTooLarge: return "Try specifying fewer waypoints or giving the waypoints shorter names." case let .rateLimited(rateLimitInterval: _, rateLimit: _, resetTime: reset): diff --git a/Sources/MapboxDirections/MBDirections.swift b/Sources/MapboxDirections/MBDirections.swift index cf946fc6b..962742b80 100644 --- a/Sources/MapboxDirections/MBDirections.swift +++ b/Sources/MapboxDirections/MBDirections.swift @@ -73,10 +73,10 @@ open class Directions: NSObject { - parameter waypoints: An array of `Waypoint` objects. Each waypoint object corresponds to a `Waypoint` object in the original `RouteOptions` object. The locations and names of these waypoints are the result of conflating the original waypoints to known roads. The waypoints may include additional information that was not specified in the original waypoints. - If the request was canceled or there was an error obtaining the routes, this parameter may be `nil`. + If the request was canceled or there was an error obtaining the routes, this argument may be `nil`. - parameter routes: An array of `Route` objects. The preferred route is first; any alternative routes come next if the `RouteOptions` object’s `includesAlternativeRoutes` property was set to `true`. The preferred route depends on the route options object’s `profileIdentifier` property. - If the request was canceled or there was an error obtaining the routes, this parameter is `nil`. This is not to be confused with the situation in which no results were found, in which case the array is present but empty. + If the request was canceled or there was an error obtaining the routes, this argument is `nil`. This is not to be confused with the situation in which no results were found, in which case the array is present but empty. - parameter error: The error that occurred, or `nil` if the placemarks were obtained successfully. */ public typealias RouteCompletionHandler = (_ waypoints: [Waypoint]?, _ routes: [Route]?, _ error: DirectionsError?) -> Void @@ -84,7 +84,7 @@ open class Directions: NSObject { /** A closure (block) to be called when a map matching request is complete. - If the request was canceled or there was an error obtaining the matches, this parameter is `nil`. This is not to be confused with the situation in which no matches were found, in which case the array is present but empty. + If the request was canceled or there was an error obtaining the matches, this argument is `nil`. This is not to be confused with the situation in which no matches were found, in which case the array is present but empty. - parameter error: The error that occurred, or `nil` if the placemarks were obtained successfully. */ public typealias MatchCompletionHandler = (_ matches: [Match]?, _ error: DirectionsError?) -> Void diff --git a/Sources/MapboxDirections/MBDirectionsOptions.swift b/Sources/MapboxDirections/MBDirectionsOptions.swift index 13825305e..d9989b21a 100644 --- a/Sources/MapboxDirections/MBDirectionsOptions.swift +++ b/Sources/MapboxDirections/MBDirectionsOptions.swift @@ -91,16 +91,13 @@ public enum MeasurementSystem: String, Codable { open class DirectionsOptions: Codable, Equatable { - - - /** Initializes an options object for routes between the given waypoints and an optional profile identifier. Do not call `DirectionsOptions(waypoints:profileIdentifier:)` directly; instead call the corresponding initializer of `RouteOptions` or `MatchOptions`. - - parameter waypoints: An array of `Waypoint` objects representing locations that the route should visit in chronological order. The array should contain at least two waypoints (the source and destination) and at most 25 waypoints. (Some profiles, such as `MBDirectionsProfileIdentifierAutomobileAvoidingTraffic`, [may have lower limits](https://docs.mapbox.com/api/navigation/#directions).) - - parameter profileIdentifier: A string specifying the primary mode of transportation for the routes. This parameter, if set, should be set to `MBDirectionsProfileIdentifierAutomobile`, `MBDirectionsProfileIdentifierAutomobileAvoidingTraffic`, `MBDirectionsProfileIdentifierCycling`, or `MBDirectionsProfileIdentifierWalking`. `MBDirectionsProfileIdentifierAutomobile` is used by default. + - parameter waypoints: An array of `Waypoint` objects representing locations that the route should visit in chronological order. The array should contain at least two waypoints (the source and destination) and at most 25 waypoints. (Some profiles, such as `DirectionsProfileIdentifier.automobileAvoidingTraffic`, [may have lower limits](https://docs.mapbox.com/api/navigation/#directions).) + - parameter profileIdentifier: A string specifying the primary mode of transportation for the routes. `DirectionsProfileIdentifier.automobile` is used by default. */ required public init(waypoints: [Waypoint], profileIdentifier: DirectionsProfileIdentifier? = nil) { self.waypoints = waypoints @@ -179,7 +176,7 @@ open class DirectionsOptions: Codable, Equatable { /** A string specifying the primary mode of transportation for the routes. - This property should be set to `MBDirectionsProfileIdentifierAutomobile`, `MBDirectionsProfileIdentifierAutomobileAvoidingTraffic`, `MBDirectionsProfileIdentifierCycling`, or `MBDirectionsProfileIdentifierWalking`. The default value of this property is `MBDirectionsProfileIdentifierAutomobile`, which specifies driving directions. + The default value of this property is `DirectionsProfileIdentifier.automobile`, which specifies driving directions. */ open var profileIdentifier: DirectionsProfileIdentifier diff --git a/Sources/MapboxDirections/MBDirectionsResult.swift b/Sources/MapboxDirections/MBDirectionsResult.swift index c1f7cd8aa..a1c2ad27f 100644 --- a/Sources/MapboxDirections/MBDirectionsResult.swift +++ b/Sources/MapboxDirections/MBDirectionsResult.swift @@ -109,7 +109,7 @@ open class DirectionsResult: Codable { /** The route’s expected travel time, measured in seconds. - The value of this property reflects the time it takes to traverse the entire route. It is the sum of the `expectedTravelTime` properties of the route’s legs. If the route was calculated using the `MBDirectionsProfileIdentifierAutomobileAvoidingTraffic` profile, this property reflects current traffic conditions at the time of the request, not necessarily the traffic conditions at the time the user would begin the route. For other profiles, this property reflects travel time under ideal conditions and does not account for traffic congestion. If the route makes use of a ferry or train, the actual travel time may additionally be subject to the schedules of those services. + The value of this property reflects the time it takes to traverse the entire route. It is the sum of the `expectedTravelTime` properties of the route’s legs. If the route was calculated using the `DirectionsProfileIdentifier.automobileAvoidingTraffic` profile, this property reflects current traffic conditions at the time of the request, not necessarily the traffic conditions at the time the user would begin the route. For other profiles, this property reflects travel time under ideal conditions and does not account for traffic congestion. If the route makes use of a ferry or train, the actual travel time may additionally be subject to the schedules of those services. Do not assume that the user would travel along the route at a fixed speed. For more granular travel times, use the `RouteLeg.expectedTravelTime` or `RouteStep.expectedTravelTime`. For even more granularity, specify the `AttributeOptions.expectedTravelTime` option and use the `RouteLeg.expectedSegmentTravelTimes` property. */ diff --git a/Sources/MapboxDirections/MBRouteLeg.swift b/Sources/MapboxDirections/MBRouteLeg.swift index f0e050cb0..696b6bc76 100644 --- a/Sources/MapboxDirections/MBRouteLeg.swift +++ b/Sources/MapboxDirections/MBRouteLeg.swift @@ -152,7 +152,7 @@ open class RouteLeg: Codable, Equatable { /** The route leg’s expected travel time, measured in seconds. - The value of this property reflects the time it takes to traverse the route leg. If the route was calculated using the `MBDirectionsProfileIdentifierAutomobileAvoidingTraffic` profile, this property reflects current traffic conditions at the time of the request, not necessarily the traffic conditions at the time the user would begin this leg. For other profiles, this property reflects travel time under ideal conditions and does not account for traffic congestion. If the leg makes use of a ferry or train, the actual travel time may additionally be subject to the schedules of those services. + The value of this property reflects the time it takes to traverse the route leg. If the route was calculated using the `DirectionsProfileIdentifier.automobileAvoidingTraffic` profile, this property reflects current traffic conditions at the time of the request, not necessarily the traffic conditions at the time the user would begin this leg. For other profiles, this property reflects travel time under ideal conditions and does not account for traffic congestion. If the leg makes use of a ferry or train, the actual travel time may additionally be subject to the schedules of those services. Do not assume that the user would travel along the leg at a fixed speed. For the expected travel time on each individual segment along the leg, use the `RouteStep.expectedTravelTimes` property. For more granularity, specify the `AttributeOptions.expectedTravelTime` option and use the `expectedSegmentTravelTimes` property. */ @@ -161,7 +161,7 @@ open class RouteLeg: Codable, Equatable { /** A string specifying the primary mode of transportation for the route leg. - The value of this property is `MBDirectionsProfileIdentifierAutomobile`, `MBDirectionsProfileIdentifierAutomobileAvoidingTraffic`, `MBDirectionsProfileIdentifierCycling`, or `MBDirectionsProfileIdentifierWalking`, depending on the `profileIdentifier` property of the original `RouteOptions` object. This property reflects the primary mode of transportation used for the route leg. Individual steps along the route leg might use different modes of transportation as necessary. + The value of this property depends on the `RouteOptions.profileIdentifier` property of the original `RouteOptions` object. This property reflects the primary mode of transportation used for the route leg. Individual steps along the route leg might use different modes of transportation as necessary. */ public let profileIdentifier: DirectionsProfileIdentifier diff --git a/Sources/MapboxDirections/MBRouteOptions.swift b/Sources/MapboxDirections/MBRouteOptions.swift index 49828b918..2da619ea5 100644 --- a/Sources/MapboxDirections/MBRouteOptions.swift +++ b/Sources/MapboxDirections/MBRouteOptions.swift @@ -11,8 +11,8 @@ open class RouteOptions: DirectionsOptions { /** Initializes a route options object for routes between the given waypoints and an optional profile identifier. - - parameter waypoints: An array of `Waypoint` objects representing locations that the route should visit in chronological order. The array should contain at least two waypoints (the source and destination) and at most 25 waypoints. (Some profiles, such as `MBDirectionsProfileIdentifierAutomobileAvoidingTraffic`, [may have lower limits](https://www.mapbox.com/api-documentation/#directions).) - - parameter profileIdentifier: A string specifying the primary mode of transportation for the routes. This parameter, if set, should be set to `MBDirectionsProfileIdentifierAutomobile`, `MBDirectionsProfileIdentifierAutomobileAvoidingTraffic`, `MBDirectionsProfileIdentifierCycling`, or `MBDirectionsProfileIdentifierWalking`. `MBDirectionsProfileIdentifierAutomobile` is used by default. + - parameter waypoints: An array of `Waypoint` objects representing locations that the route should visit in chronological order. The array should contain at least two waypoints (the source and destination) and at most 25 waypoints. (Some profiles, such as `DirectionsProfileIdentifier.automobileAvoidingTraffic`, [may have lower limits](https://www.mapbox.com/api-documentation/#directions).) + - parameter profileIdentifier: A string specifying the primary mode of transportation for the routes. `DirectionsProfileIdentifier.automobile` is used by default. */ public required init(waypoints: [Waypoint], profileIdentifier: DirectionsProfileIdentifier? = nil) { @@ -27,7 +27,7 @@ open class RouteOptions: DirectionsOptions { - note: This initializer is intended for `CLLocation` objects created using the `CLLocation.init(latitude:longitude:)` initializer. If you intend to use a `CLLocation` object obtained from a `CLLocationManager` object, consider increasing the `horizontalAccuracy` or set it to a negative value to avoid overfitting, since the `Waypoint` class’s `coordinateAccuracy` property represents the maximum allowed deviation from the waypoint. - parameter locations: An array of `CLLocation` objects representing locations that the route should visit in chronological order. The array should contain at least two locations (the source and destination) and at most 25 locations. Each location object is converted into a `Waypoint` object. This class respects the `CLLocation` class’s `coordinate` and `horizontalAccuracy` properties, converting them into the `Waypoint` class’s `coordinate` and `coordinateAccuracy` properties, respectively. - - parameter profileIdentifier: A string specifying the primary mode of transportation for the routes. This parameter, if set, should be set to `MBDirectionsProfileIdentifierAutomobile`, `MBDirectionsProfileIdentifierAutomobileAvoidingTraffic`, `MBDirectionsProfileIdentifierCycling`, or `MBDirectionsProfileIdentifierWalking`. `MBDirectionsProfileIdentifierAutomobile` is used by default. + - parameter profileIdentifier: A string specifying the primary mode of transportation for the routes. `DirectionsProfileIdentifier.automobile` is used by default. */ public convenience init(locations: [CLLocation], profileIdentifier: DirectionsProfileIdentifier? = nil) { let waypoints = locations.map { Waypoint(location: $0) } @@ -38,7 +38,7 @@ open class RouteOptions: DirectionsOptions { Initializes a route options object for routes between the given geographic coordinates and an optional profile identifier. - parameter coordinates: An array of geographic coordinates representing locations that the route should visit in chronological order. The array should contain at least two locations (the source and destination) and at most 25 locations. Each coordinate is converted into a `Waypoint` object. - - parameter profileIdentifier: A string specifying the primary mode of transportation for the routes. This parameter, if set, should be set to `MBDirectionsProfileIdentifierAutomobile`, `MBDirectionsProfileIdentifierAutomobileAvoidingTraffic`, `MBDirectionsProfileIdentifierCycling`, or `MBDirectionsProfileIdentifierWalking`. `MBDirectionsProfileIdentifierAutomobile` is used by default. + - parameter profileIdentifier: A string specifying the primary mode of transportation for the routes. `DirectionsProfileIdentifier.automobile` is used by default. */ public convenience init(coordinates: [CLLocationCoordinate2D], profileIdentifier: DirectionsProfileIdentifier? = nil) { let waypoints = coordinates.map { Waypoint(coordinate: $0) } @@ -97,7 +97,7 @@ open class RouteOptions: DirectionsOptions { Set this property to `true` if you expect the user to traverse each leg of the trip separately. For example, it would be quite easy for the user to effectively “U-turn” at a waypoint if the user first parks the car and patronizes a restaurant there before embarking on the next leg of the trip. Set this property to `false` if you expect the user to proceed to the next waypoint immediately upon arrival. For example, if the user only needs to drop off a passenger or package at the waypoint before continuing, it would be inconvenient to perform a U-turn at that location. - The default value of this property is `false` when the profile identifier is `MBDirectionsProfileIdentifierAutomobile` or `MBDirectionsProfileIdentifierAutomobileAvoidingTraffic` and `true` otherwise. + The default value of this property is `false` when the profile identifier is `DirectionsProfileIdentifier.automobile` or `DirectionsProfileIdentifier.automobileAvoidingTraffic` and `true` otherwise. */ open var allowsUTurnAtWaypoint: Bool @@ -135,7 +135,7 @@ open class RouteOptions: DirectionsOptions { /** A number that influences whether the route should prefer or avoid alleys or narrow service roads between buildings. - This property has no effect unless the profile identifier is set to `MBDirectionsProfileIdentifier.walking`. + This property has no effect unless the profile identifier is set to `DirectionsProfileIdentifier.walking`. The value of this property must be at least `MBDirectionsPriority.low` and at most `MBDirectionsPriority.high`. The default value of `MBDirectionsPriority.default` neither prefers nor avoids alleys, while a negative value between `MBDirectionsPriority.low` and `MBDirectionsPriority.default` avoids alleys, and a positive value between `MBDirectionsPriority.default` and `MBDirectionsPriority.high` prefers alleys. A value of 0.9 is suitable for pedestrians who are comfortable with walking down alleys. */ @@ -144,7 +144,7 @@ open class RouteOptions: DirectionsOptions { /** A number that influences whether the route should prefer or avoid roads or paths that are set aside for pedestrian-only use (walkways or footpaths). - This property has no effect unless the profile identifier is set to `MBDirectionsProfileIdentifier.walking`. You can adjust this property to avoid [sidewalks and crosswalks that are mapped as separate footpaths](https://wiki.openstreetmap.org/wiki/Sidewalks#Sidewalk_as_separate_way), which may be more granular than needed for some forms of pedestrian navigation. + This property has no effect unless the profile identifier is set to `DirectionsProfileIdentifier.walking`. You can adjust this property to avoid [sidewalks and crosswalks that are mapped as separate footpaths](https://wiki.openstreetmap.org/wiki/Sidewalks#Sidewalk_as_separate_way), which may be more granular than needed for some forms of pedestrian navigation. The value of this property must be at least `MBDirectionsPriority.low` and at most `MBDirectionsPriority.high`. The default value of `MBDirectionsPriority.default` neither prefers nor avoids walkways, while a negative value between `MBDirectionsPriority.low` and `MBDirectionsPriority.default` avoids walkways, and a positive value between `MBDirectionsPriority.default` and `MBDirectionsPriority.high` prefers walkways. A value of −0.1 results in less verbose routes in cities where sidewalks and crosswalks are generally mapped as separate footpaths. */ @@ -153,7 +153,7 @@ open class RouteOptions: DirectionsOptions { /** The expected uniform travel speed measured in meters per second. - This property has no effect unless the profile identifier is set to `MBDirectionsProfileIdentifier.walking`. You can adjust this property to account for running or for faster or slower gaits. When the profile identifier is set to another profile identifier, such as `MBDirectionsProfileIdentifier.driving`, this property is ignored in favor of the expected travel speed on each road along the route. This property may be supported by other routing profiles in the future. + This property has no effect unless the profile identifier is set to `DirectionsProfileIdentifier.walking`. You can adjust this property to account for running or for faster or slower gaits. When the profile identifier is set to another profile identifier, such as `DirectionsProfileIdentifier.driving`, this property is ignored in favor of the expected travel speed on each road along the route. This property may be supported by other routing profiles in the future. The value of this property must be at least `MBMinimumWalkingSpeed` and at most `MBMaximumWalkingSpeed`. The default value is `MBDefaultWalkingSpeed`. */ diff --git a/Sources/MapboxDirections/MBRouteStep.swift b/Sources/MapboxDirections/MBRouteStep.swift index cff06aa8a..6b2e8cb3f 100644 --- a/Sources/MapboxDirections/MBRouteStep.swift +++ b/Sources/MapboxDirections/MBRouteStep.swift @@ -8,7 +8,7 @@ import struct Turf.LineString */ public enum TransportType: String, Codable { - // Possible transport types when the `profileIdentifier` is `MBDirectionsProfileIdentifierAutomobile` or `MBDirectionsProfileIdentifierAutomobileAvoidingTraffic` + // Possible transport types when the `profileIdentifier` is `DirectionsProfileIdentifier.automobile` or `DirectionsProfileIdentifier.automobileAvoidingTraffic` /** The step does not have a particular transport type associated with it. @@ -20,7 +20,7 @@ public enum TransportType: String, Codable { /** The route requires the user to drive or ride a car, truck, or motorcycle. - This is the usual transport type when the `profileIdentifier` is `MBDirectionsProfileIdentifierAutomobile` or `MBDirectionsProfileIdentifierAutomobileAvoidingTraffic`. + This is the usual transport type when the `profileIdentifier` is `DirectionsProfileIdentifier.automobile` or `DirectionsProfileIdentifier.automobileAvoidingTraffic`. */ case automobile = "driving" // automobile @@ -45,21 +45,21 @@ public enum TransportType: String, Codable { */ case inaccessible = "unaccessible" // automobile, walking, cycling - // Possible transport types when the `profileIdentifier` is `MBDirectionsProfileIdentifierWalking` + // Possible transport types when the `profileIdentifier` is `DirectionsProfileIdentifier.walking` /** The route requires the user to walk. - This is the usual transport type when the `profileIdentifier` is `MBDirectionsProfileIdentifierWalking`. For cycling directions, this value indicates that the user is expected to dismount. + This is the usual transport type when the `profileIdentifier` is `DirectionsProfileIdentifier.walking`. For cycling directions, this value indicates that the user is expected to dismount. */ case walking // walking, cycling - // Possible transport types when the `profileIdentifier` is `MBDirectionsProfileIdentifierCycling` + // Possible transport types when the `profileIdentifier` is `DirectionsProfileIdentifier.cycling` /** The route requires the user to ride a bicycle. - This is the usual transport type when the `profileIdentifier` is `MBDirectionsProfileIdentifierCycling`. + This is the usual transport type when the `profileIdentifier` is `DirectionsProfileIdentifier.cycling`. */ case cycling // cycling @@ -630,7 +630,7 @@ open class RouteStep: Codable, Equatable { /** The step’s expected travel time, measured in seconds. - The value of this property reflects the time it takes to go from this step’s maneuver location to the next step’s maneuver location. If the route was calculated using the `MBDirectionsProfileIdentifierAutomobileAvoidingTraffic` profile, this property reflects current traffic conditions at the time of the request, not necessarily the traffic conditions at the time the user would begin this step. For other profiles, this property reflects travel time under ideal conditions and does not account for traffic congestion. If the step makes use of a ferry or train, the actual travel time may additionally be subject to the schedules of those services. + The value of this property reflects the time it takes to go from this step’s maneuver location to the next step’s maneuver location. If the route was calculated using the `DirectionsProfileIdentifier.automobileAvoidingTraffic` profile, this property reflects current traffic conditions at the time of the request, not necessarily the traffic conditions at the time the user would begin this step. For other profiles, this property reflects travel time under ideal conditions and does not account for traffic congestion. If the step makes use of a ferry or train, the actual travel time may additionally be subject to the schedules of those services. Do not assume that the user would travel along the step at a fixed speed. For the expected travel time on each individual segment along the leg, specify the `AttributeOptions.expectedTravelTime` option and use the `RouteLeg.expectedSegmentTravelTimes` property. */ diff --git a/Sources/MapboxDirections/MBWaypoint.swift b/Sources/MapboxDirections/MBWaypoint.swift index bfa7643c0..d4917f704 100644 --- a/Sources/MapboxDirections/MBWaypoint.swift +++ b/Sources/MapboxDirections/MBWaypoint.swift @@ -51,10 +51,10 @@ public class Waypoint: Codable { Initializes a new waypoint object with the given geographic coordinate and an optional accuracy and name. - parameter coordinate: The geographic coordinate of the waypoint. - - parameter coordinateAccuracy: The maximum distance away from the waypoint that the route may come and still be considered viable. This parameter is measured in meters. A negative value means the route may be an indefinite number of meters away from the route and still be considered viable. + - parameter coordinateAccuracy: The maximum distance away from the waypoint that the route may come and still be considered viable. This argument is measured in meters. A negative value means the route may be an indefinite number of meters away from the route and still be considered viable. - It is recommended that the value of this parameter be greater than the `horizontalAccuracy` property of a `CLLocation` object obtained from a `CLLocationManager` object. There is a high likelihood that the user may be located some distance away from a navigable road, for instance if the user is currently on a driveway or inside a building. - - parameter name: The name of the waypoint. This parameter does not affect the route but may help you to distinguish one waypoint from another. + It is recommended that the value of this argument be greater than the `horizontalAccuracy` property of a `CLLocation` object obtained from a `CLLocationManager` object. There is a high likelihood that the user may be located some distance away from a navigable road, for instance if the user is currently on a driveway or inside a building. + - parameter name: The name of the waypoint. This argument does not affect the route but may help you to distinguish one waypoint from another. */ public init(coordinate: CLLocationCoordinate2D, coordinateAccuracy: CLLocationAccuracy? = nil, name: String? = nil) { self.coordinate = coordinate @@ -70,7 +70,7 @@ public class Waypoint: Codable { - parameter location: A `CLLocation` object representing the waypoint’s location. This initializer respects the `CLLocation` class’s `coordinate` and `horizontalAccuracy` properties, converting them into the `coordinate` and `coordinateAccuracy` properties, respectively. - parameter heading: A `CLLocationDirection` value representing the direction from which the route must approach the waypoint in order to be considered viable. This value is stored in the `headingAccuracy` property. - - parameter name: The name of the waypoint. This parameter does not affect the route but may help you to distinguish one waypoint from another. + - parameter name: The name of the waypoint. This argument does not affect the route but may help you to distinguish one waypoint from another. */ public init(location: CLLocation, heading: CLLocationDirection? = nil, name: String? = nil) { coordinate = location.coordinate @@ -88,7 +88,7 @@ public class Waypoint: Codable { - parameter location: A `CLLocation` object representing the waypoint’s location. This initializer respects the `CLLocation` class’s `coordinate` and `horizontalAccuracy` properties, converting them into the `coordinate` and `coordinateAccuracy` properties, respectively. - parameter heading: A `CLHeading` object representing the direction from which the route must approach the waypoint in order to be considered viable. This initializer respects the `CLHeading` class’s `trueHeading` property or `magneticHeading` property, converting it into the `headingAccuracy` property. - - parameter name: The name of the waypoint. This parameter does not affect the route but may help you to distinguish one waypoint from another. + - parameter name: The name of the waypoint. This argument does not affect the route but may help you to distinguish one waypoint from another. */ public init(location: CLLocation, heading: CLHeading? = nil, name: String? = nil) { coordinate = location.coordinate @@ -174,7 +174,7 @@ public class Waypoint: Codable { /** The name of the waypoint. - This parameter does not affect the route, but you can set the name of a waypoint you pass into a `RouteOptions` object to help you distinguish one waypoint from another in the array of waypoints passed into the completion handler of the `Directions.calculate(_:completionHandler:)` method. + This argument does not affect the route, but you can set the name of a waypoint you pass into a `RouteOptions` object to help you distinguish one waypoint from another in the array of waypoints passed into the completion handler of the `Directions.calculate(_:completionHandler:)` method. */ public var name: String? diff --git a/Sources/MapboxDirections/Match/MBMatchOptions.swift b/Sources/MapboxDirections/Match/MBMatchOptions.swift index f89757369..db03ffdc8 100644 --- a/Sources/MapboxDirections/Match/MBMatchOptions.swift +++ b/Sources/MapboxDirections/Match/MBMatchOptions.swift @@ -12,8 +12,8 @@ open class MatchOptions: DirectionsOptions { /** Initializes a match options object for matching locations against the road network. - - parameter locations: An array of `CLLocation` objects representing locations to attempt to match against the road network. The array should contain at least two locations (the source and destination) and at most 100 locations. (Some profiles, such as `MBDirectionsProfileIdentifierAutomobileAvoidingTraffic`, [may have lower limits](https://docs.mapbox.com/api/navigation/#directions).) - - parameter profileIdentifier: A string specifying the primary mode of transportation for the routes. This parameter, if set, should be set to `MBDirectionsProfileIdentifierAutomobile`, `MBDirectionsProfileIdentifierAutomobileAvoidingTraffic`, `MBDirectionsProfileIdentifierCycling`, or `MBDirectionsProfileIdentifierWalking`. `MBDirectionsProfileIdentifierAutomobile` is used by default. + - parameter locations: An array of `CLLocation` objects representing locations to attempt to match against the road network. The array should contain at least two locations (the source and destination) and at most 100 locations. (Some profiles, such as `DirectionsProfileIdentifier.automobileAvoidingTraffic`, [may have lower limits](https://docs.mapbox.com/api/navigation/#directions).) + - parameter profileIdentifier: A string specifying the primary mode of transportation for the routes. `DirectionsProfileIdentifier.automobile` is used by default. */ public convenience init(locations: [CLLocation], profileIdentifier: DirectionsProfileIdentifier? = nil) { let waypoints = locations.map { @@ -25,8 +25,8 @@ open class MatchOptions: DirectionsOptions { /** Initializes a match options object for matching geographic coordinates against the road network. - - parameter coordinates: An array of geographic coordinates representing locations to attempt to match against the road network. The array should contain at least two locations (the source and destination) and at most 100 locations. (Some profiles, such as `MBDirectionsProfileIdentifierAutomobileAvoidingTraffic`, [may have lower limits](https://docs.mapbox.com/api/navigation/#directions).) Each coordinate is converted into a `Waypoint` object. - - parameter profileIdentifier: A string specifying the primary mode of transportation for the routes. This parameter, if set, should be set to `MBDirectionsProfileIdentifierAutomobile`, `MBDirectionsProfileIdentifierAutomobileAvoidingTraffic`, `MBDirectionsProfileIdentifierCycling`, or `MBDirectionsProfileIdentifierWalking`. `MBDirectionsProfileIdentifierAutomobile` is used by default. + - parameter coordinates: An array of geographic coordinates representing locations to attempt to match against the road network. The array should contain at least two locations (the source and destination) and at most 100 locations. (Some profiles, such as `DirectionsProfileIdentifier.automobileAvoidingTraffic`, [may have lower limits](https://docs.mapbox.com/api/navigation/#directions).) Each coordinate is converted into a `Waypoint` object. + - parameter profileIdentifier: A string specifying the primary mode of transportation for the routes. `DirectionsProfileIdentifier.automobile` is used by default. */ public convenience init(coordinates: [CLLocationCoordinate2D], profileIdentifier: DirectionsProfileIdentifier? = nil) { let waypoints = coordinates.map { From 2f5f207c497d7415cc8027c9467656d2fb425799 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Minh=20Nguye=CC=82=CC=83n?= Date: Wed, 30 Oct 2019 02:48:22 -0700 Subject: [PATCH 29/89] =?UTF-8?q?These=20are=20speeds=20people=20walk,=20n?= =?UTF-8?q?ot=20=E2=80=9CMapbox=E2=80=9D=20speeds?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Sources/MapboxDirections/MBRouteOptions.swift | 36 +++++++++---------- 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/Sources/MapboxDirections/MBRouteOptions.swift b/Sources/MapboxDirections/MBRouteOptions.swift index 2da619ea5..440bccf7e 100644 --- a/Sources/MapboxDirections/MBRouteOptions.swift +++ b/Sources/MapboxDirections/MBRouteOptions.swift @@ -137,7 +137,7 @@ open class RouteOptions: DirectionsOptions { This property has no effect unless the profile identifier is set to `DirectionsProfileIdentifier.walking`. - The value of this property must be at least `MBDirectionsPriority.low` and at most `MBDirectionsPriority.high`. The default value of `MBDirectionsPriority.default` neither prefers nor avoids alleys, while a negative value between `MBDirectionsPriority.low` and `MBDirectionsPriority.default` avoids alleys, and a positive value between `MBDirectionsPriority.default` and `MBDirectionsPriority.high` prefers alleys. A value of 0.9 is suitable for pedestrians who are comfortable with walking down alleys. + The value of this property must be at least `DirectionsPriority.low` and at most `DirectionsPriority.high`. The default value of `DirectionsPriority.default` neither prefers nor avoids alleys, while a negative value between `DirectionsPriority.low` and `DirectionsPriority.default` avoids alleys, and a positive value between `DirectionsPriority.default` and `DirectionsPriority.high` prefers alleys. A value of 0.9 is suitable for pedestrians who are comfortable with walking down alleys. */ open var alleyPriority: DirectionsPriority = .default @@ -146,7 +146,7 @@ open class RouteOptions: DirectionsOptions { This property has no effect unless the profile identifier is set to `DirectionsProfileIdentifier.walking`. You can adjust this property to avoid [sidewalks and crosswalks that are mapped as separate footpaths](https://wiki.openstreetmap.org/wiki/Sidewalks#Sidewalk_as_separate_way), which may be more granular than needed for some forms of pedestrian navigation. - The value of this property must be at least `MBDirectionsPriority.low` and at most `MBDirectionsPriority.high`. The default value of `MBDirectionsPriority.default` neither prefers nor avoids walkways, while a negative value between `MBDirectionsPriority.low` and `MBDirectionsPriority.default` avoids walkways, and a positive value between `MBDirectionsPriority.default` and `MBDirectionsPriority.high` prefers walkways. A value of −0.1 results in less verbose routes in cities where sidewalks and crosswalks are generally mapped as separate footpaths. + The value of this property must be at least `DirectionsPriority.low` and at most `DirectionsPriority.high`. The default value of `DirectionsPriority.default` neither prefers nor avoids walkways, while a negative value between `DirectionsPriority.low` and `DirectionsPriority.default` avoids walkways, and a positive value between `DirectionsPriority.default` and `DirectionsPriority.high` prefers walkways. A value of −0.1 results in less verbose routes in cities where sidewalks and crosswalks are generally mapped as separate footpaths. */ open var walkwayPriority: DirectionsPriority = .default @@ -155,9 +155,9 @@ open class RouteOptions: DirectionsOptions { This property has no effect unless the profile identifier is set to `DirectionsProfileIdentifier.walking`. You can adjust this property to account for running or for faster or slower gaits. When the profile identifier is set to another profile identifier, such as `DirectionsProfileIdentifier.driving`, this property is ignored in favor of the expected travel speed on each road along the route. This property may be supported by other routing profiles in the future. - The value of this property must be at least `MBMinimumWalkingSpeed` and at most `MBMaximumWalkingSpeed`. The default value is `MBDefaultWalkingSpeed`. + The value of this property must be at least `CLLocationSpeed.minimumWalking` and at most `CLLocationSpeed.maximumWalking`. The default value is `CLLocationSpeed.normalWalking`. */ - open var speed: CLLocationSpeed = CLLocationSpeed.Mapbox.default + open var speed: CLLocationSpeed = .normalWalking /** An array of URL parameters to include in the request URL. @@ -218,18 +218,18 @@ public enum InstructionFormat: String { extension CLLocationSpeed { - enum Mapbox{ - /** - By default, pedestrians are assumed to walk at an average rate of 1.42 meters per second (5.11 kilometers per hour or 3.18 miles per hour), corresponding to a typical preferred walking speed. - */ - static let minimum: CLLocationSpeed = 0.14 - /** - Pedestrians are assumed to walk no slower than 0.14 meters per second (0.50 kilometers per hour or 0.31 miles per hour) on average. - */ - static let `default`: CLLocationSpeed = 1.42 - /** - Pedestrians are assumed to walk no faster than 6.94 meters per second (25.0 kilometers per hour or 15.5 miles per hour) on average. - */ - static let maximum: CLLocationSpeed = 6.94 - } + /** + By default, pedestrians are assumed to walk at an average rate of 1.42 meters per second (5.11 kilometers per hour or 3.18 miles per hour), corresponding to a typical preferred walking speed. + */ + static let normalWalking: CLLocationSpeed = 1.42 + + /** + Pedestrians are assumed to walk no slower than 0.14 meters per second (0.50 kilometers per hour or 0.31 miles per hour) on average. + */ + static let minimumWalking: CLLocationSpeed = 0.14 + + /** + Pedestrians are assumed to walk no faster than 6.94 meters per second (25.0 kilometers per hour or 15.5 miles per hour) on average. + */ + static let maximumWalking: CLLocationSpeed = 6.94 } From abfaed3fed00e5faa4cb286096dd80f30ce9fd45 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Minh=20Nguye=CC=82=CC=83n?= Date: Wed, 30 Oct 2019 02:48:43 -0700 Subject: [PATCH 30/89] Updated references to classes in documentation --- Sources/MapboxDirections/MBDirectionsOptions.swift | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Sources/MapboxDirections/MBDirectionsOptions.swift b/Sources/MapboxDirections/MBDirectionsOptions.swift index d9989b21a..124096b05 100644 --- a/Sources/MapboxDirections/MBDirectionsOptions.swift +++ b/Sources/MapboxDirections/MBDirectionsOptions.swift @@ -181,9 +181,9 @@ open class DirectionsOptions: Codable, Equatable { open var profileIdentifier: DirectionsProfileIdentifier /** - A Boolean value indicating whether `MBRouteStep` objects should be included in the response. + A Boolean value indicating whether `RouteStep` objects should be included in the response. - If the value of this property is `true`, the returned route contains turn-by-turn instructions. Each returned `MBRoute` object contains one or more `MBRouteLeg` object that in turn contains one or more `MBRouteStep` objects. On the other hand, if the value of this property is `false`, the `MBRouteLeg` objects contain no `MBRouteStep` objects. + If the value of this property is `true`, the returned route contains turn-by-turn instructions. Each returned `Route` object contains one or more `RouteLeg` object that in turn contains one or more `RouteStep` objects. On the other hand, if the value of this property is `false`, the `RouteLeg` objects contain no `RouteStep` objects. If you only want to know the distance or estimated travel time to a destination, set this property to `false` to minimize the size of the response and the time it takes to calculate the response. If you need to display turn-by-turn instructions, set this property to `true`. From 0f245702b40fef3fcab8149a0c6489e24ee1bdc5 Mon Sep 17 00:00:00 2001 From: Jerrad Thramer Date: Wed, 30 Oct 2019 11:05:59 -0600 Subject: [PATCH 31/89] Renamed lineString to shape --- Sources/MapboxDirections/MBDirectionsResult.swift | 10 +++++----- Sources/MapboxDirections/MBRouteStep.swift | 12 ++++++------ 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/Sources/MapboxDirections/MBDirectionsResult.swift b/Sources/MapboxDirections/MBDirectionsResult.swift index a1c2ad27f..089f3a4eb 100644 --- a/Sources/MapboxDirections/MBDirectionsResult.swift +++ b/Sources/MapboxDirections/MBDirectionsResult.swift @@ -33,9 +33,9 @@ open class DirectionsResult: Codable { _directionsOptions = decoder.userInfo[.options] as! DirectionsOptions if let polyLineString = try container.decodeIfPresent(PolyLineString.self, forKey: .geometry) { - lineString = try LineString(polyLineString: polyLineString) + shape = try LineString(polyLineString: polyLineString) } else { - lineString = nil + shape = nil } // Associate each leg JSON with a source and destination. The sequence of destinations is offset by one from the sequence of sources. @@ -66,8 +66,8 @@ open class DirectionsResult: Codable { public func encode(to encoder: Encoder) throws { var container = encoder.container(keyedBy: CodingKeys.self) try container.encode(legs, forKey: .legs) - if let lineString = lineString { - let polyLineString = PolyLineString(lineString: lineString, shapeFormat: directionsOptions.shapeFormat) + if let shape = shape { + let polyLineString = PolyLineString(lineString: shape, shapeFormat: directionsOptions.shapeFormat) try container.encode(polyLineString, forKey: .geometry) } try container.encode(distance, forKey: .distance) @@ -85,7 +85,7 @@ open class DirectionsResult: Codable { Using the [Mapbox Maps SDK for iOS](https://docs.mapbox.com/ios/maps/) or [Mapbox Maps SDK for macOS](https://mapbox.github.io/mapbox-gl-native/macos/), you can create an `MGLPolyline` object using these coordinates to display an overview of the route on an `MGLMapView`. */ - public let lineString: LineString? + public let shape: LineString? /** An array of `RouteLeg` objects representing the legs of the route. diff --git a/Sources/MapboxDirections/MBRouteStep.swift b/Sources/MapboxDirections/MBRouteStep.swift index 6b2e8cb3f..74dfa992e 100644 --- a/Sources/MapboxDirections/MBRouteStep.swift +++ b/Sources/MapboxDirections/MBRouteStep.swift @@ -395,8 +395,8 @@ open class RouteStep: Codable, Equatable { try container.encodeIfPresent(intersections, forKey: .intersections) try container.encode(drivingSide, forKey: .drivingSide) try container.encodeIfPresent(name, forKey: .name) - if let lineString = lineString, let shapeFormat = encoder.userInfo[.options] as? RouteShapeFormat { - let polyLineString = PolyLineString(lineString: lineString, shapeFormat: shapeFormat) + if let shape = shape, let shapeFormat = encoder.userInfo[.options] as? RouteShapeFormat { + let polyLineString = PolyLineString(lineString: shape, shapeFormat: shapeFormat) try container.encode(polyLineString, forKey: .geometry) } @@ -426,9 +426,9 @@ open class RouteStep: Codable, Equatable { finalHeading = try maneuver.decodeIfPresent(CLLocationDirection.self, forKey: .finalHeading) if let polyLineString = try container.decodeIfPresent(PolyLineString.self, forKey: .geometry) { - lineString = try LineString(polyLineString: polyLineString) + shape = try LineString(polyLineString: polyLineString) } else { - lineString = nil + shape = nil } name = try container.decode(String.self, forKey: .name) @@ -518,7 +518,7 @@ open class RouteStep: Codable, Equatable { Using the [Mapbox Maps SDK for iOS](https://www.mapbox.com/ios-sdk/) or [Mapbox Maps SDK for macOS](https://github.com/mapbox/mapbox-gl-native/tree/master/platform/macos/), you can create an `MGLPolyline` object using the `LineString.coordinates` property to display a portion of a route on an `MGLMapView`. */ - public var lineString: LineString? + public var shape: LineString? // MARK: Getting Details About the Maneuver @@ -698,7 +698,7 @@ open class RouteStep: Codable, Equatable { // MARK: - Equality public static func == (lhs: RouteStep, rhs: RouteStep) -> Bool { return lhs.codes == rhs.codes && - lhs.lineString == rhs.lineString && + lhs.shape == rhs.shape && lhs.destinationCodes == rhs.destinationCodes && lhs.destinations == rhs.destinations && lhs.distance == rhs.distance && From aaf20a33c4dc41c8759dcbea2e2443493c9114e2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Minh=20Nguye=CC=82=CC=83n?= Date: Wed, 30 Oct 2019 11:21:14 -0700 Subject: [PATCH 32/89] Rewrote errors based on LocalizedError --- .../MapboxDirections/DirectionsError.swift | 134 ++++++++++-------- .../MapboxDirections/Extensions/GeoJSON.swift | 6 +- Sources/MapboxDirections/MBDirections.swift | 51 +++---- 3 files changed, 96 insertions(+), 95 deletions(-) diff --git a/Sources/MapboxDirections/DirectionsError.swift b/Sources/MapboxDirections/DirectionsError.swift index 6006c7ada..6a051d875 100644 --- a/Sources/MapboxDirections/DirectionsError.swift +++ b/Sources/MapboxDirections/DirectionsError.swift @@ -1,43 +1,32 @@ import Foundation -import CoreLocation - -public protocol DirectionsError: Error { - var failureReason: String { get } - var recoverySuggestion: String { get } -} - -public enum MapboxDirectionsError: DirectionsError, RawRepresentable, Equatable { - public init?(rawValue: String) { - assertionFailure("Do not use init(rawValue:) for DirectionsError.") - return nil - } - - public var rawValue: String { - return """ - Error: \(String(describing: self)) - Failure Reason: \(failureReason) - Recovery Suggestion: \(recoverySuggestion) - """ - } - public var localizedDescription: String { - return failureReason - } +public enum DirectionsError: LocalizedError, Equatable { + case noData + case invalidInput(message: String?) + case invalidResponse + case unableToRoute + case noMatches + case tooManyCoordinates + case unableToLocate + case profileNotFound + case requestTooLarge + case rateLimited(rateLimitInterval: TimeInterval?, rateLimit: UInt?, resetTime: Date?) + case unknown(response: URLResponse?, underlying: Error?, code: String?, message: String?) - public var failureReason: String { + public var failureReason: String? { switch self { case .noData: - return "No data was returned from the server." + return "The server returned an empty response." case let .invalidInput(message): - return "The server did not accept the format of the request. Message returned: \(message ?? "")" + return message case .invalidResponse: - return "A response was recieved from the server, but it was not of a valid format." + return "The server returned a response that isn’t correctly formatted." case .unableToRoute: return "No route could be found between the specified locations." case .noMatches: - return "The input did not produce any matches." + return "The specified coordinates could not be matched to the road network." case .tooManyCoordinates: - return "There are too many points in the request." + return "The request specifies too many coordinates." case .unableToLocate: return "A specified location could not be associated with a roadway or pathway." case .profileNotFound: @@ -53,54 +42,77 @@ public enum MapboxDirectionsError: DirectionsError, RawRepresentable, Equatable let formattedInterval = intervalFormatter.string(from: interval) ?? "\(interval) seconds" let formattedCount = NumberFormatter.localizedString(from: NSNumber(value: limit), number: .decimal) return "More than \(formattedCount) requests have been made with this access token within a period of \(formattedInterval)." - case let .unknown(response, underlying: error, code, message): - return "Unknown Error. Response: \(response.debugDescription) Underlying Error: \(error.debugDescription) Code: \(code.debugDescription) Message:\(message.debugDescription)" + case let .unknown(_, underlying: error, _, message): + return message + ?? (error as NSError?)?.userInfo[NSLocalizedFailureReasonErrorKey] as? String + ?? HTTPURLResponse.localizedString(forStatusCode: (error as NSError?)?.code ?? -1) } } - public var recoverySuggestion: String { + public var recoverySuggestion: String? { switch self { - case .noData: - return "Make sure you have an active internet connection." - case let .invalidInput(message): - return "Please adjust the input according to the message returned from the server. Message Returned: \(message ?? "")" + case .noData, .invalidInput, .invalidResponse: + return nil case .unableToRoute: return "Make sure it is possible to travel between the locations with the mode of transportation implied by the profileIdentifier option. For example, it is impossible to travel by car from one continent to another without either a land bridge or a ferry connection." case .noMatches: - return "Please try again making sure that your tracepoints lie in close proximity to a road or path." + return "Try again making sure that your tracepoints lie in close proximity to a road or path." case .tooManyCoordinates: - return "Please try again with 100 coordinates or less." + return "Try again with 100 coordinates or fewer." case .unableToLocate: - return "Make sure the locations are close enough to a roadway or pathway. Try setting the coordinateAccuracy property of all the waypoints to a negative value." + return "Make sure the locations are close enough to a roadway or pathway. Try setting the coordinateAccuracy property of all the waypoints to nil." case .profileNotFound: return "Make sure the profileIdentifier option is set to one of the provided constants, such as DirectionsProfileIdentifier.automobile." case .requestTooLarge: return "Try specifying fewer waypoints or giving the waypoints shorter names." - case let .rateLimited(rateLimitInterval: _, rateLimit: _, resetTime: reset): - guard let reset = reset else { - return "Wait a little while before retrying." + case let .rateLimited(rateLimitInterval: _, rateLimit: _, resetTime: rolloverTime): + guard let rolloverTime = rolloverTime else { + return nil } - let formattedDate: String = DateFormatter.localizedString(from: reset, dateStyle: .long, timeStyle: .long) + let formattedDate: String = DateFormatter.localizedString(from: rolloverTime, dateStyle: .long, timeStyle: .long) return "Wait until \(formattedDate) before retrying." - case .invalidResponse: - fallthrough - case .unknown(_,_,_,_): - return "Please contact Mapbox Support." + case let .unknown(_, underlying: error, _, _): + return (error as NSError?)?.userInfo[NSLocalizedRecoverySuggestionErrorKey] as? String } } - public typealias RawValue = String - - - case noData - case invalidInput(message: String?) - case invalidResponse - case unableToRoute - case noMatches - case tooManyCoordinates - case unableToLocate - case profileNotFound - case requestTooLarge - case rateLimited(rateLimitInterval: TimeInterval?, rateLimit: UInt?, resetTime: Date?) - case unknown(response: URLResponse?, underlying: Error?, code: String?, message: String?) + public static func == (lhs: DirectionsError, rhs: DirectionsError) -> Bool { + switch (lhs, rhs) { + case (.noData, .noData), + (.invalidResponse, .invalidResponse), + (.unableToRoute, .unableToRoute), + (.noMatches, .noMatches), + (.tooManyCoordinates, .tooManyCoordinates), + (.unableToLocate, .unableToLocate), + (.profileNotFound, .profileNotFound), + (.requestTooLarge, .requestTooLarge): + return true + case let (.invalidInput(lhsMessage), .invalidInput(rhsMessage)): + return lhsMessage == rhsMessage + case (.rateLimited(let lhsRateLimitInterval, let lhsRateLimit, let lhsResetTime), + .rateLimited(let rhsRateLimitInterval, let rhsRateLimit, let rhsResetTime)): + return lhsRateLimitInterval == rhsRateLimitInterval + && lhsRateLimit == rhsRateLimit + && lhsResetTime == rhsResetTime + case (.unknown(let lhsResponse, let lhsUnderlying, let lhsCode, let lhsMessage), + .unknown(let rhsResponse, let rhsUnderlying, let rhsCode, let rhsMessage)): + return lhsResponse == rhsResponse + && type(of: lhsUnderlying) == type(of: rhsUnderlying) + && lhsUnderlying?.localizedDescription == rhsUnderlying?.localizedDescription + && lhsCode == rhsCode + && lhsMessage == rhsMessage + case (.noData, _), + (.invalidResponse, _), + (.unableToRoute, _), + (.noMatches, _), + (.tooManyCoordinates, _), + (.unableToLocate, _), + (.profileNotFound, _), + (.requestTooLarge, _), + (.invalidInput, _), + (.rateLimited, _), + (.unknown, _): + return false + } + } } diff --git a/Sources/MapboxDirections/Extensions/GeoJSON.swift b/Sources/MapboxDirections/Extensions/GeoJSON.swift index 39b2bc35c..1b886e1bd 100644 --- a/Sources/MapboxDirections/Extensions/GeoJSON.swift +++ b/Sources/MapboxDirections/Extensions/GeoJSON.swift @@ -21,17 +21,17 @@ extension LineString { } } -public enum GeometryError: DirectionsError { +public enum GeometryError: LocalizedError { case cannotDecodePolyline(precision: Double) - public var failureReason: String { + public var failureReason: String? { switch self { case let .cannotDecodePolyline(precision): return "Unable to decode the string as a polyline with precision \(precision)" } } - public var recoverySuggestion: String { + public var recoverySuggestion: String? { switch self { case .cannotDecodePolyline: return "Choose the precision that the string was encoded with." diff --git a/Sources/MapboxDirections/MBDirections.swift b/Sources/MapboxDirections/MBDirections.swift index 962742b80..cb48666e2 100644 --- a/Sources/MapboxDirections/MBDirections.swift +++ b/Sources/MapboxDirections/MBDirections.swift @@ -89,14 +89,6 @@ open class Directions: NSObject { */ public typealias MatchCompletionHandler = (_ matches: [Match]?, _ error: DirectionsError?) -> Void - - ///:nodoc: - typealias MapboxRouteCompletionHandler = (_ waypoints: [Waypoint]?, _ routes: [Route]?, _ error: MapboxDirectionsError?) -> Void - - ///:nodoc: - typealias MapboxMatchCompletionHandler = (_ matches: [Match]?, _ error: MapboxDirectionsError?) -> Void - - // MARK: Creating a Directions Object /** @@ -168,24 +160,23 @@ open class Directions: NSObject { @discardableResult open func calculate(_ options: RouteOptions, completionHandler: @escaping RouteCompletionHandler) -> URLSessionDataTask { - let completion = completionHandler as MapboxRouteCompletionHandler let fetchStart = Date() let request = urlRequest(forCalculating: options) let requestTask = URLSession.shared.dataTask(with: request) { (possibleData, possibleResponse, possibleError) in let responseEndDate = Date() guard let response = possibleResponse, ["application/json", "text/html"].contains(response.mimeType) else { - completion(nil, nil, .invalidResponse) + completionHandler(nil, nil, .invalidResponse) return } guard let data = possibleData else { - completion(nil, nil, .noData) + completionHandler(nil, nil, .noData) return } if let error = possibleError { - completion(nil, nil, .unknown(response: possibleResponse, underlying: error, code: nil, message: nil)) + completionHandler(nil, nil, .unknown(response: possibleResponse, underlying: error, code: nil, message: nil)) return } @@ -195,24 +186,24 @@ open class Directions: NSObject { let result = try decoder.decode(RouteResponse.self, from: data) guard (result.code == nil && result.message == nil) || result.code == "Ok" else { let apiError = Directions.informativeError(code: result.code, message: result.message, response: response, underlyingError: possibleError) - completion(nil, nil, apiError) + completionHandler(nil, nil, apiError) return } guard let routes = result.routes else { - completion(result.waypoints, nil, .unableToRoute) + completionHandler(result.waypoints, nil, .unableToRoute) return } self.postprocess(routes, fetchStartDate: fetchStart, responseEndDate: responseEndDate, uuid: result.uuid) DispatchQueue.main.async { - completion(result.waypoints, routes, nil) + completionHandler(result.waypoints, routes, nil) } } catch { DispatchQueue.main.async { let bailError = Directions.informativeError(code: nil, message: nil, response: response, underlyingError: error) - completion(nil, nil, bailError) + completionHandler(nil, nil, bailError) } } @@ -241,24 +232,23 @@ open class Directions: NSObject { */ @discardableResult open func calculate(_ options: MatchOptions, completionHandler: @escaping MatchCompletionHandler) -> URLSessionDataTask { - let completion = completionHandler as MapboxMatchCompletionHandler let fetchStart = Date() let request = urlRequest(forCalculating: options) let requestTask = URLSession.shared.dataTask(with: request) { (possibleData, possibleResponse, possibleError) in let responseEndDate = Date() guard let response = possibleResponse, response.mimeType == "application/json" else { - completion(nil, .invalidResponse) + completionHandler(nil, .invalidResponse) return } guard let data = possibleData else { - completion(nil, .noData) + completionHandler(nil, .noData) return } if let error = possibleError { - completion(nil, .unknown(response: possibleResponse, underlying: error, code: nil, message: nil)) + completionHandler(nil, .unknown(response: possibleResponse, underlying: error, code: nil, message: nil)) return } @@ -268,23 +258,23 @@ open class Directions: NSObject { let result = try decoder.decode(MatchResponse.self, from: data) guard result.code == "Ok" else { let apiError = Directions.informativeError(code: result.code, message: result.message, response: response, underlyingError: possibleError) - completion(nil, apiError) + completionHandler(nil, apiError) return } guard let matches = result.matches else { - completion(nil, .unableToRoute) + completionHandler(nil, .unableToRoute) return } self.postprocess(matches, fetchStartDate: fetchStart, responseEndDate: responseEndDate, uuid: nil) DispatchQueue.main.async { - completion(matches, nil) + completionHandler(matches, nil) } } catch { DispatchQueue.main.async { - completion(nil, .unknown(response: response, underlying: error, code: nil, message: nil)) + completionHandler(nil, .unknown(response: response, underlying: error, code: nil, message: nil)) } } @@ -311,24 +301,23 @@ open class Directions: NSObject { */ @discardableResult open func calculateRoutes(matching options: MatchOptions, completionHandler: @escaping RouteCompletionHandler) -> URLSessionDataTask { - let completion = completionHandler as MapboxRouteCompletionHandler let fetchStart = Date() let request = urlRequest(forCalculating: options) let requestTask = URLSession.shared.dataTask(with: request) { (possibleData, possibleResponse, possibleError) in let responseEndDate = Date() guard let response = possibleResponse, response.mimeType == "application/json" else { - completion(nil, nil, .invalidResponse) + completionHandler(nil, nil, .invalidResponse) return } guard let data = possibleData else { - completion(nil, nil, .noData) + completionHandler(nil, nil, .noData) return } if let error = possibleError { - completion(nil, nil, .unknown(response: possibleResponse, underlying: error, code: nil, message: nil)) + completionHandler(nil, nil, .unknown(response: possibleResponse, underlying: error, code: nil, message: nil)) return } @@ -343,7 +332,7 @@ open class Directions: NSObject { } guard let routes = result.routes else { - completion(result.waypoints, nil, .unableToRoute) + completionHandler(result.waypoints, nil, .unableToRoute) return } @@ -354,7 +343,7 @@ open class Directions: NSObject { } } catch { DispatchQueue.main.async { - completion(nil, nil, .unknown(response: response, underlying: error, code: nil, message: nil)) + completionHandler(nil, nil, .unknown(response: response, underlying: error, code: nil, message: nil)) } } @@ -438,7 +427,7 @@ open class Directions: NSObject { /** Returns an error that supplements the given underlying error with additional information from the an HTTP response’s body or headers. */ - static func informativeError(code: String?, message: String?, response: URLResponse?, underlyingError error: Error?) -> MapboxDirectionsError { + static func informativeError(code: String?, message: String?, response: URLResponse?, underlyingError error: Error?) -> DirectionsError { if let response = response as? HTTPURLResponse { switch (response.statusCode, code ?? "") { case (200, "NoRoute"): From 42923910e1d94348f6640f06bc192dd122087198 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Minh=20Nguye=CC=82=CC=83n?= Date: Wed, 30 Oct 2019 14:29:32 -0700 Subject: [PATCH 33/89] Reverted to JSON-representable objects; implemented JSON comparison --- MapboxDirections.xcodeproj/project.pbxproj | 8 + .../IntersectionTests.swift | 158 +++++++----------- .../JSONSerialization.swift | 90 ++++++++++ .../VisualInstructionComponentTests.swift | 28 ++-- 4 files changed, 176 insertions(+), 108 deletions(-) create mode 100644 Tests/MapboxDirectionsTests/JSONSerialization.swift diff --git a/MapboxDirections.xcodeproj/project.pbxproj b/MapboxDirections.xcodeproj/project.pbxproj index 5a7d6adfa..31e059479 100644 --- a/MapboxDirections.xcodeproj/project.pbxproj +++ b/MapboxDirections.xcodeproj/project.pbxproj @@ -234,6 +234,9 @@ DAA76D691DD127CB0015EC78 /* MBLaneIndication.swift in Sources */ = {isa = PBXBuildFile; fileRef = DAA76D671DD127CB0015EC78 /* MBLaneIndication.swift */; }; DAA76D6A1DD127CB0015EC78 /* MBLaneIndication.swift in Sources */ = {isa = PBXBuildFile; fileRef = DAA76D671DD127CB0015EC78 /* MBLaneIndication.swift */; }; DAA76D6B1DD127CB0015EC78 /* MBLaneIndication.swift in Sources */ = {isa = PBXBuildFile; fileRef = DAA76D671DD127CB0015EC78 /* MBLaneIndication.swift */; }; + DABE6C7E236A37E200D370F4 /* JSONSerialization.swift in Sources */ = {isa = PBXBuildFile; fileRef = DABE6C7D236A37E200D370F4 /* JSONSerialization.swift */; }; + DABE6C7F236A37E200D370F4 /* JSONSerialization.swift in Sources */ = {isa = PBXBuildFile; fileRef = DABE6C7D236A37E200D370F4 /* JSONSerialization.swift */; }; + DABE6C80236A37E200D370F4 /* JSONSerialization.swift in Sources */ = {isa = PBXBuildFile; fileRef = DABE6C7D236A37E200D370F4 /* JSONSerialization.swift */; }; DAC05F161CFBFAC400FA0071 /* MBWaypoint.swift in Sources */ = {isa = PBXBuildFile; fileRef = DAC05F151CFBFAC400FA0071 /* MBWaypoint.swift */; }; DAC05F181CFC075300FA0071 /* MBRoute.swift in Sources */ = {isa = PBXBuildFile; fileRef = DAC05F171CFC075300FA0071 /* MBRoute.swift */; }; DAC05F1A1CFC077C00FA0071 /* MBRouteLeg.swift in Sources */ = {isa = PBXBuildFile; fileRef = DAC05F191CFC077C00FA0071 /* MBRouteLeg.swift */; }; @@ -390,6 +393,7 @@ DA737EE31D05F91E005BDA16 /* v5_driving_dc_geojson.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = v5_driving_dc_geojson.json; sourceTree = ""; }; DA9E1B121E5A675F0081EDC7 /* Polyline.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Polyline.framework; path = Carthage/Build/watchOS/Polyline.framework; sourceTree = ""; }; DAA76D671DD127CB0015EC78 /* MBLaneIndication.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MBLaneIndication.swift; sourceTree = ""; }; + DABE6C7D236A37E200D370F4 /* JSONSerialization.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = JSONSerialization.swift; sourceTree = ""; }; DAC05F151CFBFAC400FA0071 /* MBWaypoint.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MBWaypoint.swift; sourceTree = ""; }; DAC05F171CFC075300FA0071 /* MBRoute.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MBRoute.swift; sourceTree = ""; }; DAC05F191CFC077C00FA0071 /* MBRouteLeg.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MBRouteLeg.swift; sourceTree = ""; }; @@ -648,6 +652,7 @@ DA6C9DAD1CAEC93800094FBC /* Fixtures */, 35CC310A2285739700EA1966 /* WalkingOptionsTests.swift */, 3556CE9922649CF2009397B5 /* MapboxDirectionsTests-Bridging-Header.h */, + DABE6C7D236A37E200D370F4 /* JSONSerialization.swift */, ); name = MapboxDirectionsTests; path = Tests/MapboxDirectionsTests; @@ -1222,6 +1227,7 @@ C5D1D7F31F6AFBD600A1C4F1 /* IntructionsTests.swift in Sources */, DA4F84EE21C08BFB008A0434 /* WaypointTests.swift in Sources */, 35CC310C2285739700EA1966 /* WalkingOptionsTests.swift in Sources */, + DABE6C7F236A37E200D370F4 /* JSONSerialization.swift in Sources */, F4D785F01DDD82C100FF4665 /* RouteStepTests.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; @@ -1289,6 +1295,7 @@ C5D1D7F41F6AFBD600A1C4F1 /* IntructionsTests.swift in Sources */, DA4F84EF21C08BFB008A0434 /* WaypointTests.swift in Sources */, 35CC310D2285739700EA1966 /* WalkingOptionsTests.swift in Sources */, + DABE6C80236A37E200D370F4 /* JSONSerialization.swift in Sources */, F4D785F11DDD82C100FF4665 /* RouteStepTests.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; @@ -1402,6 +1409,7 @@ C52CE3931F6AF6E70069963D /* IntructionsTests.swift in Sources */, DA4F84ED21C08BFB008A0434 /* WaypointTests.swift in Sources */, 35CC310B2285739700EA1966 /* WalkingOptionsTests.swift in Sources */, + DABE6C7E236A37E200D370F4 /* JSONSerialization.swift in Sources */, F4D785EF1DDD82C100FF4665 /* RouteStepTests.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; diff --git a/Tests/MapboxDirectionsTests/IntersectionTests.swift b/Tests/MapboxDirectionsTests/IntersectionTests.swift index 67b00faf6..9fdab5f8a 100644 --- a/Tests/MapboxDirectionsTests/IntersectionTests.swift +++ b/Tests/MapboxDirectionsTests/IntersectionTests.swift @@ -2,108 +2,70 @@ import XCTest @testable import MapboxDirections class IntersectionTests: XCTestCase { - - let intersectionJSON = - """ - [ - { - "location" : [ - 13.426579, - 52.508068 - ], - "in" : -1, - "classes" : [ - "toll", - "restricted" - ], - "usableApproachLanes" : null, - "bearings" : [ - 80 - ], - "entry" : [ - true - ], - "out" : 0, - "approachLanes" : null - }, - { - "location" : [ - 13.426688, - 52.508022 - ], - "in" : 2, - "usableApproachLanes" : null, - "bearings" : [ - 30, - 120, - 300 - ], - "entry" : [ - false, - true, - true - ], - "out" : 1, - "approachLanes" : null - } - ] - """ - - let pass = """ - [ - { - \"location\" : [ - 13.426579, - 52.508068000000002 - ], - \"in\" : -1, - \"classes\" : [ - \"toll\", - \"restricted\" - ], - \"bearings\" : [ - 80 - ], - \"entry\" : [ - true - ], - \"lanes\" : null, - \"out\" : 0 - }, - { - \"entry\" : [ - false, - true, - true - ], - \"in\" : 2, - \"out\" : 1, - \"lanes\" : null, - \"location\" : [ - 13.426688, - 52.508021999999997 - ], - \"bearings\" : [ - 30, - 120, - 300 - ] - } - ] - """ - func testCoding() { + let intersectionsJSON: [[String: Any?]] = [ + [ + "location": [13.426579, 52.508068], + "in": -1, + "classes": ["toll", "restricted"], + "usableApproachLanes": nil, + "bearings": [80], + "entry": [true], + "out": 0, + "approachLanes": nil, + ], + [ + "location": [13.426688, 52.508022], + "in": 2, + "usableApproachLanes": nil, + "bearings": [30, 120, 300], + "entry": [false, true, true], + "out": 1, + "approachLanes": nil, + ], + ] + let intersectionsData = try! JSONSerialization.data(withJSONObject: intersectionsJSON, options: []) + var intersections: [Intersection]? + XCTAssertNoThrow(intersections = try JSONDecoder().decode([Intersection].self, from: intersectionsData)) + XCTAssertEqual(intersections?.count, 2) - let intersections = try! JSONDecoder().decode([Intersection].self, from: intersectionJSON.data(using: .utf8)!) - let intersection = intersections.first! + if let intersection = intersections?.first { + XCTAssert(intersection.outletRoadClasses == [.toll, .restricted]) + XCTAssert(intersection.headings == [80.0]) + XCTAssert(intersection.location == CLLocationCoordinate2D(latitude: 52.508068, longitude: 13.426579)) + } + + intersections = [ + Intersection(location: CLLocationCoordinate2D(latitude: 52.508068, longitude: 13.426579), + headings: [80.0], + approachIndex: -1, + outletIndex: 0, + outletIndexes: IndexSet([0]), + approachLanes: nil, + usableApproachLanes: nil, + outletRoadClasses: [.toll, .restricted]), + Intersection(location: CLLocationCoordinate2D(latitude: 52.508022, longitude: 13.426688), + headings: [30.0, 120.0, 300.0], + approachIndex: 2, + outletIndex: 1, + outletIndexes: IndexSet([1, 2]), + approachLanes: nil, + usableApproachLanes: nil, + outletRoadClasses: nil) + ] - XCTAssert(intersection.outletRoadClasses == [.toll, .restricted]) - XCTAssert(intersection.headings == [80.0]) - XCTAssert(intersection.location == CLLocationCoordinate2D(latitude: 52.508068, longitude: 13.426579) ) let encoder = JSONEncoder() - encoder.outputFormatting = [.prettyPrinted] - let encoded = String(data: try! encoder.encode(intersections), encoding: .utf8) + var encodedData: Data? + XCTAssertNoThrow(encodedData = try encoder.encode(intersections)) + XCTAssertNotNil(encodedData) - XCTAssert(encoded == pass) + if let encodedData = encodedData { + var encodedIntersectionsJSON: [[String: Any?]]? + XCTAssertNoThrow(encodedIntersectionsJSON = try JSONSerialization.jsonObject(with: encodedData, options: []) as? [[String: Any?]]) + XCTAssertNotNil(encodedIntersectionsJSON) + if let encodedIntersectionsJSON = encodedIntersectionsJSON { + XCTAssert(JSONSerialization.objectsAreEqual(intersectionsJSON, encodedIntersectionsJSON, approximate: true)) + } + } } } diff --git a/Tests/MapboxDirectionsTests/JSONSerialization.swift b/Tests/MapboxDirectionsTests/JSONSerialization.swift new file mode 100644 index 000000000..70f499459 --- /dev/null +++ b/Tests/MapboxDirectionsTests/JSONSerialization.swift @@ -0,0 +1,90 @@ +import Foundation + +infix operator ≈: ComparisonPrecedence +infix operator ≉: ComparisonPrecedence + +extension FloatingPoint { + /** + Returns a Boolean value indicating whether the two values are as equal as possible in floating-point representation. + */ + static func ≈(lhs: Self, rhs: Self) -> Bool { + return rhs.nextDown...rhs.nextUp ~= lhs + } + + /** + Returns a Boolean value indicating whether the two values are not approximately equal. + */ + static func ≉(lhs: Self, rhs: Self) -> Bool { + return !(lhs ≈ rhs) + } +} + +extension JSONSerialization { + /** + Returns a Boolean value indicating whether the given JSON-representable objects are equal to one another. + + If anything in the objects is not JSON-representable, this method returns false. + + - parameter approximate: True to allow for floating-point error when comparing two Doubles. + - returns: True if the two objects are equal to one another. + */ + static func objectsAreEqual(_ lhs: Any?, _ rhs: Any?, approximate: Bool) -> Bool { + if let _ = try? assertObjectsAreEqual(lhs, rhs, approximate: approximate) { + return true + } else { + return false + } + } + + static func assertObjectsAreEqual(_ lhs: Any?, _ rhs: Any?, approximate: Bool) throws -> Bool { + enum EqualityError: Error { + case notEqual + } + + if lhs == nil || rhs == nil { + guard lhs == nil && rhs == nil else { + throw EqualityError.notEqual + } + return true + } else if let lhs = lhs as? Bool, let rhs = rhs as? Bool { + guard lhs == rhs else { + throw EqualityError.notEqual + } + return true + } else if let lhs = lhs as? Int, let rhs = rhs as? Int { + guard lhs == rhs else { + throw EqualityError.notEqual + } + return true + } else if let lhs = lhs as? Double, let rhs = rhs as? Double { + guard approximate ? (lhs ≈ rhs) : (lhs == rhs) else { + throw EqualityError.notEqual + } + return true + } else if let lhs = lhs as? String, let rhs = rhs as? String { + guard lhs == rhs else { + throw EqualityError.notEqual + } + return true + } else if let lhs = lhs as? [Any?], let rhs = rhs as? [Any?] { + guard lhs.count == rhs.count, + lhs.elementsEqual(rhs, by: { objectsAreEqual($0, $1, approximate: approximate) }) else { + throw EqualityError.notEqual + } + return true + } else if let lhs = lhs as? [String: Any?], let rhs = rhs as? [String: Any?] { + if lhs.count != rhs.count { + throw EqualityError.notEqual + } + _ = try lhs.merging(rhs, uniquingKeysWith: { (lhs, rhs) -> Any? in + if !objectsAreEqual(lhs, rhs, approximate: approximate) { + throw EqualityError.notEqual + } + return lhs + }) + return true + } else { + throw EqualityError.notEqual + } + } +} diff --git a/Tests/MapboxDirectionsTests/VisualInstructionComponentTests.swift b/Tests/MapboxDirectionsTests/VisualInstructionComponentTests.swift index 6b5b990e6..59c8ecb4d 100644 --- a/Tests/MapboxDirectionsTests/VisualInstructionComponentTests.swift +++ b/Tests/MapboxDirectionsTests/VisualInstructionComponentTests.swift @@ -1,17 +1,25 @@ import XCTest @testable import MapboxDirections -let componentJSON = """ -{ -"type": "text", -"text": "Take a hike", -"imageBaseURL": "", -} -""" class VisualInstructionComponentTests: XCTestCase { func testJSONInitialization() { - let component = try! JSONDecoder().decode(Component.self, from: componentJSON.data(using:.utf8)!).component as! VisualInstructionComponent - XCTAssertEqual(component.text, "Take a hike") - XCTAssertNil(component.imageURL) + let componentJSON = [ + "type": "text", + "text": "Take a hike", + "imageBaseURL": "", + ] + let componentData = try! JSONSerialization.data(withJSONObject: componentJSON, options: []) + var component: Component? + XCTAssertNoThrow(component = try JSONDecoder().decode(ComponentSerializer.self, from: componentData).component) + XCTAssertNotNil(component) + if let component = component { + switch component { + case .lane(_): + XCTFail("Text component should not be interpreted as lane component.") + case let .visual(component): + XCTAssertEqual(component.text, "Take a hike") + XCTAssertNil(component.imageURL) + } + } } } From e660897b4c40b3d0d5cc740a65aba6ffd048e359 Mon Sep 17 00:00:00 2001 From: Jerrad Thramer Date: Wed, 30 Oct 2019 15:40:02 -0600 Subject: [PATCH 34/89] Test Fixes --- .../IntructionsTests.swift | 27 ++++++++++++++++--- Tests/MapboxDirectionsTests/MatchTests.swift | 6 ++--- .../RoutableMatchTests.swift | 6 ++--- Tests/MapboxDirectionsTests/V5Tests.swift | 8 +++--- 4 files changed, 34 insertions(+), 13 deletions(-) diff --git a/Tests/MapboxDirectionsTests/IntructionsTests.swift b/Tests/MapboxDirectionsTests/IntructionsTests.swift index 2f1b6e72d..3d4b9b1e0 100644 --- a/Tests/MapboxDirectionsTests/IntructionsTests.swift +++ b/Tests/MapboxDirectionsTests/IntructionsTests.swift @@ -85,7 +85,15 @@ class SpokenInstructionsTests: XCTestCase { XCTAssertEqual(arrivalSpokenInstructions[0].ssmlText, "You have arrived at the gym") let visualInstructions = step.instructionsDisplayedAlongStep - let visualInstructionComponent = visualInstructions?.first?.primaryInstruction.components.first as! VisualInstructionComponent + guard let firstComponent = visualInstructions?.first?.primaryInstruction.components.first else { + XCTFail("first primary component of first visual instruction does not exist") + return + } + + guard case let Component.visual(visualInstructionComponent) = firstComponent else { + XCTFail("First component of visual instruction should be visual component") + return + } XCTAssertNotNil(visualInstructions) XCTAssertNotNil(visualInstructionComponent) @@ -157,7 +165,12 @@ class SpokenInstructionsTests: XCTestCase { let tertiaryInstructionComponents = tertiaryInstruction?.components XCTAssertNotNil(tertiaryInstructionComponents) - let laneIndicationComponents = tertiaryInstructionComponents?.compactMap { $0 as? LaneIndicationComponent } + let laneIndicationComponents: [LaneIndicationComponent]? = tertiaryInstructionComponents?.compactMap { + guard case let Component.lane(lane) = $0 else { + return nil + } + return lane + } XCTAssertEqual(laneIndicationComponents?.count, 2) if let laneIndicationComponents = laneIndicationComponents { @@ -219,7 +232,15 @@ class SpokenInstructionsTests: XCTestCase { let visualInstructions = step.instructionsDisplayedAlongStep let tertiaryInstruction = visualInstructions?.first?.tertiaryInstruction - let tertiaryInstructionComponent = tertiaryInstruction?.components.first as! VisualInstructionComponent + + let visualComponents: [VisualInstructionComponent] = tertiaryInstruction?.components.compactMap { + guard case let Component.visual(instruction) = $0 else { + return nil + } + return instruction + } + + let tertiaryInstruction = visualComponents.first XCTAssertNotNil(tertiaryInstruction) XCTAssertEqual(tertiaryInstruction?.text, "Grove Street") diff --git a/Tests/MapboxDirectionsTests/MatchTests.swift b/Tests/MapboxDirectionsTests/MatchTests.swift index d525b97bc..809bc6244 100644 --- a/Tests/MapboxDirectionsTests/MatchTests.swift +++ b/Tests/MapboxDirectionsTests/MatchTests.swift @@ -88,9 +88,9 @@ class MatchTests: XCTestCase { XCTAssertEqual(step.initialHeading, 0) XCTAssertEqual(step.finalHeading, 340) - XCTAssertNotNil(step.coordinates) - XCTAssertEqual(step.coordinates!.count, 4) - let coordinate = step.coordinates!.first! + XCTAssertNotNil(step.shape?.coordinates) + XCTAssertEqual(step.shape!.coordinates.count, 4) + let coordinate = step.shape!.coordinates.first! XCTAssertEqual(round(coordinate.latitude), 33) XCTAssertEqual(round(coordinate.longitude), -117) } diff --git a/Tests/MapboxDirectionsTests/RoutableMatchTests.swift b/Tests/MapboxDirectionsTests/RoutableMatchTests.swift index 0cd095eb7..65ee24078 100644 --- a/Tests/MapboxDirectionsTests/RoutableMatchTests.swift +++ b/Tests/MapboxDirectionsTests/RoutableMatchTests.swift @@ -91,9 +91,9 @@ class RoutableMatchTest: XCTestCase { XCTAssertEqual(step.initialHeading, 0) XCTAssertEqual(step.finalHeading, 340) - XCTAssertNotNil(step.coordinates) - XCTAssertEqual(step.coordinates!.count, 4) - let coordinate = step.coordinates!.first! + XCTAssertNotNil(step.shape) + XCTAssertEqual(step.shape!.coordinates.count, 4) + let coordinate = step.shape!.coordinates.first! XCTAssertEqual(round(coordinate.latitude), 33) XCTAssertEqual(round(coordinate.longitude), -117) } diff --git a/Tests/MapboxDirectionsTests/V5Tests.swift b/Tests/MapboxDirectionsTests/V5Tests.swift index 6bb708c50..32d003e9d 100644 --- a/Tests/MapboxDirectionsTests/V5Tests.swift +++ b/Tests/MapboxDirectionsTests/V5Tests.swift @@ -119,10 +119,10 @@ class V5Tests: XCTestCase { XCTAssertEqual(step?.initialHeading, 192) XCTAssertEqual(step?.finalHeading, 202) - XCTAssertNotNil(step?.coordinates) - XCTAssertEqual(step?.coordinates?.count, 13) - XCTAssertEqual(step?.coordinates?.first?.latitude ?? 0, 38.9667, accuracy: 1e-4) - XCTAssertEqual(step?.coordinates?.first?.longitude ?? 0, -77.1802, accuracy: 1e-4) + XCTAssertNotNil(step?.shape) + XCTAssertEqual(step?.shape?.coordinates.count, 13) + XCTAssertEqual(step?.shape?.coordinates.first?.latitude ?? 0, 38.9667, accuracy: 1e-4) + XCTAssertEqual(step?.shape?.coordinates.first?.longitude ?? 0, -77.1802, accuracy: 1e-4) XCTAssertEqual(leg?.steps[32].names, nil) XCTAssertEqual(leg?.steps[32].codes, ["I-80"]) From 9a6077e4ef49dcb228585676ec3178827ed93ba1 Mon Sep 17 00:00:00 2001 From: Jerrad Thramer Date: Wed, 30 Oct 2019 15:58:03 -0600 Subject: [PATCH 35/89] More test fixes -- instructions --- Tests/MapboxDirectionsTests/IntructionsTests.swift | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/Tests/MapboxDirectionsTests/IntructionsTests.swift b/Tests/MapboxDirectionsTests/IntructionsTests.swift index 3d4b9b1e0..b75689414 100644 --- a/Tests/MapboxDirectionsTests/IntructionsTests.swift +++ b/Tests/MapboxDirectionsTests/IntructionsTests.swift @@ -233,21 +233,23 @@ class SpokenInstructionsTests: XCTestCase { let tertiaryInstruction = visualInstructions?.first?.tertiaryInstruction - let visualComponents: [VisualInstructionComponent] = tertiaryInstruction?.components.compactMap { + let visualComponents: [VisualInstructionComponent]? = tertiaryInstruction?.components.compactMap { guard case let Component.visual(instruction) = $0 else { return nil } return instruction } - let tertiaryInstruction = visualComponents.first + guard let tertiaryInstructionComponent = visualComponents?.first else { + XCTFail("expecting component to not be nil.") + return + } XCTAssertNotNil(tertiaryInstruction) XCTAssertEqual(tertiaryInstruction?.text, "Grove Street") XCTAssertEqual(tertiaryInstruction?.maneuverType, .turn) XCTAssertEqual(tertiaryInstruction?.maneuverDirection, .left) - XCTAssertNotNil(tertiaryInstructionComponent) XCTAssertEqual(tertiaryInstructionComponent.text, "Grove Street") XCTAssertEqual(tertiaryInstructionComponent.type, .text) XCTAssertEqual(tertiaryInstructionComponent.abbreviation, "Grove St") From 73d129a8dfb1dec98a4a1d2eb783ef95e9b3b1a5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Minh=20Nguye=CC=82=CC=83n?= Date: Thu, 31 Oct 2019 03:33:49 -0700 Subject: [PATCH 36/89] Rewrote visual instruction component MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit VisualInstruction.Component is now a codable associated-value enumeration that includes the lane case. Rather than contain a class with multiple ambiguous properties, each case other than .lane has a text and/or image representation. Added a method for specifying the scale and/or format of the image component’s image URL. Nested visual instruction types. --- MapboxDirections.xcodeproj/project.pbxproj | 50 +-- .../MBComponentRepresentable.swift | 107 ------- .../MBLaneIndicationComponent.swift | 41 --- .../MBVisualInstruction.swift | 15 +- .../MBVisualInstructionComponent.swift | 284 +++++++++++++++--- .../MBVisualInstructionType.swift | 43 --- .../IntructionsTests.swift | 81 +++-- .../VisualInstructionComponentTests.swift | 13 +- 8 files changed, 288 insertions(+), 346 deletions(-) delete mode 100644 Sources/MapboxDirections/MBComponentRepresentable.swift delete mode 100644 Sources/MapboxDirections/MBLaneIndicationComponent.swift delete mode 100644 Sources/MapboxDirections/MBVisualInstructionType.swift diff --git a/MapboxDirections.xcodeproj/project.pbxproj b/MapboxDirections.xcodeproj/project.pbxproj index 31e059479..8f62789ae 100644 --- a/MapboxDirections.xcodeproj/project.pbxproj +++ b/MapboxDirections.xcodeproj/project.pbxproj @@ -91,24 +91,16 @@ AEAB391120D9469A008F4E54 /* subVisualInstructions.json in Resources */ = {isa = PBXBuildFile; fileRef = AEAB391020D94699008F4E54 /* subVisualInstructions.json */; }; AEAB391220D9469A008F4E54 /* subVisualInstructions.json in Resources */ = {isa = PBXBuildFile; fileRef = AEAB391020D94699008F4E54 /* subVisualInstructions.json */; }; AEAB391320D9469A008F4E54 /* subVisualInstructions.json in Resources */ = {isa = PBXBuildFile; fileRef = AEAB391020D94699008F4E54 /* subVisualInstructions.json */; }; - AEDC211920B5DBDE0052DED8 /* MBLaneIndicationComponent.swift in Sources */ = {isa = PBXBuildFile; fileRef = AEDC211820B5DBDE0052DED8 /* MBLaneIndicationComponent.swift */; }; - AEDC211D20B6104B0052DED8 /* MBComponentRepresentable.swift in Sources */ = {isa = PBXBuildFile; fileRef = AEDC211C20B6104A0052DED8 /* MBComponentRepresentable.swift */; }; - AEDC211E20B612530052DED8 /* MBLaneIndicationComponent.swift in Sources */ = {isa = PBXBuildFile; fileRef = AEDC211820B5DBDE0052DED8 /* MBLaneIndicationComponent.swift */; }; - AEDC211F20B612540052DED8 /* MBLaneIndicationComponent.swift in Sources */ = {isa = PBXBuildFile; fileRef = AEDC211820B5DBDE0052DED8 /* MBLaneIndicationComponent.swift */; }; - AEDC212020B612560052DED8 /* MBLaneIndicationComponent.swift in Sources */ = {isa = PBXBuildFile; fileRef = AEDC211820B5DBDE0052DED8 /* MBLaneIndicationComponent.swift */; }; - AEDC212120B6125C0052DED8 /* MBComponentRepresentable.swift in Sources */ = {isa = PBXBuildFile; fileRef = AEDC211C20B6104A0052DED8 /* MBComponentRepresentable.swift */; }; - AEDC212220B6125D0052DED8 /* MBComponentRepresentable.swift in Sources */ = {isa = PBXBuildFile; fileRef = AEDC211C20B6104A0052DED8 /* MBComponentRepresentable.swift */; }; - AEDC212320B6125E0052DED8 /* MBComponentRepresentable.swift in Sources */ = {isa = PBXBuildFile; fileRef = AEDC211C20B6104A0052DED8 /* MBComponentRepresentable.swift */; }; + AEDC211D20B6104B0052DED8 /* MBVisualInstructionComponent.swift in Sources */ = {isa = PBXBuildFile; fileRef = AEDC211C20B6104A0052DED8 /* MBVisualInstructionComponent.swift */; }; + AEDC212120B6125C0052DED8 /* MBVisualInstructionComponent.swift in Sources */ = {isa = PBXBuildFile; fileRef = AEDC211C20B6104A0052DED8 /* MBVisualInstructionComponent.swift */; }; + AEDC212220B6125D0052DED8 /* MBVisualInstructionComponent.swift in Sources */ = {isa = PBXBuildFile; fileRef = AEDC211C20B6104A0052DED8 /* MBVisualInstructionComponent.swift */; }; + AEDC212320B6125E0052DED8 /* MBVisualInstructionComponent.swift in Sources */ = {isa = PBXBuildFile; fileRef = AEDC211C20B6104A0052DED8 /* MBVisualInstructionComponent.swift */; }; C51538CC1E807FF00093FF3E /* AttributeOptions.swift in Sources */ = {isa = PBXBuildFile; fileRef = C51538CB1E807FF00093FF3E /* AttributeOptions.swift */; }; C5247D711E818A24004B6154 /* AnnotationTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = C5247D701E818A24004B6154 /* AnnotationTests.swift */; }; C52552B91FA15D5900B1545C /* MBVisualInstructionBanner.swift in Sources */ = {isa = PBXBuildFile; fileRef = C52552B81FA15D5900B1545C /* MBVisualInstructionBanner.swift */; }; C52552BA1FA15D5E00B1545C /* MBVisualInstructionBanner.swift in Sources */ = {isa = PBXBuildFile; fileRef = C52552B81FA15D5900B1545C /* MBVisualInstructionBanner.swift */; }; C52552BB1FA15D5F00B1545C /* MBVisualInstructionBanner.swift in Sources */ = {isa = PBXBuildFile; fileRef = C52552B81FA15D5900B1545C /* MBVisualInstructionBanner.swift */; }; C52552BC1FA15D6000B1545C /* MBVisualInstructionBanner.swift in Sources */ = {isa = PBXBuildFile; fileRef = C52552B81FA15D5900B1545C /* MBVisualInstructionBanner.swift */; }; - C52552C01FA1628A00B1545C /* MBVisualInstructionComponent.swift in Sources */ = {isa = PBXBuildFile; fileRef = C52552BF1FA1628A00B1545C /* MBVisualInstructionComponent.swift */; }; - C52552C61FA162F900B1545C /* MBVisualInstructionComponent.swift in Sources */ = {isa = PBXBuildFile; fileRef = C52552BF1FA1628A00B1545C /* MBVisualInstructionComponent.swift */; }; - C52552C71FA162FA00B1545C /* MBVisualInstructionComponent.swift in Sources */ = {isa = PBXBuildFile; fileRef = C52552BF1FA1628A00B1545C /* MBVisualInstructionComponent.swift */; }; - C52552C81FA162FB00B1545C /* MBVisualInstructionComponent.swift in Sources */ = {isa = PBXBuildFile; fileRef = C52552BF1FA1628A00B1545C /* MBVisualInstructionComponent.swift */; }; C52CE38F1F6AF63C0069963D /* MBSpokenInstruction.swift in Sources */ = {isa = PBXBuildFile; fileRef = C55FB44A1F6AEBF6006BD1E9 /* MBSpokenInstruction.swift */; }; C52CE3901F6AF63D0069963D /* MBSpokenInstruction.swift in Sources */ = {isa = PBXBuildFile; fileRef = C55FB44A1F6AEBF6006BD1E9 /* MBSpokenInstruction.swift */; }; C52CE3911F6AF63E0069963D /* MBSpokenInstruction.swift in Sources */ = {isa = PBXBuildFile; fileRef = C55FB44A1F6AEBF6006BD1E9 /* MBSpokenInstruction.swift */; }; @@ -129,10 +121,6 @@ C547EC6A1DB59F90009817F3 /* MBLane.swift in Sources */ = {isa = PBXBuildFile; fileRef = C57D55071DB58C0200B94B74 /* MBLane.swift */; }; C547EC6B1DB59F91009817F3 /* MBLane.swift in Sources */ = {isa = PBXBuildFile; fileRef = C57D55071DB58C0200B94B74 /* MBLane.swift */; }; C55FB44B1F6AEBF6006BD1E9 /* MBSpokenInstruction.swift in Sources */ = {isa = PBXBuildFile; fileRef = C55FB44A1F6AEBF6006BD1E9 /* MBSpokenInstruction.swift */; }; - C56516841FE1A2DD00A0AD18 /* MBVisualInstructionType.swift in Sources */ = {isa = PBXBuildFile; fileRef = C56516831FE1A2DD00A0AD18 /* MBVisualInstructionType.swift */; }; - C56516851FE1AB8F00A0AD18 /* MBVisualInstructionType.swift in Sources */ = {isa = PBXBuildFile; fileRef = C56516831FE1A2DD00A0AD18 /* MBVisualInstructionType.swift */; }; - C56516861FE1AB9000A0AD18 /* MBVisualInstructionType.swift in Sources */ = {isa = PBXBuildFile; fileRef = C56516831FE1A2DD00A0AD18 /* MBVisualInstructionType.swift */; }; - C56516871FE1AB9100A0AD18 /* MBVisualInstructionType.swift in Sources */ = {isa = PBXBuildFile; fileRef = C56516831FE1A2DD00A0AD18 /* MBVisualInstructionType.swift */; }; C57D55011DB5669600B94B74 /* MBIntersection.swift in Sources */ = {isa = PBXBuildFile; fileRef = C57D55001DB5669600B94B74 /* MBIntersection.swift */; }; C57D55031DB566A700B94B74 /* MBIntersection.swift in Sources */ = {isa = PBXBuildFile; fileRef = C57D55001DB5669600B94B74 /* MBIntersection.swift */; }; C57D55041DB566A800B94B74 /* MBIntersection.swift in Sources */ = {isa = PBXBuildFile; fileRef = C57D55001DB5669600B94B74 /* MBIntersection.swift */; }; @@ -340,17 +328,14 @@ 8D434678219E1167008B7BF3 /* Double.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Double.swift; sourceTree = ""; }; AEAB390C20D7F4F4008F4E54 /* subLaneInstructions.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = subLaneInstructions.json; sourceTree = ""; }; AEAB391020D94699008F4E54 /* subVisualInstructions.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = subVisualInstructions.json; sourceTree = ""; }; - AEDC211820B5DBDE0052DED8 /* MBLaneIndicationComponent.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MBLaneIndicationComponent.swift; sourceTree = ""; }; - AEDC211C20B6104A0052DED8 /* MBComponentRepresentable.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MBComponentRepresentable.swift; sourceTree = ""; }; + AEDC211C20B6104A0052DED8 /* MBVisualInstructionComponent.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MBVisualInstructionComponent.swift; sourceTree = ""; }; C51538CB1E807FF00093FF3E /* AttributeOptions.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AttributeOptions.swift; sourceTree = ""; }; C5247D701E818A24004B6154 /* AnnotationTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AnnotationTests.swift; sourceTree = ""; }; C52552B81FA15D5900B1545C /* MBVisualInstructionBanner.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MBVisualInstructionBanner.swift; sourceTree = ""; }; - C52552BF1FA1628A00B1545C /* MBVisualInstructionComponent.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MBVisualInstructionComponent.swift; sourceTree = ""; }; C52CE3921F6AF6E70069963D /* IntructionsTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = IntructionsTests.swift; sourceTree = ""; }; C5434B89200693D00069E887 /* MBTracepoint.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MBTracepoint.swift; sourceTree = ""; }; C5434B8B200695A50069E887 /* MBMatchOptions.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MBMatchOptions.swift; sourceTree = ""; }; C55FB44A1F6AEBF6006BD1E9 /* MBSpokenInstruction.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MBSpokenInstruction.swift; sourceTree = ""; }; - C56516831FE1A2DD00A0AD18 /* MBVisualInstructionType.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MBVisualInstructionType.swift; sourceTree = ""; }; C57D55001DB5669600B94B74 /* MBIntersection.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MBIntersection.swift; sourceTree = ""; }; C57D55071DB58C0200B94B74 /* MBLane.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MBLane.swift; sourceTree = ""; }; C582BA2D2073ED6300647DAA /* Array.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Array.swift; sourceTree = ""; }; @@ -620,11 +605,8 @@ DA6C9D8C1CAE442B00094FBC /* Info.plist */, C55FB44A1F6AEBF6006BD1E9 /* MBSpokenInstruction.swift */, C52552B81FA15D5900B1545C /* MBVisualInstructionBanner.swift */, - C52552BF1FA1628A00B1545C /* MBVisualInstructionComponent.swift */, - AEDC211C20B6104A0052DED8 /* MBComponentRepresentable.swift */, - AEDC211820B5DBDE0052DED8 /* MBLaneIndicationComponent.swift */, - C56516831FE1A2DD00A0AD18 /* MBVisualInstructionType.swift */, 35EFD00A207DFACA00BF3873 /* MBVisualInstruction.swift */, + AEDC211C20B6104A0052DED8 /* MBVisualInstructionComponent.swift */, 35828C9D217A003F00ED546E /* OfflineDirections.swift */, 35DBF004217DF0D90009D2AE /* MBCoordinateBounds.swift */, ); @@ -1172,7 +1154,6 @@ C5DAAC9B2019167C001F9261 /* MBMatch.swift in Sources */, 35DBF010217E17A30009D2AE /* HTTPURLResponse.swift in Sources */, 8D43467A219E15C3008B7BF3 /* Double.swift in Sources */, - C52552C61FA162F900B1545C /* MBVisualInstructionComponent.swift in Sources */, C53A02261E92C26E009837BD /* AttributeOptions.swift in Sources */, 43F89F99235778DE007B591E /* MapMatchingResponse.swift in Sources */, DA1A10C91D00F969009F82FA /* MBRouteLeg.swift in Sources */, @@ -1192,19 +1173,17 @@ 431E93D023466D7500A71B44 /* Codable.swift in Sources */, C5990B4D2045E74800D7DFD4 /* MBDirectionsOptions.swift in Sources */, DAA76D691DD127CB0015EC78 /* MBLaneIndication.swift in Sources */, - AEDC211E20B612530052DED8 /* MBLaneIndicationComponent.swift in Sources */, 43F89F942350F952007B591E /* MatchResponse.swift in Sources */, DA1A10CB1D00F969009F82FA /* MBRouteStep.swift in Sources */, C57D55031DB566A700B94B74 /* MBIntersection.swift in Sources */, C52CE38F1F6AF63C0069963D /* MBSpokenInstruction.swift in Sources */, C58EA7AB1E9D7F73008F98CE /* MBCongestion.swift in Sources */, 8D381B6B1FDB3D8A008D5A58 /* String.swift in Sources */, - C56516851FE1AB8F00A0AD18 /* MBVisualInstructionType.swift in Sources */, 438BFEC3233D854D00457294 /* DirectionsProfileIdentifier.swift in Sources */, C54549FC2073F1EF002E273F /* Array.swift in Sources */, C547EC691DB59F8F009817F3 /* MBLane.swift in Sources */, 431E93C823466B4000A71B44 /* CoreLocation.swift in Sources */, - AEDC212120B6125C0052DED8 /* MBComponentRepresentable.swift in Sources */, + AEDC212120B6125C0052DED8 /* MBVisualInstructionComponent.swift in Sources */, 439255792344113D006EEE88 /* DirectionsError.swift in Sources */, DA1A10C71D00F969009F82FA /* MBDirections.swift in Sources */, ); @@ -1240,7 +1219,6 @@ C5DAAC9C2019167D001F9261 /* MBMatch.swift in Sources */, 35DBF011217E17A30009D2AE /* HTTPURLResponse.swift in Sources */, 8D43467B219E15C4008B7BF3 /* Double.swift in Sources */, - C52552C71FA162FA00B1545C /* MBVisualInstructionComponent.swift in Sources */, C53A02271E92C26F009837BD /* AttributeOptions.swift in Sources */, 43F89F9A235778DE007B591E /* MapMatchingResponse.swift in Sources */, DA1A10EF1D010247009F82FA /* MBRouteLeg.swift in Sources */, @@ -1260,19 +1238,17 @@ 431E93D123466D7600A71B44 /* Codable.swift in Sources */, C5990B4E2045E74900D7DFD4 /* MBDirectionsOptions.swift in Sources */, DAA76D6A1DD127CB0015EC78 /* MBLaneIndication.swift in Sources */, - AEDC211F20B612540052DED8 /* MBLaneIndicationComponent.swift in Sources */, 43F89F952350F952007B591E /* MatchResponse.swift in Sources */, DA1A10F11D010247009F82FA /* MBRouteStep.swift in Sources */, C57D55041DB566A800B94B74 /* MBIntersection.swift in Sources */, C52CE3901F6AF63D0069963D /* MBSpokenInstruction.swift in Sources */, C58EA7AC1E9D7F74008F98CE /* MBCongestion.swift in Sources */, 8D381B6C1FDB3D8B008D5A58 /* String.swift in Sources */, - C56516861FE1AB9000A0AD18 /* MBVisualInstructionType.swift in Sources */, 438BFEC4233D854D00457294 /* DirectionsProfileIdentifier.swift in Sources */, C54549FD2073F1F0002E273F /* Array.swift in Sources */, C547EC6A1DB59F90009817F3 /* MBLane.swift in Sources */, 431E93C923466B4100A71B44 /* CoreLocation.swift in Sources */, - AEDC212220B6125D0052DED8 /* MBComponentRepresentable.swift in Sources */, + AEDC212220B6125D0052DED8 /* MBVisualInstructionComponent.swift in Sources */, 4392557A2344113E006EEE88 /* DirectionsError.swift in Sources */, DA1A10ED1D010247009F82FA /* MBDirections.swift in Sources */, ); @@ -1308,7 +1284,6 @@ C5DAAC9D2019167E001F9261 /* MBMatch.swift in Sources */, 35DBF012217E17A30009D2AE /* HTTPURLResponse.swift in Sources */, 8D43467C219E15C6008B7BF3 /* Double.swift in Sources */, - C52552C81FA162FB00B1545C /* MBVisualInstructionComponent.swift in Sources */, C53A02281E92C271009837BD /* AttributeOptions.swift in Sources */, 43F89F9B235778DE007B591E /* MapMatchingResponse.swift in Sources */, DA1A11061D0103A3009F82FA /* MBRouteLeg.swift in Sources */, @@ -1328,19 +1303,17 @@ 431E93D223466D7700A71B44 /* Codable.swift in Sources */, C5990B4F2045E74A00D7DFD4 /* MBDirectionsOptions.swift in Sources */, DAA76D6B1DD127CB0015EC78 /* MBLaneIndication.swift in Sources */, - AEDC212020B612560052DED8 /* MBLaneIndicationComponent.swift in Sources */, 43F89F962350F952007B591E /* MatchResponse.swift in Sources */, DA1A11081D0103A3009F82FA /* MBRouteStep.swift in Sources */, C57D55051DB566A900B94B74 /* MBIntersection.swift in Sources */, C52CE3911F6AF63E0069963D /* MBSpokenInstruction.swift in Sources */, C58EA7AD1E9D7F75008F98CE /* MBCongestion.swift in Sources */, 8D381B6D1FDB3D8B008D5A58 /* String.swift in Sources */, - C56516871FE1AB9100A0AD18 /* MBVisualInstructionType.swift in Sources */, 438BFEC5233D854D00457294 /* DirectionsProfileIdentifier.swift in Sources */, C54549FE2073F1F1002E273F /* Array.swift in Sources */, C547EC6B1DB59F91009817F3 /* MBLane.swift in Sources */, 431E93CA23466B4200A71B44 /* CoreLocation.swift in Sources */, - AEDC212320B6125E0052DED8 /* MBComponentRepresentable.swift in Sources */, + AEDC212320B6125E0052DED8 /* MBVisualInstructionComponent.swift in Sources */, 4392557B2344113F006EEE88 /* DirectionsError.swift in Sources */, DA1A11041D0103A3009F82FA /* MBDirections.swift in Sources */, ); @@ -1358,7 +1331,6 @@ C582BA2E2073ED6300647DAA /* Array.swift in Sources */, 43F89F98235778DE007B591E /* MapMatchingResponse.swift in Sources */, C52552B91FA15D5900B1545C /* MBVisualInstructionBanner.swift in Sources */, - C52552C01FA1628A00B1545C /* MBVisualInstructionComponent.swift in Sources */, 35828C9E217A003F00ED546E /* OfflineDirections.swift in Sources */, C59426071F1EA6C400C8E59C /* RoadClasses.swift in Sources */, 431E93CB23466C2400A71B44 /* RouteResponse.swift in Sources */, @@ -1374,7 +1346,6 @@ 431E93CF23466D7400A71B44 /* Codable.swift in Sources */, C59094C1203DE6BC00EB2417 /* MBDirectionsResult.swift in Sources */, DAC05F1A1CFC077C00FA0071 /* MBRouteLeg.swift in Sources */, - AEDC211920B5DBDE0052DED8 /* MBLaneIndicationComponent.swift in Sources */, 43F89F932350F952007B591E /* MatchResponse.swift in Sources */, C5434B8A200693D00069E887 /* MBTracepoint.swift in Sources */, DA6C9DA61CAE462800094FBC /* MBDirections.swift in Sources */, @@ -1383,10 +1354,9 @@ C58EA7AA1E9D7EAD008F98CE /* MBCongestion.swift in Sources */, 8D381B6A1FDB101F008D5A58 /* String.swift in Sources */, 438BFEC2233D854D00457294 /* DirectionsProfileIdentifier.swift in Sources */, - C56516841FE1A2DD00A0AD18 /* MBVisualInstructionType.swift in Sources */, C57D55011DB5669600B94B74 /* MBIntersection.swift in Sources */, 431E93C723466B3F00A71B44 /* CoreLocation.swift in Sources */, - AEDC211D20B6104B0052DED8 /* MBComponentRepresentable.swift in Sources */, + AEDC211D20B6104B0052DED8 /* MBVisualInstructionComponent.swift in Sources */, 439255772344113B006EEE88 /* DirectionsError.swift in Sources */, DA2E03E91CB0E0B000D1269A /* MBRouteStep.swift in Sources */, ); diff --git a/Sources/MapboxDirections/MBComponentRepresentable.swift b/Sources/MapboxDirections/MBComponentRepresentable.swift deleted file mode 100644 index 6f0e92749..000000000 --- a/Sources/MapboxDirections/MBComponentRepresentable.swift +++ /dev/null @@ -1,107 +0,0 @@ -import Foundation -import CoreGraphics - -#if os(OSX) -import Cocoa -#elseif os(watchOS) -import WatchKit -#else -import UIKit -#endif - -/** -The component representable protocol that comprises what the instruction banner should display. - */ -public enum Component: Equatable { - case lane(_ component: LaneIndicationComponent) - case visual(_ component: VisualInstructionComponent) - - public static func == (lhs: Component, rhs: Component) -> Bool { - switch lhs { - case let .lane(left): - switch rhs { - case let .lane(right): - return left == right - default: - return false - } - case let .visual(left): - switch rhs { - case let .visual(right): - return left == right - default: - return false - } - } - } -} - -internal struct ComponentSerializer: Codable { - let component: Component - - private enum CodingKeys: String, CodingKey { - case type - case text - case abbreviatedText = "abbr" - case abbreviatedTextPriority = "abbr_priority" - case imageBaseURL - case imageURL - case directions - case isActive = "active" - } - init(component: Component) { - self.component = component - } - - func encode(to encoder: Encoder) throws { - var container = encoder.container(keyedBy: CodingKeys.self) - - switch component { - case let .lane(lane): - try container.encode(lane.indications, forKey: .directions) - try container.encode(lane.isUsable, forKey: .isActive) - try container.encode(VisualInstructionComponentType.lane, forKey: .type) - case let .visual(instruction): - try container.encodeIfPresent(instruction.text, forKey: .text) - try container.encodeIfPresent(instruction.abbreviation, forKey: .abbreviatedText) - try container.encodeIfPresent(instruction.abbreviationPriority, forKey: .abbreviatedTextPriority) - try container.encodeIfPresent(instruction.imageURL, forKey: .imageURL) - try container.encode(instruction.type, forKey: .type) - } - - } - init(from decoder: Decoder) throws { - let container = try decoder.container(keyedBy: CodingKeys.self) - let type = try container.decode(VisualInstructionComponentType.self, forKey: .type) - - switch type { - case .lane: - let indications = try container.decode(LaneIndication.self, forKey: .directions) - let isUsable = try container.decode(Bool.self, forKey: .isActive) - let comp = LaneIndicationComponent(indications: indications, isUsable: isUsable) - component = .lane(comp) - default: - let text = try container.decode(String.self, forKey: .text) - let abbreviatedText = try container.decodeIfPresent(String.self, forKey: .abbreviatedText) - var imageURL: URL? - if let generatedURL = try container.decodeIfPresent(String.self, forKey: .imageURL) { - imageURL = URL(string: generatedURL) - - } else if let imageBaseURL = try container.decodeIfPresent(String.self, forKey: .imageBaseURL), !imageBaseURL.isEmpty { - let scale: CGFloat - #if os(OSX) - scale = NSScreen.main?.backingScaleFactor ?? 1 - #elseif os(watchOS) - scale = WKInterfaceDevice.current().screenScale - #else - scale = UIScreen.main.scale - #endif - imageURL = URL(string: "\(imageBaseURL)@\(Int(scale))x.png") - } - let abbreviationPriority = try container.decodeIfPresent(Int.self, forKey: .abbreviatedTextPriority) - let comp = VisualInstructionComponent(type: type, text: text, imageURL: imageURL, abbreviation: abbreviatedText, abbreviationPriority: abbreviationPriority) - component = .visual(comp) - } - - } -} diff --git a/Sources/MapboxDirections/MBLaneIndicationComponent.swift b/Sources/MapboxDirections/MBLaneIndicationComponent.swift deleted file mode 100644 index 45e9ce777..000000000 --- a/Sources/MapboxDirections/MBLaneIndicationComponent.swift +++ /dev/null @@ -1,41 +0,0 @@ -import Foundation - - -/** -A component that represents a lane representation of an instruction. - */ - - -open class LaneIndicationComponent: Equatable { - - /** - An array indicating which directions you can go from a lane (left, right, or straight). - - If the value is `[LaneIndication.left", LaneIndication.straightAhead]`, the driver can go left or straight ahead from that lane. This is only set when the `component` is a `lane`. - */ - public var indications: LaneIndication - - /** - The boolean that indicates whether the lane can be used to complete the maneuver. - - If multiple lanes are active, then they can all be used to complete the upcoming maneuver. This value is set to `false` by default. - */ - public var isUsable: Bool = false - - /** - Initializes a new visual instruction component object that displays the given information. - - - parameter indications: The directions to go from a lane component. - - parameter isUsable: The flag to indicate that the upcoming maneuver can be completed with a lane component. - */ - public init(indications: LaneIndication, isUsable: Bool) { - self.indications = indications - self.isUsable = isUsable - } - - // MARK: - Codable - public static func == (lhs: LaneIndicationComponent, rhs: LaneIndicationComponent) -> Bool { - return lhs.indications == rhs.indications && - lhs.isUsable == rhs.isUsable - } -} diff --git a/Sources/MapboxDirections/MBVisualInstruction.swift b/Sources/MapboxDirections/MBVisualInstruction.swift index 0a4462e18..30d25af6d 100644 --- a/Sources/MapboxDirections/MBVisualInstruction.swift +++ b/Sources/MapboxDirections/MBVisualInstruction.swift @@ -1,12 +1,9 @@ import Foundation import CoreLocation - /** The contents of a banner that should be displayed as added visual guidance for a route. The banner instructions are children of the steps during which they should be displayed, but they refer to the maneuver in the following step. */ - - open class VisualInstruction: Codable, Equatable { /** @@ -64,10 +61,7 @@ open class VisualInstruction: Codable, Equatable { try container.encodeIfPresent(text, forKey: .text) try container.encodeIfPresent(maneuverType, forKey: .maneuverType) try container.encodeIfPresent(maneuverDirection, forKey: .maneuverDirection) - - let wrappedComponents = components.map(ComponentSerializer.init(component:)) - try container.encode(wrappedComponents, forKey: .components) - + try container.encode(components, forKey: .components) try container.encodeIfPresent(finalHeading, forKey: .finalHeading) } @@ -76,10 +70,7 @@ open class VisualInstruction: Codable, Equatable { text = try container.decodeIfPresent(String.self, forKey: .text) maneuverType = try container.decodeIfPresent(ManeuverType.self, forKey: .maneuverType) maneuverDirection = try container.decodeIfPresent(ManeuverDirection.self, forKey: .maneuverDirection) - - let componentsWrapped = try container.decode([ComponentSerializer].self, forKey: .components) - components = componentsWrapped.map { $0.component } - + components = try container.decode([Component].self, forKey: .components) finalHeading = try container.decodeIfPresent(CLLocationDegrees.self, forKey: .finalHeading) } @@ -88,8 +79,6 @@ open class VisualInstruction: Codable, Equatable { return lhs.text == rhs.text && lhs.maneuverType == rhs.maneuverType && lhs.maneuverDirection == rhs.maneuverDirection && - - lhs.components == rhs.components && lhs.finalHeading == rhs.finalHeading } diff --git a/Sources/MapboxDirections/MBVisualInstructionComponent.swift b/Sources/MapboxDirections/MBVisualInstructionComponent.swift index 748d12896..500344d30 100644 --- a/Sources/MapboxDirections/MBVisualInstructionComponent.swift +++ b/Sources/MapboxDirections/MBVisualInstructionComponent.swift @@ -1,62 +1,250 @@ -#if os(OSX) - import Cocoa +import Foundation +import CoreGraphics + +#if os(macOS) +import Cocoa #elseif os(watchOS) - import WatchKit +import WatchKit #else - import UIKit +import UIKit #endif -/** - A component of a `VisualInstruction` that represents a single run of similarly formatted text or an image with a textual fallback representation. - Note: This class does not conform to Codable because it's serialization is directly handled by `Component` - */ - -open class VisualInstructionComponent: Equatable { - /** - The URL to an image representation of this component. - - The URL refers to an image that uses the device’s native screen scale. - */ - public var imageURL: URL? - - /** - An abbreviated representation of the `text` property. - */ - public var abbreviation: String? - +public extension VisualInstruction { /** - The priority for which the component should be abbreviated. - - A component with a lower abbreviation priority value should be abbreviated before a component with a higher abbreviation priority value. + A unit of information displayed to the user as part of a `VisualInstruction`. */ - public var abbreviationPriority: Int? + enum Component: Codable, Equatable { + /** + The component separates two other destination components. + + If the two adjacent components are both displayed as images, you can hide this delimiter component. + */ + case delimiter(text: TextRepresentation) + + /** + The component bears the name of a place or street. + */ + case text(text: TextRepresentation) + + /** + The component is an image, such as a [route marker](https://en.wikipedia.org/wiki/Highway_shield), with a fallback text representation. + + - parameter image: The component’s preferred image representation. + - parameter alternativeText: The component’s alternative text representation. Use this representation if the image representation is unavailable or unusable, but consider formatting the text in a special way to distinguish it from an ordinary `.text` component. + */ + case image(image: ImageRepresentation, alternativeText: TextRepresentation) + + /** + The compoment contains the localized word for “Exit”. + + This component may appear before or after an `.exitCode` component, depending on the language. You can hide this component if the adjacent `.exitCode` component has an obvious exit-number appearance, for example with an accompanying [motorway exit icon](https://commons.wikimedia.org/wiki/File:Sinnbild_Autobahnausfahrt.svg). + */ + case exit(text: TextRepresentation) + + /** + The component contains an exit number. + + You can hide the adjacent `.exit` component in favor of giving this component an obvious exit-number appearance, for example by pairing it with a [motorway exit icon](https://commons.wikimedia.org/wiki/File:Sinnbild_Autobahnausfahrt.svg). + */ + case exitCode(text: TextRepresentation) + + /** + A component that represents a turn lane or through lane at the approach to an intersection. + + - parameter indications: The direction or directions of travel that the lane is reserved for. + - parameter isUsable: Whether the user can use this lane to continue along the current route. + */ + case lane(indications: LaneIndication, isUsable: Bool) + + private enum CodingKeys: String, CodingKey { + case kind = "type" + case text + case abbreviatedText = "abbr" + case abbreviatedTextPriority = "abbr_priority" + case imageBaseURL + case directions + case isActive = "active" + } + + enum Kind: String, Codable { + case delimiter + case text + case image = "icon" + case exit + case exitCode = "exit-number" + case lane + } + + public init(from decoder: Decoder) throws { + let container = try decoder.container(keyedBy: CodingKeys.self) + let kind = try container.decode(Kind.self, forKey: .kind) + + if kind == .lane { + let indications = try container.decode(LaneIndication.self, forKey: .directions) + let isUsable = try container.decode(Bool.self, forKey: .isActive) + self = .lane(indications: indications, isUsable: isUsable) + return + } + + let text = try container.decode(String.self, forKey: .text) + let abbreviation = try container.decodeIfPresent(String.self, forKey: .abbreviatedText) + let abbreviationPriority = try container.decodeIfPresent(Int.self, forKey: .abbreviatedTextPriority) + let textRepresentation = TextRepresentation(text: text, abbreviation: abbreviation, abbreviationPriority: abbreviationPriority) + + switch kind { + case .delimiter: + self = .delimiter(text: textRepresentation) + case .text: + self = .text(text: textRepresentation) + case .image: + var imageBaseURL: URL? + if let imageBaseURLString = try container.decodeIfPresent(String.self, forKey: .imageBaseURL) { + imageBaseURL = URL(string: imageBaseURLString) + } + let imageRepresentation = ImageRepresentation(imageBaseURL: imageBaseURL) + self = .image(image: imageRepresentation, alternativeText: textRepresentation) + case .exit: + self = .exit(text: textRepresentation) + case .exitCode: + self = .exitCode(text: textRepresentation) + case .lane: + preconditionFailure("Lane component should have been initialized before decoding text") + } + } + + public func encode(to encoder: Encoder) throws { + var container = encoder.container(keyedBy: CodingKeys.self) + + let textRepresentation: TextRepresentation? + switch self { + case .delimiter(let text): + try container.encode(Kind.delimiter, forKey: .kind) + textRepresentation = text + case .text(let text): + try container.encode(Kind.text, forKey: .kind) + textRepresentation = text + case .image(let image, let alternativeText): + try container.encode(Kind.image, forKey: .kind) + textRepresentation = alternativeText + try container.encodeIfPresent(image.imageBaseURL, forKey: .imageBaseURL) + case .exit(let text): + try container.encode(Kind.exit, forKey: .kind) + textRepresentation = text + case .exitCode(let text): + try container.encode(Kind.exitCode, forKey: .kind) + textRepresentation = text + case .lane(let indications, let isUsable): + try container.encode(Kind.lane, forKey: .kind) + textRepresentation = nil + try container.encode(indications, forKey: .directions) + try container.encode(isUsable, forKey: .isActive) + } + + if let textRepresentation = textRepresentation { + try container.encodeIfPresent(textRepresentation.text, forKey: .text) + try container.encodeIfPresent(textRepresentation.abbreviation, forKey: .abbreviatedText) + try container.encodeIfPresent(textRepresentation.abbreviationPriority, forKey: .abbreviatedTextPriority) + } + } + + public static func ==(lhs: Component, rhs: Component) -> Bool { + switch (lhs, rhs) { + case (let .delimiter(lhsText), let .delimiter(rhsText)), + (let .text(lhsText), let .text(rhsText)), + (let .exit(lhsText), let .exit(rhsText)), + (let .exitCode(lhsText), let .exitCode(rhsText)): + return lhsText == rhsText + case (let .image(lhsURL, lhsAlternativeText), + let .image(rhsURL, rhsAlternativeText)): + return lhsURL == rhsURL + && lhsAlternativeText == rhsAlternativeText + case (let .lane(lhsIndications, lhsIsUsable), + let .lane(rhsIndications, rhsIsUsable)): + return lhsIndications == rhsIndications + && lhsIsUsable == rhsIsUsable + case (.delimiter, _), + (.text, _), + (.image, _), + (.exit, _), + (.exitCode, _), + (.lane, _): + return false + } + } + } +} +public extension VisualInstruction.Component { /** - The plain text representation of this component. - - Use this property if `imageURL` is `nil` or if the URL contained in that property is not yet available. + A textual representation of a visual instruction component. */ - public var text: String? + struct TextRepresentation: Equatable { + /** + The plain text representation of this component. + */ + public let text: String + + /** + An abbreviated representation of the `text` property. + */ + public let abbreviation: String? + + /** + The priority for which the component should be abbreviated. + + A component with a lower abbreviation priority value should be abbreviated before a component with a higher abbreviation priority value. + */ + public let abbreviationPriority: Int? + } /** - The type of visual instruction component. You can display the component differently depending on its type. + An image representation of a visual instruction component. */ - public var type: VisualInstructionComponentType - - public init(type: VisualInstructionComponentType, text: String?, imageURL: URL?, abbreviation: String?, abbreviationPriority: Int?) { - self.text = text - self.type = type - self.imageURL = imageURL - self.abbreviation = abbreviation - self.abbreviationPriority = abbreviationPriority - } - - // MARK: - Equatable - public static func == (lhs: VisualInstructionComponent, rhs: VisualInstructionComponent) -> Bool { - return lhs.imageURL == rhs.imageURL && - lhs.abbreviation == rhs.abbreviation && - lhs.abbreviationPriority == rhs.abbreviationPriority && - lhs.text == rhs.text && - lhs.type == rhs.type + struct ImageRepresentation: Equatable { + /** + File formats of visual instruction component images. + */ + public enum Format { + /// Portable Network Graphics (PNG) + case png + /// Scalable Vector Graphics (SVG) + case svg + } + + /** + The URL whose path is the prefix of all the possible URLs returned by `imageURL(scale:format:)`. + */ + public let imageBaseURL: URL? + + /** + Returns a remote URL to the image file that represents the component. + + - parameter scale: The image’s scale factor. If this argument is unspecified, the current screen’s native scale factor is used. Only the values 1, 2, and 3 are currently supported. + - parameter format: The file format of the image. If this argument is unspecified, PNG is used. + - returns: A remote URL to the image. + */ + public func imageURL(scale: CGFloat? = nil, format: Format = .png) -> URL? { + guard let imageBaseURL = imageBaseURL, + var imageURLComponents = URLComponents(url: imageBaseURL, resolvingAgainstBaseURL: false) else { + return nil + } + imageURLComponents.path += "@\(Int(scale ?? ImageRepresentation.currentScale))x.png" + return imageURLComponents.url + } + + /** + Returns the current screen’s native scale factor. + */ + static var currentScale: CGFloat { + let scale: CGFloat + #if os(macOS) + scale = NSScreen.main?.backingScaleFactor ?? 1 + #elseif os(watchOS) + scale = WKInterfaceDevice.current().screenScale + #else + scale = UIScreen.main.scale + #endif + return scale + } } } diff --git a/Sources/MapboxDirections/MBVisualInstructionType.swift b/Sources/MapboxDirections/MBVisualInstructionType.swift deleted file mode 100644 index 7b3168743..000000000 --- a/Sources/MapboxDirections/MBVisualInstructionType.swift +++ /dev/null @@ -1,43 +0,0 @@ -import Foundation - -/** - `VisualInstructionComponentType` describes the type of `VisualInstructionComponent`. - */ - -public enum VisualInstructionComponentType: String, Codable { - - /** - The component separates two other destination components. - - If the two adjacent components are both displayed as images, you can hide this delimiter component. - */ - case delimiter - - /** - The component bears the name of a place or street. - */ - case text - - /** - Component contains an image that should be rendered. - */ - case image = "icon" - - /** - The compoment contains the localized word for "exit". - - This component may appear before or after an `.exitNumber` component, depending on the language. - */ - case exit - - /** - A component contains an exit number. - */ - case exitCode = "exit-number" - - /** - A component contains a lane. - */ - case lane - -} diff --git a/Tests/MapboxDirectionsTests/IntructionsTests.swift b/Tests/MapboxDirectionsTests/IntructionsTests.swift index b75689414..68befdc63 100644 --- a/Tests/MapboxDirectionsTests/IntructionsTests.swift +++ b/Tests/MapboxDirectionsTests/IntructionsTests.swift @@ -85,27 +85,23 @@ class SpokenInstructionsTests: XCTestCase { XCTAssertEqual(arrivalSpokenInstructions[0].ssmlText, "You have arrived at the gym") let visualInstructions = step.instructionsDisplayedAlongStep - guard let firstComponent = visualInstructions?.first?.primaryInstruction.components.first else { - XCTFail("first primary component of first visual instruction does not exist") - return - } - - guard case let Component.visual(visualInstructionComponent) = firstComponent else { - XCTFail("First component of visual instruction should be visual component") - return - } - XCTAssertNotNil(visualInstructions) - XCTAssertNotNil(visualInstructionComponent) + XCTAssertEqual(visualInstructions?.first?.primaryInstruction.text, "Page Street") - XCTAssertEqual(visualInstructionComponent.text, "Page Street") XCTAssertEqual(visualInstructions?.first?.distanceAlongStep, 1107.1) XCTAssertEqual(visualInstructions?.first?.primaryInstruction.finalHeading, nil) XCTAssertEqual(visualInstructions?.first?.primaryInstruction.maneuverType, .turn) XCTAssertEqual(visualInstructions?.first?.primaryInstruction.maneuverDirection, .left) - XCTAssertEqual(visualInstructionComponent.type, .text) - XCTAssertEqual(visualInstructionComponent.abbreviation, "Page St") - XCTAssertEqual(visualInstructionComponent.abbreviationPriority, 0) + + if let firstComponent = visualInstructions?.first?.primaryInstruction.components.first, + case let VisualInstruction.Component.text(text) = firstComponent { + XCTAssertEqual(text.text, "Page Street") + XCTAssertEqual(text.abbreviation, "Page St") + XCTAssertEqual(text.abbreviationPriority, 0) + } else { + XCTFail("First primary component of visual instruction should be text component") + } + XCTAssertEqual(visualInstructions?.first?.drivingSide, .right) XCTAssertNil(visualInstructions?.first?.secondaryInstruction) @@ -163,25 +159,23 @@ class SpokenInstructionsTests: XCTestCase { XCTAssertNotNil(tertiaryInstruction) XCTAssertEqual(tertiaryInstruction?.text, "") - let tertiaryInstructionComponents = tertiaryInstruction?.components - XCTAssertNotNil(tertiaryInstructionComponents) - let laneIndicationComponents: [LaneIndicationComponent]? = tertiaryInstructionComponents?.compactMap { - guard case let Component.lane(lane) = $0 else { - return nil + let laneIndicationComponents = tertiaryInstruction?.components.filter { (component) -> Bool in + if case VisualInstruction.Component.lane = component { + return true } - return lane + return false } XCTAssertEqual(laneIndicationComponents?.count, 2) - if let laneIndicationComponents = laneIndicationComponents { - - let inActiveLane = laneIndicationComponents[0] - XCTAssertEqual(inActiveLane.isUsable, false) - XCTAssertEqual(inActiveLane.indications, [.straightAhead]) - - let activeLane = laneIndicationComponents[1] - XCTAssertEqual(activeLane.isUsable, true) - XCTAssertEqual(activeLane.indications, [.right]) + if let laneIndicationComponents = laneIndicationComponents, laneIndicationComponents.count > 1 { + if case let VisualInstruction.Component.lane(indications, isUsable) = laneIndicationComponents[0] { + XCTAssertEqual(indications, .straightAhead) + XCTAssertFalse(isUsable) + } + if case let VisualInstruction.Component.lane(indications, isUsable) = laneIndicationComponents[1] { + XCTAssertEqual(indications, .right) + XCTAssertTrue(isUsable) + } } } @@ -232,28 +226,21 @@ class SpokenInstructionsTests: XCTestCase { let visualInstructions = step.instructionsDisplayedAlongStep let tertiaryInstruction = visualInstructions?.first?.tertiaryInstruction - - let visualComponents: [VisualInstructionComponent]? = tertiaryInstruction?.components.compactMap { - guard case let Component.visual(instruction) = $0 else { - return nil - } - return instruction - } - - guard let tertiaryInstructionComponent = visualComponents?.first else { - XCTFail("expecting component to not be nil.") - return - } - XCTAssertNotNil(tertiaryInstruction) XCTAssertEqual(tertiaryInstruction?.text, "Grove Street") XCTAssertEqual(tertiaryInstruction?.maneuverType, .turn) XCTAssertEqual(tertiaryInstruction?.maneuverDirection, .left) - XCTAssertEqual(tertiaryInstructionComponent.text, "Grove Street") - XCTAssertEqual(tertiaryInstructionComponent.type, .text) - XCTAssertEqual(tertiaryInstructionComponent.abbreviation, "Grove St") - XCTAssertEqual(tertiaryInstructionComponent.abbreviationPriority, 0) + let tertiaryInstructionComponent = tertiaryInstruction?.components.first { (component) -> Bool in + if case let VisualInstruction.Component.text(textRepresentation) = component { + XCTAssertEqual(textRepresentation.text, "Grove Street") + XCTAssertEqual(textRepresentation.abbreviation, "Grove St") + XCTAssertEqual(textRepresentation.abbreviationPriority, 0) + return true + } + return false + } + XCTAssertNotNil(tertiaryInstructionComponent) } } #endif diff --git a/Tests/MapboxDirectionsTests/VisualInstructionComponentTests.swift b/Tests/MapboxDirectionsTests/VisualInstructionComponentTests.swift index 59c8ecb4d..6638c6af7 100644 --- a/Tests/MapboxDirectionsTests/VisualInstructionComponentTests.swift +++ b/Tests/MapboxDirectionsTests/VisualInstructionComponentTests.swift @@ -9,16 +9,15 @@ class VisualInstructionComponentTests: XCTestCase { "imageBaseURL": "", ] let componentData = try! JSONSerialization.data(withJSONObject: componentJSON, options: []) - var component: Component? - XCTAssertNoThrow(component = try JSONDecoder().decode(ComponentSerializer.self, from: componentData).component) + var component: VisualInstruction.Component? + XCTAssertNoThrow(component = try JSONDecoder().decode(VisualInstruction.Component.self, from: componentData)) XCTAssertNotNil(component) if let component = component { switch component { - case .lane(_): - XCTFail("Text component should not be interpreted as lane component.") - case let .visual(component): - XCTAssertEqual(component.text, "Take a hike") - XCTAssertNil(component.imageURL) + case .text(let text): + XCTAssertEqual(text.text, "Take a hike") + default: + XCTFail("Text component should not be decoded as any other kind of component.") } } } From bf2ebb0a419030b0a5c6bc0c7d9f72cc0af77f6c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Minh=20Nguye=CC=82=CC=83n?= Date: Thu, 31 Oct 2019 03:58:12 -0700 Subject: [PATCH 37/89] Fixed expectation usage --- Tests/MapboxDirectionsTests/DirectionsTests.swift | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Tests/MapboxDirectionsTests/DirectionsTests.swift b/Tests/MapboxDirectionsTests/DirectionsTests.swift index afbce5844..ed120e0b3 100644 --- a/Tests/MapboxDirectionsTests/DirectionsTests.swift +++ b/Tests/MapboxDirectionsTests/DirectionsTests.swift @@ -86,7 +86,7 @@ class DirectionsTests: XCTestCase { }) { (_) -> OHHTTPStubsResponse in return OHHTTPStubsResponse(data: BadResponse.data(using: .utf8)!, statusCode: 413, headers: ["Content-Type" : "application/json"]) } - let expectation = XCTestExpectation(description: "Async callback") + let expectation = self.expectation(description: "Async callback") let one = CLLocation(coordinate: CLLocationCoordinate2D(latitude: 0.0, longitude: 0.0)) let two = CLLocation(coordinate: CLLocationCoordinate2D(latitude: 2.0, longitude: 2.0)) @@ -108,7 +108,7 @@ class DirectionsTests: XCTestCase { }) { (_) -> OHHTTPStubsResponse in return OHHTTPStubsResponse(data: message.data(using: .utf8)!, statusCode: 420, headers: ["Content-Type" : "text/plain"]) } - let expectation = XCTestExpectation(description: "Async callback") + let expectation = self.expectation(description: "Async callback") let one = CLLocation(coordinate: CLLocationCoordinate2D(latitude: 0.0, longitude: 0.0)) let two = CLLocation(coordinate: CLLocationCoordinate2D(latitude: 2.0, longitude: 2.0)) From d6dc93accac4ce61b32f95dffee4754d5d82328c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Minh=20Nguye=CC=82=CC=83n?= Date: Thu, 31 Oct 2019 03:59:19 -0700 Subject: [PATCH 38/89] Fixed intersection test fixture Input test fixtures need to reflect API response JSON, not try to hew to whatever the model object encodes as. --- Tests/MapboxDirectionsTests/IntersectionTests.swift | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/Tests/MapboxDirectionsTests/IntersectionTests.swift b/Tests/MapboxDirectionsTests/IntersectionTests.swift index 9fdab5f8a..f0dfee675 100644 --- a/Tests/MapboxDirectionsTests/IntersectionTests.swift +++ b/Tests/MapboxDirectionsTests/IntersectionTests.swift @@ -8,20 +8,18 @@ class IntersectionTests: XCTestCase { "location": [13.426579, 52.508068], "in": -1, "classes": ["toll", "restricted"], - "usableApproachLanes": nil, "bearings": [80], "entry": [true], "out": 0, - "approachLanes": nil, + "lanes": nil, ], [ "location": [13.426688, 52.508022], "in": 2, - "usableApproachLanes": nil, "bearings": [30, 120, 300], "entry": [false, true, true], "out": 1, - "approachLanes": nil, + "lanes": nil, ], ] let intersectionsData = try! JSONSerialization.data(withJSONObject: intersectionsJSON, options: []) From c385ce7e0985bb623d6bfcf21449b40b283c3526 Mon Sep 17 00:00:00 2001 From: Jerrad Thramer Date: Thu, 31 Oct 2019 10:21:55 -0600 Subject: [PATCH 39/89] Fixing RouteStepTest --- Sources/MapboxDirections/MBRouteStep.swift | 3 ++- Tests/MapboxDirectionsTests/RouteStepTests.swift | 1 + 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/Sources/MapboxDirections/MBRouteStep.swift b/Sources/MapboxDirections/MBRouteStep.swift index 74dfa992e..a24ec2301 100644 --- a/Sources/MapboxDirections/MBRouteStep.swift +++ b/Sources/MapboxDirections/MBRouteStep.swift @@ -395,7 +395,8 @@ open class RouteStep: Codable, Equatable { try container.encodeIfPresent(intersections, forKey: .intersections) try container.encode(drivingSide, forKey: .drivingSide) try container.encodeIfPresent(name, forKey: .name) - if let shape = shape, let shapeFormat = encoder.userInfo[.options] as? RouteShapeFormat { + if let shape = shape, let options = encoder.userInfo[.options] as? DirectionsOptions { + let shapeFormat = options.shapeFormat let polyLineString = PolyLineString(lineString: shape, shapeFormat: shapeFormat) try container.encode(polyLineString, forKey: .geometry) } diff --git a/Tests/MapboxDirectionsTests/RouteStepTests.swift b/Tests/MapboxDirectionsTests/RouteStepTests.swift index fa65c9afc..2854737ba 100644 --- a/Tests/MapboxDirectionsTests/RouteStepTests.swift +++ b/Tests/MapboxDirectionsTests/RouteStepTests.swift @@ -116,6 +116,7 @@ class RouteStepTests: XCTestCase { let step = try! decoder.decode(RouteStep.self, from: routeStepJSON.data(using: .utf8)!) let encoder = JSONEncoder() + encoder.userInfo[.options] = options encoder.outputFormatting = [.prettyPrinted] let encoded = try! encoder.encode(step) let roundTripJSON = String(data: encoded, encoding: .utf8) From f1504a97fb0610c0c7924f99f3f1b030691070db Mon Sep 17 00:00:00 2001 From: Jerrad Thramer Date: Thu, 31 Oct 2019 11:26:09 -0600 Subject: [PATCH 40/89] testing --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 71b2548d7..e9d00b065 100644 --- a/README.md +++ b/README.md @@ -182,4 +182,4 @@ To run the included unit tests, you need to use [Carthage](https://github.com/Ca 1. `carthage build --platform iOS` 1. `open MapboxDirections.xcodeproj` -1. Go to Product ‣ Test. +1. Go to Product ‣ Test. \ No newline at end of file From 135473ad5daed75afe22e57a6dcf0438c670ae82 Mon Sep 17 00:00:00 2001 From: Jerrad Thramer Date: Thu, 31 Oct 2019 15:37:48 -0600 Subject: [PATCH 41/89] Fixing all remaining test failures --- README.md | 3 ++- Tests/MapboxDirectionsTests/V5Tests.swift | 1 + 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index e9d00b065..a6265498b 100644 --- a/README.md +++ b/README.md @@ -182,4 +182,5 @@ To run the included unit tests, you need to use [Carthage](https://github.com/Ca 1. `carthage build --platform iOS` 1. `open MapboxDirections.xcodeproj` -1. Go to Product ‣ Test. \ No newline at end of file +1. Go to Product ‣ Test. + diff --git a/Tests/MapboxDirectionsTests/V5Tests.swift b/Tests/MapboxDirectionsTests/V5Tests.swift index 32d003e9d..4e63740dc 100644 --- a/Tests/MapboxDirectionsTests/V5Tests.swift +++ b/Tests/MapboxDirectionsTests/V5Tests.swift @@ -301,6 +301,7 @@ class V5Tests: XCTestCase { // Encode and decode the route securely. let encoder = JSONEncoder() + encoder.userInfo[.options] = options encoder.outputFormatting = [.prettyPrinted] let jsonData = try! encoder.encode(route) From facce5ba9e548382ef59b9da5f3cfa6c8f22e9ce Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Minh=20Nguye=CC=82=CC=83n?= Date: Thu, 31 Oct 2019 15:49:42 -0700 Subject: [PATCH 42/89] Test structure of rate limiting error MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Comparing the failure reason and recovery suggestion fails on systems, like mine, where the system language isn’t English or the system region isn’t the United States. --- Tests/MapboxDirectionsTests/DirectionsTests.swift | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/Tests/MapboxDirectionsTests/DirectionsTests.swift b/Tests/MapboxDirectionsTests/DirectionsTests.swift index ed120e0b3..2596a83db 100644 --- a/Tests/MapboxDirectionsTests/DirectionsTests.swift +++ b/Tests/MapboxDirectionsTests/DirectionsTests.swift @@ -133,11 +133,14 @@ class DirectionsTests: XCTestCase { let headerFields = ["X-Rate-Limit-Interval" : "60", "X-Rate-Limit-Limit" : "600", "X-Rate-Limit-Reset" : "1479460584"] let response = HTTPURLResponse(url: url, statusCode: 429, httpVersion: nil, headerFields: headerFields) - let resultError = Directions.informativeError(code: "429", message: "Hit rate limit", response: response, underlyingError: nil) - - XCTAssertEqual(resultError.failureReason, "More than 600 requests have been made with this access token within a period of 1 minute.") - XCTAssertEqual(resultError.recoverySuggestion, "Wait until November 18, 2016 at 9:16:24 AM GMT before retrying.") + if case let .rateLimited(rateLimitInterval, rateLimit, resetTime) = resultError { + XCTAssertEqual(rateLimitInterval, 60.0) + XCTAssertEqual(rateLimit, 600) + XCTAssertEqual(resetTime, Date(timeIntervalSince1970: 1479460584)) + } else { + XCTFail("Code 429 should be interpreted as a rate limiting error.") + } } } #endif From 1c4a0443001ddd7c40b4955dec1f3d33716d4809 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Minh=20Nguye=CC=82=CC=83n?= Date: Fri, 1 Nov 2019 14:21:05 -0700 Subject: [PATCH 43/89] Removed extraneous whitespace --- Directions Example/MBDrawingView.swift | 1 - README.md | 1 - .../MapboxDirections/AttributeOptions.swift | 3 -- .../DirectionsProfileIdentifier.swift | 2 -- .../Extensions/CoreLocation.swift | 2 -- .../Extensions/HTTPURLResponse.swift | 1 - Sources/MapboxDirections/MBCongestion.swift | 1 - .../MapboxDirections/MBCoordinateBounds.swift | 1 - Sources/MapboxDirections/MBDirections.swift | 25 ---------------- .../MBDirectionsOptions.swift | 30 +++++-------------- .../MapboxDirections/MBDirectionsResult.swift | 7 +---- Sources/MapboxDirections/MBIntersection.swift | 1 - .../MapboxDirections/MBLaneIndication.swift | 2 -- Sources/MapboxDirections/MBRoute.swift | 1 - Sources/MapboxDirections/MBRouteLeg.swift | 12 ++------ Sources/MapboxDirections/MBRouteOptions.swift | 15 +++------- Sources/MapboxDirections/MBRouteStep.swift | 17 ----------- .../MBSpokenInstruction.swift | 21 +++++-------- .../MBVisualInstruction.swift | 5 ++-- .../MBVisualInstructionBanner.swift | 7 ----- Sources/MapboxDirections/MBWaypoint.swift | 5 ++-- Sources/MapboxDirections/Match/MBMatch.swift | 1 - .../Match/MBMatchOptions.swift | 21 ++++++------- .../MapboxDirections/Match/MBTracepoint.swift | 4 --- .../Match/MapMatchingResponse.swift | 1 - .../Match/MatchResponse.swift | 1 - .../MapboxDirections/OfflineDirections.swift | 22 +++++++------- Sources/MapboxDirections/RoadClasses.swift | 5 ---- Sources/MapboxDirections/RouteResponse.swift | 1 - .../DirectionsTests.swift | 1 - Tests/MapboxDirectionsTests/MatchTests.swift | 2 -- .../OfflineDirectionsTests.swift | 3 -- .../RoutableMatchTests.swift | 1 - .../RouteOptionsTests.swift | 15 +++++----- .../RouteStepTests.swift | 2 -- .../WalkingOptionsTests.swift | 2 -- .../MapboxDirectionsTests/WaypointTests.swift | 2 -- 37 files changed, 56 insertions(+), 188 deletions(-) diff --git a/Directions Example/MBDrawingView.swift b/Directions Example/MBDrawingView.swift index e9b4adfd5..41107dc5a 100644 --- a/Directions Example/MBDrawingView.swift +++ b/Directions Example/MBDrawingView.swift @@ -5,7 +5,6 @@ public protocol MBDrawingViewDelegate: class { } public class MBDrawingView: UIView { - private var points: [CGPoint]! private var context: CGContext! private var strokeColor = UIColor.blue.withAlphaComponent(0.75) { diff --git a/README.md b/README.md index a6265498b..37b108156 100644 --- a/README.md +++ b/README.md @@ -149,7 +149,6 @@ let task = directions.calculate(options) { (matches, error) in } ``` - You can also use the `Directions.calculateRoutes(matching:completionHandler:)` method to get Route objects suitable for use anywhere a standard Directions API response would be used. ## Usage with other Mapbox libraries diff --git a/Sources/MapboxDirections/AttributeOptions.swift b/Sources/MapboxDirections/AttributeOptions.swift index fce376460..1daeefa4f 100644 --- a/Sources/MapboxDirections/AttributeOptions.swift +++ b/Sources/MapboxDirections/AttributeOptions.swift @@ -1,7 +1,5 @@ import Foundation - - public struct AttributeOptions: OptionSet, CustomStringConvertible{ public typealias RawValue = Int @@ -41,7 +39,6 @@ public struct AttributeOptions: OptionSet, CustomStringConvertible{ */ public static let congestionLevel = AttributeOptions(rawValue: 1 << 4) - /** Creates an AttributeOptions from the given description strings. */ diff --git a/Sources/MapboxDirections/DirectionsProfileIdentifier.swift b/Sources/MapboxDirections/DirectionsProfileIdentifier.swift index 408ee442b..a620c9e40 100644 --- a/Sources/MapboxDirections/DirectionsProfileIdentifier.swift +++ b/Sources/MapboxDirections/DirectionsProfileIdentifier.swift @@ -3,7 +3,6 @@ import Foundation @available(*, deprecated, renamed: "DirectionsProfileIdentifier") public typealias MBDirectionsProfileIdentifier = DirectionsProfileIdentifier - /** The returned directions are appropriate for driving or riding a car, truck, or motorcycle. @@ -23,7 +22,6 @@ public struct DirectionsProfileIdentifier: Codable, Hashable, RawRepresentable, public var rawValue: String - /** The returned directions are appropriate for driving or riding a car, truck, or motorcycle. diff --git a/Sources/MapboxDirections/Extensions/CoreLocation.swift b/Sources/MapboxDirections/Extensions/CoreLocation.swift index 566dcd0f1..ac30ceda4 100644 --- a/Sources/MapboxDirections/Extensions/CoreLocation.swift +++ b/Sources/MapboxDirections/Extensions/CoreLocation.swift @@ -5,10 +5,8 @@ extension CLLocationCoordinate2D { internal var requestDescription: String { return "\(longitude.rounded(to: 1e6)),\(latitude.rounded(to: 1e6))" } - } - extension CLLocation { /** Initializes a CLLocation object with the given coordinate pair. diff --git a/Sources/MapboxDirections/Extensions/HTTPURLResponse.swift b/Sources/MapboxDirections/Extensions/HTTPURLResponse.swift index cb328e59f..1db1ae483 100644 --- a/Sources/MapboxDirections/Extensions/HTTPURLResponse.swift +++ b/Sources/MapboxDirections/Extensions/HTTPURLResponse.swift @@ -1,6 +1,5 @@ import Foundation - extension HTTPURLResponse { var rateLimit: UInt? { guard let limit = allHeaderFields["X-Rate-Limit-Limit"] as? String else { diff --git a/Sources/MapboxDirections/MBCongestion.swift b/Sources/MapboxDirections/MBCongestion.swift index c1a3ee404..e5fe79bb4 100644 --- a/Sources/MapboxDirections/MBCongestion.swift +++ b/Sources/MapboxDirections/MBCongestion.swift @@ -3,7 +3,6 @@ import Foundation /** A `CongestionLevel` indicates the level of traffic congestion along a road segment relative to the normal flow of traffic along that segment. You can color-code a route line according to the congestion level along each segment of the route. */ - public enum CongestionLevel: String, Codable{ /** There is not enough data to determine the level of congestion along the road segment. diff --git a/Sources/MapboxDirections/MBCoordinateBounds.swift b/Sources/MapboxDirections/MBCoordinateBounds.swift index d6a9b154a..a3b90fcfa 100644 --- a/Sources/MapboxDirections/MBCoordinateBounds.swift +++ b/Sources/MapboxDirections/MBCoordinateBounds.swift @@ -4,7 +4,6 @@ import CoreLocation /** A bounding box represents a geographic region. */ - public struct CoordinateBounds: Codable { let southWest: CLLocationCoordinate2D let northEast: CLLocationCoordinate2D diff --git a/Sources/MapboxDirections/MBDirections.swift b/Sources/MapboxDirections/MBDirections.swift index cb48666e2..df2acc99a 100644 --- a/Sources/MapboxDirections/MBDirections.swift +++ b/Sources/MapboxDirections/MBDirections.swift @@ -1,6 +1,5 @@ import Foundation - typealias JSONDictionary = [String: Any] /// Indicates that an error occurred in MapboxDirections. @@ -66,7 +65,6 @@ let userAgent: String = { Each result produced by the directions object is stored in a `Route` object. Depending on the `RouteOptions` object you provide, each route may include detailed information suitable for turn-by-turn directions, or it may include only high-level information such as the distance, estimated travel time, and name of each leg of the trip. The waypoints that form the request may be conflated with nearby locations, as appropriate; the resulting waypoints are provided to the closure. */ - open class Directions: NSObject { /** A closure (block) to be called when a directions request is complete. @@ -96,7 +94,6 @@ open class Directions: NSObject { To use this object, a Mapbox [access token](https://docs.mapbox.com/help/glossary/access-token/) should be specified in the `MGLMapboxAccessToken` key in the main application bundle’s Info.plist. */ - public static let shared = Directions(accessToken: nil) /** @@ -145,7 +142,6 @@ open class Directions: NSObject { // MARK: Getting Directions - /** Begins asynchronously calculating routes using the given options and delivers the results to a closure. @@ -157,8 +153,6 @@ open class Directions: NSObject { - parameter completionHandler: The closure (block) to call with the resulting routes. This closure is executed on the application’s main thread. - returns: The data task used to perform the HTTP request. If, while waiting for the completion handler to execute, you no longer want the resulting routes, cancel this task. */ - - @discardableResult open func calculate(_ options: RouteOptions, completionHandler: @escaping RouteCompletionHandler) -> URLSessionDataTask { let fetchStart = Date() let request = urlRequest(forCalculating: options) @@ -174,7 +168,6 @@ open class Directions: NSObject { return } - if let error = possibleError { completionHandler(nil, nil, .unknown(response: possibleResponse, underlying: error, code: nil, message: nil)) return @@ -206,10 +199,7 @@ open class Directions: NSObject { completionHandler(nil, nil, bailError) } } - - } - } requestTask.priority = 1 requestTask.resume() @@ -217,8 +207,6 @@ open class Directions: NSObject { return requestTask } - - /** Begins asynchronously calculating matches using the given options and delivers the results to a closure. @@ -230,7 +218,6 @@ open class Directions: NSObject { - parameter completionHandler: The closure (block) to call with the resulting matches. This closure is executed on the application’s main thread. - returns: The data task used to perform the HTTP request. If, while waiting for the completion handler to execute, you no longer want the resulting matches, cancel this task. */ - @discardableResult open func calculate(_ options: MatchOptions, completionHandler: @escaping MatchCompletionHandler) -> URLSessionDataTask { let fetchStart = Date() let request = urlRequest(forCalculating: options) @@ -246,7 +233,6 @@ open class Directions: NSObject { return } - if let error = possibleError { completionHandler(nil, .unknown(response: possibleResponse, underlying: error, code: nil, message: nil)) return @@ -299,7 +285,6 @@ open class Directions: NSObject { - parameter completionHandler: The closure (block) to call with the resulting routes. This closure is executed on the application’s main thread. - returns: The data task used to perform the HTTP request. If, while waiting for the completion handler to execute, you no longer want the resulting routes, cancel this task. */ - @discardableResult open func calculateRoutes(matching options: MatchOptions, completionHandler: @escaping RouteCompletionHandler) -> URLSessionDataTask { let fetchStart = Date() let request = urlRequest(forCalculating: options) @@ -315,7 +300,6 @@ open class Directions: NSObject { return } - if let error = possibleError { completionHandler(nil, nil, .unknown(response: possibleResponse, underlying: error, code: nil, message: nil)) return @@ -346,10 +330,7 @@ open class Directions: NSObject { completionHandler(nil, nil, .unknown(response: response, underlying: error, code: nil, message: nil)) } } - - } - } requestTask.priority = 1 requestTask.resume() @@ -357,7 +338,6 @@ open class Directions: NSObject { return requestTask } - /** The GET HTTP URL used to fetch the routes from the API. @@ -366,7 +346,6 @@ open class Directions: NSObject { - parameter options: A `DirectionsOptions` object specifying the requirements for the resulting routes. - returns: The URL to send the request to. */ - open func url(forCalculating options: DirectionsOptions) -> URL { return url(forCalculating: options, httpMethod: "GET") } @@ -382,7 +361,6 @@ open class Directions: NSObject { - parameter httpMethod: The HTTP method to use. The value of this argument should match the `URLRequest.httpMethod` of the request you send. Currently, only GET and POST requests are supported by the API. - returns: The URL to send the request to. */ - open func url(forCalculating options: DirectionsOptions, httpMethod: String) -> URL { let includesQuery = httpMethod != "POST" var params = (includesQuery ? options.urlQueryItems : []) @@ -408,7 +386,6 @@ open class Directions: NSObject { - parameter options: A `DirectionsOptions` object specifying the requirements for the resulting routes. - returns: A GET or POST HTTP request to calculate the specified options. */ - open func urlRequest(forCalculating options: DirectionsOptions) -> URLRequest { let getURL = self.url(forCalculating: options, httpMethod: "GET") var request = URLRequest(url: getURL) @@ -473,7 +450,6 @@ public extension CodingUserInfoKey { } public class DirectionsDecoder: JSONDecoder { - /** Initializes a `DirectionsDecoder` with a given `RouteOption`. */ @@ -482,7 +458,6 @@ public class DirectionsDecoder: JSONDecoder { routeOptions = options } - var routeOptions: DirectionsOptions? { get { return userInfo[.options] as? DirectionsOptions diff --git a/Sources/MapboxDirections/MBDirectionsOptions.swift b/Sources/MapboxDirections/MBDirectionsOptions.swift index 124096b05..c8817c46e 100644 --- a/Sources/MapboxDirections/MBDirectionsOptions.swift +++ b/Sources/MapboxDirections/MBDirectionsOptions.swift @@ -2,7 +2,6 @@ import Foundation import Polyline import CoreLocation - /** Maximum length of an HTTP request URL for the purposes of switching from GET to POST. @@ -14,7 +13,6 @@ let MaximumURLLength = 1024 * 8 /** A `RouteShapeFormat` indicates the format of a route or match shape in the raw HTTP response. */ - public enum RouteShapeFormat: String, Codable { /** The route’s shape is delivered in [GeoJSON](http://geojson.org/) format. @@ -39,7 +37,6 @@ public enum RouteShapeFormat: String, Codable { /** A `RouteShapeResolution` indicates the level of detail in a route’s shape, or whether the shape is present at all. */ - public enum RouteShapeResolution: String, Codable { /** The route’s shape is omitted. @@ -64,9 +61,7 @@ public enum RouteShapeResolution: String, Codable { /** A system of units of measuring distances and other quantities. */ - public enum MeasurementSystem: String, Codable { - /** U.S. customary and British imperial units. @@ -82,14 +77,11 @@ public enum MeasurementSystem: String, Codable { case metric } - /** Options for calculating results from the Mapbox Directions service. You do not create instances of this class directly. Instead, create instances of `MatchOptions` or `RouteOptions`. */ - - open class DirectionsOptions: Codable, Equatable { /** Initializes an options object for routes between the given waypoints and an optional profile identifier. @@ -117,7 +109,6 @@ open class DirectionsOptions: Codable, Equatable { case includesVisualInstructions } - public func encode(to encoder: Encoder) throws { var container = encoder.container(keyedBy: CodingKeys.self) try container.encode(waypoints, forKey: .waypoints) @@ -134,8 +125,6 @@ open class DirectionsOptions: Codable, Equatable { if includesSpokenInstructions { try container.encode(distanceMeasurementSystem, forKey: .distanceMeasurementSystem) } - - } public required init(from decoder: Decoder) throws { @@ -152,8 +141,6 @@ open class DirectionsOptions: Codable, Equatable { includesVisualInstructions = try container.decode(Bool.self, forKey: .includesVisualInstructions) } - - /** An array of `Waypoint` objects representing locations that the route should visit in chronological order. @@ -253,21 +240,19 @@ open class DirectionsOptions: Codable, Equatable { `visualInstructionsAlongStep` contains an array of `VisualInstruction` objects used for visually conveying information about a given `RouteStep`. */ open var includesVisualInstructions = false - + + // MARK: - URL Queries + /** An array of URL query items to include in an HTTP request. The query items are included in the URL of a GET request or the body of a POST request. */ - - -// MARK: - URL Queries - - var abridgedPath: String { - assertionFailure("abridgedPath should be overriden by subclass") - return "" + assertionFailure("abridgedPath should be overriden by subclass") + return "" } + /** The path of the request URL, not including the hostname or any parameters. */ @@ -279,8 +264,7 @@ open class DirectionsOptions: Codable, Equatable { return "\(abridgedPath)/\(coordinates).json" } - - var urlQueryItems: [URLQueryItem] { + var urlQueryItems: [URLQueryItem] { var queryItems: [URLQueryItem] = [ URLQueryItem(name: "geometries", value: shapeFormat.rawValue), URLQueryItem(name: "overview", value: routeShapeResolution.rawValue), diff --git a/Sources/MapboxDirections/MBDirectionsResult.swift b/Sources/MapboxDirections/MBDirectionsResult.swift index 089f3a4eb..c71520173 100644 --- a/Sources/MapboxDirections/MBDirectionsResult.swift +++ b/Sources/MapboxDirections/MBDirectionsResult.swift @@ -8,7 +8,6 @@ import struct Turf.LineString You do not create instances of this class directly. Instead, you receive `Route` or `Match` objects when you request directions using the `Directions.calculate(_:completionHandler:)` or `Directions.calculateRoutes(matching:completionHandler:)` method. */ - open class DirectionsResult: Codable { private enum CodingKeys: String, CodingKey { case geometry = "geometry" @@ -22,8 +21,6 @@ open class DirectionsResult: Codable { case speechLocale = "voiceLocale" } - - public required init(from decoder: Decoder) throws { let container = try decoder.container(keyedBy: CodingKeys.self) legs = try container.decode([RouteLeg].self, forKey: .legs) @@ -96,7 +93,6 @@ open class DirectionsResult: Codable { */ public let legs: [RouteLeg] - // MARK: Getting Additional Route Details /** @@ -124,8 +120,8 @@ open class DirectionsResult: Codable { return _directionsOptions } - private let _directionsOptions: DirectionsOptions + /** The [access token](https://docs.mapbox.com/help/glossary/access-token/) used to make the directions request. @@ -139,7 +135,6 @@ open class DirectionsResult: Codable { This property is set automatically if a request is made via `Directions.calculate(_:completionHandler:)`. */ open var apiEndpoint: URL? - /** A unique identifier for a directions request. diff --git a/Sources/MapboxDirections/MBIntersection.swift b/Sources/MapboxDirections/MBIntersection.swift index 3a3511011..f8c3402a2 100644 --- a/Sources/MapboxDirections/MBIntersection.swift +++ b/Sources/MapboxDirections/MBIntersection.swift @@ -5,7 +5,6 @@ import CoreLocation A single cross street along a step. */ public struct Intersection: Codable, Equatable { - /** The geographic coordinates at the center of the intersection. */ diff --git a/Sources/MapboxDirections/MBLaneIndication.swift b/Sources/MapboxDirections/MBLaneIndication.swift index 18042fb3b..97776cae5 100644 --- a/Sources/MapboxDirections/MBLaneIndication.swift +++ b/Sources/MapboxDirections/MBLaneIndication.swift @@ -1,6 +1,5 @@ import Foundation - public struct LaneIndication: OptionSet, CustomStringConvertible, Codable { public var rawValue: Int @@ -8,7 +7,6 @@ public struct LaneIndication: OptionSet, CustomStringConvertible, Codable { self.rawValue = rawValue } - public typealias RawValue = Int /// Indicates a sharp turn to the right. diff --git a/Sources/MapboxDirections/MBRoute.swift b/Sources/MapboxDirections/MBRoute.swift index d2793e681..7adf43110 100644 --- a/Sources/MapboxDirections/MBRoute.swift +++ b/Sources/MapboxDirections/MBRoute.swift @@ -5,7 +5,6 @@ import Polyline Typically, you do not create instances of this class directly. Instead, you receive route objects when you request directions using the `Directions.calculate(_:completionHandler:)` method. However, if you use the `Directions.url(forCalculating:)` method instead, you can pass the results of the HTTP request into this class’s initializer. */ - private enum CodingKeys: String, CodingKey { case routeOptions } diff --git a/Sources/MapboxDirections/MBRouteLeg.swift b/Sources/MapboxDirections/MBRouteLeg.swift index 696b6bc76..77ff2883f 100644 --- a/Sources/MapboxDirections/MBRouteLeg.swift +++ b/Sources/MapboxDirections/MBRouteLeg.swift @@ -2,16 +2,12 @@ import Foundation import CoreLocation import Polyline - /** A `RouteLeg` object defines a single leg of a route between two waypoints. If the overall route has only two waypoints, it has a single `RouteLeg` object that covers the entire route. The route leg object includes information about the leg, such as its name, distance, and expected travel time. Depending on the criteria used to calculate the route, the route leg object may also include detailed turn-by-turn instructions. You do not create instances of this class directly. Instead, you receive route leg objects as part of route objects when you request directions using the `Directions.calculate(_:completionHandler:)` method. */ - - open class RouteLeg: Codable, Equatable { - public enum CodingKeys: String, CodingKey { case source case destination @@ -30,8 +26,6 @@ open class RouteLeg: Codable, Equatable { case segmentCongestionLevels = "congestion" } - - public required init(from decoder: Decoder) throws { let container = try decoder.container(keyedBy: CodingKeys.self) let options = decoder.userInfo[.options] as? DirectionsOptions @@ -92,8 +86,7 @@ open class RouteLeg: Codable, Equatable { This array is empty if the `includesSteps` property of the original `RouteOptions` object is set to `false`. */ public let steps: [RouteStep] - - + /** An array containing the distance (measured in meters) between each coordinate in the route leg geometry. @@ -140,8 +133,7 @@ open class RouteLeg: Codable, Equatable { The leg’s name does not identify the start and end points of the leg. To distinguish one leg from another within the same route, concatenate the `name` properties of the `source` and `destination` waypoints. */ public let name: String - - + /** The route leg’s distance, measured in meters. diff --git a/Sources/MapboxDirections/MBRouteOptions.swift b/Sources/MapboxDirections/MBRouteOptions.swift index 440bccf7e..721d1d3b8 100644 --- a/Sources/MapboxDirections/MBRouteOptions.swift +++ b/Sources/MapboxDirections/MBRouteOptions.swift @@ -15,9 +15,8 @@ open class RouteOptions: DirectionsOptions { - parameter profileIdentifier: A string specifying the primary mode of transportation for the routes. `DirectionsProfileIdentifier.automobile` is used by default. */ public required init(waypoints: [Waypoint], profileIdentifier: DirectionsProfileIdentifier? = nil) { - let profilesDisallowingUTurns: [DirectionsProfileIdentifier] = [.automobile, .automobileAvoidingTraffic] - allowsUTurnAtWaypoint = !profilesDisallowingUTurns.contains(profileIdentifier ?? .automobile) + allowsUTurnAtWaypoint = !profilesDisallowingUTurns.contains(profileIdentifier ?? .automobile) super.init(waypoints: waypoints, profileIdentifier: profileIdentifier) } @@ -100,8 +99,7 @@ open class RouteOptions: DirectionsOptions { The default value of this property is `false` when the profile identifier is `DirectionsProfileIdentifier.automobile` or `DirectionsProfileIdentifier.automobileAvoidingTraffic` and `true` otherwise. */ open var allowsUTurnAtWaypoint: Bool - - + // MARK: Specifying the Response Format /** @@ -114,16 +112,14 @@ open class RouteOptions: DirectionsOptions { The default value of this property is `false`. */ open var includesAlternativeRoutes = false - - + /** A Boolean value indicating whether the route includes a `ManeuverType.exitRoundabout` or `ManeuverType.exitRotary` step when traversing a roundabout or rotary, respectively. If this option is set to `true`, a route that traverses a roundabout includes both a `ManeuverType.takeRoundabout` step and a `ManeuverType.exitRoundabout` step; likewise, a route that traverses a large, named roundabout includes both a `ManeuverType.takeRotary` step and a `ManeuverType.exitRotary` step. Otherwise, it only includes a `ManeuverType.takeRoundabout` or `ManeuverType.takeRotary` step. This option is set to `false` by default. */ open var includesExitRoundaboutManeuver = false - - + /** The route classes that the calculated routes will avoid. @@ -131,7 +127,6 @@ open class RouteOptions: DirectionsOptions { */ open var roadClassesToAvoid: RoadClasses = [] - /** A number that influences whether the route should prefer or avoid alleys or narrow service roads between buildings. @@ -177,7 +172,6 @@ open class RouteOptions: DirectionsOptions { params.append(URLQueryItem(name: "walkway_bias", value: String(walkwayPriority.rawValue))) params.append(URLQueryItem(name: "walking_speed", value: String(speed))) } - if !roadClassesToAvoid.isEmpty { let allRoadClasses = roadClassesToAvoid.description.components(separatedBy: ",") @@ -216,7 +210,6 @@ public enum InstructionFormat: String { case html } - extension CLLocationSpeed { /** By default, pedestrians are assumed to walk at an average rate of 1.42 meters per second (5.11 kilometers per hour or 3.18 miles per hour), corresponding to a typical preferred walking speed. diff --git a/Sources/MapboxDirections/MBRouteStep.swift b/Sources/MapboxDirections/MBRouteStep.swift index a24ec2301..cc96b34c3 100644 --- a/Sources/MapboxDirections/MBRouteStep.swift +++ b/Sources/MapboxDirections/MBRouteStep.swift @@ -6,7 +6,6 @@ import struct Turf.LineString /** A `TransportType` specifies the mode of transportation used for part of a route. */ - public enum TransportType: String, Codable { // Possible transport types when the `profileIdentifier` is `DirectionsProfileIdentifier.automobile` or `DirectionsProfileIdentifier.automobileAvoidingTraffic` @@ -71,13 +70,11 @@ public enum TransportType: String, Codable { case train // cycling } - /** A `ManeuverType` specifies the type of maneuver required to complete the route step. You can pair a maneuver type with a `ManeuverDirection` to choose an appropriate visual or voice prompt to present the user. In Swift, you can use pattern matching with a single switch statement on a tuple containing the maneuver type and maneuver direction to avoid a complex series of if-else-if statements or switch statements. */ - public enum ManeuverType: String, Codable { /** The step does not have a particular maneuver type associated with it. @@ -213,7 +210,6 @@ public enum ManeuverType: String, Codable { /** A `ManeuverDirection` clarifies a `ManeuverType` with directional information. The exact meaning of the maneuver direction for a given step depends on the step’s maneuver type; see the `ManeuverType` documentation for details. */ - public enum ManeuverDirection: String, Codable { /** The step does not have a particular maneuver direction associated with it. @@ -265,7 +261,6 @@ public enum ManeuverDirection: String, Codable { case uTurn = "uturn" } - extension String { internal func tagValues(separatedBy separator: String) -> [String] { return components(separatedBy: separator).map { $0.trimmingCharacters(in: .whitespaces) }.filter { !$0.isEmpty } @@ -324,22 +319,12 @@ struct Road { } } -/** - A `RouteStep` object represents a single distinct maneuver along a route and the approach to the next maneuver. The route step object corresponds to a single instruction the user must follow to complete a portion of the route. For example, a step might require the user to turn then follow a road. - - You do not create instances of this class directly. Instead, you receive route step objects as part of route objects when you request directions using the `Directions.calculate(_:completionHandler:)` method, setting the `includesSteps` option to `true` in the `RouteOptions` object that you pass into that method. - */ - -import Polyline - - /** A `RouteStep` object represents a single distinct maneuver along a route and the approach to the next maneuver. The route step object corresponds to a single instruction the user must follow to complete a portion of the route. For example, a step might require the user to turn then follow a road. You do not create instances of this class directly. Instead, you receive route step objects as part of route objects when you request directions using the `Directions.calculate(_:completionHandler:)` method, setting the `includesSteps` option to `true` in the `RouteOptions` object that you pass into that method. */ open class RouteStep: Codable, Equatable { - private enum CodingKeys: String, CodingKey { case codes case geometry @@ -457,7 +442,6 @@ open class RouteStep: Codable, Equatable { instructionsSpokenAlongStep = try container.decodeIfPresent([SpokenInstruction].self, forKey: .instructionsSpokenAlongStep) - if let visuals = try container.decodeIfPresent([VisualInstructionBanner].self, forKey: .instructionsDisplayedAlongStep) { for instruction in visuals { instruction.drivingSide = drivingSide @@ -549,7 +533,6 @@ open class RouteStep: Codable, Equatable { This property is non-`nil` if the `RouteOptions.includesVisualInstructions` option is set to `true`. For instructions designed for speech synthesis, use the `instructionsSpokenAlongStep` property. For instructions designed for display in a static list, use the `instructions` property. */ public let instructionsDisplayedAlongStep: [VisualInstructionBanner]? - /** The user’s heading immediately before performing the maneuver. diff --git a/Sources/MapboxDirections/MBSpokenInstruction.swift b/Sources/MapboxDirections/MBSpokenInstruction.swift index 815060bac..23a81c6f6 100644 --- a/Sources/MapboxDirections/MBSpokenInstruction.swift +++ b/Sources/MapboxDirections/MBSpokenInstruction.swift @@ -1,7 +1,6 @@ import Foundation import CoreLocation - /** An instruction about an upcoming `RouteStep`’s maneuver, optimized for speech synthesis. @@ -9,7 +8,6 @@ import CoreLocation The `distanceAlongStep` property is measured from the beginning of the step associated with this object. By contrast, the `text` and `ssmlText` properties refer to the details in the following step. It is also possible for the instruction to refer to two following steps simultaneously when needed for safe navigation. */ - open class SpokenInstruction: Codable, Equatable { /** A distance along the associated `RouteStep` at which to read the instruction aloud. @@ -17,8 +15,7 @@ open class SpokenInstruction: Codable, Equatable { The distance is measured in meters from the beginning of the associated step. */ public let distanceAlongStep: CLLocationDistance - - + /** A plain-text representation of the speech-optimized instruction. @@ -26,21 +23,19 @@ open class SpokenInstruction: Codable, Equatable { */ public let text: String - /** A formatted representation of the speech-optimized instruction. - + This representation is appropriate for speech synthesizers that support the [Speech Synthesis Markup Language](https://en.wikipedia.org/wiki/Speech_Synthesis_Markup_Language) (SSML), such as [Amazon Polly](https://aws.amazon.com/polly/). Numbers and names are marked up to ensure correct pronunciation. For speech synthesizers that lack SSML support, use the `text` property instead. */ public let ssmlText: String - private enum CodingKeys: String, CodingKey { - case distanceAlongStep = "distanceAlongGeometry" - case text = "announcement" - case ssmlText = "ssmlAnnouncement" - } - - + private enum CodingKeys: String, CodingKey { + case distanceAlongStep = "distanceAlongGeometry" + case text = "announcement" + case ssmlText = "ssmlAnnouncement" + } + /** Initialize a `SpokenInstruction`. diff --git a/Sources/MapboxDirections/MBVisualInstruction.swift b/Sources/MapboxDirections/MBVisualInstruction.swift index 30d25af6d..caa0b9bb3 100644 --- a/Sources/MapboxDirections/MBVisualInstruction.swift +++ b/Sources/MapboxDirections/MBVisualInstruction.swift @@ -5,7 +5,6 @@ import CoreLocation The contents of a banner that should be displayed as added visual guidance for a route. The banner instructions are children of the steps during which they should be displayed, but they refer to the maneuver in the following step. */ open class VisualInstruction: Codable, Equatable { - /** A plain text representation of the instruction. - Note: This is optional despite the API Documentation because it is commonplace for the SDK to return an empty string, which we consder to be equivelent to `null` @@ -47,8 +46,8 @@ open class VisualInstruction: Codable, Equatable { self.finalHeading = degrees } - // MARK: - Codable + private enum CodingKeys: String, CodingKey { case text case maneuverType = "type" @@ -56,6 +55,7 @@ open class VisualInstruction: Codable, Equatable { case components case finalHeading = "degrees" } + public func encode(to encoder: Encoder) throws { var container = encoder.container(keyedBy: CodingKeys.self) try container.encodeIfPresent(text, forKey: .text) @@ -75,6 +75,7 @@ open class VisualInstruction: Codable, Equatable { } // MARK: - Equatable + public static func == (lhs: VisualInstruction, rhs: VisualInstruction) -> Bool { return lhs.text == rhs.text && lhs.maneuverType == rhs.maneuverType && diff --git a/Sources/MapboxDirections/MBVisualInstructionBanner.swift b/Sources/MapboxDirections/MBVisualInstructionBanner.swift index 847be370b..ba0f99d32 100644 --- a/Sources/MapboxDirections/MBVisualInstructionBanner.swift +++ b/Sources/MapboxDirections/MBVisualInstructionBanner.swift @@ -1,7 +1,6 @@ import Foundation import CoreLocation - internal extension CodingUserInfoKey { static let drivingSide = CodingUserInfoKey(rawValue: "drivingSide")! } @@ -9,9 +8,7 @@ internal extension CodingUserInfoKey { /** A visual instruction banner contains all the information necessary for creating a visual cue about a given `RouteStep`. */ - open class VisualInstructionBanner: Codable, Equatable { - private enum CodingKeys: String, CodingKey { case distanceAlongStep = "distanceAlongGeometry" case primaryInstruction = "primary" @@ -28,8 +25,6 @@ open class VisualInstructionBanner: Codable, Equatable { try container.encode(drivingSide, forKey: .drivingSide) } - - required public init(from decoder: Decoder) throws { let container = try decoder.container(keyedBy: CodingKeys.self) distanceAlongStep = try container.decode(CLLocationDistance.self, forKey: .distanceAlongStep) @@ -41,8 +36,6 @@ open class VisualInstructionBanner: Codable, Equatable { } } - - /** The distance at which the visual instruction should be shown, measured in meters from the beginning of the step. */ diff --git a/Sources/MapboxDirections/MBWaypoint.swift b/Sources/MapboxDirections/MBWaypoint.swift index d4917f704..cb6a2aa74 100644 --- a/Sources/MapboxDirections/MBWaypoint.swift +++ b/Sources/MapboxDirections/MBWaypoint.swift @@ -4,9 +4,6 @@ import CoreLocation A `Waypoint` object indicates a location along a route. It may be the route’s origin or destination, or it may be another location that the route visits. A waypoint object indicates the location’s geographic location along with other optional information, such as a name or the user’s direction approaching the waypoint. You create a `RouteOptions` object using waypoint objects and also receive waypoint objects in the completion handler of the `Directions.calculate(_:completionHandler:)` method. */ public class Waypoint: Codable { - - // MARK: Creating a Waypoint Object - private enum CodingKeys: String, CodingKey { case coordinate = "location" case coordinateAccuracy @@ -18,6 +15,8 @@ public class Waypoint: Codable { case allowsArrivingOnOppositeSide } + // MARK: Creating a Waypoint Object + required public init(from decoder: Decoder) throws { let container = try decoder.container(keyedBy: CodingKeys.self) diff --git a/Sources/MapboxDirections/Match/MBMatch.swift b/Sources/MapboxDirections/Match/MBMatch.swift index 58c42cdd2..efc90b8a4 100644 --- a/Sources/MapboxDirections/Match/MBMatch.swift +++ b/Sources/MapboxDirections/Match/MBMatch.swift @@ -37,7 +37,6 @@ open class Match: DirectionsResult { */ open var confidence: Float - /** Tracepoints on the road network that match the tracepoints in the match options. diff --git a/Sources/MapboxDirections/Match/MBMatchOptions.swift b/Sources/MapboxDirections/Match/MBMatchOptions.swift index db03ffdc8..4e7a64d0c 100644 --- a/Sources/MapboxDirections/Match/MBMatchOptions.swift +++ b/Sources/MapboxDirections/Match/MBMatchOptions.swift @@ -1,14 +1,12 @@ import Foundation import CoreLocation - /** A `MatchOptions` object is a structure that specifies the criteria for results returned by the Mapbox Map Matching API. Pass an instance of this class into the `Directions.calculate(_:completionHandler:)` method. */ open class MatchOptions: DirectionsOptions { - /** Initializes a match options object for matching locations against the road network. @@ -39,26 +37,27 @@ open class MatchOptions: DirectionsOptions { super.init(waypoints: waypoints, profileIdentifier: profileIdentifier) } - private enum CodingKeys: String, CodingKey { case resamplesTraces = "tidy" } + public override func encode(to encoder: Encoder) throws { var container = encoder.container(keyedBy: CodingKeys.self) try container.encode(resamplesTraces, forKey: .resamplesTraces) try super.encode(to: encoder) } + public required init(from decoder: Decoder) throws { let container = try decoder.container(keyedBy: CodingKeys.self) resamplesTraces = try container.decode(Bool.self, forKey: .resamplesTraces) try super.init(from: decoder) } + /** If true, the input locations are re-sampled for improved map matching results. The default is `false`. */ open var resamplesTraces: Bool = false - - + /** An index set containing indices of two or more items in `coordinates`. These will be represented by `Waypoint`s in the resulting `Match` objects. @@ -95,17 +94,19 @@ open class MatchOptions: DirectionsOptions { return "matching/v5/\(profileIdentifier.rawValue)" } } + private protocol MatchOptionsDeprecations { var waypointIndices: IndexSet? { get set } } + extension MatchOptions: MatchOptionsDeprecations {} -//MARK: - Equatable +// MARK: - Equatable public extension MatchOptions { static func == (lhs: MatchOptions, rhs: MatchOptions) -> Bool { - let isSuperEqual = ((lhs as DirectionsOptions) == (rhs as DirectionsOptions)) - return isSuperEqual && - lhs.abridgedPath == rhs.abridgedPath && - lhs.resamplesTraces == rhs.resamplesTraces + let isSuperEqual = ((lhs as DirectionsOptions) == (rhs as DirectionsOptions)) + return isSuperEqual && + lhs.abridgedPath == rhs.abridgedPath && + lhs.resamplesTraces == rhs.resamplesTraces } } diff --git a/Sources/MapboxDirections/Match/MBTracepoint.swift b/Sources/MapboxDirections/Match/MBTracepoint.swift index 086ef0d32..3295c51bc 100644 --- a/Sources/MapboxDirections/Match/MBTracepoint.swift +++ b/Sources/MapboxDirections/Match/MBTracepoint.swift @@ -1,13 +1,10 @@ import Foundation import CoreLocation - /** A `Tracepoint` represents a location matched to the road network. */ - public class Tracepoint: Waypoint { - /** Number of probable alternative matchings for this tracepoint. A value of zero indicates that this point was matched unambiguously. */ @@ -21,7 +18,6 @@ public class Tracepoint: Waypoint { self.alternateCount = alternateCount ?? NSNotFound super.init(coordinate: coordinate, name: name) } - required public init(from decoder: Decoder) throws { let container = try decoder.container(keyedBy: CodingKeys.self) diff --git a/Sources/MapboxDirections/Match/MapMatchingResponse.swift b/Sources/MapboxDirections/Match/MapMatchingResponse.swift index 1a7f0f996..fb9a3243d 100644 --- a/Sources/MapboxDirections/Match/MapMatchingResponse.swift +++ b/Sources/MapboxDirections/Match/MapMatchingResponse.swift @@ -1,6 +1,5 @@ import Foundation - class MapMatchingResponse: Decodable { var code: String var routes : [Route]? diff --git a/Sources/MapboxDirections/Match/MatchResponse.swift b/Sources/MapboxDirections/Match/MatchResponse.swift index 1f0b40313..cf924d01d 100644 --- a/Sources/MapboxDirections/Match/MatchResponse.swift +++ b/Sources/MapboxDirections/Match/MatchResponse.swift @@ -1,6 +1,5 @@ import Foundation - class MatchResponse: Codable { var code: String var message: String? diff --git a/Sources/MapboxDirections/OfflineDirections.swift b/Sources/MapboxDirections/OfflineDirections.swift index d8378d448..19c012ec2 100644 --- a/Sources/MapboxDirections/OfflineDirections.swift +++ b/Sources/MapboxDirections/OfflineDirections.swift @@ -1,6 +1,5 @@ import Foundation - public typealias OfflineVersion = String public typealias OfflineDownloaderCompletionHandler = (_ location: URL?,_ response: URLResponse?, _ error: Error?) -> Void public typealias OfflineDownloaderProgressHandler = (_ bytesWritten: Int64, _ totalBytesWritten: Int64, _ totalBytesExpectedToWrite: Int64) -> Void @@ -10,15 +9,12 @@ struct AvailableVersionsResponse: Codable { let availableVersions: [String] } - public protocol OfflineDirectionsProtocol { - /** Fetches the available offline routing tile versions and returns them in descending chronological order. The most recent version should typically be passed into `downloadTiles(in:version:completionHandler:)`. - parameter completionHandler: A closure of type `OfflineVersionsHandler` which will be called when the request completes */ - func fetchAvailableOfflineVersions(completionHandler: @escaping OfflineVersionsHandler) -> URLSessionDataTask /** @@ -28,30 +24,32 @@ public protocol OfflineDirectionsProtocol { - parameter version: The version to download. Version is represented as a String (yyyy-MM-dd-x) - parameter completionHandler: A closure of type `OfflineDownloaderCompletionHandler` which will be called when the request completes */ - func downloadTiles(in coordinateBounds: CoordinateBounds, version: OfflineVersion, completionHandler: @escaping OfflineDownloaderCompletionHandler) -> URLSessionDownloadTask } extension Directions: OfflineDirectionsProtocol { - - /// URL to the endpoint listing available versions + /** + The URL to a list of available versions. + */ public var availableVersionsURL: URL { - let url = apiEndpoint.appendingPathComponent("route-tiles/v1").appendingPathComponent("versions") var components = URLComponents(url: url, resolvingAgainstBaseURL: true) components?.queryItems = [URLQueryItem(name: "access_token", value: accessToken)] - return components!.url! } - /// URL to the endpoint for downloading a tile pack + /** + Returns the URL to generate and download a tile pack from the Route Tiles API. + + - parameter coordinateBounds: The coordinate bounds that the tiles should cover. + - parameter version: A version obtained from `availableVersionsURL`. + - returns: The URL to generate and download the tile pack that covers the coordinate bounds. + */ public func tilesURL(for coordinateBounds: CoordinateBounds, version: OfflineVersion) -> URL { - let url = apiEndpoint.appendingPathComponent("route-tiles/v1").appendingPathComponent(coordinateBounds.description) var components = URLComponents(url: url, resolvingAgainstBaseURL: true) components?.queryItems = [URLQueryItem(name: "version", value: version), URLQueryItem(name: "access_token", value: accessToken)] - return components!.url! } diff --git a/Sources/MapboxDirections/RoadClasses.swift b/Sources/MapboxDirections/RoadClasses.swift index 97cfc7ed3..3f73ac4a2 100644 --- a/Sources/MapboxDirections/RoadClasses.swift +++ b/Sources/MapboxDirections/RoadClasses.swift @@ -1,6 +1,5 @@ import Foundation - /** Option set that contains attributes of a road segment. */ @@ -21,11 +20,9 @@ public struct RoadClasses: OptionSet, Codable, CustomStringConvertible { let descriptions = try container.decode([String].self) self = RoadClasses(descriptions: descriptions)! } - public typealias RawValue = Int - /** The road segment is [tolled](https://wiki.openstreetmap.org/wiki/Key:toll). */ @@ -59,8 +56,6 @@ public struct RoadClasses: OptionSet, Codable, CustomStringConvertible { */ public static let tunnel = RoadClasses(rawValue: 1 << 5) - - /** Creates a `RoadClasses` given an array of strings. */ diff --git a/Sources/MapboxDirections/RouteResponse.swift b/Sources/MapboxDirections/RouteResponse.swift index 9c8a9a843..4df47ab00 100644 --- a/Sources/MapboxDirections/RouteResponse.swift +++ b/Sources/MapboxDirections/RouteResponse.swift @@ -1,7 +1,6 @@ import Foundation struct RouteResponse: Codable { - enum CodingKeys: String, CodingKey { case code case message diff --git a/Tests/MapboxDirectionsTests/DirectionsTests.swift b/Tests/MapboxDirectionsTests/DirectionsTests.swift index 2596a83db..ad05b655d 100644 --- a/Tests/MapboxDirectionsTests/DirectionsTests.swift +++ b/Tests/MapboxDirectionsTests/DirectionsTests.swift @@ -53,7 +53,6 @@ class DirectionsTests: XCTestCase { let url = directions.url(forCalculating: options, httpMethod: "GET") XCTAssertLessThanOrEqual(url.absoluteString.count, MaximumURLLength, "maximumCoordinateCount is too high") - let components = URLComponents(string: url.absoluteString) XCTAssertEqual(components?.queryItems?.count, 7) XCTAssertTrue(components?.path.contains(coordinates.compactMap { $0.requestDescription }.joined(separator: ";")) ?? false) diff --git a/Tests/MapboxDirectionsTests/MatchTests.swift b/Tests/MapboxDirectionsTests/MatchTests.swift index 809bc6244..470f3c579 100644 --- a/Tests/MapboxDirectionsTests/MatchTests.swift +++ b/Tests/MapboxDirectionsTests/MatchTests.swift @@ -134,7 +134,6 @@ class MatchTests: XCTestCase { XCTAssertEqual(tracepoints.count, 7) XCTAssertEqual(tracepoints.first!, nil) - // Encode and decode the match securely. // This may raise an Objective-C exception if an error is encountered which will fail the tests. @@ -144,7 +143,6 @@ class MatchTests: XCTestCase { let decoder = JSONDecoder() decoder.userInfo[.options] = matchOptions let unarchivedMatch = try! decoder.decode(Match.self, from: encodedString.data(using: .utf8)!) - XCTAssertEqual(match.confidence, unarchivedMatch.confidence) XCTAssertEqual(match.matchOptions, unarchivedMatch.matchOptions) diff --git a/Tests/MapboxDirectionsTests/OfflineDirectionsTests.swift b/Tests/MapboxDirectionsTests/OfflineDirectionsTests.swift index da5d72c68..115b6bb38 100644 --- a/Tests/MapboxDirectionsTests/OfflineDirectionsTests.swift +++ b/Tests/MapboxDirectionsTests/OfflineDirectionsTests.swift @@ -3,9 +3,7 @@ import XCTest import OHHTTPStubs @testable import MapboxDirections - class OfflineDirectionsTests: XCTestCase { - let token = "foo" let host = "api.mapbox.com" @@ -47,7 +45,6 @@ class OfflineDirectionsTests: XCTestCase { } func testDownloadTiles() { - let directions = Directions(accessToken: token, host: host) let bounds = CoordinateBounds(coordinates: [CLLocationCoordinate2D(latitude: 37.7890, longitude: -122.4337), diff --git a/Tests/MapboxDirectionsTests/RoutableMatchTests.swift b/Tests/MapboxDirectionsTests/RoutableMatchTests.swift index 65ee24078..7f3ba4ba1 100644 --- a/Tests/MapboxDirectionsTests/RoutableMatchTests.swift +++ b/Tests/MapboxDirectionsTests/RoutableMatchTests.swift @@ -36,7 +36,6 @@ class RoutableMatchTest: XCTestCase { waypoint.separatesLegs = false } - let task = Directions(accessToken: BogusToken).calculateRoutes(matching: matchOptions) { (wpoints, routes, error) in XCTAssertNil(error, "Error: \(error!)") diff --git a/Tests/MapboxDirectionsTests/RouteOptionsTests.swift b/Tests/MapboxDirectionsTests/RouteOptionsTests.swift index a640835bb..0c53802fc 100644 --- a/Tests/MapboxDirectionsTests/RouteOptionsTests.swift +++ b/Tests/MapboxDirectionsTests/RouteOptionsTests.swift @@ -2,7 +2,6 @@ import XCTest import CoreLocation @testable import MapboxDirections - class RouteOptionsTests: XCTestCase { func testCoding() { let options = testRouteOptions @@ -11,7 +10,6 @@ class RouteOptionsTests: XCTestCase { let optionsString: String = String(data: encoded, encoding: .utf8)! let unarchivedOptions: RouteOptions = try! JSONDecoder().decode(RouteOptions.self, from: optionsString.data(using: .utf8)!) - XCTAssertNotNil(unarchivedOptions) @@ -33,12 +31,15 @@ class RouteOptionsTests: XCTestCase { XCTAssertEqual(unarchivedOptions.roadClassesToAvoid, options.roadClassesToAvoid) } + // MARK: API name-handling tests + + private static var testWaypoints: [Waypoint] { + return [ + Waypoint(coordinate: CLLocationCoordinate2D(latitude: 39.27664, longitude:-84.41139)), + Waypoint(coordinate: CLLocationCoordinate2D(latitude: 39.27277, longitude:-84.41226)), + ] + } - //MARK: API Name Handling Tests - private static var testWaypoints: [Waypoint] { return [Waypoint(coordinate: CLLocationCoordinate2D(latitude: 39.27664, longitude:-84.41139)), - Waypoint(coordinate: CLLocationCoordinate2D(latitude: 39.27277, longitude:-84.41226))]} - - private func response(for fixtureName: String, waypoints: [Waypoint] = testWaypoints) -> (waypoints:[Waypoint], route:Route)? { let testBundle = Bundle(for: type(of: self)) guard let fixtureURL = testBundle.url(forResource:fixtureName, withExtension:"json") else { XCTFail(); return nil } diff --git a/Tests/MapboxDirectionsTests/RouteStepTests.swift b/Tests/MapboxDirectionsTests/RouteStepTests.swift index 2854737ba..855b83139 100644 --- a/Tests/MapboxDirectionsTests/RouteStepTests.swift +++ b/Tests/MapboxDirectionsTests/RouteStepTests.swift @@ -106,7 +106,6 @@ class RoadTests: XCTestCase { class RouteStepTests: XCTestCase { func testCoding() { - let options = RouteOptions(coordinates: [CLLocationCoordinate2D(latitude: 0, longitude: 0), CLLocationCoordinate2D(latitude: 1, longitude: 1)]) options.shapeFormat = .polyline @@ -125,7 +124,6 @@ class RouteStepTests: XCTestCase { } } - fileprivate let routeStepJSON = """ { "intersections": [ diff --git a/Tests/MapboxDirectionsTests/WalkingOptionsTests.swift b/Tests/MapboxDirectionsTests/WalkingOptionsTests.swift index 7504bcc29..1932166d9 100644 --- a/Tests/MapboxDirectionsTests/WalkingOptionsTests.swift +++ b/Tests/MapboxDirectionsTests/WalkingOptionsTests.swift @@ -4,9 +4,7 @@ import CoreLocation @testable import MapboxDirections class WalkingOptionsTests: XCTestCase { - func testURLQueryParams() { - let waypoints = [ Waypoint(coordinate: CLLocationCoordinate2D(latitude: 0, longitude: 1)), Waypoint(coordinate: CLLocationCoordinate2D(latitude: 2, longitude: 3)) diff --git a/Tests/MapboxDirectionsTests/WaypointTests.swift b/Tests/MapboxDirectionsTests/WaypointTests.swift index aa2b6a336..f834c8ba1 100644 --- a/Tests/MapboxDirectionsTests/WaypointTests.swift +++ b/Tests/MapboxDirectionsTests/WaypointTests.swift @@ -18,9 +18,7 @@ class WaypointTests: XCTestCase { XCTAssertEqual(encodedString, pass) - let decoder = JSONDecoder() - let decodedWaypoint = try! decoder.decode(Waypoint.self, from: encodedData) From a31070118adc95c11a456fc51b12a31f9db0d0b8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Minh=20Nguye=CC=82=CC=83n?= Date: Fri, 1 Nov 2019 15:21:14 -0700 Subject: [PATCH 44/89] Removed extraneous type aliases --- Sources/MapboxDirections/AttributeOptions.swift | 8 +++----- .../MapboxDirections/DirectionsProfileIdentifier.swift | 2 -- Sources/MapboxDirections/MBLaneIndication.swift | 3 --- Sources/MapboxDirections/RoadClasses.swift | 2 -- 4 files changed, 3 insertions(+), 12 deletions(-) diff --git a/Sources/MapboxDirections/AttributeOptions.swift b/Sources/MapboxDirections/AttributeOptions.swift index 1daeefa4f..ea88efbbb 100644 --- a/Sources/MapboxDirections/AttributeOptions.swift +++ b/Sources/MapboxDirections/AttributeOptions.swift @@ -1,11 +1,9 @@ import Foundation -public struct AttributeOptions: OptionSet, CustomStringConvertible{ - public typealias RawValue = Int - +public struct AttributeOptions: OptionSet, CustomStringConvertible { public var rawValue: Int - public init(rawValue: AttributeOptions.RawValue) { + public init(rawValue: Int) { self.rawValue = rawValue } @@ -30,7 +28,7 @@ public struct AttributeOptions: OptionSet, CustomStringConvertible{ */ public static let speed = AttributeOptions(rawValue: 1 << 3) - /** + /** Traffic congestion level along the segment. When this attribute is specified, the `RouteLeg.congestionLevels` property contains one value for each segment in the leg’s full geometry. diff --git a/Sources/MapboxDirections/DirectionsProfileIdentifier.swift b/Sources/MapboxDirections/DirectionsProfileIdentifier.swift index a620c9e40..260291ea9 100644 --- a/Sources/MapboxDirections/DirectionsProfileIdentifier.swift +++ b/Sources/MapboxDirections/DirectionsProfileIdentifier.swift @@ -63,8 +63,6 @@ public struct DirectionsPriority: Hashable, RawRepresentable { public var rawValue: Double - public typealias RawValue = Double - static let low = DirectionsPriority(rawValue: -1.0) static let `default` = DirectionsPriority(rawValue: 0.0) static let high = DirectionsPriority(rawValue: 1.0) diff --git a/Sources/MapboxDirections/MBLaneIndication.swift b/Sources/MapboxDirections/MBLaneIndication.swift index 97776cae5..5ff50b20c 100644 --- a/Sources/MapboxDirections/MBLaneIndication.swift +++ b/Sources/MapboxDirections/MBLaneIndication.swift @@ -7,8 +7,6 @@ public struct LaneIndication: OptionSet, CustomStringConvertible, Codable { self.rawValue = rawValue } - public typealias RawValue = Int - /// Indicates a sharp turn to the right. public static let sharpRight = LaneIndication(rawValue: 1 << 1) @@ -33,7 +31,6 @@ public struct LaneIndication: OptionSet, CustomStringConvertible, Codable { /// Indicates a U-turn. public static let uTurn = LaneIndication(rawValue: 1 << 8) - /** Creates a lane indication from the given description strings. */ diff --git a/Sources/MapboxDirections/RoadClasses.swift b/Sources/MapboxDirections/RoadClasses.swift index 3f73ac4a2..0bb1b57fa 100644 --- a/Sources/MapboxDirections/RoadClasses.swift +++ b/Sources/MapboxDirections/RoadClasses.swift @@ -21,8 +21,6 @@ public struct RoadClasses: OptionSet, Codable, CustomStringConvertible { self = RoadClasses(descriptions: descriptions)! } - public typealias RawValue = Int - /** The road segment is [tolled](https://wiki.openstreetmap.org/wiki/Key:toll). */ From 21b5d033841ddc6ecd69ab66d9e257778d3f2861 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Minh=20Nguye=CC=82=CC=83n?= Date: Fri, 1 Nov 2019 20:24:56 -0700 Subject: [PATCH 45/89] Corrected indentation; removed extraneous newlines --- README.md | 1 - .../MapboxDirections/DirectionsProfileIdentifier.swift | 8 ++++---- Sources/MapboxDirections/MBDirections.swift | 4 ---- Sources/MapboxDirections/MBDirectionsOptions.swift | 4 +--- Sources/MapboxDirections/MBIntersection.swift | 1 - Sources/MapboxDirections/MBRouteLeg.swift | 2 +- Sources/MapboxDirections/MBRouteStep.swift | 2 +- Sources/MapboxDirections/MBVisualInstructionBanner.swift | 4 ++-- Sources/MapboxDirections/MBWaypoint.swift | 2 +- Sources/MapboxDirections/Match/MapMatchingResponse.swift | 1 - Sources/MapboxDirections/Match/MatchResponse.swift | 2 -- Sources/MapboxDirections/RouteResponse.swift | 1 - Tests/MapboxDirectionsTests/RouteOptionsTests.swift | 1 - Tests/MapboxDirectionsTests/RouteStepTests.swift | 1 - Tests/MapboxDirectionsTests/V5Tests.swift | 1 - 15 files changed, 10 insertions(+), 25 deletions(-) diff --git a/README.md b/README.md index 37b108156..5794f2304 100644 --- a/README.md +++ b/README.md @@ -182,4 +182,3 @@ To run the included unit tests, you need to use [Carthage](https://github.com/Ca 1. `carthage build --platform iOS` 1. `open MapboxDirections.xcodeproj` 1. Go to Product ‣ Test. - diff --git a/Sources/MapboxDirections/DirectionsProfileIdentifier.swift b/Sources/MapboxDirections/DirectionsProfileIdentifier.swift index 260291ea9..266077662 100644 --- a/Sources/MapboxDirections/DirectionsProfileIdentifier.swift +++ b/Sources/MapboxDirections/DirectionsProfileIdentifier.swift @@ -11,10 +11,10 @@ This profile prioritizes fast routes by preferring high-speed roads like highway public struct DirectionsProfileIdentifier: Codable, Hashable, RawRepresentable, ExpressibleByStringLiteral { public typealias StringLiteralType = String public typealias RawValue = String - - public init(stringLiteral value: StringLiteralType) { - self.init(rawValue: value) - } + + public init(stringLiteral value: StringLiteralType) { + self.init(rawValue: value) + } public init(rawValue: String) { self.rawValue = rawValue diff --git a/Sources/MapboxDirections/MBDirections.swift b/Sources/MapboxDirections/MBDirections.swift index df2acc99a..9b4c89906 100644 --- a/Sources/MapboxDirections/MBDirections.swift +++ b/Sources/MapboxDirections/MBDirections.swift @@ -126,7 +126,6 @@ open class Directions: NSObject { } else { apiEndpoint = URL(string:(defaultApiEndPointURLString ?? "https://api.mapbox.com"))! } - } /** @@ -263,10 +262,7 @@ open class Directions: NSObject { completionHandler(nil, .unknown(response: response, underlying: error, code: nil, message: nil)) } } - - } - } requestTask.priority = 1 requestTask.resume() diff --git a/Sources/MapboxDirections/MBDirectionsOptions.swift b/Sources/MapboxDirections/MBDirectionsOptions.swift index c8817c46e..8cf173195 100644 --- a/Sources/MapboxDirections/MBDirectionsOptions.swift +++ b/Sources/MapboxDirections/MBDirectionsOptions.swift @@ -356,9 +356,7 @@ open class DirectionsOptions: Codable, Equatable { guard waypointIndices.count < waypoints.count else { return nil } - let indicesString = waypointIndices.map(String.init(describing:)).joined(separator: ";") - return indicesString - + return waypointIndices.map(String.init(describing:)).joined(separator: ";") } private var waypointNames: String? { diff --git a/Sources/MapboxDirections/MBIntersection.swift b/Sources/MapboxDirections/MBIntersection.swift index f8c3402a2..ee655d162 100644 --- a/Sources/MapboxDirections/MBIntersection.swift +++ b/Sources/MapboxDirections/MBIntersection.swift @@ -136,5 +136,4 @@ public struct Intersection: Codable, Equatable { lhs.usableApproachLanes == rhs.usableApproachLanes && lhs.outletRoadClasses == rhs.outletRoadClasses } - } diff --git a/Sources/MapboxDirections/MBRouteLeg.swift b/Sources/MapboxDirections/MBRouteLeg.swift index 77ff2883f..2e0f2cfdd 100644 --- a/Sources/MapboxDirections/MBRouteLeg.swift +++ b/Sources/MapboxDirections/MBRouteLeg.swift @@ -44,6 +44,7 @@ open class RouteLeg: Codable, Equatable { segmentSpeeds = try annotation?.decodeIfPresent([CLLocationSpeed].self, forKey: .segmentSpeeds) segmentCongestionLevels = try annotation?.decodeIfPresent([CongestionLevel].self, forKey: .segmentCongestionLevels) } + public func encode(to encoder: Encoder) throws { var container = encoder.container(keyedBy: CodingKeys.self) try container.encode(source, forKey: .source) @@ -59,7 +60,6 @@ open class RouteLeg: Codable, Equatable { try annotation.encode(expectedSegmentTravelTimes, forKey: .expectedSegmentTravelTimes) try annotation.encode(segmentSpeeds, forKey: .segmentSpeeds) try annotation.encode(segmentCongestionLevels, forKey: .segmentCongestionLevels) - } // MARK: Getting the Leg Geometry diff --git a/Sources/MapboxDirections/MBRouteStep.swift b/Sources/MapboxDirections/MBRouteStep.swift index cc96b34c3..08f58b68a 100644 --- a/Sources/MapboxDirections/MBRouteStep.swift +++ b/Sources/MapboxDirections/MBRouteStep.swift @@ -165,7 +165,7 @@ public enum ManeuverType: String, Codable { The step’s name is the name of the roundabout. The exit name is the name of the road to take to exit the roundabout. The exit index indicates the number of rotary exits up to and including the exit that the user must take. - If `RouteOptions.includesExitRoundaboutManeuver` is set to `true`, this step is followed by an `.exitRotary` maneuver. Otherwise, this step represents the entire roundabout maneuver, from the entrance to the exit. + If `RouteOptions.includesExitRoundaboutManeuver` is set to `true`, this step is followed by an `.exitRotary` maneuver. Otherwise, this step represents the entire roundabout maneuver, from the entrance to the exit. */ case takeRotary = "rotary" diff --git a/Sources/MapboxDirections/MBVisualInstructionBanner.swift b/Sources/MapboxDirections/MBVisualInstructionBanner.swift index ba0f99d32..f17e8402f 100644 --- a/Sources/MapboxDirections/MBVisualInstructionBanner.swift +++ b/Sources/MapboxDirections/MBVisualInstructionBanner.swift @@ -2,8 +2,8 @@ import Foundation import CoreLocation internal extension CodingUserInfoKey { - static let drivingSide = CodingUserInfoKey(rawValue: "drivingSide")! - } + static let drivingSide = CodingUserInfoKey(rawValue: "drivingSide")! +} /** A visual instruction banner contains all the information necessary for creating a visual cue about a given `RouteStep`. diff --git a/Sources/MapboxDirections/MBWaypoint.swift b/Sources/MapboxDirections/MBWaypoint.swift index cb6a2aa74..cdc52fe81 100644 --- a/Sources/MapboxDirections/MBWaypoint.swift +++ b/Sources/MapboxDirections/MBWaypoint.swift @@ -186,7 +186,7 @@ public class Waypoint: Codable { This property has no effect if `DirectionsOptions.includesSteps` is set to `false`, or if `MatchOptions.waypointIndices` is non-nil. This property corresponds to the [`approaches`](https://docs.mapbox.com/api/navigation/#retrieve-directions) query parameter in the Mapbox Directions and Map Matching APIs. */ - public var separatesLegs: Bool = true + public var separatesLegs: Bool = true public var description: String { return name ?? "" diff --git a/Sources/MapboxDirections/Match/MapMatchingResponse.swift b/Sources/MapboxDirections/Match/MapMatchingResponse.swift index fb9a3243d..b3ec3559e 100644 --- a/Sources/MapboxDirections/Match/MapMatchingResponse.swift +++ b/Sources/MapboxDirections/Match/MapMatchingResponse.swift @@ -30,5 +30,4 @@ class MapMatchingResponse: Decodable { routes = try container.decodeIfPresent([Route].self, forKey: .matches) } - } diff --git a/Sources/MapboxDirections/Match/MatchResponse.swift b/Sources/MapboxDirections/Match/MatchResponse.swift index cf924d01d..328186d59 100644 --- a/Sources/MapboxDirections/Match/MatchResponse.swift +++ b/Sources/MapboxDirections/Match/MatchResponse.swift @@ -25,7 +25,5 @@ class MatchResponse: Codable { $0.tracepoints = points } } - } } - diff --git a/Sources/MapboxDirections/RouteResponse.swift b/Sources/MapboxDirections/RouteResponse.swift index 4df47ab00..26a2a4204 100644 --- a/Sources/MapboxDirections/RouteResponse.swift +++ b/Sources/MapboxDirections/RouteResponse.swift @@ -60,6 +60,5 @@ struct RouteResponse: Codable { }) self.routes = routesWithIdentifiers - } } diff --git a/Tests/MapboxDirectionsTests/RouteOptionsTests.swift b/Tests/MapboxDirectionsTests/RouteOptionsTests.swift index 0c53802fc..6e545b507 100644 --- a/Tests/MapboxDirectionsTests/RouteOptionsTests.swift +++ b/Tests/MapboxDirectionsTests/RouteOptionsTests.swift @@ -112,7 +112,6 @@ class RouteOptionsTests: XCTestCase { let answer = [start.requestDescription, end.requestDescription] let correct = ["53.032188,9.945497", "54.032188,10.945497"] XCTAssert(answer == correct, "Coordinates should be truncated.") - } func testWaypointSerialization() { diff --git a/Tests/MapboxDirectionsTests/RouteStepTests.swift b/Tests/MapboxDirectionsTests/RouteStepTests.swift index 855b83139..afb3caebf 100644 --- a/Tests/MapboxDirectionsTests/RouteStepTests.swift +++ b/Tests/MapboxDirectionsTests/RouteStepTests.swift @@ -11,7 +11,6 @@ class RoadTests: XCTestCase { XCTAssertNil(r.destinations) XCTAssertNil(r.destinationCodes) XCTAssertNil(r.rotaryNames) - } func testNamesCodes() { diff --git a/Tests/MapboxDirectionsTests/V5Tests.swift b/Tests/MapboxDirectionsTests/V5Tests.swift index 4e63740dc..57772fda7 100644 --- a/Tests/MapboxDirectionsTests/V5Tests.swift +++ b/Tests/MapboxDirectionsTests/V5Tests.swift @@ -308,7 +308,6 @@ class V5Tests: XCTestCase { let newRoute = try! decoder.decode(Route.self, from: jsonData) test(newRoute, options: options) - } } #endif From a6158771ab09f854eade2041e09eabf9a05b5049 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Minh=20Nguye=CC=82=CC=83n?= Date: Fri, 1 Nov 2019 20:59:57 -0700 Subject: [PATCH 46/89] Removed InstructionFormat Only Directions API v4 supported HTML responses. --- Sources/MapboxDirections/MBRouteOptions.swift | 18 ------------------ 1 file changed, 18 deletions(-) diff --git a/Sources/MapboxDirections/MBRouteOptions.swift b/Sources/MapboxDirections/MBRouteOptions.swift index 721d1d3b8..2e4022f5f 100644 --- a/Sources/MapboxDirections/MBRouteOptions.swift +++ b/Sources/MapboxDirections/MBRouteOptions.swift @@ -192,24 +192,6 @@ open class RouteOptions: DirectionsOptions { } } -// MARK: Support for Directions API v4 - -/** - A `RouteShapeFormat` indicates the format of a route’s shape in the raw HTTP response. - */ -public enum InstructionFormat: String { - /** - The route steps’ instructions are delivered in plain text format. - */ - case text - /** - The route steps’ instructions are delivered in HTML format. - - Key phrases are boldfaced. - */ - case html -} - extension CLLocationSpeed { /** By default, pedestrians are assumed to walk at an average rate of 1.42 meters per second (5.11 kilometers per hour or 3.18 miles per hour), corresponding to a typical preferred walking speed. From d9a1f410642334b72971aa5271f4bb3560640660 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Minh=20Nguye=CC=82=CC=83n?= Date: Fri, 1 Nov 2019 23:57:59 -0700 Subject: [PATCH 47/89] Cleaned up marks; moved Codable, Equatable to extensions --- .../MapboxDirections/DirectionsError.swift | 6 +- .../MapboxDirections/Extensions/Codable.swift | 6 +- Sources/MapboxDirections/MBCongestion.swift | 2 +- .../MapboxDirections/MBCoordinateBounds.swift | 32 ++- Sources/MapboxDirections/MBDirections.swift | 2 + .../MBDirectionsOptions.swift | 21 +- .../MapboxDirections/MBDirectionsResult.swift | 30 ++- Sources/MapboxDirections/MBIntersection.swift | 72 +++--- Sources/MapboxDirections/MBLane.swift | 6 +- .../MapboxDirections/MBLaneIndication.swift | 24 +- Sources/MapboxDirections/MBRouteLeg.swift | 24 +- Sources/MapboxDirections/MBRouteOptions.swift | 46 ++-- Sources/MapboxDirections/MBRouteStep.swift | 113 +++++---- .../MBSpokenInstruction.swift | 49 ++-- .../MBVisualInstruction.swift | 87 ++++--- .../MBVisualInstructionBanner.swift | 20 +- .../MBVisualInstructionComponent.swift | 238 +++++++++--------- Sources/MapboxDirections/MBWaypoint.swift | 9 +- .../Match/MBMatchOptions.swift | 10 +- Sources/MapboxDirections/RoadClasses.swift | 26 +- Sources/MapboxDirections/RouteResponse.swift | 22 +- 21 files changed, 475 insertions(+), 370 deletions(-) diff --git a/Sources/MapboxDirections/DirectionsError.swift b/Sources/MapboxDirections/DirectionsError.swift index 6a051d875..94f974e67 100644 --- a/Sources/MapboxDirections/DirectionsError.swift +++ b/Sources/MapboxDirections/DirectionsError.swift @@ -1,6 +1,6 @@ import Foundation -public enum DirectionsError: LocalizedError, Equatable { +public enum DirectionsError: LocalizedError { case noData case invalidInput(message: String?) case invalidResponse @@ -75,7 +75,9 @@ public enum DirectionsError: LocalizedError, Equatable { return (error as NSError?)?.userInfo[NSLocalizedRecoverySuggestionErrorKey] as? String } } - +} + +extension DirectionsError: Equatable { public static func == (lhs: DirectionsError, rhs: DirectionsError) -> Bool { switch (lhs, rhs) { case (.noData, .noData), diff --git a/Sources/MapboxDirections/Extensions/Codable.swift b/Sources/MapboxDirections/Extensions/Codable.swift index 1bc513f6d..8801213fb 100644 --- a/Sources/MapboxDirections/Extensions/Codable.swift +++ b/Sources/MapboxDirections/Extensions/Codable.swift @@ -2,7 +2,7 @@ import Foundation import Polyline import struct Turf.LineString -enum PolyLineString: Codable { +enum PolyLineString { case lineString(_ lineString: LineString) case polyline(_ encodedPolyline: String, precision: Double) @@ -16,7 +16,9 @@ enum PolyLineString: Codable { self = .polyline(encodedPolyline, precision: precision) } } - +} + +extension PolyLineString: Codable { init(from decoder: Decoder) throws { let container = try decoder.singleValueContainer() let options = decoder.userInfo[.options] as? DirectionsOptions diff --git a/Sources/MapboxDirections/MBCongestion.swift b/Sources/MapboxDirections/MBCongestion.swift index e5fe79bb4..d88a54331 100644 --- a/Sources/MapboxDirections/MBCongestion.swift +++ b/Sources/MapboxDirections/MBCongestion.swift @@ -3,7 +3,7 @@ import Foundation /** A `CongestionLevel` indicates the level of traffic congestion along a road segment relative to the normal flow of traffic along that segment. You can color-code a route line according to the congestion level along each segment of the route. */ -public enum CongestionLevel: String, Codable{ +public enum CongestionLevel: String, Codable { /** There is not enough data to determine the level of congestion along the road segment. */ diff --git a/Sources/MapboxDirections/MBCoordinateBounds.swift b/Sources/MapboxDirections/MBCoordinateBounds.swift index a3b90fcfa..1142b3f0a 100644 --- a/Sources/MapboxDirections/MBCoordinateBounds.swift +++ b/Sources/MapboxDirections/MBCoordinateBounds.swift @@ -2,25 +2,19 @@ import Foundation import CoreLocation /** - A bounding box represents a geographic region. + A bounding box represents a geographic region that is rectangular in the Spherical Mercator projection. */ -public struct CoordinateBounds: Codable { +public struct CoordinateBounds { + /// The southwest corner. let southWest: CLLocationCoordinate2D - let northEast: CLLocationCoordinate2D - enum CodingKeys: String, CodingKey { - case southWest, northEast - } + /// The northeast corner. + let northEast: CLLocationCoordinate2D - public init(from decoder: Decoder) throws { - let container = try decoder.container(keyedBy: CodingKeys.self) - southWest = try container.decode(CLLocationCoordinate2D.self, forKey: .southWest) - northEast = try container.decode(CLLocationCoordinate2D.self, forKey: .northEast) - } /** Initializes a `BoundingBox` with known bounds. */ - public init(southWest: CLLocationCoordinate2D, northEast: CLLocationCoordinate2D) { + public init(southWest: CLLocationCoordinate2D, northEast: CLLocationCoordinate2D) { self.southWest = southWest self.northEast = northEast } @@ -28,7 +22,7 @@ public struct CoordinateBounds: Codable { /** Initializes a `BoundingBox` with known bounds. */ - public init(northWest: CLLocationCoordinate2D, southEast: CLLocationCoordinate2D) { + public init(northWest: CLLocationCoordinate2D, southEast: CLLocationCoordinate2D) { self.southWest = CLLocationCoordinate2D(latitude: southEast.latitude, longitude: northWest.longitude) self.northEast = CLLocationCoordinate2D(latitude: northWest.latitude, longitude: southEast.longitude) } @@ -61,3 +55,15 @@ public struct CoordinateBounds: Codable { return "\(southWest.longitude),\(southWest.latitude);\(northEast.longitude),\(northEast.latitude)" } } + +extension CoordinateBounds: Codable { + enum CodingKeys: String, CodingKey { + case southWest, northEast + } + + public init(from decoder: Decoder) throws { + let container = try decoder.container(keyedBy: CodingKeys.self) + southWest = try container.decode(CLLocationCoordinate2D.self, forKey: .southWest) + northEast = try container.decode(CLLocationCoordinate2D.self, forKey: .northEast) + } +} diff --git a/Sources/MapboxDirections/MBDirections.swift b/Sources/MapboxDirections/MBDirections.swift index 9b4c89906..e64c15525 100644 --- a/Sources/MapboxDirections/MBDirections.swift +++ b/Sources/MapboxDirections/MBDirections.swift @@ -397,6 +397,8 @@ open class Directions: NSObject { return request } + // MARK: Postprocessing Responses + /** Returns an error that supplements the given underlying error with additional information from the an HTTP response’s body or headers. */ diff --git a/Sources/MapboxDirections/MBDirectionsOptions.swift b/Sources/MapboxDirections/MBDirectionsOptions.swift index 8cf173195..56e33b6a9 100644 --- a/Sources/MapboxDirections/MBDirectionsOptions.swift +++ b/Sources/MapboxDirections/MBDirectionsOptions.swift @@ -82,7 +82,9 @@ public enum MeasurementSystem: String, Codable { You do not create instances of this class directly. Instead, create instances of `MatchOptions` or `RouteOptions`. */ -open class DirectionsOptions: Codable, Equatable { +open class DirectionsOptions: Codable { + // MARK: Creating a Directions Options Object + /** Initializes an options object for routes between the given waypoints and an optional profile identifier. @@ -141,6 +143,8 @@ open class DirectionsOptions: Codable, Equatable { includesVisualInstructions = try container.decode(Bool.self, forKey: .includesVisualInstructions) } + // MARK: Specifying the Path of the Route + /** An array of `Waypoint` objects representing locations that the route should visit in chronological order. @@ -159,7 +163,9 @@ open class DirectionsOptions: Codable, Equatable { let destination = waypoints.removeLast() return [source] + waypoints.filter { $0.separatesLegs } + [destination] } - + + // MARK: Specifying the Mode of Transportation + /** A string specifying the primary mode of transportation for the routes. @@ -167,6 +173,8 @@ open class DirectionsOptions: Codable, Equatable { */ open var profileIdentifier: DirectionsProfileIdentifier + // MARK: Specifying the Response Format + /** A Boolean value indicating whether `RouteStep` objects should be included in the response. @@ -241,7 +249,7 @@ open class DirectionsOptions: Codable, Equatable { */ open var includesVisualInstructions = false - // MARK: - URL Queries + // MARK: Getting the Request URL /** An array of URL query items to include in an HTTP request. @@ -378,8 +386,9 @@ open class DirectionsOptions: Codable, Equatable { ] return components.percentEncodedQuery ?? "" } - - //MARK: - Equatable +} + +extension DirectionsOptions: Equatable { public static func == (lhs: DirectionsOptions, rhs: DirectionsOptions) -> Bool { return lhs.waypoints == rhs.waypoints && lhs.profileIdentifier == rhs.profileIdentifier && @@ -387,7 +396,7 @@ open class DirectionsOptions: Codable, Equatable { lhs.shapeFormat == rhs.shapeFormat && lhs.routeShapeResolution == rhs.routeShapeResolution && lhs.attributeOptions == rhs.attributeOptions && - lhs.locale.identifier == rhs.locale.identifier && + lhs.locale.identifier == rhs.locale.identifier && lhs.includesSpokenInstructions == rhs.includesSpokenInstructions && lhs.distanceMeasurementSystem == rhs.distanceMeasurementSystem && lhs.includesVisualInstructions == rhs.includesVisualInstructions diff --git a/Sources/MapboxDirections/MBDirectionsResult.swift b/Sources/MapboxDirections/MBDirectionsResult.swift index c71520173..a2d81b3dc 100644 --- a/Sources/MapboxDirections/MBDirectionsResult.swift +++ b/Sources/MapboxDirections/MBDirectionsResult.swift @@ -21,6 +21,8 @@ open class DirectionsResult: Codable { case speechLocale = "voiceLocale" } + // MARK: Creating a Directions Result + public required init(from decoder: Decoder) throws { let container = try decoder.container(keyedBy: CodingKeys.self) legs = try container.decode([RouteLeg].self, forKey: .legs) @@ -75,15 +77,19 @@ open class DirectionsResult: Codable { try container.encodeIfPresent(speechLocale, forKey: .speechLocale) } + // MARK: Getting the Shape of the Route + /** An array of geographic coordinates defining the path of the route from start to finish. - This array may be `nil` or simplified depending on the `routeShapeResolution` property of the original `RouteOptions` object. + This array may be `nil` or simplified depending on the `DirectionsOptions.routeShapeResolution` property of the original `RouteOptions` or `MatchOptions` object. Using the [Mapbox Maps SDK for iOS](https://docs.mapbox.com/ios/maps/) or [Mapbox Maps SDK for macOS](https://mapbox.github.io/mapbox-gl-native/macos/), you can create an `MGLPolyline` object using these coordinates to display an overview of the route on an `MGLMapView`. */ public let shape: LineString? + // MARK: Getting the Legs Along the Route + /** An array of `RouteLeg` objects representing the legs of the route. @@ -93,7 +99,7 @@ open class DirectionsResult: Codable { */ public let legs: [RouteLeg] - // MARK: Getting Additional Route Details + // MARK: Getting Statistics About the Route /** The route’s distance, measured in meters. @@ -111,6 +117,17 @@ open class DirectionsResult: Codable { */ public let expectedTravelTime: TimeInterval + // MARK: Configuring Speech Synthesis + + /** + The locale to use for spoken instructions. + + This locale is specific to Mapbox Voice API. If `nil` is returned, the instruction should be spoken with an alternative speech synthesizer. + */ + open var speechLocale: Locale? + + // MARK: Reproducing the Route + /** `RouteOptions` used to create the directions request. @@ -136,6 +153,8 @@ open class DirectionsResult: Codable { */ open var apiEndpoint: URL? + // MARK: Auditing the Server Response + /** A unique identifier for a directions request. @@ -143,13 +162,6 @@ open class DirectionsResult: Codable { */ open var routeIdentifier: String? - /** - The locale to use for spoken instructions. - - This locale is specific to Mapbox Voice API. If `nil` is returned, the instruction should be spoken with an alternative speech synthesizer. - */ - open var speechLocale: Locale? - /** The time immediately before a `Directions` object fetched this result. diff --git a/Sources/MapboxDirections/MBIntersection.swift b/Sources/MapboxDirections/MBIntersection.swift index ee655d162..e5d369dfe 100644 --- a/Sources/MapboxDirections/MBIntersection.swift +++ b/Sources/MapboxDirections/MBIntersection.swift @@ -4,12 +4,36 @@ import CoreLocation /** A single cross street along a step. */ -public struct Intersection: Codable, Equatable { +public struct Intersection { + // MARK: Creating an Intersection + + public init(location: CLLocationCoordinate2D, + headings: [CLLocationDirection], + approachIndex: Int, + outletIndex: Int, + outletIndexes: IndexSet, + approachLanes: [Lane]?, + usableApproachLanes: IndexSet?, + outletRoadClasses: RoadClasses?) { + self.location = location + self.headings = headings + self.approachIndex = approachIndex + self.approachLanes = approachLanes + self.outletIndex = outletIndex + self.outletIndexes = outletIndexes + self.usableApproachLanes = usableApproachLanes + self.outletRoadClasses = outletRoadClasses + } + + // MARK: Getting the Location of the Intersection + /** The geographic coordinates at the center of the intersection. */ public let location: CLLocationCoordinate2D + // MARK: Getting the Roads that Meet at the Intersection + /** An array of `CLLocationDirection`s indicating the absolute headings of the roads that meet at the intersection. @@ -26,6 +50,8 @@ public struct Intersection: Codable, Equatable { */ public let outletIndexes: IndexSet + // MARK: Getting the Roads That Take the Route Through the Intersection + /** The index of the item in the `headings` array that corresponds to the road that the containing route step uses to approach the intersection. */ @@ -36,6 +62,15 @@ public struct Intersection: Codable, Equatable { */ public let outletIndex: Int + /** + The road classes of the road that the containing step uses to leave the intersection. + + If road class information is unavailable, this property is set to `nil`. + */ + public let outletRoadClasses: RoadClasses? + + // MARK: Telling the User Which Lanes to Use + /** An array of `Lane` objects representing all the lanes of the road that the containing route step uses to approach the intersection. @@ -49,14 +84,9 @@ public struct Intersection: Codable, Equatable { If no lane information is available for an intersection, this property’s value is `nil`. */ public let usableApproachLanes: IndexSet? - - /** - The road classes of the road that the containing step uses to leave the intersection. - - If road class information is unavailable, this property is set to `nil`. - */ - public let outletRoadClasses: RoadClasses? - +} + +extension Intersection: Codable { private enum CodingKeys: String, CodingKey { case outletIndexes = "entry" case headings = "bearings" @@ -67,24 +97,6 @@ public struct Intersection: Codable, Equatable { case outletRoadClasses = "classes" } - public init(location: CLLocationCoordinate2D, - headings: [CLLocationDirection], - approachIndex: Int, - outletIndex: Int, - outletIndexes: IndexSet, - approachLanes: [Lane]?, - usableApproachLanes: IndexSet?, - outletRoadClasses: RoadClasses?) { - self.location = location - self.headings = headings - self.approachIndex = approachIndex - self.approachLanes = approachLanes - self.outletIndex = outletIndex - self.outletIndexes = outletIndexes - self.usableApproachLanes = usableApproachLanes - self.outletRoadClasses = outletRoadClasses - } - public func encode(to encoder: Encoder) throws { var container = encoder.container(keyedBy: CodingKeys.self) try container.encode(location, forKey: .location) @@ -123,9 +135,9 @@ public struct Intersection: Codable, Equatable { outletIndex = try container.decodeIfPresent(Int.self, forKey: .outletIndex) ?? -1 approachIndex = try container.decodeIfPresent(Int.self, forKey: .approachIndex) ?? -1 } - - //MARK: - Equatable - +} + +extension Intersection: Equatable { public static func == (lhs: Intersection, rhs: Intersection) -> Bool { return lhs.location == rhs.location && lhs.headings == rhs.headings && diff --git a/Sources/MapboxDirections/MBLane.swift b/Sources/MapboxDirections/MBLane.swift index 469711b5c..1c28dd1ee 100644 --- a/Sources/MapboxDirections/MBLane.swift +++ b/Sources/MapboxDirections/MBLane.swift @@ -3,7 +3,7 @@ import Foundation /** A lane on the road approaching an intersection. */ -public struct Lane: Codable, Equatable { +public struct Lane: Equatable { /** The lane indications specifying the maneuvers that may be executed from the lane. */ @@ -15,7 +15,9 @@ public struct Lane: Codable, Equatable { self.indications = indications self.isValid = valid } - +} + +extension Lane: Codable { private enum CodingKeys: String, CodingKey { case indications case valid diff --git a/Sources/MapboxDirections/MBLaneIndication.swift b/Sources/MapboxDirections/MBLaneIndication.swift index 5ff50b20c..a270e8c9d 100644 --- a/Sources/MapboxDirections/MBLaneIndication.swift +++ b/Sources/MapboxDirections/MBLaneIndication.swift @@ -1,6 +1,6 @@ import Foundation -public struct LaneIndication: OptionSet, CustomStringConvertible, Codable { +public struct LaneIndication: OptionSet, CustomStringConvertible { public var rawValue: Int public init(rawValue: Int) { @@ -100,22 +100,24 @@ public struct LaneIndication: OptionSet, CustomStringConvertible, Codable { return descriptions.joined(separator: ",") } + static func indications(from strings: [String], container: SingleValueDecodingContainer) throws -> LaneIndication { + guard let indications = self.init(descriptions: strings) else { + throw DecodingError.dataCorruptedError(in: container, debugDescription: "Unable to initialize lane indications from decoded string. This should not happen.") + } + return indications + } +} + +extension LaneIndication: Codable { public init(from decoder: Decoder) throws { - let container = try decoder.singleValueContainer() - let stringValues = try container.decode([String].self) + let container = try decoder.singleValueContainer() + let stringValues = try container.decode([String].self) - self = try LaneIndication.indications(from: stringValues, container: container) + self = try LaneIndication.indications(from: stringValues, container: container) } public func encode(to encoder: Encoder) throws { var container = encoder.singleValueContainer() try container.encode(descriptions) } - - static func indications(from strings: [String], container: SingleValueDecodingContainer) throws -> LaneIndication { - guard let indications = self.init(descriptions: strings) else { - throw DecodingError.dataCorruptedError(in: container, debugDescription: "Unable to initialize lane indications from decoded string. This should not happen.") - } - return indications - } } diff --git a/Sources/MapboxDirections/MBRouteLeg.swift b/Sources/MapboxDirections/MBRouteLeg.swift index 2e0f2cfdd..fe96ebcdc 100644 --- a/Sources/MapboxDirections/MBRouteLeg.swift +++ b/Sources/MapboxDirections/MBRouteLeg.swift @@ -7,7 +7,7 @@ import Polyline You do not create instances of this class directly. Instead, you receive route leg objects as part of route objects when you request directions using the `Directions.calculate(_:completionHandler:)` method. */ -open class RouteLeg: Codable, Equatable { +open class RouteLeg: Codable { public enum CodingKeys: String, CodingKey { case source case destination @@ -26,6 +26,8 @@ open class RouteLeg: Codable, Equatable { case segmentCongestionLevels = "congestion" } + // MARK: Creating a Leg + public required init(from decoder: Decoder) throws { let container = try decoder.container(keyedBy: CodingKeys.self) let options = decoder.userInfo[.options] as? DirectionsOptions @@ -62,7 +64,7 @@ open class RouteLeg: Codable, Equatable { try annotation.encode(segmentCongestionLevels, forKey: .segmentCongestionLevels) } - // MARK: Getting the Leg Geometry + // MARK: Getting the Endpoints of the Leg /** The starting point of the route leg. @@ -77,7 +79,9 @@ open class RouteLeg: Codable, Equatable { Unless this is the last leg of the route, the destination of this leg is the same as the source of the next leg. */ public var destination: Waypoint? - + + // MARK: Getting the Steps Along the Leg + /** An array of one or more `RouteStep` objects representing the steps for traversing this leg of the route. @@ -87,6 +91,8 @@ open class RouteLeg: Codable, Equatable { */ public let steps: [RouteStep] + // MARK: Getting Per-Segment Attributes Along the Leg + /** An array containing the distance (measured in meters) between each coordinate in the route leg geometry. @@ -123,7 +129,7 @@ open class RouteLeg: Codable, Equatable { */ public let segmentCongestionLevels: [CongestionLevel]? - // MARK: Getting Additional Leg Details + // MARK: Getting Statistics About the Leg /** A name that describes the route leg. @@ -149,16 +155,18 @@ open class RouteLeg: Codable, Equatable { Do not assume that the user would travel along the leg at a fixed speed. For the expected travel time on each individual segment along the leg, use the `RouteStep.expectedTravelTimes` property. For more granularity, specify the `AttributeOptions.expectedTravelTime` option and use the `expectedSegmentTravelTimes` property. */ public let expectedTravelTime: TimeInterval - + + // MARK: Reproducing the Route + /** A string specifying the primary mode of transportation for the route leg. The value of this property depends on the `RouteOptions.profileIdentifier` property of the original `RouteOptions` object. This property reflects the primary mode of transportation used for the route leg. Individual steps along the route leg might use different modes of transportation as necessary. */ public let profileIdentifier: DirectionsProfileIdentifier - - // MARK: - Equatable Conformance - +} + +extension RouteLeg: Equatable { public static func == (lhs: RouteLeg, rhs: RouteLeg) -> Bool { return lhs.source == rhs.source && lhs.destination == rhs.destination && diff --git a/Sources/MapboxDirections/MBRouteOptions.swift b/Sources/MapboxDirections/MBRouteOptions.swift index 2e4022f5f..9851eba35 100644 --- a/Sources/MapboxDirections/MBRouteOptions.swift +++ b/Sources/MapboxDirections/MBRouteOptions.swift @@ -83,12 +83,12 @@ open class RouteOptions: DirectionsOptions { self.includesVisualInstructions = matchOptions.includesVisualInstructions } - // MARK: Specifying the Path of the Route - internal override var abridgedPath: String { return "directions/v5/\(profileIdentifier.rawValue)" } + // MARK: Influencing the Path of the Route + /** A Boolean value that indicates whether a returned route may require a point U-turn at an intermediate waypoint. @@ -100,26 +100,6 @@ open class RouteOptions: DirectionsOptions { */ open var allowsUTurnAtWaypoint: Bool - // MARK: Specifying the Response Format - - /** - A Boolean value indicating whether alternative routes should be included in the response. - - If the value of this property is `false`, the server only calculates a single route that visits each of the waypoints. If the value of this property is `true`, the server attempts to find additional reasonable routes that visit the waypoints. Regardless, multiple routes are only returned if it is possible to visit the waypoints by a different route without significantly increasing the distance or travel time. The alternative routes may partially overlap with the preferred route, especially if intermediate waypoints are specified. - - Alternative routes may take longer to calculate and make the response significantly larger, so only request alternative routes if you intend to display them to the user or let the user choose them over the preferred route. For example, do not request alternative routes if you only want to know the distance or estimated travel time to a destination. - - The default value of this property is `false`. - */ - open var includesAlternativeRoutes = false - - /** - A Boolean value indicating whether the route includes a `ManeuverType.exitRoundabout` or `ManeuverType.exitRotary` step when traversing a roundabout or rotary, respectively. - - If this option is set to `true`, a route that traverses a roundabout includes both a `ManeuverType.takeRoundabout` step and a `ManeuverType.exitRoundabout` step; likewise, a route that traverses a large, named roundabout includes both a `ManeuverType.takeRotary` step and a `ManeuverType.exitRotary` step. Otherwise, it only includes a `ManeuverType.takeRoundabout` or `ManeuverType.takeRotary` step. This option is set to `false` by default. - */ - open var includesExitRoundaboutManeuver = false - /** The route classes that the calculated routes will avoid. @@ -154,6 +134,28 @@ open class RouteOptions: DirectionsOptions { */ open var speed: CLLocationSpeed = .normalWalking + // MARK: Specifying the Response Format + + /** + A Boolean value indicating whether alternative routes should be included in the response. + + If the value of this property is `false`, the server only calculates a single route that visits each of the waypoints. If the value of this property is `true`, the server attempts to find additional reasonable routes that visit the waypoints. Regardless, multiple routes are only returned if it is possible to visit the waypoints by a different route without significantly increasing the distance or travel time. The alternative routes may partially overlap with the preferred route, especially if intermediate waypoints are specified. + + Alternative routes may take longer to calculate and make the response significantly larger, so only request alternative routes if you intend to display them to the user or let the user choose them over the preferred route. For example, do not request alternative routes if you only want to know the distance or estimated travel time to a destination. + + The default value of this property is `false`. + */ + open var includesAlternativeRoutes = false + + /** + A Boolean value indicating whether the route includes a `ManeuverType.exitRoundabout` or `ManeuverType.exitRotary` step when traversing a roundabout or rotary, respectively. + + If this option is set to `true`, a route that traverses a roundabout includes both a `ManeuverType.takeRoundabout` step and a `ManeuverType.exitRoundabout` step; likewise, a route that traverses a large, named roundabout includes both a `ManeuverType.takeRotary` step and a `ManeuverType.exitRotary` step. Otherwise, it only includes a `ManeuverType.takeRoundabout` or `ManeuverType.takeRotary` step. This option is set to `false` by default. + */ + open var includesExitRoundaboutManeuver = false + + // MARK: Getting the Request URL + /** An array of URL parameters to include in the request URL. */ diff --git a/Sources/MapboxDirections/MBRouteStep.swift b/Sources/MapboxDirections/MBRouteStep.swift index 08f58b68a..7b1714ea4 100644 --- a/Sources/MapboxDirections/MBRouteStep.swift +++ b/Sources/MapboxDirections/MBRouteStep.swift @@ -324,7 +324,7 @@ struct Road { You do not create instances of this class directly. Instead, you receive route step objects as part of route objects when you request directions using the `Directions.calculate(_:completionHandler:)` method, setting the `includesSteps` option to `true` in the `RouteOptions` object that you pass into that method. */ -open class RouteStep: Codable, Equatable { +open class RouteStep: Codable { private enum CodingKeys: String, CodingKey { case codes case geometry @@ -359,6 +359,8 @@ open class RouteStep: Codable, Equatable { case finalHeading = "bearing_after" } + // MARK: Creating a Step + public func encode(to encoder: Encoder) throws { var container = encoder.container(keyedBy: CodingKeys.self) try container.encodeIfPresent(instructionsSpokenAlongStep, forKey: .instructionsSpokenAlongStep) @@ -494,7 +496,7 @@ open class RouteStep: Codable, Equatable { } } - // MARK: Getting the Step Geometry + // MARK: Getting the Shape of the Step /** The path of the route step from the location of the maneuver to the location of the next step’s maneuver. @@ -516,24 +518,6 @@ open class RouteStep: Codable, Equatable { */ public let instructions: String - fileprivate let name: String - - /** - Instructions about the next step’s maneuver, optimized for speech synthesis. - - As the user traverses this step, you can give them advance notice of the upcoming maneuver by reading aloud each item in this array in order as the user reaches the specified distances along this step. The text of the spoken instructions refers to the details in the next step, but the distances are measured from the beginning of this step. - - This property is non-`nil` if the `RouteOptions.includesSpokenInstructions` option is set to `true`. For instructions designed for display, use the `instructions` property. - */ - public let instructionsSpokenAlongStep: [SpokenInstruction]? - - /** - Instructions about the next step’s maneuver, optimized for display in real time. - As the user traverses this step, you can give them advance notice of the upcoming maneuver by displaying each item in this array in order as the user reaches the specified distances along this step. The text and images of the visual instructions refer to the details in the next step, but the distances are measured from the beginning of this step. - This property is non-`nil` if the `RouteOptions.includesVisualInstructions` option is set to `true`. For instructions designed for speech synthesis, use the `instructionsSpokenAlongStep` property. For instructions designed for display in a static list, use the `instructions` property. - */ - public let instructionsDisplayedAlongStep: [VisualInstructionBanner]? - /** The user’s heading immediately before performing the maneuver. */ @@ -629,6 +613,8 @@ open class RouteStep: Codable, Equatable { */ public let names: [String]? + fileprivate let name: String + /** A phonetic or phonemic transcription indicating how to pronounce the names in the `names` property. @@ -647,15 +633,6 @@ open class RouteStep: Codable, Equatable { */ public let codes: [String]? - // MARK: Getting Additional Step Details - - /** - The mode of transportation used for the step. - - This step may use a different mode of transportation than the overall route. - */ - public let transportType: TransportType - /** Any route reference codes that appear on guide signage for the road leading from this step’s maneuver to the next step’s maneuver. @@ -678,30 +655,58 @@ open class RouteStep: Codable, Equatable { Each item in the array corresponds to a cross street, starting with the intersection at the maneuver location indicated by the coordinates property and continuing with each cross street along the step. */ public let intersections: [Intersection]? - - // MARK: - Equality + + // MARK: Getting Details About the Next Maneuver + + /** + Instructions about the next step’s maneuver, optimized for speech synthesis. + + As the user traverses this step, you can give them advance notice of the upcoming maneuver by reading aloud each item in this array in order as the user reaches the specified distances along this step. The text of the spoken instructions refers to the details in the next step, but the distances are measured from the beginning of this step. + + This property is non-`nil` if the `RouteOptions.includesSpokenInstructions` option is set to `true`. For instructions designed for display, use the `instructions` property. + */ + public let instructionsSpokenAlongStep: [SpokenInstruction]? + + /** + Instructions about the next step’s maneuver, optimized for display in real time. + As the user traverses this step, you can give them advance notice of the upcoming maneuver by displaying each item in this array in order as the user reaches the specified distances along this step. The text and images of the visual instructions refer to the details in the next step, but the distances are measured from the beginning of this step. + This property is non-`nil` if the `RouteOptions.includesVisualInstructions` option is set to `true`. For instructions designed for speech synthesis, use the `instructionsSpokenAlongStep` property. For instructions designed for display in a static list, use the `instructions` property. + */ + public let instructionsDisplayedAlongStep: [VisualInstructionBanner]? + + // MARK: Getting the Mode of Transportation + + /** + The mode of transportation used for the step. + + This step may use a different mode of transportation than the overall route. + */ + public let transportType: TransportType +} + +extension RouteStep: Equatable { public static func == (lhs: RouteStep, rhs: RouteStep) -> Bool { - return lhs.codes == rhs.codes && - lhs.shape == rhs.shape && - lhs.destinationCodes == rhs.destinationCodes && - lhs.destinations == rhs.destinations && - lhs.distance == rhs.distance && - lhs.drivingSide == rhs.drivingSide && - lhs.exitNames == rhs.exitNames && - lhs.exitCodes == rhs.exitCodes && - lhs.exitIndex == rhs.exitIndex && - lhs.exitNames == rhs.exitNames && - lhs.expectedTravelTime == rhs.expectedTravelTime && - lhs.instructions == rhs.instructions && - lhs.instructionsDisplayedAlongStep == rhs.instructionsDisplayedAlongStep && - lhs.instructionsSpokenAlongStep == rhs.instructionsSpokenAlongStep && - lhs.intersections == rhs.intersections && - lhs.maneuverType == rhs.maneuverType && - lhs.maneuverLocation == rhs.maneuverLocation && - lhs.maneuverDirection == rhs.maneuverDirection && - lhs.name == rhs.name && - lhs.phoneticNames == rhs.phoneticNames && - lhs.phoneticExitNames == rhs.phoneticExitNames && - lhs.transportType == rhs.transportType - } + return lhs.codes == rhs.codes && + lhs.shape == rhs.shape && + lhs.destinationCodes == rhs.destinationCodes && + lhs.destinations == rhs.destinations && + lhs.distance == rhs.distance && + lhs.drivingSide == rhs.drivingSide && + lhs.exitNames == rhs.exitNames && + lhs.exitCodes == rhs.exitCodes && + lhs.exitIndex == rhs.exitIndex && + lhs.exitNames == rhs.exitNames && + lhs.expectedTravelTime == rhs.expectedTravelTime && + lhs.instructions == rhs.instructions && + lhs.instructionsDisplayedAlongStep == rhs.instructionsDisplayedAlongStep && + lhs.instructionsSpokenAlongStep == rhs.instructionsSpokenAlongStep && + lhs.intersections == rhs.intersections && + lhs.maneuverType == rhs.maneuverType && + lhs.maneuverLocation == rhs.maneuverLocation && + lhs.maneuverDirection == rhs.maneuverDirection && + lhs.name == rhs.name && + lhs.phoneticNames == rhs.phoneticNames && + lhs.phoneticExitNames == rhs.phoneticExitNames && + lhs.transportType == rhs.transportType + } } diff --git a/Sources/MapboxDirections/MBSpokenInstruction.swift b/Sources/MapboxDirections/MBSpokenInstruction.swift index 23a81c6f6..e0f37d153 100644 --- a/Sources/MapboxDirections/MBSpokenInstruction.swift +++ b/Sources/MapboxDirections/MBSpokenInstruction.swift @@ -8,7 +8,30 @@ import CoreLocation The `distanceAlongStep` property is measured from the beginning of the step associated with this object. By contrast, the `text` and `ssmlText` properties refer to the details in the following step. It is also possible for the instruction to refer to two following steps simultaneously when needed for safe navigation. */ -open class SpokenInstruction: Codable, Equatable { +open class SpokenInstruction: Codable { + private enum CodingKeys: String, CodingKey { + case distanceAlongStep = "distanceAlongGeometry" + case text = "announcement" + case ssmlText = "ssmlAnnouncement" + } + + // MARK: Creating a Spoken Instruction + + /** + Initialize a spoken instruction. + + - parameter distanceAlongStep: A distance along the associated `RouteStep` at which to read the instruction aloud. + - parameter text: A plain-text representation of the speech-optimized instruction. + - parameter ssmlText: A formatted representation of the speech-optimized instruction. + */ + public init(distanceAlongStep: CLLocationDistance, text: String, ssmlText: String) { + self.distanceAlongStep = distanceAlongStep + self.text = text + self.ssmlText = ssmlText + } + + // MARK: Timing When to Say the Instruction + /** A distance along the associated `RouteStep` at which to read the instruction aloud. @@ -16,6 +39,8 @@ open class SpokenInstruction: Codable, Equatable { */ public let distanceAlongStep: CLLocationDistance + // MARK: Getting the Instruction to Say + /** A plain-text representation of the speech-optimized instruction. @@ -29,27 +54,9 @@ open class SpokenInstruction: Codable, Equatable { This representation is appropriate for speech synthesizers that support the [Speech Synthesis Markup Language](https://en.wikipedia.org/wiki/Speech_Synthesis_Markup_Language) (SSML), such as [Amazon Polly](https://aws.amazon.com/polly/). Numbers and names are marked up to ensure correct pronunciation. For speech synthesizers that lack SSML support, use the `text` property instead. */ public let ssmlText: String - - private enum CodingKeys: String, CodingKey { - case distanceAlongStep = "distanceAlongGeometry" - case text = "announcement" - case ssmlText = "ssmlAnnouncement" - } - - /** - Initialize a `SpokenInstruction`. +} - - parameter distanceAlongStep: A distance along the associated `RouteStep` at which to read the instruction aloud. - - parameter text: A plain-text representation of the speech-optimized instruction. - - parameter ssmlText: A formatted representation of the speech-optimized instruction. - */ - public init(distanceAlongStep: CLLocationDistance, text: String, ssmlText: String) { - self.distanceAlongStep = distanceAlongStep - self.text = text - self.ssmlText = ssmlText - } - - //MARK: - Equatable +extension SpokenInstruction: Equatable { public static func == (lhs: SpokenInstruction, rhs: SpokenInstruction) -> Bool { return lhs.distanceAlongStep == rhs.distanceAlongStep && lhs.text == rhs.text && diff --git a/Sources/MapboxDirections/MBVisualInstruction.swift b/Sources/MapboxDirections/MBVisualInstruction.swift index caa0b9bb3..f2aa4a322 100644 --- a/Sources/MapboxDirections/MBVisualInstruction.swift +++ b/Sources/MapboxDirections/MBVisualInstruction.swift @@ -4,36 +4,16 @@ import CoreLocation /** The contents of a banner that should be displayed as added visual guidance for a route. The banner instructions are children of the steps during which they should be displayed, but they refer to the maneuver in the following step. */ -open class VisualInstruction: Codable, Equatable { - /** - A plain text representation of the instruction. - - Note: This is optional despite the API Documentation because it is commonplace for the SDK to return an empty string, which we consder to be equivelent to `null` - */ - public let text: String? - - /** - The type of maneuver required for beginning the step described by the visual instruction. - */ - public var maneuverType: ManeuverType? - - /** - Additional directional information to clarify the maneuver type. - */ - public var maneuverDirection: ManeuverDirection? - - /** - A structured representation of the instruction. - */ - public let components: [Component] - - /** - The heading at which the user exits a roundabout (traffic circle or rotary). - - This property is measured in degrees clockwise relative to the user’s initial heading. A value of 180° means continuing through the roundabout without changing course, whereas a value of 0° means traversing the entire roundabout back to the entry point. - - This property is only relevant if the `maneuverType` is any of the following values: `ManeuverType.takeRoundabout`, `ManeuverType.takeRotary`, `ManeuverType.turnAtRoundabout`, `ManeuverType.exitRoundabout`, or `ManeuverType.exitRotary`. - */ - public var finalHeading: CLLocationDegrees? +open class VisualInstruction: Codable { + // MARK: Creating a Visual Instruction + + private enum CodingKeys: String, CodingKey { + case text + case maneuverType = "type" + case maneuverDirection = "modifier" + case components + case finalHeading = "degrees" + } /** Initializes a new visual instruction banner object that displays the given information. @@ -46,16 +26,6 @@ open class VisualInstruction: Codable, Equatable { self.finalHeading = degrees } - // MARK: - Codable - - private enum CodingKeys: String, CodingKey { - case text - case maneuverType = "type" - case maneuverDirection = "modifier" - case components - case finalHeading = "degrees" - } - public func encode(to encoder: Encoder) throws { var container = encoder.container(keyedBy: CodingKeys.self) try container.encodeIfPresent(text, forKey: .text) @@ -74,8 +44,43 @@ open class VisualInstruction: Codable, Equatable { finalHeading = try container.decodeIfPresent(CLLocationDegrees.self, forKey: .finalHeading) } - // MARK: - Equatable + // MARK: Displaying the Instruction Text + /** + A plain text representation of the instruction. + + This property is set to `nil` when the `text` property in the Mapbox Directions API response is an empty string. + */ + public let text: String? + + /** + A structured representation of the instruction. + */ + public let components: [Component] + + // MARK: Displaying a Maneuver Image + + /** + The type of maneuver required for beginning the step described by the visual instruction. + */ + public var maneuverType: ManeuverType? + + /** + Additional directional information to clarify the maneuver type. + */ + public var maneuverDirection: ManeuverDirection? + + /** + The heading at which the user exits a roundabout (traffic circle or rotary). + + This property is measured in degrees clockwise relative to the user’s initial heading. A value of 180° means continuing through the roundabout without changing course, whereas a value of 0° means traversing the entire roundabout back to the entry point. + + This property is only relevant if the `maneuverType` is any of the following values: `ManeuverType.takeRoundabout`, `ManeuverType.takeRotary`, `ManeuverType.turnAtRoundabout`, `ManeuverType.exitRoundabout`, or `ManeuverType.exitRotary`. + */ + public var finalHeading: CLLocationDegrees? +} + +extension VisualInstruction: Equatable { public static func == (lhs: VisualInstruction, rhs: VisualInstruction) -> Bool { return lhs.text == rhs.text && lhs.maneuverType == rhs.maneuverType && diff --git a/Sources/MapboxDirections/MBVisualInstructionBanner.swift b/Sources/MapboxDirections/MBVisualInstructionBanner.swift index f17e8402f..9a6e8aaab 100644 --- a/Sources/MapboxDirections/MBVisualInstructionBanner.swift +++ b/Sources/MapboxDirections/MBVisualInstructionBanner.swift @@ -8,7 +8,7 @@ internal extension CodingUserInfoKey { /** A visual instruction banner contains all the information necessary for creating a visual cue about a given `RouteStep`. */ -open class VisualInstructionBanner: Codable, Equatable { +open class VisualInstructionBanner: Codable { private enum CodingKeys: String, CodingKey { case distanceAlongStep = "distanceAlongGeometry" case primaryInstruction = "primary" @@ -16,6 +16,9 @@ open class VisualInstructionBanner: Codable, Equatable { case tertiaryInstruction = "sub" case drivingSide } + + // MARK: Creating a Visual Instruction Banner + public func encode(to encoder: Encoder) throws { var container = encoder.container(keyedBy: CodingKeys.self) try container.encode(distanceAlongStep, forKey: .distanceAlongStep) @@ -36,11 +39,15 @@ open class VisualInstructionBanner: Codable, Equatable { } } + // MARK: Timing When to Display the Banner + /** The distance at which the visual instruction should be shown, measured in meters from the beginning of the step. */ public let distanceAlongStep: CLLocationDistance - + + // MARK: Getting the Instructions to Display + /** The most important information to convey to the user about the `RouteStep`. */ @@ -57,13 +64,16 @@ open class VisualInstructionBanner: Codable, Equatable { This instruction could either contain the visual layout information or the lane information about the upcoming maneuver. */ public let tertiaryInstruction: VisualInstruction? - + + // MARK: Respecting Regional Driving Rules + /** Which side of a bidirectional road the driver should drive on, also known as the rule of the road. */ public var drivingSide: DrivingSide! - - //MARK: - Equatable +} + +extension VisualInstructionBanner: Equatable { public static func == (lhs: VisualInstructionBanner, rhs: VisualInstructionBanner) -> Bool { return lhs.distanceAlongStep == rhs.distanceAlongStep && lhs.primaryInstruction == rhs.primaryInstruction && diff --git a/Sources/MapboxDirections/MBVisualInstructionComponent.swift b/Sources/MapboxDirections/MBVisualInstructionComponent.swift index 500344d30..ca1bb6e64 100644 --- a/Sources/MapboxDirections/MBVisualInstructionComponent.swift +++ b/Sources/MapboxDirections/MBVisualInstructionComponent.swift @@ -13,7 +13,7 @@ public extension VisualInstruction { /** A unit of information displayed to the user as part of a `VisualInstruction`. */ - enum Component: Codable, Equatable { + enum Component { /** The component separates two other destination components. @@ -55,122 +55,6 @@ public extension VisualInstruction { - parameter isUsable: Whether the user can use this lane to continue along the current route. */ case lane(indications: LaneIndication, isUsable: Bool) - - private enum CodingKeys: String, CodingKey { - case kind = "type" - case text - case abbreviatedText = "abbr" - case abbreviatedTextPriority = "abbr_priority" - case imageBaseURL - case directions - case isActive = "active" - } - - enum Kind: String, Codable { - case delimiter - case text - case image = "icon" - case exit - case exitCode = "exit-number" - case lane - } - - public init(from decoder: Decoder) throws { - let container = try decoder.container(keyedBy: CodingKeys.self) - let kind = try container.decode(Kind.self, forKey: .kind) - - if kind == .lane { - let indications = try container.decode(LaneIndication.self, forKey: .directions) - let isUsable = try container.decode(Bool.self, forKey: .isActive) - self = .lane(indications: indications, isUsable: isUsable) - return - } - - let text = try container.decode(String.self, forKey: .text) - let abbreviation = try container.decodeIfPresent(String.self, forKey: .abbreviatedText) - let abbreviationPriority = try container.decodeIfPresent(Int.self, forKey: .abbreviatedTextPriority) - let textRepresentation = TextRepresentation(text: text, abbreviation: abbreviation, abbreviationPriority: abbreviationPriority) - - switch kind { - case .delimiter: - self = .delimiter(text: textRepresentation) - case .text: - self = .text(text: textRepresentation) - case .image: - var imageBaseURL: URL? - if let imageBaseURLString = try container.decodeIfPresent(String.self, forKey: .imageBaseURL) { - imageBaseURL = URL(string: imageBaseURLString) - } - let imageRepresentation = ImageRepresentation(imageBaseURL: imageBaseURL) - self = .image(image: imageRepresentation, alternativeText: textRepresentation) - case .exit: - self = .exit(text: textRepresentation) - case .exitCode: - self = .exitCode(text: textRepresentation) - case .lane: - preconditionFailure("Lane component should have been initialized before decoding text") - } - } - - public func encode(to encoder: Encoder) throws { - var container = encoder.container(keyedBy: CodingKeys.self) - - let textRepresentation: TextRepresentation? - switch self { - case .delimiter(let text): - try container.encode(Kind.delimiter, forKey: .kind) - textRepresentation = text - case .text(let text): - try container.encode(Kind.text, forKey: .kind) - textRepresentation = text - case .image(let image, let alternativeText): - try container.encode(Kind.image, forKey: .kind) - textRepresentation = alternativeText - try container.encodeIfPresent(image.imageBaseURL, forKey: .imageBaseURL) - case .exit(let text): - try container.encode(Kind.exit, forKey: .kind) - textRepresentation = text - case .exitCode(let text): - try container.encode(Kind.exitCode, forKey: .kind) - textRepresentation = text - case .lane(let indications, let isUsable): - try container.encode(Kind.lane, forKey: .kind) - textRepresentation = nil - try container.encode(indications, forKey: .directions) - try container.encode(isUsable, forKey: .isActive) - } - - if let textRepresentation = textRepresentation { - try container.encodeIfPresent(textRepresentation.text, forKey: .text) - try container.encodeIfPresent(textRepresentation.abbreviation, forKey: .abbreviatedText) - try container.encodeIfPresent(textRepresentation.abbreviationPriority, forKey: .abbreviatedTextPriority) - } - } - - public static func ==(lhs: Component, rhs: Component) -> Bool { - switch (lhs, rhs) { - case (let .delimiter(lhsText), let .delimiter(rhsText)), - (let .text(lhsText), let .text(rhsText)), - (let .exit(lhsText), let .exit(rhsText)), - (let .exitCode(lhsText), let .exitCode(rhsText)): - return lhsText == rhsText - case (let .image(lhsURL, lhsAlternativeText), - let .image(rhsURL, rhsAlternativeText)): - return lhsURL == rhsURL - && lhsAlternativeText == rhsAlternativeText - case (let .lane(lhsIndications, lhsIsUsable), - let .lane(rhsIndications, rhsIsUsable)): - return lhsIndications == rhsIndications - && lhsIsUsable == rhsIsUsable - case (.delimiter, _), - (.text, _), - (.image, _), - (.exit, _), - (.exitCode, _), - (.lane, _): - return false - } - } } } @@ -248,3 +132,123 @@ public extension VisualInstruction.Component { } } } + +extension VisualInstruction.Component: Codable { + private enum CodingKeys: String, CodingKey { + case kind = "type" + case text + case abbreviatedText = "abbr" + case abbreviatedTextPriority = "abbr_priority" + case imageBaseURL + case directions + case isActive = "active" + } + + enum Kind: String, Codable { + case delimiter + case text + case image = "icon" + case exit + case exitCode = "exit-number" + case lane + } + + public init(from decoder: Decoder) throws { + let container = try decoder.container(keyedBy: CodingKeys.self) + let kind = try container.decode(Kind.self, forKey: .kind) + + if kind == .lane { + let indications = try container.decode(LaneIndication.self, forKey: .directions) + let isUsable = try container.decode(Bool.self, forKey: .isActive) + self = .lane(indications: indications, isUsable: isUsable) + return + } + + let text = try container.decode(String.self, forKey: .text) + let abbreviation = try container.decodeIfPresent(String.self, forKey: .abbreviatedText) + let abbreviationPriority = try container.decodeIfPresent(Int.self, forKey: .abbreviatedTextPriority) + let textRepresentation = TextRepresentation(text: text, abbreviation: abbreviation, abbreviationPriority: abbreviationPriority) + + switch kind { + case .delimiter: + self = .delimiter(text: textRepresentation) + case .text: + self = .text(text: textRepresentation) + case .image: + var imageBaseURL: URL? + if let imageBaseURLString = try container.decodeIfPresent(String.self, forKey: .imageBaseURL) { + imageBaseURL = URL(string: imageBaseURLString) + } + let imageRepresentation = ImageRepresentation(imageBaseURL: imageBaseURL) + self = .image(image: imageRepresentation, alternativeText: textRepresentation) + case .exit: + self = .exit(text: textRepresentation) + case .exitCode: + self = .exitCode(text: textRepresentation) + case .lane: + preconditionFailure("Lane component should have been initialized before decoding text") + } + } + + public func encode(to encoder: Encoder) throws { + var container = encoder.container(keyedBy: CodingKeys.self) + + let textRepresentation: TextRepresentation? + switch self { + case .delimiter(let text): + try container.encode(Kind.delimiter, forKey: .kind) + textRepresentation = text + case .text(let text): + try container.encode(Kind.text, forKey: .kind) + textRepresentation = text + case .image(let image, let alternativeText): + try container.encode(Kind.image, forKey: .kind) + textRepresentation = alternativeText + try container.encodeIfPresent(image.imageBaseURL, forKey: .imageBaseURL) + case .exit(let text): + try container.encode(Kind.exit, forKey: .kind) + textRepresentation = text + case .exitCode(let text): + try container.encode(Kind.exitCode, forKey: .kind) + textRepresentation = text + case .lane(let indications, let isUsable): + try container.encode(Kind.lane, forKey: .kind) + textRepresentation = nil + try container.encode(indications, forKey: .directions) + try container.encode(isUsable, forKey: .isActive) + } + + if let textRepresentation = textRepresentation { + try container.encodeIfPresent(textRepresentation.text, forKey: .text) + try container.encodeIfPresent(textRepresentation.abbreviation, forKey: .abbreviatedText) + try container.encodeIfPresent(textRepresentation.abbreviationPriority, forKey: .abbreviatedTextPriority) + } + } +} + +extension VisualInstruction.Component: Equatable { + public static func ==(lhs: VisualInstruction.Component, rhs: VisualInstruction.Component) -> Bool { + switch (lhs, rhs) { + case (let .delimiter(lhsText), let .delimiter(rhsText)), + (let .text(lhsText), let .text(rhsText)), + (let .exit(lhsText), let .exit(rhsText)), + (let .exitCode(lhsText), let .exitCode(rhsText)): + return lhsText == rhsText + case (let .image(lhsURL, lhsAlternativeText), + let .image(rhsURL, rhsAlternativeText)): + return lhsURL == rhsURL + && lhsAlternativeText == rhsAlternativeText + case (let .lane(lhsIndications, lhsIsUsable), + let .lane(rhsIndications, rhsIsUsable)): + return lhsIndications == rhsIndications + && lhsIsUsable == rhsIsUsable + case (.delimiter, _), + (.text, _), + (.image, _), + (.exit, _), + (.exitCode, _), + (.lane, _): + return false + } + } +} diff --git a/Sources/MapboxDirections/MBWaypoint.swift b/Sources/MapboxDirections/MBWaypoint.swift index cdc52fe81..b084596c5 100644 --- a/Sources/MapboxDirections/MBWaypoint.swift +++ b/Sources/MapboxDirections/MBWaypoint.swift @@ -15,7 +15,7 @@ public class Waypoint: Codable { case allowsArrivingOnOppositeSide } - // MARK: Creating a Waypoint Object + // MARK: Creating a Waypoint required public init(from decoder: Decoder) throws { let container = try decoder.container(keyedBy: CodingKeys.self) @@ -99,7 +99,7 @@ public class Waypoint: Codable { } #endif - // MARK: Getting the Waypoint’s Location + // MARK: Positioning the Waypoint /** The geographic coordinate of the waypoint. @@ -125,6 +125,7 @@ public class Waypoint: Codable { This property corresponds to the [`waypoint_targets`](https://docs.mapbox.com/api/navigation/#retrieve-directions) query parameter in the Mapbox Directions and Map Matching APIs. */ public var targetCoordinate: CLLocationCoordinate2D? + // MARK: Getting the Direction of Approach /** @@ -177,10 +178,12 @@ public class Waypoint: Codable { */ public var name: String? + // MARK: Separating the Routes Into Legs + /** A Boolean value indicating whether the waypoint is significant enough to appear in the resulting routes as a waypoint separating two legs, along with corresponding guidance instructions. - By default, this property is set to `true`, which means that each resulting route will include a leg that ends by arriving at the waypoint as `RouteLeg.destination` and a subsequent leg that begins by departing from the waypoint as `RouteLeg.source`. Otherwise, if this property is set to `false`, a single leg passes through the waypoint without specifically mentioning it. Regardless of the value of this property, each resulting route passes through the location specified by the `coordinate` property, accounting for approach-related properties such as ` heading`. + By default, this property is set to `true`, which means that each resulting route will include a leg that ends by arriving at the waypoint as `RouteLeg.destination` and a subsequent leg that begins by departing from the waypoint as `RouteLeg.source`. Otherwise, if this property is set to `false`, a single leg passes through the waypoint without specifically mentioning it. Regardless of the value of this property, each resulting route passes through the location specified by the `coordinate` property, accounting for approach-related properties such as `heading`. With the Mapbox Directions API, set this property to `false` if you want the waypoint’s location to influence the path that the route follows without attaching any meaning to the waypoint object itself. With the Mapbox Map Matching API, use this property when the `DirectionsOptions.includesSteps` property is `true` or when `coordinates` represents a trace with a high sample rate. This property has no effect if `DirectionsOptions.includesSteps` is set to `false`, or if `MatchOptions.waypointIndices` is non-nil. diff --git a/Sources/MapboxDirections/Match/MBMatchOptions.swift b/Sources/MapboxDirections/Match/MBMatchOptions.swift index 4e7a64d0c..19d8ce026 100644 --- a/Sources/MapboxDirections/Match/MBMatchOptions.swift +++ b/Sources/MapboxDirections/Match/MBMatchOptions.swift @@ -7,6 +7,8 @@ import CoreLocation Pass an instance of this class into the `Directions.calculate(_:completionHandler:)` method. */ open class MatchOptions: DirectionsOptions { + // MARK: Creating a Match Options Object + /** Initializes a match options object for matching locations against the road network. @@ -53,11 +55,15 @@ open class MatchOptions: DirectionsOptions { try super.init(from: decoder) } + // MARK: Resampling the Locations Before Matching + /** If true, the input locations are re-sampled for improved map matching results. The default is `false`. */ open var resamplesTraces: Bool = false + // MARK: Separating the Matches Into Legs + /** An index set containing indices of two or more items in `coordinates`. These will be represented by `Waypoint`s in the resulting `Match` objects. @@ -75,7 +81,9 @@ open class MatchOptions: DirectionsOptions { return super.legSeparators } } - + + // MARK: Getting the Request URL + override open var urlQueryItems: [URLQueryItem] { var queryItems = super.urlQueryItems diff --git a/Sources/MapboxDirections/RoadClasses.swift b/Sources/MapboxDirections/RoadClasses.swift index 0bb1b57fa..e2cfcbfc1 100644 --- a/Sources/MapboxDirections/RoadClasses.swift +++ b/Sources/MapboxDirections/RoadClasses.swift @@ -3,24 +3,13 @@ import Foundation /** Option set that contains attributes of a road segment. */ -public struct RoadClasses: OptionSet, Codable, CustomStringConvertible { +public struct RoadClasses: OptionSet, CustomStringConvertible { public var rawValue: Int public init(rawValue: Int) { self.rawValue = rawValue } - public func encode(to encoder: Encoder) throws { - var container = encoder.singleValueContainer() - try container.encode(description.components(separatedBy: ",")) - } - - public init(from decoder: Decoder) throws { - let container = try decoder.singleValueContainer() - let descriptions = try container.decode([String].self) - self = RoadClasses(descriptions: descriptions)! - } - /** The road segment is [tolled](https://wiki.openstreetmap.org/wiki/Key:toll). */ @@ -104,3 +93,16 @@ public struct RoadClasses: OptionSet, Codable, CustomStringConvertible { return descriptions.joined(separator: ",") } } + +extension RoadClasses: Codable { + public func encode(to encoder: Encoder) throws { + var container = encoder.singleValueContainer() + try container.encode(description.components(separatedBy: ",")) + } + + public init(from decoder: Decoder) throws { + let container = try decoder.singleValueContainer() + let descriptions = try container.decode([String].self) + self = RoadClasses(descriptions: descriptions)! + } +} diff --git a/Sources/MapboxDirections/RouteResponse.swift b/Sources/MapboxDirections/RouteResponse.swift index 26a2a4204..fb2c770f8 100644 --- a/Sources/MapboxDirections/RouteResponse.swift +++ b/Sources/MapboxDirections/RouteResponse.swift @@ -1,15 +1,6 @@ import Foundation -struct RouteResponse: Codable { - enum CodingKeys: String, CodingKey { - case code - case message - case error - case uuid - case routes - case waypoints - } - +struct RouteResponse { var code: String? var message: String? var error: String? @@ -25,6 +16,17 @@ struct RouteResponse: Codable { self.routes = nil self.waypoints = nil } +} + +extension RouteResponse: Codable { + enum CodingKeys: String, CodingKey { + case code + case message + case error + case uuid + case routes + case waypoints + } init(from decoder: Decoder) throws { let container = try decoder.container(keyedBy: CodingKeys.self) From 9ac36fd5d6f0319d423273b8292e3bfeefcba9e0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Minh=20Nguye=CC=82=CC=83n?= Date: Sat, 2 Nov 2019 07:50:08 -0700 Subject: [PATCH 48/89] Corrected coordinate bounds documentation --- Sources/MapboxDirections/MBCoordinateBounds.swift | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Sources/MapboxDirections/MBCoordinateBounds.swift b/Sources/MapboxDirections/MBCoordinateBounds.swift index 1142b3f0a..ceb050d55 100644 --- a/Sources/MapboxDirections/MBCoordinateBounds.swift +++ b/Sources/MapboxDirections/MBCoordinateBounds.swift @@ -12,7 +12,7 @@ public struct CoordinateBounds { let northEast: CLLocationCoordinate2D /** - Initializes a `BoundingBox` with known bounds. + Initializes a coordinate bounds based on the southwest and northeast corners. */ public init(southWest: CLLocationCoordinate2D, northEast: CLLocationCoordinate2D) { self.southWest = southWest @@ -20,7 +20,7 @@ public struct CoordinateBounds { } /** - Initializes a `BoundingBox` with known bounds. + Initializes a coordinate bounds based on the northwest and southeast corners. */ public init(northWest: CLLocationCoordinate2D, southEast: CLLocationCoordinate2D) { self.southWest = CLLocationCoordinate2D(latitude: southEast.latitude, longitude: northWest.longitude) @@ -28,7 +28,7 @@ public struct CoordinateBounds { } /** - Initializes a `BoundingBox` from an array of `CLLocationCoordinate2D`’s. + Initializes a coordinate bounds that includes all the given coordinates. */ public init(coordinates: [CLLocationCoordinate2D]) { assert(coordinates.count >= 2, "coordinates must consist of at least two coordinates") From 69e84a4d0e33fa3f97377f76fd0d1db23f36ea31 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Minh=20Nguye=CC=82=CC=83n?= Date: Sat, 2 Nov 2019 10:45:06 -0700 Subject: [PATCH 49/89] Flatten Lane into Intersection An Intersection now contains an array of LaneIndications. Lane is an internal type for coding purposes only. This change aligns the lane representations in Intersection and VisualInstruction. --- Sources/MapboxDirections/MBIntersection.swift | 29 ++++++++++++++----- Sources/MapboxDirections/MBLane.swift | 12 ++++---- Tests/MapboxDirectionsTests/V5Tests.swift | 2 +- 3 files changed, 28 insertions(+), 15 deletions(-) diff --git a/Sources/MapboxDirections/MBIntersection.swift b/Sources/MapboxDirections/MBIntersection.swift index e5d369dfe..5ab3b5625 100644 --- a/Sources/MapboxDirections/MBIntersection.swift +++ b/Sources/MapboxDirections/MBIntersection.swift @@ -12,7 +12,7 @@ public struct Intersection { approachIndex: Int, outletIndex: Int, outletIndexes: IndexSet, - approachLanes: [Lane]?, + approachLanes: [LaneIndication]?, usableApproachLanes: IndexSet?, outletRoadClasses: RoadClasses?) { self.location = location @@ -72,14 +72,14 @@ public struct Intersection { // MARK: Telling the User Which Lanes to Use /** - An array of `Lane` objects representing all the lanes of the road that the containing route step uses to approach the intersection. + All the lanes of the road that the containing route step uses to approach the intersection. Each item in the array represents a lane, which is represented by one or more `LaneIndication`s. - If no lane information is available for an intersection, this property’s value is `nil`. The first item corresponds to the leftmost lane, the second item corresponds to the second lane from the left, and so on, regardless of whether the surrounding country drives on the left or on the right. + If no lane information is available for the intersection, this property’s value is `nil`. The first item corresponds to the leftmost lane, the second item corresponds to the second lane from the left, and so on, regardless of whether the surrounding country drives on the left or on the right. */ - public let approachLanes: [Lane]? + public let approachLanes: [LaneIndication]? /** - The indices of the items in the `approachLanes` array that correspond to the roads that may be used to execute the maneuver. + The indices of the items in the `approachLanes` array that correspond to the lanes that may be used to execute the maneuver. If no lane information is available for an intersection, this property’s value is `nil`. */ @@ -113,7 +113,15 @@ extension Intersection: Codable { try container.encode(outletArray, forKey: .outletIndexes) - try container.encode(approachLanes, forKey: .lanes) + var lanes: [Lane]? + if let approachLanes = approachLanes, + let usableApproachLanes = usableApproachLanes { + lanes = approachLanes.map { Lane(indications: $0) } + for i in usableApproachLanes { + lanes![i].isValid = true + } + } + try container.encode(lanes, forKey: .lanes) if let classes = outletRoadClasses?.description.components(separatedBy: ",") { try container.encode(classes, forKey: .outletRoadClasses) @@ -125,8 +133,13 @@ extension Intersection: Codable { location = try container.decode(CLLocationCoordinate2D.self, forKey: .location) headings = try container.decode([CLLocationDirection].self, forKey: .headings) - approachLanes = try container.decodeIfPresent([Lane].self, forKey: .lanes) - usableApproachLanes = approachLanes?.indices { $0.isValid } + if let lanes = try container.decodeIfPresent([Lane].self, forKey: .lanes) { + approachLanes = lanes.map { $0.indications } + usableApproachLanes = lanes.indices { $0.isValid } + } else { + approachLanes = nil + usableApproachLanes = nil + } outletRoadClasses = try container.decodeIfPresent(RoadClasses.self, forKey: .outletRoadClasses) let outletsArray = try container.decode([Bool].self, forKey: .outletIndexes) diff --git a/Sources/MapboxDirections/MBLane.swift b/Sources/MapboxDirections/MBLane.swift index 1c28dd1ee..990e89c6e 100644 --- a/Sources/MapboxDirections/MBLane.swift +++ b/Sources/MapboxDirections/MBLane.swift @@ -3,15 +3,15 @@ import Foundation /** A lane on the road approaching an intersection. */ -public struct Lane: Equatable { +struct Lane: Equatable { /** The lane indications specifying the maneuvers that may be executed from the lane. */ - public let indications: LaneIndication + let indications: LaneIndication - let isValid: Bool + var isValid: Bool - internal init(indications: LaneIndication, valid: Bool = false) { + init(indications: LaneIndication, valid: Bool = false) { self.indications = indications self.isValid = valid } @@ -23,13 +23,13 @@ extension Lane: Codable { case valid } - public func encode(to encoder: Encoder) throws { + func encode(to encoder: Encoder) throws { var container = encoder.container(keyedBy: CodingKeys.self) try container.encode(indications, forKey: .indications) try container.encode(isValid, forKey: .valid) } - public init(from decoder: Decoder) throws { + init(from decoder: Decoder) throws { let container = try decoder.container(keyedBy: CodingKeys.self) indications = try container.decode(LaneIndication.self, forKey: .indications) isValid = try container.decode(Bool.self, forKey: .valid) diff --git a/Tests/MapboxDirectionsTests/V5Tests.swift b/Tests/MapboxDirectionsTests/V5Tests.swift index 57772fda7..a60f67fd4 100644 --- a/Tests/MapboxDirectionsTests/V5Tests.swift +++ b/Tests/MapboxDirectionsTests/V5Tests.swift @@ -147,7 +147,7 @@ class V5Tests: XCTestCase { XCTAssertEqual(intersection?.usableApproachLanes, IndexSet([0, 1])) XCTAssertNotNil(intersection?.approachLanes) XCTAssertEqual(intersection?.approachLanes?.count, 3) - XCTAssertEqual(intersection?.approachLanes?[1].indications, [.slightLeft, .slightRight]) + XCTAssertEqual(intersection?.approachLanes?[1], [.slightLeft, .slightRight]) XCTAssertEqual(leg?.steps[58].names, ["Logan Circle Northwest"]) XCTAssertNil(leg?.steps[58].exitNames) From 1bbecb5a19a57d8cb30b2acbd1de4fb2bedcb25b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Minh=20Nguye=CC=82=CC=83n?= Date: Sat, 2 Nov 2019 11:06:52 -0700 Subject: [PATCH 50/89] Avoid ExpressibleByStringLiteral for enumeration types --- .../DirectionsProfileIdentifier.swift | 17 +++++------------ 1 file changed, 5 insertions(+), 12 deletions(-) diff --git a/Sources/MapboxDirections/DirectionsProfileIdentifier.swift b/Sources/MapboxDirections/DirectionsProfileIdentifier.swift index 266077662..6a5f72577 100644 --- a/Sources/MapboxDirections/DirectionsProfileIdentifier.swift +++ b/Sources/MapboxDirections/DirectionsProfileIdentifier.swift @@ -8,14 +8,7 @@ The returned directions are appropriate for driving or riding a car, truck, or m This profile prioritizes fast routes by preferring high-speed roads like highways. A driving route may use a ferry where necessary. */ -public struct DirectionsProfileIdentifier: Codable, Hashable, RawRepresentable, ExpressibleByStringLiteral { - public typealias StringLiteralType = String - public typealias RawValue = String - - public init(stringLiteral value: StringLiteralType) { - self.init(rawValue: value) - } - +public struct DirectionsProfileIdentifier: Codable, Hashable, RawRepresentable { public init(rawValue: String) { self.rawValue = rawValue } @@ -27,7 +20,7 @@ public struct DirectionsProfileIdentifier: Codable, Hashable, RawRepresentable, This profile prioritizes fast routes by preferring high-speed roads like highways. A driving route may use a ferry where necessary. */ - public static let automobile: DirectionsProfileIdentifier = "mapbox/driving" + public static let automobile: DirectionsProfileIdentifier = .init(rawValue: "mapbox/driving") /** The returned directions are appropriate for driving or riding a car, truck, or motorcycle. @@ -36,21 +29,21 @@ public struct DirectionsProfileIdentifier: Codable, Hashable, RawRepresentable, Traffic data is available in [a number of countries and territories worldwide](https://docs.mapbox.com/help/how-mapbox-works/directions/#traffic-data). Where traffic data is unavailable, this profile prefers high-speed roads like highways, similar to `DirectionsProfileIdentifier.Automobile`. */ - public static let automobileAvoidingTraffic: DirectionsProfileIdentifier = "mapbox/driving-traffic" + public static let automobileAvoidingTraffic: DirectionsProfileIdentifier = .init(rawValue: "mapbox/driving-traffic") /** The returned directions are appropriate for riding a bicycle. This profile prioritizes short, safe routes by avoiding highways and preferring cycling infrastructure, such as bike lanes on surface streets. A cycling route may, where necessary, use other modes of transportation, such as ferries or trains, or require dismounting the bicycle for a distance. */ - public static let cycling: DirectionsProfileIdentifier = "mapbox/cycling" + public static let cycling: DirectionsProfileIdentifier = .init(rawValue: "mapbox/cycling") /** The returned directions are appropriate for walking or hiking. This profile prioritizes short routes, making use of sidewalks and trails where available. A walking route may use other modes of transportation, such as ferries or trains, where necessary. */ - public static let walking: DirectionsProfileIdentifier = "mapbox/walking" + public static let walking: DirectionsProfileIdentifier = .init(rawValue: "mapbox/walking") } @available(*, deprecated, renamed: "DirectionsPriority") From 0ffc1309b1621898d37c287e74230d95b5db2820 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Minh=20Nguye=CC=82=CC=83n?= Date: Sat, 2 Nov 2019 12:07:48 -0700 Subject: [PATCH 51/89] Fixed pronunciation coding Restored and updated an older test that exercised pronunciations. Fixed an issue where pronunciations were keyed to the wrong keys. Removed Directions API v4 support code and tests. --- Sources/MapboxDirections/MBRouteStep.swift | 46 +++++++-------- .../RouteStepTests.swift | 57 ++++++++++++++++--- 2 files changed, 72 insertions(+), 31 deletions(-) diff --git a/Sources/MapboxDirections/MBRouteStep.swift b/Sources/MapboxDirections/MBRouteStep.swift index 7b1714ea4..54518ae3a 100644 --- a/Sources/MapboxDirections/MBRouteStep.swift +++ b/Sources/MapboxDirections/MBRouteStep.swift @@ -267,6 +267,12 @@ extension String { } } +extension Array where Element == String { + internal func tagValues(joinedBy separator: String) -> String { + return joined(separator: "\(separator) ") + } +} + /** Encapsulates all the information about a road. */ @@ -289,15 +295,6 @@ struct Road { self.names = name.replacingOccurrences(of: parenthetical, with: "").tagValues(separatedBy: ";") } codes = ref.tagValues(separatedBy: ";") - } else if !name.isEmpty, let codesRange = name.range(of: "\\(.+?\\)$", options: .regularExpression, range: name.startIndex.. + let stepJSON = [ + "driving_side": "right", + "geometry": "ek`fFxc~hVIu@", + "mode": "driving", + "maneuver": [ + "bearing_after": 73, + "bearing_before": 60, + "location": [37.854109, -122.220291], + "modifier": "slight right", + "type": "fork", + "instruction": "Keep right onto CA 24", + ], + "ref": "CA 24", + "weight": 2.5, + "duration": 2.5, + "name": "Grove Shafter Freeway (CA 24)", + "pronunciation": "ˈaɪˌfoʊ̯n ˈtɛn", + "distance": 24.5, + ] as [String: Any?] + + let stepData = try! JSONSerialization.data(withJSONObject: stepJSON, options: []) + var step: RouteStep? + XCTAssertNoThrow(step = try JSONDecoder().decode(RouteStep.self, from: stepData)) + XCTAssertNotNil(step) + + if let step = step { + XCTAssertEqual(step.drivingSide, .right) + XCTAssertEqual(step.transportType, .automobile) + XCTAssertEqual(step.shape?.coordinates.count, 2) + XCTAssertEqual(step.shape?.coordinates.first?.latitude ?? 0, 37.854109, accuracy: 1e-5) + XCTAssertEqual(step.shape?.coordinates.first?.longitude ?? 0, -122.220291, accuracy: 1e-5) + XCTAssertEqual(step.shape?.coordinates.last?.latitude ?? 0, 37.854164, accuracy: 1e-5) + XCTAssertEqual(step.shape?.coordinates.last?.longitude ?? 0, -122.220021, accuracy: 1e-5) + XCTAssertEqual(step.finalHeading, 73) + XCTAssertEqual(step.initialHeading, 60) + XCTAssertEqual(step.maneuverLocation, CLLocationCoordinate2D(latitude: -122.220291, longitude: 37.854109)) + XCTAssertEqual(step.maneuverDirection, .slightRight) + XCTAssertEqual(step.maneuverType, .reachFork) + XCTAssertEqual(step.instructions, "Keep right onto CA 24") + XCTAssertEqual(step.codes, ["CA 24"]) + XCTAssertEqual(step.expectedTravelTime, 2.5) + XCTAssertEqual(step.names, ["Grove Shafter Freeway"]) + XCTAssertEqual(step.phoneticNames, ["ˈaɪˌfoʊ̯n ˈtɛn"]) + XCTAssertEqual(step.distance, 24.5) + } + } + func testCoding() { let options = RouteOptions(coordinates: [CLLocationCoordinate2D(latitude: 0, longitude: 0), CLLocationCoordinate2D(latitude: 1, longitude: 1)]) options.shapeFormat = .polyline From 8ace2aa1d92bd151bbd0e1af3ff09cfa446fdf3f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Minh=20Nguye=CC=82=CC=83n?= Date: Sat, 2 Nov 2019 13:31:17 -0700 Subject: [PATCH 52/89] Rewrote RouteStep coding MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Gave Road responsibility for encoding and decoding its part of the step object. Fixed an issue where transportType wouldn’t get encoded. Removed unused coding keys and renamed some keys to more closely match their associated properties. Fixed an issue where the == operator failed to compare some properties like name. Improved performance of the == operator by allowing the shape comparison to be short-circuited by the other properties. --- Sources/MapboxDirections/MBRouteStep.swift | 183 ++++++++++-------- .../RouteStepTests.swift | 3 +- Tests/MapboxDirectionsTests/V5Tests.swift | 12 +- 3 files changed, 116 insertions(+), 82 deletions(-) diff --git a/Sources/MapboxDirections/MBRouteStep.swift b/Sources/MapboxDirections/MBRouteStep.swift index 54518ae3a..a9178a921 100644 --- a/Sources/MapboxDirections/MBRouteStep.swift +++ b/Sources/MapboxDirections/MBRouteStep.swift @@ -283,9 +283,17 @@ struct Road { let destinations: [String]? let destinationCodes: [String]? let rotaryNames: [String]? - + + init(names: [String]?, codes: [String]?, exitCodes: [String]?, destinations: [String]?, destinationCodes: [String]?, rotaryNames: [String]?) { + self.names = names + self.codes = codes + self.exitCodes = exitCodes + self.destinations = destinations + self.destinationCodes = destinationCodes + self.rotaryNames = rotaryNames + } + init(name: String, ref: String?, exits: String?, destination: String?, rotaryName: String?) { - var codes: [String]? if !name.isEmpty, let ref = ref { // Mapbox Directions API v5 encodes the ref separately from the name but redundantly includes the ref in the name for backwards compatibility. Remove the ref from the name. let parenthetical = "(\(ref))" @@ -294,10 +302,8 @@ struct Road { } else { self.names = name.replacingOccurrences(of: parenthetical, with: "").tagValues(separatedBy: ";") } - codes = ref.tagValues(separatedBy: ";") } else { self.names = name.isEmpty ? nil : name.tagValues(separatedBy: ";") - codes = ref?.tagValues(separatedBy: ";") } // Mapbox Directions API v5 combines the destination’s ref and name. @@ -311,11 +317,57 @@ struct Road { } self.exitCodes = exits?.tagValues(separatedBy: ";") - self.codes = codes + self.codes = ref?.tagValues(separatedBy: ";") self.rotaryNames = rotaryName?.tagValues(separatedBy: ";") } } +extension Road: Codable { + private enum CodingKeys: String, CodingKey { + case name + case ref + case exits + case destinations + case rotaryName = "rotary_name" + } + + init(from decoder: Decoder) throws { + let container = try decoder.container(keyedBy: CodingKeys.self) + // Decoder apparently treats an empty string as a null value. + let name = try container.decodeIfPresent(String.self, forKey: .name) ?? "" + let ref = try container.decodeIfPresent(String.self, forKey: .ref) + let exits = try container.decodeIfPresent(String.self, forKey: .exits) + let destinations = try container.decodeIfPresent(String.self, forKey: .destinations) + let rotaryName = try container.decodeIfPresent(String.self, forKey: .rotaryName) + self.init(name: name, ref: ref, exits: exits, destination: destinations, rotaryName: rotaryName) + } + + func encode(to encoder: Encoder) throws { + var container = encoder.container(keyedBy: CodingKeys.self) + + let ref = codes?.tagValues(joinedBy: ";") + if var name = names?.tagValues(joinedBy: ";") { + if let ref = ref { + name = "\(name) (\(ref))" + } + try container.encodeIfPresent(name, forKey: .name) + } else { + try container.encodeIfPresent(ref, forKey: .name) + } + + if var destinations = destinations?.tagValues(joinedBy: ",") { + if let destinationCodes = destinationCodes?.tagValues(joinedBy: ",") { + destinations = "\(destinationCodes): \(destinations)" + } + try container.encode(destinations, forKey: .destinations) + } + + try container.encodeIfPresent(exitCodes?.tagValues(joinedBy: ";"), forKey: .exits) + try container.encodeIfPresent(ref, forKey: .ref) + try container.encodeIfPresent(rotaryNames?.tagValues(joinedBy: ";"), forKey: .rotaryName) + } +} + /** A `RouteStep` object represents a single distinct maneuver along a route and the approach to the next maneuver. The route step object corresponds to a single instruction the user must follow to complete a portion of the route. For example, a step might require the user to turn then follow a road. @@ -323,28 +375,19 @@ struct Road { */ open class RouteStep: Codable { private enum CodingKeys: String, CodingKey { - case codes - case geometry - case destinationCodes - case destinations + case shape = "geometry" case distance case drivingSide = "driving_side" - case exitCodes - case exitIndex - case exitNames + case exitIndex = "exit" case expectedTravelTime = "duration" case instructions case instructionsDisplayedAlongStep = "bannerInstructions" case instructionsSpokenAlongStep = "voiceInstructions" case intersections case maneuver - case name - case ref - case exits case pronunciation case rotaryPronunciation = "rotary_pronunciation" case transportType = "mode" - case rotaryName = "rotary_name" } private enum ManeuverCodingKeys: String, CodingKey { @@ -363,30 +406,34 @@ open class RouteStep: Codable { try container.encodeIfPresent(instructionsSpokenAlongStep, forKey: .instructionsSpokenAlongStep) try container.encodeIfPresent(instructionsDisplayedAlongStep, forKey: .instructionsDisplayedAlongStep) try container.encodeIfPresent(exitIndex, forKey: .exitIndex) - try container.encodeIfPresent(exitCodes, forKey: .exitCodes) - try container.encodeIfPresent(exitNames, forKey: .exitNames) - if maneuverType == .takeRotary || maneuverType == .takeRoundabout { - try container.encodeIfPresent(phoneticExitNames, forKey: .rotaryPronunciation) - try container.encodeIfPresent(phoneticNames, forKey: .pronunciation) - } else { - try container.encodeIfPresent(phoneticNames, forKey: .pronunciation) - } try container.encode(distance.rounded(to: 1e1), forKey: .distance) try container.encode(expectedTravelTime.rounded(to: 1e1), forKey: .expectedTravelTime) - try container.encodeIfPresent(codes?.tagValues(joinedBy: ";"), forKey: .ref) if transportType != .none { try container.encode(transportType, forKey: .transportType) } - try container.encodeIfPresent(destinationString, forKey: .destinations) + let isRound = maneuverType == .takeRotary || maneuverType == .takeRoundabout + let road = Road(names: isRound ? exitNames : names, + codes: codes, + exitCodes: exitCodes, + destinations: destinations, + destinationCodes: destinationCodes, + rotaryNames: isRound ? names : nil) + try road.encode(to: encoder) + if isRound { + try container.encodeIfPresent(phoneticNames, forKey: .rotaryPronunciation) + try container.encodeIfPresent(phoneticExitNames, forKey: .pronunciation) + } else { + try container.encodeIfPresent(phoneticNames, forKey: .pronunciation) + } + try container.encodeIfPresent(intersections, forKey: .intersections) try container.encode(drivingSide, forKey: .drivingSide) - try container.encodeIfPresent(name, forKey: .name) if let shape = shape, let options = encoder.userInfo[.options] as? DirectionsOptions { let shapeFormat = options.shapeFormat let polyLineString = PolyLineString(lineString: shape, shapeFormat: shapeFormat) - try container.encode(polyLineString, forKey: .geometry) + try container.encode(polyLineString, forKey: .shape) } var maneuver = container.nestedContainer(keyedBy: ManeuverCodingKeys.self, forKey: .maneuver) @@ -414,22 +461,12 @@ open class RouteStep: Codable { initialHeading = try maneuver.decodeIfPresent(CLLocationDirection.self, forKey: .initialHeading) finalHeading = try maneuver.decodeIfPresent(CLLocationDirection.self, forKey: .finalHeading) - if let polyLineString = try container.decodeIfPresent(PolyLineString.self, forKey: .geometry) { + if let polyLineString = try container.decodeIfPresent(PolyLineString.self, forKey: .shape) { shape = try LineString(polyLineString: polyLineString) } else { shape = nil } - name = try container.decode(String.self, forKey: .name) - - let dest = try container.decodeIfPresent(String.self, forKey: .destinations) - - let road = Road(name: name, - ref: try container.decodeIfPresent(String.self, forKey: .ref), - exits: try container.decodeIfPresent(String.self, forKey: .exits), - destination: dest, - rotaryName: try container.decodeIfPresent(String.self, forKey: .rotaryName)) - if let instruction = try? maneuver.decode(String.self, forKey: .instruction) { instructions = instruction } else if maneuverType != .none, maneuverDirection != .none { @@ -455,18 +492,17 @@ open class RouteStep: Codable { } exitIndex = try container.decodeIfPresent(Int.self, forKey: .exitIndex) - exitCodes = try container.decodeIfPresent([String].self, forKey: .exitCodes) distance = try container.decode(CLLocationDirection.self, forKey: .distance) expectedTravelTime = try container.decode(TimeInterval.self, forKey: .expectedTravelTime) - codes = road.codes transportType = try container.decodeIfPresent(TransportType.self, forKey: .transportType) ?? .none - - destinationCodes = road.destinationCodes - intersections = try container.decodeIfPresent([Intersection].self, forKey: .intersections) + let road = try Road(from: decoder) + codes = road.codes + exitCodes = road.exitCodes destinations = road.destinations + destinationCodes = road.destinationCodes let type = maneuverType if type == .takeRotary || type == .takeRoundabout { @@ -482,20 +518,6 @@ open class RouteStep: Codable { } } - private var destinationString: String? { - let destCodeString = destinationCodes?.tagValues(joinedBy: ",") - let destString = destinations?.tagValues(joinedBy: ",") - - if let destCodes = destCodeString { - guard let dests = destString else { - return destCodes - } - return destCodes + ": " + dests - } else { - return destString ?? nil - } - } - // MARK: Getting the Shape of the Step /** @@ -548,7 +570,7 @@ open class RouteStep: Codable { /** The location of the maneuver at the beginning of this step. */ - @objc public let maneuverLocation: CLLocationCoordinate2D + public let maneuverLocation: CLLocationCoordinate2D /** The number of exits from the previous maneuver up to and including this step’s maneuver. @@ -613,8 +635,6 @@ open class RouteStep: Codable { */ public let names: [String]? - fileprivate let name: String - /** A phonetic or phonemic transcription indicating how to pronounce the names in the `names` property. @@ -686,27 +706,34 @@ open class RouteStep: Codable { extension RouteStep: Equatable { public static func == (lhs: RouteStep, rhs: RouteStep) -> Bool { - return lhs.codes == rhs.codes && - lhs.shape == rhs.shape && - lhs.destinationCodes == rhs.destinationCodes && - lhs.destinations == rhs.destinations && - lhs.distance == rhs.distance && - lhs.drivingSide == rhs.drivingSide && - lhs.exitNames == rhs.exitNames && - lhs.exitCodes == rhs.exitCodes && + // Compare all the properties, from cheapest to most expensive to compare. + return lhs.initialHeading == rhs.initialHeading && + lhs.finalHeading == rhs.finalHeading && + lhs.instructions == rhs.instructions && lhs.exitIndex == rhs.exitIndex && - lhs.exitNames == rhs.exitNames && + lhs.distance == rhs.distance && lhs.expectedTravelTime == rhs.expectedTravelTime && - lhs.instructions == rhs.instructions && - lhs.instructionsDisplayedAlongStep == rhs.instructionsDisplayedAlongStep && - lhs.instructionsSpokenAlongStep == rhs.instructionsSpokenAlongStep && - lhs.intersections == rhs.intersections && + lhs.maneuverType == rhs.maneuverType && - lhs.maneuverLocation == rhs.maneuverLocation && lhs.maneuverDirection == rhs.maneuverDirection && - lhs.name == rhs.name && - lhs.phoneticNames == rhs.phoneticNames && + lhs.drivingSide == rhs.drivingSide && + lhs.transportType == rhs.transportType && + + lhs.maneuverLocation == rhs.maneuverLocation && + + lhs.exitCodes == rhs.exitCodes && + lhs.exitNames == rhs.exitNames && lhs.phoneticExitNames == rhs.phoneticExitNames && - lhs.transportType == rhs.transportType + lhs.names == rhs.names && + lhs.phoneticNames == rhs.phoneticNames && + lhs.codes == rhs.codes && + lhs.destinationCodes == rhs.destinationCodes && + lhs.destinations == rhs.destinations && + + lhs.intersections == rhs.intersections && + lhs.instructionsSpokenAlongStep == rhs.instructionsSpokenAlongStep && + lhs.instructionsDisplayedAlongStep == rhs.instructionsDisplayedAlongStep && + + lhs.shape == rhs.shape } } diff --git a/Tests/MapboxDirectionsTests/RouteStepTests.swift b/Tests/MapboxDirectionsTests/RouteStepTests.swift index 71e27961c..d944c2682 100644 --- a/Tests/MapboxDirectionsTests/RouteStepTests.swift +++ b/Tests/MapboxDirectionsTests/RouteStepTests.swift @@ -160,7 +160,7 @@ class RouteStepTests: XCTestCase { let encoded = try! encoder.encode(step) let roundTripJSON = String(data: encoded, encoding: .utf8) - XCTAssert(roundTripJSON == pass) + XCTAssertEqual(roundTripJSON, pass) } } @@ -250,6 +250,7 @@ fileprivate let pass = """ } ], \"distance\" : 236.90000000000001, + \"mode\" : \"driving\", \"geometry\" : \"asn_Ie_}pAdKxG\", \"maneuver\" : { \"location\" : [ diff --git a/Tests/MapboxDirectionsTests/V5Tests.swift b/Tests/MapboxDirectionsTests/V5Tests.swift index a60f67fd4..63039f006 100644 --- a/Tests/MapboxDirectionsTests/V5Tests.swift +++ b/Tests/MapboxDirectionsTests/V5Tests.swift @@ -304,10 +304,16 @@ class V5Tests: XCTestCase { encoder.userInfo[.options] = options encoder.outputFormatting = [.prettyPrinted] - let jsonData = try! encoder.encode(route) + var jsonData: Data? + XCTAssertNoThrow(jsonData = try encoder.encode(route)) + XCTAssertNotNil(jsonData) - let newRoute = try! decoder.decode(Route.self, from: jsonData) - test(newRoute, options: options) + if let jsonData = jsonData { + var newRoute: Route? + XCTAssertNoThrow(newRoute = try decoder.decode(Route.self, from: jsonData)) + XCTAssertNotNil(newRoute) + test(newRoute, options: options) + } } } #endif From 486481bf0d6dcd4263cf3fc7e87be5b4662ec50c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Minh=20Nguye=CC=82=CC=83n?= Date: Sat, 2 Nov 2019 13:53:36 -0700 Subject: [PATCH 53/89] Test round-tripping steps without diffing strings --- .../IntersectionTests.swift | 5 +- .../RouteStepTests.swift | 177 ++++++------------ 2 files changed, 61 insertions(+), 121 deletions(-) diff --git a/Tests/MapboxDirectionsTests/IntersectionTests.swift b/Tests/MapboxDirectionsTests/IntersectionTests.swift index f0dfee675..694f470a2 100644 --- a/Tests/MapboxDirectionsTests/IntersectionTests.swift +++ b/Tests/MapboxDirectionsTests/IntersectionTests.swift @@ -61,9 +61,8 @@ class IntersectionTests: XCTestCase { var encodedIntersectionsJSON: [[String: Any?]]? XCTAssertNoThrow(encodedIntersectionsJSON = try JSONSerialization.jsonObject(with: encodedData, options: []) as? [[String: Any?]]) XCTAssertNotNil(encodedIntersectionsJSON) - if let encodedIntersectionsJSON = encodedIntersectionsJSON { - XCTAssert(JSONSerialization.objectsAreEqual(intersectionsJSON, encodedIntersectionsJSON, approximate: true)) - } + + XCTAssert(JSONSerialization.objectsAreEqual(intersectionsJSON, encodedIntersectionsJSON, approximate: true)) } } } diff --git a/Tests/MapboxDirectionsTests/RouteStepTests.swift b/Tests/MapboxDirectionsTests/RouteStepTests.swift index d944c2682..aa94e089a 100644 --- a/Tests/MapboxDirectionsTests/RouteStepTests.swift +++ b/Tests/MapboxDirectionsTests/RouteStepTests.swift @@ -146,125 +146,66 @@ class RouteStepTests: XCTestCase { } func testCoding() { - let options = RouteOptions(coordinates: [CLLocationCoordinate2D(latitude: 0, longitude: 0), CLLocationCoordinate2D(latitude: 1, longitude: 1)]) - options.shapeFormat = .polyline - - let decoder = JSONDecoder() - decoder.userInfo[.options] = options - - let step = try! decoder.decode(RouteStep.self, from: routeStepJSON.data(using: .utf8)!) - - let encoder = JSONEncoder() - encoder.userInfo[.options] = options - encoder.outputFormatting = [.prettyPrinted] - let encoded = try! encoder.encode(step) - let roundTripJSON = String(data: encoded, encoding: .utf8) + let stepJSON = [ + "intersections": [ + [ + "out": 1, + "location": [13.424671, 52.508812], + "bearings": [120, 210, 300], + "entry": [false, true, true], + "in": 0, + "lanes": [ + ["valid": true, "indications": ["left"]], + ["valid": true, "indications": ["straight"]], + ["valid": false, "indications": ["right"]], + ], + ], + ], + "geometry": "asn_Ie_}pAdKxG", + "maneuver": [ + "bearing_after": 202, + "type": "turn", + "modifier": "left", + "bearing_before": 299, + "location": [13.424671, 52.508812], + "instruction": "Turn left onto Adalbertstraße", + ], + "duration": 59.1, + "distance": 236.9, + "driving_side": "right", + "weight": 59.1, + "name": "Adalbertstraße", + "mode": "driving", + ] as [String : Any?] + let stepData = try! JSONSerialization.data(withJSONObject: stepJSON, options: []) + var step: RouteStep? + XCTAssertNoThrow(step = try JSONDecoder().decode(RouteStep.self, from: stepData)) + XCTAssertNotNil(step) - XCTAssertEqual(roundTripJSON, pass) - } -} - -fileprivate let routeStepJSON = """ -{ - "intersections": [ - { - "out": 1, - "location": [ 13.424671, 52.508812 ], - "bearings": [ 120, 210, 300 ], - "entry": [ false, true, true ], - "in": 0, - "lanes": [ - { - "valid": true, - "indications": [ "left" ] - }, - { - "valid": true, - "indications": [ "straight" ] - }, - { - "valid": false, - "indications": [ "right" ] - } - ] - } - ], - "geometry": "asn_Ie_}pAdKxG", - "maneuver": { - "bearing_after": 202, - "type": "turn", - "modifier": "left", - "bearing_before": 299, - "location": [ 13.424671, 52.508812 ], - "instruction": "Turn left onto Adalbertstraße" - }, - "duration": 59.1, - "distance": 236.9, - "driving_side": "right", - "weight": 59.1, - "name": "Adalbertstraße", - "mode": "driving" -} -""" - -fileprivate let pass = """ -{ - \"intersections\" : [ - { - \"entry\" : [ - false, - true, - true - ], - \"in\" : 0, - \"out\" : 1, - \"lanes\" : [ - { - \"valid\" : true, - \"indications\" : [ - \"left\" - ] - }, - { - \"valid\" : true, - \"indications\" : [ - \"straight\" - ] - }, - { - \"valid\" : false, - \"indications\" : [ - \"right\" - ] + if let step = step { + let options = RouteOptions(coordinates: [ + CLLocationCoordinate2D(latitude: 0, longitude: 0), + CLLocationCoordinate2D(latitude: 1, longitude: 1), + ]) + options.shapeFormat = .polyline + + let encoder = JSONEncoder() + encoder.userInfo[.options] = options + var encodedStepData: Data? + XCTAssertNoThrow(encodedStepData = try encoder.encode(step)) + XCTAssertNotNil(encodedStepData) + + if let encodedStepData = encodedStepData { + var encodedStepJSON: Any? + XCTAssertNoThrow(encodedStepJSON = try JSONSerialization.jsonObject(with: encodedStepData, options: [])) + XCTAssertNotNil(encodedStepJSON) + + // https://github.com/mapbox/MapboxDirections.swift/issues/125 + var referenceStepJSON = stepJSON + referenceStepJSON.removeValue(forKey: "weight") + + XCTAssert(JSONSerialization.objectsAreEqual(referenceStepJSON, encodedStepJSON, approximate: true)) + } } - ], - \"location\" : [ - 13.424671, - 52.508811999999999 - ], - \"bearings\" : [ - 120, - 210, - 300 - ] } - ], - \"distance\" : 236.90000000000001, - \"mode\" : \"driving\", - \"geometry\" : \"asn_Ie_}pAdKxG\", - \"maneuver\" : { - \"location\" : [ - 13.424671, - 52.508811999999999 - ], - \"bearing_after\" : 202, - \"bearing_before\" : 299, - \"type\" : \"turn\", - \"modifier\" : \"left\", - \"instruction\" : \"Turn left onto Adalbertstraße\" - }, - \"driving_side\" : \"right\", - \"duration\" : 59.100000000000001, - \"name\" : \"Adalbertstraße\" } -""" From 2ef5df9872f334366c8d6d8589a7cd2b6c49e15b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Minh=20Nguye=CC=82=CC=83n?= Date: Sat, 2 Nov 2019 14:30:42 -0700 Subject: [PATCH 54/89] Flattened example application group structure --- MapboxDirections.xcodeproj/project.pbxproj | 12 ++---------- 1 file changed, 2 insertions(+), 10 deletions(-) diff --git a/MapboxDirections.xcodeproj/project.pbxproj b/MapboxDirections.xcodeproj/project.pbxproj index 8f62789ae..575f3d813 100644 --- a/MapboxDirections.xcodeproj/project.pbxproj +++ b/MapboxDirections.xcodeproj/project.pbxproj @@ -673,22 +673,14 @@ sourceTree = ""; }; DADD27B61E5AAAD800D31FAD /* Directions Example */ = { - isa = PBXGroup; - children = ( - DADD27CA1E5AAF4D00D31FAD /* Swift */, - DADD27CB1E5AAF5600D31FAD /* Supporting Files */, - ); - path = "Directions Example"; - sourceTree = ""; - }; - DADD27CA1E5AAF4D00D31FAD /* Swift */ = { isa = PBXGroup; children = ( DADD27B71E5AAAD800D31FAD /* AppDelegate.swift */, DADD27B91E5AAAD800D31FAD /* ViewController.swift */, C59094B4203B5C7F00EB2417 /* MBDrawingView.swift */, + DADD27CB1E5AAF5600D31FAD /* Supporting Files */, ); - name = Swift; + path = "Directions Example"; sourceTree = ""; }; DADD27CB1E5AAF5600D31FAD /* Supporting Files */ = { From 5f318ed7874b5f46a7201c5c36938778d7c08229 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Minh=20Nguye=CC=82=CC=83n?= Date: Sat, 2 Nov 2019 14:33:52 -0700 Subject: [PATCH 55/89] Removed class prefix from file names --- MapboxDirections.xcodeproj/project.pbxproj | 400 +++++++++--------- .../{MBCongestion.swift => Congestion.swift} | 0 ...ateBounds.swift => CoordinateBounds.swift} | 0 .../{MBDirections.swift => Directions.swift} | 0 ...sOptions.swift => DirectionsOptions.swift} | 0 ...onsResult.swift => DirectionsResult.swift} | 0 ...BIntersection.swift => Intersection.swift} | 0 .../{MBLane.swift => Lane.swift} | 0 ...eIndication.swift => LaneIndication.swift} | 0 .../Match/{MBMatch.swift => Match.swift} | 0 ...BMatchOptions.swift => MatchOptions.swift} | 0 .../{MBTracepoint.swift => Tracepoint.swift} | 0 .../{MBRoute.swift => Route.swift} | 0 .../{MBRouteLeg.swift => RouteLeg.swift} | 0 ...BRouteOptions.swift => RouteOptions.swift} | 0 .../{MBRouteStep.swift => RouteStep.swift} | 0 ...truction.swift => SpokenInstruction.swift} | 0 ...truction.swift => VisualInstruction.swift} | 0 ...er.swift => VisualInstructionBanner.swift} | 0 ...swift => VisualInstructionComponent.swift} | 0 .../{MBWaypoint.swift => Waypoint.swift} | 0 21 files changed, 200 insertions(+), 200 deletions(-) rename Sources/MapboxDirections/{MBCongestion.swift => Congestion.swift} (100%) rename Sources/MapboxDirections/{MBCoordinateBounds.swift => CoordinateBounds.swift} (100%) rename Sources/MapboxDirections/{MBDirections.swift => Directions.swift} (100%) rename Sources/MapboxDirections/{MBDirectionsOptions.swift => DirectionsOptions.swift} (100%) rename Sources/MapboxDirections/{MBDirectionsResult.swift => DirectionsResult.swift} (100%) rename Sources/MapboxDirections/{MBIntersection.swift => Intersection.swift} (100%) rename Sources/MapboxDirections/{MBLane.swift => Lane.swift} (100%) rename Sources/MapboxDirections/{MBLaneIndication.swift => LaneIndication.swift} (100%) rename Sources/MapboxDirections/Match/{MBMatch.swift => Match.swift} (100%) rename Sources/MapboxDirections/Match/{MBMatchOptions.swift => MatchOptions.swift} (100%) rename Sources/MapboxDirections/Match/{MBTracepoint.swift => Tracepoint.swift} (100%) rename Sources/MapboxDirections/{MBRoute.swift => Route.swift} (100%) rename Sources/MapboxDirections/{MBRouteLeg.swift => RouteLeg.swift} (100%) rename Sources/MapboxDirections/{MBRouteOptions.swift => RouteOptions.swift} (100%) rename Sources/MapboxDirections/{MBRouteStep.swift => RouteStep.swift} (100%) rename Sources/MapboxDirections/{MBSpokenInstruction.swift => SpokenInstruction.swift} (100%) rename Sources/MapboxDirections/{MBVisualInstruction.swift => VisualInstruction.swift} (100%) rename Sources/MapboxDirections/{MBVisualInstructionBanner.swift => VisualInstructionBanner.swift} (100%) rename Sources/MapboxDirections/{MBVisualInstructionComponent.swift => VisualInstructionComponent.swift} (100%) rename Sources/MapboxDirections/{MBWaypoint.swift => Waypoint.swift} (100%) diff --git a/MapboxDirections.xcodeproj/project.pbxproj b/MapboxDirections.xcodeproj/project.pbxproj index 575f3d813..eeceff68d 100644 --- a/MapboxDirections.xcodeproj/project.pbxproj +++ b/MapboxDirections.xcodeproj/project.pbxproj @@ -17,10 +17,10 @@ 35D92FF0218203AB000C78CB /* 2018-10-16-Liechtenstein.tar in Resources */ = {isa = PBXBuildFile; fileRef = 35D92FEF218203AA000C78CB /* 2018-10-16-Liechtenstein.tar */; }; 35D92FF1218203AB000C78CB /* 2018-10-16-Liechtenstein.tar in Resources */ = {isa = PBXBuildFile; fileRef = 35D92FEF218203AA000C78CB /* 2018-10-16-Liechtenstein.tar */; }; 35D92FF2218203AB000C78CB /* 2018-10-16-Liechtenstein.tar in Resources */ = {isa = PBXBuildFile; fileRef = 35D92FEF218203AA000C78CB /* 2018-10-16-Liechtenstein.tar */; }; - 35DBF005217DF0D90009D2AE /* MBCoordinateBounds.swift in Sources */ = {isa = PBXBuildFile; fileRef = 35DBF004217DF0D90009D2AE /* MBCoordinateBounds.swift */; }; - 35DBF006217DF0D90009D2AE /* MBCoordinateBounds.swift in Sources */ = {isa = PBXBuildFile; fileRef = 35DBF004217DF0D90009D2AE /* MBCoordinateBounds.swift */; }; - 35DBF007217DF0D90009D2AE /* MBCoordinateBounds.swift in Sources */ = {isa = PBXBuildFile; fileRef = 35DBF004217DF0D90009D2AE /* MBCoordinateBounds.swift */; }; - 35DBF008217DF0D90009D2AE /* MBCoordinateBounds.swift in Sources */ = {isa = PBXBuildFile; fileRef = 35DBF004217DF0D90009D2AE /* MBCoordinateBounds.swift */; }; + 35DBF005217DF0D90009D2AE /* CoordinateBounds.swift in Sources */ = {isa = PBXBuildFile; fileRef = 35DBF004217DF0D90009D2AE /* CoordinateBounds.swift */; }; + 35DBF006217DF0D90009D2AE /* CoordinateBounds.swift in Sources */ = {isa = PBXBuildFile; fileRef = 35DBF004217DF0D90009D2AE /* CoordinateBounds.swift */; }; + 35DBF007217DF0D90009D2AE /* CoordinateBounds.swift in Sources */ = {isa = PBXBuildFile; fileRef = 35DBF004217DF0D90009D2AE /* CoordinateBounds.swift */; }; + 35DBF008217DF0D90009D2AE /* CoordinateBounds.swift in Sources */ = {isa = PBXBuildFile; fileRef = 35DBF004217DF0D90009D2AE /* CoordinateBounds.swift */; }; 35DBF00F217E17A30009D2AE /* HTTPURLResponse.swift in Sources */ = {isa = PBXBuildFile; fileRef = 35DBF00E217E17A30009D2AE /* HTTPURLResponse.swift */; }; 35DBF010217E17A30009D2AE /* HTTPURLResponse.swift in Sources */ = {isa = PBXBuildFile; fileRef = 35DBF00E217E17A30009D2AE /* HTTPURLResponse.swift */; }; 35DBF011217E17A30009D2AE /* HTTPURLResponse.swift in Sources */ = {isa = PBXBuildFile; fileRef = 35DBF00E217E17A30009D2AE /* HTTPURLResponse.swift */; }; @@ -31,10 +31,10 @@ 35DBF019217F38A30009D2AE /* versions.json in Resources */ = {isa = PBXBuildFile; fileRef = 35DBF018217F38A30009D2AE /* versions.json */; }; 35DBF01A217F38A30009D2AE /* versions.json in Resources */ = {isa = PBXBuildFile; fileRef = 35DBF018217F38A30009D2AE /* versions.json */; }; 35DBF01B217F38A30009D2AE /* versions.json in Resources */ = {isa = PBXBuildFile; fileRef = 35DBF018217F38A30009D2AE /* versions.json */; }; - 35EFD00B207DFACA00BF3873 /* MBVisualInstruction.swift in Sources */ = {isa = PBXBuildFile; fileRef = 35EFD00A207DFACA00BF3873 /* MBVisualInstruction.swift */; }; - 35EFD00C207DFACA00BF3873 /* MBVisualInstruction.swift in Sources */ = {isa = PBXBuildFile; fileRef = 35EFD00A207DFACA00BF3873 /* MBVisualInstruction.swift */; }; - 35EFD00D207DFACA00BF3873 /* MBVisualInstruction.swift in Sources */ = {isa = PBXBuildFile; fileRef = 35EFD00A207DFACA00BF3873 /* MBVisualInstruction.swift */; }; - 35EFD00E207DFACA00BF3873 /* MBVisualInstruction.swift in Sources */ = {isa = PBXBuildFile; fileRef = 35EFD00A207DFACA00BF3873 /* MBVisualInstruction.swift */; }; + 35EFD00B207DFACA00BF3873 /* VisualInstruction.swift in Sources */ = {isa = PBXBuildFile; fileRef = 35EFD00A207DFACA00BF3873 /* VisualInstruction.swift */; }; + 35EFD00C207DFACA00BF3873 /* VisualInstruction.swift in Sources */ = {isa = PBXBuildFile; fileRef = 35EFD00A207DFACA00BF3873 /* VisualInstruction.swift */; }; + 35EFD00D207DFACA00BF3873 /* VisualInstruction.swift in Sources */ = {isa = PBXBuildFile; fileRef = 35EFD00A207DFACA00BF3873 /* VisualInstruction.swift */; }; + 35EFD00E207DFACA00BF3873 /* VisualInstruction.swift in Sources */ = {isa = PBXBuildFile; fileRef = 35EFD00A207DFACA00BF3873 /* VisualInstruction.swift */; }; 431E93BF234664A200A71B44 /* DrivingSide.swift in Sources */ = {isa = PBXBuildFile; fileRef = 431E93BE234664A200A71B44 /* DrivingSide.swift */; }; 431E93C0234664A200A71B44 /* DrivingSide.swift in Sources */ = {isa = PBXBuildFile; fileRef = 431E93BE234664A200A71B44 /* DrivingSide.swift */; }; 431E93C1234664A200A71B44 /* DrivingSide.swift in Sources */ = {isa = PBXBuildFile; fileRef = 431E93BE234664A200A71B44 /* DrivingSide.swift */; }; @@ -91,19 +91,19 @@ AEAB391120D9469A008F4E54 /* subVisualInstructions.json in Resources */ = {isa = PBXBuildFile; fileRef = AEAB391020D94699008F4E54 /* subVisualInstructions.json */; }; AEAB391220D9469A008F4E54 /* subVisualInstructions.json in Resources */ = {isa = PBXBuildFile; fileRef = AEAB391020D94699008F4E54 /* subVisualInstructions.json */; }; AEAB391320D9469A008F4E54 /* subVisualInstructions.json in Resources */ = {isa = PBXBuildFile; fileRef = AEAB391020D94699008F4E54 /* subVisualInstructions.json */; }; - AEDC211D20B6104B0052DED8 /* MBVisualInstructionComponent.swift in Sources */ = {isa = PBXBuildFile; fileRef = AEDC211C20B6104A0052DED8 /* MBVisualInstructionComponent.swift */; }; - AEDC212120B6125C0052DED8 /* MBVisualInstructionComponent.swift in Sources */ = {isa = PBXBuildFile; fileRef = AEDC211C20B6104A0052DED8 /* MBVisualInstructionComponent.swift */; }; - AEDC212220B6125D0052DED8 /* MBVisualInstructionComponent.swift in Sources */ = {isa = PBXBuildFile; fileRef = AEDC211C20B6104A0052DED8 /* MBVisualInstructionComponent.swift */; }; - AEDC212320B6125E0052DED8 /* MBVisualInstructionComponent.swift in Sources */ = {isa = PBXBuildFile; fileRef = AEDC211C20B6104A0052DED8 /* MBVisualInstructionComponent.swift */; }; + AEDC211D20B6104B0052DED8 /* VisualInstructionComponent.swift in Sources */ = {isa = PBXBuildFile; fileRef = AEDC211C20B6104A0052DED8 /* VisualInstructionComponent.swift */; }; + AEDC212120B6125C0052DED8 /* VisualInstructionComponent.swift in Sources */ = {isa = PBXBuildFile; fileRef = AEDC211C20B6104A0052DED8 /* VisualInstructionComponent.swift */; }; + AEDC212220B6125D0052DED8 /* VisualInstructionComponent.swift in Sources */ = {isa = PBXBuildFile; fileRef = AEDC211C20B6104A0052DED8 /* VisualInstructionComponent.swift */; }; + AEDC212320B6125E0052DED8 /* VisualInstructionComponent.swift in Sources */ = {isa = PBXBuildFile; fileRef = AEDC211C20B6104A0052DED8 /* VisualInstructionComponent.swift */; }; C51538CC1E807FF00093FF3E /* AttributeOptions.swift in Sources */ = {isa = PBXBuildFile; fileRef = C51538CB1E807FF00093FF3E /* AttributeOptions.swift */; }; C5247D711E818A24004B6154 /* AnnotationTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = C5247D701E818A24004B6154 /* AnnotationTests.swift */; }; - C52552B91FA15D5900B1545C /* MBVisualInstructionBanner.swift in Sources */ = {isa = PBXBuildFile; fileRef = C52552B81FA15D5900B1545C /* MBVisualInstructionBanner.swift */; }; - C52552BA1FA15D5E00B1545C /* MBVisualInstructionBanner.swift in Sources */ = {isa = PBXBuildFile; fileRef = C52552B81FA15D5900B1545C /* MBVisualInstructionBanner.swift */; }; - C52552BB1FA15D5F00B1545C /* MBVisualInstructionBanner.swift in Sources */ = {isa = PBXBuildFile; fileRef = C52552B81FA15D5900B1545C /* MBVisualInstructionBanner.swift */; }; - C52552BC1FA15D6000B1545C /* MBVisualInstructionBanner.swift in Sources */ = {isa = PBXBuildFile; fileRef = C52552B81FA15D5900B1545C /* MBVisualInstructionBanner.swift */; }; - C52CE38F1F6AF63C0069963D /* MBSpokenInstruction.swift in Sources */ = {isa = PBXBuildFile; fileRef = C55FB44A1F6AEBF6006BD1E9 /* MBSpokenInstruction.swift */; }; - C52CE3901F6AF63D0069963D /* MBSpokenInstruction.swift in Sources */ = {isa = PBXBuildFile; fileRef = C55FB44A1F6AEBF6006BD1E9 /* MBSpokenInstruction.swift */; }; - C52CE3911F6AF63E0069963D /* MBSpokenInstruction.swift in Sources */ = {isa = PBXBuildFile; fileRef = C55FB44A1F6AEBF6006BD1E9 /* MBSpokenInstruction.swift */; }; + C52552B91FA15D5900B1545C /* VisualInstructionBanner.swift in Sources */ = {isa = PBXBuildFile; fileRef = C52552B81FA15D5900B1545C /* VisualInstructionBanner.swift */; }; + C52552BA1FA15D5E00B1545C /* VisualInstructionBanner.swift in Sources */ = {isa = PBXBuildFile; fileRef = C52552B81FA15D5900B1545C /* VisualInstructionBanner.swift */; }; + C52552BB1FA15D5F00B1545C /* VisualInstructionBanner.swift in Sources */ = {isa = PBXBuildFile; fileRef = C52552B81FA15D5900B1545C /* VisualInstructionBanner.swift */; }; + C52552BC1FA15D6000B1545C /* VisualInstructionBanner.swift in Sources */ = {isa = PBXBuildFile; fileRef = C52552B81FA15D5900B1545C /* VisualInstructionBanner.swift */; }; + C52CE38F1F6AF63C0069963D /* SpokenInstruction.swift in Sources */ = {isa = PBXBuildFile; fileRef = C55FB44A1F6AEBF6006BD1E9 /* SpokenInstruction.swift */; }; + C52CE3901F6AF63D0069963D /* SpokenInstruction.swift in Sources */ = {isa = PBXBuildFile; fileRef = C55FB44A1F6AEBF6006BD1E9 /* SpokenInstruction.swift */; }; + C52CE3911F6AF63E0069963D /* SpokenInstruction.swift in Sources */ = {isa = PBXBuildFile; fileRef = C55FB44A1F6AEBF6006BD1E9 /* SpokenInstruction.swift */; }; C52CE3931F6AF6E70069963D /* IntructionsTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = C52CE3921F6AF6E70069963D /* IntructionsTests.swift */; }; C53A02261E92C26E009837BD /* AttributeOptions.swift in Sources */ = {isa = PBXBuildFile; fileRef = C51538CB1E807FF00093FF3E /* AttributeOptions.swift */; }; C53A02271E92C26F009837BD /* AttributeOptions.swift in Sources */ = {isa = PBXBuildFile; fileRef = C51538CB1E807FF00093FF3E /* AttributeOptions.swift */; }; @@ -112,41 +112,41 @@ C53A022A1E92C27B009837BD /* AnnotationTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = C5247D701E818A24004B6154 /* AnnotationTests.swift */; }; C53A022B1E92C281009837BD /* annotation.json in Resources */ = {isa = PBXBuildFile; fileRef = C5A3D3971E8188FE00D494A0 /* annotation.json */; }; C53A022C1E92C281009837BD /* annotation.json in Resources */ = {isa = PBXBuildFile; fileRef = C5A3D3971E8188FE00D494A0 /* annotation.json */; }; - C5434B8A200693D00069E887 /* MBTracepoint.swift in Sources */ = {isa = PBXBuildFile; fileRef = C5434B89200693D00069E887 /* MBTracepoint.swift */; }; - C5434B8C200695A50069E887 /* MBMatchOptions.swift in Sources */ = {isa = PBXBuildFile; fileRef = C5434B8B200695A50069E887 /* MBMatchOptions.swift */; }; + C5434B8A200693D00069E887 /* Tracepoint.swift in Sources */ = {isa = PBXBuildFile; fileRef = C5434B89200693D00069E887 /* Tracepoint.swift */; }; + C5434B8C200695A50069E887 /* MatchOptions.swift in Sources */ = {isa = PBXBuildFile; fileRef = C5434B8B200695A50069E887 /* MatchOptions.swift */; }; C54549FC2073F1EF002E273F /* Array.swift in Sources */ = {isa = PBXBuildFile; fileRef = C582BA2D2073ED6300647DAA /* Array.swift */; }; C54549FD2073F1F0002E273F /* Array.swift in Sources */ = {isa = PBXBuildFile; fileRef = C582BA2D2073ED6300647DAA /* Array.swift */; }; C54549FE2073F1F1002E273F /* Array.swift in Sources */ = {isa = PBXBuildFile; fileRef = C582BA2D2073ED6300647DAA /* Array.swift */; }; - C547EC691DB59F8F009817F3 /* MBLane.swift in Sources */ = {isa = PBXBuildFile; fileRef = C57D55071DB58C0200B94B74 /* MBLane.swift */; }; - C547EC6A1DB59F90009817F3 /* MBLane.swift in Sources */ = {isa = PBXBuildFile; fileRef = C57D55071DB58C0200B94B74 /* MBLane.swift */; }; - C547EC6B1DB59F91009817F3 /* MBLane.swift in Sources */ = {isa = PBXBuildFile; fileRef = C57D55071DB58C0200B94B74 /* MBLane.swift */; }; - C55FB44B1F6AEBF6006BD1E9 /* MBSpokenInstruction.swift in Sources */ = {isa = PBXBuildFile; fileRef = C55FB44A1F6AEBF6006BD1E9 /* MBSpokenInstruction.swift */; }; - C57D55011DB5669600B94B74 /* MBIntersection.swift in Sources */ = {isa = PBXBuildFile; fileRef = C57D55001DB5669600B94B74 /* MBIntersection.swift */; }; - C57D55031DB566A700B94B74 /* MBIntersection.swift in Sources */ = {isa = PBXBuildFile; fileRef = C57D55001DB5669600B94B74 /* MBIntersection.swift */; }; - C57D55041DB566A800B94B74 /* MBIntersection.swift in Sources */ = {isa = PBXBuildFile; fileRef = C57D55001DB5669600B94B74 /* MBIntersection.swift */; }; - C57D55051DB566A900B94B74 /* MBIntersection.swift in Sources */ = {isa = PBXBuildFile; fileRef = C57D55001DB5669600B94B74 /* MBIntersection.swift */; }; - C57D55081DB58C0200B94B74 /* MBLane.swift in Sources */ = {isa = PBXBuildFile; fileRef = C57D55071DB58C0200B94B74 /* MBLane.swift */; }; + C547EC691DB59F8F009817F3 /* Lane.swift in Sources */ = {isa = PBXBuildFile; fileRef = C57D55071DB58C0200B94B74 /* Lane.swift */; }; + C547EC6A1DB59F90009817F3 /* Lane.swift in Sources */ = {isa = PBXBuildFile; fileRef = C57D55071DB58C0200B94B74 /* Lane.swift */; }; + C547EC6B1DB59F91009817F3 /* Lane.swift in Sources */ = {isa = PBXBuildFile; fileRef = C57D55071DB58C0200B94B74 /* Lane.swift */; }; + C55FB44B1F6AEBF6006BD1E9 /* SpokenInstruction.swift in Sources */ = {isa = PBXBuildFile; fileRef = C55FB44A1F6AEBF6006BD1E9 /* SpokenInstruction.swift */; }; + C57D55011DB5669600B94B74 /* Intersection.swift in Sources */ = {isa = PBXBuildFile; fileRef = C57D55001DB5669600B94B74 /* Intersection.swift */; }; + C57D55031DB566A700B94B74 /* Intersection.swift in Sources */ = {isa = PBXBuildFile; fileRef = C57D55001DB5669600B94B74 /* Intersection.swift */; }; + C57D55041DB566A800B94B74 /* Intersection.swift in Sources */ = {isa = PBXBuildFile; fileRef = C57D55001DB5669600B94B74 /* Intersection.swift */; }; + C57D55051DB566A900B94B74 /* Intersection.swift in Sources */ = {isa = PBXBuildFile; fileRef = C57D55001DB5669600B94B74 /* Intersection.swift */; }; + C57D55081DB58C0200B94B74 /* Lane.swift in Sources */ = {isa = PBXBuildFile; fileRef = C57D55071DB58C0200B94B74 /* Lane.swift */; }; C582BA2E2073ED6300647DAA /* Array.swift in Sources */ = {isa = PBXBuildFile; fileRef = C582BA2D2073ED6300647DAA /* Array.swift */; }; C584E3F71F201C7B00BBC9BB /* RoadClasses.swift in Sources */ = {isa = PBXBuildFile; fileRef = C59426061F1EA6C400C8E59C /* RoadClasses.swift */; }; C584E3F81F201C7C00BBC9BB /* RoadClasses.swift in Sources */ = {isa = PBXBuildFile; fileRef = C59426061F1EA6C400C8E59C /* RoadClasses.swift */; }; C584E3F91F201C7D00BBC9BB /* RoadClasses.swift in Sources */ = {isa = PBXBuildFile; fileRef = C59426061F1EA6C400C8E59C /* RoadClasses.swift */; }; - C58EA7AA1E9D7EAD008F98CE /* MBCongestion.swift in Sources */ = {isa = PBXBuildFile; fileRef = C58EA7A91E9D7EAD008F98CE /* MBCongestion.swift */; }; - C58EA7AB1E9D7F73008F98CE /* MBCongestion.swift in Sources */ = {isa = PBXBuildFile; fileRef = C58EA7A91E9D7EAD008F98CE /* MBCongestion.swift */; }; - C58EA7AC1E9D7F74008F98CE /* MBCongestion.swift in Sources */ = {isa = PBXBuildFile; fileRef = C58EA7A91E9D7EAD008F98CE /* MBCongestion.swift */; }; - C58EA7AD1E9D7F75008F98CE /* MBCongestion.swift in Sources */ = {isa = PBXBuildFile; fileRef = C58EA7A91E9D7EAD008F98CE /* MBCongestion.swift */; }; + C58EA7AA1E9D7EAD008F98CE /* Congestion.swift in Sources */ = {isa = PBXBuildFile; fileRef = C58EA7A91E9D7EAD008F98CE /* Congestion.swift */; }; + C58EA7AB1E9D7F73008F98CE /* Congestion.swift in Sources */ = {isa = PBXBuildFile; fileRef = C58EA7A91E9D7EAD008F98CE /* Congestion.swift */; }; + C58EA7AC1E9D7F74008F98CE /* Congestion.swift in Sources */ = {isa = PBXBuildFile; fileRef = C58EA7A91E9D7EAD008F98CE /* Congestion.swift */; }; + C58EA7AD1E9D7F75008F98CE /* Congestion.swift in Sources */ = {isa = PBXBuildFile; fileRef = C58EA7A91E9D7EAD008F98CE /* Congestion.swift */; }; C59094B5203B5C7F00EB2417 /* MBDrawingView.swift in Sources */ = {isa = PBXBuildFile; fileRef = C59094B4203B5C7F00EB2417 /* MBDrawingView.swift */; }; - C59094BF203B800300EB2417 /* MBDirectionsOptions.swift in Sources */ = {isa = PBXBuildFile; fileRef = C59094BE203B800300EB2417 /* MBDirectionsOptions.swift */; }; - C59094C1203DE6BC00EB2417 /* MBDirectionsResult.swift in Sources */ = {isa = PBXBuildFile; fileRef = C59094C0203DE6BC00EB2417 /* MBDirectionsResult.swift */; }; + C59094BF203B800300EB2417 /* DirectionsOptions.swift in Sources */ = {isa = PBXBuildFile; fileRef = C59094BE203B800300EB2417 /* DirectionsOptions.swift */; }; + C59094C1203DE6BC00EB2417 /* DirectionsResult.swift in Sources */ = {isa = PBXBuildFile; fileRef = C59094C0203DE6BC00EB2417 /* DirectionsResult.swift */; }; C59426071F1EA6C400C8E59C /* RoadClasses.swift in Sources */ = {isa = PBXBuildFile; fileRef = C59426061F1EA6C400C8E59C /* RoadClasses.swift */; }; C59666392048A20E00C45CE5 /* RoutableMatchTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = C59666382048A20E00C45CE5 /* RoutableMatchTests.swift */; }; C596663A2048AECD00C45CE5 /* RoutableMatchTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = C59666382048A20E00C45CE5 /* RoutableMatchTests.swift */; }; C596663B2048AECE00C45CE5 /* RoutableMatchTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = C59666382048A20E00C45CE5 /* RoutableMatchTests.swift */; }; - C5990B4A2045E72800D7DFD4 /* MBDirectionsResult.swift in Sources */ = {isa = PBXBuildFile; fileRef = C59094C0203DE6BC00EB2417 /* MBDirectionsResult.swift */; }; - C5990B4B2045E72900D7DFD4 /* MBDirectionsResult.swift in Sources */ = {isa = PBXBuildFile; fileRef = C59094C0203DE6BC00EB2417 /* MBDirectionsResult.swift */; }; - C5990B4C2045E72A00D7DFD4 /* MBDirectionsResult.swift in Sources */ = {isa = PBXBuildFile; fileRef = C59094C0203DE6BC00EB2417 /* MBDirectionsResult.swift */; }; - C5990B4D2045E74800D7DFD4 /* MBDirectionsOptions.swift in Sources */ = {isa = PBXBuildFile; fileRef = C59094BE203B800300EB2417 /* MBDirectionsOptions.swift */; }; - C5990B4E2045E74900D7DFD4 /* MBDirectionsOptions.swift in Sources */ = {isa = PBXBuildFile; fileRef = C59094BE203B800300EB2417 /* MBDirectionsOptions.swift */; }; - C5990B4F2045E74A00D7DFD4 /* MBDirectionsOptions.swift in Sources */ = {isa = PBXBuildFile; fileRef = C59094BE203B800300EB2417 /* MBDirectionsOptions.swift */; }; + C5990B4A2045E72800D7DFD4 /* DirectionsResult.swift in Sources */ = {isa = PBXBuildFile; fileRef = C59094C0203DE6BC00EB2417 /* DirectionsResult.swift */; }; + C5990B4B2045E72900D7DFD4 /* DirectionsResult.swift in Sources */ = {isa = PBXBuildFile; fileRef = C59094C0203DE6BC00EB2417 /* DirectionsResult.swift */; }; + C5990B4C2045E72A00D7DFD4 /* DirectionsResult.swift in Sources */ = {isa = PBXBuildFile; fileRef = C59094C0203DE6BC00EB2417 /* DirectionsResult.swift */; }; + C5990B4D2045E74800D7DFD4 /* DirectionsOptions.swift in Sources */ = {isa = PBXBuildFile; fileRef = C59094BE203B800300EB2417 /* DirectionsOptions.swift */; }; + C5990B4E2045E74900D7DFD4 /* DirectionsOptions.swift in Sources */ = {isa = PBXBuildFile; fileRef = C59094BE203B800300EB2417 /* DirectionsOptions.swift */; }; + C5990B4F2045E74A00D7DFD4 /* DirectionsOptions.swift in Sources */ = {isa = PBXBuildFile; fileRef = C59094BE203B800300EB2417 /* DirectionsOptions.swift */; }; C5A3D3981E8188FE00D494A0 /* annotation.json in Resources */ = {isa = PBXBuildFile; fileRef = C5A3D3971E8188FE00D494A0 /* annotation.json */; }; C5C0D6342058523E003A3B1D /* null-tracepoint.json in Resources */ = {isa = PBXBuildFile; fileRef = C5C0D6332058523E003A3B1D /* null-tracepoint.json */; }; C5C0D63520586419003A3B1D /* null-tracepoint.json in Resources */ = {isa = PBXBuildFile; fileRef = C5C0D6332058523E003A3B1D /* null-tracepoint.json */; }; @@ -156,16 +156,16 @@ C5D1D7F21F6AF92600A1C4F1 /* instructions.json in Resources */ = {isa = PBXBuildFile; fileRef = C5D1D7EF1F6AF91700A1C4F1 /* instructions.json */; }; C5D1D7F31F6AFBD600A1C4F1 /* IntructionsTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = C52CE3921F6AF6E70069963D /* IntructionsTests.swift */; }; C5D1D7F41F6AFBD600A1C4F1 /* IntructionsTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = C52CE3921F6AF6E70069963D /* IntructionsTests.swift */; }; - C5DAAC9A20191675001F9261 /* MBMatch.swift in Sources */ = {isa = PBXBuildFile; fileRef = C5DAAC9920191675001F9261 /* MBMatch.swift */; }; - C5DAAC9B2019167C001F9261 /* MBMatch.swift in Sources */ = {isa = PBXBuildFile; fileRef = C5DAAC9920191675001F9261 /* MBMatch.swift */; }; - C5DAAC9C2019167D001F9261 /* MBMatch.swift in Sources */ = {isa = PBXBuildFile; fileRef = C5DAAC9920191675001F9261 /* MBMatch.swift */; }; - C5DAAC9D2019167E001F9261 /* MBMatch.swift in Sources */ = {isa = PBXBuildFile; fileRef = C5DAAC9920191675001F9261 /* MBMatch.swift */; }; - C5DAAC9F20195AAE001F9261 /* MBTracepoint.swift in Sources */ = {isa = PBXBuildFile; fileRef = C5434B89200693D00069E887 /* MBTracepoint.swift */; }; - C5DAACA020195AAF001F9261 /* MBTracepoint.swift in Sources */ = {isa = PBXBuildFile; fileRef = C5434B89200693D00069E887 /* MBTracepoint.swift */; }; - C5DAACA120195AAF001F9261 /* MBTracepoint.swift in Sources */ = {isa = PBXBuildFile; fileRef = C5434B89200693D00069E887 /* MBTracepoint.swift */; }; - C5DAACA220195AB2001F9261 /* MBMatchOptions.swift in Sources */ = {isa = PBXBuildFile; fileRef = C5434B8B200695A50069E887 /* MBMatchOptions.swift */; }; - C5DAACA320195AB2001F9261 /* MBMatchOptions.swift in Sources */ = {isa = PBXBuildFile; fileRef = C5434B8B200695A50069E887 /* MBMatchOptions.swift */; }; - C5DAACA420195AB3001F9261 /* MBMatchOptions.swift in Sources */ = {isa = PBXBuildFile; fileRef = C5434B8B200695A50069E887 /* MBMatchOptions.swift */; }; + C5DAAC9A20191675001F9261 /* Match.swift in Sources */ = {isa = PBXBuildFile; fileRef = C5DAAC9920191675001F9261 /* Match.swift */; }; + C5DAAC9B2019167C001F9261 /* Match.swift in Sources */ = {isa = PBXBuildFile; fileRef = C5DAAC9920191675001F9261 /* Match.swift */; }; + C5DAAC9C2019167D001F9261 /* Match.swift in Sources */ = {isa = PBXBuildFile; fileRef = C5DAAC9920191675001F9261 /* Match.swift */; }; + C5DAAC9D2019167E001F9261 /* Match.swift in Sources */ = {isa = PBXBuildFile; fileRef = C5DAAC9920191675001F9261 /* Match.swift */; }; + C5DAAC9F20195AAE001F9261 /* Tracepoint.swift in Sources */ = {isa = PBXBuildFile; fileRef = C5434B89200693D00069E887 /* Tracepoint.swift */; }; + C5DAACA020195AAF001F9261 /* Tracepoint.swift in Sources */ = {isa = PBXBuildFile; fileRef = C5434B89200693D00069E887 /* Tracepoint.swift */; }; + C5DAACA120195AAF001F9261 /* Tracepoint.swift in Sources */ = {isa = PBXBuildFile; fileRef = C5434B89200693D00069E887 /* Tracepoint.swift */; }; + C5DAACA220195AB2001F9261 /* MatchOptions.swift in Sources */ = {isa = PBXBuildFile; fileRef = C5434B8B200695A50069E887 /* MatchOptions.swift */; }; + C5DAACA320195AB2001F9261 /* MatchOptions.swift in Sources */ = {isa = PBXBuildFile; fileRef = C5434B8B200695A50069E887 /* MatchOptions.swift */; }; + C5DAACA420195AB3001F9261 /* MatchOptions.swift in Sources */ = {isa = PBXBuildFile; fileRef = C5434B8B200695A50069E887 /* MatchOptions.swift */; }; C5DAACAF201AA92B001F9261 /* MatchTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = C5DAACAE201AA92B001F9261 /* MatchTests.swift */; }; C5DAACB0201AA92B001F9261 /* MatchTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = C5DAACAE201AA92B001F9261 /* MatchTests.swift */; }; C5DAACB1201AA92B001F9261 /* MatchTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = C5DAACAE201AA92B001F9261 /* MatchTests.swift */; }; @@ -173,37 +173,37 @@ C5DAACB5201AA9A7001F9261 /* match.json in Resources */ = {isa = PBXBuildFile; fileRef = C5DAACB3201AA9A7001F9261 /* match.json */; }; C5DAACB6201AA9A7001F9261 /* match.json in Resources */ = {isa = PBXBuildFile; fileRef = C5DAACB3201AA9A7001F9261 /* match.json */; }; DA1A10C61D00F969009F82FA /* MapboxDirections.h in Headers */ = {isa = PBXBuildFile; fileRef = DA6C9D8A1CAE442B00094FBC /* MapboxDirections.h */; settings = {ATTRIBUTES = (Public, ); }; }; - DA1A10C71D00F969009F82FA /* MBDirections.swift in Sources */ = {isa = PBXBuildFile; fileRef = DD6254731AE70CB700017857 /* MBDirections.swift */; }; - DA1A10C81D00F969009F82FA /* MBRoute.swift in Sources */ = {isa = PBXBuildFile; fileRef = DAC05F171CFC075300FA0071 /* MBRoute.swift */; }; - DA1A10C91D00F969009F82FA /* MBRouteLeg.swift in Sources */ = {isa = PBXBuildFile; fileRef = DAC05F191CFC077C00FA0071 /* MBRouteLeg.swift */; }; - DA1A10CA1D00F969009F82FA /* MBRouteOptions.swift in Sources */ = {isa = PBXBuildFile; fileRef = DA2E03EA1CB0E13D00D1269A /* MBRouteOptions.swift */; }; - DA1A10CB1D00F969009F82FA /* MBRouteStep.swift in Sources */ = {isa = PBXBuildFile; fileRef = DA2E03E81CB0E0B000D1269A /* MBRouteStep.swift */; }; - DA1A10CC1D00F969009F82FA /* MBWaypoint.swift in Sources */ = {isa = PBXBuildFile; fileRef = DAC05F151CFBFAC400FA0071 /* MBWaypoint.swift */; }; + DA1A10C71D00F969009F82FA /* Directions.swift in Sources */ = {isa = PBXBuildFile; fileRef = DD6254731AE70CB700017857 /* Directions.swift */; }; + DA1A10C81D00F969009F82FA /* Route.swift in Sources */ = {isa = PBXBuildFile; fileRef = DAC05F171CFC075300FA0071 /* Route.swift */; }; + DA1A10C91D00F969009F82FA /* RouteLeg.swift in Sources */ = {isa = PBXBuildFile; fileRef = DAC05F191CFC077C00FA0071 /* RouteLeg.swift */; }; + DA1A10CA1D00F969009F82FA /* RouteOptions.swift in Sources */ = {isa = PBXBuildFile; fileRef = DA2E03EA1CB0E13D00D1269A /* RouteOptions.swift */; }; + DA1A10CB1D00F969009F82FA /* RouteStep.swift in Sources */ = {isa = PBXBuildFile; fileRef = DA2E03E81CB0E0B000D1269A /* RouteStep.swift */; }; + DA1A10CC1D00F969009F82FA /* Waypoint.swift in Sources */ = {isa = PBXBuildFile; fileRef = DAC05F151CFBFAC400FA0071 /* Waypoint.swift */; }; DA1A10CD1D00F972009F82FA /* V5Tests.swift in Sources */ = {isa = PBXBuildFile; fileRef = DA6C9DAB1CAEC72800094FBC /* V5Tests.swift */; }; DA1A10CE1D00F972009F82FA /* Fixture.swift in Sources */ = {isa = PBXBuildFile; fileRef = DA6C9DB11CAECA0E00094FBC /* Fixture.swift */; }; DA1A10CF1D00F975009F82FA /* v5_driving_dc_polyline.json in Resources */ = {isa = PBXBuildFile; fileRef = DAC05F1B1CFC1E5300FA0071 /* v5_driving_dc_polyline.json */; }; DA1A10EC1D010247009F82FA /* MapboxDirections.h in Headers */ = {isa = PBXBuildFile; fileRef = DA6C9D8A1CAE442B00094FBC /* MapboxDirections.h */; settings = {ATTRIBUTES = (Public, ); }; }; - DA1A10ED1D010247009F82FA /* MBDirections.swift in Sources */ = {isa = PBXBuildFile; fileRef = DD6254731AE70CB700017857 /* MBDirections.swift */; }; - DA1A10EE1D010247009F82FA /* MBRoute.swift in Sources */ = {isa = PBXBuildFile; fileRef = DAC05F171CFC075300FA0071 /* MBRoute.swift */; }; - DA1A10EF1D010247009F82FA /* MBRouteLeg.swift in Sources */ = {isa = PBXBuildFile; fileRef = DAC05F191CFC077C00FA0071 /* MBRouteLeg.swift */; }; - DA1A10F01D010247009F82FA /* MBRouteOptions.swift in Sources */ = {isa = PBXBuildFile; fileRef = DA2E03EA1CB0E13D00D1269A /* MBRouteOptions.swift */; }; - DA1A10F11D010247009F82FA /* MBRouteStep.swift in Sources */ = {isa = PBXBuildFile; fileRef = DA2E03E81CB0E0B000D1269A /* MBRouteStep.swift */; }; - DA1A10F21D010247009F82FA /* MBWaypoint.swift in Sources */ = {isa = PBXBuildFile; fileRef = DAC05F151CFBFAC400FA0071 /* MBWaypoint.swift */; }; + DA1A10ED1D010247009F82FA /* Directions.swift in Sources */ = {isa = PBXBuildFile; fileRef = DD6254731AE70CB700017857 /* Directions.swift */; }; + DA1A10EE1D010247009F82FA /* Route.swift in Sources */ = {isa = PBXBuildFile; fileRef = DAC05F171CFC075300FA0071 /* Route.swift */; }; + DA1A10EF1D010247009F82FA /* RouteLeg.swift in Sources */ = {isa = PBXBuildFile; fileRef = DAC05F191CFC077C00FA0071 /* RouteLeg.swift */; }; + DA1A10F01D010247009F82FA /* RouteOptions.swift in Sources */ = {isa = PBXBuildFile; fileRef = DA2E03EA1CB0E13D00D1269A /* RouteOptions.swift */; }; + DA1A10F11D010247009F82FA /* RouteStep.swift in Sources */ = {isa = PBXBuildFile; fileRef = DA2E03E81CB0E0B000D1269A /* RouteStep.swift */; }; + DA1A10F21D010247009F82FA /* Waypoint.swift in Sources */ = {isa = PBXBuildFile; fileRef = DAC05F151CFBFAC400FA0071 /* Waypoint.swift */; }; DA1A10F31D010251009F82FA /* v5_driving_dc_polyline.json in Resources */ = {isa = PBXBuildFile; fileRef = DAC05F1B1CFC1E5300FA0071 /* v5_driving_dc_polyline.json */; }; DA1A10F41D010251009F82FA /* V5Tests.swift in Sources */ = {isa = PBXBuildFile; fileRef = DA6C9DAB1CAEC72800094FBC /* V5Tests.swift */; }; DA1A10F51D010251009F82FA /* Fixture.swift in Sources */ = {isa = PBXBuildFile; fileRef = DA6C9DB11CAECA0E00094FBC /* Fixture.swift */; }; DA1A11031D0103A3009F82FA /* MapboxDirections.h in Headers */ = {isa = PBXBuildFile; fileRef = DA6C9D8A1CAE442B00094FBC /* MapboxDirections.h */; settings = {ATTRIBUTES = (Public, ); }; }; - DA1A11041D0103A3009F82FA /* MBDirections.swift in Sources */ = {isa = PBXBuildFile; fileRef = DD6254731AE70CB700017857 /* MBDirections.swift */; }; - DA1A11051D0103A3009F82FA /* MBRoute.swift in Sources */ = {isa = PBXBuildFile; fileRef = DAC05F171CFC075300FA0071 /* MBRoute.swift */; }; - DA1A11061D0103A3009F82FA /* MBRouteLeg.swift in Sources */ = {isa = PBXBuildFile; fileRef = DAC05F191CFC077C00FA0071 /* MBRouteLeg.swift */; }; - DA1A11071D0103A3009F82FA /* MBRouteOptions.swift in Sources */ = {isa = PBXBuildFile; fileRef = DA2E03EA1CB0E13D00D1269A /* MBRouteOptions.swift */; }; - DA1A11081D0103A3009F82FA /* MBRouteStep.swift in Sources */ = {isa = PBXBuildFile; fileRef = DA2E03E81CB0E0B000D1269A /* MBRouteStep.swift */; }; - DA1A11091D0103A3009F82FA /* MBWaypoint.swift in Sources */ = {isa = PBXBuildFile; fileRef = DAC05F151CFBFAC400FA0071 /* MBWaypoint.swift */; }; + DA1A11041D0103A3009F82FA /* Directions.swift in Sources */ = {isa = PBXBuildFile; fileRef = DD6254731AE70CB700017857 /* Directions.swift */; }; + DA1A11051D0103A3009F82FA /* Route.swift in Sources */ = {isa = PBXBuildFile; fileRef = DAC05F171CFC075300FA0071 /* Route.swift */; }; + DA1A11061D0103A3009F82FA /* RouteLeg.swift in Sources */ = {isa = PBXBuildFile; fileRef = DAC05F191CFC077C00FA0071 /* RouteLeg.swift */; }; + DA1A11071D0103A3009F82FA /* RouteOptions.swift in Sources */ = {isa = PBXBuildFile; fileRef = DA2E03EA1CB0E13D00D1269A /* RouteOptions.swift */; }; + DA1A11081D0103A3009F82FA /* RouteStep.swift in Sources */ = {isa = PBXBuildFile; fileRef = DA2E03E81CB0E0B000D1269A /* RouteStep.swift */; }; + DA1A11091D0103A3009F82FA /* Waypoint.swift in Sources */ = {isa = PBXBuildFile; fileRef = DAC05F151CFBFAC400FA0071 /* Waypoint.swift */; }; DA1A110B1D01045E009F82FA /* DirectionsTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = DA1A110A1D01045E009F82FA /* DirectionsTests.swift */; }; DA1A110C1D01045E009F82FA /* DirectionsTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = DA1A110A1D01045E009F82FA /* DirectionsTests.swift */; }; DA1A110D1D01045E009F82FA /* DirectionsTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = DA1A110A1D01045E009F82FA /* DirectionsTests.swift */; }; - DA2E03E91CB0E0B000D1269A /* MBRouteStep.swift in Sources */ = {isa = PBXBuildFile; fileRef = DA2E03E81CB0E0B000D1269A /* MBRouteStep.swift */; }; - DA2E03EB1CB0E13D00D1269A /* MBRouteOptions.swift in Sources */ = {isa = PBXBuildFile; fileRef = DA2E03EA1CB0E13D00D1269A /* MBRouteOptions.swift */; }; + DA2E03E91CB0E0B000D1269A /* RouteStep.swift in Sources */ = {isa = PBXBuildFile; fileRef = DA2E03E81CB0E0B000D1269A /* RouteStep.swift */; }; + DA2E03EB1CB0E13D00D1269A /* RouteOptions.swift in Sources */ = {isa = PBXBuildFile; fileRef = DA2E03EA1CB0E13D00D1269A /* RouteOptions.swift */; }; DA4F84ED21C08BFB008A0434 /* WaypointTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = DA4F84EC21C08BFB008A0434 /* WaypointTests.swift */; }; DA4F84EE21C08BFB008A0434 /* WaypointTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = DA4F84EC21C08BFB008A0434 /* WaypointTests.swift */; }; DA4F84EF21C08BFB008A0434 /* WaypointTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = DA4F84EC21C08BFB008A0434 /* WaypointTests.swift */; }; @@ -211,23 +211,23 @@ DA688B3F21B89ECD00C9BB25 /* VisualInstructionComponentTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = DA688B3D21B89ECD00C9BB25 /* VisualInstructionComponentTests.swift */; }; DA688B4021B89ECD00C9BB25 /* VisualInstructionComponentTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = DA688B3D21B89ECD00C9BB25 /* VisualInstructionComponentTests.swift */; }; DA6C9D8B1CAE442B00094FBC /* MapboxDirections.h in Headers */ = {isa = PBXBuildFile; fileRef = DA6C9D8A1CAE442B00094FBC /* MapboxDirections.h */; settings = {ATTRIBUTES = (Public, ); }; }; - DA6C9DA61CAE462800094FBC /* MBDirections.swift in Sources */ = {isa = PBXBuildFile; fileRef = DD6254731AE70CB700017857 /* MBDirections.swift */; }; + DA6C9DA61CAE462800094FBC /* Directions.swift in Sources */ = {isa = PBXBuildFile; fileRef = DD6254731AE70CB700017857 /* Directions.swift */; }; DA6C9DAC1CAEC72800094FBC /* V5Tests.swift in Sources */ = {isa = PBXBuildFile; fileRef = DA6C9DAB1CAEC72800094FBC /* V5Tests.swift */; }; DA6C9DB21CAECA0E00094FBC /* Fixture.swift in Sources */ = {isa = PBXBuildFile; fileRef = DA6C9DB11CAECA0E00094FBC /* Fixture.swift */; }; DA737EE41D05F91E005BDA16 /* v5_driving_dc_geojson.json in Resources */ = {isa = PBXBuildFile; fileRef = DA737EE31D05F91E005BDA16 /* v5_driving_dc_geojson.json */; }; DA737EE51D05F91E005BDA16 /* v5_driving_dc_geojson.json in Resources */ = {isa = PBXBuildFile; fileRef = DA737EE31D05F91E005BDA16 /* v5_driving_dc_geojson.json */; }; DA737EE61D05F91E005BDA16 /* v5_driving_dc_geojson.json in Resources */ = {isa = PBXBuildFile; fileRef = DA737EE31D05F91E005BDA16 /* v5_driving_dc_geojson.json */; }; DA9E1B131E5A675F0081EDC7 /* Polyline.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DA9E1B121E5A675F0081EDC7 /* Polyline.framework */; }; - DAA76D681DD127CB0015EC78 /* MBLaneIndication.swift in Sources */ = {isa = PBXBuildFile; fileRef = DAA76D671DD127CB0015EC78 /* MBLaneIndication.swift */; }; - DAA76D691DD127CB0015EC78 /* MBLaneIndication.swift in Sources */ = {isa = PBXBuildFile; fileRef = DAA76D671DD127CB0015EC78 /* MBLaneIndication.swift */; }; - DAA76D6A1DD127CB0015EC78 /* MBLaneIndication.swift in Sources */ = {isa = PBXBuildFile; fileRef = DAA76D671DD127CB0015EC78 /* MBLaneIndication.swift */; }; - DAA76D6B1DD127CB0015EC78 /* MBLaneIndication.swift in Sources */ = {isa = PBXBuildFile; fileRef = DAA76D671DD127CB0015EC78 /* MBLaneIndication.swift */; }; + DAA76D681DD127CB0015EC78 /* LaneIndication.swift in Sources */ = {isa = PBXBuildFile; fileRef = DAA76D671DD127CB0015EC78 /* LaneIndication.swift */; }; + DAA76D691DD127CB0015EC78 /* LaneIndication.swift in Sources */ = {isa = PBXBuildFile; fileRef = DAA76D671DD127CB0015EC78 /* LaneIndication.swift */; }; + DAA76D6A1DD127CB0015EC78 /* LaneIndication.swift in Sources */ = {isa = PBXBuildFile; fileRef = DAA76D671DD127CB0015EC78 /* LaneIndication.swift */; }; + DAA76D6B1DD127CB0015EC78 /* LaneIndication.swift in Sources */ = {isa = PBXBuildFile; fileRef = DAA76D671DD127CB0015EC78 /* LaneIndication.swift */; }; DABE6C7E236A37E200D370F4 /* JSONSerialization.swift in Sources */ = {isa = PBXBuildFile; fileRef = DABE6C7D236A37E200D370F4 /* JSONSerialization.swift */; }; DABE6C7F236A37E200D370F4 /* JSONSerialization.swift in Sources */ = {isa = PBXBuildFile; fileRef = DABE6C7D236A37E200D370F4 /* JSONSerialization.swift */; }; DABE6C80236A37E200D370F4 /* JSONSerialization.swift in Sources */ = {isa = PBXBuildFile; fileRef = DABE6C7D236A37E200D370F4 /* JSONSerialization.swift */; }; - DAC05F161CFBFAC400FA0071 /* MBWaypoint.swift in Sources */ = {isa = PBXBuildFile; fileRef = DAC05F151CFBFAC400FA0071 /* MBWaypoint.swift */; }; - DAC05F181CFC075300FA0071 /* MBRoute.swift in Sources */ = {isa = PBXBuildFile; fileRef = DAC05F171CFC075300FA0071 /* MBRoute.swift */; }; - DAC05F1A1CFC077C00FA0071 /* MBRouteLeg.swift in Sources */ = {isa = PBXBuildFile; fileRef = DAC05F191CFC077C00FA0071 /* MBRouteLeg.swift */; }; + DAC05F161CFBFAC400FA0071 /* Waypoint.swift in Sources */ = {isa = PBXBuildFile; fileRef = DAC05F151CFBFAC400FA0071 /* Waypoint.swift */; }; + DAC05F181CFC075300FA0071 /* Route.swift in Sources */ = {isa = PBXBuildFile; fileRef = DAC05F171CFC075300FA0071 /* Route.swift */; }; + DAC05F1A1CFC077C00FA0071 /* RouteLeg.swift in Sources */ = {isa = PBXBuildFile; fileRef = DAC05F191CFC077C00FA0071 /* RouteLeg.swift */; }; DAC05F1C1CFC1E5300FA0071 /* v5_driving_dc_polyline.json in Resources */ = {isa = PBXBuildFile; fileRef = DAC05F1B1CFC1E5300FA0071 /* v5_driving_dc_polyline.json */; }; DACCFCA92225359600110FC9 /* v5_driving_oldenburg_polyline.json in Resources */ = {isa = PBXBuildFile; fileRef = DACCFCA82225359500110FC9 /* v5_driving_oldenburg_polyline.json */; }; DACCFCAA2225359600110FC9 /* v5_driving_oldenburg_polyline.json in Resources */ = {isa = PBXBuildFile; fileRef = DACCFCA82225359500110FC9 /* v5_driving_oldenburg_polyline.json */; }; @@ -306,11 +306,11 @@ 35828C9D217A003F00ED546E /* OfflineDirections.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OfflineDirections.swift; sourceTree = ""; }; 35CC310A2285739700EA1966 /* WalkingOptionsTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WalkingOptionsTests.swift; sourceTree = ""; }; 35D92FEF218203AA000C78CB /* 2018-10-16-Liechtenstein.tar */ = {isa = PBXFileReference; lastKnownFileType = archive.tar; path = "2018-10-16-Liechtenstein.tar"; sourceTree = ""; }; - 35DBF004217DF0D90009D2AE /* MBCoordinateBounds.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MBCoordinateBounds.swift; sourceTree = ""; }; + 35DBF004217DF0D90009D2AE /* CoordinateBounds.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CoordinateBounds.swift; sourceTree = ""; }; 35DBF00E217E17A30009D2AE /* HTTPURLResponse.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HTTPURLResponse.swift; sourceTree = ""; }; 35DBF013217E199E0009D2AE /* OfflineDirectionsTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OfflineDirectionsTests.swift; sourceTree = ""; }; 35DBF018217F38A30009D2AE /* versions.json */ = {isa = PBXFileReference; lastKnownFileType = text.json; path = versions.json; sourceTree = ""; }; - 35EFD00A207DFACA00BF3873 /* MBVisualInstruction.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MBVisualInstruction.swift; sourceTree = ""; }; + 35EFD00A207DFACA00BF3873 /* VisualInstruction.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = VisualInstruction.swift; sourceTree = ""; }; 431E93BE234664A200A71B44 /* DrivingSide.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DrivingSide.swift; sourceTree = ""; }; 43208BA62343F7C300D8BD89 /* Codable.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Codable.swift; sourceTree = ""; }; 43208BA82343F7E900D8BD89 /* CoreLocation.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CoreLocation.swift; sourceTree = ""; }; @@ -328,21 +328,21 @@ 8D434678219E1167008B7BF3 /* Double.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Double.swift; sourceTree = ""; }; AEAB390C20D7F4F4008F4E54 /* subLaneInstructions.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = subLaneInstructions.json; sourceTree = ""; }; AEAB391020D94699008F4E54 /* subVisualInstructions.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = subVisualInstructions.json; sourceTree = ""; }; - AEDC211C20B6104A0052DED8 /* MBVisualInstructionComponent.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MBVisualInstructionComponent.swift; sourceTree = ""; }; + AEDC211C20B6104A0052DED8 /* VisualInstructionComponent.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = VisualInstructionComponent.swift; sourceTree = ""; }; C51538CB1E807FF00093FF3E /* AttributeOptions.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AttributeOptions.swift; sourceTree = ""; }; C5247D701E818A24004B6154 /* AnnotationTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AnnotationTests.swift; sourceTree = ""; }; - C52552B81FA15D5900B1545C /* MBVisualInstructionBanner.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MBVisualInstructionBanner.swift; sourceTree = ""; }; + C52552B81FA15D5900B1545C /* VisualInstructionBanner.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = VisualInstructionBanner.swift; sourceTree = ""; }; C52CE3921F6AF6E70069963D /* IntructionsTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = IntructionsTests.swift; sourceTree = ""; }; - C5434B89200693D00069E887 /* MBTracepoint.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MBTracepoint.swift; sourceTree = ""; }; - C5434B8B200695A50069E887 /* MBMatchOptions.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MBMatchOptions.swift; sourceTree = ""; }; - C55FB44A1F6AEBF6006BD1E9 /* MBSpokenInstruction.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MBSpokenInstruction.swift; sourceTree = ""; }; - C57D55001DB5669600B94B74 /* MBIntersection.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MBIntersection.swift; sourceTree = ""; }; - C57D55071DB58C0200B94B74 /* MBLane.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MBLane.swift; sourceTree = ""; }; + C5434B89200693D00069E887 /* Tracepoint.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Tracepoint.swift; sourceTree = ""; }; + C5434B8B200695A50069E887 /* MatchOptions.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MatchOptions.swift; sourceTree = ""; }; + C55FB44A1F6AEBF6006BD1E9 /* SpokenInstruction.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SpokenInstruction.swift; sourceTree = ""; }; + C57D55001DB5669600B94B74 /* Intersection.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Intersection.swift; sourceTree = ""; }; + C57D55071DB58C0200B94B74 /* Lane.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Lane.swift; sourceTree = ""; }; C582BA2D2073ED6300647DAA /* Array.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Array.swift; sourceTree = ""; }; - C58EA7A91E9D7EAD008F98CE /* MBCongestion.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MBCongestion.swift; sourceTree = ""; }; + C58EA7A91E9D7EAD008F98CE /* Congestion.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Congestion.swift; sourceTree = ""; }; C59094B4203B5C7F00EB2417 /* MBDrawingView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MBDrawingView.swift; sourceTree = ""; }; - C59094BE203B800300EB2417 /* MBDirectionsOptions.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MBDirectionsOptions.swift; sourceTree = ""; }; - C59094C0203DE6BC00EB2417 /* MBDirectionsResult.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MBDirectionsResult.swift; sourceTree = ""; }; + C59094BE203B800300EB2417 /* DirectionsOptions.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DirectionsOptions.swift; sourceTree = ""; }; + C59094C0203DE6BC00EB2417 /* DirectionsResult.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DirectionsResult.swift; sourceTree = ""; }; C59426061F1EA6C400C8E59C /* RoadClasses.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RoadClasses.swift; sourceTree = ""; }; C59666382048A20E00C45CE5 /* RoutableMatchTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RoutableMatchTests.swift; sourceTree = ""; }; C5A3D3971E8188FE00D494A0 /* annotation.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; name = annotation.json; path = v5/annotation.json; sourceTree = ""; }; @@ -355,7 +355,7 @@ C5AD865E202E24F500BF47D5 /* MapboxMobileEvents.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = MapboxMobileEvents.framework; path = Carthage/Build/iOS/MapboxMobileEvents.framework; sourceTree = ""; }; C5C0D6332058523E003A3B1D /* null-tracepoint.json */ = {isa = PBXFileReference; lastKnownFileType = text.json; path = "null-tracepoint.json"; sourceTree = ""; }; C5D1D7EF1F6AF91700A1C4F1 /* instructions.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = instructions.json; sourceTree = ""; }; - C5DAAC9920191675001F9261 /* MBMatch.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MBMatch.swift; sourceTree = ""; }; + C5DAAC9920191675001F9261 /* Match.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Match.swift; sourceTree = ""; }; C5DAACAE201AA92B001F9261 /* MatchTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MatchTests.swift; sourceTree = ""; }; C5DAACB3201AA9A7001F9261 /* match.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = match.json; sourceTree = ""; }; DA1A10AF1D00F8FF009F82FA /* MapboxDirections.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = MapboxDirections.framework; sourceTree = BUILT_PRODUCTS_DIR; }; @@ -364,8 +364,8 @@ DA1A10DE1D0101ED009F82FA /* MapboxDirectionsTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = MapboxDirectionsTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; DA1A10FB1D010361009F82FA /* MapboxDirections.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = MapboxDirections.framework; sourceTree = BUILT_PRODUCTS_DIR; }; DA1A110A1D01045E009F82FA /* DirectionsTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DirectionsTests.swift; sourceTree = ""; }; - DA2E03E81CB0E0B000D1269A /* MBRouteStep.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MBRouteStep.swift; sourceTree = ""; }; - DA2E03EA1CB0E13D00D1269A /* MBRouteOptions.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MBRouteOptions.swift; sourceTree = ""; }; + DA2E03E81CB0E0B000D1269A /* RouteStep.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RouteStep.swift; sourceTree = ""; }; + DA2E03EA1CB0E13D00D1269A /* RouteOptions.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RouteOptions.swift; sourceTree = ""; }; DA4F84EC21C08BFB008A0434 /* WaypointTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WaypointTests.swift; sourceTree = ""; }; DA688B3D21B89ECD00C9BB25 /* VisualInstructionComponentTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = VisualInstructionComponentTests.swift; sourceTree = ""; }; DA6C9D881CAE442B00094FBC /* MapboxDirections.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = MapboxDirections.framework; sourceTree = BUILT_PRODUCTS_DIR; }; @@ -377,11 +377,11 @@ DA6C9DB11CAECA0E00094FBC /* Fixture.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Fixture.swift; sourceTree = ""; }; DA737EE31D05F91E005BDA16 /* v5_driving_dc_geojson.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = v5_driving_dc_geojson.json; sourceTree = ""; }; DA9E1B121E5A675F0081EDC7 /* Polyline.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Polyline.framework; path = Carthage/Build/watchOS/Polyline.framework; sourceTree = ""; }; - DAA76D671DD127CB0015EC78 /* MBLaneIndication.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MBLaneIndication.swift; sourceTree = ""; }; + DAA76D671DD127CB0015EC78 /* LaneIndication.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = LaneIndication.swift; sourceTree = ""; }; DABE6C7D236A37E200D370F4 /* JSONSerialization.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = JSONSerialization.swift; sourceTree = ""; }; - DAC05F151CFBFAC400FA0071 /* MBWaypoint.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MBWaypoint.swift; sourceTree = ""; }; - DAC05F171CFC075300FA0071 /* MBRoute.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MBRoute.swift; sourceTree = ""; }; - DAC05F191CFC077C00FA0071 /* MBRouteLeg.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MBRouteLeg.swift; sourceTree = ""; }; + DAC05F151CFBFAC400FA0071 /* Waypoint.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Waypoint.swift; sourceTree = ""; }; + DAC05F171CFC075300FA0071 /* Route.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Route.swift; sourceTree = ""; }; + DAC05F191CFC077C00FA0071 /* RouteLeg.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RouteLeg.swift; sourceTree = ""; }; DAC05F1B1CFC1E5300FA0071 /* v5_driving_dc_polyline.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = v5_driving_dc_polyline.json; sourceTree = ""; }; DACCFCA82225359500110FC9 /* v5_driving_oldenburg_polyline.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = v5_driving_oldenburg_polyline.json; sourceTree = ""; }; DADD27B51E5AAAD800D31FAD /* Example.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Example.app; sourceTree = BUILT_PRODUCTS_DIR; }; @@ -393,7 +393,7 @@ DADD27F21E5ABD4300D31FAD /* Mapbox.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Mapbox.framework; path = Carthage/Build/iOS/Mapbox.framework; sourceTree = ""; }; DAE33A1A1F215DF600C06039 /* IntersectionTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = IntersectionTests.swift; sourceTree = ""; }; DAE9E0F31EB7DE2E001E8E8B /* RouteOptionsTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = RouteOptionsTests.swift; path = Tests/MapboxDirectionsTests/RouteOptionsTests.swift; sourceTree = SOURCE_ROOT; }; - DD6254731AE70CB700017857 /* MBDirections.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MBDirections.swift; sourceTree = ""; }; + DD6254731AE70CB700017857 /* Directions.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Directions.swift; sourceTree = ""; }; F448F82A1DDCC5B6000BC343 /* Polyline.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Polyline.framework; path = Carthage/Build/iOS/Polyline.framework; sourceTree = ""; }; F448F8381DDCC6D7000BC343 /* OHHTTPStubs.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = OHHTTPStubs.framework; path = Carthage/Build/iOS/OHHTTPStubs.framework; sourceTree = ""; }; F448F8391DDCC6EB000BC343 /* OHHTTPStubs.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = OHHTTPStubs.framework; path = Carthage/Build/Mac/OHHTTPStubs.framework; sourceTree = ""; }; @@ -560,11 +560,11 @@ C5DAAC9E20191683001F9261 /* Match */ = { isa = PBXGroup; children = ( - C5434B89200693D00069E887 /* MBTracepoint.swift */, - C5434B8B200695A50069E887 /* MBMatchOptions.swift */, + C5434B89200693D00069E887 /* Tracepoint.swift */, + C5434B8B200695A50069E887 /* MatchOptions.swift */, 43F89F922350F952007B591E /* MatchResponse.swift */, 43F89F97235778DE007B591E /* MapMatchingResponse.swift */, - C5DAAC9920191675001F9261 /* MBMatch.swift */, + C5DAAC9920191675001F9261 /* Match.swift */, ); path = Match; sourceTree = ""; @@ -584,31 +584,31 @@ 8D381B681FDB1009008D5A58 /* Extensions */, C5DAAC9E20191683001F9261 /* Match */, DA6C9D8A1CAE442B00094FBC /* MapboxDirections.h */, - DD6254731AE70CB700017857 /* MBDirections.swift */, + DD6254731AE70CB700017857 /* Directions.swift */, 4392557523440EC2006EEE88 /* DirectionsError.swift */, - C59094C0203DE6BC00EB2417 /* MBDirectionsResult.swift */, + C59094C0203DE6BC00EB2417 /* DirectionsResult.swift */, 43208BAC2343FF5500D8BD89 /* RouteResponse.swift */, - DAC05F171CFC075300FA0071 /* MBRoute.swift */, + DAC05F171CFC075300FA0071 /* Route.swift */, 431E93BE234664A200A71B44 /* DrivingSide.swift */, - DAC05F191CFC077C00FA0071 /* MBRouteLeg.swift */, - DA2E03EA1CB0E13D00D1269A /* MBRouteOptions.swift */, + DAC05F191CFC077C00FA0071 /* RouteLeg.swift */, + DA2E03EA1CB0E13D00D1269A /* RouteOptions.swift */, 438BFEC1233D854D00457294 /* DirectionsProfileIdentifier.swift */, - C59094BE203B800300EB2417 /* MBDirectionsOptions.swift */, - DA2E03E81CB0E0B000D1269A /* MBRouteStep.swift */, - C57D55001DB5669600B94B74 /* MBIntersection.swift */, - C57D55071DB58C0200B94B74 /* MBLane.swift */, - DAA76D671DD127CB0015EC78 /* MBLaneIndication.swift */, - DAC05F151CFBFAC400FA0071 /* MBWaypoint.swift */, + C59094BE203B800300EB2417 /* DirectionsOptions.swift */, + DA2E03E81CB0E0B000D1269A /* RouteStep.swift */, + C57D55001DB5669600B94B74 /* Intersection.swift */, + C57D55071DB58C0200B94B74 /* Lane.swift */, + DAA76D671DD127CB0015EC78 /* LaneIndication.swift */, + DAC05F151CFBFAC400FA0071 /* Waypoint.swift */, C51538CB1E807FF00093FF3E /* AttributeOptions.swift */, - C58EA7A91E9D7EAD008F98CE /* MBCongestion.swift */, + C58EA7A91E9D7EAD008F98CE /* Congestion.swift */, C59426061F1EA6C400C8E59C /* RoadClasses.swift */, DA6C9D8C1CAE442B00094FBC /* Info.plist */, - C55FB44A1F6AEBF6006BD1E9 /* MBSpokenInstruction.swift */, - C52552B81FA15D5900B1545C /* MBVisualInstructionBanner.swift */, - 35EFD00A207DFACA00BF3873 /* MBVisualInstruction.swift */, - AEDC211C20B6104A0052DED8 /* MBVisualInstructionComponent.swift */, + C55FB44A1F6AEBF6006BD1E9 /* SpokenInstruction.swift */, + C52552B81FA15D5900B1545C /* VisualInstructionBanner.swift */, + 35EFD00A207DFACA00BF3873 /* VisualInstruction.swift */, + AEDC211C20B6104A0052DED8 /* VisualInstructionComponent.swift */, 35828C9D217A003F00ED546E /* OfflineDirections.swift */, - 35DBF004217DF0D90009D2AE /* MBCoordinateBounds.swift */, + 35DBF004217DF0D90009D2AE /* CoordinateBounds.swift */, ); name = MapboxDirections; path = Sources/MapboxDirections; @@ -1143,41 +1143,41 @@ buildActionMask = 2147483647; files = ( 431E93C0234664A200A71B44 /* DrivingSide.swift in Sources */, - C5DAAC9B2019167C001F9261 /* MBMatch.swift in Sources */, + C5DAAC9B2019167C001F9261 /* Match.swift in Sources */, 35DBF010217E17A30009D2AE /* HTTPURLResponse.swift in Sources */, 8D43467A219E15C3008B7BF3 /* Double.swift in Sources */, C53A02261E92C26E009837BD /* AttributeOptions.swift in Sources */, 43F89F99235778DE007B591E /* MapMatchingResponse.swift in Sources */, - DA1A10C91D00F969009F82FA /* MBRouteLeg.swift in Sources */, - C52552BA1FA15D5E00B1545C /* MBVisualInstructionBanner.swift in Sources */, + DA1A10C91D00F969009F82FA /* RouteLeg.swift in Sources */, + C52552BA1FA15D5E00B1545C /* VisualInstructionBanner.swift in Sources */, 35828C9F217A003F00ED546E /* OfflineDirections.swift in Sources */, - C5DAAC9F20195AAE001F9261 /* MBTracepoint.swift in Sources */, + C5DAAC9F20195AAE001F9261 /* Tracepoint.swift in Sources */, 431E93CC23466C2500A71B44 /* RouteResponse.swift in Sources */, 431E93C423466B0F00A71B44 /* GeoJSON.swift in Sources */, - C5990B4A2045E72800D7DFD4 /* MBDirectionsResult.swift in Sources */, - 35EFD00C207DFACA00BF3873 /* MBVisualInstruction.swift in Sources */, + C5990B4A2045E72800D7DFD4 /* DirectionsResult.swift in Sources */, + 35EFD00C207DFACA00BF3873 /* VisualInstruction.swift in Sources */, C584E3F71F201C7B00BBC9BB /* RoadClasses.swift in Sources */, - C5DAACA220195AB2001F9261 /* MBMatchOptions.swift in Sources */, - DA1A10CC1D00F969009F82FA /* MBWaypoint.swift in Sources */, - 35DBF006217DF0D90009D2AE /* MBCoordinateBounds.swift in Sources */, - DA1A10CA1D00F969009F82FA /* MBRouteOptions.swift in Sources */, - DA1A10C81D00F969009F82FA /* MBRoute.swift in Sources */, + C5DAACA220195AB2001F9261 /* MatchOptions.swift in Sources */, + DA1A10CC1D00F969009F82FA /* Waypoint.swift in Sources */, + 35DBF006217DF0D90009D2AE /* CoordinateBounds.swift in Sources */, + DA1A10CA1D00F969009F82FA /* RouteOptions.swift in Sources */, + DA1A10C81D00F969009F82FA /* Route.swift in Sources */, 431E93D023466D7500A71B44 /* Codable.swift in Sources */, - C5990B4D2045E74800D7DFD4 /* MBDirectionsOptions.swift in Sources */, - DAA76D691DD127CB0015EC78 /* MBLaneIndication.swift in Sources */, + C5990B4D2045E74800D7DFD4 /* DirectionsOptions.swift in Sources */, + DAA76D691DD127CB0015EC78 /* LaneIndication.swift in Sources */, 43F89F942350F952007B591E /* MatchResponse.swift in Sources */, - DA1A10CB1D00F969009F82FA /* MBRouteStep.swift in Sources */, - C57D55031DB566A700B94B74 /* MBIntersection.swift in Sources */, - C52CE38F1F6AF63C0069963D /* MBSpokenInstruction.swift in Sources */, - C58EA7AB1E9D7F73008F98CE /* MBCongestion.swift in Sources */, + DA1A10CB1D00F969009F82FA /* RouteStep.swift in Sources */, + C57D55031DB566A700B94B74 /* Intersection.swift in Sources */, + C52CE38F1F6AF63C0069963D /* SpokenInstruction.swift in Sources */, + C58EA7AB1E9D7F73008F98CE /* Congestion.swift in Sources */, 8D381B6B1FDB3D8A008D5A58 /* String.swift in Sources */, 438BFEC3233D854D00457294 /* DirectionsProfileIdentifier.swift in Sources */, C54549FC2073F1EF002E273F /* Array.swift in Sources */, - C547EC691DB59F8F009817F3 /* MBLane.swift in Sources */, + C547EC691DB59F8F009817F3 /* Lane.swift in Sources */, 431E93C823466B4000A71B44 /* CoreLocation.swift in Sources */, - AEDC212120B6125C0052DED8 /* MBVisualInstructionComponent.swift in Sources */, + AEDC212120B6125C0052DED8 /* VisualInstructionComponent.swift in Sources */, 439255792344113D006EEE88 /* DirectionsError.swift in Sources */, - DA1A10C71D00F969009F82FA /* MBDirections.swift in Sources */, + DA1A10C71D00F969009F82FA /* Directions.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -1208,41 +1208,41 @@ buildActionMask = 2147483647; files = ( 431E93C1234664A200A71B44 /* DrivingSide.swift in Sources */, - C5DAAC9C2019167D001F9261 /* MBMatch.swift in Sources */, + C5DAAC9C2019167D001F9261 /* Match.swift in Sources */, 35DBF011217E17A30009D2AE /* HTTPURLResponse.swift in Sources */, 8D43467B219E15C4008B7BF3 /* Double.swift in Sources */, C53A02271E92C26F009837BD /* AttributeOptions.swift in Sources */, 43F89F9A235778DE007B591E /* MapMatchingResponse.swift in Sources */, - DA1A10EF1D010247009F82FA /* MBRouteLeg.swift in Sources */, - C52552BB1FA15D5F00B1545C /* MBVisualInstructionBanner.swift in Sources */, + DA1A10EF1D010247009F82FA /* RouteLeg.swift in Sources */, + C52552BB1FA15D5F00B1545C /* VisualInstructionBanner.swift in Sources */, 35828CA0217A003F00ED546E /* OfflineDirections.swift in Sources */, - C5DAACA020195AAF001F9261 /* MBTracepoint.swift in Sources */, + C5DAACA020195AAF001F9261 /* Tracepoint.swift in Sources */, 431E93CD23466C2700A71B44 /* RouteResponse.swift in Sources */, 431E93C523466B1000A71B44 /* GeoJSON.swift in Sources */, - C5990B4B2045E72900D7DFD4 /* MBDirectionsResult.swift in Sources */, - 35EFD00D207DFACA00BF3873 /* MBVisualInstruction.swift in Sources */, + C5990B4B2045E72900D7DFD4 /* DirectionsResult.swift in Sources */, + 35EFD00D207DFACA00BF3873 /* VisualInstruction.swift in Sources */, C584E3F81F201C7C00BBC9BB /* RoadClasses.swift in Sources */, - C5DAACA320195AB2001F9261 /* MBMatchOptions.swift in Sources */, - DA1A10F21D010247009F82FA /* MBWaypoint.swift in Sources */, - 35DBF007217DF0D90009D2AE /* MBCoordinateBounds.swift in Sources */, - DA1A10F01D010247009F82FA /* MBRouteOptions.swift in Sources */, - DA1A10EE1D010247009F82FA /* MBRoute.swift in Sources */, + C5DAACA320195AB2001F9261 /* MatchOptions.swift in Sources */, + DA1A10F21D010247009F82FA /* Waypoint.swift in Sources */, + 35DBF007217DF0D90009D2AE /* CoordinateBounds.swift in Sources */, + DA1A10F01D010247009F82FA /* RouteOptions.swift in Sources */, + DA1A10EE1D010247009F82FA /* Route.swift in Sources */, 431E93D123466D7600A71B44 /* Codable.swift in Sources */, - C5990B4E2045E74900D7DFD4 /* MBDirectionsOptions.swift in Sources */, - DAA76D6A1DD127CB0015EC78 /* MBLaneIndication.swift in Sources */, + C5990B4E2045E74900D7DFD4 /* DirectionsOptions.swift in Sources */, + DAA76D6A1DD127CB0015EC78 /* LaneIndication.swift in Sources */, 43F89F952350F952007B591E /* MatchResponse.swift in Sources */, - DA1A10F11D010247009F82FA /* MBRouteStep.swift in Sources */, - C57D55041DB566A800B94B74 /* MBIntersection.swift in Sources */, - C52CE3901F6AF63D0069963D /* MBSpokenInstruction.swift in Sources */, - C58EA7AC1E9D7F74008F98CE /* MBCongestion.swift in Sources */, + DA1A10F11D010247009F82FA /* RouteStep.swift in Sources */, + C57D55041DB566A800B94B74 /* Intersection.swift in Sources */, + C52CE3901F6AF63D0069963D /* SpokenInstruction.swift in Sources */, + C58EA7AC1E9D7F74008F98CE /* Congestion.swift in Sources */, 8D381B6C1FDB3D8B008D5A58 /* String.swift in Sources */, 438BFEC4233D854D00457294 /* DirectionsProfileIdentifier.swift in Sources */, C54549FD2073F1F0002E273F /* Array.swift in Sources */, - C547EC6A1DB59F90009817F3 /* MBLane.swift in Sources */, + C547EC6A1DB59F90009817F3 /* Lane.swift in Sources */, 431E93C923466B4100A71B44 /* CoreLocation.swift in Sources */, - AEDC212220B6125D0052DED8 /* MBVisualInstructionComponent.swift in Sources */, + AEDC212220B6125D0052DED8 /* VisualInstructionComponent.swift in Sources */, 4392557A2344113E006EEE88 /* DirectionsError.swift in Sources */, - DA1A10ED1D010247009F82FA /* MBDirections.swift in Sources */, + DA1A10ED1D010247009F82FA /* Directions.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -1273,41 +1273,41 @@ buildActionMask = 2147483647; files = ( 431E93C2234664A200A71B44 /* DrivingSide.swift in Sources */, - C5DAAC9D2019167E001F9261 /* MBMatch.swift in Sources */, + C5DAAC9D2019167E001F9261 /* Match.swift in Sources */, 35DBF012217E17A30009D2AE /* HTTPURLResponse.swift in Sources */, 8D43467C219E15C6008B7BF3 /* Double.swift in Sources */, C53A02281E92C271009837BD /* AttributeOptions.swift in Sources */, 43F89F9B235778DE007B591E /* MapMatchingResponse.swift in Sources */, - DA1A11061D0103A3009F82FA /* MBRouteLeg.swift in Sources */, - C52552BC1FA15D6000B1545C /* MBVisualInstructionBanner.swift in Sources */, + DA1A11061D0103A3009F82FA /* RouteLeg.swift in Sources */, + C52552BC1FA15D6000B1545C /* VisualInstructionBanner.swift in Sources */, 35828CA1217A003F00ED546E /* OfflineDirections.swift in Sources */, - C5DAACA120195AAF001F9261 /* MBTracepoint.swift in Sources */, + C5DAACA120195AAF001F9261 /* Tracepoint.swift in Sources */, 431E93CE23466C2800A71B44 /* RouteResponse.swift in Sources */, 431E93C623466B1100A71B44 /* GeoJSON.swift in Sources */, - C5990B4C2045E72A00D7DFD4 /* MBDirectionsResult.swift in Sources */, - 35EFD00E207DFACA00BF3873 /* MBVisualInstruction.swift in Sources */, + C5990B4C2045E72A00D7DFD4 /* DirectionsResult.swift in Sources */, + 35EFD00E207DFACA00BF3873 /* VisualInstruction.swift in Sources */, C584E3F91F201C7D00BBC9BB /* RoadClasses.swift in Sources */, - C5DAACA420195AB3001F9261 /* MBMatchOptions.swift in Sources */, - DA1A11091D0103A3009F82FA /* MBWaypoint.swift in Sources */, - 35DBF008217DF0D90009D2AE /* MBCoordinateBounds.swift in Sources */, - DA1A11071D0103A3009F82FA /* MBRouteOptions.swift in Sources */, - DA1A11051D0103A3009F82FA /* MBRoute.swift in Sources */, + C5DAACA420195AB3001F9261 /* MatchOptions.swift in Sources */, + DA1A11091D0103A3009F82FA /* Waypoint.swift in Sources */, + 35DBF008217DF0D90009D2AE /* CoordinateBounds.swift in Sources */, + DA1A11071D0103A3009F82FA /* RouteOptions.swift in Sources */, + DA1A11051D0103A3009F82FA /* Route.swift in Sources */, 431E93D223466D7700A71B44 /* Codable.swift in Sources */, - C5990B4F2045E74A00D7DFD4 /* MBDirectionsOptions.swift in Sources */, - DAA76D6B1DD127CB0015EC78 /* MBLaneIndication.swift in Sources */, + C5990B4F2045E74A00D7DFD4 /* DirectionsOptions.swift in Sources */, + DAA76D6B1DD127CB0015EC78 /* LaneIndication.swift in Sources */, 43F89F962350F952007B591E /* MatchResponse.swift in Sources */, - DA1A11081D0103A3009F82FA /* MBRouteStep.swift in Sources */, - C57D55051DB566A900B94B74 /* MBIntersection.swift in Sources */, - C52CE3911F6AF63E0069963D /* MBSpokenInstruction.swift in Sources */, - C58EA7AD1E9D7F75008F98CE /* MBCongestion.swift in Sources */, + DA1A11081D0103A3009F82FA /* RouteStep.swift in Sources */, + C57D55051DB566A900B94B74 /* Intersection.swift in Sources */, + C52CE3911F6AF63E0069963D /* SpokenInstruction.swift in Sources */, + C58EA7AD1E9D7F75008F98CE /* Congestion.swift in Sources */, 8D381B6D1FDB3D8B008D5A58 /* String.swift in Sources */, 438BFEC5233D854D00457294 /* DirectionsProfileIdentifier.swift in Sources */, C54549FE2073F1F1002E273F /* Array.swift in Sources */, - C547EC6B1DB59F91009817F3 /* MBLane.swift in Sources */, + C547EC6B1DB59F91009817F3 /* Lane.swift in Sources */, 431E93CA23466B4200A71B44 /* CoreLocation.swift in Sources */, - AEDC212320B6125E0052DED8 /* MBVisualInstructionComponent.swift in Sources */, + AEDC212320B6125E0052DED8 /* VisualInstructionComponent.swift in Sources */, 4392557B2344113F006EEE88 /* DirectionsError.swift in Sources */, - DA1A11041D0103A3009F82FA /* MBDirections.swift in Sources */, + DA1A11041D0103A3009F82FA /* Directions.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -1319,38 +1319,38 @@ C51538CC1E807FF00093FF3E /* AttributeOptions.swift in Sources */, 35DBF00F217E17A30009D2AE /* HTTPURLResponse.swift in Sources */, 8D434679219E1167008B7BF3 /* Double.swift in Sources */, - DA2E03EB1CB0E13D00D1269A /* MBRouteOptions.swift in Sources */, + DA2E03EB1CB0E13D00D1269A /* RouteOptions.swift in Sources */, C582BA2E2073ED6300647DAA /* Array.swift in Sources */, 43F89F98235778DE007B591E /* MapMatchingResponse.swift in Sources */, - C52552B91FA15D5900B1545C /* MBVisualInstructionBanner.swift in Sources */, + C52552B91FA15D5900B1545C /* VisualInstructionBanner.swift in Sources */, 35828C9E217A003F00ED546E /* OfflineDirections.swift in Sources */, C59426071F1EA6C400C8E59C /* RoadClasses.swift in Sources */, 431E93CB23466C2400A71B44 /* RouteResponse.swift in Sources */, 431E93C323466B0E00A71B44 /* GeoJSON.swift in Sources */, - 35EFD00B207DFACA00BF3873 /* MBVisualInstruction.swift in Sources */, - DAC05F161CFBFAC400FA0071 /* MBWaypoint.swift in Sources */, - C57D55081DB58C0200B94B74 /* MBLane.swift in Sources */, - DAC05F181CFC075300FA0071 /* MBRoute.swift in Sources */, - C59094BF203B800300EB2417 /* MBDirectionsOptions.swift in Sources */, - 35DBF005217DF0D90009D2AE /* MBCoordinateBounds.swift in Sources */, - C5434B8C200695A50069E887 /* MBMatchOptions.swift in Sources */, - DAA76D681DD127CB0015EC78 /* MBLaneIndication.swift in Sources */, + 35EFD00B207DFACA00BF3873 /* VisualInstruction.swift in Sources */, + DAC05F161CFBFAC400FA0071 /* Waypoint.swift in Sources */, + C57D55081DB58C0200B94B74 /* Lane.swift in Sources */, + DAC05F181CFC075300FA0071 /* Route.swift in Sources */, + C59094BF203B800300EB2417 /* DirectionsOptions.swift in Sources */, + 35DBF005217DF0D90009D2AE /* CoordinateBounds.swift in Sources */, + C5434B8C200695A50069E887 /* MatchOptions.swift in Sources */, + DAA76D681DD127CB0015EC78 /* LaneIndication.swift in Sources */, 431E93CF23466D7400A71B44 /* Codable.swift in Sources */, - C59094C1203DE6BC00EB2417 /* MBDirectionsResult.swift in Sources */, - DAC05F1A1CFC077C00FA0071 /* MBRouteLeg.swift in Sources */, + C59094C1203DE6BC00EB2417 /* DirectionsResult.swift in Sources */, + DAC05F1A1CFC077C00FA0071 /* RouteLeg.swift in Sources */, 43F89F932350F952007B591E /* MatchResponse.swift in Sources */, - C5434B8A200693D00069E887 /* MBTracepoint.swift in Sources */, - DA6C9DA61CAE462800094FBC /* MBDirections.swift in Sources */, - C55FB44B1F6AEBF6006BD1E9 /* MBSpokenInstruction.swift in Sources */, - C5DAAC9A20191675001F9261 /* MBMatch.swift in Sources */, - C58EA7AA1E9D7EAD008F98CE /* MBCongestion.swift in Sources */, + C5434B8A200693D00069E887 /* Tracepoint.swift in Sources */, + DA6C9DA61CAE462800094FBC /* Directions.swift in Sources */, + C55FB44B1F6AEBF6006BD1E9 /* SpokenInstruction.swift in Sources */, + C5DAAC9A20191675001F9261 /* Match.swift in Sources */, + C58EA7AA1E9D7EAD008F98CE /* Congestion.swift in Sources */, 8D381B6A1FDB101F008D5A58 /* String.swift in Sources */, 438BFEC2233D854D00457294 /* DirectionsProfileIdentifier.swift in Sources */, - C57D55011DB5669600B94B74 /* MBIntersection.swift in Sources */, + C57D55011DB5669600B94B74 /* Intersection.swift in Sources */, 431E93C723466B3F00A71B44 /* CoreLocation.swift in Sources */, - AEDC211D20B6104B0052DED8 /* MBVisualInstructionComponent.swift in Sources */, + AEDC211D20B6104B0052DED8 /* VisualInstructionComponent.swift in Sources */, 439255772344113B006EEE88 /* DirectionsError.swift in Sources */, - DA2E03E91CB0E0B000D1269A /* MBRouteStep.swift in Sources */, + DA2E03E91CB0E0B000D1269A /* RouteStep.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/Sources/MapboxDirections/MBCongestion.swift b/Sources/MapboxDirections/Congestion.swift similarity index 100% rename from Sources/MapboxDirections/MBCongestion.swift rename to Sources/MapboxDirections/Congestion.swift diff --git a/Sources/MapboxDirections/MBCoordinateBounds.swift b/Sources/MapboxDirections/CoordinateBounds.swift similarity index 100% rename from Sources/MapboxDirections/MBCoordinateBounds.swift rename to Sources/MapboxDirections/CoordinateBounds.swift diff --git a/Sources/MapboxDirections/MBDirections.swift b/Sources/MapboxDirections/Directions.swift similarity index 100% rename from Sources/MapboxDirections/MBDirections.swift rename to Sources/MapboxDirections/Directions.swift diff --git a/Sources/MapboxDirections/MBDirectionsOptions.swift b/Sources/MapboxDirections/DirectionsOptions.swift similarity index 100% rename from Sources/MapboxDirections/MBDirectionsOptions.swift rename to Sources/MapboxDirections/DirectionsOptions.swift diff --git a/Sources/MapboxDirections/MBDirectionsResult.swift b/Sources/MapboxDirections/DirectionsResult.swift similarity index 100% rename from Sources/MapboxDirections/MBDirectionsResult.swift rename to Sources/MapboxDirections/DirectionsResult.swift diff --git a/Sources/MapboxDirections/MBIntersection.swift b/Sources/MapboxDirections/Intersection.swift similarity index 100% rename from Sources/MapboxDirections/MBIntersection.swift rename to Sources/MapboxDirections/Intersection.swift diff --git a/Sources/MapboxDirections/MBLane.swift b/Sources/MapboxDirections/Lane.swift similarity index 100% rename from Sources/MapboxDirections/MBLane.swift rename to Sources/MapboxDirections/Lane.swift diff --git a/Sources/MapboxDirections/MBLaneIndication.swift b/Sources/MapboxDirections/LaneIndication.swift similarity index 100% rename from Sources/MapboxDirections/MBLaneIndication.swift rename to Sources/MapboxDirections/LaneIndication.swift diff --git a/Sources/MapboxDirections/Match/MBMatch.swift b/Sources/MapboxDirections/Match/Match.swift similarity index 100% rename from Sources/MapboxDirections/Match/MBMatch.swift rename to Sources/MapboxDirections/Match/Match.swift diff --git a/Sources/MapboxDirections/Match/MBMatchOptions.swift b/Sources/MapboxDirections/Match/MatchOptions.swift similarity index 100% rename from Sources/MapboxDirections/Match/MBMatchOptions.swift rename to Sources/MapboxDirections/Match/MatchOptions.swift diff --git a/Sources/MapboxDirections/Match/MBTracepoint.swift b/Sources/MapboxDirections/Match/Tracepoint.swift similarity index 100% rename from Sources/MapboxDirections/Match/MBTracepoint.swift rename to Sources/MapboxDirections/Match/Tracepoint.swift diff --git a/Sources/MapboxDirections/MBRoute.swift b/Sources/MapboxDirections/Route.swift similarity index 100% rename from Sources/MapboxDirections/MBRoute.swift rename to Sources/MapboxDirections/Route.swift diff --git a/Sources/MapboxDirections/MBRouteLeg.swift b/Sources/MapboxDirections/RouteLeg.swift similarity index 100% rename from Sources/MapboxDirections/MBRouteLeg.swift rename to Sources/MapboxDirections/RouteLeg.swift diff --git a/Sources/MapboxDirections/MBRouteOptions.swift b/Sources/MapboxDirections/RouteOptions.swift similarity index 100% rename from Sources/MapboxDirections/MBRouteOptions.swift rename to Sources/MapboxDirections/RouteOptions.swift diff --git a/Sources/MapboxDirections/MBRouteStep.swift b/Sources/MapboxDirections/RouteStep.swift similarity index 100% rename from Sources/MapboxDirections/MBRouteStep.swift rename to Sources/MapboxDirections/RouteStep.swift diff --git a/Sources/MapboxDirections/MBSpokenInstruction.swift b/Sources/MapboxDirections/SpokenInstruction.swift similarity index 100% rename from Sources/MapboxDirections/MBSpokenInstruction.swift rename to Sources/MapboxDirections/SpokenInstruction.swift diff --git a/Sources/MapboxDirections/MBVisualInstruction.swift b/Sources/MapboxDirections/VisualInstruction.swift similarity index 100% rename from Sources/MapboxDirections/MBVisualInstruction.swift rename to Sources/MapboxDirections/VisualInstruction.swift diff --git a/Sources/MapboxDirections/MBVisualInstructionBanner.swift b/Sources/MapboxDirections/VisualInstructionBanner.swift similarity index 100% rename from Sources/MapboxDirections/MBVisualInstructionBanner.swift rename to Sources/MapboxDirections/VisualInstructionBanner.swift diff --git a/Sources/MapboxDirections/MBVisualInstructionComponent.swift b/Sources/MapboxDirections/VisualInstructionComponent.swift similarity index 100% rename from Sources/MapboxDirections/MBVisualInstructionComponent.swift rename to Sources/MapboxDirections/VisualInstructionComponent.swift diff --git a/Sources/MapboxDirections/MBWaypoint.swift b/Sources/MapboxDirections/Waypoint.swift similarity index 100% rename from Sources/MapboxDirections/MBWaypoint.swift rename to Sources/MapboxDirections/Waypoint.swift From 9abbc2a7664690044478a34ff0be08c0f8dd8f8a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Minh=20Nguye=CC=82=CC=83n?= Date: Sat, 2 Nov 2019 14:34:26 -0700 Subject: [PATCH 56/89] Removed references to CMapboxDirections --- MapboxDirections.swift.podspec | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/MapboxDirections.swift.podspec b/MapboxDirections.swift.podspec index af9b15701..b617ee28c 100644 --- a/MapboxDirections.swift.podspec +++ b/MapboxDirections.swift.podspec @@ -37,8 +37,7 @@ Pod::Spec.new do |s| # ――― Source Code ―――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――― # - s.source_files = ["Sources/MapboxDirections", "Sources/MapboxDirections/*/*", "Sources/CMapboxDirections", "Sources/CMapboxDirections/*/*"] - s.exclude_files = ["Sources/CMapboxDirections/CMapboxDirections.h"] + s.source_files = ["Sources/MapboxDirections", "Sources/MapboxDirections/*/*"] # ――― Project Settings ――――――――――――――――――――――――――――――――――――――――――――――――――――――――― # From 16e43ffe293a288bcf4e2c6858d54606130d099c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Minh=20Nguye=CC=82=CC=83n?= Date: Sat, 2 Nov 2019 14:38:16 -0700 Subject: [PATCH 57/89] Renamed map matching group --- MapboxDirections.xcodeproj/project.pbxproj | 6 +++--- .../{Match => MapMatching}/MapMatchingResponse.swift | 0 Sources/MapboxDirections/{Match => MapMatching}/Match.swift | 0 .../{Match => MapMatching}/MatchOptions.swift | 0 .../{Match => MapMatching}/MatchResponse.swift | 0 .../{Match => MapMatching}/Tracepoint.swift | 0 6 files changed, 3 insertions(+), 3 deletions(-) rename Sources/MapboxDirections/{Match => MapMatching}/MapMatchingResponse.swift (100%) rename Sources/MapboxDirections/{Match => MapMatching}/Match.swift (100%) rename Sources/MapboxDirections/{Match => MapMatching}/MatchOptions.swift (100%) rename Sources/MapboxDirections/{Match => MapMatching}/MatchResponse.swift (100%) rename Sources/MapboxDirections/{Match => MapMatching}/Tracepoint.swift (100%) diff --git a/MapboxDirections.xcodeproj/project.pbxproj b/MapboxDirections.xcodeproj/project.pbxproj index eeceff68d..cc8c8dc2c 100644 --- a/MapboxDirections.xcodeproj/project.pbxproj +++ b/MapboxDirections.xcodeproj/project.pbxproj @@ -557,7 +557,7 @@ name = Instructions; sourceTree = ""; }; - C5DAAC9E20191683001F9261 /* Match */ = { + C5DAAC9E20191683001F9261 /* MapMatching */ = { isa = PBXGroup; children = ( C5434B89200693D00069E887 /* Tracepoint.swift */, @@ -566,7 +566,7 @@ 43F89F97235778DE007B591E /* MapMatchingResponse.swift */, C5DAAC9920191675001F9261 /* Match.swift */, ); - path = Match; + path = MapMatching; sourceTree = ""; }; C5DAACB2201AA97D001F9261 /* Match */ = { @@ -582,7 +582,7 @@ isa = PBXGroup; children = ( 8D381B681FDB1009008D5A58 /* Extensions */, - C5DAAC9E20191683001F9261 /* Match */, + C5DAAC9E20191683001F9261 /* MapMatching */, DA6C9D8A1CAE442B00094FBC /* MapboxDirections.h */, DD6254731AE70CB700017857 /* Directions.swift */, 4392557523440EC2006EEE88 /* DirectionsError.swift */, diff --git a/Sources/MapboxDirections/Match/MapMatchingResponse.swift b/Sources/MapboxDirections/MapMatching/MapMatchingResponse.swift similarity index 100% rename from Sources/MapboxDirections/Match/MapMatchingResponse.swift rename to Sources/MapboxDirections/MapMatching/MapMatchingResponse.swift diff --git a/Sources/MapboxDirections/Match/Match.swift b/Sources/MapboxDirections/MapMatching/Match.swift similarity index 100% rename from Sources/MapboxDirections/Match/Match.swift rename to Sources/MapboxDirections/MapMatching/Match.swift diff --git a/Sources/MapboxDirections/Match/MatchOptions.swift b/Sources/MapboxDirections/MapMatching/MatchOptions.swift similarity index 100% rename from Sources/MapboxDirections/Match/MatchOptions.swift rename to Sources/MapboxDirections/MapMatching/MatchOptions.swift diff --git a/Sources/MapboxDirections/Match/MatchResponse.swift b/Sources/MapboxDirections/MapMatching/MatchResponse.swift similarity index 100% rename from Sources/MapboxDirections/Match/MatchResponse.swift rename to Sources/MapboxDirections/MapMatching/MatchResponse.swift diff --git a/Sources/MapboxDirections/Match/Tracepoint.swift b/Sources/MapboxDirections/MapMatching/Tracepoint.swift similarity index 100% rename from Sources/MapboxDirections/Match/Tracepoint.swift rename to Sources/MapboxDirections/MapMatching/Tracepoint.swift From 6ae9af5520a4c426abd1332da2f860772f4ff5b2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Minh=20Nguye=CC=82=CC=83n?= Date: Sat, 2 Nov 2019 14:47:21 -0700 Subject: [PATCH 58/89] Alphabetized files in project Also fixed a typo in a file name. --- MapboxDirections.xcodeproj/project.pbxproj | 90 ++++++++----------- ...onsTests.swift => InstructionsTests.swift} | 0 2 files changed, 39 insertions(+), 51 deletions(-) rename Tests/MapboxDirectionsTests/{IntructionsTests.swift => InstructionsTests.swift} (100%) diff --git a/MapboxDirections.xcodeproj/project.pbxproj b/MapboxDirections.xcodeproj/project.pbxproj index cc8c8dc2c..0565bbb91 100644 --- a/MapboxDirections.xcodeproj/project.pbxproj +++ b/MapboxDirections.xcodeproj/project.pbxproj @@ -104,7 +104,7 @@ C52CE38F1F6AF63C0069963D /* SpokenInstruction.swift in Sources */ = {isa = PBXBuildFile; fileRef = C55FB44A1F6AEBF6006BD1E9 /* SpokenInstruction.swift */; }; C52CE3901F6AF63D0069963D /* SpokenInstruction.swift in Sources */ = {isa = PBXBuildFile; fileRef = C55FB44A1F6AEBF6006BD1E9 /* SpokenInstruction.swift */; }; C52CE3911F6AF63E0069963D /* SpokenInstruction.swift in Sources */ = {isa = PBXBuildFile; fileRef = C55FB44A1F6AEBF6006BD1E9 /* SpokenInstruction.swift */; }; - C52CE3931F6AF6E70069963D /* IntructionsTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = C52CE3921F6AF6E70069963D /* IntructionsTests.swift */; }; + C52CE3931F6AF6E70069963D /* InstructionsTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = C52CE3921F6AF6E70069963D /* InstructionsTests.swift */; }; C53A02261E92C26E009837BD /* AttributeOptions.swift in Sources */ = {isa = PBXBuildFile; fileRef = C51538CB1E807FF00093FF3E /* AttributeOptions.swift */; }; C53A02271E92C26F009837BD /* AttributeOptions.swift in Sources */ = {isa = PBXBuildFile; fileRef = C51538CB1E807FF00093FF3E /* AttributeOptions.swift */; }; C53A02281E92C271009837BD /* AttributeOptions.swift in Sources */ = {isa = PBXBuildFile; fileRef = C51538CB1E807FF00093FF3E /* AttributeOptions.swift */; }; @@ -154,8 +154,8 @@ C5D1D7F01F6AF91700A1C4F1 /* instructions.json in Resources */ = {isa = PBXBuildFile; fileRef = C5D1D7EF1F6AF91700A1C4F1 /* instructions.json */; }; C5D1D7F11F6AF92500A1C4F1 /* instructions.json in Resources */ = {isa = PBXBuildFile; fileRef = C5D1D7EF1F6AF91700A1C4F1 /* instructions.json */; }; C5D1D7F21F6AF92600A1C4F1 /* instructions.json in Resources */ = {isa = PBXBuildFile; fileRef = C5D1D7EF1F6AF91700A1C4F1 /* instructions.json */; }; - C5D1D7F31F6AFBD600A1C4F1 /* IntructionsTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = C52CE3921F6AF6E70069963D /* IntructionsTests.swift */; }; - C5D1D7F41F6AFBD600A1C4F1 /* IntructionsTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = C52CE3921F6AF6E70069963D /* IntructionsTests.swift */; }; + C5D1D7F31F6AFBD600A1C4F1 /* InstructionsTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = C52CE3921F6AF6E70069963D /* InstructionsTests.swift */; }; + C5D1D7F41F6AFBD600A1C4F1 /* InstructionsTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = C52CE3921F6AF6E70069963D /* InstructionsTests.swift */; }; C5DAAC9A20191675001F9261 /* Match.swift in Sources */ = {isa = PBXBuildFile; fileRef = C5DAAC9920191675001F9261 /* Match.swift */; }; C5DAAC9B2019167C001F9261 /* Match.swift in Sources */ = {isa = PBXBuildFile; fileRef = C5DAAC9920191675001F9261 /* Match.swift */; }; C5DAAC9C2019167D001F9261 /* Match.swift in Sources */ = {isa = PBXBuildFile; fileRef = C5DAAC9920191675001F9261 /* Match.swift */; }; @@ -332,7 +332,7 @@ C51538CB1E807FF00093FF3E /* AttributeOptions.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AttributeOptions.swift; sourceTree = ""; }; C5247D701E818A24004B6154 /* AnnotationTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AnnotationTests.swift; sourceTree = ""; }; C52552B81FA15D5900B1545C /* VisualInstructionBanner.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = VisualInstructionBanner.swift; sourceTree = ""; }; - C52CE3921F6AF6E70069963D /* IntructionsTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = IntructionsTests.swift; sourceTree = ""; }; + C52CE3921F6AF6E70069963D /* InstructionsTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = InstructionsTests.swift; sourceTree = ""; }; C5434B89200693D00069E887 /* Tracepoint.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Tracepoint.swift; sourceTree = ""; }; C5434B8B200695A50069E887 /* MatchOptions.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MatchOptions.swift; sourceTree = ""; }; C55FB44A1F6AEBF6006BD1E9 /* SpokenInstruction.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SpokenInstruction.swift; sourceTree = ""; }; @@ -346,13 +346,7 @@ C59426061F1EA6C400C8E59C /* RoadClasses.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RoadClasses.swift; sourceTree = ""; }; C59666382048A20E00C45CE5 /* RoutableMatchTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RoutableMatchTests.swift; sourceTree = ""; }; C5A3D3971E8188FE00D494A0 /* annotation.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; name = annotation.json; path = v5/annotation.json; sourceTree = ""; }; - C5AD8658202E24F500BF47D5 /* AWSPolly.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AWSPolly.framework; path = Carthage/Build/iOS/AWSPolly.framework; sourceTree = ""; }; - C5AD8659202E24F500BF47D5 /* AWSCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AWSCore.framework; path = Carthage/Build/iOS/AWSCore.framework; sourceTree = ""; }; C5AD865A202E24F500BF47D5 /* Turf.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Turf.framework; path = Carthage/Build/iOS/Turf.framework; sourceTree = ""; }; - C5AD865B202E24F500BF47D5 /* MapboxNavigation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = MapboxNavigation.framework; path = Carthage/Build/iOS/MapboxNavigation.framework; sourceTree = ""; }; - C5AD865C202E24F500BF47D5 /* SDWebImage.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = SDWebImage.framework; path = Carthage/Build/iOS/SDWebImage.framework; sourceTree = ""; }; - C5AD865D202E24F500BF47D5 /* MapboxCoreNavigation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = MapboxCoreNavigation.framework; path = Carthage/Build/iOS/MapboxCoreNavigation.framework; sourceTree = ""; }; - C5AD865E202E24F500BF47D5 /* MapboxMobileEvents.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = MapboxMobileEvents.framework; path = Carthage/Build/iOS/MapboxMobileEvents.framework; sourceTree = ""; }; C5C0D6332058523E003A3B1D /* null-tracepoint.json */ = {isa = PBXFileReference; lastKnownFileType = text.json; path = "null-tracepoint.json"; sourceTree = ""; }; C5D1D7EF1F6AF91700A1C4F1 /* instructions.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = instructions.json; sourceTree = ""; }; C5DAAC9920191675001F9261 /* Match.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Match.swift; sourceTree = ""; }; @@ -489,6 +483,7 @@ DADD27F21E5ABD4300D31FAD /* Mapbox.framework */, F448F8381DDCC6D7000BC343 /* OHHTTPStubs.framework */, F448F82A1DDCC5B6000BC343 /* Polyline.framework */, + C5AD865A202E24F500BF47D5 /* Turf.framework */, ); name = "iOS Frameworks"; sourceTree = ""; @@ -514,13 +509,13 @@ 8D381B681FDB1009008D5A58 /* Extensions */ = { isa = PBXGroup; children = ( - 8D381B691FDB101F008D5A58 /* String.swift */, + C582BA2D2073ED6300647DAA /* Array.swift */, 43208BA62343F7C300D8BD89 /* Codable.swift */, 43208BA82343F7E900D8BD89 /* CoreLocation.swift */, - 43208BAA2343F81900D8BD89 /* GeoJSON.swift */, - C582BA2D2073ED6300647DAA /* Array.swift */, 8D434678219E1167008B7BF3 /* Double.swift */, + 43208BAA2343F81900D8BD89 /* GeoJSON.swift */, 35DBF00E217E17A30009D2AE /* HTTPURLResponse.swift */, + 8D381B691FDB101F008D5A58 /* String.swift */, ); path = Extensions; sourceTree = ""; @@ -536,13 +531,6 @@ C5AD8656202E24F400BF47D5 /* Frameworks */ = { isa = PBXGroup; children = ( - C5AD8659202E24F500BF47D5 /* AWSCore.framework */, - C5AD8658202E24F500BF47D5 /* AWSPolly.framework */, - C5AD865D202E24F500BF47D5 /* MapboxCoreNavigation.framework */, - C5AD865E202E24F500BF47D5 /* MapboxMobileEvents.framework */, - C5AD865B202E24F500BF47D5 /* MapboxNavigation.framework */, - C5AD865C202E24F500BF47D5 /* SDWebImage.framework */, - C5AD865A202E24F500BF47D5 /* Turf.framework */, ); name = Frameworks; sourceTree = ""; @@ -560,11 +548,11 @@ C5DAAC9E20191683001F9261 /* MapMatching */ = { isa = PBXGroup; children = ( - C5434B89200693D00069E887 /* Tracepoint.swift */, - C5434B8B200695A50069E887 /* MatchOptions.swift */, - 43F89F922350F952007B591E /* MatchResponse.swift */, 43F89F97235778DE007B591E /* MapMatchingResponse.swift */, C5DAAC9920191675001F9261 /* Match.swift */, + C5434B8B200695A50069E887 /* MatchOptions.swift */, + 43F89F922350F952007B591E /* MatchResponse.swift */, + C5434B89200693D00069E887 /* Tracepoint.swift */, ); path = MapMatching; sourceTree = ""; @@ -583,32 +571,32 @@ children = ( 8D381B681FDB1009008D5A58 /* Extensions */, C5DAAC9E20191683001F9261 /* MapMatching */, - DA6C9D8A1CAE442B00094FBC /* MapboxDirections.h */, + C51538CB1E807FF00093FF3E /* AttributeOptions.swift */, + C58EA7A91E9D7EAD008F98CE /* Congestion.swift */, + 35DBF004217DF0D90009D2AE /* CoordinateBounds.swift */, DD6254731AE70CB700017857 /* Directions.swift */, 4392557523440EC2006EEE88 /* DirectionsError.swift */, + C59094BE203B800300EB2417 /* DirectionsOptions.swift */, + 438BFEC1233D854D00457294 /* DirectionsProfileIdentifier.swift */, C59094C0203DE6BC00EB2417 /* DirectionsResult.swift */, - 43208BAC2343FF5500D8BD89 /* RouteResponse.swift */, - DAC05F171CFC075300FA0071 /* Route.swift */, 431E93BE234664A200A71B44 /* DrivingSide.swift */, - DAC05F191CFC077C00FA0071 /* RouteLeg.swift */, - DA2E03EA1CB0E13D00D1269A /* RouteOptions.swift */, - 438BFEC1233D854D00457294 /* DirectionsProfileIdentifier.swift */, - C59094BE203B800300EB2417 /* DirectionsOptions.swift */, - DA2E03E81CB0E0B000D1269A /* RouteStep.swift */, + DA6C9D8C1CAE442B00094FBC /* Info.plist */, C57D55001DB5669600B94B74 /* Intersection.swift */, C57D55071DB58C0200B94B74 /* Lane.swift */, DAA76D671DD127CB0015EC78 /* LaneIndication.swift */, - DAC05F151CFBFAC400FA0071 /* Waypoint.swift */, - C51538CB1E807FF00093FF3E /* AttributeOptions.swift */, - C58EA7A91E9D7EAD008F98CE /* Congestion.swift */, + DA6C9D8A1CAE442B00094FBC /* MapboxDirections.h */, + 35828C9D217A003F00ED546E /* OfflineDirections.swift */, C59426061F1EA6C400C8E59C /* RoadClasses.swift */, - DA6C9D8C1CAE442B00094FBC /* Info.plist */, + DAC05F171CFC075300FA0071 /* Route.swift */, + DAC05F191CFC077C00FA0071 /* RouteLeg.swift */, + DA2E03EA1CB0E13D00D1269A /* RouteOptions.swift */, + 43208BAC2343FF5500D8BD89 /* RouteResponse.swift */, + DA2E03E81CB0E0B000D1269A /* RouteStep.swift */, C55FB44A1F6AEBF6006BD1E9 /* SpokenInstruction.swift */, - C52552B81FA15D5900B1545C /* VisualInstructionBanner.swift */, 35EFD00A207DFACA00BF3873 /* VisualInstruction.swift */, + C52552B81FA15D5900B1545C /* VisualInstructionBanner.swift */, AEDC211C20B6104A0052DED8 /* VisualInstructionComponent.swift */, - 35828C9D217A003F00ED546E /* OfflineDirections.swift */, - 35DBF004217DF0D90009D2AE /* CoordinateBounds.swift */, + DAC05F151CFBFAC400FA0071 /* Waypoint.swift */, ); name = MapboxDirections; path = Sources/MapboxDirections; @@ -617,24 +605,24 @@ DA6C9D971CAE442B00094FBC /* MapboxDirectionsTests */ = { isa = PBXGroup; children = ( - F4D785EE1DDD82C100FF4665 /* RouteStepTests.swift */, - DAE9E0F31EB7DE2E001E8E8B /* RouteOptionsTests.swift */, + DA6C9DAD1CAEC93800094FBC /* Fixtures */, + C5247D701E818A24004B6154 /* AnnotationTests.swift */, DA1A110A1D01045E009F82FA /* DirectionsTests.swift */, - DA6C9DAB1CAEC72800094FBC /* V5Tests.swift */, DA6C9DB11CAECA0E00094FBC /* Fixture.swift */, - DA4F84EC21C08BFB008A0434 /* WaypointTests.swift */, - C5247D701E818A24004B6154 /* AnnotationTests.swift */, + DA6C9D9A1CAE442B00094FBC /* Info.plist */, + C52CE3921F6AF6E70069963D /* InstructionsTests.swift */, DAE33A1A1F215DF600C06039 /* IntersectionTests.swift */, - C52CE3921F6AF6E70069963D /* IntructionsTests.swift */, + DABE6C7D236A37E200D370F4 /* JSONSerialization.swift */, + 3556CE9922649CF2009397B5 /* MapboxDirectionsTests-Bridging-Header.h */, C5DAACAE201AA92B001F9261 /* MatchTests.swift */, 35DBF013217E199E0009D2AE /* OfflineDirectionsTests.swift */, C59666382048A20E00C45CE5 /* RoutableMatchTests.swift */, + DAE9E0F31EB7DE2E001E8E8B /* RouteOptionsTests.swift */, + F4D785EE1DDD82C100FF4665 /* RouteStepTests.swift */, + DA6C9DAB1CAEC72800094FBC /* V5Tests.swift */, DA688B3D21B89ECD00C9BB25 /* VisualInstructionComponentTests.swift */, - DA6C9D9A1CAE442B00094FBC /* Info.plist */, - DA6C9DAD1CAEC93800094FBC /* Fixtures */, 35CC310A2285739700EA1966 /* WalkingOptionsTests.swift */, - 3556CE9922649CF2009397B5 /* MapboxDirectionsTests-Bridging-Header.h */, - DABE6C7D236A37E200D370F4 /* JSONSerialization.swift */, + DA4F84EC21C08BFB008A0434 /* WaypointTests.swift */, ); name = MapboxDirectionsTests; path = Tests/MapboxDirectionsTests; @@ -1195,7 +1183,7 @@ C5DAACB0201AA92B001F9261 /* MatchTests.swift in Sources */, DA1A10CE1D00F972009F82FA /* Fixture.swift in Sources */, DA1A110C1D01045E009F82FA /* DirectionsTests.swift in Sources */, - C5D1D7F31F6AFBD600A1C4F1 /* IntructionsTests.swift in Sources */, + C5D1D7F31F6AFBD600A1C4F1 /* InstructionsTests.swift in Sources */, DA4F84EE21C08BFB008A0434 /* WaypointTests.swift in Sources */, 35CC310C2285739700EA1966 /* WalkingOptionsTests.swift in Sources */, DABE6C7F236A37E200D370F4 /* JSONSerialization.swift in Sources */, @@ -1260,7 +1248,7 @@ C5DAACB1201AA92B001F9261 /* MatchTests.swift in Sources */, DA1A10F51D010251009F82FA /* Fixture.swift in Sources */, DA1A110D1D01045E009F82FA /* DirectionsTests.swift in Sources */, - C5D1D7F41F6AFBD600A1C4F1 /* IntructionsTests.swift in Sources */, + C5D1D7F41F6AFBD600A1C4F1 /* InstructionsTests.swift in Sources */, DA4F84EF21C08BFB008A0434 /* WaypointTests.swift in Sources */, 35CC310D2285739700EA1966 /* WalkingOptionsTests.swift in Sources */, DABE6C80236A37E200D370F4 /* JSONSerialization.swift in Sources */, @@ -1368,7 +1356,7 @@ C5DAACAF201AA92B001F9261 /* MatchTests.swift in Sources */, DA6C9DB21CAECA0E00094FBC /* Fixture.swift in Sources */, DA1A110B1D01045E009F82FA /* DirectionsTests.swift in Sources */, - C52CE3931F6AF6E70069963D /* IntructionsTests.swift in Sources */, + C52CE3931F6AF6E70069963D /* InstructionsTests.swift in Sources */, DA4F84ED21C08BFB008A0434 /* WaypointTests.swift in Sources */, 35CC310B2285739700EA1966 /* WalkingOptionsTests.swift in Sources */, DABE6C7E236A37E200D370F4 /* JSONSerialization.swift in Sources */, diff --git a/Tests/MapboxDirectionsTests/IntructionsTests.swift b/Tests/MapboxDirectionsTests/InstructionsTests.swift similarity index 100% rename from Tests/MapboxDirectionsTests/IntructionsTests.swift rename to Tests/MapboxDirectionsTests/InstructionsTests.swift From 9542a219e5b0026127094347ecba3043ce4a903f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Minh=20Nguye=CC=82=CC=83n?= Date: Sat, 2 Nov 2019 14:58:29 -0700 Subject: [PATCH 59/89] Fixed merge errors with DirectionsPriority --- .../MapboxDirections/DirectionsOptions.swift | 29 +++++++++++++++++++ .../DirectionsProfileIdentifier.swift | 21 ++------------ 2 files changed, 31 insertions(+), 19 deletions(-) diff --git a/Sources/MapboxDirections/DirectionsOptions.swift b/Sources/MapboxDirections/DirectionsOptions.swift index 56e33b6a9..594a0f6bb 100644 --- a/Sources/MapboxDirections/DirectionsOptions.swift +++ b/Sources/MapboxDirections/DirectionsOptions.swift @@ -77,6 +77,35 @@ public enum MeasurementSystem: String, Codable { case metric } +@available(*, deprecated, renamed: "DirectionsPriority") +public typealias MBDirectionsPriority = DirectionsPriority + +/** + A number that influences whether a route should prefer or avoid roadways or pathways of a given type. + */ +public struct DirectionsPriority: Hashable, RawRepresentable { + public init(rawValue: Double) { + self.rawValue = rawValue + } + + public var rawValue: Double + + /** + The priority level with which a route avoids a particular type of roadway or pathway. + */ + static let low = DirectionsPriority(rawValue: -1.0) + + /** + The priority level with which a route neither avoids nor prefers a particular type of roadway or pathway. + */ + static let `default` = DirectionsPriority(rawValue: 0.0) + + /** + The priority level with which a route prefers a particular type of roadway or pathway. + */ + static let high = DirectionsPriority(rawValue: 1.0) +} + /** Options for calculating results from the Mapbox Directions service. diff --git a/Sources/MapboxDirections/DirectionsProfileIdentifier.swift b/Sources/MapboxDirections/DirectionsProfileIdentifier.swift index 6a5f72577..026baa5ed 100644 --- a/Sources/MapboxDirections/DirectionsProfileIdentifier.swift +++ b/Sources/MapboxDirections/DirectionsProfileIdentifier.swift @@ -4,10 +4,8 @@ import Foundation public typealias MBDirectionsProfileIdentifier = DirectionsProfileIdentifier /** -The returned directions are appropriate for driving or riding a car, truck, or motorcycle. - -This profile prioritizes fast routes by preferring high-speed roads like highways. A driving route may use a ferry where necessary. -*/ + Options determining the primary mode of transportation for the routes. + */ public struct DirectionsProfileIdentifier: Codable, Hashable, RawRepresentable { public init(rawValue: String) { self.rawValue = rawValue @@ -45,18 +43,3 @@ public struct DirectionsProfileIdentifier: Codable, Hashable, RawRepresentable { */ public static let walking: DirectionsProfileIdentifier = .init(rawValue: "mapbox/walking") } - -@available(*, deprecated, renamed: "DirectionsPriority") -public typealias MBDirectionsPriority = DirectionsPriority - -public struct DirectionsPriority: Hashable, RawRepresentable { - public init(rawValue: Double) { - self.rawValue = rawValue - } - - public var rawValue: Double - - static let low = DirectionsPriority(rawValue: -1.0) - static let `default` = DirectionsPriority(rawValue: 0.0) - static let high = DirectionsPriority(rawValue: 1.0) -} From f9b2c908b74512a71b1d1594096403e82a80f682 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Minh=20Nguye=CC=82=CC=83n?= Date: Sat, 2 Nov 2019 15:34:01 -0700 Subject: [PATCH 60/89] Restored missing documentation comments --- .../MapboxDirections/AttributeOptions.swift | 5 ++ .../MapboxDirections/DirectionsError.swift | 51 +++++++++++++++++++ Sources/MapboxDirections/LaneIndication.swift | 6 +++ Sources/MapboxDirections/RouteStep.swift | 2 +- 4 files changed, 63 insertions(+), 1 deletion(-) diff --git a/Sources/MapboxDirections/AttributeOptions.swift b/Sources/MapboxDirections/AttributeOptions.swift index ea88efbbb..0406ec732 100644 --- a/Sources/MapboxDirections/AttributeOptions.swift +++ b/Sources/MapboxDirections/AttributeOptions.swift @@ -1,5 +1,10 @@ import Foundation +/** + Attributes are metadata information for a route leg. + + When any of the attributes are specified, the resulting route leg contains one attribute value for each segment in leg, where a segment is the straight line between two coordinates in the route leg’s full geometry. + */ public struct AttributeOptions: OptionSet, CustomStringConvertible { public var rawValue: Int diff --git a/Sources/MapboxDirections/DirectionsError.swift b/Sources/MapboxDirections/DirectionsError.swift index 94f974e67..58cb796ec 100644 --- a/Sources/MapboxDirections/DirectionsError.swift +++ b/Sources/MapboxDirections/DirectionsError.swift @@ -1,16 +1,67 @@ import Foundation public enum DirectionsError: LocalizedError { + /** + The server returned an empty response. + */ case noData + case invalidInput(message: String?) + + /** + The server returned a response that isn’t correctly formatted. + */ case invalidResponse + + /** + No route could be found between the specified locations. + + Make sure it is possible to travel between the locations with the mode of transportation implied by the profileIdentifier option. For example, it is impossible to travel by car from one continent to another without either a land bridge or a ferry connection. + */ case unableToRoute + + /** + The specified coordinates could not be matched to the road network. + + Try again making sure that your tracepoints lie in close proximity to a road or path. + */ case noMatches + + /** + The request specifies too many coordinates. + + Try again with fewer coordinates. + */ case tooManyCoordinates + + /** + A specified location could not be associated with a roadway or pathway. + + Make sure the locations are close enough to a roadway or pathway. Try setting the `Waypoint.coordinateAccuracy` property of all the waypoints to `nil`. + */ case unableToLocate + + /** + Unrecognized profile identifier. + + Make sure the `DirectionsOptions.profileIdentifier` option is set to one of the predefined values, such as `DirectionsProfileIdentifier.automobile`. + */ case profileNotFound + + /** + The request is too large. + + Try specifying fewer waypoints or giving the waypoints shorter names. + */ case requestTooLarge + + /** + Too many requests have been made with the same access token within a certain period of time. + + Wait before retrying. + */ case rateLimited(rateLimitInterval: TimeInterval?, rateLimit: UInt?, resetTime: Date?) + case unknown(response: URLResponse?, underlying: Error?, code: String?, message: String?) public var failureReason: String? { diff --git a/Sources/MapboxDirections/LaneIndication.swift b/Sources/MapboxDirections/LaneIndication.swift index a270e8c9d..fc6d216c7 100644 --- a/Sources/MapboxDirections/LaneIndication.swift +++ b/Sources/MapboxDirections/LaneIndication.swift @@ -1,5 +1,11 @@ import Foundation +/** + Each of these options specifies a maneuver direction for which a given lane can + be used. + + A Lane object has zero or more indications that usually correspond to arrows on signs or pavement markings. If no options are specified, it may be the case that no maneuvers are indicated on signage or pavement markings for the lane. + */ public struct LaneIndication: OptionSet, CustomStringConvertible { public var rawValue: Int diff --git a/Sources/MapboxDirections/RouteStep.swift b/Sources/MapboxDirections/RouteStep.swift index a9178a921..79de53fb3 100644 --- a/Sources/MapboxDirections/RouteStep.swift +++ b/Sources/MapboxDirections/RouteStep.swift @@ -73,7 +73,7 @@ public enum TransportType: String, Codable { /** A `ManeuverType` specifies the type of maneuver required to complete the route step. You can pair a maneuver type with a `ManeuverDirection` to choose an appropriate visual or voice prompt to present the user. - In Swift, you can use pattern matching with a single switch statement on a tuple containing the maneuver type and maneuver direction to avoid a complex series of if-else-if statements or switch statements. + To avoid a complex series of if-else-if statements or switch statements, use pattern matching with a single switch statement on a tuple that consists of the maneuver type and maneuver direction. */ public enum ManeuverType: String, Codable { /** From f594b282005d0ca4805759b2322fa47fe66d12f3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Minh=20Nguye=CC=82=CC=83n?= Date: Sat, 2 Nov 2019 15:34:32 -0700 Subject: [PATCH 61/89] Simplified example map usage --- Directions Example/ViewController.swift | 23 ++++++++++++----------- README.md | 12 +++++++----- 2 files changed, 19 insertions(+), 16 deletions(-) diff --git a/Directions Example/ViewController.swift b/Directions Example/ViewController.swift index c94c6bca2..5b02c6896 100644 --- a/Directions Example/ViewController.swift +++ b/Directions Example/ViewController.swift @@ -69,8 +69,8 @@ class ViewController: UIViewController, MBDrawingViewDelegate { options.includesSteps = true Directions.shared.calculate(options) { (waypoints, routes, error) in - guard error == nil else { - print("Error calculating directions: \(error!)") + if let error = error { + print("Error calculating directions: \(error)") return } @@ -94,15 +94,16 @@ class ViewController: UIViewController, MBDrawingViewDelegate { } } - if let shape = route.shape, shape.coordinates.count > 0 { + if var routeCoordinates = route.shape?.coordinates, routeCoordinates.count > 0 { // Convert the route’s coordinates into a polyline. - var routeCoordinates = shape.coordinates - let coordCount = UInt(routeCoordinates.count) - let routeLine = MGLPolyline(coordinates: &routeCoordinates, count: coordCount) - - // Add the polyline to the map and fit the viewport to the polyline. + let routeLine = MGLPolyline(coordinates: &routeCoordinates, count: UInt(routeCoordinates.count)) + + // Add the polyline to the map. self.mapView.addAnnotation(routeLine) - self.mapView?.setVisibleCoordinates(&routeCoordinates, count: coordCount, edgePadding: .zero, animated: true) + + // Fit the viewport to the polyline. + let camera = self.mapView.cameraThatFitsShape(routeLine, direction: 0, edgePadding: .zero) + self.mapView.setCamera(camera, animated: true) } } } @@ -144,8 +145,8 @@ class ViewController: UIViewController, MBDrawingViewDelegate { if let error = error { let errorString = """ ⚠️ Error Enountered. ⚠️ - Failure Reason: \(error.failureReason) - Recovery Suggestion: \(error.recoverySuggestion) + Failure Reason: \(error.failureReason ?? "") + Recovery Suggestion: \(error.recoverySuggestion ?? "") Technical Details: \(error) """ diff --git a/README.md b/README.md index 5794f2304..9bc0c9bec 100644 --- a/README.md +++ b/README.md @@ -160,14 +160,16 @@ With the [Mapbox Maps SDK for iOS](https://docs.mapbox.com/ios/maps/) or [macOS ```swift // main.swift -if route.coordinateCount > 0 { +if var routeCoordinates = route.shape?.coordinates, routeCoordinates.count > 0 { // Convert the route’s coordinates into a polyline. - var routeCoordinates = route.coordinates! - let routeLine = MGLPolyline(coordinates: &routeCoordinates, count: route.coordinateCount) + let routeLine = MGLPolyline(coordinates: &routeCoordinates, count: UInt(routeCoordinates.count)) - // Add the polyline to the map and fit the viewport to the polyline. + // Add the polyline to the map. mapView.addAnnotation(routeLine) - mapView.setVisibleCoordinates(&routeCoordinates, count: route.coordinateCount, edgePadding: .zero, animated: true) + + // Fit the viewport to the polyline. + let camera = mapView.cameraThatFitsShape(routeLine, direction: 0, edgePadding: .zero) + mapView.setCamera(camera, animated: true) } ``` From 8c8c9889b58922f60e4fb0d3f75ed30ae2462b22 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Minh=20Nguye=CC=82=CC=83n?= Date: Sat, 2 Nov 2019 15:44:49 -0700 Subject: [PATCH 62/89] Perform bounds checking in release code too --- Sources/MapboxDirections/CoordinateBounds.swift | 2 +- Sources/MapboxDirections/Directions.swift | 2 +- Sources/MapboxDirections/RouteOptions.swift | 4 +--- 3 files changed, 3 insertions(+), 5 deletions(-) diff --git a/Sources/MapboxDirections/CoordinateBounds.swift b/Sources/MapboxDirections/CoordinateBounds.swift index ceb050d55..d5cc7f9ea 100644 --- a/Sources/MapboxDirections/CoordinateBounds.swift +++ b/Sources/MapboxDirections/CoordinateBounds.swift @@ -31,7 +31,7 @@ public struct CoordinateBounds { Initializes a coordinate bounds that includes all the given coordinates. */ public init(coordinates: [CLLocationCoordinate2D]) { - assert(coordinates.count >= 2, "coordinates must consist of at least two coordinates") + precondition(coordinates.count >= 2, "There must be at least two coordinates to create a coordinate bounds.") var maximumLatitude: CLLocationDegrees = -90 var minimumLatitude: CLLocationDegrees = 90 diff --git a/Sources/MapboxDirections/Directions.swift b/Sources/MapboxDirections/Directions.swift index e64c15525..d79a1e2b4 100644 --- a/Sources/MapboxDirections/Directions.swift +++ b/Sources/MapboxDirections/Directions.swift @@ -114,7 +114,7 @@ open class Directions: NSObject { */ public init(accessToken: String?, host: String?) { let accessToken = accessToken ?? defaultAccessToken - assert(accessToken != nil && !accessToken!.isEmpty, "A Mapbox access token is required. Go to . In Info.plist, set the MGLMapboxAccessToken key to your access token, or use the Directions(accessToken:host:) initializer.") + precondition(accessToken != nil && !accessToken!.isEmpty, "A Mapbox access token is required. Go to . In Info.plist, set the MGLMapboxAccessToken key to your access token, or use the Directions(accessToken:host:) initializer.") self.accessToken = accessToken! diff --git a/Sources/MapboxDirections/RouteOptions.swift b/Sources/MapboxDirections/RouteOptions.swift index 9851eba35..9ad37999a 100644 --- a/Sources/MapboxDirections/RouteOptions.swift +++ b/Sources/MapboxDirections/RouteOptions.swift @@ -177,9 +177,7 @@ open class RouteOptions: DirectionsOptions { if !roadClassesToAvoid.isEmpty { let allRoadClasses = roadClassesToAvoid.description.components(separatedBy: ",") - if allRoadClasses.count > 1 { - assert(false, "`roadClassesToAvoid` only accepts one `RoadClasses`.") - } + precondition(allRoadClasses.count < 2, "You can only avoid one road class at a time.") if let firstRoadClass = allRoadClasses.first { params.append(URLQueryItem(name: "exclude", value: firstRoadClass)) } From 73816554d7e38f374c777b4908fcef5257e6af8a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Minh=20Nguye=CC=82=CC=83n?= Date: Sat, 2 Nov 2019 15:58:04 -0700 Subject: [PATCH 63/89] Obviated an implicitly unwrapped optional --- Sources/MapboxDirections/VisualInstructionBanner.swift | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/Sources/MapboxDirections/VisualInstructionBanner.swift b/Sources/MapboxDirections/VisualInstructionBanner.swift index 9a6e8aaab..3f5f65492 100644 --- a/Sources/MapboxDirections/VisualInstructionBanner.swift +++ b/Sources/MapboxDirections/VisualInstructionBanner.swift @@ -36,6 +36,8 @@ open class VisualInstructionBanner: Codable { tertiaryInstruction = try container.decodeIfPresent(VisualInstruction.self, forKey: .tertiaryInstruction) if let directlyEncoded = try container.decodeIfPresent(DrivingSide.self, forKey: .drivingSide) { drivingSide = directlyEncoded + } else { + drivingSide = .right } } @@ -70,7 +72,7 @@ open class VisualInstructionBanner: Codable { /** Which side of a bidirectional road the driver should drive on, also known as the rule of the road. */ - public var drivingSide: DrivingSide! + public var drivingSide: DrivingSide } extension VisualInstructionBanner: Equatable { From e22d22b221507eacfd1b8b4653022013bdd25b90 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Minh=20Nguye=CC=82=CC=83n?= Date: Sat, 2 Nov 2019 16:00:52 -0700 Subject: [PATCH 64/89] Updated changelog --- CHANGELOG.md | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6566289fc..b3a588f66 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,7 +2,28 @@ ## master +### Packaging + * This library now requires a minimum deployment target of iOS 10.0 or above, macOS 10.12.0 or above, tvOS 10.0 or above, or watchOS 3.0 or above. Older operating system versions are no longer supported. ([#379](https://github.com/mapbox/MapboxDirections.swift/pull/379)) +* Swift is now required to directly use public types and methods defined by this library. If your application is written in Objective-C or Cocoa-AppleScript, you need to implement your own wrapper in Swift that bridges to Objective-C. ([#382](https://github.com/mapbox/MapboxDirections.swift/pull/382)) +* This library now depends on [Turf](https://github.com/mapbox/turf-swift/). ([#382](https://github.com/mapbox/MapboxDirections.swift/pull/382)) + +### Error handling + +* The `RouteCompletionHandler` and `MatchCompletionHandler` closures’ `error` argument is now a `DirectionsError` instead of an `NSError`. ([#382](https://github.com/mapbox/MapboxDirections.swift/pull/382)) +* Classes such as `Route`, `Match`, and `RouteStep` conform to the `Codable` protocol, so you can create instances of them from JSON-formatted `Data` using `JSONDecoder` and round-trip them back to JSON using `JSONEncoder`. Malformed input now throws decoding errors instead of crashing by unwrapping `nil`s. ([#382](https://github.com/mapbox/MapboxDirections.swift/pull/382)) + +### Visual instructions + +* Removed the `Lane` class in favor of storing an array of `LaneIndication`s directly in the `Intersection.approachLanes` property. ([#382](https://github.com/mapbox/MapboxDirections.swift/pull/382)) +* Removed the `ComponentRepresentable` protocol, `VisualInstructionComponent` class, and `LaneIndicationComponent` class in favor of a `VisualInstruction.Component` enumeration that contains a `VisualInstruction.Component.TextRepresentation` and/or `VisualInstruction.Component.ImageRepresentation`, depending on the type of component. ([#382](https://github.com/mapbox/MapboxDirections.swift/pull/382)) +* Added the `VisualInstruction.Component.ImageRepresentation.imageURL(scale:format:)` method for fetching images with scales other than the current screen’s native scale or formats other than PNG. ([#382](https://github.com/mapbox/MapboxDirections.swift/pull/382)) + +### Other changes + +* Removed support for [Mapbox Directions API v4](https://docs.mapbox.com/api/legacy/directions-v4/). ([#382](https://github.com/mapbox/MapboxDirections.swift/pull/382)) +* Replaced the `MBDefaultWalkingSpeed`, `MBMinimumWalkingSpeed`, and `MBMaximumWalkingSpeed` constants with `CLLocationSpeed.normalWalking`, `CLLocationSpeed.minimumWalking`, and `CLLocationSpeed.maximumWalking`, respectively. +* Replaced the `Route.coordinates` property with `Route.shape` and the `RouteStep.coordinates` property with `RouteStep.shape`. The `Route.coordinateCount` and `RouteStep.coordinateCount` properties have been removed, but you can use the `LineString.coordinates` property to get the array of `CLLocationCoordinate2D`s. ([#382](https://github.com/mapbox/MapboxDirections.swift/pull/382)) ## v0.30.0 From 17c7367548f2d9414ff233646e7d83268be643f0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Minh=20Nguye=CC=82=CC=83n?= Date: Sat, 2 Nov 2019 20:07:59 -0700 Subject: [PATCH 65/89] Renamed DirectionsResult shape coding key for consistency --- Sources/MapboxDirections/DirectionsResult.swift | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Sources/MapboxDirections/DirectionsResult.swift b/Sources/MapboxDirections/DirectionsResult.swift index a2d81b3dc..43c428746 100644 --- a/Sources/MapboxDirections/DirectionsResult.swift +++ b/Sources/MapboxDirections/DirectionsResult.swift @@ -10,7 +10,7 @@ import struct Turf.LineString */ open class DirectionsResult: Codable { private enum CodingKeys: String, CodingKey { - case geometry = "geometry" + case shape = "geometry" case legs case distance case expectedTravelTime = "duration" @@ -31,7 +31,7 @@ open class DirectionsResult: Codable { _directionsOptions = decoder.userInfo[.options] as! DirectionsOptions - if let polyLineString = try container.decodeIfPresent(PolyLineString.self, forKey: .geometry) { + if let polyLineString = try container.decodeIfPresent(PolyLineString.self, forKey: .shape) { shape = try LineString(polyLineString: polyLineString) } else { shape = nil @@ -67,7 +67,7 @@ open class DirectionsResult: Codable { try container.encode(legs, forKey: .legs) if let shape = shape { let polyLineString = PolyLineString(lineString: shape, shapeFormat: directionsOptions.shapeFormat) - try container.encode(polyLineString, forKey: .geometry) + try container.encode(polyLineString, forKey: .shape) } try container.encode(distance, forKey: .distance) try container.encode(expectedTravelTime, forKey: .expectedTravelTime) From 08570ecd8654ed89712f45e7ca42207e68ee43c8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Minh=20Nguye=CC=82=CC=83n?= Date: Sat, 2 Nov 2019 20:08:15 -0700 Subject: [PATCH 66/89] Corrected Waypoint documentation --- Sources/MapboxDirections/Waypoint.swift | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Sources/MapboxDirections/Waypoint.swift b/Sources/MapboxDirections/Waypoint.swift index b084596c5..f1f1e08dd 100644 --- a/Sources/MapboxDirections/Waypoint.swift +++ b/Sources/MapboxDirections/Waypoint.swift @@ -163,18 +163,18 @@ public class Waypoint: Codable { } /** - A boolean value indicating whether arriving on opposite side is allowed. + A Boolean value indicating whether arriving on opposite side is allowed. This property has no effect if `DirectionsOptions.includesSteps` is set to `false`. This property corresponds to the [`approaches`](https://www.mapbox.com/api-documentation/navigation/#retrieve-directions) query parameter in the Mapbox Directions and Map Matching APIs. */ - @objc open var allowsArrivingOnOppositeSide = true + open var allowsArrivingOnOppositeSide = true // MARK: Identifying the Waypoint /** The name of the waypoint. - This argument does not affect the route, but you can set the name of a waypoint you pass into a `RouteOptions` object to help you distinguish one waypoint from another in the array of waypoints passed into the completion handler of the `Directions.calculate(_:completionHandler:)` method. + This property does not affect the route, but the name is included in the arrival instruction, to help the user distinguish between multiple destinations. The name can also help you distinguish one waypoint from another in the array of waypoints passed into the completion handler of the `Directions.calculate(_:completionHandler:)` method. */ public var name: String? From 45cd7eefbe0713dc2aafcfabe00b58203e072dff Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Minh=20Nguye=CC=82=CC=83n?= Date: Mon, 4 Nov 2019 22:54:45 -0800 Subject: [PATCH 67/89] Updated some test fixtures --- .../AnnotationTests.swift | 30 +++++++++------- .../Fixtures/Match/match.json | 2 +- .../Fixtures/Match/null-tracepoint.json | 2 +- .../Responses/apiDestinationName.json | 2 +- .../Fixtures/Responses/noDestinationName.json | 2 +- .../Fixtures/v5/annotation.json | 2 +- Tests/MapboxDirectionsTests/MatchTests.swift | 6 ++-- .../RoutableMatchTests.swift | 2 +- .../RouteOptionsTests.swift | 35 +++++++++++++------ 9 files changed, 52 insertions(+), 31 deletions(-) diff --git a/Tests/MapboxDirectionsTests/AnnotationTests.swift b/Tests/MapboxDirectionsTests/AnnotationTests.swift index 81a039227..cf805080b 100644 --- a/Tests/MapboxDirectionsTests/AnnotationTests.swift +++ b/Tests/MapboxDirectionsTests/AnnotationTests.swift @@ -20,7 +20,7 @@ class AnnotationTests: XCTestCase { "continue_straight": "true", "access_token": BogusToken, "annotations": "distance,duration,speed,congestion" - ] + ] stub(condition: isHost("api.mapbox.com") && containsQueryParams(queryParams)) { _ in @@ -31,7 +31,7 @@ class AnnotationTests: XCTestCase { let options = RouteOptions(coordinates: [ CLLocationCoordinate2D(latitude: 37.780602, longitude: -122.431373), CLLocationCoordinate2D(latitude: 37.758859, longitude: -122.404058), - ], profileIdentifier: .automobileAvoidingTraffic) + ], profileIdentifier: .automobileAvoidingTraffic) options.shapeFormat = .polyline options.includesSteps = false options.includesAlternativeRoutes = false @@ -55,17 +55,23 @@ class AnnotationTests: XCTestCase { } XCTAssertNotNil(route) - XCTAssertNotNil(route!.shape) - XCTAssertEqual(route!.shape?.coordinates.count, 99) - XCTAssertEqual(route!.routeIdentifier, "cj725hpi30yp2ztm2ehbcipmh") + if let route = route { + XCTAssertNotNil(route.shape) + XCTAssertEqual(route.shape?.coordinates.count, 155) + XCTAssertEqual(route.routeIdentifier, "ck2l3ymrx18ws68qo1ukqt9p1") + } - let leg = route!.legs.first! - XCTAssertEqual(leg.segmentDistances!.count, 98) - XCTAssertEqual(leg.segmentSpeeds!.count, 98) - XCTAssertEqual(leg.expectedSegmentTravelTimes!.count, 98) - XCTAssertEqual(leg.segmentCongestionLevels!.count, 98) - XCTAssertEqual(leg.segmentCongestionLevels!.first!, .moderate) - XCTAssertEqual(leg.segmentCongestionLevels!.last!, .low) + if let leg = route?.legs.first { + XCTAssertEqual(leg.segmentDistances?.count, 154) + XCTAssertEqual(leg.segmentSpeeds?.count, 154) + XCTAssertEqual(leg.expectedSegmentTravelTimes?.count, 154) + XCTAssertEqual(leg.segmentCongestionLevels?.count, 154) + XCTAssertEqual(leg.segmentCongestionLevels?.firstIndex(of: .unknown), 134) + XCTAssertEqual(leg.segmentCongestionLevels?.firstIndex(of: .low), 0) + XCTAssertEqual(leg.segmentCongestionLevels?.firstIndex(of: .moderate), 19) + XCTAssertEqual(leg.segmentCongestionLevels?.firstIndex(of: .heavy), 29) + XCTAssertFalse(leg.segmentCongestionLevels?.contains(.severe) ?? true) + } } } #endif diff --git a/Tests/MapboxDirectionsTests/Fixtures/Match/match.json b/Tests/MapboxDirectionsTests/Fixtures/Match/match.json index 2a2a1a0be..154c96ee5 100644 --- a/Tests/MapboxDirectionsTests/Fixtures/Match/match.json +++ b/Tests/MapboxDirectionsTests/Fixtures/Match/match.json @@ -1 +1 @@ -{"matchings":[{"confidence":0.95,"geometry":"gatfEfidjUk@Lc@@Y?E??L?^Hf@","legs":[{"summary":"North Harbor Drive","weight":2.5,"duration":2.5,"steps":[{"intersections":[{"out":0,"entry":[true],"bearings":[340],"location":[-117.172836,32.712041]}],"driving_side":"right","geometry":"gatfEfidjUUFIBK@","mode":"driving","maneuver":{"bearing_after":340,"bearing_before":0,"location":[-117.172836,32.712041],"type":"depart","instruction":"Head north on North Harbor Drive"},"weight":2.5,"duration":2.5,"name":"North Harbor Drive","distance":25},{"intersections":[{"in":0,"entry":[true],"bearings":[170],"location":[-117.17291,32.712256]}],"driving_side":"right","geometry":"sbtfEtidjU","mode":"driving","maneuver":{"bearing_after":0,"bearing_efore":350,"location":[-117.17291,32.712256],"type":"arrive","instruction":"You have arrived at your 1st destination"},"weight":0,"duration":0,"name":"North Harbor Drive","distance":0}],"distance":25},{"summary":"North Harbor Drive","weight":2.1,"duration":2.1,"steps":[{"intersections":[{"out":0,"entry":[true],"bearings":[352],"location":[-117.17291,32.712256]}],"driving_side":"right","geometry":"sbtfEtidjUA?M@G?I?A?","mode":"driving","maneuver":{"bearing_after":352,"bearing_before":0,"location":[-117.17291,32.712256],"type":"depart","instruction":"Head north on North Harbor Drive"},"weight":2.1,"duration":2.1,"name":"North Harbor Drive","distance":21},{"intersections":[{"in":0,"entry":[true],"bearings":[180],"location":[-117.17292,32.712444]}],"driving_side":"right","geometry":"wctfEvidjU","mode":"driving","maneuver":{"bearing_after":0,"bearing_before":0,"location":[-117.17292,32.712444],"type":"arrive","instruction":"You have arrived at your 2nd destination"},"weight":0,"duration":0,"name":"North Harbor Drive","distance":0}],"distance":21},{"summary":"North Harbor Drive","weight":1.4,"duration":1.4,"steps":[{"intersections":[{"out":0,"entry":[true],"bearings":[359],"location":[-117.17292,32.712444]},{"out":0,"in":1,"entry":[true,false,false],"bearings":[0,180,270],"location":[-117.172921,32.712514]}],"driving_side":"right","geometry":"wctfEvidjUM?K?","mode":"driving","maneuver":{"bearing_after":359,"bearing_before":0,"location":[-117.17292,32.712444],"type":"depart","instruction":"Head north on North Harbor Drive"},"weight":1.4,"duration":1.4,"name":"North Harbor Drive","distance":14},{"intersections":[{"in":0,"entry":[true],"bearings":[179],"location":[-117.172922,32.71257]}],"driving_side":"right","geometry":"qdtfEvidjU","mode":"driving","maneuver":{"bearing_after":0,"bearing_before":359,"location":[-117.172922,32.71257],"type":"arrive","instruction":"You have arrived at your 3rd destination"},"weight":0,"duration":0,"name":"North Harbor Drive","distance":0}],"distance":14},{"summary":"North Harbor Drive, West G Street","weight":38.4,"duration":6.5,"steps":[{"intersections":[{"out":0,"entry":[true],"bearings":[0],"location":[-117.172922,32.71257]}],"driving_side":"right","geometry":"qdtfEvidjUE?","mode":"driving","maneuver":{"bearing_after":0,"bearing_before":0,"location":[-117.172922,32.71257],"type":"depart","instruction":"Head north on North Harbor Drive"},"weight":36.3,"duration":5.5,"name":"North Harbor Drive","distance":3.2},{"intersections":[{"out":2,"in":1,"entry":[true,false,true],"bearings":[0,180,270],"location":[-117.172922,32.712599]}],"driving_side":"right","geometry":"wdtfEvidjU?L","mode":"driving","maneuver":{"bearing_after":271,"bearing_before":358,"location":[-117.172922,32.712599],"modifier":"left","type":"turn","instruction":"Turn left onto West G Street"},"weight":2.1,"duration":1,"name":"West G Street","distance":5.9},{"intersections":[{"in":0,"entry":[true],"bearings":[91],"location":[-117.172985,32.7126]}],"driving_side":"right","geometry":"wdtfEdjdjU","mode":"driving","maneuver":{"bearing_after":0,"bearing_before":271,"location":[-117.172985,32.7126],"type":"arrive","instruction":"You have arrived at your 4th destination"},"weight":0,"duration":0,"name":"West G Street","distance":0}],"distance":9.1},{"summary":"West G Street","weight":5.4,"duration":4.9,"steps":[{"intersections":[{"out":0,"entry":[true],"bearings":[273],"location":[-117.172985,32.7126]},{"out":3,"in":1,"entry":[false,false,true,true],"bearings":[0,90,180,270],"location":[-117.173011,32.712601]}],"driving_side":"right","geometry":"wdtfEdjdjU?B?X","mode":"driving","maneuver":{"bearing_after":273,"bearing_before":0,"location":[-117.172985,32.7126],"type":"depart","instruction":"Head west on West G Street"},"weight":5.4,"duration":4.9,"name":"West G Street","distance":14.8},{"intersections":[{"in":0,"entry":[true],"bearings":[88],"location":[-117.173143,32.712597]}],"driving_side":"right","geometry":"wdtfEbkdjU","mode":"driving","maneuver":{"bearing_after":0,"bearing_before":268,"location":[-117.173143,32.712597],"type":"arrive","instruction":"You have arrived at your 5th destination"},"weight":0,"duration":0,"name":"West G Street","distance":0}],"distance":14.8},{"summary":"West G Street","weight":7.2,"duration":7.2,"steps":[{"intersections":[{"out":0,"entry":[true],"bearings":[262],"location":[-117.173143,32.712597]}],"driving_side":"right","geometry":"wdtfEdkdjU@LBLBJ","mode":"driving","maneuver":{"bearing_after":262,"bearing_before":0,"location":[-117.173143,32.712597],"type":"depart","instruction":"Head west on West G Street"},"weight":7.2,"duration":7.2,"name":"West G Street","distance":20},{"intersections":[{"in":0,"entry":[true],"bearings":[61],"location":[-117.173345,32.712546]}],"driving_side":"right","geometry":"mdtfElldjU","mode":"driving","maneuver":{"bearing_after":0,"bearing_before":241,"location":[-117.173345,32.712546],"type":"arrive","instruction":"You have arrived at your destination"},"weight":0,"duration":0,"name":"West G Street","distance":0}],"distance":20}],"weight_name":"routability","weight":57,"duration":24.599999999999998,"distance":103.89999999999999}],"tracepoints":[{"alternatives_count":0,"waypoint_index":0,"matchings_index":0,"name":"North Harbor Drive","location":[-117.172836,32.712041]},{"alternatives_count":0,"waypoint_index":1,"matchings_index":0,"name":"North Harbor Drive","location":[-117.17291,32.712256]},{"alternatives_count":0,"waypoint_index":2,"matchings_index":0,"name":"North Harbor Drive","location":[-117.17292,32.712444]},{"alternatives_count":0,"waypoint_index":3,"matchings_index":0,"name":"North Harbor Drive","location":[-117.172922,32.71257]},{"alternatives_count":0,"waypoint_index":4,"matchings_index":0,"name":"West G Street","location":[-117.172985,32.7126]},{"alternatives_count":0,"waypoint_index":5,"matchings_index":0,"name":"West G Street","location":[-117.173143,32.712597]},{"alternatives_count":1,"waypoint_index":6,"matchings_index":0,"name":"West G Street","location":[-117.173345,32.712546]}],"code":"Ok"} +{"matchings":[{"confidence":0.9525618892844905,"geometry":"gatfEfidjUUFIBK@A?M@G?I?A?M?K?E??L?B?Z@LBLBJ","legs":[{"summary":"North Harbor Drive","weight":2.7,"duration":2.7,"steps":[{"intersections":[{"out":0,"entry":[true],"bearings":[340],"location":[-117.172836,32.712041]}],"driving_side":"right","geometry":"gatfEfidjUUFIBK@","mode":"driving","maneuver":{"bearing_after":340,"bearing_before":0,"location":[-117.172836,32.712041],"type":"depart","instruction":"Head north on North Harbor Drive"},"weight":2.7,"duration":2.7,"name":"North Harbor Drive","distance":25},{"intersections":[{"in":0,"entry":[true],"bearings":[170],"location":[-117.17291,32.712256]}],"driving_side":"right","geometry":"sbtfEtidjU","mode":"driving","maneuver":{"bearing_after":0,"bearing_before":350,"location":[-117.17291,32.712256],"type":"arrive","instruction":"You have arrived at your 1st destination"},"weight":0,"duration":0,"name":"North Harbor Drive","distance":0}],"distance":25},{"summary":"North Harbor Drive","weight":2.4,"duration":2.4,"steps":[{"intersections":[{"out":0,"entry":[true],"bearings":[352],"location":[-117.17291,32.712256]}],"driving_side":"right","geometry":"sbtfEtidjUA?M@G?I?A?","mode":"driving","maneuver":{"bearing_after":352,"bearing_before":0,"location":[-117.17291,32.712256],"type":"depart","instruction":"Head north on North Harbor Drive"},"weight":2.4,"duration":2.4,"name":"North Harbor Drive","distance":21},{"intersections":[{"in":0,"entry":[true],"bearings":[180],"location":[-117.17292,32.712444]}],"driving_side":"right","geometry":"wctfEvidjU","mode":"driving","maneuver":{"bearing_after":0,"bearing_before":0,"location":[-117.17292,32.712444],"type":"arrive","instruction":"You have arrived at your 2nd destination"},"weight":0,"duration":0,"name":"North Harbor Drive","distance":0}],"distance":21},{"summary":"North Harbor Drive","weight":1.6,"duration":1.6,"steps":[{"intersections":[{"out":0,"entry":[true],"bearings":[359],"location":[-117.17292,32.712444]},{"out":0,"in":1,"entry":[true,false,false],"bearings":[0,180,270],"location":[-117.172921,32.712514]}],"driving_side":"right","geometry":"wctfEvidjUM?K?","mode":"driving","maneuver":{"bearing_after":359,"bearing_before":0,"location":[-117.17292,32.712444],"type":"depart","instruction":"Head north on North Harbor Drive"},"weight":1.6,"duration":1.6,"name":"North Harbor Drive","distance":14},{"intersections":[{"in":0,"entry":[true],"bearings":[179],"location":[-117.172922,32.71257]}],"driving_side":"right","geometry":"qdtfEvidjU","mode":"driving","maneuver":{"bearing_after":0,"bearing_before":359,"location":[-117.172922,32.71257],"type":"arrive","instruction":"You have arrived at your 3rd destination"},"weight":0,"duration":0,"name":"North Harbor Drive","distance":0}],"distance":14},{"summary":"North Harbor Drive, West G Street","weight":43.3,"duration":12.5,"steps":[{"intersections":[{"out":0,"entry":[true],"bearings":[0],"location":[-117.172922,32.71257]}],"driving_side":"right","geometry":"qdtfEvidjUE?","mode":"driving","maneuver":{"bearing_after":0,"bearing_before":0,"location":[-117.172922,32.71257],"type":"depart","instruction":"Head north on North Harbor Drive"},"weight":36.3,"duration":5.5,"name":"North Harbor Drive","distance":3.2},{"intersections":[{"out":2,"in":1,"entry":[true,false,true],"bearings":[0,180,270],"location":[-117.172922,32.712599]}],"driving_side":"right","geometry":"wdtfEvidjU?L","mode":"driving","maneuver":{"bearing_after":271,"bearing_before":358,"location":[-117.172922,32.712599],"modifier":"left","type":"turn","instruction":"Turn left onto West G Street"},"weight":7,"duration":7,"name":"West G Street","distance":5.9},{"intersections":[{"in":0,"entry":[true],"bearings":[91],"location":[-117.172985,32.7126]}],"driving_side":"right","geometry":"wdtfEdjdjU","mode":"driving","maneuver":{"bearing_after":0,"bearing_before":271,"location":[-117.172985,32.7126],"type":"arrive","instruction":"You have arrived at your 4th destination"},"weight":0,"duration":0,"name":"West G Street","distance":0}],"distance":9.1},{"summary":"West G Street","weight":8.6,"duration":8.5,"steps":[{"intersections":[{"out":0,"entry":[true],"bearings":[273],"location":[-117.172985,32.7126]},{"out":3,"in":1,"entry":[false,false,true,true],"bearings":[0,90,180,270],"location":[-117.173011,32.712601]}],"driving_side":"right","geometry":"wdtfEdjdjU?B?X","mode":"driving","maneuver":{"bearing_after":273,"bearing_before":0,"location":[-117.172985,32.7126],"type":"depart","instruction":"Head west on West G Street"},"weight":8.6,"duration":8.5,"name":"West G Street","distance":14.8},{"intersections":[{"in":0,"entry":[true],"bearings":[88],"location":[-117.173143,32.712597]}],"driving_side":"right","geometry":"wdtfEbkdjU","mode":"driving","maneuver":{"bearing_after":0,"bearing_before":268,"location":[-117.173143,32.712597],"type":"arrive","instruction":"You have arrived at your 5th destination"},"weight":0,"duration":0,"name":"West G Street","distance":0}],"distance":14.8},{"summary":"West G Street","weight":9,"duration":9,"steps":[{"intersections":[{"out":0,"entry":[true],"bearings":[262],"location":[-117.173143,32.712597]}],"driving_side":"right","geometry":"wdtfEdkdjU@LBLBJ","mode":"driving","maneuver":{"bearing_after":262,"bearing_before":0,"location":[-117.173143,32.712597],"type":"depart","instruction":"Head west on West G Street"},"weight":9,"duration":9,"name":"West G Street","distance":20},{"intersections":[{"in":0,"entry":[true],"bearings":[61],"location":[-117.173345,32.712546]}],"driving_side":"right","geometry":"mdtfElldjU","mode":"driving","maneuver":{"bearing_after":0,"bearing_before":241,"location":[-117.173345,32.712546],"type":"arrive","instruction":"You have arrived at your destination"},"weight":0,"duration":0,"name":"West G Street","distance":0}],"distance":20}],"weight_name":"routability","weight":67.6,"duration":36.7,"distance":103.89999999999999}],"tracepoints":[{"alternatives_count":0,"waypoint_index":0,"matchings_index":0,"distance":0,"name":"North Harbor Drive","location":[-117.172836,32.712041]},{"alternatives_count":0,"waypoint_index":1,"matchings_index":0,"distance":0,"name":"North Harbor Drive","location":[-117.17291,32.712256]},{"alternatives_count":0,"waypoint_index":2,"matchings_index":0,"distance":0,"name":"North Harbor Drive","location":[-117.17292,32.712444]},{"alternatives_count":0,"waypoint_index":3,"matchings_index":0,"distance":0,"name":"North Harbor Drive","location":[-117.172922,32.71257]},{"alternatives_count":0,"waypoint_index":4,"matchings_index":0,"distance":0,"name":"West G Street","location":[-117.172985,32.7126]},{"alternatives_count":0,"waypoint_index":5,"matchings_index":0,"distance":0,"name":"West G Street","location":[-117.173143,32.712597]},{"alternatives_count":1,"waypoint_index":6,"matchings_index":0,"distance":0,"name":"West G Street","location":[-117.173345,32.712546]}],"code":"Ok"} \ No newline at end of file diff --git a/Tests/MapboxDirectionsTests/Fixtures/Match/null-tracepoint.json b/Tests/MapboxDirectionsTests/Fixtures/Match/null-tracepoint.json index cd0df13a5..3c06e345c 100644 --- a/Tests/MapboxDirectionsTests/Fixtures/Match/null-tracepoint.json +++ b/Tests/MapboxDirectionsTests/Fixtures/Match/null-tracepoint.json @@ -1 +1 @@ -{"matchings":[{"confidence":0.9042230698288777,"geometry":"wctfEvidjUY?E??L?^Hf@","legs":[{"summary":"North Harbor Drive","weight":1.4,"duration":1.4,"steps":[{"intersections":[{"out":0,"entry":[true],"bearings":[359],"location":[-117.17292,32.712444]},{"out":0,"in":1,"entry":[true,false,false],"bearings":[0,180,270],"location":[-117.172921,32.712514]}],"driving_side":"right","geometry":"wctfEvidjUM?K?","mode":"driving","maneuver":{"bearing_after":359,"bearing_before":0,"location":[-117.17292,32.712444],"type":"depart","instruction":"Head north on North Harbor Drive"},"weight":1.4,"duration":1.4,"name":"North Harbor Drive","distance":14},{"intersections":[{"in":0,"entry":[true],"bearings":[179],"location":[-117.172922,32.71257]}],"driving_side":"right","geometry":"qdtfEvidjU","mode":"driving","maneuver":{"bearing_after":0,"bearing_before":359,"location":[-117.172922,32.71257],"type":"arrive","instruction":"You have arrived at your 1st destination"},"weight":0,"duration":0,"name":"North Harbor Drive","distance":0}],"distance":14},{"summary":"North Harbor Drive, West G Street","weight":38.4,"duration":6.5,"steps":[{"intersections":[{"out":0,"entry":[true],"bearings":[0],"location":[-117.172922,32.71257]}],"driving_side":"right","geometry":"qdtfEvidjUE?","mode":"driving","maneuver":{"bearing_after":0,"bearing_before":0,"location":[-117.172922,32.71257],"type":"depart","instruction":"Head north on North Harbor Drive"},"weight":36.3,"duration":5.5,"name":"North Harbor Drive","distance":3.2},{"intersections":[{"out":2,"in":1,"entry":[true,false,true],"bearings":[0,180,270],"location":[-117.172922,32.712599]}],"driving_side":"right","geometry":"wdtfEvidjU?L","mode":"driving","maneuver":{"bearing_after":271,"bearing_before":358,"location":[-117.172922,32.712599],"modifier":"left","type":"turn","instruction":"Turn left onto West G Street"},"weight":2.1,"duration":1,"name":"West G Street","distance":5.9},{"intersections":[{"in":0,"entry":[true],"bearings":[91],"location":[-117.172985,32.7126]}],"driving_side":"right","geometry":"wdtfEdjdjU","mode":"driving","maneuver":{"bearing_after":0,"bearing_before":271,"location":[-117.172985,32.7126],"type":"arrive","instruction":"You have arrived at your 2nd destination"},"weight":0,"duration":0,"name":"West G Street","distance":0}],"distance":9.1},{"summary":"West G Street","weight":5.9,"duration":5.4,"steps":[{"intersections":[{"out":0,"entry":[true],"bearings":[273],"location":[-117.172985,32.7126]},{"out":3,"in":1,"entry":[false,false,true,true],"bearings":[0,90,180,270],"location":[-117.173011,32.712601]}],"driving_side":"right","geometry":"wdtfEdjdjU?B?X","mode":"driving","maneuver":{"bearing_after":273,"bearing_before":0,"location":[-117.172985,32.7126],"type":"depart","instruction":"Head west on West G Street"},"weight":5.9,"duration":5.4,"name":"West G Street","distance":14.8},{"intersections":[{"in":0,"entry":[true],"bearings":[88],"location":[-117.173143,32.712597]}],"driving_side":"right","geometry":"wdtfEbkdjU","mode":"driving","maneuver":{"bearing_after":0,"bearing_before":268,"location":[-117.173143,32.712597],"type":"arrive","instruction":"You have arrived at your 3rd destination"},"weight":0,"duration":0,"name":"West G Street","distance":0}],"distance":14.8},{"summary":"West G Street","weight":8,"duration":8,"steps":[{"intersections":[{"out":0,"entry":[true],"bearings":[262],"location":[-117.173143,32.712597]}],"driving_side":"right","geometry":"wdtfEdkdjU@LBLBJ","mode":"driving","maneuver":{"bearing_after":262,"bearing_before":0,"location":[-117.173143,32.712597],"type":"depart","instruction":"Head west on West G Street"},"weight":8,"duration":8,"name":"West G Street","distance":20},{"intersections":[{"in":0,"entry":[true],"bearings":[61],"location":[-117.173345,32.712546]}],"driving_side":"right","geometry":"mdtfElldjU","mode":"driving","maneuver":{"bearing_after":0,"bearing_before":241,"location":[-117.173345,32.712546],"type":"arrive","instruction":"You have arrived at your destination"},"weight":0,"duration":0,"name":"West G Street","distance":0}],"distance":20}],"weight_name":"routability","weight":53.699999999999996,"duration":21.3,"distance":57.900000000000006}],"tracepoints":[null,null,{"alternatives_count":0,"waypoint_index":0,"matchings_index":0,"name":"North Harbor Drive","location":[-117.17292,32.712444]},{"alternatives_count":0,"waypoint_index":1,"matchings_index":0,"name":"North Harbor Drive","location":[-117.172922,32.71257]},{"alternatives_count":0,"waypoint_index":2,"matchings_index":0,"name":"West G Street","location":[-117.172985,32.7126]},{"alternatives_count":0,"waypoint_index":3,"matchings_index":0,"name":"West G Street","location":[-117.173143,32.712597]},{"alternatives_count":1,"waypoint_index":4,"matchings_index":0,"name":"West G Street","location":[-117.173345,32.712546]}],"code":"Ok"} +{"matchings":[{"confidence":0.9266176314526849,"geometry":"sbtfEtidjUA?M@G?I?A?M?K?E??L?B?Z@LBLBJ","legs":[{"summary":"North Harbor Drive","weight":2.4,"duration":2.4,"steps":[{"intersections":[{"out":0,"entry":[true],"bearings":[352],"location":[-117.17291,32.712256]}],"driving_side":"right","geometry":"sbtfEtidjUA?M@G?I?A?","mode":"driving","maneuver":{"bearing_after":352,"bearing_before":0,"location":[-117.17291,32.712256],"type":"depart","instruction":"Head north on North Harbor Drive"},"weight":2.4,"duration":2.4,"name":"North Harbor Drive","distance":21},{"intersections":[{"in":0,"entry":[true],"bearings":[180],"location":[-117.17292,32.712444]}],"driving_side":"right","geometry":"wctfEvidjU","mode":"driving","maneuver":{"bearing_after":0,"bearing_before":0,"location":[-117.17292,32.712444],"type":"arrive","instruction":"You have arrived at your 1st destination"},"weight":0,"duration":0,"name":"North Harbor Drive","distance":0}],"distance":21},{"summary":"North Harbor Drive","weight":1.6,"duration":1.6,"steps":[{"intersections":[{"out":0,"entry":[true],"bearings":[359],"location":[-117.17292,32.712444]},{"out":0,"in":1,"entry":[true,false,false],"bearings":[0,180,270],"location":[-117.172921,32.712514]}],"driving_side":"right","geometry":"wctfEvidjUM?K?","mode":"driving","maneuver":{"bearing_after":359,"bearing_before":0,"location":[-117.17292,32.712444],"type":"depart","instruction":"Head north on North Harbor Drive"},"weight":1.6,"duration":1.6,"name":"North Harbor Drive","distance":14},{"intersections":[{"in":0,"entry":[true],"bearings":[179],"location":[-117.172922,32.71257]}],"driving_side":"right","geometry":"qdtfEvidjU","mode":"driving","maneuver":{"bearing_after":0,"bearing_before":359,"location":[-117.172922,32.71257],"type":"arrive","instruction":"You have arrived at your 2nd destination"},"weight":0,"duration":0,"name":"North Harbor Drive","distance":0}],"distance":14},{"summary":"North Harbor Drive, West G Street","weight":43.3,"duration":12.5,"steps":[{"intersections":[{"out":0,"entry":[true],"bearings":[0],"location":[-117.172922,32.71257]}],"driving_side":"right","geometry":"qdtfEvidjUE?","mode":"driving","maneuver":{"bearing_after":0,"bearing_before":0,"location":[-117.172922,32.71257],"type":"depart","instruction":"Head north on North Harbor Drive"},"weight":36.3,"duration":5.5,"name":"North Harbor Drive","distance":3.2},{"intersections":[{"out":2,"in":1,"entry":[true,false,true],"bearings":[0,180,270],"location":[-117.172922,32.712599]}],"driving_side":"right","geometry":"wdtfEvidjU?L","mode":"driving","maneuver":{"bearing_after":271,"bearing_before":358,"location":[-117.172922,32.712599],"modifier":"left","type":"turn","instruction":"Turn left onto West G Street"},"weight":7,"duration":7,"name":"West G Street","distance":5.9},{"intersections":[{"in":0,"entry":[true],"bearings":[91],"location":[-117.172985,32.7126]}],"driving_side":"right","geometry":"wdtfEdjdjU","mode":"driving","maneuver":{"bearing_after":0,"bearing_before":271,"location":[-117.172985,32.7126],"type":"arrive","instruction":"You have arrived at your 3rd destination"},"weight":0,"duration":0,"name":"West G Street","distance":0}],"distance":9.1},{"summary":"West G Street","weight":8.6,"duration":8.5,"steps":[{"intersections":[{"out":0,"entry":[true],"bearings":[273],"location":[-117.172985,32.7126]},{"out":3,"in":1,"entry":[false,false,true,true],"bearings":[0,90,180,270],"location":[-117.173011,32.712601]}],"driving_side":"right","geometry":"wdtfEdjdjU?B?X","mode":"driving","maneuver":{"bearing_after":273,"bearing_before":0,"location":[-117.172985,32.7126],"type":"depart","instruction":"Head west on West G Street"},"weight":8.6,"duration":8.5,"name":"West G Street","distance":14.8},{"intersections":[{"in":0,"entry":[true],"bearings":[88],"location":[-117.173143,32.712597]}],"driving_side":"right","geometry":"wdtfEbkdjU","mode":"driving","maneuver":{"bearing_after":0,"bearing_before":268,"location":[-117.173143,32.712597],"type":"arrive","instruction":"You have arrived at your 4th destination"},"weight":0,"duration":0,"name":"West G Street","distance":0}],"distance":14.8},{"summary":"West G Street","weight":9,"duration":9,"steps":[{"intersections":[{"out":0,"entry":[true],"bearings":[262],"location":[-117.173143,32.712597]}],"driving_side":"right","geometry":"wdtfEdkdjU@LBLBJ","mode":"driving","maneuver":{"bearing_after":262,"bearing_before":0,"location":[-117.173143,32.712597],"type":"depart","instruction":"Head west on West G Street"},"weight":9,"duration":9,"name":"West G Street","distance":20},{"intersections":[{"in":0,"entry":[true],"bearings":[61],"location":[-117.173345,32.712546]}],"driving_side":"right","geometry":"mdtfElldjU","mode":"driving","maneuver":{"bearing_after":0,"bearing_before":241,"location":[-117.173345,32.712546],"type":"arrive","instruction":"You have arrived at your destination"},"weight":0,"duration":0,"name":"West G Street","distance":0}],"distance":20}],"weight_name":"routability","weight":64.9,"duration":34,"distance":78.9}],"tracepoints":[null,{"alternatives_count":0,"waypoint_index":0,"matchings_index":0,"distance":0,"name":"North Harbor Drive","location":[-117.17291,32.712256]},{"alternatives_count":0,"waypoint_index":1,"matchings_index":0,"distance":0,"name":"North Harbor Drive","location":[-117.17292,32.712444]},{"alternatives_count":0,"waypoint_index":2,"matchings_index":0,"distance":0,"name":"North Harbor Drive","location":[-117.172922,32.71257]},{"alternatives_count":0,"waypoint_index":3,"matchings_index":0,"distance":0,"name":"West G Street","location":[-117.172985,32.7126]},{"alternatives_count":0,"waypoint_index":4,"matchings_index":0,"distance":0,"name":"West G Street","location":[-117.173143,32.712597]},{"alternatives_count":1,"waypoint_index":5,"matchings_index":0,"distance":0,"name":"West G Street","location":[-117.173345,32.712546]}],"code":"Ok"} \ No newline at end of file diff --git a/Tests/MapboxDirectionsTests/Fixtures/Responses/apiDestinationName.json b/Tests/MapboxDirectionsTests/Fixtures/Responses/apiDestinationName.json index 2e2a4c336..28912db61 100644 --- a/Tests/MapboxDirectionsTests/Fixtures/Responses/apiDestinationName.json +++ b/Tests/MapboxDirectionsTests/Fixtures/Responses/apiDestinationName.json @@ -1 +1 @@ -{"routes":[{"geometry":"afvnFdrebO@o@xT~@hAx@bAfAK\\c@]","legs":[{"summary":"Reading Road, Reading Road","weight":143.6,"duration":73.2,"steps":[{"intersections":[{"out":0,"entry":[true],"bearings":[95],"location":[-84.411389,39.27665]}],"driving_side":"right","geometry":"afvnFdrebO@o@","mode":"driving","maneuver":{"bearing_after":95,"bearing_before":0,"location":[-84.411389,39.27665],"type":"depart","instruction":"Head east on Hageman Street"},"weight":11.8,"duration":6.8,"name":"Hageman Street","distance":20.8},{"intersections":[{"out":1,"in":2,"entry":[true,true,false],"bearings":[0,180,270],"location":[-84.411148,39.276635]},{"out":2,"in":0,"entry":[false,false,true],"bearings":[0,30,180],"location":[-84.411372,39.274088]},{"out":1,"in":0,"entry":[false,true,true],"bearings":[0,180,270],"location":[-84.411386,39.273937]},{"out":2,"in":0,"entry":[false,true,true],"bearings":[0,30,180],"location":[-84.411401,39.273772]}],"driving_side":"right","geometry":"_fvnFtpebO`DJP@ZBvFTt@B\\B`@@fAFr@D","mode":"driving","maneuver":{"bearing_after":182,"bearing_before":94,"location":[-84.411148,39.276635],"modifier":"right","type":"turn","instruction":"Turn right onto Reading Road"},"weight":41.49999999999999,"pronunciation":"ˈrɛdɪŋ ˈɹoʊd","duration":36.4,"name":"Reading Road","distance":388.5},{"distance":97.7,"name":"Reading Road (US 42)","pronunciation":"ˈrɛdɪŋ ˈɹoʊd","ref":"US 42","maneuver":{"bearing_after":209,"bearing_before":184,"location":[-84.411469,39.273151],"modifier":"slight right","type":"continue","instruction":"Make a slight right to stay on Reading Road (US 42)"},"weight":13.6,"mode":"driving","geometry":"epunFtrebOXPLJHFJHJHVVFHb@d@","intersections":[{"out":2,"in":0,"entry":[false,true,true],"bearings":[0,180,210],"location":[-84.411469,39.273151]},{"out":2,"in":0,"entry":[false,false,true],"bearings":[30,75,210],"location":[-84.411756,39.27278]},{"out":2,"in":0,"entry":[false,false,true],"bearings":[30,75,225],"location":[-84.411875,39.272659]}],"duration":10.7,"driving_side":"right"},{"intersections":[{"out":2,"in":0,"entry":[false,true,true],"bearings":[45,225,300],"location":[-84.412124,39.272437]}],"driving_side":"right","geometry":"wkunFvvebOK\\","mode":"driving","maneuver":{"bearing_after":299,"bearing_before":219,"location":[-84.412124,39.272437],"modifier":"right","type":"turn","instruction":"Turn right"},"weight":34,"duration":8.7,"name":"","distance":14.9},{"intersections":[{"out":0,"in":1,"entry":[true,false,true],"bearings":[30,120,300],"location":[-84.412274,39.272503]}],"driving_side":"right","geometry":"clunFtwebOEAGEUU","mode":"driving","maneuver":{"bearing_after":28,"bearing_before":299,"location":[-84.412274,39.272503],"modifier":"right","type":"turn","instruction":"Turn right"},"weight":42.7,"duration":10.6,"name":"","distance":23.7},{"intersections":[{"in":0,"entry":[true],"bearings":[220],"location":[-84.412115,39.272675]}],"driving_side":"right","geometry":"gmunFvvebO","mode":"driving","maneuver":{"bearing_after":0,"bearing_before":40,"location":[-84.412115,39.272675],"modifier":"left","type":"arrive","instruction":"You have arrived at your destination, on the left"},"weight":0,"duration":0,"name":"","distance":0}],"distance":545.6}],"weight_name":"routability","weight":143.6,"duration":73.2,"distance":545.6}],"waypoints":[{"name":"Hageman Street","location":[-84.411389,39.27665]},{"name":"testpass","location":[-84.412115,39.272675]}],"code":"Ok","uuid":"cjax1m38b0dz85op9878nbugo"} +{"routes":[{"weight_name":"routability","legs":[{"summary":"Hageman Street, Reading Road","steps":[],"distance":481.1,"duration":82,"weight":82}],"distance":481.1,"duration":82,"weight":82}],"waypoints":[{"distance":0,"name":"Hageman Street","location":[-84.411392,39.276649]},{"distance":2.898,"name":"Reading Road","location":[-84.411926,39.272617]}],"code":"Ok","uuid":"9y2IAyxGv4YnEy058KQRtCAhw_K4HXJ7YMaH_uVM5I6DNGF1HNu6NA=="} \ No newline at end of file diff --git a/Tests/MapboxDirectionsTests/Fixtures/Responses/noDestinationName.json b/Tests/MapboxDirectionsTests/Fixtures/Responses/noDestinationName.json index 970eabc8b..1f986f4c3 100644 --- a/Tests/MapboxDirectionsTests/Fixtures/Responses/noDestinationName.json +++ b/Tests/MapboxDirectionsTests/Fixtures/Responses/noDestinationName.json @@ -1 +1 @@ -{"routes":[{"geometry":"afvnFdrebO@o@xT~@hAx@bAfAK\\c@]","legs":[{"summary":"Reading Road, Reading Road","weight":143.6,"duration":73.2,"steps":[{"intersections":[{"out":0,"entry":[true],"bearings":[95],"location":[-84.411389,39.27665]}],"driving_side":"right","geometry":"afvnFdrebO@o@","mode":"driving","maneuver":{"bearing_after":95,"bearing_before":0,"location":[-84.411389,39.27665],"type":"depart","instruction":"Head east on Hageman Street"},"weight":11.8,"duration":6.8,"name":"Hageman Street","distance":20.8},{"intersections":[{"out":1,"in":2,"entry":[true,true,false],"bearings":[0,180,270],"location":[-84.411148,39.276635]},{"out":2,"in":0,"entry":[false,false,true],"bearings":[0,30,180],"location":[-84.411372,39.274088]},{"out":1,"in":0,"entry":[false,true,true],"bearings":[0,180,270],"location":[-84.411386,39.273937]},{"out":2,"in":0,"entry":[false,true,true],"bearings":[0,30,180],"location":[-84.411401,39.273772]}],"driving_side":"right","geometry":"_fvnFtpebO`DJP@ZBvFTt@B\\B`@@fAFr@D","mode":"driving","maneuver":{"bearing_after":182,"bearing_before":94,"location":[-84.411148,39.276635],"modifier":"right","type":"turn","instruction":"Turn right onto Reading Road"},"weight":41.49999999999999,"pronunciation":"ˈrɛdɪŋ ˈɹoʊd","duration":36.4,"name":"Reading Road","distance":388.5},{"distance":97.7,"name":"Reading Road (US 42)","pronunciation":"ˈrɛdɪŋ ˈɹoʊd","ref":"US 42","maneuver":{"bearing_after":209,"bearing_before":184,"location":[-84.411469,39.273151],"modifier":"slight right","type":"continue","instruction":"Make a slight right to stay on Reading Road (US 42)"},"weight":13.6,"mode":"driving","geometry":"epunFtrebOXPLJHFJHJHVVFHb@d@","intersections":[{"out":2,"in":0,"entry":[false,true,true],"bearings":[0,180,210],"location":[-84.411469,39.273151]},{"out":2,"in":0,"entry":[false,false,true],"bearings":[30,75,210],"location":[-84.411756,39.27278]},{"out":2,"in":0,"entry":[false,false,true],"bearings":[30,75,225],"location":[-84.411875,39.272659]}],"duration":10.7,"driving_side":"right"},{"intersections":[{"out":2,"in":0,"entry":[false,true,true],"bearings":[45,225,300],"location":[-84.412124,39.272437]}],"driving_side":"right","geometry":"wkunFvvebOK\\","mode":"driving","maneuver":{"bearing_after":299,"bearing_before":219,"location":[-84.412124,39.272437],"modifier":"right","type":"turn","instruction":"Turn right"},"weight":34,"duration":8.7,"name":"","distance":14.9},{"intersections":[{"out":0,"in":1,"entry":[true,false,true],"bearings":[30,120,300],"location":[-84.412274,39.272503]}],"driving_side":"right","geometry":"clunFtwebOEAGEUU","mode":"driving","maneuver":{"bearing_after":28,"bearing_before":299,"location":[-84.412274,39.272503],"modifier":"right","type":"turn","instruction":"Turn right"},"weight":42.7,"duration":10.6,"name":"","distance":23.7},{"intersections":[{"in":0,"entry":[true],"bearings":[220],"location":[-84.412115,39.272675]}],"driving_side":"right","geometry":"gmunFvvebO","mode":"driving","maneuver":{"bearing_after":0,"bearing_before":40,"location":[-84.412115,39.272675],"modifier":"left","type":"arrive","instruction":"You have arrived at your destination, on the left"},"weight":0,"duration":0,"name":"","distance":0}],"distance":545.6}],"weight_name":"routability","weight":143.6,"duration":73.2,"distance":545.6}],"waypoints":[{"name":"Hageman Street","location":[-84.411389,39.27665]},{"name":"","location":[-84.412115,39.272675]}],"code":"Ok","uuid":"cjax1m38b0dz85op9878nbugo"} +{"routes":[{"weight_name":"routability","legs":[{"summary":"Hageman Street, Reading Road","steps":[],"distance":545.9,"duration":101,"weight":101}],"distance":545.9,"duration":101,"weight":101}],"waypoints":[{"distance":0,"name":"Hageman Street","location":[-84.411392,39.276649]},{"distance":0,"name":"","location":[-84.412117,39.272675]}],"code":"Ok","uuid":"4IpOA5A8kEEEvZCLm-ns-uLVKpk5LfRAOQ7DQlREw08BKtExsBk4OA=="} \ No newline at end of file diff --git a/Tests/MapboxDirectionsTests/Fixtures/v5/annotation.json b/Tests/MapboxDirectionsTests/Fixtures/v5/annotation.json index de84d5f77..79a36ebef 100755 --- a/Tests/MapboxDirectionsTests/Fixtures/v5/annotation.json +++ b/Tests/MapboxDirectionsTests/Fixtures/v5/annotation.json @@ -1 +1 @@ -{"waypoints":[{"location":[-122.431373,37.780601],"name":"Turk Street"},{"location":[-122.404058,37.758859],"name":"Vermont Street"}],"routes":[{"legs":[{"steps":[],"weight":833.8,"distance":4677.3,"annotation":{"distance":[61.78911719499301,8.005870139027868,7.759236367491888,87.06478091987647,10.25848607823369,8.370665933525826,128.73742878884872,9.360982030495618,8.775293145188993,86.9549662825476,9.35196844032588,8.225903582330162,58.11644349519123,29.291784206824605,8.898748875402289,12.903543910114447,9.256506208135528,124.20757712175377,146.17597053784544,146.45354836356245,146.48844995792555,104.75249124259913,52.376257922720605,52.67850990738398,52.3902172886358,52.28042478496598,146.30214620727506,139.89328448914054,15.578350994103406,62.66067405076987,63.16452877652712,13.458181588365996,20.584701549024455,7.668703155380468,8.415860516914783,16.12766361289219,49.5640707594805,49.7085872073418,10.006926395740319,65.76737827104486,66.9331708737475,57.72591261839857,69.14191600033729,75.59927699731753,115.95449195416666,117.00316360696885,76.14672479759217,47.81610361112862,40.747077529085345,104.28833385320196,122.1491598381078,40.76337755157434,14.990850250898449,36.59437600283772,20.82925538207349,26.57837311899057,23.633026596769554,34.24820044233948,72.05868433805037,36.47298929861723,31.6646576147614,75.73201345870328,37.7275112208842,49.52899647660397,60.145710894703306,34.666841671386145,88.0057607189147,85.19171832302112,85.45465364596988,86.58596162510526,142.28452392043692,9.424483651329783,123.9367810487205,9.325528541113664,7.699257912414974,135.08070973534097,141.66418155243468,84.65444720167741,46.08468915479624,2.2675599932459636,2.1220692450736567,1.6744149593511495,1.708699266951245,7.683223619704564,1.84658454260673,1.6180500371443371,1.689121948623264,1.4486133063155147,1.5670682617916714,1.4698163191713105,1.5067116313275537,1.5910952866295878,1.559693966970531,6.717659629902365,1.5572084802655337,1.7573463934158997,1.411314740137675,1.7050692236693632],"speed":[6.1,1,1.9,1.9,0.8,8.4,9.5,1.8,8.8,9.2,3.1,7.5,7.5,7.5,1,3.1,8.4,8.1,7.3,6.9,4.4,7.4,3.6,4.2,6.1,3.4,4.4,5.4,3.7,6.1,6.1,3.1,5.9,5.1,7,5.8,6.7,6.6,7.1,4.8,10.6,10.9,7.6,8.3,7.3,11.1,7.1,8.4,8.3,7.2,6.7,6.7,3.6,7.8,7.7,4.2,4,10.7,10.8,6.8,4.2,4.2,3.4,7.2,7.2,2.8,10,5.8,5.5,3.5,6.9,5.9,5.8,5.8,7,6.9,6.5,4.4,5.3,2.8,2.7,2.8,2.8,2.7,2.6,2.7,2.8,2.9,2.6,2.9,3,2.7,2.6,2.8,2.6,2.9,2.8,2.8],"duration":[10.1,8.3,4,44.8,12.6,1,13.6,5.1,1,9.5,3,1.1,7.7,3.9,8.5,4.1,1.1,15.4,20.1,21.1,33.4,14.2,14.5,12.5,8.6,15.5,33,26,4.2,10.3,10.3,4.3,3.5,1.5,1.2,2.8,7.4,7.5,1.4,13.8,6.3,5.3,9.1,9.1,15.9,10.5,10.8,5.7,4.9,14.5,18.3,6.1,4.2,4.7,2.7,6.4,5.9,3.2,6.7,5.4,7.6,18.2,11.1,6.9,8.3,12.2,8.8,14.6,15.4,24.4,20.5,1.6,21.2,1.6,1.1,19.5,21.7,19.3,8.7,0.8,0.8,0.6,0.6,2.8,0.7,0.6,0.6,0.5,0.6,0.5,0.5,0.6,0.6,2.4,0.6,0.6,0.5,0.6],"congestion":["moderate","severe","moderate","moderate","heavy","low","low","heavy","low","low","heavy","low","low","low","severe","heavy","low","low","low","low","low","low","heavy","heavy","moderate","heavy","low","low","heavy","low","low","moderate","low","low","low","moderate","moderate","moderate","low","low","low","low","moderate","low","moderate","low","low","moderate","moderate","moderate","low","low","heavy","low","low","moderate","moderate","low","low","moderate","heavy","heavy","heavy","low","low","heavy","low","moderate","low","moderate","low","low","low","low","low","low","low","moderate","low","low","low","low","low","low","low","low","low","low","low","low","low","low","low","low","low","low","low","low"]},"summary":"","duration":835.8}],"weight_name":"routability","geometry":"w_reF`kgjVPjC@PLCxC]PCAQc@aHCUNAxC_@NANCdBSr@KNAC]ASc@wGg@gIi@gIi@iIxDe@zAQ|AQ|ASzAQi@gIg@{HCa@QkCOmCA_@Dm@?QHMN]`AmA~@mAJOrAiBtAkBfA{AxAmB~AyBrCyDtCyD~AyB|@kAr@_AfCcDxCgEp@aATUp@s@`@Wj@Wh@Cz@E`CK`AEv@CfCMbAEvAIjBI|@EKgEK_EKaEIcE|FWNC~EUN@L@pFW|FWJ~DpAGBAB?@A@ALG@A@?BA@?B?@@@@@B?@BN?@@BB?@@","weight":833.8,"distance":4677.3,"duration":835.8}],"code":"Ok","uuid":"cj725hpi30yp2ztm2ehbcipmh"} +{"routes":[{"geometry":"w_reF`kgjVPjC@PLCZCDAv@KB?XE`@EPCAQImAKaBAMMcBAUC[ASMmBImAGcAAECc@QiCQqCCYASOyBW}D]qFIsAOqBIyAMcBAYCW_@yFAOAWC]CUc@cHNC`@GB?D@BAZCv@KTCVEXGNCdCYrDc@fBQFAz@KTErBUHCFAFEFGFKLU@AJSDG@C@ADIHMjA{A~@mAJOrAiBtAkBfA{AxAmBt@cALQFIRYbCcDNULOfCiDr@aAj@w@|@kAr@aAbCgDz@iAx@gAd@o@h@s@^c@\\]RU`@Wj@Wh@CI}CAe@KaEAYCqAEwAKeEdDKzAGr@ElAE~BKjFYVAzBKlAEr@ENCJA`@CpDON@L@tAGhCMNA@TFrC@TL?pFWpAGBAB?@A@ALG@A@?BA@?B?@@@@@B?@BN?@@BB?@@","legs":[{"annotation":{"distance":[61.78911719499301,8.005870139027868,7.759236367491888,16.218210852236638,3.5024970090382674,31.200513581321566,2.1296922044642375,15.201992731718047,18.81373666045046,10.25848607823369,8.370665933525826,33.91665057462367,44.16292418618019,5.71461054557965,44.961701083432686,9.34312359965103,12.834233746021397,8.978674003644308,48.699438946727334,35.30623289124711,30.33907283621221,2.5711295719997502,15.682193415494849,61.07751906686583,65.43634942678277,11.757110050097628,8.822345498846637,54.04399846649904,85.0253722355309,107.3065477252522,37.56309620154151,51.10887066054619,39.45635113069872,45.13469133678255,10.87152545777115,11.218562875420577,110.67468814758492,7.745294606313982,10.054979395002901,13.441365621845776,9.899453653643487,130.0897745234779,9.361400186737145,19.29581285450625,2.780657500381912,2.5956907927038757,2.4485571685608805,15.998559299664745,31.749794697887182,11.71392065034445,13.65878604668147,15.27410371531096,8.322252894759458,75.46070687462675,101.70545548543072,58.035805285351024,5.507220756949511,33.68625535817419,12.386818384629517,64.76307027038081,6.131029435168475,4.856565792614805,5.042653827082274,5.838204103483727,6.430704161099769,12.070301310104123,1.7264576473118345,10.966374174746688,4.690062285664435,1.7251438200657419,1.8642728694154649,5.6909983599205916,8.565329863660672,57.550561595270004,49.7085872073418,10.006926395740319,65.76737827104486,66.9331708737475,57.72591261839857,69.14191600033729,42.24814266349312,11.11704088852958,6.254414663677832,15.979691597820226,103.24281834369937,12.711690521702643,10.570960455693678,106.43254410491912,40.77794786767445,35.36882186831562,47.81610361112862,40.77816497948937,104.23082310323272,46.90919967420701,44.75110052426832,30.36563842929047,32.24205532701213,23.49924772735885,21.20339678375213,15.391087011024196,20.82925538207349,26.57837311899057,23.633026596769554,69.65610218424216,17.372295395356478,84.90739912588008,11.55229884626397,36.883733607054054,38.237156565792986,87.12429358191692,92.38902586352489,50.52065949480917,29.87134469553418,42.606188739514366,71.38660462667065,132.6078499394627,12.612783565444955,69.91250563965299,43.13644352701197,29.237837317659345,9.424483651329783,5.911365624296355,18.85658645295614,99.16891737514025,9.325528541113664,7.699257912414974,48.74599424747319,76.86104474199828,8.586515659956389,9.353309270049566,65.62158530817811,9.79152137035292,7.359870632423005,134.86558663123856,46.08468915479624,2.2675599932459636,2.1220692450736567,1.6744149593511495,1.708699266951245,7.683223619704564,1.84658454260673,1.6180500371443371,1.689121948623264,1.4486133063155147,1.5670682617916714,1.4698163191713105,1.5067116313275537,1.5910952866295878,1.559693966970531,6.717659629902365,1.5572084802655337,1.7573463934158997,1.411314740137675,1.7050692236693632],"duration":[7.5,1,1.3,2.8,0.6,5.3,0.4,3.9,4.8,2.6,1,4.1,5.1,0.6,6.2,1.3,1.5,0.9,5,4,3.4,0.3,1.9,7.3,8.4,1.4,1.1,6.3,9,25.8,16.9,6.8,6.2,27.1,6.5,3.4,33.2,2.3,3,3,1.2,17.3,1.6,3.3,0.5,0.4,0.4,2.7,3.5,1.3,1.5,2.5,1.4,12.3,16.6,16.1,1.4,8.7,2.1,13,1.2,1,1,1.2,1.3,2.4,0.3,2.2,0.8,0.3,0.3,1,1.2,7.7,6.9,1.6,9.9,11.5,16,12.4,5.1,1.2,0.7,2.5,16.2,2,1.2,10.4,4.3,3.4,5.1,6.1,15.6,5.3,5,3.4,5.3,3.5,2.8,2.1,2.8,5,3.2,20.9,2.7,13.9,3,8.9,9.2,17.4,15.1,9.6,5.7,8.1,13.5,19.9,1.9,12.6,7.8,5.3,1.4,0.9,2.7,14.3,1.3,1,6.3,9.9,1.1,1.4,9.8,1.5,1.3,23.1,8.7,0.6,0.6,0.5,0.5,2.1,0.5,0.4,0.5,0.4,0.4,0.4,0.4,0.4,0.4,1.9,0.4,0.5,0.4,0.5],"speed":[8.2,8,6,5.8,5.8,5.9,5.3,3.9,3.9,3.9,8.4,8.3,8.7,9.5,7.3,7.2,8.6,10,9.7,8.8,8.9,8.6,8.3,8.4,7.8,8.4,8,8.6,9.4,4.2,2.2,7.5,6.4,1.7,1.7,3.3,3.3,3.4,3.4,4.5,8.2,7.5,5.9,5.8,5.6,6.5,6.1,5.9,9.1,9,9.1,6.1,5.9,6.1,6.1,3.6,3.9,3.9,5.9,5,5.1,4.9,5,4.9,4.9,5,5.8,5,5.9,5.8,6.2,5.7,7.1,7.5,7.2,6.3,6.6,5.8,3.6,5.6,8.3,9.3,8.9,6.4,6.4,6.4,8.8,10.2,9.5,10.4,9.4,6.7,6.7,8.9,9,8.9,6.1,6.7,7.6,7.3,7.4,5.3,7.4,3.3,6.4,6.1,3.9,4.1,4.2,5,6.1,5.3,5.2,5.3,5.3,6.7,6.6,5.5,5.5,5.5,6.7,6.6,7,6.9,7.2,7.7,7.7,7.8,7.8,6.7,6.7,6.5,5.7,5.8,5.3,3.8,3.5,3.3,3.4,3.7,3.7,4,3.4,3.6,3.9,3.7,3.8,4,3.9,3.5,3.9,3.5,3.5,3.4],"congestion":["low","low","low","low","low","low","low","low","low","low","low","low","low","low","low","low","low","low","low","moderate","moderate","moderate","moderate","moderate","low","low","low","low","low","heavy","low","low","moderate","low","low","low","low","low","low","low","low","low","low","low","low","low","low","low","low","low","low","low","low","low","low","heavy","low","low","low","low","low","low","low","low","low","low","low","low","low","low","low","low","low","low","low","moderate","low","heavy","heavy","heavy","low","low","low","low","low","low","low","low","low","low","low","moderate","moderate","low","low","low","low","low","low","low","low","low","low","heavy","low","low","low","moderate","moderate","low","low","low","low","low","low","low","low","low","low","low","low","low","low","low","low","low","low","low","low","low","low","low","low","low","unknown","low","low","low","low","low","low","low","low","low","low","low","low","low","low","low","low","low","low","low"]},"summary":"","weight":1285.2,"duration":873,"steps":[],"distance":4667.2}],"weight_name":"routability","weight":1285.2,"duration":873,"distance":4667.2}],"waypoints":[{"distance":0.11098979064122912,"name":"Turk Street","location":[-122.431373,37.780601]},{"distance":0,"name":"Vermont Street","location":[-122.404058,37.758859]}],"code":"Ok","uuid":"ck2l3ymrx18ws68qo1ukqt9p1"} \ No newline at end of file diff --git a/Tests/MapboxDirectionsTests/MatchTests.swift b/Tests/MapboxDirectionsTests/MatchTests.swift index 470f3c579..fd65b3305 100644 --- a/Tests/MapboxDirectionsTests/MatchTests.swift +++ b/Tests/MapboxDirectionsTests/MatchTests.swift @@ -50,7 +50,7 @@ class MatchTests: XCTestCase { XCTAssertNotNil(match) XCTAssertNotNil(match.shape) - XCTAssertEqual(match.shape!.coordinates.count, 8) + XCTAssertEqual(match.shape!.coordinates.count, 18) XCTAssertEqual(match.accessToken, BogusToken) XCTAssertEqual(match.apiEndpoint, URL(string: "https://api.mapbox.com")) XCTAssertEqual(match.routeIdentifier, nil) @@ -65,7 +65,7 @@ class MatchTests: XCTestCase { XCTAssertEqual(round(match!.shape!.coordinates.first!.latitude), 33) XCTAssertEqual(round(match!.shape!.coordinates.first!.longitude), -117) XCTAssertEqual(match!.legs.count, 6) - XCTAssertEqual(match!.confidence, 0.95) + XCTAssertEqual(match!.confidence, 0.95, accuracy: 1e-2) let leg = match!.legs.first! XCTAssertEqual(leg.name, "North Harbor Drive") @@ -97,7 +97,7 @@ class MatchTests: XCTestCase { func testMatchWithNullTracepoints() { let expectation = self.expectation(description: "calculating directions should return results") - let locations = [CLLocationCoordinate2D(latitude: 32.712041, longitude: -117.172836), + let locations = [CLLocationCoordinate2D(latitude: 32.70949, longitude: -117.17747), CLLocationCoordinate2D(latitude: 32.712256, longitude: -117.17291), CLLocationCoordinate2D(latitude: 32.712444, longitude: -117.17292), CLLocationCoordinate2D(latitude: 32.71257, longitude: -117.172922), diff --git a/Tests/MapboxDirectionsTests/RoutableMatchTests.swift b/Tests/MapboxDirectionsTests/RoutableMatchTests.swift index 7f3ba4ba1..358cf39c8 100644 --- a/Tests/MapboxDirectionsTests/RoutableMatchTests.swift +++ b/Tests/MapboxDirectionsTests/RoutableMatchTests.swift @@ -53,7 +53,7 @@ class RoutableMatchTest: XCTestCase { XCTAssertNotNil(route) XCTAssertNotNil(route.shape) - XCTAssertEqual(route.shape!.coordinates.count, 8) + XCTAssertEqual(route.shape!.coordinates.count, 18) XCTAssertEqual(route.accessToken, BogusToken) XCTAssertEqual(route.apiEndpoint, URL(string: "https://api.mapbox.com")) XCTAssertEqual(route.routeIdentifier, nil) diff --git a/Tests/MapboxDirectionsTests/RouteOptionsTests.swift b/Tests/MapboxDirectionsTests/RouteOptionsTests.swift index 6e545b507..2c1616c35 100644 --- a/Tests/MapboxDirectionsTests/RouteOptionsTests.swift +++ b/Tests/MapboxDirectionsTests/RouteOptionsTests.swift @@ -42,27 +42,42 @@ class RouteOptionsTests: XCTestCase { private func response(for fixtureName: String, waypoints: [Waypoint] = testWaypoints) -> (waypoints:[Waypoint], route:Route)? { let testBundle = Bundle(for: type(of: self)) - guard let fixtureURL = testBundle.url(forResource:fixtureName, withExtension:"json") else { XCTFail(); return nil } - guard let fixtureData = try? Data(contentsOf: fixtureURL, options:.mappedIfSafe) else {XCTFail(); return nil } + guard let fixtureURL = testBundle.url(forResource:fixtureName, withExtension:"json") else { + XCTFail() + return nil + } + guard let fixtureData = try? Data(contentsOf: fixtureURL, options:.mappedIfSafe) else { + XCTFail() + return nil + } let subject = RouteOptions(waypoints: waypoints) let decoder = JSONDecoder() decoder.userInfo[.options] = subject - let response = try! decoder.decode(RouteResponse.self, from: fixtureData) - - guard let waypoints = response.waypoints, let routes = response.routes else { XCTFail("Expected responses not returned from service"); return nil} - guard let primary = routes.first else {XCTFail("Expected a route in response"); return nil} - return (waypoints:waypoints, route:primary) + var response: RouteResponse? + XCTAssertNoThrow(response = try decoder.decode(RouteResponse.self, from: fixtureData)) + XCTAssertNotNil(response) + + if let response = response { + XCTAssertNotNil(response.waypoints) + XCTAssertNotNil(response.routes) + } + guard let waypoints = response?.waypoints, let route = response?.routes?.first else { + return nil + } + return (waypoints: waypoints, route: route) } func testResponseWithoutDestinationName() { + // https://api.mapbox.com/directions/v5/mapbox/driving/-84.411389,39.27665;-84.412115,39.272675.json?overview=false&steps=false&access_token=pk.feedcafedeadbeef let response = self.response(for: "noDestinationName")! - XCTAssert(response.route.legs.last!.destination!.name == nil, "API waypoint with no name (aka \"\") needs to be represented as `nil`.") + XCTAssertNil(response.route.legs.last?.destination?.name, "Empty-string waypoint name in API responds should be represented as nil.") } func testResponseWithDestinationName() { + // https://api.mapbox.com/directions/v5/mapbox/driving/-84.411389,39.27665;-84.41195,39.27260.json?overview=false&steps=false&access_token=pk.feedcafedeadbeef let response = self.response(for: "apiDestinationName")! - XCTAssert(response.route.legs.last!.destination!.name == "testpass", "Waypoint name in fixture response not parsed correctly.") + XCTAssertEqual(response.route.legs.last?.destination?.name, "Reading Road", "Waypoint name in fixture response not parsed correctly.") } func testResponseWithManuallySetDestinationName() { @@ -70,7 +85,7 @@ class RouteOptionsTests: XCTestCase { manuallySet.last!.name = "manuallyset" let response = self.response(for: "apiDestinationName", waypoints: manuallySet)! - XCTAssert(response.route.legs.last!.destination!.name == "manuallyset", "Waypoint with manually set name should override any computed name.") + XCTAssertEqual(response.route.legs.last?.destination?.name, "manuallyset", "Waypoint with manually set name should override any computed name.") } func testApproachesURLQueryParams() { From a1e3a74ec46478e6346f69dc6fe96051f80d0422 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Minh=20Nguye=CC=82=CC=83n?= Date: Mon, 4 Nov 2019 23:04:55 -0800 Subject: [PATCH 68/89] Simplified walking options test --- .../MapboxDirectionsTests/WalkingOptionsTests.swift | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/Tests/MapboxDirectionsTests/WalkingOptionsTests.swift b/Tests/MapboxDirectionsTests/WalkingOptionsTests.swift index 1932166d9..0217c4a5b 100644 --- a/Tests/MapboxDirectionsTests/WalkingOptionsTests.swift +++ b/Tests/MapboxDirectionsTests/WalkingOptionsTests.swift @@ -13,9 +13,9 @@ class WalkingOptionsTests: XCTestCase { let options = RouteOptions(waypoints: waypoints, profileIdentifier: DirectionsProfileIdentifier.walking) var queryItems = options.urlQueryItems - XCTAssertEqual(queryItems.filter { $0.name == "alley_bias" }.first?.value, "0.0") - XCTAssertEqual(queryItems.filter { $0.name == "walkway_bias" }.first?.value, "0.0") - XCTAssertEqual(queryItems.filter { $0.name == "walking_speed" }.first?.value, "1.42") + XCTAssertEqual(queryItems.first { $0.name == "alley_bias" }?.value, "0.0") + XCTAssertEqual(queryItems.first { $0.name == "walkway_bias" }?.value, "0.0") + XCTAssertEqual(queryItems.first { $0.name == "walking_speed" }?.value, "1.42") options.alleyPriority = DirectionsPriority(rawValue: 0.4) options.walkwayPriority = DirectionsPriority(rawValue: 0.5) @@ -23,8 +23,8 @@ class WalkingOptionsTests: XCTestCase { queryItems = options.urlQueryItems - XCTAssertEqual(queryItems.filter { $0.name == "alley_bias" }.first?.value, "0.4") - XCTAssertEqual(queryItems.filter { $0.name == "walkway_bias" }.first?.value, "0.5") - XCTAssertEqual(queryItems.filter { $0.name == "walking_speed" }.first?.value, "5.2") + XCTAssertEqual(queryItems.first { $0.name == "alley_bias" }?.value, "0.4") + XCTAssertEqual(queryItems.first { $0.name == "walkway_bias" }?.value, "0.5") + XCTAssertEqual(queryItems.first { $0.name == "walking_speed" }?.value, "5.2") } } From 62a3d81df5ae88c23b9c79d155f67c9b66b41850 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Minh=20Nguye=CC=82=CC=83n?= Date: Fri, 22 Nov 2019 21:30:44 -0800 Subject: [PATCH 69/89] Corrected signature of MatchOptions(waypoints:profileIdentifier:) --- Sources/MapboxDirections/MapMatching/MatchOptions.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Sources/MapboxDirections/MapMatching/MatchOptions.swift b/Sources/MapboxDirections/MapMatching/MatchOptions.swift index 19d8ce026..698aaef86 100644 --- a/Sources/MapboxDirections/MapMatching/MatchOptions.swift +++ b/Sources/MapboxDirections/MapMatching/MatchOptions.swift @@ -35,7 +35,7 @@ open class MatchOptions: DirectionsOptions { self.init(waypoints: waypoints, profileIdentifier: profileIdentifier) } - public required init(waypoints: [Waypoint], profileIdentifier: DirectionsProfileIdentifier?) { + public required init(waypoints: [Waypoint], profileIdentifier: DirectionsProfileIdentifier? = nil) { super.init(waypoints: waypoints, profileIdentifier: profileIdentifier) } From 81504bbb5b929c86ea17e16b89be55777ade822d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Minh=20Nguye=CC=82=CC=83n?= Date: Fri, 22 Nov 2019 21:34:05 -0800 Subject: [PATCH 70/89] Fixed Route documentation The Route class documentation comment was attached to the private CodingKeys enumeration for some reason. Also removed an extraneous import statement. --- Sources/MapboxDirections/Route.swift | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/Sources/MapboxDirections/Route.swift b/Sources/MapboxDirections/Route.swift index 7adf43110..4ca46e2d1 100644 --- a/Sources/MapboxDirections/Route.swift +++ b/Sources/MapboxDirections/Route.swift @@ -1,15 +1,13 @@ -import Polyline - /** A `Route` object defines a single route that the user can follow to visit a series of waypoints in order. The route object includes information about the route, such as its distance and expected travel time. Depending on the criteria used to calculate the route, the route object may also include detailed turn-by-turn instructions. Typically, you do not create instances of this class directly. Instead, you receive route objects when you request directions using the `Directions.calculate(_:completionHandler:)` method. However, if you use the `Directions.url(forCalculating:)` method instead, you can pass the results of the HTTP request into this class’s initializer. */ -private enum CodingKeys: String, CodingKey { - case routeOptions -} - open class Route: DirectionsResult { + private enum CodingKeys: String, CodingKey { + case routeOptions + } + public required init(from decoder: Decoder) throws { if let matchOptions = decoder.userInfo[.options] as? MatchOptions { routeOptions = RouteOptions(matchOptions: matchOptions) From 9f88ac6515863c39bdc76b379f83ebb959aad195 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Minh=20Nguye=CC=82=CC=83n?= Date: Sat, 23 Nov 2019 11:47:45 -0800 Subject: [PATCH 71/89] Throw error when decoding without options When decoding an object from JSON without specifying a RouteOptions or MatchOptions object in the user info dictionary, throw an error instead of force-unwrapping an optional and crashing. Ensure that waypoints in legs in routes/matches have the same names and leg-separation qualities as in the overall response and options object. --- .../MapboxDirections/DirectionsError.swift | 13 +++++ .../MapboxDirections/DirectionsOptions.swift | 2 + .../MapboxDirections/DirectionsResult.swift | 22 ++++++-- .../MapboxDirections/Extensions/Codable.swift | 2 +- .../MapMatching/MapMatchingResponse.swift | 33 ++++++++---- .../MapboxDirections/MapMatching/Match.swift | 14 ++++- Sources/MapboxDirections/Route.swift | 10 +++- Sources/MapboxDirections/RouteLeg.swift | 21 ++++++-- Sources/MapboxDirections/RouteResponse.swift | 51 ++++++++++--------- Sources/MapboxDirections/RouteStep.swift | 5 +- 10 files changed, 128 insertions(+), 45 deletions(-) diff --git a/Sources/MapboxDirections/DirectionsError.swift b/Sources/MapboxDirections/DirectionsError.swift index 58cb796ec..7d084beeb 100644 --- a/Sources/MapboxDirections/DirectionsError.swift +++ b/Sources/MapboxDirections/DirectionsError.swift @@ -1,5 +1,8 @@ import Foundation +/** + An error that occurs when calculating directions. + */ public enum DirectionsError: LocalizedError { /** The server returned an empty response. @@ -169,3 +172,13 @@ extension DirectionsError: Equatable { } } } + +/** + An error that occurs when encoding or decoding a type defined by the MapboxDirections framework. + */ +public enum DirectionsCodingError: Error { + /** + Decoding this type requires the `Decoder.userInfo` dictionary to contain the `CodingUserInfoKey.options` key. + */ + case missingOptions +} diff --git a/Sources/MapboxDirections/DirectionsOptions.swift b/Sources/MapboxDirections/DirectionsOptions.swift index 594a0f6bb..0eb831f05 100644 --- a/Sources/MapboxDirections/DirectionsOptions.swift +++ b/Sources/MapboxDirections/DirectionsOptions.swift @@ -32,6 +32,8 @@ public enum RouteShapeFormat: String, Codable { This format is an order of magnitude more precise than `polyline`. */ case polyline6 + + static let `default` = RouteShapeFormat.polyline } /** diff --git a/Sources/MapboxDirections/DirectionsResult.swift b/Sources/MapboxDirections/DirectionsResult.swift index 43c428746..a11b0e3c1 100644 --- a/Sources/MapboxDirections/DirectionsResult.swift +++ b/Sources/MapboxDirections/DirectionsResult.swift @@ -29,7 +29,10 @@ open class DirectionsResult: Codable { distance = try container.decode(CLLocationDistance.self, forKey: .distance) expectedTravelTime = try container.decode(TimeInterval.self, forKey: .expectedTravelTime) - _directionsOptions = decoder.userInfo[.options] as! DirectionsOptions + guard let directionsOptions = decoder.userInfo[.options] as? DirectionsOptions else { + throw DirectionsCodingError.missingOptions + } + _directionsOptions = directionsOptions if let polyLineString = try container.decodeIfPresent(PolyLineString.self, forKey: .shape) { shape = try LineString(polyLineString: polyLineString) @@ -53,8 +56,8 @@ open class DirectionsResult: Codable { do { speechLocale = try container.decodeIfPresent(Locale.self, forKey: .speechLocale) - } catch let DecodingError.typeMismatch(mismatchedType, context){ - guard mismatchedType == Dictionary.self else { + } catch let DecodingError.typeMismatch(mismatchedType, context) { + guard mismatchedType == [String: Any].self else { throw DecodingError.typeMismatch(mismatchedType, context) } let identifier = try container.decode(String.self, forKey: .speechLocale) @@ -99,6 +102,19 @@ open class DirectionsResult: Codable { */ public let legs: [RouteLeg] + public var legSeparators: [Waypoint?] { + get { + return legs.isEmpty ? [] : ([legs[0].source] + legs.map { $0.destination }) + } + set { + let endpointsByLeg = zip(newValue, newValue.suffix(from: 1)) + for (leg, (source, destination)) in zip(legs, endpointsByLeg) { + leg.source = source + leg.destination = destination + } + } + } + // MARK: Getting Statistics About the Route /** diff --git a/Sources/MapboxDirections/Extensions/Codable.swift b/Sources/MapboxDirections/Extensions/Codable.swift index 8801213fb..69a96253b 100644 --- a/Sources/MapboxDirections/Extensions/Codable.swift +++ b/Sources/MapboxDirections/Extensions/Codable.swift @@ -22,7 +22,7 @@ extension PolyLineString: Codable { init(from decoder: Decoder) throws { let container = try decoder.singleValueContainer() let options = decoder.userInfo[.options] as? DirectionsOptions - switch options?.shapeFormat ?? .polyline { + switch options?.shapeFormat ?? .default { case .geoJSON: self = .lineString(try container.decode(LineString.self)) case .polyline, .polyline6: diff --git a/Sources/MapboxDirections/MapMatching/MapMatchingResponse.swift b/Sources/MapboxDirections/MapMatching/MapMatchingResponse.swift index b3ec3559e..4520bb18d 100644 --- a/Sources/MapboxDirections/MapMatching/MapMatchingResponse.swift +++ b/Sources/MapboxDirections/MapMatching/MapMatchingResponse.swift @@ -12,22 +12,35 @@ class MapMatchingResponse: Decodable { } public required init(from decoder: Decoder) throws { - let options = decoder.userInfo[.options] as? MatchOptions let container = try decoder.container(keyedBy: CodingKeys.self) code = try container.decode(String.self, forKey: .code) - let waypoints = try container.decode([Waypoint].self, forKey: .tracepoints) + routes = try container.decodeIfPresent([Route].self, forKey: .matches) - if let optionsPoints = options?.waypoints { - let updatedPoints = zip(waypoints, optionsPoints).map { (arg) -> Waypoint in - let (local, api) = arg - - return Waypoint(coordinate: api.coordinate, coordinateAccuracy: local.coordinateAccuracy, name: local.name ?? api.name) + // Decode waypoints from the response and update their names according to the waypoints from DirectionsOptions.waypoints. + let decodedWaypoints = try container.decode([Waypoint].self, forKey: .tracepoints) + if let options = decoder.userInfo[.options] as? DirectionsOptions { + // The response lists the same number of tracepoints as the waypoints in the request, whether or not a given waypoint is leg-separating. + waypoints = zip(decodedWaypoints, options.waypoints).map { (pair) -> Waypoint in + let (decodedWaypoint, waypointInOptions) = pair + let waypoint = Waypoint(coordinate: decodedWaypoint.coordinate, coordinateAccuracy: waypointInOptions.coordinateAccuracy, name: waypointInOptions.name?.nonEmptyString ?? decodedWaypoint.name) + waypoint.separatesLegs = waypointInOptions.separatesLegs + return waypoint } - self.waypoints = updatedPoints + waypoints.first?.separatesLegs = true + waypoints.last?.separatesLegs = true } else { - self.waypoints = waypoints + waypoints = decodedWaypoints } - routes = try container.decodeIfPresent([Route].self, forKey: .matches) + if let routes = try container.decodeIfPresent([Route].self, forKey: .matches) { + // Postprocess each route. + for route in routes { + // Imbue each route’s legs with the leg-separating waypoints refined above. + route.legSeparators = waypoints.filter { $0.separatesLegs } + } + self.routes = routes + } else { + routes = nil + } } } diff --git a/Sources/MapboxDirections/MapMatching/Match.swift b/Sources/MapboxDirections/MapMatching/Match.swift index efc90b8a4..1a82e3464 100644 --- a/Sources/MapboxDirections/MapMatching/Match.swift +++ b/Sources/MapboxDirections/MapMatching/Match.swift @@ -16,11 +16,23 @@ open class Match: DirectionsResult { case tracepoints case matchOptions } + + /** + Creates a match from a decoder. + + - precondition: If the decoder is decoding JSON data from an API response, the `Decoder.userInfo` dictionary must contain a `MatchOptions` object in the `CodingUserInfoKey.options` key. If it does not, a `DirectionsCodingError.missingOptions` error is thrown. + - parameter decoder: The decoder of JSON-formatted API response data or a previously encoded `Match` object. + */ public required init(from decoder: Decoder) throws { let container = try decoder.container(keyedBy: CodingKeys.self) confidence = try container.decode(Float.self, forKey: .confidence) tracepoints = try container.decodeIfPresent([Tracepoint?].self, forKey: .tracepoints) ?? [] - matchOptions = try container.decodeIfPresent(MatchOptions.self, forKey: .matchOptions) ?? decoder.userInfo[.options] as! MatchOptions + if let matchOptions = try container.decodeIfPresent(MatchOptions.self, forKey: .matchOptions) + ?? decoder.userInfo[.options] as? MatchOptions { + self.matchOptions = matchOptions + } else { + throw DirectionsCodingError.missingOptions + } try super.init(from: decoder) } diff --git a/Sources/MapboxDirections/Route.swift b/Sources/MapboxDirections/Route.swift index 4ca46e2d1..84a20ff3d 100644 --- a/Sources/MapboxDirections/Route.swift +++ b/Sources/MapboxDirections/Route.swift @@ -8,11 +8,19 @@ open class Route: DirectionsResult { case routeOptions } + /** + Creates a route from a decoder. + + - precondition: If the decoder is decoding JSON data from an API response, the `Decoder.userInfo` dictionary must contain a `RouteOptions` or `MatchOptions` object in the `CodingUserInfoKey.options` key. If it does not, a `DirectionsCodingError.missingOptions` error is thrown. + - parameter decoder: The decoder of JSON-formatted API response data or a previously encoded `Route` object. + */ public required init(from decoder: Decoder) throws { if let matchOptions = decoder.userInfo[.options] as? MatchOptions { routeOptions = RouteOptions(matchOptions: matchOptions) + } else if let routeOptions = decoder.userInfo[.options] as? RouteOptions { + self.routeOptions = routeOptions } else { - routeOptions = decoder.userInfo[.options] as! RouteOptions + throw DirectionsCodingError.missingOptions } try super.init(from: decoder) diff --git a/Sources/MapboxDirections/RouteLeg.swift b/Sources/MapboxDirections/RouteLeg.swift index fe96ebcdc..761bccda3 100644 --- a/Sources/MapboxDirections/RouteLeg.swift +++ b/Sources/MapboxDirections/RouteLeg.swift @@ -28,17 +28,28 @@ open class RouteLeg: Codable { // MARK: Creating a Leg + /** + Creates a route leg from a decoder. + + - precondition: If the decoder is decoding JSON data from an API response, the `Decoder.userInfo` dictionary must contain a `RouteOptions` or `MatchOptions` object in the `CodingUserInfoKey.options` key. If it does not, a `DirectionsCodingError.missingOptions` error is thrown. + - parameter decoder: The decoder of JSON-formatted API response data or a previously encoded `RouteLeg` object. + */ public required init(from decoder: Decoder) throws { let container = try decoder.container(keyedBy: CodingKeys.self) - let options = decoder.userInfo[.options] as? DirectionsOptions - source = try container.decodeIfPresent(Waypoint.self, forKey: .source) destination = try container.decodeIfPresent(Waypoint.self, forKey: .destination) steps = try container.decode([RouteStep].self, forKey: .steps) name = try container.decode(String.self, forKey: .name) distance = try container.decode(CLLocationDistance.self, forKey: .distance) expectedTravelTime = try container.decode(TimeInterval.self, forKey: .expectedTravelTime) - profileIdentifier = try container.decodeIfPresent(DirectionsProfileIdentifier.self, forKey: .profileIdentifier) ?? options!.profileIdentifier + + if let profileIdentifier = try container.decodeIfPresent(DirectionsProfileIdentifier.self, forKey: .profileIdentifier) { + self.profileIdentifier = profileIdentifier + } else if let options = decoder.userInfo[.options] as? DirectionsOptions { + profileIdentifier = options.profileIdentifier + } else { + throw DirectionsCodingError.missingOptions + } let annotation = try? container.nestedContainer(keyedBy: AnnotationCodingKeys.self, forKey: .annotation) segmentDistances = try annotation?.decodeIfPresent([CLLocationDistance].self, forKey: .segmentDistances) @@ -70,6 +81,8 @@ open class RouteLeg: Codable { The starting point of the route leg. Unless this is the first leg of the route, the source of this leg is the same as the destination of the previous leg. + + This property is set to `nil` if the leg was decoded from a JSON RouteLeg object. */ public var source: Waypoint? @@ -77,6 +90,8 @@ open class RouteLeg: Codable { The endpoint of the route leg. Unless this is the last leg of the route, the destination of this leg is the same as the source of the next leg. + + This property is set to `nil` if the leg was decoded from a JSON RouteLeg object. */ public var destination: Waypoint? diff --git a/Sources/MapboxDirections/RouteResponse.swift b/Sources/MapboxDirections/RouteResponse.swift index fb2c770f8..5da674b5d 100644 --- a/Sources/MapboxDirections/RouteResponse.swift +++ b/Sources/MapboxDirections/RouteResponse.swift @@ -32,35 +32,38 @@ extension RouteResponse: Codable { let container = try decoder.container(keyedBy: CodingKeys.self) self.code = try container.decodeIfPresent(String.self, forKey: .code) - self.message = try container.decodeIfPresent(String.self, forKey: .message) - self.error = try container.decodeIfPresent(String.self, forKey: .error) + self.uuid = try container.decodeIfPresent(String.self, forKey: .uuid) - let uuid = try container.decodeIfPresent(String.self, forKey: .uuid) - self.uuid = uuid - - let waypoints = try container.decodeIfPresent([Waypoint].self, forKey: .waypoints) - self.waypoints = waypoints + // Decode waypoints from the response and update their names according to the waypoints from DirectionsOptions.waypoints. + let decodedWaypoints = try container.decodeIfPresent([Waypoint].self, forKey: .waypoints) + if let decodedWaypoints = decodedWaypoints, let options = decoder.userInfo[.options] as? DirectionsOptions { + // The response lists the same number of tracepoints as the waypoints in the request, whether or not a given waypoint is leg-separating. + waypoints = zip(decodedWaypoints, options.waypoints).map { (pair) -> Waypoint in + let (decodedWaypoint, waypointInOptions) = pair + let waypoint = Waypoint(coordinate: decodedWaypoint.coordinate, coordinateAccuracy: waypointInOptions.coordinateAccuracy, name: waypointInOptions.name?.nonEmptyString ?? decodedWaypoint.name) + waypoint.separatesLegs = waypointInOptions.separatesLegs + return waypoint + } + waypoints?.first?.separatesLegs = true + waypoints?.last?.separatesLegs = true + } else { + waypoints = decodedWaypoints + } - let rawRoutes = try container.decodeIfPresent([Route].self, forKey: .routes) - var routesWithDestinations: [Route]? = rawRoutes - if let destinations = waypoints?.dropFirst() { - routesWithDestinations = rawRoutes?.map({ (route) -> Route in - for (leg, destination) in zip(route.legs, destinations) { - if leg.destination?.name?.nonEmptyString == nil { - leg.destination = destination - } + if let routes = try container.decodeIfPresent([Route].self, forKey: .routes) { + // Postprocess each route. + for route in routes { + route.routeIdentifier = uuid + // Imbue each route’s legs with the waypoints refined above. + if let waypoints = waypoints { + route.legSeparators = waypoints.filter { $0.separatesLegs } } - return route - }) + } + self.routes = routes + } else { + routes = nil } - - let routesWithIdentifiers = routesWithDestinations?.map({ (route) -> Route in - route.routeIdentifier = uuid - return route - }) - - self.routes = routesWithIdentifiers } } diff --git a/Sources/MapboxDirections/RouteStep.swift b/Sources/MapboxDirections/RouteStep.swift index 79de53fb3..691dd4a5a 100644 --- a/Sources/MapboxDirections/RouteStep.swift +++ b/Sources/MapboxDirections/RouteStep.swift @@ -430,8 +430,9 @@ open class RouteStep: Codable { try container.encodeIfPresent(intersections, forKey: .intersections) try container.encode(drivingSide, forKey: .drivingSide) - if let shape = shape, let options = encoder.userInfo[.options] as? DirectionsOptions { - let shapeFormat = options.shapeFormat + if let shape = shape { + let options = encoder.userInfo[.options] as? DirectionsOptions + let shapeFormat = options?.shapeFormat ?? .default let polyLineString = PolyLineString(lineString: shape, shapeFormat: shapeFormat) try container.encode(polyLineString, forKey: .shape) } From a0a01d7f6a1459c1253ba2bbf48ebfbe192b129c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Minh=20Nguye=CC=82=CC=83n?= Date: Sat, 23 Nov 2019 12:25:17 -0800 Subject: [PATCH 72/89] Noted source/destination optionality in changelog --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index b3a588f66..ca979bf40 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -24,6 +24,7 @@ * Removed support for [Mapbox Directions API v4](https://docs.mapbox.com/api/legacy/directions-v4/). ([#382](https://github.com/mapbox/MapboxDirections.swift/pull/382)) * Replaced the `MBDefaultWalkingSpeed`, `MBMinimumWalkingSpeed`, and `MBMaximumWalkingSpeed` constants with `CLLocationSpeed.normalWalking`, `CLLocationSpeed.minimumWalking`, and `CLLocationSpeed.maximumWalking`, respectively. * Replaced the `Route.coordinates` property with `Route.shape` and the `RouteStep.coordinates` property with `RouteStep.shape`. The `Route.coordinateCount` and `RouteStep.coordinateCount` properties have been removed, but you can use the `LineString.coordinates` property to get the array of `CLLocationCoordinate2D`s. ([#382](https://github.com/mapbox/MapboxDirections.swift/pull/382)) +* `RouteLeg.source` and `RouteLeg.destination` are now optional. They can be `nil` when the `RouteLeg` object is decoded individually from JSON. ([#382](https://github.com/mapbox/MapboxDirections.swift/pull/382)) ## v0.30.0 From ce9c013beb89e127bc64b14d97e293da2b32b8aa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Minh=20Nguye=CC=82=CC=83n?= Date: Mon, 2 Dec 2019 12:24:57 -0800 Subject: [PATCH 73/89] Test waypoint round-tripping without debug dumps --- .../MapboxDirectionsTests/WaypointTests.swift | 96 +++++++++++-------- 1 file changed, 54 insertions(+), 42 deletions(-) diff --git a/Tests/MapboxDirectionsTests/WaypointTests.swift b/Tests/MapboxDirectionsTests/WaypointTests.swift index f834c8ba1..d6556868b 100644 --- a/Tests/MapboxDirectionsTests/WaypointTests.swift +++ b/Tests/MapboxDirectionsTests/WaypointTests.swift @@ -4,33 +4,64 @@ import CoreLocation class WaypointTests: XCTestCase { func testCoding() { - let originalWaypoint = Waypoint(coordinate: CLLocationCoordinate2D(latitude: 38.8977, longitude: -77.0365), coordinateAccuracy: 5, name: "White House") - originalWaypoint.targetCoordinate = CLLocationCoordinate2D(latitude: 38.8952261, longitude: -77.0327882) - originalWaypoint.heading = 90 - originalWaypoint.headingAccuracy = 10 - originalWaypoint.allowsArrivingOnOppositeSide = false - - let encoder = JSONEncoder() - encoder.outputFormatting = [.prettyPrinted] - - let encodedData = try! encoder.encode(originalWaypoint) - let encodedString = String(data: encodedData, encoding: .utf8)! + let waypointJSON: [String: Any?] = [ + "location": [-77.036500000000004, 38.8977], + "name": "White House", + ] + let waypointData = try! JSONSerialization.data(withJSONObject: waypointJSON, options: []) + var waypoint: Waypoint? + XCTAssertNoThrow(waypoint = try JSONDecoder().decode(Waypoint.self, from: waypointData)) + XCTAssertNotNil(waypoint) - XCTAssertEqual(encodedString, pass) + if let waypoint = waypoint { + XCTAssertEqual(waypoint.coordinate.latitude, 38.8977, accuracy: 1e-5) + XCTAssertEqual(waypoint.coordinate.longitude, -77.03650, accuracy: 1e-5) + XCTAssertNil(waypoint.coordinateAccuracy) + XCTAssertNil(waypoint.targetCoordinate) + + XCTAssertNil(waypoint.heading) + XCTAssertNil(waypoint.headingAccuracy) + XCTAssertTrue(waypoint.allowsArrivingOnOppositeSide) + XCTAssertTrue(waypoint.separatesLegs) + } - let decoder = JSONDecoder() + waypoint = Waypoint(coordinate: CLLocationCoordinate2D(latitude: 38.8977, longitude: -77.0365), coordinateAccuracy: 5, name: "White House") + waypoint?.targetCoordinate = CLLocationCoordinate2D(latitude: 38.8952261, longitude: -77.0327882) + waypoint?.heading = 90 + waypoint?.headingAccuracy = 10 + waypoint?.allowsArrivingOnOppositeSide = false - let decodedWaypoint = try! decoder.decode(Waypoint.self, from: encodedData) + let encoder = JSONEncoder() + var encodedData: Data? + XCTAssertNoThrow(encodedData = try encoder.encode(waypoint)) + XCTAssertNotNil(encodedData) - XCTAssertEqual(decodedWaypoint.coordinate.latitude, originalWaypoint.coordinate.latitude) - XCTAssertEqual(decodedWaypoint.coordinate.longitude, originalWaypoint.coordinate.longitude) - XCTAssertEqual(decodedWaypoint.coordinateAccuracy, originalWaypoint.coordinateAccuracy) - XCTAssert(decodedWaypoint.targetCoordinate == originalWaypoint.targetCoordinate) - - XCTAssertEqual(decodedWaypoint.heading, originalWaypoint.heading) - XCTAssertEqual(decodedWaypoint.headingAccuracy, originalWaypoint.headingAccuracy) - XCTAssertEqual(decodedWaypoint.allowsArrivingOnOppositeSide, originalWaypoint.allowsArrivingOnOppositeSide) - XCTAssertEqual(decodedWaypoint.separatesLegs, originalWaypoint.separatesLegs) + if let encodedData = encodedData { + var encodedWaypointJSON: [String: Any?]? + XCTAssertNoThrow(encodedWaypointJSON = try JSONSerialization.jsonObject(with: encodedData, options: []) as? [String: Any?]) + XCTAssertNotNil(encodedWaypointJSON) + + // Verify then remove keys that wouldn’t be part of a Waypoint object in the Directions API response. + XCTAssertEqual(encodedWaypointJSON?["headingAccuracy"] as? CLLocationDirection, waypoint?.headingAccuracy) + encodedWaypointJSON?.removeValue(forKey: "headingAccuracy") + XCTAssertEqual(encodedWaypointJSON?["coordinateAccuracy"] as? CLLocationAccuracy, waypoint?.coordinateAccuracy) + encodedWaypointJSON?.removeValue(forKey: "coordinateAccuracy") + XCTAssertEqual(encodedWaypointJSON?["allowsArrivingOnOppositeSide"] as? Bool, waypoint?.allowsArrivingOnOppositeSide) + encodedWaypointJSON?.removeValue(forKey: "allowsArrivingOnOppositeSide") + XCTAssertEqual(encodedWaypointJSON?["heading"] as? CLLocationDirection, waypoint?.heading) + encodedWaypointJSON?.removeValue(forKey: "heading") + XCTAssertEqual(encodedWaypointJSON?["separatesLegs"] as? Bool, waypoint?.separatesLegs) + encodedWaypointJSON?.removeValue(forKey: "separatesLegs") + + let targetCoordinateJSON = encodedWaypointJSON?["targetCoordinate"] as? [CLLocationDegrees] + XCTAssertNotNil(targetCoordinateJSON) + XCTAssertEqual(targetCoordinateJSON?.count, 2) + XCTAssertEqual(targetCoordinateJSON?[0] ?? 0, waypoint?.targetCoordinate?.longitude ?? 0, accuracy: 1e-5) + XCTAssertEqual(targetCoordinateJSON?[1] ?? 0, waypoint?.targetCoordinate?.latitude ?? 0, accuracy: 1e-5) + encodedWaypointJSON?.removeValue(forKey: "targetCoordinate") + + XCTAssert(JSONSerialization.objectsAreEqual(waypointJSON, encodedWaypointJSON, approximate: true)) + } } func testSeparatesLegs() { @@ -56,22 +87,3 @@ class WaypointTests: XCTestCase { XCTAssertEqual(matchOptions.urlQueryItems.first { $0.name == "waypoints" }?.value, "0;2;3") } } - -fileprivate let pass = """ -{ - \"headingAccuracy\" : 10, - \"location\" : [ - -77.036500000000004, - 38.8977 - ], - \"targetCoordinate\" : [ - -77.032788199999999, - 38.895226100000002 - ], - \"coordinateAccuracy\" : 5, - \"allowsArrivingOnOppositeSide\" : false, - \"heading\" : 90, - \"separatesLegs\" : true, - \"name\" : \"White House\" -} -""" From 751d7ba01ed7eb0212cab987f60f6440811607bf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Minh=20Nguye=CC=82=CC=83n?= Date: Mon, 2 Dec 2019 13:29:52 -0800 Subject: [PATCH 74/89] Encode URLs as strings URL encodes as an escaped string, which is incompatible with the Directions API response. --- Sources/MapboxDirections/VisualInstructionComponent.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Sources/MapboxDirections/VisualInstructionComponent.swift b/Sources/MapboxDirections/VisualInstructionComponent.swift index ca1bb6e64..036128f6f 100644 --- a/Sources/MapboxDirections/VisualInstructionComponent.swift +++ b/Sources/MapboxDirections/VisualInstructionComponent.swift @@ -204,7 +204,7 @@ extension VisualInstruction.Component: Codable { case .image(let image, let alternativeText): try container.encode(Kind.image, forKey: .kind) textRepresentation = alternativeText - try container.encodeIfPresent(image.imageBaseURL, forKey: .imageBaseURL) + try container.encodeIfPresent(image.imageBaseURL?.absoluteString, forKey: .imageBaseURL) case .exit(let text): try container.encode(Kind.exit, forKey: .kind) textRepresentation = text From 4e0d84594f730e0173b50bed299b4b2cbec03256 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Minh=20Nguye=CC=82=CC=83n?= Date: Mon, 2 Dec 2019 13:30:21 -0800 Subject: [PATCH 75/89] Unit test instructions more thoroughly --- MapboxDirections.xcodeproj/project.pbxproj | 32 ++++++++++---- .../MapboxDirectionsTests/GeoJSONTests.swift | 18 ++++++++ .../SpokenInstructionTests.swift | 37 ++++++++++++++++ .../VisualInstructionComponentTests.swift | 43 ++++++++++++++++++- ...sts.swift => VisualInstructionTests.swift} | 2 +- 5 files changed, 122 insertions(+), 10 deletions(-) create mode 100644 Tests/MapboxDirectionsTests/GeoJSONTests.swift create mode 100644 Tests/MapboxDirectionsTests/SpokenInstructionTests.swift rename Tests/MapboxDirectionsTests/{InstructionsTests.swift => VisualInstructionTests.swift} (99%) diff --git a/MapboxDirections.xcodeproj/project.pbxproj b/MapboxDirections.xcodeproj/project.pbxproj index 0565bbb91..b764db637 100644 --- a/MapboxDirections.xcodeproj/project.pbxproj +++ b/MapboxDirections.xcodeproj/project.pbxproj @@ -104,7 +104,7 @@ C52CE38F1F6AF63C0069963D /* SpokenInstruction.swift in Sources */ = {isa = PBXBuildFile; fileRef = C55FB44A1F6AEBF6006BD1E9 /* SpokenInstruction.swift */; }; C52CE3901F6AF63D0069963D /* SpokenInstruction.swift in Sources */ = {isa = PBXBuildFile; fileRef = C55FB44A1F6AEBF6006BD1E9 /* SpokenInstruction.swift */; }; C52CE3911F6AF63E0069963D /* SpokenInstruction.swift in Sources */ = {isa = PBXBuildFile; fileRef = C55FB44A1F6AEBF6006BD1E9 /* SpokenInstruction.swift */; }; - C52CE3931F6AF6E70069963D /* InstructionsTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = C52CE3921F6AF6E70069963D /* InstructionsTests.swift */; }; + C52CE3931F6AF6E70069963D /* VisualInstructionTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = C52CE3921F6AF6E70069963D /* VisualInstructionTests.swift */; }; C53A02261E92C26E009837BD /* AttributeOptions.swift in Sources */ = {isa = PBXBuildFile; fileRef = C51538CB1E807FF00093FF3E /* AttributeOptions.swift */; }; C53A02271E92C26F009837BD /* AttributeOptions.swift in Sources */ = {isa = PBXBuildFile; fileRef = C51538CB1E807FF00093FF3E /* AttributeOptions.swift */; }; C53A02281E92C271009837BD /* AttributeOptions.swift in Sources */ = {isa = PBXBuildFile; fileRef = C51538CB1E807FF00093FF3E /* AttributeOptions.swift */; }; @@ -154,8 +154,8 @@ C5D1D7F01F6AF91700A1C4F1 /* instructions.json in Resources */ = {isa = PBXBuildFile; fileRef = C5D1D7EF1F6AF91700A1C4F1 /* instructions.json */; }; C5D1D7F11F6AF92500A1C4F1 /* instructions.json in Resources */ = {isa = PBXBuildFile; fileRef = C5D1D7EF1F6AF91700A1C4F1 /* instructions.json */; }; C5D1D7F21F6AF92600A1C4F1 /* instructions.json in Resources */ = {isa = PBXBuildFile; fileRef = C5D1D7EF1F6AF91700A1C4F1 /* instructions.json */; }; - C5D1D7F31F6AFBD600A1C4F1 /* InstructionsTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = C52CE3921F6AF6E70069963D /* InstructionsTests.swift */; }; - C5D1D7F41F6AFBD600A1C4F1 /* InstructionsTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = C52CE3921F6AF6E70069963D /* InstructionsTests.swift */; }; + C5D1D7F31F6AFBD600A1C4F1 /* VisualInstructionTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = C52CE3921F6AF6E70069963D /* VisualInstructionTests.swift */; }; + C5D1D7F41F6AFBD600A1C4F1 /* VisualInstructionTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = C52CE3921F6AF6E70069963D /* VisualInstructionTests.swift */; }; C5DAAC9A20191675001F9261 /* Match.swift in Sources */ = {isa = PBXBuildFile; fileRef = C5DAAC9920191675001F9261 /* Match.swift */; }; C5DAAC9B2019167C001F9261 /* Match.swift in Sources */ = {isa = PBXBuildFile; fileRef = C5DAAC9920191675001F9261 /* Match.swift */; }; C5DAAC9C2019167D001F9261 /* Match.swift in Sources */ = {isa = PBXBuildFile; fileRef = C5DAAC9920191675001F9261 /* Match.swift */; }; @@ -222,6 +222,12 @@ DAA76D691DD127CB0015EC78 /* LaneIndication.swift in Sources */ = {isa = PBXBuildFile; fileRef = DAA76D671DD127CB0015EC78 /* LaneIndication.swift */; }; DAA76D6A1DD127CB0015EC78 /* LaneIndication.swift in Sources */ = {isa = PBXBuildFile; fileRef = DAA76D671DD127CB0015EC78 /* LaneIndication.swift */; }; DAA76D6B1DD127CB0015EC78 /* LaneIndication.swift in Sources */ = {isa = PBXBuildFile; fileRef = DAA76D671DD127CB0015EC78 /* LaneIndication.swift */; }; + DAABF78E2395ABA900CEEB61 /* SpokenInstructionTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = DAABF78D2395ABA900CEEB61 /* SpokenInstructionTests.swift */; }; + DAABF78F2395ABA900CEEB61 /* SpokenInstructionTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = DAABF78D2395ABA900CEEB61 /* SpokenInstructionTests.swift */; }; + DAABF7902395ABA900CEEB61 /* SpokenInstructionTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = DAABF78D2395ABA900CEEB61 /* SpokenInstructionTests.swift */; }; + DAABF7922395AE9800CEEB61 /* GeoJSONTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = DAABF7912395AE9800CEEB61 /* GeoJSONTests.swift */; }; + DAABF7932395AE9800CEEB61 /* GeoJSONTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = DAABF7912395AE9800CEEB61 /* GeoJSONTests.swift */; }; + DAABF7942395AE9800CEEB61 /* GeoJSONTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = DAABF7912395AE9800CEEB61 /* GeoJSONTests.swift */; }; DABE6C7E236A37E200D370F4 /* JSONSerialization.swift in Sources */ = {isa = PBXBuildFile; fileRef = DABE6C7D236A37E200D370F4 /* JSONSerialization.swift */; }; DABE6C7F236A37E200D370F4 /* JSONSerialization.swift in Sources */ = {isa = PBXBuildFile; fileRef = DABE6C7D236A37E200D370F4 /* JSONSerialization.swift */; }; DABE6C80236A37E200D370F4 /* JSONSerialization.swift in Sources */ = {isa = PBXBuildFile; fileRef = DABE6C7D236A37E200D370F4 /* JSONSerialization.swift */; }; @@ -332,7 +338,7 @@ C51538CB1E807FF00093FF3E /* AttributeOptions.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AttributeOptions.swift; sourceTree = ""; }; C5247D701E818A24004B6154 /* AnnotationTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AnnotationTests.swift; sourceTree = ""; }; C52552B81FA15D5900B1545C /* VisualInstructionBanner.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = VisualInstructionBanner.swift; sourceTree = ""; }; - C52CE3921F6AF6E70069963D /* InstructionsTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = InstructionsTests.swift; sourceTree = ""; }; + C52CE3921F6AF6E70069963D /* VisualInstructionTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = VisualInstructionTests.swift; sourceTree = ""; }; C5434B89200693D00069E887 /* Tracepoint.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Tracepoint.swift; sourceTree = ""; }; C5434B8B200695A50069E887 /* MatchOptions.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MatchOptions.swift; sourceTree = ""; }; C55FB44A1F6AEBF6006BD1E9 /* SpokenInstruction.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SpokenInstruction.swift; sourceTree = ""; }; @@ -372,6 +378,8 @@ DA737EE31D05F91E005BDA16 /* v5_driving_dc_geojson.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = v5_driving_dc_geojson.json; sourceTree = ""; }; DA9E1B121E5A675F0081EDC7 /* Polyline.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Polyline.framework; path = Carthage/Build/watchOS/Polyline.framework; sourceTree = ""; }; DAA76D671DD127CB0015EC78 /* LaneIndication.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = LaneIndication.swift; sourceTree = ""; }; + DAABF78D2395ABA900CEEB61 /* SpokenInstructionTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SpokenInstructionTests.swift; sourceTree = ""; }; + DAABF7912395AE9800CEEB61 /* GeoJSONTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GeoJSONTests.swift; sourceTree = ""; }; DABE6C7D236A37E200D370F4 /* JSONSerialization.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = JSONSerialization.swift; sourceTree = ""; }; DAC05F151CFBFAC400FA0071 /* Waypoint.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Waypoint.swift; sourceTree = ""; }; DAC05F171CFC075300FA0071 /* Route.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Route.swift; sourceTree = ""; }; @@ -609,8 +617,8 @@ C5247D701E818A24004B6154 /* AnnotationTests.swift */, DA1A110A1D01045E009F82FA /* DirectionsTests.swift */, DA6C9DB11CAECA0E00094FBC /* Fixture.swift */, + DAABF7912395AE9800CEEB61 /* GeoJSONTests.swift */, DA6C9D9A1CAE442B00094FBC /* Info.plist */, - C52CE3921F6AF6E70069963D /* InstructionsTests.swift */, DAE33A1A1F215DF600C06039 /* IntersectionTests.swift */, DABE6C7D236A37E200D370F4 /* JSONSerialization.swift */, 3556CE9922649CF2009397B5 /* MapboxDirectionsTests-Bridging-Header.h */, @@ -619,7 +627,9 @@ C59666382048A20E00C45CE5 /* RoutableMatchTests.swift */, DAE9E0F31EB7DE2E001E8E8B /* RouteOptionsTests.swift */, F4D785EE1DDD82C100FF4665 /* RouteStepTests.swift */, + DAABF78D2395ABA900CEEB61 /* SpokenInstructionTests.swift */, DA6C9DAB1CAEC72800094FBC /* V5Tests.swift */, + C52CE3921F6AF6E70069963D /* VisualInstructionTests.swift */, DA688B3D21B89ECD00C9BB25 /* VisualInstructionComponentTests.swift */, 35CC310A2285739700EA1966 /* WalkingOptionsTests.swift */, DA4F84EC21C08BFB008A0434 /* WaypointTests.swift */, @@ -1183,10 +1193,12 @@ C5DAACB0201AA92B001F9261 /* MatchTests.swift in Sources */, DA1A10CE1D00F972009F82FA /* Fixture.swift in Sources */, DA1A110C1D01045E009F82FA /* DirectionsTests.swift in Sources */, - C5D1D7F31F6AFBD600A1C4F1 /* InstructionsTests.swift in Sources */, + C5D1D7F31F6AFBD600A1C4F1 /* VisualInstructionTests.swift in Sources */, DA4F84EE21C08BFB008A0434 /* WaypointTests.swift in Sources */, + DAABF78F2395ABA900CEEB61 /* SpokenInstructionTests.swift in Sources */, 35CC310C2285739700EA1966 /* WalkingOptionsTests.swift in Sources */, DABE6C7F236A37E200D370F4 /* JSONSerialization.swift in Sources */, + DAABF7932395AE9800CEEB61 /* GeoJSONTests.swift in Sources */, F4D785F01DDD82C100FF4665 /* RouteStepTests.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; @@ -1248,10 +1260,12 @@ C5DAACB1201AA92B001F9261 /* MatchTests.swift in Sources */, DA1A10F51D010251009F82FA /* Fixture.swift in Sources */, DA1A110D1D01045E009F82FA /* DirectionsTests.swift in Sources */, - C5D1D7F41F6AFBD600A1C4F1 /* InstructionsTests.swift in Sources */, + C5D1D7F41F6AFBD600A1C4F1 /* VisualInstructionTests.swift in Sources */, DA4F84EF21C08BFB008A0434 /* WaypointTests.swift in Sources */, + DAABF7902395ABA900CEEB61 /* SpokenInstructionTests.swift in Sources */, 35CC310D2285739700EA1966 /* WalkingOptionsTests.swift in Sources */, DABE6C80236A37E200D370F4 /* JSONSerialization.swift in Sources */, + DAABF7942395AE9800CEEB61 /* GeoJSONTests.swift in Sources */, F4D785F11DDD82C100FF4665 /* RouteStepTests.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; @@ -1356,10 +1370,12 @@ C5DAACAF201AA92B001F9261 /* MatchTests.swift in Sources */, DA6C9DB21CAECA0E00094FBC /* Fixture.swift in Sources */, DA1A110B1D01045E009F82FA /* DirectionsTests.swift in Sources */, - C52CE3931F6AF6E70069963D /* InstructionsTests.swift in Sources */, + C52CE3931F6AF6E70069963D /* VisualInstructionTests.swift in Sources */, DA4F84ED21C08BFB008A0434 /* WaypointTests.swift in Sources */, + DAABF78E2395ABA900CEEB61 /* SpokenInstructionTests.swift in Sources */, 35CC310B2285739700EA1966 /* WalkingOptionsTests.swift in Sources */, DABE6C7E236A37E200D370F4 /* JSONSerialization.swift in Sources */, + DAABF7922395AE9800CEEB61 /* GeoJSONTests.swift in Sources */, F4D785EF1DDD82C100FF4665 /* RouteStepTests.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; diff --git a/Tests/MapboxDirectionsTests/GeoJSONTests.swift b/Tests/MapboxDirectionsTests/GeoJSONTests.swift new file mode 100644 index 000000000..678a3a9fa --- /dev/null +++ b/Tests/MapboxDirectionsTests/GeoJSONTests.swift @@ -0,0 +1,18 @@ +import XCTest +@testable import MapboxDirections +import struct Turf.LineString + +class GeoJSONTests: XCTestCase { + func testInitialization() { + XCTAssertThrowsError(try LineString(encodedPolyline: ">==========>", precision: 1e6)) + + var lineString: LineString? = nil + XCTAssertNoThrow(lineString = try LineString(encodedPolyline: "afvnFdrebO@o@", precision: 1e5)) + XCTAssertNotNil(lineString) + XCTAssertEqual(lineString?.coordinates.count, 2) + XCTAssertEqual(lineString?.coordinates.first?.latitude ?? 0.0, 39.27665, accuracy: 1e-5) + XCTAssertEqual(lineString?.coordinates.first?.longitude ?? 0.0, -84.411389, accuracy: 1e-5) + XCTAssertEqual(lineString?.coordinates.last?.latitude ?? 0.0, 39.276635, accuracy: 1e-5) + XCTAssertEqual(lineString?.coordinates.last?.longitude ?? 0.0, -84.411148, accuracy: 1e-5) + } +} diff --git a/Tests/MapboxDirectionsTests/SpokenInstructionTests.swift b/Tests/MapboxDirectionsTests/SpokenInstructionTests.swift new file mode 100644 index 000000000..5e86962dd --- /dev/null +++ b/Tests/MapboxDirectionsTests/SpokenInstructionTests.swift @@ -0,0 +1,37 @@ +import XCTest +@testable import MapboxDirections + +class SpokenInstructionTests: XCTestCase { + func testCoding() { + let instructionJSON: [String: Any] = [ + "distanceAlongGeometry": 20.8, + "announcement": "Head east on Hageman Street, then turn right onto Reading Road", + "ssmlAnnouncement": "Head east on Hageman Street, then turn right onto Reading Road", + ] + let instructionData = try! JSONSerialization.data(withJSONObject: instructionJSON, options: []) + var instruction: SpokenInstruction? + XCTAssertNoThrow(instruction = try JSONDecoder().decode(SpokenInstruction.self, from: instructionData)) + XCTAssertNotNil(instruction) + if let instruction = instruction { + XCTAssertEqual(instruction.distanceAlongStep, instructionJSON["distanceAlongGeometry"] as! CLLocationDistance) + XCTAssertEqual(instruction.text, instructionJSON["announcement"] as! String) + XCTAssertEqual(instruction.ssmlText, instructionJSON["ssmlAnnouncement"] as! String) + } + + instruction = SpokenInstruction(distanceAlongStep: instructionJSON["distanceAlongGeometry"] as! CLLocationDistance, + text: instructionJSON["announcement"] as! String, + ssmlText: instructionJSON["ssmlAnnouncement"] as! String) + let encoder = JSONEncoder() + var encodedData: Data? + XCTAssertNoThrow(encodedData = try encoder.encode(instruction)) + XCTAssertNotNil(encodedData) + + if let encodedData = encodedData { + var encodedInstructionJSON: [String: Any?]? + XCTAssertNoThrow(encodedInstructionJSON = try JSONSerialization.jsonObject(with: encodedData, options: []) as? [String: Any?]) + XCTAssertNotNil(encodedInstructionJSON) + + XCTAssert(JSONSerialization.objectsAreEqual(instructionJSON, encodedInstructionJSON, approximate: true)) + } + } +} diff --git a/Tests/MapboxDirectionsTests/VisualInstructionComponentTests.swift b/Tests/MapboxDirectionsTests/VisualInstructionComponentTests.swift index 6638c6af7..8d762a8e0 100644 --- a/Tests/MapboxDirectionsTests/VisualInstructionComponentTests.swift +++ b/Tests/MapboxDirectionsTests/VisualInstructionComponentTests.swift @@ -2,7 +2,7 @@ import XCTest @testable import MapboxDirections class VisualInstructionComponentTests: XCTestCase { - func testJSONInitialization() { + func testTextComponent() { let componentJSON = [ "type": "text", "text": "Take a hike", @@ -21,4 +21,45 @@ class VisualInstructionComponentTests: XCTestCase { } } } + + func testImageComponent() { + let componentJSON = [ + "text": "US 42", + "type": "icon", + "imageBaseURL": "https://s3.amazonaws.com/mapbox/shields/v3/us-42", + ] + let componentData = try! JSONSerialization.data(withJSONObject: componentJSON, options: []) + var component: VisualInstruction.Component? + XCTAssertNoThrow(component = try JSONDecoder().decode(VisualInstruction.Component.self, from: componentData)) + XCTAssertNotNil(component) + if let component = component { + switch component { + case .image(let image, let alternativeText): + XCTAssertEqual(image.imageBaseURL?.absoluteString, "https://s3.amazonaws.com/mapbox/shields/v3/us-42") + XCTAssertEqual(image.imageURL(scale: 1, format: .svg)?.absoluteString, "https://s3.amazonaws.com/mapbox/shields/v3/us-42@1x.svg") + XCTAssertEqual(image.imageURL(scale: 3, format: .svg)?.absoluteString, "https://s3.amazonaws.com/mapbox/shields/v3/us-42@3x.svg") + XCTAssertEqual(image.imageURL(scale: 3, format: .png)?.absoluteString, "https://s3.amazonaws.com/mapbox/shields/v3/us-42@3x.png") + XCTAssertEqual(alternativeText.text, "US 42") + XCTAssertNil(alternativeText.abbreviation) + XCTAssertNil(alternativeText.abbreviationPriority) + default: + XCTFail("Image component should not be decoded as any other kind of component.") + } + } + + component = .image(image: .init(imageBaseURL: URL(string: "https://s3.amazonaws.com/mapbox/shields/v3/us-42")!), + alternativeText: .init(text: "US 42", abbreviation: nil, abbreviationPriority: nil)) + let encoder = JSONEncoder() + var encodedData: Data? + XCTAssertNoThrow(encodedData = try encoder.encode(component)) + XCTAssertNotNil(encodedData) + + if let encodedData = encodedData { + var encodedComponentJSON: [String: Any?]? + XCTAssertNoThrow(encodedComponentJSON = try JSONSerialization.jsonObject(with: encodedData, options: []) as? [String: Any?]) + XCTAssertNotNil(encodedComponentJSON) + + XCTAssert(JSONSerialization.objectsAreEqual(componentJSON, encodedComponentJSON, approximate: false)) + } + } } diff --git a/Tests/MapboxDirectionsTests/InstructionsTests.swift b/Tests/MapboxDirectionsTests/VisualInstructionTests.swift similarity index 99% rename from Tests/MapboxDirectionsTests/InstructionsTests.swift rename to Tests/MapboxDirectionsTests/VisualInstructionTests.swift index 68befdc63..a7e5c6615 100644 --- a/Tests/MapboxDirectionsTests/InstructionsTests.swift +++ b/Tests/MapboxDirectionsTests/VisualInstructionTests.swift @@ -3,7 +3,7 @@ import XCTest import OHHTTPStubs @testable import MapboxDirections -class SpokenInstructionsTests: XCTestCase { +class VisualInstructionsTests: XCTestCase { override func tearDown() { OHHTTPStubs.removeAllStubs() super.tearDown() From 53c71654c96c1b47f6910905391c220bb7ff40e7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Minh=20Nguye=CC=82=CC=83n?= Date: Mon, 2 Dec 2019 16:18:43 -0800 Subject: [PATCH 76/89] Allow image component format to be SVG Fixed an issue where the file extension was hardcoded as .png. --- Sources/MapboxDirections/VisualInstructionComponent.swift | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Sources/MapboxDirections/VisualInstructionComponent.swift b/Sources/MapboxDirections/VisualInstructionComponent.swift index 036128f6f..ff1b0e1fc 100644 --- a/Sources/MapboxDirections/VisualInstructionComponent.swift +++ b/Sources/MapboxDirections/VisualInstructionComponent.swift @@ -88,7 +88,7 @@ public extension VisualInstruction.Component { /** File formats of visual instruction component images. */ - public enum Format { + public enum Format: String { /// Portable Network Graphics (PNG) case png /// Scalable Vector Graphics (SVG) @@ -112,7 +112,7 @@ public extension VisualInstruction.Component { var imageURLComponents = URLComponents(url: imageBaseURL, resolvingAgainstBaseURL: false) else { return nil } - imageURLComponents.path += "@\(Int(scale ?? ImageRepresentation.currentScale))x.png" + imageURLComponents.path += "@\(Int(scale ?? ImageRepresentation.currentScale))x.\(format)" return imageURLComponents.url } From c3fa0964120d5e8f359738204e4a2422e8da3c3e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Minh=20Nguye=CC=82=CC=83n?= Date: Tue, 3 Dec 2019 09:55:13 -0800 Subject: [PATCH 77/89] Rethrow malformed step coordinate instead of swallowing error --- Sources/MapboxDirections/RouteStep.swift | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/Sources/MapboxDirections/RouteStep.swift b/Sources/MapboxDirections/RouteStep.swift index 691dd4a5a..eb93b6e17 100644 --- a/Sources/MapboxDirections/RouteStep.swift +++ b/Sources/MapboxDirections/RouteStep.swift @@ -450,12 +450,7 @@ open class RouteStep: Codable { let container = try decoder.container(keyedBy: CodingKeys.self) let maneuver = try container.nestedContainer(keyedBy: ManeuverCodingKeys.self, forKey: .maneuver) - if let coordinate = try? maneuver.decode(CLLocationCoordinate2D.self, forKey: .location) { - maneuverLocation = coordinate - } else { - maneuverLocation = CLLocationCoordinate2D() - } - + maneuverLocation = try maneuver.decode(CLLocationCoordinate2D.self, forKey: .location) maneuverType = try maneuver.decodeIfPresent(ManeuverType.self, forKey: .type) ?? .none maneuverDirection = try maneuver.decodeIfPresent(ManeuverDirection.self, forKey: .direction) ?? .none From ec3cc583d719c4d1d03351b1c418849115675b8f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Minh=20Nguye=CC=82=CC=83n?= Date: Tue, 3 Dec 2019 09:55:43 -0800 Subject: [PATCH 78/89] Factored out default driving side --- Sources/MapboxDirections/DrivingSide.swift | 2 ++ Sources/MapboxDirections/VisualInstructionBanner.swift | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/Sources/MapboxDirections/DrivingSide.swift b/Sources/MapboxDirections/DrivingSide.swift index 3d2271fd3..291dc2e67 100644 --- a/Sources/MapboxDirections/DrivingSide.swift +++ b/Sources/MapboxDirections/DrivingSide.swift @@ -13,4 +13,6 @@ public enum DrivingSide: String, Codable { Indicates driving occurs on the `right` side. */ case right + + static let `default` = DrivingSide.right } diff --git a/Sources/MapboxDirections/VisualInstructionBanner.swift b/Sources/MapboxDirections/VisualInstructionBanner.swift index 3f5f65492..39925359f 100644 --- a/Sources/MapboxDirections/VisualInstructionBanner.swift +++ b/Sources/MapboxDirections/VisualInstructionBanner.swift @@ -37,7 +37,7 @@ open class VisualInstructionBanner: Codable { if let directlyEncoded = try container.decodeIfPresent(DrivingSide.self, forKey: .drivingSide) { drivingSide = directlyEncoded } else { - drivingSide = .right + drivingSide = .default } } From 094f529787a1a55dc49e13f7d7b320eafc4d19d1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Minh=20Nguye=CC=82=CC=83n?= Date: Tue, 3 Dec 2019 09:56:59 -0800 Subject: [PATCH 79/89] Remove default visual instruction final heading MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 180° is a sensible default final heading for a circular maneuver, but there’s no longer any need for a default value here. Previously we specified a default value because Objective-C doesn’t support optional CLLocationDirections. --- Sources/MapboxDirections/VisualInstruction.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Sources/MapboxDirections/VisualInstruction.swift b/Sources/MapboxDirections/VisualInstruction.swift index f2aa4a322..ac8ef4960 100644 --- a/Sources/MapboxDirections/VisualInstruction.swift +++ b/Sources/MapboxDirections/VisualInstruction.swift @@ -18,7 +18,7 @@ open class VisualInstruction: Codable { /** Initializes a new visual instruction banner object that displays the given information. */ - public init(text: String?, maneuverType: ManeuverType, maneuverDirection: ManeuverDirection, components: [Component], degrees: CLLocationDegrees = 180) { + public init(text: String?, maneuverType: ManeuverType, maneuverDirection: ManeuverDirection, components: [Component], degrees: CLLocationDegrees? = nil) { self.text = text self.maneuverType = maneuverType self.maneuverDirection = maneuverDirection From d0f6b7e91c317a19ca7203bd6334ef514c9f80b4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Minh=20Nguy=E1=BB=85n?= Date: Tue, 3 Dec 2019 09:57:49 -0800 Subject: [PATCH 80/89] Removed dead code --- Sources/MapboxDirections/RouteResponse.swift | 9 --------- 1 file changed, 9 deletions(-) diff --git a/Sources/MapboxDirections/RouteResponse.swift b/Sources/MapboxDirections/RouteResponse.swift index 5da674b5d..ee628bdbd 100644 --- a/Sources/MapboxDirections/RouteResponse.swift +++ b/Sources/MapboxDirections/RouteResponse.swift @@ -7,15 +7,6 @@ struct RouteResponse { let uuid: String? let routes: [Route]? let waypoints: [Waypoint]? - - init(code: String?, message: String?, error: String?) { - self.code = code - self.message = message - self.error = error - self.uuid = nil - self.routes = nil - self.waypoints = nil - } } extension RouteResponse: Codable { From 7fbf452c5682aed61e857d796f981996ac05f8e5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Minh=20Nguye=CC=82=CC=83n?= Date: Tue, 3 Dec 2019 09:58:16 -0800 Subject: [PATCH 81/89] Test visual instructions, waypoints Also added initializer for visual instruction banners. --- .../VisualInstructionBanner.swift | 11 ++++ .../VisualInstructionTests.swift | 53 +++++++++++++++++++ .../MapboxDirectionsTests/WaypointTests.swift | 17 ++++++ 3 files changed, 81 insertions(+) diff --git a/Sources/MapboxDirections/VisualInstructionBanner.swift b/Sources/MapboxDirections/VisualInstructionBanner.swift index 39925359f..9eea0abdf 100644 --- a/Sources/MapboxDirections/VisualInstructionBanner.swift +++ b/Sources/MapboxDirections/VisualInstructionBanner.swift @@ -19,6 +19,17 @@ open class VisualInstructionBanner: Codable { // MARK: Creating a Visual Instruction Banner + /** + Initializes a visual instruction banner with the given instructions. + */ + public init(distanceAlongStep: CLLocationDistance, primary: VisualInstruction, secondary: VisualInstruction?, tertiary: VisualInstruction?, drivingSide: DrivingSide) { + self.distanceAlongStep = distanceAlongStep + primaryInstruction = primary + secondaryInstruction = secondary + tertiaryInstruction = tertiary + self.drivingSide = drivingSide + } + public func encode(to encoder: Encoder) throws { var container = encoder.container(keyedBy: CodingKeys.self) try container.encode(distanceAlongStep, forKey: .distanceAlongStep) diff --git a/Tests/MapboxDirectionsTests/VisualInstructionTests.swift b/Tests/MapboxDirectionsTests/VisualInstructionTests.swift index a7e5c6615..7b8fed06c 100644 --- a/Tests/MapboxDirectionsTests/VisualInstructionTests.swift +++ b/Tests/MapboxDirectionsTests/VisualInstructionTests.swift @@ -9,6 +9,59 @@ class VisualInstructionsTests: XCTestCase { super.tearDown() } + func testCoding() { + let bannerJSON: [String: Any?] = [ + "distanceAlongGeometry": 393.3, + "primary": [ + "text": "Weinstock Strasse", + "components": [ + [ + "text": "Weinstock Strasse", + "type": "text", + ], + ], + "type": "turn", + "modifier": "right", + ], + "secondary": nil, + ] + let bannerData = try! JSONSerialization.data(withJSONObject: bannerJSON, options: []) + var banner: VisualInstructionBanner? + XCTAssertNoThrow(banner = try JSONDecoder().decode(VisualInstructionBanner.self, from: bannerData)) + XCTAssertNotNil(banner) + if let banner = banner { + XCTAssertEqual(banner.distanceAlongStep, 393.3, accuracy: 1e-1) + XCTAssertEqual(banner.primaryInstruction.text, "Weinstock Strasse") + XCTAssertEqual(banner.primaryInstruction.components.count, 1) + XCTAssertEqual(banner.primaryInstruction.maneuverType, .turn) + XCTAssertEqual(banner.primaryInstruction.maneuverDirection, .right) + XCTAssertNil(banner.secondaryInstruction) + XCTAssertEqual(banner.drivingSide, .default) + } + + let component = VisualInstruction.Component.text(text: .init(text: "Weinstock Strasse", abbreviation: nil, abbreviationPriority: nil)) + let primaryInstruction = VisualInstruction(text: "Weinstock Strasse", maneuverType: .turn, maneuverDirection: .right, components: [component]) + banner = VisualInstructionBanner(distanceAlongStep: 393.3, primary: primaryInstruction, secondary: nil, tertiary: nil, drivingSide: .right) + let encoder = JSONEncoder() + var encodedData: Data? + XCTAssertNoThrow(encodedData = try encoder.encode(banner)) + XCTAssertNotNil(encodedData) + + if let encodedData = encodedData { + var encodedBannerJSON: [String: Any?]? + XCTAssertNoThrow(encodedBannerJSON = try JSONSerialization.jsonObject(with: encodedData, options: []) as? [String: Any?]) + XCTAssertNotNil(encodedBannerJSON) + + // Verify then remove keys that wouldn’t necessarily be part of a BannerInstruction object in the Directions API response. + XCTAssertEqual(encodedBannerJSON?["drivingSide"] as? String, "right") + encodedBannerJSON?.removeValue(forKey: "drivingSide") + + encodedBannerJSON?.updateValue(nil, forKey: "secondary") + + XCTAssert(JSONSerialization.objectsAreEqual(bannerJSON, encodedBannerJSON, approximate: false)) + } + } + func testPrimaryAndSecondaryInstructions() { let expectation = self.expectation(description: "calculating directions with primary and secondary instructions should return results") diff --git a/Tests/MapboxDirectionsTests/WaypointTests.swift b/Tests/MapboxDirectionsTests/WaypointTests.swift index d6556868b..5492603b5 100644 --- a/Tests/MapboxDirectionsTests/WaypointTests.swift +++ b/Tests/MapboxDirectionsTests/WaypointTests.swift @@ -86,4 +86,21 @@ class WaypointTests: XCTestCase { XCTAssertEqual(matchOptions.urlQueryItems.first { $0.name == "waypoints" }?.value, "0;2;3") } + + func testHeading() { + let waypoint = Waypoint(coordinate: kCLLocationCoordinate2DInvalid) + XCTAssertEqual(waypoint.headingDescription, "") + + waypoint.heading = 0 + XCTAssertEqual(waypoint.headingDescription, "") + + waypoint.headingAccuracy = 0 + XCTAssertEqual(waypoint.headingDescription, "0.0,0.0") + + waypoint.heading = 810.5 + XCTAssertEqual(waypoint.headingDescription, "90.5,0.0") + + waypoint.headingAccuracy = 720 + XCTAssertEqual(waypoint.headingDescription, "90.5,180.0") + } } From 713fbd5d44a2473f04d7d698be8f6e41825f3b63 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Minh=20Nguye=CC=82=CC=83n?= Date: Thu, 5 Dec 2019 10:59:29 -0800 Subject: [PATCH 82/89] Rename Tracepoint.alternateCount; test waypoint equality MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit alternateCount is a poor property name because it sounds like an action. Additionally, it counts routes that serve as alternatives, not routes that alternate back and forth. Added equality tests for waypoints, with the caveat that we can’t fully test equality between tracepoints yet. --- CHANGELOG.md | 1 + .../MapMatching/Tracepoint.swift | 14 ++++---- Tests/MapboxDirectionsTests/MatchTests.swift | 2 +- .../SpokenInstructionTests.swift | 17 ++++++++++ .../MapboxDirectionsTests/WaypointTests.swift | 32 +++++++++++++++++++ 5 files changed, 58 insertions(+), 8 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index ca979bf40..352df3b46 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -25,6 +25,7 @@ * Replaced the `MBDefaultWalkingSpeed`, `MBMinimumWalkingSpeed`, and `MBMaximumWalkingSpeed` constants with `CLLocationSpeed.normalWalking`, `CLLocationSpeed.minimumWalking`, and `CLLocationSpeed.maximumWalking`, respectively. * Replaced the `Route.coordinates` property with `Route.shape` and the `RouteStep.coordinates` property with `RouteStep.shape`. The `Route.coordinateCount` and `RouteStep.coordinateCount` properties have been removed, but you can use the `LineString.coordinates` property to get the array of `CLLocationCoordinate2D`s. ([#382](https://github.com/mapbox/MapboxDirections.swift/pull/382)) * `RouteLeg.source` and `RouteLeg.destination` are now optional. They can be `nil` when the `RouteLeg` object is decoded individually from JSON. ([#382](https://github.com/mapbox/MapboxDirections.swift/pull/382)) +* Renamed the `Tracepoint.alternateCount` property to `Tracepoint.countOfAlternatives`. ([#382](https://github.com/mapbox/MapboxDirections.swift/pull/382)) ## v0.30.0 diff --git a/Sources/MapboxDirections/MapMatching/Tracepoint.swift b/Sources/MapboxDirections/MapMatching/Tracepoint.swift index 3295c51bc..7b81f3e62 100644 --- a/Sources/MapboxDirections/MapMatching/Tracepoint.swift +++ b/Sources/MapboxDirections/MapMatching/Tracepoint.swift @@ -8,26 +8,26 @@ public class Tracepoint: Waypoint { /** Number of probable alternative matchings for this tracepoint. A value of zero indicates that this point was matched unambiguously. */ - public let alternateCount: Int + public let countOfAlternatives: Int private enum CodingKeys: String, CodingKey { - case alternateCount = "alternatives_count" + case countOfAlternatives = "alternatives_count" } - init(coordinate: CLLocationCoordinate2D, alternateCount: Int?, name: String?) { - self.alternateCount = alternateCount ?? NSNotFound + init(coordinate: CLLocationCoordinate2D, countOfAlternatives: Int, name: String?) { + self.countOfAlternatives = countOfAlternatives super.init(coordinate: coordinate, name: name) } required public init(from decoder: Decoder) throws { let container = try decoder.container(keyedBy: CodingKeys.self) - alternateCount = try container.decode(Int.self, forKey: .alternateCount) + countOfAlternatives = try container.decode(Int.self, forKey: .countOfAlternatives) try super.init(from: decoder) } public override func encode(to encoder: Encoder) throws { var container = encoder.container(keyedBy: CodingKeys.self) - try container.encode(alternateCount, forKey: .alternateCount) + try container.encode(countOfAlternatives, forKey: .countOfAlternatives) try super.encode(to: encoder) } } @@ -35,6 +35,6 @@ public class Tracepoint: Waypoint { extension Tracepoint { //Equatable public static func ==(lhs: Tracepoint, rhs: Tracepoint) -> Bool { let superEquals = (lhs as Waypoint == rhs as Waypoint) - return superEquals && lhs.alternateCount == rhs.alternateCount + return superEquals && lhs.countOfAlternatives == rhs.countOfAlternatives } } diff --git a/Tests/MapboxDirectionsTests/MatchTests.swift b/Tests/MapboxDirectionsTests/MatchTests.swift index fd65b3305..b22be28b3 100644 --- a/Tests/MapboxDirectionsTests/MatchTests.swift +++ b/Tests/MapboxDirectionsTests/MatchTests.swift @@ -57,7 +57,7 @@ class MatchTests: XCTestCase { let tracePoints = match.tracepoints XCTAssertNotNil(tracePoints) - XCTAssertEqual(tracePoints.first!!.alternateCount, 0) + XCTAssertEqual(tracePoints.first!!.countOfAlternatives, 0) XCTAssertEqual(tracePoints.last!!.name, "West G Street") // confirming actual decoded values is important because the Directions API diff --git a/Tests/MapboxDirectionsTests/SpokenInstructionTests.swift b/Tests/MapboxDirectionsTests/SpokenInstructionTests.swift index 5e86962dd..fda7e81db 100644 --- a/Tests/MapboxDirectionsTests/SpokenInstructionTests.swift +++ b/Tests/MapboxDirectionsTests/SpokenInstructionTests.swift @@ -34,4 +34,21 @@ class SpokenInstructionTests: XCTestCase { XCTAssert(JSONSerialization.objectsAreEqual(instructionJSON, encodedInstructionJSON, approximate: true)) } } + + func testEquality() { + let left = SpokenInstruction(distanceAlongStep: 0, text: "", ssmlText: "") + XCTAssertEqual(left, left) + + var right = SpokenInstruction(distanceAlongStep: 0, text: "", ssmlText: "") + XCTAssertEqual(left, right) + + right = SpokenInstruction(distanceAlongStep: 0.001, text: "", ssmlText: "") + XCTAssertNotEqual(left, right) + + right = SpokenInstruction(distanceAlongStep: 0, text: "Get lost", ssmlText: "") + XCTAssertNotEqual(left, right) + + right = SpokenInstruction(distanceAlongStep: 0, text: "", ssmlText: "Get lost") + XCTAssertNotEqual(left, right) + } } diff --git a/Tests/MapboxDirectionsTests/WaypointTests.swift b/Tests/MapboxDirectionsTests/WaypointTests.swift index 5492603b5..60933fce1 100644 --- a/Tests/MapboxDirectionsTests/WaypointTests.swift +++ b/Tests/MapboxDirectionsTests/WaypointTests.swift @@ -103,4 +103,36 @@ class WaypointTests: XCTestCase { waypoint.headingAccuracy = 720 XCTAssertEqual(waypoint.headingDescription, "90.5,180.0") } + + func testEquality() { + let left = Waypoint(coordinate: CLLocationCoordinate2D(), coordinateAccuracy: nil, name: nil) + XCTAssertEqual(left, left) + + var right = Waypoint(coordinate: CLLocationCoordinate2D(latitude: 1, longitude: 1), coordinateAccuracy: nil, name: nil) + XCTAssertNotEqual(left, right) + + right = Waypoint(coordinate: CLLocationCoordinate2D(), coordinateAccuracy: 0, name: nil) + XCTAssertNotEqual(left, right) + + right = Waypoint(coordinate: CLLocationCoordinate2D(), coordinateAccuracy: nil, name: "") + XCTAssertNotEqual(left, right) + } + + func testTracepointEquality() { + let left = Tracepoint(coordinate: CLLocationCoordinate2D(), countOfAlternatives: 0, name: nil) + XCTAssertEqual(left, left) + + let right = Tracepoint(coordinate: CLLocationCoordinate2D(), countOfAlternatives: 0, name: nil) + XCTAssertEqual(left, right) + + // FIXME: Only Waypoint.==(_:_:) ever gets called: . This will be moot once Tracepoint becomes a struct that doesn’t inherit from Waypoint: . +// right = Tracepoint(coordinate: CLLocationCoordinate2D(latitude: 1, longitude: 1), countOfAlternatives: 0, name: nil) +// XCTAssertNotEqual(left, right) +// +// right = Tracepoint(coordinate: CLLocationCoordinate2D(), countOfAlternatives: 1, name: nil) +// XCTAssertNotEqual(left, right) +// +// right = Tracepoint(coordinate: CLLocationCoordinate2D(), countOfAlternatives: 0, name: "") +// XCTAssertNotEqual(left, right) + } } From bc170a0caba67521c6f13d1da4409b582d4b4fea Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Minh=20Nguye=CC=82=CC=83n?= Date: Sat, 7 Dec 2019 12:20:22 -0800 Subject: [PATCH 83/89] Removed workarounds for optional enums in Objective-C --- CHANGELOG.md | 2 + Sources/MapboxDirections/RouteStep.swift | 50 ++++++------------------ 2 files changed, 14 insertions(+), 38 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 352df3b46..80e9e7646 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -25,6 +25,8 @@ * Replaced the `MBDefaultWalkingSpeed`, `MBMinimumWalkingSpeed`, and `MBMaximumWalkingSpeed` constants with `CLLocationSpeed.normalWalking`, `CLLocationSpeed.minimumWalking`, and `CLLocationSpeed.maximumWalking`, respectively. * Replaced the `Route.coordinates` property with `Route.shape` and the `RouteStep.coordinates` property with `RouteStep.shape`. The `Route.coordinateCount` and `RouteStep.coordinateCount` properties have been removed, but you can use the `LineString.coordinates` property to get the array of `CLLocationCoordinate2D`s. ([#382](https://github.com/mapbox/MapboxDirections.swift/pull/382)) * `RouteLeg.source` and `RouteLeg.destination` are now optional. They can be `nil` when the `RouteLeg` object is decoded individually from JSON. ([#382](https://github.com/mapbox/MapboxDirections.swift/pull/382)) +* Removed `TransportType.none`, `ManeuverType.none`, and `ManeuverDirection.none`. Unrecognized `TransportType` and `ManeuverDirection` values now raise decoding errors. ([#382](https://github.com/mapbox/MapboxDirections.swift/pull/382)) +* `RouteStep.maneuverType` is now optional. ([#382](https://github.com/mapbox/MapboxDirections.swift/pull/382)) * Renamed the `Tracepoint.alternateCount` property to `Tracepoint.countOfAlternatives`. ([#382](https://github.com/mapbox/MapboxDirections.swift/pull/382)) ## v0.30.0 diff --git a/Sources/MapboxDirections/RouteStep.swift b/Sources/MapboxDirections/RouteStep.swift index eb93b6e17..1be5547cf 100644 --- a/Sources/MapboxDirections/RouteStep.swift +++ b/Sources/MapboxDirections/RouteStep.swift @@ -9,13 +9,6 @@ import struct Turf.LineString public enum TransportType: String, Codable { // Possible transport types when the `profileIdentifier` is `DirectionsProfileIdentifier.automobile` or `DirectionsProfileIdentifier.automobileAvoidingTraffic` - /** - The step does not have a particular transport type associated with it. - - This transport type is used as a workaround for bridging to Objective-C which does not support nullable enumeration-typed values. - */ - case none - /** The route requires the user to drive or ride a car, truck, or motorcycle. @@ -76,13 +69,6 @@ public enum TransportType: String, Codable { To avoid a complex series of if-else-if statements or switch statements, use pattern matching with a single switch statement on a tuple that consists of the maneuver type and maneuver direction. */ public enum ManeuverType: String, Codable { - /** - The step does not have a particular maneuver type associated with it. - - This maneuver type is used as a workaround for bridging to Objective-C which does not support nullable enumeration-typed values. - */ - case none - /** The step requires the user to depart from a waypoint. @@ -205,19 +191,16 @@ public enum ManeuverType: String, Codable { The distance and expected travel time for this step are set to zero, indicating that the route or route leg is complete. The maneuver direction indicates the side of the road on which the waypoint can be found (or whether it is straight ahead). */ case arrive + + // Unrecognized maneuver types are interpreted as turns. + // http://project-osrm.org/docs/v5.5.1/api/#stepmaneuver-object + static let `default` = ManeuverType.turn } /** A `ManeuverDirection` clarifies a `ManeuverType` with directional information. The exact meaning of the maneuver direction for a given step depends on the step’s maneuver type; see the `ManeuverType` documentation for details. */ public enum ManeuverDirection: String, Codable { - /** - The step does not have a particular maneuver direction associated with it. - - This maneuver direction is used as a workaround for bridging to Objective-C which does not support nullable enumeration-typed values. - */ - case none - /** The maneuver requires a sharp turn to the right. */ @@ -408,10 +391,7 @@ open class RouteStep: Codable { try container.encodeIfPresent(exitIndex, forKey: .exitIndex) try container.encode(distance.rounded(to: 1e1), forKey: .distance) try container.encode(expectedTravelTime.rounded(to: 1e1), forKey: .expectedTravelTime) - - if transportType != .none { - try container.encode(transportType, forKey: .transportType) - } + try container.encode(transportType, forKey: .transportType) let isRound = maneuverType == .takeRotary || maneuverType == .takeRoundabout let road = Road(names: isRound ? exitNames : names, @@ -439,8 +419,8 @@ open class RouteStep: Codable { var maneuver = container.nestedContainer(keyedBy: ManeuverCodingKeys.self, forKey: .maneuver) try maneuver.encode(instructions, forKey: .instruction) - try maneuver.encodeIfPresent(maneuverType, forKey: .type) - try maneuver.encodeIfPresent(maneuverDirection, forKey: .direction) + try maneuver.encode(maneuverType, forKey: .type) + try maneuver.encode(maneuverDirection, forKey: .direction) try maneuver.encodeIfPresent(maneuverLocation, forKey: .location) try maneuver.encodeIfPresent(initialHeading, forKey: .initialHeading) try maneuver.encodeIfPresent(finalHeading, forKey: .finalHeading) @@ -451,8 +431,8 @@ open class RouteStep: Codable { let maneuver = try container.nestedContainer(keyedBy: ManeuverCodingKeys.self, forKey: .maneuver) maneuverLocation = try maneuver.decode(CLLocationCoordinate2D.self, forKey: .location) - maneuverType = try maneuver.decodeIfPresent(ManeuverType.self, forKey: .type) ?? .none - maneuverDirection = try maneuver.decodeIfPresent(ManeuverDirection.self, forKey: .direction) ?? .none + maneuverType = (try? maneuver.decode(ManeuverType.self, forKey: .type)) ?? .default + maneuverDirection = try maneuver.decodeIfPresent(ManeuverDirection.self, forKey: .direction) initialHeading = try maneuver.decodeIfPresent(CLLocationDirection.self, forKey: .initialHeading) finalHeading = try maneuver.decodeIfPresent(CLLocationDirection.self, forKey: .finalHeading) @@ -465,14 +445,8 @@ open class RouteStep: Codable { if let instruction = try? maneuver.decode(String.self, forKey: .instruction) { instructions = instruction - } else if maneuverType != .none, maneuverDirection != .none { - instructions = "\(maneuverType) \(maneuverDirection)" - } else if maneuverType != .none { - instructions = String(describing: maneuverType) - } else if maneuverDirection != .none { - instructions = String(describing: maneuverDirection) } else { - instructions = "" + instructions = "\(maneuverType) \(maneuverDirection?.rawValue ?? "")" } drivingSide = try container.decode(DrivingSide.self, forKey: .drivingSide) @@ -491,7 +465,7 @@ open class RouteStep: Codable { distance = try container.decode(CLLocationDirection.self, forKey: .distance) expectedTravelTime = try container.decode(TimeInterval.self, forKey: .expectedTravelTime) - transportType = try container.decodeIfPresent(TransportType.self, forKey: .transportType) ?? .none + transportType = try container.decode(TransportType.self, forKey: .transportType) intersections = try container.decodeIfPresent([Intersection].self, forKey: .intersections) let road = try Road(from: decoder) @@ -556,7 +530,7 @@ open class RouteStep: Codable { /** Additional directional information to clarify the maneuver type. */ - public let maneuverDirection: ManeuverDirection + public let maneuverDirection: ManeuverDirection? /** Indicates what side of a bidirectional road the driver must be driving on. Also referred to as the rule of the road. From aaccfcc18712737d9bc13a0e76e29a8b51025ae0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Minh=20Nguye=CC=82=CC=83n?= Date: Mon, 9 Dec 2019 14:59:01 -0800 Subject: [PATCH 84/89] Avoid tracking code coverage within tests themselves --- codecov.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/codecov.yml b/codecov.yml index 19a9a199d..cd1c4f779 100644 --- a/codecov.yml +++ b/codecov.yml @@ -1,6 +1,6 @@ ignore: - "Directions Example" - - "MapboxDirectionsTests" + - "Tests" coverage: status: From ff7c2f78475a1d778242749bf136f936bb3a6487 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Minh=20Nguy=E1=BB=85n?= Date: Mon, 9 Dec 2019 15:36:18 -0800 Subject: [PATCH 85/89] Revert "Avoid tracking code coverage within tests themselves" This reverts commit aaccfcc18712737d9bc13a0e76e29a8b51025ae0. --- codecov.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/codecov.yml b/codecov.yml index cd1c4f779..19a9a199d 100644 --- a/codecov.yml +++ b/codecov.yml @@ -1,6 +1,6 @@ ignore: - "Directions Example" - - "Tests" + - "MapboxDirectionsTests" coverage: status: From 91fdba30de6b2098ce558b9a658cbd5d44e1d719 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Minh=20Nguye=CC=82=CC=83n?= Date: Mon, 9 Dec 2019 15:36:37 -0800 Subject: [PATCH 86/89] Test errors --- MapboxDirections.xcodeproj/project.pbxproj | 8 ++ .../DirectionsErrorTests.swift | 87 +++++++++++++++++++ 2 files changed, 95 insertions(+) create mode 100644 Tests/MapboxDirectionsTests/DirectionsErrorTests.swift diff --git a/MapboxDirections.xcodeproj/project.pbxproj b/MapboxDirections.xcodeproj/project.pbxproj index b764db637..311547c3e 100644 --- a/MapboxDirections.xcodeproj/project.pbxproj +++ b/MapboxDirections.xcodeproj/project.pbxproj @@ -238,6 +238,9 @@ DACCFCA92225359600110FC9 /* v5_driving_oldenburg_polyline.json in Resources */ = {isa = PBXBuildFile; fileRef = DACCFCA82225359500110FC9 /* v5_driving_oldenburg_polyline.json */; }; DACCFCAA2225359600110FC9 /* v5_driving_oldenburg_polyline.json in Resources */ = {isa = PBXBuildFile; fileRef = DACCFCA82225359500110FC9 /* v5_driving_oldenburg_polyline.json */; }; DACCFCAB2225359600110FC9 /* v5_driving_oldenburg_polyline.json in Resources */ = {isa = PBXBuildFile; fileRef = DACCFCA82225359500110FC9 /* v5_driving_oldenburg_polyline.json */; }; + DAD06E35239F0B19001A917D /* DirectionsErrorTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = DAD06E34239F0B19001A917D /* DirectionsErrorTests.swift */; }; + DAD06E36239F0B19001A917D /* DirectionsErrorTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = DAD06E34239F0B19001A917D /* DirectionsErrorTests.swift */; }; + DAD06E37239F0B19001A917D /* DirectionsErrorTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = DAD06E34239F0B19001A917D /* DirectionsErrorTests.swift */; }; DADD27B81E5AAAD800D31FAD /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = DADD27B71E5AAAD800D31FAD /* AppDelegate.swift */; }; DADD27BA1E5AAAD800D31FAD /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = DADD27B91E5AAAD800D31FAD /* ViewController.swift */; }; DADD27BF1E5AAAD800D31FAD /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = DADD27BE1E5AAAD800D31FAD /* Assets.xcassets */; }; @@ -386,6 +389,7 @@ DAC05F191CFC077C00FA0071 /* RouteLeg.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RouteLeg.swift; sourceTree = ""; }; DAC05F1B1CFC1E5300FA0071 /* v5_driving_dc_polyline.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = v5_driving_dc_polyline.json; sourceTree = ""; }; DACCFCA82225359500110FC9 /* v5_driving_oldenburg_polyline.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = v5_driving_oldenburg_polyline.json; sourceTree = ""; }; + DAD06E34239F0B19001A917D /* DirectionsErrorTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DirectionsErrorTests.swift; sourceTree = ""; }; DADD27B51E5AAAD800D31FAD /* Example.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Example.app; sourceTree = BUILT_PRODUCTS_DIR; }; DADD27B71E5AAAD800D31FAD /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; DADD27B91E5AAAD800D31FAD /* ViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ViewController.swift; sourceTree = ""; }; @@ -615,6 +619,7 @@ children = ( DA6C9DAD1CAEC93800094FBC /* Fixtures */, C5247D701E818A24004B6154 /* AnnotationTests.swift */, + DAD06E34239F0B19001A917D /* DirectionsErrorTests.swift */, DA1A110A1D01045E009F82FA /* DirectionsTests.swift */, DA6C9DB11CAECA0E00094FBC /* Fixture.swift */, DAABF7912395AE9800CEEB61 /* GeoJSONTests.swift */, @@ -1187,6 +1192,7 @@ 35DBF015217E199E0009D2AE /* OfflineDirectionsTests.swift in Sources */, C53A02291E92C27A009837BD /* AnnotationTests.swift in Sources */, DA688B3F21B89ECD00C9BB25 /* VisualInstructionComponentTests.swift in Sources */, + DAD06E36239F0B19001A917D /* DirectionsErrorTests.swift in Sources */, C596663A2048AECD00C45CE5 /* RoutableMatchTests.swift in Sources */, DA1A10CD1D00F972009F82FA /* V5Tests.swift in Sources */, DAE33A1C1F215DF600C06039 /* IntersectionTests.swift in Sources */, @@ -1254,6 +1260,7 @@ 35DBF016217E199E0009D2AE /* OfflineDirectionsTests.swift in Sources */, C53A022A1E92C27B009837BD /* AnnotationTests.swift in Sources */, DA688B4021B89ECD00C9BB25 /* VisualInstructionComponentTests.swift in Sources */, + DAD06E37239F0B19001A917D /* DirectionsErrorTests.swift in Sources */, C596663B2048AECE00C45CE5 /* RoutableMatchTests.swift in Sources */, DA1A10F41D010251009F82FA /* V5Tests.swift in Sources */, DAE33A1D1F215DF600C06039 /* IntersectionTests.swift in Sources */, @@ -1364,6 +1371,7 @@ 35DBF014217E199E0009D2AE /* OfflineDirectionsTests.swift in Sources */, C5247D711E818A24004B6154 /* AnnotationTests.swift in Sources */, DA688B3E21B89ECD00C9BB25 /* VisualInstructionComponentTests.swift in Sources */, + DAD06E35239F0B19001A917D /* DirectionsErrorTests.swift in Sources */, C59666392048A20E00C45CE5 /* RoutableMatchTests.swift in Sources */, DA6C9DAC1CAEC72800094FBC /* V5Tests.swift in Sources */, DAE33A1B1F215DF600C06039 /* IntersectionTests.swift in Sources */, diff --git a/Tests/MapboxDirectionsTests/DirectionsErrorTests.swift b/Tests/MapboxDirectionsTests/DirectionsErrorTests.swift new file mode 100644 index 000000000..7938483aa --- /dev/null +++ b/Tests/MapboxDirectionsTests/DirectionsErrorTests.swift @@ -0,0 +1,87 @@ +import XCTest +@testable import MapboxDirections + +class DirectionsErrorTests: XCTestCase { + func testFailureReasons() { + XCTAssertNotNil(DirectionsError.noData.failureReason) + XCTAssertNotNil(DirectionsError.invalidResponse.failureReason) + XCTAssertNotNil(DirectionsError.unableToRoute.failureReason) + XCTAssertNotNil(DirectionsError.noMatches.failureReason) + XCTAssertNotNil(DirectionsError.tooManyCoordinates.failureReason) + XCTAssertNotNil(DirectionsError.unableToLocate.failureReason) + XCTAssertNotNil(DirectionsError.profileNotFound.failureReason) + XCTAssertNotNil(DirectionsError.requestTooLarge.failureReason) + XCTAssertEqual(DirectionsError.invalidInput(message: nil).failureReason, nil) + XCTAssertEqual(DirectionsError.invalidInput(message: "").failureReason, "") + XCTAssertNotNil(DirectionsError.rateLimited(rateLimitInterval: nil, rateLimit: nil, resetTime: nil).failureReason) + XCTAssertNotNil(DirectionsError.unknown(response: nil, underlying: nil, code: nil, message: nil).failureReason) + } + + func testRecoverySuggestions() { + XCTAssertNil(DirectionsError.noData.recoverySuggestion) + XCTAssertNil(DirectionsError.invalidResponse.recoverySuggestion) + XCTAssertNotNil(DirectionsError.unableToRoute.recoverySuggestion) + XCTAssertNotNil(DirectionsError.noMatches.recoverySuggestion) + XCTAssertNotNil(DirectionsError.tooManyCoordinates.recoverySuggestion) + XCTAssertNotNil(DirectionsError.unableToLocate.recoverySuggestion) + XCTAssertNotNil(DirectionsError.profileNotFound.recoverySuggestion) + XCTAssertNotNil(DirectionsError.requestTooLarge.recoverySuggestion) + XCTAssertNil(DirectionsError.invalidInput(message: nil).recoverySuggestion) + XCTAssertNil(DirectionsError.rateLimited(rateLimitInterval: nil, rateLimit: nil, resetTime: nil).recoverySuggestion) + XCTAssertNotNil(DirectionsError.rateLimited(rateLimitInterval: nil, rateLimit: nil, resetTime: .distantFuture).recoverySuggestion) + XCTAssertNil(DirectionsError.unknown(response: nil, underlying: nil, code: nil, message: nil).recoverySuggestion) + + let underlyingError = NSError(domain: "com.example", code: 02134, userInfo: [NSLocalizedRecoverySuggestionErrorKey: "Try harder"]) + XCTAssertEqual(DirectionsError.unknown(response: nil, underlying: underlyingError, code: nil, message: nil).recoverySuggestion, "Try harder") + } + + func testEquality() { + XCTAssertEqual(DirectionsError.noData, .noData) + + XCTAssertEqual(DirectionsError.invalidInput(message: nil), .invalidInput(message: nil)) + XCTAssertNotEqual(DirectionsError.invalidInput(message: nil), .invalidInput(message: "")) + + XCTAssertEqual(DirectionsError.invalidResponse, .invalidResponse) + XCTAssertEqual(DirectionsError.unableToRoute, .unableToRoute) + XCTAssertEqual(DirectionsError.noMatches, .noMatches) + XCTAssertEqual(DirectionsError.tooManyCoordinates, .tooManyCoordinates) + XCTAssertEqual(DirectionsError.unableToLocate, .unableToLocate) + XCTAssertEqual(DirectionsError.profileNotFound, .profileNotFound) + XCTAssertEqual(DirectionsError.requestTooLarge, .requestTooLarge) + + XCTAssertEqual(DirectionsError.rateLimited(rateLimitInterval: nil, rateLimit: nil, resetTime: nil), + .rateLimited(rateLimitInterval: nil, rateLimit: nil, resetTime: nil)) + XCTAssertNotEqual(DirectionsError.rateLimited(rateLimitInterval: nil, rateLimit: nil, resetTime: nil), + .rateLimited(rateLimitInterval: 0, rateLimit: nil, resetTime: nil)) + XCTAssertNotEqual(DirectionsError.rateLimited(rateLimitInterval: nil, rateLimit: nil, resetTime: nil), + .rateLimited(rateLimitInterval: nil, rateLimit: 0, resetTime: nil)) + XCTAssertNotEqual(DirectionsError.rateLimited(rateLimitInterval: nil, rateLimit: nil, resetTime: nil), + .rateLimited(rateLimitInterval: nil, rateLimit: nil, resetTime: .distantPast)) + + enum BogusError: Error { + case bug + } + + XCTAssertEqual(DirectionsError.unknown(response: nil, underlying: nil, code: nil, message: nil), + .unknown(response: nil, underlying: nil, code: nil, message: nil)) + XCTAssertNotEqual(DirectionsError.unknown(response: nil, underlying: nil, code: nil, message: nil), + .unknown(response: URLResponse(), underlying: nil, code: nil, message: nil)) + XCTAssertNotEqual(DirectionsError.unknown(response: nil, underlying: nil, code: nil, message: nil), + .unknown(response: nil, underlying: BogusError.bug, code: nil, message: nil)) + XCTAssertNotEqual(DirectionsError.unknown(response: nil, underlying: nil, code: nil, message: nil), + .unknown(response: nil, underlying: nil, code: "", message: nil)) + XCTAssertNotEqual(DirectionsError.unknown(response: nil, underlying: nil, code: nil, message: nil), + .unknown(response: nil, underlying: nil, code: nil, message: "")) + + XCTAssertNotEqual(DirectionsError.noData, .invalidResponse) + XCTAssertNotEqual(DirectionsError.noData, .unableToRoute) + XCTAssertNotEqual(DirectionsError.noData, .noMatches) + XCTAssertNotEqual(DirectionsError.noData, .tooManyCoordinates) + XCTAssertNotEqual(DirectionsError.noData, .unableToLocate) + XCTAssertNotEqual(DirectionsError.noData, .profileNotFound) + XCTAssertNotEqual(DirectionsError.noData, .requestTooLarge) + XCTAssertNotEqual(DirectionsError.noData, .invalidInput(message: nil)) + XCTAssertNotEqual(DirectionsError.noData, .rateLimited(rateLimitInterval: nil, rateLimit: nil, resetTime: nil)) + XCTAssertNotEqual(DirectionsError.noData, .unknown(response: nil, underlying: nil, code: nil, message: "")) + } +} From 373a6e06c113daf31a2e796e9477fb08ff83b9b2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Minh=20Nguye=CC=82=CC=83n?= Date: Tue, 10 Dec 2019 09:08:01 -0800 Subject: [PATCH 87/89] Restored CustomStringConvertible conformance --- Sources/MapboxDirections/CoordinateBounds.swift | 10 ++++++---- Sources/MapboxDirections/DirectionsResult.swift | 6 ++++++ Sources/MapboxDirections/RouteLeg.swift | 6 ++++++ Sources/MapboxDirections/Waypoint.swift | 10 ++++++---- 4 files changed, 24 insertions(+), 8 deletions(-) diff --git a/Sources/MapboxDirections/CoordinateBounds.swift b/Sources/MapboxDirections/CoordinateBounds.swift index d5cc7f9ea..be85f8bb7 100644 --- a/Sources/MapboxDirections/CoordinateBounds.swift +++ b/Sources/MapboxDirections/CoordinateBounds.swift @@ -50,10 +50,6 @@ public struct CoordinateBounds { self.init(southWest: southWest, northEast: northEast) } - - public var description: String { - return "\(southWest.longitude),\(southWest.latitude);\(northEast.longitude),\(northEast.latitude)" - } } extension CoordinateBounds: Codable { @@ -67,3 +63,9 @@ extension CoordinateBounds: Codable { northEast = try container.decode(CLLocationCoordinate2D.self, forKey: .northEast) } } + +extension CoordinateBounds: CustomStringConvertible { + public var description: String { + return "\(southWest.longitude),\(southWest.latitude);\(northEast.longitude),\(northEast.latitude)" + } +} diff --git a/Sources/MapboxDirections/DirectionsResult.swift b/Sources/MapboxDirections/DirectionsResult.swift index a11b0e3c1..b91b24b7a 100644 --- a/Sources/MapboxDirections/DirectionsResult.swift +++ b/Sources/MapboxDirections/DirectionsResult.swift @@ -196,3 +196,9 @@ open class DirectionsResult: Codable { */ open var responseEndDate: Date? } + +extension DirectionsResult: CustomStringConvertible { + public var description: String { + return legs.map { $0.name }.joined(separator: " – ") + } +} diff --git a/Sources/MapboxDirections/RouteLeg.swift b/Sources/MapboxDirections/RouteLeg.swift index 761bccda3..675647cca 100644 --- a/Sources/MapboxDirections/RouteLeg.swift +++ b/Sources/MapboxDirections/RouteLeg.swift @@ -196,3 +196,9 @@ extension RouteLeg: Equatable { lhs.profileIdentifier == rhs.profileIdentifier } } + +extension RouteLeg: CustomStringConvertible { + public var description: String { + return name + } +} diff --git a/Sources/MapboxDirections/Waypoint.swift b/Sources/MapboxDirections/Waypoint.swift index f1f1e08dd..a5c94f4e0 100644 --- a/Sources/MapboxDirections/Waypoint.swift +++ b/Sources/MapboxDirections/Waypoint.swift @@ -190,10 +190,6 @@ public class Waypoint: Codable { This property corresponds to the [`approaches`](https://docs.mapbox.com/api/navigation/#retrieve-directions) query parameter in the Mapbox Directions and Map Matching APIs. */ public var separatesLegs: Bool = true - - public var description: String { - return name ?? "" - } } extension Waypoint: Equatable { @@ -201,3 +197,9 @@ extension Waypoint: Equatable { return lhs.coordinate == rhs.coordinate && lhs.name == rhs.name && lhs.coordinateAccuracy == rhs.coordinateAccuracy } } + +extension Waypoint: CustomStringConvertible { + public var description: String { + return name ?? "" + } +} From 96006779e9f057fc2e2273ec73ed02ea46140f3e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Minh=20Nguye=CC=82=CC=83n?= Date: Tue, 10 Dec 2019 14:30:28 -0800 Subject: [PATCH 88/89] Restored custom Quick Look previews --- MapboxDirections.xcodeproj/project.pbxproj | 10 ++++ .../MapboxDirections/DirectionsResult.swift | 9 ++++ .../MapboxDirections/Extensions/Codable.swift | 11 +++- Sources/MapboxDirections/QuickLook.swift | 51 +++++++++++++++++++ Sources/MapboxDirections/RouteLeg.swift | 11 ++++ Sources/MapboxDirections/RouteStep.swift | 15 ++++++ Sources/MapboxDirections/Waypoint.swift | 6 +++ 7 files changed, 112 insertions(+), 1 deletion(-) create mode 100644 Sources/MapboxDirections/QuickLook.swift diff --git a/MapboxDirections.xcodeproj/project.pbxproj b/MapboxDirections.xcodeproj/project.pbxproj index 311547c3e..8a0b5e22e 100644 --- a/MapboxDirections.xcodeproj/project.pbxproj +++ b/MapboxDirections.xcodeproj/project.pbxproj @@ -241,6 +241,10 @@ DAD06E35239F0B19001A917D /* DirectionsErrorTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = DAD06E34239F0B19001A917D /* DirectionsErrorTests.swift */; }; DAD06E36239F0B19001A917D /* DirectionsErrorTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = DAD06E34239F0B19001A917D /* DirectionsErrorTests.swift */; }; DAD06E37239F0B19001A917D /* DirectionsErrorTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = DAD06E34239F0B19001A917D /* DirectionsErrorTests.swift */; }; + DAD06E3C23A00A01001A917D /* QuickLook.swift in Sources */ = {isa = PBXBuildFile; fileRef = DAD06E3823A008EB001A917D /* QuickLook.swift */; }; + DAD06E3D23A00A01001A917D /* QuickLook.swift in Sources */ = {isa = PBXBuildFile; fileRef = DAD06E3823A008EB001A917D /* QuickLook.swift */; }; + DAD06E3E23A00A02001A917D /* QuickLook.swift in Sources */ = {isa = PBXBuildFile; fileRef = DAD06E3823A008EB001A917D /* QuickLook.swift */; }; + DAD06E3F23A00A02001A917D /* QuickLook.swift in Sources */ = {isa = PBXBuildFile; fileRef = DAD06E3823A008EB001A917D /* QuickLook.swift */; }; DADD27B81E5AAAD800D31FAD /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = DADD27B71E5AAAD800D31FAD /* AppDelegate.swift */; }; DADD27BA1E5AAAD800D31FAD /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = DADD27B91E5AAAD800D31FAD /* ViewController.swift */; }; DADD27BF1E5AAAD800D31FAD /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = DADD27BE1E5AAAD800D31FAD /* Assets.xcassets */; }; @@ -390,6 +394,7 @@ DAC05F1B1CFC1E5300FA0071 /* v5_driving_dc_polyline.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = v5_driving_dc_polyline.json; sourceTree = ""; }; DACCFCA82225359500110FC9 /* v5_driving_oldenburg_polyline.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = v5_driving_oldenburg_polyline.json; sourceTree = ""; }; DAD06E34239F0B19001A917D /* DirectionsErrorTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DirectionsErrorTests.swift; sourceTree = ""; }; + DAD06E3823A008EB001A917D /* QuickLook.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = QuickLook.swift; sourceTree = ""; }; DADD27B51E5AAAD800D31FAD /* Example.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Example.app; sourceTree = BUILT_PRODUCTS_DIR; }; DADD27B71E5AAAD800D31FAD /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; DADD27B91E5AAAD800D31FAD /* ViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ViewController.swift; sourceTree = ""; }; @@ -598,6 +603,7 @@ DAA76D671DD127CB0015EC78 /* LaneIndication.swift */, DA6C9D8A1CAE442B00094FBC /* MapboxDirections.h */, 35828C9D217A003F00ED546E /* OfflineDirections.swift */, + DAD06E3823A008EB001A917D /* QuickLook.swift */, C59426061F1EA6C400C8E59C /* RoadClasses.swift */, DAC05F171CFC075300FA0071 /* Route.swift */, DAC05F191CFC077C00FA0071 /* RouteLeg.swift */, @@ -1163,6 +1169,7 @@ C5DAACA220195AB2001F9261 /* MatchOptions.swift in Sources */, DA1A10CC1D00F969009F82FA /* Waypoint.swift in Sources */, 35DBF006217DF0D90009D2AE /* CoordinateBounds.swift in Sources */, + DAD06E3D23A00A01001A917D /* QuickLook.swift in Sources */, DA1A10CA1D00F969009F82FA /* RouteOptions.swift in Sources */, DA1A10C81D00F969009F82FA /* Route.swift in Sources */, 431E93D023466D7500A71B44 /* Codable.swift in Sources */, @@ -1231,6 +1238,7 @@ C5DAACA320195AB2001F9261 /* MatchOptions.swift in Sources */, DA1A10F21D010247009F82FA /* Waypoint.swift in Sources */, 35DBF007217DF0D90009D2AE /* CoordinateBounds.swift in Sources */, + DAD06E3E23A00A02001A917D /* QuickLook.swift in Sources */, DA1A10F01D010247009F82FA /* RouteOptions.swift in Sources */, DA1A10EE1D010247009F82FA /* Route.swift in Sources */, 431E93D123466D7600A71B44 /* Codable.swift in Sources */, @@ -1299,6 +1307,7 @@ C5DAACA420195AB3001F9261 /* MatchOptions.swift in Sources */, DA1A11091D0103A3009F82FA /* Waypoint.swift in Sources */, 35DBF008217DF0D90009D2AE /* CoordinateBounds.swift in Sources */, + DAD06E3F23A00A02001A917D /* QuickLook.swift in Sources */, DA1A11071D0103A3009F82FA /* RouteOptions.swift in Sources */, DA1A11051D0103A3009F82FA /* Route.swift in Sources */, 431E93D223466D7700A71B44 /* Codable.swift in Sources */, @@ -1342,6 +1351,7 @@ DAC05F181CFC075300FA0071 /* Route.swift in Sources */, C59094BF203B800300EB2417 /* DirectionsOptions.swift in Sources */, 35DBF005217DF0D90009D2AE /* CoordinateBounds.swift in Sources */, + DAD06E3C23A00A01001A917D /* QuickLook.swift in Sources */, C5434B8C200695A50069E887 /* MatchOptions.swift in Sources */, DAA76D681DD127CB0015EC78 /* LaneIndication.swift in Sources */, 431E93CF23466D7400A71B44 /* Codable.swift in Sources */, diff --git a/Sources/MapboxDirections/DirectionsResult.swift b/Sources/MapboxDirections/DirectionsResult.swift index b91b24b7a..f5db27075 100644 --- a/Sources/MapboxDirections/DirectionsResult.swift +++ b/Sources/MapboxDirections/DirectionsResult.swift @@ -202,3 +202,12 @@ extension DirectionsResult: CustomStringConvertible { return legs.map { $0.name }.joined(separator: " – ") } } + +extension DirectionsResult: CustomQuickLookConvertible { + func debugQuickLookObject() -> Any? { + guard let shape = shape else { + return nil + } + return debugQuickLookURL(illustrating: shape, profileIdentifier: directionsOptions.profileIdentifier) + } +} diff --git a/Sources/MapboxDirections/Extensions/Codable.swift b/Sources/MapboxDirections/Extensions/Codable.swift index 69a96253b..16cd0814e 100644 --- a/Sources/MapboxDirections/Extensions/Codable.swift +++ b/Sources/MapboxDirections/Extensions/Codable.swift @@ -2,6 +2,15 @@ import Foundation import Polyline import struct Turf.LineString +extension LineString { + /** + Returns a string representation of the line string in [Polyline Algorithm Format](https://developers.google.com/maps/documentation/utilities/polylinealgorithm). + */ + func polylineEncodedString(precision: Double = 1e5) -> String { + return encodeCoordinates(coordinates, precision: precision) + } +} + enum PolyLineString { case lineString(_ lineString: LineString) case polyline(_ encodedPolyline: String, precision: Double) @@ -12,7 +21,7 @@ enum PolyLineString { self = .lineString(lineString) case .polyline, .polyline6: let precision = shapeFormat == .polyline6 ? 1e6 : 1e5 - let encodedPolyline = encodeCoordinates(lineString.coordinates, precision: precision) + let encodedPolyline = lineString.polylineEncodedString(precision: precision) self = .polyline(encodedPolyline, precision: precision) } } diff --git a/Sources/MapboxDirections/QuickLook.swift b/Sources/MapboxDirections/QuickLook.swift new file mode 100644 index 000000000..60a0fd278 --- /dev/null +++ b/Sources/MapboxDirections/QuickLook.swift @@ -0,0 +1,51 @@ +import Polyline +import struct Turf.LineString + +/** + A type with a customized Quick Look representation in the Xcode debugger. + */ +protocol CustomQuickLookConvertible { + /** + Returns a [Quick Look–compatible](https://developer.apple.com/library/archive/documentation/IDEs/Conceptual/CustomClassDisplay_in_QuickLook/CH02-std_objects_support/CH02-std_objects_support.html#//apple_ref/doc/uid/TP40014001-CH3-SW19) representation for display in the Xcode debugger. + */ + func debugQuickLookObject() -> Any? +} + +/** + Returns a URL to an image representation of the given coordinates via the [Mapbox Static Images API](https://docs.mapbox.com/api/maps/#static-images). + */ +func debugQuickLookURL(illustrating shape: LineString, profileIdentifier: DirectionsProfileIdentifier = .automobile) -> URL? { + guard let accessToken = defaultAccessToken else { + return nil + } + + let styleIdentifier: String + let identifierOfLayerAboveOverlays: String + switch profileIdentifier { + case .automobileAvoidingTraffic: + styleIdentifier = "mapbox/navigation-preview-day-v4" + identifierOfLayerAboveOverlays = "waterway-label" + case .cycling, .walking: + styleIdentifier = "mapbox/outdoors-v11" + identifierOfLayerAboveOverlays = "contour-label" + default: + styleIdentifier = "mapbox/streets-v11" + identifierOfLayerAboveOverlays = "building-number-label" + } + let styleIdentifierComponent = "/\(styleIdentifier)/static" + + var allowedCharacterSet = CharacterSet.urlPathAllowed + allowedCharacterSet.remove(charactersIn: "/)") + let encodedPolyline = shape.polylineEncodedString(precision: 1e5).addingPercentEncoding(withAllowedCharacters: allowedCharacterSet)! + let overlaysComponent = "/path-10+3802DA-0.6(\(encodedPolyline))" + + let path = "/styles/v1\(styleIdentifierComponent)\(overlaysComponent)/auto/680x360@2x" + + var components = URLComponents() + components.queryItems = [ + URLQueryItem(name: "before_layer", value: identifierOfLayerAboveOverlays), + URLQueryItem(name: "access_token", value: accessToken), + ] + + return URL(string: "https://api.mapbox.com\(path)?\(components.percentEncodedQuery!)") +} diff --git a/Sources/MapboxDirections/RouteLeg.swift b/Sources/MapboxDirections/RouteLeg.swift index 675647cca..987793ae5 100644 --- a/Sources/MapboxDirections/RouteLeg.swift +++ b/Sources/MapboxDirections/RouteLeg.swift @@ -1,6 +1,7 @@ import Foundation import CoreLocation import Polyline +import struct Turf.LineString /** A `RouteLeg` object defines a single leg of a route between two waypoints. If the overall route has only two waypoints, it has a single `RouteLeg` object that covers the entire route. The route leg object includes information about the leg, such as its name, distance, and expected travel time. Depending on the criteria used to calculate the route, the route leg object may also include detailed turn-by-turn instructions. @@ -202,3 +203,13 @@ extension RouteLeg: CustomStringConvertible { return name } } + +extension RouteLeg: CustomQuickLookConvertible { + func debugQuickLookObject() -> Any? { + let coordinates = steps.reduce([], { $0 + ($1.shape?.coordinates ?? []) }) + guard !coordinates.isEmpty else { + return nil + } + return debugQuickLookURL(illustrating: LineString(coordinates)) + } +} diff --git a/Sources/MapboxDirections/RouteStep.swift b/Sources/MapboxDirections/RouteStep.swift index 1be5547cf..cb0a78fef 100644 --- a/Sources/MapboxDirections/RouteStep.swift +++ b/Sources/MapboxDirections/RouteStep.swift @@ -707,3 +707,18 @@ extension RouteStep: Equatable { lhs.shape == rhs.shape } } + +extension RouteStep: CustomStringConvertible { + public var description: String { + return instructions + } +} + +extension RouteStep: CustomQuickLookConvertible { + func debugQuickLookObject() -> Any? { + guard let shape = shape else { + return nil + } + return debugQuickLookURL(illustrating: shape) + } +} diff --git a/Sources/MapboxDirections/Waypoint.swift b/Sources/MapboxDirections/Waypoint.swift index a5c94f4e0..53bc38cbc 100644 --- a/Sources/MapboxDirections/Waypoint.swift +++ b/Sources/MapboxDirections/Waypoint.swift @@ -203,3 +203,9 @@ extension Waypoint: CustomStringConvertible { return name ?? "" } } + +extension Waypoint: CustomQuickLookConvertible { + func debugQuickLookObject() -> Any? { + return CLLocation(coordinate: coordinate, altitude: 0, horizontalAccuracy: coordinateAccuracy ?? -1, verticalAccuracy: -1, course: heading ?? -1, speed: -1, timestamp: Date()) + } +} From 87f6a968ffc50f2914598ea07d045b13adc42061 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Minh=20Nguye=CC=82=CC=83n?= Date: Tue, 10 Dec 2019 14:32:53 -0800 Subject: [PATCH 89/89] Import Foundation for Linux --- Sources/MapboxDirections/QuickLook.swift | 1 + 1 file changed, 1 insertion(+) diff --git a/Sources/MapboxDirections/QuickLook.swift b/Sources/MapboxDirections/QuickLook.swift index 60a0fd278..a8b08bd3b 100644 --- a/Sources/MapboxDirections/QuickLook.swift +++ b/Sources/MapboxDirections/QuickLook.swift @@ -1,3 +1,4 @@ +import Foundation import Polyline import struct Turf.LineString