uomtiles 0.1.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 (507) hide show
  1. package/.output/nitro.json +15 -0
  2. package/.output/public/_nuxt/1d1PDhA4.js +1 -0
  3. package/.output/public/_nuxt/3B2XYGg4.js +1 -0
  4. package/.output/public/_nuxt/981KwFWf.js +1 -0
  5. package/.output/public/_nuxt/B30dSvM4.js +1 -0
  6. package/.output/public/_nuxt/BN1Gp4Dm.js +1 -0
  7. package/.output/public/_nuxt/BQlj8Xoe.js +6 -0
  8. package/.output/public/_nuxt/BRkljK8J.js +1 -0
  9. package/.output/public/_nuxt/BSdHYVlE2.js +1 -0
  10. package/.output/public/_nuxt/B_MqTg2k2.js +1 -0
  11. package/.output/public/_nuxt/BiWblTbb2.js +64 -0
  12. package/.output/public/_nuxt/BrPwntMr.js +1 -0
  13. package/.output/public/_nuxt/BskybydR.js +1 -0
  14. package/.output/public/_nuxt/ByRlKR9F.js +1 -0
  15. package/.output/public/_nuxt/C0Zdl2EE2.js +1 -0
  16. package/.output/public/_nuxt/C4qlzA4o.js +1 -0
  17. package/.output/public/_nuxt/C7HxHbxA.js +1 -0
  18. package/.output/public/_nuxt/C97TfNgP.js +3 -0
  19. package/.output/public/_nuxt/CNs_Ozdc.js +1 -0
  20. package/.output/public/_nuxt/CPuhwLY1.js +1 -0
  21. package/.output/public/_nuxt/CVE291Pi.js +1 -0
  22. package/.output/public/_nuxt/C_0VY3Cv2.js +4 -0
  23. package/.output/public/_nuxt/Ce26t8_Y.js +1 -0
  24. package/.output/public/_nuxt/CfW544W5.js +1 -0
  25. package/.output/public/_nuxt/CgMd2Y5s.js +2 -0
  26. package/.output/public/_nuxt/CgdzV712.js +1 -0
  27. package/.output/public/_nuxt/D1wVNWS0.js +1 -0
  28. package/.output/public/_nuxt/DC3bhq63.js +1 -0
  29. package/.output/public/_nuxt/DK3Fl9T5.js +1 -0
  30. package/.output/public/_nuxt/DL1MZZLI.js +1 -0
  31. package/.output/public/_nuxt/DXm-42Fi.js +1 -0
  32. package/.output/public/_nuxt/Djg3Kzfv.js +1 -0
  33. package/.output/public/_nuxt/DkcySee1.js +1 -0
  34. package/.output/public/_nuxt/DmN-PKW1.js +1 -0
  35. package/.output/public/_nuxt/DtFVCXI9.js +1 -0
  36. package/.output/public/_nuxt/Dz7VMlHR.js +1 -0
  37. package/.output/public/_nuxt/NL65vbjG2.js +1 -0
  38. package/.output/public/_nuxt/Oxy7pKSk.js +3 -0
  39. package/.output/public/_nuxt/Pik8or8N2.js +1 -0
  40. package/.output/public/_nuxt/XZ59tThl.js +1 -0
  41. package/.output/public/_nuxt/ZpWjFsgV.js +1 -0
  42. package/.output/public/_nuxt/builds/latest.json +1 -0
  43. package/.output/public/_nuxt/builds/meta/9f85104e-738d-4a74-8daa-40b136ce17d5.json +1 -0
  44. package/.output/public/_nuxt/dXz6dFgW2.js +1 -0
  45. package/.output/public/_nuxt/entry.P6tFNE31.css +1 -0
  46. package/.output/public/_nuxt/error-404.Biv0P6cJ.css +1 -0
  47. package/.output/public/_nuxt/error-500.8ok468rV.css +1 -0
  48. package/.output/public/_nuxt/j0MRD-c3.js +1 -0
  49. package/.output/public/_nuxt/local-pixel-diff.worker-C6RdZoCq.js +2 -0
  50. package/.output/public/_nuxt/maplibre-gl-worker.nfnkSQvL.mjs +6 -0
  51. package/.output/public/_nuxt/nearest-area.worker-iSLH0Y_s.js +2 -0
  52. package/.output/public/_nuxt/q7DkoVkj.js +828 -0
  53. package/.output/public/_nuxt/raster-tile.worker-BFlOgJig.js +2 -0
  54. package/.output/public/_nuxt/services._3nQizF8.css +1 -0
  55. package/.output/public/_nuxt/sql-wasm.DfANybxk.wasm +0 -0
  56. package/.output/public/_nuxt/tile-diff.worker-CvWWI_eu.js +1 -0
  57. package/.output/public/_nuxt/zZ1EGR7Y.js +1 -0
  58. package/.output/public/apple-touch-icon.png +0 -0
  59. package/.output/public/favicon.ico +0 -0
  60. package/.output/public/favicon.svg +8 -0
  61. package/.output/public/icon-192.png +0 -0
  62. package/.output/public/icon-512.png +0 -0
  63. package/.output/public/site.webmanifest +11 -0
  64. package/.output/server/chunks/_/config.mjs +208 -0
  65. package/.output/server/chunks/_/config.mjs.map +1 -0
  66. package/.output/server/chunks/_/data-directory.mjs +24 -0
  67. package/.output/server/chunks/_/data-directory.mjs.map +1 -0
  68. package/.output/server/chunks/_/error-500.mjs +20 -0
  69. package/.output/server/chunks/_/error-500.mjs.map +1 -0
  70. package/.output/server/chunks/_/file-workspace.mjs +910 -0
  71. package/.output/server/chunks/_/file-workspace.mjs.map +1 -0
  72. package/.output/server/chunks/_/icons.mjs +6269 -0
  73. package/.output/server/chunks/_/icons.mjs.map +1 -0
  74. package/.output/server/chunks/_/map-service.mjs +233 -0
  75. package/.output/server/chunks/_/map-service.mjs.map +1 -0
  76. package/.output/server/chunks/_/missing-tile.mjs +104 -0
  77. package/.output/server/chunks/_/missing-tile.mjs.map +1 -0
  78. package/.output/server/chunks/_/pixel-diff.mjs +78 -0
  79. package/.output/server/chunks/_/pixel-diff.mjs.map +1 -0
  80. package/.output/server/chunks/_/uom-auth.mjs +334 -0
  81. package/.output/server/chunks/_/uom-auth.mjs.map +1 -0
  82. package/.output/server/chunks/_/uom-map.mjs +265 -0
  83. package/.output/server/chunks/_/uom-map.mjs.map +1 -0
  84. package/.output/server/chunks/build/Alert-0ngTJXxP.mjs +5076 -0
  85. package/.output/server/chunks/build/Alert-0ngTJXxP.mjs.map +1 -0
  86. package/.output/server/chunks/build/DashboardSidebarToggle-pncTaIJq.mjs +569 -0
  87. package/.output/server/chunks/build/DashboardSidebarToggle-pncTaIJq.mjs.map +1 -0
  88. package/.output/server/chunks/build/Empty-CkW3mADt.mjs +359 -0
  89. package/.output/server/chunks/build/Empty-CkW3mADt.mjs.map +1 -0
  90. package/.output/server/chunks/build/FocusScope-Cf0lg0zt.mjs +207 -0
  91. package/.output/server/chunks/build/FocusScope-Cf0lg0zt.mjs.map +1 -0
  92. package/.output/server/chunks/build/FormField-CEUZHcv7.mjs +278 -0
  93. package/.output/server/chunks/build/FormField-CEUZHcv7.mjs.map +1 -0
  94. package/.output/server/chunks/build/Input-BeNavYXb.mjs +592 -0
  95. package/.output/server/chunks/build/Input-BeNavYXb.mjs.map +1 -0
  96. package/.output/server/chunks/build/MapBaseLayerTabs-4445J6yh.mjs +2003 -0
  97. package/.output/server/chunks/build/MapBaseLayerTabs-4445J6yh.mjs.map +1 -0
  98. package/.output/server/chunks/build/Modal-DNZtVxca.mjs +1326 -0
  99. package/.output/server/chunks/build/Modal-DNZtVxca.mjs.map +1 -0
  100. package/.output/server/chunks/build/OnlineMap-CKwiuqUY.mjs +146 -0
  101. package/.output/server/chunks/build/OnlineMap-CKwiuqUY.mjs.map +1 -0
  102. package/.output/server/chunks/build/Pagination-CDHx4HTZ.mjs +1025 -0
  103. package/.output/server/chunks/build/Pagination-CDHx4HTZ.mjs.map +1 -0
  104. package/.output/server/chunks/build/PopperArrow-Bqfdf2Et.mjs +2066 -0
  105. package/.output/server/chunks/build/PopperArrow-Bqfdf2Et.mjs.map +1 -0
  106. package/.output/server/chunks/build/ScrollArea-BQK3em8b.mjs +379 -0
  107. package/.output/server/chunks/build/ScrollArea-BQK3em8b.mjs.map +1 -0
  108. package/.output/server/chunks/build/Slider-D-n8Y0CX.mjs +1087 -0
  109. package/.output/server/chunks/build/Slider-D-n8Y0CX.mjs.map +1 -0
  110. package/.output/server/chunks/build/Tooltip-CkpSktvJ.mjs +1345 -0
  111. package/.output/server/chunks/build/Tooltip-CkpSktvJ.mjs.map +1 -0
  112. package/.output/server/chunks/build/_virtual_public-CeOptKUP.mjs +7 -0
  113. package/.output/server/chunks/build/_virtual_public-CeOptKUP.mjs.map +1 -0
  114. package/.output/server/chunks/build/advanced-D1onodoF.mjs +1430 -0
  115. package/.output/server/chunks/build/advanced-D1onodoF.mjs.map +1 -0
  116. package/.output/server/chunks/build/compare-DmSAW8oA.mjs +1093 -0
  117. package/.output/server/chunks/build/compare-DmSAW8oA.mjs.map +1 -0
  118. package/.output/server/chunks/build/dashboard-BJxrZ19n.mjs +3217 -0
  119. package/.output/server/chunks/build/dashboard-BJxrZ19n.mjs.map +1 -0
  120. package/.output/server/chunks/build/details-CBMqXYyo.mjs +3714 -0
  121. package/.output/server/chunks/build/details-CBMqXYyo.mjs.map +1 -0
  122. package/.output/server/chunks/build/error-404-D9aQjJRn.mjs +86 -0
  123. package/.output/server/chunks/build/error-404-D9aQjJRn.mjs.map +1 -0
  124. package/.output/server/chunks/build/error-404-styles.DciiguV6.mjs +9 -0
  125. package/.output/server/chunks/build/error-404-styles.DciiguV6.mjs.map +1 -0
  126. package/.output/server/chunks/build/error-500-BNyA3wrb.mjs +74 -0
  127. package/.output/server/chunks/build/error-500-BNyA3wrb.mjs.map +1 -0
  128. package/.output/server/chunks/build/error-500-styles.C562DYMR.mjs +9 -0
  129. package/.output/server/chunks/build/error-500-styles.C562DYMR.mjs.map +1 -0
  130. package/.output/server/chunks/build/esm-Dp2lJXbp.mjs +1121 -0
  131. package/.output/server/chunks/build/esm-Dp2lJXbp.mjs.map +1 -0
  132. package/.output/server/chunks/build/interval-BxUMpo78.mjs +411 -0
  133. package/.output/server/chunks/build/interval-BxUMpo78.mjs.map +1 -0
  134. package/.output/server/chunks/build/login-lbtjN0MV.mjs +642 -0
  135. package/.output/server/chunks/build/login-lbtjN0MV.mjs.map +1 -0
  136. package/.output/server/chunks/build/pages-Ba0Eixbd.mjs +220 -0
  137. package/.output/server/chunks/build/pages-Ba0Eixbd.mjs.map +1 -0
  138. package/.output/server/chunks/build/services-DuJwjAB8.mjs +3005 -0
  139. package/.output/server/chunks/build/services-DuJwjAB8.mjs.map +1 -0
  140. package/.output/server/chunks/build/services-styles.eoO16BY9.mjs +9 -0
  141. package/.output/server/chunks/build/services-styles.eoO16BY9.mjs.map +1 -0
  142. package/.output/server/chunks/build/tasks-CyN9x492.mjs +915 -0
  143. package/.output/server/chunks/build/tasks-CyN9x492.mjs.map +1 -0
  144. package/.output/server/chunks/build/tasks-D_Q5EDnn.mjs +87 -0
  145. package/.output/server/chunks/build/tasks-D_Q5EDnn.mjs.map +1 -0
  146. package/.output/server/chunks/nitro/nitro.mjs +6215 -0
  147. package/.output/server/chunks/nitro/nitro.mjs.map +1 -0
  148. package/.output/server/chunks/routes/api/auth/captcha.post.mjs +21 -0
  149. package/.output/server/chunks/routes/api/auth/captcha.post.mjs.map +1 -0
  150. package/.output/server/chunks/routes/api/auth/login.post.mjs +27 -0
  151. package/.output/server/chunks/routes/api/auth/login.post.mjs.map +1 -0
  152. package/.output/server/chunks/routes/api/auth/logout.post.mjs +22 -0
  153. package/.output/server/chunks/routes/api/auth/logout.post.mjs.map +1 -0
  154. package/.output/server/chunks/routes/api/auth/map-token.post.mjs +22 -0
  155. package/.output/server/chunks/routes/api/auth/map-token.post.mjs.map +1 -0
  156. package/.output/server/chunks/routes/api/auth/send-sms.post.mjs +31 -0
  157. package/.output/server/chunks/routes/api/auth/send-sms.post.mjs.map +1 -0
  158. package/.output/server/chunks/routes/api/auth/status.get.mjs +21 -0
  159. package/.output/server/chunks/routes/api/auth/status.get.mjs.map +1 -0
  160. package/.output/server/chunks/routes/api/map/base/_baseLayer/_zoom/_tileX/_tileY_.get.mjs +44 -0
  161. package/.output/server/chunks/routes/api/map/base/_baseLayer/_zoom/_tileX/_tileY_.get.mjs.map +1 -0
  162. package/.output/server/chunks/routes/api/map/live/status.get.mjs +32 -0
  163. package/.output/server/chunks/routes/api/map/live/status.get.mjs.map +1 -0
  164. package/.output/server/chunks/routes/api/map/online/_layerGroup/_zoom/_tileX/_tileY_.get.mjs +48 -0
  165. package/.output/server/chunks/routes/api/map/online/_layerGroup/_zoom/_tileX/_tileY_.get.mjs.map +1 -0
  166. package/.output/server/chunks/routes/api/map/online-root/_layerGroup/_rootX/_rootY_.get.mjs +46 -0
  167. package/.output/server/chunks/routes/api/map/online-root/_layerGroup/_rootX/_rootY_.get.mjs.map +1 -0
  168. package/.output/server/chunks/routes/api/map-service/config.post.mjs +38 -0
  169. package/.output/server/chunks/routes/api/map-service/config.post.mjs.map +1 -0
  170. package/.output/server/chunks/routes/api/map-service/file.post.mjs +41 -0
  171. package/.output/server/chunks/routes/api/map-service/file.post.mjs.map +1 -0
  172. package/.output/server/chunks/routes/api/map-service/source.post.mjs +35 -0
  173. package/.output/server/chunks/routes/api/map-service/source.post.mjs.map +1 -0
  174. package/.output/server/chunks/routes/api/map-service/status.get.mjs +32 -0
  175. package/.output/server/chunks/routes/api/map-service/status.get.mjs.map +1 -0
  176. package/.output/server/chunks/routes/api/workspace/_filename/analysis.get.mjs +47 -0
  177. package/.output/server/chunks/routes/api/workspace/_filename/analysis.get.mjs.map +1 -0
  178. package/.output/server/chunks/routes/api/workspace/_filename/download.get.mjs +38 -0
  179. package/.output/server/chunks/routes/api/workspace/_filename/download.get.mjs.map +1 -0
  180. package/.output/server/chunks/routes/api/workspace/_filename/export/_format_.get.mjs +42 -0
  181. package/.output/server/chunks/routes/api/workspace/_filename/export/_format_.get.mjs.map +1 -0
  182. package/.output/server/chunks/routes/api/workspace/_filename/tile.get.mjs +48 -0
  183. package/.output/server/chunks/routes/api/workspace/_filename/tile.get.mjs.map +1 -0
  184. package/.output/server/chunks/routes/api/workspace/_filename/tiles.get.mjs +45 -0
  185. package/.output/server/chunks/routes/api/workspace/_filename/tiles.get.mjs.map +1 -0
  186. package/.output/server/chunks/routes/api/workspace/_filename_.delete.mjs +32 -0
  187. package/.output/server/chunks/routes/api/workspace/_filename_.delete.mjs.map +1 -0
  188. package/.output/server/chunks/routes/api/workspace/compare/batch.get.mjs +38 -0
  189. package/.output/server/chunks/routes/api/workspace/compare/batch.get.mjs.map +1 -0
  190. package/.output/server/chunks/routes/api/workspace/compare.post.mjs +33 -0
  191. package/.output/server/chunks/routes/api/workspace/compare.post.mjs.map +1 -0
  192. package/.output/server/chunks/routes/api/workspace/fetch.post.mjs +33 -0
  193. package/.output/server/chunks/routes/api/workspace/fetch.post.mjs.map +1 -0
  194. package/.output/server/chunks/routes/api/workspace/files.get.mjs +27 -0
  195. package/.output/server/chunks/routes/api/workspace/files.get.mjs.map +1 -0
  196. package/.output/server/chunks/routes/api/workspace/files.post.mjs +38 -0
  197. package/.output/server/chunks/routes/api/workspace/files.post.mjs.map +1 -0
  198. package/.output/server/chunks/routes/api/workspace/stop.post.mjs +32 -0
  199. package/.output/server/chunks/routes/api/workspace/stop.post.mjs.map +1 -0
  200. package/.output/server/chunks/routes/api/workspace/tasks.post.mjs +36 -0
  201. package/.output/server/chunks/routes/api/workspace/tasks.post.mjs.map +1 -0
  202. package/.output/server/chunks/routes/renderer.mjs +422 -0
  203. package/.output/server/chunks/routes/renderer.mjs.map +1 -0
  204. package/.output/server/chunks/routes/services/wms.get.mjs +54 -0
  205. package/.output/server/chunks/routes/services/wms.get.mjs.map +1 -0
  206. package/.output/server/chunks/routes/services/wmts.get.mjs +54 -0
  207. package/.output/server/chunks/routes/services/wmts.get.mjs.map +1 -0
  208. package/.output/server/chunks/virtual/_virtual_spa-template.mjs +4 -0
  209. package/.output/server/chunks/virtual/_virtual_spa-template.mjs.map +1 -0
  210. package/.output/server/chunks/virtual/entry.mjs +18545 -0
  211. package/.output/server/chunks/virtual/entry.mjs.map +1 -0
  212. package/.output/server/chunks/virtual/precomputed.mjs +4 -0
  213. package/.output/server/chunks/virtual/precomputed.mjs.map +1 -0
  214. package/.output/server/chunks/virtual/styles.mjs +10 -0
  215. package/.output/server/chunks/virtual/styles.mjs.map +1 -0
  216. package/.output/server/index.mjs +12 -0
  217. package/.output/server/index.mjs.map +1 -0
  218. package/.output/server/node_modules/@babel/parser/lib/index.js +14611 -0
  219. package/.output/server/node_modules/@babel/parser/package.json +50 -0
  220. package/.output/server/node_modules/@iconify/utils/lib/colors/index.js +295 -0
  221. package/.output/server/node_modules/@iconify/utils/lib/colors/keywords.js +701 -0
  222. package/.output/server/node_modules/@iconify/utils/lib/css/common.js +75 -0
  223. package/.output/server/node_modules/@iconify/utils/lib/css/format.js +39 -0
  224. package/.output/server/node_modules/@iconify/utils/lib/css/icon.js +47 -0
  225. package/.output/server/node_modules/@iconify/utils/lib/css/icons.js +128 -0
  226. package/.output/server/node_modules/@iconify/utils/lib/customisations/bool.js +19 -0
  227. package/.output/server/node_modules/@iconify/utils/lib/customisations/defaults.js +13 -0
  228. package/.output/server/node_modules/@iconify/utils/lib/customisations/flip.js +17 -0
  229. package/.output/server/node_modules/@iconify/utils/lib/customisations/merge.js +16 -0
  230. package/.output/server/node_modules/@iconify/utils/lib/customisations/rotate.js +30 -0
  231. package/.output/server/node_modules/@iconify/utils/lib/emoji/cleanup.js +78 -0
  232. package/.output/server/node_modules/@iconify/utils/lib/emoji/convert.js +100 -0
  233. package/.output/server/node_modules/@iconify/utils/lib/emoji/data.js +28 -0
  234. package/.output/server/node_modules/@iconify/utils/lib/emoji/format.js +58 -0
  235. package/.output/server/node_modules/@iconify/utils/lib/emoji/parse.js +48 -0
  236. package/.output/server/node_modules/@iconify/utils/lib/emoji/regex/base.js +203 -0
  237. package/.output/server/node_modules/@iconify/utils/lib/emoji/regex/create.js +33 -0
  238. package/.output/server/node_modules/@iconify/utils/lib/emoji/regex/numbers.js +132 -0
  239. package/.output/server/node_modules/@iconify/utils/lib/emoji/regex/similar.js +165 -0
  240. package/.output/server/node_modules/@iconify/utils/lib/emoji/regex/tree.js +79 -0
  241. package/.output/server/node_modules/@iconify/utils/lib/emoji/replace/find.js +92 -0
  242. package/.output/server/node_modules/@iconify/utils/lib/emoji/replace/replace.js +26 -0
  243. package/.output/server/node_modules/@iconify/utils/lib/emoji/test/components.js +76 -0
  244. package/.output/server/node_modules/@iconify/utils/lib/emoji/test/missing.js +66 -0
  245. package/.output/server/node_modules/@iconify/utils/lib/emoji/test/name.js +45 -0
  246. package/.output/server/node_modules/@iconify/utils/lib/emoji/test/parse.js +103 -0
  247. package/.output/server/node_modules/@iconify/utils/lib/emoji/test/similar.js +36 -0
  248. package/.output/server/node_modules/@iconify/utils/lib/emoji/test/tree.js +92 -0
  249. package/.output/server/node_modules/@iconify/utils/lib/emoji/test/variations.js +62 -0
  250. package/.output/server/node_modules/@iconify/utils/lib/icon/defaults.js +25 -0
  251. package/.output/server/node_modules/@iconify/utils/lib/icon/merge.js +16 -0
  252. package/.output/server/node_modules/@iconify/utils/lib/icon/name.js +57 -0
  253. package/.output/server/node_modules/@iconify/utils/lib/icon/square.js +33 -0
  254. package/.output/server/node_modules/@iconify/utils/lib/icon/transformations.js +12 -0
  255. package/.output/server/node_modules/@iconify/utils/lib/icon-set/convert-info.js +125 -0
  256. package/.output/server/node_modules/@iconify/utils/lib/icon-set/expand.js +19 -0
  257. package/.output/server/node_modules/@iconify/utils/lib/icon-set/get-icon.js +25 -0
  258. package/.output/server/node_modules/@iconify/utils/lib/icon-set/get-icons.js +36 -0
  259. package/.output/server/node_modules/@iconify/utils/lib/icon-set/minify.js +91 -0
  260. package/.output/server/node_modules/@iconify/utils/lib/icon-set/parse.js +46 -0
  261. package/.output/server/node_modules/@iconify/utils/lib/icon-set/tree.js +23 -0
  262. package/.output/server/node_modules/@iconify/utils/lib/icon-set/validate-basic.js +42 -0
  263. package/.output/server/node_modules/@iconify/utils/lib/icon-set/validate.js +123 -0
  264. package/.output/server/node_modules/@iconify/utils/lib/index.js +52 -0
  265. package/.output/server/node_modules/@iconify/utils/lib/loader/custom.js +30 -0
  266. package/.output/server/node_modules/@iconify/utils/lib/loader/loader.js +26 -0
  267. package/.output/server/node_modules/@iconify/utils/lib/loader/modern.js +27 -0
  268. package/.output/server/node_modules/@iconify/utils/lib/loader/utils.js +105 -0
  269. package/.output/server/node_modules/@iconify/utils/lib/misc/objects.js +26 -0
  270. package/.output/server/node_modules/@iconify/utils/lib/misc/strings.js +26 -0
  271. package/.output/server/node_modules/@iconify/utils/lib/misc/title.js +9 -0
  272. package/.output/server/node_modules/@iconify/utils/lib/svg/build.js +113 -0
  273. package/.output/server/node_modules/@iconify/utils/lib/svg/defs.js +31 -0
  274. package/.output/server/node_modules/@iconify/utils/lib/svg/encode-svg-for-css.js +13 -0
  275. package/.output/server/node_modules/@iconify/utils/lib/svg/html.js +9 -0
  276. package/.output/server/node_modules/@iconify/utils/lib/svg/id.js +41 -0
  277. package/.output/server/node_modules/@iconify/utils/lib/svg/inner-html.js +22 -0
  278. package/.output/server/node_modules/@iconify/utils/lib/svg/parse.js +67 -0
  279. package/.output/server/node_modules/@iconify/utils/lib/svg/pretty.js +54 -0
  280. package/.output/server/node_modules/@iconify/utils/lib/svg/size.js +27 -0
  281. package/.output/server/node_modules/@iconify/utils/lib/svg/trim.js +7 -0
  282. package/.output/server/node_modules/@iconify/utils/lib/svg/url.js +22 -0
  283. package/.output/server/node_modules/@iconify/utils/lib/svg/viewbox.js +8 -0
  284. package/.output/server/node_modules/@iconify/utils/package.json +119 -0
  285. package/.output/server/node_modules/@vue/compiler-core/dist/compiler-core.cjs.prod.js +6801 -0
  286. package/.output/server/node_modules/@vue/compiler-core/package.json +58 -0
  287. package/.output/server/node_modules/@vue/compiler-dom/dist/compiler-dom.cjs.prod.js +692 -0
  288. package/.output/server/node_modules/@vue/compiler-dom/package.json +57 -0
  289. package/.output/server/node_modules/@vue/compiler-ssr/dist/compiler-ssr.cjs.js +1420 -0
  290. package/.output/server/node_modules/@vue/compiler-ssr/package.json +34 -0
  291. package/.output/server/node_modules/@vue/reactivity/dist/reactivity.cjs.prod.js +1903 -0
  292. package/.output/server/node_modules/@vue/reactivity/package.json +55 -0
  293. package/.output/server/node_modules/@vue/runtime-core/dist/runtime-core.cjs.prod.js +6976 -0
  294. package/.output/server/node_modules/@vue/runtime-core/package.json +52 -0
  295. package/.output/server/node_modules/@vue/runtime-dom/dist/runtime-dom.cjs.prod.js +1841 -0
  296. package/.output/server/node_modules/@vue/runtime-dom/package.json +60 -0
  297. package/.output/server/node_modules/@vue/server-renderer/dist/server-renderer.cjs.prod.js +904 -0
  298. package/.output/server/node_modules/@vue/server-renderer/package.json +53 -0
  299. package/.output/server/node_modules/@vue/shared/dist/shared.cjs.prod.js +609 -0
  300. package/.output/server/node_modules/@vue/shared/package.json +47 -0
  301. package/.output/server/node_modules/consola/dist/chunks/prompt.mjs +280 -0
  302. package/.output/server/node_modules/consola/dist/core.mjs +512 -0
  303. package/.output/server/node_modules/consola/dist/index.mjs +651 -0
  304. package/.output/server/node_modules/consola/dist/shared/consola.DRwqZj3T.mjs +72 -0
  305. package/.output/server/node_modules/consola/dist/shared/consola.DXBYu-KD.mjs +288 -0
  306. package/.output/server/node_modules/consola/package.json +136 -0
  307. package/.output/server/node_modules/devalue/index.js +17 -0
  308. package/.output/server/node_modules/devalue/package.json +39 -0
  309. package/.output/server/node_modules/devalue/src/base64.js +60 -0
  310. package/.output/server/node_modules/devalue/src/constants.js +12 -0
  311. package/.output/server/node_modules/devalue/src/operations.js +193 -0
  312. package/.output/server/node_modules/devalue/src/parse.js +270 -0
  313. package/.output/server/node_modules/devalue/src/stringify.js +428 -0
  314. package/.output/server/node_modules/devalue/src/uneval.js +582 -0
  315. package/.output/server/node_modules/devalue/src/utils.js +185 -0
  316. package/.output/server/node_modules/entities/dist/commonjs/decode-codepoint.js +77 -0
  317. package/.output/server/node_modules/entities/dist/commonjs/decode.js +568 -0
  318. package/.output/server/node_modules/entities/dist/commonjs/generated/decode-data-html.js +7 -0
  319. package/.output/server/node_modules/entities/dist/commonjs/generated/decode-data-xml.js +7 -0
  320. package/.output/server/node_modules/entities/dist/commonjs/internal/bin-trie-flags.js +21 -0
  321. package/.output/server/node_modules/entities/dist/commonjs/internal/decode-shared.js +31 -0
  322. package/.output/server/node_modules/entities/dist/commonjs/package.json +3 -0
  323. package/.output/server/node_modules/entities/package.json +120 -0
  324. package/.output/server/node_modules/estree-walker/dist/umd/estree-walker.js +344 -0
  325. package/.output/server/node_modules/estree-walker/package.json +37 -0
  326. package/.output/server/node_modules/fflate/esm/index.mjs +2710 -0
  327. package/.output/server/node_modules/fflate/package.json +128 -0
  328. package/.output/server/node_modules/fnv1a-64/dist/index.mjs +95 -0
  329. package/.output/server/node_modules/fnv1a-64/package.json +75 -0
  330. package/.output/server/node_modules/hookable/dist/index.mjs +257 -0
  331. package/.output/server/node_modules/hookable/package.json +53 -0
  332. package/.output/server/node_modules/nostics/dist/formatters/ansi.mjs +19 -0
  333. package/.output/server/node_modules/nostics/dist/index.mjs +187 -0
  334. package/.output/server/node_modules/nostics/package.json +125 -0
  335. package/.output/server/node_modules/object-identity/index.js +60 -0
  336. package/.output/server/node_modules/object-identity/package.json +40 -0
  337. package/.output/server/node_modules/p-limit/index.js +104 -0
  338. package/.output/server/node_modules/p-limit/package.json +58 -0
  339. package/.output/server/node_modules/pmtiles/dist/esm/index.js +2 -0
  340. package/.output/server/node_modules/pmtiles/package.json +50 -0
  341. package/.output/server/node_modules/source-map-js/lib/array-set.js +121 -0
  342. package/.output/server/node_modules/source-map-js/lib/base64-vlq.js +140 -0
  343. package/.output/server/node_modules/source-map-js/lib/base64.js +67 -0
  344. package/.output/server/node_modules/source-map-js/lib/binary-search.js +111 -0
  345. package/.output/server/node_modules/source-map-js/lib/mapping-list.js +79 -0
  346. package/.output/server/node_modules/source-map-js/lib/quick-sort.js +132 -0
  347. package/.output/server/node_modules/source-map-js/lib/source-map-consumer.js +1188 -0
  348. package/.output/server/node_modules/source-map-js/lib/source-map-generator.js +444 -0
  349. package/.output/server/node_modules/source-map-js/lib/source-node.js +413 -0
  350. package/.output/server/node_modules/source-map-js/lib/util.js +594 -0
  351. package/.output/server/node_modules/source-map-js/package.json +71 -0
  352. package/.output/server/node_modules/source-map-js/source-map.js +8 -0
  353. package/.output/server/node_modules/tailwindcss/dist/chunk-DCG7AFIE.mjs +1 -0
  354. package/.output/server/node_modules/tailwindcss/dist/colors.mjs +1 -0
  355. package/.output/server/node_modules/tailwindcss/package.json +89 -0
  356. package/.output/server/node_modules/ufo/dist/index.mjs +645 -0
  357. package/.output/server/node_modules/ufo/package.json +48 -0
  358. package/.output/server/node_modules/unhead/dist/client.mjs +22 -0
  359. package/.output/server/node_modules/unhead/dist/index.mjs +52 -0
  360. package/.output/server/node_modules/unhead/dist/legacy.mjs +33 -0
  361. package/.output/server/node_modules/unhead/dist/minify.mjs +183 -0
  362. package/.output/server/node_modules/unhead/dist/parser.mjs +518 -0
  363. package/.output/server/node_modules/unhead/dist/plugins.mjs +631 -0
  364. package/.output/server/node_modules/unhead/dist/scripts.node.mjs +6 -0
  365. package/.output/server/node_modules/unhead/dist/server.mjs +99 -0
  366. package/.output/server/node_modules/unhead/dist/shared/unhead.BEmVMkeA.mjs +673 -0
  367. package/.output/server/node_modules/unhead/dist/shared/unhead.BGFxPGPQ.mjs +47 -0
  368. package/.output/server/node_modules/unhead/dist/shared/unhead.BQWSw36o.mjs +192 -0
  369. package/.output/server/node_modules/unhead/dist/shared/unhead.Bb4d5b9h.mjs +67 -0
  370. package/.output/server/node_modules/unhead/dist/shared/unhead.BdK3SLPN.mjs +585 -0
  371. package/.output/server/node_modules/unhead/dist/shared/unhead.Bf_fPVYA.mjs +6 -0
  372. package/.output/server/node_modules/unhead/dist/shared/unhead.Bm4Y6XQI.mjs +17 -0
  373. package/.output/server/node_modules/unhead/dist/shared/unhead.C3b2Ipoj.mjs +223 -0
  374. package/.output/server/node_modules/unhead/dist/shared/unhead.CGPOfp5O.mjs +32 -0
  375. package/.output/server/node_modules/unhead/dist/shared/unhead.CHEy9ana.mjs +7 -0
  376. package/.output/server/node_modules/unhead/dist/shared/unhead.CTjuIdzk.mjs +27 -0
  377. package/.output/server/node_modules/unhead/dist/shared/unhead.CfKy3Kuq.mjs +196 -0
  378. package/.output/server/node_modules/unhead/dist/shared/unhead.D7HkBzZn.mjs +59 -0
  379. package/.output/server/node_modules/unhead/dist/shared/unhead.DNKiVLV7.mjs +400 -0
  380. package/.output/server/node_modules/unhead/dist/shared/unhead.MC5RsXLj.mjs +19 -0
  381. package/.output/server/node_modules/unhead/dist/shared/unhead.jEy9BmRq.mjs +264 -0
  382. package/.output/server/node_modules/unhead/dist/shared/unhead.tQnRaXfX.mjs +240 -0
  383. package/.output/server/node_modules/unhead/dist/stream/client.mjs +28 -0
  384. package/.output/server/node_modules/unhead/dist/stream/iife.mjs +2 -0
  385. package/.output/server/node_modules/unhead/dist/stream/server.mjs +264 -0
  386. package/.output/server/node_modules/unhead/dist/utils.mjs +7 -0
  387. package/.output/server/node_modules/unhead/package.json +179 -0
  388. package/.output/server/node_modules/vue/dist/vue.cjs.js +80 -0
  389. package/.output/server/node_modules/vue/dist/vue.cjs.prod.js +66 -0
  390. package/.output/server/node_modules/vue/index.js +7 -0
  391. package/.output/server/node_modules/vue/index.mjs +1 -0
  392. package/.output/server/node_modules/vue/package.json +112 -0
  393. package/.output/server/node_modules/vue/server-renderer/index.mjs +1 -0
  394. package/.output/server/node_modules/vue-bundle-renderer/dist/runtime.mjs +278 -0
  395. package/.output/server/node_modules/vue-bundle-renderer/package.json +54 -0
  396. package/.output/server/node_modules/yocto-queue/index.js +90 -0
  397. package/.output/server/node_modules/yocto-queue/package.json +48 -0
  398. package/.output/server/node_modules/zod/index.js +4 -0
  399. package/.output/server/node_modules/zod/package.json +135 -0
  400. package/.output/server/node_modules/zod/v4/classic/checks.js +1 -0
  401. package/.output/server/node_modules/zod/v4/classic/coerce.js +17 -0
  402. package/.output/server/node_modules/zod/v4/classic/compat.js +31 -0
  403. package/.output/server/node_modules/zod/v4/classic/errors.js +48 -0
  404. package/.output/server/node_modules/zod/v4/classic/external.js +20 -0
  405. package/.output/server/node_modules/zod/v4/classic/from-json-schema.js +599 -0
  406. package/.output/server/node_modules/zod/v4/classic/iso.js +30 -0
  407. package/.output/server/node_modules/zod/v4/classic/package.json +7 -0
  408. package/.output/server/node_modules/zod/v4/classic/parse.js +15 -0
  409. package/.output/server/node_modules/zod/v4/classic/schemas.js +1395 -0
  410. package/.output/server/node_modules/zod/v4/core/api.js +1087 -0
  411. package/.output/server/node_modules/zod/v4/core/checks.js +575 -0
  412. package/.output/server/node_modules/zod/v4/core/core.js +78 -0
  413. package/.output/server/node_modules/zod/v4/core/doc.js +35 -0
  414. package/.output/server/node_modules/zod/v4/core/errors.js +185 -0
  415. package/.output/server/node_modules/zod/v4/core/index.js +16 -0
  416. package/.output/server/node_modules/zod/v4/core/json-schema-generator.js +95 -0
  417. package/.output/server/node_modules/zod/v4/core/json-schema-processors.js +601 -0
  418. package/.output/server/node_modules/zod/v4/core/json-schema.js +1 -0
  419. package/.output/server/node_modules/zod/v4/core/package.json +7 -0
  420. package/.output/server/node_modules/zod/v4/core/parse.js +93 -0
  421. package/.output/server/node_modules/zod/v4/core/regexes.js +139 -0
  422. package/.output/server/node_modules/zod/v4/core/registries.js +51 -0
  423. package/.output/server/node_modules/zod/v4/core/schemas.js +2239 -0
  424. package/.output/server/node_modules/zod/v4/core/to-json-schema.js +448 -0
  425. package/.output/server/node_modules/zod/v4/core/util.js +674 -0
  426. package/.output/server/node_modules/zod/v4/core/versions.js +5 -0
  427. package/.output/server/node_modules/zod/v4/locales/ar.js +106 -0
  428. package/.output/server/node_modules/zod/v4/locales/az.js +105 -0
  429. package/.output/server/node_modules/zod/v4/locales/be.js +156 -0
  430. package/.output/server/node_modules/zod/v4/locales/bg.js +120 -0
  431. package/.output/server/node_modules/zod/v4/locales/ca.js +107 -0
  432. package/.output/server/node_modules/zod/v4/locales/cs.js +111 -0
  433. package/.output/server/node_modules/zod/v4/locales/da.js +115 -0
  434. package/.output/server/node_modules/zod/v4/locales/de.js +108 -0
  435. package/.output/server/node_modules/zod/v4/locales/el.js +109 -0
  436. package/.output/server/node_modules/zod/v4/locales/en.js +113 -0
  437. package/.output/server/node_modules/zod/v4/locales/eo.js +109 -0
  438. package/.output/server/node_modules/zod/v4/locales/es.js +132 -0
  439. package/.output/server/node_modules/zod/v4/locales/fa.js +114 -0
  440. package/.output/server/node_modules/zod/v4/locales/fi.js +112 -0
  441. package/.output/server/node_modules/zod/v4/locales/fr-CA.js +107 -0
  442. package/.output/server/node_modules/zod/v4/locales/fr.js +125 -0
  443. package/.output/server/node_modules/zod/v4/locales/he.js +214 -0
  444. package/.output/server/node_modules/zod/v4/locales/hr.js +122 -0
  445. package/.output/server/node_modules/zod/v4/locales/hu.js +108 -0
  446. package/.output/server/node_modules/zod/v4/locales/hy.js +147 -0
  447. package/.output/server/node_modules/zod/v4/locales/id.js +106 -0
  448. package/.output/server/node_modules/zod/v4/locales/index.js +52 -0
  449. package/.output/server/node_modules/zod/v4/locales/is.js +109 -0
  450. package/.output/server/node_modules/zod/v4/locales/it.js +108 -0
  451. package/.output/server/node_modules/zod/v4/locales/ja.js +107 -0
  452. package/.output/server/node_modules/zod/v4/locales/ka.js +112 -0
  453. package/.output/server/node_modules/zod/v4/locales/kh.js +5 -0
  454. package/.output/server/node_modules/zod/v4/locales/km.js +110 -0
  455. package/.output/server/node_modules/zod/v4/locales/ko.js +111 -0
  456. package/.output/server/node_modules/zod/v4/locales/lt.js +203 -0
  457. package/.output/server/node_modules/zod/v4/locales/mk.js +109 -0
  458. package/.output/server/node_modules/zod/v4/locales/ms.js +107 -0
  459. package/.output/server/node_modules/zod/v4/locales/nl.js +110 -0
  460. package/.output/server/node_modules/zod/v4/locales/no.js +108 -0
  461. package/.output/server/node_modules/zod/v4/locales/ota.js +109 -0
  462. package/.output/server/node_modules/zod/v4/locales/package.json +7 -0
  463. package/.output/server/node_modules/zod/v4/locales/pl.js +109 -0
  464. package/.output/server/node_modules/zod/v4/locales/ps.js +114 -0
  465. package/.output/server/node_modules/zod/v4/locales/pt.js +108 -0
  466. package/.output/server/node_modules/zod/v4/locales/ro.js +119 -0
  467. package/.output/server/node_modules/zod/v4/locales/ru.js +156 -0
  468. package/.output/server/node_modules/zod/v4/locales/sl.js +109 -0
  469. package/.output/server/node_modules/zod/v4/locales/sv.js +110 -0
  470. package/.output/server/node_modules/zod/v4/locales/ta.js +110 -0
  471. package/.output/server/node_modules/zod/v4/locales/th.js +110 -0
  472. package/.output/server/node_modules/zod/v4/locales/tr.js +105 -0
  473. package/.output/server/node_modules/zod/v4/locales/ua.js +5 -0
  474. package/.output/server/node_modules/zod/v4/locales/uk.js +108 -0
  475. package/.output/server/node_modules/zod/v4/locales/ur.js +110 -0
  476. package/.output/server/node_modules/zod/v4/locales/uz.js +110 -0
  477. package/.output/server/node_modules/zod/v4/locales/vi.js +108 -0
  478. package/.output/server/node_modules/zod/v4/locales/yo.js +107 -0
  479. package/.output/server/node_modules/zod/v4/locales/zh-CN.js +109 -0
  480. package/.output/server/node_modules/zod/v4/locales/zh-TW.js +107 -0
  481. package/.output/server/package.json +37 -0
  482. package/LICENSE +3 -0
  483. package/README.md +125 -0
  484. package/dist/src/bbox.js +55 -0
  485. package/dist/src/cli.js +255 -0
  486. package/dist/src/config.js +56 -0
  487. package/dist/src/core/fetch-process.js +19 -0
  488. package/dist/src/core/grid-renderer.js +149 -0
  489. package/dist/src/core/lease.js +103 -0
  490. package/dist/src/core/paths.js +13 -0
  491. package/dist/src/core/png.js +192 -0
  492. package/dist/src/core/raster-style.js +33 -0
  493. package/dist/src/core/uomtiles.js +307 -0
  494. package/dist/src/fetcher.js +208 -0
  495. package/dist/src/geographic-grid.js +162 -0
  496. package/dist/src/grid-crawl.js +478 -0
  497. package/dist/src/mask-image.js +16 -0
  498. package/dist/src/official-grid.js +51 -0
  499. package/dist/src/quality.js +30 -0
  500. package/dist/src/token.js +206 -0
  501. package/package.json +68 -0
  502. package/public/apple-touch-icon.png +0 -0
  503. package/public/favicon.ico +0 -0
  504. package/public/favicon.svg +8 -0
  505. package/public/icon-192.png +0 -0
  506. package/public/icon-512.png +0 -0
  507. package/public/site.webmanifest +11 -0
