isard 1.1.0 → 1.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (254) hide show
  1. package/CHANGELOG.md +121 -0
  2. package/README.md +44 -39
  3. package/dist/basemap/basemaps.d.ts +1 -1
  4. package/dist/basemap/basemaps.js +2 -2
  5. package/dist/basemap/basemaps.js.map +1 -1
  6. package/dist/basemap/grid.d.ts +5 -5
  7. package/dist/basemap/grid.js +59 -65
  8. package/dist/basemap/grid.js.map +1 -1
  9. package/dist/basemap/mvt.d.ts +1 -1
  10. package/dist/basemap/mvt.js +6 -6
  11. package/dist/basemap/mvt.js.map +1 -1
  12. package/dist/basemap/pmtiles.d.ts +10 -10
  13. package/dist/basemap/pmtiles.js +39 -31
  14. package/dist/basemap/pmtiles.js.map +1 -1
  15. package/dist/basemap/pmtileslayer.d.ts +33 -0
  16. package/dist/basemap/pmtileslayer.js +97 -0
  17. package/dist/basemap/pmtileslayer.js.map +1 -0
  18. package/dist/basemap/resample.d.ts +2 -2
  19. package/dist/basemap/resample.js +16 -14
  20. package/dist/basemap/resample.js.map +1 -1
  21. package/dist/basemap/terrain.d.ts +3 -3
  22. package/dist/basemap/terrain.js +6 -6
  23. package/dist/basemap/terrain.js.map +1 -1
  24. package/dist/basemap/trees.d.ts +26 -0
  25. package/dist/basemap/trees.js +141 -0
  26. package/dist/basemap/trees.js.map +1 -0
  27. package/dist/basemap/vectorstyle.d.ts +22 -10
  28. package/dist/basemap/vectorstyle.js +163 -110
  29. package/dist/basemap/vectorstyle.js.map +1 -1
  30. package/dist/basemap/vectortiles.d.ts +70 -47
  31. package/dist/basemap/vectortiles.js +480 -358
  32. package/dist/basemap/vectortiles.js.map +1 -1
  33. package/dist/basemap/wmts.d.ts +3 -3
  34. package/dist/basemap/wmts.js +16 -11
  35. package/dist/basemap/wmts.js.map +1 -1
  36. package/dist/basemap/workerpool.d.ts +17 -0
  37. package/dist/basemap/workerpool.js +194 -0
  38. package/dist/basemap/workerpool.js.map +1 -0
  39. package/dist/basemap.worker.js +2 -2
  40. package/dist/basemap.worker.js.map +21 -13
  41. package/dist/bind/layers.d.ts +13 -4
  42. package/dist/bind/layers.js +64 -40
  43. package/dist/bind/layers.js.map +1 -1
  44. package/dist/data/crs.d.ts +10 -10
  45. package/dist/data/crs.js +38 -34
  46. package/dist/data/crs.js.map +1 -1
  47. package/dist/data/gpx.d.ts +1 -1
  48. package/dist/data/gpx.js +20 -20
  49. package/dist/data/gpx.js.map +1 -1
  50. package/dist/data/kml.d.ts +1 -1
  51. package/dist/data/kml.js +42 -39
  52. package/dist/data/kml.js.map +1 -1
  53. package/dist/data/topojson.d.ts +1 -1
  54. package/dist/data/topojson.js +15 -10
  55. package/dist/data/topojson.js.map +1 -1
  56. package/dist/data/xml.d.ts +5 -5
  57. package/dist/data/xml.js +19 -18
  58. package/dist/data/xml.js.map +1 -1
  59. package/dist/decoder.worker.js +4 -4
  60. package/dist/decoder.worker.js.map +6 -6
  61. package/dist/engine/decoders.d.ts +2 -2
  62. package/dist/engine/decoders.js +28 -25
  63. package/dist/engine/decoders.js.map +1 -1
  64. package/dist/engine/loader.js +13 -14
  65. package/dist/engine/loader.js.map +1 -1
  66. package/dist/engine/requests.d.ts +1 -1
  67. package/dist/engine/requests.js +19 -16
  68. package/dist/engine/requests.js.map +1 -1
  69. package/dist/engine-loader.d.ts +13 -9
  70. package/dist/engine-loader.js +38 -28
  71. package/dist/engine-loader.js.map +1 -1
  72. package/dist/geoplateforme.d.ts +26 -10
  73. package/dist/geoplateforme.js +45 -20
  74. package/dist/geoplateforme.js.map +1 -1
  75. package/dist/index.d.ts +12 -4
  76. package/dist/index.js +9 -2
  77. package/dist/index.js.map +1 -1
  78. package/dist/isard_bg.wasm +0 -0
  79. package/dist/isard_core_bg.wasm +0 -0
  80. package/dist/isard_points_bg.wasm +0 -0
  81. package/dist/isard_tess_bg.wasm +0 -0
  82. package/dist/layers/extrusions.d.ts +1 -1
  83. package/dist/layers/extrusions.js +10 -5
  84. package/dist/layers/extrusions.js.map +1 -1
  85. package/dist/layers/features.d.ts +10 -10
  86. package/dist/layers/features.js +41 -42
  87. package/dist/layers/features.js.map +1 -1
  88. package/dist/layers/glyphs.d.ts +3 -3
  89. package/dist/layers/glyphs.js +34 -40
  90. package/dist/layers/glyphs.js.map +1 -1
  91. package/dist/layers/icons.d.ts +8 -8
  92. package/dist/layers/icons.js +76 -68
  93. package/dist/layers/icons.js.map +1 -1
  94. package/dist/layers/layers.d.ts +1 -1
  95. package/dist/layers/layers.js +42 -29
  96. package/dist/layers/layers.js.map +1 -1
  97. package/dist/layers/panoramas.d.ts +2 -2
  98. package/dist/layers/panoramas.js +52 -41
  99. package/dist/layers/panoramas.js.map +1 -1
  100. package/dist/layers/pointclouds.d.ts +3 -3
  101. package/dist/layers/pointclouds.js +25 -33
  102. package/dist/layers/pointclouds.js.map +1 -1
  103. package/dist/layers/symbols.d.ts +1 -1
  104. package/dist/layers/symbols.js +68 -71
  105. package/dist/layers/symbols.js.map +1 -1
  106. package/dist/layers/vectors.d.ts +60 -0
  107. package/dist/layers/vectors.js +130 -0
  108. package/dist/layers/vectors.js.map +1 -0
  109. package/dist/map/basemap-layers.d.ts +26 -0
  110. package/dist/map/basemap-layers.js +61 -0
  111. package/dist/map/basemap-layers.js.map +1 -0
  112. package/dist/map/canvas.d.ts +17 -0
  113. package/dist/map/canvas.js +56 -0
  114. package/dist/map/canvas.js.map +1 -0
  115. package/dist/map/checks.d.ts +11 -0
  116. package/dist/map/checks.js +39 -0
  117. package/dist/map/checks.js.map +1 -0
  118. package/dist/map/credits.d.ts +17 -0
  119. package/dist/map/credits.js +34 -0
  120. package/dist/map/credits.js.map +1 -0
  121. package/dist/map/engine-settings.d.ts +15 -0
  122. package/dist/map/engine-settings.js +45 -0
  123. package/dist/map/engine-settings.js.map +1 -0
  124. package/dist/map/engines.d.ts +41 -0
  125. package/dist/map/engines.js +77 -0
  126. package/dist/map/engines.js.map +1 -0
  127. package/dist/map/events.d.ts +14 -0
  128. package/dist/map/events.js +46 -0
  129. package/dist/map/events.js.map +1 -0
  130. package/dist/map/frame-loop.d.ts +64 -0
  131. package/dist/map/frame-loop.js +145 -0
  132. package/dist/map/frame-loop.js.map +1 -0
  133. package/dist/map/hover-pick.d.ts +30 -0
  134. package/dist/map/hover-pick.js +56 -0
  135. package/dist/map/hover-pick.js.map +1 -0
  136. package/dist/map/layer-spec.d.ts +42 -0
  137. package/dist/map/layer-spec.js +34 -0
  138. package/dist/map/layer-spec.js.map +1 -0
  139. package/dist/map/layer-stack.d.ts +36 -0
  140. package/dist/map/layer-stack.js +101 -0
  141. package/dist/map/layer-stack.js.map +1 -0
  142. package/dist/map/overlay-host.d.ts +36 -0
  143. package/dist/map/overlay-host.js +101 -0
  144. package/dist/map/overlay-host.js.map +1 -0
  145. package/dist/map/panorama-host.d.ts +5 -0
  146. package/dist/map/panorama-host.js +32 -0
  147. package/dist/map/panorama-host.js.map +1 -0
  148. package/dist/map/raster-source.d.ts +11 -0
  149. package/dist/map/raster-source.js +26 -0
  150. package/dist/map/raster-source.js.map +1 -0
  151. package/dist/map/symbol-atlases.d.ts +26 -0
  152. package/dist/map/symbol-atlases.js +59 -0
  153. package/dist/map/symbol-atlases.js.map +1 -0
  154. package/dist/map/viewshed.d.ts +5 -0
  155. package/dist/map/viewshed.js +28 -0
  156. package/dist/map/viewshed.js.map +1 -0
  157. package/dist/map/workers.d.ts +46 -0
  158. package/dist/map/workers.js +73 -0
  159. package/dist/map/workers.js.map +1 -0
  160. package/dist/map.d.ts +54 -126
  161. package/dist/map.js +227 -698
  162. package/dist/map.js.map +1 -1
  163. package/dist/react/Control.d.ts +11 -0
  164. package/dist/react/Control.js +18 -0
  165. package/dist/react/Control.js.map +1 -0
  166. package/dist/react/CustomLayer.d.ts +11 -0
  167. package/dist/react/CustomLayer.js +30 -0
  168. package/dist/react/CustomLayer.js.map +1 -0
  169. package/dist/react/IsardMap.d.ts +43 -0
  170. package/dist/react/IsardMap.js +147 -0
  171. package/dist/react/IsardMap.js.map +1 -0
  172. package/dist/react/Layer.d.ts +42 -0
  173. package/dist/react/Layer.js +74 -0
  174. package/dist/react/Layer.js.map +1 -0
  175. package/dist/react/Marker.d.ts +24 -0
  176. package/dist/react/Marker.js +53 -0
  177. package/dist/react/Marker.js.map +1 -0
  178. package/dist/react/Panel.d.ts +11 -0
  179. package/dist/react/Panel.js +37 -0
  180. package/dist/react/Panel.js.map +1 -0
  181. package/dist/react/Popup.d.ts +18 -0
  182. package/dist/react/Popup.js +60 -0
  183. package/dist/react/Popup.js.map +1 -0
  184. package/dist/react/Swipe.d.ts +16 -0
  185. package/dist/react/Swipe.js +52 -0
  186. package/dist/react/Swipe.js.map +1 -0
  187. package/dist/react/VectorGeometry.d.ts +35 -0
  188. package/dist/react/VectorGeometry.js +82 -0
  189. package/dist/react/VectorGeometry.js.map +1 -0
  190. package/dist/react/Viewshed.d.ts +5 -0
  191. package/dist/react/Viewshed.js +28 -0
  192. package/dist/react/Viewshed.js.map +1 -0
  193. package/dist/react/context.d.ts +33 -0
  194. package/dist/react/context.js +20 -0
  195. package/dist/react/context.js.map +1 -0
  196. package/dist/react/index.d.ts +16 -108
  197. package/dist/react/index.js +11 -397
  198. package/dist/react/index.js.map +1 -1
  199. package/dist/settings.d.ts +5 -9
  200. package/dist/settings.js +17 -15
  201. package/dist/settings.js.map +1 -1
  202. package/dist/types.d.ts +27 -4
  203. package/dist/types.js.map +1 -1
  204. package/dist/ui/controls.js +6 -4
  205. package/dist/ui/controls.js.map +1 -1
  206. package/dist/ui/interaction.d.ts +2 -2
  207. package/dist/ui/interaction.js +8 -7
  208. package/dist/ui/interaction.js.map +1 -1
  209. package/dist/ui/minimap.d.ts +25 -0
  210. package/dist/ui/minimap.js +90 -0
  211. package/dist/ui/minimap.js.map +1 -0
  212. package/dist/ui/overlay.js +18 -20
  213. package/dist/ui/overlay.js.map +1 -1
  214. package/dist/ui/scale.d.ts +19 -0
  215. package/dist/ui/scale.js +44 -0
  216. package/dist/ui/scale.js.map +1 -0
  217. package/dist/ui/search.d.ts +25 -0
  218. package/dist/ui/search.js +119 -0
  219. package/dist/ui/search.js.map +1 -0
  220. package/dist/ui/style.d.ts +1 -1
  221. package/dist/ui/style.js +19 -2
  222. package/dist/ui/style.js.map +1 -1
  223. package/dist/util/animation.d.ts +3 -3
  224. package/dist/util/animation.js +6 -6
  225. package/dist/util/animation.js.map +1 -1
  226. package/dist/util/color.d.ts +1 -1
  227. package/dist/util/color.js +14 -16
  228. package/dist/util/color.js.map +1 -1
  229. package/dist/util/geo.d.ts +6 -6
  230. package/dist/util/geo.js +12 -12
  231. package/dist/util/geo.js.map +1 -1
  232. package/dist/util/guards.d.ts +7 -0
  233. package/dist/util/guards.js +8 -0
  234. package/dist/util/guards.js.map +1 -0
  235. package/dist/util/lru.js.map +1 -1
  236. package/dist/util/sun.d.ts +11 -0
  237. package/dist/util/sun.js +26 -0
  238. package/dist/util/sun.js.map +1 -0
  239. package/dist/wasm/isard.d.ts +250 -7
  240. package/dist/wasm/isard.js +375 -8
  241. package/dist/wasm/isard_core.d.ts +226 -7
  242. package/dist/wasm/isard_core.js +351 -8
  243. package/dist/wasm/isard_tess.d.ts +109 -0
  244. package/dist/wasm/isard_tess.js +398 -0
  245. package/dist/workers/basemap/geometry.d.ts +72 -0
  246. package/dist/workers/basemap/labels.d.ts +8 -0
  247. package/dist/workers/basemap/raster.d.ts +10 -0
  248. package/dist/workers/basemap/tiles.d.ts +65 -0
  249. package/dist/workers/basemap/trees.d.ts +19 -0
  250. package/dist/workers/basemap.worker.d.ts +126 -22
  251. package/dist/workers/basemap.worker.js +76 -544
  252. package/dist/workers/basemap.worker.js.map +1 -1
  253. package/package.json +5 -4
  254. package/vite.js +10 -2
