diff options
| author | Copilot <198982749+Copilot@users.noreply.github.com> | 2025-06-26 23:44:25 +0200 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2025-06-26 23:44:25 +0200 |
| commit | 7b8594debceb93a1fa400d48fe1dcff943bd5af6 (patch) | |
| tree | 73e68c7238a91d8931d669364d395ce2994164f4 /src/frontend | |
| parent | 3dac17a9fb54c977c97280ed4c482e9d4266b7de (diff) | |
Implement stop sheet modal for map stop interactions (#27)
Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: arielcostas <94913521+arielcostas@users.noreply.github.com>
Co-authored-by: Ariel Costas Guerrero <ariel@costas.dev>
Diffstat (limited to 'src/frontend')
38 files changed, 2657 insertions, 6274 deletions
diff --git a/src/frontend/app/AppContext.tsx b/src/frontend/app/AppContext.tsx index d8db66d..e6d8971 100644 --- a/src/frontend/app/AppContext.tsx +++ b/src/frontend/app/AppContext.tsx @@ -1,10 +1,16 @@ /* eslint-disable react-refresh/only-export-components */ -import { createContext, useContext, useEffect, useState, type ReactNode } from 'react'; -import { type LngLatLike } from 'maplibre-gl'; +import { + createContext, + useContext, + useEffect, + useState, + type ReactNode, +} from "react"; +import { type LngLatLike } from "maplibre-gl"; -type Theme = 'light' | 'dark'; -type TableStyle = 'regular'|'grouped'; -type MapPositionMode = 'gps' | 'last'; +type Theme = "light" | "dark"; +type TableStyle = "regular" | "grouped"; +type MapPositionMode = "gps" | "last"; interface MapState { center: LngLatLike; @@ -42,56 +48,62 @@ const AppContext = createContext<AppContextProps | undefined>(undefined); export const AppProvider = ({ children }: { children: ReactNode }) => { //#region Theme const [theme, setTheme] = useState<Theme>(() => { - const savedTheme = localStorage.getItem('theme'); + const savedTheme = localStorage.getItem("theme"); if (savedTheme) { return savedTheme as Theme; } - const prefersDark = window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches; - return prefersDark ? 'dark' : 'light'; + const prefersDark = + window.matchMedia && + window.matchMedia("(prefers-color-scheme: dark)").matches; + return prefersDark ? "dark" : "light"; }); const toggleTheme = () => { - setTheme((prevTheme) => (prevTheme === 'light' ? 'dark' : 'light')); + setTheme((prevTheme) => (prevTheme === "light" ? "dark" : "light")); }; useEffect(() => { - document.documentElement.setAttribute('data-theme', theme); - localStorage.setItem('theme', theme); + document.documentElement.setAttribute("data-theme", theme); + localStorage.setItem("theme", theme); }, [theme]); //#endregion //#region Table Style const [tableStyle, setTableStyle] = useState<TableStyle>(() => { - const savedTableStyle = localStorage.getItem('tableStyle'); + const savedTableStyle = localStorage.getItem("tableStyle"); if (savedTableStyle) { return savedTableStyle as TableStyle; } - return 'regular'; + return "regular"; }); const toggleTableStyle = () => { - setTableStyle((prevTableStyle) => (prevTableStyle === 'regular' ? 'grouped' : 'regular')); - } + setTableStyle((prevTableStyle) => + prevTableStyle === "regular" ? "grouped" : "regular", + ); + }; useEffect(() => { - localStorage.setItem('tableStyle', tableStyle); + localStorage.setItem("tableStyle", tableStyle); }, [tableStyle]); //#endregion //#region Map Position Mode - const [mapPositionMode, setMapPositionMode] = useState<MapPositionMode>(() => { - const saved = localStorage.getItem('mapPositionMode'); - return saved === 'last' ? 'last' : 'gps'; - }); + const [mapPositionMode, setMapPositionMode] = useState<MapPositionMode>( + () => { + const saved = localStorage.getItem("mapPositionMode"); + return saved === "last" ? "last" : "gps"; + }, + ); useEffect(() => { - localStorage.setItem('mapPositionMode', mapPositionMode); + localStorage.setItem("mapPositionMode", mapPositionMode); }, [mapPositionMode]); //#endregion //#region Map State const [mapState, setMapState] = useState<MapState>(() => { - const savedMapState = localStorage.getItem('mapState'); + const savedMapState = localStorage.getItem("mapState"); if (savedMapState) { try { const parsed = JSON.parse(savedMapState); @@ -99,56 +111,56 @@ export const AppProvider = ({ children }: { children: ReactNode }) => { center: parsed.center || DEFAULT_CENTER, zoom: parsed.zoom || DEFAULT_ZOOM, userLocation: parsed.userLocation || null, - hasLocationPermission: parsed.hasLocationPermission || false + hasLocationPermission: parsed.hasLocationPermission || false, }; } catch (e) { - console.error('Error parsing saved map state', e); + console.error("Error parsing saved map state", e); } } return { center: DEFAULT_CENTER, zoom: DEFAULT_ZOOM, userLocation: null, - hasLocationPermission: false + hasLocationPermission: false, }; }); const setMapCenter = (center: LngLatLike) => { - setMapState(prev => { + setMapState((prev) => { const newState = { ...prev, center }; - localStorage.setItem('mapState', JSON.stringify(newState)); + localStorage.setItem("mapState", JSON.stringify(newState)); return newState; }); }; const setMapZoom = (zoom: number) => { - setMapState(prev => { + setMapState((prev) => { const newState = { ...prev, zoom }; - localStorage.setItem('mapState', JSON.stringify(newState)); + localStorage.setItem("mapState", JSON.stringify(newState)); return newState; }); }; const setUserLocation = (userLocation: LngLatLike | null) => { - setMapState(prev => { + setMapState((prev) => { const newState = { ...prev, userLocation }; - localStorage.setItem('mapState', JSON.stringify(newState)); + localStorage.setItem("mapState", JSON.stringify(newState)); return newState; }); }; const setLocationPermission = (hasLocationPermission: boolean) => { - setMapState(prev => { + setMapState((prev) => { const newState = { ...prev, hasLocationPermission }; - localStorage.setItem('mapState', JSON.stringify(newState)); + localStorage.setItem("mapState", JSON.stringify(newState)); return newState; }); }; const updateMapState = (center: LngLatLike, zoom: number) => { - setMapState(prev => { + setMapState((prev) => { const newState = { ...prev, center, zoom }; - localStorage.setItem('mapState', JSON.stringify(newState)); + localStorage.setItem("mapState", JSON.stringify(newState)); return newState; }); }; @@ -164,31 +176,33 @@ export const AppProvider = ({ children }: { children: ReactNode }) => { setUserLocation([latitude, longitude]); }, (error) => { - console.error('Error getting location:', error); + console.error("Error getting location:", error); setLocationPermission(false); - } + }, ); } } }, [mapState.hasLocationPermission, mapState.userLocation]); return ( - <AppContext.Provider value={{ - theme, - setTheme, - toggleTheme, - tableStyle, - setTableStyle, - toggleTableStyle, - mapState, - setMapCenter, - setMapZoom, - setUserLocation, - setLocationPermission, - updateMapState, - mapPositionMode, - setMapPositionMode - }}> + <AppContext.Provider + value={{ + theme, + setTheme, + toggleTheme, + tableStyle, + setTableStyle, + toggleTableStyle, + mapState, + setMapCenter, + setMapZoom, + setUserLocation, + setLocationPermission, + updateMapState, + mapPositionMode, + setMapPositionMode, + }} + > {children} </AppContext.Provider> ); @@ -197,7 +211,7 @@ export const AppProvider = ({ children }: { children: ReactNode }) => { export const useApp = () => { const context = useContext(AppContext); if (!context) { - throw new Error('useApp must be used within a AppProvider'); + throw new Error("useApp must be used within a AppProvider"); } return context; }; diff --git a/src/frontend/app/ErrorBoundary.tsx b/src/frontend/app/ErrorBoundary.tsx index 5c877b7..c11a82b 100644 --- a/src/frontend/app/ErrorBoundary.tsx +++ b/src/frontend/app/ErrorBoundary.tsx @@ -1,4 +1,4 @@ -import React, { Component, type ReactNode } from 'react'; +import React, { Component, type ReactNode } from "react"; interface ErrorBoundaryProps { children: ReactNode; @@ -14,14 +14,14 @@ class ErrorBoundary extends Component<ErrorBoundaryProps, ErrorBoundaryState> { super(props); this.state = { hasError: false, - error: null + error: null, }; } static getDerivedStateFromError(error: Error): ErrorBoundaryState { return { hasError: true, - error + error, }; } @@ -31,12 +31,12 @@ class ErrorBoundary extends Component<ErrorBoundaryProps, ErrorBoundaryState> { render() { if (this.state.hasError) { - return <> - <h1>Something went wrong.</h1> - <pre> - {this.state.error?.stack} - </pre> - </>; + return ( + <> + <h1>Something went wrong.</h1> + <pre>{this.state.error?.stack}</pre> + </> + ); } return this.props.children; diff --git a/src/frontend/app/components/GroupedTable.tsx b/src/frontend/app/components/GroupedTable.tsx index 3a16d89..47c2d31 100644 --- a/src/frontend/app/components/GroupedTable.tsx +++ b/src/frontend/app/components/GroupedTable.tsx @@ -2,73 +2,79 @@ import { type StopDetails } from "../routes/estimates-$id"; import LineIcon from "./LineIcon"; interface GroupedTable { - data: StopDetails; - dataDate: Date | null; + data: StopDetails; + dataDate: Date | null; } export const GroupedTable: React.FC<GroupedTable> = ({ data, dataDate }) => { - const formatDistance = (meters: number) => { - if (meters > 1024) { - return `${(meters / 1000).toFixed(1)} km`; - } else { - return `${meters} m`; - } + const formatDistance = (meters: number) => { + if (meters > 1024) { + return `${(meters / 1000).toFixed(1)} km`; + } else { + return `${meters} m`; } + }; - const groupedEstimates = data.estimates.reduce((acc, estimate) => { - if (!acc[estimate.line]) { - acc[estimate.line] = []; - } - acc[estimate.line].push(estimate); - return acc; - }, {} as Record<string, typeof data.estimates>); + const groupedEstimates = data.estimates.reduce( + (acc, estimate) => { + if (!acc[estimate.line]) { + acc[estimate.line] = []; + } + acc[estimate.line].push(estimate); + return acc; + }, + {} as Record<string, typeof data.estimates>, + ); - const sortedLines = Object.keys(groupedEstimates).sort((a, b) => { - const firstArrivalA = groupedEstimates[a][0].minutes; - const firstArrivalB = groupedEstimates[b][0].minutes; - return firstArrivalA - firstArrivalB; - }); + const sortedLines = Object.keys(groupedEstimates).sort((a, b) => { + const firstArrivalA = groupedEstimates[a][0].minutes; + const firstArrivalB = groupedEstimates[b][0].minutes; + return firstArrivalA - firstArrivalB; + }); - return <table className="table"> - <caption>Estimaciones de llegadas a las {dataDate?.toLocaleTimeString()}</caption> + return ( + <table className="table"> + <caption> + Estimaciones de llegadas a las {dataDate?.toLocaleTimeString()} + </caption> - <thead> - <tr> - <th>Línea</th> - <th>Ruta</th> - <th>Llegada</th> - <th>Distancia</th> - </tr> - </thead> - - <tbody> - {sortedLines.map((line) => ( - groupedEstimates[line].map((estimate, idx) => ( - <tr key={`${line}-${idx}`}> - {idx === 0 && ( - <td rowSpan={groupedEstimates[line].length}> - <LineIcon line={line} /> - </td> - )} - <td>{estimate.route}</td> - <td>{`${estimate.minutes} min`}</td> - <td> - {estimate.meters > -1 - ? formatDistance(estimate.meters) - : "No disponible" - } - </td> - </tr> - )) - ))} - </tbody> + <thead> + <tr> + <th>Línea</th> + <th>Ruta</th> + <th>Llegada</th> + <th>Distancia</th> + </tr> + </thead> - {data?.estimates.length === 0 && ( - <tfoot> - <tr> - <td colSpan={4}>No hay estimaciones disponibles</td> - </tr> - </tfoot> + <tbody> + {sortedLines.map((line) => + groupedEstimates[line].map((estimate, idx) => ( + <tr key={`${line}-${idx}`}> + {idx === 0 && ( + <td rowSpan={groupedEstimates[line].length}> + <LineIcon line={line} /> + </td> + )} + <td>{estimate.route}</td> + <td>{`${estimate.minutes} min`}</td> + <td> + {estimate.meters > -1 + ? formatDistance(estimate.meters) + : "No disponible"} + </td> + </tr> + )), )} + </tbody> + + {data?.estimates.length === 0 && ( + <tfoot> + <tr> + <td colSpan={4}>No hay estimaciones disponibles</td> + </tr> + </tfoot> + )} </table> -} + ); +}; diff --git a/src/frontend/app/components/LineIcon.css b/src/frontend/app/components/LineIcon.css index e7e8949..4b39351 100644 --- a/src/frontend/app/components/LineIcon.css +++ b/src/frontend/app/components/LineIcon.css @@ -55,7 +55,8 @@ font-weight: 600; text-transform: uppercase; color: inherit; - /* Prevent color change on hover */ + background-color: white; + border-radius: 0.25rem 0.25rem 0 0; } .line-c1 { @@ -236,4 +237,4 @@ .line-u2 { border-color: var(--line-u2); -}
\ No newline at end of file +} diff --git a/src/frontend/app/components/LineIcon.tsx b/src/frontend/app/components/LineIcon.tsx index 291b444..3d613e6 100644 --- a/src/frontend/app/components/LineIcon.tsx +++ b/src/frontend/app/components/LineIcon.tsx @@ -1,5 +1,5 @@ -import React from 'react'; -import './LineIcon.css'; +import React from "react"; +import "./LineIcon.css"; interface LineIconProps { line: string; diff --git a/src/frontend/app/components/NavBar.tsx b/src/frontend/app/components/NavBar.tsx index eba7196..6a06e63 100644 --- a/src/frontend/app/components/NavBar.tsx +++ b/src/frontend/app/components/NavBar.tsx @@ -9,14 +9,14 @@ function isWithinVigo(lngLat: LngLatLike): boolean { let lng: number, lat: number; if (Array.isArray(lngLat)) { [lng, lat] = lngLat; - } else if ('lng' in lngLat && 'lat' in lngLat) { + } else if ("lng" in lngLat && "lat" in lngLat) { lng = lngLat.lng; lat = lngLat.lat; } else { return false; } // Rough bounding box for Vigo - return lat >= 42.18 && lat <= 42.30 && lng >= -8.78 && lng <= -8.65; + return lat >= 42.18 && lat <= 42.3 && lng >= -8.78 && lng <= -8.65; } export default function NavBar() { @@ -25,20 +25,20 @@ export default function NavBar() { const navItems = [ { - name: t('navbar.stops', 'Paradas'), + name: t("navbar.stops", "Paradas"), icon: MapPin, - path: '/stops' + path: "/stops", }, { - name: t('navbar.map', 'Mapa'), + name: t("navbar.map", "Mapa"), icon: Map, - path: '/map', + path: "/map", callback: () => { - if (mapPositionMode !== 'gps') { + if (mapPositionMode !== "gps") { return; } - if (!('geolocation' in navigator)) { + if (!("geolocation" in navigator)) { return; } @@ -50,20 +50,20 @@ export default function NavBar() { updateMapState(coords, 16); } }, - () => { } + () => {}, ); - } + }, }, { - name: t('navbar.settings', 'Ajustes'), + name: t("navbar.settings", "Ajustes"), icon: Settings, - path: '/settings' - } + path: "/settings", + }, ]; return ( <nav className="navigation-bar"> - {navItems.map(item => { + {navItems.map((item) => { const Icon = item.icon; const isActive = location.pathname.startsWith(item.path); @@ -71,7 +71,7 @@ export default function NavBar() { <Link key={item.name} to={item.path} - className={`navigation-bar__link ${isActive ? 'active' : ''}`} + className={`navigation-bar__link ${isActive ? "active" : ""}`} onClick={item.callback ? item.callback : undefined} title={item.name} aria-label={item.name} diff --git a/src/frontend/app/components/RegularTable.tsx b/src/frontend/app/components/RegularTable.tsx index e5b3782..8b01410 100644 --- a/src/frontend/app/components/RegularTable.tsx +++ b/src/frontend/app/components/RegularTable.tsx @@ -3,70 +3,85 @@ import { type StopDetails } from "../routes/estimates-$id"; import LineIcon from "./LineIcon"; interface RegularTableProps { - data: StopDetails; - dataDate: Date | null; + data: StopDetails; + dataDate: Date | null; } -export const RegularTable: React.FC<RegularTableProps> = ({ data, dataDate }) => { - const { t } = useTranslation(); +export const RegularTable: React.FC<RegularTableProps> = ({ + data, + dataDate, +}) => { + const { t } = useTranslation(); - const absoluteArrivalTime = (minutes: number) => { - const now = new Date() - const arrival = new Date(now.getTime() + minutes * 60000) - return Intl.DateTimeFormat(navigator.language, { - hour: '2-digit', - minute: '2-digit' - }).format(arrival) - } + const absoluteArrivalTime = (minutes: number) => { + const now = new Date(); + const arrival = new Date(now.getTime() + minutes * 60000); + return Intl.DateTimeFormat( + typeof navigator !== "undefined" ? navigator.language : "en", + { + hour: "2-digit", + minute: "2-digit", + } + ).format(arrival); + }; - const formatDistance = (meters: number) => { - if (meters > 1024) { - return `${(meters / 1000).toFixed(1)} km`; - } else { - return `${meters} ${t('estimates.meters', 'm')}`; - } + const formatDistance = (meters: number) => { + if (meters > 1024) { + return `${(meters / 1000).toFixed(1)} km`; + } else { + return `${meters} ${t("estimates.meters", "m")}`; } + }; - return <table className="table"> - <caption>{t('estimates.caption', 'Estimaciones de llegadas a las {{time}}', { time: dataDate?.toLocaleTimeString() })}</caption> + return ( + <table className="table"> + <caption> + {t("estimates.caption", "Estimaciones de llegadas a las {{time}}", { + time: dataDate?.toLocaleTimeString(), + })} + </caption> - <thead> - <tr> - <th>{t('estimates.line', 'Línea')}</th> - <th>{t('estimates.route', 'Ruta')}</th> - <th>{t('estimates.arrival', 'Llegada')}</th> - <th>{t('estimates.distance', 'Distancia')}</th> - </tr> - </thead> + <thead> + <tr> + <th>{t("estimates.line", "Línea")}</th> + <th>{t("estimates.route", "Ruta")}</th> + <th>{t("estimates.arrival", "Llegada")}</th> + <th>{t("estimates.distance", "Distancia")}</th> + </tr> + </thead> - <tbody> - {data.estimates - .sort((a, b) => a.minutes - b.minutes) - .map((estimate, idx) => ( - <tr key={idx}> - <td><LineIcon line={estimate.line} /></td> - <td>{estimate.route}</td> - <td> - {estimate.minutes > 15 - ? absoluteArrivalTime(estimate.minutes) - : `${estimate.minutes} ${t('estimates.minutes', 'min')}`} - </td> - <td> - {estimate.meters > -1 - ? formatDistance(estimate.meters) - : t('estimates.not_available', 'No disponible') - } - </td> - </tr> - ))} - </tbody> + <tbody> + {data.estimates + .sort((a, b) => a.minutes - b.minutes) + .map((estimate, idx) => ( + <tr key={idx}> + <td> + <LineIcon line={estimate.line} /> + </td> + <td>{estimate.route}</td> + <td> + {estimate.minutes > 15 + ? absoluteArrivalTime(estimate.minutes) + : `${estimate.minutes} ${t("estimates.minutes", "min")}`} + </td> + <td> + {estimate.meters > -1 + ? formatDistance(estimate.meters) + : t("estimates.not_available", "No disponible")} + </td> + </tr> + ))} + </tbody> - {data?.estimates.length === 0 && ( - <tfoot> - <tr> - <td colSpan={4}>{t('estimates.none', 'No hay estimaciones disponibles')}</td> - </tr> - </tfoot> - )} + {data?.estimates.length === 0 && ( + <tfoot> + <tr> + <td colSpan={4}> + {t("estimates.none", "No hay estimaciones disponibles")} + </td> + </tr> + </tfoot> + )} </table> -} + ); +}; diff --git a/src/frontend/app/components/StopItem.css b/src/frontend/app/components/StopItem.css index 9feb2d1..54ab136 100644 --- a/src/frontend/app/components/StopItem.css +++ b/src/frontend/app/components/StopItem.css @@ -51,4 +51,4 @@ top: 0; color: #0078d4; font-weight: bold; -}
\ No newline at end of file +} diff --git a/src/frontend/app/components/StopItem.tsx b/src/frontend/app/components/StopItem.tsx index 29370b7..b781eb9 100644 --- a/src/frontend/app/components/StopItem.tsx +++ b/src/frontend/app/components/StopItem.tsx @@ -1,22 +1,21 @@ -import React from 'react'; -import { Link } from 'react-router'; -import StopDataProvider, { type Stop } from '../data/StopDataProvider'; -import LineIcon from './LineIcon'; +import React from "react"; +import { Link } from "react-router"; +import StopDataProvider, { type Stop } from "../data/StopDataProvider"; +import LineIcon from "./LineIcon"; interface StopItemProps { stop: Stop; } const StopItem: React.FC<StopItemProps> = ({ stop }) => { - return ( <li className="list-item"> <Link className="list-item-link" to={`/estimates/${stop.stopId}`}> - {stop.favourite && <span className="favourite-icon">★</span>} ({stop.stopId}) {StopDataProvider.getDisplayName(stop)} + {stop.favourite && <span className="favourite-icon">★</span>} ( + {stop.stopId}) {StopDataProvider.getDisplayName(stop)} <div className="line-icons"> - {stop.lines?.map(line => <LineIcon key={line} line={line} />)} + {stop.lines?.map((line) => <LineIcon key={line} line={line} />)} </div> - </Link> </li> ); diff --git a/src/frontend/app/components/StopSheet.css b/src/frontend/app/components/StopSheet.css new file mode 100644 index 0000000..3f7621e --- /dev/null +++ b/src/frontend/app/components/StopSheet.css @@ -0,0 +1,146 @@ +/* Stop Sheet Styles */ +.stop-sheet-content { + padding: 16px; + display: flex; + flex-direction: column; + overflow: hidden; +} + +.stop-sheet-header { + display: flex; + align-items: center; + gap: 8px; + margin-bottom: 16px; +} + +.stop-sheet-title { + font-size: 1.5rem; + font-weight: 600; + color: var(--text-color); + margin: 0; +} + +.stop-sheet-id { + font-size: 1rem; + color: var(--subtitle-color); +} + +.stop-sheet-loading { + display: flex; + justify-content: center; + align-items: center; + padding: 32px; + color: var(--subtitle-color); + font-size: 1rem; +} + +.stop-sheet-estimates { + flex: 1; + overflow-y: auto; + min-height: 0; +} + +.stop-sheet-subtitle { + font-size: 1.1rem; + font-weight: 500; + color: var(--text-color); + margin: 0 0 12px 0; +} + +.stop-sheet-no-estimates { + text-align: center; + padding: 32px 16px; + color: var(--subtitle-color); + font-size: 0.95rem; +} + +.stop-sheet-estimates-list { + display: flex; + flex-direction: column; + gap: 12px; +} + +.stop-sheet-estimate-item { + display: flex; + align-items: center; + gap: 12px; + padding: 12px; + background-color: var(--message-background-color); + border-radius: 8px; + border: 1px solid var(--border-color); +} + +.stop-sheet-estimate-line { + flex-shrink: 0; +} + +.stop-sheet-estimate-details { + flex: 1; + min-width: 0; +} + +.stop-sheet-estimate-route { + font-weight: 500; + color: var(--text-color); + font-size: 0.95rem; + margin-bottom: 2px; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} + +.stop-sheet-estimate-time { + font-size: 0.85rem; + color: var(--subtitle-color); +} + +.stop-sheet-estimate-distance { + color: var(--subtitle-color); +} + +.stop-sheet-view-all { + display: block; + padding: 12px 16px; + background-color: var(--button-background-color); + color: white; + text-decoration: none; + text-align: center; + border-radius: 8px; + font-weight: 500; + transition: background-color 0.2s ease; + + margin-block-start: 1rem; + margin-inline-start: auto; +} + +.stop-sheet-view-all:hover { + background-color: var(--button-hover-background-color); + text-decoration: none; +} + +/* Override react-modal-sheet styles for better integration */ +[data-rsbs-overlay] { + background-color: rgba(0, 0, 0, 0.3); +} + +[data-rsbs-header] { + background-color: var(--background-color); + border-bottom: 1px solid var(--border-color); +} + +[data-rsbs-header]:before { + background-color: var(--subtitle-color); +} + +[data-rsbs-root] [data-rsbs-overlay] { + border-top-left-radius: 16px; + border-top-right-radius: 16px; +} + +[data-rsbs-root] [data-rsbs-content] { + background-color: var(--background-color); + border-top-left-radius: 16px; + border-top-right-radius: 16px; + max-height: 95vh; + overflow: hidden; +} diff --git a/src/frontend/app/components/StopSheet.tsx b/src/frontend/app/components/StopSheet.tsx new file mode 100644 index 0000000..8075e9d --- /dev/null +++ b/src/frontend/app/components/StopSheet.tsx @@ -0,0 +1,154 @@ +import React, { useEffect, useState } from "react"; +import { Sheet } from "react-modal-sheet"; +import { Link } from "react-router"; +import { useTranslation } from "react-i18next"; +import LineIcon from "./LineIcon"; +import { type StopDetails } from "../routes/estimates-$id"; +import "./StopSheet.css"; + +interface StopSheetProps { + isOpen: boolean; + onClose: () => void; + stopId: number; + stopName: string; +} + +const loadStopData = async (stopId: number): Promise<StopDetails> => { + const resp = await fetch(`/api/GetStopEstimates?id=${stopId}`, { + headers: { + Accept: "application/json", + }, + }); + return await resp.json(); +}; + +export const StopSheet: React.FC<StopSheetProps> = ({ + isOpen, + onClose, + stopId, + stopName, +}) => { + const { t } = useTranslation(); + const [data, setData] = useState<StopDetails | null>(null); + const [loading, setLoading] = useState(false); + + useEffect(() => { + if (isOpen && stopId) { + setLoading(true); + setData(null); + loadStopData(stopId) + .then((stopData) => { + setData(stopData); + }) + .catch((error) => { + console.error("Failed to load stop data:", error); + }) + .finally(() => { + setLoading(false); + }); + } + }, [isOpen, stopId]); + + const formatTime = (minutes: number) => { + if (minutes > 15) { + const now = new Date(); + const arrival = new Date(now.getTime() + minutes * 60000); + return Intl.DateTimeFormat( + typeof navigator !== "undefined" ? navigator.language : "en", + { + hour: "2-digit", + minute: "2-digit", + } + ).format(arrival); + } else { + return `${minutes} ${t("estimates.minutes", "min")}`; + } + }; + + const formatDistance = (meters: number) => { + if (meters > 1024) { + return `${(meters / 1000).toFixed(1)} km`; + } else { + return `${meters} ${t("estimates.meters", "m")}`; + } + }; + + // Show only the next 4 arrivals + const limitedEstimates = + data?.estimates.sort((a, b) => a.minutes - b.minutes).slice(0, 4) || []; + + return ( + <Sheet + isOpen={isOpen} + onClose={onClose} + detent="content-height" + > + <Sheet.Container> + <Sheet.Header /> + <Sheet.Content> + <div className="stop-sheet-content"> + <div className="stop-sheet-header"> + <h2 className="stop-sheet-title">{stopName}</h2> + <span className="stop-sheet-id">({stopId})</span> + </div> + + {loading && ( + <div className="stop-sheet-loading"> + {t("common.loading", "Loading...")} + </div> + )} + + {data && !loading && ( + <> + <div className="stop-sheet-estimates"> + <h3 className="stop-sheet-subtitle"> + {t("estimates.next_arrivals", "Next arrivals")} + </h3> + + {limitedEstimates.length === 0 ? ( + <div className="stop-sheet-no-estimates"> + {t("estimates.none", "No hay estimaciones disponibles")} + </div> + ) : ( + <div className="stop-sheet-estimates-list"> + {limitedEstimates.map((estimate, idx) => ( + <div key={idx} className="stop-sheet-estimate-item"> + <div className="stop-sheet-estimate-line"> + <LineIcon line={estimate.line} /> + </div> + <div className="stop-sheet-estimate-details"> + <div className="stop-sheet-estimate-route"> + {estimate.route} + </div> + <div className="stop-sheet-estimate-time"> + {formatTime(estimate.minutes)} + {estimate.meters > -1 && ( + <span className="stop-sheet-estimate-distance"> + {" • "} + {formatDistance(estimate.meters)} + </span> + )} + </div> + </div> + </div> + ))} + </div> + )} + </div> + + <Link + to={`/estimates/${stopId}`} + className="stop-sheet-view-all" + onClick={onClose} + > + {t("map.view_all_estimates", "Ver todas las estimaciones")} + </Link> + </> + )} + </div> + </Sheet.Content> + </Sheet.Container> + <Sheet.Backdrop /> + </Sheet> + ); +}; diff --git a/src/frontend/app/data/StopDataProvider.ts b/src/frontend/app/data/StopDataProvider.ts index 0c1e46e..efb0414 100644 --- a/src/frontend/app/data/StopDataProvider.ts +++ b/src/frontend/app/data/StopDataProvider.ts @@ -1,20 +1,20 @@ export interface CachedStopList { - timestamp: number; - data: Stop[]; + timestamp: number; + data: Stop[]; } export type StopName = { - original: string; - intersect?: string; -} + original: string; + intersect?: string; +}; export interface Stop { - stopId: number; - name: StopName; - latitude?: number; - longitude?: number; - lines: string[]; - favourite?: boolean; + stopId: number; + name: StopName; + latitude?: number; + longitude?: number; + lines: string[]; + favourite?: boolean; } // In-memory cache and lookup map @@ -25,136 +25,139 @@ let customNames: Record<number, string> = {}; // Initialize cachedStops and customNames once async function initStops() { - if (!cachedStops) { - const response = await fetch('/stops.json'); - const stops = await response.json() as Stop[]; - // build array and map - stopsMap = {}; - cachedStops = stops.map(stop => { - const entry = { ...stop, favourite: false } as Stop; - stopsMap[stop.stopId] = entry; - return entry; - }); - // load custom names - const rawCustom = localStorage.getItem('customStopNames'); - if (rawCustom) customNames = JSON.parse(rawCustom) as Record<number, string>; - } + if (!cachedStops) { + const response = await fetch("/stops.json"); + const stops = (await response.json()) as Stop[]; + // build array and map + stopsMap = {}; + cachedStops = stops.map((stop) => { + const entry = { ...stop, favourite: false } as Stop; + stopsMap[stop.stopId] = entry; + return entry; + }); + // load custom names + const rawCustom = localStorage.getItem("customStopNames"); + if (rawCustom) + customNames = JSON.parse(rawCustom) as Record<number, string>; + } } async function getStops(): Promise<Stop[]> { - await initStops(); - // update favourites - const rawFav = localStorage.getItem('favouriteStops'); - const favouriteStops = rawFav ? JSON.parse(rawFav) as number[] : []; - cachedStops!.forEach(stop => stop.favourite = favouriteStops.includes(stop.stopId)); - return cachedStops!; + await initStops(); + // update favourites + const rawFav = localStorage.getItem("favouriteStops"); + const favouriteStops = rawFav ? (JSON.parse(rawFav) as number[]) : []; + cachedStops!.forEach( + (stop) => (stop.favourite = favouriteStops.includes(stop.stopId)), + ); + return cachedStops!; } // New: get single stop by id async function getStopById(stopId: number): Promise<Stop | undefined> { - await initStops(); - const stop = stopsMap[stopId]; - if (stop) { - const rawFav = localStorage.getItem('favouriteStops'); - const favouriteStops = rawFav ? JSON.parse(rawFav) as number[] : []; - stop.favourite = favouriteStops.includes(stopId); - } - return stop; + await initStops(); + const stop = stopsMap[stopId]; + if (stop) { + const rawFav = localStorage.getItem("favouriteStops"); + const favouriteStops = rawFav ? (JSON.parse(rawFav) as number[]) : []; + stop.favourite = favouriteStops.includes(stopId); + } + return stop; } // Updated display name to include custom names function getDisplayName(stop: Stop): string { - if (customNames[stop.stopId]) return customNames[stop.stopId]; - const nameObj = stop.name; - return nameObj.intersect || nameObj.original; + if (customNames[stop.stopId]) return customNames[stop.stopId]; + const nameObj = stop.name; + return nameObj.intersect || nameObj.original; } // New: set or remove custom names function setCustomName(stopId: number, label: string) { - customNames[stopId] = label; - localStorage.setItem('customStopNames', JSON.stringify(customNames)); + customNames[stopId] = label; + localStorage.setItem("customStopNames", JSON.stringify(customNames)); } function removeCustomName(stopId: number) { - delete customNames[stopId]; - localStorage.setItem('customStopNames', JSON.stringify(customNames)); + delete customNames[stopId]; + localStorage.setItem("customStopNames", JSON.stringify(customNames)); } // New: get custom label for a stop function getCustomName(stopId: number): string | undefined { - return customNames[stopId]; + return customNames[stopId]; } function addFavourite(stopId: number) { - const rawFavouriteStops = localStorage.getItem('favouriteStops'); - let favouriteStops: number[] = []; - if (rawFavouriteStops) { - favouriteStops = JSON.parse(rawFavouriteStops) as number[]; - } + const rawFavouriteStops = localStorage.getItem("favouriteStops"); + let favouriteStops: number[] = []; + if (rawFavouriteStops) { + favouriteStops = JSON.parse(rawFavouriteStops) as number[]; + } - if (!favouriteStops.includes(stopId)) { - favouriteStops.push(stopId); - localStorage.setItem('favouriteStops', JSON.stringify(favouriteStops)); - } + if (!favouriteStops.includes(stopId)) { + favouriteStops.push(stopId); + localStorage.setItem("favouriteStops", JSON.stringify(favouriteStops)); + } } function removeFavourite(stopId: number) { - const rawFavouriteStops = localStorage.getItem('favouriteStops'); - let favouriteStops: number[] = []; - if (rawFavouriteStops) { - favouriteStops = JSON.parse(rawFavouriteStops) as number[]; - } + const rawFavouriteStops = localStorage.getItem("favouriteStops"); + let favouriteStops: number[] = []; + if (rawFavouriteStops) { + favouriteStops = JSON.parse(rawFavouriteStops) as number[]; + } - const newFavouriteStops = favouriteStops.filter(id => id !== stopId); - localStorage.setItem('favouriteStops', JSON.stringify(newFavouriteStops)); + const newFavouriteStops = favouriteStops.filter((id) => id !== stopId); + localStorage.setItem("favouriteStops", JSON.stringify(newFavouriteStops)); } function isFavourite(stopId: number): boolean { - const rawFavouriteStops = localStorage.getItem('favouriteStops'); - if (rawFavouriteStops) { - const favouriteStops = JSON.parse(rawFavouriteStops) as number[]; - return favouriteStops.includes(stopId); - } - return false; + const rawFavouriteStops = localStorage.getItem("favouriteStops"); + if (rawFavouriteStops) { + const favouriteStops = JSON.parse(rawFavouriteStops) as number[]; + return favouriteStops.includes(stopId); + } + return false; } const RECENT_STOPS_LIMIT = 10; function pushRecent(stopId: number) { - const rawRecentStops = localStorage.getItem('recentStops'); - let recentStops: Set<number> = new Set(); - if (rawRecentStops) { - recentStops = new Set(JSON.parse(rawRecentStops) as number[]); - } + const rawRecentStops = localStorage.getItem("recentStops"); + let recentStops: Set<number> = new Set(); + if (rawRecentStops) { + recentStops = new Set(JSON.parse(rawRecentStops) as number[]); + } - recentStops.add(stopId); - if (recentStops.size > RECENT_STOPS_LIMIT) { - const iterator = recentStops.values(); - const val = iterator.next().value as number; - recentStops.delete(val); - } + recentStops.add(stopId); + if (recentStops.size > RECENT_STOPS_LIMIT) { + const iterator = recentStops.values(); + const val = iterator.next().value as number; + recentStops.delete(val); + } - localStorage.setItem('recentStops', JSON.stringify(Array.from(recentStops))); + localStorage.setItem("recentStops", JSON.stringify(Array.from(recentStops))); } function getRecent(): number[] { - const rawRecentStops = localStorage.getItem('recentStops'); - if (rawRecentStops) { - return JSON.parse(rawRecentStops) as number[]; - } - return []; + const rawRecentStops = localStorage.getItem("recentStops"); + if (rawRecentStops) { + return JSON.parse(rawRecentStops) as number[]; + } + return []; } export default { - getStops, - getStopById, - getCustomName, - getDisplayName, - setCustomName, - removeCustomName, - addFavourite, - removeFavourite, - isFavourite, - pushRecent, - getRecent + getStops, + getStopById, + getCustomName, + getDisplayName, + setCustomName, + removeCustomName, + addFavourite, + removeFavourite, + isFavourite, + pushRecent, + getRecent, }; diff --git a/src/frontend/app/i18n/index.ts b/src/frontend/app/i18n/index.ts index a7ba6aa..492a9a9 100644 --- a/src/frontend/app/i18n/index.ts +++ b/src/frontend/app/i18n/index.ts @@ -1,15 +1,15 @@ -import i18n from 'i18next'; -import { initReactI18next } from 'react-i18next'; -import LanguageDetector from 'i18next-browser-languagedetector'; -import esES from './locales/es-ES.json'; -import glES from './locales/gl-ES.json'; -import enGB from './locales/en-GB.json'; +import i18n from "i18next"; +import { initReactI18next } from "react-i18next"; +import LanguageDetector from "i18next-browser-languagedetector"; +import esES from "./locales/es-ES.json"; +import glES from "./locales/gl-ES.json"; +import enGB from "./locales/en-GB.json"; // Add more languages as needed const resources = { - 'es-ES': { translation: esES }, - 'gl-ES': { translation: glES }, - 'en-GB': { translation: enGB }, + "es-ES": { translation: esES }, + "gl-ES": { translation: glES }, + "en-GB": { translation: enGB }, }; i18n @@ -17,14 +17,14 @@ i18n .use(initReactI18next) .init({ resources, - fallbackLng: 'es-ES', + fallbackLng: "es-ES", interpolation: { escapeValue: false, }, - supportedLngs: ['es-ES', 'gl-ES', 'en-GB'], + supportedLngs: ["es-ES", "gl-ES", "en-GB"], detection: { - order: ['querystring', 'cookie', 'localStorage', 'navigator', 'htmlTag'], - caches: ['localStorage', 'cookie'], + order: ["querystring", "cookie", "localStorage", "navigator", "htmlTag"], + caches: ["localStorage", "cookie"], }, }); diff --git a/src/frontend/app/i18n/locales/en-GB.json b/src/frontend/app/i18n/locales/en-GB.json index cd0780c..264290b 100644 --- a/src/frontend/app/i18n/locales/en-GB.json +++ b/src/frontend/app/i18n/locales/en-GB.json @@ -43,11 +43,13 @@ "arrival": "Arrival", "distance": "Distance", "not_available": "Not available", - "none": "No estimates available" + "none": "No estimates available", + "next_arrivals": "Next arrivals" }, "map": { "popup_title": "Stop", - "lines": "Lines" + "lines": "Lines", + "view_all_estimates": "View all estimates" }, "common": { "loading": "Loading...", diff --git a/src/frontend/app/i18n/locales/es-ES.json b/src/frontend/app/i18n/locales/es-ES.json index 2f2bb86..d7d78ad 100644 --- a/src/frontend/app/i18n/locales/es-ES.json +++ b/src/frontend/app/i18n/locales/es-ES.json @@ -43,11 +43,13 @@ "arrival": "Llegada", "distance": "Distancia", "not_available": "No disponible", - "none": "No hay estimaciones disponibles" + "none": "No hay estimaciones disponibles", + "next_arrivals": "Próximas llegadas" }, "map": { "popup_title": "Parada", - "lines": "Líneas" + "lines": "Líneas", + "view_all_estimates": "Ver todas las estimaciones" }, "common": { "loading": "Cargando...", diff --git a/src/frontend/app/i18n/locales/gl-ES.json b/src/frontend/app/i18n/locales/gl-ES.json index d2558e5..3012638 100644 --- a/src/frontend/app/i18n/locales/gl-ES.json +++ b/src/frontend/app/i18n/locales/gl-ES.json @@ -43,11 +43,13 @@ "arrival": "Chegada", "distance": "Distancia", "not_available": "Non dispoñible", - "none": "Non hai estimacións dispoñibles" + "none": "Non hai estimacións dispoñibles", + "next_arrivals": "Próximas chegadas" }, "map": { "popup_title": "Parada", - "lines": "Liñas" + "lines": "Liñas", + "view_all_estimates": "Ver todas as estimacións" }, "common": { "loading": "Cargando...", diff --git a/src/frontend/app/maps/styleloader.ts b/src/frontend/app/maps/styleloader.ts index f00aacc..cf285a5 100644 --- a/src/frontend/app/maps/styleloader.ts +++ b/src/frontend/app/maps/styleloader.ts @@ -1,49 +1,58 @@ import type { StyleSpecification } from "react-map-gl/maplibre"; -export async function loadStyle(styleName: string, colorScheme: string): Promise<StyleSpecification> { - const stylePath = `/maps/styles/${styleName}-${colorScheme}.json`; - const resp = await fetch(stylePath); +export async function loadStyle( + styleName: string, + colorScheme: string, +): Promise<StyleSpecification> { + const stylePath = `/maps/styles/${styleName}-${colorScheme}.json`; + const resp = await fetch(stylePath); - if (!resp.ok) { - throw new Error(`Failed to load style: ${stylePath}`); - } + if (!resp.ok) { + throw new Error(`Failed to load style: ${stylePath}`); + } - const style = await resp.json(); + const style = await resp.json(); - const baseUrl = window.location.origin; - const spritePath = style.sprite; + const baseUrl = window.location.origin; + const spritePath = style.sprite; - // Handle both string and array cases for spritePath - if (Array.isArray(spritePath)) { - // For array format, update each sprite object's URL to be absolute - style.sprite = spritePath.map(spriteObj => { - const isAbsoluteUrl = spriteObj.url.startsWith("http://") || spriteObj.url.startsWith("https://"); - if (isAbsoluteUrl) { - return spriteObj; - } + // Handle both string and array cases for spritePath + if (Array.isArray(spritePath)) { + // For array format, update each sprite object's URL to be absolute + style.sprite = spritePath.map((spriteObj) => { + const isAbsoluteUrl = + spriteObj.url.startsWith("http://") || + spriteObj.url.startsWith("https://"); + if (isAbsoluteUrl) { + return spriteObj; + } - return { - ...spriteObj, - url: `${baseUrl}${spriteObj.url}` - }; - }); - } else if (typeof spritePath === "string") { - if (!spritePath.startsWith("http://") && !spritePath.startsWith("https://")) { - style.sprite = `${baseUrl}${spritePath}`; - } + return { + ...spriteObj, + url: `${baseUrl}${spriteObj.url}`, + }; + }); + } else if (typeof spritePath === "string") { + if ( + !spritePath.startsWith("http://") && + !spritePath.startsWith("https://") + ) { + style.sprite = `${baseUrl}${spritePath}`; } + } - // Detect on each source if it the 'tiles' URLs are relative and convert them to absolute URLs - for (const sourceKey in style.sources) { - const source = style.sources[sourceKey]; - for (const tileKey in source.tiles) { - const tileUrl = source.tiles[tileKey]; - const isAbsoluteUrl = tileUrl.startsWith("http://") || tileUrl.startsWith("https://"); - if (!isAbsoluteUrl) { - source.tiles[tileKey] = `${baseUrl}${tileUrl}`; - } - } + // Detect on each source if it the 'tiles' URLs are relative and convert them to absolute URLs + for (const sourceKey in style.sources) { + const source = style.sources[sourceKey]; + for (const tileKey in source.tiles) { + const tileUrl = source.tiles[tileKey]; + const isAbsoluteUrl = + tileUrl.startsWith("http://") || tileUrl.startsWith("https://"); + if (!isAbsoluteUrl) { + source.tiles[tileKey] = `${baseUrl}${tileUrl}`; + } } + } - return style as StyleSpecification; + return style as StyleSpecification; } diff --git a/src/frontend/app/root.css b/src/frontend/app/root.css index a5024df..da3ab67 100644 --- a/src/frontend/app/root.css +++ b/src/frontend/app/root.css @@ -10,10 +10,10 @@ --star-color: #ffcc00; --message-background-color: #f8f9fa; - font-family: 'Roboto Variable', Roboto, Arial, sans-serif; + font-family: "Roboto Variable", Roboto, Arial, sans-serif; } -[data-theme='dark'] { +[data-theme="dark"] { --colour-scheme: dark; --background-color: #121212; --text-color: #ffffff; @@ -65,8 +65,8 @@ body { align-items: center; text-decoration: none; color: var(--text-color); - padding: .25rem 0; - border-radius: .5rem; + padding: 0.25rem 0; + border-radius: 0.5rem; } .navigation-bar__link svg { diff --git a/src/frontend/app/root.tsx b/src/frontend/app/root.tsx index 8ffbe86..55c6c16 100644 --- a/src/frontend/app/root.tsx +++ b/src/frontend/app/root.tsx @@ -5,7 +5,7 @@ import { Meta, Outlet, Scripts, - ScrollRestoration + ScrollRestoration, } from "react-router"; import type { Route } from "./+types/root"; @@ -24,13 +24,14 @@ maplibregl.addProtocol("pmtiles", pmtiles.tile); import "./i18n"; -if ('serviceWorker' in navigator) { - navigator.serviceWorker.register('/sw.js') +if ("serviceWorker" in navigator) { + navigator.serviceWorker + .register("/sw.js") .then((registration) => { - console.log('Service Worker registered with scope:', registration.scope); + console.log("Service Worker registered with scope:", registration.scope); }) .catch((error) => { - console.error('Service Worker registration failed:', error); + console.error("Service Worker registration failed:", error); }); } @@ -54,15 +55,27 @@ export function Layout({ children }: { children: React.ReactNode }) { <link rel="canonical" href="https://urbanovigo.costas.dev/" /> - <meta name="description" content="Aplicación web para encontrar paradas y tiempos de llegada de los autobuses urbanos de Vigo, España." /> - <meta name="keywords" content="Vigo, autobús, urbano, parada, tiempo, llegada, transporte, público, España" /> + <meta + name="description" + content="Aplicación web para encontrar paradas y tiempos de llegada de los autobuses urbanos de Vigo, España." + /> + <meta + name="keywords" + content="Vigo, autobús, urbano, parada, tiempo, llegada, transporte, público, España" + /> <meta name="author" content="Ariel Costas Guerrero" /> <meta property="og:title" content="UrbanoVigo Web" /> <meta property="og:type" content="website" /> <meta property="og:url" content="https://urbanovigo.costas.dev/" /> - <meta property="og:image" content="https://urbanovigo.costas.dev/logo-512.jpg" /> - <meta property="og:description" content="Aplicación web para encontrar paradas y tiempos de llegada de los autobuses urbanos de Vigo, España." /> + <meta + property="og:image" + content="https://urbanovigo.costas.dev/logo-512.jpg" + /> + <meta + property="og:description" + content="Aplicación web para encontrar paradas y tiempos de llegada de los autobuses urbanos de Vigo, España." + /> <link rel="manifest" href="/manifest.webmanifest" /> @@ -82,20 +95,20 @@ export function Layout({ children }: { children: React.ReactNode }) { ); } - // Helper: check if coordinates are within Vigo bounds - function isWithinVigo(lngLat: LngLatLike): boolean { - let lng: number, lat: number; - if (Array.isArray(lngLat)) { - [lng, lat] = lngLat; - } else if ('lng' in lngLat && 'lat' in lngLat) { - lng = lngLat.lng; - lat = lngLat.lat; - } else { - return false; - } - // Rough bounding box for Vigo - return lat >= 42.18 && lat <= 42.30 && lng >= -8.78 && lng <= -8.65; +// Helper: check if coordinates are within Vigo bounds +function isWithinVigo(lngLat: LngLatLike): boolean { + let lng: number, lat: number; + if (Array.isArray(lngLat)) { + [lng, lat] = lngLat; + } else if ("lng" in lngLat && "lat" in lngLat) { + lng = lngLat.lng; + lat = lngLat.lat; + } else { + return false; } + // Rough bounding box for Vigo + return lat >= 42.18 && lat <= 42.3 && lng >= -8.78 && lng <= -8.65; +} import NavBar from "./components/NavBar"; @@ -109,9 +122,6 @@ export default function App() { <NavBar /> </footer> </AppProvider> - - - ); } diff --git a/src/frontend/app/routes.tsx b/src/frontend/app/routes.tsx index 1bca5e8..9dd8a66 100644 --- a/src/frontend/app/routes.tsx +++ b/src/frontend/app/routes.tsx @@ -5,5 +5,5 @@ export default [ route("/stops", "routes/stoplist.tsx"), route("/map", "routes/map.tsx"), route("/estimates/:id", "routes/estimates-$id.tsx"), - route("/settings", "routes/settings.tsx") + route("/settings", "routes/settings.tsx"), ] satisfies RouteConfig; diff --git a/src/frontend/app/routes/estimates-$id.css b/src/frontend/app/routes/estimates-$id.css index 86ca09b..3905f3e 100644 --- a/src/frontend/app/routes/estimates-$id.css +++ b/src/frontend/app/routes/estimates-$id.css @@ -102,4 +102,4 @@ .edit-icon:hover { color: var(--star-color); -}
\ No newline at end of file +} diff --git a/src/frontend/app/routes/estimates-$id.tsx b/src/frontend/app/routes/estimates-$id.tsx index e0e4fff..f2ef83a 100644 --- a/src/frontend/app/routes/estimates-$id.tsx +++ b/src/frontend/app/routes/estimates-$id.tsx @@ -1,7 +1,7 @@ import { type JSX, useEffect, useState } from "react"; import { useParams } from "react-router"; import StopDataProvider from "../data/StopDataProvider"; -import { Star, Edit2 } from 'lucide-react'; +import { Star, Edit2 } from "lucide-react"; import "./estimates-$id.css"; import { RegularTable } from "../components/RegularTable"; import { useApp } from "../AppContext"; @@ -9,97 +9,99 @@ import { GroupedTable } from "../components/GroupedTable"; import { useTranslation } from "react-i18next"; export interface StopDetails { - stop: { - id: number; - name: string; - latitude: number; - longitude: number; - } - estimates: { - line: string; - route: string; - minutes: number; - meters: number; - }[] + stop: { + id: number; + name: string; + latitude: number; + longitude: number; + }; + estimates: { + line: string; + route: string; + minutes: number; + meters: number; + }[]; } const loadData = async (stopId: string) => { - const resp = await fetch(`/api/GetStopEstimates?id=${stopId}`, { - headers: { - 'Accept': 'application/json', - } - }); - return await resp.json(); + const resp = await fetch(`/api/GetStopEstimates?id=${stopId}`, { + headers: { + Accept: "application/json", + }, + }); + return await resp.json(); }; export default function Estimates() { - const { t } = useTranslation(); - const params = useParams(); - const stopIdNum = parseInt(params.id ?? ""); - const [customName, setCustomName] = useState<string | undefined>(undefined); - const [data, setData] = useState<StopDetails | null>(null); - const [dataDate, setDataDate] = useState<Date | null>(null); - const [favourited, setFavourited] = useState(false); - const { tableStyle } = useApp(); + const { t } = useTranslation(); + const params = useParams(); + const stopIdNum = parseInt(params.id ?? ""); + const [customName, setCustomName] = useState<string | undefined>(undefined); + const [data, setData] = useState<StopDetails | null>(null); + const [dataDate, setDataDate] = useState<Date | null>(null); + const [favourited, setFavourited] = useState(false); + const { tableStyle } = useApp(); - useEffect(() => { - loadData(params.id!) - .then((body: StopDetails) => { - setData(body); - setDataDate(new Date()); - setCustomName(StopDataProvider.getCustomName(stopIdNum)); - }) + useEffect(() => { + loadData(params.id!).then((body: StopDetails) => { + setData(body); + setDataDate(new Date()); + setCustomName(StopDataProvider.getCustomName(stopIdNum)); + }); + StopDataProvider.pushRecent(parseInt(params.id ?? "")); - StopDataProvider.pushRecent(parseInt(params.id ?? "")); + setFavourited(StopDataProvider.isFavourite(parseInt(params.id ?? ""))); + }, [params.id]); - setFavourited( - StopDataProvider.isFavourite(parseInt(params.id ?? "")) - ); - }, [params.id]); + const toggleFavourite = () => { + if (favourited) { + StopDataProvider.removeFavourite(stopIdNum); + setFavourited(false); + } else { + StopDataProvider.addFavourite(stopIdNum); + setFavourited(true); + } + }; + const handleRename = () => { + const current = customName ?? data?.stop.name; + const input = window.prompt("Custom name for this stop:", current); + if (input === null) return; // cancelled + const trimmed = input.trim(); + if (trimmed === "") { + StopDataProvider.removeCustomName(stopIdNum); + setCustomName(undefined); + } else { + StopDataProvider.setCustomName(stopIdNum, trimmed); + setCustomName(trimmed); + } + }; - const toggleFavourite = () => { - if (favourited) { - StopDataProvider.removeFavourite(stopIdNum); - setFavourited(false); - } else { - StopDataProvider.addFavourite(stopIdNum); - setFavourited(true); - } - } + if (data === null) + return <h1 className="page-title">{t("common.loading")}</h1>; - const handleRename = () => { - const current = customName ?? data?.stop.name; - const input = window.prompt('Custom name for this stop:', current); - if (input === null) return; // cancelled - const trimmed = input.trim(); - if (trimmed === '') { - StopDataProvider.removeCustomName(stopIdNum); - setCustomName(undefined); - } else { - StopDataProvider.setCustomName(stopIdNum, trimmed); - setCustomName(trimmed); - } - }; + return ( + <div className="page-container"> + <div className="estimates-header"> + <h1 className="page-title"> + <Star + className={`star-icon ${favourited ? "active" : ""}`} + onClick={toggleFavourite} + /> + <Edit2 className="edit-icon" onClick={handleRename} /> + {customName ?? data.stop.name}{" "} + <span className="estimates-stop-id">({data.stop.id})</span> + </h1> + </div> - if (data === null) return <h1 className="page-title">{t('common.loading')}</h1> - - return ( - <div className="page-container"> - <div className="estimates-header"> - <h1 className="page-title"> - <Star className={`star-icon ${favourited ? 'active' : ''}`} onClick={toggleFavourite} /> - <Edit2 className="edit-icon" onClick={handleRename} /> - {(customName ?? data.stop.name)} <span className="estimates-stop-id">({data.stop.id})</span> - </h1> - </div> - - <div className="table-responsive"> - {tableStyle === 'grouped' ? - <GroupedTable data={data} dataDate={dataDate} /> : - <RegularTable data={data} dataDate={dataDate} />} - </div> - </div> - ) + <div className="table-responsive"> + {tableStyle === "grouped" ? ( + <GroupedTable data={data} dataDate={dataDate} /> + ) : ( + <RegularTable data={data} dataDate={dataDate} /> + )} + </div> + </div> + ); } diff --git a/src/frontend/app/routes/index.tsx b/src/frontend/app/routes/index.tsx index 7c8ab40..252abec 100644 --- a/src/frontend/app/routes/index.tsx +++ b/src/frontend/app/routes/index.tsx @@ -1,5 +1,5 @@ import { Navigate, redirect, type LoaderFunction } from "react-router"; export default function Index() { - return <Navigate to={"/stops"} replace />; + return <Navigate to={"/stops"} replace />; } diff --git a/src/frontend/app/routes/map.css b/src/frontend/app/routes/map.css index 115df46..0b3ebe5 100644 --- a/src/frontend/app/routes/map.css +++ b/src/frontend/app/routes/map.css @@ -1,86 +1,86 @@ /* Map page specific styles */ .map-container { - height: calc(100dvh - 140px); - margin: -16px; - margin-bottom: 1rem; - position: relative; + height: calc(100dvh - 140px); + margin: -16px; + margin-bottom: 1rem; + position: relative; } /* Fullscreen map styles */ .fullscreen-container { - position: absolute; - top: 0; - left: 0; - width: 100vw; - height: 100dvh; - padding: 0; - margin: 0; - max-width: none; - overflow: hidden; + position: absolute; + top: 0; + left: 0; + width: 100vw; + height: 100dvh; + padding: 0; + margin: 0; + max-width: none; + overflow: hidden; } .fullscreen-map { - width: 100%; - height: 100%; + width: 100%; + height: 100%; } .fullscreen-loading { - display: flex; - justify-content: center; - align-items: center; - height: 100dvh; - width: 100vw; - font-size: 1.8rem; - font-weight: 600; - color: var(--text-color); + display: flex; + justify-content: center; + align-items: center; + height: 100dvh; + width: 100vw; + font-size: 1.8rem; + font-weight: 600; + color: var(--text-color); } /* Map marker and popup styles */ .stop-marker { - box-shadow: 0 0 5px rgba(0, 0, 0, 0.3); - transition: all 0.2s ease-in-out; + box-shadow: 0 0 5px rgba(0, 0, 0, 0.3); + transition: all 0.2s ease-in-out; } .stop-marker:hover { - transform: scale(1.2); + transform: scale(1.2); } .maplibregl-popup { - max-width: 250px; + max-width: 250px; } .maplibregl-popup-content { - padding: 12px; - border-radius: 8px; - box-shadow: 0 2px 10px rgba(0, 0, 0, 0.1); + padding: 12px; + border-radius: 8px; + box-shadow: 0 2px 10px rgba(0, 0, 0, 0.1); } .popup-line-icons { - display: flex; - flex-wrap: wrap; - margin: 6px 0; - gap: 5px; + display: flex; + flex-wrap: wrap; + margin: 6px 0; + gap: 5px; } .popup-line { - display: inline-block; - background-color: var(--button-background-color); - color: white; - padding: 2px 6px; - margin-right: 4px; - border-radius: 4px; - font-size: 0.8rem; - font-weight: 500; + display: inline-block; + background-color: var(--button-background-color); + color: white; + padding: 2px 6px; + margin-right: 4px; + border-radius: 4px; + font-size: 0.8rem; + font-weight: 500; } .popup-link { - display: block; - margin-top: 8px; - color: var(--button-background-color); - text-decoration: none; - font-weight: 500; + display: block; + margin-top: 8px; + color: var(--button-background-color); + text-decoration: none; + font-weight: 500; } .popup-link:hover { - text-decoration: underline; + text-decoration: underline; } diff --git a/src/frontend/app/routes/map.tsx b/src/frontend/app/routes/map.tsx index ca095e2..5887b9c 100644 --- a/src/frontend/app/routes/map.tsx +++ b/src/frontend/app/routes/map.tsx @@ -1,13 +1,21 @@ import StopDataProvider from "../data/StopDataProvider"; -import './map.css'; +import "./map.css"; -import { useEffect, useRef, useState } from 'react'; +import { useEffect, useRef, useState } from "react"; import { useApp } from "../AppContext"; -import Map, { AttributionControl, GeolocateControl, Layer, NavigationControl, Popup, Source, type MapRef, type MapLayerMouseEvent, type StyleSpecification } from "react-map-gl/maplibre"; +import Map, { + AttributionControl, + GeolocateControl, + Layer, + NavigationControl, + Source, + type MapRef, + type MapLayerMouseEvent, + type StyleSpecification, +} from "react-map-gl/maplibre"; import { loadStyle } from "app/maps/styleloader"; -import type { Feature as GeoJsonFeature, Point } from 'geojson'; -import LineIcon from "~/components/LineIcon"; -import { Link } from "react-router"; +import type { Feature as GeoJsonFeature, Point } from "geojson"; +import { StopSheet } from "~/components/StopSheet"; import { useTranslation } from "react-i18next"; // Default minimal fallback style before dynamic loading @@ -16,154 +24,154 @@ const defaultStyle: StyleSpecification = { glyphs: `${window.location.origin}/maps/fonts/{fontstack}/{range}.pbf`, sprite: `${window.location.origin}/maps/spritesheet/sprite`, sources: {}, - layers: [] + layers: [], }; // Componente principal del mapa export default function StopMap() { - const { t } = useTranslation(); - const [stops, setStops] = useState<GeoJsonFeature<Point, { stopId: number; name: string; lines: string[] }>[]>([]); - const [popupInfo, setPopupInfo] = useState<any>(null); - const { mapState, updateMapState, theme } = useApp(); - const mapRef = useRef<MapRef>(null); - const [mapStyleKey, setMapStyleKey] = useState<string>("light"); + const { t } = useTranslation(); + const [stops, setStops] = useState< + GeoJsonFeature<Point, { stopId: number; name: string; lines: string[] }>[] + >([]); + const [selectedStop, setSelectedStop] = useState<{ + stopId: number; + name: string; + } | null>(null); + const [isSheetOpen, setIsSheetOpen] = useState(false); + const { mapState, updateMapState, theme } = useApp(); + const mapRef = useRef<MapRef>(null); + const [mapStyleKey, setMapStyleKey] = useState<string>("light"); - // Style state for Map component - const [mapStyle, setMapStyle] = useState<StyleSpecification>(defaultStyle); + // Style state for Map component + const [mapStyle, setMapStyle] = useState<StyleSpecification>(defaultStyle); - // Handle click events on clusters and individual stops - const onMapClick = (e: MapLayerMouseEvent) => { - const features = e.features; - if (!features || features.length === 0) return; - const feature = features[0]; - const props: any = feature.properties; + // Handle click events on clusters and individual stops + const onMapClick = (e: MapLayerMouseEvent) => { + const features = e.features; + if (!features || features.length === 0) return; + const feature = features[0]; + const props: any = feature.properties; - handlePointClick(feature); - }; + handlePointClick(feature); + }; - useEffect(() => { - StopDataProvider.getStops().then(data => { - const features: GeoJsonFeature<Point, { stopId: number; name: string; lines: string[] }>[] = data.map(s => ({ - type: "Feature", - geometry: { type: "Point", coordinates: [s.longitude as number, s.latitude as number] }, - properties: { stopId: s.stopId, name: s.name.original, lines: s.lines } - })); - setStops(features); - }); - }, []); + useEffect(() => { + StopDataProvider.getStops().then((data) => { + const features: GeoJsonFeature< + Point, + { stopId: number; name: string; lines: string[] } + >[] = data.map((s) => ({ + type: "Feature", + geometry: { + type: "Point", + coordinates: [s.longitude as number, s.latitude as number], + }, + properties: { stopId: s.stopId, name: s.name.original, lines: s.lines }, + })); + setStops(features); + }); + }, []); - useEffect(() => { - const styleName = "carto"; - loadStyle(styleName, theme) - .then(style => setMapStyle(style)) - .catch(error => console.error("Failed to load map style:", error)); - }, [mapStyleKey, theme]); + useEffect(() => { + const styleName = "carto"; + loadStyle(styleName, theme) + .then((style) => setMapStyle(style)) + .catch((error) => console.error("Failed to load map style:", error)); + }, [mapStyleKey, theme]); - useEffect(() => { - const handleMapChange = () => { - if (!mapRef.current) return; - const map = mapRef.current.getMap(); - if (!map) return; - const center = map.getCenter(); - const zoom = map.getZoom(); - updateMapState([center.lat, center.lng], zoom); - }; + useEffect(() => { + const handleMapChange = () => { + if (!mapRef.current) return; + const map = mapRef.current.getMap(); + if (!map) return; + const center = map.getCenter(); + const zoom = map.getZoom(); + updateMapState([center.lat, center.lng], zoom); + }; - if (mapRef.current) { - const map = mapRef.current.getMap(); - if (map) { - map.on('moveend', handleMapChange); - } - } + if (mapRef.current) { + const map = mapRef.current.getMap(); + if (map) { + map.on("moveend", handleMapChange); + } + } - return () => { - if (mapRef.current) { - const map = mapRef.current.getMap(); - if (map) { - map.off('moveend', handleMapChange); - } - } - }; - }, [mapRef.current]); + return () => { + if (mapRef.current) { + const map = mapRef.current.getMap(); + if (map) { + map.off("moveend", handleMapChange); + } + } + }; + }, [mapRef.current]); - const getLatitude = (center: any) => Array.isArray(center) ? center[0] : center.lat; - const getLongitude = (center: any) => Array.isArray(center) ? center[1] : center.lng; + const getLatitude = (center: any) => + Array.isArray(center) ? center[0] : center.lat; + const getLongitude = (center: any) => + Array.isArray(center) ? center[1] : center.lng; - const handlePointClick = (feature: any) => { - const props: any = feature.properties; - // fetch full stop to get lines array - StopDataProvider.getStopById(props.stopId).then(stop => { - if (!stop) return; - setPopupInfo({ - geometry: feature.geometry, - properties: { - stopId: stop.stopId, - name: stop.name.original, - lines: stop.lines - } - }); - }); - }; + const handlePointClick = (feature: any) => { + const props: any = feature.properties; + // fetch full stop to get lines array + StopDataProvider.getStopById(props.stopId).then((stop) => { + if (!stop) return; + setSelectedStop({ + stopId: stop.stopId, + name: stop.name.original, + }); + setIsSheetOpen(true); + }); + }; - return ( - <Map - mapStyle={mapStyle} - style={{ width: '100%', height: '100%' }} - interactiveLayerIds={["stops"]} - onClick={onMapClick} - minZoom={11} - scrollZoom - pitch={0} - roll={0} - ref={mapRef} - initialViewState={{ - latitude: getLatitude(mapState.center), - longitude: getLongitude(mapState.center), - zoom: mapState.zoom, - }} - attributionControl={false} - > - <NavigationControl position="top-right" /> - <GeolocateControl position="top-right" trackUserLocation={true} /> - <AttributionControl position="bottom-right" compact={false} /> + return ( + <Map + mapStyle={mapStyle} + style={{ width: "100%", height: "100%" }} + interactiveLayerIds={["stops"]} + onClick={onMapClick} + minZoom={11} + scrollZoom + pitch={0} + roll={0} + ref={mapRef} + initialViewState={{ + latitude: getLatitude(mapState.center), + longitude: getLongitude(mapState.center), + zoom: mapState.zoom, + }} + attributionControl={false} + > + <NavigationControl position="top-right" /> + <GeolocateControl position="top-right" trackUserLocation={true} /> + <AttributionControl position="bottom-right" compact={false} /> - <Source - id="stops-source" - type="geojson" - data={{ type: "FeatureCollection", features: stops }} - /> + <Source + id="stops-source" + type="geojson" + data={{ type: "FeatureCollection", features: stops }} + /> - <Layer - id="stops" - type="symbol" - source="stops-source" - layout={{ - "icon-image": "stop", - "icon-size": ["interpolate", ["linear"], ["zoom"], 11, 0.4, 16, 0.8], - "icon-allow-overlap": true, - "icon-ignore-placement": true, - }} - /> + <Layer + id="stops" + type="symbol" + source="stops-source" + layout={{ + "icon-image": "stop", + "icon-size": ["interpolate", ["linear"], ["zoom"], 11, 0.4, 16, 0.8], + "icon-allow-overlap": true, + "icon-ignore-placement": true, + }} + /> - {popupInfo && ( - <Popup - latitude={popupInfo.geometry.coordinates[1]} - longitude={popupInfo.geometry.coordinates[0]} - onClose={() => setPopupInfo(null)} - > - <div> - <h3>{popupInfo.properties.name}</h3> - <div> - {popupInfo.properties.lines.map((line: string) => ( - <LineIcon line={line} key={line} /> - ))} - </div> - <Link to={`/estimates/${popupInfo.properties.stopId}`} className="popup-link"> - Ver parada - </Link> - </div> - </Popup> - )} - </Map> - ); + {selectedStop && ( + <StopSheet + isOpen={isSheetOpen} + onClose={() => setIsSheetOpen(false)} + stopId={selectedStop.stopId} + stopName={selectedStop.name} + /> + )} + </Map> + ); } diff --git a/src/frontend/app/routes/settings.tsx b/src/frontend/app/routes/settings.tsx index e657c03..c08b2c9 100644 --- a/src/frontend/app/routes/settings.tsx +++ b/src/frontend/app/routes/settings.tsx @@ -3,74 +3,130 @@ import "./settings.css"; import { useTranslation } from "react-i18next"; export default function Settings() { - const { t, i18n } = useTranslation(); - const { theme, setTheme, tableStyle, setTableStyle, mapPositionMode, setMapPositionMode } = useApp(); + const { t, i18n } = useTranslation(); + const { + theme, + setTheme, + tableStyle, + setTableStyle, + mapPositionMode, + setMapPositionMode, + } = useApp(); - return ( - <div className="page-container"> - <h1 className="page-title">{t('about.title')}</h1> - <p className="about-description"> - {t('about.description')} - </p> - <section className="settings-section"> - <h2>{t('about.settings')}</h2> - <div className="settings-content-inline"> - <label htmlFor="theme" className="form-label-inline">{t('about.theme')}</label> - <select id="theme" className="form-select-inline" value={theme} onChange={(e) => setTheme(e.target.value as "light" | "dark")}> - <option value="light">{t('about.theme_light')}</option> - <option value="dark">{t('about.theme_dark')}</option> - </select> - </div> - <div className="settings-content-inline"> - <label htmlFor="tableStyle" className="form-label-inline">{t('about.table_style')}</label> - <select id="tableStyle" className="form-select-inline" value={tableStyle} onChange={(e) => setTableStyle(e.target.value as "regular" | "grouped")}> - <option value="regular">{t('about.table_style_regular')}</option> - <option value="grouped">{t('about.table_style_grouped')}</option> - </select> - </div> - <div className="settings-content-inline"> - <label htmlFor="mapPositionMode" className="form-label-inline">{t('about.map_position_mode')}</label> - <select id="mapPositionMode" className="form-select-inline" value={mapPositionMode} onChange={e => setMapPositionMode(e.target.value as 'gps' | 'last')}> - <option value="gps">{t('about.map_position_gps')}</option> - <option value="last">{t('about.map_position_last')}</option> - </select> - </div> - <div className="settings-content-inline"> - <label htmlFor="language" className="form-label-inline">Idioma:</label> - <select - id="language" - className="form-select-inline" - value={i18n.language} - onChange={e => i18n.changeLanguage(e.target.value)} - > - <option value="es-ES">Español</option> - <option value="gl-ES">Galego</option> - <option value="en-GB">English</option> - </select> - </div> - <details className="form-details"> - <summary>{t('about.details_summary')}</summary> - <p>{t('about.details_table')}</p> - <dl> - <dt>{t('about.table_style_regular')}</dt> - <dd>{t('about.details_regular')}</dd> - <dt>{t('about.table_style_grouped')}</dt> - <dd>{t('about.details_grouped')}</dd> - </dl> - </details> - </section> - <h2>{t('about.credits')}</h2> - <p> - <a href="https://github.com/arielcostas/urbanovigo-web" className="about-link" rel="nofollow noreferrer noopener"> - {t('about.github')} - </a> - - {t('about.developed_by')} <a href="https://www.costas.dev" className="about-link" rel="nofollow noreferrer noopener"> - Ariel Costas - </a> - </p> - <p> - {t('about.data_source_prefix')} <a href="https://datos.vigo.org" className="about-link" rel="nofollow noreferrer noopener">datos.vigo.org</a> {t('about.data_source_middle')} <a href="https://opendefinition.org/licenses/odc-by/" className="about-link" rel="nofollow noreferrer noopener">Open Data Commons Attribution License</a> - </p> + return ( + <div className="page-container"> + <h1 className="page-title">{t("about.title")}</h1> + <p className="about-description">{t("about.description")}</p> + <section className="settings-section"> + <h2>{t("about.settings")}</h2> + <div className="settings-content-inline"> + <label htmlFor="theme" className="form-label-inline"> + {t("about.theme")} + </label> + <select + id="theme" + className="form-select-inline" + value={theme} + onChange={(e) => setTheme(e.target.value as "light" | "dark")} + > + <option value="light">{t("about.theme_light")}</option> + <option value="dark">{t("about.theme_dark")}</option> + </select> </div> - ) + <div className="settings-content-inline"> + <label htmlFor="tableStyle" className="form-label-inline"> + {t("about.table_style")} + </label> + <select + id="tableStyle" + className="form-select-inline" + value={tableStyle} + onChange={(e) => + setTableStyle(e.target.value as "regular" | "grouped") + } + > + <option value="regular">{t("about.table_style_regular")}</option> + <option value="grouped">{t("about.table_style_grouped")}</option> + </select> + </div> + <div className="settings-content-inline"> + <label htmlFor="mapPositionMode" className="form-label-inline"> + {t("about.map_position_mode")} + </label> + <select + id="mapPositionMode" + className="form-select-inline" + value={mapPositionMode} + onChange={(e) => + setMapPositionMode(e.target.value as "gps" | "last") + } + > + <option value="gps">{t("about.map_position_gps")}</option> + <option value="last">{t("about.map_position_last")}</option> + </select> + </div> + <div className="settings-content-inline"> + <label htmlFor="language" className="form-label-inline"> + Idioma: + </label> + <select + id="language" + className="form-select-inline" + value={i18n.language} + onChange={(e) => i18n.changeLanguage(e.target.value)} + > + <option value="es-ES">Español</option> + <option value="gl-ES">Galego</option> + <option value="en-GB">English</option> + </select> + </div> + <details className="form-details"> + <summary>{t("about.details_summary")}</summary> + <p>{t("about.details_table")}</p> + <dl> + <dt>{t("about.table_style_regular")}</dt> + <dd>{t("about.details_regular")}</dd> + <dt>{t("about.table_style_grouped")}</dt> + <dd>{t("about.details_grouped")}</dd> + </dl> + </details> + </section> + <h2>{t("about.credits")}</h2> + <p> + <a + href="https://github.com/arielcostas/urbanovigo-web" + className="about-link" + rel="nofollow noreferrer noopener" + > + {t("about.github")} + </a>{" "} + -{t("about.developed_by")}{" "} + <a + href="https://www.costas.dev" + className="about-link" + rel="nofollow noreferrer noopener" + > + Ariel Costas + </a> + </p> + <p> + {t("about.data_source_prefix")}{" "} + <a + href="https://datos.vigo.org" + className="about-link" + rel="nofollow noreferrer noopener" + > + datos.vigo.org + </a>{" "} + {t("about.data_source_middle")}{" "} + <a + href="https://opendefinition.org/licenses/odc-by/" + className="about-link" + rel="nofollow noreferrer noopener" + > + Open Data Commons Attribution License + </a> + </p> + </div> + ); } diff --git a/src/frontend/app/routes/stoplist.tsx b/src/frontend/app/routes/stoplist.tsx index 9404b39..58cdab4 100644 --- a/src/frontend/app/routes/stoplist.tsx +++ b/src/frontend/app/routes/stoplist.tsx @@ -2,125 +2,143 @@ import { useEffect, useMemo, useRef, useState } from "react"; import StopDataProvider, { type Stop } from "../data/StopDataProvider"; import StopItem from "../components/StopItem"; import Fuse from "fuse.js"; -import './stoplist.css'; +import "./stoplist.css"; import { useTranslation } from "react-i18next"; export default function StopList() { - const { t } = useTranslation(); - const [data, setData] = useState<Stop[] | null>(null) - const [searchResults, setSearchResults] = useState<Stop[] | null>(null); - const searchTimeout = useRef<NodeJS.Timeout | null>(null); + const { t } = useTranslation(); + const [data, setData] = useState<Stop[] | null>(null); + const [searchResults, setSearchResults] = useState<Stop[] | null>(null); + const searchTimeout = useRef<NodeJS.Timeout | null>(null); - const randomPlaceholder = useMemo(() => t('stoplist.search_placeholder'), [t]); - const fuse = useMemo(() => new Fuse(data || [], { threshold: 0.3, keys: ['name.original'] }), [data]); + const randomPlaceholder = useMemo( + () => t("stoplist.search_placeholder"), + [t], + ); + const fuse = useMemo( + () => new Fuse(data || [], { threshold: 0.3, keys: ["name.original"] }), + [data], + ); - useEffect(() => { - StopDataProvider.getStops().then((stops: Stop[]) => setData(stops)) - }, []); + useEffect(() => { + StopDataProvider.getStops().then((stops: Stop[]) => setData(stops)); + }, []); - const handleStopSearch = (event: React.ChangeEvent<HTMLInputElement>) => { - const stopName = event.target.value || ""; + const handleStopSearch = (event: React.ChangeEvent<HTMLInputElement>) => { + const stopName = event.target.value || ""; - if (searchTimeout.current) { - clearTimeout(searchTimeout.current); - } + if (searchTimeout.current) { + clearTimeout(searchTimeout.current); + } - searchTimeout.current = setTimeout(() => { - if (stopName.length === 0) { - setSearchResults(null); - return; - } + searchTimeout.current = setTimeout(() => { + if (stopName.length === 0) { + setSearchResults(null); + return; + } - if (!data) { - console.error("No data available for search"); - return; - } + if (!data) { + console.error("No data available for search"); + return; + } - const results = fuse.search(stopName); - const items = results.map(result => result.item); - setSearchResults(items); - }, 300); - } + const results = fuse.search(stopName); + const items = results.map((result) => result.item); + setSearchResults(items); + }, 300); + }; - const favouritedStops = useMemo(() => { - return data?.filter(stop => stop.favourite) ?? [] - }, [data]) + const favouritedStops = useMemo(() => { + return data?.filter((stop) => stop.favourite) ?? []; + }, [data]); - const recentStops = useMemo(() => { - // no recent items if data not loaded - if (!data) return null; - const recentIds = StopDataProvider.getRecent(); - if (recentIds.length === 0) return null; - // map and filter out missing entries - const stopsList = recentIds - .map(id => data.find(stop => stop.stopId === id)) - .filter((s): s is Stop => Boolean(s)); - return stopsList.reverse(); - }, [data]); + const recentStops = useMemo(() => { + // no recent items if data not loaded + if (!data) return null; + const recentIds = StopDataProvider.getRecent(); + if (recentIds.length === 0) return null; + // map and filter out missing entries + const stopsList = recentIds + .map((id) => data.find((stop) => stop.stopId === id)) + .filter((s): s is Stop => Boolean(s)); + return stopsList.reverse(); + }, [data]); - if (data === null) return <h1 className="page-title">{t('common.loading')}</h1> + if (data === null) + return <h1 className="page-title">{t("common.loading")}</h1>; - return ( - <div className="page-container"> - <h1 className="page-title">UrbanoVigo Web</h1> + return ( + <div className="page-container"> + <h1 className="page-title">UrbanoVigo Web</h1> - <form className="search-form"> - <div className="form-group"> - <label className="form-label" htmlFor="stopName"> - {t('stoplist.search_label', 'Buscar paradas')} - </label> - <input className="form-input" type="text" placeholder={randomPlaceholder} id="stopName" onChange={handleStopSearch} /> - </div> - </form> + <form className="search-form"> + <div className="form-group"> + <label className="form-label" htmlFor="stopName"> + {t("stoplist.search_label", "Buscar paradas")} + </label> + <input + className="form-input" + type="text" + placeholder={randomPlaceholder} + id="stopName" + onChange={handleStopSearch} + /> + </div> + </form> - {searchResults && searchResults.length > 0 && ( - <div className="list-container"> - <h2 className="page-subtitle">{t('stoplist.search_results', 'Resultados de la búsqueda')}</h2> - <ul className="list"> - {searchResults.map((stop: Stop) => ( - <StopItem key={stop.stopId} stop={stop} /> - ))} - </ul> - </div> - )} + {searchResults && searchResults.length > 0 && ( + <div className="list-container"> + <h2 className="page-subtitle"> + {t("stoplist.search_results", "Resultados de la búsqueda")} + </h2> + <ul className="list"> + {searchResults.map((stop: Stop) => ( + <StopItem key={stop.stopId} stop={stop} /> + ))} + </ul> + </div> + )} - <div className="list-container"> - <h2 className="page-subtitle">{t('stoplist.favourites')}</h2> + <div className="list-container"> + <h2 className="page-subtitle">{t("stoplist.favourites")}</h2> - {favouritedStops?.length === 0 && ( - <p className="message"> - {t('stoplist.no_favourites', 'Accede a una parada y márcala como favorita para verla aquí.')} - </p> - )} + {favouritedStops?.length === 0 && ( + <p className="message"> + {t( + "stoplist.no_favourites", + "Accede a una parada y márcala como favorita para verla aquí.", + )} + </p> + )} - <ul className="list"> - {favouritedStops?.sort((a, b) => a.stopId - b.stopId).map((stop: Stop) => ( - <StopItem key={stop.stopId} stop={stop} /> - ))} - </ul> - </div> + <ul className="list"> + {favouritedStops + ?.sort((a, b) => a.stopId - b.stopId) + .map((stop: Stop) => <StopItem key={stop.stopId} stop={stop} />)} + </ul> + </div> - {recentStops && recentStops.length > 0 && ( - <div className="list-container"> - <h2 className="page-subtitle">{t('stoplist.recents')}</h2> + {recentStops && recentStops.length > 0 && ( + <div className="list-container"> + <h2 className="page-subtitle">{t("stoplist.recents")}</h2> - <ul className="list"> - {recentStops.map((stop: Stop) => ( - <StopItem key={stop.stopId} stop={stop} /> - ))} - </ul> - </div> - )} + <ul className="list"> + {recentStops.map((stop: Stop) => ( + <StopItem key={stop.stopId} stop={stop} /> + ))} + </ul> + </div> + )} - <div className="list-container"> - <h2 className="page-subtitle">{t('stoplist.all_stops', 'Paradas')}</h2> + <div className="list-container"> + <h2 className="page-subtitle">{t("stoplist.all_stops", "Paradas")}</h2> - <ul className="list"> - {data?.sort((a, b) => a.stopId - b.stopId).map((stop: Stop) => ( - <StopItem key={stop.stopId} stop={stop} /> - ))} - </ul> - </div> - </div> - ) + <ul className="list"> + {data + ?.sort((a, b) => a.stopId - b.stopId) + .map((stop: Stop) => <StopItem key={stop.stopId} stop={stop} />)} + </ul> + </div> + </div> + ); } diff --git a/src/frontend/index.html b/src/frontend/index.html index 4812ce5..f208550 100644 --- a/src/frontend/index.html +++ b/src/frontend/index.html @@ -1,55 +1,65 @@ <!doctype html> <html lang="es"> + <head> + <meta name="viewport" content="width=device-width, initial-scale=1.0" /> + <meta charset="UTF-8" /> -<head> - <meta name="viewport" content="width=device-width, initial-scale=1.0" /> - <meta charset="UTF-8" /> + <title>UrbanoVigo Web</title> - <title>UrbanoVigo Web</title> + <link rel="icon" type="image/jpg" href="/logo-512.jpg" /> + <link rel="icon" href="/favicon.ico" sizes="64x64" /> + <link rel="apple-touch-icon" href="/logo-512.jpg" sizes="512x512" /> + <meta name="theme-color" content="#007bff" /> - <link rel="icon" type="image/jpg" href="/logo-512.jpg" /> - <link rel="icon" href="/favicon.ico" sizes="64x64" /> - <link rel="apple-touch-icon" href="/logo-512.jpg" sizes="512x512" /> - <meta name="theme-color" content="#007bff" /> + <link rel="canonical" href="https://urbanovigo.costas.dev/" /> - <link rel="canonical" href="https://urbanovigo.costas.dev/" /> + <meta + name="description" + content="Aplicación web para encontrar paradas y tiempos de llegada de los autobuses urbanos de Vigo, España." + /> + <meta + name="keywords" + content="Vigo, autobús, urbano, parada, tiempo, llegada, transporte, público, España" + /> + <meta name="author" content="Ariel Costas Guerrero" /> - <meta name="description" content="Aplicación web para encontrar paradas y tiempos de llegada de los autobuses urbanos de Vigo, España." /> - <meta name="keywords" content="Vigo, autobús, urbano, parada, tiempo, llegada, transporte, público, España" /> - <meta name="author" content="Ariel Costas Guerrero" /> + <meta property="og:title" content="UrbanoVigo Web" /> + <meta property="og:type" content="website" /> + <meta property="og:url" content="https://urbanovigo.costas.dev/" /> + <meta + property="og:image" + content="https://urbanovigo.costas.dev/logo-512.jpg" + /> + <meta + property="og:description" + content="Aplicación web para encontrar paradas y tiempos de llegada de los autobuses urbanos de Vigo, España." + /> - <meta property="og:title" content="UrbanoVigo Web" /> - <meta property="og:type" content="website" /> - <meta property="og:url" content="https://urbanovigo.costas.dev/" /> - <meta property="og:image" content="https://urbanovigo.costas.dev/logo-512.jpg" /> - <meta property="og:description" content="Aplicación web para encontrar paradas y tiempos de llegada de los autobuses urbanos de Vigo, España." /> + <link rel="manifest" href="/manifest.webmanifest" /> - <link rel="manifest" href="/manifest.webmanifest" /> + <meta name="robots" content="noindex, nofollow" /> + <meta name="googlebot" content="noindex, nofollow" /> - <meta name="robots" content="noindex, nofollow" /> - <meta name="googlebot" content="noindex, nofollow" /> + <style> + body { + margin: 0; + padding: 0; + box-sizing: border-box; + } + </style> + </head> - <style> - body { - margin: 0; - padding: 0; - box-sizing: border-box; - } - </style> -</head> + <body> + <div id="root"></div> + <script type="module" src="/src/main.tsx"></script> -<body> - <div id="root"></div> - <script type="module" src="/src/main.tsx"></script> - - <script> - if ('serviceWorker' in navigator) { - navigator.serviceWorker.register('/sw.js'); - navigator.serviceWorker.ready.then(registration => { - registration.update(); - }); - } - </script> -</body> - -</html>
\ No newline at end of file + <script> + if ("serviceWorker" in navigator) { + navigator.serviceWorker.register("/sw.js"); + navigator.serviceWorker.ready.then((registration) => { + registration.update(); + }); + } + </script> + </body> +</html> diff --git a/src/frontend/package.json b/src/frontend/package.json index b9b68b5..6463dd9 100644 --- a/src/frontend/package.json +++ b/src/frontend/package.json @@ -23,6 +23,7 @@ "react-dom": "^19.1.0", "react-leaflet": "^5.0.0", "react-leaflet-markercluster": "^5.0.0-rc.0", + "react-modal-sheet": "^4.4.0", "react-router": "^7.6.0" }, "devDependencies": { diff --git a/src/frontend/public/manifest.webmanifest b/src/frontend/public/manifest.webmanifest index 59fbab1..5dd08fa 100644 --- a/src/frontend/public/manifest.webmanifest +++ b/src/frontend/public/manifest.webmanifest @@ -1,84 +1,84 @@ { - "$schema": "https://raw.githubusercontent.com/SchemaStore/schemastore/refs/heads/master/src/schemas/json/web-manifest.json", - "id": "https://busurbano.costas.dev/", - "name": "UrbanoVigo Web", - "description": "Aplicación web para encontrar paradas y tiempos de llegada de los autobuses urbanos de Vigo, España.", - "short_name": "UrbanoVigo", - "start_url": "/", - "display": "standalone", - "orientation": "portrait-primary", - "lang": "es", - "background_color": "#ffffff", - "theme_color": "#007bff", - "icons": [ - { - "src": "/logo-512.jpg", - "sizes": "512x512", - "type": "image/jpg", - "purpose": "any maskable" - }, - { - "src": "/logo-256.jpg", - "sizes": "256x256", - "type": "image/jpg", - "purpose": "any maskable" - }, - { - "src": "/logo-256.png", - "sizes": "256x256", - "type": "image/png", - "purpose": "any maskable" - }, - { - "src": "/favicon.ico", - "sizes": "64x64", - "type": "image/x-icon", - "purpose": "any maskable" - } - ], - "screenshots": [ - { - "src": "/screenshots/stoplist-narrow.png", - "sizes": "1440x2960", - "type": "image/png", - "form_factor": "narrow", - "label": "Lista de paradas" - }, - { - "src": "/screenshots/map-narrow.png", - "sizes": "1440x2960", - "type": "image/png", - "form_factor": "narrow", - "label": "Mapa de paradas" - }, - { - "src": "/screenshots/estimates-narrow.png", - "sizes": "1440x2960", - "type": "image/png", - "form_factor": "narrow", - "label": "Estimaciones de llegada a parada" - }, + "$schema": "https://raw.githubusercontent.com/SchemaStore/schemastore/refs/heads/master/src/schemas/json/web-manifest.json", + "id": "https://busurbano.costas.dev/", + "name": "UrbanoVigo Web", + "description": "Aplicación web para encontrar paradas y tiempos de llegada de los autobuses urbanos de Vigo, España.", + "short_name": "UrbanoVigo", + "start_url": "/", + "display": "standalone", + "orientation": "portrait-primary", + "lang": "es", + "background_color": "#ffffff", + "theme_color": "#007bff", + "icons": [ + { + "src": "/logo-512.jpg", + "sizes": "512x512", + "type": "image/jpg", + "purpose": "any maskable" + }, + { + "src": "/logo-256.jpg", + "sizes": "256x256", + "type": "image/jpg", + "purpose": "any maskable" + }, + { + "src": "/logo-256.png", + "sizes": "256x256", + "type": "image/png", + "purpose": "any maskable" + }, + { + "src": "/favicon.ico", + "sizes": "64x64", + "type": "image/x-icon", + "purpose": "any maskable" + } + ], + "screenshots": [ + { + "src": "/screenshots/stoplist-narrow.png", + "sizes": "1440x2960", + "type": "image/png", + "form_factor": "narrow", + "label": "Lista de paradas" + }, + { + "src": "/screenshots/map-narrow.png", + "sizes": "1440x2960", + "type": "image/png", + "form_factor": "narrow", + "label": "Mapa de paradas" + }, + { + "src": "/screenshots/estimates-narrow.png", + "sizes": "1440x2960", + "type": "image/png", + "form_factor": "narrow", + "label": "Estimaciones de llegada a parada" + }, - { - "src": "/screenshots/stoplist-wide.jpeg", - "sizes": "1788x891", - "type": "image/jpeg", - "form_factor": "wide", - "label": "Lista de paradas" - }, - { - "src": "/screenshots/map-wide.jpeg", - "sizes": "1788x891", - "type": "image/jpeg", - "form_factor": "wide", - "label": "Mapa de paradas" - }, - { - "src": "/screenshots/estimates-wide.jpeg", - "sizes": "1788x891", - "type": "image/jpeg", - "form_factor": "wide", - "label": "Estimaciones de llegada a parada" - } - ] -}
\ No newline at end of file + { + "src": "/screenshots/stoplist-wide.jpeg", + "sizes": "1788x891", + "type": "image/jpeg", + "form_factor": "wide", + "label": "Lista de paradas" + }, + { + "src": "/screenshots/map-wide.jpeg", + "sizes": "1788x891", + "type": "image/jpeg", + "form_factor": "wide", + "label": "Mapa de paradas" + }, + { + "src": "/screenshots/estimates-wide.jpeg", + "sizes": "1788x891", + "type": "image/jpeg", + "form_factor": "wide", + "label": "Estimaciones de llegada a parada" + } + ] +} diff --git a/src/frontend/public/maps/spritesheet/sprite.json b/src/frontend/public/maps/spritesheet/sprite.json index 96b0971..044886e 100644 --- a/src/frontend/public/maps/spritesheet/sprite.json +++ b/src/frontend/public/maps/spritesheet/sprite.json @@ -1,10 +1,10 @@ { - "stop": { - "id": "stop", - "x": 0, - "y": 0, - "width": 32, - "height": 32, - "pixelRatio": 1 - } + "stop": { + "id": "stop", + "x": 0, + "y": 0, + "width": 32, + "height": 32, + "pixelRatio": 1 + } } diff --git a/src/frontend/public/maps/spritesheet/sprite@2x.json b/src/frontend/public/maps/spritesheet/sprite@2x.json index 37a2fbe..2a58c5f 100644 --- a/src/frontend/public/maps/spritesheet/sprite@2x.json +++ b/src/frontend/public/maps/spritesheet/sprite@2x.json @@ -1,10 +1,10 @@ { - "stop": { - "id": "stop", - "x": 0, - "y": 0, - "width": 64, - "height": 64, - "pixelRatio": 2 - } + "stop": { + "id": "stop", + "x": 0, + "y": 0, + "width": 64, + "height": 64, + "pixelRatio": 2 + } } diff --git a/src/frontend/public/maps/styles/carto-dark.json b/src/frontend/public/maps/styles/carto-dark.json index b3af6e7..dbaa515 100644 --- a/src/frontend/public/maps/styles/carto-dark.json +++ b/src/frontend/public/maps/styles/carto-dark.json @@ -1,33 +1,32 @@ { - "version": 8, - "name": "Light", - "sources": { - "carto": { - "type": "raster", - "tiles": ["https://d.basemaps.cartocdn.com/dark_all/{z}/{x}/{y}.png"], - "attribution": "© <a href=\"https://www.openstreetmap.org/copyright\">OpenStreetMap</a> contributors, © <a href=\"https://carto.com/attributions\">CARTO</a>", - "tileSize": 256, - "maxzoom": 22, - "minzoom": 0 - } + "version": 8, + "name": "Light", + "sources": { + "carto": { + "type": "raster", + "tiles": ["https://d.basemaps.cartocdn.com/dark_all/{z}/{x}/{y}.png"], + "attribution": "© <a href=\"https://www.openstreetmap.org/copyright\">OpenStreetMap</a> contributors, © <a href=\"https://carto.com/attributions\">CARTO</a>", + "tileSize": 256, + "maxzoom": 22, + "minzoom": 0 + } + }, + "layers": [ + { + "id": "background", + "type": "background", + "paint": { + "background-color": "#f0f0f0" + } }, - "layers": [ - { - "id": "background", - "type": "background", - "paint": { - "background-color": "#f0f0f0" - } - }, - { - "id": "raster", - "type": "raster", - "source": "carto", - "minzoom": 0, - "maxzoom": 22 - } - - ], - "sprite": "/maps/spritesheet/sprite", - "glyphs": "/maps/fonts/{fontstack}/{range}.pbf" + { + "id": "raster", + "type": "raster", + "source": "carto", + "minzoom": 0, + "maxzoom": 22 + } + ], + "sprite": "/maps/spritesheet/sprite", + "glyphs": "/maps/fonts/{fontstack}/{range}.pbf" } diff --git a/src/frontend/public/maps/styles/carto-light.json b/src/frontend/public/maps/styles/carto-light.json index 957386e..563af6d 100644 --- a/src/frontend/public/maps/styles/carto-light.json +++ b/src/frontend/public/maps/styles/carto-light.json @@ -1,33 +1,34 @@ { - "version": 8, - "name": "Light", - "sources": { - "carto": { - "type": "raster", - "tiles": ["https://d.basemaps.cartocdn.com/rastertiles/voyager/{z}/{x}/{y}.png"], - "attribution": "© <a href=\"https://www.openstreetmap.org/copyright\">OpenStreetMap</a> contributors, © <a href=\"https://carto.com/attributions\">CARTO</a>", - "tileSize": 256, - "maxzoom": 22, - "minzoom": 0 - } + "version": 8, + "name": "Light", + "sources": { + "carto": { + "type": "raster", + "tiles": [ + "https://d.basemaps.cartocdn.com/rastertiles/voyager/{z}/{x}/{y}.png" + ], + "attribution": "© <a href=\"https://www.openstreetmap.org/copyright\">OpenStreetMap</a> contributors, © <a href=\"https://carto.com/attributions\">CARTO</a>", + "tileSize": 256, + "maxzoom": 22, + "minzoom": 0 + } + }, + "layers": [ + { + "id": "background", + "type": "background", + "paint": { + "background-color": "#f0f0f0" + } }, - "layers": [ - { - "id": "background", - "type": "background", - "paint": { - "background-color": "#f0f0f0" - } - }, - { - "id": "raster", - "type": "raster", - "source": "carto", - "minzoom": 0, - "maxzoom": 22 - } - - ], - "sprite": "/maps/spritesheet/sprite", - "glyphs": "/maps/fonts/{fontstack}/{range}.pbf" + { + "id": "raster", + "type": "raster", + "source": "carto", + "minzoom": 0, + "maxzoom": 22 + } + ], + "sprite": "/maps/spritesheet/sprite", + "glyphs": "/maps/fonts/{fontstack}/{range}.pbf" } diff --git a/src/frontend/public/stops.json b/src/frontend/public/stops.json index 7c0ac8b..4446528 100644 --- a/src/frontend/public/stops.json +++ b/src/frontend/public/stops.json @@ -6,9 +6,7 @@ }, "latitude": 42.187593499, "longitude": -8.741246641, - "lines": [ - "17" - ] + "lines": ["17"] }, { "stopId": 40, @@ -17,9 +15,7 @@ }, "latitude": 42.192126677, "longitude": -8.72901589, - "lines": [ - "17" - ] + "lines": ["17"] }, { "stopId": 50, @@ -28,9 +24,7 @@ }, "latitude": 42.19287042, "longitude": -8.727513924, - "lines": [ - "17" - ] + "lines": ["17"] }, { "stopId": 70, @@ -39,10 +33,7 @@ }, "latitude": 42.20020175, "longitude": -8.700621608, - "lines": [ - "18A", - "18B" - ] + "lines": ["18A", "18B"] }, { "stopId": 80, @@ -51,10 +42,7 @@ }, "latitude": 42.200132216, "longitude": -8.700535777, - "lines": [ - "18A", - "18B" - ] + "lines": ["18A", "18B"] }, { "stopId": 90, @@ -63,9 +51,7 @@ }, "latitude": 42.225956918, "longitude": -8.63286469, - "lines": [ - "A" - ] + "lines": ["A"] }, { "stopId": 100, @@ -74,9 +60,7 @@ }, "latitude": 42.219008975, "longitude": -8.69606935, - "lines": [ - "6" - ] + "lines": ["6"] }, { "stopId": 110, @@ -85,9 +69,7 @@ }, "latitude": 42.215074591, "longitude": -8.696738405, - "lines": [ - "6" - ] + "lines": ["6"] }, { "stopId": 120, @@ -96,9 +78,7 @@ }, "latitude": 42.223288295, "longitude": -8.700954873, - "lines": [ - "6" - ] + "lines": ["6"] }, { "stopId": 130, @@ -107,9 +87,7 @@ }, "latitude": 42.219001694, "longitude": -8.696198267, - "lines": [ - "6" - ] + "lines": ["6"] }, { "stopId": 140, @@ -118,9 +96,7 @@ }, "latitude": 42.223444913, "longitude": -8.700801996, - "lines": [ - "6" - ] + "lines": ["6"] }, { "stopId": 150, @@ -129,9 +105,7 @@ }, "latitude": 42.222636676, "longitude": -8.697201413, - "lines": [ - "6" - ] + "lines": ["6"] }, { "stopId": 160, @@ -140,9 +114,7 @@ }, "latitude": 42.222830286, "longitude": -8.697231476, - "lines": [ - "6" - ] + "lines": ["6"] }, { "stopId": 170, @@ -151,9 +123,7 @@ }, "latitude": 42.215084316, "longitude": -8.696854931, - "lines": [ - "6" - ] + "lines": ["6"] }, { "stopId": 180, @@ -162,9 +132,7 @@ }, "latitude": 42.166144986, "longitude": -8.720162371, - "lines": [ - "7" - ] + "lines": ["7"] }, { "stopId": 190, @@ -173,10 +141,7 @@ }, "latitude": 42.250539537, "longitude": -8.685179363, - "lines": [ - "C3i", - "10" - ] + "lines": ["C3i", "10"] }, { "stopId": 195, @@ -185,10 +150,7 @@ }, "latitude": 42.256624708, "longitude": -8.677490797, - "lines": [ - "C3d", - "10" - ] + "lines": ["C3d", "10"] }, { "stopId": 200, @@ -197,10 +159,7 @@ }, "latitude": 42.252115803, "longitude": -8.683374373, - "lines": [ - "C3i", - "10" - ] + "lines": ["C3i", "10"] }, { "stopId": 210, @@ -209,10 +168,7 @@ }, "latitude": 42.255798748, "longitude": -8.678507526, - "lines": [ - "C3i", - "10" - ] + "lines": ["C3i", "10"] }, { "stopId": 220, @@ -221,10 +177,7 @@ }, "latitude": 42.252694363, "longitude": -8.68302903, - "lines": [ - "C3d", - "10" - ] + "lines": ["C3d", "10"] }, { "stopId": 230, @@ -233,10 +186,7 @@ }, "latitude": 42.248041601, "longitude": -8.691024475, - "lines": [ - "C3i", - "10" - ] + "lines": ["C3i", "10"] }, { "stopId": 240, @@ -245,10 +195,7 @@ }, "latitude": 42.247513476, "longitude": -8.691874301, - "lines": [ - "C3d", - "10" - ] + "lines": ["C3d", "10"] }, { "stopId": 250, @@ -257,10 +204,7 @@ }, "latitude": 42.255252085, "longitude": -8.679480662, - "lines": [ - "C3d", - "10" - ] + "lines": ["C3d", "10"] }, { "stopId": 260, @@ -269,10 +213,7 @@ }, "latitude": 42.250421216, "longitude": -8.685464716, - "lines": [ - "C3d", - "10" - ] + "lines": ["C3d", "10"] }, { "stopId": 270, @@ -281,10 +222,7 @@ }, "latitude": 42.18920151, "longitude": -8.810340862, - "lines": [ - "C3d", - "10" - ] + "lines": ["C3d", "10"] }, { "stopId": 280, @@ -293,10 +231,7 @@ }, "latitude": 42.189490674, "longitude": -8.808107114, - "lines": [ - "C3d", - "10" - ] + "lines": ["C3d", "10"] }, { "stopId": 290, @@ -305,10 +240,7 @@ }, "latitude": 42.190149471, "longitude": -8.803788225, - "lines": [ - "C3d", - "10" - ] + "lines": ["C3d", "10"] }, { "stopId": 310, @@ -317,10 +249,7 @@ }, "latitude": 42.190850463, "longitude": -8.80358845, - "lines": [ - "C3d", - "10" - ] + "lines": ["C3d", "10"] }, { "stopId": 320, @@ -329,10 +258,7 @@ }, "latitude": 42.189221331, "longitude": -8.811730246, - "lines": [ - "C3d", - "10" - ] + "lines": ["C3d", "10"] }, { "stopId": 330, @@ -341,10 +267,7 @@ }, "latitude": 42.187213169, "longitude": -8.813069201, - "lines": [ - "C3d", - "10" - ] + "lines": ["C3d", "10"] }, { "stopId": 340, @@ -353,10 +276,7 @@ }, "latitude": 42.238036494, "longitude": -8.700921187, - "lines": [ - "4A", - "H3" - ] + "lines": ["4A", "H3"] }, { "stopId": 350, @@ -365,10 +285,7 @@ }, "latitude": 42.240488915, "longitude": -8.700357923, - "lines": [ - "4A", - "H3" - ] + "lines": ["4A", "H3"] }, { "stopId": 360, @@ -377,10 +294,7 @@ }, "latitude": 42.24013184, "longitude": -8.700947033, - "lines": [ - "4A", - "H3" - ] + "lines": ["4A", "H3"] }, { "stopId": 370, @@ -389,10 +303,7 @@ }, "latitude": 42.242101304, "longitude": -8.698394546, - "lines": [ - "4A", - "H3" - ] + "lines": ["4A", "H3"] }, { "stopId": 380, @@ -401,10 +312,7 @@ }, "latitude": 42.242091376, "longitude": -8.698668131, - "lines": [ - "4A", - "H3" - ] + "lines": ["4A", "H3"] }, { "stopId": 390, @@ -413,10 +321,7 @@ }, "latitude": 42.233174046, "longitude": -8.702380309, - "lines": [ - "4A", - "H3" - ] + "lines": ["4A", "H3"] }, { "stopId": 400, @@ -425,10 +330,7 @@ }, "latitude": 42.235598195, "longitude": -8.701426538, - "lines": [ - "4A", - "H3" - ] + "lines": ["4A", "H3"] }, { "stopId": 410, @@ -437,10 +339,7 @@ }, "latitude": 42.235524387, "longitude": -8.701248417, - "lines": [ - "4A", - "H3" - ] + "lines": ["4A", "H3"] }, { "stopId": 420, @@ -449,10 +348,7 @@ }, "latitude": 42.238092485, "longitude": -8.701156245, - "lines": [ - "4A", - "H3" - ] + "lines": ["4A", "H3"] }, { "stopId": 430, @@ -461,15 +357,7 @@ }, "latitude": 42.239341996, "longitude": -8.720234413, - "lines": [ - "A", - "6", - "9B", - "18A", - "24", - "28", - "H1" - ] + "lines": ["A", "6", "9B", "18A", "24", "28", "H1"] }, { "stopId": 530, @@ -478,9 +366,7 @@ }, "latitude": 42.193562859, "longitude": -8.78173994, - "lines": [ - "12A" - ] + "lines": ["12A"] }, { "stopId": 540, @@ -489,9 +375,7 @@ }, "latitude": 42.189424424, "longitude": -8.790733064, - "lines": [ - "12A" - ] + "lines": ["12A"] }, { "stopId": 560, @@ -500,9 +384,7 @@ }, "latitude": 42.181015915, "longitude": -8.807696921, - "lines": [ - "10" - ] + "lines": ["10"] }, { "stopId": 570, @@ -511,9 +393,7 @@ }, "latitude": 42.195225102, "longitude": -8.775226375, - "lines": [ - "12A" - ] + "lines": ["12A"] }, { "stopId": 572, @@ -522,12 +402,7 @@ }, "latitude": 42.214058797, "longitude": -8.672946954, - "lines": [ - "12B", - "15B", - "15C", - "U2" - ] + "lines": ["12B", "15B", "15C", "U2"] }, { "stopId": 580, @@ -536,9 +411,7 @@ }, "latitude": 42.195766012, "longitude": -8.773648966, - "lines": [ - "12A" - ] + "lines": ["12A"] }, { "stopId": 600, @@ -547,11 +420,7 @@ }, "latitude": 42.189927171, "longitude": -8.800634184, - "lines": [ - "C3d", - "10", - "12A" - ] + "lines": ["C3d", "10", "12A"] }, { "stopId": 620, @@ -560,9 +429,7 @@ }, "latitude": 42.1935678, "longitude": -8.781529566, - "lines": [ - "12A" - ] + "lines": ["12A"] }, { "stopId": 630, @@ -571,9 +438,7 @@ }, "latitude": 42.189304527, "longitude": -8.79068363, - "lines": [ - "12A" - ] + "lines": ["12A"] }, { "stopId": 650, @@ -582,11 +447,7 @@ }, "latitude": 42.181065441, "longitude": -8.807509871, - "lines": [ - "C3d", - "10", - "12A" - ] + "lines": ["C3d", "10", "12A"] }, { "stopId": 660, @@ -595,12 +456,7 @@ }, "latitude": 42.211494566, "longitude": -8.736022397, - "lines": [ - "7", - "12B", - "17", - "H1" - ] + "lines": ["7", "12B", "17", "H1"] }, { "stopId": 680, @@ -609,9 +465,7 @@ }, "latitude": 42.229005723, "longitude": -8.634356866, - "lines": [ - "A" - ] + "lines": ["A"] }, { "stopId": 690, @@ -620,10 +474,7 @@ }, "latitude": 42.233064093, "longitude": -8.642742935, - "lines": [ - "A", - "25" - ] + "lines": ["A", "25"] }, { "stopId": 700, @@ -632,9 +483,7 @@ }, "latitude": 42.228674047, "longitude": -8.633340309, - "lines": [ - "A" - ] + "lines": ["A"] }, { "stopId": 710, @@ -643,14 +492,7 @@ }, "latitude": 42.232478958, "longitude": -8.701988706, - "lines": [ - "A", - "4A", - "9B", - "24", - "27", - "28" - ] + "lines": ["A", "4A", "9B", "24", "27", "28"] }, { "stopId": 720, @@ -659,11 +501,7 @@ }, "latitude": 42.235739016, "longitude": -8.684254232, - "lines": [ - "A", - "9B", - "27" - ] + "lines": ["A", "9B", "27"] }, { "stopId": 730, @@ -672,11 +510,7 @@ }, "latitude": 42.231109162, "longitude": -8.690501398, - "lines": [ - "A", - "9B", - "27" - ] + "lines": ["A", "9B", "27"] }, { "stopId": 740, @@ -685,11 +519,7 @@ }, "latitude": 42.233560754, "longitude": -8.686937524, - "lines": [ - "A", - "9B", - "27" - ] + "lines": ["A", "9B", "27"] }, { "stopId": 750, @@ -698,11 +528,7 @@ }, "latitude": 42.233103986, "longitude": -8.68716283, - "lines": [ - "A", - "9B", - "27" - ] + "lines": ["A", "9B", "27"] }, { "stopId": 760, @@ -711,11 +537,7 @@ }, "latitude": 42.236775611, "longitude": -8.683736566, - "lines": [ - "A", - "9B", - "27" - ] + "lines": ["A", "9B", "27"] }, { "stopId": 770, @@ -724,11 +546,7 @@ }, "latitude": 42.238939528, "longitude": -8.681422497, - "lines": [ - "A", - "9B", - "27" - ] + "lines": ["A", "9B", "27"] }, { "stopId": 780, @@ -737,11 +555,7 @@ }, "latitude": 42.238554288, "longitude": -8.680663432, - "lines": [ - "A", - "9B", - "27" - ] + "lines": ["A", "9B", "27"] }, { "stopId": 790, @@ -750,11 +564,7 @@ }, "latitude": 42.237426811, "longitude": -8.675474476, - "lines": [ - "A", - "9B", - "27" - ] + "lines": ["A", "9B", "27"] }, { "stopId": 800, @@ -763,11 +573,7 @@ }, "latitude": 42.237801674, "longitude": -8.676524783, - "lines": [ - "A", - "9B", - "27" - ] + "lines": ["A", "9B", "27"] }, { "stopId": 810, @@ -776,11 +582,7 @@ }, "latitude": 42.235521261, "longitude": -8.67465521, - "lines": [ - "A", - "9B", - "27" - ] + "lines": ["A", "9B", "27"] }, { "stopId": 820, @@ -789,10 +591,7 @@ }, "latitude": 42.234766626, "longitude": -8.671305131, - "lines": [ - "A", - "9B" - ] + "lines": ["A", "9B"] }, { "stopId": 830, @@ -801,11 +600,7 @@ }, "latitude": 42.234673289, "longitude": -8.671348046, - "lines": [ - "A", - "9B", - "27" - ] + "lines": ["A", "9B", "27"] }, { "stopId": 840, @@ -814,14 +609,7 @@ }, "latitude": 42.234904325, "longitude": -8.699245802, - "lines": [ - "A", - "4A", - "9B", - "24", - "27", - "28" - ] + "lines": ["A", "4A", "9B", "24", "27", "28"] }, { "stopId": 850, @@ -830,10 +618,7 @@ }, "latitude": 42.23630176, "longitude": -8.665791599, - "lines": [ - "A", - "9B" - ] + "lines": ["A", "9B"] }, { "stopId": 860, @@ -842,11 +627,7 @@ }, "latitude": 42.235612667, "longitude": -8.666529207, - "lines": [ - "A", - "9B", - "27" - ] + "lines": ["A", "9B", "27"] }, { "stopId": 870, @@ -855,10 +636,7 @@ }, "latitude": 42.23543058, "longitude": -8.66197943, - "lines": [ - "A", - "9B" - ] + "lines": ["A", "9B"] }, { "stopId": 880, @@ -867,11 +645,7 @@ }, "latitude": 42.23544051, "longitude": -8.662354939, - "lines": [ - "A", - "9B", - "27" - ] + "lines": ["A", "9B", "27"] }, { "stopId": 890, @@ -880,9 +654,7 @@ }, "latitude": 42.232066419, "longitude": -8.653842977, - "lines": [ - "A" - ] + "lines": ["A"] }, { "stopId": 900, @@ -891,9 +663,7 @@ }, "latitude": 42.233527998, "longitude": -8.648237616, - "lines": [ - "A" - ] + "lines": ["A"] }, { "stopId": 910, @@ -902,14 +672,7 @@ }, "latitude": 42.234679919, "longitude": -8.699623994, - "lines": [ - "A", - "4A", - "9B", - "24", - "27", - "28" - ] + "lines": ["A", "4A", "9B", "24", "27", "28"] }, { "stopId": 920, @@ -918,9 +681,7 @@ }, "latitude": 42.233499069, "longitude": -8.643325214, - "lines": [ - "A" - ] + "lines": ["A"] }, { "stopId": 930, @@ -929,9 +690,7 @@ }, "latitude": 42.231979036, "longitude": -8.65372496, - "lines": [ - "A" - ] + "lines": ["A"] }, { "stopId": 940, @@ -940,9 +699,7 @@ }, "latitude": 42.230493878, "longitude": -8.638023273, - "lines": [ - "A" - ] + "lines": ["A"] }, { "stopId": 950, @@ -951,10 +708,7 @@ }, "latitude": 42.233626818, "longitude": -8.647811163, - "lines": [ - "A", - "25" - ] + "lines": ["A", "25"] }, { "stopId": 960, @@ -963,9 +717,7 @@ }, "latitude": 42.230918888, "longitude": -8.638532893, - "lines": [ - "A" - ] + "lines": ["A"] }, { "stopId": 970, @@ -974,11 +726,7 @@ }, "latitude": 42.232787318, "longitude": -8.693473285, - "lines": [ - "A", - "9B", - "27" - ] + "lines": ["A", "9B", "27"] }, { "stopId": 980, @@ -987,11 +735,7 @@ }, "latitude": 42.221170087, "longitude": -8.763656977, - "lines": [ - "10", - "15B", - "15C" - ] + "lines": ["10", "15B", "15C"] }, { "stopId": 990, @@ -1000,11 +744,7 @@ }, "latitude": 42.222451366, "longitude": -8.769134894, - "lines": [ - "10", - "15B", - "15C" - ] + "lines": ["10", "15B", "15C"] }, { "stopId": 1000, @@ -1013,11 +753,7 @@ }, "latitude": 42.221220508, "longitude": -8.767194468, - "lines": [ - "10", - "15B", - "15C" - ] + "lines": ["10", "15B", "15C"] }, { "stopId": 1010, @@ -1026,12 +762,7 @@ }, "latitude": 42.221479642, "longitude": -8.767482698, - "lines": [ - "10", - "15B", - "15C", - "N1" - ] + "lines": ["10", "15B", "15C", "N1"] }, { "stopId": 1020, @@ -1040,12 +771,7 @@ }, "latitude": 42.222764778, "longitude": -8.769405842, - "lines": [ - "10", - "15B", - "15C", - "N1" - ] + "lines": ["10", "15B", "15C", "N1"] }, { "stopId": 1030, @@ -1054,11 +780,7 @@ }, "latitude": 42.223219677, "longitude": -8.754753277, - "lines": [ - "10", - "15B", - "15C" - ] + "lines": ["10", "15B", "15C"] }, { "stopId": 1040, @@ -1067,12 +789,7 @@ }, "latitude": 42.223237503, "longitude": -8.755707801, - "lines": [ - "10", - "15B", - "15C", - "N1" - ] + "lines": ["10", "15B", "15C", "N1"] }, { "stopId": 1050, @@ -1081,11 +798,7 @@ }, "latitude": 42.221875354, "longitude": -8.760935381, - "lines": [ - "10", - "15B", - "15C" - ] + "lines": ["10", "15B", "15C"] }, { "stopId": 1060, @@ -1094,12 +807,7 @@ }, "latitude": 42.221789505, "longitude": -8.759905458, - "lines": [ - "10", - "15B", - "15C", - "N1" - ] + "lines": ["10", "15B", "15C", "N1"] }, { "stopId": 1070, @@ -1108,12 +816,7 @@ }, "latitude": 42.221148357, "longitude": -8.764660969, - "lines": [ - "10", - "15B", - "15C", - "N1" - ] + "lines": ["10", "15B", "15C", "N1"] }, { "stopId": 1110, @@ -1122,11 +825,7 @@ }, "latitude": 42.237821273, "longitude": -8.729666379, - "lines": [ - "A", - "5B", - "6" - ] + "lines": ["A", "5B", "6"] }, { "stopId": 1120, @@ -1135,12 +834,7 @@ }, "latitude": 42.23416729, "longitude": -8.733331094, - "lines": [ - "6", - "9B", - "15B", - "28" - ] + "lines": ["6", "9B", "15B", "28"] }, { "stopId": 1130, @@ -1149,12 +843,7 @@ }, "latitude": 42.231238831, "longitude": -8.735255297, - "lines": [ - "6", - "9B", - "15B", - "28" - ] + "lines": ["6", "9B", "15B", "28"] }, { "stopId": 1140, @@ -1163,11 +852,7 @@ }, "latitude": 42.225068475, "longitude": -8.74774586, - "lines": [ - "6", - "9B", - "28" - ] + "lines": ["6", "9B", "28"] }, { "stopId": 1150, @@ -1176,18 +861,7 @@ }, "latitude": 42.237384264, "longitude": -8.729603006, - "lines": [ - "C1", - "C3d", - "A", - "5A", - "9B", - "10", - "15B", - "15C", - "28", - "N4" - ] + "lines": ["C1", "C3d", "A", "5A", "9B", "10", "15B", "15C", "28", "N4"] }, { "stopId": 1160, @@ -1196,11 +870,7 @@ }, "latitude": 42.225759663, "longitude": -8.743239749, - "lines": [ - "6", - "9B", - "28" - ] + "lines": ["6", "9B", "28"] }, { "stopId": 1200, @@ -1209,10 +879,7 @@ }, "latitude": 42.234233798, "longitude": -8.73312316, - "lines": [ - "10", - "15B" - ] + "lines": ["10", "15B"] }, { "stopId": 1210, @@ -1221,10 +888,7 @@ }, "latitude": 42.230811976, "longitude": -8.735364934, - "lines": [ - "10", - "15B" - ] + "lines": ["10", "15B"] }, { "stopId": 1220, @@ -1233,14 +897,7 @@ }, "latitude": 42.247097055, "longitude": -8.693109251, - "lines": [ - "5A", - "10", - "31", - "H2", - "H3", - "PSA 1" - ] + "lines": ["5A", "10", "31", "H2", "H3", "PSA 1"] }, { "stopId": 1230, @@ -1249,12 +906,7 @@ }, "latitude": 42.247251925, "longitude": -8.693122662, - "lines": [ - "5B", - "10", - "N1", - "H3" - ] + "lines": ["5B", "10", "N1", "H3"] }, { "stopId": 1240, @@ -1263,14 +915,7 @@ }, "latitude": 42.249128205, "longitude": -8.69514773, - "lines": [ - "5A", - "10", - "31", - "H2", - "H3", - "PSA 1" - ] + "lines": ["5A", "10", "31", "H2", "H3", "PSA 1"] }, { "stopId": 1250, @@ -1299,17 +944,7 @@ }, "latitude": 42.219775977, "longitude": -8.736255523, - "lines": [ - "C3i", - "4A", - "4C", - "5B", - "10", - "11", - "12A", - "15A", - "N1" - ] + "lines": ["C3i", "4A", "4C", "5B", "10", "11", "12A", "15A", "N1"] }, { "stopId": 1270, @@ -1338,16 +973,7 @@ }, "latitude": 42.218523315, "longitude": -8.74223465, - "lines": [ - "C3i", - "4A", - "4C", - "10", - "11", - "12A", - "15A", - "N1" - ] + "lines": ["C3i", "4A", "4C", "10", "11", "12A", "15A", "N1"] }, { "stopId": 1290, @@ -1400,18 +1026,7 @@ }, "latitude": 42.217705528, "longitude": -8.747753325, - "lines": [ - "C3i", - "4A", - "4C", - "10", - "11", - "12A", - "15A", - "23", - "N1", - "N4" - ] + "lines": ["C3i", "4A", "4C", "10", "11", "12A", "15A", "23", "N1", "N4"] }, { "stopId": 1320, @@ -1420,13 +1035,7 @@ }, "latitude": 42.217302224, "longitude": -8.751104752, - "lines": [ - "C3i", - "10", - "12A", - "23", - "N1" - ] + "lines": ["C3i", "10", "12A", "23", "N1"] }, { "stopId": 1330, @@ -1435,13 +1044,7 @@ }, "latitude": 42.219553947, "longitude": -8.732509436, - "lines": [ - "A", - "16", - "23", - "27", - "H2" - ] + "lines": ["A", "16", "23", "27", "H2"] }, { "stopId": 1340, @@ -1450,10 +1053,7 @@ }, "latitude": 42.212870645, "longitude": -8.732131792, - "lines": [ - "27", - "H2" - ] + "lines": ["27", "H2"] }, { "stopId": 1350, @@ -1462,12 +1062,7 @@ }, "latitude": 42.208026488, "longitude": -8.7312098, - "lines": [ - "7", - "12B", - "17", - "27" - ] + "lines": ["7", "12B", "17", "27"] }, { "stopId": 1360, @@ -1476,14 +1071,7 @@ }, "latitude": 42.219613217, "longitude": -8.732629194, - "lines": [ - "7", - "12B", - "17", - "27", - "H2", - "PTL" - ] + "lines": ["7", "12B", "17", "27", "H2", "PTL"] }, { "stopId": 1380, @@ -1492,11 +1080,7 @@ }, "latitude": 42.20533568, "longitude": -8.730078621, - "lines": [ - "7", - "12B", - "17" - ] + "lines": ["7", "12B", "17"] }, { "stopId": 1390, @@ -1505,17 +1089,7 @@ }, "latitude": 42.212735556, "longitude": -8.732314182, - "lines": [ - "A", - "7", - "12B", - "17", - "27", - "U1", - "H2", - "H", - "PTL" - ] + "lines": ["A", "7", "12B", "17", "27", "U1", "H2", "H", "PTL"] }, { "stopId": 1400, @@ -1524,18 +1098,7 @@ }, "latitude": 42.210706683, "longitude": -8.732237372, - "lines": [ - "A", - "7", - "12B", - "17", - "27", - "U1", - "H1", - "H2", - "H", - "PTL" - ] + "lines": ["A", "7", "12B", "17", "27", "U1", "H1", "H2", "H", "PTL"] }, { "stopId": 1410, @@ -1544,13 +1107,7 @@ }, "latitude": 42.218060161, "longitude": -8.732450427, - "lines": [ - "A", - "16", - "23", - "27", - "H2" - ] + "lines": ["A", "16", "23", "27", "H2"] }, { "stopId": 1420, @@ -1559,9 +1116,7 @@ }, "latitude": 42.201440099, "longitude": -8.726409762, - "lines": [ - "7" - ] + "lines": ["7"] }, { "stopId": 1430, @@ -1570,9 +1125,7 @@ }, "latitude": 42.203408408, "longitude": -8.728817983, - "lines": [ - "7" - ] + "lines": ["7"] }, { "stopId": 1440, @@ -1581,9 +1134,7 @@ }, "latitude": 42.198480135, "longitude": -8.723827649, - "lines": [ - "7" - ] + "lines": ["7"] }, { "stopId": 1450, @@ -1592,9 +1143,7 @@ }, "latitude": 42.201044695, "longitude": -8.726112037, - "lines": [ - "7" - ] + "lines": ["7"] }, { "stopId": 1460, @@ -1603,9 +1152,7 @@ }, "latitude": 42.198867605, "longitude": -8.72460549, - "lines": [ - "7" - ] + "lines": ["7"] }, { "stopId": 1470, @@ -1614,9 +1161,7 @@ }, "latitude": 42.194996678, "longitude": -8.72097155, - "lines": [ - "7" - ] + "lines": ["7"] }, { "stopId": 1480, @@ -1625,9 +1170,7 @@ }, "latitude": 42.19015727, "longitude": -8.72109012, - "lines": [ - "7" - ] + "lines": ["7"] }, { "stopId": 1490, @@ -1636,14 +1179,7 @@ }, "latitude": 42.210613294, "longitude": -8.732057664, - "lines": [ - "7", - "12B", - "17", - "27", - "H1", - "H2" - ] + "lines": ["7", "12B", "17", "27", "H1", "H2"] }, { "stopId": 1500, @@ -1652,14 +1188,7 @@ }, "latitude": 42.217084821, "longitude": -8.732530893, - "lines": [ - "7", - "12B", - "17", - "27", - "H2", - "PTL" - ] + "lines": ["7", "12B", "17", "27", "H2", "PTL"] }, { "stopId": 1510, @@ -1668,10 +1197,7 @@ }, "latitude": 42.215203365, "longitude": -8.670416197, - "lines": [ - "15B", - "15C" - ] + "lines": ["15B", "15C"] }, { "stopId": 1520, @@ -1680,10 +1206,7 @@ }, "latitude": 42.215400704, "longitude": -8.671308533, - "lines": [ - "15B", - "15C" - ] + "lines": ["15B", "15C"] }, { "stopId": 1530, @@ -1692,10 +1215,7 @@ }, "latitude": 42.212814417, "longitude": -8.670537674, - "lines": [ - "15B", - "15C" - ] + "lines": ["15B", "15C"] }, { "stopId": 1540, @@ -1704,12 +1224,7 @@ }, "latitude": 42.221677429, "longitude": -8.66978207, - "lines": [ - "11", - "15A", - "15B", - "15C" - ] + "lines": ["11", "15A", "15B", "15C"] }, { "stopId": 1550, @@ -1718,12 +1233,7 @@ }, "latitude": 42.221299207, "longitude": -8.670013709, - "lines": [ - "11", - "15A", - "15B", - "15C" - ] + "lines": ["11", "15A", "15B", "15C"] }, { "stopId": 1560, @@ -1732,10 +1242,7 @@ }, "latitude": 42.219388605, "longitude": -8.669172606, - "lines": [ - "15A", - "15B" - ] + "lines": ["15A", "15B"] }, { "stopId": 1570, @@ -1744,10 +1251,7 @@ }, "latitude": 42.217957539, "longitude": -8.669369577, - "lines": [ - "15B", - "15C" - ] + "lines": ["15B", "15C"] }, { "stopId": 1580, @@ -1756,10 +1260,7 @@ }, "latitude": 42.218393587, "longitude": -8.669480106, - "lines": [ - "15B", - "15C" - ] + "lines": ["15B", "15C"] }, { "stopId": 1590, @@ -1768,10 +1269,7 @@ }, "latitude": 42.256667905, "longitude": -8.682575386, - "lines": [ - "C3d", - "C3i" - ] + "lines": ["C3d", "C3i"] }, { "stopId": 1600, @@ -1780,10 +1278,7 @@ }, "latitude": 42.251389209, "longitude": -8.689369833, - "lines": [ - "C3d", - "C3i" - ] + "lines": ["C3d", "C3i"] }, { "stopId": 1610, @@ -1792,9 +1287,7 @@ }, "latitude": 42.251376198, "longitude": -8.68920404, - "lines": [ - "C3d" - ] + "lines": ["C3d"] }, { "stopId": 1620, @@ -1803,10 +1296,7 @@ }, "latitude": 42.253987165, "longitude": -8.686196616, - "lines": [ - "C3d", - "C3i" - ] + "lines": ["C3d", "C3i"] }, { "stopId": 1630, @@ -1815,10 +1305,7 @@ }, "latitude": 42.255177674, "longitude": -8.684734482, - "lines": [ - "C3d", - "C3i" - ] + "lines": ["C3d", "C3i"] }, { "stopId": 1640, @@ -1827,9 +1314,7 @@ }, "latitude": 42.254950083, "longitude": -8.684862748, - "lines": [ - "C3d" - ] + "lines": ["C3d"] }, { "stopId": 1650, @@ -1838,9 +1323,7 @@ }, "latitude": 42.256910715, "longitude": -8.68201353, - "lines": [ - "C3d" - ] + "lines": ["C3d"] }, { "stopId": 1660, @@ -1849,9 +1332,7 @@ }, "latitude": 42.259217959, "longitude": -8.679666503, - "lines": [ - "C3d" - ] + "lines": ["C3d"] }, { "stopId": 1670, @@ -1860,10 +1341,7 @@ }, "latitude": 42.258365967, "longitude": -8.680508997, - "lines": [ - "C3d", - "C3i" - ] + "lines": ["C3d", "C3i"] }, { "stopId": 1680, @@ -1872,9 +1350,7 @@ }, "latitude": 42.251327471, "longitude": -8.69260735, - "lines": [ - "C3d" - ] + "lines": ["C3d"] }, { "stopId": 1690, @@ -1883,10 +1359,7 @@ }, "latitude": 42.251420909, "longitude": -8.692153216, - "lines": [ - "C3d", - "C3i" - ] + "lines": ["C3d", "C3i"] }, { "stopId": 1710, @@ -1895,10 +1368,7 @@ }, "latitude": 42.274450823, "longitude": -8.667138233, - "lines": [ - "C3d", - "C3i" - ] + "lines": ["C3d", "C3i"] }, { "stopId": 1720, @@ -1907,9 +1377,7 @@ }, "latitude": 42.270480988, "longitude": -8.667726374, - "lines": [ - "C3d" - ] + "lines": ["C3d"] }, { "stopId": 1730, @@ -1918,9 +1386,7 @@ }, "latitude": 42.267833798, "longitude": -8.671345739, - "lines": [ - "C3d" - ] + "lines": ["C3d"] }, { "stopId": 1740, @@ -1929,10 +1395,7 @@ }, "latitude": 42.27068743, "longitude": -8.668057842, - "lines": [ - "C3d", - "C3i" - ] + "lines": ["C3d", "C3i"] }, { "stopId": 1750, @@ -1941,9 +1404,7 @@ }, "latitude": 42.266305919, "longitude": -8.672818918, - "lines": [ - "C3d" - ] + "lines": ["C3d"] }, { "stopId": 1760, @@ -1952,9 +1413,7 @@ }, "latitude": 42.26408966, "longitude": -8.674082239, - "lines": [ - "C3d" - ] + "lines": ["C3d"] }, { "stopId": 1770, @@ -1963,10 +1422,7 @@ }, "latitude": 42.26785896, "longitude": -8.671440263, - "lines": [ - "C3d", - "C3i" - ] + "lines": ["C3d", "C3i"] }, { "stopId": 1780, @@ -1975,10 +1431,7 @@ }, "latitude": 42.266245291, "longitude": -8.672965754, - "lines": [ - "C3d", - "C3i" - ] + "lines": ["C3d", "C3i"] }, { "stopId": 1790, @@ -1987,9 +1440,7 @@ }, "latitude": 42.261621089, "longitude": -8.677207279, - "lines": [ - "C3d" - ] + "lines": ["C3d"] }, { "stopId": 1800, @@ -1998,10 +1449,7 @@ }, "latitude": 42.263995234, "longitude": -8.674224503, - "lines": [ - "C3d", - "C3i" - ] + "lines": ["C3d", "C3i"] }, { "stopId": 1810, @@ -2010,10 +1458,7 @@ }, "latitude": 42.262068498, "longitude": -8.676736193, - "lines": [ - "C3d", - "C3i" - ] + "lines": ["C3d", "C3i"] }, { "stopId": 1820, @@ -2022,9 +1467,7 @@ }, "latitude": 42.271878394, "longitude": -8.666356304, - "lines": [ - "C3d" - ] + "lines": ["C3d"] }, { "stopId": 1830, @@ -2033,9 +1476,7 @@ }, "latitude": 42.274038501, "longitude": -8.666949932, - "lines": [ - "C3d" - ] + "lines": ["C3d"] }, { "stopId": 1840, @@ -2044,10 +1485,7 @@ }, "latitude": 42.27159436, "longitude": -8.666389735, - "lines": [ - "C3d", - "C3i" - ] + "lines": ["C3d", "C3i"] }, { "stopId": 1850, @@ -2056,15 +1494,7 @@ }, "latitude": 42.216135691, "longitude": -8.759632243, - "lines": [ - "C3d", - "C3i", - "4A", - "4C", - "12A", - "15A", - "23" - ] + "lines": ["C3d", "C3i", "4A", "4C", "12A", "15A", "23"] }, { "stopId": 1860, @@ -2073,15 +1503,7 @@ }, "latitude": 42.216741568, "longitude": -8.757129742, - "lines": [ - "C3d", - "C3i", - "4A", - "4C", - "12A", - "15A", - "23" - ] + "lines": ["C3d", "C3i", "4A", "4C", "12A", "15A", "23"] }, { "stopId": 1870, @@ -2090,12 +1512,7 @@ }, "latitude": 42.211235082, "longitude": -8.773459294, - "lines": [ - "C3d", - "C3i", - "15A", - "23" - ] + "lines": ["C3d", "C3i", "15A", "23"] }, { "stopId": 1880, @@ -2104,17 +1521,7 @@ }, "latitude": 42.216687933, "longitude": -8.756794466, - "lines": [ - "C3d", - "C3i", - "4A", - "4C", - "12A", - "15A", - "23", - "N1", - "N4" - ] + "lines": ["C3d", "C3i", "4A", "4C", "12A", "15A", "23", "N1", "N4"] }, { "stopId": 1890, @@ -2123,17 +1530,7 @@ }, "latitude": 42.215913672, "longitude": -8.759904797, - "lines": [ - "C3d", - "C3i", - "4A", - "4C", - "12A", - "15A", - "23", - "N1", - "N4" - ] + "lines": ["C3d", "C3i", "4A", "4C", "12A", "15A", "23", "N1", "N4"] }, { "stopId": 1900, @@ -2142,16 +1539,7 @@ }, "latitude": 42.211855119, "longitude": -8.766755158, - "lines": [ - "C3d", - "C3i", - "4A", - "4C", - "15A", - "23", - "N1", - "N4" - ] + "lines": ["C3d", "C3i", "4A", "4C", "15A", "23", "N1", "N4"] }, { "stopId": 1910, @@ -2160,13 +1548,7 @@ }, "latitude": 42.211905694, "longitude": -8.766999036, - "lines": [ - "C3d", - "C3i", - "4C", - "15A", - "23" - ] + "lines": ["C3d", "C3i", "4C", "15A", "23"] }, { "stopId": 1920, @@ -2175,16 +1557,7 @@ }, "latitude": 42.211066417, "longitude": -8.772953743, - "lines": [ - "C3d", - "C3i", - "4A", - "4C", - "15A", - "23", - "N1", - "N4" - ] + "lines": ["C3d", "C3i", "4A", "4C", "15A", "23", "N1", "N4"] }, { "stopId": 1930, @@ -2193,12 +1566,7 @@ }, "latitude": 42.21474886, "longitude": -8.69897918, - "lines": [ - "12A", - "12B", - "13", - "U2" - ] + "lines": ["12A", "12B", "13", "U2"] }, { "stopId": 1940, @@ -2207,11 +1575,7 @@ }, "latitude": 42.218338954, "longitude": -8.703817429, - "lines": [ - "12A", - "12B", - "13" - ] + "lines": ["12A", "12B", "13"] }, { "stopId": 1950, @@ -2220,11 +1584,7 @@ }, "latitude": 42.220567154, "longitude": -8.706419628, - "lines": [ - "12A", - "12B", - "13" - ] + "lines": ["12A", "12B", "13"] }, { "stopId": 1960, @@ -2233,13 +1593,7 @@ }, "latitude": 42.224676782, "longitude": -8.711832326, - "lines": [ - "12A", - "12B", - "13", - "U2", - "H2" - ] + "lines": ["12A", "12B", "13", "U2", "H2"] }, { "stopId": 1970, @@ -2248,11 +1602,7 @@ }, "latitude": 42.223965709, "longitude": -8.710062068, - "lines": [ - "12A", - "12B", - "13" - ] + "lines": ["12A", "12B", "13"] }, { "stopId": 1980, @@ -2261,12 +1611,7 @@ }, "latitude": 42.214703324, "longitude": -8.699378397, - "lines": [ - "12A", - "12B", - "13", - "U2" - ] + "lines": ["12A", "12B", "13", "U2"] }, { "stopId": 1990, @@ -2275,12 +1620,7 @@ }, "latitude": 42.222130198, "longitude": -8.708300774, - "lines": [ - "12A", - "12B", - "13", - "U2" - ] + "lines": ["12A", "12B", "13", "U2"] }, { "stopId": 2000, @@ -2289,11 +1629,7 @@ }, "latitude": 42.220728012, "longitude": -8.70612292, - "lines": [ - "12A", - "12B", - "13" - ] + "lines": ["12A", "12B", "13"] }, { "stopId": 2010, @@ -2302,11 +1638,7 @@ }, "latitude": 42.218213283, "longitude": -8.703163426, - "lines": [ - "12A", - "12B", - "13" - ] + "lines": ["12A", "12B", "13"] }, { "stopId": 2020, @@ -2315,12 +1647,7 @@ }, "latitude": 42.228518615, "longitude": -8.719214126, - "lines": [ - "12A", - "12B", - "13", - "U2" - ] + "lines": ["12A", "12B", "13", "U2"] }, { "stopId": 2030, @@ -2329,12 +1656,7 @@ }, "latitude": 42.226744428, "longitude": -8.716268699, - "lines": [ - "12A", - "12B", - "13", - "H2" - ] + "lines": ["12A", "12B", "13", "H2"] }, { "stopId": 2040, @@ -2343,11 +1665,7 @@ }, "latitude": 42.226835791, "longitude": -8.715823453, - "lines": [ - "12A", - "12B", - "13" - ] + "lines": ["12A", "12B", "13"] }, { "stopId": 2060, @@ -2356,9 +1674,7 @@ }, "latitude": 42.259945558, "longitude": -8.672608434, - "lines": [ - "C3d" - ] + "lines": ["C3d"] }, { "stopId": 2070, @@ -2367,9 +1683,7 @@ }, "latitude": 42.259481393, "longitude": -8.67292487, - "lines": [ - "C3i" - ] + "lines": ["C3i"] }, { "stopId": 2080, @@ -2378,9 +1692,7 @@ }, "latitude": 42.266569717, "longitude": -8.667160768, - "lines": [ - "C3i" - ] + "lines": ["C3i"] }, { "stopId": 2090, @@ -2389,9 +1701,7 @@ }, "latitude": 42.272074281, "longitude": -8.664593691, - "lines": [ - "C3d" - ] + "lines": ["C3d"] }, { "stopId": 2100, @@ -2400,9 +1710,7 @@ }, "latitude": 42.263186001, "longitude": -8.668939094, - "lines": [ - "C3i" - ] + "lines": ["C3i"] }, { "stopId": 2110, @@ -2411,9 +1719,7 @@ }, "latitude": 42.263286688, "longitude": -8.668985036, - "lines": [ - "C3d" - ] + "lines": ["C3d"] }, { "stopId": 2130, @@ -2422,9 +1728,7 @@ }, "latitude": 42.266758811, "longitude": -8.667247828, - "lines": [ - "C3d" - ] + "lines": ["C3d"] }, { "stopId": 2140, @@ -2433,12 +1737,7 @@ }, "latitude": 42.213799707, "longitude": -8.774374426, - "lines": [ - "10", - "15B", - "15C", - "TUR" - ] + "lines": ["10", "15B", "15C", "TUR"] }, { "stopId": 2150, @@ -2447,11 +1746,7 @@ }, "latitude": 42.221416498, "longitude": -8.773724153, - "lines": [ - "10", - "15B", - "15C" - ] + "lines": ["10", "15B", "15C"] }, { "stopId": 2160, @@ -2460,11 +1755,7 @@ }, "latitude": 42.215907608, "longitude": -8.774702031, - "lines": [ - "10", - "15B", - "15C" - ] + "lines": ["10", "15B", "15C"] }, { "stopId": 2170, @@ -2473,12 +1764,7 @@ }, "latitude": 42.210171416, "longitude": -8.774585056, - "lines": [ - "C3d", - "4A", - "4C", - "10" - ] + "lines": ["C3d", "4A", "4C", "10"] }, { "stopId": 2180, @@ -2487,12 +1773,7 @@ }, "latitude": 42.206809895, "longitude": -8.776206766, - "lines": [ - "C3d", - "4A", - "4C", - "10" - ] + "lines": ["C3d", "4A", "4C", "10"] }, { "stopId": 2190, @@ -2501,12 +1782,7 @@ }, "latitude": 42.205147646, "longitude": -8.77674534, - "lines": [ - "C3d", - "4A", - "4C", - "10" - ] + "lines": ["C3d", "4A", "4C", "10"] }, { "stopId": 2200, @@ -2515,9 +1791,7 @@ }, "latitude": 42.22271748, "longitude": -8.656176614, - "lines": [ - "11" - ] + "lines": ["11"] }, { "stopId": 2210, @@ -2526,9 +1800,7 @@ }, "latitude": 42.222538699, "longitude": -8.656616496, - "lines": [ - "11" - ] + "lines": ["11"] }, { "stopId": 2220, @@ -2537,9 +1809,7 @@ }, "latitude": 42.220338634, "longitude": -8.668666271, - "lines": [ - "11" - ] + "lines": ["11"] }, { "stopId": 2230, @@ -2548,9 +1818,7 @@ }, "latitude": 42.222347963, "longitude": -8.662841482, - "lines": [ - "11" - ] + "lines": ["11"] }, { "stopId": 2240, @@ -2559,9 +1827,7 @@ }, "latitude": 42.222432209, "longitude": -8.662773458, - "lines": [ - "11" - ] + "lines": ["11"] }, { "stopId": 2250, @@ -2570,9 +1836,7 @@ }, "latitude": 42.220826115, "longitude": -8.659651094, - "lines": [ - "11" - ] + "lines": ["11"] }, { "stopId": 2260, @@ -2581,9 +1845,7 @@ }, "latitude": 42.220504663, "longitude": -8.668053014, - "lines": [ - "11" - ] + "lines": ["11"] }, { "stopId": 2270, @@ -2592,9 +1854,7 @@ }, "latitude": 42.22113201, "longitude": -8.658591621, - "lines": [ - "11" - ] + "lines": ["11"] }, { "stopId": 2280, @@ -2603,11 +1863,7 @@ }, "latitude": 42.21650849, "longitude": -8.719175368, - "lines": [ - "18A", - "18B", - "18H" - ] + "lines": ["18A", "18B", "18H"] }, { "stopId": 2290, @@ -2616,11 +1872,7 @@ }, "latitude": 42.216415126, "longitude": -8.719355076, - "lines": [ - "18A", - "18B", - "18H" - ] + "lines": ["18A", "18B", "18H"] }, { "stopId": 2300, @@ -2629,9 +1881,7 @@ }, "latitude": 42.22078735, "longitude": -8.722722261, - "lines": [ - "18A" - ] + "lines": ["18A"] }, { "stopId": 2310, @@ -2640,11 +1890,7 @@ }, "latitude": 42.173398721, "longitude": -8.811050666, - "lines": [ - "C3d", - "10", - "12A" - ] + "lines": ["C3d", "10", "12A"] }, { "stopId": 2320, @@ -2653,9 +1899,7 @@ }, "latitude": 42.172541892, "longitude": -8.809133287, - "lines": [ - "10" - ] + "lines": ["10"] }, { "stopId": 2330, @@ -2664,9 +1908,7 @@ }, "latitude": 42.173316968, "longitude": -8.81100291, - "lines": [ - "10" - ] + "lines": ["10"] }, { "stopId": 2340, @@ -2675,11 +1917,7 @@ }, "latitude": 42.167981444, "longitude": -8.806504239, - "lines": [ - "C3d", - "10", - "12A" - ] + "lines": ["C3d", "10", "12A"] }, { "stopId": 2350, @@ -2688,11 +1926,7 @@ }, "latitude": 42.169850316, "longitude": -8.808861828, - "lines": [ - "C3d", - "10", - "12A" - ] + "lines": ["C3d", "10", "12A"] }, { "stopId": 2360, @@ -2701,9 +1935,7 @@ }, "latitude": 42.167825345, "longitude": -8.806386831, - "lines": [ - "10" - ] + "lines": ["10"] }, { "stopId": 2370, @@ -2712,11 +1944,7 @@ }, "latitude": 42.172705652, "longitude": -8.809114415, - "lines": [ - "C3d", - "10", - "12A" - ] + "lines": ["C3d", "10", "12A"] }, { "stopId": 2380, @@ -2725,9 +1953,7 @@ }, "latitude": 42.169719111, "longitude": -8.808832324, - "lines": [ - "10" - ] + "lines": ["10"] }, { "stopId": 2390, @@ -2736,9 +1962,7 @@ }, "latitude": 42.224020371, "longitude": -8.716787891, - "lines": [ - "18A" - ] + "lines": ["18A"] }, { "stopId": 2410, @@ -2747,9 +1971,7 @@ }, "latitude": 42.209020914, "longitude": -8.702331689, - "lines": [ - "14" - ] + "lines": ["14"] }, { "stopId": 2420, @@ -2758,9 +1980,7 @@ }, "latitude": 42.208468606, "longitude": -8.702143934, - "lines": [ - "14" - ] + "lines": ["14"] }, { "stopId": 2430, @@ -2769,9 +1989,7 @@ }, "latitude": 42.223917068, "longitude": -8.726168827, - "lines": [ - "C1" - ] + "lines": ["C1"] }, { "stopId": 2440, @@ -2780,9 +1998,7 @@ }, "latitude": 42.228315534, "longitude": -8.721741958, - "lines": [ - "C1" - ] + "lines": ["C1"] }, { "stopId": 2450, @@ -2791,9 +2007,7 @@ }, "latitude": 42.226024692, "longitude": -8.723390804, - "lines": [ - "C1" - ] + "lines": ["C1"] }, { "stopId": 2460, @@ -2802,9 +2016,7 @@ }, "latitude": 42.203300943, "longitude": -8.696320858, - "lines": [ - "14" - ] + "lines": ["14"] }, { "stopId": 2490, @@ -2813,10 +2025,7 @@ }, "latitude": 42.194635725, "longitude": -8.699504032, - "lines": [ - "6", - "27" - ] + "lines": ["6", "27"] }, { "stopId": 2500, @@ -2825,9 +2034,7 @@ }, "latitude": 42.191950062, "longitude": -8.707193511, - "lines": [ - "27" - ] + "lines": ["27"] }, { "stopId": 2510, @@ -2836,9 +2043,7 @@ }, "latitude": 42.191323803, "longitude": -8.721049887, - "lines": [ - "7" - ] + "lines": ["7"] }, { "stopId": 2520, @@ -2847,10 +2052,7 @@ }, "latitude": 42.204563665, "longitude": -8.687025359, - "lines": [ - "6", - "14" - ] + "lines": ["6", "14"] }, { "stopId": 2540, @@ -2859,11 +2061,7 @@ }, "latitude": 42.22513153, "longitude": -8.751597027, - "lines": [ - "6", - "9B", - "28" - ] + "lines": ["6", "9B", "28"] }, { "stopId": 2550, @@ -2872,10 +2070,7 @@ }, "latitude": 42.204086577, "longitude": -8.704832445, - "lines": [ - "18A", - "18B" - ] + "lines": ["18A", "18B"] }, { "stopId": 2560, @@ -2884,10 +2079,7 @@ }, "latitude": 42.204297185, "longitude": -8.704942415, - "lines": [ - "18A", - "18B" - ] + "lines": ["18A", "18B"] }, { "stopId": 2570, @@ -2896,10 +2088,7 @@ }, "latitude": 42.207146083, "longitude": -8.704526775, - "lines": [ - "18A", - "18B" - ] + "lines": ["18A", "18B"] }, { "stopId": 2580, @@ -2908,10 +2097,7 @@ }, "latitude": 42.207235488, "longitude": -8.704631381, - "lines": [ - "18A", - "18B" - ] + "lines": ["18A", "18B"] }, { "stopId": 2590, @@ -2920,9 +2106,7 @@ }, "latitude": 42.232442621, "longitude": -8.689558541, - "lines": [ - "28" - ] + "lines": ["28"] }, { "stopId": 2600, @@ -2931,10 +2115,7 @@ }, "latitude": 42.235437997, "longitude": -8.689019794, - "lines": [ - "27", - "28" - ] + "lines": ["27", "28"] }, { "stopId": 2610, @@ -2943,9 +2124,7 @@ }, "latitude": 42.233426101, "longitude": -8.693298639, - "lines": [ - "28" - ] + "lines": ["28"] }, { "stopId": 2620, @@ -2954,9 +2133,7 @@ }, "latitude": 42.235420737, "longitude": -8.68894034, - "lines": [ - "28" - ] + "lines": ["28"] }, { "stopId": 2630, @@ -2965,10 +2142,7 @@ }, "latitude": 42.233483693, "longitude": -8.693266452, - "lines": [ - "27", - "28" - ] + "lines": ["27", "28"] }, { "stopId": 2640, @@ -2977,10 +2151,7 @@ }, "latitude": 42.232559793, "longitude": -8.689848219, - "lines": [ - "27", - "28" - ] + "lines": ["27", "28"] }, { "stopId": 2735, @@ -2989,10 +2160,7 @@ }, "latitude": 42.235033314, "longitude": -8.727202198, - "lines": [ - "5B", - "12A" - ] + "lines": ["5B", "12A"] }, { "stopId": 2740, @@ -3001,9 +2169,7 @@ }, "latitude": 42.207451401, "longitude": -8.701194432, - "lines": [ - "14" - ] + "lines": ["14"] }, { "stopId": 2750, @@ -3012,9 +2178,7 @@ }, "latitude": 42.20671834, "longitude": -8.699160127, - "lines": [ - "14" - ] + "lines": ["14"] }, { "stopId": 2760, @@ -3023,9 +2187,7 @@ }, "latitude": 42.208194443, "longitude": -8.701518979, - "lines": [ - "14" - ] + "lines": ["14"] }, { "stopId": 2770, @@ -3034,9 +2196,7 @@ }, "latitude": 42.20648703, "longitude": -8.698760561, - "lines": [ - "14" - ] + "lines": ["14"] }, { "stopId": 2780, @@ -3067,15 +2227,7 @@ }, "latitude": 42.230566426, "longitude": -8.730086804, - "lines": [ - "4A", - "4C", - "11", - "12B", - "17", - "27", - "N1" - ] + "lines": ["4A", "4C", "11", "12B", "17", "27", "N1"] }, { "stopId": 2800, @@ -3084,15 +2236,7 @@ }, "latitude": 42.230291959, "longitude": -8.730279255, - "lines": [ - "4A", - "4C", - "7", - "12B", - "17", - "27", - "PSA 4" - ] + "lines": ["4A", "4C", "7", "12B", "17", "27", "PSA 4"] }, { "stopId": 2810, @@ -3101,15 +2245,7 @@ }, "latitude": 42.227601839, "longitude": -8.730236339, - "lines": [ - "4A", - "4C", - "7", - "12B", - "17", - "27", - "PSA 4" - ] + "lines": ["4A", "4C", "7", "12B", "17", "27", "PSA 4"] }, { "stopId": 2820, @@ -3118,15 +2254,7 @@ }, "latitude": 42.227403959, "longitude": -8.729948584, - "lines": [ - "4A", - "4C", - "11", - "12B", - "17", - "27", - "N1" - ] + "lines": ["4A", "4C", "11", "12B", "17", "27", "N1"] }, { "stopId": 2830, @@ -3135,13 +2263,7 @@ }, "latitude": 42.22243855, "longitude": -8.751978552, - "lines": [ - "C3d", - "13", - "15B", - "15C", - "H" - ] + "lines": ["C3d", "13", "15B", "15C", "H"] }, { "stopId": 2840, @@ -3150,10 +2272,7 @@ }, "latitude": 42.241698248, "longitude": -8.665209215, - "lines": [ - "9B", - "27" - ] + "lines": ["9B", "27"] }, { "stopId": 2850, @@ -3162,10 +2281,7 @@ }, "latitude": 42.241676405, "longitude": -8.665026825, - "lines": [ - "9B", - "28" - ] + "lines": ["9B", "28"] }, { "stopId": 2870, @@ -3174,10 +2290,7 @@ }, "latitude": 42.237397409, "longitude": -8.694169154, - "lines": [ - "4A", - "24" - ] + "lines": ["4A", "24"] }, { "stopId": 2880, @@ -3186,10 +2299,7 @@ }, "latitude": 42.239331582, "longitude": -8.692983618, - "lines": [ - "4A", - "24" - ] + "lines": ["4A", "24"] }, { "stopId": 2910, @@ -3198,10 +2308,7 @@ }, "latitude": 42.241655974, "longitude": -8.692827561, - "lines": [ - "4A", - "24" - ] + "lines": ["4A", "24"] }, { "stopId": 2920, @@ -3210,10 +2317,7 @@ }, "latitude": 42.235852081, "longitude": -8.695592417, - "lines": [ - "4A", - "24" - ] + "lines": ["4A", "24"] }, { "stopId": 2930, @@ -3222,10 +2326,7 @@ }, "latitude": 42.235377808, "longitude": -8.695695331, - "lines": [ - "4A", - "24" - ] + "lines": ["4A", "24"] }, { "stopId": 2950, @@ -3234,10 +2335,7 @@ }, "latitude": 42.204307169, "longitude": -8.729719236, - "lines": [ - "12B", - "17" - ] + "lines": ["12B", "17"] }, { "stopId": 2960, @@ -3246,10 +2344,7 @@ }, "latitude": 42.20073699, "longitude": -8.738895516, - "lines": [ - "12B", - "17" - ] + "lines": ["12B", "17"] }, { "stopId": 2970, @@ -3258,10 +2353,7 @@ }, "latitude": 42.201317829, "longitude": -8.735636365, - "lines": [ - "12B", - "17" - ] + "lines": ["12B", "17"] }, { "stopId": 2980, @@ -3270,10 +2362,7 @@ }, "latitude": 42.200758846, "longitude": -8.739043037, - "lines": [ - "12B", - "17" - ] + "lines": ["12B", "17"] }, { "stopId": 2990, @@ -3282,10 +2371,7 @@ }, "latitude": 42.203792573, "longitude": -8.729630723, - "lines": [ - "12B", - "17" - ] + "lines": ["12B", "17"] }, { "stopId": 3000, @@ -3294,10 +2380,7 @@ }, "latitude": 42.201188677, "longitude": -8.733208966, - "lines": [ - "12B", - "17" - ] + "lines": ["12B", "17"] }, { "stopId": 3010, @@ -3306,10 +2389,7 @@ }, "latitude": 42.20121252, "longitude": -8.735711467, - "lines": [ - "12B", - "17" - ] + "lines": ["12B", "17"] }, { "stopId": 3020, @@ -3318,10 +2398,7 @@ }, "latitude": 42.201218481, "longitude": -8.733509374, - "lines": [ - "12B", - "17" - ] + "lines": ["12B", "17"] }, { "stopId": 3030, @@ -3330,9 +2407,7 @@ }, "latitude": 42.194702579, "longitude": -8.721025195, - "lines": [ - "7" - ] + "lines": ["7"] }, { "stopId": 3050, @@ -3341,9 +2416,7 @@ }, "latitude": 42.192360267, "longitude": -8.756680959, - "lines": [ - "29" - ] + "lines": ["29"] }, { "stopId": 3052, @@ -3352,9 +2425,7 @@ }, "latitude": 42.216966631, "longitude": -8.729813845, - "lines": [ - "A" - ] + "lines": ["A"] }, { "stopId": 3060, @@ -3363,9 +2434,7 @@ }, "latitude": 42.224698049, "longitude": -8.701749123, - "lines": [ - "6" - ] + "lines": ["6"] }, { "stopId": 3070, @@ -3374,9 +2443,7 @@ }, "latitude": 42.224816342, "longitude": -8.701565998, - "lines": [ - "6" - ] + "lines": ["6"] }, { "stopId": 3080, @@ -3385,9 +2452,7 @@ }, "latitude": 42.1873653089623, "longitude": -8.800886236766305, - "lines": [ - "11" - ] + "lines": ["11"] }, { "stopId": 3090, @@ -3396,11 +2461,7 @@ }, "latitude": 42.191019711713736, "longitude": -8.799628565094565, - "lines": [ - "C3d", - "10", - "11" - ] + "lines": ["C3d", "10", "11"] }, { "stopId": 3100, @@ -3409,10 +2470,7 @@ }, "latitude": 42.184766843, "longitude": -8.802180879, - "lines": [ - "11", - "12A" - ] + "lines": ["11", "12A"] }, { "stopId": 3110, @@ -3421,9 +2479,7 @@ }, "latitude": 42.184416675, "longitude": -8.802179713, - "lines": [ - "11" - ] + "lines": ["11"] }, { "stopId": 3120, @@ -3432,10 +2488,7 @@ }, "latitude": 42.187488521491225, "longitude": -8.801226626055183, - "lines": [ - "11", - "12A" - ] + "lines": ["11", "12A"] }, { "stopId": 3130, @@ -3444,9 +2497,7 @@ }, "latitude": 42.191024803868736, "longitude": -8.799397387002196, - "lines": [ - "11" - ] + "lines": ["11"] }, { "stopId": 3140, @@ -3455,9 +2506,7 @@ }, "latitude": 42.15800346, "longitude": -8.686134691, - "lines": [ - "7" - ] + "lines": ["7"] }, { "stopId": 3150, @@ -3466,9 +2515,7 @@ }, "latitude": 42.157661469, "longitude": -8.685973759, - "lines": [ - "7" - ] + "lines": ["7"] }, { "stopId": 3160, @@ -3477,10 +2524,7 @@ }, "latitude": 42.206593246, "longitude": -8.721651793, - "lines": [ - "18B", - "18H" - ] + "lines": ["18B", "18H"] }, { "stopId": 3170, @@ -3489,9 +2533,7 @@ }, "latitude": 42.220968446, "longitude": -8.720400826, - "lines": [ - "18A" - ] + "lines": ["18A"] }, { "stopId": 3180, @@ -3500,10 +2542,7 @@ }, "latitude": 42.21955863, "longitude": -8.711410119, - "lines": [ - "18B", - "18H" - ] + "lines": ["18B", "18H"] }, { "stopId": 3190, @@ -3512,10 +2551,7 @@ }, "latitude": 42.219681782, "longitude": -8.711385979, - "lines": [ - "18B", - "18H" - ] + "lines": ["18B", "18H"] }, { "stopId": 3230, @@ -3524,16 +2560,7 @@ }, "latitude": 42.236471452, "longitude": -8.720164905, - "lines": [ - "A", - "5A", - "9B", - "11", - "15B", - "15C", - "16", - "17" - ] + "lines": ["A", "5A", "9B", "11", "15B", "15C", "16", "17"] }, { "stopId": 3240, @@ -3542,17 +2569,7 @@ }, "latitude": 42.22214729, "longitude": -8.734167916, - "lines": [ - "A", - "5A", - "5B", - "10", - "11", - "13", - "N4", - "H1", - "H" - ] + "lines": ["A", "5A", "5B", "10", "11", "13", "N4", "H1", "H"] }, { "stopId": 3250, @@ -3561,13 +2578,7 @@ }, "latitude": 42.222378625, "longitude": -8.734134247, - "lines": [ - "C1", - "A", - "10", - "N4", - "H1" - ] + "lines": ["C1", "A", "10", "N4", "H1"] }, { "stopId": 3260, @@ -3576,9 +2587,7 @@ }, "latitude": 42.226287696, "longitude": -8.737475832, - "lines": [ - "15B" - ] + "lines": ["15B"] }, { "stopId": 3270, @@ -3587,10 +2596,7 @@ }, "latitude": 42.226490285, "longitude": -8.73744901, - "lines": [ - "10", - "15B" - ] + "lines": ["10", "15B"] }, { "stopId": 3280, @@ -3599,9 +2605,7 @@ }, "latitude": 42.188898503, "longitude": -8.776299224, - "lines": [ - "29" - ] + "lines": ["29"] }, { "stopId": 3290, @@ -3610,11 +2614,7 @@ }, "latitude": 42.213397685, "longitude": -8.72248211, - "lines": [ - "A", - "18B", - "18H" - ] + "lines": ["A", "18B", "18H"] }, { "stopId": 3300, @@ -3623,11 +2623,7 @@ }, "latitude": 42.211751348, "longitude": -8.721691531, - "lines": [ - "A", - "18B", - "18H" - ] + "lines": ["A", "18B", "18H"] }, { "stopId": 3310, @@ -3636,11 +2632,7 @@ }, "latitude": 42.209233023, "longitude": -8.720666368, - "lines": [ - "A", - "18B", - "18H" - ] + "lines": ["A", "18B", "18H"] }, { "stopId": 3320, @@ -3649,11 +2641,7 @@ }, "latitude": 42.210154848, "longitude": -8.720902403, - "lines": [ - "A", - "18B", - "18H" - ] + "lines": ["A", "18B", "18H"] }, { "stopId": 3350, @@ -3662,10 +2650,7 @@ }, "latitude": 42.230911796, "longitude": -8.722711253, - "lines": [ - "12A", - "27" - ] + "lines": ["12A", "27"] }, { "stopId": 3360, @@ -3674,9 +2659,7 @@ }, "latitude": 42.237803518, "longitude": -8.704409031, - "lines": [ - "31" - ] + "lines": ["31"] }, { "stopId": 3370, @@ -3685,10 +2668,7 @@ }, "latitude": 42.205676226, "longitude": -8.693112047, - "lines": [ - "6", - "14" - ] + "lines": ["6", "14"] }, { "stopId": 3380, @@ -3697,10 +2677,7 @@ }, "latitude": 42.205623108, "longitude": -8.693239335, - "lines": [ - "6", - "14" - ] + "lines": ["6", "14"] }, { "stopId": 3390, @@ -3709,10 +2686,7 @@ }, "latitude": 42.205296644, "longitude": -8.692558914, - "lines": [ - "6", - "14" - ] + "lines": ["6", "14"] }, { "stopId": 3400, @@ -3721,9 +2695,7 @@ }, "latitude": 42.163584451, "longitude": -8.716088728, - "lines": [ - "7" - ] + "lines": ["7"] }, { "stopId": 3420, @@ -3732,12 +2704,7 @@ }, "latitude": 42.208071495, "longitude": -8.731366082, - "lines": [ - "7", - "12B", - "17", - "27" - ] + "lines": ["7", "12B", "17", "27"] }, { "stopId": 3430, @@ -3746,10 +2713,7 @@ }, "latitude": 42.215621206, "longitude": -8.67221512, - "lines": [ - "15B", - "15C" - ] + "lines": ["15B", "15C"] }, { "stopId": 3450, @@ -3758,10 +2722,7 @@ }, "latitude": 42.194732286, "longitude": -8.769245322, - "lines": [ - "11", - "29" - ] + "lines": ["11", "29"] }, { "stopId": 3460, @@ -3770,10 +2731,7 @@ }, "latitude": 42.203197031, "longitude": -8.753437723, - "lines": [ - "11", - "29" - ] + "lines": ["11", "29"] }, { "stopId": 3470, @@ -3782,10 +2740,7 @@ }, "latitude": 42.193581709, "longitude": -8.772496159, - "lines": [ - "11", - "29" - ] + "lines": ["11", "29"] }, { "stopId": 3480, @@ -3794,10 +2749,7 @@ }, "latitude": 42.196095467, "longitude": -8.766230519, - "lines": [ - "11", - "29" - ] + "lines": ["11", "29"] }, { "stopId": 3490, @@ -3806,10 +2758,7 @@ }, "latitude": 42.193613504, "longitude": -8.772222574, - "lines": [ - "11", - "29" - ] + "lines": ["11", "29"] }, { "stopId": 3500, @@ -3818,10 +2767,7 @@ }, "latitude": 42.194553241, "longitude": -8.770325583, - "lines": [ - "11", - "29" - ] + "lines": ["11", "29"] }, { "stopId": 3510, @@ -3830,10 +2776,7 @@ }, "latitude": 42.202849227, "longitude": -8.753870291, - "lines": [ - "11", - "29" - ] + "lines": ["11", "29"] }, { "stopId": 3520, @@ -3842,10 +2785,7 @@ }, "latitude": 42.200000035, "longitude": -8.759107913, - "lines": [ - "11", - "29" - ] + "lines": ["11", "29"] }, { "stopId": 3530, @@ -3854,10 +2794,7 @@ }, "latitude": 42.199773285, "longitude": -8.759958845, - "lines": [ - "11", - "29" - ] + "lines": ["11", "29"] }, { "stopId": 3540, @@ -3866,10 +2803,7 @@ }, "latitude": 42.19617384, "longitude": -8.766295392, - "lines": [ - "11", - "29" - ] + "lines": ["11", "29"] }, { "stopId": 3550, @@ -3878,9 +2812,7 @@ }, "latitude": 42.19747765, "longitude": -8.688158543, - "lines": [ - "6" - ] + "lines": ["6"] }, { "stopId": 3560, @@ -3889,9 +2821,7 @@ }, "latitude": 42.209126518, "longitude": -8.695599845, - "lines": [ - "6" - ] + "lines": ["6"] }, { "stopId": 3570, @@ -3900,9 +2830,7 @@ }, "latitude": 42.209576972, "longitude": -8.695580071, - "lines": [ - "6" - ] + "lines": ["6"] }, { "stopId": 3572, @@ -3911,9 +2839,7 @@ }, "latitude": 42.208457815, "longitude": -8.695017358, - "lines": [ - "14" - ] + "lines": ["14"] }, { "stopId": 3574, @@ -3922,9 +2848,7 @@ }, "latitude": 42.208533311, "longitude": -8.694987854, - "lines": [ - "14" - ] + "lines": ["14"] }, { "stopId": 3580, @@ -3933,10 +2857,7 @@ }, "latitude": 42.204440318, "longitude": -8.690871804, - "lines": [ - "6", - "14" - ] + "lines": ["6", "14"] }, { "stopId": 3590, @@ -3945,10 +2866,7 @@ }, "latitude": 42.204458432, "longitude": -8.690765895, - "lines": [ - "6", - "14" - ] + "lines": ["6", "14"] }, { "stopId": 3600, @@ -3957,9 +2875,7 @@ }, "latitude": 42.21246424, "longitude": -8.697218847, - "lines": [ - "6" - ] + "lines": ["6"] }, { "stopId": 3610, @@ -3968,10 +2884,7 @@ }, "latitude": 42.204446407, "longitude": -8.68809021, - "lines": [ - "6", - "14" - ] + "lines": ["6", "14"] }, { "stopId": 3620, @@ -3980,9 +2893,7 @@ }, "latitude": 42.202562995, "longitude": -8.685437577, - "lines": [ - "6" - ] + "lines": ["6"] }, { "stopId": 3630, @@ -3991,10 +2902,7 @@ }, "latitude": 42.20274418, "longitude": -8.684443742, - "lines": [ - "6", - "14" - ] + "lines": ["6", "14"] }, { "stopId": 3640, @@ -4003,9 +2911,7 @@ }, "latitude": 42.197359418, "longitude": -8.688113004, - "lines": [ - "6" - ] + "lines": ["6"] }, { "stopId": 3650, @@ -4014,9 +2920,7 @@ }, "latitude": 42.199275919, "longitude": -8.689032944, - "lines": [ - "6" - ] + "lines": ["6"] }, { "stopId": 3660, @@ -4025,9 +2929,7 @@ }, "latitude": 42.212227656, "longitude": -8.697028614, - "lines": [ - "6" - ] + "lines": ["6"] }, { "stopId": 3670, @@ -4036,9 +2938,7 @@ }, "latitude": 42.194968863, "longitude": -8.689201981, - "lines": [ - "6" - ] + "lines": ["6"] }, { "stopId": 3680, @@ -4047,9 +2947,7 @@ }, "latitude": 42.211144971, "longitude": -8.69652789, - "lines": [ - "6" - ] + "lines": ["6"] }, { "stopId": 3690, @@ -4058,9 +2956,7 @@ }, "latitude": 42.210947345, "longitude": -8.69627482, - "lines": [ - "6" - ] + "lines": ["6"] }, { "stopId": 3700, @@ -4069,9 +2965,7 @@ }, "latitude": 42.194055385, "longitude": -8.692079677, - "lines": [ - "6" - ] + "lines": ["6"] }, { "stopId": 3710, @@ -4080,9 +2974,7 @@ }, "latitude": 42.193846109, "longitude": -8.69200489, - "lines": [ - "6" - ] + "lines": ["6"] }, { "stopId": 3720, @@ -4091,9 +2983,7 @@ }, "latitude": 42.1948986, "longitude": -8.689213754, - "lines": [ - "6" - ] + "lines": ["6"] }, { "stopId": 3730, @@ -4102,9 +2992,7 @@ }, "latitude": 42.199203404, "longitude": -8.688880116, - "lines": [ - "6" - ] + "lines": ["6"] }, { "stopId": 3740, @@ -4113,12 +3001,7 @@ }, "latitude": 42.197431882, "longitude": -8.790144971, - "lines": [ - "C3d", - "4A", - "4C", - "10" - ] + "lines": ["C3d", "4A", "4C", "10"] }, { "stopId": 3750, @@ -4127,10 +3010,7 @@ }, "latitude": 42.193128934, "longitude": -8.797957944, - "lines": [ - "10", - "11" - ] + "lines": ["10", "11"] }, { "stopId": 3760, @@ -4139,10 +3019,7 @@ }, "latitude": 42.1957321, "longitude": -8.795211362, - "lines": [ - "10", - "11" - ] + "lines": ["10", "11"] }, { "stopId": 3770, @@ -4151,11 +3028,7 @@ }, "latitude": 42.1950348, "longitude": -8.795701844, - "lines": [ - "C3d", - "10", - "11" - ] + "lines": ["C3d", "10", "11"] }, { "stopId": 3780, @@ -4164,11 +3037,7 @@ }, "latitude": 42.193041793, "longitude": -8.797590453, - "lines": [ - "C3d", - "10", - "11" - ] + "lines": ["C3d", "10", "11"] }, { "stopId": 3790, @@ -4177,12 +3046,7 @@ }, "latitude": 42.201898697, "longitude": -8.781706742, - "lines": [ - "C3d", - "4A", - "4C", - "10" - ] + "lines": ["C3d", "4A", "4C", "10"] }, { "stopId": 3800, @@ -4191,10 +3055,7 @@ }, "latitude": 42.199639519, "longitude": -8.785727373, - "lines": [ - "4C", - "10" - ] + "lines": ["4C", "10"] }, { "stopId": 3810, @@ -4203,12 +3064,7 @@ }, "latitude": 42.200106486, "longitude": -8.785121194, - "lines": [ - "C3d", - "4A", - "4C", - "10" - ] + "lines": ["C3d", "4A", "4C", "10"] }, { "stopId": 3820, @@ -4217,9 +3073,7 @@ }, "latitude": 42.182659954, "longitude": -8.699663442, - "lines": [ - "A" - ] + "lines": ["A"] }, { "stopId": 3830, @@ -4228,9 +3082,7 @@ }, "latitude": 42.180635405, "longitude": -8.696958243, - "lines": [ - "A" - ] + "lines": ["A"] }, { "stopId": 3840, @@ -4239,9 +3091,7 @@ }, "latitude": 42.181019011, "longitude": -8.696918009, - "lines": [ - "A" - ] + "lines": ["A"] }, { "stopId": 3850, @@ -4250,10 +3100,7 @@ }, "latitude": 42.167933917, "longitude": -8.692758811, - "lines": [ - "A", - "U1" - ] + "lines": ["A", "U1"] }, { "stopId": 3860, @@ -4262,10 +3109,7 @@ }, "latitude": 42.168248021, "longitude": -8.692608608, - "lines": [ - "A", - "U1" - ] + "lines": ["A", "U1"] }, { "stopId": 3870, @@ -4274,9 +3118,7 @@ }, "latitude": 42.182749988, "longitude": -8.699953254, - "lines": [ - "A" - ] + "lines": ["A"] }, { "stopId": 3880, @@ -4285,9 +3127,7 @@ }, "latitude": 42.194829735, "longitude": -8.699040324, - "lines": [ - "6" - ] + "lines": ["6"] }, { "stopId": 3890, @@ -4296,10 +3136,7 @@ }, "latitude": 42.193625246, "longitude": -8.7014263, - "lines": [ - "6", - "27" - ] + "lines": ["6", "27"] }, { "stopId": 3900, @@ -4308,10 +3145,7 @@ }, "latitude": 42.19232927, "longitude": -8.704749414, - "lines": [ - "6", - "27" - ] + "lines": ["6", "27"] }, { "stopId": 3910, @@ -4320,9 +3154,7 @@ }, "latitude": 42.195404022, "longitude": -8.695794851, - "lines": [ - "6" - ] + "lines": ["6"] }, { "stopId": 3920, @@ -4331,10 +3163,7 @@ }, "latitude": 42.195725689, "longitude": -8.697154293, - "lines": [ - "6", - "27" - ] + "lines": ["6", "27"] }, { "stopId": 3930, @@ -4343,10 +3172,7 @@ }, "latitude": 42.19287831, "longitude": -8.703506202, - "lines": [ - "6", - "27" - ] + "lines": ["6", "27"] }, { "stopId": 3940, @@ -4355,9 +3181,7 @@ }, "latitude": 42.196165214, "longitude": -8.759890011, - "lines": [ - "29" - ] + "lines": ["29"] }, { "stopId": 3950, @@ -4366,9 +3190,7 @@ }, "latitude": 42.196014193, "longitude": -8.759919516, - "lines": [ - "29" - ] + "lines": ["29"] }, { "stopId": 3960, @@ -4377,14 +3199,7 @@ }, "latitude": 42.213984907, "longitude": -8.682160511, - "lines": [ - "12A", - "12B", - "13", - "15B", - "15C", - "31" - ] + "lines": ["12A", "12B", "13", "15B", "15C", "31"] }, { "stopId": 3970, @@ -4393,12 +3208,7 @@ }, "latitude": 42.215872123, "longitude": -8.679765298, - "lines": [ - "12B", - "15B", - "15C", - "U2" - ] + "lines": ["12B", "15B", "15C", "U2"] }, { "stopId": 3980, @@ -4407,14 +3217,7 @@ }, "latitude": 42.21620386, "longitude": -8.681570425, - "lines": [ - "12A", - "12B", - "13", - "15B", - "15C", - "31" - ] + "lines": ["12A", "12B", "13", "15B", "15C", "31"] }, { "stopId": 4000, @@ -4423,9 +3226,7 @@ }, "latitude": 42.182434997, "longitude": -8.764713761, - "lines": [ - "29" - ] + "lines": ["29"] }, { "stopId": 4010, @@ -4434,9 +3235,7 @@ }, "latitude": 42.184148566, "longitude": -8.767237312, - "lines": [ - "29" - ] + "lines": ["29"] }, { "stopId": 4020, @@ -4445,9 +3244,7 @@ }, "latitude": 42.187056187, "longitude": -8.769605703, - "lines": [ - "29" - ] + "lines": ["29"] }, { "stopId": 4030, @@ -4456,9 +3253,7 @@ }, "latitude": 42.184118753, "longitude": -8.767049558, - "lines": [ - "29" - ] + "lines": ["29"] }, { "stopId": 4040, @@ -4467,9 +3262,7 @@ }, "latitude": 42.18661248, "longitude": -8.769574881, - "lines": [ - "29" - ] + "lines": ["29"] }, { "stopId": 4050, @@ -4478,9 +3271,7 @@ }, "latitude": 42.182111026, "longitude": -8.76479691, - "lines": [ - "29" - ] + "lines": ["29"] }, { "stopId": 4060, @@ -4489,9 +3280,7 @@ }, "latitude": 42.164326088, "longitude": -8.716892619, - "lines": [ - "7" - ] + "lines": ["7"] }, { "stopId": 4070, @@ -4500,9 +3289,7 @@ }, "latitude": 42.162254659, "longitude": -8.713740793, - "lines": [ - "7" - ] + "lines": ["7"] }, { "stopId": 4080, @@ -4511,9 +3298,7 @@ }, "latitude": 42.162252671, "longitude": -8.71400365, - "lines": [ - "7" - ] + "lines": ["7"] }, { "stopId": 4090, @@ -4522,9 +3307,7 @@ }, "latitude": 42.170369621, "longitude": -8.708506123, - "lines": [ - "7" - ] + "lines": ["7"] }, { "stopId": 4100, @@ -4533,9 +3316,7 @@ }, "latitude": 42.16978602, "longitude": -8.708967287, - "lines": [ - "7" - ] + "lines": ["7"] }, { "stopId": 4110, @@ -4544,9 +3325,7 @@ }, "latitude": 42.165331611, "longitude": -8.714862589, - "lines": [ - "7" - ] + "lines": ["7"] }, { "stopId": 4120, @@ -4555,9 +3334,7 @@ }, "latitude": 42.166399713, "longitude": -8.711237684, - "lines": [ - "7" - ] + "lines": ["7"] }, { "stopId": 4130, @@ -4566,9 +3343,7 @@ }, "latitude": 42.16561193, "longitude": -8.714589004, - "lines": [ - "7" - ] + "lines": ["7"] }, { "stopId": 4140, @@ -4577,9 +3352,7 @@ }, "latitude": 42.166208944, "longitude": -8.711992518, - "lines": [ - "7" - ] + "lines": ["7"] }, { "stopId": 4150, @@ -4588,11 +3361,7 @@ }, "latitude": 42.217620909, "longitude": -8.712429612, - "lines": [ - "18A", - "18B", - "18H" - ] + "lines": ["18A", "18B", "18H"] }, { "stopId": 4160, @@ -4601,9 +3370,7 @@ }, "latitude": 42.217849364, "longitude": -8.710994711, - "lines": [ - "18A" - ] + "lines": ["18A"] }, { "stopId": 4170, @@ -4612,11 +3379,7 @@ }, "latitude": 42.217345186, "longitude": -8.713011334, - "lines": [ - "18A", - "18B", - "18H" - ] + "lines": ["18A", "18B", "18H"] }, { "stopId": 4200, @@ -4625,10 +3388,7 @@ }, "latitude": 42.215236994, "longitude": -8.707384971, - "lines": [ - "14", - "18A" - ] + "lines": ["14", "18A"] }, { "stopId": 4210, @@ -4637,10 +3397,7 @@ }, "latitude": 42.212141078, "longitude": -8.704563545, - "lines": [ - "14", - "18A" - ] + "lines": ["14", "18A"] }, { "stopId": 4220, @@ -4649,10 +3406,7 @@ }, "latitude": 42.213737557, "longitude": -8.706283115, - "lines": [ - "14", - "18A" - ] + "lines": ["14", "18A"] }, { "stopId": 4230, @@ -4661,10 +3415,7 @@ }, "latitude": 42.215373761, "longitude": -8.707378349, - "lines": [ - "14", - "18A" - ] + "lines": ["14", "18A"] }, { "stopId": 4240, @@ -4673,10 +3424,7 @@ }, "latitude": 42.212378349, "longitude": -8.704729584, - "lines": [ - "14", - "18A" - ] + "lines": ["14", "18A"] }, { "stopId": 4250, @@ -4685,10 +3433,7 @@ }, "latitude": 42.213377597, "longitude": -8.70601168, - "lines": [ - "14", - "18A" - ] + "lines": ["14", "18A"] }, { "stopId": 4280, @@ -4697,11 +3442,7 @@ }, "latitude": 42.224507337, "longitude": -8.713465538, - "lines": [ - "14", - "18B", - "18H" - ] + "lines": ["14", "18B", "18H"] }, { "stopId": 4290, @@ -4710,12 +3451,7 @@ }, "latitude": 42.227785739, "longitude": -8.719460889, - "lines": [ - "14", - "18A", - "18B", - "18H" - ] + "lines": ["14", "18A", "18B", "18H"] }, { "stopId": 4300, @@ -4724,11 +3460,7 @@ }, "latitude": 42.22278924, "longitude": -8.711754289, - "lines": [ - "14", - "18B", - "18H" - ] + "lines": ["14", "18B", "18H"] }, { "stopId": 4310, @@ -4737,11 +3469,7 @@ }, "latitude": 42.222713762, "longitude": -8.711555806, - "lines": [ - "14", - "18B", - "18H" - ] + "lines": ["14", "18B", "18H"] }, { "stopId": 4320, @@ -4750,11 +3478,7 @@ }, "latitude": 42.227716225, "longitude": -8.719750568, - "lines": [ - "14", - "18B", - "18H" - ] + "lines": ["14", "18B", "18H"] }, { "stopId": 4330, @@ -4763,12 +3487,7 @@ }, "latitude": 42.226463146, "longitude": -8.71614062, - "lines": [ - "14", - "18A", - "18B", - "18H" - ] + "lines": ["14", "18A", "18B", "18H"] }, { "stopId": 4340, @@ -4777,11 +3496,7 @@ }, "latitude": 42.226112503, "longitude": -8.715718376, - "lines": [ - "14", - "18B", - "18H" - ] + "lines": ["14", "18B", "18H"] }, { "stopId": 4350, @@ -4790,11 +3505,7 @@ }, "latitude": 42.224562952, "longitude": -8.713390437, - "lines": [ - "14", - "18B", - "18H" - ] + "lines": ["14", "18B", "18H"] }, { "stopId": 4440, @@ -4803,9 +3514,7 @@ }, "latitude": 42.183275038, "longitude": -8.742437444, - "lines": [ - "17" - ] + "lines": ["17"] }, { "stopId": 4450, @@ -4814,9 +3523,7 @@ }, "latitude": 42.185081179, "longitude": -8.748029634, - "lines": [ - "17" - ] + "lines": ["17"] }, { "stopId": 4460, @@ -4825,9 +3532,7 @@ }, "latitude": 42.18366712, "longitude": -8.744402777, - "lines": [ - "17" - ] + "lines": ["17"] }, { "stopId": 4490, @@ -4836,9 +3541,7 @@ }, "latitude": 42.187522648, "longitude": -8.772977937, - "lines": [ - "29" - ] + "lines": ["29"] }, { "stopId": 4500, @@ -4847,9 +3550,7 @@ }, "latitude": 42.188761213, "longitude": -8.775973652, - "lines": [ - "29" - ] + "lines": ["29"] }, { "stopId": 4510, @@ -4858,9 +3559,7 @@ }, "latitude": 42.187542924, "longitude": -8.772887753, - "lines": [ - "29" - ] + "lines": ["29"] }, { "stopId": 4520, @@ -4869,9 +3568,7 @@ }, "latitude": 42.175884385, "longitude": -8.670789023, - "lines": [ - "15C" - ] + "lines": ["15C"] }, { "stopId": 4530, @@ -4880,9 +3577,7 @@ }, "latitude": 42.199681015, "longitude": -8.668860289, - "lines": [ - "15C" - ] + "lines": ["15C"] }, { "stopId": 4540, @@ -4891,9 +3586,7 @@ }, "latitude": 42.181370416, "longitude": -8.667861084, - "lines": [ - "15C" - ] + "lines": ["15C"] }, { "stopId": 4550, @@ -4902,10 +3595,7 @@ }, "latitude": 42.199945182, "longitude": -8.669085873, - "lines": [ - "15B", - "15C" - ] + "lines": ["15B", "15C"] }, { "stopId": 4560, @@ -4914,9 +3604,7 @@ }, "latitude": 42.177017792, "longitude": -8.721519832, - "lines": [ - "7" - ] + "lines": ["7"] }, { "stopId": 4570, @@ -4925,9 +3613,7 @@ }, "latitude": 42.183987864, "longitude": -8.724154939, - "lines": [ - "7" - ] + "lines": ["7"] }, { "stopId": 4580, @@ -4936,9 +3622,7 @@ }, "latitude": 42.180249473, "longitude": -8.721850007, - "lines": [ - "7" - ] + "lines": ["7"] }, { "stopId": 4590, @@ -4947,9 +3631,7 @@ }, "latitude": 42.180670846, "longitude": -8.721533506, - "lines": [ - "7" - ] + "lines": ["7"] }, { "stopId": 4600, @@ -4958,9 +3640,7 @@ }, "latitude": 42.176419487, "longitude": -8.72197849, - "lines": [ - "7" - ] + "lines": ["7"] }, { "stopId": 4610, @@ -4969,9 +3649,7 @@ }, "latitude": 42.172481228, "longitude": -8.723905842, - "lines": [ - "7" - ] + "lines": ["7"] }, { "stopId": 4620, @@ -4980,9 +3658,7 @@ }, "latitude": 42.172330151, "longitude": -8.723766367, - "lines": [ - "7" - ] + "lines": ["7"] }, { "stopId": 4630, @@ -4991,9 +3667,7 @@ }, "latitude": 42.165721529, "longitude": -8.720146278, - "lines": [ - "7" - ] + "lines": ["7"] }, { "stopId": 4640, @@ -5002,9 +3676,7 @@ }, "latitude": 42.18659932, "longitude": -8.719619913, - "lines": [ - "7" - ] + "lines": ["7"] }, { "stopId": 4650, @@ -5013,9 +3685,7 @@ }, "latitude": 42.186641056, "longitude": -8.719853265, - "lines": [ - "7" - ] + "lines": ["7"] }, { "stopId": 4660, @@ -5024,9 +3694,7 @@ }, "latitude": 42.183997801, "longitude": -8.723857214, - "lines": [ - "7" - ] + "lines": ["7"] }, { "stopId": 4670, @@ -5035,9 +3703,7 @@ }, "latitude": 42.193836069, "longitude": -8.776441689, - "lines": [ - "11" - ] + "lines": ["11"] }, { "stopId": 4680, @@ -5046,9 +3712,7 @@ }, "latitude": 42.19429691, "longitude": -8.786574405, - "lines": [ - "11" - ] + "lines": ["11"] }, { "stopId": 4690, @@ -5057,9 +3721,7 @@ }, "latitude": 42.196307191, "longitude": -8.790777973, - "lines": [ - "11" - ] + "lines": ["11"] }, { "stopId": 4700, @@ -5068,9 +3730,7 @@ }, "latitude": 42.194014721, "longitude": -8.777055245, - "lines": [ - "11" - ] + "lines": ["11"] }, { "stopId": 4710, @@ -5079,9 +3739,7 @@ }, "latitude": 42.194064592, "longitude": -8.781224067, - "lines": [ - "11" - ] + "lines": ["11"] }, { "stopId": 4720, @@ -5090,9 +3748,7 @@ }, "latitude": 42.193937416, "longitude": -8.781634173, - "lines": [ - "11" - ] + "lines": ["11"] }, { "stopId": 4730, @@ -5101,9 +3757,7 @@ }, "latitude": 42.19405266, "longitude": -8.78551292, - "lines": [ - "11" - ] + "lines": ["11"] }, { "stopId": 4740, @@ -5112,9 +3766,7 @@ }, "latitude": 42.196595321, "longitude": -8.791019372, - "lines": [ - "11" - ] + "lines": ["11"] }, { "stopId": 4750, @@ -5123,13 +3775,7 @@ }, "latitude": 42.213983883, "longitude": -8.697464269, - "lines": [ - "12A", - "12B", - "13", - "U2", - "H3" - ] + "lines": ["12A", "12B", "13", "U2", "H3"] }, { "stopId": 4760, @@ -5138,13 +3784,7 @@ }, "latitude": 42.216359908, "longitude": -8.693040769, - "lines": [ - "12A", - "12B", - "13", - "U2", - "H3" - ] + "lines": ["12A", "12B", "13", "U2", "H3"] }, { "stopId": 4770, @@ -5153,13 +3793,7 @@ }, "latitude": 42.219822923, "longitude": -8.684198247, - "lines": [ - "12A", - "12B", - "13", - "31", - "U2" - ] + "lines": ["12A", "12B", "13", "31", "U2"] }, { "stopId": 4780, @@ -5168,13 +3802,7 @@ }, "latitude": 42.220845201, "longitude": -8.680581909, - "lines": [ - "12A", - "12B", - "13", - "31", - "U2" - ] + "lines": ["12A", "12B", "13", "31", "U2"] }, { "stopId": 4790, @@ -5183,12 +3811,7 @@ }, "latitude": 42.220436017, "longitude": -8.683690589, - "lines": [ - "12A", - "12B", - "13", - "31" - ] + "lines": ["12A", "12B", "13", "31"] }, { "stopId": 4800, @@ -5197,13 +3820,7 @@ }, "latitude": 42.218049288, "longitude": -8.679899408, - "lines": [ - "12A", - "12B", - "13", - "31", - "U2" - ] + "lines": ["12A", "12B", "13", "31", "U2"] }, { "stopId": 4810, @@ -5212,12 +3829,7 @@ }, "latitude": 42.21827574, "longitude": -8.679588272, - "lines": [ - "12A", - "12B", - "13", - "31" - ] + "lines": ["12A", "12B", "13", "31"] }, { "stopId": 4820, @@ -5226,12 +3838,7 @@ }, "latitude": 42.216687676, "longitude": -8.693917852, - "lines": [ - "12A", - "12B", - "13", - "H3" - ] + "lines": ["12A", "12B", "13", "H3"] }, { "stopId": 4830, @@ -5240,12 +3847,7 @@ }, "latitude": 42.218719793, "longitude": -8.690012555, - "lines": [ - "12A", - "12B", - "13", - "H3" - ] + "lines": ["12A", "12B", "13", "H3"] }, { "stopId": 4840, @@ -5254,13 +3856,7 @@ }, "latitude": 42.218745617, "longitude": -8.689009409, - "lines": [ - "12A", - "12B", - "13", - "U2", - "H3" - ] + "lines": ["12A", "12B", "13", "U2", "H3"] }, { "stopId": 4850, @@ -5269,11 +3865,7 @@ }, "latitude": 42.216448197, "longitude": -8.68163748, - "lines": [ - "12A", - "13", - "31" - ] + "lines": ["12A", "13", "31"] }, { "stopId": 4860, @@ -5282,10 +3874,7 @@ }, "latitude": 42.182744465, "longitude": -8.70286123, - "lines": [ - "A", - "6" - ] + "lines": ["A", "6"] }, { "stopId": 4870, @@ -5294,11 +3883,7 @@ }, "latitude": 42.192029809, "longitude": -8.712623715, - "lines": [ - "A", - "27", - "H3" - ] + "lines": ["A", "27", "H3"] }, { "stopId": 4880, @@ -5307,10 +3892,7 @@ }, "latitude": 42.188021902, "longitude": -8.711457595, - "lines": [ - "A", - "H3" - ] + "lines": ["A", "H3"] }, { "stopId": 4890, @@ -5319,10 +3901,7 @@ }, "latitude": 42.186610014, "longitude": -8.710023944, - "lines": [ - "A", - "6" - ] + "lines": ["A", "6"] }, { "stopId": 4900, @@ -5331,11 +3910,7 @@ }, "latitude": 42.188304845, "longitude": -8.711474749, - "lines": [ - "A", - "27", - "H3" - ] + "lines": ["A", "27", "H3"] }, { "stopId": 4910, @@ -5344,10 +3919,7 @@ }, "latitude": 42.19205763, "longitude": -8.712722956, - "lines": [ - "A", - "H3" - ] + "lines": ["A", "H3"] }, { "stopId": 4920, @@ -5356,10 +3928,7 @@ }, "latitude": 42.186610342, "longitude": -8.709937804, - "lines": [ - "A", - "6" - ] + "lines": ["A", "6"] }, { "stopId": 4930, @@ -5368,10 +3937,7 @@ }, "latitude": 42.246018558, "longitude": -8.669287042, - "lines": [ - "9B", - "27" - ] + "lines": ["9B", "27"] }, { "stopId": 4940, @@ -5380,10 +3946,7 @@ }, "latitude": 42.245450719, "longitude": -8.672406783, - "lines": [ - "9B", - "27" - ] + "lines": ["9B", "27"] }, { "stopId": 4960, @@ -5392,9 +3955,7 @@ }, "latitude": 42.256210875, "longitude": -8.696882723, - "lines": [ - "17" - ] + "lines": ["17"] }, { "stopId": 4970, @@ -5403,9 +3964,7 @@ }, "latitude": 42.255883312, "longitude": -8.696812986, - "lines": [ - "17" - ] + "lines": ["17"] }, { "stopId": 4980, @@ -5414,9 +3973,7 @@ }, "latitude": 42.257539061, "longitude": -8.697019814, - "lines": [ - "17" - ] + "lines": ["17"] }, { "stopId": 5000, @@ -5425,9 +3982,7 @@ }, "latitude": 42.250121395, "longitude": -8.696122376, - "lines": [ - "17" - ] + "lines": ["17"] }, { "stopId": 5010, @@ -5436,9 +3991,7 @@ }, "latitude": 42.254169539, "longitude": -8.697752273, - "lines": [ - "17" - ] + "lines": ["17"] }, { "stopId": 5020, @@ -5447,9 +4000,7 @@ }, "latitude": 42.254104511, "longitude": -8.697655199, - "lines": [ - "17" - ] + "lines": ["17"] }, { "stopId": 5030, @@ -5458,9 +4009,7 @@ }, "latitude": 42.272502528, "longitude": -8.664787252, - "lines": [ - "C3i" - ] + "lines": ["C3i"] }, { "stopId": 5040, @@ -5469,9 +4018,7 @@ }, "latitude": 42.222543586, "longitude": -8.717809812, - "lines": [ - "18A" - ] + "lines": ["18A"] }, { "stopId": 5060, @@ -5480,11 +4027,7 @@ }, "latitude": 42.212676247, "longitude": -8.739585545, - "lines": [ - "16", - "23", - "N4" - ] + "lines": ["16", "23", "N4"] }, { "stopId": 5070, @@ -5493,10 +4036,7 @@ }, "latitude": 42.220535836, "longitude": -8.74141599, - "lines": [ - "C3i", - "5B" - ] + "lines": ["C3i", "5B"] }, { "stopId": 5090, @@ -5505,10 +4045,7 @@ }, "latitude": 42.220359068, "longitude": -8.738861999, - "lines": [ - "C3i", - "5B" - ] + "lines": ["C3i", "5B"] }, { "stopId": 5120, @@ -5517,11 +4054,7 @@ }, "latitude": 42.204935234, "longitude": -8.722453969, - "lines": [ - "18B", - "18H", - "27" - ] + "lines": ["18B", "18H", "27"] }, { "stopId": 5140, @@ -5530,10 +4063,7 @@ }, "latitude": 42.207336295, "longitude": -8.72129506, - "lines": [ - "18B", - "18H" - ] + "lines": ["18B", "18H"] }, { "stopId": 5160, @@ -5542,11 +4072,7 @@ }, "latitude": 42.204783634, "longitude": -8.722664062, - "lines": [ - "18B", - "18H", - "27" - ] + "lines": ["18B", "18H", "27"] }, { "stopId": 5170, @@ -5555,10 +4081,7 @@ }, "latitude": 42.227529644, "longitude": -8.66169041, - "lines": [ - "15A", - "25" - ] + "lines": ["15A", "25"] }, { "stopId": 5180, @@ -5567,10 +4090,7 @@ }, "latitude": 42.224562288, "longitude": -8.66579419, - "lines": [ - "15A", - "25" - ] + "lines": ["15A", "25"] }, { "stopId": 5190, @@ -5579,10 +4099,7 @@ }, "latitude": 42.226051942, "longitude": -8.663629647, - "lines": [ - "15A", - "25" - ] + "lines": ["15A", "25"] }, { "stopId": 5200, @@ -5591,10 +4108,7 @@ }, "latitude": 42.227533616, "longitude": -8.661561664, - "lines": [ - "15A", - "25" - ] + "lines": ["15A", "25"] }, { "stopId": 5220, @@ -5603,10 +4117,7 @@ }, "latitude": 42.228984217, "longitude": -8.658438326, - "lines": [ - "15A", - "25" - ] + "lines": ["15A", "25"] }, { "stopId": 5230, @@ -5615,10 +4126,7 @@ }, "latitude": 42.230261894, "longitude": -8.653683012, - "lines": [ - "15A", - "25" - ] + "lines": ["15A", "25"] }, { "stopId": 5250, @@ -5627,10 +4135,7 @@ }, "latitude": 42.223048763, "longitude": -8.667374011, - "lines": [ - "15A", - "25" - ] + "lines": ["15A", "25"] }, { "stopId": 5260, @@ -5639,10 +4144,7 @@ }, "latitude": 42.222838218, "longitude": -8.667795118, - "lines": [ - "15A", - "25" - ] + "lines": ["15A", "25"] }, { "stopId": 5270, @@ -5651,10 +4153,7 @@ }, "latitude": 42.224367639, "longitude": -8.665989991, - "lines": [ - "15A", - "25" - ] + "lines": ["15A", "25"] }, { "stopId": 5280, @@ -5663,10 +4162,7 @@ }, "latitude": 42.225940716, "longitude": -8.663830813, - "lines": [ - "15A", - "25" - ] + "lines": ["15A", "25"] }, { "stopId": 5290, @@ -5675,11 +4171,7 @@ }, "latitude": 42.215060936, "longitude": -8.741309568, - "lines": [ - "5A", - "11", - "29" - ] + "lines": ["5A", "11", "29"] }, { "stopId": 5300, @@ -5688,11 +4180,7 @@ }, "latitude": 42.214827343, "longitude": -8.741319027, - "lines": [ - "5A", - "11", - "29" - ] + "lines": ["5A", "11", "29"] }, { "stopId": 5310, @@ -5701,11 +4189,7 @@ }, "latitude": 42.208024308, "longitude": -8.750412985, - "lines": [ - "5A", - "11", - "29" - ] + "lines": ["5A", "11", "29"] }, { "stopId": 5320, @@ -5714,11 +4198,7 @@ }, "latitude": 42.213244058, "longitude": -8.743657913, - "lines": [ - "5A", - "11", - "29" - ] + "lines": ["5A", "11", "29"] }, { "stopId": 5330, @@ -5727,11 +4207,7 @@ }, "latitude": 42.220228436, "longitude": -8.733426296, - "lines": [ - "5A", - "11", - "29" - ] + "lines": ["5A", "11", "29"] }, { "stopId": 5340, @@ -5740,11 +4216,7 @@ }, "latitude": 42.208621114, "longitude": -8.749572184, - "lines": [ - "5A", - "11", - "29" - ] + "lines": ["5A", "11", "29"] }, { "stopId": 5350, @@ -5753,11 +4225,7 @@ }, "latitude": 42.216779248, "longitude": -8.738705143, - "lines": [ - "5A", - "11", - "29" - ] + "lines": ["5A", "11", "29"] }, { "stopId": 5360, @@ -5766,11 +4234,7 @@ }, "latitude": 42.212804215, "longitude": -8.744506761, - "lines": [ - "5A", - "11", - "29" - ] + "lines": ["5A", "11", "29"] }, { "stopId": 5370, @@ -5779,11 +4243,7 @@ }, "latitude": 42.216928527, "longitude": -8.738268035, - "lines": [ - "5A", - "11", - "29" - ] + "lines": ["5A", "11", "29"] }, { "stopId": 5380, @@ -5792,11 +4252,7 @@ }, "latitude": 42.219743053, "longitude": -8.734322187, - "lines": [ - "5A", - "11", - "29" - ] + "lines": ["5A", "11", "29"] }, { "stopId": 5390, @@ -5805,9 +4261,7 @@ }, "latitude": 42.179556959, "longitude": -8.761854527, - "lines": [ - "29" - ] + "lines": ["29"] }, { "stopId": 5400, @@ -5816,13 +4270,7 @@ }, "latitude": 42.213518168, "longitude": -8.737719785, - "lines": [ - "7", - "12B", - "17", - "N4", - "H1" - ] + "lines": ["7", "12B", "17", "N4", "H1"] }, { "stopId": 5410, @@ -5831,17 +4279,7 @@ }, "latitude": 42.219689698, "longitude": -8.733384686, - "lines": [ - "A", - "16", - "23", - "N4", - "U1", - "H1", - "H", - "LZH", - "PSA 1" - ] + "lines": ["A", "16", "23", "N4", "U1", "H1", "H", "LZH", "PSA 1"] }, { "stopId": 5420, @@ -5850,13 +4288,7 @@ }, "latitude": 42.220297406, "longitude": -8.732924981, - "lines": [ - "7", - "12B", - "17", - "N4", - "H1" - ] + "lines": ["7", "12B", "17", "N4", "H1"] }, { "stopId": 5430, @@ -5865,17 +4297,7 @@ }, "latitude": 42.217381871, "longitude": -8.734669814, - "lines": [ - "A", - "16", - "23", - "N4", - "U1", - "H1", - "H", - "LZH", - "PSA 1" - ] + "lines": ["A", "16", "23", "N4", "U1", "H1", "H", "LZH", "PSA 1"] }, { "stopId": 5440, @@ -5884,13 +4306,7 @@ }, "latitude": 42.217288508, "longitude": -8.73454375, - "lines": [ - "7", - "12B", - "17", - "N4", - "H1" - ] + "lines": ["7", "12B", "17", "N4", "H1"] }, { "stopId": 5450, @@ -5899,16 +4315,7 @@ }, "latitude": 42.215348678, "longitude": -8.736273638, - "lines": [ - "A", - "16", - "23", - "N4", - "H1", - "H", - "LZH", - "PSA 1" - ] + "lines": ["A", "16", "23", "N4", "H1", "H", "LZH", "PSA 1"] }, { "stopId": 5460, @@ -5917,13 +4324,7 @@ }, "latitude": 42.215301002, "longitude": -8.736123434, - "lines": [ - "7", - "12B", - "17", - "N4", - "H1" - ] + "lines": ["7", "12B", "17", "N4", "H1"] }, { "stopId": 5470, @@ -5932,17 +4333,7 @@ }, "latitude": 42.21315264, "longitude": -8.738470803, - "lines": [ - "A", - "16", - "23", - "N4", - "U1", - "H1", - "H", - "LZH", - "PSA 1" - ] + "lines": ["A", "16", "23", "N4", "U1", "H1", "H", "LZH", "PSA 1"] }, { "stopId": 5480, @@ -5951,9 +4342,7 @@ }, "latitude": 42.186179757, "longitude": -8.748888329, - "lines": [ - "17" - ] + "lines": ["17"] }, { "stopId": 5490, @@ -5962,15 +4351,7 @@ }, "latitude": 42.241557555, "longitude": -8.707094861, - "lines": [ - "C3d", - "C3i", - "5B", - "10", - "17", - "N1", - "H3" - ] + "lines": ["C3d", "C3i", "5B", "10", "17", "N1", "H3"] }, { "stopId": 5500, @@ -5979,16 +4360,7 @@ }, "latitude": 42.24178025, "longitude": -8.706720936, - "lines": [ - "C3d", - "5B", - "10", - "17", - "31", - "H2", - "H3", - "PSA 1" - ] + "lines": ["C3d", "5B", "10", "17", "31", "H2", "H3", "PSA 1"] }, { "stopId": 5510, @@ -5997,14 +4369,7 @@ }, "latitude": 42.238290358, "longitude": -8.71014103, - "lines": [ - "C3d", - "C3i", - "5B", - "10", - "17", - "N1" - ] + "lines": ["C3d", "C3i", "5B", "10", "17", "N1"] }, { "stopId": 5520, @@ -6045,14 +4410,7 @@ }, "latitude": 42.23720456, "longitude": -8.718680736, - "lines": [ - "C3d", - "5B", - "10", - "17", - "H2", - "PSA 1" - ] + "lines": ["C3d", "5B", "10", "17", "H2", "PSA 1"] }, { "stopId": 5540, @@ -6061,17 +4419,7 @@ }, "latitude": 42.236759685, "longitude": -8.716384581, - "lines": [ - "C3d", - "A", - "5B", - "10", - "16", - "17", - "24", - "H2", - "PSA 1" - ] + "lines": ["C3d", "A", "5B", "10", "16", "17", "24", "H2", "PSA 1"] }, { "stopId": 5560, @@ -6080,17 +4428,7 @@ }, "latitude": 42.236896919, "longitude": -8.712902905, - "lines": [ - "C3d", - "A", - "5B", - "10", - "16", - "17", - "24", - "H2", - "PSA 1" - ] + "lines": ["C3d", "A", "5B", "10", "16", "17", "24", "H2", "PSA 1"] }, { "stopId": 5570, @@ -6099,14 +4437,7 @@ }, "latitude": 42.237003397, "longitude": -8.713586994, - "lines": [ - "C3d", - "C3i", - "5B", - "10", - "17", - "N1" - ] + "lines": ["C3d", "C3i", "5B", "10", "17", "N1"] }, { "stopId": 5580, @@ -6115,14 +4446,7 @@ }, "latitude": 42.238267348, "longitude": -8.709873166, - "lines": [ - "C3d", - "5B", - "10", - "17", - "H2", - "PSA 1" - ] + "lines": ["C3d", "5B", "10", "17", "H2", "PSA 1"] }, { "stopId": 5590, @@ -6131,11 +4455,7 @@ }, "latitude": 42.213057463, "longitude": -8.670479203, - "lines": [ - "12B", - "15B", - "15C" - ] + "lines": ["12B", "15B", "15C"] }, { "stopId": 5600, @@ -6144,17 +4464,7 @@ }, "latitude": 42.225140059, "longitude": -8.72184818, - "lines": [ - "C3i", - "7", - "11", - "13", - "15A", - "16", - "23", - "29", - "H2" - ] + "lines": ["C3i", "7", "11", "13", "15A", "16", "23", "29", "H2"] }, { "stopId": 5610, @@ -6186,17 +4496,7 @@ }, "latitude": 42.222321607, "longitude": -8.726440421, - "lines": [ - "C3d", - "13", - "15A", - "23", - "29", - "U1", - "U2", - "H2", - "PSA 1" - ] + "lines": ["C3d", "13", "15A", "23", "29", "U1", "U2", "H2", "PSA 1"] }, { "stopId": 5630, @@ -6205,19 +4505,7 @@ }, "latitude": 42.222790356, "longitude": -8.724940076, - "lines": [ - "C3i", - "7", - "11", - "13", - "15A", - "16", - "23", - "29", - "U1", - "U2", - "H2" - ] + "lines": ["C3i", "7", "11", "13", "15A", "16", "23", "29", "U1", "U2", "H2"] }, { "stopId": 5640, @@ -6226,16 +4514,7 @@ }, "latitude": 42.220868033, "longitude": -8.730264447, - "lines": [ - "C3d", - "13", - "15A", - "23", - "29", - "U2", - "H2", - "PSA 1" - ] + "lines": ["C3d", "13", "15A", "23", "29", "U2", "H2", "PSA 1"] }, { "stopId": 5650, @@ -6244,17 +4523,7 @@ }, "latitude": 42.220971136, "longitude": -8.729196245, - "lines": [ - "C3i", - "7", - "11", - "13", - "15A", - "16", - "23", - "29", - "H2" - ] + "lines": ["C3i", "7", "11", "13", "15A", "16", "23", "29", "H2"] }, { "stopId": 5660, @@ -6286,16 +4555,7 @@ }, "latitude": 42.230988893, "longitude": -8.71867283, - "lines": [ - "C1", - "12A", - "12B", - "14", - "18A", - "18B", - "18H", - "TUR" - ] + "lines": ["C1", "12A", "12B", "14", "18A", "18B", "18H", "TUR"] }, { "stopId": 5680, @@ -6304,15 +4564,7 @@ }, "latitude": 42.228173802, "longitude": -8.720267623, - "lines": [ - "C3d", - "13", - "15A", - "23", - "29", - "H2", - "PSA 1" - ] + "lines": ["C3d", "13", "15A", "23", "29", "H2", "PSA 1"] }, { "stopId": 5690, @@ -6321,17 +4573,7 @@ }, "latitude": 42.226868266, "longitude": -8.720637433, - "lines": [ - "C3i", - "7", - "11", - "13", - "15A", - "16", - "23", - "29", - "H2" - ] + "lines": ["C3i", "7", "11", "13", "15A", "16", "23", "29", "H2"] }, { "stopId": 5700, @@ -6340,15 +4582,7 @@ }, "latitude": 42.225325884, "longitude": -8.722106624, - "lines": [ - "C3d", - "13", - "15A", - "23", - "29", - "H2", - "PSA 1" - ] + "lines": ["C3d", "13", "15A", "23", "29", "H2", "PSA 1"] }, { "stopId": 5710, @@ -6357,9 +4591,7 @@ }, "latitude": 42.23003666347398, "longitude": -8.707266671978003, - "lines": [ - "31" - ] + "lines": ["31"] }, { "stopId": 5720, @@ -6368,13 +4600,7 @@ }, "latitude": 42.23004933454558, "longitude": -8.706947409683313, - "lines": [ - "4C", - "23", - "31", - "H2", - "PSA 4" - ] + "lines": ["4C", "23", "31", "H2", "PSA 4"] }, { "stopId": 5730, @@ -6383,10 +4609,7 @@ }, "latitude": 42.227850036119314, "longitude": -8.708105429626789, - "lines": [ - "31", - "H2" - ] + "lines": ["31", "H2"] }, { "stopId": 5740, @@ -6395,14 +4618,7 @@ }, "latitude": 42.22783722597372, "longitude": -8.707849091551859, - "lines": [ - "4C", - "23", - "31", - "N4", - "H2", - "PSA 4" - ] + "lines": ["4C", "23", "31", "N4", "H2", "PSA 4"] }, { "stopId": 5750, @@ -6411,14 +4627,7 @@ }, "latitude": 42.225785485, "longitude": -8.708786105, - "lines": [ - "4C", - "23", - "31", - "N4", - "H2", - "PSA 4" - ] + "lines": ["4C", "23", "31", "N4", "H2", "PSA 4"] }, { "stopId": 5760, @@ -6427,9 +4636,7 @@ }, "latitude": 42.16929549, "longitude": -8.723249687, - "lines": [ - "7" - ] + "lines": ["7"] }, { "stopId": 5770, @@ -6438,9 +4645,7 @@ }, "latitude": 42.16911061, "longitude": -8.723904146, - "lines": [ - "7" - ] + "lines": ["7"] }, { "stopId": 5790, @@ -6449,14 +4654,7 @@ }, "latitude": 42.214534062, "longitude": -8.684756053, - "lines": [ - "12A", - "12B", - "13", - "15B", - "15C", - "31" - ] + "lines": ["12A", "12B", "13", "15B", "15C", "31"] }, { "stopId": 5800, @@ -6561,10 +4759,7 @@ }, "latitude": 42.201360896, "longitude": -8.702877394, - "lines": [ - "18A", - "18B" - ] + "lines": ["18A", "18B"] }, { "stopId": 5850, @@ -6573,10 +4768,7 @@ }, "latitude": 42.201154253, "longitude": -8.702343635, - "lines": [ - "18A", - "18B" - ] + "lines": ["18A", "18B"] }, { "stopId": 5860, @@ -6585,11 +4777,7 @@ }, "latitude": 42.21669522, "longitude": -8.715884298, - "lines": [ - "18A", - "18B", - "18H" - ] + "lines": ["18A", "18B", "18H"] }, { "stopId": 5870, @@ -6598,10 +4786,7 @@ }, "latitude": 42.226432697, "longitude": -8.731262013, - "lines": [ - "5B", - "12A" - ] + "lines": ["5B", "12A"] }, { "stopId": 5880, @@ -6610,11 +4795,7 @@ }, "latitude": 42.226800566, "longitude": -8.731799623, - "lines": [ - "5A", - "5B", - "12A" - ] + "lines": ["5A", "5B", "12A"] }, { "stopId": 5890, @@ -6623,10 +4804,7 @@ }, "latitude": 42.222420533, "longitude": -8.731996938, - "lines": [ - "5B", - "12A" - ] + "lines": ["5B", "12A"] }, { "stopId": 5900, @@ -6635,11 +4813,7 @@ }, "latitude": 42.202071034, "longitude": -8.723541884, - "lines": [ - "18B", - "18H", - "27" - ] + "lines": ["18B", "18H", "27"] }, { "stopId": 5910, @@ -6648,11 +4822,7 @@ }, "latitude": 42.196213336, "longitude": -8.721136467, - "lines": [ - "18B", - "18H", - "27" - ] + "lines": ["18B", "18H", "27"] }, { "stopId": 5920, @@ -6661,11 +4831,7 @@ }, "latitude": 42.196173594, "longitude": -8.721023814, - "lines": [ - "18B", - "18H", - "27" - ] + "lines": ["18B", "18H", "27"] }, { "stopId": 5930, @@ -6674,11 +4840,7 @@ }, "latitude": 42.202050775, "longitude": -8.723454133, - "lines": [ - "18B", - "18H", - "27" - ] + "lines": ["18B", "18H", "27"] }, { "stopId": 5940, @@ -6687,11 +4849,7 @@ }, "latitude": 42.198347336, "longitude": -8.721488003, - "lines": [ - "18B", - "18H", - "27" - ] + "lines": ["18B", "18H", "27"] }, { "stopId": 5950, @@ -6700,9 +4858,7 @@ }, "latitude": 42.207127325, "longitude": -8.726636888, - "lines": [ - "27" - ] + "lines": ["27"] }, { "stopId": 5960, @@ -6711,9 +4867,7 @@ }, "latitude": 42.206757786, "longitude": -8.730056705, - "lines": [ - "27" - ] + "lines": ["27"] }, { "stopId": 5970, @@ -6722,9 +4876,7 @@ }, "latitude": 42.206880283, "longitude": -8.729978952, - "lines": [ - "27" - ] + "lines": ["27"] }, { "stopId": 5980, @@ -6733,9 +4885,7 @@ }, "latitude": 42.207198849, "longitude": -8.726658346, - "lines": [ - "27" - ] + "lines": ["27"] }, { "stopId": 6000, @@ -6744,10 +4894,7 @@ }, "latitude": 42.220887532, "longitude": -8.685059571, - "lines": [ - "31", - "H3" - ] + "lines": ["31", "H3"] }, { "stopId": 6010, @@ -6756,11 +4903,7 @@ }, "latitude": 42.223077231, "longitude": -8.675499751, - "lines": [ - "25", - "31", - "H3" - ] + "lines": ["25", "31", "H3"] }, { "stopId": 6020, @@ -6769,11 +4912,7 @@ }, "latitude": 42.223195307, "longitude": -8.681872932, - "lines": [ - "25", - "31", - "H3" - ] + "lines": ["25", "31", "H3"] }, { "stopId": 6030, @@ -6782,10 +4921,7 @@ }, "latitude": 42.220829925, "longitude": -8.685158812, - "lines": [ - "31", - "H3" - ] + "lines": ["31", "H3"] }, { "stopId": 6040, @@ -6794,11 +4930,7 @@ }, "latitude": 42.22320325, "longitude": -8.675213007, - "lines": [ - "25", - "31", - "H3" - ] + "lines": ["25", "31", "H3"] }, { "stopId": 6050, @@ -6807,10 +4939,7 @@ }, "latitude": 42.19890849, "longitude": -8.73623433, - "lines": [ - "12B", - "17" - ] + "lines": ["12B", "17"] }, { "stopId": 6060, @@ -6819,9 +4948,7 @@ }, "latitude": 42.196716802, "longitude": -8.729966982, - "lines": [ - "12B" - ] + "lines": ["12B"] }, { "stopId": 6070, @@ -6830,9 +4957,7 @@ }, "latitude": 42.199197066, "longitude": -8.736588816, - "lines": [ - "12B" - ] + "lines": ["12B"] }, { "stopId": 6080, @@ -6841,10 +4966,7 @@ }, "latitude": 42.197736144, "longitude": -8.732267294, - "lines": [ - "12B", - "17" - ] + "lines": ["12B", "17"] }, { "stopId": 6090, @@ -6853,9 +4975,7 @@ }, "latitude": 42.197626151, "longitude": -8.732546841, - "lines": [ - "12B" - ] + "lines": ["12B"] }, { "stopId": 6100, @@ -6864,10 +4984,7 @@ }, "latitude": 42.197066521, "longitude": -8.730468609, - "lines": [ - "12B", - "17" - ] + "lines": ["12B", "17"] }, { "stopId": 6110, @@ -6876,10 +4993,7 @@ }, "latitude": 42.243941636, "longitude": -8.669169025, - "lines": [ - "9B", - "27" - ] + "lines": ["9B", "27"] }, { "stopId": 6130, @@ -6888,10 +5002,7 @@ }, "latitude": 42.207132591, "longitude": -8.706967295, - "lines": [ - "18B", - "H3" - ] + "lines": ["18B", "H3"] }, { "stopId": 6140, @@ -6900,10 +5011,7 @@ }, "latitude": 42.206925967, "longitude": -8.707050443, - "lines": [ - "18B", - "H3" - ] + "lines": ["18B", "H3"] }, { "stopId": 6150, @@ -6912,9 +5020,7 @@ }, "latitude": 42.160616846, "longitude": -8.691088401, - "lines": [ - "7" - ] + "lines": ["7"] }, { "stopId": 6160, @@ -6923,9 +5029,7 @@ }, "latitude": 42.160635942, "longitude": -8.69145083, - "lines": [ - "7" - ] + "lines": ["7"] }, { "stopId": 6180, @@ -6934,10 +5038,7 @@ }, "latitude": 42.21850454, "longitude": -8.753892634, - "lines": [ - "C3i", - "5B" - ] + "lines": ["C3i", "5B"] }, { "stopId": 6187, @@ -6946,10 +5047,7 @@ }, "latitude": 42.215244712, "longitude": -8.74244225, - "lines": [ - "23", - "N4" - ] + "lines": ["23", "N4"] }, { "stopId": 6200, @@ -6958,11 +5056,7 @@ }, "latitude": 42.229298043, "longitude": -8.699760249, - "lines": [ - "6", - "25", - "31" - ] + "lines": ["6", "25", "31"] }, { "stopId": 6210, @@ -6971,15 +5065,7 @@ }, "latitude": 42.229259529, "longitude": -8.699964485, - "lines": [ - "4C", - "6", - "23", - "25", - "31", - "N4", - "PSA 4" - ] + "lines": ["4C", "6", "23", "25", "31", "N4", "PSA 4"] }, { "stopId": 6220, @@ -6988,9 +5074,7 @@ }, "latitude": 42.226116269, "longitude": -8.703346362, - "lines": [ - "31" - ] + "lines": ["31"] }, { "stopId": 6230, @@ -6999,9 +5083,7 @@ }, "latitude": 42.224839145, "longitude": -8.706082215, - "lines": [ - "31" - ] + "lines": ["31"] }, { "stopId": 6240, @@ -7010,9 +5092,7 @@ }, "latitude": 42.224493844, "longitude": -8.707734948, - "lines": [ - "31" - ] + "lines": ["31"] }, { "stopId": 6250, @@ -7021,13 +5101,7 @@ }, "latitude": 42.22667463, "longitude": -8.702581423, - "lines": [ - "4C", - "23", - "31", - "N4", - "PSA 4" - ] + "lines": ["4C", "23", "31", "N4", "PSA 4"] }, { "stopId": 6260, @@ -7036,10 +5110,7 @@ }, "latitude": 42.199568643, "longitude": -8.741030554, - "lines": [ - "12B", - "17" - ] + "lines": ["12B", "17"] }, { "stopId": 6280, @@ -7048,9 +5119,7 @@ }, "latitude": 42.223843943, "longitude": -8.65334865, - "lines": [ - "11" - ] + "lines": ["11"] }, { "stopId": 6290, @@ -7059,10 +5128,7 @@ }, "latitude": 42.202031781, "longitude": -8.769502424, - "lines": [ - "4A", - "12A" - ] + "lines": ["4A", "12A"] }, { "stopId": 6300, @@ -7096,9 +5162,7 @@ }, "latitude": 42.230800582, "longitude": -8.725954962, - "lines": [ - "TUR" - ] + "lines": ["TUR"] }, { "stopId": 6360, @@ -7107,9 +5171,7 @@ }, "latitude": 42.211426266, "longitude": -8.743166543, - "lines": [ - "16" - ] + "lines": ["16"] }, { "stopId": 6370, @@ -7118,9 +5180,7 @@ }, "latitude": 42.210130966, "longitude": -8.744872428, - "lines": [ - "16" - ] + "lines": ["16"] }, { "stopId": 6380, @@ -7129,9 +5189,7 @@ }, "latitude": 42.211811672, "longitude": -8.742420889, - "lines": [ - "16" - ] + "lines": ["16"] }, { "stopId": 6390, @@ -7140,9 +5198,7 @@ }, "latitude": 42.210204472, "longitude": -8.74559126, - "lines": [ - "16" - ] + "lines": ["16"] }, { "stopId": 6415, @@ -7151,9 +5207,7 @@ }, "latitude": 42.213852214, "longitude": -8.727322863, - "lines": [ - "TUR" - ] + "lines": ["TUR"] }, { "stopId": 6440, @@ -7162,9 +5216,7 @@ }, "latitude": 42.222951208, "longitude": -8.635051581, - "lines": [ - "A" - ] + "lines": ["A"] }, { "stopId": 6450, @@ -7173,12 +5225,7 @@ }, "latitude": 42.224306065, "longitude": -8.753090783, - "lines": [ - "C3d", - "C3i", - "13", - "H" - ] + "lines": ["C3d", "C3i", "13", "H"] }, { "stopId": 6460, @@ -7187,10 +5234,7 @@ }, "latitude": 42.224853579, "longitude": -8.752608542, - "lines": [ - "C3d", - "C3i" - ] + "lines": ["C3d", "C3i"] }, { "stopId": 6470, @@ -7199,10 +5243,7 @@ }, "latitude": 42.228458938, "longitude": -8.732202674, - "lines": [ - "5B", - "12A" - ] + "lines": ["5B", "12A"] }, { "stopId": 6480, @@ -7211,10 +5252,7 @@ }, "latitude": 42.229149188, "longitude": -8.731886908, - "lines": [ - "5B", - "12A" - ] + "lines": ["5B", "12A"] }, { "stopId": 6490, @@ -7223,10 +5261,7 @@ }, "latitude": 42.233972514, "longitude": -8.729963004, - "lines": [ - "5B", - "12A" - ] + "lines": ["5B", "12A"] }, { "stopId": 6500, @@ -7235,10 +5270,7 @@ }, "latitude": 42.233690068, "longitude": -8.730100174, - "lines": [ - "5B", - "12A" - ] + "lines": ["5B", "12A"] }, { "stopId": 6510, @@ -7247,10 +5279,7 @@ }, "latitude": 42.230584487, "longitude": -8.731459155, - "lines": [ - "5B", - "12A" - ] + "lines": ["5B", "12A"] }, { "stopId": 6520, @@ -7259,10 +5288,7 @@ }, "latitude": 42.232285981, "longitude": -8.730816324, - "lines": [ - "5B", - "12A" - ] + "lines": ["5B", "12A"] }, { "stopId": 6530, @@ -7271,9 +5297,7 @@ }, "latitude": 42.222480852, "longitude": -8.729812967, - "lines": [ - "C1" - ] + "lines": ["C1"] }, { "stopId": 6550, @@ -7282,16 +5306,7 @@ }, "latitude": 42.229886416, "longitude": -8.717463365, - "lines": [ - "C3i", - "6", - "11", - "15A", - "23", - "25", - "28", - "29" - ] + "lines": ["C3i", "6", "11", "15A", "23", "25", "28", "29"] }, { "stopId": 6560, @@ -7300,16 +5315,7 @@ }, "latitude": 42.23113801, "longitude": -8.711696824, - "lines": [ - "C3i", - "6", - "11", - "15A", - "23", - "25", - "27", - "28" - ] + "lines": ["C3i", "6", "11", "15A", "23", "25", "27", "28"] }, { "stopId": 6570, @@ -7318,17 +5324,7 @@ }, "latitude": 42.231357755, "longitude": -8.71296778, - "lines": [ - "C3d", - "6", - "15A", - "23", - "25", - "27", - "28", - "H2", - "PSA 1" - ] + "lines": ["C3d", "6", "15A", "23", "25", "27", "28", "H2", "PSA 1"] }, { "stopId": 6580, @@ -7337,17 +5333,7 @@ }, "latitude": 42.229860487, "longitude": -8.717979137, - "lines": [ - "C3d", - "6", - "15A", - "23", - "25", - "27", - "28", - "H2", - "PSA 1" - ] + "lines": ["C3d", "6", "15A", "23", "25", "27", "28", "H2", "PSA 1"] }, { "stopId": 6620, @@ -7356,17 +5342,7 @@ }, "latitude": 42.23757846151978, "longitude": -8.721031378896738, - "lines": [ - "C1", - "A", - "5A", - "9B", - "15B", - "15C", - "24", - "28", - "N4" - ] + "lines": ["C1", "A", "5A", "9B", "15B", "15C", "24", "28", "N4"] }, { "stopId": 6640, @@ -7375,15 +5351,7 @@ }, "latitude": 42.215506175, "longitude": -8.753186569, - "lines": [ - "C3d", - "C3i", - "4A", - "4C", - "15A", - "PSA 1", - "PSA 4" - ] + "lines": ["C3d", "C3i", "4A", "4C", "15A", "PSA 1", "PSA 4"] }, { "stopId": 6650, @@ -7392,12 +5360,7 @@ }, "latitude": 42.215554055, "longitude": -8.753042462, - "lines": [ - "C3d", - "C3i", - "5B", - "15B" - ] + "lines": ["C3d", "C3i", "5B", "15B"] }, { "stopId": 6670, @@ -7406,10 +5369,7 @@ }, "latitude": 42.183004832, "longitude": -8.702601056, - "lines": [ - "A", - "6" - ] + "lines": ["A", "6"] }, { "stopId": 6680, @@ -7418,9 +5378,7 @@ }, "latitude": 42.207311837, "longitude": -8.718650635, - "lines": [ - "A" - ] + "lines": ["A"] }, { "stopId": 6690, @@ -7429,9 +5387,7 @@ }, "latitude": 42.20495956, "longitude": -8.715695557, - "lines": [ - "A" - ] + "lines": ["A"] }, { "stopId": 6700, @@ -7440,9 +5396,7 @@ }, "latitude": 42.204947406, "longitude": -8.715589643, - "lines": [ - "A" - ] + "lines": ["A"] }, { "stopId": 6720, @@ -7451,9 +5405,7 @@ }, "latitude": 42.207385347, "longitude": -8.718127604, - "lines": [ - "A" - ] + "lines": ["A"] }, { "stopId": 6730, @@ -7462,10 +5414,7 @@ }, "latitude": 42.199386411, "longitude": -8.695417016, - "lines": [ - "18A", - "18B" - ] + "lines": ["18A", "18B"] }, { "stopId": 6740, @@ -7474,10 +5423,7 @@ }, "latitude": 42.242957479, "longitude": -8.691167762, - "lines": [ - "4A", - "24" - ] + "lines": ["4A", "24"] }, { "stopId": 6750, @@ -7486,12 +5432,7 @@ }, "latitude": 42.221783554, "longitude": -8.773517669, - "lines": [ - "10", - "15B", - "15C", - "N1" - ] + "lines": ["10", "15B", "15C", "N1"] }, { "stopId": 6760, @@ -7500,10 +5441,7 @@ }, "latitude": 42.201847037, "longitude": -8.782205633, - "lines": [ - "4C", - "10" - ] + "lines": ["4C", "10"] }, { "stopId": 6780, @@ -7512,10 +5450,7 @@ }, "latitude": 42.210256843, "longitude": -8.774740625, - "lines": [ - "4C", - "10" - ] + "lines": ["4C", "10"] }, { "stopId": 6790, @@ -7524,10 +5459,7 @@ }, "latitude": 42.214772655, "longitude": -8.774772363, - "lines": [ - "C3d", - "10" - ] + "lines": ["C3d", "10"] }, { "stopId": 6810, @@ -7536,10 +5468,7 @@ }, "latitude": 42.207405928, "longitude": -8.776153122, - "lines": [ - "4C", - "10" - ] + "lines": ["4C", "10"] }, { "stopId": 6820, @@ -7548,10 +5477,7 @@ }, "latitude": 42.20362713, "longitude": -8.777027535, - "lines": [ - "4C", - "10" - ] + "lines": ["4C", "10"] }, { "stopId": 6830, @@ -7560,10 +5486,7 @@ }, "latitude": 42.197495083, "longitude": -8.790235556, - "lines": [ - "4C", - "10" - ] + "lines": ["4C", "10"] }, { "stopId": 6860, @@ -7598,13 +5521,7 @@ }, "latitude": 42.215576278, "longitude": -8.748885599, - "lines": [ - "4A", - "4C", - "11", - "15A", - "N4" - ] + "lines": ["4A", "4C", "11", "15A", "N4"] }, { "stopId": 6890, @@ -7613,9 +5530,7 @@ }, "latitude": 42.198959642, "longitude": -8.68628496, - "lines": [ - "14" - ] + "lines": ["14"] }, { "stopId": 6900, @@ -7624,9 +5539,7 @@ }, "latitude": 42.199031443, "longitude": -8.686165797, - "lines": [ - "14" - ] + "lines": ["14"] }, { "stopId": 6930, @@ -7635,10 +5548,7 @@ }, "latitude": 42.220997313, "longitude": -8.732835177, - "lines": [ - "C1", - "N4" - ] + "lines": ["C1", "N4"] }, { "stopId": 6940, @@ -7671,16 +5581,7 @@ }, "latitude": 42.229280401, "longitude": -8.719123549, - "lines": [ - "7", - "12A", - "12B", - "14", - "16", - "18A", - "18B", - "18H" - ] + "lines": ["7", "12A", "12B", "14", "16", "18A", "18B", "18H"] }, { "stopId": 6955, @@ -7689,14 +5590,7 @@ }, "latitude": 42.229438377, "longitude": -8.719781108, - "lines": [ - "6", - "13", - "18B", - "18H", - "25", - "29" - ] + "lines": ["6", "13", "18B", "18H", "25", "29"] }, { "stopId": 6960, @@ -7705,16 +5599,7 @@ }, "latitude": 42.235056275, "longitude": -8.726757514, - "lines": [ - "4A", - "4C", - "7", - "12B", - "16", - "17", - "27", - "PSA 4" - ] + "lines": ["4A", "4C", "7", "12B", "16", "17", "27", "PSA 4"] }, { "stopId": 6970, @@ -7723,13 +5608,7 @@ }, "latitude": 42.223781999, "longitude": -8.735258991, - "lines": [ - "C1", - "A", - "10", - "N4", - "H1" - ] + "lines": ["C1", "A", "10", "N4", "H1"] }, { "stopId": 6980, @@ -7738,13 +5617,7 @@ }, "latitude": 42.224471236, "longitude": -8.73619635, - "lines": [ - "C3d", - "C3i", - "15B", - "15C", - "N1" - ] + "lines": ["C3d", "C3i", "15B", "15C", "N1"] }, { "stopId": 6990, @@ -7753,13 +5626,7 @@ }, "latitude": 42.224099613, "longitude": -8.735838344, - "lines": [ - "C3d", - "A", - "9B", - "15B", - "15C" - ] + "lines": ["C3d", "A", "9B", "15B", "15C"] }, { "stopId": 7000, @@ -7790,11 +5657,7 @@ }, "latitude": 42.212808952, "longitude": -8.740022994, - "lines": [ - "16", - "23", - "N4" - ] + "lines": ["16", "23", "N4"] }, { "stopId": 7040, @@ -7803,10 +5666,7 @@ }, "latitude": 42.218435348, "longitude": -8.709924429, - "lines": [ - "14", - "18A" - ] + "lines": ["14", "18A"] }, { "stopId": 7050, @@ -7815,9 +5675,7 @@ }, "latitude": 42.218502886, "longitude": -8.710133641, - "lines": [ - "14" - ] + "lines": ["14"] }, { "stopId": 7060, @@ -7826,11 +5684,7 @@ }, "latitude": 42.210499286, "longitude": -8.703983192, - "lines": [ - "14", - "18A", - "H3" - ] + "lines": ["14", "18A", "H3"] }, { "stopId": 7070, @@ -7839,11 +5693,7 @@ }, "latitude": 42.210620188, "longitude": -8.704177049, - "lines": [ - "14", - "18A", - "H3" - ] + "lines": ["14", "18A", "H3"] }, { "stopId": 7080, @@ -7852,10 +5702,7 @@ }, "latitude": 42.238797018, "longitude": -8.650399429, - "lines": [ - "9B", - "28" - ] + "lines": ["9B", "28"] }, { "stopId": 7090, @@ -7864,9 +5711,7 @@ }, "latitude": 42.191918475, "longitude": -8.706869692, - "lines": [ - "27" - ] + "lines": ["27"] }, { "stopId": 7100, @@ -7875,12 +5720,7 @@ }, "latitude": 42.1952442, "longitude": -8.71956212, - "lines": [ - "12B", - "18B", - "18H", - "27" - ] + "lines": ["12B", "18B", "18H", "27"] }, { "stopId": 7110, @@ -7889,9 +5729,7 @@ }, "latitude": 42.195709195, "longitude": -8.716896004, - "lines": [ - "27" - ] + "lines": ["27"] }, { "stopId": 7120, @@ -7900,9 +5738,7 @@ }, "latitude": 42.195795442, "longitude": -8.716893641, - "lines": [ - "27" - ] + "lines": ["27"] }, { "stopId": 7130, @@ -7911,9 +5747,7 @@ }, "latitude": 42.19350247, "longitude": -8.715219623, - "lines": [ - "27" - ] + "lines": ["27"] }, { "stopId": 7140, @@ -7922,9 +5756,7 @@ }, "latitude": 42.193601829, "longitude": -8.715157933, - "lines": [ - "27" - ] + "lines": ["27"] }, { "stopId": 7150, @@ -7933,9 +5765,7 @@ }, "latitude": 42.192415468, "longitude": -8.71184004, - "lines": [ - "27" - ] + "lines": ["27"] }, { "stopId": 7160, @@ -7944,9 +5774,7 @@ }, "latitude": 42.192526527, "longitude": -8.712588696, - "lines": [ - "27" - ] + "lines": ["27"] }, { "stopId": 7170, @@ -7955,12 +5783,7 @@ }, "latitude": 42.195322512, "longitude": -8.719460515, - "lines": [ - "12B", - "18B", - "18H", - "27" - ] + "lines": ["12B", "18B", "18H", "27"] }, { "stopId": 7200, @@ -7969,14 +5792,7 @@ }, "latitude": 42.231023929, "longitude": -8.69459232, - "lines": [ - "11", - "15A", - "15B", - "15C", - "31", - "H3" - ] + "lines": ["11", "15A", "15B", "15C", "31", "H3"] }, { "stopId": 7210, @@ -7985,14 +5801,7 @@ }, "latitude": 42.229661504, "longitude": -8.691416585, - "lines": [ - "11", - "15A", - "15B", - "15C", - "31", - "H3" - ] + "lines": ["11", "15A", "15B", "15C", "31", "H3"] }, { "stopId": 7220, @@ -8001,14 +5810,7 @@ }, "latitude": 42.229736581, "longitude": -8.691879077, - "lines": [ - "11", - "15A", - "15B", - "15C", - "31", - "H3" - ] + "lines": ["11", "15A", "15B", "15C", "31", "H3"] }, { "stopId": 7230, @@ -8017,14 +5819,7 @@ }, "latitude": 42.229560215, "longitude": -8.687854611, - "lines": [ - "11", - "15A", - "15B", - "15C", - "31", - "H3" - ] + "lines": ["11", "15A", "15B", "15C", "31", "H3"] }, { "stopId": 7240, @@ -8033,14 +5828,7 @@ }, "latitude": 42.229454954, "longitude": -8.684539401, - "lines": [ - "11", - "15A", - "15B", - "15C", - "31", - "H3" - ] + "lines": ["11", "15A", "15B", "15C", "31", "H3"] }, { "stopId": 7250, @@ -8049,14 +5837,7 @@ }, "latitude": 42.229533333, "longitude": -8.684593198, - "lines": [ - "11", - "15A", - "15B", - "15C", - "31", - "H3" - ] + "lines": ["11", "15A", "15B", "15C", "31", "H3"] }, { "stopId": 7260, @@ -8065,14 +5846,7 @@ }, "latitude": 42.22953241, "longitude": -8.681347572, - "lines": [ - "11", - "15A", - "15B", - "15C", - "31", - "H3" - ] + "lines": ["11", "15A", "15B", "15C", "31", "H3"] }, { "stopId": 7270, @@ -8081,14 +5855,7 @@ }, "latitude": 42.229570145, "longitude": -8.681232237, - "lines": [ - "11", - "15A", - "15B", - "15C", - "31", - "H3" - ] + "lines": ["11", "15A", "15B", "15C", "31", "H3"] }, { "stopId": 7280, @@ -8097,14 +5864,7 @@ }, "latitude": 42.228432118, "longitude": -8.67827376, - "lines": [ - "11", - "15A", - "15B", - "15C", - "31", - "H3" - ] + "lines": ["11", "15A", "15B", "15C", "31", "H3"] }, { "stopId": 7290, @@ -8113,14 +5873,7 @@ }, "latitude": 42.228411862, "longitude": -8.678489489, - "lines": [ - "11", - "15A", - "15B", - "15C", - "31", - "H3" - ] + "lines": ["11", "15A", "15B", "15C", "31", "H3"] }, { "stopId": 7300, @@ -8129,14 +5882,7 @@ }, "latitude": 42.223957681, "longitude": -8.673451332, - "lines": [ - "11", - "15A", - "15B", - "15C", - "31", - "H3" - ] + "lines": ["11", "15A", "15B", "15C", "31", "H3"] }, { "stopId": 7310, @@ -8145,13 +5891,7 @@ }, "latitude": 42.223219273, "longitude": -8.672272983, - "lines": [ - "11", - "15A", - "15B", - "15C", - "25" - ] + "lines": ["11", "15A", "15B", "15C", "25"] }, { "stopId": 7320, @@ -8160,14 +5900,7 @@ }, "latitude": 42.224462184, "longitude": -8.673842935, - "lines": [ - "11", - "15A", - "15B", - "15C", - "31", - "H3" - ] + "lines": ["11", "15A", "15B", "15C", "31", "H3"] }, { "stopId": 7330, @@ -8176,14 +5909,7 @@ }, "latitude": 42.231776636, "longitude": -8.697735869, - "lines": [ - "11", - "15A", - "15B", - "15C", - "31", - "H3" - ] + "lines": ["11", "15A", "15B", "15C", "31", "H3"] }, { "stopId": 7340, @@ -8192,13 +5918,7 @@ }, "latitude": 42.223272423, "longitude": -8.67216119, - "lines": [ - "11", - "15A", - "15B", - "15C", - "25" - ] + "lines": ["11", "15A", "15B", "15C", "25"] }, { "stopId": 7350, @@ -8207,14 +5927,7 @@ }, "latitude": 42.231927571, "longitude": -8.697668814, - "lines": [ - "11", - "15A", - "15B", - "15C", - "31", - "H3" - ] + "lines": ["11", "15A", "15B", "15C", "31", "H3"] }, { "stopId": 7360, @@ -8223,14 +5936,7 @@ }, "latitude": 42.230432101, "longitude": -8.694045149, - "lines": [ - "11", - "15A", - "15B", - "15C", - "31", - "H3" - ] + "lines": ["11", "15A", "15B", "15C", "31", "H3"] }, { "stopId": 7370, @@ -8239,14 +5945,7 @@ }, "latitude": 42.229607881, "longitude": -8.686980211, - "lines": [ - "11", - "15A", - "15B", - "15C", - "31", - "H3" - ] + "lines": ["11", "15A", "15B", "15C", "31", "H3"] }, { "stopId": 7380, @@ -8255,9 +5954,7 @@ }, "latitude": 42.220087856, "longitude": -8.707014826, - "lines": [ - "14" - ] + "lines": ["14"] }, { "stopId": 7390, @@ -8266,9 +5963,7 @@ }, "latitude": 42.220167311, "longitude": -8.706963864, - "lines": [ - "14" - ] + "lines": ["14"] }, { "stopId": 7410, @@ -8277,12 +5972,7 @@ }, "latitude": 42.226366639, "longitude": -8.752928216, - "lines": [ - "C3d", - "C3i", - "13", - "H" - ] + "lines": ["C3d", "C3i", "13", "H"] }, { "stopId": 7440, @@ -8291,9 +5981,7 @@ }, "latitude": 42.200640474, "longitude": -8.684744444, - "lines": [ - "14" - ] + "lines": ["14"] }, { "stopId": 7450, @@ -8302,9 +5990,7 @@ }, "latitude": 42.202168422, "longitude": -8.68473908, - "lines": [ - "14" - ] + "lines": ["14"] }, { "stopId": 7460, @@ -8313,9 +5999,7 @@ }, "latitude": 42.19807525, "longitude": -8.684800771, - "lines": [ - "14" - ] + "lines": ["14"] }, { "stopId": 7470, @@ -8324,9 +6008,7 @@ }, "latitude": 42.198206824, "longitude": -8.684878336, - "lines": [ - "14" - ] + "lines": ["14"] }, { "stopId": 7480, @@ -8335,9 +6017,7 @@ }, "latitude": 42.200729887, "longitude": -8.684258964, - "lines": [ - "14" - ] + "lines": ["14"] }, { "stopId": 7490, @@ -8346,9 +6026,7 @@ }, "latitude": 42.194091099, "longitude": -8.683392611, - "lines": [ - "14" - ] + "lines": ["14"] }, { "stopId": 7500, @@ -8357,9 +6035,7 @@ }, "latitude": 42.196388225, "longitude": -8.684151676, - "lines": [ - "14" - ] + "lines": ["14"] }, { "stopId": 7540, @@ -8368,10 +6044,7 @@ }, "latitude": 42.226657624, "longitude": -8.659447983, - "lines": [ - "11", - "15A" - ] + "lines": ["11", "15A"] }, { "stopId": 7590, @@ -8380,10 +6053,7 @@ }, "latitude": 42.225201551, "longitude": -8.667101684, - "lines": [ - "11", - "15A" - ] + "lines": ["11", "15A"] }, { "stopId": 7600, @@ -8392,9 +6062,7 @@ }, "latitude": 42.198544554, "longitude": -8.677824939, - "lines": [ - "14" - ] + "lines": ["14"] }, { "stopId": 7610, @@ -8403,9 +6071,7 @@ }, "latitude": 42.196647395, "longitude": -8.677801904, - "lines": [ - "14" - ] + "lines": ["14"] }, { "stopId": 7620, @@ -8414,9 +6080,7 @@ }, "latitude": 42.189146758, "longitude": -8.678708548, - "lines": [ - "14" - ] + "lines": ["14"] }, { "stopId": 7630, @@ -8425,10 +6089,7 @@ }, "latitude": 42.243135911, "longitude": -8.66173721, - "lines": [ - "9B", - "28" - ] + "lines": ["9B", "28"] }, { "stopId": 7640, @@ -8437,10 +6098,7 @@ }, "latitude": 42.241620781, "longitude": -8.652000054, - "lines": [ - "9B", - "28" - ] + "lines": ["9B", "28"] }, { "stopId": 7650, @@ -8449,11 +6107,7 @@ }, "latitude": 42.239043121, "longitude": -8.650247888, - "lines": [ - "9B", - "27", - "28" - ] + "lines": ["9B", "27", "28"] }, { "stopId": 7660, @@ -8462,10 +6116,7 @@ }, "latitude": 42.241610852, "longitude": -8.651865944, - "lines": [ - "9B", - "27" - ] + "lines": ["9B", "27"] }, { "stopId": 7662, @@ -8474,9 +6125,7 @@ }, "latitude": 42.211013462, "longitude": -8.68554295, - "lines": [ - "14" - ] + "lines": ["14"] }, { "stopId": 7664, @@ -8485,9 +6134,7 @@ }, "latitude": 42.211201327, "longitude": -8.688838517, - "lines": [ - "14" - ] + "lines": ["14"] }, { "stopId": 7666, @@ -8496,9 +6143,7 @@ }, "latitude": 42.210514541, "longitude": -8.685349777, - "lines": [ - "14" - ] + "lines": ["14"] }, { "stopId": 7668, @@ -8507,9 +6152,7 @@ }, "latitude": 42.211022529, "longitude": -8.688318168, - "lines": [ - "14" - ] + "lines": ["14"] }, { "stopId": 7670, @@ -8518,9 +6161,7 @@ }, "latitude": 42.235169136, "longitude": -8.671176685, - "lines": [ - "9B" - ] + "lines": ["9B"] }, { "stopId": 7680, @@ -8529,10 +6170,7 @@ }, "latitude": 42.240866745, "longitude": -8.669273191, - "lines": [ - "9B", - "27" - ] + "lines": ["9B", "27"] }, { "stopId": 7690, @@ -8541,10 +6179,7 @@ }, "latitude": 42.235468446, "longitude": -8.670649153, - "lines": [ - "9B", - "27" - ] + "lines": ["9B", "27"] }, { "stopId": 7700, @@ -8553,9 +6188,7 @@ }, "latitude": 42.236478263, "longitude": -8.669194381, - "lines": [ - "9B" - ] + "lines": ["9B"] }, { "stopId": 7710, @@ -8564,10 +6197,7 @@ }, "latitude": 42.236825775, "longitude": -8.669313413, - "lines": [ - "9B", - "27" - ] + "lines": ["9B", "27"] }, { "stopId": 7720, @@ -8576,9 +6206,7 @@ }, "latitude": 42.24099726, "longitude": -8.669077286, - "lines": [ - "9B" - ] + "lines": ["9B"] }, { "stopId": 7730, @@ -8587,10 +6215,7 @@ }, "latitude": 42.241580812, "longitude": -8.658065611, - "lines": [ - "9B", - "28" - ] + "lines": ["9B", "28"] }, { "stopId": 7740, @@ -8599,10 +6224,7 @@ }, "latitude": 42.241658253, "longitude": -8.658202403, - "lines": [ - "9B", - "27" - ] + "lines": ["9B", "27"] }, { "stopId": 7750, @@ -8611,10 +6233,7 @@ }, "latitude": 42.243330503, "longitude": -8.661852545, - "lines": [ - "9B", - "27" - ] + "lines": ["9B", "27"] }, { "stopId": 7760, @@ -8623,9 +6242,7 @@ }, "latitude": 42.193300199, "longitude": -8.681021538, - "lines": [ - "14" - ] + "lines": ["14"] }, { "stopId": 7762, @@ -8634,9 +6251,7 @@ }, "latitude": 42.209575101, "longitude": -8.690548833, - "lines": [ - "14" - ] + "lines": ["14"] }, { "stopId": 7764, @@ -8645,9 +6260,7 @@ }, "latitude": 42.209654568, "longitude": -8.690495189, - "lines": [ - "14" - ] + "lines": ["14"] }, { "stopId": 7810, @@ -8656,11 +6269,7 @@ }, "latitude": 42.217817959, "longitude": -8.710940668, - "lines": [ - "18A", - "18B", - "18H" - ] + "lines": ["18A", "18B", "18H"] }, { "stopId": 7830, @@ -8669,10 +6278,7 @@ }, "latitude": 42.20297089, "longitude": -8.707945762, - "lines": [ - "18B", - "H3" - ] + "lines": ["18B", "H3"] }, { "stopId": 7840, @@ -8681,9 +6287,7 @@ }, "latitude": 42.203039989, "longitude": -8.710936623, - "lines": [ - "18B" - ] + "lines": ["18B"] }, { "stopId": 7850, @@ -8692,10 +6296,7 @@ }, "latitude": 42.202923204, "longitude": -8.708085237, - "lines": [ - "18B", - "H3" - ] + "lines": ["18B", "H3"] }, { "stopId": 7860, @@ -8704,9 +6305,7 @@ }, "latitude": 42.225436283, "longitude": -8.68893946, - "lines": [ - "25" - ] + "lines": ["25"] }, { "stopId": 7870, @@ -8715,11 +6314,7 @@ }, "latitude": 42.166897971, "longitude": -8.802204658, - "lines": [ - "C3d", - "10", - "12A" - ] + "lines": ["C3d", "10", "12A"] }, { "stopId": 7880, @@ -8728,9 +6323,7 @@ }, "latitude": 42.222364236, "longitude": -8.718898254, - "lines": [ - "18A" - ] + "lines": ["18A"] }, { "stopId": 7890, @@ -8739,10 +6332,7 @@ }, "latitude": 42.180764289, "longitude": -8.80256063, - "lines": [ - "11", - "12A" - ] + "lines": ["11", "12A"] }, { "stopId": 7900, @@ -8751,10 +6341,7 @@ }, "latitude": 42.20492472, "longitude": -8.768904292, - "lines": [ - "4A", - "12A" - ] + "lines": ["4A", "12A"] }, { "stopId": 7910, @@ -8763,10 +6350,7 @@ }, "latitude": 42.208040013, "longitude": -8.767458581, - "lines": [ - "4A", - "12A" - ] + "lines": ["4A", "12A"] }, { "stopId": 7920, @@ -8775,10 +6359,7 @@ }, "latitude": 42.208926096, "longitude": -8.765294038, - "lines": [ - "4A", - "12A" - ] + "lines": ["4A", "12A"] }, { "stopId": 7930, @@ -8787,10 +6368,7 @@ }, "latitude": 42.208999211, "longitude": -8.765346753, - "lines": [ - "4A", - "12A" - ] + "lines": ["4A", "12A"] }, { "stopId": 7940, @@ -8799,10 +6377,7 @@ }, "latitude": 42.207987966, "longitude": -8.767688321, - "lines": [ - "4A", - "12A" - ] + "lines": ["4A", "12A"] }, { "stopId": 7950, @@ -8811,10 +6386,7 @@ }, "latitude": 42.206253649, "longitude": -8.768742472, - "lines": [ - "4A", - "12A" - ] + "lines": ["4A", "12A"] }, { "stopId": 7960, @@ -8823,10 +6395,7 @@ }, "latitude": 42.202111343, "longitude": -8.769560881, - "lines": [ - "4A", - "12A" - ] + "lines": ["4A", "12A"] }, { "stopId": 7970, @@ -8835,10 +6404,7 @@ }, "latitude": 42.213820465, "longitude": -8.760651176, - "lines": [ - "4A", - "12A" - ] + "lines": ["4A", "12A"] }, { "stopId": 7980, @@ -8847,10 +6413,7 @@ }, "latitude": 42.21430717, "longitude": -8.760710185, - "lines": [ - "4A", - "12A" - ] + "lines": ["4A", "12A"] }, { "stopId": 7990, @@ -8859,10 +6422,7 @@ }, "latitude": 42.212612622, "longitude": -8.760868435, - "lines": [ - "4A", - "12A" - ] + "lines": ["4A", "12A"] }, { "stopId": 8000, @@ -8871,10 +6431,7 @@ }, "latitude": 42.212034517, "longitude": -8.760916715, - "lines": [ - "4A", - "12A" - ] + "lines": ["4A", "12A"] }, { "stopId": 8010, @@ -8883,16 +6440,7 @@ }, "latitude": 42.245018172, "longitude": -8.703349646, - "lines": [ - "C3d", - "5B", - "10", - "17", - "31", - "H2", - "H3", - "PSA 1" - ] + "lines": ["C3d", "5B", "10", "17", "31", "H2", "H3", "PSA 1"] }, { "stopId": 8020, @@ -8901,14 +6449,7 @@ }, "latitude": 42.246941664, "longitude": -8.700376378, - "lines": [ - "C3d", - "C3i", - "5B", - "10", - "N1", - "H3" - ] + "lines": ["C3d", "C3i", "5B", "10", "N1", "H3"] }, { "stopId": 8030, @@ -8917,16 +6458,7 @@ }, "latitude": 42.246056261, "longitude": -8.701684825, - "lines": [ - "C3d", - "5B", - "10", - "17", - "31", - "H2", - "H3", - "PSA 1" - ] + "lines": ["C3d", "5B", "10", "17", "31", "H2", "H3", "PSA 1"] }, { "stopId": 8040, @@ -8935,14 +6467,7 @@ }, "latitude": 42.24874024, "longitude": -8.697546209, - "lines": [ - "C3d", - "C3i", - "5B", - "10", - "N1", - "H3" - ] + "lines": ["C3d", "C3i", "5B", "10", "N1", "H3"] }, { "stopId": 8050, @@ -8951,16 +6476,7 @@ }, "latitude": 42.247765296, "longitude": -8.698918203, - "lines": [ - "C3d", - "5B", - "10", - "17", - "31", - "H2", - "H3", - "PSA 1" - ] + "lines": ["C3d", "5B", "10", "17", "31", "H2", "H3", "PSA 1"] }, { "stopId": 8060, @@ -8969,14 +6485,7 @@ }, "latitude": 42.244926864, "longitude": -8.703642393, - "lines": [ - "C3d", - "C3i", - "5B", - "10", - "N1", - "H3" - ] + "lines": ["C3d", "C3i", "5B", "10", "N1", "H3"] }, { "stopId": 8090, @@ -8985,11 +6494,7 @@ }, "latitude": 42.216151643, "longitude": -8.715616477, - "lines": [ - "18A", - "18B", - "18H" - ] + "lines": ["18A", "18B", "18H"] }, { "stopId": 8100, @@ -8998,9 +6503,7 @@ }, "latitude": 42.160735669, "longitude": -8.709771124, - "lines": [ - "7" - ] + "lines": ["7"] }, { "stopId": 8110, @@ -9009,9 +6512,7 @@ }, "latitude": 42.160670051, "longitude": -8.709878412, - "lines": [ - "7" - ] + "lines": ["7"] }, { "stopId": 8120, @@ -9020,9 +6521,7 @@ }, "latitude": 42.22493632, "longitude": -8.694369092, - "lines": [ - "25" - ] + "lines": ["25"] }, { "stopId": 8130, @@ -9031,9 +6530,7 @@ }, "latitude": 42.225485938, "longitude": -8.692235895, - "lines": [ - "25" - ] + "lines": ["25"] }, { "stopId": 8140, @@ -9042,9 +6539,7 @@ }, "latitude": 42.224657696, "longitude": -8.696532794, - "lines": [ - "25" - ] + "lines": ["25"] }, { "stopId": 8150, @@ -9053,9 +6548,7 @@ }, "latitude": 42.225076787, "longitude": -8.697168477, - "lines": [ - "25" - ] + "lines": ["25"] }, { "stopId": 8160, @@ -9064,9 +6557,7 @@ }, "latitude": 42.224884679, "longitude": -8.694275214, - "lines": [ - "25" - ] + "lines": ["25"] }, { "stopId": 8170, @@ -9075,9 +6566,7 @@ }, "latitude": 42.225428901, "longitude": -8.688744499, - "lines": [ - "25" - ] + "lines": ["25"] }, { "stopId": 8180, @@ -9086,9 +6575,7 @@ }, "latitude": 42.173993336, "longitude": -8.70329684, - "lines": [ - "7" - ] + "lines": ["7"] }, { "stopId": 8190, @@ -9097,9 +6584,7 @@ }, "latitude": 42.214660701, "longitude": -8.722840401, - "lines": [ - "A" - ] + "lines": ["A"] }, { "stopId": 8200, @@ -9108,9 +6593,7 @@ }, "latitude": 42.214714337, "longitude": -8.723068388, - "lines": [ - "A" - ] + "lines": ["A"] }, { "stopId": 8210, @@ -9119,9 +6602,7 @@ }, "latitude": 42.214377129, "longitude": -8.725964538, - "lines": [ - "A" - ] + "lines": ["A"] }, { "stopId": 8220, @@ -9130,9 +6611,7 @@ }, "latitude": 42.213993258, "longitude": -8.726740824, - "lines": [ - "A" - ] + "lines": ["A"] }, { "stopId": 8230, @@ -9141,9 +6620,7 @@ }, "latitude": 42.199146625, "longitude": -8.676419461, - "lines": [ - "14" - ] + "lines": ["14"] }, { "stopId": 8240, @@ -9152,11 +6629,7 @@ }, "latitude": 42.243382567, "longitude": -8.674125307, - "lines": [ - "9B", - "27", - "28" - ] + "lines": ["9B", "27", "28"] }, { "stopId": 8250, @@ -9165,11 +6638,7 @@ }, "latitude": 42.242669731, "longitude": -8.670096629, - "lines": [ - "9B", - "27", - "28" - ] + "lines": ["9B", "27", "28"] }, { "stopId": 8282, @@ -9178,9 +6647,7 @@ }, "latitude": 42.206854901, "longitude": -8.686031058, - "lines": [ - "14" - ] + "lines": ["14"] }, { "stopId": 8284, @@ -9189,9 +6656,7 @@ }, "latitude": 42.206779403, "longitude": -8.686218813, - "lines": [ - "14" - ] + "lines": ["14"] }, { "stopId": 8290, @@ -9200,10 +6665,7 @@ }, "latitude": 42.235646525, "longitude": -8.685908988, - "lines": [ - "27", - "28" - ] + "lines": ["27", "28"] }, { "stopId": 8300, @@ -9212,10 +6674,7 @@ }, "latitude": 42.23556225, "longitude": -8.686044366, - "lines": [ - "27", - "28" - ] + "lines": ["27", "28"] }, { "stopId": 8330, @@ -9224,13 +6683,7 @@ }, "latitude": 42.223897608, "longitude": -8.740424721, - "lines": [ - "C3d", - "C3i", - "15B", - "15C", - "N1" - ] + "lines": ["C3d", "C3i", "15B", "15C", "N1"] }, { "stopId": 8340, @@ -9239,13 +6692,7 @@ }, "latitude": 42.223840474, "longitude": -8.740432891, - "lines": [ - "C3d", - "13", - "15B", - "15C", - "H" - ] + "lines": ["C3d", "13", "15B", "15C", "H"] }, { "stopId": 8370, @@ -9254,10 +6701,7 @@ }, "latitude": 42.223984208, "longitude": -8.751326546, - "lines": [ - "C3d", - "C3i" - ] + "lines": ["C3d", "C3i"] }, { "stopId": 8390, @@ -9266,13 +6710,7 @@ }, "latitude": 42.223510532, "longitude": -8.748903264, - "lines": [ - "C3d", - "13", - "15B", - "15C", - "H" - ] + "lines": ["C3d", "13", "15B", "15C", "H"] }, { "stopId": 8410, @@ -9281,11 +6719,7 @@ }, "latitude": 42.218006346, "longitude": -8.754154367, - "lines": [ - "C3d", - "10", - "15B" - ] + "lines": ["C3d", "10", "15B"] }, { "stopId": 8420, @@ -9294,11 +6728,7 @@ }, "latitude": 42.218031265, "longitude": -8.754258995, - "lines": [ - "C3d", - "C3i", - "10" - ] + "lines": ["C3d", "C3i", "10"] }, { "stopId": 8430, @@ -9307,11 +6737,7 @@ }, "latitude": 42.221229518, "longitude": -8.753411657, - "lines": [ - "C3d", - "10", - "15B" - ] + "lines": ["C3d", "10", "15B"] }, { "stopId": 8440, @@ -9320,11 +6746,7 @@ }, "latitude": 42.220192578, "longitude": -8.754164587, - "lines": [ - "C3d", - "C3i", - "10" - ] + "lines": ["C3d", "C3i", "10"] }, { "stopId": 8450, @@ -9333,16 +6755,7 @@ }, "latitude": 42.231511437, "longitude": -8.732178, - "lines": [ - "C1", - "C3d", - "A", - "5A", - "9B", - "15C", - "N4", - "H1" - ] + "lines": ["C1", "C3d", "A", "5A", "9B", "15C", "N4", "H1"] }, { "stopId": 8460, @@ -9351,15 +6764,7 @@ }, "latitude": 42.227500225, "longitude": -8.734096707, - "lines": [ - "C1", - "C3d", - "A", - "9B", - "15C", - "N4", - "H1" - ] + "lines": ["C1", "C3d", "A", "9B", "15C", "N4", "H1"] }, { "stopId": 8470, @@ -9368,16 +6773,7 @@ }, "latitude": 42.234106639, "longitude": -8.731302569, - "lines": [ - "C1", - "C3d", - "A", - "5A", - "9B", - "15C", - "N4", - "H1" - ] + "lines": ["C1", "C3d", "A", "5A", "9B", "15C", "N4", "H1"] }, { "stopId": 8480, @@ -9386,16 +6782,7 @@ }, "latitude": 42.229616766, "longitude": -8.732861043, - "lines": [ - "C1", - "C3d", - "A", - "5A", - "9B", - "15C", - "N4", - "H1" - ] + "lines": ["C1", "C3d", "A", "5A", "9B", "15C", "N4", "H1"] }, { "stopId": 8490, @@ -9404,12 +6791,7 @@ }, "latitude": 42.244366441, "longitude": -8.695452075, - "lines": [ - "C3i", - "5A", - "N1", - "H3" - ] + "lines": ["C3i", "5A", "N1", "H3"] }, { "stopId": 8500, @@ -9418,13 +6800,7 @@ }, "latitude": 42.238455548, "longitude": -8.703814812, - "lines": [ - "C3d", - "5A", - "31", - "H2", - "PSA 1" - ] + "lines": ["C3d", "5A", "31", "H2", "PSA 1"] }, { "stopId": 8510, @@ -9433,11 +6809,7 @@ }, "latitude": 42.238413145, "longitude": -8.703563202, - "lines": [ - "C3i", - "5A", - "N1" - ] + "lines": ["C3i", "5A", "N1"] }, { "stopId": 8520, @@ -9446,13 +6818,7 @@ }, "latitude": 42.241332883, "longitude": -8.702059906, - "lines": [ - "C3d", - "5A", - "31", - "H2", - "PSA 1" - ] + "lines": ["C3d", "5A", "31", "H2", "PSA 1"] }, { "stopId": 8530, @@ -9461,11 +6827,7 @@ }, "latitude": 42.241101222, "longitude": -8.701974032, - "lines": [ - "C3i", - "5A", - "N1" - ] + "lines": ["C3i", "5A", "N1"] }, { "stopId": 8540, @@ -9474,13 +6836,7 @@ }, "latitude": 42.242844316, "longitude": -8.698295825, - "lines": [ - "C3d", - "5A", - "31", - "H2", - "PSA 1" - ] + "lines": ["C3d", "5A", "31", "H2", "PSA 1"] }, { "stopId": 8550, @@ -9489,13 +6845,7 @@ }, "latitude": 42.246425568, "longitude": -8.692950624, - "lines": [ - "C3i", - "5A", - "5B", - "N1", - "H3" - ] + "lines": ["C3i", "5A", "5B", "N1", "H3"] }, { "stopId": 8560, @@ -9504,14 +6854,7 @@ }, "latitude": 42.24409871, "longitude": -8.69614733, - "lines": [ - "C3d", - "5A", - "31", - "H2", - "H3", - "PSA 1" - ] + "lines": ["C3d", "5A", "31", "H2", "H3", "PSA 1"] }, { "stopId": 8570, @@ -9520,14 +6863,7 @@ }, "latitude": 42.246143319, "longitude": -8.69359937, - "lines": [ - "C3d", - "5A", - "31", - "H2", - "H3", - "PSA 1" - ] + "lines": ["C3d", "5A", "31", "H2", "H3", "PSA 1"] }, { "stopId": 8580, @@ -9536,12 +6872,7 @@ }, "latitude": 42.233828086, "longitude": -8.706311242, - "lines": [ - "C3i", - "5A", - "31", - "N1" - ] + "lines": ["C3i", "5A", "31", "N1"] }, { "stopId": 8590, @@ -9550,13 +6881,7 @@ }, "latitude": 42.233681224, "longitude": -8.706702136, - "lines": [ - "C3d", - "5A", - "31", - "H2", - "PSA 1" - ] + "lines": ["C3d", "5A", "31", "H2", "PSA 1"] }, { "stopId": 8600, @@ -9565,13 +6890,7 @@ }, "latitude": 42.236350093, "longitude": -8.70429745, - "lines": [ - "C3d", - "5A", - "31", - "H2", - "PSA 1" - ] + "lines": ["C3d", "5A", "31", "H2", "PSA 1"] }, { "stopId": 8610, @@ -9608,11 +6927,7 @@ }, "latitude": 42.236261792, "longitude": -8.703994979, - "lines": [ - "C3i", - "5A", - "N1" - ] + "lines": ["C3i", "5A", "N1"] }, { "stopId": 8630, @@ -9650,12 +6965,7 @@ }, "latitude": 42.168290977, "longitude": -8.68342947, - "lines": [ - "A", - "15C", - "U1", - "U2" - ] + "lines": ["A", "15C", "U1", "U2"] }, { "stopId": 8670, @@ -9664,12 +6974,7 @@ }, "latitude": 42.167687661, "longitude": -8.685994335, - "lines": [ - "A", - "15C", - "U1", - "U2" - ] + "lines": ["A", "15C", "U1", "U2"] }, { "stopId": 8680, @@ -9678,12 +6983,7 @@ }, "latitude": 42.169603028, "longitude": -8.680108895, - "lines": [ - "A", - "15C", - "U1", - "U2" - ] + "lines": ["A", "15C", "U1", "U2"] }, { "stopId": 8700, @@ -9692,12 +6992,7 @@ }, "latitude": 42.167963445, "longitude": -8.688421342, - "lines": [ - "A", - "15C", - "U1", - "U2" - ] + "lines": ["A", "15C", "U1", "U2"] }, { "stopId": 8710, @@ -9706,9 +7001,7 @@ }, "latitude": 42.167985106, "longitude": -8.688425395, - "lines": [ - "A" - ] + "lines": ["A"] }, { "stopId": 8720, @@ -9717,12 +7010,7 @@ }, "latitude": 42.169678809, "longitude": -8.679104749, - "lines": [ - "A", - "15C", - "U1", - "U2" - ] + "lines": ["A", "15C", "U1", "U2"] }, { "stopId": 8721, @@ -9731,9 +7019,7 @@ }, "latitude": 42.169776602, "longitude": -8.678942156, - "lines": [ - "A" - ] + "lines": ["A"] }, { "stopId": 8730, @@ -9742,9 +7028,7 @@ }, "latitude": 42.170159671, "longitude": -8.68735086, - "lines": [ - "A" - ] + "lines": ["A"] }, { "stopId": 8740, @@ -9753,12 +7037,7 @@ }, "latitude": 42.170123888, "longitude": -8.687270393, - "lines": [ - "A", - "15C", - "U1", - "U2" - ] + "lines": ["A", "15C", "U1", "U2"] }, { "stopId": 8750, @@ -9896,17 +7175,7 @@ }, "latitude": 42.234250043, "longitude": -8.724361531, - "lines": [ - "4A", - "4C", - "5B", - "11", - "12A", - "12B", - "17", - "27", - "N1" - ] + "lines": ["4A", "4C", "5B", "11", "12A", "12B", "17", "27", "N1"] }, { "stopId": 8880, @@ -9915,17 +7184,7 @@ }, "latitude": 42.233188126, "longitude": -8.72155331, - "lines": [ - "4A", - "4C", - "5B", - "11", - "12A", - "12B", - "17", - "27", - "N1" - ] + "lines": ["4A", "4C", "5B", "11", "12A", "12B", "17", "27", "N1"] }, { "stopId": 8890, @@ -9934,16 +7193,7 @@ }, "latitude": 42.233283503, "longitude": -8.721378959, - "lines": [ - "4A", - "4C", - "5B", - "7", - "12B", - "16", - "17", - "PSA 4" - ] + "lines": ["4A", "4C", "5B", "7", "12B", "16", "17", "PSA 4"] }, { "stopId": 8900, @@ -9952,16 +7202,7 @@ }, "latitude": 42.232243383, "longitude": -8.718524158, - "lines": [ - "4A", - "4C", - "5B", - "7", - "12B", - "16", - "17", - "PSA 4" - ] + "lines": ["4A", "4C", "5B", "7", "12B", "16", "17", "PSA 4"] }, { "stopId": 8910, @@ -9970,17 +7211,7 @@ }, "latitude": 42.232224046, "longitude": -8.718985824, - "lines": [ - "4A", - "4C", - "5B", - "11", - "12A", - "12B", - "17", - "27", - "N1" - ] + "lines": ["4A", "4C", "5B", "11", "12A", "12B", "17", "27", "N1"] }, { "stopId": 8916, @@ -9989,9 +7220,7 @@ }, "latitude": 42.231593651, "longitude": -8.71714227, - "lines": [ - "27" - ] + "lines": ["27"] }, { "stopId": 8930, @@ -10000,10 +7229,7 @@ }, "latitude": 42.22014115, "longitude": -8.745082757, - "lines": [ - "C3i", - "5B" - ] + "lines": ["C3i", "5B"] }, { "stopId": 8950, @@ -10012,10 +7238,7 @@ }, "latitude": 42.218712573, "longitude": -8.75011435, - "lines": [ - "C3i", - "5B" - ] + "lines": ["C3i", "5B"] }, { "stopId": 8970, @@ -10024,10 +7247,7 @@ }, "latitude": 42.197425383, "longitude": -8.713700535, - "lines": [ - "A", - "H3" - ] + "lines": ["A", "H3"] }, { "stopId": 8980, @@ -10036,10 +7256,7 @@ }, "latitude": 42.197532685, "longitude": -8.713614705, - "lines": [ - "A", - "H3" - ] + "lines": ["A", "H3"] }, { "stopId": 8990, @@ -10048,11 +7265,7 @@ }, "latitude": 42.200673849, "longitude": -8.714185609, - "lines": [ - "A", - "18B", - "H3" - ] + "lines": ["A", "18B", "H3"] }, { "stopId": 9000, @@ -10061,10 +7274,7 @@ }, "latitude": 42.200719549, "longitude": -8.714115872, - "lines": [ - "A", - "H3" - ] + "lines": ["A", "H3"] }, { "stopId": 9010, @@ -10073,9 +7283,7 @@ }, "latitude": 42.203157887, "longitude": -8.694293108, - "lines": [ - "14" - ] + "lines": ["14"] }, { "stopId": 9020, @@ -10084,10 +7292,7 @@ }, "latitude": 42.207584622, "longitude": -8.670108196, - "lines": [ - "15B", - "15C" - ] + "lines": ["15B", "15C"] }, { "stopId": 9040, @@ -10096,11 +7301,7 @@ }, "latitude": 42.20831564, "longitude": -8.670282438, - "lines": [ - "15B", - "15C", - "U2" - ] + "lines": ["15B", "15C", "U2"] }, { "stopId": 9050, @@ -10109,9 +7310,7 @@ }, "latitude": 42.154646971, "longitude": -8.688349062, - "lines": [ - "7" - ] + "lines": ["7"] }, { "stopId": 10061, @@ -10120,9 +7319,7 @@ }, "latitude": 42.185277472, "longitude": -8.741558953, - "lines": [ - "17" - ] + "lines": ["17"] }, { "stopId": 14101, @@ -10131,9 +7328,7 @@ }, "latitude": 42.168008539, "longitude": -8.710415438, - "lines": [ - "7" - ] + "lines": ["7"] }, { "stopId": 14102, @@ -10142,9 +7337,7 @@ }, "latitude": 42.168282882, "longitude": -8.710066751, - "lines": [ - "7" - ] + "lines": ["7"] }, { "stopId": 14105, @@ -10153,12 +7346,7 @@ }, "latitude": 42.167237978, "longitude": -8.681135704, - "lines": [ - "A", - "15C", - "U1", - "U2" - ] + "lines": ["A", "15C", "U1", "U2"] }, { "stopId": 14106, @@ -10167,11 +7355,7 @@ }, "latitude": 42.234161582, "longitude": -8.695074564, - "lines": [ - "A", - "9B", - "27" - ] + "lines": ["A", "9B", "27"] }, { "stopId": 14107, @@ -10180,9 +7364,7 @@ }, "latitude": 42.257847205, "longitude": -8.677696507, - "lines": [ - "10" - ] + "lines": ["10"] }, { "stopId": 14108, @@ -10191,10 +7373,7 @@ }, "latitude": 42.21401741, "longitude": -8.67133083, - "lines": [ - "15B", - "15C" - ] + "lines": ["15B", "15C"] }, { "stopId": 14111, @@ -10203,10 +7382,7 @@ }, "latitude": 42.204262657, "longitude": -8.684801801, - "lines": [ - "6", - "14" - ] + "lines": ["6", "14"] }, { "stopId": 14112, @@ -10215,10 +7391,7 @@ }, "latitude": 42.204047198, "longitude": -8.684697288, - "lines": [ - "6", - "14" - ] + "lines": ["6", "14"] }, { "stopId": 14113, @@ -10227,10 +7400,7 @@ }, "latitude": 42.193458577, "longitude": -8.702065856, - "lines": [ - "6", - "27" - ] + "lines": ["6", "27"] }, { "stopId": 14117, @@ -10239,9 +7409,7 @@ }, "latitude": 42.228574702, "longitude": -8.712864548, - "lines": [ - "H2" - ] + "lines": ["H2"] }, { "stopId": 14119, @@ -10250,9 +7418,7 @@ }, "latitude": 42.229320789, "longitude": -8.710390551, - "lines": [ - "H2" - ] + "lines": ["H2"] }, { "stopId": 14121, @@ -10282,13 +7448,7 @@ }, "latitude": 42.231584097, "longitude": -8.706968521, - "lines": [ - "4C", - "23", - "31", - "H2", - "PSA 4" - ] + "lines": ["4C", "23", "31", "H2", "PSA 4"] }, { "stopId": 14123, @@ -10297,17 +7457,7 @@ }, "latitude": 42.214127819, "longitude": -8.752027594, - "lines": [ - "C3d", - "C3i", - "4A", - "4C", - "5B", - "11", - "15A", - "15B", - "N4" - ] + "lines": ["C3d", "C3i", "4A", "4C", "5B", "11", "15A", "15B", "N4"] }, { "stopId": 14124, @@ -10316,11 +7466,7 @@ }, "latitude": 42.226569499, "longitude": -8.752773946, - "lines": [ - "C3d", - "C3i", - "6" - ] + "lines": ["C3d", "C3i", "6"] }, { "stopId": 14125, @@ -10329,15 +7475,7 @@ }, "latitude": 42.213869651, "longitude": -8.751990789, - "lines": [ - "C3d", - "C3i", - "4A", - "4C", - "15A", - "PSA 1", - "PSA 4" - ] + "lines": ["C3d", "C3i", "4A", "4C", "15A", "PSA 1", "PSA 4"] }, { "stopId": 14126, @@ -10346,11 +7484,7 @@ }, "latitude": 42.242494425, "longitude": -8.699249038, - "lines": [ - "C3i", - "5A", - "N1" - ] + "lines": ["C3i", "5A", "N1"] }, { "stopId": 14127, @@ -10359,12 +7493,7 @@ }, "latitude": 42.249306896, "longitude": -8.695179916, - "lines": [ - "5B", - "10", - "N1", - "H3" - ] + "lines": ["5B", "10", "N1", "H3"] }, { "stopId": 14128, @@ -10373,9 +7502,7 @@ }, "latitude": 42.20733292, "longitude": -8.752159103, - "lines": [ - "5A" - ] + "lines": ["5A"] }, { "stopId": 14129, @@ -10384,9 +7511,7 @@ }, "latitude": 42.20723039, "longitude": -8.752592351, - "lines": [ - "5A" - ] + "lines": ["5A"] }, { "stopId": 14131, @@ -10395,11 +7520,7 @@ }, "latitude": 42.221948768, "longitude": -8.753171211, - "lines": [ - "C3d", - "C3i", - "10" - ] + "lines": ["C3d", "C3i", "10"] }, { "stopId": 14132, @@ -10408,17 +7529,7 @@ }, "latitude": 42.249307631, "longitude": -8.696542008, - "lines": [ - "C3d", - "5A", - "5B", - "10", - "17", - "31", - "H2", - "H3", - "PSA 1" - ] + "lines": ["C3d", "5A", "5B", "10", "17", "31", "H2", "H3", "PSA 1"] }, { "stopId": 14133, @@ -10427,11 +7538,7 @@ }, "latitude": 42.250977575, "longitude": -8.694471881, - "lines": [ - "C3d", - "C3i", - "17" - ] + "lines": ["C3d", "C3i", "17"] }, { "stopId": 14134, @@ -10440,9 +7547,7 @@ }, "latitude": 42.253208793, "longitude": -8.686995591, - "lines": [ - "C3d" - ] + "lines": ["C3d"] }, { "stopId": 14135, @@ -10451,9 +7556,7 @@ }, "latitude": 42.229174145, "longitude": -8.720143055, - "lines": [ - "C1" - ] + "lines": ["C1"] }, { "stopId": 14136, @@ -10462,10 +7565,7 @@ }, "latitude": 42.250484372, "longitude": -8.694878804, - "lines": [ - "C3d", - "17" - ] + "lines": ["C3d", "17"] }, { "stopId": 14137, @@ -10474,9 +7574,7 @@ }, "latitude": 42.200003406, "longitude": -8.753169, - "lines": [ - "29" - ] + "lines": ["29"] }, { "stopId": 14138, @@ -10485,11 +7583,7 @@ }, "latitude": 42.216459201, "longitude": -8.678591709, - "lines": [ - "12B", - "15B", - "15C" - ] + "lines": ["12B", "15B", "15C"] }, { "stopId": 14139, @@ -10498,11 +7592,7 @@ }, "latitude": 42.227492758, "longitude": -8.700413366, - "lines": [ - "6", - "25", - "31" - ] + "lines": ["6", "25", "31"] }, { "stopId": 14140, @@ -10511,15 +7601,7 @@ }, "latitude": 42.228210877, "longitude": -8.699999354, - "lines": [ - "4C", - "6", - "23", - "25", - "31", - "N4", - "PSA 4" - ] + "lines": ["4C", "6", "23", "25", "31", "N4", "PSA 4"] }, { "stopId": 14141, @@ -10528,13 +7610,7 @@ }, "latitude": 42.231379202, "longitude": -8.699876213, - "lines": [ - "11", - "15A", - "15B", - "15C", - "H3" - ] + "lines": ["11", "15A", "15B", "15C", "H3"] }, { "stopId": 14142, @@ -10543,9 +7619,7 @@ }, "latitude": 42.231463434, "longitude": -8.728844425, - "lines": [ - "16" - ] + "lines": ["16"] }, { "stopId": 14143, @@ -10554,9 +7628,7 @@ }, "latitude": 42.229753483, "longitude": -8.729002675, - "lines": [ - "16" - ] + "lines": ["16"] }, { "stopId": 14144, @@ -10565,9 +7637,7 @@ }, "latitude": 42.226760436, "longitude": -8.727385303, - "lines": [ - "16" - ] + "lines": ["16"] }, { "stopId": 14150, @@ -10576,9 +7646,7 @@ }, "latitude": 42.232076561, "longitude": -8.719055236, - "lines": [ - "14" - ] + "lines": ["14"] }, { "stopId": 14152, @@ -10587,9 +7655,7 @@ }, "latitude": 42.204815402, "longitude": -8.687168969, - "lines": [ - "14" - ] + "lines": ["14"] }, { "stopId": 14153, @@ -10598,10 +7664,7 @@ }, "latitude": 42.205357233, "longitude": -8.692495739, - "lines": [ - "6", - "14" - ] + "lines": ["6", "14"] }, { "stopId": 14154, @@ -10610,9 +7673,7 @@ }, "latitude": 42.19360258, "longitude": -8.677258993, - "lines": [ - "14" - ] + "lines": ["14"] }, { "stopId": 14156, @@ -10621,9 +7682,7 @@ }, "latitude": 42.203378431, "longitude": -8.696666863, - "lines": [ - "14" - ] + "lines": ["14"] }, { "stopId": 14157, @@ -10632,9 +7691,7 @@ }, "latitude": 42.202979066, "longitude": -8.694065121, - "lines": [ - "14" - ] + "lines": ["14"] }, { "stopId": 14161, @@ -10643,10 +7700,7 @@ }, "latitude": 42.224130699, "longitude": -8.732568248, - "lines": [ - "5B", - "12A" - ] + "lines": ["5B", "12A"] }, { "stopId": 14162, @@ -10655,11 +7709,7 @@ }, "latitude": 42.211371871, "longitude": -8.746523782, - "lines": [ - "5A", - "11", - "29" - ] + "lines": ["5A", "11", "29"] }, { "stopId": 14163, @@ -10668,11 +7718,7 @@ }, "latitude": 42.211442202, "longitude": -8.746227469, - "lines": [ - "5A", - "11", - "29" - ] + "lines": ["5A", "11", "29"] }, { "stopId": 14164, @@ -10681,13 +7727,7 @@ }, "latitude": 42.225172437, "longitude": -8.744777354, - "lines": [ - "C3d", - "C3i", - "15B", - "15C", - "N1" - ] + "lines": ["C3d", "C3i", "15B", "15C", "N1"] }, { "stopId": 14165, @@ -10696,13 +7736,7 @@ }, "latitude": 42.224905029, "longitude": -8.745285775, - "lines": [ - "C3d", - "13", - "15B", - "15C", - "H" - ] + "lines": ["C3d", "13", "15B", "15C", "H"] }, { "stopId": 14166, @@ -10711,15 +7745,7 @@ }, "latitude": 42.225142981, "longitude": -8.729707944, - "lines": [ - "4A", - "4C", - "7", - "12B", - "17", - "27", - "PSA 4" - ] + "lines": ["4A", "4C", "7", "12B", "17", "27", "PSA 4"] }, { "stopId": 14167, @@ -10728,11 +7754,7 @@ }, "latitude": 42.225279021, "longitude": -8.751908648, - "lines": [ - "6", - "9B", - "28" - ] + "lines": ["6", "9B", "28"] }, { "stopId": 14168, @@ -10741,15 +7763,7 @@ }, "latitude": 42.224928285, "longitude": -8.729631509, - "lines": [ - "4A", - "4C", - "11", - "12B", - "17", - "27", - "N1" - ] + "lines": ["4A", "4C", "11", "12B", "17", "27", "N1"] }, { "stopId": 14169, @@ -10758,18 +7772,7 @@ }, "latitude": 42.22244224, "longitude": -8.731271052, - "lines": [ - "C1", - "4A", - "4C", - "7", - "12B", - "16", - "17", - "27", - "LZH", - "PSA 4" - ] + "lines": ["C1", "4A", "4C", "7", "12B", "16", "17", "27", "LZH", "PSA 4"] }, { "stopId": 14170, @@ -10778,12 +7781,7 @@ }, "latitude": 42.218831744, "longitude": -8.77571001, - "lines": [ - "10", - "15B", - "15C", - "N1" - ] + "lines": ["10", "15B", "15C", "N1"] }, { "stopId": 14171, @@ -10792,11 +7790,7 @@ }, "latitude": 42.218844713, "longitude": -8.775459221, - "lines": [ - "10", - "15B", - "15C" - ] + "lines": ["10", "15B", "15C"] }, { "stopId": 14173, @@ -10805,16 +7799,7 @@ }, "latitude": 42.235900754, "longitude": -8.731391435, - "lines": [ - "C1", - "C3d", - "A", - "5A", - "9B", - "15C", - "N4", - "H1" - ] + "lines": ["C1", "C3d", "A", "5A", "9B", "15C", "N4", "H1"] }, { "stopId": 14174, @@ -10823,10 +7808,7 @@ }, "latitude": 42.211844516, "longitude": -8.749287921, - "lines": [ - "11", - "16" - ] + "lines": ["11", "16"] }, { "stopId": 14175, @@ -10835,9 +7817,7 @@ }, "latitude": 42.211792864, "longitude": -8.749617832, - "lines": [ - "16" - ] + "lines": ["16"] }, { "stopId": 14177, @@ -10846,11 +7826,7 @@ }, "latitude": 42.22985125, "longitude": -8.71972059, - "lines": [ - "12A", - "14", - "27" - ] + "lines": ["12A", "14", "27"] }, { "stopId": 14178, @@ -10859,10 +7835,7 @@ }, "latitude": 42.233009005, "longitude": -8.724497604, - "lines": [ - "12A", - "27" - ] + "lines": ["12A", "27"] }, { "stopId": 14179, @@ -10871,11 +7844,7 @@ }, "latitude": 42.213260612, "longitude": -8.722562576, - "lines": [ - "A", - "18B", - "18H" - ] + "lines": ["A", "18B", "18H"] }, { "stopId": 14180, @@ -10884,13 +7853,7 @@ }, "latitude": 42.224749197, "longitude": -8.707320585, - "lines": [ - "4C", - "23", - "31", - "N4", - "PSA 4" - ] + "lines": ["4C", "23", "31", "N4", "PSA 4"] }, { "stopId": 14181, @@ -10899,9 +7862,7 @@ }, "latitude": 42.210954716, "longitude": -8.727776522, - "lines": [ - "A" - ] + "lines": ["A"] }, { "stopId": 14182, @@ -10910,11 +7871,7 @@ }, "latitude": 42.211618245, "longitude": -8.72147159, - "lines": [ - "A", - "18B", - "18H" - ] + "lines": ["A", "18B", "18H"] }, { "stopId": 14183, @@ -10923,9 +7880,7 @@ }, "latitude": 42.220622235, "longitude": -8.654888024, - "lines": [ - "11" - ] + "lines": ["11"] }, { "stopId": 14184, @@ -10934,9 +7889,7 @@ }, "latitude": 42.217384986, "longitude": -8.657082399, - "lines": [ - "11" - ] + "lines": ["11"] }, { "stopId": 14185, @@ -10945,9 +7898,7 @@ }, "latitude": 42.219667098, "longitude": -8.659470523, - "lines": [ - "11" - ] + "lines": ["11"] }, { "stopId": 14186, @@ -10956,9 +7907,7 @@ }, "latitude": 42.218044517, "longitude": -8.662618478, - "lines": [ - "11" - ] + "lines": ["11"] }, { "stopId": 14187, @@ -10967,9 +7916,7 @@ }, "latitude": 42.221588029, "longitude": -8.662035851, - "lines": [ - "11" - ] + "lines": ["11"] }, { "stopId": 14188, @@ -10978,9 +7925,7 @@ }, "latitude": 42.217595578, "longitude": -8.661414166, - "lines": [ - "11" - ] + "lines": ["11"] }, { "stopId": 14189, @@ -10989,9 +7934,7 @@ }, "latitude": 42.226081487, "longitude": -8.654133203, - "lines": [ - "11" - ] + "lines": ["11"] }, { "stopId": 14190, @@ -11000,9 +7943,7 @@ }, "latitude": 42.225080876, "longitude": -8.683314171, - "lines": [ - "25" - ] + "lines": ["25"] }, { "stopId": 14191, @@ -11011,9 +7952,7 @@ }, "latitude": 42.223737557, "longitude": -8.682141153, - "lines": [ - "25" - ] + "lines": ["25"] }, { "stopId": 14192, @@ -11022,9 +7961,7 @@ }, "latitude": 42.231625599, "longitude": -8.652046516, - "lines": [ - "25" - ] + "lines": ["25"] }, { "stopId": 14193, @@ -11033,9 +7970,7 @@ }, "latitude": 42.230916628, "longitude": -8.641628816, - "lines": [ - "25" - ] + "lines": ["25"] }, { "stopId": 14194, @@ -11044,9 +7979,7 @@ }, "latitude": 42.228639377, "longitude": -8.640978361, - "lines": [ - "25" - ] + "lines": ["25"] }, { "stopId": 14195, @@ -11055,9 +7988,7 @@ }, "latitude": 42.226263256, "longitude": -8.644091084, - "lines": [ - "25" - ] + "lines": ["25"] }, { "stopId": 14196, @@ -11066,9 +7997,7 @@ }, "latitude": 42.225296, "longitude": -8.649527921, - "lines": [ - "25" - ] + "lines": ["25"] }, { "stopId": 14197, @@ -11077,9 +8006,7 @@ }, "latitude": 42.225912491, "longitude": -8.653698801, - "lines": [ - "25" - ] + "lines": ["25"] }, { "stopId": 14198, @@ -11088,10 +8015,7 @@ }, "latitude": 42.227231301, "longitude": -8.659997969, - "lines": [ - "15A", - "25" - ] + "lines": ["15A", "25"] }, { "stopId": 14199, @@ -11100,9 +8024,7 @@ }, "latitude": 42.223755464, "longitude": -8.682041911, - "lines": [ - "25" - ] + "lines": ["25"] }, { "stopId": 14200, @@ -11111,9 +8033,7 @@ }, "latitude": 42.225112655, "longitude": -8.683402684, - "lines": [ - "25" - ] + "lines": ["25"] }, { "stopId": 14201, @@ -11122,9 +8042,7 @@ }, "latitude": 42.226291056, "longitude": -8.641647591, - "lines": [ - "25" - ] + "lines": ["25"] }, { "stopId": 14202, @@ -11133,13 +8051,7 @@ }, "latitude": 42.231273786, "longitude": -8.700145645, - "lines": [ - "11", - "15A", - "15B", - "15C", - "H3" - ] + "lines": ["11", "15A", "15B", "15C", "H3"] }, { "stopId": 14203, @@ -11148,10 +8060,7 @@ }, "latitude": 42.226524401, "longitude": -8.661251786, - "lines": [ - "11", - "15A" - ] + "lines": ["11", "15A"] }, { "stopId": 14204, @@ -11160,11 +8069,7 @@ }, "latitude": 42.22312688, "longitude": -8.681864633, - "lines": [ - "25", - "31", - "H3" - ] + "lines": ["25", "31", "H3"] }, { "stopId": 14205, @@ -11173,9 +8078,7 @@ }, "latitude": 42.178408629, "longitude": -8.733198549, - "lines": [ - "7" - ] + "lines": ["7"] }, { "stopId": 14206, @@ -11184,17 +8087,7 @@ }, "latitude": 42.220514043, "longitude": -8.731700217, - "lines": [ - "C3i", - "7", - "11", - "13", - "15A", - "16", - "23", - "29", - "H2" - ] + "lines": ["C3i", "7", "11", "13", "15A", "16", "23", "29", "H2"] }, { "stopId": 14207, @@ -11203,9 +8096,7 @@ }, "latitude": 42.161212162, "longitude": -8.716377433, - "lines": [ - "7" - ] + "lines": ["7"] }, { "stopId": 14208, @@ -11214,9 +8105,7 @@ }, "latitude": 42.162237207, "longitude": -8.71885531, - "lines": [ - "7" - ] + "lines": ["7"] }, { "stopId": 14209, @@ -11225,9 +8114,7 @@ }, "latitude": 42.173333822, "longitude": -8.705439803, - "lines": [ - "7" - ] + "lines": ["7"] }, { "stopId": 14210, @@ -11236,9 +8123,7 @@ }, "latitude": 42.173077394, "longitude": -8.705659744, - "lines": [ - "7" - ] + "lines": ["7"] }, { "stopId": 14211, @@ -11247,9 +8132,7 @@ }, "latitude": 42.165479162, "longitude": -8.721775005, - "lines": [ - "7" - ] + "lines": ["7"] }, { "stopId": 14212, @@ -11258,9 +8141,7 @@ }, "latitude": 42.164694101, "longitude": -8.724472962, - "lines": [ - "7" - ] + "lines": ["7"] }, { "stopId": 14213, @@ -11269,9 +8150,7 @@ }, "latitude": 42.169153241, "longitude": -8.729001464, - "lines": [ - "7" - ] + "lines": ["7"] }, { "stopId": 14214, @@ -11280,9 +8159,7 @@ }, "latitude": 42.175760907, "longitude": -8.734516924, - "lines": [ - "7" - ] + "lines": ["7"] }, { "stopId": 14215, @@ -11291,9 +8168,7 @@ }, "latitude": 42.175592169, "longitude": -8.734477788, - "lines": [ - "7" - ] + "lines": ["7"] }, { "stopId": 14216, @@ -11302,9 +8177,7 @@ }, "latitude": 42.169143301, "longitude": -8.729076566, - "lines": [ - "7" - ] + "lines": ["7"] }, { "stopId": 14217, @@ -11313,9 +8186,7 @@ }, "latitude": 42.164570839, "longitude": -8.724561475, - "lines": [ - "7" - ] + "lines": ["7"] }, { "stopId": 14218, @@ -11324,9 +8195,7 @@ }, "latitude": 42.165288305, "longitude": -8.721367309, - "lines": [ - "7" - ] + "lines": ["7"] }, { "stopId": 14219, @@ -11335,9 +8204,7 @@ }, "latitude": 42.159500512, "longitude": -8.718247279, - "lines": [ - "7" - ] + "lines": ["7"] }, { "stopId": 14220, @@ -11346,9 +8213,7 @@ }, "latitude": 42.225657321, "longitude": -8.681467666, - "lines": [ - "25" - ] + "lines": ["25"] }, { "stopId": 14221, @@ -11357,9 +8222,7 @@ }, "latitude": 42.225809218, "longitude": -8.681652991, - "lines": [ - "25" - ] + "lines": ["25"] }, { "stopId": 14222, @@ -11368,9 +8231,7 @@ }, "latitude": 42.162959525, "longitude": -8.716541365, - "lines": [ - "7" - ] + "lines": ["7"] }, { "stopId": 14223, @@ -11484,9 +8345,7 @@ }, "latitude": 42.221696342, "longitude": -8.632840997, - "lines": [ - "A" - ] + "lines": ["A"] }, { "stopId": 14231, @@ -11495,9 +8354,7 @@ }, "latitude": 42.235542066, "longitude": -8.652196565, - "lines": [ - "9B" - ] + "lines": ["9B"] }, { "stopId": 14232, @@ -11506,10 +8363,7 @@ }, "latitude": 42.235317662, "longitude": -8.652094641, - "lines": [ - "9B", - "27" - ] + "lines": ["9B", "27"] }, { "stopId": 14233, @@ -11518,10 +8372,7 @@ }, "latitude": 42.241037275, "longitude": -8.668947597, - "lines": [ - "9B", - "28" - ] + "lines": ["9B", "28"] }, { "stopId": 14236, @@ -11530,9 +8381,7 @@ }, "latitude": 42.196308523, "longitude": -8.723526935, - "lines": [ - "12B" - ] + "lines": ["12B"] }, { "stopId": 14237, @@ -11541,9 +8390,7 @@ }, "latitude": 42.196119748, "longitude": -8.723457198, - "lines": [ - "12B" - ] + "lines": ["12B"] }, { "stopId": 14238, @@ -11552,9 +8399,7 @@ }, "latitude": 42.20458802, "longitude": -8.714617309, - "lines": [ - "18B" - ] + "lines": ["18B"] }, { "stopId": 14240, @@ -11563,9 +8408,7 @@ }, "latitude": 42.197985091, "longitude": -8.714523201, - "lines": [ - "18B" - ] + "lines": ["18B"] }, { "stopId": 14241, @@ -11574,9 +8417,7 @@ }, "latitude": 42.197842023, "longitude": -8.71471632, - "lines": [ - "18B" - ] + "lines": ["18B"] }, { "stopId": 14242, @@ -11585,9 +8426,7 @@ }, "latitude": 42.196378259, "longitude": -8.716979043, - "lines": [ - "18B" - ] + "lines": ["18B"] }, { "stopId": 14243, @@ -11596,9 +8435,7 @@ }, "latitude": 42.196539214, "longitude": -8.716874437, - "lines": [ - "18B" - ] + "lines": ["18B"] }, { "stopId": 14244, @@ -11607,11 +8444,7 @@ }, "latitude": 42.198216234, "longitude": -8.721498041, - "lines": [ - "18B", - "18H", - "27" - ] + "lines": ["18B", "18H", "27"] }, { "stopId": 14245, @@ -11620,15 +8453,7 @@ }, "latitude": 42.23691728, "longitude": -8.716743143, - "lines": [ - "C3d", - "C3i", - "5B", - "10", - "16", - "17", - "N1" - ] + "lines": ["C3d", "C3i", "5B", "10", "16", "17", "N1"] }, { "stopId": 14247, @@ -11637,9 +8462,7 @@ }, "latitude": 42.200511179, "longitude": -8.769110573, - "lines": [ - "12A" - ] + "lines": ["12A"] }, { "stopId": 14248, @@ -11648,9 +8471,7 @@ }, "latitude": 42.200580723, "longitude": -8.76911862, - "lines": [ - "12A" - ] + "lines": ["12A"] }, { "stopId": 14249, @@ -11659,9 +8480,7 @@ }, "latitude": 42.177662554, "longitude": -8.800157923, - "lines": [ - "12A" - ] + "lines": ["12A"] }, { "stopId": 14250, @@ -11670,10 +8489,7 @@ }, "latitude": 42.234914814, "longitude": -8.658983411, - "lines": [ - "A", - "9B" - ] + "lines": ["A", "9B"] }, { "stopId": 14251, @@ -11682,11 +8498,7 @@ }, "latitude": 42.234817602, "longitude": -8.65882027, - "lines": [ - "A", - "9B", - "27" - ] + "lines": ["A", "9B", "27"] }, { "stopId": 14252, @@ -11695,9 +8507,7 @@ }, "latitude": 42.165934208, "longitude": -8.707243001, - "lines": [ - "U1" - ] + "lines": ["U1"] }, { "stopId": 14253, @@ -11706,9 +8516,7 @@ }, "latitude": 42.164455564, "longitude": -8.707223843, - "lines": [ - "U1" - ] + "lines": ["U1"] }, { "stopId": 14255, @@ -11717,9 +8525,7 @@ }, "latitude": 42.225111918, "longitude": -8.726733526, - "lines": [ - "16" - ] + "lines": ["16"] }, { "stopId": 14256, @@ -11728,9 +8534,7 @@ }, "latitude": 42.222198901, "longitude": -8.728317834, - "lines": [ - "16" - ] + "lines": ["16"] }, { "stopId": 14257, @@ -11739,9 +8543,7 @@ }, "latitude": 42.223448271, "longitude": -8.725547112, - "lines": [ - "16" - ] + "lines": ["16"] }, { "stopId": 14258, @@ -11750,9 +8552,7 @@ }, "latitude": 42.224870416, "longitude": -8.723632015, - "lines": [ - "16" - ] + "lines": ["16"] }, { "stopId": 14259, @@ -11761,9 +8561,7 @@ }, "latitude": 42.227088982, "longitude": -8.721545256, - "lines": [ - "16" - ] + "lines": ["16"] }, { "stopId": 14260, @@ -11772,16 +8570,7 @@ }, "latitude": 42.228741057, "longitude": -8.71961914, - "lines": [ - "7", - "14", - "15A", - "16", - "18A", - "18B", - "18H", - "H2" - ] + "lines": ["7", "14", "15A", "16", "18A", "18B", "18H", "H2"] }, { "stopId": 14261, @@ -11790,9 +8579,7 @@ }, "latitude": 42.228644118, "longitude": -8.720692314, - "lines": [ - "16" - ] + "lines": ["16"] }, { "stopId": 14264, @@ -11831,12 +8618,7 @@ }, "latitude": 42.221892792, "longitude": -8.758191526, - "lines": [ - "10", - "15B", - "15C", - "N1" - ] + "lines": ["10", "15B", "15C", "N1"] }, { "stopId": 14268, @@ -11845,11 +8627,7 @@ }, "latitude": 42.221731945, "longitude": -8.758417175, - "lines": [ - "10", - "15B", - "15C" - ] + "lines": ["10", "15B", "15C"] }, { "stopId": 14270, @@ -11858,9 +8636,7 @@ }, "latitude": 42.196619218, "longitude": -8.743240048, - "lines": [ - "17" - ] + "lines": ["17"] }, { "stopId": 14271, @@ -11869,9 +8645,7 @@ }, "latitude": 42.196050474, "longitude": -8.745105715, - "lines": [ - "17" - ] + "lines": ["17"] }, { "stopId": 14273, @@ -11880,9 +8654,7 @@ }, "latitude": 42.219274062, "longitude": -8.656419893, - "lines": [ - "11" - ] + "lines": ["11"] }, { "stopId": 14277, @@ -11891,9 +8663,7 @@ }, "latitude": 42.251776399, "longitude": -8.69414009, - "lines": [ - "17" - ] + "lines": ["17"] }, { "stopId": 14278, @@ -11902,9 +8672,7 @@ }, "latitude": 42.25430173, "longitude": -8.692915616, - "lines": [ - "17" - ] + "lines": ["17"] }, { "stopId": 14279, @@ -11913,9 +8681,7 @@ }, "latitude": 42.257069093, "longitude": -8.690786611, - "lines": [ - "17" - ] + "lines": ["17"] }, { "stopId": 14280, @@ -11924,9 +8690,7 @@ }, "latitude": 42.254604716, "longitude": -8.692539681, - "lines": [ - "17" - ] + "lines": ["17"] }, { "stopId": 14281, @@ -11935,9 +8699,7 @@ }, "latitude": 42.251596707, "longitude": -8.69420171, - "lines": [ - "17" - ] + "lines": ["17"] }, { "stopId": 14287, @@ -11946,9 +8708,7 @@ }, "latitude": 42.25020334, "longitude": -8.701924083, - "lines": [ - "17" - ] + "lines": ["17"] }, { "stopId": 14288, @@ -11957,9 +8717,7 @@ }, "latitude": 42.249218849, "longitude": -8.704807605, - "lines": [ - "17" - ] + "lines": ["17"] }, { "stopId": 14289, @@ -11968,9 +8726,7 @@ }, "latitude": 42.246484972, "longitude": -8.705864005, - "lines": [ - "17" - ] + "lines": ["17"] }, { "stopId": 14290, @@ -11979,9 +8735,7 @@ }, "latitude": 42.244107542, "longitude": -8.706343638, - "lines": [ - "17" - ] + "lines": ["17"] }, { "stopId": 14291, @@ -11990,12 +8744,7 @@ }, "latitude": 42.209935219, "longitude": -8.671464542, - "lines": [ - "12B", - "15B", - "15C", - "U2" - ] + "lines": ["12B", "15B", "15C", "U2"] }, { "stopId": 14294, @@ -12004,9 +8753,7 @@ }, "latitude": 42.190684424876565, "longitude": -8.799308812770041, - "lines": [ - "12A" - ] + "lines": ["12A"] }, { "stopId": 14295, @@ -12015,10 +8762,7 @@ }, "latitude": 42.230436358, "longitude": -8.731437473, - "lines": [ - "5B", - "12A" - ] + "lines": ["5B", "12A"] }, { "stopId": 14296, @@ -12027,9 +8771,7 @@ }, "latitude": 42.248375604, "longitude": -8.675578666, - "lines": [ - "28" - ] + "lines": ["28"] }, { "stopId": 14299, @@ -12038,13 +8780,7 @@ }, "latitude": 42.213644883, "longitude": -8.774567214, - "lines": [ - "C3i", - "15A", - "23", - "N1", - "N4" - ] + "lines": ["C3i", "15A", "23", "N1", "N4"] }, { "stopId": 14300, @@ -12053,11 +8789,7 @@ }, "latitude": 42.217907548, "longitude": -8.73707436, - "lines": [ - "5A", - "11", - "29" - ] + "lines": ["5A", "11", "29"] }, { "stopId": 14301, @@ -12066,11 +8798,7 @@ }, "latitude": 42.218257459, "longitude": -8.736328798, - "lines": [ - "5A", - "11", - "29" - ] + "lines": ["5A", "11", "29"] }, { "stopId": 14302, @@ -12079,12 +8807,7 @@ }, "latitude": 42.214542094, "longitude": -8.696431619, - "lines": [ - "12A", - "12B", - "13", - "H3" - ] + "lines": ["12A", "12B", "13", "H3"] }, { "stopId": 14304, @@ -12093,12 +8816,7 @@ }, "latitude": 42.221313975, "longitude": -8.681944471, - "lines": [ - "12A", - "12B", - "13", - "31" - ] + "lines": ["12A", "12B", "13", "31"] }, { "stopId": 14307, @@ -12107,9 +8825,7 @@ }, "latitude": 42.224464416, "longitude": -8.727967343, - "lines": [ - "16" - ] + "lines": ["16"] }, { "stopId": 14308, @@ -12118,9 +8834,7 @@ }, "latitude": 42.16328558, "longitude": -8.716707662, - "lines": [ - "7" - ] + "lines": ["7"] }, { "stopId": 14309, @@ -12129,9 +8843,7 @@ }, "latitude": 42.161067029, "longitude": -8.716468628, - "lines": [ - "7" - ] + "lines": ["7"] }, { "stopId": 14310, @@ -12140,9 +8852,7 @@ }, "latitude": 42.159564137, "longitude": -8.718295559, - "lines": [ - "7" - ] + "lines": ["7"] }, { "stopId": 14311, @@ -12151,9 +8861,7 @@ }, "latitude": 42.162720337, "longitude": -8.718900908, - "lines": [ - "7" - ] + "lines": ["7"] }, { "stopId": 14314, @@ -12162,9 +8870,7 @@ }, "latitude": 42.227212568, "longitude": -8.720183032, - "lines": [ - "18A" - ] + "lines": ["18A"] }, { "stopId": 14315, @@ -12173,9 +8879,7 @@ }, "latitude": 42.22393338, "longitude": -8.716924148, - "lines": [ - "18A" - ] + "lines": ["18A"] }, { "stopId": 14317, @@ -12184,9 +8888,7 @@ }, "latitude": 42.222723933, "longitude": -8.719150283, - "lines": [ - "18A" - ] + "lines": ["18A"] }, { "stopId": 14318, @@ -12195,9 +8897,7 @@ }, "latitude": 42.222591256, "longitude": -8.717753486, - "lines": [ - "18A" - ] + "lines": ["18A"] }, { "stopId": 14319, @@ -12206,9 +8906,7 @@ }, "latitude": 42.221002214, "longitude": -8.72027208, - "lines": [ - "18A" - ] + "lines": ["18A"] }, { "stopId": 14320, @@ -12217,9 +8915,7 @@ }, "latitude": 42.220799025, "longitude": -8.723345356, - "lines": [ - "18A" - ] + "lines": ["18A"] }, { "stopId": 14321, @@ -12228,9 +8924,7 @@ }, "latitude": 42.218131641, "longitude": -8.723120057, - "lines": [ - "18A" - ] + "lines": ["18A"] }, { "stopId": 14322, @@ -12239,9 +8933,7 @@ }, "latitude": 42.217813814, "longitude": -8.721352482, - "lines": [ - "18A" - ] + "lines": ["18A"] }, { "stopId": 14323, @@ -12250,9 +8942,7 @@ }, "latitude": 42.217059742, "longitude": -8.720340235, - "lines": [ - "18A" - ] + "lines": ["18A"] }, { "stopId": 14324, @@ -12261,9 +8951,7 @@ }, "latitude": 42.217256401, "longitude": -8.720101519, - "lines": [ - "18A" - ] + "lines": ["18A"] }, { "stopId": 14325, @@ -12272,9 +8960,7 @@ }, "latitude": 42.217848286, "longitude": -8.7214811, - "lines": [ - "18A" - ] + "lines": ["18A"] }, { "stopId": 14326, @@ -12283,9 +8969,7 @@ }, "latitude": 42.218038279, "longitude": -8.722489738, - "lines": [ - "18A" - ] + "lines": ["18A"] }, { "stopId": 14328, @@ -12294,11 +8978,7 @@ }, "latitude": 42.208988415, "longitude": -8.746151897, - "lines": [ - "LZH", - "PSA 1", - "PSA 4" - ] + "lines": ["LZH", "PSA 1", "PSA 4"] }, { "stopId": 14329, @@ -12307,11 +8987,7 @@ }, "latitude": 42.210124372, "longitude": -8.741139991, - "lines": [ - "LZH", - "PSA 1", - "PSA 4" - ] + "lines": ["LZH", "PSA 1", "PSA 4"] }, { "stopId": 14330, @@ -12320,9 +8996,7 @@ }, "latitude": 42.198072667, "longitude": -8.682624653, - "lines": [ - "14" - ] + "lines": ["14"] }, { "stopId": 14331, @@ -12352,18 +9026,7 @@ }, "latitude": 42.240189011, "longitude": -8.726765331, - "lines": [ - "C1", - "C3d", - "A", - "5A", - "9B", - "10", - "15B", - "15C", - "28", - "N4" - ] + "lines": ["C1", "C3d", "A", "5A", "9B", "10", "15B", "15C", "28", "N4"] }, { "stopId": 14335, @@ -12372,9 +9035,7 @@ }, "latitude": 42.212692269, "longitude": -8.675661599, - "lines": [ - "31" - ] + "lines": ["31"] }, { "stopId": 14336, @@ -12383,10 +9044,7 @@ }, "latitude": 42.21447626, "longitude": -8.75600551, - "lines": [ - "13", - "15A" - ] + "lines": ["13", "15A"] }, { "stopId": 14337, @@ -12395,17 +9053,7 @@ }, "latitude": 42.213080218, "longitude": -8.754660224, - "lines": [ - "5A", - "5B", - "13", - "15A", - "15B", - "N4", - "H", - "PSA 1", - "PSA 4" - ] + "lines": ["5A", "5B", "13", "15A", "15B", "N4", "H", "PSA 1", "PSA 4"] }, { "stopId": 14345, @@ -12414,9 +9062,7 @@ }, "latitude": 42.237269816, "longitude": -8.685138009, - "lines": [ - "28" - ] + "lines": ["28"] }, { "stopId": 14346, @@ -12425,9 +9071,7 @@ }, "latitude": 42.237287688, "longitude": -8.685019992, - "lines": [ - "28" - ] + "lines": ["28"] }, { "stopId": 14347, @@ -12436,9 +9080,7 @@ }, "latitude": 42.23913765, "longitude": -8.683873934, - "lines": [ - "28" - ] + "lines": ["28"] }, { "stopId": 14348, @@ -12447,9 +9089,7 @@ }, "latitude": 42.238950988, "longitude": -8.683793467, - "lines": [ - "28" - ] + "lines": ["28"] }, { "stopId": 14349, @@ -12458,9 +9098,7 @@ }, "latitude": 42.244717312, "longitude": -8.678473607, - "lines": [ - "28" - ] + "lines": ["28"] }, { "stopId": 14350, @@ -12469,9 +9107,7 @@ }, "latitude": 42.244849353, "longitude": -8.678366319, - "lines": [ - "28" - ] + "lines": ["28"] }, { "stopId": 14353, @@ -12480,9 +9116,7 @@ }, "latitude": 42.248151648, "longitude": -8.675976097, - "lines": [ - "28" - ] + "lines": ["28"] }, { "stopId": 14354, @@ -12491,14 +9125,7 @@ }, "latitude": 42.225911433, "longitude": -8.675526243, - "lines": [ - "11", - "15A", - "15B", - "15C", - "31", - "H3" - ] + "lines": ["11", "15A", "15B", "15C", "31", "H3"] }, { "stopId": 14355, @@ -12507,14 +9134,7 @@ }, "latitude": 42.226638363, "longitude": -8.676135104, - "lines": [ - "11", - "15A", - "15B", - "15C", - "31", - "H3" - ] + "lines": ["11", "15A", "15B", "15C", "31", "H3"] }, { "stopId": 14356, @@ -12523,9 +9143,7 @@ }, "latitude": 42.192009114, "longitude": -8.783993123, - "lines": [ - "12A" - ] + "lines": ["12A"] }, { "stopId": 14357, @@ -12534,9 +9152,7 @@ }, "latitude": 42.191796473, "longitude": -8.784014088, - "lines": [ - "12A" - ] + "lines": ["12A"] }, { "stopId": 14358, @@ -12545,12 +9161,7 @@ }, "latitude": 42.209054557, "longitude": -8.75715865, - "lines": [ - "5A", - "5B", - "13", - "N4" - ] + "lines": ["5A", "5B", "13", "N4"] }, { "stopId": 14359, @@ -12559,12 +9170,7 @@ }, "latitude": 42.212235738, "longitude": -8.755011746, - "lines": [ - "5A", - "5B", - "13", - "N4" - ] + "lines": ["5A", "5B", "13", "N4"] }, { "stopId": 14360, @@ -12573,15 +9179,7 @@ }, "latitude": 42.208965857, "longitude": -8.757020567, - "lines": [ - "5A", - "5B", - "13", - "N4", - "H", - "PSA 1", - "PSA 4" - ] + "lines": ["5A", "5B", "13", "N4", "H", "PSA 1", "PSA 4"] }, { "stopId": 14361, @@ -12590,16 +9188,7 @@ }, "latitude": 42.209770472, "longitude": -8.755295907, - "lines": [ - "5A", - "5B", - "13", - "15A", - "N4", - "H", - "PSA 1", - "PSA 4" - ] + "lines": ["5A", "5B", "13", "15A", "N4", "H", "PSA 1", "PSA 4"] }, { "stopId": 14362, @@ -12608,12 +9197,7 @@ }, "latitude": 42.202937872, "longitude": -8.776830486, - "lines": [ - "C3d", - "4A", - "4C", - "10" - ] + "lines": ["C3d", "4A", "4C", "10"] }, { "stopId": 14364, @@ -12622,9 +9206,7 @@ }, "latitude": 42.175757186, "longitude": -8.671074371, - "lines": [ - "15C" - ] + "lines": ["15C"] }, { "stopId": 14365, @@ -12633,9 +9215,7 @@ }, "latitude": 42.181650197, "longitude": -8.667515723, - "lines": [ - "15C" - ] + "lines": ["15C"] }, { "stopId": 14372, @@ -12644,9 +9224,7 @@ }, "latitude": 42.221887526, "longitude": -8.720011371, - "lines": [ - "18A" - ] + "lines": ["18A"] }, { "stopId": 14376, @@ -12655,9 +9233,7 @@ }, "latitude": 42.226612651, "longitude": -8.699658408, - "lines": [ - "25" - ] + "lines": ["25"] }, { "stopId": 14377, @@ -12666,9 +9242,7 @@ }, "latitude": 42.226582661, "longitude": -8.700385762, - "lines": [ - "25" - ] + "lines": ["25"] }, { "stopId": 14378, @@ -12677,9 +9251,7 @@ }, "latitude": 42.22396201, "longitude": -8.653340726, - "lines": [ - "25" - ] + "lines": ["25"] }, { "stopId": 14381, @@ -12688,9 +9260,7 @@ }, "latitude": 42.195647685, "longitude": -8.728974153, - "lines": [ - "17" - ] + "lines": ["17"] }, { "stopId": 14383, @@ -12699,9 +9269,7 @@ }, "latitude": 42.174718265, "longitude": -8.713684656, - "lines": [ - "U1" - ] + "lines": ["U1"] }, { "stopId": 14384, @@ -12710,9 +9278,7 @@ }, "latitude": 42.175073486, "longitude": -8.713494654, - "lines": [ - "U1" - ] + "lines": ["U1"] }, { "stopId": 14385, @@ -12721,10 +9287,7 @@ }, "latitude": 42.240712912, "longitude": -8.6919418, - "lines": [ - "4A", - "24" - ] + "lines": ["4A", "24"] }, { "stopId": 14386, @@ -12733,10 +9296,7 @@ }, "latitude": 42.238020208, "longitude": -8.691543884, - "lines": [ - "4A", - "24" - ] + "lines": ["4A", "24"] }, { "stopId": 14387, @@ -12745,10 +9305,7 @@ }, "latitude": 42.237167043, "longitude": -8.693243792, - "lines": [ - "4A", - "24" - ] + "lines": ["4A", "24"] }, { "stopId": 14388, @@ -12757,16 +9314,7 @@ }, "latitude": 42.211610124, "longitude": -8.754550253, - "lines": [ - "5A", - "5B", - "13", - "15A", - "N4", - "H", - "PSA 1", - "PSA 4" - ] + "lines": ["5A", "5B", "13", "15A", "N4", "H", "PSA 1", "PSA 4"] }, { "stopId": 14389, @@ -12775,12 +9323,7 @@ }, "latitude": 42.210212603, "longitude": -8.755079989, - "lines": [ - "5A", - "5B", - "13", - "N4" - ] + "lines": ["5A", "5B", "13", "N4"] }, { "stopId": 14390, @@ -12789,10 +9332,7 @@ }, "latitude": 42.241570883, "longitude": -8.655380719, - "lines": [ - "9B", - "28" - ] + "lines": ["9B", "28"] }, { "stopId": 14391, @@ -12801,10 +9341,7 @@ }, "latitude": 42.241652296, "longitude": -8.655302935, - "lines": [ - "9B", - "27" - ] + "lines": ["9B", "27"] }, { "stopId": 14392, @@ -12813,9 +9350,7 @@ }, "latitude": 42.209458591, "longitude": -8.760561083, - "lines": [ - "5A" - ] + "lines": ["5A"] }, { "stopId": 14393, @@ -12824,10 +9359,7 @@ }, "latitude": 42.209568936, "longitude": -8.760777001, - "lines": [ - "5A", - "N4" - ] + "lines": ["5A", "N4"] }, { "stopId": 14395, @@ -12836,11 +9368,7 @@ }, "latitude": 42.215601037, "longitude": -8.675477665, - "lines": [ - "12B", - "15B", - "15C" - ] + "lines": ["12B", "15B", "15C"] }, { "stopId": 14396, @@ -12849,16 +9377,7 @@ }, "latitude": 42.239965365, "longitude": -8.708024282, - "lines": [ - "C3d", - "5B", - "10", - "17", - "31", - "H2", - "H3", - "PSA 1" - ] + "lines": ["C3d", "5B", "10", "17", "31", "H2", "H3", "PSA 1"] }, { "stopId": 14397, @@ -12867,15 +9386,7 @@ }, "latitude": 42.23973713, "longitude": -8.708397682, - "lines": [ - "C3d", - "C3i", - "5B", - "10", - "17", - "N1", - "H3" - ] + "lines": ["C3d", "C3i", "5B", "10", "17", "N1", "H3"] }, { "stopId": 14398, @@ -12884,15 +9395,7 @@ }, "latitude": 42.22406594, "longitude": -8.723691036, - "lines": [ - "C3d", - "13", - "15A", - "23", - "29", - "H2", - "PSA 1" - ] + "lines": ["C3d", "13", "15A", "23", "29", "H2", "PSA 1"] }, { "stopId": 14401, @@ -12901,10 +9404,7 @@ }, "latitude": 42.21072167, "longitude": -8.76212542, - "lines": [ - "4A", - "12A" - ] + "lines": ["4A", "12A"] }, { "stopId": 14402, @@ -12913,10 +9413,7 @@ }, "latitude": 42.210791203, "longitude": -8.761940347, - "lines": [ - "4A", - "12A" - ] + "lines": ["4A", "12A"] }, { "stopId": 14403, @@ -12925,9 +9422,7 @@ }, "latitude": 42.25049654, "longitude": -8.698390035, - "lines": [ - "17" - ] + "lines": ["17"] }, { "stopId": 14404, @@ -12936,9 +9431,7 @@ }, "latitude": 42.251785642, "longitude": -8.696871994, - "lines": [ - "17" - ] + "lines": ["17"] }, { "stopId": 14406, @@ -12947,9 +9440,7 @@ }, "latitude": 42.249462772, "longitude": -8.699772952, - "lines": [ - "17" - ] + "lines": ["17"] }, { "stopId": 14408, @@ -12958,9 +9449,7 @@ }, "latitude": 42.248885006, "longitude": -8.698128758, - "lines": [ - "17" - ] + "lines": ["17"] }, { "stopId": 14409, @@ -12969,10 +9458,7 @@ }, "latitude": 42.204188441, "longitude": -8.670257126, - "lines": [ - "15B", - "15C" - ] + "lines": ["15B", "15C"] }, { "stopId": 14410, @@ -12981,9 +9467,7 @@ }, "latitude": 42.204639457, "longitude": -8.670329545, - "lines": [ - "15C" - ] + "lines": ["15C"] }, { "stopId": 14411, @@ -12992,9 +9476,7 @@ }, "latitude": 42.205174543, "longitude": -8.698209134, - "lines": [ - "14" - ] + "lines": ["14"] }, { "stopId": 14412, @@ -13003,9 +9485,7 @@ }, "latitude": 42.20497586, "longitude": -8.697957006, - "lines": [ - "14" - ] + "lines": ["14"] }, { "stopId": 14413, @@ -13014,9 +9494,7 @@ }, "latitude": 42.173955568, "longitude": -8.703050076, - "lines": [ - "7" - ] + "lines": ["7"] }, { "stopId": 14414, @@ -13025,9 +9503,7 @@ }, "latitude": 42.221587211, "longitude": -8.665078444, - "lines": [ - "11" - ] + "lines": ["11"] }, { "stopId": 14415, @@ -13036,9 +9512,7 @@ }, "latitude": 42.221557416, "longitude": -8.665381534, - "lines": [ - "11" - ] + "lines": ["11"] }, { "stopId": 14416, @@ -13047,9 +9521,7 @@ }, "latitude": 42.225468623, "longitude": -8.691491081, - "lines": [ - "25" - ] + "lines": ["25"] }, { "stopId": 14419, @@ -13058,9 +9530,7 @@ }, "latitude": 42.201138734, "longitude": -8.688585073, - "lines": [ - "6" - ] + "lines": ["6"] }, { "stopId": 14420, @@ -13069,9 +9539,7 @@ }, "latitude": 42.201419233, "longitude": -8.688526069, - "lines": [ - "6" - ] + "lines": ["6"] }, { "stopId": 14421, @@ -13080,9 +9548,7 @@ }, "latitude": 42.186683264, "longitude": -8.669320703, - "lines": [ - "15C" - ] + "lines": ["15C"] }, { "stopId": 14422, @@ -13091,9 +9557,7 @@ }, "latitude": 42.18695315, "longitude": -8.669514066, - "lines": [ - "15C" - ] + "lines": ["15C"] }, { "stopId": 14425, @@ -13102,9 +9566,7 @@ }, "latitude": 42.232253792, "longitude": -8.707208575, - "lines": [ - "31" - ] + "lines": ["31"] }, { "stopId": 14475, @@ -13113,9 +9575,7 @@ }, "latitude": 42.222992354, "longitude": -8.728300382, - "lines": [ - "C1" - ] + "lines": ["C1"] }, { "stopId": 14890, @@ -13124,14 +9584,7 @@ }, "latitude": 42.207545331, "longitude": -8.758718406, - "lines": [ - "5B", - "13", - "N4", - "H", - "PSA 1", - "PSA 4" - ] + "lines": ["5B", "13", "N4", "H", "PSA 1", "PSA 4"] }, { "stopId": 14892, @@ -13140,15 +9593,7 @@ }, "latitude": 42.224929414, "longitude": -8.735414067, - "lines": [ - "C1", - "C3d", - "A", - "9B", - "15C", - "N4", - "H1" - ] + "lines": ["C1", "C3d", "A", "9B", "15C", "N4", "H1"] }, { "stopId": 14893, @@ -13157,10 +9602,7 @@ }, "latitude": 42.243157956, "longitude": -8.666962176, - "lines": [ - "9B", - "27" - ] + "lines": ["9B", "27"] }, { "stopId": 14894, @@ -13169,12 +9611,7 @@ }, "latitude": 42.211736934, "longitude": -8.733337505, - "lines": [ - "7", - "12B", - "17", - "H1" - ] + "lines": ["7", "12B", "17", "H1"] }, { "stopId": 14895, @@ -13183,9 +9620,7 @@ }, "latitude": 42.241392275, "longitude": -8.681203235, - "lines": [ - "28" - ] + "lines": ["28"] }, { "stopId": 14896, @@ -13194,9 +9629,7 @@ }, "latitude": 42.241385532, "longitude": -8.681400937, - "lines": [ - "28" - ] + "lines": ["28"] }, { "stopId": 14897, @@ -13205,9 +9638,7 @@ }, "latitude": 42.213239161, "longitude": -8.67854147, - "lines": [ - "31" - ] + "lines": ["31"] }, { "stopId": 14898, @@ -13216,9 +9647,7 @@ }, "latitude": 42.213239161, "longitude": -8.678369808, - "lines": [ - "31" - ] + "lines": ["31"] }, { "stopId": 14899, @@ -13227,11 +9656,7 @@ }, "latitude": 42.225485719, "longitude": -8.730501434, - "lines": [ - "5A", - "5B", - "12A" - ] + "lines": ["5A", "5B", "12A"] }, { "stopId": 14900, @@ -13240,10 +9665,7 @@ }, "latitude": 42.217196117, "longitude": -8.743726669, - "lines": [ - "23", - "N4" - ] + "lines": ["23", "N4"] }, { "stopId": 14901, @@ -13252,12 +9674,7 @@ }, "latitude": 42.220211003, "longitude": -8.734183023, - "lines": [ - "C3i", - "10", - "11", - "15A" - ] + "lines": ["C3i", "10", "11", "15A"] }, { "stopId": 14903, @@ -13266,10 +9683,7 @@ }, "latitude": 42.23174719, "longitude": -8.731081308, - "lines": [ - "5B", - "12A" - ] + "lines": ["5B", "12A"] }, { "stopId": 14905, @@ -13278,9 +9692,7 @@ }, "latitude": 42.249981353, "longitude": -8.667186504, - "lines": [ - "9B" - ] + "lines": ["9B"] }, { "stopId": 14906, @@ -13289,10 +9701,7 @@ }, "latitude": 42.232479787, "longitude": -8.654890792, - "lines": [ - "9B", - "27" - ] + "lines": ["9B", "27"] }, { "stopId": 14907, @@ -13301,10 +9710,7 @@ }, "latitude": 42.233655479, "longitude": -8.653300242, - "lines": [ - "9B", - "27" - ] + "lines": ["9B", "27"] }, { "stopId": 14908, @@ -13313,9 +9719,7 @@ }, "latitude": 42.233829075, "longitude": -8.653458259, - "lines": [ - "9B" - ] + "lines": ["9B"] }, { "stopId": 14909, @@ -13324,9 +9728,7 @@ }, "latitude": 42.232663198, "longitude": -8.655097059, - "lines": [ - "9B" - ] + "lines": ["9B"] }, { "stopId": 14910, @@ -13335,11 +9737,7 @@ }, "latitude": 42.21025095, "longitude": -8.704036986, - "lines": [ - "18A", - "18B", - "H3" - ] + "lines": ["18A", "18B", "H3"] }, { "stopId": 14911, @@ -13348,11 +9746,7 @@ }, "latitude": 42.208830737, "longitude": -8.706971174, - "lines": [ - "18A", - "18B", - "H3" - ] + "lines": ["18A", "18B", "H3"] }, { "stopId": 15001, @@ -13361,9 +9755,7 @@ }, "latitude": 42.176053629, "longitude": -8.709460132, - "lines": [ - "PTL" - ] + "lines": ["PTL"] }, { "stopId": 15002, @@ -13372,9 +9764,7 @@ }, "latitude": 42.177194637, "longitude": -8.707850807, - "lines": [ - "PTL" - ] + "lines": ["PTL"] }, { "stopId": 15003, @@ -13383,9 +9773,7 @@ }, "latitude": 42.178124939, "longitude": -8.706606262, - "lines": [ - "PTL" - ] + "lines": ["PTL"] }, { "stopId": 15004, @@ -13394,9 +9782,7 @@ }, "latitude": 42.176503017, "longitude": -8.710007303, - "lines": [ - "PTL" - ] + "lines": ["PTL"] }, { "stopId": 20009, @@ -13405,9 +9791,7 @@ }, "latitude": 42.154843231, "longitude": -8.67357438, - "lines": [ - "7" - ] + "lines": ["7"] }, { "stopId": 20010, @@ -13416,11 +9800,7 @@ }, "latitude": 42.212824845, "longitude": -8.737161077, - "lines": [ - "16", - "23", - "H" - ] + "lines": ["16", "23", "H"] }, { "stopId": 20011, @@ -13429,11 +9809,7 @@ }, "latitude": 42.213089061, "longitude": -8.733392573, - "lines": [ - "16", - "23", - "H" - ] + "lines": ["16", "23", "H"] }, { "stopId": 20012, @@ -13442,13 +9818,7 @@ }, "latitude": 42.215888032, "longitude": -8.732331627, - "lines": [ - "A", - "16", - "23", - "27", - "H2" - ] + "lines": ["A", "16", "23", "27", "H2"] }, { "stopId": 20013, @@ -13457,14 +9827,7 @@ }, "latitude": 42.215905917, "longitude": -8.732471102, - "lines": [ - "7", - "12B", - "17", - "27", - "H2", - "PTL" - ] + "lines": ["7", "12B", "17", "27", "H2", "PTL"] }, { "stopId": 20018, @@ -13473,9 +9836,7 @@ }, "latitude": 42.151451604, "longitude": -8.673803367, - "lines": [ - "7" - ] + "lines": ["7"] }, { "stopId": 20019, @@ -13484,9 +9845,7 @@ }, "latitude": 42.149222193, "longitude": -8.679363987, - "lines": [ - "7" - ] + "lines": ["7"] }, { "stopId": 20020, @@ -13495,9 +9854,7 @@ }, "latitude": 42.151606055, "longitude": -8.679299082, - "lines": [ - "7" - ] + "lines": ["7"] }, { "stopId": 20021, @@ -13506,9 +9863,7 @@ }, "latitude": 42.152770176, "longitude": -8.686251828, - "lines": [ - "7" - ] + "lines": ["7"] }, { "stopId": 20022, @@ -13517,9 +9872,7 @@ }, "latitude": 42.234622237, "longitude": -8.707758443, - "lines": [ - "24" - ] + "lines": ["24"] }, { "stopId": 20023, @@ -13528,9 +9881,7 @@ }, "latitude": 42.234062973, "longitude": -8.712195759, - "lines": [ - "24" - ] + "lines": ["24"] }, { "stopId": 20024, @@ -13539,11 +9890,7 @@ }, "latitude": 42.207634066, "longitude": -8.758920861, - "lines": [ - "5B", - "13", - "N4" - ] + "lines": ["5B", "13", "N4"] }, { "stopId": 20025, @@ -13552,11 +9899,7 @@ }, "latitude": 42.206553268, "longitude": -8.760122491, - "lines": [ - "5B", - "13", - "N4" - ] + "lines": ["5B", "13", "N4"] }, { "stopId": 20026, @@ -13565,14 +9908,7 @@ }, "latitude": 42.206488366, "longitude": -8.759906624, - "lines": [ - "5B", - "13", - "N4", - "H", - "PSA 1", - "PSA 4" - ] + "lines": ["5B", "13", "N4", "H", "PSA 1", "PSA 4"] }, { "stopId": 20027, @@ -13603,10 +9939,7 @@ }, "latitude": 42.245921506, "longitude": -8.673014474, - "lines": [ - "9B", - "28" - ] + "lines": ["9B", "28"] }, { "stopId": 20030, @@ -13615,10 +9948,7 @@ }, "latitude": 42.247859379, "longitude": -8.674363625, - "lines": [ - "9B", - "28" - ] + "lines": ["9B", "28"] }, { "stopId": 20041, @@ -13627,10 +9957,7 @@ }, "latitude": 42.233622103, "longitude": -8.689209566, - "lines": [ - "27", - "28" - ] + "lines": ["27", "28"] }, { "stopId": 20042, @@ -13639,9 +9966,7 @@ }, "latitude": 42.233723398, "longitude": -8.689094231, - "lines": [ - "28" - ] + "lines": ["28"] }, { "stopId": 20043, @@ -13650,9 +9975,7 @@ }, "latitude": 42.236036786, "longitude": -8.686656768, - "lines": [ - "28" - ] + "lines": ["28"] }, { "stopId": 20044, @@ -13661,10 +9984,7 @@ }, "latitude": 42.215220874, "longitude": -8.742680967, - "lines": [ - "23", - "N4" - ] + "lines": ["23", "N4"] }, { "stopId": 20045, @@ -13673,9 +9993,7 @@ }, "latitude": 42.200532989, "longitude": -8.674075447, - "lines": [ - "15B" - ] + "lines": ["15B"] }, { "stopId": 20046, @@ -13684,9 +10002,7 @@ }, "latitude": 42.201968444, "longitude": -8.67477879, - "lines": [ - "15B" - ] + "lines": ["15B"] }, { "stopId": 20047, @@ -13695,9 +10011,7 @@ }, "latitude": 42.204330306, "longitude": -8.674670483, - "lines": [ - "15B" - ] + "lines": ["15B"] }, { "stopId": 20048, @@ -13706,10 +10020,7 @@ }, "latitude": 42.182684406, "longitude": -8.802402364, - "lines": [ - "11", - "12A" - ] + "lines": ["11", "12A"] }, { "stopId": 20049, @@ -13718,9 +10029,7 @@ }, "latitude": 42.18238342, "longitude": -8.802126069, - "lines": [ - "11" - ] + "lines": ["11"] }, { "stopId": 20050, @@ -13729,9 +10038,7 @@ }, "latitude": 42.225550059, "longitude": -8.686684563, - "lines": [ - "25" - ] + "lines": ["25"] }, { "stopId": 20051, @@ -13740,9 +10047,7 @@ }, "latitude": 42.225652904, "longitude": -8.686624017, - "lines": [ - "25" - ] + "lines": ["25"] }, { "stopId": 20052, @@ -13751,10 +10056,7 @@ }, "latitude": 42.232748414, "longitude": -8.702539655, - "lines": [ - "4A", - "H3" - ] + "lines": ["4A", "H3"] }, { "stopId": 20053, @@ -13763,10 +10065,7 @@ }, "latitude": 42.248962858, "longitude": -8.688272303, - "lines": [ - "C3i", - "10" - ] + "lines": ["C3i", "10"] }, { "stopId": 20054, @@ -13775,10 +10074,7 @@ }, "latitude": 42.248897377, "longitude": -8.689150714, - "lines": [ - "C3d", - "10" - ] + "lines": ["C3d", "10"] }, { "stopId": 20057, @@ -13787,12 +10083,7 @@ }, "latitude": 42.238843911, "longitude": -8.713008504, - "lines": [ - "A", - "5B", - "16", - "24" - ] + "lines": ["A", "5B", "16", "24"] }, { "stopId": 20058, @@ -13801,10 +10092,7 @@ }, "latitude": 42.238435471, "longitude": -8.714413687, - "lines": [ - "5B", - "16" - ] + "lines": ["5B", "16"] }, { "stopId": 20059, @@ -13813,11 +10101,7 @@ }, "latitude": 42.222745522, "longitude": -8.677932515, - "lines": [ - "25", - "31", - "H3" - ] + "lines": ["25", "31", "H3"] }, { "stopId": 20060, @@ -13826,11 +10110,7 @@ }, "latitude": 42.22282586, "longitude": -8.678077606, - "lines": [ - "25", - "31", - "H3" - ] + "lines": ["25", "31", "H3"] }, { "stopId": 20061, @@ -13839,10 +10119,7 @@ }, "latitude": 42.217568173, "longitude": -8.744018511, - "lines": [ - "23", - "N4" - ] + "lines": ["23", "N4"] }, { "stopId": 20062, @@ -13851,10 +10128,7 @@ }, "latitude": 42.236143706, "longitude": -8.73180718, - "lines": [ - "10", - "15B" - ] + "lines": ["10", "15B"] }, { "stopId": 20071, @@ -13863,9 +10137,7 @@ }, "latitude": 42.205511653, "longitude": -8.672824803, - "lines": [ - "15B" - ] + "lines": ["15B"] }, { "stopId": 20072, @@ -13874,9 +10146,7 @@ }, "latitude": 42.196643694, "longitude": -8.671663218, - "lines": [ - "15B" - ] + "lines": ["15B"] }, { "stopId": 20075, @@ -13885,18 +10155,7 @@ }, "latitude": 42.218011215, "longitude": -8.745369728, - "lines": [ - "C3i", - "4A", - "4C", - "10", - "11", - "12A", - "15A", - "23", - "N1", - "N4" - ] + "lines": ["C3i", "4A", "4C", "10", "11", "12A", "15A", "23", "N1", "N4"] }, { "stopId": 20076, @@ -13905,16 +10164,7 @@ }, "latitude": 42.21901679, "longitude": -8.739919147, - "lines": [ - "C3i", - "4A", - "4C", - "10", - "11", - "12A", - "15A", - "N1" - ] + "lines": ["C3i", "4A", "4C", "10", "11", "12A", "15A", "N1"] }, { "stopId": 20077, @@ -13943,15 +10193,7 @@ }, "latitude": 42.233341329, "longitude": -8.728967219, - "lines": [ - "4A", - "4C", - "11", - "12B", - "17", - "27", - "N1" - ] + "lines": ["4A", "4C", "11", "12B", "17", "27", "N1"] }, { "stopId": 20079, @@ -13960,15 +10202,7 @@ }, "latitude": 42.23341294, "longitude": -8.729045156, - "lines": [ - "4A", - "4C", - "7", - "12B", - "17", - "27", - "PSA 4" - ] + "lines": ["4A", "4C", "7", "12B", "17", "27", "PSA 4"] }, { "stopId": 20080, @@ -13977,9 +10211,7 @@ }, "latitude": 42.221674556, "longitude": -8.660937347, - "lines": [ - "11" - ] + "lines": ["11"] }, { "stopId": 20081, @@ -13988,9 +10220,7 @@ }, "latitude": 42.151852858, "longitude": -8.684956786, - "lines": [ - "7" - ] + "lines": ["7"] }, { "stopId": 20082, @@ -13999,9 +10229,7 @@ }, "latitude": 42.221758032, "longitude": -8.661135597, - "lines": [ - "11" - ] + "lines": ["11"] }, { "stopId": 20083, @@ -14010,9 +10238,7 @@ }, "latitude": 42.188074669, "longitude": -8.701928367, - "lines": [ - "27" - ] + "lines": ["27"] }, { "stopId": 20084, @@ -14021,9 +10247,7 @@ }, "latitude": 42.18711079, "longitude": -8.699519743, - "lines": [ - "27" - ] + "lines": ["27"] }, { "stopId": 20085, @@ -14032,9 +10256,7 @@ }, "latitude": 42.185852445, "longitude": -8.696410892, - "lines": [ - "27" - ] + "lines": ["27"] }, { "stopId": 20086, @@ -14043,9 +10265,7 @@ }, "latitude": 42.190645281, "longitude": -8.696150583, - "lines": [ - "27" - ] + "lines": ["27"] }, { "stopId": 20087, @@ -14054,9 +10274,7 @@ }, "latitude": 42.194639373, "longitude": -8.696795357, - "lines": [ - "27" - ] + "lines": ["27"] }, { "stopId": 20089, @@ -14065,9 +10283,7 @@ }, "latitude": 42.213044566, "longitude": -8.751396835, - "lines": [ - "16" - ] + "lines": ["16"] }, { "stopId": 20091, @@ -14076,12 +10292,7 @@ }, "latitude": 42.238164803, "longitude": -8.711212761, - "lines": [ - "A", - "5B", - "16", - "24" - ] + "lines": ["A", "5B", "16", "24"] }, { "stopId": 20094, @@ -14090,9 +10301,7 @@ }, "latitude": 42.22518736, "longitude": -8.717399288, - "lines": [ - "18A" - ] + "lines": ["18A"] }, { "stopId": 20095, @@ -14101,12 +10310,7 @@ }, "latitude": 42.219212419, "longitude": -8.685836356, - "lines": [ - "12A", - "12B", - "13", - "H3" - ] + "lines": ["12A", "12B", "13", "H3"] }, { "stopId": 20096, @@ -14115,13 +10319,7 @@ }, "latitude": 42.219128991, "longitude": -8.685753208, - "lines": [ - "12A", - "12B", - "13", - "U2", - "H3" - ] + "lines": ["12A", "12B", "13", "U2", "H3"] }, { "stopId": 20099, @@ -14130,13 +10328,7 @@ }, "latitude": 42.222390674, "longitude": -8.752507356, - "lines": [ - "C3d", - "C3i", - "15B", - "15C", - "N1" - ] + "lines": ["C3d", "C3i", "15B", "15C", "N1"] }, { "stopId": 20100, @@ -14145,13 +10337,7 @@ }, "latitude": 42.223195763, "longitude": -8.749650702, - "lines": [ - "C3d", - "C3i", - "15B", - "15C", - "N1" - ] + "lines": ["C3d", "C3i", "15B", "15C", "N1"] }, { "stopId": 20102, @@ -14160,16 +10346,7 @@ }, "latitude": 42.191034002, "longitude": -8.714303116, - "lines": [ - "6", - "12B", - "18H", - "27", - "H1", - "H2", - "H3", - "H" - ] + "lines": ["6", "12B", "18H", "27", "H1", "H2", "H3", "H"] }, { "stopId": 20103, @@ -14178,13 +10355,7 @@ }, "latitude": 42.218946899, "longitude": -8.733670293, - "lines": [ - "7", - "12B", - "17", - "N4", - "H1" - ] + "lines": ["7", "12B", "17", "N4", "H1"] }, { "stopId": 20104, @@ -14193,9 +10364,7 @@ }, "latitude": 42.220938435, "longitude": -8.709621883, - "lines": [ - "14" - ] + "lines": ["14"] }, { "stopId": 20105, @@ -14204,9 +10373,7 @@ }, "latitude": 42.221232035, "longitude": -8.709808647, - "lines": [ - "14" - ] + "lines": ["14"] }, { "stopId": 20107, @@ -14215,10 +10382,7 @@ }, "latitude": 42.188244696, "longitude": -8.703164368, - "lines": [ - "6", - "27" - ] + "lines": ["6", "27"] }, { "stopId": 20110, @@ -14227,10 +10391,7 @@ }, "latitude": 42.213797254, "longitude": -8.741472696, - "lines": [ - "23", - "N4" - ] + "lines": ["23", "N4"] }, { "stopId": 20111, @@ -14239,17 +10400,7 @@ }, "latitude": 42.187585838, "longitude": -8.716278919, - "lines": [ - "A", - "6", - "12B", - "18H", - "27", - "H1", - "H2", - "H3", - "H" - ] + "lines": ["A", "6", "12B", "18H", "27", "H1", "H2", "H3", "H"] }, { "stopId": 20112, @@ -14258,14 +10409,7 @@ }, "latitude": 42.188578188, "longitude": -8.713087125, - "lines": [ - "6", - "12B", - "18H", - "H1", - "H3", - "H" - ] + "lines": ["6", "12B", "18H", "H1", "H3", "H"] }, { "stopId": 20113, @@ -14274,13 +10418,7 @@ }, "latitude": 42.220876566, "longitude": -8.733367644, - "lines": [ - "12B", - "N4", - "H1", - "H2", - "PTL" - ] + "lines": ["12B", "N4", "H1", "H2", "PTL"] }, { "stopId": 20114, @@ -14289,9 +10427,7 @@ }, "latitude": 42.18846205, "longitude": -8.703352711, - "lines": [ - "6" - ] + "lines": ["6"] }, { "stopId": 20115, @@ -14300,9 +10436,7 @@ }, "latitude": 42.190100441, "longitude": -8.705453204, - "lines": [ - "6" - ] + "lines": ["6"] }, { "stopId": 20116, @@ -14311,10 +10445,7 @@ }, "latitude": 42.19202547, "longitude": -8.705712064, - "lines": [ - "6", - "27" - ] + "lines": ["6", "27"] }, { "stopId": 20117, @@ -14323,10 +10454,7 @@ }, "latitude": 42.191616209, "longitude": -8.706277831, - "lines": [ - "6", - "27" - ] + "lines": ["6", "27"] }, { "stopId": 20118, @@ -14335,9 +10463,7 @@ }, "latitude": 42.228358488, "longitude": -8.719490904, - "lines": [ - "H2" - ] + "lines": ["H2"] }, { "stopId": 20119, @@ -14346,11 +10472,7 @@ }, "latitude": 42.190930878, "longitude": -8.71409354, - "lines": [ - "6", - "12B", - "H3" - ] + "lines": ["6", "12B", "H3"] }, { "stopId": 20124, @@ -14359,15 +10481,7 @@ }, "latitude": 42.208989468, "longitude": -8.729330619, - "lines": [ - "A", - "12B", - "U1", - "H1", - "H2", - "H", - "PTL" - ] + "lines": ["A", "12B", "U1", "H1", "H2", "H", "PTL"] }, { "stopId": 20125, @@ -14376,11 +10490,7 @@ }, "latitude": 42.209126911, "longitude": -8.729344197, - "lines": [ - "12B", - "H1", - "H2" - ] + "lines": ["12B", "H1", "H2"] }, { "stopId": 20126, @@ -14389,12 +10499,7 @@ }, "latitude": 42.190252452, "longitude": -8.717998617, - "lines": [ - "12B", - "18H", - "H1", - "H2" - ] + "lines": ["12B", "18H", "H1", "H2"] }, { "stopId": 20127, @@ -14403,17 +10508,7 @@ }, "latitude": 42.19007538, "longitude": -8.718125045, - "lines": [ - "A", - "12B", - "18H", - "27", - "U1", - "H1", - "H2", - "H", - "PTL" - ] + "lines": ["A", "12B", "18H", "27", "U1", "H1", "H2", "H", "PTL"] }, { "stopId": 20130, @@ -14422,9 +10517,7 @@ }, "latitude": 42.152788309, "longitude": -8.681902684, - "lines": [ - "7" - ] + "lines": ["7"] }, { "stopId": 20132, @@ -14433,10 +10526,7 @@ }, "latitude": 42.260473187, "longitude": -8.67881466, - "lines": [ - "C3d", - "C3i" - ] + "lines": ["C3d", "C3i"] }, { "stopId": 20136, @@ -14445,13 +10535,7 @@ }, "latitude": 42.225764699, "longitude": -8.704499864, - "lines": [ - "4C", - "23", - "31", - "N4", - "PSA 4" - ] + "lines": ["4C", "23", "31", "N4", "PSA 4"] }, { "stopId": 20137, @@ -14460,9 +10544,7 @@ }, "latitude": 42.246563041, "longitude": -8.669395817, - "lines": [ - "9B" - ] + "lines": ["9B"] }, { "stopId": 20139, @@ -14471,9 +10553,7 @@ }, "latitude": 42.199144892, "longitude": -8.758506717, - "lines": [ - "29" - ] + "lines": ["29"] }, { "stopId": 20141, @@ -14482,11 +10562,7 @@ }, "latitude": 42.21057897, "longitude": -8.671171189, - "lines": [ - "12B", - "15B", - "15C" - ] + "lines": ["12B", "15B", "15C"] }, { "stopId": 20142, @@ -14495,9 +10571,7 @@ }, "latitude": 42.200738188, "longitude": -8.714882876, - "lines": [ - "18B" - ] + "lines": ["18B"] }, { "stopId": 20143, @@ -14506,10 +10580,7 @@ }, "latitude": 42.215448094, "longitude": -8.756474306, - "lines": [ - "15A", - "N4" - ] + "lines": ["15A", "N4"] }, { "stopId": 20154, @@ -14518,9 +10589,7 @@ }, "latitude": 42.192089689, "longitude": -8.709245389, - "lines": [ - "27" - ] + "lines": ["27"] }, { "stopId": 20155, @@ -14529,9 +10598,7 @@ }, "latitude": 42.19217626, "longitude": -8.708899009, - "lines": [ - "27" - ] + "lines": ["27"] }, { "stopId": 20156, @@ -14540,9 +10607,7 @@ }, "latitude": 42.169602007, "longitude": -8.680122554, - "lines": [ - "A" - ] + "lines": ["A"] }, { "stopId": 20157, @@ -14551,9 +10616,7 @@ }, "latitude": 42.185615419, "longitude": -8.702424678, - "lines": [ - "6" - ] + "lines": ["6"] }, { "stopId": 20158, @@ -14562,9 +10625,7 @@ }, "latitude": 42.185593055, "longitude": -8.702377974, - "lines": [ - "6" - ] + "lines": ["6"] }, { "stopId": 20159, @@ -14573,9 +10634,7 @@ }, "latitude": 42.160348044, "longitude": -8.718706355, - "lines": [ - "7" - ] + "lines": ["7"] }, { "stopId": 20160, @@ -14584,9 +10643,7 @@ }, "latitude": 42.160066796, "longitude": -8.718938239, - "lines": [ - "7" - ] + "lines": ["7"] }, { "stopId": 20166, @@ -14595,10 +10652,7 @@ }, "latitude": 42.202134841, "longitude": -8.70572793, - "lines": [ - "18A", - "18B" - ] + "lines": ["18A", "18B"] }, { "stopId": 20167, @@ -14607,10 +10661,7 @@ }, "latitude": 42.202095058, "longitude": -8.705814233, - "lines": [ - "18A", - "18B" - ] + "lines": ["18A", "18B"] }, { "stopId": 20168, @@ -14619,9 +10670,7 @@ }, "latitude": 42.173596087, "longitude": -8.730918928, - "lines": [ - "7" - ] + "lines": ["7"] }, { "stopId": 20169, @@ -14630,9 +10679,7 @@ }, "latitude": 42.173616782, "longitude": -8.730810863, - "lines": [ - "7" - ] + "lines": ["7"] }, { "stopId": 20170, @@ -14641,11 +10688,7 @@ }, "latitude": 42.224544805, "longitude": -8.730413561, - "lines": [ - "5A", - "5B", - "12A" - ] + "lines": ["5A", "5B", "12A"] }, { "stopId": 20171, @@ -14654,11 +10697,7 @@ }, "latitude": 42.204380762, "longitude": -8.726688445, - "lines": [ - "12B", - "H1", - "H2" - ] + "lines": ["12B", "H1", "H2"] }, { "stopId": 20172, @@ -14667,14 +10706,7 @@ }, "latitude": 42.203736336, "longitude": -8.726617869, - "lines": [ - "A", - "12B", - "H1", - "H2", - "H", - "PTL" - ] + "lines": ["A", "12B", "H1", "H2", "H", "PTL"] }, { "stopId": 20173, @@ -14683,9 +10715,7 @@ }, "latitude": 42.192504056, "longitude": -8.721215121, - "lines": [ - "7" - ] + "lines": ["7"] }, { "stopId": 20174, @@ -14694,9 +10724,7 @@ }, "latitude": 42.21519917, "longitude": -8.726793773, - "lines": [ - "A" - ] + "lines": ["A"] }, { "stopId": 20177, @@ -14705,15 +10733,7 @@ }, "latitude": 42.230767817, "longitude": -8.715105964, - "lines": [ - "C3i", - "6", - "11", - "15A", - "23", - "25", - "28" - ] + "lines": ["C3i", "6", "11", "15A", "23", "25", "28"] }, { "stopId": 20178, @@ -14722,9 +10742,7 @@ }, "latitude": 42.172412443, "longitude": -8.799591567, - "lines": [ - "12A" - ] + "lines": ["12A"] }, { "stopId": 20180, @@ -14733,9 +10751,7 @@ }, "latitude": 42.229527407, "longitude": -8.70843784, - "lines": [ - "H2" - ] + "lines": ["H2"] }, { "stopId": 20186, @@ -14744,9 +10760,7 @@ }, "latitude": 42.23755404, "longitude": -8.651558138, - "lines": [ - "9B" - ] + "lines": ["9B"] }, { "stopId": 20187, @@ -14755,10 +10769,7 @@ }, "latitude": 42.237422128, "longitude": -8.65153195, - "lines": [ - "9B", - "27" - ] + "lines": ["9B", "27"] }, { "stopId": 20188, @@ -14767,10 +10778,7 @@ }, "latitude": 42.201670402, "longitude": -8.708928464, - "lines": [ - "18B", - "H3" - ] + "lines": ["18B", "H3"] }, { "stopId": 20189, @@ -14779,10 +10787,7 @@ }, "latitude": 42.201625853, "longitude": -8.712945043, - "lines": [ - "18B", - "H3" - ] + "lines": ["18B", "H3"] }, { "stopId": 20190, @@ -14791,15 +10796,7 @@ }, "latitude": 42.234906013, "longitude": -8.72662052, - "lines": [ - "4A", - "4C", - "11", - "12B", - "17", - "27", - "N1" - ] + "lines": ["4A", "4C", "11", "12B", "17", "27", "N1"] }, { "stopId": 20191, @@ -14808,10 +10805,7 @@ }, "latitude": 42.229676205, "longitude": -8.657383392, - "lines": [ - "15A", - "25" - ] + "lines": ["15A", "25"] }, { "stopId": 20192, @@ -14820,16 +10814,7 @@ }, "latitude": 42.237168511, "longitude": -8.720373767, - "lines": [ - "4A", - "4C", - "5B", - "7", - "12B", - "16", - "17", - "PSA 4" - ] + "lines": ["4A", "4C", "5B", "7", "12B", "16", "17", "PSA 4"] }, { "stopId": 20193, @@ -14860,18 +10845,7 @@ }, "latitude": 42.240364985, "longitude": -8.724530974, - "lines": [ - "C1", - "C3d", - "A", - "5A", - "9B", - "10", - "15B", - "15C", - "28", - "N4" - ] + "lines": ["C1", "C3d", "A", "5A", "9B", "10", "15B", "15C", "28", "N4"] }, { "stopId": 20195, @@ -14905,9 +10879,7 @@ }, "latitude": 42.175325155, "longitude": -8.799594139, - "lines": [ - "12A" - ] + "lines": ["12A"] }, { "stopId": 20197, @@ -14916,10 +10888,7 @@ }, "latitude": 42.23558703, "longitude": -8.728830897, - "lines": [ - "5B", - "12A" - ] + "lines": ["5B", "12A"] }, { "stopId": 20198, @@ -14949,9 +10918,7 @@ }, "latitude": 42.228802205, "longitude": -8.718136653, - "lines": [ - "H2" - ] + "lines": ["H2"] }, { "stopId": 20200, @@ -14960,10 +10927,7 @@ }, "latitude": 42.235482452, "longitude": -8.728981431, - "lines": [ - "5B", - "12A" - ] + "lines": ["5B", "12A"] }, { "stopId": 20201, @@ -14972,10 +10936,7 @@ }, "latitude": 42.235701104, "longitude": -8.726054911, - "lines": [ - "5B", - "12A" - ] + "lines": ["5B", "12A"] }, { "stopId": 20202, @@ -14984,9 +10945,7 @@ }, "latitude": 42.2404374, "longitude": -8.726048008, - "lines": [ - "TUR" - ] + "lines": ["TUR"] }, { "stopId": 20203, @@ -14995,15 +10954,7 @@ }, "latitude": 42.230881062, "longitude": -8.718397577, - "lines": [ - "7", - "12B", - "14", - "16", - "18A", - "18B", - "18H" - ] + "lines": ["7", "12B", "14", "16", "18A", "18B", "18H"] }, { "stopId": 20209, @@ -15012,9 +10963,7 @@ }, "latitude": 42.211481651, "longitude": -8.734440746, - "lines": [ - "H1" - ] + "lines": ["H1"] }, { "stopId": 20210, @@ -15023,10 +10972,7 @@ }, "latitude": 42.19824056, "longitude": -8.763182189, - "lines": [ - "11", - "29" - ] + "lines": ["11", "29"] }, { "stopId": 20211, @@ -15035,10 +10981,7 @@ }, "latitude": 42.198422825, "longitude": -8.762538026, - "lines": [ - "11", - "29" - ] + "lines": ["11", "29"] }, { "stopId": 20212, @@ -15047,9 +10990,7 @@ }, "latitude": 42.188388732, "longitude": -8.805956864, - "lines": [ - "10" - ] + "lines": ["10"] }, { "stopId": 20215, @@ -15058,17 +10999,7 @@ }, "latitude": 42.223880296, "longitude": -8.735520196, - "lines": [ - "A", - "5A", - "5B", - "10", - "11", - "13", - "N4", - "H1", - "H" - ] + "lines": ["A", "5A", "5B", "10", "11", "13", "N4", "H1", "H"] }, { "stopId": 20216, @@ -15077,9 +11008,7 @@ }, "latitude": 42.179747589, "longitude": -8.802157388, - "lines": [ - "11" - ] + "lines": ["11"] }, { "stopId": 20219, @@ -15088,11 +11017,6 @@ }, "latitude": 42.234830699, "longitude": -8.695443515, - "lines": [ - "A", - "9B", - "27", - "28" - ] + "lines": ["A", "9B", "27", "28"] } -]
\ No newline at end of file +] diff --git a/src/frontend/public/sw.js b/src/frontend/public/sw.js index 70ca169..01d403a 100644 --- a/src/frontend/public/sw.js +++ b/src/frontend/public/sw.js @@ -1,51 +1,52 @@ -const API_CACHE_NAME = 'api-cache-v1' +const API_CACHE_NAME = "api-cache-v1"; const API_URL_PATTERN = /\/api\/(GetStopList)/; const API_MAX_AGE = 24 * 60 * 60 * 1000; // 24 hours -self.addEventListener('install', (event) => { - event.waitUntil(self.skipWaiting()); +self.addEventListener("install", (event) => { + event.waitUntil(self.skipWaiting()); }); -self.addEventListener('activate', (event) => { - event.waitUntil(self.clients.claim()); +self.addEventListener("activate", (event) => { + event.waitUntil(self.clients.claim()); }); -self.addEventListener('fetch', async (event) => { - const url = new URL(event.request.url); +self.addEventListener("fetch", async (event) => { + const url = new URL(event.request.url); - if (event.request.method !== "GET" || !API_URL_PATTERN.test(url.pathname)) { - return; - } + if (event.request.method !== "GET" || !API_URL_PATTERN.test(url.pathname)) { + return; + } - event.respondWith(apiCacheFirst(event.request)); + event.respondWith(apiCacheFirst(event.request)); }); async function apiCacheFirst(request) { - const cache = await caches.open(API_CACHE_NAME); - const cachedResponse = await cache.match(request); - - if (cachedResponse) { - const age = Date.now() - new Date(cachedResponse.headers.get('date')).getTime(); - if (age < API_MAX_AGE) { - console.debug(`SW: Cache HIT for ${request.url}`); - return cachedResponse; - } + const cache = await caches.open(API_CACHE_NAME); + const cachedResponse = await cache.match(request); - // Cache is too old, fetch a fresh copy - cache.delete(request); + if (cachedResponse) { + const age = + Date.now() - new Date(cachedResponse.headers.get("date")).getTime(); + if (age < API_MAX_AGE) { + console.debug(`SW: Cache HIT for ${request.url}`); + return cachedResponse; } - try { - const netResponse = await fetch(request); + // Cache is too old, fetch a fresh copy + cache.delete(request); + } - const responseToCache = netResponse.clone(); + try { + const netResponse = await fetch(request); - cache.put(request, responseToCache); + const responseToCache = netResponse.clone(); - console.debug(`SW: Cache MISS for ${request.url}`); + cache.put(request, responseToCache); - return netResponse; - } catch (error) { - throw error; - } -}
\ No newline at end of file + console.debug(`SW: Cache MISS for ${request.url}`); + + return netResponse; + } catch (error) { + throw error; + } +} diff --git a/src/frontend/react-router.config.ts b/src/frontend/react-router.config.ts index e2d40cc..b913b59 100644 --- a/src/frontend/react-router.config.ts +++ b/src/frontend/react-router.config.ts @@ -3,6 +3,6 @@ import type { Config } from "@react-router/dev/config"; export default { ssr: false, future: { - unstable_subResourceIntegrity: true - } + unstable_subResourceIntegrity: true, + }, } satisfies Config; diff --git a/src/frontend/vite.config.ts b/src/frontend/vite.config.ts index 126d1de..430ad40 100644 --- a/src/frontend/vite.config.ts +++ b/src/frontend/vite.config.ts @@ -1,4 +1,4 @@ -import { defineConfig } from 'vite'; +import { defineConfig } from "vite"; import tsconfigPaths from "vite-tsconfig-paths"; import { reactRouter } from "@react-router/dev/vite"; @@ -7,10 +7,10 @@ export default defineConfig({ plugins: [reactRouter(), tsconfigPaths()], server: { proxy: { - '^/api': { - target: 'https://localhost:7240', - secure: false - } - } - } -}) + "^/api": { + target: "https://localhost:7240", + secure: false, + }, + }, + }, +}); |