@@ -0,0 +1,192 @@
1
+ import { deflateSync, inflateSync } from 'node:zlib';
2
+ const SIGNATURE = Buffer.from('89504e470d0a1a0a', 'hex');
3
+ const CRC_TABLE = new Uint32Array(256);
4
+ for (let n = 0; n < 256; n++) {
5
+ let value = n;
6
+ for (let k = 0; k < 8; k++)
7
+ value = value & 1 ? 0xedb88320 ^ (value >>> 1) : value >>> 1;
8
+ CRC_TABLE[n] = value >>> 0;
9
+ }
10
+ function crc32(data) {
11
+ let crc = 0xffffffff;
12
+ for (const byte of data)
13
+ crc = CRC_TABLE[(crc ^ byte) & 0xff] ^ (crc >>> 8);
14
+ return (crc ^ 0xffffffff) >>> 0;
15
+ }
16
+ function chunk(type, data) {
17
+ const typeBytes = Buffer.from(type, 'ascii');
18
+ const body = Buffer.from(data);
19
+ const output = Buffer.allocUnsafe(body.length + 12);
20
+ output.writeUInt32BE(body.length, 0);
21
+ typeBytes.copy(output, 4);
22
+ body.copy(output, 8);
23
+ output.writeUInt32BE(crc32(Buffer.concat([typeBytes, body])), body.length + 8);
24
+ return output;
25
+ }
26
+ function decodeIndexedPng(png, allowLegacyCanonicalPhys) {
27
+ const input = Buffer.from(png);
28
+ if (!input.subarray(0, 8).equals(SIGNATURE))
29
+ throw new Error('UOM WMS did not return a PNG signature');
30
+ let offset = 8;
31
+ let width = 0, height = 0, bitDepth = 0, colorType = -1, interlace = -1;
32
+ let alpha = new Uint8Array(0);
33
+ let paletteEntries = 0;
34
+ const idat = [];
35
+ const chunkTypes = [];
36
+ while (offset + 12 <= input.length) {
37
+ const length = input.readUInt32BE(offset);
38
+ if (offset + length + 12 > input.length)
39
+ throw new Error('truncated UOM PNG chunk');
40
+ const type = input.toString('ascii', offset + 4, offset + 8);
41
+ chunkTypes.push(type);
42
+ const data = input.subarray(offset + 8, offset + 8 + length);
43
+ const expected = input.readUInt32BE(offset + 8 + length);
44
+ if (crc32(input.subarray(offset + 4, offset + 8 + length)) !== expected)
45
+ throw new Error(`invalid PNG ${type} CRC`);
46
+ if (type === 'IHDR') {
47
+ width = data.readUInt32BE(0);
48
+ height = data.readUInt32BE(4);
49
+ bitDepth = data[8];
50
+ colorType = data[9];
51
+ interlace = data[12];
52
+ if (data[10] !== 0 || data[11] !== 0)
53
+ throw new Error('unsupported UOM PNG compression or filter method');
54
+ }
55
+ else if (type === 'PLTE') {
56
+ if (data.length === 0 || data.length % 3 !== 0 || data.length > 768)
57
+ throw new Error('invalid UOM PNG palette');
58
+ paletteEntries = data.length / 3;
59
+ }
60
+ else if (type === 'tRNS')
61
+ alpha = Uint8Array.from(data);
62
+ else if (type === 'IDAT')
63
+ idat.push(data);
64
+ else if (type === 'IEND') {
65
+ offset += length + 12;
66
+ break;
67
+ }
68
+ offset += length + 12;
69
+ }
70
+ const hasIdatTail = (start) => chunkTypes.length > start + 1 &&
71
+ chunkTypes.at(-1) === 'IEND' && chunkTypes.slice(start, -1).every(type => type === 'IDAT');
72
+ const exactUom = chunkTypes[0] === 'IHDR' && chunkTypes[1] === 'PLTE' && chunkTypes[2] === 'tRNS' && hasIdatTail(3);
73
+ let canonicalDataStart = 2;
74
+ if (chunkTypes[canonicalDataStart] === 'tRNS')
75
+ canonicalDataStart++;
76
+ if (chunkTypes[canonicalDataStart] === 'pHYs')
77
+ canonicalDataStart++;
78
+ const legacyCanonical = allowLegacyCanonicalPhys && chunkTypes[0] === 'IHDR' && chunkTypes[1] === 'PLTE' && hasIdatTail(canonicalDataStart);
79
+ if ((!exactUom && !legacyCanonical) || offset !== input.length) {
80
+ throw new Error(`unexpected UOM PNG chunks: ${chunkTypes.join(',')}`);
81
+ }
82
+ if (width <= 0 || height <= 0 || colorType !== 3 || ![1, 2, 4, 8].includes(bitDepth) || interlace !== 0) {
83
+ throw new Error(`unexpected UOM PNG IHDR ${width}x${height} depth=${bitDepth} type=${colorType} interlace=${interlace}`);
84
+ }
85
+ if (paletteEntries === 0 || alpha.length > paletteEntries)
86
+ throw new Error('invalid UOM PNG palette transparency');
87
+ let hasVisiblePaletteEntry = false;
88
+ for (let index = 0; index < paletteEntries; index++) {
89
+ if ((alpha[index] ?? 255) >= 102) {
90
+ hasVisiblePaletteEntry = true;
91
+ break;
92
+ }
93
+ }
94
+ if (!hasVisiblePaletteEntry) {
95
+ return { width, height, bitDepth: bitDepth, paletteEntries, indexes: new Uint8Array(width * height), alpha };
96
+ }
97
+ const rowBytes = Math.ceil(width * bitDepth / 8);
98
+ const compressed = Buffer.concat(idat);
99
+ const expectedInflatedSize = (rowBytes + 1) * height;
100
+ const filtered = inflateSync(compressed, { maxOutputLength: expectedInflatedSize });
101
+ if (filtered.length !== expectedInflatedSize)
102
+ throw new Error('unexpected UOM PNG inflated size');
103
+ const rows = Buffer.allocUnsafe(rowBytes * height);
104
+ for (let y = 0; y < height; y++) {
105
+ const filter = filtered[y * (rowBytes + 1)];
106
+ const source = y * (rowBytes + 1) + 1;
107
+ const target = y * rowBytes;
108
+ for (let x = 0; x < rowBytes; x++) {
109
+ const raw = filtered[source + x];
110
+ const left = x > 0 ? rows[target + x - 1] : 0;
111
+ const up = y > 0 ? rows[target - rowBytes + x] : 0;
112
+ const upLeft = x > 0 && y > 0 ? rows[target - rowBytes + x - 1] : 0;
113
+ if (filter === 0)
114
+ rows[target + x] = raw;
115
+ else if (filter === 1)
116
+ rows[target + x] = (raw + left) & 0xff;
117
+ else if (filter === 2)
118
+ rows[target + x] = (raw + up) & 0xff;
119
+ else if (filter === 3)
120
+ rows[target + x] = (raw + Math.floor((left + up) / 2)) & 0xff;
121
+ else if (filter === 4) {
122
+ const p = left + up - upLeft;
123
+ const pa = Math.abs(p - left), pb = Math.abs(p - up), pc = Math.abs(p - upLeft);
124
+ rows[target + x] = (raw + (pa <= pb && pa <= pc ? left : pb <= pc ? up : upLeft)) & 0xff;
125
+ }
126
+ else
127
+ throw new Error(`unexpected UOM PNG row filter ${filter}`);
128
+ }
129
+ }
130
+ const indexes = new Uint8Array(width * height);
131
+ for (let y = 0; y < height; y++)
132
+ for (let x = 0; x < width; x++) {
133
+ const pixelsPerByte = 8 / bitDepth;
134
+ const packed = rows[y * rowBytes + Math.floor(x / pixelsPerByte)];
135
+ const shift = 8 - bitDepth * (x % pixelsPerByte + 1);
136
+ indexes[y * width + x] = (packed >> shift) & ((1 << bitDepth) - 1);
137
+ if (indexes[y * width + x] >= paletteEntries)
138
+ throw new Error('UOM PNG pixel index exceeds palette');
139
+ }
140
+ return { width, height, bitDepth: bitDepth, paletteEntries, indexes, alpha };
141
+ }
142
+ export function decodeUomIndexedPng(png) {
143
+ return decodeIndexedPng(png, false);
144
+ }
145
+ function alphaMask(image, expectedWidth, expectedHeight = expectedWidth) {
146
+ if (expectedWidth !== undefined && (image.width !== expectedWidth || image.height !== expectedHeight)) {
147
+ throw new Error(`UOM WMS returned ${image.width}x${image.height}, expected ${expectedWidth}x${expectedHeight}`);
148
+ }
149
+ const mask = new Uint8Array(image.indexes.length);
150
+ let hasVisiblePaletteEntry = false;
151
+ for (let index = 0; index < image.paletteEntries; index++) {
152
+ if ((image.alpha[index] ?? 255) >= 102) {
153
+ hasVisiblePaletteEntry = true;
154
+ break;
155
+ }
156
+ }
157
+ if (!hasVisiblePaletteEntry)
158
+ return mask;
159
+ for (let i = 0; i < mask.length; i++)
160
+ if ((image.alpha[image.indexes[i]] ?? 255) >= 102)
161
+ mask[i] = 1;
162
+ return mask;
163
+ }
164
+ export function decodeUomAlphaMask(png, expectedWidth, expectedHeight = expectedWidth) {
165
+ return alphaMask(decodeIndexedPng(png, false), expectedWidth, expectedHeight);
166
+ }
167
+ export function decodeCanonicalAlphaMask(png, expectedWidth, expectedHeight = expectedWidth) {
168
+ return alphaMask(decodeIndexedPng(png, true), expectedWidth, expectedHeight);
169
+ }
170
+ export function encodeIndexedPng(width, height, indexes, palette, alpha) {
171
+ if (indexes.length !== width * height)
172
+ throw new RangeError('indexed PNG dimensions do not match pixels');
173
+ if (palette.length === 0 || palette.length % 3 !== 0 || palette.length / 3 > 256)
174
+ throw new RangeError('invalid indexed PNG palette');
175
+ const raw = Buffer.allocUnsafe((width + 1) * height);
176
+ for (let y = 0; y < height; y++) {
177
+ raw[y * (width + 1)] = 0;
178
+ raw.set(indexes.subarray(y * width, (y + 1) * width), y * (width + 1) + 1);
179
+ }
180
+ const ihdr = Buffer.alloc(13);
181
+ ihdr.writeUInt32BE(width, 0);
182
+ ihdr.writeUInt32BE(height, 4);
183
+ ihdr[8] = 8;
184
+ ihdr[9] = 3;
185
+ ihdr[10] = 0;
186
+ ihdr[11] = 0;
187
+ ihdr[12] = 0;
188
+ return Buffer.concat([SIGNATURE, chunk('IHDR', ihdr), chunk('PLTE', palette), chunk('tRNS', alpha), chunk('IDAT', deflateSync(raw, { level: 9 })), chunk('IEND', Buffer.alloc(0))]);
189
+ }
190
+ export function encodeCanonicalMask(mask, width = 256, height = 256) {
191
+ return encodeIndexedPng(width, height, mask, Uint8Array.of(0, 0, 0, 0x29, 0x80, 0xb9), Uint8Array.of(0, 255));
192
+ }
@@ -0,0 +1,33 @@
1
+ import { encodeIndexedPng } from "./png.js";
2
+ export const WEB_MERCATOR_HALF_WORLD = 20037508.342789244;
3
+ export const WEB_MERCATOR_WORLD = WEB_MERCATOR_HALF_WORLD * 2;
4
+ export function parseHexColor(color) {
5
+ if (!/^#[0-9a-f]{6}$/i.test(color))
6
+ throw new RangeError('color must use #RRGGBB');
7
+ return [Number.parseInt(color.slice(1, 3), 16), Number.parseInt(color.slice(3, 5), 16), Number.parseInt(color.slice(5, 7), 16)];
8
+ }
9
+ export function encodeStyledMask(mask, width, height, color, opacity) {
10
+ if (mask.length !== width * height)
11
+ throw new RangeError('mask dimensions do not match output');
12
+ if (!Number.isInteger(opacity) || opacity < 0 || opacity > 100)
13
+ throw new RangeError('opacity must be an integer from 0 to 100');
14
+ const [red, green, blue] = parseHexColor(color);
15
+ return encodeIndexedPng(width, height, mask, Uint8Array.of(0, 0, 0, red, green, blue), Uint8Array.of(0, Math.round(opacity * 2.55)));
16
+ }
17
+ export function zoomForMercatorImage(bbox, width, height, maxZoom = 18) {
18
+ const resolution = Math.max((bbox.maxx - bbox.minx) / width, (bbox.maxy - bbox.miny) / height);
19
+ return Math.max(0, Math.min(maxZoom, Math.round(Math.log2(WEB_MERCATOR_WORLD / (256 * resolution)))));
20
+ }
21
+ export function mercatorPixel(bbox, width, height, column, row, zoom) {
22
+ const mercatorX = bbox.minx + (column + 0.5) / width * (bbox.maxx - bbox.minx);
23
+ const mercatorY = bbox.maxy - (row + 0.5) / height * (bbox.maxy - bbox.miny);
24
+ const worldPixels = 256 * 2 ** zoom;
25
+ const globalX = Math.floor((mercatorX + WEB_MERCATOR_HALF_WORLD) / WEB_MERCATOR_WORLD * worldPixels);
26
+ const globalY = Math.floor((WEB_MERCATOR_HALF_WORLD - mercatorY) / WEB_MERCATOR_WORLD * worldPixels);
27
+ return {
28
+ tileX: Math.floor(globalX / 256),
29
+ tileY: Math.floor(globalY / 256),
30
+ pixelX: ((globalX % 256) + 256) % 256,
31
+ pixelY: ((globalY % 256) + 256) % 256,
32
+ };
33
+ }
@@ -0,0 +1,307 @@
1
+ import { randomUUID } from 'node:crypto';
2
+ import { copyFileSync, existsSync, mkdirSync, renameSync, statSync, unlinkSync } from 'node:fs';
3
+ import { dirname, extname, resolve } from 'node:path';
4
+ import { execFile } from 'node:child_process';
5
+ import { promisify } from 'node:util';
6
+ import { DatabaseSync } from 'node:sqlite';
7
+ import { acquireSqliteLease } from "./lease.js";
8
+ import { decodeCanonicalAlphaMask } from "./png.js";
9
+ import { GeographicGridRenderer, PUBLISH_MAX_ZOOM } from "./grid-renderer.js";
10
+ import { xyzYToTmsY } from "../bbox.js";
11
+ const execFileAsync = promisify(execFile);
12
+ const UOMTILES_SCHEMA_VERSION = 1;
13
+ function tables(db) {
14
+ return new Set(db.prepare("SELECT name FROM sqlite_master WHERE type='table'").all().map(row => row.name));
15
+ }
16
+ function metadata(db) {
17
+ if (!tables(db).has('metadata'))
18
+ return {};
19
+ return Object.fromEntries(db.prepare('SELECT name,value FROM metadata').all().map(row => [row.name, row.value]));
20
+ }
21
+ export function initializeUomtiles(path, publisher) {
22
+ mkdirSync(dirname(path), { recursive: true });
23
+ const db = new DatabaseSync(path);
24
+ try {
25
+ db.exec(`
26
+ CREATE TABLE IF NOT EXISTS metadata(name TEXT PRIMARY KEY,value TEXT NOT NULL);
27
+ CREATE TABLE IF NOT EXISTS uomtiles_task(
28
+ id TEXT PRIMARY KEY,
29
+ schema_version INTEGER NOT NULL,
30
+ state TEXT NOT NULL,
31
+ publisher TEXT,
32
+ created_at TEXT NOT NULL,
33
+ started_at TEXT,
34
+ finished_at TEXT,
35
+ tool_version TEXT NOT NULL);
36
+ CREATE TABLE IF NOT EXISTS uomtiles_review(
37
+ kind TEXT NOT NULL,
38
+ object_key TEXT NOT NULL,
39
+ state TEXT NOT NULL,
40
+ note TEXT,
41
+ updated_at TEXT NOT NULL,
42
+ PRIMARY KEY(kind,object_key));
43
+ CREATE TABLE IF NOT EXISTS uomtiles_leases(
44
+ resource TEXT PRIMARY KEY,
45
+ owner TEXT NOT NULL,
46
+ pid INTEGER NOT NULL,
47
+ hostname TEXT NOT NULL,
48
+ acquired_at INTEGER NOT NULL,
49
+ heartbeat_at INTEGER NOT NULL,
50
+ expires_at INTEGER NOT NULL);
51
+ `);
52
+ const existing = db.prepare('SELECT id FROM uomtiles_task LIMIT 1').get();
53
+ if (!existing) {
54
+ const meta = metadata(db);
55
+ const createdAt = meta.crawl_started_at || new Date().toISOString();
56
+ const finishedAt = meta.crawl_finished_at || null;
57
+ db.prepare(`INSERT INTO uomtiles_task(id,schema_version,state,publisher,created_at,started_at,finished_at,tool_version)
58
+ VALUES(?,?,?,?,?,?,?,?)`).run(randomUUID(), UOMTILES_SCHEMA_VERSION, finishedAt ? 'completed' : 'incomplete', publisher || null, createdAt, meta.crawl_started_at || null, finishedAt, process.env.npm_package_version || '0.1.0');
59
+ }
60
+ const upsert = db.prepare('INSERT OR REPLACE INTO metadata(name,value) VALUES(?,?)');
61
+ upsert.run('uomtiles_schema_version', String(UOMTILES_SCHEMA_VERSION));
62
+ if (publisher)
63
+ upsert.run('publisher', publisher);
64
+ }
65
+ finally {
66
+ db.close();
67
+ }
68
+ }
69
+ export function migrateToUomtiles(source, target, publisher) {
70
+ const input = resolve(source);
71
+ const output = resolve(target);
72
+ if (!existsSync(input))
73
+ throw new Error(`输入文件不存在:${input}`);
74
+ if (existsSync(output))
75
+ throw new Error(`目标文件已存在:${output}`);
76
+ mkdirSync(dirname(output), { recursive: true });
77
+ copyFileSync(input, output, 0);
78
+ try {
79
+ initializeUomtiles(output, publisher);
80
+ return inspectUomtiles(output);
81
+ }
82
+ catch (error) {
83
+ unlinkSync(output);
84
+ throw error;
85
+ }
86
+ }
87
+ export function setTaskState(path, state, values = {}) {
88
+ initializeUomtiles(path, values.publisher);
89
+ const db = new DatabaseSync(path);
90
+ try {
91
+ db.prepare(`UPDATE uomtiles_task SET state=?,publisher=COALESCE(?,publisher),
92
+ started_at=COALESCE(?,started_at),finished_at=COALESCE(?,finished_at)`).run(state, values.publisher ?? null, values.startedAt ?? null, values.finishedAt ?? null);
93
+ }
94
+ finally {
95
+ db.close();
96
+ }
97
+ }
98
+ export function inspectUomtiles(path) {
99
+ const absolute = resolve(path);
100
+ const db = new DatabaseSync(absolute, { readOnly: true });
101
+ try {
102
+ const knownTables = tables(db);
103
+ const meta = metadata(db);
104
+ const task = knownTables.has('uomtiles_task')
105
+ ? db.prepare('SELECT * FROM uomtiles_task LIMIT 1').get()
106
+ : null;
107
+ const roots = knownTables.has('grid_roots')
108
+ ? Object.fromEntries(db.prepare('SELECT state,COUNT(*) count FROM grid_roots GROUP BY state').all().map(row => [row.state, row.count]))
109
+ : {};
110
+ const tiles = knownTables.has('tiles')
111
+ ? db.prepare('SELECT zoom_level z,COUNT(*) count,COALESCE(SUM(length(tile_data)),0) bytes FROM tiles GROUP BY zoom_level ORDER BY zoom_level').all()
112
+ : [];
113
+ return {
114
+ path: absolute,
115
+ bytes: statSync(absolute).size,
116
+ schemaVersion: task?.schema_version ?? (meta.uomtiles_schema_version ? Number(meta.uomtiles_schema_version) : null),
117
+ taskId: task?.id ?? null,
118
+ state: task?.state === 'completed' || meta.crawl_finished_at ? 'completed' : 'incomplete',
119
+ publisher: task?.publisher ?? meta.publisher ?? null,
120
+ createdAt: task?.created_at ?? meta.crawl_started_at ?? null,
121
+ startedAt: task?.started_at ?? meta.crawl_started_at ?? null,
122
+ finishedAt: task?.finished_at ?? meta.crawl_finished_at ?? null,
123
+ sourceZoom: meta.source_zoom ? Number(meta.source_zoom) : null,
124
+ gridLevel: meta.geographic_grid_level ? Number(meta.geographic_grid_level) : null,
125
+ roots,
126
+ tiles,
127
+ };
128
+ }
129
+ finally {
130
+ db.close();
131
+ }
132
+ }
133
+ export function exportMbtiles(source, target) {
134
+ const input = resolve(source);
135
+ const output = resolve(target);
136
+ if (extname(output).toLowerCase() !== '.mbtiles')
137
+ throw new Error('MBTiles 输出文件必须使用 .mbtiles 扩展名');
138
+ const lock = acquireSqliteLease(input, 'writer');
139
+ const temporary = `${output}.${process.pid}.tmp`;
140
+ if (existsSync(temporary))
141
+ unlinkSync(temporary);
142
+ mkdirSync(dirname(output), { recursive: true });
143
+ const sourceDb = new DatabaseSync(input, { readOnly: true });
144
+ const outputDb = new DatabaseSync(temporary);
145
+ try {
146
+ outputDb.exec(`PRAGMA journal_mode=OFF; PRAGMA synchronous=OFF;
147
+ CREATE TABLE metadata(name TEXT PRIMARY KEY,value TEXT NOT NULL);
148
+ CREATE TABLE tiles(zoom_level INTEGER NOT NULL,tile_column INTEGER NOT NULL,tile_row INTEGER NOT NULL,tile_data BLOB NOT NULL,
149
+ PRIMARY KEY(zoom_level,tile_column,tile_row));`);
150
+ const insertMeta = outputDb.prepare('INSERT INTO metadata(name,value) VALUES(?,?)');
151
+ const standard = new Set(['name', 'type', 'version', 'description', 'format', 'bounds', 'center', 'minzoom', 'attribution']);
152
+ const meta = metadata(sourceDb);
153
+ outputDb.exec('BEGIN');
154
+ for (const name of standard)
155
+ if (meta[name])
156
+ insertMeta.run(name, meta[name]);
157
+ const summary = inspectUomtiles(input);
158
+ insertMeta.run('uomtiles:publisher', summary.publisher || 'unknown');
159
+ insertMeta.run('uomtiles:fetched_at', summary.finishedAt || summary.startedAt || 'unknown');
160
+ insertMeta.run('uomtiles:source_zoom', String(summary.sourceZoom ?? 'unknown'));
161
+ insertMeta.run('uomtiles:grid_level', String(summary.gridLevel ?? 'unknown'));
162
+ const renderer = new GeographicGridRenderer(input);
163
+ insertMeta.run('maxzoom', String(renderer.available ? PUBLISH_MAX_ZOOM : Math.max(0, ...summary.tiles.map(tile => tile.z))));
164
+ const insertTile = outputDb.prepare('INSERT INTO tiles VALUES(?,?,?,?)');
165
+ let copied = 0;
166
+ if (renderer.available) {
167
+ for (let z = 0; z <= PUBLISH_MAX_ZOOM; z++)
168
+ for (const coordinate of renderer.contentCoordinates(z)) {
169
+ const tile = renderer.renderTile(z, coordinate.x, coordinate.y);
170
+ if (!tile)
171
+ continue;
172
+ insertTile.run(z, coordinate.x, xyzYToTmsY(z, coordinate.y), tile);
173
+ copied++;
174
+ if (copied % 1_000 === 0)
175
+ lock.heartbeat();
176
+ }
177
+ }
178
+ else {
179
+ for (const row of sourceDb.prepare('SELECT zoom_level,tile_column,tile_row,tile_data FROM tiles ORDER BY zoom_level,tile_column,tile_row').iterate()) {
180
+ insertTile.run(row.zoom_level, row.tile_column, row.tile_row, row.tile_data);
181
+ copied++;
182
+ if (copied % 1_000 === 0)
183
+ lock.heartbeat();
184
+ }
185
+ }
186
+ lock.heartbeat();
187
+ outputDb.exec('COMMIT');
188
+ outputDb.exec('CREATE UNIQUE INDEX tile_index ON tiles(zoom_level,tile_column,tile_row); PRAGMA optimize;');
189
+ }
190
+ catch (error) {
191
+ try {
192
+ outputDb.exec('ROLLBACK');
193
+ }
194
+ catch { }
195
+ throw error;
196
+ }
197
+ finally {
198
+ outputDb.close();
199
+ sourceDb.close();
200
+ lock.release();
201
+ }
202
+ if (existsSync(output))
203
+ unlinkSync(output);
204
+ renameSync(temporary, output);
205
+ return inspectUomtiles(output);
206
+ }
207
+ export async function exportTiles(source, target, pmtilesCommand = process.env.UOMTILES_PMTILES_COMMAND || 'pmtiles') {
208
+ const extension = extname(target).toLowerCase();
209
+ if (extension === '.mbtiles') {
210
+ exportMbtiles(source, target);
211
+ return;
212
+ }
213
+ if (extension !== '.pmtiles')
214
+ throw new Error('输出文件必须使用 .mbtiles 或 .pmtiles 扩展名');
215
+ const intermediate = `${resolve(target)}.${process.pid}.mbtiles`;
216
+ try {
217
+ exportMbtiles(source, intermediate);
218
+ await execFileAsync(pmtilesCommand, ['convert', intermediate, resolve(target), '--force', '--quiet'], { timeout: 30 * 60_000 });
219
+ }
220
+ catch (error) {
221
+ if (error?.code === 'ENOENT')
222
+ throw new Error(`找不到 ${pmtilesCommand};请安装 Protomaps pmtiles CLI 或设置 UOMTILES_PMTILES_COMMAND`);
223
+ throw error;
224
+ }
225
+ finally {
226
+ if (existsSync(intermediate))
227
+ unlinkSync(intermediate);
228
+ }
229
+ }
230
+ export function diffUomtiles(leftPath, rightPath) {
231
+ const left = new DatabaseSync(resolve(leftPath), { readOnly: true });
232
+ const right = new DatabaseSync(resolve(rightPath), { readOnly: true });
233
+ try {
234
+ const tileMap = (db) => new Map(db.prepare('SELECT zoom_level,tile_column,tile_row,tile_data FROM tiles ORDER BY zoom_level,tile_column,tile_row').all()
235
+ .map(row => [`${row.zoom_level}/${row.tile_column}/${row.tile_row}`, {
236
+ z: row.zoom_level,
237
+ x: row.tile_column,
238
+ y: (2 ** row.zoom_level - 1 - row.tile_row),
239
+ data: row.tile_data,
240
+ }]));
241
+ const ignored = new Set(['version', 'crawl_started_at', 'crawl_finished_at', 'publisher', 'validation_report', 'grid_root_completed']);
242
+ const isIgnoredMetadata = (name) => ignored.has(name) || /^derived_z\d+_completed_at$/.test(name);
243
+ const lm = metadata(left), rm = metadata(right);
244
+ const names = [...new Set([...Object.keys(lm), ...Object.keys(rm)])].filter(name => !isIgnoredMetadata(name)).sort();
245
+ const metadataDiff = names.filter(name => (lm[name] ?? null) !== (rm[name] ?? null)).map(name => ({ name, left: lm[name] ?? null, right: rm[name] ?? null }));
246
+ const leftTiles = tileMap(left), rightTiles = tileMap(right);
247
+ const keys = new Set([...leftTiles.keys(), ...rightTiles.keys()]);
248
+ const items = [];
249
+ let compared = 0, missingLeft = 0, missingRight = 0, diffPixels = 0, addedPixels = 0, removedPixels = 0;
250
+ for (const key of keys) {
251
+ const leftTile = leftTiles.get(key), rightTile = rightTiles.get(key);
252
+ if (leftTile && rightTile)
253
+ compared++;
254
+ if (!leftTile)
255
+ missingLeft++;
256
+ if (!rightTile)
257
+ missingRight++;
258
+ const leftMask = leftTile ? decodeCanonicalAlphaMask(leftTile.data, 256) : new Uint8Array(256 * 256);
259
+ const rightMask = rightTile ? decodeCanonicalAlphaMask(rightTile.data, 256) : new Uint8Array(256 * 256);
260
+ let tileAdded = 0, tileRemoved = 0, leftPixels = 0, rightPixels = 0;
261
+ for (let pixel = 0; pixel < leftMask.length; pixel++) {
262
+ const leftVisible = leftMask[pixel] !== 0, rightVisible = rightMask[pixel] !== 0;
263
+ if (leftVisible)
264
+ leftPixels++;
265
+ if (rightVisible)
266
+ rightPixels++;
267
+ if (leftVisible === rightVisible)
268
+ continue;
269
+ if (rightVisible)
270
+ tileAdded++;
271
+ else
272
+ tileRemoved++;
273
+ }
274
+ const tileDiff = tileAdded + tileRemoved;
275
+ diffPixels += tileDiff;
276
+ addedPixels += tileAdded;
277
+ removedPixels += tileRemoved;
278
+ if (tileDiff === 0)
279
+ continue;
280
+ const coordinate = leftTile || rightTile;
281
+ items.push({
282
+ z: coordinate.z, x: coordinate.x, y: coordinate.y,
283
+ diffPixels: tileDiff, diffPercent: tileDiff / (256 * 256) * 100,
284
+ addedPixels: tileAdded, removedPixels: tileRemoved, leftPixels, rightPixels,
285
+ missingLeft: !leftTile, missingRight: !rightTile,
286
+ });
287
+ }
288
+ items.sort((a, b) => b.diffPercent - a.diffPercent || b.diffPixels - a.diffPixels || b.z - a.z || a.x - b.x || a.y - b.y);
289
+ const tiles = {
290
+ total: keys.size,
291
+ compared,
292
+ changed: items.length,
293
+ identical: keys.size - items.length,
294
+ missingLeft,
295
+ missingRight,
296
+ diffPixels,
297
+ addedPixels,
298
+ removedPixels,
299
+ items,
300
+ };
301
+ return { identical: items.length === 0 && metadataDiff.length === 0, tiles, metadata: metadataDiff };
302
+ }
303
+ finally {
304
+ left.close();
305
+ right.close();
306
+ }
307
+ }