{"id":19,"date":"2026-06-25T18:04:21","date_gmt":"2026-06-25T15:04:21","guid":{"rendered":"https:\/\/dev.allinoneatsea.com\/?page_id=19"},"modified":"2026-06-25T21:43:20","modified_gmt":"2026-06-25T18:43:20","slug":"port-to-port","status":"publish","type":"page","link":"https:\/\/dev.allinoneatsea.com\/index.php\/port-to-port\/","title":{"rendered":"Port to Port"},"content":{"rendered":"\n<style data-wp-block-html=\"css\">\n@media (max-width: 768px) {\n    \/* Ana konteyner geni\u015fli\u011fini %100 yap *\/\n    #gtp-v31 {\n        max-width: 100% !important;\n        margin: 10px 5px !important;\n    }\n\n    \/* \u0130\u00e7eri\u011fi dikey olarak s\u0131rala *\/\n    #gtp-v31 > div {\n        flex-direction: column !important;\n    }\n\n    \/* Sidebar'\u0131 tam geni\u015flik yap ve y\u00fcksekli\u011fi otomatik ayarla *\/\n    .sidebar {\n        width: 100% !important;\n        height: auto !important;\n        border-right: none !important;\n        border-bottom: 1px solid #1e293b;\n        padding: 20px !important;\n    }\n\n    \/* \u0130statistik kutucuklar\u0131n\u0131 mobilde 2'\u015ferli veya alt alta diz *\/\n    .stat-grid {\n        grid-template-columns: repeat(2, 1fr) !important;\n    }\n\n    \/* Hazard grid'i mobilde alt alta diz *\/\n    .hazard-grid {\n        grid-template-columns: 1fr !important;\n    }\n}\n<\/style>\n\n<meta charset=\"UTF-8\">\n    <title>PORT TO PORT v31 (ULTIMATE FULL 600+)<\/title>\n    <script src=\"https:\/\/cdn.tailwindcss.com\"><\/script>\n    <link href=\"https:\/\/fonts.googleapis.com\/css2?family=Inter:wght@400;600;700&amp;family=Chakra+Petch:wght@500;600;700&amp;display=swap\" rel=\"stylesheet\">\n    <style>\n        #gtp-v31 {\n            all: initial; font-family: 'Inter', sans-serif; display: block; width: 100%; max-width: 1600px; \n            margin: 20px auto; background: #020617; color: #f1f5f9; border-radius: 20px; overflow: hidden;\n            border: 1px solid #1e293b; box-shadow: 0 50px 100px rgba(0,0,0,0.9);\n        }\n        .sidebar { width: 380px; background: #0f172a; border-right: 1px solid #1e293b; padding: 30px; display: flex; flex-direction: column; gap: 20px; height: 900px; overflow-y: auto; }\n        .main-content { flex: 1; padding: 40px; background: #020617; display: flex; flex-direction: column; gap: 25px; }\n        \n        .eng-input, .eng-select {\n            width: 100%; background: #1e293b; border: 1px solid #334155; color: white;\n            padding: 12px; border-radius: 8px; font-size: 13px; outline: none; transition: 0.2s;\n        }\n        .eng-input:focus, .eng-select:focus { border-color: #38bdf8; }\n        \n        .calc-btn {\n            width: 100%; padding: 18px; background: linear-gradient(135deg, #2563eb, #1e40af); \n            color: white; font-weight: 700; border-radius: 10px; cursor: pointer; \n            font-family: 'Chakra Petch'; letter-spacing: 1px; margin-top: 10px;\n        }\n        .calc-btn:hover { filter: brightness(1.1); }\n\n        .checkbox-group { background: #1e293b; padding: 15px; border-radius: 8px; border: 1px solid #334155; }\n        .chk-row { display: flex; align-items: center; gap: 10px; margin-bottom: 8px; cursor: pointer; }\n        .chk-row:last-child { margin-bottom: 0; }\n        .chk-box { accent-color: #38bdf8; width: 16px; height: 16px; }\n\n        .eta-panel {\n            background: linear-gradient(135deg, #1e293b, #0f172a); border: 1px solid #38bdf8;\n            padding: 25px; border-radius: 15px; display: flex; justify-content: space-between; align-items: center;\n        }\n        \n        .hazard-grid { display: grid; grid-template-columns: repeat(3, 1fr); gap: 15px; }\n        .hazard-card { \n            background: #0f172a; border: 1px solid #334155; border-radius: 10px; padding: 15px; \n            display: flex; align-items: center; gap: 15px; \n        }\n        .hazard-card.alert { border-left: 4px solid #ef4444; background: rgba(239,68,68,0.05); }\n        .hazard-card.warning { border-left: 4px solid #f59e0b; background: rgba(245,158,11,0.05); }\n        .hazard-card.safe { border-left: 4px solid #10b981; background: rgba(16,185,129,0.05); }\n\n        .stat-grid { display: grid; grid-template-columns: repeat(4, 1fr); gap: 1px; background: #334155; border-radius: 12px; overflow: hidden; border: 1px solid #334155; }\n        .stat-cell { background: #162032; padding: 20px; text-align: center; }\n\n        .wp-container { background: #111827; border: 1px solid #1f2937; border-radius: 12px; overflow: hidden; display: flex; flex-direction: column; min-height: 400px; }\n        .wp-header { padding: 15px 25px; background: #1f2937; border-bottom: 1px solid #374151; font-weight: 700; color: #94a3b8; font-size: 12px; display: flex; justify-content: space-between; }\n        .wp-list { padding: 25px; overflow-y: auto; max-height: 500px; }\n        \n        .timeline-item { display: flex; gap: 20px; margin-bottom: 25px; position: relative; }\n        .t-line { position: absolute; left: 9px; top: 24px; bottom: -30px; width: 2px; background: #334155; }\n        .timeline-item:last-child .t-line { display: none; }\n        .t-dot { width: 20px; height: 20px; border-radius: 50%; background: #0f172a; border: 3px solid #64748b; z-index: 10; flex-shrink: 0; margin-top: 2px; }\n        \n        .t-dot.start { border-color: #10b981; background: #064e3b; }\n        .t-dot.end { border-color: #38bdf8; background: #0c4a6e; }\n        .t-dot.hra { border-color: #ef4444; background: #7f1d1d; }\n        .t-dot.canal { border-color: #3b82f6; background: #1e3a8a; }\n        .t-dot.strait { border-color: #f59e0b; background: #78350f; width: 16px; height: 16px; margin-left: 2px; }\n        .t-dot.waypoint { border-color: #64748b; background: #1e293b; width: 14px; height: 14px; margin-left: 3px; }\n\n        .wp-info h4 { font-family: 'Chakra Petch'; font-size: 15px; font-weight: 700; color: white; margin: 0; line-height: 1.2; }\n        .wp-info p { font-size: 12px; color: #94a3b8; margin: 4px 0 0 0; }\n        \n        .tag { font-size: 10px; padding: 2px 6px; border-radius: 4px; font-weight: 700; margin-left: 6px; display:inline-block; margin-bottom:2px;}\n        .tag-hra { background: #ef4444; color: white; }\n        .tag-eca { background: #10b981; color: white; }\n        .tag-strait { background: #f59e0b; color: white; border: 1px solid #d97706; }\n        .tag-canal { background: #3b82f6; color: white; border: 1px solid #2563eb; }\n    <\/style>\n\n\n\n<div id=\"gtp-v31\">\n    <header style=\"background:#0f172a; padding:20px 40px; border-bottom:1px solid #1e293b; display:flex; justify-content:space-between; align-items:center;\">\n        <div style=\"font-family:'Chakra Petch'; font-size:26px; font-weight:700; color:white; letter-spacing:1px;\">\n            PORT TO <span style=\"color:#38bdf8; font-size:14px; margin-left:5px;\">PORT<\/span>\n        <\/div>\n        <div style=\"font-size:11px; font-weight:700; color:#10b981; border:1px solid #10b981; padding:4px 10px; border-radius:4px;\">\n            DATABASE: 600+ PORTS (FULL)\n        <\/div>\n    <\/header>\n\n    <div style=\"display:flex;\">\n        <aside class=\"sidebar\">\n            <div>\n                <label style=\"font-size:11px; font-weight:700; color:#64748b;\">DEPARTURE PORT<\/label>\n                <select id=\"pFrom\" class=\"eng-select\"><option disabled=\"\" selected=\"\">Select Port&#8230;<\/option><\/select>\n            <\/div>\n            <div>\n                <label style=\"font-size:11px; font-weight:700; color:#64748b;\">DESTINATION PORT<\/label>\n                <select id=\"pTo\" class=\"eng-select\"><option disabled=\"\" selected=\"\">Select Port&#8230;<\/option><\/select>\n            <\/div>\n            \n            <div class=\"grid grid-cols-2 gap-4\">\n                <div>\n                    <label style=\"font-size:11px; font-weight:700; color:#64748b;\">SPEED (KTS)<\/label>\n                    <input type=\"number\" id=\"speed\" value=\"13.5\" class=\"eng-input text-center\">\n                <\/div>\n                <div>\n                    <label style=\"font-size:11px; font-weight:700; color:#64748b;\">CONS. (MT)<\/label>\n                    <input type=\"number\" id=\"cons\" value=\"26.0\" class=\"eng-input text-center\">\n                <\/div>\n            <\/div>\n\n            <div class=\"checkbox-group\">\n                <div style=\"font-size:11px; font-weight:700; color:#64748b; margin-bottom:10px;\">ROUTING OPTIONS<\/div>\n                <label class=\"chk-row\">\n                    <input type=\"checkbox\" id=\"viaSuez\" checked=\"\" class=\"chk-box\">\n                    <span style=\"font-size:13px; color:#cbd5e1;\">Use Suez Canal<\/span>\n                <\/label>\n                <label class=\"chk-row\">\n                    <input type=\"checkbox\" id=\"viaPanama\" class=\"chk-box\">\n                    <span style=\"font-size:13px; color:#cbd5e1;\">Use Panama Canal<\/span>\n                <\/label>\n                <label class=\"chk-row\">\n                    <input type=\"checkbox\" id=\"viaKiel\" class=\"chk-box\">\n                    <span style=\"font-size:13px; color:#38bdf8;\">Use Kiel Canal (Baltic)<\/span>\n                <\/label>\n                <label class=\"chk-row\">\n                    <input type=\"checkbox\" id=\"avoidPiracy\" class=\"chk-box\">\n                    <span style=\"font-size:13px; color:#ef4444; font-weight:600;\">Avoid Piracy (Cape Route)<\/span>\n                <\/label>\n            <\/div>\n\n            <button onclick=\"calculateRoute()\" class=\"calc-btn\">CALCULATE VOYAGE<\/button>\n        <\/aside>\n\n        <main class=\"main-content\">\n            <div class=\"eta-panel\">\n                <div>\n                    <div style=\"font-size:11px; font-weight:700; color:#38bdf8; margin-bottom:5px;\">ESTIMATED TIME OF ARRIVAL (ETA)<\/div>\n                    <div id=\"etaDisplay\" style=\"font-family:'Chakra Petch'; font-size:42px; font-weight:700; color:white; line-height:1;\">&#8211;.&#8211;.&#8212;- &#8211;:&#8211;<\/div>\n                <\/div>\n                <div style=\"text-align:right;\">\n                    <div style=\"font-size:10px; font-weight:700; color:#64748b;\">ROUTING METHOD<\/div>\n                    <div id=\"routeMethod\" style=\"font-weight:700; color:white; font-size:18px;\">WAITING INPUT<\/div>\n                <\/div>\n            <\/div>\n\n            <div class=\"hazard-grid\">\n                <div class=\"hazard-card\" id=\"cardECA\">\n                    <div style=\"font-size:24px;\">\ud83c\udf31<\/div>\n                    <div>\n                        <div style=\"font-size:10px; font-weight:700; color:#64748b;\">ECA \/ SECA ZONE<\/div>\n                        <div id=\"txtECA\" style=\"font-weight:700; font-size:13px; color:white;\">&#8212;<\/div>\n                    <\/div>\n                <\/div>\n                <div class=\"hazard-card\" id=\"cardHRA\">\n                    <div style=\"font-size:24px;\">\u2620\ufe0f<\/div>\n                    <div>\n                        <div style=\"font-size:10px; font-weight:700; color:#64748b;\">SECURITY (HRA)<\/div>\n                        <div id=\"txtHRA\" style=\"font-weight:700; font-size:13px; color:white;\">&#8212;<\/div>\n                    <\/div>\n                <\/div>\n                <div class=\"hazard-card\" id=\"cardLoad\">\n                    <div style=\"font-size:24px;\">\u2696\ufe0f<\/div>\n                    <div>\n                        <div style=\"font-size:10px; font-weight:700; color:#64748b;\">LOADLINE ZONE<\/div>\n                        <div id=\"txtLoad\" style=\"font-weight:700; font-size:13px; color:white;\">SUMMER<\/div>\n                    <\/div>\n                <\/div>\n            <\/div>\n\n            <div class=\"stat-grid\">\n                <div class=\"stat-cell\">\n                    <div id=\"resDist\" style=\"font-family:'Chakra Petch'; font-size:24px; font-weight:700; color:#38bdf8;\">0<\/div>\n                    <div style=\"font-size:10px; color:#64748b; font-weight:700;\">DISTANCE (NM)<\/div>\n                <\/div>\n                <div class=\"stat-cell\">\n                    <div id=\"resTime\" style=\"font-family:'Chakra Petch'; font-size:24px; font-weight:700; color:white;\">0.0<\/div>\n                    <div style=\"font-size:10px; color:#64748b; font-weight:700;\">STEAMING DAYS<\/div>\n                <\/div>\n                <div class=\"stat-cell\">\n                    <div id=\"resFuel\" style=\"font-family:'Chakra Petch'; font-size:24px; font-weight:700; color:white;\">0<\/div>\n                    <div style=\"font-size:10px; color:#64748b; font-weight:700;\">TOTAL FUEL (MT)<\/div>\n                <\/div>\n                <div class=\"stat-cell\">\n                    <div id=\"resCost\" style=\"font-family:'Chakra Petch'; font-size:24px; font-weight:700; color:#10b981;\">$0<\/div>\n                    <div style=\"font-size:10px; color:#64748b; font-weight:700;\">EST. OPEX<\/div>\n                <\/div>\n            <\/div>\n\n            <div class=\"wp-container\">\n                <div class=\"wp-header\">\n                    <span>VOYAGE WAYPOINTS &amp; PASSAGE PLAN<\/span>\n                    <span>REEDS ROUTING ALGORITHM<\/span>\n                <\/div>\n                <div class=\"wp-list\" id=\"wpList\">\n                    <p style=\"text-align:center; color:#64748b; font-size:12px; margin-top:20px;\">Select ports and click Calculate.<\/p>\n                <\/div>\n            <\/div>\n\n        <\/main>\n    <\/div>\n<\/div>\n\n<script>\n    \/\/ --- 1. FULL DATABASE (600+ PORTS) ---\n    \/\/ Zones: MED_BS, MAR_SEA, ME_GULF, EU_BALT, ECA, MED, ASIA, US_E, US_W, US_ECA, SA_E, SA_W, AFR_W, AFR_E, ARCTIC, US_RIVER\n    const ports = {\n        \/\/ --- 1. NEW: TOURISM & CRUISE (v31) ---\n        \"tr_kus\": {n:\"Kusadasi, TR\", lat:37.86, lon:27.26, z:\"MED\"},\n        \"tr_bod\": {n:\"Bodrum, TR\", lat:37.03, lon:27.43, z:\"MED\"},\n        \"tr_mrm\": {n:\"Marmaris, TR\", lat:36.85, lon:28.27, z:\"MED\"},\n        \"tr_ces\": {n:\"Cesme, TR\", lat:38.32, lon:26.30, z:\"MED\"},\n        \"tr_dik\": {n:\"Dikili, TR\", lat:39.07, lon:26.88, z:\"MED\"},\n        \"gr_myk\": {n:\"Mykonos, GR\", lat:37.44, lon:25.32, z:\"MED\"},\n        \"gr_jtr\": {n:\"Santorini, GR\", lat:36.41, lon:25.43, z:\"MED\"},\n        \"gr_cfu\": {n:\"Corfu, GR\", lat:39.62, lon:19.92, z:\"MED\"},\n        \"hr_dbv\": {n:\"Dubrovnik, HR\", lat:42.65, lon:18.09, z:\"MED\"},\n        \"hr_zad\": {n:\"Zadar, HR\", lat:44.11, lon:15.23, z:\"MED\"},\n        \"me_kot\": {n:\"Kotor, ME\", lat:42.42, lon:18.77, z:\"MED\"},\n        \"sx_phi\": {n:\"Philipsburg (St. Maarten), SX\", lat:18.02, lon:-63.05, z:\"US_E\"},\n        \"aw_orj\": {n:\"Oranjestad, Aruba\", lat:12.52, lon:-70.04, z:\"US_E\"},\n        \"cw_wil\": {n:\"Willemstad, Curacao\", lat:12.11, lon:-68.93, z:\"US_E\"},\n\n        \/\/ --- 2. NEW: ENERGY & STRATEGIC (v31) ---\n        \"bq_ste\": {n:\"St. Eustatius (Statia), BQ\", lat:17.48, lon:-62.99, z:\"US_E\"}, \n        \"in_dah\": {n:\"Dahej, IN\", lat:21.68, lon:72.53, z:\"ASIA\"}, \n        \"in_haz\": {n:\"Hazira, IN\", lat:21.09, lon:72.62, z:\"ASIA\"},\n        \"in_sik\": {n:\"Sikka, IN\", lat:22.48, lon:69.83, z:\"ASIA\"},\n        \"pk_gwd\": {n:\"Gwadar, PK\", lat:25.11, lon:62.33, z:\"ME_GULF\"},\n        \"au_hay\": {n:\"Hay Point, AU\", lat:-21.28, lon:149.30, z:\"ASIA\"},\n        \"au_abb\": {n:\"Abbot Point, AU\", lat:-19.88, lon:148.08, z:\"ASIA\"},\n        \n        \/\/ --- TURKEY & BLACK SEA ---\n        \"tr_ist\": {n:\"Istanbul (Haydarpasa), TR\", lat:41.00, lon:28.95, z:\"MED_BS\"}, \n        \"tr_mer\": {n:\"Mersin, TR\", lat:36.80, lon:34.63, z:\"MED\"},\n        \"tr_izm\": {n:\"Izmir, TR\", lat:38.44, lon:27.14, z:\"MED\"},\n        \"tr_sam\": {n:\"Samsun, TR\", lat:41.29, lon:36.34, z:\"MED_BS\"},\n        \"tr_tra\": {n:\"Trabzon, TR\", lat:41.00, lon:39.72, z:\"MED_BS\"},\n        \"tr_isk\": {n:\"Iskenderun, TR\", lat:36.59, lon:36.17, z:\"MED\"},\n        \"tr_tek\": {n:\"Tekirdag, TR\", lat:40.96, lon:27.50, z:\"MAR_SEA\"},\n        \"tr_ban\": {n:\"Bandirma, TR\", lat:40.35, lon:27.97, z:\"MAR_SEA\"},\n        \"tr_nem\": {n:\"Nemrut Bay, TR\", lat:38.77, lon:26.93, z:\"MED\"},\n        \"tr_ali\": {n:\"Aliaga, TR\", lat:38.83, lon:26.96, z:\"MED\"},\n        \"tr_gem\": {n:\"Gemlik, TR\", lat:40.43, lon:29.13, z:\"MAR_SEA\"},\n        \"tr_dil\": {n:\"Diliskelesi, TR\", lat:40.77, lon:29.54, z:\"MAR_SEA\"},\n        \"tr_zng\": {n:\"Zonguldak, TR\", lat:41.45, lon:31.78, z:\"MED_BS\"},\n        \"tr_kdz\": {n:\"Eregli (KDZ), TR\", lat:41.28, lon:31.41, z:\"MED_BS\"},\n        \"tr_hop\": {n:\"Hopa, TR\", lat:41.41, lon:41.43, z:\"MED_BS\"},\n        \"tr_gir\": {n:\"Giresun, TR\", lat:40.92, lon:38.39, z:\"MED_BS\"},\n        \"tr_der\": {n:\"Derince, TR\", lat:40.75, lon:29.83, z:\"MAR_SEA\"},\n        \"ru_nvs\": {n:\"Novorossiysk, RU\", lat:44.72, lon:37.78, z:\"MED_BS\"},\n        \"ru_tua\": {n:\"Tuapse, RU\", lat:44.09, lon:39.07, z:\"MED_BS\"},\n        \"ru_kav\": {n:\"Kavkaz, RU\", lat:45.34, lon:36.67, z:\"MED_BS\"},\n        \"ua_ods\": {n:\"Odessa, UA\", lat:46.48, lon:30.74, z:\"MED_BS\"},\n        \"ua_ily\": {n:\"Ilyichevsk, UA\", lat:46.32, lon:30.66, z:\"MED_BS\"},\n        \"ua_yuz\": {n:\"Yuzhny, UA\", lat:46.60, lon:31.02, z:\"MED_BS\"},\n        \"ua_sev\": {n:\"Sevastopol, UA\", lat:44.61, lon:33.53, z:\"MED_BS\"},\n        \"ro_cnd\": {n:\"Constanta, RO\", lat:44.17, lon:28.63, z:\"MED_BS\"},\n        \"ro_mid\": {n:\"Midia, RO\", lat:44.35, lon:28.68, z:\"MED_BS\"},\n        \"bg_var\": {n:\"Varna, BG\", lat:43.19, lon:27.91, z:\"MED_BS\"},\n        \"bg_boj\": {n:\"Burgas, BG\", lat:42.49, lon:27.47, z:\"MED_BS\"},\n        \"ge_pot\": {n:\"Poti, GE\", lat:42.15, lon:41.66, z:\"MED_BS\"},\n        \"ge_bat\": {n:\"Batumi, GE\", lat:41.65, lon:41.64, z:\"MED_BS\"},\n\n        \/\/ --- NORTH EUROPE (ECA) ---\n        \"nl_rtm\": {n:\"Rotterdam, NL\", lat:51.95, lon:4.10, z:\"ECA\"},\n        \"nl_ams\": {n:\"Amsterdam, NL\", lat:52.40, lon:4.89, z:\"ECA\"},\n        \"nl_vli\": {n:\"Vlissingen, NL\", lat:51.45, lon:3.59, z:\"ECA\"},\n        \"be_ant\": {n:\"Antwerp, BE\", lat:51.22, lon:4.40, z:\"ECA\"},\n        \"be_zee\": {n:\"Zeebrugge, BE\", lat:51.33, lon:3.22, z:\"ECA\"},\n        \"be_gnt\": {n:\"Ghent, BE\", lat:51.05, lon:3.73, z:\"ECA\"},\n        \"de_ham\": {n:\"Hamburg, DE\", lat:53.55, lon:9.99, z:\"ECA\"},\n        \"de_brv\": {n:\"Bremerhaven, DE\", lat:53.54, lon:8.57, z:\"ECA\"},\n        \"de_wil\": {n:\"Wilhelmshaven, DE\", lat:53.52, lon:8.13, z:\"ECA\"},\n        \"de_ros\": {n:\"Rostock, DE\", lat:54.15, lon:12.10, z:\"ECA\"},\n        \"fr_leh\": {n:\"Le Havre, FR\", lat:49.49, lon:0.10, z:\"ECA\"},\n        \"fr_dun\": {n:\"Dunkirk, FR\", lat:51.05, lon:2.37, z:\"ECA\"},\n        \"fr_rou\": {n:\"Rouen, FR\", lat:49.44, lon:1.08, z:\"ECA\"},\n        \"fr_bre\": {n:\"Brest, FR\", lat:48.39, lon:-4.48, z:\"ECA\"},\n        \"fr_che\": {n:\"Cherbourg, FR\", lat:49.65, lon:-1.61, z:\"ECA\"},\n        \"fr_nan\": {n:\"Nantes, FR\", lat:47.21, lon:-1.57, z:\"ECA\"},\n        \"fr_bod\": {n:\"Bordeaux, FR\", lat:44.83, lon:-0.57, z:\"ECA\"},\n        \n        \/\/ --- UK \/ IRELAND (ECA) ---\n        \"gb_lon\": {n:\"London Gateway, UK\", lat:51.50, lon:0.47, z:\"ECA\"},\n        \"gb_sou\": {n:\"Southampton, UK\", lat:50.90, lon:-1.40, z:\"ECA\"},\n        \"gb_fel\": {n:\"Felixstowe, UK\", lat:51.96, lon:1.35, z:\"ECA\"},\n        \"gb_liv\": {n:\"Liverpool, UK\", lat:53.44, lon:-3.03, z:\"ECA\"},\n        \"gb_imm\": {n:\"Immingham, UK\", lat:53.62, lon:-0.19, z:\"ECA\"},\n        \"gb_hul\": {n:\"Hull, UK\", lat:53.74, lon:-0.28, z:\"ECA\"},\n        \"gb_tee\": {n:\"Teesport, UK\", lat:54.60, lon:-1.16, z:\"ECA\"},\n        \"gb_grm\": {n:\"Grangemouth, UK\", lat:56.02, lon:-3.70, z:\"ECA\"},\n        \"gb_abd\": {n:\"Aberdeen, UK\", lat:57.14, lon:-2.08, z:\"ECA\"},\n        \"gb_mil\": {n:\"Milford Haven, UK\", lat:51.71, lon:-5.03, z:\"ECA\"},\n        \"gb_cdf\": {n:\"Cardiff, UK\", lat:51.46, lon:-3.16, z:\"ECA\"},\n        \"gb_swa\": {n:\"Swansea, UK\", lat:51.61, lon:-3.93, z:\"ECA\"},\n        \"gb_ply\": {n:\"Plymouth, UK\", lat:50.36, lon:-4.16, z:\"ECA\"},\n        \"gb_inv\": {n:\"Inverness, UK\", lat:57.49, lon:-4.22, z:\"ECA\"},\n        \"gb_ldy\": {n:\"Londonderry, UK\", lat:55.01, lon:-7.27, z:\"ECA\"},\n        \"gb_bri\": {n:\"Bristol, UK\", lat:51.50, lon:-2.71, z:\"ECA\"},\n        \"ie_dub\": {n:\"Dublin, IE\", lat:53.34, lon:-6.22, z:\"ECA\"},\n        \"ie_ork\": {n:\"Cork, IE\", lat:51.89, lon:-8.47, z:\"ECA\"},\n        \"ie_sha\": {n:\"Shannon, IE\", lat:52.69, lon:-9.03, z:\"ECA\"},\n\n        \/\/ --- BALTIC \/ SCANDINAVIA ---\n        \"no_osl\": {n:\"Oslo, NO\", lat:59.91, lon:10.75, z:\"EU_BALT\"}, \n        \"no_bgo\": {n:\"Bergen, NO\", lat:60.39, lon:5.32, z:\"ECA\"},\n        \"no_svg\": {n:\"Stavanger, NO\", lat:58.97, lon:5.73, z:\"ECA\"},\n        \"no_nvk\": {n:\"Narvik, NO\", lat:68.43, lon:17.42, z:\"ECA\"},\n        \"no_tos\": {n:\"Tromso, NO\", lat:69.64, lon:18.95, z:\"ECA\"},\n        \"no_krs\": {n:\"Kristiansand, NO\", lat:58.14, lon:8.00, z:\"EU_BALT\"},\n        \"se_got\": {n:\"Gothenburg, SE\", lat:57.70, lon:11.96, z:\"ECA\"},\n        \"se_sto\": {n:\"Stockholm, SE\", lat:59.32, lon:18.06, z:\"EU_BALT\"},\n        \"se_mma\": {n:\"Malmo, SE\", lat:55.60, lon:13.00, z:\"EU_BALT\"},\n        \"se_lla\": {n:\"Lulea, SE\", lat:65.57, lon:22.18, z:\"EU_BALT\"},\n        \"se_gav\": {n:\"Gavle, SE\", lat:60.69, lon:17.17, z:\"EU_BALT\"},\n        \"se_nrk\": {n:\"Norrkoping, SE\", lat:58.60, lon:16.22, z:\"EU_BALT\"},\n        \"se_hel\": {n:\"Helsingborg, SE\", lat:56.03, lon:12.69, z:\"ECA\"},\n        \"fi_hel\": {n:\"Helsinki, FI\", lat:60.16, lon:24.93, z:\"EU_BALT\"},\n        \"fi_tku\": {n:\"Turku, FI\", lat:60.45, lon:22.26, z:\"EU_BALT\"},\n        \"fi_ktk\": {n:\"Kotka, FI\", lat:60.45, lon:26.96, z:\"EU_BALT\"},\n        \"fi_oul\": {n:\"Oulu, FI\", lat:65.01, lon:25.43, z:\"EU_BALT\"},\n        \"fi_por\": {n:\"Pori, FI\", lat:61.60, lon:21.57, z:\"EU_BALT\"},\n        \"fi_kok\": {n:\"Kokkola, FI\", lat:63.84, lon:23.00, z:\"EU_BALT\"},\n        \"fi_rmu\": {n:\"Rauma, FI\", lat:61.12, lon:21.48, z:\"EU_BALT\"},\n        \"ru_stp\": {n:\"St. Petersburg, RU\", lat:59.93, lon:30.33, z:\"EU_BALT\"},\n        \"ru_ust\": {n:\"Ust-Luga, RU\", lat:59.65, lon:28.27, z:\"EU_BALT\"},\n        \"ru_pri\": {n:\"Primorsk, RU\", lat:60.36, lon:28.63, z:\"EU_BALT\"},\n        \"ru_kgd\": {n:\"Kaliningrad, RU\", lat:54.69, lon:20.43, z:\"EU_BALT\"},\n        \"ru_vyb\": {n:\"Vyborg, RU\", lat:60.70, lon:28.73, z:\"EU_BALT\"},\n        \"pl_gdn\": {n:\"Gdansk, PL\", lat:54.35, lon:18.66, z:\"EU_BALT\"},\n        \"pl_gdy\": {n:\"Gdynia, PL\", lat:54.53, lon:18.55, z:\"EU_BALT\"},\n        \"pl_szc\": {n:\"Szczecin, PL\", lat:53.43, lon:14.56, z:\"EU_BALT\"},\n        \"lt_klj\": {n:\"Klaipeda, LT\", lat:55.67, lon:21.14, z:\"EU_BALT\"},\n        \"lv_rix\": {n:\"Riga, LV\", lat:56.96, lon:24.09, z:\"EU_BALT\"},\n        \"lv_vnt\": {n:\"Ventspils, LV\", lat:57.40, lon:21.55, z:\"EU_BALT\"},\n        \"ee_tll\": {n:\"Tallinn, EE\", lat:59.45, lon:24.73, z:\"EU_BALT\"},\n        \"dk_cph\": {n:\"Copenhagen, DK\", lat:55.70, lon:12.60, z:\"EU_BALT\"},\n        \"dk_aar\": {n:\"Aarhus, DK\", lat:56.15, lon:10.22, z:\"ECA\"},\n        \"dk_ebj\": {n:\"Esbjerg, DK\", lat:55.46, lon:8.43, z:\"ECA\"},\n\n        \/\/ --- MEDITERRANEAN ---\n        \"es_val\": {n:\"Valencia, ES\", lat:39.46, lon:-0.37, z:\"MED\"},\n        \"es_bcn\": {n:\"Barcelona, ES\", lat:41.34, lon:2.16, z:\"MED\"},\n        \"es_alg\": {n:\"Algeciras, ES\", lat:36.14, lon:-5.45, z:\"MED\"},\n        \"es_tar\": {n:\"Tarragona, ES\", lat:41.11, lon:1.24, z:\"MED\"},\n        \"es_sag\": {n:\"Sagunto, ES\", lat:39.63, lon:-0.20, z:\"MED\"},\n        \"fr_mrs\": {n:\"Marseille, FR\", lat:43.29, lon:5.36, z:\"MED\"},\n        \"fr_fos\": {n:\"Fos-sur-Mer, FR\", lat:43.43, lon:4.93, z:\"MED\"},\n        \"fr_set\": {n:\"Sete, FR\", lat:43.40, lon:3.70, z:\"MED\"},\n        \"it_gen\": {n:\"Genoa, IT\", lat:44.40, lon:8.91, z:\"MED\"},\n        \"it_spe\": {n:\"La Spezia, IT\", lat:44.10, lon:9.82, z:\"MED\"},\n        \"it_liv\": {n:\"Livorno, IT\", lat:43.55, lon:10.30, z:\"MED\"},\n        \"it_nap\": {n:\"Naples, IT\", lat:40.85, lon:14.26, z:\"MED\"},\n        \"it_gio\": {n:\"Gioia Tauro, IT\", lat:38.43, lon:15.91, z:\"MED\"},\n        \"it_trs\": {n:\"Trieste, IT\", lat:45.65, lon:13.77, z:\"MED\"},\n        \"it_ven\": {n:\"Venice, IT\", lat:45.44, lon:12.31, z:\"MED\"},\n        \"it_tar\": {n:\"Taranto, IT\", lat:40.48, lon:17.22, z:\"MED\"},\n        \"it_bri\": {n:\"Bari, IT\", lat:41.11, lon:16.87, z:\"MED\"},\n        \"it_pmo\": {n:\"Palermo, IT\", lat:38.11, lon:13.36, z:\"MED\"},\n        \"it_sal\": {n:\"Salerno, IT\", lat:40.67, lon:14.75, z:\"MED\"},\n        \"it_cag\": {n:\"Cagliari, IT\", lat:39.21, lon:9.11, z:\"MED\"},\n        \"si_kop\": {n:\"Koper, SI\", lat:45.54, lon:13.73, z:\"MED\"},\n        \"hr_rjk\": {n:\"Rijeka, HR\", lat:45.32, lon:14.44, z:\"MED\"},\n        \"hr_spu\": {n:\"Split, HR\", lat:43.50, lon:16.44, z:\"MED\"},\n        \"al_drz\": {n:\"Durres, AL\", lat:41.32, lon:19.45, z:\"MED\"},\n        \"gr_pir\": {n:\"Piraeus, GR\", lat:37.94, lon:23.63, z:\"MED\"},\n        \"gr_skg\": {n:\"Thessaloniki, GR\", lat:40.64, lon:22.94, z:\"MED\"},\n        \"gr_sou\": {n:\"Souda Bay, GR\", lat:35.49, lon:24.07, z:\"MED\"},\n        \"gr_vol\": {n:\"Volos, GR\", lat:39.35, lon:22.94, z:\"MED\"},\n        \"gr_kav\": {n:\"Kavala, GR\", lat:40.93, lon:24.40, z:\"MED\"},\n        \"mt_mar\": {n:\"Marsaxlokk, MT\", lat:35.83, lon:14.54, z:\"MED\"},\n        \"cy_lim\": {n:\"Limassol, CY\", lat:34.67, lon:33.02, z:\"MED\"},\n        \"cy_lca\": {n:\"Larnaca, CY\", lat:34.91, lon:33.64, z:\"MED\"},\n        \"il_hfa\": {n:\"Haifa, IL\", lat:32.79, lon:34.98, z:\"MED\"},\n        \"il_ash\": {n:\"Ashdod, IL\", lat:31.83, lon:34.65, z:\"MED\"},\n        \"eg_aly\": {n:\"Alexandria, EG\", lat:31.19, lon:29.87, z:\"MED\"},\n        \"eg_dam\": {n:\"Damietta, EG\", lat:31.45, lon:31.75, z:\"MED\"},\n        \"eg_psd\": {n:\"Port Said, EG\", lat:31.26, lon:32.30, z:\"MED\"},\n        \"ly_tip\": {n:\"Tripoli, LY\", lat:32.88, lon:13.19, z:\"MED\"},\n        \"ly_mis\": {n:\"Misurata, LY\", lat:32.36, lon:15.22, z:\"MED\"},\n        \"ly_ben\": {n:\"Benghazi, LY\", lat:32.12, lon:20.05, z:\"MED\"},\n        \"ly_tob\": {n:\"Tobruk, LY\", lat:32.07, lon:23.98, z:\"MED\"},\n        \"tn_tun\": {n:\"Tunis, TN\", lat:36.80, lon:10.18, z:\"MED\"},\n        \"tn_sfa\": {n:\"Sfax, TN\", lat:34.73, lon:10.77, z:\"MED\"},\n        \"tn_gab\": {n:\"Gabes, TN\", lat:33.90, lon:10.11, z:\"MED\"},\n        \"tn_biz\": {n:\"Bizerte, TN\", lat:37.27, lon:9.88, z:\"MED\"},\n        \"dz_alg\": {n:\"Algiers, DZ\", lat:36.75, lon:3.06, z:\"MED\"},\n        \"dz_arz\": {n:\"Arzew, DZ\", lat:35.86, lon:-0.29, z:\"MED\"},\n        \"dz_ski\": {n:\"Skikda, DZ\", lat:36.88, lon:6.94, z:\"MED\"},\n        \"dz_bja\": {n:\"Bejaia, DZ\", lat:36.74, lon:5.08, z:\"MED\"},\n        \"dz_ann\": {n:\"Annaba, DZ\", lat:36.91, lon:7.78, z:\"MED\"},\n        \"ma_tng\": {n:\"Tanger Med, MA\", lat:35.88, lon:-5.50, z:\"MED\"},\n\n        \/\/ --- AMERICAS (US\/CAN\/MEX) ---\n        \"us_nyc\": {n:\"New York, US\", lat:40.71, lon:-74.00, z:\"US_E\"},\n        \"us_bal\": {n:\"Baltimore, US\", lat:39.29, lon:-76.61, z:\"US_E\"},\n        \"us_orf\": {n:\"Norfolk, US\", lat:36.93, lon:-76.32, z:\"US_E\"},\n        \"us_chs\": {n:\"Charleston, US\", lat:32.77, lon:-79.93, z:\"US_E\"},\n        \"us_sav\": {n:\"Savannah, US\", lat:32.08, lon:-81.09, z:\"US_E\"},\n        \"us_jax\": {n:\"Jacksonville, US\", lat:30.33, lon:-81.65, z:\"US_E\"},\n        \"us_mia\": {n:\"Miami, US\", lat:25.76, lon:-80.19, z:\"US_E\"},\n        \"us_pev\": {n:\"Port Everglades, US\", lat:26.09, lon:-80.12, z:\"US_E\"},\n        \"us_hou\": {n:\"Houston, US\", lat:29.76, lon:-95.36, z:\"US_E\"},\n        \"us_gal\": {n:\"Galveston, US\", lat:29.30, lon:-94.79, z:\"US_E\"},\n        \"us_bpt\": {n:\"Port Arthur, US\", lat:29.86, lon:-93.93, z:\"US_E\"},\n        \"us_btr\": {n:\"Baton Rouge, US\", lat:30.43, lon:-91.19, z:\"US_E\"},\n        \"us_lch\": {n:\"Lake Charles, US\", lat:30.21, lon:-93.22, z:\"US_E\"},\n        \"us_mob\": {n:\"Mobile, US\", lat:30.69, lon:-88.03, z:\"US_E\"},\n        \"us_tpa\": {n:\"Tampa, US\", lat:27.95, lon:-82.45, z:\"US_E\"},\n        \"us_msy\": {n:\"New Orleans, US\", lat:29.95, lon:-90.07, z:\"US_E\"},\n        \"us_bos\": {n:\"Boston, US\", lat:42.36, lon:-71.05, z:\"US_E\"},\n        \"us_phl\": {n:\"Philadelphia, US\", lat:39.95, lon:-75.16, z:\"US_E\"},\n        \"us_crp\": {n:\"Corpus Christi, US\", lat:27.80, lon:-97.39, z:\"US_E\"},\n        \"ca_hal\": {n:\"Halifax, CA\", lat:44.64, lon:-63.57, z:\"US_E\"},\n        \"ca_mtl\": {n:\"Montreal, CA\", lat:45.50, lon:-73.56, z:\"US_E\"},\n        \"ca_qbc\": {n:\"Quebec City, CA\", lat:46.81, lon:-71.20, z:\"US_E\"},\n        \"ca_sjn\": {n:\"Saint John, CA\", lat:45.27, lon:-66.06, z:\"US_E\"},\n        \"ca_sjf\": {n:\"St. John's (NFLD), CA\", lat:47.56, lon:-52.70, z:\"US_E\"},\n        \"ca_sep\": {n:\"Sept-Iles, CA\", lat:50.20, lon:-66.38, z:\"US_E\"},\n        \"ca_tor\": {n:\"Toronto, CA\", lat:43.63, lon:-79.38, z:\"US_E\"}, \n        \"ca_ham\": {n:\"Hamilton, CA\", lat:43.27, lon:-79.83, z:\"US_E\"},\n        \"us_chi\": {n:\"Chicago, US\", lat:41.88, lon:-87.63, z:\"US_E\"},\n        \"us_det\": {n:\"Detroit, US\", lat:42.33, lon:-83.05, z:\"US_E\"},\n        \"us_cle\": {n:\"Cleveland, US\", lat:41.50, lon:-81.70, z:\"US_E\"},\n        \"us_dlh\": {n:\"Duluth, US\", lat:46.78, lon:-92.10, z:\"US_E\"},\n        \"mx_alt\": {n:\"Altamira, MX\", lat:22.38, lon:-97.89, z:\"US_E\"},\n        \"mx_tam\": {n:\"Tampico, MX\", lat:22.25, lon:-97.83, z:\"US_E\"},\n        \"mx_ver\": {n:\"Veracruz, MX\", lat:19.20, lon:-96.14, z:\"US_E\"},\n        \"mx_coa\": {n:\"Coatzacoalcos, MX\", lat:18.15, lon:-94.42, z:\"US_E\"},\n        \"mx_pgo\": {n:\"Progreso, MX\", lat:21.32, lon:-89.67, z:\"US_E\"},\n        \"mx_czm\": {n:\"Cozumel, MX\", lat:20.51, lon:-86.95, z:\"US_E\"},\n        \"bz_bze\": {n:\"Belize City, BZ\", lat:17.49, lon:-88.18, z:\"US_E\"},\n        \"hn_pcr\": {n:\"Puerto Cortes, HN\", lat:15.84, lon:-87.94, z:\"US_E\"},\n        \"cr_pli\": {n:\"Puerto Limon, CR\", lat:9.99, lon:-83.02, z:\"US_E\"},\n        \"pa_col\": {n:\"Colon, PA\", lat:9.36, lon:-79.89, z:\"SA_E\"},\n        \"bs_fpo\": {n:\"Freeport, BS\", lat:26.51, lon:-78.77, z:\"US_E\"},\n        \"bs_nas\": {n:\"Nassau, BS\", lat:25.08, lon:-77.34, z:\"US_E\"},\n        \"jm_kin\": {n:\"Kingston, JM\", lat:17.96, lon:-76.80, z:\"US_E\"},\n        \"jm_mbj\": {n:\"Montego Bay, JM\", lat:18.47, lon:-77.92, z:\"US_E\"},\n        \"pr_sju\": {n:\"San Juan, PR\", lat:18.46, lon:-66.11, z:\"US_E\"},\n        \"do_cau\": {n:\"Caucedo, DO\", lat:18.43, lon:-69.63, z:\"US_E\"},\n        \"tt_pos\": {n:\"Port of Spain, TT\", lat:10.64, lon:-61.51, z:\"US_E\"},\n        \"bb_bri\": {n:\"Bridgetown, BB\", lat:13.10, lon:-59.63, z:\"US_E\"},\n        \"cu_hav\": {n:\"Havana, CU\", lat:23.14, lon:-82.34, z:\"US_E\"},\n        \"co_baq\": {n:\"Barranquilla, CO\", lat:11.02, lon:-74.79, z:\"SA_E\"},\n        \"co_ctg\": {n:\"Cartagena, CO\", lat:10.40, lon:-75.53, z:\"SA_E\"},\n        \"ve_mar\": {n:\"Maracaibo, VE\", lat:10.65, lon:-71.61, z:\"SA_E\"},\n        \"ve_lag\": {n:\"La Guaira, VE\", lat:10.60, lon:-66.93, z:\"SA_E\"},\n        \"pa_mit\": {n:\"Manzanillo (Panama), PA\", lat:9.36, lon:-79.88, z:\"SA_E\"},\n        \"hmd_bda\": {n:\"Hamilton, BM\", lat:32.29, lon:-64.78, z:\"US_E\"},\n\n        \/\/ --- AMERICAS (West) ---\n        \"us_lax\": {n:\"Los Angeles, US\", lat:33.74, lon:-118.24, z:\"US_W\"},\n        \"us_lgb\": {n:\"Long Beach, US\", lat:33.75, lon:-118.21, z:\"US_W\"},\n        \"us_oak\": {n:\"Oakland, US\", lat:37.80, lon:-122.27, z:\"US_W\"},\n        \"us_sfo\": {n:\"San Francisco, US\", lat:37.80, lon:-122.40, z:\"US_W\"},\n        \"us_sea\": {n:\"Seattle, US\", lat:47.60, lon:-122.33, z:\"US_W\"},\n        \"us_tac\": {n:\"Tacoma, US\", lat:47.27, lon:-122.41, z:\"US_W\"},\n        \"us_pdx\": {n:\"Portland (OR), US\", lat:45.51, lon:-122.67, z:\"US_W\"},\n        \"us_san\": {n:\"San Diego, US\", lat:32.71, lon:-117.17, z:\"US_W\"},\n        \"ca_van\": {n:\"Vancouver, CA\", lat:49.28, lon:-123.12, z:\"US_W\"},\n        \"ca_prr\": {n:\"Prince Rupert, CA\", lat:54.31, lon:-130.32, z:\"US_W\"},\n        \"us_anc\": {n:\"Anchorage, US\", lat:61.21, lon:-149.90, z:\"US_W\"},\n        \"us_hnl\": {n:\"Honolulu, HI, US\", lat:21.30, lon:-157.86, z:\"US_W\"},\n        \"mx_aca\": {n:\"Acapulco, MX\", lat:16.82, lon:-99.90, z:\"US_W\"},\n        \"sv_aqj\": {n:\"Acajutla, SV\", lat:13.57, lon:-89.83, z:\"US_W\"},\n        \"gt_prq\": {n:\"Puerto Quetzal, GT\", lat:13.91, lon:-90.79, z:\"US_W\"},\n        \"pa_pnm\": {n:\"Panama City (Balboa), PA\", lat:8.95, lon:-79.56, z:\"US_W\"},\n        \"co_bun\": {n:\"Buenaventura, CO\", lat:3.88, lon:-77.06, z:\"SA_W\"},\n        \"ec_gye\": {n:\"Guayaquil, EC\", lat:-2.28, lon:-79.90, z:\"SA_W\"},\n        \"ec_esm\": {n:\"Esmeraldas, EC\", lat:1.01, lon:-79.67, z:\"SA_W\"},\n        \"pe_cal\": {n:\"Callao, PE\", lat:-12.05, lon:-77.14, z:\"SA_W\"},\n        \"pe_mat\": {n:\"Matarani, PE\", lat:-16.99, lon:-72.10, z:\"SA_W\"},\n        \"cl_ari\": {n:\"Arica, CL\", lat:-18.47, lon:-70.32, z:\"SA_W\"},\n        \"cl_iqu\": {n:\"Iquique, CL\", lat:-20.21, lon:-70.15, z:\"SA_W\"},\n        \"cl_anf\": {n:\"Antofagasta, CL\", lat:-23.63, lon:-70.41, z:\"SA_W\"},\n        \"cl_vap\": {n:\"Valparaiso, CL\", lat:-33.04, lon:-71.62, z:\"SA_W\"},\n        \"cl_sai\": {n:\"San Antonio, CL\", lat:-33.58, lon:-71.61, z:\"SA_W\"},\n        \"cl_pmt\": {n:\"Puerto Montt, CL\", lat:-41.48, lon:-72.95, z:\"SA_W\"},\n        \"cl_puq\": {n:\"Punta Arenas, CL\", lat:-53.16, lon:-70.93, z:\"SA_W\"},\n        \"hn_slo\": {n:\"San Lorenzo, HN\", lat:13.41, lon:-87.44, z:\"US_W\"},\n\n        \/\/ --- SOUTH AMERICA (East) ---\n        \"ar_bue\": {n:\"Buenos Aires, AR\", lat:-34.60, lon:-58.38, z:\"SA_E\"},\n        \"ar_slz\": {n:\"San Lorenzo, AR\", lat:-32.75, lon:-60.73, z:\"SA_E\"},\n        \"ar_ros\": {n:\"Rosario, AR\", lat:-32.95, lon:-60.64, z:\"SA_E\"},\n        \"ar_nec\": {n:\"Necochea, AR\", lat:-38.58, lon:-58.70, z:\"SA_E\"},\n        \"ar_bbl\": {n:\"Bahia Blanca, AR\", lat:-38.79, lon:-62.26, z:\"SA_E\"},\n        \"ar_ush\": {n:\"Ushuaia, AR\", lat:-54.80, lon:-68.30, z:\"SA_W\"}, \n        \"uy_mvd\": {n:\"Montevideo, UY\", lat:-34.90, lon:-56.19, z:\"SA_E\"},\n        \"uy_npa\": {n:\"Nueva Palmira, UY\", lat:-33.87, lon:-58.41, z:\"SA_E\"},\n        \"br_rio\": {n:\"Rio de Janeiro, BR\", lat:-22.90, lon:-43.17, z:\"SA_E\"},\n        \"br_ssz\": {n:\"Santos, BR\", lat:-23.96, lon:-46.29, z:\"SA_E\"},\n        \"br_png\": {n:\"Paranagua, BR\", lat:-25.51, lon:-48.50, z:\"SA_E\"},\n        \"br_itj\": {n:\"Itajai, BR\", lat:-26.91, lon:-48.65, z:\"SA_E\"},\n        \"br_rio_g\": {n:\"Rio Grande, BR\", lat:-32.05, lon:-52.09, z:\"SA_E\"},\n        \"br_vix\": {n:\"Vitoria, BR\", lat:-20.31, lon:-40.28, z:\"SA_E\"},\n        \"br_ssa\": {n:\"Salvador, BR\", lat:-12.96, lon:-38.50, z:\"SA_E\"},\n        \"br_rec\": {n:\"Recife, BR\", lat:-8.05, lon:-34.87, z:\"SA_E\"},\n        \"br_mac\": {n:\"Maceio, BR\", lat:-9.67, lon:-35.72, z:\"SA_E\"},\n        \"br_nat\": {n:\"Natal, BR\", lat:-5.77, lon:-35.20, z:\"SA_E\"},\n        \"br_bel\": {n:\"Belem, BR\", lat:-1.45, lon:-48.50, z:\"SA_E\"},\n        \"br_ftz\": {n:\"Fortaleza, BR\", lat:-3.71, lon:-38.47, z:\"SA_E\"},\n        \"br_itq\": {n:\"Itaqui, BR\", lat:-2.57, lon:-44.37, z:\"SA_E\"},\n        \"br_tub\": {n:\"Tubarao, BR\", lat:-20.29, lon:-40.24, z:\"SA_E\"},\n        \"br_sep\": {n:\"Sepetiba, BR\", lat:-22.97, lon:-43.85, z:\"SA_E\"},\n        \"br_pdm\": {n:\"Ponta da Madeira, BR\", lat:-2.56, lon:-44.38, z:\"SA_E\"},\n        \"br_man\": {n:\"Manaus, BR\", lat:-3.14, lon:-59.98, z:\"SA_E\"},\n        \"gy_geo\": {n:\"Georgetown, GY\", lat:6.81, lon:-58.16, z:\"SA_E\"},\n        \"fk_stan\": {n:\"Stanley, FK\", lat:-51.69, lon:-57.85, z:\"SA_E\"},\n\n        \/\/ --- AFRICA ---\n        \"za_dur\": {n:\"Durban, ZA\", lat:-29.85, lon:31.02, z:\"AFR_E\"},\n        \"za_cpt\": {n:\"Cape Town, ZA\", lat:-33.90, lon:18.40, z:\"AFR_W\"},\n        \"za_plz\": {n:\"Port Elizabeth, ZA\", lat:-33.96, lon:25.62, z:\"AFR_E\"},\n        \"za_rby\": {n:\"Richards Bay, ZA\", lat:-28.79, lon:32.09, z:\"AFR_E\"},\n        \"na_wvb\": {n:\"Walvis Bay, NA\", lat:-22.94, lon:14.50, z:\"AFR_W\"},\n        \"na_nam\": {n:\"Namibe, AO\", lat:-15.19, lon:12.15, z:\"AFR_W\"},\n        \"ao_lad\": {n:\"Luanda, AO\", lat:-8.83, lon:13.22, z:\"AFR_W\"},\n        \"ao_lob\": {n:\"Lobito, AO\", lat:-12.35, lon:13.54, z:\"AFR_W\"},\n        \"cd_mat\": {n:\"Matadi, CD\", lat:-5.82, lon:13.46, z:\"AFR_W\"},\n        \"cg_pnr\": {n:\"Pointe Noire, CG\", lat:-4.79, lon:11.84, z:\"AFR_W\"},\n        \"ga_lbv\": {n:\"Libreville, GA\", lat:0.40, lon:9.44, z:\"AFR_W\"},\n        \"ga_owe\": {n:\"Owendo, GA\", lat:0.28, lon:9.50, z:\"AFR_W\"},\n        \"cm_dla\": {n:\"Douala, CM\", lat:4.05, lon:9.71, z:\"AFR_W\"},\n        \"ng_los\": {n:\"Lagos, NG\", lat:6.45, lon:3.40, z:\"AFR_W\"},\n        \"ng_phc\": {n:\"Port Harcourt, NG\", lat:4.77, lon:7.00, z:\"AFR_W\"},\n        \"gh_tem\": {n:\"Tema, GH\", lat:5.63, lon:0.01, z:\"AFR_W\"},\n        \"gh_tak\": {n:\"Takoradi, GH\", lat:4.88, lon:-1.74, z:\"AFR_W\"},\n        \"ci_abj\": {n:\"Abidjan, CI\", lat:5.25, lon:-4.02, z:\"AFR_W\"},\n        \"ci_sp\": {n:\"San Pedro, CI\", lat:4.74, lon:-6.63, z:\"AFR_W\"},\n        \"lr_mlw\": {n:\"Monrovia, LR\", lat:6.33, lon:-10.80, z:\"AFR_W\"},\n        \"gn_cky\": {n:\"Conakry, GN\", lat:9.51, lon:-13.71, z:\"AFR_W\"},\n        \"sn_dkr\": {n:\"Dakar, SN\", lat:14.71, lon:-17.46, z:\"AFR_W\"},\n        \"gw_bis\": {n:\"Bissau, GW\", lat:11.85, lon:-15.59, z:\"AFR_W\"},\n        \"sn_bjul\": {n:\"Banjul, GM\", lat:13.45, lon:-16.57, z:\"AFR_W\"},\n        \"mr_nkc\": {n:\"Nouakchott, MR\", lat:18.01, lon:-16.03, z:\"AFR_W\"},\n        \"ma_aga\": {n:\"Agadir, MA\", lat:30.42, lon:-9.63, z:\"AFR_W\"},\n        \"ma_sfi\": {n:\"Safi, MA\", lat:32.29, lon:-9.24, z:\"AFR_W\"},\n        \"ma_cas\": {n:\"Casablanca, MA\", lat:33.57, lon:-7.63, z:\"AFR_W\"},\n        \"mz_mpm\": {n:\"Maputo, MZ\", lat:-25.96, lon:32.57, z:\"AFR_E\"},\n        \"mz_beu\": {n:\"Beira, MZ\", lat:-19.83, lon:34.83, z:\"AFR_E\"},\n        \"tz_dar\": {n:\"Dar es Salaam, TZ\", lat:-6.80, lon:39.28, z:\"AFR_E\"},\n        \"tz_zng\": {n:\"Zanzibar, TZ\", lat:-6.16, lon:39.19, z:\"AFR_E\"},\n        \"ke_mom\": {n:\"Mombasa, KE\", lat:-4.04, lon:39.66, z:\"AFR_E\"},\n        \"mu_plu\": {n:\"Port Louis, MU\", lat:-20.15, lon:57.49, z:\"AFR_E\"},\n        \"mg_toa\": {n:\"Toamasina, MG\", lat:-18.15, lon:49.41, z:\"AFR_E\"},\n        \"sd_pzu\": {n:\"Port Sudan, SD\", lat:19.61, lon:37.21, z:\"ME\"},\n        \"dj_jib\": {n:\"Djibouti, DJ\", lat:11.60, lon:43.14, z:\"ME\"},\n\n        \/\/ --- MIDDLE EAST ---\n        \"eg_szc\": {n:\"Suez Port, EG\", lat:29.93, lon:32.56, z:\"MED\"}, \n        \"sa_jed\": {n:\"Jeddah, SA\", lat:21.48, lon:39.19, z:\"ME\"},\n        \"sa_yan\": {n:\"Yanbu, SA\", lat:24.09, lon:38.06, z:\"ME\"},\n        \"om_sal\": {n:\"Salalah, OM\", lat:17.01, lon:54.09, z:\"ME\"},\n        \"om_soh\": {n:\"Sohar, OM\", lat:24.37, lon:56.72, z:\"ME\"},\n        \"om_mct\": {n:\"Muscat, OM\", lat:23.63, lon:58.56, z:\"ME\"},\n        \"ae_klf\": {n:\"Khor Fakkan, AE\", lat:25.33, lon:56.35, z:\"ME\"}, \n        \"ae_jeb\": {n:\"Jebel Ali, UAE\", lat:25.00, lon:55.06, z:\"ME_GULF\"},\n        \"ae_fuj\": {n:\"Fujairah, UAE\", lat:25.11, lon:56.32, z:\"ME\"},\n        \"qa_doh\": {n:\"Doha, QA\", lat:25.28, lon:51.53, z:\"ME_GULF\"},\n        \"qa_rlf\": {n:\"Ras Laffan, QA\", lat:25.92, lon:51.57, z:\"ME_GULF\"},\n        \"bh_kbs\": {n:\"Khalifa Bin Salman, BH\", lat:26.17, lon:50.71, z:\"ME_GULF\"},\n        \"sa_dam\": {n:\"Dammam, SA\", lat:26.43, lon:50.10, z:\"ME_GULF\"},\n        \"sa_ras\": {n:\"Ras Tanura, SA\", lat:26.63, lon:50.16, z:\"ME_GULF\"},\n        \"kw_kwi\": {n:\"Kuwait City, KW\", lat:29.37, lon:47.97, z:\"ME_GULF\"},\n        \"kw_saa\": {n:\"Shuaiba, KW\", lat:29.04, lon:48.15, z:\"ME_GULF\"},\n        \"iq_uqr\": {n:\"Umm Qasr, IQ\", lat:30.03, lon:47.92, z:\"ME_GULF\"},\n        \"iq_alf\": {n:\"Abu Fulus, IQ\", lat:30.45, lon:48.02, z:\"ME_GULF\"},\n        \"ir_bnd\": {n:\"Bandar Abbas, IR\", lat:27.13, lon:56.07, z:\"ME_GULF\"},\n        \"ir_bsh\": {n:\"Bushehr, IR\", lat:28.97, lon:50.82, z:\"ME_GULF\"},\n        \"ir_bdk\": {n:\"Bandar Khomeini, IR\", lat:30.43, lon:49.09, z:\"ME_GULF\"},\n        \"jo_aqb\": {n:\"Aqaba, JO\", lat:29.53, lon:35.00, z:\"ME\"},\n\n        \/\/ --- ASIA ---\n        \"pk_khi\": {n:\"Karachi, PK\", lat:24.86, lon:66.99, z:\"ASIA\"},\n        \"pk_bqm\": {n:\"Port Qasim, PK\", lat:24.77, lon:67.34, z:\"ASIA\"},\n        \"in_mun\": {n:\"Mundra, IN\", lat:22.74, lon:69.70, z:\"ASIA\"},\n        \"in_bom\": {n:\"Mumbai (Nhava Sheva), IN\", lat:18.95, lon:72.95, z:\"ASIA\"},\n        \"in_kwr\": {n:\"Karwar, IN\", lat:14.80, lon:74.12, z:\"ASIA\"},\n        \"in_coc\": {n:\"Cochin, IN\", lat:9.93, lon:76.26, z:\"ASIA\"},\n        \"in_maa\": {n:\"Chennai, IN\", lat:13.08, lon:80.29, z:\"ASIA\"},\n        \"in_vtz\": {n:\"Visakhapatnam, IN\", lat:17.69, lon:83.29, z:\"ASIA\"},\n        \"in_prt\": {n:\"Paradip, IN\", lat:20.26, lon:86.67, z:\"ASIA\"},\n        \"in_ccu\": {n:\"Kolkata, IN\", lat:22.57, lon:88.36, z:\"ASIA\"},\n        \"bd_chi\": {n:\"Chittagong, BD\", lat:22.34, lon:91.80, z:\"ASIA\"},\n        \"bd_mgl\": {n:\"Mongla, BD\", lat:22.48, lon:89.60, z:\"ASIA\"},\n        \"mm_rgn\": {n:\"Yangon, MM\", lat:16.77, lon:96.16, z:\"ASIA\"},\n        \"th_bkk\": {n:\"Bangkok, TH\", lat:13.70, lon:100.56, z:\"ASIA\"},\n        \"th_lch\": {n:\"Laem Chabang, TH\", lat:13.08, lon:100.91, z:\"ASIA\"},\n        \"th_map\": {n:\"Map Ta Phut, TH\", lat:12.67, lon:101.14, z:\"ASIA\"},\n        \"my_pen\": {n:\"Penang, MY\", lat:5.41, lon:100.36, z:\"ASIA\"},\n        \"my_pkl\": {n:\"Port Klang, MY\", lat:3.03, lon:101.37, z:\"ASIA\"},\n        \"my_tpp\": {n:\"Tanjung Pelepas, MY\", lat:1.36, lon:103.55, z:\"ASIA\"},\n        \"my_bki\": {n:\"Kota Kinabalu, MY\", lat:5.98, lon:116.07, z:\"ASIA\"},\n        \"my_kch\": {n:\"Kuching, MY\", lat:1.55, lon:110.35, z:\"ASIA\"},\n        \"my_btu\": {n:\"Bintulu, MY\", lat:3.23, lon:113.06, z:\"ASIA\"},\n        \"my_twu\": {n:\"Tawau, MY\", lat:4.24, lon:117.89, z:\"ASIA\"},\n        \"my_sdk\": {n:\"Sandakan, MY\", lat:5.84, lon:118.11, z:\"ASIA\"},\n        \"bn_mua\": {n:\"Muara, BN\", lat:5.03, lon:115.07, z:\"ASIA\"},\n        \"sg_sin\": {n:\"Singapore, SG\", lat:1.25, lon:103.80, z:\"ASIA\"},\n        \"id_blw\": {n:\"Belawan, ID\", lat:3.78, lon:98.69, z:\"ASIA\"},\n        \"id_jkt\": {n:\"Jakarta, ID\", lat:-6.10, lon:106.87, z:\"ASIA\"},\n        \"id_smg\": {n:\"Semarang, ID\", lat:-6.96, lon:110.42, z:\"ASIA\"},\n        \"id_sby\": {n:\"Surabaya, ID\", lat:-7.20, lon:112.73, z:\"ASIA\"},\n        \"id_mak\": {n:\"Makassar, ID\", lat:-5.12, lon:119.40, z:\"ASIA\"},\n        \"id_dum\": {n:\"Dumai, ID\", lat:1.68, lon:101.45, z:\"ASIA\"},\n        \"id_plm\": {n:\"Palembang, ID\", lat:-2.99, lon:104.75, z:\"ASIA\"},\n        \"id_pnj\": {n:\"Panjang, ID\", lat:-5.47, lon:105.32, z:\"ASIA\"},\n        \"id_pnk\": {n:\"Pontianak, ID\", lat:-0.02, lon:109.33, z:\"ASIA\"},\n        \"id_bpn\": {n:\"Balikpapan, ID\", lat:-1.27, lon:116.81, z:\"ASIA\"},\n        \"id_smd\": {n:\"Samarinda, ID\", lat:-0.50, lon:117.15, z:\"ASIA\"},\n        \"id_bdj\": {n:\"Banjarmasin, ID\", lat:-3.33, lon:114.57, z:\"ASIA\"},\n        \"id_cig\": {n:\"Cigading, ID\", lat:-6.01, lon:105.95, z:\"ASIA\"},\n        \"id_tba\": {n:\"Taboneo, ID\", lat:-3.70, lon:114.45, z:\"ASIA\"}, \n        \"vn_hph\": {n:\"Haiphong, VN\", lat:20.84, lon:106.68, z:\"ASIA\"},\n        \"vn_dad\": {n:\"Da Nang, VN\", lat:16.05, lon:108.20, z:\"ASIA\"},\n        \"vn_sgn\": {n:\"Ho Chi Minh, VN\", lat:10.76, lon:106.66, z:\"ASIA\"},\n        \"kh_kos\": {n:\"Sihanoukville, KH\", lat:10.64, lon:103.50, z:\"ASIA\"},\n        \"ph_mnl\": {n:\"Manila, PH\", lat:14.59, lon:120.97, z:\"ASIA\"},\n        \"ph_btg\": {n:\"Batangas, PH\", lat:13.75, lon:121.05, z:\"ASIA\"},\n        \"ph_sfs\": {n:\"Subic Bay, PH\", lat:14.80, lon:120.27, z:\"ASIA\"},\n        \"ph_ceb\": {n:\"Cebu, PH\", lat:10.31, lon:123.90, z:\"ASIA\"},\n        \"ph_dvo\": {n:\"Davao, PH\", lat:7.09, lon:125.64, z:\"ASIA\"},\n        \"ph_ilo\": {n:\"Iloilo, PH\", lat:10.69, lon:122.57, z:\"ASIA\"},\n        \"ph_cgy\": {n:\"Cagayan de Oro, PH\", lat:8.49, lon:124.65, z:\"ASIA\"},\n        \"cn_hkg\": {n:\"Hong Kong, HK\", lat:22.31, lon:114.16, z:\"ASIA\"},\n        \"cn_ytn\": {n:\"Yantian, CN\", lat:22.57, lon:114.27, z:\"ASIA\"},\n        \"cn_she\": {n:\"Shekou, CN\", lat:22.48, lon:113.91, z:\"ASIA\"},\n        \"cn_gua\": {n:\"Guangzhou, CN\", lat:23.13, lon:113.26, z:\"ASIA\"},\n        \"cn_xmn\": {n:\"Xiamen, CN\", lat:24.47, lon:118.06, z:\"ASIA\"},\n        \"cn_foc\": {n:\"Fuzhou, CN\", lat:26.07, lon:119.30, z:\"ASIA\"},\n        \"cn_nbg\": {n:\"Ningbo, CN\", lat:29.86, lon:121.52, z:\"ASIA\"},\n        \"cn_sha\": {n:\"Shanghai, CN\", lat:31.23, lon:121.47, z:\"ASIA\"},\n        \"cn_lyg\": {n:\"Lianyungang, CN\", lat:34.73, lon:119.45, z:\"ASIA\"},\n        \"cn_tao\": {n:\"Qingdao, CN\", lat:36.06, lon:120.38, z:\"ASIA\"},\n        \"cn_ynt\": {n:\"Yantai, CN\", lat:37.55, lon:121.38, z:\"ASIA\"},\n        \"cn_tsn\": {n:\"Tianjin, CN\", lat:38.99, lon:117.71, z:\"ASIA\"},\n        \"cn_dlc\": {n:\"Dalian, CN\", lat:38.93, lon:121.65, z:\"ASIA\"},\n        \"cn_hak\": {n:\"Haikou, CN\", lat:20.02, lon:110.28, z:\"ASIA\"},\n        \"cn_swa\": {n:\"Shantou, CN\", lat:23.35, lon:116.73, z:\"ASIA\"},\n        \"cn_qhd\": {n:\"Qinhuangdao, CN\", lat:39.92, lon:119.61, z:\"ASIA\"}, \n        \"cn_riz\": {n:\"Rizhao, CN\", lat:35.40, lon:119.55, z:\"ASIA\"},\n        \"cn_ntg\": {n:\"Nantong, CN\", lat:32.01, lon:120.84, z:\"ASIA\"},\n        \"cn_yik\": {n:\"Yingkou, CN\", lat:40.28, lon:122.11, z:\"ASIA\"},\n        \"cn_zhu\": {n:\"Zhuhai, CN\", lat:22.20, lon:113.56, z:\"ASIA\"},\n        \"cn_zha\": {n:\"Zhanjiang, CN\", lat:21.19, lon:110.41, z:\"ASIA\"},\n        \"cn_fan\": {n:\"Fangcheng, CN\", lat:21.62, lon:108.35, z:\"ASIA\"},\n        \"tw_kao\": {n:\"Kaohsiung, TW\", lat:22.62, lon:120.30, z:\"ASIA\"},\n        \"tw_kel\": {n:\"Keelung, TW\", lat:25.12, lon:121.73, z:\"ASIA\"},\n        \"tw_tch\": {n:\"Taichung, TW\", lat:24.25, lon:120.52, z:\"ASIA\"},\n        \"kr_bus\": {n:\"Busan, KR\", lat:35.10, lon:129.04, z:\"ASIA\"},\n        \"kr_inc\": {n:\"Incheon, KR\", lat:37.45, lon:126.62, z:\"ASIA\"},\n        \"kr_uls\": {n:\"Ulsan, KR\", lat:35.50, lon:129.38, z:\"ASIA\"},\n        \"kr_gwa\": {n:\"Gwangyang, KR\", lat:34.90, lon:127.70, z:\"ASIA\"},\n        \"jp_tok\": {n:\"Tokyo, JP\", lat:35.67, lon:139.75, z:\"ASIA\"},\n        \"jp_yok\": {n:\"Yokohama, JP\", lat:35.44, lon:139.63, z:\"ASIA\"},\n        \"jp_chb\": {n:\"Chiba, JP\", lat:35.58, lon:140.10, z:\"ASIA\"},\n        \"jp_kws\": {n:\"Kawasaki, JP\", lat:35.51, lon:139.73, z:\"ASIA\"},\n        \"jp_ngo\": {n:\"Nagoya, JP\", lat:35.18, lon:136.90, z:\"ASIA\"},\n        \"jp_osa\": {n:\"Osaka, JP\", lat:34.69, lon:135.50, z:\"ASIA\"},\n        \"jp_kob\": {n:\"Kobe, JP\", lat:34.69, lon:135.20, z:\"ASIA\"},\n        \"jp_moj\": {n:\"Moji, JP\", lat:33.94, lon:130.96, z:\"ASIA\"},\n        \"jp_hij\": {n:\"Hiroshima, JP\", lat:34.35, lon:132.46, z:\"ASIA\"},\n        \"jp_miz\": {n:\"Mizushima, JP\", lat:34.50, lon:133.72, z:\"ASIA\"},\n        \"jp_oit\": {n:\"Oita, JP\", lat:33.26, lon:131.67, z:\"ASIA\"},\n        \"jp_hkt\": {n:\"Hakata, JP\", lat:33.61, lon:130.39, z:\"ASIA\"},\n        \"jp_sdj\": {n:\"Sendai, JP\", lat:38.27, lon:141.03, z:\"ASIA\"},\n        \"ru_vvo\": {n:\"Vladivostok, RU\", lat:43.11, lon:131.88, z:\"ASIA\"},\n        \"ru_vyp\": {n:\"Vostochny, RU\", lat:42.73, lon:133.08, z:\"ASIA\"},\n        \n        \/\/ --- OCEANIA ---\n        \"au_syd\": {n:\"Sydney, AU\", lat:-33.86, lon:151.21, z:\"ASIA\"},\n        \"au_mel\": {n:\"Melbourne, AU\", lat:-37.81, lon:144.96, z:\"ASIA\"},\n        \"au_bne\": {n:\"Brisbane, AU\", lat:-27.47, lon:153.03, z:\"ASIA\"},\n        \"au_adl\": {n:\"Adelaide, AU\", lat:-34.92, lon:138.60, z:\"ASIA\"},\n        \"au_fre\": {n:\"Fremantle, AU\", lat:-32.05, lon:115.74, z:\"ASIA\"},\n        \"au_phe\": {n:\"Port Hedland, AU\", lat:-20.31, lon:118.57, z:\"ASIA\"},\n        \"au_dam\": {n:\"Dampier, AU\", lat:-20.66, lon:116.71, z:\"ASIA\"},\n        \"au_drw\": {n:\"Darwin, AU\", lat:-12.46, lon:130.84, z:\"ASIA\"},\n        \"au_tsv\": {n:\"Townsville, AU\", lat:-19.25, lon:146.83, z:\"ASIA\"},\n        \"au_cns\": {n:\"Cairns, AU\", lat:-16.93, lon:145.78, z:\"ASIA\"},\n        \"au_hba\": {n:\"Hobart, AU\", lat:-42.88, lon:147.32, z:\"ASIA\"},\n        \"au_gla\": {n:\"Gladstone, AU\", lat:-23.84, lon:151.25, z:\"ASIA\"},\n        \"au_new\": {n:\"Newcastle, AU\", lat:-32.92, lon:151.78, z:\"ASIA\"},\n        \"au_gee\": {n:\"Geelong, AU\", lat:-38.14, lon:144.36, z:\"ASIA\"},\n        \"nz_akl\": {n:\"Auckland, NZ\", lat:-36.84, lon:174.76, z:\"ASIA\"},\n        \"nz_wlg\": {n:\"Wellington, NZ\", lat:-41.28, lon:174.77, z:\"ASIA\"},\n        \"nz_lyt\": {n:\"Lyttelton, NZ\", lat:-43.60, lon:172.71, z:\"ASIA\"},\n        \"nz_npe\": {n:\"Napier, NZ\", lat:-39.48, lon:176.91, z:\"ASIA\"},\n        \"nz_blu\": {n:\"Bluff, NZ\", lat:-46.60, lon:168.33, z:\"ASIA\"},\n        \"nz_trg\": {n:\"Tauranga, NZ\", lat:-37.64, lon:176.18, z:\"ASIA\"},\n        \"pg_pom\": {n:\"Port Moresby, PG\", lat:-9.47, lon:147.15, z:\"ASIA\"},\n        \"pg_rab\": {n:\"Rabaul, PG\", lat:-4.20, lon:152.17, z:\"ASIA\"},\n        \"fj_suv\": {n:\"Suva, FJ\", lat:-18.14, lon:178.42, z:\"ASIA\"},\n        \"nc_nou\": {n:\"Noumea, NC\", lat:-22.27, lon:166.44, z:\"ASIA\"},\n        \"pf_ppt\": {n:\"Papeete, PF\", lat:-17.54, lon:-149.56, z:\"ASIA\"},\n        \"gu_gum\": {n:\"Guam, US\", lat:13.44, lon:144.65, z:\"ASIA\"},\n        \"ws_apw\": {n:\"Apia, Samoa\", lat:-13.83, lon:-171.76, z:\"ASIA\"},\n\n        \/\/ --- ARCTIC ---\n        \"ru_mmk\": {n:\"Murmansk, RU\", lat:68.95, lon:33.08, z:\"ARCTIC\"},\n        \"ru_sab\": {n:\"Sabetta, RU\", lat:71.27, lon:72.07, z:\"ARCTIC\"},\n        \"ru_dik\": {n:\"Dikson, RU\", lat:73.50, lon:80.54, z:\"ARCTIC\"},\n        \"ru_tks\": {n:\"Tiksi, RU\", lat:71.68, lon:128.86, z:\"ARCTIC\"},\n        \"ru_pvk\": {n:\"Pevek, RU\", lat:69.70, lon:170.31, z:\"ARCTIC\"},\n        \"ru_pro\": {n:\"Provideniya, RU\", lat:64.43, lon:-173.23, z:\"ARCTIC\"},\n        \"gl_nuk\": {n:\"Nuuk, GL\", lat:64.18, lon:-51.72, z:\"ARCTIC\"},\n\n        \/\/ --- US RIVERS ---\n        \"us_mem\": {n:\"Memphis, US\", lat:35.14, lon:-90.04, z:\"US_RIVER\"},\n        \"us_stl\": {n:\"St. Louis, US\", lat:38.62, lon:-90.19, z:\"US_RIVER\"},\n        \"us_msp\": {n:\"Minneapolis, US\", lat:44.97, lon:-93.26, z:\"US_RIVER\"},\n        \"us_cin\": {n:\"Cincinnati, US\", lat:39.10, lon:-84.51, z:\"US_RIVER\"},\n        \"us_lou\": {n:\"Louisville, US\", lat:38.25, lon:-85.75, z:\"US_RIVER\"},\n\n        \/\/ --- PACIFIC ISLANDS ---\n        \"cx_cxi\": {n:\"Christmas Is., CX\", lat:1.98, lon:-157.47, z:\"ASIA\"},\n        \"nr_aiw\": {n:\"Nauru, NR\", lat:-0.52, lon:166.93, z:\"ASIA\"},\n        \"ki_trw\": {n:\"Tarawa, KI\", lat:1.33, lon:172.97, z:\"ASIA\"},\n        \"mh_maj\": {n:\"Majuro, MH\", lat:7.11, lon:171.38, z:\"ASIA\"},\n        \"sb_hir\": {n:\"Honiara, SB\", lat:-9.43, lon:159.95, z:\"ASIA\"},\n        \"vu_vli\": {n:\"Port Vila, VU\", lat:-17.73, lon:168.32, z:\"ASIA\"}\n    };\n\n    \/\/ --- 2. WAYPOINTS & STRAITS ---\n    const wp = {\n        \/\/ TURKISH STRAITS\n        \"istanbul\": {n:\"Istanbul Strait\", lat:41.02, lon:29.00, type:'strait', eca:false, desc:\"Black Sea Transit\"},\n        \"canakkale\": {n:\"Canakkale Strait\", lat:40.15, lon:26.40, type:'strait', eca:false, desc:\"Aegean Transit\"},\n        \n        \/\/ MED \/ SUEZ\n        \"gibraltar\": {n:\"Gibraltar Strait\", lat:35.95, lon:-5.60, type:'strait', eca:false, desc:\"Atlantic-Med\"},\n        \"messina\": {n:\"Messina Strait\", lat:38.25, lon:15.65, type:'strait', eca:false, desc:\"Italy-Sicily\"},\n        \"bonifacio\": {n:\"Bonifacio Strait\", lat:41.38, lon:9.28, type:'strait', eca:false},\n        \"suez_n\": {n:\"Suez Canal (North)\", lat:31.26, lon:32.33, type:'canal', eca:false, desc:\"Canal Entry\"},\n        \"suez_s\": {n:\"Suez Canal (South)\", lat:29.92, lon:32.56, type:'canal', eca:false, desc:\"Canal Exit\"},\n        \n        \/\/ RED SEA \/ GULF \/ INDIAN OCEAN\n        \"bab_mandeb\": {n:\"Bab el-Mandeb\", lat:12.59, lon:43.34, type:'strait', hra:true, desc:\"Red Sea Gate\"},\n        \"hormuz\": {n:\"Hormuz Strait\", lat:26.56, lon:56.47, type:'strait', hra:true, desc:\"Gulf Gate\"},\n        \"malacca\": {n:\"Malacca Strait\", lat:2.50, lon:101.50, type:'strait', hra:true, desc:\"SE Asia Main\"},\n        \"sunda\": {n:\"Sunda Strait\", lat:-5.90, lon:105.90, type:'strait', eca:false, desc:\"Java-Sumatra\"},\n        \"galle\": {n:\"Dondra Head\", lat:5.92, lon:80.20, type:'point', eca:false},\n        \n        \/\/ EUROPE \/ NORTH SEA\n        \"dover\": {n:\"Dover Strait\", lat:51.01, lon:1.45, type:'strait', eca:true, desc:\"English Channel\"},\n        \"kiel\": {n:\"Kiel Canal\", lat:54.37, lon:10.14, type:'canal', eca:true, desc:\"Baltic Shortcut\"},\n        \"skaw\": {n:\"Skaw\", lat:57.73, lon:10.63, type:'point', eca:true},\n        \"ushant\": {n:\"Ushant\", lat:48.46, lon:-5.13, type:'point', eca:true},\n        \"finisterre\": {n:\"Finisterre\", lat:42.88, lon:-9.27, type:'point', eca:false},\n        \n        \/\/ AMERICAS \/ PACIFIC\n        \"panama_e\": {n:\"Panama Canal (Atl)\", lat:9.30, lon:-79.90, type:'canal', eca:false},\n        \"panama_w\": {n:\"Panama Canal (Pac)\", lat:8.90, lon:-79.50, type:'canal', eca:false},\n        \"magellan\": {n:\"Magellan Strait\", lat:-52.5, lon:-69.5, type:'strait', eca:false, desc:\"S.America Tip\"},\n        \"bering\": {n:\"Bering Strait\", lat:65.80, lon:-168.80, type:'strait', eca:false, desc:\"Arctic Route\"},\n        \n        \/\/ AFRICA\n        \"cape_good_hope\": {n:\"Cape of Good Hope\", lat:-34.50, lon:18.40, type:'point', eca:false, desc:\"Africa Tip\"}\n    };\n\n    window.onload = function() {\n        init();\n    };\n\n    function init() {\n        const s1 = document.getElementById('pFrom');\n        const s2 = document.getElementById('pTo');\n        const sortedKeys = Object.keys(ports).sort((a,b) => ports[a].n.localeCompare(ports[b].n));\n        \n        sortedKeys.forEach(k => {\n            s1.add(new Option(ports[k].n, k));\n            s2.add(new Option(ports[k].n, k));\n        });\n        s1.value = \"tr_ist\"; \n        s2.value = \"nl_rtm\"; \n    }\n\n    function calculateRoute() {\n        const k1 = document.getElementById('pFrom').value;\n        const k2 = document.getElementById('pTo').value;\n        \n        if(!k1 || !k2 || k1===k2) {\n            alert(\"Please select distinct ports.\");\n            return;\n        }\n\n        const p1 = ports[k1];\n        const p2 = ports[k2];\n        \n        const speed = parseFloat(document.getElementById('speed').value) || 13.5;\n        const cons = parseFloat(document.getElementById('cons').value) || 26.0;\n        \n        const viaSuez = document.getElementById('viaSuez').checked;\n        const viaPanama = document.getElementById('viaPanama').checked;\n        const avoidPiracy = document.getElementById('avoidPiracy').checked;\n        const viaKiel = document.getElementById('viaKiel').checked;\n\n        let path = determineRoute(p1, p2, viaSuez, viaPanama, avoidPiracy, viaKiel);\n\n        let totalDist = 0;\n        let waypoints = [{n: p1.n, lat: p1.lat, lon: p1.lon, type:'start', dist:0}];\n\n        for(let i=0; i<path.length; i++) {\n            let prev = (i===0) ? p1 : path[i-1];\n            let curr = path[i];\n            let d = getDist(prev.lat, prev.lon, curr.lat, curr.lon);\n            totalDist += d;\n            waypoints.push({...curr, dist: d});\n        }\n        let last = (path.length>0) ? path[path.length-1] : p1;\n        let finalD = getDist(last.lat, last.lon, p2.lat, p2.lon);\n        totalDist += finalD;\n        waypoints.push({...p2, type:'end', dist: finalD});\n\n        \/\/ UI\n        const days = totalDist \/ (speed * 24);\n        const fuel = days * cons;\n        const cost = fuel * 650;\n        \n        document.getElementById('resDist').innerText = Math.round(totalDist).toLocaleString();\n        document.getElementById('resTime').innerText = days.toFixed(1);\n        document.getElementById('resFuel').innerText = Math.round(fuel).toLocaleString();\n        document.getElementById('resCost').innerText = \"$\" + Math.round(cost).toLocaleString();\n        \n        let method = \"DIRECT \/ COASTAL\";\n        if(path.some(w => w.n.includes(\"Suez\"))) method = \"VIA SUEZ CANAL\";\n        else if(path.some(w => w.n.includes(\"Hope\"))) method = \"VIA CAPE (SAFE)\";\n        else if(path.some(w => w.n.includes(\"Panama\"))) method = \"VIA PANAMA CANAL\";\n        document.getElementById('routeMethod').innerText = method;\n\n        let passHRA = path.some(w => w.hra) || p1.z === 'ME_GULF' || p2.z === 'ME_GULF';\n        let passECA = p1.z.includes('ECA') || p2.z.includes('ECA') || path.some(w => w.eca);\n        \n        updateHazard('cardECA', 'txtECA', passECA, \"ECA \/ SECA ACTIVE\", \"NON-ECA ZONE\", \"safe\", \"alert\");\n        updateHazard('cardHRA', 'txtHRA', passHRA, \"HRA \/ PIRACY RISK\", \"LOW RISK AREA\", \"safe\", \"alert\");\n\n        const now = new Date();\n        const eta = new Date(now.getTime() + days*24*3600*1000);\n        document.getElementById('etaDisplay').innerText = formatDate(eta);\n\n        renderWaypoints(waypoints);\n    }\n\n    \/\/ --- V30 STRICT ROUTING LOGIC ---\n    function determineRoute(p1, p2, useSuez, usePanama, avoidPiracy, useKiel) {\n        let route = [];\n        let r1 = p1.z; \n        let r2 = p2.z; \n\n        \/\/  - Gatekeeper Logic\n\n        \/\/ --- STEP 1: EXIT ENCLOSED SEAS ---\n        if(r1 === 'MED_BS') { route.push(wp.istanbul, wp.canakkale); }\n        if(r1 === 'MAR_SEA') { route.push(wp.canakkale); }\n        if(r1 === 'ME_GULF') { route.push(wp.hormuz); }\n        if(r1 === 'EU_BALT') { \n            if(useKiel) route.push(wp.kiel); \n            else route.push(wp.skaw); \n        }\n\n        \/\/ --- STEP 2: MAJOR TRANSIT GATES (The Core Logic Fix) ---\n        \n        \/\/ Define Hemisphere Groups\n        let AtlanticGroup = ['ECA','US_E','US_W','MED','MED_BS','MAR_SEA','AFR_W','SA_E','US_RIVER','SA_W','EU_BALT'];\n        \/\/ Note: US_W and SA_W are geographically Pacific, but often accessed via Atlantic\/Panama from Europe\/Med.\n        \/\/ Let's refine based on \"East of Suez\" vs \"West of Suez\".\n        \n        let WestSuez = ['ECA','US_E','US_W','MED','MED_BS','MAR_SEA','AFR_W','SA_E','SA_W','EU_BALT'];\n        let EastSuez = ['ASIA','ME_GULF','AFR_E'];\n\n        let isStartWest = WestSuez.includes(r1);\n        let isEndWest = WestSuez.includes(r2);\n        \n        \/\/ === OPTION 1: VIA PANAMA (User Forced) ===\n        if(usePanama) {\n            \/\/ Need to get to Panama.\n            \/\/ If starting in Med\/Black Sea, MUST exit Gibraltar first.\n            if(r1 === 'MED' || r1 === 'MED_BS' || r1 === 'MAR_SEA') {\n                 if(!route.includes(wp.gibraltar)) route.push(wp.gibraltar);\n            }\n            \/\/ If ending in Med\/Black Sea, MUST enter Gibraltar last.\n            if(r2 === 'MED' || r2 === 'MED_BS' || r2 === 'MAR_SEA') {\n                 if(!route.includes(wp.gibraltar)) route.push(wp.gibraltar);\n            }\n            \n            \/\/ Add Panama\n            \/\/ Direction check? Generally E->W or W->E doesn't matter for waypoint list presence,\n            \/\/ but for sorting it helps to know.\n            \/\/ Simplified: Add both, sort later.\n            route.push(wp.panama_e, wp.panama_w);\n        }\n\n        \/\/ === OPTION 2: SUEZ vs CAPE (West <-> East) ===\n        else if ( (isStartWest && !isEndWest) || (!isStartWest && isEndWest) ) {\n            \/\/ We are crossing the \"Old World\" boundary.\n            \n            \/\/ Should we use Gibraltar?\n            \/\/ If start\/end is MED or MED_BS, we are already inside the Med, so NO Gibraltar needed for Suez.\n            \/\/ BUT if start\/end is Atlantic (ECA, US, SA, AFR_W) and we go via Suez, we MUST pass Gibraltar.\n            let involvesMedPort = (r1 === 'MED' || r1 === 'MED_BS' || r1 === 'MAR_SEA' || r2 === 'MED' || r2 === 'MED_BS' || r2 === 'MAR_SEA');\n            \n            if (avoidPiracy || !useSuez) { \/\/ STRICT: If not using Suez (unchecked), go CAPE.\n                \/\/ CAPE ROUTE\n                if(involvesMedPort) {\n                    \/\/ Med to Asia via Cape -> Must exit Gib first\n                    route.push(wp.gibraltar);\n                }\n                if(r1==='ECA' || r1==='EU_BALT' || r2==='ECA' || r2==='EU_BALT') route.push(wp.ushant);\n                route.push(wp.cape_good_hope);\n            } else {\n                \/\/ SUEZ ROUTE (Default or Forced)\n                if(!involvesMedPort) {\n                    \/\/ Atlantic to Asia via Suez -> Must enter Gib first\n                    route.push(wp.gibraltar);\n                }\n                \n                \/\/ Add Suez & Red Sea\n                route.push(wp.suez_n, wp.suez_s, wp.bab_mandeb);\n            }\n            \n            \/\/ Asian Straits\n            if (r1 === 'ASIA' || r2 === 'ASIA') {\n                if(!route.includes(wp.hormuz)) route.push(wp.galle);\n                route.push(wp.malacca);\n            }\n        }\n\n        \/\/ === OPTION 3: MED\/BLACK SEA <-> ATLANTIC (No Panama\/Suez involved) ===\n        \/\/ e.g. Istanbul -> Brazil\n        else if ( (r1==='MED_BS'||r1==='MED'||r1==='MAR_SEA') && (r2==='SA_E'||r2==='US_E'||r2==='ECA'||r2==='AFR_W') ) {\n             route.push(wp.gibraltar);\n        }\n        else if ( (r2==='MED_BS'||r2==='MED'||r2==='MAR_SEA') && (r1==='SA_E'||r1==='US_E'||r1==='ECA'||r1==='AFR_W') ) {\n             route.push(wp.gibraltar);\n        }\n\n        \/\/ --- STEP 3: ENTRY ENCLOSED SEAS ---\n        if(r2 === 'MED_BS') { \n            if(!route.includes(wp.canakkale)) route.push(wp.canakkale);\n            if(!route.includes(wp.istanbul)) route.push(wp.istanbul);\n        }\n        if(r2 === 'MAR_SEA') { \n            if(!route.includes(wp.canakkale)) route.push(wp.canakkale);\n        }\n        if(r2 === 'ME_GULF' && !route.includes(wp.hormuz)) { route.push(wp.hormuz); }\n        if(r2 === 'EU_BALT') { \n            if(useKiel && !route.includes(wp.kiel)) route.push(wp.kiel);\n            else if (!useKiel && !route.includes(wp.skaw)) route.push(wp.skaw);\n        }\n\n        \/\/ --- STEP 4: DOVER CHECK ---\n        let northSea = (r1==='ECA' || r1==='EU_BALT' || r2==='ECA' || r2==='EU_BALT');\n        let southAtl = (r1==='US_E' || r2==='US_E' || r1==='SA_E' || r2==='SA_E' || route.includes(wp.gibraltar));\n        \n        if(northSea && southAtl && !route.includes(wp.kiel)) {\n             route.push(wp.dover);\n             if(!route.includes(wp.ushant)) route.push(wp.ushant);\n        }\n\n        \/\/ --- STEP 5: SORTING ---\n        \/\/ Sort by distance from start to organize the route sequence\n        route.sort((a,b) => {\n            let distA = getDist(p1.lat, p1.lon, a.lat, a.lon);\n            let distB = getDist(p1.lat, p1.lon, b.lat, b.lon);\n            return distA - distB;\n        });\n\n        return route;\n    }\n\n    function getDist(lat1, lon1, lat2, lon2) {\n        if(!lat1 || !lon1 || !lat2 || !lon2) return 0;\n        const R = 3440; \n        const dLat = (lat2 - lat1) * Math.PI \/ 180;\n        const dLon = (lon2 - lon1) * Math.PI \/ 180;\n        const a = Math.sin(dLat \/ 2) * Math.sin(dLat \/ 2) +\n                  Math.cos(lat1 * Math.PI \/ 180) * Math.cos(lat2 * Math.PI \/ 180) *\n                  Math.sin(dLon \/ 2) * Math.sin(dLon \/ 2);\n        return R * 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));\n    }\n\n    function formatDate(date) {\n        return `${String(date.getDate()).padStart(2,'0')}.${String(date.getMonth()+1).padStart(2,'0')}.${date.getFullYear()} ${String(date.getHours()).padStart(2,'0')}:${String(date.getMinutes()).padStart(2,'0')}`;\n    }\n\n    function updateHazard(id, txtId, condition, tT, tF, cF, cT) {\n        document.getElementById(id).className = \"hazard-card \" + (condition ? cT : cF);\n        document.getElementById(txtId).innerText = condition ? tT : tF;\n    }\n\n    function renderWaypoints(list) {\n        const div = document.getElementById('wpList');\n        div.innerHTML = \"\";\n        let acc = 0;\n        list.forEach((w,i) => {\n            acc += w.dist || 0;\n            let tags = \"\";\n            let desc = w.desc ? `<span style=\"font-size:10px; color:#94a3b8; display:block;\">${w.desc}<\/span>` : \"\";\n            \n            if(w.type === 'strait') tags += `<span class=\"tag tag-strait\">STRAIT<\/span>`;\n            if(w.type === 'canal') tags += `<span class=\"tag tag-canal\">CANAL<\/span>`;\n            if(w.hra) tags += `<span class=\"tag tag-hra\">HRA<\/span>`;\n            if(w.eca) tags += `<span class=\"tag tag-eca\">ECA<\/span>`;\n            \n            let dotCls = w.type === 'start' ? 'start' : (w.type === 'end' ? 'end' : (w.type==='strait'?'strait':(w.type==='canal'?'canal':'waypoint')));\n            \n            div.innerHTML += `\n            <div class=\"timeline-item\">\n                <div class=\"t-line\"><\/div>\n                <div class=\"t-dot ${dotCls}\"><\/div>\n                <div class=\"wp-info\">\n                    <h4>${w.n} ${tags}<\/h4>\n                    <p>${desc}Leg: ${Math.round(w.dist)} nm | Total: <span style=\"color:#38bdf8\">${Math.round(acc)} nm<\/span><\/p>\n                <\/div>\n            <\/div>`;\n        });\n    }\n<\/script>\n","protected":false},"excerpt":{"rendered":"<p>PORT TO PORT v31 (ULTIMATE FULL 600+) PORT TO PORT DATABASE: 600+ PORTS (FULL) DEPARTURE PORT Select Port&#8230; DESTINATION PORT Select Port&#8230; SPEED (KTS) CONS. (MT) ROUTING OPTIONS Use Suez Canal Use Panama Canal Use Kiel Canal (Baltic) Avoid Piracy (Cape Route) CALCULATE VOYAGE ESTIMATED TIME OF ARRIVAL (ETA) &#8211;.&#8211;.&#8212;- &#8211;:&#8211; ROUTING METHOD WAITING INPUT &#8230; <a title=\"Port to Port\" class=\"read-more\" href=\"https:\/\/dev.allinoneatsea.com\/index.php\/port-to-port\/\" aria-label=\"Read more about Port to Port\">Read more<\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"_acf_changed":false,"footnotes":""},"class_list":["post-19","page","type-page","status-publish"],"acf":[],"_links":{"self":[{"href":"https:\/\/dev.allinoneatsea.com\/index.php\/wp-json\/wp\/v2\/pages\/19","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/dev.allinoneatsea.com\/index.php\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/dev.allinoneatsea.com\/index.php\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/dev.allinoneatsea.com\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/dev.allinoneatsea.com\/index.php\/wp-json\/wp\/v2\/comments?post=19"}],"version-history":[{"count":5,"href":"https:\/\/dev.allinoneatsea.com\/index.php\/wp-json\/wp\/v2\/pages\/19\/revisions"}],"predecessor-version":[{"id":96,"href":"https:\/\/dev.allinoneatsea.com\/index.php\/wp-json\/wp\/v2\/pages\/19\/revisions\/96"}],"wp:attachment":[{"href":"https:\/\/dev.allinoneatsea.com\/index.php\/wp-json\/wp\/v2\/media?parent=19"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}