From 268c11111e18f9c6604c1e33c181a5210b6e6dd1 Mon Sep 17 00:00:00 2001 From: harukin-expo-dev-env Date: Sat, 2 Aug 2025 14:36:54 +0000 Subject: [PATCH 01/16] =?UTF-8?q?=E3=83=AC=E3=82=A4=E3=82=A2=E3=82=A6?= =?UTF-8?q?=E3=83=88=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/webViewInjectjavascript.ts | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/lib/webViewInjectjavascript.ts b/lib/webViewInjectjavascript.ts index 55157d3..0d7bb01 100644 --- a/lib/webViewInjectjavascript.ts +++ b/lib/webViewInjectjavascript.ts @@ -17,6 +17,7 @@ export const injectJavascriptData: InjectJavascriptData = ( mapSwitch != "true" ? ` document.querySelector('#header a').style.display = 'none'; + document.querySelector('#main').style.left = '0px'; document.querySelector('#header').style.height = '50px'; document.querySelector('#main').style.paddingTop = '54px'; document.querySelector('#headerStr').style.display = 'none'; @@ -24,6 +25,7 @@ export const injectJavascriptData: InjectJavascriptData = ( : ` document.querySelector('.accordionClass').style.display = 'none'; document.querySelector('#header').style.display = 'none'; + document.querySelector('#main').style.left = '0px'; document.querySelector('#main').style.paddingTop = '0px'; document.querySelector('#headerStr').style.display = 'none'; `; @@ -1518,10 +1520,13 @@ const setStrings = () =>{ i.style.position = "unset"; i.style.display = "flex"; i.style.flexDirection = "column"; + i.style.alignItems = "center"; + i.style.justifyContent = "center"; i.style.flex = "1"; i.style.backgroundColor = "#00000000"; i.querySelectorAll(":scope > *").forEach(j=>{ - j.style.width = "100%"; + j.style.display = "flex"; + j.style.flex = "1"; j.style.textAlign = "center"; j.style.margin = "5px"; j.style.padding = "5px"; From 4c68d7d103647527e8eea9f5a99f86122d128d03 Mon Sep 17 00:00:00 2001 From: harukin-expo-dev-env Date: Sat, 2 Aug 2025 14:42:50 +0000 Subject: [PATCH 02/16] =?UTF-8?q?=E8=B7=AF=E7=B7=9A=E3=82=AB=E3=83=A9?= =?UTF-8?q?=E3=83=BC=E5=A4=89=E6=9B=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/webViewInjectjavascript.ts | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/lib/webViewInjectjavascript.ts b/lib/webViewInjectjavascript.ts index 0d7bb01..f6a6795 100644 --- a/lib/webViewInjectjavascript.ts +++ b/lib/webViewInjectjavascript.ts @@ -1290,7 +1290,7 @@ export const injectJavascriptData: InjectJavascriptData = ( return "寝台特急"; case "SPCL": case "SPCL_Normal": - trainTypeColor = "#000000ff"; + trainTypeColor = "#008d07ff"; return "臨時"; case "SPCL_Rapid": trainTypeColor = "rgba(0, 81, 255, 1)"; @@ -1302,10 +1302,10 @@ export const injectJavascriptData: InjectJavascriptData = ( trainTypeColor = "#00869ecc"; return "貨物"; case "Forwarding": - trainTypeColor = "black"; + trainTypeColor = "#727272cc"; return "回送"; case "FreightForwarding": - trainTypeColor = "black"; + trainTypeColor = "#727272cc"; return "単機回送"; default: return ""; @@ -1410,7 +1410,7 @@ const setNewTrainItem = (element,hasProblem,type)=>{ break; case "SPCL": case "SPCL_Normal": - element.style.borderColor = "#000000ff"; + element.style.borderColor = "#008d07ff"; break; case "SPCL_Rapid": element.style.borderColor = "rgba(0, 81, 255, 1)"; @@ -1422,10 +1422,10 @@ const setNewTrainItem = (element,hasProblem,type)=>{ element.style.borderColor = "#00869ecc"; break; case "Forwarding": - element.style.borderColor = "black"; + element.style.borderColor = "#727272cc"; break; case "FreightForwarding": - element.style.borderColor = "black"; + element.style.borderColor = "#727272cc"; break; default: element.style.borderColor = 'black'; From 6b4606f2b5201efe8eacd08bde25cd2766bfc3ef Mon Sep 17 00:00:00 2001 From: harukin-expo-dev-env Date: Sat, 2 Aug 2025 15:20:13 +0000 Subject: [PATCH 03/16] =?UTF-8?q?=E5=90=84=E7=A8=AE=E7=8B=AC=E8=87=AA?= =?UTF-8?q?=E3=83=87=E3=83=BC=E3=82=BF=E3=82=92=E6=AF=8E=E5=88=86=E6=9B=B4?= =?UTF-8?q?=E6=96=B0=E3=81=97=E3=81=A6=E8=87=AA=E5=8B=95=E5=8F=96=E5=BE=97?= =?UTF-8?q?=E3=81=99=E3=82=8B=E3=82=88=E3=81=86=E3=81=AB=E5=A4=89=E6=9B=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/webViewInjectjavascript.ts | 85 ++++++++++++++++++++++++---------- 1 file changed, 61 insertions(+), 24 deletions(-) diff --git a/lib/webViewInjectjavascript.ts b/lib/webViewInjectjavascript.ts index f6a6795..5c6e9e4 100644 --- a/lib/webViewInjectjavascript.ts +++ b/lib/webViewInjectjavascript.ts @@ -32,39 +32,76 @@ export const injectJavascriptData: InjectJavascriptData = ( // 上部ヘッダーの取り扱い、自動再読み込み、setStringsの実行 const bootData = ` + // 起動時にブラウザにlodashを読み込むscript追加処理 + const script = document.createElement('script'); + script.src = "https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.21/lodash.min.js"; + document.head.appendChild(script); + let stationList = {}; fetch("https://n8n.haruk.in/webhook/jr-shikoku-station-list").then((response) => response.json()).then((data) => { stationList = data; - }); - let trainDataList = []; - fetch("https://n8n.haruk.in/webhook/jr-shikoku-position-custom-datalist").then((response) => response.json()).then((data) => { - trainDataList = data[0].data; }).then(()=>setReload()); - let trainDiagramData2 = {}; - fetch("https://n8n.haruk.in/webhook/JR-shikoku-diagram-migrate-original") - .then((response) => response.json()) - .then((res)=>res.data) - .then((res) => { - const data = {}; - res.forEach((d) => { - const keys = Object.keys(d); - data[keys] = d[keys]; + + let trainDataList = []; + const DatalistUpdate = () =>{ + try{ + fetch("https://n8n.haruk.in/webhook/jr-shikoku-position-custom-datalist").then((response) => response.json()) + .then((data) => data[0].data) + .then((data) => { + if(!_.isEqual(data, trainDataList)) { + trainDataList = data; + setReload(); + } }); - return data; - }) - .then((data) => { - trainDiagramData2 = data; - }); + }catch(error){} + setTimeout(DatalistUpdate, 60000); + } + DatalistUpdate(); + + + let trainDiagramData2 = {}; + const TrainDiagramData2Update = () =>{ + try{ + fetch("https://n8n.haruk.in/webhook/JR-shikoku-diagram-migrate-original") + .then((response) => response.json()) + .then((res)=>res.data) + .then((res) => { + const data = {}; + res.forEach((d) => { + const keys = Object.keys(d); + data[keys] = d[keys]; + }); + return data; + }) + .then((data) => { + if(!_.isEqual(data, trainDiagramData2)) { + trainDiagramData2 = data; + setReload(); + } + }); + }catch(error){} + setTimeout(TrainDiagramData2Update, 60000); + } + TrainDiagramData2Update(); + let probremsData = []; - fetch("https://n8n.haruk.in/webhook/jrshikoku-position-problems").then((response) => response.json()).then((data) => { - probremsData = data.data; - }); + + const getProblemsData = () =>{ + try{ + fetch("https://n8n.haruk.in/webhook/jrshikoku-position-problems").then((response) => response.json()).then((data) => { + if(!_.isEqual(data, probremsData)) { + probremsData = data.data; + setReload(); + } + }); + }catch(error){} + setTimeout(getProblemsData, 30000); + } + getProblemsData(); + const setReload = () =>{ try{ document.getElementById('refreshIcon').click(); - fetch("https://n8n.haruk.in/webhook/jrshikoku-position-problems").then((response) => response.json()).then((data) => { - probremsData = data.data; - }); setStrings(); }catch(error){} setTimeout(setReload, 10000); From c0804d2ac7ea1fdb65084aa4a8171aaf3b97ba39 Mon Sep 17 00:00:00 2001 From: harukin-expo-dev-env Date: Sat, 2 Aug 2025 15:33:35 +0000 Subject: [PATCH 04/16] =?UTF-8?q?=E5=88=97=E8=BB=8A=E3=83=87=E3=83=BC?= =?UTF-8?q?=E3=82=BF=E5=8F=96=E5=BE=97=E6=A9=9F=E8=83=BD=E3=82=9230?= =?UTF-8?q?=E7=A7=92=E6=AF=8E=E3=81=AB=E5=8B=95=E3=81=8F=E3=82=88=E3=81=86?= =?UTF-8?q?=E3=81=AB=E5=A4=89=E6=9B=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- stateBox/useAllTrainDiagram.js | 20 +++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) diff --git a/stateBox/useAllTrainDiagram.js b/stateBox/useAllTrainDiagram.js index 2ed4173..7806f8a 100644 --- a/stateBox/useAllTrainDiagram.js +++ b/stateBox/useAllTrainDiagram.js @@ -1,4 +1,5 @@ import trainList from "@/assets/originData/trainList"; +import useInterval from "@/lib/useInterval"; import { AS } from "@/storageControl"; import React, { createContext, useContext, useEffect, useState } from "react"; const initialState = { @@ -19,8 +20,7 @@ export const AllTrainDiagramProvider = ({ children }) => { () => allTrainDiagram && setKeyList(Object.keys(allTrainDiagram)), [allTrainDiagram] ); - useEffect(() => { - fetch("https://n8n.haruk.in/webhook/JR-shikoku-diagram-migrate-original") + const getTrainDiagram = () => fetch("https://n8n.haruk.in/webhook/JR-shikoku-diagram-migrate-original") .then((res) => res.json()) .then((res) => res.data) .then((res) => { @@ -42,9 +42,12 @@ export const AllTrainDiagramProvider = ({ children }) => { alert("初回の路線情報の取得に失敗しました。"); }); }); - }, []); - useEffect(() => { - // カスタム列車データの取得 + + useEffect(getTrainDiagram, []); + useInterval(getTrainDiagram, 30000); //30秒毎に全在線列車取得 + + + const getCustomTrainData = ()=>{ fetch("https://n8n.haruk.in/webhook/jr-shikoku-position-custom-datalist") .then((res) => res.json()) .then((res) => { @@ -53,7 +56,14 @@ export const AllTrainDiagramProvider = ({ children }) => { .catch(() => { alert("カスタム列車データの取得に失敗しました。"); }); + } + + + useEffect(() => { + // カスタム列車データの取得 + getCustomTrainData(); }, []); + useInterval(getCustomTrainData, 30000); // 30秒毎にカスタム列車データ取得 return ( Date: Sun, 3 Aug 2025 08:22:51 +0000 Subject: [PATCH 05/16] =?UTF-8?q?useeffect=E9=96=A2=E4=BF=82=E3=81=AE?= =?UTF-8?q?=E6=A9=9F=E8=83=BD=E6=9C=80=E9=81=A9=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- App.js | 4 +++- stateBox/useAllTrainDiagram.js | 24 +++++++++++++----------- stateBox/useAreaInfo.js | 4 +++- stateBox/useCurrentTrain.js | 4 +++- stateBox/useUserPosition.tsx | 4 +++- 5 files changed, 25 insertions(+), 15 deletions(-) diff --git a/App.js b/App.js index 4fec0f5..2493539 100644 --- a/App.js +++ b/App.js @@ -32,7 +32,9 @@ if (Platform.OS === "android") { } export default function App() { - useEffect(() => UpdateAsync(), []); + useEffect(() => { + UpdateAsync(); + }, []); const ProviderTree = buildProvidersTree([ AllTrainDiagramProvider, diff --git a/stateBox/useAllTrainDiagram.js b/stateBox/useAllTrainDiagram.js index 7806f8a..c86c638 100644 --- a/stateBox/useAllTrainDiagram.js +++ b/stateBox/useAllTrainDiagram.js @@ -16,11 +16,13 @@ export const AllTrainDiagramProvider = ({ children }) => { const [allTrainDiagram, setAllTrainDiagram] = useState(trainList); const [allCustonTrainData, setAllCustonTrainData] = useState([]); // カスタム列車データ const [keyList, setKeyList] = useState(); // 第二要素 - useEffect( - () => allTrainDiagram && setKeyList(Object.keys(allTrainDiagram)), - [allTrainDiagram] - ); - const getTrainDiagram = () => fetch("https://n8n.haruk.in/webhook/JR-shikoku-diagram-migrate-original") + useEffect(() => { + if (allTrainDiagram && Object.keys(allTrainDiagram).length > 0) + setKeyList(Object.keys(allTrainDiagram)); + else setKeyList([]); + }, [allTrainDiagram]); + const getTrainDiagram = () => + fetch("https://n8n.haruk.in/webhook/JR-shikoku-diagram-migrate-original") .then((res) => res.json()) .then((res) => res.data) .then((res) => { @@ -42,12 +44,13 @@ export const AllTrainDiagramProvider = ({ children }) => { alert("初回の路線情報の取得に失敗しました。"); }); }); - - useEffect(getTrainDiagram, []); + + useEffect(() => { + getTrainDiagram(); + }, []); useInterval(getTrainDiagram, 30000); //30秒毎に全在線列車取得 - - const getCustomTrainData = ()=>{ + const getCustomTrainData = () => { fetch("https://n8n.haruk.in/webhook/jr-shikoku-position-custom-datalist") .then((res) => res.json()) .then((res) => { @@ -56,8 +59,7 @@ export const AllTrainDiagramProvider = ({ children }) => { .catch(() => { alert("カスタム列車データの取得に失敗しました。"); }); - } - + }; useEffect(() => { // カスタム列車データの取得 diff --git a/stateBox/useAreaInfo.js b/stateBox/useAreaInfo.js index bdc9a0f..cc9df4d 100644 --- a/stateBox/useAreaInfo.js +++ b/stateBox/useAreaInfo.js @@ -378,7 +378,9 @@ export const AreaInfoProvider = ({ children }) => { ); }); }; - useEffect(getAreaData, []); + useEffect(() => { + getAreaData(); + }, []); useInterval(getAreaData, 60000); //60秒毎に全在線列車取得 return ( { webview.current?.injectJavaScript(i); }; - useEffect(getCurrentTrain, []); //初回だけ現在の全在線列車取得 + useEffect(() => { + getCurrentTrain(); + }, []); //初回だけ現在の全在線列車取得 useInterval(getCurrentTrain, 15000); //15秒毎に全在線列車取得 diff --git a/stateBox/useUserPosition.tsx b/stateBox/useUserPosition.tsx index 2b4cb83..724d5bf 100644 --- a/stateBox/useUserPosition.tsx +++ b/stateBox/useUserPosition.tsx @@ -58,7 +58,9 @@ export const UserPositionProvider: FC = ({ children }) => { if (Platform.OS == "web") return; getLocationPermission(); }, []); - useEffect(getCurrentPosition, [locationStatus]); + useEffect(() => { + getCurrentPosition(); + }, [locationStatus]); useInterval(getCurrentPosition, 5000); return ( From 9280fc77f6a6d8fb8a42bf5998de471ffc422a0f Mon Sep 17 00:00:00 2001 From: harukin-expo-dev-env Date: Thu, 7 Aug 2025 17:10:38 +0000 Subject: [PATCH 06/16] =?UTF-8?q?inject=E3=81=AE=E3=82=A2=E3=83=83?= =?UTF-8?q?=E3=83=97=E3=83=87=E3=83=BC=E3=83=88=E5=87=A6=E7=90=86=E3=81=AE?= =?UTF-8?q?=E5=A4=89=E6=9B=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/webViewInjectjavascript.ts | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/lib/webViewInjectjavascript.ts b/lib/webViewInjectjavascript.ts index 5c6e9e4..69485ca 100644 --- a/lib/webViewInjectjavascript.ts +++ b/lib/webViewInjectjavascript.ts @@ -104,9 +104,12 @@ export const injectJavascriptData: InjectJavascriptData = ( document.getElementById('refreshIcon').click(); setStrings(); }catch(error){} - setTimeout(setReload, 10000); + }; + const useAutoReload = () =>{ + setReload(); + setTimeout(useAutoReload, 10000); } - setReload(); + useAutoReload(); `; // 左か右かを判定してアイコンを設置する const trainIcon = ` From 3143f733966d4e8e91edd372ef364167e71e66ef Mon Sep 17 00:00:00 2001 From: harukin-expo-dev-env Date: Thu, 7 Aug 2025 17:11:00 +0000 Subject: [PATCH 07/16] =?UTF-8?q?areainfo=E3=81=AE=E5=87=A6=E7=90=86?= =?UTF-8?q?=E3=83=99=E3=83=BC=E3=82=B9=E3=82=92=E5=A4=89=E6=9B=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../LED_inside_Component/AreaDescription.tsx | 79 +++++++++++++++++++ components/発車時刻表/LED_vidion.js | 37 +-------- 2 files changed, 83 insertions(+), 33 deletions(-) create mode 100644 components/発車時刻表/LED_inside_Component/AreaDescription.tsx diff --git a/components/発車時刻表/LED_inside_Component/AreaDescription.tsx b/components/発車時刻表/LED_inside_Component/AreaDescription.tsx new file mode 100644 index 0000000..f3dd3b3 --- /dev/null +++ b/components/発車時刻表/LED_inside_Component/AreaDescription.tsx @@ -0,0 +1,79 @@ +import React, { FC, useState, useEffect } from "react"; +import { Text, TextStyle, View, TouchableOpacity } from "react-native"; +import { useInterval } from "../../../lib/useInterval"; + +const descriptionStyle: TextStyle = { + fontSize: parseInt("16%"), + fontWeight: "bold", +}; + +type Props = { + areaInfo: string; + numberOfLines?: number; + onClick?: () => void; + onLongClick?: () => void; +}; +export const AreaDescription:FC = ({ areaInfo, numberOfLines = 0, onClick, onLongClick }) => { + const [areaString, setAreaString] = useState(""); + const [areaStringLength, setAreaStringLength] = useState(0); + const [move, setMove] = useState(0); + useInterval( + () => { + if (areaInfo != "") { + setMove(areaStringLength < move ? 0 : move + 1); + } + }, + 350, + true + ); + useEffect(() => { + if (!areaInfo) { + setAreaString(""); + return () => {}; + } + setAreaString( + areaInfo.substring(move, areaInfo.length) + areaInfo.substring(0, move) + ); + }, [move]); + + useEffect(() => { + if (!areaInfo) { + setAreaStringLength(0); + return () => {}; + } + setAreaStringLength(areaInfo.length); + }, [areaInfo]); + return( + + + {numberOfLines == 1 ? ( + + 運行情報 >{" "} + + ) : ( + > + )} + + + {areaString.replaceAll("\n", "").replaceAll("\r", "")} + + + + ); +}; diff --git a/components/発車時刻表/LED_vidion.js b/components/発車時刻表/LED_vidion.js index 96d297b..bee0532 100644 --- a/components/発車時刻表/LED_vidion.js +++ b/components/発車時刻表/LED_vidion.js @@ -12,6 +12,7 @@ import { Description } from "./LED_inside_Component/Description"; import { EachData } from "./EachData"; import { useAllTrainDiagram } from "@/stateBox/useAllTrainDiagram"; import { trainPosition } from "@/lib/trainPositionTextArray"; +import { AreaDescription } from "./LED_inside_Component/AreaDescription"; /** * @@ -180,36 +181,6 @@ export default function LED_vision(props) { return !date.isAfter(db); } }; - - const [areaString, setAreaString] = useState(""); - const [areaStringLength, setAreaStringLength] = useState(0); - const [move, setMove] = useState(0); - useInterval( - () => { - if (areaInfo != "") { - setMove(areaStringLength < move ? 0 : move + 1); - } - }, - 350, - true - ); - useEffect(() => { - if (!areaInfo) { - setAreaString(""); - return () => {}; - } - setAreaString( - areaInfo.substring(move, areaInfo.length) + areaInfo.substring(0, move) - ); - }, [move]); - - useEffect(() => { - if (!areaInfo) { - setAreaStringLength(0); - return () => {}; - } - setAreaStringLength(areaInfo.length); - }, [areaInfo]); const { width } = useWindowDimensions(); const adjustedWidth = width * 0.98; return ( @@ -236,10 +207,10 @@ export default function LED_vision(props) { key={d.train} /> ))} - {areaString != "" && isInfoArea && ( - alert(areaInfo)} /> )} From c258dfad3d5ef8122c6d3e5bc92fd982e68f46b7 Mon Sep 17 00:00:00 2001 From: harukin-expo-dev-env Date: Fri, 8 Aug 2025 04:16:34 +0000 Subject: [PATCH 08/16] =?UTF-8?q?=E4=B8=8D=E8=A6=81=E3=81=AB=E3=81=AA?= =?UTF-8?q?=E3=82=8B=E8=A6=81=E7=B4=A0=E3=82=92=E5=89=8A=E9=99=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/webViewInjectjavascript.ts | 439 +-------------------------------- 1 file changed, 3 insertions(+), 436 deletions(-) diff --git a/lib/webViewInjectjavascript.ts b/lib/webViewInjectjavascript.ts index 69485ca..765a8d0 100644 --- a/lib/webViewInjectjavascript.ts +++ b/lib/webViewInjectjavascript.ts @@ -106,7 +106,9 @@ export const injectJavascriptData: InjectJavascriptData = ( }catch(error){} }; const useAutoReload = () =>{ - setReload(); + try{ + setReload(); + }catch(error){} setTimeout(useAutoReload, 10000); } useAutoReload(); @@ -500,432 +502,6 @@ export const injectJavascriptData: InjectJavascriptData = ( case "8077": return "https://storage.haruk.in/ef210a.png"; - // // 普通列車系統、6000系運用 - // //61運用 - // case "1213M": - // case "1214M": - // case "143M": - // case "147M": - // //62運用 - // case "114M": - // //961運用 - // case "143M": - // case "147M": - // //962運用 - // case "114M": - // setStationIcon(e.querySelector("img"),'https://storage.haruk.in/s6000p.png',hasProblem); - // break; - - // // 土讃線普通列車系統(include ごな線) - // // ごな線 - // case "5851D": //219D併結 [ToDo: 219Dとの分割対策] - // case "5854D": - // setStationIcon(e.querySelector("img"),'https://storage.haruk.in/tosa9640jgr.png',hasProblem); - // break; - - // //JR車両乗り入れ運用 - // case "5858D": - // case "5869D": - // setStationIcon(e.querySelector("img"),'https://storage.haruk.in/s1000.png',hasProblem); - // break; - // //併結運用の併結される側 [ToDo: 分割対策] - // case "5845D": - // case "5851D": - // case "5818D": - // case "5820D": - // setStationIcon(e.querySelector("img"),'https://storage.haruk.in/tosa9640.png',hasProblem); - // break; - // // 土讃線単体列車のキハ32運用 - // case "715D": - // case "718D": - // setStationIcon(e.querySelector("img"),'https://storage.haruk.in/s32ns.png',hasProblem); - // break; - - // // サンライズに伴う気動車代走 - // case "6219D": - // case "6222D": - // setStationIcon(e.querySelector("img"),'https://storage.haruk.in/s1000.png',hasProblem); - // break; - // // それ以外の土讃線ごな線直通列車 - // case "5811D": - // case "5813D": - // case "5815D": - // case "5817D": - // case "5843D": - // case "5853D": - // case "5855D": - // case "5859D": - // case "5861D": - // case "5865D": - // case "5881D": - // case "5885D": - // case "5889D": - - // case "5812D": - // case "5814D": - // case "5816D": - // case "5852D": - // case "5856D": - // case "5860D": - // case "5862D": - // case "5872D": - // case "5874D": - // case "5876D": - // case "5880D": - // case "5882D": - // setStationIcon(e.querySelector("img"),'https://storage.haruk.in/tosa9640.png',hasProblem); - // break; - // // それ以外の土讃線普通列車(1000) - // case "4210D": - // case "4212D": - // case "4214D": - // case "4218D": - // case "4220D": - // case "4222D": - // case "4224D": - // case "4226D": - // case "4228D": - // case "4230D": - // case "4232D": - // case "4234D": - // case "4236D": - // case "4238D": - // case "4240D": - // case "4242D": - // case "4244D": - // case "4250D": - // case "4252D": - // case "4254D": - // case "4256D": - - // case "4211D": - // case "4221D": - // case "4223D": - // case "4225D": - // case "4227D": - // case "4229D": - // case "4231D": - // case "4235D": - // case "4237D": - // case "4239D": - // case "4241D": - // case "4245D": - // case "4247D": - // case "4249D": - // case "4251D": - // case "4253D": - // case "4255D": - // case "4257D": - // case "4259D": - // case "4261D": - - // case "4710D": - // case "4726D": - // case "4730D": - // case "4732D": - // case "4734D": - // case "4738D": - // case "4740D": - // case "4742D": - // case "4744D": - // case "4746D": - // case "4752D": - // case "4756D": - // case "4762D": - // case "4764D": - // case "4766D": - - // case "4711D": - // case "4713D": - // case "4723D": - // case "4725D": - // case "4727D": - // case "4729D": - // case "4731D": - // case "4737D": - // case "4739D": - // case "4745D": - // case "4753D": - // case "4755D": - // case "4759D": - // case "4761D": - // case "4763D": - - // case "216D": - // case "238D": - // case "246D": - // case "248D": - - // case "213D": - // case "215D": - // case "217D": - // case "219D": - // case "233D": - // case "243D": - - // case "710D": - // case "712D": - // case "714D": - // case "716D": - // case "720D": - // case "722D": - // case "724D": - // case "728D": - // case "736D": - // case "748D": - // case "750D": - // case "754D": - // case "758D": - // case "760D": - // case "768D": - - // case "717D": - // case "719D": - // case "721D": - // case "733D": - // case "735D": - // case "737D": - // case "741D": - // case "743D": - // case "747D": - // case "749D": - // case "751D": - // case "755D": - // case "757D": - // case "761D": - - // setStationIcon(e.querySelector("img"),'https://storage.haruk.in/s1000.png',hasProblem); - // break; - // // 予讃線/土讃線普通列車運用(7000,7200) - // // 下り列車(伊予西条-松山は全て7000系) - - // case "5519M": - // case "5525M": - // case "5215M": - // case "5103M": - // case "107M": - // case "1219M": - // case "5109M": - // case "6109M": - // case "5531M": - // case "1221M": - // case "5225M": - // case "5111M": - // case "1227M": - // case "115M": - // case "5229M": - // case "5117M": - // case "5119M": - // case "119M": - // case "5231M": - // case "4537M": - // case "5233M": - // case "123M": - // case "125M": - // case "5235M": - // case "5239M": - // case "5547M": - // case "129M": - // case "5241M": - // case "5133M": - // case "135M": - // case "1243M": - // case "137M": - // case "5139M": - // case "4559M": - // case "1245M": - // case "141M": - // case "1247M": - // case "5249M": - // case "145M": - // case "5253M": - // case "5149M": - // case "5255M": - // case "151M": - // case "5257M": - // case "153M": - // case "5259M": - // case "155M": - // case "1263M": - // case "157M": - // setStationIcon(e.querySelector("img"),'https://storage.haruk.in/s7200.png',hasProblem); - // break; - // // 下り7000系 - // case "101M": - // case "4601M": - // case "4113M": - // case "121M": - // case "127M": - // case "131M": - // case "555M": - // case "4565M": - // case "159M": - // setStationIcon(e.querySelector("img"),'https://storage.haruk.in/s7000.png',hasProblem); - // break; - // // 上り列車 7200系 - // case "5102M": - // case "104M": - // case "5210M": - // case "5108M": - // case "4108M": - // case "110M": - // case "112M": - // case "118M": - // case "5218M": - // case "5120M": - // case "5220M": - // case "5512M": - // case "1602M": - // case "1224M": - // case "5124M": - // case "5226M": - // case "5126M": - // case "5128M": - // case "1230M": - // case "4128M": - // case "130M": - // case "4522M": - // case "5232M": - // case "132M": - // case "5234M": - // case "136M": - // case "5236M": - // case "5140M": - // case "5238M": - // case "5240M": - // case "142M": - // case "4530M": - // case "144M": - // case "5242M": - // case "146M": - // case "5244M": - // case "4148M": - // case "1246M": - // case "150M": - // case "5538M": - // case "5152M": - // case "154M": - // case "156M": - // case "1252M": - // case "158M": - // case "4604M": - // case "548M": - // case "5254M": - // case "1606M": - // case "5160M": - // case "5256M": - // setStationIcon(e.querySelector("img"),'https://storage.haruk.in/s7200.png',hasProblem); - // break; - // // 上り7000系 - // case "114M": - // case "122M": - // case "134M": - // case "4138M": - // case "138M": - // case "4542M": - // case "162M": - // case "4166M": - // setStationIcon(e.querySelector("img"),'https://storage.haruk.in/s7000.png',hasProblem); - // break; - // // 松山界隈気動車運用 - // // 上り下りの概念アリ - // // キハ32 通常運用 - // case "4625D": - // case "4916D": - // case "925D": - // case "4618D": - // case "4913D": - // case "4918D": - // case "4643D": - // case "4654D": - // case "4657D": - // case "4928D": - // case "4667D": - // case "653D": - // case "3621D": - // case "4818D": - // case "4821D": - // case "4824D": - // case "4813D": - // case "4664D": - // setStationIcon(e.querySelector("img"),'https://storage.haruk.in/s32s.png',hasProblem); - // break; - // // 河童うようよ号偶数 - // case "4816D": - // case "4830D": - // setStationIcon(e.querySelector("img"),'https://storage.haruk.in/s32kpuy2.png',hasProblem); - // break; - // // 河童うようよ号奇数 - // case "4827D": - // setStationIcon(e.querySelector("img"),'https://storage.haruk.in/s32kpuy1.png',hasProblem); - // break; - // // 新幹線偶数 - // case "4810D": - // case "4822D": - // case "4826D": - // setStationIcon(e.querySelector("img"),'https://storage.haruk.in/s32tht.png',hasProblem); - // break; - // // 新幹線奇数 - // case "4817D": - // case "4823D": - // case "4829D": - // setStationIcon(e.querySelector("img"),'https://storage.haruk.in/s32thtk.png',hasProblem); - // break; - // // キハ54 通常運用 - // case "4632D": - // case "4634D": - // case "4921D": - // case "4926D": - // case "4927D": - // case "912D": - // case "4917D": - // case "4641D": - // case "4652D": - // case "4651D": - // case "4666D": - // case "4820D": - // case "4825D": - // case "4828D": - // case "4811D": - // case "4640D": - // case "622D": - // case "4633D": - // case "4920D": - // case "4637D": - // case "4648D": - // case "620D": - // case "4627D": - // case "4624D": - // case "4915D": - // case "4924D": - // case "4649D": - // case "4812D": - // case "4815D": - // case "4659D": - // case "4658D": - // case "4665D": - // case "4914D": - // case "4626D": - // case "4631D": - // case "4636D": - // case "4919D": - // case "4922D": - // case "4923D": - // case "4663D": - // setStationIcon(e.querySelector("img"),'https://storage.haruk.in/s54s.png',hasProblem); - // break; - // // 54しまんとろっこ - // case "4623D": - // case "8814D": - // case "8819D": - // case "4662D": - // setStationIcon(e.querySelector("img"),'https://storage.haruk.in/s54to0ys.png',hasProblem); - // break; - // // キハ185 通常運用 - // case "911D": - // case "628D": - // setStationIcon(e.querySelector("img"),'https://storage.haruk.in/s185cm.png',hasProblem); - // break; // 伊予灘ものがたり 赤 case "8091D": case "8093D": @@ -1047,15 +623,6 @@ export const injectJavascriptData: InjectJavascriptData = ( } else if (new RegExp(/^9(5|6|7|8)\\dD$/).test(列番データ)) { return "https://storage.haruk.in/s1500.png"; } - // 牟岐線普通列車系統 一旦閉鎖 - // else if(new RegExp(/^(4|5)5\\d\\dD$/).test(列番データ)){ - // setStationIcon(e.querySelector("img"),'https://storage.haruk.in/s7200.png',hasProblem); - // break; - // } - // else if(new RegExp(/^5\\d\\dD$/).test(列番データ)){ - // setStationIcon(e.querySelector("img"),'https://storage.haruk.in/s7000.png',hasProblem); - // break; - // } break; } } From a119b426db4c4b372c1f7ff4ad611cdf2fb6e4b1 Mon Sep 17 00:00:00 2001 From: harukin-expo-dev-env Date: Fri, 8 Aug 2025 07:16:05 +0000 Subject: [PATCH 09/16] =?UTF-8?q?=E3=82=B3=E3=83=9F=E3=83=A5=E3=83=8B?= =?UTF-8?q?=E3=83=86=E3=82=A3=E3=83=8E=E3=83=BC=E3=83=88=E3=81=BF=E3=81=9F?= =?UTF-8?q?=E3=81=84=E3=81=AA=E3=82=A2=E3=82=A4=E3=82=B3=E3=83=B3=E3=82=92?= =?UTF-8?q?=E8=BF=BD=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/webViewInjectjavascript.ts | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/lib/webViewInjectjavascript.ts b/lib/webViewInjectjavascript.ts index 765a8d0..19ffd8e 100644 --- a/lib/webViewInjectjavascript.ts +++ b/lib/webViewInjectjavascript.ts @@ -36,6 +36,11 @@ export const injectJavascriptData: InjectJavascriptData = ( const script = document.createElement('script'); script.src = "https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.21/lodash.min.js"; document.head.appendChild(script); + + const script2 = document.createElement('link'); + script2.rel = "stylesheet"; + script2.href = "https://cdnjs.cloudflare.com/ajax/libs/font-awesome/7.0.0/css/all.min.css"; + document.head.appendChild(script2); let stationList = {}; fetch("https://n8n.haruk.in/webhook/jr-shikoku-station-list").then((response) => response.json()).then((data) => { @@ -670,6 +675,7 @@ export const injectJavascriptData: InjectJavascriptData = ( let viaData = ""; let ToData = ""; let TrainNumber = 列番データ; + let isEdit = false; try{ const diagram = trainDiagramData2[列番データ] || trainTimeInfo[列番データ]; @@ -874,7 +880,7 @@ export const injectJavascriptData: InjectJavascriptData = ( getThrew(列番データ); if(trainDataList.find(e => e.id === 列番データ) !== undefined){ const data = trainDataList.find(e => e.id === 列番データ); - //{id,isWanman,trainName,viaData,ToData,TrainNumber,JRF,type,infoUrl,trainNumDistance,info,infogram} + //{id,isWanman,trainName,viaData,ToData,TrainNumber,JRF,type,infoUrl,trainNumDistance,info,infogram,isEdit} trainType = (()=>{ switch(data.type){ case "Normal": @@ -919,6 +925,7 @@ export const injectJavascriptData: InjectJavascriptData = ( } })(); isWanman = data.isWanman; + isEdit = data.isEdit; if(data.trainName != ""){ trainName = data.trainName; if(data.trainNumDistance != null){ @@ -978,7 +985,7 @@ export const injectJavascriptData: InjectJavascriptData = ( const gradient = getColors.length > 1 ? "linear-gradient(130deg, " + getColors[0] + " 0%, "+ getColors[0]+"50%, "+ getColors[1]+"50%, " + getColors[1] + " 100%)" : getColors[0]; - 行き先情報.insertAdjacentHTML('beforebegin', "

" + TrainNumber + (JRF ? "":"レ") + "

" + (isWanman ? "ワンマン " : "") + "

" + viaData + "

" + trainName + "

" + (ToData ? ToData + "行" : ToData) + "

" + trainType + "

" + (hasProblem ? "‼️停止中‼️" : "") + "

"); + 行き先情報.insertAdjacentHTML('beforebegin', "
"+( isEdit ? "
" : "")+"

" + TrainNumber + (JRF ? "":"レ") + "

" + (isWanman ? "ワンマン " : "") + "

" + viaData + "

" + trainName + "

" + (ToData ? ToData + "行" : ToData) + "

" + trainType + "

" + (hasProblem ? "‼️停止中‼️" : "") + "

"); `: ` 行き先情報.insertAdjacentHTML('beforebegin', "

" + returnText1 + "

"); 行き先情報.insertAdjacentHTML('beforebegin', "

" + (ToData ? ToData + "行 " : ToData) + "

" + TrainNumber + (JRF ? "":"レ") + "

"); From 913a198a93d8f84d84f021437b702f538099a7c2 Mon Sep 17 00:00:00 2001 From: harukin-expo-dev-env Date: Fri, 8 Aug 2025 07:26:04 +0000 Subject: [PATCH 10/16] =?UTF-8?q?=E3=83=80=E3=82=A4=E3=83=A4=E6=94=B9?= =?UTF-8?q?=E6=AD=A3=E6=83=85=E5=A0=B1=E3=82=92=E5=89=8A=E9=99=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- components/Menu/FixedContentBottom.js | 16 ---------------- 1 file changed, 16 deletions(-) diff --git a/components/Menu/FixedContentBottom.js b/components/Menu/FixedContentBottom.js index de78d59..c900df6 100644 --- a/components/Menu/FixedContentBottom.js +++ b/components/Menu/FixedContentBottom.js @@ -52,22 +52,6 @@ export const FixedContentBottom = (props) => { 旅行ツアー - - Linking.openURL( - "https://xprocess.haruk.in/JR-shikoku-Apps-Common/2025-update-status" - ) - } - > - - 【ダイヤ改正に伴うデータ更新状況】 - - - ダイヤ改正に伴うデータの更新状況を随時更新します。 - - Date: Fri, 8 Aug 2025 08:49:25 +0000 Subject: [PATCH 11/16] =?UTF-8?q?AllTrainDiagramView=E3=81=AE=E5=BC=B7?= =?UTF-8?q?=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../EachTrainInfoCore.js | 4 +- .../EachTrainInfoCore/HeaderText.tsx | 4 +- .../EachTrainInfoCore/trainIconStatus.tsx | 4 +- components/AllTrainDiagramView.js | 143 +++++++++++++++--- components/custom-train-data.ts | 6 +- components/発車時刻表/EachData.tsx | 4 +- stateBox/useAllTrainDiagram.js | 8 +- 7 files changed, 133 insertions(+), 40 deletions(-) diff --git a/components/ActionSheetComponents/EachTrainInfoCore.js b/components/ActionSheetComponents/EachTrainInfoCore.js index 23a15cb..92a6521 100644 --- a/components/ActionSheetComponents/EachTrainInfoCore.js +++ b/components/ActionSheetComponents/EachTrainInfoCore.js @@ -44,7 +44,7 @@ export const EachTrainInfoCore = ({ }) => { const { currentTrain } = useCurrentTrain(); const { originalStationList, stationList } = useStationList(); - const { allTrainDiagram: trainList, allCustonTrainData } = + const { allTrainDiagram: trainList, allCustomTrainData } = useAllTrainDiagram(); const { setTrainInfo } = useTrainMenu(); const [currentTrainData, setCurrentTrainData] = useState(); @@ -323,7 +323,7 @@ export const EachTrainInfoCore = ({ }, []); const openTrainInfo = (d) => { - const train = customTrainDataDetector(d, allCustonTrainData); + const train = customTrainDataDetector(d, allCustomTrainData); let TrainNumber = ""; if (train.trainNumDistance != undefined) { const timeInfo = diff --git a/components/ActionSheetComponents/EachTrainInfoCore/HeaderText.tsx b/components/ActionSheetComponents/EachTrainInfoCore/HeaderText.tsx index 8203126..5483c87 100644 --- a/components/ActionSheetComponents/EachTrainInfoCore/HeaderText.tsx +++ b/components/ActionSheetComponents/EachTrainInfoCore/HeaderText.tsx @@ -44,7 +44,7 @@ export const HeaderText: FC = ({ const { limited, trainNum } = data; const { updatePermission } = useTrainMenu(); - const { allCustonTrainData } = useAllTrainDiagram(); + const { allCustomTrainData } = useAllTrainDiagram(); const { expoPushToken } = useNotification(); // 列車名、種別、フォントの取得 @@ -52,7 +52,7 @@ export const HeaderText: FC = ({ useMemo(() => { const customTrainData = customTrainDataDetector( trainNum, - allCustonTrainData + allCustomTrainData ); const [type, fontAvailable, isOneMan] = (() => { switch (customTrainData.type) { diff --git a/components/ActionSheetComponents/EachTrainInfoCore/trainIconStatus.tsx b/components/ActionSheetComponents/EachTrainInfoCore/trainIconStatus.tsx index ed642e9..1f30eca 100644 --- a/components/ActionSheetComponents/EachTrainInfoCore/trainIconStatus.tsx +++ b/components/ActionSheetComponents/EachTrainInfoCore/trainIconStatus.tsx @@ -23,12 +23,12 @@ export const TrainIconStatus: FC = ({ data, navigate, from }) => { const [trainIcon, setTrainIcon] = useState(null); const [anpanmanStatus, setAnpanmanStatus] = useState(); const [address, setAddress] = useState(""); - const { allCustonTrainData } = useAllTrainDiagram(); + const { allCustomTrainData } = useAllTrainDiagram(); useEffect(() => { if (!data.trainNum) return; const { img, infoUrl } = customTrainDataDetector( data.trainNum, - allCustonTrainData + allCustomTrainData ); if (img) setTrainIcon(img); if (infoUrl) setAddress(infoUrl); diff --git a/components/AllTrainDiagramView.js b/components/AllTrainDiagramView.js index 491f9cc..95c6c60 100644 --- a/components/AllTrainDiagramView.js +++ b/components/AllTrainDiagramView.js @@ -10,6 +10,7 @@ import { Keyboard, ScrollView, Linking, + Image, } from "react-native"; import { useAllTrainDiagram } from "../stateBox/useAllTrainDiagram"; @@ -19,9 +20,11 @@ import { SheetManager } from "react-native-actions-sheet"; import { useNavigation } from "@react-navigation/native"; import { BigButton } from "./atom/BigButton"; import { Switch } from "react-native-elements"; +import { migrateTrainName } from "@/lib/eachTrainInfoCoreLib/migrateTrainName"; +import { OneManText } from "./ActionSheetComponents/EachTrainInfoCore/HeaderTextParts/OneManText"; export default function AllTrainDiagramView() { const { goBack, navigate } = useNavigation(); - const { keyList, allTrainDiagram, allCustonTrainData } = useAllTrainDiagram(); + const { keyList, allTrainDiagram, allCustomTrainData } = useAllTrainDiagram(); const [input, setInput] = useState(""); // 文字入力 const [keyBoardVisible, setKeyBoardVisible] = useState(false); const [useStationName, setUseStationName] = useState(false); @@ -53,7 +56,7 @@ export default function AllTrainDiagramView() { }, []); const openTrainInfo = (d) => { - const train = customTrainDataDetector(d, allCustonTrainData); + const train = customTrainDataDetector(d, allCustomTrainData); let TrainNumber = ""; if (train.trainNumDistance != undefined) { const timeInfo = @@ -71,6 +74,119 @@ export default function AllTrainDiagramView() { payload, }); }; + + const getStringConfig = (type, id) => { + switch (type) { + case "Normal": + return ["普通", true, false]; + case "OneMan": + return ["普通", true, true]; + case "Rapid": + return ["快速", true, false]; + case "OneManRapid": + return ["快速", true, true]; + case "LTDEXP": + return ["特急", true, false]; + case "NightLTDEXP": + return ["特急", true, false]; + case "SPCL": + return ["臨時", true, false]; + case "SPCL_Normal": + return ["臨時", true, false]; + case "SPCL_Rapid": + return ["臨時快速", true, false]; + case "SPCL_EXP": + return ["臨時特急", true, false]; + case "Freight": + return ["貨物", false, false]; + case "Forwarding": + return ["回送", false, false]; + case "FreightForwarding": + return ["単機回送", false, false]; + case "Other": + switch (true) { + case !!id.includes("T"): + return ["単機回送", false, false]; + case !!id.includes("R"): + case !!id.includes("E"): + case !!id.includes("L"): + case !!id.includes("A"): + case !!id.includes("B"): + return ["回送", false, false]; + case !!id.includes("H"): + return ["試運転", false, false]; + } + return ["", false, false]; + } + }; + const Item = ({ id, openTrainInfo }) => { + const { img, trainName, type, trainNumDistance, infogram } = + customTrainDataDetector(id, allCustomTrainData); + + const [typeString, fontAvailable, isOneMan] = getStringConfig(type, id); + const trainNameString = (() => { + switch (true) { + case trainName !== "": + // 特急の場合は、列車名を取得 + // 列番対称データがある場合はそれから列車番号を取得 + const distance = trainNumDistance; + const number = + distance !== null ? ` ${parseInt(id) - distance}号` : ""; + return trainName + number; + case allTrainDiagram[id] === undefined: + return ""; + default: + // 行先がある場合は、行先を取得 + const s = allTrainDiagram[id].split("#"); + const hoge = s[s.length - 2].split(",")[0]; + return migrateTrainName(hoge + "行き"); + } + })(); + return ( + openTrainInfo(id)} + > + {img && ( + + )} + {typeString && ( + + {typeString} + + )} + {isOneMan && } + {trainNameString && ( + + {trainNameString} + + )} + + + {id} + + + ); + }; return ( } - keyExtractor={(item) => item} //initialNumToRender={100} /> @@ -225,25 +340,3 @@ export default function AllTrainDiagramView() { ); } -const Item = ({ id, openTrainInfo }) => { - return ( - openTrainInfo(id)} - > - - - {id} - - - - ); -}; diff --git a/components/custom-train-data.ts b/components/custom-train-data.ts index abe330c..9fcc0d7 100644 --- a/components/custom-train-data.ts +++ b/components/custom-train-data.ts @@ -1,10 +1,10 @@ import dayjs from "dayjs"; export const customTrainDataDetector = ( TrainNumber: string, - allCustonTrainData?: any[] + allCustomTrainData?: any[] ) => { - if (allCustonTrainData && allCustonTrainData.length > 0) { - const customTrain = allCustonTrainData.find( + if (allCustomTrainData && allCustomTrainData.length > 0) { + const customTrain = allCustomTrainData.find( (train) => train.TrainNumber === TrainNumber ); if (customTrain) { diff --git a/components/発車時刻表/EachData.tsx b/components/発車時刻表/EachData.tsx index 1e2f2dc..e9d5467 100644 --- a/components/発車時刻表/EachData.tsx +++ b/components/発車時刻表/EachData.tsx @@ -46,7 +46,7 @@ export const EachData: FC = (props) => { } = props; const { currentTrain } = useCurrentTrain(); const { stationList } = useStationList(); - const { allCustonTrainData } = useAllTrainDiagram(); + const { allCustomTrainData } = useAllTrainDiagram(); const openTrainInfo = (d: { train: string; lastStation: string; @@ -78,7 +78,7 @@ export const EachData: FC = (props) => { const getTrainDataFromCurrentTrain = (trainNum: string) => { const customTrainData = customTrainDataDetector( d.train, - allCustonTrainData + allCustomTrainData ); switch (customTrainData.type) { case "Normal": diff --git a/stateBox/useAllTrainDiagram.js b/stateBox/useAllTrainDiagram.js index c86c638..06e3a92 100644 --- a/stateBox/useAllTrainDiagram.js +++ b/stateBox/useAllTrainDiagram.js @@ -5,7 +5,7 @@ import React, { createContext, useContext, useEffect, useState } from "react"; const initialState = { allTrainDiagram: undefined, setAllTrainDiagram: () => {}, - allCustonTrainData: [], + allCustomTrainData: [], }; const AllTrainDiagramContext = createContext(initialState); @@ -14,7 +14,7 @@ export const useAllTrainDiagram = () => useContext(AllTrainDiagramContext); export const AllTrainDiagramProvider = ({ children }) => { const [allTrainDiagram, setAllTrainDiagram] = useState(trainList); - const [allCustonTrainData, setAllCustonTrainData] = useState([]); // カスタム列車データ + const [allCustomTrainData, setAllCustomTrainData] = useState([]); // カスタム列車データ const [keyList, setKeyList] = useState(); // 第二要素 useEffect(() => { if (allTrainDiagram && Object.keys(allTrainDiagram).length > 0) @@ -54,7 +54,7 @@ export const AllTrainDiagramProvider = ({ children }) => { fetch("https://n8n.haruk.in/webhook/jr-shikoku-position-custom-datalist") .then((res) => res.json()) .then((res) => { - setAllCustonTrainData(res[0].data); + setAllCustomTrainData(res[0].data); }) .catch(() => { alert("カスタム列車データの取得に失敗しました。"); @@ -72,7 +72,7 @@ export const AllTrainDiagramProvider = ({ children }) => { value={{ allTrainDiagram, setAllTrainDiagram, - allCustonTrainData, + allCustomTrainData, keyList, }} > From 980b251d435cb7775fd0aa8ac2d9de63051011d7 Mon Sep 17 00:00:00 2001 From: harukin-expo-dev-env Date: Fri, 8 Aug 2025 09:25:40 +0000 Subject: [PATCH 12/16] =?UTF-8?q?getStringConfig=E3=82=92=E7=A7=BB?= =?UTF-8?q?=E5=8B=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../EachTrainInfoCore/HeaderText.tsx | 73 ++++--------------- components/AllTrainDiagramView.js | 45 +----------- lib/getStringConfig.ts | 60 +++++++++++++++ 3 files changed, 77 insertions(+), 101 deletions(-) create mode 100644 lib/getStringConfig.ts diff --git a/components/ActionSheetComponents/EachTrainInfoCore/HeaderText.tsx b/components/ActionSheetComponents/EachTrainInfoCore/HeaderText.tsx index 5483c87..2b3d322 100644 --- a/components/ActionSheetComponents/EachTrainInfoCore/HeaderText.tsx +++ b/components/ActionSheetComponents/EachTrainInfoCore/HeaderText.tsx @@ -10,6 +10,7 @@ import { InfogramText } from "@/components/ActionSheetComponents/EachTrainInfoCo import { useTrainMenu } from "@/stateBox/useTrainMenu"; import { useAllTrainDiagram } from "@/stateBox/useAllTrainDiagram"; import { useNotification } from "@/stateBox/useNotifications"; +import { getStringConfig } from "@/lib/getStringConfig"; type Props = { data: { trainNum: string; limited: string }; @@ -50,81 +51,39 @@ export const HeaderText: FC = ({ // 列車名、種別、フォントの取得 const [typeName, trainName, fontAvailable, isOneMan, infogram] = useMemo(() => { - const customTrainData = customTrainDataDetector( - trainNum, - allCustomTrainData + const { type, trainName, trainNumDistance, infogram } = + customTrainDataDetector(trainNum, allCustomTrainData); + const [typeString, fontAvailable, isOneMan] = getStringConfig( + type, + trainNum ); - const [type, fontAvailable, isOneMan] = (() => { - switch (customTrainData.type) { - case "Normal": - return ["普通", true, false]; - case "OneMan": - return ["普通", true, true]; - case "Rapid": - return ["快速", true, false]; - case "OneManRapid": - return ["快速", true, true]; - case "LTDEXP": - return ["特急", true, false]; - case "NightLTDEXP": - return ["特急", true, false]; - case "SPCL": - return ["臨時", true, false]; - case "SPCL_Normal": - return ["臨時", true, false]; - case "SPCL_Rapid": - return ["臨時快速", true, false]; - case "SPCL_EXP": - return ["臨時特急", true, false]; - case "Freight": - return ["貨物", false, false]; - case "Forwarding": - return ["回送", false, false]; - case "FreightForwarding": - return ["単機回送", false, false]; - case "Other": - switch (true) { - case !!trainNum.includes("T"): - return ["単機回送", false, false]; - case !!trainNum.includes("R"): - case !!trainNum.includes("E"): - case !!trainNum.includes("L"): - case !!trainNum.includes("A"): - case !!trainNum.includes("B"): - return ["回送", false, false]; - case !!trainNum.includes("H"): - return ["試運転", false, false]; - } - return ["", false, false]; - } - })(); switch (true) { - case customTrainData.trainName !== "": + case trainName !== "": // 特急の場合は、列車名を取得 // 列番対称データがある場合はそれから列車番号を取得 - const distance = customTrainData.trainNumDistance; const number = - distance !== null ? ` ${parseInt(trainNum) - distance}号` : ""; - const trainName = customTrainData.trainName + number; + trainNumDistance !== null + ? ` ${parseInt(trainNum) - trainNumDistance}号` + : ""; return [ - type, - trainName, + typeString, + trainName + number, fontAvailable, isOneMan, - customTrainData.infogram, + infogram, ]; case trainData[trainData.length - 1] === undefined: - return [type, "", fontAvailable, isOneMan, customTrainData.infogram]; + return [typeString, "", fontAvailable, isOneMan, infogram]; default: // 行先がある場合は、行先を取得 return [ - type, + typeString, migrateTrainName( trainData[trainData.length - 1].split(",")[0] + "行き" ), fontAvailable, isOneMan, - customTrainData.infogram, + infogram, ]; } }, [trainData]); diff --git a/components/AllTrainDiagramView.js b/components/AllTrainDiagramView.js index 95c6c60..e2d2987 100644 --- a/components/AllTrainDiagramView.js +++ b/components/AllTrainDiagramView.js @@ -22,6 +22,7 @@ import { BigButton } from "./atom/BigButton"; import { Switch } from "react-native-elements"; import { migrateTrainName } from "@/lib/eachTrainInfoCoreLib/migrateTrainName"; import { OneManText } from "./ActionSheetComponents/EachTrainInfoCore/HeaderTextParts/OneManText"; +import { getStringConfig } from "@/lib/getStringConfig"; export default function AllTrainDiagramView() { const { goBack, navigate } = useNavigation(); const { keyList, allTrainDiagram, allCustomTrainData } = useAllTrainDiagram(); @@ -75,50 +76,6 @@ export default function AllTrainDiagramView() { }); }; - const getStringConfig = (type, id) => { - switch (type) { - case "Normal": - return ["普通", true, false]; - case "OneMan": - return ["普通", true, true]; - case "Rapid": - return ["快速", true, false]; - case "OneManRapid": - return ["快速", true, true]; - case "LTDEXP": - return ["特急", true, false]; - case "NightLTDEXP": - return ["特急", true, false]; - case "SPCL": - return ["臨時", true, false]; - case "SPCL_Normal": - return ["臨時", true, false]; - case "SPCL_Rapid": - return ["臨時快速", true, false]; - case "SPCL_EXP": - return ["臨時特急", true, false]; - case "Freight": - return ["貨物", false, false]; - case "Forwarding": - return ["回送", false, false]; - case "FreightForwarding": - return ["単機回送", false, false]; - case "Other": - switch (true) { - case !!id.includes("T"): - return ["単機回送", false, false]; - case !!id.includes("R"): - case !!id.includes("E"): - case !!id.includes("L"): - case !!id.includes("A"): - case !!id.includes("B"): - return ["回送", false, false]; - case !!id.includes("H"): - return ["試運転", false, false]; - } - return ["", false, false]; - } - }; const Item = ({ id, openTrainInfo }) => { const { img, trainName, type, trainNumDistance, infogram } = customTrainDataDetector(id, allCustomTrainData); diff --git a/lib/getStringConfig.ts b/lib/getStringConfig.ts new file mode 100644 index 0000000..5295f04 --- /dev/null +++ b/lib/getStringConfig.ts @@ -0,0 +1,60 @@ +type typeID = + | "Normal" + | "OneMan" + | "Rapid" + | "OneManRapid" + | "LTDEXP" + | "NightLTDEXP" + | "SPCL" + | "SPCL_Normal" + | "SPCL_Rapid" + | "SPCL_EXP" + | "Freight" + | "Forwarding" + | "FreightForwarding" + | "Other"; +type types = (types: typeID, id: string) => [string, boolean, boolean]; +export const getStringConfig: types = (type, id) => { + switch (type) { + case "Normal": + return ["普通", true, false]; + case "OneMan": + return ["普通", true, true]; + case "Rapid": + return ["快速", true, false]; + case "OneManRapid": + return ["快速", true, true]; + case "LTDEXP": + return ["特急", true, false]; + case "NightLTDEXP": + return ["特急", true, false]; + case "SPCL": + return ["臨時", true, false]; + case "SPCL_Normal": + return ["臨時", true, false]; + case "SPCL_Rapid": + return ["臨時快速", true, false]; + case "SPCL_EXP": + return ["臨時特急", true, false]; + case "Freight": + return ["貨物", false, false]; + case "Forwarding": + return ["回送", false, false]; + case "FreightForwarding": + return ["単機回送", false, false]; + case "Other": + switch (true) { + case !!id.includes("T"): + return ["単機回送", false, false]; + case !!id.includes("R"): + case !!id.includes("E"): + case !!id.includes("L"): + case !!id.includes("A"): + case !!id.includes("B"): + return ["回送", false, false]; + case !!id.includes("H"): + return ["試運転", false, false]; + } + return ["", false, false]; + } +}; From 00e43772a0eabe89ae05fbd4ab61776d2c792ace Mon Sep 17 00:00:00 2001 From: harukin-expo-dev-env Date: Fri, 8 Aug 2025 10:31:33 +0000 Subject: [PATCH 13/16] =?UTF-8?q?=E3=83=98=E3=83=83=E3=83=80=E3=83=BC?= =?UTF-8?q?=E3=81=AB=E8=BF=BD=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../EachTrainInfoCore/HeaderText.tsx | 29 +++++++++---------- 1 file changed, 13 insertions(+), 16 deletions(-) diff --git a/components/ActionSheetComponents/EachTrainInfoCore/HeaderText.tsx b/components/ActionSheetComponents/EachTrainInfoCore/HeaderText.tsx index 2b3d322..9caced5 100644 --- a/components/ActionSheetComponents/EachTrainInfoCore/HeaderText.tsx +++ b/components/ActionSheetComponents/EachTrainInfoCore/HeaderText.tsx @@ -11,6 +11,7 @@ import { useTrainMenu } from "@/stateBox/useTrainMenu"; import { useAllTrainDiagram } from "@/stateBox/useAllTrainDiagram"; import { useNotification } from "@/stateBox/useNotifications"; import { getStringConfig } from "@/lib/getStringConfig"; +import { FontAwesome } from "@expo/vector-icons"; type Props = { data: { trainNum: string; limited: string }; @@ -49,9 +50,9 @@ export const HeaderText: FC = ({ const { expoPushToken } = useNotification(); // 列車名、種別、フォントの取得 - const [typeName, trainName, fontAvailable, isOneMan, infogram] = + const [typeName, trainName, fontAvailable, isOneMan, infogram, isEdit] = useMemo(() => { - const { type, trainName, trainNumDistance, infogram } = + const { type, trainName, trainNumDistance, infogram, isEdit } = customTrainDataDetector(trainNum, allCustomTrainData); const [typeString, fontAvailable, isOneMan] = getStringConfig( type, @@ -61,19 +62,19 @@ export const HeaderText: FC = ({ case trainName !== "": // 特急の場合は、列車名を取得 // 列番対称データがある場合はそれから列車番号を取得 - const number = - trainNumDistance !== null - ? ` ${parseInt(trainNum) - trainNumDistance}号` - : ""; return [ typeString, - trainName + number, + trainName + + (trainNumDistance !== null + ? ` ${parseInt(trainNum) - trainNumDistance}号` + : ""), fontAvailable, isOneMan, infogram, + isEdit, ]; case trainData[trainData.length - 1] === undefined: - return [typeString, "", fontAvailable, isOneMan, infogram]; + return [typeString, "", fontAvailable, isOneMan, infogram, isEdit]; default: // 行先がある場合は、行先を取得 return [ @@ -84,6 +85,7 @@ export const HeaderText: FC = ({ fontAvailable, isOneMan, infogram, + isEdit ]; } }, [trainData]); @@ -99,14 +101,8 @@ export const HeaderText: FC = ({ { - navigate("generalWebView", { - uri: - "https://jr-shikoku-data-post-system.pages.dev?trainNum=" + - trainNum + - "&token=" + - expoPushToken, - useExitButton: false, - }); + const uri = `https://jr-shikoku-data-post-system.pages.dev?trainNum=${trainNum}&token=${expoPushToken}`; + navigate("generalWebView", { uri, useExitButton: false }); SheetManager.hide("EachTrainInfo"); }} disabled={!updatePermission} @@ -125,6 +121,7 @@ export const HeaderText: FC = ({ {isOneMan && } {trainName} + {isEdit &&alert("このアイコン、列車データはコミュニティによってリアルタイム追加されています。")} />} From fa664a15bd95060924c249b5ace7c773cccc06cb Mon Sep 17 00:00:00 2001 From: harukin-expo-dev-env Date: Fri, 8 Aug 2025 10:41:00 +0000 Subject: [PATCH 14/16] =?UTF-8?q?=E7=94=BB=E5=83=8F=E5=B7=AE=E3=81=97?= =?UTF-8?q?=E6=9B=BF=E3=81=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- assets/configuration/layout_tokyo.jpg | Bin 27640 -> 42363 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/assets/configuration/layout_tokyo.jpg b/assets/configuration/layout_tokyo.jpg index a0c06bb25ab2f59669e5536d89994f390b6661f0..128c58258dfc7636c06096872d86273ef8f1e08f 100644 GIT binary patch literal 42363 zcmd421z23mvM@S8LXeOIf@_e$B@FI?U;_*?Snv>haQBb|cV=);UT@@IjK` z65JsqkG=2R=bXFmx&QnB@4feZuUSL)s_yEl?yjy?UETeA_V;&yj)IS!H2?sC05|~v z03HAb3k1NvO_ARIKv*OIoZA@d_74zl2e|WR8URqdjRByiAR+OmqPNczelc+YVR0eh zKft%)_cy>J6-BTj0P7a*Pu$=0fad@lZ0tXt+i>Uhxr=xA?wvb#3GUs)#k)^%|2`oB zAtBKNl1D@jh#wFVJ|cfa{Fs!CjO_kH3QBTPN)l2s(myJ}!nwt{a~J>aU3^j^LL$=t z2yth4r~&$7J4jAiKQ2g=K!%!Qm|x+FSBicmIV4 z008%v$UQvlKX}w224G`hW8b;^fDjk=mf2fA|Kx!fmxPgDR?FOV{N8PkfrOy9)Ng5b zkW(-TYwNhb3;u#;7LY?E<_SK3RrCFTC11n>$a?r21GtZK+h}4OVt@?bRPC>3|2@W1 z&pBDUTA?7-E^HHf-PkL6YP{zV^mu{oilhD0;(0U{@~e->Z-DXs2)pBoCfd1GJgCBZ zgH-sivDUsd#mq`$PF{)RH-N^dC$;*UK9zqjWNPxf^W-_84$9t|Q6e zLS&rA29O-h9XkVtn6SGmvRrXXsf6@C$bI3!?o^TSAF(pZyaJ-5ny8%Bv=RYF&JDqh zNPk?RS{qCtM@DgV_NtynaK&?LQ{9Fvc-@?jrLlhr&&Kj#_z3tpZj*el8x#oLc7=oP zAZeUGZhUZM8&Ud3^;sB9%S9wUgEW+I9osrFbbuMN7(DzQQI2^06D8^6o*UvVUO(X( zSn7eeQ~P-QRcEGH{Zu#0{vAZsA`=~QN4S1{j@*mrLw z;%4TWcMY;)xlM+G{8&_6a9v+RBdVVx@1Sp<80aDR;2NqlA zwgoWl+GjYQaVCwg&FHt=9Ukz7GeO{tjWMFfB`m@ih>F%R@uNtdTCt$*$5S>WffkRB z-bp*rhkRPFFBdG^<0*bw8|3Q_q_-`|LJc8ULM zjr`zNh1URDDwSlXz?Dtczu(5#Pjoc)i{f@4i~*F1ADJY znau0aOY&cg3${>^5~27f@ktiRANPMfOT|o{Dq|?QRy=W`q%QfmM z_ry?v555YK=zYEEoaSGx)FENMdRT9owtZqfT;wd?4-S+h^hG%pwGAs;Okso!rTpLo zC}PW1gP0FzDN0!=Ff-qqUY(5A;XhfUXRyEd4N$7(ReUv>W2B)RrRsnP)>F>)h_R(M zDLUCHG;o;JGzH1Ql(k4Qmp5P)Iqw+xw|mlHM7zG|$JS%tbP41|KyI_Z94*EPNvc$= zB0JCUqL}T_X5D5YVHV27OPlQ2`aL-&wWu1OTZB$HpITQFv4Jf*T=7gV8#vfn^N0y zsV6lYEOBbfXbVPg&(jJBYh}og?@Zmv3dW*D%5v)`?O?&Ys$H>BAwm|OSjq5F9=@GS zF9zx$NkTy7<>gK80Cw>j0jmn10km)alDfagq+9#yW)=Ld3gZ3~sXH<5qq-yOy@ygA zL3x=wH(z}|QbW$eHBLuh-~I_1)|SRJkh<|*+N^Bp}J_s}v`gc_JY9Yd$vV2zAf_iQ>z><4`wbl2kPnaCOVSc$E{ z3Y9tKxW@!)UbQ*b_ohAS#l?kH%ol!^%;LX^t&I zORqY-wc!=TEj7>uCPVdXHGySgXjXtV^Ld8VE7a`8D{rBk%}&_Spqr`NuegUM6;1Bf zqOOBSMx*6x-r%-vy!V=ss^%)46@}?R&2sX!I}5wb2MUq zJpd{lTn{moRU~m{|7k5wRr3msoS?SlQ_(gcpw$CZl^WAJwZnJ+6+vIuVjg&v};gC1X}^ z@QWsy?B(9p5=sB?GLh9Mv2$YVdJGhtwq4>TK0f@Mw+VHdb~QL=$~6k}o8umpGv6ix zMH8oytnzZFBqWIr3?VFi_NZbfAX5+pkbRvnbi9p2y&6g*nemVkL~n}OP|AE|T%qrz zXQ@wxIOk(6S!dm6scM$DN&Iqr-`nnL%4KV+RWBL3noW70qc){1Jlr$%5wWq(O@Iio zuCuIBs!vK$I~5P7{#aVy{sV*Jb!_$zR}Q5XNBng94G2{FeEf|>aWHoXQnj4;3pKt9 z{6J$+UhM^$5pJIpd}f3%G^n-Tp5MVAylgSINLincq1Ld2GCyq`?k(VNod~neGfYr1 zb?=oJ&`LWda4B3+;I&var}XAxb_ZZ-p5O*oTvb8FiGWSc;+e&cQN{|*7#$xGx}Hbx z_R>pfaj&ew%mR|c?&upaZ{M|rR_b!S!Pzsq z8R#bnr}yG_fBWpdU^hoo?W*tP9V0p@XK`e%OGLjkjoZ1Rm#wd^41ddD&81gQq=W8zmd=78g0+ zWyT?=zxG>IGk`9PS}bTX+T8d+_@7hMIM<>L8F$wI|i#=^O_=ZL(=CZ(lG zn0$5^GB21rB4V=gS^ggUgm4jSf=j(Kj4T2o=Q2lr#@a~kpJ-ISZ$Rq0z*K4Kt;1Y~ zYUA1Z4e0;$rW00!bwUCc3T3(Sm7~38dw5hYH7=vP#JL`l0<#~9&@L3J>P~;c-||CE4G z@7V2Ty1j5bVR#9n+0$`bp~np(jXS=jh%~hmFiuBJuXa<%Q83xuki;^R zQA;^78m#8(zg0iD2%G;01Jy3S0bCY~k53|24~Q6wd3@)gqZzDnBIkz&oQUI^vH}A^ z6)t&_A9(_eQ3+(Ny@Mr?0z9bR5D4-PkA}!Po84)u>_%jq%PXC0cisFO~!|4 zBA!kcE?*U0((SdQmpQj>Y~U3hY6~NC4b%dX=XZR)!NATgU zd}^)>Vv0|C#Y!?V8srK4rEqI?3T--etCn*%G?pAEt+8G%Sk6_sM!BLwCkyHNfm`yE zJC=Ftk18f4q&3e%C&aT$4Qvrk$c0Gu=!Td>3Rv}-?@w%}4ay@*HWFXPIqUb5S+mD> zE#a?BG!j4fwW`KDlzOii%ORQt%~VmV9UARG$acOI%h| zG+yPBo@t?*m(VaIh!n$r>(T|zmaf3~dnGTGw#%L*Ag?Iu3XnhUdDWpXgQ}_8H6(kh zoNy~x+>(omozmv`M9avthbC|AseOx6dP?VAOQ%uRJg`(o7GxV$hn^$>ubT{3Y!;T8 zr-kLY5Ce2=Nz>WD>!etVI_ih@HxWi$$Of(=iufc}T)o@d%<{u&dr4*4)Apt{_F=cy z#e#LRxYq&E)&K%NiDGToWPuc~?#Kk1-k@Vr@+`$c+g4p9MphvznqM}{Ybwm3SP zGAaCpIF}`oneKx~=t^#`6!zCQ*u_#Ghni!G2#R6GTW|{%nAXP(Ri6C}QWd5ppvyXW z?d^&+UbCnh+39CIMc^9%5KGT}dYo$ix;S`>pcG^Cete;E&!E7Sw!B-m zoQM5_3Z$@^eB<;A;25Ym-1@jca{+xL=2MdKR*$znaJJpY1=>!@9W*3)!25RgR7zOn z_+IUd`@+!C`I@UFGP!A(!YvA^k6hIFE3!0R_Z`*EK!y#Fh&P{Ysd z#x**MV`3@mld(mPUxl}@Oyu6<8`7_4d)K$NBki`stry{cCtw@Q?eCSF_2sWoMuybX zd|fpB1Xmj1mm1T^^2$0ovwT@Ka<02>S_@e@7-T-VXP4p9>nFzD81czakQzOGZK#0z z11SIvTUJY`V~L#B{mN*(#n1gP0|R`7(@)c2Vd6eJz2)~~%g!ah_(y@YTHFvT5Wzw0bN;|}0dY?|PX z0dwQx987yVuB>WCah&nw0&Mr?+85wJ?Ohv}4yzSjH9Rk;FHmKY27?f(grDsMm`C4$ z@eGZ@90Wj?3pnyfQ4;;hFJ3Pnoh;njQZhY>OfRngdc2Cf@ikZYK}02ix2sjCB2&fl z(#_s7FwdXq$iThy#|5Ul_=IvJYKrCb!P4anVZ3zm!uD$mxtVgE?-lSZgXf6cZ! zY=9a<+|Vp}a6|03#6(?pm5|6aVU%8kN!P3p&*7AZ8iiFJHv2N#d$_-BV;t|Q-esMP zmwvw_6F(Ic(~^5gPKW_$^}7h8w!=p(OIg>#3)T7j5iBJVtno&hi!uxk0j>UgKfvZc zW*{oXk6M6cuD}_x^kSf7{uYaO$I!H;_{Eh1f?;zCmx| z%(02lb=G&grcaVRkB#Go`5PDdgI>!(mJxsIEGmcQuEanI{$bnCLI0!2HkOZ<(te6Z z5gw}PP0Vw?9hWVBof)LO%buxc=oyZfOah~dmEP%uzzgR<>lDz=y}TNaxeyd;md>t7 zZdp9SL@lil0=@hU9$oij z9E^SgG_A!bG#pZwzz2>S)Y^liA<=ag@=hzn_4TPnSv9F7nBn2zO>2?Zaecj$I@`83 zH%B=t*Mjp3he1qfWZowKkwkLYF=c+4UCv~~;p6JUYyyF-UD0cYjG)f$=iK$|(^08Z zehKre0lxt~xstCV>UNXue(hl(ZmTiZW3A#}t=5I)_@cxoPFYMs7RqhXdZ#D|mBwDd zxh&|MkSRau6rAKHx`8v!4=0wU=rE*YVM0H~|S$}gpwVKKNvhWO_9?5*ynGBe|`$UBHi}_52t%ycv z-0iYQY;CPCGwOZtPi=;_TVZ(B__f7$Yw9hq4^|{*kTv&RZ6dK9Ed9MQEyfmds$6#L zfhaYsPO=%_uMNUg8c55|=70^9jE-(|8f*$9zCv|34Itfnj_e!5WfQz+e+Yt?tkhP7 zfSOnBM4J|3fnC?BcQWUjbfy5?A)x(JiDE{H$8?+T#G&GEdU ziUSKrAKrfrxIbD#=O`0lv7N5W*To+N5D-vtBfQNxyX~ErM_B(d|Ly>+ZT{%9@IN~5 z3xFzpF+s`i<p{zNVZR`Kb4W3`hz^uWHzLc+ zc&Dy$9d9TiJ`69Wt?D5U%rI6(02*^-9kBi?XfD^l>czqO*h1cL>1W@Sgiu+^OMS>r<{ck&Id|q`s?n?056^fvDB+LIP~F7YjY=VL~OY0z};;VtQF@__zUGW$u>X=Ez#^ zCci3&Df$onp^y*FbxbVCz2?13r*czC3!Il299u)Wxx)CdEq<%UQ(4GS+(29b0u8M; zBU)be1yel4%U5sP_OM{L$vI!!1nK)&$4lqjCOs&^U%2lj7sm065fOQBDB=z$<$};PLSTU{=R~4wQNXjoJ@5v2t70m$j z^IqwIN3oJ&mT{(*!73WEn&K$5#sXmAaHo9Jk%PE)ol^&`l-}B9iF9PnTDwM0$*hIi zjl~J?71giNbSdvt9%orzMD#a9BJQb@oHZ0GSgZN1iA~eX89R0jD3T^}!&B)IbS-=h zz$Ed(NKaJCkzOb`XWX1!}Zhqh}6P_t+}Y5NsR^Ru9NlIYZ)ZgVBW2jwD3NYz&mq@vs%YM zt!Uj)EWWAT4aUxejENAZ^c;|7V6l&y-i^xKuLHE7q+fO?H8VehPyPq3b>YMPy^KbL z+E63$Au(q?SrIxGtgt&Om06#SAHHQx74cQK8f8k<-L1sIR+**k%d1pl?H?;!s@Iy# zI9*Ie0_s52D!PZe^d0c&bxj-VD^xyh816D6YI&~xBO+e6u74-dZlki1kJ{o{iJ<0W z;zry+B=G8X;eXl#@~UHe`N31gnf1u7tj1W9&$}#mWja;dgewN;QGG!nL7&=e-$%~q_CNIERCT*n%FI`m7+s}6q1TOF4F9=KAHc9yd(K4f(>?>Z z7k_;7zo#JaCFFi>P5t52is%AkD9+W3SGA5}G&~+}&=pFyrBiadw@vw`mOp+3crYQ@ z_dnL@=`F=CH0V_b(b_Apv|&!aTFnSr@Ur=AJ{*)Nd&r>eYM0-wtcauqHkHMTuzvQ- zmb!4$bW}F)wCiFJ*HH>)++0e1aWY6ST&TTOF0APA!C4xyo8!_KGikH3zDFQYSqJm9 zF;kgq_}0c-!m{qKGgmGizm~^rTZQDEoyj<_3Qma#};pH*!D|qC8W?e6o`k0S=OfQL`J5;>7 z-T4W0{pV4UP~iBzLbPyw=B-LE-# zD7Cg&*MB(Ol`$-*O32MoXvG88kBK?3*q)kq6%Xlgs?#x4Yal^eiCV>dCx4A~YA!^| zOs4H%YL~QDIIYVIn@Y}cEhVGko}RA3oViN2W<_k9nnS=wlH|y;am-;qeC18LSI8ur zpbg|?LOr)h8^%Szp-SLu)y=8p!P0by=3>+7NhZ&)J1uMCM(wGL#5X6WD93E5ti-=Gun=)6PsWox zTDkM5_YjtOptabm>2)SB?M387sV>4oTIwOR*pkznNeX zzHEwa`9@O?d+%D_Qv#$HU*)O4f2nwcSW?%xyF$J0!_7H7fP%$ZrKmW%Y~=Ra+o5Mu z;9g%8Ca;HbgwR^dM3?i}?pM{LPjn;&8 z3beB)#iz*A3Q6XGO>x2#JgIWpWAY|A#_>Es7O}(T5xWDP1s5bwV^=&9vnby5AcjpH z%GD#WgN*v^9#DIe#7(gjBqA8OIypP<7i{$q_##u<-Rx6^&yO>Hp$gi3^>+}43-~{d zcptKM&Maou-Q9gJ$gEjjH*HYfcDG-LasuDdsg15LLO5k3oVQ$TYxSqa@VyMUO3sQ3 z8?%aer(AT@t?K?Z`1uv)6v%P7HDg_$Ctzn+mrZA#bigF3IwJKUxq*K0xQK#f@Yh^O zlOXKf@OJclW;U{w6V)%TnVOErtY2f@L(_n#3#m`0{aP*?e}+Rm>Cjvb;z#vl-as-l zHu7_O?&-=U4I9oue6Z$Lslf7rmFSdmsI=_I~m|YP$cDfvrCFso7KG z4?hzB|H`uL0^rmRgZ>NZzr0{|+q|RJ%Qu1lnAa;eOevo|U>0Kx@I8mxygSHwDnc<8 zl2&}}x45B*_A2J#?%(d3p4B4$b}8t)+)j#YgWLF;Rh4h(NBa5T)5n=RQ+Mxv{6&xm zzGzwf87+{%9W;C7EK&VqDry;W8Q0!eMXTkqra#}BcL)T7eMl{N>ADN+r)I57>d0xQ zawVc2B5i&#eTkK^<^q!AhRmI`D`zA$DyKiG>RR+4CCkNkCJE{Q5~~uTxKwRfjuJ6n zxiCX<*=A_;eb};lR5E*;vH}tvBCY0TRPAfC#{8*nNBxsf-s{ZV7v5gKQVqRokZZhe z3Aj*08*H~cP*+oJ zrk%oxWf>|IVnjR!Z3iZ1%gxQjP~2KRgQoPw4!v$@wMh5n+VnA!5NA=Rddu>z71WEx zLw3CzLA1(Ljic6XFRaR1Cmq~gpJv9c#-Sqg*t+!)1SIyxEuJuj9ph?xozpoEdiQI* zGBTY!muy{M8vns}uls53j@C_?aT2O*dN@|H!7A}Jm=*A3<6c4tjb zP~+h6h=@3P9)uWe{9V{%8&!OTiNm_RCkj0d-85Wk=_o| zfo}Qv)fUDX)q3Quqry6sxCB~a?$yBFBWwbrv_19}c`{)H^R8)vXJd8si5l!%$XJ-< zN&2A-e&ku~E0?YVA?UJ91GK*t;|nXusQ?36CNy9e^a3n;UewTZMEIPuj&&XaM9imD zR6C21XRNF|St_VV=L4TUG_Z}E)YbNf=SwzBzSxafhr=n{>nOU{;f$!-ZITsxFiP3L zGD&Gf(S(I_q|2keq;65a&B%91hx3P4LI*q~(Un>R-!f24rw(~Vn0Rndhx1fRgQut> zBk^NF=GO_jY!ZpHg_(z(x}t*!fxRP}P7H{+T0C8l#3!kA`F+9hrg--qpTqs=A{;Vp zg6dKpJE*~BoBY*;Mr}?H;)C3oVX2p|>IBPImS2v;)_>LO#_qdXUhmz8T1b`@l zJrr&Ck5&D^Qd=imdi2>+zBY-2HW#m3HTvBy#114M@*5CIpwen>F@|MQe^~w4>&I^Z zG$Sms-$MzLH3#?V%HHixjVA2B8n+L!QqRt6q37gf;IQiX^lij8C(+boi%ckbI{Ae$ zo1)*SOro~+t*guOjHLUMmQ#Q*gPrAy`umhnmLo+)17@->qiXswJ#*D$-@L6O=PMd( zj3XSgC_uiF_5P?_YB1Z6SOulz(jE)2r*28?cYv5=Fs(seh3 z%V&TG{=m=wqI>=q$vfE}f;_f!ZXM%YuUK{ouM2gK*e?~?n(>e0CUQ)NV#vjowp$0M zBO?H}t7XgosUjS5gYPw@+D-x{=T&=ktvg?P^jEy313pEs3tIus9@z`=#Rfg+de^ za39vw?y$Ys#@)}qov;{z%E0%}+!93e#lOu^>l^Hl2Yk2+s#Kpg3`;?(hz=Si7!8x_ zNT{0lITl2Ql~_!%l1XL;J^U<>ysVb)|o#0xB z>y}PHQ4P2?U{(Ae&l(mu4;SdGkVVu-g{;-U`MCzz9Yw47nqeVr2#`ZgS25rmEU7&{ zW^MB$n!~`zWFlEoF{AVoH@e@|!FS_JE)_iX)ZcH{U@}=8G-$}tx@7G9>btLXjv}Z` zmAvW&Wa@57@M#EG^=AVKOLO?69N_R5A8v1D+q&%c3r*bHv5<5qm3g}fMDSQXnLT2Z ziti!Lnc}6<+&OG>lB$>Be4; zs+m!TVioUw8dQmWo=?HttnN%gQpX)rtq}Y@p7L5ngmiNvzpOggpQNAtfTdxBg9qq34@?gwJjzZR%7#LZ3B#(IX$sz79o!5Ym?r z_K2I{FR||fRzE^5#QTp$gJrLQZ4$Q1|r* zJ$P%bJozKw(3bF%aW5wosB4i!5H1aUZO)=UUl$W_r>wN`hatr_ zZw~>fOf54@rs1&M>ldKZK`FA$i*bN?)DVLKh=3le(Re&DkOb5)u3=t2TzR-YsTx=o zoz>Sg3V2xbA0z-cqo#$0i@VQ$1K5soNjRmbTdkQZ{tglIFS+OcanG;4F`EtfNur7u zCbP?Y+ow+~0DwK7Qs@Vdp;bnqq||&*<45lf(wge)%Y6+6dA_ZQIe;A<3ZY2$FC+Q= zypId9#K%1R;vsUnB7X0G1Jn=q-p7BI7fx}6NqRWtr9X=97|>W@Y~*fEd6m3Xyf76j zd?DO_={C1zsZyVa=`hfaPUT(x_@>&EkRTW;i^AA*2&`)>G+OQAZT}c=cwgHj=uHN! zg{SwLca$fWQnVu?~p+^8LA)M8b%IOGFA;Veq-pAa9rkOWQ@ zmp}i+zFWn!UOc7+{gEjjFYi!`9?Xx!R~lYquzx9{V})0rQ)_%?)5LlK{hFehbWOOe z4fU_~b@4zH5uBG^wfOYpKl4kpnauyVqs0@Flrp(xF3~dI-EJ%jw~&-?v0SKY ziEQF5nv=cQqHOTCPfF|SK{bfQk5t*aWh z*zvYH!oN4JZWyP~IMS6UM?^H{fbs=)d51Ig%}jO)a(y)N=JoR{q>NDlbPqVXMLQ^c z<~&AuoIg}AeXC%#egTjp+eZIbY$*I%uBLsGHks)bs^^ouVIK+A=@PtzyX;yCP{hlb zycmIt?VLMh%I%4ylt}SfK_`*#Z%c_D=&a5}cQ`jff>QW}^y=;N^*O1d8VbcDC_-DX zmqcS5g5O1;STa59HdxF0fE3tY>WwudWgLmJ-W%+0nJbk^U;Xe<6KdW8e$sxet(dyx za*Qcfg)T_iu;%mOVZZ!qhC2FDoeJ>&J9?{teK}=lN{ki*8hZ<}val zb;AodtaO9CJ%WS0Z$3AlM6svR<#XRfJA9sx_EAnEzs07GX#J^Bkt+?0@Vn(ePU%D$ zy!cw_n3QkB#pTjI%a^27CoGM*^)?6i@}Az>0ociL)K#4Dn{vm|D6t=^x&BA4)D6m& zYo_1l6@I4qnf-LaCaS3u&NtsCyM~#0dMdvnRBhxCqT)~?8n8=sikpmx!DvydUAf7* zk(D~y^Jcn!nTRBTE;GE|3Rm*%(X$m{QWl~aW*^MvT%Gvr#Kh!$EurTW-Gff|TBy!u z-9gWQ(jkT> z`Vz@Jiy#Oy`{+%upWyit=+SKbgW7P6krPW&C=!j#1v7}2i2%7b>*mIqsXW2pb5+TE ze5a7l94{6ox^`ERVC%?6p_GMRM_&hOz6+biejR8NGt%*G+*|(*c*ihv305do4b#G; zvIasL$LIXg7LJUvGNXD~mk|g_ph>-tKNFzEg4G0f%7`G51grxi^>uv-)uQ8A5LhG8 z%2e%AS>mRSh#9&)@tQqZE~WROBfomlT9;_sQI-sM?YSK3I&?l_k!KmiofzKLci9wH zW{5+lX`yXa{z*71yJs}e*5v~KtM-3jpgeYv36%++x_S?gbk`tri zFxAGhKnq&_x3k*{YtQq(>eJfQi5{9c*Kiopni8?DDuP?DR+yRgzG-M|w$TG8G#YIK zvZ?ba@NZj3XxH_c-zl9KrD(vjn(m|AGZZbHgyHPcqIT6)DDRi7_U?y4y*1vRyle^` zHesww_L*^YGt6jm&=6j7{9*6@ZB#PFmvqHkSGH5IextXB_cf?_Q80=Kw^TXNf0C2E z7N#?8_1yC@t*V2%Z9^<2bB~Tu!Mi(0b@>>S8d2v$~i^3VbOB^`_1PuL1^CdkV%?lolSIm_S1Zy`L zHx~B`CIMAmCNd(4{m9DV2@k)8h5;iq8>>AS^~DNmW={=`>VzHq>y8H{6ODoXevb={ zOf~y`1&)3h*rfPFx&U`rhTi-&fB%aAe_``*Nh9=11kN^Q{QT?0DknHjq8J$O&T;8@ zk*}xjJ=DI)~Uf51i9+Z!UxoTe>Ilb$}|>HyU&W$I7p0~Knp-(cwy4Zn3xvrsCKE3IAf1U(H-rci5m5A^fk#|OTKBvqKAPe z7b0bn6?08* zhi!RGPq$s-2aU6jg&-n^4$9yZ{BNXKur_dKn;V`NIr7uE?WPNVEf|{trz+){7UhXg zX*D@zh9Nn+_A@js6G6Ni^f<+Hl{&?wZ3R62{Y~2*nI;&Ih=;NjU)jq%hh~f&(iZG^ zx$bR7i*5n@U;rfq;9gFfhDHnK?JtcrX%-znp<6@WCCLx2i zS*lJJG+j!alD=KCRSRAVW0Oyj#I+@LTDUPTi#xs1*v79QSMg=jR-OJOXw*#Jqc zn?5yX6Qqj~tkRHVjCX`Qped>>s^=ijnIT6~^MHVy)DD*gYF$=5g;E|fkC}MczLVnt z$d2_$lD-O@`^NI5Uz`&%eMyHCrynqp3#RJA4&un< zg7;9`LPL4Sr+GGc2Z_yD7o>rX9(3$K1(jqHS*P(!7l~}j=pV~#FCBeh0bjE>VBNGMmu4*8BnMC8;i7whqJDPOjH7) z>f9|*OQ7TcDZ<^=iH~YGx@AOcCwoe-aJ!s7ncCAc!#ycf*@zSjx8Po2gRr1DWnT`` zJ~dXF{U+1`G#s!Kq2MK}^6B@u7x?w0An-&q~A83C|n5&=E`Giu< zRCWfdwAQiR_`f^;6LJspu6ek!?krc2MY!QbVO};z&wS4jA~LS1uclL!@m-IMD+9H3 zjlHMHeqGSV@*g?TZz_HRoQ8|H=`1kzJK^&+Fu(8@XBk&3;;>HnR>?8p08Fl?^8jzA zo+tTId+}sXLJ9r{^$s{0fh~Gj$0{V9J-Kaom!2gS7hc{FxaP9h9Q}YS(@8lZEy-T0 z;W6X-q^gkT;9g<6qEbtv87|1j?B5XkMo?VfClJJC1ZxPZw3D*FEE#ibET>INk~F-?L}yT*J4i>3;IWjPDst8owKM=>QG{VRf+aH5U zbx$b_a*KJ5supZBKL{gFk&0%}B;!Z@`|uRi$PMg8yVucUWn89T;!dRnOHPZOd*Anz za8S7tF(Mf)6E}g>ctc9~^Iqd-AM&QAmRB`?9rm5g*G`Pemr=xITz$jK)#g#%*Qi@D zTI=~(F<&w@nKo%-q3h7^SOvnVqFhbMKBaO>FNzq<4Syg;GCiVMsz*NTwwY3&rB~iR z$!f(Kttu}}2~0wmb&(sa zQ0)bpf+;YlJBWE?`q9$J9dRY^K8xp$3zS6!_7as3xn*v%iRiZafK*iDL^ZbN5hI3R z1?7?qjY94l*I@}~L#`7+!{%1w$lrh^K;KL(!g1KBtypAeJM>j9Xz?vqIpchhd0|fA z2$$*ASRQl|vG64o?8->&&|64x_qnajj#Oy7onesLhYT?~*@!`Ba52wvM}~@_l5N;n zfX|_3iu7Wp_M~`k?aa)>2J6Yw2UWX5r=Q86-1WZpa@5e=p`S1_{$~+@{?gz563lUh z@A?N8f9CNLu-p6w6dy9@kKcM&Q=8v=w>;P=-HAl|sUEkGtmpqii@gD$ai7j|`+v|w z`4%fB#(k0q1fmnS4pT*|s(^Lk0&bKBqJxn@AXpk#u9&F3Z_*$oqdy#PO?&8~+NPVH z^ajVpmNor3c4Ad~(8t7KsjJHHz6-a7vqLzy`#tY|{SS*34}{P!_~|#*v((Y$G78uq zSS6b{vO)S>H2&_MTZEp#d189y6#3W0HJX)%QXLp|?k=}5V*`V|vbJElIrbz2W@bLX zwvqjyKL%D_ry$x+I$;|8ViE<7spC{A98j9#5zQ7c*_;_*>4k`s5h!rDj`}BS$4Q3c zD|FHz!Jv)4gz)}L2L(q}-&MhoLjl8xh_GNU*a?A!>Z>Fxajg{mj+0u3_`+GrAKEmX z2Qc-zU0t&7j?0uYW5YT9)*KXN!}d{)fDRvv(Mf2hc~I{f3tHYRB5_0Jj1ik^wFjbt zVlC(Ihc0T5Hu^%7_`@0O^x#uy)eV>Fa?u|lKB+Wo0n$!5j^BL(T(;>P9dEau_~e+0 z@^~pv7C~j>!;y$>&pzibZ>ec@+Z#-@Z#Nxf=?NoUrLh?%jSz=L6OIwvb*p0~Nf9P~ z$*dn2yyxYTQV6Bpw%r0A(ysD&5sLK^6ED&Tqbo2!2FeDjw;i`wY=vjD&_>VwuU9e3 z7y%YUBiyn#i-M%4UaQcZw9d%4%_h^H8v(Jb{+i=^}Md-K)L#|n~Vk!@1>vTec4T5ym- zKNbAqeh+#tu{I;w@B_he8QMk{=sA@BG-c$fFChu|Nz%@$5ut&7yQ{iEB@tuTy{Nbx zgMd-DkRtYKzE2OXuGhO9ke}?@pBAdyhf8g>Evb{_b`>Z^{V099`4sxIXrP$4LQgGJ z<$1}i3l5Xn|K#I~?=53IIq#l{deJDZ3E#Pww2i3iKyhZciTFcZ9g6VVZpDuCc6z{$E(4XeXBJdx7}W97I^=+uN~n3 zrHu;$Z&YcQ(dv#d(10J(~eFB zH)oY+WNnFN0IY1Gm$$dE_w&iKlMT?+Q~mCm`bw9Kkk4WShFLI z*zJcu`Z~F%prK&85~-43pZxL)q-gac(kaw#+prK3YhvdxMY$8I{jfrO zET-=$|0He-*lHr#11P8Nb(o*5_WqQnD&K}oR#9r)gfXxfxDZj^_lzox@+dxMUlXm$QoUtlkACfMwPF$_ocoVKKSL!7F)AK_e)qw3F0qDzWV_fg6%#;cH z=X@D-oN!*Ey-Y8ZaK1kDq8MKYg|M><27C4RqlWAR1f&6Yzviywt?4uO+6Did?B@qtvKQEJ=iCS0K62;r*g&*L6iBRIRVU#ffUg zn_zuEOfkv6pulL!DoNRUHLS=< z`iJlTCQnO< zKk^kDFG&d~WiG?IADBH8sHwlny!o)EdB23<=1w5?=yzb{TRtT)+eK1udzI3t%$V9Y z#`wRovCh0rPG!yB$G?{*F}xr-@raL9^WPy2IKH{F^}My@Y&vzy0b^;^>1EQPyI#tz zvfvpCXOt*bmx$QtcRwc5Eww9wbai*Dufa`V=0iKRU?V3Um}Dgv7@l&b7JqNZn%V6C zp48poNgkE#z{Lz3UF*qk`NG+n0S{{X$E5r0{+q5~?I`XPNHzDj%b|_w&%@s`;7x%>>-f();xVBxa~m?^X|`;Ui|~~ zr^TvZ_Z#5z^Ael#%~9F&eq|E?}j0 zBejP4Zk%^>CFnHo6#xrko&GO~|25f>xn(UmKfiyuRT$(ZaJ(N6E@0zHJ5DXRr{)=} zmj{8WWxPhDKm&1YJv(Kx7-`UVv!gc@x3`}I={Vj6Jk2eY=_~yV5PG}#=Jsw_jU9?N z*6`EjqY932?2wb50f%>T$&J(Jj+;Iys$qTtiQk?Z(A3A92@T7%f1BiK99x|>`vs(X zY_O)O;?mDzX}~)#`sG3aCf?>IK3}uJe-Uo-L%hwR<^N*uE#unSx_8l3p|sFKTeLuN zr!DU677d<2@IY}0?hX~)NpSZNAh>HO?(XjHQl!wEz4t5oeeeI=_ndRjxxf42@PW*g ztToq~bB!^_oO3+m8Dp-NV>2;7k6n#A5Iun@{<>ATMY*J6ab~`M_J#{5SGnE5x3V2`1>)_Pjp#=EV|5Ug$BOA+fsq_D zGN$nQ1i1_R{240Z1$SU~S!LVj-;%Wx#;WiV#^}v$iY@cNGi$CG-=nxmea=WrpaIDS z%~D=%6RMW8Y&DR(4i40DbPsH23hUJ8&<(%y0M1RtG}i^^TMd7O!u8qTYKPD-*d@fs zvh~1a-Q9U?3;G59?l`MPXBT`#6fvq~WwRMY&A1u~a9V?tz^UD`Y?6!f9mw4s2aRZ` zMLqK{)5(E*I>B5tUXzN}JFQje!7ug*n_+2(QIE$Y)a%sE!S8;nr3EtpT_33Aiqg?f zE3-E|GP4-<*aR{Lgx7rg`QgD-ogBnKI$KL|Zs@twgqB?m=rbwjb64U(i@*$CNXndy zrs9Kdony0|3s!Z@i$TG#D$OjZ5mG_$q^}CYbkKDv)X_NVmHwOv_IH(R#-2x<%@kYf z$w}FgU!vv1dCuutnt0n0w+!*FSy7Dod|4>X3O-mnizc`)Hzy{`P6H+LhE9fEFtLkE zg{^e&v0K|XDk=ddt9sdhmpWs$M=aXEEUG9Jx2^kfg1{6 z{o;V+GTR$8WBU$b_@WZEL=PRt=leQuxDPWdojxZAX3EGuC?7{nP-+F+%~X^px;vei z)K~xjtX;1$ls}!@_BSJqo`(O>yZ74;BjmEqNhiQ#_Cl6Ns(hpo3XDC|8tw+(Ks}kG zxPY_Yru>#_{s0x&-om?NWsi7?PIZDzR{{5=iNF1;^8B}s{uf~ok6p>S-f36X4Q^Dx z+GWez10AoxQ9s2`$WR=6)4u@t_#`gi51sLb`Z7TZk%xpoUQpS~sKBg@b+OynZM3%4 zeKWfq=FNknMI_4ru2Kp0&(J% zd{%K#Cj*}hXM)dG4GoJ7%a)!wG$O^h1xzSTBSt(QLHT0578u2#6GPXvb}%?td&{lA z@B3BJ=H483_Z2u(*_W?dRz&K>iT0MrhsaO03(fr#8+A>2J?H5^U+sCh*IgAf!Px4g z0z4_R9pY0%7PHG&osP71^=uil@cQS%$&jb7oZTi$&^)FFm?7)g|;`6+HG8cS-B9U zkPsX%nJKjK+4j|TMR&C0XdO6LCRZS7$u31X?~Re9{;D^Ypl-_kZT_2S|3mwV%l(7x z(wp3~X*sEHr-g{`+v(}3oWd##-7-{J;_8cjT(A)b*hnnqCy@2sBz(A5sy!#*#`+fksyGOaoK!M>`8cD5FjgjDb?P`qzPv>unsMM4 z;DE1|Yaa;_t{S#~^9W2j@PhjRTl_VBg~x|xGxq-Ru*ix8I=+4wqIT^A=s3KfE^(5Y z`VjwFUDeQa9s=sV+L6q=+8Mqgtp1iv)>VkR_RNK_AoJCwHr&;oVRhc4(sua1*~8@K zOcuwk9Zm%I=n2~zz6r%$YTDROK2}-#XdO<%1TKAx07w-kjDnN&IUSg zIiB6OqWonwXXh%8{%pyt1(xw&fZS!ky_CTJCkBPTsOW#U#k_M_&zInj2{)sO!y{X2 zy!Su!A=q*n{u&c;d~cD`PXiNOe2K~s`TT8#p;}}S(6M9q;~p9@O9J?xEnd7ZjQwpr zCXi+m@bo(?PSzjMcopAs>wX7O|AQW)*g?_LyY7E5>V#7)Iw<-Ne*%DE zb(x2&kq%+Ljw-Rzm&}DJ7cM&i)v9ohhiwx&&vuHi$FJW)51l^NEu9q7Oz8ClObP6K zCwE*TT`+#!h}TQxL2gUwj;Afz^{;0y?gTi!st!dI)>BRB;G@q!)-CQfJ2y`}+vT?< zV}QCyZ2=EM&C4DvJRL6hqYgn#9o^u^wfu;-Inrt7E|JKHIUw^EMbwajYNrP})(q+{b!R;PyXjGiUgCNj$vrqi2seYjpt$D zLD3J-l}`XXM;`3INcVrU=tZ*V6`s)RCY5EQc}R;(sF9ZmX^zy3vcFovZ`uFow~=|` zN^+(ndJH;>OWpj?Ls=2aa&D-x?BKQ*DuH>~MFJlpQ|3e_C)QQ^9(uW?T1Z{Z6*}#Q zYJ&I4;I~W#*WWWHDg(!~@o@EXuFp zA&$!v`Lhv^1hrn&UeB~vrTiZ9o|?ljLu_6|d5Su3!&41*e81}SGi-|`kfDe%JN)BV zxsvFn z?82yG0ma7~O!4vWMWJ(UFYc{P=JTB=hYahwxsAf9qFc&);qwEjzuy)21Z(^AFTig) zw;7%v|61OK{WKpL^xPXKSyb$80(sPlcn>3I@cz555_I%)d4BR{RG0ma(_6|mZkRnw z#5|g>(!2+WnsQUsh5lI-ByA!+J;j^TOS%8E=ZvW5&y)LJ{@EyzKN|H%OZW+W&fW`< zyzvH!6g&OVC=nr(KO5ClF!7|f{zznUcNrotse^e_uB*vUx4&k_XS_MVbb`S4-a%!| z0KP(z`&2i2NMnU+O~UvC286>)&4PWD|LHteRhzLgg~?x0KO{ENAtmLvnCz7*#Y!G* z!|atxY2*x>WvHd)<2x4Z^I6)qa4BX4m7zKH!Jv0o(&ewfRX4H6OEao`c z9p*?iVJ5WPSCCorWe>6Usa>vdwE7fKGx63l%rXtY{zUq}7TNzm`?Uz*aW_%eArg2r zPRe+sch5N*hj)mYkx~r-mBR5k03rkJF&Di$@fS8}nL)+60JJ(BpukY#K&l0P;upV~% zuj^`A{sHtt-<)FN=J#&NPE!IM@LxZ&?j@%{=g&7aQheMzv(!1eIlO2X*3I|!6de`x z_Pb%ofZmtBt961Ul@I$-bl@K+Agra<;O!yu#vyilVL|Z>@Bcj2zx0&|JH`EU<)KHr zT-hH|db5d^`4AQZZT%m33x>0Yve~)DiO5%PnR`;(=J0oArAp+;7(CxMi;#!9j++k~ zS-#n`rcj|zE$Tf_=Bj!t)#_Yp!U>O8S@{KE5+w<>vOARIw0QI|5F#Raj5vym*wpVK zt@0?EGIpw<6VxcQ)?`{Uo=UCCnGGz_joDF^sH`~aDs6m)a9MkyZChWqCw+MoxpNa~ zFj&4kj-08S;|`K1y(d0`Z}1u(73pvxcO`cbcl-l|BOz+qXA$$m>Pmx^@h3+T&4qvd zO37lBKAeAkJu6=|YOSG|>qaNyCzP`~CFD9XRUAS}VPx!^cC0Pk6Nvi_R*QUGs_AIc zwia&??N@#be?>o|i08<7f#H>KK__OjR>!M0XFE&uIF);v=Gzx){sP4L2GizO(DpbL z9KZ6&u4!DB?s){RDm7YsXMBK`$T71@l&&#XgwwPJMe9k;2rMBh-aE_ns^x{kz4WI& ziAqNe&l;4Yd80w52|9A6(mLnc;ol@#Rnv#5Rm!`o2n~&m%YzKMX$8J$I>Uz+JHx9z zTJT|clAPvV1$G1B)b7FE{T1$}eI|Hy${JF%vrze|wYIu|JPc~y5lr{+Q@454Xm`yb zJL=^*Y8O#Fz0gb(!U|TJ8KK@$&^*sD@dcM091i0YN;y9$Wq@*wY$Z^= z&(q;0w^M#mqp~a;WlYbQq%-d(W}X-T-uRl881TdJG(n^S#&@=K~L zzCsChQtd81?Wg3gBxh8norb)ci?l22;Wgb6(rX6X_093Qop7xlpg|HOr-I|_`g?OF zZF%wSw}n=nz>iyCIRs@4w>5@~?NCHt=;A?m;cQIUu&R+;U)i?Rw_K5KRn*gAS}9pW z8CJ>^9ysW5y|X&g8C+PIEs+@1WwU{pt75x8Ck~O7+C4mz(AJb!4%OIEgasjs$jiF% zjSAs`b; zR7ljtV>oe-cH_S5$~V8BQcHzQNGUV>D2yPF{Y4pV4bz%H2CF@OZm;7YoAR}uHBPu8 zQ;wptYRYdpJk~Uf?JD!maEUn%^8FqanlyEeIR1#7-1VC1X1M>LwrePmll1~?#&htgCxUT##mupS%8V{u+zhOOaRP79P<1|Z88?Z9f`n5v zrvxFE$yOuA?)Zv{f=(XTbNTY3{q9-Xoi?SCDHg#kSwC8M8`8y#B!xIZL9Es^1yYLa+X3e^|IMBM>sXn_}VJKt6 z%XBuaO=7Y(@TRx&QS5YV0G7JHqOHj57Zt&`rGch^hjL#({g)>CKTryX_Q>wGYM()x zm;?u@7spd>ppP&H`gYmfvb=m+$p`)n-b_dLg_=|+TwL6p$sa5(<2gZ?xgXCsazty@ z@^O>msnnBZ)3KmSM|e`|;{lj2ZM%M{ zV`Whqyra1s5tj8`ZGPfesgg1p#7D(2=UyD@LhRfQ&dkEtc0=V=seAQMo`_gnDK!6Of>fDs?Ts7RfP zF?XM6SeORSdF6QndT+)3V!*V?uTIjN>rIpE_g{eSr%Q!HseO+R=53me{o$nCW?<_E zP$l|m7o}vzO@eNZq$W_ZN{ez~n>(T1px0g(7nZMeA{fFM^R=Apf2W;3W~TP^<25&F z{43;W790Ob8$6W7lCHn-vr;9`o4?fk^{<`qV9z!^;Q_La8$6~MsGQN84UAMoDvD!o z#p^_U{hnmoqIwliGeAJi{_2782yudNZlY*sS*(=`$@tmmj0B+^k-U)#cgmxRgLt0d z$8lF~E}w*PZ%Ow^ehxO?Y&`x2U=;mp6UkE|EtC!WMy3txRwQ?KysDlA28D7f<0}26 zfLI!dc(8AhS5+2F1o^NcnWFnZJ!LpPk^#MZz6H|5#49|2FTtsz4bQYH-AD2aqOQHZ zH>OG0wm6zH9;q5cXmJ(zl|)+6r>h1>tz4|_*~`bA)APCO zXic}F;+Npnvix^DDzV!RKLwi4J4Mv%AXyjL60;n{?oW!y_|zqS0XD-oRD~kbV4j-( zIkAwacq`^mEp3z77Xyq8nl>@A)SE(tSZFQW)L#I09-?!a%drs84SNbZt;}G7F%R87 z!sN$$&zJ8UzmHk=_>HZ1Mtm4>@2$DbUv&I0#XqUr^p}JFq|Mw&`5Q~oFMtH^?=(dp zxe^cXQg@Os+i>e)f1wZNB@A_j_w1ss83UGeSIk|8&x!$er42s)y=sBF1O!Kwl-nzu z-n{$SD^4Et)3)P>9ySW;rYn7I^n$+uesfbATN0^r>OsTgow5}xcb>K~N-2HsGD{plnPahn}D(1+3IVgw3P=iW3%toN6YH#_|WWh$W)b48INR2OW6o% zGEb^n{>%6Aob=T@!1n^iUpX~7WH`84-059`0G=IxQw_*;MM$t+ymrnoY;07LxxAV! zO4G**I0B-Qgn^~|m^iozo^)0lmhx;Rei%$2U1cbN#O8u>&iSuHb5R2BiU<3o@>(gKK;4HBQ~QFeacXU1BAZ+)D%U^>>F*s7uMh#nzCaRlIT!>j9$%&i(@ zuCS8JnyK71lwr<9nGQ$UiC2*R&;g|!8A;Dc@rpeCw6`U2CX?HeOf7*|2b6s=k=IM_ zA)Z-8!-D`v4Z%bC+XW#Bkk(RhfhY}LIu<2stBQ>F+~NH47_x94^IR2u$DBu*M(0&E zVstCXOdQQA?q4D04mrC!-D3i5q|j(f`Hb$*^oi_MQ`m*wwq&_>9K7Q>S_+Vs@-7mm zBmlvT8&cNR$xeo=ckU55eGU7hVU%DXYOmTxB;<%Jq9|sq3=@#S^_}}eKa@VzoNhfw zqv`oSWLKs(yC^5WH#7F(@-{lPRiLqFCjk<4lU-k-IdbG3#omNGcX?p#n zb)~`QSY!VQKq>PP03aemdF#|rOykg{i&@3Z z%GBasg>*Tr%6P_TupJ0+AHLssWn(Zd1^e+{1(=begO_L>pYg$L)N^ikahA0%g>EEd z(FIXzJSsD#xl^e9MAK#;6;0}v#uHd7pEE^AX<;mm;Es&F#~K?Vb1ISxsgf!Z&+|kl zd{itx5>aUTV$mo=(|@e}y$X`T-~5SQ2PHXDCG6`}ll@{1yi-2Gv|A%ss^TYq%G73k zEUoM^N7Md7Vs7KP@MqXy9>?k3I?WOH5AA3vWKZ4Bo0-vvOV8zsrx4QM>Vn<@tgoO| z*ADRXagC_im0v~PXW3X)&og0)Xca}MWQcoRE_D~}fHMirqAS4}YD|4pMVVp5@$N)r z1;-1d>aq-)2(HDXD`>_Qv%h4IZ?*CL<5OTkjgv7-^97MvwshWaH5+*=o*M;|otB%M z_SmlH;{|j;(8pBOLFYTUpDS(TEya_*JN^Vo|Gl$ zqt2sBn_^;_I35DTd$v+Ve%e9H{RHWY{nR_MERGVYJDhnq;S|i-LRB@`Xu6!lc~0R` zDq8WV*mwBP?)|yORcExEA{i=&=%c>*l6eTsBX_*rh zg-p804G*+=H#uKNd=u9at2^qcmN%9k8L|+_qs+=J_etE9wM~N*S7@p$E1dkESdOK6 zZm-r@k7`O=ou*ru`1BdUy{rTw^~nzAW$cpfNPC_X`*q+6F`>VVQ`pF!Wv+s+u^L1z z@;u4^(Gz9RED~GHAkY;X$>W!Qt@!!;dck?W?D?( zUrB~&A9RBQ?p7I7cF#|7ux`zK^(Xogs-9O6+y+lgcl6>dhxR6>-=7i!j%_^=UGZuw+} z%E_XxjL{vg3|FR@GqwzeWe%gZH6%Y*?32atEz~t{Z#{FL+PEf@)of^)j%!74v`SF- zqMk%dgw(4(@vyHntQQZ0#^lrVHs?Bkfetf>pbmyw#qOpklylr4#BxFK7*%3YgubePnJ|9a+&9NcS0ZxG4UZfwHxWd{?h zoR&}(E#J*8y81cxw9#lDsa_Z@yPu%A@l>`eId12Wk%NR}WW z2-HV!x+A_=ydiS_3-ILRarZy;j*lhI@%YmJ;~(o03R<=7dUV3bk0qKe-XmPeo?DRe zvDroY99qV$l#I!y2TR#a&!k51ysa8 z&#b}|3#+uz{_v!CUW39pqHr;`aX67|jQJO!QR60Hyi)nriJPpOWn-L;aciwQ-1PjZ zp0j^@g&Q;2N=rAS8{_?snw&?e-5d|>itRC#G=Ph)*HR~g0r&O|V;9d~p1DMy%>@@o zDw#tS7U$SKqz!NBr4;siH1&J@rni4EvDUto`UN;@3#iu88bxYZlkJmG@e2{kwJi_l z`8qj%seOXFKi3`;&$r9GVPqvR^}4j2%n~I}TkVvCpaebZK6Os0Ex&h}L} zV}{5pXWNvBw=q?!yzDuuN|!9$6?@DK)6LnUNfqIqoY(k>=Y}^NNnW-#s>w$(Cg(Im z(}hK|m19`iL`szwu8u5JY=!XZsETY9lLmg)Jg_!%fWk1>N4EStb3jnCD_tAQOcFJk zQKpLemNugHa(IeO)IJj z?h7nZ=psR{fMP)P+E0Z^L|#1{93eB}kmnlS`)*baw{3Vaa33pBN1gS!BB!z{?ZSsdA%yc1CwWvD9>rHuTXk_$1B|;*+!2o)AMp&GS_n zdXp#GLj^l0`}wLsbXV#mn2;#B*R|8JE&DO6W;TlpV+Wc6zB0~6Abi*3H|*anUz*9%4|N;GdKU&WLKkLeBx2{e?Uq2Uk_l70118o;EJX8IF{dyE3% zP=+Esv#EYJ$rRLoFUlMt@8&J-TR{A(XpAvV(_EW~_R^py054 z*|@E?dzR^1R-7}5RQ}LJsZ;jhAso&K%W4@Wg10C~Ci68TS&$cJ80GULLhM>>vqY^SbLWa^ zvC`aA6z631_R)%pVd+<%<+cxj9WTn*E#NLDezL8AAuBf39JBq;66O2u6h9Ew8S~+! zmTsYVqMGS=9B|Z9^iizXB$Nq@P^X>$j>G(sh(m`%q8cr<6(vzOH}LF!e5u3_6D2F0_4q-?AJ;FPw4n-VH>;zL ze7;2_46n>gd@0{EmU_5gqH2`$M`d*tcgD;^1CDcxm)W-7tx>U94pT3FrLz%A!7dv% zWGVF5IpSiE8hcohMKp&~#JvppP&MwWD&B=7L>AUxs%e872Es=!^gW_p6%=#CA5Bt>Kopw1x5u9||bn1@_1~1(mSQSUySG zQIz>HoI?+$(RyxDN89sR042xP=*3WLXbc^~{d6T|>p>XyhByyyYwqjaWo+t}XeB$e z14kLm#-PE287SG@5hG2`sZc7JWlQ`fn)@)$4H?KlYlzy8vP!Jg#13~YPpk$geeBs( zg-k^I^}8zBWWM*doXZ~A4juH!bM~`Jh{l8WZc%{kTbUu+E z132FjI|YH$Cti+>D>^^y*RBSxC|3H#gNNBP^P7;B9$2|g(xG}d>@@P69azESCD?^4 z6F6f>CZd4y^_I+}oCwosJjxW_uXKbQNe=e7UgR=mGMQ>yFRqZ9;CvMAK?CnyxoNsQvRE#@hMHF}8WuCkUJ#4)IbcTZamzz(q#{?BAl*&BY|AM-lyU*NymXZ@ z7^0izC!Y@|RhZ85K*-ilfIHfLJT+TefELQ>&U4$e_fJ& zCUft~1w8yX{-@#ihg|=?@FxbOt?h4CYCu>`Fp;wL$D`XIYYY}-`I{NNPVM$~et z@j##01fykz*>4_fkho?eP6&DV9Op8|(el|H z4X#7e004q`@b4XlVN&{1>L z484$|laJqcY01>@CY(JWz@gr@(eYD6k+n{tA13b_mW6DPJj*7fi!LGTeZj|Dp_=$E z-zo+4oZA*W6O9$nJM4$qoWKx_Q#X@*+O12?icL^s~SvY1QXZ@dk0N=EagJ zkiBH~f;s1xd?-lIe8HJxr*UXo`S*c-f{aZN4GC2+s^SK3vVXhA@j1DP>nu7OQMpB+ zf`nObRB(v{7h^KpwYmQGObDo3$B4UTI6GRs$}-4^gT{C_5WXm7nWLn=4G!g_K8y>K zRXx|_ptJ4HD8(sc8Je z0e+K&(jAF4y)EG#wUMbhy2;&nZjDEw#`0GFicp>`*+m6`?RbTyw2K5A&u`?h_NVZZ z(sfPtP2XRDyAC_ryJYYecY9G>cD`(tk4g4M=Yc}l0|A}IXv&ex{NcD3FNL*ioD2~6;F8v<7BNiIwf|34h+lo_uN|t8Qz*G zi9$-w#QrIR0TV_tsyQ-MJI-ObJ$7ucO?Z6dUIqtGZb=}YC0xYwgr>V*WJuxD-$X9| zzpNxQ7x3pzy4l9mi_r-WI~=>B>YNbrF$qcc5l64fM|>oY46ER95gP4D>q9$CQkD|R zepYF6%)tAtvEgP*@p2jew#EBvwEs=Ot*rs2>ug67V)F(#R-~$ouvYfB#`(+Syo%$% zl^X!)C7t}I{{FS}AF^Pn|7Ai>>WA=L8o9A=;!CdzZOeqNmR>V^byM@jUQEw(HDF-j zaN@~ox zUX=DE&2kaRDRxf83ivzY2g1XN>bx_vj?kkjEpj~AM*%glcyfQX$~3U8sC);qd>XE znt}KkW-&eYB}SG+v3rPT-$%32t7VK)S_W5syP1Sb}N?ZVY7pjHWs zS_>>549m}AhJhb|Ozii8toTodh_?$XC=k#X59Z_-b5-WYwawkjMpjWwSX*XV?*4GK zyL8q>ig@=}v>n5ELNw5jYl^%%1;d=Q5i>U7E_Q=`miutk?PB$=4XmNL=dJL`5d3D^IItUf63y{sQ>w?&?ctcOuvmUv5Pr z@RUR8tU6?q(s?pj6P$}RI(Tfv7^U7>QnZxBVdB`7HGe+WqE97-&usMBk&tPBSnj*+ z*5Xs1PK^j>m6w4^D(ah??ZDuQwk%+0pvf%9rcy+EAWD_myyPY5ONv5Hv$c^B?sxWZ z5{IXiar4a8TT+DJrVAfAI^#k|WV)_&_{WRTeG<=URvouvvs#D{A9`DNM<-Rb6FM_g zlRh;bO!pIXs7tzPybZXgANddASo~v0hWt+};u5J7b6jbzxZo2`yU@x__U2MTu?x9E z=2U)jA$=_WQw&u43lOF9Gr{X!FHfov>?Z4GCH-*!Osp+@^}Vo^^~Q;o#~0BtKH-lP zif80aseP8m*cgJ2#j{V2cW1*Ke|Oyi09VR)S!#InM%+6fOWSO2b5>>cVrFcT+8e67 zPVx+JO$|`OBk%Ec&q!uG_-TFamAko0q2L!2br7o0ZrJcx*4dVyx_|kRjM{Vd`;s5= z`aK>p+t7Z92)!7n%t?Ar!GT~UF|4V^wwI~o8oD8?hE}un2=Gol4r9WkDTLZtWaVD| zAUuvT{RP0oax}5zM5>LF)=yg+8$3h3>sIN4xN&Wp%U7Cw0kO-n!K+Vcdpq3qcgRyw z9ILHWI}eyG9G(}7dvOlwtPXtUldtz-k{0oeBvq^h%su>!)+94CKTAL7cW&0s1-cSw zcnSKA2JB~bc3DD_4l#JHz>_;b>Kw?>h+$3NQjq;F%H&pIHeNwpr1!pn zT4DwmFuPU0%CW9tWa7g(QCDqja*>tEvGw}l{2!wYQ!1qC@J*4ooARxTk9YCH;+ozs zfWBywdV~Omzw)!E`}J_@Nh{6GKc|rGA}2NB{Om(b3y>pkE=^ju`xl?^H!+@2E93v~ zcQP=cUAfz#4x3JytJ77waF3uTHJ#x}H-!|Pms`-<1iI3Z9tGOolePGh#hXX&Vp`)8 zNz;9JiHJGPvM(4YiRdmJQ@I5@k+{O zsd^@@%wfneY?)(6809=UEH?W%8)cceS@pVb*uT=#)0hX9#_dMT~3WcwLgcNQdaON&uZjHt zNE-mk_tNX!2p;<+w3{jl=rl1rGr5a^O$P zWTW=1UcO1V? z$*elLL^r;t+)kn>e#&t5?{iau(fu{dBHEMb^D9d%*!RZrQk1n~4QcrliY-Q2*|oe{ zT9+}JHjtTvhLbB2pX6F!id=pS27crAq?XMorB5N2O)y*{A}QM_DK?<<(9o#$(=&3q zT7*C_bofTL=$)5l-;icel~O8hoPy-)d~^E#ZxLVLlLE!vvpo1#4MFAuYWrmVTC-Vl z*OXa9b4aa2>JISQXgu8k>QQFWtmQMO@_6F6s z)f((KAHKqo^2qz;R?f~>6B%j?}&0TIU`3qKhY{%<9+R? z&U8bc9)O2~_ZJe&>CoU@=7w_pY}k^lP?vdz?u@q`Bh+_WvZ5OY`zE%R$%MPa_`q#9L$qC;EGZnv?ykDg z-xxo}lMH8w(y-!b64%OdM<&_FlY~_gMokx6YY^F)F}kgI(@i~6K%bRMs&iE|X3_^7 zwMGD6KM*b{WUOT>_|cvrXZsF)6*>gUP<;ii0?X15t{SCEI>Su|d@Qus23Oms6^d*j zWOL{_)speGgfh5n+4IiK@K^oEkheJh1)-Ys0=1FiE=Muo;x8H^G zZu}W0#n;`dA3w51Hv*)t|KW2CyqC9dK{V0S!1N0s^g;A5b3uax!MGFn9@)*AF42iZ zhE$qjz#WRuBCiS8Ef46^03=_v{*?BA|NkGrW&bbo)r+7m$Ih(ki+7pfd~QC;a8UjT5iG?Qd3=?A?6!30LT_@NgP0&T3@j+*lLh@K$TCw5sn$wpr1NXI$GQ__YtED6cb<^??13xCdXP}^_ z)MG8p*h8BsdAAT3aY(nRrfTOi6%t}L+1)^Y2+kkNe8%eE2g`>bn?D_BZo}&Jy1&oL zz@@<#eX?B)EAOgyfZpvKf4IBlJu2P#lrhpS^Lp*uH%l4ona0iI_6j@)>fzCO*3;pV$2%RZeDUPtd@1?{7yY!md2Ot!uR?CMH6l@l9U&P=nC+NXdy+CaJ`>u`0VH~b#H7K?1C;;9eNAwa zz744$ZL;d+AFX+4=&v$7Efl#VZl;0BWPV{w^*4XVzbddP8E))9@K&Kac^g!07Ut@v zH_t27X;bxv-{tH|kbo+kif42)82QgP?g)i(HA0I26EQ}N0kH>?82kCJN1 z`O%SVtzBP3f{8k3`rxGYlu^4=w~>XC2{WC@Zj(%eUz0vaLM~GZ3Ywmogs%xpawLL+`bt#uq%xHk;^_?iG=aIjSMEMK z&+)xdn!OI{jAju89>FjX>F`ANwBS}Tf^;PmY|ZT1Qo3#KE({DovmCRkH9aHQtTFTnRI*S4k;X7-o2affzSv}HlxEwkmDW>hpp zPdkE>2x9=iX6EFNq^tl`8k*k*n)rhKekZ ziCzX6Bi(r{DTYMJYCcL}K95zeK`927odOuwE5 zcD!=N+E_Z1Wk@6uEQQ{fimXhB+bNk8x5{F`mq7B0G?;Ka#Fw=9WIAgQ)^&17MGKpi zjI}vyMzZI;qYW2+RhKDShUC!9HkMFO`C&u`+K;`D$%!+Nc4qc7|E*KyeISc0B{7}|AR&}6?M=xsEz@8LBXT~(V4i4!V=H6u8+;G_k!>-SB(qL%) znT83uFMa&ardCI)t8rP!;H+zs2vHw1GNp0q;e$HciQ%}tIvJN9N4^g#R3d`K!2H&LQ3UPFj=0=br9=3)HnvZc-=kAnF zuD+b(_N9=;nxT!pU9LTY6iRUmnxWZ;H=oj(5ZP|w;;+_7#c0(W?q};v*2Hi#)jAND zXejK+@x%mPswV@eg~Z<_z8+%d{XYLb9^KYc&PIE z?{fODpZ`M>7KLG6f;v(H>0?tZA1}N)soND>GJi=;7xEZgiKj;RuVjt(tVwk+=u?@0 zqE7(;T*<=`nCD3Sm1y9=ZF1>ikv3FB#5Sjj`h4VMb#!R#HBH>1RaS62wA730Ef$}T zJ}HyAqs@WEw#SIpTi)>Amt3K1bh~-!;&iR0LiW)JFxkNe7=-7L! zQ8E`#@3Hk+XAsy0l&KUhN5C^p0&x#a4tRR=YO}FzfJk>q`vE za@;J$3T&k2|1;~Sv0$hkSDhPhZl!jbz)J{EK#D9XRdwkXfR2(ROrsd4Y0K3ZgUplM z%T!i=82k$$=S`jI2y|%J-cJ;(-P(Io%5w^Lm^J?b9}W-PxI%tCmsp=fXdCS8_d8{O zkA>GF@JBFHPs$e}Lj;gi3ha|%Zcp*@j9CXwUk-EHQ(y?%U&*LHn(zszA%I)bsjUvI z>JYQz9a(OraUVom6ID5bY>s^_jKli+=JW7*+2mH^JzazG%WmF?Ikxa*ha%7}@zd`d z95ggt#5W{&sWGeg#qm*8RoHpXxz%>wAfZjTZGwe}b_~>JUtYtOSY(55M5v0D;pliRIi?pbTAVqb%)eFLWKqiWo2}Ib?+H7u{g>Eyba4K zbal)buUtT&i|U-ad;D!N2g>r7YR1dVTjFv)JjQ;5uDTfu0Alo@aSBZ&}vwFs8N0OfG1YCcSa#c_sK&#@oc*TVwp^b~8(~KixQ} z)@9LHlAT%pyTDMGho3-yGFqmaHyX-k(=8ips+6asZ*sI( zW?~&_u5hO8F9R!uz}};^EDxG85;R0MAT=^MWG{DwM}^tJ225oxqpk|t9N&)?*9pCi z2G;2(kARq*Lz_pE1=~4mSQK{IYl4ih^Ot5S3n}H?95ZDX*(v7M55@BUcNaVEOw7KV zRBgaXSIe!BJN#H&^R%|CneGt{r|2iAdjlf*4@cf;srm?$RX}<7&5@3r5zX=FxEvQ+ zn=P9Qmw<0C>x_|Wmb{g?XZa^H%2AWUMB|dB-O^*zT=0F8*H!hd6wz95i=%8_t{6h` z6hh3P^g-K7j=YZxP59s&uG(@9VGnkR%TKWd0~PNC*zHtkSK|iaK#NL38RmqGl26I= zXwI`+(y)xQF`65f>2Cm?$iGc0|8*P$0R9tllzy{ea8_y|vr}hDq!9EKbU5FR zE7JdX`rSL6q?sTyGtC#Knu@epDNjOVR13@5Ss24Lj1=M00a+EBB{%w8M?s{Ikvx^E zCEt&Lu-qR6i(Q8ztko2|l|rS=1}=1(W6-hEzJ{F>@y2_~<`6djXEFle^q$-CI$n3* z4fIJ)oIymEH^#_H%m|;1!;WLmXokfoC|#PmVvifYn%&8F&7Ho@L(XbnrLSk2U*)CR z+HZ$9VcS?2f^V|~6qAeUuSmREHhCgQs}e$sw(~sO2J$FiJWYA1A4DR#9#qYZHL_O` zTjc-ey#IgpOQf$Fszegm#39r5q&z7_G4-363d$U}3Ac=IUy$GPk>x}9xx6|)WXW@& zZl2oxiTL|9{6UY$-#th0abJ(@vOKPWm*?e;o9hSnF|Zv;Uyk)jOz1D+ zy*d}A79hO=I_4Fi3f&lDU>!EK*j558lu@~3)!toF-S0A3OKBT$%)O9mzvt}YBJ_hK zx5H;fb5EkO=@(c+5_x#&$6krphPA@aGMkDeFKjIug{oekNVYAVnM%M$M&9N62Id*$PW zGf%d%kGNJ~bodWjOjv(FgrjWOy_}zikT_sce+z|AuNZcJXXk>&#G^QdtY+KR!-lA#!HvkLqO0QOnxkepNbG#YEk~5k)R>Lcy<{fkAhySa#>kfx& zYxg6SNJF%Uh%&knL>Ep@l#DULFxq4y35Fqv2!bG5^fp?QAs88>B{z2z1Dj7dRKkd?{`hkMW40i?6K}r0>%Tn zi1-jDaqJnbNKOV05uNhZ2-6U56|~Fmq_5y~O!!D%)*uv|_>)s4zR^X^6{Hec14j?C zbL5~222^m$S*iRb(n`O)iCtyN0vkTI zsJ493D-8F^i*A#6?k)7@N~wsd8{k3H`tmJ3It=>6U&~)Fs&3$0P9=BI=GV&0IH>hL zMF50(&B$jTRq_;_SY&HsN>r4c_RK-52l9Hx@uSaVA86X*bylny@D=WT3f&zlwveg9 zPa*an!EnT4nBnu%%r6&tnINv}lbcr7XaS1bAR_WNlJ#k+s_!;$xs=k@Tf=P4=+K_G zcN9k8L^o0BGXa4G{uoM8=E~F@ct@MJAaSngdre~N&TjP5SgsS8H!qfCP|2EcvM8q) z$^ zfWHoS|0b+!aVD}~{OC`XJ`1oD&V}@Ec=brY!gU2F z<*Re00XrV!wR59ovz9fu8&9Patp2>l%{s7fsuZwneTB^LUQzkW?sd+oQX`F@##o1> z24+R8!kQqN%ba{%TNkrnV3uE3a}fbBs>3g4rr(X{iZ0AnC-(E?qcKyqeEXEmf_vm+ z&;W0&eUD_9b5>{7D&cWnztprb;YKy;<-TcX#5ywgX zNeB}?_|yG2G)iWavNU6qw9n0)@mpU=^n7Crf(Y}uCq|mn_rJ@)>58O}za=Vv#fPEN z?E08c3y(U-9*a`ySuncdu!sRMuS9C?Wg% zGAS!@UtsR3qOT#oEH z=q8Ivm&TsHy7sl7g%E=2$Sn&mQQcVIkYwYO;8leLzNXtr?Ft(@`OU_CaFepFr10vB znde4D-^BzCm6f;N4Mqov^hh2s3CheNjj%rCiq7^_q*9@-_vn?p5*B9H1E%Y`U&*I5}_`_z+9_5U(_3Q-nkjxh3H$BPb32NtGj{!xR*A_?sYfl7-R(? zVG620pG$bPv&QTXaJ14K@hgX-#B6ZcohW@tj{VuF`E>QAB%hLfVPSD(ZNf|ihtWrs z8vYVi@2A4U9oxyWgSg4bV^Dl9*-;z2o)U9ih3hc^cXioZuDV>3wX2gd!k8fuX04fK4|&4x1=TWjXpox7!{$6pDa2VwqS z6OB#l0Cx745A0eKaLW%e|MH`|;GgZid^qtE029N*gZ_0*<5 z-{s*i2eM_yAQejkL`GMihLqpfc~w=zgKD7m+a=Y^JACi5)QPv|Kf$Q#IJ)-mR~{w6 zpJl*rK4ROdJccZ(0AzMfd2QqH?K^Y^i4#E61M2O&?VI}_ibP{ip9U1bwM&<(B-MSP zs>gq8Rp<|$I24|*@7T6d##c@!X-siym~pOrNw2qN*XWq_&Wg-S4z>_z*OGB!d7(OD zJHkFiaNnJsq-}7ptKclkhYg)uQxB-x!y|7Llq@bDl}Hc8lsGo>Y~G$20PoA_IKuk# z2e@B^rD#43QDdLtr1KlgH^D;3%OAn=yHSB|Fd9sxInFhtp^rz%_FtB0DdVTa>5~&sm3=9mTmIpsng~)dvdC zdTX9E=V}H!Jk(OSpp5Vqga=;RMRHqLuQxA3aL{KB{bYwB1~!tRblO){c{}kt8Yd>6 z+|_>Gwj0$ih9YF1d1d7}++j>I`4DU17;4HsS>3P8truOzT1p(UJgHaVZ1dn!z{}XV zGGrXT!Rxb{koY@oHs zr1@|p+9%6KkPHdK@d?>!11`hqMz16kDupw2tbA8oZPD%(n1Z|Ib2Lau=T~-!JT!rv z_~QDadr&5WbqfO}k9F04Wl3`@i|ujs)7k{d1kLPu0onQMDT&L!l|q=~DBswTBvcQ_ z=3zv3G0v__gz~{qf~s-H<<})y33){cWLW>%ItA3SkEhx?B9c18HHyJA+N(H-scm*Z zF51+~I`<84vQt*VJrb`iYTaq+K*<-9!9~J!H-tls+UCvIAZ<9{)5EYG27We6-nSn^ z0jsLm^t|}$J?2Zva-m?xYkFjr$kiP+Keoe8y>cf)^{VbGZrep*h_%30aJhxcZ|v%t zdtRk(C`7(KXk%I@QT1Pgyp{hvO8lGWT=xGR#3N%buy@t45xx_YBnY?O&pi26Vw!FB z)NYFdRT`t!Qor`Zh*aOf2MB!mtb0}C{gp%bN0S_5Ff=@rBy!m$N(h4~gQ$LfV!Cfs zRFBNBCrtG5oHz#Yl@wDF&u!Sl;(p=fJaUyV+@>W?)_pWoy!U{O83XpHZ`rxu{^Oz| z{p6}X`OqZ)DBjP&>WKYu2HU1=$5c1-RL8El3CO~)LS=+*QLqO;ywg`-mPowL7H?|s zfga(sA&~%e#_4WG^_u*Yn`9?p!NHjR+W>}y`Lum0PRF8ftzEKIGbrO26w$pCx#KN0TsES}UD$7oGbHSgwY4oLIW?H29A`L2aj3G0 zsSU@Q{pHD8AHn8*j@9|%C~$@$)l@RGy`8*iuC~1_k&5R_b!sOR7cRlzj-*QUD(S?^s)@|l;-b(6n=UQ` zykY`tBR<3IF-j?Zn9p{!3`ci^uOS3rS^QO=)&ug<=>)Q$vh!Hj9l~ zkY@&Ehf9aE_uv5QZJ&I};&;#`Tj9U4RUnGN7`@fM(+T=t4v`t9emDI8oIZjw?L+{w zC4hw*A_V}(vnmdmuI0}I8%P+*cc5Zg_dc+UjDz%EKe*o#Qu-Ri=+C4w5crOS_*&LZhkPMT}g>on$j zk94<=;_ilriCIcUvTUTasm)SjSV#$9u+{!vO_3jTfj(4OAvCmISv_*6;naw}SaXHL zlOfT4#-_pS8YorRL)1sCFuAsZ74Hx~JAjoWRzRFiqVxK555sP1t`nk?+Wxo~ zx)TRt)K=8z4GCUBQ)@9RggtuqIA7baLO5-Q}ZL_JMd(WfLV*wA0!}o875X{9R&3`Y88$b5i1+J^X}4 zJUdwa}$PIGURyC8U%U-o0c3l-OW!q%*sp>VCGr# lx>R@!dd5KWfoU}N&HFBvIDT@vyP8@26i{4GxW@6&KLEoAE{FgC literal 27640 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 IX6Mbn0Y>-~{Qv*} From c822799637d8f9b195ab21579794a13c2b13ad91 Mon Sep 17 00:00:00 2001 From: harukin-expo-dev-env Date: Fri, 8 Aug 2025 10:49:05 +0000 Subject: [PATCH 15/16] =?UTF-8?q?=E3=83=9A=E3=83=BC=E3=82=B8=E3=82=A2?= =?UTF-8?q?=E3=83=89=E3=83=AC=E3=82=B9=E3=81=AE=E5=A4=89=E6=9B=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- components/trainMenu.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/components/trainMenu.js b/components/trainMenu.js index cd416f1..28fd367 100644 --- a/components/trainMenu.js +++ b/components/trainMenu.js @@ -180,11 +180,11 @@ export default function TrainMenu({ style }) { flex={1} onPressButton={() => navigate("howto", { - info: "https://train.jr-shikoku.co.jp/usage.htm", + info: "https://xprocess.haruk.in/JR-shikoku-Apps-Common/info/train-position", }) } > - 使い方 + 走行位置の見方 Date: Fri, 8 Aug 2025 10:53:46 +0000 Subject: [PATCH 16/16] 6.1.3 release --- components/Settings/SettingTopPage.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/components/Settings/SettingTopPage.js b/components/Settings/SettingTopPage.js index d06b26f..8865084 100644 --- a/components/Settings/SettingTopPage.js +++ b/components/Settings/SettingTopPage.js @@ -17,7 +17,7 @@ import { SwitchArea } from "../atom/SwitchArea"; import { useNotification } from "../../stateBox/useNotifications"; import { SheetHeaderItem } from "@/components/atom/SheetHeaderItem"; -const versionCode = "6.1.2"; // Update this version code as needed +const versionCode = "6.1.3"; // Update this version code as needed export const SettingTopPage = ({ testNFC,