Repository navigation
Expand file tree
/
Copy pathAirGradient-Test-API-App.html
More file actions
234 lines (229 loc) · 171 KB
/
Copy pathAirGradient-Test-API-App.html
File metadata and controls
234 lines (229 loc) · 171 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
<!doctype html>
<!-- SPDX-License-Identifier: MIT-0; third-party materials retain their own terms. -->
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta name="author" content="Akila DJ">
<meta name="description" content="AirGradient Test API App. Made by Akila DJ, using OpenAI, for demonstrational purposes.">
<meta name="creator" content="Akila DJ, assisted by OpenAI ChatGPT / Codex">
<meta name="purpose" content="Independent demonstration by Akila DJ using OpenAI ChatGPT / Codex. Shows actual AirGradient Open Air Max and standard Open Air locations, in Switzerland, Uganda, Thailand, Sri Lanka and Maldives. Hardware identity is based on API model metadata matched to AirGradient model codes. PM2.5 AQI estimates are illustrative, not official daily AQI or EPA NowCast.">
<meta name="version" content="2.3.0-rc.2 — five live devices, historical device selection from original package, Ctrl-scroll map zoom, AQ data before API details">
<meta name="application-name" content="AirGradient Test API App">
<meta name="usage" content="Run serve.py and open the http://localhost or http://127.0.0.1 address printed by Python. Do not open the HTML file directly.">
<meta name="license" content="MIT No Attribution (MIT-0)">
<meta name="optional-credit" content="Akila DJ using OpenAI. Attribution is welcome but not required for original project code.">
<meta name="generator" content="OpenAI ChatGPT / Codex">
<meta name="referrer" content="strict-origin-when-cross-origin">
<title>AirGradient Test API App | Air Quality Data Explorer</title>
<link rel="icon" href="data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 32 32'%3E%3Crect width='32' height='32' rx='8' fill='%230d2438'/%3E%3Cpath d='M7 23V9l9 9 9-9v14' fill='none' stroke='%2349e3bc' stroke-width='3'/%3E%3C/svg%3E">
<link rel="stylesheet" href="https://unpkg.com/[email protected]/dist/leaflet.css" integrity="sha256-p4NxAoJBhIIN+hmNHrzRCf9tD/miZyoHS5obTRR9BMY=" crossorigin="">
<style>
:root{--ink:#102c40;--muted:#556c7d;--line:#d9e4eb;--paper:#f1f6f9;--teal:#087f75;--blue:#2559da;--navy:#102c40;--good:#00e400;--moderate:#ffff00;--usg:#ff7e00;--unhealthy:#ff0000;--very:#8f3f97;--hazard:#7e0023}
*{box-sizing:border-box}body{margin:0;background:var(--paper);color:var(--ink);font:16px/1.5 system-ui,-apple-system,BlinkMacSystemFont,"Segoe UI",sans-serif}button,input,select{font:inherit}button,select,input{border:1px solid var(--line);border-radius:9px;padding:10px 13px;background:#fff;color:var(--ink)}button,summary,select{cursor:pointer}button:hover{border-color:var(--teal);background:#f1fbf8}button:disabled{opacity:.5;cursor:wait}button:focus-visible,a:focus-visible,select:focus-visible,input:focus-visible,summary:focus-visible{outline:3px solid #4284f5;outline-offset:3px}a{color:#2458bd;text-underline-offset:3px}h1,h2,h3,p{margin:0}h1{font-size:clamp(24px,3vw,34px);line-height:1.2;letter-spacing:-1px}h2{font-size:20px;letter-spacing:-.3px}h3{font-size:16px}small,.small{font-size:13px}.muted{color:var(--muted)}.eyebrow{font-size:12px;letter-spacing:1.7px;text-transform:uppercase;font-weight:750;color:#74e2d2}.mono{font-variant-numeric:tabular-nums}header{background:var(--navy);color:#fff;padding:24px max(24px,calc((100vw - 1380px)/2));display:flex;justify-content:space-between;align-items:center;gap:24px}header p{color:#bfd0de;margin-top:8px;font-size:14px}header .actions{display:flex;gap:10px;flex-wrap:wrap}.primary{background:var(--teal);border-color:var(--teal);color:white}.primary:hover{background:#07675f;color:white}.quiet{color:#c4ddd9;font-size:13px}main{max-width:1428px;margin:auto;padding:24px}.toolbar{display:flex;align-items:end;gap:16px;flex-wrap:wrap;margin-bottom:18px}.field{display:grid;gap:5px}.field label{font-size:13px;font-weight:650;color:var(--muted)}.field select{min-width:170px}.toolbar .push{margin-left:auto}.pill{display:inline-block;padding:4px 9px;border-radius:99px;font-size:12px;font-weight:650;background:#e5eff3;color:#3d5767}.status{font-size:14px;color:var(--muted);max-width:480px}.workspace{display:grid;grid-template-columns:310px minmax(0,1fr);gap:18px;align-items:start}.stations{display:grid;gap:12px;max-height:552px;overflow:auto;padding:2px}.station{display:block;width:100%;text-align:left;padding:18px;background:white;border:1px solid var(--line);border-radius:14px;transition:border-color .15s,box-shadow .15s}.station.selected{border:2px solid var(--teal);padding:17px;box-shadow:0 5px 18px #083f4910}.station h3{margin:5px 0 2px;overflow-wrap:anywhere}.station .readings{display:flex;align-items:center;justify-content:space-between;margin:12px 0 8px;gap:8px}.big{font-size:32px;font-weight:720;line-height:1.1;letter-spacing:-1px}.aqi-chip{border:1px solid #0002;background:var(--tone,#edf1f4);color:var(--fg,#102c40);border-radius:10px;padding:8px 11px;text-align:center;min-width:73px}.aqi-chip strong{display:block;font-size:23px;line-height:1.15}.aqi-chip small{font-size:11px}.card-meta{font-size:12px;color:var(--muted);margin-top:4px}.error{color:#a52c26}.map-wrap{border:1px solid var(--line);border-radius:16px;background:#e8f0f4;overflow:hidden}#map{height:460px;z-index:1;background:#dbe9f1}.map-bottom{padding:12px 16px;background:#fff;display:flex;justify-content:space-between;gap:12px;align-items:center;flex-wrap:wrap;font-size:13px}.legend{display:flex;gap:11px;flex-wrap:wrap}.legend span{display:flex;align-items:center;gap:5px;font-size:12px}.legend i{width:9px;height:9px;border-radius:50%;border:1px solid #0003}.map-control{background:#fff;padding:8px 12px;border-radius:8px;box-shadow:0 2px 10px #1233}.pin{border:2px solid white;border-radius:12px;background:var(--tone);color:var(--fg);box-shadow:0 3px 12px #102c4055;min-width:112px;padding:7px 10px;text-align:center;font:700 17px/1.15 system-ui;white-space:nowrap}.pin .pin-name{max-width:175px;overflow:hidden;text-overflow:ellipsis;font-size:11px;margin-bottom:4px}.pin small{display:block;font-size:11px;font-weight:550;margin-top:3px}.pin.old{opacity:.65;border-style:dashed}.leaflet-popup-content{font-family:system-ui;font-size:14px;overflow-wrap:anywhere}.leaflet-container a{color:#2458bd}.map-error{padding:24px;color:var(--ink)}.notice{padding:12px 16px;margin:18px 0;border:1px solid #bbdacf;border-radius:10px;background:#e8f7f1;font-size:14px}.notice.warn{background:#fff5df;border-color:#e9cd8b}.compare{display:flex;justify-content:space-between;gap:16px;flex-wrap:wrap;margin:18px 0 24px}.compare p{font-size:13px;color:var(--muted);margin-top:5px}.compare-links{display:flex;gap:14px;align-items:start;flex-wrap:wrap}.panel{background:#fff;border:1px solid var(--line);border-radius:16px;padding:22px;margin-top:18px}.detail-head{display:flex;justify-content:space-between;gap:18px;align-items:start}.detail-head p{margin-top:4px;font-size:14px;color:var(--muted)}.tiles{display:grid;grid-template-columns:repeat(6,minmax(0,1fr));gap:12px;margin:20px 0}.tile{padding:14px;border:1px solid var(--line);border-radius:10px;background:#f8fbfd}.tile .value{font-size:25px;font-weight:700;margin-top:5px}.tile .unit{font-size:12px;font-weight:400;color:var(--muted)}.tile label{display:block;font-size:13px;color:var(--muted)}.table-wrap{overflow:auto;max-height:400px;margin-top:14px}table{width:100%;border-collapse:collapse;text-align:left;font-size:14px}th,td{padding:10px 12px;border-bottom:1px solid #e9eff3;overflow-wrap:anywhere}th{font-size:12px;text-transform:uppercase;letter-spacing:.6px;color:var(--muted);background:#f4f8fa;position:sticky;top:0}td.code{font-family:ui-monospace,monospace;font-size:13px}details{border-top:1px solid var(--line);padding-top:14px;margin-top:16px}summary{font-size:15px;font-weight:650}pre{background:#102c40;color:#dcf7f1;white-space:pre-wrap;overflow-wrap:anywhere;padding:16px;border-radius:10px;font-size:12px;max-height:380px;overflow:auto}.resources{display:grid;grid-template-columns:1fr 1fr;gap:28px}.resources p,.resources li{font-size:14px;color:var(--muted)}.resources p{margin-top:8px}.resources ul{margin:10px 0;padding-left:20px}.resources li{margin-bottom:8px}footer{padding:24px 0 6px;font-size:13px;color:var(--muted);display:flex;justify-content:space-between;gap:16px;flex-wrap:wrap}dialog{border:0;padding:0;border-radius:18px;max-width:680px;width:calc(100% - 32px);max-height:90vh;color:var(--ink);box-shadow:0 24px 100px #081d4550}dialog::backdrop{background:#0a1f3b85;backdrop-filter:blur(3px)}.dialog-content{padding:26px}.dialog-content h3{margin:24px 0 8px}.dialog-content p{font-size:14px;color:var(--muted);margin:8px 0 14px}.row{display:flex;gap:10px;flex-wrap:wrap;align-items:center}.row input{flex:1;min-width:130px}.row .field{flex:1}.stack{display:grid;gap:12px}.mini-list{max-height:230px;overflow:auto;margin-top:12px}.mini-row{display:flex;gap:10px;padding:10px 0;border-bottom:1px solid var(--line);justify-content:space-between;align-items:center}.mini-row span{font-size:14px;overflow-wrap:anywhere}.mini-row button{padding:5px 10px;font-size:13px}#hourly-chart{height:90px;width:100%;display:block;margin:16px 0}#startup{display:none}noscript{display:block;background:#fff0ce;padding:20px}.storage-note{font-size:13px;color:#a52c26}#auth-status{font-size:13px}.empty{padding:28px;color:var(--muted)}@media(max-width:1050px){.workspace{grid-template-columns:260px minmax(0,1fr)}.tiles{grid-template-columns:repeat(3,1fr)}}@media(max-width:720px){header{padding:20px;align-items:start;flex-direction:column;gap:16px}main{padding:16px}.toolbar .push{margin-left:0}.workspace{display:flex;flex-direction:column-reverse}.stations{display:flex;width:100%;max-height:none;padding-bottom:8px;overflow:auto}.station{min-width:250px;width:250px;flex-shrink:0}.map-wrap{width:100%}#map{height:365px}.resources{grid-template-columns:1fr}.tiles{grid-template-columns:repeat(2,1fr)}.panel{padding:18px}.detail-head{flex-wrap:wrap}.field{flex:1}.field select{min-width:0;width:100%}.big{font-size:29px}}
/* Five cards remain visible on desktop; the full-width map comes first. */
.workspace{display:flex;flex-direction:column;gap:16px}.map-wrap{width:100%}.stations{display:grid;grid-template-columns:repeat(5,minmax(0,1fr));width:100%;max-height:none;overflow:visible;align-items:stretch}.station{height:100%;padding:15px;min-width:0;display:flex;flex-direction:column;justify-content:flex-start}.station .pill{align-self:flex-start}.station.selected{padding:14px}.station.pending{background:#fff9eb;border-style:dashed}.station .big{font-size:28px}.param-list{font-size:11px;color:var(--muted);margin-top:9px;line-height:1.55}.gas-note{font-size:12px;margin-top:7px;color:#605323}.location-table td{vertical-align:top}.slot-note{margin:12px 0;font-size:13px}.country{font-size:12px;font-weight:650;color:var(--teal)}#location-table{max-height:none!important}
@media(max-width:1250px){.stations{grid-template-columns:repeat(3,minmax(0,1fr))}.station{width:auto}}@media(max-width:900px){.stations{grid-template-columns:repeat(2,minmax(0,1fr))}}@media(max-width:600px){.stations{grid-template-columns:1fr}.station{width:100%;min-width:0}#map{height:340px}}
.tiles{grid-template-columns:repeat(4,minmax(0,1fr))}@media(max-width:720px){.tiles{grid-template-columns:repeat(2,minmax(0,1fr))}}
.parameter-values{width:100%;margin-top:12px;font-size:11px;line-height:1.45;font-weight:400}.parameter-row{display:grid;grid-template-columns:minmax(0,1fr) minmax(0,1.15fr);gap:8px;padding:4px 0;border-bottom:1px solid #e5ecef;align-items:start}.parameter-row>span{overflow-wrap:anywhere}.parameter-row>span:last-child{text-align:right;font-variant-numeric:tabular-nums}.parameter-row.warning{color:#87511c}.parameter-legend{font-size:10px;line-height:1.5;color:var(--muted);margin-top:8px;font-weight:400}.leaflet-popup-content .parameter-values{font-size:12px}.leaflet-popup-content{max-width:calc(100vw - 80px)}
.parameter-hint{font-size:11px;color:var(--muted);margin-top:8px}.leaflet-popup-content .parameter-values{margin-top:4px}
</style>
</head>
<body>
<header><div><div class="eyebrow">Air Quality Data explorer</div><h1>AirGradient Test API App</h1><p>Five device slots · Max & Open Air · Live public measurements</p><p>Made by Akila DJ using OpenAI · Demonstration</p></div><div class="actions"><button id="refresh" class="primary">↻ Refresh data</button><button id="settings-open">Settings & devices</button></div></header>
<main>
<section class="panel" aria-label="Setup and license"><p><strong>Main local app · Release candidate v2.3.0-rc.2.</strong> Requires installed Python 3.9+ (a supported stable release is recommended), a modern browser, and an <strong>active internet connection to fetch data</strong>. Run <code>serve.py</code> and open the printed local URL. <a href="https://www.python.org/downloads/" target="_blank" rel="noopener noreferrer">Install Python</a> · <a href="https://github.com/GGadash/AirGradient-Test-API-App/blob/main/START_HERE.md" target="_blank" rel="noopener noreferrer">Setup guide</a> · <a href="https://github.com/GGadash/AirGradient-Test-API-App/releases" target="_blank" rel="noopener noreferrer">Downloads</a></p><p><strong>License: <a href="https://opensource.org/license/mit-0" target="_blank" rel="license noopener noreferrer">MIT No Attribution (MIT-0)</a>.</strong> Original code and docs are free to use, change, share, and sell. Credit is optional and welcome; no share-alike requirement. Provided as is, without warranty. <a href="https://github.com/GGadash/AirGradient-Test-API-App/blob/main/THIRD_PARTY_NOTICES.md" target="_blank" rel="noopener noreferrer">Third-party terms still apply</a>.</p></section>
<p class="notice">For convenient viewing without installation, a <a href="https://ggadash.github.io/AirGradient-Test-API-App/" target="_blank" rel="noopener noreferrer">supplementary web preview</a> shows scheduled public snapshots. This Python + localhost app remains the main version, with fuller controls and on-demand requests.</p>
<p class="notice warn"><strong>Testing and demo only.</strong> This independent app tests AirGradient API connections. Software, labels, calculations and source readings may contain mistakes; check the original records before relying on results.</p>
<noscript>Please enable JavaScript to load the map and measurements.</noscript>
<div class="notice" id="launch-note"><strong>Open through Python:</strong> run <code>py serve.py</code>, then load the <strong>localhost / 127.0.0.1 link printed in the terminal</strong>. Do not open this HTML file directly. Keep the terminal running while using the page. See <code>README.md</code> for numbered steps.</div>
<div id="startup" class="notice warn"><strong>This HTML was opened directly. Start Python and use its localhost link instead.</strong><p>This HTML file needs the companion <code>serve.py</code> because AirGradient does not currently allow direct browser requests. Keep both files in one folder, run <code>py serve.py</code> on Windows or <code>python3 serve.py</code> on macOS/Linux, and load the <strong>localhost / 127.0.0.1 URL printed in the terminal</strong>. Do not double-click the HTML file. Python 3.9+ and internet access are required; no extra Python packages.</p></div>
<div class="toolbar"><div class="field"><label for="parameter">Map parameter</label><select id="parameter"></select></div><div class="field"><label for="period">Measurement period</label><select id="period"><option value="current">Latest reading</option><option value="hourly">1-hour API bucket · token needed</option></select></div><div class="field"><label for="basis">PM₂.₅ source / AQI input</label><select id="basis"><option value="raw">Raw PM₂.₅</option><option value="corrected">Corrected PM₂.₅ only</option></select></div><div class="push status" id="status" role="status" aria-live="polite">Preparing monitors…</div></div>
<div id="slot-note" class="notice warn" role="status"></div><div class="workspace"><section class="map-wrap" aria-label="Air Quality Data map"><div class="map-bottom"><label class="small" for="basemap">Basemap <select id="basemap" style="font-size:13px;padding:6px"><option value="streets">OpenStreetMap · street detail</option><option value="world">Built-in world outline · no tiles</option></select></label><span id="map-status" class="small muted" role="status">Preparing basemap…</span></div><div id="map" aria-describedby="zoom-help"></div><div id="zoom-help" class="small muted" style="padding:8px 16px;background:white">Hold <strong>Ctrl</strong> and scroll to zoom the map (⌘ also supported on Mac). Scroll normally to move the page. Touch: pinch to zoom.</div><div class="map-bottom"><div class="legend" id="legend"></div><button id="fit" class="small">Show all devices</button></div></section><aside id="stations" class="stations" aria-label="Monitors"></aside></div>
<section class="panel" id="detail" aria-label="Device measurements"></section>
<div class="notice" id="method-note">AQI estimate: PM₂.₅ only, using US EPA breakpoints on the selected reading. This demonstration is not a daily AQI or EPA NowCast. Map colours always follow the PM₂.₅ AQI estimate.</div>
<div class="compare"><div><strong>Compare with AirGradient</strong><p>Match the location, timestamp, averaging period and correction method. Values may differ when these settings differ.</p></div><div class="compare-links"><a href="https://www.airgradient.com/map/" target="_blank" rel="noopener noreferrer">Global vendor map ↗</a><a id="vendor-location" href="https://www.airgradient.com/map/" target="_blank" rel="noopener noreferrer">Selected location ↗</a><a id="raw-link" href="https://api.airgradient.com/public/api/v1/world/locations/196780/measures/current" target="_blank" rel="noopener noreferrer">Public API JSON ↗</a></div></div>
<section class="panel" aria-label="All locations and API connection details"><h2>Air Quality Data: locations & API details</h2><p class="small muted" style="margin-top:6px">Hardware identity is checked against known AirGradient model codes reported by the API. Contributor names identify operators, not manufacturers. Names and metadata below are reported by AirGradient. Select a location for every returned field. Coordinates are not reverse-geocoded or invented. Private tokens are never printed in this table or its links.</p><div id="location-table" class="table-wrap" style="max-height:480px"></div></section>
<section class="panel resources"><div><h2>Timing & interpretation</h2><p><strong>Max: 3-minute samples, 9-minute cellular uploads.</strong> The Max firmware documents three samples per cellular batch. Wi-Fi normally uploads each 3-minute sample. This is a Max firmware schedule, not a confirmed connection mode for each station; the standard Open Air devices may use a different cadence. Polling more often does not create new measurements; current-only polling can miss earlier samples in a batch.</p><p><strong>Hourly mode.</strong> Reads each location separately through <code>/locations/{id}/measures/buckets/60</code>, which supplies up to seven days of hourly buckets. An authorized token is required. The newest returned bucket is shown; it may be incomplete, and its timestamp is kept exactly as supplied. No hourly average is invented from the latest reading.</p><p><strong>AQI method.</strong> PM₂.₅ is truncated to 0.1 µg/m³ before linear interpolation and integer rounding. The US EPA PM₂.₅ breakpoints are applied as a demonstration to the selected latest or hourly concentration. This is neither a multi-pollutant AQI nor AQI-SL. Values above 500 are extrapolated using the hazardous band.</p><p><strong>Missing and unusual values.</strong> API-reported NO₂ and O₃ are shown in ppb when supplied. Negative values are preserved and flagged, not clamped to zero; zero alone does not prove accuracy. Missing fields remain unavailable. VOC/NOx index fields are not gas concentrations; some Max firmware versions expose raw-like values under index names. NO₂/O₃ electrode signals are not converted to concentrations here. Inspect the model, firmware and raw JSON before interpreting them.</p><p><strong>Corrections.</strong> Corrected-only mode never silently substitutes raw PM₂.₅. Public records may omit corrected values; authenticated endpoints and vendor map correction rules can differ.</p></div><div><h2>Documentation & examples</h2><ul>
<li><a href="https://github.com/GGadash/AirGradient-Test-API-App/wiki" target="_blank" rel="noopener noreferrer">Project wiki: devices, parameters and credits</a></li>
<li><a href="https://api.airgradient.com/public/docs/api/v1/" target="_blank" rel="noopener noreferrer">Interactive API documentation (Swagger)</a></li>
<li><a href="https://api.airgradient.com/public/docs/api/v1/swagger.json" target="_blank" rel="noopener noreferrer">API specification JSON</a></li>
<li><a href="https://www.airgradient.com/documentation/kb/where-do-i-access-the-api-documentation-api-token-and-local-api" target="_blank" rel="noopener noreferrer">Find your token and Location ID</a></li>
<li><a href="https://github.com/Open-Air-Foundation/firmware-openair-max#transmission" target="_blank" rel="noopener noreferrer">Max firmware: timing and payload examples</a></li>
<li><a href="https://www.airgradient.com/documentation/kb/kb-diy-calibration-algorithms" target="_blank" rel="noopener noreferrer">Calibration and correction algorithms</a></li>
<li><a href="https://openair.foundation/undp-toolkit/operating/data-download-export/" target="_blank" rel="noopener noreferrer">Historical data and retention</a></li>
<li><a href="https://api.airgradient.com/public/api/v1/world/locations/measures/current" target="_blank" rel="noopener noreferrer">Public devices API example</a></li>
<li><a href="https://document.airnow.gov/technical-assistance-document-for-the-reporting-of-daily-air-quailty.pdf" target="_blank" rel="noopener noreferrer">US EPA AQI technical guidance (May 2026)</a></li></ul><details><summary>How to run and extend this page</summary><p>Keep the HTML and <code>serve.py</code> together. Run <code>py serve.py</code> (Windows) or <code>python3 serve.py</code> (macOS/Linux), then open the printed address. The launcher only accepts connections from this computer.</p><p>Use Settings to add a Location ID or browse AirGradient monitors. Your device list and display preferences are stored in this browser. Tokens are kept only in the launcher's memory until cleared or stopped; never add one to the source. Street-map tiles and the Leaflet library load from the internet. If street tiles are blocked or unavailable, choose “Built-in world outline” above the map. This uses embedded Natural Earth coastlines with no tile requests; it is a small-scale overview without streets. The app and live measurements still need internet access.</p><p>For a hosted platform, adapt the launcher's fixed API routes into your own backend and store credentials there. This package is a local demonstration, not a production server.</p></details></div></section>
<footer><span>Made by Akila DJ using OpenAI · Demonstrational purposes · v2.3.0-rc.2</span><span>MIT-0 · Optional author credit · AirGradient data · Leaflet · OpenStreetMap / Natural Earth</span></footer>
</main>
<dialog id="settings"><div class="dialog-content"><div class="detail-head"><h2>Settings & devices</h2><button id="settings-close" aria-label="Close settings">✕</button></div><h3>Refresh & timestamps</h3><div class="row"><div class="field"><label for="interval">Automatic refresh</label><select id="interval"><option value="0">Manual only</option><option value="180">Every 3 minutes</option><option value="300">Every 5 minutes</option><option value="540">Every 9 minutes</option></select></div><div class="field"><label for="timezone">Timestamp display</label><select id="timezone"><option value="local">My browser timezone</option><option value="UTC">UTC</option><option value="Asia/Colombo">Sri Lanka (UTC+05:30)</option></select></div></div><p>Data age is based on the measurement timestamp, not the refresh time. Latest readings older than 20 minutes and hourly buckets older than 2 hours are marked stale. These are display thresholds for this demo.</p><h3>Max without O₃/NO₂ — slot 3</h3><p>Banthi, Lamphun, Thailand is the default. To replace it, enter another AirGradient Location ID; the app checks the Max model without O₃/NO₂.</p><form id="base-form" class="row"><input id="base-id" aria-label="Max without gas sensors Location ID" placeholder="Replacement Location ID" inputmode="numeric" pattern="[1-9][0-9]{0,11}" required><button type="submit">Replace slot 3</button></form><h3>Your monitors</h3><form id="add-form" class="row"><input id="new-id" aria-label="AirGradient Location ID" placeholder="Location ID, e.g. 172350" inputmode="numeric" pattern="[1-9][0-9]{0,11}" required><button class="primary" type="submit">Add device</button></form><div id="managed" class="mini-list"></div><div class="row" style="margin-top:12px"><button id="discover">Browse AirGradient devices</button><button id="reset">Restore five default slots</button></div><div id="discovery" class="mini-list"></div><h3>Optional: authenticated hourly data</h3><p>Use an <strong>AirGradient API token</strong> with access to your Location IDs. A token does not unlock other owners' public-device history. It is held only in the local launcher's memory and sent only to AirGradient; it is never saved in this HTML or browser storage.</p><form id="token-form" class="row"><input id="token" type="password" autocomplete="off" aria-label="AirGradient API token" placeholder="AirGradient API token"><button type="submit">Use token</button><button type="button" id="clear-token">Clear</button></form><p id="auth-status">No token configured.</p><p id="settings-message" role="status" aria-live="polite"></p><p id="storage-warning" class="storage-note"></p></div></dialog>
<script src="https://unpkg.com/[email protected]/dist/leaflet.js" integrity="sha256-20nQCchB9co0qIjJZRGuk2/Z9VM+kNiyxNV1lvTlZBo=" crossorigin=""></script>
<script>
'use strict';
// Natural Earth 1:110m land (public domain), embedded to avoid any fallback tile requests.
const WORLD_LAND={"type":"FeatureCollection","name":"ne_110m_land","crs":{"type":"name","properties":{"name":"urn:ogc:def:crs:OGC:1.3:CRS84"}},"features":[{"type":"Feature","properties":{},"bbox":[-66.29,-81.0003,-59.5721,-79.6287],"geometry":{"type":"Polygon","coordinates":[[[-59.5721,-80.0402],[-59.8658,-80.5497],[-60.1597,-81.0003],[-62.2554,-80.8632],[-64.4881,-80.9219],[-65.7417,-80.5888],[-65.7417,-80.5497],[-66.29,-80.2558],[-64.0377,-80.2949],[-61.8832,-80.3929],[-61.139,-79.9814],[-60.6101,-79.6287],[-59.5721,-80.0402]]]}},{"type":"Feature","properties":{},"bbox":[-163.7129,-79.6342,-159.2082,-78.2233],"geometry":{"type":"Polygon","coordinates":[[[-159.2082,-79.4971],[-161.1276,-79.6342],[-162.4398,-79.2815],[-163.0274,-78.9288],[-163.0666,-78.87],[-163.7129,-78.5957],[-163.7129,-78.5957],[-163.1058,-78.2233],[-161.2451,-78.3802],[-160.2462,-78.6936],[-159.4824,-79.0463],[-159.2082,-79.4971]]]}},{"type":"Feature","properties":{},"bbox":[-54.1643,-81.0254,-43.3333,-77.8315],"geometry":{"type":"Polygon","coordinates":[[[-45.1548,-78.0471],[-43.9208,-78.4781],[-43.49,-79.0856],[-43.3724,-79.5166],[-43.3333,-80.0261],[-44.8805,-80.3396],[-46.5062,-80.5944],[-48.3864,-80.8295],[-50.4821,-81.0254],[-52.852,-80.9667],[-54.1643,-80.6335],[-53.988,-80.222],[-51.8531,-79.9477],[-50.9913,-79.6146],[-50.3646,-79.1835],[-49.9141,-78.8112],[-49.307,-78.4586],[-48.6606,-78.047],[-48.6606,-78.047],[-48.1514,-78.0471],[-46.6629,-77.8315],[-45.1548,-78.0471]]]}},{"type":"Feature","properties":{},"bbox":[-122.6217,-74.0888,-118.7241,-73.3246],"geometry":{"type":"Polygon","coordinates":[[[-121.2115,-73.501],[-119.9189,-73.6577],[-118.7241,-73.4814],[-119.2921,-73.8341],[-120.2322,-74.0888],[-121.6228,-74.0105],[-122.6217,-73.6578],[-122.6217,-73.6578],[-122.4062,-73.3246],[-121.2115,-73.501]]]}},{"type":"Feature","properties":{},"bbox":[-127.2831,-73.8733,-124.0319,-73.2462],"geometry":{"type":"Polygon","coordinates":[[[-125.5596,-73.4814],[-124.0319,-73.8733],[-124.6195,-73.8341],[-125.9122,-73.7361],[-127.2831,-73.4618],[-127.2831,-73.4618],[-126.5585,-73.2462],[-125.5596,-73.4814]]]}},{"type":"Feature","properties":{},"bbox":[-102.3307,-72.5212,-96.2004,-71.7178],"geometry":{"type":"Polygon","coordinates":[[[-98.9815,-71.9333],[-97.8847,-72.0705],[-96.7879,-71.953],[-96.2004,-72.5212],[-96.9838,-72.4429],[-98.1981,-72.482],[-99.432,-72.4429],[-100.7835,-72.5016],[-101.8019,-72.3057],[-102.3307,-71.8942],[-102.3307,-71.8942],[-101.704,-71.7178],[-100.4309,-71.855],[-98.9815,-71.9333]]]}},{"type":"Feature","properties":{},"bbox":[-75.0126,-72.5038,-68.3338,-68.8787],"geometry":{"type":"Polygon","coordinates":[[[-68.4513,-70.9558],[-68.3338,-71.4065],[-68.5101,-71.7984],[-68.7843,-72.1707],[-69.9595,-72.3079],[-71.0759,-72.5038],[-72.3881,-72.4843],[-71.8985,-72.0923],[-73.0736,-72.2295],[-74.19,-72.3667],[-74.9539,-72.0728],[-75.0126,-71.6613],[-73.9158,-71.2693],[-73.9158,-71.2693],[-73.2303,-71.1518],[-72.0747,-71.191],[-71.781,-70.6815],[-71.7222,-70.3092],[-71.7418,-69.5058],[-71.1738,-69.0355],[-70.2533,-68.8787],[-69.7244,-69.251],[-69.4894,-69.6233],[-69.0585,-70.074],[-68.7255,-70.5052],[-68.4513,-70.9558]]]}},{"type":"Feature","properties":{},"bbox":[-180,-90,180,-63.2707],"geometry":{"type":"Polygon","coordinates":[[[-58.6141,-64.1525],[-59.0451,-64.368],[-59.7893,-64.2112],[-60.6119,-64.3092],[-61.2974,-64.5443],[-62.0221,-64.7991],[-62.5118,-65.093],[-62.6489,-65.4849],[-62.5901,-65.8572],[-62.1201,-66.1903],[-62.8056,-66.4255],[-63.7457,-66.5038],[-64.2941,-66.837],[-64.8817,-67.1505],[-65.5084,-67.5816],[-65.6651,-67.9539],[-65.3125,-68.3653],[-64.7837,-68.6789],[-63.9611,-68.914],[-63.1973,-69.2276],[-62.786,-69.6194],[-62.5705,-69.9917],[-62.2767,-70.3837],[-61.8067,-70.7168],[-61.5129,-71.089],[-61.3758,-72.0101],[-61.082,-72.3824],[-61.0037,-72.7743],[-60.6903,-73.1662],[-60.8274,-73.6952],[-61.3758,-74.1067],[-61.9634,-74.4398],[-63.2952,-74.577],[-63.7457,-74.9297],[-64.3528,-75.2628],[-65.861,-75.6351],[-67.1928,-75.7919],[-68.4463,-76.0075],[-69.7977,-76.223],[-70.6007,-76.6345],[-72.2068,-76.6737],[-73.9695,-76.6345],[-75.556,-76.7129],[-77.2404,-76.7129],[-76.927,-77.1048],[-75.3993,-77.2811],[-74.2829,-77.5554],[-73.6561,-77.9081],[-74.7725,-78.2216],[-76.4961,-78.1237],[-77.9259,-78.3784],[-77.9847,-78.7899],[-78.0238,-79.1818],[-76.8486,-79.5149],[-76.6332,-79.8872],[-75.3601,-80.2595],[-73.2449,-80.4163],[-71.4429,-80.6906],[-70.0132,-81.0042],[-68.1916,-81.3177],[-65.7043,-81.4745],[-63.256,-81.7488],[-61.552,-82.0427],[-59.6914,-82.3758],[-58.7121,-82.8461],[-58.2225,-83.2184],[-57.0081,-82.8657],[-55.3629,-82.5718],[-53.6198,-82.2582],[-51.5436,-82.0035],[-49.7614,-81.7292],[-47.2739,-81.7096],[-44.8257,-81.8467],[-42.8084,-82.0819],[-42.162,-81.6508],[-40.7714,-81.3569],[-38.2448,-81.3373],[-36.2667,-81.1217],[-34.3864,-80.9062],[-32.3103,-80.769],[-30.0971,-80.5927],[-28.5498,-80.3379],[-29.2549,-79.9852],[-29.6858,-79.6325],[-29.6858,-79.2602],[-31.6248,-79.2994],[-33.6813,-79.4561],[-35.6399,-79.4561],[-35.9141,-79.0839],[-35.777,-78.3392],[-35.3265,-78.1237],[-33.8968,-77.8885],[-32.2124,-77.6535],[-30.9981,-77.3595],[-29.7837,-77.0656],[-28.8828,-76.6737],[-27.5118,-76.4973],[-26.1603,-76.3601],[-25.4748,-76.2818],[-23.9276,-76.2426],[-22.4586,-76.1054],[-21.2247,-75.9095],[-20.0104,-75.6743],[-18.9135,-75.4392],[-17.523,-75.1257],[-16.6416,-74.7925],[-15.7015,-74.4986],[-15.4077,-74.1067],[-16.4653,-73.8716],[-16.1128,-73.4601],[-15.4469,-73.1465],[-14.4088,-72.9506],[-13.312,-72.7155],[-12.2935,-72.4019],[-11.5101,-72.0101],[-11.0204,-71.5398],[-10.2958,-71.2654],[-9.101,-71.3242],[-8.6114,-71.6573],[-7.4166,-71.6965],[-7.3775,-71.3242],[-6.8682,-70.9323],[-5.791,-71.0303],[-5.5364,-71.4026],[-4.3417,-71.4614],[-3.049,-71.2851],[-1.7955,-71.1674],[-0.6595,-71.2262],[-0.2286,-71.6377],[0.8682,-71.3046],[1.8867,-71.1283],[3.0226,-70.9911],[4.1391,-70.8539],[5.1575,-70.6188],[6.2739,-70.4621],[7.1357,-70.2465],[7.7429,-69.8938],[8.4871,-70.1485],[9.5251,-70.0113],[10.2498,-70.4816],[10.8178,-70.8343],[11.9538,-70.6384],[12.4043,-70.2465],[13.4228,-69.9722],[14.735,-70.0309],[15.1268,-70.4032],[15.9493,-70.0309],[17.0266,-69.9134],[18.2017,-69.8742],[19.2594,-69.8938],[20.3757,-70.0113],[21.453,-70.0701],[21.923,-70.4032],[22.5694,-70.6972],[23.6662,-70.5208],[24.8414,-70.4816],[25.9773,-70.4816],[27.0937,-70.4621],[28.0926,-70.3249],[29.1502,-70.2073],[30.0316,-69.9329],[30.9717,-69.7566],[31.9902,-69.6586],[32.7541,-69.3843],[33.3024,-68.8356],[33.8704,-68.5026],[34.9085,-68.6593],[35.3002,-69.012],[36.162,-69.2471],[37.2,-69.1687],[37.9051,-69.5214],[38.6494,-69.7762],[39.6679,-69.5411],[40.0204,-69.1099],[40.9214,-68.9336],[41.9594,-68.6005],[42.9387,-68.4633],[44.1139,-68.2674],[44.8973,-68.0519],[45.7199,-67.8167],[46.5033,-67.6012],[47.4434,-67.7188],[48.3444,-67.3661],[48.9907,-67.0917],[49.9309,-67.1113],[50.7535,-66.8762],[50.9493,-66.5235],[51.7915,-66.2491],[52.6141,-66.0532],[53.613,-65.8964],[54.5335,-65.818],[55.4149,-65.8768],[56.355,-65.9748],[57.1581,-66.2491],[57.256,-66.6802],[58.1374,-67.0133],[58.7445,-67.2877],[59.9393,-67.4052],[60.6052,-67.6796],[61.4278,-67.9539],[62.3875,-68.0127],[63.1905,-67.8167],[64.0523,-67.4052],[64.9924,-67.6207],[65.9717,-67.7383],[66.9119,-67.8559],[67.8911,-67.9343],[68.89,-67.9343],[69.7126,-68.9728],[69.6735,-69.2276],[69.5559,-69.6782],[68.5963,-69.9329],[67.8127,-70.3053],[67.9499,-70.6972],[69.0663,-70.6775],[68.9292,-71.0695],[68.42,-71.4418],[67.9499,-71.8533],[68.7138,-72.1668],[69.8693,-72.2648],[71.0249,-72.0884],[71.5733,-71.6965],[71.9063,-71.3242],[72.4546,-71.0107],[73.0814,-70.7168],[73.336,-70.364],[73.8649,-69.8742],[74.4916,-69.7762],[75.6276,-69.737],[76.6265,-69.6194],[77.6449,-69.4627],[78.1345,-69.0708],[78.4284,-68.6984],[79.1139,-68.3262],[80.0931,-68.0715],[80.9353,-67.8755],[81.4838,-67.5424],[82.0518,-67.3661],[82.7764,-67.2093],[83.7753,-67.3073],[84.6762,-67.2093],[85.6555,-67.0917],[86.7524,-67.1505],[87.477,-66.8762],[87.9863,-66.2099],[88.3584,-66.4843],[88.8284,-66.9546],[89.6706,-67.1505],[90.6304,-67.2289],[91.5901,-67.1113],[92.6085,-67.1897],[93.5486,-67.2093],[94.1754,-67.1113],[95.0176,-67.1701],[95.7815,-67.3857],[96.6824,-67.2485],[97.7596,-67.2485],[98.6802,-67.1113],[99.7182,-67.2485],[100.3842,-66.9153],[100.8934,-66.5822],[101.5789,-66.3079],[102.8324,-65.5633],[103.4787,-65.7005],[104.2426,-65.9748],[104.9085,-66.3275],[106.1816,-66.9349],[107.1609,-66.9546],[108.0814,-66.9546],[109.1586,-66.837],[110.2358,-66.6998],[111.0585,-66.4255],[111.744,-66.1316],[112.8604,-66.0923],[113.6047,-65.8768],[114.3881,-66.0728],[114.8973,-66.3863],[115.6024,-66.6998],[116.6992,-66.6606],[117.3847,-66.9153],[118.5795,-67.1701],[119.8329,-67.2681],[120.871,-67.1897],[121.6544,-66.8762],[122.3204,-66.5627],[123.2213,-66.4843],[124.1223,-66.6215],[125.1602,-66.7194],[126.1004,-66.5627],[127.0014,-66.5627],[127.8828,-66.6606],[128.8033,-66.7586],[129.7043,-66.5822],[130.7815,-66.4255],[131.7999,-66.3863],[132.9359,-66.3863],[133.8565,-66.2883],[134.7574,-66.21],[135.0316,-65.7201],[135.0708,-65.3086],[135.6975,-65.5829],[135.8738,-66.0336],[136.2067,-66.4451],[136.618,-66.7782],[137.4603,-66.9546],[138.5962,-66.8958],[139.9084,-66.8762],[140.8094,-66.8174],[142.1217,-66.8174],[143.0618,-66.7978],[144.3741,-66.837],[145.4904,-66.9153],[146.1956,-67.2289],[145.9997,-67.6012],[146.6461,-67.8951],[147.7233,-68.1303],[148.8396,-68.385],[150.1323,-68.5613],[151.4837,-68.7181],[152.5022,-68.8748],[153.6382,-68.8945],[154.2846,-68.5613],[155.1659,-68.8356],[155.9298,-69.1492],[156.8111,-69.3843],[158.0255,-69.4823],[159.181,-69.5998],[159.6707,-69.9917],[160.8066,-70.2269],[161.5705,-70.5796],[162.6869,-70.7364],[163.8424,-70.7168],[164.9197,-70.7755],[166.1144,-70.7559],[167.3091,-70.8343],[168.4256,-70.9715],[169.4636,-71.2067],[170.5017,-71.4026],[171.2068,-71.6965],[171.0892,-72.0884],[170.5604,-72.4412],[170.11,-72.8918],[169.7574,-73.2445],[169.2873,-73.656],[167.9751,-73.8128],[167.3875,-74.1655],[166.0948,-74.381],[165.6444,-74.773],[164.9589,-75.1453],[164.2342,-75.4588],[163.8228,-75.8703],[163.5682,-76.2426],[163.4703,-76.6933],[163.4899,-77.0656],[164.0579,-77.4574],[164.2734,-77.8298],[164.7435,-78.1825],[166.6041,-78.3196],[166.9958,-78.7507],[165.1939,-78.9075],[163.6662,-79.123],[161.7664,-79.1622],[160.9242,-79.7305],[160.7479,-80.2007],[160.317,-80.5731],[159.7882,-80.9454],[161.12,-81.2785],[161.6293,-81.69],[162.491,-82.0623],[163.7053,-82.3954],[165.0959,-82.709],[166.6041,-83.0225],[168.8957,-83.336],[169.4048,-83.8259],[172.2839,-84.0414],[172.477,-84.1179],[173.2241,-84.4137],[175.9857,-84.159],[178.2772,-84.4725],[180,-84.7134],[180,-90],[-180,-90],[-180,-84.7134],[-179.9425,-84.7214],[-179.0587,-84.1394],[-177.2568,-84.4529],[-177.1408,-84.4179],[-176.862,-84.3338],[-176.524,-84.2318],[-176.2303,-84.1432],[-176.0847,-84.0993],[-175.9341,-84.1016],[-175.8299,-84.1179],[-174.3825,-84.5343],[-173.1166,-84.1179],[-172.8891,-84.061],[-169.9512,-83.8846],[-169.0,-84.1179],[-168.5302,-84.2374],[-167.0221,-84.5705],[-164.1821,-84.8252],[-161.9298,-85.1387],[-158.0714,-85.3739],[-155.1923,-85.0996],[-150.9421,-85.2955],[-148.5331,-85.609],[-145.8889,-85.3151],[-143.1077,-85.0408],[-142.8923,-84.5705],[-146.8291,-84.5313],[-150.0607,-84.2961],[-150.9029,-83.9042],[-153.5862,-83.6887],[-153.4099,-83.238],[-153.0378,-82.8265],[-152.6656,-82.4542],[-152.8615,-82.0427],[-154.5263,-81.7684],[-155.2902,-81.4156],[-156.8374,-81.1021],[-154.4088,-81.1609],[-152.0977,-81.0042],[-150.6483,-81.3373],[-148.866,-81.0434],[-147.2208,-80.671],[-146.4177,-80.3379],[-146.7703,-79.9264],[-148.0629,-79.6521],[-149.5319,-79.3582],[-151.5884,-79.2994],[-153.3903,-79.1622],[-155.3294,-79.0643],[-155.9757,-78.6919],[-157.2683,-78.3784],[-158.0518,-78.0257],[-158.3651,-76.8892],[-157.8755,-76.9872],[-156.9746,-77.3008],[-155.3294,-77.2027],[-153.7428,-77.0656],[-152.9202,-77.4967],[-151.3338,-77.3987],[-150.0019,-77.1831],[-148.7485,-76.9088],[-147.6125,-76.5757],[-146.1044,-76.4778],[-146.1435,-76.1054],[-146.4961,-75.7332],[-146.2023,-75.3804],[-144.9096,-75.204],[-144.322,-75.5372],[-142.7944,-75.3412],[-141.6388,-75.0865],[-140.209,-75.0669],[-138.8576,-74.9689],[-137.5062,-74.7338],[-136.4289,-74.5182],[-135.2146,-74.3027],[-134.4312,-74.3615],[-133.7457,-74.4398],[-132.2572,-74.3027],[-130.9253,-74.479],[-129.5543,-74.4594],[-128.242,-74.3223],[-126.8906,-74.4203],[-125.4021,-74.5182],[-124.0115,-74.479],[-122.5622,-74.4986],[-121.0736,-74.5182],[-119.7026,-74.479],[-118.6841,-74.1851],[-117.4698,-74.0283],[-116.2163,-74.2439],[-115.0216,-74.0675],[-113.9443,-73.7148],[-113.298,-74.0283],[-112.9455,-74.381],[-112.2991,-74.7142],[-111.2611,-74.4203],[-110.0663,-74.7925],[-108.7149,-74.9101],[-107.5593,-75.1845],[-106.1491,-75.1257],[-104.8761,-74.9493],[-103.3679,-74.9885],[-102.0165,-75.1257],[-100.6455,-75.302],[-100.1167,-74.8709],[-100.763,-74.5378],[-101.2527,-74.1851],[-102.5453,-74.1067],[-103.1133,-73.7344],[-103.3288,-73.3621],[-103.6813,-72.6175],[-102.9175,-72.7547],[-101.6052,-72.8134],[-100.3125,-72.7547],[-99.1374,-72.9114],[-98.1189,-73.2053],[-97.688,-73.558],[-96.3366,-73.6168],[-95.044,-73.4797],[-93.6729,-73.2837],[-92.439,-73.1662],[-91.4206,-73.4013],[-90.0887,-73.3229],[-89.227,-72.5587],[-88.424,-73.0094],[-87.2683,-73.1858],[-86.0148,-73.0878],[-85.1922,-73.4797],[-83.88,-73.5189],[-82.6656,-73.6364],[-81.4709,-73.852],[-80.6874,-73.4797],[-80.2958,-73.127],[-79.2969,-73.5189],[-77.9259,-73.4209],[-76.9074,-73.6364],[-76.2219,-73.9695],[-74.89,-73.8716],[-73.852,-73.656],[-72.8335,-73.4013],[-71.6192,-73.2642],[-70.209,-73.1465],[-68.9359,-73.0094],[-67.9566,-72.7939],[-67.3691,-72.4803],[-67.134,-72.0492],[-67.2515,-71.6377],[-67.5649,-71.2458],[-67.9175,-70.8539],[-68.2308,-70.4621],[-68.4855,-70.1093],[-68.5442,-69.7174],[-68.4463,-69.3255],[-67.9762,-68.9532],[-67.5845,-68.5417],[-67.4278,-68.1498],[-67.6237,-67.7188],[-67.7412,-67.3268],[-67.2515,-66.8762],[-66.7032,-66.5822],[-66.0568,-66.21],[-65.3713,-65.8964],[-64.5683,-65.6025],[-64.1765,-65.1714],[-63.6282,-64.8971],[-63.0014,-64.6423],[-62.0417,-64.5836],[-61.4149,-64.27],[-60.7099,-64.0741],[-59.8873,-63.9565],[-59.1626,-63.7017],[-58.5946,-63.3882],[-57.8111,-63.2707],[-57.2236,-63.5254],[-57.5957,-63.8585],[-58.6141,-64.1525]]]}},{"type":"Feature","properties":{},"bbox":[-74.6625,-55.6118,-65.05,-52.5183],"geometry":{"type":"Polygon","coordinates":[[[-67.75,-53.85],[-66.45,-54.45],[-65.05,-54.7],[-65.5,-55.2],[-66.45,-55.25],[-66.9599,-54.8968],[-67.291,-55.3012],[-68.1486,-55.6118],[-69.2321,-55.4991],[-69.9581,-55.1984],[-71.0057,-55.0538],[-72.2639,-54.4951],[-73.2852,-53.9575],[-74.6625,-52.8375],[-73.8381,-53.0474],[-72.4342,-53.7154],[-71.1077,-54.0743],[-70.5918,-53.6158],[-70.2675,-52.9312],[-69.3457,-52.5183],[-68.6341,-52.6362],[-68.634,-52.6364],[-68.25,-53.1],[-67.75,-53.85]]]}},{"type":"Feature","properties":{},"bbox":[-61.2,-52.3,-57.75,-51.1],"geometry":{"type":"Polygon","coordinates":[[[-58.55,-51.1],[-57.75,-51.55],[-58.05,-51.9],[-59.4,-52.2],[-59.85,-51.85],[-60.7,-52.3],[-61.2,-51.85],[-60,-51.25],[-59.15,-51.5],[-58.55,-51.1]]]}},{"type":"Feature","properties":{},"bbox":[68.72,-49.775,70.56,-48.625],"geometry":{"type":"Polygon","coordinates":[[[70.28,-49.71],[68.745,-49.775],[68.72,-49.2425],[68.8675,-48.83],[68.935,-48.625],[69.58,-48.94],[70.525,-49.065],[70.56,-49.255],[70.28,-49.71]]]}},{"type":"Feature","properties":{},"bbox":[144.7181,-43.6346,148.3599,-40.704],"geometry":{"type":"Polygon","coordinates":[[[145.398,-40.7925],[146.3641,-41.1377],[146.9086,-41.0005],[147.6893,-40.8083],[148.2891,-40.8754],[148.3599,-42.0624],[148.0173,-42.407],[147.9141,-43.2115],[147.5646,-42.9377],[146.8703,-43.6346],[146.6633,-43.5809],[146.0484,-43.5497],[145.4319,-42.6938],[145.2951,-42.0336],[144.7181,-41.1626],[144.7438,-40.704],[145.398,-40.7925]]]}},{"type":"Feature","properties":{},"bbox":[166.5091,-46.6412,174.2485,-40.494],"geometry":{"type":"Polygon","coordinates":[[[173.0204,-40.9191],[173.2472,-41.332],[173.9584,-40.9267],[174.2476,-41.3492],[174.2485,-41.77],[173.8764,-42.2332],[173.2227,-42.97],[172.7112,-43.3723],[173.0801,-43.8533],[172.3086,-43.8657],[171.4529,-44.2425],[171.1851,-44.8971],[170.6167,-45.9089],[169.8314,-46.3558],[169.3323,-46.6412],[168.4114,-46.6199],[167.7637,-46.2902],[166.6769,-46.2199],[166.5091,-45.8527],[167.0464,-45.1109],[168.3038,-44.124],[168.9494,-43.9358],[169.6678,-43.5553],[170.5249,-43.0317],[171.1251,-42.5128],[171.5697,-41.7674],[171.9487,-41.5144],[172.0972,-40.9561],[172.7986,-40.494],[173.0204,-40.9191]]]}},{"type":"Feature","properties":{},"bbox":[172.636,-41.6883,178.5171,-34.4507],"geometry":{"type":"Polygon","coordinates":[[[174.612,-36.1564],[175.3366,-37.2091],[175.3576,-36.5262],[175.8089,-36.7989],[175.9585,-37.5554],[176.7632,-37.8813],[177.4388,-37.9612],[178.0104,-37.5798],[178.5171,-37.6954],[178.2747,-38.5828],[177.9705,-39.1663],[177.207,-39.1458],[176.94,-39.4497],[177.0329,-39.8799],[176.8858,-40.066],[176.508,-40.6048],[176.0124,-41.2896],[175.2396,-41.6883],[175.0679,-41.4259],[174.651,-41.2818],[175.2276,-40.4592],[174.9002,-39.9089],[173.824,-39.5089],[173.8523,-39.1466],[174.5748,-38.7977],[174.7435,-38.0278],[174.697,-37.3811],[174.292,-36.7111],[174.319,-36.5348],[173.841,-36.122],[173.0542,-35.2371],[172.636,-34.5291],[173.007,-34.4507],[173.5513,-35.0062],[174.3294,-35.2655],[174.612,-36.1564]]]}},{"type":"Feature","properties":{},"bbox":[164.0296,-22.4,167.12,-20.1056],"geometry":{"type":"Polygon","coordinates":[[[167.12,-22.16],[166.74,-22.4],[166.1897,-22.1297],[165.4744,-21.6796],[164.8298,-21.1498],[164.168,-20.4447],[164.0296,-20.1056],[164.46,-20.12],[165.02,-20.46],[165.46,-20.8],[165.78,-21.08],[166.6,-21.7],[167.12,-22.16]]]}},{"type":"Feature","properties":{},"bbox":[177.285,-18.288,178.7181,-17.3399],"geometry":{"type":"Polygon","coordinates":[[[178.3736,-17.3399],[178.7181,-17.6285],[178.5527,-18.1506],[177.9327,-18.288],[177.3815,-18.1643],[177.285,-17.7247],[177.6709,-17.3811],[178.1256,-17.5048],[178.3736,-17.3399]]]}},{"type":"Feature","properties":{},"bbox":[178.5968,-17.012,180,-16.0671],"geometry":{"type":"Polygon","coordinates":[[[179.3641,-16.8014],[178.7251,-17.012],[178.5968,-16.6392],[179.0966,-16.434],[179.4135,-16.3791],[180,-16.0671],[180,-16.5552],[179.3641,-16.8014]]]}},{"type":"Feature","properties":{},"bbox":[-180,-16.5552,-179.7933,-16.0209],"geometry":{"type":"Polygon","coordinates":[[[-179.9174,-16.5018],[-180,-16.5552],[-180,-16.0671],[-179.7933,-16.0209],[-179.9174,-16.5018]]]}},{"type":"Feature","properties":{},"bbox":[167.18,-16.5979,167.8449,-15.8918],"geometry":{"type":"Polygon","coordinates":[[[167.8449,-16.4663],[167.5152,-16.5979],[167.18,-16.16],[167.2168,-15.8918],[167.8449,-16.4663]]]}},{"type":"Feature","properties":{},"bbox":[166.6291,-15.74,167.27,-14.6265],"geometry":{"type":"Polygon","coordinates":[[[167.1077,-14.9339],[167.27,-15.74],[167.0012,-15.6146],[166.7932,-15.6688],[166.6499,-15.3927],[166.6291,-14.6265],[167.1077,-14.9339]]]}},{"type":"Feature","properties":{},"bbox":[43.2542,-25.6014,50.4765,-12.0406],"geometry":{"type":"Polygon","coordinates":[[[50.0565,-13.5558],[50.2174,-14.7588],[50.4765,-15.2265],[50.3771,-15.7061],[50.2003,-16.0003],[49.8606,-15.4143],[49.6726,-15.7102],[49.8633,-16.451],[49.7746,-16.875],[49.4986,-17.106],[49.4356,-17.9531],[49.0418,-19.1188],[48.5485,-20.4969],[47.9307,-22.3915],[47.5477,-23.782],[47.0958,-24.9416],[46.2825,-25.1785],[45.4095,-25.6014],[44.8336,-25.3461],[44.0397,-24.9883],[43.7638,-24.4607],[43.6978,-23.5741],[43.3457,-22.7769],[43.2542,-22.0574],[43.4333,-21.3365],[43.8937,-21.1633],[43.8964,-20.8305],[44.3743,-20.0724],[44.4644,-19.4355],[44.2324,-18.962],[44.043,-18.3314],[43.9631,-17.4099],[44.3125,-16.8505],[44.4465,-16.2162],[44.9449,-16.1794],[45.5027,-15.9744],[45.873,-15.7935],[46.3122,-15.78],[46.8822,-15.2102],[47.7051,-14.5943],[48.0052,-14.0912],[47.869,-13.6639],[48.2938,-13.7841],[48.8451,-13.0892],[48.8635,-12.4879],[49.1947,-12.0406],[49.5435,-12.4698],[49.809,-12.8953],[50.0565,-13.5558]]]}},{"type":"Feature","properties":{},"bbox":[113.339,-39.0358,153.5695,-10.6682],"geometry":{"type":"Polygon","coordinates":[[[143.5618,-13.7637],[143.9221,-14.5483],[144.5637,-14.1712],[144.8949,-14.5945],[145.3747,-14.985],[145.272,-15.4282],[145.4853,-16.2857],[145.637,-16.7849],[145.8889,-16.9069],[146.1603,-17.7617],[146.0637,-18.2801],[146.3875,-18.9583],[147.4711,-19.4807],[148.1776,-19.9559],[148.8484,-20.3912],[148.7175,-20.6335],[149.2894,-21.2605],[149.6783,-22.3425],[150.0774,-22.1228],[150.4829,-22.5561],[150.7273,-22.4024],[150.8996,-23.4622],[151.6092,-24.0763],[152.0735,-24.4579],[152.8552,-25.2675],[153.1362,-26.0712],[153.1619,-26.6413],[153.0929,-27.2603],[153.5695,-28.1101],[153.5121,-28.9951],[153.3391,-29.4582],[153.0692,-30.3502],[153.0896,-30.9236],[152.8916,-31.6404],[152.45,-32.55],[151.7091,-33.0413],[151.344,-33.816],[151.0106,-34.3104],[150.7141,-35.1735],[150.3282,-35.6719],[150.0752,-36.4202],[149.9461,-37.1091],[149.9973,-37.4253],[149.4239,-37.7727],[148.3046,-37.8091],[147.3817,-38.2192],[146.9221,-38.6065],[146.3179,-39.0358],[145.4897,-38.5938],[144.877,-38.4174],[145.0322,-37.8962],[144.4857,-38.0853],[143.61,-38.8095],[142.7454,-38.5383],[142.1783,-38.38],[141.6066,-38.3085],[140.6386,-38.0193],[139.9922,-37.4029],[139.8066,-36.6436],[139.5741,-36.1384],[139.0828,-35.7328],[138.1207,-35.6123],[138.4495,-35.1273],[138.2076,-34.3847],[137.7192,-35.0768],[136.8294,-35.2605],[137.3524,-34.7073],[137.5039,-34.1303],[137.8901,-33.6405],[137.8103,-32.9],[136.9968,-33.7528],[136.3721,-34.0948],[135.989,-34.8901],[135.2082,-34.4787],[135.2392,-33.948],[134.6134,-33.2228],[134.0859,-32.8481],[134.2739,-32.6172],[132.9908,-32.0112],[132.2881,-31.9826],[131.3263,-31.4958],[129.5358,-31.5904],[128.2409,-31.9485],[127.1029,-32.2823],[126.1487,-32.216],[125.0886,-32.7288],[124.2216,-32.9595],[124.0289,-33.4838],[123.6597,-33.8902],[122.811,-33.9145],[122.1831,-34.0034],[121.2992,-33.821],[120.5803,-33.9302],[119.8937,-33.9761],[119.2989,-34.5094],[119.0073,-34.4641],[118.5057,-34.7468],[118.025,-35.0647],[117.2955,-35.0255],[116.6251,-35.0251],[115.5643,-34.3864],[115.0268,-34.1965],[115.0486,-33.6234],[115.5451,-33.4873],[115.7147,-33.2596],[115.6794,-32.9004],[115.8016,-32.2051],[115.6896,-31.6124],[115.1609,-30.6016],[114.997,-30.0307],[115.04,-29.4611],[114.642,-28.8102],[114.6165,-28.5164],[114.1736,-28.1181],[114.0489,-27.3348],[113.4775,-26.5431],[113.339,-26.1165],[113.7784,-26.549],[113.441,-25.6213],[113.9369,-25.9112],[114.2329,-26.2984],[114.2162,-25.7863],[113.7213,-24.9989],[113.6253,-24.684],[113.3935,-24.3848],[113.502,-23.8063],[113.707,-23.5602],[113.8434,-23.06],[113.7366,-22.4755],[114.1498,-21.7559],[114.2253,-22.5175],[114.6478,-21.8295],[115.4602,-21.4952],[115.9474,-21.0687],[116.7116,-20.7017],[117.1663,-20.6236],[117.4415,-20.7469],[118.2296,-20.3742],[118.8361,-20.2633],[118.9878,-20.0442],[119.2525,-19.9529],[119.8052,-19.9765],[120.8562,-19.6837],[121.3999,-19.2398],[121.6551,-18.7053],[122.2417,-18.1976],[122.2866,-17.7986],[122.3128,-17.255],[123.0126,-16.4052],[123.4338,-17.2686],[123.8593,-17.069],[123.5032,-16.5965],[123.8171,-16.1113],[124.2583,-16.3279],[124.3797,-15.5671],[124.9262,-15.0751],[125.1673,-14.6804],[125.6701,-14.5101],[125.6858,-14.2307],[126.1251,-14.3473],[126.1428,-14.096],[126.5826,-13.9528],[127.0659,-13.818],[127.8046,-14.2769],[128.3597,-14.8692],[128.9855,-14.876],[129.6215,-14.9698],[129.4096,-14.4207],[129.8886,-13.6187],[130.3395,-13.3574],[130.1835,-13.1075],[130.6178,-12.5364],[131.2235,-12.1836],[131.7351,-12.3025],[132.5753,-12.114],[132.5572,-11.603],[131.8247,-11.2738],[132.3572,-11.1285],[133.0196,-11.3764],[133.5508,-11.7865],[134.3931,-12.0424],[134.6786,-11.9412],[135.2985,-12.2486],[135.8827,-11.9623],[136.2584,-12.0493],[136.4925,-11.8572],[136.9516,-12.352],[136.6851,-12.8872],[136.3054,-13.2912],[135.9618,-13.3245],[136.0776,-13.7243],[135.7838,-14.224],[135.4287,-14.7154],[135.5002,-14.9977],[136.2952,-15.5503],[137.0654,-15.8708],[137.5805,-16.2151],[138.3032,-16.8076],[138.5852,-16.8066],[139.1085,-17.0627],[139.2606,-17.3716],[140.2152,-17.7108],[140.8755,-17.3691],[141.0711,-16.832],[141.2741,-16.3889],[141.3982,-15.8405],[141.7022,-15.0449],[141.5634,-14.5613],[141.6355,-14.2704],[141.5199,-13.6981],[141.6509,-12.9447],[141.8427,-12.7415],[141.687,-12.4076],[141.9286,-11.8775],[142.1185,-11.328],[142.1437,-11.0427],[142.5153,-10.6682],[142.7973,-11.1574],[142.8668,-11.7847],[143.1159,-11.9056],[143.1586,-12.3257],[143.5221,-12.8344],[143.5972,-13.4004],[143.5618,-13.7637]]]}},{"type":"Feature","properties":{},"bbox":[161.3198,-10.8264,162.3986,-10.2048],"geometry":{"type":"Polygon","coordinates":[[[162.119,-10.4827],[162.3986,-10.8264],[161.7,-10.82],[161.3198,-10.2048],[161.9174,-10.4467],[162.119,-10.4827]]]}},{"type":"Feature","properties":{},"bbox":[118.9678,-10.2586,120.7755,-9.3613],"geometry":{"type":"Polygon","coordinates":[[[120.7156,-10.2396],[120.295,-10.2586],[118.9678,-9.558],[119.9003,-9.3613],[120.4258,-9.6659],[120.7755,-9.9697],[120.7156,-10.2396]]]}},{"type":"Feature","properties":{},"bbox":[159.64,-9.8952,160.8522,-9.243],"geometry":{"type":"Polygon","coordinates":[[[160.8522,-9.8729],[160.4626,-9.8952],[159.8494,-9.794],[159.64,-9.64],[159.7029,-9.243],[160.363,-9.4003],[160.6885,-9.6102],[160.8522,-9.8729]]]}},{"type":"Feature","properties":{},"bbox":[160.58,-9.7843,161.68,-8.32],"geometry":{"type":"Polygon","coordinates":[[[161.68,-9.6],[161.5294,-9.7843],[160.7883,-8.9175],[160.58,-8.32],[160.92,-8.32],[161.28,-9.12],[161.68,-9.6]]]}},{"type":"Feature","properties":{},"bbox":[123.46,-10.36,127.3359,-8.2733],"geometry":{"type":"Polygon","coordinates":[[[124.436,-10.14],[123.58,-10.36],[123.46,-10.24],[123.55,-9.9],[123.98,-9.29],[124.9687,-8.8928],[125.0862,-8.6569],[125.9471,-8.4321],[126.6447,-8.3982],[126.9572,-8.2733],[127.3359,-8.3973],[126.968,-8.6683],[125.9259,-9.106],[125.0885,-9.3932],[124.436,-10.14]]]}},{"type":"Feature","properties":{},"bbox":[116.7401,-9.0409,119.1265,-8.0957],"geometry":{"type":"Polygon","coordinates":[[[117.9,-8.0957],[118.2606,-8.3624],[118.8785,-8.2807],[119.1265,-8.7058],[117.9704,-8.9066],[117.2777,-9.0409],[116.7401,-9.0329],[117.0837,-8.4572],[117.632,-8.4493],[117.9,-8.0957]]]}},{"type":"Feature","properties":{},"bbox":[119.9209,-8.9337,122.9035,-8.0942],"geometry":{"type":"Polygon","coordinates":[[[122.9035,-8.0942],[122.757,-8.6498],[121.2545,-8.9337],[119.9244,-8.8104],[119.9209,-8.4449],[120.7151,-8.237],[121.3417,-8.5367],[122.0074,-8.4606],[122.9035,-8.0942]]]}},{"type":"Feature","properties":{},"bbox":[158.2112,-8.5383,159.9174,-7.32],"geometry":{"type":"Polygon","coordinates":[[[159.875,-8.3373],[159.9174,-8.5383],[159.1337,-8.1142],[158.5861,-7.7548],[158.2112,-7.4219],[158.36,-7.32],[158.82,-7.56],[159.64,-8.02],[159.875,-8.3373]]]}},{"type":"Feature","properties":{},"bbox":[156.4914,-7.4048,157.5384,-6.5993],"geometry":{"type":"Polygon","coordinates":[[[157.5384,-7.3478],[157.3394,-7.4048],[156.902,-7.1769],[156.4914,-6.7659],[156.5428,-6.5993],[157.14,-7.0216],[157.5384,-7.3478]]]}},{"type":"Feature","properties":{},"bbox":[105.3655,-8.7518,115.7055,-5.8959],"geometry":{"type":"Polygon","coordinates":[[[108.6235,-6.7777],[110.5392,-6.8774],[110.7596,-6.4652],[112.6148,-6.946],[112.9788,-7.5942],[114.4789,-7.7765],[115.7055,-8.3708],[114.5645,-8.7518],[113.4647,-8.3489],[112.5597,-8.3762],[111.5221,-8.3021],[110.5862,-8.1226],[109.4277,-7.7407],[108.6937,-7.6416],[108.2778,-7.7667],[106.4541,-7.3549],[106.2806,-6.9249],[105.3655,-6.8514],[106.0516,-5.8959],[107.265,-5.955],[108.0721,-6.3458],[108.4868,-6.422],[108.6235,-6.7777]]]}},{"type":"Feature","properties":{},"bbox":[134.1128,-6.8952,134.727,-5.445],"geometry":{"type":"Polygon","coordinates":[[[134.7246,-6.2144],[134.2101,-6.8952],[134.1128,-6.1425],[134.2903,-5.7831],[134.4996,-5.445],[134.727,-5.7376],[134.7246,-6.2144]]]}},{"type":"Feature","properties":{},"bbox":[154.5141,-6.92,156.02,-5.0424],"geometry":{"type":"Polygon","coordinates":[[[155.88,-6.82],[155.6,-6.92],[155.167,-6.5359],[154.7292,-5.9008],[154.5141,-5.1391],[154.6525,-5.0424],[154.76,-5.34],[155.0629,-5.5668],[155.5477,-6.2007],[156.02,-6.54],[155.88,-6.82]]]}},{"type":"Feature","properties":{},"bbox":[148.3189,-6.3178,152.3387,-4.1488],"geometry":{"type":"Polygon","coordinates":[[[151.9828,-5.4781],[151.4591,-5.5603],[151.3014,-5.8407],[150.7544,-6.0838],[150.2412,-6.3178],[149.71,-6.3165],[148.8901,-6.026],[148.3189,-5.7471],[148.4018,-5.4378],[149.2984,-5.5837],[149.8456,-5.5055],[149.9963,-5.0261],[150.1398,-5.0013],[150.2369,-5.5322],[150.8075,-5.4558],[151.0897,-5.1137],[151.6479,-4.7571],[151.5379,-4.1678],[152.1368,-4.1488],[152.3387,-4.313],[152.3187,-4.8677],[151.9828,-5.4781]]]}},{"type":"Feature","properties":{},"bbox":[125.989,-3.791,127.2492,-3.1293],"geometry":{"type":"Polygon","coordinates":[[[127.2492,-3.4591],[126.8749,-3.791],[126.1838,-3.6074],[125.989,-3.1773],[127.0007,-3.1293],[127.2492,-3.4591]]]}},{"type":"Feature","properties":{},"bbox":[127.8989,-3.8585,130.8348,-2.8022],"geometry":{"type":"Polygon","coordinates":[[[130.4713,-3.0938],[130.8348,-3.8585],[129.9905,-3.4463],[129.1552,-3.3626],[128.5907,-3.4287],[127.8989,-3.3934],[128.1359,-2.8436],[129.371,-2.8022],[130.4713,-3.0938]]]}},{"type":"Feature","properties":{},"bbox":[150.662,-4.7664,153.14,-2.5],"geometry":{"type":"Polygon","coordinates":[[[153.14,-4.5],[152.8273,-4.7664],[152.6387,-4.1761],[152.406,-3.7897],[151.9532,-3.4621],[151.3843,-3.0354],[150.662,-2.7415],[150.94,-2.5],[151.48,-2.78],[151.82,-3.0],[152.24,-3.24],[152.64,-3.66],[153.02,-3.98],[153.14,-4.5]]]}},{"type":"Feature","properties":{},"bbox":[130.5196,-10.6525,150.8016,-0.3695],"geometry":{"type":"Polygon","coordinates":[[[134.1434,-1.1519],[134.4226,-2.7692],[135.4576,-3.3678],[136.2933,-2.307],[137.4407,-1.7035],[138.3297,-1.7027],[139.1849,-2.0513],[139.9267,-2.4091],[141.0002,-2.6002],[142.7352,-3.2892],[144.584,-3.8614],[145.2732,-4.3737],[145.8298,-4.8765],[145.9819,-5.4656],[147.6481,-6.0837],[147.8911,-6.614],[146.9709,-6.7217],[147.1919,-7.388],[148.0846,-8.0441],[148.7341,-9.1047],[149.3068,-9.0714],[149.2666,-9.5144],[150.0387,-9.6843],[149.7388,-9.8729],[150.8016,-10.2937],[150.6906,-10.5827],[150.0284,-10.6525],[149.7823,-10.3933],[148.9231,-10.2809],[147.913,-10.1304],[147.1354,-9.4924],[146.5679,-8.9426],[146.0485,-8.0674],[144.7442,-7.6301],[143.8971,-7.9153],[143.2864,-8.2455],[143.4139,-8.9831],[142.6284,-9.3268],[142.0683,-9.1596],[141.0339,-9.1179],[140.1434,-8.2972],[139.1278,-8.096],[138.8815,-8.3809],[137.6145,-8.4117],[138.0391,-7.5979],[138.6686,-7.3202],[138.4079,-6.2328],[137.9278,-5.3934],[135.9892,-4.5465],[135.1646,-4.4629],[133.6629,-3.5389],[133.3677,-4.0248],[132.984,-4.113],[132.7569,-3.7463],[132.7538,-3.3118],[131.9898,-2.8206],[133.0668,-2.4604],[133.78,-2.4798],[133.6962,-2.2145],[132.2324,-2.2125],[131.8362,-1.6172],[130.9428,-1.4325],[130.5196,-0.9377],[131.8675,-0.6955],[132.3801,-0.3695],[133.9855,-0.7802],[134.1434,-1.1519]]]}},{"type":"Feature","properties":{},"bbox":[118.7678,-5.6734,125.2405,1.6433],"geometry":{"type":"Polygon","coordinates":[[[125.2405,1.4198],[124.437,0.4279],[123.6855,0.2356],[122.7231,0.4311],[121.0567,0.3812],[120.1831,0.2372],[120.0409,-0.5197],[120.9359,-1.4089],[121.4758,-0.956],[123.3406,-0.6157],[123.2584,-1.0762],[122.8227,-0.931],[122.3885,-1.5169],[121.5083,-1.9045],[122.4546,-3.1861],[122.2719,-3.5295],[123.171,-4.6837],[123.1623,-5.3406],[122.6285,-5.6346],[122.2364,-5.2829],[122.7196,-4.4642],[121.7382,-4.8513],[121.4895,-4.5746],[121.6192,-4.1885],[120.8982,-3.6021],[120.9724,-2.6276],[120.3055,-2.9316],[120.39,-4.0976],[120.4307,-5.5282],[119.7965,-5.6734],[119.3669,-5.3799],[119.6536,-4.4594],[119.4988,-3.4944],[119.0783,-3.487],[118.7678,-2.802],[119.181,-2.1471],[119.3234,-1.3531],[119.826,0.1543],[120.0357,0.5665],[120.8858,1.3092],[121.6668,1.0139],[122.9276,0.8752],[124.0775,0.9171],[125.066,1.6433],[125.2405,1.4198]]]}},{"type":"Feature","properties":{},"bbox":[127.3995,-0.9,128.6882,2.1746],"geometry":{"type":"Polygon","coordinates":[[[128.6882,1.1324],[128.636,0.2585],[128.1202,0.3564],[127.968,-0.2521],[128.38,-0.78],[128.1,-0.9],[127.6965,-0.2666],[127.3995,1.0117],[127.6005,1.8107],[127.9324,2.1746],[128.0042,1.6285],[128.5946,1.5408],[128.6882,1.1324]]]}},{"type":"Feature","properties":{},"bbox":[95.293,-5.8733,106.1086,5.4798],"geometry":{"type":"Polygon","coordinates":[[[105.8177,-5.8524],[104.7104,-5.8733],[103.8682,-5.0373],[102.5843,-4.2203],[102.1562,-3.6141],[101.3991,-2.7998],[100.9025,-2.0503],[100.142,-0.6503],[99.2637,0.1831],[98.97,1.0429],[98.6014,1.8235],[97.6996,2.4532],[97.1769,3.3088],[96.424,3.8689],[95.3809,4.9708],[95.293,5.4798],[95.9369,5.4395],[97.4849,5.2463],[98.3692,4.2684],[99.1426,3.5903],[99.694,3.1743],[100.6414,2.0994],[101.658,2.0837],[102.4983,1.3987],[103.0768,0.5614],[103.8384,0.1045],[103.4376,-0.7119],[104.0108,-1.0592],[104.37,-1.0848],[104.5395,-1.7824],[104.8879,-2.3404],[105.6221,-2.4288],[106.1086,-3.0618],[105.8574,-4.3055],[105.8177,-5.8524]]]}},{"type":"Feature","properties":{},"bbox":[108.9527,-4.107,119.1819,6.9281],"geometry":{"type":"Polygon","coordinates":[[[117.8756,1.8276],[118.9967,0.9022],[117.8119,0.7842],[117.4783,0.1025],[117.5216,-0.8037],[116.56,-1.4877],[116.5338,-2.4835],[116.1481,-4.0127],[116.0009,-3.657],[114.8648,-4.107],[114.4687,-3.4957],[113.7557,-3.4392],[113.257,-3.1188],[112.0681,-3.4784],[111.7033,-2.9944],[111.0482,-3.0494],[110.2238,-2.934],[110.0709,-1.5929],[109.5719,-1.3149],[109.0919,-0.4595],[108.9527,0.4154],[109.0691,1.3419],[109.6633,2.0065],[110.3961,1.6638],[111.1689,1.8506],[111.3701,2.6973],[111.7969,2.8859],[112.9956,3.1024],[113.7129,3.8935],[114.204,4.5259],[114.6,4.9],[115.4507,5.4477],[116.2207,6.1432],[116.7251,6.9248],[117.1296,6.9281],[117.6434,6.4222],[117.6891,5.9875],[118.3477,5.7087],[119.1819,5.4078],[119.1107,5.0161],[118.4397,4.9665],[118.6183,4.4782],[117.882,4.1376],[117.3132,3.2344],[118.0483,2.2877],[117.8756,1.8276]]]}},{"type":"Feature","properties":{},"bbox":[121.9199,5.581,126.5374,9.7603],"geometry":{"type":"Polygon","coordinates":[[[126.3768,8.4147],[126.4785,7.7504],[126.5374,7.1894],[126.1968,6.2743],[125.8314,7.2937],[125.3639,6.7865],[125.6832,6.0497],[125.3965,5.581],[124.2198,6.1614],[123.9387,6.8851],[124.2437,7.3606],[123.6102,7.8335],[123.2961,7.4189],[122.8255,7.4574],[122.0855,6.8994],[121.9199,7.1921],[122.3124,8.035],[122.9424,8.3162],[123.4877,8.693],[123.8412,8.2403],[124.6015,8.5142],[124.7646,8.9604],[125.4714,8.987],[125.4121,9.7603],[126.2227,9.2861],[126.3066,8.7825],[126.3768,8.4147]]]}},{"type":"Feature","properties":{},"bbox":[79.6952,5.9684,81.788,9.8241],"geometry":{"type":"Polygon","coordinates":[[[81.218,6.1971],[80.3484,5.9684],[79.8725,6.7635],[79.6952,8.2008],[80.1478,9.8241],[80.8388,9.2684],[81.3043,8.5642],[81.788,7.5231],[81.6373,6.4818],[81.218,6.1971]]]}},{"type":"Feature","properties":{},"bbox":[-61.95,10,-60.895,10.89],"geometry":{"type":"Polygon","coordinates":[[[-60.935,10.11],[-61.77,10],[-61.95,10.09],[-61.66,10.365],[-61.68,10.76],[-61.105,10.89],[-60.895,10.855],[-60.935,10.11]]]}},{"type":"Feature","properties":{},"bbox":[122.3801,9.0222,124.0779,11.2327],"geometry":{"type":"Polygon","coordinates":[[[123.9824,10.2788],[123.6232,9.9501],[123.3099,9.3183],[122.9959,9.0222],[122.3801,9.7134],[122.5861,9.981],[122.8371,10.2612],[122.9474,10.8819],[123.4989,10.9406],[123.3378,10.2674],[124.0779,11.2327],[123.9824,10.2788]]]}},{"type":"Feature","properties":{},"bbox":[117.1743,8.3675,119.6897,11.3697],"geometry":{"type":"Polygon","coordinates":[[[118.5046,9.3164],[117.1743,8.3675],[117.6645,9.0669],[118.3869,9.6845],[118.9873,10.3763],[119.5115,11.3697],[119.6897,10.5543],[119.0295,10.0037],[118.5046,9.3164]]]}},{"type":"Feature","properties":{},"bbox":[121.8835,10.441,123.1202,11.8918],"geometry":{"type":"Polygon","coordinates":[[[121.8835,11.8918],[122.4838,11.5822],[123.1202,11.5837],[123.1008,11.1659],[122.6377,10.7413],[122.0026,10.441],[121.9674,10.9057],[122.0384,11.4158],[121.8835,11.8918]]]}},{"type":"Feature","properties":{},"bbox":[124.2668,10.1347,125.7835,12.5578],"geometry":{"type":"Polygon","coordinates":[[[125.5026,12.1627],[125.7835,11.0461],[125.0119,11.3115],[125.0328,10.9758],[125.2774,10.3587],[124.8018,10.1347],[124.7602,10.838],[124.4591,10.8899],[124.3025,11.4954],[124.891,11.4156],[124.878,11.7942],[124.2668,12.5578],[125.2271,12.5357],[125.5026,12.1627]]]}},{"type":"Feature","properties":{},"bbox":[120.3234,12.2056,121.5274,13.4664],"geometry":{"type":"Polygon","coordinates":[[[121.5274,13.0696],[121.2622,12.2056],[120.8339,12.7045],[120.3234,13.4664],[121.1801,13.4297],[121.5274,13.0696]]]}},{"type":"Feature","properties":{},"bbox":[119.8838,12.5367,124.1813,18.5052],"geometry":{"type":"Polygon","coordinates":[[[121.3213,18.5041],[121.9376,18.2186],[122.246,18.479],[122.337,18.2249],[122.1743,17.8103],[122.5157,17.0935],[122.2523,16.2624],[121.6628,15.931],[121.5051,15.1248],[121.7288,14.3284],[122.2589,14.2182],[122.7013,14.3365],[123.9503,13.7821],[123.8551,13.2378],[124.1813,12.9975],[124.0774,12.5367],[123.298,13.0275],[122.9287,13.5529],[122.6714,13.1858],[122.0346,13.7845],[121.1264,13.6367],[120.6286,13.8577],[120.6794,14.271],[120.9918,14.5254],[120.6933,14.7567],[120.5641,14.3963],[120.0704,14.9709],[119.9209,15.4063],[119.8838,16.3637],[120.2865,16.0346],[120.39,17.5991],[120.7159,18.5052],[121.3213,18.5041]]]}},{"type":"Feature","properties":{},"bbox":[-67.2424,17.9466,-65.591,18.5206],"geometry":{"type":"Polygon","coordinates":[[[-65.591,18.228],[-65.8472,17.9759],[-66.5999,17.9818],[-67.1842,17.9466],[-67.2424,18.3745],[-67.1007,18.5206],[-66.2824,18.5148],[-65.7713,18.4267],[-65.591,18.228]]]}},{"type":"Feature","properties":{},"bbox":[-78.3377,17.7011,-76.1997,18.5242],"geometry":{"type":"Polygon","coordinates":[[[-76.9026,17.8682],[-77.2063,17.7011],[-77.766,17.8616],[-78.3377,18.226],[-78.2177,18.4545],[-77.7974,18.5242],[-77.5696,18.4905],[-76.8966,18.4009],[-76.3654,18.1607],[-76.1997,17.8869],[-76.9026,17.8682]]]}},{"type":"Feature","properties":{},"bbox":[-74.458,17.5986,-68.3179,19.9157],"geometry":{"type":"Polygon","coordinates":[[[-72.5797,19.8715],[-71.7124,19.7145],[-71.5873,19.8849],[-70.8067,19.8803],[-70.2144,19.6229],[-69.9508,19.648],[-69.7692,19.2933],[-69.2221,19.3132],[-69.2543,19.0152],[-68.8094,18.9791],[-68.3179,18.6122],[-68.6893,18.2051],[-69.1649,18.4226],[-69.624,18.3807],[-69.9529,18.4283],[-70.1332,18.2459],[-70.5171,18.1843],[-70.6693,18.4269],[-70.9999,18.2833],[-71.4002,17.5986],[-71.6577,17.7576],[-71.7083,18.045],[-72.3725,18.215],[-72.8444,18.1456],[-73.4546,18.2179],[-73.9224,18.031],[-74.458,18.3425],[-74.3699,18.6649],[-73.4495,18.5261],[-72.6949,18.4458],[-72.3349,18.6684],[-72.7917,19.1016],[-72.7841,19.4836],[-73.415,19.6396],[-73.1898,19.9157],[-72.5797,19.8715]]]}},{"type":"Feature","properties":{},"bbox":[108.6262,18.1977,111.0101,20.1013],"geometry":{"type":"Polygon","coordinates":[[[110.3392,18.6784],[109.4752,18.1977],[108.6552,18.5077],[108.6262,19.3679],[109.1191,19.821],[110.2116,20.1013],[110.7866,20.0775],[111.0101,19.6959],[110.5706,19.2559],[110.3392,18.6784]]]}},{"type":"Feature","properties":{},"bbox":[-156.0735,18.9162,-154.8074,20.2672],"geometry":{"type":"Polygon","coordinates":[[[-155.5421,19.0835],[-155.6882,18.9162],[-155.9366,19.0594],[-155.9081,19.3389],[-156.0735,19.7029],[-156.0237,19.8142],[-155.8501,19.9773],[-155.9191,20.174],[-155.8611,20.2672],[-155.7851,20.2487],[-155.4021,20.0798],[-155.2245,19.993],[-155.0623,19.8591],[-154.8074,19.5087],[-154.8315,19.4533],[-155.2222,19.2397],[-155.5421,19.0835]]]}},{"type":"Feature","properties":{},"bbox":[-156.7106,20.5724,-155.9957,21.0125],"geometry":{"type":"Polygon","coordinates":[[[-156.0793,20.644],[-156.4144,20.5724],[-156.5867,20.783],[-156.7017,20.8643],[-156.7106,20.9268],[-156.6126,21.0125],[-156.2571,20.9174],[-155.9957,20.764],[-156.0793,20.644]]]}},{"type":"Feature","properties":{},"bbox":[-157.3252,21.0687,-156.7582,21.2196],"geometry":{"type":"Polygon","coordinates":[[[-156.7582,21.1768],[-156.7893,21.0687],[-157.3252,21.0978],[-157.2503,21.2196],[-156.7582,21.1768]]]}},{"type":"Feature","properties":{},"bbox":[-158.2927,21.2644,-157.6528,21.717],"geometry":{"type":"Polygon","coordinates":[[[-157.6528,21.3222],[-157.707,21.2644],[-157.7786,21.2773],[-158.1267,21.3124],[-158.2538,21.5392],[-158.2927,21.5791],[-158.0252,21.717],[-157.9416,21.6527],[-157.6528,21.3222]]]}},{"type":"Feature","properties":{},"bbox":[-159.8005,21.883,-159.3451,22.2362],"geometry":{"type":"Polygon","coordinates":[[[-159.3451,21.982],[-159.4637,21.883],[-159.8005,22.0653],[-159.7488,22.1382],[-159.5962,22.2362],[-159.3657,22.2149],[-159.3451,21.982]]]}},{"type":"Feature","properties":{},"bbox":[-84.9749,19.8555,-74.178,23.1886],"geometry":{"type":"Polygon","coordinates":[[[-79.6795,22.7653],[-79.2815,22.3992],[-78.3474,22.5122],[-77.9933,22.2772],[-77.1464,21.6579],[-76.5238,21.2068],[-76.1946,21.2206],[-75.5982,21.0166],[-75.6711,20.7351],[-74.9339,20.6939],[-74.178,20.2846],[-74.2966,20.0504],[-74.9616,19.9234],[-75.6347,19.8738],[-76.3237,19.9529],[-77.7555,19.8555],[-77.0851,20.4134],[-77.4927,20.6731],[-78.1373,20.7399],[-78.4828,21.0286],[-78.7199,21.5981],[-79.285,21.5592],[-80.2175,21.8273],[-80.5175,22.0371],[-81.8209,22.1921],[-82.17,22.3871],[-81.795,22.637],[-82.7759,22.6882],[-83.4945,22.1685],[-83.9088,22.1546],[-84.0522,21.9106],[-84.547,21.8012],[-84.9749,21.896],[-84.4471,22.205],[-84.2304,22.5658],[-83.7782,22.7881],[-83.2675,22.983],[-82.5104,23.0787],[-82.2682,23.1886],[-81.4045,23.1173],[-80.6188,23.106],[-79.6795,22.7653]]]}},{"type":"Feature","properties":{},"bbox":[-78.4085,23.71,-77.5347,25.2103],"geometry":{"type":"Polygon","coordinates":[[[-77.5347,23.7598],[-77.78,23.71],[-78.034,24.2861],[-78.4085,24.5756],[-78.1909,25.2103],[-77.89,25.17],[-77.54,24.34],[-77.5347,23.7598]]]}},{"type":"Feature","properties":{},"bbox":[120.1062,21.9706,121.9512,25.2955],"geometry":{"type":"Polygon","coordinates":[[[121.1756,22.7909],[120.7471,21.9706],[120.2201,22.8149],[120.1062,23.5563],[120.6947,24.5385],[121.495,25.2955],[121.9512,24.9976],[121.7778,24.3943],[121.1756,22.7909]]]}},{"type":"Feature","properties":{},"bbox":[-78.98,26.42,-77.82,26.87],"geometry":{"type":"Polygon","coordinates":[[[-77.82,26.58],[-78.91,26.42],[-78.98,26.79],[-78.51,26.87],[-77.85,26.84],[-77.82,26.58]]]}},{"type":"Feature","properties":{},"bbox":[-77.79,25.8792,-77,27.04],"geometry":{"type":"Polygon","coordinates":[[[-77,26.59],[-77.1726,25.8792],[-77.3564,26.0073],[-77.34,26.53],[-77.788,26.9252],[-77.79,27.04],[-77,26.59]]]}},{"type":"Feature","properties":{},"bbox":[132.3631,32.7046,134.7664,34.3649],"geometry":{"type":"Polygon","coordinates":[[[134.6384,34.1492],[134.7664,33.8063],[134.2034,33.2012],[133.7929,33.522],[133.2803,33.2896],[133.0149,32.7046],[132.3631,32.9894],[132.3712,33.4636],[132.9244,34.0603],[133.493,33.9446],[133.9041,34.3649],[134.6384,34.1492]]]}},{"type":"Feature","properties":{},"bbox":[32.2567,34.5719,34.5765,35.6716],"geometry":{"type":"Polygon","coordinates":[[[34.5765,35.6716],[33.9008,35.2458],[33.9736,35.0585],[34.0049,34.9781],[32.9798,34.5719],[32.4903,34.7017],[32.2567,35.1032],[32.7318,35.14],[32.8025,35.1455],[32.947,35.3867],[33.6672,35.3732],[34.5765,35.6716]]]}},{"type":"Feature","properties":{},"bbox":[23.515,34.92,26.29,35.705],"geometry":{"type":"Polygon","coordinates":[[[23.7,35.705],[24.2467,35.368],[25.025,35.425],[25.7692,35.354],[25.745,35.18],[26.29,35.3],[26.165,35.005],[24.725,34.92],[24.735,35.085],[23.515,35.28],[23.7,35.705]]]}},{"type":"Feature","properties":{},"bbox":[12.431,36.62,15.5204,38.2312],"geometry":{"type":"Polygon","coordinates":[[[15.5204,38.2312],[15.1602,37.444],[15.3099,37.1342],[15.1,36.62],[14.3352,36.9966],[13.8267,37.1045],[12.431,37.6129],[12.5709,38.1264],[13.7412,38.035],[14.7612,38.1439],[15.5204,38.2312]]]}},{"type":"Feature","properties":{},"bbox":[8.16,38.9066,9.81,41.21],"geometry":{"type":"Polygon","coordinates":[[[9.21,41.21],[9.81,40.5],[9.6695,39.1774],[9.2148,39.2405],[8.8069,38.9066],[8.4283,39.1718],[8.3883,40.3783],[8.16,40.95],[8.71,40.9],[9.21,41.21]]]}},{"type":"Feature","properties":{},"bbox":[129.4085,31.0296,141.9143,41.3786],"geometry":{"type":"Polygon","coordinates":[[[140.9764,37.1421],[140.5998,36.344],[140.7741,35.8429],[140.2533,35.1381],[138.9755,34.6676],[137.2176,34.6063],[135.793,33.4648],[135.121,33.8491],[135.0794,34.5965],[133.3403,34.3759],[132.1568,33.9049],[130.9861,33.8858],[132.0,33.15],[131.3328,31.4504],[130.6863,31.0296],[130.2024,31.4182],[130.4477,32.3195],[129.8147,32.6103],[129.4085,33.2961],[130.3539,33.6042],[130.8785,34.2327],[131.8842,34.7497],[132.6177,35.4334],[134.6083,35.7316],[135.6775,35.5271],[136.7238,37.305],[137.3906,36.8274],[138.8576,37.8275],[139.4264,38.216],[140.0548,39.4388],[139.8834,40.5633],[140.3058,41.195],[141.369,41.3786],[141.9143,39.9916],[141.8846,39.1809],[140.9595,38.174],[140.9764,37.1421]]]}},{"type":"Feature","properties":{},"bbox":[8.5442,41.38,9.56,43.01],"geometry":{"type":"Polygon","coordinates":[[[9.56,42.1525],[9.2298,41.38],[8.7757,41.5836],[8.5442,42.2565],[8.746,42.6281],[9.39,43.01],[9.56,42.1525]]]}},{"type":"Feature","properties":{},"bbox":[139.8175,41.5696,145.5431,45.5515],"geometry":{"type":"Polygon","coordinates":[[[143.9102,44.1741],[144.6134,43.9609],[145.3208,44.3847],[145.5431,43.2621],[144.0597,42.9884],[143.1839,41.9952],[141.6115,42.6788],[141.0673,41.5846],[139.9551,41.5696],[139.8175,42.5638],[140.3121,43.3333],[141.3805,43.3888],[141.672,44.7721],[141.9676,45.5515],[143.1429,44.5104],[143.9102,44.1741]]]}},{"type":"Feature","properties":{},"bbox":[-64.3926,45.9682,-62.0121,47.036],"geometry":{"type":"Polygon","coordinates":[[[-63.6645,46.55],[-62.9393,46.4159],[-62.0121,46.4431],[-62.5039,46.0334],[-62.8743,45.9682],[-64.1428,46.3927],[-64.3926,46.7275],[-64.0149,47.036],[-63.6645,46.55]]]}},{"type":"Feature","properties":{},"bbox":[-64.5191,49.0872,-61.8063,49.9572],"geometry":{"type":"Polygon","coordinates":[[[-61.8063,49.1051],[-62.2932,49.0872],[-63.5893,49.4007],[-64.5191,49.873],[-64.1732,49.9572],[-62.8583,49.7064],[-61.8356,49.2886],[-61.8063,49.1051]]]}},{"type":"Feature","properties":{},"bbox":[-128.4446,48.3708,-123.51,50.7706],"geometry":{"type":"Polygon","coordinates":[[[-123.51,48.51],[-124.0129,48.3708],[-125.655,48.825],[-125.955,49.18],[-126.85,49.53],[-127.03,49.815],[-128.0593,49.995],[-128.4446,50.5391],[-128.3584,50.7706],[-127.3086,50.5526],[-126.695,50.4009],[-125.755,50.295],[-125.415,49.95],[-124.9208,49.4753],[-123.9225,49.0625],[-123.51,48.51]]]}},{"type":"Feature","properties":{},"bbox":[-59.4195,46.6183,-52.6481,51.6321],"geometry":{"type":"Polygon","coordinates":[[[-56.134,50.687],[-56.7959,49.8123],[-56.1431,50.1501],[-55.4715,49.9358],[-55.8224,49.5871],[-54.9351,49.313],[-54.4738,49.5567],[-53.4765,49.2491],[-53.786,48.5168],[-53.0861,48.6878],[-52.9586,48.1572],[-52.6481,47.5355],[-53.0692,46.6555],[-53.5215,46.6183],[-54.1789,46.8071],[-53.9619,47.6252],[-54.2405,47.7523],[-55.4008,46.885],[-55.9975,46.9197],[-55.2912,47.3896],[-56.2508,47.6325],[-57.3252,47.5728],[-59.266,47.6033],[-59.4195,47.8995],[-58.7966,48.2515],[-59.2316,48.5232],[-58.3918,49.1256],[-57.3587,50.7183],[-56.7386,51.2874],[-55.871,51.6321],[-55.407,51.5883],[-55.6002,51.3171],[-56.134,50.687]]]}},{"type":"Feature","properties":{},"bbox":[-133.2397,52.1804,-131.179,54.17],"geometry":{"type":"Polygon","coordinates":[[[-132.71,54.04],[-132.71,54.04],[-132.71,54.04],[-132.71,54.04],[-131.75,54.12],[-132.0495,52.9846],[-131.179,52.1804],[-131.5778,52.1824],[-132.1804,52.6397],[-132.55,53.1],[-133.0546,53.4115],[-133.2397,53.8511],[-133.18,54.17],[-132.71,54.04]]]}},{"type":"Feature","properties":{},"bbox":[141.5941,45.9668,144.6541,54.3659],"geometry":{"type":"Polygon","coordinates":[[[143.648,50.7476],[144.6541,48.9764],[143.1739,49.3066],[142.5587,47.8616],[143.5335,46.8367],[143.5053,46.1379],[142.7477,46.7408],[142.092,45.9668],[141.9069,46.8059],[142.0184,47.7801],[141.9044,48.8592],[142.1358,49.6152],[142.18,50.9523],[141.5941,51.9354],[141.6825,53.302],[142.6069,53.7621],[142.2097,54.2255],[142.6548,54.3659],[142.9146,53.7046],[143.2608,52.7408],[143.2353,51.7567],[143.648,50.7476]]]}},{"type":"Feature","properties":{},"bbox":[-9.9771,51.6693,-5.6619,55.1729],"geometry":{"type":"Polygon","coordinates":[[[-6.7889,52.2601],[-8.5616,51.6693],[-9.9771,51.8205],[-9.1663,52.8646],[-9.6885,53.8814],[-8.328,54.6645],[-7.5722,55.1316],[-6.7338,55.1729],[-5.6619,54.5546],[-6.1979,53.8676],[-6.033,53.1532],[-6.7889,52.2601]]]}},{"type":"Feature","properties":{},"bbox":[10.9039,54.8,12.69,56.1114],"geometry":{"type":"Polygon","coordinates":[[[12.69,55.61],[12.09,54.8],[11.0435,55.3649],[10.9039,55.78],[12.3709,56.1114],[12.69,55.61]]]}},{"type":"Feature","properties":{},"bbox":[-154.671,56.7347,-152.1411,57.969],"geometry":{"type":"Polygon","coordinates":[[[-153.0063,57.1158],[-154.0051,56.7347],[-154.5164,56.9927],[-154.671,57.4612],[-153.7628,57.8166],[-153.2287,57.969],[-152.5648,57.9014],[-152.1411,57.5911],[-153.0063,57.1158]]]}},{"type":"Feature","properties":{},"bbox":[-6.15,49.96,1.6815,58.635],"geometry":{"type":"Polygon","coordinates":[[[-3.005,58.635],[-4.0738,57.553],[-3.055,57.69],[-1.9593,57.6848],[-2.22,56.87],[-3.119,55.9738],[-2.085,55.91],[-1.115,54.625],[-0.4305,54.4644],[0.185,53.325],[0.47,52.93],[1.6815,52.7395],[1.56,52.1],[1.0506,51.8068],[1.4499,51.2894],[0.5503,50.7657],[-0.7875,50.775],[-2.49,50.5],[-2.9563,50.6969],[-3.6174,50.2284],[-4.5425,50.3418],[-5.245,49.96],[-5.7766,50.1597],[-4.31,51.21],[-3.4149,51.426],[-4.9844,51.5935],[-5.2673,51.9914],[-4.2223,52.3014],[-4.77,52.84],[-4.58,53.495],[-3.0921,53.4044],[-2.945,53.985],[-3.63,54.615],[-4.8442,54.791],[-5.0825,55.0616],[-4.7191,55.5085],[-5.048,55.784],[-5.5864,55.3111],[-5.645,56.275],[-6.15,56.785],[-5.7868,57.8188],[-5.01,58.63],[-4.2115,58.5508],[-3.005,58.635]]]}},{"type":"Feature","properties":{},"bbox":[-167.4553,59.7544,-165.5792,60.3842],"geometry":{"type":"Polygon","coordinates":[[[-165.5792,59.91],[-166.1928,59.7544],[-166.8483,59.9414],[-167.4553,60.2131],[-166.4678,60.3842],[-165.6744,60.2936],[-165.5792,59.91]]]}},{"type":"Feature","properties":{},"bbox":[-80.3621,61.6331,-79.2658,62.3856],"geometry":{"type":"Polygon","coordinates":[[[-79.2658,62.1587],[-79.6575,61.6331],[-80.0996,61.7181],[-80.3621,62.0165],[-80.3154,62.0856],[-79.9294,62.3856],[-79.52,62.3637],[-79.2658,62.1587]]]}},{"type":"Feature","properties":{},"bbox":[-83.9937,62.1592,-81.877,62.9141],"geometry":{"type":"Polygon","coordinates":[[[-81.8983,62.7108],[-83.0686,62.1592],[-83.7746,62.1823],[-83.9937,62.4528],[-83.2505,62.9141],[-81.877,62.9046],[-81.8983,62.7108]]]}},{"type":"Feature","properties":{},"bbox":[-171.7911,62.9769,-168.6894,63.7825],"geometry":{"type":"Polygon","coordinates":[[[-171.7317,63.7825],[-171.1144,63.5922],[-170.4911,63.695],[-169.6825,63.4311],[-168.6894,63.2975],[-168.7719,63.1886],[-169.5294,62.9769],[-170.2906,63.1944],[-170.6714,63.3758],[-171.5531,63.3178],[-171.7911,63.4058],[-171.7317,63.7825]]]}},{"type":"Feature","properties":{},"bbox":[-87.222,63.0524,-80.1035,65.7388],"geometry":{"type":"Polygon","coordinates":[[[-85.1613,65.6573],[-84.9758,65.2175],[-84.464,65.3718],[-83.8826,65.1096],[-82.7876,64.7667],[-81.642,64.4551],[-81.5534,63.9796],[-80.8174,64.0575],[-80.1035,63.726],[-80.991,63.4112],[-82.5472,63.6517],[-83.1088,64.1019],[-84.1004,63.5697],[-85.5234,63.0524],[-85.8668,63.6373],[-87.222,63.5412],[-86.3528,64.0358],[-86.2249,64.8229],[-85.8838,65.7388],[-85.1613,65.6573]]]}},{"type":"Feature","properties":{},"bbox":[-24.3262,63.4964,-13.6097,66.5268],"geometry":{"type":"Polygon","coordinates":[[[-14.5087,66.4559],[-14.7396,65.8087],[-13.6097,65.1267],[-14.9098,64.3641],[-17.7944,63.6787],[-18.6562,63.4964],[-19.9728,63.6436],[-22.763,63.9602],[-21.7785,64.4021],[-23.955,64.8911],[-22.1844,65.085],[-22.2274,65.3786],[-24.3262,65.6112],[-23.6505,66.2625],[-22.1349,66.4105],[-20.5763,65.7321],[-19.0568,66.2766],[-17.7986,65.9939],[-16.1678,66.5268],[-14.5087,66.4559]]]}},{"type":"Feature","properties":{},"bbox":[-77.2364,67.0987,-75.1033,68.2872],"geometry":{"type":"Polygon","coordinates":[[[-75.8659,67.1489],[-76.9869,67.0987],[-77.2364,67.5881],[-76.8117,68.1486],[-75.8952,68.2872],[-75.1145,68.0104],[-75.1033,67.582],[-75.216,67.4442],[-75.8659,67.1489]]]}},{"type":"Feature","properties":{},"bbox":[-180,64.2527,-169.8996,68.9636],"geometry":{"type":"Polygon","coordinates":[[[-175.0143,66.5844],[-174.3398,66.3356],[-174.5718,67.0622],[-171.8573,66.9131],[-169.8996,65.9772],[-170.8911,65.5414],[-172.5302,65.4379],[-172.555,64.4608],[-172.9553,64.2527],[-173.8918,64.2826],[-174.6539,64.6312],[-175.9835,64.9229],[-176.2072,65.3567],[-177.2227,65.5202],[-178.3599,65.3905],[-178.9033,65.7404],[-178.6861,66.1121],[-179.8838,65.8746],[-179.4327,65.4041],[-180,64.9797],[-180,68.9636],[-177.55,68.2],[-174.9282,67.2059],[-175.0143,66.5844]]]}},{"type":"Feature","properties":{},"bbox":[-99.7974,68.757,-95.6477,70.1435],"geometry":{"type":"Polygon","coordinates":[[[-95.6477,69.1077],[-96.2695,68.757],[-97.6174,69.06],[-98.4318,68.9507],[-99.7974,69.4],[-98.9174,69.71],[-98.2183,70.1435],[-97.1574,69.86],[-96.5574,69.68],[-96.2574,69.49],[-95.6477,69.1077]]]}},{"type":"Feature","properties":{},"bbox":[178.7253,70.7811,180,71.5157],"geometry":{"type":"Polygon","coordinates":[[[180,70.8322],[178.9034,70.7811],[178.7253,71.0988],[180,71.5157],[180,70.8322]]]}},{"type":"Feature","properties":{},"bbox":[-180,70.8322,-177.5779,71.5576],"geometry":{"type":"Polygon","coordinates":[[[-178.6938,70.893],[-180,70.8322],[-180,71.5157],[-179.8719,71.5576],[-179.0243,71.5555],[-177.5779,71.2695],[-177.6636,71.1328],[-178.6938,70.893]]]}},{"type":"Feature","properties":{},"bbox":[-168.1105,-53.8564,-34.73,71.9205],"geometry":{"type":"Polygon","coordinates":[[[-90.5471,69.4977],[-90.5515,68.4751],[-89.2151,69.2587],[-88.0196,68.6151],[-88.3175,67.8735],[-87.3501,67.1987],[-86.3061,67.9215],[-85.5766,68.7845],[-85.5219,69.8821],[-84.1008,69.8055],[-82.6225,69.6583],[-81.2804,69.1621],[-81.2202,68.6657],[-81.9643,68.1325],[-81.2593,67.5973],[-81.3865,67.1109],[-83.3445,66.4117],[-84.7354,66.2573],[-85.7694,66.5583],[-86.0676,66.0563],[-87.0314,65.2131],[-87.3232,64.7757],[-88.4829,64.0991],[-89.9144,64.0327],[-90.704,63.6103],[-90.77,62.9603],[-91.9334,62.8351],[-93.157,62.0247],[-94.2415,60.8987],[-94.6293,60.1103],[-94.6845,58.9489],[-93.215,58.7821],[-92.7646,57.8457],[-92.297,57.0871],[-90.8977,57.2847],[-89.0395,56.8517],[-88.0398,56.4717],[-87.3242,55.9991],[-86.0712,55.7239],[-85.0118,55.3027],[-83.3605,55.2449],[-82.2728,55.1483],[-82.4362,54.2823],[-82.125,53.2771],[-81.4007,52.1579],[-79.9129,51.2085],[-79.143,51.5339],[-78.6019,52.5621],[-79.1242,54.1415],[-79.8296,54.6677],[-78.2287,55.1365],[-77.0956,55.8375],[-76.5414,56.5343],[-76.6231,57.2027],[-77.3022,58.0521],[-78.5169,58.8047],[-77.3367,59.8527],[-77.7727,60.7579],[-78.1068,62.3197],[-77.4106,62.5505],[-75.6962,62.2785],[-74.6682,62.1811],[-73.8399,62.4439],[-72.9085,62.1051],[-71.677,61.5253],[-71.3737,61.1371],[-69.5904,61.0615],[-69.6203,60.2213],[-69.2879,58.9573],[-68.3745,58.8011],[-67.6498,58.2121],[-66.2018,58.7673],[-65.2452,59.8707],[-64.5835,60.3357],[-63.8047,59.4427],[-62.5024,58.1671],[-61.3965,56.9675],[-61.7986,56.3395],[-60.4685,55.7755],[-59.5696,55.2041],[-57.9751,54.9455],[-57.3332,54.6265],[-56.9369,53.7803],[-56.1581,53.6475],[-55.7563,53.2705],[-55.6833,52.1467],[-56.4092,51.7707],[-57.1269,51.4197],[-58.7748,51.0643],[-60.0331,50.2429],[-61.7236,50.0805],[-63.8625,50.2911],[-65.3633,50.2983],[-66.399,50.2289],[-67.2363,49.5115],[-68.5111,49.0685],[-69.9536,47.7449],[-71.1045,46.8217],[-70.2552,46.9861],[-68.65,48.3001],[-66.5524,49.1331],[-65.0562,49.2329],[-64.171,48.7425],[-65.1155,48.0709],[-64.7985,46.9931],[-64.4721,46.2385],[-63.1733,45.7391],[-61.5207,45.8839],[-60.5181,47.0079],[-60.4486,46.2827],[-59.8028,45.9205],[-61.0398,45.2653],[-63.2547,44.6703],[-64.2466,44.2655],[-65.3641,43.5453],[-66.1234,43.6187],[-66.1617,44.4651],[-64.4255,45.2921],[-66.026,45.2593],[-67.1374,45.1375],[-66.9646,44.8097],[-68.0325,44.3253],[-69.06,43.9801],[-70.1161,43.6841],[-70.69,43.0301],[-70.8149,42.8653],[-70.825,42.3351],[-70.495,41.8051],[-70.08,41.7801],[-70.185,42.1451],[-69.8849,41.9229],[-69.965,41.6371],[-70.64,41.4751],[-71.1203,41.4945],[-71.86,41.3201],[-72.295,41.2701],[-72.8764,41.2207],[-73.71,40.9311],[-72.2412,41.1195],[-71.945,40.9301],[-73.3449,40.6301],[-73.982,40.6281],[-73.9523,40.7507],[-74.2567,40.4735],[-73.9624,40.4277],[-74.1784,39.7093],[-74.906,38.9395],[-74.9804,39.1965],[-75.2,39.2485],[-75.5281,39.4985],[-75.32,38.9601],[-75.0835,38.7813],[-75.0567,38.4041],[-75.3774,38.0155],[-75.9402,37.2169],[-76.0312,37.2567],[-75.722,37.9371],[-76.2328,38.3193],[-76.35,39.1501],[-76.5427,38.7177],[-76.3293,38.0833],[-76.96,38.2329],[-76.3016,37.9181],[-76.2587,36.9665],[-75.9718,36.8973],[-75.868,36.5513],[-75.7275,35.5507],[-76.3631,34.8085],[-77.3976,34.5121],[-78.0549,33.9255],[-78.5543,33.8613],[-79.0606,33.4941],[-79.2035,33.1585],[-80.3013,32.5093],[-80.865,32.0333],[-81.3363,31.4405],[-81.4904,30.7301],[-81.3137,30.0355],[-80.98,29.1801],[-80.5356,28.4721],[-80.53,28.0401],[-80.0565,26.8801],[-80.088,26.2057],[-80.1315,25.8169],[-80.381,25.2063],[-80.68,25.0801],[-81.1721,25.2013],[-81.33,25.6401],[-81.71,25.8701],[-82.24,26.7301],[-82.7051,27.4951],[-82.8553,27.8863],[-82.65,28.5501],[-82.93,29.1001],[-83.7096,29.9367],[-84.1,30.0901],[-85.1088,29.6363],[-85.2878,29.6861],[-85.773,30.1527],[-86.4,30.4001],[-87.5303,30.2745],[-88.4178,30.3849],[-89.1805,30.3161],[-89.6049,30.1763],[-89.4137,29.8943],[-89.43,29.4887],[-89.2176,29.2911],[-89.4082,29.1597],[-89.7793,29.3071],[-90.1546,29.1175],[-90.8802,29.1487],[-91.6267,29.6771],[-92.4991,29.5523],[-93.2264,29.7839],[-93.8484,29.7137],[-94.69,29.4801],[-95.6003,28.7387],[-96.594,28.3075],[-97.14,27.8301],[-97.37,27.3801],[-97.38,26.6901],[-97.33,26.2101],[-97.1402,25.8695],[-97.1386,25.8679],[-97.1418,25.8659],[-97.5281,24.9921],[-97.7029,24.2723],[-97.776,22.9327],[-97.8724,22.4443],[-97.699,21.8987],[-97.389,21.4111],[-97.1893,20.6355],[-96.5255,19.8909],[-96.2921,19.3205],[-95.9009,18.8281],[-94.839,18.5627],[-94.4257,18.1443],[-93.5486,18.4239],[-92.7861,18.5249],[-92.0373,18.7047],[-91.4079,18.8761],[-90.7718,19.2841],[-90.5335,19.8675],[-90.4515,20.7075],[-90.2786,20.9999],[-89.6013,21.2617],[-88.5439,21.4937],[-87.6584,21.4589],[-87.0519,21.5435],[-86.812,21.3315],[-86.8459,20.8499],[-87.3833,20.2555],[-87.621,19.6465],[-87.4367,19.4725],[-87.5865,19.0401],[-87.8372,18.2599],[-88.0906,18.5167],[-88.3,18.5001],[-88.2963,18.3533],[-88.1068,18.3487],[-88.1234,18.0767],[-88.2853,17.6443],[-88.1979,17.4895],[-88.3026,17.1317],[-88.2395,17.0361],[-88.3554,16.5309],[-88.5518,16.2655],[-88.7324,16.2337],[-88.9306,15.8873],[-88.6046,15.7065],[-88.5183,15.8555],[-88.225,15.7277],[-88.1211,15.6887],[-87.9018,15.8645],[-87.6156,15.8789],[-87.5229,15.7973],[-87.3677,15.8469],[-86.9032,15.7567],[-86.4409,15.7829],[-86.1192,15.8935],[-86.0019,16.0055],[-85.6833,15.9537],[-85.444,15.8857],[-85.1824,15.9093],[-84.9837,15.9959],[-84.527,15.8573],[-84.3682,15.8351],[-84.063,15.6483],[-83.774,15.4241],[-83.4104,15.2709],[-83.1472,14.9959],[-83.2332,14.8999],[-83.2842,14.6767],[-83.1821,14.3107],[-83.4125,13.9701],[-83.5198,13.5677],[-83.5522,13.1271],[-83.4985,12.8693],[-83.4733,12.4191],[-83.6261,12.3209],[-83.7196,11.8931],[-83.6509,11.6291],[-83.8554,11.3733],[-83.8089,11.1031],[-83.6556,10.9389],[-83.4023,10.3955],[-83.0157,9.9931],[-82.5462,9.5663],[-82.1871,9.2075],[-82.2076,8.9957],[-81.8086,8.9507],[-81.7141,9.0321],[-81.4392,8.7863],[-80.9473,8.8585],[-80.5219,9.1111],[-79.9146,9.3127],[-79.5733,9.6117],[-79.0212,9.5529],[-79.0584,9.4547],[-78.5009,9.4205],[-78.0559,9.2477],[-77.7295,8.9469],[-77.3533,8.6705],[-76.8366,8.6387],[-76.0863,9.3369],[-75.6746,9.4433],[-75.6647,9.7741],[-75.4804,10.6191],[-74.9069,11.0831],[-74.2767,11.1021],[-74.1972,11.3105],[-73.4147,11.2271],[-72.6278,11.7321],[-72.2382,11.9557],[-71.7541,12.4373],[-71.3998,12.3761],[-71.1374,12.1131],[-71.3316,11.7763],[-71.36,11.5401],[-71.947,11.4233],[-71.6208,10.9695],[-71.633,10.4465],[-72.0741,9.8657],[-71.6956,9.0723],[-71.2646,9.1373],[-71.04,9.8601],[-71.3501,10.2119],[-71.4006,10.9691],[-70.1552,11.3755],[-70.2938,11.8469],[-69.9432,12.1623],[-69.5843,11.4597],[-68.883,11.4435],[-68.2333,10.8857],[-68.1941,10.5547],[-67.2962,10.5459],[-66.2278,10.6487],[-65.6552,10.2009],[-64.8904,10.0773],[-64.3294,10.3897],[-64.318,10.6415],[-63.0793,10.7017],[-61.8809,10.7157],[-62.7301,10.4203],[-62.3885,9.9483],[-61.5887,9.8731],[-60.8305,9.3813],[-60.6712,8.5803],[-60.1501,8.6029],[-59.7583,8.3671],[-59.1017,7.9993],[-58.4829,7.3477],[-58.4549,6.8329],[-58.0781,6.8091],[-57.5422,6.3213],[-57.1474,5.9731],[-55.9493,5.7729],[-55.8418,5.9531],[-55.0332,6.0253],[-53.958,5.7565],[-53.6184,5.6465],[-52.8821,5.4099],[-51.8233,4.5659],[-51.6578,4.1563],[-51.3171,4.2035],[-51.0697,3.6505],[-50.5088,1.9015],[-49.974,1.7365],[-49.9471,1.0463],[-50.6993,0.2231],[-50.3882,-0.0784],[-48.6205,-0.2354],[-48.5844,-1.2378],[-47.8249,-0.5816],[-46.5666,-0.941],[-44.9057,-1.5517],[-44.4176,-2.1377],[-44.5816,-2.6913],[-43.4187,-2.3831],[-41.4726,-2.912],[-39.9786,-2.873],[-38.5003,-3.7006],[-37.2232,-4.8209],[-36.4529,-5.1094],[-35.5978,-5.1495],[-35.2354,-5.4649],[-34.896,-6.7382],[-34.73,-7.3432],[-35.1282,-8.9964],[-35.6369,-9.6493],[-37.0465,-11.0407],[-37.6836,-12.1712],[-38.4239,-13.0381],[-38.6739,-13.0577],[-38.9532,-13.7934],[-38.8823,-15.667],[-39.161,-17.2084],[-39.2673,-17.8677],[-39.5835,-18.2622],[-39.7608,-19.5991],[-40.7747,-20.9045],[-40.9447,-21.9373],[-41.7541,-22.3706],[-41.9883,-22.9701],[-43.0747,-22.9677],[-44.6478,-23.352],[-45.3521,-23.7968],[-46.4721,-24.089],[-47.649,-24.8852],[-48.4955,-25.877],[-48.641,-26.6237],[-48.4747,-27.1759],[-48.6615,-28.1861],[-48.8884,-28.6741],[-49.5873,-29.2245],[-50.6969,-30.9844],[-51.5762,-31.7777],[-52.2561,-32.2453],[-52.7121,-33.1966],[-53.3736,-33.7683],[-53.8064,-34.3968],[-54.9358,-34.9526],[-55.674,-34.7527],[-56.2152,-34.8598],[-57.1397,-34.4305],[-57.8178,-34.4625],[-58.427,-33.9095],[-58.4954,-34.4315],[-57.2258,-35.288],[-57.3623,-35.9774],[-56.7375,-36.4131],[-56.7882,-36.9015],[-57.7491,-38.1839],[-59.2318,-38.7202],[-61.2374,-38.9284],[-62.3359,-38.8277],[-62.1258,-39.4241],[-62.3305,-40.1726],[-62.146,-40.6769],[-62.7458,-41.0287],[-63.7705,-41.1668],[-64.7321,-40.8026],[-65.118,-41.0643],[-64.9786,-42.058],[-64.3034,-42.359],[-63.7559,-42.0437],[-63.458,-42.5631],[-64.3788,-42.8735],[-65.1818,-43.4953],[-65.3288,-44.5013],[-65.5652,-45.0368],[-66.5099,-45.0396],[-67.2938,-45.5519],[-67.5805,-46.3017],[-66.597,-47.0339],[-65.641,-47.2361],[-65.9851,-48.1333],[-67.1662,-48.6973],[-67.8161,-49.8697],[-68.7287,-50.2642],[-69.1385,-50.7325],[-68.8155,-51.7711],[-68.15,-52.35],[-68.5715,-52.2994],[-69.4613,-52.2919],[-69.9427,-52.5379],[-70.8451,-52.8992],[-71.0063,-53.8332],[-71.4298,-53.8564],[-72.5579,-53.5314],[-73.7027,-52.8351],[-74.9468,-52.2627],[-75.26,-51.6293],[-74.9766,-51.0434],[-75.4797,-50.3783],[-75.608,-48.6737],[-75.1827,-47.7119],[-74.1266,-46.9392],[-75.6444,-46.6476],[-74.6921,-45.764],[-74.3517,-44.103],[-73.2403,-44.4549],[-72.7177,-42.3833],[-73.3889,-42.1175],[-73.7013,-43.3658],[-74.3319,-43.225],[-74.0179,-41.7948],[-73.6771,-39.9422],[-73.2176,-39.2586],[-73.5055,-38.2829],[-73.588,-37.1563],[-73.1667,-37.1238],[-72.5531,-35.5088],[-71.8617,-33.9091],[-71.4385,-32.4189],[-71.6687,-30.9206],[-71.37,-30.0957],[-71.4898,-28.8614],[-70.9051,-27.6404],[-70.725,-25.7059],[-70.404,-23.6289],[-70.0912,-21.3933],[-70.1644,-19.7564],[-70.3725,-18.3479],[-71.3752,-17.7738],[-71.462,-17.3634],[-73.4445,-16.3594],[-75.2378,-15.2657],[-76.0092,-14.6493],[-76.4234,-13.8232],[-76.2592,-13.535],[-77.1062,-12.2227],[-78.0921,-10.3777],[-79.0369,-8.3866],[-79.4459,-7.9308],[-79.7605,-7.1943],[-80.5375,-6.5417],[-81.25,-6.1368],[-80.9263,-5.6905],[-81.4109,-4.7367],[-81.0996,-4.0364],[-80.3025,-3.4048],[-79.7702,-2.6575],[-79.9865,-2.2207],[-80.3687,-2.6852],[-80.9677,-2.2469],[-80.7648,-1.965],[-80.9336,-1.0574],[-80.5833,-0.9067],[-80.3993,-0.2837],[-80.0208,0.3605],[-80.0906,0.7685],[-79.5428,0.9829],[-78.8553,1.3809],[-78.9909,1.6913],[-78.6178,1.7665],[-78.6621,2.2673],[-78.4276,2.6297],[-77.9315,2.6967],[-77.5104,3.3251],[-77.1277,3.8497],[-77.4963,4.0877],[-77.3076,4.6681],[-77.5332,5.5829],[-77.3188,5.8453],[-77.4767,6.6911],[-77.8816,7.2239],[-78.2149,7.5123],[-78.4291,8.0521],[-78.182,8.3193],[-78.4355,8.3877],[-78.6221,8.7181],[-79.1203,8.9961],[-79.5578,8.9325],[-79.7605,8.5845],[-80.1645,8.3333],[-80.3826,8.2985],[-80.4807,8.0903],[-80.0036,7.5475],[-80.2766,7.4197],[-80.4211,7.2715],[-80.8864,7.2205],[-81.0595,7.8179],[-81.1897,7.6479],[-81.5195,7.7067],[-81.7213,8.1089],[-82.1314,8.1755],[-82.3909,8.2925],[-82.82,8.2909],[-82.8509,8.0739],[-82.9657,8.2251],[-83.5084,8.4469],[-83.7115,8.6569],[-83.5963,8.8305],[-83.6326,9.0515],[-83.9099,9.2909],[-84.3034,9.4875],[-84.6476,9.6155],[-84.7134,9.9081],[-84.9756,10.0867],[-84.9114,9.7961],[-85.1109,9.5571],[-85.3395,9.8345],[-85.6607,9.9333],[-85.7974,10.1349],[-85.7917,10.4393],[-85.6593,10.7543],[-85.9417,10.8953],[-85.7125,11.0885],[-86.0584,11.4035],[-86.5259,11.8069],[-86.7459,12.1441],[-87.1675,12.4583],[-87.6685,12.9099],[-87.5575,13.0647],[-87.3924,12.9141],[-87.3166,12.9847],[-87.4894,13.2975],[-87.7931,13.3845],[-87.9041,13.1491],[-88.4833,13.1639],[-88.8432,13.2597],[-89.2567,13.4587],[-89.8124,13.5207],[-90.0956,13.7355],[-90.6086,13.9099],[-91.2324,13.9279],[-91.6897,14.1263],[-92.2277,14.5389],[-93.3594,15.6155],[-93.8752,15.9403],[-94.6916,16.2011],[-95.2502,16.1283],[-96.0534,15.7521],[-96.5574,15.6535],[-97.2636,15.9171],[-98.013,16.1073],[-98.9477,16.5661],[-99.6974,16.7063],[-100.8295,17.1711],[-101.6661,17.6491],[-101.9185,17.9161],[-102.4781,17.9759],[-103.501,18.2923],[-103.9175,18.7487],[-104.992,19.3163],[-105.493,19.9469],[-105.7314,20.4341],[-105.3977,20.5317],[-105.5006,20.8169],[-105.2707,21.0763],[-105.2658,21.4221],[-105.6031,21.8713],[-105.6934,22.2691],[-106.0287,22.7737],[-106.9099,23.7679],[-107.9154,24.5489],[-108.4019,25.1723],[-109.2602,25.5807],[-109.4441,25.8249],[-109.2916,26.4429],[-109.8014,26.6761],[-110.3917,27.1621],[-110.641,27.8599],[-111.1789,27.9413],[-111.7596,28.4681],[-112.2282,28.9545],[-112.2718,29.2669],[-112.8095,30.0211],[-113.1638,30.7869],[-113.1487,31.1711],[-113.8719,31.5677],[-114.2057,31.5241],[-114.7764,31.7997],[-114.9367,31.3935],[-114.7712,30.9137],[-114.6739,30.1627],[-114.331,29.7505],[-113.5888,29.0617],[-113.424,28.8263],[-113.2719,28.7549],[-113.14,28.4113],[-112.9623,28.4253],[-112.7616,27.7803],[-112.4579,27.5259],[-112.2449,27.1719],[-111.6165,26.6629],[-111.2846,25.7327],[-110.9878,25.2947],[-110.71,24.8261],[-110.655,24.2987],[-110.1728,24.2657],[-109.7718,23.8113],[-109.4091,23.3647],[-109.4334,23.1857],[-109.8542,22.8183],[-110.0313,22.8231],[-110.295,23.4311],[-110.9495,24.0011],[-111.6706,24.4845],[-112.182,24.7385],[-112.149,25.4703],[-112.3007,26.0121],[-112.7773,26.3221],[-113.4646,26.7683],[-113.5967,26.6395],[-113.8489,26.9001],[-114.4657,27.1421],[-115.0551,27.7227],[-114.9822,27.7983],[-114.5703,27.7415],[-114.1993,28.1151],[-114.162,28.5661],[-114.9318,29.2795],[-115.5187,29.5563],[-115.8874,30.1809],[-116.2583,30.8365],[-116.7215,31.6357],[-117.1277,32.5353],[-117.2959,33.0463],[-117.9439,33.6213],[-118.4106,33.7409],[-118.5199,34.0279],[-119.081,34.0781],[-119.4388,34.3485],[-120.3678,34.4471],[-120.6228,34.6085],[-120.7443,35.1569],[-121.7146,36.1617],[-122.5475,37.5519],[-122.512,37.7835],[-122.9532,38.1137],[-123.7271,38.9517],[-123.8651,39.7671],[-124.398,40.3133],[-124.1788,41.1421],[-124.2137,41.9997],[-124.5328,42.7661],[-124.1421,43.7085],[-123.8989,45.5235],[-124.0796,46.8647],[-124.3957,47.7203],[-124.6872,48.1845],[-124.5661,48.3797],[-123.12,48.0401],[-122.5873,47.0961],[-122.34,47.3601],[-122.5,48.1801],[-122.84,49.0001],[-122.9742,49.0027],[-124.9102,49.9847],[-125.6246,50.4167],[-127.4356,50.8307],[-127.9927,51.7159],[-127.8503,52.3297],[-129.1297,52.7555],[-129.3052,53.5617],[-130.5149,54.2877],[-130.5361,54.8027],[-131.0858,55.1789],[-131.9672,55.4979],[-132.25,56.3701],[-133.5392,57.1789],[-134.078,58.1231],[-135.0382,58.1877],[-136.628,58.2123],[-137.8,58.5001],[-139.8678,59.5379],[-140.8252,59.7275],[-142.5744,60.0845],[-143.9588,59.9993],[-145.9255,60.4587],[-147.1144,60.8847],[-148.2243,60.6731],[-148.018,59.9783],[-148.5708,59.9143],[-149.7278,59.7057],[-150.6082,59.3683],[-151.7163,59.1559],[-151.8594,59.7451],[-151.4097,60.7259],[-150.3469,61.0337],[-150.6211,61.2845],[-151.8958,60.7273],[-152.5783,60.0617],[-154.0191,59.3503],[-153.2875,58.8647],[-154.2325,58.1465],[-155.3075,57.7279],[-156.3083,57.4229],[-156.5561,56.9801],[-158.1172,56.4637],[-158.4333,55.9941],[-159.6033,55.5667],[-160.2897,55.6437],[-161.223,55.3647],[-162.2378,55.0243],[-163.0694,54.6899],[-164.7856,54.4043],[-164.9422,54.5723],[-163.8483,55.0395],[-162.87,55.3481],[-161.8042,55.8951],[-160.5636,56.0081],[-160.0705,56.4181],[-158.6844,57.0167],[-158.4611,57.2169],[-157.7228,57.5701],[-157.5503,58.3283],[-157.0417,58.9189],[-158.1947,58.6159],[-158.5172,58.7879],[-159.0586,58.4243],[-159.7116,58.9315],[-159.9812,58.5727],[-160.3553,59.0711],[-161.355,58.6709],[-161.9688,58.6717],[-162.055,59.2669],[-161.8741,59.6337],[-162.518,59.9897],[-163.8183,59.7981],[-164.6622,60.2675],[-165.3464,60.5075],[-165.3508,61.0739],[-166.1214,61.5001],[-165.7344,62.0751],[-164.9192,62.6331],[-164.5625,63.1465],[-163.7533,63.2195],[-163.0672,63.0595],[-162.2605,63.5419],[-161.5344,63.4559],[-160.7725,63.7661],[-160.9583,64.2229],[-161.518,64.4029],[-160.7777,64.7887],[-161.3919,64.7773],[-162.453,64.5595],[-162.7578,64.3387],[-163.5464,64.5591],[-164.9608,64.4471],[-166.4253,64.6867],[-166.845,65.0889],[-168.1105,65.6701],[-166.7052,66.0883],[-164.4747,66.5767],[-163.6525,66.5767],[-163.7885,66.0773],[-161.6778,66.1161],[-162.4897,66.7355],[-163.7197,67.1165],[-164.4309,67.6163],[-165.3902,68.0429],[-166.7644,68.3589],[-166.2047,68.8831],[-164.4308,68.9155],[-163.1686,69.3711],[-162.9305,69.8581],[-161.9089,70.3333],[-160.9348,70.4477],[-159.0392,70.8917],[-158.1197,70.8247],[-156.5808,71.3579],[-155.0678,71.1479],[-154.3442,70.6965],[-153.9,70.8901],[-152.21,70.8301],[-152.27,70.6001],[-150.74,70.4301],[-149.72,70.5301],[-147.6133,70.2141],[-145.69,70.1201],[-144.92,69.9901],[-143.5894,70.1525],[-142.0725,69.8519],[-140.9859,69.7121],[-139.1205,69.4711],[-137.5464,68.9901],[-136.5036,68.8981],[-135.6257,69.3151],[-134.4146,69.6275],[-132.9292,69.5053],[-131.4313,69.9445],[-129.7947,70.1937],[-129.1077,69.7793],[-128.3615,70.0129],[-128.1382,70.4839],[-127.4471,70.3773],[-125.7563,69.4807],[-124.4248,70.1585],[-124.2896,69.3997],[-123.0611,69.5637],[-122.6834,69.8555],[-121.4723,69.7979],[-119.9428,69.3779],[-117.6026,69.0113],[-116.2264,68.8415],[-115.2469,68.9059],[-113.8979,68.3989],[-115.3048,67.9027],[-113.4972,67.6883],[-110.7979,67.8061],[-109.9461,67.9811],[-108.8802,67.3815],[-107.7924,67.8875],[-108.813,68.3117],[-108.1672,68.6539],[-106.95,68.7001],[-106.15,68.8001],[-105.3428,68.5613],[-104.3379,68.0181],[-103.2211,68.0979],[-101.4543,67.6469],[-99.902,67.8057],[-98.4432,67.7817],[-98.5586,68.4039],[-97.6695,68.5787],[-96.1199,68.2395],[-96.1258,67.2935],[-95.4894,68.0907],[-94.685,68.0639],[-94.2328,69.0691],[-95.3041,69.6857],[-96.4713,70.0899],[-96.3911,71.1949],[-95.2088,71.9205],[-93.8899,71.7601],[-92.8781,71.3187],[-91.5196,70.1913],[-92.4069,69.7001],[-90.5471,69.4977]]]}},{"type":"Feature","properties":{},"bbox":[-119.402,68.5355,-100.9808,73.3146],"geometry":{"type":"Polygon","coordinates":[[[-114.1672,73.1214],[-114.6663,72.6528],[-112.441,72.9554],[-111.0504,72.4504],[-109.9203,72.9611],[-109.0065,72.6333],[-108.1883,71.6509],[-107.686,72.0655],[-108.3964,73.0895],[-107.5165,73.236],[-106.5226,73.076],[-105.4025,72.6726],[-104.7748,71.6984],[-104.4648,70.993],[-102.7854,70.4978],[-100.9808,70.0243],[-101.0893,69.5845],[-102.7312,69.504],[-102.0933,69.1196],[-102.4302,68.7528],[-104.24,68.91],[-105.96,69.18],[-107.1225,69.1192],[-109,68.78],[-111.9668,68.6045],[-113.3132,68.5355],[-113.855,69.0074],[-115.22,69.28],[-116.1079,69.1682],[-117.34,69.96],[-116.6747,70.0666],[-115.1311,70.2373],[-113.7214,70.1924],[-112.4161,70.3664],[-114.35,70.6],[-116.4868,70.5204],[-117.9048,70.5406],[-118.4324,70.9092],[-116.1131,71.3092],[-117.6557,71.2952],[-119.402,71.5586],[-118.5627,72.3079],[-117.8664,72.7059],[-115.1891,73.3146],[-114.1672,73.1214]]]}},{"type":"Feature","properties":{},"bbox":[-106.94,72.76,-104.5,73.64],"geometry":{"type":"Polygon","coordinates":[[[-104.5,73.42],[-105.38,72.76],[-106.94,73.46],[-106.6,73.6],[-105.26,73.64],[-104.5,73.42]]]}},{"type":"Feature","properties":{},"bbox":[-80.8761,72.7422,-76.2514,73.7597],"geometry":{"type":"Polygon","coordinates":[[[-76.34,73.1027],[-76.2514,72.8264],[-77.3144,72.8555],[-78.3917,72.8767],[-79.4863,72.7422],[-79.7758,72.8029],[-80.8761,73.3332],[-80.8339,73.6932],[-80.3531,73.7597],[-78.0644,73.6519],[-76.34,73.1027]]]}},{"type":"Feature","properties":{},"bbox":[-90.2052,61.9309,-61.852,73.8038],"geometry":{"type":"Polygon","coordinates":[[[-86.5622,73.1574],[-85.7744,72.5341],[-84.8501,73.3403],[-82.3156,73.751],[-80.6001,72.7165],[-80.7489,72.0619],[-78.7706,72.3522],[-77.8246,72.7496],[-75.6058,72.2437],[-74.2286,71.7671],[-74.0991,71.3308],[-72.2422,71.5569],[-71.2,70.92],[-68.7861,70.525],[-67.915,70.1219],[-66.969,69.1861],[-68.8051,68.7202],[-66.4499,68.0672],[-64.8623,67.8475],[-63.4249,66.9285],[-61.852,66.8621],[-62.1632,66.1603],[-63.9184,64.9987],[-65.1489,65.426],[-66.7212,66.388],[-68.015,66.2627],[-68.1413,65.6898],[-67.0896,65.1085],[-65.7321,64.6484],[-65.3202,64.3827],[-64.6694,63.3929],[-65.0138,62.6742],[-66.275,62.9451],[-68.7832,63.7457],[-67.3697,62.884],[-66.3283,62.2801],[-66.1656,61.9309],[-68.8774,62.3301],[-71.0234,62.9107],[-72.2354,63.3978],[-71.8863,63.68],[-73.3783,64.194],[-74.8344,64.6791],[-74.8185,64.3891],[-77.71,64.2295],[-78.5559,64.5729],[-77.8973,65.3092],[-76.0183,65.327],[-73.9598,65.4548],[-74.2939,65.8118],[-73.9449,66.3106],[-72.6512,67.2846],[-72.9261,67.7269],[-73.3116,68.0694],[-74.8433,68.5546],[-76.8691,68.8947],[-76.2286,69.1478],[-77.2874,69.7695],[-78.1686,69.8265],[-78.9572,70.1669],[-79.4925,69.8718],[-81.3055,69.7432],[-84.9447,69.9666],[-87.06,70.26],[-88.6817,70.4107],[-89.5134,70.762],[-88.4677,71.2182],[-89.8882,71.2226],[-90.2052,72.2351],[-89.4366,73.1295],[-88.4082,73.5379],[-85.8262,73.8038],[-86.5622,73.1574]]]}},{"type":"Feature","properties":{},"bbox":[-102.5,71.2729,-96.54,73.8439],"geometry":{"type":"Polygon","coordinates":[[[-100.3564,73.8439],[-99.1639,73.6334],[-97.38,73.76],[-97.12,73.47],[-98.0536,72.9905],[-96.54,72.56],[-96.72,71.66],[-98.3597,71.2729],[-99.3229,71.3564],[-100.0148,71.7383],[-102.5,72.51],[-102.48,72.83],[-100.4384,72.7059],[-101.54,73.36],[-100.3564,73.8439]]]}},{"type":"Feature","properties":{},"bbox":[139.8631,73.2054,143.6038,73.8576],"geometry":{"type":"Polygon","coordinates":[[[143.6038,73.2124],[142.0876,73.2054],[140.0382,73.3169],[139.8631,73.3698],[140.8117,73.7651],[142.0621,73.8576],[143.4828,73.4753],[143.6038,73.2124]]]}},{"type":"Feature","properties":{},"bbox":[-96.0337,72.0246,-90.5098,74.1349],"geometry":{"type":"Polygon","coordinates":[[[-93.1963,72.772],[-94.269,72.0246],[-95.4099,72.0619],[-96.0337,72.9403],[-96.0183,73.4374],[-95.4958,73.8624],[-94.5037,74.1349],[-92.42,74.1],[-90.5098,73.8567],[-92.004,72.9662],[-93.1963,72.772]]]}},{"type":"Feature","properties":{},"bbox":[-125.929,70.9016,-115.5108,74.4489],"geometry":{"type":"Polygon","coordinates":[[[-120.46,71.4],[-123.0922,70.9016],[-123.62,71.34],[-125.929,71.8687],[-125.5927,72.1945],[-124.8073,73.0226],[-123.94,73.68],[-124.9177,74.2927],[-121.5379,74.4489],[-120.1098,74.2413],[-117.5556,74.1858],[-116.5844,73.8961],[-115.5108,73.4752],[-116.7679,73.2229],[-119.22,72.52],[-120.46,71.82],[-120.46,71.4]]]}},{"type":"Feature","properties":{},"bbox":[146.1192,74.6889,150.7317,75.4968],"geometry":{"type":"Polygon","coordinates":[[[150.7317,75.0841],[149.5759,74.6889],[147.9775,74.7784],[146.1192,75.173],[146.3585,75.4968],[148.2222,75.3458],[150.7317,75.0841]]]}},{"type":"Feature","properties":{},"bbox":[-96.8209,74.5923,-93.6128,75.6472],"geometry":{"type":"Polygon","coordinates":[[[-93.6128,74.98],[-94.1569,74.5923],[-95.6087,74.6669],[-96.8209,74.9276],[-96.2886,75.3778],[-94.8508,75.6472],[-93.9777,75.2965],[-93.6128,74.98]]]}},{"type":"Feature","properties":{},"bbox":[136.9744,74.6115,145.0863,76.1368],"geometry":{"type":"Polygon","coordinates":[[[145.0863,75.5626],[144.3,74.82],[140.6138,74.8477],[138.9554,74.6115],[136.9744,75.2617],[137.5118,75.9492],[138.8311,76.1368],[141.4716,76.0929],[145.0863,75.5626]]]}},{"type":"Feature","properties":{},"bbox":[-102.5655,74.8974,-97.7044,76.72],"geometry":{"type":"Polygon","coordinates":[[[-98.5,76.72],[-97.7356,76.2566],[-97.7044,75.7434],[-98.16,75],[-99.8087,74.8974],[-100.8837,75.0574],[-100.8629,75.6407],[-102.5021,75.5638],[-102.5655,76.3366],[-101.4897,76.3054],[-99.9835,76.6463],[-98.577,76.5886],[-98.5,76.72]]]}},{"type":"Feature","properties":{},"bbox":[-117.7104,74.3943,-105.705,76.7942],"geometry":{"type":"Polygon","coordinates":[[[-108.2114,76.2017],[-107.8194,75.8455],[-106.9289,76.0128],[-105.881,75.9694],[-105.705,75.4795],[-106.3135,75.0053],[-109.7,74.85],[-112.2231,74.417],[-113.7438,74.3943],[-113.8714,74.7203],[-111.7942,75.1625],[-116.3122,75.0434],[-117.7104,75.2222],[-116.346,76.199],[-115.4049,76.4789],[-112.5906,76.1413],[-110.8142,75.5492],[-109.0671,75.4732],[-110.4973,76.4298],[-109.5811,76.7942],[-108.5486,76.6783],[-108.2114,76.2017]]]}},{"type":"Feature","properties":{},"bbox":[51.4558,70.6327,68.8522,76.9397],"geometry":{"type":"Polygon","coordinates":[[[57.5357,70.7205],[56.945,70.6327],[53.6774,70.7627],[53.412,71.2067],[51.6019,71.4748],[51.4558,72.0149],[52.4783,72.2294],[52.4442,72.7747],[54.4276,73.6275],[53.5083,73.7498],[55.9025,74.6275],[55.6319,75.0814],[57.8686,75.6094],[61.17,76.2519],[64.4984,76.4391],[66.211,76.8098],[68.1571,76.9397],[68.8522,76.5448],[68.1806,76.2336],[64.6373,75.7378],[61.5835,75.2609],[58.4771,74.3091],[56.9868,73.333],[55.4193,72.3713],[55.6228,71.5406],[57.5357,70.7205]]]}},{"type":"Feature","properties":{},"bbox":[-97.1214,74.3923,-79.8339,77.1614],"geometry":{"type":"Polygon","coordinates":[[[-94.6841,77.0979],[-93.5739,76.7763],[-91.605,76.7785],[-90.7418,76.4496],[-90.9697,76.074],[-89.8222,75.8478],[-89.1871,75.6102],[-87.8383,75.5662],[-86.3792,75.4824],[-84.7896,75.6992],[-82.7534,75.7843],[-81.1285,75.714],[-80.0575,75.3368],[-79.8339,74.9231],[-80.4578,74.6573],[-81.9488,74.4425],[-83.2289,74.564],[-86.0975,74.41],[-88.1504,74.3923],[-89.7647,74.5156],[-92.4224,74.8378],[-92.7683,75.3868],[-92.8899,75.8827],[-93.8938,76.3192],[-95.9625,76.4414],[-97.1214,76.7511],[-96.7451,77.1614],[-94.6841,77.0979]]]}},{"type":"Feature","properties":{},"bbox":[-122.8549,75.9,-116.1986,77.6453],"geometry":{"type":"Polygon","coordinates":[[[-116.1986,77.6453],[-116.3358,76.877],[-117.1061,76.53],[-118.0404,76.4812],[-119.8993,76.0532],[-121.5,75.9],[-122.8549,76.1165],[-122.8549,76.1165],[-121.1575,76.8645],[-119.1039,77.5122],[-117.5701,77.4983],[-116.1986,77.6453]]]}},{"type":"Feature","properties":{},"bbox":[-17.625,-34.8191,180,77.6979],"geometry":{"type":"Polygon","coordinates":[[[106.9703,76.9743],[107.2401,76.4801],[108.1539,76.7233],[111.0773,76.7101],[113.3315,76.2223],[114.1343,75.8477],[113.8855,75.3279],[112.7793,75.0319],[110.1513,74.4767],[109.4001,74.1801],[110.6401,74.0401],[112.1193,73.7877],[113.0195,73.9769],[113.5297,73.3351],[113.9689,73.5949],[115.5679,73.7529],[118.7763,73.5877],[119.0201,73.1201],[123.2007,72.9713],[123.2579,73.7351],[125.3801,73.5601],[126.9765,73.5655],[128.5913,73.0387],[129.0517,72.3987],[128.4601,71.9801],[129.7161,71.1931],[131.2887,70.7871],[132.2535,71.8363],[133.8577,71.3865],[135.5621,71.6553],[137.4977,71.3477],[138.2341,71.6281],[139.8699,71.4879],[139.1479,72.4163],[140.4681,72.8495],[149.5001,72.2001],[150.3513,71.6065],[152.9689,70.8423],[157.0069,71.0315],[158.9979,70.8667],[159.8303,70.4533],[159.7087,69.7221],[160.9407,69.4373],[162.2791,69.6421],[164.0525,69.6683],[165.9405,69.4721],[167.8357,69.5827],[169.5777,68.6939],[170.8169,69.0137],[170.0083,69.6529],[170.4535,70.0971],[173.6439,69.8175],[175.7241,69.8773],[178.6001,69.4001],[180,68.9637],[180,64.9796],[179.9929,64.9743],[178.7073,64.5349],[177.4113,64.6083],[178.3131,64.0759],[178.9083,63.2521],[179.3705,62.9827],[179.4865,62.5691],[179.2283,62.3041],[177.3643,62.5219],[174.5693,61.7693],[173.6801,61.6527],[172.1501,60.9501],[170.6985,60.3363],[170.3309,59.8819],[168.9005,60.5735],[166.2951,59.7887],[165.8401,60.1601],[164.8769,59.7317],[163.5393,59.8687],[163.2171,59.2111],[162.0173,58.2433],[162.0531,57.8391],[163.1919,57.6151],[163.0579,56.1593],[162.1297,56.1223],[161.7015,55.2857],[162.1175,54.8553],[160.3689,54.3445],[160.0217,53.2027],[158.5309,52.9587],[158.2313,51.9427],[156.7899,51.0111],[156.4201,51.7001],[155.9919,53.1589],[155.4337,55.3811],[155.9145,56.7679],[156.7583,57.3647],[156.8105,57.8321],[158.3643,58.0557],[160.1507,59.3149],[161.8721,60.3431],[163.6697,61.1409],[164.4737,62.5507],[163.2585,62.4663],[162.6579,61.6425],[160.1215,60.5443],[159.3023,61.7741],[156.7207,61.4345],[154.2181,59.7583],[155.0439,59.1451],[152.8119,58.8839],[151.2657,58.7809],[151.3381,59.5041],[149.7837,59.6557],[148.5449,59.1645],[145.4873,59.3365],[142.1979,59.0401],[138.9585,57.0881],[135.1263,54.7297],[136.7017,54.6037],[137.1935,53.9773],[138.1647,53.7551],[138.8047,54.2547],[139.9015,54.1897],[141.3453,53.0897],[141.3793,52.2389],[140.5975,51.2397],[140.5131,50.0455],[140.0621,48.4467],[138.5547,46.9997],[138.2197,46.3079],[136.8623,45.1435],[135.5153,43.9891],[134.8695,43.3983],[133.5369,42.8115],[132.9063,42.7985],[132.2781,43.2845],[130.9359,42.5527],[130.7801,42.2201],[130.4001,42.2801],[129.9659,41.9413],[129.6675,41.6011],[129.7053,40.8829],[129.1881,40.6619],[129.0105,40.4855],[128.6335,40.1899],[127.9675,40.0255],[127.5335,39.7569],[127.5021,39.3239],[127.3855,39.2135],[127.7833,39.0509],[128.3497,38.6123],[129.2129,37.4325],[129.4605,36.7843],[129.4683,35.6321],[129.0915,35.0825],[128.1859,34.8905],[127.3865,34.4757],[126.4857,34.3901],[126.3739,34.9347],[126.5593,35.6847],[126.1175,36.7255],[126.8603,36.8939],[126.1747,37.7497],[125.6891,37.9401],[125.5685,37.7521],[125.2753,37.6691],[125.2401,37.8573],[124.9811,37.9489],[124.7123,38.1083],[124.9861,38.5485],[125.2219,38.6659],[125.1329,38.8487],[125.3867,39.3879],[125.3211,39.5515],[124.7375,39.6603],[124.2657,39.9285],[122.8677,39.6379],[122.1315,39.1705],[121.0547,38.8975],[121.5861,39.3609],[121.3769,39.7503],[122.1687,40.4225],[121.6405,40.9465],[120.7687,40.5935],[119.6397,39.8981],[119.0235,39.2523],[118.0427,39.2043],[117.5327,38.7377],[118.0597,38.0615],[118.8783,37.8973],[118.9117,37.4485],[119.7029,37.1565],[120.8235,37.8705],[121.7113,37.4811],[122.3579,37.4545],[122.5201,36.9307],[121.1043,36.6513],[120.6371,36.1115],[119.6647,35.6099],[119.1513,34.9099],[120.2275,34.3605],[120.6205,33.3767],[121.2291,32.4603],[121.9081,31.6923],[121.8919,30.9493],[121.2643,30.6763],[121.5035,30.1429],[122.0921,29.8325],[121.9385,29.0181],[121.6845,28.2255],[121.1257,28.1357],[120.3955,27.0533],[119.5855,25.7409],[118.6569,24.5475],[117.2817,23.6245],[115.8907,22.7829],[114.7639,22.6681],[114.1525,22.2239],[113.8069,22.5483],[113.2411,22.0515],[111.8437,21.5505],[110.7855,21.3973],[110.4441,20.3411],[109.8899,20.2825],[109.6277,21.0083],[109.8645,21.3951],[108.5229,21.7153],[108.0503,21.5525],[106.7151,20.6969],[105.8817,19.7521],[105.6621,19.0583],[106.4269,18.0041],[107.3619,16.6975],[108.2695,16.0797],[108.8771,15.2767],[109.3353,13.4261],[109.2001,11.6669],[108.3661,11.0083],[107.2209,10.3645],[106.4051,9.5309],[105.1583,8.5997],[104.7953,9.2411],[105.0763,9.9185],[104.3345,10.4867],[103.4973,10.6327],[103.0907,11.1537],[102.5851,12.1867],[101.6871,12.6459],[100.8319,12.6271],[100.9785,13.4127],[100.0979,13.4069],[100.0187,12.3071],[99.4789,10.8465],[99.1537,9.9631],[99.2225,9.2393],[99.8739,9.2079],[100.2797,8.2953],[100.4593,7.4297],[101.0173,6.8569],[101.6231,6.7407],[102.1413,6.2217],[102.3713,6.1283],[102.9617,5.5245],[103.3813,4.8551],[103.4387,4.1817],[103.3321,3.7267],[103.4295,3.3829],[103.5025,2.7911],[103.8547,2.5155],[104.2479,1.6313],[104.2289,1.2931],[103.5197,1.2263],[102.5737,1.9671],[101.3907,2.7609],[101.2737,3.2703],[100.6955,3.9391],[100.5575,4.7673],[100.1967,5.3125],[100.3063,6.0407],[100.0859,6.4645],[99.6907,6.8483],[99.5197,7.3435],[98.9883,7.9081],[98.5039,8.3823],[98.3397,7.7945],[98.1501,8.3501],[98.2593,8.9739],[98.5535,9.9331],[98.4573,10.6753],[98.7645,11.4413],[98.4283,12.0331],[98.5097,13.1225],[98.1037,13.6405],[97.7777,14.8373],[97.5971,16.1007],[97.1647,16.9287],[96.5059,16.4273],[95.3693,15.7145],[94.8085,15.8035],[94.1889,16.0381],[94.5335,17.2773],[94.3249,18.2135],[93.5411,19.3665],[93.6633,19.7271],[93.0783,19.8553],[92.3685,20.6709],[92.0829,21.1923],[92.0253,21.7017],[91.8349,22.1829],[91.4171,22.7651],[90.4961,22.8051],[90.5871,22.3929],[90.2729,21.8365],[89.8475,22.0391],[89.7021,21.8571],[89.4189,21.9663],[89.0321,22.0557],[88.8889,21.6907],[88.2085,21.7033],[86.9757,21.4955],[87.0331,20.7433],[86.4993,20.1517],[85.0603,19.4787],[83.9411,18.3021],[83.1893,17.6713],[82.1929,17.0167],[82.1913,16.5567],[81.6927,16.3103],[80.7921,15.9521],[80.3249,15.8993],[80.0251,15.1365],[80.2333,13.8359],[80.2863,13.0063],[79.8625,12.0563],[79.8581,10.3573],[79.3405,10.3089],[78.8855,9.5461],[79.1897,9.2167],[78.2781,8.9331],[77.9413,8.2529],[77.5399,7.9655],[76.5931,8.8993],[76.1301,10.2997],[75.7465,11.3083],[75.3961,11.7813],[74.8649,12.7419],[74.6167,13.9927],[74.4439,14.6173],[73.5343,15.9907],[73.1199,17.9287],[72.8209,19.2083],[72.8245,20.4195],[72.6307,21.3561],[71.1753,20.7575],[70.4705,20.8773],[69.1641,22.0893],[69.6449,22.4507],[69.3497,22.8433],[68.1767,23.6921],[67.4437,23.9449],[67.1455,24.6637],[66.3729,25.4253],[64.5305,25.2371],[62.9057,25.2185],[61.4975,25.0783],[59.6161,25.3801],[58.5259,25.6101],[57.3973,25.7399],[56.9709,26.9661],[56.4921,27.1433],[55.7237,26.9647],[54.7151,26.4807],[53.4931,26.8125],[52.4837,27.5809],[51.5209,27.8657],[50.8531,28.8145],[50.1151,30.1479],[49.5769,29.9857],[48.9413,30.3171],[48.5681,29.9269],[47.9745,29.9759],[48.1833,29.5345],[48.0939,29.3063],[48.4161,28.5521],[48.8077,27.6897],[49.2997,27.4613],[49.4709,27.1101],[50.1525,26.6897],[50.2131,26.2771],[50.1133,25.9441],[50.2399,25.6081],[50.5275,25.3279],[50.6607,24.9999],[50.8101,24.7549],[50.7439,25.4825],[51.0135,26.0071],[51.2865,26.1147],[51.5891,25.8011],[51.6067,25.2157],[51.3897,24.6275],[51.5795,24.2455],[51.7575,24.2941],[51.7945,24.0199],[52.5771,24.1775],[53.4041,24.1513],[54.0081,24.1219],[54.6931,24.7979],[55.4391,25.4391],[56.0709,26.0555],[56.3621,26.3959],[56.4857,26.3091],[56.3915,25.8961],[56.2611,25.7147],[56.3969,24.9247],[56.8453,24.2417],[57.4035,23.8787],[58.1371,23.7479],[58.7293,23.5657],[59.1805,22.9925],[59.4501,22.6603],[59.8081,22.5337],[59.8063,22.3105],[59.4423,21.7145],[59.2825,21.4339],[58.8611,21.1141],[58.4881,20.4291],[58.0343,20.4815],[57.8265,20.2431],[57.6659,19.7361],[57.7887,19.0677],[57.6945,18.9447],[57.2343,18.9481],[56.6097,18.5743],[56.5123,18.0871],[56.2835,17.8761],[55.6615,17.8843],[55.2701,17.6323],[55.2749,17.2283],[54.7911,16.9507],[54.2393,17.0451],[53.5705,16.7077],[53.1087,16.6511],[52.3853,16.3825],[52.1917,15.9385],[52.1683,15.5975],[51.1725,15.1753],[49.5747,14.7087],[48.6793,14.0033],[48.2391,13.9481],[47.9389,14.0073],[47.3545,13.5923],[46.7171,13.3997],[45.8777,13.3479],[45.6251,13.2911],[45.4065,13.0269],[45.1443,12.9539],[44.9897,12.6997],[44.4947,12.7217],[44.1751,12.5859],[43.4831,12.6369],[43.2229,13.2209],[43.2515,13.7677],[43.0881,14.0627],[42.8923,14.8023],[42.6049,15.2133],[42.8051,15.2621],[42.7025,15.7189],[42.8237,15.9117],[42.7795,16.3479],[42.6497,16.7747],[42.3481,17.0759],[42.2709,17.4747],[41.7545,17.8331],[41.2215,18.6717],[40.9393,19.4865],[40.2477,20.1747],[39.8017,20.3389],[39.1395,21.2919],[39.0237,21.9869],[39.0663,22.5797],[38.4929,23.6885],[38.0239,24.0787],[37.4837,24.2855],[37.1549,24.8585],[37.2095,25.0845],[36.9317,25.6031],[36.6397,25.8263],[36.2491,26.5701],[35.6403,27.3765],[35.1303,28.0635],[34.6323,28.0585],[34.7879,28.6075],[34.8323,28.9575],[34.9561,29.3567],[34.9227,29.5013],[34.6417,29.0995],[34.4267,28.3441],[34.1545,27.8233],[33.9215,27.6487],[33.5881,27.9715],[33.1369,28.4177],[32.4233,29.8511],[32.3205,29.7605],[32.7349,28.7053],[33.3489,27.6999],[34.1047,26.1423],[34.4739,25.5987],[34.7951,25.0339],[35.6925,23.9267],[35.4937,23.7525],[35.5261,23.1025],[36.6907,22.2049],[36.8663,22.0001],[37.1887,21.0189],[36.9695,20.8375],[37.1147,19.8081],[37.4819,18.6141],[37.8627,18.3679],[38.4101,17.9983],[38.9907,16.8407],[39.2661,15.9227],[39.8143,15.4357],[41.1793,14.4911],[41.7349,13.9211],[42.2769,13.3441],[42.5897,13.0005],[43.0813,12.6997],[43.3179,12.3901],[43.2865,11.9749],[42.7159,11.7357],[43.1453,11.4621],[43.4707,11.2777],[43.6667,10.8643],[44.1179,10.4457],[44.6143,10.4423],[45.5569,10.6981],[46.6455,10.8165],[47.5257,11.1273],[48.0217,11.1931],[48.3789,11.3755],[48.9483,11.4107],[49.2679,11.4305],[49.7287,11.5789],[50.2589,11.6797],[50.7321,12.0219],[51.1113,12.0247],[51.1339,11.7483],[51.0415,11.1665],[51.0453,10.6409],[50.8343,10.2797],[50.5525,9.1987],[50.0709,8.0817],[49.4527,6.8047],[48.5945,5.3391],[47.7409,4.2195],[46.5649,2.8553],[45.5641,2.0459],[44.0683,1.0529],[43.1361,0.2923],[42.0417,-0.9192],[41.8111,-1.4464],[41.5851,-1.6832],[40.8849,-2.0825],[40.6379,-2.4998],[40.2631,-2.5731],[40.1213,-3.2777],[39.8001,-3.6811],[39.6049,-4.3465],[39.2023,-4.6767],[38.7405,-5.9089],[38.7997,-6.4756],[39.4401,-6.84],[39.4701,-7.1],[39.1947,-7.7039],[39.2521,-8.0078],[39.1865,-8.4855],[39.5359,-9.1123],[39.9497,-10.0984],[40.3167,-10.3171],[40.4785,-10.7654],[40.4373,-11.7617],[40.5609,-12.6391],[40.5997,-14.2019],[40.7755,-14.6917],[40.4773,-15.4063],[40.0893,-16.1007],[39.4527,-16.7209],[38.5383,-17.101],[37.4111,-17.5863],[36.2813,-18.6596],[35.8965,-18.8423],[35.1985,-19.5528],[34.7865,-19.784],[34.7019,-20.497],[35.1761,-21.2543],[35.3735,-21.8408],[35.3859,-22.14],[35.5627,-22.09],[35.5339,-23.0708],[35.3719,-23.5353],[35.6075,-23.7065],[35.4587,-24.1226],[35.0407,-24.4783],[34.2159,-24.8163],[33.0133,-25.3575],[32.5747,-25.7273],[32.6603,-26.1485],[32.9161,-26.2159],[32.8301,-26.7422],[32.5803,-27.4701],[32.4623,-28.301],[32.2035,-28.7524],[31.5211,-29.2574],[31.3257,-29.402],[30.9017,-29.9099],[30.6229,-30.4237],[30.0557,-31.1402],[28.9255,-32.172],[28.2197,-32.7719],[27.4647,-33.227],[26.4195,-33.6149],[25.9097,-33.667],[25.7807,-33.9446],[25.1729,-33.7969],[24.6779,-33.9872],[23.5941,-33.7945],[22.9883,-33.9164],[22.5743,-33.8641],[21.5429,-34.2588],[20.6891,-34.4172],[20.0713,-34.7951],[19.6165,-34.8191],[19.1933,-34.4626],[18.8553,-34.4443],[18.4247,-33.9978],[18.3775,-34.1365],[18.2445,-33.8677],[18.2501,-33.2814],[17.9253,-32.6112],[18.2479,-32.4291],[18.2217,-31.6616],[17.5669,-30.7257],[17.0645,-29.8786],[17.0629,-29.876],[16.3451,-28.5767],[15.6019,-27.8212],[15.2105,-27.0909],[14.9897,-26.1173],[14.7433,-25.3929],[14.4081,-23.853],[14.3857,-22.6567],[14.2577,-22.1112],[13.8687,-21.699],[13.3525,-20.8728],[12.8269,-19.6731],[12.6087,-19.0453],[11.7949,-18.0691],[11.7343,-17.3019],[11.6401,-16.6731],[11.7787,-15.7938],[12.1237,-14.8783],[12.1757,-14.4491],[12.5001,-13.5477],[12.7385,-13.1379],[13.3129,-12.4836],[13.6337,-12.0386],[13.7387,-11.2978],[13.6865,-10.7311],[13.3873,-10.3736],[13.1211,-9.7669],[12.8755,-9.1669],[12.9291,-8.9591],[13.2365,-8.5626],[12.9331,-7.5965],[12.7283,-6.9271],[12.2275,-6.2944],[12.3225,-6.1001],[12.1823,-5.7899],[11.9151,-5.0379],[11.0937,-3.9788],[10.0663,-2.9695],[9.4053,-2.1443],[8.7981,-1.1113],[8.8301,-0.779],[9.0485,-0.4593],[9.2913,0.2687],[9.4929,1.0101],[9.3057,1.1609],[9.6493,2.2839],[9.7953,3.0735],[9.4045,3.7345],[8.9481,3.9041],[8.7449,4.3523],[8.4889,4.4957],[8.5003,4.7721],[7.4621,4.4121],[7.0827,4.4647],[6.6981,4.2407],[5.8983,4.2625],[5.3629,4.8881],[5.0337,5.6119],[4.3257,6.2707],[3.5743,6.2583],[2.6917,6.2589],[1.8653,6.1423],[1.0601,5.9289],[-0.5076,5.3435],[-1.0636,5.0005],[-1.9647,4.7105],[-2.8561,4.9945],[-3.3111,4.9843],[-4.0088,5.1799],[-4.6499,5.1683],[-5.8344,4.9937],[-6.5287,4.7051],[-7.5189,4.3383],[-7.7121,4.3647],[-7.9741,4.3559],[-9.0048,4.8325],[-9.9134,5.5937],[-10.7654,6.1407],[-11.4388,6.7859],[-11.7082,6.8601],[-12.4281,7.2629],[-12.949,7.7987],[-13.124,8.1639],[-13.2465,8.9031],[-13.6852,9.4949],[-14.074,9.8863],[-14.3301,10.0157],[-14.5797,10.2145],[-14.6932,10.6563],[-14.8395,10.8767],[-15.1303,11.0405],[-15.6642,11.4585],[-16.0852,11.5247],[-16.3147,11.8065],[-16.3089,11.9587],[-16.6138,12.1709],[-16.6774,12.3849],[-16.8415,13.1515],[-16.7137,13.5951],[-17.1261,14.3735],[-17.625,14.7297],[-17.1852,14.9195],[-16.7007,15.6215],[-16.463,16.1351],[-16.5497,16.6739],[-16.2705,17.1671],[-16.1463,18.1085],[-16.2569,19.0967],[-16.3776,19.5939],[-16.2778,20.0925],[-16.5363,20.5679],[-17.0634,20.9999],[-17.0204,21.4223],[-16.9732,21.8857],[-16.5891,22.1583],[-16.2619,22.6793],[-16.3264,23.0179],[-15.9826,23.7235],[-15.426,24.3591],[-15.0893,24.5203],[-14.8246,25.1035],[-14.8009,25.6363],[-14.4399,26.2545],[-13.7738,26.6189],[-13.1399,27.6401],[-12.6188,28.0383],[-11.6889,28.1487],[-10.9009,28.8323],[-10.3996,29.0987],[-9.5648,29.9337],[-9.8147,31.1777],[-9.4348,32.0381],[-9.3007,32.5647],[-8.6574,33.2403],[-7.6542,33.6971],[-6.9125,34.1105],[-6.2443,35.1459],[-5.93,35.7601],[-5.1938,35.7553],[-4.591,35.3307],[-3.6401,35.3999],[-2.6043,35.1791],[-2.1699,35.1685],[-1.2086,35.7149],[-0.1274,35.8887],[0.5039,36.3013],[1.4669,36.6057],[3.1617,36.7839],[4.8157,36.8651],[5.3201,36.7165],[6.2619,37.1107],[7.3305,37.1185],[7.7371,36.8857],[8.4211,36.9465],[9.5101,37.3501],[10.2101,37.2301],[10.1807,36.7241],[11.0289,37.0921],[11.1001,36.9001],[10.6001,36.4101],[10.5933,35.9475],[10.9395,35.6991],[10.8079,34.8335],[10.1497,34.3307],[10.3397,33.7859],[10.8569,33.7687],[11.1085,33.2933],[11.4889,33.1371],[12.6633,32.7929],[13.0833,32.8789],[13.9187,32.7121],[15.2457,32.2651],[15.7139,31.3763],[16.6117,31.1823],[18.0211,30.7635],[19.0865,30.2665],[19.5741,30.5259],[20.0533,30.9859],[19.8203,31.7519],[20.1341,32.2383],[20.8545,32.7069],[21.5431,32.8433],[22.8959,32.6385],[23.2369,32.1915],[23.6091,32.1873],[23.9275,32.0167],[24.9211,31.8995],[25.1649,31.5693],[26.4953,31.5857],[27.4577,31.3213],[28.4505,31.0259],[28.9135,30.8701],[29.6835,31.1869],[30.0951,31.4735],[30.9769,31.5559],[31.6881,31.4297],[31.9605,30.9337],[32.1925,31.2603],[32.9939,31.0241],[33.7735,30.9675],[34.2655,31.2195],[34.5565,31.5489],[34.4881,31.6055],[34.7527,32.0729],[34.9555,32.8275],[35.0985,33.0807],[35.1261,33.0909],[35.4823,33.9055],[35.9797,34.6101],[35.9985,34.6449],[35.9051,35.4101],[36.1499,35.8215],[35.7821,36.2751],[36.1609,36.6507],[35.5511,36.5655],[34.7145,36.7955],[34.0269,36.2201],[32.5093,36.1075],[31.6997,36.6443],[30.6217,36.6779],[30.3911,36.2631],[29.7001,36.1443],[28.7329,36.6769],[27.6413,36.6589],[27.0489,37.6535],[26.3183,38.2081],[26.8047,38.9859],[26.1709,39.4637],[27.2801,40.4201],[28.8201,40.4601],[29.2401,41.2201],[31.1459,41.0877],[32.3481,41.7363],[33.5133,42.0191],[35.1677,42.0403],[36.9131,41.3355],[38.3477,40.9487],[39.5127,41.1029],[40.3735,41.0137],[41.5541,41.5357],[41.7033,41.9631],[41.4535,42.6451],[40.8755,43.0137],[40.3215,43.1287],[39.9551,43.4351],[38.6801,44.2801],[37.5391,44.6573],[36.6755,45.2447],[37.4033,45.4045],[38.2331,46.2409],[37.6737,46.6367],[39.1477,47.0447],[39.1213,47.2635],[38.2237,47.1023],[37.4251,47.0223],[36.7599,46.6987],[35.8237,46.6459],[34.9623,46.2733],[35.0209,45.6513],[35.5101,45.4101],[36.5301,45.4701],[36.3347,45.1133],[35.2401,44.9401],[33.8825,44.3615],[33.3265,44.5649],[33.5469,45.0349],[32.4543,45.3275],[32.6309,45.5193],[33.5881,45.8517],[33.2987,46.0807],[31.7441,46.3335],[31.6753,46.7063],[30.7489,46.5831],[30.3777,46.0325],[29.6033,45.2933],[29.6265,45.0355],[29.1417,44.8203],[28.8379,44.9139],[28.5581,43.7075],[28.0391,43.2933],[27.6739,42.5779],[27.9967,42.0075],[28.1155,41.6229],[28.9885,41.2999],[28.8065,41.0549],[27.6191,40.9999],[27.1925,40.6907],[26.3581,40.1521],[26.0433,40.6177],[26.0569,40.8241],[25.4477,40.8525],[24.9259,40.9471],[23.7149,40.6871],[24.4081,40.1251],[23.9001,39.9621],[23.3431,39.9611],[22.8141,40.4761],[22.6263,40.2565],[22.8497,39.6593],[23.3501,39.1901],[22.9731,38.9709],[23.5301,38.5101],[24.0251,38.2201],[24.0401,37.6551],[23.1151,37.9201],[23.4101,37.4101],[22.7751,37.3051],[23.1543,36.4225],[22.4901,36.4101],[21.6701,36.8451],[21.2951,37.6451],[21.1201,38.3103],[20.7301,38.7701],[20.2177,39.3403],[20.1501,39.6251],[19.9801,39.6951],[19.9601,39.9151],[19.4061,40.2509],[19.3191,40.7273],[19.4037,41.4095],[19.5401,41.7201],[19.3719,41.8777],[19.1625,41.9551],[18.8821,42.2815],[18.4501,42.4801],[17.5099,42.8501],[16.9301,43.2101],[16.0155,43.5073],[15.1745,44.2433],[15.3763,44.3179],[14.9203,44.7385],[14.9017,45.0761],[14.2587,45.2339],[13.9523,44.8021],[13.6571,45.1371],[13.6795,45.4841],[13.7151,45.5003],[13.9377,45.5911],[13.1417,45.7367],[12.3287,45.3819],[12.3839,44.8855],[12.2615,44.6005],[12.5893,44.0915],[13.5269,43.5877],[14.0299,42.7611],[15.1427,41.9551],[15.9263,41.9613],[16.1699,41.7403],[15.8893,41.5411],[16.7851,41.1797],[17.5193,40.8771],[18.3767,40.3557],[18.4803,40.1689],[18.2935,39.8109],[17.7385,40.2777],[16.8697,40.4423],[16.4487,39.7955],[17.1715,39.4247],[17.0529,38.9029],[16.6351,38.8437],[16.1011,37.9859],[15.6841,37.9089],[15.6881,38.2147],[15.8921,38.7509],[16.1093,38.9645],[15.7189,39.5441],[15.4137,40.0483],[14.9985,40.1731],[14.7033,40.6047],[14.0607,40.7865],[13.6281,41.1883],[12.8881,41.2531],[12.1067,41.7045],[11.1919,42.3555],[10.5121,42.9315],[10.2001,43.9201],[9.7025,44.0363],[8.8889,44.3663],[8.4287,44.2313],[7.8509,43.7673],[7.4353,43.6939],[6.5293,43.1289],[4.5569,43.3997],[3.1005,43.0753],[2.9861,42.4731],[3.0395,41.8921],[2.0919,41.2261],[0.8105,41.0147],[0.7213,40.6783],[0.1067,40.1241],[-0.2787,39.3101],[0.1113,38.7385],[-0.4671,38.2925],[-0.6834,37.6423],[-1.4383,37.4431],[-2.1464,36.6741],[-3.4157,36.6589],[-4.3689,36.6779],[-4.9952,36.3247],[-5.3771,35.9469],[-5.8664,36.0299],[-6.2367,36.3677],[-6.5202,36.9429],[-7.4537,37.0979],[-7.8556,36.8383],[-8.3828,36.9789],[-8.8988,36.8689],[-8.7461,37.6515],[-8.84,38.2663],[-9.2875,38.3585],[-9.5265,38.7375],[-9.4469,39.3921],[-9.0483,39.7551],[-8.9773,40.1593],[-8.7687,40.7607],[-8.7908,41.1843],[-8.9908,41.5435],[-9.0348,41.8807],[-8.9844,42.5929],[-9.3929,43.0267],[-7.9782,43.7485],[-6.7545,43.5679],[-5.4118,43.5743],[-4.3478,43.4035],[-3.5175,43.4559],[-1.9013,43.4229],[-1.3842,44.0227],[-1.1938,46.0149],[-2.2257,47.0645],[-2.9632,47.5703],[-4.4916,47.9551],[-4.5923,48.6841],[-3.2958,48.9017],[-1.6165,48.6445],[-1.9334,49.7765],[-0.9894,49.3475],[1.3387,50.1273],[1.6391,50.9467],[2.5135,51.1485],[3.3151,51.3459],[3.8303,51.6205],[4.7061,53.0919],[6.0743,53.5105],[6.9053,53.4823],[7.1005,53.6939],[7.9363,53.7483],[8.1217,53.5279],[8.8007,54.0209],[8.5721,54.3957],[8.5263,54.9629],[8.1203,55.5177],[8.0901,56.5401],[8.2567,56.8101],[8.5435,57.1101],[9.4245,57.1721],[9.7757,57.4479],[10.5801,57.7301],[10.5461,57.2159],[10.2501,56.8901],[10.3701,56.6101],[10.9123,56.4587],[10.6679,56.0815],[10.3701,56.1901],[9.6501,55.4701],[9.9219,54.9831],[9.9397,54.5967],[10.9501,54.3637],[10.9395,54.0087],[11.9563,54.1965],[12.5185,54.4705],[13.6475,54.0755],[14.1197,53.7571],[14.8029,54.0507],[16.3635,54.5133],[17.6229,54.8517],[18.6209,54.6827],[18.6963,54.4387],[19.6607,54.4261],[19.8885,54.8661],[21.2685,55.1905],[21.0559,56.0311],[21.0905,56.7839],[21.5819,57.4119],[22.5245,57.7535],[23.3185,57.0063],[24.1207,57.0257],[24.3129,57.7935],[24.4291,58.3835],[24.0613,58.2575],[23.4267,58.6127],[23.3399,59.1873],[24.6043,59.4659],[25.8643,59.6111],[26.9493,59.4459],[27.9811,59.4755],[29.1177,60.0281],[28.0701,60.5035],[26.2553,60.4239],[24.4967,60.0573],[22.8697,59.8465],[22.2909,60.3919],[21.3223,60.7203],[21.5449,61.7053],[21.0593,62.6075],[21.5361,63.1899],[22.4427,63.8179],[24.7305,64.9023],[25.3981,65.1115],[25.2941,65.5345],[23.9035,66.0069],[22.1833,65.7239],[21.2135,65.0261],[21.3697,64.4137],[19.7789,63.6097],[17.8479,62.7495],[17.1197,61.3413],[17.8315,60.6367],[18.7877,60.0819],[17.8693,58.9539],[16.8293,58.7199],[16.4477,57.0411],[15.8799,56.1043],[14.6667,56.2009],[14.1007,55.4079],[12.9429,55.3619],[12.6251,56.3071],[11.7881,57.4419],[11.0273,58.8561],[10.3567,59.4699],[8.3821,58.3133],[7.0489,58.0789],[5.6659,58.5881],[5.3083,59.6633],[4.9921,61.9711],[5.9129,62.6145],[8.5535,63.4541],[10.5277,64.4861],[12.3583,65.8797],[14.7613,67.8107],[16.4359,68.5633],[19.1841,69.8175],[21.3785,70.2553],[23.0237,70.2021],[24.5467,71.0305],[26.3701,70.9863],[28.1655,71.1855],[31.2935,70.4539],[30.0055,70.1863],[31.1011,69.5581],[32.1327,69.9059],[33.7755,69.3015],[36.5141,69.0635],[40.2925,67.9325],[41.0599,67.4573],[41.1261,66.7917],[40.0159,66.2663],[38.3829,65.9995],[33.9187,66.7597],[33.1845,66.6325],[34.8149,65.9001],[34.9439,64.4145],[36.2313,64.1095],[37.0129,63.8499],[37.1421,64.3347],[36.5177,64.7803],[37.1761,65.1433],[39.5935,64.5209],[40.4357,64.7645],[39.7627,65.4969],[42.0931,66.4763],[43.0161,66.4187],[43.9499,66.0691],[44.5323,66.7563],[43.6985,67.3525],[44.1879,67.9505],[43.4529,68.5709],[46.2501,68.2501],[46.8213,67.6899],[45.5553,67.5665],[45.5621,67.0101],[46.3491,66.6677],[47.8943,66.8845],[48.1387,67.5225],[50.2277,67.9987],[53.7175,68.8575],[54.4717,68.8083],[53.4859,68.2013],[54.7263,68.0971],[55.4427,68.4387],[57.3171,68.4663],[58.8021,68.8809],[59.9415,68.2785],[61.0779,68.9407],[60.0301,69.5201],[60.5501,69.8501],[63.5041,69.5475],[64.8881,69.2349],[68.5121,68.0923],[69.1807,68.6157],[68.1645,69.1443],[68.1353,69.3565],[66.9301,69.4547],[67.2599,69.9287],[66.7249,70.7089],[66.6947,71.0291],[68.5401,71.9345],[69.1963,72.8435],[69.9401,73.0401],[72.5875,72.7763],[72.7961,72.2201],[71.8481,71.4091],[72.4701,71.0903],[72.7919,70.3911],[72.5647,69.0209],[73.6679,68.4079],[73.2387,67.7405],[71.2801,66.3201],[72.4231,66.1727],[72.8207,66.5327],[73.9211,66.7895],[74.1865,67.2843],[75.0521,67.7605],[74.4693,68.3291],[74.9359,68.9893],[73.8423,69.0715],[73.6019,69.6277],[74.3999,70.6319],[73.1011,71.4471],[74.8909,72.1213],[74.6593,72.8323],[75.1581,72.8551],[75.6835,72.3005],[75.2891,71.3357],[76.3591,71.1529],[75.9031,71.8741],[77.5767,72.2673],[79.6521,72.3201],[81.5001,71.7501],[80.6107,72.5829],[80.5111,73.6483],[82.2501,73.8501],[84.6553,73.8059],[86.8223,73.9369],[86.0097,74.4597],[87.1669,75.1165],[88.3157,75.1439],[90.2601,75.6401],[92.9007,75.7733],[93.2343,76.0473],[95.8601,76.1401],[96.6783,75.9155],[98.9225,76.4469],[100.7597,76.4303],[101.0353,76.8619],[101.9909,77.2875],[104.3517,77.6979],[106.0667,77.3739],[104.7051,77.1275],[106.9703,76.9743]],[[49.1103,41.2823],[49.6189,40.5729],[50.0849,40.5263],[50.3929,40.2565],[49.5693,40.1761],[49.3953,39.3995],[49.2233,39.0493],[48.8565,38.8155],[48.8833,38.3203],[49.1997,37.5829],[50.1479,37.3747],[50.8423,36.8729],[52.2641,36.7005],[53.8259,36.9651],[53.9217,37.1989],[53.7355,37.9061],[53.8809,38.9521],[53.1011,39.2907],[53.3579,39.9753],[52.6941,40.0337],[52.9153,40.8765],[53.8583,40.6311],[54.7369,40.9511],[54.0083,41.5513],[53.7217,42.1233],[52.9167,41.8681],[52.8147,41.1355],[52.5025,41.7833],[52.4463,42.0273],[52.6921,42.4439],[52.5015,42.7923],[51.3425,43.1331],[50.8913,44.0311],[50.3391,44.2841],[50.3057,44.6099],[51.2785,44.5149],[51.3169,45.2461],[52.1675,45.4085],[53.0409,45.2591],[53.2209,46.2347],[53.0427,46.8531],[52.0421,46.8047],[51.1921,47.0487],[50.0341,46.6091],[49.1013,46.3995],[48.6455,45.8063],[47.6759,45.6415],[46.6821,44.6093],[47.5909,43.6603],[47.4925,42.9867],[48.5845,41.8089],[49.1103,41.2823]]]}},{"type":"Feature","properties":{},"bbox":[-96.4363,77.4913,-93.7207,77.8346],"geometry":{"type":"Polygon","coordinates":[[[-93.84,77.52],[-94.2956,77.4913],[-96.1697,77.5551],[-96.4363,77.8346],[-94.4226,77.82],[-93.7207,77.6343],[-93.84,77.52]]]}},{"type":"Feature","properties":{},"bbox":[-113.5343,77.4092,-109.8545,78.153],"geometry":{"type":"Polygon","coordinates":[[[-110.1869,77.697],[-112.0512,77.4092],[-113.5343,77.7322],[-112.7246,78.0511],[-111.2644,78.153],[-109.8545,77.9963],[-110.1869,77.697]]]}},{"type":"Feature","properties":{},"bbox":[20.726,77.4449,24.7241,78.4549],"geometry":{"type":"Polygon","coordinates":[[[24.7241,77.8538],[22.4903,77.4449],[20.726,77.677],[21.4161,77.935],[20.8119,78.2546],[22.8843,78.4549],[23.2813,78.0795],[24.7241,77.8538]]]}},{"type":"Feature","properties":{},"bbox":[-112.5421,78.4069,-109.6631,78.85],"geometry":{"type":"Polygon","coordinates":[[[-109.6631,78.602],[-110.8813,78.4069],[-112.5421,78.4079],[-112.5259,78.5506],[-111.5,78.85],[-110.9637,78.8044],[-109.6631,78.602]]]}},{"type":"Feature","properties":{},"bbox":[-98.632,77.8506,-95.5593,78.8719],"geometry":{"type":"Polygon","coordinates":[[[-95.8303,78.0569],[-97.3098,77.8506],[-98.1243,78.0829],[-98.5529,78.4581],[-98.632,78.8719],[-97.3372,78.832],[-96.7544,78.7658],[-95.5593,78.4183],[-95.8303,78.0569]]]}},{"type":"Feature","properties":{},"bbox":[-105.4923,77.9075,-99.6709,79.3016],"geometry":{"type":"Polygon","coordinates":[[[-100.0602,78.3248],[-99.6709,77.9075],[-101.3039,78.019],[-102.9498,78.3432],[-105.1761,78.3803],[-104.2104,78.6774],[-105.4196,78.9183],[-105.4923,79.3016],[-103.5293,79.1653],[-100.8252,78.8005],[-100.0602,78.3248]]]}},{"type":"Feature","properties":{},"bbox":[99.4381,77.921,105.3724,79.3464],"geometry":{"type":"Polygon","coordinates":[[[105.0755,78.3069],[99.4381,77.921],[101.2649,79.234],[102.0863,79.3464],[102.8378,79.2813],[105.3724,78.7133],[105.0755,78.3069]]]}},{"type":"Feature","properties":{},"bbox":[10.4445,76.7704,21.5438,80.0509],"geometry":{"type":"Polygon","coordinates":[[[18.2518,79.7018],[21.5438,78.9561],[19.0274,78.5626],[18.4717,77.8267],[17.5944,77.638],[17.1182,76.8094],[15.9131,76.7704],[13.7626,77.3804],[14.6696,77.7357],[13.1706,78.0249],[11.2223,78.8693],[10.4445,79.6524],[13.1708,80.0105],[13.7185,79.6604],[15.1428,79.6743],[15.5226,80.0161],[16.9908,80.0509],[18.2518,79.7018]]]}},{"type":"Feature","properties":{},"bbox":[17.368,79.4,27.4075,80.6571],"geometry":{"type":"Polygon","coordinates":[[[25.4476,80.4073],[27.4075,80.0564],[25.9247,79.5178],[23.0245,79.4],[20.0752,79.5668],[19.8973,79.8424],[18.4623,79.8599],[17.368,80.3189],[20.456,80.5982],[21.9079,80.3577],[22.9193,80.6571],[25.4476,80.4073]]]}},{"type":"Feature","properties":{},"bbox":[44.847,80.0102,51.5229,80.9189],"geometry":{"type":"Polygon","coordinates":[[[51.1362,80.5473],[49.7937,80.4154],[48.8944,80.3396],[48.7549,80.1755],[47.5861,80.0102],[46.5028,80.2472],[47.0725,80.5594],[44.847,80.5898],[46.7991,80.7719],[48.3185,80.784],[48.5228,80.5146],[49.0972,80.754],[50.0398,80.9189],[51.5229,80.6997],[51.1362,80.5473]]]}},{"type":"Feature","properties":{},"bbox":[91.1811,78.7562,100.1867,81.2504],"geometry":{"type":"Polygon","coordinates":[[[99.9398,78.8809],[97.7579,78.7562],[94.9726,79.0447],[93.3129,79.4265],[92.5454,80.1438],[91.1811,80.3415],[93.7777,81.0246],[95.9409,81.2504],[97.8838,80.747],[100.1867,79.7801],[99.9398,78.8809]]]}},{"type":"Feature","properties":{},"bbox":[-96.7097,78.2153,-85.8144,81.2574],"geometry":{"type":"Polygon","coordinates":[[[-87.02,79.66],[-85.8144,79.3369],[-87.1876,79.0393],[-89.0353,78.2872],[-90.8044,78.2153],[-92.8767,78.3433],[-93.9512,78.751],[-93.9357,79.1137],[-93.1452,79.3801],[-94.974,79.3725],[-96.0761,79.705],[-96.7097,80.1578],[-96.0164,80.6023],[-95.3234,80.9073],[-94.2984,80.9773],[-94.7354,81.2065],[-92.4098,81.2574],[-91.1329,80.7234],[-89.45,80.5093],[-87.81,80.32],[-87.02,79.66]]]}},{"type":"Feature","properties":{},"bbox":[-91.587,76.1781,-61.85,83.2332],"geometry":{"type":"Polygon","coordinates":[[[-68.5,83.1063],[-65.8273,83.028],[-63.68,82.9],[-61.85,82.6286],[-61.8939,82.3616],[-64.334,81.9278],[-66.7534,81.7253],[-67.6576,81.5014],[-65.4803,81.5066],[-67.84,80.9],[-69.4697,80.6168],[-71.18,79.8],[-73.2428,79.6342],[-73.88,79.4302],[-76.9077,79.3231],[-75.5292,79.1977],[-76.2205,79.0191],[-75.3935,78.5258],[-76.3435,78.183],[-77.8885,77.8999],[-78.3627,77.5086],[-79.7595,77.2097],[-79.6196,76.9834],[-77.9109,77.022],[-77.8891,76.778],[-80.5613,76.1781],[-83.1744,76.454],[-86.1118,76.299],[-87.6,76.42],[-89.4907,76.4724],[-89.6161,76.9521],[-87.7674,77.1783],[-88.26,77.9],[-87.65,77.9702],[-84.9763,77.5387],[-86.34,78.18],[-87.9619,78.3718],[-87.152,78.7587],[-85.3787,78.9969],[-85.0949,79.3454],[-86.5073,79.7362],[-86.9318,80.2515],[-84.1984,80.2084],[-83.4087,80.1],[-81.8482,80.4644],[-84.1,80.58],[-87.599,80.5163],[-89.3666,80.8557],[-90.2,81.26],[-91.3679,81.5531],[-91.587,81.8943],[-90.1,82.085],[-88.9323,82.1175],[-86.9702,82.2796],[-85.5,82.6523],[-84.26,82.6],[-83.18,82.32],[-82.42,82.86],[-81.1,83.02],[-79.3066,83.1306],[-76.25,83.1721],[-75.7188,83.064],[-72.8315,83.2332],[-70.6658,83.1698],[-68.5,83.1063]]]}},{"type":"Feature","properties":{},"bbox":[-73.297,60.0368,-12.2086,83.6451],"geometry":{"type":"Polygon","coordinates":[[[-27.1005,83.5197],[-20.8454,82.7267],[-22.6918,82.3417],[-26.5175,82.2977],[-31.9,82.2],[-31.3965,82.0215],[-27.8567,82.1318],[-24.8445,81.787],[-22.9033,82.0932],[-22.0718,81.7345],[-23.1696,81.1527],[-20.6236,81.5246],[-15.7682,81.9125],[-12.7702,81.7189],[-12.2086,81.2915],[-16.2853,80.58],[-16.85,80.35],[-20.0462,80.1771],[-17.7304,80.1291],[-18.9,79.4],[-19.705,78.7513],[-19.6735,77.6386],[-18.4729,76.9857],[-20.035,76.9443],[-21.6794,76.6279],[-19.8341,76.0981],[-19.599,75.2484],[-20.6682,75.1559],[-19.3728,74.2956],[-21.5942,74.2238],[-20.4345,73.8171],[-20.7623,73.4644],[-22.1722,73.3096],[-23.5659,73.3066],[-22.3131,72.6293],[-22.2995,72.1841],[-24.2783,72.5979],[-24.793,72.3302],[-23.443,72.0802],[-22.1328,71.469],[-21.7536,70.6637],[-23.536,70.471],[-24.307,70.8565],[-25.5434,71.4309],[-25.2014,70.7523],[-26.3628,70.2265],[-23.7274,70.184],[-22.349,70.1295],[-25.0293,69.2588],[-27.7474,68.4705],[-30.6737,68.125],[-31.7767,68.1208],[-32.8111,67.7355],[-34.202,66.6797],[-36.3528,65.9789],[-37.0438,65.9377],[-38.3751,65.6921],[-39.8122,65.4585],[-40.669,64.84],[-40.6828,64.139],[-41.1887,63.4825],[-42.8194,62.6823],[-42.4167,61.9009],[-42.8662,61.074],[-43.3784,60.0977],[-44.7875,60.0368],[-46.2636,60.8533],[-48.2629,60.8584],[-49.2331,61.4068],[-49.9004,62.3834],[-51.6332,63.6269],[-52.1401,64.2784],[-52.2766,65.1767],[-53.6617,66.0996],[-53.3016,66.8365],[-53.9691,67.189],[-52.9804,68.3576],[-51.4754,68.7296],[-51.0804,69.1478],[-50.8712,69.9291],[-52.0136,69.5749],[-52.5579,69.4262],[-53.4563,69.2836],[-54.6834,69.61],[-54.75,70.2893],[-54.3588,70.8213],[-53.4313,70.8358],[-51.3901,70.5698],[-53.1094,71.2048],[-54.0042,71.5472],[-55,71.4065],[-55.8347,71.6544],[-54.7182,72.5863],[-55.3263,72.9586],[-56.12,73.6498],[-57.3236,74.7103],[-58.5968,75.0986],[-58.5852,75.5173],[-61.2686,76.1024],[-63.3916,76.1752],[-66.0643,76.1349],[-68.5044,76.0614],[-69.6649,76.3798],[-71.4026,77.0086],[-68.7767,77.3231],[-66.764,77.376],[-71.0429,77.6359],[-73.297,78.0442],[-73.1594,78.4327],[-69.3735,78.9139],[-65.7107,79.3944],[-65.3239,79.7581],[-68.023,80.1172],[-67.1513,80.5158],[-63.6893,81.214],[-62.2344,81.3211],[-62.6512,81.7704],[-60.2825,82.0336],[-57.2074,82.1907],[-54.1344,82.1996],[-53.0433,81.8883],[-50.3906,82.4388],[-48.0039,82.0648],[-46.5998,81.9859],[-44.523,81.6607],[-46.9007,82.1998],[-46.7638,82.628],[-43.4064,83.2252],[-39.8975,83.1802],[-38.6221,83.549],[-35.0879,83.6451],[-27.1005,83.5197]]]}}],"bbox":[-180,-90,180,83.6451]};
// Public device references; ESYair Pro added September 2026. Live API values are never replaced with sample readings.
const DEFAULTS=[
{id:196780,slot:1,name:'ESYair Pro',country:'Switzerland',expectedModel:'O-M-1PPSTON-CE',latitude:46.7802638,longitude:6.6608379},
{id:172350,slot:2,name:'Sir Apollo Kagwa Road',country:'Uganda · Kampala',expectedModel:'O-M-1PPSTON-CE',latitude:0.33354,longitude:32.56861},
{id:189546,slot:3,name:'BANTHI, LAMPHUN',country:'Thailand · Lamphun',expectedModel:'O-M-1PPST-CE',latitude:18.65725,longitude:99.1126667},
{id:189917,slot:4,name:'Sri Jayawardenepura Kotte',country:'Sri Lanka',expectedModel:'O-1PST',latitude:6.906103824237833,longitude:79.90479420041291},
{id:76611,slot:5,name:'Siththimaavaa Hingun',country:'Maldives · Malé',expectedModel:'O-1PS',latitude:4.17278,longitude:73.51027}];
const MODELS={'O-M-1PPSTON-CE':{full:'AirGradient Open Air Max Outdoor Air Quality Monitor',kind:'MAX · O₃ + NO₂ hardware',gas:true},'O-M-1PPST-CE':{full:'AirGradient Open Air Max Outdoor Air Quality Monitor',kind:'MAX · without O₃/NO₂',gas:false},'O-1PST':{full:'AirGradient Open Air Outdoor Air Quality Monitor',kind:'STANDARD OPEN AIR',gas:false},'O-1PS':{full:'AirGradient Open Air Outdoor Air Quality Monitor',kind:'STANDARD OPEN AIR',gas:false}};
const INDIA_PENDING='Unassigned device. Add a verified AirGradient Location ID in Settings.';
const FIELDS={no2:['NO₂ (API reported)','ppb'],o3:['O₃ (API reported)','ppb'],no2WorkingElectrode:['NO₂ working electrode','mV'],no2AuxiliaryElectrode:['NO₂ auxiliary electrode','mV'],o3WorkingElectrode:['O₃ working electrode','mV'],o3AuxiliaryElectrode:['O₃ auxiliary electrode','mV'],afeTemp:['Analog front-end temperature',''],heatindex:['Heat index','°C'],pm02:['PM₂.₅','µg/m³'],pm01:['PM₁','µg/m³'],pm10:['PM₁₀','µg/m³'],pm02_corrected:['PM₂.₅ corrected','µg/m³'],pm01_corrected:['PM₁ corrected','µg/m³'],pm10_corrected:['PM₁₀ corrected','µg/m³'],atmp:['Temperature','°C'],atmp_corrected:['Temperature corrected','°C'],rhum:['Relative humidity','%'],rhum_corrected:['Humidity corrected','%'],rco2:['CO₂','ppm'],rco2_corrected:['CO₂ corrected','ppm'],tvoc:['TVOC (API reported)','ppb'],tvocIndex:['VOC index / firmware value',''],noxIndex:['NOx index / firmware value',''],tvocRaw:['VOC raw signal',''],noxRaw:['NOx raw signal',''],pm003Count:['Particles >0.3 µm','per 0.1 L'],batteryVoltage:['Battery','V'],panelVoltage:['Solar panel','V'],wifi:['Signal strength','dBm'],pres:['Pressure','hPa']};
const META=new Set(['locationId','placeId','latitude','longitude','lat','lng','offline','datapoints','timestamp','model','firmwareVersion','serialno','locationName','publicLocationName','locationType','timezone','publicPlaceName','publicPlaceUrl','publicContributorName']);
const PARAMETER_LEGEND='N/A: unsupported by model · N/D: expected or returned field, no data · —: not reported; support unknown';
const PRIMARY_PARAMETERS=['pm02','pm10','pm01','pm003Count','rco2','no2','o3','atmp','rhum','pres'];
function parameterRows(record,modelCode){
const r=record||{},known=['O-M-1PPSTON-CE','O-M-1PPST-CE','O-1PST','O-1PS'].includes(modelCode);
const gas=modelCode==='O-M-1PPSTON-CE';
const keys=[...new Set([...PRIMARY_PARAMETERS,...Object.keys(r).filter(k=>!META.has(k))])];
return keys.map(key=>{
const field=FIELDS[key],label=key==='pm02'?'PM₂.₅ (raw)':field?.[0]||key,unit=field?.[1]||'',v=r[key];
const present=Object.prototype.hasOwnProperty.call(r,key);
const numericValue=(typeof v==='number'||(typeof v==='string'&&v.trim()!==''))&&Number.isFinite(Number(v));
if(numericValue){const value=Number(v),negative=['no2','o3'].includes(key)&&value<0;return {key,label,text:value.toLocaleString(undefined,{maximumFractionDigits:6})+(unit?' '+unit:(!field||['afeTemp','tvocRaw','noxRaw'].includes(key)?' (unit unspecified)':'')),status:negative?'warning':'value',reason:negative?'Negative gas value reported by API; not a valid physical concentration. Check source/calibration.':''};}
if(!field&&v!==null&&v!==undefined&&v!=='')return {key,label,text:typeof v==='object'?JSON.stringify(v):String(v),status:'value',reason:'Unit unspecified'};
if(known&&!gas&&['no2','o3'].includes(key))return {key,label,text:'N/A',status:'unsupported',reason:'This model has no dedicated NO₂/O₃ sensors'};
const expected=known&&(['pm02','pm10','pm01','pm003Count','atmp','rhum'].includes(key)||(gas&&['no2','o3'].includes(key)));
if(present||expected)return {key,label,text:'N/D',status:'no-data',reason:present?'API field returned without a usable reading':'Expected for this model, but no reading in this response'};
return {key,label,text:'—',status:'unknown',reason:'Not reported in this response; model support has not been established'};
});
}
const BANDS=[[0,9,0,50,'Good','#00e400','#113322'],[9.1,35.4,51,100,'Moderate','#ffff00','#383800'],[35.5,55.4,101,150,'Unhealthy for sensitive groups','#ff7e00','#311700'],[55.5,125.4,151,200,'Unhealthy','#ff0000','#fff'],[125.5,225.4,201,300,'Very unhealthy','#8f3f97','#fff'],[225.5,325.4,301,500,'Hazardous','#7e0023','#fff']];
const $=id=>document.getElementById(id), esc=v=>String(v??'').replace(/[&<>"']/g,c=>({'&':'&','<':'<','>':'>','"':'"',"'":'''}[c]));
const numeric=v=>v!==null&&v!==undefined&&v!==''&&typeof v!=='boolean'&&(typeof v==='number'||typeof v==='string')&&Number.isFinite(Number(v));
function aqi(v){if(!numeric(v)||Number(v)<0)return null;const c=Math.floor(Number(v)*10+1e-9)/10,b=BANDS.find(b=>c<=b[1])||BANDS[5];return {value:Math.round((b[3]-b[2])/(b[1]-b[0])*(c-b[0])+b[2]),label:b[4],color:b[5],fg:b[6]};}
const PREFS_KEY='airgradient-test-api-app-v2.3.0';
function migratePrefs(old){
const result={...old};
if(Array.isArray(old.devices)){
const prior=old.devices.filter(d=>d&&/^[1-9][0-9]{0,11}$/.test(String(d.id)));
const first=prior.find(d=>Number(d.id)===196780)||structuredClone(DEFAULTS[0]);
result.devices=[{...first,id:196780,slot:1},...prior.filter(d=>Number(d.id)!==196780).map((d,i)=>({...d,slot:Number.isInteger(d.slot)?d.slot+1:i+2}))];
}
return result;
}
function loadPrefs(){try{const current=localStorage.getItem(PREFS_KEY);if(current!==null)return JSON.parse(current)||{};return migratePrefs(JSON.parse(localStorage.getItem('airgradient-test-api-app-v2.1.0')||'{}')||{});}catch{return {};}}
const prefs=loadPrefs();
let devices=Array.isArray(prefs.devices)?prefs.devices.filter(d=>d&&/^[1-9][0-9]{0,11}$/.test(String(d.id))).slice(0,41):structuredClone(DEFAULTS);
let selected=devices[0]?.id, period='current', parameter=prefs.parameter||'pm02',basis=prefs.basis==='corrected'?'corrected':'raw',zone=['local','UTC','Asia/Colombo'].includes(prefs.zone)?prefs.zone:'local',interval=[0,180,300,540].includes(prefs.interval)?prefs.interval:180;
let basemap=prefs.basemap==='world'?'world':'streets';
let streetLayer=null,worldLayer=null,mapLoadTimer=null,tileFailures=0,tileSuccesses=0,mapAttempt=0;
const upstreams=new Map();
let map=null,markers=new Map(),records=new Map(),hours=new Map(),errors=new Map(),busy=false,auth=false,nextRefresh=0,timer=null,discovered=[],lastFetch=null;
const localMode=location.protocol!=='file:';
function save(){try{localStorage.setItem(PREFS_KEY,JSON.stringify({devices,parameter,basis,zone,interval,basemap}));}catch{$('storage-warning').textContent='Browser storage is unavailable. Settings will last only for this visit.';}}
function fmt(v){return numeric(v)?Number(v).toLocaleString(undefined,{maximumFractionDigits:1}):'—';}
function timestamp(t){if(!t||!Number.isFinite(Date.parse(t)))return 'No timestamp';return new Date(t).toLocaleString(undefined,{year:'numeric',month:'short',day:'numeric',hour:'2-digit',minute:'2-digit',second:'2-digit',timeZone:zone==='local'?undefined:zone,timeZoneName:'short'});}
function age(t){const delta=(Date.now()-Date.parse(t))/60000;if(!Number.isFinite(delta))return 'Age unknown';if(delta< -1)return 'Future timestamp';return delta<1?'Less than 1 minute ago':delta<120?Math.floor(delta)+' minutes ago':(delta/60).toFixed(1)+' hours ago';}
function datum(id){return period==='current'?records.get(id):hours.get(id)?.[0];}
function pm(d){return d?.[basis==='corrected'?'pm02_corrected':'pm02'];}
function currentValue(d){return parameter==='aqi'?aqi(pm(d))?.value:parameter==='pm02'?pm(d):d?.[parameter];}
function stale(d){const delta=Date.now()-Date.parse(d?.timestamp);return !d||!Number.isFinite(delta)||delta< -60000||delta>(period==='current'?20:120)*60000||d.offline===true;}
function name(d){return records.get(d.id)?.locationName||records.get(d.id)?.publicLocationName||d.name||'Location '+d.id;}
function model(d){return records.get(d.id)?.model||d.expectedModel||'Unassigned';}
function profile(d){return MODELS[model(d)]||{full:'AirGradient device awaiting verification',kind:'UNVERIFIED',gas:false};}
function parameters(d){const r=datum(d.id);return r?Object.entries(r).filter(([k])=>!META.has(k)).map(([k,v])=>(FIELDS[k]?.[0]||k)+(v===null?' (unavailable)':'')).join(' · '):'Parameter list appears after the API responds.';}
function compactParameters(r,modelCode){return '<div class="parameter-values" aria-label="Parameters and values">'+parameterRows(r,modelCode).map(row=>'<div class="parameter-row '+row.status+'" data-field="'+esc(row.key)+'" title="'+esc(row.reason)+'"><span>'+esc(row.label)+'</span><span>'+esc(row.text)+(row.status==='warning'?' ⚠':'')+'</span></div>').join('')+'</div><div class="parameter-legend">'+esc(PARAMETER_LEGEND)+'</div>'+(['no2','o3'].some(k=>numeric(r?.[k])&&Number(r[k])<0)?'<div class="gas-note">⚠ Negative gas value from API; check source/calibration.</div>':'');}
function gasNote(d){if(d.pending)return 'Requested: Max without O₃/NO₂.';if(!profile(d).gas)return 'No dedicated O₃/NO₂ sensors in this model. NOx index is not NO₂ concentration.';const r=datum(d.id)||{};return 'O₃ + NO₂ hardware indicated by model code. '+(['no2','o3'].some(k=>numeric(r[k]))?'API-reported concentrations in ppb; not independently validated. Zero alone does not establish accuracy.':'NO₂ / O₃ concentrations unavailable in this API response.');}
function verify(d,expected){if(!d||typeof d!=='object'||Array.isArray(d)||!MODELS[d.model])throw Error('Not a recognized AirGradient Max / Open Air hardware model. Device was not accepted.');if(expected&&d.model!==expected)throw Error('API model changed from '+expected+' to '+d.model+'. Recheck this device before using it.');}
async function api(path,options={}){if(!localMode)throw Error('Start serve.py and open the local address for live data.');const controller=new AbortController(),timeout=setTimeout(()=>controller.abort(),30000);try{const r=await fetch(path,{...options,signal:controller.signal,cache:'no-store'});let body;try{body=await r.json();}catch{throw Error('Unexpected server response. Use the address printed by serve.py.');}if(!r.ok)throw Error(body.error||'Request failed ('+r.status+')');const upstream=r.headers.get('X-AirGradient-Test-API-Upstream');if(upstream)upstreams.set(path,upstream);return body;}catch(e){if(e.name==='AbortError')throw Error('Request timed out. Try refreshing again.');throw e;}finally{clearTimeout(timeout);}}
function coords(dev){const r=records.get(dev.id)||{};const lat=r.latitude??r.lat??dev.latitude,lon=r.longitude??r.lng??dev.longitude;return numeric(lat)&&numeric(lon)&&Math.abs(+lat)<=90&&Math.abs(+lon)<=180?[+lat,+lon]:null;}
function setBasemap(choice,reason=''){
if(!map)return;
clearTimeout(mapLoadTimer);mapAttempt++;basemap=choice==='world'?'world':'streets';$('basemap').value=basemap;
if(streetLayer){streetLayer.off();map.removeLayer(streetLayer);streetLayer=null;}
if(basemap==='world'){
map.setMaxZoom(7);if(map.getZoom()>7)map.setZoom(7);
$('map-status').textContent=reason||'Built-in world outline · overview only, no street detail';
}else{
map.setMaxZoom(19);tileFailures=0;tileSuccesses=0;const attempt=mapAttempt;
$('map-status').textContent='Loading OpenStreetMap tiles…';
streetLayer=L.tileLayer('https://tile.openstreetmap.org/{z}/{x}/{y}.png',{
maxZoom:19,referrerPolicy:'strict-origin-when-cross-origin',
attribution:'© <a href="https://www.openstreetmap.org/copyright" target="_blank" rel="noopener">OpenStreetMap contributors</a>'
});
streetLayer.on('tileload',()=>{if(attempt!==mapAttempt)return;tileSuccesses++;clearTimeout(mapLoadTimer);$('map-status').textContent='Street map · if a tile says blocked, select Built-in world outline';});
streetLayer.on('tileerror',()=>{if(attempt!==mapAttempt)return;tileFailures++;if(tileFailures>=3&&!tileSuccesses)setBasemap('world','Street tiles unavailable · showing built-in world outline');});
streetLayer.addTo(map);
mapLoadTimer=setTimeout(()=>{if(attempt===mapAttempt&&!tileSuccesses)setBasemap('world','Tile loading timed out · showing built-in world outline');},15000);
}
save();
}
function installCtrlScroll(target){
let accumulated=0,last=0;
target.getContainer().addEventListener('wheel',e=>{
if(!e.ctrlKey&&!e.metaKey){accumulated=0;return;}
e.preventDefault();e.stopPropagation();
const now=Date.now();if(now-last>200)accumulated=0;last=now;
const scale=e.deltaMode===1?20:e.deltaMode===2?400:1;
accumulated+=e.deltaY*scale;
if(Math.abs(accumulated)<60)return;
const direction=accumulated<0?1:-1;accumulated=0;
const zoom=Math.max(target.getMinZoom(),Math.min(target.getMaxZoom(),target.getZoom()+direction));
if(zoom!==target.getZoom())target.setZoomAround(target.mouseEventToContainerPoint(e),zoom,{animate:false});
},{passive:false});
}
function initMap(){
if(!window.L){$('map').innerHTML='<div class="map-error">Map library could not load. Check internet access to unpkg.com, then reload. Measurements remain available below.</div>';$('map-status').textContent='Map library unavailable';return;}
map=L.map('map',{worldCopyJump:true,scrollWheelZoom:false,fadeAnimation:false}).setView([12,65],3);
map.on('resize',()=>map.closePopup());
installCtrlScroll(map);
map.createPane('worldOutline');map.getPane('worldOutline').style.zIndex=190;
worldLayer=L.geoJSON(WORLD_LAND,{pane:'worldOutline',interactive:false,style:{fillColor:'#e4eddd',fillOpacity:1,color:'#a8beb4',weight:0.8},attribution:'<a href="https://www.naturalearthdata.com/" target="_blank" rel="noopener">Natural Earth</a> · public-domain land outlines'}).addTo(map);
setBasemap(localMode?basemap:'world');
}
$('basemap').onchange=e=>setBasemap(e.target.value);
function fit(){if(map){const points=devices.map(coords).filter(Boolean);if(points.length)map.fitBounds(points,{padding:[65,65],maxZoom:12});}}
function parameterOptions(){const prior=parameter,keys=new Set(['pm02','aqi',...Object.keys(FIELDS)]);for(const d of [...records.values(),...Array.from(hours.values()).flat()])for(const [k,v]of Object.entries(d))if(!META.has(k)&&numeric(v))keys.add(k);$('parameter').innerHTML=[...keys].map(k=>'<option value="'+esc(k)+'">'+esc(k==='aqi'?'PM₂.₅ AQI estimate':FIELDS[k]?.[0]||k+' · API field')+'</option>').join('');parameter=keys.has(prior)?prior:'pm02';$('parameter').value=parameter;}
function configurePopup(popup){popup.options.maxHeight=Math.max(120,Math.min(350,map.getSize().y-80));popup.options.maxWidth=Math.min(330,map.getSize().x-110);popup.options.autoPanPaddingTopLeft=L.point(42,12);popup.options.autoPanPaddingBottomRight=L.point(12,12);}
function renderMap(){if(!map)return;for(const marker of markers.values())marker.remove();markers.clear();devices.forEach(dev=>{const pos=coords(dev);if(!pos)return;const d=datum(dev.id),q=aqi(pm(d)),v=currentValue(d),isOld=stale(d)||errors.has(dev.id),tone=q?.color||'#dce6ed',fg=q?.fg||'#345';const subtitle=parameter==='aqi'?'PM₂.₅ '+fmt(pm(d))+' µg/m³':'AQI est. '+(q?.value??'—')+(parameter==='pm02'?'':' · PM₂.₅ '+fmt(pm(d)));const mapUnit=parameter==='aqi'?'AQI est.':FIELDS[parameter]?.[1]||parameter;const html='<div class="pin '+(isOld?'old':'')+'" style="--tone:'+tone+';--fg:'+fg+'">'+'<div class="pin-name">'+esc(name(dev))+'</div>'+esc(fmt(v))+' <span style="font-size:10px">'+esc(mapUnit)+'</span><small>'+esc(subtitle)+'</small></div>';const marker=L.marker(pos,{icon:L.divIcon({html,className:'',iconSize:[150,73],iconAnchor:[75,73]}),title:name(dev)+' · '+fmt(v),keyboard:true}).addTo(map);marker.bindPopup(layer=>{configurePopup(layer.getPopup());return '<strong>'+esc(name(dev))+'</strong><div class="small"><strong>PM₂.₅ '+fmt(pm(d))+' µg/m³ · AQI est. '+(q?.value??'—')+'</strong><br>'+esc(basis)+' · '+esc(period==='current'?'Latest reading':'Latest API 1h bucket')+'</div><div class="parameter-hint">Parameters · scroll for the full list</div>'+compactParameters(d,model(dev))+'<div class="small">'+esc(timestamp(d?.timestamp))+'<br>'+esc(model(dev))+' · #'+dev.id+'</div>'+(isOld?'<div class="small"><strong>Stale / unavailable / retrieval issue</strong></div>':'');},{maxWidth:330,maxHeight:350});marker.on('click',()=>{select(dev.id,false);markers.get(dev.id)?.openPopup();});markers.set(dev.id,marker);});}
function render(updateMap=true){parameterOptions();$('slot-note').textContent='Default selection: ESYair Pro in Switzerland, gas-equipped Max in Uganda, Max in Thailand, Open Air in Sri Lanka and Malé. Cards and map popups list parameters and values. N/A = unsupported; N/D = no data; — = not reported, support unknown. Zero is kept as reported.';
$('slot-note').className='notice';
$('stations').innerHTML=devices.map((dev,i)=>{const d=datum(dev.id),q=aqi(pm(d));return '<button class="station '+(dev.id===selected?'selected ':'')+(dev.pending?'pending':'')+'" data-select="'+dev.id+'"><span class="pill">'+(dev.slot||i+1)+' / '+esc(dev.pending?'PENDING INDIA':profile(dev).kind)+'</span><h3>'+esc(name(dev))+'</h3><div class="country">'+esc(dev.country||'See API coordinates')+'</div><div class="card-meta">'+esc(dev.pending?'AirGradient Open Air Max — device needed':profile(dev).full)+'</div><div class="card-meta">'+esc(model(dev))+(dev.pending?'':' · #'+dev.id)+'</div>'+(dev.pending?'<p class="small" style="margin-top:16px">Awaiting a verified Indian Max. No device or location has been invented.</p>':'<div class="readings"><div><span class="big mono">'+fmt(pm(d))+'</span> <span class="small muted">µg/m³</span><div class="small muted">PM₂.₅ · '+esc(basis)+'</div></div><div class="aqi-chip" style="--tone:'+(q?.color||'#edf1f4')+';--fg:'+(q?.fg||'#345')+'"><strong>'+(q?.value??'—')+'</strong><small>AQI estimate</small></div></div><div class="small">'+esc(q?.label||'AQI unavailable')+'</div><div class="card-meta">'+esc(d?age(d.timestamp):'Waiting for data')+(d&&stale(d)?' · STALE':'')+'</div>')+(!dev.pending?compactParameters(d,model(dev)):'')+(errors.has(dev.id)?'<div class="card-meta error">'+esc(errors.get(dev.id))+'</div>':'')+'<div class="card-meta">Select for full details ↓</div></button>';}).join('')||'<div class="empty">Add a Location ID in Settings.</div>';
if(updateMap)renderMap();renderLocations();renderDetail();renderManaged();updateStatus();}
function vendorURL(dev){const p=coords(dev);return p?'https://www.airgradient.com/map/?lat='+p[0]+'&long='+p[1]+'&zoom=13&meas=pm02':'https://www.airgradient.com/map/';}
function renderLocations(){
const base='https://api.airgradient.com/public/api/v1/';
const rows=devices.map(dev=>{if(dev.pending)return '<tr><td><strong>3 / India — pending</strong><div>Requested: AirGradient Open Air Max without O₃/NO₂</div></td><td colspan=4>'+esc(INDIA_PENDING)+'</td></tr>';const r=records.get(dev.id),d=datum(dev.id),p=coords(dev),current=base+'world/locations/'+dev.id+'/measures/current',hourly=base+'locations/'+dev.id+'/measures/buckets/60',apiPath=period==='current'?current:hourly;
const meta=[['Public location name',r?.publicLocationName],['Location type',r?.locationType],['Serial number',r?.serialno],['Firmware',r?.firmwareVersion],['Place ID',r?.placeId],['Public place',r?.publicPlaceName],['Contributor',r?.publicContributorName],['Contributor URL (reported)',r?.publicPlaceUrl],['Vendor timezone',r?.timezone]].map(([k,v])=>'<div>'+esc(k)+': '+esc(v??'Not supplied')+'</div>').join('');
return '<tr><td><div><strong>'+esc(dev.slot||'Extra')+' / '+esc(dev.country||'API location')+'</strong></div><button data-table-select="'+dev.id+'" style="font-size:13px;padding:5px 8px;text-align:left">'+esc(name(dev))+'</button><div>Location ID: '+dev.id+'</div><div>'+esc(profile(dev).full)+'</div><div>'+esc(model(dev))+'</div><p class="gas-note">'+esc(gasNote(dev))+'</p><p class="param-list"><strong>Parameters:</strong> '+esc(parameters(dev))+'</p><details><summary style="font-size:13px">More location metadata</summary>'+meta+'</details></td><td>'+(p?p.map(n=>n.toFixed(6)).join(', '):'Not supplied')+'<div>'+(r?'API-reported coordinates':'Initial reference coordinates; awaiting API')+'</div><a href="'+esc(vendorURL(dev))+'" target="_blank" rel="noopener noreferrer">Vendor map at location ↗</a></td><td>'+esc(timestamp(d?.timestamp))+'<div>'+esc(d?age(d.timestamp):'No measurement received')+'</div><div>'+esc(d?(stale(d)?'Stale / timestamp issue':'Within freshness threshold'):'Unavailable')+'</div><div>API offline flag: '+esc(r?.offline??'Not supplied')+'</div><div class="error">'+esc(errors.get(dev.id)||'')+'</div></td><td><a href="'+current+'" target="_blank" rel="noopener noreferrer">Public current JSON ↗</a><br><a href="/api/current?id='+dev.id+'" target="_blank" rel="noopener noreferrer">Local current JSON ↗</a><br><a href="/api/hourly?id='+dev.id+'" target="_blank" rel="noopener noreferrer">Local hourly JSON ↗</a><details><summary style="font-size:13px">Exact endpoint templates</summary><div class="code">GET '+esc(current)+'</div><div class="code">GET '+esc(base+'locations/'+dev.id+'/measures/current?token=YOUR_TOKEN')+'</div><div class="code">GET '+esc(hourly+'?token=YOUR_TOKEN')+'</div></details></td><td><div>Public current: no API key needed</div><div>Authenticated fallback / history: '+(auth?'token configured (hidden)':'not configured')+'</div><div>Last successful upstream: '+esc(upstreams.get('/api/'+(period==='current'?'current':'hourly')+'?id='+dev.id)||'Not fetched')+'</div><div>Method: GET · response: JSON</div><div>Period: '+(period==='current'?'latest reading':'1-hour API bucket')+'</div><div>Refresh: '+(interval?interval/60+' minutes':'manual')+'</div><div>PM₂.₅ / AQI input: '+esc(basis)+'</div><div>Display timezone: '+esc(zone==='local'?'browser local':zone)+'</div><div>Launcher cache: current 30 s; hourly 180 s</div><div>Timeout: upstream 25 s; page 30 s</div></td></tr>';
}).join('');
$('location-table').innerHTML='<table class="location-table" style="font-size:12px;min-width:1050px"><thead><tr><th>Actual location / device</th><th>Coordinates / map</th><th>Measurement time / status</th><th>Data links / endpoints</th><th>API access / settings used</th></tr></thead><tbody>'+rows+'</tbody></table>';
}
$('location-table').onclick=e=>{const b=e.target.closest('[data-table-select]');if(b){select(b.dataset.tableSelect);$('detail').scrollIntoView({behavior:'smooth',block:'start'});}};
function renderDetail(){const dev=devices.find(d=>d.id===selected);if(!dev){$('detail').innerHTML='<div class="empty">Select or add a device to inspect its measurements.</div>';return;}if(dev.pending){$('raw-link').hidden=true;$('vendor-location').href='https://www.airgradient.com/map/';$('detail').innerHTML='<h2>Slot 3 · India Max pending</h2><p class="notice warn">'+esc(INDIA_PENDING)+'</p>';return;}$('raw-link').hidden=false;const d=datum(dev.id),r=records.get(dev.id)||{},pos=coords(dev);$('raw-link').href='https://api.airgradient.com/public/api/v1/world/locations/'+dev.id+'/measures/current';$('vendor-location').href=pos?'https://www.airgradient.com/map/?lat='+pos[0]+'&long='+pos[1]+'&zoom=13&meas=pm02':'https://www.airgradient.com/map/';
const tiles=[[basis==='corrected'?'pm02_corrected':'pm02','PM₂.₅'],['pm01','PM₁'],['pm10','PM₁₀'],['rco2','CO₂'],['atmp','Temperature'],['rhum','Humidity'],['no2','NO₂'],['o3','O₃']].map(([k,title])=>'<div class="tile"><label>'+title+'</label><div class="value mono">'+fmt(d?.[k])+' <span class="unit">'+esc(FIELDS[k]?.[1]||'')+'</span></div></div>').join('');
const entries=d?Object.entries(d):[];const rows=entries.map(([k,v])=>'<tr><td>'+esc(FIELDS[k]?.[0]||k)+'</td><td class="code">'+esc(k)+'</td><td>'+esc(v===null?'Unavailable':typeof v==='object'?JSON.stringify(v):v)+'</td><td>'+esc(FIELDS[k]?.[1]||'—')+'</td></tr>').join('');
$('detail').innerHTML='<div class="detail-head"><div><div class="eyebrow" style="color:var(--teal)">Device detail / '+dev.id+'</div><h2>'+esc(name(dev))+'</h2><p>'+esc(model(dev))+'</p></div><div class="small muted">'+esc(period==='current'?'Latest reading':'Latest API 1h bucket')+'<br>'+esc(timestamp(d?.timestamp))+'</div></div>'+(errors.has(dev.id)?'<div class="notice warn">'+esc(errors.get(dev.id))+(d?' Previous response retained; it is not a fresh retrieval.':'')+'</div>':'')+'<div class="notice"><strong>'+esc(profile(dev).full)+' · '+esc(model(dev))+'</strong><p>'+esc(gasNote(dev))+'</p><p class="small">Model identity: '+(records.has(dev.id)?'confirmed from current API metadata':'reference model; awaiting API verification')+'. '+esc(dev.country||'Location per API coordinates')+'.</p></div>'+(['no2','o3'].some(k=>numeric(d?.[k])&&Number(d[k])<0)?'<p class="notice warn">Negative gas value reported by API; not a valid physical concentration. Check source/calibration.</p>':'')+tiles+(period==='hourly'?'<p class="small muted">Latest returned hourly bucket; completeness and timestamp boundary convention are not confirmed by this demo. '+(numeric(d?.datapoints)?'API datapoints: '+d.datapoints+'.':'')+'</p><div id="hourly-history"></div>':'')+'<details open><summary>All returned parameters & metadata ('+entries.length+')</summary><div class="table-wrap"><table><thead><tr><th>Parameter</th><th>API field</th><th>Value</th><th>Unit</th></tr></thead><tbody>'+rows+'</tbody></table></div>'+(!d?'<p class="empty">No data for this period yet.</p>':'')+'</details><details><summary>Original API response</summary><pre>'+esc(JSON.stringify(d||{},null,2))+'</pre></details>';
if(period==='hourly')renderHistory();}
function renderHistory(){const data=hours.get(selected)||[],points=data.slice(0,24).reverse().filter(d=>numeric(pm(d))&&Number.isFinite(Date.parse(d.timestamp)));if(points.length<2){$('hourly-history').innerHTML='<p class="small muted">Hourly trend appears when at least two valid buckets are available.</p>';return;}const vals=points.map(pm).map(Number),max=Math.max(...vals,1),times=points.map(d=>Date.parse(d.timestamp)),span=Math.max(...times)-Math.min(...times)||1;const path=points.map((d,i)=>(i?'L':'M')+(8+(times[i]-Math.min(...times))/span*784).toFixed(1)+','+(80-Number(pm(d))/max*70).toFixed(1)).join(' ');$('hourly-history').innerHTML='<svg id="hourly-chart" viewBox="0 0 800 90" role="img" aria-label="PM2.5 in up to 24 returned hourly buckets; missing buckets may create gaps in time"><path d="'+path+'" fill="none" stroke="#087f75" stroke-width="3"/></svg><p class="small muted">PM₂.₅, '+esc(basis)+' · '+points.length+' available hourly buckets · '+esc(timestamp(points[0].timestamp))+' to '+esc(timestamp(points.at(-1).timestamp))+'</p>';}
function select(id,focus=true){selected=Number(id);render(focus);if(focus&&map){const d=devices.find(d=>d.id===selected),pos=d&&coords(d);if(pos){map.setView(pos,Math.max(map.getZoom(),8));markers.get(selected)?.openPopup();}}}
function updateStatus(){const configured=devices.filter(d=>!d.pending).length,pending=devices.length-configured,valid=devices.filter(d=>datum(d.id)).length,failed=errors.size;const next=nextRefresh?Math.max(0,Math.ceil((nextRefresh-Date.now())/1000)):0;$('status').textContent=busy?'Requesting AirGradient data…':valid+'/'+configured+' responses'+(pending?' · '+pending+' pending slot':'')+(failed?' · '+failed+' retrieval issue'+(failed>1?'s':''):'')+(lastFetch?' · checked '+lastFetch.toLocaleTimeString([], {hour:'2-digit',minute:'2-digit'}):'')+(interval?' · refresh in '+Math.floor(next/60)+':'+String(next%60).padStart(2,'0'):' · manual refresh');}
function schedule(){clearTimeout(timer);nextRefresh=interval?Date.now()+interval*1000:0;if(interval)timer=setTimeout(refresh,interval*1000);updateStatus();}
async function refresh(){if(busy)return;busy=true;$('refresh').disabled=true;errors.clear();updateStatus();const requestedPeriod=period;await Promise.allSettled(devices.map(async dev=>{if(dev.pending)return;try{const cur=await api('/api/current?id='+dev.id);if(!cur||typeof cur!=='object'||Array.isArray(cur))throw Error('Unexpected current-data response.');verify(cur,dev.expectedModel);records.set(dev.id,cur);if(requestedPeriod==='hourly'){const rows=await api('/api/hourly?id='+dev.id);if(!Array.isArray(rows))throw Error('Unexpected hourly-data response.');const sorted=rows.filter(r=>r&&Number.isFinite(Date.parse(r.timestamp))).sort((a,b)=>Date.parse(b.timestamp)-Date.parse(a.timestamp));if(!sorted.length)throw Error('No hourly data returned for this location.');hours.set(dev.id,sorted);}}catch(e){errors.set(dev.id,e.message);}}));busy=false;lastFetch=new Date();$('refresh').disabled=false;render();schedule();}
function renderManaged(){$('managed').innerHTML=devices.map(d=>'<div class="mini-row"><span>'+esc(name(d))+' <small class="muted">'+(d.pending?'Unassigned':'#'+d.id)+'</small></span><button data-remove="'+d.id+'" aria-label="Remove '+esc(name(d))+'">Remove</button></div>').join('');}
async function add(id,seed){id=Number(id);if(!Number.isSafeInteger(id)||id<=0||String(id).length>12)throw Error('Enter a valid numeric Location ID.');if(devices.some(d=>d.id===id))throw Error('That device is already on your map.');if(devices.length>=41)throw Error('This demonstration supports up to 41 devices.');const d=seed||await api('/api/current?id='+id);verify(d);devices.push({id,name:d.locationName||'Location '+id,expectedModel:d.model,latitude:d.latitude,longitude:d.longitude});records.set(id,d);selected=id;save();render();fit();if(period==='hourly')await refresh();}
async function setToken(token){const s=await api('/api/token',{method:'POST',headers:{'Content-Type':'application/json'},body:JSON.stringify({token})});auth=s.authenticated;hours.clear();$('token').value='';$('auth-status').textContent=auth?'Token configured in launcher memory. Location permissions are checked when hourly data is requested.':'No token configured.';render();if(period==='hourly')await refresh();}
$('legend').innerHTML=BANDS.map(b=>'<span title="'+esc(b[4])+'"><i style="background:'+b[5]+'"></i>'+b[2]+'–'+(b[3]===500?'500+':b[3])+'</span>').join('');
$('parameter').onchange=e=>{parameter=e.target.value;save();render();};$('basis').value=basis;$('basis').onchange=e=>{basis=e.target.value;save();render();};
$('period').onchange=async e=>{if(busy){e.target.value=period;return;}period=e.target.value;render();if(period==='hourly'&&!auth){$('settings').showModal();$('settings-message').textContent='Hourly API data needs a token authorized for your selected locations. Public current readings remain available.';}await refresh();};
$('refresh').onclick=refresh;$('fit').onclick=fit;$('settings-open').onclick=()=>$('settings').showModal();$('settings-close').onclick=()=>$('settings').close();
$('interval').value=interval;$('interval').onchange=e=>{interval=+e.target.value;save();schedule();};$('timezone').value=zone;$('timezone').onchange=e=>{zone=e.target.value;save();render();};
$('stations').onclick=e=>{const b=e.target.closest('[data-select]');if(b)select(b.dataset.select);};
$('managed').onclick=e=>{const b=e.target.closest('[data-remove]');if(!b)return;if(busy){$('settings-message').textContent='Wait for the current refresh to finish.';return;}const id=+b.dataset.remove;devices=devices.filter(d=>d.id!==id);records.delete(id);hours.delete(id);errors.delete(id);if(selected===id)selected=devices[0]?.id;save();render();fit();};
$('add-form').onsubmit=async e=>{e.preventDefault();if(busy){$('settings-message').textContent='Wait for the current refresh to finish.';return;}const button=e.submitter;button.disabled=true;$('settings-message').textContent='Checking device…';try{await add($('new-id').value);$('new-id').value='';$('settings-message').textContent='Device added.';}catch(e){$('settings-message').textContent=e.message;}finally{button.disabled=false;}};
$('reset').onclick=()=>{if(busy)return;devices=structuredClone(DEFAULTS);selected=devices[0].id;records.clear();hours.clear();errors.clear();save();render();fit();refresh();};
$('discover').onclick=async()=>{$('discover').disabled=true;$('discovery').textContent='Finding recognized AirGradient devices…';try{discovered=await api('/api/discover');discovered.sort((a,b)=>(a.offline===true)-(b.offline===true)||String(a.locationName).localeCompare(String(b.locationName)));$('discovery').innerHTML='<label class="small">Search AirGradient locations <input id="discovery-search" placeholder="Name or Location ID" style="width:100%;margin:8px 0"></label><div id="discovery-results"></div>';const list=()=>{const q=$('discovery-search').value.toLowerCase();$('discovery-results').innerHTML=discovered.filter(d=>(d.locationName+' '+d.locationId+' '+d.model).toLowerCase().includes(q)).slice(0,80).map(d=>'<div class="mini-row"><span>'+esc(d.locationName)+' <small>'+esc(d.model)+' · #'+d.locationId+(d.offline?' · offline':'')+'</small></span><button data-add="'+d.locationId+'" '+(devices.some(x=>x.id===d.locationId)?'disabled':'')+'>Add</button></div>').join('')||'<p>No matching AirGradient devices.</p>';};$('discovery-search').oninput=list;list();}catch(e){$('discovery').textContent=e.message;}finally{$('discover').disabled=false;}};
$('discovery').onclick=async e=>{const b=e.target.closest('[data-add]');if(!b)return;if(busy){$('settings-message').textContent='Wait for the current refresh to finish.';return;}b.disabled=true;try{await add(b.dataset.add,discovered.find(d=>d.locationId===+b.dataset.add));$('settings-message').textContent='Device added.';}catch(e){b.disabled=false;$('settings-message').textContent=e.message;}};
$('token-form').onsubmit=async e=>{e.preventDefault();if(busy){$('settings-message').textContent='Wait for the current refresh to finish.';return;}try{await setToken($('token').value);}catch(e){$('auth-status').textContent=e.message;}};$('clear-token').onclick=async()=>{if(busy){$('settings-message').textContent='Wait for the current refresh to finish.';return;}try{await setToken('');}catch(e){$('auth-status').textContent=e.message;}};
$('base-form').onsubmit=async e=>{e.preventDefault();if(busy)return;const b=e.submitter;b.disabled=true;try{const id=Number($('base-id').value);if(!Number.isSafeInteger(id)||id<=0||String(id).length>12)throw Error('Enter a valid Location ID.');if(devices.some(d=>d.id===id&&d.slot!==3))throw Error('This device is already assigned.');const r=await api('/api/current?id='+id);verify(r,'O-M-1PPST-CE');const dev={id,slot:3,name:r.locationName||'Location '+id,country:DEFAULTS.find(d=>d.id===id)?.country||'See API coordinates',expectedModel:r.model,latitude:r.latitude,longitude:r.longitude},at=devices.findIndex(d=>d.slot===3);if(at>=0){const old=devices[at].id;records.delete(old);hours.delete(old);errors.delete(old);devices[at]=dev;}else devices.splice(Math.min(2,devices.length),0,dev);records.set(id,r);selected=id;save();render();fit();$('settings-message').textContent='Slot 3 configured; Max model verified against API.';if(period==='hourly')await refresh();}catch(e){$('settings-message').textContent=e.message;}finally{b.disabled=false;}};
initMap();render();fit();if(!localMode){$('startup').style.display='block';interval=0;devices.filter(d=>!d.pending).forEach(d=>errors.set(d.id,'Start the companion launcher to connect.'));render();}else{api('/api/status').then(s=>{auth=s.authenticated;$('auth-status').textContent=auth?'Token already configured in launcher memory.':'No token configured.';}).catch(()=>{});refresh();}
setInterval(()=>{updateStatus();},1000);setInterval(()=>{if(!busy)render();},60000);
// Optional page-scoped agent tool: reads exactly the state visible in this page.
if(document.modelContext?.registerTool){const life=new AbortController();try{Promise.resolve(document.modelContext.registerTool({name:'read_airgradient_test_api_app',description:'Read displayed AirGradient Max and Open Air measurements, period, source and retrieval issues.',inputSchema:{type:'object',properties:{},additionalProperties:false},annotations:{readOnlyHint:true,untrustedContentHint:true},execute:input=>{if(input&&Object.keys(input).length)throw Error('No arguments accepted.');return {period,basis,devices:devices.map(d=>({id:d.id,name:name(d),reading:datum(d.id)||null,aqiEstimate:aqi(pm(datum(d.id))),error:errors.get(d.id)||null}))};}},{signal:life.signal})).catch(()=>{});window.addEventListener('pagehide',()=>life.abort(),{once:true});}catch{}}
</script>
</body>
</html>