diff --git a/build.gradle b/build.gradle
index e959361d65c..dc4d721e8ef 100644
--- a/build.gradle
+++ b/build.gradle
@@ -42,6 +42,7 @@ task testReport(type: TestReport, group: 'Build') {
allprojects {
repositories {
+ mavenLocal()
google()
mavenCentral()
maven {
diff --git a/gradle/dependencies.gradle b/gradle/dependencies.gradle
index a6e1905ae91..062cb86afe8 100644
--- a/gradle/dependencies.gradle
+++ b/gradle/dependencies.gradle
@@ -19,7 +19,7 @@ ext {
version = [
mapboxMapSdk : '10.13.0-rc.1',
- mapboxSdkServices : '6.11.0',
+ mapboxSdkServices : '6.12.0-dzina',
mapboxNavigator : "${mapboxNavigatorVersion}",
mapboxCommonNative : '23.5.0-rc.1',
mapboxCrashMonitor : '2.0.0',
diff --git a/instrumentation-tests/src/androidTest/java/com/mapbox/navigation/instrumentation_tests/core/UpcomingRouteObjectsTest.kt b/instrumentation-tests/src/androidTest/java/com/mapbox/navigation/instrumentation_tests/core/UpcomingRouteObjectsTest.kt
index bd016a90334..bfde8572673 100644
--- a/instrumentation-tests/src/androidTest/java/com/mapbox/navigation/instrumentation_tests/core/UpcomingRouteObjectsTest.kt
+++ b/instrumentation-tests/src/androidTest/java/com/mapbox/navigation/instrumentation_tests/core/UpcomingRouteObjectsTest.kt
@@ -10,6 +10,7 @@ import com.mapbox.navigation.base.extensions.applyDefaultNavigationOptions
import com.mapbox.navigation.base.options.NavigationOptions
import com.mapbox.navigation.base.options.RoutingTilesOptions
import com.mapbox.navigation.base.route.NavigationRoute
+import com.mapbox.navigation.base.route.RouteRefreshOptions
import com.mapbox.navigation.base.route.RouterOrigin
import com.mapbox.navigation.base.trip.model.RouteProgressState
import com.mapbox.navigation.base.trip.model.roadobject.RoadObjectType
@@ -18,6 +19,7 @@ import com.mapbox.navigation.base.trip.model.roadobject.border.CountryBorderCros
import com.mapbox.navigation.base.trip.model.roadobject.ic.Interchange
import com.mapbox.navigation.base.trip.model.roadobject.incident.Incident
import com.mapbox.navigation.base.trip.model.roadobject.jct.Junction
+import com.mapbox.navigation.base.trip.model.roadobject.notification.Notification
import com.mapbox.navigation.base.trip.model.roadobject.railwaycrossing.RailwayCrossing
import com.mapbox.navigation.base.trip.model.roadobject.restrictedarea.RestrictedArea
import com.mapbox.navigation.base.trip.model.roadobject.reststop.RestStop
@@ -28,6 +30,8 @@ import com.mapbox.navigation.core.MapboxNavigation
import com.mapbox.navigation.core.MapboxNavigationProvider
import com.mapbox.navigation.core.directions.session.RoutesExtra
import com.mapbox.navigation.core.internal.extensions.flowLocationMatcherResult
+import com.mapbox.navigation.core.trip.session.LocationMatcherResult
+import com.mapbox.navigation.core.trip.session.LocationObserver
import com.mapbox.navigation.instrumentation_tests.R
import com.mapbox.navigation.instrumentation_tests.utils.http.FailByRequestMockRequestHandler
import com.mapbox.navigation.instrumentation_tests.utils.http.MockDirectionsRefreshHandler
@@ -502,6 +506,162 @@ class UpcomingRouteObjectsTest : BaseCoreNoCleanUpTest() {
checkRoadObjects(expectedObjectsAfterFirstRefresh, updateAfterRefresh.upcomingRoadObjects)
}
+ // TODO up NN when they add unique id
+ @OptIn(ExperimentalPreviewMapboxNavigationAPI::class)
+ @Test
+ fun roadObjectNotificationsTest() = sdkTest {
+ mapboxNavigation = createMapboxNavigation(
+ // only refresh on demand
+ RouteRefreshOptions.Builder().intervalMillis(300000).build()
+ )
+ val coordinates = listOf(
+ Point.fromLngLat(-115.574669, 49.586752),
+ Point.fromLngLat(-115.243927, 49.419375),
+ Point.fromLngLat(-115.333568, 49.444112),
+ )
+ mockWebServerRule.requestHandlers.clear()
+ val routeHandler = MockDirectionsRequestHandler(
+ "driving-traffic",
+ readRawFileText(context, R.raw.route_with_notifications),
+ coordinates,
+ relaxedExpectedCoordinates = true
+ )
+ mockWebServerRule.requestHandlers.add(routeHandler)
+ mockWebServerRule.requestHandlers.add(
+ FailByRequestMockRequestHandler(
+ MockDirectionsRefreshHandler(
+ "route_with_notifications",
+ readRawFileText(context, R.raw.route_with_notifications_refresh1),
+ acceptedGeometryIndex = 400
+ )
+ )
+ )
+
+ val routes = mapboxNavigation.requestRoutes(
+ RouteOptions.builder().applyDefaultNavigationOptions()
+ .profile(DirectionsCriteria.PROFILE_DRIVING_TRAFFIC)
+ .alternatives(false)
+ .enableRefresh(true)
+ .coordinatesList(coordinates)
+ .baseUrl(mockWebServerRule.baseUrl)
+ .build()
+ ).getSuccessfulResultOrThrowException().routes
+
+ val originalRoadObjects = routes.first().upcomingRoadObjects
+ val expectedOriginalRoadObjectClasses = listOf(
+ Notification::class.java,
+ Notification::class.java,
+ Notification::class.java,
+ Notification::class.java,
+ Notification::class.java,
+ )
+
+ assertEquals(
+ expectedOriginalRoadObjectClasses,
+ originalRoadObjects.map { it.roadObject::class.java }
+ )
+
+ mapboxNavigation.startTripSession()
+
+ stayOnPosition(coordinates[0], 90f)
+ mapboxNavigation.flowLocationMatcherResult()
+ .filter {
+ abs(it.enhancedLocation.latitude - coordinates[0].latitude()) < 0.01 &&
+ abs(it.enhancedLocation.longitude - coordinates[0].longitude()) < 0.01
+ }.first()
+ mapboxNavigation.setNavigationRoutes(routes)
+
+ // no road objects passed
+ val geometryIndex400Point = routes.first().directionsRoute.completeGeometryToPoints()[400]
+ stayOnPosition(geometryIndex400Point, 320f)
+ val routeProgress1 = mapboxNavigation.routeProgressUpdates()
+ .filter {
+ it.currentState == RouteProgressState.TRACKING &&
+ it.currentRouteGeometryIndex == 400
+ }
+ .first()
+ val expectedObjects1 = originalRoadObjects.map {
+ it.roadObject::class.java to it.distanceToStart!! - routeProgress1.distanceTraveled
+ }
+
+// checkRoadObjects(expectedObjects1, routeProgress1.upcomingRoadObjects)
+
+ mapboxNavigation.routeRefreshController.requestImmediateRouteRefresh()
+ mapboxNavigation.routesUpdates()
+ .filter { it.reason == RoutesExtra.ROUTES_UPDATE_REASON_REFRESH }
+ .first()
+
+ val routeProgress2 = mapboxNavigation.routeProgressUpdates()
+ .take(2).toList().first()
+ val expectedObjects2 = originalRoadObjects.map {
+ it.roadObject::class.java to it.distanceToStart!! - routeProgress1.distanceTraveled
+ }
+
+// checkRoadObjects(expectedObjects2, routeProgress2.upcomingRoadObjects)
+
+ // in the middle of the first notification
+ val firstLegSize = routes.first().directionsRoute.legs()?.firstOrNull()?.annotation()?.duration()?.size
+ val geometryIndex600Point = routes.first().directionsRoute.completeGeometryToPoints()[600]
+ stayOnPosition(geometryIndex600Point, 340f)
+ val routeProgress3 = mapboxNavigation.routeProgressUpdates()
+ .filter {
+ it.currentState == RouteProgressState.TRACKING &&
+ it.currentRouteGeometryIndex == 600
+ }
+ .first()
+ val expectedObjects3 = originalRoadObjects.map {
+ it.roadObject::class.java to it.distanceToStart!! - routeProgress1.distanceTraveled
+ }
+
+// checkRoadObjects(expectedObjects3, routeProgress3.upcomingRoadObjects)
+
+ // after first notification
+ val geometryIndex634Point = routes.first().directionsRoute.completeGeometryToPoints()[634]
+ stayOnPosition(geometryIndex634Point, 0f)
+ mapboxNavigation.navigateNextRouteLeg()
+
+ val routeProgress4 = mapboxNavigation.routeProgressUpdates()
+ .filter {
+ it.currentState == RouteProgressState.TRACKING &&
+ it.currentRouteGeometryIndex == 634
+ }
+ .first()
+ val expectedObjects4 = originalRoadObjects.drop(1).map {
+ it.roadObject::class.java to it.distanceToStart!! - routeProgress1.distanceTraveled
+ }
+// checkRoadObjects(expectedObjects4, routeProgress4.upcomingRoadObjects)
+
+ // 3 notifications passed
+ val geometryIndex659Point = routes.first().directionsRoute.completeGeometryToPoints()[659]
+ stayOnPosition(geometryIndex659Point, 0f)
+
+ val routeProgress5 = mapboxNavigation.routeProgressUpdates()
+ .filter {
+ it.currentState == RouteProgressState.TRACKING &&
+ it.currentRouteGeometryIndex == 659
+ }
+ .first()
+ val expectedObjects5 = originalRoadObjects.drop(3).map {
+ it.roadObject::class.java to it.distanceToStart!! - routeProgress1.distanceTraveled
+ }
+// checkRoadObjects(expectedObjects5, routeProgress5.upcomingRoadObjects)
+
+ // 4 notifications passed
+ val geometryIndex760Point = routes.first().directionsRoute.completeGeometryToPoints()[760]
+ stayOnPosition(geometryIndex760Point, 0f)
+
+ val routeProgress6 = mapboxNavigation.routeProgressUpdates()
+ .filter {
+ it.currentState == RouteProgressState.TRACKING &&
+ it.currentRouteGeometryIndex == 760
+ }
+ .first()
+ val expectedObjects6 = originalRoadObjects.drop(4).map {
+ it.roadObject::class.java to it.distanceToStart!! - routeProgress1.distanceTraveled
+ }
+// checkRoadObjects(expectedObjects6, routeProgress6.upcomingRoadObjects)
+ }
+
private fun stayOnPosition(position: Point, bearing: Float = 0f) {
mockLocationReplayerRule.loopUpdate(
mockLocationUpdatesRule.generateLocationUpdate {
@@ -601,7 +761,9 @@ class UpcomingRouteObjectsTest : BaseCoreNoCleanUpTest() {
}
}
- private fun createMapboxNavigation(): MapboxNavigation = MapboxNavigationProvider.create(
+ private fun createMapboxNavigation(
+ routeRefreshOptions: RouteRefreshOptions = RouteRefreshOptions.Builder().build()
+ ): MapboxNavigation = MapboxNavigationProvider.create(
NavigationOptions.Builder(context)
.accessToken(getMapboxAccessTokenFromResources(context))
.routingTilesOptions(
@@ -609,6 +771,7 @@ class UpcomingRouteObjectsTest : BaseCoreNoCleanUpTest() {
.tilesBaseUri(URI(mockWebServerRule.baseUrl))
.build()
)
+ .routeRefreshOptions(routeRefreshOptions)
.build()
)
diff --git a/instrumentation-tests/src/main/res/raw/route_with_notifications.json b/instrumentation-tests/src/main/res/raw/route_with_notifications.json
new file mode 100644
index 00000000000..63b81659d5d
--- /dev/null
+++ b/instrumentation-tests/src/main/res/raw/route_with_notifications.json
@@ -0,0 +1 @@
+{"routes":[{"weight_typical":639313.359,"duration_typical":5252.346,"weight_name":"auto","weight":639313.359,"duration":5252.346,"distance":54338.797,"legs":[{"via_waypoints":[],"admins":[{"iso_3166_1_alpha3":"CAN","iso_3166_1":"CA"}],"notifications":[{"details":{"requested_value":"paved","actual_value":"gravel","message":"The road has an unpaved surface (gravel)."},"subtype":"unpaved","type":"violation","geometry_index_end":633,"geometry_index_start":562}],"annotation":{"maxspeed":[{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"speed":100,"unit":"km/h"},{"speed":100,"unit":"km/h"},{"speed":100,"unit":"km/h"},{"speed":100,"unit":"km/h"},{"speed":100,"unit":"km/h"},{"speed":100,"unit":"km/h"},{"speed":100,"unit":"km/h"},{"speed":100,"unit":"km/h"},{"speed":100,"unit":"km/h"},{"speed":100,"unit":"km/h"},{"speed":100,"unit":"km/h"},{"speed":100,"unit":"km/h"},{"speed":100,"unit":"km/h"},{"speed":100,"unit":"km/h"},{"speed":100,"unit":"km/h"},{"speed":100,"unit":"km/h"},{"speed":100,"unit":"km/h"},{"speed":100,"unit":"km/h"},{"speed":100,"unit":"km/h"},{"speed":100,"unit":"km/h"},{"speed":100,"unit":"km/h"},{"speed":100,"unit":"km/h"},{"speed":100,"unit":"km/h"},{"speed":100,"unit":"km/h"},{"speed":100,"unit":"km/h"},{"speed":100,"unit":"km/h"},{"speed":100,"unit":"km/h"},{"speed":100,"unit":"km/h"},{"speed":100,"unit":"km/h"},{"speed":100,"unit":"km/h"},{"speed":100,"unit":"km/h"},{"speed":100,"unit":"km/h"},{"speed":100,"unit":"km/h"},{"speed":100,"unit":"km/h"},{"speed":100,"unit":"km/h"},{"speed":100,"unit":"km/h"},{"speed":100,"unit":"km/h"},{"speed":100,"unit":"km/h"},{"speed":100,"unit":"km/h"},{"speed":100,"unit":"km/h"},{"speed":100,"unit":"km/h"},{"speed":100,"unit":"km/h"},{"speed":100,"unit":"km/h"},{"speed":100,"unit":"km/h"},{"speed":100,"unit":"km/h"},{"speed":100,"unit":"km/h"},{"speed":100,"unit":"km/h"},{"speed":100,"unit":"km/h"},{"speed":100,"unit":"km/h"},{"speed":100,"unit":"km/h"},{"speed":100,"unit":"km/h"},{"speed":100,"unit":"km/h"},{"speed":100,"unit":"km/h"},{"speed":100,"unit":"km/h"},{"speed":100,"unit":"km/h"},{"speed":100,"unit":"km/h"},{"speed":100,"unit":"km/h"},{"speed":100,"unit":"km/h"},{"speed":100,"unit":"km/h"},{"speed":100,"unit":"km/h"},{"speed":100,"unit":"km/h"},{"speed":100,"unit":"km/h"},{"speed":100,"unit":"km/h"},{"speed":100,"unit":"km/h"},{"speed":100,"unit":"km/h"},{"speed":100,"unit":"km/h"},{"speed":100,"unit":"km/h"},{"speed":100,"unit":"km/h"},{"speed":100,"unit":"km/h"},{"speed":100,"unit":"km/h"},{"speed":100,"unit":"km/h"},{"speed":100,"unit":"km/h"},{"speed":100,"unit":"km/h"},{"speed":100,"unit":"km/h"},{"speed":100,"unit":"km/h"},{"speed":100,"unit":"km/h"},{"speed":100,"unit":"km/h"},{"speed":100,"unit":"km/h"},{"speed":100,"unit":"km/h"},{"speed":100,"unit":"km/h"},{"speed":100,"unit":"km/h"},{"speed":100,"unit":"km/h"},{"speed":100,"unit":"km/h"},{"speed":100,"unit":"km/h"},{"speed":100,"unit":"km/h"},{"speed":100,"unit":"km/h"},{"speed":100,"unit":"km/h"},{"speed":100,"unit":"km/h"},{"speed":100,"unit":"km/h"},{"speed":70,"unit":"km/h"},{"speed":70,"unit":"km/h"},{"speed":70,"unit":"km/h"},{"speed":70,"unit":"km/h"},{"speed":70,"unit":"km/h"},{"speed":70,"unit":"km/h"},{"speed":70,"unit":"km/h"},{"speed":70,"unit":"km/h"},{"speed":70,"unit":"km/h"},{"speed":70,"unit":"km/h"},{"speed":70,"unit":"km/h"},{"speed":70,"unit":"km/h"},{"speed":70,"unit":"km/h"},{"speed":70,"unit":"km/h"},{"speed":70,"unit":"km/h"},{"speed":70,"unit":"km/h"},{"speed":70,"unit":"km/h"},{"speed":70,"unit":"km/h"},{"speed":70,"unit":"km/h"},{"speed":70,"unit":"km/h"},{"speed":70,"unit":"km/h"},{"speed":70,"unit":"km/h"},{"speed":70,"unit":"km/h"},{"speed":70,"unit":"km/h"},{"speed":70,"unit":"km/h"},{"speed":70,"unit":"km/h"},{"speed":70,"unit":"km/h"},{"speed":70,"unit":"km/h"},{"speed":70,"unit":"km/h"},{"speed":70,"unit":"km/h"},{"speed":70,"unit":"km/h"},{"speed":70,"unit":"km/h"},{"speed":70,"unit":"km/h"},{"speed":70,"unit":"km/h"},{"speed":70,"unit":"km/h"},{"speed":70,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true}],"congestion_numeric":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,null,0,0,0,0,0,0,0,8,8,8,8,0,0,0,null,0,0,0,null,0,0,8,8,8,8,0,0,0,0,0,0,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"speed":[21.1,21.1,21.1,21.1,21.1,21.1,21.1,21.1,21.1,21.1,21.1,21.1,21.1,21.1,21.1,21.1,21.1,21.1,21.1,21.1,21.1,21.1,21.1,21.1,21.1,21.1,21.1,21.1,21.1,21.7,21.7,21.7,21.7,21.7,21.7,21.7,21.7,21.7,21.7,21.7,21.7,21.7,21.7,21.7,21.7,21.7,21.7,21.7,21.7,21.7,21.7,21.7,21.7,21.7,21.7,21.7,21.7,16.6,16.6,16.7,16.7,16.7,16.7,16.7,16.7,16.9,22,22,22,16.7,16.7,16.7,16.7,16.7,16.7,16.7,16.7,16.7,16.7,16.7,16.7,16.7,16.7,16.7,16.7,16.7,16.7,16.7,16.7,16.7,16.7,16.7,16.7,16.7,16.7,16.7,16.7,16.7,16.7,16.7,16.7,16.7,16.7,16.7,16.7,16.7,16.7,16.7,16.7,16.7,16.7,16.7,16.7,16.7,16.7,16.7,16.7,16.7,16.7,16.7,16.7,16.7,16.7,16.7,16.7,16.7,16.7,16.7,16.7,16.7,16.7,16.7,16.7,16.7,12.8,12.8,12.8,12.8,12.8,12.8,12.8,12.8,12.8,12.8,12.8,12.8,12.8,12.8,12.8,12.8,12.8,12.8,12.8,12.8,12.8,12.8,12.8,12.8,12.8,12.8,12.8,12.8,12.8,12.8,12.8,12.8,12.8,12.8,12.8,12.8,12.8,12.8,12.8,12.8,12.8,12.8,12.8,12.8,12.8,12.8,12.8,12.8,12.8,12.8,12.8,12.8,12.8,12.8,12.8,12.8,12.8,12.8,7.8,7.8,7.8,7.8,7.8,17.9,17.9,17.9,17.9,17.9,7.2,7.2,7.2,7.2,7.2,7.2,7.2,7.8,7.8,8.6,8.6,8.6,11.4,11.4,18.3,16.4,16.4,16.4,16.4,16.4,16.4,16.4,16.4,16.4,16.4,16.4,16.4,16.4,16.4,16.4,16.4,16.4,16.4,16.4,16.4,16.4,16.4,16.4,16.4,16.4,16.4,16.4,16.4,16.4,16.4,16.4,16.4,16.4,16.4,16.4,16.4,16.4,16.4,16.4,16.4,16.4,16.4,16.4,16.4,16.4,16.4,16.4,16.4,16.4,16.4,16.4,16.4,16.4,16.4,16.4,16.4,16.4,16.4,16.4,16.4,16.4,16.4,16.4,16.4,16.4,16.4,16.4,16.4,16.4,16.4,16.4,16.4,16.4,16.4,16.4,16.4,16.4,16.4,16.4,16.4,16.4,16.4,16.4,16.4,16.4,16.4,16.4,16.4,16.4,16.4,16.4,16.4,16.4,16.4,16.4,16.4,16.4,16.4,16.4,16.4,16.4,16.4,16.4,16.4,16.4,16.4,16.4,16.4,16.4,16.4,16.4,16.4,16.4,16.4,16.4,16.4,16.4,16.4,16.4,16.4,16.4,16.4,16.4,16.4,16.4,16.4,16.4,16.4,16.4,26.7,26.7,26.7,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.2,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,22.8,22.8,22.8,22.8,20.6,19.4,19.4,19.4,19.4,19.4,19.4,19.4,20.6,20.6,20.6,20.6,21.6,21.6,21.6,20.7,22,22,22,21.5,22.8,22.8,21.7,21.7,21.7,21.7,21.9,21.9,21.9,21.9,21.9,21.9,7.3,12,12,12.5,12.5,12.5,12.5,12.5,13.9,13.9,13.9,13.9,13.9,13.9,13.9,13.9,13.9,13.9,13.9,13.9,13.9,13.9,13.9,13.9,11.1,11.1,11.1,11.1,11.1,11.1,11.1,11.1,11.1,13.9,13.9,13.9,13.9,13.9,13.9,13.9,13.9,13.9,13.9,13.9,13.9,13.9,13.9,13.9,13.9,13.9,13.9,12.8,12.8,12.8,12.8,12.8,12.8,12.8,12.8,12.8,11.1,11.1,11.1,11.1,11.1,11.1,11.1,11.1,11.1,11.1,11.1,11.1,11.1,11.1,11.1,11.1,11.1,11.1,10.9,11.1,11.1,11.1,11.1,11.1,10.3,10.3,10.3,10.3,10.3,10.3,10.3,10.8,10.8,10.8,10.8,10.8,10.8,10.8,10.3,12,12,12,11.9,11.9,11.9,11.9,11.9,11.9,11.9,11.9,11.9,11.9,11.9,11.9,11.9,11.9,11.9,11.9,11.9,11.9,13.3,13.3,13.3,13.3,13.3,5.3,5.3,4.4,4.4,4.4,4.4,4.4,4.4,4.4,4.4,4.4,4.4,4.4,4.4,4.4,4.4,4.4,4.4,4.4,4.4,4.4,4.4,4.4,4.4,4.4,4.4,4.4,4.4,4.4,4.4,4.4,4.4,4.4,4.4,4.4,4.4,4.4],"distance":[47.3,91.4,19.5,18.9,14.1,15.7,11.3,18.2,70.1,407.4,163.6,205.1,685.8,162.6,341.9,224.1,86.7,65.7,129.5,117.3,1195.4,93.2,85.2,76.1,450.4,241.1,112.6,71.5,53.3,94.3,206.6,183.1,94.9,53.6,75.4,161.5,65.2,122.7,158,85.9,69.2,144.4,158.3,117,163.3,105.5,50.2,70.3,371.7,174.2,76.8,41.1,38.5,79.7,72.4,188.7,146.8,209.9,20.7,65.5,88.9,67.7,91.2,46.7,108.3,13.1,245.1,159.9,306.5,18,21.9,43.7,66.9,101.5,69.6,63.6,86.9,71.2,67.8,96.1,79.7,98.1,188.4,121.6,119.5,68.7,240.6,98.6,151.8,244.4,117.7,107.4,63.2,165.5,136.4,58.1,58.2,51.9,53,172.5,91.4,129.3,103.6,174.1,71.5,56,59.6,120.4,73.3,46.4,60.7,55.9,99.1,94.1,83.8,90.8,200.4,164.1,86.3,162.1,73.3,34,40.1,23.2,27.1,37.1,29.4,45,18.8,20.4,17,28.1,44.9,43.1,56.5,36.6,47.3,53.5,30.4,32.2,35.7,38.5,63.3,74.8,79.7,73,22.1,28.7,32.6,37.4,49.4,47.6,36.3,54,45.8,37.9,37.3,35.2,45,42.3,43.2,38.5,36.7,61.6,50,41.5,47.8,31.5,51.2,28.6,28.1,35.9,34.5,32.1,38,35.8,34.5,37.9,33.2,30.4,30.2,18.6,21.5,39.3,36,34.6,45,24.2,20.1,20.5,23.4,44.2,109.5,106.5,44.9,44.1,49.8,16,18.2,11.9,15,15.3,36.8,29.3,29.4,28.8,42.8,76.9,65.6,23.1,34,18.5,52.1,7.4,59.7,56.7,36.9,41.7,38.7,54.9,127.5,43.6,99.3,42.2,39.5,61.1,43.3,203.7,105.1,30.3,81,81.4,70.3,72.1,56.7,42,134.7,78.2,101.3,50,31.1,20.3,26.8,45.7,45.5,46.9,14.1,20.3,19.8,15.5,15.4,16.8,18.4,22.6,26.1,27,23.4,34.5,28.9,27.3,23.1,17.2,32.5,29.8,39.2,27.1,31.1,23.7,49.9,38.2,85.2,68.6,65.7,62.7,82,41.2,55.7,46.7,26.4,39.5,44.3,28.2,26.3,47.6,28.8,20.2,20.7,18.4,15.3,18.3,16.3,14.3,13.9,15,18.1,30.1,25.3,19.1,27.3,19.8,24.2,21.3,32.7,23.5,32.2,15.4,22.2,31.1,36.4,39,22.1,56.4,33.5,55.9,72,41.6,48.2,50.7,39.6,33.8,37.2,43.4,49.2,24.9,46.7,33.8,25.5,15.9,17.1,15.6,13.9,20,28.9,30.3,34.6,28.2,23.9,15.8,14.7,13.6,18,15.9,20.2,10.3,10,19.2,61.2,32,54.9,368.4,64.8,58,145.5,150.2,94.6,59.3,95.2,92.2,81.5,702.8,112.8,305.8,42.6,39.7,83.6,59.8,97.5,64.4,51.5,61.3,49.1,62.7,62.9,77.3,68.1,59.8,70.8,65.9,66.5,64.4,38,34.2,61.6,62.2,50,38.5,56.4,59.8,54.4,49,39.4,47.6,30.9,49.2,40.8,35.8,51.7,43,63,52.9,43.5,33.4,26.3,10.7,8.3,14.9,25.4,361.7,66.4,49.5,252.7,138,167.1,541.3,200.6,166.5,221.4,110.8,141.8,108.6,139.5,471,331.3,162,327.5,111,110.1,145.3,326.8,19.6,157.7,568.1,16,70.8,66.7,70.4,57.3,43.9,42.1,43,36.8,55.3,53.7,57.6,49.8,70.4,35,61.9,91.4,135.1,44.9,52,56.6,45.1,21.8,67.2,92.1,157.1,59.5,251.3,126.5,48.3,62.7,50.5,9.5,55.6,47.8,40.3,50.1,49.1,57.7,40.4,82.8,37.3,51.4,72.1,29.1,69.8,74.5,40,72.5,47.5,32.4,29.8,31.1,57.7,72.6,49.6,65.2,53,72,92.3,61.7,54.8,32.7,19.7,39.9,47.7,100.6,111.5,51.6,36.2,37.5,24,5.1,55.7,30.1,54.9,88.8,51.5,31.5,14,26.9,20.4,20.5,22.5,18.6,38,31.6,32.2,22.5,28.1,19.1,16.1,13.9,15.9,13.7,44.2,42.2,32,25.6,62.5,43,40.4,26.4,24.5,29.8,27.1,21.2,25.9,20.1,30.7,41,61.1,46,47.6,28.8,56.4,9.6,22.6,17.7,45.3,51.6,39,29,13.4,30.8,65.2,71.1,80.1,57.2,27.2,54.2,36.1,33.1,19.4,45.2,93.5,420.3,92.1,48.4,43.7,18.3,36.5,37.1,74.6,107.8,13,49.8,51.7,71.6,47.2,74.2,90.9,126.3,102.2,86.1,116.2,67.7,109.8,50.9,122.9,186.6,152.2,36.9,41.6,97.5,36.2,20,29.9,68,126.8,90.2,192.2,140.4,36.5,67.9,67.7,63.1,22.6,70,47.8,49.5,66.2,75,36.5,101,59.4,36.1,23.6,146.6,94.2,171.4,46.4,177,98.9,29.4,130.6,27.1,51.4,31.1,117.1,132.7],"duration":[2.239,4.331,0.924,0.896,0.667,0.746,0.533,0.862,3.322,19.297,7.749,9.717,32.484,7.704,16.192,10.616,4.108,3.121,6.133,5.556,56.617,4.413,4.033,3.607,21.331,11.42,5.332,3.387,2.525,4.371,9.533,8.449,4.378,2.474,3.481,7.454,3.007,5.665,7.29,3.963,3.198,6.662,7.303,5.402,7.538,4.869,2.314,3.246,17.151,8.039,3.545,1.896,1.778,3.681,3.341,8.708,6.775,12.62,1.247,3.933,5.333,4.058,5.469,2.803,6.49,0.787,11.18,7.283,13.956,1.088,1.314,2.623,4.016,6.086,4.179,3.817,5.214,4.271,4.068,5.769,4.777,5.887,11.307,7.292,7.17,4.124,14.437,5.918,9.106,14.663,7.06,6.447,3.789,9.93,8.185,3.486,3.494,3.111,3.184,10.345,5.489,7.759,6.215,10.447,4.289,3.36,3.576,7.223,4.396,2.785,3.645,3.351,5.945,5.649,5.027,5.448,12.024,9.845,5.181,9.728,4.397,2.039,2.405,1.391,1.628,2.226,1.765,2.703,1.125,1.227,1.019,1.684,2.692,2.588,4.436,2.863,3.698,4.193,2.373,2.522,2.791,3.015,4.955,5.857,6.241,5.71,1.732,2.247,2.552,2.923,3.868,3.726,2.838,4.231,3.586,2.965,2.915,2.756,3.527,3.311,3.38,3.007,2.873,4.822,3.917,3.251,3.74,2.463,4.006,2.24,2.201,2.808,2.703,2.513,2.97,2.802,2.7,2.966,2.6,2.381,2.365,1.454,1.682,3.079,2.814,2.71,3.524,1.889,1.578,1.605,1.829,3.462,14.108,13.705,5.771,5.672,6.409,0.896,1.02,0.665,0.839,0.856,5.1,4.062,4.084,3.989,5.928,10.664,9.096,2.975,4.361,2.152,6.06,0.853,5.232,4.961,2.026,2.565,2.359,3.354,7.777,2.661,6.056,2.579,2.411,3.727,2.64,12.433,6.415,1.846,4.94,4.969,4.291,4.402,3.459,2.56,8.223,4.767,6.184,3.052,1.897,1.235,1.638,2.79,2.778,2.859,0.865,1.241,1.212,0.945,0.941,1.025,1.117,1.379,1.598,1.648,1.423,2.108,1.765,1.664,1.411,1.05,1.984,1.818,2.39,1.655,1.898,1.446,3.046,2.327,5.203,4.185,4.01,3.827,5.005,2.515,3.399,2.847,1.609,2.415,2.701,1.723,1.606,2.904,1.759,1.229,1.267,1.122,0.934,1.115,0.993,0.877,0.844,0.916,1.107,1.835,1.546,1.163,1.664,1.208,1.479,1.298,2,1.435,1.964,0.937,1.356,1.896,2.221,2.378,1.351,3.441,2.047,3.41,4.394,2.539,2.943,3.09,2.417,2.065,2.269,2.651,3.002,1.521,2.847,2.063,1.558,0.971,1.044,0.95,0.848,1.217,1.763,1.854,2.109,1.718,1.46,0.966,0.896,0.833,1.095,0.973,1.233,0.63,0.608,1.175,4.547,1.198,2.06,13.535,2.379,2.13,5.344,5.516,3.474,2.18,3.496,3.386,2.994,25.809,4.15,11.235,1.566,1.457,3.07,2.198,3.58,2.365,1.894,2.249,1.805,2.304,2.309,2.84,2.502,2.194,2.601,2.422,2.442,2.368,1.395,1.257,2.263,2.285,1.835,1.416,2.071,2.197,1.998,1.801,1.447,1.748,1.134,1.806,1.501,1.313,1.899,1.58,2.316,1.943,1.596,1.227,0.969,0.392,0.306,0.562,0.914,13.024,2.387,1.784,9.097,4.969,6.015,19.485,7.222,5.995,7.969,3.99,5.104,3.909,5.024,16.955,11.929,5.832,11.787,3.997,3.964,5.229,11.767,0.705,5.677,20.45,0.578,2.549,2.399,3.098,2.514,1.93,1.853,2.113,1.921,2.847,2.765,2.963,2.566,3.625,1.802,3.031,4.446,6.568,2.182,2.423,2.621,2.083,1.056,3.06,4.191,7.149,2.776,11.06,5.556,2.236,2.895,2.331,0.438,2.545,2.183,1.839,2.284,2.24,2.635,8.871,6.941,3.12,4.12,5.768,2.33,5.591,5.96,2.889,5.212,3.416,2.332,2.145,2.235,4.154,5.223,3.571,4.685,3.826,5.185,6.658,4.448,3.949,2.358,1.849,3.59,4.294,9.065,10.043,4.641,3.267,3.379,2.159,0.376,4.006,2.171,3.956,6.39,3.715,2.265,1.011,1.936,1.469,1.479,1.616,1.345,2.734,2.274,2.322,1.621,2.019,1.721,1.258,1.091,1.25,1.073,3.459,3.307,2.508,2.008,5.622,3.866,3.629,2.373,2.215,2.676,2.437,1.903,2.326,1.807,2.763,3.683,5.541,4.15,4.289,2.598,5.084,0.866,2.07,1.602,4.085,4.652,3.522,2.61,1.534,2.991,6.343,6.917,7.803,5.557,2.646,6.558,3.337,3.049,1.794,4.172,8.632,38.81,8.958,4.042,3.641,1.526,3.938,3.103,6.245,9.028,1.1,4.167,4.329,5.994,3.958,6.216,7.609,10.584,8.559,7.205,9.734,5.676,9.196,4.26,9.311,13.984,11.414,2.765,3.12,22.419,6.884,5.328,7.227,15.31,28.548,20.302,43.259,31.585,8.226,15.281,15.225,14.216,7.103,15.739,10.752,11.131,14.909,16.873,8.216,22.72,13.348,8.118,5.313,32.996,21.172,38.566,10.436,39.818,22.263,6.611,29.379,6.092,11.566,7.007,26.343,29.834]},"weight_typical":95627.234,"duration_typical":3110.191,"weight":95627.234,"duration":3110.191,"steps":[{"voiceInstructions":[{"ssmlAnnouncement":"Drive east for 15 miles.","announcement":"Drive east for 15 miles.","distanceAlongGeometry":23942.047},{"ssmlAnnouncement":"In a quarter mile, Turn left onto 3.","announcement":"In a quarter mile, Turn left onto 3.","distanceAlongGeometry":402.336},{"ssmlAnnouncement":"Turn left onto 3, 93.","announcement":"Turn left onto 3, 93.","distanceAlongGeometry":100}],"intersections":[{"entry":[true],"bearings":[83],"duration":122.385,"mapbox_streets_v8":{"class":"secondary"},"is_urban":false,"admin_index":0,"out":0,"weight":104.028,"geometry_index":0,"location":[-115.574669,49.586752]},{"entry":[true,true,false],"in":2,"bearings":[128,237,308],"duration":127.475,"turn_weight":0.5,"turn_duration":0.007,"mapbox_streets_v8":{"class":"secondary"},"is_urban":false,"admin_index":0,"out":0,"weight":108.848,"geometry_index":17,"location":[-115.553643,49.569755]},{"entry":[true,true,false],"in":2,"bearings":[18,99,280],"duration":155.511,"turn_weight":0.5,"turn_duration":0.019,"mapbox_streets_v8":{"class":"secondary"},"is_urban":false,"admin_index":0,"out":1,"weight":132.668,"geometry_index":29,"location":[-115.517775,49.564583]},{"entry":[false,true,true],"in":0,"bearings":[2,107,182],"duration":13.867,"turn_weight":0.5,"turn_duration":0.007,"mapbox_streets_v8":{"class":"secondary"},"is_urban":false,"admin_index":0,"out":2,"weight":12.281,"geometry_index":57,"location":[-115.48894,49.544518]},{"entry":[true,true,false],"in":2,"bearings":[176,256,356],"duration":28.087,"turn_weight":0.5,"turn_duration":0.007,"mapbox_streets_v8":{"class":"secondary"},"is_urban":false,"admin_index":0,"out":0,"weight":24.368,"geometry_index":59,"location":[-115.489023,49.542448]},{"entry":[false,true,false],"in":2,"bearings":[28,131,311],"duration":0.787,"turn_weight":0.5,"turn_duration":0.007,"mapbox_streets_v8":{"class":"secondary"},"is_urban":false,"admin_index":0,"out":1,"weight":1.163,"geometry_index":65,"location":[-115.486059,49.53888]},{"entry":[true,true,false],"in":2,"bearings":[129,208,311],"duration":32.419,"turn_weight":0.5,"turn_duration":0.019,"mapbox_streets_v8":{"class":"secondary"},"is_urban":false,"admin_index":0,"out":0,"weight":28.04,"geometry_index":66,"location":[-115.485922,49.538802]},{"entry":[true,true,false],"in":2,"bearings":[130,215,310],"duration":336.427,"turn_weight":0.5,"turn_duration":0.007,"mapbox_streets_v8":{"class":"secondary"},"is_urban":false,"admin_index":0,"out":0,"weight":286.457,"geometry_index":69,"location":[-115.478298,49.534757]},{"entry":[false,true,true],"in":0,"bearings":[31,122,214],"duration":180.165,"turn_weight":0.5,"turn_duration":0.008,"mapbox_streets_v8":{"class":"secondary"},"is_urban":false,"admin_index":0,"out":2,"weight":158.137,"geometry_index":134,"location":[-115.452986,49.48833]},{"entry":[true,true,false],"in":2,"bearings":[83,169,266],"duration":45.665,"turn_weight":0.5,"turn_duration":0.022,"mapbox_streets_v8":{"class":"secondary"},"is_urban":false,"admin_index":0,"out":0,"weight":40.438,"geometry_index":192,"location":[-115.456478,49.473177]},{"entry":[true,false],"in":1,"bearings":[112,288],"duration":4.275,"turn_weight":5.5,"mapbox_streets_v8":{"class":"secondary"},"is_urban":false,"admin_index":0,"out":0,"weight":9.241,"geometry_index":197,"location":[-115.451641,49.473162]},{"entry":[true,false],"in":1,"bearings":[125,305],"duration":42.923,"turn_weight":0.5,"mapbox_streets_v8":{"class":"secondary"},"is_urban":false,"admin_index":0,"out":0,"weight":38.058,"geometry_index":202,"location":[-115.450713,49.472839]},{"entry":[true,true,false],"in":2,"bearings":[142,228,322],"duration":7.335,"turn_weight":0.5,"turn_duration":0.007,"mapbox_streets_v8":{"class":"secondary"},"is_urban":false,"admin_index":0,"out":0,"weight":6.912,"geometry_index":209,"location":[-115.447887,49.47077]},{"entry":[true,true,false],"in":2,"bearings":[141,203,321],"duration":9.065,"turn_weight":0.5,"turn_duration":0.007,"mapbox_streets_v8":{"class":"secondary"},"is_urban":false,"admin_index":0,"out":0,"weight":8.426,"geometry_index":211,"location":[-115.447389,49.470371]},{"entry":[true,true,false],"in":2,"bearings":[149,266,326],"duration":10.193,"turn_weight":0.5,"turn_duration":0.008,"mapbox_streets_v8":{"class":"secondary"},"is_urban":false,"admin_index":0,"out":0,"weight":9.412,"geometry_index":214,"location":[-115.446753,49.469807]},{"entry":[true,true,false],"in":2,"bearings":[111,156,335],"duration":2.026,"turn_weight":0.5,"turn_duration":0.007,"mapbox_streets_v8":{"class":"secondary"},"is_urban":false,"admin_index":0,"out":1,"weight":2.266,"geometry_index":216,"location":[-115.446002,49.468883]},{"entry":[true,true,false],"in":2,"bearings":[44,155,336],"duration":116.867,"turn_weight":0.5,"turn_duration":0.019,"mapbox_streets_v8":{"class":"secondary"},"is_urban":false,"admin_index":0,"out":1,"weight":99.82,"geometry_index":217,"location":[-115.445792,49.468581]},{"bearings":[16,113,195],"entry":[false,true,true],"in":0,"turn_weight":0.5,"turn_duration":0.007,"mapbox_streets_v8":{"class":"secondary"},"is_urban":false,"admin_index":0,"out":2,"geometry_index":246,"location":[-115.430955,49.455481]}],"bannerInstructions":[{"primary":{"components":[{"mapbox_shield":{"text_color":"black","name":"default","display_ref":"3","base_url":"https://api.mapbox.com/styles/v1"},"type":"icon","text":"3"},{"type":"delimiter","text":"/"},{"mapbox_shield":{"text_color":"black","name":"default","display_ref":"93","base_url":"https://api.mapbox.com/styles/v1"},"type":"icon","text":"93"}],"type":"turn","modifier":"left","text":"3 / 93"},"distanceAlongGeometry":23942.047}],"speedLimitUnit":"km/h","maneuver":{"type":"depart","instruction":"Drive east on Wardner - Fort Steele Road.","bearing_after":83,"bearing_before":0,"location":[-115.574669,49.586752]},"speedLimitSign":"mutcd","name":"Wardner - Fort Steele Road","weight_typical":1227.797,"duration_typical":1419.874,"duration":1419.874,"distance":23942.047,"driving_side":"right","weight":1227.797,"mode":"driving","geometry":"_cpq}Axwbm{EgBsg@_DymAK{Or@eOnAqJ~CgJhCcF|GsF~d@{N`aFst@nrA_z@lyA_mBxrHucJbz@ijBdcCquEvpAorCt\\oz@nUcl@bYsgB|LgbBde@eh_@~E}nApLueA|Ne|@veBgcJbu@i~DpPs|ApEa|@~Col@nGqoAxPuoDtNs{CtJcoAxGkk@zO{z@jk@}xBfQ{o@t`@u{Anl@ktBv\\oy@bYmk@`z@qtAp`Am{Azr@e}@~hAorAnn@qu@bVwWd`@_`@fwD}uCbuAmfAbe@a^|S}MhSmJ`k@iKrg@_AzhBrDjqAjCvtBhErJc@tc@qBho@mRxa@mVnj@sh@vRsY|f@qeAzCqG~uAgcDbw@_kBtlBgkEnE}JxFsM`PeZ|Ykg@no@_m@d`@{^f]g\\zh@qe@tc@mWbd@}Kpt@iInk@oEju@sLrfB}_@|aAkSj`AgVpc@_Rz|BqjAvr@k]~mAep@`~BwnAf|@ce@~v@qa@n_@yThrAk~@~cAer@f\\gUx\\uSzZ}Kb\\uHl}Aw_@bq@gPxeAuWvw@qRp~Au^`f@eMt]qI|_@aHvaAiO|f@eNvWqK~^eQt[oRvo@gh@~k@ui@pf@ef@tj@mg@n`BmuAboA_eAti@kb@xnAkbAzb@_^nPuJxRmOhKoEzMaDtSuBnOb@bXlCbIlC~I`DbHfCbMvIrTzRtSjRhYjZhP~OfTlWrXfWzMvK~N~KvQxIlSzIpa@vKlg@pPzh@jWtd@tWnJfFjNlFfQdA|Ss@hXoPdWoPzQwJt[gNhXaFfTg@vS~B`R`GpVdM`SpRhRpUtMhWfKnXjNtn@rJjf@rHt_@zIvd@vEbXfLff@|HlRlJvOxO`PrPlKrPxDbTfCtRgEtQyFjQoOtMuPrJgRrHoTpCmMbDyO`Eu_@jD}\\jDw[~Ekd@`BiS`AcPd@sPIeSu@ce@{Fy|AmEozA`Ase@pCmd@rG}g@dB}KrCaM`BcHfCeJ`DuIxJaY~IyQjK{OdKiOdReUt`@qh@`\\ya@dImKvMuQ~FcItVmYpBeBz[gYz[uSzQcLdTkN|ReLd[iRb`Asl@jUiNnp@kf@tRkS`PyTbWod@`Ni\\fjAqcCvi@s}@~JoQh_@ep@zZwv@`Ret@dR{u@`Qig@rNcZxw@{kA|_@qk@`k@kv@jV}VjOiHhJs@|M`BnWxJvWxHhX~IrFbB~ItCzIxBpGhArGb@fHyA|GyFhIkJ~I_N`KcMbJsIbP_MxMgIzL}HpJaHtGoEjPsG`OeFzSsIbMwGpMyMnIqKtUiXtPqQhf@_i@l^ea@x\\m`@h[e_@jc@mj@jQsTfWk]zRgYzImNbOoVtQeXlJ{O|HyOdOu_@hIeRrGgJ|HkH|HiCpGe@fIMbHUzFuApFuA|FkCfHqEhN}IzKiHpHkF~KmKnH{GhJsJpH_JbNcOzIoJvNsL`GuCxJeEpOmGjR_IxSkI|JiDf]kMbQ{F~\\cM`f@_OtUqGtY_F~ZqF|TqDvQwCrS}C`WcEdZmFxLmBxXyEvQoCdMcB|GApHj@rGdArFpArIlDjN|FdOfGhQzHvMvGxKdEjGpCzFvBjFdB|HnAzGx@bJlBvDb@lD~@lIhC"},{"voiceInstructions":[{"ssmlAnnouncement":"Continue for 8 miles.","announcement":"Continue for 8 miles.","distanceAlongGeometry":12613.81},{"ssmlAnnouncement":"In a quarter mile, Turn left onto Rosen Lake Road.","announcement":"In a quarter mile, Turn left onto Rosen Lake Road.","distanceAlongGeometry":402.336},{"ssmlAnnouncement":"Turn left onto Rosen Lake Road.","announcement":"Turn left onto Rosen Lake Road.","distanceAlongGeometry":124.444}],"intersections":[{"entry":[false,true,true],"in":0,"bearings":[15,128,303],"duration":7.804,"turn_weight":18.75,"turn_duration":2.254,"mapbox_streets_v8":{"class":"trunk"},"is_urban":false,"admin_index":0,"out":1,"weight":23.606,"geometry_index":346,"location":[-115.417188,49.431336]},{"entry":[true,true,false],"in":2,"bearings":[135,183,314],"duration":70.244,"turn_weight":0.5,"turn_duration":0.007,"mapbox_streets_v8":{"class":"trunk"},"is_urban":false,"admin_index":0,"out":0,"weight":61.957,"geometry_index":349,"location":[-115.41565,49.430461]},{"entry":[true,true,false],"in":2,"bearings":[56,135,315],"duration":97.244,"turn_duration":0.007,"mapbox_streets_v8":{"class":"trunk"},"is_urban":false,"admin_index":0,"out":1,"weight":85.082,"geometry_index":360,"location":[-115.396924,49.418346]},{"entry":[true,true,false],"in":2,"bearings":[122,214,307],"duration":201.266,"turn_weight":0.5,"turn_duration":0.026,"mapbox_streets_v8":{"class":"trunk"},"is_urban":false,"admin_index":0,"out":0,"weight":176.585,"geometry_index":405,"location":[-115.371118,49.401572]},{"entry":[true,false],"in":1,"bearings":[119,307],"duration":9.395,"mapbox_streets_v8":{"class":"trunk"},"is_urban":false,"admin_index":0,"out":0,"weight":8.221,"geometry_index":435,"location":[-115.306497,49.377098]},{"entry":[true,true,false],"in":2,"bearings":[104,267,286],"duration":2.113,"turn_duration":0.021,"mapbox_streets_v8":{"class":"trunk"},"is_urban":false,"admin_index":0,"out":0,"weight":1.83,"geometry_index":439,"location":[-115.303821,49.376308]},{"entry":[true,true,false],"in":2,"bearings":[99,182,284],"duration":18.489,"turn_weight":0.5,"turn_duration":0.026,"mapbox_streets_v8":{"class":"trunk"},"is_urban":false,"admin_index":0,"out":0,"weight":16.655,"geometry_index":440,"location":[-115.303246,49.376213]},{"entry":[true,true,false,true],"in":2,"bearings":[67,180,254,355],"duration":16.226,"turn_duration":0.026,"mapbox_streets_v8":{"class":"trunk"},"is_urban":false,"admin_index":0,"out":0,"weight":14.175,"geometry_index":447,"location":[-115.298367,49.376448]},{"entry":[true,true,false],"in":2,"bearings":[70,155,250],"duration":7.127,"turn_duration":0.019,"mapbox_streets_v8":{"class":"trunk"},"is_urban":false,"admin_index":0,"out":0,"weight":6.219,"geometry_index":451,"location":[-115.294133,49.377614]},{"entry":[true,false],"in":1,"bearings":[74,252],"duration":1.056,"mapbox_streets_v8":{"class":"trunk"},"is_urban":false,"admin_index":0,"out":0,"weight":0.924,"geometry_index":454,"location":[-115.292126,49.378058]},{"entry":[true,false],"in":1,"bearings":[75,254],"duration":14.4,"mapbox_streets_v8":{"class":"trunk"},"is_urban":false,"admin_index":0,"out":0,"weight":12.6,"geometry_index":455,"location":[-115.291837,49.378113]},{"entry":[true,true,false,true],"in":2,"bearings":[79,163,259,344],"duration":2.776,"turn_duration":0.007,"mapbox_streets_v8":{"class":"trunk"},"is_urban":false,"admin_index":0,"out":0,"weight":2.423,"geometry_index":458,"location":[-115.287565,49.378695]},{"entry":[true,true,false],"in":2,"bearings":[78,175,259],"duration":16.616,"turn_duration":0.021,"mapbox_streets_v8":{"class":"trunk"},"is_urban":false,"admin_index":0,"out":0,"weight":14.521,"geometry_index":459,"location":[-115.286759,49.378797]},{"entry":[true,true,false],"in":2,"bearings":[79,173,258],"duration":7.9,"turn_duration":0.007,"mapbox_streets_v8":{"class":"trunk"},"is_urban":false,"admin_index":0,"out":0,"weight":6.906,"geometry_index":461,"location":[-115.281664,49.379512]},{"bearings":[91,199,269],"entry":[true,true,false],"in":2,"turn_duration":0.008,"mapbox_streets_v8":{"class":"trunk"},"is_urban":false,"admin_index":0,"out":0,"geometry_index":465,"location":[-115.279333,49.379724]}],"bannerInstructions":[{"primary":{"components":[{"type":"text","text":"Rosen Lake Road"}],"type":"turn","modifier":"left","text":"Rosen Lake Road"},"distanceAlongGeometry":12647.143}],"speedLimitUnit":"km/h","maneuver":{"type":"end of road","instruction":"Turn left onto 3/93/Crowsnest Highway.","modifier":"left","bearing_after":128,"bearing_before":195,"location":[-115.417188,49.431336]},"speedLimitSign":"mutcd","name":"Crowsnest Highway","weight_typical":443.706,"duration_typical":486.38,"duration":486.38,"distance":12647.143,"driving_side":"right","weight":443.706,"mode":"driving","ref":"3; 93","geometry":"oq`h}Afeoc{EdTqh@dKgShTia@dpCmaFnX{f@vUyb@tx@}wArz@uzAvd@mx@hVsc@|d@{x@tc@cw@f_@}p@nuGslL`l@kcAnwBa{D|NmZ~NyV|_@kr@xVmc@bf@yy@dZsc@xTg\\zY}_@lTuYjZaa@pZ{`@`a@kh@t\\ad@bYi_@t\\sg@zYcf@|Xgh@hXwf@`NeVxK_UdVmf@`Vig@`Rs^`N{V`Tic@xU{d@zSga@~P__@bNyW`Qg]fJgSbQ__@|NkXnLyUzQ{`@|N{ZrVog@bSq`@bOc[`KaU~GaQtBgFrA}DjC}I|FeQjjB}gGtRqo@vMgc@hjAwwD~c@sgBn`@seCfmAebMlW}gD|EgnCk@}}D~E_~A|S_uBlWytAve@sgBzvCqkIlhBojFhj@{yBtoAw|Fb_@aqAve@_iAjz@{tA~lCsqDnGuIndAgsAlqFg}HzE_HbZsk@hUcm@hRat@tM{j@tGmb@tE{a@|D}b@bBk^nBkn@Lim@gAop@uCki@oH}y@iDa\\wL}o@oSigAc]}iBoGmc@}Hci@_Ikm@yF}c@mBaQsHaw@wH_mA_P}cCkEkq@}\\wrEwMuiBeD{g@uEct@o@oj@BeGJ}n@|A_h@fCca@|Dei@~Hmf@fLml@"},{"voiceInstructions":[{"ssmlAnnouncement":"Continue for 1.5 miles.","announcement":"Continue for 1.5 miles.","distanceAlongGeometry":2367.207},{"ssmlAnnouncement":"In a quarter mile, Turn right onto Rosen Lake Road E..","announcement":"In a quarter mile, Turn right onto Rosen Lake Road E..","distanceAlongGeometry":402.336},{"ssmlAnnouncement":"Turn right onto Rosen Lake Road E..","announcement":"Turn right onto Rosen Lake Road E..","distanceAlongGeometry":94.444}],"intersections":[{"entry":[true,true,true,false],"in":3,"bearings":[40,124,201,294],"duration":8.871,"turn_weight":12.5,"turn_duration":3.332,"mapbox_streets_v8":{"class":"tertiary"},"is_urban":false,"admin_index":0,"out":0,"weight":17.346,"geometry_index":471,"location":[-115.275331,49.379136]},{"entry":[true,true,false,true],"in":2,"bearings":[51,113,220,318],"duration":10.061,"turn_weight":1.5,"turn_duration":0.014,"mapbox_streets_v8":{"class":"tertiary"},"is_urban":false,"admin_index":0,"out":0,"weight":10.291,"geometry_index":472,"location":[-115.274975,49.379415]},{"entry":[true,false,true],"in":1,"bearings":[52,228,322],"duration":23.769,"turn_weight":0.75,"turn_duration":0.009,"mapbox_streets_v8":{"class":"tertiary"},"is_urban":false,"admin_index":0,"out":0,"weight":21.54,"geometry_index":474,"location":[-115.273702,49.380106]},{"entry":[true,true,false],"in":2,"bearings":[50,144,230],"duration":35.864,"turn_weight":0.75,"turn_duration":0.008,"mapbox_streets_v8":{"class":"tertiary"},"is_urban":false,"admin_index":0,"out":0,"weight":32.124,"geometry_index":479,"location":[-115.270518,49.381783]},{"entry":[true,false],"in":1,"bearings":[60,255],"duration":26.424,"turn_weight":1.125,"mapbox_streets_v8":{"class":"tertiary"},"is_urban":false,"admin_index":0,"out":0,"weight":24.246,"geometry_index":489,"location":[-115.26442,49.383658]},{"entry":[true,true,false],"in":2,"bearings":[7,87,205],"duration":42.287,"turn_weight":1.5,"turn_duration":0.077,"mapbox_streets_v8":{"class":"tertiary"},"is_urban":false,"admin_index":0,"out":0,"weight":38.434,"geometry_index":495,"location":[-115.260639,49.385791]},{"bearings":[27,84,207],"entry":[true,true,false],"in":2,"turn_weight":0.75,"turn_duration":0.007,"mapbox_streets_v8":{"class":"tertiary"},"is_urban":false,"admin_index":0,"out":0,"geometry_index":504,"location":[-115.260777,49.389924]}],"bannerInstructions":[{"primary":{"components":[{"type":"text","text":"Rosen Lake Road E."}],"type":"turn","modifier":"right","text":"Rosen Lake Road E."},"distanceAlongGeometry":2383.874}],"speedLimitUnit":"km/h","maneuver":{"type":"turn","instruction":"Turn left onto Rosen Lake Road.","modifier":"left","bearing_after":40,"bearing_before":114,"location":[-115.275331,49.379136]},"speedLimitSign":"mutcd","name":"Rosen Lake Road","weight_typical":182.09,"duration_typical":189.979,"duration":189.979,"distance":2383.874,"driving_side":"right","weight":182.09,"mode":"driving","geometry":"_szd}AdczzzEmPgUe\\sv@_M}VsPab@gXqo@uI_RkWen@{Yep@kMqYmXwo@kOi_@wIqU_HuT{EsWaHyn@_Ha|@uEqh@sHeu@aNof@oWip@a`@k|@kUsg@uTo`@sO_K}IkAkUVoYxD{v@~K_}@jLy[`CaSkDwRgJ_KkHqA_AyZyTuNwHe]uHwp@zB{[lBsPq@{FOyMmCsIqEkHiIuHkKcFyJkLoXeJcTyIiUsGeMqKqM"},{"voiceInstructions":[{"ssmlAnnouncement":"Continue for 1 mile.","announcement":"Continue for 1 mile.","distanceAlongGeometry":1398.323},{"ssmlAnnouncement":"In a quarter mile, Turn right onto McLean Road.","announcement":"In a quarter mile, Turn right onto McLean Road.","distanceAlongGeometry":402.336},{"ssmlAnnouncement":"Turn right onto McLean Road.","announcement":"Turn right onto McLean Road.","distanceAlongGeometry":83.333}],"intersections":[{"entry":[true,false,true],"in":1,"bearings":[89,217,329],"duration":17.673,"turn_weight":6.5,"turn_duration":0.221,"mapbox_streets_v8":{"class":"tertiary"},"is_urban":false,"admin_index":0,"out":0,"weight":21.771,"geometry_index":522,"location":[-115.257878,49.394541]},{"entry":[true,true,false],"in":2,"bearings":[30,121,295],"duration":15.49,"turn_weight":0.75,"turn_duration":0.01,"mapbox_streets_v8":{"class":"tertiary"},"is_urban":false,"admin_index":0,"out":1,"weight":14.295,"geometry_index":531,"location":[-115.255247,49.393608]},{"entry":[true,true,false],"in":2,"bearings":[90,119,294],"duration":19.81,"turn_weight":0.75,"turn_duration":0.01,"mapbox_streets_v8":{"class":"tertiary"},"is_urban":false,"admin_index":0,"out":1,"weight":18.075,"geometry_index":535,"location":[-115.253128,49.392911]},{"entry":[true,false,true],"in":1,"bearings":[16,202,311],"duration":22.528,"turn_weight":0.75,"turn_duration":0.028,"mapbox_streets_v8":{"class":"tertiary"},"is_urban":false,"admin_index":0,"out":0,"weight":20.438,"geometry_index":543,"location":[-115.250733,49.393506]},{"entry":[true,false],"in":1,"bearings":[8,194],"duration":2.07,"turn_weight":0.75,"mapbox_streets_v8":{"class":"tertiary"},"is_urban":false,"admin_index":0,"out":0,"weight":2.561,"geometry_index":549,"location":[-115.24968,49.395638]},{"entry":[true,false],"in":1,"bearings":[8,188],"duration":16.47,"turn_weight":0.75,"mapbox_streets_v8":{"class":"tertiary"},"is_urban":false,"admin_index":0,"out":0,"weight":15.161,"geometry_index":550,"location":[-115.249636,49.395839]},{"bearings":[68,175,322],"entry":[true,false,true],"in":1,"turn_weight":1.125,"turn_duration":0.223,"mapbox_streets_v8":{"class":"tertiary"},"is_urban":false,"admin_index":0,"out":2,"geometry_index":555,"location":[-115.249239,49.397448]}],"bannerInstructions":[{"primary":{"components":[{"type":"text","text":"McLean Road"}],"type":"turn","modifier":"right","text":"McLean Road"},"distanceAlongGeometry":1414.99}],"speedLimitUnit":"km/h","maneuver":{"type":"turn","instruction":"Turn right onto Rosen Lake Road E..","modifier":"right","bearing_after":89,"bearing_before":37,"location":[-115.257878,49.394541]},"speedLimitSign":"mutcd","name":"Rosen Lake Road E.","weight_typical":122.797,"duration_typical":127.832,"duration":127.832,"distance":1414.99,"driving_side":"right","weight":122.797,"mode":"driving","geometry":"yuxe}Aj`xyzEKoOx@qLx@uJ~BiKrCmHfOw[lM{[rHiVbE_S`Qem@zH{`@tHo^|D{StEoQvCsWLkVsAyPwDoSiEkM_LmPkTaL}_@yMgWuLoXeKaNaHe]sMiDm@qKwA{HcAaXqE}ZuJoTqEeObAkEfEqJtRuNxq@aPlv@k]`r@aWp_@iKzL"},{"voiceInstructions":[{"ssmlAnnouncement":"Continue for a half mile.","announcement":"Continue for a half mile.","distanceAlongGeometry":890.991},{"ssmlAnnouncement":"In a quarter mile, Turn right.","announcement":"In a quarter mile, Turn right.","distanceAlongGeometry":402.336},{"ssmlAnnouncement":"Turn right.","announcement":"Turn right.","distanceAlongGeometry":33.333}],"intersections":[{"entry":[true,false,true],"in":1,"bearings":[48,144,317],"duration":66.351,"turn_weight":5006.5,"turn_duration":1.551,"mapbox_streets_v8":{"class":"tertiary"},"is_urban":false,"admin_index":0,"out":0,"weight":11559.401,"geometry_index":562,"location":[-115.252914,49.399327]},{"entry":[false,true,true],"in":0,"bearings":[174,283,355],"duration":8.958,"turn_weight":0.75,"turn_duration":0.007,"mapbox_streets_v8":{"class":"tertiary"},"is_urban":false,"admin_index":0,"out":2,"weight":905.955,"geometry_index":569,"location":[-115.2524,49.405302]},{"bearings":[175,353],"entry":[false,true],"in":0,"turn_weight":5.75,"mapbox_streets_v8":{"class":"tertiary"},"is_urban":false,"admin_index":0,"out":1,"geometry_index":570,"location":[-115.252508,49.406126]}],"bannerInstructions":[{"primary":{"components":[{"type":"text","text":"Turn right"}],"type":"turn","modifier":"right","text":"Turn right"},"distanceAlongGeometry":904.325}],"speedLimitUnit":"km/h","maneuver":{"type":"turn","instruction":"Turn right onto McLean Road.","modifier":"right","bearing_after":48,"bearing_before":324,"location":[-115.252914,49.399327]},"speedLimitSign":"mutcd","name":"McLean Road","weight_typical":13402.397,"duration_typical":84.519,"duration":84.519,"distance":904.325,"driving_side":"right","weight":13402.397,"mode":"driving","geometry":"}`bf}AbjnyzEgS}a@yMiTkOkLqHaGiXtAks@jDwiFnd@or@vE_Z`DmWtAgI^"},{"voiceInstructions":[{"ssmlAnnouncement":"Continue for 1 mile.","announcement":"Continue for 1 mile.","distanceAlongGeometry":1305.303},{"ssmlAnnouncement":"In a quarter mile, Bear right onto Galloway Forest Service Road.","announcement":"In a quarter mile, Bear right onto Galloway Forest Service Road.","distanceAlongGeometry":402.336},{"ssmlAnnouncement":"Bear right.","announcement":"Bear right.","distanceAlongGeometry":33.333}],"intersections":[{"entry":[true,false,true],"in":1,"bearings":[71,176,334],"duration":22.314,"turn_weight":1.5,"turn_duration":0.882,"mapbox_streets_v8":{"class":"tertiary"},"is_urban":false,"admin_index":0,"out":0,"weight":2168.867,"geometry_index":573,"location":[-115.252648,49.407113]},{"bearings":[58,101,278],"entry":[true,true,false],"in":2,"turn_weight":0.75,"turn_duration":0.009,"mapbox_streets_v8":{"class":"tertiary"},"is_urban":false,"admin_index":0,"out":1,"geometry_index":577,"location":[-115.249162,49.407036]}],"bannerInstructions":[{"primary":{"components":[{"type":"text","text":"Galloway Forest Service Road"}],"type":"turn","modifier":"slight right","text":"Galloway Forest Service Road"},"distanceAlongGeometry":1313.637}],"speedLimitUnit":"km/h","maneuver":{"type":"turn","instruction":"Turn right.","modifier":"right","bearing_after":71,"bearing_before":356,"location":[-115.252648,49.407113]},"speedLimitSign":"mutcd","name":"","weight_typical":11126.939,"duration_typical":110.9,"duration":110.9,"distance":1313.637,"driving_side":"right","weight":11126.939,"mode":"driving","geometry":"qgqf}AnymyzEwEw\\c@}^bCa_ApGc{A`@cJ~Eqh@|S{]vb@e[hQo\\~Li{@hJmkAtUifBhXcnAjl@mXz}@yYtU}m@pOgzAnDaj@"},{"voiceInstructions":[{"ssmlAnnouncement":"In a quarter mile, Turn left.","announcement":"In a quarter mile, Turn left.","distanceAlongGeometry":531.858},{"ssmlAnnouncement":"Turn left.","announcement":"Turn left.","distanceAlongGeometry":33.333}],"intersections":[{"bearings":[141,281,321],"entry":[true,false,true],"in":1,"turn_weight":6.5,"turn_duration":0.094,"mapbox_streets_v8":{"class":"tertiary"},"is_urban":false,"admin_index":0,"out":0,"geometry_index":591,"location":[-115.238059,49.402086]}],"bannerInstructions":[{"primary":{"components":[{"type":"text","text":"Turn left"}],"type":"turn","modifier":"left","text":"Turn left"},"distanceAlongGeometry":540.192}],"speedLimitUnit":"km/h","maneuver":{"type":"turn","instruction":"Bear right onto Galloway Forest Service Road.","modifier":"slight right","bearing_after":141,"bearing_before":101,"location":[-115.238059,49.402086]},"speedLimitSign":"mutcd","name":"Galloway Forest Service Road","weight_typical":4102.062,"duration_typical":40.594,"duration":40.594,"distance":540.192,"driving_side":"right","weight":4102.062,"mode":"driving","geometry":"kmgf}AtiqxzElt@cbA~mAshBl`AosAzPaOfT}M"},{"voiceInstructions":[{"ssmlAnnouncement":"In 400 feet, Turn left.","announcement":"In 400 feet, Turn left.","distanceAlongGeometry":127.048},{"ssmlAnnouncement":"Turn left.","announcement":"Turn left.","distanceAlongGeometry":26.667}],"intersections":[{"bearings":[76,158,335],"entry":[true,true,false],"in":2,"turn_weight":10,"turn_duration":3.913,"mapbox_streets_v8":{"class":"street"},"is_urban":false,"admin_index":0,"out":0,"geometry_index":596,"location":[-115.233447,49.398294]}],"bannerInstructions":[{"primary":{"components":[{"type":"text","text":"Turn left"}],"type":"turn","modifier":"left","text":"Turn left"},"distanceAlongGeometry":133.714}],"speedLimitUnit":"km/h","maneuver":{"type":"turn","instruction":"Turn left.","modifier":"left","bearing_after":76,"bearing_before":155,"location":[-115.233447,49.398294]},"speedLimitSign":"mutcd","name":"","weight_typical":2577.512,"duration_typical":29.302,"duration":29.302,"distance":133.714,"driving_side":"right","weight":2577.512,"mode":"driving","geometry":"k``f}AlihxzEcLspAaIeZ"},{"voiceInstructions":[{"ssmlAnnouncement":"Continue for a half mile.","announcement":"Continue for a half mile.","distanceAlongGeometry":896.028},{"ssmlAnnouncement":"In a quarter mile, Turn left.","announcement":"In a quarter mile, Turn left.","distanceAlongGeometry":402.336},{"ssmlAnnouncement":"Turn left.","announcement":"Turn left.","distanceAlongGeometry":26.667}],"intersections":[{"entry":[true,true,false],"in":2,"bearings":[8,44,240],"duration":5.328,"turn_weight":5,"turn_duration":0.828,"mapbox_streets_v8":{"class":"street"},"is_urban":false,"admin_index":0,"out":0,"weight":460.062,"geometry_index":598,"location":[-115.231706,49.398665]},{"bearings":[144,188,325],"entry":[true,false,true],"in":1,"turn_weight":1.5,"turn_duration":0.504,"mapbox_streets_v8":{"class":"street"},"is_urban":false,"admin_index":0,"out":2,"geometry_index":599,"location":[-115.231669,49.398843]}],"bannerInstructions":[{"primary":{"components":[{"type":"text","text":"Turn left"}],"type":"turn","modifier":"left","text":"Turn left"},"distanceAlongGeometry":902.695}],"speedLimitUnit":"km/h","maneuver":{"type":"turn","instruction":"Turn left.","modifier":"left","bearing_after":8,"bearing_before":60,"location":[-115.231706,49.398665]},"speedLimitSign":"mutcd","name":"","weight_typical":20552.574,"duration_typical":204.507,"duration":204.507,"distance":902.695,"driving_side":"right","weight":20552.574,"mode":"driving","geometry":"qw`f}Ar|dxzEcJiAwLvMw_@d]cfAkD_o@xWa{AnuAmgArn@oSk@g\\qd@}d@uAg\\y]"},{"voiceInstructions":[{"ssmlAnnouncement":"Continue for 1 mile.","announcement":"Continue for 1 mile.","distanceAlongGeometry":1834.876},{"ssmlAnnouncement":"In a quarter mile, You will arrive at your destination.","announcement":"In a quarter mile, You will arrive at your destination.","distanceAlongGeometry":402.336},{"ssmlAnnouncement":"You have arrived at your destination.","announcement":"You have arrived at your destination.","distanceAlongGeometry":27.778}],"intersections":[{"bearings":[61,214,329],"entry":[true,false,true],"in":1,"turn_weight":5,"turn_duration":2.017,"mapbox_streets_v8":{"class":"street"},"is_urban":false,"admin_index":0,"out":2,"geometry_index":609,"location":[-115.233686,49.405996]}],"bannerInstructions":[{"primary":{"components":[{"type":"text","text":"You will arrive at your destination"}],"type":"arrive","modifier":"straight","text":"You will arrive at your destination"},"distanceAlongGeometry":1841.543},{"primary":{"components":[{"type":"text","text":"You have arrived at your destination"}],"type":"arrive","modifier":"straight","text":"You have arrived at your destination"},"distanceAlongGeometry":27.778}],"speedLimitUnit":"km/h","maneuver":{"type":"turn","instruction":"Turn left.","modifier":"left","bearing_after":329,"bearing_before":34,"location":[-115.233686,49.405996]},"speedLimitSign":"mutcd","name":"","weight_typical":41889.359,"duration_typical":416.303,"duration":416.303,"distance":1841.543,"driving_side":"right","weight":41889.359,"mode":"driving","geometry":"waof}AjxhxzE{I`IeO~u@wQn\\mIpf@{^n\\_h@vM{PlNyTloAoPpj@sAz]aEbQwoAxWws@tC{xA|s@wX_Ew`BnZ}u@wKcOjDcd@d`BoLvIaZmNmP~@gw@hs@{fAz\\"},{"voiceInstructions":[],"intersections":[{"bearings":[165],"entry":[true],"in":0,"admin_index":0,"geometry_index":633,"location":[-115.243927,49.419375]}],"bannerInstructions":[],"speedLimitUnit":"km/h","maneuver":{"type":"arrive","instruction":"You have arrived at your destination.","bearing_after":0,"bearing_before":345,"location":[-115.243927,49.419375]},"speedLimitSign":"mutcd","name":"","weight_typical":0,"duration_typical":0,"duration":0,"distance":0,"driving_side":"right","weight":0,"mode":"driving","geometry":"}eig}Alx|xzE??"}],"distance":46024.16,"summary":"Wardner - Fort Steele Road, 3"},{"via_waypoints":[],"admins":[{"iso_3166_1_alpha3":"CAN","iso_3166_1":"CA"}],"notifications":[{"details":{"requested_value":"paved","actual_value":"gravel","message":"The road has an unpaved surface (gravel)."},"subtype":"unpaved","type":"violation","geometry_index_end":16,"geometry_index_start":0},{"details":{"requested_value":"paved","actual_value":"dirt","message":"The road has an unpaved surface (dirt)."},"subtype":"unpaved","type":"violation","geometry_index_end":19,"geometry_index_start":16},{"details":{"requested_value":"paved","actual_value":"gravel","message":"The road has an unpaved surface (gravel)."},"subtype":"unpaved","type":"violation","geometry_index_end":69,"geometry_index_start":19},{"details":{"requested_value":"paved","actual_value":"gravel","message":"The road has an unpaved surface (gravel)."},"subtype":"unpaved","type":"violation","geometry_index_end":138,"geometry_index_start":70}],"annotation":{"maxspeed":[{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true}],"congestion_numeric":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"speed":[4.4,4.4,4.4,4.4,4.4,4.4,4.4,4.4,4.4,4.4,4.4,4.4,4.4,4.4,4.4,4.4,0.6,0.6,0.6,11.9,11.9,11.9,11.9,11.9,11.9,11.9,11.9,11.9,11.9,11.9,11.9,11.9,11.9,11.9,11.9,11.9,11.9,11.9,11.9,11.9,11.9,11.9,11.9,11.9,11.9,11.9,11.9,11.9,11.9,11.9,11.9,11.9,11.9,11.9,11.9,11.9,11.9,11.9,11.9,11.9,11.9,11.9,11.9,11.9,11.9,11.9,11.9,12,12,12.1,6.9,6.9,6.9,6.9,6.9,6.9,6.9,6.9,6.9,6.9,6.9,6.9,6.9,6.9,6.9,6.9,6.9,6.9,6.9,6.9,6.9,6.9,6.9,6.9,6.9,6.9,6.9,6.9,6.9,6.9,6.9,6.9,6.9,6.9,6.9,6.9,6.9,6.9,6.9,6.9,6.9,6.9,6.9,6.9,6.9,6.9,6.9,6.9,6.9,6.9,6.9,6.9,6.9,6.9,6.9,6.9,6.9,6.9,6.9,6.9,6.9,6.9,6.9,6.9,6.9,6.9,6.9,6.9],"distance":[51.7,52.8,66.4,172.3,91.3,53,61.4,50,52.8,31.7,119.4,132.7,79.2,121.7,87.4,163.1,124.4,193.8,274.3,47.2,85.6,66.4,100.8,37.4,62.5,56.4,124.3,81.9,111.7,57.5,50,39.2,54.1,66.9,17.9,72.7,37.3,58.6,75.7,53.9,51.4,51.8,48.3,29.7,24.5,29.6,43.2,23.4,18.3,20,36,14.9,20.8,70.4,57.4,55.6,37.5,47.1,82.5,28.6,26.7,61.1,56.3,58.7,17,30.1,51.4,52,53.4,9.1,17.4,46.3,50.4,52.8,70,64.9,78.1,57.1,48.4,69,100.6,49.8,42,48,31.6,21.7,20.6,14.1,37.9,28.7,60.6,40.4,30.3,40.6,41.5,39.9,26.2,41,46.9,61,26.9,64.6,95.7,81.6,64.2,49.8,96,103.3,86.2,70.5,102.1,63.6,92,78.5,92.8,58.4,56,78.5,25.6,34.3,43.7,28.1,51,49.1,45.1,59.4,49,45,69.1,75,67.8,54.1,51.2,82.6,73.7,63.8,52,12.3],"duration":[11.652,11.878,14.926,38.783,20.528,11.935,13.806,11.265,11.866,7.148,26.852,29.844,17.82,27.373,19.671,36.701,229.617,348.743,493.264,4.785,7.166,5.558,8.436,3.136,5.231,4.721,10.409,6.858,9.353,4.812,4.19,3.284,4.526,5.602,1.517,6.089,3.116,4.908,6.337,4.511,4.304,4.333,4.039,2.488,2.054,2.473,3.621,1.958,1.53,1.67,3.019,1.242,1.747,5.888,4.802,4.657,3.14,3.939,6.909,2.393,2.24,5.109,4.711,4.918,1.418,2.523,4.3,4.364,4.458,0.754,2.496,6.671,7.258,7.595,10.084,9.352,11.234,8.224,6.971,9.934,14.493,7.172,6.044,6.905,4.558,3.121,2.98,2.031,5.456,4.13,8.742,5.819,4.358,5.848,5.98,5.752,3.779,5.902,6.769,8.78,3.892,9.294,13.778,11.752,9.243,7.167,13.821,14.877,12.404,10.164,14.699,9.152,13.249,11.307,13.356,8.415,8.056,11.299,3.691,4.939,6.289,4.048,7.346,7.061,6.498,8.547,7.06,6.481,9.949,10.798,9.763,7.787,7.373,11.893,10.609,9.183,7.49,1.774]},"weight_typical":543686.125,"duration_typical":2142.156,"weight":543686.125,"duration":2142.156,"steps":[{"voiceInstructions":[{"ssmlAnnouncement":"Drive north for 1 mile.","announcement":"Drive north for 1 mile.","distanceAlongGeometry":1386.983},{"ssmlAnnouncement":"In a quarter mile, Turn left.","announcement":"In a quarter mile, Turn left.","distanceAlongGeometry":402.336},{"ssmlAnnouncement":"Turn left.","announcement":"Turn left.","distanceAlongGeometry":26.667}],"intersections":[{"entry":[true],"bearings":[345],"duration":146.639,"mapbox_streets_v8":{"class":"street"},"is_urban":false,"admin_index":0,"out":0,"weight":14825.17,"geometry_index":0,"location":[-115.243927,49.419375]},{"entry":[true,false,true],"in":1,"bearings":[122,146,326],"duration":128.707,"turn_weight":1,"turn_duration":0.007,"mapbox_streets_v8":{"class":"street"},"is_urban":false,"admin_index":0,"out":2,"weight":13012.572,"geometry_index":9,"location":[-115.24698,49.424773]},{"bearings":[46,108,309],"entry":[true,false,true],"in":1,"turn_weight":1.5,"turn_duration":0.026,"mapbox_streets_v8":{"class":"street"},"is_urban":false,"admin_index":0,"out":2,"geometry_index":15,"location":[-115.252976,49.427933]}],"bannerInstructions":[{"primary":{"components":[{"type":"text","text":"Turn left"}],"type":"turn","modifier":"left","text":"Turn left"},"distanceAlongGeometry":1386.983}],"speedLimitUnit":"km/h","maneuver":{"type":"depart","instruction":"Drive north.","bearing_after":345,"bearing_before":0,"location":[-115.243927,49.419375]},"speedLimitSign":"mutcd","name":"","weight_typical":31547.086,"duration_typical":312.048,"duration":312.048,"distance":1386.983,"driving_side":"right","weight":31547.086,"mode":"driving","geometry":"}eig}Alx|xzEa[tJs\\j@wb@`OyuAv`A_o@nZiXbWma@k@{WbSoWpXwMjN}k@lkAwz@jcAs\\~q@e`@xzAgNvfA_y@~kB"},{"voiceInstructions":[{"ssmlAnnouncement":"Continue for a quarter mile.","announcement":"Continue for a quarter mile.","distanceAlongGeometry":591.79},{"ssmlAnnouncement":"In 300 feet, Turn right onto Galloway Forest Service Road.","announcement":"In 300 feet, Turn right onto Galloway Forest Service Road.","distanceAlongGeometry":91.44},{"ssmlAnnouncement":"Turn right.","announcement":"Turn right.","distanceAlongGeometry":2.667}],"intersections":[{"bearings":[6,129,214,296],"entry":[true,false,true,true],"in":1,"turn_weight":307.5,"turn_duration":6.024,"mapbox_streets_v8":{"class":"service"},"is_urban":false,"admin_index":0,"out":2,"geometry_index":16,"location":[-115.25472,49.428861]}],"bannerInstructions":[{"primary":{"components":[{"type":"text","text":"Galloway Forest Service Road"}],"type":"turn","modifier":"right","text":"Galloway Forest Service Road"},"distanceAlongGeometry":592.456}],"speedLimitUnit":"km/h","maneuver":{"type":"turn","instruction":"Turn left.","modifier":"left","bearing_after":214,"bearing_before":309,"location":[-115.25472,49.428861]},"speedLimitSign":"mutcd","name":"","weight_typical":430596.82,"duration_typical":1071.625,"duration":1071.625,"distance":592.456,"driving_side":"right","weight":430596.82,"mode":"driving","geometry":"yv{g}A~zqyzEpx@t{@paB`fAzmCfwA"},{"voiceInstructions":[{"ssmlAnnouncement":"Continue for 4 miles.","announcement":"Continue for 4 miles.","distanceAlongGeometry":6326.868},{"ssmlAnnouncement":"In a quarter mile, You will arrive at your destination.","announcement":"In a quarter mile, You will arrive at your destination.","distanceAlongGeometry":402.336},{"ssmlAnnouncement":"You have arrived at your destination.","announcement":"You have arrived at your destination.","distanceAlongGeometry":34.722}],"intersections":[{"entry":[false,true,true,true],"in":0,"bearings":[22,99,201,276],"duration":88.068,"turn_weight":8,"turn_duration":0.831,"mapbox_streets_v8":{"class":"tertiary"},"is_urban":false,"admin_index":0,"out":3,"weight":8827.688,"geometry_index":19,"location":[-115.25824,49.424077]},{"entry":[false,true,true],"in":0,"bearings":[97,275,341],"duration":117.9,"turn_weight":0.75,"turn_duration":0.021,"mapbox_streets_v8":{"class":"tertiary"},"is_urban":false,"admin_index":0,"out":1,"weight":11918.312,"geometry_index":34,"location":[-115.270707,49.428257]},{"entry":[false,true,true],"in":0,"bearings":[137,214,310],"duration":8.821,"turn_weight":0.75,"turn_duration":0.03,"mapbox_streets_v8":{"class":"tertiary"},"is_urban":false,"admin_index":0,"out":2,"weight":889.719,"geometry_index":67,"location":[-115.284374,49.43483]},{"entry":[false,true],"in":0,"bearings":[114,301],"duration":0.754,"turn_weight":5.75,"mapbox_streets_v8":{"class":"tertiary"},"is_urban":false,"admin_index":0,"out":1,"weight":6.406,"geometry_index":69,"location":[-115.285603,49.435322]},{"entry":[false,true],"in":0,"bearings":[121,293],"duration":122.112,"turn_weight":5005.75,"mapbox_streets_v8":{"class":"tertiary"},"is_urban":false,"admin_index":0,"out":1,"weight":17354.344,"geometry_index":70,"location":[-115.285711,49.435364]},{"entry":[false,true,true],"in":0,"bearings":[113,293,306],"duration":76.327,"turn_weight":0.75,"turn_duration":0.007,"mapbox_streets_v8":{"class":"tertiary"},"is_urban":false,"admin_index":0,"out":1,"weight":7716.688,"geometry_index":86,"location":[-115.296483,49.438113]},{"bearings":[115,298,338],"entry":[false,true,true],"in":0,"turn_weight":0.75,"turn_duration":0.008,"mapbox_streets_v8":{"class":"tertiary"},"is_urban":false,"admin_index":0,"out":1,"geometry_index":100,"location":[-115.30257,49.440555]}],"bannerInstructions":[{"primary":{"components":[{"type":"text","text":"You will arrive at your destination"}],"type":"arrive","modifier":"straight","text":"You will arrive at your destination"},"distanceAlongGeometry":6335.202},{"primary":{"components":[{"type":"text","text":"You have arrived at your destination"}],"type":"arrive","modifier":"straight","text":"You have arrived at your destination"},"distanceAlongGeometry":34.722}],"speedLimitUnit":"km/h","maneuver":{"type":"turn","instruction":"Turn right onto Galloway Forest Service Road.","modifier":"right","bearing_after":276,"bearing_before":202,"location":[-115.25824,49.424077]},"speedLimitSign":"mutcd","name":"Galloway Forest Service Road","weight_typical":81542.219,"duration_typical":758.483,"duration":758.483,"distance":6335.202,"driving_side":"right","weight":81542.219,"mode":"driving","geometry":"ykrg}A~vxyzEsApg@sMjeA}Grv@uNprAsHv[sPrm@_O~h@ol@jpAm\\hu@ci@lfAcTnd@uPp`@qHn]kErl@iCjx@[jNmAt}@cCn^mP|i@_W|t@qJ~i@kCzj@dApk@b@rh@dAlX?dTaB`Xv@fd@`@bSSvNmD`NqJpXyEjFiJtCke@jMw]vMm\\`OuS`EeYjD}k@lPqMjIgKjL{Wfc@aQzf@cOfk@_DlKiL`O}Sn]qQra@eKdi@sAvE}BtL}Gpd@gIpg@aLzg@cT~q@eOfq@uSjz@cOri@qEpg@sD|y@gFduA_Dhi@qHb`@gKzc@mIbUyCdPqCjOyAjJuDn^kCxVeMrn@aLn[qJbRgS`OyOxWmIn]wEbSuKn\\yMp`@sMpn@eFnS}Jrs@cLboA}GbdAkAhv@|@zi@ZzqAo@dxA[jiAtBt{@}EnvAkE~t@a@lnAsAtbAkCxnA}@jq@q@fo@ZvbALbUrCv[xHpa@nEbUjHrh@jJpe@vEpd@Lfr@gDph@qJpa@_Wzm@w[hn@{Zzf@mRzb@wO|b@_R``AsPpx@yOro@gPfc@{BxG"},{"voiceInstructions":[],"intersections":[{"bearings":[125],"entry":[true],"in":0,"admin_index":0,"geometry_index":138,"location":[-115.333568,49.444112]}],"bannerInstructions":[],"speedLimitUnit":"km/h","maneuver":{"type":"arrive","instruction":"You have arrived at your destination.","bearing_after":0,"bearing_before":305,"location":[-115.333568,49.444112]},"speedLimitSign":"mutcd","name":"Galloway Forest Service Road","weight_typical":0,"duration_typical":0,"duration":0,"distance":0,"driving_side":"right","weight":0,"mode":"driving","geometry":"_pyh}A~zk~zE??"}],"distance":8314.641,"summary":"Galloway Forest Service Road"}],"geometry":"_cpq}Axwbm{EgBsg@_DymAK{Or@eOnAqJ~CgJhCcF|GsF~d@{N`aFst@nrA_z@lyA_mBxrHucJbz@ijBdcCquEvpAorCt\\oz@nUcl@bYsgB|LgbBde@eh_@~E}nApLueA|Ne|@veBgcJbu@i~DpPs|ApEa|@~Col@nGqoAxPuoDtNs{CtJcoAxGkk@zO{z@jk@}xBfQ{o@t`@u{Anl@ktBv\\oy@bYmk@`z@qtAp`Am{Azr@e}@~hAorAnn@qu@bVwWd`@_`@fwD}uCbuAmfAbe@a^|S}MhSmJ`k@iKrg@_AzhBrDjqAjCvtBhErJc@tc@qBho@mRxa@mVnj@sh@vRsY|f@qeAzCqG~uAgcDbw@_kBtlBgkEnE}JxFsM`PeZ|Ykg@no@_m@d`@{^f]g\\zh@qe@tc@mWbd@}Kpt@iInk@oEju@sLrfB}_@|aAkSj`AgVpc@_Rz|BqjAvr@k]~mAep@`~BwnAf|@ce@~v@qa@n_@yThrAk~@~cAer@f\\gUx\\uSzZ}Kb\\uHl}Aw_@bq@gPxeAuWvw@qRp~Au^`f@eMt]qI|_@aHvaAiO|f@eNvWqK~^eQt[oRvo@gh@~k@ui@pf@ef@tj@mg@n`BmuAboA_eAti@kb@xnAkbAzb@_^nPuJxRmOhKoEzMaDtSuBnOb@bXlCbIlC~I`DbHfCbMvIrTzRtSjRhYjZhP~OfTlWrXfWzMvK~N~KvQxIlSzIpa@vKlg@pPzh@jWtd@tWnJfFjNlFfQdA|Ss@hXoPdWoPzQwJt[gNhXaFfTg@vS~B`R`GpVdM`SpRhRpUtMhWfKnXjNtn@rJjf@rHt_@zIvd@vEbXfLff@|HlRlJvOxO`PrPlKrPxDbTfCtRgEtQyFjQoOtMuPrJgRrHoTpCmMbDyO`Eu_@jD}\\jDw[~Ekd@`BiS`AcPd@sPIeSu@ce@{Fy|AmEozA`Ase@pCmd@rG}g@dB}KrCaM`BcHfCeJ`DuIxJaY~IyQjK{OdKiOdReUt`@qh@`\\ya@dImKvMuQ~FcItVmYpBeBz[gYz[uSzQcLdTkN|ReLd[iRb`Asl@jUiNnp@kf@tRkS`PyTbWod@`Ni\\fjAqcCvi@s}@~JoQh_@ep@zZwv@`Ret@dR{u@`Qig@rNcZxw@{kA|_@qk@`k@kv@jV}VjOiHhJs@|M`BnWxJvWxHhX~IrFbB~ItCzIxBpGhArGb@fHyA|GyFhIkJ~I_N`KcMbJsIbP_MxMgIzL}HpJaHtGoEjPsG`OeFzSsIbMwGpMyMnIqKtUiXtPqQhf@_i@l^ea@x\\m`@h[e_@jc@mj@jQsTfWk]zRgYzImNbOoVtQeXlJ{O|HyOdOu_@hIeRrGgJ|HkH|HiCpGe@fIMbHUzFuApFuA|FkCfHqEhN}IzKiHpHkF~KmKnH{GhJsJpH_JbNcOzIoJvNsL`GuCxJeEpOmGjR_IxSkI|JiDf]kMbQ{F~\\cM`f@_OtUqGtY_F~ZqF|TqDvQwCrS}C`WcEdZmFxLmBxXyEvQoCdMcB|GApHj@rGdArFpArIlDjN|FdOfGhQzHvMvGxKdEjGpCzFvBjFdB|HnAzGx@bJlBvDb@lD~@lIhCdTqh@dKgShTia@dpCmaFnX{f@vUyb@tx@}wArz@uzAvd@mx@hVsc@|d@{x@tc@cw@f_@}p@nuGslL`l@kcAnwBa{D|NmZ~NyV|_@kr@xVmc@bf@yy@dZsc@xTg\\zY}_@lTuYjZaa@pZ{`@`a@kh@t\\ad@bYi_@t\\sg@zYcf@|Xgh@hXwf@`NeVxK_UdVmf@`Vig@`Rs^`N{V`Tic@xU{d@zSga@~P__@bNyW`Qg]fJgSbQ__@|NkXnLyUzQ{`@|N{ZrVog@bSq`@bOc[`KaU~GaQtBgFrA}DjC}I|FeQjjB}gGtRqo@vMgc@hjAwwD~c@sgBn`@seCfmAebMlW}gD|EgnCk@}}D~E_~A|S_uBlWytAve@sgBzvCqkIlhBojFhj@{yBtoAw|Fb_@aqAve@_iAjz@{tA~lCsqDnGuIndAgsAlqFg}HzE_HbZsk@hUcm@hRat@tM{j@tGmb@tE{a@|D}b@bBk^nBkn@Lim@gAop@uCki@oH}y@iDa\\wL}o@oSigAc]}iBoGmc@}Hci@_Ikm@yF}c@mBaQsHaw@wH_mA_P}cCkEkq@}\\wrEwMuiBeD{g@uEct@o@oj@BeGJ}n@|A_h@fCca@|Dei@~Hmf@fLml@mPgUe\\sv@_M}VsPab@gXqo@uI_RkWen@{Yep@kMqYmXwo@kOi_@wIqU_HuT{EsWaHyn@_Ha|@uEqh@sHeu@aNof@oWip@a`@k|@kUsg@uTo`@sO_K}IkAkUVoYxD{v@~K_}@jLy[`CaSkDwRgJ_KkHqA_AyZyTuNwHe]uHwp@zB{[lBsPq@{FOyMmCsIqEkHiIuHkKcFyJkLoXeJcTyIiUsGeMqKqMKoOx@qLx@uJ~BiKrCmHfOw[lM{[rHiVbE_S`Qem@zH{`@tHo^|D{StEoQvCsWLkVsAyPwDoSiEkM_LmPkTaL}_@yMgWuLoXeKaNaHe]sMiDm@qKwA{HcAaXqE}ZuJoTqEeObAkEfEqJtRuNxq@aPlv@k]`r@aWp_@iKzLgS}a@yMiTkOkLqHaGiXtAks@jDwiFnd@or@vE_Z`DmWtAgI^wEw\\c@}^bCa_ApGc{A`@cJ~Eqh@|S{]vb@e[hQo\\~Li{@hJmkAtUifBhXcnAjl@mXz}@yYtU}m@pOgzAnDaj@lt@cbA~mAshBl`AosAzPaOfT}McLspAaIeZcJiAwLvMw_@d]cfAkD_o@xWa{AnuAmgArn@oSk@g\\qd@}d@uAg\\y]{I`IeO~u@wQn\\mIpf@{^n\\_h@vM{PlNyTloAoPpj@sAz]aEbQwoAxWws@tC{xA|s@wX_Ew`BnZ}u@wKcOjDcd@d`BoLvIaZmNmP~@gw@hs@{fAz\\a[tJs\\j@wb@`OyuAv`A_o@nZiXbWma@k@{WbSoWpXwMjN}k@lkAwz@jcAs\\~q@e`@xzAgNvfA_y@~kBpx@t{@paB`fAzmCfwAsApg@sMjeA}Grv@uNprAsHv[sPrm@_O~h@ol@jpAm\\hu@ci@lfAcTnd@uPp`@qHn]kErl@iCjx@[jNmAt}@cCn^mP|i@_W|t@qJ~i@kCzj@dApk@b@rh@dAlX?dTaB`Xv@fd@`@bSSvNmD`NqJpXyEjFiJtCke@jMw]vMm\\`OuS`EeYjD}k@lPqMjIgKjL{Wfc@aQzf@cOfk@_DlKiL`O}Sn]qQra@eKdi@sAvE}BtL}Gpd@gIpg@aLzg@cT~q@eOfq@uSjz@cOri@qEpg@sD|y@gFduA_Dhi@qHb`@gKzc@mIbUyCdPqCjOyAjJuDn^kCxVeMrn@aLn[qJbRgS`OyOxWmIn]wEbSuKn\\yMp`@sMpn@eFnS}Jrs@cLboA}GbdAkAhv@|@zi@ZzqAo@dxA[jiAtBt{@}EnvAkE~t@a@lnAsAtbAkCxnA}@jq@q@fo@ZvbALbUrCv[xHpa@nEbUjHrh@jJpe@vEpd@Lfr@gDph@qJpa@_Wzm@w[hn@{Zzf@mRzb@wO|b@_R``AsPpx@yOro@gPfc@{BxG","voiceLocale":"en-US"}],"waypoints":[{"distance":0.047,"name":"Wardner - Fort Steele Road","location":[-115.574669,49.586752]},{"distance":0.019,"name":"","location":[-115.243927,49.419375]},{"distance":0.012,"name":"Galloway Forest Service Road","location":[-115.333568,49.444112]}],"code":"Ok","uuid":"route_with_notifications"}
\ No newline at end of file
diff --git a/instrumentation-tests/src/main/res/raw/route_with_notifications_refresh1.json b/instrumentation-tests/src/main/res/raw/route_with_notifications_refresh1.json
new file mode 100644
index 00000000000..326b32d64d3
--- /dev/null
+++ b/instrumentation-tests/src/main/res/raw/route_with_notifications_refresh1.json
@@ -0,0 +1 @@
+{"code":"Ok","route":{"legs":[{"annotation":{"maxspeed":[{"speed":100,"unit":"km/h"},{"speed":100,"unit":"km/h"},{"speed":100,"unit":"km/h"},{"speed":100,"unit":"km/h"},{"speed":100,"unit":"km/h"},{"speed":100,"unit":"km/h"},{"speed":100,"unit":"km/h"},{"speed":100,"unit":"km/h"},{"speed":100,"unit":"km/h"},{"speed":100,"unit":"km/h"},{"speed":100,"unit":"km/h"},{"speed":100,"unit":"km/h"},{"speed":100,"unit":"km/h"},{"speed":100,"unit":"km/h"},{"speed":100,"unit":"km/h"},{"speed":100,"unit":"km/h"},{"speed":100,"unit":"km/h"},{"speed":100,"unit":"km/h"},{"speed":100,"unit":"km/h"},{"speed":100,"unit":"km/h"},{"speed":100,"unit":"km/h"},{"speed":100,"unit":"km/h"},{"speed":100,"unit":"km/h"},{"speed":100,"unit":"km/h"},{"speed":100,"unit":"km/h"},{"speed":100,"unit":"km/h"},{"speed":100,"unit":"km/h"},{"speed":100,"unit":"km/h"},{"speed":100,"unit":"km/h"},{"speed":100,"unit":"km/h"},{"speed":100,"unit":"km/h"},{"speed":100,"unit":"km/h"},{"speed":100,"unit":"km/h"},{"speed":100,"unit":"km/h"},{"speed":100,"unit":"km/h"},{"speed":70,"unit":"km/h"},{"speed":70,"unit":"km/h"},{"speed":70,"unit":"km/h"},{"speed":70,"unit":"km/h"},{"speed":70,"unit":"km/h"},{"speed":70,"unit":"km/h"},{"speed":70,"unit":"km/h"},{"speed":70,"unit":"km/h"},{"speed":70,"unit":"km/h"},{"speed":70,"unit":"km/h"},{"speed":70,"unit":"km/h"},{"speed":70,"unit":"km/h"},{"speed":70,"unit":"km/h"},{"speed":70,"unit":"km/h"},{"speed":70,"unit":"km/h"},{"speed":70,"unit":"km/h"},{"speed":70,"unit":"km/h"},{"speed":70,"unit":"km/h"},{"speed":70,"unit":"km/h"},{"speed":70,"unit":"km/h"},{"speed":70,"unit":"km/h"},{"speed":70,"unit":"km/h"},{"speed":70,"unit":"km/h"},{"speed":70,"unit":"km/h"},{"speed":70,"unit":"km/h"},{"speed":70,"unit":"km/h"},{"speed":70,"unit":"km/h"},{"speed":70,"unit":"km/h"},{"speed":70,"unit":"km/h"},{"speed":70,"unit":"km/h"},{"speed":70,"unit":"km/h"},{"speed":70,"unit":"km/h"},{"speed":70,"unit":"km/h"},{"speed":70,"unit":"km/h"},{"speed":70,"unit":"km/h"},{"speed":70,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"speed":50,"unit":"km/h"},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true}],"congestion_numeric":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,null,0,0,0,0,0,0,0,8,8,8,8,0,0,0,null,0,0,0,null,0,0,8,8,8,8,0,0,0,0,0,0,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"speed":[27.3,27.3,27.3,27.3,27.3,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,27.8,22.8,22.8,22.8,22.8,20.6,19.4,19.4,19.4,19.4,19.4,19.4,19.4,20.6,20.6,20.6,20.6,21.6,21.6,21.6,20.7,22,22,22,21.5,22.8,22.8,21.7,21.7,21.7,21.7,21.9,21.9,21.9,21.9,21.9,21.9,7.3,12,12,12.5,12.5,12.5,12.5,12.5,13.9,13.9,13.9,13.9,13.9,13.9,13.9,13.9,13.9,13.9,13.9,13.9,13.9,13.9,13.9,13.9,11.1,11.1,11.1,11.1,11.1,11.1,11.1,11.1,11.1,13.9,13.9,13.9,13.9,13.9,13.9,13.9,13.9,13.9,13.9,13.9,13.9,13.9,13.9,13.9,13.9,13.9,13.9,12.8,12.8,12.8,12.8,12.8,12.8,12.8,12.8,12.8,11.1,11.1,11.1,11.1,11.1,11.1,11.1,11.1,11.1,11.1,11.1,11.1,11.1,11.1,11.1,11.1,11.1,11.1,10.9,11.1,11.1,11.1,11.1,11.1,10.3,10.3,10.3,10.3,10.3,10.3,10.3,10.8,10.8,10.8,10.8,10.8,10.8,10.8,10.3,12,12,12,11.9,11.9,11.9,11.9,11.9,11.9,11.9,11.9,11.9,11.9,11.9,11.9,11.9,11.9,11.9,11.9,11.9,11.9,13.3,13.3,13.3,13.3,13.3,5.3,5.3,4.4,4.4,4.4,4.4,4.4,4.4,4.4,4.4,4.4,4.4,4.4,4.4,4.4,4.4,4.4,4.4,4.4,4.4,4.4,4.4,4.4,4.4,4.4,4.4,4.4,4.4,4.4,4.4,4.4,4.4,4.4,4.4,4.4,4.4,4.4],"distance":[43.4,33.4,26.4,10.7,8.3,14.9,25.4,361.7,66.4,49.5,252.7,138,167.1,541.3,200.6,166.5,221.3,110.9,141.8,108.5,139.6,471,331.3,162,327.5,111,110.1,145.2,326.9,19.6,157.7,568,16.1,70.8,66.6,70.5,57.2,44,42.1,43,36.8,55.3,53.7,57.6,49.8,70.4,35,61.8,91.5,135.1,44.9,52,56.6,45.1,21.8,67.2,92.1,157.1,59.5,251.3,126.5,48.3,62.7,50.5,9.5,55.6,47.8,40.3,50.1,49,57.8,40.4,82.8,37.3,51.4,72,29.2,69.8,74.5,40,72.5,47.4,32.5,29.8,31.1,57.7,72.6,49.6,65.2,53,72,92.3,61.7,54.8,32.7,19.7,39.9,47.6,100.7,111.5,51.5,36.3,37.5,24,5.1,55.7,30.1,54.9,88.7,51.6,31.5,14,26.9,20.4,20.5,22.5,18.6,38,31.6,32.2,22.5,28.1,19.1,16,14,15.9,13.7,44.2,42.2,32,25.6,62.5,43,40.4,26.4,24.5,29.8,27.1,21.2,25.9,20.1,30.7,41,61.1,46,47.6,28.8,56.4,9.6,22.6,17.7,45.3,51.6,39,29,13.4,30.8,65.2,71.1,80.1,57.1,27.2,54.3,36.1,33,19.5,45.2,93.5,420.3,92.1,48.4,43.7,18.3,36.5,37,74.7,107.8,13,49.8,51.7,71.5,47.3,74.2,90.9,126.3,102.2,86.1,116.2,67.7,109.8,50.9,122.9,186.6,152.2,36.9,41.6,97.5,36.2,20,29.9,68,126.8,90.2,192.2,140.4,36.5,67.9,67.6,63.2,22.6,70,47.8,49.4,66.3,75,36.5,101,59.4,36,23.7,146.6,94.1,171.5,46.4,177,98.9,29.4,130.6,27.1,51.4,31.1,117.1,132.6],"duration":[1.594,1.226,0.968,0.391,0.305,0.562,0.914,13.024,2.387,1.784,9.097,4.969,6.015,19.485,7.222,5.995,7.969,3.99,5.104,3.909,5.024,16.955,11.929,5.832,11.787,3.997,3.964,5.229,11.767,0.705,5.677,20.45,0.578,2.549,2.399,3.098,2.514,1.93,1.853,2.113,1.921,2.847,2.765,2.963,2.566,3.625,1.802,3.031,4.446,6.568,2.182,2.423,2.621,2.083,1.056,3.06,4.191,7.149,2.776,11.06,5.556,2.236,2.895,2.331,0.438,2.545,2.183,1.839,2.284,2.24,2.635,8.871,6.941,3.12,4.12,5.768,2.33,5.591,5.96,2.889,5.212,3.416,2.332,2.145,2.235,4.154,5.223,3.571,4.685,3.826,5.185,6.658,4.448,3.949,2.358,1.849,3.59,4.294,9.065,10.043,4.641,3.267,3.379,2.159,0.376,4.006,2.171,3.956,6.39,3.715,2.265,1.011,1.936,1.469,1.479,1.616,1.345,2.734,2.274,2.322,1.621,2.019,1.721,1.258,1.091,1.25,1.073,3.459,3.307,2.508,2.008,5.622,3.866,3.629,2.373,2.215,2.676,2.437,1.903,2.326,1.807,2.763,3.683,5.541,4.15,4.289,2.598,5.084,0.866,2.07,1.602,4.085,4.652,3.522,2.61,1.534,2.991,6.343,6.917,7.803,5.557,2.646,6.558,3.337,3.049,1.794,4.172,8.632,38.81,8.958,4.042,3.641,1.526,3.938,3.103,6.245,9.028,1.1,4.167,4.329,5.994,3.958,6.216,7.609,10.584,8.559,7.205,9.734,5.676,9.196,4.26,9.311,13.984,11.414,2.765,3.12,22.419,6.884,5.328,7.227,15.31,28.548,20.302,43.259,31.585,8.226,15.281,15.225,14.216,7.103,15.739,10.752,11.131,14.909,16.873,8.216,22.72,13.348,8.118,5.313,32.996,21.172,38.566,10.436,39.818,22.263,6.611,29.379,6.092,11.566,7.007,26.343,29.834]}},{"annotation":{"maxspeed":[{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true}],"congestion_numeric":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"speed":[4.4,4.4,4.4,4.4,4.4,4.4,4.4,4.4,4.4,4.4,4.4,4.4,4.4,4.4,4.4,4.4,0.6,0.6,0.6,11.9,11.9,11.9,11.9,11.9,11.9,11.9,11.9,11.9,11.9,11.9,11.9,11.9,11.9,11.9,11.9,11.9,11.9,11.9,11.9,11.9,11.9,11.9,11.9,11.9,11.9,11.9,11.9,11.9,11.9,11.9,11.9,11.9,11.9,11.9,11.9,11.9,11.9,11.9,11.9,11.9,11.9,11.9,11.9,11.9,11.9,11.9,11.9,12,12,12.1,6.9,6.9,6.9,6.9,6.9,6.9,6.9,6.9,6.9,6.9,6.9,6.9,6.9,6.9,6.9,6.9,6.9,6.9,6.9,6.9,6.9,6.9,6.9,6.9,6.9,6.9,6.9,6.9,6.9,6.9,6.9,6.9,6.9,6.9,6.9,6.9,6.9,6.9,6.9,6.9,6.9,6.9,6.9,6.9,6.9,6.9,6.9,6.9,6.9,6.9,6.9,6.9,6.9,6.9,6.9,6.9,6.9,6.9,6.9,6.9,6.9,6.9,6.9,6.9,6.9,6.9,6.9,6.9],"distance":[51.8,52.8,66.4,172.3,91.3,53,61.4,50,52.8,31.7,119.4,132.6,79.3,121.6,87.5,163.1,124.3,193.9,274.3,47.2,85.6,66.4,100.7,37.5,62.5,56.4,124.3,81.9,111.7,57.5,50,39.2,54.1,66.9,17.9,72.7,37.3,58.6,75.7,53.9,51.4,51.8,48.2,29.8,24.5,29.6,43.2,23.4,18.3,19.9,36.1,14.9,20.8,70.4,57.3,55.7,37.5,47,82.6,28.6,26.7,61.1,56.3,58.7,17,30.1,51.4,51.9,53.5,9.1,17.4,46.3,50.4,52.7,70.1,64.9,78,57.2,48.4,69,100.6,49.8,42,48,31.6,21.7,20.6,14.1,37.9,28.7,60.6,40.4,30.3,40.5,41.5,40,26.2,41,46.9,61,26.9,64.6,95.7,81.6,64.2,49.8,96,103.3,86.1,70.6,102.1,63.6,92,78.5,92.8,58.4,56,78.5,25.6,34.3,43.7,28.1,51,49.1,45.1,59.3,49.1,45,69.1,75,67.8,54.1,51.2,82.6,73.7,63.7,52.1,12.3],"duration":[11.652,11.878,14.926,38.783,20.528,11.935,13.806,11.265,11.866,7.148,26.852,29.844,17.82,27.373,19.671,36.701,229.617,348.743,493.264,4.785,7.166,5.558,8.436,3.136,5.231,4.721,10.409,6.858,9.353,4.812,4.19,3.284,4.526,5.602,1.517,6.089,3.116,4.908,6.337,4.511,4.304,4.333,4.039,2.488,2.054,2.473,3.621,1.958,1.53,1.67,3.019,1.242,1.747,5.888,4.802,4.657,3.14,3.939,6.909,2.393,2.24,5.109,4.711,4.918,1.418,2.523,4.3,4.364,4.458,0.754,2.496,6.671,7.258,7.595,10.084,9.352,11.234,8.224,6.971,9.934,14.493,7.172,6.044,6.905,4.558,3.121,2.98,2.031,5.456,4.13,8.742,5.819,4.358,5.848,5.98,5.752,3.779,5.902,6.769,8.78,3.892,9.294,13.778,11.752,9.243,7.167,13.821,14.877,12.404,10.164,14.699,9.152,13.249,11.307,13.356,8.415,8.056,11.299,3.691,4.939,6.289,4.048,7.346,7.061,6.498,8.547,7.06,6.481,9.949,10.798,9.763,7.787,7.373,11.893,10.609,9.183,7.49,1.774]}}]}}
\ No newline at end of file
diff --git a/libnavigation-base/api/current.txt b/libnavigation-base/api/current.txt
index ab4fd389021..49acf405c4b 100644
--- a/libnavigation-base/api/current.txt
+++ b/libnavigation-base/api/current.txt
@@ -1281,6 +1281,7 @@ package com.mapbox.navigation.base.trip.model.roadobject {
field public static final int INCIDENT = 6; // 0x6
field public static final com.mapbox.navigation.base.trip.model.roadobject.RoadObjectType INSTANCE;
field public static final int JCT = 10; // 0xa
+ field public static final int NOTIFICATION = 11; // 0xb
field public static final int RAILWAY_CROSSING = 8; // 0x8
field public static final int RESTRICTED_AREA = 4; // 0x4
field public static final int REST_STOP = 3; // 0x3
@@ -1288,7 +1289,7 @@ package com.mapbox.navigation.base.trip.model.roadobject {
field public static final int TUNNEL = 0; // 0x0
}
- @IntDef({com.mapbox.navigation.base.trip.model.roadobject.RoadObjectType.TUNNEL, com.mapbox.navigation.base.trip.model.roadobject.RoadObjectType.COUNTRY_BORDER_CROSSING, com.mapbox.navigation.base.trip.model.roadobject.RoadObjectType.TOLL_COLLECTION, com.mapbox.navigation.base.trip.model.roadobject.RoadObjectType.REST_STOP, com.mapbox.navigation.base.trip.model.roadobject.RoadObjectType.RESTRICTED_AREA, com.mapbox.navigation.base.trip.model.roadobject.RoadObjectType.BRIDGE, com.mapbox.navigation.base.trip.model.roadobject.RoadObjectType.INCIDENT, com.mapbox.navigation.base.trip.model.roadobject.RoadObjectType.CUSTOM, com.mapbox.navigation.base.trip.model.roadobject.RoadObjectType.RAILWAY_CROSSING, com.mapbox.navigation.base.trip.model.roadobject.RoadObjectType.IC, com.mapbox.navigation.base.trip.model.roadobject.RoadObjectType.JCT}) @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) public static @interface RoadObjectType.Type {
+ @IntDef({com.mapbox.navigation.base.trip.model.roadobject.RoadObjectType.TUNNEL, com.mapbox.navigation.base.trip.model.roadobject.RoadObjectType.COUNTRY_BORDER_CROSSING, com.mapbox.navigation.base.trip.model.roadobject.RoadObjectType.TOLL_COLLECTION, com.mapbox.navigation.base.trip.model.roadobject.RoadObjectType.REST_STOP, com.mapbox.navigation.base.trip.model.roadobject.RoadObjectType.RESTRICTED_AREA, com.mapbox.navigation.base.trip.model.roadobject.RoadObjectType.BRIDGE, com.mapbox.navigation.base.trip.model.roadobject.RoadObjectType.INCIDENT, com.mapbox.navigation.base.trip.model.roadobject.RoadObjectType.CUSTOM, com.mapbox.navigation.base.trip.model.roadobject.RoadObjectType.RAILWAY_CROSSING, com.mapbox.navigation.base.trip.model.roadobject.RoadObjectType.IC, com.mapbox.navigation.base.trip.model.roadobject.RoadObjectType.JCT, com.mapbox.navigation.base.trip.model.roadobject.RoadObjectType.NOTIFICATION}) @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) public static @interface RoadObjectType.Type {
}
public final class UpcomingRoadObject {
@@ -1638,6 +1639,46 @@ package com.mapbox.navigation.base.trip.model.roadobject.location {
}
+package com.mapbox.navigation.base.trip.model.roadobject.notification {
+
+ public final class Notification extends com.mapbox.navigation.base.trip.model.roadobject.RoadObject {
+ method public com.mapbox.navigation.base.trip.model.roadobject.notification.NotificationInfo getInfo();
+ property public final com.mapbox.navigation.base.trip.model.roadobject.notification.NotificationInfo info;
+ }
+
+ public final class NotificationInfo {
+ method public String? getActualValue();
+ method public String? getMessage();
+ method public String? getRequestedValue();
+ method public String? getSubtype();
+ method public String getType();
+ method public String? getUnit();
+ property public final String? actualValue;
+ property public final String? message;
+ property public final String? requestedValue;
+ property public final String? subtype;
+ property public final String type;
+ property public final String? unit;
+ field public static final com.mapbox.navigation.base.trip.model.roadobject.notification.NotificationInfo.Companion Companion;
+ field public static final String NOTIFICATION_SUBTYPE_MAX_HEIGHT = "maxHeight";
+ field public static final String NOTIFICATION_SUBTYPE_MAX_WEIGHT = "maxWeight";
+ field public static final String NOTIFICATION_SUBTYPE_MAX_WIDTH = "maxWidth";
+ field public static final String NOTIFICATION_SUBTYPE_POINT_EXCLUSION = "pointExclusion";
+ field public static final String NOTIFICATION_SUBTYPE_UNPAVED = "unpaved";
+ field public static final String NOTIFICATION_TYPE_VIOLATION = "violation";
+ }
+
+ public static final class NotificationInfo.Companion {
+ }
+
+ @StringDef({com.mapbox.navigation.base.trip.model.roadobject.notification.NotificationInfo.NOTIFICATION_SUBTYPE_MAX_HEIGHT, com.mapbox.navigation.base.trip.model.roadobject.notification.NotificationInfo.NOTIFICATION_SUBTYPE_MAX_WIDTH, com.mapbox.navigation.base.trip.model.roadobject.notification.NotificationInfo.NOTIFICATION_SUBTYPE_MAX_WEIGHT, com.mapbox.navigation.base.trip.model.roadobject.notification.NotificationInfo.NOTIFICATION_SUBTYPE_UNPAVED, com.mapbox.navigation.base.trip.model.roadobject.notification.NotificationInfo.NOTIFICATION_SUBTYPE_POINT_EXCLUSION}) @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) public static @interface NotificationInfo.Companion.NotificationsSubtype {
+ }
+
+ @StringDef(com.mapbox.navigation.base.trip.model.roadobject.notification.NotificationInfo.NOTIFICATION_TYPE_VIOLATION) @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) public static @interface NotificationInfo.Companion.NotificationsType {
+ }
+
+}
+
package com.mapbox.navigation.base.trip.model.roadobject.railwaycrossing {
public final class RailwayCrossing extends com.mapbox.navigation.base.trip.model.roadobject.RoadObject {
diff --git a/libnavigation-base/src/main/java/com/mapbox/navigation/base/internal/factory/RoadObjectFactory.kt b/libnavigation-base/src/main/java/com/mapbox/navigation/base/internal/factory/RoadObjectFactory.kt
index 95ea9845a5b..5d05e038c20 100644
--- a/libnavigation-base/src/main/java/com/mapbox/navigation/base/internal/factory/RoadObjectFactory.kt
+++ b/libnavigation-base/src/main/java/com/mapbox/navigation/base/internal/factory/RoadObjectFactory.kt
@@ -25,6 +25,7 @@ object RoadObjectFactory {
RoadObjectType.RAILWAY_CROSSING,
RoadObjectType.IC,
RoadObjectType.JCT,
+ RoadObjectType.NOTIFICATION,
)
fun List.toUpcomingRoadObjects():
diff --git a/libnavigation-base/src/main/java/com/mapbox/navigation/base/trip/model/roadobject/RoadObject.kt b/libnavigation-base/src/main/java/com/mapbox/navigation/base/trip/model/roadobject/RoadObject.kt
index cf77584bb52..34a97e38676 100644
--- a/libnavigation-base/src/main/java/com/mapbox/navigation/base/trip/model/roadobject/RoadObject.kt
+++ b/libnavigation-base/src/main/java/com/mapbox/navigation/base/trip/model/roadobject/RoadObject.kt
@@ -23,6 +23,7 @@ import com.mapbox.navigation.base.trip.model.roadobject.location.RoadObjectLocat
* - [RoadObjectType.CUSTOM]
* - [RoadObjectType.IC]
* - [RoadObjectType.JCT]
+ * - [RoadObjectType.NOTIFICATION]
*
* @param length length of the object, null if the object is point-like.
* @param provider provider of the road object
diff --git a/libnavigation-base/src/main/java/com/mapbox/navigation/base/trip/model/roadobject/RoadObjectMapper.kt b/libnavigation-base/src/main/java/com/mapbox/navigation/base/trip/model/roadobject/RoadObjectMapper.kt
index 153f7ebb54a..f67ca2ecb7b 100644
--- a/libnavigation-base/src/main/java/com/mapbox/navigation/base/trip/model/roadobject/RoadObjectMapper.kt
+++ b/libnavigation-base/src/main/java/com/mapbox/navigation/base/trip/model/roadobject/RoadObjectMapper.kt
@@ -10,6 +10,7 @@ import com.mapbox.navigation.base.trip.model.roadobject.ic.Interchange
import com.mapbox.navigation.base.trip.model.roadobject.incident.Incident
import com.mapbox.navigation.base.trip.model.roadobject.jct.Junction
import com.mapbox.navigation.base.trip.model.roadobject.notification.Notification
+import com.mapbox.navigation.base.trip.model.roadobject.notification.NotificationInfo
import com.mapbox.navigation.base.trip.model.roadobject.railwaycrossing.RailwayCrossing
import com.mapbox.navigation.base.trip.model.roadobject.restrictedarea.RestrictedArea
import com.mapbox.navigation.base.trip.model.roadobject.reststop.RestStop
@@ -148,6 +149,16 @@ internal fun com.mapbox.navigator.RoadObject.mapToRoadObject(): RoadObject {
)
RoadObjectType.NOTIFICATION -> Notification(
id,
+ metadata.notificationInfo.let {
+ NotificationInfo(
+ it.type,
+ it.subType,
+ it.details.requestedValue,
+ it.details.actualValue,
+ it.details.unit,
+ it.details.message,
+ )
+ },
length,
provider,
isUrban,
diff --git a/libnavigation-base/src/main/java/com/mapbox/navigation/base/trip/model/roadobject/RoadObjectType.kt b/libnavigation-base/src/main/java/com/mapbox/navigation/base/trip/model/roadobject/RoadObjectType.kt
index 7ffcce2f984..0bc1dbbe3c1 100644
--- a/libnavigation-base/src/main/java/com/mapbox/navigation/base/trip/model/roadobject/RoadObjectType.kt
+++ b/libnavigation-base/src/main/java/com/mapbox/navigation/base/trip/model/roadobject/RoadObjectType.kt
@@ -76,9 +76,9 @@ object RoadObjectType {
const val JCT = 10
/**
- * Not finished yet, see https://mapbox.atlassian.net/browse/NAVAND-1311
+ * Type of [NOTIFICATION] - corresponds to route notification.
*/
- internal const val NOTIFICATION = 11
+ const val NOTIFICATION = 11
/**
* Retention policy for the RoadObjectType
@@ -96,6 +96,7 @@ object RoadObjectType {
RAILWAY_CROSSING,
IC,
JCT,
+ NOTIFICATION,
)
annotation class Type
}
diff --git a/libnavigation-base/src/main/java/com/mapbox/navigation/base/trip/model/roadobject/notification/Notification.kt b/libnavigation-base/src/main/java/com/mapbox/navigation/base/trip/model/roadobject/notification/Notification.kt
index 991824a0fde..cd4d9e18fe5 100644
--- a/libnavigation-base/src/main/java/com/mapbox/navigation/base/trip/model/roadobject/notification/Notification.kt
+++ b/libnavigation-base/src/main/java/com/mapbox/navigation/base/trip/model/roadobject/notification/Notification.kt
@@ -9,9 +9,12 @@ import com.mapbox.navigation.base.trip.model.roadobject.RoadObjectType
*
* @see RoadObject
* @see RoadObjectType.NOTIFICATION
+ *
+ * @param info notification details, see [NotificationInfo]
*/
-internal class Notification internal constructor(
+class Notification internal constructor(
id: String,
+ val info: NotificationInfo,
length: Double?,
@RoadObjectProvider.Type provider: String,
isUrban: Boolean?,
@@ -33,6 +36,10 @@ internal class Notification internal constructor(
if (javaClass != other?.javaClass) return false
if (!super.equals(other)) return false
+ other as Notification
+
+ if (info != other.info) return false
+
return true
}
@@ -40,13 +47,17 @@ internal class Notification internal constructor(
* Returns a hash code value for the object.
*/
override fun hashCode(): Int {
- return super.hashCode()
+ var result = super.hashCode()
+ result = 31 * result + info.hashCode()
+ return result
}
+
/**
* Returns a string representation of the object.
*/
override fun toString(): String {
- return "Notification"
+ return "Notification(info=$info) ${super.toString()}"
}
+
}
diff --git a/libnavigation-base/src/main/java/com/mapbox/navigation/base/trip/model/roadobject/notification/NotificationInfo.kt b/libnavigation-base/src/main/java/com/mapbox/navigation/base/trip/model/roadobject/notification/NotificationInfo.kt
new file mode 100644
index 00000000000..c3dc5aea6b8
--- /dev/null
+++ b/libnavigation-base/src/main/java/com/mapbox/navigation/base/trip/model/roadobject/notification/NotificationInfo.kt
@@ -0,0 +1,134 @@
+package com.mapbox.navigation.base.trip.model.roadobject.notification
+
+import androidx.annotation.StringDef
+import com.mapbox.api.directions.v5.DirectionsCriteria.NOTIFICATION_TYPE_VIOLATION
+
+
+/**
+ * Class containing detailed information about a notification (see [Notification]).
+ *
+ * @param type notification type, for possible values see [].
+ * @param subtype notification subtype, for possible values see [].
+ * @param requestedValue the value passed in route request which was not respected.
+ * @param actualValue the value used in route response instead of the value passed in route request.
+ * @param unit unit in which requestedValue and actualValue are specified.
+ * @param message a string describing the parameter violation.
+ */
+class NotificationInfo internal constructor(
+ @NotificationsType val type: String,
+ @NotificationsSubtype val subtype: String?,
+ val requestedValue: String?,
+ val actualValue: String?,
+ val unit: String?,
+ val message: String?
+) {
+
+ companion object {
+
+ /**
+ * Violation notification type. [NotificationInfo.type] will have this value
+ * if some request parameters were violated.
+ */
+ const val NOTIFICATION_TYPE_VIOLATION = "violation"
+
+ /**
+ * Max height notification subtype of type [NOTIFICATION_TYPE_VIOLATION].
+ * [NotificationInfo.subtype] will have this value if `maxHeight` parameter is violated.
+ */
+ const val NOTIFICATION_SUBTYPE_MAX_HEIGHT = "maxHeight"
+
+ /**
+ * Max width notification subtype of type [NOTIFICATION_TYPE_VIOLATION].
+ * [NotificationInfo.subtype] will have this value if `maxWidth` parameter is violated.
+ */
+ const val NOTIFICATION_SUBTYPE_MAX_WIDTH = "maxWidth"
+
+ /**
+ * Max weight notification subtype of type [NOTIFICATION_TYPE_VIOLATION].
+ * [NotificationInfo.subtype] will have this value if `maxWeight` parameter is violated.
+ */
+ const val NOTIFICATION_SUBTYPE_MAX_WEIGHT = "maxWeight"
+
+ /**
+ * Unpaved notification subtype of type [NOTIFICATION_TYPE_VIOLATION].
+ * [NotificationInfo.subtype] will have this value
+ * if `exclude` parameter with value "unpaved" is violated.
+ */
+ const val NOTIFICATION_SUBTYPE_UNPAVED = "unpaved"
+
+ /**
+ * Point exclusion notification subtype of type [NOTIFICATION_TYPE_VIOLATION].
+ * [NotificationInfo.subtype] will have this value
+ * if `exclude` parameter with point value is violated.
+ */
+ const val NOTIFICATION_SUBTYPE_POINT_EXCLUSION = "pointExclusion"
+
+ /**
+ * Supported notification types. See [NotificationInfo.type].
+ */
+ @Retention(AnnotationRetention.BINARY)
+ @StringDef(
+ NOTIFICATION_TYPE_VIOLATION
+ )
+ annotation class NotificationsType
+
+ /**
+ * Supported notification subtypes. See [NotificationInfo.subtype].
+ */
+ @Retention(AnnotationRetention.BINARY)
+ @StringDef(
+ NOTIFICATION_SUBTYPE_MAX_HEIGHT,
+ NOTIFICATION_SUBTYPE_MAX_WIDTH,
+ NOTIFICATION_SUBTYPE_MAX_WEIGHT,
+ NOTIFICATION_SUBTYPE_UNPAVED,
+ NOTIFICATION_SUBTYPE_POINT_EXCLUSION
+ )
+ annotation class NotificationsSubtype
+ }
+
+ /**
+ * Indicates whether some other object is "equal to" this one.
+ */
+ override fun equals(other: Any?): Boolean {
+ if (this === other) return true
+ if (javaClass != other?.javaClass) return false
+
+ other as NotificationInfo
+
+ if (type != other.type) return false
+ if (subtype != other.subtype) return false
+ if (requestedValue != other.requestedValue) return false
+ if (actualValue != other.actualValue) return false
+ if (unit != other.unit) return false
+ if (message != other.message) return false
+
+ return true
+ }
+
+ /**
+ * Returns a hash code value for the object.
+ */
+ override fun hashCode(): Int {
+ var result = type.hashCode()
+ result = 31 * result + (subtype?.hashCode() ?: 0)
+ result = 31 * result + (requestedValue?.hashCode() ?: 0)
+ result = 31 * result + (actualValue?.hashCode() ?: 0)
+ result = 31 * result + (unit?.hashCode() ?: 0)
+ result = 31 * result + (message?.hashCode() ?: 0)
+ return result
+ }
+
+ /**
+ * Returns a string representation of the object.
+ */
+ override fun toString(): String {
+ return "NotificationInfo(" +
+ "type='$type', " +
+ "subtype=$subtype, " +
+ "requestedValue=$requestedValue, " +
+ "actualValue=$actualValue, " +
+ "unit=$unit, " +
+ "message=$message" +
+ ")"
+ }
+}
diff --git a/libnavigation-base/src/test/java/com/mapbox/navigation/base/internal/factory/RoadObjectFactoryTest.kt b/libnavigation-base/src/test/java/com/mapbox/navigation/base/internal/factory/RoadObjectFactoryTest.kt
index e0ced581229..1830e88fc8f 100644
--- a/libnavigation-base/src/test/java/com/mapbox/navigation/base/internal/factory/RoadObjectFactoryTest.kt
+++ b/libnavigation-base/src/test/java/com/mapbox/navigation/base/internal/factory/RoadObjectFactoryTest.kt
@@ -18,6 +18,7 @@ import com.mapbox.navigation.base.trip.model.roadobject.incident.IncidentInfo
import com.mapbox.navigation.base.trip.model.roadobject.incident.IncidentType
import com.mapbox.navigation.base.trip.model.roadobject.jct.Junction
import com.mapbox.navigation.base.trip.model.roadobject.notification.Notification
+import com.mapbox.navigation.base.trip.model.roadobject.notification.NotificationInfo
import com.mapbox.navigation.base.trip.model.roadobject.railwaycrossing.RailwayCrossing
import com.mapbox.navigation.base.trip.model.roadobject.railwaycrossing.RailwayCrossingInfo
import com.mapbox.navigation.base.trip.model.roadobject.restrictedarea.RestrictedArea
@@ -295,11 +296,19 @@ class RoadObjectFactoryTest {
}
@Test
- fun `buildRoadObject - unsupported notification`() {
+ fun `buildRoadObject - notification`() {
val nativeObject = notification
val expected = Notification(
ID,
+ NotificationInfo(
+ NotificationInfo.NOTIFICATION_TYPE_VIOLATION,
+ NotificationInfo.NOTIFICATION_SUBTYPE_MAX_HEIGHT,
+ "2.5",
+ "3.1",
+ "m",
+ "some message"
+ ),
LENGTH,
SDKRoadObjectProvider.MAPBOX,
false,
@@ -329,13 +338,10 @@ class RoadObjectFactoryTest {
).mapIndexed { distanceToStart, roadObject ->
UpcomingRouteAlert(roadObject, distanceToStart.toDouble())
}
- // notification object isn't supported yet,
- // see https://mapbox.atlassian.net/browse/NAVAND-1311
- val unsupportedObjectsCount = 1
val sdkObjects = nativeObjects.toUpcomingRoadObjects()
- assertEquals(nativeObjects.size - unsupportedObjectsCount, sdkObjects.size)
+ assertEquals(nativeObjects.size, sdkObjects.size)
assertTrue(sdkObjects[0].roadObject is Tunnel)
assertTrue(sdkObjects[1].roadObject is CountryBorderCrossing)
assertTrue(sdkObjects[2].roadObject is TollCollection)
@@ -347,7 +353,8 @@ class RoadObjectFactoryTest {
assertTrue(sdkObjects[8].roadObject is RailwayCrossing)
assertTrue(sdkObjects[9].roadObject is Interchange)
assertTrue(sdkObjects[10].roadObject is Junction)
- sdkObjects.dropLast(unsupportedObjectsCount).forEachIndexed { distanceToStart, obj ->
+ assertTrue(sdkObjects[11].roadObject is Notification)
+ sdkObjects.forEachIndexed { distanceToStart, obj ->
assertEquals(distanceToStart.toDouble(), obj.distanceToStart)
}
}
@@ -519,7 +526,19 @@ class RoadObjectFactoryTest {
private val notification = createRoadObject(
type = com.mapbox.navigator.RoadObjectType.NOTIFICATION,
- location = matchedRoadObjectLocation(location.shape)
+ location = matchedRoadObjectLocation(location.shape),
+ notificationInfo = com.mapbox.navigator.NotificationInfo(
+ "violation",
+ "maxHeight",
+ 123,
+ 145,
+ com.mapbox.navigator.NotificationDetails(
+ "2.5",
+ "3.1",
+ "m",
+ "some message"
+ )
+ )
)
private fun createRoadObject(
@@ -533,6 +552,7 @@ class RoadObjectFactoryTest {
railwayCrossingInfo: com.mapbox.navigator.RailwayCrossingInfo? = null,
icInfo: com.mapbox.navigator.IcInfo? = null,
jctInfo: com.mapbox.navigator.JctInfo? = null,
+ notificationInfo: com.mapbox.navigator.NotificationInfo? = null,
id: String = ID
): RoadObject {
val metadata = when (type) {
@@ -552,6 +572,8 @@ class RoadObjectFactoryTest {
RoadObjectMetadata.valueOf(icInfo!!)
com.mapbox.navigator.RoadObjectType.JCT ->
RoadObjectMetadata.valueOf(jctInfo!!)
+ com.mapbox.navigator.RoadObjectType.NOTIFICATION ->
+ RoadObjectMetadata.valueOf(notificationInfo!!)
else -> mockk()
}