@@ -0,0 +1,194 @@
1
+ /** The pool of basemap workers the vector tiles share: a vector tile always goes to the same worker (its decoded copy
2
+ * kept there), the requests of an owner cancelled together, the renderers broadcast to every worker */
3
+ import { headerRules, onHeaderRules } from "../engine/requests.js";
4
+ import { assetUrl } from "../engine-loader.js";
5
+ import { mercatorX, mercatorY } from "../util/geo.js";
6
+ import { SOURCE_CACHE } from "./resample.js";
7
+ /** Default size of a basemap worker pool: cores - 1, 1 to 4 */
8
+ export const defaultWorkerCount = () => {
9
+ return Math.min(4, Math.max(1, (typeof navigator !== 'undefined' ? navigator.hardwareConcurrency || 2 : 2) - 1));
10
+ };
11
+ /** Default URL of the basemap worker: in the page's assets folder (`isard/vite`), else next to the module */
12
+ export const defaultWorkerUrl = (assetsUrl) => {
13
+ return assetUrl('basemap.worker.js', undefined, assetsUrl);
14
+ };
15
+ /** Fetch priority of a raster tile drawn by the workers: 'high' near the center of the view, at the current zoom or
16
+ * coarser; 'low' far from it or finer (prefetch); 'auto' between */
17
+ export const tilePriority = (z, x, y, camera) => {
18
+ // A raster tile of level z covers the map at zoom z - 1
19
+ if (z - 1 > camera.zoom + 1)
20
+ return 'low';
21
+ const n = 2 ** z;
22
+ const [lon, lat] = camera.center;
23
+ const cx = mercatorX(lon) * n;
24
+ const cy = mercatorY(lat) * n;
25
+ // Across the antimeridian, the short way
26
+ const along = Math.abs(x + 0.5 - cx) % n;
27
+ const dx = Math.min(along, n - along);
28
+ const d = Math.hypot(dx, y + 0.5 - cy);
29
+ if (d <= 1.5)
30
+ return 'high';
31
+ return d >= 4 ? 'low' : 'auto';
32
+ };
33
+ /** The worker of a vector tile among `count`: always the same one */
34
+ export const workerIndex = (vz, vx, vy, count) => {
35
+ // Unsigned: every worker gets its share
36
+ return ((Math.imul(vx, 73856093) ^ Math.imul(vy, 19349663) ^ vz) >>> 0) % Math.max(1, count);
37
+ };
38
+ /** The worker-side key of a renderer: unique across the `VectorTiles` sharing a pool */
39
+ export const rendererKey = (namespace, n) => {
40
+ return `${namespace}:r${n}`;
41
+ };
42
+ /**
43
+ * @internal Workers drawing vector tiles, shared by the `VectorTiles` of a map: each vector tile always goes to the
44
+ * same worker, which keeps it decoded for every style drawn from it. Requests are tracked one by one, with their
45
+ * owner, so that one `VectorTiles` going away cancels its own requests only.
46
+ */
47
+ export class BasemapWorkers {
48
+ count;
49
+ url;
50
+ workers;
51
+ pending = new Map();
52
+ next = 1;
53
+ namespaces = 0;
54
+ terminated = false;
55
+ /** Stops following the page's request headers */
56
+ unfollow;
57
+ constructor(count, url, create = (u) => new Worker(u, { type: 'module' })) {
58
+ this.count = count;
59
+ this.url = url;
60
+ const start = () => {
61
+ const worker = create(url);
62
+ worker.onmessage = ({ data }) => {
63
+ const p = this.pending.get(data.id);
64
+ if (!p)
65
+ return;
66
+ this.pending.delete(data.id);
67
+ if ('error' in data)
68
+ p.reject(new Error(data.error));
69
+ else
70
+ p.resolve(data);
71
+ };
72
+ // A worker that fails to load (a bundler serving it from elsewhere) or to read a message fails its requests
73
+ worker.onerror = (event) => {
74
+ event.preventDefault();
75
+ this.fail(worker, `the vector basemap worker ${url} failed${event.message ? `: ${event.message}` : ''}`);
76
+ };
77
+ worker.onmessageerror = () => this.fail(worker, `the vector basemap worker ${url} sent an unreadable message`);
78
+ const rules = headerRules();
79
+ if (rules.length > 0)
80
+ worker.postMessage({ type: 'headers', rules });
81
+ return worker;
82
+ };
83
+ this.workers = [start(), ...Array.from({ length: Math.max(1, count) - 1 }, start)];
84
+ this.unfollow = onHeaderRules((rules) => {
85
+ this.workers.forEach((w) => {
86
+ w.postMessage({ type: 'headers', rules });
87
+ });
88
+ });
89
+ }
90
+ /** A prefix for the renderer keys of one `VectorTiles` */
91
+ namespace() {
92
+ return `v${this.namespaces++}`;
93
+ }
94
+ /** Requests in progress */
95
+ get size() {
96
+ return this.pending.size;
97
+ }
98
+ /** Rejects the requests of a failed worker */
99
+ fail(worker, message) {
100
+ const error = new Error(`isard: ${message}. If a bundler moves the worker, give its URL in the \`basemapWorkerUrl\` option (see "With a bundler" in the guide)`);
101
+ this.pending.forEach((p, id) => {
102
+ if (p.worker !== worker)
103
+ return;
104
+ this.pending.delete(id);
105
+ p.reject(error);
106
+ });
107
+ }
108
+ /** The worker of a vector tile */
109
+ worker(vz, vx, vy) {
110
+ return this.workers[workerIndex(vz, vx, vy, this.workers.length)] ?? this.workers[0];
111
+ }
112
+ /** Sends a message to every worker (a renderer, or its removal, or where the tessellation module is) */
113
+ broadcast(message) {
114
+ if (this.terminated)
115
+ return;
116
+ // A renderer tells the workers how many they are: they share the decoded tiles' budget
117
+ const sent = message.type === 'init' ? { ...message, workers: this.workers.length } : message;
118
+ // A sprite image is copied to each worker (structured clone)
119
+ this.workers.forEach((w) => {
120
+ w.postMessage(sent);
121
+ });
122
+ }
123
+ /** Asks a worker for a tile's image or labels, on behalf of `owner` */
124
+ request(worker, work, owner, signal) {
125
+ return new Promise((resolve, reject) => {
126
+ if (this.terminated)
127
+ return reject(new DOMException('isard: vector tiles destroyed', 'AbortError'));
128
+ if (signal?.aborted)
129
+ return reject(new DOMException('aborted', 'AbortError'));
130
+ const id = this.next++;
131
+ const abort = () => {
132
+ if (!this.pending.delete(id))
133
+ return;
134
+ worker.postMessage({ type: 'abort', id });
135
+ reject(new DOMException('aborted', 'AbortError'));
136
+ };
137
+ // The listener goes once the request is settled
138
+ const settle = () => signal?.removeEventListener('abort', abort);
139
+ this.pending.set(id, {
140
+ resolve: (r) => {
141
+ settle();
142
+ resolve(r);
143
+ },
144
+ reject: (e) => {
145
+ settle();
146
+ reject(e);
147
+ },
148
+ worker,
149
+ owner,
150
+ });
151
+ signal?.addEventListener('abort', abort, { once: true });
152
+ worker.postMessage({ ...work, id });
153
+ });
154
+ }
155
+ /** The altitudes of a PNG relief tile `z`/`x`/`y` at `url`, decoded by a worker (see `fetchHeights`) */
156
+ heights(url, encoding, floor, [z, x, y], signal, owner) {
157
+ const work = { type: 'heights', url, encoding, ...(floor === undefined ? {} : { floor }) };
158
+ return this.request(this.worker(z, x, y), work, owner, signal).then((r) => ('heights' in r ? r.heights : null));
159
+ }
160
+ /** Mercator tile `z`/`x`/`y` reprojected by a worker from the source images of its plan (see `resampler`) */
161
+ reproject(job, [z, x, y], signal, owner) {
162
+ // Blocks of 4 × 4 Mercator tiles go to the same worker: neighbours share source tiles, each worker keeps its share
163
+ const worker = this.worker(Math.max(0, z - 2), x >> 2, y >> 2);
164
+ const cached = Math.max(16, Math.ceil(SOURCE_CACHE / this.workers.length));
165
+ const work = { type: 'reproject', job, cached };
166
+ return this.request(worker, work, owner, signal).then((r) => ('image' in r ? r.image : null));
167
+ }
168
+ /** Cancels the requests of an owner (the workers stop them) */
169
+ cancel(owner) {
170
+ this.pending.forEach((p, id) => {
171
+ if (p.owner !== owner)
172
+ return;
173
+ this.pending.delete(id);
174
+ p.worker.postMessage({ type: 'abort', id });
175
+ p.reject(new DOMException('isard: vector tiles destroyed', 'AbortError'));
176
+ });
177
+ }
178
+ /** Stops the workers; their requests fail */
179
+ terminate() {
180
+ if (this.terminated)
181
+ return;
182
+ this.terminated = true;
183
+ this.unfollow();
184
+ this.workers.forEach((w) => {
185
+ w.terminate();
186
+ });
187
+ const pending = [...this.pending.values()];
188
+ this.pending.clear();
189
+ pending.forEach((p) => {
190
+ p.reject(new DOMException('isard: vector tiles destroyed', 'AbortError'));
191
+ });
192
+ }
193
+ }
194
+ //# sourceMappingURL=workerpool.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workerpool.js","sourceRoot":"","sources":["../../src/basemap/workerpool.ts"],"names":[],"mappings":"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","sourcesContent":["/** The pool of basemap workers the vector tiles share: a vector tile always goes to the same worker (its decoded copy\n * kept there), the requests of an owner cancelled together, the renderers broadcast to every worker */\n\nimport { headerRules, onHeaderRules } from '../engine/requests.ts';\nimport { assetUrl } from '../engine-loader.ts';\nimport { mercatorX, mercatorY } from '../util/geo.ts';\nimport type { Camera } from '../wasm/isard.js';\nimport type { BasemapRequest, BasemapResponse, BasemapWork, Priority } from '../workers/basemap.worker.ts';\nimport { type Job, SOURCE_CACHE } from './resample.ts';\nimport type { PngEncoding } from './terrain.ts';\n\n/** Default size of a basemap worker pool: cores - 1, 1 to 4 */\nexport const defaultWorkerCount = (): number => {\n return Math.min(4, Math.max(1, (typeof navigator !== 'undefined' ? navigator.hardwareConcurrency || 2 : 2) - 1));\n};\n\n/** Default URL of the basemap worker: in the page's assets folder (`isard/vite`), else next to the module */\nexport const defaultWorkerUrl = (assetsUrl?: string | URL): string | URL => {\n return assetUrl('basemap.worker.js', undefined, assetsUrl);\n};\n\n/** Fetch priority of a raster tile drawn by the workers: 'high' near the center of the view, at the current zoom or\n * coarser; 'low' far from it or finer (prefetch); 'auto' between */\nexport const tilePriority = (z: number, x: number, y: number, camera: Pick<Camera, 'center' | 'zoom'>): Priority => {\n // A raster tile of level z covers the map at zoom z - 1\n if (z - 1 > camera.zoom + 1) return 'low';\n\n const n = 2 ** z;\n const [lon, lat] = camera.center;\n const cx = mercatorX(lon) * n;\n const cy = mercatorY(lat) * n;\n // Across the antimeridian, the short way\n const along = Math.abs(x + 0.5 - cx) % n;\n const dx = Math.min(along, n - along);\n const d = Math.hypot(dx, y + 0.5 - cy);\n\n if (d <= 1.5) return 'high';\n\n return d >= 4 ? 'low' : 'auto';\n};\n\n/** The worker of a vector tile among `count`: always the same one */\nexport const workerIndex = (vz: number, vx: number, vy: number, count: number): number => {\n // Unsigned: every worker gets its share\n return ((Math.imul(vx, 73856093) ^ Math.imul(vy, 19349663) ^ vz) >>> 0) % Math.max(1, count);\n};\n\n/** The worker-side key of a renderer: unique across the `VectorTiles` sharing a pool */\nexport const rendererKey = (namespace: string, n: number): string => {\n return `${namespace}:r${n}`;\n};\n\n/** What the pool needs of a worker (a `Worker`, or a stand-in in tests) */\nexport type PoolWorker = Pick<Worker, 'postMessage' | 'terminate' | 'onmessage' | 'onerror' | 'onmessageerror'>;\n\n/**\n * @internal Workers drawing vector tiles, shared by the `VectorTiles` of a map: each vector tile always goes to the\n * same worker, which keeps it decoded for every style drawn from it. Requests are tracked one by one, with their\n * owner, so that one `VectorTiles` going away cancels its own requests only.\n */\nexport class BasemapWorkers {\n private readonly workers: [PoolWorker, ...PoolWorker[]];\n private readonly pending = new Map<\n number,\n { resolve: (r: BasemapResponse) => void; reject: (e: Error) => void; worker: PoolWorker; owner: object }\n >();\n private next = 1;\n private namespaces = 0;\n private terminated = false;\n /** Stops following the page's request headers */\n private readonly unfollow: () => void;\n\n constructor(\n readonly count: number,\n readonly url: string | URL,\n create: (url: string | URL) => PoolWorker = (u) => new Worker(u, { type: 'module' }),\n ) {\n const start = (): PoolWorker => {\n const worker = create(url);\n\n worker.onmessage = ({ data }: MessageEvent<BasemapResponse>) => {\n const p = this.pending.get(data.id);\n\n if (!p) return;\n this.pending.delete(data.id);\n if ('error' in data) p.reject(new Error(data.error));\n else p.resolve(data);\n };\n // A worker that fails to load (a bundler serving it from elsewhere) or to read a message fails its requests\n worker.onerror = (event) => {\n event.preventDefault();\n this.fail(worker, `the vector basemap worker ${url} failed${event.message ? `: ${event.message}` : ''}`);\n };\n worker.onmessageerror = () => this.fail(worker, `the vector basemap worker ${url} sent an unreadable message`);\n\n const rules = headerRules();\n\n if (rules.length > 0) worker.postMessage({ type: 'headers', rules } satisfies BasemapRequest);\n\n return worker;\n };\n\n this.workers = [start(), ...Array.from({ length: Math.max(1, count) - 1 }, start)];\n this.unfollow = onHeaderRules((rules) => {\n this.workers.forEach((w) => {\n w.postMessage({ type: 'headers', rules } satisfies BasemapRequest);\n });\n });\n }\n\n /** A prefix for the renderer keys of one `VectorTiles` */\n namespace(): string {\n return `v${this.namespaces++}`;\n }\n\n /** Requests in progress */\n get size(): number {\n return this.pending.size;\n }\n\n /** Rejects the requests of a failed worker */\n private fail(worker: PoolWorker, message: string): void {\n const error = new Error(\n `isard: ${message}. If a bundler moves the worker, give its URL in the \\`basemapWorkerUrl\\` option (see \"With a bundler\" in the guide)`,\n );\n\n this.pending.forEach((p, id) => {\n if (p.worker !== worker) return;\n this.pending.delete(id);\n p.reject(error);\n });\n }\n\n /** The worker of a vector tile */\n worker(vz: number, vx: number, vy: number): PoolWorker {\n return this.workers[workerIndex(vz, vx, vy, this.workers.length)] ?? this.workers[0];\n }\n\n /** Sends a message to every worker (a renderer, or its removal, or where the tessellation module is) */\n broadcast(message: Extract<BasemapRequest, { type: 'init' } | { type: 'drop' } | { type: 'tess' }>): void {\n if (this.terminated) return;\n\n // A renderer tells the workers how many they are: they share the decoded tiles' budget\n const sent = message.type === 'init' ? { ...message, workers: this.workers.length } : message;\n\n // A sprite image is copied to each worker (structured clone)\n this.workers.forEach((w) => {\n w.postMessage(sent);\n });\n }\n\n /** Asks a worker for a tile's image or labels, on behalf of `owner` */\n request(worker: PoolWorker, work: BasemapWork, owner: object, signal?: AbortSignal): Promise<BasemapResponse> {\n return new Promise<BasemapResponse>((resolve, reject) => {\n if (this.terminated) return reject(new DOMException('isard: vector tiles destroyed', 'AbortError'));\n if (signal?.aborted) return reject(new DOMException('aborted', 'AbortError'));\n\n const id = this.next++;\n const abort = () => {\n if (!this.pending.delete(id)) return;\n worker.postMessage({ type: 'abort', id } satisfies BasemapRequest);\n reject(new DOMException('aborted', 'AbortError'));\n };\n // The listener goes once the request is settled\n const settle = () => signal?.removeEventListener('abort', abort);\n\n this.pending.set(id, {\n resolve: (r) => {\n settle();\n resolve(r);\n },\n reject: (e) => {\n settle();\n reject(e);\n },\n worker,\n owner,\n });\n signal?.addEventListener('abort', abort, { once: true });\n worker.postMessage({ ...work, id } satisfies BasemapRequest);\n });\n }\n\n /** The altitudes of a PNG relief tile `z`/`x`/`y` at `url`, decoded by a worker (see `fetchHeights`) */\n heights(\n url: string,\n encoding: PngEncoding,\n floor: number | undefined,\n [z, x, y]: [number, number, number],\n signal: AbortSignal,\n owner: object,\n ): Promise<Float32Array | null> {\n const work: BasemapWork = { type: 'heights', url, encoding, ...(floor === undefined ? {} : { floor }) };\n\n return this.request(this.worker(z, x, y), work, owner, signal).then((r) => ('heights' in r ? r.heights : null));\n }\n\n /** Mercator tile `z`/`x`/`y` reprojected by a worker from the source images of its plan (see `resampler`) */\n reproject(\n job: Job,\n [z, x, y]: [number, number, number],\n signal: AbortSignal,\n owner: object,\n ): Promise<ImageBitmap | null> {\n // Blocks of 4 × 4 Mercator tiles go to the same worker: neighbours share source tiles, each worker keeps its share\n const worker = this.worker(Math.max(0, z - 2), x >> 2, y >> 2);\n const cached = Math.max(16, Math.ceil(SOURCE_CACHE / this.workers.length));\n const work: BasemapWork = { type: 'reproject', job, cached };\n\n return this.request(worker, work, owner, signal).then((r) => ('image' in r ? r.image : null));\n }\n\n /** Cancels the requests of an owner (the workers stop them) */\n cancel(owner: object): void {\n this.pending.forEach((p, id) => {\n if (p.owner !== owner) return;\n this.pending.delete(id);\n p.worker.postMessage({ type: 'abort', id } satisfies BasemapRequest);\n p.reject(new DOMException('isard: vector tiles destroyed', 'AbortError'));\n });\n }\n\n /** Stops the workers; their requests fail */\n terminate(): void {\n if (this.terminated) return;\n this.terminated = true;\n this.unfollow();\n this.workers.forEach((w) => {\n w.terminate();\n });\n\n const pending = [...this.pending.values()];\n\n this.pending.clear();\n pending.forEach((p) => {\n p.reject(new DOMException('isard: vector tiles destroyed', 'AbortError'));\n });\n }\n}\n"]}
@@ -1,4 +1,4 @@
1
- class fe{buf;end;pos;constructor(e,t=0,n=e.length){this.buf=e;this.end=n;this.pos=t}varint(){let e=0;for(let t=0;t<70;t+=7){let n=this.buf[this.pos++]??0;if(e+=(n&127)*2**t,n<128)break}return e}int64(){let e=0,t=0;for(let n=0;n<10;n+=1){let o=this.buf[this.pos++]??0,r=o&127;if(n<4)e|=r<<7*n;else if(n===4)e|=(r&15)<<28,t|=r>>4;else t|=r<<7*n-32;if(o<128)break}return(t|0)*4294967296+(e>>>0)}sint(){let e=this.varint();return e%2===1?-(e+1)/2:e/2}sub(){let e=this.varint(),t=Math.min(this.pos+e,this.end),n=new fe(this.buf,this.pos,t);return this.pos=t,n}string(){let e=this.varint(),t=Math.min(this.pos+e,this.end),n=Xe.decode(this.buf.subarray(this.pos,t));return this.pos=t,n}float(){let e=this.pos+4<=this.end?this.view().getFloat32(this.pos,!0):0;return this.pos+=4,e}double(){let e=this.pos+8<=this.end?this.view().getFloat64(this.pos,!0):0;return this.pos+=8,e}view(){return new DataView(this.buf.buffer,this.buf.byteOffset,this.buf.byteLength)}skip(e){if(e===0)this.varint();else if(e===1)this.pos+=8;else if(e===2)this.pos+=this.varint();else if(e===5)this.pos+=4}get more(){return this.pos<this.end}}var Xe=new TextDecoder;function Ye(e){let t="";while(e.more){let n=e.varint();switch(n>>3){case 1:t=e.string();break;case 2:t=e.float();break;case 3:t=e.double();break;case 4:t=e.int64();break;case 5:t=e.varint();break;case 6:t=e.sint();break;case 7:t=e.varint()!==0;break;default:e.skip(n&7)}}return t}function Ge(e){let t=[],n,[o,r]=[0,0];while(e.more){let i=e.varint(),a=i&7,s=i>>3;if(a===7){if(n&&n.length>=2)n.push(n[0]??0,n[1]??0);continue}for(let u=0;u<s&&e.more;u+=1){if(o+=e.sint(),r+=e.sint(),a===1)n=[],t.push(n);n?.push(o,r)}}return t}function me(e,t){let n=new Map,o=new fe(e);while(o.more){let r=o.varint();if(r>>3!==3){o.skip(r&7);continue}let i=o.sub(),a="",s=4096,u=[],l=[],c=[];while(i.more){let m=i.varint();switch(m>>3){case 1:a=i.string();break;case 2:c.push(i.sub());break;case 3:u.push(i.string());break;case 4:l.push(Ye(i.sub()));break;case 5:s=i.varint();break;default:i.skip(m&7)}}if(t&&!t.has(a))continue;let h=[];for(let m of c){let C=1,f={},b=[];while(m.more){let k=m.varint();switch(k>>3){case 2:{let d=m.sub();while(d.more){let R=u[d.varint()],O=l[d.varint()];if(R!==void 0&&O!==void 0)f[R]=O}break}case 3:C=Math.min(3,Math.max(1,m.varint()));break;case 4:b=Ge(m.sub());break;default:m.skip(k&7)}}h.push({type:C,properties:f,geometry:b})}n.set(a,{extent:s,features:h})}return n}var Ae=[];function Me(e){Ae=e}function q(e,t){let n=String(e),o=Ae.filter(([i])=>n.startsWith(i));if(o.length===0)return t??{};let r=new Headers(t?.headers);for(let[,i]of o)for(let[a,s]of Object.entries(i))r.set(a,s);return{...t??{},headers:r}}class W{capacity;evict;entries=new Map;constructor(e,t){this.capacity=e;this.evict=t}get size(){return this.entries.size}get(e){let t=this.entries.get(e);if(t!==void 0)this.entries.delete(e),this.entries.set(e,t);return t}has(e){return this.entries.has(e)}set(e,t){this.entries.delete(e),this.entries.set(e,t);for(let[n,o]of this.entries){if(this.entries.size<=this.capacity)break;this.entries.delete(n),this.evict?.(o,n)}}delete(e){return this.entries.delete(e)}values(){return this.entries.values()}clear(){this.entries.clear()}}var Qe=127,et=16384,tt=["unknown","mvt","png","jpeg","webp","avif"],nt=(e)=>(4**e-1)/3;function rt(e,t,n){if(e>26)throw Error(`isard: PMTiles level ${e} past 26`);let o=2**e;if(t<0||n<0||t>=o||n>=o)throw Error(`isard: PMTiles tile ${e}/${t}/${n} out of its level`);let[r,i]=[t,n],a=0;for(let s=o/2;s>=1;s/=2){let u=(r&s)>0?1:0,l=(i&s)>0?1:0;if(a+=s*s*(3*u^l),l===0){if(u===1)[r,i]=[s-1-r,s-1-i];[r,i]=[i,r]}}return nt(e)+a}class Ce{bytes;pos=0;constructor(e){this.bytes=e}next(){let e=0,t=1;for(;;){let n=this.bytes[this.pos++];if(n===void 0)throw Error("isard: PMTiles directory truncated");if(e+=(n&127)*t,n<128)return e;if(t*=128,t>9223372036854776000)throw Error("isard: PMTiles varint too long")}}}function Se(e){let t=new Ce(e),n=t.next();if(n>e.length)throw Error("isard: PMTiles directory larger than its bytes");let o=[],r=0;for(let i=0;i<n;i+=1)r+=t.next(),o.push({tileId:r,offset:0,length:0,runLength:1});for(let i of o)i.runLength=t.next();for(let i of o)i.length=t.next();return o.forEach((i,a)=>{let s=t.next(),u=o[a-1];i.offset=s===0&&u?u.offset+u.length:s-1}),o}function ot(e,t){let[n,o]=[0,e.length-1];while(n<=o){let i=n+o>>1,a=e[i];if(a.tileId===t)return a;if(a.tileId<t)n=i+1;else o=i-1}let r=e[o];if(!r)return;if(r.runLength===0||t-r.tileId<r.runLength)return r;return}function it(e){if(e.length<Qe||String.fromCharCode(...e.subarray(0,7))!=="PMTiles")throw Error("isard: not a PMTiles archive");if(e[7]!==3)throw Error(`isard: PMTiles version ${e[7]} (only 3 is read)`);let t=new DataView(e.buffer,e.byteOffset,e.byteLength),n=(r)=>Number(t.getBigUint64(r,!0)),o=(r)=>t.getInt32(r,!0)/1e7;return{rootDirectoryOffset:n(8),rootDirectoryLength:n(16),metadataOffset:n(24),metadataLength:n(32),leafDirectoryOffset:n(40),leafDirectoryLength:n(48),tileDataOffset:n(56),tileDataLength:n(64),internalCompression:t.getUint8(97),tileCompression:t.getUint8(98),tileType:tt[t.getUint8(99)]??"unknown",minZoom:t.getUint8(100),maxZoom:t.getUint8(101),bounds:[o(102),o(106),o(110),o(114)],center:[o(119),o(123),t.getUint8(118)]}}async function ee(e,t){if(t===0||t===1)return e;if(t!==2)throw Error(`isard: PMTiles compression ${t===3?"brotli":"zstd"} is not read (gzip only)`);let n=new Blob([e]).stream().pipeThrough(new DecompressionStream("gzip"));return new Uint8Array(await new Response(n).arrayBuffer())}var st=67108864;class Le{source;head;leaves=new W(64);whole;constructor(e){this.source=e}async range(e,t,n){if(typeof this.source!=="string")return new Uint8Array(await this.source.slice(e,e+t).arrayBuffer());if(this.whole)return(await this.whole).subarray(e,e+t);let o=await fetch(this.source,q(this.source,{headers:{Range:`bytes=${e}-${e+Math.max(t,1)-1}`},...n?{signal:n}:{}}));if(!o.ok)throw Error(`${this.source}: HTTP ${o.status}`);if(o.status===206)return new Uint8Array(await o.arrayBuffer());if(Number(o.headers.get("Content-Length"))>st)throw await o.body?.cancel(),Error(`${this.source}: the server ignores range requests (HTTP 206 expected)`);let i=o.arrayBuffer().then((a)=>new Uint8Array(a));return this.whole=i,i.catch(()=>{this.whole=void 0}),(await i).subarray(e,e+t)}load(){return this.head??=(async()=>{let e=await this.range(0,et),t=it(e),{rootDirectoryOffset:n,rootDirectoryLength:o}=t,r=n+o<=e.length?e.subarray(n,n+o):await this.range(n,o),i=Se(await ee(r,t.internalCompression));return{header:t,root:i}})(),this.head.catch(()=>{this.head=void 0}),this.head}async header(){return(await this.load()).header}async metadata(){let{header:e}=await this.load();if(e.metadataLength===0)return{};let t=await this.range(e.metadataOffset,e.metadataLength),n=new TextDecoder().decode(await ee(t,e.internalCompression)),o=JSON.parse(n);return o&&typeof o==="object"&&!Array.isArray(o)?o:{}}leaf(e,t){let n=e.leafDirectoryOffset+t.offset,o=this.leaves.get(n);if(!o)o=this.range(n,t.length).then(async(r)=>Se(await ee(r,e.internalCompression))),o.catch(()=>this.leaves.delete(n)),this.leaves.set(n,o);return o}async tile(e,t,n,o){let{header:r,root:i}=await this.load();if(e<r.minZoom||e>r.maxZoom)return;let a=rt(e,t,n),s=i;for(let u=0;u<4;u+=1){let l=ot(s,a);if(!l)return;if(l.runLength>0){let c=await this.range(r.tileDataOffset+l.offset,l.length,o);return ee(c,r.tileCompression)}s=await this.leaf(r,l)}throw Error("isard: PMTiles directories nested too deep")}}var Pe=new W(16);function at(e){let t=Pe.get(e);if(!t)t=new Le(e),Pe.set(e,t);return t}function de(e,t){let n=/^pmtiles:\/\/(.+)\/(\d+)\/(\d+)\/(\d+)$/.exec(e);if(!n)return!1;let[,o="",r,i,a]=n;return at(o).tile(Number(r),Number(i),Number(a),t)}var ut=96;function lt(e,t,n,o,r,i){let a=new Uint8ClampedArray(i*i*4),s=i/r,u=r+1;for(let l=0;l<i;l+=1){let c=(l+0.5)/s,h=Math.min(r-1,Math.floor(c)),m=c-h;for(let C=0;C<i;C+=1){let f=(C+0.5)/s,b=Math.min(r-1,Math.floor(f)),k=f-b,d=2*(h*u+b),R=d+2*u,O=(1-k)*(1-m),j=k*(1-m),J=(1-k)*m,P=k*m,x=O*o[d]+j*o[d+2]+J*o[R]+P*o[R+2],v=O*o[d+1]+j*o[d+3]+J*o[R+1]+P*o[R+3],p=x-0.5,g=v-0.5;if(!(p>-1&&g>-1&&p<t&&g<n))continue;let M=Math.floor(p),y=Math.floor(g),L=p-M,A=g-y,E=0,I=0,S=0,N=0;for(let D=0;D<4;D+=1){let H=M+(D&1),F=y+(D>>1);if(H<0||F<0||H>=t||F>=n)continue;let B=4*(F*t+H),U=(D&1?L:1-L)*(D>>1?A:1-A)*e[B+3];E+=U*e[B],I+=U*e[B+1],S+=U*e[B+2],N+=U}if(N<=0)continue;let T=4*(l*i+C);a[T]=E/N,a[T+1]=I/N,a[T+2]=S/N,a[T+3]=N}}return a}function Re(e=ut){let t=new Map,n=new Set,o=(l)=>{n.delete(l),l.then((c)=>c?.close(),()=>{return})},r=(l)=>{if(t.has(l))n.add(l);else o(l)},i=new W(e,r),a=(l)=>{let c=(t.get(l)??1)-1;if(c>0)t.set(l,c);else if(t.delete(l),n.has(l))o(l)},s=(l)=>{let c=i.get(l);if(!c)c=(async()=>{let h=await fetch(l,q(l));if(h.status===404||h.status===204||h.status===410)return null;if(!h.ok)throw Error(`isard: ${h.status} for a raster to reproject`);return createImageBitmap(await h.blob())})(),c.catch(()=>i.delete(l)),i.set(l,c);return t.set(c,(t.get(c)??0)+1),c};return{draw:async(l,c)=>{let h=l.sources.map((m)=>[m,s(m.url)]);try{let m=await Promise.all(h.map(async([d,R])=>[d,await R]));if(c.throwIfAborted(),!m.some(([,d])=>d))return null;let f=new OffscreenCanvas(l.width,l.height).getContext("2d",{willReadFrequently:!0});if(!f)throw Error("isard: no 2D canvas to reproject the tiles");for(let[d,R]of m)if(R)f.drawImage(R,d.x,d.y,d.w,d.h);let b=f.getImageData(0,0,l.width,l.height).data,k=lt(b,l.width,l.height,l.mesh,l.n,l.size);return createImageBitmap(new ImageData(k,l.size,l.size),{premultiplyAlpha:"none"})}finally{for(let[,m]of h)a(m)}},cache:i,close:()=>{for(let l of i.values())r(l);i.clear()}}}var _=256;function ct(e,t,n=Number.NEGATIVE_INFINITY){let o=e.length>>2,r=new Float32Array(o);if(t==="terrarium")for(let i=0,a=0;i<o;i+=1,a+=4){let s=e[a]*256+e[a+1]+e[a+2]/256-32768;r[i]=s>n?s:n}else for(let i=0,a=0;i<o;i+=1,a+=4){let s=-1e4+(e[a]*65536+e[a+1]*256+e[a+2])*0.1;r[i]=s>n?s:n}return r}async function Te(e,t,n,o,r){let i=await fetch(e,q(e,{signal:o}));if(i.status===404||i.status===204||i.status===410)return null;if(!i.ok)throw Error(`${i.url}: ${i.status}`);let a=await createImageBitmap(await i.blob(),{premultiplyAlpha:"none",colorSpaceConversion:"none"});try{r.canvas??=new OffscreenCanvas(_,_);let s=r.canvas.getContext("2d",{willReadFrequently:!0});if(!s)throw Error("no 2D context");return s.imageSmoothingEnabled=!1,s.clearRect(0,0,_,_),s.drawImage(a,0,0,_,_),ct(s.getImageData(0,0,_,_).data,t,n)}finally{a.close()}}var ft="aliceblue f0f8ff antiquewhite faebd7 aqua 00ffff aquamarine 7fffd4 azure f0ffff beige f5f5dc bisque ffe4c4 black 000000 blanchedalmond ffebcd blue 0000ff blueviolet 8a2be2 brown a52a2a burlywood deb887 cadetblue 5f9ea0 chartreuse 7fff00 chocolate d2691e coral ff7f50 cornflowerblue 6495ed cornsilk fff8dc crimson dc143c cyan 00ffff darkblue 00008b darkcyan 008b8b darkgoldenrod b8860b darkgray a9a9a9 darkgreen 006400 darkgrey a9a9a9 darkkhaki bdb76b darkmagenta 8b008b darkolivegreen 556b2f darkorange ff8c00 darkorchid 9932cc darkred 8b0000 darksalmon e9967a darkseagreen 8fbc8f darkslateblue 483d8b darkslategray 2f4f4f darkslategrey 2f4f4f darkturquoise 00ced1 darkviolet 9400d3 deeppink ff1493 deepskyblue 00bfff dimgray 696969 dimgrey 696969 dodgerblue 1e90ff firebrick b22222 floralwhite fffaf0 forestgreen 228b22 fuchsia ff00ff gainsboro dcdcdc ghostwhite f8f8ff gold ffd700 goldenrod daa520 gray 808080 green 008000 greenyellow adff2f grey 808080 honeydew f0fff0 hotpink ff69b4 indianred cd5c5c indigo 4b0082 ivory fffff0 khaki f0e68c lavender e6e6fa lavenderblush fff0f5 lawngreen 7cfc00 lemonchiffon fffacd lightblue add8e6 lightcoral f08080 lightcyan e0ffff lightgoldenrodyellow fafad2 lightgray d3d3d3 lightgreen 90ee90 lightgrey d3d3d3 lightpink ffb6c1 lightsalmon ffa07a lightseagreen 20b2aa lightskyblue 87cefa lightslategray 778899 lightslategrey 778899 lightsteelblue b0c4de lightyellow ffffe0 lime 00ff00 limegreen 32cd32 linen faf0e6 magenta ff00ff maroon 800000 mediumaquamarine 66cdaa mediumblue 0000cd mediumorchid ba55d3 mediumpurple 9370db mediumseagreen 3cb371 mediumslateblue 7b68ee mediumspringgreen 00fa9a mediumturquoise 48d1cc mediumvioletred c71585 midnightblue 191970 mintcream f5fffa mistyrose ffe4e1 moccasin ffe4b5 navajowhite ffdead navy 000080 oldlace fdf5e6 olive 808000 olivedrab 6b8e23 orange ffa500 orangered ff4500 orchid da70d6 palegoldenrod eee8aa palegreen 98fb98 paleturquoise afeeee palevioletred db7093 papayawhip ffefd5 peachpuff ffdab9 peru cd853f pink ffc0cb plum dda0dd powderblue b0e0e6 purple 800080 rebeccapurple 663399 red ff0000 rosybrown bc8f8f royalblue 4169e1 saddlebrown 8b4513 salmon fa8072 sandybrown f4a460 seagreen 2e8b57 seashell fff5ee sienna a0522d silver c0c0c0 skyblue 87ceeb slateblue 6a5acd slategray 708090 slategrey 708090 snow fffafa springgreen 00ff7f steelblue 4682b4 tan d2b48c teal 008080 thistle d8bfd8 tomato ff6347 turquoise 40e0d0 violet ee82ee wheat f5deb3 white ffffff whitesmoke f5f5f5 yellow ffff00 yellowgreen 9acd32",te;function mt(e){if(!te){te=new Map;let t=ft.split(" ");for(let n=0;n+1<t.length;n+=2)te.set(t[n],t[n+1])}return te.get(e)}var ne=(e)=>Number.isFinite(e)?Math.max(0,Math.min(1,e)):0;function Ne(e){if(!/^[0-9a-f]+$/.test(e)||![3,4,6,8].includes(e.length))return;let t=e.length<=4?[...e].map((o)=>o+o).join(""):e,n=(o)=>Number.parseInt(t.slice(o,o+2),16)/255;return[n(0),n(2),n(4),t.length===8?n(6):1]}function dt(e){if(e===void 0)return 1;return ne(e.endsWith("%")?Number.parseFloat(e)/100:Number.parseFloat(e))}function pt(e,t,n){let o=n<0.5?n*(1+t):n+t-n*t,r=2*n-o,i=(a)=>{let s=(a%1+1)%1;if(s<0.16666666666666666)return r+(o-r)*6*s;if(s<0.5)return o;if(s<0.6666666666666666)return r+(o-r)*(0.6666666666666666-s)*6;return r};return[i(e+0.3333333333333333),i(e),i(e-0.3333333333333333)]}function Ie(e){if(typeof e!=="string")return;let t=e.trim().toLowerCase();if(t.startsWith("#"))return Ne(t.slice(1));if(t==="transparent")return[0,0,0,0];let n=mt(t);if(n)return Ne(n);let o=/^(rgba?|hsla?)\(([^)]*)\)$/.exec(t);if(!o?.[1]||o[2]===void 0)return;let r=o[2].split(/[\s,/]+/).filter(Boolean);if(r.length<3||r.slice(0,3).some((c)=>Number.isNaN(Number.parseFloat(c))))return;let i=dt(r[3]);if(o[1].startsWith("rgb")){let c=(h)=>ne(h.endsWith("%")?Number.parseFloat(h)/100:Number.parseFloat(h)/255);return[c(r[0]),c(r[1]),c(r[2]),i]}let a=Number.parseFloat(r[0])/360,[s,u,l]=pt(a,ne(Number.parseFloat(r[1])/100),ne(Number.parseFloat(r[2])/100));return[s,u,l,i]}var bt=["Unknown","Point","LineString","Polygon"];function pe(e,t){return{zoom:t,properties:e.properties,type:bt[e.type]??"Unknown"}}function X(e){return Ie(e)}function oe([e,t,n,o]){return`rgba(${Math.round(e*255)},${Math.round(t*255)},${Math.round(n*255)},${o})`}function Je(e,t,n,o=1){let r=n-t;if(r===0)return 0;let i=e-t;return o===1?i/r:(o**i-1)/(o**r-1)}function be(e,t,n){if(typeof e==="number"&&typeof t==="number")return e+(t-e)*n;let o=X(e),r=X(t);if(o&&r)return oe([0,1,2,3].map((i)=>(o[i]??0)+((r[i]??0)-(o[i]??0))*n));if(Array.isArray(e)&&Array.isArray(t))return e.map((i,a)=>be(i,t[a],n));return n<0.5?e:t}function De(e){return typeof e==="object"&&e!==null&&!Array.isArray(e)&&Array.isArray(e.stops)}function ht(e,t){let n=e.property===void 0?t.zoom:t.properties[e.property],o=e.stops,r=e.type??(e.property===void 0||typeof o[0]?.[0]==="number"?"exponential":"categorical");if(r==="identity")return n??e.default;if(r==="categorical")return o.find(([s])=>s===n)?.[1]??e.default;if(typeof n!=="number"||!o.length)return e.default??o[0]?.[1];let i=(s)=>typeof s[0]==="object"&&s[0]!==null?Number(s[0].zoom):Number(s[0]),a=o[0];if(!a)return e.default;if(n<=i(a))return a[1];for(let s=1;s<o.length;s+=1){let[u,l]=[o[s-1],o[s]];if(!u||!l)continue;if(n<i(l)){if(r==="interval")return u[1];return be(u[1],l[1],Je(n,i(u),i(l),e.base??1))}}return o.at(-1)?.[1]}function re(e,t){if(t==="$type")return e.type;return typeof t==="string"?e.properties[t]:void 0}var gt=new Set(["literal","zoom","get","has","!has","properties","id","geometry-type","concat","format","image","number-format","to-number","to-string","to-boolean","to-color","number","string","boolean","typeof","length","at","upcase","downcase","coalesce","!","all","any","==","!=","<","<=",">",">=","in","case","match","step","interpolate","interpolate-hcl","interpolate-lab","rgb","rgba","+","-","*","/","%","^","min","max","abs","round","floor","ceil","sqrt","ln","log10","log2","pi","e"]);function ie(e){return Array.isArray(e)&&typeof e[0]==="string"&&gt.has(e[0])}var Ee=new Set,Y=(e)=>e===void 0||e===null?"":String(e);function z(e,t){if(De(e))return ht(e,t);if(!Array.isArray(e))return e;let[n,...o]=e;if(typeof n!=="string")return e;let r=(s)=>z(o[s]??null,t),i=(s)=>Number(r(s)),a=()=>o.map((s,u)=>i(u));switch(n){case"literal":return o[0];case"zoom":return t.zoom;case"get":return re(t,r(0));case"has":return re(t,r(0))!==void 0;case"!has":return re(t,r(0))===void 0;case"properties":return t.properties;case"id":return null;case"geometry-type":return t.type;case"concat":return o.map((s,u)=>Y(r(u))).join("");case"format":return o.map((s,u)=>s!==null&&typeof s==="object"&&!Array.isArray(s)?"":Y(r(u))).join("");case"image":return r(0);case"number-format":{let s=o[1]??{},u=i(0);if(!Number.isFinite(u))return"";return u.toLocaleString(s.locale,{minimumFractionDigits:s["min-fraction-digits"],maximumFractionDigits:s["max-fraction-digits"]})}case"to-number":{for(let s=0;s<o.length;s+=1){let u=r(s),l=typeof u==="string"&&u.trim()===""?Number.NaN:Number(u);if(u!==null&&u!==void 0&&!Number.isNaN(l))return l}return 0}case"to-string":return Y(r(0));case"to-boolean":{let s=r(0);return!(s===""||s===0||s===!1||s===null||s===void 0||Number.isNaN(s))}case"to-color":case"number":case"string":case"boolean":{let s={"to-color":(u)=>X(u)!==void 0,number:(u)=>typeof u==="number",string:(u)=>typeof u==="string",boolean:(u)=>typeof u==="boolean"};for(let u=0;u<o.length;u+=1){let l=r(u);if(s[n]?.(l))return l}return o.length?r(o.length-1):null}case"typeof":{let s=r(0);if(s===null||s===void 0)return"null";return Array.isArray(s)?"array":typeof s}case"length":{let s=r(0);return typeof s==="string"||Array.isArray(s)?s.length:0}case"at":{let s=r(1);return Array.isArray(s)?s[i(0)]??null:null}case"upcase":return Y(r(0)).toUpperCase();case"downcase":return Y(r(0)).toLowerCase();case"coalesce":for(let s=0;s<o.length;s+=1){let u=r(s);if(u!==void 0&&u!==null)return u}return null;case"!":return!r(0);case"all":return o.every((s,u)=>Boolean(r(u)));case"any":return o.some((s,u)=>Boolean(r(u)));case"==":return r(0)===r(1);case"!=":return r(0)!==r(1);case"<":return r(0)<r(1);case"<=":return r(0)<=r(1);case">":return r(0)>r(1);case">=":return r(0)>=r(1);case"in":{let s=r(1),u=r(0);if(typeof s==="string")return s.includes(String(u));return Array.isArray(s)&&s.includes(u)}case"case":{for(let s=0;s+1<o.length;s+=2)if(r(s))return r(s+1);return r(o.length-1)}case"match":{let s=r(0);for(let u=1;u+1<o.length;u+=2){let l=o[u];if(Array.isArray(l)?l.includes(s):l===s)return r(u+1)}return r(o.length-1)}case"step":{let s=i(0),u=r(1);for(let l=2;l+1<o.length;l+=2)if(s>=Number(o[l]))u=r(l+1);else break;return u}case"interpolate":case"interpolate-hcl":case"interpolate-lab":{let s=o[0],u=i(1),l=Array.isArray(s)&&s[0]==="exponential"?Number(s[1]):1,c=[];for(let m=2;m+1<o.length;m+=2)c.push([Number(o[m]),o[m+1]??null]);let h=c[0];if(!h)return null;if(u<=h[0])return z(h[1],t);for(let m=1;m<c.length;m+=1){let[C,f]=[c[m-1],c[m]];if(C&&f&&u<f[0])return be(z(C[1],t),z(f[1],t),Je(u,C[0],f[0],l))}return z(c.at(-1)?.[1]??null,t)}case"rgb":case"rgba":return oe([i(0)/255,i(1)/255,i(2)/255,o.length>3?i(3):1]);case"+":return a().reduce((s,u)=>s+u,0);case"*":return a().reduce((s,u)=>s*u,1);case"-":return o.length===1?-i(0):i(0)-i(1);case"/":return i(0)/i(1);case"%":return i(0)%i(1);case"^":return i(0)**i(1);case"min":return Math.min(...a());case"max":return Math.max(...a());case"abs":return Math.abs(i(0));case"round":return Math.sign(i(0))*Math.round(Math.abs(i(0)));case"floor":return Math.floor(i(0));case"ceil":return Math.ceil(i(0));case"sqrt":return Math.sqrt(i(0));case"ln":return Math.log(i(0));case"log10":return Math.log10(i(0));case"log2":return Math.log2(i(0));case"pi":return Math.PI;case"e":return Math.E;default:if(!Ee.has(n))Ee.add(n),console.warn(`isard: the style expression "${n}" is not supported`);return null}}var yt=new Set(["==","!=","<","<=",">",">="]);function wt(e){let[t,n,...o]=e;if(typeof t!=="string"||typeof n!=="string"||o.some(Array.isArray))return!1;if(yt.has(t))return e.length===3;if(t==="in")return e.length!==3||!Array.isArray(e[2]);return t==="!in"||t==="has"||t==="!has"}function xt(e,t){let[n,o,...r]=e,i=re(t,o);switch(n){case"==":return i===r[0];case"!=":return i!==r[0];case"<":return i<r[0];case"<=":return i<=r[0];case">":return i>r[0];case">=":return i>=r[0];case"in":return r.includes(i);case"!in":return!r.includes(i);case"has":return i!==void 0;case"!has":return i===void 0;default:return!0}}var Oe=new WeakMap;function Fe(e){if(!Array.isArray(e))return()=>Boolean(e);let t=Oe.get(e);if(t)return t;let n,o=e[0];if(o==="all"||o==="any"||o==="none"){let r=e.slice(1).map(Fe);if(o==="all")n=(i)=>r.every((a)=>a(i));else if(o==="any")n=(i)=>r.some((a)=>a(i));else n=(i)=>!r.some((a)=>a(i))}else if(wt(e))n=(r)=>xt(e,r);else n=(r)=>Boolean(z(e,r));return Oe.set(e,n),n}function he(e,t){if(e===void 0||e===null)return!0;return Fe(e)(t)}function G(e){if(e!==void 0&&De(e))return e.property!==void 0;if(!Array.isArray(e))return!1;if(["get","has","!has","geometry-type","properties","id"].includes(e[0]))return!0;return e.some((t)=>G(t))}function ge(e,t){if(e===void 0||e===null)return"";if(typeof e==="string")return e.replace(/\{([^}]+)\}/g,(o,r)=>{let i=t.properties[r];return i===void 0?"":String(i)});let n=z(e,t);if(Array.isArray(n))return n.filter((o)=>typeof o==="string").join("");return n===void 0||n===null?"":String(n)}function Be(e){return/Regular|Bold|Italic|Semibold|Light|Medium|Black/.test(e)?e:`${e} Regular`}function ye(e){let t=new Set,n=(a)=>{if(!Array.isArray(a))return;let s=(u)=>Array.isArray(u)&&u[0]==="zoom";if((a[0]==="interpolate"||a[0]==="interpolate-hcl"||a[0]==="interpolate-lab")&&s(a[2]))for(let u=3;u<a.length;u+=2)t.add(Number(a[u]));else if(a[0]==="step"&&s(a[1]))for(let u=3;u<a.length;u+=2){let l=Number(a[u]);t.add(l),t.add(l-0.01)}for(let u of a)n(u)};n(e);let o=[...t].filter(Number.isFinite);if(o.length===0)o.push(0);let[r,i]=[Math.min(...o),Math.max(...o)];for(let a=Math.ceil(r);a<=Math.floor(i);a+=1)o.push(a);return[...new Set(o)].sort((a,s)=>a-s).map((a)=>[a,Number(z(e,{zoom:a,properties:{},type:"Unknown"}))])}function Ue(e){return e*360-180}function ze(e){return Math.atan(Math.sinh(Math.PI*(1-2*e)))*180/Math.PI}function $e(e,t){for(let n of e.sprites){let o=n.icons[t];if(o)return{icon:o,image:n.image}}return}var se=new Map,qe=96,ae=new W(qe);function vt(e){return Math.max(16,Math.ceil(qe/Math.max(1,e)))}var we=new Set,Q=new Set,ve=new Map,kt={},He=Re(),xe=new W(64,(e)=>e.then((t)=>setTimeout(()=>t?.close(),0),()=>{return}));function At(e,t="auto"){let n=xe.get(e);if(n)return n;let o=(async()=>{let r=de(e);if(r){let s=await r;return s&&createImageBitmap(new Blob([s]))}let a=await fetch(e,q(e,{priority:t}));if(a.status===404||a.status===204)return;if(!a.ok)throw Error(`${e}: ${a.status}`);return createImageBitmap(await a.blob())})();return o.catch(()=>xe.delete(e)),xe.set(e,o),o}function We(e,t="auto"){let n=ae.get(e);if(n)return n;let o=(async()=>{let r=de(e);if(r){let i=await r;return i&&me(i)}for(let i=0;;i+=1){let s=await fetch(e,q(e,{priority:t}));if(s.status===404||s.status===204)return;if(s.ok)return me(new Uint8Array(await s.arrayBuffer()));if(i>=2)throw Error(`${e}: ${s.status}`);await new Promise((u)=>setTimeout(u,400*(i+1)))}})();return o.catch(()=>ae.delete(e)),ae.set(e,o),o}function Mt(e,t,n,o){let r=Math.max(0,Math.min(t-1,e.maxzoom)),i=t-r,a=2**Math.max(0,i),[s,u]=i>=0?[Math.floor(n/a),Math.floor(o/a)]:[n,o],l=e.tiles.replace("{z}",String(r)).replace("{x}",String(s)).replace("{y}",String(u)),c=1/a;return{url:l,vz:r,vx:s,vy:u,part:c,ox:n%a*c,oy:o%a*c}}var w=(e,t,n,o,r)=>{let i=e[t]?.[n];if(i===void 0)return r;let a=Array.isArray(i)&&!ie(i)?i:z(i,o);return a===void 0||a===null?r:a};function Z(e,t){let n=X(e)??[0,0,0,1];return oe([n[0],n[1],n[2],n[3]*t])}function Ve(e,t){if(e.layout?.visibility==="none")return!1;return t>=(e.minzoom??0)&&t<(e.maxzoom??24)}function St(e,t){if(e.patterns.has(t))return e.patterns.get(t);let n=$e(e,t),o;if(n&&n.icon.width>0&&n.icon.height>0){let{icon:r}=n;o=new OffscreenCanvas(r.width,r.height),o.getContext("2d")?.drawImage(n.image,r.x,r.y,r.width,r.height,0,0,r.width,r.height)}return e.patterns.set(t,o),o}var ke=new Map;function Pt(e){let t=ke.get(e)?.pop()??new OffscreenCanvas(e,e),n=t.getContext("2d",{willReadFrequently:!0});if(!n)throw Error("no 2D context");return n.setTransform(1,0,0,1,0,0),n.globalAlpha=1,n.setLineDash([]),n.clearRect(0,0,e,e),{canvas:t,g:n}}function Ct(e){let t=ke.get(e.width)??[];if(ke.set(e.width,t),t.length<4)t.push(e)}function Lt(e,t,n){if(n)return Promise.resolve(e.transferToImageBitmap());return createImageBitmap(t.getImageData(0,0,e.width,e.height),{premultiplyAlpha:"none"})}async function Rt(e,t,n,o,r,i,a){let s=Mt(e,t,n,o),u=await We(s.url,a);if(Q.has(i))return;let{canvas:l,g:c}=Pt(r);try{return await Tt(e,s,u,l,c,t,n,o,r,i,a)}finally{Ct(l)}}async function Tt(e,t,n,o,r,i,a,s,u,l,c){let h=Math.max(0,i-1),m=u/256,C=!1,f=!1;for(let b of e.layers){if(!Ve(b,h))continue;let k={zoom:h,properties:{},type:"Unknown"};if(b.type==="background"){let v=w(b,"paint","background-color",k,"#000"),p=Number(w(b,"paint","background-opacity",k,1));if(r.fillStyle=Z(v,p),r.fillRect(0,0,u,u),(X(v)??[0,0,0,1])[3]*p>=1)f=!0;C=!0;continue}if(b.type==="raster"){let v=b.source===void 0?void 0:e.rasters[b.source];if(!v)continue;let p=Math.max(0,Math.min(i-(v.tileSize>=512?1:0),v.maxzoom)),g=2**(i-p),M=v.tiles.replace("{z}",String(p)).replace("{x}",String(Math.floor(a/g))).replace("{y}",String(Math.floor(s/g))),y=await At(M,c).catch(()=>{return});if(Q.has(l))return;if(!y)continue;let[L,A]=[y.width/g,y.height/g];r.globalAlpha=Number(w(b,"paint","raster-opacity",k,1)),r.drawImage(y,a%g*L,s%g*A,L,A,0,0,u,u),r.globalAlpha=1,C=!0;continue}let d=n?.get(b["source-layer"]??"");if(!d)continue;let R=u/(d.extent*t.part),[O,j]=[t.ox*d.extent,t.oy*d.extent],J=(v,p)=>{r.beginPath();for(let g of v.geometry){for(let M=0;M+1<g.length;M+=2){let[y,L]=[((g[M]??0)-O)*R,((g[M+1]??0)-j)*R];if(M===0)r.moveTo(y,L);else r.lineTo(y,L)}if(p)r.closePath()}},P=new Map,x=(v,p,g,M)=>{let y=P.get(p);if(y===void 0)y=G(b[v]?.[p]),P.set(p,y);return w(b,v,p,y?g:k,M)};for(let v of d.features){let p=pe(v,h);if(!he(b.filter,p))continue;if(b.type==="fill-extrusion"&&v.type===3)J(v,!0),r.fillStyle=Z(x("paint","fill-extrusion-color",p,"#000"),Number(x("paint","fill-extrusion-opacity",p,1))),r.fill("evenodd"),C=!0;else if(b.type==="fill"&&v.type===3){let g=Number(x("paint","fill-opacity",p,1)),M=x("paint","fill-pattern",p,void 0);J(v,!0);let y=typeof M==="string"?$e(e,M)?.icon:void 0,L=y&&St(e,M);if(y&&L){let A=r.createPattern(L,"repeat");if(A)A.setTransform(new DOMMatrix().scale(m/(y.pixelRatio??1))),r.globalAlpha=g,r.fillStyle=A,r.fill("evenodd"),r.globalAlpha=1}else{r.fillStyle=Z(x("paint","fill-color",p,"#000"),g),r.fill("evenodd");let A=x("paint","fill-outline-color",p,void 0);if(A!==void 0)r.strokeStyle=Z(A,g),r.lineWidth=m,r.setLineDash([]),r.stroke()}C=!0}else if(b.type==="line"&&v.type!==1){let g=Number(x("paint","line-width",p,1));if(g<=0)continue;let M=Number(x("paint","line-gap-width",p,0));r.strokeStyle=Z(x("paint","line-color",p,"#000"),Number(x("paint","line-opacity",p,1))),r.lineWidth=(M>0?M+2*g:g)*m,r.lineCap=String(x("layout","line-cap",p,"butt")),r.lineJoin=String(x("layout","line-join",p,"miter"));let y=x("paint","line-dasharray",p,void 0);r.setLineDash(Array.isArray(y)?y.map((L)=>Number(L)*g*m):[]),J(v,v.type===3),r.stroke(),C=!0}else if(b.type==="circle"&&v.type===1){let g=Number(x("paint","circle-radius",p,5))*m;r.fillStyle=Z(x("paint","circle-color",p,"#000"),Number(x("paint","circle-opacity",p,1)));let M=Number(x("paint","circle-stroke-width",p,0))*m;r.strokeStyle=Z(x("paint","circle-stroke-color",p,"#000"),Number(x("paint","circle-stroke-opacity",p,1))),r.lineWidth=M;for(let y of v.geometry)for(let L=0;L+1<y.length;L+=2)if(r.beginPath(),r.arc(((y[L]??0)-O)*R,((y[L+1]??0)-j)*R,g,0,2*Math.PI),r.fill(),M>0)r.stroke();C=!0}}}if(!C&&!n)return null;return Lt(o,r,f)}function je(e,t,n){let o=Boolean(w(e,"layout",`${t}-allow-overlap`,n,!1)),r=Boolean(w(e,"layout",`${t}-ignore-placement`,n,!1));if(o&&r)return!0;if(o)return"allow";return r?"ignore":!1}function Nt(e,t){return Array.isArray(e)?[Number(e[0]??t[0]),Number(e[1]??t[1])]:t}function It(e){let t=(Array.isArray(e)?e:[e]).map((a)=>Number(a)||0),[n=0,o=n,r=n,i=o]=t;return[n,o,r,i]}function Et(e,t){let n=0;for(let a=2;a+1<e.length;a+=2)n+=Math.hypot((e[a]??0)-(e[a-2]??0),(e[a+1]??0)-(e[a-1]??0));let o=[];if(!(n>0)||!(t>0))return o;let r=Math.min(t/2,n/2),i=0;for(let a=2;a+1<e.length;a+=2){let[s,u,l,c]=[e[a-2]??0,e[a-1]??0,e[a]??0,e[a+1]??0],h=Math.hypot(l-s,c-u);while(h>0&&r<=i+h){let m=(r-i)/h;o.push([s+(l-s)*m,u+(c-u)*m,s,u,l,c]),r+=t}i+=h}return o}function K(e,t,n,o,r,i){let a=2**e;return[Ue((t+r/o)/a),ze((n+i/o)/a)]}function Ot(e,t,n,o,r){let i=w(e,"layout","icon-rotation-alignment",n,"auto"),a=String(w(e,"layout","icon-text-fit",n,"none")),s=w(e,"layout","icon-text-fit-padding",n,[0,0,0,0]);return{image:t,size:G(e.layout?.["icon-size"])?Number(w(e,"layout","icon-size",n,1)):r(e),anchor:String(w(e,"layout","icon-anchor",n,"center")),offset:Nt(w(e,"layout","icon-offset",n,[0,0]),[0,0]),rotate:Number(w(e,"layout","icon-rotate",n,0))||0,alignment:i==="map"||i==="auto"&&o==="line"?"map":"viewport",overlap:je(e,"icon",n),optional:Boolean(w(e,"layout","icon-optional",n,!1)),fit:a==="width"||a==="height"||a==="both"?a:"none",padding:It(s),color:String(w(e,"paint","icon-color",n,"#000")),opacity:Number(w(e,"paint","icon-opacity",n,1))}}async function Jt(e,t,n,o,r,i,a=t){let s=e.tiles.replace("{z}",String(t)).replace("{x}",String(n)).replace("{y}",String(o)),u=await We(s,i);if(!u||Q.has(r))return[];let l=[],c=new Map,h=(f)=>{let b=c.get(f);if(b===void 0){let k=f.layout?.["text-size"]??16;b=ie(k)?ye(k):k,c.set(f,b)}return b},m=new Map,C=(f)=>{let b=m.get(f);if(b===void 0){let k=f.layout?.["icon-size"]??1;b=ie(k)?ye(k):k,m.set(f,b)}return b};return e.layers.forEach((f,b)=>{let k=f.layout??{};if(f.type!=="symbol"||!Ve(f,a))return;if(k["text-field"]===void 0&&k["icon-image"]===void 0)return;let d=u.get(f["source-layer"]??"");if(!d)return;let R={zoom:a,properties:{},type:"Unknown"},O=w(f,"layout","symbol-placement",R,"point")==="line"?"line":"point",j=O==="line"&&w(f,"layout","text-rotation-alignment",R,"auto")!=="viewport";for(let J of d.features){let P=pe(J,a);if(!he(f.filter,P))continue;let x=ge(k["text-field"],P).trim(),v=ge(k["icon-image"],P).trim();if(!x&&!v)continue;let p=w(f,"layout","text-transform",P,"none");if(p==="uppercase")x=x.toUpperCase();else if(p==="lowercase")x=x.toLowerCase();let g=w(f,"layout","text-font",P,["Noto Sans Regular"]),M=Be(Array.isArray(g)&&typeof g[0]==="string"?g[0]:"Noto Sans Regular"),y=w(f,"layout","text-offset",P,[0,0]),L={layer:b,text:x,font:M,size:G(f.layout?.["text-size"])?Number(w(f,"layout","text-size",P,16)):h(f),color:String(w(f,"paint","text-color",P,"#000")),haloColor:String(w(f,"paint","text-halo-color",P,"rgba(0,0,0,0)")),haloWidth:Number(w(f,"paint","text-halo-width",P,0)),anchor:String(w(f,"layout","text-anchor",P,"center")),offset:Array.isArray(y)?[Number(y[0]??0),Number(y[1]??0)]:[0,0],maxWidth:Number(w(f,"layout","text-max-width",P,10)),lineHeight:Number(w(f,"layout","text-line-height",P,1.2)),overlap:je(f,"text",P),...j?{textAlong:j}:{},...w(f,"layout","text-optional",P,!1)?{textOptional:!0}:{},...v?{icon:Ot(f,v,P,O,C)}:{}};if(J.type===1)for(let A of J.geometry)for(let E=0;E+1<A.length;E+=2){let[I,S]=[A[E]??0,A[E+1]??0];if(I<0||S<0||I>=d.extent||S>=d.extent)continue;let[N,T]=K(t,n,o,d.extent,I,S);l.push({...L,lon:N,lat:T})}else if(!x&&O==="line"){let A=Number(w(f,"layout","symbol-spacing",P,250))*d.extent/(512*2**(a-t));for(let E of J.geometry)for(let[I=0,S=0,N=0,T=0,D=0,H=0]of Et(E,Math.max(A,1))){if(I<0||S<0||I>=d.extent||S>=d.extent)continue;let[F,B]=K(t,n,o,d.extent,I,S),[U,ue]=K(t,n,o,d.extent,D,H),[le,ce]=K(t,n,o,d.extent,N,T);l.push({...L,lon:F,lat:B,along:[U-le,ue-ce]})}}else{let A,E=0;for(let S of J.geometry){let N=0;for(let T=2;T+1<S.length;T+=2)N+=Math.hypot((S[T]??0)-(S[T-2]??0),(S[T+1]??0)-(S[T-1]??0));if(N>E)E=N,A=S}if(!A||E<d.extent/32)continue;let I=E/2;for(let S=2;S+1<A.length;S+=2){let[N,T,D,H]=[A[S-2]??0,A[S-1]??0,A[S]??0,A[S+1]??0],F=Math.hypot(D-N,H-T);if(F>=I&&F>0){let[B,U]=[N+(D-N)*I/F,T+(H-T)*I/F];if(B<0||U<0||B>=d.extent||U>=d.extent)break;let[ue,le]=K(t,n,o,d.extent,B,U),[ce,_e]=K(t,n,o,d.extent,D,H),[Ze,Ke]=K(t,n,o,d.extent,N,T);l.push({...L,lon:ue,lat:le,...O==="line"?{along:[ce-Ze,_e-Ke]}:{}});break}I-=F}}}}),l}var V=(e,t=[])=>self.postMessage(e,t);self.onmessage=async({data:e})=>{if(e.type==="headers"){Me(e.rules);return}if(e.type==="init"){if(e.workers!==void 0)ae.capacity=vt(e.workers);se.set(e.key,{tiles:e.tiles,maxzoom:e.maxzoom,layers:e.layers,rasters:e.rasters??{},sprites:e.sprites??[],patterns:new Map});return}if(e.type==="drop"){for(let n of se.get(e.key)?.sprites??[])n.image.close();se.delete(e.key);return}if(e.type==="abort"){if(we.has(e.id))Q.add(e.id);ve.get(e.id)?.abort();return}if(e.type==="heights"||e.type==="reproject"){await Dt(e);return}we.add(e.id);let t=se.get(e.key);try{if(!t)throw Error(`no renderer ${e.key}`);if(e.type==="render"){let n=await Rt(t,e.z,e.x,e.y,e.size,e.id,e.priority);if(n)V({id:e.id,image:n},[n]);else V({id:e.id,missing:!0})}else V({id:e.id,labels:await Jt(t,e.z,e.x,e.y,e.id,e.priority,e.zoom)})}catch(n){V({id:e.id,error:String(n)})}finally{we.delete(e.id),Q.delete(e.id)}};async function Dt(e){let t=new AbortController;ve.set(e.id,t);try{if(e.type==="heights"){let n=await Te(e.url,e.encoding,e.floor,t.signal,kt);if(n)V({id:e.id,heights:n},[n.buffer]);else V({id:e.id,missing:!0})}else{He.cache.capacity=e.cached;let n=await He.draw(e.job,t.signal);if(n)V({id:e.id,image:n},[n]);else V({id:e.id,missing:!0})}}catch(n){V({id:e.id,error:String(n)})}finally{ve.delete(e.id)}}export{vt as cacheShare,Et as lineAnchors,Lt as tileImage};
1
+ var qe=[];var Ye=(e)=>{qe=e};var G=(e,t={})=>{let n=String(e),o=qe.filter(([s])=>n.startsWith(s));if(o.length===0)return t;let r=new Headers(t.headers);return o.forEach(([,s])=>{Object.entries(s).forEach(([a,i])=>{r.set(a,i)})}),{...t,headers:r}};class Q{capacity;evict;entries=new Map;constructor(e,t){this.capacity=e;this.evict=t}get size(){return this.entries.size}get(e){let t=this.entries.get(e);if(t!==void 0)this.entries.delete(e),this.entries.set(e,t);return t}has(e){return this.entries.has(e)}set(e,t){this.entries.delete(e),this.entries.set(e,t);for(let[n,o]of this.entries){if(this.entries.size<=this.capacity)break;this.entries.delete(n),this.evict?.(o,n)}}delete(e){return this.entries.delete(e)}values(){return this.entries.values()}clear(){this.entries.clear()}}var Nt=96,Ct=(e,t,n,o,r,s)=>{let a=new Uint8ClampedArray(s*s*4),i=s/r,l=r+1;for(let u=0;u<s;u+=1){let c=(u+0.5)/i,y=Math.min(r-1,Math.floor(c)),m=c-y;for(let g=0;g<s;g+=1){let f=(g+0.5)/i,d=Math.min(r-1,Math.floor(f)),p=f-d,b=2*(y*l+d),h=b+2*l,I=(1-p)*(1-m),O=p*(1-m),C=(1-p)*m,S=p*m,x=I*o[b]+O*o[b+2]+C*o[h]+S*o[h+2],v=I*o[b+1]+O*o[b+3]+C*o[h+1]+S*o[h+3],A=x-0.5,M=v-0.5;if(!(A>-1&&M>-1&&A<t&&M<n))continue;let L=Math.floor(A),E=Math.floor(M),w=A-L,k=M-E,F=0,P=0,N=0,_=0;for(let D=0;D<4;D+=1){let W=L+(D&1),V=E+(D>>1);if(W<0||V<0||W>=t||V>=n)continue;let q=4*(V*t+W),U=(D&1?w:1-w)*(D>>1?k:1-k)*e[q+3];F+=U*e[q],P+=U*e[q+1],N+=U*e[q+2],_+=U}if(_<=0)continue;let B=4*(u*s+g);a[B]=F/_,a[B+1]=P/_,a[B+2]=N/_,a[B+3]=_}}return a},Ke=(e=Nt)=>{let t=new Map,n=new Set,o=(u)=>{n.delete(u),u.then((c)=>c?.close(),()=>{return})},r=(u)=>{if(t.has(u))n.add(u);else o(u)},s=new Q(e,r),a=(u)=>{let c=(t.get(u)??1)-1;if(c>0)t.set(u,c);else if(t.delete(u),n.has(u))o(u)},i=(u)=>{let c=()=>{let m=(async()=>{let g=await fetch(u,G(u));if(g.status===404||g.status===204||g.status===410)return null;if(!g.ok)throw Error(`isard: ${g.status} for a raster to reproject`);return createImageBitmap(await g.blob())})();return m.catch(()=>s.delete(u)),s.set(u,m),m},y=s.get(u)??c();return t.set(y,(t.get(y)??0)+1),y};return{draw:async(u,c)=>{let y=u.sources.map((m)=>[m,i(m.url)]);try{let m=await Promise.all(y.map(async([b,h])=>[b,await h]));if(c.throwIfAborted(),!m.some(([,b])=>b))return null;let f=new OffscreenCanvas(u.width,u.height).getContext("2d",{willReadFrequently:!0});if(!f)throw Error("isard: no 2D canvas to reproject the tiles");m.forEach(([b,h])=>{if(h)f.drawImage(h,b.x,b.y,b.w,b.h)});let d=f.getImageData(0,0,u.width,u.height).data,p=Ct(d,u.width,u.height,u.mesh,u.n,u.size);return createImageBitmap(new ImageData(p,u.size,u.size),{premultiplyAlpha:"none"})}finally{y.forEach(([,m])=>{a(m)})}},cache:s,close:()=>{[...s.values()].forEach(r),s.clear()}}};var oe=256,Lt=(e,t,n=Number.NEGATIVE_INFINITY)=>{let o=e.length>>2,r=new Float32Array(o);if(t==="terrarium")for(let s=0,a=0;s<o;s+=1,a+=4){let i=e[a]*256+e[a+1]+e[a+2]/256-32768;r[s]=i>n?i:n}else for(let s=0,a=0;s<o;s+=1,a+=4){let i=-1e4+(e[a]*65536+e[a+1]*256+e[a+2])*0.1;r[s]=i>n?i:n}return r},Ze=async(e,t,n,o,r)=>{let s=await fetch(e,G(e,{signal:o}));if(s.status===404||s.status===204||s.status===410)return null;if(!s.ok)throw Error(`${s.url}: ${s.status}`);let a=await createImageBitmap(await s.blob(),{premultiplyAlpha:"none",colorSpaceConversion:"none"});try{r.canvas??=new OffscreenCanvas(oe,oe);let i=r.canvas.getContext("2d",{willReadFrequently:!0});if(!i)throw Error("no 2D context");return i.imageSmoothingEnabled=!1,i.clearRect(0,0,oe,oe),i.drawImage(a,0,0,oe,oe),Lt(i.getImageData(0,0,oe,oe).data,t,n)}finally{a.close()}};var Ft="aliceblue f0f8ff antiquewhite faebd7 aqua 00ffff aquamarine 7fffd4 azure f0ffff beige f5f5dc bisque ffe4c4 black 000000 blanchedalmond ffebcd blue 0000ff blueviolet 8a2be2 brown a52a2a burlywood deb887 cadetblue 5f9ea0 chartreuse 7fff00 chocolate d2691e coral ff7f50 cornflowerblue 6495ed cornsilk fff8dc crimson dc143c cyan 00ffff darkblue 00008b darkcyan 008b8b darkgoldenrod b8860b darkgray a9a9a9 darkgreen 006400 darkgrey a9a9a9 darkkhaki bdb76b darkmagenta 8b008b darkolivegreen 556b2f darkorange ff8c00 darkorchid 9932cc darkred 8b0000 darksalmon e9967a darkseagreen 8fbc8f darkslateblue 483d8b darkslategray 2f4f4f darkslategrey 2f4f4f darkturquoise 00ced1 darkviolet 9400d3 deeppink ff1493 deepskyblue 00bfff dimgray 696969 dimgrey 696969 dodgerblue 1e90ff firebrick b22222 floralwhite fffaf0 forestgreen 228b22 fuchsia ff00ff gainsboro dcdcdc ghostwhite f8f8ff gold ffd700 goldenrod daa520 gray 808080 green 008000 greenyellow adff2f grey 808080 honeydew f0fff0 hotpink ff69b4 indianred cd5c5c indigo 4b0082 ivory fffff0 khaki f0e68c lavender e6e6fa lavenderblush fff0f5 lawngreen 7cfc00 lemonchiffon fffacd lightblue add8e6 lightcoral f08080 lightcyan e0ffff lightgoldenrodyellow fafad2 lightgray d3d3d3 lightgreen 90ee90 lightgrey d3d3d3 lightpink ffb6c1 lightsalmon ffa07a lightseagreen 20b2aa lightskyblue 87cefa lightslategray 778899 lightslategrey 778899 lightsteelblue b0c4de lightyellow ffffe0 lime 00ff00 limegreen 32cd32 linen faf0e6 magenta ff00ff maroon 800000 mediumaquamarine 66cdaa mediumblue 0000cd mediumorchid ba55d3 mediumpurple 9370db mediumseagreen 3cb371 mediumslateblue 7b68ee mediumspringgreen 00fa9a mediumturquoise 48d1cc mediumvioletred c71585 midnightblue 191970 mintcream f5fffa mistyrose ffe4e1 moccasin ffe4b5 navajowhite ffdead navy 000080 oldlace fdf5e6 olive 808000 olivedrab 6b8e23 orange ffa500 orangered ff4500 orchid da70d6 palegoldenrod eee8aa palegreen 98fb98 paleturquoise afeeee palevioletred db7093 papayawhip ffefd5 peachpuff ffdab9 peru cd853f pink ffc0cb plum dda0dd powderblue b0e0e6 purple 800080 rebeccapurple 663399 red ff0000 rosybrown bc8f8f royalblue 4169e1 saddlebrown 8b4513 salmon fa8072 sandybrown f4a460 seagreen 2e8b57 seashell fff5ee sienna a0522d silver c0c0c0 skyblue 87ceeb slateblue 6a5acd slategray 708090 slategrey 708090 snow fffafa springgreen 00ff7f steelblue 4682b4 tan d2b48c teal 008080 thistle d8bfd8 tomato ff6347 turquoise 40e0d0 violet ee82ee wheat f5deb3 white ffffff whitesmoke f5f5f5 yellow ffff00 yellowgreen 9acd32",Pe,Ut=(e)=>{if(!Pe){let t=Ft.split(" ");Pe=new Map(Array.from({length:Math.floor(t.length/2)},(n,o)=>[t[2*o]??"",t[2*o+1]??""]))}return Pe.get(e)},Ae=(e)=>Number.isFinite(e)?Math.max(0,Math.min(1,e)):0,Xe=(e)=>{if(!/^[0-9a-f]+$/.test(e)||![3,4,6,8].includes(e.length))return;let t=e.length<=4?[...e].map((o)=>o+o).join(""):e,n=(o)=>Number.parseInt(t.slice(o,o+2),16)/255;return[n(0),n(2),n(4),t.length===8?n(6):1]},Ot=(e)=>{if(e===void 0)return 1;return Ae(e.endsWith("%")?Number.parseFloat(e)/100:Number.parseFloat(e))},Dt=(e,t,n)=>{let o=n<0.5?n*(1+t):n+t-n*t,r=2*n-o,s=(a)=>{let i=(a%1+1)%1;if(i<0.16666666666666666)return r+(o-r)*6*i;if(i<0.5)return o;if(i<0.6666666666666666)return r+(o-r)*(0.6666666666666666-i)*6;return r};return[s(e+0.3333333333333333),s(e),s(e-0.3333333333333333)]},Ge=(e)=>{if(typeof e!=="string")return;let t=e.trim().toLowerCase();if(t.startsWith("#"))return Xe(t.slice(1));if(t==="transparent")return[0,0,0,0];let n=Ut(t);if(n)return Xe(n);let o=/^(rgba?|hsla?)\(([^)]*)\)$/.exec(t);if(!o?.[1]||o[2]===void 0)return;let r=o[2].split(/[\s,/]+/).filter(Boolean);if(r.length<3||r.slice(0,3).some((c)=>Number.isNaN(Number.parseFloat(c))))return;let s=Ot(r[3]);if(o[1].startsWith("rgb")){let c=(y)=>Ae(y.endsWith("%")?Number.parseFloat(y)/100:Number.parseFloat(y)/255);return[c(r[0]??""),c(r[1]??""),c(r[2]??""),s]}let a=Number.parseFloat(r[0]??"")/360,[i,l,u]=Dt(a,Ae(Number.parseFloat(r[1]??"")/100),Ae(Number.parseFloat(r[2]??"")/100));return[i,l,u,s]};var ce=(e)=>typeof e==="object"&&e!==null&&!Array.isArray(e);var Bt=["Unknown","Point","LineString","Polygon"],te=(e,t)=>({zoom:t,properties:e.properties,type:Bt[e.type]??"Unknown"}),ee=(e)=>Ge(e),ve=([e,t,n,o])=>`rgba(${Math.round(e*255)},${Math.round(t*255)},${Math.round(n*255)},${o})`,nt=(e,t,n,o=1)=>{let r=n-t;if(r===0)return 0;let s=e-t;return o===1?s/r:(o**s-1)/(o**r-1)},Ce=(e,t,n)=>{if(typeof e==="number"&&typeof t==="number")return e+(t-e)*n;let o=ee(e),r=ee(t);if(o&&r){let s=(a)=>o[a]+(r[a]-o[a])*n;return ve([s(0),s(1),s(2),s(3)])}if(Array.isArray(e)&&Array.isArray(t))return e.map((s,a)=>Ce(s,t[a],n));return n<0.5?e:t},rt=(e)=>typeof e==="object"&&e!==null&&!Array.isArray(e)&&Array.isArray(e.stops),Vt=(e,t)=>{let n=e.property===void 0?t.zoom:t.properties[e.property],o=e.stops,r=e.type??(e.property===void 0||typeof o[0]?.[0]==="number"?"exponential":"categorical");if(r==="identity")return n??e.default;if(r==="categorical")return o.find(([c])=>c===n)?.[1]??e.default;if(typeof n!=="number"||!o.length)return e.default??o[0]?.[1];let s=([c])=>{if(Array.isArray(c))return Number.NaN;return ce(c)?Number(c.zoom):Number(c)},a=o[0];if(!a)return e.default;if(n<=s(a))return a[1];let i=o.findIndex((c,y)=>y>0&&Boolean(o[y-1])&&Boolean(c)&&n<s(c)),[l,u]=[o[i-1],o[i]];if(i<0||!l||!u)return o.at(-1)?.[1];if(r==="interval")return l[1];return Ce(l[1],u[1],nt(n,s(l),s(u),e.base??1))},Ne=(e)=>e,Qe={"<":(e,t)=>e<t,"<=":(e,t)=>e<=t,">":(e,t)=>e>t,">=":(e,t)=>e>=t},ot=(e,t,n)=>{let o=(a)=>typeof a==="object"&&a!==null?String(a):a,[r,s]=[o(t),o(n)];return typeof r==="string"&&typeof s==="string"?Qe[e](r,s):Qe[e](Number(r),Number(s))},Se=(e,t)=>{if(t==="$type")return e.type;return typeof t==="string"?e.properties[t]:void 0},Jt=new Set(["literal","zoom","get","has","!has","properties","id","geometry-type","concat","format","image","number-format","to-number","to-string","to-boolean","to-color","number","string","boolean","typeof","length","at","upcase","downcase","coalesce","!","all","any","==","!=","<","<=",">",">=","in","case","match","step","interpolate","interpolate-hcl","interpolate-lab","rgb","rgba","+","-","*","/","%","^","min","max","abs","round","floor","ceil","sqrt","ln","log10","log2","pi","e"]),me=(e)=>Array.isArray(e)&&typeof e[0]==="string"&&Jt.has(e[0]),et=new Set,fe=(e)=>e===void 0||e===null?"":String(e),Z=(e,t)=>{if(rt(e))return Vt(e,t);if(!Array.isArray(e))return e;let[n,...o]=e;if(typeof n!=="string")return e;let r=(i)=>Z(o[i]??null,t),s=(i)=>Number(r(i)),a=()=>o.map((i,l)=>s(l));switch(n){case"literal":return o[0];case"zoom":return t.zoom;case"get":return Se(t,r(0));case"has":return Se(t,r(0))!==void 0;case"!has":return Se(t,r(0))===void 0;case"properties":return t.properties;case"id":return null;case"geometry-type":return t.type;case"concat":return o.map((i,l)=>fe(r(l))).join("");case"format":return o.map((i,l)=>i!==null&&typeof i==="object"&&!Array.isArray(i)?"":fe(r(l))).join("");case"image":return r(0);case"number-format":{let i=ce(o[1])?o[1]:{},l=(c)=>{let y=i[c];return typeof y==="number"?y:void 0},u=s(0);if(!Number.isFinite(u))return"";return u.toLocaleString(typeof i.locale==="string"?i.locale:void 0,{minimumFractionDigits:l("min-fraction-digits"),maximumFractionDigits:l("max-fraction-digits")})}case"to-number":{for(let i=0;i<o.length;i+=1){let l=r(i),u=typeof l==="string"&&l.trim()===""?Number.NaN:Number(l);if(l!==null&&l!==void 0&&!Number.isNaN(u))return u}return 0}case"to-string":return fe(r(0));case"to-boolean":{let i=r(0);return!(i===""||i===0||i===!1||i===null||i===void 0||Number.isNaN(i))}case"to-color":case"number":case"string":case"boolean":{let i={"to-color":(l)=>ee(l)!==void 0,number:(l)=>typeof l==="number",string:(l)=>typeof l==="string",boolean:(l)=>typeof l==="boolean"};for(let l=0;l<o.length;l+=1){let u=r(l);if(i[n]?.(u))return u}return o.length?r(o.length-1):null}case"typeof":{let i=r(0);if(i===null||i===void 0)return"null";return Array.isArray(i)?"array":typeof i}case"length":{let i=r(0);return typeof i==="string"||Array.isArray(i)?i.length:0}case"at":{let i=r(1);return Array.isArray(i)?i[s(0)]??null:null}case"upcase":return fe(r(0)).toUpperCase();case"downcase":return fe(r(0)).toLowerCase();case"coalesce":for(let i=0;i<o.length;i+=1){let l=r(i);if(l!==void 0&&l!==null)return l}return null;case"!":return!r(0);case"all":return o.every((i,l)=>Boolean(r(l)));case"any":return o.some((i,l)=>Boolean(r(l)));case"==":return r(0)===r(1);case"!=":return r(0)!==r(1);case"<":case"<=":case">":case">=":return ot(n,r(0),r(1));case"in":{let i=r(1),l=r(0);if(typeof i==="string")return i.includes(String(l));return Array.isArray(i)&&i.includes(l)}case"case":{let i=o.findIndex((l,u)=>u%2===0&&u+1<o.length&&Boolean(r(u)));return i<0?r(o.length-1):r(i+1)}case"match":{let i=r(0),l=o.findIndex((u,c)=>c%2===1&&c+1<o.length&&(Array.isArray(u)?Ne(u).includes(i):u===i));return l<0?r(o.length-1):r(l+1)}case"step":{let i=s(0),l=r(1);for(let u=2;u+1<o.length;u+=2)if(i>=Number(o[u]))l=r(u+1);else break;return l}case"interpolate":case"interpolate-hcl":case"interpolate-lab":{let i=o[0],l=s(1),u=Array.isArray(i)&&i[0]==="exponential"?Number(i[1]):1,c=Array.from({length:Math.floor((o.length-2)/2)},(d,p)=>[Number(o[2+2*p]),o[3+2*p]??null]),y=c[0];if(!y)return null;if(l<=y[0])return Z(y[1],t);let m=c.findIndex((d,p)=>p>0&&l<d[0]),[g,f]=[c[m-1],c[m]];if(m<0||!g||!f)return Z(c.at(-1)?.[1]??null,t);return Ce(Z(g[1],t),Z(f[1],t),nt(l,g[0],f[0],u))}case"rgb":case"rgba":return ve([s(0)/255,s(1)/255,s(2)/255,o.length>3?s(3):1]);case"+":return a().reduce((i,l)=>i+l,0);case"*":return a().reduce((i,l)=>i*l,1);case"-":return o.length===1?-s(0):s(0)-s(1);case"/":return s(0)/s(1);case"%":return s(0)%s(1);case"^":return s(0)**s(1);case"min":return Math.min(...a());case"max":return Math.max(...a());case"abs":return Math.abs(s(0));case"round":return Math.sign(s(0))*Math.round(Math.abs(s(0)));case"floor":return Math.floor(s(0));case"ceil":return Math.ceil(s(0));case"sqrt":return Math.sqrt(s(0));case"ln":return Math.log(s(0));case"log10":return Math.log10(s(0));case"log2":return Math.log2(s(0));case"pi":return Math.PI;case"e":return Math.E;default:if(!et.has(n))et.add(n),console.warn(`isard: the style expression "${n}" is not supported`);return null}},Wt=new Set(["==","!=","<","<=",">",">="]),_e=(e)=>{let t=e.paint??{};if(["fill-pattern","line-pattern","fill-extrusion-pattern","background-pattern"].some((n)=>(n in t)))return;if(e.type==="line")return"line";if(e.type==="fill-extrusion")return"extrusion";return e.type==="fill"||e.type==="background"?"fill":void 0},Ht=(e)=>{let[t,n,...o]=e;if(typeof t!=="string"||typeof n!=="string"||o.some(Array.isArray))return!1;if(Wt.has(t))return e.length===3;if(t==="in")return e.length!==3||!Array.isArray(e[2]);return t==="!in"||t==="has"||t==="!has"},$t=(e,t)=>{let[n,o,...r]=e,s=Se(t,o);switch(n){case"==":return s===r[0];case"!=":return s!==r[0];case"<":case"<=":case">":case">=":return ot(n,s,r[0]);case"in":return Ne(r).includes(s);case"!in":return!Ne(r).includes(s);case"has":return s!==void 0;case"!has":return s===void 0;default:return!0}},tt=new WeakMap,st=(e)=>{if(!Array.isArray(e))return()=>Boolean(e);let t=tt.get(e);if(t)return t;let o=(()=>{let r=e[0];if(r==="all"||r==="any"||r==="none"){let s=e.slice(1).map(st);if(r==="all")return(a)=>s.every((i)=>i(a));if(r==="any")return(a)=>s.some((i)=>i(a));return(a)=>!s.some((i)=>i(a))}if(Ht(e))return(s)=>$t(e,s);return(s)=>Boolean(Z(e,s))})();return tt.set(e,o),o},ne=(e,t)=>{if(e===void 0||e===null)return!0;return st(e)(t)},jt=new Set(["get","has","!has","geometry-type","properties","id"]),se=(e)=>{if(e!==void 0&&rt(e))return e.property!==void 0;if(!Array.isArray(e))return!1;if(jt.has(e[0]))return!0;return e.some((t)=>se(t))},Le=(e,t)=>{if(e===void 0||e===null)return"";if(typeof e==="string")return e.replace(/\{([^}]+)\}/g,(o,r)=>{let s=t.properties[r];return s===void 0?"":String(s)});let n=Z(e,t);if(Array.isArray(n))return n.filter((o)=>typeof o==="string").join("");return n===void 0||n===null?"":String(n)},it=(e)=>/Regular|Bold|Italic|Semibold|Light|Medium|Black/.test(e)?e:`${e} Regular`,Fe=(e)=>{let t=new Set,n=(i)=>i.filter((l,u)=>u>=3&&u%2===1).map(Number),o=(i)=>{if(!Array.isArray(i))return;let l=(u)=>Array.isArray(u)&&u[0]==="zoom";if((i[0]==="interpolate"||i[0]==="interpolate-hcl"||i[0]==="interpolate-lab")&&l(i[2]))n(i).forEach((u)=>{t.add(u)});else if(i[0]==="step"&&l(i[1]))n(i).forEach((u)=>{t.add(u),t.add(u-0.01)});i.forEach(o)};o(e);let r=[...t].filter(Number.isFinite);if(r.length===0)r.push(0);let[s,a]=[Math.min(...r),Math.max(...r)];return r.push(...Array.from({length:Math.floor(a)-Math.ceil(s)+1},(i,l)=>Math.ceil(s)+l)),[...new Set(r)].sort((i,l)=>i-l).map((i)=>[i,Number(Z(e,{zoom:i,properties:{},type:"Unknown"}))])};class he{static __wrap(e){let t=Object.create(he.prototype);return t.__wbg_ptr=e,at.register(t,t.__wbg_ptr,t),t}__destroy_into_raw(){let e=this.__wbg_ptr;return this.__wbg_ptr=0,at.unregister(this),e}free(){let e=this.__destroy_into_raw();R.__wbg_tessellatedtile_free(e,0)}blockIndices(){return R.tessellatedtile_blockIndices(this.__wbg_ptr)}blockRanges(){let e=R.tessellatedtile_blockRanges(this.__wbg_ptr);var t=Me(e[0],e[1]).slice();return R.__wbindgen_free(e[0],e[1]*4,4),t}blocks(){return R.tessellatedtile_blocks(this.__wbg_ptr)}bounds(){let e=R.tessellatedtile_bounds(this.__wbg_ptr);var t=Yt(e[0],e[1]).slice();return R.__wbindgen_free(e[0],e[1]*8,8),t}fillRanges(){let e=R.tessellatedtile_fillRanges(this.__wbg_ptr);var t=Me(e[0],e[1]).slice();return R.__wbindgen_free(e[0],e[1]*4,4),t}indices(){return R.tessellatedtile_indices(this.__wbg_ptr)}lineRanges(){let e=R.tessellatedtile_lineRanges(this.__wbg_ptr);var t=Me(e[0],e[1]).slice();return R.__wbindgen_free(e[0],e[1]*4,4),t}lineTable(){return R.tessellatedtile_lineTable(this.__wbg_ptr)}pieces(){return R.tessellatedtile_pieces(this.__wbg_ptr)}prism(){return R.tessellatedtile_prism(this.__wbg_ptr)!==0}vertices(){return R.tessellatedtile_vertices(this.__wbg_ptr)}}if(Symbol.dispose)he.prototype[Symbol.dispose]=he.prototype.free;function lt(e,t,n,o,r,s,a,i,l,u,c,y){let m=Ue(e,R.__wbindgen_malloc),g=Y,f=ae(t,R.__wbindgen_malloc),d=Y,p=ae(n,R.__wbindgen_malloc),b=Y,h=ae(o,R.__wbindgen_malloc),I=Y,O=ae(r,R.__wbindgen_malloc),C=Y,S=Ue(s,R.__wbindgen_malloc),x=Y,v=ae(a,R.__wbindgen_malloc),A=Y,M=ae(i,R.__wbindgen_malloc),L=Y,E=ae(l,R.__wbindgen_malloc),w=Y,k=Gt(u,R.__wbindgen_malloc),F=Y,P=Ue(y,R.__wbindgen_malloc),N=Y,_=R.tessellateVectorTile(m,g,f,d,p,b,h,I,O,C,S,x,v,A,M,L,E,w,k,F,c,P,N);return he.__wrap(_)}function zt(){return{__proto__:null,"./isard_tess_bg.js":{__proto__:null,__wbg___wbindgen_throw_41e9ee4f547fc59a:function(t,n){throw Error(Xt(t,n))},__wbg_new_from_slice_37a3c3a194266cb8:function(t,n){return new Uint32Array(Me(t,n))},__wbg_new_from_slice_9a868026ffa4208a:function(t,n){return new Uint8Array(Kt(t,n))},__wbg_new_from_slice_ca6ad97db1f4779a:function(t,n){return new Float32Array(qt(t,n))},__wbindgen_init_externref_table:function(){let t=R.__wbindgen_externrefs,n=t.grow(4);t.set(0,void 0),t.set(n+0,void 0),t.set(n+1,null),t.set(n+2,!0),t.set(n+3,!1)}}}}var at=typeof FinalizationRegistry>"u"?{register:()=>{},unregister:()=>{}}:new FinalizationRegistry((e)=>R.__wbg_tessellatedtile_free(e,1));function qt(e,t){return e=e>>>0,Zt().subarray(e/4,e/4+t)}function Yt(e,t){return e=e>>>0,ut().subarray(e/8,e/8+t)}function Me(e,t){return e=e>>>0,ct().subarray(e/4,e/4+t)}function Kt(e,t){return e=e>>>0,De().subarray(e/1,e/1+t)}var pe=null;function Zt(){if(pe===null||pe.byteLength===0)pe=new Float32Array(R.memory.buffer);return pe}var be=null;function ut(){if(be===null||be.byteLength===0)be=new Float64Array(R.memory.buffer);return be}function Xt(e,t){return en(e>>>0,t)}var de=null;function ct(){if(de===null||de.byteLength===0)de=new Uint32Array(R.memory.buffer);return de}var ye=null;function De(){if(ye===null||ye.byteLength===0)ye=new Uint8Array(R.memory.buffer);return ye}function ae(e,t){let n=t(e.length*4,4)>>>0;return ct().set(e,n/4),Y=e.length,n}function Gt(e,t){let n=t(e.length*1,1)>>>0;return De().set(e,n/1),Y=e.length,n}function Ue(e,t){let n=t(e.length*8,8)>>>0;return ut().set(e,n/8),Y=e.length,n}var ke=new TextDecoder("utf-8",{ignoreBOM:!0,fatal:!0});ke.decode();var Qt=2146435072,Oe=0;function en(e,t){if(Oe+=t,Oe>=Qt)ke=new TextDecoder("utf-8",{ignoreBOM:!0,fatal:!0}),ke.decode(),Oe=t;return ke.decode(De().subarray(e,e+t))}var Y=0,tn,nn,R;function rn(e,t){return nn=e,R=e.exports,tn=t,pe=null,be=null,de=null,ye=null,R.__wbindgen_start(),R}async function on(e,t){if(typeof Response==="function"&&e instanceof Response){if(!e.ok)throw Error(`failed to fetch Wasm: ${e.status} ${e.statusText} fetching '${e.url}'`);if(typeof WebAssembly.instantiateStreaming==="function")try{return await WebAssembly.instantiateStreaming(e,t)}catch(r){if(n(e.type)&&e.headers.get("Content-Type")!=="application/wasm")console.warn("`WebAssembly.instantiateStreaming` failed because your server does not serve Wasm with `application/wasm` MIME type. Falling back to `WebAssembly.instantiate` which is slower. Original error:\n",r);else throw r}let o=await e.arrayBuffer();return await WebAssembly.instantiate(o,t)}else{let o=await WebAssembly.instantiate(e,t);if(o instanceof WebAssembly.Instance)return{instance:o,module:e};else return o}function n(o){switch(o){case"basic":case"cors":case"default":return!0}return!1}}async function ft(e){if(R!==void 0)return R;if(e!==void 0)if(Object.getPrototypeOf(e)===Object.prototype)({module_or_path:e}=e);else console.warn("using deprecated parameters for the initialization function; pass a single object instead");if(e===void 0)e=new URL("isard_tess_bg.wasm",import.meta.url);let t=zt();if(typeof e==="string"||typeof Request==="function"&&e instanceof Request||typeof URL==="function"&&e instanceof URL)e=fetch(e);let{instance:n,module:o}=await on(await e,t);return rn(n,o)}class Be{buf;end;pos;constructor(e,t=0,n=e.length){this.buf=e;this.end=n;this.pos=t}varint(){let e=0;for(let t=0;t<70;t+=7){let n=this.buf[this.pos++]??0;if(e+=(n&127)*2**t,n<128)break}return e}int64(){let e=0,t=0;for(let n=0;n<10;n+=1){let o=this.buf[this.pos++]??0,r=o&127;if(n<4)e|=r<<7*n;else if(n===4)e|=(r&15)<<28,t|=r>>4;else t|=r<<7*n-32;if(o<128)break}return(t|0)*4294967296+(e>>>0)}sint(){let e=this.varint();return e%2===1?-(e+1)/2:e/2}sub(){let e=this.varint(),t=Math.min(this.pos+e,this.end),n=new Be(this.buf,this.pos,t);return this.pos=t,n}string(){let e=this.varint(),t=Math.min(this.pos+e,this.end),n=sn.decode(this.buf.subarray(this.pos,t));return this.pos=t,n}float(){let e=this.pos+4<=this.end?this.view().getFloat32(this.pos,!0):0;return this.pos+=4,e}double(){let e=this.pos+8<=this.end?this.view().getFloat64(this.pos,!0):0;return this.pos+=8,e}view(){return new DataView(this.buf.buffer,this.buf.byteOffset,this.buf.byteLength)}skip(e){if(e===0)this.varint();else if(e===1)this.pos+=8;else if(e===2)this.pos+=this.varint();else if(e===5)this.pos+=4}get more(){return this.pos<this.end}}var sn=new TextDecoder,an=(e)=>{let t="";while(e.more){let n=e.varint();switch(n>>3){case 1:t=e.string();break;case 2:t=e.float();break;case 3:t=e.double();break;case 4:t=e.int64();break;case 5:t=e.varint();break;case 6:t=e.sint();break;case 7:t=e.varint()!==0;break;default:e.skip(n&7)}}return t},ln=(e)=>{let t=[],n,[o,r]=[0,0];while(e.more){let s=e.varint(),a=s&7,i=s>>3;if(a===7){if(n&&n.length>=2)n.push(n[0]??0,n[1]??0);continue}for(let l=0;l<i&&e.more;l+=1){if(o+=e.sint(),r+=e.sint(),a===1)n=[],t.push(n);n?.push(o,r)}}return t},Ve=(e,t)=>{let n=new Map,o=new Be(e);while(o.more){let r=o.varint();if(r>>3!==3){o.skip(r&7);continue}let s=o.sub(),a="",i=4096,l=[],u=[],c=[];while(s.more){let m=s.varint();switch(m>>3){case 1:a=s.string();break;case 2:c.push(s.sub());break;case 3:l.push(s.string());break;case 4:u.push(an(s.sub()));break;case 5:i=s.varint();break;default:s.skip(m&7)}}if(t&&!t.has(a))continue;let y=[];for(let m of c){let g=1,f={},d=[];while(m.more){let p=m.varint();switch(p>>3){case 2:{let b=m.sub();while(b.more){let h=l[b.varint()],I=u[b.varint()];if(h!==void 0&&I!==void 0)f[h]=I}break}case 3:g=Math.min(3,Math.max(1,m.varint()));break;case 4:d=ln(m.sub());break;default:m.skip(p&7)}}y.push({type:g,properties:f,geometry:d})}n.set(a,{extent:i,features:y})}return n};var un=127,cn=16384,fn=["unknown","mvt","png","jpeg","webp","avif"],mn=(e)=>(4**e-1)/3,pn=(e,t,n)=>{if(e>26)throw Error(`isard: PMTiles level ${e} past 26`);let o=2**e;if(t<0||n<0||t>=o||n>=o)throw Error(`isard: PMTiles tile ${e}/${t}/${n} out of its level`);let[r,s]=[t,n],a=0;for(let i=o/2;i>=1;i/=2){let l=(r&i)>0?1:0,u=(s&i)>0?1:0;if(a+=i*i*(3*l^u),u===0){if(l===1)[r,s]=[i-1-r,i-1-s];[r,s]=[s,r]}}return mn(e)+a};class bt{bytes;pos=0;constructor(e){this.bytes=e}next(){let e=0,t=1;for(;;){let n=this.bytes[this.pos++];if(n===void 0)throw Error("isard: PMTiles directory truncated");if(e+=(n&127)*t,n<128)return e;if(t*=128,t>9223372036854776000)throw Error("isard: PMTiles varint too long")}}}var mt=(e)=>{let t=new bt(e),n=t.next();if(n>e.length)throw Error("isard: PMTiles directory larger than its bytes");let o=[],r=0;for(let s=0;s<n;s+=1)r+=t.next(),o.push({tileId:r,offset:0,length:0,runLength:1});for(let s of o)s.runLength=t.next();for(let s of o)s.length=t.next();return o.forEach((s,a)=>{let i=t.next(),l=o[a-1];s.offset=i===0&&l?l.offset+l.length:i-1}),o},bn=(e,t)=>{let[n,o]=[0,e.length-1];while(n<=o){let s=n+o>>1,a=e[s];if(!a)break;if(a.tileId===t)return a;if(a.tileId<t)n=s+1;else o=s-1}let r=e[o];if(!r)return;if(r.runLength===0||t-r.tileId<r.runLength)return r;return},dn=(e)=>{if(e.length<un||String.fromCharCode(...e.subarray(0,7))!=="PMTiles")throw Error("isard: not a PMTiles archive");if(e[7]!==3)throw Error(`isard: PMTiles version ${e[7]} (only 3 is read)`);let t=new DataView(e.buffer,e.byteOffset,e.byteLength),n=(r)=>Number(t.getBigUint64(r,!0)),o=(r)=>t.getInt32(r,!0)/1e7;return{rootDirectoryOffset:n(8),rootDirectoryLength:n(16),metadataOffset:n(24),metadataLength:n(32),leafDirectoryOffset:n(40),leafDirectoryLength:n(48),tileDataOffset:n(56),tileDataLength:n(64),internalCompression:t.getUint8(97),tileCompression:t.getUint8(98),tileType:fn[t.getUint8(99)]??"unknown",minZoom:t.getUint8(100),maxZoom:t.getUint8(101),bounds:[o(102),o(106),o(110),o(114)],center:[o(119),o(123),t.getUint8(118)]}},Re=async(e,t)=>{if(t===0||t===1)return e;if(t!==2)throw Error(`isard: PMTiles compression ${t===3?"brotli":"zstd"} is not read (gzip only)`);let n=new Blob([e]).stream().pipeThrough(new DecompressionStream("gzip"));return new Uint8Array(await new Response(n).arrayBuffer())},yn=67108864;class dt{source;head;leaves=new Q(64);whole;constructor(e){this.source=e}async range(e,t,n){if(typeof this.source!=="string")return new Uint8Array(await this.source.slice(e,e+t).arrayBuffer());if(this.whole)return(await this.whole).subarray(e,e+t);let o=await fetch(this.source,G(this.source,{headers:{Range:`bytes=${e}-${e+Math.max(t,1)-1}`},...n?{signal:n}:{}}));if(!o.ok)throw Error(`${this.source}: HTTP ${o.status}`);if(o.status===206)return new Uint8Array(await o.arrayBuffer());if(Number(o.headers.get("Content-Length"))>yn)throw await o.body?.cancel(),Error(`${this.source}: the server ignores range requests (HTTP 206 expected)`);let s=o.arrayBuffer().then((a)=>new Uint8Array(a));return this.whole=s,s.catch(()=>{this.whole=void 0}),(await s).subarray(e,e+t)}load(){return this.head??=(async()=>{let e=await this.range(0,cn),t=dn(e),{rootDirectoryOffset:n,rootDirectoryLength:o}=t,r=n+o<=e.length?e.subarray(n,n+o):await this.range(n,o),s=mt(await Re(r,t.internalCompression));return{header:t,root:s}})(),this.head.catch(()=>{this.head=void 0}),this.head}async header(){return(await this.load()).header}async metadata(){let{header:e}=await this.load();if(e.metadataLength===0)return{};let t=await this.range(e.metadataOffset,e.metadataLength),n=new TextDecoder().decode(await Re(t,e.internalCompression)),o=JSON.parse(n);return ce(o)?o:{}}leaf(e,t){let n=e.leafDirectoryOffset+t.offset,o=this.leaves.get(n);if(o)return o;let r=this.range(n,t.length).then(async(s)=>mt(await Re(s,e.internalCompression)));return r.catch(()=>this.leaves.delete(n)),this.leaves.set(n,r),r}async tile(e,t,n,o){let{header:r,root:s}=await this.load();if(e<r.minZoom||e>r.maxZoom)return;let a=pn(e,t,n),i=s;for(let l=0;l<4;l+=1){let u=bn(i,a);if(!u)return;if(u.runLength>0){let c=await this.range(r.tileDataOffset+u.offset,u.length,o);return Re(c,r.tileCompression)}i=await this.leaf(r,u)}throw Error("isard: PMTiles directories nested too deep")}}var pt=new Q(16),hn=(e)=>{let t=pt.get(e);if(t)return t;let n=new dt(e);return pt.set(e,n),n};var Je=(e,t)=>{let n=/^pmtiles:\/\/(.+)\/(\d+)\/(\d+)\/(\d+)$/.exec(e);if(!n)return!1;let[,o="",r,s,a]=n;return hn(o).tile(Number(r),Number(s),Number(a),t)};var yt=(e)=>e*360-180,Ie=(e)=>Math.atan(Math.sinh(Math.PI*(1-2*e)))*180/Math.PI;var He=(e,t)=>{let n=e.sprites.find((r)=>Boolean(r.icons[t])),o=n?.icons[t];return n&&o?{icon:o,image:n.image}:void 0},we=new Map,ht=96,ge=new Q(ht),gt=(e)=>Math.max(16,Math.ceil(ht/Math.max(1,e))),Te=new Set,K=new Set,We=new Q(64,(e)=>e.then((t)=>setTimeout(()=>t?.close(),0),()=>{return})),wt=(e,t="auto")=>{let n=We.get(e);if(n)return n;let o=(async()=>{let r=Je(e);if(r){let i=await r;return i&&createImageBitmap(new Blob([i]))}let a=await fetch(e,G(e,{priority:t}));if(a.status===404||a.status===204)return;if(!a.ok)throw Error(`${e}: ${a.status}`);return createImageBitmap(await a.blob())})();return o.catch(()=>We.delete(e)),We.set(e,o),o},re=(e,t="auto")=>{let n=ge.get(e);if(n)return n;let o=(async()=>{let r=Je(e);if(r){let s=await r;return s&&Ve(s)}for(let s=0;;s+=1){let i=await fetch(e,G(e,{priority:t}));if(i.status===404||i.status===204)return;if(i.ok)return Ve(new Uint8Array(await i.arrayBuffer()));if(s>=2)throw Error(`${e}: ${i.status}`);await new Promise((l)=>setTimeout(l,400*(s+1)))}})();return o.catch(()=>ge.delete(e)),ge.set(e,o),o},xt=(e,t,n,o)=>{let r=Math.max(0,Math.min(t-1,e.maxzoom)),s=t-r,a=2**Math.max(0,s),[i,l]=s>=0?[Math.floor(n/a),Math.floor(o/a)]:[n,o],u=e.tiles.replace("{z}",String(r)).replace("{x}",String(i)).replace("{y}",String(l)),c=1/a;return{url:u,vz:r,vx:i,vy:l,part:c,ox:n%a*c,oy:o%a*c}},T=(e,t,n,o,r)=>{let s=e[t]?.[n];if(s===void 0)return r;let a=Array.isArray(s)&&!me(s)?s:Z(s,o);return a===void 0||a===null?r:a},ie=(e,t)=>{let n=ee(e)??[0,0,0,1];return ve([n[0],n[1],n[2],n[3]*t])},Ee=(e,t)=>{if(e.layout?.visibility==="none")return!1;return t>=(e.minzoom??0)&&t<(e.maxzoom??24)},X=(e,t,n,o,r,s)=>{let a=2**e;return[yt((t+r/o)/a),Ie((n+s/o)/a)]};var At=async(e,t,n,o,r,s)=>{let a=e.tiles.replace("{z}",String(t)).replace("{x}",String(n)).replace("{y}",String(o)),i=await re(a,s),l={points:[],ringStart:[],polygonStart:[],feature:[]},u=[];if(!i||K.has(r))return;let c=new Set,y=2**t;return e.layers.forEach((m)=>{let g=i.get(m["source-layer"]??"");if(!g)return;g.features.forEach((f)=>{if(f.type!==3||c.has(f)||!ne(m.filter,te(f,t)))return;c.add(f);let d=u.length;u.push(f.properties),f.geometry.forEach((p)=>{let b=0;for(let h=0;h+1<p.length;h+=2){let I=(h+2)%p.length;b+=(p[h]??0)*(p[I+1]??0)-(p[I]??0)*(p[h+1]??0)}if(b===0)return;if(b>0||l.polygonStart.length===0||l.feature.at(-1)!==d)l.polygonStart.push(l.ringStart.length),l.feature.push(d);l.ringStart.push(l.points.length/2);for(let h=0;h+1<p.length;h+=2)l.points.push((n+(p[h]??0)/g.extent)/y,(o+(p[h+1]??0)/g.extent)/y)})})}),l.ringStart.push(l.points.length/2),l.polygonStart.push(l.ringStart.length-1),{arrays:{points:Float64Array.from(l.points),ringStart:Uint32Array.from(l.ringStart),polygonStart:Uint32Array.from(l.polygonStart),feature:Uint32Array.from(l.feature)},properties:u}},gn=32,wn=(e,t)=>{let n=e.slice(),o=[[0,0,(r)=>r>=0],[0,t,(r)=>r<=t],[1,0,(r)=>r>=0],[1,t,(r)=>r<=t]];for(let[r,s,a]of o){let i=[],l=n.length/2;for(let u=0;u<l;u+=1){let[c,y]=[n[u*2]??0,n[u*2+1]??0],m=(u+1)%l,[g,f]=[n[m*2]??0,n[m*2+1]??0],[d,p]=r===0?[c,g]:[y,f];if(a(d))i.push(c,y);if(a(d)!==a(p)){let b=(s-d)/(p-d);i.push(r===0?s:c+(g-c)*b,r===0?y+(f-y)*b:s)}}if(n=i,n.length===0)break}return n},xn=(e,t)=>{let n=[],o=[],r=()=>{if(o.length>=4)n.push(o);o=[]};for(let s=2;s+1<e.length;s+=2){let[a,i,l,u]=[e[s-2]??0,e[s-1]??0,e[s]??0,e[s+1]??0],[c,y]=[l-a,u-i],[m,g]=[0,1];for(let[f,d]of[[-c,a],[c,t-a],[-y,i],[y,t-i]])if(f===0){if(d<0)g=-1}else if(f<0)m=Math.max(m,d/f);else g=Math.min(g,d/f);if(m>g){r();continue}if(o.length===0||m>0)r(),o.push(a+c*m,i+y*m);if(o.push(a+c*g,i+y*g),g<1)r()}return r(),n},An=(e,t)=>e>=t?[e-0.5,e+1,e+3,e+6]:[e-0.5,e-0.16666666666666666,e+0.16666666666666666,e+0.5],Sn=(e,t,n,o,r)=>{let s=2**n,[a,i]=[o*t,r*t],l=[Number.POSITIVE_INFINITY,Number.POSITIVE_INFINITY,Number.NEGATIVE_INFINITY,Number.NEGATIVE_INFINITY];e.forEach((g)=>{for(let f=0;f+1<g.length;f+=2){let[d,p]=[(g[f]??0)*s-a,(g[f+1]??0)*s-i];l[0]=Math.min(l[0]??d,d),l[1]=Math.min(l[1]??p,p),l[2]=Math.max(l[2]??d,d),l[3]=Math.max(l[3]??p,p)}});let[u=0,c=0,y=0,m=0]=l;if(y<=0||m<=0||u>=t||c>=t)return;return e.map((g)=>g.map((f,d)=>f*s-(d%2===0?a:i)))},St=async(e,{z:t,x:n,y:o,deepest:r=e.maxzoom},s,a,i)=>{let l=Math.max(0,t-e.maxzoom),[u,c,y]=[t-l,Math.floor(n/2**l),Math.floor(o/2**l)],[m,g]=[n-c*2**l,o-y*2**l],f=e.tiles.replace("{z}",String(u)).replace("{x}",String(c)).replace("{y}",String(y)),d=await re(f,i);if(K.has(s))return;let p=2**t,b=An(t,Math.max(r,e.maxzoom)),h={points:[],ringStart:[],polygonStart:[],feature:[]},I={points:[],start:[],feature:[]},O=[],C=[],S=[],x=[],v=[],A={},M=(w,k,F,P,N=!1)=>{let _=(U,J,j)=>T(k,"paint",U,{...F,zoom:j},J),B=`${k.type}-opacity`,D=se(k.paint?.[B]),W=(U)=>{let[J,j,H,ue]=ee(_(N?"fill-outline-color":`${k.type}-color`,"#000",U))??[0,0,0,1];return[J,j,H,ue*(D?Number(_(B,1,U)):1)]},V=Array(gn).fill(0),q=b[3]-b[0]>1.5?b[1]:b[3];return V.splice(0,8,...W(b[0]),...W(q)),b.forEach((U,J)=>{if(V[8+J]=U,N){V[12+J]=1;return}if(k.type==="fill-extrusion"){V[12+J]=Math.max(0,Number(_("fill-extrusion-height",0,U))||0),V[16+J]=U,V[20+J]=Math.max(0,Number(_("fill-extrusion-base",0,U))||0);return}if(k.type!=="line")return;let j=Number(_("line-width",1,U)),H=Number(_("line-gap-width",0,U));V[12+J]=Math.max(0,H>0?H+2*j:j)}),S.push(...V),x.push(P),v.push(w),x.length-1},L=(w,k,F)=>[(n+w/F)/p,(o+k/F)/p],E=(w,k,F,P)=>{w.forEach((N)=>{let _=k&&N.length>=2?[...N,N[0]??0,N[1]??0]:N;xn(_,P).forEach((B)=>{I.start.push(I.points.length/2),I.feature.push(F);for(let D=0;D+1<B.length;D+=2)I.points.push(...L(B[D]??0,B[D+1]??0,P))})})};if(e.layers.forEach((w,k)=>{O.push(h.polygonStart.length),C.push(I.start.length);let F=_e(w),P=w.type==="fill"&&w.paint?.["fill-outline-color"]!==void 0&&w.paint?.["fill-antialias"]!==!1;if(!F)return;if(w.type==="background"){let _=M(k,w,{zoom:t,properties:{},type:"Unknown"},A);if(a)return;h.polygonStart.push(h.ringStart.length),h.feature.push(_),h.ringStart.push(h.points.length/2),h.points.push(n/p,o/p,(n+1)/p,o/p,(n+1)/p,(o+1)/p,n/p,(o+1)/p);return}let N=d?.get(w["source-layer"]??"");N?.features.forEach((_)=>{if(F==="line"?_.type===1:_.type!==3)return;let B=te(_,t);if(!ne(w.filter,B))return;let D=l>0?Sn(_.geometry,N.extent,l,m,g):_.geometry;if(!D)return;let W=M(k,w,B,_.properties),V=P?M(k,w,B,_.properties,!0):-1;if(a)return;if(F==="line"){E(D,_.type===3,W,N.extent);return}if(V>=0)E(D,!0,V,N.extent);let q=!1;D.forEach((U)=>{let J=0;for(let H=0;H+1<U.length;H+=2){let ue=(H+2)%U.length;J+=(U[H]??0)*(U[ue+1]??0)-(U[ue]??0)*(U[H+1]??0)}if(J===0)return;if(J<0&&!q)return;let j=wn(U,N.extent);if(J>0)q=j.length>=6;if(j.length<6)return;if(J>0)h.polygonStart.push(h.ringStart.length),h.feature.push(W);h.ringStart.push(h.points.length/2);for(let H=0;H+1<j.length;H+=2)h.points.push(...L(j[H]??0,j[H+1]??0,N.extent))})})}),O.push(h.polygonStart.length),C.push(I.start.length),h.ringStart.push(h.points.length/2),h.polygonStart.push(h.ringStart.length-1),I.start.push(I.points.length/2),a)return Float32Array.from(S);return{fills:{points:Float64Array.from(h.points),ringStart:Uint32Array.from(h.ringStart),polygonStart:Uint32Array.from(h.polygonStart),feature:Uint32Array.from(h.feature),fillStart:Uint32Array.from(O)},lines:{points:Float64Array.from(I.points),start:Uint32Array.from(I.start),feature:Uint32Array.from(I.feature),lineStart:Uint32Array.from(C)},styles:Float32Array.from(S),tile:Float64Array.of(n/p,o/p,(n+1)/p,(o+1)/p),properties:x,sublayer:Uint16Array.from(v)}},le={},vt=()=>{if(!le.url)return Promise.resolve(!1);let e=le.ready??ft({module_or_path:le.url}).then(()=>!0,(t)=>(console.warn("isard: the tessellation module failed to load, the main thread does its work",t),!1));return le.ready=e,e},_t=(e,t,n)=>{let{fills:o,lines:r}=e;try{let s=lt(o.points,o.ringStart,o.polygonStart,o.feature,o.fillStart,r.points,r.start,r.feature,r.lineStart,t,n,e.tile??new Float64Array),a={vertices:s.vertices(),indices:s.indices(),fillRanges:s.fillRanges(),prism:s.prism(),pieces:s.pieces(),lineTable:s.lineTable(),lineRanges:s.lineRanges(),blocks:s.blocks(),blockIndices:s.blockIndices(),blockRanges:s.blockRanges(),bounds:s.bounds()};return s.free(),a}catch(s){console.warn("isard: the tessellation module failed, the main thread does its work",s),le.ready=Promise.resolve(!1);return}};var Mt=(e,t,n)=>{let o=Boolean(T(e,"layout",`${t}-allow-overlap`,n,!1)),r=Boolean(T(e,"layout",`${t}-ignore-placement`,n,!1));if(o&&r)return!0;if(o)return"allow";return r?"ignore":!1},kt=(e,t)=>Array.isArray(e)?[Number(e[0]??t[0]),Number(e[1]??t[1])]:t,vn=(e)=>{let t=(Array.isArray(e)?e:[e]).map((a)=>Number(a)||0),[n=0,o=n,r=n,s=o]=t;return[n,o,r,s]},_n=(e,t)=>{if(t==="uppercase")return e.toUpperCase();if(t==="lowercase")return e.toLowerCase();return e},Mn=(e,t)=>{let n=0;for(let a=2;a+1<e.length;a+=2)n+=Math.hypot((e[a]??0)-(e[a-2]??0),(e[a+1]??0)-(e[a-1]??0));let o=[];if(!(n>0)||!(t>0))return o;let r=Math.min(t/2,n/2),s=0;for(let a=2;a+1<e.length;a+=2){let[i,l,u,c]=[e[a-2]??0,e[a-1]??0,e[a]??0,e[a+1]??0],y=Math.hypot(u-i,c-l);while(y>0&&r<=s+y){let m=(r-s)/y;o.push([i+(u-i)*m,l+(c-l)*m,i,l,u,c]),r+=t}s+=y}return o},kn=(e,t,n,o,r)=>{let s=T(e,"layout","icon-rotation-alignment",n,"auto"),a=String(T(e,"layout","icon-text-fit",n,"none")),i=T(e,"layout","icon-text-fit-padding",n,[0,0,0,0]);return{image:t,size:se(e.layout?.["icon-size"])?Number(T(e,"layout","icon-size",n,1)):r(e),anchor:String(T(e,"layout","icon-anchor",n,"center")),offset:kt(T(e,"layout","icon-offset",n,[0,0]),[0,0]),rotate:Number(T(e,"layout","icon-rotate",n,0))||0,alignment:s==="map"||s==="auto"&&o==="line"?"map":"viewport",overlap:Mt(e,"icon",n),optional:Boolean(T(e,"layout","icon-optional",n,!1)),fit:a==="width"||a==="height"||a==="both"?a:"none",padding:vn(i),color:String(T(e,"paint","icon-color",n,"#000")),opacity:Number(T(e,"paint","icon-opacity",n,1))}},Rt=async(e,t,n,o,r,s,a=t)=>{let i=e.tiles.replace("{z}",String(t)).replace("{x}",String(n)).replace("{y}",String(o)),l=await re(i,s);if(!l||K.has(r))return[];let u=[],c=new Map,y=(f)=>{let d=c.get(f);if(d!==void 0)return d;let p=f.layout?.["text-size"]??16,b=me(p)?Fe(p):p;return c.set(f,b),b},m=new Map,g=(f)=>{let d=m.get(f);if(d!==void 0)return d;let p=f.layout?.["icon-size"]??1,b=me(p)?Fe(p):p;return m.set(f,b),b};return e.layers.forEach((f,d)=>{let p=f.layout??{};if(f.type!=="symbol"||!Ee(f,a))return;if(p["text-field"]===void 0&&p["icon-image"]===void 0)return;let b=l.get(f["source-layer"]??"");if(!b)return;let h={zoom:a,properties:{},type:"Unknown"},I=T(f,"layout","symbol-placement",h,"point")==="line"?"line":"point",O=I==="line"&&T(f,"layout","text-rotation-alignment",h,"auto")!=="viewport";for(let C of b.features){let S=te(C,a);if(!ne(f.filter,S))continue;let x=Le(p["text-field"],S).trim(),v=Le(p["icon-image"],S).trim();if(!x&&!v)continue;let A=_n(x,T(f,"layout","text-transform",S,"none")),M=T(f,"layout","text-font",S,["Noto Sans Regular"]),L=it(Array.isArray(M)&&typeof M[0]==="string"?M[0]:"Noto Sans Regular"),E={layer:d,text:A,font:L,size:se(f.layout?.["text-size"])?Number(T(f,"layout","text-size",S,16)):y(f),color:String(T(f,"paint","text-color",S,"#000")),haloColor:String(T(f,"paint","text-halo-color",S,"rgba(0,0,0,0)")),haloWidth:Number(T(f,"paint","text-halo-width",S,0)),anchor:String(T(f,"layout","text-anchor",S,"center")),offset:kt(T(f,"layout","text-offset",S,[0,0]),[0,0]),maxWidth:Number(T(f,"layout","text-max-width",S,10)),lineHeight:Number(T(f,"layout","text-line-height",S,1.2)),overlap:Mt(f,"text",S),...O?{textAlong:O}:{},...T(f,"layout","text-optional",S,!1)?{textOptional:!0}:{},...v?{icon:kn(f,v,S,I,g)}:{}};if(C.type===1)for(let w of C.geometry)for(let k=0;k+1<w.length;k+=2){let[F,P]=[w[k]??0,w[k+1]??0];if(F<0||P<0||F>=b.extent||P>=b.extent)continue;let[N,_]=X(t,n,o,b.extent,F,P);u.push({...E,lon:N,lat:_})}else if(!A&&I==="line"){let w=Number(T(f,"layout","symbol-spacing",S,250))*b.extent/(512*2**(a-t));for(let k of C.geometry)for(let[F=0,P=0,N=0,_=0,B=0,D=0]of Mn(k,Math.max(w,1))){if(F<0||P<0||F>=b.extent||P>=b.extent)continue;let[W,V]=X(t,n,o,b.extent,F,P),[q,U]=X(t,n,o,b.extent,B,D),[J,j]=X(t,n,o,b.extent,N,_);u.push({...E,lon:W,lat:V,along:[q-J,U-j]})}}else{let w,k=0;for(let P of C.geometry){let N=0;for(let _=2;_+1<P.length;_+=2)N+=Math.hypot((P[_]??0)-(P[_-2]??0),(P[_+1]??0)-(P[_-1]??0));if(N>k)k=N,w=P}if(!w||k<b.extent/32)continue;let F=k/2;for(let P=2;P+1<w.length;P+=2){let[N,_,B,D]=[w[P-2]??0,w[P-1]??0,w[P]??0,w[P+1]??0],W=Math.hypot(B-N,D-_);if(W>=F&&W>0){let[V,q]=[N+(B-N)*F/W,_+(D-_)*F/W];if(V<0||q<0||V>=b.extent||q>=b.extent)break;let[U,J]=X(t,n,o,b.extent,V,q),[j,H]=X(t,n,o,b.extent,B,D),[ue,Pt]=X(t,n,o,b.extent,N,_);u.push({...E,lon:U,lat:J,...I==="line"?{along:[j-ue,H-Pt]}:{}});break}F-=W}}}}),u};var Rn=new Set(["butt","round","square"]),In=new Set(["bevel","miter","round"]),Tn=(e)=>Rn.has(e),En=(e)=>In.has(e),Pn=(e)=>Tn(e)?e:"butt",Nn=(e)=>En(e)?e:"miter",Cn=(e,t)=>{if(e.patterns.has(t))return e.patterns.get(t);let o=(()=>{let r=He(e,t);if(!r||!(r.icon.width>0)||!(r.icon.height>0))return;let{icon:s}=r,a=new OffscreenCanvas(s.width,s.height);return a.getContext("2d")?.drawImage(r.image,s.x,s.y,s.width,s.height,0,0,s.width,s.height),a})();return e.patterns.set(t,o),o},$e=new Map,Ln=(e)=>{let t=$e.get(e)?.pop()??new OffscreenCanvas(e,e),n=t.getContext("2d",{willReadFrequently:!0});if(!n)throw Error("no 2D context");return n.setTransform(1,0,0,1,0,0),n.globalAlpha=1,n.setLineDash([]),n.clearRect(0,0,e,e),{canvas:t,g:n}},Fn=(e)=>{let t=$e.get(e.width)??[];if($e.set(e.width,t),t.length<4)t.push(e)},Un=(e,t,n)=>{if(n)return Promise.resolve(e.transferToImageBitmap());return createImageBitmap(t.getImageData(0,0,e.width,e.height),{premultiplyAlpha:"none"})},It=async(e,t,n,o,r,s,a)=>{let i=xt(e,t,n,o),l=await re(i.url,a);if(K.has(s))return;let{canvas:u,g:c}=Ln(r);try{return await On(e,i,l,u,c,t,n,o,r,s,a)}finally{Fn(u)}},On=async(e,t,n,o,r,s,a,i,l,u,c)=>{let y=Math.max(0,s-1),m=l/256,g=!1,f=!1;for(let d of e.layers){if(!Ee(d,y))continue;let p={zoom:y,properties:{},type:"Unknown"};if(d.type==="background"){let v=T(d,"paint","background-color",p,"#000"),A=Number(T(d,"paint","background-opacity",p,1));if(r.fillStyle=ie(v,A),r.fillRect(0,0,l,l),(ee(v)??[0,0,0,1])[3]*A>=1)f=!0;g=!0;continue}if(d.type==="raster"){let v=d.source===void 0?void 0:e.rasters[d.source];if(!v)continue;let A=Math.max(0,Math.min(s-(v.tileSize>=512?1:0),v.maxzoom)),M=2**(s-A),L=v.tiles.replace("{z}",String(A)).replace("{x}",String(Math.floor(a/M))).replace("{y}",String(Math.floor(i/M))),E=await wt(L,c).catch(()=>{return});if(K.has(u))return;if(!E)continue;let[w,k]=[E.width/M,E.height/M];r.globalAlpha=Number(T(d,"paint","raster-opacity",p,1)),r.drawImage(E,a%M*w,i%M*k,w,k,0,0,l,l),r.globalAlpha=1,g=!0;continue}let b=n?.get(d["source-layer"]??"");if(!b)continue;let h=l/(b.extent*t.part),[I,O]=[t.ox*b.extent,t.oy*b.extent],C=(v,A)=>{r.beginPath();for(let M of v.geometry){for(let L=0;L+1<M.length;L+=2){let[E,w]=[((M[L]??0)-I)*h,((M[L+1]??0)-O)*h];if(L===0)r.moveTo(E,w);else r.lineTo(E,w)}if(A)r.closePath()}},S=new Map,x=(v,A,M,L)=>{let E=S.get(A),w=E??se(d[v]?.[A]);if(E===void 0)S.set(A,w);return T(d,v,A,w?M:p,L)};for(let v of b.features){let A=te(v,y);if(!ne(d.filter,A))continue;if(d.type==="fill-extrusion"&&v.type===3)C(v,!0),r.fillStyle=ie(x("paint","fill-extrusion-color",A,"#000"),Number(x("paint","fill-extrusion-opacity",A,1))),r.fill("evenodd"),g=!0;else if(d.type==="fill"&&v.type===3){let M=Number(x("paint","fill-opacity",A,1)),L=x("paint","fill-pattern",A,void 0);C(v,!0);let E=typeof L==="string"?He(e,L)?.icon:void 0,w=E&&typeof L==="string"&&Cn(e,L);if(E&&w){let k=r.createPattern(w,"repeat");if(k)k.setTransform(new DOMMatrix().scale(m/(E.pixelRatio??1))),r.globalAlpha=M,r.fillStyle=k,r.fill("evenodd"),r.globalAlpha=1}else{r.fillStyle=ie(x("paint","fill-color",A,"#000"),M),r.fill("evenodd");let k=x("paint","fill-outline-color",A,void 0);if(k!==void 0)r.strokeStyle=ie(k,M),r.lineWidth=m,r.setLineDash([]),r.stroke()}g=!0}else if(d.type==="line"&&v.type!==1){let M=Number(x("paint","line-width",A,1));if(M<=0)continue;let L=Number(x("paint","line-gap-width",A,0));r.strokeStyle=ie(x("paint","line-color",A,"#000"),Number(x("paint","line-opacity",A,1))),r.lineWidth=(L>0?L+2*M:M)*m,r.lineCap=Pn(x("layout","line-cap",A,"butt")),r.lineJoin=Nn(x("layout","line-join",A,"miter"));let E=x("paint","line-dasharray",A,void 0);r.setLineDash(Array.isArray(E)?E.map((w)=>Number(w)*M*m):[]),C(v,v.type===3),r.stroke(),g=!0}else if(d.type==="circle"&&v.type===1){let M=Number(x("paint","circle-radius",A,5))*m;r.fillStyle=ie(x("paint","circle-color",A,"#000"),Number(x("paint","circle-opacity",A,1)));let L=Number(x("paint","circle-stroke-width",A,0))*m;r.strokeStyle=ie(x("paint","circle-stroke-color",A,"#000"),Number(x("paint","circle-stroke-opacity",A,1))),r.lineWidth=L;for(let E of v.geometry)for(let w=0;w+1<E.length;w+=2)if(r.beginPath(),r.arc(((E[w]??0)-I)*h,((E[w+1]??0)-O)*h,M,0,2*Math.PI),r.fill(),L>0)r.stroke();g=!0}}}if(!g&&!n)return null;return Un(o,r,f)};var je=5;var xe=(e,t,n,o)=>{let r=Math.imul(e^2654435769,2246822507)^Math.imul(t^3266489909,668265263);return r=Math.imul(r^r>>>15^Math.imul(n,374761393),739982445),r=Math.imul(r^r>>>13^Math.imul(o,695872825),695872825),((r^r>>>16)>>>0)/4294967296},Dn=(e,t,n)=>e.reduce((o,r)=>{let s=r.length/2,a=0;for(let i=0,l=s-1;i<s;l=i,i+=1){let[u,c,y,m]=[r[i*2]??0,r[i*2+1]??0,r[l*2]??0,r[l*2+1]??0];if(c>n!==m>n&&t<(y-u)*(n-c)/(m-c)+u)a+=1}return a%2===1?!o:o},!1),Bn=(e,t,n,o,r=Number.POSITIVE_INFINITY)=>{let s=e[0]??[],a=[Number.POSITIVE_INFINITY,Number.POSITIVE_INFINITY,Number.NEGATIVE_INFINITY,Number.NEGATIVE_INFINITY];for(let C=0;C+1<s.length;C+=2){let[S,x]=[s[C]??0,s[C+1]??0];a[0]=Math.min(a[0]??S,S),a[1]=Math.min(a[1]??x,x),a[2]=Math.max(a[2]??S,S),a[3]=Math.max(a[3]??x,x)}let[i,l]=[Math.max(0,a[0]??0),Math.max(0,a[1]??0)],[u,c]=[Math.min(t,a[2]??0),Math.min(t,a[3]??0)];if(!(n>0)||i>=u||l>=c)return[];let y=(u-i)/n*((c-l)/n),m=y>r?n*Math.sqrt(y/r):n,[g,f,d,p]=[Math.floor(i/m),Math.ceil(u/m),Math.floor(l/m),Math.ceil(c/m)],[b,h,I]=o,O=Math.imul(b+1,16777619)^Math.imul(h,1540483477)^Math.imul(I,461845907);return Array.from({length:Math.max(0,p-d)},(C,S)=>d+S).flatMap((C)=>Array.from({length:Math.max(0,f-g)},(S,x)=>g+x).flatMap((S)=>{let x=(S+xe(O,S,C,1))*m,v=(C+xe(O,S,C,2))*m;if(x<0||v<0||x>=t||v>=t||!Dn(e,x,v))return[];return[[x,v,xe(O,S,C,3)]]}))},Tt=async(e,t,n,o,r,s,a,i)=>{let l=e.tiles.replace("{z}",String(t)).replace("{x}",String(n)).replace("{y}",String(o)),u=await re(l,i);if(!u||K.has(r))return;let c=40075016.686*Math.cos(Ie((o+0.5)/2**t)*Math.PI/180)/2**t,y=[];e.layers.forEach((d,p)=>{let b=s[p]??0,h=u.get(d["source-layer"]??"");if(!h||!(b>0))return;let I=b/c*h.extent;h.features.forEach((O)=>{if(O.type!==3||!ne(d.filter,te(O,t)))return;O.geometry.reduce((S,x)=>{let v=0;for(let A=0;A+1<x.length;A+=2){let M=(A+2)%x.length;v+=(x[A]??0)*(x[M+1]??0)-(x[M]??0)*(x[A+1]??0)}if(v>0)S.push([x]);else if(v<0)S.at(-1)?.push(x);return S},[]).forEach((S)=>{Bn(S,h.extent,I,[t,n,o],a*4).forEach(([x,v,A])=>{y.push([x,v,A,h.extent])})})})});let m=y.length>a?a/y.length:1,g=y.filter(([,,d])=>m>=1||xe(Math.floor(d*2147483648),t,n,o)<m),f=new Float64Array(g.length*je);return g.forEach(([d,p,b,h],I)=>{let[O,C]=X(t,n,o,h,d,p),S=xe(Math.floor(b*2147483648),7,11,13);f.set([O,C,0.75+0.5*b,b*7919%360,S],I*je)}),f};var ze=new Map,Vn={},Et=Ke(),z=(e,t=[])=>self.postMessage(e,t);self.onmessage=async({data:e})=>{if(e.type==="headers"){Ye(e.rules);return}if(e.type==="tess"){le.url=e.url;return}if(e.type==="init"){if(e.workers!==void 0)ge.capacity=gt(e.workers);we.set(e.key,{tiles:e.tiles,maxzoom:e.maxzoom,layers:e.layers,rasters:e.rasters??{},sprites:e.sprites??[],patterns:new Map});return}if(e.type==="drop"){we.get(e.key)?.sprites.forEach((n)=>{n.image.close()}),we.delete(e.key);return}if(e.type==="abort"){if(Te.has(e.id))K.add(e.id);ze.get(e.id)?.abort();return}if(e.type==="heights"||e.type==="reproject"){await Jn(e);return}Te.add(e.id);let t=we.get(e.key);try{if(!t)throw Error(`no renderer ${e.key}`);if(e.type==="render"){let n=await It(t,e.z,e.x,e.y,e.size,e.id,e.priority);if(n)z({id:e.id,image:n},[n]);else z({id:e.id,missing:!0})}else if(e.type==="trees"){let n=await Tt(t,e.z,e.x,e.y,e.id,e.spacing,e.maxTrees,e.priority);if(!n)z({id:e.id,missing:!0});else z({id:e.id,trees:n},[n.buffer])}else if(e.type==="polygons"){let n=await At(t,e.z,e.x,e.y,e.id,e.priority);if(!n)z({id:e.id,missing:!0});else{let{points:o,ringStart:r,polygonStart:s,feature:a}=n.arrays;z({id:e.id,polygons:n},[o.buffer,r.buffer,s.buffer,a.buffer])}}else if(e.type==="vectors"){let n=await St(t,e,e.id,e.styles===!0,e.priority);if(!n)z({id:e.id,missing:!0});else if(n instanceof Float32Array)z({id:e.id,styles:n},[n.buffer]);else{let o=Uint8Array.from(t.layers,(i)=>_e(i)==="extrusion"?1:0),r=await vt()?_t(n,o,e.prism===!0):void 0,{fills:s,lines:a}=n;z({id:e.id,vectors:r?{...n,mesh:r}:n},[...[s.points,s.ringStart,s.polygonStart,s.feature,s.fillStart].map((i)=>i.buffer),...[a.points,a.start,a.feature,a.lineStart].map((i)=>i.buffer),n.styles.buffer,n.sublayer.buffer,...(r?[r.vertices,r.indices,r.fillRanges,r.pieces,r.lineTable,r.lineRanges,r.blocks,r.blockIndices,r.blockRanges,r.bounds]:[]).map((i)=>i.buffer)])}}else z({id:e.id,labels:await Rt(t,e.z,e.x,e.y,e.id,e.priority,e.zoom)})}catch(n){z({id:e.id,error:String(n)})}finally{Te.delete(e.id),K.delete(e.id)}};var Jn=async(e)=>{let t=new AbortController;ze.set(e.id,t);try{if(e.type==="heights"){let n=await Ze(e.url,e.encoding,e.floor,t.signal,Vn);if(n)z({id:e.id,heights:n},[n.buffer]);else z({id:e.id,missing:!0})}else{Et.cache.capacity=e.cached;let n=await Et.draw(e.job,t.signal);if(n)z({id:e.id,image:n},[n]);else z({id:e.id,missing:!0})}}catch(n){z({id:e.id,error:String(n)})}finally{ze.delete(e.id)}};
2
2
 
3
- //# debugId=3A4B5A4DCF23BBD964756E2164756E21
3
+ //# debugId=DC6EF9CE242FB76664756E2164756E21
4
4
  //# sourceMappingURL=basemap.worker.js.map